pax_global_header00006660000000000000000000000064146770436020014523gustar00rootroot0000000000000052 comment=c72556af6cec290c29c3f19f443d96fcd6fc4576 kraft-1.2.2/000077500000000000000000000000001467704360200126345ustar00rootroot00000000000000kraft-1.2.2/.github/000077500000000000000000000000001467704360200141745ustar00rootroot00000000000000kraft-1.2.2/.github/workflows/000077500000000000000000000000001467704360200162315ustar00rootroot00000000000000kraft-1.2.2/.github/workflows/main.yml000066400000000000000000000045041467704360200177030ustar00rootroot00000000000000name: CI on: [push, pull_request, workflow_dispatch] jobs: appimage-build: runs-on: ubuntu-latest container: opensuse/leap:15.3 steps: # need to install Git >= 2.18 before checkout according to GitHub actions # we can just install all the dependencies beforehand, though - name: Install dependencies run: | zypper install -y \ gcc \ gcc-c++ \ cmake \ make \ wget \ git \ extra-cmake-modules \ libctemplate-devel pkgconf \ "cmake(Grantlee5)" \ "cmake(KF5Codecs)" \ "cmake(KF5Config)" \ "cmake(KF5Contacts)" \ "cmake(KF5I18n)" \ "cmake(Qt5Core)" \ "cmake(Qt5Gui)" \ "cmake(Qt5Sql)" \ "cmake(Qt5Test)" \ "cmake(Qt5Widgets)" \ "cmake(Qt5Xml)" \ "cmake(Qt5Svg)" \ libQt5Sql5-sqlite \ libQt5Sql5-mysql \ libqt5-qtdeclarative-tools - uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: Build AppImage run: | git config --global --add safe.directory /__w/kraft/kraft export APPIMAGE_EXTRACT_AND_RUN=1 wget https://github.com/TheAssassin/appimagecraft/releases/download/continuous/appimagecraft-x86_64.AppImage chmod +x appimagecraft-x86_64.AppImage ./appimagecraft-x86_64.AppImage - name: Archive artifacts uses: actions/upload-artifact@v4 with: if-no-files-found: error name: AppImage path: | Kraft*.AppImage* upload: name: Create release and upload artifacts needs: - appimage-build runs-on: ubuntu-20.04 steps: - name: Download artifacts uses: actions/download-artifact@v4 - name: Inspect directory after downloading artifacts run: ls -alFR - name: Create release and upload artifacts env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | wget -q https://github.com/TheAssassin/pyuploadtool/releases/download/continuous/pyuploadtool-x86_64.AppImage chmod +x pyuploadtool-x86_64.AppImage ./pyuploadtool-x86_64.AppImage **/Kraft*.AppImage* kraft-1.2.2/.gitignore000066400000000000000000000000321467704360200146170ustar00rootroot00000000000000build *.*swp* *.AppImage* kraft-1.2.2/AUTHORS000066400000000000000000000002171467704360200137040ustar00rootroot00000000000000Klaas Freitag Thomas Richard Ronald Stroethoff (Manual, dutch translation) kraft-1.2.2/CMakeLists.txt000066400000000000000000000111711467704360200153750ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.16.0) project(kraft) cmake_policy(SET CMP0063 NEW) find_package(ECM REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) set(CMAKE_AUTOMOC TRUE) option(AKONADI_LEGACY_BUILD "Build with older versions of Akonadi (KF5 Prefix)" OFF) # Akonadi Prefix: Set this to KF5 for builds with Akonadi Libs before 5.23 set(AKO_PREFIX "KPim5") if (AKONADI_LEGACY_BUILD) set(AKO_PREFIX "KF5") endif() message("Akonadi Prefix is ${AKO_PREFIX}") include(GetGitRevisionDescription) # set git revision info get_git_head_revision(GIT_REFSPEC GIT_SHA1) # if we cannot get it from git, directly try .tag (packages) # this will work if the tar balls have been properly created # via git-archive. if ("${GIT_SHA1}" STREQUAL "GITDIR-NOTFOUND") if (EXISTS "${CMAKE_SOURCE_DIR}/.tag") file(READ ${CMAKE_SOURCE_DIR}/.tag sha1_candidate) string(REPLACE "\n" "" sha1_candidate ${sha1_candidate}) if (NOT ${sha1_candidate} STREQUAL "$Format:%H$") message("${sha1_candidate}") set (GIT_SHA1 "${sha1_candidate}") endif() else() set (GIT_SHA1 "unknown") endif() endif() message(STATUS "Git dynamic information") message("GIT_SHA1: ${GIT_SHA1}") execute_process( COMMAND git rev-parse --abbrev-ref HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE ) message("GIT_BRANCH: ${GIT_BRANCH}") if($ENV{SOURCE_DATE_EPOCH}) set(BUILD_HOST_NAME "reproduciblebuild") else () cmake_host_system_information(RESULT BUILD_HOST_NAME QUERY HOSTNAME) endif() if(${CMAKE_VERSION} VERSION_GREATER "3.22.0") cmake_host_system_information(RESULT BUILD_HOST_DISTRI QUERY DISTRIB_PRETTY_NAME) else () set(BUILD_HOST_DISTRI "unknown distribution") endif() message("Build host name: ${BUILD_HOST_NAME}") message("Build host distribution: ${BUILD_HOST_DISTRI}") include(KDEInstallDirs) include(KDECMakeSettings) include(ECMInstallIcons) include(KDEFrameworkCompilerSettings) include(KDECMakeSettings) include(FeatureSummary) # Uncomment to enable some tweaks for AppImage build # add_definitions(-DBUILD_APPIMAGE=1) kde_enable_exceptions() remove_definitions(-DQT_NO_SIGNALS_SLOTS_KEYWORDS) remove_definitions(-DQT_NO_CAST_FROM_ASCII) find_package(Qt5 CONFIG REQUIRED Core Gui Sql Widgets Xml Svg ) # XmlGui for the ConfigSkeleton find_package(KF5 REQUIRED COMPONENTS I18n Config Contacts ) # Grantlee templating engine find_package(Grantlee5 REQUIRED) set_package_properties(Grantlee5 PROPERTIES DESCRIPTION "Library for templating html and pdf output" URL "https://www.grantlee.org/" PURPOSE "Optionally used for templating" TYPE OPTIONAL ) find_package(${AKO_PREFIX}Akonadi) set_package_properties(${AKO_PREFIX}Akonadi PROPERTIES DESCRIPTION "Library for general Access to Akonadi" URL "https://www.kde.org/" PURPOSE "Optionally used for addressbook integration" TYPE OPTIONAL ) find_package(${AKO_PREFIX}AkonadiContact) set_package_properties(${AKO_PREFIX}AkonadiContact PROPERTIES DESCRIPTION "Library for Accessing Contacts stored in Akonadi" URL "https://www.kde.org/" PURPOSE "Optionally used for addressbook integration" TYPE OPTIONAL ) find_package(${AKO_PREFIX}ContactEditor) set_package_properties(${AKO_PREFIX}ContactEditor PROPERTIES DESCRIPTION "Library for editing contacts stored in Akonadi" URL "https://www.kde.org/" PURPOSE "Optionally used for addressbook integration" TYPE OPTIONAL ) if(${AKO_PREFIX}Akonadi_FOUND AND ${AKO_PREFIX}AkonadiContact_FOUND AND ${AKO_PREFIX}ContactEditor_FOUND) add_definitions(-DHAVE_AKONADI) endif() find_package(Ctemplate REQUIRED) find_package(Asciidoctor) # Sets the variable ASCIIDOCTOR_FOUND set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-suggest-override") # disable the warning about null-pointer zero. FIXME. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-zero-as-null-pointer-constant") set(QT_DEFINITIONS "${Qt5Core_DEFINITIONS} ${Qt5Gui_DEFINITIONS} ${Qt5Widgets_DEFINITIONS}") add_definitions(${QT_DEFINITIONS} ) include_directories(${QT_INCLUDES} src) include_directories( /usr/include/${AKO_PREFIX}/AkonadiCore ) include_directories(/usr/include/${AKO_PREFIX}/) if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/po") ki18n_install(po) endif() add_subdirectory(src) add_subdirectory(database) add_subdirectory(reports) add_subdirectory(views) add_subdirectory(importfilter) add_subdirectory(tools) add_subdirectory(styles) add_subdirectory(meta) add_subdirectory(tests) add_subdirectory(manual) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) kraft-1.2.2/COPYING000066400000000000000000000432541467704360200136770ustar00rootroot00000000000000 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. kraft-1.2.2/Changes.txt000066400000000000000000000505631467704360200147560ustar00rootroot00000000000000Changes since version 1.2: ######################################### - Fixed a stupid release bug and name the release properly - Fixed the defaultprovider test Thanks t-8ch for contribution <3 => release v. 1.2.1 (May 5, 2024) Changes since version 1.1: ######################################### - Manual: Updated text and dutch translations - Manual: Updated screenshots for all languages - Fix #211: Be more robust if no .git file is there - Fix cmake warnings - Substancial code cleanups - Fix reproducable builds - Fix saving of XRechnung files - Added a template for XRechnung version 3.0.1 - Fix #218: Add a image mask for reportlab - Fix tests - Add checkbox to mark document types to get XRechnung support - Add a feedback link to the system overview page => release v. 1.2 (May 5, 2024) Changes since version 1.0: ######################################### - updated nl translations of the manual - update the app translations - Fix the application icon - Fix the changed Akonadi Prefix, added build switch AKONADI_LEGACY_BUILD - More Akonadi related ifdefs - Few fixes and improvements to cmake files (eg. #205) - cleanup of code and remove endl which removes lots of warnings - Allow Macros in pre- and post text, to support date calculations and sum calculation (incl. tax) based on tags - more tests - Add Button to Allow to insert template pre- and post texts rather than replace the entire text #167 => release v. 1.1 (Sept 16, 2023) Changes since version 0.98: ######################################### - Have two new merge modes for the watermark tool - PDF watermark tool can also append PDF files now - Add numbercycle day counter variable (#138) - Test improvements and new tests added - User manual improvements - Localized screenshots in the user manual (Thx Ronald) - Demand and Alternative: Do not overwrite custom prefix - Default Demand and Alternative text configurable in prefix dialog - Add more variables to weasyprint (#166) - Ability to add EPC QR code to invoices (Giro Code) - Maintain users bank account to be included in documents - Add some metadata to the html representation (weasyprint) - Use custom icons for all icons in Krafti (#175) - Experimental: html tags in pre- and post tags and items & catalogs - Add more contrib documents from Achim (BNC) - Database refresh only in readonly mode - Huge improvements to the AppImage build (#191) - Fix: Numbercycle dialog with day counter (#138) - Fix: Strikeout for deleted items working again - Fix: Delete column in sqlite migrations (#162) - Fix: Add -p switch to call of weasyprint (html presentational hints) - Fix: Set reconnect option for MySQL (#183) => release v. 1.0 (Dec 17, 2022) Changes since version 0.97: ######################################### - Add dutch translation of the manual, Kudos to Ronald Stroethoff - Add support for XRechnung export of invoices - User manual improvements - Translations updates (German) - Add TOC to the manual - Add predecessor template variable to weasyprint documents - Adopt to latest Akonadi versions - Add ECE20 units for XRechnung - Fix: Record usage of catalog items properly. Store usage amount and last usage time. Display that properly in the catalog editor. - Fix: Drag and drop sorting of items now working properly. - Fix: Adopt to new Akonadi v. 5.19 - Fix: Add predecessor variable to weasyprint template. - Fix: Use correct icons everywhere. - Fix: Format of date and time corrected. - Fix: Store useful value for the locale in db. For later. - Fix: Textselection behaviour consitent - Fix: Write useful locale settings into the database. - Fix: Sorting in material catalogue now working. - Fix: Better error messages if python modules are missing. - Fix: Read mysql port from config file - Fix: Rearrange docdetails view a bit if there is a project set. => release v. 0.98 (May 22, 2022) Changes since version 0.96: ######################################### Add read only mode to kraft. Documents cannot be edited, but viewed and printed. Needs to be configured to share database and the PDF store directory. - Fix: Bring back the checkbox for items, this fixes #103 - Fix: Command line option -d works again - Fix: Fix out of index deletes of items, #102 - Fix: Do watermark on PDFs properly - Fix: Fix watermark on all pages functionality - Fix: Align watermark files entry fields properly (community contrib) - Cmake: Build a static lib of all sources to link with kraft and all the tests. => release v. 0.97 (Aug 15, 2021) Changes since version 0.95: ######################################### - Found new MIT licensed icons to avoid uncertainess with CC license. - Allow to use the "add new" button in the doc editor to add new catalog templates. It presets the correct chapter. - Fix: Use the xmlArchivePath correctly (#80) - Fix: Handling of Cancel button in template to doc dialog. - Fix: Convert newlines in the items to
for the weasyprint doc generation. - Fix: In Followup document: If the standard text for pre and post text of the target document type is empty, the one from the source document is copied over instead. (#91) => release v. 0.96 (Feb. 27, 2021) Changes since version 0.90: ######################################### - Add Grantlee as templating engine. - Add Weasyprint as rendering engine for PDFs. - Removed Splash screen completely for simplification. - Switch to python3 with the erml2pdf tool. - Add a date format selector to Kraft settings. Allow to set a four digit year in dates and other formats. - Fix: Show proper amount of items in no-price-display mode. - Fix: Show proper timestamp of last change of catalog items with SQLite database. - Fix: show proper number of items also in Lieferschein. - Fix: Save some more window states (size, position) - Fix: Set the unit of discount items to pauschal. - Fix: Also change lastmodified-Timestamp if only an item was added. - Add the user manual. Open it according to user language. => release v. 0.95 (Aug. 28, 2020) Changes since version 0.82: ######################################### - Reworked follow up and copy document * set the correct header- and footer-texts according to the doc type * Added a checkbox if items should be copied or not - New feature: partial invoices that are substracted in the final invoice - Use an XML based migration system for document types - Added the first unit tests to Kraft - Made the document templates not containing any language specific strings any more. There is only one doc now for all languages, getting translated strings as template variables. - Removed KeepTogether flag for tables to avoid that a long list of items only starts on the next page. Might have impact on some docs. - Fixed formatting of the amount number in the XML output - More Less-KDE: Removed more mandatory dependencies on KDE. - Added 'About Kraft' information to Krafts system view. - Added document type 'Offer without price tags', which does not print price tags on the PDF (issue #58). - Internationalization: Added dutch translation => release v. 0.90 (Dec. 14, 2019) Changes since version 0.81: ######################################### - Fix send document by email - Allow emailing through xdg-email and not only through thunderbird To enable, set mailUA=xdg in the config file in the system section. - Fixed wrong usage of i18n command which caused a lot of error messages on the console. (#37) - Time calculation: Add a time unit to the form, allow to calculate times in hours, minutes and seconds (#43) - Refactored the calculation dialog, fixed using margin. (#42) - Properly ask to waste changes if user hits cancel in Calc dialog. - Fix some glitches in the setup code path, ie. db update. - Relaxed the document layout a bit by choosing a smaller font and adjusting the table column settings a bit. - More minor bug fixes and improvements => release v. 0.82 (Oct 17, 2018) Changes since version 0.80: ######################################### - Fix to build with Qt 5.11 - CMake fixes: Installation directories - Use QProcess instead of system call - Fix appstream XML data - Fix display of individual tax block on documents => release v. 0.81 (June 12, 2018) Changes since version 0.59: ######################################### - Port to Qt5/KDE Frameworks 5 - Reduction of build and runtime dependencies, especially of KDE Frameworks, replacing old KDE classes with their Qt equivalents - Dropped Webkit. Use QTextbrowser instead. Ported html generating code and CSS accordingly - Dependency on Akonadi is now optional, so builds without Akonadi are possible - Address management in Kraft was abstracted to work with or without Akonadi, other address backends could be implemented much easier now - Refresh of the GUI plus new icons, easier. - Refactored time line models completely - Show summaries for month and year items: Amount of doc types and added sums for each document type - GUI: New filter combo to limit to docs of last week or last month - Use templates for system view (contributed by Andy Wuest) - Ship an AppImage for easy testing of Kraft - Updated ReportLab based PDF generation script (erml2pdf) - countless bug fixes and improvements => release v. 0.80 (Apr 1, 2018) Changes since version 0.57: ######################################### - Fix handling of slashes in the doc id template - Fix a bug in calculation of the VAT sum - Removed kraftcat library as it was unused. Easier building now. => release v. 0.58 (Apr, 2014) Changes since version 0.56: ######################################### - No code changes. Just version bump because of a bogus tarball. => release v. 0.57 (Nov 7, 2014) Changes since version 0.55: ######################################### - Fix handling of custom greetings in combobox. - Handle document type changes correctly: Set a new ident number depending on the new document id - Fix behaviour of the greeting combobox: Do not loose custom entries any more - Add receipient email address if document is emailed - Fix document emailing for thunderbird - Fix removing of alternative- and on-demand state of items - Wording fixes - Fix Ok/Cancel for doc editor - Better error messages if template cannot be read - A couple of crash fixes and memory management cleanups => release v. 0.56 (oct 30, 2014) Changes since version 0.54: ######################################### - Fix a bug with the PDF generation, regression in 0.54 - Fix compiling with latest version of ctemplate => release v. 0.55 (may 29, 2014) Changes since version 0.53: ######################################### - Use new address fetch job implementation that works independant from Nepomuk- or Baloo indexing of contacts. (KDE >= 4.12) - Support note-of-delivery documents (Lieferscheine) without prices. - Added findcontact utility - Generate a customer sorted document storage structure on disk - Improve stylesheet handling in templates, introduce CSS_IMG_PATH - Use environment variable KRAFT_HOME more consquentely - Fix tax sum calculation - Add customer address UID variable to number circle tags - Some memleak fixes - Add "followup document" to main menu - Fix installation of identity.trml - Allow the tags USERNAME, DATE and TIME in item templates. - Lots of other cleanups and fixes => release v. 0.54 (may 13, 2014) Changes since version 0.50: ######################################### - Fixes drag and drop handling in catalog window. - Fixes with units, do not confuse units any more - Utf8 fixes - other minor fixes - Releases 0.51 and 0.52 screwed. => release v. 0.53 (oct 11, 2013) Changes since version 0.50: ######################################### - Fix drag and drop in catalogues. - Implemented removal of sub chapters. - Add the content of an entire template catalog chapter to the document if the chapter item is selected. - Added a new setting "Own Identity" to allow to pick the own identity from the address books in an installed system. - Make text template loading utf8 save. - Reworked image-in-template example in invoice report template. - Fixed unit handling, no more startsWith coparison of text. => release v. 0.51 (sep 22, 2013) Changes since version 0.45: ######################################### - Handling of individual tax rates for each document item - bugfix: escape texts in reports correctly (reported by Lars Diel). - bugfix: if akonadi address was not found, display proper msg. - Proper error message if a python module is not installed but needed by the pdf generator. - added button to assign an address book entry as document receiver for existing documents (Bug #3477467) - bugfix: Display of number of processed sql commands in setup assistant (Bug #3560611) - started to optimize database save of documents for more performant saves. - bugfix: Fixed import of document items from csv lists. - added page number on default document from page two to end. - bugfix: Fixed mysql database setup. - Rearragned doc type setup dialog to better display path names of template file and watermark file. - bugfix: If a manual entered template has checkbox "store in template catalog, the template is immediately written to and catalog is reloaded. - bugfix: Focus on the last added item on document edit. => release v. 0.50 (dec 17, 2012) Changes since version 0.44: ######################################### - bugfix release: Fixed the display of decimal places in the PDF document which caused broken documents. => release v. 0.45 (nov 08,2011) Changes since version 0.43: ######################################### - Completely reworked the addressbook widget in Kraft, used in new doc assistant and in the "who am i" dialog: Fully Akonadi-based, works with various addressbooks and loads addresses way more fast. - Completely reworked text template widget used in the document editor: Less bugs, more obvious gui, help texts where needed - Fixed bug that crashed Kraft when clicking on empty catalog chapters. - Add ability to add localized report template files, added german localization - Fixed bug that numbers in the doc are not localized correctly - Fixed bug that the doc type is not taken correctly from the new doc wizard - No need any more to checkbox single item templates to move them into the document. Selecting is sufficient. - Added a search line in the "who am i"-dialog => release v. 0.44 (nov 03,2011) Changes since version 0.41: ######################################### - Added search box in digest lists again, for that enhanced the search field class. - cleaned up the digest models - optimized the digest model - changed from treeview to tableview for latest- and all view => release v. 0.43 (may 25, 2011) Changes since version 0.40: ######################################### - More changes to the Akonadi based addressbook integration - switched to a python only version of trml2pdf called erml2pdf, makes porting to other platforms easier plus dropped dependency on java with pdftk - used Qt Model/View for the document lists. Way faster startup. - New document digest view - Catalogs: Implemented nested catalog structure - Catalogs: Moving templates around per d&d - Catalogs: user defined sorting in catalogs - Catalogs: dropping of templates => released v. 0.41 (april 18th, 2011) Changes since version 0.32: ######################################### - Ported to the KDE 4 Platform. In particular, to KDE 4.4 - Use Akonadi based addressbook - Edit dialog for Wages and Units - SQLite-Support - Setup Assistant for SQLite and MySQL Databases => released v. 0.40 Changes since version 0.31: ######################################### - Tax: Added more flexible tax calculation. Kraft now has the tax in a table for easy changing, supports no, reduced and full tax on document level for this release, on item level later. - Numbercycles: All Kraft documents need an unique document number. These are taken from numbercycles now which can be edited and shared between document types. - Watermark: Kraft documents can now be merged with an existing pdf file with the company logo. Configuration through the Kraft settings on a per document type basis - Templates: Kraft now supports different templates for each document type. Templates can be configured through the Kraft settings. - Project-String: There is a project label at the document. It is exported to the document template. - System-Tab: Display of some interesting setup information - Templates for PDF and HTML output are reloaded if modified => released v. 0.32 Changes since version 0.30: ######################################### - added a read only view on documents, customizable with ctemplate as html page - added importing items from text files with configurable import filters, to enable usage of special software which is able to export text files - added document number cycles: The unique id of a document depends on a unique number. Now there can be multiple number cycles which can be used by document types. Multiple doc types can use the same number cycle, that means that for example all types of invoices count the same number cycle while offers are in another. => released v. 0.31 Changes since version 0.25: ######################################### - introduced the extended combo box with explanation line for units. - added document item tagging - added discount item system, based on tagging - tag templates with tag template edit dialog - fixed a bunch of bugs with text templates (header- and footer text) - tag selection in ordinary add-item-to-document dialog => released v. 0.30 Changes since version 0.24: ######################################### - Added a Wizard for document creation - Improved the document overview widget for more intuitive use. - Copying of complete documents added. - Followup documents (eg. Invoice follows Offer) added - Litte marker for new documents added to doc overview list. - Help text added to positions canvas - Client address bits added to the available template variables Changes since version 0.23: ######################################### - internationalisation: Ability to do documents in a different location than the desktop is running under. => released BETA v. 0.24 Changes since version 0.22: ######################################### - fixed: database migration 5: added IF EXISTS - fixed: encoding in the report file - improved: The document digest overview is not longer always redrawed and looses its selected item. => released v. 0.23 Changes since version 0.20: ######################################### - fixed: select from catalogs with doubleclick - fixed: allow prices for positions larger than 10k - fixed: openArchivedDocument printed again instead of opening archived doc from the archive path - fixed: template texts in the catalog view where not shown if they were exactly 60 chars long. - feature: Alternative positions - feature: Demand positions - feature: Switched to google template system, see http://code.google.com/p/google-ctemplate/ - bugfix: Catalog changes show up directly in opened catalogs, also if open as a template catalog in the doc window. => released v. 0.22 Changes since version 0.14: ######################################### - fixed bug with manual price field that needs to be left by TAB to get a change recognised. - increased precision to 2 digits for position amounts - allow euro-sign in texts and in the whiteboard. Due to a lack in the qt3 mysql driver the char needs to be en- and decoded. - reduced the amount of toolbar buttons to only show the important ones. - more beautifull and working navigation block in the document dialog - mailing documents added - Completely changed header- and footer text template system: * now there is more than one text available per text- and doc type * direct adding, editing and removing of texts from the dialog * selecting template texts in the same way as selecting position templates, more intuitive GUI - Addresses also selectable from an address catalog - persist the selection of the greeting and salut text - Document ID now configurable in the settings file, key DocIdent: [document] DocIdent=T-%y%w%i - database upgrade code more robust - now additionally save archived xml documents Bugs fixed: - fixed time lined doc overview, now displaying all documents of all months of a year. - fixed modification indication: Now also adding a position counts as modification - encoding bugs fixed - allow to leave text edit fields using the tab key - deletion of positions: Fixed an iteration over the list issue - smarter template-to-doc-position dialog - others kraft-1.2.2/INSTALL.md000066400000000000000000000104021467704360200142610ustar00rootroot00000000000000# Kraft Build and Installation This document describes how to compile and install Kraft. This requires a bit of Linux knowledge and is only recommended for experienced users and developers. ## Packages Linux Distributions have package management systems to provide users with all kind of software in a clean and easy way. This should be the prefered way to install Kraft. Check the package pools of your prefered distribution first. If the package is outdated, consider asking your distribution to upgrade! ## Compiling Kraft The following section briefly describes how to build Kraft with cmake. ### Precondition Check that cmake is installed on your machine and is in your PATH. To do so, just type ``` $ cmake --version ``` on your command line. Version 2.4 is required, the most recent stable version of cmake is preferred. To build Kraft, the following libs and software versions have to be provided: - cmake and the cmake extra modules - Qt libs incl. devel packages version 5.5.0 or later - kcontacts for using the KDE contact classes - A few other KDE classes (kxmlgui, ki18n) - google ctemplate, A simple but powerful template language for C++, packages from the openSUSE Buildservice or from the website https://github.com/OlafvdSpek/ctemplate - grantlee, an C++ text template framework - optional: akonadi contact for Akonadi based addressbook access Required packages for building with openSUSE: - cmake - extra-cmake-modules - gcc-c++ - kcontacts-devel - gettext - libctemplate-devel - libQt5Core-devel - libQt5Gui-devel - libQt5Sql-devel - libQt5Widgets-devel - libQt5Xml-devel - libQt5Svg-devel - grantlee5-devel These are optional to build with Akonadi Support: - akonadi-contact-devel - akonadi-devel To build with Akonadi versions before 23.04, cmake has to run wtih the build option `-DAKONADI_LEGACY_BUILD=ON` to use the old prefix KF5. ### Build Kraft cmake is designed so that the build process can be done in a separate directory. This is highly recommended for users and required for packagers. Go to the top level of the source directory. To build Kraft in the subdirectory `./build/` type ``` $ mkdir build $ cd build $ cmake .. # to generate the Makefiles. $ cmake . # to change the configuration of the build process. (optional) ``` Check out for errors during the cmake run. Fix them, usually you need more devel packages installed. Ready? Congratulations, your Makefiles were generated! Now you could just type ``` $ make # to build the project in the build/ directory. ``` Note that 'make' automatically checks whether any CMakeLists.txt file has changed and reruns cmake if necessary. To start Kraft from the build directory, set the environment variable `KRAFT_HOME` to the root of the _source_ directory to let Kraft find its resource files: ``` $ KRAFT_HOME=/home/me/sources/kraft ``` ## Kraft Installation Type ``` $ make install ``` To change the target root directory to where it is installed, call cmake with the parameter `-DCMAKE_INSTALL_PREFIX=/my_install_dir` ## Kraft Manual Kraft ships a user manual in different languages. To rebuild it, asciidoctor is required. If that dependency is found, cmake detects it and gives a new make target: ``` $ make manual ``` to re-create the docs. ## Database Kraft either can use a SQLite file based database or a MySQL server based database. The SQLite database is created automatically on the fly on first start. Its use is recommended for all users who want to evaluate Kraft. To run Kraft with MySQL, create or pick a user on the MySQL server with appropiate permissions to write to a specific database and create tables on it. Create an empty database to use with Kraft. Remember both the database name and the credentials. On Krafts first start, enter these data in the setup assistant. Kraft will create the database tables and fill it automatically. ## Document Generation Kraft generates PDF documents. For that it uses either a python tool named erml2pdf or the python project weasyprint. erml2pdf can be found in Kraft's tools directory in this source package. Weasyprint should be installed separately on the machine that is running Kraft. To compute PDF watermarks, Kraft uses python-pypdf2 for pdf processing. The python modules are not part of Kraft and should be installed separately on the system. kraft-1.2.2/README.md000066400000000000000000000031641467704360200141170ustar00rootroot00000000000000 # The Kraft Project **Kraft is free software to help to handle documents like quotes and invoices in your small business.** It is a Qt/KF5 based desktop software with a strong focus on ease of use and the just enough feature set for the use case. With Kraft, creating documents will run smooth and free time for more enjoyable things than office work. Check out the website http://volle-kraft-voraus.de for more information. Kraft runs on your Linux desktop. No cloud involved, your data stays with you! With Kraft, writing documents like quotes and invoices is very easy and fast. Repeating tasks are supported, documents can be generated semi automatically, ie. invoices from offers sent out before. For efficient work, Kraft supports catalogs to organize materials and template texts. It focuses on high quality printouts because paper is still the main communication media in the small business world. However, it also sends documents via email. Kraft utilizes a bunch of very useful tools of the free softare world: - KDE addressbook for customer management - MySQL or alternatively SQLite for database support - [WeasyPrint](https://weasyprint.org) or [ReportLab](http://www.reportlab.com/opensource/) for PDF generation. - [Grantlee](https://github.com/steveire/grantlee) or [ctemplate](https://github.com/OlafvdSpek/ctemplate) templating library. ## Interested? [Install Kraft](http://volle-kraft-voraus.de/Main/Download) on your Linux desktop. For questions and comments, please speak up. Check the [web site](http://volle-kraft-voraus.de/Main/Contribution) for contact details. Jun 2005-2024, Klaas Freitag kraft-1.2.2/Releasechecklist.md000066400000000000000000000011571467704360200164340ustar00rootroot00000000000000## Kraft Release Checklist _Before drafting a release, copy this checklist template into an issue for the specific version._ Release Checklist for Kraft Version XX ### Before the first beta - [ ] Check entries in `src/version.h` - [ ] Check the database scheme version number. - [ ] Update Changes file ### Before the first RC - [ ] Send a tweet/blog about the upcoming release ### For every RC - [ ] Create a proper tag - [ ] Update the packages in a hidden repo on OBS - [ ] x ### Build packages - [ ] in OBS for KDE:Extra - [ ] Submit to Tumbleweed ### AppImage - Update the Kraft package for the AppImage kraft-1.2.2/Releasenotes.txt000066400000000000000000000057401467704360200160340ustar00rootroot00000000000000 ==================================================================== Please refer to the Kraft Project website http://volle-kraft-voraus.de/Main/Releases ==================================================================== older entries: Das Kraft Release 0.22 verwendet ein neues Text-Template System, das für die benutzerkonfigurierbare PDF-Ausgabe der Dokumente verwendet wird. Es wird das google ctemplate-System verwendet, Details dazu unter http://code.google.com/p/google-ctemplate/ Das neue System ist sehr flexibel und stabil und daher zukunftssicher und löst das selbstgeschriebene alte System ab. Leider hat sich die Syntax geändert, weshalb eigene Templates angepasst werden müssen. Weiterhin enthält Kraft 0.22 zwei neue Arten von Dokument Posten. Es gibt Alternativpositionen, die eine Alternative zu einer vorhergegangenen Position beschreiben. Bedarfspositionen beschreiben Aufwände, die nur bei Bedarf anfallen. Beide Arten addieren ihre Kosten nicht zur Gesamtsumme und sind durch Kursivschrift im Dokument hervorgehoben. Weiterhin wurden viele Fehler behoben und generelle Code Verbesserungen vorgenommen. Das Datenbankschema wurde geändert, das Update geschieht automatisch durch Kraft. ---------------------------------------------------------------------- The Kraft release 0.22 changes the text template system that is used by Kraft to support user configureable pdf output. It was changed from a very basic homegrown system to the google ctemplate system, details under http://code.google.com/p/google-ctemplate/ It is very flexible and mature and thus future proof which was reason enough to switch to it at this early project state. The template format is slightly different to the former format, so editing of own templates is required. Additionally two new kinds of document positions were added: Alternative and demand positions. The alternative positions describe an alternative to another position. The demand position describes a position where it is not yet clear if and how much of it is needed. Both position kinds do not add to overall sum and are marked through italic characters in the printout by default. Furthermore a lot of bugfixes and genral code improvements where committed. The database scheme was extended, update is automatically performed. ==================================================================== This release 0.20 of Kraft brings a big step ahead in the way text templates for the header and footer texts for the different doc types are managed. Kraft now supports to have several templates per type (ie. for the header of invoices) and all of them are offered very handy right to select from a catalog kind in a context aware manner. Kraft takes another important step towards a really well integrated KDE addressbook. All customer addresses are managed in the KDE addressbook but there is a customer catalog now integrated. This release contains a lot of important bug fixes and small additions to functionality, update is really recommended. kraft-1.2.2/TODO000066400000000000000000000002321467704360200133210ustar00rootroot00000000000000Todo list for Kraft =================== Please use the github issue tracker for enhancements and bug reports: https://github.com/dragotin/kraft/issues kraft-1.2.2/appimagecraft.yml000066400000000000000000000020331467704360200161600ustar00rootroot00000000000000version: 1 project: name: de.volle_kraft_voraus.kraft.desktop version_command: git describe --tags build: cmake: scripts: post_build: # make sure weasyprint can be launched from a path next to the kraft binary # this simplifies the lookup greatly # also, if we create the file now (i.e., before linuxdeploy runs), it won't be overwritten by the python plugin - | cat > "$BUILD_DIR"/AppDir/usr/bin/weasyprint <<\EOF #! /bin/bash set -eo pipefail own_path="$(dirname "$(readlink -f "$0")")" exec "$own_path"/../conda/bin/python -m weasyprint "$@" EOF chmod +x "$BUILD_DIR"/AppDir/usr/bin/weasyprint appimage: linuxdeploy: plugins: - qt - conda - https://github.com/linuxdeploy/misc-plugins/raw/master/grantlee5/linuxdeploy-plugin-grantlee5.sh environment: UPD_INFO: "gh-releases-zsync|dragotin|kraft|latest|Kraft-*x86_64.AppImage.zsync" PIP_REQUIREMENTS: "weasyprint reportlab pypdf2" GRANTLEE5_PLUGINS_DIR: "/usr/lib64/grantlee/5.2/" kraft-1.2.2/cmake/000077500000000000000000000000001467704360200137145ustar00rootroot00000000000000kraft-1.2.2/cmake/modules/000077500000000000000000000000001467704360200153645ustar00rootroot00000000000000kraft-1.2.2/cmake/modules/COPYING-CMAKE-SCRIPTS000066400000000000000000000024571467704360200203720ustar00rootroot00000000000000Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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. kraft-1.2.2/cmake/modules/FindAsciidoctor.cmake000066400000000000000000000005431467704360200214340ustar00rootroot00000000000000# Find Asciidoctor - an Asciidoc converter to html # # ASCIIDOCTOR_FOUND # ASCIIDOCTOR_EXECUTABLE FIND_PROGRAM(ASCIIDOCTOR_EXECUTABLE asciidoctor) MARK_AS_ADVANCED(ASCIIDOCTOR_EXECUTABLE) IF (NOT ASCIIDOCTOR_EXECUTABLE) SET(ASCIIDOCTOR_FOUND "NO") ELSE (NOT ASCIIDOCTOR_EXECUTABLE) SET(ASCIIDOCTOR_FOUND "YES") ENDIF (NOT ASCIIDOCTOR_EXECUTABLE) kraft-1.2.2/cmake/modules/FindCtemplate.cmake000066400000000000000000000015671467704360200211160ustar00rootroot00000000000000# - Try to find the ctemplate # Once done this will define # # CTEMPLATE_FOUND - system has ctemplate # CTEMPLATE_INCLUDE_DIR - the ctemplate include directory # CTEMPLATE_LIBRARIES - Link this to use ctemplate # # Copyright (c) 2009, Thomas Richard, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. if (CTEMPLATE_INCLUDE_DIR AND CTEMPLATE_LIBRARIES) # in cache already SET(CTEMPLATE_FOUND TRUE) else (CTEMPLATE_INCLUDE_DIR AND CTEMPLATE_LIBRARIES) FIND_PATH(CTEMPLATE_INCLUDE_DIR ctemplate/template.h) FIND_LIBRARY(CTEMPLATE_LIBRARIES NAMES ctemplate) include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Ctemplate DEFAULT_MSG CTEMPLATE_INCLUDE_DIR CTEMPLATE_LIBRARIES ) endif (CTEMPLATE_INCLUDE_DIR AND CTEMPLATE_LIBRARIES) kraft-1.2.2/cmake/modules/GetGitRevisionDescription.cmake000066400000000000000000000067021467704360200235010ustar00rootroot00000000000000# - Returns a version string from Git # # These functions force a re-configure on each git commit so that you can # trust the values of the variables in your build system. # # get_git_head_revision( [ ...]) # # Returns the refspec and sha hash of the current head revision # # git_describe( [ ...]) # # Returns the results of git describe on the source tree, and adjusting # the output so that it tests false if an error occurs. # # git_get_exact_tag( [ ...]) # # Returns the results of git describe --exact-match on the source tree, # and adjusting the output so that it tests false if there was no exact # matching tag. # # Requires CMake 2.6 or newer (uses the 'function' command) # # Original Author: # 2009-2010 Ryan Pavlik # http://academic.cleardefinition.com # Iowa State University HCI Graduate Program/VRAC # # Copyright Iowa State University 2009-2010. # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) if(__get_git_revision_description) return() endif() set(__get_git_revision_description YES) # We must run the following at "include" time, not at function call time, # to find the path to this module rather than the path to a calling list file get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) function(get_git_head_revision _refspecvar _hashvar) set(GIT_DIR "${PROJECT_SOURCE_DIR}/.git") if (NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) return() endif() set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") if(NOT EXISTS "${GIT_DATA}") file(MAKE_DIRECTORY "${GIT_DATA}") endif() if(NOT EXISTS "${GIT_DIR}/HEAD") return() endif() set(HEAD_FILE "${GIT_DATA}/HEAD") configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" "${GIT_DATA}/grabRef.cmake" @ONLY) include("${GIT_DATA}/grabRef.cmake") set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) endfunction() function(git_describe _var) if(NOT GIT_FOUND) find_package(Git QUIET) endif() get_git_head_revision(refspec hash) if(NOT GIT_FOUND) set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) return() endif() if(NOT hash) set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) return() endif() # TODO sanitize #if((${ARGN}" MATCHES "&&") OR # (ARGN MATCHES "||") OR # (ARGN MATCHES "\\;")) # message("Please report the following error to the project!") # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") #endif() #message(STATUS "Arguments to execute_process: ${ARGN}") execute_process(COMMAND "${GIT_EXECUTABLE}" describe ${hash} ${ARGN} WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" RESULT_VARIABLE res OUTPUT_VARIABLE out ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) if(NOT res EQUAL 0) set(out "${out}-${res}-NOTFOUND") endif() set(${_var} "${out}" PARENT_SCOPE) endfunction() function(git_get_exact_tag _var) git_describe(out --exact-match ${ARGN}) set(${_var} "${out}" PARENT_SCOPE) endfunction() kraft-1.2.2/cmake/modules/GetGitRevisionDescription.cmake.in000066400000000000000000000022621467704360200241030ustar00rootroot00000000000000# # Internal file for GetGitRevisionDescription.cmake # # Requires CMake 2.6 or newer (uses the 'function' command) # # Original Author: # 2009-2010 Ryan Pavlik # http://academic.cleardefinition.com # Iowa State University HCI Graduate Program/VRAC # # Copyright Iowa State University 2009-2010. # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) set(HEAD_HASH) file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) if(HEAD_CONTENTS MATCHES "ref") # named branch string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") if(EXISTS "@GIT_DIR@/${HEAD_REF}") configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}") configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) set(HEAD_HASH "${HEAD_REF}") endif() else() # detached HEAD configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) endif() if(NOT HEAD_HASH) file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) string(STRIP "${HEAD_HASH}" HEAD_HASH) endif() kraft-1.2.2/database/000077500000000000000000000000001467704360200144005ustar00rootroot00000000000000kraft-1.2.2/database/CMakeLists.txt000066400000000000000000000001111467704360200171310ustar00rootroot00000000000000add_subdirectory(mysql) add_subdirectory(sqlite3) add_subdirectory(meta) kraft-1.2.2/database/README000066400000000000000000000024531467704360200152640ustar00rootroot00000000000000Kraft - solution for open craft =============================== Kraft is a program that supports craftsmen in their daily jobs: making offers, invoices and confirmations. Kraft needs a mysql database running. But setup is easy, please try it. How to setup the database? ========================== First, install the mysql packages of your distribution. Create a database user and select a suitable password. Please replace the word 'user' in the following code examples with the user name you created. The database can be set up using the creation scripts in Krafts database directory. The scripts do create the database completely new, even if they exists. The standard way however to let Kraft create and maintain the database schema for you. All that needs to be done is to - start MySQL on the system - have a user and password combination that has acces to the database - create an empty database with a suitable name like for example "kraft". - enter the credentials and the database name in Kraft's config dialog. Schema creation and maintenance is done by Kraft automatically. To create the database, perform the following steps: The database credentials must be entered into the settings dialog in kraft after the first start. Please restart after you have entered the data. That's it. kraft-1.2.2/database/errorcodes.txt000066400000000000000000000004461467704360200173140ustar00rootroot00000000000000type problem + native db error 1 mysql not started on the system: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111) QMYSQL3: Unable to connect' 1 mysql running, but no db kraft there 'Unknown database 'kraft' QMYSQL3: Unable to connect' kraft-1.2.2/database/meta/000077500000000000000000000000001467704360200153265ustar00rootroot00000000000000kraft-1.2.2/database/meta/21_meta.xml000066400000000000000000000115161467704360200173040ustar00rootroot00000000000000 Progress Payment Invoice default en PartialInvoice true Final Invoice Invoice Partial Invoice default en PartialInvoice true Final Invoice Invoice Final Invoice default en SubstractPartialInvoice true Teilrechnung default de PartialInvoice true Schlussrechnung Rechnung Abschlagsrechnung default de PartialInvoice true Schlussrechnung Rechnung Schlussrechnung default de SubstractPartialInvoice true Angebot de Abschlagsrechnung Teilrechnung Schlussrechnung Rechnung Auftragsbestätigung de Abschlagsrechnung Teilrechnung Schlussrechnung Rechnung Lieferschein de docTemplateFile delivery_receipt.trml HidePrices 1 Abschlagsrechnung Teilrechnung Schlussrechnung Rechnung Angebot (keine Preise) de docTemplateFile offer_no_prices.trml HidePrices 1 Delivery Receipt en docTemplateFile delivery_receipt.trml HidePrices 1 Final Invoice Partial Invoice Progress Payment Invoice Invoice Acceptance of Order en Final Invoice Partial Invoice Progress Payment Invoice Invoice Offer en Final Invoice Partial Invoice Progress Payment Invoice Invoice Offer (No Pricetags) en docTemplateFile offer_no_prices.trml HidePrices 1 Offerte nl Rekening Pakbon Pakbon nl docTemplateFile delivery_receipt.trml Rekening Rekening nl kraft-1.2.2/database/meta/CMakeLists.txt000066400000000000000000000002431467704360200200650ustar00rootroot00000000000000########### install files ############### file(GLOB meta_scripts *_meta.xml) install(FILES ${meta_scripts} DESTINATION ${DATA_INSTALL_DIR}/kraft/meta) kraft-1.2.2/database/mysql/000077500000000000000000000000001467704360200155455ustar00rootroot00000000000000kraft-1.2.2/database/mysql/CMakeLists.txt000066400000000000000000000003031467704360200203010ustar00rootroot00000000000000add_subdirectory(migration) ########### install files ############### install(FILES create_schema.sql fill_schema_de.sql fill_schema_en.sql DESTINATION ${DATA_INSTALL_DIR}/kraft/dbinit/mysql) kraft-1.2.2/database/mysql/create_schema.sql000066400000000000000000000117701467704360200210570ustar00rootroot00000000000000# DROP DATABASE IF EXISTS kraft; # CREATE DATABASE kraft DEFAULT CHARACTER SET "utf8"; # use kraft; CREATE TABLE preisArten ( preisArtID INT NOT NULL, preisArt VARCHAR(64) NOT NULL, PRIMARY KEY( preisArtID ) ); CREATE TABLE wordLists( category VARCHAR(64), word VARCHAR(255), PRIMARY KEY( category, word ) ); CREATE TABLE CatalogSet( catalogSetID INT NOT NULL AUTO_INCREMENT, name VARCHAR(255), description VARCHAR(255), catalogType VARCHAR(64), sortKey INT NOT NULL, PRIMARY KEY(catalogSetID) ); CREATE TABLE CatalogChapters( chapterID INT NOT NULL AUTO_INCREMENT, catalogSetID INT NOT NULL, chapter VARCHAR(255), sortKey INT NOT NULL, PRIMARY KEY(chapterID), INDEX(chapter) ); CREATE TABLE Catalog ( TemplID INT NOT NULL AUTO_INCREMENT, chapterID INT NOT NULL default 1, unitID INT NOT NULL, Floskel TEXT, Gewinn DECIMAL(6,2) default 0, zeitbeitrag TINYINT default 1, enterDatum DATETIME, modifyDatum TIMESTAMP, Preisart INT NOT NULL default 1, EPreis DECIMAL(10,2) default 0, PRIMARY KEY( TemplID ), INDEX ( chapterID ) ); UPDATE Catalog SET modifyDatum=enterDatum; CREATE TABLE CalcTime ( TCalcID INT NOT NULL AUTO_INCREMENT, TemplID INT NOT NULL, name VARCHAR(255), minutes INT default 0, percent INT default 0, stdHourSet INT default 0, allowGlobal INT default 1, modDate TIMESTAMP, PRIMARY KEY( TCalcID), INDEX( TemplID ) ); CREATE TABLE CalcFixed( FCalcID INT NOT NULL AUTO_INCREMENT, TemplID INT NOT NULL, name VARCHAR(255), amount DECIMAL(10,2) default 1.0, price DECIMAL(10,2), percent INT default 0, modDate TIMESTAMP, PRIMARY KEY(FCalcID), INDEX(TemplID) ); CREATE TABLE CalcMaterials( MCalcID INT NOT NULL AUTO_INCREMENT, TemplID INT NOT NULL, name VARCHAR(255), percent INT default 0, modDate TIMESTAMP, PRIMARY KEY(MCalcID), INDEX(TemplID) ); CREATE TABLE CalcMaterialDetails( MCalcDetailID INT NOT NULL AUTO_INCREMENT, CalcID INT NOT NULL, materialID INT NOT NULL, amount DECIMAL(10,2), PRIMARY KEY(MCalcDetailID), INDEX(CalcID) ); CREATE TABLE units( unitID INT NOT NULL, unitShort VARCHAR(255), unitLong VARCHAR(255), unitPluShort VARCHAR(255), unitPluLong VARCHAR(255), PRIMARY KEY(unitID), INDEX(unitShort) ); CREATE TABLE stockMaterial ( matID INT NOT NULL AUTO_INCREMENT, chapterID INT NOT NULL default 1, material mediumtext, unitID INT NOT NULL, perPack DECIMAL(10,2), priceIn DECIMAL(10,2), priceOut DECIMAL(10,2), enterDate DATETIME, modifyDate TIMESTAMP, PRIMARY KEY(matID), INDEX(chapterID) ); CREATE TABLE stdSaetze( stdSaetzeID INT NOT NULL AUTO_INCREMENT, name VARCHAR(255), price DECIMAL(10,2), sortKey int, PRIMARY KEY(stdSaetzeID) ); CREATE TABLE document( docID INT NOT NULL AUTO_INCREMENT, ident VARCHAR(32), docType VARCHAR(255), clientID VARCHAR(32), clientAddress TEXT, salut VARCHAR(255), goodbye VARCHAR(128), lastModified TIMESTAMP, date DATE, pretext TEXT, posttext TEXT, PRIMARY KEY( docID ), INDEX(ident), INDEX(clientID) ); CREATE TABLE docposition( positionID INT NOT NULL AUTO_INCREMENT, docID INT NOT NULL, ordNumber INT NOT NULL, text TEXT, amount DECIMAL(10,2), unit INT, price DECIMAL(10,2), PRIMARY KEY( positionID ), INDEX(docID), UNIQUE( docID, ordNumber) ); CREATE TABLE archdocStates( stateID INT NOT NULL AUTO_INCREMENT, state VARCHAR(32), PRIMARY KEY( stateID ) ); CREATE TABLE archdoc( archDocID INT NOT NULL AUTO_INCREMENT, ident VARCHAR(32), docType VARCHAR(255), docDescription TEXT, clientAddress TEXT, salut VARCHAR(255), goodbye VARCHAR(128), printDate TIMESTAMP, date DATE, pretext TEXT, posttext TEXT, state int, PRIMARY KEY( archDocID ), INDEX(ident) ); CREATE TABLE archdocpos( archPosID INT NOT NULL AUTO_INCREMENT, archDocID INT NOT NULL, ordNumber INT NOT NULL, text TEXT, amount DECIMAL(10,2), unit VARCHAR(64), price DECIMAL(10,2), vat DECIMAL(4,1), PRIMARY KEY( archPosID ), INDEX(archDocID), UNIQUE( archDocID, ordNumber) ); CREATE TABLE kraftsystem( dbschemaversion INT NOT NULL, updateUser VARCHAR(256) ); INSERT INTO kraftsystem ( dbschemaversion ) VALUES ( 1 ); # message Database created. kraft-1.2.2/database/mysql/fill_schema_de.sql000066400000000000000000000064341467704360200212130ustar00rootroot00000000000000DELETE FROM preisArten; INSERT INTO preisArten VALUES (0, 'offen'); INSERT INTO preisArten VALUES (1, 'selbsterstellt'); INSERT INTO preisArten VALUES (2, 'kalkuliert'); DELETE FROM CatalogSet; INSERT INTO CatalogSet (name, description, catalogType, sortKey) VALUES ( "Standard Mustertexte", "Kalkulierte Musterposten", "TemplCatalog", 1 ); SET @newCat := LAST_INSERT_ID(); DELETE FROM CatalogChapters; INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Arbeit', 1, @newCat ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Maschine', 2, @newCat ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Materialeinsatz', 3, @newCat ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Service', 4, @newCat ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Sonstige', 5, @newCat ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Transport', 6, @newCat ); UPDATE CatalogChapters SET catalogSetID=@newCat; INSERT INTO CatalogSet( name, description, catalogType, sortKey) VALUES ("Material", "Materialkatalog", "MaterialCatalog", 2 ); SET @newCat := LAST_INSERT_ID(); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Schüttgüter', 3, @newCat); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Naturstein', 2, @newCat); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Beton', 1, @newCat); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Rohre', 4, @newCat); DELETE FROM units; INSERT INTO units VALUES (0, 'm', 'Meter', 'm', 'Meter' ); INSERT INTO units VALUES (1, 'qm', 'Quadratmeter', 'qm', 'Quadratmeter' ); INSERT INTO units VALUES (2, 'cbm', 'Kubikmeter', 'cbm', 'Kubikmeter' ); INSERT INTO units VALUES (3, 'Sck.', 'Sack', 'Sck.', 'Saecke' ); INSERT INTO units VALUES (4, 'l', 'Liter', 'l', 'Liter' ); INSERT INTO units VALUES (5, 'kg', 'Kilogramm', 'kg', 'Kilogramm' ); INSERT INTO units VALUES (6, 'Stck.', 'Stueck', 'Stck.', 'Stueck' ); INSERT INTO units VALUES (7, 't', 'Tonne', 't', 'Tonnen' ); INSERT INTO units VALUES (8, 'pausch.', 'pauschal', 'pausch.', 'pauschal' ); INSERT INTO units VALUES (9, 'Std.', 'Stunde', 'Std.', 'Stunden' ); DELETE FROM stdSaetze; INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Geselle', 34.00, 1 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Meister', 39.00, 2 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Helfer', 30.00, 4 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Auszubildender', 21.00, 3 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Maschinenfuehrer', 33.00, 5 ); DELETE FROM wordLists; INSERT INTO wordLists VALUES ('greeting', 'mit den besten Grüssen,' ); INSERT INTO wordLists VALUES ('greeting', 'liebe Grüsse,' ); INSERT INTO wordLists VALUES ('greeting', 'Hochachtungsvoll,' ); INSERT INTO wordLists VALUES ('greeting', 'mit freundlichem Gruß,' ); INSERT INTO wordLists VALUES ('salut', 'Sehr geehrter Herr %NAME,' ); INSERT INTO wordLists VALUES ('salut', 'Sehr geehrte Frau %NAME,' ); INSERT INTO wordLists VALUES ('salut', 'Sehr geehrte Frau %NAME, sehr geehrter Herr %NAME,' ); INSERT INTO wordLists VALUES ('salut', 'Lieber %GIVEN_NAME,' ); INSERT INTO wordLists VALUES ('salut', 'Liebe %GIVEN_NAME,' ); kraft-1.2.2/database/mysql/fill_schema_en.sql000066400000000000000000000067301467704360200212240ustar00rootroot00000000000000DELETE FROM preisArten; INSERT INTO preisArten VALUES (0, 'open'); INSERT INTO preisArten VALUES (1, 'manual'); INSERT INTO preisArten VALUES (2, 'calculated'); DELETE FROM CatalogSet; INSERT INTO CatalogSet (name, description, catalogType, sortKey) VALUES ( "Standard Templates", "A set of templates suitable for business", "TemplCatalog", 1 ); SET @newCat := LAST_INSERT_ID(); DELETE FROM CatalogChapters; INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Work', 1, @newCat ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Machine', 2, @newCat ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Concrete', 3, @newCat ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Stones', 4, @newCat ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Misc', 5, @newCat ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Transportation', 6, @newCat ); INSERT INTO CatalogSet( name, description, catalogType, sortKey) VALUES ("Material", "Material Catalog to Use in Calculations in Templates", "MaterialCatalog", 2 ); SET @newCat := LAST_INSERT_ID(); INSERT INTO CatalogChapters ( chapter, sortKey, catalogSetID ) VALUES ('Sand etc.', 3, @newCat ); INSERT INTO CatalogChapters ( chapter, sortKey, catalogSetID ) VALUES ('Stones', 2, @newCat ); INSERT INTO CatalogChapters ( chapter, sortKey, catalogSetID ) VALUES ('Concreate', 1, @newCat ); INSERT INTO CatalogChapters ( chapter, sortKey, catalogSetID ) VALUES ('Pipes', 4, @newCat ); INSERT INTO CatalogChapters ( chapter, sortKey, catalogSetID ) VALUES ('Wood', 5, @newCat ); INSERT INTO CatalogChapters ( chapter, sortKey, catalogSetID ) VALUES ('Art and Furnitures', 6, @newCat ); DELETE FROM units; INSERT INTO units VALUES (0, 'm', 'Meter', 'm', 'Meter' ); INSERT INTO units VALUES (1, 'sm', 'Squaremeter', 'qm', 'Squaremeter' ); INSERT INTO units VALUES (2, 'cbm', 'Cubikmeter', 'cbm', 'Cubikmeter' ); INSERT INTO units VALUES (3, 'Bag.', 'Bag', 'Bag', 'Bags' ); INSERT INTO units VALUES (4, 'l', 'Liter', 'l', 'Liter' ); INSERT INTO units VALUES (5, 'kg', 'Kilogramm', 'kg', 'Kilogramm' ); INSERT INTO units VALUES (6, 'Pcs.', 'Piece', 'Pcs.', 'Pieces' ); INSERT INTO units VALUES (7, 't', 'Ton', 't', 'Tons' ); INSERT INTO units VALUES (8, 'pausch.', 'pauschal', 'pausch.', 'pauschal' ); INSERT INTO units VALUES (9, 'Hour', 'Hour', 'Hours', 'Hours' ); DELETE FROM stdSaetze; INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Worker', 34.00, 1 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Master', 39.00, 2 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Helper', 30.00, 4 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Trainee', 21.00, 3 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Machine Driver', 33.00, 5 ); DELETE FROM wordLists; INSERT INTO wordLists VALUES ('greeting', 'with kind regards,' ); INSERT INTO wordLists VALUES ('greeting', 'with best regards,' ); INSERT INTO wordLists VALUES ('greeting', 'yours faithfully,' ); INSERT INTO wordLists VALUES ('greeting', 'goodbye and thanks for the fish,' ); INSERT INTO wordLists VALUES ('greeting', 'goodbye' ); INSERT INTO wordLists VALUES ('greeting', 'forever yours,' ); INSERT INTO wordLists VALUES ('salut', 'Dear Mr. %NAME' ); INSERT INTO wordLists VALUES ('salut', 'Dear Mrs. %NAME' ); INSERT INTO wordLists VALUES ('salut', 'Dear Mrs. %NAME, dear Mr. %NAME' ); INSERT INTO wordLists VALUES ('salut', 'Dear %GIVEN_NAME' ); kraft-1.2.2/database/mysql/migration/000077500000000000000000000000001467704360200175365ustar00rootroot00000000000000kraft-1.2.2/database/mysql/migration/10_dbmigrate.sql000066400000000000000000000051221467704360200225150ustar00rootroot00000000000000# message allow laternatives and demand positions for offers SELECT @item := docTypeID FROM DocTypes WHERE name="Offer"; INSERT IGNORE INTO attributes (hostObject, hostId, name, value) VALUES ('DocType', @item, 'AllowAlternative', '1'); INSERT IGNORE INTO attributes (hostObject, hostId, name, value) VALUES ('DocType', @item, 'AllowDemand', '1'); SELECT @item := docTypeID FROM DocTypes WHERE name="Angebot"; INSERT IGNORE INTO attributes (hostObject, hostId, name, value) VALUES ('DocType', @item, 'AllowAlternative', '1'); INSERT IGNORE INTO attributes (hostObject, hostId, name, value) VALUES ('DocType', @item, 'AllowDemand', '1'); # message Add a list value identification column to the attribute table ALTER TABLE attributes ADD COLUMN valueIsList tinyint default 0 after value; DROP TABLE IF EXISTS tmp_attrib; CREATE TABLE tmp_attrib ( id INT NOT NULL AUTO_INCREMENT, hostObject VARCHAR(64), hostId INT, name VARCHAR(64), value MEDIUMTEXT, valueIsList TINYINT, PRIMARY KEY(id), UNIQUE INDEX( hostObject, hostId, name ) ); INSERT INTO tmp_attrib (hostObject, hostId, name, value, valueIsList) SELECT hostObject, hostId, name, value, 0 FROM attributes; # message Create an attribute value table CREATE TABLE IF NOT EXISTS attributeValues ( id INT NOT NULL AUTO_INCREMENT, attributeId INT NOT NULL, value VARCHAR(255), PRIMARY KEY( id ), INDEX( attributeId ) ); # message copy the attribute values over to the new attribute value table INSERT INTO attributeValues (attributeId, value) SELECT id, value FROM tmp_attrib WHERE value is not null; # message drop the attrib column ALTER TABLE tmp_attrib DROP COLUMN value; DROP TABLE IF EXISTS attribute_old; RENAME TABLE attributes TO attribute_old, tmp_attrib TO attributes; # message create a table to keep tag templates CREATE TABLE IF NOT EXISTS `tagTemplates` ( `tagTmplID` int(11) NOT NULL auto_increment, `sortkey` int(11) NOT NULL, `name` varchar(255) default NULL, `description` varchar(255) default NULL, `color` char(7) default NULL, PRIMARY KEY (`tagTmplID`), KEY `sortkey` (`sortkey`) ); INSERT IGNORE INTO tagTemplates (sortkey, name, description, color) VALUES (3, 'Discount', 'Marks items to give discount on', '#ff1c1c' ); INSERT IGNORE INTO tagTemplates (sortkey, name, description, color) VALUES (1, 'Material', 'Marks material', '#4e4e4e' ); INSERT IGNORE INTO tagTemplates (sortkey, name, description, color) VALUES (2, 'Work', 'Marks working hour items', '#ffbb39' ); INSERT IGNORE INTO tagTemplates (sortkey, name, description, color) VALUES (4, 'Plants', 'Marks plant items', '#26b913' ); kraft-1.2.2/database/mysql/migration/11_dbmigrate.sql000066400000000000000000000005461467704360200225230ustar00rootroot00000000000000# message Adding relation table information to attribute table ALTER TABLE attributes ADD COLUMN relationTable varchar(64) default NULL AFTER valueIsList; ALTER TABLE attributes ADD COLUMN relationIDColumn varchar(64) default NULL AFTER relationTable; ALTER TABLE attributes ADD COLUMN relationStringColumn varchar(64) default NULL AFTER relationIDColumn; kraft-1.2.2/database/mysql/migration/12_dbmigrate.sql000066400000000000000000000006641467704360200225250ustar00rootroot00000000000000CREATE TABLE numberCycles ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(64) NOT NULL, lastIdentNumber INT NOT NULL DEFAULT 0, identTemplate VARCHAR(64) NOT NULL DEFAULT "%i-%yyyy", PRIMARY KEY( id ), UNIQUE(name) ); SELECT @id := IF( ISNULL(MAX( docID)), 1, MAX(docID) ) FROM document; INSERT INTO numberCycles (name, lastIdentNumber) VALUES ("default", @id); kraft-1.2.2/database/mysql/migration/13_dbmigrate.sql000066400000000000000000000001501467704360200225140ustar00rootroot00000000000000# message Adding a taxType column ALTER TABLE docposition ADD COLUMN taxType int default 3 AFTER price; kraft-1.2.2/database/mysql/migration/14_dbmigrate.sql000066400000000000000000000005671467704360200225310ustar00rootroot00000000000000# message Add tax table CREATE TABLE taxes ( id INT NOT NULL AUTO_INCREMENT, fullTax DECIMAL(5,1), reducedTax DECIMAL(5,1), startDate DATE, PRIMARY KEY( id ) ); INSERT INTO taxes ( fullTax, reducedTax, startDate ) VALUES (16.0, 7.0, '1998-04-01' ); INSERT INTO taxes ( fullTax, reducedTax, startDate ) VALUES (19.0, 7.0, '2007-01-01' ); kraft-1.2.2/database/mysql/migration/15_dbmigrate.sql000066400000000000000000000006201467704360200225200ustar00rootroot00000000000000ALTER TABLE document ADD COLUMN projectLabel VARCHAR(255) AFTER language; ALTER TABLE archdoc ADD COLUMN projectLabel VARCHAR(255) AFTER language; ALTER TABLE archdoc ADD COLUMN tax DECIMAL(5,1) AFTER projectLabel; ALTER TABLE archdoc ADD COLUMN reducedTax DECIMAL(5,1) AFTER tax; ALTER TABLE archdocpos DROP COLUMN vat; ALTER TABLE archdocpos ADD COLUMN taxType INT DEFAULT 0 AFTER overallPrice; kraft-1.2.2/database/mysql/migration/16_dbmigrate.sql000066400000000000000000000013351467704360200225250ustar00rootroot00000000000000ALTER TABLE CalcMaterials RENAME TO CalcMaterialsOld; CREATE TABLE CalcMaterials ( MCalcID INT NOT NULL AUTO_INCREMENT, TemplID INT NOT NULL, materialID INT NOT NULL, percent INT DEFAULT 0, amount DECIMAL(10,2), modDate TIMESTAMP, PRIMARY KEY(MCalcID) ); INSERT INTO CalcMaterials (TemplID, materialID, amount, percent, modDate) SELECT CalcMaterialsOld.TemplID, CalcMaterialDetails.materialID, CalcMaterialDetails.amount, CalcMaterialsOld.percent, CalcMaterialsOld.modDate FROM CalcMaterialDetails INNER JOIN CalcMaterialsOld ON CalcMaterialDetails.CalcID=CalcMaterialsOld.MCalcID; DROP TABLE IF EXISTS CalcMaterialsOld; DROP TABLE IF EXISTS CalcMaterialDetails; DROP TABLE IF EXISTS attribute_old;kraft-1.2.2/database/mysql/migration/17_dbmigrate.sql000066400000000000000000000002021467704360200225160ustar00rootroot00000000000000ALTER TABLE CatalogChapters ADD COLUMN parentChapter int(11) default 0; ALTER TABLE CatalogChapters ADD COLUMN description text; kraft-1.2.2/database/mysql/migration/18_dbmigrate.sql000066400000000000000000000003341467704360200225250ustar00rootroot00000000000000# message Adding sort column and usage statistics ALTER TABLE Catalog ADD COLUMN sortKey INT(11) default 0; ALTER TABLE Catalog ADD COLUMN lastUsed DATETIME; ALTER TABLE Catalog ADD COLUMN useCounter INT(11) default 0; kraft-1.2.2/database/mysql/migration/19_dbmigrate.sql000066400000000000000000000025301467704360200225260ustar00rootroot00000000000000# message Create new document type delivery note INSERT INTO DocTypes (name) VALUES ('Lieferschein'); SET @lsId := LAST_INSERT_ID(); INSERT INTO attributes (hostObject, hostId, name, valueIsList) VALUES ('DocType', @lsId, 'HidePrices', 1); INSERT INTO DocTypes (name) VALUES ('Delivery Receipt'); SET @nodId := LAST_INSERT_ID(); INSERT INTO attributes (hostObject, hostId, name, valueIsList) VALUES ('DocType', @nodId, 'HidePrices', 1); # message Add more document relation settings # Lieferschein follows Angebot SELECT @item := docTypeID FROM DocTypes WHERE name="Angebot"; # mayfail INSERT INTO DocTypeRelations VALUES( @item, @lsId, 10 ); # Rechnung follows Lieferschein SELECT @follower := docTypeID FROM DocTypes WHERE name="Rechnung"; # mayfail INSERT INTO DocTypeRelations VALUES( @lsId, @follower, 11 ); # Delivery Receipt follows Offer SELECT @item := docTypeID FROM DocTypes WHERE name="Offer"; # mayfail INSERT INTO DocTypeRelations VALUES( @item, @nodId, 12 ); # Invoice follows Delivery Receipt SELECT @follower := docTypeID FROM DocTypes WHERE name="Invoice"; # mayfail INSERT INTO DocTypeRelations VALUES( @nodId, @follower, 13 ); # enhance the clientID col in document because the ids can be larger. ALTER TABLE document CHANGE COLUMN clientID clientID VARCHAR(255); ALTER TABLE archdoc CHANGE COLUMN clientUid clientUid VARCHAR(255); # Done. kraft-1.2.2/database/mysql/migration/20_dbmigrate.sql000066400000000000000000000004001467704360200225100ustar00rootroot00000000000000ALTER TABLE CalcTime ADD COLUMN timeUnit INT default 0; -- Add a unit id ALTER TABLE DocCalcTime ADD COLUMN timeUnit INT default 0; -- Add a unit id UPDATE CalcTime set timeUnit=0; -- Update existing CalcTime entries. UPDATE DocCalcTime set timeUnit=0; kraft-1.2.2/database/mysql/migration/21_dbmigrate.sql000066400000000000000000000003431467704360200225170ustar00rootroot00000000000000ALTER TABLE document ADD COLUMN predecessor VARCHAR(32) AFTER projectLabel; ALTER TABLE archdoc ADD COLUMN predecessor VARCHAR(32) AFTER projectLabel; UPDATE document SET predecessor = 0; UPDATE archdoc SET predecessor = 0; kraft-1.2.2/database/mysql/migration/22_dbmigrate.sql000066400000000000000000000002551467704360200225220ustar00rootroot00000000000000 INSERT INTO taxes (fullTax, reducedTax, startDate) VALUES (16.0, 5.0, '2020-07-01'); INSERT INTO taxes (fullTax, reducedTax, startDate) VALUES (19.0, 7.0, '2021-01-01'); kraft-1.2.2/database/mysql/migration/23_dbmigrate.sql000066400000000000000000000004611467704360200225220ustar00rootroot00000000000000ALTER TABLE stockMaterial ADD COLUMN sortKey INT default 0; CREATE TABLE catItemUsage ( catId INT NOT NULL, itemId INT NOT NULL, usageCount INT default 0, lastUsed DATETIME, PRIMARY KEY(catId, itemId) ); ALTER TABLE Catalog DROP COLUMN lastUsed; ALTER TABLE Catalog DROP COLUMN useCounter; kraft-1.2.2/database/mysql/migration/24_dbmigrate.sql000066400000000000000000000011721467704360200225230ustar00rootroot00000000000000 ALTER TABLE units ADD COLUMN ec20 VARCHAR(10); UPDATE units set ec20 = "MTR" WHERE unitShort = "m"; UPDATE units set ec20 = "MTK" WHERE unitShort = "qm" or unitShort = "sm"; UPDATE units set ec20 = "MTQ" WHERE unitShort = "cbm"; UPDATE units set ec20 = "XSA" WHERE unitLong = "Sack" or unitLong = "Bag"; UPDATE units set ec20 = "LTR" WHERE unitLong = "Liter"; UPDATE units set ec20 = "KGM" WHERE unitLong = "Kilogramm"; UPDATE units set ec20 = "XPP" WHERE unitShort = "Stck." or unitShort ="Pcs."; UPDATE units set ec20 = "TNE" WHERE unitShort = "t"; UPDATE units set ec20 = "HUR" WHERE unitLong = "Stunde" or unitLong ="Hour"; kraft-1.2.2/database/mysql/migration/2_dbmigrate.sql000066400000000000000000000021551467704360200224410ustar00rootroot00000000000000# message: Creating document position calulation tables ; CREATE TABLE DocCalcTime ( TCalcID INT NOT NULL AUTO_INCREMENT, TemplID INT NOT NULL, name VARCHAR(255), minutes INT default 0, percent INT default 0, stdHourSet INT default 0, allowGlobal INT default 1, modDate TIMESTAMP, PRIMARY KEY( TCalcID), INDEX(TemplID) ); CREATE TABLE DocCalcFixed( FCalcID INT NOT NULL AUTO_INCREMENT, TemplID INT NOT NULL, name VARCHAR(255), amount DECIMAL(10,2) default 1.0, price DECIMAL(10,2), percent INT default 0, modDate TIMESTAMP, PRIMARY KEY(FCalcID), INDEX(TemplID) ); CREATE TABLE DocCalcMaterials( MCalcID INT NOT NULL AUTO_INCREMENT, TemplID INT NOT NULL, name VARCHAR(255), percent INT default 0, modDate TIMESTAMP, PRIMARY KEY(MCalcID), INDEX(TemplID) ); CREATE TABLE DocCalcMaterialDetails( MCalcDetailID INT NOT NULL AUTO_INCREMENT, CalcID INT NOT NULL, materialID INT NOT NULL, amount DECIMAL(10,2), PRIMARY KEY(MCalcDetailID), INDEX(CalcID) ); kraft-1.2.2/database/mysql/migration/3_dbmigrate.sql000066400000000000000000000003421467704360200224360ustar00rootroot00000000000000CREATE TABLE plantPrices ( matchCode VARCHAR(255), price DECIMAL(8,2), lastUpdate TIMESTAMP, PRIMARY KEY( matchCode ) ); ALTER TABLE document ADD COLUMN docDescription TEXT AFTER docType; kraft-1.2.2/database/mysql/migration/4_dbmigrate.sql000066400000000000000000000077461467704360200224560ustar00rootroot00000000000000CREATE TABLE DocTexts ( docTextID INT NOT NULL AUTO_INCREMENT, name VARCHAR(64), description TEXT, text TEXT, docType VARCHAR( 64 ), textType VARCHAR( 64 ), modDate TIMESTAMP, PRIMARY KEY( docTextID ), INDEX( docType, textType ) ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Offer', 'Header Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Offer', 'Footer Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Invoice', 'Header Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Invoice', 'Footer Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Acceptance of Order', 'Header Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Acceptance of Order', 'Footer Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Angebot', 'Kopf Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Angebot', 'Fuß Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Rechnung', 'Kopf Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Rechnung', 'Fuß Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Auftragsbestätigung', 'Kopf Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Auftragsbestätigung', 'Fuß Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Offer', 'Footer Text' FROM wordLists WHERE category='docFooter_Offer'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Offer', 'Header Text' FROM wordLists WHERE category='docHeader_Offer'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Invoice', 'Footer Text' FROM wordLists WHERE category='docFooter_Invoice'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Invoice', 'Header Text' FROM wordLists WHERE category='docHeader_Invoice'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Acceptance of Order', 'Footer Text' FROM wordLists WHERE category='docFooter_Acceptance of Order'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Acceptance of Order', 'Header Text' FROM wordLists WHERE category='docHeader_Acceptance of Order'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Angebot', 'Fuß Text' FROM wordLists WHERE category='docFooter_Angebot'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Angebot', 'Kopf Text' FROM wordLists WHERE category='docHeader_Angebot'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Rechnung', 'Fuß Text' FROM wordLists WHERE category='docFooter_Rechnung'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Rechnung', 'Kopf Text' FROM wordLists WHERE category='docHeader_Rechnung'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Auftragsbestätigung', 'Fuß Text' FROM wordLists WHERE category='docFooter_Auftragsbestätigung'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Auftragsbestätigung', 'Kopf Text' FROM wordLists WHERE category='docHeader_Auftragsbestätigung'; kraft-1.2.2/database/mysql/migration/5_dbmigrate.sql000066400000000000000000000043051467704360200224430ustar00rootroot00000000000000# message Creating attributes table... CREATE TABLE attributes ( hostObject VARCHAR(64), hostId INT NOT NULL, name VARCHAR(64), value MEDIUMTEXT, PRIMARY KEY( hostObject, hostId, name ) ); # message Creating attributes for archived documents CREATE TABLE archPosAttribs ( archPosAttribId INT NOT NULL AUTO_INCREMENT, archDocID INT NOT NULL, name VARCHAR(64), value VARCHAR(64), PRIMARY KEY( archPosAttribId ) ); # message Adding position type and overall price ot archdocpositions ALTER TABLE archdocpos ADD COLUMN kind VARCHAR(64) AFTER ordNumber; ALTER TABLE archdocpos ADD COLUMN overallPrice DECIMAL(10,2) AFTER price; # message Changing old kinds to Normal UPDATE archdocpos SET kind = "Normal"; # message Calculating archive position price UPDATE archdocpos SET overallPrice = ROUND( price * amount, 2); # message Creating Document Type table CREATE TABLE DocTypes ( docTypeID INT NOT NULL AUTO_INCREMENT, name VARCHAR(255), PRIMARY KEY( docTypeID ) ); # message Filling doc type attributes INSERT INTO DocTypes (name) VALUES ( 'Offer' ); SET @dtId := LAST_INSERT_ID(); INSERT INTO attributes VALUES ('DocType', @dtId, 'AllowDemand', 'true'); INSERT INTO attributes VALUES ('DocType', @dtId, 'AllowAlternative', 'true'); INSERT INTO DocTypes (name) VALUES ( 'Acceptance of Order' ); SET @dtId := LAST_INSERT_ID(); INSERT INTO attributes VALUES ('DocType', @dtId, 'AllowDemand', 'true'); INSERT INTO attributes VALUES ('DocType', @dtId, 'AllowAlternative', 'true'); INSERT INTO DocTypes (name) VALUES ( 'Invoice' ); # message Filling doc type attributes INSERT INTO DocTypes (name) VALUES ( 'Angebot' ); SET @dtId := LAST_INSERT_ID(); INSERT INTO attributes VALUES ('DocType', @dtId, 'AllowDemand', 'true'); INSERT INTO attributes VALUES ('DocType', @dtId, 'AllowAlternative', 'true'); INSERT INTO DocTypes (name) VALUES ( 'Auftragsbestätigung' ); SET @dtId := LAST_INSERT_ID(); INSERT INTO attributes VALUES ('DocType', @dtId, 'AllowDemand', 'true'); INSERT INTO attributes VALUES ('DocType', @dtId, 'AllowAlternative', 'true'); INSERT INTO DocTypes (name) VALUES ( 'Rechnung' ); # message Drop an unused table archdocStates DROP TABLE IF EXISTS archdocStates; kraft-1.2.2/database/mysql/migration/6_dbmigrate.sql000066400000000000000000000004511467704360200224420ustar00rootroot00000000000000# message Localisation information on document level ALTER TABLE document ADD country VARCHAR(32) AFTER posttext; ALTER TABLE document ADD language VARCHAR(32) AFTER country; ALTER TABLE archdoc ADD country VARCHAR(32) AFTER posttext; ALTER TABLE archdoc ADD language VARCHAR(32) AFTER country; kraft-1.2.2/database/mysql/migration/7_dbmigrate.sql000066400000000000000000000001051467704360200224370ustar00rootroot00000000000000 ALTER TABLE archdoc ADD clientUid VARCHAR(32) AFTER clientAddress; kraft-1.2.2/database/mysql/migration/8_dbmigrate.sql000066400000000000000000000027711467704360200224530ustar00rootroot00000000000000 CREATE TABLE DocTypeRelations ( typeId INT NOT NULL, followerId INT NOT NULL, sequence INT NOT NULL, PRIMARY KEY( typeId, followerId ) ); # Acceptance of Order follows Offer SELECT @item := docTypeID FROM DocTypes WHERE name="Offer"; SELECT @follower := docTypeID FROM DocTypes WHERE name="Acceptance of Order"; INSERT INTO DocTypeRelations VALUES( @item, @follower, 1 ); # Invoice follorws Offer SELECT @item := docTypeID FROM DocTypes WHERE name="Offer"; SELECT @follower := docTypeID FROM DocTypes WHERE name="Invoice"; INSERT INTO DocTypeRelations VALUES( @item, @follower, 2 ); # Invoice follows Acceptance of Order SELECT @item := docTypeID FROM DocTypes WHERE name="Acceptance of Order"; SELECT @follower := docTypeID FROM DocTypes WHERE name="Invoice"; INSERT INTO DocTypeRelations VALUES( @item, @follower, 3 ); # Acceptance of Order follows Offer SELECT @item := docTypeID FROM DocTypes WHERE name="Angebot"; SELECT @follower := docTypeID FROM DocTypes WHERE name="Auftragsbestätigung"; INSERT INTO DocTypeRelations VALUES( @item, @follower, 4 ); # Invoice follorws Offer SELECT @item := docTypeID FROM DocTypes WHERE name="Angebot"; SELECT @follower := docTypeID FROM DocTypes WHERE name="Rechnung"; INSERT INTO DocTypeRelations VALUES( @item, @follower, 5 ); # Invoice follows Acceptance of Order SELECT @item := docTypeID FROM DocTypes WHERE name like "Auftragsbest%"; SELECT @follower := docTypeID FROM DocTypes WHERE name="Rechnung"; INSERT INTO DocTypeRelations VALUES( @item, @follower, 6 ); kraft-1.2.2/database/mysql/migration/9_dbmigrate.sql000066400000000000000000000007531467704360200224520ustar00rootroot00000000000000# message add a document type id to text table alter table DocTexts add column docTypeId int after docType; # message populate the doc type id column in docTexts update DocTexts set docTypeId=( SELECT docTypeID FROM DocTypes WHERE name=docType ); # message create a type column for the docposition alter table docposition add column postype VARCHAR(64) AFTER text; # message create type column for the archdocpos table alter table archdocpos add column postype VARCHAR(64) AFTER kind; kraft-1.2.2/database/mysql/migration/CMakeLists.txt000066400000000000000000000002711467704360200222760ustar00rootroot00000000000000########### install files ############### file(GLOB mig_scripts *_dbmigrate.sql) install(FILES README ${mig_scripts} DESTINATION ${DATA_INSTALL_DIR}/kraft/dbmigrate/mysql) kraft-1.2.2/database/mysql/migration/README000066400000000000000000000014721467704360200204220ustar00rootroot00000000000000Kraft Database Migration ======================== The Kraft database schema might change over the time. To achieve that smoothly for the users, here is a database migration system. Every version of Kraft has a hardcoded version of the required database schema version. In the Kraft database there is a system table that carries the version of the current running database schema. In case the current database version is lower than the required, Kraft looks in this migration directory if there is a script starting with the number "current version +1". If found, Kraft executes the sql commands contained in the file. After all are finished, the version in the database system table is updated. Note that the migration file my contain lines like # message: bla bla Kraft shows the message lines in the status line. kraft-1.2.2/database/sqlite3/000077500000000000000000000000001467704360200157645ustar00rootroot00000000000000kraft-1.2.2/database/sqlite3/CMakeLists.txt000066400000000000000000000003051467704360200205220ustar00rootroot00000000000000add_subdirectory(migration) ########### install files ############### install(FILES create_schema.sql fill_schema_de.sql fill_schema_en.sql DESTINATION ${DATA_INSTALL_DIR}/kraft/dbinit/sqlite3) kraft-1.2.2/database/sqlite3/create_schema.sql000066400000000000000000000160211467704360200212700ustar00rootroot00000000000000 CREATE TABLE preisArten ( preisArtID INTEGER PRIMARY KEY ASC autoincrement, preisArt VARCHAR(64) NOT NULL ); CREATE TABLE wordLists( category VARCHAR(64), word VARCHAR(255), PRIMARY KEY( category, word ) ); CREATE TABLE CatalogSet( catalogSetID INTEGER PRIMARY KEY ASC autoincrement, name VARCHAR(255), description VARCHAR(255), catalogType VARCHAR(64), sortKey INT NOT NULL ); CREATE TABLE CatalogChapters( chapterID INTEGER PRIMARY KEY ASC autoincrement, catalogSetID INT NOT NULL, chapter VARCHAR(255), sortKey INT NOT NULL ); CREATE INDEX chapterIndx ON CatalogChapters( chapter ); CREATE TABLE Catalog ( TemplID INTEGER PRIMARY KEY ASC autoincrement, chapterID INT NOT NULL default 1, unitID INT NOT NULL, Floskel TEXT, Gewinn DECIMAL(6,2) default 0, zeitbeitrag TINYINT default 1, enterDatum DATETIME, modifyDatum TIMESTAMP(14), Preisart INT NOT NULL default 1, EPreis DECIMAL(10,2) default 0 ); CREATE INDEX chapterIdIndx ON Catalog( chapterID ); CREATE TRIGGER insert_catalog_timeEnter AFTER INSERT ON Catalog BEGIN UPDATE Catalog SET enterDatum = DATETIME('NOW') WHERE TemplID = new.TemplID; END; CREATE TRIGGER update_catalog_timeEnter AFTER UPDATE ON Catalog BEGIN UPDATE Catalog SET modifyDatum = DATETIME('NOW') WHERE TemplID = new.TemplID; END; UPDATE Catalog SET modifyDatum=enterDatum; CREATE TABLE CalcTime ( TCalcID INTEGER PRIMARY KEY ASC autoincrement, TemplID INT NOT NULL, name VARCHAR(255), minutes INT default 0, percent INT default 0, stdHourSet INT default 0, allowGlobal INT default 1, modDate TIMESTAMP(14) ); CREATE INDEX calcTimeIndx ON CalcTime( TemplID ); CREATE TRIGGER update_calcTime_modifyDate AFTER UPDATE ON CalcTime BEGIN UPDATE CalcTime SET modDate = DATETIME('NOW') WHERE TCalcID = new.TCalcID; END; CREATE TABLE CalcFixed( FCalcID INTEGER PRIMARY KEY ASC autoincrement, TemplID INT NOT NULL, name VARCHAR(255), amount DECIMAL(10,2) default 1.0, price DECIMAL(10,2), percent INT default 0, modDate TIMESTAMP(14) ); CREATE INDEX calcFixedIndx ON CalcFixed( TemplID ); CREATE TRIGGER update_calcFixed_modifyDate AFTER UPDATE ON CalcFixed BEGIN UPDATE CalcFixed SET modDate = DATETIME('NOW') WHERE FCalcID = new.FCalcID; END; CREATE TABLE CalcMaterials( MCalcID INTEGER PRIMARY KEY ASC autoincrement, TemplID INT NOT NULL, name VARCHAR(255), percent INT default 0, modDate TIMESTAMP(14) ); CREATE INDEX calcMatIndx ON CalcMaterials( TemplID ); CREATE TRIGGER update_calcMaterials_modifyDate AFTER UPDATE ON CalcMaterials BEGIN UPDATE CalcMaterials SET modDate = DATETIME('NOW') WHERE MCalcID = new.MCalcID; END; CREATE TABLE CalcMaterialDetails( MCalcDetailID INTEGER PRIMARY KEY ASC autoincrement, CalcID INT NOT NULL, materialID INT NOT NULL, amount DECIMAL(10,2) ); CREATE INDEX calcIdIndx ON CalcMaterialDetails( CalcID ); CREATE TABLE units( unitID INTEGER PRIMARY KEY ASC autoincrement, unitShort VARCHAR(255), unitLong VARCHAR(255), unitPluShort VARCHAR(255), unitPluLong VARCHAR(255) ); CREATE INDEX unitShortIndx ON units( unitShort ); CREATE TABLE stockMaterial ( matID INTEGER PRIMARY KEY ASC autoincrement, chapterID INT NOT NULL default 1, material mediumtext, unitID INT NOT NULL, perPack DECIMAL(10,2), priceIn DECIMAL(10,2), priceOut DECIMAL(10,2), enterDate DATETIME, modifyDate TIMESTAMP(14) ); CREATE INDEX matChapterIndx ON stockMaterial( chapterID ); CREATE TRIGGER insert_material_enterDate AFTER INSERT ON stockMaterial BEGIN UPDATE stockMaterial SET enterDate = DATETIME('NOW') WHERE matID = new.matID; END; CREATE TRIGGER update_material_modifyDate AFTER UPDATE ON stockMaterial BEGIN UPDATE stockMaterial SET modifyDate = DATETIME('NOW') WHERE matID = new.matID; END; CREATE TABLE stdSaetze( stdSaetzeID INTEGER PRIMARY KEY ASC autoincrement, name VARCHAR(255), price DECIMAL(10,2), sortKey int ); CREATE TABLE document( docID INTEGER PRIMARY KEY ASC autoincrement, ident VARCHAR(32), docType VARCHAR(255), docDescription TEXT, clientID VARCHAR(32), clientAddress TEXT, salut VARCHAR(255), goodbye VARCHAR(128), lastModified TIMESTAMP, date DATE, pretext TEXT, posttext TEXT, country VARCHAR(32), language VARCHAR(32), projectLabel VARCHAR(255) ); CREATE INDEX identIndx ON document( ident ); CREATE INDEX clientIndx ON document( clientID ); CREATE TRIGGER update_document AFTER UPDATE ON document BEGIN UPDATE document SET lastModified = DATETIME('NOW') WHERE docID = new.docID; END; CREATE TABLE docposition( positionID INTEGER PRIMARY KEY ASC autoincrement, docID INT NOT NULL, ordNumber INT NOT NULL, text TEXT, postype VARCHAR(64), amount DECIMAL(10,2), unit INT, price DECIMAL(10,2), taxType INT default 3 ); CREATE INDEX docIdIndx ON docposition( docID ); CREATE UNIQUE INDEX ordIndx ON docposition( docID, ordNumber ); CREATE TABLE archdocStates( stateID INTEGER PRIMARY KEY ASC autoincrement, state VARCHAR(32) ); CREATE TABLE archdoc( archDocID INTEGER PRIMARY KEY ASC autoincrement, ident VARCHAR(32), docType VARCHAR(255), docDescription TEXT, clientAddress TEXT, clientUid VARCHAR(32), salut VARCHAR(255), goodbye VARCHAR(128), printDate TIMESTAMP, date DATE, pretext TEXT, posttext TEXT, country VARCHAR(32), language VARCHAR(32), projectLabel VARCHAR(255), tax DECIMAL(5,1), reducedTax DECIMAL(5,1), state int ); CREATE INDEX archIdentIndx ON archdoc( ident ); CREATE TRIGGER update_archdoc AFTER UPDATE ON archdoc BEGIN UPDATE archDoc SET printDate = DATETIME('NOW') WHERE archDocID = new.archDocID; END; CREATE TABLE archdocpos( archPosID INTEGER PRIMARY KEY ASC autoincrement, archDocID INT NOT NULL, ordNumber INT NOT NULL, kind VARCHAR(64), postype VARCHAR(64), text TEXT, amount DECIMAL(10,2), unit VARCHAR(64), price DECIMAL(10,2), overallPrice DECIMAL(10,2), taxType INT default 0 ); CREATE INDEX archDocIdIndx ON archdocpos( archDocID ); CREATE UNIQUE INDEX archOrdIndx ON archdocpos( archDocID, ordNumber ); CREATE TABLE kraftsystem( dbschemaversion INT NOT NULL, updateUser VARCHAR(256) ); INSERT INTO kraftsystem ( dbschemaversion ) VALUES ( 1 ); kraft-1.2.2/database/sqlite3/fill_schema_de.sql000066400000000000000000000106531467704360200214300ustar00rootroot00000000000000DELETE FROM preisArten; INSERT INTO preisArten (preisArt) VALUES ('offen'); INSERT INTO preisArten (preisArt) VALUES ('selbsterstellt'); INSERT INTO preisArten (preisArt) VALUES ('kalkuliert'); DELETE FROM CatalogSet; INSERT INTO CatalogSet (name, description, catalogType, sortKey) VALUES ( "Standard Mustertexte", "Kalkulierte Musterposten", "TemplCatalog", 1 ); DELETE FROM CatalogChapters; INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Arbeit', 1, (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Mustertexte")); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Maschine', 2, (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Mustertexte") ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Materialeinsatz', 3, (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Mustertexte") ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Service', 4, (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Mustertexte") ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Sonstige', 5, (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Mustertexte") ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Transport', 6, (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Mustertexte") ); INSERT INTO CatalogSet( name, description, catalogType, sortKey) VALUES ("Material", "Materialkatalog", "MaterialCatalog", 2 ); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Schüttgüter', 3, (SELECT catalogSetID FROM CatalogSet WHERE name="Material")); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Naturstein', 2, (SELECT catalogSetID FROM CatalogSet WHERE name="Material")); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Beton', 1, (SELECT catalogSetID FROM CatalogSet WHERE name="Material")); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Rohre', 4, (SELECT catalogSetID FROM CatalogSet WHERE name="Material")); DELETE FROM units; INSERT INTO units (unitShort, unitLong, unitPluShort, unitPluLong) VALUES ('m', 'Meter', 'm', 'Meter' ); INSERT INTO units (unitShort, unitLong, unitPluShort, unitPluLong) VALUES ('qm', 'Quadratmeter', 'qm', 'Quadratmeter' ); INSERT INTO units (unitShort, unitLong, unitPluShort, unitPluLong) VALUES ('cbm', 'Kubikmeter', 'cbm', 'Kubikmeter' ); INSERT INTO units (unitShort, unitLong, unitPluShort, unitPluLong) VALUES ('Sck.', 'Sack', 'Sck.', 'Säcke' ); INSERT INTO units (unitShort, unitLong, unitPluShort, unitPluLong) VALUES ( 'l', 'Liter', 'l', 'Liter' ); INSERT INTO units (unitShort, unitLong, unitPluShort, unitPluLong) VALUES ('kg', 'Kilogramm', 'kg', 'Kilogramm' ); INSERT INTO units (unitShort, unitLong, unitPluShort, unitPluLong) VALUES ('Stck.', 'Stueck', 'Stck.', 'Stück' ); INSERT INTO units (unitShort, unitLong, unitPluShort, unitPluLong) VALUES ('t', 'Tonne', 't', 'Tonnen' ); INSERT INTO units (unitShort, unitLong, unitPluShort, unitPluLong) VALUES ('pausch.', 'pauschal', 'pausch.', 'pauschal' ); INSERT INTO units (unitShort, unitLong, unitPluShort, unitPluLong) VALUES ('Std.', 'Stunde', 'Std.', 'Stunden' ); DELETE FROM stdSaetze; INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Geselle', 34.00, 1 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Meister', 39.00, 2 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Helfer', 30.00, 4 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Auszubildender', 21.00, 3 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Maschinenführer', 33.00, 5 ); DELETE FROM wordLists; INSERT INTO wordLists VALUES ('greeting', 'mit den besten Grüssen,' ); INSERT INTO wordLists VALUES ('greeting', 'liebe Grüsse,' ); INSERT INTO wordLists VALUES ('greeting', 'Hochachtungsvoll,' ); INSERT INTO wordLists VALUES ('greeting', 'mit freundlichem Gruß,' ); INSERT INTO wordLists VALUES ('salut', 'Sehr geehrter Herr %NAME,' ); INSERT INTO wordLists VALUES ('salut', 'Sehr geehrte Frau %NAME,' ); INSERT INTO wordLists VALUES ('salut', 'Sehr geehrte Frau %NAME, sehr geehrter Herr %NAME,' ); INSERT INTO wordLists VALUES ('salut', 'Lieber %GIVEN_NAME,' ); INSERT INTO wordLists VALUES ('salut', 'Liebe %GIVEN_NAME,' ); kraft-1.2.2/database/sqlite3/fill_schema_en.sql000066400000000000000000000102371467704360200214400ustar00rootroot00000000000000DELETE FROM preisArten; INSERT INTO preisArten VALUES (0, 'open'); INSERT INTO preisArten VALUES (1, 'manual'); INSERT INTO preisArten VALUES (2, 'calculated'); DELETE FROM CatalogSet; INSERT INTO CatalogSet (name, description, catalogType, sortKey) VALUES ( "Standard Templates", "A set of templates suitable for business", "TemplCatalog", 1 ); -- (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Templates") DELETE FROM CatalogChapters; INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Work', 1, (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Templates")); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Machine', 2, (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Templates")); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Material', 3, (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Templates")); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Service', 4, (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Templates")); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Transportation', 5, (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Templates")); INSERT INTO CatalogChapters (chapter, sortKey, catalogSetID) VALUES ('Misc', 6, (SELECT catalogSetID FROM CatalogSet WHERE name="Standard Templates")); INSERT INTO CatalogSet( name, description, catalogType, sortKey) VALUES ("Material", "Material Catalog to Use in Calculations in Templates", "MaterialCatalog", 2 ); -- (SELECT catalogSetID FROM CatalogSet WHERE name="Material") INSERT INTO CatalogChapters ( chapter, sortKey, catalogSetID ) VALUES ('Bulk Solids', 3, (SELECT catalogSetID FROM CatalogSet WHERE name="Material") ); INSERT INTO CatalogChapters ( chapter, sortKey, catalogSetID ) VALUES ('Stones', 2, (SELECT catalogSetID FROM CatalogSet WHERE name="Material")); INSERT INTO CatalogChapters ( chapter, sortKey, catalogSetID ) VALUES ('Concrete', 1, (SELECT catalogSetID FROM CatalogSet WHERE name="Material")); INSERT INTO CatalogChapters ( chapter, sortKey, catalogSetID ) VALUES ('Pipes', 4, (SELECT catalogSetID FROM CatalogSet WHERE name="Material")); INSERT INTO CatalogChapters ( chapter, sortKey, catalogSetID ) VALUES ('Wood', 5, (SELECT catalogSetID FROM CatalogSet WHERE name="Material")); INSERT INTO CatalogChapters ( chapter, sortKey, catalogSetID ) VALUES ('Art and Furnitures', 6, (SELECT catalogSetID FROM CatalogSet WHERE name="Material")); DELETE FROM units; INSERT INTO units VALUES (0, 'm', 'Meter', 'm', 'Meter' ); INSERT INTO units VALUES (1, 'sm', 'Squaremeter', 'qm', 'Squaremeter' ); INSERT INTO units VALUES (2, 'cbm', 'Cubikmeter', 'cbm', 'Cubikmeter' ); INSERT INTO units VALUES (3, 'Bag.', 'Bag', 'Bag', 'Bags' ); INSERT INTO units VALUES (4, 'l', 'Liter', 'l', 'Liter' ); INSERT INTO units VALUES (5, 'kg', 'Kilogramm', 'kg', 'Kilogramm' ); INSERT INTO units VALUES (6, 'Pcs.', 'Piece', 'Pcs.', 'Pieces' ); INSERT INTO units VALUES (7, 't', 'Ton', 't', 'Tons' ); INSERT INTO units VALUES (8, 'pausch.', 'pauschal', 'pausch.', 'pauschal' ); INSERT INTO units VALUES (9, 'Hour', 'Hour', 'Hours', 'Hours' ); DELETE FROM stdSaetze; INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Worker', 34.00, 1 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Master', 39.00, 2 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Assistant', 30.00, 4 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Trainee', 21.00, 3 ); INSERT INTO stdSaetze (name, price, sortKey) VALUES ('Machine Operator', 33.00, 5 ); DELETE FROM wordLists; INSERT INTO wordLists VALUES ('greeting', 'with kind regards,' ); INSERT INTO wordLists VALUES ('greeting', 'with best regards,' ); INSERT INTO wordLists VALUES ('greeting', 'yours faithfully,' ); INSERT INTO wordLists VALUES ('greeting', 'goodbye and thanks for the fish,' ); INSERT INTO wordLists VALUES ('greeting', 'goodbye' ); INSERT INTO wordLists VALUES ('salut', 'Dear Mr. %NAME' ); INSERT INTO wordLists VALUES ('salut', 'Dear Mrs. %NAME' ); INSERT INTO wordLists VALUES ('salut', 'Dear Mrs. %NAME, dear Mr. %NAME' ); INSERT INTO wordLists VALUES ('salut', 'Dear %GIVEN_NAME' ); kraft-1.2.2/database/sqlite3/migration/000077500000000000000000000000001467704360200177555ustar00rootroot00000000000000kraft-1.2.2/database/sqlite3/migration/10_dbmigrate.sql000066400000000000000000000050431467704360200227360ustar00rootroot00000000000000-- 5_dbmigrate.sql -- message Add a list value identification column to the attribute table --ALTER TABLE attributes ADD COLUMN valueIsList tinyint default 0; -- AFTER value; DROP TABLE IF EXISTS tmp_attrib; CREATE TABLE tmp_attrib ( id INTEGER PRIMARY KEY ASC autoincrement, hostObject VARCHAR(64), hostId INT, name VARCHAR(64), value MEDIUMTEXT, valueIsList TINYINT ); -- CREATE UNIQUE INDEX tmpIndx_10 ON tmp_attrib( hostObject, hostId, name ); INSERT INTO tmp_attrib (hostObject, hostId, name, value, valueIsList) SELECT hostObject, hostId, name, value, 0 FROM attributes; -- message Create an attribute value table CREATE TABLE IF NOT EXISTS attributeValues ( id INTEGER PRIMARY KEY ASC autoincrement, attributeId INT NOT NULL, value VARCHAR(255) ); CREATE INDEX attribValueIndx_10 ON attributeValues( attributeId ); -- message copy the attribute values over to the new attribute value table INSERT INTO attributeValues (attributeId, value) SELECT id, value FROM tmp_attrib WHERE value is not null; -- message drop the attrib column -- ALTER TABLE tmp_attrib DROP COLUMN value; -- DROP TABLE attributes; ALTER TABLE attributes RENAME TO attributes_unused; CREATE TABLE attributes ( id INTEGER PRIMARY KEY ASC autoincrement, hostObject VARCHAR(64), hostId INT, name VARCHAR(64), valueIsList TINYINT, relationTable varchar(64) default NULL, relationIDColumn varchar(64) default NULL, relationStringColumn varchar(64) default NULL ); CREATE UNIQUE INDEX attribIndx_10 ON attributes( hostObject, hostId, name ); INSERT INTO attributes (hostObject, hostId, name, valueIsList) SELECT hostObject, hostId, name, valueIsList FROM tmp_attrib; -- message create a table to keep tag templates CREATE TABLE IF NOT EXISTS tagTemplates ( tagTmplID INTEGER PRIMARY KEY ASC autoincrement, sortkey int NOT NULL, name varchar(255) default NULL, description varchar(255) default NULL, color char(7) default NULL ); INSERT INTO tagTemplates (sortkey, name, description, color) VALUES (3, 'Discount', 'Marks items to give discount on', '#ff1c1c' ); INSERT INTO tagTemplates (sortkey, name, description, color) VALUES (1, 'Material', 'Marks material', '#4e4e4e' ); INSERT INTO tagTemplates (sortkey, name, description, color) VALUES (2, 'Work', 'Marks working hour items', '#ffbb39' ); INSERT INTO tagTemplates (sortkey, name, description, color) VALUES (4, 'Plants', 'Marks plant items', '#26b913' ); DROP TABLE IF EXISTS tmp_attrib; DROP TABLE IF EXISTS attributes_unused; kraft-1.2.2/database/sqlite3/migration/11_dbmigrate.sql000066400000000000000000000006671467704360200227460ustar00rootroot00000000000000-- Columns already added in 5_dbmigrate.sql *sqlite workaround* -- message Adding relation table information to attribute table --ALTER TABLE attributes ADD COLUMN relationTable varchar(64) default NULL -- AFTER valueIsList; --ALTER TABLE attributes ADD COLUMN relationIDColumn varchar(64) default NULL; -- AFTER relationTable; --ALTER TABLE attributes ADD COLUMN relationStringColumn varchar(64) default NULL; -- AFTER relationIDColumn;kraft-1.2.2/database/sqlite3/migration/12_dbmigrate.sql000066400000000000000000000007011467704360200227340ustar00rootroot00000000000000CREATE TABLE numberCycles ( id INTEGER PRIMARY KEY ASC autoincrement, name VARCHAR(64) NOT NULL, lastIdentNumber INT NOT NULL, identTemplate VARCHAR(64) NOT NULL ); CREATE UNIQUE INDEX numCycleIdx_12 ON numberCycles( name ); INSERT INTO numberCycles (name, lastIdentNumber, identTemplate) VALUES ("default", (SELECT ifnull( 1+MAX(docID), 1 ) FROM document), '%i-%yyyy' ); kraft-1.2.2/database/sqlite3/migration/13_dbmigrate.sql000066400000000000000000000002571467704360200227430ustar00rootroot00000000000000--Column already added in create_schema.sql *Sqlite workaround* -- message Adding a taxType column --ALTER TABLE docposition ADD COLUMN taxType int default 3; -- AFTER price; kraft-1.2.2/database/sqlite3/migration/14_dbmigrate.sql000066400000000000000000000005531467704360200227430ustar00rootroot00000000000000-- message Add tax table CREATE TABLE taxes ( id INTEGER PRIMARY KEY ASC autoincrement, fullTax DECIMAL(5,1), reducedTax DECIMAL(5,1), startDate DATE ); INSERT INTO taxes ( fullTax, reducedTax, startDate ) VALUES (16.0, 7.0, '1998-04-01' ); INSERT INTO taxes ( fullTax, reducedTax, startDate ) VALUES (19.0, 7.0, '2007-01-01' ); kraft-1.2.2/database/sqlite3/migration/15_dbmigrate.sql000066400000000000000000000007451467704360200227470ustar00rootroot00000000000000-- message Add project label and tax to archive --ALTER TABLE document ADD COLUMN projectLabel VARCHAR(255); -- AFTER language; --ALTER TABLE archdoc ADD COLUMN projectLabel VARCHAR(255); -- AFTER language; --ALTER TABLE archdoc ADD COLUMN tax DECIMAL(5,1); -- AFTER projectLabel; --ALTER TABLE archdoc ADD COLUMN reducedTax DECIMAL(5,1); -- AFTER tax; -- ALTER TABLE archdocpos DROP COLUMN vat; --ALTER TABLE archdocpos ADD COLUMN taxType INT DEFAULT 0; -- AFTER overallPrice; kraft-1.2.2/database/sqlite3/migration/16_dbmigrate.sql000066400000000000000000000012561467704360200227460ustar00rootroot00000000000000ALTER TABLE CalcMaterials RENAME TO CalcMaterialsOld; CREATE TABLE CalcMaterials ( MCalcID INTEGER PRIMARY KEY ASC autoincrement, TemplID INT NOT NULL, materialID INT NOT NULL, percent INT DEFAULT 0, amount DECIMAL(10,2), modDate TIMESTAMP(14) ); INSERT INTO CalcMaterials (TemplID, materialID, amount, percent, modDate) SELECT CalcMaterialsOld.TemplID, CalcMaterialDetails.materialID, CalcMaterialDetails.amount, CalcMaterialsOld.percent, CalcMaterialsOld.modDate FROM CalcMaterialDetails INNER JOIN CalcMaterialsOld ON CalcMaterialDetails.CalcID=CalcMaterialsOld.MCalcID; DROP TABLE IF EXISTS CalcMaterialsOld; DROP TABLE IF EXISTS CalcMaterialDetails;kraft-1.2.2/database/sqlite3/migration/17_dbmigrate.sql000066400000000000000000000002011467704360200227340ustar00rootroot00000000000000ALTER TABLE CatalogChapters ADD COLUMN parentChapter int(11) default 0; ALTER TABLE CatalogChapters ADD COLUMN description text; kraft-1.2.2/database/sqlite3/migration/18_dbmigrate.sql000066400000000000000000000002431467704360200227430ustar00rootroot00000000000000 ALTER TABLE Catalog ADD COLUMN sortKey INT default 0; ALTER TABLE Catalog ADD COLUMN lastUsed DATETIME; ALTER TABLE Catalog ADD COLUMN useCounter INT default 0; kraft-1.2.2/database/sqlite3/migration/19_dbmigrate.sql000066400000000000000000000024661467704360200227550ustar00rootroot00000000000000 # message Create new document type delivery note INSERT INTO DocTypes (name) VALUES ('Lieferschein'); INSERT INTO attributes (hostObject, hostId, name, valueIsList) VALUES ('DocType', (SELECT docTypeID FROM DocTypes WHERE name='Lieferschein'), 'HidePrices', 'true'); INSERT INTO DocTypes (name) VALUES ('Delivery Receipt'); INSERT INTO attributes (hostObject, hostId, name, valueIsList) VALUES ('DocType', (SELECT docTypeID FROM DocTypes WHERE name='Delivery Receipt'), 'HidePrices', 'true'); # Delivery Receipt follows Offer # mayfail # message Add more document relation settings INSERT INTO DocTypeRelations VALUES( (SELECT docTypeID FROM DocTypes WHERE name="Offer"), (SELECT docTypeID FROM DocTypes WHERE name="Delivery Receipt"), 12 ); # mayfail INSERT INTO DocTypeRelations VALUES( (SELECT docTypeID FROM DocTypes WHERE name="Delivery Receipt"), (SELECT docTypeID FROM DocTypes WHERE name="Invoice"), 13 ); # Lieferschein follows Angebot # mayfail INSERT INTO DocTypeRelations VALUES( (SELECT docTypeID FROM DocTypes WHERE name="Angebot"), (SELECT docTypeID FROM DocTypes WHERE name="Lieferschein"), 10 ); # Rechnung follows Lieferschein # mayfail INSERT INTO DocTypeRelations VALUES( (SELECT docTypeID FROM DocTypes WHERE name="Lieferschein"), (SELECT docTypeID FROM DocTypes WHERE name="Rechnung"), 11 ); # Done. kraft-1.2.2/database/sqlite3/migration/20_dbmigrate.sql000066400000000000000000000004021467704360200227310ustar00rootroot00000000000000 ALTER TABLE CalcTime ADD COLUMN timeUnit INT default 0; -- Add a unit id ALTER TABLE DocCalcTime ADD COLUMN timeUnit INT default 0; -- Add a unit id UPDATE CalcTime set timeUnit=0; -- Update existing CalcTime entries. UPDATE DocCalcTime set timeUnit=0; kraft-1.2.2/database/sqlite3/migration/21_dbmigrate.sql000066400000000000000000000002471467704360200227410ustar00rootroot00000000000000--- Add a column predecessor to the document table ALTER TABLE document ADD COLUMN predecessor VARCHAR(32); ALTER TABLE archdoc ADD COLUMN predecessor VARCHAR(32); kraft-1.2.2/database/sqlite3/migration/22_dbmigrate.sql000066400000000000000000000002551467704360200227410ustar00rootroot00000000000000 INSERT INTO taxes (fullTax, reducedTax, startDate) VALUES (16.0, 5.0, '2020-07-01'); INSERT INTO taxes (fullTax, reducedTax, startDate) VALUES (19.0, 7.0, '2021-01-01'); kraft-1.2.2/database/sqlite3/migration/23_dbmigrate.sql000066400000000000000000000007141467704360200227420ustar00rootroot00000000000000ALTER TABLE stockMaterial ADD COLUMN sortKey INT default 0; CREATE TABLE catItemUsage ( catId INT NOT NULL, itemId INT NOT NULL, usageCount INT default 0, lastUsed DATETIME, PRIMARY KEY(catId, itemId) ); -- These statements are only supported starting from 3.35 -- https://sqlite.org/changes.html#version_3_35_0 -- rather disabled for now for robustness -- ALTER TABLE Catalog DROP COLUMN lastUsed; -- ALTER TABLE Catalog DROP COLUMN useCounter; kraft-1.2.2/database/sqlite3/migration/24_dbmigrate.sql000066400000000000000000000011721467704360200227420ustar00rootroot00000000000000 ALTER TABLE units ADD COLUMN ec20 VARCHAR(10); UPDATE units set ec20 = "MTR" WHERE unitShort = "m"; UPDATE units set ec20 = "MTK" WHERE unitShort = "qm" or unitShort = "sm"; UPDATE units set ec20 = "MTQ" WHERE unitShort = "cbm"; UPDATE units set ec20 = "XSA" WHERE unitLong = "Sack" or unitLong = "Bag"; UPDATE units set ec20 = "LTR" WHERE unitLong = "Liter"; UPDATE units set ec20 = "KGM" WHERE unitLong = "Kilogramm"; UPDATE units set ec20 = "XPP" WHERE unitShort = "Stck." or unitShort ="Pcs."; UPDATE units set ec20 = "TNE" WHERE unitShort = "t"; UPDATE units set ec20 = "HUR" WHERE unitLong = "Stunde" or unitLong ="Hour"; kraft-1.2.2/database/sqlite3/migration/2_dbmigrate.sql000066400000000000000000000034041467704360200226560ustar00rootroot00000000000000-- message: Creating document position calulation tables ; CREATE TABLE DocCalcTime ( TCalcID INTEGER PRIMARY KEY ASC autoincrement, TemplID INT NOT NULL, name VARCHAR(255), minutes INT default 0, percent INT default 0, stdHourSet INT default 0, allowGlobal INT default 1, modDate TIMESTAMP(14) ); CREATE INDEX calcTimeTemplIndx_2 ON DocCalcTime( TemplID ); CREATE TRIGGER update_docCalcTime_modDate AFTER UPDATE ON DocCalcTime BEGIN UPDATE DocCalcTime SET modDate = DATETIME('NOW') WHERE TCalcID = new.TCalcID; END; CREATE TABLE DocCalcFixed( FCalcID INTEGER PRIMARY KEY ASC autoincrement, TemplID INT NOT NULL, name VARCHAR(255), amount DECIMAL(10,2) default 1.0, price DECIMAL(10,2), percent INT default 0, modDate TIMESTAMP(14) ); CREATE INDEX CalcFixedTemplIndx_2 ON DocCalcFixed( TemplID ); CREATE TRIGGER update_docCalcFixed_modDate AFTER UPDATE ON DocCalcFixed BEGIN UPDATE DocCalcFixed SET modDate = DATETIME('NOW') WHERE FCalcID = new.FCalcID; END; CREATE TABLE DocCalcMaterials( MCalcID INTEGER PRIMARY KEY ASC autoincrement, TemplID INT NOT NULL, name VARCHAR(255), percent INT default 0, modDate TIMESTAMP(14) ); CREATE INDEX CalcMaterialTemplIndx_2 ON DocCalcMaterials( TemplID ); CREATE TRIGGER update_docCalcMaterials_modDate AFTER UPDATE ON DocCalcMaterials BEGIN UPDATE DocCalcMaterials SET modDate = DATETIME('NOW') WHERE MCalcID = new.MCalcID; END; CREATE TABLE DocCalcMaterialDetails( MCalcDetailID INTEGER PRIMARY KEY ASC autoincrement, CalcID INT NOT NULL, materialID INT NOT NULL, amount DECIMAL(10,2) ); CREATE INDEX CalcMaterialDetailsCalcIDIndx_2 ON DocCalcMaterialDetails( CalcID ); kraft-1.2.2/database/sqlite3/migration/3_dbmigrate.sql000066400000000000000000000007541467704360200226640ustar00rootroot00000000000000-- message Add plant Prices table CREATE TABLE plantPrices ( matchCode VARCHAR(255), price DECIMAL(8,2), lastUpdate TIMESTAMP, PRIMARY KEY( matchCode ) ); CREATE TRIGGER update_plantPrices AFTER UPDATE ON plantPrices BEGIN UPDATE plantPrices SET lastUpdate = DATETIME('NOW') WHERE matchCode = new.matchCode; END; -- Columns already added in create_schema.sql *sqlite workaround* --ALTER TABLE document ADD COLUMN docDescription TEXT AFTER docType; kraft-1.2.2/database/sqlite3/migration/4_dbmigrate.sql000066400000000000000000000103421467704360200226570ustar00rootroot00000000000000-- message Create DocTexts table CREATE TABLE DocTexts ( docTextID INTEGER PRIMARY KEY ASC autoincrement, name VARCHAR(64), description TEXT, text TEXT, docType VARCHAR( 64 ), docTypeId int, textType VARCHAR( 64 ), modDate TIMESTAMP(14) -- INDEX( docType, textType ) ); CREATE INDEX DocTextsIndx_4 ON DocTexts (docType, textType); CREATE TRIGGER update_docTexts AFTER UPDATE ON DocTexts BEGIN UPDATE DocTexts SET modDate = DATETIME('NOW') WHERE docTextID = new.docTextID; END; INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Offer', 'Header Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Offer', 'Footer Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Invoice', 'Header Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Invoice', 'Footer Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Acceptance of Order', 'Header Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Acceptance of Order', 'Footer Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Angebot', 'Kopf Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Angebot', 'Fuß Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Rechnung', 'Kopf Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Rechnung', 'Fuß Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Auftragsbestätigung', 'Kopf Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) VALUES ( 'Standard', 'Please edit me - Bitte passe mich an!', 'Auftragsbestätigung', 'Fuß Text' ); INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Offer', 'Footer Text' FROM wordLists WHERE category='docFooter_Offer'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Offer', 'Header Text' FROM wordLists WHERE category='docHeader_Offer'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Invoice', 'Footer Text' FROM wordLists WHERE category='docFooter_Invoice'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Invoice', 'Header Text' FROM wordLists WHERE category='docHeader_Invoice'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Acceptance of Order', 'Footer Text' FROM wordLists WHERE category='docFooter_Acceptance of Order'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Acceptance of Order', 'Header Text' FROM wordLists WHERE category='docHeader_Acceptance of Order'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Angebot', 'Fuß Text' FROM wordLists WHERE category='docFooter_Angebot'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Angebot', 'Kopf Text' FROM wordLists WHERE category='docHeader_Angebot'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Rechnung', 'Fuß Text' FROM wordLists WHERE category='docFooter_Rechnung'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Rechnung', 'Kopf Text' FROM wordLists WHERE category='docHeader_Rechnung'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Auftragsbestätigung', 'Fuß Text' FROM wordLists WHERE category='docFooter_Auftragsbestätigung'; INSERT INTO DocTexts ( name, text, docType, textType ) SELECT 'Standard', word, 'Auftragsbestätigung', 'Kopf Text' FROM wordLists WHERE category='docHeader_Auftragsbestätigung'; kraft-1.2.2/database/sqlite3/migration/5_dbmigrate.sql000066400000000000000000000060371467704360200226660ustar00rootroot00000000000000-- message Creating attributes table... CREATE TABLE attributes ( hostObject VARCHAR(64), hostId INT NOT NULL, name VARCHAR(64), value MEDIUMTEXT, valueIsList tinyint default 0, relationTable VARCHAR(64) default NULL, relationIDColumn VARCHAR(64) default NULL, relationStringColumn VARCHAR(64) default NULL, PRIMARY KEY( hostObject, hostId, name ) ); -- message Creating attributes for archived documents CREATE TABLE archPosAttribs ( archPosAttribId INTEGER PRIMARY KEY ASC autoincrement, archDocID INT NOT NULL, name VARCHAR(64), value VARCHAR(64) ); -- Columns already added in create_schema.sql *sqlite workaround* -- message Adding position type and overall price ot archdocpositions --ALTER TABLE archdocpos ADD COLUMN kind VARCHAR(64); -- AFTER ordNumber; --ALTER TABLE archdocpos ADD COLUMN overallPrice DECIMAL(10,2); -- AFTER price; -- message Changing old kinds to Normal UPDATE archdocpos SET kind = "Normal"; -- message Calculating archive position price UPDATE archdocpos SET overallPrice = ROUND( price * amount, 2); -- message Creating Document Type table CREATE TABLE DocTypes ( docTypeID INTEGER PRIMARY KEY ASC autoincrement, name VARCHAR(255) ); -- message Filling doc type attributes INSERT INTO DocTypes (name) VALUES ( 'Offer' ); INSERT INTO attributes (hostObject, hostId, name, value) VALUES ('DocType', (SELECT docTypeID FROM DocTypes WHERE name="Offer"), 'AllowDemand', 'true'); INSERT INTO attributes (hostObject, hostId, name, value) VALUES ('DocType', (SELECT docTypeID FROM DocTypes WHERE name="Offer"), 'AllowAlternative', 'true'); INSERT INTO DocTypes (name) VALUES ( 'Acceptance of Order' ); INSERT INTO attributes (hostObject, hostId, name, value) VALUES ('DocType', (SELECT docTypeID FROM DocTypes WHERE name="Acceptance of Order"), 'AllowDemand', 'true'); INSERT INTO attributes (hostObject, hostId, name, value) VALUES ('DocType', (SELECT docTypeID FROM DocTypes WHERE name="Acceptance of Order"), 'AllowAlternative', 'true'); INSERT INTO DocTypes (name) VALUES ( 'Invoice' ); -- message Filling doc type attributes INSERT INTO DocTypes (name) VALUES ( 'Angebot' ); INSERT INTO attributes (hostObject, hostId, name, value) VALUES ('DocType', (SELECT docTypeID FROM DocTypes WHERE name="Angebot"), 'AllowDemand', 'true'); INSERT INTO attributes (hostObject, hostId, name, value) VALUES ('DocType', (SELECT docTypeID FROM DocTypes WHERE name="Angebot"), 'AllowAlternative', 'true'); INSERT INTO DocTypes (name) VALUES ( 'Auftragsbestätigung' ); INSERT INTO attributes (hostObject, hostId, name, value) VALUES ('DocType', (SELECT docTypeID FROM DocTypes WHERE name="Auftragsbestätigung"), 'AllowDemand', 'true'); INSERT INTO attributes (hostObject, hostId, name, value) VALUES ('DocType', (SELECT docTypeID FROM DocTypes WHERE name="Auftragsbestätigung"), 'AllowAlternative', 'true'); INSERT INTO DocTypes (name) VALUES ( 'Rechnung' ); -- message Drop an unused table archdocStates DROP TABLE IF EXISTS archdocStates; kraft-1.2.2/database/sqlite3/migration/6_dbmigrate.sql000066400000000000000000000004771467704360200226710ustar00rootroot00000000000000-- message Localisation information on document level --ALTER TABLE document ADD country VARCHAR(32); -- AFTER posttext; --ALTER TABLE document ADD language VARCHAR(32);-- AFTER country; --ALTER TABLE archdoc ADD country VARCHAR(32);-- AFTER posttext; --ALTER TABLE archdoc ADD language VARCHAR(32);-- AFTER country; kraft-1.2.2/database/sqlite3/migration/7_dbmigrate.sql000066400000000000000000000002141467704360200226570ustar00rootroot00000000000000-- Columns already added in create_schema.sql *sqlite workaround* -- ALTER TABLE archdoc ADD clientUid VARCHAR(32);-- AFTER clientAddress;kraft-1.2.2/database/sqlite3/migration/8_dbmigrate.sql000066400000000000000000000053051467704360200226660ustar00rootroot00000000000000-- message Create Document Relations Table CREATE TABLE DocTypeRelations ( typeId INT NOT NULL, followerId INT NOT NULL, sequence INT NOT NULL, PRIMARY KEY( typeId, followerId ) ); -- Acceptance of Order follows Offer -- SELECT @item := docTypeID FROM DocTypes WHERE name="Offer"; -- SELECT @follower := docTypeID FROM DocTypes WHERE name="Acceptance of Order"; INSERT INTO DocTypeRelations VALUES( (SELECT docTypeID FROM DocTypes WHERE name="Offer"), (SELECT docTypeID FROM DocTypes WHERE name="Acceptance of Order"), 1 ); -- Invoice follorws Offer -- SELECT @item := docTypeID FROM DocTypes WHERE name="Offer"; -- SELECT @follower := docTypeID FROM DocTypes WHERE name="Invoice"; -- INSERT INTO DocTypeRelations VALUES( @item, @follower, 2 ); INSERT INTO DocTypeRelations VALUES( (SELECT docTypeID FROM DocTypes WHERE name="Offer"), (SELECT docTypeID FROM DocTypes WHERE name="Invoice"), 2 ); -- Invoice follows Acceptance of Order -- SELECT @item := docTypeID FROM DocTypes WHERE name="Acceptance of Order"; -- SELECT @follower := docTypeID FROM DocTypes WHERE name="Invoice"; -- INSERT INTO DocTypeRelations VALUES( @item, @follower, 3 ); INSERT INTO DocTypeRelations VALUES( (SELECT docTypeID FROM DocTypes WHERE name="Acceptance of Order"), (SELECT docTypeID FROM DocTypes WHERE name="Invoice"), 3 ); -- Acceptance of Order follows Offer -- SELECT @item := docTypeID FROM DocTypes WHERE name="Angebot"; -- SELECT @follower := docTypeID FROM DocTypes WHERE name="Auftragsbestätigung"; -- INSERT INTO DocTypeRelations VALUES( @item, @follower, 4 ); INSERT INTO DocTypeRelations VALUES( (SELECT docTypeID FROM DocTypes WHERE name="Angebot"), (SELECT docTypeID FROM DocTypes WHERE name="Auftragsbestätigung"), 4 ); -- Invoice follorws Offer -- SELECT @item := docTypeID FROM DocTypes WHERE name="Angebot"; -- SELECT @follower := docTypeID FROM DocTypes WHERE name="Rechnung"; -- INSERT INTO DocTypeRelations VALUES( @item, @follower, 5 ); INSERT INTO DocTypeRelations VALUES( (SELECT docTypeID FROM DocTypes WHERE name="Angebot"), (SELECT docTypeID FROM DocTypes WHERE name="Rechnung"), 5 ); -- Invoice follows Acceptance of Order -- SELECT @item := docTypeID FROM DocTypes WHERE name like "Auftragsbest%"; -- SELECT @follower := docTypeID FROM DocTypes WHERE name="Rechnung"; -- INSERT INTO DocTypeRelations VALUES( @item, @follower, 6 ); INSERT INTO DocTypeRelations VALUES( (SELECT docTypeID FROM DocTypes WHERE name="Auftragsbestätigung"), (SELECT docTypeID FROM DocTypes WHERE name="Rechnung"), 6 ); kraft-1.2.2/database/sqlite3/migration/9_dbmigrate.sql000066400000000000000000000012071467704360200226640ustar00rootroot00000000000000-- Columns already added in 4_dbmigrate.sql *sqlite workaround* -- message add a document type id to text table --alter table DocTexts add column docTypeId int; -- AFTER docType; -- message populate the doc type id column in docTexts update DocTexts set docTypeId=(SELECT docTypeID FROM DocTypes WHERE name=docType); -- Columns already added in create_schema.sql *sqlite workaround* -- message create a type column for the docposition --alter table docposition add column postype VARCHAR(64); -- AFTER text; -- message create type column for the archdocpos table --alter table archdocpos add column postype VARCHAR(64); -- AFTER kind; kraft-1.2.2/database/sqlite3/migration/CMakeLists.txt000066400000000000000000000002531467704360200225150ustar00rootroot00000000000000########### install files ############### file(GLOB mig_scripts *_dbmigrate.sql) install(FILES ${mig_scripts} DESTINATION ${DATA_INSTALL_DIR}/kraft/dbmigrate/sqlite3) kraft-1.2.2/database/sqlite3/migration/README000066400000000000000000000014731467704360200206420ustar00rootroot00000000000000Kraft Database Migration ======================== The Kraft database schema might change over the time. To achieve that smoothly for the users, here is a database migration system. Every version of Kraft has a hardcoded version of the required database schema version. In the Kraft database there is a system table that carries the version of the current running database schema. In case the current database version is lower than the required, Kraft looks in this migration directory if there is a script starting with the number "current version +1". If found, Kraft executes the sql commands contained in the file. After all are finished, the version in the database system table is updated. Note that the migration file my contain lines like -- message: bla bla Kraft shows the message lines in the status line. kraft-1.2.2/importfilter/000077500000000000000000000000001467704360200153545ustar00rootroot00000000000000kraft-1.2.2/importfilter/CMakeLists.txt000066400000000000000000000002321467704360200201110ustar00rootroot00000000000000########### install files ############### install(FILES woerlein_txt.ftr standard_txt.ftr DESTINATION ${DATA_INSTALL_DIR}/kraft/importfilter/positions/) kraft-1.2.2/importfilter/standard_txt.ftr000066400000000000000000000003321467704360200205660ustar00rootroot00000000000000AMOUNT: COL(1) UNIT: COL(2) TEXT: COL(3) UNIT_PRICE: COL(4) NAME: Standard Import DESCRIPTION: Simple Standard Importfilter for four columns:
Amount, Unit, Text, Single Price ENCODING: windows-1250 SEPARATOR: ; kraft-1.2.2/importfilter/woerlein_txt.ftr000066400000000000000000000005401467704360200206130ustar00rootroot00000000000000AMOUNT: COL(1) TEXT: COL(2) - COL(3)
COL(4), COL(5) cm
Rabatt: COL(7)% # TEXT: "%s - %s\n%s, %s\n%s", COL(2), COL(3), COL(4), COL(5), COL(7) UNIT: Stck. UNIT_PRICE: COL(6) NAME: Wörlein Pflanzenkatalog Export DESCRIPTION: Importfilter for CSV exported Wörlein Pflanzenkatalog documents ENCODING: windows-1250 SEPARATOR: ; TAGS: plants kraft-1.2.2/manual/000077500000000000000000000000001467704360200141115ustar00rootroot00000000000000kraft-1.2.2/manual/CMakeLists.txt000066400000000000000000000021131467704360200166460ustar00rootroot00000000000000 FIND_PACKAGE(Asciidoctor) SET (install_files kraft-en.html kraft-de.html) if (ASCIIDOCTOR_FOUND) SET( manual_src ${PROJECT_SOURCE_DIR}/manual/kraft.adoc ) SET( out_file kraft-en.html ) ADD_CUSTOM_COMMAND( OUTPUT "${out_file}" COMMAND "${PROJECT_SOURCE_DIR}/manual/makeman.sh" ARGS "${PROJECT_SOURCE_DIR}/manual" DEPENDS ${manual_src} COMMENT "Make the manual" ) message( "Asciidoctor found") ADD_CUSTOM_TARGET(manual ALL echo DEPENDS "${out_file}" ) INSTALL(FILES ${CMAKE_BINARY_DIR}/manual/kraft-en.html ${CMAKE_BINARY_DIR}/manual/kraft-de.html ${CMAKE_BINARY_DIR}/manual/kraft-nl.html DESTINATION ${DATA_INSTALL_DIR}/kraft/manual) else(ASCIIDOCTOR_FOUND) # Maybe there are preinstalled html files in the tarball message("Asciidoctor not found, installing pre built manual.") install(FILES "kraft-de.html" "kraft-en.html" DESTINATION ${DATA_INSTALL_DIR}/kraft/manual) endif(ASCIIDOCTOR_FOUND) INSTALL(FILES kraftmanual.css DESTINATION ${DATA_INSTALL_DIR}/kraft/manual) INSTALL(DIRECTORY images DESTINATION ${DATA_INSTALL_DIR}/kraft/manual) kraft-1.2.2/manual/Readme.md000066400000000000000000000047631467704360200156420ustar00rootroot00000000000000## How to Contribute There are two ways to contribute to the user manual of Kraft. ### Work on the English Manual Just improve the English Manual that is stored in the file `kraft.adoc` in this directory. With that you can concentrate on writing and do not deal with scripting etc. Content rules! Please send your changes either as pull request, or via email to the project maintainers. They will care for the rest. Every change that is done to the master document in English language will be translated to all the other internationalized versions of the doc. ### Translate The translations of Kraft will be maintained on Transifex, just like the normal software strings. Check there for translation tasks. ## Internationalization of the Manual This is based on the great [doc here](https://github.com/KiCad/kicad-doc/blob/master/doc_alternatives/README.adoc). The process of internationalization of the Kraft Manual is done in different steps. It relies on the the same gettext process that is also used for the normal software strings. To extract the strings from the manual, the great utility po4a is used. ### Step 1: String Template Extraction This is extracting strings ready for the gettext system. This needs only to be done once. Later, the pot file is only going to be updated. ``` po4a-gettextize -f asciidoc -M utf-8 -m kraft.adoc -p po/kraft.pot ``` The update works with the command msgmerge: ``` msgmerge -vU kraft-de.po kraft.pot ``` ### Step 2: Translation Copy the template into the nationalized version: `cp po/kraft.pot po/kraft-de.po` and use the gettext editor you like or upload to Transifex. Keep in mind that snapshots images should be nationalized. I suggest to create a internationalized image dirs such as: ``` images images-de images-es ``` This way untranslated images fallback to English images. po4a correctly translate image reference to enable the fallback. ### Step 3: Produce Internationalized Master Documents ``` po4a-translate -f asciidoc -M utf-8 -m kraft.adoc -p po/kraft-de.po -k 0 -l kraft-de.adoc ``` ### Step 4: Produce all Kind of Internationalized Output Formats ``` asciidoc -a lang=de kraft-de.adoc #convert into html a2x -a lang=de -f pdf kraft-de.adoc #convert into pdf a2x -a lang=de -f epub kraft-de.adoc #convert into epub ``` ### Step 5: Update Translations With the following command the .po file will be updated automatically. ``` po4a-updatepo -M utf8 -f asciidoc -m kraft.adoc -p po/kraft-de.po ``` ### Step 6: Loop repeat from step 2 kraft-1.2.2/manual/checkimg.pl000077500000000000000000000012201467704360200162160ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; die "Usage: $0 FILENAMEs\n" if not @ARGV; foreach my $file (@ARGV) { open my $fh, '<:encoding(UTF-8)', $file or die; while (my $line = <$fh>) { if ($line =~ /image\:(.+)\[/) { my $img = $1; my @langs = ("en", "de", "nl"); my $res = sprintf "Image %-40s: ", $img; foreach my $l (@langs) { my $f = "./images/$l/$img"; if (-e $f) { $res .= "$l ok\t"; } else { $res .= "$l FAIL\t"; } } print "$res\n"; } } } kraft-1.2.2/manual/images/000077500000000000000000000000001467704360200153565ustar00rootroot00000000000000kraft-1.2.2/manual/images/de/000077500000000000000000000000001467704360200157465ustar00rootroot00000000000000kraft-1.2.2/manual/images/de/acceptance_o_o_context.png000066400000000000000000005276151467704360200231620ustar00rootroot00000000000000PNG  IHDRU(  pHYs+ IDATx^wxEwv%AH" " vERH"PT@ԠNHB _ٝ˅˥yld({Q .=zƠLDDDDDDA 2͇~Q*c☘Ӊ3(}M+s >-,,gnEQbCcbbD~A8%%%r"""""""w[l3H{R\A5{=;$qFFHWQbbb~~~ñ+,{ Ǿ\A9::ZlٲE;zf""""""r@@<+4kN/!ؗX=zl٢ZjbZl6 9m>d`6=d@@>^"\{M&zEOq8B4/KAYNDDDDDDW<+8hUUezzTUU VUY.lIv=:,,L9uj6Uժff)~~~B4iu]fz[(J(jJEQRUU!M&nZu٬pB<{m6AUU533S5PL&ueX01L ]Q(lRQi0t]5+\A@= FEQTM(4MS Rfc]Ff|rGDDDDDDW'!j\*w(BH!R4]U,tF $vfML&` i"zoDU<=?]]r ʚyLwY4`0hRJ CuiBew_,TO¢0jRi(늪BJ)t]W\`0&"""""kw`vp8vt]םRUUդp8F1SӴBe _-TO7kf"-,TB """"""B 88nkXܛs ʊݓ _eZUUU!A40mHO<  DDDDDDT줔HJJ?|$8i&!AUUj*J``dddѮ#8<Pdd$N:%???bEQTUU RJS9gH&""""""*I㯿BUU6atf μ[V#Gj=.=KNIIf .l)K)JJŋ)p=KQh4*6Mq8n &RSSE.>G9##CdddPMӄZRRYð`H P$tD *0[#""""""AJ !p8T]]???.t]oOwpvMWHOO*BQ`p>P~FGn˄ jt;F6DRKGpM!u0ڑ DDDDDDD>iiKE !jCX,lB]4YF Á4^|^&00P MӄBJ)4MSEu} vSvw2́5g_ ]<ƕI+s yq8!Yua0{^4 8SWA=C7i:;IT8R '"""""띮는R 윪iZjzܧߣ]ׅ(KPDPk@zCaz 52?PCG>t(Xj5d"'""""")!\ y)PPjz|lpvug/F4dpc%+f!,~.E_VY yl ŨA(:0=)>tý(B`ʯxG/_~9jujՄhľ EfБE>I) "t]|5{|le 8" ƀKiHiФ XefKaEjJ"ԪGQ1(nt:]BB_۫{J7QaM"쟃1)"w?_5Fj޳F77@xO.2шq#F77d4z$,d=.6Mdh < !_A١&|=+ ]OLj:L d&) PNG-8HBoav.Be~"ODDIQ[Z,f{VXsł o84zt؍'NiDDtu˯7֥j)ƾ:xQxY1a6cn:Fb􈡘6cn璕E3e_ B N6`P@hT&BC(B?` BjٜaXH8%wf?E:׫GH_Ʋ_ODDT FGcɊ/AOc߾htMh6"8x|Z`|C8|8y&'NBиQC<,^n:}c<޻ϻWv aYE2i`Cna޻g^'\Y ~װR䠬iPUB.=ʊɁXT >pMͱ[Sz9XKh*""*!B<|0SK<9ే{5Oaa4,ު9;^c|F@J4 ~-]3ƺWv KJ`xe x͙^`ip~iT –*] \ Y`<3$QiθA}&h>F/?xk7|Դtvg`}HNIQR%H)G?|I5]. NDDX|]=zr>\ .;((`Af7! )T.۝ H)!5@wxN/ ua;`V}%LDD%JQlg'{q,"owwݤSc=uujca95̘U*ͽ7v̋0Q #1a>k>vS\ՠ^DnznK7gb0zPD5-ORJ0(zLbBiaj j +If-P罶j?i3Bu}q8b_7 QaŅ$L1{?17(|R|ORC}vsa[6s=14mlYEkhssL+mݣ 8OGp~PaaW{_ӵq8] R(9G Ұ1]ܽs_$/ /r弋f ~RRxXC.&vCmמ}uJd8th!eE~vz>+1չeѢ*\Bj*P`*0&qrz/!<!RJܽɧ\Q[z?.㥟 c0Ix_og<|zn }ڴbX&""S,!z}չ8z/Y5h#D||RzuZ,Uauh2L/ u_kWx9RmQ8W^&N-mϐsEQ2]2vW"EӴtEQ2l6MQґkǏzXX1WG {R x5DDDDDDTTe:(-H]2]M""""""*kE$UCLDDDDDDĿr̋:T22 Q8@>CNYᘽDDDDDDT=DDDDDDDA 2bGDDDDDtE(]׽'5`0}ݼ'_bC(p ~4u+;5"""""""7 DDDDDDDn "&&F$$$e""""""$$$3 DDDDDDD׫|rJJτMDDDDDDtʸe""""""Irdd$222Me#=o˄. #q*uJCxKS0ற6U1~Lf-+Άߧt>f#_ǻN]" IDDDD,44Py=8d v)ajDobmyHڢ}̯VG^EQ<CJBڿ(E{&D h0HuD3OYCu_8Hm7# ]ᬎԵ4$;O_Lp`u9|15<~^핊_7Gc&0 CDDDDte\ @Pºi]NKAxndW͐OJKaS˖hW˜@|{.{&l"@aC7¨mwVㆷ:0(S6C)ԡɬy8}Ɔm"d4ʂ+ P*T?Bk5G1obh.,xt d ]tB`O$l"}0dR"yJ6t|C1xxOiؿ ;ݍnĻ?W~R? N4Z>w܀HQ0hi8DQ63|5}zu;q+va71Ͻxgg:]k*^ɔ2 6>>_O8 ]',ڷCnpgxzF˔$RbVbwӽkq"s:߃GȬvvɛSKlx&.ͮcN= Yu 1o'uO/ VL_%8^ǫyK? +&^]ѱcg<8t.~ղ]^,7c۬GгDlLԠ%E}tFOb²=Hݖ#""""*a ʮqݚ ???z1C%ѡ!wlAJQ]œXn >dƦy+ƣo}?bZǴq+| ^cX0Y}H}6F}t^] b us8,73D6kMɣ:I'!x,Y6ā0Wشz:~w&%R|ޏGWbͻƤq$hiۇ/֤iKnxT,5_r=G_sl#5CxtSտ_,UUeK?hcVfqǃP:Jgb=g†0npvSq5v$'ƪ1~lZOt93Gߤ x?Z+NDgkЧޗ>&bo>( """"ʟOh3D@ri/_T 4j`P淢څx(*! BIn֊]X7v}h_a~;5z)O۟atI5b" &D~8oM:*VmUF%ͻwA@# hsKΜCf ?@#`2Q/z iD0 oUN>߳ǁ=uh޲%!gx BQ}϶jT]Bq1D=y: 0 -z[=f+-1Xw5M<9,6 Esr'SU0\\f#>> ! _Ƥ 0X ]^ԓ"=~srv.aP!ĂćOԅm6 <~R),PT Rr컋0Wm_D1ftT\&fukEOv!86"s'G`/ !Ӑ:p-r+u a DhxS+Ejp%>"@-! DDDDDkHC_ėXI0T:LP6ZB"!AA:)TlN|~K].=3µ^gkqi(g]!(ΕX9-/f>(Pܗ"^`ȯ]\m w||z ]@)p^eF%% IDATڥq. KcADDDD}ݺ !.!Rt]Oi4mvEQʕm69rDʰ0)Q OR&(^3wY ӊ=EZy[n|Vp=xS(JPx/cz,{]r.뜖O3(˱ysN˽]\ʹym':\"_oԠܥ T/פ+Vy!T""""re2yJ?uoߎ]MW`X_^5 Q%""""*% DeR3.`4!DDDDDTQ*3_EDDDDDDT0(aP&""""""ràLDDDDDDA 2e"""""""7 DDDDDDDn0(aP&""""""rsE;!""""""+e`̐LDDDDDDe DDDDDDDe2e"""""""7 DDDDDDDn'\M;] .AH{]Z{dffc9l.@5`X<WmP駟0d bلGŊKnǮ;aټd2ո1L&wQpt5iESME@]|Y233LU@h1CÁ>}z㗟=uXjL&wQpgx/_mE/?#FQ(DEEy_O<8Μ>]T n-Ff͊= .\!C0~A~=c׮]xᮝ;?Nh٪eB߷_~v /e=mٲv&L@޽}VaAؼG4j)B\\EAD<@F|4 ￿v qqq?ѪUb]]ʠUu=>v:wjժa׮]hӦ5~GTZk3g6n}+ƎS@oVKaڤ8pnhlܸGڵta > ۶nͮsi>􌈈ʖk2(ECuٳg駟#sVThݺ5~Wwqhٲ%ҤTdikVƷ};v@Jw}k׬ϜXv-NM)ϗ/Pnb @FX;v׍4\zOW.2e2f͜ M8vI)q`~ؿ+>1b+/+,@@@.[?&M„n:̞=."owM&D*}v <ڈzs1cFCuL: 7ɞ (PbXмE R(UUK=RRR0wԨYᄏf V1'bP8s`ذ ЌF# ǟaرiӦ!-5M5ìYQ~DDDDDtmW_~ Á)S >y1sLXݾ700'Oݝ;n}pȑ_!/ZjժyL/I״:}EDI&>ݗK_ߏSNKPB85kbɘ0~<d"8FXځ K4eϟGbb"4MHLLDbbbZ\<ѣG!!>e?Azz}5dRo۶ڷCxXEvwo jK* !`20h`l޼[F֭yŋ#F` 4hpU_>?Xn~I <M'z 5j𞍈DPn瞮׃iXfMv-𕗌 -222?nR"=Yz5}vy3gIUF X,~jJm $|A<$<?DX0l7f W9c!(up^ s̆;g'""""%2½TU{Xf3FǏW:((kVZZn5j`%pabiS4h Rb߾gP޷/k`ڵ~^s\5?؆w}\~QFiS_qqRoxB̚5 G]VKf͆L !0dsޓfWǎeV8t, ˗/Ùس0(AFQؼG|PN]ٲZhwuDuYmb21{\ <(־T^_^z#{uݻq-d ~gOf* @{]]󺖽\f ocQ;x KZ]8qg /T1|0rW/8ٳ粂5BÆ ![nq\\eß/!ݻwGFo"=-ݻsujuxDp!йs+2$ʆ2(7m AAAXh>!!֚B@@nmԻH7F6m/`뺎˗Gff&&:2ݾg]nK ˫=T#Gš_@V8޽g7v>)NLQ va*M!G/о}b ɀjB͚5s|8g!ɓ'{qE 6 ^aDDDDDױ2 /_|܅b;bŊʌF#>_;Vڀ!~~~qe8z_{th}z͚5GnDDWqԫ[W=!$"RRRq1(հ\A9>jzk&,PE@*zx><l6{Q&Ԯ];w-yFDWظ8ԫ[EDוԬ^.ՠ\ct]`OuK uһca6'f@Dׄk'(Y9T2\]DDDDDDT~P&""""""*ܔüv́]vc=H| L}c*N>]!,v4M.]^O5r>|+ViE%cX.ek< Q|J O醇H:gW֎n~6ODDTϹeDtcPѣGdgg22ذ{^ lK<*Z8|s<03K]L)ձgzmV[e6h۩}mqQL?mFv5T OC1خ-  u q՜爨<,_Gΐ\jUXF… `d²<5z~k7[POX3m Dћ;jÍ%`OuUc"q(1m+B-]YڱMX$#a|Ujl6{OPy 7b7d>T8/A7> r.ώ<#뎇> U?؆f듳o: ~^m뎩16*n᛽H3VEGFcL`o?6Z\=l~M,@h(FZ~~j>NAG?~~c!= K(tW{>NKF3Wz}"DߦHw_yH޻0TlǛBUV@GQM]-If.;c!Qu AGmh2~:7~GF^sƠEѝ=zJ'09ކ_~ƱOcSH6TC0kMXgW;nɽͽ~GĸK}21D\ܞvJjŋ/gyQy݋ 7߄w1]g q8k~wE¿UoŔsƧ@{F'#¬@ۊE뿏!IzX|S ^C n?cl4|6۸/b{Q_@? Gĝݭv6!{0tB߿FVɛq&+8vϡݺvh(t_z,[/uiwދ3Z)g`oZ+&4хs0 }U+WbGж|ѳ=*vx//Z +Ch/2%H@;%@LX~V l̪~^}?>WWs@y]ߗ+|?7z2z%oa׫ѐp|;qdؙ&h?4H( {_no~ ~{{ aYW&nAx (RB׼:tkҶ_}׼\>׮a-Utk\=!jڡBlV}Sy,ٌgysŮݻg^̞=O=,w1]Ѿn,~= p֒5!v鼿l«Vm7+k}p<|zźX$lw8LbG{-'cx 6]o'K!QCTJr.Ӽ''Ka&,kG6a]lktk CpKtku6ƥU zjDh㶸%0'cuK3GBpڿM ۆ=_oG(tk RCƮGV (PUšp$.<o/X!>1Oz3uϞO-)jgshE <1Xw5nMyzVPί~y{y#9X~=>:g(}/$<$9M aH$  S…Ӄ-$j9v_C ~"  4U:h狷?t !<СC( C2B@ @`!}}1^j=/s_ |]_)-v~Q*)-:ǵrk Q+Q % .y7DT /̢'DcI8y&,5[ʡ̙U;/M;IQv,?}cA`%+tGh0t /46yI@Q ( 8W@ [2ݎP_RM嚔R>Fݱhw)Y(ņÕ[J*T{EEB H@y4/ZM. 2U8OH$'%{Y)ۼ}`1m<חǂT)S:ƌÐLDpOaE{_ŇD@([-"RtPB~ 0ےE Ah03f ^B,ɹ~"*Ѵu  ѨvEaZ}5ZnU+Wvnl~Bb\Xlx%q6 q-Z3M;Uyן3B+zQxq!!oDe<ГNyX{ZQ6Wp0%: (lpqW^aH&"S`#MʀCKǹ=_c3j׭EawiPlG~\NIjhWu'~g2uH[O댐tW9ɲ<-rz̟9$DTأ\!rkѹ, <׳ET1XTԼ j/]Nww>5!5(ÔYGs0g}8t#n & 3̍!H|+ʄ%4wmdP: 1kH+=FLAJ+7k ˹;"(1~j/oC,_*9O2y#F޹ P unsƣMYCDu~'"UCzaʨNWY @ C`נ >=~A?{wpwgw ww]RZگNT R kHCpwBpJ IDATl|w~ndE眜ٹ;;ܙ/BpxGŭ6w\OIkRr]x7zwQ\**+(J1op(?L͍hlOw{Z JoF]MeyOI2:}ACn_3j$w 3[dA^?-p*M ۊoAEtt0͢dɒ"::Zsss3kL 4[J+ 7?lkyN;vT6Ydi&- yr]>(XY\r%w~0x,'QZlvnC ۟, 6tw64:6'W a8 u=UMihB| %myb7M$Ruv֯_Opppv:6)~+|dZ96s~GwksX/g{JSqΫd26O[.q7Z-KQGio1]8;BwJ1~iߧsl-_NI]DZL<Վ;iH2ERnF ҹS!5!Yx d2$$$X4Mx{{))) ĉWJ*gqK1=Õ>8gDIJɆ8 +{N 4 3hn5YZ#yiٜMW>)wh%̝YcV8 sB[-qvJ#k2~YFĵ.ye}y(CFdd5>Ge/N12F?(JL2ϗse]b)%'"OqF3wA.&H0xQf~=NEEQEQEQe*Q~@F#o_5V?@H#0ur<`&UEQEQQh}HU(_7{p!i ?-ðEQEQEy4DBмYs>*YV_fs'N/_~QJ(T0/g׮V6KTEEQz~~9v nv=Ey!"T(?B|n`1 8TEyeHI@ET(]G)(Rɱ<)EQEQEQEyII-Gn;"N،z 3沿R_*QFѴ / Go-xMRJ,Z骲 J/i~lo~Z<L&jTfL"|$¦eo)>e>oU̴H̖_֠$;3L|-r@wh&0~_MK+Y: G"ӹ2Îy׼\MLh _y}R3mni1Is:XP؂f3dϖc;1铘?y,Sϯf(,U5O=-o|MnlסbcCb>sm]eBRynְ#if3pc\0#P(gߟkm ;am*Pp3H]rYN>)I^:=6L3z 5=U\hHg8ʶ{^{Y1g7~B\ǡs|Kܰ0 ְmi=PY JvnijضS|)T€uY*+'p`(TBɊ8쿈jT%nO!j6+A-)lSlMܺ,ۧoTlj5bӖ8"/ۄuAʱE |?"%ҭ~C7 qv~Pf!~x ֫Dn^˾WSA0e]KtmŲ֞\ >BHMԺ\j+9uzװ?*CފjT|2v7+/89x:S*lRq^7E[cIʽ^*/d$N`Yw&N1>՞6_QW<=~% D-gKV-S9Ԝmqu^F8LOZ-].SiR.`\JP5S8nU/Lz%΁j^,JB8nǒw!c^-=Z`‰Mk{2ciR۱fGw,k@ 'cӅ24BYڗN_7X! Jm#x=p$L0vf_njF~-+Vuwq—E+QvexcڸǯH 3L-[8~:Dc^Jja7b.bf^RI,7h]km $'1L[3D~ivډ՚v&ԩS>}:7=R_MTOlBM]MÏP aBflAH\hBpx1Ӣi]I:8>$ ŠMĚʼn}jO ~E f:3 r1"f<: ˆZѴ>3/prR. 3_kyxM8na;QWK @g9g2M˒CYK<fcμ3y0H+V9/˧Jc9SнwHؗ'L&%3R9@`j_}WeobUq/}b6 Gְ;Ūo<jȻ!D cΊ\tƋ`qI5̭>_NaMҠo=+x~y t;/L6I9mS([n7bvOKl_6 2 R?bvɋ9`r8>D uI|8W&7%o!aoSw)h % ز50e8ɄLI!4' z*ZDhZH9v*PW "W>u/+1(-X,~b(?^L}C'Hryb֛Qg0IqHqdK"fS?Έ5F7 ->Y;ˢOz1i&kh|fcY+Q]}Ԭ̊h!QNINfKoPb-q^fɇ?QC(H%Uɒ%,Q"zS(UT(F XG{9?MxwN9:`,M_Bhw7FNy%LEaR(XF_kb#Oe- s%qbY½,UAK<3V.,Ɯʾ7#-gOuçp\v,.ywz>":;Gݟ̢6.-ο{,}/F]̠p;9ЅQXD u3v!˻-H>goSMãa?~oC&ʿ0k=嫸Kd\6]C+ۆ|Ƽ3a1cΦoe^ĭteτpiSOdrʦq#SvKMg..at]ʛЂ:ؙ M8*7d|޳,&N'Gm3G-8˘yMn.E-Hzk+&?XƸ?iSTũ]$׌q.aFdoV\^K1con cgY ~9&5Kt.,ɢcP1z'> c<> Zxw\]ʟ_% 7_M6~4vcÖ2xle̛Alqsz|dr;wONvo=DZEc=cP`_Lj_NX߻ri_-a}~&n"!C׉^lW_!^M_p 3`XΰMPҙW!Vf=c59s j;j+2>όk7 hټh %6Lq[y]ą>5F^g+K! >~qyy}z'vN}lF3h z.W$^+ƸM肨LW3iFkqvBYt·g #L`̢5=YS?ϞI'V2~ {Ķg ^¿W3кh[D >+M[yf [9#"3OBlǹKo0e;u4ey7TR !֥+O>dKF{tAдkiU7Mf+u_EV͊aHxB\l"* 8baa;HtCYGC9귭Ʉg%^#AhM^M zԶ./973iQoʗ'P t SJ*h@c7p8]`qta,5iޡ<>&EЪQ\svdրlk_b@0Ns:ȢqW|CKX8}|괧^!/ *T.A!֬4!4 iM_UlLFY̦sVmvBBjP#F|lהLS9!0UfWH\l9/l;ZV͍<{\\üwt @G۸+1\?;q㷣W~W*<̾fǺ/pR8|*F)k_  1[ȜtC{c8C: {r?r3v"`Fa{[MB:_/df;~|읟VM޸}D, cKd"&tҞ`lBZy1<[ :1Xq,)д Ղ1x^:nۀ;=]bgt,!/@ĊɄ[ľ˹|V| ؀,^~9qh:l3mDNO&4MSOSd)O ]r_˛}d6(Z+u+4oO{`M0cr6bRI68][Ex9t}wO/CU^V IDAT://8ڃmM ˙HQAW=4 BSi^^kBU%oߦwʥI$'K7hxz d,ɖ怬s}H')Y"cwjFRBnqOozA/|seU$2Fu?M?Q>Mt0m/ǽIt.ar_F|5VL>xom&'kXI> ^>8ou$$ G~9戝"@CqkGk'@`.G[8ی@^K&ҖI$8ծ9lt-5^3pr @磨C cJ|٫ Y>"^ dN2^ީ/x:wG黝S{ sNZ?tnOr!HLA?î9R?L"ńWډz~Lr7okFiꦤe?@oTDdg벎o^d̒1?H,?F_$?"GAuY;wbᄑ\vV^q4M#W`.TB1L7Na#q $%;',D*VY4!_a _ޭW{d0cdߖ*;-9,ih@O&@^;ǥLON7-݀t;e5NXy4;J7Z@Lj˗g*ߑ&g2s̉Mi;ix{105e?BMHG h9I _@C:LTrx dQ+B^9Hg0kD9T{-n,@xC, 4,˵`:V,bihk@ni$~H̍į<4˺2 OrN.(P0ݿ:%eB94|2;д^ yl _7ɥ'HP#O~ri:"O$- YC"=W?SܵH$~`):[aۥm3mhW _ #^km-x%GcдQZ/WOUz|̀;>V:˿3__4Z^rѰ:Y 5|KΓƂg@:%sIXﻬ3"||a_Q{/S2|N`0Ll<.bgmgS{"9}AFa lt9MHӗy b**&άaK8'&fEgU|;o߅awע3X-mQO8h+^`τARuyiتY ;QlDfяͪhk]'pᖏ<ݳ2$^\y :Ŝ =AEiܶ&n&Zu:l@b9!.P=U,^OWm&;9?`ϏK;v!R4Xk-MJy D_ςrs=/5[m3zASD Ӹcu eWiP ќ>x@r),iX2Xe(KNX>*HccEsf/|m"0j+JsI-n!gF.y?|KBX.gI 24X#C5T/6}B^ҁ-l5_g_X%3&KZ48I10ٳd##R/S'~NjC>XEqT!zbfmfskk6@>!5h\t~W(W~fUUV @`E_72VK5Ī:tX% ij ݿxcodA%EK@[Aذ)X8|2m>놌hм$'f7VU0qnCGkC9t?0K([R4\‡ҡXΊWly%H9ɓPRlxB?˹ >[_y#\P#tYn"&A+e(i7r߈["rx)+OgS, Kby0\F@ 궡&"FcF1dH w//4= {7UΛY#H`_Xo (#ٴt{Lt*+@By䬭! @~$9ê)=?|^Y*#:{,5>>B}(e(FM=H|HIηYʽȇnl393zE y<6V]'38(ܙ{#W*Bq"P+WrO7%0O\ h̓_A|ۮ-zN7:~Go!o*NƎho ɇAxR[4-'86gIJԩsyNآ72wo:qaG  [hx^8l =dU+/QYrgF?wKj}"]x晴u`EDi :qCxw~1eN1obD\-A"F_.v/)C7Rtkęy2b,NNRx]+BO[=_.{qJegVDZ׊ d3'17{36m&NUx%@$mK-}嵊MFœMǂP 0z`'Ъ$qF1lN/5QOգ:\N_¹iY9F;)dih WR?ůBNUfO*zEnF([O%`,2^$̙+rʋbSr g#X~ýڛ|AofD\/K8@*9ycG0wU ǻ+` l+߾CDgvݚ; z#z?3|,ΖIIѬȼ,v&bݳ0j4}e81dU1mkMq.`NmXh"=x{!4tү<f?i c=H6<.{C,Su06o5VeW_Nc{Hi1Ԙ%dlǘ+̵_SM|HǶ6s;ۥk^یhySuѹκnf,؉_WTό_io@rΰtU[JNYI6x̬G}Eٞ1of4ꇉ*Wȭ:M=tEqMau=H2L) M,zJJ-((H?qAAARJҵ[<(9>Z ~a2 SRiZ~XVf5flʆ,TW~MdM2AXgd^2QV {q:6M'/Z&jW"]@C32]=Q\:8NVM{g7=że5_8*r6N1vt!oJM:) ڐwd?ewnV7F"u1;leɁD|rx9X(ѱ|׬lSG2 5Z@%ʊ(wNp>&?}zo(DۈX7qV)S{|"/b$xygIEyV8+"9ϽP-맖+]eEQH&0E_xeN+4߄=eң@mʳ7,7+F`R"C-q%6y8W*QVEnֵԵ_woV0UZQnv[9EQEQEQEy,DYQEQEQEQQ(((eEQEQEQEIG=떤3ϟ-=teu'͵+]+Z9K`QY~{bPNÚ搫KJh#;(((r<2iW=viۭЈԒ?1k5cUaԠ0&Ml!\h9;g]YSu/j j7VV z&H4jч»G1w~$zQ8/ڜ$pv0X8Oɶty jtCoOS]2a8w݊wَ<jg7߲% wc[y3M p.T.(((7NWM۵ԉ:StO_ȰXx$eAf?s׼ҡ4nC-["u=ľhL;۾|.aР޸$2|j|2&O 2hgXυT#^3Fm1SgD`1VQ"~ϣд(((x& DZ4)N@i[+MOZOo[S^YT/ .G:54Va  R._Lġˡs4)Ov(}IҰ[z1zF$?KMCf047)uFEQEQEQsM̬I{- yќ7 7wRJXdM o<[OA'00hՎ)R@~fؘ )(((U6ëf@'1Yks\((({^IW9- _pW0MxPeYiFJ,H&0hx¯s|^ ̮+6$O=$ 9"{S iFq;v`@\ſ\mj]m.{c:ss̻HʻEt+SMB¸Ota-oPz(((JAEtt0͢dɒ"::Zsss3kL 4[J+ 7?lkyN;vT6Y=%uCpe>.%HwR!zmH44MkY7a@b!=*~9/"t0¥| e[e9ժentJbIWm)((k~M%]:w"&0$Liooo=%%8qBʠ YR%ٿLw(s<:9%Q}9?.%lN4w'80 m^ uLI=:w*OQr.)c/g:EQEeعoRɜ]YLH][/Թ5nbT{,e!gʮПӽ%ե~g7i׳%F`'ѦICjkF>4*%urj1?܁SzQ$@ 6W/wIjԞ}7)V2Т1Ӥ[B :~R?5!c^ziPuc:1{h\5ҠMO{C h=(|ecv~--5'ik;uٶ4`]i0;=Î>[Ԯߜo`%[tn0aDiа[.Y͑ͩS/=?f^3:`;6jWbjA5~g,cw֢uOƳJf*/y}jPcV8bgTɹ~נvnX֝MqC#%j! ujզN|5Iq k4kԘBpgg|О˚~uK&u^ Y%X"a]nL4bޠ<٦1u֥NxoV#SdI3Xa=ܞDc9&[^-+f|߰0F >8QE~M˘5z/q`fÄNxr{ncd ~Ao1i2,$gsXᥧ?cq>(RcϛD=|Wk׮eH%6%d| 52I bm KL,2J k#*;ƞ;uqb|(}'.eѼ1uVf طw.cڷ] I9`oܚ}{8k}L٧cI&~#jȒV oš1|O  ~Ȭؼr2/!Ht-I|Ի+ Ѐ|8 ײsL\FaYƫ0I+sT Zx6 ˈʑH C79S{ETx·/~&+F*hR Qg)(Ҿ/& iYS\IlgVxuzPnK-XpryY)MxKz9w,V)؍7 ;F%5ty.dwiQ/ ߴQs4 ^p>߻%\9C\I34iD48vz"5qI a/BQaKzX]B y-ܬ3Lbko䴁  "A1ŀ \skYQ%*A@D IDATY6~l?針ԩfRDϙ ]=7v{: O |?_&S2('GЬ|N>u0|SR@_| ՛^ca2~G o0ȦBN؟z [g$Kг 6E$ƞExP '+eF~UoWSޱ>3 \rFNy"^8vDs Ua|٭"fOD/1VkN Omr0gye ihW]HS]y]&\|9ȍl!M?keT*0ϕⴸh~U6XXg ?<A]%gdܵJz7tbv5їag|fO⟉fMIs }+?ד'fʆD 3~\eURǤns`+_(̀. luK0Kg3*4#,u9qE*H՟L49k \ԝv7f)`پ \ճ#M|+b e?Qi͸,]MUoҦkfuY`lܖpㅅPa{ Zҹz>~.GŶL=e'l+;u u~μY39^dʍ5^$. cF{v/MyKVVƯ|ܩOsgR!F~ؘAgt]i_f$0 )2=jsr­0}g?%=EI ;ξ<,I~ F%?Nwox ٭pc|8uOg7|v_Ϛw_}G#o=GKy{,ƜGϗUC@9Cop}*^^B0uPu8 q+ߟkJ&׍GZ5fX缞 M4kռZHc+VihBj؎[(p^~p n\G GbeSl^U=W9V&ȲIk7{~c#g~iY42 2}1>#Zv] =?Lu{eV9_xsL[9o]cԘVR"~߇HƎOsdeYnSy ̢اz]g?`lĶhLiѺ)׳Gf3 ) lfw|'I$=>LC!Jv? L-?1B+fVOHț;r=i4cqkϥނ/nQI7 ȰhDn4}5_Mͧmjtc=z[ʲbY+ fdJT oggEt̴avԧϕZ9< <8 [jit>LW4*!w|ɝ>q[Ϭ*ob%:* |ʣ}bmjKa3yjk0IɒI?>7؟DC~嘾\fzt#)sFq`8B8,lGZ}fAt -"\^1HJ8Mpb7I0GoέӚs6wGsnq92;ɢ|`֌܄<קe}=ts daκuU+]l(*YSy[ hKXhz Fw8NC1$րLPֆ%4˩ZF.Y eM) W|Ko~ʝ&(|! < &~s;{p 7qez57ۣ9\_6v%'h9L& ʔA2|:Z&7Hݲ|8^>z}Žî &yXe؆QXLڛ_zf¸T:/ kVL#;턊I} I6%oa<^hד.| K{3xTB2s{F8]|4awAq )(ɤUbF˥^N_ }H2Is ̘4p|jeY+6?aIESYѷ9dy:v&цgFR[ե|̳`&g7Ks8Ik%@.l1nûxWCwsɝ~>xtrp%X kW?=ǵd{־<4w1g%EM= PZ7xz-=x1&,YʪY9l燧{d[ij֒ƻ6W%o<͚^p˪Woi-k昫|d2aqatKV:HDQ'Iu2kLà3:bN6''w:dשA#,Ǿb̙̙59s9!Ogz]0Y߮%Tm?$JQ>jO-LO){NzGR /Kg2}=ۼ+O/ѝb _S pѼd~8!d^! lfK9NaS l^v q.tS8WaYAaҐe;uSdLGsѵ)y|{ zٽl#E}êbGw2%O&3MҞXg+3@/a_$iT1*E3hա.9|,eu fIIԑaB?DGd6;fiQB)kj;sO43HY/77{dV j16W#{ͱ󆏵3糹ns@˖q%lt;?A.~xm2kڝD\ alcyi^db`5_T:;i' i!oImk|'pҷywq\zvs,壌/s)l08eT#>`2}0;[3E|ƈa2E)Z)Ϣ@[{X7]1 ̝|V߽ `xuR?3{}((E qj-S~'/SWw1o"tL~?Ȩ[}84V1 ¿ӯ dƖQAt8I6AnaOWXɤr?3@[Ykpg]AOyk0VWccy$`xkЊf60<Ō>H]c@rsłcMS蛫O!ɟW=yZhq=,./_)Kȫy۝6E^)5<8)2O}2vBQt/^,!Mw&?k¬| O&µ Ι-ؘ`H|f|"sxel /ިPm}'9:[; FFNrӌjŠ`#bֻy|DUi܋7N$'ss.za>S+]49?&ܮ\XN⒁wPixrSxllҚq<27&r=kיƣ\J"&ܹ8֧Q3. VFInzmz K@˘NF[ѳr*<8aDza=Etw=9c\ 5W-[.dۍqjF |GmīY{9p{|XpuWPk,Zcp$[%9)+?I.bBYhzt8>sgkw~th-1t$>?& {Vs=} oduNញxో9N?z2q ʊOs7vkS ~ɳ9$޼[ؔ#i#"HI:̠ˈ^נ٨ ݧ5rg($QVU|K{wL62~}5+^3gdԥNF3kc,Zk|!>Q„'bŽ&  V\g饷qx6ɕ֐Ʋ{9|"87pG`csCzw<@p7>~xMDgeմkAďJ7NYF+Zh! 4j*++ ð8NK$vM\RJ2)_~_e˗ci~,\Rq;:9A93BQz c'L.)6-FŴ%^Ȩ@3i J{m0|?2t 4LI$C7+Ϋ *ߏD$]h9WM4 $wh̏RMurp,hפ@7KA׸r?@C)Uʳ.+g+E,>KXSk1% &fMH 2IĿ?uD75;P-9j_GT[j**g BQS*䣾5; >kH5 Z,hq\F8srr7J#srrdq㪼*GYq#4LTwP=I5vd( 8Kt 6[ѡSo\^?vrեj#-}XkT*>^O< j~ ᢆpR@mj+{W[) BqPBP(j%mO=u1Ѣ77H8N 裏M6LԨ}fǎ,YZE=a, !xgPg{jϤU(ImhFpB)YP(j`Ϟ=L>B}뭷2~d$| 6J W^PƲ09 4D ~ s]F3df7jz֪Rv\vmf,sl1 EMMt|e40I+)U[͜⭮2VU}=8.ݩ @Y_5bŊj\5 _,5e,3Z9RLc@Ft>BQjbraM1Ivxcy qMg''eDHgZo "c6Kpvxtf DkoT)?9hm iBR0//[xi9Y *-\JoŌ)R"F٧$*&vnn L툲ona3sR3gzL_ㅭApI'k4]AbbNng^5I͍-,7I 2PE|m 2ixcU~bV3(._Wlh5 ~o֔yviu+ AWSD. j+oj>G{tD5&BJW}d!8LX餤e ook*ڙb'2mWY?K^38{s[uBaN԰ (( Ҫ?Ss!,ftv3"-msbЩ--44I乕䕕aG989D&/ j\3'vpN31ytgG(NH>PZZ@nnA|TBy#XE>$4;wpsyi1쒔8f;1TeеNwVD(DNlۢ y~q}\YR̓WC8Ɓ~iӆkV 3 _~4e8kXZay1vU?yA!trC;+}a$;ih止~/cQ"@\&LB'X䭒 6wc=lfetC O1?R㥮n.k2y=GxCg#͂=3 pߏAZ- :&,βe<1J)38:.3EYXAaFf^/qawN`Tbʄu֔2pZA|[I$%lo-Ĕ{6?t:\8'W-FXwr#֣D)ll<믿m۶#Eh:8an#HU"\,ӌ^eDHE^4Qqb(T&&^m4/,q‘pYIj vGXNtm)l)9Lџ"\d41>A?7.AhaD](ʸaV8@F2aďĿ0i;Kr 8E vk\A-^e`Q:.;ilSZͳ :Y%LqYsjzrxrZ0Y1C-dj]\b/ĕ6ˋhf1ONSQ:|<%Jv#f10a)19\D".gqfg'~n]Ad3WƮڎМB:a[:F::߯l䆦oF36gH@ }:x)[ҐQ?4M7--~d<!-9an=Qϭ/;QCg&tj媨[C7DYSАGm묵;RdL,NF'G fy`Hg p#<]!)|kz8nI!FN/eQu2/廵>F,b, FQfeg$C\' lIR+x <&2wxx\#TD}aĖTj>%˗p!hQnj^eK_h98afk#ő͑аaCOΩʯZ),kVn>25+d;PaJ%X!+9CQ0 Ia h"حzmvYA_Wȓ{/fp#)WSoiP!cGb!AyvEAFC|=͘vE( (EU.V3+{Մ%dLѬBj>2Vj;HY9oA]ª 7c&d`+  ⵈA; aElk 8]G7 #T PO#ݻ(?5+Ԟ?NM>msltU!"A3 $QZ"ol@Es[!vE@FLϷqG!zn$N0@0l . v inعzyT$ C@`H(0 IHMI$r2~)ICʨ~._}WkTFt,& Ҡ0'\[2V] %XR*&cJ\i+]+@xi$<\ bic?HW9߿ó X43 & Hɺ3qrv%]3س^RfyM2['u8’bIG2tF`}$ G4/¿ڧ$ $dR#!NWo) :~p]9lήեt @-%;uCQ qhOQ nƎ<|&&Oi&Ql4yma_"P2f6)ejg)#/Ʋ~10*Y!Jri4ZJ[b4kfʔ mD%a!%em3 0$rY-h} uY[/[?4XR[ŵ #lP U) t xq҃fըY\3 ̻D\8I ˌjGkzõ0I"YI<<U]>ՄLà$l'AFtvGcX\F [Xik = uiR" *!uPXdĽAt'h{l[ū 3. Vc./OEY$:*/*ҹ$~f.0KI8#jlIui u?7~d.w;V(qDjKQ5i0(K`TS7O'c;io˒i=sC7._ups˸4A]b1TUP@Jɝݜ۠v. 0 6Jk,J˸ hq#Ğ4Ul` OXԱi!u,4(A+ $D`9K[YigH . ) wĠ Gު]+.)4dPgwR*oD$"HN*; lf$Ơni/Ya fc#V][\5 &(IŎ3BW͢ c6AI4Ks}̋Tnk]ƕ}'AlLqC+&RVe/F`if1!Lf2Π4t ]`:{)l 8S:c:1Ǟ@:F"^uYN@1/"qY[{:ו2f^ۛxz̓.JS+ʦ# >*+~$ZbB}Mgm|NIiiRFVΗzVTi6:'9%(,#1t^,',ZZg%21AB~2+3MWl/`i R';f 2#|]EݾUЧOպ%q%FFL[yWj5NmFdr"6!4s*]JTcYج+YZGDaXkiԵCQBj%եܲ]' =Ԅ K|fuL4Y1w,$ ܚ[76v,;ի@^\<Ś>HG:Qc3̛uR~Y:_Q rR+M!f8`OrDŽh\^ijYX(xf|k0!>3f*c _%u Q^ .b ưa9rd#9a|ǜp m=zk8qV}-Q"!.lfJ_xb8L3̐f28=v.lA4VGvs\P?J;g,^iJ$ɺa20܌jbL&&lpc﫛] 7L Z[nIyRkXIFIFDU~ČXԓN0¡cY9l,t X\+Gx4@HDl5qBzĈQ37H1 d(B Xbq"+ .f["{_g 6AcSU:$b%^z&. 0DcHs9躁*hd5jFa`rNf!Q.͉M{Nvm, 2XpZA4p8-hGp8Ž v)ic/6qjVΚLu-hh@ffaɶ3`R*50 ]H,N3r$ CDRn:`1$VX,(b"nIu6Q;ʨfK(-{)oj{nG )?yS[$2. gTXMG3i4ϵ3xJ@Qfl38V@Z5s0@H͢*&tfVR}a~Z8tt 7zNfS9No*W syC.-ISGQ4ؾg -ds$2fVN `(=bg!hJcVʈN8RsMEj[[#;\iF00qZ'7dGdsXg3sGf1}}} ~pE{챴hтuU 3F+V駟r߃f6sZ7wyV y6V: >NkՉp)B7jeu;yeEqwK44y$G`ytn+#:hi ޲"Ye-Ξ?|\sLxd7<5J`_C|܇h' pf?ʗ?{kM1\ #w܃,%Ɋ߉$+_k8_n eaX痈KGNnG%AOxˍM=s#ycѢw4. ylIߒDo96A$aϥL.}io2QspY;CalbTȝ||>eܺt,/Ek<&|e]ALfMg44!h 'odwt? |C)Dewm<<&eaX`CT":di6&;F>c=%A_4fh4* ZiffǺ8'f//╈v1-/;JxlcHgZu^Zh ´~ 2u{5^lFt\tml s$Z;iWyq7",Η鄈 %1ٔ.KZ,@y۵`f;0 I/ۼ\)_~ m'r1orM0,$y S `7Yu\}#@Y4JM`Dygi=BD!Ě5RgR UA$6? y ce3lPY#?n}K,6: ,̕<_~ `>:pW(!( \^F.nZ5kBPپ>#EQHw9dc@y PG#BNnݸ{3g`NOOW/1&q5R".UӦ]qB8xܴhԀAeYˍۿIB ]6V( P>3m4.]ʞ=effҭ[7N?t>lڷo'|RW*nhVHVT}n~'LI2a4RfqeBtpa @ dy^JreYy ő2[neرL eBq#+fT 9X8U* a2P뮻1cz EJIYYwq#F > Rrj.?V [P(Cr.&Ra9 BPY0+㏫|N`o&>wyg}J8N+Ľ2a.BPF]l}j8;3$c(=һHXWPQ,`]|+6P*MJPAtHH uwc&@( (W nA5^fwQ]iرͬg8C˺nff?qi +y^ɹ]q|+hm?'z+|lu!L嫔g5Z}Ať¬J`1m/l hYKpKJ]!9Fұ6E*_f ,N]WmKWVR/4E\[sB,RRb `k~t]gԨQ:u.Æ w/h+&?bB\MQ(k *Fs41d„ү>AIۘws7iv` ~ g"髀ZMZcg)Nψ.$࠵ GN`>ے>_揿Gүvg-C6LLF^^^:E{3+s.T*`ċ/1{e=fkiEޠ9Mrj d%eC#wWCxʳJX ؏b/ &اXy=itٱ]ͼ_a҃g:P~q8gAf/u}'ҽNq@!uIURJѽ{w&Mv{iӦ~iZ URR_uݻ_=y'ήsZQdc:CRuhEWTiL_;ҶN_->ҎE·`j%Q8~ORe?zDX(MPIHet+&VRI>r3@W.5C}5Cz@S(J9]y˷p$s6E6[7$ۦ?h_>? Ngqg!_+Ev{20f )8P6;p)RXplM523 :feÞ9Ƙhs^T Q3l; vMldǹwd@6 EI"/` dg9oVbwNvSkYfo],خ233yg1c[ Я_?bbbIr+g\R~ڛV2Jad*̓G9] `fH DK9!I| R5y摐n&97ndt??G'Dt,Xĉٽ{w 9$$#G^ s2xU'l]#4cҼh߭1V/c܍|Ar+ө"@y[=z;JhLdbh;G[9m%džBJPAYiPB֬dN>Ot4Ζ B _q)|ӪAJiqG2zٖԻ3`g$Z>5Cv-q,>i ?}QOң|[> ʍ/>嫳(f?ʶG"[0 u>7k>UrWײַӎTdɅ#n̐X!H|+Ʒ~KNM7 x틯/UV%22'N`׮]cF/·~KKB0y.Ǵd( DH捨R֠7,e'g\zuS`te)1>HN<0Svn~Of宥Sz~sAa)"Ǵ,^u+a*e_Ag~z;7- ܕ&vldO7Jr*CMv,wn{6̘M'{̣ƥQ>ܿ7u vOd6<ҥQ> 2(t+ٲm{~!%"-Ņ#*=zW *55U-[V%$$h^^^ 40~~~l/G44L ?xmv6ntSt͛<>>l6ӧӣG|7Zv5j\~ chaܿ?箏aݞl6:LurB[il޲2bzduQ1sK !?³jyW]:wꢔJRJqȰZYiiiٚeYYYpf@@nĘGI@)E~9s&')R3gμh,B!'ui;wfմh⊯6mڔUVѥK B!בRUd̙C-.jFf͘={6qqqԨQC&B!Bg2Xi'N:ѡCN>9x G4MJ*ETTZ;t9۶B!Bk'Ex&Hddgr>J)t]'22>} r]'(D$uBWV#>!2"bcc =eʔl}1Jgi2eʔ|[4X4!D V'9!rҢ|aaaiӆEL>x7aM9rd-B!B!DXPfMF/sOFvҚ,B!בʗg_,1b? -B!W/:#GdDGG{ʔ)ìY3f VsB!Bk$c A4:uD6mXlVرcWkBϧ~ʂ ߠangʔ)4nܘ&M0g:vȧ~/;nYi:55;1 .GFpY6->Y3YV+#O?Nh|+<::Τ|X'OzĢ >!Dq2v~KܞlչAT!,ͩ4wxW6EA1~x2Ss Y?^|Ѿ`U dE+w`+Ch0i3ݻOLa۴h7Ǔ/_Olyϻ7r*&=2`F- Ξ%D $e3t'-~ȸFh{){[3jpn,~g:a N'tźq2󎁔-w䂵$K=+kd&IѲeK{6lYR?qi_ӧ0i!! 0gU4bǎףkU_0 Ubw*E swQ֬Yã{Ћ|.cϬ:{.[3fW'üߑCyt.^Lo8#cǬ"l',Z)OWbs97,gˆ{ż% 6$' }9cEL凸e]}S7rOuİxbi^*IN cX,L$..w#ˮݻYn `+͖[=V8ϟgӦMDGGKkB.W0 4\'RJi^ AE>l[<˗'ӨCb hO,ڜAn߿4UG0_5,mjԍeZ$pK :vB_F/`gS{5BGӭk,Wfs2,jJI? V(Z4ѣ}PhZxTR]y r,@*OɓG9n3Ai躎/$tt/mEhn솟ygg6/J ]"]e!;үei^Jmښ3F\QQUZ9 .]иqc͛Y~=vuKAaXعs'bcbPF EDSȑ|w^9WFd_9{ {Y^9| B%] )SƏgQlْ:u뢔bʔ) <0xsOʷmʛokS\9 3)m$p.pkn`⏳iiY?'Fѐ`Gl@t,vitb ˦9m\-=w̯`ydO_ɜ H15ثW^UʹDxO:Ģ/Z n3Iaוc_+ !d3d,L/chbX4c4_qf̞MJj*ڴ̚+""";j&St|ﯿulhSOWB Χᨸ"($خ|~9]d})n goh6no;v`n-r.*%yRv{Ѡ~}J,E!MnW^]~nŚQ-nö;bh76jBz*mL4>ٓn]2h@6nٳg9{,n?NNڭbkOFYoء^Qk^ZmBYwL޹_֌6}sG PVxQ7-V'o]$M K53JYbhڟ?210a3yb-JQ۟aI*Y Vs g|Ixwb I@Ίͨ|`H W1#Lmܖbj~#Ŀr4JǓnlRA;@)/^rbjժmvΞ= ѣG=rNDx8c7>B!+;sə y8֧{jȘrBIO]ۑ8G(߮Z]IwɅV|ןrWۍom۴7ޠ]vL$66iӦѶ]+m~ (t"L6cPx^&t+4cCh7Ѻft?_@7Rϳt{~OxX1wqwn5(||.7JgsT.;uQJ%)R ødX֬lMӲ,{xxq3 7cbbѣG{8v]5,^^xyye̲7yS^,'H69;^Ӟ&MsC`)Gˮm'to˘ud3|Ѧdj£9+#|ٷ }yrޟ/bmS/_v^$y-=Kmhެ ?„6쵌oʽ`]Z32Q?ؾ+cdހB>RX,"##iڴ)͚5xX+>TI;N|9::G4%8|Мpy{GH<=K}[ٽn٩u ꚳs̖C[O.Rg'v$#+viVt˵}s_Xgq=RqC<4@Jj*G cN|B!nx˱ϫoi4 qt3X’6%I^߽C0=>^v7OR 'gI%+8ޣwZt_ &˕_N󟰬j(~E,lt*Bdͮ <&Gg=K﷾Ugv00U0x2< "'jBC,Bm(gΘA.:˵ݙ>>Sf?3'eQtnʤwNқb9\ۈw~Z_лמJ3qxl;D=B!B+p}|gty+Y$33̬lFx?4⼩lDZZ`gg1&_-3V?aD-_ L(E]k HJ;ߎ:&d$Ɍ]B!BqUne۞ >B]Ve,Vطxg<1tӛJx~RyJzX`KD_Z>tjE/yUi&(|Y@`ufA-z= C0ATht5ex$B!n@RcSRdIONݺun@źqdӛGі#K\0|CÉK'WWf!BIk! 6l`:x,QF(ya 3hѢC=XLgƬD>H=yݔ{]& lZԚX5[n\yzLW=4-?Nve/37ćѦQI[ދtBseADx8:tjL ieV]߻kd]9b!**6Z]!MDe! V͚ƺ#GbȐ!?{1ڴisvPT~bsK]JBq3@Y!xڵ+1uT^|FœO>ɇ~ȇ~k3hРB+Mb`Sf'ąchy[7˦'vs&Jp{xi/4'_Pיt1ĜZIX]'d41Y?^f@oۓ-:?7 ?䃥9OO(:OOfxΚD5NjOu"uz3Gh-36r0FŰ1?tLDӽoP2ʱTȺ^(sf;Yw8 kxu<G+ӿLeg{243jݟe:h٬w/c^ގwhaUͱooXXxnx/jkޞ}7SzHS3o3'2M|FO瓧0gIl%<@u4Es \W?%1˟w?gSV8rIrJ mTeʠ|W$$$ĉ0zmwҸ8;3ÆPeϞ=ѤaCOmذ???6ivYo)R ooo7n̹/]Jr.{L!ĿSA݄Bi(oyaƼ*O=Tn<Yپi7f;>zK,e3(?.Rn݆׈o:qGl[bͦΆY(g,^wZ&O}| }%of{>΄1RVGُwn:ʶ0vb~Z}習a#R?G?˂3Hn;g +N[7<M3x{-曡9'mhـG~X^RC}dl6۪=eOc{Y܍f-ba^]a1LEdԵamF2g<8_bE|d9?9/:5Veݷ4s⑑t҅0^1?vΝKmyuhXd )))ze^>$95G`9Ç/RҥKJ)WαGIOAB\w( !5ZlŊgԩˌ7A]$AE]@-+ShA[@ B~~f rm1"P#"qw:F)*6%«&U"P u'ϒ?ՂtO]"qr*Ws&Dz+w)5)Gڱc6+ӡG,!:((:?mvfeu%tBtޚaW+t=bÒ8h#3AC֜YlO|Kfj{b^ɢ?#5n6wS!=<. i'&^ݘDnhڴ)c]0<1M5lHh1LwswbXU [3G䧟f%AxI$ "*ܚ{r⏳iiY?<Fѐ`Gl@t,vi SX7^6MYm %0j!~u]#/X,- >TXBNù, g;/L/cV\%mHq⤍F79sWa %(s+$?{)3C^Zp8)[a(~Y/4 аA3I=vmxfuP܋WNzZEs:jK.ϏfMBzZZ@np!7 u ݎinݚ}Ν;W5*gWx#| VE9`^ F'8(+ ⰱ|\C44 pmqKO&%$,/1! zу Ky7y1B5G\蒚PPLL&q|((WL{^L-4۶7y|-FW@❞ ^R"E/=~6u.zpMxt8Z:A WDGGӼiSnF֭=WqɚKilV&*ߔr[sNJ,)B !O!Dz⫯??OthP8C'ܣ lfmP;l`w,5]91x8!{3j`8KǾD;MٹD drpf(tfJ;~Kt q]ω,+2q $>>dv;gΰ(UJ)HMM%555b']׉RիW{'[!4_Og}l6Yv-7l}۶ !)HB\QQ,YUP$db眴]v ݻҠ8_H/xSu$^ &j4Cir%G HQ?e[<[ Ve]eMGw =N\ӹWmPW^=WޥWY ,O Keu#):ⵧ]~{9%5[[f 8loO/qΦY#^\1iqij>|l!66PD WΤ7 4$!O>QC1kƌח㙍vmz&k.2{X,)S{+ 6B H;%RX^XcOؙI≗:'9I'831%kF#$..wKw?z^wM >dUwVz߭*fff… 8qʪ⣲.G7Ml|d2ʬUgdxiQtq֠;11>N{gGevce>?V?}VeѪ$}UwF-&j 5]$>21g8>fKڵ[;^}Rf\:]cC6O3wWGy`c1xgj&_l?l~K%ְ{e`R$ {zhX,2@C}}e|C<|ܜ=wNCٲl=&\ji!!!!"B*UE[[;55+>,*|v׿uiӦJ~~}3gT+>}ڙʬ\(Es]w_XrXdƐoo=|駹x"?zʬ(hooO?w7#Fd#ԕZ!.\) iDYZ⑇Pwo^#\W1JG izMY]Tg,?ov?g!NWfJ9>;62~s\Y~<ؕ慳\f1|d;gd3o086rѦs L>G~`R\yUF;P,?lp积q5&Hޒ@p;"2yVm;2x aT/F=F. Y7BM6@m 38s: y\+Fu+U6 `'ݴ=q^>.ܐD(07p3WƘ˺U ˎv joqAmyV/>CL xE)7ᥱF:2O*ZektG[v7Eqs!^}L[p3L S9TY?6ofɍ̋,w?PqĨi}3\9vsE g^ŋ lc K9z{΍.ƙϹz}>ګtKk9{Ekm-+ܘ^hi۾}uFP55zdhhuΜ9Coo/CC,--gn"`G"0==ƾ>R*qmm~h>11ƍ\O&D:> $$$dl,w$>#n^!nr/}ffk__Ʋ,X Wgh껟͗3fs:0y=q*߭ gKnD9N- rjO>@cdŻ<+ɍsv>3}i,7|N#oU861ӓ?K9<F(Lϻåcl{>|&m+2M]c%*oNnz|52ϥ7@'Ol8~/,/pF1{(G_ѭ8\hЃOq02wm<}vк~6Od"G1N: hd2(>Tð#EVK0xv*ma퇄4Ebp mQ$JO7){v&vSayڶl5ŎIW'$J;FGbq1[!nors7Yj#Qsc%zڙ&jY$Z6dtX]_ KnXef6V&̩TNRW?TX PĥVzkcbh–e(RdۜZ၃.%IoG ۲H4hhCMB5%,.(rkp[Ųb4lvn%oZ4mLK"%1:ZZ^dIs\ɀZahHڂD޶eM=0bUG6RQ TZKaq<d,m]i"bh+1ȭҶo> ;h-p߅Boo/mm siTRSS_;,::  ?cǎ[2&&n܌캞}%((WN371Dc1R54oM}Z!!)_*> S7[ :-R2HyOV98U:JDieT AOy.\`Kp]mD( @[οk_UEP_(.*r3sQmcx^ckKr8\|.a٬K!I颡MU2N~7 ̺Qbb|bFB"Kco WYᒢ`HD;*R@"I4J&D)$H&JB\l/p.sϣH"bO5K̆VvB@wWWeQHE)EP 5ɲto(;p?CC+^yfffahXw$mmSCBBBBBrs컜~yƯ]Dk$YH,'bb[x־ݕUr_q%1$Y|+$dC>4SFyu4wr(hlECE֞vΜLM[S~|#;2xM)RUUTUUQj;(N:;"eCv~_v'.:1޿2=4+&ڻiYFXMP"Q9FtX twEy*YWG fr( ,̑uAj88=*fΉN1Y1D"tlKn WtucIfvýr@W秘 ͺr"B 7.i_D7b b$J,6WP7͵,@q,tӶ wDH27)(67Kf5"03=M.G)E6crrT8DXZZ-"BCC##TQ5QJ11>AKk xkjj"ˇ Y2 GrpB?1˥*a14ќM$%b ѨE$c_7շҔy8t}06x{* \}Uf_B ѻOfxMjx"J)*Q LS۽Tyj 24Oyw,'_{ le}`7Um;JBGd,rLI`5~M8 \Hnc;h.ܑXpbi7Nqfx6v4M}{Y\ρQzRv>ںw]{/q1 bGBFr`GtmeIξqUM'^bmyhEKEԴ@m 1ڷlalw?DA39{RӺCIQH9wm~|n1:6U\E"466 7LLr ٸ7XgCw׮s Hf"?jOjno_,G3\>y\e-lЊ*8s~ѩ%~h FgQ6 ֘Fy'W|E?޽{H$VRsOcߣrs'__Yp]7dh~ii`YV!J|innv_Ussڵkַ')W.ǥXT1DͲ8El;BĶ#oyW~ݟ{ (,N1/6"kaT5;A~(5 ?|__Reb~PL ")O(W`Z^zʼJebNJ+Vd+*U봟2%M"G)(Xx#r {|.Ǎ .yWX:bW 5$5X&,.-czJv%k'ys} ddI&bĄvR3LM͑+ضęL ~#?O'!!!!%WnP{S[nYCu6z e.TYx̉gPTL0Te6Z)%+/Ec~MAYu!zu|JB9òmoMs I!H&'b EuXn"jU{Yz77OCp9\c|jD< mnh"I]sƑN^Dmm *f痘A) _r O+ N]@ %۳[ALJkC51()Lޒ\7z B!Ǝ2K,Dmc^(5"\ե(èTmp;R+/WaK*XECS/-x@ii.gM7㏷9톷/)<罾zmk颔klJ> QE>(|BB9䡧z/Y:"Dh,F4'LO&QJ[\1jj*'(R,G!R,4ְ&"8$<S\\,!!!!!!!-J)()jeNb%~}N^J [ OxY-If-Иp*E”"avhQ&+2ged\ N(U֋~VEOƨ76ݎ l_rr\>oJVi7`3(J녒7x-A`x~J}V}+J%X.h D!ʓ=R.(}ŤYeW^hmn_w `Uok,ˊfK^NyM(CIv}ryۛmHx)UPZUh[=&eZC@)SROtnze|H3M?Rf]SiDf4W@Oն0"Pef| jqޫ}z7pA)Dמ޲k1"t28g]G_|) 񴿥K0tFHkPyHD!X+[e}oe)]>P'Y:ON2:$ĉDcePtp-x"cәBQ>#qb`Nq"ܿd: :HBYrkT7o{HHHHHHGR>9`A<$| 5_,LmWsro:.sB2"YJSS(F2FZZpJ -sEcKx%n'<іigU(/pHHHHHgOhaΛwBo)?sfQR=o @e+tmE]f2ebXUAGcW <^/럗*g%TgToO[ʔ~5E"(T^jkCG^#T xQxOY(RPE`{WJF*bEU_+NOry%d+YYY+S³dƟ@kt {tNy Bf~X,F4B(\b(u-T5U'U)dY,cs\}0tn@ Z:ﱯ}HHHHHȽ:Dm5". 4= 8(Yԧ^4&qkLzF0(qP͹HӦg0OQSsrL_tehaQUl8ϻZk#E_NS(.Fp6 c(,c/:OO\" pcs0E>hu!&_NUUZzg= UzDe%o+)n)g;7fKeW[ 2@^)@5l`XлrQו͒ƒW+V/I {Hu;!"u"V* tzd:}Oz^e(be`P+g)wP(ܓ7< s׉yN IDAT"Jup"q&Xv=v+ǑHA^Dϲvw,b`8Y*Rµ[<ϓoN_򐐐2RG(e"{;Ba"ELtUDybO@)(ei`*#|bEbW/ut -4@AkWD 25홖}:M zTQt̪gچ>CRO0˺ iYȴk[,~xF1+JJL ,#kRrb!J۰,(ɏ-.^ D-〥늀R\q,~Y&ike Q(\~dm}k' pmD*eNKybtE( ,]֋;cOQWƄ(#}oĘ#Z_y嬐{;&0_Ȑ]ZrsY2d~>l&0)7Gfbt !~u,N[O*$$$$$䳂pUѬy fOHIh芲~^^op mx}0QV۝cHz@Xsrzxx4nj#~Y'Z~]W6@'\ (XQ#d,` arI?TaEM(/1+YlW2( ViuMPzR)mA|u{hˆr=Oi372,e'bԤ$Q@E0G3[c*(s˶d<7α1gb|DT72grD|DTKKK_%/_u[n$JUfQ \< =5X UotR҉}z&_e4]Zɮs_l xBKoC _J ^!%_1R{5G,`]O z)Ɗ2=ZXJKGjubpQu퍎%LϹy޺bĎEq, e^Fi=WQ[(mCP* .qQq~dzÅB\巫1N}Bh?uI=Ff,Jy_ z[x2(m/|rFs]-p M9w5!S+S^H=@V s.w^rȻPEcM _ULeo6|iճlj;ƞ=n'<7oLOP^i.3%z_oٹCFGGyﰘ07;g~V9r&sdvf.p6?v , "OS߱g9+ӏ;uvLh7~:tW)3.tֆ>I 3?Rd2AwO ܺ5IssSEuyc8fvIԶfCo/dtu\rQpJB*"q]NK5^JW4Tt~R@BoMt]OؖچoCy&Ƅ썟E]-ӶW? c6k f]}ҦwAi֠3/.EGy2eG7e`q骥LfZg DQ2O at6oPΊҾy:7P\4tb>c=ӨY.>\Poo柒A{X/g *cƢ7>߾r?+xYNBB>q8:zpR.I;t+:7csIqإZq8kye6lBc4}u<ۿIsXCI3K2ڈ|E=Uj hvuub[X^^c<8˼Ɩ-[p,6f뜾8zЕ>nzv?K~aKNޥ$ Ã.E k6&cZ (z T @fix<@&͛7ijjO@ "x,b׮R) "7opUoG3Z(+\%XJ1=dH0֧#T)k)\5Z(y[c^1=Zi`/£t"V.KO6&UJ"Û\J4 /16c%3DIW-Ss(׋NjO!X6D`GguvԳY2EPEzX&=/yOrmـ2bݢbg"~u +Jo[ݾ2G. Auu3bPuk* XjU, ĸHI[P"\ͣ"Iҋ~231G#!$\9qjoa/LSԁ--! C$)6emaQoϠ6Ej3~|Yo:ڣې3ZAn l""$ ?ox^9n޼}_%̵ȫx:&Ns#GSz֙*"XVDm;.qc69\a6nvEgZKhwiKg.00@(ѽ-f<ERnM Dq?"WvQ;s IӶ}?7?Iݒb ?$C}0'<IӲi#kDj-.EϽ <&-{z1ZkGuqmj¾}[h(rW9}i黏[ oKHpqYc/-{'IP޿PUSܘ,+dYNȿ.{8̣GrLw[+ܖ w8u;8s~( 3|>;ϵwι_8Ady _J!=zw#pxS5ȏR.>t4JĪgi&{PwJ!wA,ˢT{70?}{D0]m܈eYLO0:6Ʈ];I$LMMq5~X,rk56Fp::*Xv<(˙uc=D-v-SSȓZh߼`{%;~ $^WUK%|  3{@';yJ)qb1-C?B'lLK$Ex? WjذAMcIaT!z"4l0KvFo`CTGR@F@m#u1lvb#,ft뱶>66&8v֬Hֽ}4lDhK@ oV>xx#H=%9Gu5Xumm{Lԍs+]i"T}s?>m$66jN| Me|bWFkK91\tfBM$IM@)ťKYZZB.Elٲt:뺜;\hkm>up"buizԑSЯ]`&j)P# w! z?KR=~ԯ|?/V&2+pwSZGvv}m_Ѓ#j^P&Q?L@t1 V` 7:e(HUR U̱43Wng+{Xt2'+ruKZz⛏ X`zTY41gJO.v=VxVƎ_mkhJ4~HfmEĴ-Vu7孊2{Z%D 5Qn 5+_ :B=AFX$044ċ/Dxǘ\QYi:3KĢ6dtd2JU*A2'ykF:i~ XbxQ~<^65^άZl$Z#/ձ ,yG YE2P\ׅwOhI}>.>o LX.k p4 ?P)G %/AlkKy-9~Yŋz$1"٫/ GS]iINz=V-# E?JWK'\%8KP$O#POZft|9nPU݈%"IRn }ӟOq,<~sV[˼r"{iVmxeG0Ol5QňgY.o];j*mTyk׏IZy8O9K\n`CW.q; XN nv#n d&*?NaybT4!555199y[lH@ԎP(uXt%ևimiߝWGwIvxxKן8AdM?j_J?aPCE k"yE!*dy7[UjRy :{yJRTs{fn؜%-KX®AD=@`(ILD| (*Htw lN7Lq{,HXs9{[ by"q#AVȟU@3FʹI¢R ARH<2ϛ$ ;zdk<*]ձiAdL1cQQl-q煳4ԲF#6KT&"(K{ԑpk6A e2HFf):E5>w07 oXJY gQd6=k X?W<7ܳ孔K[RgSDp1[Oh8G 5'$* *-<, T=[Д $PEYzA^p-h. rY&W_%\7͎ ]vDPU6d~~yG9׭w߱C玿l¤]6|Gww߷Sv-sןeƻդ.\6UMR;M{{e!V)cƎšz{-]ƠKX,zL&&-g椭6Y>o>Kb/aX4[a˴UyxؼD?ƦۄlBdLrn%s<<]B IDAT{_-g3f~#gѨÚho16V\IOC&K,4Mi4-ZI'0uT VXAߚ5OR]l4m/`wX z!^Qu# }1_BX/$AP"0H,A%EَN% b#^KiW̲I$ $(7B[a\eL8lABjpLAU YjJ]\LA2d-P Pv Ԧ 6dͼ3wBry`teq DP˫R*%eXO) 8fGl^s|_rL8v P80 nJfa.Xȫu,un;0yd&N1+VtRnV~SOӆ ڙ==$ $YXM^$X:usG* <$ûTtU%FkdYm3MCۨz:ܞ/Ԧ .%`JӋ[bz7“s}ݗgxTПw˧^|AA1m9$GȘ{ ċAMË';o1}7ǓB2fSf;&澔ien9$|x7f~lM_ֻ17߷7N7y6/9r$b[:XgN _e٘ڽf٦w/$UapαuLӔN'M^\:)5rFJ˯)t *Cc8cP4 ,FZZ%~"!iHg<0RTH\DgY,G@W,lR_[nj9o̕$tC=q~#:l4595햹cEfdb֬툵W_@:Q%2dlxE z@{.Ew@4sS)<@ t%_R|q0*XYWמyZ\@EW̟?x0o9wGumك#"O2mنڋc=U㢋. .`y2Ncms.\f'NZq|DMꩣ==I/c+{~7Uej6`lr=ҿW.׻f_ɋ 7pFWyQマ3 hD kk ~މQnŏrށIZ8&?ҿgIcۖwʱSzuma $Y?jl6ADX|9}k3ss OjxkuW >IG҉`[ Š|*qN"A^docDY^jk?<i_sPD@s.|!e(ZIRHZE"1l9oPAG@hyC1498Ħݫu`ˁoY*K@RsF3#ڶȾiY3^ǡ:vJY3Q?"XI$ 򓢎ŋM꜂UDS׉[N+c5ۮ"`ٷYVG}hzTpB{H<,f9#ol y̫ph`L"׾5sOu8 7ݍ0!W`Y8SxyLJ?a_WWw77`n#vch*<Ȳ hVc뭷_UYWངz?B?y@~(u>\63;Eue+&0w9`#EX1}[M!b rSGK^"8ubMA$#F:賈O ʿ@ffv;]Ō1 i,jO!˲0œ@RIƟ ʾ> ´jmHi38"Hxp"8!![>|i(R :f`A*ppPUT&>,h ӹ'u(itliP:Itb| ܶP,-nQbװRZ<;d"vmǂ 87SD3nwrqqy硪xO}kxL0?װE=.[)+݁ߌ=T-:CuE2mvwm=W5۬ifxM˺>v6M~Y;X k=L^qyS  rtuu1g[+<9jUlDYB;ŔB%L). 1{B!"b]4qQG*g WwѷN@$9*ŷ*N&S{8ɾ3$ um4!I|C(, vh"`( XGRhPnu<'ֻB@@(Îet>,cX óݎ2v&L' O{FϟX3& ^f<y,#.'ƙ*Wڢ$-d8=oaM+cP6Kd)5-hu-#[dM}FM[ *TPa=aq#bpW""q05ܼ}nR0S޲@> 0qB^sd8+(8_P4,.…\\@e 2BJSqE9 /\sQot5)iPKlԵɵ,mgik+ e ڤd*-qJ*h26YNft۩OeX Qn\L"^ ˼4gC&(C > ;e)4ݸ^7 dWUYK+H=!qBzGV@8^Ax*UPB  UGWh^$QΠ1 ]6!ڬlS"tRG%&9TONBBpnbit\BPujbJF$ƉzwErI_4` d9Ѩ3fLczbp(c(SL/cZ})=AKkM_cb]m3hvۓ=Y;#R|h;lH՜;V@$ATe⡼gj"ex-lIJ6u~cPl]U̗jl$SkH]U1µ ZAijopvD=bE 97IPU<^lr - Ԗ, m)' SqpvC{i>Cme(5#S*n{@y 'x+&+jԚF-:}gs4&ƭq7۾B *Tx.b$y]TB> DAֆ,!q)FA9{lCFcxAd1{_bӰ-6B0u EB6y.#&)])=L;Ě 4i2Z92cMtݵ!hC5B-4.u$#I[`S t^YU%ߴX[HL"]@4ISTNJtA)b< !g& Z+ g.+ʙTǷVrY GÉ(W :zU^P#ʁ03!sƦQ>22d-JdYmv=9GWlAV$IZǥ] @Y/I *TPៀཌྷЪv-Qp%gV1k2=ȴw aΑh( 'E;$gb$[ $}!+!A>--QgJMf]ƿ ~Pݕ;/>z8P|r,kI#I&08Ԥ5&춚_ ~zzݦrwkۼ y~ e2p.dp:yU#NCJFFMlzJf"^|l.|wV'{T`Ȫ*S`0_# 4!#8{mR$''Pg QA÷oت}v_@WJW-!tu F*ԜPG{{D(զd4cqcrSVPB Jۓ]rok{U:7 2L$rTHcQ>*~@'"JC*_ۥ;Lns&rئX[zea)(s3N0b,ڒ(LD"JxjiJOw6[c$#$#Moji|]qstwu7n=j$q$\5ۘGP& `ȿ<y9I~q}cxV"8t/Fhg +R21ZQTJ, ZɖXr2m.I!?`_J%f^&#x Zdpg@1NMICf4҄z7I2 ]IR*TPBg"׸H5L |cs!tq~œ)HF[%j0|Oh⩀*9'HO80T*ü dbcDɀH"JℴhxvὕKZJWWիbhE貄]R%4uzzEoOFrB.!u'eXCТN{IcP4ke"M.Y2a:mO''4[n;R$LWI]"e^.ʋb3 $!\G9λ|ع0`jՏX' r !L؞vbu?WfVExENx&r-Q.0]]t?r*TPBgk̃ǁb(FRqȰP2X @G:o"^CkwXv@,up8)r$1>\/@ E4$Wg$6D2Ԩ^NBt& aa4Ts7 RcQ&IB^OM0[`Uo2rV&ʎ4M7uz{mՠU^3 IH_va6qu y !V\1yA+6UQpx+O0"ͪPQ+'D zCXĐE^L>?ֳqRt.) ­s@P-GD)e"W,@K_Iq:dnYEDʪ&*\9FѤ1L4@x *Tx?CB 6 ÃFP E s5 `Sc0Bfm4ȷg~IW`Ѡ 0G->(8Xg 9Ad SԐ/۫ȈH`D5S7?T vJ&RCY`Bp\+- ߲4Z^Si-QOm0nk ߢpfMRlzRJUF{t5R:zJZOH3'6< +CAbr!Bb/UKbELT+8{-TC2MRXDt`r6l@'$籆82"ڂXVHH91R@A7Bhc*&D .UM>pׂ@*\9'{ }A*Sx6~+Tx.Pa]T,CF#oNycuB5~*DUl$BPvfW+0,Zp_Θz:}P؟F2#I"R-,n]cLo7-Z 5vFr$I7jF6=k5#.I#.  *HNxx#ʤHMgͤ #y |rXxe:g_5&9E,#MӃ"*TިPB O?{*Fbm}<#QHւшN$#P"6J(b.U:wk9Q#؀hHqc0(X(#"AΤmHr0(%"DboNA 0kK%Wo3 ED9MZB^Ѧh64[6:>Lq&& 5FFVHSZ-% DܹɗkegEDžA"fT jǦ߆Cq6BK.ɧA?1IK-1Zh71bWavJ^q,aAO`$*qm5 yP *TPB $$5DPHQmdQ5A C`<7X#>1<6m1fK% ~lzըM#vVj˓`P3o-$;\pˆ/iE1%8chOF}89j$<88AeGcv+5ʾ8M!MҚ,j)4%R$ibD4N,/"qMJe6EBW8dR,ŮC΄R>QI9Ajʹo%7_w<_+aALX 9X )|8xB7]*\B *TPa#ie*iMlDLfS$n4fC0` z4 IDATKdH v1b-FEʣF=a4]zaI(qi, #mMV%Fmr4IrmJHdŅ ܊2FkFB)o#t1,:4FQ#*VbR3۱ܬCLPEk^jhp!ck ӬDKѻPbkcvlZE4k\l*a4֞t.Z%8f_WByd;'A99@H÷s69g>(BԈ];8lĜ3bA])%^xb'm;5(Fb,v]D|IaԖO./$qW<FXZ]%=) b3+f_ղ,pBE+TPB *lpΑI|BMOpP1[{I85Oeu^cq Fҡkb'(ԦXǷU DF8\'K[N4&4w$B"5 ᮼX̤/tL8$\8 % "6BJ 6G^1F]El?Xk( 0^Y7b勧#skW)T@:&Jar'gQPB *T"N)u(YB\? SRf jxSwbp.b#yۨpFo0Q[/bSs-<AjF΃b$I +y@Pm%-GsڭB 8ވkQ#L-9ő5Jz($9a~'GზH$}!RJ# qӤbӱ0ZjbQNk; $9 -41**:PO#$zkɌ-tQl]rb#1Q 9w,ש *TPB "Wvsl@M:eͮ x|^~ q>'r xb$ꐒ4'T lJAfHS !l=ˊ,qtkIzmkO0ӂmFXM\e8@\L[mAEzv\%p G"_N3D 9&vYC`Y6B |qj#2QnI*ǧO<9=v'zGTV~qT^됋Pm_ʊKzN?// u=y(nߑ9ϡګt㏷·mV\͛7;3~ƕ+TPE\)1bQ:{*V d0!1Y /-Iib F %F,hbs͐7|3R˼)Hrlj6r>җuY &Y i,oBހ\wVBI  ý/a&pn0?C@TgbrIJh/]4!>+_̄DFHbXgcIJk̃=/k!y5vD۴yIHQiF5>_kk'a$<:j b{B{~y\}cdC'^ɍn!t:9Y4_^qWYU_xG8#y`˗pGfꎸ *Tdau5(VhyI[h\v-HcBl" e;Fl*8td N0E;^\\ 6vJ%B Xʩ0gdHeGF#^ F ,|tc-P9w4RC>Q" Y0ܲ4F<)ݜKXz Q ^;tz[EUֆ<u6cisKJC6Cpڧ\NQK3J X£ QC\)ݘ: 򶣏g?NY3tz,xgofgkre~/WbZ<#z>p9B9EaT.oxف~jAsnTvj3'q֍q3^'>s{ly`+p׽&Mn:p^_i;ױ]|5G 6Ps@f bR~ 638E ر@n5!!5Hr2_39QH ~ sx")IFRJ Z 4vp. avlsXV%5]| 3c5d3zH({vE$?Q 93iS-R1 ^I4N,-@$`#by V G,MD(r($ib^[(FisXjdš ='dmT3Eh9=gfUIމ}1i޹>Qe%f/>T1RgB5#W|"yrLb^w18~7\.~wCOw,}~t?ZߴM٠-/n?>Λ'^3_)GxG{K𗯿{GCd}|943S_yʫ=|~1rr낕0nK yjj+ۘ&n/joncʄ/>3V٣[ߺ /Eϰda JV#ImIj4wr9K/S2BWr{ഛ칓t1a,<ռ1sS[rϞ#c/fθ?gʡ“ {eq3~gyы;nm򩁪rE不x:_ḡ(::eJe ڊq]Ob('nkO8;8tp?w?[6|<\g /<{o22: ;'|MIګYxϯ˟|;.afgjFG%Xü邏eŴ3kZ-.rr O QdM_S&OZ&樣lS@D Z*NA6.FW4lGGڄw *m(_T~XvH.R7^eQ6Cʁz;BS%AZ; _Pu .\"F;,>gvLTۨ"zkf@(9) mgL&|=Ñ(k&_(azPbV$ЎkX^ ((Z=\ȡ*3J -܇~&jMβ2O ("`mPr ^!{BygOvGom-j|?@$‡[X~zNRYԝQMd~5KK)>´)z~N+b.|7zǸd^/ū6+u*t'ewpExIg7µ ?},Թ='26}O}:[)LP?oE2˜vΥܹ"a=ܿKjSww}73$s^{6r xŸqCpvocˆQz뭙8q"n)`$kŋ—D-My[•W]V3fyxͫ_nsr7x#ʜ9s޳[߾|!nF7aE\}l?k $l:` AQ$"IX0`tF`BFlbNMu3#D;:r7eȅM.C3"(HYkt%o[ 1w,7/!£dY~JcW̤UGXKD-䱤LT`SOYhXK: ?BR+<+PL\ǢR{.Pn=2q:h 3 ?ٞcL~(90}ÜwG 4eu/ütZhm⬏<2ɓ,~tqzxL20q|²%ˋ&` l_kW]˯xYu-ܵʣڢ%EÓBO8?} ǜt4օ3د}ڜ9]/g=>ɇN"K.k>‡_v%cVͳkӐcWͥ\ĕ?>]k 8tN?4|)ۃs-w3{p享//8߯Jշsgq O؆cir7ٻ^^{7}_ks-6˷O5S~x%sh7d 8ߟ3~xW5|۷0NdyW/沟}$6>x+..p]5s㇟ ˥K|"E\}Յ]uG[ &o\ .xt~ k/B_y. 5n /5_9p%_:t%̏ lVx.o7Lk7ҨyGN9I&pWՌyuW.~sMmoOgm?ڜ2v8?0~10`k*<{<]e94դ1r!Bߞ;Q A_?+WBٴQdG,Q?7 yZ| Y^%8KP !}'vE> Rn+ kXFQ t94k 58BE/HBa($D;FXc9YD-@a5ԿwY`"1q^M{dsqEt4/LĆ(`1aw#geKX;O->¸ cw5AUiSb#^Lvŷoh_O%/ىA{qՃ(mc.e|b#$Wy&z@ҍ}b97}&?P40~*ixx$c1ƁfC!l]ؼ6i+@o_M #N=C|>)_-+ei[btT 0|.R< xK/y {H0q 5khkV1Gim;x^q-!O9 <~{Kwa~Gc05ݙrG&z܏\G}7W1zyrwk|.,d5َ?zfp Xb $!IFz혾>04f}vgf5v{>4f>AxApqksK_s6~woq$)IN Zʲ_M}%:SzM#Ӛ`G)H/؇-}+cw?mqgre18Dub$I;}\6h#D]wޙM6=_=<>z| {詧SO=g=dʤI:\8E}ذql[  /XZ1߰4*Iܨ+>llSp<مOH q.%EP U/CG@21EXJTQd(Qacn|ص+| :'I"A9P s P6j^ uU r9)'^=˂Y3]Yɽ#%9]}䀑k+<4td0~XL ImuD|̱){?vr_x"ɜ/񹏽/=>mx+Ȗ_yޚp&9"9h,a UFa/A.ΔF]RhK-xϿ?H3Zp\6@|WBGw챜x|򬳆I>Yt]'Yr33F$SܻeIL7Iq1 w`:bXK/&佽8Fޯ~5 -Qٹ/cْ0mc瀤L:YYx).'cȲPŽkC{\#G"fY,Y/o|ۼo.cڴi&s1(=E&| bt/76Ztt::<%;V>0*2,!$1"FgggqxX).JR@Nq]}7HGf\r$:Cӻ77tMNtJ>ի$n+V~ݫO>۷ϏNg!  #.+irTZhgC a` *U-GN/5V)lV=W-2;K 9H+ X͊2H72k#U_jUeץf0Apq{"MXj#$Piwr@cLjdeE\_$8f^jB8l>~-c\7Ц &R8*NJ2d2YOM۔M;E>MAQ/(.垩+Р dfEC>z 2bv4ҷiyΛ/|K+H=:ކR篼/U7d֭iݺ%ͪ-K),e_e柸! hڴ)M6KHr|M~g\ˇN.d ۰wC|~nUIs6fFߪ?COiȸ#8/ Tg*^|W{VA6ݳ&ϫ@2lSXз*@aTߖ=,C-XH[yB2^yɿ ر>?rdK`=ۧT+~qӀ͎?=?P ~3饿ﮐ⯅2/3w.唖2yd7nLaaa͜93 l |!ۜiӦ1}d+c;)'k$b=Fo DQD]BvnahUGl Z^N>i5$5#'$j.;VU^WdiR\OOW½UB_*[CJĈ ~@Fc\@TLcy~c\[\2cGZbDKQ&ɮrpeɔ)SdܹRRR"n̝;7(**,[,ðzE@ jj-U-~ٽӮ묰?ܠoMݶۮ $dCu^#xoD7 y9 )bGuy1C_Aƭgoq#؛&\3bcГM)+ylFz SxwXy').ϻ`T x/3G^~3Q^T 6߁.?b#8n,,y->aeٜ~v\̜9oO[n~4/w>y٦5 ̯aH@@\sUK'`)7%?- !H,ag WG\^YE uiHV%MCB7O+28VW^^>Ug!ߝr^QqvXV!_ϙsOeŝjjqVO)$39AD|=v3v!!U9BGu.FRPPUHDzְb҉G0ӡXw->~pFۓU_„PCla6%ٯraYDZ:qvOB\suȏLvII K/YfAS0_iFbuX.< Bt !k+vR!P{|.MAv! bMap61GL,ԅ*iG9MBT4k%SDpJ1rG(^'e z3"` :r٫uf ۑGx##I)_WNqI#I,}A=|=J`ӓOpŷ1A-]Oěm|A v!&, DJȃ@_c'Ѡ(JqE_ݧ%R팯ɭӟ Y5p#FcXq*|G}}H@#W0x V(A&lϥOReee<1{j׮M~hԨQduO@;aA('̀#R@)PB ]t:ぺDZL`DmrZQ7fj 0=J byȇ:+lxv*H( hh}$K Nc ]K-EČTt0a <9%Jlq 5N5 @>m~K8'BA E4jvm֟lS5~fޏ6Ak&o9ubi{fŕ5KFW qa (H"DJ ia#hP>guV~p XUNlBNO2H«x{{%k䡲0_b)FVχ'+#Xm'Hj-$W"1@TWMl`5d-;|)UmHZ#??crDPhsi^(H"E)RX?ὓ00"/Io,yd%@8]x t ~E!v9<#tzvb;G[% rQlqkl%sß ՃXP: O\ޠ7k XmT$x'̙z8s). QDMks^wuq;IL.O1}jVЄmd} &NWڲ 6=ڋC.եX P@P  2R#[#V'D9E)RH"z G!$ T̋i[Z=XR)^XEܴO5ԓ1pq,$SlRuBT NHl\H׉MvjΨYU sLFuӌ]8>>8 WQD5Tęn#fvDV ^dS1٨.\J_ị!7a:a$mw;{$.Zw F-hREŜh;MXU-If@vjD9E)RH"z GB ȆpGq !A$D$ȱ9uu1I'ӑSd(#IGqb5j > d\Βol `% m⽙|ą{BzHqL+ 2FԎvg[_ߪ D\t:[[Y"?ؚ0!W'=˹ؙ؊+pn8Dލ^5@"a*5T\ŝb(x n3 jr649} R"E)RHb=E@DJUC!Mt$A"_7D'ٷ73:Í[S``^U'g Wb#_N9>+SLp\<)S~tE$lDL`񀅂$Kr:pg4[ƶJ=,SLV-ZeUn|Hy1 Q4Mȝ{{݈ >g^af((D#.ZO$#*:}?Z~'c;hHr&˷!%)RH"E)O86" B]g2("so[H&a|~82jp#~c_-`.\AB+Chn8K 0ݦL<MHb-xBHMe*1SD@3A xg'H|0i\ΑAgײ eZ2L+Hr0\[YI]D%`-벰#d@եqY&'`n:*( bmP23qb7{\BɰrjΨ ߍ(H"E)RXo-de{׏\_<P0H2˨۽Md#^Zbw\ja Z@a934 TmɡPqJeE5>SKQe}&F IDATAJSH` 0w)g7_=@o mo[Sz{bs+^g<ݞQʆIS/CQlTqoK<2Rn?fk +*Qpr:7 T8w+ Am>Q\jF#׎̋jrȩ_+VuY(JF-쥝Nځ:y0n V<KM@V}I%.B)RŌ={vة#vH]:~Y_ ~|e>_S=?ݍF0$Bf<{~Z~Ge@!ڪ⃣hã[ڄ|2%M:pHX{ky֧izCWԎW;i܎"Z/ྃ3.vwqvZQxpH0 8YLdq{F^"LNEILNniD$/(aloy5PGKxk&)QUxe T~ }!-D{GU`яޫc>&2sv+N @]}dNM&gj&sy]E鼌#T0c>f3=~ B EęPܮפq(+y޷byf+El$YWNc<|\rw.ƟXO.H"cY̛?9s W٪ CAAՊi]q!z/wGV?ȁw7tŁ yEqcc߲?3>8 /\>+>ۦ1>csx!څn dSyցݍ=#^gWP+nӵ f,߹g_8aN8Zrۿ{ٝN3hg}`Ѭ\]vݕN8+xƍ3kך,G!Sw'XMa>fy w-m.'/gwtBhɧy5|e ?%UXY#۱ap9x]oM;Ai7`8w<U~}N:ʠaCy'=pmcOcymRXrnxB/G. Wvܗ줋\{5FI-UX;/2٦ʏ<2$νscG[ xki?z.rNHotDL@.dgi=6x1O|$~$Žppwɤ Tdm>dV"» gPa7=QGkO|‡ʩrNwi]HܩooYuaYYDz6l4C1 'U[wchl2<2<8iC6ވNiץe M8׌y}6sʊhյ iE/3ީ|[Pܺ-tIUr=-vx2?Ex`Ļ|\eGx[-;/j1!lM/`Ve=hU-zUTe֛r阩LRA6X*xHlލ->s_,fYa=v?C5BX2{o/`ezr@+ `Bvu~)ǟ,ܕSe5ܐѓSvEP1GC[>Y޼-Ւoz>YDIa=zڗgy៯3[[r=[+N9Cu,n .yַ?6C׼Σ.d lԊ3/~-1Xy p%_>o=-Tk'V9M`ȨX2G8ߗ4ՋoFjݷsDYPwJ;p=?ET,_ܴ/{\2afNP7Ks_ak:ofdY=}TЅ- |׌բ|R++tkPºluzkaLwX!rL|i OQq3sBKX1_8eb*N~2x~`=&|7J*'jچ\;ﺐ'0c v3<`_A6i@a-ڃя[ ~{gEed~O) ;w^9nÞc uݓ;NߔoC7Ъߥ Q_B&w^ٲ=9WI,"Cjʕˤɜ},m@Gx w'e-"Oƈɖ|[aeܸ{EycLi4 ūoNc]hdHrrhv;܅^oʼ{lwC4qݡ ^4̒]+\CfmiݎN ="k¬Y8Ӹd2̜5-ZpwsGuÇ~or [LT 2oI]5HL и~9Y~}e 5kQ%-&NqݨC,ZZ4@[$;0aՓ={w ˗S:Sn\  L.x7gNX:5|C_ Q?R-hܘu=W4j.Y QΟp=ڽ;]͹/.|r*\چmHM?ѕKz;Wn4GܙL0ѩO"B_<٬P!~~źw-&{'Lv{B!;m65 [^V^duˠfcvپ5!!.de[sL@aVtm [hrSh#"L~y{FMhݮR+enqм j@akQRBVʙdzNͪ m{@{F:oTU )<39GגƅPtkuLEt{i)߅vuڀۘo|Y7%Tx:mRB6Ce̚W@n9|j"o, +ڤ,ݎHF6w>=z HEfk=ܢ իfXxvҵ@c;z5t%/`}۳MmcdhÑkPdlU -dϣ:ЮnAU<`WSy {jIɄ)|V]3زmvjJ 5Ա.CjBk+Q}9صvKV,ݖ q[ b&ϽRo˶ZlI?=F[~ېoN(h ,l* kQټD>i"lQu$㿘KEՆެ:Mo)/7_Wp͐qC\G1?H!#k30KApծ#y ǝgu4 d29wy}h)_~iwBv0# ,b hk8Y _kaB=crWp綣8sZ],_ĒJ8$$6)^FxUN2(ICnƏВ^BOcU} (nPL`єgs4\0 9"uR;六)n@qԕtM~dV2A<}>B5e B-w)[pȝڽŦ]ۂ^!H^DbᑈXj[oWU)NHjhXKj{] >OV b APPP 4oc•_aZV (q,^z5/6hɈ e˘3_|ϛRDWb6nWR8 V~5cJ+ ;Q-cy=$ ޖ!HF݈.eBFʘ9;*\(_U% Qʳ!r.fծEBE7)ņ (s-eד8|w,=PQ2E"ճy" ԬFmO2!@ @vTeBA-Ղ2݆nxٶ׌v6P1C&|SJE Rd}-gbHy 4lW(4lTEKQGD[4ߗebfǰ [ʜ+xDY,(y+~eq3ńYtrM8Xn8n[3&5thy@֑q6viZO 2EUYcv<O۟3x:J(/]{7^ڔݎ: ܎w5.eΥ2Si{\կ5*>Eo,I-sΠf?ceܔج=e ߂Pz]mم/ͻ}ŽU~0C\:V 6qܦ fMn}/JS7B}n6;YpkzU|϶>vuSR\C5D* Roˎ\zҧt l;":7B ϙmA2~7W*$]kWІ=jp޽ӵQoRDW[-ZwBD;:ԩ2o+!l^JePL䤋䁭Kև]^ݝ{lD)l Z ?j4OS:PS,>bnny9NDjl̐hdr:W۰O  ݮOFdLgڜl/w)2(X>9<ʡoN3?"W#:FAW\.3Il*@PDz*!vYG 6\ q\ hP5\|EԭNs]^CTPpE }0Iwhy瑴ڐfCsWؿڴؿ"W{I5nۊ/BFs3?vg';<%Ґ'ͦuc<}uzٻ@Ro{d4cǿOpCs75"#\8Ó_ Z_[ZKPxkiev &j{w֟53@#+o{/ѭFx cɃxu[J xxgygQU 2*ڡ/n9;.{["~9w?U*l=a{ѥ ЀȮ|ma-k/u}Vsgq۬ږ*=ZkFߛ=;wpG ֮ m!uУϙ_|4~{T,ZҚ iӢ*Bs}!"PԜ.;L]P+|"!Z:S#(vk߿ /ϣ$+3Y\cy$*TDPA3EYW0I݊'?/T,5c^6ڔ{br{ټ|3'\ȴR-f4([N./a,5`˖4(MH=) TQ`RU@2aqG=z{V E Qy7 ف6 Jh]q' 8CPiw_Ε2oeT,f޲X,\H5@8-^j#z_҉U:;5%Z:5CIRB{jP<;}ZRKѩF9R7zx&x3Źu]ǭ @ǎٳK>3uT&M0uڴ5fCߑo7?<ReCz?nܬW@]wןcᣨ];w14T>XKU!,`k_c(?%"YAP S DNLb,Qs@DT 2첻3ǫ%)_W^o^'][#/N]!.; f[lG Z4a?p(4ZDuiD>  7.r ҎDm~pZL/G k%9ՔWhKt֊|ۺTՒK+ۨgp 날u~!@E7~ Q\}Yi`qgbhu1|pKjuW:5tb/^!yi&==  ,`ZïYijSng߽O[ڟ¾dSoq>~wf1Γ#,9I9oݏ^Q3N`N(18;<cs]{I>D\ڌؼLjQ_cum j)KYQ)-YEԌ[|1c$e q7 ɞZj R Vt)-]/?7`M4LȤ.奔wLq!+.duԨs>ww~OọR'y$`sD͋#Fdڃ`s)kNv 8τ0f m;"AD$v VXq: c5?0H#2_ 5Z HIhd&nL,y/O|_Zw 88լ M$SDgjtpřm%ЧPD]P%3wDS=rA]ێ}PBVNvuYY >X6y+#mGԶn%" xxN@U6l@Lc) kV.ǯgG!Szy'}ŠtYG}:~1-gʧ׹e⇤5^صiݺ?FB^={<,)1xB'S_#CK^iYLz9L|R[(Iiޝ\Wdt||#71$$pH-KW98껏I #82 (4;wu1Y9c4W]TSuڤ@XgyJct`0jmWAY] 0 8iAVZ{\E_ۏm ,_=O4ԐE:r|//_8Td j.of0h9U jCM ;"a 1`Oq@wD|בm?Zk_ۃQMF  %@Cط!5~H[oɾnRY]@o.[@0"Ɩy(b }F}0ƜF.{9p~ui/{/<)}1 2tO9ܣ{*|$њa#/bY#W/5.EWt1=zaQپNygnk<\4 tƏOSٻkWz :s*ֺ iГ 9{??*͎#F1~7cp%JbȈ;`nE"`|J(t1\ȹ졿괠~ F$G$hn5d} M`sHLq@kՑtU4Dj"Ѡr:X d@_]3Uum%3C5az%%f[Bh#JUƹN sf xz௄[Q;,Jļ`$u[a XG; )PYO͉1̚5,YĔm,YOyծ];/J5=ϫ#"D𩧟y*WG^= 9ƟޚΝ;Ddσx^֫ {wI NՑU`uc -+ Zg}I:]I*]AtT שe3Z5AE_KD@2\Ds1.gӌ.[DF UEUDDkE[2bBh|Q nA[dXwSXbi$a$lK AWزZV쩞J%Ž;X;gwvdZ ou1:Z JtubdFu#p"6|挴:m /۶ߨK-T|i:V &NJ' $'DS~s t1f12"//8?ctPoP8A6 lABØaV[UAXlY+%@h-N^E8%nJAD N`%f-F Y!,d@+Y/930кr!Aea|4W6l=Y7b2ZmiIrP:sd?1(7]QU} Jع-$hƂ%DRsmr1bo/,e˘27+1 C0%J8Lh;jG,YR2n˶E}aThZjcŬ \n?D|Ͷ$+̱EEi4`o3|A$ Ɲ)%qdtq=hZ(JD]DW'`amHj{v#_CJqh4=PN<j-o+Ý4.^/ru>Mw /bZetZQ?ʹ(ALcĈ#ӿ/٫gF W#7;o os ƈ`QIg-G[Y6"nF3ӆAa-3ؓ@Gp8"L니:#3AK;4XB`-`Qma5qJe\uA}k`(2nP X ^ u[EZͲv;M߶2XŖ09mE ZA3-%hrJT8}ZYmfƶXTu `\;yN{Y$䬬=vߝu=r:ψ /Ӷ 6>LP7b#F98s)oL$Ljk{"&ZFu?4\7L %ʖ\9rp*H (*9x3فإM KKF 5;JɋFl;=\SUIn."vuj X?V"Ynsnlf - qsA-Fϻ!$0LVMf V.r+2*nd#Z&Pf8PB"6Z^P+~4+gn%#E8"T)!'>z=wkPVT>8neKmZh @_+/HC9u"b͝d$Gy6ys!&1h 'q\ùev^i=s,x/_sˑ>>*ܜBzѳo': ?GOgɀ>{y]/s,L#F*PՍsJ낢?& 7sPbŤ5هpb<<4^{,+x?ȸ.!o,.=K0gxbx/;coUaB.(Pe枬{hdA^?:}(X"1ֺ4+}ᢻzc]6G}udlZV%AVܹC9lj[12ȘEr-%f+8uw~gv)wǦT4RAٚu}׸0]b}1iA JLaĹqmg?Qu?(C>|e%AڏgS^D:F1bRCꯤFmRiK@|ozEr? R,|ZN[Ov{ .LDռx@&7 #nO汼2IwKr/Z9o>Ψf&#z5* a;_0zpY1w ~\&\Й ˗g2<}#nLu#bĈ#/NF0JzSi}9*+DY}v`qUbaVht>KrΛ@8]ѱRU#2Sݫm98"}W1L `rB+[w(2nt퍋*nЕ~\j:_N;rQ"G=M:li!#RfMk,a7|-v:Dzm#XBm r3k(},,W' (/GފB =:4Ê;q椩Ym IDATyo3nG <wCnEF ,6=7־?*CW SHo4W}_+N=Qw`bI:N'zd$hU7GPAAtV;W1Q#cFx/)ۣ; 0lGpt^Ĩ!WIl;K:ryO{"*XmO#-L-+O}\'BS/beqm+]EƁK$H!gx;COJ@Mm]Ӧjx\.Vf VE3PpD{9Ͻ)'۷nwrNs}m{t0 t|61?c&=IYr xg!m?NBv*p7.|>yc9֋|<ΓS }o|@j$BӅyBDi|:WF:f;r`왴ئ-5;/=j8j16-eںҠT 2=/|~7`@]G%nnp푇R;WbSw_-+j24HF=;V\_cKS٬ ZNax;Z)g~0iK!Fp.YrqD[%TT&FH6EQݺk,^%F {hQO, U]bK%[SmTQ3XLC|#s0&wXǚb嬀NT.h6 t #}fH Oo(7|`0[ zvi >Ѳ#i{5-鱞y[ ND?=ѯ-+b.٬_۟Q2k&ۙNsb53ũ h! Җq/|QN~1dpܕ<<{/Fh^;UmCF? R4QPLmv%<M.{cݙ0ZW2oM֣v79ky5MҰ45'yM3)i>ϚC'_H1ԧm 47]La2i$3^;q8LȔk@r?4ڦf1FlP~c%5kD~LԬU'?|ؾ M[mU?8*#GZjG)+_lU8t$ d w۟.TU9.x?Sh^у0i4~6>% ^y:R1Lx//Ej`sء](H/2ֻ`j;}H>Xʀϣ}= o~tf0<!5bϹJ}3qpp~~IY\A69|x~|h˖R9}ʼn ~xV~Uxn?: vm?VF\#>K Y3A3Ťe~I\w>$ʾ||(ډ=O>]cbZ3i9~ޝx =WV`Z` =2D6$)SC :6zQJBMȇAQr#X (pX2 B,wa_Ka(ǧ G`l 0F-;~|ѣ໔f:U׋mwz5{/qmIf-곷te|Ok"_^<<9J.j6Wzk*ƋjȫQz5j^ݲ V}ӑ yf->^AĸGM9ekd#B,fJ&EUe% j~=6s~*||qz=AھK$H$$4a-λSУKr5'#O dQ|RhκynvN:351@a0rⳌ8 ?Mw~)\8aOjo}ۑ'1rSw&<]H\^{3󷻀WE:mPxQ|t.9xf$_/'\s+p=/0Y2/V;̛t11MQ㙽:?35{⤁n\T<%o`{x{.70⁩\q|}Df@>x)~9ng |wOΔʧ?sɤᶳ(f|PN:uo6;¨! _b5rOsɉ|xhf,Wg^UwO-Ȼ{[/abvܗ"|<;_Lbpz|.3H(y%4LZQ+/AV=9p,x5~ai|h'9b7'+ܙ~S60sTj&oҗ|>>Lz̨GM^^Zx]?"Nkqڑ]-.Ci]?Vk: o{b5hmZ~dJҳv YJ>x-f',׮P:9f5HV^>̮EG4pz+ ȣN{Ӿ"~^= s gRjoËNb%h4}Pɼ<@jխG2/oٶC'<ϣisS ?;v$o%+嶺wH>r ܯp(;{ǎd{oy1~f71wLUy-ȱ11gWe(2: Ui %zm,eS(cmXG-R+"^WMnq D1Xl@ト{0(7.l0Ɠ5`kԾ͉xu-^c0c(s2$ʿx c4n: 0ӝȰsNaxJyW(oUF2=<\ Vt".̀>~Tӑ7Lah4q[7@m\C7 :3Mh{8c'OҾGy#5i'x~+WL>\jॗCeݘZkˣnQDQ!̆1 55fɲrV.A5k†1:K_yv2%o/3=kYͪkX6B.}I-_-a7)]S8rkXY򗓚?y *5о0$%QFnk% KCf0P{ tp.^D/ _| QG@<д *Ȃ Jٲ:%6 ڲA "q26fGW1Gʠ?rbDoFް& h+%@@t_+&w*hE t!KHܣn=bf:~׎gSDÔ HՂ!z0N +qV[ذ Gc~+giP&~·άTlSRY6pW~Ո1QÐH&i4zp@gY|Tw?72WA$/GOUoǼ2,zJ&};^v!5_8ϛW@)+kC#n9[XJ,NYD[@o(ͥ|5kАz{q=WK-3i~uVjEkG֔PD(KA>%,[^zO.{^EKwrH: Z5Sr?z G9Sn6n9`۠rٵDHEz)kS.^;b C]iR&Mj[u`WByI6|R"#Bv8K:jϫWozר}٪y\E_ԪS5esѭ\&KfCH&ԩ[/(㿇<UVZF4d,6z,~RF'=A|Keˆ guL[^Y`+1J\CE:]Wӌϋ5ά$N x&ʩ b]F2 8`Ľm_ *-kuEo2茉 z,(6 Zo~sS_ۨ׈6/"ou6m[`Oǰ4F2boХ9Ý1bĈ[#拙8}(&7 /.$#^Dv4ogڋM?aYV¥/~tX,/=>fӢwo琣DT!=9>Țy=u}}}Oxaқ,]|*a4$;y<8 +ɧ-}dd@JY8ueNVQ# 5fƍ7 )˘"?vb$wd}| AȬ^Ȃ˂׀+pEp`s)>{'_GH+ait]('޹V;wv&M9HR2Ө9E/z@Yӧ/ģKo^$h k"kGA~c<\2TjWsETUTIIUUQبD^d2e4FjY'%+1OsbljhH(]F3+ADDX(#1讅@e  zqY Q6~ c:9xH]Q,vJq:E;t>֕^-%VгDK Ta|H":#Fٶ0q[7D`VDh]m>Pľ*Ħm`5L[ ;h~U/dceЛV6Q}VB j7}Z_-0Tam{́8#Fnʥ>i.;L: =wi/>a}H`NӿTh3x8qcκ5 zٱ Oc/;qI=NպQ0 e襥L|*25v9aPk&8&sgS2rF<"=]zByV(њ/'buʣf}u(MG{nFҽ6G_Ix́ۺ7]q&;ɽכK8rp&Y_>^'W(_Hl,/E> Q£ biOn wNn]+\ ^ 9w0nu096y{Y{1#n_NaQn|(/|\ƨUj\u -i<&_DpBۭS/Cc1U| IDAT~1dǞS{k±Åkת'vnWnϰKxbec)UԤ`8쒶4eXt1*e%+1^FMaè[Pn1) zJNiEAaCtӦ>N:QcZl(y"s.z98WuRU)dt͠ ClD*CWVKA 2>3 Nr\FFH^ϳ;Br9Gn_2+cK)D\!6$> Y R %ѾF2A7>~$fI5^;ۍݺ|h N&#蹨°XݛnY1b5kYd)--5nYd(++|ϫ]v^*jzWGDHSO?T>>zcKƴsq?!ܻn}]mL&kK;v5й_2vk?8,_3BNR^"od(/gEg?^ Gu9mls?2|w1ܲ,;o?>Oyi }Kn$DQ癿#a>u$IDy^֦P3wFeEkJYr*HU $bM;n_|pJD!=Wk 1pܯs#|o|[W5C@#%I@dP,<+i5A7|DE49sF3 w,¢"Ag l,ᾒAmN)/&y|T\mګ^)=';YMU^'uLȉuc%y+.Ӭux]zcJe%Н.Ǒd?:SFfL8t;=Rr$![5Q,e,!fFؒ-Z#aF2"Jݧ[ ?r÷J3ʁ 'ivl;lX_"BF|uUc`%kom0\="Z4aCS7Z L(ppID*PZQ``RZ> 99{Mq3ٵl'yjJFh ֹg1#F)vصvW 9n8s2[Yj@Ã| Auj95M1g %{*dS){%Gm5 "|:c/|?&/?wJN؄PBeE\o4UU|dգt!;7 6z$BA,Ivcl m(AUQۛ z{ɩZb n@ ?JEmXOH6%KݡK4N{Q%`DoQiA䃶 Y%] a€Xc!GaTԥwŞa-9/Yp}"[\J~njD9F={!wvpac}[oc-e•rc!hG+''7} H0rclvF\ *||_J萰o9C|a-=\͖KfZddPڮVg4K߃l jS4M}eZF7 σVaˈ>mSTE@, %F)6@ePޖfFc|!JB]@p z EmwGvW@Kkj{͓SLq6<>_%ɲT&٩9b/h%m30?l+۬UG`Ȁ_6–^fS zρ|f_v|^XdA+3d^֭?Sơ%'{ƎwqT-iWOrL#Oؕ;7@m{gБ;c>rm8zPͳ\{zvݕ؏ϻwo/- -`#Ffk+^'UH8*7i)%|Nۂr6 =6?DIoL$A-pӗAyPk3 AHNjQ_M#{r\MXNO#2ZjpD,KĒ_]kpUG$EDx(H kA v5x"$ĵ&QtOm<=r" ^u&;F\2CubPY'hcE>o+r7?D*d%V$hXRZ:}7-bcG{\C ZĊFq͓xnC98KW^t`Y3g(9}g&$$!b¦/ " ʢ@Y| QPȮ}L2qΩ{g7URso}/|hyzerʽYe;E!=uzY^`b]՜a_ O?|}r~WvV 5;CnԨQG~ey,oA/'/h*ᕄhzLO/#Hv;*ap<4;- tT j b)3 mA0ڎP]Q`PR1 TISN9:Z^뗀z]UEޕ>8U}w球Խ?g~;o;bl9)&0s6][LWN=A\󩟗Wf)*t5O~üR^FLZ޶=<҄Klry?Ib۳Zulf }*|w2~W&8޷񡮿s彏xj|&gyɄsȉG*@]sGp>Wn;kCUգcF>N漻ܨ5jxAxt^/zp]gR ((oCg! MDp16: JV2#je[߫L%zy+SCNTAUc|bJqcB,1B16"'@bPR(PZyqLJXs8-f۬D6z_c別4ǡ$-K$W;HwCh$W h.(A[>b bV!X96(/a(Uk1i,~ۨk/ S/ j2nX}v9|IesMZ;"_ަV] @c!SE 6ƣ@ "gyqĮx,8rڳ@Zy+:˗_Gx=>Rеxڷo(gXaCl~V\ нǸ2zXeiK˦g6fbds%v4R(sz;c~y:=|YuE;9wݷ1g |7/x/d39{<l@89a 'W3Ov쩜O/~Vՙf'syaƖE~qls[-F/w'cNfƖ_AU[h6>__7HW!ä=w=keLCūSs1H TTz)Wxc¨{~B{K5đO2fu+` #S ALՄv= [R#_ gʢ&[dXP1dMB(S-%Hj$f NNQy'8`DU"Va%,M27?MɪRH]ntB7ݭm&l)ߴH?hf01TWiDƫɨN~,=wr~GNd7VgǺ ۯNǟ?"oYNtq[ע網C^Ũbҹ\~|}S'jk݉N|ݮ|]_Nv37ξf_!=OFgr7Ig޼eX&L1ĮӻẌ7u4 f1 SYaXwu;N0Z Qv:un+l͗?!QV6̢"ḱۯhSXuEs]ioߙ>W3l~1!+ek#QFA[ '/@3@u-*29E[](>?vs⩁*64_RD_\kgaErY%ܵAz0;CE}+fMYt71RQ3 ZfFC@ za#-gjhdUU2۬X\->R*XǾju;*%}hsMUɣ9"**ǹ"ЇfO<Msm^5^ 轗_~(y~t0fL[u}uszӿy-qunVuBǛje򫙝;_pErɅrVsgȭKĔq,7z,;rs 3$K|xw?o넄",,DEibˍ5x'շ/[mvs$%M噺|u28Oaj洝L2ys* ˮZD q=sFi"ɭF5^{VR IJFq#d{+g/v {+~2l0 ZIURZxL-}" jX%H':񊼬ӓ h=tXHx('tf5cq!ia 0[fkIrjv bL'x;EmjUZ#|Qv*ء{%n־ť6no,<¬TQ,]ޔM>\U>Br}+|}H4]Os]v}yƷ~O޿14u^7zC܈6ܒ/zE7++SwSXq~?u1_gn@1&ObQ;Ύ3ғr_ݙ{61k'rWr|'M OZƜgoz$&2v,fGOϚǨSb_AO١rl${F5j R R E@A!ۤ ] UfmPr @˯ٳsU!)&v#;HN*EƯug2dy +-85P%PYcL|]^D-81W7K3&#,AKjgl`Z$T|5m8^6Nr}説Hik'E rY+T֗ZtuBUVl-_g>vӥN[o (_$I4 I^5ٻ \Tv?Ҩ^x#5 $htՠv(E~xLJ EG'8;6c3>;KˁM‡f ԎgY5y7<Ny9ワw2f{˥&fqoƊSlqks>1mA0`U_Ǽˮ9oͣSfr7=eѭšC]+n3&9jF5:3f4l;6/~uYw?`61;.|n=}eZ~^mx5Vƫoi{ҫoĒc/#ȽP( ]ڮN5?*/`UTۍ"RQCEK~4^ BTGZmkBS %J6)muU؝ G6i6 <4ᤇI{}j%5 Z==(]ڄ5)x~>;xz5jn;? {rU[G<Ĭl`C.O͠3=e')?M2m-//i@r"[p[9bm.[ _]&\-YKBcrƦ|#{žPY0X57 Lv&MZ}Hh~ {vE]8{Ύ_ȽV/ɻrqK'~͏Ōm?N_#蘭88/΅q3'lEg1mJ>V?C8۟fXkqx&'j>ꕂרꇈ}GE D #P,ZԤЅQE ňVƋ&1 F$jIßCNFvv𹝈' bML6#ROV1rY8b k7JNlڕĪjLhjb IVU7h˨ ,A =j\s1o%, 7\XI{ Y)*+Gz{׃fsW&䄇׻ Dn?cBSBݔvNIQVƫ=R.`m(.bD"|V RI$HB(PȢ 9;e֬Y-̚5j,\H)u.첝](ƨ8Ux%^ܮ/p-[\5^kp x ׉&5^hr{om2e~-%rٴyࡇ_#25jx-AUo71}UhlEQl\cl} UwQ7 Υw<߻E 3K`/޼d,ہ :r(h#{ciCP Wtȃ`&D IA OH $I^(PxnŰȬH%BX*)3Y; [F- ef}S!w}6Z -cTx գ{V=Q~Tp,.( l*ZVBV}gK泖Q{ص털X4;4S_kQAEeimmLc.k3|Jeo#E)$$즆_*q-*MCk3Rj M4ѠEgc7|yﶇBg(1cƤ)S߯ƍ)S:묣sL rW?j\F5jQ!9I `FJf`t%FLҍW5$I]H䃏(GRyaUE(0?m#N^5f8 6]MyQ\)^%SUN$#>UHx#= GQ+Vcc 8.ӳl"[5UP{@V]&ZFU*-uZ_mǦOVfׁB4j.B/Y1jZ^ok$&ص a=P`U0kګ;dEM0j\F5jԨQe )(xMhN{a#?XU_\aA\]#'zֱ_QcK&lat5,:HhCT@hzVX IDATUJm.n# J U1A2":95*6:e_Pd"jmH$)^IE j&_#F2 gb[N7=\X]HD.Qaq=E6655ȉ+!fGn|.o6پRm| buB7_ؔn*HA ZDFy4Xpc{r5jx:A,I FaQ  Ax@#41n@i jEGU.$Ch ^$DW$Ϋ1A 9(iiz]EJEս ݥ^msl³PAS*K#+͎Ei2y^E.e\XW-2j7'3sk9 IjuDTL!+թ&W=Fع"|w!W ץɈuBgh\w PnmE}HeSb0-0/j\F5jԨQe z=TYԴQd) 7dn5T9ʋbC4 "涜N /6ZHwU_YG; 4%35!#m8\Y/xJy095%"Ć3fb\xjqb^=`*7<% @`IGs (רQF5jxBlIp!#+_w (:y;6ET$ H(>f)WRT5QA KhH[0vSA6 $_y%DI,L흌U_5|7^&8* GmLY|oK3 e(VPA*xbӭQIF%8sQ/@L[]('82p* -(7**f#y&ڦǻ+v&kfQHT 4lziA3#(רQF5jxB@DXg5Ce9kyh7JjQڇ12N#r)ɒ F*#&Feܾ@쒀-7JWnֲ$[0QANb\jW9;3&e$FsV&G ek(=l:(5y5dTW7=1lMRC\R&Le-vRrη@D%k@TQQnSD\OZE~x[k,PH҃"//:IDF5jԨQbY $da=zUXށrkqq%Uϰ.|3+9|BNpb :6h":y"N~!b1^E;AsE=g^$PĽSөX<_^ $Sť-*G$ @ iIQ!ڭQPU%y>-kOňey ?7}k#_ 0s,ӎ$Du4c $ 2Ad8W8Ϩ_̆%b:HPEՊ{3ҋ(רQܹs9Sx[_?}:r&MjIQF :X?[O L0uح7^v䍬T:^HJxJp@ t|3$jSVխ踴8b9Vo^NKb|*16!^ qIJL/HIj t@1D=^ y$|Rɛ9ƪf_݆\&k(˖-|ckGņA1<:$Į LfBV*erl`eZk5 #De=_].|H\9S+-lG5QQFۏx7M-o۹ (/25jԨڂR4bDJV!gc:M.}lE;z֝JFbZa׶2qң`{F8 #뤡hP 7b@Ս /ǣ+x0bn|*۪WDZA+ ي4®ڔr$ՠw7S5g$Vuw# AReV˳smEg)VO~ &r{]X¯uX{LPPX 'Dޭ"|^Sm.^]maP5jx+^{)H/ sq{rS|a}}ɑ̏?؎e|\s̻8m FWD3^ID@>ei,k<7(pAa@e-g?NHdt YC9 Zԩɷ}H mJ6#W#˳CYl*vS"F[q*U;KBʶţHK*없~hx(dj")ɪ+uY/^KX;e.?Rهfዊ(רQ@٤hh4ZrXb׮h& l߇g1'" 'L1oމ=j\|vm0~޲喼sXk52m%_*?: `Wfvb5lo¦60B@LCY4 +Ѿ ~z,J>W\e4OT] /qpc>hyjBNh+91;/Uj[F4kרDI9)&RIسl5yEK2Q%vVձ9jUeb&qMYԐZZfēGq+6"ϏعտK=>B$O3l%7bǙtBS0g|9|]?ԇ (M:[$F5Q񲃪u/O*}6ӟH)qiqх<䓤`mE󚄵>2|* {cѯۘyꅬ|ڎρ(?[%xg̘1̚5 poˁ B{{{Yp!Y{ݻvmǢ^z~/}cǶx+E((R.@Xӏ! :h7I< у \b}0[F 7IP [Lu0-( j9. F4Ք x<&)eZHC^dBPIb RՅ`{7K\+B*DX Ti)o(`D3K,Xqr^uT Z;g v*0@&ef\Y=Dn0&HsR?+;?;–omM׫U@ԋشMvd^[5js9|+3}t&.cƌ4M:(>%_t-a'ɶO͏4MO939$~{_O{qt_w>ЭG 7;p݃oۆ,?vl];Wd?;=߱=o{|<= >׷_}}v{l=}dx r?{'~}t uwǧOYe!=r.44c[64콎QN]kq*{xw?ܚ߲;nk׹夏Ϝw/?~-qsɦG{}Y[omq^xjX3g:'NVZׯ*~̚5v~<3q̙+Gr̙*{y|娣8oL~yy\w-yQ.▴v,3z4[o̙;=ƿ A iR븗B鉕[7R.dR}BDB{ݐ⣭0fIE&ls5'畧eD Ip^|'Q č U_ M\DQYm)T[NJ(8Z#eظs +Syۘ.K|J5<lǥIOɛ&y϶k)캣[} JR.;OUJfy )l[UjQ; mbyeRm6AZd-.*΍5jx+fm8s:J }+cX BcY'Gp'}ڂ{}p ?a81_d1eQ;?<sVgeb_οSpgٿ{]9ۿoG;)zW_ɪ c0opگ 0|~?N8@s/~QFqmqubԩt-◿Z5`Zƌ˔ɓ۳kQMKt}5'VFQY7*?ns.X~V QBfSF*P4s) g?56=6 旚DC Zt޻~+g |Ep :SBVd KopЬ޸(h"D-Xvz^cQQw'V*:,7_s@lI7?vϷ3(`~=}z G^!hTpyw3'{jW^WTdF#~4ykʛM#5jԨD4Mhp 7馛2yҤm7ϝv5L8 ?a.[}Cl0yX{}٥ЗK} Gq}Y> ٛfAd o|FLژ=~ Vl9c.? w4o磬?@Fƞ{nkx{|tV m&==|a]<OJ^}/v(|SZ'g>6dz讥 e/`gF5U^?QvG}e\ ~?-?8ꪖ8߽OĹ*m& }YYFnهocu.zbرc[oeM6aڴio!+)%?ȣ̳⮻ȣ樣37OyZd hI߇ daed K)mQ%W@lTFE TDRr#K 9b1 vuiea.a[mT-y揀T~K6{RUA\mp!qs#z 5jx~F>\z)^x!wGqy{Z3g䢋.;`whxg[ƃL?ͮXxbV'@a(~U>e^2LYom+˳SMEiVv8T@Xn8t<` =Mh/>7Il1ӃV;.!8w?j&_4ƞK,5#ɓ&ۮrTTE1.z{{[k)( aӯ}j^ [ ",X8`*2(VSqKzتԂX˙>Œ ?*ƴp@0?4 K*bT %F UbmZ=p-f@Vmm$PH*عEԋQJ`tl:P)juը%Vʀ f}|B&AƏU B?j%<$FB DliSkϔH ROhX8/^B%@*ګ#  ձ*<~$;Q PkMlD8*e\6@ M^ Z5^|T;5jRq衇2}t>y4M|!vz衋i3{ȷe):f's93]kӘY0vd&{T~oslF&ȭ 7ۏsFzk1\~~ep#ul\ :3an@T3 n oB~z,P=t%nӞ[c`I.:E~2\q4{R{9 =+nNcsZ2/*T;ﺋfb``?3m4:;;Odnbs=ٙ x [q:P$2}F+~`ut)@rA!c Xlu M6+V@DAj.@S/ THby5j±sL:3f0c 'Ӧ.41j,SVy5z4@Q'rw䉞 o|;=RY`wn8}b8l޿d嘼s'?y_wvM:ƭʦ;Vt]OǑܓ|xzyx98gۣ:˽(>:=U_YYEwͯ; 2\cy}vܑ_} u;6h#5=xXs5Xs5ړkȈ?Q4(N9`#WD去Y_ڃSMod jI1 '[*>| ݱa)< AUxs*}㸭\6F#< 1.@>dC YJmTgkD KQ .bLm6!,4`#n,^OJoOט5|?g 6XwﶇBg(1cƤ)S߯ƍ)S:묣sLcD^/.@W~r晼k]vޙy&EA@NlQ$Fn}QսxCx "]4::) _;0ht'ZVm( MNc']Gx(+gaRaeX"6d|D1WT`#4oEZo*44ȗy-!RTfm:a3\7'E rMWYP2!(R(kMNՎүr=e?laOC64OńcHc6[!3qT 58Iv **4,$AvPYU|JvYaFUnory˪lK +b+b^U4vL^HXĈN.DX`!ƍmϪ FW &Mı۞\FWy멧Xnxԩեj Rhtk؇ <)KIBzÕ YR0ځyWߩgZgVA l+#TkTchLee*ըU.Pߖ4AEXY`DiSy>[C2m۳jԨQFS&OkO2Mgh(lX1ʃ B݇d#vi)Nt*1? $2+FŞWuql$4lQXS%TcZZM4)bq_@Ԧ*YBSQ$CI}4!5PU 4 ` @}C-<P,St}'kE|*l)5D(ERs(r:zeb->*4FW=qmZU&CL~0k1rUR[QzDꖓex {2Hj"ZXE3]qbeq"Dp/f$Q^|R9(Q~ +O 55^~- FVdiڳjԨQF5DF.FE^:߽萋OiFIS}~= Fp*$201D#>(H7|49)bVcUKH0 ,W3UDcƁS S$mڹ;DzNESw223BmDme`;tyZCe}q^Z;wdXSUu&o b.y";ڦqÖ vf랅eb-}F ^D=${L$\UZnUR(08mJ~}HbD2Y^q 5^a5QF5j4DQ]tth豨NI X  0L!蹔#m>C: o$~Aj%$$)P &)ŞCv)Q '@)60Rr`쟑H7r^6FrePڈ 1BխqVW94{~7,%D,WDfB.ْfv*$OpQ%_淑޸V,N̘ڈnT kf͎*^V.DŽ 8Je?5S:T f錬ĈeƬQF5jԨQA(F(::;)m (}2jN(2Xg^ԉ`Jt mtDYŸye8mN!qWpnϟ.L(M$&I`B S+ $}ή^+Ut1YT9d74kO;A\G"r1b7<2͍[Z~_a70 ۩"? _+.-X x6RGV\eU-ײŦGzrȒ|ڱ<˽tMPG(F/ QQF5jԨQ F )(|u  hM# rcGy;؎oNteDiJ[SFO!? UQ_o/$ p웪JτcK>?IBxG\ Ĩ-P'D Xq9JwQyTQ*?*HyT8l>(6uY|]*RGn3I ?Ϳ2ͼ 3Xfڹ|/Qk +ZyJ4*PPQr-kԩxmmzRPapiTnըQF5jԨrht9e(l]݋2!@}4"-~%/7mi #.>JiVV+gEuW*9E TPk)dc*dA8{02\l[L /8 4Yt{ݓgƵrKTXF_KVA6 XcCYO5 12GkԨQF5jb`)7,wхHa@ M!IBG |LZG)*QN0-~+hV{.iP51Q4PU[][X:TD\<) Ղ#@fsoI9w9^_\&bG۽ڇnI/XA XR"-ZډQjy&W^?K`t{&r1"KVOZO@ ?C-GSVKS) lqmE#ٱ]qyt׳-Ͷ 8\ V!]x餩L˾&@S??F 5QQF5jԨʁQtvss"v< Ͻ#Ŧ E;^&VIL\pϫO76V(L+H DOLOI5cW 6b !O%͡o(iI<GI>V\W1CJ)=9a }hɐR?(-m%󳼡 W"M\wA`1}[-k|ҨkKo2x[WFbIqCR#&ҨZDF5jԨQ+LIW2tv-CGG'muE]@:C1b{S\ L>:~T81(g`~xVKVĽ5M'hcZ ]xwRY{{ZQt'l Ev :5 232,/γC} |P* SQWodP֌zUWO*?[>'r`|M-UʢǀBCypMkԨQF5j_wt5jY]ET{A'u #zdQ'جQu>;zG#'σrV0Ӧqldl kR1y;'&j~YJI3:P ,V7!ߪ/w->eg ^-͆QmH7"_AnC\^"6 6BPX[Ym GwpYyUSR! 嘷[1[n*ZȯjCE|zrm#%۫" O4F(xf3 gx b'-AӣjԨQF5+b(ttttP( ?iSH^~XW= (rY-l%gDl Ϋ֙AbQEdUM dFDfji# q6L %ϰg^WBu!Aw(f V,u!xtPW75ЄՖrݬEk@J&M9=XXV2(J2s@|[q T(&, A5 J!BSOmΪ5vhŮ{I`$RgKH@Crl祜"Zԏ`bD}G_?n!]]#wVb#֚kgרQF5jnwbP!ȕTLoINVu/^{8^ɺ 1=aVCr*+]B$jY;ODċ9NG Z[x {a-֝vh! e|AT .}kzeM$廬0=5gRZ1hORވk[i=NlkYI;22Օ*CwEڇ{fv KL *E=YL9D1trꩧYL'b xrg8SIdvg?ުYvQAB=0Uo~]6^nre<#U(06x***J<8\ݻ3n8^\̞=?wcǎPXs3A;p=вehDD B0CI^?Y0XubCZQ1VR1IT.3k)TH8QJ!nZ蚛)BV*vE) Q;euW`\|q!b[\N 2:cʾZ@fNH8+ n"Ns`4@]#btDَBݷ[(n1;@]h-#~ jF¥ *){<-1v5HKTKБZjݺ}`.i QoDjo{1D0QuYB ?-U2n8 Z1|s9N8G}4ch[yѧ<7.?[\'lgNgϧ;CYP!8d Hũv̅jX\SC6jU$ON h*BJsa3A^KJ3 [VNhQEH$-]i47MNG-Q,Ti[X-[Rɺ4.+mN*g۞6bOS}/DuX˓hVnkNȒ 1$uLGc jn}Ƶ@|A _"=hgf͚/.柧e&e?jj\`e'W-`mRO5kU=+ƎoɬYhܸ1=w# CƏOݩlԨ4/1q}gv]:w.yGEqO+3irf 3Y0y+5P7o1Z6m}u!';Qu^QAѱ9JGcb׈t_@T$k$ցzSLZv>]*:+qcIb슝1p8ǍL5h&6jntIkڿI6Y}Cƨ]-ku& ζ6Xb*:CJaq%c?Cƺ(K-`R `,;0Ɔ'>2 z(_Sa;W<j@Os㎈;u^KMuu3suױ; "ۗ%d}{(xZw-ǜz?.J~V 3|grþlNt?ɳ2a^|e>(ZN?4C0b(/XP'aa)EFHm׿Unޣ}۶E+ĹoEEg^A} T1?.DJQAcco0J6FGD8׆v[gOkY&n0DG`Ga(k4JlVRY?jgM*:1U٦3$JޅD*&HoHJz{u_%YwIɒ hV:I;k\~G?FCwemix▨Mdq .~p#FGTN;_>m:[[/+#0&b$ !amdڃq~?xgq}Ix  ?P}G! 8g"_"DL}u( _Lt.%--y(?u?ě.$ncz.ڦTƥhtAFlg;b.>d}x,f͞M6mڥ "B֭iӺ5555~L>[%pҀ/rDڵmˋ/o!'|<ܹsҥ I8 wu_pa<`aM6wޡ^{Ȏ^O{ΝK5׌m=! 3ddds,^5\.HY 0kig]Tj']Tν q\l1XMQE@ co5Bۤ]]&Ϸy!Vj1 I*. KpuWܔc0.B8Ɩ#ĭAt,\0f[6U-O0@%vNP hc[NQƎZwCooWY&m^^+h2o06W(7fNt鄨n9%mo &.nXT>MPR;.Ƃ "cjc  KTiDmBiF6ל0ۘ0H?av9G='RQQgK/۳U> xM=fޙ_bNOwk^MX;J3ᅱc"c]'>b}7_5O/Qwmq`Fp]#E"} OMݏ!O+W>g+ᕱ#7o1`ݶK^bݙ^ïhs\vpxxvtU<}WG3敱bs;&deGϞ=1cFf޼yqx6GE.ǩrҪU+ƏϬY 8f͚C}]6dxɳ ,\crdg2{B=ho)tH-% ǝt_@i*7T9 RpnIIIڏ%tPD: ID~2RILz'JM8NpDv$چH \c; l7H-  V TgYXc~ucTd/tcِ2C u * 6HP~ruu5LDžʀ#Cvx!zų=QqI';W iѲW/ΡyGQ H=#{ ?;M_йxsA iFBd "nS?ܞ\-۬5,3=5su dg@@vڡ;C^9ڤ{e!_op0;vdm7;Arkn6.imجL)E~xmowûtBbح\o0ߜŦ}ٲXAqYmӆSO>_|+z`=]v1 w})m۵wtԉ7ޘȑw7>.8Ӈw{7یj?4`/RlY舲>4"$C" 0&@$`f[U3H' (F`MnĢètVGN] TCb$%AQ} z<]sSĺЋ۶㥵/tVg@8]ڇ Ҳ'D58<`mԚ( "A0̀Ȅ@B!@$:ͥJWY#TkX͢|֚k/h#9qks 90dz!"TVVrʩ?̛;߿(|3sƏTlAE4sZVL[C>a>*wO hkiFe=€Z%4YC(f2}޼~I 54ٓMS!DQ Zʥ U%?A@@0t߹{LZ FTsXqh~-ڴ&7x0np%<˂vqᇳp"^x 9gM;8ZjE&tyΝKf͊:_[>{>{M>*:ݻ7#GdL;ؑ-[j}:$ɒUV (NժQdPDt:0I]U!YlnEqrA-V4` DZ$$s` t&tqBLˢ0m1Ց~z웸p8WqipesP5R"عmC`/<(Z&7g@|;7i#q"nӈ!2ijwKyѺ6qeS0Q26э6HS*_ƀ?2CRB!A Kx"! 3d1d)!hBU@Z×7P<4,C~/XN#.Ț֌Otam&T ]az<HZ,?O>F7XF-lvֆdh|Oc G%Ɣ9ڴvU ~{1gx1nwN۬ B@Qgp6?.2Ta+Zj~>ɹ'K鬅 ˲%T?no7%R"ZR&O[׮&J дiSΛ1V0 `*+ջ7z]&}m AriK D ȐYL e1Y3w[5Q/1z*mQ@= DWQ1DCPDƸ]Od:j4AH+d2cPK Nk pZC%/l26"FW];T\5*HeL.f:Ѐͧ42ɾ( lR?7k窄l;/yg]C2Hw"ѻ"& `T+~ Fs"p3VlD)q Z~Ѻ e a@ *0=;rqY}%*)95 ;wc4`fv}m76%K&&= ]7x֋27ۓ?6û\?O)"ѺX~]\x}QtOՋ;O?CMH&~<{Z ^gN~>Z6m; ;s閕 hڶ -e'Kc{/o Ԓo?όB:djh>uK3o۳ gv(6o0gOoLuZZ&ۜSs1i(.G~̯Z 5%i[f~ٔX*1c7,Z;WWr|WYZnM&a܇Rx1۵#͒f2e [tyY>36X}fΜɿ?nӇq\bb^b9k1圹5I)Wة b0h/躁H ں`)H)jKg0\GShSJ+η1 }rQE@BS6춮rɈڕԅVWZ_7>Jjgu䍨uetj^!`m .Z#9#@Nn^Tr&5&t&ɱQ]cT"(DB>2DQ@T 9qKcGMd@TH嫛u'EOt2-| A@($ B| e TLAr۵ h@"!d3//k~,vNʯIoúݻs Yh-@DqϴP`(cgù`<~T.>χ7ey4T8QG1W_}A#`o;<r[ Š֋mݚYw #vgʂ=w攛N7`_8w1\~Ӭ{l|9ÁѶM3ފyn!J 1ޝoTueˣ/uZ39ߛNWϟnk v;\%NUJ{mK K7,[bgJڮ7g\.P^!~TEfϚEtܙc>-[3 0$ҺU+=`|I\:УG/ZTddtEatܙ-[~Ϟ?{eECu Y$0ʙL|&`a* wJ&`^sBT8qB1ғnϑE Ryg\T D8o6mC? ǂAG6yokVeKXbilypr[L+]$jc3t(-i0 j Ft"Q9(: Z̸(h\dL@`HFC  y!_HGB u8_^JH6MB6nSOoF6$9-Apn [ AYŒ:$s ^ 3zv(Yg roXָ*bРA2a>}̝;W^{m>}zQe7na66TEQ<]o.c"*0k4U:&Sg~˔ϳ( տ}@J;y>PΛwOMPw5:؂94Jvk F/{B[ C'>٧?IsrζR%y{'nxz@\wt|/i^u~">7;,ƳzS#^OhGQP(((  <_~5[2sBI2">N9. X-&N l+"CMD"B{*޶@{^q/I(DɹDnʂ0jy )J(If"{Z4VҼ=_G3g?Ҩc kٍL&c' 3n:uVA(,^ys1q̛E>_ME2DMЍj?q+wDD B]7ji zf5$2n.1gDDr$dвevc!Ҁ^@vqغS)nt!Qvw٘T]v0F{˵NZS"]wQJܩO0`u VHA4] F(8Lގn^(D>kbA^d3<ǥgDrc1g;k0[۸cbF-}9뭯1wjM=a0bL8vc7Y1?:.- b0IӦ|sd BJ/ٕCNRz{b]EJ%]wYt> HI ӗT(bW_ѭkW,ӦMqsKMWIyÆٯsaa&G&k0?ݧEʪ%fƛ\w,}bKMW ;ץdP.3,ll%59}D5b ڔ8h붦-HoZQO4ĸucK*.@6p1J%Xho~|*n/M@ ""A 2(QcΊ& `n汜YrE^Q/-Cž32ksoqv|c4oۍـ&}eV'跗>gziULgԵ7EtN$58rI\ڮfoͦa֬Y-(.NaxV$0[R׹oY7"vBLL&K.טj0ADy0iD#E'LTla" (fhX: : g `׍ Bh:]j_7%t(6e^ԏSpBR|DFa !t &r6 eXDG b`M.Ґ($k:]@0 >kwæx=6tskncu8?'Iш8]#\Q# I Lĉ9]yN@v3Wa`DT\Fhr0SiȲ/vA[[ q-qbrB]OfmY3sXP KS,">ӢEifWG̜1/ms ]м. @% [\DUt*f{GB :@odz G =z<ʒsK[Q)>׎|d*X!OT(2DQDMMDd GTHY`2XlWZj%ڻ>MZ,LGQ@d"0`pÊZ< zn4Ws{{YWMi8 '#z 5CB6^ +'mI)6.P -q7M/v۵:mC@}IJ|8-+Miֱ^0MϥrL2XA %ՇVCSИ@9q!+tÐ]V:N cKGŶ{"vk+e̙3Mee%a \.g(u`tؑcoO-_|)D2Q#-xYM'R#E,8yz(gTH6=Y#үoa f<'4oقFrύizN@>:S]rÓ9q-i2wgÆpź>Ku=gDrI8}^xVv^zʈ;ǻuQYrP&S@".^@ !)TtabL@mh'il#0X~%0QWc y BHP)D5Q@ " +D Ȩ{F?m-֌Dn+M&[-%ljmChbclh6N-2&!"B޹d{算7]ס,bW߰cw:5- iAp Bl4Ct79;-UCWyыP[1 0n/NRD!h=Ƃfl~"}%[(;~ V \б'x6_n=,9EJݟAø;}\-h_/"vyJBmϥ/SXZnEO<oبT,Ш'_. +^x/^eDdz?F7\D@;Qdߧh<gU4qMU"w<ڴ6,N&;8t]mQ@R$E@h{enZI\LG ֭;wniJ˖=wb/2'uiT1"nT@xAP(rӦM7o>M6)5x<&_'W;iDqW,NX`bT$(& 4ܤvfL:UFH(ġ; O{))Ees/gWmkgZP"t'+U5Hi\ZV?6 +bY8^Kzݐ<RjY]NPN(&֏.RBS7'6n& r+G*Р88Q1PO1KƩX4@EEg|+;9m_.{c,si⥱virBWC>7:E:E|r) ,kQt_.a Ԋ[ҹ6M},KUUUf…ul%% CWB} DDQt>?h҃ax~^ 9xozf9<H9hiGKcx<+"b !ݫZ~#GFݟ+Z f`}yDW~{ Ԭco09j30z&{KG4̺oNrYjC^өrG&hyǽ\6|p-n@:KґW_bfѫji՗yc݂[ڕNf k-afijZUt#i8tWz5$q"smxax1Vip&%!YlO֣.d)rV9={G1joE$#BaCoLO;ZoΕCF1avHr̖S<}i_r|<o~w&-"۶7|6iC,j 7_s'/}sBi{O}og>EAsPN?w_K\O3.~-z 2p'8yl%zp6яN S}lWv%ۯ9 .8=|N9 rF|3 heRzwnO-`9Ĺ!-{ :>*&bqYgq*Mu&#@[\0Z_/6(0q`kL1Oؤ#r9#w% tӂ?]C߸kⲷ9fgdccqܑɩ2f6>7o|jwgS ÂOF1~qbaǏs}O:nG1rf? 7=»Q4Gq9]y r'8+z2cﺑG5w[vb}mb~zIl tgU aY~,U*˙l6k2 A`-Z?, i1&*$d_zw=?9Q@wnW\m[Ü7o⬻g0f9;\y~Zh\q髴$w؁<[h \yco橑mx5-{ |y<4jO =;s+qws c_~⬫_dFI}9 .Ks^M Q!6"h'rԉ 77 ^ng(rG.d[s՟)0GyǙF۶mSҢxlnE2@~cظ9D?1J_9"펿#nwkѷOp饯9)>+y]iJ̡ȧ,#?yw׿љSQO뺍k߹m{ `pbwwXPy&?wg?ZŀkNe9ؼ'(O<|%;etҟ߆yYwL㷗?prGzhu+v{z$O^[f?0_k}4P6)]F;/؛ !O1f=\=yWwo>j\kxCο$c~w+cjJg>QQ `Aۑ<\H{o͵}P_Y>zTDbd2TB?alVlVKDTeC*;Ȏ"4Vg֏؃؃wjcXwoF6fmO(c/QCN4 4[?GTY?[](٥|_Ϋm!lI\HFzV4i/č8츭Pi&{iڽ9p5̔1 :Iڞz=o݊Y6@z56^؍C6oCEXAe1yVD=9mPRigo[WIikw|R,8EAo?#XfMSQ,bƿɚ9v'7Uˡ;I&a֕dFtz Μv]8F?7ɋ֓n!h͆[oD&Y\~ͺ,6fy=gUQ_nkdl=S xo ȮUXޘ4wm봤"P6lv&f6S]ZM歧_5T^h,䃗ߤGMdm#跶G=mNZ7gnKMקɑo8tv[6\Wq%FUۿ_7 qƲk86 M ceZooSXt[#˗-{rԙ|sAo~߮ur̝@JBmNB6oIpyg!'Ϋ<@d&Cp+ݱ?Egz<.89ij-t$RuA{q_d,S8C= K&4paBλv1ەڠҖPm+=xFƩkZ~ X4Qpm55йCn0ms7;^25M+w7i#gMBaW.48 ew O9{sZ{[r[DEqɗ0sy\>!M~т!ά++)QhlsqwփB!D ܎\a2jޞ_쿟캮 acL8Ca6`z^?==c#|CIDATw>i8.Wiil#Lz;8vmE5qӧyIL?Qא\7ـy;wNH9ݵn-CtN_KgtBM~?p*{ ؾxu}Ws&M]Bʥ{e0B!vpYu#w#Fb]VeuBD./av<ݧnPTOwAGH| .sZl;+}~Gq\uc/q)'/ꤟ &EMb1p5ߠcas~$ڼ/Ͼo3k[|g/Qnˎ(@52+Y5jj]2ohw\q}_9=q&]?]';{Fn^:}NL;[̌+j+|*3?3oYܳ{n_͆^CfW8 oi,s?$wZWq !Bشc]׵X+(뮂嶶6ޮ6oެzzzTssN$N( iCh4cb@y?[< hGFuik* .1ATQޯU(+.2t ~~էOT[ WS( P , UJ`g>T6oc#*wqZقXc1;2.n{kL6mp.*׿c Lg5:)Ygg"pru2UaZ >lNVXVq2ȕ5@ʵIvTo¾ml!Pw@M/ͳZ{`Upy6g`^~ew@(.'ym9J] ۓGypY#KSB!wjZ'=K2Ƹ^:inn6xܶڶ r!BSZqNL=B!Bn?>JJ).Zk6ZZYkpp7Jyuuu&Hj;c 3ܻɾ҂`Em޼YG"'Nq4NGCPx?,wB!#!*xg1puӑH$eIQ$_2>;gvinΜ9:]R#h4  y: )k(heuM$ƙL&8NCȾQzښ+Ha( ~rtvF,d1FE"C8B!BLAtDZkB!p8qF3<~ `r"p***p88iDy?pB!B!F}x#ɾ:p͏,8pB!B!F}IׁkA~~\8B!B!JbE!}e*B!B!Jņ[?jW~+B!B}deB!B{ tB!B!ĎLe!B!B!B!YwӨ:DIENDB`kraft-1.2.2/manual/images/de/catalog_material.png000066400000000000000000002167611467704360200217610ustar00rootroot00000000000000PNG  IHDR"YQ pHYs+ IDATx^wxU3BHBBMPAl "(6"i""DP]TXPQ,*NHH }g?vors3-{yf{l6{2JM-P&""""0 >$""""|>"""""҈a A""""""+e:LX/Q(]cI|l%>ѹ$Ւx xY9[lnȕW\n(W-)j,]'"""""*I:C\ EujDDDDDD碢 Eݐ;BbkJ%>SCeSS΅oϗvU%- j;E$޷®Fa%""""00QDI l_Yכ@x;, n'*v n(iA00ݖFqW\/wQmfݐ*)00|mW?!DDDDDTv k~f;Y7$JB` >6'""""" _06]/$v YGm}>:/BmϮϮxG0NH`m`nN c$2V['Tun0 fn[xO8"""""*] ySY} t@ffu֬X DDDDDT jV[N YxzJ`_VGDDDDDE#!n{VuXQkj:Zq@o+՚uLm_8"""""* |񁶭c|7E=>(Ž-Sm[cUzDDDDDT88_Y[T@2/ж/E=>` @2OOfէԶ`W'"""".u XOO ZQ@XxomOf7nYmx u p-؅ceqھ2>)`k5.Z--[뷫 )̺DDDDD0׺vvu.--XYw؀ew Pն vZgկ[TjW[QdԺ zvbj`j]7w\@2`YXuY&VcNSVsnUƩVm`]TA֪&չXVVsuYgڶq~)6g61@>u@ڢWM]Pl4 EFaVjvsTj2>uڶ8(’? f*պr]ݞ:F݆賚˂]:Vm0Q u¥:W炩L&Vc\֬VB5oUl/1,mzŷ]j\P%Ա2>:ཏfgWC7\mUj[VbYsA]ײPS-#`PynUS]XAeVV v:_v|GܠTu=0Y8'Ɗ>uwM}1N jA/VO m5[!Y#x۶, t<:DDDDDeI0!/uun}$1햭z{jͪ*lBm[`"jj[,> /ӖDM̭nW𧦶} t<FAM5*}(?\P]oc$è`.AWSuf5Wk:W櫭ODDDDD+ڀuTjM,j0ZǪ۲<vV{ HBگJ$e / ۰{ۮV؇nAݎ]͎~o}DDDDDzB>:(Z*Tڎ~h '-/m+KDDDDT'cԶ Zq$|"jb`uVo.응w<;[5Oe1N4T~FT"rpˆM7ad: GZMDDSW#""""":4MSoܹJ\K}eڢ.jrb_JlnB_EU D*1H8t#tŠoVVO;oG[nDӉہvW\իW#66w莆M7`oLZz7^ <8Ԯ~]S)8q$\.223QvMTÆ?6Bl }^h~>:S))&@UҠgs;~B9;eOLT&1oa՚0ع{; cDZsmVV1'cӖp[5j=ϚMMK˳E;CU, e0,eONl=<ra<[W:=[vW̘^|ID8{hP.2~^ a޽ Cr!"< ?z/<' k6^ۻތC`Y؟pO5ivW\̄iuX۟p$%>Ǿ %"*پc'Nͷ뿰Es |?Ny;Ƅ)68{ 40wyI]13}& _]qvȟݬvU}bTNk(\:l +++_AYFXXf #==? ˅]{ )V0<4sCi{v3EK0i{ػ@<각5ؼ_ 4r۟a18x0&9͚4ʷ>QYg&7Mz xhwax'1n;k~j;̓n7XwCw@ӵ7AsXcìնʪvք̲݃v;ۺjݔ{g.ƫu?8bߊ#vy:Nf G͙wi֚C;0%;;#,, s- >+𦈈|LJ+C^?M][t=ʗiD]^uW`ޢϱ@z=wŊ ֯5 zxLSѩ5tmڽ]{KDDnib-7i?ƌ A]Ƭj޴I6gGg yzseS꿔L^dmu3ݺvUےw:ZV!VAYoEFDp5Ui0=WP9pDg",6zd\Y@Hzj͂f)S0)0 mn MDDE !صA=04WfM'GsW+^ k7ШatF7ut݁|53ӄBqMh`ihHJGQ3(_݀&nOh?r?_? }LDTB ߴ1^{s 3gp r)dgg#== cǡi{0~tU@ʕƍbۿۑJqKNoN_[ |ć۴e+\XocoaڗM@^xm@nCd' /y!` eY:\~_ŨòsVw,Sk"43C >iـ{KY."^4z_۷' SM[r mڲKJ41n;kvsu~/\ ;iO濷ad>x{AH:|DOR)$%BXvˍt!-=f}4_5_M[⵱=k--Ie5X}rx︐7;nmY>#,]-<$e's5"-GUs M ^͚빟Y&""""":.ns ,OlHsCrچ*ELj[V'9X5yzv4N 8ꈈ]R3Z*ʰlUV>rMuw}DDF#qsyd%"""""*r"/9.o>1lrYdvvB+D>y5yzO[L:^+Xzfe$qL14f9oD,[-ۭW TvTlyW & ĉqʀ#33b/j6f7*5ՋEQeèXoX띣UwդCK\#"""""UMbi.m1UݪRC",rqV;QY#;DDDDDDTwnIHUVjoێ|_B0|D5o|0S""""""*|)9k鞹E^*Qk(ΰ,8(.,Ա@8288NDDDDDtNsjVsXDjUVr\2%;Šr[|] [(?57mXVe+Vaz euǪbY=DDDDDDdMd'XVj:FfU+FXwݲ[]]Xi/""""""*HG/7o j[OnXuXsQױ:b.߆U]ԿQArnR?ުNb幠!oHuXTw:>yj[DDDDDDT07˂8ڧUvbS\aY}vr[5 (yeuDDDDDDf,լeԚƪDqe+s;X˓5 DDDDDDWƲfvs .6g3,jVH^"BDDDDDD~,d8UD)iaYaAPkbTBHj 7rnd5 bٟZYUa5ugslu``G㺁+lx}YG`kp!"""""*~ry u6`]+2y1jMm eyiL/b3f ?Tڻ3>ـCDDDDDTX]~m幺,Sj7Z(AԝPbj;3`ˇC0߫1;(I IDAT$ʽ)cJ8wGJ.BcK0t'ؖ```oY+FO& Ar{0i>&N]u{SaFƥs^:pwؒRG1ug',*I򓚷L>Qy9mgVCm"$ׂgf`ax&86^!:;/Ŋy/=31DmTTc.ixJm 9oaprL8GAGafa46URkܮ'w\Hlj'XpmwԚ\W巜?ȏɴ,xtc\vq]Ą9V8?Nt@pzM_5oŃ|jw6eeӾaиzwP&""""BO2UMچ̪ve؁<@Զ`:Ӫ݄Oa[7Nn ~-G3@ji8o@1kw>HJL*UC:UGT $.I~5'+COη!"""""@X(5kY-48j;q[I;,[`zWzq qǰgq}`~v/`9c*_e{#fjx *'xU&=3Ui$Dԟ~: A>D""""""57əʟ9(ò;nEMmP4ͽJG'~| zNZ L}=<Wh}KxW=8u@^MDDDDDUf󕚽숱 dldVjv;O3bYIW& Cje4i¤b.OO~c׀L.SC,4`Àa@xSCsjz[ 4 Nk_ٖ 3'!o""""""?}ï"e5y wmCeSjɴD\Sa[Rn~Mwhu8ՁT=5 t9&jhe(R3DDDDDDR.~oTaێQyv}Vu X}F9}^.&""""" UPkV ȫ[ao}V[(,muꥄMwc++v`[PgY[["""""[^ v) a=#"""""T+JRX.w}qv ~H*`5@29PlPlBB+aYAB"""""&Ty*9H, Վ, e vܹ$""""""*\;²pN'"""""*ve9{JRJKXCDDDDDt)u94e _3SDDDDDD%Jm*aʃJDDDDDe:;ŰLDDDDDDS-RNGqBD4/jժBlMDDŌaJ9u 'N&iFV(RSOc}LDt1,WEƍvQƠ~zؾc'2Y,WgΜe""b3g4M2aHLDDDDDD`X&""""""R0,) %F~}+yw"*Z(sLj7 .ņ݉pT@&g@X'? 2}.P0,L c/CD1s=>Cl2LwA0hvm!j}\xeh WnL;$k4m f0]>;N]q_9'߇n7uF`m8-}giϢ]x썥؝2=cpH -..%ŊIDDDDDDvMBG G`]ow_;(W j+{[X;j\{0sapyhU) 8f vx1njԎrU5鄃H1ƵxzSDDDDDD3A7>*<ׇǑX&.NNDRT5T+ow *)Ҭá1Mc)XZ/G͕ # ӽ}"*Wt@֝:`0L@͝ȉ堹çQ o~ }~:4̼])j0=6i;p""&h&]ҭ!4JUpO31Ce-7({auz|0ꍻp8994%Vn@&;jVغ L9GH|QtZC̬dw<{尛:w*?M9:̴ؾ/I.xl]#a!~=Y/[iW8j5UbԽ:y:UbpbS{&Ax{:%8˘ֿU) -gOǺiqɽ0A%8 3y7~_;"z<5}&"""""*NDդkmugue CR)ŤN$/~'ѓG w-4ao/i~egx4]i` ˮMÀ!]vM.S g0 .]۟7⚫IQQ2M? .jݚ·  eoHm8Kji3 r[34/gg55z5ݡ!.Mm"k/TMGnIaqDDDDDDdY&""""""R0,) DDDDDDD eIDDTcX&3jHji/$":^ۋ!::Z&""JM=z`T&":ɫ ;wa&""**|(TZ 11j73eBl,i~^d`X&7%/"""""""2aHLDDDDDD`X&""""""R0,) DDDDDDD e"""""""2aHLDDDDDDp*hޞ|y .d.SPIp[]'z7p@S;)e#.@>YӦjǣd(Yxޓy{e>,=;;шAq긫KU^1,΋""""":iUБi0)°e"""""aHLDDDDDD`X&""""""R0,) DDDDDDD R%޼ ܊l_6-g+}ƬT{b$cncNtYmc<6 Kx0vC|;D)_ ㈡f_=_ p,K~-F8lŔߋywN{re\~uyw\jWYa&g;%pGs y ^莑>Bf4r0zzM6-9A"hzS_<Y˂ixGY0|?8x2fTEn a@? ipoT񼖼k3D'>{ڇ"q4^L jmqo&h9ff_z[et6vias<.1f]|ûi4lU,|" t9؇x;5}X] >vU4\cw *0#K۬/!"SOwCd)i}prw*Z;N*N?9oƬ?0VMzk%tnWgX{/f:u2xQZԉ+ Z*6|:+۶E +@C|h-,I6O?Fxa4C_"`\6Ն1Qcc]k4N'FfC&.V3VBǶ SGoD<W@lX8|^uF8|[oA,@a =7]phY#N,j06fZ}|,Nv=zy]{.AMXvGa¨+;T X3ӷu DE.wd4Рc']^˻ޕXq*\G|%^Olh,Y |c8`6LqԆ{}F.}r&v魋0q<ݟgsxMU8\[1w84,QΞ;ǚ# 6wM h׳c+F$hvY/o};St7?: 0}܂;k {$b; {.AY{X:_ =/q<<\Gg1#v,~cuI3Q< ^8mSqd~W#bxw|xfJ7ݞ4Sig$n/ks׋pe7 Z,3{(nif} ƠcTdPX|3^d V|6sI?`滌چ_Ǜs0i̝@οxlm>Z ޏ?!d6`ш#xeX2'E1S3_w٢BXi\֍5y"5xoR,p6]s &L0 /kYKM.LhJ6 ݇['aΨ9n?Rc$瘽&X4bтO1C,z,0ƈn.0.l>aJP_`5t|3_}9/Gݟ9*6D^ÜKbKhs:f~~Lk9Ooo)p&Vð%@ ˏ{l=3qz85<ѯH߄a\y@ *]7.'/aP&*B !`j5fشep yhVrI:.Ap85?7ϵ*wENJ_Df6w{w_Z Q)o1JZEDNQˍ]йxtvrapyhU) ѭkkG<ХŨ3!nu5ge Eŕ#tƢY6u  ~:=U#k^/G9m+i_NDֺǿ-<`;ʶhӶ-ڴqd{5;. @dq&Zs ڕӟ?V^$aТh'=ʽK{uR{c_9AMK ĸ=՗oG(O+[z08«6!qv!p ĪU/ۄy'|G5tN֮ۚ",Zt9m*S߇qU8Ĕ{k0|W_\JFcs_׻m#DL+ЪIM4|Au)?3F0O\Z0*y9mn}]W~=2/؏3sн8?RР{'}uoE Cpw*/Hr?LZt#\~I]Ą9V5ڞc'^s׀ L8p&ұq|n9/Ngjwߗ8ܭ \#=+jY}m&*^Q:*N芮;a}pM'vɯa9|2thىؕ"T'co ;h^GFz8 ۣDE q2 W`AF:c)XZ/LdGVD Z9rvWB\6$gy˴T\_4p벑P-* Fsݕx1O7ad!MJw:٘ڻNenZ|TœLqLhqQQGn7RqD4ݿڅ .L3H>g!ŭ-F>̟'¥0NEv̮^i}m|AT56ջkfi8@t9O IDAT(3f̀[>o࣯6"! Б#Gqߜ=qNx[.~w$}5}>oW9Vvs~w5N$s9QJ<wI#ɛ?|gAׁԄ48o{\$Aՠ^U+zT;# BW5YWYKDņa9DmL\+"oŅ>ʺݹ#\ 3+y_i+ҋ q+f)j$@o{{TU[U;ѻA3Dj"㫡_rģR|4Ḩ 'GOBѡYׄqxq,xWMW~&2NT*y20+⌫P15R^#}Μrt%?3χcqØ֣Ł-p|e*'dt0z-uF|CmD[13okX'YbAqQ)<.}|e82)nٟW(/NLVS4~qBF\4uTF\3>-I{wp?/>n6G#daWc4RO Q\lΝbSb43K{//؀cY&̴rW\6a͆hWy#݄$`"7_dZ wbR6 \._%7GW0ؑӀQ ػ P UP%;FbT$%P逞߯'J jmގvR@Eu~yv@50.2\0 Lϙj9Z b5ؾHF'ފ:NLXE]0a*Waܦ=^O;,<VDi3# Iq8ymD99xVk_oD_{>Eқ: Y|{5Y}O5 c.,DňgC(Rm!ms3ZG/nN8ڏG|x4y-Acp\>`^ }- SAN ܸ 7jZQb0mb{x㗐aj.*BCZ>4ϞIuŁ.8ck㒻`dJpp4VŻF!!UGK{bĀ,y}^鏓^]7!j ;~y;- YS05)v:Q s}ˆ\{d[<-z_)mb#Mm){ ûar /Šr|D&Юe+o=,aE+C6 t<' ٞ63?~F\yئ XEh,[]oo'66zW6q>Rۃ\`x pDV5 ͖i_`|ufbhk_.?xV+xTۗ=Tt?N"i7h8m<D0nHo8OˍwoT7^[ Vky xV:@\X Oi,Ge~"^{3U)]z) _(o۽;񆓟MӡUA>CBNŎ(HB;yѼ_n7ӧkmz֥"rFKU-'˸EYؘ;EaO82Iڿ1N|Zsv(A> 5DPpj0,;~=ʾY,L,ȤZo! y~ D3/mn`KLDbWA/-YD2HOHE Q8l-Z&D {)nf0j]`p\"\($_lGg ":0x33 ~S`֡H c+&a>W>',_$mCh̴IPΐsCEzCQt/4Y؊3mqr򞟈ȅBaOd]G;t #>n>qy*~fʑ%rQ9$Q>Q~[=fh(w:{CT,a/)6^j/*,0wG _a H_k:p@1_Rضccǎ VUIü%Y$1,N0#)k`;+)Nj6loJgZj8W3qɀ|1^jy]橔);pa^w cv"nu6pl-sI>&qr{,_ !7zۀ'<rCǃvH(Ȏ?ꂇǝ<в-tr=?&GO8a=Ͳv`<(X}Lh \?7/"""""r!9B%ط$Q1Q8eݭ""""""r.SXZU_DDDDD|w j?SDDDDDDEaYDDDDDDEaYDDDDDDEaYDDDDDDEaYDDDDDDEaYDDDDDDE: S:cN~ OJrWjYG{rqw(,1xNpN'cPT4EMa(,(,(,(,(,(,(,xro`A?Q SN]GY}a^\DDDDD.\ >~o[,0aлA\ȦQ< zKIDXBy g#j؅'b ݛY$*I㐺WZˮ0֪Kƥ?X:uccG<=vwӣ>fzplSb<|&}^Z{|vlCA26{צ]3_;wl`ҷ i,|)/Eѳ.,z)_\*ۃmaY_Hy$'1,ψWϠDwUƝ 2"#W>(s{{kERT3_'sALoREU)YG\C[;Ҧr,L80Y˩]ƃ/Gq[2ϖǷ5&\jcXXM,M>W.q9(,A4e088X(-wqоby9dcӷb6IjLL`' - P(4.V^l:iय滑k~_`CNsYf FKir(6xJaMK1dM>CѲlm2UE,m?>rXJ+y$1J۔W>e@IDDDDD||YŸ+|޼.KE?k pkf~Di:i&+s5=L醴k5Ik-I Vn%SvWex4,JD68Hgk7d,ۉ)XUe+6/9?)͜bˣUa>{;ez]8Qsu92/?1o}ޕg1kM݇`Me06|{,b\TϠDwUA4]^R_b ƼWn/c-,, ǃ~-tjbñL _ߔ?M秥.N՝?"faOēȏ|H5'&F4zr믝t_Qg17QϿ!(l{S搞C1 a1D@pbc"{ 8{+sǎd 3=ᑄ;Yda<}]u|@^r˹"""""":-=4<1nҍN#pRv'ʖ&êU{ejK239X)S:?&R3n6 ,`ŸyBՙ[>|sv >2Û;^" GۙYDiJR¬/ Kg1rPaGө,> IDATy?<2*/WBm\ {¨mWN{+Qs+k KXe} vxU喼EDDDDD.\ g|#ZÜYuGD\zz>Xe ԟK2"m}|dʡv;}R@]Y';y Aew[=g1X&x\q,]`,ݍ!GX.%""""""⢰,""""""⢰,""""""⢰,""""""⢰,""""""⢰,""""""⢰,""""""⢰,""""""uWoYsWY,"""""ra""""""". """"""". """"""". """"""". """"""". """"""". """"""". =Sb۳Y\ͤ}׭$8Qpy|wwpHY<}K.[w]! |=9p0XpbQATʇ~vO&'PfT''rU")WƱX-?:N)k7Ӟ!s-?(}5gjkLauuiP.΀¬7?%:qn3N?2#qpǾ%0j^b[R zIl3[KrmB% jv]ƏGS1i~}AE>hDèUH/&1z"|7/>MbQLͮtJ*@P41ɿ1qW:@T-ڷ.Ʒ,6Eϲtڿ)"""""7ѥ c 'VՈ'ķK0aF?n~/u ;sslɖؓ-DSm`FzaI>Nj(Np+hA{yBdfd7-ب@647>X7g>c6yis=^WN|]  $JJsBb(zwq Tw@5`y")Ѥ=*BlLĚ~R) ryek~yݱ kk=A(s%we90sEVf FCf7v\#U|Rxg'K c:", zK_eȈwZyowYs㵽T]dXɼD$֡vXk0 ǼL#&7@6oތ2W5V1ml; ~ (N{;PFDDDDD! 'k+smcFQ:# {n]F2nxޙS6Ui=-E{_Cّږ`|MsMDT҃[ǃ^>e|9<ȒMѡt)܈>o3}bi٭>?XU9f^ Yqs=ڎҧ}_g&U-'8nO_+ )  ){Cx xv{d(]f3caNuWEӠ~}wu8w9Bξ}1V\_v'f$[x,cX XX@v|jՎcreL4-<Ӷ38`, w[pTDDDDDv='g|cG |oOy?*퐲?P}i);UNCPhtu9h9X< ՜}e<=`u0 C9 'k97LQeeeeeeeB~KU"""r0 ~w(,90leeeeeeso}Œ 86[xOK緉3uCPd6oLB^'Csu)=לH˸' """"""g椳f1q ނuU:ۿY6 ((ў 0B''0ùt0׮htY9kʵ٫AKhyy '-?1u vfRQ02صto (PM.TBH(s #Q]J{'35̔LC94Q|2wSRyedΨ "W39z>9Ma{|d;描˲~d/n#aDIS}k9."""""Ba ZURb"}HuZyo0deOәGgMcrC9$Ű㋾x{zdlׇ=EؕN>x}f_ы-3H|g4Mg5U(,"""""⢰|%%&ruBPod>UH pnwS%&k:_eǚ,'ɣhGG_u[4D y^u״z>Ee73(|LT{^2, c,c2MA1o41228Jpd巌\&,`¨y0>1#|oeֻIʗc"""""";sX!$٘P9\ɪ6aKPL$=t| 5'LS{x;ٿd0z-䮤)"""""rSX>)S@4DZexeC&ĕV#ylLHd_6wbS|*Żk9;|E ^G[DDDDDD),"P1'>jt|1oSС{d{S2*Km(ꉣZ|W 'ijv~GzRXqQX>LLw}̭|oV<T ;m+_5<]s@ރh]+""""""n²>xkd`yN<[DDDDDD r\""""""7-""""""⢰,""""""⢰,""""""⢰,""""""⢰,""""""⢫aJw'߫B\} 9W0leeeee3A*9O),_qm>YDDDDD.;ec1jآjc׌-?9Vi5Rdu2X$>>ODDDDDb|6Yd''0o?;2|m}%>jyq > hLde͟}ʷ .T:KZDDDDDD@a/SR}a^y5/_q~XLȄ<ũ۠(f*$/Yk\ԎIc_X`%(Iٷt5;itcsĆK.%*kKeeF2ës МNX0ko#+:W\W0 nIK<9IDDDDDbc[=(/ eYl9/ #=DRR"Ƙ܇iMjR,:Qiy QjӨ^G'vaAb%i`"0EqLO%-Ձ("󰈉r2$=!&nEcPX]˓O?͓O?}ys^j֤fƥHBH;eɗTJaE#ϺWMv)Q8BfmeO>+J(Z<lc6v/wغgH])N:?6*3{v:auQ7 MR%WVdDPq"2ڕMfW迭>Mb$tCmK_CsCE7'L\s Dֱ&MGeo6 JDDDDD=g@v`Kݺu|P0qm\F)>P۔Kj<_?jq'lz-Ͻw#գ-jt7ҴV~x+&,qI>zy эo_6TJ[C'1goyT""""""(Y>C''S?)]} oyI79˓<%ah`ycg:ϭo&qyVLhB:XN8oM4 i!]DDDDDb|/1Éա7`yn7œ8Q a""""""". """"""". """"""". """"""". """"""". """"""". """"""". """"""".^wJ9NIWcIDDDDDiB\ϊd;""""""rƩ0leeeq+.6 """"""". """"""". """"""". """"""". rdS4W2wH/8~vC/QR"6jK۞c,լX¤[=︊ Bhܤ1ug{ 5I ƾ|<;؜B& Ijё;^mLJr8ku -$RAk:=y{?9;xnZѨqc#?'%mt{'Z7Azoޅ/7u5㞾xu)Nj:Ӽ~=j7hM{3ck;^فF [y櫵;0mي-s㞼?՝+ip,]A~]Z7&Qk:‚}?i1ћE_㇭Y@σ#s~N^6mDRsl/#nmjԪMZ^..%ɿM|O#;ТeKʝ&/rQX8&| pL3|˩Qz3}8fn>ESMVxgaʛ Y#rфÜ9s~Uy R=|CS̝?7{7!eC2xg+};G_Md=-Oés(% ^!F4ё߳`0=[ ry:|2y6Lۣ2Y# ՎSp‹Y֏mZ{d6[='3bᔏwS *]ÿOȊL{{?;+2}qqgrg}c.ipt8L7ʼnqz>62j&~Cŧss?{]JJ9eɳ?wi<;Ⱦ \:ַ?p9gT˲,Kn߰K~_-b?wxяaL=9¼2`ҞG2sE`GVVpt4%Pu#" &kϴ«3iDǶnVF{=M4MG߼Ovc7ҶE3:[ox3ѫc3yiqϠiJdy=w%&͚Ҹn3ntjۜ1q]j8؟ۮjEmט93L[_5hd8qne|튼oot>JӤis. Vn]˦4hۍ'p|[K⦻T*0oaؕzp8`]GVP;:en(FD|=n>'Oañ]A~=ES@4۬6%,0-ww^H *aq-wwoL(ʵlB>ho5fn\SRnѐLe iF\>^cÉ*XK֢Emɿ}66%rXVv LSR {b\R9_ZZ.-x>>A7&c#dɴyv: +Fwjdfuee;>ݓ(ea"Ц]]¶oa &O#n?9n/=x ɱAJbZx]ofqr)9)߂*,gXQZ` |r7b~v|!=k/7돾GrZv3ѧU^F?y߼ cwߖM&2kݴ4v-K+1ɌVί(L5/)ǂd,YCOsg|-!px흴{m"3}.?b]n|.0l-Zk¨X,ׯGGv >lcdLſ<xA˱a>3+:ro#:4* 6[6m!:"<o~Niٸ +gX[ײ!3t/Z:_OIew\ۅ:ɸߎNCʉCboc:5;GcLvkuuY/mbÞ2T>*U5>b7 {}來BNWsUӾ[6he*|K IDAT~TRkS+{H><3v3> pmȗs2UhuMK9?=lؔN Z+Q)n#o: 0ֱ] OKI@O3:5#%_z(K6ͩ߸-{ʷG;x Sn]jr]R?">qO͗M-H/^H/ ( tEv{ӑR:* { I6GfI|^5WvΙ3;:>qx%KOǀR/>˓.ec&⎊ᓓć'I]WrgREkJdff<|ۈo):{pCzBb6ѷQO]ę->OﳒET4 @?"#qEE?ir D8,HOxh 7fΉw󏑘 |RKE *IJsߗ4{o'X ]?GF$QxWyDƕGb?Ȼ4ess"#}=Q8|HL1~8,RyzN;~y05y,>XQDF55 sp)[cli>Z 5{u2>?5,gJqkcɾ;e K 7~+0c^nѴ_=L-")0{["49.,÷I=뉧@PFċ&+Y-w܄w_ldK[ٳ uM1s7Ovb!(ylɞ[]׹|3Yj e#{p4W%5}W"8cԪEgjL jEy:;d L0Ӑ9SBe`&f وK۰a%k="#j XY>%bgGsOyjOt&:*L Z8̀d48< 3Gg[j՚m.T|k0hV-̍k^Cn5|?#`ƗGFfiS(8=uZؒ/1<̀@c|()@'8cI7/ey8=J^*iaMKҪfB'yd@"O 5JyNA!@?4Wc\Onφ.S۷L|>_a̛ܹ;Jۓ)ٔ62go^ψk"u8qv컌;0?%d5"DB 'Sj7)t,wmu}'sr"4#{5o7KitkEٙBl2R0 'ÒPY7sF. Iv-x}92x&^=#^Kd)/n\+c.gU(?im>}oU[W0.:]G9# +x/f$wk{6ɪ"+d׍hv0םX-2פ֓ 7p51{V.F[XQ'e|ViBL@P CD?™Ԃf[cḈºI=\ZCi`6OaKuhZ1 MHftӄ{L2s֡I}̞N7a Ez%@1ul^"i.n_wk.Rx|8s%75ک"+'beTJi/³ X?sqό[^}75L_ 4oO;e+#9{_{E[ΜU(\h\y8_.Ne[ĸW7b(TL[7 bcڴ-dWB-챑kT;2lTx,Ψc_fHm˷p&|,Ӡ$~is;֮<J;?VndHA*FêsVgG&u^2ŧc/e~/QYMp}..›RoP^oIdT1. z3{E ,ax?^ِ:O0\'q'l9s&V XSX;qx]aw5;y;NrkR'=-axniFfu)ѯ-;5vc>Zt.eL ןyh=l8#]>[iW _mHVqE u#hWgd' HNFڥ83UjBt"4;W10((>sdp:\0Pj~7)}n|8F~ڒq"pf37/y?̜ g j K׆ҩb"?X0r=^!ְ9fīź?eU%Mzz#tHrQ?A7Atj0V Nză&Dch?47iYU Yf??®ƕGp*5c͐ Ŋ:Q,ӏyШ|P&[#:3: +"3'S#n8=st,#&z3'gҨ%bӥbQFQ?>HW=GM1n}_vS/gJ[=I@Όn?~=À&YJ7gx/sh|w=g\n[ 03?$0OT~n_χgj{K@I 77b0)\_} l}[8Q]ܕ3%=:#]gh~Mt^< Rt(RKKH9=$\~>1nOLc?x~NȷCѡ]'h&;J]ΝTP;gYI[az4}ܸp #nL<s_+a'|Č,\.+n] ǧ'sW61l[cQ|if-wJ HNۅZ+a@ |%/ -i_\,1iyngğp]}*ĕEIV9)aAXni`3O~s">cCAhޅ[ѿrPYqSuK<:b zw 859!1wq=ƭ5V*Cqj5F;:2L{dXiKf+0^3{(ى R[a&e0L&~ǶH Ǫ὏0=qnt_9Ft.j=={RW~7gR?6"}5i3 EDDފoZ6R5S{3[+?"r,K{ "&ƀ5TLVYDe`$""Q,=RsF@=xQ,""""""E"""""""^,xQosA,DyD/"" EF7O""""""+5`6(xQ,""""""E"""""""^,xQ,:%"ںvn%;KDDDDD䁰{'ȿ'&~Xu/F\oi?5K gZq”V{ѿ1Qk5K-3O%|FM9Jg+7&6Z6ܨ-"O4Dgy9Cg>ЕcJCºer8d-{* ܜYU ӸUDpv6oŏL9@ӰT@4qvm:9/# 윹SRvqA(7~n' eÖ F' >i]d7\V hui? ;Jce83`sL'qEfOpeN0TjMzĜ?CXe\E7&29ѧy>nȋMA,~gsQd?+]TyIn JXosd}({±(L ۢ[gعzG/9˗Tt:DDDDDQ(9z~ X?i7+ߢR l3oB' 7fBpۅl8KB _2 ٺ/L`M @;XӘ߽BI쟿oa;1nfwQnߍ}p1]|pLd ĴH܍YY]$^(H} ˦-! ϖbcgH\T)GX:/[ {>nEq eCT/®q8a{QZ971 WmL&1XB+PJd:ʼ)g pG"p _;?zdp _;D;>!JnF | bb![m,yr\DDDDD Н;RR!0yƊ4{#/ƒPKb, S|{נ@:3y& |_r#JD!{=w~Ndʼڌ.mXьh nY)Pyd)X~*/sdױyn03w=kJ̼4C|0 p&[B 4wbS$vSRvL-Lv~o!DG rM`L&%˦ïsf[BW/<,`M:(AH X>oRPOtc3NvT&f;BM{Y4yDZԯp>WY6~|t _C튙ԕ#LdĽ C>rµg&oL=ŪGyGd63n.-lN@|bMe 0aq `i׺mh0?Kǿl7P,}Wke gո`'M;ea+Sd k2!" 융 r NA,K_یQ슘EDDDDI e,E?bԇOg Vtek~l] ~d\)D龰uC\=׆I6|f,nqDm7dN.&2%[B_@ ,G4EԙpAN=lQK2iX`{$U+eO)*c8|n<)LyT)+~>;OU$4_$KK`ςmܸ 1jۥm뮤f6voK7X5t_M9HƖu(sasC;ӶfN-^wФeLoѤžo1qNb*?Mq9b/D ( +&/cSX$fAEYa`j~=}-05ճ^a󬟘5}e"_? y~dר96^DDDDD-{t%{~"'3`kz=퀽z.h&m[ΝTP;9E猃I,Xy5~ˈ3/ ݩ/q} ;59!1wP¸c܊OK"l2$Kpi<*>Ge/ EDDDDDD(X`YDDDDDDċe/ EDDDDDD(X`YDDDDDDċ;A~9DDDDDDA׽ċjEDDDDDD(X`YDDDDDDċe/ EDDDDDD(X`YDDDDDDċb I""""""e/v/u x^>w,Οbp-dx$͋P,"""""OR?r8{''؊tJY\+'DI0yBj* 8p%-ZR!M~߰a(EzТ=XyXsc8spj309?rz+ TlיKd gsDYfltV,G= {('6_bi |ZD0T+PxKDDDDDD`deʔg 6>z0tpzAٲe_98=6H'ϰqd6'L㇯Cxdnb9z'$fiqߓLn),bʔV҇EDDDDDJ,A= 80Az"=tῴ㋙P1l/ۈq }˦hz>r"{Z-7P-yȠ.]5K|)ߢ9O.̸raYp>b}-is#?|]֡XF[g~c_6x&{]gr!Kpe/ A57ϸ0HHJ-4Lc&pt6DdUj`Lf.;!Ee]k^cO§fabo[W~0mIͭR{VhGRib~OԢ㨚tp0ML^G IDAT1= 3i""""""OCyuex'`)q'i6ROe/ EDDDDDD(X`YDDDDDDċe/ EDDDDDD(X`YDDDDDDċ;Av\ٲusA,DTeN/ RW߿:FͰEDDDDDD(X`YDDDDDDċe/ EDDDDDD(X`!U\ey;3PR663m6J7B,6DDDDDDSȉEl:U%AWKOvrff |ed5X.'Nˆ[ȿCͰ5V 'V-8 wʺMLS+pC?^*lO "س"*"""""PCpL`YZÕزwARE2$W{QNyԠGqffB99KjҪnڸw8'lMd֍L2"UiźOҰɯkqGݶeaȆPcQ*vpe.@vJ׫S}Vs,|2g@R*N;(Sw6˯2 ξ?V8G eз'4l-/=VAoma t'Ў+23|R!V [ʁn,9v/ -ĵ:¯7rEllXvBZ;C>4n1 {pO[MZ,:IfV?^_}ާYɲf9;ͧ[т'JOfDy(gÖЈ?M9:nǍ:W &EYFAt6n-͜NwDk:\)&|{g⫡5rn[l?o#JV}C)uDCLޝaNn([ +9 ֟lqeAλ2PM r0 \|u;{b:!}[DDDDD00(]ݻvo~nOre.Άcn..~pҐ#g8k&n_9ؑ:9|2wo8㽠q [.W63|<0X _*%?gyXX9^EiyV|6V-gUiSȣWn@C0 ʔ),RJyOrbN| ~M(a{.Qyv >S[p <[9-9uftLu= zrYd,ʓCu)t33 Cߝ^S/>~>Up&}:i2>AryȞ!?K EDDDDS*Qw_b9:BR_9 ݕ7wB,Xґٌ"6rwkaY=l"+Ku)1y[2^6f!K)Seĵl;`1LW't&W Yl >ⓧ0E|~fӜ݄|Ș$mJ,jEDDDD䁻8#RKKlXs{Hx;L<v|<|;`=lA*sI#vQ\j~}|ycqv'YFLyaXN}gb=?'=]Nwy[i=JeH9~ӒINEDDDDDD$e/ EDDDDDD(X`YDDDDDDċe/ EDDDDDD(X`YDDDDDDċ;AiNݻ)_,axgCCǧS{'ˏ nVDDDDD1f"""""""^,xQ,""""""E"""""""^,xQ,""""""E"""""""^,#Ǻ഼sX7=e13gR2㳟n98:j@UTfuະ/;6vTVfƳkxOkjV*O՜uY7=cQjФ^uaĖv:)Q 굥Ǽ#8RQ`qmxOz ^d=Sk̺WVj IeQe<#Ueyĉ9P\y*{Ow6X3Ɣ{v &&t_u|_wmCݧ+Q|u3gbhGlP +RKtSNo:~]'bbI'KR{Xe 6Lܟp#8ssqIoޚp{d m0ŲYҕl`Ya)=DbaܐCٵd(e Ƿ',׏wޭs)ŧw}+~2BwnbN(-&Llfs!Vܶ)&%QvobټvQ|%/q9q-u[! eݸ\ߋbpߵu|XD_Z[N.<~gpq}w:eYK ܷP^3V5'_msNPKt]]K$.qۅ;`}s/zO';7|SىWr$7)X?弸]PJZ7qmἴq]ZQF5*|W>ˁIW4煍)·$suSZm9?Et/'ѥu#Z.pv3F!aM߾zprn@: ²OyQcAsf7/Ib~thS.epTO9q^7][SfM7x3ŜexvM~Y^G"y׹m`͉2ܾ6z79X@O<Ȧm9o"[ԥb}s[PJ{%z-8F3wQKAܭ| .z>fYpFE}8jmuhSLlKFʜ\hvD&|^ lxe\ڔj72cf}{ҴH&Ғpe* |/ކfK833]"II^\C.m(_Rw(;;գbQkAǶ<\ֳDyڽYL6O.O{/j}f0u[\y{(v瓗+3Ee9wn02T]IBP9_J$?~۰e,tu2e#OҾiK( nX; 0h7$:\7Je:߈D#;wNJQ12kV>ٗk+tqvúCiOd@: H0vʧ'όf{CkEq޼h2)Us9K3~|IymljDq,.΍$q_G]Yگ')kYڿj\L|9Lemwz fFzF<1A8M(x]yqYһ&Z̸ Cy$kd{H#/ԩ+wo?| \m|#{fyvz0Cvp\^O ۭyZL^Ο&NqJ.KJ/Pg2OE<$T P $GO9!$ NbX2nj_j~B;fbx6Def˘A|ʝWJFR}Ϙ0#G&2'R)#']x]a3y7lz,}g$`Bpsq׬rɶq-sC-sZ_[ GV#a^В̿Rf m77aJ8~ZGKZCD?!enh._ =< ,F瀘w;7mLNnx*,?Fʗ+߃4X~$EtvLr'ֲx)^2 i36ur4&pf 31tiMvfahwTK(kU%csZX+/}|MU|)ZBV3/n[- K]Fh0ѼYyƍ.wT$S E\!~T|5Cyݘ3cWNQ4~p_ۻzcCg}J֘މ. k)2lF6}4o@j䉫dEE?IQ?w$H"{ \:m^OORo/#w /,a̴V,G3|b 85'#Lph=8쬨TB 1X;*o@GT$ Bqj=ŗGrv|8'z1ۨKEP Nũ ݤϘ#$&1+rXƽ7Kp!ܑOʒ["Byq_'+\Atē_z`6y۳ u7ݸo]z`]ƕAꛔnFh~z'髙fm͎M`z2ӑ'o}W;R=O⊎Y53Wooc&A..m+3̀@c@̙͆> ;kە #8m^,r66]aN:"~!}xWߏjLV$pH:X38vx4NDF$ub.=>_1iJZ^u& nJfֻ/ 1h=EM9}nd ^|?Gʣ밵<|, ?&G@8﵍z|ܓ@`GT#ŭxӽ|<-x`К rEqJg6I}`KKA,]8-'?6 >R{oriRYLYWٻjEߣ`Y H\̜LtF&e21d8t|2%&B261hHôy^$;?:͌dJ[ r.3e)s&][ނ侼ł ;Myxx1Cr+ 59c}}Ʋ]xyhur~%iխ K_NGczk),a'c!G\Z0. 6dӸ( n؍\ г(2~2^'ֵLYd„d3KgqB_x+;6X2ećͤd*AmX vԡ`*Q;O̖e G?a[ܗvs"J_?G^8lb?af`@E{G7W!G;zoOb [&\g*ֹIqZ07]tnNϹq^Xܾ>"H#ȖؖR&E=p8:)-4(_ڻᾰǰ\ %WK\4/ťuCxsQ M"#"Qa[pN pq;l9W^pɢ7sJl7܅澤"lr 0'R ?$ݛ |s&v&Oާ®'"ro>Eykd?+uP83//NhWU,wK1lOQ,_J;JuZ)B1ݨMRɰϽؖWޢu)eOoG^Wƃ7y$Cb~TJ#aϫݰ*َ_l z QT;BJaQ 3B|*zGs%%eTި]xF^_E>:i@ڵQymMoSy,}k]CVұn%7P3#ۘ3ê2dKJ|(6 iN{Ss*k=a}|)^oDа#F5/^!-m~ދffK<ߴY[龌xpbf"pH꜒K--!pI2Sl6Ǹc/W# ɳouKp'є7,zpt{5u,I:m9:v ܑ|գc adGɴ|OeĹQI3R򥶼߾)*sq~='өqAIճ@6SCixyi!glᏳax|sv^eO,"Qm[ϋuU*+Y~d {Gwb\g&0/@-1HV4V(Y!Ž]־+f>ftYyvV[(~1`σ:N#:'+^HĆ9 ΙJ!l>*s7f?a/R)/q >a>9u{F/K|"flI5~ЃI::w<1¦1PMZṪs"${"xf|4zi$+P#ظ.scjLn!}KӲrYl>yuuv4ړ~8 2o߲8͔<~{^$NgP<˧u_bzIfH8b=$iԘZ90|RSz ]0y -5 /R<Hxd MR\~#G]0U+'W<\M`_.6,DI0_F~Q_Wø12K{|tHv #`B]cGǮavK$N!~ =WЧ"v݉z*9}AY[ k Y~[V͊#Քr]vCKf˙4uswYqטxd/Q^VN,>C I|LE0"̧So%}giQ+g r.HlчP9tAN#h~.;PouJ}#9 Q(~WY;>EZΛAPզ4ߍ bo7>Z$v7+=n&vo@݌Be8L<NI-x6Wt+ω#M#UϐuGqWdݲހi}qYyYNQ S '7=Fk? ܾ'iQFfWėQiV.~&U-AktÂ$O?uWs?WӐĻd^~z ',̉׮/kaq>}>K}-ŞbKx$GsXUO, <_KPgOa՘A`XgƊ ,̉_WH<-c嵙ekFbdq;e^|JYv {tB&0Ew/ۄq "͢W(◕?[qSBWrAv]Lo&$ ̠/ֽ > DQ1 㑒e{{P/Y]0pwQ0I*)HͻxHz+Yڕ0.oKbCb{Zɚyoz-njbEEkwޫ3;bgqtO3H"XDG@?lo0mu Re/##+&pw" xĤ>] (F|L^YtsGpVُOodh {<@_#z&"Y&*׈-f)7{+yi^|i}ߜ4nUog梻`"(Yڹ/t/S;, m]qPlW0Iڏz'׀i xOю{LIJOQ)06հ0qx2u*;eNx+G,d'B,40ps%sd$œ u}+ ~JV( pZkJN$ptS\1?9.gB&gɍn̍ yJ.t|Vw{OC[v1Ԟ7>ٞ坩nNǒϓ; ]Γ_TɞH<?峺sx8rf!Ü <ܜ=z$936BIKnuXx++R^퇈cqfqs\ :KQ=hU4 }ÏE*Ѥ>zp&jV ~͜^7?)Ȕ}:;ʅLJ{w?BB[{\7ns7IFLaq{Vv_~ŝ0'V0{ eІ%6F('?dqLdlؔ뿢[})LQk>5ۑҤ@wޔLymvc&H7ަWO]3= JQ:I2Qi_QO<٬;Xm0Va 0sƟ\5ݯ+M_SJ>i?Eyx7Loom%#w|>;>kMv_2[|~$Mt\ !3Ȩ+N?s'gbQyp8KG?4H[ >B}W='VI/܏]cW+G8f:O'ZD%(aQbgIӧuY~|Tʜ{j7 #ǷL2Wq?x7;3M»INӰ) =zHÉ,hҙ24"uPwvf^ao,')ybگ7'61Tta$g[ 6\X%|;ڃpgWtj=^ͦX"0l^/rWvLAͪMap$Fag}lp:~`wf$ևaNpΝ.U1~J cbilFzwbF1g=@.VǃE{3 _9WLu]_vq/S`5O'ݗ<#Z,Ob%(S%wD'xRxc]ZեbJք7tyy--_R'#$/%:vlFJ+%⑨6yzեLҔ28BxLFvlNJ)_&ޛȦ+8{`^j0cu?xxXøUKW#X}6 +0?u+SlYhE;(qi˗~'ӢXa Fưx87>-zgG8'~Mǖux|Uy9g<&OO#lT[ a{"髑,9/Lݧk{eͬ_+>fA'}}Ąƙ]>1N} o¶-\2H|c\6}I, #haϖ(>귔ˮ};t_vW}ǯ,ϗȂ1M'>KaQܼFeml_6C; ub7q%){@ھqmb&cfŰԕ~e뺹b90|9-]tc#3 /.:];!n;0ko5['sxp; =faԈ>֛~j+; ~݀uwu{c{Xӽ$NlnujKCcpiYO Uzc-le /gKhN"8)YscLX0Zԡb|S]X~׃E$ۓ3c jT@:;s.kTbG`f.Ҵ.ժVBQ]/N׎_o(e GVZu3ij,֏CJj:QnO^O*ը|g&n=4^%7iW4NI\/qcTӶZ8Z ƔZQJl'NiVzRl+$ /@8\Y>Hd&Tjr^vDh'o&eO*\^Ih?5~I [JHD*rȈ?H ]Xf_@iRxZ\@|?v=#otit"Ǻ3婍F֞*+"$iV^;$$M*?".O]ܵ;w>eYqw%|kqÏ +{Mbgw!4ƏfYڕlX>:mA#)J4iYϲswӖǫHIѮP vU+1N L,\g1/~ ޢU &ϫA{ dŸCk__s$g&WҘݱCٸu8J<{fA?ۺY\Lcz+%ݲmd6اWfbi˗Ы]Sj֬C㷆L1NqJV95̓ gp" 'N#o{W4yȓ$GNM+f Xs {乆 ׸sNzNҟ4y}vaDḟ04+˻f KWz܄Zѱ$?OMffOm</IP \K IDATr=rfJCe p_˘Ͽgd;ߑw!ϼ`? =?kk%[#ti˸>ח>:>a֨=JIOk?6Ynso]Sm/,"9}>a#foӱ̩h<.&NRSOX( %2Ls^+Ӈ!. j륏 {xeq{x,_V'y#tgP)bA` d]䩓`=ɺ ӳx2%rj%s"`͑XЏt[t?*ILP,g"N/ mKMRMazXƕӆlNT@B#~G, 0;:=/o'vʑ>h{s=`bg=~B̬d{kDAsEAP,buExxn$>]}fR00 3Y RabbS˟1 &+:hj')Bc=_'W'@pBo9p"<*Nh?q7t["?!AOA{nm_ߝ:}ޥӝiLkc7rs^K"nx]zocT䟿=k'$ ģuܺz*$p7Yzʤ w01GLH<{Gah̕o0.^>l& DvjI 0I&fd9ձKoݔ!yuڷ/K/[-K1}.ιK\%pV(ׯb}Po^rp2;1藝# iRѴ(tu7cKL8:czoĄ}(ƉL^~`D_/z#XWbgmɋaxu3H:~śͤy0ID)z:O=Gd;B, 40pqI?8MH/u}5_hd|MR;c}gfg MFnpp>ڏs'NEAu'q1Sn4W MauofzGǎuF>7T=УkzO=X ERP *dFoO8H /,[U}+*:v~AI$5;rf |\oSGJi_$m{i`:HJbhS}&/o=@ YI`[ iV? ëo`~Et3S62ElzD].<>&"x$`ۂyr`nj9*;'2gQ5Hfj 7bvj0 'k!iphFǹm)tǫec$%U 3 x_MUkij3aIZF7|wy\^_\gpy9+-j->??Ŷ|yea l;,?SūQ& ȭqKɺr̜ kO5\KOcE]ah%p))m_d,:p0Ww.u[OȜge`<~5?A\Hy~rkan"|`q/v#qcbb'xTMrh`ŧ6f4,93wsw4+ْaSѷxs/ʔ~๸=G|e_&  I[obpڃ&IXh(aaD!6L9y/XA 8{5xo_cV-=>_'=jfq`O^1`f,siWs&CLz/9*>KDѕey8G>ff):-J!G7G{F͙`7(j?FNkK}(=j|9mZN'y@*6IՔ'X/}~Fz>#S2S];Km6C̠ ϻkY~+Ј%>{&gz__L˾8ۯBD\T{c}$ƺ nQk`}mG2,t0T`}yW0W;)pCZis1}~| )ۙjcxsjEثqR ɘ΍JiӠ8fMFUUcdhnF۪DOjO'"siOhb˽{_$3kz ;c_&5yywΞCNی$pV5L#O7ڱs'KJ[kwNeE1{zywW("W ufdy3;:Sr$}1?vW^tUc|SrQaaw̰cy{+W,a{]G-#s"vOzL^Dqxi>_$š$sm?|Тey8ul)k/ćrS^, z "" S,,F%ka""""""n"""""""6JEDDDDDDl,(YQ,""""""bdYDDDDDDF?8oIJNF{(Y~b(ye%"""""""6JEDDDDDDl,(YQ,""""""bdY h3l"/|5f!"""""dYZ΂yseyt; g.0[py""""""eX[ϯ*Gxb^ r옽ӹ*PquQ4oHgiQD&!{/Y>ǎ59z"UTd)C.&e>0-b9Nyo9V%}#/D{f kFӠՇd+%hȆm>3c>*)B@#fn\ݵM;/P83{nc=O yg$S)WxxnwRn40g>׍粙\_3¹(ӣ7}_̂yj:nQ1Ọ,Yr, n,tJ.<9#m}4cTNfrstQ`K^E*lfUê2zPa^(m?Γ{9\Ũ<+Q2U .I}]|r|nxwNԡH&m' %{qjOq]e\g(v3PEMjKEDDDD$QJ ѯye$ Јrj0,c3 ٲ+2pn/ܫ3|]oLghЪZa&WQg&'MZ3zHB<Ž?+Y>>X.BBȅ͂=NypHSQtR.[θU?soЊdr&"""""S2JbceG 9L0Iz_^u`ffU ZS;d۱yS""""""є,?m2Q% qC+Q.O Q/ 03#¯{#5I$sjɽl1_5 ʥCGpJ5e7ˇ2Ms0I]W_RT62$ѻX9HBi$LS0SQOg |&g U4m:3\;Y6=(d/Yz) so_ncԽ_F ~b_ `Ope6FY7:f,)(}9i.SF0?[:l9 fIW-Ke>UF+""""""v+$4^be:zbS'3kz ;c_&5yywΞCNی$pV5L[?y= GJ[ ӌ.<,+v*0Y,13̘Ձe01,nI̬o30yybgD Ǻ|ӌ cwU:z^&DߟFDDDD |WqI/ާ+lc=^a7o2D^u,]Y~(~a&~U0L ,b=$ޢo3L\a`&z":?݃A]y*)YQ,""""""bdYDDDDDDFɲe%"""""""6JEDDDDDDll< {ʲe%"""""""6JEDDDDDDl,(YQ,""""""bdYDDDDDDFɲe%"""""""6JEDDDDDDl,(YQ,""""""bdYDDDDDDFɲe%"""""""6JEDDDDDDl,?iKDDDDDDQ>[.{ȿҡ[.e/@j?CiW )uȿן]<BlNtq=ċ9|{M-wurNàyv'-s8P`J0ZpثoPH#0 P,"""""DDDDDDDl,(YQ,""""""bdYDDDDDDFɲe%"""""""6JEDDDDDDl,?lP֓Wo╩uŝݨ|. Y7XAM:~Ǹ"""""P muAwZw7`#aGH<ٺrW=QỼY3;{տ"|""""""凰,IB3f6xŖ#&}S?1uv>B^ UTʕӰ{O`mu?^ vNJҖs2F1I#^?۩`HM×J"z Э36fv2B33e_- Ԍd癐v$:qn8O7N`}#U3:77Oai@-^-}jo53nE6L5a6/ I0γa(tdҖ5$Ocy`֘,s(Li!]^(JJ8Iwu@wIΜ8x 4__f ׎yMΤa%#gٹ 91?;9+?_J6ɽS@KvA-Ï8U Dqp 8_ţua='ܲ3z-6i5a V~ˠgQX}DDDDDDZJmqW:d\'e-4t:X/O910M01ӕ yi7RB8{1~ #/T&sg`vUscYغ}Ѯjf>ۄ%؅ۑ.+na՚=\s2{>'70\X e[48q\9|dw⟹MGi~\?X>N 8R%[:! +V^+/Q,៓&MJq헍u{NkKÜI0 ?2Uosy|0>_Hݰ#3ͻw}{νq kZD@Eд"058!Mh0moRJCcڄP'`QJDU6J( "дB J pm bf=sH=~;O^Z驺xj3=?U?.ՍaX2 7]еS44J3wv.^XsR]nj=|xI驺xPϬ :xh:guG/ =Գn{ /som{\ ~>ׯfX[kϾU垳=vQ]zH__Սxa=$yӟuoZzL=zz)f JOIҥC]']qJOzKu[_3o>g )u?7ܷҕf0{=%>)O|Hܞ}xᢾ孿y|L?@yl?ݨsϙ=o]7+-oz}+t]ŏ9ެgT} zOik!6%n 7y>ˍ}׿}ejf3]wӳܧ]ˏ_}nUU35ݧK+{[t}D?}o_%z쾏_)ro?}~q=OR-;='#iԜz{.Q_}} _//?FOmT?ϟxZ=w}PɳЫT-/}܋ߪw|3u~Vyߦ^y5?߻f~]ߩ|i9: OW/}no랇o[7_N׿zݝ/E}[N>CIDATȽ٬RuYn9|ߪWJ^?y^xz;߯5M}CW߮_s~y=u?}#C7]D%5nw>yeݿl}-t0$5ҧ?+SXMSlT_}|X`%Jҁ;c&۟k~msUASjTjY$5ꦖ}[U{V~=;Ijkj6fߨ>jT:j*ֺ{^o&]_|ӨŷUٵ?:_g۞4*?{?vʕ˒J:t]ޯ_Q*q#oښo\ta>O ekר*f:8?|Psޛjoi<`/]sG~_]tp0/_7qj_=\Pl߇8A: /Rk}z/`/FDX>+ GX>m2`-"*a @@X ,bXnLgyf?\XW6kư|*?(c.|jk &԰NZX>7ΰNRXƞ єjlݹX3S~(ҴdMogs%?} zCV TC>uoogYW^ZҰuϛquosJsV/s}TyfIgXކtT]$_+}+R2+ޜ}R^Ժ٫خotXT2SWʔZvǼR/ǽeY,Iˌ.P]oe7>`YN1G~ޱطu^`J3~U1;}}3QWoK7(S+]#^r1C<5gR=$&nJlϋ{BL}$35 C`i.XX/}+oeX3z4tnm]7fX8ɪ)۾oTlnH-M?z$j☵q/ ek6&7uWv`e'ecWjcOkЛ5}(],,sTzйIWX"h:fG[sS[W:t3uXFX{7Zg5`YڋZ4dfrZ?x^0"2f񜸗:,ox{V=cڷnXJZ^qe~:=?era9=iFhVayS1lV:z^̮r|]ѯ{VA:M6C[ܥF GQuv-jnkEQ3ω7-~d<bKu4q?Vl;,g* s?ǟoښ,@H_:fy+f45z'#, c:ôu U>?\e=Ş:j{aaM~yc\>>J؋ \XnޟuL_m QnǛ.-slG{s |_ey 3{TkY+i$U؇Vib_hYԋ7(s]{[w1~l|nr}9sX<ՆKk&a9ް.LVG?m{#-U}Ԯ=u1Y=Eue<ߜl#~~UʳS,a=Zj׿h{viaZkuڵSVn()}~baL_(m1/|_0뵤vmu;h׳c~VT+U;85jjJ%-=B}œuɐZ7}rx3V][[?؜CMؾtϵ{;ΚױLR՞oϯVXwl^id!J1ˬWDZt$jvlϷo\nk:f[Pv=;s=?ڌ\VG[ռֿY-7z:/ %YT;fm\8em 14CݱLbǬ>ĺ4-X= V{tm;zqdl]:oT7Y?47C=zinXWۣ|yp gG5[Z aR`=Cgj̓gX.`k-==Q,ZjkGn_ڽ1֌ߗ֙>p~i|̂qu~ڵwigchΞUXՍ_GTԮ²i4,9cvl4,\ƚ\"viL?]{?~m{UV3[˔Q n>xOJRMZz};l5_?/^ה:>йI:,7mj>5nG6ߴ=9M-o:}P?e׵o7>j{^vkDUL/3©Wp׾fs_Aٟg֏5??qX ًV(k|mՕ͵},۷j>]7Zg|GGe_ώqY /yI<ײE<DzDil VE5?_FcϞ+{&ֵ>1|zVGqj<-i7 kpFYZvM{{.s^~GY=gդռb8o={p}vue9Pk\-i9׶5ϋrF SiZ=4iWG[ok-$[Xm#uaC=J5_(e5e,)勸l&ֲ`[Z kk( C6V؋ڱ9ΰhTڇ<lv[P vΎu۷\l,81㾴6Y x>,uܗҘC֍&gښ[#>w#y׶?ˍƇ6sZ8z֌d 6ߴ5ϴe pssm稭LƬl_'Cזa|/7C^a3γvgafJ!9gm ˍqY/Av}"Z!mlvA4m߮g=ۯM{q e/moYط{`_rP絽_g^ܛR}R Qf5ֱvoXoyv--f_Y5۷v}ǽp\XZkw3Y//f)־q6~p|3hRf?1㌗ն8rf!7®}GծvY?״k{]1ZOnm׶Gm=|=}?ꕬspd9O9Y0?L)fVn{cݮC{x]Nbar8\݋3j>Zf|QgZׂul&6v6osJsY549=i9ģT lfljɭm6gJ3Y-oaѸg5iTfl}fZ\Bo;sj^_]1}PGԮk~..VzV2vaO`?٬l[;ǂm&m:3 lL(Y%:ΔB.rf14 gʭ:~缬&[luطݜxiA-7惭8a5x wKJR8V뗎qzW-h8ru0{ټ:M|=>oT_la[ǽ1 ׍Ƃo*>ۄX=_x̘^f^T)5Zb?*ItՇa{^Yl3[gf)եZخG^Zb/1fR{k{_ǽf>5[6]W[ko%WZJ܄VX_sÿ3~{V뮙>cfe$׳?gjY/k4.^t<'M6wòh5h^_MZaozr]cߏ޿8Y-d`:1Hy}[cVk:j>ֺB۾4özW- ˍAί37͟u탯č[somukbfr=3f8bRl&7k~&֭fvH.|(.}kCݹR:_<*U͍M9Qx^,Xsb-׭el?u/;o4?;\־׫}oHM돱fb/ٴ`)}ǣ8{\_沚69b9߳?ˍg t]5|c}?{XSR5[9%]h,p<ѥkJsq&\zVc9wfw~)źMqkC]k{պ^׷b+c]ZuT}:W븏GK먫'{7MX7T+sol=F|m~;}jqJ]=]=io~.zž}kqhb?6SurP̂c鼱طuWxkk}`Z}.j͎}l=_}eLW7ԡz]=Ȭzg3q?g5;fk^>cLclPY`3r4{b=c>󙮙(S c{~qefz%%넯s^V&.c?}ڴ?aidxXǬVz~ˮ~]S]8 d:Ykf<־]GK뒩fه?FD/5fgfr]I`;ݻ+եEd5/Z<:yl"u :3CgGSc\R? `Ma<7lm~<_j&;z]}f\sȌ:8#>JkoS\8ͦ`klRy Z\ǣ\ܗ 236k;8#uuf񲹸CsY'sJa3I5zvNc\!sq_2 [C=dFZ+8'A6؋G9R^jR.uWe&a4yq.L6پdܐѶ^{ݹR(s+f ='}fgH[gD㜔5Kl\gFfzs:/fezޔNRjVJ|/ֳsK.Cg΍P6CgRpfLifJL_~MI8;/M)^iJ3|V ͎5cf}yڋ>cusؽ):3?fv]3t{+wkqoJugK)zKy }Cֶ6y6bo>d5_y6n;/g(Ό{7vg2X})co3c}߆s&ΏgL^k]=]7v^ωZg^kR`;weXL6kq/>c;X؁!oT>'mjȇpr冮~jlnhM*׻=gF+}ޱtޘzV+yC.C`\W/f4gyc7v,uB:ҹSջseL 3kJLUbs9gcB:x]z]+Ju7:s$!=FWOڼS zC{uϛľM^&z}Kf̘Ygט8do?&I[`lrn4ZCqX7ybkmr5Xm69뎝/:Tpuu79w+9m6=McsMj8 m8uٷTvzz')@MZΔ58>$zMS]gNZHu$Vu'wRC_d!vןizzئ]]=Vx\縞2Ty'wC>}|MN} 6vY{0S3GdL0qFg: !n{`7@-7MIENDB`kraft-1.2.2/manual/images/de/catalog_standard.png000066400000000000000000002126651467704360200217620ustar00rootroot00000000000000PNG  IHDR! pHYs+ IDATx^w|̦!& E U_]`ł{Gr{Æ"E:BHNNf$yל=gfwg͓""""""""""""""""""""""""""""""""""""""""""""""""""! uJ[DDD2ɷ R7jOPDDD صlP 1I7=^9D6bhmַں]T n7ևW_nGDDD>W۩j]i:3n] uuj""""냺 uߌ[bkI >HeSSօo/vDDD -ej?u!޷nFm WmemMUmo׉jsjm"7Q2i2OSUf:YmOmTAzsknGDDD:7y;jmF5UQmMlRHgH ds6Ͷ[MCM3%G1H]H0k3h,U5GMˈjr5Ɣh:$LODDDM5Uc5&#f@md@Զ'6W:1m2UOEM6Z@vjQM4fJuR % Ad.6Z|&j-LؼZ $ Kph?Q3E͋jzdҝ5FDDD2&A.mQ!9mK4/Y?t37-usEܰ='m5U$O6ۊHdFGQ!6m6E V nmh[[\֏yiЕʾSER{$|ǨEM j]c"""$ tQcaӰɞgZ lGIe^*sV+}t^X(@y[a@<OEM&&*| <І̾v?lm̳Q2=/%uRg*siρcvZ*d5mT=؇Ȇ$A,jբߪ[yv?J*RM&sр=\mks}caktf[6{ۨiσq{%z؜6ڵ~LIYU*KwN*m.x2k\SXTړ(EE!Jtǃ~[G59DNۦztCͶِ$쥻M|YGmʙ`NзQu=ַvI{m1L9nmu h#AD~jD֬K ,SٶlXver NvXZ/q&"uQ_g?/[SjR loݠnεAd}&6VKNk*l?anvT ^`K^^˖̜6;*Py8,ظsױ͛(z;\t~ UnlLD5m  %Sg7m.A=:dՖ3N fu /]RY^&3q_~r{T+A?ak:} A3ǃ~sk(hri{;89AMDDDD{}7Ole[BDͬ@~MacjxuCs>s,`l֭lsqVy ٸ[Uly_ڍeߗ(N(+-7;X*sq8聸8k "c%sڛ5{=EDFvٌl&>g1eTz8y˚@&@3.,'܌ ,"/q6ިC.?ɤ~c,,\Ă ).)u]:d4ibOݶw]hբ%?4'u>]~5]tCq>P6De3zn٣;]lfֻVrnnHƂ'sa\yl֫C^[1艹e͜J;%zFET?0:hޠmFc>Yv?X̚Q!?ֽKq ntlF>y-|uӤoZet߬{p̚3~{Z-0xu^|5<8D/ <џ|N,Q|xOm9{7^}ߟw>݆K/7's|YYN~qoז}IAASx8]6Į;ȡ`?Rr}7ؾOo.9_lq#;,]Ƥ~gEqVyiѼ r֩'Ֆ[0k.[nRD ۶A_S7= 6[K/ogAa=mwǟv1BLΥ_ӦӶMk.<~a~KwZGHK"Z/0/H2hm\,m h Ρ49-g7+n VjaSrӴi~#^yFJ\m'V5k֌K?|/SضmpܑsC)\`!gbNp7՘qN<(.t899 &/(8;nׇ9sy`̘9 blѽ>8Xӛs:E0ט,cK :!|n~26[Kg?Hx}=Ġ'qyBʁ`  먺9;am*iL6UbnXЮ|yվBggθ )--RW`i8?tZhAVVV8<Գ̜=gg̜Ŵ3L:KҶu+|ǫ~e5m1ŋ^㾇cڌ+5\użp S&ZW|O\uí̜=ﺕ][H AvWAic6[7K[ߘNK͜ camo 5:zԁI=for̷롿4Ċ;1۱m!u|p}bN֚K0|"`;1Ҍ_ee帮Kvv6/zFZ/pɠKpSc_`:̜5=wۅ{I>lѼ)x#_}g#>d?V;qڷk٧͝>@~~'_Ss󯩫|qtq\y6t&LH] Cc\ȍ T0v0<[}=S^¹W\,"""Ґc:cmX{Ƙ6>Iډֶz xgY~1o/f6kb'#ܲ|VN;iZUu`T=6P5OY u󉣲,溜˧p|ʖwAnTT ƂuXv3)fZ}&;A̮D5*bn5pKZdjLgEDDd}&8T|mSX=]7ڢ]:b jo/f X#,"""3GA7T\Tv~3kQST^uhN5v>o.o;!ʡ)`x=u˚f6f @L:m]jG n'ټИy$70xUY#7,"""d*j5 x&7-kk6""""XX2UsXŜg3תڄf&6'ǞkȬHra9*fg2sX~Ԝ@X=fC"4syaѮľ= PO UX ['ڏbޗ7Fh`Mݡo?˙k',)3PʲbTϭ\oO˰ 恋::`' hsa<ܺ8."""^1S m篠 a‚]7v˴h0Jem~p~d퓘asMfߞaX] {akmI*Sf-hk{ܞc 5k#4#mJT{bּPDDDDs&TsWRGE]D'{'#XV7#IO Qus0_':4"^1/Ov;6fk[TWhh~Tk@H8;k9\QYˮ9,lN_'+4`6=n֠e""""C,keއכSvp'lHrAnf͚ɜg 5( -4~ZuN4P>ľznD v*kkU}o~*mvϟ>aWds}ñ1M$ \Ƽ# I|xp;""""k_磟WmڌSJ$Cdyo'҃cxItߗNw /ԇ9g3)3Kl.Hv-U:/muqyFMP:ɵkiril;?\plzҷ3>oBw倽`zzi{\ç£ԓD_mӟ+o^w.%ި| 7)Y\}nz e|o͉epe'3g,J073{̭3)l^T-5>^\kq1cql6[>'w UGw}7skc||pϷo|䱳ͅ*8 ?Cv#Og:+8Pn-A\ǁ2*nЏھ?d XsLf-lRUQgDd6Lo~zJ`U~t uqܪrV50{s4;b.%3?ٲww""""6;C}=l-Xk(gDc'&'n/痗nfȸY,/qkl6`Ԓa'hC gS}DƖG>}u 4]!"""aîe3XS ʼn¤3V34C}G#fEDDD2#,;%Ya5Qo5dÞ<HrUM3Xq[kmmJtpƂ=*"""R6 !fd۲K3oEEE:q4iLviVP`$, -[ӣ[Wau+6c:MY3o=uiӦ:)vNQhfIHgEd4?"|߷DDRhIBYDDDD$ f$EDDDDPhIBYDDDD$ o9D> IDDDAn٥,i~MUft+\y9t±x """" Bs ruo{έ439+14mz@gԀx6chٸMnJ=v`\n9xq|҃}cWΡbr=_$;p=FNbEp.t>x)?:o?WVl|sNGYGľϑgs@'93x5KDDDDR\λѷ988E>^ܾNjWfSx3=!n87M3h}ی0}0ޚSO)>uwLO;#oc9sXWFo3jn\x9.}z{J<[mӋ5xDDDDdå\=8aoԃݎ5#kġq-hSМwJ*67\ɪ{Ca_˃z#۸C{E!ܸY+}؝/~rEߍSԉI[ؼqmA9A^nHb5YF?X\ gU.f;2Aܑt>WiT\WW^.81T;p\bSPѮ^7r K?׭]/qߩ؟yv$7s݌KFDD]W_mz]I=3\W.q`3~9o qWւܵ~0X Z:\Kp6lJuo1q8qVY?%%&EDDD$YDDDD$ f$EDDDDPhIBYһEd}5 fIqFXQdEDI˗qFDOR""sP:}uL~~=,"X|ӦO]k>^D$E ͒P&9"qu84iҘmۭ~]IB$լM:G3HM)4KJFDDD6dz#H """""I(4$,""""BH """""I(4$,""""BH """""I(4$,""""D]^Z[SGDDDdmvERsg,,cJ IZΟ|6nM$R_~w}5z>DEm&#ߏgI+qcRhN⍿˹~\8BG1b =" G&$qx`|lD_o$(0zk@\J=*6(0J9'5 """""I(4$7GV}ޚ^̄2|iA( 1jCgEDDDeϰ +^\i2ci _7ՒBz9%8b4Ah#{|:{`jNYDDDd=ӂ2:6~F~^PqԌBs|~7s籜DWJ9I>ľbnyOD촷oH.8/Wi=dWM\S .5ϫ#8/XE}uec9P 8ػ31{He8_%qϩGpsQ~=5z$m%x龎+vsҧyxJ~.HJ|/<ܹ ; wcڻ+FœU`叼.lGc_"u<9>Fﲘ/,k.Zn]L1_4'/;]I; ?{?oչ޽ikhr{~CVYs5alq4vgUn_n6"~~}s&/.QxEgGrRhy;cLg_^櫢ǂ/'?c{pu~աwSdcvO2옍n/g&2kqeMqWs?v=sV?Qo9#_.N F?%9bN_Х1ND8>wao28epv-qs;,,qkݍC.3k ]wSlUv8f|X>\cy[AMFrקY݉><*/w"kA+Imӏ䣏TI_W>MM#xy?<1ݫO.qviigQ^y]wxM㳊_y}u仼?vX L.sc)>9'lϼɾsdzJg+dSd:c|{Gyy+ęt[ I|ݼΛ<}A[>vޚ_q93\޹Q?W}F=ȕ'HGg WR ]iVx-;B^"|5rX6[`?/W~ۃ/ֻo;%Ɨ9t?!nLWҨWxu1.+aWp[sS/r3yaY^qIz}%1w?wﷂ>e?=Я6'_睷_e@&88-y7yg5(~\X)ݏk{/Gs-O1j "kBsm8m~{n(f_$<Y}'ZJYp6r!=iӤ1U@N>i84|GzY‚B||^ndagIBv:Xz5uCPQ7Ɉ49vӽuSe1\qcb1fH?jš`{pi:]b8R zk;9mۜ3Sq¥UMȏzW0gx\ .̝[-pY3:^}۬5r*{B.㛛YP+=vݞHy֓kߣ(*'wn|vC\sx kG}>'lNġ)+ܡjW{TrV=.vO~aKY4 VGJfO,\Bm9 o T}}ubmhߺ WViB֍VyrWʾyO+^z1{z(?ޟM`yLW+:bpwfl>4D ͵d{=F}Alsp&ly ˘? [XB88o,Q:{t+ +>{?J(Er PRDQy Zs?rn,!uDpMs UlA6iklPq&*v`ǣG>Ao1}Dri٩-;l̕WO䜫o-qV&\ZvwskYup];Ǎ/侓P9;-c3qxZnf'nm۶Ɵ,g[Y~in% 2oAWּ]M+p̞Kn8'zb;eC? ۿ2 _*~ UD.Ϩ<yirO@yl^?|8,}ӂقʠ(_:ec>K~Wtfoɞ7R䁷kb@&|̋+,lj+0ybji0Ux:+sXa8YXJNMUS?[OON#??8}E4asҁSޤ=_Ko㲧羳q 6fpft]lpvp<Bɣunlؘb{1咗 ;{1_hR〓G傉p]~ .n>V{- 8O3'pw둫i\{ <ަg=Z1Y>_e8g,Ms[~|RsQS8싻9#*9L<x^8`4ڗ3o9]8I~ȓ_ʸ99y֛ٛsIrS< 6ޕނ鉾v ^;^0hS~ۅ͋um%8톴 f]e~Vb, k-îtp'xm_3Ukm+x9O̯@*őclxWѶm[ _-e87]W|E׼;zfέ/(\@7gr7qWւO̾=HV4g  x7]]} u9Ag_㙞9[nO|1?x-vkq\76D}b,;ߐo|T=QekV=긘/ *:5ꎫ_3ѷo|9aq$H?? YWǂUxN66ۅ9sQh^g9|5OCubQDDDD2O9'""""BH """""I(4$7`vIDXV-׀i846S/ )tM품Z`|$@9c iIBYDDDD$ f$EDDDDPhIBYDDDD$ }䗨~ IDAT\ k4>%qilŧ]wBs xi~i,%~~ZYN]6:YDDDDi:%Z8h>mOYl%ӦM}{ɛ97.]O݇74~}a=@4@:\_˚Ld~Inq>7ťyԃvޞrSXޜ1<6j~74>y >ܡ ԝ/OxXL͢ˀ38g:yU!O>#>e/"""4͘1yx'kekwV[@qq1-qi+y}F䅤^՜ o`$9c?ᣱ)̎Ŷ-_ĤFBsٵOg ]&""ӏ4X>zĝR3⭾#ި":PFY߇XV*hDt@{xupFO+%^>_L9;as>=(a%6"VZLïqSsfy|t$Ö.<˥={9ϔq_&-#8<X*Vu3숶9>y~_v>l=+.θeeq!dˎ8MNN9ϼq1$X9%?W>ưc6aj ˈᗕ<*fdQF(_Ϝ޽~b,^M_B0#}GMջsr}<Oe}pӿR!;^°{sÏpVx⓹EraU1%tFrQ_""""k~iyɢx1{~I9%<)fu1{dc/?eqX{aCVym^G}w8o:6ſg3(}|c]|5\M|ë$s}k ;}}_ŭ7\zt!w(+Ƽu{4Y|"'>o{O9_xwG>SH^yحe.Y(4QeՂSrs/#n#:?Kqqqbb..z&3xdw|e3-J " *(~콜lzSʩ(!Ieݝdwab~9yyf}vf<3cԼ{P;'d8;AmM=լ31d&fڱt!qr}]PFŚk9=R֭s >SF`cmۻE,L+0{ v]b/>i3`AdhG1"ņ-m(,P_K}`\1aO)3`i-`#v,YLG'Q^ULZ ְ1CGѴ.x2Tś i6ITXRJ݀z;.B;q o^dehxnbKɨYYBYkxgzvwrt ssDPކUߍ$<"5]m)K4XPGeCC Q352rRewfbL>&J f{I'DwB!ďE}1 z$?G^0s% I׶vyt;&'5ώ]L̈ IJ0+V,SY$nU_3fϦc=|Gpg{Q!)U,| ZL_OI,ҋJ#@Oͬƫ;eeBi8rA˱L{Wktm^Ow {Kς* D1N;5S%Y86K޼BV0&u%kY<r?2vb[ZJ$=B!~l2y?P#]qLmfyWyoI }~w-t>E) MS_7B<.gM8O0b>WBۣC; kC.EP=!See%\uGt|Q^;61L>7';, Wv{e7aA^߉7ho) x>|Y@WB!~'Z/jT`:@)4=t:w燐=W LDPZǿDx%E?#RL !7CI߾piM_$B!~e$h΍={M"X6#0"|B!ľGi|%Wo!BP !BB!BD!AB!QH,B!D4 !B='vԇx'''ǦQB!OGde5h=ߌTf5 qۡ*“1@b#=1b8jx!~Ռ9hJFVʧLyP3ggҞl]&~HLjas毡[5d3Tn`7N{MSڢŬXQV@8t M ].\1|nq,6$B5#THbJV R:LYY`$ eH~ 121F[K+ ֩ע9cFrZ,ZX/5M6eeB!s4ͷ70wmP:M,D?ƠDLv+6z36Lf5kruh$ i"yl*uyO&B! ;o #FU @\F.#F12QiFϺխvRrdR)Koo^r8S11dNY^d>c>v&'FJ5 Jcy\4t]y9 'B!"y? >QJ阬:t#G%*M^!B B!" B!Bf!B!Y!B($hB!" B!Bf!B!Y!B(&?s`xRK-c̨QXn!??J*ÓO@ETMB^!BkF =PXD'3B!Bf!B!Y!B($hB!" B!Bf!B!Y!B(>ͿPcFA6ᡇ0|Q={rUWH!BIO/ :,}]^{3< !B'=ͿQ^Oc[oqgcfߐ6hI{ٗys!~`\_ƴ&gN#۲7;IW2흱.}\gˌ4ӧ !ľ(0u6ON\\Ns4uTZZZX,] Z޽td舑 3~w>7._A5b_?g>sVKzYT=~lg{>u6lO#9ekl/;Z&޾ÇgN{n\[sE?p&L'L z-S$Pxӌ9d$AmwcK9ft5cø+ ޝէ1ed&u:e%w3%'1eq WH]Gqus̠TiCfR.[0e=6^k:ݻyO9LhIذ/'q'q*lW,A뱡W|krI*f,lCcp/Z[h5v>_٦rd:l.?wrȤXw"CIϣw FrRi_yDfcm^|w™^͜F=Vʧ\GLfa3} ao_4I}g^ꟿgʑ3anC !h48.bx衈իp%KL{^իyW5kiڵ3<{.*V|e<. R09w1)dlӯz0l{ˏw>c]{&|Ň7'YF ߼ܫ^fy}M>ylrw m qOWu&w0l{lݳ?O_lb\F39ss0چ27iE<'x:ׯL_g=cüS~_tBӴ݁YUe 8Yf0YϷ͢C1q0z6+qƉ㮖 ’Ya, yyL1;e;]vc mv\dfTRJMHAbbz"SWҝ~=nro%^ʣWJ5pXH;o9s?gөy޲mެѺSxt.|w316>w5wM`ΣL+kYA^>{˦p۟Leʕws{yiB$h1b8s `+=zcF0TdKK ۷oGfԨQtIرc{Nd̘1 5)!k9M!cI[b*tZ}ǟ6LG$&>dύE2fp;J4Fʤ9o"vpJB|Xf-!㇓gbb~UV9`ud~4RgRcl/[ehS[7Sϟ@BL4W6M@44Nb#m.;+9o3ap$y8qAI3y5?MIEW e&qQOK{pO$i 'Ɗ:p,wcוME̛kiS IDATzȚMZ\؝1Apiin$! v}n1 }RpX,$ *ʫۼRͬ~J.<9$[|8g4;VgN:q4 `c H'.Ƃ &dL/R*$pWi=0w-b 96n3 ^]W#~/cy1I_S_etlVּ>c.aWp±E vrˬ84}]ʝO1ZI?!>kXmF>-ĤOx/M6X7;T 0h?uTG?kݳ ]=TWUlF^&7-No' Uw{;1]&wG$TRS29ᶷnǭB w6"Y|GY‴G# w~wy V\y睇a<<3ó/ R&$ ieMط,ge`׸]WpvߩIݗykc^ر؇ɇf f#d Du^,7H=8{q}3󹅔r#AH;[4ի/&uLkcfE{ϭ<]-9{g͙sp }rwv>xSN< K'"=WcFZ<Q>+ 9Ӈ:Ci)fÚ߰Ԯora:4ճ7l屜&ZҝM(&yrܦO_qL;( k^[^_K wXTm`zKyd~y DPJ#ie{7n~&*=3ME`qG*)̴1fĿ5.wt`±8WYӍ5̦/A`*DŶh6!8HO//p}0 ƏƍuMذa[o, 6x$1qϫN8bOE(b'k2RH:Iex^:}FgrĆ& ؛V4ԷIJ@l\OJ^Wg0ljwNř݃'`MԶAlPNafnch,|&Zody x&=»xy*YB {˟AFLвD c| UƑ\pWmNʦcn̷ a?_Le3L${nLā}moASm|y \I=-;|jԺ ЃՂ-AIAw`\_{Y9t.>;'K.zQO裏!CNk֬!;;>]hu&Ji(fFkF)4L 4_ }u21 6zM4=0 /໊<>m|q4Jw@jҴݧdM^0'wBS`_ώ4Gl-pᙉa_^ǟf*]|4 SkvogbxMT6q V_ǐmϽP`ߨ:>Η?x}}<=KG:gپ~}'ҕw}k(gq ^[t KUYYIFFFx2W,eZV^;4)<Äsys=wO/'/;=4 7i>LB~f͚C=Daaa3fફ yIgƑvBiW~|_i1WAAvu) -l=e:^ޡN!Z:SSbEv֑|c^C浂v(u;~ 6cTaeWmaګENiuGp[ {o%!4FqwJu+u2O߳zƅBw48IPz8 DBI,~xV!:P"B!g4 !BB!BD!AB!QH,B!D4 !Br7.S+B_I' =B!BD!AB!QH,B!D4 !BB!BD!AB!QH,B!D4 !BB!BD!A Vvk#hPi!E{]燖K\F!~ŌJ?/btBH1" /;)dK2aqIM&_<14ru~hyLZ+kپ:7^CaM'gDi L EՔmi@l$ oLhpNUz"F5d!uˋذ$VXҒȳYSu䭭NœV׺5e Sy6nuT.iv_Yu_yd.Q_϶T'f1bT͍bg {jGZ~7;(u2`Jq:l nfضnc%[in1b$FϞnt^1eu<-rIC!9u8 с qz2L/&*VPPfbu&Ǔ^Wh5bH P+jFcF|%jxkjʒz)(cidg\= X$KJgA^Ri'2{lKŶzw2vlƒQ]%}q;?L\l^RRjG7Ċ%s0|t{`;w]EKq[B7¶QAcA)ԃEfA}+ԓ4 6.BI,@Bi HCtSR@|;r2ȁ¤|Ekjit)lIdg)K` QMih2 sx9@lntUU|=1Y M&.R`f)؅ԈJǰDb+bZIfGpfKXZrvd%D]$ JE_U7(wpPg6Sސ̀YirQ1[7:IU!RNҐlwmWޭk=dODhPƥLJ^E1;'}cL6R8LZ̊SHsr<}{zO<ɚ]hѶ}d떈 h鰁ZHL2i$Fv䎍PǃKuޤt-5|.\e[P62Υ['o?xnaScH+ފ )Lލ<ЎQQu͠h\_†JLS!~ 4@ƌ 9EV “"mFCl1.!_H]Թ2D]X5!] ;jf#e@;>ƕ@Fp®b/NzJ iC\eS [z-%T+puϤ#*J[6uTy院|Ug4;}t/;AT^(O :jRqrJ&kl'ieLNSL,q^mT$Y'䐂?KJ2}un[n$E#iTBAA ^oۂJHVV=%x*:K[o؊$Ҁ#Pv-T4y+uPyd$Z=g"v+>??_-|,Q(pGV͡&nb,XwjQJj+V/n5З*ւ wM/m./ˊ T40t FCLcbRɖvLFCK gv=x?ckZlb5!,XU)-ӠŠuG)+ bJǿBauta,NbWShaf!bfZxR4fٹtrU9 -<"nheA3:R7j_@lR:[Џ 1 M nK!Y+WU0vSXly/xAZDu,Z= Q]'}3|)P(FRWShΥ)oxFfRIѶsB$Jg {y@4vEl<A`ܩ5%1-4:ɉsf9ae#6bc/fwZɘ]WmH5M uo=m , IlaJ,KeWӡ]Jf׈ǐ\BC85lTr-(ze[WǎJ&`45RYBu'(DxڨXKkFACzwipR nw0 Mn<L ʹ׽ hq:Ee[S3$i=#wשYYA}R"1A={YcfR_뿩sk3Ue 1 xUQYk:UF;Pڈ_QG]6} /Iu3lֆ xvQ}D',Vl6j}LMذ}hBeuҭFժJjFH/}nb?Y:įI-,^@װ9HƠ>q{\5U[YTaMpn96J >ځT82;*wU)cN(flVe7 l\@v3qWS6P=I!i$[jJve;zS>9%m9PlnhVVtv9h :I}SZŊayAA;)YfS׉JH>G,{{Cr{ n WxqU5Qo䢮R#7t?(mkX qt?(Jq~S?p{:R8[lQE-&FzED/:e!;ٶvNQ(âկH:K <>,Z{zՂ-AIAw`\_{Y9t.>;.5<%KvBԯL2 [GȪLSfиmlhIc踎wV0ML k'Naˇߺ<%Y%q3!e 5KȧnZe} J]O%u|=|{ o;_R`&pCG{%lgD;ewDCQn!`C!D*OLˊԣswxyЎOU0L>7'w~~eǽ_v3O^|aA^x`4o6;×t5-w6OXPQpM.{ކ:K< d|bw8*/|ļ&ͻH虁=|tRóv(VY} ԡHDN:şGm={x$]"'̌w(:qTR7$bG#B_0 ŏK 6je=yΟ"ax>;['BNf)9ӡ~ƀO|B!~ ŏ?]-BߖˡB!a$hB!" B!Bf!B!Y!B(s`xBs?J*ÓO@fB! !B!Y!B($hB!" B!Bf!B!Y!B($hB!" B!Bf񃘍X"Jf" |5w1%.i_+bT󹬨/B_-y"m~̲ LP gR/9&rӉPht,Y8$vAse!7nvr3|h:aߤ#.-ʱ9Cc3?8x[H}׺ݻ9}PJԒ8i<}-Zê4(k14?穣hJ6lM9H>QCr?w6֭DYu#mXKуufְlhk錘~0b$nBk.D"yT&OVtJb{xl(`9hTf 떲AYF}U3q}fjFJ}囓9l@b9NKi.df3jqׯǑLZo79N 0e|Qg$Ʀ:T7bmbz;т{zɓ9<$ 0}:|^fK ˿)kƦck#v5R z  ˸ K4TLVH!YtR )4[HٸfBuܰV<^30?0vI՛)iƭd)X귰h&j۹ΞПdcF\׊ٚ2]kY9((ŰݟC{bnZV6'vgttF͒r,sm02Ʀa7 IDATnLcI|v.TJ'`65r6n~Z_ 3i*FUcfL*b`r۸#^̚|G 'n*+S khk6SAŤsHd8PaٶfTK#[} q>$ r߭oO ͲM,hqp `0[q1_@\.yo(.o%+l+1$/ qS0- W$i~4M@;QU|6#Gd+ \,]T6duJG4 ʩk[ L$+R#qs }H%6`3}Xrx;͹pUln'xᙃiMÂRIzM^O_*;9<'f ۫ gtw;[2zpb:6-E24-4GB LZU:Cx=xѱA?tt %[QېCW幓ho@e*.ٱ耞ލ[JX*u@D HOҦbʛB<$h>(;yn~;@l$NQ+%JdYl8%VJ喪9KR[*syeoe(u@ecYW$W=I5t@.zU}Llm>mU(41xь'l}}Gܺ ׂEz`uGd3|>9}M98v&Jٰv[RŻ*fs\Od+7/s*GfLJc \w"v4cnVhNSxsBv'gg0d) Na{ =~r97c-.Zgxfkl38Rot{*/AllEJ@k7z ;x~c<˃X%U2 P{yChJ፜nj,9s%' LO88)oł,zˎ/Z7/un+@ʆawm;~'!B`dd->^;+vl8tų)v@kcJ)\ͭ &V]g1T edLP2m'^ƢSd3yy`ecZn)A>~e+zH0Dl%v;&I@l$5ù-@9zfWq4qGyr;&:`˭~~>NOsytc{ Z[p+3)<& Mvm!c{5ׅR~:,=d3kbfydg$: V~Z3B"ob3$qGߋpw;LD3K7=C=ZqzV7Xa{Kud;dq<>4gܵ7g[qe(5@0Ass3Rg`;a>#UwJ32r?'Ț6<ÜÇKFi(쭃1{>A*_FrI!~TS~iկ)T^iktikUohgE:ynԉ~Idg'5(U_c9fa݆RZ_c@E2u3SO5z߿@ca{yv enSbjuS{]cUQn|wv20g]~6`nɞz-hX瞲%5Pz_̶!XYY!W'_oW,כd >vW _|@j})(.~,1˦iV[UR>]WiW_xE vT{=SF %\fX=>WպY^E~[T=We_tvXU u0\~kNԪW!īCf!l~Rl)W/o+BB쐀%N!ďy#B!+Cf!B!ꐠY!B:$hB! B!Cf!B!GΉ=h?#OTvBI' A؇pB!JdxB!uH,B!D4 !BQB!B!AB!uH,B!D4 !BQB!B!Axn~%m6>erLbwp4OT{?t}&/LS!E"CgۧL,e$Ppc6B^ytM[NݴyL70>k.TyY9A+[E&;<2ixCl`& [! p'3ܟr u4#-fg!͌۴P1ǔn2soh@94o^_c~&vTC4Q:[,L%H$tLeH}X 66rjy.DU]atxO0/ !>!ʘpm"FR 4w˼T2,^bMs`G/Pڹ ~bM`eM&g,k$r-}1^|l&炄es)E˲YZm~E%AH ^gMWsuجc2rGnD[h:Eʦ61'Eq&YGk6S'pT|('$_z&&Ax Y 'â<&ݜ|+u?4tB f@TZ#:LjkgЏ^˶(o3FeB\ukc2J]: V,lm= M&O րsa0k6Gׇmx #kμfc+[9ԗ,[Dl'1HM2=E*t Q+M6 Sl&ݴXZLwx( pq"ANsܞMӼ8j 3>KIYXty%ϡ*8TNMVRy (@#xk^ Jy)PJg NעOqoMmŅ,YŘ~ 66{ 5ԣ-R9-sЎ/^h!~Anݾ]TSyn@QGU\#zwxxo{!<*ҍ%6Ѓ̱~wY8yGebx4䆏+xY䑝']oٗX4uVĿ#ʓ4\v kkI?m e}:Gx#aUї]D6^išrܘaj܃V`l}V 㣯2>b/x4 \o7C0ls_N zȳMxKPK_W(jfw~{0 S_(. F*oH58x#oZ *|5ɮGYW4vV{3LLѵ<>axn_b}.]/-#-{i濚ez䉼y>H<э \jڒB< _!熆v{0FRL&(+]=o_s편qgȘN$X;inU(4 ѴpyڴtCp.^@T_rRaCe '{m(Zp `v>3|8UtAcނ@a}=>16M*rwi4\SlKi!u◣0^08] š0*<;as P el6DebMnO+E|ab~eu< oE7l-!-ndh+6gY`Rߋi6.swC teÛ7)tP_&ZCw(B,v7hpq3 8cfd-kl$9@a{Gh5&W3 фL6p5oYAldMlb Ft'ڃ`-u 88ǝ~61J !ODf ՊUs*k) 6<"!3'l+stTBJ=?eyCwК4j .:1޶T>|F?V61G:(M9>I7恻 VY7Vyrа9nL0a^;-M0JEJPXܴY$exDSO1e?6bږ8Ұ;4G8yq`BRF թ?P Xlmi4.[:ˑ*>"'yG"9oaJ9 uZ]&t=m(!Y܂Ln%O*V1ϬiB e׷ il%83`v|uqm ̲voºfWx ks7Y{;f8sl>Z`>8tmmLo23A7MM5-Ȧd WF&T  =MLM̼N:)hz'X{^v !OMzϊRvZ^2"p92}nawh??%5Qv#mY.q|CccM]~܏px~s )l;v7Z)ܴw$IKk#'V=|XpG9PF{Vgq C)u9\:nzRF̰F>bsExlr פ{6ݝɼJrUi&-m辘g4mvn޺s `?CghfĤvOinnJnReYuZNUe2ݙ`qW!쩻Nzrf1aw*׷|m)ߧm+nW!fuرWLdOTS꼒gM;+@U*rS+oO`ok5$bvG{]eҫUUoyvu¶TOW5֡hOru}5\V1(g}yYG-՛N|{~r[]BWI9hUgP2ދ!5O_ ^)0 !1I,B!D4 !BQB!B!AB!uH,B!D4 !BQFNs`d; h죅YU]6]{D"oi%6cÌL.KXA"r 0ﹽl`|Ah4|_u3t.Bb*+qc;z}N5j(J{C1F7 ϘAbnb4xT^lܰ{ /Wy9!xI, B444ggZ;g_!vO;{霁CgY0Z^2@Ν"VUaz=Ip9y~caf=piz&ll/hkI3xA;`DbR0ss脇G+$(,[Exw0egϏb pYNe1rk@CLͳuȇ<(kA沲RX:.㵢zg,;髎s<4|@!JŋJ[|V?|]W.T[O4_~F !^4Bnݾ]TsPU_e^QI_fâev py0˒a7LHL1KţL-fJߴR:6VL=\ /q(ivF],N(ls;6vŽ0voǂՋϕ$4SDˋ:@++kz rvZؼf L"il@{KW>2T4YΖ0󌌥Y{ rBdO'B92-Uqi$5QJc3̬6 f'8Zi+OƗI@>$pmnꂪv;&I2]v;K'̙ ?YS Йs }yO`-?wr/^D/ki;Vζv< kEr263?abnI!!Pa]`AX,YpdȚՉCbDי1[J7$}ϗ[ˈ39[EO2{cu]6T&W L͸8cȘ8# :gsxǷ7ġ ;ؘ"rFkۄf561p5Ootﮓcc*oN||ֆ4-%P(/@f&OְjU(^4L|b]M]<ݿnů|Mf2VDzh?B8Q'0S X]c( W[SA`&ͽe K{+';,qmcZ4l^8Y607&+l"C4j)UǶHe3!/Mۙ\kKaXҀf X6:Lnl}䷙T̵nUւr⼞UV00t H&pu5{-jD[ʑ5AGg{ 7>[L/3 ѶT:E1quHOƈ ڊ[1V3Չ?Zbn&v:n+cr!G~yF=jȯG\nƒ-tX \rO 1;tzYW''b}i~;PB_< _!n߮NkVy=Ql`Z*O8)ifyvoƫɷdXfnX;, Ma 60zTySd'_]ZaK"~y6}0HN, w[JUGs^&\blɤJ-inت(VN6N4eyR]bY~{ Nzy-ڎF:öR>HOW1,',wFh@"E< _fnLNhmgЏƷeb"oqLF_YVu]$1VYl 9F4 ٘"Ѯ'gjNvZїWB̰xwݜ ZPV\)Sob~2![[Kunh{̫ IǛ8יj)fZPʊH:ј7xp~-zIEc>MidV\ U -(&)6sD96 xJi4641ꚁ?R@tD p?l%g柎e*63-2Vg/n8)@na wg#s,lcd,4.gx0+&93#KiVztU02,~f7$~&6zOo `S[i~ceMmr%vbNzp&4+:N4qJ;p|E}a}Bz$h~}2 Y~;ht[{a"߷jz|,2oqE^|@kpv(0u Rfas@z3#>֙uA68qvZ^2EtΖ |U)y Ʃ3"};:A6|B }Oq]Q]5̑ޞb>e`Z,ۚ9t֎N .eљVM!Nxp`eH.'It۱Ry M),v+be))ey0bI,ill<ӷXCOzȑ]ZgNLz*>J\;nʡLZ83Ⱆ Q1Z6B'$<8lg-pg͓ZIwꘑ:`տ;|e7۫qEQi?P'`]~z/>X`n {G4Y{ZK+/~ő ӅtikUohgE:ynqܹg3}o^Vi6@0b t aRg { b KL֧24+eYzy&Oq3p¹{q@eWG>ڳ 睊(Qꬵ} O&MB,mP!~L4 !{ՉB!^4 ŏGsA~ !Nߏ,BUc(Cz?DB!x B!: B!Cf!B!ꐠY!B:$hB!yzأ<^$ "-Bj$Y B!D9!B!D4 !BQB!B!AB!uH,B!D4 !BQB!B!AB!uH,^廟 ,\ҳ7l/#cwzuB/gZf7Id(O gYtp[f$rՙ,YL }Ϊʌ%n*3n.6[y~>) >N]/ls,:̰>1>͙Fe%r&#r4=~fɇ<\d#Pv|mG8{>߈#̭') ͽ ?Ae/xUjeg>HljSKuB9E+}7>l,$X48Z90f}t4Ȥ!rox-bExXYñ{]bjJkWNiwL@9Vg&Bį.lU~-> ׿n0c9ﳐwxG+\ :Pu^c|0سn}=q5\lilep٫KBTcv A)Ye'A8`c2xtG)2 yBKwW\7Ddfc{F6"G9sEK0sS&oQyn}v a >ԯhIro1m:١~\h~2o%Hru\vz?BmR+>23v\. RN".gIxiƞ+.#;s?L5ޛSZ^2@Ν"V}q5˩h Lw'hwJ/= _!n߮Ns;'?3⦛B, Qp&h@zqUW;~>w6.:M׿ƣ=\45Nª KQpFbmt& (ȑ h`ͯ15wp7ðWj Ml`^QI_f0:637>fQv? 7]{G[M%8ܠ`v&I#XO)iR~HL1KţL-nA̝!%szpӆ{\M}.![УmI|} w%?6 _ϝNNo@6C'.*Y)wuLS=oWvZ;[?ƱFmgiaA)?==͌.;L.pBxֈ{o.b 8rJ@[O8TDkPvS9` 44L^K+G:Jۼ-ȉw~ 1ݛ׸mw_net6Ρ0wp|u[N ߆Ǧis!IQp\PYEu\'`â]̲", ; DZpI&OH0ugDjEQnf?w&x0}S[ΒE3 U:b.o{TC"n,%JuKo7^+@&nV:ߠoE}ϰ:Sx !O@WDE }lȒɘO Õc>I~og wnan}& ](st&ҝOXYEb7LmV7ht&IϱR9ԡ0uAhL,8j89ŗQnw!HJ;wlbLc_˳P]s7Wݯet3G:'tgvh*uu++mw'(2MmG/`U[OpD©J~_ޢ ( uү͉F G&:3#[:W.t],߿MtK>{~ ^gp{١Pʆs}._\4ފB@LO D7n }(K̑h#eq8t} \'4ΣV?{Eq3-A:Hݩg9vzbRT"tJ 3?v7l;@k^L(} (KLv fq<$:[C|Y? IDAT,50귡YF6,͙\ 3 1u/udhXC5Ȩu9 '1U{QaKL?r (g*TwFTb™$բmg=Bl^i[6qdsdFAmQFhX9yD%'@GӰ1VGPj%@0Ue̙ 񕴎oDIlX\lG hYl<>sبvΠ|n"1,N&54E\up3f9wכMٹ&'Zgz5LxBsZc؀NŚmZ(֍>vtQJ5Qm C 7ʂ3DDDZw,aUpEMj2\Ϫ i],D*~W\ݿ" +;ʾNkw(ƍ ':VğO1g mcSO;:&vlwLvoP6~yRh_ R[kC ky=;~E{Σ9y{+z/s'8oMsy%,s?T*UX cKO#=lzq&v)80/9wqeu_ϱc~e[o]_l)m]iR*.z e"cQWj/ܿ1r&L}E(ط(pBužRoy];8'xW, ?JY,ZѭjR. FXm:^X+""rJ"rXt(4@YDDDD """""%Ph)BH EDDDDJ4;#"""R`*VBy,"""r (4@YDDDD ͥ.c0DDDDO@YDDDD """""%Ph)B%b5t[2mszR>c6Qh>2e"#DŽG2|È|[n,ŸQؑiX֎Wf>w""""6=|s1g,\E žimd;sKgqaVq! ?h;/"""'|qm[8\{Y8s7 ~vQl eq2*pY6H&com@Ah1%ga=s!]hTG`WIēk)~i}}G~Ȯ ѱcu"}{-~a8cҮ{#+nȟBŒM2{'gm瞆6'eΐh2塧dUFH0FNO/^zRg|3/́l˻4r \y \Nodp,5zwb`g)L4eMdr ya;4F]}5QFEDDOGZjU`Ub[Q(Y:%Q?,#,EҌ}kHo?#5eb$Y SXT;˜`Tkot8ፂ:A^k{1~+aخӸͰ{`o~] 8ӽ>p5o<qL5U'xnSlpyettcgEz5k0z-"""rq*m)_quy[/.nnCWv} }噇Qd1wt+WU˖Eo$Il[n,*{s6۲le۲l0CJxlIz=܃n>P>ˆggb琀|?}py7P_[~es._Wu{ZY|ˁm>+@3.vIeӯl`FO>)(i&~Mު ߗEDDD4=CDDDD """""%Ph)BH EDDDDJ,""""Rf(4@79UrIaDDK%5J %g@YDDDD """""%Ph)BH EDDDDJ,""""Rf `ic_Xu%_ oVr*EL794usw)w'Vό GUeJx0& AA,~'j>{k8ߏuߎftpҒ &"""R 盝Ŗ9|q`hw. T7Ȼ'њ*@2g 'NQ>d(4_ Mibof <԰9&6b84<-ގ~zfʀ09|=OzQ2oWn.9AX`=ff e9} 3[X=<1Ocb _b\'F9t=N~!H-c "_*{A]lő-iP>1B l;mo,ý5/CDDBR9LMdTOӹ6 P-T(0A$LUӪ:;F;{Rk׷ Mn= HOpb>.5C3Q d&m`kgجڛGﻂZa ri 8^fEDD.,cp6 m.\N~s0\Z:Wsmgc<أό/lSCG#n"m?~: "ˈH[vmK%9͢FgdyOet[~ Iϫx8VOӭ e,<Í0?斻>6, 7&b ~8󂽁io```uar׈B"""r5)]Y?׺It0}Bqjv|A1q5M?tϕTtlk7 8~OdlwQņڅX} 3qЃoDDDD.!""""Rf(4@YDDDD """""%Ph)BH /67-S8lM.v6VbCQz4fsvXw󗸹#\2=,}5M9@ L[㳑WSym~@xSYDDD7Ph>ϬK0 w1lpw99A0=i6Rs"޾5m's㱺\dÏ9xEeղ7uiqV9 4ǞmiķAd@6kװbNeڸ)mZT!‘Ñ5iA2Bд[+WIÉbdw6 \ϡVV)eihGN3yw<|jt%WnFrdnK_#/|Wڕ&˵mvsݼN*&ÝEPɮ9*G>ec[Z?O&&= ؍ZΓ< aL9v'!W;&=/G]q(6ȥGj٢E`UI3oN݄eL~s%ןM&ɮi3kؤcA z?֓&A\ާghnkh^=E}"um2ֿ;8\VЗrP-KN 2i;r?uKB9d50|[H;mwpx,͎Az+WU[ÌAy=u$EZb*8ȥG<3k4u٬\cI<ړj^8?P˺$ڄyUЭ8-i~}kbFx4FV<:>ߝO܊ T,הL3%ӠL\MZG%+0K~M[/.,fn_W-&Wvzu_p8gG1n\Ŝ~r*ZlX]FRfƲml7nl`tm¶}[xM,,LGᇕ ܯٯ.cƶ71m咑em SGͩ |t \7GN^Ʈ'!7ٹ33|m$:L^[9cQa6I^<}u|C_ʌ[?ہFEG2o<0r-){,:!s|u bYB~=cx/v/Cp:A_|jV}=i)K""""gseUE2~e#ƕ2=5jȺu4'O8JL/pWWiFЪEm36slۖ IDATls#}oC!.~<InEL߸[M_nʸPꮛ|^1^=[*m5KTn\vFy_&VMl.=ZA!؈HZиS'I!7\v o åBtt$3ow̗x LHBrOHh'e1l _}ѐѣf,f$·}=[!!FDCvFY@Len@NV`QDkGhI08eC_,"# "ŅS&>EoFe"|'aa""""􌋁/3e,vt|pEOxyezxN{[OY [6J,'ٝoJ6AlxŠ-2 p{\2מdz,;>/xndsNn T7DDDH##P;0^#{F%.س.~z?oCD;H:QjÛU9u\ӻ=ZuO}^HSӬ=͍p0K{ >j_5PԎ̟=?~ɔݿVs$rmD[ВI<Eg{Q̈́EDDDΩb;`sOһ7r}24'iRAc",CxR2FBgJS91,w,n xg-O'dڽm Y5ϿÔSWp#zA|::e1,Lm~k+YDDL)*_quzur7Mup4No1 ӻڝs6n k^;7gT~_ цizLؖw44{?ؖeǶaضa ׶= ;Grc[=/EDD.~TT)w'7ub 7<".n 7knoم Mۯl{,<br`Oi 8{w2*%©Wecxe _/[lL0=8|lܪ01 L1kyǂm>woo"oОmm_y\6|1/OҹпRP)P=]n]FFP/qXEE9 @g"""?MsTɭ 0ܖoBqsw/ """*R0 g:4@ """""%Ph)BH EDDDDJ,""""Rf(4@YDDDD z92\;MDDDDJC.5sL:Ʋ .CM{ ~6gSy\4\ ֡$n/`,)O67C&biu_$""""Rܲ=USYƉpn*GY0|bGOS) w5cSx8=n27I`qdm,̲Vjǃݎ1S&,KPf9nLQ\kOd?ʾ$t{A`l+{80,6Oz߯cS+qCpG=/äڧ.!u*fظ8~7Z]G|2y%{ ;=4+kZ7L'a7Ru&tFKb#yaN ,W.Vx-z=*Ow0chк"a(W$*: I)ֽN:G- {Hn=c1T,$ʇIEM1q-OـQfdDz#a@8HIM\ˈ4 jvm-ʖ CܻHiߞ&Q& 6ã8k&g, [CtCiR6zDfl!ige'FbS6snG:Trb@BGj4 ͮ8t' >$m 5-c#j$k;I[BxL\/&.b,l,J')cؤ%'q^:Ul&!^"e59;WVޣo`ŋؕ~wn;~VTtm'ik@2[]u7A_KBs ܻHV0NAY7si.v|4^|9/m*b#Q]'e{ke'foZ%81 [*z{&˸/S$o>L83t-b%,nC C'h-zun>FQ8 I7-Qߨ]lJqPW<&`ןL?#y""""4U.[awt8T^޼4-||7I-#jczTFyg9 9Z]ZF07yŶۨPޑgk_ɮyfWBF+͍#P+nĠbZ$oJ;5sSZ1V]kQzMHa4M G\zq;r 7 poG[}o=8vRR"]xzJJLNu_@yio_<,^Q_2X7O7W{DDDD. 2K]79o }\Us u\]M(Mڌ'8Ym""""s~ι 54b_KfUUڍ.(\sa7еsg^?oLA1{y[\חz}Z>̄n-CoHiۃNrMj"cNaOsWԩ W 8f}7K+ڧ~EHDDR Kh\H^n_~2V1mQ8e0}E:o`qdH-ڇ;͸{/L{?gs߿Ƽe S`Xj:*̟N>:N,JUy +|i'Y/uEL2I[q9l<74QS`ʿ?@)XG3oY⑊yq S- 5 .9asƽICeT,_W ^bI Ftm33%n{^ļXeLͷ7$xzeOw޻}jQ37 j։L[x^~ T׷L0ožYO7;,cmTWkY_-lBBG BBC<mY;ﭦ?Y?vm:tŽJ? FI9@fs0=.ڊÆi3ٖzo X٧9S~S&+5Áam`XZ9j9\E%1Rk7̗\^d8v9[Fs5_yl9gc['9VZ1N ߀nd4Ѿp^"~Ljؐ08?[/QQy(KA4Ml.tpBr2kʂp M2 !Lm +ud o=1}zp^LRS0T|7}\ΖvQB.|qmvX_ЙLYMqNOuɴмs(a`*ÝD9ͱ~ 8;tETh-O`nPBn7Q10K#lGm'8g?]7y1ħ 5rX|ȟ[8j">u3ಲ.vG5(oc=\hV*fOzmIqLk k.Ybvb ?2dK 8F=KXj.""r(.?|]PmԿP(XM؞\4XR 7fE<ˁө=+M&s:#zF0/Y}$$m?07ؤbkisi 8-65+,frq6N\Qd: iPPrgΚ}~/Jgz^+ZIE|t֐ ժƅ?q( Xq4ZA2r8m{v$XJyڊn-Á,6{'l"3 YnpedIVEJܤDŽ(\fzo*b޼5wF{>EU(={QA_wɛGBk[4|%iN6ώxwҋg,kW('R/^OscdJeDi4o܈*4-"jϿpⷹگ(e}Y;߻˖!<#}z6`/}ݷ5}[@^qIhZuޑp^>a\@NgYE)8*rW_oݿ޷Y[|eO,6ߺq 8t36mc8LX8:Xn Lv6eȜǿfcsW1>㈈ȟKO X~?}.}?}'~+J_WvgkWE/^|ӓM_`;ֳP&884~;VWlBۜ޾ x^:흿,IRţИ ϰo/l$,Q^?c1_>Wεk/UyZ}Pm$5c15oAҔV;W5lFk1cLRߥjmqiYjPC_0rϗ%6c1mm2Fꡲ̪_ʻÍjkc1ƴwj}C )V4pǃ :fėe ήc1cGe_P/݃i<4lU̹1c5P:We[TTTgkUl/c1'A֧hMgҟ٦l F조>:c1FprIDATz,Wc1Ƙwb꭮occsəY|XHzWBhE/6Q3"=?Ӌ(_Їw<3)"[<ϼ#"e=c!朩1<2W(466;]gDe&yY_ih}όa?}w/e?ՠC1L1o9MrֳN~$yADĴ>Կk0WG\aZPLҌ1:M0ggT7233 s6 ,LUM@gqt4sAVCCׇ5䬫%&3B Oq͈kLS\eз{c=@h=yX~s zes5jc1kC4Wn4k<͒_fTGs<@!Rfq]7<-}y5Ҙ3Ma-c1<'(M0g| )s aqf @ӵ\,o^ʳL!du!0иWzYzPH{#{YẸƗu۵`MbXr<8^c1P^Ŝ;hl>3ʦV~ wuKG8VxR, 3j ]cs\LjA%nG\@}4.K_G߃832*c1P8* |JWZ`]/kyZ$}\CcCam+CAc7/91vYf蟗ZP{-2>0lo3bPϊֲYcc1Ƽgc5aRabI5eB 3ý F]5 s{ 9ٳ{#z$.f<@5aMoq[m"2Sˆl8#g1cjLcEcx*g#vǷʬqe7W#]+xɦGMs\\M3ЂtE:s}/e'79DcO\lk"dzc1f?E@E<ڏ{+0_Hh]ͤF]UNYLQhaEצeFo/52lm6ɱ Ɨ"VQik%ӌ1̘e~EИGV1Z<^6jŒGnVa|FkAM20ǒk~@efeȍ3e7 .h1UyKa@eks hcFM#`X:|ײF5ͳuus +9CyiVx4qsXXr=Kܿ88`d/qEx+/2OTЧ:[sFV4c1G=HD5:#f]c7:/0hlcqD{yyX{L;W9 zpx>K%}E-(e uҪUlYc1|f2ѣ&3oxʜfF6(>ZW{`Tz5L<ǽIC:kA:=llQGb6lH<`yGͳ9u>c1\5kǹ"}ΈyTZ$kbcUOeimXgIJLx<4AS{Yt6A5}mOW>1̙*7csQR=}.4ydFZ,V5Sg94%3&Gs.Viw{êuhZc^AQkz11ZTg=Y}5Q46gFu-t94UT:L@ͥUFַF:s(n1Ƙ2ziz3kԈVV-YqFUa^Wb1:.6/Ϫիz޺1cBY[G3`]{kY2.kMsִkx~^m7jZԹOkIfp{UDW s蚊VMYk1ƘG_Ѣ˵O{4y֧u+Agk@42M}Z dTkڈފ{:gZkfZ/7cׁ*W=֚3->r:LbU׻MsCMs=נ<נƱ5hgZEުc1|ZU#4ι/녮5#f:ի8\k"jØJy֭iqKj1P+1cΥg#h6^-955ֹιVU[檵_23iG55h났}Xo1ƘsXkش?3q_{ouչy֣VmG~kkLe5#VUךZW1Z-k1ƘZ2-"7:g+]Yr{uAk \[h4ڞ,=T9&kZ]ߚlo|+Gc1Ƙ{2fOf*5j:u3i:#f} 2+~p sܛ@ՌGײz"j=]x1cCU#n54Ϋ9tFkeWAhmad-=TtóƠkkسc1c u,Y]gQ=̴hqT0g=Gz"2=lZzZ3ժ9J_{c1#X=uZ̢iMc}W sisk_f@'ݧ[z[kO,ac1Ƽ-FNTS"FUUh`O8t=WO mDzEzDf1ƘeZgZDnJ3>i 8+FFzVs{k_eNLm7F,8c1ÈSRƴW,8ogѽG"{ӞeLSTҍ19d5ӘgTVyѾUm?ڛU6덨{z8W:[Yk1Ƙ=&W:j3UO3UO֟i}zWqZވV5bFyc1xkm*[JXӿw2Xڿ6gZ&UcjJ7c2kk`jڼhhfe^goڜ<#4Wغc1DzeLSgmhmm<` Y3cŨڿ6О^k-ijרyD)ڣyDEVc1hWiyDXfmfS 5{k#5>e䡞q]c1|C2-#"j5kw*kAniV3c̷ͨ)ljJ֛ik׭+4-pP=Joe1c>7k^P9Ja-kvJLnYôWJh׌1cr9lW*=]a-k {غiѪEc1ƜAXjlcCxc>ezc=`M1c XcGz{=({ٳ͸=kѽF"Y1cLg5a^{ʻ=gm8jc1Ƽ7GĵeϾ{֞;w{g1c>/{ 垵5}Fyzc1 f}?G]}Nk2RGQ;ޓ1cއw4GQfκ߳5c8؞|f>{c1Ƙwl3{-g}g]c1<>:W}W]c1fWW]pec1_/hJvLgc1gM H1c g0c13Mq 15`S6c̑c1c1c1c1c1c1c1c1c1c1c1c1c+"iIENDB`kraft-1.2.2/manual/images/de/catalog_standard_fixed_cost.png000066400000000000000000002350661467704360200241710ustar00rootroot00000000000000PNG  IHDRmx pHYs+ IDATx^wxU̦F WH.">닽7 H{CĊEE_{"EzQi{I$$-&xkyΙ33g6'3B!B!B!B!B!B!B!B!B!B!B!BDDB!"rH"Sq2B!ġC '8#!!e!"tGtby%MG !1HUc$BcVD`ڮB!Bw݈;:ڎB!^U%wUJq&Cߕ=B!N*{;W!J*k܈;HkƉOB!DuSHSƩTB}8SG!᥺%>U?^Ʃ9UtPTdYW!8U$Ⱥ6*~KE"wqBCAp *2nE֭-)Td]]c[U!"UP/"FTuI2*Y.8!>J8}BQZ8T(} Su#:$/݇gh@mPv!BT`IVEcw8My_umBCY@㹵!p[(ʳ~y։gYGq[7R@Y'B!.$):a-킍8ǝbmB!Du(qks;9AsK-8Nu7 O*#usJ>ަםS)8NPg!`+OR㖀9sRR/+n"/$x2f(}l?Ke©X(`1lx8"1B#O$1*w*-KRwZ9P'd82fyK}鴮=PmNK}z8*B)IZu-8K*fg;qK;}]=Tw>!tx l;- ֮>5wKEڹ!pBqJ`p9}R^w[:ŜƲlu}z\_*zn"'$Qz'Iz2f_:6Ŵv}}{_E/N8B!`Iq%RNCdM_Ÿm*.iW P/vUwzRu[پFh`Klwn(:B!Dypqor8KC¨t+;-}{z̩h{"8/PP9}JYѓP JʶZ:mW %׃ BQMZzǜ6法6Ib6 l_*~ 'P[X"d/PMד4l__O6}]cNK=f/K`u]v!*KX`upN۝Wz贎S[}8Nj K`ۮ'X$1p^Tq M!*@m49u{?=SK{?{^v鷲=VKEh{PJ0-YrJuR/uׯ${6}|{=f߆έ-X]!8I[]C6tKb_uz6Rqu x{P&7nI*&H{JM^NBtB!p@}CI>z]QVqULQ1GբuR>~p;pWܒ!U7l1QOIjwzRIM֮umB!*"XnqޮnWnֳJ}WczY1ĭ-ʾX'=APF~SLm+ѹŅB-q ()ze_B@{?lu{SW U<Trh)N1EmGYZYQՆA8N1@=SrHQYO蜒A3..%[o??9֩Q1֖eD?+x9_!vVлf_'G2wS4S%hu{§z\>f NN Zy9SO/I 4zlG\\JmyΖe+ZW!G6X7o 9fώ3 z[#<eSS,, ՞)N1EO򜖊=s**JhG^wVFJQ\!Ffƞ |ܿ ~-éyǪ4;I'©n4{;?ѴHNu:1*&BƦ k$$BBKJzڂvWe}~fCDE{ݞַ!BDGXzTFmTXE>U]ѝO}iOZm*iTL0lqGy`/-0-|yQÓӐظx}5!B>L0,2 Ik궵ikVqEۗRC֯PXwJu*ngO"J{UA5Lb Ӈa ٷ_$qB!*P_cOekSj,{.X{x%jNq5сeu,UO~80?49-d(5Z|/Fj>|{Bq,KўOvUs{RDc;)'SxN&U=it^\Qk89_.5{)1פp_SP!B&T$߰!akSW<*3(wn"8'inczEpkW'Ԟ@:z6^ gY6{3IOVfmbS1*/ss1Mi}eE !"LEqTIz(yt{ZQ>qJ2媤Ob JCUٞTfgU2|^/|I,Z+wg4O\|Qm-mQ ?} p/sWCSOm-s%TNǸ4MM'T}p96LnZ>{21XaSXM|q:?J1zƛ/=Ǵɯp"ZlAvmpҺep^U~=s{}C U8}#1qNO^We=f ⎿1sIiMtbcEFv(,c=xI:ꟺz|`]x<>0z8M{ޟ̻oģMCպes7k+i9_=uIPVM>& /iǃC00͒4By(V>a+9roo{~&գ֣h9<8fDq0 F ̽#z^cx\v-̘=6ZTkTuԹS:wꠇ-&:Fss7zqzl(0C(}>vNJWgzNu;t[o?ez2.B`Q"/jVMj'/Jrzn٤'F>Zʍ=iT/PILdq3xrNBB>>3hѼ!7.'*CK=ߗ5g董q\߳Y|>7TnoނE">XGuINJg'U3W²|rgѢY3ASW*s}` c_+W1=l;u(>Ν:0{V2Է_zh5TnS\mz]qGTUwPP{'e15}hFC.DF-KԖ7e6/=N~ڶ +s5dǟ>- ԡȲ,|^/|\|޹ԫ[u7W]FG?Ɣ!)1[oGŖy93۫]Ә9{m[k.aM)x2,bǟsS/;wfoU039sJEy<\q ߏ(Gݴ:<4f/9neqQ纰e}YdY ܀?aYV9W7ᆱvQCnD"..-[Ke؞믾uu,Z[ /Ykuu'!9)o_g]p|^\x޹$|=vԯk/<$''s[/ K!55[G+^ﳯ?sp\9x)?[6+/yϿ*۵s'aذqc۵iM]IzuKrr,InjZl e=Y4?h/Z¤7& QmpuWҰA}Mշa_@5,{>Kesۋ_zVOgnAWѠ~=MpRޚ4 ^#%9+/(ӑYsS󟗼|>2tMl۶Gm>~]z@Zl=?NAAF9<㛔|=P_Ń+{1Ş8~*KRUuhg$9TWjSɣUG3F5AwoZcW'è;X毻i{~HàfJ ql۾;Αo7 9`&7 KHwߧu,|>II?jOʌYs81:[dozy:==={ryrWsǨ$ wǟbӋO- ұQ9^oP.࿼އAݴ4.` < gc';'͛ѰA=fΞeY(52z̘=|‚  /ArRu'xYҲyS3 Rϣ]N抋'ٸi3W\|>#->\fg`&r=xo 9)XSaz}|>F 7sݭCS+qǖۘhqЍz7m)ަ[Xd)a0_^ys 6d|~.?Y*)MNJ1#x{>MQVT^x '͛4Fx |>)EI̜=]p۹s9[xɬwEə]Ca0=vb&6d=W'Yѵ c '#3;wKifZ4kӏ?Yٹk7W_~1}%/1BjL%iFo3ku7r ISϦ[XPx< ziV^MNo0ؑvs\yq+զOtt%+^I||e|ݏ:}V?v߫V36fb|c:g䝷1{Rmᰏ1ym<2-bs/2&'XSA%A-noS1=e x Rc4z=PY%\F> U±w,Y'H~~~4^qoL(ƓOZtlL9ߟ͔ioHhۺݻvV]ziYKχeY8 {3} ^-\Lzz:]:u,ޏo;w͞Kƍ }{`٬[~1[=y@>23O$DGGwؼue5ֳkzaԿo(=~NN6߂EKͥEKQn] àG.l۱̡Uk1k⟑@t >s7l/vmZSv-~z^vi'NZddfus ۤ>Ҿ][~1yyylٶ9лDZVOכ7}{(>={gݬ\&ޣ[M((,dm|wr ۵3[`9fz;xݻ{^ϚcEgzN~O,Ysl_䋯/( ;'O~{߸y 7lvz32VxVo';'Jg_}t{^oJz|>|Eg~A[mgμգx?,fx>-YFnn. =h۪%l(e'''%}Xz- Jn5 |רͲ,/]/Lbӱ}q13j`z~RpGmnscQ0sUSNT:A+neMLu6}=:)8{rKBZ!DY'Z>ixJ~X 1MhS<Y~|uqrթCNn.%ώ0M$~5}pYp/__jצIㆼ űؘj$-]WZ8kucY-NZ i^-Ӥ9cy6xLɉs8_:e ת6ZbtԮUݻ>$&&ͣRV-ՃIQ2iY#{=gWշ)s{sxXtToaPhSa0KpW 0=e_BkR;wQ35ڵjsRǷk5i_h.yܴyyT32{ zׇ3x, RSKmڼqxԮU0ʜOyٵ{wϘeYqzƌ{.zeي0uσ3NFzBv}~ڶnEݴXԯ֢;' 'q{θgϝHJn߮m8ehɲ>2ryP(ԭqϾWr|&}Jr C\ N9gnjTeҷeh}T PK+q-s^h/FL!<0 C^fYH>DUtl] Z IDAT,F_r|>edf@B|<_AbYcY ,eenٜG g˶E/J2=#5c̃cK'nffR?9P<+,^lczmH->c_t}zv,+蜤G|=Xs'rqH̤vl5ˁQgf?0Ol}^afܷ?~{~ /g[NJ۽^8x}>mW ePMSꅥ^ݴD7=#ڵkZ!9ɟ}qö'kCSuj$3+ [<-Qmp-3އw}$\^f ;m/(ؑBQ4>KeYn"#תTBhILJhRT&!mz Qh?baoSI=> _4=$$&Q#6uyaWs ֶ!]ڞcmnEl1[Mr\-[?;ؘ 3k-70 _H пaдqcbcc7g|?aztyӒ\rVG5hԨmvMg? }/PԪUo @+Khڸ=u0 5}{ls\@ƍ8:A&M_s'Һe |'**18]L$6defj 5SS0 -[zͿp$$cꦕľ^bbs2gϩ2_~`%4kҘ>=c&M4Q0{|6n)'@ǃef Ņ!&: \0YKsظi3v\|40&JmOo~5mBd=U!#3qO?՗]LV@i1'3ѪE3U,Y1HuF寕X:=ږ:%V06G g1d n6Uy&=G~~ -᭩hټ9^4ظX9{. /Ų,>k<Sx\se\ex}>6nO?_M̞7ƍwsm>K.FB ǧ_~ͦ_ҡ r3?6_ȁčiX}?oO]駜DV>~9N8t=<_}̆MYh 5jo7fdfq#s5WruWzYaKqMK#/?.d굥)irҴI# ٱk/:>b̜=}{215MZn=k׭%&&?,fi@_}7\sEs?7,{eيh6zYl~<6n')y,SߘYygyKek*#F;Fޫ76N&=#۶ϿJ'_pm7շ%!E$ƪf9fگ"¢-eu5QQ1UVmjD 'mlRgR72Pe-;? ABshl~+O34Ṫ;-'(A2 ؊*M}X8Vt,d,x<T2 z-и5_BB|/>YoBR^=~K'e+lK;u6-unq%X{W*JuaO21>ND0qUOU̇?+h*nM_#PrgYޢ|E۷[ލ8ҦMdzZ/!8zC TvPUjt+N= 8Ȟ5HmY@LJGC)'@tT4~dz7!8y_4)nS**+-fKT̤GEƭ-^a8hEu/(uQ3ֹMQ!}V !đCE)ۓJle4 pzTJi!BP8C-\$Ogo?*8S8OW`*DŽB!BK8Tu>S)!l8Cz@uIcNKbp}{B!s_:b%b*1l J`6բСͲ<,`n4*+4 Y08Nc !Bs8mR2U8Vsz@7 !B*|C鹈S_JRTUD?@e'ؾ?ҷB!BaP: o8)nK;} ;^ef* 6N'^u B*;蟙)VTQ0$@KUB!G8=Ue~PUutzLBl}N'H!"r =ї4NCy>zL+NL>~!BޜnQ;neR/q1](}BV'}R=RB!E\B=9UZ:Xc~bD:9B!r-}j _Dэ$8M^w;QzB!S.(p)Nc9H ĩ_(1M'IsC!"B;vz\C1'>EDe$~'3P<*BÚC Z!2P'ȭ>*n'T!"@^WNu=u [e&M(n vrB!D N=7z`[i*;q gR(MoB!OEm>[\hYuj'ȭ+eYٽLzЂ3SXx }^=%t))DW+EJR2u`2Ⱔz]g.P[I&T ftbGܞ{سwUmη8|T|zpT|7 سwiuӴV!zz{ U*V]p6^XʔQT $JX@aCBr =攟{9 oTHXz\M[iq K]Kn]a9,\"D'cNC\É[< dU'dt9&ac3uXqhsz-o]WI#T 4nm*DžB!q!r-۪C)q ӉT !BG"P!`&Pq/!B@nq]ʛ?EL|(O6!B]!XqS":$ B!DB/BWUı;L;uT簪xε(w-?8)_|dIUYv4E`e%;+KZv s|=qk3kLfϚrGVƿ՛ޣ{_W>GR~>yrz}v]tNl7:}gؕ-/nu@ FⴺL. cDSX}>X{;3f,qJpmo-ɟo/.M$HSPD$W^*dݜ?؛.&ܒSH8>j-ɒLu󴀆'\GG'&i;"5(3t2,n_9f蔶~rGmqY!&;dZMT"?ؙٛ)l} Њ:5jiNߓfO|#?+ƲŬ)Z2e5qnEŐa=SW`eNۊa&ibfzeduCbf4ab``&͊eY˸GM<t:z:R5ػh!a?Q4W1-|xǙvzvWFagݜESpG?e\>n464,g0褦$DyoЏ/m_i$2Ҷu= ß c`<'``dbSt]3[}Q84N":9'ߊ͛:i'ٌny=9u emlТCkrtm:ulBafٖaibzL g֟L4ǓHiy1Kws0LO(t؄dW.Ph&r1ѻw}=.H AVlMjƕLvmR}d 0W?%"YW| }&fa [ۧoB|dôqQ*\>M{24b~Q(> !/~}7IJ4Aױ?Gfzf:[Aū1w÷2wil.>/3McʣrLR<g%ofA|X1} s>f6&r](GJ# ה Z CX{+pOjRLػgVzEsaT> KWywy˙ߝnU}ص;m߾^rtɶ 0kS$$=3$4ew 'km#16V6{3rٽy)|j3uщޢ wBD__6%e^QLEo3~\{t<fr*IykI?ޒ/}$)YMQtJgew/ƲqմN`mG^DMd% 'dpc7#8Us);g9/9)(Imd-ue&G> jLE 1 196']'j_01}YU*1Ilڋ7䬌|$^^ԆL}]NE$JkblWW_QaPuJQO}㥩;8X[,q;&uWM|oq_sidԬScv `vkv FTz^<Ŀ?>{δ'9'?lQILe3yPP0=ϻ翊ŴG降L_ؔ%iSgooČ:.FY #u,#X>nD 9p9nx 6 IDATLhȚw; !"(z{;,NQ}Z/bvCX-Ak^v0ݾǨ_YLkFhe_ZP+QSJt qsyfrqə2M o6;6 ۢ I(=Fv\b"u\q3{U>tOB>m6N݂h[ݬ7H޴xlXq4t2fڜ|Ǿ 55biqtIZ[ܜn)2|bRҳ[;joo4ԛoOyrd@|Z+s`Ԫ v1gj4zhԷ/]=KTN;sL?/B՗An&yV Mr魍ZĠn}#=pm|wKj>\6>%_*m9ۆEspcؖ%F]>zniR/;#.5DwJѕ_cS{_cLN6=ɳ=_ 73;!7vt|ۻʘdz5>_|=9ߌ֑mؔ>uM0A 8uQ 8KS7^ŤkѪ <2Iw0ק/>:w&I?gf#ʏјzPoaQ{T;N9{Om9#s1ry[\du/7]Slۻh{K}=!D\;&>h: c[z&mG=eD T+Wj1+R}@րUzHoo3J }O*a`Yn=n5&0 i_rC"}6LcaXvy,Ktծϩ -zʌgk,K{m|u,mc/{l7[X>0Ue1 Gч4,^؆ӲَAQ|/ύ:o+zc[s0PzC`Bbc+͕ڹS?KsGյgQR_6=wQG!!i'MC ^@˪g{ꅀe{mu(nezj5IRJ2PhJ$X_O?-jy5 /(:o*Rcmu02ɦ^y=ܓmb L˕bģ6kf_Sܑ} pކa8G50qJ(UF*[/q8NBߞB!Gϙ2q{xw7_ܙ"Bq$qUOÅBqKQ}7::ΝB!Q!BDG!BIB!DH$qB!!Q!BDG!BIB!DH$qB!!Q!BDG!BIB!DH$qB!!Q!BDGaz .~y%&BCYՀɗ?00=6jGqeRckT+ϋ'YBq+Ք381c~Wvf0k? !`+՘az;tG%[(-{EQ@@DDA6d/DDAAPeBKGHҦi Q[}ޯW^sw{%<]N&JKB͝XT<^}D$^&=?=4׼IS-=9İkxsWX.yo;7 mˮ ?r)fG }ƿO24V&~]ދ.#˦bpC.ۥ,^y6E~[ÞswFױ' BǬ@M/9|5+ !Bz}Ěrhd*X̢C1e7R7M8n9S/S58od8ܠێw># p򣉬 3/N(xux9Og6Uob|v_˓$g}Wڱ=]=m*葴l0ogYyf|vQR+YK(*NqCGep{25ҬzŅ\5{ӶUi)Y =P9VZwT)J.ɭ 4<'H(7 #N)7PEKz7H4@»F;ڕE8_rnALKG_k>$_;Ƃ v\v/D̹m,[se[1(G?_IPP Oo/$ $EAFMS uW#GLLc4rZx'}#GbeL1drGu?@QPU4k2E>.E\%HތLqƙ ɺ .A?E$GEWmj/sF@4*','K'D?K*%)9YKdw=czTFaj$#T{^_cّ}>[P;z2vaM\6bQ-㊏?>nx{$B<הd9\ٖd  LG *!x_JM`Y͓_8DCC酝d$mfەXLl9[.QZ JQEEAN~1u)wbURr?@=:êes'E"! W#L'ł  y1Ӳ\՝A\$ܪaX{e#g%)): )ͭ=ht?9o+/\= Qn0,.-oVlJ cҐ/R.S&Bj9$h?f:sB Whқg3>jI/;x._fZg3m}Ȁʹ}n-S?4j`<N9CJ_3FSMi~Qd$C*B@I2SPdk%[@I\4$%eWSMh倦bRAYw3\(!rjBE6arIB@լv?TLr1mjhCCDz2)Au4M䩟P}+1}MNJJ2Fh3mZL,F@6Lkyֻ:k39[5:.Ҿ3;lg^r?Y)M5Z]}'7Y;:GMi-i<[b;B4W~)ͱ2G׾˸bgNLɐ?KY^:PecBp*%gSJkf5ʁHzTL/Ya9guz l\K8o? #Wu&%e~|8 !):攐$5l\3C(%wt7{x-޲} 8z\ڍ})/WJrf)%~a;mZ{TJ;88VE;0y@79F~DB6s>EzePC+TZTu:dɓ"yux|T /VaO z1Ax^wUtNz 'IcTn*[˾aB㍍ lҋRuUuNX _2okBCB iыwWLɼ$KGYԫߔgr8:ϲt@Ŗp#qN ߄vo-y;kc6D֍ Oqɮ'Eן2dQ_;m{YGۆ3˛O HQQ5mGgPw9H5_sχ{n.S4ľڐ&]FaI]߮ !߲;#^\8v~o-"\)soX~;סQy$riTmLz42yG1y_+Gҡ~mN.> N˦Ҕ.c7p>ֲ3ͱװ }?0hkcٯMg|ޚͱkC+o?Kᨘs][>11gъz8?=JW5GӃ& SE/[{gt:yGdrb93D` ]Bzi܍.4Ֆ'h׬!-5eW{NW _c aى-3X.-g>,9$z!AG1S yWȨa|>*N6^;9{1]3˓v LzxubM|ѯ z4R@𯘹IMXևNxtp:mSi3gap$ERF11ɶ;Y1('Nc=#Z̷,'g} DFs0%ʜ壉jwݤ.aj ;!9CY [Iu<Ër棱,;`f"\ eҺlV !CVmMS6l> =DC#Lݬv6^ ٰe\#9\tiQ3ͱ*]bf{I@FU][- pM۟;BX3kMz?`xfؒ %I{USJ45g.g \]0wRڨQ.y/aߚ͂#hvdZ.9|dpkؾu==PSli H$KҤq#4jD&YAB}:p 7Yiĸ%p% NCzdI#껃݂&ov.ƅ=a|y0v?\'V O+,#!!+ "#݇uu1/Nޔiۄa8vG5z*Eiޥ6yt8 V!\e $EQPd)cCFG~xRx={h7ZIF4. Gvq"[3z'[61ιw;\D( ,1LA ;;v=/WC\Leߩ/NJԾ87Eb8)dЃ"سKR&9נ (.M$"^1?^N N~^RO(4qߕ2Sm${9("+b%.8Ot8vY'jA} sd$-A٧;+Ugdz3 RHAҢy(lHWIO>Dߊڧ $zDkr^"s)J; M%**lŸlXOxcijw,#W{2mɖ䎟[7_I焬PS}&fvf,0V}J~-Y2k,,OrGC'zelXHf_#yɺ ?L$ݟlٲYnxj P#2}j4/Ι%_r*zZ>B>f]ނ|:_P!PЈɝ{0V/neε͛M=v!-IV Pϔ IM25G?&Ոh:Cxy)EB=s"^ݲpD24 IXԴ'd AY$?RG'4a쁏BTd4)iee?\FTC[% H9Vhv=:VoKl:^>'is${:eO])ZtIi3oA!xfqhƏo:r~ȑz#\_uxM¯Vs/"NÃYH3@Ι܆Kr95':1Uw島Jx {oƣbd ,56UnI`rxVٜNj Szj cƀ\|;ka˭ZUɬ^FQ'88;fcd~nKJ ]~@HJjJi|޶CtUoԦJj^WktǗ}F|%OjuFFѢa+c5NpWW /*#GxY>X?[d%@+LlpYϭ:@7vF 쑇3g\{ ӡ&TI\ߘ&4󝬲bM>wf"+Ȓɤi*YMC7u;E}үcevp8gXٶ'ZʁLdca7|yBT*~g/U|,^ò/&ApH4N  1a䤤$`L@u\6Yf3m,k<~c6ނ 8 E\;>^wף1Ũ7=:_`HYA/ Gy&A!DG  !"qAA2D$  BQAA8  "GAA!CD(  dLܹwUV.Eɑ3'ys/JCUU0!III9)v3kprr" [EAEVf$L<~K…qss/.;ŋ-D_[i#Ν&WHHH\rzIȿ< $]+̤DIݹw" n_I̲2#yxxK0c0!e˖پHz'.ӧъ}8RU_(2pNRR΢1+2LL$  BQAA8  "GAA!CD(  dHAA   bׯ_! ϳg{xgsǘBɟd<ϜMz"ѾPon`Pi⯪mnxS?”&+1+kD=E}cYvsÐ-u^j֤F4<֞!UF $ Z'XWVQ>n`g9c`{*5os7tnJ5ՠ%}'QբepS$ʷc`TیFK5oRNw4U;2]ONs%˽ 6_fQD=Kq-};u4Uě9:)wάgo#kz`+#yPF$^3;M(9`-s;I YN&9˲ y{F9wų9.G#dP*.gԫ/,IY F<`ˌY<2j&5|)DUi*po~_ڞx>=+c^X}6_ח̨%zޒ8Zmc'v(X7&zds4&/M3nq\5OW%쉌O џz%v`c><#0xрQ  DSڲd͒÷(=r Bb,sG'd[M)&c@s6.9D "6>_zmsV(d*KT['#ny 㛻0Hmt̐?W#N['Nvc [.LC#߻~rO})pv-/F`/KwQBȽxw4!о腧;N<Ysjoůwp.P>cѲl຃]x~~<m.V ɏ'ESy~)3e_mgRs%r'{6N#8|-M:s֗ٻ{+>Hn/KF˹iТ<^9i4{hӱ~#A3qyl)Yuva֐UhB6}3B^=盦o;t lez5^o2ov/9Dΐiqݰ,iqHgٳg+]gλK%A4ˬs>sٱc&mseI|TLy۔,ݾۮ^nׯ_~oЧwO?ԩӧw7իa etGtgb}1`vO 31Km_:3_LrѠi 9?/K>QD@3zIO*?џc-mQ1 :%m5L7ͲQlzgrtP K7vv_,J^%O|{IfF~[ЅڵjRz#il}ҥ ѲEy"}RQ$ɼ!_eĠoh~s /pهjqv'`v\,7tRpQڥUnG$)yBҤz]ZKU\b4R< :@k!66O4G?|-S7:'Kpv?u9; UN_RՖ8cA^'MuU'Ul_e<N>TmywL&[hMƷfDfo$ tbxUi ~N ѪeJ[Oǧw w ,F kQD@l%ԯOHF]FRy#\1ܘ.b7>HQɋeobA^9>k3[9>%M`VVNY9Rt d񒥩7d2Ų/es4%+1z wIc0}C]fW0'Rrar S6"!/F$YY5>gq|ך @ |95m(I))=1^aD'.yj\,neo?j2d{ IXqT$~iS tFkxi&?^ƓQR.%`gm٭$12'0YzF,ɠj#@}Bt|mļ}[ֶFD=j\k2W5 Ƹc_\BӪv25SV~sX)p7o$J~D5e|W.PAf &H$Fq-"MVL:ƶ (X/24η+kIrFI\0U\f,cT:[3Ihj""fyyr ̹OdlA!@J´А1nDaTU 1DZ+oFTTxbD_|I$&i"q D:Y# '$Fw d"?o(#8j'jR~9KxYE0 K&+sdZ~}d/kۗ5~\fyŁ2`'SX~* 'd=\3.{;K6A-ܔr.BrFaKO E1䶿՞S1z?i9.O˖WӤIm'eqU#Q(.$y_ԝ%)GJfj82eLcybMR˻|kVJeuE1k rc0w(:xS Z9voDDOLݕ|0 j}Tf|Qj~Q$伭7.S?F8'| ֤AB(q˾#uu %fI00=gOe|osf񽧨ξe *ͭ9oC h8j< |uNn 6#S=-g4_.lȘ7_)Y Ù?} KW.Jй#(K _#u8xSpFt؍?fZxxP9 *'~2D&w>)[#d震MF5-<|k[<l3>dfZgy>ةO5GϜri02⧓(_KWKctU(w)^lᅙ}QO~?[6.^DggBOi܀OYٿ/Ѭ^d<ϜΣ1UmSS544UCMWJb$)wX[ޠd=ȑԨQ^iؾ?رcԭ[bg䩟P}+1}MNJJ2F_,ϭӶϭʹ2m|Uud3YYǻk>ɝ۾H$D☉I 1H&Ѿ8S)dE/^D( kH7E AA!CD(  dHAA   !"qAA2D$YLLX ~t9m*Q(YQkdZjQyLV vl]bøԨJAnKlc~^6!թX5oStsÚP 3z$?#/Uܚ?7nAN<|9`[52uA?Ǔew:#^&_7ڿ!iPJ0p HMzwAdtz9 ʃ0緮ԯ]g#.{-sX2|$ byB(6K&/{sv.[6og2bi/f )y09uqHy}5ܺM%/z%9[ 7[bW!RU7/DM3?3n#?Np>離*Wx񐤤$srr" [EAEVf$,CAU~s&7}yV%[>$ t IDATY^G4|5vgA~yz380ʟS>eD$̠ޥu!LV{MK`e»d FNJNhOxl6|8M_=m qs6NyKPǍ}q$x;Nm?M:3$0eV9xhEsR. Ǒ%?r'"MO`2ީlю8M,:SE@nٰzmhYNCpo6<ɞہwsAS:֥2s 4|$KHY*6q-b3=q+b'4yvJ"eʸ@r[[2 Cg0$q%2\xbB& ,C!gVTm4b~whp9RM3R?L]zFGxc;>bnyt_,FU6`#yʽ\@5Ɩՙp'b8=oCF.T_cq)5])C4ɇ 5?OQK8PWw=ucp;PEAGFxf;εyy=Ho9n 3wHB͡,[epF%~^•F\* ]±w,HҭPf?/NR9\6ĭ,È-[ggg"! (ROF+ZYE1+@HrM)*Y. tuJ.jT/ab4PѪG]됥)<֪}}q: "o O$08Su';HTӕqPʹް2tUn:$h2 k:lt4یWe 0H 2JH-iGZ|c%K˺8Z6xW72w}"wS)Aݘ5OTtLxKi]6qܜUr!osi^^t)D(dzr@Szm~`|s1$YuI|HF9YQdPMLΖXᵁ%ljN{N 䊏KH*jBr=]\dW0Z5g'ek_ꆋH\5=I\IS/2/eYWH7j;-83nY2]_Ϙ釉c`\SxJ==\ӗ9=+nѲ:[˿2n dM"q2?٦G˦q8_! DmD6K $o)CHׇz&2va-@#22 ܏" _TR=K~;,\D Ika]@'kz?nPuΎ{`2=ըίR3bt]Ũd {V6[%GT>1\S AB%!kbyX AʞL%2עPW*Iɿȏr_-ѡyX %jh7طh 7VrhOǓkW7dR)F^1&Lѿrdk1F}JĭD',{tf:SI0zZN,[Aܪѽ;?gL0.ތIgh2eBϏ7A$F)Auҍ.CVbJ kĞ[Z+:m>b aQrR/5F9UPEF˴i>Oְ?|> 9d6Kzɇ3oo:QTywԤJQ?KL2gLY6utXf*hˤK0usT9| #Pr5Bco12s6p%qsc'YrTիІ ̉m}{Ztܳ|jNz`9}@p$yv5ۚ5?Z**UH?P8ed 0@<򨒓ռYSӏ6fnSTN]տ{]4ՓJe+dP\kƳ<۪Wה)STrɓ'iڵK>5okp+x~YJK>{]-װa_h d(Pu/Cs|MT\AkݻժUkٮϯɓ'iN͛P.}/Oݳ@#vmZI62pHy}f"jV_-FQ$Ñ}9TڷRӦmu'#ɳMY󏻽t8U;Pj_wvj#msJJ߯e]iˎz9yzcjش9_{MAp\S Ða9s #Fgɓ4x 6\=zJ~~s]~zש$+{ѼɳБOV3 UkEZ2{IKb)ivr}%YkvzZ2uʘo1Kr/>导~=G4O,YoVN|H7:ҵzmse l|NЋoTV6t_[%3U_;˓}\UkҒWE=4y$4t^6L?9{=c շYCoP_[>£5jXJq~)NݛWPdjVhV~B$@YUR\dURJ%#~ʄSPK~7UʊtHFj{OCkViS^BNwV[`QELAuUpM(L][V)ڸW ˲tAR:_yE=z<%\H3^zKΔh 1Z>JsD2N Yʯ?gkK).])۟"Nl-;7~z" )wZP^CSN&ƙD%&8%+\$K^=O2{y<y=kFɒ%pIY'Zp}:@}/1T\mu}92e>q*HQ7Q7(Ps=_4K-ko>nO].TNq?EQSCRV::ŧ=bzP&Fw*=^`JZBջ 2'>gF{vCCu|ZgQ]||'ĕ̥&g90pe߇!*y=SW~7`W=-FUj9׵AjZ\9ש+VTݺ;G|iۗsD+^Ǝ VZF`YV[uA8}C{H)))S~wyri^e=՛|[<<˾uveC#QN]\o#hL<\+kaw4l89` ` W z3}C%GU#$vڥ *\ӵcvp-<8%KԁXmc|m#.-#&0*gfo9uyBBB[<j0V8` ` ` \5\.ءxed~.7PT!PLjl߱C\|%q,==CwO۾]7xo5<2חU`` + _ʖS|\SJ!a;__Ү_9K>;^5)kǫ˯Ѻ#RRV}mz52&r#p@PX1{+]Z kƱcǵ{ߊpbŴ?6V6nkaXb.V̷ %FpÊGG+%p|#G8V Bp-GBp-GBp-GBp-GBp " ։)Ep  {U_DEQlDG+8~jp8~BcXbUQXX$B#aʗ/HŊShho5. EƗW5'k~4h IDAT\ 89` ` ` Ȏ=+%o Ppp)r8ѣGҥJ(?9q"EtmCUT (P \@ W޳xqErF.;` ` \,YL{2-ʼ)s&A#W ]^nnӷמ/j~¿Ո8ר{~ip?*RjKjw藇V/ܯr-oSE5V="ߺ(}xA{Y3FXJ?2n8]wEgoR?ebofe.~&#p :yz%y4\7E*HvmWDZp^R4m@E*yaC[s9Yr)F]T=˻ai\ƺ$3XBai'4n=#p ;. ^}t%5{M0?S1T0׈)X\;j(zzPO5+7rNY[ I-GbE}5≚ 7ҵ;ySnt-S*x[Y̯xA#o"~k~sb:ia亻}8|7 227j̽ѷN9ۣԬ)uPK'y)*=AT|QojI_kպXYK ywwfMaUe=RST j^d]6-%6ܮJ.h74w-1m|Ū'{Fŕ[Mz:RԪg1ƍ5aQ݇iuCf/P-+N)h>H.S:JOz:S=t7BזR {^i]kE rEvU gtkb>[˗|7irjgojvPw}`V./t֭ (UW]Mj:ٻǥ˕*c-Z>_{OkZC7M}!Cw*]\͝]79$#s^hTzdKueͺs{~OљZsƨyxNaIM,^Kf>ukdΫ˾֟_WKk)ae*i)qM9B#^sUW7D|\fAF[ݟͿ5-RD5or}~w|ڹ|>;U,՜Qiׄ1.6Ske?eՄzϏԃUZ0o6FFpղ(IT$t E*!EǝJrMםz_ҷh *J+*ٕ׌|xuCDҵvau,_TCz^߬t48n5Tj5UZMU Բt2 7Ww*LWi"iAϼ=X.L n8]Rvl犝ںϞ4vU#$L!JRB%#RTGG~z^LsJdşT>j:iU >״}(5i=s׭ 7kۼ:o4PTS TXD<;_ !|! =uȜ)Ӕ\.OoYNu]P!E8hD[%$Ǘigpf\Z)ŻWMYkrȗIou~=zv$!٘ =]R…d=.Q{ְJLTԭQ^= WDe GI=83=[ԧ%!ƒd*PAK¨^++pR+s?[R@昅+Z;z CaQ* w1C2L'tzуJ {ފZ&1{Y?]}<ż%NrhP;7Tddaҗ[_ٛ|!Uz:+ԫ*5Mב8T" W C QdRa$E*(GS29>d|g{!ڟU{pa;UqJ)UVh?)t~,N .O5h߼/7%(S[ґh, +qJ9a)3N\ ȔSkfhBvh[S,wdI/gLyDO_ 5PrlURd4v8M,e& >=}WhT*4}Ĺof.ګTɿù ָBr AѶ2|vK:~-o.kb~\9L'Tmcs3PC{Pnl˚Px~pQ9i/8BejQ2Z}UĞ+ ReЫKȵyO\i~ k``xH=KvQH Q-j8YqS=EމKoWOYD k;5ǝ{B4 ?[ ݸJ~˔_HIx%V62ۘ7Ԁ?kI"tC 6֍놩JTW5ma9%*Cj=L띄L6/+vfqմjkl|^G Bݺi+/՜ ~aFy\.90pe߇g[!*y=SW~7`zt+`~[55g5u7Xw⾄Ϸ5{ecYV[uA8 Qfj$ sO˫t.mp*[a ϭ\e:òe ]\] yb&"8qp羘;3-w8\q-GBp-GBp-GBp-GBp-GBp-GBp-GBp-GBp-G;yOJJ<#G*I RdD3+فKg8R] SE9Ժ>SAp,Үݻ11r뭧BbJJq&,XPe^ p%sZiAntei';ړjTԡn?UӢ>M/U E%1yԮݻJ*/@hTbEhݾ\ӈֺweXk uo_ dz٥jkw)Y [Ӷ)iu 3B7Sj]_;|/I۔aYJ[Bd9?Y6x|b3-Sia $s޽^[uhp59 g77ߜc`eʗ/xVf՜ Uݚ)gm)q~?5U[ޠ˼F\NN̓%F+Isz7TZTVmnR~_5>ǚ÷ )6ҲXFZ)Gkkշ5RO˓5zzjV6,SNςhN??_^ӚESwjعmIٺHKvUڸjԬ^z$<;=RjSggK*Y}r秒ŋ+66ַ* PɒiZ4wR\xV. 6Λ,O}^U>ԀztZoPDjP6;k%ҡ@̌t}x JSfFSg7yj:Q ӟFh7)_Q/լ ҿ[di1-S/RJA?6< w$#D74l ÷:J8rD |NQQQ:(lkS˩MZ(t|9qzWk|͍ofL䴒Pj޴F/=LKR&wjܰt~^S&ef+-:?3Ni7S[3#ɵW3=4m-Y5fѳ2vլC2]Mz[o/k-RZil *=x?AD!gkémhv`7}`V./tVB~g׊Tש=~]:?[Y.[ :FJp_2kސ>Uy]K2^ /Ղ -xs״j~b)^_TY|D+Q;O$R rFTs5QGA ͛;[4ͯ_Ʃ8x[-_ݲAnpn϶L}>+Cbi6'I5fιMc+1[XT JظReR5o}6.XNK:[^PZoT[j PLT2)NNl֩a k}u>V=RY3EsL8Mg*d (O埘]K4$Ðix7 Dɂ.sr6=LE~Y |i3QjxVE{EJJT8mˏƒ7i%8%f`йL 6ik7j=Vqm7UY)Lvq.of譭J5La3Bh69Dvx^C=F TGt) 8K[dŧ(vy˥4#ZNg ɶLQB]'nmXf熜w>'U<yPdD;8)2"wpjW,IA6JU4Nmd7FWH?|".{dee>2&)ٝ*l{$00s?^Pg>altt/eͬ_tӐ]l?@c} e9uբڑTTӇ5Ӓt[jlNՈ:VR%^$F^٨{Ɋ;=F+ Gz\s75xzyMz%!Y:YŐ:dj7lW;3%K3ve}CaDXt9cܬ;uտax͇WyPtt̳߯et:w~+V육)K>UiDߎԔ5ծNϊե#Qe a֥,9*p6q lj%{2MuՊMCq۵ugNY\:sNΔa+ԍ*t.sh?89|Xgg*%yĩ}Wn TF gC֏Ne&щ*_L9vVBFhAwk`,Q#ْ%K'6Ex_Ei_KLo˒}ڼ#!=F ݶC)dYTmc]}9QD޲GG/ڢw/7%:re?37[W z`,XP*U[-[`uRM@jQ -VU<[~|w51IwUo}7:>M^pX6/XwճJ0\:{MekwxE'tyyb, bS SF}կ~ہZt@Z?2fIZ&Ŝ}tCzacwu]OA*\Z\8|F .4HAz g-A・7l}ǝ )e"}GbjvnjW[اћ/߫ R T=R 0Z71#o% TbHu=6B]4^n<ý{}!*y=SW~7`zt+`~[ry Tp;tj˖-JIMU dg_Y.,mjt2L9Q-S.yʖ\.Zi Ӑ\ )=LkeitxN2qO/e}$grY^1df.n˙re8rMrӦE ڍCKzc2\7 (\~;+Y. C<\{qw2N/[KYJr:dxGNNi-Ӻe-[9aGI{Y,,0I:^N˴s|k{=*ILj\Peioj*Ue)))çS*;LIWU<ϭ\e:òH]4LTkn'Q…O((..N{WH[QZɞ^_2}a:b4}_3 9V4r UumO[mNۦawd_$e9e>쵙z04ULE+j݆ J=u Tk4aH-ߟ2N]`QV=ipW`)SFeʔp 6 zνo:} IDAT=הKNv~i?R!_5;p#8^C.GBp-GBp-GYyPJJUZZopE0d?_aϷp"81)))J>v\a JJ>&IGJ:I:АB#x -G}W(c:quPz\\X<!oݹxQUԦg/@CBɃ [זt.XYW|O|/X}=|]$Y5oSZ+~.e(}U )RZլl`QqIYǷi%hjKKښ3Q@`:Dx}Q\GW+12pm^Y77$jܱbm="kVsrc57Aj}e p U_/э!?蛟O߆VE9$ɥS5a>eXH5xL腾t4_]yVRǵO_d}D3zkpH=TG|xJ/߮P© VЗ/?ϼ$dZ41uh}GMZCNτ)1u=ѩ4o=i遬7ꯅ3UY:Z6Yv5mBm{FSzc{yԭ&nSkلչes5mQ',IVg3I?+w%I3jq[5=$j蝪\$HL?COʒ!tp?\Tk>]-oT$GDս5RSN'%.0U3J}T9fT{ ȯec2bW5󒔔6I*Up1p^\Z_yWS?V\7d_WF!P']\T:D#W|*e8=?z`XVg?!IJ2YޤwC^_ޜ*>KhsJKN%0==Ziƴ d)rK13dCm 7uXPlK˦;zuYS/JSjѿe)#=C~0UK˥He0!vгϿ_x>0$9J{CΩU\.$mݶM*VTSR s\9XOVGҷsgYUWU(8X}GGQ}lzBB "]:z H/JG@i;HCCJ@z<$ 9ٙ{wgwv3{̦^pPjOf X=и'm.ݮ9%b,Dl8 Q7gy~]PMEq(L68pz#QpޗZ%g<~^ӗn3nQ__岊YrPy_6fZxOY*CXώ$t=;Ht!T̔ qlذnVOBjaU:!D:QQQ\rŋ?ie,Q8._NLFlk#xGʢxbn_$@~\O'fwG~L9 ;&[*h$yKzB]>;KEynԔ.*q5mgJ˃9ъiGs2MyNwg˻=70cV%؃KX9џs-ӾwI,KZy"?~҆Y;^;P={<-d%&!ꮉ]㬀MnLɉU QR\zFŹr*ŋgf.WϜC|vuC}T7ꌮE>yRxt[V\ Yps\~];1F!KQ?トS,5gM%Зis9i9b X)m$<3MJ#9K5c:vqذh;.cfқ<h۶*|w /l])e4c2[T)[-܉Kr34܇,Kf> 5҉ٵqvl.t\}ڵ}Gr# heߞ] p,z"rdvgc A<tŊ0SX1]l(2w7Eʕ+eml+-C],z>pQҬ.B&@7>ƥD=x Yܳ#Fu-*R+Y Q,3dLxJPo6M;gN7cbpij w7Ыēc >wBJ~W‰3這} Vu(RMZ<o#ze3c|tM\4E :pKOB4͛6тS5ir!׹k]SBoqePBV q;sU)zM'UrB8%P'I9u*JV#y%zRVe\h Mg*rALT=tXpV1E:=BgJQtwwi)l0l,Mx=o7ES*yt±h?)HQh̍[/,;qhvU/c)Hiғ{'лR}Gus."𡎽9ʶd帻~q]9Bm@e}#COeR?bJaLH6,у?Ff;}~'9xMQ8,!Ze8!1*68xX&v-Ңm6Zͤbխ~b/tv|ML*69)Q#Hb6cV/Xn&K![|j{mO>o;_e/JźxE22ei-o[[Oi{L5 `ZX̧M*`k1o:YN+l1j` N>Mʕ2fz7Cɟ7㧣H,ƣ9VItwN/̃ *|$kR.gW%xMJe3(` ?ˁg*{{E l@0)&7Zu}. u؄-6VaNxfu]TP/1q|: 0Nf jvZf1oN72n#m>_-u"s4ei2,iq∷w&۟3bI.8Vř,N: hKr$BZbcnt:F ۋGzQY"BْtU %k?C㿉ٌ\ `08GͬRZӨIKb&I1=ș 1$:`ݓD$a&><$r{آmǃaDtHBnD+'.bms wbhh$'oq94'Ob8q\G!Dq$_R$\݉ (Rb6sPZccebp({M((X4\ "Iճ8e ~Pq-\9ȅD}"i/^Xʘ[!YebzQ,MB t՞PSʛ< R)x.KM f3B!?BO"J$oVi777+ƕW$22Wd )IZ#Tes*k֬/VsP%4 !DFOpwwL2)ܬJBIpBi$cB!DHpBmeBWHp|b4 񯔔dNFy:[Ҭ B5%tN#~b͕Hts3:ћS1 5FTt,IF#L2+'H 1xңiu*VDiSU.kwӇd/m"d6F$CGr ={JǾ ![ݥuF" kwǯv-joÇ?~{+ֵ+$MG"IZſ-n89 x~_H : *i˪?Ȫ7ݗ:~i=/aP!k60rk$ v5ro vo1[?U[=|y[ƔnoMSɿjZ_w8s z퉾u[J~zUrtr| oU`0Xu|IMUY5#sR<M*+vNCWHȚ XElyz?L_Ñ[eJdSA8Ƃ3Y. Eox}G}ЇԖ%9},e&&8FţxcKhK4jȶG؄{f urF`WEgLU 5Y[G0S v٧oFdi0şW(85'brKwb;o ق9#2#OLk?!{׷=??HE*%PwQQ(KUX1ߟ.p/>َt ;Gn YD)_и=^U!?tZyoⵐQ0k:^3׺IŠ1vv۾eYx̦w_æ,q}0CV¤veѶޱZS6w9zMoǒ-&.Srv8c>oB7zF-ʞf1vd-PNg?2ݏY %phv>]lY볦x fXx4MXy%l,[m;󻘗ǀt@̩Ίr)%-QU :bN7 y ۦn'"o;,a/S"Lk\4ha׃Ђ1쎾϶Ҧ][Zw7 =īcqB2qi^O|}}iK̹hyHW~ ~71d0+{ 잔I DCc< / G]Jqa?7͐`~s;LgxdxTHFiS>IfSkAA/@E #:5D"ؠV5*xi#kCǒWK=3kIϖ˥yg5r؀m9,FQE^@OH ,#Z ?ŭ80( רk_gfq@j$Z3G'"?Ә˴$ /"SGH$!b'&8d_ZWcLEHIJL1c+-d%&!ꮉ]㬀MnL &GBb6Yɖ-[1Z- ǧUIN?J{(E(<}Q%mTާ+Q2|WLγS^unYڻ3]UZ(r O̢04]QMgPϹM\֍7mƥDeЕl,(Q3'wry\#0#躎Z͊d/K I{'bLe(Fn_qZ9v\Rh<}H*VZz 'YO"W~%g뵂S5ir!׹k]SBⵦa n5dUpˉ(yp"=J?N̵2yp~:N?Ia⻅U!2O=_|;%7|R *ӹONhO&-ČLPLJZMcKd"9IRgݵ+]fb4͌*yO{ZCmuh>^HuS֟bݗ\>|7RNcKi.7C͖C()c{Bѯ@{i]×|7+uk5/13F֗tɌeŗC߱BuE e2ei-o[[Oi5eK `ZX̧M*`k1o:YN+l1j` N>MʕP2sB!^1[*, ׬Iu8I g/;nȧSd-oky)#Bz겴3ȬoϙX[t^\!d.E6~)czB!s=x֋C/!BL(B!2EB! B!"S$8 !BL(B!2EB! B!"S$8 !BL(B!2EB! B!R%05\l]dt)m0Hu+XFXѐ?]~B)Uѣiu*zgEzBmbY 3y;ϰt|[/;8hI- =8YdHRM.$=hVχ)I wPgD _sd@ ^;ޕ(_j)tVHLlS5n41{-ҵECjv|$OWsiu¯~=k̐dv>O}8.Q~A>oӘ94o0]ۻ:>{+ֵ+WB/G Nf3$Z .;6_!WLc8d:[ПwP~)R˙&~iں[^Ei7ϲj:Ee.8b ʑ#s`ųTs}scͤd$#gkH̕-ss%' zdّc<6ad+S*X9ƌ GP= Oq{&/wff6ew9k1D9y[ط[7#a0fM|c_|b=۳\үJҥGۧWݜ4=wa7קfUi'9;?vugԾ)ߺx2B7G94Xi׷9.~o[D8={f IDAT6K}'M$`r?&y;Ьy[Eu.ghԫN_2C4y׳)5j}ۉxhN{Ӱ>3]bӖH1nm-t :gՊtoዏO}Z|4Bs4ikh@_=*DتOkGt;V"␗ cw7,58`Ze25nǜ؎|オCAU  v+ѵ9yӎz$,הmbqUAq$"d1&V.}ZQ! *.^>x^x:] Gub'O1#2vq$8x~'T)I#I5Zm&=ps&[Tr)^! BpoS[d!.\;{ C26ђL<5\ŶQ2݋٤K,]LזݼynW)}j͠۽cݩd"'Gry/X\Q?cO1 فfM[B-wDH6e;AF~=mv0{ }Q-x˞l։mҺ,Y B¯EimݕzpѢYatMr)aW<0<<>Þm0q'bt@7kUʍvϤ*]`MK ִhtM@|](glc1s:cNG2OcAu.qVx7oJ~@ūg?B!K Z՞Τ-8^@vCHb<ôi(n@n.=R=-u){džBVԞ6qkf|È5>;*zؠ\L+bSnXqcfƪ/BG[= /\'R͂^粬3aW ZdSnOX&|5L2.5x.PZLYd"F&[2nTSA câ}ʩti=+N&ZW|INԂƇaz8G c[T`U UG%իYW,ՄuE@D$CZɈIkm[՘z2qܜ#B{H?vS} }dʁ)SIZfXiYė힮FVBThӺ̹YV54"Gao@7Tp5uul>M𾾜ۂ-AWϨIZ+u}v{I>R/s"WVԼM3VΒwz-]wjnctc$!o—yt'l2E Lѣe !>/lHQ\q;o5+Xb+WƄ6CyreUn- <9P۔mY"fгޟ-/k`a;=g08П#@BQ.g3;Yo)Z%`7%w&n3="*:MgkYsizZMsY{8(e's?@n{g6I4 J.$IϼoB!^ ےMi;[RR*)uD]s(<Q/WBs+`ȶG9`+Zfa73.[* uL;s([s??hTƥ-&sqӗ<ˮ!hb{5Dz:b'||դ#]"ꅗщy#. 939WX5}=Wofr_jF-j4g.'qaCnٳe{2908-3Z8mǾUgX^ weϖ',ȖGsf JïF,a Z4ƯqS:ON#WE1Фv լKI˄.P1P8F eJ׆hؓewȭ~+,G%n6xʰ!LڔFMy6FY3hTLgWCYq!ƺx}2Q-K[nyrzJ VHi'OZX̧M*`k1o:YN+l1j` N>MʕP#Bl|v'<_=:Ob E7a)u2V5ys꼉2ify=uYZ{m9Sy4]k !̥Əܒ HrrB!2^,}A!BdG!B)B!DHpB!"Q!BdG!B)B!DHpB!"B!2I;Y(8;;7o^ܬ+&Q!I,^ b7 B!ݾWB_,Y\(\o߱.G!J\\YHh|E(B!2EB! B!hXKYB!GeȷC7f ʕ!^wB;s&3vhƌ7S|9u&]B![ƴX|9}:xWj3!f#J29e0~xWB߮ [DJ}дy[>\pڽum3}1k&&&2ygBc8yT3ڂu#cJ~V7sR* w~!Y= g\iSA. υ<<!+~kYT6EzI粭tzp`o(fR+qpp`Optt.z\iE5$=Un_l4_rl898-oQԯ[iQcf|FmE1c>?V coj3vs1]ʻhz?K%Dn@+sLԋ0kK֮Mx$:)Sd|ݹ9Ԧ~=(x Дaa\nx7͛1g1/\JR3+7$Mғ Ey~@V'''5%Q!^1ǯU 0rᗯ ߯gޙyUm ';-RCLjԁޞMX>Sֲw6f5cѤ\I7]d͆:ۘ8&H)7dhJF`jBE'R_ E$5"jP5PQ))3s ;AI)\g%B!z#"Ali+S^}AM}CwBY7š0mT" eV.S'oiܥB} GctCeɨ]ݨg׭N{~2Ҏ*P) Lz5(pvJQofpL'ΑJJWlB< "%s"Qg8VW~bG; ]cߥ[e<4KtQ\q1#B>_.fՊ%|^>D3#xͮhK__=BrR<">8[e]8p2['ϐX:mӭ6ꄇgAOUgf}ALutDIHHGgUq>_ҩ*!k"q1OUD 1IprrB"jT; ?QIPwI.7#nGNZXà**W2MΒ>Jߡ\rF;age(!$Jf!nZ0Y}Q:]DLܓ!m#?lTRNLL|/#^((|ڔe8/0iƘDĦF 24k9q߈):hY*ϳbMoի^)JJ8DsǍ`ޱԓi0j4+Ȓ_OȤy۠_Y2jmb"|~i (V>!&L!) ZHLLG}_x3gQ_ϿG!xe fd;uhw5|XoΊe7C?jԡ;CXpaJh3ZE3; N !.9̩1odpDGǑèxv(-{Sz\\rFf%c|(dIF\ЋaSrG_܋|]_"Ԍ=oYrۖSZxU3ż|ڤ6rfȸT\酗!B9z8ukX/~=&et]g?uu'NRB뢿ً0:dyiż9ufy=uYڰb)?;.KeHB!Vʕe8eĉ 8rZW199F!+EQXdА!;6ÖFz(BD0n,Ih7(B7(B!2EBa%g񊿗 B!gg'bbbPLL,N_32Q!7o^HBXYLL,!7o7o^"IpB!p%qqqV( N͛7WWbIpB!2$@ !RG!B)B!DHpB!"Q!BdG!B)B!DHpB!"qBd֋╨]zxE$8 !2$;j!֤Z!BdG!B)B!DHpB!"Q!BdG!B)B!DHpB!"Q!Bd 0k.&$]OݺK$]O3a LwX!Ck9g7B|$ri"v)L})bGVT$.e[nMOl;JSc^Ţ4)יz ('#:IA,YtzP?i&'y>ju`kk OEv :bFn (Mv;ʙ|'9R+?mY_;o^wZ'yti &ҐRR- o&v6sƴ{1'V/(Uҡ2GY8Ʒ[ӽN> #%9͞ᒿ"W >̃kY}LRTrzFX̶`7jtiOIV8}u=p.Ӛo0fU*СkMr[JþEџiqP,[hE]ub]2?nʟ x()?FN0cHve&4j{{` ʰOF=eU+O: *:q7+=c'Eɝ]/c멻$f"oeYY[1{bNJkʖ9L-cnrU="HuE;pԇI6rM+֜}ճf0ր.^Âd1R_NYv9k6Ǐs|ft-)h pwf1՜xArv_K׸rњG)m\-Y'C@{xU==Fƹ u=(tyؖ1|Bx_gqqۧ!]6N[tѸoW b= ?ߏhƲyPLV<߷s,E]9-Z-1Ţ^%уXsxr1SW=3_J|,;rӦ~Z~ړti!9Msv-T-G9~c9U;J5PQ֬Furp*W0n|n7bۿau8`KX5Ip7g+W[f"w5݇? DZ?w6FcG[tq-bLUE*=+T\pkة3~@ $SLiaRF#C~zdѯᴩu$,)׳!z,ZD仵R:x"{uo=jC?$`WmKҰRCM9l>cv`,-zYKeTr떰>!׸oeܠoqOŊEp\vvxar%(ݶ,$pЧ:>u.7,4k_d̡(l !$0,^LsU< vn@r6jJR(ڻ#ճ٠R~^ ?bi<tMR.i/R3߃vJyP6e|wbj~2fg܅^WKwXhFWR}>BշpkcO%@Z>%#ts(UNԎk4ߍܓ騪E|7gp6puR0E=QNhi(_r[G-{4׽8x$> > ɗ9q6 vT% ~0 IDATޣlU kUwU*=콊Q'q61S_qVTBq =`&I[x 5'gڀmM(?^.`X'>ޅqy/:Qlf()?u$;b*Q-lC` 1̘΁Ȣ7~ՃĒ `%89#^{ NѬӎ)Z/(o?BO3[Q6\߆DStS7; B׭,6ʣ ڱ,jpт>n[7I@R~Eucϰx.FqRcܓ#z!qM/㭆o7G#0؄s*/mAL"Ќ ;皍,o7C\OP!O\1h'kF/6>UI! 9LYI1h#~og7*T)ayN_ѩ]M/>܅#7!Ρ,>]QPp)߉и>eW;'2zK,Fׇ}кK]tE19nqRe,;L:SMk@#~>mwN$Mx p0cbHlcB"&4"EROpk~͐;/T3c`MAOxR?:ǎ3+E_ds$%*e?@$8pm!2ЮG' Q1:I- wUH4! "fXWEE%)Ewu]959g1, F\qUtPO8T[>ڢ |#6Bl7f,Yd9>xTzͲ0+R> /* zذH}18`V|+ )G[Wީge31}lA\Î~FĈ=BG8H{vxܽ >V~ %y@a5-BIxAMeJb7몰jTE[|rxn%XkWaw+Q !n^)`C0z@ڿ?}ٸ?d:Og|.#r%X:>6}4ݾ@%^K[w7 I.܄]p>^+xH$|yrTn-v۱ 3^ _=,=lֺ8gHeeaH&Q>6[lzOΪ_Smv'N;÷)Bee;펶4- W=NOXpx煸ߝ8i`)+?=;[ uJz\c-UH 0Q1%WbŪY}bU:5U j+be kE/jUH/Gǂƅ;go] Qǡ9𺴚} O~>n7 ?W~&upDe@"xw+ze(M˖.Crx|r^;KWNaܘŸa(lC:[={fn):o&V^Q = r'·زP0=<^l|ո>o!ğ./m /Mfޛ:~7W>~L_=yz1iXP5{o㱇bBX < {/TyXNεl=TzhX>wn"ln#3ݱ}/m.iڔ |>X }ePѸr=ONzzo-~w {;xOQr%أ0=G L=ʻKⳣǤE{aƄ~Fmlv5oQ'I;_bȅףӧ w]PXP+RfA]a?➉|ܦK\R5Dwooa=y.P<;qh7M3vǠà1'_oz^+vV_.CMA& mJ>~\N znS0X6XEMaoliA:c.cc9E÷/5k^^ Ҳ6q7OwNIk~+NO~G_͚g3X/Ɲ-_w-^Q=zT#WoۘlTu?c"? ]?K|;$&_/?t{fT=_UcFH w9 _̯IGs /]M٪7mċsǜݱME}6ؽw$Q{8q@уKgrqxضm̓K⢳>‘nGB!|,zf ^yXKB/>8_m&\!}`}܈ދȼ*`ͷCHnac'#n E~K01@ ]>|on#F3▱'˽A2|r-.sTa}x0wϭAҽ`4y3(qkܠ5;/I'>D&`q}ּݜ6i So+12uF~^}JT<SFîݿVh{pj :hԾ *iSb#(G՘JnޛI':`1^X=ˢd]vDy` > \02g?1'ys;'>V#.G>{ '!zꅘ7?t&cKKgsI7~C]O߇_+D ŁCV⡅v{w,|~T\q#p؅z4\{ k޽y86:hǍb_/A+/v/Ջ?Nb-a'b6jVW&V+6| {8wvُwނ7;nzpm$H{/L]:H8b@R \j&yX ιK<.{ ^- DZ @|C $^GK$ I}3T vA̓N^g|GzdUsMk1W<7ʄJ/cO+u> B!q$B!q$B!q$B!q$B!q$B!q$B!q$B!q$B!q#ՄBi<qՉ[+.!Bzr9rNiƱ1dsB!C6~d%ƞB!O sJK2 % G!"n_%dž8 SOTB!2 ^O 3[453 ; !f%xr4J(Ti\L}n~SY@V|pN=t82y |2qƃń]C-} kO57#,k,ǧS؃~vŐQᑯjKVaQC{a7ԍ:#c=C]oTZ?͇7Ng>Cv {t~|]!kB.HSl^ a5nsBib*+*pgUI N4g᫲0OyVv罋ϖUgqq;}FC߾[80<9E"e&}1h]虧Yjo1ӧOsuk^9&^ot{7{Fy>"ox\\2+഻NNċy=CzZ`[x۽pgFi:.=Qx܂?'v \lpx8 {/ŃV.[ 9^h,Ƿ_Uk[APL0Nó+IGb_8 23~ #:Vbɒ2]2t+K;XŋW#@amnH9'ۗ}]KT'hO-;=CPxQXTjr"nMitKܾYwS :@ %gsB!yb}F`Gc E{օHHx $1㪋̻_cyU -'/-Ӏ=N6 5hy o?$n6~X8_vN? j #"J9> tNj[ þ}?R_OV~gA 7xlø/j6LsF7|>q a}rBu͕aBHC{ Ow8c;0ֱxtbTv@-~/{nyCсǘώ%rwcy.b?sX>wsx^s|{[K/ e<1s}u{oYzcpOѿwᣀ~X֛/; )P xy0}~ݒ]wT\ v~JM-1̫kt,\zphܲp5 7 :D?+qMg`~}pѭv(as!{r a%n_քKi]b=z{)m%h$BI\`94̱w!\1sޮ㴒|IDATIL~k.ۣxW1x`+CM{nr0Ľ&DžSYYYZ7@;DzM djQb'SE=Q:'G%BZ a9b-6F1Dsۗ-8^dɷ-wB! >7e֚2qOBTX-(FK! +Ma%ۗS8h}ml{]v.!BH\67lGc걚Iuu%'BȯTQ6z$֣5V9,qzbk [qŽK?@!-Qc696Zhj ɶ'>(qB!$.G6A87+-8p j 16uBY))Lbu7:8AISʤBA"m],.EќўPD /2J6]!uJՏX]ŏ~gjU8ky桲ʖHRYYy梴][[Ct/zSF]Cc&#E_X#5}m҂!Q{1f| W_TX ;3n?w4=B!dC ҽDahM;7 a:؞tŔؚNB!h/a=D5Klqi-|L/Z m,t[B!$ c߰s='jLOh]'F\@EѲlv!BH&?hO!}C?~E\隫 W/˸E.|1ֲ!Bm(+js[k1㉣dar4;'F!!\CZYObLZ< }l91ў(\=. $ 7WM]-9!BH\jP3|g TѹĶGp.͢A48抨_lf/m]oB! g#s&dff? y[a'SB4kɺ5j$Bx Qk/"S=/8ʋd#'׺CXtKb_dpխx&BiyjEFx_=UtFѵ&^Oc88=02ZTnGyP51~K-b1'Z* @r@2rA:'xr|: Gi\O!45.fj̒5Z.M39;E}y15_*x^2uSHkg$ikzjfGqiL?qH72kGͳ1P{BZR P{ RD^`F](kg nh)5\bt=iBHs#g]=@.C&ε<2@a5'tW6/8p0]pI{=^$]\VAѓHMjG\>]\cB!.}Eܺkԛ$fn <fE}z]]H2Xo &1ѹGY=6 (O :c&Qk<kJ.PgT+9Pwk&etiBHJ?^-1ӱl:{o6͚G:ٹ#l>AtWUkV8p9 >Ob}4&OHMK9uJ+Iqۗ@ѼVb}XMՠtu&.j@%ʥcߢM.K0=8]k.tB!$}Ƚ:,Ӏ:3g7[5P4KuGI]Ƕ.z儦6a-fG4m~TGeE UO{H:bi/ȺQ?yr|RӯUrl5ژBin}u[j:&FNtku5s} ښF=OEb[MoRӣ{tnu2(ז\á+\@SE5 "RqyyJf2byg͟6Zw6v᪻4B!$rո4+Y;Ga6stQkOҍ[3ڗkCG湤Ak5[#@A'_x?@ ^Xy(O垉eAH7G%kkڧ0֭nq.B~,4[r/5]ϴic1{Z.H90Z4k*nKn5γř(resEG^5/5JQkb.0F~Rhc?$P0M69F! 9qݳ-r]=VsX:֫M5!*DכY\Zќ1@9bmxӽ(Ԩr4'H"'K K?AJwHG<,\!+Xpݟml{4{OŸ2I!RK]kzlm,y1@F=מ@1j)M>Y(AJzuu3)fO)M!ѯ[ &J亖ML!4^7n&O׵5٤Gj(<1H׮/[MА9 c5Rs 9ٺ >B)6lbT T]֓M4F}|z:l]csK:!\gK.Ul]źڴԚ]5Q+]ð5 azNi*h PȈ_%R=a>ҟyH7Z8餬SuAtukI]ǒG.\5F! {ܚ`M%ֺm}g7ywOR6G@O uƶGNsMꓣڋ`'\\`5R- qY'5X֖Q6Q-Q02Bqs35e=^oBAs9XhkbB.k[é{2mz愦4ҍZ=HI]z)Q2m H(&3HդH ˦vQל<}B&a}:5 mGe2rbm}bkѵ?Xz]ua=.͕\ٙWKOi2Gr1v~Jצ{D[S ̳}RMj FɤBHs`ay&=7 h3hu>E]hҢȶ?\Lp_hXKź7@iuX'z'k9B)\b=b%^B!$[1(msƶ'̰g-1tͅei\煦6Bh#cɱsIPgt.8Ak4[/sh@orkִ1GFuQzdqD0ٜBi@fkVz 0Hb$ZTzvVtnk@|M5|lnr\9R}RtuCPk1Bv 9vӯۚh6D6BHa^ɵ}Woj@]( MIin PtZ& B=?1ң8z~6Q8m]!|cŀ[vtiAʭeu]k F5\Fky:uWOԨqbMlB=raFh]l͎B`4fc;j\5g0M>C52a 鍚qؕǡ!s!!f 3^6k968}6#}ȧv~_}Թ4ɴk]5B!efj.ݥnc4ώWͥ >0ɚ|k7/̠>!عd;ƮEz!FSӐ0Sfwݥi\Ʈ<\eE>Gܵ{b2@ ެȷflzQibճ3m?а9BHhv6L^Xl˔g"lzLFl&(F4l.B 7CV9քf4mqLSllsep4Mz G!䃆L\uf=[6D)MFE2.lOy&#BF⚞}6wa{2[" H˶pϱf=67\G!4%6:at܅j6Z&mIZ dqqcBN{hTUsi.\}q5 \"972*7~!l^6K #7G! 5FQ}Q5ץv^98 1H #͕ECB!$;sM6'Wz2!sMsGa!s4Qja:]#BHȵAZ/ѵ84d~C䄖`zz Z#4N!\5UKCh輜RMc1s5TB!$l TL=qi:Zyi4f%ZqzCSBCSl7n_Vc攖j2s\EfF!Bre]'4f -ٔ4;?GcB!:1U`^ruZ'.ML!뢥>\/W䅵LXsN.iD!4Z1j|o%Bȯ||sVÔBi{k0HMj?Biz5~¯ 5iB!$>eښk9lxZkkD!DcѬkFf]{B?JFB!YgL B!1MQ9$Bh MOM!AB!B!B!B!B!B!B!B!B!B!B!Bu{|iIENDB`kraft-1.2.2/manual/images/de/catalog_standard_material.png000066400000000000000000002400721467704360200236310ustar00rootroot00000000000000PNG  IHDRmx pHYs+ IDATx^wxUf%^AY_콁 ,+bػRH Mz/)@|Nrr2%ل}]˜2g6'B!B!B!B!B!B!B!B!B!B!B!BČDB!bzH"SuB!ľC*'zcX'BԤX'N1Uv7'BT&49;tzh*-z8?j5dDHUj/TʩMu[\!ImzPm*-z8_UwC6[?JG['P1B!DuL2u[VօN4N2?ҾNܒ<ǭrVvk*cBp%rne[ʭSHAt}RDsG* uw4Ωtx-.BH =nS~8v4*ƝƺCoR JsWS2Uvܩ#xV/zI!M$IMe%gz?pnWƄs꫗nb/*ՙxD2w$}b?L>ܶps:S M!B%5nmNq8'hN1O>n1S?TwIHD:Hl?Lmziks;lNS=#BmIj1n :Z׷vY;m-~zME:H挤Tx}b>.d.UG#s!8"q*qrfiHN[SO_$}"VC$sVO̦SNcո>Gnse[WG*cBXJҢuK~ܮomvc*5)oUX=Tw>u|֝Nµ۟;MK}Unmnq&Bm688'\NVn[\R׷vY[>.\MD$N#$IOԭSLoJLoǫ}mz}r[/;++V!N%' H9Փ5}E 14}k9@LݿO>!ғpEnםziVVY¨;V/n#BT&v[5nٺ Ǯ[֦O9uUmXPj9%TN1n#)d06/emv:ILm!:E:9%m6ͯ6Ib6{IYpO:5_6e}ד4ד>MkVe}mz,\]]! =\*}v6ڮ'NcBխ)Vv=T[Tb`'v=ݾu e>S<Լj] P>[MPmB!DM j)~zRgo~jL-;s+uuknnVpjwK)n^Ը~%Q}v5irk WB!%zVP޺%wN1fӯ:p}ԸǩMڜne]6Vuɍ8=ғ4fǠDz&v :TLJ6[^U]!pJv]vvѩv_zF6x{>6Me'nnU8 ަOE0::츾o;ov[1:BQ%.%p[(CIS̾bh |NM)fcYZf5Te8SJjܾٜCe=sJ pvzfݓ=,ۢb\ |zLQ?b}U+-ߙc_hO"ʒF;ᴓJq*=SS,*zVYN8lzbj%^zKL^?rr׭ZͲB!8֬U9u_z-O웝pX$bzYJBU6Ș'yN[9՛$i4s pO5+ FF0.Ba]RB{%.3r +p_ٹNpu>MOM%Fzfݓ֭ZcB!6XzyԌ)_|9}%-\FUGtUNmbze}j?3xy⼞}!BزB5hCmy洏*ʧz0"[Dq5I#N;*ܝ?y;fR!b̄ _GD<MHHL҇ !bagYIOZC ǰ_66l;n6j=?Tn|ǪP܉n$Pg~jP1WE{liħðs}1 H(B5A)eKi=YS\j_ZV 5СԲ}_n~v,䇃J(NZGHL]`r%adɷ!;˲1D4nU\:ǫE8F{NbP~1ߤ'nM8vIu6Y]"-F> r5)GBT! ;Qo_n(mA+jݎ *ƝbD?X'I]WjLo8&|=w&4(l@^=V2#rIʭGrB&f\e}&iGaY1;B!R=vRhQlcz֝^>8^mL&NMe59T >}>͏{J"1)сWR=E9ȗ]V}&w6w6;Py<9jy>t0\pN=X;x쁻0M xH0z/={_أԛE kӚ;R;v]<u<jΡ"j#T4}c1qNwT_TnZWo}SHOfc&C>Բ-(Šۅg7w`#7STGII!vnt% [EV4O'CԺzSU=;i1bv-WOt%t,T< VuXK˶ ;fqmR:ZOf"ҚIm'NQFK/_24Gs`,垑\O9|2+?L6hUdeNy^rWxXasyѻ'%1u,:kW\LƍؑkaEXཏ?NaV}lƘqo0piv$''3urmq\pE\3g3͉ >y/>믾eq#KuII S~I`ނEOp>o˲BIYwǭWy< 2;Dbb"7l乗Ʋ~fҙ_LYJ-\HVy-:o纎㜁HOKUyql޲uۛs:̌t w_Q#nqlۑ>Dzz:QQ1-m_ \7rԱtg_~[.pd^x ?ڴK/Uf),~Ͽ,{h\y4̪ϲWz͚r;oǵW]J rb,12tmӚmˍ['ן>x0KiҸwd3p1}P^~I_G}îe`:7Ͻ*-YJ)'ǹpߐAѸQCfܛ;!oygǼJFz:^x.qqqt? fbܛɰk ">rkٸq3;uSGݏP.K`+h٬)q8/\S/B kxYa#Vo`.\^0gqպϼȼf 1{Jo=ϝ?yYOg,4y̋~niO]k jmQ;-F4 ݽg'1 dd0ԓaMvP6lЛnp`]3ǟ}SO>4z}>ڴnIvN.o.]:u)q0)fpXCypvvdxiϲ}?L|97B}ƩYg9\p@t>FEQQw~3_| àAV3)Ȯ0/M{$))ZjI :}e\۳s*_1e,^~-J1|(g<_~4wMyMMIV-X/ #=:u=+.9{~5kqgsMs]TX9 C3އwjHJL`-621Ϗg׳z:ff̞7qF|=k֮/7n]0T_^y}t.gQ.)MOK;o͉۔i {F u2߭7+?hռ9= Ld<;wrCnt-oa(/WLTq-[4a#z.|Ƽ:tu cǿiyhwF~ 9yl޲g^ڵhݲO>z?Mgm\~|xK['8͛˯ɴ8n~0x+9y^o$|>>7L}<λoM&/o'Xw/c&tyÆ/ҥ3t=y.+ u{yo{ b3/rۍ1MF?bLQs;)onq͎Iڮ ^d/iz W \ANE ycYO(***?PK?'ѴI#yx4EdկG{R{7v39$yV:kvXziY[ߏeY<;wd3y J|>f͝Ovv6ݻv)=o~-[MIfM GiYj5:e6l,{B~|QPo~/#Xa#wWL\mӫap\5;2_5h̙ݻwS\R¼hԠaгGw6n̔gP\R+6}VHu:[nS^]rrsٰis鹄ˤ~F йc&1߸Чaǽ᧥f͞{;_),*bm,YMT޳Gwv(.)a|շx1vh76li3(..aU>sv^ʶ;s摝S1w?`_/'>GͺZϊɥAVyYI_G~+m}M|+ ,7jXz>Yq3f=K1g>K.3o"vMF{o$:m9=DJ|%zs)(͂Q\RBΝ,Y e/ۏseQ{eY_'țqHΥmtțscJW<~x~+~lyL4*5jaqIz]kbuNq 5Voǹ&NqٳD^I*8 Ӱx 8eY$,^Kqq izyOyOgG|WɁ-~} v&?,ټe+ioӦsW><?7?U͛5W/%ǓHn \iKq.X9ٹ[Jrri9:\{&~ ӰAiV8Νv1~' bn>;{ ̓窡7R\ 'q>srhUKYnvNQZ!=-C}يEr$d1u됛+=Ua`n]Ǖ%|`]JB>w,˽<*e޳'{̤+mW{7懟ò,F-5#!!^kx3fΦ#iѬ)aлgZ(ZYдiSero_&[Z=x^ ~`h֔=cM7#zf1͚ѿߑ1A_&s ҮMk'..1Ա=iRT\̪kIHHvR'3: Y_0 ʽD8'3f͡AV}=&jܰO+-efu8iҢy3tfӢY3N<<<mZ$))O$8xd8Cn'&&P'3֬]aݻ^) 3 ?o\\vE͉&ؓqEӾ7!!$^h CpnNڶn jIߕ!F_Kߕz8";v(wuN,ϼ9ѬGՋTv.7M>j]WDz1V"z?Es*}B `bD<ǣ-x .)-ym">|p_|'f,FpU@cO=W\c9iՊHBbEEL>9bY|Ç Gڄwu4t4W\z/Ϛ5x*=fӬiV:}&NVs9y];X.K:R?:ÇӯSjMܘe2rN98vw̑~vdgS1K1l׮cμ^n+.ګ.jZ4{(.q`deQXT?dيrlir%ҢySKؼu+Ͽ<eb*NKO۶`wOs͕Ƙg&[nWǗ~ͣO>5W^ʸ&.8W^;N>ƵW]ƵW^FNn._?۷'cХr!,]?kϲ{uWV\Ŋ{c|O|(p;W̝O#0ŧپchWz:*<6~m }{0yt^| YRZQ#nқٵ+{ ;' 7OIt5ь}-~RR["aIjVjz!,>-Mp6;f\m_Lw"pEsۆ*W L^Y7eߛ;sjcbdWzZsh{P,}לeU|Y@z?0c 6U! Li,x,l.x<T2 #F`x]m 5omtKMB_1z_6uu6”Cmunq[ȯU3;tjSMM2՘zS 8]!'~]mz~|>?>6 W|:qJ,ܿ:^oWB[>IK[4ofK^Bs'|C7[z:_vnqSADO=jfGn p1Sپ06gN|ؗx1xxܵg݄b!pEФ2{XPbj^bL_qܸū:Gj]_Xj^ߎ@K1x0w'gNxQT}CCBq 2%{X`\M*QvҨ&xNq۸jWJ닭՘͎9]ɘ&ma{rx_*BK@Yb%wj?5)p׈N#M~zi}՛z2pT\\M@!"RjN[\z$Eu'pB[IqjSNs !Bsls-^cj*qh[Y[=toB!E7\J; ="N}r$jQSZVv5_B!A)\ᔧmU*^cf) N'H-!BDLe5RbJmKO nB!.Gc6Wtt^.; !Bh)DFC9Vmb8FrN}^;1͎ !bSVVzY:8tXmNE[4B!D$Bzͩlk8F ')fP'G!"ZNSn1]6Ubjo%niۉcj\K!"ND)fsCk#q2~mcROB!8zTVqǜՑ8 ROfxT!5=p}Zu&.[?}^ONP!BpBz*p1[\iUgh`mNB!)Ps =q 'զhŭz,ԉv!Bh[DfSu戉8=NmQzXmWR7 !j ~`Tvkef[N'S&+UΝ!zXS*p *YӉ#DX;;

io&]HǸ B!D(r .~O17G[e|$ O6!B]!\qSq1SǪDO!"RjSXt|S%,|&d%59ÿ[w[ͷﻓ [ M?0zkd,rmO0_jXۗUV(Y̘EÜwt(]bi>i?7US)qh8~{ŞqogankW^Yvt;x;+u>cTam]8o+ b;k+}'i{>>Oɻ&rPª߾cQ^i?x(gtF59~_ϣ?AA#X-=O,qzӽd.3Qn}$JɡsŅhxsL]ǭx|= :,9GQ0 ̸8^fӞ)_8YL~FTub6O\KG\L:yK~bHjHcS"cQG~mgҨ\}iCf=;_7m|m BO|}9ҳX"fy>R[ΣG=O> 8,>W{ <gˏ_W9jG>sװ#rϭt)Vm;,M8^xMy|,3dֽÐQ\|{O„yuB~Nv;zy1p*$1 $/;~!D$bbcPN퉣*'&VsU3/m",u( kg2skGN鑉c1 | u-x3{.Vyw\t;ON'>_.$u8_-}9Q Ab=g^=5!5>cXExMd7۫O2݆<4)yĝw+K_37wpߏ/Kxncq /eVJÀﭿp;8݋?Owp°9iy{y(?ʍ]I}c yB˻߷jyit|?n8ǁ-|?d}<,:/^ޥ+uԇODg}eW8{N4Ə^6cGR"XuI'ĵM̿ UۥMMs 'х5n7QoPa+C<3}'rũI0ښp"|Z)_N,a`ǀ^I$;'dljSf'l^80 #~"Ri{l_ZςmVe|OK:; =%6)ز^% #h](Y5_9Ӻ%B3ѹOWx7>(ں#11~8rvL͠am֠'_w5GCZJ"u_z7onʮ^"!l\^/]qT O-vMӧ͘ONφLv!0吗P:eWLk';-Hd6p )hsg,a]Ik; 32H5|?7x[8*CI=W1&Oc\6;* ?m2N PfF$H%-,}y22H+Zɮ"?9GF|lQRv)l|7ޚ|c_MgpYG2)xٝ E9dbXHg֭8ّ_d>G=~H ꤗ_cUVa${<7yEKv)y]!pulܓ#[䇯̜:吴HNŮ<̬41vz_g4ΡkzMzrDӥ|B&Xj"wd1P?>ק~9O& '#Ǿtbu۳߾롴ޗΛ~YmF yֱ%@ 7aKI װ|nI|fSZO6NxM/㬃˒2O[ܯcinI Yܽ*&LZW,p` aUK+lh;nQn}Jzo߬ЂnGuo|f,(^g߯E42 ظry%`zRhв)Pzfm~`:y8MUM×5ɷ(;ߡCMkidcOA[JYؑAh,\]] 26lNe%Og`y<].a#8_D'*}rQfvy=yF=v6rlx_8f#N oKH'0>'a}wEJB:>i+ͭ8ș0Q?т^=:Rou04!WS<~8!)-_2u̘}.&ˣ\M8fMa^?A:swƖO`Iu`аByFKOf#f4(}4 NyM?sey2X /eʱoF`Ytڞ9&`ct:m0CfH)7^߽tnQ=utg7yosoԉ8^ywrU`7Lك'iQױ7W f[;'dqPkrbLr0mپ\:M/ClLrƍ_f5eKCtRrұ`{|ԅFIOtd r71~+xm c@IZJR)u+_˖ͦ6[r+$AKxqn+ m_l^64J_/?js9MJ/(:&*>9 FV!ٴWׯIX èByOԴ5mk$qF:U !bBAA%=s !BI(B!""B!$B!""8 !BH(B!""B!$B!""8 !BH(B!""B!$B!""8 !BH(B!"""=t*翼bKoB!ľ,NZ[X$2vè1K(Boc-e : y)S0O{s7֍gBr2!B rű3Lqqq}&'y7OwM_wzKa]bEl!C1d wa4M ۾>#s{snngĥq2YubּqgYڞhLx7dK6e|-?g_ԙ3 VMYQ<]}Mb؎oedVdAKcg(Bq M5Na﷈|s| uEߥvXVz *qse,@'D0+Dʂ Y{>zo9Cږ dߪQ2s]v*wZ}AAH316PyG8Jd@GP,۴=GR1p6= 5;ؽ7Y~K16jldL[qnPo|dm7,b_2R^o]+,%/EduᚽM*,HxWnN8+NNiܾ"w  q:QBˉȓ뇘53%`v|<;vsA3Zꁣ}싟$((w$ $EAFMeS"Ot۾d$"wvh,bƄX bM ɒ?INR "t"_j "dڀzOef\ɉMCf[֓ S%Sb%B{15*g5U2]_ƑC؜kU,.1[t2v&\X82q[9 /9y"'KVےL  "nU<3! o2c%{q)dXٳ|1nqcyfXY7ttvࠗn+\{Ů0Z2'YPZFNXooёYM^`ҨGNv2晏5y0yTi1i5c\ի9s$g|:Ayh;zgIoIq-O fYHA-iq\j,cYXuVӖ 8YM/t2fwοS([״Tck$I6ij~PLT$ٴtsh )5T$T#ZR:U1ȆL’9JHQMyTT|\%P5K>SMhNwXUT -a<$OAxho'NARI ߙ4D=`FL V-մ5CuN}'x/4k_ 8z`.{ي-qNoHԬP> k{&~0D»T zwB4^U ΂Xg#K$˧+ٹm5#dD!1lS~@>kO.J ~L")M}P\9J*qu 3jT߬@D"Hh˝ ƵvR-_yޒ_!ڦ1;bgf՘\FAN4UHi`WØoz!Kkɧ*/ r v͆bަvf/e@pi2*ՠ*RkY?2(IJT'rL`Wi>|,."c._t{ƱV5)(K)meOf*iס=ݧ٩X''|8>Uld4%yQZM`E{-gN\QBRt$ ?K٭󏓼(PH*, ,d)EpƉ5鳓15 WLEspq|k̠: i IVt\ ,אZy9*.fEmf.0ES|j))-Pݭ<8Ԥr\+XYgȤ>>S9]`xt9:D:atsOLXm6Ѯ'=i8`B;bxs]yph}Z֥Fp}}=Q}ĩut,ĨL 57mv+@2蹰`eȒpv@Y 8 @p{ W㛥[#\v2aoīpFـr wd뜮d>kni~55X?$P'Vٴ _̰γ*F %osFofV':ygu W0sc1_"wקluڬilk@Cυw(_-uugUtМuFM^+Sisvnbw\:d"s>0!(~!Yn-K|F |A%lvm[ƈrW9_boR`ׇ*?1Pv.ΝY:7u z g1dI8߉70yJ׳cAw Y+y]'wQTɹu ɭˇ~ϙz2wNvK0n7dNvm䔑u?fʲܾOsg£Ī͌f?%|&yj0VmaS' h/yhvTz Dn8?-UT|~NWl)ߦ%yIho{djk?'thĮo0pvzsZq,߈ ' Ѱm5)v}ڜaۊduӡZ>h+G36)_ 4YHJo_q:i ';9P/~*;N>GʜOO}) ,D l;~|T틗s29R.5z;/^ +>:W '<ޔGr(JCA罊✅ sM#>NjJq9] ke4? cur3T%/aGӣң3 /vBhυi')'1kgK ]iާ>Vȋ8:'9sK{̕ĢKQzIhE*=铜sB֌nM^/)WgC'cIPF"Bz"t"_j Z뗉_.V_>/%MH"}ce·iTIx+DGYMX^Bzv+~$MHS~a:Oƃ %&-aүy& vj+BI\)K7'~dl9bv~}}p)јj(eM5)Hh)ÓL'^?;MJʬkjP&kMNOH!>4#to_K4⧩/2i:IR4jG Ch3?Y*ycd#N/2?{Vy)Nj)gV:"Qn-Ͼ<(݁~Q2{GW>1~T)҆#)ͪ@-iÔA ˋg/0uS_K-Rۧ ƫB:`߲ IDATl|yq.Nh]O/\Ʃ"V'e6MsX0gy ֩An\0$#I$w>Qu' g"b+g+J ]ί#nnahfݨL^v3h3yC /]%VM Jka HD_ʽr:T)TO뫘ɹ?cxȞ͇I-IA_7+Fh=S[Gm}ϮoQ6Yj$Ts\kSkWO"ob_rtڹPJ^t7uԇ8{BYIAWu=;o)" `1ziM$|ԣp~AU6 a \xz -;^zT/Ӟc$Kdq!'d>˗*դ ,5 j FR_3}`0AtӔ3;j d|82wәڽwPrR|(0dNGO0etьn"T1]3'kv`cң!"g|t Y)Ԙ523iw߲1:KGԧN5lА.3%[~Dѳ'\}yQM7-'yQC{v~;F\(ocB3l\f (q!P}>6?_3$j>LAT'`̡}9};rvbZ!*Pl:aϙb'2xt&wF ~Lx2tn&eǰq+g æ|2jwIlϐPפKȨ[c3)7UѠ/G7cfٯ}|lD`K8{Գ$:tuCMej~n@wrԫb`ۡ ,<_ȑ|s̓78W?Q&ѝqGH)UU| #HLLOѬmɉ,PYc[ө{ws Ϗ}E *d?]-؋18|7t|T O^߰oM 7r' B* ʭe=\3N9/̤mi֝hwR*QR?]kշ8w~G^a HR"2rh9sٽ ֕>dϖdTOS%Zξ8t v/Wio*A&EBB%"fA{:M>>gTfe_4 $֠r^O2Em܈+{4p1I3MU1hYAvXz%8.L}K@`kJP;mK~4TrmBK:q7vYP=yC6nH0|QI&~܌:4l?ͥOɜԛ.jo,҉FR/W%o tN8;;_NdL&kjnol7-֦MY<>ldn|*Ҫ 6<] =Op(Z6oFi'x1 ❓r-B)*e|i&~ͧ-Cv6Uv`j7S9m(@FhNuݠ%Fmܢ$2F+MLZrC̚Jz! -\P>Ƴy >\yܧ͉]O2sї?W 7m8jݟͰgLJ:Öv֭G239@ø/` -Y;GM 's0L>+1!]L1;_1o!ɩ9AsQmrn^ʗEO1~*n<"5 7ȎPZ͢OJd›͜*N\ ah4ms;S^v(nL{R]<"cm΀6e&aݸqvkIĉt%i^nݸv)ܴ ,3>sa Ɲ/ɰ;ٳ;`𼳘> ¿Go-fZ*TTv۹?M:!/}#*oOIgthܨei$FQ$"vO懛A ,^F/ h@x89|Oqs߆ ʝR1'. ̄9Pr*$^N .+S}w')كh[?^N YH%]AFN:@jV);wyiDǙ\R#:' 6mL(kRVj̶<2jw-| k3-EKT>g>kK錮t(R9Axg*Ie_v-+i?Giե"Y\ufI%_%o835 Q\9Th̤SJ ϋk)MDː@4~h㨧1K HtC!QpJxHȈHЫ*sm*qP866S|M,VQE[?>R$o"HʓτRRtoHƷj}YΞۍht5y3̥eT^U;~~ J2jQ4D㑑s|ߙڮ3jB,qx]:Yìq2i`5DiWvl5gDDqA4ai#Zfjf?F{=YIBLkjr6re_%}tLw*4L僔sZ)8.ɥ6ЧXPr+@/#Vy)9$dKryT'D?ǔ U0!6K@G-/Σ3-+Sd>X%ߌsμ]eC)iuKDBΔzfC y'DOkq/HPRddޏ.G|~6hG֢4?|umbf/en*!]/Ȍ1] T_Tx,+-M&+%VUUwn}[lV j1)Bv3'N&\)H.j7z0')rt4 u* 9)q8c^;ɤ-WT۵0>cGd9r,7uGNNk_G4 @j)9Z.yﭧ_(;x/_jZg5myɀմ~oI!cq ~?ueJ;A%h]s:/#6 []HBg 6كKzSʼʟE…gs S8Hʕ_µk4y^^4&OFWwRv$*e0kILLL$[[UiysFi"l»E}S׈J0Wv|# /]cznOMggY{  [%O<4eA[»E{ƹU2]4d%_͈'9#.`WyN1We<}A %D([3fV=7Ju%]3oې{A'G#~~[B6 »O<(  AA4  &"pANNN&Rx89Y+E!=_I"##g ?""~'d '.xyyr5ˏ>6z+W!ItJX``8pAnݾc?+\rq=8tog||ɞ-}N1/A!m$ 0  H&+ ^^^dȐ>IH'D( 3$Iooo$A1  BQAAH8  i"GAA!MD(uMC/~BA'D0lC2)Q!aDkܤEΖ1KT#iq׷2UU*;@ڎ"yR A}LãhW3?aL2"9~|_.˂pz-/ZB^*s|rz{kZ6= gԶ0kT6 ɛ3+o/QtHfĕ܂ݣ1WIQ7CaEr$]|VY{ń_x>CaNJ@ MyD@:؇\cq2cS>tv(8gx>#pW7ݴOxzt7'r5em+^7/cQM{NyEN˲jKp)-'9y/y8DOexvx I^ep)$IFX=.8HNd3! ZhzJ0k^nAۓs9i!]+؞9{7ƞ{(һls<&ox( HVKqF4tNW$dIRj~ IDATQ#B_wjCVв'+Fo':&X'Y" EA'g$#~B=Y׹"Yd$)U%Y_rxJ,sru6|._pBB:S>(4?XȁO1`: NCh7b4IT9m2{ lb\L0qeԄxWޗ;p(|:-;ja +T΁e:r_wnaMhqYs^}QCY|9x՟o/9o=fJ~j_VgG{j=]F~+o _!K&vEUn][dVG\rcM?A_)F3/{&FhhFy|pC'(H((vA_4)Εl?e8|c9zN{*fxl'߲ n7ZهC)ti$IH"@#E<.nVɸ1.8\p\3$W7\X^ĿQ!ΔiڊbɃ 'irLf˒LZ4o9ɝK: ootdyţfN,)@Ds۲OywvP-ըIV39%QS$][G%!.777dW7\bHL??K+( ro|FMӾ QD +NOkIJ͖}܋}F}1Svp6bڅت5%\L˨v2fH!Wh1{gpv/qAO-& pv`9C gh }j 5ҥ郝{nV'kxɖ_Eǝzzأ7ofwtݞHn _j՚mz0T:AEǷ$K(.k21HuixS-X4\͓x,|dUN{j%$+OySU(TnѻciWGi~;3~V5UؔNNk3HYRq׌ɏb*M˗T%: WhgkUV_}[/ܠ<2"_ RAȈz@1B`YZ(===MR$tﰯ?쫷o9CWm8_~ఝǿXt\8^. C7 S9%6L 96`ȕ1NːLK.e80]Y ÔQ`َ;{o=*Y˗4Ôkn!3zAm0߹>Z2e96h[5<&Yo;0dЗ,т TbE{oG.D !8,x& sy~8ajԨ)'Iر|W*~F] X'4DwrQD ^ϺC ~{&NEjZZ~}'=ԥao-8W@JժawIw r竿4 3 zwJe˯o]y:N4Q}?d5kD~R4%ƌ ctg]jԮzܮ=hNs=޴D_I%Fp\5yiUVM&MRJe&N~}5u=#<͚e[ܢa U+W!l D.e aqPLsmm7=;j+1wt2Bp\5vء-[鶶+O<8qW׮O'iҤt%4|{K5iZNgN lo?i{¯J6۪iGR^}=ٲhGNzwnOxC}j߲4iծ4oӸjWȼW_߾)B_t[.ҐޟȸMY8WӞ)Ej*FjMj*ׄŇCud8[4lB}\5ISmx#}Zcd%-G,)"s(QCl(:6Fg۞#WƩuQ9ȯ钎Io YIC}o\.znVYօm%iç}q+^+U&,ޥ%C;kI[va:*e*r-Zw2)ϖEg|tNM}Lvd*gwxo>A32ZӶɶe+eDmavEZCIJoG~׏{l5*8#.g5n^O3aCWv}SR_}ݒ}}דXnU9ۍGկ[/ W+VwlrթoWSOiϞ#ZѢEƘ1_AρKoŊjmk͏?JʁUňS64I<ҽþ+{ e+{ʶw7 9<|ˁu>NeA#Qvo#hLӼ\-av4,89W zC&G#""~wV2۷)22kiR\p(^%$hvT`#9]^pHTnpňa'##w."""X\b(EEEV8\1,ҶەEs ˯e4ʍ+ƶەJ*)888Zҵmm]X\8b$%&Ե"0} ReDp.Ep\1}O#.<.#!8#!8#!8#!8pY(a+Ҧ6m?[(0i+4s{/ޙEiV_).*w#5-yzM}6SQ\q;'=fqu*, NcZ=m׭w:8'p%4ib.\e홦G{U;NiG㈥rmmӪ_ Y߾]#5zOe,vtG1n;ymf;"qsyύ4ҴrPy&,٣}҈=YT͛nAS 3nO*{eflԘNNuoio̸*W=|s4W8#vܩ!˲zqwE S}")]7Fy{PdHt@jfih yfl\H׌UׁUh+)W}EUFүSzQ3Tc*5 C7lۖeyaYgnp]ըUK5jR&/jY]Vm"a.KaJ޽Wɶd C2at2d4]r]_kίjPKEXQe+ܣnm˫`D¼JUFv̮][WwnS&V\$'-D UiIU k='\q 5\w}/p_g?3vUKOqgƻ\er<`ZޱydJQ$TaD6sjґ$)Orv W=M8xar^l I._W=LIA~e?wKr:^Ov.K`uVt1uyJ|nS.]zefŊjذ9ٱm[k~IU*W(FIʐ䑔}_-g(_W|?>:㲠 = Ep#G8Bp#G#((Hii)--]AAAKWm߾]iiU imD\8Uŵ/!A֯S)w  QttV! 8QQQ2 CQc.e?8JDn} .;w蚒%7ojj;v\;vT|||`1*R&$hR׬y[IRe16ϓyT4*=UZzy -r^;uW-Kw\a6R226h=cӳO)ns(Ϋk>~oS0[ɳ{ɄU<|>]vbK53úQ~yڭ'#ݯaW;uTUwݻX|^ZG}*jڔ# +\Y>]7,wMwB36zsmS+ު<6L܍t]DuW טhDUK?"LsK=u>xS-Džzz w6dJA+떶U gum|2KK6jp׏FjVh7o/uM )QGMEK4o\s-e)sk\{KjLCz8)MTKPasFjtJߥ5Ql;5ٚ=wIFV}.ekX{֦Z٦#);ZhЖɽ5tc%P˾f cs/:uK򾮐Κk-_]TKyPa_Р/(PI[Ӥ5t"UMiFۇbZ|*C{Ӽ_-PӜj7k[cE=oKת3j%jXU>nLȐd1Yσ*0U١z|jD"4W췈XC:*gzvԒՠQc5hLN*Rrve4|ֺ~rHW<+Q;\+)_ .yj]) )SK@%ۖ$Cmׄ4zUT0vARj]sD8yf֍.ߣVhyOTC/s! UgOTbKFjf%-_mY0W t W9%o]*0Z5N떭Q׌zO[T6&\iZ3zHK)UyP=s7);OzsuUr*UYi&d!R.PUcО~yվL2U-IZ3gIw}2FD"tD2b%)TuHӷSJVbI%6|ɣf!U9a( /ǚ2ڏSwޤh㸶yWY}' 3t1-WtӇ̙2Mɲ|e UT1v&{Sbb*TdV}3N k^5e3ZA5iuPAsC0#y^sTm)ZPqma:|8Cq7)..ZGvVq~gnUSD8T4UƼwChX5oqrۖGaYL-aަQ0HCnWnl*ÖPt^z獏5~[^o:iRհ\ xMIo&ҍ}4]ǯSnƨl[?\yTץC=7TW?(1pr]Ni޸,rF]WYP jy4-J5sG7Yq%)XyUj]2(cLy|tt)44FeU [;HFoa;N7) ]23zqzz` TP?;3yvkʃ4W6ɟ[y.Cu.,F~ΚsjUj=7EZfXNio9mf3lHr5naJ +a_[ϰ{=ѹ.֩Z՛@el>c=>W)K|Q][wkl֚Rʕ.!#)=?쫷o9g8l/8E;H :ퟐ+YG81. 's Eo+=pGpGpGpGpGpGpGpGpG܁#h:xNJBBCxr/֜1ѣTKjjKh03m}%%%X"|MCbJJaF˗OV p9һwJK{tSK-):$s>zֶd_sR `YmڸiBUvm\,022R*^l٢6 ecKןR#ׅ((@0CqanUskt ZwJ/VU?cswPhp*T ۝m 4 Cn[7xB\VgfےCui[['ץj;ue)NVbAgFAԪXm[S 2û'lUm+yvw5zd[?3a5]O\>_$}4|UE'[|olc 0T\9%%%)%%% @jݥq6ڶF5k/om#2x.Rh TfMUYKPGK 6O% JHuGMmMI⃴dGR6Ti{{zӭzr:eٖGߊh[g/߼f:䝪um[NR~]ſnШר5n@ Z/=pJg\%'u 5e6 xѢ ʑVEXmxSZ0{RZ8W(5ΝlP'?w߭Ҋ9O+w^~<2 rsbK!~>2۱vl7FiMBKs;ؖ"M1Ha]3BfJ*`Jm9USFk xu|{~X~0X93VIF6h1|ç::x8taښl\+j3jvR}5-ot'}^F͚4T[K+ÖQo^lzw5դ5G2{ W/l-C+q>hD[wV~i+KAcZ}2>5]_f{'[yU[U)cvay_zy֥j}Dɐ'\m6W~ܭ~>jD PG_f@Ote RN+A%>%Nߥ#]!79r7)ʔ$K~3NON-oiM;5:rg^m׾ K{ݾұ Ї {:}=K^5mU5Vfm/$JZPFt"-U×w#T6mrnL 7W'_b_oa,}KϥԮ]MM=b|NVf%6۷URWAjܦz|./\Tj_Nxx]Z^tmjftA5*J[=,-\PKw-Iu^6Oo:)Nׯ֑d/hI'4eb-I4zs2vk 1_Nx]n tN};uFTRv?z⻾}\mxuh -ų4{VpHLN=ÒYʒy3hLS^C3=1k*tSKVAS%7լ]xNVxVcOt[:2M+饙j0V='$:l&o-^١z\jDsfKM(16>QG~?ՠ5߇{mYgXZxz$:trTSm6}eVm[F#вK4`=ְ؉9\lTV7hüucK'җKe2*\ `QUŏ$*ۛwtTA2<*۠G ?l-A 5uU7(=֮59]^h[^+$۽4խw>^nỳgv=t_B*铿xQYo+LʖP,kURR\j^ S*ҁeI=ʮ1JYs'B)#~{%}yuȳT::LI~-WԮTL3ʷo~F+#`|$ɳGG[VRZMeOxŒȲNgULгmzp3f G)h}dUh'=n\(6&FIII8:[FD-7F}ЭT4)<6 ZUSʱnYC]=q&ly~dۙGM|SO}4HM"=}dr9Χzzr0{6av" x]!yT~gQGҐ}F5^s28'{v氆6{Z6j6ޞQ*1S Q6vIz0OzK+g־o߹ kckr`H2MCy!:#+Vv,,I25 1Q*y>|Yf Vr9Rg_=ׯS^?;R?oTԻU⬅r?>P||vݫsex{^.\)S*i/jҎj[;"`jȡ *rJ 8_NUHE Ԧe^0〾JG=fj}Xr IDATZ*%\.Cy7K6VR963Y:&Lΐa)u*4.hU$H?w$uO#t*ݒ~9Q+'"=aka2҉*W"LyfVBFd>叹YO (k zk 2S_mٲubZ%oTyxglHޣMˆPt[+Ŗl;L4'+CvX;6Kisƃn3ml98)]PAil +_|ڲe*TX͛7+_|tRMpVj^ͯFC}}ܪtj0d4U1*[#Տޔ.#fI6]w͋V\TJj ,v_N)cDum;PGM*ts|,ר㐗>v…w\@'6P߉)!ե(jSŇjTإEժXy1[„t5wݷ:Xe;sh谛]az񞎊۫UJ -@uhS#T齁jTQ=zFtC SD N?x`UH{{^{Q\|QCKNɈPAϩP1E/7zS#ޣq UFO%8Ea(Nftқ 'rn3=AK_g+r;Lh#:/{&eMTdJ+mT1֥ґ.x/s䔭mm8Q.=P&c벑~k^g;jnY휖e^Cf l0i2 SFO:<f; \i*] vz̼IXHhƪ7^iː.EmݛO_1_q. {.e <<\JRR\zl-XDU'};?\R7͓qR\.WO p#8^E.G8Bp#G8Bp#G8YչPJJ=S˂!CAARXxX`52EpeRRR|wQ\; ,k!KJ@P(R8Aww  G,B@Ιwwvg63sgwW7ll-xo ""$< !~DŽG,Qlllpuq",<ܲH!{J;`HZ r҈Лjݗr_,{=7&ˢ@4칌 !=PA:ċ~iM=U?em,9/.J^7=Sy>x .íl;dLfK[8h]:lSV*-*?e \ThۇA]4gph 6s!u-ktvB/>ʚ]tCі!֋ KIpL}Mg)M$H.Ħ@iNwHwFæ) ]nьFMҨIcjUL1B97Q^ h Ј z,)0ncMjG&=_zG^W\&bU)#hP=z}Ҡ^eTА얩AL.]W@^*%=xt&L?@D/^q间˲uyJi6Ƒ)HGrZF8w<ŋ͢x#]DV)Rޕ2sn}:$55gXgk{@h+g{`Feͳsx }@+.֋^/!.BdRPVo'Y}E F2f#ME%vNX|ʼO89Oc~9[_OM9^,$h*&UUN3m9r :aP'h/ӡK ZBQeWthxsi䪖etϞ(gVߕCVϺAȒQPTke,T ._N1O ɵa5qVB Q9qd2IIyT\p{6K{F7D"x8Pcrx%e5xY?%wߧcNyן5Z4ǧbs,l`z֔GS y}NƗ[2Tڝ+UI#"V_8;NcLD=?x#C>k?_htZS=3x>5x9ߍE=#;QV;1ihgVwG!kx ՕB x  Åf:GI;: { cxyujwZPÞTlS:G9JQLD\.V x=*ѱqΔjRcxt>a/suŚ ÓK8HBhJ,: {rF3#ƎgG D^'veM}Ese"\S;ۜ;}ȟtOgUqB(vS= 9y Z%yyRj9\>ù턂Ӝ{BR`'Vqx ( e˔AQ^=uċ;CaeikrJS޼3@-F2IVtVϧ3qDݍF _͞ gߕV{8 cE`f^G6vd*фOCt : >(/ ;] 2wI.C#9SK9l& 2dHf>mY,RMVIE.(11X9.9qvECt=:NNDyؠb}U$%B !ć-KgoQ`cQ;$8OL&TEWzL9&EؚL+jR}U>'% EBqO1IB*k|r`Hp|( 2$T(ThJnPPUg T* ۜ |!VѧsQh6%; !4 qĘ521Q1I'prM1݉ƠfH< 5bHQ9g;utKR* 6UU_{KZ!x^=˂Kn>%^0F}ȜTC,1F4:'cn81{B֬6<BQCK#cdIѡH./+^n("bn#>rĉWBLxx8O!8Ot(R؋83ޑLyS 0!.KPhFlPx.a#: *^:\r wxςMB%OiJr(x,EC( Mo^@>B!$8gt(P6, h£\Fte՞QVćlE, lSy, ć-՟LgBwɩ->pœ#WWW (@+T[!B7I΋4mx)XΟxb"?DB7QxqWWR!eoLB|B!H BF4B!1 B H7xS\mղ,%":~6)~bh?&4"6'˸k#?A;͕( 4 dx/H aIȗYe%ʔ-K2C:οKvKtK ޵II6 !mƖ{_n9A\&FvIaIdȪVʵ/;{e]ETR/ߖP@5o|:вHGwHpQtX抃}ėK)gRѡS].do1aŔrLKz/;2RG}s! p/Z nmwӃa^ =3}S{1 ^rQ]ld=da y$=Lk Xw83{3@ @koʷTaU^ThՋ˒AQ捛ƚSl[^Ck4G~g-Xj[SF2kӼE*xGρ=b>u[ıya?5V!}~E, WÕaho՟a$x3g}sPܶ[͌<0\1{kae?63hCOԡI߸o]b'U ,^K7k:naԜcI?sVsY/6N'l0\Ogq /Yw<0Yv<c,,M?emlH4@SMI΂()5QR)r٣Lq7 ~|y֓r'^YW%$8yɜܸIx(uH&+Zve{l>.YXl-crJlL6vf[-q1):(8nM2]9vV9U-ʊ&0U{W= j%h:7-Qk|3XNG3puLޭE˕"4A:] &^FB3+{w2dȐY9x۴0ǧƉ2_S9t=91rznG&8x*x)Q(^ۙ};~y5C|˄l^&i'<4pJ Kog* ǧ{R.(Ƴb v<G{FIH3Rsȍw;4BvAϖ\uE`Ȫj)>GJLX!M'6p}K=kO8!5-&s@yw0N)Sq^!a40dWƓ O@C%G~rHH7{\ DCCiT SfxʍK7 OT%csS( &ơ*Z/݅W 1i(k0 GH D߻״7na KӒ?XԭūcRyã ~ IDAT; 3TCI پ*RR"tdl8ގ)ґG!x[uyy\m2߯c')m1-ʯ'!??mԯY:.7 D_€vïhV{OYpĞ5}}Z ]}4$0]U4#;vCmY,Rx6B!] \:{,e7W!Bg |,g|_B!i"Q!BG!B&B!DHpB!i"Q!BG!B&B!DHpB!i"Q!BG!B&B$cfye%9&ψ %B7~!x#"he|Z1-e!O6~Ci<,m &l)ڼ75|Q՗C1 3k3g#T˂T)|һ\uE;1 kRj1 )obxTXoX u@ G>e)Ub%k|3SiS2b37˗4CuheDZT 'c:TK7yi-c{ſVM׬QfOwZ, MnZ4W uQ6`享Dl՘B98gǧ@Z"S!ΞwВo?>[DY~HX=^ пMYeFR I Vغ_Io{03 :CQIz˂ܱٓZ{'ڟ0˗uuQ@gW8@Z=R::}X48b[ _%g/151g1rſlٻbuIA/t(8-LN;5GF=q$s>y;XHB3-Gybް` [1tfuNd+ӔAs׎XɎɍGӥύX ňoW8-;wf~? jsh6_ۦ&!AD0;m;bqXckb]&eKӸ 7<שw6<&?v`SnzR[u?2C3!cՌ(u/+ρp*FRhE]Zv"ɣPR 5lIK<5\t)Х;^iB*I]|C;ycT:ֱgB>L;S֬E@K٬yT]Й8vږv{ҵ5 4͗fqZ-Sr|Q,aZh'3 6ʌrݯ[=AKn4"iH[hA߰FgU3$8 !D:Ȃ㢜۴#*vfq<() %+Q6T\O0tFy6{xTh<T6+NvؼL!tؐ⫖gA`hoEa#<goYYjxڀ6'5':$TBG7nG_+-9(NmѐB.V'7;eV?1=G5_Xoaw˜S}˦Zt"[R0鵫w70zN!얠dTF?ʳۆ}_JU4{fLz'mi?qnXw2%5CY[yQS#^ `OcYx˛ !|Ż=ͳ)cW6 +'.}OB] 5S~bjA+91<.WɎ@ᚂ>1MEkQy \cEcL/oAsXsOU'\7DZX%C3o3:PsHʶn%qݟ/]׃&ZKjrwo7&G x%5xu7f<3s[%CsoL%k3fYH37=q~H6j^zݷFԁE cDLxe#c4dSxu#W|7+1zXJ;<Ȣ|>C|G%g2t^<C;b30FptFXS]<ʩ2v#LL~HѤ Ч?ܦԵ){|ΣsYyTݸ]321u`U6 K?"='^![sLjSq?/P`Z"ۺMl?\~gRqγX޶dU'LJ&k9.ŝ޼5p+.s4ۖ8N60fהQ@ a=dm3rI+xi N!ZG~Јx1bͰ'/G a[d: ׋F[B_*U4;_ؓH}XHoY#y8':l߱Je n%8l:_E|,ӫ<ЄӣxgJLX!M'6p}K<_xX !Hvn\cpfެJʖMh*aOñQ|nzP#8e7A uθx 4M!o}|/e "U@@BbRkҳ<[x'-=ϗ* Y#7#W,dIoFY%}Yf{+"4{*4E_Yy)F@3|&|;aG0\Y^<=GQwZ{뉍!&6+[8d×] ƇVofêe,_9TggMa9ݪL&9 ` ^%SZG*ؙY7fsW68 &^x{ :ˡD5DD6Oa5C q!잿%})1/UwaX%_y8|_Ȋ)krQ/Rٷ_wt-q]b5<<Ș!óAމ Xl^ۦn~_J+1;V:l3!HT uIEtk\z h?: Mv525>~TR&?:FAOc^6;֡r~hJV%j=>TQ\`<'w\l>!߱uף'sj4uSiH o[[їz]BeE^nK%77BJ*:ɓ*fVfɃXM[% V1SGٓS/WK!Mx]yhG4M)]ڲ1n{c~90& & b|<\56%MI.p899Y,227$TހV=.dYoV}Yí OȐ5׈hGҭ9 yMgoߣ0.. &% &((G{-m,Yβ@9 2 ƳaV)삗ȷ>m*nY9t -<"7tQEt-)Y3exwO!H/-V;auG0Ɣ˝;G2dOZȗ|5cW4E t+iZv'5c7. tYt }}Uxm1idGtf3STt88g07MğAēY`9[$8 !D:Qe/Ѳfcj;6LT9@YxPQyst(aPŝ+jjv,ƋZK۩kٹ{3DŽe /S9>LV0!@"o\]c$4U4Tn|^ iLkߘj|b =¾D!ĿC {BȒ!9~ŲzTY5߼s#*u@ W]7/}/NŒQXQ|V 1.Tll ){"Q9́ʣ%b0o$:G!H':7\xʣ`o߅XKgc>`ǰ󣶟F&!>Ձ2r4`Vo ;ɭ+[)Hqy[h秞G_QS3>4bccGUdKk[UaoyQ ˒EA.Btd*EU:}Vtغf&WȦ#3M)PU  qHd޷"w)ٸ$xE3^_G ΠH[Ƀ:O hue`>_4=V I\O{/i# (El@ܒˡUCCG%E 4ι 916gyg<ϲUW)V'VDXeB?DS0 cѤi>0J4,|EQ%*l%Hq@ E@6b n|[Gz>Og=v< Bnt`Τd8+_OE|~(uG %z W?|S;(1R PrT dY!28!9;ƕ|} N=~Kn9Ew"9:e~\]iGқ|'޽=Ojj^6/y^Tub6me6<(ٴU`>\nX 3uD=y N:Ere_y!#GQl713i{x㨦i;~2K[#Xxo/Ƥ$XL'fӦi#M̦y݊-/qHf>mY,RG!BU%K`@73grYƎǀ)YeucBVt:ʔ)̀n@ƎjKxIpB!ĿT4f4%KJh|IpB!ĿFM8 !B4(BXHU(BXptt 22rEFF #}B ٳg`΍ex"#yٳ[t&Q! @kDGG[I@quq,LB 7WgRH8 !B4(B!DB!H B!"M$8 !B4(B!DB!H"UG%颂OyY"HpBJvB!,ɩj!B&B!DHpB!i"Q!BG!B&B!DHpB!i"Q!BG!B&3Tn_cMe׈_f wٿbc,q}RVMWB|qivCkTB/'dN%Ѯ'V: 9m=_g_=5sѥh_΢gS 3y\7AU e̶r1VCSvp%wi|+%e4H8qp|L_Pʘp-LboēK`aLZ\Ryg}KԣIhO9r G@py|ˏa(֌s|!wVWj*M6;}VJٶm \ۺATЊ,_v&zXzo0a5Օu*d5_z= 8xdGȨqNMJթU3qF};N)W%2]!4۷fJTɫvpjJ"T]9 Hq*MBʝ ]<Tԙh>v.Cjxxk opt"~N&-cHgbǟ7=.:P2'ݡ X~G1\X}~IczL%eu`z9?0x1 _ǘ34tWb4nI[0F˚ WςcAK1hIbLToo IDATsxŽ4l[_ lb1L#lj]c7 z&LwČOK0\YLO's"b&3WW=XXY9 # sx@0lb#rD:z'Z4  wrnh蟺QEN։m^<.a{ĥ!nf\s['1c!{$5q&Sfm#XM0ț\rsW\_go~}׉Hz6}dߙ1k9;Ug1DfL}/wT 1wbosX(!IoB e網hLn J=ZWȶc8g-S;xu?"L_Vr c%϶\.]# "T O_۬YYN&J V-*">BqC6ose}<يi[rdDZǺɋ9b1* P_˦%#qk,EЫ~hzvvs !ƞ QwݴcGv[acohO6 f_DOU<sK+Kıa?w̅^>k퉿4f"%o}\iDFņUkP|%`n^A&hl K'[]FѽRÎư(Т)T cٜ/B;9v` #\TV27fhG_VAnXȤ[TŸ/ҝN`Zɀok#FOMLV0qi'tQoGi.U_f,&V~j[+3׏4JQ=~%q ֮*z;>r{@ E:"`+ JS{Ŋ^ "ҬЫA'Ez'3?/9{ly|sswfg 0pl,EEOc KÏC_?ƨӾXn=܀KES"Q&2<=g3LxEx3Wᐺ+1iB,3~gB{غe+ F;} ~-> Oތpmർݯ^;w9[QF/kauqG =OpD?_]hzg3\(S=o/65IzmwO kK_^G>5ߏg|@W_>A ,.j=mڄm2m݆Xv\]m]ܦ͐nMB,_YḛqSx[Q úU:[;NK"6{p[T=45o d?c꧿soqe't8~06 3ok̻1DQQs=8}\˧P^~  /Js~Z'] A p7E6cP4AM_ayN [j~".>Z9o0n dvϿ–yLt;2n!g#QM0i}rgw E} `Nb˗ayAӖ͐ ۺSFw."oыvh: dyQ #bFf"\0ZwckcO%iYMТ n{Ɲ W_<ݎA͑ò } !vܿzvW]O܈ӥW_ oL.{<0n[0ݰYQq^}k!B-u_>]}/y;z w>.7WEؼP7 oƊP@up>~8tz},wY;;gHQQa%%.Z82 c=[pއ8nVmԎFrN:K=:"945  ׽r. Ow|WvC<7k- 6xZ\c)0s(R~=eزՃi&Ҝ 8BuKMciR%jѳj!+Aq8BAFƙ߈10/D1/kӪ Nxwثh9xx偸нXIjge4싇? _3_k{?G.zBy 6npbpȫC.m)?"c]Q{28t㘶hgڊKE,d:@qQ1 !VܕGc 'N\_=t9n|cv?N. ï6{2tF\[~‡&l2N704{6z5-gh g(9b^7Z˷ S܁=}?8ޘ^niC]|~ө [6n9xo&lvE{\<L;}/R|E]=o3 =Oy} ǴCZ7r` CÖ]w,!tz65k=ڜ[+/^^Z k ,o}}u?ѼYm 0= zh'\ߏ;C9|w?YIe@>2,Z? .iP=:gv pG?/߽Wf~l3e=uh`B3G≩%~8^vc6G",WwE֙X< B^/۸3'7;:`4ûarpʓq)j<,|b\V?0h!W,t4tzߍĄ5 oq_߫0h=F&=L h]vǾ9S7%9a_8Pt+M3^NjoE.c7SɼЫqoܽGqŻm=7Eqۭ6Q|.wo_?3ZۢX4?όCwjƱ&ppW;qݙ/ί2t^8gƬpp˭3뵓po`!+xЬmgt!!v<4xj6Fz698kg:ElzхxxIdHlrЬm7 ܭ(| tLlrk[nb{bfNpCsnk9K[ iYн[&M873?hwX̸H6+<~\h zz >Joxp!UwZAN ?Z"V|w~{)C# }pۍW:"[‚kz\GMm#óOW?o@I&hwT#A!>?2߉%vyBL^166 7.9YеˁplFzBᲷSK5N!xpͿT B!q$B!q$B!q$B!q$B!q$B!q$B!q$B!q$B!qL#ՄB<4-[ L!4e2I!H&MlRh9u2!BRĖ[dR4kLH qL#?\?yji/.!B5hB!;;O' drj+ #L␓FFqL?q] -5kQ\\ˤD g=JpRƧQ?&R 8vVm| |`9\cXh!ѹsgdee2"믿`ᢅh׶.TN!;&U[q`&4Vf?ڪKXf-ڶmGXdeem۶Xf.U5;ّcNw!$GP+3eZ/..FVVI5Uُ OjSiʋv-B!Ty yR^ZOSuv@!TzTrjq ɜ}B!@paIƱ'8}B!~ARcE zBB!%W Ʊ'1HF! X2[;1jb<wrW'B0aDL< .ٳ }K隠}JwdƫBfJJˏsӱz*\2d&N o<rXz<%޸R[ 7wOwh >r($5x"^mdG2N_n. !TExۯRyܵOàz5=z|zQҲo0_cp˭a?`%{hذve>nmG&LW?݊n gm ~۷ߋEݎCn!L<ExGp-`1P(/ 8 GY0u>;N%ؽEE}H&JS1/o-B& 7 +;W~7V7-CoGn_;Za~ғ|dT?ٽE1͸NSФw&[׮{p7[9ɓbt;>w >XRT-sF3⸞=qy1ׂ/AK.ƨ>ĈOD#.Ę." Cq⸾mca&f<> 9~zoQzDN&܁zcCKƹcy}qǣיoWyx ؤ0yQ8kux^Æ^RVB8&l'W:!*z=jFLV2ۡ`1__?_.9B55Xp:tеK_ء^mo1 o4L߮8#wD4+up1exO<տUzm{=+F?1y|Nioq>mz^y#p_| 6>8qY089IDATgOxfСnާ Ak_F~!/l{cuԹ)Ԯ??{ B ô[1/Q8}]Q wogt@3FLY-pamyRl<|ӴuLKd9a42g)йAA#AK4}Q)t=ժZ<ն<}azdsB!i.0Kqj(V\ pMw4BN^Bar>܍Cv#ڌQW?'LL ͞mO?G5it9@̟hiMGFnBi<Ϭh6Fͫzq꡺hk"f%~Oj^q!C݌5"hԹFGe5 s~2Z!RFq aZet䵏йFhժtGbF}$>VBI=OP}C5wޏ1? oK4RkhmXp woW㏯umND2߲6j߁{>ē0jhvء1QǻGo߾bfy~ƈa]97_= SW~xXnsBe͖ˋeC~BH9дyKۧS'/z7y7Eqf}4p8v: N7-> Çjq5Nz0\t3,t'Gbq;c´F8vx]pLxwÁpK`Ίm(\q/ @ ϓ=zy?\uMxw6(|I\gP>xh$ 6˞NyB!O&u[cu5M8&vZyУM.?@!,dstصQ1˓O|ĉ6B!ha &2j͠jGwrRM!FǺN!;59al+Fgmd7IFf&LbdT/BvKdƦ(8#s]ʟh}E3MF7C!;{0UV̏~'˶h8ŢEPTTK )**¢E W7W!K޲~DQאH/!zu,15yuռ![=|d i!7;8e=]*G-0{,>yFP7.ZhKA>"&Mz4zu$O UerDM̨*9ɄRөCیH10r"?/Oʑq.sû:64G^e8^"<؟H趋u2CN!;5^~>I! ??<;2ce-7 :BE$Eu|Q(XwBg1܁B!$"A+GjrJɐ'V.$B ctM&شA:c-:6t]ӎB!qF?uxm$WtGMl;12']Rb(~E\!W/\4]KK;BٹiluƐ'8GdĞB!Ez0'c"-h{Qmܿ<ѯ 6K;4&O7}^$Y3ԵA3:05DG v@i1ztP:϶O駋:֚muB!ĆZrӛ|gL܌g.亲&5#Qr4_O44`^122<(3kG'@13QjTPir_eщuMDI34luB!${Fޟh̽`&ssOwf̦ͣ:Fse]f FjJUGvcN3&̍.is.ΕٯG$Zl_͉jA47f_l#QBYenA4ilM;NۮIC(?7/ګ mRO,7ds4~zJ*h̬>ybc3z(hhi BwQfBb߲v跨&?Dcy k6tB!$y{_efNoRPjѤnb9O+5XdeFBоP14?^4hjnt45>PYǘEi͗b̺扣|hf35ZMn4]:&By_ݷ ^kmj27F9k(c>۷i̱Ե&7SA\U A`eP<Įmr9M\3 (15cSE kMDDceMPtk4}I(uۨcM#Ba&u}s}V1U\9m<(5FuFk3jۗmCM 8&\{b4}F P( k FsGfb͠~IُٗY[E>MKt]n!T!w\'ڤ1{Rwn4s4OhT3Z3yz *EcPkt}ҀؚM,Qj\hP4B>6fӤciBH=[c:Gk6KSgbJS =.7]شj:23cNc'OoF3ߍn.1ɢ4эM, ٗ| уn3R3us`!T!Y::7~RfM]jr>BUGyr\}Q3 '(~/zeu4fҘ=oD5D5h䲖LL!T^46sY͘?YfOfzLME3ϘFDsݫ7ךOBET2fF:- EyChbQ6ch, 4xѺYlFCt'-cKtIT'B*,uDjnŲfۤm5MlۯelL]ӹOO)Ue5.sk \0Oh ĚGsQkP47O'1Q7AZ.cmj6BI> 56Mz4u{?wCT&P'WnQǺGbNuGM'GA#O1~˷f1vϋ渴35جm6SFI]W"s!=7Lglf"}f5cBnֆS$$Zx$ӛ8z5*& tA4M4Aeьo4@yMBHu:4]ӺM, A~>K-^]rzZ3\׀!^¤8&Xcdl'EH"(]ʌRC)yZ!ssסkt'B!b{M.u[ӽr3f5X~Rѹ#IW)m%ʛ.]KO2g̟Oz扣l9rq94[[ݦB!Fߋ&uѦyq4[xQMףxV-TqPfjdlIs%tsCOf1<\CnF5WdžDu_L/!bxJc{JѺь b4i&2Υk'kFcXM<͜L9`OL]56^k$zjdz !#^>]׺lm'IUFCu 4]eD5Ѧ%~D9!# _u|-h'z~"]:ףŚx5 q=!(}]aS7-N}l2O'!FK]֌cGz!RUĻƫu4>[uMM,Dts=W6Rm0&%[uj2֣ ZKk ! D9PތFz-&uYgmīǫ%E F 6Cet.G[u֣djF3m[M<B!$YӢmI5>]kWu]׺֣mWKTD%[OX&zi]׵.2ף%6ݦB!"F$[ͦvCG=n1h7ǠsMeIq^=Xu=4GzFmm򊒪u!2'zұA/=WӁi2mM˖$2!Ț jt ROUul^'CeB!2Hlu=(w|HUO`a0(g3Z(_͓z[/JOTA!d#fo6OhsX[M܏ }Azt͊Lƛ#ؖ"s!"fF3^otmstG܏T"#Az}~LvSg GI5msn_#Bj*̌_ͦ4nlDQb4OǶ܏ }Az&#3h$ :GǶFz!FSS?S{ݦI{mKtkVĜ%2yMh=Qn ! ?Dflįn/Ѻm_A"%L%~=~ nHTGeB!QI4ׯ̚_,%~=~f#h\oRL$~2@xIb֓l?P9BHIvO67O6{]G+DUdl?`5vM{t5_(^BJRmtֳZӹ [tصD$;' BIcӃj%EM~ !Dxu[ٰͦ=IRTQIv%4?ƫIB!;AQx5צHv^:8*b*277Uz<*2B!ədz ~sR"s+2Tq*f*2Go_O!R9RmWӁ Td~E椄`z*z 'FP:!BG"sUzZP*FE祄bn*s+IN:ǐL/!BbI@MԓʬS)OejH2T~! TIf?A{2kUfnJ&2UHvdH:BȎ@LR$ʬ[i&[e2\B!dg22sR}Tv~ZK1Uv<B^4SǓj#TkI%5!FM4U:TVv4ÒM׺B.suSΎj}^B!5ttr^CUB!UOUOZz=յ_B!L[u7 OM|m5!hj1UlB!oimHB!$8;IAӔ#B!da6)<<BȎa%Zx !C3H!B!B!B!B!B!B!B!B!B!B!BӂrdIENDB`kraft-1.2.2/manual/images/de/catalog_standard_template.png000066400000000000000000001140041467704360200236410ustar00rootroot00000000000000PNG  IHDR}B2 pHYs+ IDATx^uX[ҰR"**؊݊q&n*b`W(*vt*;\~}|ٙ993;0 I V@G@`# 0 q8C!G@`# 0 q8C!G@`# 0LMYTbXK -qwVVʥjjj&:::pKR&&&[XX(W7ظ2# pQ*rR2oiO#?q8C!G@`8"=?۵ .شA^aYS{W\'Z+WL|#矌+qQǦ 3wڛZņq$-tk%פJw8 ?FotQ[:d|'֪q˩o&ġk6U"|vo={yӫֽsmz)]Vn ύ[57ж߿ y +@~[gEHne-|׻t+wg qS^WVt(U~e#~ϸkqގݻv޵kD"cՕIdON |\, Ei!>% >F]2f_|KK0Kv.5r%"/kp-Œ<:l#7#3Dٽ>C{޽WM~ѧ#|\|}UOLVj?nxs(e֝Oղp^Ո7ڥ8O ܱI):&963`Hvsݨ=k=gJkW$4uȎ-Ic5=w}s5.ج%MZIϟ.Wh6`x:E1]ihz5CD|U}}"5{SN?JJiX5|H3}.Jԛ9u9\<}j{iUTAumZ_ ȾvA:\ųftHUݥ;<>Ty%0Чemf,;O=|&vw-wDmS>9Pp̡׳˹WN*5jS}S.|D7?ܠ\σ/|zy,ٴ~LC]"Im9eu3\eǽHO۰4nƺM\\1$&07h4bRj[6m]l|&6Zz!+|=AF&A/?m]=a̮~:ykݡek|V`)#vp[eNn:*k3fn"ڥ'&mq!kϪns/\y:cCwOn6cfU=:0ӬmBZ^fxWSJ}龄WnZ>>'qDD\twxmܲq^Uyz17νp.ѥlj,um~SnZ^ߡ;Y߼ 1AN1Zyar^S "H!*̮8m EoNMn版xiKjki`-k53Qa]1q/B:(Q}2DD@m`F-:(^ slvv 9]ߚW0ȞUh֪M+v;ןwMwm`Έ j62ztAza54O}r^T[ENrkʿ o("ΝOݡ}%1hn޼j럶O.w=<<ώesJϒ=D|ͰZvk`q*< ZXjr$$LDD箰;f[צe__ʹw4U'FT]G5IևspDK9WҠOaҰ}EcMD6~0rBWSS=d [jp6irC1,!6QT;gXeM X*p^$H\QףallpDu}YV+eq 3D?o[$ܛ"^DH,Ji RX/wOņg2.)!Q?9[> PXvK;fkn{:h3D|ҵm[W[)Roy+89YDc+g2q/?""H?=">+'hpiLt~dkH}^ZfƼ=h]Н^U)̓6CD\RBXΊ 5Z-2w<&""EBsĭ[Qэ&<&pP1֖AGQ ./lM8[ʵmG;7ihS[-.dg:`dvNFf%\bBu[CqO<7mV9Ҟ\WeݹiOW< p/}yî;9_Aa ч>^ˈ1tlV36,dq(פ.u'F۬liC8"5X#Tx׬Ѭ^z3ϒD,EsRDe:]ټ~Ey޷\Fr +oN|۰+ۅ $cܼٯ{shaƒܦ^&Ow3B!u>W_[Rk+{DDjU,{MnQ"D-^ h;=IX5ui%|􅠧=gFrjZXp؇Fy̦V]+c|>l; cD)ik6&7e&]Z:: /qyD^]]SRvЭ+Ɲ'"bM]M\ġJD;9:P:vkxF́ F;wF576C  >wΩftv΂{*_i~~ FZf\GimR»sihX9njUm۽ء[uWڃ&vҞ NݠLݞ#,Y±4pC8""Y7x gt4i*.N&&!1I;ݺunݺʥņ҂vV\rwVVʥ˕S.P-N%;7_&x".ݡdPgd( ?TE񢈹ptD6.HWy(.~88laʥP<'kq8CKY~]R4!!]Km%moKGWrJ,?!EnnE%UlLӧO+ӏ(LLMӕK q8C!G@`# 0 q8C Pt8{%J+hX@@(!@]JGǒ,33+1)aYX\WdGXdDr --TxQDT⸔(xT^©~: q=b#P̩XTv7U @cv50?jon̎d^߹ {S c+ՃO tq\^9Jnj98{oG'D&9o \O>[.]W{zra]uwSպxoYV}7k4ԳOFBx!WwBۛ^KbI'kF{y8ϓkF òJSӖ5ƴѭ7=;yʙJS׍_n1DhhZoa\(IO296C$KQSҥ"ybBQm?{<˟R("H Ryc|ǰ,+D"!/H٥ef-; ^p4"c.Q-=v ]>rqp%muu6UxSV6>R%gjtO7MZQ2x1r1KD|͓tmܹYx!7E'=}@W^7\͞zyb͚NKoȉakqsqnidywzm6]ٮ>V]4Sfݺ _N2#.ҹU3뱔c-&\[΍[t6CQl4de:|tVNnPd[:0ENaku9a w+oطsӦͻx- _<FP #H,6HD<$2?zxdwGǿ{|qGHϓ䟽P(޽yURRݻw R4D`ąkr̻7ޕY6>.8b2|f/f Vj0߀c vU8"SF/pX}}p {=E!$gy3Ak{K0lbO͛dЩݞf?͑"|ԥj:||;shx}ҌVcv =tӱc"->=-?v|cŸy <0i~J Yޒ#!gOl=ctnyn?}h̛k-Wyߙ6TYH~'Q{/{'(/|UeQED$PFՇCB|Z'm[ɗ.GFGb R$&jKM)1R">5>7|f26kPN#w9'pd1/̫7hڠc*RF3{ik_AZC@mxDxrRbvIrRbxDxE[[}ϖW53".&.9lf Q8ݶHԿú{4G"j"rwZLlm ߪED*p^$H\QMIg=2m{,iD]SSXallp}537x2 b֟sp1ύu~ Z:x6zgQ5\.mnNDa2kbf_KJQ*U)Ⓧ**$7,q_VYٔsJ${+Rcyr˫:XP21%I&Kt^g($"O˒:<ɤY<Vn9ēg(&o?Jo`kkakkKDb}ϚW@R5D"14dG|7m:^*jC$@ /)_F\Q1 c?SpOM}Y E˭r%Cf{v7FYDDD\Zj:CD"Qt "⢣>0MrF{dC 6rRJws'NWw#".>&'K""CT c`/*xUܛFr>*d7D_'f`$Ό c%"Ғk{G)F4b445(!3ԣTh^cڬa'8T1) }}[[ǏDTHƪV]ۮ˓ P$4 ?LȜ8.1!IӺ'CɉHbM|g)m:/*ߴY{vKK{vxXR{9vw^ #>M#s2ˆ]Ck} ' /^U黇38"Mӊri6*ޜuM&g*AHxuRbsY/&뙛h3x"VCCMۢrEOg]NC__ή]e}||q4=?Z6ЭSz3> 4Dݧ3<4{ݭ4Fl@4W@<ڥk_@YLkg>9qoH^UY?Y6s}F9_շgXr1bwSy9^MعN"R2dТeA+Wsq,k{Bk4m7rgt*aLX9"tvo'&m>(%o({ܣK2gyHK볺:CqfWWE:F-g{sn$$Ю|>VDed Cc1]K䌁hWV޹|/UZu漊iE;g_D >/P-&!1E7o֯WWFviAeFU+~?|ll l]JCIr)X}= 劂\zA;ޒywnLD\}Cޡ*H. 㡂J })+@ɢptD6.HWyGP5Uv0R`;\y['kXS9fG+>hPT#Pܩzl܌ IDAT(FTOm(X5QVfr,MMU*qRf1)P445ŚYEGX300`Y6qD455briQBN,xtå 0 q8CaY r(4Dj˪824,kjͩ7Χl\QT}&SA"ŖVBCOq@  qDx*  q8CK2ͩI*6h4`bt$4:|ƈI%Fqj?~Kϥ+/Gr0j2 Ux.#R86khWWz \:q?sq$9)GGxOsvl͵I-z9i`{W q蹔r^eS{9խ׸oKD~Ztqm©V a2"R|vL7r5N2CsF4>n4(yQ!.336oh&܆<xuWk7GGwp¥Þ|jűKN{{rO^b/R6l椭04쥰C\{Å ""uWut+RL[W׻:)^8Ÿa~xCSx""ŝ'$.^".‰^kb{-+bSp<C$}y-lՉyeQf^DDɲ&r""8D,'唷 )q$ah۲Wu}nwX0jhh3Ҡ.+e∲oj ߂VV7lީc_eGSs >YЫd0sምfGDSK}f)QO(ъɚ)/=֬rĒLJխz{kQYui͈7y">ArU|3>1d׾'ImrڂOO-T3 >_~k?U| *uquț H/*#;k$"Rӷqh=kZZeGxXOƥk/Hϩ-aU)cˆ;*~a.,/"ʽUdctwk#ޭ͙|O·O8iWDnˉ4NڳU^KdKW l19QZ7seR*LBbrwqfzuK tZpGcRULk|Ur3\ q'Z*kʥߩ$Rb$(õ#༳r!#Å#P!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8Su1d*@pMQ.-bjElΠo)W@1%b(1U} :B; řO(A!G@`# 0L)nr;wSSS+~u:v+(W\I#-meiff\񫋎~^reX\Z%dMjjj "Ddnn^*#<+%v)# GJ@Iw(VJ{x(q$gP˹)׳"9ϔT'cC| 8%_׳[5g#٧[E) @DDܷd"ja<5q}ӧhT>g{>JDĽ{) m:e~᡼%Ż3qiv񸟸b,}?P(d]}YV^|vvO<<찏C}~˹ #wZ8 Vހ!">fmJG0a5 Rt^;%IgjoT"odz }mY?`.F.d6H F]w _ĤCsVT^(_Yp,qao+kZPk|cDvY57,Kj=gaYNJ M-Q/đԈϊK}ӧ.5߻T񓑑\JDVM4/tmALjO ?p~b25~+N85ΑX]S e5X":(g{Bſ~_4|̺Vȗި[F}jMHmZ5UZƖrk6 [^AW;HV}!bE"S;y:ju8OceΙԮl52o㲴5c4(=ś"RX]FZso{CyAe-}c||͏ v$6\yv~>.k&D$}i 9f}\1lp`U 8~pN =.Լ NivjcCV im'yv]]s߱c{Bף:c9rK`OOO~7t]5"qvOTjA|;x]Hȣ+6&_w288ئX"FұTgNowyWNDDDg>AAǗ|R#qG6 _WGBD=Ll!꨿,BDChPk'ORxBߵ%bl~QCL~&$`UMG3Dp^~:`q}3yb5)I'|N=s#.,1S=]Nkif/ͽ]Y͛:߽Ɏ#u˾Jk1f8<ஶ:,W[{zׯ?Xۻs6FT=w-nUWS1gDlo\ƊKWV5j̛HXOϧLqKr4eܹ& XF|.|,ZZIws3t='"ҨX];Fe޼+t%_K+tXJW[KSť'(s.=XյKf-{ݐs/W;[ğ+gmlt" z2dkFDZjd'QgHtú6 br:`]zTiӤAYQ%jf޸<}b9[df f\/fWh̘X+<|YcaWNiulX^_݊ Lc71jڽc9ѭ`Щ{1K֍K|}W)|Ry@S b4˸4mQx66յ.K}:FQoő/4Oz$?Yf?߭y.HX#q]$b8ˉ#yY8cb3ޟ]ei< y"jn7wZ qdjn|Z){*~ؒ\m!"^+<=ъ+==T^]y7){OpN~;s'E\L\raٝBM/x%".>&>ɖn۳gUMK版ՕHs)RcyE\O6+jblBl# l`&|uK/xV${z]#XeY~8=>6ou+) io6Z9ÚEf?N78zt{C&-7ަ3"&#*s$YQ ÊԴ9Xr-å:`_H$Y#&D|gh,E,IslE+#_0韗bVv^!{Y.o}(|'#m1[~zšAkT9f޼D4c1/P/o:ׯɧS"DbiɎ-grGEPbY޵Mvp򘂺1 s] ^vͺUvV=" XnÒHddb# ]suz'9%c'/49nٗUPĽ(wт_4<@D6o౥f(M򷪹_*q44G7aZkM\Kk.~j+~X|&nPʮu';?w`LX9b>Q霆Sm7j[%k5_?䡜T>~&cydu:.NkvrBswޏ44Lm'Y.dޒS/3DrNc'3P3yΪ=}%5r1wm4Ӣf3[#寕}Z?2mIb#wIDf7tݒn7Nݓ]|eTԩMutdG/ջXOˬ^׶/|z+>1ڤyyA1`˾Ӎ7׫\xIﱗ8.\Vr@ tt-u \#]zA; q@h6o:p&R^+?@'k( @DDjH*fh)WSL&E))ß(R%>ԩDb!(q(&J%9}b\I?Ymff\@__@%=TV:}}}[ @8%=HMMU(455(Jz!|@h8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0 q8C!G@`# 0O#::11ʥ𫋍U.~LBbrw8IxxzZrtut*UIJ?:8G@`# 0 q8SS.~r<"""-=]~i::ڕ+U۠8a^D~i11OëT\~4QZz:@ djjSJO#!ؗ IDAT?q8C!G@`#] \R{>},$U.Dz~k^Ô^T' Qː[vM\&kb]_:)/WȰ5cбX3]7:?57(7o_mY|Kig ?:޼BPdGT$Q{EL߼fFܻgb -TEϏݖ9u]S&2j\XDen3a%ҫ䬴ѴšR.8q@GT{k[J;&8f *V]xsPD +k3bW+u.ʦ+ݎ5$Z^4ńC}o NJ%=&kHrDN.Fl z@&'\3^Ji0>mO;9aX3'=V$n{='N::~v=V*;~/*Mt!3f+F<(&]dh2Tpk>ݾ88.j6k4BӋ@Q|+@\ԺmY$?>Ҋbܼk{޴]/8=^8xp5%,kdӸmg%X}ULHFg8bۉ ǽnE=Ll!꨿v""CԆn 97ʾ Cur@&._kc-߯n֧.p I :tg >h4GD'YIu3/)3'U1o/\R = _f? Yj?'[T繏H]csZ J;O̤Fz! @E]Ų+ke,u")AiHH4Ld21IHed<sν3sgro9f_cAh8>BSh5PyR` s.z;NZ~˺0!Mc:!pQr=8HQ"e% HVw::Rm+%&Y?KBnFtyK[wm<ΫKGnL \{ݽ6/)~ڵ)yygR>ñ蠥.Q?pŭW( J0K>rrw`D4=oe^ώ]6[nLKLNILNI~BofZ U9|X].gvSu20v\N 4-(\ d?m_i=eç&;0ڞ^cǡpL$)>~Us=\/t5;>pǩ3E]BXI3b $e,a&\d#k# Р%#ӧ=G 4 DBK2kSI HXށ~}2~"I1 8Jm9n޶ر5g#26f,ï{h0dM@8!G2i?H.P-HCCOא4HxpX5}hصD{gg\l%GVP2Աs~Ãӣ!kW׀9,?c?A$Gi;30ACM GWX^iG>8Xm1eoUA9o^9` A7T4 Z 2@j%6M^([X yR1b.g; ?\Î[B -MV7!'xg+g{LpG_Ts>_Ķï ?zsY~O"}\˞G{L=%˨Bh[ [c;}G#t M[F%w3T{;^|ܟwu|[Ē/ZoOo^"+֭L?(bZi^n[W<3mZ]i.~诛N3 Mtv$ 槷Vyc$,,|zˍDrOVΣ8~\V[m9 [{7g|qߑ .G;Pr^}M=~CesBMj@3\vN:".ZWyDO9_ p| ^8eɂd f阈@]0 BpB3;w;(¹!&#!r1#!r1#!r1#!r1#!r1#!r1#!r1#!r1#!r1#!r1#!r1#!r1#!r1#!r1#!r1#!r1#!r1#!r1stɧuz-l XH% Qb6$^6ΎP(^>99 X,sSkȞVu~—.g@ڪcZ/p!8UT'cNFRr/ti˖Z2)1y Ȏ&}AbBh/`C8)٢]*B)qɺ}t Y6+* g&9#=}MjQA/ŬKmC]l6[n6lpoÆ ;v2L8em Fajk-+&ga䗰zr~jԔ99Wۭm& ^{q.G~z~1.Ɂ1Fr}0ZSa 8غh ӹZPŴ ;o N=%}-fP:"D˘3gq!YY+#<|E_^1rV%\ȉ~ضv95qSG}•ݏy{/HóDT}. 2b|j7|j`1dbg#Yh#q9뇾bGx-V-Y}Ŧ;_z9@Cz^W}L~iNNΪV--Yv%yw 9o@ž]hmjT3`+u'rrʌW;3nGfN/YP(ΥQ*===,_<ā? LWa%9D{\v-s1rᾬ[?{^7En9.^o0prO~څ_+wm9З+V{zP_~fIvβ|mc׮#lml;=Juݮ[q+Ϳjiœտ}v7q@;i C J&mN<2F> ˮF"%I~?OplU_~co~syy`0-?~?q^O>}#kr<'^N:~/1 0QR͓a[/פn{1hŁOk1;v1Ƃ{\*ΚǏrPH ppӮ1Ń (jaf}84Qs(^.?”$7<6S(9O *޸zΜ s1@ȱ%t#7x|vˤJo/H zGcAMOϞp`dH@3]RwK6&Bh[ݽ6/)~ڵ)yyvJ0K>);߲.LH߬j;|s:ͮ>ݼRwoy0Qց<.3=$g&.HGBRzz$Tyⱆ0 Z"C/"mk}~]theo$4w3]0acib?C\K_jf2Ƒ[ҊIVyc|~w;T_|5Ut=W˝wBR(ge+ΡR)Yߦ-7 b(eTw1 Yb׫6KTs>?>VF&mOv8NʌIq'^g,?~_N`죜g{m冷9f ߷.ZuL^˹6 `] Z $D`r'}(qUٯ㈠27Ou?L7_:QbxcFဢ)]ehXnn۾ۼX8~i9-γ7?;z3==QqWPNrB*'-ޏyX^;soo Ӷҗ=~rxmi @0YrwwWyGSƎ<-P`A Z.ngK6N;9nWUwtz'~1p3MQ!R6(*VNvP7c4EQT6sW\!BFl|ᡐ^frWt^<2}dț^S#¹=s7oAr^~"^O[&Y%ɾ&ȹO$zNg6,ʚg BIϿ[kW6X`շ}-ݣׄGɨc8w(=-չtr{ȟ^NQ e+B j6l0 #"}|ɂd t;%Vh2f`vRШ%zoIB ul `-+=^*Pwvǚ:ށ<F]䑮-jy$Ho+kRY=8>9Z%6\^Z1hx2_MtJ,:Vcd4{XߔXagEIUۀXypBZ$]Wj"@lf3?|9+K*[̄#J rlwj|m{JZ TpQ(^k\ԸY ǏR\m(j$1 ZشqяxGF s7dj+.̝KHbZ7uy#Vu} ʌ )82>efL$ D֢QΖ+86}@poV'I84Lz(|ޒ!ڋe l]U˲dтivc`' /KVLWQZ$S%ݐˡ G}:/?(HF3P}x7cIk!jɢ8K8# .7?\ZɨR2׵PAsa75մ_ 0 EÇ p%DpXM uP8tΜP4e#3WII-[l ly0 4Cmk;΋CT^-hpl%!B>5;zA>-fMԆ𰳻JĖaB,&n.jd(`Z[M^IʎX㌧NS9^'vu NHq,q ڦ^SX%]Tቑ .HPtF Cgu}3EI2rXiK='82C9hy0 4c{Z06+72A/卬x|XVj4 ]-rP"O % VJbdlT) &Uj`+eՕ)ftTʷd ;U]wxX }eJˏX )IhFpO7iAv:}8ƙesc"7m'`/[<'==%sن';}-G?M2f'f,o`kd,^S[]7nufrBLշp@N IDAT f򫯞;W_5G!ty27w<28n097`tgv}{]G"\uz<4040mzӺq'yXj+\\F(w K'&&LVl5tC$ PVܦiGzT#859P@p3c UlI}S1S}GX:ilf,)IbFq )Rlmxaݭ֛J߾aV_9!ХӜE~-ILv}_+l=۟~?Iyg&ܻÃJ96\X-\Yٳ=?z{m֍ܾXN >̻>NBKH\<|ǴKGGR9Ox]W)O.5 ¦;%C'߻;o'WK^Nٜ4Tƫ֮[,r,B!գ#v7feKr5>~ֶ|Hd>{f*agS_R+}xvC|7 8zT!BSţ#LO#u]z!殂gY2y[[5+7\ɦk^7߿aq֜[\ջ햍X);߻sʑ(eϿkzz{-"Ko+]\F(B_BqY\{U%-Wx_BO"6zWdBhzp<Bs$lތY!\Bql!.Gf: "!\b B0 B0 sÍ DerIUr컼F$M[;".//sjH\Y: {8@0UIh*'sok[4KaFē7؇ZKORWEiNt Yi{@lrixaĨ:Ug$WDbbعo 1vՖW6u ,;*)5Xf L_U]]SSW\.bbx֬(R%[q01+ކnbeHlBG1u7@~}Zf:oO=K,6v Z)?&9WD]}1(VZ-0~v ʢANxg)x sD~{E%',mE*{fO㛒L]5%MF%R'$sQ.]#}U`.[ ?7b5X\YgwFMG7)DΡ<"•kڇ¢O}^Ib/ j8mG&/@ SN]Fu2}q!ŏugLq67ʝ0S y ^< 7V(Pʏ6à%dDjRfQ`*ϯ2]%%G4H#DrZ>wItOרTIJ(X6;B!2y~ "%t7fpc[z+k ON?f_NvfTqMmy'ERQ4_|QUƬpL"xxz% Zl6gK%,H*!g+smñc5+AP9sBǎL%#!4;k)JvM;Xp(Y2fuj97OHL8dYn{u!5!^R\rvl=-fMԆ0݂",x>-Q8V2h" zq(ۡ;Й[XO}+Nt3ފmQKsmv`X#/bp6L؀mvkbv iXFPn+mI_q!f J"h6bc*!=%nbzʀG1 hlD(I`j6tmݱK>1!&F͠2yZES@!UR[ңQe3(7h ?E&짝r\t'c(ǖg:ˆr}xּ4b~,87v8֠<;jy︾$lT`>5#33i@ b{(1h@}v@f Tp{L45}8!Ōۊ}E]#I+|uvwTݮ0FuuCf桁a c6[9C12MBR Lz>i_kU6U!Җ[ZM9A!4蛋sR=9%u/)X"(bR.ȎOc-/;BX"EHZZboۛM,f"qefіX#!ctȩ8B32bsln`)l[ [?;އUvl޻V/LXJtvZSL ^BePx:\0wq``4--f$(.muCzBxnc5GOtޞz<*+=Xhl./R<Lr&V?}㱃E\v)ޑQ?ܽ<#qZJƧ@&>; |!>'HPfL)pn1U0 Ќ$ ixp6KGGJ Nz?xԈ}!3@LmEOV m]N en<>l3[Os (w"KR;}"FJRFeDjRfQ`*ϯ2]%%G4H#&b7pxc75մ_+_THsa~ -4oY΢ܝ%Yq^ رn (q9?3*8B3?Э,tKZJHTFkF;[A|E,2ď4$!\F9EݬeK) Dc%dKVޮmkii3el =$@^ߦ6k3NS9^ -{K,6#+bAJuImY*-f%"Ģi+?y$ ;R:8(iXFPn+mIL:0 D|um.Y`ҌVڇkk,@QI˸Ёff3Jż SwL_yz/hdImڿ J3F?{t M6:Pa(2xX }eF+đӢ˽%yi~|xW0+eo{)B:r 2GSVql3l{Aя;(0̘}xRTd;P_W8 Np+tW؜>Dp@Wa"ELZxYy*;ħE)ZK f >΋xitOEF;͗g$':r6j@3\vN:"BhY[iVd ',B'N$';^Is,B!._,kB2@++ /8:B!8B!8B!8B!8B!8B!8B!8B!۠!B?aNu2MObr4=MGBѩ"n/犩1M!tY,heDfŹt`A!aA!aA!aA!f"FhK]B!4h4򊊋$!̢hjjkbc6*2R.;7^8:B , r<*2c$GBO̭'r7s9"$d BDƶN"*<))HB98@lz J0`/2Sߘ` ڋ4i1 WtvܩG"OINfXc+B!9H&-Hw&Vc @A <}g KC[eq>~Ĥ>%Hfjվɾ\koc &{eX\>Yp!A!*Dw0,S(e%f‘F%J?3/2T{`o 'ac{9ͪ%C|_{z(BSf)LRn.[ ?7Dܕ_:]KE74DP\eRa@cs;.{qikGBhf!n8 ÑEcx,YuŊ _}~FP}=]VHg@T@s:o+Wԗ4hkJ&,2OaK]{C¹g({*pȑm:ƹ̆q!f|Wt[{~;% V:;iwWG6mFR(ǭZJd{)ipJj7~@Ce۬OLFDRqPkj"P tAd&^ 0} 6d4[ rvpod̟(2IOV~)UiqupNK/1 r܄ZqDž~eGBhf Qř6mx`q`ހyKΉB) y(9|``8LNV~vuCnAA^pJjJ?.tAg,!Sř~v}5"穚8YB3 % ?^ө1Bd=^]cc hM*Zw%(J?=(W*&ZˑS5ݗ;>;{^̹*/qNR9rN- єP,4 nn?UT4E4ͩ"}|F8:B3+1;hl'4'*|y,9Iev鬄)R>PR'mE(@TZ^\5]:Y$QrKFzQCS㰜_؋{y^!ҚREL6,+"<ܻͅ#Ԁfй**JOKu.E!.Mͭ~>Υ&{Qg: udAJrsBh{Wdi5!H$,GBH.:~ps#!Lt\;B!8B!8B!8B .K/k::N\ʊB o/Z78rΥSB!3hr.EA!aA!aA!aA!aA!aA!aA!}Gf' BJOKu.GfH!B 'kB!bGB!bGB!bGB!b'IDATGB!bGB!bGB!bGB!bGB!b3$0M?~2,7?>fL)w!%anoßyy ;/ )m벝9GqA7Vve/|"ҲYέ&f:uKyQd7^"}[n #]uB68t]kfe,&s[,=4Z>Y( ޗ_U ;o~+2-{As)0]q~䣣v>nÆ_>Ӳ?q|Y7|.VpJS! !-K7wn9Ayjo}֗w+wYJ{C,S;l[G//?i74M{)@{'Ē=Jتrs[cuvJ,e6Z=KPwoAͲYm~ԶW*lh뮌R@z Sx)ɝgl.fyzogLD-죂ޭdX7ͽ~@qd!~]';xG>?]mdW.1nsnXX |l 9V,|=^f$uGB } m9DŽH 6>4˃0|ρ!Rb[ ek4 \'Y0}%?|忋@Yo lW/)4q訥 _߻΄\KɮaW\8B{/ß" ^q7x(Crk㳌'{iWUlak;YK<&oɨ 0!ﴥ~o,MPj{_cWڦ>6Ff+~lGB;gtm姩h7ksⴳ!;fu@h||0VPIӔgՃ+'^ @~_ Y>bt!@_结gW[r¤x]0ǩ1qس- ]IIE{{ < F:`46Or33T ͞-Yĉ}pRepڍa mWsŝ^Q2nX!s2>o_7W c!`q6R19r~m7l }%`a&X+?zٝ7bg??n^l) 7a3EG?)VιdB|2ME&MsV&ރ; WYxWt3|\6kΒPBq(8701 UZ;||y|]2|-i#9dEZ.ο[J̳:M;'vxrY'o$&D=+k#sg~ 3wj7^ň6ØzGbB+*=ΣĐUkz=ꢐd^Fyi*bkW^]} rWl-ͥ&mk~yZ@.k!ؠS:GrsK(yGh!Y_o Զ6Shڼ7{ ! nv9+j̜#:^_}M_ߒf#1gS=VVX`utZNIr>UE:('`u,9uv~tz(.zܬsNޘV㯲`B33Fg Sɟ&Ȇ>iЬ~_=􋩋S7K ɿtlLΎ- E<]0t%Steڎ_#6pA v@aVyjWcM-Ӵ3?^zh4bz}LxrՁySpӯxv֎%Gk1};G0D^[dD2=Gbn(Z, rkʮ5WL:9wD!5\رqӦ%I$WL4kU T9<G@=LhpyZ?z˰Q>GW=D ?IK)>U%+.]ǭ[gr515iku֭zZl5BNuXKY3/8oT*]hH,U㊯opNض` ׊5+I۵hm(nڊgh<ǟM)4>!^*nXk׮=kV'+L瓥'&˺[tFR{Y0 zӽٳ7!#*M"IC.ZrXCwW n'-ƇLʮY!!"{p$t9/[PqʆoUdׯ_bYvʤɉII yʯ%GN֬B2e-4TLɵ3| ?$^hϑ#,;^BKį3sacC<!23aEX/wwϱ6{ZTvh~#GzzMYU W.3c?ٝZ'G@HR48dHYRvZ 5 ;7*U>1|qu 0~,4dpp 8;;H33^̮O~*k7o;r45{K?d*Up2pgrqO/ ;k{ )-kgtD{B+~;'vwepS>#RNkvzYԉg!TfM>čE߯;t74;w>QKT $D_`edH$RÕQCcw-Ȑ[S ʤrH v{D°*nӟ0g5x Kk|Y0ޥ JTow,tIsfba9|+x.T\?yAt4vlo\{?ii6k"J/bpkMFdRJ!c'5Fې69OLHJs(@=j?Y[9A[6oԱcEtApIxX˲*O3yU*d U1۩%&qNGR [.f~22ЕNK H7빖"/+L8i>52Ԭ9JؤMQ~aUUocޘR)y+M]?ifB!T.-WT}muQJ clZseX**x';k*Ⱦ2&Zg,rU\-QZo&?1,]vhs3T>ع iǺJynSPcC Kg~ǖ=to6>^{sq.8;92tidĊ=1{|}|QCRbB N:;׈ZWACJJ YB CjCX- nŰz(34>PbX%i`FcX5xp;k֬3fXE!龢=.WɊoE|0ۺޭw \f\xUlGİw[NΑ+>[p)+j^khN+"\Q#WM\ݺV7MY;nr98=GU<'I7|~Y,*$e+0ufcuԥd-Ѽl[U{4ݴrs?Ηkwptv޺5N%vE뤰On\o{O<,l9AsL򷷷gX6###&&c0Ё4l¥[^1:i[;q=4d^DJNj;Aa;NX.䷼P5.dhXHTn/oH.h(G %J)c624,z˒_JYQDvu4L~A!gϺ-ŋwޮ];A)MLJL:~<33ҥKgo//oOUVG0a|}|}}|6вV؍&SMomK @=# 0PO+ܛPq*G^PPnAX{KV1< qPNNSss @ 왁>ZuT++0ΝR@ eŶ~Cw֍&S:#⒒~jӦhkFnc5e!G@`# 0 q8C?dR8>IENDB`kraft-1.2.2/manual/images/de/catalog_standard_work.png000066400000000000000000002476001467704360200230210ustar00rootroot00000000000000PNG  IHDRPm_qE pHYs+ IDATx^wxU?3IU"JAb* (6Q@A׆O(b H{ i$$-&8g=;3AAAAAAAAAAAAAAAAAAAA@S B"- T&j*IGPA8U$GHA82 PNhuzA*9aD,(UsATa~hWA5G!xHUu UuAA8TȩT Ǫ(AXNer5PY[Y He 7K!T~BIu<'ARF)TT*B9@ JuU}>:^sRU} Ti+ &i(=FEW 5W*lGA8p`"VmPݒsEΧ"mU+8."TqA*q 4.*WEچl+rik_?XI0 D0"X1R~*6$T$^s(o;+僊A*'6* Qv!h'غObSmj. VājW`o38_>+/غ?4Tv`blTڃ#x(_A)ORlI09U|#`bm0k$vb9Ʃl)ƩlnA"I_['I88884 Lh%ZԺiwjkίTT]A81q_j9Ͳ](kkTEEe&@.oQVL]]h3ֽZ6qjݎP ՗@{ybD~W_mUbղ]݉PEe&@$95|5^؜Viv6po Pܝ|vv; ;5κW']Z;H\ 1AS 8>g'PԺng3Sv@(OAP䮶q"j؋;ͲZ۫e@Ժ HH  j 킩@ljJ>ANdBݮ71[ u;֝$.H'LL8ޮծƨ}>Z6qj=*VA=Ij['Ɓ_ݛfڬXv1vvuoEmv*&`Bh/ؘ@ֺޮ?-;5ΦMԾ65֊} BW"w9^x}Zw2,uuoU7Q+;S XPEuogS}&ŦX5F[[-KA|/IyOPU I6s5}vmkߌS&j I 7v/ nw*[pRcL|o8ٝ6FA('3Ƭ{D=jT0N3v6nR6QEQ>ҷ>fkM#xAj6yj|ċ籔UAYg)[&y8|+Ɨ/(Bl}eZV۫vUek{U>iWmv{f-{lUA_V`/,ԽjSv> կ%6v>_eT×ߗ/(Bh_ZWP">վY8ٜA_ۗŃZƩ[6kΦSVSZMT߉D_~'`'*u^-ug+KfA[Vv{+N>uADMNue}I٬ nbv5gݛٝ*|^yS;U\bź6( )h2VLgUf-u;>`bA}" nb~δqfCYsi3c1MĘ8g5*Nv_X..Xq8,6j{ !xz3}jvu(+ά>'ZW_A v~M~eWw[rpScڛm6lb6l0U| U>ծp3cl]=iWV6*NvAz UxXP:dR!;d5eyI%fbJ<s_m`׏͊/N$QTV(ң1oBRa憡B󾸎+ p6A8Q93g(t}a緳*Tʋ]?v6Ue'U ApeoQQw`RFfFέV  ^;[P)x1bnobAvefO:5#yox>hEvAAJЀQ;:teq5f=Wqł:vuYf.ƺIHHJx֍5& BY44mǶNKyV#^sfe*2E[~7sN8h3qZݶS! BYjE~̯jε+ĩZW}"«XѺwnY}x2t,v[dIE]YxK•SȨh  蠅y͵<3SU`1򵯐CuS vkUL +͑\ܱ{8 "4=h٬], % PPr[ʆg&PUXf_VoşRR 8 ;9о|ֲy-feki}a~>;itI&Dђ2ۮ ‰asNּLN6k_*v6pW ^ lPz0ՁWĩXn&:Cm_Gq#uSY0+HRLA;\$ZXS"(kݴh|lOB-|n[mjc9 )[\ZSۍk 3p#=KvR.`dVy 꺾W: B)zG3PjҊljnۙqj_k;^i*Qf)Z7Vd G/*1ezRՑhF4Qe syK Z[WX-#';t N+^MrSpmoW?/ڎC5sf@׽o/? {5u'33޾jjתsg^!UAzLy1ޝ1;R'͛5V-Us1jIfM53WV@f] `bC.TTnUnk )Wfm2cv6GC}gRXT\ P炭Խx u/FV>1l'˅ixm3x ޝ1~ ?h$NjH5WW:w^$"RkԯW=Pt]/*BӴR[s'/&E><5WyQNXœl]Xe(ż>aحpZVjhPrtjZ0ڷ9Լף;l}-qWw`SДO9-صF sm+SϽToPm@~A=uk3(gޘ8}xxlOysF&="ƌ,g1aHya*!GE 'k55invvS&NR@A.J\J0qv\b HWb5f┖͹>>f{n,[5WfMO⏿6Ȑ[ni cyw9it]_qQg0YqzwLvm߯3ޙǢ%Ѳ xPZ:gauxoqwSNiI9rw?oܻ=aђ ;kz"!>[kٻo?k˫oΡw_s} {fİ4o֔4Ao;P#)CpZV_g_Uc>gxW2&ܔar)w/c_j:&Eux4&>k8 sd ^1|4JriڒY]D4/ޜi`9}о-:jml۾TV-3֛[v9|vmNn]x7iѯNӓ3d`j$%mv>XHJ⎡9u+/hP.z 6 ,<5k3enقvs]߫uo\z\ۧj 5#zp(-gf?0J4~YcFQv-brq8Y\:.]oC~~~y9[/Wm %7\ۛC?EAAབ]jn-YƨC8)DFFkn<x(Nj܈€?F6xrޜ9"ùi݊;njgȝiҨ7S|>s۶`=yDerѣ[ybkQ_1|xnz* ygٱk7N;G?w?e s_՛S^f=lWڷ=bhvuV-Gk>;ݻtF}v>SَW|_|?pK.<)ɤgd{>Z@h԰ypٷ%V#/<{ԭ]_ioU3Svs$7|^4mJ= >lrsJ SqL=ğoqBa<}.C,-*aLg} cF2YEڪeqj?qlW&cO?Tu=Xݚ5gŬ۽ S['{*ԋLcYZەMqYʺR.<d|\np7zD!<У qExpC^F^HU?o{^p=wϿb ܧwP IDATLbcb!3+ :ka[^J${*06ͤ73\(潭cDioO`s >#N%S1v̑MmjРkٿzNj i,[s rѴIcʬe+8Gw5itܑ&K~2~ ΥUhFDD-7Cik.+^.]y#1!]{ 眍Rܳw[m_+uؘⶻvM[tƠikդv1&VqÆ<a..f'5!:: U!0Zju"ҜEr$j$%gnb_j0խ㽽h;{׆ DGG3~x X&lܨa3FK~[A sKO.IU믹vc.v?nfDiujעvDFF_o0 ԮE6=rmo11\ӻxZw1J|oY٤gd2^`䦪Iy+DFFrN#+0M7"|a0Y'>:K'3,ϜO ''32F۷{<>Y 6Ţ%kYs@jתE~A>_?ᧅy;?J:&+VfƜg_}QÙ$o~ ;'0͌wCIKOg}|Jeٴe+l南#""忯f;뱛ou>G9?0*sFf>ƌqnޜ5KzϋpgaByL_/RC TZ*uU̥%߮ho-K&,> qN~9}+GMkM U!eV.[Tq8MGL944v9c^=cgV`3b5 4M/>oޥ>݊⍒x뷳h.xŇ[Xy\)4nYWiL9wy8C; ǫ.AB.gyr (fXcYVZGkd7('LQdW*6qx!k̲/S0p_iׯv60p;xc8:7_@hTvEZz J&p1)d GͻFQlcifW;TrRNv;9 ցnĴ[EEus*TH#um,I H<+nق1#n'.6#y\sSA6.*JOM5?6+P&f;'N SJ:ֺ:jW;lin]q2-rЏ$}Kཉ%fAꆆ79ؠ/.w*tvevNU (;ԅjWZLLݪ*BNDxFap'IAe9J$rqVS]&uW -(8lׇ::v>l!%,,xZvhaw pLc*{k5DQ7fيjw*;a_\o ;Lf6j$-IA8>_6'BU (;|]u0 8%jFA˧\k՜oƩXG(b}acgQcTlUV  cSlj~nX&ֺSΦCT8_uATmv{e6 \j~]͵v9nh 비~"D%vJֽ0oƴ" WCE3͡/[s ziw֝6T ցsDjNY.P.' ENK9ίܭƪ,Nv(PE]ŹWvI j.+e{l?LUQ.ZkYXoIA|̭VYV_bg e _v4J$A!xtJ?@h6QV;j0cMUɂ  5˨gֽZkBe @p@u սIYv} 5e8էUUFU (B}՝ֺWmv}I_AP)wUbr J(;ֽu3QV' Bph]v[Q֫)np YV, B9T}X-[mVq*vjEuPꀩ|ͲMAQfb٫6~TjewM:,M  WnUsZ{[jŨ6nob|i ‰ݭ;\TղծަHLTgjͲ]?  `>Y-S'fNAXf;T|Rrn\;MjվAA+Lbg;jTRvqԺd4>AA ܪ_ծ!p9PGuA5Bş2TiSv A!p|`n+U]%иL \>AA vBG0Fe `)ΩkTA|yUͱL8U|TQrzaSI]X?mF"+sTj%^/Ca.N R_PWX ԬUMqOպ_*:f%5b71Īz0CFco29; |$ R),( P*jRqOܪ}+Z'[xV| w:* O`UnrbrT TI8˭.O|&BT T(/̩/nҐvtx('+W"T T wB`G}\;A WZ@A/o7y`o):. D?>GA>ǖ7TxWQ| ϴ~sBU  Kr|ǒ 4Abʳ|$GS@w0mO r]%8+!h (^| /ƗOAg|PqBFuP% 4NA 4WNh@S Y< 9 9{Fz^~tl{;ϗ5dd,ʽ|ǞBg%1x-M|}\wn<;^bG! ͫ9Q!: PwT]=揼aot|\ns\g>kz?@jqC<spl/]-w\I޷jݦ? W3[8hm8!-).fϪl mNq+FŚ#1:N^[|cPqU}9I걡2Q8 4 `*'u:dֿ=m[uS {91?lֆyUhqp৷v >hD6Kvihdt |0k QOekx}4^ ?ExJ+:V\7;q\0P:XpKj~YMY4dU@h14Б z^̽' PN!;Ҳ?iבXM~m7'Ӊ'm- _6 WAK{yЂX=ޏC='ߟn@Vэo(7KK;C&<%=.i̿eћhIy6RQ6@ZWe OXj&3c?Գ.KYX_>>t],>v?=OV+SNwM^C 2ֽsSx[qը{ڭ6zz^>2~2nrMe$\p?3ϯ<ԯPFT͖ _3'0׻Uu#xiӞI d]W"VósCڏ8&es+t5z&Un KkwoOֿͣrst-ԯ=j7={ӿpZwIv%(kS:9x}@ ?s!`?r?߈K|7<9a># pd$|+Sq14]40&m$'v#³|O/l:E&1- ׿˩Aᾟ~pzd5$f}چvRC=hp!8K]Kabxoƍ.tcp~%ؓu[h ]tW'c?O˨b]w1r,+Lhs3WL E ) 鐹K@hdY_5ϡיsҎ7aDSv$;W.bՎ,<4iLgݥߋctr켮4޹=ۛ&}IDUŵG{b~;GZHӚS3: Wx m40#ld t18I,aa1h}eD' ˱|$U1ߏ?4́>\ ڵ._/]MuY"7!VdYQ%JI!"#ˀ@ND2K E/>h,l '+M_#"18͍x2HyEFA.mr~g!# {4"ƧВNQ:7"^Uz5\EbR#F ITr7dXyEW`pߵdx̜ofAv9⼷<+;q=H fѾ,TIaї9 kZM|/{F 6 ԰\r~=&wCpor6O5;V42320RHWNLJ2Q34i}|̋:}qYRFҏ%F/5tO -r= hH(>K_ 1ڣsf,eu)\w8[ܩg߱j[:'km,1:z 1kQ9e xP9hh=+DϦcsCtم_`YmgPh4 $6 Dx=i@s844 Q7;z0r-L o+Zly;J%&@Btmt>9 Prx)Ko-3q,EyHPǝvD#4kѾ7o?ߗ:.U.tz1Ily AW181F#<ߜktKbĕLrrm.iYU]N(Р_RL9'qgl8:ZxZC.w05?{3xDta! $'-I4N?/esxշI|l=h#ip=<|UR蚮cp|"N>a/hUCҶgT~ ke$C)[Z/ ,1xW#,ji O*h;9nq11Vtk>Z~z7ZDzu&[*#oS.>oDՄFḴ#lm ;nt ?%zto/?]| ]JW O\աn Қ,^3&¿l29dx]=.s IDATV¥e|]#>)+ #vec.j6eh 1{|Kh<ΈXƥӌ9>X1akZYő}&r E!+Hcɬl87+xudӮœ\7ˁy,ڦg灂u|ّlIf!Xj7i@xXSپ#00HZՉ#Ӷl ]Gsgo>'}]CUjYjyyRw:(uCsL754%9…o-y s vf)@sjƜٱ)ۼ\}y2=oA³եciದ"M/g/]=ibibzn%c;tvGGCKCKS'r%.'[Рh%΋NKgv<.|wzmfQvu@\ʡq7޳uտI/ݐLr;oD)P{y4]~.Y"ƪywvfąiyu~|6sWMzlkSN烖ע Gd3;; wD-N96n>aZ&` Cko{⢫N浙5 W3]}>d~j.Fx NaSNni{'^39>|!2!]N?:a1x}z1ݷ#xhر ` Oʏs@/.4hAn*nSe[a@VY˦? 䋏~BٰaF 4MWV R?xWէ86< ͼ<M0 M7WJd;1ߵ4/}|s,qFG$14 ^b1Hмjxn)t\޺ُVOXT)߆KDFFfb3Zq:x jE}(> 7WT.z{X(}Qt~1ρ_ea'oS{suE0 72G_9`߾Qϣl{zJUX^[dzk/PG.s/w$0aly1}⯂u?E]ɽGpqt!6f+]3.S76fx5q5^5JaYP̖.I$Iٚጱvs-ou(vkfG—vs-;}Ď<ˆw#IS,籖3:vTcpl:7qwXyhcAI׉1pg چώ&˟BT6 ^kېmGdOa}ijժO]?zayIWrlѤ}#ϼ܌uN7y+~?[S:_o}c[&j獒.}w ./ 6"ٛTp6N0erLM3'Cӗt-fL< a\f ?Ok`ëJWy>yOpnN}tN1w˯Iَi2ϐc0nĔ (fȍF3h}j ̬(;nr3\?O򍨏@du7ʥDh?Ӹnr4"ch"ǣ[nfL8M)K!j5)h8b.%˿PW5ݺ[JeEq#mR>g Ί9KU|^y]p d)2M (׬1Cvr86~yhBw\H((!PUA2'ew!ڋMӰeƬ#OAz.ͿB_Q: ̍yLWX\wtmL0e3W;X FݮiԤ%@87-yp~t$isZ- 5=^$Ey2`AtnٔMJ]=L6 jjNϵysKss+n3s*C tБsNh'nt_Z5 &]?>ZuX =ZƦ߿kIJ>k^&A#wHnXoNmymV~?Ot"q=FB&!ZШi+:;ehMVMx9fى|F;^i&+nѓw{ǥM3[ ^ߐ&fN)\<ZӤq3: 0sv{otuk&пC 0x6ZM dIRxdZݙܖ?e߈!NN8;;Es8V]Fo-e^c9C>GfmY:׻ypwxeR9ڲck‘h,;D.3ul:~Kרvs7`кu@֡Mo-z^7i)vi ѩx}H1Ebi4|{BypcC;ws$\gp`~r+'¨Zo>_:w:5^h_t 'g&5H!H4_ME`Wu:ouiE/cd~e(ݜfΰ+4*|yJc:iڤ)McғDtzN/I4vMOڍmLܓ6-iبGb%QwܐMLhǠ Qm hL8x{`-? X.dCZGWyN~P 1E#/Հ 0(O:0|9,a4ߝþO&bBvna= FKEfu[aH {Oc=x {th|i';WK 6[x>?*bر} ɂt_1bQ8&aՌxW[ktKWBf#Ӯ ~nzV X7Sٲ9<[x.X2M;Qxk+dvx?.Srj7f.t4o|KȎM|?$?WؖX+0s75d6] j¨5v ahRr9H:A &Įq aғUɫC ]v2}9].C`c^uTw|<%ut-Ӌfs0Vl`oNtl+ÐO᠎7MtW o){5k ٱ{}5 eGrv6-1AʪpfgZ#߽Qg2v zr{3:Gv|?2ZtwOgOiڶ"WsP`bG)OK5j7 D7d]ջz+'ejSmŒ:qN%A>ѹ-i3h> nlcgCO5ڕF=hYh95?|rt>GW2r!S֠Pi ]Ş;&t6{v\\ _vs*;4.J|yK\ܶ':Z7KSZAP*S+QI#xzvEs!D. 7KےK=-өZҵPi(1um:r\lH;'+ 9r{zFC1C9[B,4Ó:s|$Rr >2ubc%ji|1Q$^Y[X.-:񂲏qYb =ӭ-gUkn(^TL$yy-2a '2 s^m뼤x1)x=Cg>⃯j'oP^BUQ0Q1y-@_Cxz cM܏|/:p:z|1P%|kn0lHߴۦtlg\Y~զ(.f'3>f\a| 2q_[Iɾ?j jr$RJ'eSvY>Gd+7_+ ys<$T@9gH}˗ڬ7k)Җ-sK}E7Zl4=5?vN(Rq=&&H`e8zk<9T`|!Zv@x%O-_^ȏ{oЭA(;LFy1(yg^or̓[L$&@WBNƑ)*z]sI( yS7]#&H@Հ _}-SC"";8[94TuR#Dl5 Wꔍ]ͮoRfnW`^aV!@76fx5n -OEn Fܣ8 v03yM&zS\lLxR\(n`PT6ʦH>X3&BAU,] Vy۶L<}`i1QĦGy26EvR} 'k^&K!*" g! gV';:NaˑZh)-uGtHO޶/}cm:d ̬sM\]6G1c(n.X]7b0>a `KS&xWjI +ĒÇx^ڼL.quLIAufjNeڰP/VpxDGuX IDATƠc[+%.b%dwP$ Hך}HyG)hё<>*Т;H#BUB@W(&OncJKj7{n*ROSeA E֍bT[Wntxx{w7:hcZ8*HA(y ?2^I@=SDž92Rӈ׷D$:$`>җqx26E3w}uz:m_KшέO_i`Lvyڝ-L'HuwdIN6Y }sPoO+kDT %Qc.=D$y)1x}[^%_u]dOWT Nά+%]FzwL[SES? VF GWy_p\T} Q;V4 ?+6clXew$t@$擮뵠v6툠^z/|뷡vfExj֐"}cMd HeTu'0y|[/Yf.jmL{ F@O寋7yvo/cLrL@eCf0b)#g8OLlm)ܩW|;[9ޓ"3Pztk@`mZ&L1Z1CxRf;jT4p͒Yo-`,GsD÷RrũcSb/bQY۾Y[Ul 6֗8L,/t`3eބ98s,5W{CRLh(恞Lh& ׌t]C!07_蚆ft:U0"m}3!P tͶ_Mnr4IGQsy씞>6H}θn)0wilDG3m1/_65̋IW!l> 2|;3=ؗ[˼۝<-'l'8<&Oȟ񘤗XIe`/6oBVB淤Fjm7ooڶACGAMmxzkz<|?fVu\IWBAAK%y7W%ڕueoMH_ œmsiVb`MLII17 HN۾k6&˴m,/3yYNۧY=t-w51韘(2'xr-B(oM+vM ʄ/,28V7vqcpp&ݎday'oob (c3=2|;3=dV;1yZ:ON0]g<&=-Tv;tͤm82^{Gi+u8ڑenS닣2of.c[8*/ ۚ5ZeFxStܔd^WJҶ*HP9f2~ͣ5/ZgD#Irl ތ%ESp (G_._PB QW]#11ʕ+?NKd>')\v+W*T6v/R%K.g&6͜L%ݍ|yr5 򎌈+b$N*Y3g΀ %.Mi&[$IJD?C~JJ ..)'svvݯ٘ $I$IHP$I$IY$(I$I,$I$IRJ$I$)d%I$IE2$I7np ْJz6YԿӏ%etnIk 3fI4Z6&y)Mf%)ǓD:#S%#P\x/M6N:L-BoRƙ'1e[:❿45v ?04&"E[8q=DՋo(ZRHcpṕnj8%ݕ=2w׏@38 <-w{w8j~ Җ% 7ͧGj1O)FuSnEPA,GdƁ<8ч߸Pcw \ƫҗUoڹ.l 5 uر(7b5z`EL: >eӶP̭̏u~sѻ%͜_z5_S$p/EaSx;dR^3]#5|Qfq8 ҵ|/ʼOh&=~jNozV݃_qL:YZ> gCLXOR.jV1Qn+LX%c=IB~fŸx*֎$2yM[zE~Oi+ٺ'fDZz:.uR,cd#B~\ !ȴPkoL[J [?GǗȧZ62qo1K}8qSN7p_n R(BQ1l?I׺L'oTe‚^4x>6FN(lqZzQ{ ڷBġ\5Z[Sg&T/b 7-3;,w /{:u ͏Eq R 6[pő ܥY0N*N[ΉϰO:1^Mβ;VOXaQn;9eQ*L7&ñ{`i|JӮw RFQ=DXs<;Ssb0xR66fQ v:KX"e()<E@ ,8>KU&OdidJ}麎iyӘL:Υz1/Wq%.I׺/_ مc(RY'ƒhP%.QDD?aS)͉ttzV>>&ew"rnrHIZ Q(QYxm3*]KkM~# j 2$ Ub/do?o#QpsXzÓPxt;C';;43-])X'?4c"Ǟ|OUs:~냿z(!`S||,Ien ??״c'fB=>۟+β {oN̹,ɤ8sp._Euˋ)7.N :&,M'0@>gJACCs|keju,Tf %X o8GLjJVu1?ћ?*߬{Fnt7NڱdfGm.BQQL1/|7kx7iMOYjyh\-vi^>M8_Gdq^Y qmL(m65@\u>L>ܣ@ǜK p\!=ҞoO%(=̬Y2^EǏc2tuVT3~Lȳ /ʾ|b=H×s/ʘy]FyYRمCMGJ.I/kJDbWP+`"!6X1<*<؝V[*wr3rc7F,m3Z~Kj$UsO T8bg#ѵ$"Eͷ@~\nƅG::ae|_!/]ª$t7 -7NKLgJɱ$xSlTcA% RU<-[Bods0i MDN,]Ex)}:[-efB@$ÏXQ2Y+sy(T>Wc\<'ע=͘ϭ&FULFŨnɬ]hCyez3_O ʹG:v]JITl|"ߟEG?=&4I2-P9J֐}Ȕ7^EQ4>\slǭ8ςT5I.߈{7_ ;k2zXz~IjJvT3Y0iZrwLӛBٲLV?9r+ 8e!R3 gh؀wz4\5>oV'T*KOs (Ƽ*XVee# t_g ^^נ&7@>Rvs.y߼Oek 6@Utiq3_̄ˬ~Zx0CʸLӏU|K5o[-n_Fi]H>Œ-Rrf%\L{) _o˷y;3D~%( c 1ek,3(ʿ.\({$].y̯up;G'XGZkIZ"|O+NUJk+i2ؕ9ʗ<|/٥8x/b3mf`yپØ)&ܷgQZ&gq)T}Ve1cg .]KeϖHe[rm9p z=1u%J'=aEKh[#f5}?ˡC jd?t]TR>_1}3 byo}oMlMi#{fZ̳v$ؿ77/f|YNۧY=td br+ ݬ}J=KRQX1YF(dS/Pc@I/NaowxdQ\PGlo3Tu $=/2^,j)N6B([0$I$ d%pgK$IҿH>K$I$e $I$IHP$I$IY$(I}WISprr-ery6i?Kz|-e,+ᑛׯSDIM8INNڵkxzZW*+R I2mY.\;aaۯ$'%'0t₷O @ec$I*///xyzb2_/Cxxxi$e2$Iz !>ID.I$IE2$I$I"@I$I$e $I$IHP/D~܎_'%5cV??sޞ$2|Vs|ٮ9z'I r =Ub*W:4hןwcÅrcP">l4݄ eS{D=OATߊ~r1DzZTҞY'e(u*WgH(Gr.W1gz M{ k@9I_ϺjSeL(?M>s=Q?;Ir39 *%F5>΅PV͛BߓvA?ʹ |+4!Q;Gz4Nvk.)-gyBMK.;6_$7I֛t Ŀ@i-s+1+ZR 9S^rM;^)`@3.Pm0_ʔi\vȈHRRRsG3qrr?ҥJ(#;T#ɗ;0j~;Z1Ƿd־[ganWߢ~e[f̺ԊSz3Oe ٰU1Sޮ" wx,(ٰ#u;6=(4qv:UoxnD9r7]ph"IZlFNŚ-}4]a4-֏1|qukC(}~!g(@ػ9yQ033)?/ IDAT\v+WR2R6'BzצymNk&L4-'AKٻ+d<0LJ/&zwM_FLlvP<%I;0U2Τs~Bf\>\xLV%xSbcQuP@(9x0s^X&"h[XRyZSmw%pxm2:;:k&t7wgq bna5qf͘Ī]X50ؖJ-Rsx RNS4z?B阮TrUTpE'c賈g[7ct{fNnöQuo WW=;_LSؾwk>CȨ lk_"'zNxq'ȈHJ/ BىR%K!'jv% o?/RDÙظ n'to@LEҋj. n\&̨ckۯUw38DÛϳ5$3N%ұr9-I>ħSf=fIiO!uDM0ni<'CPPUUnf/}@=*LW4BFeB-MN=)g9p* ~#Jh'NQU v @ ԫYZߓr$,:_rܽ6_3Ӱ"BOx:[+2?yTkPȗ4<],JIGx/#H=dHNP(8w@!OxdJ$= r8=[C2(4p=q'ZXs?ֱFj{Ǘzv2盇70mX'P'ى@QUPsbk7\J㿓ԽNq_1P/]?³|pM ĿB-o+l5?xM䧏SH57)cã(6fv)(D@BzWDrET@ *( +REN:$dg?v7l6 >u핝ydwʛ`9:0RWY#6+L+Βu o+դL{]M4$F'q,D6/1-g3L8 f4Ȇ{/Lb[hZ"vѷKQ8""ˮ{n8|>Nn|{op:zݻ*qFUrYw] ږݧ3LDb[.,L~eyk%,~{!Ȑdl,|-ܽƲ|.(6LLjYo[) w]237YBOOږ :'ʸ3mLw{xNvr_gV/wCO""ƏG…ϨV:6mfRvʃu{3?γdr^m}~"uC3ܧ)_KȿתU?PZU"YrEz8zxo_~N/2C_}  rE!!29_0[{&4eތ_}|2{iݼ 4 _kYhci״u桡ٕ--P2M02e2^x '{ѿ_? yǻw ~#;Y4'rRi`Y(=Ofag#V>:SfcT>zks|>8ИggױD[F|9߽C)S6XyWìG4 CtڑW{'_:c6G ~؛~ȀpCx9+VޛOg-bY3w?y IJD_nDGGcwyq@BGiSsӤ񵩝p?oŐׄ+_0!U[Q?'m8 $*& f‘C[.0rГ )/9=5ai־"Fⴸjsl,Ԛ&pZFnd3~Bگ̙wZ]:S.8ZU&q2y:wϽ eBPtea P2m8J+>wi B00e zr|7%&rn$sْEj2IJ&cO9LIw8yS1 w 8G~WX9ȹ??[ɞm\)&9MH$JБ܆JυF(/A{DD7o¶m5M͛^%BZwYâKx8[6D!²ϴ1}Ǭ]Gs,$`wC;0yt;"3-E.Vr#"-_*ڜ0ۦFivx'trŋѪeK,+D~6MfqJtהjŻ8a;7>{S0 eb?~ck8bc'mKcP>$vswXg9&e#2 =G\`r4mLdllNGd>Zwk?dаYpu`1o\#T%"/TX1ΝaesΡ`__F"nFǗy#^$%xfhi E6X^(4Ԧe;??2Yؔݧ-aEu Co͟qq揵δ'jPRkFmN~̞ԬX?rixrE}Gf,?a f=O뷶❿u/ٕPz]>bG,r]t0 N3˗Ḵ$/u-O|úukY3o"je1;E6?"/kwCL[~ uK9/_p*"/:Qf|__ӭdu=ǜ9a:;WvF&qТoҮqPT/ U,=v,aA'տU*U9!"a1潭tn;)nqps+ԏ'Nk}g5G,HaًyiOR]gN%zMmӽYM>M=Xbcj:kČX0c_غ2[LIb댡<Ԣ hmv\;1ҭb$fuặDӤF$ޛMPqQadթωqCuhRslH̛, Ng8̧2a ߁7c!t{ gyf{c ,ռ߫-?#$z ŷc1e V/cKNt-e+ݵF~fTQaslj<oSmr>Xá499Iͪz:񃖓a67灦Ol'}ͨ_bÞCO}/^>&ɂuܱ *Ql&51Iԧow smϬU6z$Nø#?ۀ:2f,f;W8|ߚr,kΆ򽙲pr^ \_gɬ7i|m}o#ɖͩ#1z?^ ?1$eUspS64(3;Lu[NPm_PX1-e<T~1IK03Vn;M>Uk[.2a>ecP0%Kn&_=So> "ga܇7e{l(GDšMI@mP͆[ߖeڶ)Y6 5.3%,QC/r.bBfSzNپ )0 G2)ÜE=i}b?>kD)@]W<=U uw ύyaOJlp: +K#Ht;ѩl>BDVG}0i|ïܪЅ>S0,\|7 q?@rC*Z?ҒY3c4zeN͹m3ʻ4& f =[݄3mi;4s!\6$c|h~ NB6kw;fa๸ׁ4pZ_pñ gFtmt&Rm0|ˆ41Uظ7Rnd(bR .%,e4]5 .ÚxqQ9Y0;/3򗧚OM)Jjb̀_cbp6ǖ`ytk5*N`k'!bםJV.С{ LNDdYEN >(Aṫ2ijOpz>#}{S9HI+ (VPoH;,Ќ{,9vΰw34.훨פ$~7jhO?׹$j! |ёrPfE_?dMppQ,]5;([pfgb"vd 8$:z#M,X!~OO0\Ia0sxg-RMߗ'|Y3bi?a-'o[Ԯ/Qmv;Cm^K>Ή6>CޢnG/w* >φ\Md.O*5swLw39 o法_bV8 |+pЂ&9ER͸TyjO#Su`F؎)c;R09mXPP)))\7fߜ\+t v~yĴnșXfIvSpmO<4_{JMN")\Z@?9ں1iSΚrJP|ii6pgw{OF,#[.#_5j'w;8(^;{%mShhvAJJK¶m[ /kjn@Ʌ/3S'BCs] Mpޞnz]x`GFM|44`5^9(7])T`oA޼}b #^Ęqd:yk;FOy:-Zg*/4+01˿%PN*t}6ߤkDGYn)7)a^6HC/^Jwxq?N*XN/TU`FF츍 9WPC\G|[&e<כE7eЈ { /ĕUڼİηd0,4"MO342ok$!Dފ^/Ea|dyҔmۜ8^-;d|2^u()@Hgsdֳ$<;SmH̨M,²vϤ$a8Kߎ/mfݭ"YRmfD&Zq>^sG92w\:칧r&•́wߎK9w&v=ԵmbG,}"rmc #ePoྡྷC"Mn6 1WJ scH>Ggǭ%C1T ϼl+bE1gF-[\통3~%x83(]>P-]h\0z0BR{gm`,%U,=%,;ؙ.տU;v:c8 !88`prF?8W58IOwL V Ϊ_i1ԋI:̦QҥahQ' t~q* tyBxR(a8`|6boMEqqKf-SvzriP΁7S %m췌xuccZ=?N1GM:| S2i˨-3kҴqZ[9uxH|l,MO6ޤ=2vz6 ITض ,Ԫl3VoAR8 c>NY&1 JCçh[؁x>Fo;?Ȧt@r=@\t~\5Y"rͬC,Yi,Y-4| '`>]K<\f:'z z&h{o#>8(P59ђαa烐HCZ]e<T~1Isn72HaՔy?.c1fS^hM0C17}f5X_,^Ƣ ]1卥'CŪs.c~YsN_Y) Hb(SfuUl\ְ!21w`ɀg!l9O|}_[&kİi3oM|旼u ]D#^1eHϱ;%ꙛg0y>O*Ǿ yixPDğu/R^=#ޜ巢LJz1>7lv.f H- r=֎VNgi5m :HR%2%ж ,Oi O]rZn܁;?fi6\ 똺(-߂Ӹ3݉Ne &J=c>"aav-`/eXnqp#:ԶXx weQAl\g7d}qE)W[x{֮pTGaMv<ָ(y,䗙 Sf䈧[Ϧ %ON& =F+6 asl G[ &f{"ֱxݩ&B^Pa#C./΃-Pa >rYa_r늃R୎Ep$W ]"37ÉiÑu0GsD3󦛉x܂ސ,ؒ{,9sq r]9b"_kp\$~ swiP% Ba/* Ӵ8{Lٗxg]:DZ3`/:2]X*ԬHkN8{kfbnLLĎ,@$:z#M,X!~a>1cp%6_z/sxg-RMeq_ҳGIG]ԍLB=zIoV]|kJPH/"߅>/#fؐuOl~(g f74yC'i'T˕}퓗K n99~Bv}rlПa_i>9q&g(F^ó^%!ԧ0q S&wNb6av|Kߊ3a/2cZP9} gU »H&D|TyjO#Su`FGHvLۑקHqw(<̢t3srO1̭54M/e2"WvAO]cDܾ>l]5{jN~GY:ѲyȆé>~y5"׳ tg ]ۖ 3IMHfEؼS&cOHLl6uFҎ?ؓR[кԏ|r8pl?tγSvf;Awlq.թY܉iDmM܁3\λ6SyyZF~o`Ƞo2ے}Θ;9m;p'{}KrřeibOy<Զ 5bA |)/9Qhٺ|^Y3?ܖ6O. kw5nD0`ϜRX1#SGuyvΩ [>gCiԨ :?ǸՇ܏%I~g|LﮭiX߰}rj$kbt6aNٹ)QF H a9Bn#?notmߧ\8ŠRA,[r1{[nxVwe-4i2cZQ)-JTqKJ ࣙ5O\KE'/6He㇣po&*FXH(| kBzfF8-zi7.6øÿжpYX. Lq,87XĆizǷ- 甑aٯ%٭-]Guf8m;u}l`yKw˒%Kr9v+/tFmH%(#W:?.Kh8y2#S{vq=nG)ݻLF$}l:=;,ie`moG2RY?/ˬUY39e&yVBm1mgVsZKihw?_dDP ]Cs_1aԫW׿Eٶͺ\1l=o |fHjjj . [nt{ [aǎu %%m۶C4埡Ƅ3}'3gկ:9#(R@[CuQkeٻ)մюk %cqҼ Y<̐V6O,ە)V )︩2M \sn_54J;k{]e)4Ob9e-at) ?*)|יybypo N 440"F(@]/\m2O!S4  e2*-贝gOqx >6ZOw?G,|g(g+%=gP:ϗ}OfJЭI|߿=6`4E۞Gyfë}m9x.%zM]O4Cysqk \89'64fp h%'`8re%x8 "88.^hFm)Ԭ,ϕQgN`sr4_'`IpٓWw!OQ`oҶ1"urX6 2|A6gR;6n eی7yu8iLscmf]#e߰~Iw0Ո IT DɩR]le";ބ#glA%q6~ī#îSعiz?Ph'ރ2^ӛ?+hS[OY+ t|?bp),{ߔ}Zݔ?[_cy%o޼E"r\c?[%;VjV{0׌ؖ 䏧y̛z(#K&4-m˸^,ϒYofiظس~eQ>#$ ΗlT.o=tgXGޚ?LG ?_hl G1voO[5`x9q7>sw_%~{\(]5c/uZW#Sse[7٤Ɣmux,[0sk9ka]V-?NL; ABE,^ /J̔opϘ,Y2wa5\(V_X) HbݲِuUl\V>25>8}|?Jy}_}gx]kNپ )0 G2)ÜE=i-ZgYp6Tǔp'#)If&Sv= JF8-8p[Y!D 0~Yu_WD$VВLn^¿gsٟ&:kZu k*FhijV+FXĖ #Xi01Ҷ\xl0rӭgSnC`eab̀_cbp6ǖ`ytk5*N`k'!bםJ?jU Q0,\ɉ\$ #4/y9‘6A3ډκU wL+ bPB^C p,ؒ{,9.|GT3u![k$ *%ޛ+VVVG`6G?Ǧݧq홐\`1\0~\%9E` T-͜mݐK!mJV#ܴٙYgzsr=˦ +)Bq"a63EJɝg (VPU;ePNP(A gə/9DA<;w=mcGN4r`D/@AЧZfӃ@PjVNerQ.Ol_ 91N-da?.[#’~Mx;}B~20ܧ' ۶pݍZK(&i323|^ S6' 3hzJDxNJ7J ӁՐJMSČmN,Hl嗘!g4$_d `sA@w!=DeSx*U<0 <>B*c؎ٯ Ӂix$"I۸g >yӤY)sTvQE3WMaĵMi-al80㷝GIZ7SV:W*3g%V Pi`=Ѥ|*Wǡy{95LἍ-0VkCN f"LOc*8}$66 93}8Áv]F*YNPD|g2wujw;0vsƂT^ IDATywf4o@ WUV+!2:[_ -]&Qu[R3w'm##do^~ GD$+ P d̽DoK6uT 1McɪԾ3"ˍ%fXq-/B(m$+]K1~mt?Ub(w':vJ|yu1՘Gb^ώuO=hrGzL{;Ƹ{P1lN lQSvj ydF%K.c8Pe^T祬J#}^$ah~sQ2=K:הe{߅""R ޷=Y7_ӧ}@O}-wξCG~{B\?nHU.4u뉏]˸zȪ0LEd=gݳ\#Ͳ￾zDD.MVg}DDDDDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@\ ï!jG)@\gDDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""RZMDDDD%""" ()@HJDDDo%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""R HDDDD%""" ()@HJDDD$@ P""""R u """Qx HDDDD%""" ()@HJDDD$@ P""""R wQ_3ɖ^ Iz vNzgłz=ϊNg9="HHHB&&l6 J y>;;[gJB!(!B/IB!(!B/IB!(!B/IB!(!B/IB!(!B/IB!(!B/IB!(!B/= DQ\\Y$8Y$8 $@u`(Y,8BSL !BxIB!$@ !BxIB!$@ !BxI;C95̽dP^^өy6RU tN"%5*rB33`'440TD^RC4صg99L?QVGB3@v`'..nԄ8UTUj`lٶ~< !D%g\:u $ y !D& %I!8}$@()gC$$$x !D& ԻgO|>fir8hf#/o?>Fzl" "?0~X23%/o(qYt¨JHH0RSIMM`0x6BMh4ҽ{7wY%BL !BxIB!$@uPr!D{d 'RU"TCH~ATTt49j!9}9Bb:ht]glvB h<,.&XBHd&Bt<2\!KB!$J!KB!$J!KB!$J!KB!$J!KN"BEA'bPSc,B!NVg8N( 򉍉Y-Bp55(':J~duMzB\`&00гZ@N F@!!BqvAB!^%B% PB!^%B% PB!^%B%IVQQ"l*!RJTddŜ!$ΉOH5&hR]]C~/bOItΉ{V !'qdI:d IdHϓBS'zIB!(!B/IB!(!B/IB!(!iSt.rgeW_Uvc>d;+om[r><_0⤑@ q.ٟݚ/k'w.>O +zO.BpU94Hgid_g^[pQcϸOg&z }80UGpӟzԸ ۮX3&BSIIO'oӷ $Xqԭ$oͷۋqvJ7Vjy³?>dgc/`KhW %/xІXn~>.|k./,%(#aeo劍y2q!~qg˼0{{X[1qߧ 1V^b:ӿf`>n[0ok!5>q i_ՋK*ekxabjh8Ǯ쉟`cׯܿY} w̸>?kpw3<꟯dʛ&;_:t8)BJ~1L(@Ccxj(kZz<"< Km9ɋ|a/b٢/xK*!ùp1_L_\͵ ;?[F.eɜiXȜM. -wnn?;e?|AȻl˜s{|uq|KyEo;[w⚱y%ϫ_XzKb,~,s i|:eKg<}p0+=qދ_lB>yf>?w4=_O#2}?9o⫂A DO.\7`/A Щ^={*f_ty2mO}c”`F={z'̟'!N# PBza '*\uu6ղ ;nNIk. m T՟^^@e( Oǹe_Ef%{oo ԡdic2r.L(~A).A M*`}[L Jz`&k\8u;ɗOQ[:1o~ #]GZbN⢋3(YY)[>/Oj\96`NM guTrb-N"5؂a9&.MCHh4nQohy׍y|0m2/?#aIYK!xU\#1 )d#y+$*AiX;o1n+O˦=s?xqHۻuBJ "2Ju03[|a;AM IEFBOO0p\ww^އ`go6 4M*A!4RT? *hF} jaWQQ jGМVXtQf)cpy{H^ww\և6AV*aa*!0D'״j8|Axz[畹z<OSW ӖJpX'|JpPza`}IIя1ox^~wK̊9$;!] $Luomty̍eT/>^Gop훯t@Tf^;N<;dmRZZ ۊ) $!Q*-a%44 {6ҩl:zw~ˑ_IB++T)شlE9tCqa1:*'4So#6x/Ҫ|- !N/T0rQ#m  FS| ޑKq8s u%1IC05IHGIXyP'k]?bsYspƤ4}`ޙͺCv4t؞Yyw#1ЉC9/S|{sK7zm037qf֠lӇ1hwoRל8?MkW0hX>{4URؿ' ܩ(8[g!N*Б?gpVh &sz8~^ ^|*^/26y$m}m_,pfLlgPݼzmżQ'<r;Ι2iZz7C hb7 6Ϟ%8{Vʚ;nO{56n+m6>nFןz#`|מ~۴hN 72p@8S9Quߗ<:pܩx_?o_MTۉIs]tϪ|q8iM۴5tӴmZw5uzk>YxZՎ9TBq.%B%%lg)8%O,BSCzB!$J!KB!$J!KB!$J!KB!$J!KB!$J!KB!$J!KB!$J!KB!$J!KB!$J!KFt7II@Y)q>Y96JLPbbbZs!Ձ9u101Ƈ ưTaW䑵2p}WFQB:YQRRBb|<Òf-[Fr.(|yޑA9uxjS=uN8j(DZ 7}AOn~&|䠬8m۰L1Т> ٱc[mO^m5go=N)q>“;Р|Ud秧窷vР~C,:cse?9i_v6>} O {b2/;۳㓓4:gmsht*˨[>~/~egϱ7V=k8펲iKMgA'c|0N L'j2+ zo{o3vP.zeͩkNǠ9OPxr a }q>/ZSo񉴿f^zW(Ջbl6gz9_=є{U<:{'-kNMh];r[nQ#+t,<ľ&c@qroC~/:3wraw!N; Pz0;;_M ^7/{{}s B |w_6S Y8o !֏Yb9?|./gACYq%XtJ)%'nEmx3[yaA:kW̬/i3aX&^q/|aO% %opԙtI̿&2ʏFy4r,+w:BQ FLA r*iljƫW 2r-{gsum.g.]=<.EǓ'DÄySDD{͞ŧ`iy־Efq׵pqp9w6>{-8ݣr#whF=U|sHn竉C|M_,zN.8/g&@{8<>.; O/dK⹥zLRMgE=n2 v[y[`||T X#Ӹ!XshmEݱ^c!N PPqFYqOYm:kG׏BL prT ~5s7]6zWN  3Z3- dWå/~su^~v9tU:飏(쏼?{}jd/84-Zz } 1sRQztsXЏ^ ;9/}O-o3,)?=ƢYfti~ }]JP*uuV2G8Nw3!4TBs͓p1_L'oEQz)+j~ G:w`~EL,xBSt[w3O-: IDAT\̐>c/x?lkfq[L~+./Omȹ9/.$Xu9g[o*=g%ZtQh8RV||~͗w1aby?I[(~q҉d=: ENj!LA,!t EH(/tχ]CFGC?OHV{|;W\?\<V.JQд%ǜOw5]ԋ?+6N851 7ww㞗01v\rbƘ׸̫oj;1 Jt$$?-| +Vbsv Ĉ_P(jQ{x6w*/̼_ۘ7Ӯ#-HE1wKSl{]G{'l!:[4Ŋt\Ə&˧s](,f\WUiɹ?AC2/*yt| 7t_!o>5̆G‘Gh'ks W FTPy%EoVSY `G,=|* QPTХ@|B'e|jcU 4 ξɸğ~F-W3l6=fa2==(zoϺWz5MRtvv˻`],OMkug\D⎶*)){<ˠQƐtr@|| \OgHkqhRcz }=OoDx7\¬ѾN4f`_ypu7:]?f2SE=*˪r2 s6%`(¼{;.N9r?w݉r$t4M@U@{QQN+]BOWbPZ1w:|r3@}cմ{>{q2Mk)O{?/|œ#eOTJIIСCt ,@pd<3xw{í-4{_9uosͼGi!R^xc n{GS( 4cTHPPBC#/xgN%4(x4~ 3G7'j۸%@hyҋ~o+`k0QuIraqoJ[˜k_Ԝowk>Qn`a' Bq8;ك:,c>ev#/]WhC QFmS~E,ry<'oVRPB]^C<+uG?קK5\Wc.z<|dFdGc/cZ cUڱcaaa^>봧2f>nΞUi7Ld=wz#O:73}X_st ~ld̸cvˋH Ofьa>p2F_=1+gʸ2˫wD쉫;r$#_줢;Gj|Ul(`+2eN_XW,O49O^[+k*w>ה6n+m6>nFןz#`|מ~۴hN 72p@_#͍W#4XXЀQQx6dž5'bp:+NQ1 iM\EPPT4ŠEms:uTC`l(k]4DlZ7Mלhwm=/WykOիkB9Nv؁N~Eut]gd{VϿ5ZhvTM;]@wvM뮲z;Mܧ=oY 2203`O=B 15u2+l-s2*/-jpc㢨(Ƨ9u DiMIqGZ=ixk۴6_ !)B޽ڷ?HB\-~LСC8@XX'!/"QTcuo7Pʀ0 gm-h( )DGSPPd2JZ>^B#$@up~ 7rS>Ŧ$IYVRRRHB_IBBqH:\3rq7.L#~EKBslB8N|B!$@ !BxIB!$@ !BxIB!,TWW{V qTg%66 j!'Y-1UUU !J!N ṔY%q K̒%'`jjjIjx U|< /y* ~f/[ÂYT !AzgҭXȉ} 3x֟85}B4.__Ba ~'lsG~ Xd?Wi o.K;QD$ѯ[Yx;J J +ٰb-يh+ב:|#uwǵ?: t2*JYiOcRF$*Ȧ~ 0_{uv__TgN:L 4vfXNJ'CYd ջ?)2 `:Y1{n15g$;ɮ{O=ЙQl6ߑlvClPTttMCQ G+ffȭLVšzӺ%(O!$x>"q:I iff>O?$2x䡇$D+ȵE'IbVV3Ȇ0,I!4;5 . 5Ԅ],;XBCJrQ⇑dDBޓG-lb ߞCn^1p rMgJOmTX"{2(ҳTf7ilD${o !)} ni=Ȏ  6fs&?CNCJ` C3Xi,qIk O鑇jUvnsRGEm=kh,4r(֗pߟV}&a>zj WmnS1מJ@ Fٻ{;w5ߝ>24P}#06:j(ZmrɥF ;-/`Ǻ嬲fxsQC^con1kK&^@": RgZal{c"0 ʭ=]zUk6`[RPS?1c 8 OmQMNFF\砆"r}6r$]U$<(փ H`Hlu8Go|Y}Nϥ?ΝX,?kP9YjpΚ|)* 'Аz4g=UeUm_/ j\4) ?tMlt~q? ^ %!އ]{)u٫)kR|0Buy%WnoʥUcq4Ctؗo#04(b_u)-Ɔ )쿥(frC%Hf|CΛnsR=ΌRLH$hOkh ~IT+cS@;[Qߨ4unsLd`pǡ@k|7nfټ `|Jv:P ,ىڼݸB>K wneonQ} ڟ/]jLC  NPN ǩ(M'bpJPGq^OKH0c={-E0_bc/vKV]nQ-5S 1^Z'9d:-N PgIXV7X\E%ȧ.bߵ]枠z :.LW `ﯠ%XzQrk0(DG$ɂ(-Km.هHNj:VBԁ-m!s蜒ujh2]r؛[^f;KzE\ 封✢Q~x5ĹFz4R?|)l٨GokVkdi"!8@g8gH:K(f fhYz1(;z[ ^njiWg.%p&C |3|\CN!8I:[XHg_=ֈ@}N9hmM'Y2+'P"}eqL0x+]w1ov)EU%<$uuut6rlh X'l9Q՗.Ocx;Uq&o{&<\*uuurmlڴٳ٦M;!ĩ&Cfrwb9ϟβ?3 쏸Ё~ցwܵ*w$ O\AQEI<$l|i1bnyq)\?'l޻fsϵ.;jm BSCᝑ $1+jv$D-j}γJ@Kxg8ܯ8~5P.ԐsB2ID8!jÆsCu)D=hs3gJxBH9BQ]_<7t]o_ OBq:I O!8d B!$@u0DϒB<:Buug^O P+:ƅ^,j hwpR{(C+jY6ܛpbcc!)1j!bbb6?}FV(Y Ĥ36-ݛ]Rf#25P|(\ma:u$Ò+u\ Pj8Dt"5%}JNl@̇) ( *ߕΙ?wXPHfN!}n%(ӵ &:g7BZ::8pݛXaߴgt 5@ӆSרٿU{}5"(^٘8B3k GEw~f*j1X҃o5ph ג:|#uv?:ZuY>!+["L@EArF*ah;Yl9cN21|oeŪmD %>RVӘKW:0vJ$uXgZ?kI5) O`L$J<:?"1(kMQ8j0biztTc<蕙\C:uK(P&BrjM$@ !:e;nFF˰ѤhCDt~X˚LTFBSͬکmX⬍U%I`GjeS%*kpE$7%~(IAF K(6>V5] bk~ v DM $̒KmEF%1ؘ:{\ŝ^uRGbVk I[YSp-:ܳJ Iz}0^x"a IDAT;Km8:N}ADHWSQł ML#VC%8K(chkHQ1(h͌Hw*[V̎-)4mtlmX0Q+&d>vYtM.4o7P[vp6G\kdfӑ)r'HiJG k43~bbu:6b ZNPe?+SclLdd$0u$z:x;֐:b}QR|1R|Mt?o0hQYYU:x*XqTQG4v6*?]dm!gRG@!^z-7m"6,`Bb!O:5Y'`N$ҖjV[Ȯ'Wʮ jh:`0a2بlpݿrw]VQTU zmi ն5Hm&_UԸGB` {vơ:[9Oz6<3H\/{s(o,8\wPWc6ۚ T72֢rk#mJtI2i eu85' W7}DGjC!N:59Zǐև¥[RB_pz LfMx҇8ضe%7֣2AN,(T1Lť/0RzvUB>b()Q}s[-f1=@QUK`4'QDg6)X㻑tp3'?ӣH<mv_]S0oAG;^RVTHu`WFI;{wHX`;vݗ4umWe"'"ů7>8 fæ%ىj 'ePq`u W/dcH|P2)~j^YSmiϿ^0 WݦnM*6mtn7Ƈ}M$ذq#3,Ԑr721]tϪ|qp 5ikAi۴*kug]-kA !^(?\MxR| OԐCxB!TM({g9B!(!B/IB!(!B/IB!(!B/IB!(!B/IB!(!B/IB!(!8m\ȒeIw0.`á?L/{Gu 7]e˽`c;cJ(I O4ȓ@Bޔ7$@$yZ !c0b0""wyؽݣ;[]ie0sfv5+tg2]At?&LD4bbl7,ۼcl?2F|3ǗDcKnTZ}ѿ0Z/O,j'i;>zs`L14;F=@I̵eabd [W{P2p&\ `8/<࠱r} 痡1EqjݶMxgDLR(+"DmyJzX 4`jdE/wǁͫwY( d܁8;vnHGPzGIz 7 Kq0]0,F\"G;b>2g@;oPYK*{ऩ7_QY(":N87;v^ZڝJ*X7]UkN+ 1?_{.XA ~oAem <=0d+ }FICаn vTbyg"[Xu[cCeWaǎf9y"bvq=-S,Àa6vmDAf L<}2`eQoa!9TXUo!pN~8u~B8X+1e w|wo Mt @腭v(/]eݶq/j ʂw-eDm1rva/dWQcEDǏ 6lƽZ8iH)2U|>ߌeP6~ ʏ.!aHiV| ghٿ l9gLLv56ڃ…řY8x"?^:۱3g 0Gc?ZsΜy rP~z^yW|d]q>88#|d Pև,gb:6w=89ըX력iEA5 pk-Xxd.Y+N?O =zF8c-co ʇXE^|_M؟3# !=COˆy ?X{p>TnDA(, i%b ./C7} ᯫ^ҪwտC `Y(:E!3{awhA^x7 ӂ@k@Z-xze }@*!3gN9fĬS< ށ"㈅̾kF;pXسq#EcPc͍Ͱ7[b?Yt;.dzlFXq۷*pdB7u29~46a'얜EO?69y@-̈i^z  qj+ʽ58X xF`) F] _{apU|G%UGsDd83YڍxoaUXYgickf[>1_x-vvԔMyZ?߷l߉!#ǽ}5V:2P0|֑ԉ,- jkАSu#c! hrz!4X0,}k 2& ϺQDDݜ=}וapoyKŁO^ 2-}Q &,d^5X~@Suck}Q/ w4Fvh+0e;hLdzP]P:/;cfhFZZl;b{g`m;p|Gy~dӂBsm>(Ыn6V6F7b{c/+ߟzc4X ;6!`oAUz )w<10=1b.]l@7CoP>eعӋb֮ olD^d „ӊ̿(Lsrp;v9}qZ"{aPn?Q6<=0|t ,Y5 /c fL.̏a?P<(*q7dpZsnGǠE;Lq:,_}'OGC<(5Yc'`EcVVLIyu.y֍-XM~38Oj 6}ino[}Wɧ *;?[KqaR8Xt&M(S q#uh m~1*ok@hނj`;.eN5&꟝HQuC\Do̓ғC w(Nl(Nl(Nl(NEDDT Fs31xXBdd4u16PDD4 Cqa22󡺦DGDDIsl)##y8ZU-S@Q|~6O'@ʼn Q@ujTUMQ'škƎEQQTUUUaƍ7v,`ƍ5r$nou<FĆQUU%)""CO 92ClDmܴMT7·Rbg5`e!7FL,oaĜg7ÆdlX,UPd iڋˏbcQ+mشysIћɧ7R] Ů|Q0SQE5UI\ceD?c)铋ۉUV"t-ʭ؟7S'q*MB ?o )y؆>8z>p+]q|$__A#?Cv`;j(*  ρk  R_qŵ1R_)"!=5Om88̼_`*7g.,E0V4~.j*8x4=s9Uغæŗ\3y/Ldg)Jr3EhNC={fyyסY|̂8@?4``˧OWcWDf,Ն`75̛:X >;PV>=2,[ACJT՞ǡCupFTk@a(>|]u=QZ`Arfzoo6֡Q@xO0_ 0);t'@y' h1BnAkj\dn9ޡ!͕-<"22f45; ༱6*W,p%oN@t]i)C&Ȇ SDVfMKIrJ{!Aۂ+= +y9hhaס1'O۶tٲ空K-mm)2NYgT`uhc-o><y(- z:ظ#JE;m6fDif'nDՁ+, cǠq|vZ.JN@yǡI_[C{cՆXx{P\x<(14/ܸiFT7뷚-XM}x c W{y6W[SЦU> @ڍw=x ~`2XRm߉ M1Aeʕ8Xt&M(S q#uh m~1*ok@hނ_T6wBcUM2 6adyEdj(u'%""$(..r^0~86O(""NVTTDž"K("".Ʃ{g , j@QҤ;1Qh47wSg(iJ QUS‚H/("""8""""("""8""""("""8""""("""8@O?["CDDN"CE@$"J}| (Nl(Nl(Nl(Nl(Nlll{q<ZY'ǜ8~8\yZS`Go.ƨx}lt|sZY&{)=X([SE^Y&|ݸp&?u*KlL?_}WwbGCN8NlvQ?vZT|6>Xv0q9Ssi܃e-ª]UhG2"lRӌ 3)_4^ w2z_~1yp4a;~x, cq,x OƏ~WɒGDiލ;/i}<A >yV%8d#+5PM܏e5x;O3OF; B6y,ԽqˏnǛ|pTV.^F]F]q`;6|[ l[o/`vcqߟ~Ϟ;oobG[W1Ɀxܵ޿z/.O%XEy?) ЋKoRcsb5+|ܷx }spխ}{?>z<8M<_;h7v}$y0C?l~9=||1{?܅7g>x13o6tͲ@ Ou6'"o臱cjvsދ_M2mnWw/=j__ayoz3.}6W^<^ ߐw12ݒ8W=p6Ӓtqu36U64 1:448/?WnƁK|k6u{/c01U?y;YNF9ߧǻȝ|?Z~[#V1~)8c׭cZc߀7 mڸ|x||WӃ?z6\.|*}z3ZV`W\1}3<+qلqNj? Oc^yXA(ܵ 8W7T=ށJEQ9*U>|X;7| 7a57|7=Ep6kqكob'Mgv ^yoo{7.c>Ow`#OzYiq8r3j&<{ Fzfׇqŏ'|R3g| 8\0]y.ZP"h=.>h18 gME_;~Z-NN90֟4Z  B?ve@4v/? B?_<'N>Uop[s?u s *?VEwRf9qUxZ=ǝ>h IDATVݹը;Pt8hokٸdJ;qy>Ej0 l]凁6͛ بm]Lsf9m?'iنDzVJOUA)}2JlR8›~>cM_LJ~d!ۄrnxXpc>؍wԮ76Yvn;vܳnyQ<= .d~)ꁒ`! 8<܋x_O{`=& jγpO\rcX7LyӐ8MMh}`aqB>ks3ğ||X1޾MSv7j7P4bߕ݀6k >\}i0GFDt*ء^,X|bbCWas qspV` D+W3V:\ zˮKgIyp@*˃3fb#ۧXj^1ޫ’A@41zD&%L6*܇wf/BI<\yӸ[pM݅>4۰z /ׄK3W n~w>,/:"cꟁZոgL3=XAw;w̽OzD'-k3 U@0O98l4\8Z֋1_%{xw6f| ʕ7.7t_֓A?"Ly_⋷-s3 |H/D/P'ϧhyxfasluDl̻eNFчobUhN/~qflC(@,ӌNL]z=|7/z '8-hYudYjoz nA]fß?g|f|wqsbῖ CR-X't c W{y6W@6O mXx׃p"v[bL>Dw ;۱?ym8[,^/W+`>/=ecy`Y6*__ ԋ!0ת_k/8 ne}PPP Ӕ@l|(l/9Q@9e" = ("""8""""("""8""""("""8""""("""8""""("""8""""("""8 #6"""  b/.Q'kq qBucڜ&qQ 6nڏ54ElY'mƖ-8r~LS'IOOGI 6(Y7uwm-B"X 6f#k4XlĬ}e:̖-4i222d:͛b Gtu뵼S1qHo6O퐕Ť!X{Q8rF(g221b9|D:[[߻S ^$"< Ҽ2L1JKOߏt.ѷQ&:""".u5:7=>RjX/huDDDXXRZ*4Pj"刈]54 V㦽%LW-<[avUq<qܹ;Ul q0l0\Kp٥²bY(nq):]GK;PbF?6]-'CW_5^o}}/7~n81(oO[CmPDnkګŁȹ T'Z)ozAs(%>ϭכoHSu^{^?|~e!||FuxN̹.Tv~vE92eAxe\4}M7ߌ%K5JZ8ܹڑk_U,<,!8Z^"ߙ%su9ddf⧷7GT-8W)Q̢wo/YX<?_޾V,- ?IM`vN7t>[$o|s7k 3-xݭwi[~K1pnǿ7E̿!jYC-sŘ~{l?S7~ ΚY~55q+ig//nmX^?*^- 1c,\?JlԬnޥ9|\_O5xkWWƯu);/IJd-vu4ҚkoD+lL_q˙rcDD]܌{Kd৷Doirl/#=t : T,:ײ+Upi(pbKF2y2NrXtiXѣbkXĩZW>/]0Ӿt JW~L߃$Vxk>]]||l7^V,C<;ׯMGp?Wbڭ/`o)f Ng`,XSN;3K`zK0^{>I/sx@jY҄+<.x _6E ;ʴʘi@I<ҙ T"}r:<QRy ٹ=,kn}ހ7FCm b~{ Ԡ^g]xqe(iG4edyš(2\6lT3kN3{yqŘ1w LL<+pjbg i@zsq4-hҷ!KDiqOGt0۽5^'eayQrs9_ZZ20WaRI`bS1`nI^%S|$"D?t.k.|aju{DԌ{n9 KcS}6Qخ9yޣwqUux'ᑹAHwi 7`ibO9ywy'Luc谡ڑ6JٹϺoEq(+EݼhMcc/Ei^?"<9fSbJ'2/xV1zm؎C oϋ ʓ=ZcT%V#Eud7P5~u"˜z)e(f\|)< u? z,ŵ%)(k$ Ũx~l_1#,XX(?}q/?+jǥKt f?<<`λpw੧¥_D;-00*ᦟe90Oa]Tዔr_=fM؀"8"̿BQI12N*Sִ Uu:56֜"ϧsKֵ|UJ<_h }\'DDIw΅\} 6xeYTV 񕋼Xc]݃us3w zYI-| ,a:s٥>[:vO.4,ϻ g^[٘Kp5ڇɛ`uUkbI8kjl?1Mˇ 9 ]O.žF}y lL1?mA6*bO߭Amom }ppFivlRu4ښFFOm$a:uAiX&2us.} @<_~s!(3 8a\V 9̱*[^h{5Qzj5e/cwTkLL< '݋7#R,䤛;.-=>O |~u6:K)]@ɋeh{ h*jl656=FzbA4x5`ŎQ*CEE|>LQ'|؂<5V\zs$i8嘑rS9BZ;sb܈9cP>]wMT<2^TǾ}XrDu _2 FJQcWLr<):A<5jsj/ǝr(.,閅qEu@"/?2Faa!,B]>sWzCA \KX1I2'[$R_lxq`CUȸ+ ="OD, E(*,)J ˲PXXB^L_kb[yz.W<9&.](r. |? Ԟ!""jkk5X۪F{IowhbecyM/拈⧯rU99}ƒ)@Exn{9VseNvDDD˲"5Nn뮌+\?&^M-  6]}./>@&W&!""ةuT_[Gc5XY!mNunq @.s~ }}uI>;PFEq;Mjh9"""ZuCr-܍# `jL1 (_8}3Ԝ@zkkhkChj,kS.i%ѿ8u/Z e^߈(N_^r1ǩM$=ߥ:3P!)v1By1=GNisthHvhŔq q74VqU o%2{ [:E ""Je:˂'k ֻLIZ!t26vKMM:S^Y\ۈF=ZN5@jr^mBUr^m|l8[yZhqsQc+tz~X>oqs[=uﶸ5 0&E54lR1 -xڇWweMMMPLGޕR7Vs󖟡Sq{5:SL-;P: q8qr /ǐsB9Xo4_PʧS͓:jT#=FJX-FDDCSjo{}mq P뚊zIMqmu)ntlsbˋjŷ|q .YT%֩M-3=&91MGDDĚ7MlJQ͎[z~^=?9Bcc}L1[-al⡾@sSsM^#TwE5OzLQwsz\͓SUsdSLy""ڦ72X5=z*fj11GJe\y<_,uHDqvW_ˋ^IvhT' ]ƲR[L˱$L1""J<"mZ$ȱ>7Șq͍[K;XQq}92]@9h]E c}/^+/ګ^ϫ\5O&BNP^L=~ Z BqS3T\˱SO_:%rƩFEMr:B1UzLcGdNXͻDg7P_IDAT+/jXTIwTäPL=h,jTӣ?6B1q[PLm[q5s񌉈5+ֱZ)ܸ&HMSQ9aRǩ W1-n@90/2.:3] uFFѶ1RcuWIo\T7~~RP^Om*^~ccEur.EQb)̫Z_tzL՚L197oT^Mشs-P@I.*\e `6Y1Dqu>֪'4WwboiyE-KGڛr%\sL̓ܫcY+M롚bz3רj ߑkM^eKhľZA/j X[ ͎AstImz\)=Q+McL͂\MqkTLM ^21W疍^mɸGOmBtf |Vs=Ǡu䨼ћ#қ ΐjPNFJ5W~nSytMuDDd-kܫŢ54aSc}xƪ֔7q1LIt ETom/1j;כ#h9Fšd.Z h{A-6@ R5(u>uJ~vIc b?OYM1S΍)oQk`˽)D2QjV#0F2#L.U ]~cuꅷ$9X=~7Jը<79Vhy=nO-%כHjƔwD\52bɉ)r鍒۝(=k\#vD-nq+@hc-R\L.Xy%1[Rۢoj LfC#x{cTD˱1;P86jǡXH1q5bA{Sd-念y""J H\=.kdN?VL1ɹ9E9)(M\#ԏWT^9;= qSct7rR /z~ʫi[mz\ϩbn"#刈EZ"b\3ժɼhq=&r.LH狔ܛSsqd^#rXXhs)Z:W_́Mi/c2-gsyL9=<46KH狔SL)&TeT#TLMrNΣ:G75Ϲɜ޹N❛jL1]GDDE=q)&ɚx:wM֙mz675Σ>:""b]cSd}sYmc$]:{QȘ$k0x{%|DD5ໝ1971ȘX4o}yeĻ[cX^d<.?%)fb5#x;x7zx⦘HrX눈k.RN2՚b@h=.;PJ{x$9HOOvLhϱ9úX]rnq r(Q(D:[-DŢ=Ƿ瘄Hſϡ"#Rx3Dk2:U{"U<vhy %Z"""74FUGӑc"<+zXj;Y~<kmuȹ:rlBbۑՑc#ֻIy{ITy⭏UGۑc">'5ݷ.l&Qjdht5]>)k\ɲĺX;IzwJc]OUd٤omM&˪]WDmm(j+e;юv\4j,P%Y~dYYD#2'$C­#\P~"""""""%5xr QIr<ۏgY@x$z}DDDDDDD'E#Y&!2ٍg,#8-x8,X""""""rKXiDţϲ,ScuƺX NŜO8"""""" /D;ܸp}*X] =I:"ٍuţbB> r?&R_קEĺLkXx@Sۀ>RǨm@JD'N՘эQcj"uXǭ6Xj,R[Gk;hG;@m8Ak[G c${|\j+u;5k[эdĻQ}obi9].Rږ}#IVv'cm>u\>Om)NDDDDDD5\q cܧ 'SbmGh-Io,e,P}|'s4/S㱶#u<2DDDDDDQ1IvT,Ѝ8˜88;ŅHdY"""""dIiY~Tp9q9эt66&LJ]wc%j[qeuMML#8E)Vڂ41rNb^ P=[֩Ncd&Ѯ;q:/qX2F!:/8cնNOI}< LeU꼮$b6uG3>)WxC9Me֩[u19#"""""Ktq] 'L'ON͘%#v% 8Om릂. q꼮x!"""""jIeyu/br[yB4ԶDJ2h8]hb,QX$bDDDDDDHDR봎ubNSVbѴuSOD3.1QKF:)qTWקQ!tSu^pWǪXdY"""""&ɯS®Tn.NejLIԘ%:Qf}f^n릺"\u1u*cXSSGDDDDDԐK>qBn;Mu1ݺlNżW\y'h d[M. S层:FtVux%j=DDDDDD)ɍ6Q)!bjү.g#P`04}"&>cEn /ƩSAm7ѾъXE[CuSyy DWxPi˜Nbķ QMē8Ǻx9.c:-bhSyTPtmUM4 \S4yA-*Dg +rnB41I㉈X_utɿ YҼgz!\F3/Ou?b/&NVí/\P=Wոj@Sq51y^VE'""""""%j6OթSu}rZl- 7/O]i^'\$*QXD=~11y |*DDDDDDK"nl4:Fm "Sr\\BDLLj!qlXVLUNp'ӓzSR- )Wc ѧ_C^ܐTNj[U~""""")鍵_ո y3 tm Qxԧ-/Q/yASc꼎SS"p5WԸZv#--s}]({m.KDDDDDD/ vܮﹹm/Gh@],&ɿ j@7"n^~x4y#(-/q]逑Մ }ZzG:>mo|>uk xו4ulBז/ں1C->R ٹMn^Ӏ"bDDDDDDD`poZ̜gx!&y!RV%{2]_گ;b^΃< >څ """"""DhtLIIo!S5gCr[ mXMQӝ<[L^cr(>q&`Vy>X0Jaڰ(/H5Rň`i۶w:)_qk54Vb@|רQ- *]aB9(^PL0-Ẋ*b,@QX"ڔ ~iޖD&r\KS"'EO)Ł'ϋ"EljX؋p^ToFs 5 (/l7ϻ3۶u4V&TODb@T/z-~b+9}/қX(54K\hwn)@Zb7RÖ2*sQ?V >qL-b*X8+pd_S é_r!B/Cv84P4@ϛuh Wd.j\U \vL;|NkODDDDDD(x Q\׀P<#SUڅ Ʃc˩ڤpXQ@Any c~Y;Ѽ3Tv ;iYpuĞ^5]Uǩd_1ʼ(׿/.W W W^qt ""jL2ڴnvAKO=GtU!8F?/uxQƫ!j7'::wRÕuWgVyVD+ QW$tOT=j[̫1-?s Cĵ-x̪:d e$J{ j-X}סe hqz$. a+.e=ླྀywsqi[ܺUK\q矣pmw-8㐑߅3M p0">ԸImx+ax; +/׮c[o#;; ;"őݻp녿w:!z8O'Oqy /ほoYgGo/e+%ɝZxsVKo?YOm Nk@=)q 1NW1WN1R[![4=@ӞehڹL tgi@af P߀5<O.:+. )>;~ߟ˒oKDDrq]cͺ x*3^M a;Gmx%hެ ,Op cUѢAx?.]pPfaY8;kFV-kw!&L| vؽSg={tGII z ܟaMeY8>ֹ6.?ϛƿƎoL>'!3#ko}=rqZOkoNF-we0gsn<`?N;7\.?['MEyy9ƽ2vqpÐAfxwL\sp8o>ޜޘ< \?CGo, ) y>9W^~1&M{q_--iE >F={U.4|1&Lro|~?~W$}>5|(.B{uձ/Ĵg眅O>* Ǧxq*5ʀmss`D8 A}#ӼiSܦ5|ule,#- Y3HwRVT0 l۾2LӬ\q\l߶~%x}>\Y&cvil[+p6k j p w O=b7m}4/A0LUODDѱm,Zgƽ{p]1+Vn;US]خ~cZ qk83y5)PZJL3/gKqe1>dR%huWIb+>\#2-5plj,xJa,'f ~/P^uo/iڢ׳y0)z;t bDDT;GAAƌ}y oZض 4CΊҩ#nzV]x+?%QhwLW]~<>y#o(*ڃf͚bjWuzvq81 >{3fpvڅҲ2|R<ZO~E<yD F?R(>ϽX-%QXrA?U׆0qu^7v"UˣŶL5PGA1u{} UGW2MYYjf{0PT]PWt(]s6~&9{7sxC.Óύ]S +վ˖31ahvrsQRRMwtO4UFU@ii)o(T{ жM}Ʃp\p\8vHKK (s^͚r}C!Z{I\4ͩW+@0 dge!m%k_a~v9:u8L87׮8夿CBEC-]SB-Z'|䉄`ua²y Ī[NB(!QQOC\iՇ蓧lظwzX"b%^ }b X 1qv2ejƀPX=8ޙ4|7c0<7Iê5kX<CoVfz<=`{bђe70{ʒucU[%SOmCCpSS\I&v>>bSL eVdbO̅\ET[՘xT2 NO).  @ ".pPi(X`jL:/!yY \"""""""J_ rP+sS4Sb*wWo$ 's:T Su,P5N=6ȹ՘c)T_Hf"ғ=HSu^nuMDDDDDDlj.*-0N%QS'z`~1DDDDDDDE"7cb^.V/EB>Npquy 3Pu!J""""""`"氂ږEwNpet/ՇZe""""""" r.^.@}qbڎHv"NOP=TyݺAEyA7NSSVB}Nr[1~uDDDDDDDɢ"'WWU9n:M;)j>p~~9~( V]4됩ZShN{yDDDDDDDTD^Pc2yJW[B=`ꋠM|QmPQCL՘[ $ɫ1 `S1{b:fmԯ\uc`{W8DDDDDM\`KXeNIt"Զ 7/?D<3@YÚ}&:)s\j7~)ȇ+Jz?ʟ{""""8༚9n^y]Am*1QKt"ԃ yz6kO$]r%""""I֩O=#BG z%3$=ܸH/9R?)׌D kVKDDDDD5Q՘SB$QH~1~@G7h,@D{Ʃ\ԶԸ JDDDDDDLrX-aum5&8UюY2  ;@h_W%.sV5u$ID,i:XJSj9j}>S\n Vu,ܓi<)۶mkYf!//^WRcaUV8q7Na%#""""KGն`KƨպVT'ӽ0 S&N{EEEm7bx뭷pWcܸqTc/.wg͚#ۣ3DDDDNqn"܁Q;N}1?z >OJ۶1e,_15k.-Ҩ 3, [FMqM1nhfGVnl/*vih8=?^n WbxO׽ ޽(!;ߨ]{Sِ ![5su>XHm ӺԸ8Nqĉk m ,!CGiJx }aDžCiCcoS?=쭘7],anXFWbPj07dQAۂoj?T"YQˋs{X/=t":FQضmFYgm|嗘:u* kB44"UʯW}G$C)PYov66ޥDiZbU"G[@(ocn/|,3ye'/؅%|CFV}XKxf0cADDDݛxH*X|pөO~qr0~xa 0}EzzUc>V‹/m۶bРApҏ0<<1+KBT%#̣/ōs1|z'@Q.4n q.Mr` MDB̚2 91m~)u]e-{ӽB>`֬Y.69`L81E۶qQG+eU}}ŊCnݤԠmop@JӶ?R&Zz& ^˃LVJSp'SpWkpx+ 34AoȬ*TXlr!ﲟ1 qQ7<0Nf :_%S8kqW;~Ƃ"/KDDD J<5\_1xf8q~˫΂J g 4C m#//]vM) 퀎/W(-ڎR6Ó2Y(. +-T| %,GU=(3ґO(ھ 644nbeSVjqwJ`e#7+5e e0 ;ӬQ\f&Ca~$QE1vlԴQ,o1 FV^Tl²܊)15 40b,찂+Tc|خ 3M[ %>3;.\ x-qQ8 ]qGl;vDDD_:UюUkQ< ,iHc\ QFgdd!@EE$F4_(O]g²w0kq[^҇3okk=л%|qXUx0wqaגiyؾ\-ok9]rBEwaN:{o sm^؏paгC2mO˶X6iwEfP?,Y+㏙,|_Jn{ΕSڷqǍ†Lo1 ?¶am^pZ^5p)>zs|2Xo㕁5?CWxʂ;T,xglN'0`h\|/ bCJ6fjcy ,ǦaBpkoT,f>^c"""υW)@dMѾю(FH-?~?,0]@+yw+vTWQ|1qr1JC{'?^ ;:_XD, ̾c F]ڡ,ذ/oކ?^UQm漓_fȱ_Oc(Uݷm漝7=v> v1L#_+ݹ ?L~Mu\|z_#[zY0JW⭻'ŁCn`_0mT,~0Лږ|S3pf?C6̙byBmjW}U^{aς iKv`/1vXp}I{0;m9DDD6Ov\V 5=.8J2,\[lQ~~ۍ:+$?<^^&a[~]>35~l5 #'NoU2k& ۆe۰m o^Y=_Żylض[N c.BKqUo~,ՀiD,[s>^{p ڼ9 g7W/ ۿx__,mwIv8i3_|+? %d۰>\|7&\s(4k)ؾ$.d6GN6hȩ\F-Тe)@7a#%͚d@ %(q=&MBQQ֡Ǝqƅ:t#FkM1)2lY_\?#9|[R2L{ Wa!ʱ}<̜*[+h[/(p5Ol,nvi /2q`홏o~ٍ 6/ |ǍxKm  F}uz.ܹs1h lٲ%[g^^nV6m7oǗόWj\H9 },ϮI̻3|"xBd݁1~ѥ%|׎|үf>6`c GgeVܲQ+|JX<:CjW0s-޷ W<- 6lX[Ç_b?P6[=9 6&㌡{53o/ KocS#\L2 e|o}6?':~m87?w͚gG_`Mplj3O߉SwFKp|l)-tmXlatr*  iPfpd@Zv&܆kd>_S?ظn h+mсȐ5%S[]~I$n=ܹsqbBAv=9޽[BmY<"co`?WGٱ ~Z a:yH!"rxԻIb֭ؒ-ZF]zH},oy=2_?2 9ݏġb2. sbpo8Ih݉[ޒ;N=Wb ,ߖ+?.\"*wwqa<?M z.NŇh#zt'Bk~p!+7׿l>܎eQV~F3LDDD8;x$:wNzNdQ 4{UjmXd )S?O6mȇ?X 0;.W:h߱=RuP߈뽕o[Z?j~*(\k qYFjҌ}-ɸ >Ul۪7 -!qb_۪_fgtk;~)Fr7^[(JMO+>?/\uJ׽a gkHl^$]C*@}(IF-[o۶{[nA>}xqu([8*o$!R﫺9&ON ZY*®=]l#*O|mAf #;Kjah{*,:l 7CE_Ѭ3jvJ&hy -'i^Ip!+;5bIx7֠$xI)"7$ !]Oߥ0iҤj_81vXt%)g#aΜ9PPPPmǏG޽Yw .7D;*+xMʐ3%Y4 \|HFG+LDx3ʯP8v@<$H Fe3 3 M + .š """saMb1XpncǎE=VĹ瞋ÇG )|u~6%̪ AڅyTOV~@bf#'ʹG@#i ԞH5̬lT]6#oq_oAFU EϿoJudz#ޙ>W1ѯcvs-¸+oT"""0~T P!@ΝV| @Ν0YoyppVȬ=+/ݧn؄2ݏ-kcl-]"5a: fuU`oQlն>j\|xкm ͺǦuEJ.nÅrq0û[ 5 jDDDDXB+Db~{+ۉr^ąC9 *N N &W/W§+DqI] f"+kg,'N<:3ƞ;sXU WL;}$HczJ^?~uAnRļ]"7R4 v)6-swy.h #qT̰ҔC?^XcQ5_p6Q|5M 50Ѻ1e1>m!o꽸aåx2 .>޶y~+Ð+%q3rqv;aWl݈M"ؼKwsYL i 8 sqV1ugF\wh ۓ0}]E],d|ߛektkv ~:_ ݳ*sRvOl.VhVr`1O{ on 6*WI!8]:ʷϦ^f0!htKW$"""fVWr 6[S[W&_?}o۰l.FS0l9Xg`[ܩaw;w>03ì,G{]R 1qX~&Bd6l@(6_|&^9.Z5Sy\3':Z~~GC?6d3{FmZa4Qu+RI_}5a6;}xb/oٻW  A'ه3l>{3ذ='_g=Ұ}6}'/X^`#=M, 6\hz 8l?%-%lKWŶ 7Z!%Cb`Y6l .w8 ?:T~ N`wm'""" "j41L~&c|`96؃rW6Z^t 63;.N`ᐳǜog—?Qp#i+ڥ's&9hM/$NEL;5wk-AǢ}q!5i!8[Clg"H=F:\$]{PA㤿{&#y}uٽdtPL: .XMj-;tp䂑><͎w> nEmn"%xjb'|:m>FRۢ=w\9R,& IDATY 8Eno/~uh]{iڥѾэs<-U G϶Ä+ږ_:#€2Y !ɵ0Xtޘ[$& y5?놡\|І>e9T8hVn[-a,Uc04 azq6oϐmԨZE(*ذ-IccD """='oBiߒ`~mcyڇ`qm/?%-'zUըPċPRR\.'tRc&a0 w8P˃Ra'ވ;= o8l;_h7nüD &߈ §a؈Ÿh#ԅ:{RL{I3&tO:l<|kNshx?37:˕^Z{Ek7>q)q.O&ọ@jułNNι(4N[2,t2 -2;S6;iTo쩓cu(gHe\.nwR.ŇU]X;13pӰ'Yѝ8)XﳱGOl ^mMmHcǼ7quNA3/ĀO|R[pPڰVƷ^k,{8rY-X :P%+ķk+c8^s%+·kʫOӻ/_;45.YY7,l5t<;S|`tu`Ml>q5@~-ڈ7GP_\ l˶]o{޽q)g܁CbC:YrF$g{_|9s18)xl{~..(J]p|źBI=-L>X>m#iX4L< 'I)ac~ 5.YD\(jGwFn8=TYsuxW3w]BBPw-]ݝ|no۷,̕3gνs]+\p?+MΌ炗G B׿E#!{0r]'?6oy|Ι5{jTB+g#yͦ>gRE5֟rֆ@V@\Ixh=jM+VFN4[&[.OKFՒ֕,}V2rVjŊGxݬ ZSc/B!p5߅H貖yx}MK=-/:lwZ- unu(1wn gw_r"wj I':[n#˴v@'MSE_R.w]J֨AL6#+R/*\k) Hǜ:r{5% `_q;GQ6&hbo#bPGZw9t)j뎩TlϛSycGu[`=@5k|L `?DU"qͿ_ƣf]ʳhtPfiLJRy~ o?'4թQ< ˏNd/%ǔNnG*d vW:ᓽe&>H뼌%'E˔&-GM39դr>w}!?B8  Rewms󧸙+lZ5τp($Za6Ux ic8Tbw{Cګ(Tb=JyJxI,sřU;0Gcr;H(/usj7Ⱦ gxf@Cz F,)J[&uBi;4ch% ^_V2k_bÕ ?´Ug>-˧VniTVzFeW$ҠL4-BU+[z^RGo4R#zFLG,5Sx.>kŷ9HDIj-nd+(JRvkϦ]6q_˔y13Z dt|扳|9 Jid)liz^Ĺ*'Lj1#^Q5pH[s;yG֏760s&q] ӂ?Zz-H6oFR, H}?y@R`߆< Wuyư;ld]>:LCsqo5=-=d1PrpLI>h.kQc5{x-ʴcVr6s#gE׺_##5":dn49-161mz<`*3?Gawh|z';S%Y6Mߐ42qgdl4$' ^<&~z^Zϊ 9 hR{fѷ 66 Y^o8&A 6֔[] ְKwON.Ӱa֬-QDjmd^EaUo_VH:jB ֶbR`ODdضȈ8*Kwan`*^܅Wc#wRƴ ^>I vo@:*yWa16<5*Q-:KǭH IV>7Q׵ڱa1cVћ<JA& ݈)lڹ|?rAj-6ouڳ)uY7cw .T:(}965: $7<6)}97e'2k:.IX\_ҨÝr?g@dj8ׯOy$I,eBUuFeitr.;ad[rgq$[j b lIF/8|q}gpQ"1&9f=AiYIǚY.mۧ4gܡ5ŖEj6:/ U ڵn~癹 JZmfF> RLT$t]8aW-GP^E?amH-)htePFm~f꿁C9/6!heWdшϛ"Ih\RHP"Od;`Y<\4SUxnWƘ9Ƙ+TU̦cu϶[T-ɥ3s6&habDU%l`Qf}&U;S@[c]~:MOCL:':m J9HCZTz(*H9Vl߇S"AU4{1!qnf@2$c-{l (c_cCAƥp>dӶr6CYv}ATƼ{ػxhv[ؓ7FETg;~76y@iBU=ߐlܽJc+HBXw$enoi[BOT;gJ"~Z0 0wTT#Ẳ }/178pO<0h*<(oι ӿe܈E:=h) f6Ć;uמq-=3i~օ383OϜtXC@vG%3φߴ;6 3Wp*ϻ4n@CCbUN\ByW&׭4eB o G'\)`~QiK{ڢ:j9|߾@QMyڠuI/1<|Ѷ YhQRn_$ Hf,ي/gސ`x.>Z=`spyxӯnw8v" ;J\XTcjF Bv@:VA9g#ZU2 UNW#:̆MqM1%-Z K^o"%VZ$k%)e:2E˧c vJr!Uc:t[mbVI(ӦI.,mC-5nҖ"HmK;áCMTQCbfj·VJyѥg5_mi?\ς+ Dl=rx.ٓe Q&D۔FQngkF+IK\'BQTHq4.H\N5piRZ#<5A9q` U |vm7wI KaSvFcW/=n7?bÈ_9Yhc;s ׊iօ-F/ f>Euυ5S%I~+#$dFF>piN-]qwT@rMR84υGw{gKD;ڡF.N@I@ {pb.Ƚk\p*l4 T_Ɖ H\eK"8z9>!BCx?Or>9WEVX,P ]H$Ƕ.hH]=b䁷&iY+)qK.0n\đ=x3zʥXDf߯x5Ec*U v#{&]R_d7o,D}-Ggc܍> Gdt\,%8nʫ"ڂ!Uɾ C i)3kh*(KFG-̲xb Ԇxm(:[lT}ҧ2-2փwr(+ix?茣ڶszt}U4vv`(,Ȫ;; it~(ۋ fFvmΉ+)crD&]bc+|FD@ /DY #QezW+!ɾT,p~;]RCd?`\^ ֏ynx{pzdq@R,Th]oJ$$YB`t8Քŗa("#nvh=%$ R$1\r1!eLS㢈ҧsmgۜM?.BYdT$@ ]&,fI R􀟴 XRcN7pƜ. L:^?M%#K2(jZ$mF2>I!A)t!'RR i-eciW60Q2=CzHHr,.OEI ^ZK_Y/9pv$ڜ3]#XvZM]\]  YLadو"Kwؓ'5 6ȸyzj6c IDATW0-1np7ʞ(j1(ޫ:=:>}JfSD޽ $S YaQѹ(錄$kD|TL>b1 .U-d*; P} 3T/hh~Zs` ^usc'%p|t3rKY(Ӳ7ȣC3d0<}(nLΗf/BaY$YBU$rQ5;E뵚u[.ЮP< 5۸3 cAܝKfzcX;BO=+X>?V9rH$%@'ILq<%(A"BfOn4p Lmaqu\ #id{f10G%/?uxzC,duJjP=~7EA6D - Pp/Z}86rBzcv-t.W*qK xUn@g[X|)hH>yT-I䌛ċ{-NXt/YLJ'ؔiח 7?_l\FJ Mt+Hoؚ'B[(ٖB RŽu!\{iP3)!~݋D='Νw#q!ONo4Dj aa SlXs] ɽ K=ȢTG{G@,T# ?ʣg2ȏݐ%;J7j=kkY}ڝH8zy㞿#~aUQύׯyH4%nX=d'])\q}̓Q(~} O5u,/""B!!vͤB#_-| ',΍\⠑ѿ=ơ+|̰CiK/t={e,;]q?d&oO?&/\ŁЙѻC>.6(D>ûX6vޛ"ִy];'W[=d:2r2n*BNC$iσX1k~KfxFvDpt.t0ױiq*^x֢EBvǯ,^yFн"⹵q7 SjD@ "gLiG"O5(ﴜ=ːW'!X˟6f?t\;Ne[?T-E@܄.Y)v ,85jv6曏Jmѭ+RR@,kŞLXHN,|bN?0j@.):Rۯ|3i*Z,!яRS? "cS\zg;uZG F xǸi RGthTӏd ˜Ch3qᕷ=GM_HTn '^XȨ"O3ڶc߄a45'_Wuܤnc{ ;X^d4Vu=όcwXSTbE)b)~nvd[}c^(ږKMMl݉j淥3,xR֕_sdx?[3]/ɮsi\[Ѝ;sIj 8j]AZHZ2j;&5I6su^ cZIaw$pN_ZL`K&2;?zDύ9_Se /3%-+kk|;ğ3}h+&bY:}}!;0]$!IZ ?n9&4p4Htƫ`ijd?kLLy?Y3#d|}!~ږ|}`l{g${ڗrKvJyڟN9x$,q%Io0u@{8bW5TxnjOms|^!dl*@=##I%h]!~5SiôљX|1-Ǣ~ֵ}5o:ʦ6'Qі m6d:z~h'|D@ju Re!3 5{/cۖ?99m X/[k-?YkM?ms7];4?Ͼƞ> _+-+?tMR(7^d 1UT$do\вUӜv3I(gBU0E[MmJ: !o$AUs%I6F5ϸ'2(*>1X_$}!! }UU$eS4,6.['/)=]|^#r13Y2xTLek 2Xğ$Ҳ}SJzNGfY3#Kѡ(fs>͟kT֙m[sBMͤdҕ)J,Ocxj̭LPͶu[Tt=JI}iORI2m7=L"&R^iź Ifx'YN '}ӂ'N$m'R\suOd$)uYSUPQS|3=9IV$Hd_{**'ϟ/0iM?F9]7joWMXoX[c)࿎$kxS,!kJȲձ$o`:3Hd9BrCrڎG)uXMd[ *kϫ7J2j#IiVV}VKUuu4Z.ck 2dt?`KIV4di&^,mN|ݔH2o[>'փY Sבr?-yZZ?>Kry:ҪOח(-cM$y2*ֹ̤:&Ź(CFLIzS%S՟uu2NO)Ҹ$ct6@ @ jB @ ߎp@@ @ @ @ ;!@ oG8 @ @ @ @ @ @𷣵> $""1AU8ʥx''M,(]Ոw5@ UIT"wl_dAwp}*K] eS&쭾E2!g?1n( @Aþ ܈k17d@ QֽE0JVjN{1uQ _Cϣû԰K<&ŠWV*'7a}H l.; oAN @ TEp,FGY;{ο`Ѽo)h]ǫ uƷ -b֍vԩI"]z>dH \t(j}X D8 KHVVA8˝Ø!fBC4Lgʲc8Mkul ;+?0*\А װc6xf1sQ911k3L++W J 5DŽI@,w`܍qߐ_n6+ [ų{Ip-؄{R { cw:5b]A:/JKxX瞿=vn6$5Ү/6n$+]y"^pp8fGGi2^*6NZgzߘ:âIpG~[#3:'#udzS(߲25f+=&;Z f!rgo_ǘla5XA.Äycp!G)`Pqpi$z++uf/ȡV@ 0#@_&@L7 IhSgnQU<6Ssd\ ǧ|R?ptbOfDbHư1*TNU80Y@nfxǢ]YK#ruj:~M[9|p3c]aUcӴ^4BCeeǮlS[YJ4cm8t5رmJ&Qdt}S);ql,<(  u9AN}Vb#1]54潬=<vsF&TzđK *by|ȞCG8k1þ)KV"@ O :<]I"8>Mh [->;ѩ;vAiI^}XZA1A­JKrFJjɬ+AV␽ uϹηžjDe0i֡:Zt9]-/_JȲѠHiתqr}PefCs@yK9 sZܲ'$ƷFA#K(mN@JeIΙϣ&Pp//$"+F&GGj\[4\ ~o/dlI,[¦S3h$灾P,28J!QI /B%,qg1by2f f'V2W S2SN5dҘǸH0pw@F(Ey6mnk"Ȯ;E!ԐEhR96sf3. U&7Ǥ3);!}(dҩMdTB|AkՍ&K>>@ @ _FL/c uy DZȒ{)Eb@O,;Az%7o2yڠFH ~ϋPU!ah' Z);(ٟ1BԬ,sdFD)͜7@cv pE96y8PzBdXxsj-;$lQpҟYݲptdkV(OIؔ]ۜjusԐєJSv[D4dhH6VtScPuwjCmia;kR=*8Q$skTj؅Uh4d_= ]eTִn^Y .( FC8e֡Rfٟf=Hϣi[ ՠAcח/2}n{9:L _f~_鹶ö<ƴV_J̩Y<!i@)X/`M{:>r% Ӂ){@os6iK/iFA_Z2ך~t- U2-hW@H(y1D4UYcb@ANU2(k6UUP0-J)e\blLʾۧTμ%Ʋ~L+!(*YFT(I$Ts4P,3UHh X\HFFI]B\ݻw-_bN Ib+zƤE[[ $ɒK빝,cmz9 sr&}dxz)Udʩ_ٳf1b N޽](<]#mܣ/X&ku[k.9nqruQ^Wz$3 "{ofh+gՙm\P:u0_y {xŊ>,bҼ/1 Л~ jrۜXLz@7X쫦ct~f,||ӕ/F5/5$T0j_0̒4`O8KI琑ec=lJDZe͇,XŲu$e `>^}m5hd--KVyd'cc+Y,F$kY6Z.mLM]"Go&}M_ dذa 6^z}柙A{y"݄cT'ێؓ!gb*߆XR Qޜa՚=xNGB ԩ9ݾS)=*$K@,f'8H&AV;1d'2i*::%1W"[)T oﹸuO>&\ǷDc:Ĝ d4wžK/ă"ijp=ιkǦrIk`y1YӽeO\&x%MN4ۖTkKp$ސd~ɍu1C dAMvHU-.is[J8piJyBX{6J6HY?e1hO/rb99Gbp15Yk|M[ױ=ȸdK_ _yIG|K7B-x e89;H da5_zDS$µqyo|CF~5﷥n̬=iΫ\- bUw|ُQ?CNloe7D`*EPfl*%ϑxߚc AK/̼d։A4&'dC &2mc2S fLz;RަkJņ)YqkQ$&prL CXxEmerCeGx%㖯?Z6!X:)mW^=Nb޾[|K~#rbBTgrd@ !H.j3_.6&a˹2ŴIcNnNDLMb߃w*@<77c[XezoHNHnmys+Q=cCs&3w{F S_~mk8Y{X[H9uK3 ԟVU?pDBu*P?63F1 T5;[bӬ-#d@UJcOvdZh3lrY5 yV.{rطvC2EZ2WGML}~io!s %polV/N](@Hwd/|x'17+,ӣ_sqFnݺqp}ۄB IDATtÆ |HBŠ)u"VQ9cY0,kz"Pdg.gylSrqz~JN dkAg.̤YH*R.cNfx &cʉsts@R!@ 3OZ@"9P(fu4.(CGdX'Ix .?B Z-\buYƃBu5<ԩ0 խO>WZT+y7B)C>it,F. WC x.4i%8RERh'N*:@Svr舝.;'ϣn@lhN^W\3y|7^#W dLx;%Y%9NE_{4%Wn|HxHgPQcxۣs%s\HeS63Z :"ȩ}اȖ-lƍnݚ(gNr>5FECF >Q ѝEm2I)?krcⒷ=Cxl⫂htxN)<mvd&{\vA똋͊14ML*&\3< b4֭"M*aF{MM8*mMawv>m׌b6VZ }!36\:T#_qFJ 8'_)xaq3O˟O4y=/*N{dsR!@ _J#{ A845I@o9x7{`mAj5 D:C4P]%ZI!>/OR>Dr`:H»guc$'ִp2 \ăwa mr P?F従SpBKp3B;[p(UpM853bh8ob|5՛jѣe1ܲa,O֭Z@eQ;zԐ<`JkG ?p@5jVލUoTȂʢ>l6K*o"cQ`%ήeAwM Dr>!C9]vٍʝ. ma_$778zўFS\yŞK9z ݶqq}?Eć$ˀ,}D?=²93P?q]v->i5lNۭD'䈳}4a"Jd= LWX$QD nF51r$z &dj6*m9o*qK =)mg2:#ufGqQD'Zt.(;jGsX}ɆU;0J[ooäJGuè%X؟X@ Ǜ ?AbdოFrⓒ}yy*ػ(ٽ!Q M Bi"DEE@QHGREAQwK齧PB $w?.\|^s3$ٍٙzjolW8}~Eh>R'KklYW ]b:#T˖%wjp5/mV\ܲ]UXBJhX)jWfۺ-\κny%"+puBI4-Βd\:qSI6f! oy}m 8p*ND/ΆI5?vv/g}< OB p꧟؛XRR\H3 ΒSsMBʕ#.>>+EH&T96Bƥ3ͻ`=G_%C [W9[k}ŋ߱k^?94ǺϿd[kI{Y뭙9eYg~*؈Ve)PS2u%^YcW߱l=[RCƵHZ8^u4[" qy\K11c$LM;!Z yв=!BiBqOSAix'_Nʟ>xj8ޏ7C> -A! S?_NqU7/ewj.>ҋdE`M 3RX,9ϯ"Mrw4&IS50N{Z*D{,Y(l_3"OhKU+^<{5s"_h‰VBT8QEr}ž^\/q S[ ya#'LČgN6h8tf>{y*=˔sW05w.j.e޷8}~w[ˀ=&rm2˛䶿fNL |Sw^̮g)21ѳTy#=3uR(-=XLThi61 n2d#nuvM7V(}d4{7{>uP*}fs:i yxL2YL6 Z2PhL{csJ߯b=~Q9@K^wift=q[/i0u(]ߊ4>lı؂iC2TJsǎszȟnL2B!?2vc Xݙo,VtY,4g_f6'eCewYʜ2 QhZeIlK4S2ȸLᲯLyJi,3\ϟ \!Β9 B!B$!B!B'!B!B8 @!B!"IB!B!9NB!B!qB!B!D'qRSSYj֭ɓl6"9Bu (@͚5WEB!B#$!}r!L4M"9J)ń (RcǎI&(܋{ܓ)&Dڲu{?N=+.ϗ lqIB#i2j(Fjk?=p[fVRܫ._NR B4 :RܓIB0}|9SNH"IB#}#Gjgib=z4>>>M7^$?Gx9v\9LZhm߾!C3Wa;uֻ+C!Bqʕ+҆aBܲÇL)V`ΐnZ>|8~B!B%,]4Sd_~97MdȐ!{tRț7Ki!B!w d۶mYfGwe=z4N0 mۖ)P"B!-Fq_t{aaawJvήB!B!< @"r7-B!HB!B!9N&B!nŋ9qIIIYB!(@gDB!Mx"gcxg !0]xGH!LdΝ=z+/_>"JIIaӦMIjr/"wĉxg !C?pPBOSR%ZnMѢEy|3gItt45J*ǻB;"))Iz>!0M=K9&%%f͚h"V+6W2h Ǝa9s g۶ml6l6;v`]O!B!ĽI"̛7~ 4)X ʕQFqi5Μ9Ctt4wH#G2, !B!?HBקٺu+%KD)ErrrZp•3k׮LyuqOB!Bq1i *7YÍ]tshܶB!Bq1ݺu#88sU?i4hЀҥKf'OB!Bܧ5'rLxx8 , $$$CPB ̜9ӧOTA^)B!/ @UV-li߾=SLa͚5͛gΜA|"Yw15-#h&Fs9%/B!D?"((TC4MRi( ǙYԷ7]H}-zu3;?>1oc_4,=^!{ћve ~I#d&6zeMɗOdI,57.[rZ|%K+JU\c;ӰvWwM[/1{11õ;9vh1Ϻ s~ 3s}ʤ_?Ã+'\]W"gĢ%!BD`;̙3ԯ_?C׮]6m}AY<OO=|=%4N4C]Lh<>4V4kvʌhX :Hvl܈ovaTu0`v.|9Sc[-yP}]1*ՋB^Uh?8iK-3f< L.PjUM߳|zŮ]]+53W=nμ3^CzTVta3+XuMcSnc,hϣTZ-{2iY=[teKѩ.*0h6X! @;9]L81mJ!?&6g4xV^Ƽ~fh4cr~d>;Sx%p1~_%ߦ14z5FcŪ]N_9 hB!,>I |3E!r+╡C g]3˥CꞚ̠vp$9~23Nw/ڽө{c¯Z7V2טƳd}-k3F_[EnXcd`TOި>^K->懕+l4MqaMd9?NCjqao-24M|OYq#*c୺nKY uP(׊3f=5jG\)_-/dT __av vydکt(= B #N+{f>Ooؐc_mz<Ъh yS%&[yEky,4?oGMm*e;$5[Q3G.EI9P9*?n!XlJCJu1<$/.;SV~8.|֔ D}jOFk@x^䏌Ӝh`]⿋ӦK{[C[d^' #_ro7jT^g!_9P*ÁU߱vL߼(e޺u#8WPVmh6&n 2Ry|Yo, ֜nIXORx[ty!~B!xPcfqGꄓvlذx :ui. !. {[9&zĂ_5&t< ֞?B*cCQ !Wh" (xt @7/ϙd ǯNR4,'Hg\%6x_uY+W?žn !6}sxWr&)W%ڏR pP,7BЧb>̆3z7u{j GH L#B+O:< i-,q[Щ SٶkW>u+HU* O0!7^_NaӘK~AvNi*?g3ӌ=zӵj~|'\q7^\$aO8oSb9`-M Œw&5rJ%]Iz(MB!xHBM8s1iҤ?LӦMx"ig^|Eȑ#&O>J1Xmؘz.r ɠ-(AD׏ &ZY'9sU8.e3˲k6gf=Go% C[V9iʑL!4ǺϿd[kI{|6OOp\LS#z4~UGtt9eHiӻ>yie.+V:ڵX IDAT7̱xCCuh\d _S@ɱ9?k2 ~g.c5 RrқB!ۺ8@2-koNմ0=LħDEep*0썵bev`X h'Ğ8<5ʟ@=<5P,?B{ ~N{@!i9&!!ɓ'gpr>|4)U$W\yܖE@|J^V4~J͋]z;>UcxNFts/1ԫޠ3,?RhZ BjתCgq_pRTԑ? I 13,!pjQ#>X7oD]_+CT{^fZ`+<ۥ+Ͻ%f( {Jg h^t)?^i5!)toQ',OsKFB7iye6kK.=p<8^[$NLvt҃=o^ТᴏF~mMӼ%:L&ZLb+ȃrzRdmӁ1YC=ET 5tDՈEy0q*TMw^B!7pVKs~w]v8 Z5e˲a\8>ߝ2`aov &\&<}۷f0999ӛ+ ѣ3WQFl6q/ٳg1M_|ɓ'g 5rϧunOſQqԺnٺJ+'LÆ,i8 if*N&DL h6Lg\MP À&aGa( ]þr7uT0 1'$Lt@)4^?e6tG~CWH_TW:oAj~>w.8'Ko/pf)=*e`3~>[˹BLd柨Punl2-o:Ę=V-~w.6Dz0]m.˦# u=f2ϐC.@dd$ _<#;v,m;:tȱB*8]SJCeeϿ!E36"M]1WK_7^b&,Te_fٞze~2}?ֈp|]2~~kzyY''*S9sŵؖB!h2C䘨LiӦe|{Oٳgi8p{7|իgڦB!B{ Dر#'88 i·TRkRn]<==)Z(| Æ s/*B!>qi;is7dE)E2eXd i}|ͬ+B!$n6N).cB!?[B!HB!O;!!&pr{B!a =B`!7!<d`0MSNѶml%B! PF4￉p0 f̘3ܳt} !B!B!B!rÆ cϞ=̚5+x[Nf]vx 6$l!Q/^SG!)@;"##:u*ŋ0 t]gƌ!+Ɗ+v+k׮L2Mhܸ1 7nvBq;]xqA6o3 |Je:~~jӺ>Iwlbli6loy-3_eT *WE3rɼmՉ'˖t'yBUjx!wpq^Zw&B! ?BsL׽KCT_K35U=oYV*{-^ٿrT^!0 ^L{}(;jal!ƩŌMȆ^?`hlٸJp`R_>|빻fۅPB!m%!/>YMpa |ջ0~9UML.&>ӝٿ,QF7b$C(*1pw|й+beёR'1.ɥ%<vԈjN?r89=_qXqo6OT4~'a8>]иa=j7hGO~#0`yU yf{ġC i"Mn<ԥzduvw1mgZAN>טz% ֆukS%.ee{mr$_LƵ\/|SsgrqǗ65jQט,6А1|ͧiMȪToѓiBB綱DaU-٧"|M*}w* F>iSl5|_Q|7T"<9-aP'L[go6.?~.:3XΊ/^%}}h97ڜE,_va1?.T풥0.įH+FMHyovJg{8z+7##rfyc0dUu-_ηqh,:ie=0/V#TOa`7I<36lXʔDfVC%2] l6S+Dؽtvt"n~4^OSÅY #lc/8d(& ?M1®}q/X%czOU0mĭǔy5V]1ڈ_嫾=x0EcKe,_re2F=R֮?^/ LGi}ԝ|JmB-,KVaH*i&dӪYtFab-c1+w^V q~=یu2y>3q=BLۅBܿ $HH )Tʏ[,V9g MSButM#l=uchXaS%&PUkK!x~&NstgyÙK,Wb*BQ"*zs$h߄'`Q+`eؘT~_ucxySucۿl7k_Vg);/;IdTCP/<u]VLP5xo4cɸ}v>2NC4hXPԕ,h.]zxD(_ {9+poUPg~"#9M4]G (FJzY]=?ҳB1(gW5q .& 19/׏Ó*OS?=q Y)7 JԍЩ7q=BWBܷT`.y2m8ٓ@O¹8#FqBx83!19yJSxNopi5Zv٭g~fδy}c\<ʵ|U1< [f~.'/ΥP=-X[t0lAX~FsM)xu2^OzS!B-?MѹH<\Z{I[ ^)|c[/ D%lLe8s0{NdZhlڔi. eVQto`gSuoL4DYPQ$&cX-TFoג>h#'FF'p"O9(< !fԯa.]3Ys셡e]a'WsY,;?lq|\;-eMj6Mrin1!'M-/e֭TX=Y[a.cJShiL 6џii#Օk YҶ 'B6ݹ5Æ943 _}z>4t;40 gҴ:cONyN7B"Κm$G(nM`g'WeoLYY竬2p&ܶjd^7dvƴLQ7Ywǧ2f@f:5d?&;eq\9^ݯdLqs<-BL$!"MɵL4}xpU^օioB!⟑BE꽘3RhJ#z" !Brl%ښOLH<;?x>wnLJ[]ؗCr9`8ſqv/V\t$ B!no|6ط r+s3aWGU/^k}vXX_&Uʅc">yA *&cqB!!= T9ND{Fr5)qtLFW&_o{j֤zg7g DFϏHĐ:3>j VN5՘þc_l:Ϛbjo1W4[굈j~d2>C&G߾z4AOٕQAC6hHͪ(yǬfZթNB.fB!DΒ(A:>q4|_Ei PĐ}߇C"ut d#0gY$3|Ph#jk bL 1<]2bGMoX}@`U!!.-Du}ʄsu&.Ԗy] z񄇆+J~LQr}}LZ IDATTvMxX:HhNׇ˗wB!=*12~~GH@~Lf׉)Ei~P5dJcC+I~o Zz>7lZIgd%g/r=Qz#" BqKL̑cG)P{K$S< &٭ᰞ0yt/wm=&:l׮`5CtiȆ!Mi#͖LOc8{MhxTwbҴP| ]?#/ҷGSC¶l?s).c;Y2_/jjQd:9y" 8HRR[B{)CA]RNP`{K$SJC>/ߞ~ϮVKP M_M~ ƹIBLH:\dP=7soXYPhf#B)4nQJ#x#^Ӑcd7y}Za~vѽgb6OD૥nPHVarF7ͤZ:p)V?b9A !Aue??3Ix7b?% H""hfOk|n/o p|v&EiHXI#?̘˖8+J0NC=l;qS} y5+m!ă@z@q@˥Bz|iuz?m$!B!muͬeLwq?,+@wWsY,;?lq|\;-eMj6Mr>fbC Pr\4|k*uJuky2ͅ-#4tʆzRW+$!B܄I6^2Q(PoV!%["A{ B#!j၄HA!Xח .Mμ\S  !7!. B!'>eBB!nRD!⟒B!B!r B!B$!B!B'!B!B8 @!B!"IB!ԓk߫=ukTjzxy _t/xO375^)?/!Vt¶Xw1McF $,O9zYw2U4#~JƸNɥ=)3V;Ц C7^u/(BqWIB!eٻ(6ݽ@H#@"{Aҕޛ] 4 HG*(n.(>nfvwvv/wܽ ܩ *U\>I@;W `N=n~ڹb~FQ&Յ/O<{2PԞQK# ˂ oPt'(ݟV(ٖ:WO{RǦ᝹Zg(Pb%([ #Z^}ؗV;^ˆ8l/)DnZ̈-^eW~ql[!B<3 @!COdعzުEl3G"Ƴd\HJb쎻8~,Ɓ".<=q  n4ɧYsm\ # 'gU&'ʳB7L_s ]hu;v#;0r(>`U2Sj ^Oڶ/sY=1 wQ%Wqa/`+5r-^AB!S1'ٴiǏ',,>aaa\zONaMGj棸o^ C31q=iOyΔ鳐^D!aMauВ{ 7âIt{GЧzvL*`Dp|~<#V#sr:&[ܘW:1GXLȤ*͜U~ uE 1z ӦAӏ^hJm{t? -~ Lo͌{9s+G7>u=x!qޝ3 &ѵ >Ijz4o4VG3ScsBV}ǹk:}%G3O{Ӧo8JlN[r ~]9p!DTx#k=m[i3`]DUִmlw|jL&LYrSj.6c*\ʄi+)sS z YM^'a7%ZcԇUt/B6 DO}־oΙIzȊΐpe泄эQחХ_(?PY6i%:5{n%&/eвޯf>ŔVSn^DZQ|J~(>(OSV%]^AaF>R7 ~z(*7!(ޙzb~*953N}ɳ]_3aw* r&f& !UxƏɓ}t7o!GWyKҫ%eFS Ft7[ΔPo$ȔM7u=hn l2B^pc@:\AJ}(is;R5yd@ĸSU| ]j ^p9%?q$ Po{-kd#u hCv2f*>:L[2r9J[WI l8+MO\nD Aitj/b8e2fFSv($F`yIUHS0}U/h@v.:fn[M&anr)+*@̘ \\ܗw'yA5G‰0rI/)ixc~N7ǡx[W"oνNpPq|˻uYIףnILe -_YJox9G*y/RW8|>/z$z%Eo@L!Ƴ <b[:8z" fT$ B D8q"|!dqqqtЁ+VШQ# B 7715̥=v@EI >`ҡ' wtyV [~k[L^My啕FߛN)UP5ێ k@f(pOu.ўC1 r:nxd$nz8u;6䍷Fcpi!J3xyЂs[gs)j!6MyK&2(\<>R& 72t7z$1DE?f_AQT4MEOPtf0B!@+2LHHӦMl6I4J*ѬY37oGΜvو}r;P>cI2tj3O;JJ&dV~/b l~ *Nxh(툦D\JJ)`ep '(Tzuػh9'h*FmfTȒ'77p-2OjGI0 ^Na*>S: QhhJ"aV 8qh~,-1$\(U߰pЉ{IJAl0VXW1"`OxW.#oNHj*׈5 ~-=Mcae;^̂YwU+WN.K"{_`1Q7v/XɠD9tCӴiqSڈrWV+Ds#܌}\(_[?,VjLR%oie)`RS/gJ(Cضq=H"J6}ǹqbNf*97\Bd07n$:::Miٳ?vBYnCGOѦMVZ%c aDɫuId:U;M㚞hAN`mq\|^̾w@vRm\:[H&/5AUϳv;VE@G0Qd|3i]s-2 -SnJwƸ6WHYJ$|͑?͔z]Eْ+iPhB_CFNgADoF|2η3} χ89ᖽk+& `Oe̺ɯOCԪI!VݫfFo*=$dL dž蜓C0}ŝ:̯noҬ@~Y0zz'Oa讹(z ~GpICi>/BtJM᠂C|`(4c9SGlOt9L}5oJ-sʽS^I* cf1yJ_ "p"k *9K?(s GI(]8GEqRW/Cpm$:d S%9pqkH ~fLN}!_!'MҒm۾$Qyk 8ؼ6YϓMiYj'׊ٓ  T\~_H,cMl e]5'r_(S}0R0r;FpuCGNhu@7(inH]=nAP =򮢠0t<@Qt`ĔN?iS? :;'[GT,g$ ۆ21b2:fCA՚v/k)ֶn{YRٰbӷXo +c:K.FӽͱM˲Zzzx|ROb7֕c[?`Roh#CǬ[JmC6푒;7б$%RPlW __zCɷc"cJQP5 -aWԔ|K~nkv2㕲iZ:Jt28 gO^!,IATȲQ$P7Ŷn۵KvNɳl&S5G}Ymش53m4u=i;`i Y|.}L,`j| .`X:OZӶ=R_<?Σ 6ίdOz\lӯ;'" M3sXG~J{ϣliB!{=2/ ʔ)ɓ'IHHyqqqk׎+WҰaچVgE,_/ " Tlk0 |فVc[l{^,l3Iɧ0C>B!Wɑ#&>>>M!PPkvBZ OQ^y27ɷP-W#F/n`3'!)D Ð>D{`Q!ѣG֭ gggYv7[$7n̊+przp. ܎!fȾeؾ|B!RnHy7B!m$!YTTݻwr,Z+WHRRIII^nPUAB!B!^.$<'O[o6 ڥ'>>.]pM /h!ērM"|t !bv~BEl2oЎ(P'vi׮sIff9Mڣȑ#ׯ %Ǒcwb(犯!Bb >M}7(T `ԩ<<<ի dV3gȑ#inpt|7ҥݻ73fx`{O#11>I!7@B!~* ^N*ox;U.D,$!ŋ9*|4k,(sR IDATOGQFMPP x)tUwu!/'`)$T.\n vh&MQEIrqqonݺL43g7n"::>K!/EQpss%Gd @!O ЫpwwB`VBť+$BnܼEW )S&,!B2er'޼qO @$d! DGG!_]n|HB!B!NB!B!pB!B!DB!B!2 B!B$!B!B 'a쓈0 &&&> GGG$! "?{V8~ߚN_!qE㷯XNך~Hfm˜CqR1#_~D5QC]J/6wtЯgb~D;Dl)B!>`I=zf׮]8^}UEI&el*eʕtZ g կLʾS (ܨ'jAoshqBO}Ďs- t~g#}[O1ۖ0 .d)Wnt mFVN=[f|==7Xq[mRBOjR,~70~[3ԣR ܀LKIKQ)7~D̡.{. :Vegk#B!?d ċҨQ#F&-88ڵkӥK*0ŋ&o޼ibbbؽ{7˖-Cm:@ƍj;d _Уn l+G㙎pi@5)Y}u(x^J(( /meޒ8z_; 篘WE,7O3 կ&&#/[7:odw䨢$Y9E3))ek|=~8/s7ðDB#b&)7-,šh%~ >>V> ( vˆ>m1*uȣL{A !B D)V'000ͨ~>}+NgLhCn&GQ}9yHܷC㿛.X=#>&K>%p|B}ˆ9RLN #qǰ[Dr lfԕ˒}6y*Yr̗?sX{>TLBM-J! %ʑ QjWϡ=plHs+JτSUhJ{s?GH =˅c>tܽ_MA2Xxb&%,1&rZsfwGQqu CpTb1Au>qSB*8(i:?, :A;'2fS*ȡ=CB!qyV?~V^M̙2\~xP$@ŊUպs~/H}I!ф5rᒽھƙͻj33m G~8( jf AMmĻ5of>i+%*ٮWȗ9\kfESW)fn2;j8xPAwCSuPӦvnLN~`߾̵\e\)O:Ϯ=TЖh.٩Щ)œ'cmŽ1BuKg?]pjm3;83'g< ټ %LxjYr޺$˭yKRO4 ';:$~6FMI:ǎ"]MYqf'Cr{mS%wׯr+[O)sFVĤ-#MjRLyjt[B\~WU-OGnm[Lo¶!XgVoqѭLT̷63z^4o֖eB!KJF@ ( UTa׮]t҅ӧOyݙ0a]vdSD Y1%r( ה=3d)̯r:Yģ#Z[ TO_.)C&cqt5y=,uH鼫x' -92Z )Dz6~ F Ry#:!<4 f/m(nxy+&TCG0c"z hpNU[C I։=؞N1Q3GGG ,H&MȞ=}`B#xzKyTw*Sʶɥ8WOu}6,^8dV%ϖ"}>v0aT1 YL( ͼypU7!slT>;Ě t㢈^TG++f@)trQm/.'{$xdKu2!gzNi?{:_ʌt?#.vR3ccG3SA!I@:?cbwQSl<3=믴%FNct ;X_413[3qRBP||O۶EUQmRrU U*fslj*J(cYߜ4cX朰=b-k۞[FT,Y֎1T!O>a;~%Jg0.1nG#$ $ڽ}ۼ6[_'kputy$}mIҐ $dʔ> `a~X]>"eMR`T'kXrçҬ ,UKS6u;z\ֶ>Z^'~oGIIOYCzÜWI4 ":ř۱ihF-_ 7(?mh)m6CQ XeU,ma}0bٌ=M{ħegF̭*i҄e4P,#"oa!\Cǁ,*c;55ͧB![HB<֭K`` ͘I&H_XBu.\ٳg@ԩS__' -ER{U܊KڟRZB!hOmر Ξ=ٳgmJ~>|^z!)*ꋉ !Bܤ'Z%9r02aoĈ2A!B!E$!( 8C>hCe/6!xRB!3( :kג/_>._|YÇKApuu!**>Y!/(\?DLUU7nLݺuٹs'{͛BƳ49rPjU֭D/._Bw)jx(b$W"#t2!^B!x|B!%2er'޼qO @$d! DGGf,B:B!B!2 B!B$!B!B '!B!Bd8 @!B!"IB0__#VǰB!B! \Yؑ%)Pb([%]O7"`syiEKg$2ͧp<_חҵ`G=[],Ў5kQ`~рvsa t4뵒Il$aFF9bB!! CG4Nl_ПVtګ!xyEr`d6OX_ß%+;4o7R\}ΖI@s MP0\qa8`FAN8Ŭ=XtNswlWY;mWr0A61>C7[ %QiJjeDDNs5&(RX<]=Φ}yTLE!LE3ya,9 N% ؀J*Qn{-8B~7Za_PזCM>}*DlCX=]TD-d/؀JQ9x$bZwn>}էR Tnڋ/`a!cwVԮׄvG7RWקm4K@> jU|Z跔1zFlC[9m_V)KaK0]9wRa_V]OH'FV Dm9M{kK&ԭ]g)߸K[߽95kԦ~~|}2’a}^پ%cnMˑIW3Gsj֨E+z$,|3 Ԧvwl)u82n-SVmj7H3#76\*5}ªKI:(\9][4f:49}w"Nɘ>W>m|}wH84o&h(Z5o˸+4;]YCMiBΧ#EDj[IRFׂU*S^oes1ss֪IxTo5-͛9tg{=dHW8a)NuxFlI([ !йu4<ʭ4߀wʴs { &Xh>=&F7Z'amCͪU\=j=QGLtj6MjPs",yˣSuz H<卑]B!Bq^8GGe#9[нvL^Ɲ\I)z`"͍a優o)Z IDATk5W-ȅ 2Ux%3Z5L8d.L2Y}&fC't&gmJyq59|Kx`HXGJD?gLY\ws *a6ssxJ:Y$ˈ %SAʗCf'%Xԑ;! (U޷>fń((|?D/ÜPKPUjçp oΆolZͱ8_cƂM< ƌ1GļxsƦoFЭj0|u@OCܚGw:/ x)q XK뾿b$uk05k3e;gL]_v5w2b|?ex|6SWuFf֍fUs-^b9| lxMkQn3{H-c9|;Y>X{ [?gMeul>cTxŦ-YI5ʗ-GNw=t37#hipƪO?eG,پ߼ 3y}k.: &tmaL#?mI#`?$fܲB!Dz$fB\/>)'br@ӭ۬SO'Ռ۶MNJꟇΪaDZ>g.=^Mhe!EP@J uBir# K?\?'к7@Ͷ"/s?+u+?Zqu.MV'NtlW>e}]l9W]*ل-Wٿ}TP">(rl^~:?7&keLѸCr\rQr"]'&|辣QT)KO}TO'vlM Lə%Hm)fDjey*G\Q m._+x߳v5ZVɂ)KZTͺ/ޡJ{:QsħT fŵfP,m6TleˑQN~ ZE pNBpb%gZWٻWcSP\~Q0i dw1:ք{-A't׌+ vtLΔԮH[WSB!~ Il KwI%yUw ޠ]|A3{ MmNn,AԠ~:ij>B/OZznkizEP!]]ӮfD“wx]zCB* *"EEQPQA@"(HQHBziK(}^sOngfwg.wgf w.֋3M |$6 i[YJ'Pu-F@Y9O51nhoN+K GY?C|H-)gT P7/ܙ__|~D#BB4Rsg97m͌|Gb)5IK( QwxoM[MxDz3/ |b C>w{NbEZ](IoKfo2M]v|W&ֻ0suu^iuFaPvywc'ĵwoJ|\0,FX=r?6`N 85!7;4yb鶹 m?zP&I2Z1*<2'3(Oֈ@埶~x>>OL@~"\猍!J]0CK G4ab3 w^HgNi`Իh~6(F&#߃{rPpIF&[U0ooDⵁ<1]:My^hZ.\'(OIe-O_ R y=6׼5x,ԎB \>.g0ɐٸRsG}a8LgfP\dRMn\IߏA*]î.̘7֡c.zso4:F1RxN@58 x}u3tzI^FF.,ԖQS:c[ҏkS}t .?@vFмq+/*&c{G3gy?ҕF;.ʣ;1iYu*y|;wTd<)8v/gʔ+idpY`YN"Gz;eC<oG;_p3/X#n/`\8s4 T}{r3 ˿ȴ%ЪN#'f3HaH:%oAʕ--9|ִ_"IIܙN[7ŏ='f@W˺X~ur/xoa>ΡSspC R2[wKT W)JhhW<&?/@XuLAy;7Ǔ>Ts'~f[]cTQգ,gUjRn`/ݜewMH Ɂ.8i){Y&N'Z82zט=mh؆Z1saba39oNI\EXrQc0b@8 5c/j4E1yyxb4=Y'F<4ςwѮK{:֐6XWVV2jP)=wP >&f P说xdÉL6-TI6LFbxy[2}6y#l*o ~a );:\=x`ftYEg{O00CgH&zv"I+нlv {_ڗ|N*BypSM[[-(FL~N'DɗCX_ίqm4y"^<6a,IL"wyr~Χ  ^"`R Bm5%)z\ x|[N풽DDDDr۵喖u \~.v x,^}#~<V wEnd-VF^WdΝԨ^=YvLy}dPGqJy&>ThaEjУ|\M(6u M GX_ydZ+*""7/˲~K^oZm۩R{fy 3HI{9H->=H[N}4UeJKK+{^MBC0DDn TzEjÂ} X$qlNDr^/}UJ*X˼-ySY!""""W9뉙.>AQ$[7""""׎nUe~!""r+"""ׇXdEG,׈ :rR%J-"""י9Lhh{\# @\ Ͽ"""30%44@lFLAAA"FDD䆡/ @w4 \u @U\u @U\u @U\uvQTTO$66=KDDDn1aK"E rϖkDEFFr6Vl0 $DGp!! @ /wY"""r tɒ~ BDDnx """kxuDNs@?rY+oNTT{u!00*Uо}{ *-""""""׀rY3f o6qqqXV`seWmpb5ʟqwyw~=q$3ug3 ɰ"gDl&ۄ/{lďħÏ6S72';t n$VcYjmbyRɇ f-|KԡkWzOS*~?g|[czڏ++l|WgI`Æ TZ >۵k 6$!!!#->>K3\u잙OY$̨ 1}4M!ǩW {b4mfJyo|/o`1ģ8^! L!<'Ʒ\WJ2mfB:r]DA@tߕɋc%06g錪xZ+}1ǼTɋ?`(S_^'wᮼIr8ϼ22<{b$s>:/ICGfK3d,s'酝a0^y2v|yBm60Al5OvĻt~jRo "5)fsrb(Fヌ鋦R)(Ë_s/w{oމ1o-}'`8Mڮ3N78$W9Pn]Unf]UR^le"Mၧ'vL L^xz1NxES5o؜>c=x[4iFˇ1dz8,'M):;v۬_IDϐiܸ1Z?+sHяttlфm &-|fjh3g~xhN&-{ +>@ߦέ X>oIMhQ^d/IGY=%:l@:ؕQ|;Y99үk63`աD"qV?F8Aت׹݃ :>ooضBbߩsO9p^{֡nymUA>]Ѵq#>l9+ i:Zߒ/6'6@e}&= Й׿O>;h3wJ!_<P:͆=}eӞQۙ|];UE|L-'v?%,C@B7n nWO@n] NBrDpp{ҿ˺uزe Ǐ 445jмysrkN$7$~0 c7(ڇ!d^t[˸W 5)Di<7bTo ̃u<~3c|fi<#Nqa7-fBpϳS?޼gasO--SJq=)雞bTD}ss.ј% -.m绋' ~8gZ0qs^Ѓ;bDʞ4OG~*6Jd~۲BW '%= =r 9x=IghtoA5/#9g3B38%RDDDQG ֫cر.]N:o駟駟2yd:wLR9r?J*7\u]O~eоaY&\8 ~߆͊Ih ۣq&ia1!bZH&SO?\|ǑԮMҪ464aE''5b-&hiJS#~Z(_A:еIWa=O׳',2 Y.zݞv?^!(Y31ÆWzYjPY5o#),h 42ύise@'WHGiSoo Xp vD/lnkX8-EB'8t4+䌏%#}>>>Gm8þcĭTUsbbE_Sj֨M>$~8M"?f❜@0V0޾dTa3)=0c7 )r!CIkhm99eS^k ,߈3sFT_>hC8  gx1^̟p:Tx֮ IDATiPQZz&ӱ=-Ȟӌ) ?|6Ug̗p- gP Ldsy`4xZwzGhݡb }Qbccݳrt:9tM4?]v BHv[}ƀj^i t2̓W|:!U|f Iyӄ9D83g{7yW>sb[Ap@8G|ӷKjku%txq=32u?ʼS<K<ȽS, Kf;u( n.KA`p \Ʊf<衐.x*V,pE`?J@ɒqSRNax~d*S/2_o9kaӆ AŪ ͂9LթR⢈t{G&/O-O/f0EC ĢDZv ;g:h;)ye8a!*?=0}Eڮ|u{^nPZU?CDDD ]ƥȕٱc?e\ӭ[7M)9W~||IĉEʅ=p.:AH{vx1o:Hp&/2S5O-aLjsBٟwnkސ/APb? Z pp9N'7X`^I'3;|-SG2)i>fGx3G(++(ʓCws:- $~N$e\ʙI͸R[}h8sT֧*NDh#9H#++ |_0wEfwe͐#{zBXqĘV^68`?DwRƧ.]Ū%|Bx$[Ƨʁx8;3@-Im6 >beLMIEr<\%`cP,vD pp~Z~ +N6JlI_hdvFzB8yݳPeʔݻ׭ХKvI@@{Ҽ t>Ն1)QƔR,؊ay<4< xVSPM-3 Nbh?1 Oa}1ĞcWyNwٲA&f6$cJ}bK-Ѻzdôq|g$xy[2}R{۵gbMƄQk+$C2[Nfs$6J>K_,t?Bd r{G2h{?e]ۄ]St_|e;h"Ln;Çg;dƌԬY3Њm۶ѫW/vR:հa6l{rr… /U{ٱs'5WsO΅Ӗh98]gLh9qXFDeᴜ LkYNR7xs+oOV^uۀt̒*gd|j-Ժ9i-N(/akRk]Թ27-= VH_RuRԡNُ˥$?i4r,-+3"Yj}{39j/[iX?w3e=oߑ,E,#Q9} q/ ϫ|R G#22s8.ynߙuSSDDgYo|M˲غm;U*WvL5A})i/>=H[N,.?i/rxoJ잗rӲP+LXNcaӦMԩSݞ:~ګFl޼EiӦar310mXOdH{e4,if˺r(amRi| %`9ODl&0t;Cs[-=\s&:nKL#uur,SχE쎹|x>?R?Y n#˹vyX'&\N%!yuW@@|g:z^i\۷bYO>d ֭#**m ={6~~~9ީ4;ԫW#s(֬YC2ݾ};spdۿS! .8ӑ y NL"Tn7WǦ/`W/ ȍLvA&MOPO>a͚5ԩS0زeK *TpYլVwq{ɒeڷoaܿuvO\~=]DDDDnv!O||H,ݻwӰaCʔ)w^G bŊѯ_,i""tqR YDD֠\U,Zƍg+iY={g5aѢEa!"KOr̛7???Kᣏ>ZjjX0 ڵkǺu(^{v+ڵkСCē""""""rcRN/ àZj 6 r!Cصk5kTADDDDD&9 0 6lcڵ;v ERfMZhi""""""rcSBrӤٞPoѾ}{ڵkGjWs=T׋G}%WUTqOd׮]affa|_ټysztL""""""r} 0$6lHݺuɓ'0/EDDyf㳤{yyѱc"r墢8~dGʵ1 ??_BCC V/B ѻwoLHOHH`.%?9]ՋB 'M 22C:`\k1<|@ArQ:7nd۶mY95g+Wf"r8~$n/dtɒ~ B.LJKRjnVJXt)~~~Y"r︈d ,Ⱥuׯ-/// a(""""""7 رcyꫯؾ};QQQŮ TRSpal6{?SB.i)R^zg\`U\u @UMy|=ʪ'{eb4oڌ]g'ŽDF$[W 9t/*ͣ['""""7# DD(T*URJ&]?9rzȍCO]-b#0 {`7?ÌCZ A7QedyM؎V']5)0MfOQ,x11ؚЊ',yφη2gYM[Ǩޯ1qOg}L_ҀBV83 Cwn,%z ͠KQ;FPuꔝȆxTAl!"""rCSRclќ͛Ӵe7fu`!T}7E=yNr$cf0L#P>rtaX;5q48e1 pGsRǻ?m=oYv}i%8"‰G>̲!!cr.q;S:i8RjƓQ^3&Q;8+g4)MD|el3 #y3cΦa3po}-tٟؒ\!s+z(Ip<.LL$e\?5DDDD䆠H_OpXVuΪC!//qU:st河 T ++$`x9cc|SCOţhځH`.@ۧOi`̜ 49v(F&utIP<?fʤATkyd>O>Gflr & C`~㭌cpbm".6/G^iH}+ +OAof}9gY5q* WR7g\O `.A1OǷO;XpQp/~$2οY dޜ96AB s@I, | RllICY9E39ٛ Fx-OOlF,ÓeY VBw9J0b1Y"X>E (!"=gx<)uSu -8q[5 ϲh/#G8oߌK3x" +$mӦ4==P4i: ]X;!kH^#uETԋ'gc+5p w0ٝtxNy|&=kD0t/J:6~WU N)""""7˽˩\ni.}iI_v_97Oe2e{}z;}ޏr:~6!]nI-VF^WdΝԨ^=&cty0>KE@C)L\u_@|F$N!hO:ZF.x{lPjkQ}/l8#sinTԝO~VC4UEDDDc @\ӃbY$tY>σum+ѬFQ BN6eƣ94N{ݔ#yq8g8;cM 8}J߾l3L/tđoFEDesIw̲~`!=N1 <{+7 V 7Y?0ly,2Ӭp.{vfݳTӳEDD䆢5d ?!pZŊ4I֣#͚6i p+a ֌[N8sC4مnC4Z=3rj:@[ItZ8Wiޮ;C&2.q_1Gxi;eE_3~S"΄׌&'Ilݖ`zGhݬ {#ar8u*ѥ{ x{TalovL`t|W['͆-6gL%D|4*=!5V ŲAl`Pa%tɍrO.v9nG9 -kEDDDO|VuY}dZ# hrvŬWiۜ8yJ*bmV{3pj^D7Ðv@/i۬uݽi=`&fB!7B<%:iު7l$eg|ˢf@-{5<ݰUXCv~ s5=*`(M&%(M ,]G<e}'rssDƔ-oo Il e]03OQP!M !SR#:.f6Z͊˙5"#]SJIAšDq FGe) ]pV]:&VM).fe%'`sC A3b&TױB"eZg(bpMBT:k3 Xcjڛ[S{j^\.aphM=/CYw(Zr47='ah**`޹@bϝ^wPwg&jfB!x,BH)N&,t/F\U_Jꌲ.Qt%޹m-&TP؉Bl,C"8lХ)bPS-;hLr4Հb~Յ1 7BE4-;q)eXße(xN F~ʖ٦0KmD!mGdĄ56δyojɐ'= e*|n0b~9KL+?W-Zh\\9 FOf 8cnT:Lj2j_Z :ͫacU6ϳ{,MtWszS:(jI!=c8<-Y1Au$HHLƄkqR4݋YKqU.F.ر9իXzkzv;g\o#ǮŐ)2Xx?/B!= )KO(`}z(d2cF[<6.ӯ;S5#>Ϛ{ w*%[tj|FtD#:G?p*KTɔ/_FC[OƷwly{4]l>0}'$<@A4tx±pՍcFrcǴn|ei+({m?eګ܈mQkJ>gncǹx>g}1iT}̅{ jJU/Pk (XR4n]ı=:`ʻg.B!E}v&ryeg}q\ ٖ-gKVVV4nܘ@ڶmKR̋͛7Yz5ڵ h^͛7g>g֬Y,Y2[ !ij޾ qq*`%B8 'Dܽ{ooo.^hdΝڵ?N:1|p*Ud^4Wϟ>cҥ# ~zٲe nnnBgWN2epp B!҂_*m @[oqE4M3UF 99Exbx]vݡ;Ƨ~ڵk1L :d:/_歷bʕLu"ij%>>,W!5`o_%KXyxJ$!̙3[.sc2Xf у &PhQ"##=z4 ,h4>v!;] T^<[ rrt'CB!_K"ߟkP ((ݻꊢ(@UnݺY[B!B$!@I7EQСC̚5"E̙39tX[[Ȑ[]rB!B D(Bh޼9Jzd0t`kkȲr+g,B!#onnn'NX~gҤIN>>lݺ"C@@K,/`Bbb"!!!9ַ+uϖs-ͳB( )Y$N)77n̶m2QQQZ.]_b=z ))< Ç3n8Əϧ~i9ѡC͛GΝseXz5QQQ97%[)!ij*&&{T< !%66~ A!ʼnٳsgAQ+Ə 6667ӧc0̋L^ %:s̱\XUlq+SB ^!*ʖ[Y)x,ڵ&Gھ},sιXh *ߟ1gСCݛc_aaa߿bE6mPU9ą/n޼Iǎ-z?Rr<{X!B!=%(EQx- ޽{8v^^^,X k Ç7OŅq/!B!O VhQƏoۛ1cfv#11M4$͛kBUUƌwSx n,iX~=5C2_A!<ӵt;8B!FO1(C43<2 EvHc֫Gt_xE I4lЄ?^nD4W:+@.c(1M%# Qή'b-sx1<=z'ZԠ9t"Р~}j7K9`Huœ@ M+ ȯ[B8B!1o QQQ9<9Ӗ-[7n\A={bmmleeEϞ= "7[C`ȑ' 5o~ϡ{Xzr;up.]5GBY8sRpIm7ңغ^Hb}iszfvbٽ`*.gbg%Aؤ/8PPJt+/c L_sypd}.^7f:B׭cCu0z}}>OKq~|9'c,B!ijE=z#SN5hPn]6mD׮]ڵ+7oA Ν˔)S̓s䣏>3!``PQ-LJeo<7L Gl)mW44=:߲9<QwB+:h>vs#k/բЖ¡l@-U?o<[ \Iy:a^8͛;qIZCзmK[_zJ67`:΃}8xӇHs4>EMJxlKIoX7YѰ15vNm FnO굅KNV tN!j҈Ot_ISep4=]ɶ{ FmM_O&39dzbx"4J{NL-iְ{M 8r<==hа 3}M>v|1MQ߫#.9GɷFf|3oBOKFZ+7eilߣ\!TǙ?#1x`-[fP 2|ϟOƍsf|rh4ϲ0|=j/!J4K:&XuQ8\Ǯ)d=Pq*Հ2tkhNY݄0q1$fi\X;:}}SZlZq~eԬn"r øBY5.3>.>aO|ToF#?R YӁ|-Go(J /3zF?$ȷCsx{i>X} z/>b[63UIIKt^ޥ>d,ݶa3#m \-|=/A:M;|+!ǰ#Mi8|[63y!LW3fJ1x^;*I=9u|jbu 9d K_fQ|ǚ?u{'FJF 9nӄؼ1+J.-)<1A߄emg/r`fN@ٳ( ظkar)LZ"{o\6MؤZ\| Nؓ5xvM坯<˷h`29 :ŗz/mc=ȓ,#B'2ydժUˑ`2ի6l0ʜ'BU\naaaՋjժ#M4L"9u{gQ?iǍyt ThG=uxߋ⊒MgS ^p`EݩQ$}'gFhJ lJ<2BpǤy{Pk~r P 4Z{[#GB{umBX;R/^[& %JS6l:έD+ʼDGC8¥+RMTaoQ0vV6V)f ]YZ lԈھ=%3E)TE;Ҫ}AE3EqղMU,$mwB!3oR^EԈCΨ܏֡ j@ӳaz M`O͑lB"CcЇPµN6GHi~=ҥra0\˓ηv+#XԬ VvĀ^4p&0"8$fzPɀb%|6~h2zzP(eHܷxBo xlȟ0a͛7ۛ7nKIIW_%$$ƍl0gtBbby=˖-cǎ 80GO5kp9Tm !4+ \Ja>BQ؛Wg!Y)lH/`(Ղ# z;XQdm=_Ǹ}HS]#E}c| IX$'$vQ>#ŪC~sQsLax m$-n|u1zZ _,OfTu IDATdpVT Ow͑>?"7㿓)T{?4Ț(ʽη\~t^5 ywP Lg(ERY;Ӣ".XbvYoXq1DD x|cL1P%>2@f!,hV%`L m &n Qt0S݉OP Wv.1Ҡ%ERXIز߆㋤l:[0x,nhDFZ5GkM.ܿ^#E$XaP5R2#j܍Z+mR>P])Z$V * )e_~^zacc$***G">>???-[FV SNǧ8ٙP*T@ro8sLt]>c޼yIQTVVVe^Ǿ׳A#*Z Y6qPrrt|yWg| c0#Iz~֬9DAs%}TN|&֝ǰ(\@TD4\:z,qq#()Ύu&?k8%?Ow1-Ŋq|%'L2,茋K1ZY{& ԊS[fa g&dXFywEp;:8eB"PVgDQEs)Y+dL!Vcml0djӡ;GE]Sy;jy2#~U;@33^Y;i-&L ӨPz¸~'JΝ(]]>Gb.|"ݤPFsLOc{ȿ!BKv(Dn޼ɲe,~0aB-*UĪUQ ));:'D˗ӡC\vvvX"w&L4,]ׯHLL-Wk~}!c6ժ 6f.cLeXG7 ͷa_J/N)^y<^mfDmZBصD4RoaįÊsѤzJ }9}#`\ %1Z/a15P-:w!G怒c|psFO ߴ8q=6m.%zQ$@CZ e|xEn*W [@f4G\+1F@K \OA)Sakn [U+jR/Cl^?j&\`D$sZ䗪P`C Zr-WV<-ewг^-:O^Ȳų hX3 d@mlȖ[`Z?0ylw2aU@{6}w3?3#>G' h'qDZ| vQ!BIB<5k֐s:٣!crŋccc,@rr2=z`Μ9 sҽ{\]XYYtR4i#GzrHMMeڵ1rzf'S;4«u%Ы /oeq׮a7|4u{~L<\uȅPnKq ӼVwXx{9=sILW^z2n9ty=޾hՓ[^3wX}FZoL*ݗMxpKNz!fOMhٙݻ6VJa<{x4j;rͰ*kStpO_ijlPk]P~roAI- P ѫ'%w ãQ QhP ] cEqtzԣzǯP\Cy [/FcT 0w W暮d1^·;"=Zӧ9>=IpaoA&{}v9_bḰ_3>A hfsG}6u6:' ]>qGGB/i啖yeGysQlVٖ3*`m*yF`Ǐx[zGk=ErBlc˖-9ϧk׮t]gٲeyN"*#F`ܸq?>-!-0w\^{\n,Z޽{ņ 0r6"$̓cǏSn\Fr5L!P35L:ћ".(T|]ͤTh}d堙4P3e| =}_܂kd(u4-m>Ig]"'s%|.%q ?OB7rz֢ d+R̋߱ov^#UZ Xd6 *^4-o)'YJN=xZ+C,O!B2o`{OjqYJOJ=8Z׵QYRԨQkk;lc4/<G}ͥ~f!BBwRTTUE`PQHa@ 뷻E3|h89q{ ~ydMG8ļѪEs`Ogр _}Ӱ)oEm'1to݂M;f\׹zh1@&-_aH?1uͼZҦglgDy -OcHaXs|7h kaN ZˊFl-4Y" `E© nׂF h4oFFӶx70x13AwPϷ'î/$K߃hؼ#,p223e*8v6T!O`y14˞$ AGC7U:O,bD7lB6/tУ3/}_"v`G郎4Ub1]YǸ7لz 9+S4-͒!5ȶmܹ/'ijޝJSm9i_FU ߮J@ ;Ha;h>o;c2=GhżQ|+_N>OCRAR~JbIlPpx*ukh\<~@_P%[Ӝ 9+S"~z~Qd(ڦ#ZzF 籣eI}Jc(bJ}=B=ƌrv-)@*gNQ]BQ^_nRdrߵ3 Dg\^-Gjw Ҵ |١ձϫ` ֤s˒͠Y&/$ȷ :% RpX~? Yj㪔'l|>m}Og۾Wu.ZnЉX1.!?l}9&T|cLepzg@R~Qo^0kvnaJB!ij%3!&P5EjyP6nk=&U`0`P[ 9z59[+lݼiHuẗ́^+ﵩL1NߍU%^֔ JRx6@amdWq[l-nV7FJтK)TZ4VȻaaI9 j_&tL\A&?t;v}h_0*VCfX4);k`t*CujꔰUP _Σ Qp-[ PV})Y8JփE١(<Ӎ ( @7aKQBTHyK#88?@!x8!xT\dA6`P4R5F"|/^gfFZr|Kh,%j2 ihFLxoO+*'8Uqm5?wh;8b`8~H/mJN na$<{ƶ@FĘL]K4SU{dSP5-0 NYP)^2:?,`3Ыgл})moĥP6B韅v3To1 TmJark[ `"3fAZES8w 4"#He.{/LKI4P9>+/Nc xMfW>ƍ_0ߔ@麅q<qiD9 7sN"ZVz44磽)h5u )lM!MqcLŵko5ŋs-OUx9Y8{1~Ĩ0EFrq<6Y*''&=w T"ُI-ͪJ1׌s0^!CԍAMX~! @!?vP,ZI"8lХ.LH k[)Wb)88SF;~= f[AL=e=z2Σ;13a|Q|lߔ>`V4fwHMV .#h ޫ0{fo4#I%=Ep *N((XAw[7PFW?"s Ig|}`=5WW2z J+ЎfܩЃV}&פ\uˠ.-.J~n*o<m|7 -sJbτ :<ݿ^IS!~u^8΢ B\>yPqmOffeb5@K"/HAqQ/It]#׳\c(S؄Ѩ&#̟s#NnXtttCZt`˜8r/v'Ύ .\&AuP(y &t]OӉٱD ǒ_^»s78{&/U(1Ttb klăkdG`u􆫑skCjM#laC)*rl͗B`iXsxX/:SsZ׳5dR#_ye-{zB^? Źb& *'-2zb4IEP ;ol"py,JcB1e^ MA4Owv[_:a$r -~5o[C9Q/P'/b:L/Kxo*~5> WqI;5mՂI{HRڤxEΧ'xʐoq3%ܩ336ڣ <;m#%J!uNf)ujA4 HVeymD|F+ ɮ۹ l卪I564!hULxSz&ܞ~#Pޠw{^vE@^L>0&*śR.3s UkuoŐ%ygg`B-Ĥ_ð|0-֣{ MowȋRmQC|4zٻ(?ݻ@ ޫ. "bŮ^E,(7QJ/&$_v\. E)lrݙYv3oY .ϵuTͻ*Q67LӦyG{R^\,YJ5j(,zФqKzύZ_GZܟ@kqݽi݁ (֍G{ځ zb:I%nEfhldeّAlgxW:\ߚF-zKsGAVO0M6A<_K~U6[w[wz׾|':R 2=9Nd=ho8 g꓍ rL`>/"""&۶Yt oڶ5Pn浱>gwY}ߺǻluߺM݁ |mlZ.knʅP]g /Ίd_W?jMZfN];5=:Ѧusus㲻6Gm'ݻ9=֖(_=y7=lM6ݸ=:%v>7Ƥq 3-7e{2ޯ׃PnٜVW{{ѮukZvϣFbsF\xgc=coFnn7v ݟsca|5in֖ZיuQ"rӷ?ŢBGz[G ,6#V4F{œysr`(uܳۇg3K'7rb}syi}-z6 gEo{noZWRT.1] ndR׿3y f^T>>6xv2q̉gcG7'x}Ql˃kshq?Y?,~?qb9 [xΧ qgcBDDDDDD.z @\$l4]zdݴؐ{8sۜˊ BFT8r'EE-|8Vpgh6FdžQsp"t[8 57ҰXΠ(.m׌rwLþSXNg!mBٸĹm;0\wksJ: +ہ--_GlfiqpTm($([W#e򜃈\i%L_C0mכ~O;,ܓ{x.VWg5n)G~#!Nb]YnȊNZ~?Ɔ 'g_f$11980XkW_[|++y*Lui8Qg8餘""""""ŤP3j:M_Bئ$1fw秏ܲzY8 +']>կ\XQbxđ [WPC<2m8 {;&3˿hup8co9uq1A1ۛrUFEbekpIl0N#s5#7\O`Z+iFpC4oۗw 6BsHb3#n@&iQƭ:=!W_}޹=o3+a3l_oZtL,ᤤ&E.99dl((r_. kpk;} ;k_pKuc)NR#u6!_=sEN$1)CQB"##EDD";(QQ fb6BuN~od[~ﺛQuߺM.|mlZ.BDD{QQ_[-"""0L2' >٣oöm͓-**d9Gh93N93N9~!"""".=Txx8i"""""gMjJ*ar9DDΦ%J2K-""""rF'n/J ̒LOEEEcnBDDDD0 TR.\80[N3 ND98OEEE]P_?(""""LKv &3N93N94 uq[Ic%YGpFF] aefyJ9k,!aLlIX=F): >"""""";?lX'>^= wz e=񂖔ľHKK :(pO"""" 0dDEEfiILƥ'|IܸʗuYS@ QRRSB9""" \RRRٻwg&"~vض9bƩ.伲oʔ)Edd$a\"##([ ̒L= 8'O!dEbsƓo{CF .Piil8GD,rvӃ!IWj45?װ{糭_a`k9K9)$/!.l >!>m:Sa&]%Έl9Jk-q3>ĝ/ UI'%į]oPzjCDDDDDDN=C+_=|<7{rI?qy-wz ?fYȝDOa{܁YbNM 93uMO^YsXb'{O gkxN!}@DD.2!JZO[:0i'=um=ד7DDbeӛ&,0(ZZ{zSп[acyML|;᥼y,+Kz P`\,}oŎ뻫:!,ϽQKdޟΊjxnT #0F|V[_Kof7MHfڐLn5/EڌG賬.E-yeN^x{vv"|~ =QTis#<':F ةDMN9hUI``w%3ѰUmBHJLb期Pf,o@۽osI̛?;+`-_ ׹N5:w9 99;sR.#goxWMo =>7[nC3mLZ/?˗ $2oMF/8ǶION1 ̚Ȱ&X[V`%Ǐ_a(F/8M7:_\ LqTDD., @YQEoBb&PHL){?,җhפ)5EY{<ܩGI:ͨFf )߀ ^3Bp8 SʦŞc3M7yiQSwf-gaw,b͌9oj ݨe1|AX'+%2"EZ^Mʑ9)d }oaҸ|fَ ^BABKM-w& WQM\U93r[ՠ*,ۑW:V9K2^U tFR@W> ifH(IoR}?fph`i9 L=͏tdݲ$&xy.˙ȌhѰa'iI3+WEG+gmMFpvb#%$s8>iE]+RmeP6nR80N_oC#آ&G)(`_D,l+$9'#b0}?rMz%DA9kBbP8{7XȞ!&k34<0[DD 1 )z)=j˜GW+G?{WdԨg)n89d gGPhcQfZ0bl~ob^Fl"QT}&^%OWUk7>-⏐eXG8oQf\^I%.de~S,YI98NE$>W*)ȅ)eRT.{r|KޥD|.+/M^NjjTrZ$I"l F;:ƙ sÿ`F0Ec)^ ^o]2s1~CwA%env%cNS#Kaʖ<9x&mBI.OZ[#;Md9 L)Cֵ?j6Oe&%FHiS_l"TיafeCac3 Ძ:ЦCG[3*!ӭ {kxn6w0@VpKOVP@9 Ľu+:+|O-13MŖ~e{Û#M_bMXQ"K6uUKA vxa;^=xBkԓ;XTDD.8'3r_.f> [-&.}N9t;/=v׍8Id9 G~,\?z !oHo4f |:4ֻ_iؠq_/""4k_Ͻg0[!3ɶmVzuf6|= X˷=u7|uۛ曒(]sizX\DDDDH\_6U~""r 9{f$\b5s\WADD.t @a$m\F ؞c?χAp43ۍ#+޷#~\/`v|4^Wq6C=ÎPN=.S Ѻ<7q#,_n͛SPDDD. @HThNpӰae^0s-w+Wr{6;=eiEϼԟ~^8"3yEj`ŵGMb}RANϓ+l˃{)u,Zk;7>HsY9,?:{m[-eڵ[#_#gIJ|>;ǑߒNe#(!aP5D_֜sD]֔m|?ጤ\^d,#O.iݦ3= ~WW4oӝAf-#Fmu4>FM‚)|5O\]S_M.f5k;qtCֻ;M߿}ӴI |XY;7Mv#][3͇L'X+/iCZr˄8ܶ=gk{)7&wN'!sFOmiն#~oZGXКz2/? ^hse'zsfeo{<h]~w'2ɮt}z ٙÏ1s. =0yN4iܘf=aG3k OɈ 9E<ߢ{X7ᦉ4{HԵm IDAT3kwVNOU&4nw ~ ,nf>Ӹeg{N9:<#?zMed_Fh$.<8FjF1a'hGSt~[s'wzfoK&h&osAowS|kvmz{t^ܗm[ҨI[z ֧d_ϮOE&|$:Qteu_iڬ%{凲ɽ>}?y?EDD?DwP +Q#c/G^wS]A޳28vjкQ1LJ[G0qlLFÝ1zvas+n~vhߓ2X>_>+2Y,_0qzM<~Z> ỷc'Ҝu72qR:GOgyG/ dk>c6g,~Z:&u}ߜ%xZ}sd6XC>؞1s1\%Gmgņ†zŬ3ѿ ͑o06#oO6!pV#;y]RdbӜOWY/#= .=Xl2_Ϋ/%=waqY,9ʘ8bqH]ʙygc7ݓ=oMxq֡ye sLoe_/F&| ʕGɽ"""rFiJ9)Q6pFp?20 |88:˝VN J j#{F]AXs0 Grح"&Pm.G{cS$Sa#x}4JPl[P˜!b#M;poddZ?v MJaa}4jV,//ve1-et8tR_΁ֺp>?}3ErV%72{QZ=v=@!j\s]yٕMt.ZCNoѫb]2bdj\Gѧj8ݩŏ,Hw,]s}0j[7,~,#Ʈ|Fbи D-VxCi]<Q5[$J]`s >Oua=XaI0KWl`> |k%cWTdCj,F ̷{ Əy6xl#Daw,~۟iݕ:"f,z#,mqa27Ġ_xs-\.KM~_̈K O9+ -"r0L0b.iOqӊH蹕~xK9M\罣QRΰ~7{Q&uIs q{sMi_z`fE"83FN;Jr}1-A3xa`(?P;ʡ rs;|(v=߆&SwcTsb&+_P"&aҝמ1"+V6>G縷yc}lLeyn$%J^J5X2yh:.29u'G0vhFq|(,oeO2iޝfg=d:H.m`)SkYlRM}ޏ#(}%'E.,%=`%v~z$vgbbL7D{\Iʔ1|u#dqK 4>*Ӡp!vk_>>%٩ChzUR& qvf[7n{AӮ߰9wYFrzv`֘Xu lZl-Uriv)Bb|'N!!Ѧd;m+gm̉GS$$J;BbF *C{f3cuI~NMI5@?7;*"rѤ))޼ Bu[b5:8K]Fd}{?ϞfZo7nk/3XOn=I.ݩf =%x{7ȍ-dmPPG{ѢI :?{0uaL.mᦱl 7ǚ́r-yhbm,~\?r~/m˄'L L[_:֯х4/ {:܁V؂*hW{ܠpGuO)=ߏvZҢM<& j3m\{I/?BAZuO??}'4\DM.Wgm/eߥ!.:X&ʙ÷mB մn٢!8pMr&ﵰ-㽖6{?l/W F5=9^?o1;q庾=axq{ ˲752 >>f\a}} 6m05˷)""۶Ytf@ͶmVzuf6|=C@L7_-uw ~uۛ.`_9ٴ\ɍB99I9d7bZRU0L 0040*>qg; ȷS㟖Z^; @~sSG+xc(pۼ/|[h=|'3o^|3p"""C+"""""""r)!"""""""g"""""""r)!"""""""g""r+"""">SBDD{ᤤ&BDDx`ez ʔ);T"""rKNNa)S&0K2 DD_["""0 "")]4Q fY\"DDDDܣ9 DDDDDDDSBDDDDDDD8 D.P=eHDDDDD! @q @\&;m3':EqCa8 """"""rc8/FaM'~iYR2 >̴8hebJGR:΋dÂC4(A޼SUT3ٔ]WruP*L6rUV4ғy`0/3|i=)q:k2Im ҳX~n5R0|8 U@Rv]Wg|ؚ \kp|(wس7,HADD8K&:**0[2 .$6-p -Yܹ2Gpgp6Lb65LXo0C_+EYnKmnbhzHWFDVʨnRL-GpSY'E ]yLyr{F"WAï;?mFzCE; D >-N7kYXn9E y,\]o~"OpҹF8=cD; R\|.٩H=A)Pbb"S%DFFfE,99m;(HF0 ԍFR $ptrqIˌ4O` T% a@!$oI⦹ ʗ1 _ExgIOfqX8OUspHyԽ\ [5 1(Bd'BB.^[|s*AnZo_8 `X9_DzkOO/:u 5UϿ"={R"""GBTX{,S,ɤ1푽W͑L,~ؒE23|E_~h7Ӷdq itr0 3툍˂ tҮ/2٘ nv)L}L'-[3k՟D݆a6KzpPmg o[y,Xk 5,gRSSL 22R4S9pLvD-s\63;ZVoa 69۸m6 0 bCL׉ EFfd'2-}C7׍m̞ gXWW yI F\LIv:vƽ05"),>-cwrm]%2&>''KhAѐi9q}\ nu )5'8dAT|V""""""r\'/Ȟ!!OA䤰AA]MK)adžP'O<Xni^5CAcQܬ8M+P90MjU rߦn"cR=E Y`9,̉)/""""""ǣL3[֡l kS)zE!>o2Xä)8k3C$Q&!?2Zw(B dyuK R) 5 ql=fd&֎`xp~ݞɼT_םC6rL͓0r7_<ʬ|˟9.-ĸ6neC>'%s""""""[505j5e-㈍M)Lo_ƛ9C(V;jzv-V?EK}|r3imel&|:Nݩ<0[7/qQ;om;}g vuο#W~Mϙ]sɧ""""""H }^)Lb '*cIe_#.>O`p!2  ޯί.p鿚_yɟbaנm7>W7HQcZDDDDDDΐO.6>s3+>p/Js_e`kҞObeiܰ6~ҟ_ߏ̂bmA-h\suJ!-%znŞ/oӋpkv"Kϲ0`>@dϵ'ZdĆ|a]toلMOX|ӷM㹾hTo4o? Bk|9^^_ [i#(c;>euzo~gÛt*k .~y3:guw{&&>ُ֍PyWn~m.{rm>;֡ + f'Ηun7X=jM^.ḳ rDi<ӧI =s4Qt%pKI5]e!O?6?lr?c Ů_d]_^*6X;w<μb7Xb)lJpc28Kf?j+41'?`瞜OGcd2,N/Ά/0k*ۙaz&99iFѕЫe)uSAnj?h9i|˝TX8wN?Zū:s7;OC0ܗ"9/'d`-p;KaÃrźD]=qgSrCtL)gxNԻ+Wx簯AT)kw2sm&~w,r-\{ ˿a_&O-YQ jŽv,!nKҟ{ApH,-wULDZ%# :5Ⱦ>܏TNFۆʅG) {Lfqr;k 8֦MX8簦 n]P3 ]suHųgs㆛PaY:nΌi GDDDN DD_HݳӨrBC;q Sk4ޚӿ;;YyϚTߝ~?֭G4OXO, bq!(8mDx>vJ6+l }܍rUf+ߧdsVeUdг87e^V?N;Pc/l=;qU*Gh*ڳmܧALoJH*^I& yX{~eп6RvPYg,6\OYL|z IDATwD~2fc2<;O1v~sC:akn"*U,TmKYvxe**pRjn%`dF @)s-4Qƴ^C:iٓYUt,$^O:36}{۠\ǹL^ W?2w61(i/#q~b[L!0?9 6{dA#sX8i1e:8e/MAWcAA4`E)cbğ(jhD-1j&c`EDYsܳϞ;ewf |ޯ}s{gpwvjȸZ_^z_1Ln~W𶔾?hm՝3R]}J]7~udBzkej^fi'{URcM")ZQ*uUns ݺkj*WFRͻiK  5y0!hN-^cݟfJ}R=u}5}4묋4㳔Tntzn5E_iwС;jcv꫄"XRk]7P*կXe7Pݤ VP 4 y+y=szuggHJ-/kɜ4~m>#ӟj M8DU<|nzyn딬C&u\d.mR~1vsٚsv(_[kgѴW~vH|z龇?m:+WѬ 艟DW:2m ĝ/益Ia_ֻ/Kޙ5]sW]+UUʕZ즞]ڍԹ 7 ra|7z(ɠzK'iܐ^*Q?=Fek[L*WyJ/^}Xp?8J[Z5-R^Qݻ[wuYƯb [uh~ 'Z:pNgfL=|hmLl}L=xO4b=Isŭ{pY@%OyR_|94uC.]+_Bӱ޿kzwԅywUi?/Of<Di/?3NM#b .(TG_t}ܥ:CaXow-~ENm'NҴHHJk7pDydZ?zNM-Lj8jEkK{Ne*Z;vGj&KZ\SK>_**RR%_O15AghDR;vM翠wVC6P}NRR"PZuThH[IHӂyoN @Kd~fO*7 г3U}k8aXuHe!Zw:~ú~O/.-}V)Ѻөk֕|7@(RZ魦F)I~Az.1mt"[]_Mv64P ԠA4dAeR+虻t[ɦDѨlӣtDZT=:dA?ʹ[)/}UtY=5M3OCW}/=6u˴:j@E|ݧ!w)VcFXm-~|N Z_uyӴ ; vI?[.Gjڿ~oڴpNg:sU_66>V+СN|k S6m؆~O?R OvwC/yJNA9pzvQ7Zcwk5RSS}z(Kےx]TRˮ\[9J=8JdQ =K#"/;a /=ve (ҿ<)I ^ooS3w|rS'IKoj|ʛקtܼ}*)0b6ǟۜk JUX== j4 @рEG @oG]m@lYznhcN@WQQ/Ԇ믯={4X-[V/TEEMрtz}˕iJ$ѣ***T޻MрU^^n Pt4 @рEG Pt4 @рEWjtF_>Z*++m z變 )/i1Noҥ|l!ٳMزeD#NEk|Sm-ئh@:˗G6 Iٳ/_nhc4 @рEG Pt4 @рEG @EK5Qap >xME}Y)p>lo8l>b.}\=t8>r' iw{ɺ?_)jzjk-Ԧ[n-^?8C7LM+h}. ~^ orm6b4|σt̯˼WYW:j6jn:؋tŪsjGl<] J28y~v :{tVIҊ=k9B Ew!Y@g5K7>$J%7K6:T'_{T*Zos{kZ>9ݣ8\.WžUJ^'K]gO_zMi=eLecom\Ȯ^_ =M> р^j>{iXvf?6+^yVUcv~ڡ A[3o]3iÒtpv6w9M|WkGOkSyZCR+/~het]4ҷ?Q#й#Д)6otFJV @GUjL^ptUuFԤlJ\ :6BuzR -j fjQ챫b:^^Ϳ/.RzjC~7PI믕곕$J}o.nR}Fu92]pMٻ=,~Z]:=Ի:?J'n?ASx|٣$%իw/%~%qTYzy;*UYUk}'{Kޛ5Msw7xϛgTR+t?-]%rմC跧=w^J=$ Gz :aҫ=rk$H4䛉} _}\$g:xzUlSzxnMQR|=74Fѽ?Mi ۬YGe辧)jړ ?O:võ咧+}p 5 ){;h?MP\> H:΁:~|f_x;tY/Ѣw^ׂ#~f^vnySʶQt^99Pm4P ԠuvHEͮ_;5i-6*)hg5C=u]=y 7O{s }n!RZ5ժVuMS:iɗ%JU+V^Rv=p>ot>7^2O_}lS*i^௯iEWsh^i'l3tĿ蝕Uh)giA4?ꚵoП;EkL/XvBo?>|ѷ?>P]O ]7S濢-'\ %耱֩z[}"%觍ՕW%K#μUׯ{HTSWnMИ/ڔ跗&&HD}͓ÛVޫ??MS|R5Z7V]+/ת>P4NSp_CRB^{ZO'vRQP`#..؟P20NH*Io^ݖś7J'^vgxф'WS_j[[gK/iĎmsϿvD 4E=i8|MIjȿ\ ~{*)&:IR]zTkS޼>=S?]y71M[vl?9'XB (:h@_lBz6 IZR=ztaRЂjWϞ=mƖ-Ԃ¦h@:>JHzw|UVV4XM% ]*ۦh@V *//at|(:h@]]u]mh3+{n6`hWkE>ҺޣMEr>xMh@hW&.xUUU,P_PUmM#]J4zA*IfT*yiɗKT[[kh#]tQ*Sv}D@;yOIUJ{ov}w>>cM̛?O5:tlmV潧yi!tuZM5io4zaÁ4ZkZz6̒/hȐMh>.xՒEZv35 uc;݇tdUڥĆ9Jmmʺ0AYYYk uiStEYE*hBըv.>Q)>jkSp\Z֠ԵFGj@z|(\\iՑ- um!:5uZGh@&d[)@!eAկRnki߂|I4Hws]<.VE1sfΞKoLW}*YrjBԾ9[nA<'Y~8>[ ר-g|׷ZuE!`ܹl}xqqPmMga5$uiG_UmuO?)]v;N[Rt9Gh}>~I]߸U ]F:C,lxEZ͟q:h&{Sj#}߻tj[^^5kfݦsC~nXbT[ʪ-wrKNZWv&MVII_KZXmja]?WVz%vGzsp:q{kͷ$ 6L]z&z46|3o6 Oi3сmQ/_y R?/nG),uIָg~8Ow^tz2#==9G]^(RgF]w=χtUiJhע}tܪ#Cj$?KιW\yPw|-=zg]Rn{~]_r]z>:'XΕR\H>k[-3|Cy̽I>X$VS])矩z_dII|XJU˾Qzd>}LHit+K(A56P&/m<܀fRљz}۱{v# khy-?T#ѿs{|T:SG ݺ;[GКRԄQ󿪍VŇRlOe}kvZ]$UhבCT"}E:f*Kߎ2 ; W*%zhvz}EE+m=j/cdZ). Vin`c;A.=kUUZS;]}锉|_iYJ)6W&[={r$#GTJrZ{`eQ\K.aoieuz`+Z;IRe*9G' ޒ>$eԯ7t$=s>K}߷EkI\]tm:V+ ե*WZsZ1W6~ɒJ)tyQHIDATv_H5%ڼ*݀HP]ϛ,Q2U_b֣vn|5V\+v½#Rx6go&6 *))%g3/BwxXS'sa͇] 9QmF}5m z:M]xE :tnq˸;ȑU2Æɓuĉtdr-7n\Dk`XM,]5>_,=x+)Z%KV*RBK-,WEyQU漚y%}O]uKgw/!IR>I}bEZ&%%~; We]{5uӫڜKmkαŭ\׵X.޴|h+5g:=Î>^NXEIJ _)Z*kUlޜy-}X ,hB==A~L\v^;Ʃ$ Rבa]:y~qiڵgl@TY^5rZ ۠-_׬oZ/NK]Z/~?Jm>l1zJV$Tz:I4lZͺoT>>A.]~IѢlCլqlY[4|"RnuBl<AX]6j&DOmyu:kz gWWko:U-J?~Xx}?TD"K.Οt?$yď)HꭷͷܬmF\ )Ꟛ1gM}O43\7z>tWEk쨟Vۆ{瓏6e$1kT L*@?|jN{&ctٗkづ7]t2p~kc$OL5מ|57/DqJ1daTÆ6ŭ\-O]Suq1?>'/܏yVDR/ƥfKN)gtdr4ɕzjVg{ta:|Ǎmyy:o&6SO=]vņH3fٳ$m4x#;pl'9shȑ9)^xĚ:5`-%VR-7<&\#" ]+wPC"Xx]4O!RuqLs(lolJX%$ M?^Ə)t Wzת.lΥc!KG+Co2ͷZԼ@[qh\mN M{5 r օ>n8d:/dSvu12|+j@hf۱]ڻ=&5w \hhٹq7vyM}z @٧Ck۱\ Ǭ\ lB/<{7vsgmhK?ۺ5>;±iD67l{7ζ%i?)W hhs89vޮ:Z"$tn_Ą/>/c+T'ufyu:h}憔襅_hkk4K![^=5| ZTjjj4|ær/Rد[m]kݸϞgmH;c7ڮuM(-/ߠDw/׹FUytJ]KRA0w>Z'P|{>zQ!]4b>6LEźO+/$D;*++S޽:J#ʶʹ Ǎ \EV L"5Aj{?׸Ϲ} Jt(V3DHRrHh>S{T3J$}nO%%%ٳzZԎ:ފb7 ̷n~B߻xCЏ^$A"Pr)/)P"Pyyʹϝ_yp?ոq{sђcw ƾj@\4nрUf7֎M}nl&˹s7B loۛc7[\lH$qu;?&ގC[ +no?R'=6{ P6u_ װ?ۺ_g羸4E5"5~?v}q>Y?O@nF.܍3>Ƒ-hVunk[umӚaքbR~7~p?z5֫)osJ}܍',uHkolM )p=jն8U[D]p{+S>f:p[Pl&O?Oꇶ8qy&ɖ/b7 ܛVG ᤻x? ~<%$=vq$=N;I JXDԆ'H(5RSƃ1Wʬx8N.kZq X›۽1œ^5Jku.W⍿wڵ,"7OH*IKsOFQ?'%%ǻg?ŭ`VWWWP q_Wtۂ=|7!n~`T"pHRۧwO9'ʕ+k1{TBw>?nþ]#/.fn}/[O@"5-܏ƙc&(sD@>t.ΗswNp(I߈p9ys7c@ruۇbޯ m\jZCsy摼ɇ#oP<4;ـ.N(oo[co~B ss?ncjh.˹x]z/5԰5<>Bt}m,<_O͏-?QqMsul͕qV+f" ؟rXk}w?渧sݤC"ΝͥM ,?@Gfk.˯>s5 |6jÔ:&sq1{_G9.gʵj@D &rR|.IO׸?wD6RjWRjk&X"Qz7ɖBaB>T ;w?_b~cE鵶W\ǖ/j@8r+z:ƺ}6&/Rc3 @%G1Rױ?z6{#uƎ @GW u|q㸘??b~܍ycw\亮 ںӮhv1snr("-)5>?!~};{=]^]B{;̯BckB@w  ܺo8Zm\;n׵\[B7Rswqbu{\5S7bȋǑs^ؽG68$\- |~{XWc\}7I~_J#5mHVhSw켐Zt\ٸۂ֏G-q(=>Tz0cwz5m*' wNww-wn}6oV(@GuN(&5ܮw9?m5 xʋX!aE^6'\ޮsۘcV)TP"5/ݛuq{ӤDz ޏ&k(=kۘEKij@D 6n> w|B'7vO5kD?߈ptޝm.}c>;<ͻ|~]MBTcvٱԴnqlΝxAUŠԼ v1s71iDz,5mBqw>Ha's;)Oxyjk*El޾D &5|p@ i 5<yk&onx:[ٹ9{7\bJ]X׳װ1ǟۜ{ɔkb4 i+ǎS5z54 5PCc!21 R91v߇9\̎3&ЖB\xhή7 B"HsLc en@"5/m.[Lj~Cjl &[?瞀1&3_]CP.N(@Gfk:)y7P, m,SϻyXxX(.ګ8!.4X_jl2D]­qsuo.fsZ;vxH>klIZ?ZG&56bIKS!.7➄c<{l+Tw*ޱ=2m,{?d:Ɗ"hࡵbcxKc-c{;s^O@dv{?./~ ?KL&ۘcq8@{uovкP܏ٜc9F{7 "5-m)n:sykmL}r>{LL9+PF$Z?ήsu6oqqB|b|)TS:L5\4ơ?ֺׅټlq?fvnM L˔Pq}qlލ3rرls+[:lgK͋l>[.4\s~s{\h))BΗ) P}h;'bnuvMʷCE]#5ŭ9{lmyh]iM\^ ]f;_| xٸ۸voǾP<s2h B1)\۽c7|h}w2ع| ]r|ׄ6nX;~s=>:-U@ȵ vȋٽiq8Z%-iAq{r5:~υH]+5nh2"S=K9M(ݻZyhm\ْ5v;~Pk;qyњc#hMm Z2>C &g(Ts9g.kB]#5υ6Zi ƾBQs@> QƝ58tٽ۽/|q>wM륖QK|;q͂i]y6gm^ڪX:s|L L9_(gcvWT۸Kᘓk|6<\纮ڪ:]gsCBkB1_|MKlDže;\l>omY{Bl&y6unr-s]Cls)ˤ[|z)|ٹYvKoB:Bq mCBklΥp,|w}@ȷpwL(krPq]Xe2CP,$.ט$c]*U{|;qdZ)u \ L2PL?M廾 %vKq-T<h||:q*ےcZ=R t|\...eO Lť̹\SxnkhqLȔZtLي3rs(Erk^Gke;O'ɧem5jyZslAt"55Z+uR~k[VEs>umrњs؂jk^Wk$>NB'jy[slQtⶵ5hͱkMqޚcsk Ep^cΓ^6 ~=^S(-k-y #&XtPP)VHkY bbj+vc/UnVt.m hŪVTiF{u݂[ :kYG,;kjխ ^/c[% !@Xm !qX P\V4Zmqc`E_/ݞIENDB`kraft-1.2.2/manual/images/de/context1.png000066400000000000000000000354521467704360200202320ustar00rootroot00000000000000PNG  IHDR(" pHYs+ IDATx^w|3+zITPzU" bCJUD"JI@Bzd2l 0~uy3gϜ3[@ @ @ \|$ԇ> '`$0UZxA]s{!RcvZmwi:u AuWSע=O~ ^ OgiP[;ÆBU$ݵ[o>, ҭvGq<+^ž,m,oX0(]ta̟֬ADE_BHNiz~$0͘c3y,?ܳWsP{=G,wMdw[ny&6.ȚyeɏΖi3`XjR?Ĉ l|2K nw53+lߋn?)y>Ŭ! 1Ku4}?#fMFyyicҟ$Itܙ믿ONժ^H{Z-NP'`0T2 µq&Ե<*f.`XLiCs㳈nb[>V]WQGOBo=?׬…L`2I6ʤVK8fJ3TJcx4X=n^^җ_9]O: zo-g耙tU)^ @n Bxmݴ3Kȵ]]BHT6>\}.;Ug;WoL$,~,ݚY͢D߳5LńoLܖH@XnY3Qh2$!2Ʉ$#QȮP„6AxY4a oדVT0fܔA43ckʐ-KN&[iԥ"}1|ד،3YE<0 eK-Ldh/EGO Iuhn.:w1~޻9,$!K2d\z:jD4faeqUܛy÷'[FW~Φsjˣ\qR6K FD 81L(6`'jQ2SqKi.2qzY ξx^{mO?=.ΐp1VJ^EܝEqi;ЈPU J^hgBe, =Az]7/'^"b+P|ʛ|<fq$ɀ$ \ͭ ֗/?J03J'q`_{| x|Y=1^gtPe"o$o7,!|l 9&r> I/DlfE)%`S:/L ٚCdrlsXb2 ?lhiZL`YAUvc3f 1mTȑ#yV};MnY*a 5Bܽ1&JF9dF/KY ?7goeĐ+.w|:C>v{nDFEZPx='bЇ᱁J,WJ8sx?IQ4 Q.ֵKaŹw^$nݺ"Iv 66 .6Iq ^t{ca.gO|%1x%$s ᾁ@1;؛RHQf6%i0c(9w}G8SFN]i僤{~,}16Ӫ N#mP Ͼcjٙ.-OFt<ɾg(n؋Q"1U]J=M ˛Ƒt'N hѼ9`Tm(0q "D5#;SiDGI!1#k1дʩASthLfmp[/kDE矻QY9zy6 8~W(бC}3BkߓضEd&`o[=nUU PurBJJxIa--%~B&tW\UN۴M"IwXnLLF>w]ӧw^"S̯^ō 1drNֺ1A=ވ3>> OPPƏgϞ=jQYdXR yt? UU? :kLP⌏qhӦ }o~oߞkݻw뫻EUe ~UA1O/k /Nnjٮ];.]łdbҥtܙ&Ts5i4:~A2lqt F cfi6sAr5S^E$YxƎΐc> =Kyrΰkn㱏wr$߽0WdI|N9e_7a#{[I2y>~4C`ݯ)jA`t /eKҾ}{-[FpHH?WYt)]tae(STF-5Ә_{]N@cyhݰS|Xr(`=ges-{_>N銿$۲Xn=_=Ӄɷ'+?S9[tVoȚ 92"P+='_gGi4Joo{\r֯[ƜNxeWTJN|첵|}nKvRhՁ%=Ǫի  `$ Z_xZd(-+&Ҁiԥ"}1|ד،3Yz| B`oBbhY=[ey݃OtJ*|ϮF0uh 0mr[Z#;b3ʔQQ9JnBz e ӄ1:')se1&,~M2ydOU`X NgT%:SM`djeګ|8= OY(8%PkY2i_2!aXd$)T¹tԈh"͎gw4/#sVH@ #T*EA53i(ltJԀy*r8a寍dEË|bj|-O´W~T ?^M `{Ho]a"ڇ3r# W%QB ,1mhIrMLͮʘ=,] jq& c K~H"_3pyFֈ&oNntԓٗ^W_IڏXw&Ʉl!`29# /N,|) Sc&<2twNrͷsX1A!mO;Ls%GLቯQT9_i,1wAO䦘e it3Lj8#osx|l̒Lp?<{+#\౷3oT:iievu[=̛;h{.CqRRbZm,5㞮i }'D|R}FH z'MPOΎX,O޷I55a!7yq)$/C@$/eb<0b},~`û&2n#H.E%߾kG0x(&:ʢm_Oq 8qw-T'O*6UJc;rߞ~/_&~{?WViʢ-_?_yq.: 0gTu'_> =ԚqSϬ.!2=F$#Q5[u K0(m_5akA-9$4y2Ə禛nbٲeeⷶKz3s~d cƌ~c׮]\uU,YiS/y9q^|E6lȆ?>?8gϞW. 8wM~~>7Lld21i$ؽ{糧ŷ w߾ۏ~G39|Yk=[6/ z!μ<l@_DuG,wMdw[ny&6.ȚyeɏΖj5{f J'13&m˴aΛɕe!yRL 6I k_0=gQΩt893%s7xΑ k;B>mH,} xOb3X%~w6%u,ŦE/p_#WNeW%oeI+{jzNEP- -|3ݻw( v[jW_c VG(3?X͞.\gBI]ӏ"`VŔ+o=49>x/־#>`xq$Fq*.\ȔX &d^*^^΢6&޿{g/PRc/Wh&;y+bv*霟Xk>lCɹc/l@_7H{\Yʛ:/JַJ>XOfyd^RŸ^olx3 ?]SIDAT7}eN|f'@%gr?6i&omANB)?>̨u-|- Q:MdH9(2QeclZ'uxs MDŚl~3_'j-A|4}6$[trTWFf߾}<#XVzAk#=gv2HS9@@%/5΄ Y{n:G_#ODWgkl0Zhq{,֢導*gf4\*4@H! >TxMMaEq+yPJ65?AE^Ӂc'NdU"0 <ҏco{ޛ^k:G01aqPsNpJH|N18INNFUU[!;-Zd1@T8G(0{p&D5H֑xKPr0{!5U" 󊐷l)Jxs X:t@{-rmt4*ޡMܳ# }[#%a '2(R-Ŵk&6ޒZŴG8rc!2aۆ$L;%}Y ُV2m|w:^'%b|o֙u9$=B  Ct^J%5.t>:5! ʼn>5^'%"Rv>&08y7IJJBUU>^ 5b֬TgnPv44K8M%Ԃq 4~̃\&1EqC?<?/mܺcD DK{גxUHqW~y ԼDf߶hقsq`3b7 M9޾0S8R|3ݮ`H L'?HHi@}\1PDɠ`3JQ69Vc\ں?qES_J<;Ҍ.W$A* iܾûbe@ :O \Ÿ?i?/GHJJg!"='sq>|.a -N%''bW(B\\M6=gŽ$}L>*e#(/;&Xɗ]lށ}l߱QWأS>|$ >fZ dhQsuwHxФHFV]GpFNh>SwsWBlOkB"9Th5mJMiР]- )y 9p!q1H%ˢЪd?$I]Mx.d&I#Jь"ZDNF}U9X )r 8BⅥ0B{mkɇ`_dU)ޮ%s8)5' RWT0#,_Om>gbsꢶK%QMD6MHj!9'doR %Ava;Hx-to$䗂ɛFXa@<~\Gn@d0)֒ל~"9OelI.-lވl!y/ٖ^urNΧ}<8 ԆkS&:s>GӦM+읖B9'fTw|$X+jfZ8i][s+IR {>1ۿ: Tܗ v-nqFD|3f(N 1PΑz%$Ii]:UWntі\g6 ckQ.Wy뛮9Q/}p׎6.q hּ͚7|p)wjr6[ C/k!Nq ES 0(BA @`P8")!Nq ES 0(Bss;cPǔƳ` 0 JuQ3Y}_?E^=`$Kvq=r.i [AJ޻6/1 |pA^%Ng7f:\Ům<>>"բ{͕gעjs M#VL~nlki༏q!aMu9@DƟ_D.= Ur+ؑL+bnSNJkԫ-w.zr7xΑ k;{f J'13&m˴aΛɕU\/<>2JiЕqw=Tr /VO3%ɓ뺠zZǏgdbSOѢE E\w&&ԯ*}cl>c>$3߼>c?eä̅g9ŴW&aWns4n}k>h;{)-& {G5^8 mG%{+Aw%kb~Q>3Xd_>ʠ'盫cNO&'Ӡm Y"./wfNJdO3|]?Bn`Νǫ˙;(f}Cַ {_|)bWOZ ۷?C;:[pʹ#:3,o pIvѤXDҺe[!لiLl,񺱴='wvu @cȠV%'~e\{Lh 3anߐ@19B/3nwkMٌtSba/z]]CL rp_bOXwٗH3Xc@Q DȠ.nW+Ijw/0٤I|\Ktod\9h"gsN `cyx$^M}l.Тds6?Ϩ5(ɍ螧"6aDd2RܹR"EjX %D& CjdDj@˱OX&\֚~]̿a$oJIJ8eB"5ɌIV(V^ePw 9@ zɀM{9ey"V.{ղ@$,ći-*-O$E9B$1|d;,R.;LԀt:w7$5' l8c[bI.c;uySP''uʨn@oG엳Xƽ})ŷ=}&7AV89Jw@|"%7ّ9/^W27XO̢|0Z 3m?H/ yמ{%X3繳7uc(3g䕅p Y6fc ?SS< o]"TƯAGnh]'˗.iOĝ>}ޱme&nMLnwHh"7bwǦjRGwe]tg'8;"\hǺcޣz *@PߨjLD8T;(WcNy]]W-Jґ:&\jTYZ+܉Mt:?SK!mY?K:5ɔw yy$$ḍ\gygex[:O6'}e[@@i_ [ZRľ@PP,윜yzƳgϖP>sj7nj^[ӑ׋T+NHM:9~]j, /eU}V/ gra9~UӖґ:|%uJ턂Md,H!V>/8Ù*+hզtHîkaA OGgG׶@WBp&HNJN+HegԶבw\ O38KUegy=|wޕX«,睕+QL0R TwUv;, PkwΛ0fP(GqbĢSO={tK{W Paע/׈}}gqe]e-|w"sŨ;*Y}Wbte*۪:@ DȪJiqfsJM~w媄UY )z8TmlRl͕jw'u'jwV6t`;ۯ*s@P S;JȪS*@pp&M_ $L0\̮ܦ*@PU ř_oӗ \۫.6cwfR_ .Uƙߙ o9>.q'@UmUODUUQb=O~ vt1J@IR/' ]*Mʐ(–u}T@l;E 6-m'z'X!g_SWHv$_-K*_۩:IhKʊEymĭbPV/z hAq[Uo[1E(XTij=,bqEu}mN,KBQ>Qd#&bn^*`Z[,U([ bJ0$cōes>@I}i>d֜|2%~å/bp5S︚0t}|0bCس Q"wg6L=JT7o&ԉ2ù$yQ4UMQZ $sWi4’mD8¨۲ NpSWT t:櫮JPtvvO.OE59N@FWOU4lLԙ,r4ڨ)"zJ])*:*Jl=_plN\U9N]P=Cf QROJLpbs8_/|YAq#h wh:||A:ŗS0bOY$+*A J7k6ƥB\A\M"_gv6^h(:{:Miáw+g9f5nv;(s*G=oӞ&3r+ x.+_ O㊺6)S}hs((4>òQ'J9S} PlژN̛_agQ) *Qv)o}ZY||W ]q\(*Q躆n{ L|~^Ru/Ǫl[_gQ!^J {=J d%oѢZ*]NQbcc޽;`)уA$##5:2V0ޒ/fpb/#oL1w:!}A7\K#}~uߑuvĎ7&1OgoйnyCק8W}:l޼mۢ*vgUtT<w v͇tۂd7X7@(+Ygl|1sSXg '5ipMBH tAU9DZ9k 5KYq+LJ M_;?Fjy3!͢0W9 `y̜5vܥK9X% 02s'+mwұh#F LYjZbx~mY^d e|foy]Ҹ_*W-3p~;Q߀ȫF΢\eߵ#ycRZn̈́ l9%&3 iܸ{j%75d jl=bN,'ch.~壡<{}y$͹Y *.N̶c.ođ~`Ҡ c) j?rml Γӏ+N|˖-$Hxx>֎in K|:Af u\:{q8%-??×gӧw_~%;>ϭ}fz ČYS:J\)Z*%,ٹPpI>K^p*\!-bUQ~I%;T r"H{$5)#%x\R㑒Kj;w|Ɏg8Gg6ƹ&\Jzy"zN!cǗ|c,3Mv=ï}SlXhY>VT""B wzN>믧yf̞=M~!--  %,&ҿyw4}3ra>z_ۗ^e¬5|^;&c{Nb%-{3E<;?}3Zqi} ݛ^Fв}74e1xgwpZwoڿ1pF\tX<1<=5ad`MMNWfܹ8pG}Gyd1cB6ѦM<My}һsCT $fqyA?p'^i_a?ggyt}%vb3z~@"|;$ C/*r0KrQi Jf5}[*ADi`b?y A>g먪Z4B73׍fܹ0DJ[edW}7niF||#N_K܃JdB[ ¢IL}Dv[GX bΐy‰Ee' I{[_ZĜKbPyvc%`Qf֔O>/vvl-aaa>OAnE~F^夦D+KyC9 gm~ Tzθy}h!Q}D$bAߟ&6Ro/E +V$s'4ܲj" uSjH/,b^RXIe,:sX TrCD#n7 1Š<([bYReO,( >x[fcbg d~2 <ԼqbYRRXR+-\hl*főXx0bU*&)2ǬƱ7 +Jm7H IJ_!f)VT?cb*Ip(`ַ1 13%?ŘXx<@V13%U?bx%TD$4%cE٢n_!BHzQ'܁6@/-vB!HhU w uj'*1 !BBqcJT;e@0'N{TB!H6.INȃ[iEiQmB!S~iUiQDEmܸŔHu^!BhHnun17ny;Iě_*=Pw6f,{depwݞB!ĿE^͘Yvc2ǢwxK<+f,Zٍo9XcB!ukb[vcD+{,/ ǻ[֙uݸt꽔t;!BMIѶsw̜x:.r4eƺX3?޲N3"̘YVB!bq 1E3"̺xĚk^`9Ʌf+k]g-Go>l!BQInc[V&*^HyēOn\zOyM2r;k]ƫ+D4 !BTd,G֫+xM$u^9^:|X ܸ`6ֶc̓⹑& fYQqmݶs]b&3xŅB!DheE\bnyիumxm[r$ƚ vI&Nrݶoj]_Wk$*G!BeP]Ɂ265ne/΋KY|ci;(5)0 ̷RMm=8DB!ET{չb>Ap<}i9^1-\w+{%/76K610s rYgݖ[-nXd!B m&fO*bz\u4וX̲DŤ,Ks9P.Ų3u#m!BD (Mm=Rk8F,RVge/ŒfIrM3O_m U4z3,ǣ4 !B J3h6y^o.ǸNͥ֌$*'f^9evկn1sm13WUuB!f^u^qpR^ZrTf\*vֽ$*'&~3p0d@_:bf9RֶV.D#BQD:2ۉ6wÙs;rS1Uun@8_K,b=^0nKu} MX%Rі+%|(6B!SIn㕯zR]\5N?zu:NL6f[=Rvb^"GB!74`Tv^IZyzL_w%3zk]/KŌ{{)m}TFk'R`m0n:=n^I1ozFپ^}-u^uB!"6 ګlơxZzM.bM1h9zqӗ[kGUֿ*Vvޜ$7WS >YQhWeT\SG_7nbɁuxrB!*xrc9fYQfy.XQTb9=>Z ;/v`\[Zm݌Ŝ#^lGO:WY6^!@mo*qEW^W\^7_j‚Vgm1c溢י1sݍWWFjSɾ6c% ?*͘Bw!ʓ;tN k^x_\ '-j£&5e}¡zWe7یĭ-sPRnsa{I7ii[5nu#56[q !B޴ESSk}ӷPt¡nj§ʉD&:X\ΐ>iPb9p[*m]x,9ݰvUojDžB!؟,ZzC*WIصQ6gE 0 /U9n%mAnezUvobH}uXX*&B!DE`a^j9U7L_MCHNJbUf۷#7/55uFM*l '5n_'"mRI< :p/z'),u3oƗSq$lj[<ǿ`0H%dg[ aON|Mu4*9UχeY\4.8@q!*vmZۯ n >{Ԕ+Wѧo&kӪܶu+&Oz;hY}q4lPknwG(^=#kӚGoGo/=ØCi߶r_ԨQݎ'5Wh}kӚ)u7E/Ksѹ\y]qsf,:+'b4jp$Uu e@>R;dRYȁ};!?SBOKߓcFQ}ҢXUp`(eYڛ IwrxW}ص{7zIJ,4jȘCyvҫ,cƍ毵 hڸ?~ه15W'wÏ>K~}N8hڴ:UeY1&<G&<]f:1z? bMUBju+jݖJ,fYV U^XbnYOm仾 쫙IrP=IP>"ZWBTHm>[Cx梱T>;a^{psC{G+({R{קE\4\N=~#??8F ǎ]=_B`M+.[GBres̙/M~l)93N;1=Lux;tŵ>3ء=@x;g UVa欹[nJ7l-xXo:kW]J عk7^}0ؼy+mϡڲ7+/{%̜5_Rp܉Vn6^~} ,xWz5C!ne$;SzZjٳIo ssIlѕwM~gР~=^}Iv;+c!bV~<*.1= PlQ,+2y햛xd,^DǪI ZS3׸mNSufyT&/6W]I)Ш[0u2pԨä`-7Qzbx烏bA!eQ^=.rXff'΢%Drsse"$+W)|o/4&%%koqfqP(ck{ޭ؛ _Ƕm \nΟk3k|ټ@ iڸݻ!ݻzX炶 Xh 4nذO"TPtԩU$+8,\ǞzQn ܑQnⱧ dv"sglu1~Vc]6&v[7&~+.^wJ{uLm:s;:-:qe7g-4Mz;ؖ/BH(<ɱ|POmȔwɋ8`ۗà++6,b/֗_<?֩͐bWm M3NTZ`?sksGѳDZRRرcg:@ q;v,xqy|p~{^:4kژ/6TJN&Z l¨ |Lkڶ䷦kn3+W g~Ƃ| Џ#8χpŵoۆ c`oV_zQ^ݺgdP^=ٳ7jrul߮Ms<2!wm"QE{ǁG?cM&|\B6WOZTܶs׶^:q1TY2wt[7gj6iqʕ ¶opŮ qr_j`WK̅vb;wd̓DB!ÆU>Gs:qLn 3>N;-'y@ Xbk"e3NOϿw}Zwͧ[ZZ:O=" ,Cx%΄ϻQ >VjjzZz:sк<ԳJMëN?mܴe} y{@ygrGq׃A&yG{r8FOņ7c.IZU Az8Î]+۶y}\q nr=},IQ1՘M/;.nK,'R71:QfY̥MS=˿mUU'Z$էHi [g[rVt {qGrVtؚ5uulq9i IDATFx~_2vS\{Ζ8ض`UKܤWH(=oAn:C!RRRhҤ 7m搖-.vhٲyf{||Ȯ]Oһ'm["8~ZҲؤ¹OzŏC=7Հ_W'(o?qiؠ>5WEfXŶ;-bYRSqlvf͝O&Ms҉$|>ZlAʕ_.M5IJ,32ؼmiMrfUԚ5ظi3iX)z)EdddRV*Rk:DMK$y26oaU\~$''SJ.|~"Wv3^aL"} I ]Mf͝OMs҉c͛ѭM6|O0S EK1澇2iXڈeU%Ų@Dl̓ԡET8V=xWue3oKz4>t˖dULJi٢p |`l_o81Ӌǟ9s8W}53%af Qn'Ɠg}MBΫ% KytUgђe<4xWQ֡O jbj]ՕjKy ߉Hy浌_)1gzY:Rթ/*3S|} -{rř[ :Rw͝m8N;.B,}AWe$0~}Y_PB!9汷Dxm=-CZ2FQ#-M^q%Z}Wʘ>i1ˑy'9zL$W=%0! )G1_+5|أѲySV^c !95cD*Gۯb^w+[h'@)*8. Ur5v.N!U5fP&Rd4m;v1gؾ#B!G/䫏XZLM+.΋WWrb;P/kG\Wb)Dr~I|>캤ͤ^+cB!BƲn1s\Ж^Qn1y q+{<dE*us[ǣ?4'B!DEeê_5ǸncaeXe/$LY94u¸ExI!!,UҴ Ŀ^4Ǵ>_M*+bf]Q:Q_*z\?j]Pg^>gQ!h3!DYǰjcNf1ZWy61z^bJW6bYzYuY.6Qq) !BQљcXlf\wrRZnw<ٱfZ7OB! 5UcZ=ͥYobᵮ7w;1nu_B!@`S}%^.zs"1q;j-n٩B!} k~¼;B!@Ʈwu=Ln M\3OTnB!BqMQ,͘b򞸸y3fcavTn'H!BE19601+3rn9f,+NLu≾B!Bq3fcXrbVf{̥ZwkG!B.XFs[W iM\bHy p!Bq qۚ1}3EŚP~3u[eeV9fxb(fX<^hv6w9:>g36{8w(>s`$զE9X]QThW}%s \sD2~zB!"pF1',u^,&.wˍ%f͓F|#MϼYfק~n:?1j'P 8Y|+fӹqe:!^Β%Xa@h/W.a8(k8-V Kxf'^bs 2o֙71䤦tB[{gmP IT^&;ѭɜع>Zurv,ΫB  ~JZ!iqۺ{o̍o,1+` dF{lg,8?v:up|i8vhм1e7DG:a\:/]rH {9qiޛU[sr޴v!'ݫY~+3f- N9.W;2KhYK<`V3712zӠuDV!(V?%3;\̲yMf&cӨ[_7M*1+Xvk.}j l ҸMS* Zξ@7+OY65{]7O;вm 1h=;=9uu9'A}Y\hMqM}8lҷcق'Ĉ;yj %Bq 45ˊE-h[Y囼XVx[h'׌%v1O IJmZ+؋ŷ#?@} _[Ŗ5w~pau吵a6|-LZMzhXz>J>"iwsϕs%cֳ> 7bdZh(?cUc 4t"sr|pcNo\m&x96/|[Os mW9<,G?gKs9R\/i3~e4Uкk/"mg ; "clj:?m 8{g?M׿owa N3췱zN3#b/}bw'wylq}v[5k"#^]D%<43?Y!=BvG~ոq. 8YfgYc>r>}uΞqtOgP;}}6RAD~춫=hsM ;r+Ox/㦯&ydR/q Av/> ٗJ9ₛƾf}y!|Ύ "v:vҨSOԗN5O|Vo_Gȹ=S8K^Sd|\|9~>wWs2A஥|V !3cjיy:#2>&KHf5Ob"(άO(˲mPW.a!8g,Wd,xh2y;~ύ|ڬW7ԉ?d߷ٻyK$Si{b/O0#C^ܟǜwQ7N ~Rd=>h]p7-aI>y~\  [s}ϯ}gel֕ '/ƨ;/TpM?1OiM qw0,AKwI6sذ|)KXgӲK]dI |ZNW;ؽKŻ?cPybǞis\ _.gRÎ;/i.|~5pȇIpO.bS#WN&^W3psN}Jp1L# 'hnu:2yESx3f=}4gGa+ ̺͗95~|]|V+X$m2,N=kB Ϛʗ lɧm3YƢ#.ii6y sκ)6N noIT EX zZ/6e|l/1=kN!~ccͲɂ?If"Օ6qU"Nybc{pEv”6F \_K6b@ 0m Ywn-qKQzA=LMJ 9q%,Rg$ɶ w;N5}XŽq5j|:k=N-P߶!KBܞ'<5`1cvSS|Ηl΃'a}Rorf˛Ȝ9m9A0q'.NI`^¼4sSɶ =P' <(WtqNq,{n;T΅t{|E X<#m1ED=.K(=WLxk:V x/NK3mF|!7t̎iO3,f;lf-V{yݫr͹pӕOpbޚ#,dm|3n4Ej)rcZ͇A;]SO_Bd 'SʫxiuA<Îm9\.@z2lP??l<-pVMzç?.={t |&^=!!^֙Dʳ@(߉K1Ep:YXB9Nn|}*Va`Ӱ4.9V[=2.=4][eYض6~m=-]KỪ>vgn"D6F 7E6tү}|vݬuܟ ܻs9&ryT9y8N`=4U51CaYX7K̦əsa5ÃX ߣH'85ԩ9ovH#-/ b#ఞi_Č+X]QcĪU#Ų}\88UWpe!g2$&x$ e՛wʿTrm^LÏVkU{uNݥzG kiKC҃gp;bznXm hMWUL@I)@^n:V~'1,Z1%qj:7JyN\Jʫ-3:+`oc}9Ysl4nO5- !oD8>jx~^B䤱uQC^nN 7;MJi[)4n\c ̖\p ] Qn>-9и]l|X d [7m%88N6f 8<M^{H 7=~lVJez?'u3[:'+q\y^R uz y۵kզv -ۇmYX؟yEv݆4(r)ɏ?`HNBUn%aQN( YNβ}|8X$cfװI|OfLyw>5i;Yk˷̻w"n}b EWqy]ٷҬwp \LL7D(`>_aϟ痝` 0D T)~$tJګʱGE铤he$~ 3+v/vObȰ4K*wvC﷩c8FfC+FbQ=_; S0oc) mORƲY? _+!E?). oLn1]zE9NZ`L\J*RgzթYN?0XIuߍ80* 4i5k[EhaY+{D!ra, GM\D +7cUY=Y!p:ĨOh'foJ:*cWK-@m[weZ吹dM6FKf1?C{G;w5/@a]v':7Ab2B eYeh(>)%cӺs9|0c=y}İo<~쩜vh\Y?8vF4R }vGy,'?3^eU^5st26rK|GoI;LUsW!폯y("%Q#OM/>`S7Mp*|4?g4#m&c8Z a*QYu=/߻&OGuw^Qo4c s>w q@X:nn/HsYǢj2k`;o_rB8v5:o ! {.`SěE?x?\7IF}1yVfB+h^-Nj `X' ּRsyKG]hŜrDK$aaR6GG&1C5v,EeERft;w4#Wu<7BzwjJd ,?Uk7/Ң̧5%'G4O|Dۤzyn8;U*ՠAq(.V+9nd>ZMxY\udzL|/W/$7^QѫC#R+WM嚇^b #o%x%a |%D'AbyDޯeq7B$TX*X[WLRe Oe7MX}vå~…C( 'N /7UcnZ:Z<ʿueN5VDXXĚ zssl̪b,myASьHўOﯓshl.k1d*7jL)p HLxtK]]sرm^#sxl.ϯ|Ο~5]B!DEYx:qITgvіO]3y슷ҋv]T laWx!ROnT,BDyU;Q:qQy qr䥱sV8NnW3:?*$BqJGS!',JEybՖ(vnH3~ǒ5ٚE(uvਓrhQ !B9MT;e@@bO8P$77Nڝ߲ NYC2nx?7׬ qQr_ޗ-u$B;p<}5o=s!bGّԝ W~qmOrqk?_أ՗Ls& 0դI|(NkVgU[$pkQw|E] {.wP@D@At)@)J;JAz-Hr]>yNٙ; 1g5UY NhR tFɇ?>@rZy]A՜e\jyCPgYޚt[|$M?Bѹwfw#=~NkR@oc~RJEx5fqRn /Vzdfd[R6=#cjpHWMZ.uOR!ǘqG]ȥM9\ sDj9ZN:ӖM[hjt?dFהQu1hO(QPG$v_$%%/Hgu#l9Ktj1q7קFT<FPdWR_ C[:yu -b'X{{gLz͢⵩o .siV̉; pa~-;ϥ3pYblbkN$9^*$} ?q/v4Hv:у{;~>? YrrCr5*gC;ȑÇa~=[.*-Mf[SC B(s?4S_⵨ `Zwj&T |.drWxvh#{uoa?ͭUcCf)I:+.v\~2AP^|/:+P!ԯ\.؎ή9[ZeAt)ۢzb9q\QK< d8f~§tŢx|`fC}3%{zfF z:O kʠQ3mGIz“|tU#/D}ъE07b 7%Mi fH(w:+,5Cm/Aehh+"@}~U_/d$gb! X ?%_v`c~}y钃1}1R @zovJI?t1[-[^="xJ@z˫>e◘f>VQIS,A*zCkW{wp.^2xPU|E~,7gt=Q>u"Wc4!ף-+TFt؏{ y!KC'tZR} :4@A=9Pu)3R9÷x FJV+:"GQ]A8ךS⭾9_ü/a/q\f=Q9{Y_^{bzo3gļ֓bWƌH1a|5w'bROƏnJ-PtW|֓%NPot5D,g⽗y$B4452qrfzʋhԍ HzmMSQl/s<4]udS܍u%O~|%(\йD }z-|Q:PK3gΫ+jz~ bMwuU[2沟F;έj/L|ضx?H̦Qk[*3gFN܉EIVҵà%w{L׌'v<+͕8jZ/y4JEG}qdk6&E:AK3n7u]κvIܰsc'N>,ټ-;mc/0j8G|zc=/(=OM SutϿ@(f_-owwj>ţ[T[;NW)@5?Jetƞmih9b\p%T76p',۴] ש~y[3qpmrf06A#aԀe5TdEhT7 *1shVmEq23v=yme7m%|6\c\.2via\O 7j3y.A˘M9OSXiKXS$Fcvټk7gDdO gVRğ? 0]C景Nn]E!sLTakS`*( lg~d=>ӮSu*v<55&=έ>fBSl4 yjBq+,Xx6Rfʘٸk[>t-oTGyOqkظa/ò>j֎FNRzazT2t<2QmlZ9ZdT6r`4:->ɇ | woa'˟)fFXv][XL`B3T޲,bi q'd +6dssh{is4p}<:]ݾTB9/LKlQ/%mx=ƯΆ!S:-! YM6qHjRM)]8eѾ/ޛ~_ J`35)E`Aƺ8y"n.fOhcv[FtElw[Bխ#7c[/۽n`ж`DU^8?W߲J<}ח[c66NoINߊtl^nʧF܉y|9 fla0>/u/mh;_otPTc?Ǯ%]3逸^J ?g<d>;ގtXNDžHz}gr19KDBѠLu]<&B %W emC ?Wty^)7Pڕ MF֪U)Nx|eCq឵5Jh<| ME NNQB1-S, ZR#z?{$r/ۄڙM#s\uhS;'.z<6{@9Mlw8'1<|+կ$Tr**Gz׎wE瞙 U+OxRxp (CH1W=D^ʙGvq 4.{:9(!0|} OGP8y[Уv<.xoFAV#&ʦ/βoY㗧0y|GҐAL[ՙ@kdC#S:til_#]m*9c~G"G|̶y៧)/ѐ]m'½*5p7i9 J|̐0^iu|ÿMh\TtVׄ*DŲ9P@-MnD>DSɝۓ?o.AP/c۱[hd-~xue_l'hkN ]^.聢xQu3<̱GT3dP?&+]CdvdCj둋i[ ~kR1ަ!} 7JV,ͫg~!߽*1) rH:}#8f[O慪 "T4Q!< ̔\E851YrҘ@{#Us'G`1(zTη0MMq(_ƌ x2eV*&j,Ϟ~dYj#E<"< ʔܛ6񄈄,ْ%jB( G'8e5(?"Miҥ>4BVN6')y(틏==* gLby ,p 4KH 1aY OϨܻ: > ugio{TReAD++Y<p0_&2ΏYRH &(Jԅ,_KQ}-h‹×0nZV\ 7n34iGDbXgvuuo_Pӣ4#xXwOR&)YVO|qֲvRg*ti)P)T4׹#PERz0BR~d#9QF8>Ɍ%i2y,eSM3[i,dBO@PJy4ʦ_ dohWkЋS3- Zg#\:S\'*éh⌱RqdJլl8F3*ϔ㕙1}e\|O>R& J(~tsz&Pt¦rqr$3-ġ IDATP-xKBM/e+ziɆ? b5-voofuBAƅɍ:ނF},JҞ'όPؼ] vl|ΣL(j(Eúnyaz5hW!QґvMFr8WE=' ʳH@Z4bc Y'Ow25.x<-[>y<LeO{KACZA=9o%_&27d-Bi.&$p Je x@Aʍo@jC7F4RL=d_1qx/5O=]':' {4?QP=Gg^I:'okjPp Tȭh|~w~{lQfxg[>xxCT*PT^ƾtpQ-Ԑ>YVOǘX3o ~ƭ34Ā9=]H^R'F<0Չ:/ӸG*•51z'maڨ1,jxwato6fCʸ8ʟfͽN1g5 F]HKUr hAv{#W96ɃHYf% Jp׌;_, wglD_̴Qc31yL#"-ХxN X;MF(:x`4Y?|<"erTwc(R€)h\eDz#Ix+ x]ξ.,l^&7˝߰h4?g/𥏒.Mcͪ'N'HxvR݄T_ι|>|;Yv=Kq5 u\2˟[W g2ˍi>!%0k.4e%Gp$/<$Q Oyq2G:Yo_nr#€ihy}&SHMh,CbՄ)eg#^xuwDPfj%sN%]ܟPgN[jgذ<*iqbKq8n3T0Dqav&:(^QxN >{Xq')tk;kN<%Axu>Ĩi@u.>|(P6wm:e:3Yn]&L"'s ?Țxz{jsTu1N"!IC}j-yaZ6)1g-~Ñ-g u#̙Qgh/b2:WzWϚhqܹ|#~)5DJIN"IuӐ8Ee(;l(5o3QY^Xʖ?bm]wІ1SէY3^+aSvo 9wQQ|Z)B_NE .n.OvxTu΍RMgׂqF>9)e4ڽ6-lݧ]Qj]27:a]5 |~KX07KDu'~L$i/jt $-\m'8N@P6r.GOCT+?ފ({*#efwyJ`-L ˆ'@ ΐQp<e^܍_ >}(RlÐ^?KG]1,kkDkcX=*J[Ih78B`d ni tql%TT?<ʹI_\TY ϻ,.=i ѳ&Ѿa/zE R]Rn'Y϶66]&V 7AւzQ( NAd*χ:xZmu#'jмQq wxy0 ctQ%G;m*w`H|wywj;O|1_On?+uydCj"Q%i7lڛk]> "ږ-,g?KXqoX}[})gߖz@?j#miZ)73Th`j0oozkjL( љbDi7@(|sH6_vil’:^ïձXxV$%6aE(N--qy:Ta|{zѲ]~%k)eв貣Kv!ii"mK6sf~[FF LG~|4TR@(X=7'(j|H;,i[mh?6g*+BNOkyUdFÅ]}c^F!s;MMEUIN[Qܖ~ŦXٴ̺L_$_?+eqF* ]јj_S< >hv* }˝esS~k4msV6%}%~6`>5q4Q}u )OU4'Hk%eyy6 GצձӪ g?tRRRR"`@ߖW>͟ fhY3/S1:.񆮢6s0!PtKb,d4 Eqp^ϲHqK"qM|sNgGeYΖӰ:gGTb4’jzeqkoPhrobv71nW!P .DZ'FZaI&N88Fj&S(1I#\i>uB>/u\RC:mgY ,ʔTq*Sx\/vYGZW.]5uZaޤ|Ll:(w;iibLj'HGߊ8 g3sz\IʠdE۬c_Q& O$);u7%I-dE피t)0OhTIYoz.I/!;.`5h$I$)p}q$I$I$IH$I$IɎ$I$I$IH$I$IɎ$I$I$IH$I$IɎ$I$I$IH$I$IɎ$I$I$IH$I$IɎ$I$I$I1Kv_q:QE_2=;0kӀ8>XG1.d.mFԾ8F&4? oNeviNM%I$IɎ?E{a v}90h5^ME51&{kQJ*[c:C>nW_iE}̉ym4T5餩ƿ8mǀUɪ_&<7b7іs`R'ڌL:hCwh2F,z#q{S[עϳeI$I/>6 Y>z*ef"xՠ%ME2᫘)=.t_xQzm05ZoݸtKS7XlTԔV1ˆL)y%G*eF!o\83tiYT^Iԩ_pI$IDx&p0)^@q6‚KIOxWѹt'h, d{miܠ>M:#;Coe怶4lИ]tMObL/Z4mL61~EU@{OGqKvnFuina h$qkvhAÆMh7h0Jϲ17h= u: a۾763 T_rqh_I(C˞yԍWHש|7 uEkޓ1aW$]6L|аu/Ƭ+“Cҹyc6kO;(*ώ.binc4ĐeT5xc8DgWۻ iд=mfv|9⹹s&:6atx>&aM'qj Qcʖ2Z g7.`ڧh]::<5~-M5I|{(J Ю-N($I$IOȎ?𐽓Gӟ郪좘jF(u+lOkعg3ınN40\c_qp߹M {~WYgĉ؇%we~GXpF\\ emBkݻwy8zȍv_X:*e&ayj#&M@L_Ɔ=(bHO8Qmî\Bi:˟S{vΊ!87s +FC9F,g׾|?s0,ONqA&̞mKGf}4% (0t2Ja1n6n>f}90G 3bJ/'dWvW#>qƗ|d@#Siu&Şu3isߒI1̼X+;l:uCbN* *nt(avyV}bׇCf8c W4^ØM6_od)w;dJXN.bҧԜ]W3~yQF9ϙ@%cȕ$Z.qJeeE^d)݌Ocm,ޅa\tr\kٱk_79fΒ [a|nf0V,u$I Nψ}m@=u*5ʶL`wz֮L'yd09/KѶ{2q+I֕2@wW ѶGYC**ǎ\"Isd LR /T0{G'ѨZU;.5l xĉ܀[@~ gϔT(lC\z[@~ e@@A)-]:tjWYkPxřZ;- s#l7&B E54vp ]!Tzy]`åL*{۲#ږpչX&ù%]WTԁ3ScsJ[:+J;S:g~Z4/ó_/pSq.BHF8)3ųawF"O4gӻBI>Rec 8T~'O8v1t4Q!PNE2ryrE=Q3w\(߲=e)Tٟ< `Y @((t:tN)I$I30B{3o\\]a 'A{Bѡ'jL1Y⑼`Eƈ'D$eAϖ,1o&cp; ƲeFc,0SE3ٽv 3E+т~ߣV.Wr)Aٽv hAߏzS;qԄ0>^$JfF+3AF5(dIYoMKt):TZ,?-]Cs?wޔƩϩO㜀Ҕssm`.ͲU .fQ ysCLSh"ȓ%9`-ӈс,51$FīV(-{gx x8vI٨%Qޱ[%@B˳A}oBL\?_yS8z$-kžU=GxU= x}Ckcj ")IES'< ̔WI$I(d;7r2bUb[P4Kc^ҲX7~] w25.x2Qk&P۪"=Ki4{?cK2qyCiZg$Ov#'/ O\xռ0O GQ͔ͅ}~\P@x )KB O(H9~1DD^k0oLQkR΍" Pts.mgb\! =NlX_#`~ZڵFA瑙B%&:]p!  }ɍf=ƖƢpB:fۍX[(.ƒu*w%Ec@%mƦ !73H<ìx`i#osNS@\ac| +.DÍ9xpgglaCtq*a;g-/An# QLy(F|jJ7iDٚڷ D̞r(ߤ/w~ö?t:c,|@d@|b5*BάfF>G %嶳Kϛwn(܁1e/Xy*鈚$I$IoG!@Sx]YY:!wWϟ`? Ԧs)N?"r$:55sIuhF;L4qI qID'*xd+NS)9GOp\+O6%t5ljǦФɟ]fl;m7bՍLYvs2c8`}~܆|:HKzט@{Y5Bytޕ2PN̒牸)_Ecjq ʀYhuaL!8x&-ʼnqCl?&ASP2t; ٔﲁ@oN;:IG6k]Ngʷ~ƹwV 7J7a+0_ |Lh5!wK;ASDdZ48.yRS&ޝƼ-Z|3ʕsӜU?fv%,ڛ_F?& ύ>?Y ]* !nYۘ A!\(CjM]{ݿ͟ IDATkS[u.M7I_f@;Ճ]Ӎn"I$Ih;g,˭mrOW[:+VMoך>[goz=5uzkT#44Ոyf!D" t ӷ/Xﯡ5zLkBߴjSXBQP]8|yZt-P<ٷ9NTӐT }5M5X/y{sإ#8X>+/1朎isFfh)O'G0iPP5s{$M6ƔTH.i3erf73[BQ]ڇ[$x]:sCosN6(]S>ۧpmcw4&ۥp:ZgF^3?ʌȓ_׳F~Lqޚ[ٟ?9 lt}c_$IHbǗ}k`aKʒ$I+ $)Qr6b)H= P$Iq$)J=J$I7e7$I$I$ex"I$I$IR';.$I$I$ex"I$I$IR';.$I$I$ex"I$I$IR';.$I$I$ex"I$I$IR'R쨪[7$))~$Oqqq? (Y$IqɎ$ٹy& )SWWWՒ?%117opM ,dZ$I2 q$;.]777U?͕ p9BM$I$)C$NRRnnrEpss"%I Ov\$I$I$IdE$I$I Ov\$I$I$IdE$I$I Ov\$I$I$IdE$I$I Ov\%rlJS-NfN{FY'I$I$2^sxkH@;~ S~{zwC>3pĕOIsZ}̉RA9uUy~+F(wTZ_τKRO>[$I$I9⒡iXvWZ,{F6ߚ{,'gjn,$V||'s?BӆiSV~ËҹE#6lsn4 !~Biج=fFi`dCdoFi7hÍhY9l ^d1zȈmi|؈W gG .ҿt֯@Mנ9F\cc|o&9Lt "@t:aNwpXwZ4O=v8-KtO,J2jg٨hҐM\1W}8SG8ߌy PA XUćZ4aK. |:l/\_K S^zeJ$I2ţ[Zyl:WebdFT6jLWxCپ{33kEЏvkigvՕcqWlgwtꆇ2nELCxVncP:cwHЗǔ)Q`㺩 iϤ ՚0]e"40<ˎz;{7ͤu{F ᓛ";~8G|zc=/ԯC{aNӤ+?Jq%s?l͞/ig3Ԩjxu'rл s6e߆LXOՕcy4M۷/wyxs~$I$ex_G7Iqq$pT҉An\(ں s-OX|ѳ>$ښ}(V 4m] _rWr({JH׮tE#i"N5G !1@QE3fa@1-StjI콒ʝpljg#+Bvŧ(քߎr)QwQToT $,HMR-*W#@DłE(UED#(5 dwcwͦ uΜٓ3;3m4tmew _zeL^U;N0oKݶ\tTdY~g7bdo/W(1qp7UnV&[NK-zJ5D(*jQJW-XO /|raz뮻@hՠ~}FOSGI+EƪZbpWl.[,Mj8EE,y]Se9iUF>LLɶmڗtHߌU{Tّnپ~rJ(Rf2ݦdY!g}PRuocWd~]>ʙdH2(.6п ;A%EPI3_.gdv:jےYE:|E+nDR(%*DwPIuPm) q$DWTR!3ۧ2_cFr]w4MB @p9+`Tj+̵C eRwW:Ͽu@{)\h5TŽzzz—ug2 S?tLUQ[sdb(gB򅄼O$WYŗ-.OװaL.FN<:)n}׶5]#%XRi_IګXņQ *m1U|-M+K: 7 lkFnH~e )Lʤoҁ̼&0|_.7Rv˘1cdY|AB ǥb+#Y[W}1皃us8auԱc9};m֥x$6~G<-ᒨ3ʫlkM"+[:rv[ϵrUiZڸ#%"*.b6o9,˶eےY:V1)[9;#U uZM^&o+ 2O7;ͲeM3Rj\ {Q/k_%(EՂFf|N-{}^q0$zku>ofL^{l;xʧjR6ﯥz FLVeZj.PbtM(p_/?yB @pq4ֿ_͛5S.42= EΠ1ޯ7wHMcRҹUVwƏ].7Fhj]ݕg /Bսu~ CMGOIO?;=m0@{ =2οRԔ״.˖̊j׵vnTNYB߯Kדw5S!VGm}R葑8e˵kա>جOT֫:} UsG טa'P]5[[:=1w*\=u7!x50Tn]]XpZ(f-Wؼz9yt#\AAÔ4?ݒ4ۯ,_ ӐRؖ%+pɗa./b[^Y2_GwU!ٖddJ-y- ɶ ud}mY^[F%L%m䮛mɲlI?Y:0 {^{ivMӐku._leI2͠K _iӦ=RN #>-0y-[Fjת^wxT0؇7TnAo)W&Qkue-mKשc&Vz3Z#K$=ߥ7iFi@vLzI>lXNh /^zIA8yb[jyO˖ ?ҫwV{o_$:Z:},%TZO^CVxGVh+҃6SђwStSzdW:/(:GoZbW<xV}`f^y=O{=xu`Zٗwt{zļcK!F4WjŊZBe^62Wdd^|y]rq<% ^^|yEGG6K 2Ln¢]5tjTrhɤ߽w쪾wOg[ ,?A5lfe؇4?Sf1ݮ+e+KߌJߜPԩopeGSL\݁붲򗇫NХo6OX4s(tugkIW5I_JY=5_uUɟJ֏SԀ.ծs/Bt͛B6PwVu4;գ}VkYխDJ?pK-R_oh ክGۥmeHZj.+;=CЎd(<w" KRG7y?ײ|g]\ypΊ SXjjۮ^[TCVQ;LqU='40-oAp\ 2AYvxP~@9W 潧'+Uzぱ#E]Ffᶕ>YwN>Ѹ)z`43ikeY5n];e>1VmvO֣o-sѶ\-3Y뙩?(+}.>ǨGec-4KyWO4ܢke۾54ʝV׎g<^_$/N@MRn3kºg+]x]۴9:;ߏs=KlQ]NGhezhNnJe (êVg(Pa׶^יٱ۵iG!e2sd֩nC !C_置O7RFqS ʭظNKSg|预T jo-F=[5㱑Zy}zj`=)vm(U\eTY}w_=j+.ܥjkw٠ a(>\Rg{ m prKjjմvC!4eȐr2e(CUu_u<ۭ15ugtKa.RJڗ,[WDZ2&z '8̰(E~ EEEIʴ ^t4]<.դZֈRE2Jp)"*wdDTQg`R|EOί;nkYxfak{v.v;Up(oQr!E)JсV>,wWl.[,Mj8E|(%29iUZ>Ld۶lo%ҷOѪ=ȎJl_Fʹ+%vUhP17 Pΐ:8[S/ѺGe]ir ݆J`FE+2;S9sleffJъ_^͘ḆG2+T!ԈTTWG3.0*=+BQ`+WtlԳU=.4>[>\>ޫI_{Iw4 lW[\Q}۴?ɣ[PwhpzB / J,֏sjDkǖ?8ZmښRE5*WRҷ֨SK:٬QӚ|ל[ffnd+Lq8^UA8IVFHc5Vq2crvtKHamyZ%K J(c7U§ӊ$lEqڵn׶?ybоVLI.Svnmܑy*.b6o9,[l;J7khΣ}ؙ)JɈٵ++g -]qAY-ێgVokϴ$$ǬZkѴwW+cYzk)TU)E+P%Jƥ+b !{jiɟ7؇%]Z+w4{}K6jQ%ڦc׫%ɲtfh?7\YJPWu<$m]أs.8_?233u]W$&&;@RW+\1JZ[ ?{5VS"Tg7eR7CMJ;Vhؚ[4~|3._ԭf*!\՗YPcu/!ݵ3+w*dCU#^"xFMN 'ğ.`Īzܪ3$#]J1UhSK;@w^[GXoWUUN:;$s1Q#ueʊ7ݗLw^}gbnacn);ez"ܡk!4:P|nz>:mڧ_Z[j KfYvz6Ё遘3O%"kΣ5vEFFo tjР~/p[\arjӡY$Wпfд;h:0%Mv$c&+$/ߧ9~ړK L9s`[^Y2ymY%ۖ(C-Q IDATtylK^K2nv-l÷o:h]$fөlY^[F%m䮛mɲlI덼)CVYI!RQ^WVfMs/C'wݤqdcےײe!G!;&c}&wN3LLn7 Sq۶f|%8~9eu_F/(_8qLcßΒ䕔~hi$i?/%sBӡmŝg\Ja}B"B;m4C_ S ӕ0.|] 0<(r^A|%OR֡$ (IL'"%^LZJq />,ғO!I_>.N/q! # {0d\QJK;:'4EGGIpT QڶcjTfÇӴ}vUXߡP "LI[tg^Na*U*Z*TWAp [ 6p #p< #p< #p< {\LexB[-eYn m "!>#icc9k~?k6p? 'ӣ5S8s~[kGkC[%q "+gZIQDp `[ߠTR'c $\8\52U<أ6[Ғw78yVT'T?NDM{:p#2~/vtc)u,7m 4T}uǛu띾am:b,zz-yOey%T{u|=d6_ZsJh>[Hk4ھN v]Ý)kO]۴TV]tYژs aW?j`Ųtsf6Rizjޢ[/ܫ_]E_fs~D_:t_sxegnܮmq6:90CyCO&AfN];I8xlN-a~zhVeھI#Wfʲ >6[7;\_l,hB=/ޯⰾjۢkD@=;ux-{gWtwoiTZvuIԄׄOоԴI5.M>cpr.8Nn]zݍl^p!9[JYK:tPǞuk˻=ڰ#קz~>Ow׵mPminjݫSWV:k̷hL=9Yݮ_Wy~Kޢ缭RtE{Əɾ,'Mw}CWH֪إb\fe1w9Sޮ-y-Kf7ZD`,2=-5aR}9Yu;C3=SVy~~M_P:ɝPSm׌bh]eMZ_^_;>_L_{C\Uܖ~fӻ %{{ABs]f|!}ےd˳con>\ʴlywÏ~[ hWXYMTcn/nji8^3?[sFIpmeoD7>Zֵj++B<6]U[Cޘs&OUK_Quȇ|s3y2,; DzcM9Z-}pF.oE`hE-zxfVֿ6YO=R?ւO[B־2\c~G/W_|-vjg, }JԌҍӊES4zNs~#iaW.vxU;VsoavAXjxh꽏hy;4ur}5dG-^WOK>=uQ)yiyz$]@DSX^7~_yCp.8>v[+kK|}5Y2~N,7GGȮSV4nT+̐= ٟԤkS{Rbyp&jgs]ilANWqEjb4M{C%W9}ES9z;5Y "/)ad %˕Xg.9хe#:C-nꭋU:=tE:LiEKFդa5p+,5ɲ2zV6//~;(T%9 CUQr2R%|(w`w-Ίq+T uhuvRm7_h]}Ur̹Wv.t#հWՏ+ŐyؖlAt.-)wx"}*3,Q1_.O T jR]f.pyEE#tfL fB9SiH2 cmgqRQy-g/uChbVۯ+gk˷:CkhmJsQ Q)y.ּ5֦:#%wzGoUZ%~԰|\XiLUڡ(qE_vn^qy޼뢠V[,zViJFƺ_m]25Pg-]m3L]=~jEH~UUa$ܪ?kI =A| #L綸\Uߪ!*猊a CBq/h颍 #Si+:Pw] )g8-}HI)A/whvSJzT(oГ- 3?ըVݷ!A--%P%Ed+PZa[/JJJ-_lӞeT=6oj^-'nediكbK LP5K\j .in|0d欏reQ[.;4LLnŗ D x;=k኏ *s.O|;;h^< ;溆_vZRȸ,{ĖwS95-gHmBp%R7jLtНwk\]IԞ#[ֻgj⽝U=~ޮ7_NڿG{[%:w%lԯSǥn}j(Ml8]8DSf}yshޜyZx^LsjăJ>ZpkkN_B:3]qVLR]t_+%d-c6+. Ԧy?KX7U~|%ǩf**vɳgtxXoRRdg^KIi[W+\eR2 Ⱦ<7iZfi{uԶc-UEGj4NHd8=}WZ;#EIeUnkOy [/Iq*6n>$[lW]uRJ_~ޟ-e>~ݖ,[*vsT]hzyv.l%o٤?3l]W];>஫.;juGuX|S=C者 =$L$o=m[c;սzM{[9jء~]:ESg)iS̖-bϪq^eer訫j'jhodglg/ԟMeJ'WݣYmI5Fge;nIY[nP-uːY:V1)[9_Ą|VQC骪Agm]Do|Ci|)۷hwFhм OR d\qEe4ss]Ҩ4J37U]}yw!v;]7Fa^oY PJc>խZE]\_Q|rc-G}\ߩBsԀvոek]q U6T*J_?Mn[eQuG˘Z4kOW6UtJjȣ)7wVftutqd7wm7ע}Իow%)]wۅjVT۞׷WFM{䵏s; 6R7z\F{&83mId+R2 )T2A]Fk&ͺi{Լ1֔h!ǜڽ4u^VYZw ;V;P㎷=&>Y]gDZJ[h˚P+GƏkhhU]<:}^Z5VvCZ47+ނ+l^`~G21 xnHrkMSRXд~hwKr?8fnplv ?3WΙ0N뚌բ'[)\H/4S+uwEoha .}5yTꡧ'ߠCz襄g4ușZt_)B;_ícth'ziLx@T¹t;4Wt:tGzQLCvkV[ϚxHmUBDzL-/WAؖ,+oݔ?cʽ'=5yز-+'X 5t՟Uݧ!S);g;4}ބ|st^E-z//Y0%Y j$jB:t=8_do ,%dWӧbmT>.`}$ɶe%_f2EO37t|8wLCyЧ~M2cNm[@.Mf\f^V֖eENoe*2"BG7j;7I ,Č{egdvvv$$lt@4O{$Aޠi?/pLsG@th[@q=.(>#Vݞ]Fޛ]UzW6LH[+?<:=:ضE%r |utfk".%:=o 1Ly7?WQm1mڼF"knryӻt? 30-/I2L lȫ%Cdgy^_00ek2dɮQgَ|>|^^y%gn-Q@+$/o ¢׵qa}52顑W@g Q9 /(Utǫ'b./' 8 'G2dV&;K%zv0/STܖ~D!:5Fz>3W2LŔ,DpP|zcmUڊ#OTKXV*Dn@%!䞹Ygz\f$ϻw=f)Y#~N|w✳Yox>v XO}oy N^v*θjgU?~Y8/>_>+g`ykp-rgYϾB|qګq>޽]EWfպ!ZW.ٸ`B1O>kBH2 />X=4mɶcc[!anF%{<pq|oTOO>/%'S Kl= &(G/^t167xw1Xr)8"w?2$ǰױb0ƪ?< Nx|:q_ԋ# x)}H݄wJ|o'tO~'҂y1\c /~ 9__3jm?KpC*e?|#mO#;ߎ^]l՟Mϳ}xwj^} u ;Q&):Y>+.8!y$۰q{n"ي߯\ŁsJt-L3QVrlyo>ÌjJW/f%ٌ_u:@"Jxp(^6;$0{{z+VK2޼ǼhVѴs`mܢ5K߀_\ptGU:|8[jEJ2k Wx?| ?N\';V~C8<1_3١^ƟoΪ~7˱Qnx㰷ǯ_[M/n2.s|̜ދn س ~i8Yx#؆V'xs5s[9u({ gN9`l^/z=F\x艪s8sIzĒ9]@4D,|n5 4cmMkYde&_t f.1m[B\Xpj~`ቡ#g>3B$c&C;0[8l[((fF4o)5)$w=E=',֯߆^WŅVxōq|xbGnu1o&CUuKͭa90/!~ßQ8#_ǫO71OދO<7rMxߒ0t L[3s6ōiӶҏYG=;Ƨ~6>j'nH^ŞK3jcI ka葫sFUqִqܹcVģ*2mk}XbND>3bHE1{!uӶB!K5s{c˺g,wx?-Oߍ`ǀ)DCpxx(E0FR?A&=yaޛp=`+qvMR_w(9iG,a/^_޲[x702{U}9j-ԣv]Jٳѳ\vUZr\wp_{@<іsqW<~z|/]{*Ο ن#AzvX ?֝.>/Oup.g'p l`_{ {a08g6z~3挬M&[ڶhLiBh^8|Ь Qu'B:3Xr"f?x'0, #Mx6lF;Zg/C;D;6lv<;a xꉵeˎt]Ӧ_~`/}a { )p$~,,~y /wMw5.ܵ߼ uPlŝ?)N;'5C]"/o-<oĊ w]6oxo㮹pA'=n\[f[ gVFLOĦ܈QXk 8\ķxx?o7|30^>\c޵Ȥ99V _F|)H)|#>6LU%Q0`xϛ\cƇ.y/A-nw\/] k1wua_]O\v_ g1T杍/ߊ~oa;z!/]=6dվj_Ϸ-EJS^^HaIZ~hTl*neF/w/!F~c+*(k׾u\r#xqYົ?uzXl"U˗/I'T^oX?Au#0 `2bǮ=40Kcu8^#ST>dnhҶ>M!BTBCkZB;f>`ŷ7-OwB!LտϪ=Mо6iLVR"dy7j F%k_B!B:[W4=4KVLS4LVR{ŶfZB!BY}m,6Oƥrf}EO0LlB!TEֽlmխHNaZݸ᝼լ_{#,|1B!LU/m5>kmc<^YA!BTֱ.2[MiwBi|k8!V*%cT]_'$E><׹CCCV&FWw2!kl\,QLfb/m  7MtŎ!wB!a͈ټ&clټ}}64EU >X˲}dwy,o\faժU!Vz }3 㓊1[:94kO]Vh }g|kk$/͍S-)8!300x eQ]j0?wwބ|wKua`7N{ІƱ`xgq=哗`,,X ֱYC75v\kD5.Y$obuΑc2[{B.2!E18_Q#7ctʜCZE_fͲq "/IZE__fYlΖ>ah#DFϢ{7'B.@E`3q(@`W^{X^m5w\ ٚ"_j2WB!d0ZHkeњ-vgOѸŻZ^tfmB!B5D1m񴎠Kއq{Bŷ#ۘ8 !BH(jXB5Y= Œ }{ѵuhM]C!BH'#i]_zYY_ҁz͋v c)r|+B!2Y_6xmchbyYY#B!d*kXƕ_ۚyZQ?>Lb/X^.qzx1u1 !B b΍WR[}mf4."'[h=оA!BHguk}߮!1(͢D㒠dCS7BdԆ !BtO[7"׵G^-q $_ėik]-USθ Xj B!h$QJ!cOUEtI- zQ$)lC"/ϋk-Rj6GI!ĪʖfL$VUN'I#J}+I>bWDz9?m󆱳4 B!Nxw4Ph1߷GQ$Z`Dtt/<]!B!dwFC=MϺ:P_K=)}t@5-&|P ١umKMrŏPI:&֭6Z!ݩDIg@-O%;G)>]ռ9DqB!NCaEެĶ̀ 4zj^Dyz_DZHm4xHov6.e(Xbc͂α@yR5ҴhM"zOvcMKɾc箱̞͌fњ'BٕEׇ2{Ԋ4ږ})c3$Om^&f>АC7-Zfk{xqO#BdxFmhJgH]u3a㟮hMǩ| y24= o% ]qCn a'j J<:UPDnPeQ7#I PȞr9=B!dW@׃kGmtQAOJlۀiZŮx!BȮW{5Ej=kk˱dlTG(W7% ([]xڤ1KbZ.JغO /YKӢFiq[7Dr,*51Z]ֶ~<B!dW@ׂWZR[Z_,^>)AIĵ=vְyD7. J zjnNiT$?I5W043lc#re RMtV_؄B!#V,jK=coql ɑnTd4-H}k!VBzY0ո$i[_#1c c|C"ظRifR 7t35{1kM+!6f}!j\, Ң}Է,Fӏ(E벟41jbWR_̑ GK?kbF!+`@[Yl['vȷk@&DH,6~sgk#O CIDATh\/%W_x _Cj޲N m2$e2,2ngdB4B!d2j2$5Zq[mUŬ'oO/Vql.dZ +=":-yqB!J^!mt!VviC&kFй0XMǴm;[ۣLn.x"'*i6n?xh@jymtc"Ǖ/HcȀyDϚ׬O!akCcYbQDHgi8ZVxVoc@qMȊ5L;2$/=mA_ؿaPkH9;1A6&r(K!2j6W|{9:!k@t 5M?LvI0跱< A#5|H~"n5zi/+v׾Cl\,-Ӷ-X-Ϸ !Bvu m̀7[b}hL:}γ=YR/+&xY_^m˱~h2{ͳ~e !BvU6+mP ٘ݻјm:n}/{ddJ"7o2}hYq[]ǵogkk<ӄXFB!L&Yk~AogꉲC{99/g!k`}K´p-_϶{XΞ)[К]5kҪ}!B:Vv` ; ,Y5 C*r~#$/͒cx(Gk:~aȎA!Ub!O~h4;mFSbHN&Yzrlm!/C3k !Bv)Z@x,hU9ެ:?)L; "{yǼuڷq/'kxi^VA!2ь:Y/fH^´p-gy^`se̾ͬm \7{nͮ/B3hf-!B<)Y[f0Vc)D/N;B!ViDOת}T*f[uڧt9B!1:o9j2 vo%B!h׾-g>vO!BHn(ڽ uB!{1QMD-jd}:.!BLV0Ym9r݉ωB!4N'6xNMһ%B!6dB׀B!L v&ŃE{>FB!d"حFġN4BBE##""""":R:=>8ύh֏f8n4fiXCdHHH N*F4FNd7F:^pZ/]IdnQhnPBŀD^kP$3:vq1;vbB> |?E&\߮.fn%u"_#FH1 T xb=""""""։jLm۱6` 'u"Lb#W,ƫpm;HvёmvmG BVR~j:>ҶL틴mn]LI5&ֳ뷋1ej_p=>bݏq:>ҶLSDž1-8ʼnfk5 BԾHv\FHLJj}2qN25i;HѭCDDDDDTEG:>ҶTppZVN$#x'lXqNee;NNq!\(5Y(j[ש).8eNceNcD66"LJn8PIDi]uJk Nq""""""r)Vڂ7mbv9euquڡv\DvLڭ',e_j Mr$_PZWe7V]k;3um7c㜒{uxפ\nvqBB%N}vq`d8yW8q]ۉqnD, mF;.Wǩ}jn.b8uٮF4g$:N:/:jn. nƩm'J<X7t3>.W"iy,U<Q$b:m&qP1`)17m̮OfkH@l31{A'֕16D\]ձj;5Y.I따~u.X$b29n7.ej̮m'Vc\uf{q,vwPԹnKceN}Nq tQ}*vsݝ-.f-KjsչnIƸUlI<}.~u}yQ2mvhj;DDDDDD.uϨ bjүg!P`lDL|-Ɗ>u@L޿]/} HEBm͝9Bm;\]9ŝD:n"""""&qtr\,G2wZbhseOٵU5w- hsږnOCկh}"&vv8'""""""M~jKϔ> Ջ Ͳ< %ԘP}uj{ d_]Wj1չ,pmU~""""".\k:Wcj]|ܯֱ ,ӲP"D5v"Wu7b2PY`Pa]n p.dvbNB#"""""B%.&qjq@qrL^_PriYnsA;;iXJTm'TSmmy.mOg6<J}_˜µj2V@>1w*IPςPpc:ƮO vqeU> |X FIzjr&$b@ճƫ ΒqO,E yYmq3ݧd,Q,DȆ&VǨmABq$ OXyiB'sS<yq"Teu}M-1 ѧnnC^ܐTNj[U~"""""C%\ihqANg@ص&+OkXGݾSOv hJD_Sj@-<؍cb"[չ/ZG'""""":\8%nAM9Pyv<R[.& "HmW".b؏賔eA<13T4cJu帘"ja'%e~eY x<,K"~+`1"""}?,7ݔɯ}T Q (mp X5.25n3~XDD?Zv۱ j@]v GjWLII;m{Y,.QLhӺm߲vj@Lp#ڱ(B*>XDbUY.& ItwX\Zu3-3'"""""" @Z^Iɩێ;K8 0 E;vVd[=vmm7F.ŐpMٽ4h "FDDDDDD 4֍OI<UT~5wbr\]µkU< vOZf.|^A'y:v($|ATY햡SWc>j&w郑<[̝^cr(>q:yB)'“\=M`zQ/ HLJVW#""""""eY:B'ECELS Hѭ_DM܎/ڢqy\+L1Ge%0Rs<$inBj~^_$rQqM`H˖'P5b[r:^?.B~N ]\P}x.bYey HLJQ$72e4x""""""rfY΃Fӊi-] pEπۍUzնxԋx}0 c': MM"ڞSʋ4m?EbRQE.j2o_g(؝ !ELz.JCu"5m9.:nr/\e%t)M h]>+9 !] rפk,U _vt]{}ˊkODDDDDD(x Q\׀P<-SUm ASەSq#*.I= &Ane \c1 %^4eBUJFRr:y;"51<:NyY) ,(3TEceAAʁHן "ʁ`䉘+hղ[^A^X /y =wUU?/F?/#R3O`曓pۍCn"":Lt8=u+t nCXrZ5D[V$ccP{AUbYmyM.Dx۞PVVNU^!2X*`Q w,~) F4 lDM]1I<4MU/eqمVHO+F ϋoq1 p#O;98ωHIB?<D G>[p->}Qpمx; og0^yXa#u.22qc@Dt8G7ۣ##=ᑑw!SU ]Nܖ:Ff&bɩq-;N1w/t5~O.t..X(7Q݌悭|nޣm8j@!:!V&ZZ! 7|sCDT;t]$%%/._}WZh{aϞ(.-i5HI~&lٶ=",m)ሴn/[^xtV-&{ @Iir2N9:!lxxzvW:{ƾ *ճ;N}Z-HƒXj~+:Ŝ}j[pTm^IWUp*FymƓy *{}@^%hԹ4IY@e/h5SKjUǟ?iʷ%"xxx;x*&ᖡ0쮑hӪ%4i|w/qj0Ah֬)|E4ޥ 6i~i'={sѲEs?קeWv#Ō?F3W(**i M0oBL~{:LD3[Nغ}_v1,\kä7ep}OEZJ 6lڌ{ ` j0 "4jO4o?ګѱ`b1uJKKqVmkoMQ1ō+^ǴCqq1`İjU6r2^}m9&tؾ#^]{ၻGvmqӐkp'+WExkLeDDG c^?VR"xxfKjWD #zj4`]wo$X c_zb@`c_z%먼[pB곻U4⪶ 2 "ݲLc)T(Bp8 BO#X_KZht*}jia?7Ψ {<36)Xa# mѾQx0oB_i+{eYHLH=W+0gfdf`~A#߅[F܋ܼ|^qfi/xi鎻}WiN97|KpeU|t) >5 {G&+o1g Ndeeg+VaExsLv {$ ÄibХޥF~?y7bLc]|%~Y$nE xqǃ>OҲr sWߘ =#K.Io` 1g᧳0wBXV-Z 3#'[s^'Lws_?VTŇ'LuU"!oGC7E˲x~$<|?A_?VD?KAEqALΝr_]F3!q`dv\mZMZЃ ~lGβ+1楉(++gйG.HLLase+Vea˶شy 7@n6n0XLӄeY $O<~-Ł8gjjػo?a6Jʰ{^^mZ,`ko"7/%%ҚN? |: ۶砸nۻo?=~}&;m˲*|c@~/EE8Ick6bq 11~ïvcM:7((,Byy9`oKQRRr/[͚b[~y o謁غ}Gv߿g 554ʄ,LFкUK5i|E,%) ii=H8PQV^7mMӰkZub {מjV^BO 86nv3r#UmXuOly.]5w?Ɓ<?݂1/\e[U}6_GiiطE?cY~_Ox{'F{=#0z_+FΝ*nGW\"VC5zvǃϽF_GuT樦M\k5O&ۯgIqus[PT<:[VIbnW|asȤ4cB('р3'I+/zFP]ie&[sWyp)zbŪ5Q؞}C"{^eA*gEtw ?,oxW*>%Qh aI ϸ_w+|4n7nRBnۮ@nPۓ},|,5c_ = Ͽ⸫aϞxPV^g~j12u}""j=e<-_FCR(>^sI\l1OEG!`\] j;p/] " OBm:>Q|c⪣+躎t7BrBS$i-+k m Q wCn?–oQ c{t}wގqbF[^[ +վVO>Ȼ#5%Edef[mx|/4RFU*//Gqq1i_bi g?^Gk*beނtEhҸ<ڷ=Jb+? 6B̊;H}\w@4k!#=mjYr1 zhBL߰ eHLL_O=ERh{TxkjQU˖~6&Xac⃰jmvֹmATg;}H|TӐ?4WsZu}\mu!QOZgwqjLEci</<xDHGKדL`w[l>׵r펛b෥+>""/y6u-j`˰rZ6y޵3LVŔc7b믠E5ܼ|<k_7u2f5 p|^ԙ`ݟX:t:֟7aܳ|eWṧGOGʚƪ٘Ǹw -5U5]\|9(<མ3o:̅a1WpFDt$Z|eLEea#1}BrI,{x{-1RPm/؅O, [9 WrB9q_'KZ6)sOmCCPsS\8j;TV'X!*SLi(ዸPQyg :~ U  _8bgATbR-KExZ""""""DN9s `7D|vś]>*b&yJ?jRPl(vcbQǪnR+HruI.i.m1].RC⑀GqvQ#=|Qj@.*ʨv9<\mۉXb&pQq U+I-7M IӀ@jCrnAzp._lR%NwPxD>pNQ r\~IJ|z*ǩ9sT~5X5uշ_+Y$p,ŁWvMDDDDDDoj.*-0겝pQg잴BUŲTeucdv:P , W׷{a4T^6zJ9enN˵" x݋!>Vj P'1N̝\Pnۏx pzT2ŮO^Q<,؍S}\5UPhӲVjn_A>Qy)oUcjNk7V]vӎ*@Q`T?\_UADDDDDDoV|i.S!S۵P ܲ;8 $/U&"""""" rPڄTv: j,\,jMXv3Wc>j 잼Sn[e(bmcV? pa/hйj, S)7.@9(vcԘ½0I#>位~Yc̩YQKy~LYS70jv\,Ըv܌q-XRj$/\,mǵY[,t'tŐ.)x`~> DDDDD 9SzF؎(uJgĈ=Ըp/˓JtңQ=EQMjL;Tdnԡ*@8;v\m;PjLrM~Uz?DDDDD1acb6dvC&@b7MLm N_<&EsQjj,Sjp>GPP_ %""""""rj.^ų9SmTq(Bj[ڵ՘Wx " u@}^\5FDDDDDD/vyul8x "9(N㜶BPjODDDDDDT[ԼTQ dNqUmĄW b]zjk.k5kQVV1MТE y晸ѧOh_2"""""|Tm4n*T_k dv/ªҔ)Sp#//eeL6 jL0iii0(X(݅b -!M£#""""-5UsS?PTD ujK?8ƌ߯vōeY0 ӧOի_q0\-+&!%=iIZ%-1W90-wʕh㭝sʸ[P}v"[#Y\wKSL̲,,^C g}ϧ:x z|6yҰ::? W2 tVё. qG֊@ Vvv/`#vڅ#G`Y[̘1C 5!˄a0xwooo?|ڞ ל <1>2ocO;`x{/E#4w0<DDD>G6 ׯph  u0D\/''OFnn1`$'']5n:UmY^x\s5zӏ0Ĥ{`=/ɋFc+|< _/+_ݠx|;5VB1ё)u]Pu-{{!P}ƬY]lr2eJ\eafE|͚5FnݤTxZ1/Ẏ>h`"wf]|t;f{Z{d` /+abF,e<DDD*O W//s /ڃvq"O6%x5MpgC*˲]uO^5jk`U~R\rĢPdff|8k?;%mQr)HK2Qt`7Jwoj#dYy_ @Q $ȫ y%RuջlwБڰ2+T*y(!3=1;we+D8سP;`D^ ':?aq8r%ؿ+;s"q^@I~4ee!7!GQ^.dDme(Ca7ϑ AR_|[2Pl,."9DDDt :Un:ӐCY9hF1HRZZZ+JJ!W4hದAKmC}[[̟ 5V~q X,/RФco;g DHg0OAo|8Ztt77/}t?$*Iu?g^~3]vzʰk,K|p=4I ㄳ.@LDǺU;poFpYk.q;067F|4lt&>g,ٔr˂'"m/qU:B0)d|l^r;Ð0[elb|λboذAup0Z)Cܞf%~e5v O_wʰ-_/W,ގR#P8Sи8!rAO4Ro43+J.6a;/_x\;oՇ_wch8D. j vT:ri8AhkXQjA,q!=YGŒ7ƣSr3pj`DΪ9xos03 ZomύƵӤ܂i0 _;_(8Esзc8=]\QCf0+4>QnQ-_Wnߦ[J4$de!˛#ݧy""":Kݎs"ַTR"V"y܎(۷GԩSvfT0`0aBXpw믏1 xV̂ز)t;7GnuĹ7g@rظ_>34Qx~zLɫ#F|v8瑱O#x.bYndp >#ys&ɉ?ca,݇k07 8m2ص}}v&e txoH @aБk0ٹMߌ15sr ]w/_G~+pc/7]tnTc?V=6Y5_nE!ѵ~s({c]ණSp̧qV( ӱ"X|ZpǣuJv%&4jp~w, Zba6h"|8X{gള+.h\t4lq,νѹU&̃0{}py_!.5QM#}?\qy8]ߎko߈Xr /SՏI""":,wI^[ot`b[yw?~<d4j㲳qs={UѨq*RMyĦ?Òzy8<24tn&hsRY_|E_3o^4hzcv~Q~ n'/퀔8SK8 >)c,tܼ򏴧s4w>FE>r\eiA0QSѾl/vى=@+nw Vf:q.eɚ=;Yf^]1m/0낿wcv܉f=Sʑj=l^D=3 4 f=У8r)c3աk49عԤY%(O\p\/IHDDDT!V4i9:uEۇkjW, ˗/1}tz]=%uVl*>֐ة:%T?%Ѡ[wcƍ` _0|,+s%˞˜ݑ3>]ݏ'xZmkXq`PL_ʳ ؗkGUvW KLN %شak5xƁxUX0 qf½Pb(QL-IBeFih/WݺE3G2 4$=I9󃈈V,Xm'SDq2zhرbpŲ,|зo_g?ʐ}_ 47dUN~Y Z s4U!pƒŰjgFOMCnM4O"mV,fQ^nckg!W(F0~5@OKG|L ?74ۋ Xa6DDDDq%(߽Ծ)@;CSNO?ǏG.]r6BII ~g :[ɓ'NsN@*[++πКGT 0uxD V),?asuR7>'ȥ^파jz $:HOC qF$!--1%] sq ̓&pLfJMW7#JrbG΅ÿ=cljC,FK.ѳgϸp9`Ĉx'@fϞ}ƠhXț9~~"# h,4Ԁ={PdIU7ފY 2Jz:w~%,c?t+qHxC")!BO@:|8pi3颖4=pHђ჆@y=81!̹]!܉o;_mR2{ܿ w2 !s>hQCΝ;ǭ hΝ;aQa+?`mߺ"bFc6A7b4$e(8-Ҽ]{Jm~"LDDDG Á\!ˇ݋Wx(؎s?1 Z|.{MX[c7#hQ=E?ǹ+PH:lmeQ>ϗpmo4u t gvNÂ%pǭ4ltL3`ڥ?{6mm~0GDu ;fh\,o^  ޢ^5 kJ*8 @ǣ8FpuDGb37|]%hh4:7.mP'.fN:s +nh*:4N x%c{p i¬2U4=܁oÐclD#ϝxزL0`ECءOC =\3^z#l,Ğ_7ᄆQ i0 (>$?Zc<8i8M) cݲ,@KŴ 5A+e4 Fpqޣ.39S O OgC& !fԋNW=oe=,Xu4DB[\p0Q3gat<W<9M%!ASjݎ;vNhT{͇'&w? ~Voٍ:4C< IDATn'_K0wVPiI|}Kůb ݐ}O=_ C!Rդ ..yhϭӼp/cyo0gJm/&eAЩGoq։_>}XCL;,\fh y(xhHx)r.niلb5RU8p8D9kt4l>}=~]%xS\q07+))zסnqD5e}ϓ-Tᡚ%N4 4[Q[;V(i:4HW~j= $nƨTFWC izS]o8˂YuM_Q `Y!ӴqsiHgؼցVH&_uxci9(p2+myYR,U NY&An}XȈh:sCH cn1MiеpBpuA Cy}wWDp<'nMDDDDDDD5 (X """"""c\/4)$""""""rҢEdggWR=  ȕ~U; bĉ/P\\\%NDDDDDDm8ɕ[n3f̀a`РAU eUCDDDDDD >}ꫯvaDDDDDDdrE4Kݻw"Q8,@kꫯpgADDDDDDa"ҨQ#|xѵkW/BI|2ddggcڵ(//,ZǏiDDDDDDTizڵk3!^/Ə/$""""""bjHibDDDDDDDŔQC5j>O Q-cbCj?ò,5ss̩DDDDDDD_ҥ :t耵kV:#F@Νϒb̙3SNv?ZѡŔqW)۷O>d\aYVCrr2nָsCE~%i0MjFmV{,DDDDDDTXx<1czvժÇ""""":&M~kq0 (n4hiӦĕW^-[Cbk׮|r >""""":x<۷/N=jnj5MӠixADDDDDTAqiZ\nIDDDDDD?*&""""""c"""""""; (X """"""c⎷$z~T{(^Y^yyyٹ EEjeÚiHIIA͑v!8*5)^ED1 yhڤ,)E<ݻڶAjjMDL45tD(((ĎE:"7і""Wtz `ZSYl]h׶ ."ZV-[bӖ,@!|ODDDSD..**DT' J]wDDDDV`""""""";^|JlݺeᨣB!π Xx<1u1ÈbÕ̜}XXd]uPb0Mll۶ M4Efͱm6Op""`eXevXSҦӾV˄rLDuJ ׭GIi)ZjD$&&u(-+Ïx8KH-^C7A ;{MtECAT# " 54Brqw*yp;;;wvf^-F?O0v'V3iwN#f`F_$@c'YN~@qN\t t<,<]ϗ&Ny!m>{I)Adɹsrtꕟ\ٝjj(g> OR(`GFa/~nYtU$Y)X>>jKݛ2bxO"7qƦ*5r 9_sf,-K]AB<ͶQ9[8N(i8dFJё|%IHt$7+ B Jd ʡO8'{2W5"eT~XM!"A W!tPYBAȒY)԰ 'w<` sytx.~kU@ a•Zt?Ɩg8"6n9ιѴwOJgE a߱w2N^s̵ͅG2Ҁ#;FO쭧$()jAN_6ǼS(:6Āf(a-oYy!c"9M9WOrwRa:hS\jwչ.3 ^F$IFu U @£P5*#fM5Ts⢾$eoXWl*Mc;|a*Vz.; C&Nrp#ߖZ"^Lj Y0c ^~0 #j]BCsX.#;3ϐ_p#u3N~v~WUݬ '_jړ?+V1o\?|Cr9DpuViOk N.$j*1-dO|d4N$ua9%~47yz':93`UUp"p0&xt'-gJN{^sjg~s|1% /./`Ƅ*Z7lihfZeJYlY mTUE>/eU/ #0SlG˴f uԒ>!9p%6Y:mqkl5-*R0G}yJkL^'?&wYb317 lqfL[؞Y=GѢv*3ՍU:P[S1ϭ 8ceץ簞j X!(8╫mGaHG>CQp5.nf|98el^ X `~,qQ7Ӆuf|Sb-K>'~`ڞ)߲m"|tt=ĂUǹǭH+FA9OЈi!t/bŽVo8{?ٷ${i fDL/W˅+ۘ=g#6~zSCFQ)wҽKz(DXa6ttM9s- iϙ_r^ka$^= '7̔$'rr\c6gܗֳ ^%2Ybe<Ϩoz=G33rѮ +7}Ft?%^yF~ノGb<ۓxa۱ *}듿&(>{ZJeܑ]*c#ҹLs*dsA^#sOP񘫇q;" GnerD^p3=];;gQfv vqp:F-{CI2ӟ_<ִm߷1E.3u&n=$!2QVQϝWt/FBBv<Ȟe]8<1~O=9YӒ#s5.>KDZa.ͅz"7Wsyԋ̢]Q5ljfm_ƞPjl:f37s7̭WspJ^cPr}͌~÷[@;pȘߚYa:4ub3O9~Ak8pt j>cElusl]'fEı|Ws8dkx~fxJp&đc}ͬ-.CȆ)$_@ 6-{HƿҤ+C淸77K Ic捕?K<_;H_8~$Gcuh/gy:oۄC$[/͟9'W7GdyD)i>u&UOq@3M\O_iω 9t7UBQ'ԞsbV2y$N?գjψu&ꃛ)_]aZLlm}kgV%2<Ca}Ǡ>˸$ᅆNc&<ʗq4>y$YER"]XN[A֖u Ee@.SReR."z V*聭bWr}Ƚ*ZuB{A(aޗ24MRÎE甛fM2ϐ$YS9uO xOGávvFL:+0Aݙy]qHu?繪a~҄5Sp\m8H\^1k3i|KrٿPq]:nThր\.6ظJi_< ŀƳkJךqŧ\3jz'\~ˆR-SEJ}#= +Ȓ$+(,;ӈn8?)(}N/o:ޛִkV4$9QrIlKҴU\dDQ'ʲu͔Lqsw K _Jcd;7~]JZ6Vc}z$] ,s@B4_jZl_W o[fI%H2D:=dܽH~ ,*Zb=k`v04<9IC=U ӪT޴>ٳ$|e/|"9q5EDyiɔ/Q 1[ O/䆴A 鼿@r~p:]ep<#T 7U+ :\m[(ȲqHq?7O W P2NG@Oq4wDt::Ornưĵ X\9Yq=R}4=^ղb~%3<^,wg\ڀſbMdSw7ѷƩؘ'.e0 a?,bޫ~)6]޾ /MknYؐ>#{S'-2sAăm;9{?ɻ$ϧ弐 8p ^#%4G?uq86 ʚ}ItOST=6G-*NeՉyO֕,o<9 ˎp#48ڌ`Jrx{ˤ쇘45fqhTA.}9i[jp%gնH4_f4b.ob̯8{ zōA3ylcrn}:3cXat?Uf+[sPIwLs#k_+Ip$/_IHT>.9p3ʀ!*8ꊢh\:ʵ0yt(QV`hMVX fJvW-=֪8Yf8UP=Nƴ?h誏=w)qNYɨe !WKd^ k4`~|LV5[Cf_ss 'Ԡ&gOOZ(UJV҆M0d2GyT2i vbrOX1~Dr@sug"L 8tʖޝsA:2EUt?iOSRuJ϶Yq?MGr=SȔ!V&֢tA:=d9W6l R̷wq H.mthPωcbIH4$ 6U>ii8-kF d T IƳR#? ˣH iVnut͒|*M1mP7 qhȩUC#n]smxWn@[Y~.QP$"ƣo䌻}KN{-;{p ; cd@5߳7bý_^YhcFҭXy}DZݱS$|KwkLw @⹼?s~̹mh0{4튭"Qji2myL6UrT&(~xPq!=ցn)Z5$|ԙ Yjdu!K9U5s> Z$HX>Mx66>N>L[ʴDY?{t=jV$x()Yv{OdmZ9@4 $<&RKmTs/۫S9@1)a"QزT`4A#Ap-1]rV IDAT c?\o!`Hdٞys@v%k6~; Nj}HB~@))OLI1xK[$E;("H-VSDߡMn>2M O1 3'J,#fa 4bRT܁Mj ]EucDCLW]R{jp.ak ؗ4MlN5gY1~[<1[iD)͊o@2vIN7JWvvweZN `꒼с(Ձ A%/J spAzOӌo$'JlD|%;׽Q\RÑLcX~"sc'ΙP/gM+Vu;7`YXE]«P&ܛ܏3iDB $c[~y;i<|ɖSK<5&!qI)%|m$|MiY(x,@gq$ N2͢ت1T؍g&Yki*V'rEKFzf8 ᝿&uɅ?iώrW2aCLK`!Ky:I<'~Xo.H"", DD$SbdG&?E&XI$s*`] 8!^'@e*dfPE@6}f40uʘ0jWŇ=f)o [?[C;[@ɉ< {"I6=$j~z$H\2EZ3vE)ekYo ב6t̑ι~Ǧsum4 %%KGs7%-a>9IBe$ g{9:lrZ+6wA#^h2L5 1NzP|+wa}4Pӵ_W(Twʦ%p_vY'L_y?=ybqAdȺ+'ZD{RC b8eKXhYL[$I$ fٯPZWq0}y'EѦd$$/wt\Əacɖy2,O2@ sP|6=α "0v//k1T玢j>9'2<솇s+o&]L9w`B/1p^&o1?sn žIT}NLō]ʷN6qL7ik݀-􏏱cpD$`lpVCup?"ժA*IL2lgIrm2ds9 tc7F~8ʉ̔+u7og(/:%PCops4Y;8 w~A"hHtE'qNl Q ۸ky5G㔃B9ݰQ !N?h~GT+Cu=DBOo$F1rD$lF^M+$\c{ g1gz)u0?[ _ ޓjPZ}:bG&.^r oN4%loBT?>DVP ׊Yw!Ӈ7caX"6>Eh0b=ڧxH2鳋t7k'PPGfqŻHYj:`!Vy >[X9[OTIoC*iQ>ܜSd:ϋtna|ަ.{)/ikcOSJd :T u7;LwQsa|SW5$Pa/Acj6lDBWpuڷkK!.]5?/\LRiAx4Ms)^?;iu3Л @ղksjl0-b`֙~r:Mץ"z@iƪBĥOx4Ƿg\zށW%m#ۺlRzg_rK'K{ih\^r3~3y)4˼zcJ=OAAC AxTxw=0A'aO »% W}9A?  X!   N AAAAۉ    ;AAAo'    DB?] mU AU7UzVУێ!  S \݄ Cʻl_;__21,ǕSw,>-:_K:(Q$6㈕|0񏟧bAA$;8ڷ|vy" <%jc.uz/|lɓ^7GmxBAAOAsώ-*7:Nݛf5+RL%ju^΅ XL)]A{խ$44/o T5ZcwO0h2s[tb֥iUA0791h(fv&:Fӗج.ժQGL=0{ GTnڛ%G`>}IA(U-$F IUkH _s3.P) hK*(_!nr X=x~Դi!͌y Or4 [JM\Ե&+:MG2EAA@^3ͮUiQ{eWz{nJTꌝ79s c%pw/wvuy"MvuVhIs;kznG(e֛]S>$~5 K(_"B>TO ORu'ءq@͊d CQVjGr;#g*vD)o;lкe)}1*B9 {"wp"\CJUf"` ::OwlSqt(bM4Z.O\:}9[ѭf:\4Ú> Ƴ5;2eQ  {j %wُhq<Ź# W&OG)bNTŸ˗tδ> {UH{'7%'_|]bRIw2Zmni"-pʦ3ގ`Ig{px昙.)$}O£91'SHS#M0oo?x.sfH£TN^77'b#IRDEŀ;:T35"/3u<3ֵ #;.   8B/MC5cי(_H% [ O#Pbv[uik2Y4|%YA6DGDD<hOyB6wF9`5]獡j>pb[ReEv5&a/4L3yGq;^2"![b=̓< y'=_qd: *48?T CN$S'dq.haD(hFb񚺖 b̅ PU_o"<,$d=accEŃ@҈8d6憷/miW5jSCVl`7zy.gVԩHl5 zd҈W`5ȋ@ح$'-K~ض ?{ ?*tΫ xJܻq%qB%*"]@ ym!nɔ\5uNRouyDi+7P'GgdCύ*Ml I/|OxO{t1A5:GWMcjZI2Rz^oj.SV6yZȘS5vLHA_o"!!ŋckIzB uIWn+[' oIII9r>|`o( YdjժԮ]_T;/pStj؈|kwA:yfq2E190khS%Ei13g N #{|3tF^l%UYݣ}CQA>HRKgB=v Pcb:^EՠTAW)@cIk #LYӿ?s٩6b ((er{4Iix1c Vs"gPi"!}z,Ze,鹁qȮЈ)+;SOJLm2R3.ݛ-c)A/NbűK=Pxڐ'wΟ?"^{mcmu-}ht^KblX6ɀŲgڜt#,?W'P l䅒۷Aqm4MC$ Iȕ+3f̠QF"Z7; ; |R+yY3dd4 YQT ٔ$d[BTu47&j*g>n1!`gjx[`SP4T !"#TWo\ea?,r 2ryȲ9hNҰCHUF*eM,IBT7^U׀PI9_A0|||Wa& *hk׮Ӿ]4SM??]ϭp2K_ޅɓ'^W4ΝxbLg7$etb`ZŲbY33wR~r:Mץ"z@iL<ɓ'z|[nѪU+FѣQu- $'#-Ic?O$ɤQ$d)#MŠ$#UB>Hr34eSgLt+Wnxu.I0FePג昂  D!)saҤI$%%%M0 L2Yf   O v%ƌ^NzTUeر\petE ガ~SAAC0?l„ $&~"B`` {kTU͛\~=z^τ عs[+_&AAAH@HDDOӻ`Ȑ!L475Mc̘1L>=հւ   »"`ŋ޽{#o$I{N3\x1MDAAAx7~QxX7Mmyձ_UVAAF΁k诲SN ק4Ҽ.4g3_ڇPq6LE0$A/^myAE{`U5ĩh͢!rCwjVjZEz{Ҹ-) í.a~MOJC5CZz   4US1f.V36`/ fɉ{$J.\_{?7<+L_ 4Xri=;|zUo~P  PSZŪ%hy1?ﮑT?OӣMpطGڒ' oy9}'|eh:vUvںvsq<ѿ_EY eF o{ Y=k;?&ޟ2]Qe=bd;]m:ޡߐn-s'J[ ۗ~K~6Mߜa_v ց2}e li!t/bx%3Xz/%}tcȒp'Nm؟ItnmI֟H(e(]`qnFq/҆'t꽪d/#YWk)oteV0LQ ށuR1naׄҌet/da g-{"4"9R5bneμ-| "4;e= =:KOXf@dn0/ei,9pQq$9A1⇜tIM>+z4Nncm(pWythC]io>gKQS/ p[/_Ջ" ['pU,Y¼sNs  niz ?,tk zHh$ ز>%w6&ƭgL,uWfh;,=|&gs_~S*zcrԫ+{i;2C4auoAe4wN%m͡`w~"_Q9,~ #KAC ?![-`ݬq'A8l;Xٽ:əL3dVv6잷+zj`4=d&Y5m;w_|gϞ̞=WX'sfϞMϞ=E_J i\|ݻwjD;ѣGEW,AA%6'Y2s@.AT/_UxR24yp %-cN*ˆ.Kyc#K %>Q1^G.l޿* BT{1R-JcC看& 9Dg'9הndcOf:OȹX$ld9CxBG@c\e IQEH;C½R rFJQ*8f|(>JHCNj8l.Da7*4k@.l\S?za40u=x@1.gkBj8lpߜ}{șk2pRjҜٛ2SӶSI<P\ Ѷe9$S{!SSVR,݄Z8q..La-eK=)b"4.L7o._N^U͛G_;Bx!*22nݺo>4M֖QF1x`%YBCCiܸ1M_L xyyYm) ¿fCzplVV_Fk5K떠쉧bhvqsM@RdԔ%'<<,#ᦘPth*"<;6bi{x1h9Ym=4 < p7K!'X[qaTu>7΄+3h+wҥ S$kCL4(DFsW[-R0n8Ǝ+'m+~G4M# %KbooɓyFԯ_?Uݻ( P4~OϥEgߗ 2 wOnʾdN7_FHpo&AX4^H$ԃҶUV}Eq QDi{vQA {h4-S$5{EņƚwAn8H2vwvnwli6,; -Ģ6򢦵W0\mWx"et"7jqz*`Z (w' \{O=3rR7K#޸/V\_ô3\!G)ۘ&nY(TPSγz>R4W`Y[/j:q=-WTINu*wR@MԶ]\6}4b,ȺE}$<ժ1vXƎ+]Gf 9rU"I sÉ'rm\%z P"?x֏>gT,HN\\y RQ})=}|7:Sib)$]'O7gǟCg{=/7]Zt3#:2պNL⍃"!#Fѯ-\~&μi<aM ^)Ћvu2/WWz^དྷKc)^ڽK7'ϕcwC~Er643H#h烷_[*?̊]sc[c\ogcSK.C{aqGM4!9~!B$^&5k$+=ﻜW'37nl0Ag?==.爞qg**Uڵkiݛ~!deF`,]:obC"}f$^r9kX9]5ߵ"ג%P"6]Ie+ۗqxdım#O\;- b$o9=w½p N|W?tRբ͠Q )z II$k$ Y4- ;i`"b~Guy]L̮]s},|*k$s{2$~c<4bbveZȧvMf>H4~?tZ/T&,SgهYƇȴX6nڮ-&*1̖f˚qs em&ϻ.-9A'''Ο?Çv@5^(0cƌ<zkOPUR:=ٳd `ӎ6~Z q- tud4 V~d,? gұ||+;7~G[1Ex]\n25[wc\a[dicN],]CF0x~vq ALsXEξqd"۲Y# żAKJYC\o8qd徐{,e8ߜ%dz ) zN%òٹJrV]\YUPoq$e=PVe$cZA^=5'4%J`8;;*ԫW dysĽ/Dq)9yyΙͫ Յ.՝YZϗN7zSyѩxJ gtէ=lx=zRZ;;c9Ji?:PdszIQؿqց}X  EyM'DF0TȲ+  lGfc -_'!T>>>>|sr%޽;vvvC@@@N>#k"9{3A[5>)r( v2n._L$+tj&p7ىnٿNEp@sn2ƶbԧY 4cٱ0hH֧pnn<,I6Vԙ{W?Se ?Ly_HGJ84EM J$J*4 8>~ 9eB͞E[ix" !e|GEr> Ifs!/ .vjF׷5j*!+)z/$M4N8Z+2}; gWgy}AM2 \-B'`xIv!u 1)L:%)QQBVeEΧOu0OՠepAv[L$EFKˉnekO6[   ?֭[h>}0{l|Nc#Ti@)DV:*jMki+^4 ܬ-dϖZNcLLK4ΜwTʔl߇?W#<;nOZ +Ys3cۨV4T@dJGg*z5&`үa‹ EQ m 7ӸHEAђ9p9]ܩU;U'4 $ۣYN%Imnfjq4AAN\xLMB>ŋpp$3gfN8qѣGk.ʔ)È#ѣGwɌoGp6>+{2ӷp5AAJ.782=,66899RxIMB>#K '˜>}zva߾}jՊd4M̙3׏3yd!tϱNz"$dYn!!K=Tp3/VrUDeZp |=7)WP^CG)lG4TCعS*=v>9dR_;T[ޟetˍ R#bv?r8nVfqktlKeȫ,l ]Aϴ{0L9kO1+˭B~% sѫl>Xkvp7WBcV_&kځ'ŘD{pvǣ`%S:̳,;lꉇW ]ǭlYO hIV>ƷS&+؛ȷ;8wύ "6_QzD.pPZFLkIc%M2=85B"YU7\5:ȣ![ `恤a}~#Mد3>=sEƾx:th \Rv >c6w{lR&cwr.b"hC[_J!c|Ɵqj霏@x4nBc @MΑGԵL4@*ԈV#Axi$\rծ$,ub0F2.6ųEWF/?Mrc f'.gpu >~M-iLiquo;ޚfM09GW6Y64nF@̌;_{uC>4YKM#^o({ֿO>gh;ݱL ?_h ||-ۮzqy쌝ۭi+=waם iَyf>=z1礡چY0/#jDBEFFNiժgΜLL4"EPHFEfg֭[RP!^{5>E$w7ؼ$uZ7J6=-qzXFC/.̺XbmX&Eq? ޛWk >#s<ׂ0C\&a& yAKKQGCf ęSڥvR'!$C~!-ۃ޽$@#)[fg> sw ~/)1铅\[ iSK) - ){f9B.djB%XISS&QP/ٍla^0dp`6ߚmY7g|Ou|3md~|&r!nͨ+ٲm3?#j2e ŬӬ\v_`[@EcdY};gvG\ɡ MC?կxFo/\ٞQ!N<д}eo5d;Q *}ر#NѣGlٲwwwrUU!C0ydILLٙ 㯡Fn"((7ݻw '88iH"n6:'/B=ov9y$Х36:k\Wo2O5:]l@1nq6lM=jUt˝RA|JR@Q(P9=΃i߸>t섍Ά"Cd"H 2Xvq_B+b>!"F~̮c;N: N>S3'kwIyycJݸ,+Xw 6BtRq̼W91{{ .a2"ATqP,FnE K*X;!w{bMqJ^gƥ"K!IXsQv0Ut\LxAx%/n"FB95u[DnctꌵbK:\M$Y g2[tJJ7G;՛D+uN"t̃⸑s1Wkҩg=ܬl\jѽfhi?GPSʔqQ*4QB]'+ҡ[m^ϵGxPlۆmH쀵#5Bta7{n C,\*h"Ȓ$+(,\9&ſo A)Ʉ 6s=4MC͛)Ydvaܹΐ!C>}::.;p 4ƏDGGSn]slKqdM$go&0"h+2'ZU@+SLB' MvuvMv*Kv"w5{M>!?ca .n%O jA6$^+̽I!`g4MӔ)S9s<5̛7rq'7Ќoc CR,Q%STc*®515}tVimŎEk8>cr0?AWV! 3-/'K¨k<6u}bQ}dxG.L`PueGg.#.#@\sJYuS¾HQ\A9 vգjкeR*8g772$❿mx1U* r};H:'O&]Q AA&v4jO99<Ղe([X| B~Ń]ŋ%!-GYweG EvW%N\1z+ Ihв`c9Oڹ8C9&q=N]$MMv & 8L!?3A'5P%؏9J2A!T:q`ǐ)ew}|}ud{fo9鏇G:d %JQiY$OblP$ Ù^qGūQïx 2%j atͻˮ4hX~ϮmTX>r? ki;?8_RnOEҏiIoBNcG\p7 \]ȃ-Ɋܷ[_ϫ >^aKT8xbڠyYu{z s~AxPCܲKTlFeLATcQןU[VwizkazӫX65I~xUzOLѶE Nj:f;wyZ1'9zBES W=|MA$=P:O: (HHH8zw7i0&>E m)#ZMwJo{|R^cA^MUw'37nl0}y<lYglzȀٲ0nڮtN 0j@<ИtZ`K.OuP@&L3gskd-Ӈ*U0aRSS-7tR:t5bC"}l,Wc\N.˚^&&ICWT=*4T ih}5)-Kd}Z?ǒq204&!ci24#MSTXyfoEUUC>!+x<etE˵T%E"cb!'6#/s9^lukٹgxnv69y`RHcGAVAOr5,Z8u4]ti0d"]Y:|͵hMʫP"*r?O-$$YՐd1^=_PgbTTIeիh9=3;DSQ%YAFEj繮 px MUeq9 ̖f˚q)Bi\{|rAVM4 :3g[o=RJ=zGoXnΡO>̜9CrA'gMBQ H&$4_c7@QPd,\Awj3CАWf7g,f%W%ׄ`iVvEAQ,io3!+ h); `Y*Zy]\;R l)<+vUs0EuskOZr̔>YzpQ?'MRx!cĉ 0+++×,gߡbzBTT)[l!00ӧ'2 #<<TQQQ̚51cI*2OG -ܭ_{!BrU\XSDTE?#_|t[(vہ `/~AB<==Vǎ˱n֬YT\YhtL> G|(]tv%J c; 괂 PZ4_#˯;<IJߤi Z)}ԗ~x5¯8".s3{ë9!dݏ`;U 5a?uϧ) Jtep =6gd"Ϝ]h޴)^o2?0JҹSjN/o;3dIR/g9yi9B3zOG=[dW9@CaÍg.'2;9'-#דFMC>~ʵ_z1dlzz-Fq`|?US"׋M6!KƳai1EcCgg*¿B(5?9A؝n-OQ[HQ5Ը%9g||[kN_mX|aُcx4;s >Exf|Lœz G$?{c2XL/M{I~`Ų Y3*ZB${ù2^K8r&b GP̈3dgr+FFa^jR܎ׁAs~㞩M=ʱh=֓7#"ߗm  ƭ_8nz-Uݿ5<*W$%Rx6OH~ik88߶ bLF-^aS en\,+@72}&M& C&ϒd^gq_ozY0ߎL?vo3Úg܄N4@ϩh:lcvZ!A7מv?ul?̩z4T ~73sz_Gj_өtC5?`(:!Z`fLL /!UPoa-,Vm cHR=g|J]nf5wcqb![YGLL$_7fs衊²?b%Ò|'Y11;غh2îb'hN2~6Kd4%+6nc9NxT<#7in_YI {?g2.6}974RS͆hz,Cʡ9G'4Ee*Fk!GB_%]o~qD ,̫Y{+7e; N>lZͤÜ35$k@غaH>~w&ɡ_jf )k^eqDcDɆQswG87cҍ[I#Z$+.{2~Q$[7@7(>[; {{1?Z.[Kl۶_Wg!حGcL7^2ysmʆi-xWT ó?|n+ JV_05385>?θQD۳`q!QT5֪W,#ijhD,|MCҵcO3{)ȲfW$130~nХ3=Fu\p{N8+76l撱N^&buBZO*QQ*H^)wx#McBN5:F!ކe!_A5H"n6:'/B=ovù=HY6dEA%dYFBBVEQu5)`5 R;% Y.gɸsM#avpܞ~EP$뺖)A(ٞoUZ6oہ(VNڙ =E֕m;Y}PVGtRq,vɯ8KE*C$X`9IDepaRV$ND950xmE{ Q.m*(N.OVqa[zƣ߶]`oB+B3ߪ!ʒ(:GGK"tUX"6:l5qe>hZUa4fsXQU{9YؕóaiJt늍ΆMq*lhNQ{{ X1h\ECq˭*dd[tݺP @1>ِNo߰y_rdNGɣ\,Uğ~~;W$:G7kZA%ٷ> x{hUb4i'2KۢZ5͋:а] uO;l>JŐ`* "\C2me{mXۄD c8&7PRx-ªagū2E˔l[Yv'SV']QQ/4M%n"[Q*Ơ挜dȫH)\h9GϋЬ{ {6ے n$$鷉O:nܮFVT2[#vZ=AWƼJsGo=D%_MC2]&dVi ŕ"nY\tp\eɸNFU5PSHHĭVM(q5]LAՔRُ~_3:>k].Lag8!ld,$EAF}k`'u ֮fTLA;J֩dRRmFn"xrڵёx3Q[腓,!WmMX^1l>]#Kn}IED6B! _){Yagѩr"? Oľx474;c~ E])C7-`'gӳS<6 H(줐x7 M*nX$@p%@M&1Y%Giz h̟?H/l~GZ~T5%?Sh1>ϣ1r$ A6';/.@s2X0$!K9m mh]r鈏$pa+oţQĘ:;wR+cT.o.X&Gi)g bxebbb&%YA=Mͺ#x9TZbNo c6?o??<225[PxpЛ 6XN&lJ4s1| zO:){ u5'Vȧ A)](Q(ՈN!n]͖⥜Qfi@:׭GcY;dss=W$$)R*P]aSm2MQZ~w үGlUv ǹGRq.[Yf9j)$f>c7>tӪa~W?E;gxG8u6隌R5T,A& 98xYh04'*V/IAB֭z 4k%^$m^HԵhdq2֟2^+¥Jbs0Gkƃkt*3ITg PϷI%O<:/DkLΩ6Bv6&n }EhѶ*WR5GOPDN=hFcheʷlK jAIz+ݓ֛֙?7_|>Fr% Lf:eCЏ̴3>̟݇S'г)4&.Y~e\FsXeNI mZa6s#ȻTv䕡?}Ɛ޿dx 7ٳէȿMzŴؐj%yKףɦ9 ^EV$4Te VWA6lQTcDCMbB4l%d TMz|;*gt;C6q){G UJ}cfK,=iqPHȊllL,Ih91w@3_>.6N(khb(;5*jIk9;A->>777,Zj~?viv霫{ܓt)k]^cᆪffHoޤJ^CKHB&H"t*M{X -|n M 9{عw2-GB4C`(n\78ϊbAc{ ,#u}\n:Z~=߱.Jr8RǥԵij׳֙6ֆM柨؍k-_+.O<_Pb}Lj:Қ,2yR]f1| 3}Š%R/sz"a`?:L2eNzR&^>~hINˎòŶl eòaK7"s~oegѴTvyVYγd&Kց:E[1m4Bp"v'fb >k~*RJr@g fAAUM Uc)j_QgTպ}tI rFoF pܴQ4[7cٶcHx>sR*ݶgp ӮG'#Yo1ߜ,L=fU-%p8׷4GT !.~iRucP?j4s|kiS'8At4BIw=k}2?p<"|C砲&Qqj\6x}%X1gitujɠsB(DVRw1J`ݧpQG˵4N4*:SjrR|0(W֏ό\d;0WHtɋ/axѬטed-&2T-.l5Op@1E=,[Ce_sԆϗ&rxf{-LWe1aNF0j˔ , :C7⑻5xU'+:aRu^!Y㘱Wn^IGs_p{vʆbxwsI-8 MgLksI[PqB~B;9k8'+.FRRC{,Fm^p 5gYܫrh_/\ZːS8h!dލ3_ewyeFw/#JHRuyg8҃/SU3Qp44"_ƖBxc5nlb29 Qu zVbkȉysSX>MNJqE|q%dд|ߕQ+P/县 k[&1?3;Ԁ-LcڊyEEJC#Gv ȥ%qb&B,SXţЊ'Ѐ(EmEmU!yZG c&O|! anw3xhn5npdP y:;jPև9'&mEf'Y,o^WhMFu(3֦ f [bV&t9/{JFdOLn [^檱 @$?4Gr-G4eh[%$Pj5%7O 9A,Y)Oo0wSyͣ2w&~*ܽt>*ޒZc8[!B!# @<EE2u^bOsOyE혧(aۆ;кX,`K^:ﶂS9NʜچnAn]p$`MYv.J:' !HGdd$,]%ӎoӱ};CÀޤ}~t>r/THB C)[N8{q}Ff$9-;۲0-ˆ->{>/;e<"- Y 9':H/?4ʳRTPќ3(IeER-ߧ B!B<~~B!B!x$!B!B'NB!B!x$!xY.-SwXc1]sF dl6# !~a=[ g sH`<ISV]68 -"CdJ!DefU7Ѻ㟻u)䙑ю tG=&_D%fX~| W05捁=i7#?,-{ -NŤ~^y2#xwX3c@A</6Fߗ_ o&5{U:|F񰞼/S;|oorh("_Χs}%rWb N^'Hz]ү)=Gg\Lp'W6 Uorlgf'.Ǡzwܾ>JW\Ekw:qfֻo(AL~WBd PwO޷78:^I[\"֪K:@7ryя;t]}Lm7b9rKfOWٻp2kNK5B< CW(}9e_3mir2d}9K֦z!ÅxVYnݓhNBNY}'; Xv=Sxwt[v- H9M1_mVʕØ{4 PH@޶czvvoY3' jL&\<B L1}CH g˔4[C4j%b:5cjFڗ@j4q)_{GQh꘯`ԫU ;0x1n}9ĊaU*Cڭz,1yfzj'9R5 wR4mV ϋd100sl^iBۺ/]K.|ut^TZpW73\ZURLiՙI_ϦwUF?b0[nމmiԌ;n$æ=Sza:mуI[.pHdP:#?NVֽ҄Rb:7br.X~hRt @4kՠ>io-$gdCz['=[SVM'97աZ0^:57MצzH{| O!ԬYfrh8z<ݚPnCZֈ$kSڼ72kT{7< ʹ',1 L V!tOU% T+Iȶ}xv!4;KV֎"ֳ3JG.ϫӠ&4J6f[\ DƯjBTZW'iHBtQ4i~8=' `̱Rb3M sttʡԱlcxۓ~X :y"+ cKPo:aY<ɻ`18$򭛘غ mjŰaQt0k#и/Zܻ;W(_b. FFFKlضec1cXNh{lyvgB&R/%o>Csb=mPx}:v ɠK?TV2<-B<^zEY1D~|(`uln"ug2xq p"&Ekشi5K?EYP0x~nrX/?ɗ1C`LͽF ߰irF>9kN{Gnb3ofmW?gL|ɤ+"%lٹn2|׋Ew}qg<7McQm}mKnv֌*S3`wq[]>ݥL S?;ώ1sóf[snI\d/Ve]gS4 +z[UC2E09 MڤN_H;fq8\O^Ntb#҃do\b2@&!S@_h>ΚרU^rYZ;9iiȝ]$00n?VZoT' h[mGIK˾{/=ONozb&n1ɶ)F5mBΕ)],ektۀ,Ә={xK4 :Ė1$3yw◛BP-Subr k/SvK*)O*% x<̜Վ_ ӨMA'X/vD@WLiղwS@@˞wf\7៯|T&.;9ktuѳ>pZ.Y?ۊQxK閍)]Lz;ږCEůl-*]ҕ(lCYPO(O64oSoTJ;\7vur y>[RCA,BJٹ~ \QWZ΂zQuŞ˶H6yBv<=qU)"ߏCx~t(hE9MjUFX5ږ-Ն")DTmnڍ;y?}ϒ@G(q:4sdhcobݚTڿѣq:Q ئ>lk[aJypӥx3e{5nRV6V#sV |>Mg=O+NTdWCVIXnEq+Kv9i;gL]nIoe!xL채E5snGwl淽A䍻݊.=%5G>%p2v_Px(`WZ قTo {J!]"⸲k쵴x#;eb JY ~TkhN_OKX0yx<ΞTS񷟇jz|(n]"⹼gM687y}$D*:w_1nǰuRC[*Sˇ1dsaM}"Nw3 fvA s'tuأ;zwwI{°7"dϻ[V,ٴ}+qDP) 8n܈0s-ڛ< Z!Fr*<(\V5?p}^6|9*mțCu ggYѧ(s+ɷBz"u|* _w v׋1WT TTjI0ȚW22h0zNWfBi f%mBK%_/S/1lw ޛً+MJYX}C;8w+7ֹw do>Z(*j0J~?]P"HSg1%YdA9X-ޮR&l_ÑIͿ6IsY3'JMQ дaK=4Hv335A+*ׄSiM}p`ZY>%AP0^∋#CƱp:Xp+Vsī8H!3BL/ZPn:dWeqwʼ50s-|RH& (J6/nł |4)x{N,9)ժ[65>ݵ]+m"]ړ/cLiƘOdM"p#XSޝ=H8NpEvcYد2e3вSE3 58awWQjwуYF4GN!0Tk]2ytL~ .(! 51-zОW](\cé퇕@}U+ѳm <~A t S2\k1v'V̈́fCF=ߜF& 1}Ewi]ʦ.er^Q'1\Y&t2Z_߾j:@sWuX69,_*lMi윋 j#},2ko]oex?N4ۇdj)|۷4բ61>nweTu~B&22`d.[Nɒ%ؾS0`7i-v lJdL’jrC CpcBIBdaÔ-S?Q'M8|>#v2 i=_wXؖXڗ-ˆ-qs]FR:!ݣ mW!utCUK՚BQTi-7Bdzzjv~Kn @ۼ>)B!Je&a⯞뜝Kҝ(4*| US2yc('l4WnU !&T{o=UPm !fnan爵 ?I}BG(ZfL*B!?O≳$r۩^:</.\屎E*B!"3H3n6ۂ'9apiD: 'B!Oԍkt ,0,\Z)yZ»h9%ij%6]KB4R! c&F %wQ,^ҝEs9!fIB!B!2 @'&!TiRx.*==frm=aXiGB!B'c@'&9fSR= C7si,Oy_B!B!;xb,bӄ,(2i%B!AuN'#IJJrBPpEAUzf&/xD\|C7J!fJB!OSOs=ʗ/sτ$Ɯ[x8BpuMGgtCz H lYʝc{002\H{`T"Ӳ7Vİ K"V O efMF|D0q;ze#1tK:7:Q['0~˝5{1vl KZՇnH_!BdF˅o>&> ,wH()y0J F ݒj=Üĥ3~(f %z~̗*p P?oU aJ[qcېIo ר "WB!Ȕ xpAڹ|P]ܝKsN"y.ťYDX&`gXX3k8E梘\puu\pyc1mf\/7Aj4l݇oZ6\=֠균ߜFQQUUUP0?7hӠuj7ۘ5K0&p0^O!&~(@$]˼AhZ[W4cK?z.eJ:6F5hm 3kѣe]׭ObbiB!IB<;'/uS9JVIg 7`D߯'29%bXM1M;71q4_N?◯*/\;Y=1w) 3,%{u½b(l>o$cq.\j7˟,2]`nE QtI謾L?=ϹC0`UjOM[W1_>XB!B< @cD`斅jݬyZ"O^x.jEx 8O)6X*a (.vbtThә&ŋ"z8W֫5_*U(|k7]iСI~&5KH ײ4`ߖFl9Oƥoc2"Y]|4|%X(@[GST͟FmE y慽T/ ]쏰!Bݠ@kܻEA&)c-'mc5рB֚/a} O"]Oy0)b" yO$G]MC3tt#x!cAUz%Zi݌QگsIE Ņ{#?ޭA6S.jr$Yֲ ظ;&'7n?k&=X|oZ׳S&E!BEܻq9 AIݠ&Mx,MԏH~)x֙Κ6%Tk60cY z̿0PSmtnB]ٲq[Sqj Z`Vbs=P)+DKA67̀ü~4_/UK!BO.ܯ;p)*%PJ .+OޏeCd>Jzc@<(x~\4sd ?^KZ%m#Mrl,Zr`R!>w ZMrT pKԥuk{{"D&b<{[;/%v|t2%!~i)]keC?-pyeo?2jG۟~a9[ c-y'< @O ((j}/TnDų)K.t/ :uw9꿐y5':Q&oΏĝ\r.C=dF8].5fԽ)o6E|MG& oBV/̓z}LBG߱65եۄ\(TĤ;= kVNqB1ZTi5}wyeo`ԞoLqX޼Y/3ysfFm)kwr3ȕ# !ȼ?NKšOTv*h7@MiIg;ATJ%vSh rFTTP ;[G'MɩMe[~\1zW˜ :ZtWCQmS9 UfC68yeTGMQӅ !x |<.w J9tGg:Tk)'t5'$!M:bQIdF _kAkܚql_=MޤUh6jK9r@QAqC_kmѨA='Yc>vY|p_f7Ya+ΎYxq k8oR^.noj_>i6G2y^ `Hԯ[m>^KB!BdVF0푇msÍbGef|F|ٓ5[~؊3{JڤmjoX@;m5C&tVm7rpg|Hvd͢[X7WØ&Ι,ڀnAq7j3v&mNnONJDl( W3Wu|a6gY2bkS"VU\&vVNmRУ6g \>mfoƮÁ Eݱ߲e׌,}#(^(ߜ!sc |-}x*iNJ Xa:mrZoD~lO6uԿ9fK.;% PM*,z:m"o.O:7nxz1o6vN:Ib1pK/ V-:1ݳ"mcŀ)ᳲQ|(D[ʾA4h?? j6pKy %)3Ai$wfW"o_cCwoDߎuoy'U\!B i[2ts7Rn!`p]Dg2萇_ ~5ꦙd @QP1Ja|:d5 [o@M5n_?eZtF+ҔS▃Q .d?3J`T:6%Z"h4t9O<"StBdDsx69i1 v:c$%={a{i ?߼Ԭ"^T-?ƌYh6I*9Kfx gp^)^A{113z p'PW\2m gpOiUCU3bbߗJ](H}r;Rh>aJLי9c(T-ƼzP{L:w oJ 8~}2C']s)F䓇Ga@R&)ojtƱC[Ƌ`lcyϜ5֓"Sw QOP Sa:^- ߅餭wֺ1^)~~-a]Q6[б~^;jTlǪrΊ0t H쐜o}(oIO:=dl Ҁ{bخ'uKߞ={Ss}O?|rYg$`,@Ӳ{{l-al7E2B!"RTRRQԏE)ɷԷ?MO[>J"˴;mef[H=N9+*jKS ( Z)q_JEQI(5d'2_}wzǣ8S?9l5*>#a!B!B+$!B!B'NB!B!x$!B!B'NQԴc$208C3h61nYeqĄB! ĸL=z2q^S{B'r87Lj읯9BZv{*I)B!HZĻH9"wc@/W&O_x9- $޺W@poIĜ;17*RqUP ?9 kMa'힗 ȼB!Q...$&&%3%11 dHB<1YU ѧvKx5)P>(($0IKY{2.m#;>imу5Bimy&57js&`b_~A򼟊b^m&Krus'}M|`U|l5k~%J`1E=ӻfB͙3g(T0r%M9so,HBʙ9Kd2OVo<ѱb(eHg_/叫TsV>|/~Wa>myogi^RYL($G=!e9 gJ'(Jn b>uר:3Д´iYOgdu ߽/n8g LP5 ooo|||D&#y-FNùf. /9g?v;궷T{<II 0%s,ܸ͛q~N㨐E,r͘r q:x$'ߊf֒;A IDAT)HEa׮ `sFϱgY{PP5R')+ n%G5[WQUcB!BH @ܳtCys1 -`8(gGz"B'GyB<,i!)7^'Qa-ѧ:c`Iw1eyB."B< @FKݒh$D0UE!FKB!Og!I-Qxg/@֚Iw xth{_!,Y,ؘXdpN"i!Jp0ܻ y|'(z Vm΄BٲN\-ؘX/G#{,/x8Bpgխ_x_0uħhi B]cy9""C= "FDތ DDDDDDJ5 HAODDDDDDDJ)q DDDDDDD)3wY9ԨvƷuxkgܷۙ;e`e^\wd}EDDDD74 ^Q>փǜjժԁ9IF|篢_'8l.{/Bja*""""P!"gZ pCq (6 lp1߉JP"""""O 9#ya@YrNw5r:thON="xlӦE wͨq;.ҿ.Cts3'$W%~컆q]rd9{S}w 7\މm:I|ǿ0DDDDD@x0,0Wl 0wR̼Quo`q^2}Ʊ'Yx8vx=ļ3[:IR|*,~GE>Y=/䋹/0]w脝V/R3q?aCX^as~w)xpl/koaޯUʙo3 ,kN:Db7E^sfEb+XLyrY`$"""""<"r3ψO#үabYy%AtB]ɂWiZTFas7ib?J˲Q8Hf!}Ί#ӌ.ONxG0ly8預EDJǓEffo";or:]-Z2,H |L*o18XXF6Gv?9ppAeQ,2=&ro2]>vo:]Uwo395{)әz@H)fۋWŜmǼ~a}/qsGH6(S!~s ~4+]/1i=zN/ϥZրE1qF֤}#ky6 /ۓG 叼cUA‚!3?_""gbccxg<.~`1;vȀqx X%""0qG}_ϩ=m7x6Wlם"ہu9[`HS!"""""""%N2Ø#x5"""""""J3!-˫\PL3YKߤ9'c# WNJoB?ɏEQDDDDDDgM);,9L% ^F03GA:eR&Dz!4?"P3px6'i47Y:].!Cia`=|[/&@75#x R3)cKh.;l"EjwEaN~vLP &oIc[wzP4E8dglG*$ئ[ۇc΢rP..cdd'x; ՏbXe}kb$0#B &$$ ~qCdHf DTBKniCͼ YZi_EDDDDDR `m@6C!<4;1Oh051F侗R0TɀJwx00s PJ=ƐlTfQ<ʘŀQQ+xpoP?c*\pgi^5ylc2dsn46t1exo n;ލxP&g24~t!ĝ#Jc`@L2G*~y߳2,s/ e G჈ȟQ3\ZC (B fCFZorsA`|%8P6.'χN*5'fM iOfa2&1!4d8 ږ3|_~`[;& ax/xiv Ul[<;3Gʇ 0, 4ؾkpu)z@C B=8P6Ԅ $6!&3ABEJI_lݎqw޶zM1a&!exkhneDHwxM<} Sg˅r9\j8n;/y8`")8q<1ɰEy#BMd9dfOpnYj®͙^؃aR6(vEHɴ: $׿,`5 #{HǠun h'_(K)fӿi$g1kW69ɦ2!\_"  f@ ~ݟ>Lm8mp5#) nɜ&woA6ӲpЦQ /E=ml'+v> y߹)=g_vz{)wߜR-6ދ-[ْfO64oݙ&,"r&S6 ,#ԮY+XDD!"Res`^|cQw(u s!Qy%oڸq2T}#caw9s9ٻSDbbAAԭ['?C= Ds8œ8S67濫0chc2;^tbqZ&~T㢋Fh!ou9S,K:wjժjұsm_e&Q-;͆<5l*ix01>t K?;п;byOv?Ī xS ?|e(| 4CDJ-QQ$VYb"3H9XS(Ϟ|c}ܚ ]&UvS:2ąѐ H= D2"2RHNqb@;#C)PQ8;tmW 3'Y(aZჯ@``q_X߂RDDDDDDDJ)q DDDDDDD)BDDDDDDDJ)q DDDDDDD)BDDDDDDDJ)q DDDDDDD)sb;K6h4dٿl<7tkOv]wQ'p3Aku/}Gy""""RZ DLBB-bͤVhҤ {RJr9ǬݱPb4CB 򡮼vje|˄WR% 28-ӈ|57䣡]y|L71s34eOu$ 'upxw]Rʡrs8^!}7CBkQ_4ܶOoYDDDD OӧO6oތ@t:ۺu+}ĉURهiM^Ѭ#\[c8mNe\*T=K1~<;_ٌceGX{._oyA&Il9-U+tit^_jFssZN6=ydX 8o{WdGG, x,+VBeoxgfȦ4;ޚoŪ\_+>ƾگW襇Q˅O<0,[_F=6.}qWפOO "J~cV^ɼ|:e8͇FOXMgcd3_`+X >r?=0jAv~SRJDDDDJ7~i6n܈mہU8l޼z*JJ9QMhW4"9aް0, 00-Ӳ,{rpҖʡ.ªu֬F/|/QW]DH8Z=կͰyffN6pPJV aU:0 )4p}U4k֒2u<8AEx\dQeub" qJ{a`8C#[ .8z!_ &U(&,,6n˅rVLN լӈ 6"BoCR 'mbZPoY:u"ٳsI)m4)!!ӧ  M6`xKNN믿&+;QxC^z8RD)$8P1ҝ‘㡔ʗN:DbF&]ەi2Of6xլAdEؤ8e"7 `sCX9h3/M6II8∳|&(s$$jSEas=AiymHj֪X< q6So$%$ݜd\COo,=d/Y pH"GqVH U{0_7gpk{m<8Axd(FiѢE  IDAT+ b4m rlݺx222rYp!~i}R|f\cUy5krKݺؼ T (]xF,OHz2 2 4ҀՀz__9&1c;!j'"5b*v*rp֎?l':"PĔ/GHk7⬼7L yðXi4mڔv6mT1`X^ɸ7X6# F[FCQUnwzٯ|`Yq'v&*@1jo{Uc 0(߱7#ՆC_1\p%1iٽ-`ɸvp'T؋ֿgݜp,,#ÿ,Eڮ_؟d\q^`\F*;bvsͼ3glSw{kI ?'pL rA2def8Gٵ;CDDDDJ7"XtJRSSYb6l`TZ-ZеkW""" IJ3]2;MGbQt}&^@XqZ _r4 T~?Ϲq'VT5M2gТ_ VU}'˯o})Y=IcxªҴS<ۯV<:My11Wl;,־'^Hㅩ#lNzQEKoU;DtEǧs5oC+]9Hz"t܌*x?70&R\DDD Sȅ(]Qe=w vm,&9.⿞S\ȡRL}WeyEt}>ߟ 䛀o߾{=1eNѣGs_ `aùVQ_y̟?lmt ,ݝ cc= țpl6oE` 7k\:X?P:ǘ|hLVexk{'v̩>6紆abquXX~ {>//M8؎:^yoRʼk~~g{2pF0{id߼>w^AޤSBBŧq3o8%g?~q۷xmzov߶o<;E,9r,t'o/qqa<Bض!99zƍqF 3L,r3_mb9og`?PMo[g2gG:} {6RT9X{ $s?*#s٘F5{?3۷iY3]Ӱ1]9i= 7\EޤR'W,Xx1 555Pm{n:w;C^ r1cQ|`Yׯq0+Z3x?F.LX%XDDDD mٲA;|𗞞Y|9͚5S!R*쎙,ݯR""""r6R!%*--믿ǏVP^=֭ ]رcG@ 8qo%222ZDNCi$""""Rzi)Sk׮84hЀ5k߲`,X~˺u袋ߘ֍{>Gߢ wg3=ʂ߶3r}ύ哇ҫsy}/q[1͂2U.sn\*2΋x龴w<#NA]s܃+-nǤzD}Z*UСCy 222Xr_O`!CPRb)moe``fnOXI FL_^^#wh+%>Ӝ[rd` .;<0a\9>;O .y: 󻚜I0EDDDDb O=cYM6{/tָqcƍX,g I`Vn+̟&xˊ8P 0̼CDDDDD40.\HӦMKЅFpBDDDDDD_BN*..+VX} cʕTZ(""""""g bgfѢEl޼f(4iB޽\2V`x)b3M*U0dȐ*?!"""""""R@HS!"""""""%N8"""""""R@HS!"""""""%N8"rvro^xNau]uv:9%R9ytmVHY*ߚ+M-pEDDDDF= DTslw-`omGN$O`ӿP!""""Q!"aZ\.Bkz@ogpR4ktc|[\v3V$ _Kodl8_{)e rvuZh9==0S̛;.D6q$#;w9C8d&f ՘5]`DPqzm!˿XλCYeLj+8(>WøE|#_fsɜǰ0,]WKqu[Ryg!swv7^ M*!""""g)"Rʹ67U;C=ʚE&hP1 WjkIÇHvTLKxplK3"W^KØ`\A\<_ܸw}^R:v -du NԈp^nľ(&4ˆn..>i|,>W=VV"0se_“E߲e30ˆ)GI$bX$V\%*:G9|Ԇ0@yG4Llު!""""g-=|H3eYX<ϳG0vmEnyMoMZA4m}KUIp"G3H<ELY|br(5/M<@PJx\f9C$'%vVe/r # sXF7SO,do |l=|]sՕ^|Y`^.C| hhz=t~%\3L3t?Ę.k=qe}0Кw4 51\?a_dPw©v^Fe`8(ˈ , ݋_xuEO. rZ&""""""gW`_xL\Ի~X -[1ө F`39)+ޜϾ#13sY'BH~618S1FΖ0=ۙ| ڲq_ F& xInoi'q=OZV~=""""""=I `y懆V t ;ðXbR^,9ۣμ\3#Vgwvfy!YfsG1iM :d)<CqGsur978@0ͯ&q"9S+n7OD0ͯDP\AewI=Y\wK[*֕۬YlEDDDDD4!R2"/t8ɌE՛ g'_f*\zxۙv]oX~ҷxᆶ_`S]H $ӷd=j嗕g[o7}>bOz6+2X(.NW8g o3 #gv&xʙ9»ZҰQc6jLth^[T"}u!!g2݆͕CSH7m&46Ik48u!}7C R![WԢ5q4=p{<ڴ{W}Ypa֣-Zua/r_ 9+8Aq7l|?#'iҩQ]9h (΋̅S\r[5N#groܡINw4|q`֪u#sׁia՚GϾŶ,0 ;'f?or~?ԅr5c|-42plOސ8?ZW_.`DbJj7.W7ӑ-dOyo-y3"֮[Ňc{]؞ȺbK}2mE\=4eլ=z "Rʹ>*5kICyz>v&`QQ jS+9NuU %8Y [7R V,[;)n]@AT 50Bk9|RN َc?LN9Դ2B/ΉE&7rK|=Y9MWKT: q5Vg9X~7&6 JW_ҫlEDDDdhr.52C}2~cY|${,D~u_Hj֪/q\ۯe叉d]dƵ9G̊T3ȲL=؎AV=ۆqq|E\D,pp/rrݗL)0X.#wvҵ]kLFBDJ9 |9g`L<&]ػgӿ6F!s(cñ#ړx=C!yp.]ذ 0. zhczwbM9KE ӌ|`&P:S!@Q@ 5*s^e;bxG mʙEDDDD&9)WzW!ʏְ$/0Fu9 WB*qafa|4hpeDwӖ]DJ,ŇÃ#[fqiq.{s|U;WҫlEDDD_BDPA4:\OAX{ c5Wq{d^ [߄:\9j<•pstB%{Ʋ`Q8kȆU2.ڣla>^ _Cv=:;7U_c{ SlON``eb_W[/ Loضga=8`vaZF!mO|E6Fc:sx_A3J+8"R%$$X|^0jkED(g90~Go9߶Ƿm߶+˙cƌnݚ;vj*J*e]J(ʕ+ٵkڵ|:ܛ1 !B!x$!:ٳ['YP@PPoú WWWf̘iذ!):;{,B!œH?R]z^GX0}7-a敌灞;}ʈ90f}q-b,cǎѹS'=z?/chի&ri~g.=e~/ѣGiڤ1Ŋc,_Eh$qc]l(^ސB{iqbFt ?m2s-vO烎nO@ ޟuw\C>ZuSmi(8,FƁ3*1Xz:nx1a_,xOuqNk0v4ON DBi[?fR/R7.7p)m^9GDŽ9^-&lh4 ǟ& Z{;oor+2Ō01'^(?X%P6mʑAQP73edprzMQkjTG*skVϥSxϜBCX4Y2bݯbnqY57ç^dؒTZ\<:8#Ɠs4Jj΄<ŝɋzQRWyvͼ q ¨0%Br4m_!_Ӏ8ogܻ㙱eE wƎm5^#ywLƲ 2uHҮrH7&Pꃫo,OwP|Y?ZksS8'[G' óʿ^_ϲ c!żTTxY+T)+-S?|@/9;%ұaBln"͚51a.p~M6Y%GV  ,W^A NG=駟>3..͛w^6mľ}l_4i !^4UU}0LhiT՜$ڃml܀5 Y=C -銣 uWnN^p{̸Up+w^(DѼCe;q(O5pNXBҼS ` Cxؽ8F>0e|pvvѣGjق:-[ ͮӠNmj֬IQ)ӏr`P47/*~]+Q8Hu*ídm($2e)qAp׃ [y?eqlKzy.IniRKcϮ$yit6uگ2;HZ0G'wCqB&#(NyUW%`x2A{)NKVo>j_GHfmn%3żjU^!ϐɓ-Z`Ұaɉ'OҬY3>|lO3h"RJLhݺu/i֬۶mL2F f3e˖͛"M!̜5ҭkL&s$S%τ̵?UtIAߧRpqw#a:C:f0&~\fR~".2e#[݃,ě#n{imBS0ñchִ Kfᢟm۴ĉXeZ"Y11WFl6M{3>ĝ{ 'J|4MS8q6zhn4Q7Lv>2\JYquyջyw8%a_bMm7 i[6\w zMMNn=g{iަ)xqN6WgЁy:Óϣ|y[ D=]uqw8بӣSo!C 0 Z k=y$ ,ߟFqm/}2d`ڵԭ[7Ց РA֮]KHHM #""`vΝ;9qE]0`TE׹ILO}*.s#DS,c̊rt() =iԡ4G0ݻ}U貸5Q@sјG;]=pT~ G{Cѡי6#i#ApPr˒]mӚ#GzZʕ+gKր)dQ8@w7˅dzoqLԫ1120twTdRLrtQ50~KQkm8|̳ ǥ(/# 1Ȗ|-sVʟ;Լ`ITt)ԛv}X'!K;v,Y Z|4CҬY3._l|0 ,Z//4uEnݺ,ZfkhѢ|臆 RTS? d" -ڶ:8:\NWxxj=[Oǧ܅"OHNFo=lwvE|I>/p>nĂ^{n?t}i{ٝ֟%~7l4:2.MAQ$H<2b~./m[ ١dVl1띨nUF_ گJڵ-dt'GGG6nLŊJ%-m,=KK!oߘ0p0Vɟ'ɶCedۦdZBZbG#QmDiM # 33f k֭֬[YIH׮]~A<|0>>>DGGpBvA*Ulw҅/2qD=z;BjoP..hf_J "޴ض^@!BFS >9Hdf4پ}B!BbIBٙ3gl:UVضGQ<==ٺu+rF46nJ:u쎰VjU ٳgB!Bɽ:!\v:['٥( eʔ/q IDAT_~B 6ʖ-ˎ;(_MP!%;f!B!/ D]zf4u?5&;wr'wve3i;f!B!/ DX'ndC46l@ʕ޽B)s={RJuIvY!B!ċ'wiVxqmf6|6lhwDCtt4Vb̙߿~)5kFժUy 襦i̛7&PQxq&ލƿxuB!(BLx+gN]+F"J((֬YC˖-ر#t:= #22UUS΄ 4Çsm|M0L߿0p@Zj㏬Zʦ%JXlwrv#s ?!B }EAStifϞӧ>> O5ԠAvA޼ySG!B!ċޜVr9~8ɓ>} 2'OrM"EEQ>֥( ?~C޽s۷oٳ\~WC)QիWlٲzB!BIB<^Or([,`^>bӒb 4Մ)ٳקZ%#8+GAi{*ܝw/Lan dN9Ŷ Ȓ𪊢Cg|{=գǽO"sϕpGU|֩T:tǦ|I1EO|9+3a#(K$B4z) !U`pC֍(oąǛ+sRʿ_} i,>گoYG0rrvl˴=W*Y䞛bU7NFẅN!x{r|4qӀ޳˜֯uU />j⮲mj?]˹h @؍7&5+ 5M϶<83S'&ZUhg6xթO=Δ6\Mx@okקLƽuLN7^tb^Mץo#: Ra) iӫ f|)qh :4 Nj cΛIhwjO`]OթO/~Kh ݝLۂ~ hq?)({g(x5[wǪS,.͂McXO tn9_vM/~I&nB}6E}gjxv[̿1Gw$`fF|Ċ*r WЩ.IԮCu%/ @!ŠJ읋읿?)8CIoAZNa /['fb#K}&a۶flE.~7U |ēh#W|<8heoc- ~+gޢޤlۼQeǘpbX:SW}G?d9Lh߱%> ؾo̷0i[>:Z3EvB`@#s__OIT]13WiF8nLY0x$;];0cv~a-ʺc#lfb?g'J3rfvjЇcۖE|~܇9kTW+>+ar s,8TXn3WsVxk@t;7ϡCƭL{qC!^sB!D#'7zuOc%??uA犻~ɏ?|o@ŗ!9r$|QwRVqSՈܽ9տ dьzЃ`K햴(劃JTv*O5w#̅iڤvlB_Pn(L VRz#m4+ʆQ.\O08Py{*gwBoJI~]^$ *mڕp49YwqAg LmCPIbyp^Ǩ~6i]qץ:#t!=sKhssVe;hsW#Wdw?lv'os}=[_vOV_ N7}444y^BzB!Htd!;yVo\z u'нՀ߹`|&uwcQ I]􈯿_& d+ĀEc^06!2[0W1dG_ݺOBV|;i˷7:SnwF}2PG49.KȞ- *_pue1^W]Ն~.ݛ͐ )*M1_ӾdFFxG@`(JC[L1[65SN\g#w.JOFӺv֯zȧ.^A35@޺y!WyEN|bO-Ϛ7#z0}j@ڞi܇F&n[8CGd b}ᬸxo;!KR$xN#;`Ѓb !B!ě$KM~%Tl +BǏדSFPÀzڵ+Yd2)ƃpIQ+\%_ZAW|IkO |nѺ d=^DSѡ'/JbfRqRB!B!Lx(drH=+Gͅ4bV!oqdsĠ<ݜ7%/`3 EQS18: 3;f(z뜺i?? f=\bn[6 :]̹{hhhrB!B!; @aK g4n!T̤X Tl3hۼ : f]v&a_&ο.ޡLGd|Z4:S'C2`yAP/r.֯Cu=W7Hαm{M߃(B!B I+RZbzɷA O.ٶ!vC8$6$}t8o>?ΛO>}ȕ+7aa6m՞u%!kk~W?z-;~ &8f7g򯡚^ŚkQzuTN^kޝavôl=:.[t׊J.uk('6$d_ {[Q.Z^{o2s靈KrBŻm ZиcG\K"_c5E|"{cp܎!$:YgzUAtRreׯp FQeIBז_aNnuS/g/*~ɬ>gMU(k)$ 8g]ڎ,cwءrG xyۜ .FpO_koL@MׯoβT!cdW8e} a-g69?)k⏭fBdD25!%dbdїK9rWBSٳ( :vS\^|Hƍ'V{ћQ@Rn7ש.+d@!L{@}l3\%NcϘ \'Gu^morЄʭ_ga;};@TB) kO^xw`ULjہYg㉻ʶ}hC]:[ùh{>oO؃o<8n=L9f%_F :?2csS,.̓~1qGw$/g{ U}ƻMQ'&yzu!jdS4wBg%&_ֲ70 1LZ8 Fmw=5b35ë'U= [nьǘ԰gL[*Vc ԫYW%gGpvh֥Z Oj7$W}>&woWTjN'Isw&ϛkj8CLWѦdvBjk8*w,`PzԨYMahwY|%{{5|3W]i բr5_Z _͉#2ժR3~<!ӳ܉kH(qu&!kKݛWغ˻v_7 2(%fwRm8>hj e>M_:\߮AsXi axV^Rf0߅1%lVN"RM>Y_0}=HwxU&^!(H 5wB54)D@)R("((-{IB e&$ (ϳO2L{̙;wdȾ3QNWf, c%ȱswX;RveUg =M%| e?p!PvCE͆UG(XY̜Y4%y.o_ͼQ|oƬ'kEl193Vs|}*{((27cli ]1q ?D ټs9?y%Y})nwĞ];n~vfF.Hُ(muV~陉 M۬_a9v.GpE}r$:tvfφ6[؝5͍ͻ!NϏhZvz7j!ڍ=̗׳BQʃctV4e߾E>6ڍl1ZilܿKY_T%,=y.}>kyp(Bi])TO_ϖuSiЉ~(]YϷYލlrYjLYŞ=X3g3 !^ 4mo:%,Ń5o:m=U`FkB\1`w`+ڔbӘ,`z`sz 3W`+JأLQhnEjp-ԺT0Rm#֑pk݊B*[Z9ojqV޷< \ xx>jI܏9 ZKB\PUW 4C y]COm N4>5(7'G a1T 1}Z܌mrgsJ^W漗)}?jF .DfG )ϯnnNTsH̶UڈOA1!=B|}K58_S<*3MG'}ݭe ʾSwi!{WR)^z6kX_g m48EF%غߓz SE>Ejqܤ}-I8*`-GV9bCSE:In/'lTw]8q"1;f"o;[V/W=䰱,5kC v(+y*\5dQb7r`º\ GՌٿv^+*vd,!mGz8׌.y%?<̗7LAZv(M&;R`ۦc<\)m%hQ>97r#ͫܲNh !^kڷc5]:7uJ!x(IIp>lM2ws'BPVd+$vVəΪY=oVCUyĭ TuТ"ϓY=#jxQ1T]I\j |ˇW4yLNT N^8 7pΏl=xEA' ˥N&$b{QgM>h)Y)@'l9ZbUY;L L{нY Tw}KQQZSYw3X>oCLF+]?*&aA0Yz8$͂`$Rk[~I#2"gвwtLPt\BO*xO[kNEE#owRa`[9豜^1+pA 3l68[Y=uϝ ns{"I ͥ^k 'IALdx|&;܀{8߉ R?q7*Z%sׯ!ciխ'bЮnqLOFB=x똒*S>(uwؽ^z,QQ&|}$dDG݁LYSf[D<ϘdhqhȻfO[?j2z[*UN1 t{t !^`Р 6**B\JQiީ9Too{"oEY,3s]2xc|VT@qA%LMJdtnW Ǚ<P_qCh=h, ϓ:|: ̛ļn0Nہlnh޸K{ܐ]2zhtJZHB". oQ'#- r:7o86cZL}f[ y7ίŧ݇qLBRi>zj/붑Nw+2vNW!e\@Uɐ͛wmU=dOT2Z*hㆴc1 !X;u{Чo_x9p9͛7ѣ{EdBρʨ;Uגpd7,sI Bj|iNS2[.%ܽ犊sg۾UغW?AĒ|y+HZ.M$\(+O{݋y,swSe>t}Eֆz~>]w"^OFh.LY1zE[ j{o9kQ1|WAVo>a?-ϙFq79i&>9۟кOƩ7yd37/Fs|-4O] ^o ?%RL ;O<ԓ=}j2xp3|ȯ\Ih1w6P1w ;艧uΞIl櫬YqI]aޭ/V: 1r\Ri~Y[ŞbM(PĨR}]_ʬWxf.8AzK }bDi\dT18b5Rz%ιT=m㫹QCB)Hph VfH cuZIu.ז[F2:dBJ%"1JPQ5BsBe(rH&ŜILh•frR NƳKF`pp%_AÂ&bqdڇ4GԪV-KмC!kLq0k:-}YLт ܑpKeٻ?sM)#ǰmv2yRd:qR=ޞT):N.m\ы|5314nnX¡ K9e56wQd ]fWd ׵ G|@%8nHM6iB7+5GG2߄,J:NT?z̫a=8WhO!kw7'|ߣnݖׇ ƒT>#ߥw8+J6/%;MgȬqnV?kn?ɹ38*:X;rkτ^0((j3bZ cƶ{h9j2IcH{?վv;,+1*" 8M 8u:$s4H-_dVɌQ}yIt*u?5{cMfĤvTtx8aYߦqďB}-M%#. X֟:sf V"5???֮]c] ˗_v ~~~)uԏl͗^YRySN[?y%ľIv)*+&MY)OvFO޻cǬ_۷g|H*>| ZҼjҊq2>r%ۼ%t4v^5tM|UWPT5t͌FeQk f*%+ku%ն?f}8.CtJbwy-6tKTC}HCY̗Xm]R@R}Hj < 빎u s'BQTTK}#qr[M~&>V|JAS+(6Rtf֯kZrT@y{L6f[T$Z2-͓吴3Ke? VU=k0Gi]Iqu==,;l#\Svg} 'm{53bx)1ڨ!JuE%ClݺrY'۹s]:wʕ+֡Tr3(Wgr;vPr%t΁(Vu?1nւu$Xf j:Iq-Ŵ2))uKF"tIRN[ǒmKV3܆XJ#}W)Y1ud99Eϯ bRq:K-HTӊVls^ƺn`)jcȜ9uXxUT!x(3Yf:F9v:Ggp'[!Hw}۷_XR _|E6)̟?޽{?xBחGr"B!EQpwG=+` gH$ D?n]e˖}/_&~Rk߾})x"44w֭[lB!)H"]~\rOϝ ڵk3f`ƌ)-s,Y`z͛lٲTn'B!Btw)Դi5YV!B!A_1`5C|4hsB!Br:pssc͛:|xblF!B!^wy{ңGdbNg}Ʈ](P~!B!RkE͍q1n8B!Bט$ B4MDFDoB!8dHM$!sQhQFuX!xL;;;GMg!)-!oȈHrBaa4ړ; 7!!oBƊh.B!hFQnM/܂!h"1Ld'O:wLƌܹs3fpt]ɇ~H%W3B!%$ 9r$#Gl6[P+Wk.RL&5kѣϜ|u~l޼%KJB!B!^2r G̘1t]ˇi8q;vI2ܹǏiZ4Ǐ3o޼4I. !BjGܻwϺt]_~I,HJ(]ϲ'ϯB!.I@Lr嬋(W .~&mV !B!KHƀ/Thh(|4WFcdׯgkʠ4B!Bߓxa.\HƍQRK0dȐgN>@⺒BYtb|9)~vN0Io^A& =2 gG1X$ffjai* ?·Y!'``0$?|iY3#Y,4A.τ);.kI3J<7{5ﲲ[%>\tGeBztZxO͏:NhW>|z Ԡɬ3)ltH>5n/+fA\:7>!\ߍUR<(/7$Mvy'n'=ȁ3d.U;(JeQ/sztmֵW}ۅfMqxPn:č6{o/ι.vN6</NW␃ #!x⬋xy_]/ ~;99- =Q?L z u:TR>bܦWirgTbjl)_|cίE!T\*u[3xȹiZUBhi "6ζ3^YWZuRNm*pƩīᦫOLUT=#VpN̪nmK 7w2T(Cp4|z|jU*Q>XklޕիPz(mGu;-dŘ ^rfDLW|JH y^ w0"Y Z~iIթ<] oWg0u.b4UUCpNz IDATd[wPP$~r^R~lOn8xܙ%sac8m_>l.5kTjLv :vYU]}(^X=OޫMjթښދQ֨M.tŔf,3ؾK:5L39pcR/4QJYJ81g]yVulH1(H+ i_/'OkT@*uh1y͂>uBRNk/IUgm{hia=9VH}.'Bg?q:ɓt3IB$ -5g)Jfgw%ZN(FFP\Z>.g ,l̺?r<^#GٶeK&vvgح̜x~aM~WÈ=S>++a2Ò(0__΄Z\օQXG_aY>>장hn 85N2pBȭY}4_X{ [2clϘ8hپ[i jŲ`b$f88=cNbl]5קo1:ٓ?–%ɹw7Ǡ Io WU5LWiWX:x[2w5 9LyIB'N} 6cWMaִKP2iOlv%[ʄ˙6{R6X(}^ kʉ?r"gt[ƍa8 58nc ?-mv z~Iq:ء۬v}%*?m%@~yV`/曉MES \'Q =aIt`>ݖ+7ev` ~[vhYIU(pZDaCnJ߈|3Q:8;>81f:LT 8)J"eiJ}H ~dw5kr徂{NlNtp&xgd_7͂aנJz6ǣst$w]|uP]rz2mCյmj.xY^NZAAӴdNb?涽ϔs>60GN!&7tz|Z# 3ÓAAtugP@;c8LC?Ci׉?ttmGlDF={fMz =0d#g6tl̸SϤ6{'=CBٕ4\+m]_2jxf.yaUՉmFsm(^ޅ2e ݺu`ҤIC_' Rٷo&t]'66*~!ʹhnae}ehϨg-*f~/CT`z./6ĺG5Ǐe a]Ю ;f7r}oOGr:JL ƈg~u|2x흉aЧ}SH'*VKw.OInm( SΙOlxv3W|\ g<]*TIW 47:}37'KΫ :^kn#=y|F W-b㦜й{X2/2xPo*ffILzY$sDf-fu!!>L8}4!#|O0Ap,=Mx2ɯww1yAN] R .m: 1W9}!*Չ_ُpnn覻\gcW5\mBG'!msw7 ƅtVcv`칧U[GX0w'ig9Vx[qs,%JKn~eqݽ.)3ދ#o{@tv.ZlHj^fϜyfs xpx_5e=i\&&UI/V/ImTp^?Ҷ'*e?pmP՞lC6B@4h Pa!B#&O{C6uܙ"EPP!:w̴iӞ s.\8BfT L  SV"=Świd.NjP^P9`tħ ]!6O/pRv}𶪠df̸M@ =Iqu7@@(E'$Ʒ }3`0cryZbv7~*"Vw#W|1|i9P 7mBrߌ[NJSo#-{?5kUW#Z SyCh>b(Sf݁܍WqZƟ&hUR7_^G= )bA{6Jgops`he*xAs⎎#>ҿcy(ns|=Rݙ3C[͇hC5.&IgŽSi.Lڀq3>p 7mkq=%[bRJGQ_7q:kJ@a\8\68Px̛Ķr_=%Z x6+oEQ(R[x[+K*OiGR/ `HWM1mb:),'~ݱuQ-Y_7[Gi޼9˖-CӞ\KjР?ܸq}*f- "E`0XZ4cǎqyIZ>oذ!/NX}t:|R%۶lJ孋B7ގ;\u+Eu*1OG!B!A !B!⅓B!B!^8C!Rə3'׮_#B!eHB<ϧvڌ;'O2`Jݻz!EQpwG{EۄBI5pss:$M♼{4j( JAa(xxxaB!0I@g( Xa̺*!B!z.(B!B$ B!BIB!B!/$ B!BIB!B!/ B7Ç{):$BQx{zdNC4~?wȈH_稽=}2'wnTU$!CbbhoB!8&18wڜB!#/_Vڔ(YEy=k7A1czr\$!xm+sݒXc9W\/dCB!^:3f݇mia[~X]hР J.WBL?Cwu@'vNmNcOT≭$9Q"87=zӺaUDz1n t &waHU*VF&i?cCk+ZBLٲ刌}PU 4~Hⵧ95?^g0mOf:xzE<35g)Jfgw%ZN(FFP\Z>.g ,l̺?r<^#GٶeK&vvgح̜x~aM~WÈ=S>++a2Ò(0__΄Z\օQXG_aY>>장hn 85N2pBȭY}ԇ ,=-1ggL@l߭_ߴYbY0~1g3ׇ1' 1pL7tߏoa˒;cQ=؞#N(n)% !%öYƚ5aouX ī˾'3i :AߢTϤbܗO~~xj?aؿ;OSZqSPCzijj9iH 5!jH@9c1p A)C9l K-[wx|X"tC.GTLognN j{:q)DٓY;ƷEBP:u@l1DD>Nj!qjV>ˆ_vA 5u~]N `""*CBko/!ͩr`HlU.x{9=6ءZm m06jWFS`PдI&y'o/иs- m{%Ct|x:B!|FaoI@FՀјtH5~--aw1gl,Ru^͉e)堢Ee),9xcV[ዖx&Y:BN]6ʷqSU6U\yr{}^<.V'C*( 'zI~=o]K6+G\s|emIƏY..D.}F e?_YG#$KdMwKmwOw~2Ň/_e>ޟ>Y_䰓DKȹhnae}ehϨg-*f~/CT`z./6-ϫ[: }!ߛ^sX֭v :Џocfop#׷t$WC4ʹUbP'f4oK!&7ޙxw/)tD'&ŔǃD}+:d$w/ &p"^/ItS4O_K(ѷ'Sv5+DZ.Mh$\4'ކ*Q%aq:./E<)vMW6[&ttbpBm%Q)A%e,1p.`K֕bEy*twqrUwfwIM#$X$ $$4iJI&ML( M@I~E@~  "i$THsg?{ݙq;3wwfGR)Ng︈5QT0m5ahw O<4 ]Sjv?TݶZNMެvY_JpkߤC__WIՅ֩uow>S\;\"EOO~#uǫ1{ME7{o/R%__$I=SN{ZW>XѨ/ԏ iyt3ku>jy`Òy?h@ U{PO];ES?ceK$)x[OẁH}]WO` ⿾c(3q$I) >L1JU2R}3=5=nԩAZi:,C֑;ujzV-5|Xz-i)(wG>zV7zR|6OkFLh -6z^j[?Mgyگh_":Ex~lnÒ}9slBh^ Y/|Ui?֞لT}OU|IgK-^$}[S]~ T=^=쵒TiCҞ?= !u jIWΓv6;ryV5І'd'7a/ : 7ިiSwwaS-oa@4 zfWū%e Y\IjP ι2?~R:ԤHCӡߟm$HRHhЀϴ`Q⸲'Ο/ 1{-I'l>qT7ܼF}rz- ^#=rO46m7C{|IQʬ|FKkӛ쫃Ǽ_3FJ՟z O*+A7ݮ+JPo8^^o.H K_ ^xA·zkβϓj=v -Zܨo}J{]k[]KEJӪȹǞрAꞚ n-F[l,-l[Q:s4nKG]6oΨ[|Nwv?Q_S=A]Evm7Z ]q̗4~.p ،RzsZӷ^skWM.|EPT =wq:vڶzjާ׷ldo\<)?o#vzQ:_a}U[-v=BLuI1n #Iiom)I޼"cTqe]tF@>Z4T-~e J)[0"ݓce2KDjxb}gi۪/hd2^!RJT({ަ)ӘR3enEӱ#+9#c(%Ņ;VccqFqqFL,}dg2MAQT$er(]e/k0f6`}Wc?ƵT O>&MdeOkDq_ooSoϘ)!5J7soޘ7Hy71Iu;6ǟۜShRimЉRJMxMmT;ReoyJ3}EJgk8M E$J~.N68,kCc2> ^'O.9_xetm4]U~>o @kM7H ^ƝzfYT]]l ^k͚:USiítGUY9k %z!jtrTPUe@WEM͇˖kРnz̙1c6UUUuuu;w^o%K?S]}DԠA5׷lF`|n.uѠA56nWۯF(\uu6TS]Ɔ.tEjB7CP(TSS$)eF Pv4 @рeGЫ-]TP+W)z(Կ?5J ՚LFo.Xz.J [w6tSR ;赖.]O,m4+$)o9sfm钩;s苛mfFh@z_܌Ywm@,\Po*mYJcF/L@rJ (裉eo>8UUUe: Pv4 @рeG Pv4 %vnjc9tܮ?NλiNSE[tͷhڴ$I#GO_9= =WTw7^;I;MWSN_XRݟ5ca\6n:suͽojYNѼNиvv޶tRi()W<6S}>]]w쩺un.2}]pi睕JJJI~3fЄ%*lz mcG)Ct祚quP:묭RjX|.S?D7f۴U}_^}fE)"cu؁ZO7 aÆJ~q&#y7+h:3l= DQݯnһgjkF4j_Qt:~tzvΧZ:;]^xkٽWQg<[G i>SsU5;ӼT= }3RL/Ǻg+Uo3t^)O]sՊg/Uj: uAJEҚUݨGY>#הc6ӫ7-)+̂t/}>VuTg~x~;rt?? 4#Txtu[hX2˛8q.ZlkMr.FďY򮞹u^Mn%ro;zL }N\{OzbEqGg?Vkw[zoiu/kY?J'}@W$)wB}:Э,YD^p.-YĦ Ѐ5.L^MΖ:DيFk+Vm?w컯w_:w~C4`S꟒R5iV}S׀RcXRݴֱgAsbsM9zW T5JﶩV͟>n6RHUx.T >*?h8Rk&hbe}J*oc~AGuߛ[vH#WwP}K4h#ujҠԸ?e$6]Z?N:=zuI'4z>VgVA"-Xikqn/IT9_FK^K7^hR)i<բ5/G~Yf5V4hPJ2/K %I?L h!֊K Tj2t/es~˃j'ӓ3EQ F_w?P J+36{ޚcT`Uk$U62+WhUGdA2Zt^*> 9 ~EAxglr}5/}nQFK|u61Rf^)uGzݵLjuǯe)ߺgֳ,{C /QRF+?zCoRkH?u'O>Ϸiwkn.-JPmN{꘽j׮!5l gM ~)_B6G=~x=U-'=w@PNZש/j=vȷڥ)?JM\Oև?v-ԟ߂jkkC*n㦟Xkc=jkks/кcn7T`IJ{7nKc7n+$Uu;*СO Fot^Mw^~Y;4ކ]kPv4 @рeG Pv4 @рeG Pv4 @рeG Pv4 @р!JWA Pv4 @рeG Pv4 @рeG Pv4 @Dl6:BG{j3{ lcמ؀oWqm tS=Ctu{csoiЯ2-8BTg2͙;G-V}}MTVVj!3zRy޳1nwm@[TtXh߭7TZbtzO[kt sQ}]vaUUU4:H]]yGsfnf֭kiהP@Oϵ֣}*qz}6E馛|dUU3f,^8ݩQ $+[Uߨ>iFTTѕzUUU0:AUUU{?SʺT)ޢ,"\GjTW;|eU(ՅoW+eZ\Wm@G1uW5h1umѕ_:ʡкuI{|IuD[zA ]@G(N-t]mPJj|Tؚ$m=d:`c.'ۊXwϞޣsJF)O!S( )PFjҤU:_{(\3W@7P_ : .i4{t '?ΚO8IJLSP_4">|y(\͗]n9vE)_`ҹlܽyIqP}]5\UTV /Qee]B:y:hM4x@?>t['՟.P/nE}=u 'jw%_矯^|Ś wѺ4 V酻UqjC4%"IЊWnҷ6E:"U|ko'8EQfty~S}MӌW?H8l6iճu{M(Jk _=@{⦅=zclc-)wu׾_makixMqw󥽴M/--WCsլ!I(D1/,t\(nR8W맳f^t:~eW}P 4dKz{Wb7|/?Oלs{$͝3Wcn!I?n.R_ll;vs{6 On2VCOo5x 2ٿz?Bֹ'k?7ۯyT#ݤV=nzb{2w|W?r5Ʊ>U:kcO>]}ٰW?{fA]~ Y.>~pKuߧ :'cگݘ}zl,TJq)w.ґ Bzr<.^Xݚ5b97ZߜqRt|XF/SfT iJW&d4e+KnQ8nnM_xam<>ld;j T5JOT+>eq%OߧF@UQZCv:T{YO2[ViTHQm.4lEG|.umŽ+v7&i?s]. IDATaswN6՚ktCt/ I)V%ZQf-ѲZr$Ҁu1+t۷֍7CjUucF7nMZsM͘K.XǍӿ6I_ǙyW IRU5M%)A5$UC4d2-YmDrSFC־>5/#벱~2~ -ZҨuw.:MMSR&L҅T:_g*ۀHС}ϛJ+i,WhQ;l>+WÕ^lψ+]d_csJӺi:+uϯajy|hgfŷj-ag%f\f 5puw /y_︮euk Jy_9~8]z%~K˛)Sl@^=j<[5f>W=z|^:ds-^Z* 5pEFd;^;E^zP 꿻Nb}$ҠA)-tbk"_NACjo5 :KmZhα%ŭB׵Y!tb^h +~gO>ASہ;tKfyKW;,lfMbSڲ) k$%sυbIo..jLQjmD;\D5rݵk߭'J@Ǿq~~Ͷ54Tt(tE?Ԍԩt1GkE)ƛ7im0GA'ocv^FؽY:s[cR8V6݀Ǿxb oztb@GCƅm̱N! tqI;U"% U#FLp+atzUTVp!\c6YXRa(3\#37楦71RS%eU:~~ڼ3/qAR_<hmӚ^~ov>hA/[Mk_4w\=FUUm*~Quuu;woS7V[z7iyj"Vrrk]!.p+ʑ5eZX@'鐍*tz 7kb X'Mk*lQ6GW^;wBt* (z47'7{'֎ EG5 rn9_6?v\E"鈍:B L*j@h(փVD1 jjFQi@sgJ0` xl-jNhesvo%;L[ !]oqs_zz Ф5HpNoyRm P/xmC ,c^FI(\,]QeV^]ػ"9y4vݻb|ղ vs?:Ύ l2 5q\*0{?QRrnBq`C<_ڸԲxwu {~cy}RήsB8鸲+g"VN;hn$?~0p]&s^jR:HMDžmn;>I{Pj~=Rh>7?ƶGk'5!\_ccn߬P̗O[9p/<<_c tw.Hk>1ݥMjn>Dun.5?wmJ}(fP2[sY~WcsWfֹ6!;c<6qۘϓ!Pj|؟:_ȇA`%.7j[]kJ;򏱒%Q 'VaE]_Xc3jnRZ~#8n7"ʎe34v\HRbد|K'Ť榀m$1.ngX\ۼu% $vEEt{w{d.ٜu sɨ wt'y \nb61tg~}[ڜ_?wkm8c?օ~km>ǹ.ocrsSڀ=rZ+/ۻ7rrpC^o4(;|E^oJ{yc:D~

rr/y[c]fqYo &Aw;1}&ղ!ۦFBrcԦsڀ=-hx]L^ܲ\XRjzc d6eS lHsq7B2q۸buIk@7]F?vM?.jHcdb 6 9]JՀ(X eb]^4e.ؿ!1פp7w.q&al nKq;1V(]A ~؟XY4noIkm\;.o6gb3bwQ/篵ϻ75;>ͻpu!oP3c;O;t~M<;s7|C(o\P6ֻ7ع6gv杢/k/+]<9~n}|Ji?1qQ66q7sŌ;5_cWPwsWͻυ64B:R1܎5In[#oo6B$-I+wAln.=ֿhc/7 m3~\2JI.k$)ΖT'O;Ƅ5\hrmέ|(UQ'9CkllnG#cǓ6c1vs>s+_:K Pqnv+\q̈́PSnZccvo!Ŭͫw@'Tjy£@Ljz@ q#5{k&o?oxZ[ٹ9{7Bb]XgnsR1'Wр(Frhl;E,ָBBlb9sscs͹ZO1k#j$v]o.ʅ*عZ7P݀j]\Fjn &[1&3]CP.I(@Wfk:)y7P, m,WϻyXxX():8!._4X_{#57boÿ­qsyo.fsZ;vxH1klKZ?Z&56bIPHS!)7c<{l+Ut*ޱ=rm,{?:J@OT4 PnE}RZ۱$; rTPsc? ?WHL&ۘcI$@guUlvкP̿܏ٜc9]Fg7 b,m+.:sy?~6@>|9=&IUZ([kKZgع?v:XR C8u|PÔw\/}6 xǟ۱+$k݇b\9N۸:kIߐ4۱۽'\9)>ξBjzv/(~^˻yh\ [Bލs1;Œ@w˕Z8Z9wc?/ޱ|)u|rRr*O:؜ͻqXR۽;6on@W`|suQۘ˅ShΏyn CrsRB5rPaٹ6Zc\CrvSz誊-~PnH-sIlΞ9yvZcׇZ+WRWl=i6+os6n6۱/Ŝ\$m9ڣ-mcBPL vx썓6Zv/\8vn7_R5=}(ycǏ|BмJu(R<ݎ[۽{1wc?ޖsPs5R8oJ7FJKsR"W=KK9M(ϓݻBn!_-k -:wx{;vv=@WО"k۽K&z~jMQrBHׅ vFj m>&%}bM:G{q8{'61;w1;{_(gyB`(@ =g[ׅyFʽήo\B84/D[-E=&E]oc)d')-܅ZK*:){_sPLJKs*rx(& Pgٽ/ Ŝ:;͓5E+g[ۺ.з\ 1z!Z=I!q[$v·b\BZ;͓z]QYzBI׶Lʇb;Iq@ah7wB P̗бI\ ][躢- KjJkƾ5I㐤|Rɗϥ=@9wlR>)$Ic_Қ/iMh}(R:E)wQZY+^knsuIc;ϧRێ-pΝfAʵ.^16fR8f5v.cRrJ}>.J]0'/1; 1;±|=mPl\z)PX{q7WʇrXHh]1)9K]:-q]$WL<Kkmu -s˕BkC1x>Wv; m9I:T\r })Y$Sx!rl[il@Hm+r/I;<.s/)r іrLIt⹭ϡr#WNj5+ۓϕ+T[Jy9֗tOT)T깖<$]8/s*yʪz:/R:ouɏIDATϻln % z 88eӊz=Yg=n¹+7~W|N z][l6Ps 4B( ѫ P\z @ܱеTsZIENDB`kraft-1.2.2/manual/images/de/followup_1.png000066400000000000000000005226431467704360200205570ustar00rootroot00000000000000PNG  IHDRU(  pHYs+ IDATx^wxwvCHE*" ]"FW 4+ 5($Bqriy!2;{ay(wQ).;ZƠLDDDDDDA2ϛ~Q%~*g℄Ӊ7(Mh%T7N'"""""k[TT=/F NHHˉ<[N KJIUzoHvl111"""""""|%$$,w8veؗK4(Nju)3㌌ LDDDDDDTW@wpv֭[%9RWOutQV-.VUfHӉꖒ7L& f٫b`yA"}2p RWO+$'''+VUl6~]n_v`4%p!0Ȑ=**J',yPۓ*!!!fv]8"pxK4Ӊꦪ`k0 LOOiAAAzzz'%%~2pbi=&I=jX!4M}͏b)LXWp Ъʬ,4 2;;[X,jծzzDz]wR?fj*fYlb Mӄl6 ]׋ݢGDDDDDDWEQ`EVU*"UUli2tժf #07ؓlٌ 999hTb2^wf &""""""Bv+"E6M*" zK<('A4(ib4i`RJw8vh46k>""""""2 !VB_EQB:)骪Ca4m(ZX<ԓlM5M3L&n7(NiR²UU DDDDDDte/(k530{dMtI)5]׭YnSaX=BUUYUU(P5MSEQt]WTURJ @ ;]|wu]wFJ]WUURjBMӲsaAX=ɪ>]gSMpyHﶉMP4kpM IlG@YVEUUUa4p8gϝÏ?LDDDDDDBJ \*Y4 jZl%$$DINNV$$$xWq\D1118~ ,@l()?7Bsh DDDDDDTtMǦM롪IUU8fg^խV]aаۣt!l6pͦNYJi<{.!Ĺ4(j4ͦ8aۅf"^eܣ-Edd̄i"00PXVEJH)UUUB5;z` P$t֔YU`.FDDDDDDBp++Edee ]Edd+$V=>SoorEVVPUUV(ծBY!{ϋݖGItQlgCx-a5uqiG3 Er2)bB8TUf)5M5jԐp8Dݱn:U(du~BBBD``4M.B4EQ|`G{`Լ{-DxtMNDDDDDDW&-G l p8!Yua0F4MC6Nj X*g >}Nm{@~tC1:ĉZ"S5Ms[KXV SkP 9w"(He Nm<9H/|$P #KNn( ,Yʛ]EQ")(ggg aZ/e6ENN]<蚆 ա$# |]m%䝳6+vBFxS=uƣݻAQ!0 DDTTCE 0x>""kNZ5a2{^"@`۱!"B]E@@u*RP.*afFXL52vp~w4-AW U1Z(fdg V2*ԲC8 r3@Oz=@1 ͷ@ם_f &π$\=z1oh0 $$7ԫ6oPf<ԹAAA8q>+DDDM ;v)8&{oMgnj/zMOn2;T:?Pv] Uʡ"Pd i >Tt OBO"0ڋ Dx]B#Н] !e""(|ވ Ôg_THU࿽i:r65͛;[BCX0 lƫoLģcKC`4qczhN %8ujD|'Ѡ~=ԩUwr6W11U6-(Sȗ{3a F4oO}?f_<*tgT5ʾnZ$'',)Effb0!PBFfc`H kqUGlV` "!*뀐>AV mW"(0-8u=OH_/^""6PQxqS0 ,BH>'NbHg޵359V|ibn n}fc=Fѡ]Tm;v)"< =uv?;v!=#.q*1=ꂟϣuxWwH]x#"J\W!1)ٷWv˃aHNI-.2WL/+CHJ>Y): _w};|gϗ-+m"MUURRjtAAA AAAPu]WUUUF]MRJ)0+(AQ>TREB pzΗ~ hAĩ@zscZ 4> a!!hsG'twyfMf7:r vMy hܨ!֭m͚˅K0s8p0BC|mw$("<wEm.s{>Ϲc6@ eƖm;-h< B9v@"+ܙgqQ {a N.\϶p:1^Ĥd<|#_VǶ "m9RJp8t!Eb t W"?uު<Io{`xoH;l |y$NNŒw^=P):*20v$nO0Xr ޚ:CRJlݾ:_{TT w=-ʵmCw`;S1bb_- u)c&tؠ5l1 %դCPn⻶ma/ Ĥ);ziv ؒSRw&{wph^ř3)1flv;: w5ǓopWV2ΤBuDGUDWw/Q^<gSS|;ËDDD 4y&b]nǸI 7i2l'M3L+k%F#d>wߜxM6 P$.mDD7DuPExypL"'OGߧG#!.J4Lzo:ƍ=cϾptk_[`a6qg\ i 4iB+`YN+U7U*_7^E, ;xk =~gMDDtپ3^R4_o vC]d3KJ!y+lyݲ ,&ؓp#9P 3S@|]x^m,^4}uCfSZLمył}Y41t1S4hcΫO{;cק1fNbe׸nMӄbp0Tm"kfs{^Xُf"tyy %«mB?aҫu}K[ODc2 \a$az_Uc΋uW1@#S0 o&k_bgQl%jjcbh,;MJdV˿k7[`Ҷ_/ƒao?uhۿznc}?Bl>z5V~U7MƬ_CNc{aUXpUn- Čzt"3]ھЫ]؊r|~^ӜuNo$NYU`TX43g9x`pKaeX|1Ļ kپwgAqcP@ 'g7+Kbs( """"*bM"(VP.+0ge SPPQsPj5%@QPUH] +އ'VGф@ [떌Ѕ}–~й^LFX1!x]xcLW Tt\8jk<غ* FT%1hֹ#ja7G!i8d6Mo]~p}g!GVBܕ DVQ E/롼o.Y-zCED*(kaW/}1K7 -x蹁xyty>%܅=>QDY*z7HDU,#@Db}ͶjT]BI1>E 7^V|3>ʝ[hלDDDDDޤE[,T u :776[q#/,Ja06zs&wAzBι/Sd ƙ FILp] v$%"<2HNx[x?V./jiHMYL9lٝ!,P)䩺0x,#Bڦ\r E`!/Ͼse%yyF}翃>z˜z  C9_K""LŹsp7d&2\./gYw)DFG{tqAY 2>8zߌ!ql* UNTd⿵qH]H# lk!Dx婗u&?\qQQjEZ0ﳍ8eTU]DDDDD(61 IDATwL0 ,nj3G!sl<1GAh\ ף~kƄQd#vquPQ>6o=? Ggl0Eo♘|0{ ݉㧠Gu0xL{Q|JM⎊rab}>?3'<٧3#P峈ݗXxo9ÞhwszT0k&a\ QM1^/tRONy=reQb]Qi 4Z#y{mLSD(oz?b8|#,ExT+&y},Ɛno զ rt:+]MV#"""L侼Nj,EZDrrb2LEuc``n($ RF,[2Kмs ]ϽpCjL[^;MztIn$kzM\/aE'@Jy]kEP'CPSYm>K].=3µ>gkqa(w]!(ΕY9/a~(Pޗ<vlsXV^ Q񎏟QO!xc뾯νP\\~WY>yv}KCXy}@BsBt]3F[VV]Q{PPnٴ(2$$DFEEɘ6.sP湓/EɳR8VE(ߊ[ҊOp㷊sgBQހwY?,kwYBڿדWY}./ݜϾ;-vqm(ꨧŎ3W7 DA/R\nD~cF3wS D-V)8|6]b}yq$a`*QaP&*Gj0jV{y'""""ǠLTԀTy<QyLDDDDDDA2e""""""" DDDDDDD<0(y`P&""""""LDDDDDDAe [m2DDDDDDDe ʞ!ʓ+e""""""" DDDDDDD<0(y0N8>|ݷΝC1 -j#\k k:Qyp_Cbbb &o*V[R"v;o[T шƍa2|.ZyhO_}5#@VVo &w -$999HHH@NNoQODDDDt"rjj*}iXV}w{ WfÏ?)%~,%z-`Z8,^&ٷC{xڹs'"""*U;(#短xiP4jXKe<ԓ8yoQT:̙3zkx"""""2\Ayܹs?`F'={7Paaaؾ};*p}6oS.ZޢXjㆍ߱Yb-OyhO֭nǘ1cp~%Kп?] 5jw4 #=a(ޗv/ƎJǟWdP*j`*W>ߗx8̱Z!q㭷S1/rVߢRSvv[!8bdeeAJwڼo$&&BQԫ_?Fw64MφfCbb"/~{\ԋ,WdP.:>|:v@jհ}vlUVY̹7lĨQ#6uh&%!44sc՘9}Ԯ]gNo!iFwgDDDDDT\A9,, ?Ι? N>/ ׵b7F\\֯_={-.-Z@I,RbҥuVH)`~ɓu˗/DZcvҵ%õVZ!#3'ZFv4 g & 3#4mА]@}"""""*ʠ ozt `|ԩ[DhEm֋u&M`6ݕK=&LS@4￱g>ORJݳ{ ;62 'øq0fhXӦMGz\E޸a&_?ygmDDDDDtȑ#:&Nƍ&!J$Y澓$QZ{cQ&>pf *bOJJFŊp843OC;kFݍ^mڴƨQ&MBfFz+Nn:]7p`„~OA>L:V` Cvt~<RaaaۥVoM+'p~zhҤv'&7ԯ{c%Λzիe˖gc3z4{X"@DDDDDW%rNJg"%%Au %%%O@-)ÈÑMܯ#G ++:^WEQܽԛ6mD6U8CmiU!L&돵k!..qqqXvTj&""""+Uѣ<71}4 n0h`3s]Ǽ~BTTVg \wpKӦhԨo%;z(z>V+jծ  *!w^;j֬Yaջe]۔RɓR CAerUƱh֬9t]CJMo4.(׳=%Çqi4P4lwruAXr C~͚HOO#P// իW_eK.!~9b <7O? jԨ;]#|pn>4Me4WAV-v]fҥxУ#2uj&W5`-`s&@xxDA<<<_!b6o9ի ^ӧAQFzo'""""kå%r³TU{Xf3 #GV:44kVVPF |<`IСׯ/RbtoP޽;e˰|rg@9F şn‡~|ըQ#Ҵ)V\DH)ѳWO|<{6N}9s.Mu%SAJY.z0`dE qa-Z܎c޼/`|4{+Î;p7ˈqEeKfwo ﵮy]^*1ܽ}pY>ѣG(KAu)= ++ C*wΝ;/) !ШQ#4lB(ظqlv[*kww; B ܹ35j?X,bΡժUG?Fb)gSHMME/ːx"""""*Ƞ[s0 bi:~W㖦M}/Jlhٲ%~w{x'Mx}NfAT9ȷbҚ'bXpج64n&ɷ.fǁqԭS׷芒v<Μ=u 88ط'DWzz9 e6('%AT"c` uqx6,bcl6E2M]6mY[C]N%&~: -"fػ@2:{Y 뀔E=D%l6r"*dff^=D#88e#4(5ߕHDDDDDDZe""""""rACJؾ}vډ)+ӧ`Zx0xH.'"l.N:Y֕_֭y a0>sQYBH)p"L|k"8]!,v4Mǟ̆]ZO5]<B,n9-^M|J?aGaã9/Pl0h7R"mh!N:.C xW7 2ltys}ˈjǠ\Ca/,$Ξeea؜zxU*@8<̹-MɳR.SC9j"%Z_zwxեC\19"*qF /Ñ7$WZWBPu9ٻw2 aY><UڌkP;Wnnq]8s5FqݠuX糥:d$$?k>a0UE%K;ec]7#"XVf^2]djL,&aa0e$IaPGZZuhG?7){l)%òĹߖcu;~ȕl{QQp%=ڻ]i揍ȇoD}{b2[d= fI^Rh8F Z@?>}ډO@; `?=5?@@XtU;?K󆢱ggS7R>"hpŻ~kvBg>/[~p/DڮE:}6͆bC<8cXPLߜ|vʜjK/>} Q#b]0k,;X,Dt%ⴽzYUhUB@[_`@Cs-q#LF AF` MJfzy"~7ن*0|Xݏ:?l79 7ދAUe9xnz>i?j"0;}`4(%D]a~ ?: wݏVǓ{Գi}r:\EcXqZ/bXp;AeՎ羊v5+scբIh{jF~ 9Fm7&#aj*, E؜[:~|/]og\238So|W~0abh]Œa$L,ʰ3!LѦ5j'k!,~~} 0⭟3zp ^Ó CH ][=ƯIn|={"^!RWbY8m,X_ :G 6d Q ^ux㨯/p}tyf3f;|s.L6 < |VC;0wҗX( YKB|PKhڅ1cmxoL]/oE @á_bX3̞߹ >[tJ,9saYi~7?4jꡅ&$Ǡ̬LI0IBX 5Xq*Zn?UkBon7äٸn9ctKdYg×bhڿX}?(b#M0#_FX߰h#t{DT#c=ʣkߺxs\gVP :orP?cs?֯D4u%W)Hϔބh,k;!zJquݴ<=ƍ'`P0*@Ѿ7]nX-o?w㡛+l0oG=)JաhWۥD EPr1>5lA ˮܿ4iܸH_:5XL܇9C_t.kfX«fSҹn( @8vJtƚp[Ϟ^-g .\h!:ZAH/>wU5IDeC?U\'O <*mVaY 5acuqK(PU8~w݂W>jHg O׻^B,ݻSKM(D[\,`aw$"ź3茏rЭYp4 ʅկ |;t9/п{ 3EZg;^x! 8*2?Ϟ =+ƒgE"*XE@!Ti tHΖl~ rBxAAQd"ʇV{:&:ޜ @}w+RW "#^llą󒀢*^AY Gh~ZS=+p4H &LGY#qgEӿ~S$RӼ,wOm&$6Wj+`A*Say„ u#GdH&|80G?G5VK;tpfCryo#2" o6l!;$;K򮟈ʧ4m]"+D"~L<]o;,_ð +߃bwQ}ǿ+w)^}ԨA[(*b w(;!$rwwK{Q~!RACedYxGkW,*Z`^jJt2_ȴm79,)(oS_v\5c^=CdP}!7F 光8#AU򞲮]1㸿 )vlRs %@iwC7[zNkŧCJ9sEGo*PpKyhULˠ$'VwH.ܯ9>@Uxo8@~]{:5^qã jrv-PӶp;9mmnϛg[m#C'K;`k)=.B*VI$[z k3i^FF?}*7ӈ!I ~>kG㽶\)q >q!8P_r،|" pއCwinSK _ G"&&F/^\DFF*j\\i`4GEQ\t]wuk鲠8p b5bϜv2|ԈLow"/Sӏaܸq#4`XOO`zgQrl/vu͌.j*lEY hf47(* f۞4蚆P!Hu4] . eU蚞.-aM˒l:h۶mg]ìeeXo2==v4-Slm2bif1_)-TOZXFʺKi$NPzew|IWs[B[* u?-u/)fsma854 k:{ @$ @unA;۵m/%4-H4 FEQ...Zrr[ tooo|A25̺s6N:wl 6Xo@IyVQmZzN ds7]$s1)a@9ɒ[j[S*w\; %7@,qFd[dtc3oۼd'3ӓ$I3"y?g)P?X¶#c]'X$I(?%J"o^._axvqVt]'<";w_Oq|t\3s-^ՙ:3}7%I$I$Iz@)2p@L@H"o;Jz`NTys3HC(oJ$I$I{1>ʖ)K^qp?"o>ACiJΰ$I$I$Iz1@)BиQcF5qp|~9;$I$I$Ilz !(\0_5zӵGW$I$I}HRFBl>X@qϽV?!=>v܊@%'3lK$=wv$8118?W!e,IO (Q{{yQ/IBrr2aaa؎$Iz͛sg)V2XrXΞ;o^Q %)(P W^!$ ɶ%Iz?dQ瞇;΄aܽ'I/!..͛w77я %)@A[,fL4ꊻR$y!87%ɑ$=B<<<%I$IJǒtcR$I$I$I3@Y$I$I$IґMMәh>+Vo;8;9Ѳe+w鎪$I$I$IO [7`G)SLl, -$O^4n,K$I$I$Izdi:BѸq#w0$D~@$IE^HҽVy(G;8|T\v$I$I I\K`d%GDDRpaڶi"r;ʲ$I$I$i#/?±cLj}_\]([$I$I$I'@ʏ#k6,J$I$I$==2P~d+I$I$ILab -I$I',;GQt(lGb goigsN@ֳ'Iq*{V!I~$)hE9ImKOI/Uv\lx cLju_R:2]삉 qU@ rH("I3B0锉EUi*FcPLL ~و<|;"E0hxxx؎PX>I$I$I$ (좐Y*?)9CA`"""0kf4M{迈X?|-I$I$I$(?W^{AիiI$I$I$@XVR%ٙ$I$I$IS GQFe\mG7g'':wLw%I$I$Iٙ# tA.lG=EQd,I$I$I@B`I$I$I$9#^ߧGix˖Ơ֩ɲK#aBh"CJº|ZX6yĠَ̱tNdPnߥ\Y3O'YO9S3oiGr6~8::///ODtt 0;Jl5HĚ`BG { Pr-*Zg>A*s ?f#&]`vQ3U과3H'&t +GVwwOGfep(ӨnffS\0sƭ&:,Xfky"cۂDMZZ^xX!6mx:+ ӄFr?P5sǫ=˻@`v ;;JC?i7c iY'CVuo`/k*լx~kO.-UvPִ_8=JоY4Rvϊ-xhړG:+3=UVA;O9l*߽ܛyTOܖ͛y3=3WWeqz2LcK{>&f+F9Ȃ,щ=s1m_6ngYl? >wq*C-ց7'U !,pA9$gZ9ֱ:2uVfLGN͛Iм,5ٿOo`xPigDѠ4}Ca班5|;Fq/<~-qZ&~3Y %@>QΖUTe.]Q _!k:\… *a؋l\ԊQ6VL*PЉ=ཱNì_|@\#r+H @c!*6jB)N¥}unшrqetݮD {fw TkBҹ"~J'$h"qTj߉wɜ[7]jS vsW!qker1Fr xCvqCïukY3+Y]7SH #^>`IĮ-9{ͽ(S65@=tʭ񻵒Q@ ى<݀Kٿl =nk3GEz@u|C_ vpB,ߊTkP|\:{I̽šP%^[koƼKEյ5ŝ,e[Q 5bq)RZeHRN]]Yj8 a] 't."p_j*ub5 BIirȭZpl8I@ %UU}\R,YڵKdAPg[͊u}jٝʶ3R^wr{j,KB`׵$Lc%W~ΛH =T&fyVul§'\͜Q]Br$5 }s_"D&V5 U,E[PM9WIr,D)mo]7k9 R:m#UK{ٳ(7لꥼ,uilYuyV)4>7+DZ_F2{'[})lUڂc[AgąeM8D8 @F1·$_wL7۱#碱@5fǟbۢu\S,o+aYI/ђMgzbSPobzW~yQ8f;/kͬ׆=+ލв476OakTUVȞ<(T)5JKz]_;*2>ńegoG.Ktҝ!1pB)? %K6g>˶/`]mɄ>}6 DS M}1<ۑH~~wes:@M).qpL*@ŭg]B4q(f3SpW@MilyOt-&gҩg CtJ'@QUT;Ҧgٚx Ol@_ng&R05ҥwˮ\nsnM(h'Rd>7-m G9qEs) I %C`@7&`A> bDTՌɤ^|70k\6ġ%8LnF=(Rɓ#r@=> BYym@.)g}w$ހrO0Їi]iUOBBj6!O?NjO(P|75J_iW , iDWSKw&u\=.6&#ڴY48=I:7?;j]O 0)0 4p$ z"A,QDIe{(Q"{QW >0ֺR~84iX:AE=T.uD > 0j)ɳS/W"6slMO'~T%!M\ F?c_S95fqژtOb V;*%]EyN<mR{3\8n#4=vwBkA’C}>Kѧy>bMf{ib+PiQoa( jưg*JK{">k' z~0g(qq*N9kz"a~]SƳ/(Kѧ7Nd&} v͛6}!ÿkљvޕոOV2o͟2~dEcuУ5ղ)^\0nj Q| .[p];/ZG#)֋FCbc9j]Ai{+Ёs72m|'mhJ"} L]4D2u*A[<3Xά܉#Y|Z+ ?kԤw؊0xZ&с+'$F3uiUL kw=SL ^o_".?xͿ|b4?P2zbF~\'=nkt?7Pϯtv_q {oZE)V$^mSgf.C1+b-?Ej/HmvNǁX?ڍfe|27'm+ @Arg.ܩ3:tDQr.լ3{jͨ<% ہ}%6*BeKB2 MgO t'{_(PKSe9 VD.)BA(@(*ťߍG&%qsķL o@Jz0.O*zL%)%{{ 1ӡ'1:Tq2 8nAozcxfԔG9DwQmd8N8N9nae0r)lM)[Et*B(((1(^i S*v^6g-b)۬ >@{@8bKV 1D8c{@wD>"0tg>#(~hZ)7#yvB}ʥJ7õKKg~ o^W?9n/cKvAѮ~baO馭)jGʖp@&hؗL'Ց,FWK:uRovT-q~Y'^ӖgL:6C;|}5ۖ`{SBOpԺCK DD+U:Qٵr ;:i=+ҨZn섁<*jގxa;R)0vZfۀ~gOU3XxΎsk24uIϒ87&h*zil24{3}pv>lj([Ѽ'*rB@Q}PqqJ.cr ^(&.8i\Y<[)Hz7+ÚW߁C$Dڶ u[E8\[cng:SIeZѴB8Qy JR q!=0KR_z ݈_УkwJ/iSr$O/o j׬dfȗM5;G' !PCfKw'Ɠh։;aCwh&r%(qqQWo<6> '[3{Gv=HͲٰCyIJ@u! A2)ILTr4"Zyg1W=Je&Y^'9윲ҕe=d˺ N)o'~n^K=t,^/YZ5jRJUpan޺`}/EQ啋*RJ Ý؟sMr+**:ɉIHhYimŦS} ⭂'~zy.?]NiFIa?U]KpP%\U8: ,iF?GV\Nl)" |eSNSO۟\Fu<˯;ɹ6TtqhF-pIKts~f1;*M [/룠 >]q E!adNKʑT^=WG^_EʷD RR3uK"po#79ձ7\QkDFj(( ߍEtFNͼ4:7jx™pzN"%bjX8 ˗!kU ˆ됱#!<Ԃ禳Im)zI\0( Ss#xZ˸K<$ؙ8F8YݙY2msMgkÛ6̆C<3\2ȋ.qS<œřMʊ@5Qz'@,|.=7QEgI,转ZN>YmB`]#CZP+[;W?q-ȕ7/vl7v$`sԛɸJn)R(},?SEQ0v̘D9a =GS%|Љvmݞ<bpq+%EG+G 7ϏpeL/E~DakY(ۺ-E6LgQ֨2^j\(U/yI2kY=kЮR>a&8/ӲFa귬1}iެoc<8#R%MBWm#޹R#@{Ma4Zmv\ Ԩ_ك[{y˝z~|Srsji&9'HK6 ^Ou!) oQ4HKBfMYK6uoVDӳ{U?̺ &uO+WD |QiBEb.SV-AR3ԱM_V˷2?&A1'W!"PKӰ]֌ȾZ8&e?(Z4Wog[YKfjB򓙶W;{$!v[7frCZR g9s]}!!jIڱUܹ'Q .P@:PdT~)WK%t(F#E{̘3歪y%H:83pIv/<\ʃB޶CDndŬ9*JOG+U8QՏiXZp:h:k\"ah\ͅd s?cةm7[/j'N%h."QCFbUn95Xn;zM(}{&nkMs1 By啴sfX~_5'cԑL3ƌdաXmXcӱr/|ږB1; >=(S@|Kú9SZ~0P/쟇 e\*ٍ%P4g:q,Yq/S)$z_ʣ "xtn?ZT=oak|#7|\Ɣ~Ӻ 0?S^mat,> q$J%B RޥLh)a隥p4<`əO.)i dY~n# [W]#No}Z;E]w[ ;~ٖe^5*Ar&,YJM_OO)BǜEUEܜuxPX^OPT֎ ͮ\K_,.#Mǘ@Cr)&̯0)j{.8{#fJ` ݞϳƝ? ڷk^qKiZh0㍊]\\dzAٞ~dk䄒"X* Cq:L"jaY͛0wwJ?S^mݖiEd=m)Sia뒹dFY/,i\9=W9r7УU1M3((]ö||\mt2Rd{&ujZ{+Wܭ,w:|z2[<]I: wC'j%.TןQ;wt$Iң)O{ٷm)b< Qݷ|JֽKOzn'ѥ4{ByHY\%I9;J5˓OT>]H$IB4ⵟ3y7Xί)j3ֺAAʒ$IP9sDI$As&ה$y!oH$I$I$IR:2P$I$I$Itd,I$I$I$I@Y$I$I$IґyݓdB<"[7˻8Oܺqv!I+<ͭ7 q_nB {m`Q?`Wvy9C6W [v0t:#߱>ٳ2 ,x  û6&*x.y+p-ޒ}@Wf1bjJbON.6]|LU~0[ڷ#4̗lғ$I$I$IRFo܇!{mjT1p&(F]#nh͊s57qj78himbC9[g )]3ehkZZSm-#$Y܇NՌcXsԈN?7*Ue̹YFItLx>7XΨhn`@oߣS9 ]IhO%I$I$I$I@;\=0b"7ch: {`:YuZVdcƓpenp^\kt¿;vvY/kSWC!9~%E% gL-]$I$I$I9]kz%L8Eߡ}=OH7MgkD &d^/j6(*>=ftAP:ĕ+8g(؈m4UEc~x¶r:\pl wIO$I$I$I O(x/GF]=,Pr oYRn˧$I$I$I/ɂiڶBBh$ x(F-99nnn^|y}РA爦זo( PPRU҂d(5ߩ{IX[Suti,'}KJqYf zd$=ggv,Mgū #!wv=O%|<Igu@kH!}d n#7$INT{}&5q}C l3{Lc3!i#e9gIԔ:kQ|5#ٜ"3khPR9h%_on:i?.>MS4Wߐ%̙pn~6MS? :~o}>,GЈ\3ݛצbF|>oy'ݩ)OUwud1|ڃfTu[t;?5r]5f6?Vp(!C>RæZVoY>雳jQ ߹ v9v nz&nX< Yՙq+N4 O@:~thT*5҇q=]'$/zXUkԧ{Yss#ХE}j֪E&]*!wi@uh+DXk^_;qM'zh5p7m\QӭNk@ ۧ"dRWT'+~[ȡNaɔR ;{Bw(M(KdhfSwr5D3g{cSgӌcb\h2QkL$ئN܉y|+6ȰOtb6 狹*;U|5(kD<BLϙa7c |;dejD95ikٳg&'aj?L hז1x ~61 sdKZrp(rp[%ڞ(3 KIk&lz_.7 g4uX'dPzQ`޵CN< }u8c!;Y3+`> ]WN"e'ܪ׽i].7v؊EnpbB*Z+)jΥ(M`w<:YVo2xi<+Wb$7>cZ/auupΕbR2 W{Ji/ HfyF}2 ݤ+_:Bnoiw5Rؘ8<?Ytmc?F`4lCρsnS' [EkS^S:hM䋬ݛvMߨ =/Խ?3WSuу_ŴM:2P2)%|w7քl!?ʶ__Yv_{_%?=jBx ߃Ѳ#lژMLNtl~ ԧ^)F.&|ޝRASڼ+k2٥m)3wٳгMck@wFњЄV gU=PFwz㗛_ϟ"6:e%z>UHY93ƫfCLx #14k.Г/fĒw6̐L[lMcol;@qȨuh&߾֚ Ѥ3Ccx)_c8Lӗfu3zYVM& hK cٙG.ieh޷RPrh et7p"wiN=xk8NfiПZ,e:dN#VO+sgN̥Oi93ڴ[,OӝOٜO񿮿aeU;Ҫ2:u3W Ko O=&L׶ǧ]2{$ں.)߿{+QGLs+}')ufwhkn"CH&.ΌO}))!̭<yf ca\2nŭ۴-0W(7 Nn_I~Gp,H`j.£&DJ6NX._^Љޱ}:^ü GzN^[X3kn*jʟv9NSvT4.y6->79^~jZklx*ű?JbO̥bA 01+[qbޣuúԬې²g2s{6r{ztDATlX( byl(>]WD"J zKr);?%q*>?8zdwvvvw~gf{1Ljzv;N=1mSxҷwtգ?gk9kǞ<}˥t9B.j8;7jqwxz^ ;*užN0 IDAToÈ_o^1cKtq%z!)]z+o+c(8 !ceV6OZ˘Oɂ&]{6@kنF~h?S(ֿ^hܴ{ЂyKۜ^uނ{kvu 0Rw3,׉3UYw [57 _HԱOp^_'s FMWλO>ܸy%, /ڞXf{c5O|~}KOCS68a}_]]ކؐy 4 uHq{K+ٿNca7U'~ɤYo)+g@o2 ƙʊ !CG1MC )lrsABu"QF3{%_2sq&⍳ ,`֞6<FLpߵX>řzݷY{[s(! kBՎEn_vmtLӄAtT},ɕHI&*/rRMy"z66Qkhos;£ץQ+Ά ֌ :'.ʈ)6.lԭY3iN50 Arڸaj6hDlr$0շnSLClF#I ZSD\OJGhќLnkR*ftZY!&\'KXo#^/XN8znMbѫQ5l1 r% 1I:.KZÂ5-' đ;m̚KoC9V7r1iKmo?ڔԡ|MI4ciH # `pT,(jA kZyu.0j8HoGOFՈ=Bl1!(RM }vvo\:g;0R݂O>ݨ{ G=ޯ;pp3RZ<Μ^Iݯg*t`wDIaᨨ{SdԈڰk1:vzrt55[awbZFTt=x'khs 0Obu43 aa'}a<"xkCM:uJf;qg- e`$Z<\-̜SCo} 6Z4l $!0` tMRThW3|;&[겤`'|׏FeY9A8 ÄVze<&9m޿>VŢ1E!r 3e|xg{ByjCZk:{Ŗ\׊# m6$K )̏<i'+ˎW:i?Iz|Y/׃Sx@ݒr(0p|z}ͳ?h3>;w"8jGx!"$߄jD zP{򜢝HID!xm˪0BE;fPn2|S;[*q". BFj㳝'$' ]$ѣZ!Ŭd14hB CK{װ! y3smcLA P-/Wast>Z*MYqA@d>ԥwC/@'s$K_4[Ua& !ڊkHg6~2 }m{=~Z{>Z@͛%BUbp%_ȱkg w!Z4cиOĹEڥ}U ]oѰԄtysdT+2?C |gW#ZXHoOh & < elH 旟7;{IrA|B<2# Qf<-厧^grv2Pq1^^~BNv;)]rr {n?Cq9\^ja@|=:E{~ْ}`&5o Ex䅡qxrx"6ǥ",Si}aK], m j5A2ט{靣tE_ؑ,K}wVK/ 'p ibߧ}xY="YZ#? /?t9㉮??$cg|~;w^[?(-} n_ˢӘ>GO]Jx7 Jd{|zMLwg^G&}gm3o˜+X'l^_ %\%d#gZ&Z@uM䙼 zҫ*{oj)9*Bz 9}>׏ᡝu"z0^Q~5gHo!G9D)ԿfO[q8t4TDYqS}^[r"aԝ0oAp(׻_m\l/k \37&\T=αpUt\c"#Ϗ_G9}?)u\zWi~7^yz;3"i\ ou@HA'cދzk-OF@lj.:Oi G0DRhva_ڮ@qv~}f,E1Sy11\0r"wOx.7JeR.eya ,%nk>H'f<ˋ3Q /eq1[h1* nb'xq՚cUlOxZ?{", /f ܛ-P\r-MR1|_>;;e2ONRϿY^nEKcI}fD<߮ոcB&Ej})u+<( SS^{sҮ߼_Ew[y"4"˩s빷#L܇j^ϛ' Ix= 4 I6Ѭ<3a1:]HIRhu鹧9??wlcz vхQWť-F}xd=27gV"zZe$n3CL ݵLxlC;I߱㰗{b -,1Niړ[$7xABׇ֏'箧Qrħ译z:~<˵S8}VX{#p_IS[QA0$&'`5wT=v1us~YJ%ـ.mToFn2is<߉WCE^ թЀϷV^sMp[1x&5h'"y?惡̓;'qƉm۶ QPP 5j$2224l(**t]7YV6Mb6)egL/ 05D]*Ҿm.a\ɜ+KwR^OJ,a&zi7ҙ%^o$C w2_d8-hru䜗nWz^@$Wu,6OA3u:;RRz^֗>~}}}E/??z,I#\.J&[ |JQZ:Ax63'/ vXzw%KlL>*ו=p#@Jte <%DhD8?"pՉ:J<,_rJ:^oP }/۴_-0}*q tt|)BP\K6,?@u+B! t]/&eݚcbbtMII'm6LIIZƍ KPeř\phL,дHiSD:!i}i;kl O+4LBhsj*^X/߳&cfg߰:-wm$\#?Rz:JEy3 Fe7<`"VnD㏔g 8ʤP'`ͥS։") a3 6i]e-{ckxfPSL%ʷ[ D)|UBP(QBYP(>2^{NtL$4ο' YE D2׼hL*jP(g=J(+ I=GaCv?9e+6E|BP(FPV( EŜ]6#t_U( BqN>BP( BP(4*P((2hV_B BqBPTQV(gIJH+3PZ;Js—(PB8ӉdǔϨP( e( ɩ3 WDo++ _.E ϟ&B8V&]yBqn~Uʊ3(ʋʦ /nP(Ri62+J(+ ΩES$ Bq9)WoXn"J,+% b\ VQa B,lQDHq A ?f޼y,ZGzÓ)\.{nӫW/z-fsx2BqRH.gy!YP(v' t+ $/XV(%+̙3;v,{AJYRrNJ~~ ay")KEp0T P"}6} [~1-DXFZIJB8(| L0 &x*p^:#Gd(*LeERO}) iob ؀A4Y\ |i}XV( Ns= _(PDIJ,KLULP(N3e-AYE4>&J6_J,+ӏRbi&zH_dYe$ w/ãȺ^!Q(T(N$(Ac]GJlO0 ٕ TX<쳸\4oޜf͚a0WUcǎzꈎh@, !x7XV(Y*!C"~?;ք۝ B(ג ֠bVg/sIt9 O! X9dee1{2Bv̘1?od~?| IDATJ,+ZȠvܐ!N^n';5G[F(Y- GtUlA REKD33z~"TP}4zEslM><;ѬE,FYѶi I߭-`F?ȭbݑ˻W+LX_Q̱QܟMhABlsOlXޭŜ g%@>qaDDͷmʊ빹s 1)El_=Ȱ^67fv6W9lܸ1bx iCedOhin@l8`g79KE7@5dN1lb QeB>ʼnz[Fq~F Qfnljw$#8nfQt5ꓚ͝M` NH ,=Cr+XyxR&LƎ\ƞ)H.g$,R[.6oQi?pIu$|ݐi +^]pY-,|EepB$>%ٺp}I)mg$B\ 3򫱱B c]bpy=(8SG[,0kjc 8xcխmeM4nke&~QNf9`ĘbWRbB:O2h.I1Iҳ(v&26EnRg8t;uQK#8uv,]NVRe{97W%_@jj)$ X⃕lsHqqR,1ވ-Σ[ܜz1:Mgj'bhSZx[0G(IRl61{ˋ0j\Omss-U;phQCdM'F,3mgԬŝmhg.N ժp R"^xv*eES~Dr[)4iP4BPpRư0  f;MFzpd*'YB`B'/ᮼ<^ŨvfNl:1! YjKwGuFq<\8C22p],8c-V>$3QH]r,VI{rWb8# .nmT$y.jgn]'pM=\aս]ĤŨ6:4b NvFXG٢J/fQ7QG63h Whwn!Wdb@BR4jikY551 lސlE:(5k-Z_\"GKxUGū4Ԏ(72r<.4H4pX-@b/ݥiHmjEƞoI@P`2pa3 sYUkFDI*݋;K0FL%º]qKB^N^Zkgç+rkp W8{ &cUO$WM RA꾨rQ! J`!Vw;]CB)ADzC!c%BhZ'QnHZ6/Y%vVg~E6etC3:rS6eyȒ~ f{@'+B4fěbUv8C&ň A6FĻyyQ62!]cX+J^ݙMy-\ &=,Uй9\56+w׌1 }v67-wH6SL :ˏ&h\ (xs|nK $#E,<̞gHQ>]6g.?YwNG53^K0s{!KؒYU.%(]=aXI Ooc5+ou$pbS*4b"sC]o]`.}@]Wf3siܜ3뤕k1rDP)dBPTQG7AdZ^>Z0V33O,},́/DA %ź${sAN1g& Y]Kw~";vGB瓌* <+0iFzd˷ns/-O8 ev4`.˟\Iзbtf3dz5#t#f,u2AdCS7 $+:y.*d;\{e zv&"BP(U)u0ɒƧXos$g'瑑:t<7fp4ߋj{h GuL$/36ۜeAB$W5 ^_)V&YsN<"%[ HE8EqKGX4/ɦy0] [,_}&S5j/of <Çt] .b3%^꯭6[W8 o#1ML/AmHFjd$AfZ7x)l,F߶fV_>AhΓ5ݹNMby&04FX(9X[v L\Luw ,FW;׈tJɺ!GXα' oK+7$J HRLhh}3e}$b3%N ؟l“ŬZaDPV4],ΔH1 j|b!hRL]^KѴ(j>b~kI|~M`1\#YWQ  S-CZNHaM-2K #9 A#ޠ?l5sqRx"B;M\Hdd`CDhx37wqŔ=n\IUXa61D@fk7Oʝ9z7L<Em-Tt3N:ѨQ#vψ^)%7ndРA_hF#[M`^-d>oIad`s MciDKɜ5ټ˦"A? ˚|)lbȄK⥹5so[BBA%[ 4G;XU%x!c4Z IVey'YH/?n(ʋ}b3aƖDxWe&I{"[YP(  +1OffFksa4 !|c5ebyLB>Ȕ-,4=dYy%[NqVӲeZK2 ݬ9Rݜ$;v0FFAvTbtn@OQbQ/u>_WDb[5n~[̶SX_-Ndtxĥ _}K "o ^yy5t|k!m/pc w<Oƍ۶m@4jHdddhfPTTnZ&m,H)mR?Ϙ_6pQ A7m4n2t˗/o߾W<='N,}&drڵm[af`M(6%=QBU޶"Ay!JԄ/] B8]볝nA%>5dW)`Bcߥs BQRz:? B 4 FQ2Q:OEB8˂VNSjW !rNnM111򦤤6MVZqƕ6|eU֭SL!oqዪYSxڒmIWyJJuyy|H`"8@X^ѵohrIOP(UhN{Y~2B4J(?"nc\qY0ǫ YFE_R1QzBZP( & +mw 5F%==~3gn:|/AKLLcǎ 0VZ?TʀjP"Y8 k ](P(g>~1,=ʬV(J?ÇyxSPV]$F)tNn˯pUhgd9eGBc )LjBW(~"!N BQDqq1#GO>)5TH))**Ga۶mL)=;Qtfwh0NQJ/}<څ (ݛ'e34Iޖ9|?ͣVR(NH|/k Z#G%gR(g 76Tthߙ<Ώ+y 3!}_Jn*Fh+豿Ar9 -\4Qv BRb\lZILLѣ!k׮MNNv=d~-[OFV(E"4gn&^d\~?6hNkLRDsӸ װ9.iG-=p$ }:&o|6c=wHKI44g}͗궦C%Q]_YH$nK5AYK[vd80%4u -jb M-lڟ˔L64L0ዀ z;Zh~0WT*+UBW(%&k֬+#5M䡇bĈefܹ3:&M -K/WO>sqE" @  Fkͱ3del1 W{?-W`zt~ﻉՂsw?YFnJu/nG- 3پtkkWGn[eǁ@zuIJ42boD^6n8!},\:`̭/,Z#Sjw8?{itԓyk9,Z{Ӯ3G(F҃wL]6{\QShQ€Q0sN;KgBL{^љ=%7J# E";WAXP(J( =̘dπB|$&L@=4hNd=%K]]1PT»^uzuÞ} T11d {JxgJnKIfKJݷ^DO-ב7G1wu fo?՟r _96lE6gh(|W^Њq 57=v|n 3WQ̗j=G2cAe챤]Ћǵw1γ&dLۡj\)S(BH ^ĴG1C:eS1gZEMm1Ӗrw&1g1+笧˝5Rͅw1ʭYt(YEA^hD4 M|W(gS`9sf͚2 /e]ViCܯ_?^|E|Y׬Yٳ+B8 qC`6Q36hTkٝ5W3gn{^^fNk?Mc `juh۾VKijC˶40RIrpx{[7~C>ɂAиauuG(,Q] wI6]ada=8T8(lq4me_ԨCbha IiPIξdzcra'[ @=_xsla"z5:'pҫjeӲY"(>|֜^& 7$IIQ_ifPoCNOOP(*Zl}݇| 6>-[,RD Eգ"/`|ZE8&6@T}Z&]M1n w]ǝ%FʼYg.4_d6ۛ@,K XQi]gu}'sa,Vr!=Y5;bJ65]P$.4b /q{E?p3^H%$PWi >b(FQ=X@+*""HUi!A%@@DNr{q|Vg7u\<[U)7kQwu-[8' \s =J,(_"~rȑ#qq9d* ,`e&jٲ%e .wwaBkz IDATW*FfRV)DM $R I5P!h `[sp6 ]" `i,p[Kd@ 0@co q21%/ΤW4=Xrۋrk"T->cGЪ^E186oKu3 wr >^Y+; ą9 Hx퐷|A iԹIR2EA\.ݱO!OtQ233ڵkNBLdҜ2339z(QQQe҅W7cAE*:f[/-c{ٽ?\n܁0W\a|A:^d N{ݿ" @ڂ9f:V#-n/?- [ '⠭lcbii6߯cYK)&jt<_{ŏ(3?,?O]zMɄfly =;/D<`'?Iwj>!-_~˙£a{Z%< $mNB N(WҬP7juAq<҄>&9iGHtAWXq)wѣG+zFP۹guc͊ğ!Q¿l& s}K~nbHPrw-囅kkiJ2}pnEHޟlXU$ݽ!^(Qˀq?/ײ39ϡ$sfv:ZV1!ԭl9XTfJ[$|֬tv*ߑrÀ{n[شA/g3pmkXbR_~rBQK'NT *55UeggH999a..EEEi^i w.Ķԡ}w}-ROX,-ZĐ!CʭյLڈ#3gYyg8q"^nٳg3t+b[fY?峬z-^'o%glXV$"u2j`&ᵰX,3^o\jxqs!ĿWә٭X R*C)mFR[iZQXXh 68`ftt9qr-k0}œPigݻwwN ڵB!B\&(_jժ9' =O?4UT)^Y7vNB!B7@"V8ŋʺ3aN8A~~Yqƕ **PQB!BD勤bȐ!ۙ3gr2iaXκdgg_ rAdB!BHvmtƎ[ns1Mcr2izқ,(<ٗB\ '$P 6lȑ#c啽]HE 3fLb9r !D 9aB\8''H(0aAAAeMO>m۶̞=2;w.m۶>( B!B8' ʬY߿?awމ7&,, ڵ< (RjX5kժUd!B!$Pvo̓>Xg4Ml6Of˖-80"oݺu Y!B!2PJ1rHΝjrPx{{3w\r !B!<$PD4Mc]]^popNXf  Y!B!A(_BJ)7n̒%Koڵ9^Mܹ3| ˖-Yf2yB!B ta%RX,O߾}IIIaŊ0ʤkFLLL4!iY~='N(׸'Bq- W^,Z kƢEW9? `Ϟ=$$$ {IppBa&+/W_e֭eu͛7'W6= 0y0LQq09iF؜io #";O!+$P>dzl2J !!si?2 !V'x}Ɛ!C4i`޽̜9oG_ũ'f&  (jiswFW7Ӱa\V׮"y ?B/ODRX`0 Bӧ1M۶ѢyjsϑWPR ww"#8p !م!94oޜ'ϗuX)&Le˖қ, apQ,[oN:$$((6mmpv|'X,0 Emѭg*l=ƻoNXUoG40jsz*'a_}Us(p VZEM/IˤkΣ)xcʔ)=z)x6[q裏Xp!=mڶE46mѣlL>:бcG[G}}wކ9X,,.7ϸs$_ћf|<.7y<_xWH ʊqŗ|8mŁxm&Fl|#sCG7eS7ޯxNzQü0 , ט(tӇ#yDy=zY:g3OYҰ/cC>7)?n ԰,|i9v*"}xt E3m[7-)Ԝ{{Z`b5tnFRt:d(~wQbpb{L~{!5ddLӓ^芇ƛp( |qi 0FVX,kיHEiI٨HRKNf__}5|CDx8ٹs'7 J-Xf ?3aиqc àV͚o׮t{GXnwuWi#U|}mݚ/_1 i&<]?~<| QQQΫ/ڵk3o<&MtBkGE,_2;$1ٜm3(ܰ˶9o71lFL#M߬Cp>0sXp<ŬEf!?yw5/W4'>Ei/zd!sv` Y-O%Ҙ;W#F3^.$(osYG>Օo~.}Q9 zk.7zf39a5Ç3wJ?াu9{ L[u#^Qh|2g!jo5NO6t*-Y1!2?bR/,ʨ|l9'6c7ؿj:MYx1{4ƨjaa ߟ |1>, il2kb4aW|<7lQDEE֭N[ӧOe7YqMJ4ӫW//_Κ5k8z~}t]Zjtܙ^zv^!80;_+ʌ)0Ƃ7ENSdM`ŊS6+78^cѯcZg=~O&Uzb*_EW4Cd i oOw-9XY+b{o-{oLcoD O k(L"ˌ%TP(4]G+zQY[”Bmݤ`j.rׅcQ4چpjECׁ8>}GGːp4γy߃YmM5/TӢ bx/5x?)vE;vGfk6z*rS#?\BKߵN6O/|wYtܙ6^j%iۦM騲8ZR͚zjݞ$''cZ)**QwA 7~ ;\CqM@Rѯ_?{ه#ʏ⯨]6/M ޽;ZF)=z4a0mڴғm[LN:NUYfdGDKi`Gz.&UǾ{\j6vcT 4MC2t48erjkG i/W (@䰫::fdza*lάW^zRʹQDaYRA>WR`K;kst %X( S'9 0)U4 <3r^3]Qt]m6ӫsR!!!Q4>}S|w߾rCV+RfM> 6yZ$`Uq%SJq˖- 4̡cǎtЁ;wɻan6=zp_0L3} 6CGq rV_|nr<ͅk]擡xIƶAS8w|3)(]ܛ밶4E p I/s/~Zqhc0iC;zYbt13YӤ[eje:/ˣKs$2NrO;>t.+qėӆ;}).s(:u;1{tVJ9|Rxzx}C]J)E>}xiۦ 5kp"׌ ?BqE4> cA}l޴te|Ϡ3^;3ٿy./}u.U\ѻW  +Kң8p Jۘp(&Oem pZu"f\ŽM^l=Q5<ӫ{..Ulp*#"aZ_|>fz7bƍc~&tm:B%B aOG&ء7%cƲd#}{Hʽ).RAA :u FzF;vZժ( ;;sdkҤ ۶o'==?$\LX[_5B\nv#ԩSݫ:})]g&111̜9}\@l%~PNWnlHlI|rS[i(܈<ћ|GRru|uWu5 e{xeBoMG<ƀ osϰ !0:^QF{^O=H:mEI;grd 罟k n1_箷Ȓ \'~?уS!1HZ)H,=tY<%* Vc>KN.Gw(\{-ƿwǍ7KuP[ɺ9|EEz{ӴiS @iҤ S|ƌT]Nִi(^DDD8gNTQt҅__{m۷s]˖Ϋ`dĉ*!!AlRSS5WWW=''G3 ӥp44M4aض};:/;|M\S֭@LfS>Rn4W Ǟ玏aeVfZ 4hm S_;V{}M r4LL0geLuԻ$f0{u)ORgQ\?{ w>;)0M kUwPRpuīX %4MO]۶:W 4DԪbA2K$g%Kɾs܇ΏυW?3Gg R*C)mFR[iZQXXh 68`ftt9qD^QBkR BXXUV-MJ=;[>2ʾVhPųGIr̹М[VOUPԵٲR%Y9X?8 s8@7EZB;;LХT%ߗY\ 9pMVf&ժUC4vѣתU!D%I,\\,v~Ƿ'UdyT#.Uq"%___ FHHSN!%Bqr3a Rƫ+ZpPy9Y!_ BqQ B!De!B!#B!B@ʲ1恼>'BMi^mt`:Hav) B!B5u <~_혴mHz=xFn^WϖbpH2 $wT!B!vȝ_j71?h{'631]: wߕ(26w6f`Iw2$R?G⺂0t\!B!\X|-i/qόciKyall7Ogɪ|p(˟}հ0LУnǺ~o#?z%+9V<^vxKFjprזr,_ֲק& p+V`w~%; LL l`00?|Qu.g;!B!Bqvfl;7q3<0X? xFznee{aB:nZ~4?eؿlI=D5 =qnY쁋œ H!t )M^W B!ܮk$y}Z+|K'2HKI%OkViZaD:ؖ2 M>Zq;m,]N;M=OXYDV|1lGMG/LeOadruB!B! f y~Zz;r -fgDSf;Y8e:īo U!:L[*#??{"ЂqSnxLdJ_ !EYr%˖.iӦ6|8P!Ⓓ^>&k ((,fjwG9,ӦH߿yg5_?|g41鞿>Yٽ?-< +[VM_yq-=ʀhաyy1s oޮ|pkw:&пG!6ѻo#\/< -nCw~mrS, Fgi=aʏc0t8#} k!`>3f̠F̞=֭[cǎ(ar_ f$}ݟbY󚿇qKFvyeyq5w rW!55l> V&~4A4 EnR ts<;JI耆DŽOo(>Q(M`U<ۯݼ=.{݈:{~V׮"yVlb*z.v{z8y(f$ѫ} J\Jj*gAHp0}qt4i֭\ײ广wa~=7n$%- zATTsv!\S}gD'J2)47+M9gEi TEih(u: !YGE7ӭ]u{c /F͚;PdH>~UVѢyK27@fV]f&?,\Ȯxx#kSTTOyԫ[ס!\[B83<àA43fO3~z!{={=^2￿'JӱX,X\ oޟq#I7 F/<Spy<' ]op=w=7Dy 6SC^9m/px m6i6M6NŲݩXrSxgi<'ra^ۅjGYkX@CD?. |:n Sp0) a)7y/lַSiVE&ƛp( |qi R~?^Þ5i21&jEVĆ7 bw+مۛ`Gn'_;lL Yά<$[<)[lʶ6lfG_"D&T7òmelyl y)>y!Ň߯dg#X&_(0 7.gZ{xmMcLǾ_xj0S-b05OðaO젚Ϸ c̳ؖ yϗ`7ϙôb=WrCe*:yӬqc.\Ȟ{1M4   ٧b:Vӧwo^8 ,YBVV{g| 95{`lX2*4INNi&$''‹/2zJ>7+'p 5ӏ`ғsP5?s18;̴RyԴ$%- /ȖW[ 0<5C (@/Wu0W vYhz=s߀IaaNŸ?cm\[d۷5kyo^_?JlL!N7nwJ rRߧ'Ţx(O4ڵmKmٿ?%iN)K \f,|||xa,]';u:ˋ?\a4, iZJ'G-y8r5B\Y쿽⼤$PJ!2jU(;>V(,6bZ9\Z׿?6 4ٳ'AAAqqqJ3}-7C'\'RP՞Hx %(+|;?ɇC̸{<Mihw|3) JJҕA/?!{v6tshShfC~NVd238y/{-= w?*l3ߺPc?{ޜz>]9y JsQ,a8m/#SnUλ=͖^WG7F;k0QQQtԉ۶ѻgOg8dMp ҴJ7Վtv6vDDuqqqTQ_(ǎKI|@`TߨڄGLeСs> uիWl+Kg湼8UչDӻW  +K}Gq L@ۙp_0K_4FE 8d [ {UҘ=XWHt 3&f8h;pBd0͊{pR=w`LSW}hu[>XittUD3fN_\t8}S^]~R M|Zϻ>~>&hFNm|F OˁԲHEAA :u Fɓl߱իӓl49uFXv-zV;O6mjl݋j%//׳q&nݻ3!FHB\#"XxqGK/ZI{Y`Zݼ oL>ys,a pWy^ըҠ6XɅA؎`O审%I,#_dF{_p8ۊSwN`JdwQMx\J~-G6F.䡁ϑtBʸNTek y%|Ӎ75S|xyj0Zo"<}{<ϑ,jmÝϿ};}Fru,zLۧs+1{oxLgX= uB=W4Yn_oobbb{ Ԩ^Mr*n`~̙7 &AX<ݝѧwo$R 8@[RSSX,Ԯ]{H!5E/eL8Q%$$T"##Ujjhaxzzyc?,޹۶oSx%&o Ys )e*Zɥz}ab[*-2֯_ѣ9 5k2}t:w|#Ӱ9M PBszi%@)4  x,ta)t40 lh 4lʞڡ.Ҵ6^L40 _#Y41 (( :^41LkUq9(i0Nnϰ⸟+7+8[-//&c&Z5e8Äދҙr?P)6 #wqq)-4(,,0}||`3::ڜ8qb3e!&oߞm۶TIu'J==[>2ʾVh{]izE9)L3Z/Y(*Z-{:ʼ\QZ1bOR;+ k[ YB\ j-<ɂ $zu3b&S!_%&k ؞Zĉ<n*ĿL^\40MLLa`FGfŴ[m6F)Mq툎QFeҴ,H6f:J폺i(yD) dșQ16Z-]Z B\$PW|]fPKQG\Y(. Pŋaͦc& EB\ŽZ)cf&xu MArgQF)JvSdwiE<7k W5 e|a_ 9 !9ηQEitE3C {WW]' -AB!~ ҈K+B\3$PWʵ !B\*# q@Y\Qr9Y!oq8ǠikuBk'AfA!/2"ݧ .#ڄd^+6aMr>;ҊHI7\^WP6C9SB\ML`]Ph:(]4PDif㥼=^|{桮tEH,8:ݝW qEp ̣bQ 6Æjf/VCO'WLlbA2V|kPr~t~.g#") B\'}t\Jwb8th EB!%'IB!B(!B!B8/pRz-u\4ʤ|z֔&;2gqRԫ[;Gމj!B#⵿_g`M ņGu7 Uqɮ,}`5VXVhU<ߎ:0Yd +VdmÛYLQxU0ȯ=@vQTDe] ofPztX1CwslhAט2voeGb :URV0̀74P\<v0~%P:Dؕ qPgf:sk(L8R6Mڰaڬ͞n2niaR2vʉU漺'VPwoFEʘe&=sIc7w<U6Y$[#K\ȡKz _zZ#S}v!?z*ի0frvQo9FV5y'==c1@eɮPk"=R //ădeec&ԬUV+Y;+,*b EP}UJ4uPʞ4~Q[D}IJO.[C- /kZ\Êf!6==9̖tٰtl6~(ɓ٥UݻYlrL$,,wɥ5ģ\9ڐ0׿GMyR9;3ZiZRXeq ;Y{2wUHϑPU*PjjD61 sP+v4ٷo/^^޴lY @ZZ9,P.,*BS _ZjReڹ9JCz{(( PBUH)ĿRpU' ᠂3i&i$ G=W^|'L?t߶~zBG9Sذd$&SP5818m9#d<ƿY/(]BpC  cq9t<fGe`W<@RNMxu4KS\- 3=[ngࡃ 0OTD;:7F+8}*kBlIU#u<},"ZyACcD~;@kܖսƱxt%^ݻON,΅n28vdTUZNs`F~Ûf䓕qy)`*~KVD<(nnb~e uQcF>wn"05Mr*^fAуjGצXSXy[6m,ذtDdU_fի̬ 5gin RL2/@S W}#rU6v R걗92_Kʋ >zsYƤHYN-b!$кvM]@cC tfA+ͽԝa@ z48ʆɺk8 X, K丈%z8zy"yFkH_= <+e֬FKl`]Kmt.37on|]200Ν =Yl좱QabrY>F(J:|>w]|I^x 2V&JC|s*ͶN>_8w<>5A~R<㛚LzRM|1MC.!&C tv{<@՝4å"]ۻIP  '# IDATy*>J Y,=#Fd>&Ϥ0{?a ;v3D.OPMpM|'ۚ&l\*CNrxoKJX)!K7I*%p0%eF^AfO%A& 8[>Nww혘_&b\?Q,u µhE~iy~??FD?ӛf߾}I!^z9+V 'Ƕѻύ$I' >tC$ZKLv\ٵS4N?@:)7-IIgXQ}] lef&O<YՂ#.C~1,.Hf*Hܷ_ojw"1Hhaw$ɤ4nxlm>N"h[NI,0 ,3}#vO*i[ˣZc hllP^"'&ʕa!TV\+47f` dllOK˒OqF|A|I<߰]c ٿMaկBvcbbb)ͭbm{\]uuuXa0.IN+} >#?3G!L{DG?o }is.s džf)[q\fӆHO3ieUob<,wi}'E}si<̌dy+[zS$\݇mM1&Nrr$M.Hef:ضo96^t]wfE-4uS~mHб҅س9IJ 8@Y|'FYC'αй`.Bg53g0Cɠ9t <ɫW)t<_(0>>ANG /\瘘K y']JcޠE`|K_~e ^7_ uennc mQ՘9]inrӍ4^M 'YGIб^v=?>%Hlއ6qc؎නS.5Wd 칿pq6f=V5OVv-=֭ Gs%'UO=ېa›k.V/|&>wI-t#;ɹ|k;o#=ñd[u[[G2Ѳ}[&xZCo&}#>Ld];]=k(<G2i{Iѳq#Coʏޥc#ܳ:SԳ{SQ"Icz۳3ɮfe} wcev1 Xz\v@4kȚU>s$tvvXiVU/瞚]ץѱ~}LLL U|+_Arʺuʕ+N*ruuuR21 Ƙ|?^7ݻ\q6{m6Z[[iiiADի[O?~\5F bKҘ;,WUnUѲ*5?¸:m6ʗk_fmWr _mW[wHڤ{qMV_}X>rk]d2ˎcx ;u{EO ]ra111OD\Vg?9Y|2,.,,)r9X,z3gLCC0۷o7_WdqB6(dΝ| _<ׯtbϞ=7MopdU,תiz{{@QQ|F|_W.C\.9wbh+VnETЉl2*t˅hk[Wkvv% XwI,Qai\} ea~~7I1pyxT*y;K"Ps/ 9|4PB\y衇h5OV"lN!^ns㴴,ݏErLLy1?jywJ>˅n?@(EObz"_&LJ5бv'-js,K,cxNyC?a s5mn#I1v4$]vf>׿FRH"/Ĉ  ;;ihJ;7jM&I2N _2w5d%][߰p5F;vo}=8IfÉryo%ԥ% JH$I8B2H;_\k*dad(v=E9w$cCL-%{{111111111117X(ܑz?6٤CY,w!P"TD!pq]i_|_56՚d|/% 13L'8LaF֬YC@?+hmoC ͖1w$(=R$dyffr cc\`dtw9sb"(M9vɦ.N2tiW&hiLإ1FXlݱf"׫ŭ!1wDt.ISBk.ٺ4ER$1 _vƭ թEN#J.ٞ:ڨkhG.2val&FUco߀զ8ߨF( ;"ƁQueM"r@PT _݁H|kD-ڵT(blܒD76 35u_J` J[ T%lso*H=5RfC?`m w%v#Ķ >*G+9tcc*l !Z~Gaj# '~c|c>⸦ bs.6oЫ/RTϞ 4ed*M&%I( EcSO_?t]]=X`tdb̩s#N̐I udiHvy7) S3 \OGbbbbbbbS|:ltvUXсk훈@HfRG!1T lV8xFX;: :R|_3ц^"o"܀J TaU1TBq~e?*~V ꡅk- cwuMkZL&GBԍ\2u VOk5 Ŭ]] |g*E A`E礏1>N pb-@`$я,b0Ʃsr>Ʒ*ӓ D:C*&JLIgY18rr KeƮ W!S.t5a]']$Ri2uYz(+oa0/){za WQbtam;Օ_PT;6~?` vk>1 FC$Btʬ:]mLevn%l`VP}aIq*sΌ1eV6# ꏱF|h9&b.rP[a > >su*,SnfTU׍7h{E-A D |3gLM%D8'0R_өbtņP&Ho@TDa~ 08up!ztKTB9d]wc&N @'$Ҥ)R tD:.8,e^Hgm2lk&H<ڻv)Xe5{6NJgc$*'N+#!"lڴO\.Ws1HA|20DFm Tv5t6"UTmn巅k`TU-_mGkcJk/&xƦvfDuRk FMGRv_XڴU-m tW((0kNW}6 *c0RAy!zdәJ+^g=DzO/}|_3zGįqb cE68X'YmcD>ytZE͢*0`HRc۠H eFgk.Qerh[}UR\@Q:[+FTS=K]Se3K׮*͍ Qc@T4b|(">~ {&c]*hl8Qp`*[_ k_iR"@g ȍ H0zދT&ֶ.b bŭ723/*)mH%sv)&}&0gNSshA8?}7C/S}ڋL=l$̀_X,ԁ8~G.Bs˔=ܮ/pL̻azj{9ߠ6 <טgzjE^\7̟}4p#;h_1o-{e C[<)|Lһ;hE~tG'\]]o.!Fxvܹb!ͰjjZ[Zre\k%Iץ5dԷ *x윗U?|]:`Dߊ(E맳@ TtjZV5.^Qj|+2Hp66"CAFD,ZN-*@ A4et#S0 }tPB~(`5VjQc& Cl]T p"gfmSGk*lײĉ4ǵ֧B`ɶ?8+}tObbn}ۨ;#!gfIR$)p)'NI]ǺZs447s8)#O g='~ٸqu:BnN<7ۇ.R!,U<=t9>Qo$r+ &v\AJ:.zWzj1:u\}6""t .]D{{5:7ye}`eqؾ}\R̅8u;vlOE1/xx8|[G1 $^^c#bijB-}H*eS{.vcg/4Vꬪn;oMbh@8i1hhX gk/,6ӓDH4L/RIh:|H +a`gU`YFH4_X/Au$fSʵ\] " iW6h=!kvY%:o-Y7F[⧵d|CDlV -Y˯y;rIdS/EJ2<N) -}HZ5O~~p_ 8 g힇;ą6>*5HJӜ9'gt_K9{f 3V2W>KSkx48ŋ${MW4Ͽ4CDžc\FvH[P?š#+Au;ص@<3Ǿz{bv'pR3`С/_nRpPɓy&Lm[rY뙙U֭_G{[/3<<16|S__OwWWXȵtq/yLq'>;xo_??@_o/[ɭfK<g\rl}}3#Te( ʱE1l/ҁS4|h2éWpi7z:|)ιf.Ds ?{iِӲ\DKQ~HV~W9>!Z_iæZ3$A=}<}oCtJ`8x|lӯ+Gs||_/xS9dq#/Ϋؿ0/r;j?7*[&zh6aB}U} IDATǮ5VZbGEgu;̣q* :[aʾ-O}뎀#> S&Ce~B F}@SԆc# m-C?G|iGw04V;Z ǰNٵg*aK74,2C$k/] `l[ۺ61 A,- i+l+/ $5 .bXD+kkA*e^ =!h[M,cX2i{+z>x~Ø2OLqI%{?[^L7!t_,ʑamAeJs9҉2όs8 Ivws'ܳa?B*2!islOS1X$fsxkv NLN60v?){` >GB:Yj5}f01qq <6F &pi5KT^cE1ZF&#6Q{V XQA灵p#JPG*LThuຕn Ϋʄ=O% +l#JCht'[}on-U{kW>?>,N02 8.>U'c+)!m/<9 d=֡"`]/1z[$0Nc\D d?lC HLFGA,A"ɿ ܰ@ta `qmN]˯+W٘;7]OjՃ\ffv"BPX3?7G~a3JDD:.d2~.^elx 瘾x N/a-tl}]bb׆jx|.|?~{s8G&رc+whe1F N[Z8vѢIN'hX z11q>AR)REUB$G7jfhG#\XV$dB2"hƏsj+k:8yl+Tɻ)ҮΦaq|$}iqr*M&0[Dm466tmTN ,I7ATr͉|}\`aa6aLPQtnaH0AoM\a^Nv5Zݥ3QkB1|LHʳ' g5 5] ޹@|gI ! Ip&lXpMA*}=mpU#N"vǵہA ĩ쮈66S#AM(d7pidEҙY2$ Hҡ\nr!v<7εӬ-.!Wǥyf $ vc|[/Ow&zzz_oi+2x ?LgAz~]K~ls \MV:r W`vHTC/}S<6Bn켡,˥JopqpClSX׺Dɳ b%}(GӴvwpكjUuz8wjzzS~2ҽV=k:vczcQ>~*MkvP>\$I:sS3Wbn913=M]T*IXd||\]DRLX"Jkmk… ttvIb~n]V*sپ1`OcCp9ˀhj/ʖ`2iun ԙĖ@ `A2!X^m h;/i~Q+:GhSh9kC[ T0H4o k%2m[#ZmpKgj5PXȬzpltpu3y~>X4 9}$8`:jSFWq1b- l6 ^4# ǀ.ho +x6\7a;ө@ C'l[T4X_-z,"Tʃ%A0~hۖѶ*]bb8rm,SӔYH] uLY}ﵻ|yCTb1?OfKi4<Bb,Ἇ?p?`8~}wCJu|3?o.|L&͎;jr+m,9z(4اgGill؛cϷVĠVsCt A3XQ1S!P;aJ:kMSX?tn6a#j+Qa2[ fE$pL$~oDoVoHc*>c`/qreGp@p[Ko }!2g}VmsiO1>[R8>GRY k#[gVZZU+l6Mm/AeJ~GL |7DI*8G0hZmA_dŖ=/Ħ P-rjzSurm%&掣Ξ.J>RQ$qK4--+}':| qe}.率w q_k^|1Z:zjļq|x6J{K/ >G?-%IG0H>>"Ɏ|x;yp0*?R ZV茖봲6O"v6|Va!^99ӶOåBGD`7ձG?1whZw77W|em{^G.~>*RH}3|ޫ'nxp CDXn-֭_+z wq}U6{]v[?pFogE6̹VR -al/`O4U6B3`bMX*mQX4bRZ]I%tbY32`%b'm>Ծ8[J{h6=ëoߙ{_(8&>L/7k},1_ _EWfTV :#=o¦TEM'  ; lv7 c @ˊAW^ gۢR7P]LuUB93Ww5^'&Y[E%uCR|ne<y^|'Yd3lg9a{Ÿcn%elAQƊE) [LLQ-hgkyߊ(miz='_]ñn0>FD0!6e˰/S)A,`hTV#_O_/V wI>gzzc d2$7"'.Oqr*&kݴl ѷta c pLΗXϓvlִK̛C}"uM 4̾F_7X)Mrd@,Nc Yě8{u;&掤tN>].#g7Ąd2v=|1'*^LE2N+"b`gMMHJ3[-b' Y",WˠV@UJPBȂqt^")"ـ} *L]ah' ,$r*1>t}kէ7ԁ˼ua4_X2o~~ D?V!6h1 tAߵbx J WZLڸ6xsAĆ Q,w.mq=NEdU~/8ؽU"abb{CorQ) U4mmml߾ݻw{n~a::-n%ĥ) s2C*d,<^ࡦ:q}Z }adrE҈@7L.,2w1k.111111W|S<,eV":s #JZTv6Z BtM_$ f2QmU -m;3YqCwZgvr>fvxhz#~F9uDD.93qBQWg$2LnL?xoXOM؜~0G~CB&i{m2@T"l}tyH0l Vl{VL.yB֠hS~zY:iK0#`[5ֲ J=iu(cPKD% 4QV 8{,y(Jr[r</^?!"B"f|||Im|3\ tf4ד&e.?uH+$ $](džl<8נ&d\QNrϱu[~5{i tiATKMH*^^`2DZ!$ OWk;[ L@VG;A+ ȪnP*ըP @ ]8 |ֺ$V$_h*5ǶI"ц r0:8|2P)asRS[C 0935ᥚHHa: rOk;\9mcbo}dža+Ec͞cAimMS?Zb![B&iFڨJkH H#< 4.0AaO7\cYwz눅 :tN]x(7GfϝfzIדKؐ!$rdCB`Pf^\*AqqHBCJCyA%ĔȖKg[\{t}\*Y mA4$16DH9IIW@CVӘw{xr a$"Z/X'̥ۺWO-QI(QA'ڭ["|^6n*m{J&M@[]N\\FnB l[۴*3Z1 V${~1e:[H U H"xsg!e2 MrmH #R<Ի:0A%>pztz# zq+2M4Z5cТ6lI6S-[dK]e`A*6+T ~VqB[DHsA\m-K~2{wJvV dg;ܱLdD2hcp]} C:АJK#$u]b3>ٱ,8,ukj$4$sH: )AqD0q6k_1WAߕ {TW:A<Ԋd/DEXAEXK>ka@֭0g(9{}Jz^BAZ|T(bCQ"   " Rl*M$PS9?ޛ@xoݝ9s|]"&hcaEi+YHP/օ\#86ø)ʘbsqG Ϊ0U+dg`hTl 8 kPc6Hهzπ$ 6lе ˠ5-)8g=#3,| ZZR(?ϻ%-[<dl4~2TB8'؁CTBw(xlb!/W*Au lس!Gt*tWgDEٳge'^it?O_0FEƼDpNH^TQOiΦB=yE2^^౱٤ b8OաZ08h ]X{b*TPB 1|B} }@:D &ht0)@$'Rl+%c[tr!䦍uz& 9E[ѫg!x{H:4dqTƙ!fH(H䣮@bנbfAO{[˖H?&R IDATHv CJ7'V&tR?lѫX&dCF!P%¤1¨nepEHB`6dGD<0amӧO砃BUyᇹ+K={vRɓ;^Vxt^?f`-O.r8Z칗%X'$뱿1پy JF21z6K"WB__FJVTPB g>!lhH曄 Ņ`K CC]+C,,|$pV_QmeQĹE#*95KK HP5 X`5'Ų' RZY#v-,?"%C,PcxVРo!^ʫ5l:>MSeupup Hjhf^[6[/r6AocW;Y_Y6Qr XN$ ,K+`'EQ-ʞ*mPE$1Y1*aH> .UA~30I=.G)+=53BljJSɔVxvm X6n5/lOZ]j0&1d0Q-\£=[PaUvnTSGey rE@vH X7=B!"VE:{ ĸ 0,$,:rU5'rarH%cr)Y,xc\1,L#2quqˆ#$EaՍR W'0{|av1iDB@^"Mē$ti ip  e#O|)#BfA#Y+`F)<\ qؖmѕ,ʱrIpC aVz,#:Rg*݄1cO} y9?_ܱlE=dCy)>dYF]N3UDI(Tq[òfƂ&-EmFi) |k"Z Շ0̟Ip.>5Ȳ(:aK*:x?6*TCm^:;-)Da_t 㬚"||ix}[vg <{Clt?O=“O,f7l5tm/TB *TxPP"F‰Cawez sωs yoH 7mhl$&9TONBs͗Ō((pE/H#'ݖ1'}1@\'tΑFFoo#ӠoCCgb}Q} d Z8%Io2Zcbdl$>VKiO5˜1̝?VF>ĤʨaG#]s3McS4ƮmoUPB ^X *RsgDAV,.q)zN9{lCB|Fu%bb HĆaEg4X d1Q$d+CN4IJf!`ff3Gfn6 uUҗ BRå$uTq 6Թ@}(UUEk5 B3Dy\>.Ns DS BЭF#Q"2; 3qXY$RAXͼ|&6r&FY'^Q $V]gXW !bD9VY"dZp#{cB"jzؑy{)x #!SOJZJջ0u:(u#I븴 ^(%PB *<X=@D(:/ZȭbVUTR/h( 'E=$gb$[ }v41Ap-e[И'\LCVWnhȁBY@I8!>OIPtw3aC-̃(p wA~b`#k6^#]c&H̐H -~BWP54$h QT,nQ?[ עw7;8sK;{Z(0ldUCZs i0IKȯsW_@vT#8k[mR$''ѐ (?/*\aħ޲77;z cRRj ] +^Oht%4R愚8RYFReԌV B*G`F_B *TPؚ$FG4?#NҾXP L9q*(zHX$( }HQGXX[xy2'Hf[̳\^[8SQ&Z]9H#IH4-,W!bu8i ] zt7yϵ#IIb $"ۘF' 1c"o|F­DxqH*ތ VH)XJPe$h'[r*jZcUL_D,n34<]-e2#$d~Q~XGE+Hsxk`s1gb,c> \2π(.5b8>8Zi ]] t3jd/FdLO7czHx+TPB /)ŤȎ|8%EQt9~œ)kAAc\%j0OBh⥀m  Bۜ'O2ZB6lGH_29"dEIR ψ.sIBZKꪳtC 5iW]PKS굄FNOOQ#iݠHYNHӔ%ᄰt$> wcnSV4ky"&br*TPB)*:E$լŅG‡$D2Ǫmxq)5]ò RDF؋'@$c$"\j`p"  E,Pg]FbRˉXȓ -jnf<4H Q$!P iw 3rV&ʎ4M7uz{mՠU^3 IH_v]f\,b XpxO#ŪPQ'Dk z,[lĐEZL>?yCc(0,ܞAA6Ep&J|VUb/VwSYVQ*JŪ(WxY&6nƍ(  *TP* hH1򣀑X[+D!*Q&zG$]ZXyB!-6(8!9lAqj=,-6L)X稒ۡ h'䕅-h,0 !MA8NoItFm0O;hZB`-I-նKճiJ+FWWn]nHi44)i=!MϜ8D Xr<$i*(Mʟ`'+a{l ~yj5H" եdry!6! )+hNl%lqP(1yc .lӪ&@E+ @fPwE_̒ŋs3gr3rԨt *4uw[=KźXEB!gUZs'}>#T#)K*DU'\P'W+G7$K'/'Lz FK'Ͽ噍Â$FGKZ)J1&CM[VFt$I7jFhntۚ5e$X{]0&&TP(o #9-`ۖI>hIq.+.!>b_gx(Mwqo(q1 @.Jd!mH4¾j"*T O<~Ǵi3fLpB<@.2FUPK^Om(E8LjuJ"*BދK] %?Dmo踕 2Q!. eX$șTIJɞQovNAɵ%Ȃë "D&Z-^hlf n0\ę|$j$Zz#VOiRj4q"__HQ- ÃD(Ũ *Mu:<5]OX~؏ZXcZoa&.(8l[qy0 yRŞ+`$*qmhKI]BE+TPuK.功z_}|A}ݼ]z0X˫6!'ֺ17cOh1n#wCE+TP,4j5h "}ќyY\}5L81Y!t1|bN}.Ƭ9w;C6}nAYȪ~kzWZ~ Ck{g17p=m3;PU.B|i>Oӓw}yO)K [W:;{$9p/6dУ$)'-1B<V5Š~b% sUcKG9i҆vae /E>rcmC{Bo "$Γ^Zj)Yz[֛Kqɶb#Ijs$ImBo[VHz-K1]t2ͳQT,o'e"5]l=6v~KB'8L6Ql0? vAnk;)/p Cf -+GE+TPB3yk8ɲ￟^z)?,tf1:p-Rpq{شȽ`{kFUPW_ϜCoo/sΥ0fտ%Gv( Ƿa/x$XGPl|rSE$uT/IH` G_'FDZJnF9X<9HN_p1^i1\|02R.`ྲྀԻhiͭR+BJMq:r9!s 'lK(,2}S-9::gC <5kw(yb$,1n|PkcSJ~U$^XANAm2J(K_Rk2%g;+.-k$qhW X\`j!oP+ 62ȺbZWWOE+TPfBUncnja 6gem,nv\jiʇ<뮿[Ϝ7qlp7L:=뮳;cף=dx IDAT7̡ۛ 7VӦ)ޫ@' iİThE$_9{i3J 5511?DL#bP9b(!DlO#. ΥDiybDL_apwb"MGs|$]jQ$&ڠC $P*B{"ɫGs,^#8j'9G;,LjYP @J$v=/I"^gJaЈ]e ‰鷤+2e J^XsXوR>qXIʾEcE(ę!sKmA!br ,NW\B ^8i fx"m%oܾwϐr>Wq߿_p9_z9ܶ4ktһSO䤷oDr s73cڛko\% p~pwr}[r㦟g}//b8_}u`%z8{7o^5?J;I}8+Սq{?Vo=?g\΍cls@Yv|§y×/iq '5o&q~r;_?:9T~tǭsU?wsX̥_?0^8lVvv4ܽVCQѣ ǸqX8y ~G>aN16ڈ;3lPUF[ܓ tbE"y]!ڜ;OD1x- +նEpQs2`[VFA>l.rvH0_dDAXɐG$\Va`d9A!MzШ'uzFNWW:uu]]&Sh4R$ ΁sϐ쀢WYN:YeV0fsHJJV䕤eJ8\(Z~N Җ}ڨr *1k,jf?y3gvH3veh{dڄim v77?:屜rT+< 1;^bي4z挩'Yws\w3m|wCw+y8d>uLI.!}= =H>oy kNہ&t&ݬö3)v@mz N"MG.a1{4"7oxME6My bu㐝ע;1z~{I$,:q/yL/o{'kYvǧ LyyQ M}}/ߘq\}5 > Q]ytuu$ sn5"«McW{7//p_r < _<?:L~{&ǯιp($\^^*<^2GY{2 ]Ec`!Np& *x!  8@C\}5^j;rऀJzbB2$\-6e iXte։ƞ] q$$ DJ+[յZHZPOR%6g%$h|x 3{!C;$/]8y `=/(|ɭ-Az5PRZLΡ.D HiO韊 PUZiW/b=pC~g|<ߋjan>͜5l~|ԖԥӿB ^\| 7AG|A~r Z,ch]<&ֈ>I&a\Џ2Șsy\G*+C'1z|E\nDG<=o ow Wo#˿ eJ"I,@K;'~>Jg LX0o!LZIqd8YY8w>}dYFk(ae!/ۑVlG:DMLa)S7>W^y%߾b>t9&MD_,][/w12Rs h$sg3u-b b=UށH2؛"T$2=_r i]{ ^ͩ%8zOm%˓j( ^cNis#mdPPHQɓb 7Olӈ9g)C_k82m.`!ҡ{y[ƎbC7nƈ; ]0VwJ~@a1ԧåg5\K dz^{qg0앴X]8%K$lǏg7+SfNVNUC ~Abe>xj^ƅ@HP/_,Uն axFG s,f?[Don(ƜKvEa8ZHCŜ|uB3R< irZ 9QB,8wZ_rvtõ,v0v;#ˢEIgqy1pwv 6 VX4!P#Ѣ)$5AhѴR,֏6n? !J6x#P/]vswt_yfH9MkٯL(nW^ w?U }3~r7?>v|1rwmA|Xږ {?-Kyʋ oޮ;|h#&MbcƑnn^4Xs0o7cd?g~K UΥlϭj6'WSr]w1|cuH=wftƌ˭ @I rۃ*@$mƆZo_;H*؞Ud[l8LT;Ŷ}Dp,a؈_a+%]XH)NegoP'_K+6W@5؀pY \5 !D>kcon|̲4zG(z_yiMȘBF}i =v  z,lP?-i[/)jSf#wʡ+6![XJQ9n8m:e72#cW'q93grk7w=ˎٖE{2ӳſ၅-Vߊ=|h絭QqE3̓h6 rԋ'H?_5NF1f=9ۺbJ-?~ <e{+VAW\h:/<+/>;ZùBĵ7c3xX.@2;i{3O'qGqD3蘼q|/_&g˫I9>p8a$ؖ7c[:[TxlYdl/p5BWּ-9wSx9gqqA[p$?]2k,[+;Cs0jǏ#/ƲcaqqŮumZvzC~ &OsO{!|M:+4xG?bY_zM6ޘ:W\W^QGWoO=4g}6LtS[oN16h#6hNo{guV*@fؼH`i*D̫.TMVĈƇ0w`jNA] (Y+W-đCZH*۔h-*_/АFKHo^&+)!#jfE ++FCe0H &79{AP߉G8罯ԚfrHUy;g]Uރ+*?|ߩo~q7&7rx!ۮ?w)=g>2\ŝJ'+F_؍3&O>7N^AgϹ^`Mc8췁OC%{~$o2$~$pm;sEgvG6xP|]t}68ef~h9V܉/\z6ܠ㓾˟aO&ؽͯ9=/&;_f/QniKO-ZoZc7ّ8?gpf7_Y&Nّ~-z9l)+\Qa{KGemGbGv'xmޚێ1ctzxbn6N&OϤl.$⾥=1Pp .PaQORbv]g[3E u'S)lSdx!QͰҐo%4غ-SG?#9ٖ:Q9ey=_?f-AƏZ18%IVPz/Hо N{:;!ۏ'h˚A)Q5ugG{ 6vnƮsy{ Dv%FlJ- nݎ /$vHvҥ,Y5\?suYStXtȼխ@þ.ϷFR=(d@7БUH97٥*K/ea&NTHWˢGR/h2q2IS>1vmj[ĶW0]n7'gǖzQ /kf9dAF?=3t?u_y5m$yuιY*8,L6d6O۷};~i&L^ŲksLBOg PT8˟ t \v׵:Sr<ǾeB\~<58I&uH̡U|6G^KܭrRʾAXpBOL3#B05U_תF. v e1јB4܍P s-ȣ@,=`TIOAC^*c\KD-LTWa% Zj,(%J-@3K27'{bȊ<&-RvL<>e * s.L0v- 29+*/%*1~|asi4<9wu(ݜ߱ B s@F2~|OEY386yꩅ0F0vt‚y Q ϲHe$t{ۄZuT,SE],)#||H=o~} 3nyjSaGfú$}vzA1mWGu?`kzL3[8ww v&Wo51ZP"L]g|wuWxE`w:DczV{»,VpakgjC Yz׈z^!rRTM"[ckO_L$Y:c=3ODpLAI!*FHzTm0hNGK6<֠>(_:- fPHm/5 Y{ X!5d`/+ d :=|0=9©-䁶{-qY1Ԡ3j(9/7={uf6^/F@tȮ W;]!+ 3#rp}LnY\8%%SY¨1#0 [!j=| }v%"|h -.e5a7lwfx.B|0Z} ƶ7̓fsN$8'#F1fC4ُ!XƗNk)0tepg?qINaP *Tʃ8#& x3U|N@%'c`',4J C A : H 1 gpޡjq(z%EP Kehj5B'HrctRh8jr7" e~<{O8 ڲ'?D4Zn'eG%TXP ea# yt)VYW5 7R}"LnE&p ? r۱4%0~9 IDATv ۺFaTrBգ`N88~uF Fy*N(i8L(JIXrb"t K!X U;H5 G@ACz"vItXoc؝>1J$s7X@HGqvޑ ТH ADP JR0 S1 E=N9xz愈Q 9,lx~T̼+PS'V'T>7f̅d(@aΪᒅ,)PҨa>~K9],]4y<|v<6F4RD)RHx럃(H8Ałxzt(82EXr)5!2^JmII8\9H+ XˊU&Ho2"߄ &vlܟ'80A4vJ9X!k⦄6 Aiv%ت֙ uvz^w.d$RNL&˂7۱6EV|!;KM`%oz1 Ҹ@fZf_t]{ϼܻmN zy dMg*HCz5ZENtԞWݜU)|X)RH#,dk@@F)Q 6&ؗd]0MB7(!ZQhqu9JTX$s>; Xu(%zӲ)LXx6#Q$*)"VdkB4m$-`j+綨=k//zGQ%NNN=H|h @P,1Q/fvEp Q=UBTBTh12) ?#@"u""("h~lMiDy}WoQBa % ̫~OW֩Z~H"E %T! !QJ[-EM=: "6%uQdCl/\ub^MI%$$nq^h)*Mյq(*V7G QD7V#f FMiL2#EZj$y}NV ݙ$rjx#&|[Y?qB>Mbo}#8 ~ lOŻm|d׋!Iȉ89sHٶk4=DAMU,)=6Vx}Hr}H@ֽ !A.6$S-c)nu#^SH"E}6j@Y5"e.;T#?j*ȉ쎈#]77fjz G]7l$<\e\}'E.hdcF5%'HjwHqk߇o0_Ec4~T]z-v$9zJb]r[ Tuଂ=YnW4Hb{(PV-FJSH"E)RlkֈDDZQ,"3Ǝ B4jʽ./DLs:\V0+j-Ghsß ;}* n,u>WupACmau%Xm,O>r*EYLu_N#?r%$UQ`\~}]f#N;l@[g*eMN֗P3s"#ށDOh/rѨ-E/ޒsDCEA5D4@BH֏l6d_ٔ)RH"E.܈Zp/ V9tTˀM *}D@z\uM;y > N)qz\P"S%.OڳcMv}itT0'iƮT[UkEr BAH1 B $Eby1٨-\Jh -wt#+cøw IX-۵wH\{ F#[v$D4!|u)ngD֢X?K Cr5] 6I)RH⿆ѴIJ4٭qc^u{b)Rl {FӎJ61xMZT*bg&}q'WD;ljF' KWk8}BߦGx*f09a%߸H#)RH;1b; փzk9z~Pnmz#w߉#}#aϏe@Agȧ[uz;FŢ8a(t8K \>C4p`#B2EUoO1i32\`QU'g h2F<^͜)g[Fj61fDNWKH ⢷..JVT_3z4a[%Ғ};)pp~}6>%boRsrՎ|< 4Ee\Gkɛj=_H% J2ڊqQ_-%c;hHz&뷩!%)RH?.穳2fZԢAN8`F KhU|ꋬv-٪Рal܄&)6"!=A@Ua fd\Yfl E)"=^ GfTR5R#~c_jp.]AB#La`BUt_1\4KP4"~H # \jW:l`Ɨ$䜓jN x{T ty- Q^VIA!4dnZβׯvõU8ETGt( }z2K8S8 X#N=Q@ӡjuP犷qb7\BɰJꙎϨ o(H"gy&^{-_g 0r cXK2U+kbҙcxx 9]Uc | 6imڲӿ_ =wb!X;n۝]S2QHzqYpF c`߾HF!B{s֣ϋνJ 7g}œ|=uU<9rzː?3L OPȪXbd#@W;n-7F \-k67}&aD">KUcE?ϴ|;e9Z=̉ v11!(V#j[9O>&,$o9!{'OGEM\_jk{`#t Gu8DHGì,XԢ U\5F?> Ac3!Y"b8boEPGi{?}jo?QuQM (CuQ5fEc7:6l"E);pI'1cq1yAٳ9ß=-%BN1ޚI;eg]gx~\k6s3Vfs6pU|"؞B@ìX0k4\_iwԔǹve3xx?:ws7r߇ZF3}3Lyd}g9?fo{qɽO3^8q{y[sԕDZcV}?yc9U^΀"F'au5#٥Q.xKG?t=?7o?cC?DU/=G;]#/̋pyRS2qpk][Um7~sy)P;O3x0fΞ^OO{p#S grT$̦Hq`k Ч^ˆ^w^M=MlXa 0,=)"8)q0{_&#P@br~ٌ4I7 4Oy%R &S}3M޾d[BNr$Tۄ4E\#1wpΑ:(`7#V7.#-}wٳYBBɐɬgsm}"AYb_߆:j7͉÷bS/k@٣%"j3c+o"Յa4c^0핏t qQ L^D#kՎW_ˬSי܍ n]c)RPqٮas Ud0*a!LRjː1?˗Ȟ`{ {AC<<Q1}5cE f߹~M]hN#5[Vxn A<{跜;Qb|A_u~Փ#j6'/`dNdqN]d^>X^FnY֑1#ߊ-U-"ǖnuQUChIΦEgSHwyq嗳~!"4nԈSϞ9iR]# U,^Z% ( hE6N ӴQ%-)Cd鱿pw=RKֈ?K`H@VFNۻW0DYx.=. BZJh wz;Sn/uYx 4nBHPܴ)$F@PJ@&ѷRO9h 7(ݬ5uL.e+  Ҹ$w&ލ3L7Bihk!x 8QlXbI 65tES]%uzߑ-sɃ_K!8^A8"MsEzHVCm;Q^)^g!s0} 'Z4v'V"^\|Ap]+"qJZ*X\ݷ^lvcBSJt(>"UcrHZfI̍(H"Adra3f`ߡC2дiSf~#tɫ<;=c+3QZVA'^Å[OEϢPϹqWweLvmW@05XVi`EW7KdFI2%4l؄?Y= 1N&:1Pf[.Ť?1'x; J 06jNb#B/P08!$h *į322^{h 'DMOx}xdehTFQ7ۋ ǧc>ٚ!!UGuv>@5o%@v!ڙ?V UkPRqpF{ޜ-ENE $e5"j~ }pܙH>jyx;~]Aj+"ꯅ=E@%Wusc*!\PO<4J~!nN?>/ IDAT0MHh9hbvM^}Joq)Rݣk׮1q"3n0Q,qxNأA~ڳo{?-p%_O(ˮEYBZ,Ǐ>f Ʒ'ny< llfżr| |҄D;/˗_$tuФi u5 {aOp ?RBł7l9hG!?G֪滧bzu9lޟ Ә[!d2څ_B?ZaAż8^_0dS Y-ԕ'`wTG -=z6UWCu>W;7k?[\:Eǿ5b:/;MYS};tqLkH|=ACi;\9skPgQHBՖˡWI,TO]~wYN5gu6.҈r)Roeں;yy:GvE֡ugvs ڙB!]F\70A,(Po>pZ7~f9cʧh?~_1!cn؃q]uٞO`QHcI7sñLp\ޮQ4}{(؎CFl%a58֮ڂ^bؠ|A m@?W/#[%;x%W&tzbp,RztnGlWPy-, (j j:4O|]︎k'?ʒWw3v@Sr=ٓGn?f LH{;/K0KVd*id W"!2H`E0,6v+K'6*AR&ÏObc"w]#!%^U/NP#dQVi(';u=V"j,Ņ<M@đs'ꈾ4n_Y^9S,Kҭ |;(q_Qw9%8dO]EgԸu  .(U?GO>5n |XS_-۞a̓Yהo=?nm=V<1;dXǐ mnVq5Xvx K 4Ȝ̊$n{T0I/R' vD}KLs~+N79'n/59?4$'}v@բ;̙xN!ycC"GDm+ޝsաi(||޼xZ *u>l++lb7>/`;>8DMRH"8 ///<d^)Rllc0 364?@w.lYщѹ dMޞ71W $PCpKE$Cn[*{պx'M%JA vHMsVme+qK}@qP# F$[߸>SHEmt'g:®BnТn1/q%8zU@QtgU ͤI# 0kIuEZ]HJMj.L^MѭT /CUk-@4m(qnHǭR 9CByQT3q A|4"E)Rl2 iCH;D!կ3yؘZAѳL#T b̯LlvGDj"zp{~xޝWIͷQ8S>ldɥ`wXFh\~t)<>oed/|б\y6l6]N=O‰~B=lI f>>ϗjڭ(+{Oߜ`YPQ@~};+m -狧p]je@I1?[ƄFU3 N7/78`ǞcOM/ܑ{VK˩U.EV,۞gXk~>\2r[:5rXyg5i1ۜKnVi `/晿_aaE-;s}Z3N:]hNn.SA流LJKY:rڅϯhMX !,'e!dOŗ}׬X p4ۂԈ(|S{z3߄ɗ=_U{Gs˞ )wMSD i[.:eK:ƽv.7VR^; М|3g_-Ds;|OkWPO]K]~ 2҈r5Tލ2`@?z=ݕ]/|rlʇ-TSQ=+E)Rh1~V :N)f$)P5G ''f7VgG> c__R`'msp#~;;cSqy韁YD+y~lM7vGvx']03WlH CXR)RHiG|lVf?c )"6OVK-&`z%"lSG 6=߁}_E0uv )~kzugA.5u2ߤ#~\:?h m]S>hPonW@@@mw]W䟨p=1uNZJRg?%nܡ]Fg9 c}}ʃf84͇]8TUVۑн ڲ"Dc¶k#wMV3oq%{2smJmIaBl^l]z]k0Y= hCOm )a>frR ю{[jN`z gFdܚ{llUKó/;нAA-:+CY<^>ڳ|T]ԩs{i"W>9W%}JȬ 2d$v4̒ ^bWpǜ{&[)RHC$+@6-~\EG.ӥA질ږŞi$#YjץNKW(@|.S>\Xr +%4A%C^ 5ﯫ(xIu'!MX6,& Hlv&#}V`Q?v??mJHEP~m%|;9|?ȔжUH,*ǵX)$YAe/ԅUE]YdϦGt >V `kpQy J@&TfC5,]ULEեq]Z&@6lleU1a̰@UE@(4lhE@!SzdBfj(}c{"(ԥY,-[ӿj2~ݚ}ZIҗeTB|)6'0D+C$\ˢYJ"JMjlv5=fX;F7#lv ; e,X/AtE`M4+AA,* .'ʢWoƉן3=uO"y'Gm^^Uä=vإy[!%)~2Ө-;t|?':Vyr?{$^bZ8ߖTu%,cxq+N.oAoG:!?*?&3yrr;g`,aQuQXԀrys$|Y;ckt˟MZRg~3-oӶ'yd-2eT6gۃavA5uL8,is._8N)RH71Vww)[d:G?Dl8mb AVxi! ] i]zt,.;g:sמ%gB^znOqI͎@ئ ԢQV5b26.N핌#6%t_ YmtHv'|QxFw{_s!.ۣhHwvJ3*ϡgKdzwIi/EPg%ߎÿf/ez+x^^Nپ7"56Mg{ fݝT0?TDN;Y: jOq1mQ̌G-n8<~)GFJ bYSC) Ȯ3L"ņ" 9rܪ:uQe @B^a$"Y;s#1I `$AsK\]zӣ޾Mt਎2ҹaO{ʉxGPQof-Vb~_9 UC,ߨ>7@4fmʧ?EU1y54ܘ9KjS<~5e6ߚ'1Yt:mj;ٙtjڊ{rzWvljf-(K:9V-[ͪ:lݦBok BvLD.B*6öڑ- W΃vtW2p)ˎҤwWv4릴M',v1-Һ0nŨ:ESAZ0dbN-ߪ'խ`֣x:ۉ+{onIs+ض(RUΒb+Zg^G "3J;WCv}ϸ&TSq|;Dw1\iyMҿ3Zug+3kq[-H1dtt>-k^94c|Oآ9Ey)VRii աe4ޠ7BJS ..&XUP 'gq;Jkem碗>bRgל®ҩj $CP'iXT UYU) :/~/EZ[ʰ^wp9Hu`UPjF>(?lwӞmFH _Su<ڥ*~=:4ճS)R2b-|GWAĢɡ PE7M1uw(9Wk܏;J(ڵ7#_~n^|n߃;|ˆQ{]V`c,U0ާW?DZBUv>h[o  *~1 "@\5q<^V|tچ?_ٔj"Ȋ{v&6GϘ/p73oPҩ#AbЙ!3fa7C̔]؂6HAUE;qՅwq,:j0'me T#"%ދ^,NF4nG »qwj%n}v;ԶΦ%qQ?JYS=?.[ᑯPl[>vA9?s%לBjۜFfHLvHreeRYQ9M O (mR5_.a-Pb}5Ȑ,UU.Y}7LGdgāΦʉtRiC6B& W@VAq+>,-[P3<O>X=\܋4pNjة R"EOв^--ᾙٲO5a=@r#L'ل>k/K dZ= GG{;}㽽1w9ū+a1<kiI< IDAT 0ho4#h ҄Pop,1a!_@νv֏;L k;mdˎx AtNv.:2Y 3h73bwפV֌~ 4tQϺ8c9 @b6}P jG|yG'^r@Zp?OsT#x0/v 7I$bwƠpԄzΤ]w ‘+HyEP:nJ5@>ܝIv>$n P{Of @ts}t)[{YjCpkz=v}Gklw ě6hԒcF1u} z d;0L&n.mDl\)R(糏DBŋ%g.O7`,G&[v-[j_6!s_ߥ*\Cٚm{07j[~3Š_ڻD߳uaRt&jh;Vv96:/4sbz_dv81ՄyhT%!xYOP@d>]6$wSl 厷KOi?+E'P<{{hOF;m*3b [I$xn@iԓnNz0#Jx2kD!.|O.SDhr KGG2 ="S@'1I4vEP"O@=AIjى(8"hG: ׉;y$ d +nt ϝ\4=FjcĎq[GV"GuO0=Ijav$z-iu@*t~NGu{?:m@_2DOāS!ɚ69Nw"cu9cT{SJւ@WJM@iVYB G9F!$$I"B$2$[A&AsnR  ~W2E X8{s0F˒E YF0H"B'kgC`d 0Nօ[b 6m"/KDNJ9Wkk34n~/+ 4gQK ׎j.Oܾ.* y*bbl=Q >QN$̏T2 8+DO=bqŝOZ5^<9QrFsM~o+䙱[{ @=0q\#YH@tBſ#Hr)R R|9xWpeHC~'dOψ;Q.;O傿COfν+8J{n&_g׉Za]rWb)0%DTGlI q`ݢ0pdrɟTj's2y(?ɈHLsٚԞRdذMv#Vu pj .~.CxGqp"A}Oq.RoF|0 N C{ AH`!FDϾlY !d!{u=vATN`U UٺFb {Ē$Ɏ*hۯClJQT@::E)wUb =v 7=J s*A^wl_HYɌ`.9E9b"a ytoZr(/~gt?+Tߘo򥋩R6߂^Bd4|K~6{mo^P1KXϲ)t6(aZQ])QN"E?3@;vvwk/#f1S.>t~{fV"'NJċ9,߆)J.BS<kGTHk4lܔKXp"يrxaۯBUEQ&[AGDaَB6" hXoDjO"͑dصELtg'q$Q#J#SɂX+%g "}k@"(o@Z!G+ Y,g'Cl#wQ_5e02:%'ĄC -an|֘@vSJ3бB_/Di߳m>!5c%׫O&֧n}B1 tT^)ؖ>3@^`ica /IN2򢾀Qbkχp$m5gE0y9$XI[?d#8l+&A,ؚlTqbhDʔhl-8=D|NdL\dQ+)g%^:`8ΦZLo$@Z4ʒm GAv9r-p}.N-V@L8E)R&+ )zߡ*!x["~*Ԥ^tx.Qڷ*o33xaH>u('4Wrg"@x!3'~fGwo ix.T {giK§GW3 \zőԜ<;E6әx5,.)F\rexʑ|κ).xb]8=U^.^7'p=psy1|<7>#9oZ_[' F=UwevXJ^{&p1wqiͽq3Oqm0Fn U-qr'kxeHqQ~C< y_ 8ݐwŔH#rkla.a.\kȎ^+ػ`a1{8T_u?s㎉B=Ƹk^Q1G9&dV w?ι݄yel'e|o.YFٞ9w^֣b颅5V#)(#簓ϡv|*%KsIgѣ>,Yċ=@=rYګ?N#q=unFy6Y7F.Խ bE%JWk[o Q^ռ:9Uvm ^3JK$)s6 4r#zhzmۯ]ٜg*; < CPž\O 1f$u`(h(j戝ЙmEEW1yƕS'`Z0۽ *HAdpt- 'z";,v'tUl&G !-:svzf-ujN )QN %)+/fWXĢU)RD X[E6+4Ln"RͿ߮+-W SFw,U%2|Ӗ=ΦP nRJ 5;@V)RM*~Mheo=ϴMwT+PIwކ_yL9=lD ukP`7p Ljkv?+PtkSVyBFl Z助2x֡E$/0U63x d9vT6UiYZKuhAjovkߐLwF,ZBT0 uB2Zӽώ,~e8lڛ=lE Ez~s棈"9Ly -RPDqXp;h zЄ5S(Os%9{4 #6Pz.ٌGɪl0}wiBQ[ WaLywͨVXDq}PBVd nl]s~>7dNdR0g;% A NĽnSf- ϩӠ!mG4lܔVnO8ۯ]\eKpU#xwHf/~njj!Fv]Q x8Y܍ҼbPG-If,A |݌|y9^{;s'fلOru .PYsut}=1o P%`7ozMAp=߲Lcl:ׄ:SP#h9d0\H$DԈ?P 4$pB>H(7(axiSPbe~ys.3B$ň-n.oOVߖa9U4_\.-`J %+Qǯ9D U}CNg9,Z}IB::Fp8:qvN޶9OѳkuکntYАl5*>C+eCgsp~i{9q!x냊9Or1L!lͯ[O?Ŝ+)j]J^oQn;닠1]u-Ow]ygCw_<|W-ᒅ,ވjk+fzѤ |"nC#UBl!^.byԩuSC*,|~׏G\&츒lui Jp1Jи~vi@ݺZRR ,pφؤ}mG~cCS8R6ս C{G<\Ȓ˘z`>̖V*T4V2dl"gwiJ,f+WخԤQzy\erߧ]r.@tJN9^!Ac,]-iRx RQgU./|]\=dpvVεs-C&P*+?u4׾Sz5N#w/_4^>jթG(F9YUjҫ]z#`r0 ߤek/*UoHknh+a(\9鹰^X#9Lڲ{GO˻ϘUO)_Ș޽h^=Cᢩ}[T;p^Uo>?AaGx~}x-3c;!h~"q3-UydՔ%cg^m~rfT!kpXkK'"C`_16 t֥E2fs)J>eӱ۾HnMT+=<1o(ȡ]R*=B=^W\I!ISRK+O݊j4ӡy3ΰlC ?.k$c7,w?1wg(2C'sMwҢg^Y<|ٙ?-էO@jSKV+kBt綞5#fݺ<(lr}c`dzoeۚ.SjRdG IDAT*=%ye/9VJ-sPf )Q'zy.mἋn{U{OgἹlҴE!!Q5YbkĚ_WڧW 5ji~@7ٶ+ A&8Xa{&k{O09_W6oImǖU@6#{֣JU;D;TքoAÂ]^ǖ$W~ʰ{{sϽG@CE+ꩴ|o177OQw % ~hUg^FoD'D=6B[WFCQWu 햨dܒݻvNط]1?;n6ȯ Qyp跐PvW8K5!"!JBLcP͞ ߸*E rf?=] S:7 nt;g?g<{nrt*J;{J{qo)-`Շ1eDdu'1xt֝]UЛYpҠ $saҧ sat>Oz;}D %osCٻg7:uIO/~o3?1ccA0ytq`eY5W@vS~٥ MPEvG=>~`<ӗeAK=ުIFP^jQG4b Ac6\O{{Ȯ{ _,,CQg kFP՗Lg kRܥ̺G'͠4tKfNcʵhyX?Զz"*[ڍU+Rh~ +ASΗ7kvI@qǞlb㡽&[.Y&FpY54 ÝM~rvur|htYՕ-$4zg`߉,cAbپ¤l"ZV.TBqZsH{S PΜGp}9s] `ӶsM+gΙ"W1?v4=7kH"(.~(ksoթIWʥ3z1ڣXϞPMW;c`Vi8ٟ`EpJ"jRgV7K HaSz0܄EJɴ;8yh(?ߎMल9ml}?qum{kt(c"JVTgSpeKa\jB&>&gهlEfdݱ%>G&!4c3D i=XvF|7իevm&_{;r XhN?jamgrῗ)[uG lI}*P5}:ec.`ݚ]w 'ing_H٭c#Y^PQzt9VgۣGrÑބ Ks="Zz9{N-{2'ҦF# =I o3ߧ3zԭ];IT?El~(z{@dj6cZ>r!O6'7ٗcFC8qiЇ_÷cM(*ŭrh߁ d/ϼ_ȗLl2c.Jp7ȿ-G.pԖQ^o.GadԪݜw귦W~7악jѝ[{3]sJW_;5ϓp]1*ޫ%m̦۵wnd(e{sw29\:*}|<151[L_\XC51XcKqO}y;ԈqMg~þ έiPUP{>Q.{q]ϫ篤Oxd1}Mf,8IP(SGهƳwV/K۸YfN>sD&㷓%,f;w?͔qdlݮ5d2 9Lf&lU\uɄa E>71'y:,Nӻz4%cg.4'yUQ-#̖ ˩(-cV-!"G6gA$]Hf%u6?NkA5d½z5؅&) GJSQ[a"V7ٔUsw6حh^MY1oI#J>xPp(XFԻȐYd0s)Cxf2paI]HN[7]P72$ꍤMEAZ')v;ӄhWn1Q/fgE@6l^lW=@MwljiW 7c.*W(YN8-4$loV SHAA!EA"+NϠb) p<5jeeeن 3fZjiÆ uÇF;'H4b7sGSጚ8X;nͬO>coEz|G,13hOw(cw3 <%%U7y9-NOW伪Sdy|y ޭ'}?[|8MhF u/$l+/_Uit>\Ni= M z6bfs T[~3/~Hb<=e[ViL~vG~I5B=_8eeCzs:1A C|=l]e,ϗO$xki֣\jbk A$LGr+-V\6Mx^}g  B(Ұ<z^s5SYd6炗(1Iͳ|Wfh'ܿHF= ]=}),$Bgצ$&Ql-WԱiUԅ^~j,/j>DQU >g' dՑ,d\9$D8V[ozy!ɨ2#EʉXz}R|S!w1rGwlz^D+]v|do?ӃVHm7Emc^/F3qwhϦw~WEy3n?FNZثud( 2qAh `ǍWC7{nPu(opى\|3 ѬF"dT:>)'l'"f+W&nU)64t̶;v"ş|ı3o4m:e{q寧dl@ztן2fN@4o^%;ѩl|N)AqΔ!\21羴(V9I[ѭ]SjWAEժnYuN᳹tj?ɀ-WyNTe\QJ d~$߫Klb-T - E5KYj )*~7OmѼ*fv+~)Cw=ņ7lsvj\4$?=q쑟#dwQDX5=p= t!0\ q_oҪRJPGP"S4P*۲jXF K{aP\z MqQ *]٤ p`=s&e>r 8Z (pK ո_Qknˬ;Kݿ *pg9d4ߡ=܃9Wk]y8ʁ,9;s_ա; ʘeuP:vݛ)[r#4)w^_)R- k[u-r9P^ns8#DYEb4().+# F`ۢIyҤD CmQ W'¡KD |bdߕY1ӔD'9Dē-jCED W?VjGP X'g&8IJ2j2♤(3O:NRjCXZ *Fm[TQڤtl0cA"$?,mrX[诏uA;OQTw>Ph)JP.C["%)RHk ~s08H"@˺U8mvnZ7@KCYZ]2@ Fj#ZV6AKhקƹnFmx}!c}8=--I}M6"62Q%`tũ3W6q3=+* CNϮŲ1A,ߕӘ X]y&&xBf:``pD3T%7?`sՐїv'%sC?]>0yj]|].Ub"O|)VaRiyCscm !jcDqnD9E)62ХYMvnZݼ|lG)R:lͲ~miU'^~z`ÙL Aqw8jv(}:Qz HKQ=̿+yFf4o[H632JM>0™<-Y(!> Dq7j7}o%өx2@Dӽ)R!nFk#H"Q_mufΆP͂dd˞XOd19^G!j;iumlE'':jF{Pz]~z"*6Ik4&qL 30*&QR}å+DJ əexcSzgFu%9%9s?p %V(cC71T$vFD_/N/g.ǝUILdUbӔyvF2@XN@)Y!6T; (H"E)RBS F|#^|H E#mb.Ts<ߧ8IΈ[GPT$["!UOLU {FU([%5",t$ stǙ6 &8gVވ}oHP'BGVWږz&jeM,ξ8\w`&Gfz WWx2D2̞ %]WITa$OCGtrV}@DK7eVoՌU1'8]mtߣi{IQCGX,r!<ENI >h| %fg)L4q=⎰Kػ%$KNڭ>܈ruJݶkD9Eln?|?Ynܷn|KN;'m4XWnܤH"g`*F. C%#ɶXAG(=/'1*.I$bu ̪ E$!ac<^:ʦXa9d%dpv8,j5[I1ʿ IDATjiĚ WFob*"H1:LL@|zcweYlv$*,0'C#_+mu6S7$?ծfOOC*O44Kʝ܋ٶㄢ:,*qc}B`3ȷ,Jl2*ώ"ƈU_2=iә<2ڤ epԹKYA XWh܄PDzrTEigCc1$DH۶M#B^Q՚L4r!JQKZ-VgQEɂsc1xSkzѫ&JrkH"E)؈1 SK|7v8`Da }R½]BdOm ?^_n{ ޜ Q5֥Dk`d5^uBB_ moC^&M6C…%1iɛ뚯Arq` |y?eΘ4FDy 2d2T߆>=[mיe}JCy{*Є$mn_/Vzױn▋bYBl ,^GwbAV;%eiv+zy.iOw ssXv86o^3>ۉ/lek\t!>K"E?@L@͠,pX0E.Gt3 $rq%E^z;ART׶q拏AIJP{ b>W(ZoW|PN$I Y*3Ye8_U0TXc*4C ͷH"t J]o3ێ j@DraTMR(恟 0E߄nq "&oAjbz8ܹ^NUb#=VF5WFF$g*8":71R::_•TdQ A[kTIi3Fj;θCL~ 9Ҧۮ^|1k܍n]v}͕t WI9eJďشK7:ҕfK?_QumiSs|G;Zd)=OxG.iG#.B,ycjp=$\sC,SﺄۖIoks?E wQ$Ç=Ic[p]YEE|A.}~^soNb޿`Ԥ%˜2ɻ%gxi8tP7xۇg)RHS\ضR|sImQfV8be(I1%"$x@>[Ոm3 'tXБ  JZ ?4b~Y'N-IYJPZ#mbD"hZodJRD$ px)r(3FgWczLņB+gia舶77*H(t88WB5NѸ`Zc>fNGh\9gkH@h)¨:-P]"F)JasZ#JP>&> ry5f\f?nw3숭(KD%2ZtUZwKL0(ՋKtҏ_vsnj@Zr1NcW؝C~n_+,b锱/} :N>Z:/[;a@"۷xLfL&Cvl͜Jʦm;m=Kɛ/f֧9U*-JMRD^\ރ!Gn&CC9zr&!&(Nأ1E iѸFt: dVU ٗ'wSH"şbD*[\^A־zjuv=V}$4w$ @}bߕ5ma%"jqϳ搸qkJD(&3SL<=gD8 XϢQy{᷽(UR%P#[}9m[KT& WX`uigo(H6fgs)sU)Flb{w>at٫t:WM{(K^yw ;KB(ؖ]:UY <<8.eo>\ԳH-jׂQ3kg<k*BPUV+jRJ9RE_C }M-5mQ*jDnrsZ{zӈƮS$[vH^)kg$&ڌr̆8X̖;vfb- Ox^-;b%RxxP\,/>NPcai[;ΥlzJ덷z*U :=2!(<\TG(rr?dGcLe@*TF.jbqŷ7Sk[Ͻ/oȗ.~w?Bsf߽}[gĈ,3z=vw7V~6"VF0-cЈ jjty  l~s<|Y3WLޘئ!CY%ݼ9mZxOA ~?U73p.QD+"2D2$0 ttԨ $BGxU(flKOr@ݷٳcU"HuEa7# I(x̫z[lHfe Vr7d*=kˋu@UL>S[y2 Į? I`Z?A J5m|?6·Nr}-UYH$vRHmQ/M8עf+~h;)=DŽnCM\y*>,%P Ŗ$P#(H$hhsQUZhP:K|jtuu]]twk\q\Q-좻@~{S:y3_ྋ&q*K<<5g8<ʵH6AzH3o㉩gS_YߊPV*z7VaّQa/ϼ[Np*nsֿx)3'xoج;g2OμE/N=~~]*4Ā`&cٴe:o-%49.q?W\7fjy\zO[n~S{C߮ߠxkyxmBW8+QDI1U` OGhT'R߽s'}B< _;!5Kj(YbHޜ {`ͻPrMA\ a$uMA4'O.^]/]ylK_=_v+_s!E9,GC㍮*ՠwpԐݸޓcW_dFcӂMu \ir9o,f}Q|c&na03e+GwtqQOJ ^eczael⬟W~saW8tUPaWg! _y,G~ ϽBm'SNCrvwmL8ɭaé;:`s8@N>Ht6 \-{&Gu-6٘ͤyX;6踔xg={6s/<|] Gs3|xZD%Y!Y{߱8ehd:jYq *h!_ՈSq{6+U9#{25ħvb_1ra]f̘!mmmJ+Ɍ3ʼyBK,˲lTա7t"}1ly"(q}Le[5_'ΗPgcSB㴥m}9Of3Z‹fM6N: c^xXc~VX뮻C%J(CUy'Vs.]MZZJjBʧ7%fqH_/ԉEEh+wF(Ir Ĕ)S`wj_l}.<+*-zxo?Sƾ7(P ^ď tW1 JD#ɫT|tH؅z A=ۚV[ Obɋagt󢠹мH4AtDT1&"1C~F{#T8/OdTYcIu+8M UbT}SW2Obl}bCUހA5ފHMk+YL](-jhO$%J(1FVRPTrRygӜmn>|WNiߡ~ ħ{׷a%i8p}zM˳(7̴ihoog!|v0m4V[uU݁ˋ.g!2*]n9vaV[uF" "dO٦b,C|JngW%LE,o@^k˶D 0jld#0uQlft5l0{(2U*J-֥qjۈf[ U1@OiDɩAUQ^Y"3mA",&9k|Ye|EhmT 7LODn59:b3# X?Q˦' ?&^ q&z05gl[fnCBAZoG`S]ʪ 늂f`L.$%J:Í%5*_vs!&MnN_'6[o5|d Y@7#ëO}~ &˿?n`Iۿr%>NyWa1`f̘AfϞvwwsӭ~]!̝7=]vaر`ro~1? K.dxGgE 8CwTQ="ၢb rOkP'WPdT :H⾑d(|<8W" q>P"qDgTgyJqviz]E Eݹ^U^MxV**hyb6i}QlGUHyF䏕ymfQ9!?M}q9wάxb0{5Jqj$Kcq1R]D݅\AKU[Xj56dh P,|NVxE=G=%J(Q#+.c9.F͐EACHEtdHGe Η*6]wf^E(mc+VjoT 1е eFD%>f2e cƌ/_d[{ͽSo} *C6eMt:Ց6첟8s~Q|f@T/=o{2 D^RXI~|qנϙ\x_O\w?\y,r_8Iןo~ϰ1cחҵL8>>99oQt?;dj2n89kV5G0N}b~vl{̦xosu1j(6pC%z~?q"Vy'X8hmmix`T:@F_{JV' s`K2rĈ)b:Ep2+-;[T$B$gڬĶ?ƐQpWDɬ\Q:c3` IDATI(k B_}}OtĶNͪ'>nYGdPT%QLW2ӐKwHݧ¡ l&ybӭQI76cϑǸ -% 2əxlP(0ebѩ)BbP8bWic*hص2?}ٵ󧀦>x ħ'_Y)vUĬs8p 8)fo6Əϣ>ZWQe[s7ta3 #y(\Fo2E=\1xP_*4ȠeB@ko19L=ngoZ7v=l#R@q\(gAF-ͨԼÑL֦eYaEQf1sPVWw!n_ą2MbZN8rw'ΏMFws_~ǣF"#抺iSFЬ?_{~[A0ECqio+ʧj#VR:ވ in񅢭Fj>ɨ8q|즂(cӗs`NI|Au\>p9<˪IW[Cl;/Sb|1&{=a>Zqoz]zo۷m%Jcѣ曹x8#c=qɓ''|vܱa3paCע/F*|م7xmF #Ya6Kp&ppȆ2 (Ni?;QyIݸu cذQ;GfE{ &3,5i6/bofNpb fYfVk$y܎8h"so4q=Xd?K)F .;KwwX{A\Di< ~oo}g Q12#!;H>7R{;#)&*!?'uEf.&UnMԲHw`|R*"F4wIHMdc|+bq!G۱TbLOdb=y_Ć9QTSS_ WuII1&o2oW76lcR4^C6'lgo(PIsqs)&vm(`*ILB7n0ŶyyOP#w"`~DkG'uQ"W> u6 ΰ)C,rW%JhCa|;ߡVg,rq! ̟sIcwLּ&;8sϪBhk/ό%G`ȧI޷hǧ =/wuŽx.:%z8mh̐xm]DƨόSSgЍ2۹W -&O< ׹󦩼fۭs/ouCds/2+@1n'`)n;LYCfK..f?KPU?o̘Aww7Ob9}^{$]w]_y뭷xgx>A *(6G`&Ua^{gW ἀZ#. !!ڈ?04} *,I@|j(ToI%~Ewݒ JVp!5s>VJW"N.FH2W FwjdUjj\PȂb(b$9ym\lm}l,-qcۻŖfVf@jv,2M/F+g7\ԟsH?Ip?kINɊA(}ryy]}gH{q[!ERHP";c|7byv8V,y eFD%>f6l^wRF+6+e:6w{$Һ$#_M?_i3mZYs1z:}}{^kB^ 8|tN>FV9wY界1lW=~WCw_Ͽ=/ͭ4l lٲ_:{|l/s҄78/&F|j}slAG#yyv0F j[~U`~a3/g^Ղ :#ݗNU"G_rv]?7xN[e1Y=O?UW_yhmiaUWeo}+3k|)ԍp xc >\3zF1V]eV]e 6'GE}^'aTz翁OA1&PB2EfB~SDBrq`KAo=u9uL]SiZrD0QYh'7qĘE1h(cH k없Ȃ4z() P.ncf=ڑH',`MRmiu:L8QO.3f̐6YidƌYKKKe޼yYy%hneY6@Uoyx(+Q⣅뭷kNJ|QbmBjOZͦlt//k=,-&I Ʉ].QO7il36?4PU~䯬r(]hMWgI-tSvQuB7j']Ĩ45y 7Uħ68R >/\$e>m:,&XڥrnNFe@4K5KM/K :1j N4u4:ncX Yw-.so khUUD_$YQo[{x3@M|XA]W."L1ד]~AIJۢgH/ЮCYZ$ ̢:+L2˳`CuJp/U{=0oʫh6lHf"hiOP1n]Ɖ,i !:ۻ,0`@ꪍ92<:p@9rZ:qB WTDCU PDw_r _y$|wK.YGEHVR)~$(/ӟzW_yz="YJz%OCuE]6@rdZpU@$!@`d"=*-U4MD F*hp?'!UG2,Tz[!ͤ} kβciՂելXh.FT/WHoէsgRc׶^ٹ/2뚋Xҹqk_zҹγh}7f?c=b`~~E?\BU;\ŽN!c܆mu%ֻR;~ vT(^(QÇ礓Nj,.QćLZ 4ڋQK}aYF&jbiA=|ED˕(u,)|#3n=PrPzNjX+*!bnɎYHl1r}W+Un S!cɹ#6vvIsDj}0L&Bx΋LXoRWegnD{u$+u$? ] y gܾ]~DPU"iV7/ThJe ""kC`Dt@IK(QD%>9bzhcG "ddbnGs ]j-j89oS\=J>2GdU/TB\V䍓ՎeKMOluHFAu +YT+P,V]CrPꎂ`۔Or~hRoL H\hLb}cֲh DNVܝ[[X,0X|U%ݠI?l#x{z/x3(qZ}I2$1 DѨS˻KS*馅M/H>+e.4ik DIK(QD%J|!ed&DVi$B{{&ۻX_d ߷ylnǂ Q3BH1ƌiVG }1{@Z[r,@|Id(THB$1C'̀j?kFR{,$괪TdYv_+$*|}(.ek# XBEacEV< FҊY5l 9qKb7Klg uMUbWOm} Yk0L} 4/_IJ/z&3: $mbqlwQBm:*8Ѿ?|VD%J(Q# |[Eq>=9-*4oD5B0,Bѓ .ܖ'#`NesNnG{s5v,`$Uilx;Yoht7,>^dEXmL% wJa"(WQhա=V] 5}2\Q.UD%JxG*2{ j"A$Csu{&,o_%f'c&Y qmU%J-S4D3gX#TQmH>6F[+[Jݕ,{qݶ> Ag&:G-V8jc؊^1X1tqQ];-"3"qиc'M^r AcE;hhyxiI5EߐO&/ϫ}rLa5qz7AV]+FZa$ܿFgHڌG.~UID Ƞ6 $b%Q.QD%J(E̮TȲfDs.FNFyP1qɧ Kk-E{L)DlW ؎t!1]`MHRd^V 841!fJ܉RI 3vcN޴ Hqi" t@,6M zҩ;bz'][?>j>FAwʝ5fmD<+~⯅bYzcHFjTnFIK(QD%J|!bQTlkկ76(MR9DHCIE]9&(L/DkW *EuQ<Ǝ#7H]"jإz|$Hh(A&Wgqa]~rroY|3%% آf гȡ|*_SQPW*K#bE/PL QP?ojrb:p ~#ȯ/UT a>c.>Cۗ8J(QD DRL"O]auD8Ea6@G>>J|87 5xv[ HSb+nxӨ"')YdQ3)1`ua5(o)O N𜰘)JGmud m#.^ՊQxnrd@M@PPV;5vd]8 zc[ݰ{m*m9뎸[^?1j1<]~^Q Mvy/ "6ݸZ{5ٌBT(iEqUYdQ55}֤3n !MdBm4t .ݷ#ay%>&3-}I(QD%JS؂^(in`Dŕ{d"$ۨ=اfI@$ɊRӲFq E@)fkOe(`][}(jzPn̓j=Y^zB<(tqZ4ŎCc秗v蕣\$=*zAڢf-J$duhxV_ iFyR׿+K6Vm.//Zzƪ%J(QD²WL5S*8QAou["\lɶ,-7 Փ>k 6_{^3Y˘E@@/p?Y!N]/K4@LQ͒NӈZFYI"dT3k 5T 14ۈՔ3-BAclBYoHBRH͡s̐n˵e6>jL &9ש~=D|)mo%>Zou˶@Y)Y 5D3lB0{N('dܽ"jԯPCЮЧDK/ëߞxP5VbAwQd,2,RU%J(QDRLViEr!FZD`N|\bS]s}W5S!q]V)c+4I/3FM+8w=1Vq?Db D*N1ƁS"A3H*;`+9K2e}uY)Xz8|7]N/@bFm#r[&n~oXlZz,O?~lިlϊ|ھ<[%hM+_x\D%??G}'Mj#c8w]? LZުT?#Nd͇㍟׃[%JL2_JS ddPA H`ВN"4r>74eP,҇8/YUڥ|S d"huOQ6 Daͼo' {-x;(WV[bX5X33ьJx9 D28-Jh LS0+JS)bSХ %qmƓ$~.Xb kqgH||~3CXQBfg~Q;crX4ع+)(Cއ1vnG Vmm RTV;hn`%Q.QD1;*3g\^{^w!mAT)Spԩ̚5%XV]o|T*MjJ+PU~yE<v!,ru?W^}5[ø]w{P4ԏtoӐ^-TȨmma]ҹ@~?h( Dn*GYm{eD,Y/])f =ZcI1D///*:\^ث JzmqZV hPET'¢[lepGzXCW{g':zoT@HDZ+8`:z(IȫO5t! e};D%>D[ a[sՕtVU~~l5f "[or :]#<#o&Og rPkϻ'Ekm+mXCӧsw租Ρ&lBetwwsӭ2U^19/uC?R#G֕Pe~DSK+DĞ@Da]-0(*,21K[lqTjPAų;-$iWU4 `QrW BMm f˞0@,&F=FG,.WR| N/l z?[A\DoU VI{8EmD ? Vx[85E G> /ς"!y1CRS2!+ jnl*l7l(ingiDB+5sT P%%Q.QD!n:3<ێ'xzݖSO=#866_$A,~ql%\7vx~ƌ<?sWwe5I7%{_2e ow]&8v0f=ˇ`Sҷe N'ʕ]ű{ر۲ߠ8q'͜wW~8ꚧרDaٌ1O.kN[[+ !V*7e67ElN[ħB"=vۍYfqWwSNa.0eʔkq0rFJe==ENfZҟf"tvV쪒H^LЎXǡeX~H'$}">vDWMD!'B LBP'vNCnE:swMQsQ(A6lG Tm<$eP ~+Ac}#~CgƵxŔ{gu~$C޾Pڸ;}rۅBۂ\:v{ź泀5mu|vq)>Fo%J(@¸kss 'pI'qwk60d@]}?9ml ivই"=>ǕGN`9kߵP?Xcd 2շ؀Z6dܞk007ggkP}[&[M!Vb6}ܴ9eZ@ZgUi{uӚO3 ڜ-Vbe!`6|]xUp2z#6[iMV݌ G?o.*3ﻉ?-v9Z°Mc_<% r/\c0C6ؚK-Lo#Gbosʩ.7hCKk+vݕ;#Gbu`eeK7r wO<ٳgs 'pq;H2n =0Jgg'ӞxOoQU45̖ܲ22lt,d[]̐F$&ou`TAC]sLN!D,IHɃ1PU#EZ\~@x'@mSpk:"Gjab_&iq3Iq]M_1c">UEĮfb,o%)KlP?YY}e;b<c,+OǦAck.K:MǸ~9٪uZѧyxLK>ꚛ6|JUDD~Ã+Ƹ/~[oMCh xsPVٔnd}<@W?KC7D 7dkkkcȠA*!C7&TUN>T&}]ﯳ:r-̘1_yO, CAFU}ʾuҜ Yms:Yz2$B ˉUfӎ}4f Br"*6/U\ $(\YE61M>#msDo 3%S+VL@Nwȱ#C2d†TĦW(gZ<[DuJz%TXek#GNI*AfB#5qT $|PMLUP&:n8=Hg]'Zkq/޸}Up'gsM?֔ב)b`}Pj jLOs?GWg믿"_IRG_~vuuV]D ZTV=>otvǏo^,)'aES#7*o7xmF #DžAL/=?^!@2ټݡKp EeÆb܉7pF=ɉY B7s^^i.IV}~4]u c(?}8(X{%Ũ(Q,Q Fc^b+&6l(qgfw߽C33|wfw+6ʽ [$u{},{:TV2x`^ +52j/X4|udW_e_͠A ud}36-< LxU-r*t+P&6)l `bh'YPOoYGؤbr tZَ$l2+QBi|n~@y^6]d~-$sWmK q2m# yuZH>1YҔ($"\,.}k&%|2F2Cd&S j*-s=,Uf͜kIEEJ)?˒B!ZkŬQlM{nxg88CJ>cǎeرz!grK,Y|=yco펝QG7vޚ]h>+ÝyMލks~߃qg^³3 PJ}⭷`MMn}QSkӚ0ཏgFSxҩFN$bajۯMȌ/'Of^{5-gy3gͷX-؂_yӧ3`u?X|P:@9R:uBPhQJ1w^CD'5)%OqF,-;B@]bX( ,YwqO̎OʊDCIЦӑ|ERa eECȸr6HI`DĢ̊N~PU c2m9hdߦj6lEl:H4kG0Qjm#OF]_SY(m7:" 2 U4k@d vHt3GFF!K'2DW̒rc I!eFʈKcuhdu(ܾߙAc6[„ږ+ӫeدDMRaie2Qnnn$X) ~ʽN*Tozó>ۮeӎKwFfAE5= dqǰ(qFb._:m-u'%G]i7\Υ Br5}3hϳ)>?/\__;CVמ;n3>3LMu%=؏=|Y `κ+:}."*^5½zSSO1gl֬qnqر=bD&еKp> w66ҫW/Ϣ\.3( ˲+SWW:|--:)%* GR,jn& XUbbM*ȖA { in;FI'߅qӃrӯu^}. … uE;曛 @ֺSc{Gxz[=yV|yvlp O۵m,ϔ z\WgP!!Q!aR,Or|ڃ!'iQqm?s;>zS2Mf_)V-kWqq!@ђmwZҹTtVY[Du?(ґ$-&"4*͸qR;m>[]̛7 F-ckrA@{eX)CC\ϝƼS;w*MDE4MH1\vVK]G0'(^dԹ0uć)"TiD$yMRx9ົ "qގ)Ձ)X&(nTS*Ii]$2R3u1˜T9'mT*B(26>Xڰ@r8X؁RQ6 W' 1'Ipq_Ac35z,۲t!.9 } 箴i Wg٧vmt}1.K|$:4!u}%_ MFnتgEB177k{ѤILMM޽Yoȑ# [鈲xJi1$v8,)Jg])APU]͕W^Ç/V$(Оqguvgڴi>a{[tĝ(<:G.'sS÷FaUv"صv2q6FI[/h=MވH#R~AT(a$W 7j[/ nL2VDRr,؝9ӢM/|I;G:T=RgYίԢ^٧OpTʏRm(e˗Wh$iXqQaŵXm;YnHw}q\1i/}o[[c׭#&+ݦHu*1D A)(rPAʙe#-.~i1tP0x{9>4bs3lѫu}ʅJrJ 457**lG)XcR{n?Y*hY@I0؎~dtW26c7 bNv>tR0|W 1R Tqpi KpunHɶc0s%.tKH8aҲj cwb@˵oQ&q"HȭPҖ^P(O[w\F}qRsʍ:ӳqŌks[JL_|q&}(-`Cdl}@ly"] :_u"_%w$uOP).cPx<ڹO @ޥ\H.ׁ@/Y+T\3c۷zDqVQȩE-1F~v]vr$"YȮ.%eLHpT IDAT`3:@[Q%mw!+8\HT,0M]vDDI>`G|SrK=AlaFAX(QDFc&2PAd*PA@T+9TG*PAAfa]J^455qc720Pt6}q(GG<C KS({<sZk <\J|`tΕ44,ZϧfZ_cI#ʠN( (7D"LN2ئqS%L!:DǹG GJ.A!e2@F ]3p#ƑRpHNDzz)GYw(k6q(m~@s1qBYĬ>N TCb mePH5~h#-o/ ]JC/nL{Kkk2 ,F;t<\*"jEEh*j\hLh`" :*@(ĪVOtEwcדǰu**Q\F%xx<%r,.-xnxS29r||Z*@i2Y7n];FTAtmRUDL9PYrnW;96*=i@5RBYVMn}XRYB\_ Uԕe\=mD*B5vv8פ۪ȜߒD%n rI%aH_|0R|RwWfrI}EK,!u֍lo2DFFf%DL# +~C#ǹE`JJ 1 sdQ|V^TB1HHlbQuy"BelԠ03<5FkA)!4Q#C9q,KcGMd(Lȕ+ڎGC>Hɑ0S @^5ʡtAJ(+ެhF%(%:G[yN$&{B>O׮]/Xpa:,w(H=)9ݫsK:HfB]D+Wѹ6/4b'FV0c$X DD`"jԴ/u] 5E Tdki˸ ؚXI2KY_l@,I+մ SLʉڴ@(zhʆBU7=NJH"t@uu6T sHcڶ7(Igi[ie9>\AIS*AS+i{ٖM+j]) 1nLR( \7zR6S T b(V 79ΡQ!,P/Tl>21+P(֕ėȖ"v 9tur ۴ ^ןc^S<3@{ ]rf:. Y)Γ7~'p&=~]ͭxi3#XEj"-[Ӯs9VQ!QE0 +p#y\WxPn>o8*D|<׵vZct@˓(:&BG:*0,l FX/(X脉 f+?Nt2}!`@\s:LDR)&C(E1Vx"qqʴNHJ\rס8ǶQD  ID((p-b9R2*[JM vD&i\ӡ~€*3`+Hg6KcC`nm$3Gg\AپA8L9@R5-RJ|GݓҀ&^\FRiȲ4 mmFke-R(.o '3'('8ω\u^OϤjY.ANΝxu1s > Ϧhn:}W5 @%}tN=ֽ֓DV%f[MzV LCQЮ7FQ1(%˴ui\1}9x<%ݙ;e]?.s[@\B 0\CssDdB#Z)+@{4֞Baa-BQl% c{7:Cub(Ƒ&20hܰ'A+0)Fste'˘qHp;B vd8TD&RĻ+nd&q r9%H|Mr nV픲q( 8FJ%B͕#qKP6Ʌ8OɀIYڮY) ǛKt;^_o%4JQa8r @ĥ숲F^bظdXvODp{ r-[H(Ϝ9TVVihh0BG(~ݛC'O?DrQ&ꉩTtqtSR? 9̞A|}3SL~!H=s)Ɖjnґxh>fN/Y(R4:!:Ƙs"٭;t92sTv;}s˴8vlNgK|XA^ +b# ưHUe=Scu@a;+b)0 O;VD(e[eHFu5Q$Gk"4Tclq%%kArWiETik( <(gQ[eVz-Ml^Uɔ'˽d+"TJbE)C I'EJhwL)qjgTJ~WP6N`p; 'd[v6JK_@+./Ibnζ1ƶ\PI> [cG1Ȯ\R &K]X!rt֦[]VЫ 8ꯙo=`K~vzN A8߰s<_ksSP=vsݩt ˚E(/1?;T9omF @ǟΈg.C=6Œ)~=3/. ȫ~':dzQT r˴HN _7'-];& raǓ%ʆ[w粤-at[ޖ{@.X +0:G<=6D7kDx`[k Ɛ0:7Q|T8/ȤAɦ@id⡭]Bٗ*~HݓAa,KBI*dnJb͙)'Km. L**(P@j0L^I)i@V4(xwℲ %rW)?? l%;+[sb`ܚ_KPo=C_~c4JzlI,<~HP΢wb/{ 69?_sPr0+%WR+ĵY#eo< :ܟSFAb]`??6 rSۖm8'?: sn倒=SQT]Ft{<`? R@vNg3##N4mv=Mk:B:ܭxJh-@Neύ(!O.DP2{O{7iv5u<ȧbSa fq %IDv V9a-qNH=Ie\-U+Qs|AEWNvH:Bwib 횵u(Ņz\+ .pH&6$D(+hڰ8I*x7qej]i$dAD&? 6v6/amBwx\,OK(O8~g[6#>~yOQ(vz/B+@Akfxu JIJ OoA@ZY,YF:eMPWcð1vZ' ɍ!eU5 #˄TyPtKB9MVl𤍖r]5I^9sJkEk:e<g!!-ҕn=\~<Ϗ%=w@2uvqDr=I(Ji" ec0Dn&k|T62uJ.( /LF]Avl JƦ3s񶲟LHPS%NrldcpS%J\AO E<X6xp>˦sL%i㸸eIK/ KB>7d3kA:4EriJZ%kO[iWdB444^ 8~(y@8M:QNs*V&tSdӴx<:8}i]!/PQY]Pڶl⶗=kq,.~iQV(9Ҍ9'2}3Tya\.,M&̆;{<O{(wP}wqŅy<O{޽Yoȑ#ˎ Yn9\skt|[r=ے=G&5xʝO+|[[_0dz|SUqޙ#ydtˮbҤIƚ L&>#:5ڢW GCV',hhxL]ɭДZ D_ɑ;ƿX u)%|7Gt hh׿O5\Q)Na{s᫭| )}ATRewx<YPJ0 Mss3ZoݫBݘ:^~uvqMn,'?ef ̧%p|ZvbpVeO}w痏]rJZ\v,x,85Ø#Fp'B:y_̷<q0rx<_Q mmvLX;5leZ ˑӊ5bIu2"Ӈ l%Pm7rIEtFf|9w^ &@}!tE+uDtizQg@üw+ɍ仯Ͼ8[tC<Ε?? ީ@UǹM_ǣo}Memqcʰp-W8rۜ(:_z'G7Oϟ8-D>J8p0o~HM{OthzKoD_ЛS)v\N0oI&n{Cf6UOڃ')'~*{˅E8o}ͼ85CF;9z;~ GpP(sqq7;;URf1 2eBb??n]>3bMJ/,z\Coɬ=Gq{+&>yTPoNdw޹<4 ʽ9슳7K?q_ЛǮ۞aۓ~Î}Z1k`\:g ߄.zOܗ7Z_}[nȤq4HP՛ <\%M`j.._/\5+R;ߕ'\ϰgrپJ}vGWQC{Ɲxo|#ܙ7-kB;Ş@nknOe&u}/{URxg'u|o80ʻ޿?#.}kq9s+ syR_y9< 9UWϐ_̍sejXu9ٱ#4M.//Nwb257'~n-{_91m{zx<]D=B`r&6}{ҘB_mC2cyec냏3yr{vncx'4ϻ[?[hÜw <6An]/Xb7ϼq"([θ=ƍにA?/$ӋO봳xn<~%x'\32j>N=tVM,mO(~xZWs똷e8}=&^Ϲ3WpS4F4_3!WM=x>3st^y?.g,cGHVۇ?_tVKN?mÒMpǕOkyo2>Yzu#=7ӗw oWUký8ynqzUB}I8F\t [Z;M+p53ONOfmr|jN~?=^{N[ y/w.}d1xҟ21oQ4Fe^? _㭊M|m/~͆ c.\ ߊ>S>[Qi{ll7~:=$ݴgIfCO\~Z|2x<Yhߠmi:jLP0MM2vh"(f[s91OV:@g;&Bu.:rD|7{y5GP *,YEm.@=;yv3@t/uCϑ3fm{l~ Λͼ萔TڍNv3=9U鞚6;s5@-`_wb2#iLuuuɦVZj\]& " 9Y&p!{qn %joB kXoVΞ{#otb Oq+)F5pqs2Vm8^8}z:Zx<oV1'N(Ţ pEaڏA^m)qpy=AoV1wRDlkz%.ˢWۙO඿M P,!gˣ;ufG|83ӎQoV4chϯlsf!:%OBsLՉ_.hMe5Xw%M2ws̞su!@7~?ҩ=zßNcɣ=Z:WL჏c0g%*& T6# ޟGp0nX=WeUki =TR:&63B,bc%4{MM&o'䩯"3_{ﻖf{nΏ}+mf>dMA<~mZVm%Cѩ ~ȗM"||g1SZ98>{cf5wb4 X=v[Y!:ИmgrY!ʦ{Ťx<)rB`***LuuСCUzDYkvh1j;vV*;nn>AQձ\1\zL*^lЫ SpG}նa$=v r5͢J߃Or`# TX܇?wϡk*my KH+;4&ugݹWbu;0޽X|+;ufA;;$XaE۬pkl1s}_3HC9\p/]al5 -TԱ;]\1^禑YBnɿݠVc浿DeN}&m$qƁؑe 7#Kd+.A中#ۻ9nz+?6XI J+g!jhEm54-*(*X?*T K89{͏̼ٽ61I{o~ͼyyğ2]]<|xGk0XN IlCnB>ɏ8x8qY\8^t5{<7 w}_x܁{_~dϧgWۮضoS<.|c ;t3'E=nxk/;t}KŸ#k]#pqqsx7Kš 0S{y;7[Zу?ƍ7?qd&-WQҿ/=vmѺ6_;KDDD*k9%i$IBcL}vEvf~~4MjlJ'y^aZkUJi.@2Fȑg7ob|=5tv_wk_/_ZgIB@+lТc9b#WvɺC?K[3h Y|3Xo!QA5%}V]fTVb(ݧx*(Y7tFl]eb2xr؝>oLj{Y{1oƮ/)k]T0ZO:u?ϣumn?whQJicZc $I7zbP hvqq^ە J)͂m)X'v>ۿq2Ջmow-dГ8||u.tDDDDDgKb1J)#4^*v~~|rhH. A`}7QYFkIRI8۟7.ϱ2۝d?yn[oDDDDDtI$T*:oXMR1zvnckhZlq0 M68'٭j=wIu2c%"""":H)8cca8w:4 l6[4.(mr೉Hj5S4D{YkDDDDDDDg6ݮܹspa{$aYv#CVODDDDDD[H׳J)0 MphJ)aAn;83+m0-B! eq29 $%9lFRʦp8l-22RKJJҼF..gԻ$19j$I&QGHB!ɜiC)upfHHl)L0zYǎv7ŋW0(*,,se)04Mӊ\zW t** 0MB!xky=\ Ӧi~4Bgf B+Gdt);uRt !BQ:Clqsn ju̸Xy&dE>5k҅mgט4]YԽ%}iɢ5kTgҸtt׿XsViѴdMШA}EfW4Upp}ǩ9KV Ng6fb0QI #rbj٤gk6z(LNva FfߢfJ F~TKpppi?"mߑo? Yd]QJ:ϳ "i֤n(>ˊUk <6al\-/ijl vf#11Ys>eBGhք;n pռl\?ۺUb9t(o;m;v{KjbD~ ySnz5npsyC=wev&Rƍx'\s\U|%RRSl0c^{#fVUXv= NS+Q!!!"+Sԁ7f2 (fD6 rN@!Mb/pJ"p~ыs<1evrsτN/q^А+Wb 7KG|Nr'0͘q%ٷ~NZz]/ĨCG񟝶w iBc\w||"#"xby#ZC5b>(6]IL:ШA=qͮ={ǟ~e܄71 WAxb$fXuQE4jP -۶Ӣi.;wz9[sOc˶팝&F [cԈ!4-U8o&7zPeQ@}:U2@f9D7a4O- B 'Q(Q5ag}D&4'_~Ͽ7Irj]:w%J4Oùz]ὫlEʕٹ{7mA[Eƍx辻V5)p7Pz5=α$_{ڳ]{r:OT -$P闀YlJBZ5Qx9V`~Y \E6bZޞeaYmɱcIԫ[{e]ͻ|jTCM5ĩqtz [$++N_Re+V JQQ ~>r8|p_?.-NoO˺k8p06];nۥue+V3p:\Rڜ׊̬,.?dڌY֭xl0c'ɦ[>-. P}lEPkAnr=3rߘ ;6}G6Ȉc?|9!MZ5灻W'sZhƓes/{|VPwg4W|[E <;rg}IJhצ5#aGIMKglݾM <<||<|G5y?x?1+T=0{&kƲZ=+?|jg췉\ &Ml۸W~,:ADWf ~~tMW@qs^vϾ/)O-ѥsG>a?կr(ns6@)SJ3Ų,ozLǐM8vBcRҫϐ<ſϜbYu])3U0L>daD 6*ȍ^F21H A꿶ײ>2_=>-m8=J\-6NT*U7-<,))ܽQϾtjiQZU"++"}FXh(Ts>n1bF<)FUb!CvSR1Ly }ʓ AދeYXܘ5-M|u\9@8/y?\A믥ef||qӱ};z~ i ubv)"55-Ͽ[oM?xWfy'x%X,Mu8B;@JJ*ѕ*wB INIox EsiG%1iڸCg7}Ǟ5|?g_rѳGwvoAUbPc'znJ,K{Y-^jM $<"P{,TIpjck37d"8aݹSZౡ3wX! 63fd2z q6ut܉F ꣔⼸kӚ%K56PVM.|ոF-~֬^n]:{RԩU =ƾ t \׳/3>rn"88P&sEVOd/v|]IL:  tR` #ڽ{ﺕ`LˢJttEIOϠnrCr^K#l6W_=ӌJr^TR ]оub]pm}pQ[^:.АBCBXfիUstu%b֬@pp0=('SRxwDŽBPP.jGJ!!݋4Kn Bٚ1Q56K#عIXX(J)S+Vq  }{ʷO.m}@H֩oeY44jH=}*EUd8].ҩ0 w| Q <+vSlڲmi?AE&4#k4E+*3C]ϛ-4WbK^U?[I7O)4bT?ÈEbR&Na߁rd2&ɽwAmDXn/urJ*Ϗ}=wb&W'`) n>ɩ >po/op8Yv=3{ƶ1q܋j=f~pϿ-^:JW';yFbqzwIg-ߗұ};>zw*K}X0ҹ,O6i?[jVrJ(7D|szvW^{ #0usrvI'ڜW\[nێ]xYڴn!"< Ͷx1z2225^z SR8|(~-<y޻)Gbq>9S'v7ais>~ #-=/}==tƼ>I_ }4GίKҽkg|~].jXOޚ1!NKySqxy׮{*!!A%%%Dnݺ*11Q ѕR64AAAAifYViC+WweAa{AlS2clP. Sݻ^¦~s qhP.5kTG)M׹9pi!YNl 'E!DѮ Cn?YMQtJvb+rٳo?c&LM!guu- ){҉iB"(K=b ^W !Ao %'D(m!B!vg}ق1S/ i IDAT!B!!ZzB!Y~ʇB!g; B!Bj!B!ʠP~$!✣x>e Jސ"{]?L=PrN !$ ` !B!D|ZP !BQB!( B!BAz*!!A%%%j!BqNKJJR jхfBB!"0%BB!U*...,\bB!B-@Gvvv\!BRހB!pB!( B!BAw\=-u3wmn_{lѶU4&`u1M>f[t`\V ۙ9y/c䙨 f8]ڝ.-c S\jڼMPX{~Bw,KQNoOgeƑĎ͛,"bj5˴Xd7U̽u$.z6RqW oeៜ-yR}WtAXCЍz8.{<ޛD/^~ŢYrNo{Igmj\܏Qe;Z! ^Fv==*5֐~pAjrzX| 9n' ;`Q@yã)ӹof]Jx15n%m `Sco:ұ٤&%afeds<:G~.kB@N^uE8YYiWNAs{s㞱l1+;~Z5FnU% ڿuۏЈMbZa [iޯ?Qh~_Z ]A|"Vm;BF kP;taĽCҡSs~ +KF[\œH}߆$m)Uix~W "=I;ft2I۳cn,"s4ֈ[cae6;ﮩEMC]2_Mf2`ḧ́/oHW d픬Sxqwr~#˷" z yc/./Knxw[RԽ&ДB[fefɼynIY:j5սy~U}(mR:!Ţ)7oYf~B"|'Ar|`)'cVӋו_Ϳ} 2/1_-V'>=6+k]I~Y0]J[{W1˾ckؑ-mKu`筛Y1yYuz?CulwWp /΍7t^qr3?.Z!⿧|SJeq(N) M j,l'~IL LBԲx{'lښ)ZogoU5)㿏eOg*X5Ϋs֓mxsgNQ \ɉe>KJ3w[nz~vRb1Sٷe3Y:NeF2{ֱ_K-p盧xesz_~8196sdzaa㌜d{}-y=xr\U~jl+eo?߳0 p]#[6ptt뚧=Nn.MC*䍁| Щ@ p'es|<J[?^G1閆)ѩ 2I;4yUsyjZ~[:g]1 !U *.nLTY;XUQ%\ޡ!YYrewpcoi?'VBq>1qx֬I]iԦB/ؔ5=Ƚ) q^R Bv-6blLcrg ayZ|UY Ѱ}ɘK90ѢsE nfoKزaCɩFZIm _Ϣ9!ކ_GBɎ{qlVXDF+Ӳ 6I_ʧLL[ qZSC Y"cYؠB}QO.m^c2/I57z>ߝ(ۥgŁ˧/½٘4`?6zm?bX%]VT-Brmq1YXCna,ȓ3r u.%Mr`/KN ŭu ٰc'<,li/oP47koQՕ\q~UĴ7 oѿE'rF,\-K[Ucx]%lA)gw0H;;\ZmnyeF)ۚbRSoйŮoK>oX^~j"]GM畫b=RD9yVqu͢2]!@ e*00:y)@ZTְH#9РdӌDs9UrT`B4Mf"kmYXINBY9$þ=1i[Ǚ5ٸeaI蚧X}W?UdZeFVmq`Z髧i"˕ò{U[@=, >X)_;6V=&ZU.BlznH\\1RH1G)%WkqܰWO|_MNXIھTR?cED`5ۜXԿ.-MgY$]N--|+rgX9V$m+k(NKR/HgA h m +#ZGUlԘjbRtRM,x@=G0iۢ oO.ؼC›ݸRɴTn_.ǰBg<6)^y[^ph*)zޢP*y̅B\e-_JI'P-&<]@0r8B}p8Ouhբ2_m}=u(I~O+ #MG˚:`ǯXf>dYP|)3&tRhزa\ɗ"D1&f`ͻ1euQ \VՆjum%KؗU+u%Dޢ Ѥp.ձ\{|[J=J>$x)Z!?,69~!?~0B A.(ͣ ^ˤ;$C\Є5*_~ eEWZ0W!in4zQu;p plwÑCI׉L;up>~ϕ+!5OL{|G>!U)?Sd֑*f^os tZ2}3s48/ⷔyio;&Y$sUwPR˥MNC)ڥYꮈ=-Ùl6Go6 uppJ~^jC1Kn,o #'jڛPhѝ2rb4>={㣱}䞞-ϲOcqKΕ;7|B){9#F,gS9zƾفROy ;?|-A1׊TvB=gnf؛9q"n[]˲lmJK~{O>Z?'W0mp_VeaNdt>_OҚyilOe!:7bGv,1|e5(PSt''W{^)ڥTuW~!m#?bsQV}:՟Veى cx.6y'|YcRջ/,4}ĝ\ަ1v {x]x-Ng|䮗yˈMb͖mTMxa܄j6*4hs9KtiYQ9!zM`b<:!C˥WcS8:խDWM>xW!bhu/dWA ʵiܓgcBa6iSt.F:s,1\M.Fү]*(cxԽR-ZtzO?M撚gڬ:Q!6l{yS^TJtzqz׶4a D}I m"nz,V׊32BT|FTRRJOOW 4PIIIZPPi \ DӴp˲"-˪4,L;!QXySZNM̓g!ys} B >?2<}]߲0-3}rcj+L#Xyu꟫JSܞStWdXy>(f>$4y޻yz8 k'xSo;^=+=|ڤ(:zM`e%K[1YP,ܧSJ宣n-PBAs;O{>ES<&9 lSy{Jm=^V!]RJt43ri 7Nc޽ۊbbb8ky5vȇB+n6_ar) Jӊ~RhRfZTiQZ{z2uemb4L z bKNGYO:SVr ^*q P>61Pm}Pۧ塐+W1Qz)kB4P3:MvtК&*>ʚnL¹s;"J LB!$P,W ;]OiY&Q`PbB!H>h/!)c5;r,% Atf\ؽ/z uC 1!BQ 皠0w37b0nW!B'MeB!"=5V!BQ B!Bj!B!@B!e Z!B2@-B!DHB! $P !BQB!( B!Bj!B!@B!e Z!B2@-B!DHB! ہڝo` _HgD̽&`6Oggsm/z{^]ws{D4n(L{xoۿDC13,xvzL~SoM&Iߌ2sڝTY؆)Š| lhCi{)$|Ǫ'+RIGyr$W?n9~QThs*U_v9BQ9 Tmx>z_T EpGY ]`ldaB4WtEebVj (feV6/5 ۥtk6)\N3\ZwhBO@{\CueY0&ukE||8?izK&^cfSEqv"$y?nBNNkEV453|\aaEf (ljԯ/x /huFJ>ݿiӮG֭9,Lޥ}sb㚿r~jhqQ<ҍ*MQo։}{5O/d7y4-ҩADQme"XZaaZչyd ~3oˎC{|YnL\~|L#~̥O,p&Ϊ9SqCs3cKǒ%1). P\7Mo3Dv&o/9Pչ~,?}]:W^?brqU[*VGa+/}롮BL[[OmA_l n*k+k7ЦWCl)Fzg IDAT )s3<ҥznl:ݚ>#Fq_肟&X_dW3ɇzo&㘫>tiL0;:lzo{4"] *Rދ*ҥ7齅" "KB*);c7f |}9d6w>sl~3!곒qs\E)x}/Nv/]Y5 ¼T]q9Z~=O*zОfwv1Iz_-ȯAm؜'cbri(Z5Cj`0 zXvaʓ^W<%ɥ}Fҷ fOy~#-9P">B׳29OE`Um˙67Cӹ[I,n=릱lw" [: ARot{Z~aPU7;W63c~MKŒ@`ooyϻ]նohhnYNSwv|?C )_z70sfNމFwC{1CEfudO4>1k~cu{ ԣ>~ Յ_3EC/Ƣ}R}Rɔ13V"v[R'˷`;H~B8 ^tɤ/.wx#U"g|5?7eꌵ)/ ڙP/m`zCAހO7 y"OtlBnw?Ư{;ǿeD?Qr6EBct#avXƺO~13_f3uanFxkD_P/I/y,^ۋ῱l{Jc.$rl9/eb e#ڔ$x{d^#%*y_xt=ϑJ],ʟNo揤rT)P\^ _Yˎ;Xޑ}6r1ež_Nh][ĵ bS/d8z! "/tl]Q+vo;g$X ߨjP;EVL^ͱQhOщ95\[>fzkؽw+İnFLAq8Ӄ[wmN[c{9Ft-~Ľl6e^4ݏ^e09GM߿s4= KR Z}W36ߢO)Hc~WZЌ#dWض:J ft;Y۟xr4&N-{ ^ ӳXp9ouou435 f?6O5)˭}?rE{x7Ѱ^n4~wrv$ݨqz,9+F}bX̖y?}G68`4KB0a]0{My ND_xnoXe{֏,)1s޷l C9 2^@S^΍d@t;dwENT齂2#swǓ@&I81^S}Jv wXOufIxN |,>Q'C}űg*M_\2Qq; X\f͡+оM%e-=\ bNhϜmYֳtVCX}v`LۦEnĜ `628z=O$G;n;9=6Y{? ?Flc)R"mAO݅s[Pr ghW< S01e]vd~mh7:$gx u΃Q#xd2ӗ?lO?G wשJ'ycw=Wвs9 8KjǏ^2mE^%-KxbλTp ~< &&= =(jI]ib} 0l>+N;v}3OTӑy5|fVV3S}/z,WLVw )j0]G2]96Jy$NYL?WAioglQO7L4oaڟ8*y}KqƐŌ۶c;0ӱ2m{SU?|Dzu+V٩ݡ7}Zz/rfAeYG`hBrkd@#Qia57ysư'v1'%ħ>R DEUw€\WĔ9RyE Zl:I/ kG͉LAyg0jcIϫ"Q^UNvJ7m瀃ꚺO=?Oc@u".׳{ "GgZLqFų0#2==>dч1^30J|Tn=J->O6f*>k+|A?^b 4ZsR h\("-VXYTzϦ|19{yyE` S3 8SdQYU:}{;}꺦 'A^@'b=.e2Os)gsm]y)DAn@#6:Y`|FӀβz(F,gM2ؿ4oodَ LD 9i}bXhOT]{Ț툼IF07zFrIWƎ`IJ:F|O5O),[ iHr˴I(2"V=0Y g 0"c8eTj5[|ƭ1d|7LykvbdD^ʤa#g##^7NL>VշEE/G tnBQ)郧K->4:l]*9YnqpJ*ˉ}v*O*Bh<ĐQcܶ1RҼq>,*q!\a}~)|&!$(\ NT M%3]UQܿtRWG`sYyPUAB_M+sH|~?vh9MrPJҰ7'֮bD2hؾk~E'MCPO AjrsCu OikTUb9f}׈8ƃte0ʽ[ 7QɖI9w#-wvթ֝'R-[ Vٕfʑu[Ar6l "ޓB%ପ$?>Ooc{&Iع_Z"/9X dXGg}N W<"uܹpsK::W9p-xsךID'K6Ѵ|#>v=y^Khze/WleUL)ۛҿg4zhL'Xy>q$>=ɲ W(ܠ6yUaĭ ! C)hI΋;7yz~& ~UkRN֜|J ?Ĩ@-:Ƣ+ )ӑtmFo(̺MƟm*0kRf%ܔH-5R#eF%#;-$i(R+fgJ{̞>`e}-“lrR2ѫB9pt=@H4j߼̝r)F^$^$fc̜~EBE'*7KEl3DqﺍL)M fڞ2?^pecA/zFI|58Z?\2E;ʵA(ٴ5=dzrg΁2Lfٌ1F yp&𱚈5=;gnݧ]ѻ!}^xrT5[1,)s`҂O)ՠ ^ǵV>(΂h5$B` MPLۄ)lCgxd+|/0i|'>vφ?5ޭWlv%678惶(}O]8:M-䒛->q(ѭ)ܑ#n.8 ^q/'8O@4f{t5Dk! xdOj9+9-ܨqOI}T鳈үj>R?/\WZ-_Τ?DGN'nX:cs@7Uh w?P.\COm[z^7P״X^r۪Kw]>JQA@kЉQ̝5-=蔓w>1(P$bD?l:(_B,>kz#X3#ݻ-=)gu%pw$za8L ԣ9>SY#'3gl!{M;RtsH͋22O&F->zktA;ǯM ߒԳv@O&3hǑ'_ca]C<(91yvWd`@QSEՎ{2훶ۀO9ꂳ-6,Cߝȷ:薟'xvr#Q7!$mYӸ{9{1'̟/,>wqh>)5?'N i||8DsҴ8GOqRLϖp2_kňPs0aEǧzo@(¼sH˃k曥~͆Lӗ.-1:[K1}"ǁzHotiE(%4?VFu^嘲U}n>-`zv ]X4cٙ֋3*ì4wYw7Džiմרg]GS! egM7Pts=d噾x IDAT[rٲϺ.^OֹiӼYB!Di ;;ĸ$EQ\\\Dv-MK*;֪!#ԀPTET(SZo&g\(BR>Rlrȸ_KyBAdz:/]Zl:Z1}"ee VyicYz{iɰmȸm6h ;ɲQp E1eLlNYڟ6nW!P&DZFViX&2gJ>ÜE7d}L ,q4yXyv)H6e!C-Tb;_irsֶ)E"k5`lMڟYMҶW]FYއuX/ ,Qm<Xl!k o!K:,J om@-IKmDzk*f|=9:!IozY]7M$?!jIoR~6QS9S9(G$z($I@Ԓ_ecڄ%y1$Iޅ"I$I$I+$I$I$PK$I$I$I$I$PK$I$I$I$I$PK$I$I$I$I$PK$I$I$I$I$PK$I$I:Q{^ ^-H$Ib୤?gL5-5Z1PU,T\يaLLG3j@iFEbcNB *(ܤs_:n }K꺈3mZK+Z.b\APYk܋s G0- ;l.D# Q.bJǒU8y=45t\%º1P <2&J$I,mFuMPj_#X11Ǣ5xY/1c(*K{ag焣 U}3_97?F-I,n΅/<(P-|D)w+j *F\ܧ%U`2F`Wu6z*ۺs!mL>չj= OܤgY<}Lc.*WmDJWV|W ?ƈk@cp8jF.3N3q\ cҌg9r&-*GS]J{٣:fRۦ3ڝ#U]ɀ5? ?iJ ́@C+~U{Q9?5Ei@ 8Q:ECf"@GҼHM)Qsե]۫8ER: @AQUTEI?W) mГߴ?Wʍ36҈}ᅇB)^x<b (bJoUȬ+ҿYirdoy4;wyyM3Je[H>4z[ assz*hB^=< 2 8Lc/O6cdv$?%@=>d֊/qѴ\ }J(^TNٗ=?_DME#-(E119iNoK75f u,F@^?֜Tr%8@"9AhFu<~I=DExup^ ܳl 6 UUP=&W}/p;sRh1\^=Gմ3FN#%P=.w"rQ-'fǸlv:OMGS:VFPGs$I$Xǜo5uHu1X͎1Lą>ES癚(TM[X{:$aˑ$:[3]bPQEwn] jqc4H¦M4͛Uեq+l\u':z},JSӜO6o7ƀ0ynӛԜ $@cbL(XkV $TUC,SZG|btUiMАJu lϑLX[ТoG.NO}>{R(eg?#7yr< 9K ew^=XsÂO8G &-IYNKJ>Zi+5ϿFzfj,Ջ#I Oɚ|8i&*g=EBhvFv*S.a1nX/Č#<A Nl % &MhޅjcԲ|z`=5\ܾ&wNqm-~hW@ mAB+q(L۳]>lW'W01!1ilrS#7O΋)U]K$I0Kgر"44TDGG P^U4MsvvKJJEquMu;wхj$_ӛR5H}и}5pT:^%y:~M( h:jPMo@IC/:c! `z d:Q7o[tKmMaZ8M3okbꚐX~3.1+RֱJ+iVɤ3lA<7 Y5*.c":C[HVf6&I܆M[~<$tĝfji+Sv ۿPLgE6=8ȑ |J.EI}A( _3K7ljcy*[12[X/Xf/("l%öM:E-X~3e]YaYc3p❮RY%lo,벴 BHE-%`Z$I^&Уa"?$:YGqNF#<(I&g O')u!r$I$W@uRZ{m~$cc,kI$I^PzL/I$I$Io@>$I$I7 jI$I$Iz2$I$I7 jI$I$Iz2$I$I7 jI$I$Iz2$I$I7 jI$I$Izv3N2?>J&ה|QRנ6lуֲS4rO-`'㦓܎0Y1}ɻ>WX9v}Wk6: +49cvs%moJ†>]8X}1j{ }[Ns/J%g 1x*\NǨ>yP6N'])]cOU9[3YKt׍<<;p i8"yUŽe0ջ UP/Oc1#@V ePuՎvֶLxT,NEm8r/Mo=BxƧCiP0>;Kmbp#[!|=.W\V5!Sƒ4EՃмk _wrNK0q]YFR[5ׇN쉕zRQ3NeFteߞ(۹<^ϼHv[Oq=˃ZsYL'-l[?CS˺al2-MѫsbwRb? ~+^z1_54l2N֋%IuBzT~eO_!Q%j)-žݫ[ot?#Gg\9qII?TG3Z<'7%wܳ#XU?6|‚-{^=߱|#r d Ye1 $fZ};a?W&PtsIYuA huou47-ǭ}?rhJ0na\B'>v=mH2F5(ύ:=/ʖ!FGz\#:lB{8$_pkp\O[fjݔ<{z6օP%[#P. ?i|+dMFkvTPg:Ʈ\C2w=})y$ 9Q2/v5+^%bjFFrw̓ī?K?0v&zԊ祛yG}\ өYYHQlZV31vA.bՆK$Xosd7\N%'md?i(A#ϙbQ4@2.^@/]n@V )]ҞBv}F;neݬxt\̨=/Nhދ~MS7a*ξ~fnZíbl+j}i;{{b_D9o ;GŒ$Iҿ̿7I11$&_T|P<)ޢ+ C="m@-6Rإ W[и;%j[N)o QH<$_at@9{ .iB9ʍdsB"|Юy QFab<$J(@* @Q>ST|j7V]IDGΡ/Hlb4nU܋Ӻû1.%ꈜ?/s`t9Z s*1H$#(߅AqL4űESaϤlH3z78DD9Wa`4p~;8ʦ~ LhbͼV?feAHzFiit)& V +XJ$'}ql("8" #"8tr:} fyA2 eOXn*3L ®SI*ND1@JR*{& ⷩql85΍邏OGxP~flq"tF$(4))N♥(Vҽ5)]HýD6b1R%:a>:3at N)WM[eGz(`+LsuZKB+,uyN;?b}a>{yvW7 C(WΓBiML"7oT0SsQǏL0LOssnV.DXѬIoCQʝ-HL ̙'H o^"wBl66c&Ь+[Y;ev;Bj !4$-1M DD`փF!J&8d&xR2C sp Ԉ[G>U~XG?aңz<Ap^NkEhD A?)2÷!4k7uX'I!jgncLzhN03u'DUcx,"8< RIӸXdgïSa&ï;G9L 5r"$6j72bx ':Pt$IC9lN$υ:lO;Ct1~?QWAd1K 4i{y׬Е;kpJ@:͜Xi2uд%Z}y-wټp-KDG,EtD+ItF4kÞUI1qM@v}1}N&u5"{t6KƁ HЄ5.`ŷ0rHs?Iݗ6ayHGMUBH?@6d$'cBH? э8p.?e[Qv}N;йɜui2mhP6|\ }?[ĩk;R-Ͻ,!Mnmx}:'c!;~7[aE|+:̧Ex:%L-rdæ\ r XBNY%PPjm7~=IutQξ!\\A-vvMD˩ 3 زiYoJE5䕡=8eQ5faF^xQJF2;yuW\5' k QК{<פHV=N1gɴ()R _),ُ FH7F9Z<:eҰ!ϐ{:8[v Ā0z"}1OBtgE’GMLy?g}֟>d;-|Pe`² ? lZp]=xJ)ys\]¹ls4|iΦ_W_aP/Zcigje(іvme֖*{5޲/sY+1pʩ }k~\(>X8K+ïݹo}/|ճR*I)fYV痓kFnHH㈋߯t\\Y3fw jVy]@F|VS}__>ŕyٳ3-Vח*~p^ EYO6Mߐ WtÛ{] Cp.s26A)ގ20"R.})d~ F\_gwݣ nce>ö.j/%}6=y󦵜(+&P f? jR<.@p:3>w̿е˚g,e r!JdT` A;[J}/g{_,7Hi"QTʨF2g JB?7<\%T !ĥOEtPx5$ue M( RN,{V'(/ Zl5߻̣Iwc}Hz]ghVIpAkE<ò%T !ĥK8'ƹ{M Qߌ #=õRʧ:_ ˅ !IgUX7KG,2r,Bl2QT.|L!6QƻoFEH{^_VvaB\$P7x%m9fu EӶ:/8k%8 ;Dv Lbqv%mkigFwX!ĥG8#=ݳeZ紦_Yp0w9Yg!ϲBk N{sE~+v~ uk#Wx>[>t! omQλFjrOgO2B\Rۂ.- 00 ˲0 ˞YB\$P"NFzw,Xy儸gױ"(0(/L{f ja!/ k}?O刉fӉfT{~%B\F* L >B2eѼ>ծ'Zʷ5s8;T{h˲Z332 eӉqJPw_Rw4b,FeYy\3Tla!' ⼸õ;P{6KP*[ q9(bСT3~ϢNC; B!.}M&Bxa_ӅupPONؗbdiq+b/՞ox wsB\$P*}6N!ĥA8 YVj!TAaR1NBq@-МSCZ{yo|[j{[3ƭ&?{˗oã`s!ʇ8'_E}!݁LԔ}j_֚.'dzCeox/Nog˚ohBFX)I[ov (Ι$L#Z;)=hol\C!.E.ňRQ_|[Y.2r{ (?fC7ز/#9Y?>ŹXp k_7Ejl,[B!{t} !xI (R/q<Ɲ=(hR7-dwپtoXKJDӇ:}"_iaWb۩e75gai@ҮI/s33ZZa8v1 >M9d{OdW-=xW9fo8Iy@C[j~ EBJUhrdz\ߢcӜ/_)z{Y_8˷aHa4Ӝܣ4EFfC^ *"ėSq1Nl2AP_z2zzFμ~8RZ95g yo8uL ס/M,Z uoql=D[~<݄nys $rG|/5ӷg,̘kiuHz֋EÎ:7 SWxaEߎkBjq^4Q"V/v|2S7~*pssOs]T4 c㌘ފXObv$pp|%w*Wf{yofZo+Γ/˾S3x йdE.:EJZ%c<Nr%0&X%&c^8]+*df&U`Q!iX'ӇXu?iÞȱܚeU01GЀOjpqb|o'T ;^N5܍?- xRqwIXI"Sh+Z`RSqrLMHB oD?׶֤'%ClI وF8wo뗮22elʱ:xh g=[}B\$Pe l#t܌Us[#<3)ɹ+w熧UEZ\/cƌQwV*--MUTIfFFaY_pp_nn?hF:LkhE-:/˸ͧ0,U0tP[*XB }Z >bv[Ezݎ /}#MOyW^C߫55lYVnzn9~57i@[rIc944PhҭD<@k wgw sZ$<]̽[+Jk Kk4Pm9DB)<cٝ\õ0|CӖUvtنe=F.J9÷VyXڣc9虭i,lO?HbŰli<03|}B3{쭔JRJYddffb8배0k֬njՇšXs}߿Ɲ圝|>e;Rxrv ّw}Z[Ǚ+03|x@<{Au2snxii o:ǹŽyi8eqϟ,S<4PX/jV6,lXnhmq@OV+֙^t)!ˇ2Ll66(CF9d,0s7]$'Z{3mp>;+ κ IDAT|w ALf\,.Y5+mל5+ w7ZkA !e؈ #7=VN\IQfُe:~~ok>΋CjhڇnSElҭou"M5q:=,_qFqm?JY }[z lI [py4LGIs07bڭLJق):WZg}-Mx;EojDmNr);p>փJ]1hԥE_*﫾BQΥBE ;S $J"!9q~!ӌDl.%f,- {&eD|~_gёaAaD0'iv$r21^-8Mn`g2-W!6:rg jber*NvXE+w-v,9+y4icgv뫵Fy/\w00J0fѶT(" eh {|ҍ\!x\2ZZ-P OD X O#&݇Z1{i׼}u02|B`v )51cPgڣ\-yo*438=9Oѹ"~\KDgN")+Kl؏bϙP`}VH (Y_\_4)?`ʺX#vެ?MKK3_>R!H]Sr %luu|iR:@@x7yehNfDTnY%B)e{dwj|Oj A&syƄS>m+Zs@ayɼ5GP(Vyӿ.7Vebn8A]gWxsxw&*4L6QlVb3-L|rCC*ӌqȽu0Y_7W}8[K? :)NhB!t( r2TkjuC9\EtvޘDkgr÷,-^AײZ7-F w}J(oW5Cg7;4i&r햫88x7jHP\aC\Y2Ïb0]' nڟxv ."BorQP+<{.ZT9:71S\בHˢ0|Vժ}{k綾y}i20pkWVB!\ryy0C$B\$P!d?B+j!B!΃jq$~(́ma;i9[=y~ٯI,BKEyRdߙgy\Fq*NS-a"B~IR{ymu\]9@{$F!B\F"ߣ-Es]O~ХdwewuxҎa^=&UPTiӞpBq.Py?Rޜjٶ8-܋ZѤuoij݋Z0 B!=1Nv-iܼ ,f&chu{͙;?φ <ڵlNݹOّl9 wzN櫯W.}~VbS'| =Dͯ$u?fqwK׶+ 0Y[^f} _M⺬<8v9񮅰e#xaUk[Zm^9矞K.B piݪ[yA#}SF4abF;~v+6lWoAbOp2vfHX-p<:>}:nҵFmoګ~Wt5<9%MB+v!k˘ǾSh}pZ % 4 ٲxt# =B!>0r9,6(Q~>Ō`bHL :_|p*y+Ǽ*ΕKt a3 mڙV)6-]9b忞Yq:$ "F)T Xi'drtCt}| ͐8-B\ $P /$bŊ坔T9rSx 2q1yHN{[_uA [nt/{+7 cO\}m #:,8~D23dN&Pb"|Tf=(p{{!B\ˇ Ta}Fz'%R#3!ǯt>^J*x0,  Zi-^ȷ>qigΓh,p8p88v7jHP?XW[8,i*@c9,0\5o:B-+0JYG U{&%뺋\|tnM=k4XJa B['2xq)b?f4ML4 z(FA^#/8UG!?һWJ$TeY@_Nfffa!!!VNN#..ڿ qqqf͚z̘1ZS;!2op^\(z\ YQx(8BR@6A!=6B!B! -Bٹka`f^w]: V8!A)U喇j!4iУf+ګu!ZP_-ȗ΁2TKBHQAlw9ϿυJJ ضcEB!腅-wEAB!AB!AB!AB!AB!AB!Ae'ͯdjiB!&B),y5ȷkty~9ŋdgwkj]yLW&Л7faqd75--/); H!I Smq-w\{D^yET4q1TM'ԮSuRq$6OäuomhVЯFgQHûм^=v65swwBK Fo̚ 5`"Yޟ.:ѹ0 c<5j{|߽ki}7\mqh# ߏ>ѧo7ڴƸﲱ&u<ޟ]'$ ww1et}:wM2'޺yO,>(Zi]| !BW$P_H:G\FU5 ϮNɯx׽_ۈF~]cjKt2w>_Lj~ ,5ՠ7 ~1I7U!j o\'`_Ͻ̗'h@yy6_-_ȄN|\~k0X  el~DM}wz{9@ܳ#-[4q[y񛿜]!;g%co@OxعwtD[cWLݑg7f;CnJmi֤m>{}ɇ0L 008Lc(umE4VNX=0wG{sw޼+t:{>!ZѨI3ZrX7-'r [$4'nJײ'/98ӦE uGo#C#BĿR=ky9i6 4XSnXߖg7=0fds.cK i[$A/]a܏z}R'ecJ/FS i}-yl G 6Pߟ7,^W | J7uV71ɎĔ˾fégxw/N^#xUlv!k6YYG2g_;^b[ॼrcѫi<˖I\GUԵ/qD:O6g5鹇3AԱ)>|6{[pdOMɇt͸c_eA!ꋁYޏFtr-ɉٔ+$/AprIک7f1qVP I>; 33OQݭ jgԟ Ӽ=Ku(- TfTG@ O@CPҰaA2lZh֬ xqy1֔ Trk]?B-{ e%Rx WyQgoyUq:{ a!BI EälG-k&/ր"y7[5Gȴ f>l;0"MD;Z생C--G{P֣;EWW"StpDz|k(KxO~LWpa&~QFo 3{tU^} gc'̚1S:(P <.;v 7AXaOx''*GCI}bDҚ1KVzJ֬ZJ'BB!8OB2M F\GFtp3Lko(o=0GaR|~qk}M AaStLNPY?u/#g$2,QGI+ !r=3F޽[ǫ4UR%oeY~~@a!Z0uԢK'. ڣSy8W˯5ey=n@F ̫W+AfV[ wmxPJy= ;QQ]JnFխ;oݫgoTR*Ͳ /'3330ܐ+''g߿_鸸8]fM=f̘MC!B Z!B Z!B Z!B Z!B Z!B Zs8z6O$8O^؞k}6nFVmhA|{GY9zwhCmhN&oI]"zyVrMV7^>su ߿{te&4|+Va'Ús?[L1>8;A\?z~c7tiF4wef֤<дYKZ)HiS1~n֘YIG7rbtЉޯ~O֢8M2{(umEF4Vw`%,&k~-"nқ78 _\%sXTKzZ=9nي:uФ=@X)!$Z\@I|~ K6@c?WX |s1kgISK稁SXf-+?#Ar5X}gV{ǬZYᛙkHUYwP=y=2 Yk>}8_?5|!֖Vn >!zT Ea+֬Yן=m+JXN:CdTT(\Xqso d+ns[%{]qQKc֑?ї_c(y/dep?&-+a9ώ=mV_żKls,랑wy|a_noN`ݟeue"V,G◷NE,b`h2{NGwӓ|WWMšeX=mCccE0MG+urc=6eє'\DwMԏ_w-e#"2e ō 8Q@TPQQ6(,eoh@'msMxsw]r|sILTKZ΁ 6v=W^ٔeyhC*kb`;#2|mGru`_+fu2vfXYU{sWʔ% í<HX11ԱA~4N P* coajS-Hiۅ IDATb)bAe0퇐=iJu̔-#ˈJZR'h񇉵 o1 pc"v5MY]*|p݀;Ԇֵ *vOJ8|#mes |1e|/]"װׄn'ampSp~D]َ{} ia滐yԦmP5tj[p0j͉ؐXX:=zub62qypqMН]} RXrz e`SED9l=E?DaRFDDJQ>:nia`a `VZU@Ѹ8r1КT(GXqG Ogqny;"-&%c\| SE7݌`MdތxnT{sߨ{P?>p.3ogeNsVmLckF̺f #Y8!42CAdx`ÁaR64$Mm-b8tni7#&#I&ёd#aZY^O3ȜˉeCué_q 40=Nh6p3iy$9VG9i^fWIؔ=93pvoEf!$<*cA[PIޏyVtZg>p]oD [,fGӁt4ILX<C-G!'*BD3Pq(VQ򊈈=!%RN2lۋ$YvGp-s/xXlHݷ&# $mvh;p/RlDlA@TMjW,CzZ:˟jCH+b,=: w`X'ظ[6'-١W{aݦ;ͷ}r X{ B˒} {N/XCn]_5ɋѦW+Ɋwf. V}2uU<дS N|llj؝`ڛ9} R]7ӱE3Z?+7_f~<7_qTR| f<;y_[˦4jމ059͚5xx71>t 4{FLbN7GMki`@[c e.W_EB&"=gڶ3+]m8w|_2wtG_Xߎ뚕*ސL\F30NWX}(nOședr;vyf#66HHH0Wnƚ~~~$Ӳ,2eiٶbvWs~R:Bg6vְmXt:q:3p:3gddUML``|N|cɸ"1)?-%]rJ ;ժVp亙fFȅhŏ+i԰g)ճG/0 H,+ HMKNNN7M3=((JKKsFGG[۷oCBBhnݺرcT ~l\/q`s3nBx(Q'XSxh'-4>< sncƐ{xs<ɫK@)PK縔>&0ab4긄ۦ/6r)<``~pMDDD?>"""""^PEDDDD@-""""j/(PxAZ ș@D @-gan"IOZ[0H9j""""g,b<4NVt`6ЖnP Y rDw{i7S^Gu߳uru""""gZKcœ:m[467̍$鬟Ћtdgqb/~ِqG^ޗ[ҬM776׹}nn R2ӾES_݁^^E"@^N״ݸelMz:"(Pi;sXNj Wbԉ|tDoeN ފ0k+=(UzYKE7eC,,ά$.Y+k@ilzA^_Up {Nz"g֙DD\SB_q g֪?/ǏpU~vp\ҍnƂqX6\ Sgۗ`{#nܜrF`5 Gŕ_}ۿe1=B| 026XZ:aKOb-\9#g)9ԇZNavσGGݝǴHlJyww ÷44Tr+OϑcfcTA+#Gbt~pdYiXA=HWi(PqDDR3Ơx!_yäB4z+l+_?mZ=M"H$2u+ &a5g&iP}rZb}Ȃ%Sʍcs8rτ9Y8_st7;PNQVE%?v{Vx'F( ~CyDDtQ9-]a*(1 _%[B<Áa蔶+|B{v w9,-@!gvdװ{K~y] *IZ=0yW`voiWpv/wݟ9=E`=i]72s\W&""0ܭԮ]t~Ү;Whlv)qae"# ^cϠ*s/ww=簈| Ԓamvɮ32C]ò{] ܮp5\.R\WrcחA6]P]~A}]DDdPRD{  zRXp.N0Bo~g+gx0rRg?6 swpՐ´k)Sݶ g=C{.0y8a)G&w K/r*f }\a)@Qp+[!B-9B⚇3oawՉBgg0usvqAe""Rr)P)q\C{lί%ڶs !gK~VQEH@-rɮw;wj8uڳ̥/x]۲U/""%2 g0C{}A}m9 y߰> R$Ϡ_+i6?U^\)@q#r䷽7 TDDdSb *+ Lxv)V=<=ˊ/LDDJ>j)4nQv/3%'\7_R~ۥ=< *EDSS_.݇]  W_z r Ϯr۪ r$mgNDDJj9-j(8XC-Uqע)^DDJj9mj P._(j,Hq+x""R)PWCAa3<6;DJSFOe\)=q‚Eq/ӋHɦ@-gEJm""j9 #w]-g   R͊ȅMZJ)ML)>j/(PxAZDDDD """""^PEDDDD@-""""j/(PxAZDDDD """""^PEDDDD@-""""j/(PxAZDDDD """""^PEDDDD@-""""j/(PxAZDDDD """""^PEDDDD@-""""j/(PxAZDDDD """""^PEDDDD@-""""j/(PxAZDDDD rVY$"""rZJjP4 %. Px.JEDDDD@-""""j/(PxA?'"RXm[9z(""___""#qI L+P2[m%=-FY-"rIKKa붭\ZRsE|)#GYRi`RfM9YU"(P2zJl77j/(PxAZDDDD %W>OL+N۳6ꅛ ̗HóZDDDD+zïiuoNx{%n76'EvkU-;scsqoP tiO|ӃNHY|۵U> za[S\?McXNiێdֆ_ x2nF6<&YZ J&a+ M6GD.g;u q9sO-'+L'm_`Sь_ o U]}b"fGYhSbѼ:){NE܊L[ gRir-,^~س|)Lgi7p\L吏c@m?"gM(9ιd"LaoA|gs2f>坹KnL{l!{š ra$gBU 4 46}0ͭu! nL@Long'3i"]6 f3Xv<)+-㙳hKg>D-Sxf2lbs+0t ~͛7:?'XIX3nO}oٳ8cxoI4.3^· g%y/ٛ!W-1] 6"ɓ'=(8%c`ۄG. C*ո0Siۙ;f _2WjHO潉\F߇eMsû{ >'Thr#ao _Ёg&d:,1cm٧>a{V[hVˑ}ƯȰfy|>UJ񞕉?]e<O_1|;%9 V ?YLSb>ۈӦzWK񒵩YR$kipo=+[؇vmFMᗄƌm F<&咥|@UL?VWGy?ev%ӥM$s;Jxr9>i1Ĺ/3'.a,: IDAThniv\^r)>}.>峭9Fd :eshۛL[v4k؜X>_.{aTY*w߾sh~lV7_08:Kal?xOO[1ScwQw_䳥K GNgxxv&ET[ូ:gKgK/1iG,]5ʹ7sic->Ÿu-Za1|7%9_O~t-YƗO7bw*v~'DDDZ+>4`uѺUլ0#Qk緿zȫVWsxxջhp%_N'̟v'3iUBc|xup @߫Ys%jzdVO}t`X;2{-3a'N?uuq0Yٴ]Q_f}VFkR/rsہ`sxգ}+`FQ.*-G3rfs3M#8V&v7ӹsU>ZvUXm*-nFcADg.fUF|qDu1FJG\'1Ef0-Jh9[ATD֐@l\ VK3+dn'U+$ D<'~Qjsw&C5e aDf=a Y>ӁöqG⎐Jg\?`ᰳ FY&LV)$(DPA6qéFCy\q,+-?}Çrd;t^s7NLzwɺ^!<#Kk\`ēndI"s,xz$3fF93\4`Kؤ'a2Cy$͂M Ae$%ĦE=T1Ԇi( 4"OO ջa6^|a$jU"*T1x̸5#|uwBc1-gxQDxqG,HLr@[;/s,F= >V 2{6jrcyoJ/*ab~6ı[0r( ,"є3k{(^X̘4?\}3%_3so_ӱ!/GX$aAks5mQA@` $l6|#NJ`sI~t p/93ىlzƬ㓇$<7U.vqjFy}7TmY!s:/<Ɯ!LՖ) |CҴ_7..8iv l-"\zܸq3Ti ϱrUE2 +T6̘~|T~wbTɜp(Nbo¡4+o\[QҜŬ֎.`{?s$8'c#Y !wj1,ә9j"ÎMԬ@zZBmO6jم&ηHāH'~6=C]fY%:u `ھK.`3Jezѥ|OY]j^k`f;_pYWZy.@:m`_->߳Rة8v2u*`@oY67HM_4eӀ ~[\5iM?xvdGOf1 쳟Fu`Ftd mF>ICo̭`TB?'s5~O1"[~LZuɮOy}v;+m4 /KٗvkG- #3F¼OLy2%wVwfL})`|o=T. j`OA֥us9$ِ||{X}'fV2{͂ȼ28릏um\JJr2)i81i֙s:ɾe3p:\Y#e =2O򰦄L l0Wcױ4,J=9XT:b\T)ץ"R+cر;Ԇi(%-.Q 79q$s`PkSܿy0/qa8R&ƐhqU}yN8 lQys9aRM<}K:ܭr>^{׏XI u~ԋ\R.Wջb3`8[ bCU)[2/o!aƍ`}_u:]5Tx+~Ƚ}Bpՙ%ǹ8R \e0jۙ:DZs s} Ν/3<+S .msuINM/!Mus.V3Hyu wtM\|͌S>-.ejsKc: 4՜A`Fu~ᕑ7<$2UZѣsx%]x U[˶o2y0?K3^Dv Ogv2宠qf"ցi7fȓ|SU-5ĽC1aUiuMSvMt ̘. |c&A//Q\eMilsҨAWxhţOӽi>9n}ex\:_4sVMʮLyy9#J}:> b\[ֳ?uSך_{x{Fó oB1> eɻLii|Nq-uO̚^5)ȅUV%L*k'q'GMKo-v}u^_~Gv#2񋾌NgJjwbtgu.[m%=-FY-HKKgٺm+ּԳ?SO͛7xZ}JDDDNGBb"A ӧ4MI ՅB)LaWaslgUGF ӧϗ5j4>sQu`qSJDDJ$yNOviLr_g>>Fg9*S'UHH)%t.00޼yspZDDDDD o;v]n];::D.""""r>֭k;6loQEDDDD@-""R"X5&i(npqgEglbm=x~W8W}*LgIѿ c735ֳ #zvzVdlbj<:+!cSv33>’[>֭x+3Z5iF֯!BSjle`ׯB`)>&iѧZIizQ-v?Ly?*=4%8iØ?ߓX;y[Yi,mK4ZdžgTDDV*ReB%\S1gN_[~D_ڀp?_L:W:(>šS3U6cp=r8G-rekgq~C<@kAܼSyjRq<;Қb(YzTdcᕩ7Q&?lK+[叓\ڢ.qRvʚUiyEyݬp.1UhtU~ͨO`VVƥ-aǎh"T.. wLiGg_$WlUn=~[Cz}ŦhX}}z]+K [a$9ޘ͆}>e)P7*'6~̇?gݶ8e*ީ i C_0q7}("' #|=o?~_ >Qi?!4°mlWO{#yϖ75ًœqR۹sHw$-ykӿJQ= g2NE2~rx^z2C0jb6Jįjk|l,2GLZĦIUmÝw2]BL%ldoNȐWs"#MSDr*>R񏹒A^t}9?]ݍ6Mٌ1?I7 z;Faflbʀ0%>nDƞ}r.OÙ KF4U;e[&]&~S^Ұ%NHQG};]7w1ZM˫jhcl_1w48ٵxZaδ |,W?Wq8^iwcy{al ?LSy%L9]E oxs\/1i޷K$234Yզ˟x}"L":JG0nsh~~EVZ;ϿS<̵v2}xzIl8l0/YoO'ɏ'>|sUv=ptd`uA,Y9ԬWguA,Y/f}Z9q}E{s}5IH!2 AEE[KoOnSݪ>ݭ;.uO/>tV-ݶް^PڊzDL23I} L~+V=l ߸u 5Ïޔ݁Z ߑ~ĺpGc!cFFb+= 'Üiꚾ7#7DL⭲1iWcB׵!h=qw|5fP*٧ƻNCEc"zR‹Iql]8%)R.9~\8[~"zńIxwx~>84NM@DǦF‰F$g#R't@'IDAT1.rq?>W i)t2, c8e6vOZ{!zcú4N9FKNEB&^%4"$#q6Zw@-ܥ ॸP<_Η܄hce1khQ̺ ߷<Zm3 N| `9HlC/<K>kNeQ?e2?Vc^s&5-_)tlxN ]< Qw2\8%!,̻8D-NX`(UADD4ʉ0&|:=Mx72 كTz[`3'O[}5"bRNB-۰ >jˈS w'[. /}X-1cPN Sn!j. CuttBJg Z bPɴM!DWz~y 1ߚ0ǥCWq [p7ѱX?^ዐ/XCs꺀}k܌/Z pXou801k:Ec!AR(&WWV˿~b]<,<ٍtĩ'b,MhH $:pµTwt-jth?01P_abq'bd={в%pJ#y[0wb(p zg^/Q(߅W ub39&e˯a{4[M-*g>) ;7hbO/:>zIٕ~ $tj1&Z0#.-O~ Wt+:0i(? ;֜Xr9Oq֍C( 7ܿX@;v?v~.tV|]/ _~]“q~H\뾖t+4\0vWfHwq#+,D_O_ 3>]}%#G&#MSJwsTΧۍ |37xi᪵r9P o _sᩋpbnH{>>sª╽9n'[[^Nkn:ܻ / ډsp?ߊowy9=sBtXZ2Zbܶ߻K|e98a hfѦYnjj͢MjUBReYRʰ5JtDDD]0n\4\mX>mէO/M#¿,Y> 6`…%]8R6n܈:kcK?1M !2ju4UJy\O&]T2DBR)TZJ/wů"ˮUiD5͈ju>DDDD4t DDDDDW5M+&NDDDDDGu~YPv&""""z?;@ʴUȐhԪ4V5ё:'WT#ǂs}ԘCiqᐘDžatU-Ri*0tdiJQ|ODDt!DOw7Hft 90#ŷ[136t`p`z.q}[Fj= pUB.͸DD4*b}wuu:H̙q<ے;JHfM1tH&ώ_bJeaLl &/:.+PaDY4Mr9XR %C0!8 x,Bx7|XAuDƌ)_4@,H'UuHcqKrBP1ǚUet'""#Kx,0td!ņuEFFG*VՆڶmeYVq|dёdWMT>c# WRU$)<%yrRJy*)P T*RFUsssqa*hCi*yC DDDD4i&pgu]Wa(˲mBv*RMMMCjCdiʶ K}j""""դRuY͇BH$ #t:]Zu8r]WI)}]yk*jRJ}y,KL&S ͈F*3d**0/K""""ՔR~P6 Cfbt:=ZN$*H$JGK,K}&ziz`&"""QNu]iY4 C,R=|Th?//A577s]Ҳ,)]u&;xRJ? |^7$V YJ,LڵK%IH$Ԛ5k+pkq+RkkkT+L)ii.AVJ`:̦i)[ IM\WEDT뺮r9]0 MJ)G(H)E3Q5u\!BQעrBb]Vϡ#B!Le(㔊5..B!_L)%u5B!(EirSbsM8TI!`TTS)UCbsL8*SG!"Y-.IR5NIkIϭQcB!(}%IK7Q%=FI$J7dMT#B!BR';NUqKҷTT$SDJ$׶$8B!EY%'ѶKDI*Iߔ(lIΣ$}UƉW%V!BdDk>Q%$}S"$=S#V^!B%%UQ~)QItq_>X8R=B!- y._>)Qpq]>6ǒLd !BK&OͭO(N)J=nmn;jNh;!B&Ū9uAxl+d8c&89qjŪB!tKc;9Ŝ8K4Xl)8%1 1F/s ŕB!4Ns1ĩ'>ɶ/Lr=V*xe'zd$>vB!YIvlzdN6KY%-dN8TB!s~NN1&ٲJKOiOZY%'v6}eZUrczB!e-zc6NoN%['+N?P}^rk綯ɖI=B!8Is}ɖmn }]v$>I)d6mm1۸ڸ;qwRB!AIx}6۾ʭ۾ʭS{DArmRIkc'(6;שSxe[\!B[mj<sVo;qnXmhf"mhUvܩS#խose'j#Bq0J$y.NEm>Ne7nLp;6P[򯷃؋ ܶxc:S N!`+yvs;y!Sԭ^o9niHFm@vz^vڜN1S;}ߩB!8'y%z;p^<8ԲV߷%N/IuFȘ| %Scl}UHB!!I%;NJmmKU9D%&a&2fqKmz;uWm1:osdB!$ɱ-ہsYÎԸSU}SI$,Չl"%&}u.SLԘVVuB!X[[{oRn[XRַ׷6_}7jOɸ[^g3^W6V4T.T#BQ^%;8v\M_,B áΎĶuN} Soӷ6_H"&*xe^vں[Hla;VW$G!,'N[{5n'u]ַnN[~<=T֕>aNPc攸;Mdߦ/:3~ Zgqmr<ɶB!%2Ď9-lj]P,.FbDխM?X,ĪKJXŪ }_ŀz׎1SocʺxB!x^ ΉczSzE#N}b[SmIXuIIU"odD>z}طpW-cBǦs>VB!ā$VbsZV{ScSL WcnjY[ǕD68ݒr]-[}_/uj\3?6hujSU+ !BhzVP޺-"bæEڨqS9u ~}\-^MɻPv *Ďǻb:{__zI"m v.B!e)D7VDo^evC۟GQsB;fU1CicYDⱨ ',q6Ji_D_hYv>2]u:z+iB!DE/)N.qZoAq*=l :S>mjջVwP#V/:=/.X vv[׏mZoGB!8ظ%rث[wwCmRVN17RN{b*lN1}m9 I8N1U\iBx__88-:J]w`j5{Z[KzqP,1!!}!ʂ*ٙ};6voB-N셍xA+ ;vY1cqw%E_8N1bb[xrQR~?<$7/ڕu,^B!-Z]c/=?87ws a/r*)bΩ)TG]؜b6}1ᴵ }aYgK=tNz8.B!DY0*9ZT]+-}R߯P[+pj_ܱJMy'D8ISS/NL%Fg]W'#ݎ !BQ YzwXCznk?pq}\JcUNubzLvfaxBq5ً W;*س`6x*03EKJxQM!Bd`x-2^e{J0;n:"jM=>(%.ۋ W۩s+K k{^3a\cĝ,PB!DJعUB$[J5nUKE;mA':Vo?{߮vv, U^KȨ ; DNZ<:q Q9=^*R}%ٓwj'^/N8q;@=l驻\3oɪI{hv.7s#B!D\5V ξt'E-1AѸS,dǔJ,b.q5mnU*Tk̺ yH20k-U%LZdfdczKory 1MNRvB!D ?'F8jm]6FWK"+K$bæ}u+3o)"7:^{6aXT*6iKe_j[ ߽9S+{]՗zq+BoKѩcR岞aGsgԿ_ՙׇoԓN8Bhݲ۵۵uz8?v)UbIT2mS1A/NOTTl1>.T<wQXmwVeJ4-" {ؙ{6QX_4ZAVR?sxM{qx0 .)q@xl==eVs{mk4paڏ?˯+-,?Z6J{1rM ^)WZ/?O SZ%gm7·pM4ZlNfMfB0:u@pԱ JzݻwCYr\aSVۨb^V9M[̎, ]ߓCvQIRZ/{>d'UI ػ vR3+H#j0uqb3 #KL$-=믹y=8k YrM5䒋z?G+^?6n̆ *eC1c֯|WZTT5Y/,m.+Wћ r[ =-%ҫoזBЫҩcyA|/\Hޒe1dp=!CGԱ/d˴^e[o"-^mn*MDDk;$SEWQ\uYO~ \qxnٜ'koG0a/_rgSv-XkoU^Lw|ʏ3f0ؼy+;JV-ر#᯽Eף:sI'L#~ exK8z=̚o!ԫ[Wz~7Hв{|4v<8zujyVF.Kx[hF믦fZoΦMvW򿯾Ų,N>X.y!իQPP_Obނ&~KVf&3g)s[hԠ7mQrjZlS_s±0_yލ,.u7c󖭘I [~ Ȯjir}wޏJ|sܺm;;rsW25vmZsqǰz:3E~1xy +Vp{9B Fs]|azudq°,-Suy 1oq?F<狌ev݆"lٺ5z_h^a}]W]֭ua֩eAzuH U&"RgY[mwZ8.|±6>*YYl Ӛ:~_h>uO>|?Gv>\S,\TocӜΙ|zlƍJ!ʗeY̝{2dp"(FDZ#y<9dhb;I-UgQԸZ.;S?Ku'-J~,uӾڴNQ`%&H!FZ3ݏJi 0+ BAn%LO :S%!:v`Нp s.K-~e󖭼'SU5&@TBdeWc)5kԈgddPJrrr)x|Jv·0s3vIeeșsLOFV6y#++ȝ*U2V!iiiVZCF++vR#:5[bm''z"6lĊUg?қNffep ( IDATzu$SNIty&ysҶ aN6Q*EK { UjmΊ~*7o'Z4(ה8_x&%8-YW!}E'out8#.=_?9ԭMmv";(9MӾNԾ&F40x)3x+\߯H,\K#_c[9 {`y{8YbJx|'ߍ={_ih_όGY0wXV~2+/syLvd/Yf%a`1~γOon:osYH 9m[{Km%]v·G͢|N?D^}4Co"DJ¤,źK3b~dΨwE,};᭺o1{߮+ݓDۥ$bέ^4m}·bTu<<;?f܀Uf=6Y/| -c O͙iHi1pnjn~J!hGs†gp *uVhuُչm{Pʼn^UQcC'%L_vOKzQoyb#; ZUyA !A-oZ=f?lʱUi mN 1W/]ʨTm n#,8"۵~RJ{0wB3B,<`.;ǵ6C3bqwXi.Pte}bX}{Ჾ8/.ǃ69+vR#B& zX!V\Ws\}O!W/(D]H8ŝ\8q>1.%*uAe!B!P}Scn2Ux(J 4>CNu8lSM*m`5 rz B!B8[5]Uzmߍ}x튭Tԉs^Nz}^R>,NB!Drn7nv̩ח^8/Cogasu#B!DEᔯsxN/W%YO66N1p>N}>՘B!S_e66SLCJ#AOvNǜO!BfUosYi/hٍz.)S/x`_ z~5>xsT8x0 EqYUsZBETwm"i,ÃiXA0= X+H(lK,`P GQcZAAy3})9E `azLp>d-e0C1 $|^@Ԝs5wE[ѹa[/r~E'vX/ 0MϏ~B9jl=Ci٨e(:qnnmj\z{˦}axe9 '2TBEq&/6:(`6I$l3z }P$j\1!u<"}3xQ|EE?"-j^]2W({bթ.L"N!B@WU%VXu,(΁OӅŪ+0ud7ħ\,k~Ǥ)X%R:XeL_)OJp^~-E~w1w'Sz0i IQyk0g^ B!D+U_*Jq'3>nÆW#*N.#mߧ?g5'œ=6֜g_mX$y +QIQ40"oa5=kdO,ZO冝~^u~Ԥq=8fd)UvBaVc:zwK:ߕ>7w`ĉgfݽq'˸&&;nհ'{6]fh#eSc1i~\pF{jx6l]=_y^j9s9UFr-YfrbϨqYs?|Gx4=Y5^=ns֨/r oFA}|?642>wq5S#l ɠ򎙼1b[[ofwsX<\/ƞ_y|}`Ρ17z[fѶp7f): <|/:Ɨ|\+ R ~.{'Gs3/3*r{ 7O]DnOq;k*:{!cmWɓQI'4K@4jZk?| K tYcK{eavs-N4#y|]n#xhdϟj;IcC1Kznl߯d>ȋ#^;ɼO_+/"S%<=5^,zsCl5Y|g]v2ݪ;A/0L >CY!W4 pyQDYf襎s}xΎwd>a1?vRo+.|ڦ]y=S~b[C^gG*zl[|3oV?=}ygx=:޳_n|3|=Nl? O [#/O06-=MQU)B眎L޻ߨ TM=N**lbb7H9pV\& [$%VfVfhFsZT`IL)]ڴl'7+2a֬ &a@F^X mF<<,r~FVNHӌFz. 'aikOQೀ OYߤON5ef;˟G;N;ml,&t]#=ty^22!# _8^$_3OX'65 rxT"38Q<:xI` }Eߙdߵ[?犲5VB!J.UT- ¤jYqC|3u>ÊɃ,5 -'0 "_]&l>OeaIs%G(;;)ngB,+= nfթU` ٧K;ia*b17jխ+ !ŗbR5N.\5N>PȺMhTf,LXV/gL׼:D=nu6N)kP#GMkM[M4%gf 2) *y-а۱4Zce9%BT<]?AQ_Mv㚉0j+Ii'Qw7ۑF.ZɎQԨ܅Lf[FUUOUD} f=Z-lǬw&7^Ԛ4Cs䁼p]9jYx wsO{{t+Y>{2ףN;6l&7N:f\7pѧ(ڃWȪ;'paox>.]tc㝩 \r_Qzv"?q|=ӝ=[f1sx|3{=t"w|n){ta9pQ'ώ Trruo+<޹UF {Oᙓaߠ9SKg-z- 2=95㊎%BT j\RowP_V\޿-ңy~p/6Mc9Goʈ^ym@.>5={- VK> Nik`K̬N;n 16Nѽ7WnύCGsXL;s̢aSd5zpL;7z].^馇W>ʃAJ{پS%eO̦\|F{j]o.bsVg I00jaOrme&'nY/,laqF!cv=pp}?4 UJׄ>p=8U ٺ5zcpC23p8ﻂ!0|증9s4 IDAT8$X&-|zZdQEƪ!+!'-fIM}([S){04%yeR>~]J$0+ 0LOdbYA,? PngQPG{<cF&>E0^8:OmxXA+31abF6>>vp0MPc/94WiE 3TgAA v.I?P0}ñ 10L haE:A.AN|bϟYt!Qi`ybFg "]{ˊ:a6gE_ PܟBG )@RgJ 7æ:[(C/,0ť0L"qO` 3:tn׭Y\uղql:e44ey&xޡ` cNmT3~9FpW n=Nsl2 ?fBf+ڵAz>E0uПgS1GsZ<Bbso@EEBg]1o303RA޶)WrAXIB!A !:f㹴|;g ogV/J3.Ϥ_!,P8:!T?BȄB!ʉ,P8(|B!Dp|ͰB! !B!D! !B!D! !B!D! !B!D! !B!D!_3,a&wUB_0 L׫GjB@BQrssٺu͛5%++SBTp!m׮ݬ[@)H(B!JՆhެ UdUB_R%ƍbjY" EPU8Ō"R@+__*2˸RvL>H;>e?e,}?ac)҃?e0i[zd{}4vMV,N̬,p*~ipիK%4Nu k"w-gb'lD6]Ȩx_$ѳx`xŜqIp\~|ʏEzNӚѻA#.Q?u?g9&!jo?F WAXAql [yzqDZI+HBQ[J]Z2d\6ʛ͌eT ͗qYC/Ojw&}3϶J4.t0&]ֶoD2n{OlFMs3U{Ox RTOΜV7cXU.xt twa_njԖфOk,UB!D>+MG+hRd眙,n} Wem\rQ=<G\ /;;vY2[s΀Gxr /{σÂ;ju݃}T 1y%l VI1h@Zg~DpLV} x'5^wlb܆t,2U޹=iF>~5ߛ?y&5ڞŭ©Mҋ&ƅkP󃼯Į727 úXObL{Q51 nû/?6ܐݗw޶\ֻ=zuڹYq_ 9l t_6/oHzVGTXv.ݮNf;?V?55M|vn7U;iv-sn Y+w@ݣC"oX[#>bRg.cB'ޜ˃ ٝLޟ ԛxsh^~j<6l:^ПA7G}gLnеo`xc2T݆️C/LLWsktr^̧z1-4[l&P}3{W]̦Y9g <3|&-Iٸ'6NJZ6/X{Zx%gX1Q a1b؍/ |'3=SwwXX2kO-_wtl_~(^~*ύEMj;XXs򰏙zOxyh 8Mo櫿s;#B!*>4N٤ ]j `Y{;c >Oh˲eG"uC30*twQm]z/TEt" H"( Dzޱ MA"E@(=K%''Onfޝ}yw2hjŽ왻39bj>y5wndz$ Nk528tΔdȒmZ?W"3r4 㭝lVKg|:e_HwFPkr3,0aGȃFұy|}jY͎m+Q$ǭ+ ^?HZlܚB ص{S$fz.5Poa-;<=چQ1>ZF|e@ߙ3Q\LaL™ #Yu'놗 ;XA_nfϖiԏ_ɼ,:^>_Kz$|~꣖}׌pE jwL5Zlؾqy_l49Sg-hYy7;/3 s?r',ٸm S&Q3Yuqәug8)wv̲аD>j;{Rr6_͈~hYOMM覃ϖ]r,ˆbw7o΅f3jY|$?kTWE#~ Fnh7{3-aDsuv!ρ,gwvZk>5T(,H*k#pK*'~ zoЬz;Ҹpvz`=3xPY,Zةd 5Ǩt:ʱ#Ys:fX2-:ە˅-uﺮ\E"O!6:<8-W&gnSF5l`J'Q-{jH/Χc(4M4/DB H/ۚ%Zf$+Ȧ,67ޘIKruCB'vg2N*]썠hÊ*(.,bSD @BW*T}$2ի}dx祂 .EPHfrЕao._oF$EFKҍXۣucԈ?yȸTlg=Eo8'L%l(Ȧn] V@W ߣ!? M bղ#͐Pp#Nn>6$~7&F|{غhMts I d "SAN0uGBF{5_W6]E6uYwK&xX^ ~.]!Ptyٮ44pYW.;j?E)m-lˇn/{oFIU@ xj*ōb(y3U נ vDqrң |)ټ5~7EwtsիLS+X,/mܸOɍ|%xޫ"l$%`RBwQ)T<>)o]!:aBk=Wޒ4"[KTO[z^Uf@Ϙ٭_% O 9WcF|œyC8%T<)֘#"u,oͼNHf᫹Q$sMeyQ9ApF QPNw{PBFvcԕDpus"3z4cORh>pZsqo ~Vġ#90{"/Ł;yi@ mr.gvXbjU\5ɹ0TNǩQmc̸Qs7VLg^r c`:7vbxjzHZٓΧ_gۄFL׫ps6NID3Pkg$ PhF(Y]Unnʩ|7c\YМbސc0~k1yNd[0$mؽ(Ќ#R'sIɿ-a𜽜@m4%|Ј?5gBҲzTͅ"qe,&-8wʵΘ=ln j am0vAV՝]CiSYzdĒ]7ZiGS9H"qY!VB yu6'UdLap 7gU޼q-;'6 Zg+wx>/4{;LЄݟMI8=\vqx߶a?xo 0t_ l?ۄu?t6~}:0*d^e ͼÏT$HHjHd2&+5UEy,2$9gAS1i(~W&dɒldATu옧lŹ\khfd*o8kMu:9ʢuHt'[9hoj ͚9sMC,m@es3w?;9KL&ۺsl6ئg_V']iqǩ+sضCIث4 Yu}Z|,ɮj40*6eȶm8g'OR饊f Z<[f `+q{;t:&{\fЎԲ:(+v_,3ۿænؙ̞RX;sݤ)K1E-~Y{!s')?lAOȻ/XzNq m?2>JYϛM`yv ?(U=E~o<{$Ǵ~+bwX{,>zucs̙&|R}Gy&ϋI2˗NfX01tZ:>3̜E0^fz>$Oi1ӟIPMFV1G$ Ȉj$Ɵ^9 ԟkkdƈ<%}^^̒nEH73zt2>e'ՀXKu/vn0`ǙuOƞɍ𾳚 .пjr}4!urqyO8 'iq*/D) k02#` ְokj6Y&f:ֲbvLqv)^O.Gb$dEqp$dټ#bgu%Y6e:e ;;'`(V'ǒ,ۗAd;A?;]嬿!F<c]Neٶd+g|^[g]lڂEg'gIcd[wmF4}Ytu,'x\ysqj%~E(&[˅(W39]¢$_iV E^v(o`4Jh5y2yI.=TW!jV)T+s'o0Dr;oSkN[4߉W;;wݧJNЪ<8s^4x:$Pҡza3ۘ͝uPkT9̡KFbmHh3ޮ΍*|&c &tVNp/FQAqQV$T-k4,o) yIw1A߅Sa2iHFLT,!u.#8WR|?$rF c,؎ ='/d#Gihg0 X&f%\dB>[ ru|P1%ם9RMENA/yq+ךe3ےq;@)C~i61>Zs*2)f/dǬ,$ЎGB@(#?t))? -#t/s7ʹ /".?p">$ѕico/]ͩ(#"%Gr΍Ws=~? IDATkNAM AbnjJYuR$żݵ+I 6[wCP +\2BNJbU]maX\G^Oi1eL_cWIS_?LpG= )smLW61gF/:4ܒ4>9j̎ >\žS73X1}jp/:}Bci,)娮6u@OC)A)+/yHo@Wȶ^ʯ|lKu(, I|Xj8ͦy[3JoWѢw3a{κ%Qp}:"#R2yй=%Gq&=qE1cXWMw1xԾ 1ih,}7 }|5[7Z|xz-\5BS y$DZ;9#Xl:#sp+PCЪFbw^?So^L_W#wN ֎R>jK2_6ڟ>_?}ޖYAv# ]YQ?u=,]\ ׌^f}|xٻޕݲPcqP/#KAzF^%K)\1+GL`F3u 9uڵ0m*+~IWZU#=]s.S =sH;O^p`D6CKI|c1xI_;/'Ʒx s|sx=f6ͼep9Eڵ=̚%]N=W^Ofz<J|endBs~Zpy켜K1]]K/f?gZ'VnfM7=jβ}vUywho,|~83LQDu.yYH\ YאE\v ͎J,ِ?d{ ݩ+&fZˑBТt 98;3&nX ^ YA '3|]];7>4,KYzz1c܃vyv{ c<;w9a j0rVlOGLY 骆q}vmfWs]faǎu|V?Yoi~No)0uҍٵc_/E[ʤaά*n`ǗxA/elKT*IkٰfTm86;g߈6 _ [+,iőWJ8^z7B+nIOFU rhzT a@ 7#?ׁ3Yj-F]۫1Ž%}Ғ85=crȌ#d5u2XOMV,ob%A!AqE@GT=`bLs[%V3ґeHHB׆S{(G'pv<)uo B]"_&XGGK\٦& *ȃCiD)jq$R(W=P,X{#Z㜯\"tZڞ; o灴_-GHhwll! $x&Uw P|%(׃LpdUCtʴDz5Z6/K۶ %vIFM q>m~.r-Qy/ C;/4gWq*QQd\^I-ubH瓓Emڂ@ OkHQ ucG2bqV- fU(A{դQYPlA,$$TޠFB\}P_HmhbTTѲ펤9MTyd`NcvxmBU|l,qA@Ci:lTtIdo7g$s'=Mp3:qS6"xPY,Zn.w$?|≎~G DE̷tzSDV{p>1w2m06L0hWУK$kv)!,sD7bZjR)w9\ϒ$MsBrM;=@,.Us"paHxŶowߝ!"tH k}I/ۂ%Zf~@ x)^Od ###0E3d!#4 %dWhR!2E"\{`~l+?y 8u95W0,LHUGiiJ:Ƿ~͙X# ]5VVQJzkiqĦP0|*!oWz9'=?$jR 9| Ř-%K7bm;gm\F`+Dƥb4uf;{θSX> ObIޱPٔ$_VUC7s)IcIW䛲{ [/ơ) )13_M i{Y663'ġ +A 7aYͬ%,4sooތ\uj5k527!r\@gSNeb*$Yʦ qPIwۉYlOg444;nuU7rϖ+| 'n2t8]!hиaVy\g ~hLH&TEn"~T L713rTG ?Ay9;Mηu[WZqoQ*nnlĐK tiWFrpu:aBK\Wޒ4"uv)>{Ǿ~/@ڕ(] `[>z 3dBPt~*Gfs[%jr@[M#6GM9I*dwlE/oe.Ƴ@ <UOHn&V׻b7h:8]O} ^:ݛO73Pc}[DK8s>I&7f"َHWԞ 3mMFuPZ?푼ooNඋ1xQu3i#cŜ.ɮ(c^-dA֛s=//GRyjnnr8ɹi7PTCҳT }I~)c(\i־oZXc#Cكze00gdx>WuLKq+O/NSin Ũ!m){8ɵSq1)A(S=&SYLIٖɗotbiǍ*1Q#F|85T<)֘#~>7y@K Ou.o6g}.~KMXgɀ&ݰ 9H2 ICRd$ouA-%M'fdHH)PYwob%@E'STL5V3]Hvb,`#/6oSMdMvˌwx$K\YdnfdT r(|k{96jN'JbbRq:fj̍^h;]?9ޞioo.YvueaS$Iv}HqӦMdN㲫lIsɓTz}?MT(_10S>4`0dF,at&lf6ل5Kuo-?+a4+gǟ}(x$Yl-wq,;;$Ǭ9vHn<]&/cWP//ɲc]h7+9֭k=mU1-|_v6E5s)l{;$ Qy׳3.tS]e;s__qssχظx$ߌAy܍$XE&4W.$J`pN % ?@% xF8(OUUs"H>h*;E8(O1B @ dpP@ 3pP@ 3pP@ xFPo{ؓ>gs;&@}'w]<2+}z#-p.Z|@B8(3m 2pnY_wGN}?gNsO[A/S5$D~Uk'hu85c%z=ޥy =X+Dor1BPWW3b|ۇ@! ^ȆdWӨ[Pk)&ş1@ h}Lwk 0M 7R/jաddO/Q᏿;ZirpP~ćv[Ąp.771|*?.aTx) EN7B]IZ1y1ítn.PXݛNaۄFx^;#"]q3эWahN_q2]?}gLvUa+"S)ތTҹl:y]AŰ@:ƒ)sx"G~*wȐe 5vөz|\`!D6u~DШm{Z1`d_U,eOןf "$T;Q>P4|k8|#в?r!üI|w%$L#/+\!312!7kHf]lĎf2:;\<Fae2śD=_ v"g1N3o*&\OV4sy 8{nS5K5R#sRMQ.EAOD?qs+bk{[N8ױxP+o>Cz>}h 3<@uنϗƠsq0&j0[oi1NpE4O:t2㙹qVbޗ@ ;ьr5cH|;y&ear2GX4vn&ɞDz}v:fލx eX8dž]l hlgĻo= v^DMOF}pOm/<oI3ݮgvxH[Y&Wn盝 yCIK~!ͪwkf,1bA5PczmlgY\|?z;dɇ|;ʉѸ/a>bx77_% M5e?Tl8@_}֍XݝNƪ c4o r6~\K2@>ZoΠqZlZu];[7f?!=d瞭,oW|OMzx{@@Wo&sԭU䈈l 4iSP7:´P!N4bHh3ޮ΍*|}Ǔr$oqvs;izK/$#,( ,{~^q# r-s$o <_9| wywHx-L :x 8y}2Fխ7RЅF"\ZJy .l`M:nBa((c<2V=)0K≷G 5Dªh4`0dFy֨&lۚڄMf lš%:&[ϊm1ʣ!FPHxjI)鬁u$Cķt݃G~W!s@SޚR湿ZO鮼75#ڂ@).eAbP-Mػ(ÿM "(%*"bņ4 ]Pl(#U RBdg?6 ׁ -wglۙ9Yٸ6S(䮹|10VSCF2ka̓R;]pƗqp;-gZ3%""v2&%5 )N.D )qs\to88(rry3 iPDDD@ $3W:u*jtE֤TԈekN狋xr QWK`9xr 11/S@ KDDD!4,'NpJ=)APP 11ф|9PDDD *",EDDDDDCEDDDDDCEDDDDDCEDDDDDCEDDDDDCEDDDDDCEDDDDDC""""ίLڞ.*ERWzQ@nf\/j.j) 6f'^= 'Z՘TcL*)HE(P=&-'U/S@&q*bygQ@P@/KкuXn\"/l[O?W^n:~c)e1l2 SO>Izu'%^""""ro W.O=$FtץDEDD.?1~yg=۵uALܞ'\ÉBʥIEDD*uФṴ̈̀Rp'| nps&u.ʞ4sKo00?qdm$G?a]*,,0 šPDDy̙z[RMWoD߆w&~3ػ?`Ly;Ǎe>ẽ͉Зѓ'u2#(QYsgi=YV)z,Θi|9k6eN`³oP?5[Vg6d7aȤ̟?^NU"(ueCo^6'Xt;ʥ{pېe5\ hR$׷!ڿ>s3Y=hƒ4xɣ2kd^h+֣Bt4n7IAq8{L%6[\MvL iC+Bi=-0LLr2 dݫH(P]݈2qmҰW_ P^m;:\߿E\K5DjfYKbz1Q. bco`l_Y2}n+8vgZR5Vpfnݏ^U" vNTMXD l 89n2U r#Ba i# +BѰZ &ȹ,o)ė=P U¯It>\cKXW e;SXq%\ѦV2d'2ǻ 7vq\iND"""ΒohzrX;8r7 [znrsAnNxn=A]sMG1 3bLO)h+-t{ItR;Y=jP$^=Q GӼ,\hx4EltU ,|Hq/dqk.%;ҽ^)J,*݄^ |bxzI8tRը\(ƦyK~rUhNbkv-Ҷ3muh a.B WjP2OebэSy44ͯ)ˌUoX_PҒ3>bd, ӝ{Iɻ*DޜI:ώeHfK]FFws9q=1×q9SSckJNb ;S鷩WRH%8n6nYfoK W#:V>GzhvWl@qgU|un݁i,magk2_<7/ 88SN%l&2_ ezp|ٶUiP?>Ƴ dn ;[o =\ v ۞2xoв<ԃ"""b `ާsLgrÉtO>8O  as"Φ"""rNԿc n*!e\"$[WR"""ri_!)tAҦ{PDDDDD1PDDD@>!ZuO)P*E|S.kgS9Ja=("""R\)+¨PAx6oJo *(W6Yʦnj)\A(hXH=(N""""N& 'eęPDDDQTĹԧ%"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" YYYYA""""""""""".FEDDDDDCEDDDDDCEDDDDDCEDDDDDCEDD.:0DDDJEDD.*۶DDD"""""""""""""""""""""""""""o^DDi (""""" (""""" (Sq."""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""_ """r;~8_%aQT)b_""""9xիV!""¿Z T0KDDD TIAٷ/ѿJe ("""Rp"AZZPDDDDD1PDDDDD1PDDDDD1PDDDDD1PDDDDD1PDDDDD1PDDғC2>dTܗ+ܲ:[{A`7qs?""(E>ػX/ҋ*sߎdo@1՚1ٛIz $4$0<[U>훔&ؿB͝=nh[}­Yt,QL)}7w9!hڡΖT=:`ۿtHv싈mvF||3OLDFO:ӻ}ug+SIHI6C'{ޮM[^˭/`g&<Ǐ6nt'fyw||5St*>JbS=ڜW4QfٜMN{:K֭iݥ?O}L;0xo|g`htRr72鏶/kk8Lz]ѢEk3E-rKpo϶4o݁dgCh2诼h_:mC|Msـ N/sGvhي7>ۋێoG뫛3xf V,-ycִhۇ_q8v&~Ƿ~s'x) M۾?ovywoP L8;<[ c }<̌\fn"U\^mHvb詔z`^> 7g[вs,o&Ճ1~vcٹǦPt)Ýd'xH[FMSR~d! z.]X|qlRO՜XÔ]c&c7IxMp*A>_!u՗r(̬͟_sO Ոa?0ktfMFSM4#WO=0qB|t3'ysY'Ld潷X[i7"}Ηo*_hūcO)99P9-C6i̘6tL~-Չn5rqXDD"O3i&jDXzQ/S;3fY[HϞ 9x1[= >Lu@ Zв;==Ł#jDߥ_LTP$Ws s.㉞5)Fw' zoA 0ЪE%ٶIy+&U{ѿmQL"^?)˶qD ę&t9mac0wв);k1oWp\Pm hvY7َ!=jQ8TWW"MhP$G,ȂEcq*J}sYC?BR©*WPnz6gad*/g]I5.Oը OsFB+X|jׯqdE6isl?n3Mzоd z*? et^]&~ 7v2Ѽ(Mt!h,OC̟*]:SEiq6RTW]BA>|wV6fOav[XOe`YK>k;LW_n-ռuc':IaoRlqO +lQ8F˕s޶H:zH1 V+'Lty#ᳯ"Ml\ m9B_Yw{h;N:"njAwM Tnv~ܟn#7 P]r33cs0YWtHYv3n1:M j2{ׂXEL^xu(ޑO(D9v:o3bNуoELj7֡K%uVZ. (""lF'8| UrN)x#.(^̐~$F7{̽I/'hzf+0-s0ڞ`20S6޶u㹗yMatc7lR`#-\[9<ȣ,6iֵ9oOoSWcL  ,'[(.k╹eXkh0HHgvAdDp(& կq=xc1v,5p@ũO\M≸W ˲`F,X &2?h{n>utT"]G7eZ$/;u (OWٌ?4mҶOҡ0-""XkL~[l>/`^t>cSd'ac7K`4ٜ.X ^3JN, m*>~o {-"ml9M&Jm m&my75~_ié} z^mHJ'1.SrQns6>qZZ'-hw- #{|l~Ƨ Ӷt3xiQ.7GWCXVX4N`%)=εy X& Qh:PJ w}jێR mgH Xמ]Z'ؾâB UbvQwHiDZ3q}v(qT뺅h,)q-]+{I}h^H|xb.Z)?[IƖ yz2;0yh8"s_v?_wkyoc,:wudh<675I+Ԉa=i~uA&G|:Nl}=O']>#^mGչ%MCd~š䵾{]<2)fWY/*vm;q (۸ 9n'nhOVhw0^ș8.׶_C> "~g=hӲHݧ_Zs k6A5܍}:x ½[Ӧ=|F]^/qv`_V_8~88m4S^,mw}@MiU#Gn ׏{b~;仨;sYνjP:w; zȞ+:ηRٜ@n)paD5$6G|zDB?g/2o{ay9Ma}c}eyK㗻L,nE8eWn?\͗B@ =#e4^jg?7e |/KaxX~\+Olfɲ4Ulf4_߿{>ٞ}ﭷ|ݞlv ۞2ooв<ԃ"""b\m4 LWކaL'w~~-V̙wp2sy϶,o}Nr8s6\㕻Miye|jDzs;{._>LszD|˕'T{c smw=}cN :M6)ֱa:\d~- ף^y|;]&϶8s4q+᥼FGydwqN18ѹ? 5‰\r.Qɬ{b6fhIw{'>w_'FzOaVnZq';x`j#9*т^@귮cׇnx;=؈POuU~>חҹh\EDD .W5%} `>j1ؿ,r b G,ړz\REDDDD1PDDDDD1PDDD@9SyPDDD@ #%%տX T_EDD@)UwbDD\/.e'%%vRT)*)H m' 2 0J*EtTPDDDVTtC)HƩ3&yq q q q q q q q q q q q q q q q q q q q q q q q 0 "ˊau""R@L 55ͿXD䲐a≈ SXQvI刈ds./_v}Žm'12X>f~A9fclY!ԿVDD*d?x6;;ۿZDr+^ŊW}q疝0 LW(suxĝ,ތAs F;2vg^g^|3GH߹?_H x.)@9;# by[%yX|UB!c">`~Ƒ S׼.u)hP.ŊSE9 $j?4Oo)U_O2^hyzpjSƿ/2ْfrdymTwkc=)ѳ )>捸熕^c'?ʔq O?+N)l䉦e :+cs_dN@;y{蕔 ;ŞY/soPmI)Ra%r92"(Ӹ;m+e?1 s/GOvoםL%!=g|ko>@>^вU[:^?qҰd)uo/ڵ'ݼ6odywY6INߺ=}Yg5əЍthՂfsGb nmՙ! U}u"\<ǮoD#4-#0q-.]ۿ.*.36m=CмA`F ^ѝ{n2&i~5reEq6+k0:228~~ gѴKː֓׶Z #oO\5(/c|R_^| rM/a:9ϋu~㥧d{41EL! cG2%dŷ); -Ř6I~Gx^:l;]_ȴ0f.g˒pm$F} clK~祧dw[yc{KRzU/Aȹ[bte` l\2IX'u+\ a*T*ˉI?֯?AUθ|ŝfKδ,c'4\PDDā΍4mڌGQGU~Ԏ61B*УG,YV*Qɫ6s{R Tlg:V E Śj;XK 2X9cҳRA^]m yazW$^ $4OHg󄗙h.r_64m{/;Q^7EDD &-1Lo_C1(_CGY\W~~ qP73"LmLN|oDFm\ QA==+COQ:lq(I4xHILyo1 0-2͗Z](.wLWQD{u|30w.\Hb\3IJml+GNә0373e y8aF ,ԓwf>Ձ6'֌Q*"0B23=6NX;/ٕxzTC@ALZ0+3?Ň۟qwE"""fS5}ZHqqEdh$%_y) "taxt jűIdCS#8d]3&oЌ$.&J;+q遵ǯsviZDFHta֠5#[0/u3m`RcypڍMU"el`I m{,_SZRgUgq̠8*HljYV+~:8@g"""nRww RJ%bkӥS8?U2NƄ~Y77[j%%_4dr`G| r 媮I]xl<Ǝ?vq"N|ST,{opӧ:P_o[g[2˗xy~-ʠ %`~$'ɴ,ъqm΅mkh`͸ybiM~jgpINgbŬߗLX'ٳ|ӷVB~JHq =(r"JSP޸AA큯3Ѽu{g ,Õ˕ ;i}GmB(\ OW@[a[eaNET3/pS3E5}Ǩo潃'7/T-K@[ c7-IiWqA5mK, q ~1n" 5[ټ;2[n} =~=Dև +G^fPP?2nz3qߵ jKs^򮅌~e[c*SC_ځ:{,ޅ9xy}ͳ7yk  {_&3yC}{;類,m۷t4N`` q\2yy۶9q)gYr ::^f W5ҿ_;3;|}_se6}{-ag8ܼnaS|oв<ԃ" ̢~r>Ylݺm TRտ:'NALt yŒeYi^J=)""cFqcIǨRH*U8t̿ )GD(?IDD)"""OQCdeet "+F^&3L4.ϧ,""""""""""""""""""""""""""""""""""""""""""rٰI$==?N]O6mh=6d!g~OV/[Kٰ?I?(r)O0upw~r\k7?VHȃEP좞z88]><ڑf Ya,wۣ 2e揥؟e.3B)ۨ)UϿ5R4spczMhP$[DDDˊh=Z/YLPI pd ar!s)PD.63|7{] f}3;[gE13ܤ%pߏjQwC_`M?!'x{>ys4YzI!q黦7S_ Rq,y%SM佛JaYpF|v Κ0W! N0m }R\V}OGRX{Gvӱ)f}3;OXD_q-}a`.֬?IRv!-&0$UkTpH6I[cLزe⸕I(Gze <[w,J\T+MGXFbt D_ьщ^w϶ܜu:-[vtҍC)a af(W={9K5gDDDtMeJ;ZsX8#e'+jɧ?Naڔ)|7;b䆮Uȉ$0byK1^2?L'7yfAq3X0{"6\7sMoGh̛ /WϽ4־۱` ɈOVrߖiEuu<-SϦIXWe\U͚RlYj֭HC+qMq*\٢%M=r{m9S-U"XIX}(ې-h\%C)~ٻMhѲ9Jd{nR[EDQ%#?N/|+Xd$= IDATa"_ޯ9%߬*##نNe*G.Ϊ?~4זʶ._.aW7Y9 ѣ3&`y͔>Qͪ2zav^gvN|m Q,W "E"z0,|>y)QS`)J" l8tp\8V** g]n¡G9REC1 ^šlJp[A@DBL%݆yהHKFUn~7{I~̟2({:И.,  Nca) v*i  4)T˱8 yMgG<;EY'm>dSq*ރwS)7<5 2br -8gaago6Na`HmA;OAs41 \aDECB|Ja]8=6}aK౏R4;a4p'H9ǣM>=ucvN# '6űI˩HMNA\LwT:#$Y{qy0 (B)zF uaƔqgاr3"R@ǖ3Օ42v&}9W{e`_8uR% ޾ )`4lA+9>+'fY6y% Q疤Nw#3]$mc (N0‹Q<"]wF20*Rl;J nNJ8zPD $=3?cց$G/C Pֿ }fht UκI ?Odʖ 4?pKD.ۙ y,$p5Z=$ו9KED.:L'tRDDDDDCEDDDDDCEDDDDDCEDD.*8SED.]vq)8D@` E@y=˅my.eY\.3_,"rIJKM#,,ԿXAzCDEF@U :Z.33"#+i|_a[iDFDWD۷ҥJ~""TiiMGIE!J*MD֮]!(((J/_uhN8sq\DFDscnN^ks=ͩclDDDDDdWEKDDDDcil;7(c"""""r޷F1$""+UWյX;0hӔb.V=Ew%/WU,]VMS`u]QJ2fѺA=xym#u= ^}3ng5.[ij,]<.[wݦmT-Εhh""^{ sm9ø.oԊu65ªnssf=u]mm_G]<6(eQ%k1ˆ)qx+Ǐ dž z{{12ֲt0RrEDDDD e[u'(eݸQ%Pfo[uJשFy눈Z%oZ5:i {~:""""v۷ iRu^yoh:""""N[:aRMdդ刈!Go|5!WvWG5l1剈Ƽ8qעEX|XR.9fc9<5QV[yF68 '(eJi9"""l0~[Xz*-^?wNy8q`ީbŊimX<@%|OƃǫǦFѴAI\h)_50Џ]Ewǭ65Ru#pMq>3 X UO; o_>po?:ˈ~y0}tL2[n%:h:Z8Ðq?GPmE(:J;6(EoNVP70Џ+/:]]y_Z{JOW{k⾵xll8~R,~% ܟn 8s0pĉ pk7,ǞC\~8CZ^EㆳcƜp`frGpᰣ_zu `]SGġ:~<bspO|'fcOՋ?9a8 j&>5(ZZA)/B9/n׀#""1z|/`f-ܜ/}dzeO5lppּ17'l2L`iӰKpιؤL'^jbGp׿>:g}+S}w-76~ݟ3?t}U}s5}[`%U&N„x5U,R7nQ8~7i0}å ؤDsFa{f+}qT&6(LP*ױ`U⟟>#`qn7x>Scn1oo>q3?3ݛbʻw䥺b?{n k^Zq\t荺0G->_I؋iG}'wO?_y T~վͧIK˵EFhi{7~1=k"""r+,838kwuqyo9%j 68?7r_h"ƿ3\E,8n n: \hw|qa]wO?vliޤ\p!6 O=4vy'u]+gqoŏmI}iTdLN6IYo+_ŪOʿ(IbzT?6T`j߭2SR+]ZE5+M8y?&]6٠T6ǔ)ㆯ[B:جfvm|VkfoPú1:6gorznDDD46HT*ri8˗-¼/\P`s2d^b?ށǟ=D^=oPv'^t~8fMyeάٸ[pRn&e%܈ٳg3Gݸol\gUV_q/~P@VCFmJXӇʣ 46?'bJbҤ V1I?a-ޣO-m͆IUپys^O ŭuu|д dmϳk""">d\-)_ uՊ(م|b \/u0 [T#lSc{e߼۝gD淮G:^Џ{]`1n8:√|?Bϡspv[c뭇m̩O'㉻nÒ7j,v<6@l*>3w%nQ, xK_`S;]ATR-~/ކ|aYu^[:)lӆ,EjOPbhꜷ_C_.bQ3;D)^;97= `8|nhv:K8+ΟʶT*xq7NO`"*xꩧqwn>{|=)Gğ}kچk+:s{muӥv-z\omc"5^](2c'7q]j.=*&nsTYxgADDDMu/5#6-9f5ytA6 Ug>?d;kـ8Qކ%oF3ȋb (=7F%"9w.;צ3ɨ{Yys+tC|eŀ@""""N#jt.+&?6ڠ iu`c1 Iu:_uo+1=bVZN[WvmP7Zl;(s{.Q'IYmkssC8eoP|PZx7ջ1\F)QOIqFzscVޠd޼uenڴ{]~iZAb?g2::WC!Qa!""""ҧU~5A_۾Xٵ1/%FĨO_/E4y+DDDDDf_C9ˋuf:C<⏏֮a<9$tZ;(1j࢕LaU1t-`2:I  u7E7(a61_iqـx@W2u%sڛQK""""8ňء''"T00ۘH\Ǥ煩l<4SdyyڎcfF %ץ:uqq,@WN2V8בy@/OdZh,PjmC&@oo,X<EdLΗ$QU׭[ןuS}jm:t5P9K̎2q͋iY?Ab6̲qovC7$'*(C_\w$n3lN䚲ͅHU0DoT$yq=bDDDDebzԽͽ\:ڜׯ:Žy輦k%,ۛ&5GtN:ncP.Trߐ@kCu!cה>-sƐFDDDD-O޼7Cdn~{'ЇC:}]ӯccF2ay1- Jak/uÛ]cʓ`x C_S7'QR'ו505iыY:剈ۓYыIO(drUsHvcrsu^!uB:-Vڠe ^=OK$kjIZқAnWIN*_K6ؠd-s=ژܓ'"""jY:iyb6zaN{;7wE'v⽆#0ׇą[+/U6("F+q;1З& Aū,` jԫ%_hVdSߧ7: ʼnFPBMz<7 q1Db:.s}9KQrz-0HnH\Ǥn͉>Oދ%ock[y7(ޛmV#ڲ֣͕Q@Mr$_y$޴Tj.Q&CoNtQ'^Mb~О+=GZo&"ȧ%:I:CF~v-&^>@z>kNL->IDATy;u[zxo>@HĄބ'%!8IEMl*k#k- !ae';Qx c כ Cj$7$rlNmRoc"ϣs֪ J iq$ :ax <L\7*"Nr=9$dO u:l^ҿi:fwMٵsvs"y{+k=ɇ؜]PTڠX1F6\encHUQ4#J@&EzibVd-O[fT^H<$N=^΋&͹evnk {OȦILo6teZ}֣͋5];6(17Ro>~ /X\[Γ /\-D[iz!"""j˒v׌^R"6 Ps]'fvckm>MRr!T\5Hz!yћIͿިTPdC63qQs!k9Z; CZ=eP,k [kd^j.^b޺iޠ(z^ yS"sd-jכ8TkFAγuC1d^LˊDDDDcCxQަAbHFo:l\tKj%fyq/h}7(Ybͳ4Q9yF`y2_CVؗ@#K]\ܮ*RKDDDԉ4¶?k;ףۚ@~$V5Ps}݀xB:e4/M 0ۼsM09k( Y*7Mo`!1Џs^CicH(F9"Vm<-f7.WB!$yHYZqk++e5:Yjhc6/1+uu5!1ӼZ;Yy %"""j%ϥ Wc1]cMDMG(7"'):7.4ܖ+A ]'^mGay{>6^]XV܎:/αBq"""Mtk9yW'v.tNv C%M[F\4]ӯ[:'գ Cu:YE󲶣q[cs\꼘~jbsvc6'lILMmbr3B$7ǻtNܾ笜f IYEjZpiju.TgkZeټb9«Ӳb^ejP5޺l\|vcyis{'vbiemCkFF/$4gܮ(xhn|v?A>4"y8q}e͋MQ:ss/O%i=^Z܋鵮j%ns6/sˊ똝۵mSv#vnν]:he ܎v.l,kme剈ƊȦmr\9ys:zm枴|Zٴ׸{1֣W6ud^Wx9[gYvEc[5ͅl^ޜۼ]{5ޓV+f6zEE(sOۜۼ^5/DZ.sZ7/qXCqjdmǬE9®Fݠ^onavb 种wm;*:DDDDRVl5v.loGe6 /UK'|=b6ܲRcI>Tc_GtΫFW@zDDDDcMZʅpNx1^̎2z^[ YMm=\;jh"v]D#&4\QQxY5ި?aמjrkF#yju^Cok9Fȹ&ȹVk6UCDDD)ZTyyhZ[Nmfy_uևu""""RV3^:Ej亍6=?F^si97F_b44eDzW_/K""":n)ʺNSZuԉhcԉ{Y𤋮4hk~u]"""""huK7Zff_hơ/Xh[Z:DDDD46jЪituksЮ-Xn;u{""""l԰a>/ cr3a{@DDDDeٌx؜g=""""2m,l{HDDDD7 `sZDDDD7DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDTwjfe`IENDB`kraft-1.2.2/manual/images/de/pdfpostproc.png000066400000000000000000000667221467704360200210340ustar00rootroot00000000000000PNG  IHDR7 pHYs+ IDATx^g\Igw қt`˩g.^ީ+*Q, (vŊ"ҔK!C@O9=8ff2vlhxݻ׽{t6#SSS pHh$̤3G?hgH鴆s8lT]KV!q8uAC'5!B Zq Bu1įa$B!Bu1B!cBK:Q#H/;; SSSS:!/qC]z4MKgAŕsӡ0q}0#Þk׮Yfyvvt zbÂ2 ^t/Da\_G[Ga9s!CBP(Z^H U^;&Nl!囏'Gw9}j]ZvަϤhٳgcnj)--=yԓтD t򑱖&榖=FLxe(Fq7AVcaieF&&f>IP&"2:>oD^/S!~P㾖Q?ŖPON`J3L;*$EtjJ2ͺ: >f{ ={ȑ#?|wm蒟 !(H޿lmNNc5Hl;+;5.ds}G&wd}9EO\rl8=EGedsB`  H=jqDgɫ/2Jغ-jyWVM)å!뺄N~y~ Iu~澘4L[]wh.AZ M)yf OaoĻbYn#||քnNl7R.z~dɼGʕ7Z,3L5ꩋw]h!Sժ/yr]VƟ>}ϳo.]N<%//_ZZ $Iޭ!]Z]vdx7Y=#7+ Q+649o1thJׁS't`.?qJly ?+ضU˦.r[QtJol}O~j[OLH)'.jpJvĊ_j^?p۱9-LXe2UCzo]\(j-Z6:򙤵7aR;hfgQ"O^ПDls2Gv.a tz虤7a>/|3NxE[ ^_4ܲՊWgN|2P#V?i! a5M 4F8ry>..]\z/V\KYB˫ b1TJKɠ(Ȋ`1ƕ )^Q eɡdԻlH@'_}v&,Y]Q S*U);Zbii!_Lq]u}zY[XXxxg`\koC3As|rA 74kBY̜ʫ$G!//#ZgupF!g1ԖNYR3HTgO7Bt:T&vE'ik yZ6] -5[_џ5alz j9ZL3[ũim+|]k-6!k6Y֪mIZz!#$Fc8pxO5 l w!Fw@a߄Ba$IAIˈWaJUS\P&)W~~Ϭ>kWtS jBk$ԂkhȊQSW>s2s+RY@U$SgϞ пsO#{Ź]v.]|9?Wy{K뜋sxqeоaw=J/#H("\OvSVኣ[JU{ϣsڗ~3Pm$PP,Ƣ1${Q " 4T@Hu۽&Ua5aRAMrI7/!_#!vĢEb#8 ?phQE'xAz aaAMrYb~,]Z\2@s|/SLVxAݭ3K#{Ʌu&]!yN}}wul Fn:<UkEJtU?]ؚG< ܬ|WCV'j)`={ydF48t& dK^5h굝)gBtZwFX<BZV8wT0x6r}1T&ɋ"Uv: x ˱ e`elPB! tiRc3*Ĥ,uV@,XX@<}IcK[5`Sn&I~(oJA~nb)<Y}!e)}Mܺ+@@g%I+6䤲Rn!0[ˇI+Ҍネ.kr& U&R$BUt*Fp:T:¢VsBHJ#[#v17$Y6yBaA$^3@!Ԩ=!B0@!P]` Bh1xҩx<>-IZ8:!h {_x}We%Dҿ޿OTVRΨ'OkhT7sƓ'q8%eMIgTmC#D#͑Y_N?R!\.AJB I(JQQQYYY:‘4R!r\.W:i}D!z?B!8!B!TC B.0@!P]` B!Bu,(YZZ"BAM< ++@_OAAA:}׷>Bգ⒴T?Cd| 9!PäLW7)-!JKK0@!2yȐ!B0@!P]` B!Bu1B!cS,Hg4(L^t9@+yѫy)-}oj:? &'|AߩSh з!jKܗGW53X^8'(i5n{{e菇xHTXģamz>R0al&DM63S nCC iC/91Fˏotk(dۋ;S]3ٮUᾧĿ"K6ص)o:m\4&UԸLQQHǏgO_O6?tvpwy ޾oz4zN*lnhgAL Q9,ȌN@ZN]QAVQ*ܮ^nmތN lAF2K^!l4ҽmjkY@٣{J.cTd%2Y=[= !ˢ[7Itʇ'ٷȩ]Y"VSbSl !TzTdQ-3oFӂC3͆:JHtGҼ /+H$j Te5 b=ά۷E#/jI$IQI@77Œ7պSJVs~:O?uȻYm:'+PUlW9)l% \^Y:NtnVnś\ *XKJ U4+xXIi9Y91cDB>Чt7#¬;s/dTPS_X$#JэTUWCQM ]/2'U%j lgϾ9ls^*O<x.6!)~aGe+hkKUEUE4fRYEY\ 50d]Y}{&W@t'^ FC:Q;#Wp|- H5 UT( hZ~5wl0¢:(.QiC@ʩj1 *j2=N][<F=JMMMsUl;.BGʓJj*ЦZ Y$IX_Ph}ͭVR˥rr`JH"Tmgλ>rh]·ywN>=2H*]v/"tAN:/+VBPjjZ}W5mQϧϿb,8L+Uyd邜<>ð BNg} %,Gq8&S6B}j节O/n$Bm:艦),;[.d节RљF/7'$tyֻ7Z*D=K0%!1['?X^þҟg //er Ajg4T$=kr69GS*}{:mmCT!Tgvۑy2zZP@&\^@or%}&N{RduqsUxA&(1yN`J?G&| Lޝ RuqQ{Η𢡊<"&a u_!L9:8AԚ5t\x`tZM{tMTE-,{'|S݋lΪYnsֵՕM wO)G-]ZMW?RPyW樵msnBauw߼Nkj(w2rj!]: ߵmT sT.R f7{֍ oЩ6vy;,کjs]RH+ZzjT4)uw9|Ŷ.V3 EέI-FiM˖& x0~ybvz7몤4)}8׷ْuvo~:F.^Jb9w^帩]ki!!/NͣǏMSB!`0 a=3 B! !B!TC B.0@!P]` B!Bu1B!cB! !B!TC B.0@!P]` B!Bu1B!cB! !B!T,^RR"Bg JUiwY|>_:l Mmڐd:◐%+Cy!~RQQI0]bbEEEϞ=9t߽}}vyhNBDjZz@ PPRRli`.Q);+M@nݪuvVtƿ'bx`BHQQ;W|>ÖN8N\_C B.0@!P]` B!Bu1B!cBݘݺpk9Rt׀b:8WF :ywsB#xq:}ɍhafb3pQm9&;døIzip;}&7ewj$Llfn>mt$>riӦN˗Cv~CV1đqS2_f<]W.Ѩ?Z0gX[4qɾJ>/%M,j%3x?/?)o3Gϫ| IDATi-gn߽0̀I&?CBn`e1F#S?ϛ%D53~ЧEQBJNNvqq542JIOO/^,_bw|-g :!FzՉ\I|-HhT&:N wR"7~y-OWgv?+]FܩV}?868Rս= 1ׂں;Q]|78Rѹj0=vמ,Զ3O%709;;K*j6g.{Q:Fz'&MF:T<>%I 4553zԘѣ3goEohXCdQ]q!K@~98p+/zUy]1ݜ|%:N1\O^ƒWxuM#F{+`?5) INvׄ~vp@rz.P*^^2a˨U!y{o st41dÄmO:(yWx7xL J4&֥}V%Q@:8R:'6g _&1cCWi4`/ 9iD+]mL--M;rcNgkenl;hOyc,.=SFΦ j2t xcRx7N ztr`+Cө!EK>,ͬ]8 @Ⱦ+?Զ߬Cܡ?[LᅩB}Z.9R§Gu0:dŏ .Fȸzv0u,E&r273^#ؓI(8tT]ԢWinQcu,:yÝMzi1?3 ̼{^C~\(9+v.3N /L]&ײ;ɇdY+w8L?ܽlo %;юo޺W˞y{U0Eb?y56Qk݄)<`kuvu&zq[-teB {/_<)Q}"ϭdIgz]);:3"qg:lAފrA,o]m:;{G4g߇^Ng%^m}󴟏C+Y"6}FtLmϥ.}g|=6w7]B3@$Fwfr+Kg$Fތ`WXw6O[leo:Z\|g[uRPޣ<[+RR=2՗<>lg'-y0kBYͼ/4"mG DGrBóFywᒄl=oNzȓֶ̤dn(@w4-Gifֆ]:oy|uqgkT4&Z_zDlS.3r2=aL,ܝд} uєax/c$'!//:xV3?WZѕգj;lP[EHnWOdޥ, E[~Vh)6r[!1MNrғ!(uAΚ3”&vj#L2<5slsqfmde(eK.ڹ7j q#tL tV%f3 Eȶhu3ho&H#:wo=9 Orj&KGjw焋 <ǥLT7PHv.2![(ծ6 ɍ MO:1:HEm,?J:=z&],r5A~-yZ+0muvh=%t֝+Nler arםGN0b[ѫܺo M۳pT1]sjB Dž>at^#w#D(Xl0Nõ'.ZQE.--<RRc,SrJ (!erT[iL(ks9Y91cD9B>ЧDtxR,Ayæ 7PNMU@9ؾ .$hb%tafViyna+% W q,ېֳzqk %+Kj;tW7qmT60H?8N`w}xׅ}+o @j+E<A#2S@RtGN/8Sz-E쬬FF% ( kN/nb rՁjʬZ4,0E//{1> F&>D>7+ RW__֩d؆ l39g6E_[Mjn4RASCAL$-duO3~]z%f*S-8BFZ~rA <Y_ 4*|7ȦEkQ"UM(aFR||e`ժyD &n6µע?gqsIjj/:WUW$;O"fnOc6A*f ((555-U{3+LNThĢ3Ͽb}Md!{8WRIME#TJN|hjyqxGPU;*o7nݘӋجnQ(5R:p΁Ӣ\HѫN?h0&9^#*CBU]M hJ{t>yme8&sVlC#4Gw1S׻ͫM t测:]$ RUK]CM{%BsriP @-!45n}\f!Lr,5la3MR#, Gk_:m}m6lxaʋ_a$d@?jI$Wd}ɢYe*h?&QruR-Z#_)SΝ H55e&vdo;ڋNdGο+ #1j%UB%J-:+ yEdoM<~>y|`U!r<AajBb.e9wOQ SSW)C0I 5[6+6aL=K.yE%LvO075@e.DȺzt^SޫG:7ܵOr3@q7Pk# kn >V%\&jF#2ŹL8|֯h6n M,Yo_2{vc]"d44UZSj<@[Բ 츰fJ⨨ȤyWS.6tҬT}FPlqG.J8x!mYs5ޗ;Gwpԯy9Btчo+h uhAyBˋl-M<+ni(f!{ yxk' Rۺwv% ,>jޝ7ShaI7ώ.[ry QQI-jAbQ7oEݼ`BF!8]\No.: !gl{㢁,.n~ʑD@F;-jÕe;ețN_7v}uz0R%8]߲xͣS,&cVZhd;[lV |㷡geڸ::5a,e=;GXVg%4G䵋fjhzSx&}M9.࡬b`lgJ`ȪwYV!窪2i6.;&*蚎چMdH zx)+uwvѿVj~g>.AV: <V>{k`j9ό\p@e%9mAw{J7ߵ}vۥ4UKtsŞ~*)e}kB^;d"lAhYox[P5`: M*dd[_} A|珒޷7pYYŜ=g[ݽSJ."ͼ6n[u|s{W5m9jF| ni=!,JvVmJ7' _UBH~xxTbrr?a34+%cc#kbh!$%e/IrZHCb?lנz뉏Bē I QUyUVAJдA@WV0*ݓ4!)3Jdh! 8E;*4De?*(xջV}5Pqê*Z&/ U3 %dHZ?Umbj>TN<ᧃރUFI(* J% {$@ _1b*g(?j[u斕l9RMuk5a1&_%[VVVҩwO"zzz;w]ܹsV::a<٣t? _ HJ HB:r%>IkIW><@h(J2|QUkAyUUS[v߫!>ULjC-[Kīǹ1I,Pz!ZAjVgTH6fjjz~skZnr$wTMV/~tjO^ wY4Vmkq]8x‚B;Q A #PCB5{"N:!~!j0@!P]` K/  k◠ _T?BXA[m6x <\шDucRKEşy!B'%ՕΨغu<_b@` KPrm<B? Mr*饥?yWQ!822\nf6!~*\(@!OrApg($E))));d` B3 \.?}0 SB!Bu1B!cB! !B!T_M|tBf545ڴnM8UTTуH!I<]۷޵oN:WKP6bBai&;+[:1/ p8xucB!!NB!ЯGcaB! !BH!_6`rM>,tmz})NoS.Skxѫ!jS1D;c:3ho>t'o7*f֦~EK3m;*>L^S)x)g_Oo{^WN` ۝<7nܑO ej̴!*tBgh4VQ)9:&St4)}qh+}׾fÈv Ʋ72%m??|!q1?d'h6i2zv]51@@yytRds_iljxa>ݏ~~؈0{qik)|87G{[7^0ۦ pvst<% '^Z7a9'^J]Z?޹i|N=>v[wMeɣ=nn}lLJ/5Z'{['ϱk.&S2rt{peae%ho0h<9/NN6Nc^z[0!7}Џ<S:{m-m0'ݵ?tKM٧So1KOȧjU_La,aeI88:5x$>١w;:n=Ր1<=<==<=]-?NRo2`_2\-@9OQn,Fl-*?~nn*&exw S:eɉK&{qqm]X2BHyyA3<<)CM5^ZPc=3o1 |HӼŦpFıWv|Ƨv+J>m剢[^ u5m9n'yŨs>Y O#.<{מ\|ag3}RK7o݋+FFlwgg?2i}wn]w;#q-:k!^=l͐mN;ZSy*“Wf5ۼF!^g5Y}Z2mLSUQ33WD5v8ZSvDT8Xȓ>YXe2OtM윭ڽǀ01I:==}<~[.s|kBOnV(g5g"##.Z9FL]svpڕ]lXyJ4 Kw\8<ً!/^:Q[a{}驫.luLߵ`jxaEo t#baiM3 k vofBQU8Z^?PHdI{[ BA]tEK>~|ŋ-]&+++Qk T[3Co?ԶӲnp'Pavgr@6n^MGX??+[AK)%^hfĜxڢmS9#)Z˓boE @6cuse9Y?eO\}Qsʢzl ϶ݕK-<̾u-tǛW?vb\(51h"OpuWe!Lt!Eؕ,#rIBe9w0@9{ȓֲ¤d1Z IDAT@O^_kN!O t#McM5Yֱoܽ\ 9twWg"#-ڑjcbz_#-sffVn >lM v3o&kbM[0,AJ1׶w/D>RVmFGA yL$ة[;wӅ5\n$_5  f͵W' aWr,E0vit3clX&i@pkHܥ  ]YU OOÜ;fN#] )`kYt#jLׯ[pѢ{R/\hU&ˢzoNWe<-W2l@Rx>4R&ʓ#M*`H#v_ (a@L6S `m#:,@S=FW!V#yyA-:dT!TX$C *zgUU|RRUC"hQ|PYl[Vm?؀ ̭xmN`YT A-XR t1^Jf)2j/:>0EOeG%2 m|pS q3&<͡Ǐno8;ݢ윲sRʀ\W&涍TM1"4w6 s*,ZId #*F**BU#jDa%K֮Y -Znt9T109Rd1̷-:Mǜ%_73E+b{_]Rty:,?o]Xj=}6yN̸0VTd[ĄV't*f v*P+\Unɛ2ؒǏMi]k,#BY=mqg劭TSm9rqէA D謈ٯoƥ(Uu5MgUQU喼*PKWEU- ^U!i&֮'`xyI/.mzU- :qQL 0ɻIfQ0Y>+٥Bԁ3y 0cX)}RFɜY3!\Z<>?:K3$~ZkJ(22o/fw tA^!G}K 袗tijЦh~-Zj|=J< >Nsi. }5qq. 3  *{1V_k:GkjmmknQgqU* .2~(|/_}]LHs|{# ,Īx4OwUoզ_7\xɿm>{SBA󪠠UAA(B C[reT]F2]l!xٽNƴ>F {mm~aHH6`8@fXQM$갓Od&U\MSe~j錾A3xl[yl<4N9y""Fn/ߺ5tʺewNrr[//]( kOH}l+#Lް|OҴikGa/Vlm)cXgq^hTʷǴ$5kb;T*vsXg#sCNu$ĐiQmfFEV淉HH. TjXa)%+',H ]i aZ[fgF̜dk5w|{gGX^hI/9:\Ϋi/FZgȼYKW̛:|2эr4x҆eKt~K\62aw77qcŵ]ԩӞ*!!!^^mJˡaNM@%|, d2 @} C RTM$JJJ{[!C <""BRP|**""\?aSly굫|== ̔6F9 Q.(Ja -.X B(g!aJR7!@d2 EFFFbR2b2H8>uRU+ZXt}G(222RR,d>;RRR$ĽSԮ-}P+; JL&S*LōqqK$@L&uw7>4drAR#@ TRz?d?ue2Y)Yd2ad2{r&)_3pҥ^B|Įۣ4CD{w}Q,=G~srpVR׷YGaYv󖭛l=z Ub}+~Pdߦ;4厯8{'ͿbЖ(> coJ# B1͛::{唵'fOEб\8qJΝ2L"sY̷BVyؕ<pSӨ^BEƵ]]'\&\m K ""I1p7Nfa㶅:= Π=RBA5W!++K"6tȰC٣+=W^-Z.[% DBꥐ hOȅxTnҬ'n8wm۴>bщgHsb۵jߩϨCʌ?xmۭ_煮2ݺm^~Q D|/C>[y毠[tʚݻuڭs.%"UFngȜ}HH90O5i]]Z4kթDD['Ѿmvrb\sb^m[{ AT-Ѧ9H$R#s;g O|>hV Q~:yn鳉JHu}ݘ=Q7]O|OaWDDzM:ƓBNv>)-<P-=ttsf,ӳϗ՝K_ ZYNu\LH~Ʃy}1=cY 5iAݤ9udұ]ӫsG~3 ߏ[qSwjtm_D}ẁUOo:wOU3=9R^7aޭ&38~_Ӎnm։NY[w8C hbLD˿}DΩ[o%"՝ l8,~r"RoPooGO1⒕'S? bͤW%ſyjlר3N5rQ[?kMާt)pV5}*$&&N (%!sl,z:_aηI1?-?mAk4 |}&%6ӿuIJ䶮ͯgSE g`ZѮA }^YBd~s ĸZF j5+,޻x!aP7b dggwpvvv®\qwsWxmUkq%iu;[qN>!?774٭^ExyWrhSӦ;jΒB4o"USua>BxOḏgvᲔw@} C>!ʅb΀o0DByhE(RJUнD@/YY*A*O]J-p (,̔I)JL=a(+Kjfr(Z2Y U*UddBVR\026"Ĥd$s1@dR33Qέ_ckksUUVW|233uUqCC(/tI5BQHPh5q8D.+ qCC(a (JЃS @} C>!@d,/cP Øؘ~&bjW|RԪcZ,[#C III/b8255RSF="bDxDDVVVӦMeÀJ'"<"A!C 1OvD( f# qqM:2@`pʕҖ!Jר#%ԴjL&+"%  @} C>!@4ndn|KzUl+q4=j{f~~ٸqƍFQ*և Z)^t+ !$Ӽi/j"_\\\\\]Z>xR:|!.NMrٗ҃kN;1/3o8rs$/n{>ҥ;˲,DZ3"s3QTJ~s@>i؎yV}a7Wm4`5i/߽j/~~t9KD$q|Y91 2X"L[^QW^Pn WD@qXYY-kצ=&o4+ HLmhe<)+7෼] 1 q\RyQ,v>ej&W3R|e*c3'vUG>hŨdnqcZs$tšϒUƎݾ=ޫ2].=Nb+:4}P֣% O3g#vMp{q?ž m߯Q*~on=tyjˡS7M|;nV;DPfl {nq{Gćg7"oԮl`X]Jג >c~߃>61RgMMYuo;vY&RZL!̭,rvz&Rw2D!ZW:,5w_O2D|^[Ξv:$ O>s^!O~l+JM,muyx!1֪C., Scj}:׋/6Mj=+h`M C=ژCDRgLSedY}k*kGLRƕ|꿰VBB lW|=\DDdggw1pAǺ9lggp$&%k rU\-w]l|ǘ\_Rf}rV*KΞssu73*|} Flggz͚-ZDDF\OˡaNM-;8DYz|_R*c_(zYPJhj$2봱ϛtE@[c[(!^gZ!4qfbb,J*J\T*T*W?4SY.r C0O-q `IDATaJcs*@d2 @}mEJVo!0M2@镞nll$Rm穬RrLLtUcq>1U*W7ޙ ;F=bبJ*o!!@d2 Ŗ fn@bcX  z!q]%2 @c!@/d2 Ŗ Ŗ*!cߎ}֊{c)WQڕ9OL6wk-QDdZvrrdPŽ׼9e@u;sJ!@sYv+q#GB|BZEɤ {AheRN\xJ$EQ2T\d; C>!@P|7 ( M;?2"}0xQȁqПF~pZۿ{wٳk!Â󋋋/F[A})4V|ڵ'ۆtY9dГZZ6?xv=>suұ]ȭESwfC.n3gǃRXL*P$*kIDTRiw^8j3qz7F *tE!";/ݻ!Cϝ3ˡ-D2h@!2.=na }GHҮsw:{Ox;O]skg_mttnG4K>_LVJXMڽ= Gxé#һKvzs?AH=pw.OXw(V4iO^>v}XRa-!C@񨲲L046f\+W); k"2AZVpQ娉"#"֭GD..͛f߯%R}~A41˺ SԍոwE֠qtl9 \z+gSvׅu plbd(y|z}WJ^7«У!]B&1^BK׬HfӪeAH 9xra­ՕӡW\' 1&U{)4?UyNY.+3ko'(2@kPɉ||Jb 05Eƴi[-[O;߽{C.FL ;g˝;wk, Oa_si "L3#0MILቈ물uƿL [޷J""Y|W>->Q[[g,zyx_HЪ&[`9AP{q7gwso[Ҫߤo DDj$ [~ 9v{j5y!L>cw՟1]cm-[`s uuq7wݰqO!Dn跡u$DDS?ӜHx)!4%"2 ӿ1I5)e/J?105ו4qQJBQC4DD^]z:rژ/-*e "RuN.|IZNoΪ=G%.フ1i՘cW^>{ñyPuqv7w|chhXLSSھgK:V3+Bl%>o;.YzvнhhߵfBb^D|Ƴ{/4DF.횧Zǽ-.ZRʳc2 [?8WUl96he#&TZ+1jyz: n`&dv}f;|Ƴ;Z~3{V~[ðw[a}F̞UP !޳:o`uu]O[ n_OL^co$#7^fVSϋol}{&YN\PIbn˒VV(c [IjwvMW'LbR'| ~~1JDD!!!jܹj,s]={e˖E?k1@ ٳWϞV !C@ENPd 2 3rFLX*1D*UtwɄTjT*UK]yo7x.#25+Q/k)  iddJ7 J!757 9>Z-N=yIZ#L ZJ{U3q#Mgϟ]vEdrڦI*u!>ZJesih~8SR7r(Jaq_Ƽ!>Z Ø)fJQ.1 T*x5J `~(>F!x 2&+xd(6u zB= Ћ$pO@Y% 7aXئHIDzo9Z>x&h1+n-b 1mbՙFeXF mfw@aʁbڧ@6Hȩ漋 XH ݮ_ braH bAlA`<#d$,y@IENDB`kraft-1.2.2/manual/images/de/taxes.png000066400000000000000000002412671467704360200176140ustar00rootroot00000000000000PNG  IHDR z_^8z pHYs+ IDATx^wx @D @νV,ĎHSzK)^邊R,XPTP Z H۝=l~g33g!,@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD(7Qb &ĥ9$""""":;XQ L,Ps@DDDDDDe.Pm||;kgrB^[y|LDDDDDDgX(δt=u^""""""*(pvgB\VϡCDDDDDDKY <QQH?Hl.DaWH=H\ R x뱆8Tљ<&zL:NDU7\1\qLy{' t@}@| ?PS%=FI ӝ$%Gh>8$}<"""""U@dz볋(%',Ng[sdnp ePPP v+DI->vPxnPV1;9GDDDDDD9M ԧkB~/ӑzPXŝƬX DDDDDD`v~>qNc}

Pۂ]n[h\v0elH"r|c cevc춭Ņ`f_"""""H*Ml_~`WٍٍۖۖotؐD2)uzlc%j[q}-b*5-ʼnDZk rܰYg/ǭktq!d%gUPe"n5jͿmyn vXm%\c$N㒌KquO}UVcmp I$X'v2(>.WxM٭ei`q pљ(Prlg։ULxu]Ln[8dL":=fIY% 8Om[ULn[(>DDDDDDYIcuD^Xbr[]mmV'Զps$ c:gc}~E:XLݖ+p(HjQvZ0ZfէSvs2ƱH$NY1{A'11DZձj;ٗ<(Mk~u-"b29n5*ej̪m%\c wxq-VrkA=S@>""""",P"lgwovkձLŶWׂ_m;[ Tj&* S层:F]ˬn[K*\!""""" `I|F=N*S~u?͢OěbȏԵ+/Sjh[PVkmy 8+ŋ ɶa $И@}! wx d_ݖWj1յ-`mU~""""".Xk։VcjU|ܯ -ݶ@BD5qBWu'b6PX`Pat\ /dqbv#"""""%*&qjq@qrL޶Prn[nkA)mPJT'P]mmynmOW6<Jz|_Zj2lV@>+XEPP`c:ƪO^ VqmU> xP&vɹˋEn"䢃JB>1mm p*DDDDDDJ"hZ"S9.!|"&cDLƈh&>>XǏ'*ZlkRj[ N>V l@ܧW۪.PE[ rضªmH}X>嘺-}jLݶbow,W@D\M>5Ԙƒ81*&E\]B}Tvq"""""3],]^W' bUL\ y(28*&>ScrIqb@ `Ud[- X^}Q%z7wij_H\g1"""3 ":1^׷=37ӧqv\DB'cոhԸz@b!Q:ULP ]L.&\R`;1UJnkZ_""""""2ȹP^~8E bG"PLVYYBʺ V1A-X`-/"0쮬{v&w8QihRVwel^/׫ǚhj|I1;V'ª-O/VcE->R Uw۷+-JĈA޻sEqUh^ѯbMLBvDIˬ~}q\nc9!1i%O՜j85j<&XJ-}0$k:bmBDA--d =6<^h #ǍNEtL=M1\U|Ch}~y*q|dQ(&D\'# rV^n6|RtDkn@n^dÁ2ADDDDDD\T|զ\hIۦ'P5Xr:^?"v U\Lt>y[<-Ŷr^JN+&cb}<"}DjU (:īm©7PvCN'[@^_wʅ7fRmNiH[7Ӎ耥 """"""\ԇ¼U|B䪢O\`u%1qX (@d_S Ů_r!’ϗ*M#! Ȩ_rlm^q ݑ@u>^ kODDDDDDeQ\P<SUm ASǕS#*.eI@XQ@ Ŷ\dD@o1>Hlk@u͌ELleӛ cMS5AJ5rqrspd&sӐ=\񂾒q?pww&NK]i^ŜMEǫڗgt{ۻƾ6Z"j%bxԮVTTF<9}S^]󀈈Bo͚-5E@+/|VyV8ذ8]a:j[l1-/ɅqrsPIx ^.L |>\z2Od!fTىλPNI]wZɊIriv!JCpG U*WWG7KBч0kX?z 5n u~]b\.wI/Ays妍)ص3ޞ8u=j'%~C3A||%\vE0Gbbѳǝߛcw0~hݲ:"-qAj$r=k|Rv⃠it]gt]OZcbჱfXRe311Qښ χW]y9T622OgVbM}9ß{ iiyϝxUp]y7s.rrrP+fI^}8x0Weػ;Vo7z?V-#&&7pw[p]6Xjt|-<ڶi~, CQ]7_7L?k. V'j Uz8>/^ iկXWHPJDtx̰A;a 6nSW^WBrA6/}i `ؠ+QpL FI+8|T|'>cz*L$Mj2ѧU@}*= }PJQ/ӦAPr|w-XDD:M0t`dddsLuOoo&m'OBll -lIFlL ƽn9~X3^;s{C"OL7ŗ_/+~,C fuy k~[] r4 IjiF40 # ޟ{ /_苏AЮx3a ښI؟r5krM0Y00|u[w;c^>.8t( }wߎ-cgG w3~FB&1xyڽ ix~߈ODvN6^WL}o&|^/wv+&~ +rf VIo fCTTn ];]_֬F!#3?NE&8tOÇ,ƢϖNpɗ,DmxuT &7ŇW'M_ۊB>88o8ibxuT<@h0fd߸T..Zm!?p4#ph[4io '4d9:|6lc_"q£M7u戎Ϣ@eذ8yiԩ,l'򐑙vNR _a0 $je3r?VW\j}~N©,^;~ǃw¾)8uꔴg״Dz+q=E, ֣~s+yu'K@zzN_+/XrE~/8^$xiY~;wi_}?oOr#љ@N܇W(ESVǑ;|p?7J^p.hf!9r*XVj[e;muݓvh_On/\d[`\Ya)H,q5ۄnѠ͂?Lb*Lx̊ϒ煮x<,>c?|}|? 1Ѥ֛P+ uj_/YLՠi?-h7n떉ᣩ'//n拚޳4Qzul߱Ӳ=VzᖾNZ"wj֨AGtyyyE걪;zC ۚ5 41WbS1p38)a:vj q?Ѥ4r|</Txt<5ڍϖ~-;w0X"C:qCθk1y":C7l«!0fd'cذeZ6kZpL8 /ʽiۦF</T_G(Qկy-DL)n]Q^s੒= W_.]n\cԣ9׶M+ c&Laxz@lsKw 18/;Px0ެz0 CFO^NKπ Ѿ+%ǂ7^uH*>!N?[j֨^.*X3--㧼,>t1>tCG0hټy ^Xo*b`qqx%nW#SW:}E/\^ݍJ0fdgcw ƳCFjX0Y_ADt۰?FDn^^†M1-:%rab‚ߖ "&~(7揫VkAmS<ΥDL$ԶkE9&:눫\k 6b: m gKsdmj--aoaוq"EYz[}0~JC7'CWwڈ(9_`!JqqQŖ0MIq Th԰~A@@ m=qqȿwB"j%,2.\V ]:]fMAuNxl,4jiG$j>*~o9>y-c:pzD8}8Iږǩ1th΋0RLܱQ;}~f<1h2aѼIN8sᅧ!=#Re߫ÊX3 :_s? ߯HMޟ:.]Ǒ{8|hq5HYO իTYݧZ2221I#m?uFFF&[+vT,_3Lۢ{^@ޏn$RMV IDAT ._3onFDt G,ʢWWW5\D[ mW ⿥g/O:ж|Zۢz$֢OC0mѓzeɉ!򿆦/.:Ȃxg%DDDDDDT\|U)Gy1mCZR6>VŅ`0murL^ㄅʃ\YfK,dI@bE X}ބ\.H DDDDDD$PXsX[uE-[mqe}JUv-/2+ArL.H]'G7";݀"(o>#^ -oD N|ymu uE}Xh GODDDDDDg#Eu-bPX\-b[WbI'J~Ű"q|XGfOADDDDDDInc/bV}@(@O\LZq >W}"*sUVs` 7$""""""* :ހi+mvthrQz1Z>U\]*QYsQv"Ɖ]\^ j vOPHu-{QmcEۂ8ڧUv2SVjmmuƬE\_V5Vcm'( ky~9(Qi([]L=LmYpjrM $oU&"""""" rPބTVr S_5h--DDDDDDDeAGAl;Y1AmVn5aVO^m'Vb ټ^,EO!:3Ÿ4t= ]%CDDDDD@Te5׮mp L5`/LmyӋ'umfU]j7)9݋[Na.iDDDDD%0jVZl[Ըڶq,pR'5j-^2-N0='ѫyQI֮O"BG r%+ih\EEHhDE9VKDDDDDa1ymS9Vaj&\m۽PjLrL+DUN( VǐYNH ԉ j&_<&E;QXjj-Sjp>DtP_ PsQ5"Yp:Av 1*5nERVm rX*BD(By&(UcDDDDDDDb9Q؈t"Igw 5R~""""""jOP'#,j4 d #om*Cŋ\uHi:uSNxpCQj[0`cT\y+@*Y0 CӧOСC4ag̜9gߏI&!>>^FDDDDDTQW@?! 41@ngWۀuzO0 #4M|>̚5 ]vѣG!Ta~ ln32NyN"D^ EDDDtfM՘U ǁ}VB[*e}D8ݱԸ|894}t;^oĥkעW^Xp!<:*\\?Yk"%3hq5Pܵ#.ae"}<$g%#c0Whcw)#￘Ũs扈"* Z2J @lUՋXȁCaذa sA^xOw?L&#=w|oc2|L<0u6r5Ob)X=zv$9D9Xd!KqoShK?\p >^.ձZl{.7}sJUʰDIL>W ƴiӐѣGt jWy^l۶ 'O.rn4kgϞp+?].g??ފ94ӄY-.i$xb,IӮ9.T^@& ZH]ЫW&%TGK1/Z{..]@}ʝ3-{z!@}ŋ[ݣGL>=E4q⮻a-[ 99-[FSyf/s?h8 'l WB\Ǯ0?m`m/7>=y0 &6{7=5 +>V˂78DDDDa(O W!E.s tq"nO%]t 4MC׮]ziHNNF-"z~ uXI- 1="Ze{{#H2jM-:Ll~2q` LWIU%ˌdg Z5Qvpp:qs3q R$T-x'~ fL$To^&@ hHm 73 i'r]jTR.Q?,qU IzBk1n`zyrphb7 7bcpq puK($$Հ!Q,'}v!dҀlL>!TTL85SCTyӑ)BK@"JW] &5Ghrw\Gvk*mަw]֫uk Ǖ1{/mfeILhp%ŕ7U!/=6ǀ .!޸v׻u=^p˸O̕1(r;#۾}U[R5MGLƸzvDž5=y&-o|?L~ݕ/xD 0{M l[1>X-Vmރc>4=U6B닯ĵ]ẋCa@ ز;|& zt5o{ |w^( ixw_Fb<9"㿿P0g|-dwx|(jSfq g>tYx =rw`COS>;ݛ?b6# wv׮!1涆2Ͽ AB7ڎ^+ZQ4Ou:\+ON0q믿Buhۍƍ#嘻iY#'|=՟G߮ Q6tR$$#HwEUEqp_jjUDkþ/`;kp4(:4ӄa0M~Өy{xT|?n^a?r 2v ' !85Uq 1cҼʿ{= u4? W K:k/JhIWĢy5mizyn稕.9zwaܚl&nޝx'j to y baw؞eݍv=q~qJԺ1tTm{/ V ?s7 g{hN\ӿ-b;m߇:Blޓu`m6Ludz=NÝC){}qmh-NSCu.8Z4X5<7g32 Xe61kh;c OB0O`0\_jeĜtTmCN=c>Td:hk}"""Fy588hʕٳ'8Pbudܹs&y &L_6}?.\]V]pU 傫ȥ |)V4G/K$C[[c y/6 ÏB3 +|yWos ^:|{}ͽ۠]% zMt~fsCu`Y߾JM㪦5O ۨ:itwZ_nwu )ߗ˰j<|BWcM*mUꩯ=X5y t]k8\|z8ipni_1"""*yiq/pH!cƌJiO?BEiָG 1ktҪzM M 9kls c7(Pd1"zR䌴Hߘ7 /P ͍Um@ǵFݏkz_;;lq)ً㾾1k_rcydX..d~ii3"""Oˏ+21j٘1cF]\}՘8q"7o?⡇BjjjA4ML6 :tc;onzkn-ӆᩙpܿxq3x]$8T #΍]|uHCT\{z< ;ś܄ 0MCMXj_l2xj$t_E1^֭1nhf:vY=W$ okuÐ7Ĵ|,猈 -38#ʉ[~ĉѦMq7x@~^Qi]| ^M *ZY21W◯CLQh]ݾ4PJUB ;`< 4ϠcR,c,^'}7{8sm; o3-މ @Ng ;ݛT) RL/,f:~*upбXQE\؜M=)ע9#""":K1nߊ>ΈJIIQCf͚E hf͚aQAhQߌ:z8`"{Zlq~7j4]h";;Uȇ[v ⟓^|44mD^|RDɨ46݅f1g;5#gVl?%m[VǥCKLxbH [^4un~ Qiz9RQqs& "}ƽx˥~=_d\:$|ضt&ًSH]?/&qy(Ojff-Nj} x٩qx)&;ҋ?@M; rnru$Ç]Q屚;*hŴŕ@2V7V8#so=ʋql7(*|AcP犛С^vvLWBCLl صS>ew2^&Lhpa;U7W ojzgG0B!gz6c2~>^Y6^.mM^b*EkMOߖᳯ6 śs>:wjBԩ Y0v,΁~7ǹvCn=yF|y YOѝMWy*pyOH޸XmU{/8xuuss-Ξ%{ AUõ=nB+π}MT:ہMk~+7#kdXMĄ16<uh Z%9iwd. ԫ wskg@9 kw߈(61Eޭ/L\}nVK(6gK{ )9Ŝ-xVωwVgcNӄāqfPE C\YEѝqo#qZt5?]^/?L'iL+l.hY|=6>%0صb6ƭh4ӄi㥄[η^6@|i0~D4aLvZ$q>awŐyېeFv |8 k?/KCp4{|;V|+? oK|k^ t\Q:o'3M\Q a05%$HOCv|XKS 1}ת[}g)lC9#"""ӎo"Qp{DS$FşhjQqczKPY UG1K¯4W60 n B1;*1q.>\&4I7#^0 *܏;E"@Kǘ^P˓?8FqL@Ocshp%EM]\u㪤 Ð1Wk1` H(17ڷ ħĝs_ "^EpΈ<DT>߬\5݈\u4Ef ⦜@t0vzS|X7l?lD#!!Z_y}vMO4s?aCwES"u4w:<^/ pb;ӂ8r[]{Ŷ%ubxۿۢ =r䗆:p-5~Mܙ&&&^s~|"]Oq=+p#6}v :Fa/7S\ 4hР6 i`M/\E4 4F >n!G4F;_ Ypnj?^* ӀOqQ(e!iI?1hz"̿V',_sFDDDT2uf _|򔶼- ?L}RĽmf'8ʌHKy*c5\~ܢ.6l64|Yy jXpϫ7P猈*""""""""8 (X G>ޔ H:ſ($99,AtرUSL%KU$NDDDDDDp#?8̙W;~8" 4!""""""x`PCT_￿U>^`a񁈈Y,Ah_ڵ+V """""" rJ*ѵkW!($,@PHjԨEwA-n"""""""K %W^ٳ'uV֬Y'0xk """"""*iphѢE+!n7&N($""""""bJIibDDDDDDDRCl5YYYjG Qcªqj?4M5v˗//vDDDDDDDej޼97n[?C߿?5kf{Dideea1cF`r-uڈN' (t]ѧO"T?iŊݻwDKDDDDDDma z;v,E->ѣQ~b v. sA6mԮ2կ_?^@DDDDDTNAe˖Ge^1n8~Q9ELj0sL|w{Qn]uHx<hCŦMЯ_?ބ"r᪫B}=fiMDQwc1wKi AiZDz>Y=kwC*iF ō5VEF(g\@w=Q|jܒi5Эù23pZ /v/3oGUAR E2◯qr)X Lc }^.uvn9ʵ]2zd,ϏFJ$(=3ujT/D~>mx돻q](@Ƅa=oF:b3e OE Oطk)ޞ\D%*,@ic?Cy qO&Ak6!Lq?AڞmZ4.T'Oɂft7_^ ./udT=}[{z>h5,py1uq]d6HMd|9}gFڵ.yM,Z(Tk}^kki8,Lx$@ַſ^"%{+Z[cЋ_cQ[DKR`Ƅ7oፕ2W>@{q?rG -nB:.hf~ .D^&pM4{Lى42<ohbꓣ͖8宋z;["޲A]p]ЪE.cL<<8p 4=a NU; 3ۍKg(vIOUZ@:JJ*`ED"A@T)"Ez&M4,HIHHB\bA~>}vvvrD\!9}Ig`xo87VU.1)@AFNȄŹY\ʶS71V[/QlfmI~l&Q|jߌTu ,p%B_B"_$F/b߹8XA kѵ7,`% mv0z &rZͮQF:qCG7%Vܯ0kFL턱r8l[?czVUs+>eօY7eb&mMPP ,TgbAtBaي,Srl9V`ɨ)_K4Ȝ2ɉAMГ8z/d|\7үWlf.xmĒixDy*̍B!(B?5y*/:Q|q:(X4 U1ݷ[ѣQ|=< ֊!GC]1/btQ& 4uM{"A]}P*?oB |6@)(g*T$ö́T f*h*qz7kwA^/mh%ys] 0A$\BB "|0i>^B172a '* Ӧ?R9:Yy5@;W)GH%j$- [ޠXCUsطB`6(揇)2u*nHe)\Ebz- \ Z_!BJBG Z`)Z:/pz\ #31yuHmz᪓V 7N9ʔZ2:NOI$z"{j@%|k5_.H:@[`*I\aTXw8:w[ ʌ1) 4MњY\D !,PM*֖ؽ :m]EIlZ`&7yŜUC->(*j.=[ AAĜX;8y#U epW% $ȞFU| %ZES0 @UrB!& @!3EUPB) h/b~,ziU ³BkOjCn7((~E5wx]}oqX.^U ŏu1NgbϬaL˷wfd d>; _;kwd&cgOdن-M}cji9JQ:H߾Ƈj1n@*x`_ċ/@ " 7 XFqSqȜ0H8=1eTv3q"&2yTنٮ٩(*MXos; 4c5a?N_B!0!Wdѳ\M"ݜH l=AQ.aiV0wД4bΟZZ^ WH5| [h#?r/Z hBJ4;)RV?s!.E p) fMO C3=n ϟJ|?L}fh`Md ':b1(MO4pf>YWGX6 Wu_Ķq㧼V&H%&)GWSIo%ڗRuߣӭ-W 'Oe6}5GS@<ɜZ11+~"uB!1ϰ~JN^Iٓu4P6nmxRٌlތa!t$$ +$F Oek0A٘r'-3NE⛯,mxY%=̕^ށ6ލglϞMX4}l?o҃NVo4EdY!S#6}6ێ$.1M, 5ꏞ͋=Lٖ tʲRt9OgrsQ|ֻNTU @*4z{&]<@h#z>wI{i( ֝JWի%se̗(-9W~EX?eҰ攑՟qШ+ϔ'(B!4s7_Vl;~l0,];Wa0lðqnnLGO1ȡt(hx ]vUth膞񤅢:3h> @XEU1މzKkÒpT@w%E6irb }%͎۴>;07t3:|X@-X9u[cfa[C׭j*C,Y(`d!S K34B!_\3t ;~Mtp6; q^]Y|l]ti!Uqin}Nۥ5s`QQq]8)N WX_; kMp!7E\&AqoN)mÙfكB!B!B! B!BqIB!B! B!BqIB!B! B!BqIB!B! B!BqIB!B!uxmxjzfgĽwϦEZڃ-VnŖ1_CDL:gI]!BO3) eMT\' mF,kh{R-ê7#dW^rxj6J珝ۈI*7F̏l<Nz71ݬO溡y(=t"6yRӁ!\"JB q/Jr&ăH_q+EXL:'b =&YLM/3g?iR֔ =is9LY-Ijƙ4+!Q0P>R΄i!^*L츑F M~COUd2acmxwJ0w: cLiNĄ;9wJ30_c35Ef˱-X^i1 zH&R77i}G-dO*uDƔM?q/[ `ۍ)~2cfo8Mx_}.Ңc2lxgd?bXy&=bwY^  $#⍡}hZ%:ND6WKQªe^j̎Q)^udޜrIyM>`[\0O7RL~i5`4o7̋.Q%c0o PCRQ{1r\93ꄪ-iƇE1vbM`۰C~=߉ʩq'2zb\#] hhxKy/:yB!xz=woċQ4aC?bO4x5A0bN&;?`Dg\?&'ßbi,n6ۗ3$o/dLmx9obW|Nv͟h*a`}^5ܱ+cEfiW|vn_@M|8;=ר(/]ϖСBFa}`;tݻ,x Ҿѻ 2૭ٽ 6 orrޝlgsެS-QdHz}&lL>P .\.#iNM/ttL̸Ҙ1v$l;+t:̞+[vjyOʆI3zr_=2jB! O*I޼ '{ѡt^&/r?֓unaOZ; PDN|&mƸ)ki.t{ Au;Цxy=*Ӧc9BxD'w&דӶ?~nܕJ,K Pa\Ǯ_b1|PT^sVfE6A!:>=!09s>_w@Sz%ͶE)l@OVl:8Z8y4kȟC0zjt۟kGj !B!ĿK#z7CwIH [HƍÂjvL^m}3r~!rkokHvAm,]:]wU2&P,yjƌa\~wXwz3._bXE1OR23  {/ }t0ͧKS5v@s&>H'!ͲKOt>hv)϶NՏ[01X(^u;!>mnG!BG03sR4X>RЧqMVM0oǪ_0έ m͚=jo'}GuA_4ia6)P(KǎnɜݰS V9zY?Ugb5 5= g.d: q膁a[݅~ .'`a%(߇4I<S0F`*A0OLlyJP?SNeܠ6LL#<-O 84ELO>}?G#i} mM{%VMПX';3ZfJ4x1ݓN<Q[ꏉ9lRky˻03sBExzzV)^OE`cz6YD#Y޵FL |F4 )`\ycz}4כ&ͯ:ӓ7v|;CЬ>]֒A!!8 7aHziDH #UOPg Z!B!xX|Yw8?Qh&aG<M֏wt`ݒ}ϰ}9[GXSʌyU@Qv۱uR 2n- 2TTt{> v^~kx[Kk1oB3p-?/Qh!Yz>E3kao|[?f IDAT em0lðaذuc8:&#j75?jX.j-o8a~ᬠڷfWT["-kpakZW2-6EB292!}ߪ2b>#pXq-2b8<4oJoC~J=խBRa u4 x0qC~ wGIlU$Ĉ76oSڥ1ejNs,muD=J+}u {曵s(&5:Η--O%?^Z|kf}֫yz1u[]<= Ҳeɧ{U= gw= fLoywnjNݑy_lw< PA Ph^n_SiZ|pb3WbWo o|h柙5v?\VoWTR/lq[^y*ҲkIN.T{fgD(xey?J)VNE.[$K rl$q&<,Cv Suv܎wV܎sÞaM|ֵ0&H;v588#+@Kv&搊t%f斟G}o}qӔ>}5o!Wo/n˭:-rp ?1S7q2F%4 z>~i5eJ&OYƁIxUU=7۳*NӀWx仙3דʗ@vY_"Zh %|KyI:MsKQ+Ӿ`9G}ςO ҼxߩxÛcF)OC}wGx[^vEZ|βi 6xj)柙}:Zsc 6F5ŜCڃs9םA}[A׃~Zn mQvݓ=kS4 Uxܠ\>3p-{ٚ12-Keg [)[ v/㦶L5Q[U.9[Sn:fwb˴LH=Ūu_fBN^/ϲxD~ȢXiW 9lIO/??}e5,5CQ~̽YQK7ҏiw Ghm Vm`|nE0oB e嬘ڝJNK]0$K>3Yy5׏aU4 >ۦx:)Q%s-.ǙMNGVk=j/d靟KvnG`M`Ƶ띛]>f nүW8/H||,_cixy:;Iعtnz5f%Vܯ0kFL턱r8 =NX7n-#>hEjSI^ľsqEQM2e~BaWYЧ*^e7@u{ٝSy~763c 3vƼ xxqѥuE:33کx K[_~+X9o C߮! v zr$'~OQqLB_dM~LF"}6 2}6G ^U+Vr޻4 G+);5&ҡFFk@PvjZrLTp{43Ʊ薲 zS/-[|K9ҊA LY~r6E_fԤ/lU>7^ll! @!h?ZmZ XVyYgj} <5B+գ5.]AvjU^hTAD&͇իR(&Qf[Y<ܦ U½LD4NWn`+2ZjX /DGٺ(WL)M% {%QsG{yN-UUǫC#"5xymvjvkE1\y䩼PHWFšX u*wLiww޷3%~xY~jߊw-ziB0Mh될"(`9'\%ꈚeڷi2 KEUrD@h5`8[QQ%]n-:iI/Weft?aۯs i!$:L` S2幖̰NSIh .M MA ,EWGN˸op}|VqٲLњYqzJ"5l̾?hnFq`T{nFֶ0=Pva䰌:}9%| bNeuD"v#Sqޝ]п)UpC': *),ʩ$w 6\+J6}nȴVd漐Ydn$ײ]ZQSc>},VBʖ1Bpu:i ,?X2` L+,EQͨu߾Ƈj1n@*x`_ċ/ɘEŁIX/A`ɦ8 ݣC: _'/[͎O$Ո'AL}0jߎlcQZ.os; 4csþkxH%B`p"FK< 1GV̟ؖI(jmZ,[gt,_Z0x9jL9eZ`ul |7a :((Jo@kxsuEyW?CNQHezv&|+uΠfʮc,. rJ+3EQQ4VjOߎ{$Qϗ\VPheKY*`ocӠyYF6v\ԅlYD!"`!Pѻr0_3ZU,@|,i,m[ D'w8kMVF+Z:r6xMkrۚ#WN^x=B|ޤ,ujh|| &ˉ9jyHVR0)~c/KoW$WY~NX"_ .?h#Z;ECӣ4mKZvL~ӹ)ϛԔTbǒefK_gϸxT^ *Ug_Ņv3zL/~Ms黼TF%4Օ-zziIY;qHw%DqBT 8geKL:Jt7*[Nle}L"kB`үuIJ5&RŚ5Ml;*uzgbE{SeG#ޛ ie2^h\2y,m#sƫ]WOXhXtu?Hχ8s?"oJ>IQ%(뼮| X0)/RS@Av¨bL6h(_E? }i^c)Ǜrٝeߙ7~8Ƹu#вr<ÊPGhRKo#fxYaT&:h]wXfRYX=`μX#6}6ێvG7Fǟ0>0eW`_41m~t'u d[^bnCz1˱^uWN G/Geᗫ$x|ތ} ުJ&=h${Z2۲e7_{yY-i uߧAV+=;T7lYi/[Bjmwa׏h&aG<M֏wt`+aIJNG}:f~X+`dp͗LgP&"u4Cld) ݛCj[zw*8L.2l+* 9Rr.WEYyx ~ 1i.Îmuau80Æuw#4sr"f]G ұ7jYPPmQ@UsjcA({˲q\zG) kW|@jdZFAqMӳj;Ù92m+S>8oOQk:D޲E RH%")ӫ/]ʗeص 8cw;-Ê]WtRܭߑ*y8v<qYOqǎqp=q>2ufg;˲fnq@en?}ey8˴f:gOVp˖Gq!'3Q-`H4@`jmtt!'#͐WO7PP x2ܡ5B!?KBc>T9E;D!{҅xh%0s;e)B!$!kST!Nn !BcNB!B! @!B!➓G0f$3w."=.ðR~˒x9UB!B)We>U4,ipjEiZ_ڕk7vEe[SD~Ls'T\{/^TG;5s)ܪ>WMNYx6r]=FuX09ѨZw>?&gsѩ.MCtMиvmj4nOq5]rOѫ^jŊuS\~BAq_;l+c?pc?#xCP~# QQ0)r_e%{z8ؠc6=_~Jn~׷_>Gϰ/#&F {6uX:h{oAs^vP"N/kcnߞ<Kudޙ1]ew#Bw2sIrǬ:7L_*{7ՙkխEFy{Olx\~ѐ_r2,aP>'iV=nEXh@ s^6_5j]@ XQ3 dlQPgJ'#hwZ~Wm䧴 %ɩծoft}& !$!x@k>W3f6[譌si|6mCGZ:`h;0n@c u<)\.#iNM/t 92mӯ ߰gDS,I= IDAT(ڐTLzl!lٽMYs6݌s㋌PCKиxoxgLi?7yHQTv1bΉ(__ѬGTRE͜LpX-KV5YMI[-OFUg94/OKPΛwʡoK/p᳴g/SB$!x yvw4hH YH0@o5'"ܟ\>1{mּܤ(~ٞ?x .EAU@A44ME<>F!xLDԦJhGi?uG"uw|&|՞ʞ9(AYPۙ< ڐjAWxR|^&o('LX%UL{`5Q {Y.@'*2_ѳb:I ]7xNoДD^IaM`{/Ԡ܄4O.}(JpxhF&Uw~TE[V2kV_OBQ.%`1s^g%3K A ˲oo.{ZVn5n4Z$ᛷ- o䑪S%)XΘbA!&qOpu0 TFXxꮯLOHy /Hgc:?F4!㷻 =do  ұD@2goFR )Y<4ү}Ö8";mևJ3㗩JrR"I)Qӂ:b\6kЬz.0bFRmYwjhFoϻK=ֽ&ֵ,ݍn彤Bt,hAD^0 b캘%l)QW3nG: y0EExDK~\Bjy;LҘi:0if<::CЬ~x񣱼,̹Ru -ov#~r ?Ti-)zg00Kߺx㛏Hݘ} mM{%VMޔW^ط:M\Gfe9Яmd£\N)0d יz&1:~>MCT_6Hk b6 ߑhxl}){H~?͈˂14)K+&!$jmwa׏Ϛh&aG<M֏wt`';眙=3;s^S#oF OD<:ezx s׿X@nz|;`|+XZӏjn_H}֊i?y4"u M ⟾EG})&RRzɧͺf!VV9MI9M ;% >T=H/ k/r?ea!u4 11cIF^ Ź#aeل+G;C)3uVVZ~zxs>)5il1K b:-fy]C8NFJa""""" LE9sG?EExQ|*4jЛv섢7o"""""'ZuR <* |$10_0ŞB[QADDDDD5 =@=E;y}3d?bNT=J79') '=b!iG}"=xE]:f`2俅Cʬ;i3vySGv:8un -[e|p-Gm6c@ܣ>)Og-[Н$S14i҄ 7!)ED)R pC1y6¬˙JO9ga)lqy.cyX}pO<['x׼? &=2KD9op" ֶI}XgE,[1qK/aG_w:Xؽ{>OFpf2\=~rX+xB%w9sRE;wԊMpڳ6cȈVT P+=L.|뿹9Dz֊^cػs)/`MA\O$3bEhF,*C<Lڠ@ r'H|r44 gBbZM;ROAz3]LpBc1L786"}A{V\Rk_.Mwיsq B3w~p#w>ŵFϘ7g:OiÍ/LȆL|ڵ'Voql.]c$dТeUҖ<˝osXd=t>?w~i$XȴWX'~1%L`d\~oUʼn>4#c8wL8];mwu!#!-?oհ um:\Ήέ_?$4 ~y/9yٵ}'u!uE:nهDj 4 'Cճn~;$NZf>Џqqt?Ư!ҕ$""'F)3̴czӕ{aU&A\ᑾL+ݗ~:}^Y o9i +2sp]5L.i..քvǝX~,KeJݰu-hs,"(u^4Pj12kؙOXC=61n5p]kQ.듶k7z!AS5oĜ.Dvf:Ypkd:L6|<8dg`1 %3#C+8)rXٻoa ;{[–\T)wcnxgeɒoMG_ЫJDD8(!e&q#pN+f_r26V[g3o%3p{i\]Ȯ58t`9Kv4ct Kפ}͏d\ܖ4sRF(Uc+mJ؀gJLP[׾O>ݘfP.++ "?l~[1Ϗp0#'#+N6ٙل%T;z0McBqTЁߺs9UUB\^4İvdsXDDNRfrh.WpVfF~~ ?ӟQ=:3k2.L\y)ZMY67L X˖ݪ4iӌpWybbB8P8DŘf$]$L)BF_۫ 4:39\[B $| 7?O-*pjK̓؞?\:T4'߻{Øs?$äرCyD=lΩ7jWm TzqatlۙYI gxn^+m:]zcn%RNk>|+y\̏ԹUh_^=DD䄔crGJ8p=xk<6W_3`'`_q}%nзY7Nٴ)|{}>Q àT;!wmp(A+ _go/ e9zNdj,nl\m./y\?;M޺e9.ձm/R"ضoJi=ia Qxfo߾|X4H{}\̤wRs>pZqս 6F8v{}`e\ŜÀIQyBσ Zwn mFi9k"넖soM̘r 8VO29’'p=8/OI )b _CQ< "a!53'V%&A<(}a9e4AJO4ڗi̪@[s}'"PzS_+Hc:ֶżVRrEa4M)#EDDN"")-=M;*bfWW̐P*4jGn<"""""" !'73a״W> %mlyo …}?XX$*Tԛv퓟%uO$퓟ÛZdf֚F ߼؅3Iym]Lג]8X1{-'8L83kKxߍK\m!o>x :y EޑC9Fm65Ǧo&#/3c#_/=Cä#7otءԮ͜/"+qiR'p"y}/C)5kְG{\]*m5sFa'~gVSqYOav5;o1'C%sGQQJΠ~ۚE,mM͢EDDJL9)vNܔA{}A-fxS>sMMb׎/۽7T'?dmÌC]0&i/۷'}o%2.>8)㮣_g59;_L~}55>'o^;6; k${Ե=m;?qAHH%. Oy%~e@q:xfׄ}&I Tf՞Y3ߣwwuǘg`W·_i~+/ԲuQ]<85<#нG3{vrr,a͸zTK W2{_w# i`U %4bF^Ӓm ;CȈİ֑gH,q[osC?hM5N(aUq-l~H)~ .Wga?99lzN.0s|t9NJ۱y1|2VL?< +yT}o\O#Y>ݯ{ib8Z&;8$/x{' }w>+Oa\˟}ǹ] IDAT1xvv3NN^6~/ i/ VA$$F_|Ͽt;̧C^ò71LJmհ uέ:Fz je z&DԫO]5'ly72\t}1\Tm=2 Ơckb2aUcpp{sN욓3Y&+?ȾWӯ9> @)1g`C~ŕߔrH\:յ.gnBHl{n֘ 0kdx:DS]]/Q(W6k3x0LVQ}FpIL#ZsI~s/@B:؎'&XWuLU%"f1 =n7.I\7w>ϺAʮ4Wv* TivVΊ9r3+yD鎗B?{~ʢ 5]XI[ɎmW66kR k׸NfxaYdʂ"##7 KVYf8aOf`ʇ˩}է4 ;FU7ώ㪾DTm€nm%*l~8 nᙺzߋrRE}$4?`~!RgO~=A% D7D>#0׌}> }br1ʷgPǗxn26E! iP12Ɗ vW0|K ;) w8w&aýxbI8jY'X_W x ):؇I<aec1'{I3nY8F#&W tyuF5._U\j\ xNթC(΍985do}ϡ`+'0q_gw6W dZكm_nG)='q| ѕJyodNR*fHA@'݇R{CV GPibC!RgȃxWSuq3yq;+Čh5:( ocNHcKڐ?'3={,eL޷}{w\cbn33$F?DM|0ϡSx\ӻG< Vz>ݻS?wY~CСqltr °Y`05 -c\DDBJ%VIցi5ϣZQV <!B=!bzUΐ>B=!|tQEO"iR7DXu>Gi?DH68"40/K{\2Vx _$ =wM. ϧ_w|?E5$H>Ʋt0;O?~:^(887T±mԧcu,p Vp\*Y3oit(_Wb,'i͈!RZ3E'5uB{soM̘r 8ۯ 5XLYlyoo$-1#G5/Fk~ES 1"ĂXFFQGyO8fݎ3HJHNEDDJG9> fҔs<ۈOےɱ!4z<80qR~wqwyY6!6+)!"R x~Q{Bd$͂!"""""""eN)s @HSBDDDDDDDʜ"fm~0;:k% 0>z8mit\""""wPBDN-N23nkMo^™$̼.kɶULh߿>ʖmHYޭtm5n?6֚}CU-a|wH57W)~#Ү]FGv*޹*ѦRzNOˈh߱bͤgm{U]Lx2R~θ[ENiס;IPrHz3͛6M -Mǖ\]L""rScRV6sflJhZynTV|6egW.( SkWGo3YU3Xz1$8NObOJ"?ޜ˛k3zb "G,xuV?ڌXT-ZZǙg)3v}|Fj 8Ak$sޏ3y"-ϳ}10ɨ]hׁ.+"'BN*O}мEk-˟S~݉D^`c7{>OFp1erׄQ73㫝c˗ {.ni:yˮԵhzvYymG® ɯw֮͠oYҝ':4Fp%6f"3Genr6Yध^ P $3EhF,*C<Lڠ@ r'&$$$qĕzx9}-SS Ks98}/+p8XQw?Ȇ ̛S}rK67}8o6te\fҥUM~ v {=\n!%W|˔_[dpxnsa1_Az#?^0V,9<+ (NDC櫾)j1t 3g1+S\E8.iN6mt֮݉egҽ4_4޸U)6V>9ńMG0CJˮq*rCi%x}N\׶N0BNRCsAKZ+ؤo[BajLz[$yÿŻ5|ܻkixmόmuد *:{n/w5<'/7̿$BDD)!"(nhu6vxI^2o wEvk:XΒMع35)l_#'T; 3 PV$9! N%>KςC". Uv72s>ÀΝh&>޶.pޓDW ˯ygK!鰿GYu<'t}*x$=}1k]ի5Of>U}qHmԒj̵r̝3wWg֝7{H!=1Br@o]jy6zADDN;8ADTaoϠ/em.CQ6q@S_ ŠR6j~&hU!xo۷&4#FLL¡\HbLEL3.&y J u/9?Ocf@^:.؇f3XpWN 8NAfXt0MlyM9Ĵ;fдW#g@ |CF'h<.ne}xqnlO]ZU9 Û'H 8 K䍮Tr&""'N= DN=Nv fDQ΍[p C[RifVO?ƝPpQ-.*k>iӢ&akL# /?eի!#V=ۑ:]>- +3Grvp1Xۘ1?CBPOt:WKT:5j/҆2cNdOYdXܑ >m;`\o?;3[e\c; Ɩ_n]݆L֬5K)ɋ\µԪS3< wflYYt7@H-)-/|> cX2 NșF94OL*lӈk~zts<vS6>=N=oy.m[l߀m\gue0(wQ]J c^&aA{` Z7>[0X>+~_ļrVoK Hv]Ђ3g!1ҩF&\y&.+돂?ݟ~ߑ'߼#M <@h a1ŗ~`RxnXouNo2yݻ2A6s/OuWwMy@wϥpo*RBNRH*I3c+Iq厔8p=xk\̀uwzbu |cƽ>[xAfa I'Dvu>Y>ݖō ձ-o7˅?ٱ-l,tXm4L>a=im0B ?NLgLzg(5=Gj 8bټ,.gvǓw>Ʋ \buߏ|W  )#p 4ꔗmcDu ge_B%DJ_\'>7{kg8/8/X^ XZq#,y׃4w+"RJ o0L)yL1 ]{mkMWܾ 0qZC w* +>ť= 1#=> _1UD)z{ ym`G::_rr^9 @%."jC "xR6C&-ض7cDZ>9-{x8S..(6)iM TMS-2Yv:8sץaf:NIx ]Qgƾ\q7ޙ SEDDDD2 @ 6m `#!8FO硊ŇU m_7ÐFc[ݚ[`нE4RO 3{EpxM2$ch^$jfL^-`00Yܿn0ۤBJ:~b/:8M%pDDDDDDRLe{Y~#x |=InƆ3\ ^E4ZKrH(- ɼx 4840A(KR`yyn`q/9+2dΪ$ʂxiY ks 2Ml,ߒIn7-ǵrxdWfbCK3h۲$m(#y |uzjY y )DDDDDD(o)<ݡE |ҵ 76qk6fk./P⍙|uͲЭ.HI+WɵXoj7;}7˿ގ\|A$^uG= `mt~ۙALPoRq)ܹ\3Ĥ2p4xq7 bBMZ5@&i&_p,vMuvZ&^gco&nO/DW ch. 3(ktχ誑V)Wf@6 %""""""w!q&dζ> @wɳsm{sxgqr 7- ..Hpsl^̛S]޴yRgOL per<& ؐƒ-21h9R ֆn~0sesGTnǺnj@dNHv %!,M5װSsX_C5r 4M06*d:;&yWeza4 5|AzQGp7FdgYltpL*mv$[d:c\clA=i|_NKX'9~q2 &u#mRmmtn%ˁ}3 Hߗ 24Gl(ʻ 3ˬ_Rٖ n˝HrHJeYZ)^?W\[x:߬APW7-Gpȱ!1)7咛-nmM\Cfz쵨JQPY<; jP1wgœ+3tC\Ej 9I8C9LXǁiA89},e|o=/lcHfŦT0^z&w xnJ䑥I8ߜʍC&ȫŢYϳ5'#l0IDDDDDDN* `y#).qŗ`VܶťA \\8@qO*@' IDATEDDDDDD)!"""""""eN)s @HSBDDDDDDDʜ"""""""R29 DDDDDDD)!"""""""e 6%\,"""""""Gqp.DDDDDDDJLC0DDDDDDD)!"""""""eN)s @HM(/̙3Yf IIIE$%%c<wÇ.""""""" @_";; dffgȨQX|9o6;""""""$jIKJJO>7yƏٳq'8KDDDDDDNa @H/gX]jm3tPf͚ ?R{9VXmY-++C'?!e&!!_~HE۶m0ByV^ݻ_bȐ!L4u?""""""SB̌3HOO/roi۶1C aԩG=ŕW^g}ƀ?hvѪU,p  $%%'QJ >7fp9s(!"""""r*ښ)c'hժ!!!dee1x`!DDDDDDNQ @?Jՙ8q"Y BqTJB9aV믧^zFXXSL)rɓ0`&MRBDDDDDD9niiip tЁdz}vrsszxb;v(64L""""""PjIi8CDDDpIc&fdddue R4C r' CDDDDDDN-XDDDDDDDʜ"""""""R29 DDDDDDD)!"""""""eN)s @HSBDDDDDDDʜ"""""""R29 DDDDDDD)!"""""""eN)3Idee8NpIDHHHp2ӠA$VZEJJJpIp"cF4kDN3vBiуQF[@JJ 7orԩSP^FF-bĉض](oz92ӸqcÜ9s JX~=wuWq%PTT7xc"""""" )3a/RRB`6ejm;)./85j(!"""""7SB9N僳ܽu]i2e&e0 :v… iܸqpv7駟(#SZgR ࢋ.bժUL4O?5k֐\w|U̽!ׂ B *tD+quDhDD "MTUQ;#ܹ7 |<;s\3z:w!Clٲ.\D{Gw}w2RP!%&&>u-u0dK. "@2 CY$G^ & qEdwFCvym@ @.\Y$?~Ybһvz{ -j ɓf۶&O,˲iVZ~5@Ȗ%K}Zl҈'jٲe[eמ={vکTRmtԚeYڳgٓ4M=:L @Vvm3& mەs=u2dazꩧ4rȀm#GO?}ŖyrFΎq0 C#GG}o|x㍚?FM{@N:}Zb֮]Ç_ax<+WN͛7Wʲ ȧ pY Phh:v쨨{6\0R?W! #\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\GT/r>d; W~qjתjz5hM/]F`Z+-Q?D;  %OrVڲN˧>V'qϓ藋8Pw/ ;~؅|m??mW#OP}{SCSY˖dYzjҤ"u缀$]Џű:^5X'-y>(K\Z=5S0PZ4QÖĜmڽdvjFS<`uz\jҴZu{TSϖSu^Y}D6V.Cobe'ի5G~bw,5muR~e`OަE]?ОIn'0qui@FGi;(z\ " W+Ð-mk-Skj`iEӎDZ}PHC_yRMKz%˒/5|HfR}:Cm7FW֒ji蚛̜gSM@d_|&k+4ZX-=i o%SI vgoSa4khx/[bާӿ^ɋ71%nVAᲕ2f"~^_`>_:Z/-XOW2D VSc<蕑WDqx1;/? w遶׫PWiHߪڵh~NːNG޺CeѵYzk*UjQUpBTQ_g[:Eh{u]-ZLrQ@zWa\*u'4 GGad IzJ]pbҌ jTz *DEV+c*e#xU.UX½2MS <2up5u.6VE+iR2*5̦ -kNSeFIFFYmbڱ,^R%<6My=U79H[%[bSwԿͬm%&HΝOYH%K^y,,Y:mޞ'0tYYYz-$KDq5'KHk|uԒn0%#Gtx-HlݬSh Wo!3 ,:XuⴥdVehb u>|xG/6{KJҋϐ5Lg ^)Mꡤ A*d'> դ_#z0UygEPU,):.UZק̊0Lrj~ =w XA?m?B铽B?R;g?<up\F!+b?m˶w:qnVA%>rο(e۹6' " _>fuF61|)*| C2Cc^##!,R-Z+}oTHZ #)0a/oHMtF?kBԳ =:ǣf-90"L'}< +i#kr~4O)^Ig^|_^Yx}ֱ%Fda0Kl[נ0L=l)K7_G0$ٲ O߅mgز|6LX>Y2I-I{B0ɛ;t}=e%o 2g[ C쿞5%_"7_-=-B2@W/,9]0g֬C/=ISڭ4ǾDIvc_c;'Ecg[d? #dpAa*m +'|Ðib7LS/zicSX\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\u=zT/֖-[tigsPHթSG]tQ2e\@,5yd?^d۶W`f̘#Fȑ#U`Ag7@"@?N:iy6tH+ϟ?'jժUZd ! 2;S[lC0۷oםwީg:9?~6m$˲Mmڲeƍl` ]Gɓ!!!jܸ+&0'O믿VBBBjͶmM2E?J.7 '@ ]/V\\_-$$Dk׮Uݺudbj޼SkqqqZhx<p5b l߇HEDDOݺuդI!l Wf@ ]OvThQg钜;wNVƍu!IRU~}mV r}5obF8&M_]Nm۩3R]H=#z'.+H3 9f۶mYƌX|>YBX%ϧ'Ojܸq]6mDW䈥KE:p@^iY8VZ)&&9n֭߿Ν;lT\\ ϱ\uyWgΜq6ITJ*I~'ݻC:{m۶pf@> jҤI駟f/TVM_|mۦ hڶm֯_5jY ' siҤI{>TVM֭SƍzxR?O7x/i @lٲEnMvoܸQ]taw0lڴieY,K.\ԩSSCC9ΐ*Up0 tM}<=\`` ғY` V>\O H=zS˧OΒ*T=%S֬Y{OmkjԨQjРAҾ}yfկ_?à`ڻwo@X)6m|>_ e.aW"""R۴i"EԩS5۶5d_^4d|>z…ծ];fĝ;XbLӔiB iذaA]vI&A_yf5iD۷oh{GTP!ZF̀x ͞=[Hٶ;wyTR%II{>ݻW>/ |XWpUB-[ܹsu۶k.ڵ+"E8K0ڵkk֬Y*X)Sz  :0ԹsgZJߜXV\;3` @¨90 EDDhǎ=zZgT ֳ>۷Ap`0Tpa=ZÇʕ+7 *Aj׮].lǓ'OR,XP]tQΝSgFJͼHW:u%}ھ}{R!4xxd vء\aaa<+44T?֬Y,)T^|E 6L/֖-[tig @2{HNZQRv[wOF;k}4U,b["xUzSQaVTd8zpOZ5st]Q*5axSxrUzmO%jc`2};ZWeC?֦eiHch˓ߕVN WKEyC5$^zB/Y|ԿaXGvOX?_;Ӭ ўĤVNg9Pk~qF^EVYWkŴ~ܧ/N˗ބ @!;N{TTjOml[ ^SºeCUWh'Q@zWa\*op_Vju_ʆy^7Śtq@ cҡ27}0[MQJhDlϟ6X/<`!<7Uw~]y3 pO=>}~Eߞq[sZ1e\nNIu)GTtMWuKie+e޿#] Ca&z|gI=sý^2= ՞sý&]n_R70d),_B 4i7dz-JK!3MȻ % IDAT,Y{n}7ڳg߯0/_^ʕӭު֭[Xb.˩Szj}t!ǫrʪR5jի;O2dۑ#GC)&&Fm;Sy^5iD:u]wݥ+:dÇpB/TbbV\=**Joʕ+ 7rnZK,0|D}1b*WAi߾}nڷo~O}f-\PUVuvT*Ukڵׯ_A PeK{f@#@:K*U0 y^EEEo[o%J8(ZLoV:uRHHHAG`9YV|yg) Phhڶm+f&oS6mi]3dY۷o;Ȟ={ԴiSر#e;wT-`9Yv뭷 7mw 6UV3 Rjժ֭[s6m[n xf@#@lR^S-[8Xg$M6jӦMРԩSر>Ӏp!8-]ԯUV^ eŋW&M'Nn8G{?M#F(&&F111zb!IgϞU=lJpB8q94iŋ-= QQQ3 y|>4{U||Ia_رcU@(P@?x y<gw]pA ۶ʲ,zǎ; -ݺuSj_u@0a;hz5{l=C~K:Lԃ>> 3ԣG_^˗/׆ _t5 @ctl)_z0`ȑJHHnݺܹs~}$)<<\zݻwׇ~k٤8uMw$%&&jȑz *6|{ٳ/s:vXR0(*** P :;5kvw/0># 0BCvmԩ ۶Ϫ[n_׫sEY  P5w܀%taS?f?tIUVMw e> ƊXر# |0 CӦM eFRfBL>=Ɣ۷oSO< w1J%РA0@&O} l٢kڴiSawޚ2eJξ4h կ_?[A}d/J,,1bᅠ֭[ժU+͘1C3fP˖-RR0bgO w@*UJcǎuSnZ=߫6Ӛ6mdY,R||M40MS=Znn0vX.]:v@!eq.H0%i97L"kIIByS#: 'Nг>,ZjtC*$$$j?V^t$=:v옳  pFĉzӊ+ԯ_?O+WTÆ SNՄ e?=zt _db۶m>}z}˲4l0]{ի_`7nF ϟaÆ)11`Z \_~9 (ZjԨW$ϧAO?u6af`4hMQ+W,K&L:{ mSLLL ܸq?*TWG_}UyYn8gʖ-hS.ZH{rW^vm4h*UO>D%Jp9qO2 !/_(&+VL˖--ܢjժ~m[JC9raEGG ǍF*U?VHR||ztCG:wI裏TZ5IIo7n\,y~5@!@,ZH.\5h@wqG,%̙ .{ջBL:U j޼yjڴ_pw~~ .^ŋ\; -K. HI!ETT_-11QWz]@"@}c"##rJ-[,۶+%jsʕj֬YN} $okrV: Ç%ժUY 0 U^]_|j׮lPF YFj og<d١Cf8|믿fzvڀ%9Y,R۶'(""B(2='OԐ!CTn,"66Y G,\Yf&iܹjٲ.ٳ%SSnԼys͞=[qqq.B? \r-5Ȳ*U0 aի %J4MرC~.]'NȲtCŋ륗^m5j;n۶|>mܸQ#FPTTׯĉ'4sL-\0>UT;dYFfض j~lֽޫq뮓$uYFM5k,͞=Y 96l dYձcǀ},Oza@.]hÆ zTL)4uuwƍյk׀m[e3Tft9Ȗ7|S*Ur3zuwkn0Pvm͛7O[nU쒩oQ'ONEl)W֬YN:e:zjѢi߾}>}V*ǓṆaZj:u߯W_}UZכ:h͚5PBGsCrGi׮]ڸq٣+,,L˗Wrt-u*^ Ðif?2 CaСCɓZz~ӡCʕ+J*jذjԨ! @x<լYS5jԐ/y%g%KTϞ=S}W.Yn sKyD\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\G\Glxh^yG6RDpx-1^c[˞T3ĝzk{Y/+ kݸ5er+ v)-|(BUjtҫ;d7Ḍ[Mت c?Z_TV/>ҳ tԗHPш~_3Ơ,I Uծ7cHR~ZLBFnOc*>]W[J*K~>t)\ _{BpO:j߰²*V\8 5oGqr ۧZ߮"kj;ue9\wT3eimZ4TҪߒ2ض$#}Z'?gvDjS-umiksl~/lI\ v+ cnWjeMlY^힡'zwPjvPv߱ojݼ+)cHЗϵV7w+!~ydSo R}0Qv)R#/5nVv1 KM@:UZ<<1jI3 l;iꕚsOv$X~o 5ǫ~/?%=Fv;\cwVZl|{,I%_VNg9Xk~qFO}ZΧo.ϗ4ړhK_4je!|VL'}Z|d[>lIj&QÂU}zV'甭_i-5>z\9S–i{ d(;:ߦKV-mǫcME FG'cQM=m8tZ_uK*޵B%Z >P@zWR\*u81eFWuK-[[6T~oY{*}*Uxkv袝F!4eȐ1edo )x4Ug  Z!DߥVLO>SXP-0;ުou=ѩWc:rA_yY X~,%IM o<{T5SVL ߤ ZiRrusJ3#ČӖ$O)]W*efz$R7@/)Xw6&,Jv]T 3펐>}7zn}^4ZuJxe~wM'o+]z?tSUxiu@O _6dz I{nԽ'ґ^Yl'Ϳ64Ly̋i*15;97wo@pEtiď׿4ҝu -=)oʺdysڿKKG|:  Bdx+CA(c>84zMmzu:|Axǣ+(-[9WU;C8kEu1Wu>VO=wT+5/f$ґ/&_l]o'P#Lgkmհav=!ItTa3E=JHzYGZkhjATs9oWKI A I4iiS>4O)^Ig^zsSCUu<^u,!O_\-=-B2@W/,9]0g֬_zQ?>Ii[i}ljJZerKsl'RV;|R=vj3  doq:::::::::::::::mӦMÇMe˪gϞjР p6! .hȑzeYo{LƍSXX@ <Ú5kVC7xCǏeQrd9|$˲4gEGG˶mg3 !@8q|>)۶5ql%{ PV-p ~M/ڶm_``Fnݺ-R>}`4x4y&\ %G̙3k׮Kp{8}~QժUulٲf@"@bbb4x`?~Ő,I҂ ,4iyu҅KOdKǎ$߿?j+66VzRLL C #GhȐ!J\`+i?M@t:zk@ʕ+9seG>@v,TR^ - 2[]kƍizK.ބ믿֑#Gj~}HW]4iDn>|/}`n-'d,{H+۳&R\ι9bȑCʕ5zlϸ-# .y)]+WּyTHg !@R=*[9Uҥ裏jZ*/*&1apš0a&Ll\Ř\G\G\G\&",Ҝ9sj*%$$8S[oUCUɒ%͒'Nhڿlv6UhQ 4H5 \ǏM PLL֯_p~ھ}{)隳g֚5kT^=BcX+bJLLmۙ~,Ү]W_ ֭Ν;eYVy},R||MpM@#qig)Cm? RKu9C\ӤIgIM4QժU, Y~y{@U]tiZhQ o^& 4& @5|w.0T`A%&&*UJcƌr %]+{ #sIi:&   ~)<<\aaaPfd͚5Y‚~U+WfkJm%@~&ps2uQSON7`ԳgOٳGʕs6#gpa7̙3d۶Μ9o6~W7,eRJΒzg)] ]"^{5*TYNСCUfMիkСuCF +M6ڻw6nܨ/:|ͪY<Iahĉׯ~ᇠK,2:7@0 Cʕӝwl * iVZU)UF\QW*R \G\ d? 4~vuXrUlYgI۷oW~<ɲ\r~AtKSLٶ-WOz DqUwFjmUS?H}RшzbPssc+ƩgV:> lY> i2m?r5wηA?{ )? =^gWH1ZJ'$ W}rh@!͏n-F[l>eZ!3w:50r{}Ր|id[_OOꑿ=8i:zaPS;쥝L=~80rjOЧAh-ҁhyI{d8fԯ]=BU/[K8wz3~Ǵ}eoqT*HR;.t |j}[mUMݺD5&`!u{^G9LR?қeAh~(5E-4oՓSUN^VIRJFT{V5/#gGG'j|Vd\"Av. ;uj:Y/[[Q=2.jjR6#wGZnW%J)xV]q' ~&jli*IXvRsT NR?~R:kR$JЈ;կi$HRH5a-hU*xR-sp9+$O|}~6]Z^Z4poz@A|/ce3ez=u-}^3Rv,M1-ʯMo~j)V}8C>̴$ȯJ8Xf=3EQ:x{zezkrZ{4+.ҳCO,IOMuMjf\lb_s2-XI[hR^jH]_@Fi~; v_C3qB;R'^v6y }b1?Л/gl[xdd}⤫;%ktvc?vUq~ʴ;6y^\V̖r:a=~'t\S!* v^: MDFKH>Es6ԑ_=^Guߨu}5&3v=?uI1n #Iio5m)I޼&cTs^xIǭ*^ }AR:#R=8V6~]"R5?|C֥)_sHQ*ܩ2*ɔdTz"lVY[;\09?)G)).ܱ2G=2qqVl,}dgq:ER-t^o{N*O_\ύ]޿SΑԚ2Z|֛gVocv'l?9X;|DrARzMrzaѸZe[Jqr.J%?sZ s{ 5TFQ1Cy{ D.>e]Q w:J|} @ulj1AJ`:h@:h@:h@:h@:zT*16zTJla|?uŰ= >D:EB}'~~cnX\}g6yzinj'k eՂhn_"< lw0F1{h{K7-Jը.%Iô7~U]Zzh65U 漦F5 ZWje Z(TYЀP=uݱgj7v/VVԮݿ]I/ԟnuՋt}j>)5DTztq]p̪җ?[&|VW_~sUjѭ:e$gTM;KJoY?zprՏ/vzK[N5Rvjs~=ri[ih:>w8IjX(Rd9z~V@˚&nFַjyj]osfJ6@sQYK|Lo5vm 4絙zgJ$maj{hGVqں5;Z{{-k+24iIhEb||4nVlU4`֟]8(Џ̞=[^vxɧ$I_qkt:s=OǏ_2k+=[ ђWNJwM^G;\|v Iyzt5eP%4&G#ОF^'-.k/3S7{^r';h|K4/IR-vιzx_=KWm[3eI׼'_cVZp|eّRw4|*mݮ[^+ O##4|Vphݴ͘ksQ;$+7d+ծzA M[LIY3d -^9 Z?8(}jPi=cY}>"\W.l@tFG;s?^Ӓmc]6Wf<{glFFrj8r5Xr_5c͞[k$EC޸OI 5DR-+>Kjk@$~Ǝz]?Hّskfc7Kw!zmnqiAXOʣе|ܲZV*}בBZ>Ɔ;/q; w@]: Q>SˌWRsf^{&U< :lp k mRo~^/oF56i)jW5t_ׂK#n[wҘY?71_)͑<2mN;n\s|; pɚPG#j5rF{i w [mx,=tdZҶj>RhbV(Cĭh`{kRкcn7O$G>kR@5|3/O:n]與WG(z@ 4mzȣ>SpAgϖ~K+RO9s4r(F͟?OgsOnz3O9GRk~Hj1sYo'&ocgR8w+J6kύ?6 j\U(j[mT PFpe,kÝNB?h@j/_ۿl`:h@}HMmm@ssjjkmt:8aTQ6U:V :A3gTssM577k5tHMu0A˖-S&DY-_LC7~CƎ]_}_> wB"uuu8TYߦ:hll$-^2ɢ鴆44@ب(4tP^$NAC(RSSl Xр(_s:|:h@eՖ5x~{ЀUGT Pu4 @рUGT Pu4 @рUGT Pu ЯѾڀ~z=[/6 W\m[ck>!zL6fKVjEKƦQڴ5P{o6FTgY͜5S ,TKKMjᚰggݵaoQC1Wj߭7P}ZbU-===4c|=ng欙jino:F7inn̙k欙DvM^R;_C'צƣҼ6 i>ZM0A.RhykSRv{lEKFiFkjJJKKjm=d]ZT]ooQVM*{.R5+uw@T­o_dZT\om@tE9utU5h9uZ75 zK=uTCuitM *PjZ^74 :{Ky) ՠW5I:{\`c.'`DZy.͚9KɄMt!SRNդIqu407QI.fXkk^{EwϟN>YwuN8?Owܡ_t'kyNuGKhȃ}f聕6V(Tʭ֦D K,7eZZ}wܪ8 /_:X?YrN;Zsd>s/w ׍'nMݺ^&c}s /NҔ)S4bp9RSL~rz+}ιKhsAAIhR$ť¹^'^bC*cR--ͺ3N]5y.i'>~w>vy:x5aH[qN>(_}>0y<=9 4${+iwݩve]|E:3SO[SSSug zr_5pSu܎t_iKDTeݠo}0>:O[뚣s.?`MDݬ 9V; :ZfLk='OoQnѬiOOGzd{xawug_<1?ZZ뚣ksa{iZb-T$;*;弰wrKHVA9+.^zFo670jk2n}G^?:]4$Ifo!Iiu%̳ғO=ծٰƬ76 մoC\SS G3Zg?xO|껺_f`Mʿj7/Fn;\=<Խ?=F[U\Lk?Щ)ޢoh r%m?ztm?J .I5K@}}>zKtχa*};ׇ5]q^g չRr\* )gmtgT^|/ty(wz]yj]~i4d~JaYXDaRC4$^e]ջw*RF IDAT\۞H+W75%߄ϓOGQtmվSAOgo6RCQGjʽH>nƟHRJUj"-ͪßbKiI4T ]9ae?O3R'l2aʫ:uʚkB|uEiw/7ٸqfg޻·f.$\;; TSw7Ip oXEKMhP|j6p"C-\<]-mZ˴`QF.a1MMSR6lGugce|E#ΛJ+TX[6_lU(݀p/6oĈ^. 9i]t:]#GWF!~5~zjI1k&kb+b#5ZOewu䤁qanY'ﮔe;.bq智_RvXD w[I1:wo$+p*ŪbhFm?vp^틼t5 C'"}|$PSSJ >XlRRˉ4|~w'5Үi_l]jkRs=/)nJ;B ]X8; usNFݩ$EO.@=󶖵dԲ]|EҾ_kz5ztnš:xk͗QSU/~K-?#h )o/5~ӺݕYIYxUAqݴW(V}CmДFN=H;ϾU?/U7s]Qتuh5][L9kw@*]P?oV'z8T@ڶ_5h˯\o3qWuR;Ln:ig~mukDaQ /眫t;s|I^yU6 /(|E״F?#'tѫGx§bxҡzU8~/}MVIvYUF: r:sQKJJG~&S{G?Xp<㓺njծ3E_bjcFs/_k>uRFmvuD-)PsP ۘJ]Wu%Hmw^-8-֋qRg^r姟|X與WGCc{Uotle?3ݽ'p;>Njqiwީ;KozC&C-rci%_r;?<3[k[VR-n oػq!Qjjw!VuIBs^(l/lVm(#?ܦ;__Xhq;J,B߾ibR.գYsb?9)1=Հ("Zzl,VPTO}R*󕺮zQ {mvmhXCְ6tlyzJ7 Jy56fN袆.zY5jw9͏ָc۹Y)Yńy)angmNmZh_{KXtwm/|ʒ#b@GCƥm̱! tq\~|R^Ն>EզYZ2Tjjkl-R:,l篳B^Q,/g͹GfoK71Rr5q }~ Mjt[qmژ3oFBmV9ic6tHf͚M6Nf͚5KCT)b}"ֵM9|vmls;ZdKrFifFgkVd>X+է#a>Qa;KWֲ|{9icvYɦ:;v}?}=ܳ у4dXED֣69ḱ;v\ʼ*QHw;Hmq}9/rIGm֑bgRQHҰFEںi2HjҠơCmFEQeC=)NACKxl-jNhesvo%ŻM[ !] %5i)5{?-{|h-zQ/ۋz36/~MjkUs1nlbB5^/ionnUEQCRj?)bNf*CƟۋw@5:ԯMW5r[ܗBPvE/nb/rβӤs5qDb$ ݸPn{9_jUGt[}X$s4 +$&ʻP2jW޼X-5N(Y蔮4 *_7Fs7+Vp=jն8{TwD.U(t1FXVsfcy{դNЖ$)!UQ{1 X/t]g%cwq*e$)ʭu[bŹ:5w烢HpJmw9.\M+gI$[').c7{1S^55U:K{58)g9xht\U+\ 'ŝP^4^H7Ϲr er9o)ֹGzLٻB$]@THۢnYo.Ԅpq^??ccB1_R>)el@ý@WP.6ڊ~7ݹ wN7wk7׹})Byleuۇbs\]m5[6ۄc<.fH:CB] Xb]PNjo5Yl~soJdԾ)U۵r#+r7s76qH<T,?4+%oع|FD1?cxEuW‰UZkc4WۘxVm̀BRJG1c?z6{#Xfq+7:':րnn׻/~<],Ԑb/f.o9m̱r\TQ):źhR\߻7C6cI) o8(\l6ܖvlcP zP,Wٱ?P i7ߒ۸p17v\l zLO6 bD_8_k/ۻwok>w: ׹}6wc˿Bfsqov4vB1 yvlI5+mmgn+P޹|̭wy?o mv{Dw7 b_?^@Wx6s&58sھ 5%\lc1|men|]]BX54snsk\o8\A]k6Ɯx):sLuW"V(q;\#5:6Y?~#‰yw>{ٹU,=%Tl]}c6j:?PΎw㺹?m.IWTw5 X b_?wcS~n/XVFc}@VnPf>Gj;c7/ B1 l='c-ލ۵N]@L׸-n,%7ǟ{;k|XD"VŰ[_X&Xw P~s ]e.'o]nvB$9"TSPmkEs PS@_66mbmrVDw6 b/x܏1yq]o[7&_ߙq>F;n6ܡv1I$J)Ik@wcKk]ksn߇Oح CքbyT6>:^ȋc5\׸XJmtw]ns1هbb9ml 4/bvo)?k1wqyŬP<+UQLpq/4)XwomP7?[py{ .عKUZNs;vl$bo`+oΓ:_(&%ǫNͻ8XEj+k(?,p s1(c'}sx}|RzZR!w\>i6^(fn7`P~os*0sy;嫢REb {y9PO]oRmlέby) bs/CŹqpo75BMkevns~۽jTRcX 1)m7㺻!G{k&o?ox:6Ƴs-fs6nno '߻ƁBy;>9cN\UQX\?vekH5)XM=w;?wo;n9ǟۜq5ŔSKb׺ٵb\h] ~N {;5bn _ŻI/hk"5| ~o2sy5> 咄f1wc 5' r=ڊcE7>R[!1!7b6 cX^J*k$5|l~_c.4b~!N?Vj vJII;[cPB[h]9bqNc8IEs ['; muN;~qHR>)^X9PW+\)1^oc't5=iVy7{Ǐ56BB1s?fs]\=݀վErlژqsc|$rV9klVH~.i]cClƓbIq'BnSy kxٸ+n~xvr_B:inR\}(&%C_,nvnN(4 z)"\1^Pqwиc{q?bv%)/APNjwP̟Bk]lލXc;{Ɠ=҅jIw8>rs6ƅbI9lvXU,]ͥE}hoc6_,s{L9?=.4)/+K B+sBy(f>ޏ|hs1=uv^L*CE]#%9{lmyh]RhM\Y*];_r xٸ۸voǾP<s t B1)\۽c7N|h}w ع|*]rrׄ6nX?f_h ێCΪy*U t;vloNލxg/wBqJ)IoΈվv[c|8~υH]+u|)9.IꙤ\R\jkB1ލm3Q9;bޮ{ǏWjc')oy9r,]);;~RkB{_yH֔j),eq]`kqCk }\Wx9*q(G%ڤst%9wbscrv')e])kJVsvv]kά-t/ΎCRtXu($vTmNWח;\КPW,@o٢q|(f5}6Wj/[w>V%Xy]SRחRR9v}\ N+w>\ ,ΥpLJwVkJI mCBklΥpr)w}m[8^J>&/5Ux\ϊb\(ZWjLJR1*x}r;IǕŒZ[(+uR B PL*?^LǕz3vgqTrr:IT*^ۙc'R +t|R.).zN BK%ť¹RtSxsqB(NŊ Jst>|IDAT-ErWGW;OT)/em5yrlE"+ϧ+ZuRykrԵ+EWՕc+]y^]9r[$:u*=OKՕvتmW[W/EW+:+yW-UWWPW9V<+=pz[ϧRWTTVV<%8syjm+||u^5 uފ[[ j?jзU1PW\_(5t. ǩVTt*{q+/νYo,{sV d!kB]P~`(븆?`ޅ9[IENDB`kraft-1.2.2/manual/images/de/unity.png000066400000000000000000002576501467704360200176430ustar00rootroot00000000000000PNG  IHDR z_^8z pHYs+ IDATx^w|P邊 QTZAإQ+J ŊzE zU@^t! C$ݝyȞl}?q< n<( 5@qMDDDDDTj qX&ϑ,Pǀ*]8Ғ#Qv%焼*dUP_Sn z?jDDDDDDT9UQP7ĹCe퇈*T~⢺&~>],c%z.As)kvb*&"""""IULcbo^cVe/z@WbIiE_[Ew"ȺDDDDDDT~I+[GE׏WuUdpnj;DDDDDDX%n'nUdY7.Zr[SuUnv؊[e%Xܨȶ*nLUd"""m'R?nX""""""hr7c#VESuc*$} ]OnQ)YH>ʻ:I.˳,N}Nq |_yz{DDDDDDGX'Q˳NLd<.:Ӻ:ь%""""""g$ь։U܍[u*P%7zu1'Ɔ듹GDDDDDDMÍ קҍŀD^+P$3:ۘn.&"Qt"%u}n'u_!FhuԘ1:Fm/Xou=]\m5},h׉v|Ufb1^EjcmGvqDDDDDDGIq:>ڶ:&R‰r6Tt|mm[G7FEwR&Ƒb*uLmm;xZe%nv-qd>58USr6 r:.\L틶nǕ[hXpmO4iYƣmGx|UEI]Gm[p*88-Ԏ$ьJhvnS@7p,s㴬"Su"IouSAiY4iY4F7^q;nlT♔ݶq@ٱ~-Ӻt&RڂSqJx -MLSX֭ujvqQgv+ 2׍խc&,e_ub5p&9.$_yu­ҍUum'x&nf PvSrs"mSbsGDDDDDt8 ;Ou1:N1N1A7N]ֵfLfy|u ~ڧusA8uYv<UgIuyu/br[e˂qjIǹ6݌ʎ%l^4ms3SeG# """""F,ZmT$[s se>uvf1#u򌉔 8y[WSǨ},8cv4*.QUPW])aW~u.$b29sӵub5ƵX'n7r[7׭_""""",\"rieKmu.ո:"-;WjPm5纘'RLWח u.m[]ֵ+V!"""""HI|FN\I1Gh1Vb8u.jIt+m? ;-s]A#v,s;vs~71I㉈h_utɿ YҲgl!\Y:b/*NVm/\P6Wոj@Sq51yY˂VE'""""""%j6OչSu}rZlЭ ,]iY'\*QhDM䶺 m+m΅ AݎSIp}DDDDDDA7\Ou1-Sb.c.~EC1e-5濫*QpNI.)\]VjWlP'y >ur˜"j2V@>1w*b$WAS1r\. D(O(o촞ɾ<Pj!B.:x$D\jC^V:nTь%"""""hpc$-Z:N丸+1C#㔣(ĺbr#o?.\joH1ݲ N>u mlqCS9mUEHIo_,;]k;MW*DR:VXGݾSO:NNq}DyKD_Sj@-<Ɖqu. Q9ʼnN p[Pwy\ Ԗ A -JQd0q.&>[Yk*CC]L.VוbtE€`&%oPu{ 6 ͦFP" iY3KJNrʙg$-㗿:(k n+nu][>hrhȓZ|0jeC#""""""w5Rj]yzE 19. ڕ*ݛ"~}qfh<^Ek>b~"!!A~O՜U empt</F>\l1w:".>Q|LJq\X)0 IL 0mX^d&s($&%Ӷm៌'ECELS h[B_/ڢqy\&#a>,$i0jlcW9X """""D.*)Ҳ-TMؖܧEꏋ_:\,ދXbY'bao(,?y 푍@A`KAٰ| 9m[AKiEĴ-.8"W@Duu1T'NZ|p M.8:y&67 4$4D Njİ """"""\4U|B䪢O\Bn@ٸ.NÊu"5m9.:F79*"|l) 0Lw@v]lhR`gEJb:Lo*iϾmQ% B= $|Unv!qyzj;nDť211V$m,>Q!0CbLV0|kl NFRr xZ H@jj=x%ua p? {QWW7z ^-3N;ƽ)y]:]o{^Qm2Y?.aHԮ#VBB{p&^}i8LSڶjm͏?N #_/~WrZ5D[V4ccPսQm<&"ym1 ڶVQԮ-NjV nvm* "'$my.cdXUVͩq-L;U]F[~9[(nDZ58hu.4vgΙ[Ф{.[ƱҎvM9a0M"r0MF(iMJJĿ}VNrR֩Wg  /q͚szشekj۟si>HMMU0,L2 "߯vƍvz"t<g~:̑åݻаA$&&a#pbxzBZZ옣Max hܨs'L >[a88ӻ'&N ~Ծ[ѶM+bo1}ַm{a'P^]<|1k\}ſ`o?6<7m[c_マKpE]qſ.Fzuo?2 ~At7\sRSSu[9g| èaOxg\ ^?/ ~! Р~5N9n̨رsѶUKl޺ {^E7} 'i$lݶ ^M{{.z=pR{,/||>D,\+&NX[Jн[DžXlWdI qϸ[P;2C ?leDDO ^yKT]E cԮԮ-O>;0aW1o( c^+M=#~\35S}{6Nl|7s-?@lܴ}`c0M*70аAl~߰- =4ޛhP>nj<;jtq/i'[o#_y@uԯW۶ƠOGk?FO'ǟy;weYwOk?$ 1p5WzкEs.<+ذqSq0 tx:|-E @ +x<|_?r]|HKK6 Uƽ`e p!OGvN6,h(>@V-snݷ`S?_}n(~__":,/{>0/}.///{g) y;bb(BضKqo#_Kႚₘ;>SrP; +!q`d-B|!-2cgɲ5U@DW\z1ڵm5o%V@n.lyX|%~?srz?hܰ!,*Be۰,/$6@V-1i(uN,uR~>


oO-۶ҚEw6f[W7m)U6+#M=tr>5q`n:yzq1K_x{yq_;QFP/mշ,k .^F 0 ءfΛ8r[⋺b+O⃬vz:{ xgbp۶_P.˶m**V̶t,~i@DC?#ƿz\˲yRL8x\}hP.5~GRNmF,CχK4MmkOfz=7_4 `-_~lF:u~ؽgoq_ Wzi~ԫ[ &~{W_[nN ;2u>mxfK8N}'+av_ܮS; -N8HK}Jճ/F]a݆J]t :~1y8q#\|aWt<~w{]sSm%Ҹ1A9z<bXl{m[,ަ_qgG^ eD<@<+*M]}΁U}Ç>w'}f˲}ep?gepGP(%ǂk7MT*!Lp[խSW~.跹Ff_' LbZ Ďg_mVߝ~[y {cO=Bt9<|7>[tiӿs'uƌàO "ݒe+0rx 8gFd <;rg[ F_&(,ءe b{C j;p/S " oBm:Mr(>1qQuLDJHQ d4`O3׵@[ziM&r Njѯ]:tJ=wrJ+Ӿ#GjJJq|9ebbRRjulFqIJ TY98Ḧm۱f:ٷRRQthP^qEЪ 0M6@'[~ sE=´ic˼f6^Z6?W\C.V;֮ۀB8Na_{N4mr,lƢK@ @F SCٗ3_$xE6c=aDtYlfxL@3vz5JV-QPy!QQFӪbQT'[Z%sOmCCpsS\q&v>NrBɓ0i8u!wQ%""""")/UV5&&!\;\!t ~  c' b*1) KRω%"""""jHjnÊ>1r,dNN ,Y}ScreqE uބ<̂zؿ+Hf!j1>yY떝֋ʾ 鍪q-O2+ArL.H\/ {$#?˂"(eo>i^ Fh.sKF" h1&ZKꉈHdUJ E[,ԸӲH-. x / ѯb']qU'SɉSqQpo\> M8Jޫn""""""xr*jNiǩC"͆UnR+HruIU]N7UsY-!uj;&7E7Fm!҉ ,O" \NGZ谔UɆ oDDDDDdBj氺ey.u5b*7c\u"ԃ Ųn;NhοӑuN?gADDDDT~rR5uSyJ q餈<ɱr -o2I@j"t9N1U>q1u NtAwնӉRcr\ݖkFW%(&t9i N+x]sN <۶waʔ)qʼnm! LcOT{bZ1c͔1 Xlض``NW V x6`aJ 姏;=?_Ui_ʛFWE;* wpD\'T &`j]wwd֬YǗڷmxѧOx0e#o,̼W p\8YjG./W!?TQ0kEρqmh\DލA vp7Y;H?wXbu nP⛭"h{mn&=nG6>|[2c|2s% P WZ mVMՑeWԃPk qހ{5V 蟹molOJ۠k{vޯx' y"RmQ :f\' }5/_]߲`;DDDDUP<5\_1L8q~(S xhL0pE4R۶6muT |5' 4t@XcrܷF NHCzdx!!Čul#xK2`^; 56B% |$V4$8~{"7t7.L(%PQm$󑝕 +j VA6XҜ_,d᫑ING܇YE7D"AJhW¢kXݳw$H'j)mGC;tREj4${#P""" :Un:Qf ! Ƅ#IAABjjj$))/~5DՈwc> =Bφ^v-%l#GS;6%V.6=v.w"`0 jv\n$+*\kg`cKN S ˾Ƥ_`k+7<) 7GZ!xŞlh{<>{ԢiyE} '◩hXt+r`Hv7|%N뜌X8y>fܘ e0Q縓>SQXd|,ۘۆa& 8qs8:Q^®YucBe شqoLmL7lγ΀oɃ> QM4 xgXYmHcv¥ߊkZR!"""paD_wcPdUQQnOqRe0iYfD`1f/ĕ='Ŭ7g -Fb{1m KwjLAW&Xȣ6Yo`1q).>,U<'X9­m>ǐw`+9[X࿘wߋxgs) = ²mj/?fsE~%WbaK\mdصg|ʯ :4a~y/|B]O*`AB7o~ 2IDe:` ?lB k1= Ǘxf#)q向xc\&9 bˌ1߰$6BOS4b+13k8Bp f~aAlc:W9E,PElvЏ݋^O„>MK<8'^f+) LÀm=9Ķؿ#<51s- #&5lص`E RVx^M-Hl9_`]8U̶arHi2萤 """yqN_}*[U*@J4'8*L9>nׂ cǎŸqJŚ7oxzk\oIgs~[(X6w_k_ðu\[dtv.j&mEWsf#CdO bp\3>Wqu+9xE[ xwm ĵg5CMk?V͙/DFp#%zR 6mp&~%`үAX72\3L>: JղR{w0rwؐoVV~-2 m}?V<ݫ!-.Gnv wL3o-څ{?_:{.;m >lFb ^ruaz`~m܅{{vGa +}w""""jM^[mh~buvb-… qiaرػw/`'˲ʌ@~p%`*T$G a a΂]E͘7$wD9mxx;pyǖhNjFp=p lKl^0Lx=fٯ],l ,m88|89$MiDlsS")6^r*oEگ j. ulp=j.;x4MpZexn^59E_@_r?EpZ܏_G!Z:֡ڡG0+Q0x!kzuj@cO=뛋ǃZطf 9JDDD_]c!'v( /ǖ-[J="l?#z}CJID E#]es`T6U~XӺ.>4'c0 wbe 琝3Q8t+>zN}pw+mXl I&4]$tH$M',.y;{6`aÜ9۰Tl6 Q7 Č~bGvaU BIR"_N[|ˆsE}1[qz=OJpm(,v`dò6K\Ra73 ңHjvx26d},K}͚WB&llX=A 4V+s2xcd%&Ptdm h"""X楱NܹjI89r$mM*mۘ:u*~CZ(v~cx .\ v =g- # t;WJwn]L c<XDì;x%Y؛-=¶NS冁5ކ<>ԁaFT?Nmd*ۖK@0hߝ^o@4ce U.?NW@āVH.=\;[?>mۘ0a9>J]Q~MB;;ŜuضgvY5L A  8ptH@fڨ/7q0錏|XvsO7E9ʂ3!5#}zK0իaxHN +=BDDDTeȹp[;"v\]QE,^XcǢ}q+K.1lذRW@Tq m?y{9s>f:vZ.(k>]gރ݄kymmnE}0ݓ{-X)>_;DS4>!\7Dza:ҙa(x2PSsn|?60=p>'""":|7ߏTW۷oWCVZŭ VZal߾.-wtk+1y~5…k8\./Xؙ=T_]嘏z?3fmtE<&5nc fL''a1~>\']$6v.~/:T>|;O{a膖f*>L8u:i)mcqҳкqMxطs2,¼aMSѫg+zk- {>FK뉮4E$ ?{[ywQGE.>B#6`S{] ?lX3pU퟈X ];S6?gm9_(z8֏aoǡ񡿘۰m |H}9 `:̟2 >OMa[6zEwz0jҡ`Kņ)aC_mض 3MɇmͿa?sf3BO)zoPDzѹ--D6rW~ih \騸퟈* "v|h}A4j/ĩ)~FzW zb4M}Vc0- m"Ýxڦ(ޅKm*~*>0kO܋Niԃ]Ÿpb *Zm0IH@uz :7F cS0zo] HtX:]|G?U ^ADUeti26sHvs>4;|%~olޓ ;7i3ͽF_n^tE M1.]=7.G'%%!}GkJw/__ƿu^LRζ,)S lXAo0=eQi[AQ |b0P5~&= SeYN#z~0LxJ^\>Y}9r|L80j++!=4 Yk8@7>>b ҖE%v-Rķea'Œ*a"Q 0=ῶP&W8m\Ⱥ{>Yqz\rhXADDDDDDDq DDDDDDDw,@+&DDDDDDDNX W7.w'""""""`\ҥK ^}U̜9yyyDDDDDDD*>\뮻0eؾ}лwR ۶K!""""""x`RCTVǎqM7 " "O,>i a3f N;2E""""""HX j֬Yfᢋ.bEnݺ>}:~miF&""""""M()j>r 郌 ^~oaر,ZJAb^/ڴiSJ׋cJ#X RaFA1x ??_ E^^SCDDDDDDTXj޼̟?mᘛ7o^8&""""""< T֭Ѽys^To߾8p ZjxDEa޼yx.iFDDDDDt(A1e&xׯT! 33Æ !l.S|HNNwQd0\߾}ѥK2IeYq1M6-Zr 9ǃ)SGXt]i ۶a"W F.1 (.ׯٳgc:uj~x%''ǽ'`T;oǁ܃hѼ9RRRΪիѺU+5Lqc^|T-<DD@nAعvlg"X]6>s=0a͛m۶bypwI&d5c.l(>a*W-<U F#4nT (<:w>;WA_Xx^,:bDDDDT5¶,f;0M"""""">b"""""""; (X """"""c"""""""; (X "" vUvƖy q|wnW֖pE<(6~ ݚq>~|lw9E({ld3ADD *㫇) ~71ɫ{ngygvz+:{=\(f0.-AasböqOvذ,5-+EF_|>^_QX|1\ع3yu=A ,||tIEXZ9c W肳Ͻ싇'-AmaӔpNu;#3h#o\3..v)l.,u1z5kW\n UDDDyQU"'v p,^Rc0`>{L!;k)nmIf?\Ǧ҈7Kq[JٳBT2uGg ^/L5lkY\ E+su1B3L/| [^G:s_y_:^ >;OF 0o_$DDG  z(\χܖ;:Qs@px6}2<[@́c{o`֚gã(wrI4齆z" E.!UP4 H Wrw@ٽݙy/7sx8k;Zʍ׺d6௵z4{gdCE|\ޏ+rImCr$=goI>t,@ܙ5|5b;Ca_3ch?Cԗ RU.. SOAӫYYolc#tcy!߭Kbȝ#3cA)DzѱX0吵>~PK_OfʼnW ~>3~{˷?b85MX0l<ͻxgH=z(j<'#y{=ܵ޻+3Z$Y,Y?cf1u]i> "PUV~ڐb"#Wު Ⱥ?z`XD=WƨE*탽cJ~(a~֝hWjyʄD\ ?;x+@\YZhq/:F1 3k0vs)K3 b5MX4b G~L[y(xN.DEE !k?+G%C ۼvx.^W&JՋF,;r7ufJ6OMW>&abŘapB1X1O^AAQc$PxL sx7>DAU +a 0s\ v6.HE 1 Wcު/sb !H  !Dg>/{3]|Pt^/:}ĀPh=LXOHI,Y:Y_X0> J5+Fx&4/T&KқՓWLY6 aE~Y ˡ<=| ƷDC_Bz;+w\էx\^UEghXfA{/M_d%-UlODXȸj7y|ڮ }{*KIPjÂYT'KMxf^Ȋx/n&X۱pw7[UfEZ:+={wGS1jd4涽˨B|{*~\J(~7f|\y PgJ̻X㺭ZCZܪőN\X| u qˣM~?lp|Xl,3$.7][y̤+1ioܶe-:Mߵ C/3mK7fLdftb;/\Y9g(5,b?qeTV?T&AjթsCQWj|P',gp.$;/Nq֯!$ByÙbbͨd^CZD@Tx+ Aɮic=|T%C1?K* &O/F/YK#KeZt[͋" [Q4F?y*"ӥgֱ bz.LfIѕWQ'VmE;{X9ڵs`pdNZvUD-tC(Gx̶r#,VAQ  W֍eʙ|8`*+0Sk]J1iMyLj7 ˾sNFcSQp^>UA3.95B-Ky=ď>FE`0?ޥY6y_ZkCQ#dh"]6(ְSy$sP~jNh {DkNS@s&_|;V; pB!KoI!,0m&t/eLl«ۿ(iȒ-7d='8%_za/do(񑜈ϓpjjC|ʊj@լ#,#JP_ZCSmTR|\֟G=Gm~?qUMFw ֲPRh|+#4dԈ[i5dEwg¬h7Ns7]itΔ?_axbߨ}: fF[G`1~:W^P X3~b?f-Np+c?ҵѼ$#عF]]:7ɑz9Bף7ޛԖ`(.\nTFϾ@Q]:çCPpg&Mw|,wй{}]$9%BN%(kV^LϾG ~3R: -D F#Ѥ zL P&xW`Ok)F I /ӳr9O%aN qwMmO-ů M;}BKH`אP^E5Zyo.sn/ G|GL㑴͟x.tH_gIeחB5N%w 48>/DŽ^~욞RZ4QQ66yrd0ubJ|ů4MdʄQN: HW|?JNqaO\^n0SY#S?FO*g-hyCHp~ Kwt9 /(kcx0g(a7kyItm#d_{ GЦ@cŐ5:y̙H5+2vW!k1.HE%ػ jeA7d Sk:pH>%6QS8[:{ >~%8opur3Ȅ[ݴS ߓ!{yʇeCܰv+ʍ{Kɗµ+c^6oONio6*!kQ|x0(D>~>`<'lss _{ouBWEXoM\t~M{cQ ̔9s xRW|ЕҳYpLX#~GyvE| [Z<9MGQi\OF'䕗_Ɖ[hZ1IӰX,6:M;U$bN\M\M"9]CslkcD1|8a5/;iFbnѸ}r)?)_9$3@!@F@! (>n9waBXFOh&-yt%؟0pםfn$2p m[ȪgvyʏPy}@1; ;-U|5r-!acWD 'IWA Ia<\>_$m#n7sf'|bi^F*d⾃Gap. u i'LBjJv6cqo1@:%(z{d-8>o$_Y|6aG]9OLԡ9m2Y[LC{3ŒY8y1GpLH1S*#{őhQ R-Bg+%̾dzxӼi>Ӽ697C'ٵm&ѦX Nt/˯g^)A,KYP1 :c(1P5,+ ]ܟMܹ;;x !=B~`T#\!6aQB@mb~x ~сF:uBgG: K:RciiMkI/|Vuٿͻsk,x>+-}B$ɗ2Ө8EEUe/ 3\񯊂xB!x~Lx8ut+EES2T߁Oĭ^2u)W?~ѓG!bYǒGZ!EU³O ċGQQ]\E9 !HI57-dٱYc_2~?ކ{b7|̈́Mg0' K!B!D !`<#jh4b "{|6!-cLh79hȑ(3> Ӡ[OVʂ VDeͼs]6  j.y]~ЅWd+XBкWW> +߭T {T%ز Uݩ̈́vvK汬i',ϧ>JaftǂSP>x{eCݨ̈́b>c,ǹ}JHQZȻQ-X?q(W]IFAx>;9B_} s?_?|Wq6&qsS/}G= ? w[p'u&J7+]4.mĠ9z:,i)Լ7C"X舏hG8e;2 e7-kAFQsy&!fȑ" )B!FF@!4᥍![G+T[K<9:@ʖ0Fs|^,&:bIxvl$sۼ/uI߮r 3ơ:1; T2>xЉ?:v>+.b yTJ,c14ˤpm_i`[4͛W1V 3GaNo93-װ`OZ}8+5ly?.! ig_/a݆uyˇ%f?:^9S.1:b[MivvGrZV`ڍ\'ٺ^puXʰYYinʧ5ZL]ɖ^$Y1Gĸ\9U6e7{$P!BËo~_ S͎4ћP2+gir"C;e\!B3+7Š AH(:.bYMjZ6?lCöȒڈWT {gqCWlb>&`PQ?0t|߷SӾtzG9Ȯ^RoJ yHy,RB!&H!,>͇!5&\NF[x.]"mHZGYMߘѓK[ozXt;׹bPOx J*Տ@_r5~/5!^;} {Ozդ?OO>@wtX_G`#کi}O}ҦkjN 7㭧{2=My?#5&+[j7IP3Ru/J5kF_+ZGȲgH!{ޜ=w}xgr';yzU BU|(U:߱h,Dxx~ǰ|%0CJfch,\5@,'": "ٟv_[fu4͙g~ܝ)@x4w#a]<ʾs7U>!9ɝїx}@-\˜9BL[] 敟*U681;g!m0_JtX*JT*AYdI&dIpe## 3jH ͖2Uy./1ޟȈ^ x%t{4] 4h>13QmOOۆ?.?!JRN= 2I%.b "g OW>0w gH#†ᝯfRFnߙw&hL>C߮E1)2D#P}6ij b^nT87}oZ 4Ba=Fq֚A|Llрٗ[拖-%DCKn'm/ Baݾ:#rTlKjAlW=$1 l!B!x^$m)]R;;Wu7:'r7&F{ā=D25˚<}2`,.#UM|5,b٢m^ՠi!.3uP Kj4$/+~,b^b]u?6]4ݔR4t۹9ݔ2!*(d<.\g@Q z(*JR m lyGZUMjCﲭ}}>člcS<S%v^!y'J80ItJrke_&qD'B!/B!B!8B!B!'B!B!xB!%:K"_ᆌ;;m%">L+=}x5kݽH)bCD1}Voiq+IiW0 $TD]cQe SD5).n[b^/©e'KFa8@ G>5aܹvu5>$VmXgm/Yr)r]T W,8䂵Qk]?VY /.Q:M_cuֱe6&Ա[xxDZ,y/IW5G0l-u,@U.1텪c)JHF<;sԣ{&#GtѱLbI~&=+4F t̶jzKBB)N{(rѾ9ſ*ambMΠp)M`PZ 7ff7|PT~6go)No=_/|K48E&5mu s5M\=@ 7x9dIJpLJ= ڸ;u$!!`!D K50/ȔSehR߭a..O”50(\;qwtPHutsH{z!RhX6mNbCRDppw(]8V^~#"٤B!RSN (+_maqꇕDZSOXvd)+擈+&Ja*Nܖ/"er[:@I+%)}f(y0*a9|5u'7,RBIOZy}w^+4otO*4oMί덀Љ{vmdj)5u1x:{!^p5_ca%oŏd޽U(DGh݂EW1$,H9kt~.sӕ5 Nh54CŞ?I1( ݺuK Mطo_!B!o1Ztt"BCCu<-IwR*B!XxxZ{ !B!HB!B!'BLYsA(T*u3 _8z",jy%@bE]bE)2,V74`'^\2Rk~v% @AMMP5u)͛3QkiQnBTS0ү.gPϥx<5bCHm:LZ"߈y >'?mEe:~cˆұneVJǰL:`9;dά^Yekw.Mre#fu˵΍?TX*M>`Khhr]'+QVm]Mr7hIհ0*\\>-+YvS ckm^4s9mPl9|}]b@bOH7Ov t_*Vc=ƀ{umus Xt+pѿn1Њ>J ܛj)7\aa䶊Ʉdˀ6o2q_^}X/#P!xIxhҤ %KiӦʕ#Fx|/R\9jժEڵ)S &~w ݜO~YökX0CIw+tka)v&Ya#Kzdq3=7 CCT˱ighXogCٗ7ld70EeWѸ,v~*iXv#k'$ ,8mFb5e2f~/PyblXBo6u@|f .6`lߍW TM"Q'EG?$VmXgm/Yr2ˀY 9e#Qqwօta 5Y0z ,kY3j$|‹uly ǖ-]S<r*&Q |ɐ{b ([di\b`|YO1^7ZnhWW{ jwKe9kme'}Hl5e'D2V#j_7x,s1GyBB?xb_>f, wܡo߾9MŋԨQ}aXX,8ps;S3d#?Xr7x6{^ޔlڊiMSRyкTz|dX|q9S~~ݲbZZhӇw\ NˉlW>F#yS,4 Wtt[M+}"Ll wy@)ܼy,myif)2Fż*j&_`JY.[4mZ Mx7<iLmF͐?Y&bP@QU Urf-KUd5%a6oG퀵oѯYA2ʔp"|uVc^*M<|Ȝb`Rp8޻ÔCǀ)-<@׭nh\ۼc l9Nv5hfa:H8ބ|t%#g\Ԁ;X>^K}zqbz;f[Bҋ~x̙î]u̙3ÇeȐ!mۖL2oŋUGAC9}˼xa`f0_'gV<>> `6kPQ՛NEGQ5¨_mFJn IGrT$p$[]rSő?*fI[ۜ!՗-!EnPNk[bu,+W7>۶R#u -MmmeocCҮ'#_ ;<^5:ýʝ{ ,o#Lf D?} bR@Un@鯾g噦4{)Z^1r=}V18er0=sBHxblhFFFry)޽{e׮]4l[·zlDVR}x(*yjްtee*N(QXC `mՙ4z@n'2o FOeNEQu/7߈"vS`iZM<ը.wSQ!8ЗoM姷_ibn2~Lw̝֔(Tzq6u,F_Bzjkp>菤Wlt|wc k {cۘӴ{1M<b mHb ſF2b6|EƽIgP8T 8cF:DO1o^(q'B\!lٲ9^gɒ\q=ܿ}kUj".e߹t9ɝї{ͺ?_̖\޷ȕ;^9*fY7 m'R_!KH;G<"l'ʶuɟ#/\s-;/ť!KUl ^G7Pќ9z 6VT҅գ47u%k'q(q1YaWS/f`0@쥿9qCːDƸ}<;o ߕtY% 54|b@ɥKFSehX6^QTKugX{?۽;B dxb~mNʵk8vsY)Pt>LeykPMs~DAig #M^+4otO*4oMί덀Љ{vmFIh)5u1x:ŋiٲeXb4&n lڴ͛XVxq.]Jhh(pj׮}ooǓl^!k7w\6m2Z<˯R0KX tq{@QPU͢jH[*Ӥtu(j.,{GQAzQ[E54Kbm:k(*b]V X+ŢmKYCga-[]G5(O IDAT۹鸼cuU>Z!{Q[A{!b $]8v,aq{!HnABXaY`M m}4o͛i4ۖZObsw_ge.x*UĞ={9y$+VM6Je~ŋ{$$A``p_ xXߺ q.q[?TT$7WPTR  nz&:xOˬףg>y'1eV QTS'BxX8eB!^!(EQȒ% _|~{?A!B!^$! {7$ +cOY20ghE?ej灔B]x5j$9cǎL2=%x%1Y<"燔Bz6T/ .'JB!B`'B!Bdx*nݺS@fΜٟ#B!y## wNvЁI&9:~WիǍ7uGҹsg;ݶB!B<≺_C:uݻt3gNF#1rHvq?B!B!R6O̵k0ydNرSN:ĉis/!B!)t@'fĉ>|c=* 8^{ڗB!BO: sIIu>+WYp!^{5]O֭B!B!!U&,ԩӦM̙3Cu?N\\={B )B!"Ĵiӆ^zH@@zJtOʔ)æMV&\r1}tTL(/~GK~/>Qt K'3'7!dm R y) k L>{N:bh^T_nYn26%D(:KoG:͜GM+1uo!Y/mWy#6}YN2w<,F2jː2+G| ҈@2qMzr}Q3D/*=`ޠԮTRBzU(S"5ߙQ}oslP:֭LيU֜C_Li_u>◳ft[u*Q9=`w&횏g t[b szU-WQnͽ_'e؂ u(GV,%)tN10ݪb@!{|X%JWnB{+X8c $rvo5uXQ&~"i ғ+Xz97?xLL& (m&3|EBxLIMP"45wҭgOBt@!R1f~ڏufvo!h/oO_ʆ zN;Fwy+l]=Xȧ&pxmȒ9z[b~V+dj{45@Ek,x5,9/_< Oׯeќ1$-DǾ_0,ѱƜk&SF?Y׉9'^lٰ1l+< |η^6Y ܴ>f; 9WW<spJzSyt|̡?FjBxeJ\O'*!/2B(Xu ZWM ̫Ҡ* MFx# W [TVc}6QQ 5aL2PsצUP|dP*߸u=CC~JQns`ʇ 9ΈɝW@RUMRa|煗^* ¿wY)Դmf EUQPP  XG69:AS.Tz5ԾOA u,QǬMMVg㣦\R({(({eCȐ!Fe(!"WADt1Kw͍B+xD/B}OX| ~Ưژ3爁%#j7`1ڴ+MW x6  [;a(h:pum{(>Y<ٸp y"aEN%_px*BͿmBEO%!WQI H, @ @MqD԰;UhX00|y3м< :Oa?\Ջ%L%*y 6|p֗b7SEU CĹ+1lW"Tb@~L7~(L)̡'1W9*wTsajc ژ>;aM';5|Sp<]7on.%'/: ,/Yi|N!NB ',bx>g\%>*8b/Q4˼˶b?jj(>/ WE50^Hy|֋;HgfSd̒Wוw})2Yj(!9.OIQ5+׮6 /3U8(KRkm,!*sW]1{}YAb'Uk0oS (㼹=1?ǀSw&K SiL]c?RH j y蓅jTRcⴝ)Z%3$"{Y!ަ(ydz"yv2}!?$X1l8rߐ&,>Yv?oB!`'^Z%#0b*ϡI1Y>_D3V/JxA  z/}S/|[u;4Xyݚmu ^4ՂܻPg-*cѴv~5>Q mg?_a}8]z@3XLG%|o^PM㦲= cw (E gb|=QuRE|r6k86= [c`A^1p#11b[ xw ?@;JT D*;y̏߁Ț5Ӣ/iSP)9Mz?}V<99>^+fj杓 -ڹXFN3~D^I;6W[nlKNNŋ >>͆a(%JuAﻶ*$$$ ٳjՊGҤI.]J jullt%e-6$Y#o0:ʣ@ bEESA(ם/)6m:u6T4WuNqyb0 P5#cb %N bб λ ݆nS1/u<;61Æ"m0ٌ;i3t 3,ONNfРAd3pm6jԨڵk].TUC4UQ*Y>ڼE|uq'~*:FՇ ׋"5ܖ.뽀Q~{,ܟ7ӝpژ~>6#b@1Jk>.V}ꨇ"43!Edo;zBd_o"}Q^f?3Zb˖-L4 … =z4۷ȑ#> aӵk4%BãaOy',Bdgap1J.ȋ,X x.fB!bAY,"G[0B!B$!nMF߾}5K޼yɛ7gO}eڴiΝsB!B?&`*22yQbEt]G4,Xs ЪU+;F};*mڴc׮]in[!B!"C<ȕ+3f/GUU, s̡_~>{B/_͛7SD J(-[=WO>̙3ł/_[2s4{CB!B!}aܹE! w^4hJ*3!B!Γ[0DuV̙N&Mի%͋}gN:|嗔-[Ppa/^۷mgϞd m6ʔ) \]!B!]" a dܸq(;X,x zudtݾB!B;O?/i{wfo_!B!ĝV}0}ыg6nr>4?@N3wYYWϢKPmE ^{ kSZmt}\2Rϕ穏F>ƄBIBw ]8~Ȣk˼eUCWˎF:×7xC^ن ߸-^+7b)IQRhT-zERbX=GꍨS"JTK )֟Y.FVdu߾BMB' l?Su jD9'uQw5ap~T^\m&vo5dٺH*Wm\7[e<^m>ݴͻοjc:Jj^1ڙk9vs^]Șg ~0^nM1B05Gv&Sd@Qp]&KK:ԪIǖlZBpB!+tzgx>]U?Qq)[`(+ ˣ<PY̤`#U^_dQ݀qpyo{Yx5*/(דu3Է,6'\fٻQ:~++wri)/)E>"ǓB\Q]؞H9 Z@\We| eP/FB\"󋮑+ۛs<u<^熲:q>}]ófwa JPqX35/i3[L!0jhe~Mv_֙BKG9#V\_'gOY*>U#+ܣ$I@!K'vS(w/aɉOOJQڙ/ټ 'SIm7/e멫VXco3f:-TaΧxu"}uɗmfu޴\.7M|ƀWq順R=D()\A(d\[Pg tdʜo`M=9k6vptyʩGY>Ɲc(]EH"kӉX{:8Mf̨z; EѱT^]gDǼP!D޿KYn~m0T@3_5[LILd~\n,#'?SlmaRņ>kY|K Mz§[8u^S?qܶ$n\RTGy֧:>Oo{B!r"CIY f@V}#WiӒf1-iX:U{//ڧMzB!BKz@TӬIΙIJ\pV@XьaH5 e#GŽdK$2ɗQc&6Vuɲ6cP?ʷx($ˇ?wKck5ӖwYxHf0dg &ҩ?/P#ѴtW)NL79[[0c?Bx" q[ k)y׾O3>~jrۧI !B!m%Y9Vow˞=ii&8HsU/X{"hs!d=†Rg/G]:W;jZZ ~F'O ߼ITL^{sU^҄YNd@M@WTTUϋWQi%5oQmT@}B!BqHL (@.Ùi \y6a˞{sUMnj͙(]KZJ  XcG-6$9Ւ)eq=]+ۓ`wdmb($o٫(Stul'3xڌYڐ%ٴO(0B!BI"SE hnc;m`!ݐk&GM8WT4&BA-yxg\T3y~rKF0R}^X1o[\uJJ2i1_HT^Ǿ[RZćs"B!V-9Uqy^ ٖ¥3{Yq򗿏U!,<Iu{"B9`ݜ~s6 %qCY o`5ÞTml_!(qo=u3?j(Gb!\O@BR8* Ezv[zNXq~b^-G3VXaާؔ4I!B!!= r(Ö˦_%/MfC5!J44_Jh EϩHymj9!W6 E^#xx[z#  i~?S7=Mhʩ:ZX)j?13EL0u 3ǔ]JHh<[7Ӎ_bcM[fx;q$7WҊwf{\4Wsds'!B!Uz/|V<99?U@3_5[LILd~\n,#'?Slm]1eaCU'ʹ\QT{Uu\)( `jyCM c~؞keU/wێbG0tc?TtImiņ>kY|KNB޽UdyKNO9p`uL6 cڹ\7VC9myQqd\27~|9jE'Օ|XvgsZjn+U+L+#QUռ(׶IM͙D_nqZ/zN@OEӷs|^9\^d1610m# nm[Q1ߺi\KvbG(~WT 8+D"1c@ŀެ9b`f!Y\v1]'1dJ0~$0T 6lK\ACSRH8gpo"P @&,eᅇ,<C!$ ⮳r譎ԪUj5kQf nٕ0>ћb^y _Q-膶zmQ+l$]FY=jtԒM1дA+Le^I)O  W!DvގK56ysr&AT@3_5[LILd~\n,#'?SlmZlHF+큃iY,B!=TR%ߛ6o#x̛_;ycފD4o8t<_iLNyeN-s#= B!B$!B!BL' !B!Bd:I@!B!"IB!B!NB!B!tB!B!DxXn'11sDN>7|ӫ烦iԫW (2}qibxX|9m۶vB!B}Bd5kp2Mرc;v`ʕ|iNջ`tUnnپ$gf#m*q4#\&Yژ.b$B,(;!n_>k׾m=RRRv Y3 Oau4a#Lڒ~RK nOgL1YrU++1p'9N~&%|:W R&QyjMj7nOK1ٹ:TցYG$B퇪rݾ;4Bdr 4E,Xz'cŊi斶/`6lfm\>̻Cq(5YܪBM@QKd[i'DQ%0CSk\>̼^P$<~?+~:o%A=*%r[ϟ=H 6(]Jp[DB@Bq ]6$''ӭ[76n(=!ˇVO0t_3P7)m/ ~cˣѼٿüթ%]OMoԭMykǩ/yP:6^6<>>ۆ>f\\-m .6 "9'V-McY{2`;^'l<ڲu뷠۫kr^ޚDw/cv{1wH GFw:vyHj7ƨp=6 jcmژ5c1eW [Bc`7n1M1 b ~t?}{/tudcƵŗ⫮aoǨ[ +'Ff->Y{!TB!(I@,Xb,[ o).~#i@]g4;vgj?y{fFkkg6:źmY34߽9WR/PǗسU?vWpHGvX1>n1c' )g ]+vbc1gR!b|$}}!ڤ+EQ`(݂jgpd&v:MG_e .PʶIrw) xzH+*%4j*ׯBbD/s '"צpb R#4)%0 )9. |Xra([XB[(p:N_|+CRۘ6Vcj%1g(\W cXBAW hBkz*gt ܈&0X$χΥDR"R =;5!A7|i莿R/ X-m܃室Bm˗y駉fѢE8qV+Vgɓ>3BU՛&!{1IBdeE>;oUB(NB\*Ba˰Q0ͯT^cXjq{K_`BLD8_">!}VBmjҔ JسEq|tW(ȯٻN+chaRs?c Ԣa.XGox1`l]cdEf@[|p 1p Wa Gb+T?4+N8·Jh0q;wR-㥣i^ۉS)д#u~[˖V\7eѲxi!9$ ryZlɢElY!'OdժU^ D@W裏lٲt'Êetv0Pț/ #!xIRg,2e(֒W&ܼ1w^3!׿ѻ2e(֒W'ܗ]#WTJ82A.JvEѩa,7b־KBX:{f޽^XLܹ=ThQ"8@=x޽;3g$%%s5]F߾}6mZSeJ EpOq|{^R@dc*%g˿HUJ֡(*u2@Vi_)iۦ|Et$\S%5&qRVG'(ThNulSnmXW;eSm5m٪?ؕ`\!?W $l\rK1˟rWPIu3Pg`P־<77tʕX.!Zc;y2B!rI@ [l[lOʕK&u浮al6t}uqt=B=So1jѯ\/э)DE7RVyF%L{v2zFvI%,r8oP/Fnhڿzʣ*!BD1Lm=Ra[_zrˀGЗ㣏X4v^&31{YL1ꄍǷw tw+(F7L7u>ƠY4,Fdž5T6]fg&(th[*ZvFnB!r ^ZerkL>^+fj杓 -ڹXFN3~D^I;6"HfիWȑ#n6͛PB,_gs[SNXUy0 FYn9/ߵؐgݸat@j󆢢 :sntNlfd,Y;jx:m.3ׇ纊xA@ҮKY=}0IQqjGQzmqo\ 5{:hcPAg۔-ژjGeߟG% :&e7wz=!9$ D>͛7Gr~zpBbbb>}:G"+K0?\LQPxF-W`$g2\!4y=YE-Ѓgm,H:zĀB$!2$sYtۨJnڵMk֬{Ȯ<>kM@QTTV-6SPTE.nD+O7>1icقV--B!$ D(W _4MRd'tnfe/B!?B!B$!B!BL' !B!Bd:I@!B!"IB!B!NB!B!tB!B!DB!B!2$ B!B$!~vbڌ`C s9R!"x!]eg^}-(/E+ԣSS0cqw]GU܏ohE;~ʅK1Y3W2`(k~m )H$1pG8`z.+ô%CWϢ'4Z PQ*{1l`[9gÊb !_J4zt0CVFNBS ;Pyg~m]+ ,1Mq6UCW6fEC'I~e+13KK 1%:ij0y!tO,x}#UQ =wkf{wnvo :? 0tjhvǁ]x@~o칌.%9$ ~IQ54BPx)?0կoyVԩQ,֔|1Y5nh=sf/aN-G!lcGhEf2lA뎍iDh׀jkR7?Cx{KT IDATGFӰ [YU?6 S]Wk(|{1˴1V+91ۍczu^yKIOSXp?-Ț٦#(B[b :6(E{{$"[0~LZI._jt,mA{5c}Lpl\P3\UcLW΢^8\:}9kp?e4H0-d|y,"[Hføs:OxP.G+c„a+ǔ xjD~Yrʩu}x `ƶ}XOP'Lw,wsƳz1TϋwF4c݉Z7L碜Wvzҏ/b|T g+89_/aD+$z !EŶmۼwJN)+KOi/f(ĸE)_lO[ޡS8=sgso+Xܫzkq]3Qf%VM@'\,ɿ,O2疸~*]I sbK׹b#1>ٹ%̡) hGP]c'JzPPPUUp1l}=4PPTUB!I@LԶm[ƏVG۷/ Pbŋ?~ʔ),))۷l2t.ve~?eW!ox^;G y~rKF0ݲAY:>冽n5cJP(*DxFx ] T=Ba-}u7mlvHǏc%:DA9}<s~RErQE}̘&X0=A|kЖZ>db;Ar ̕+$SnNy1os+iSpOKUm9c`ỻy(dL}o/z^ ϫ͸KPm9MyhT}B= Bd@;CQfΜI @ul6[&]]e)SPxqI@d#jLچk˞En\wv 2 u y_5ʙû}4IY}X{=:f yejm@gu@!(z"-#:PV={PcV}ԊjE)=TN-5OmcT^m9c v(3+&7=|^{לwø7sM E{JlܽssBܚu^ZerkL>^+fj杓 -ڹXFN3~D^I;6ݤիWӭ[7l6]%-5a_ӱcG.^8S 6_~ņ>k=8p ݆Vuu*Ė뻱~k`nL=P G8>z 0T?9эlݍχҊGRy͉|eݦc黎|_!vSZ5fڼ%'8:&1o~\ϥcmyQ7d\27re&2(4hЀm۶ѷo_~GUnPNJ~$E)Nck=ɾt{wٍOAsx*(*>AQP_ r9ٮןg1@>:J~|_!3EZjݻ˗G~Ο?Hi߾==E\E!B!]$ qгgOzs j}t58B!BHRF}73@Г&B!Ohm !B!3$!2$OX;wף9o0;w.|jTZխL!B!1 D(P6nvkٸq#˗mc<ίѣG-Z`2B!Bd6vXnJJJLu=ѣGMkc@رc}B!B NdXj7nW0L<ԨQCz?!B!D" a0bƌ㕄lcƌ_my!B!3գ6Ea̘1\ez.ʖ-˧~رc% B!Y!3UUi׮111||W9s= C4+FÆ !((HnB!B,J(BPPm۶M6>l&!B!Y$ m!Iq;%iq_߮{j2zQȺm}ARwMb`,._UQ8q>^!xgxU=y'jr#B |lcFnڀaœe)"璿B?s݋f.~O@h0x e7cc:c%ëj|mY $wzyf {s[ ;HĠUcFT T ^lAW" ՆfiUDŽ"Bag3i9LBzlD44MCECS54MEI>i4zQMhT}9Q-ng]v*MjEzbEz]׮\ "6좂O ^e{K2?,$ K b=:]?K}])?kY;#WTcCN>nO}Ӈ3U:cPzA#. 0e ]_?'*[އYUV8b@=^]&^='N{NsdZR-~:MZ^==oeI/[34r4ЛZ)HQWcrc]@XݷCH Nʭ?Iwgi/c5DF/Bg4@b!<1s-קEsF)j;2f|T^uuˌYGR-=9Cxir \;uE!}+ FfS5ܹ@~@Ji~Ღ]6Jyz+H\ZjݦmVǶ+0Ps3U 2c*O G}5(Bo`&*==~(9<!ϝm;S 3:l8vc4't)Cu٤[Ƿ&Fv}r^X$ôIT?o+t[#_ %hGjsv^Iڔ_qN?cs)#%W+B@zzuV'3O~Qh4L_]_3{A]NF@b$*5кXuqqC4Z%S_'5n7']##i1fYG1V9S˯3xԒ Lb[؆q(ӁTw;W[nݻL Pʺ"5F wnM#qyr;zz9]Տݠ\Ǿ_!N=.F/TwKH0WesㆩW7<=wn\`8kWy~ԮjxiI^ZR(W8zUU xlC3sC#f3`0%E,;}z$筓MWijm*o{ NxfE+oB#;wRÓ%#ky<7 7G"=:".1%dzka4~:uh/>`z :nI.-¶_ Xv]/-_??x.[ـ>)a/<26LSR S"T >ՍޠwVz$h裕ejaeKӵd@M#89bڼλ)=<z,I.z]\x'/v}T_Gާ9ʵnh>hzyd)x UKtj>1,Mxc~y.9}z짓/Fs- o_>}kYy[$/ѧO^;M)GZּ֐m_c^~Uooo{'st{FL{?g:OkXwz;4cR={irEAq2 4 <[gꎉ>vfr~qnVgϖK>K/QS_v>=/[34r=3M9@=VzR{uQx8M9k{}]}àpy`ԠJ}t=EO| 0,z\ngҧ:OW=zz$?=s8ev a.nb UhY3o6\M|# <ױ'O;<ൻ"0B<;RN !ӝ};x{#=+&]okm'ɠM$NA0d oh޺7Le[ _SG*:WoZfQf]կPo['o|RJ,Cu4V̪EZ  @ E'Led U545*CB;SKqJo$*5кزdY+n{ViveJp:XXm)J٤?ʗDzjnp 8oIw_ԒsFQ2 ɬw~\ӮzOiS{yG) ":]uFzzC9cp_zrO̫ɬylOi}{kStj y5uEj2T0s̡;#^m8Q_ZO_N8Gλ@|bfÃ;+++4uvZG]:ltާ\7WQ߻S6X{gѬ;wswATV^0aoG\ m_PN^+O?8!󄽙Nmp. YBz=ƞXGc_x}!!T?͖0}>?ԐݞcPP_⋂K Ôa^:`*x0eb(G1:ϒ黄!XMd~+:B0$ՕCӟOr>7$[/9w4W!Pu]7c{]6h~ޜ'u:SϾ,Tak{ ?'*'SiL9 CQIt9$@s/|vZxYDuKTg3ѱ6LA Ps˽s֖6R,yXM٦Q''pCM26J*I_{DS߭ڨnDS襸NR=_5>zz<-߽QcO=\ notnS&U[ &ay}A7CǨլclJ>z5>A]ZZNR>]eє_g{<wWoEaf?5*@>@4[Mұ>1c8L0;7Z'2˄1uLӱkaNнyt݆TćֻoGz=u5mbq8*UUrF?WϜ5$uvqrƫYjՙ31o}_U(&k/(ViWhLJMTffJwH2$9h}()g|S :F7(vXu?bLcTl݋#WyG|*@!81bUN̮ e$kgG*]^yIr9ʷ_;PYl^~R&<뚉c5Irv)#4$#Miuw!y|xFRRhoz}꾷w܋٫Ҥ`[F_f*rc*5/18!o>@>G> V)sj# >Vrr|K Iu_AwХ7QwԏeQSy%PT 1q;u]yۛZSdrsd;1ȷxXھ=uS,0+ IDATnͺ}n*>!$1 Yu i!Ө>wǘu :XmWE7} L?}'^;5@-TԒ\,-x1c(w{Sh9";]9[5I%h˒Tg~|7-ۨ˷2HZ֓\W{5my\rxZWT19$y|Yϡ{21ƪ1fcc*F߼%on_8}`}~W8&P|djG} Ѣ-Ŋk1D7>t:}t=E% gҀ_}' Nu #:QG'ԉ->ֻ6;ɊQBnjyzr#zz,T̾G5xɿ4GC1IaycN#Unc,5V>T@ue|U}C>y95`^Ue!?%WV9ETaJ XvNI['=H4R}14mo? NxfNXxUZGGLP^1_|}w1$ɒm`ͶdTN*jbx_cYzrRS9K%{a+z DGn%X7;;}m<~75Mڻ ME?=cj>c wp>s@XsN#wO}}[pK->{ݾe$+`lS$۟[U<u~- I(]Mb{w6 ) aTO =i Uc{wyb>!ml"jg{]RhfK<"y<69<G0̑6Hkom>]>8Rp 8q  @@#G"D8qjk>.xuq8p㍟kKd4=pR޺̱W G&P+fܣ jY4*$@3 UP1Ww<[Op#K3Ļ?Տ/_a߫6졽U>j{kP+;dWHc}>ςm?hPV?7X]D:@^@uoQMԳ`rуr+MqJj.kVopi/R5nJ.^86^;>&٧j(crz,!FZz E?Ij][xUS49>xCUs:w9j7'+]Eg3ؓ> }=WD]:Ybmcb2(R<[8;qG P 1z -se$hgs{:e2b]wW]jfeO1.u%UooDccϒGŗ!@>ϛ>->$U}%z\ZpuyڒQԤj8@`dgg?… gթS' 6L׷WPS4 x6o)PNN2N' kĨ~fvUU{ffjcԂ?jud=uvC9ƳQo]sVJa{k1&A<s؋}<`w$MM|K/zN];*a{ yS=o/_GwCnjyRώj}qeC߃%IFg:icut2c P-%%%OXdY?j0+oW_o] PE%+33s%dEkۖmзBnUjzL2%YViINZJ/K?P9 WEK:5^xEN#hgoΖL+nFھcFvxWwNA5POԑ~EL}qj6RMpv.]siΑ)*"%h)5oIeo*Ng +3X=0 za39Byo߮Taa<<,˪+..?k˖-f |'Xvܟwȗ[.X^N>85juh˒T?l-jXQw_BZޚf~2wf>O;m} kVe8ڼqW٪*yB85Oq"ެ:5{M~po/UM?OSתiYJ 趺ځZc$q+# [%%%:3pBY֡’%Ktgj֬YJLWÃ҃+*N].F 0& csHVznr "ݢ3xBc|0homό"t!17'W=4 `75ﵩ,J1)j5VݞpS劮rIq;t[NTKt[|Gӵg[ŦR>N_/\]Ǎғ~V$~*>\?Fa5))*`{>;%9oԿojL#UoK4)^~zvU04qD=*?ޡce'C_[2C-#ِaؽaTz#ǐt#As#wO Ôy_{}sN;ڋ}}[pK->{ݾe$+`l?x.[Rvv~!**JzRjjj 77W?+,3<믿^Q[##0LV$2*+%Ôms5HkomPc<\j$,**JgVΝkedeeeD|Ǝ[?;_Ha}ݻt")Qk;wV>}B  y@EJII퓢"͚5K׆ $I5Rn4dȐ2YdM#^1bM]y/ ._c꧟~ 0k,s)!!!< P\\p/ z + ڃ9 -ZDo/T^dϟnZ]t >ҥڴie˖ϟ?_Æ a{|@쳗^zI%%%xK]t:ueU5→Z^ƍW>j>ԩ ,K\rzYt ~ӂ ԭ[ ,Њ+BŠm^yEg?@`]K.ˁ'VrrvYYfYJ͛7OqqquWv'%%Oiz``!4efbboٲeӧOf.X@}ђ%KBƍĠݽ?`"j„ :uV^]YfY.],iF-ZaŊr!C&M4qĠ2iӦi***,,Kn[˖-Ӳe^*..NӦMSrr p D\ǎ+!!^GqqqzԥK.C"0 q5k6mjR&MW_3 Gphaҥ~y睪S}JIII۴duޝ0 %%%;ĉW_駟~%I7Vu'ph#@Mr}aÆ3Ψܞa!g @0UԩH?,Yrb/ Ðir8r82M͛9õ y@ oQŕeR޽z)77WSIIIPyLL^+?3 P몫c=&SY^ZZo&`>AJկ_^ 8u]ws!,˪;V\\>!ġC`$أL͚5K'NTll֊_oF5:d80%11Q&Mҵ^?P .T^^}Z!99Y:uҰaԠA9*f6l+^nq 8q  @@#G"D8q  @@#Ga4N@@#G"D8q  @@#@p-OJ5[k^P]}\e'Gutři^_v++G*SZ&9(Ncx2%þG)]Y>g?[meQJk}.Z =:B8U+GZ9_VZGn]=]{?1y dwݣ]Se{Ozzgf6TomtP zT R%NФu[_oY5i^{'[uo?srwD|ޚQٟi)z7eIz+_˗.޼EɓCp-g_Tߋ.TX9Sve:M+eIR}:EL1zu|DD1+gTKM6F%گ4jT\!:GsEލj.@dsmgʌpW2) f+0Qrx=H[ 9n{r&27'p ǟ?O];˥5_UsEP_ҋl M5hpoVÐip^׿d:*_h~ޜ'Svp4X~KlRW]Z9i!mP@`C"PiVQotj ST/ÌP{18q  @@#G"D8qN{줏sE@34{}%`wD8q  @@#G"i/toKe׫I*.жU/sdy!x)sJ+6 p@J66H:R3$nY-TbK mk2]2G,RFQ,m*¾#.AI-;(~ o&P˾S$ֲT/k*ƮrAGj+۾AA'#7>Fdʕ.a REQ6}BpyZnAJnM3^VrAm@r6)]*GhiSɭ:{^1i Uo9J: ӬdJiO+*0$)[uf8E7T0d%전)o:ga.KPJ9LGTCG| #xڀڢBoiY\0d:xJJ׆JJSQe:>Hf=gR]{@ڢʰ]Pe]n۠U[[ګBf4{J[ڧPtRj-*~ȹ|ɖ PO}c\;TUSk7IWUyێ-YpD<̮Zrث$IGSQŒ$wiּ Zl bUbY@C ۈj[l GdyJUCtD55Q;߃UQ3RފUW.$xb&T+I-;;Β<2;a㮰WI'Qf2L ө̬ऋ$38^%Yv,F-Ij!Ĕ/L؍tڲxß!@? sya:xUJ2'D*g7 ӡ]C@ ^JJURϫ|#Jmw4hI2ET IDATj2Zi]m95N3^%Uu>l7,[ٳ IuP@`e<-ddAٶ ڹl*rG*$f&(UeA CI-:٨21ZK vڣعM;UYƠ2 u?-䖡CHIv}hݻ"?GI) ӡïVB6 C ZɈeUC{R[& "eGŤ7 z໋ UumhI2 5<}[u==HFCvb-kskόC|jг:bPY:oxJiS2B-kӗӗTiZ2 iS OXFۥvR\!fBFH9Az UJ@ɖ5Z3>2Gњ!$_i=ڋ852{j3>Ic/xT;!tث$I;̖*^aY˕K8$0T%6ok5Rd{1 ~%z^| ;e4 *@ #>s*{4{qU˔=#$%\6LR$m}Y^gO+̤G}m=ocⲊGٹNުӮw&I]2[i/*)Ta Pv ҭd=[61qӦoi(I+7n[4l^y+kU!rQ۠ P}퇏epp%(6iP$ƙ/%IdG .{b5#.!в=cFA@-CVY/ 9ɯ5RMG3nP$Y [iRT٫LJQ*9# \5{mb)CR3ܛO $Uo=۫BE~D{q j6FET (8,mIH@9+_S}#eIRlz#59kؠu$HO)oŏ!V׆w ;pFɈĻl:T/ko-I9AeCRǂPRF!7i&ïasj+jлc.3UT.yÆ#QB+kRՒտ`8t8%`ܺ_%Wq~eYr:bp Y;,e2WQ7TfnPbUA g/X W/ @*r66{!,P|c[LLz03)Eλ%d·5<:d[C>3#@ re?l\5CMuԘ;[2Dl:WYYNP;@* w &f6 {IDr9(QѺ<|eA cJTUa/^ʲTReJm׆.)ҦO_V}2/la>"3>T[tZiAe˾SRaU c7*W٣ɊoBu;Trn',\6Gm.贆AAjIo,C4HJ$CRu* X,WIoA89Y=g\U$ˣ xr~[uT\T K sw_0d2˘ .p@d>$߲T4[kv)'SJ#IJ<͙_yw{\v.^w~ [ڋ5[?F8tLg}z-<KU@m lOԪ2<pp@`48"foTy{nCuPZMo(Ud8nߤ?}?VtJtdp  Wj~ῴWUb/0or[vPq]V@ Cx?U,P-V{5gR(* PC עST^%Rٶ*$TTR(O SuU뉪u\%E*Z\[U\y\IkFkRqJfuB}cl=ٗ<6kaH2OR}~OCSyOk=q  @@#G"D8q  @@#G"D8q  @@#GL)vR]<9ULА$C}0R%ijX5Qg:uYT]/ǧcWjޟcu)jȴ%)MizS1{LL.Q=4ne.J3`G^Bٖ&<ӐLauz}[n_I1j "8XҺB)S1冩ڒ'*ouiG.-$Yk1=e'u{zu^OI4ȉhu[5%w8`PCXrbڿs lI/tI2)a]T+l嫢hqQ}%39;;r)bCL;_oZ*W=74\[ժ:XR +b81\Y+ZTxfVH\W[iq$Uq (ϣH܂Gٸ\_Бez5']5>NʑضڱρtzqaA=IZjfk]UaY **6ouUqXVP4[vHZT-ےRH ^Ϫtoq$ˮx0UY=5sXr|6}鞥 ) =04ɟI|'Z [x\\.Y:7+95&9ib1--Գ0n .'(-rbzg!=/ͪfNqDotFϰV{hsV'}*$jr-]G/x[ .ۦhghkռI4dԶ}+]{hP-zd^LWv=3SiN!)%[\;ύ륯JJw4鳋l׉i˜Zӳ3ZާL KvB%yqm.vmK{kbK ſ僒m\zn7g@ )fh 43S+1ld͸OZuQRrKmw|xe;vv+cm7͜j`7+u5F`Cr @Q)Gr @Q)G\ noF2@O@ Bb, - (@RH9B&giZb$3ek#[&S^^ѣG8f+Ԙ1cn h24iҤ:kz'd-2fuh/~z$q=3si/ao~B3 hB PiӦK.Y X %IҔ)SPzG4|pfҰǙ>}Fu5jAϟ_㘉b;H#GԴiP@Rk֬ѥ^А(.^L$Sk׮MYQwf(a_^'NQg@ Yf!hȐ! ~ԩSk2>SU;̙3}=>|xBk͚5b> (@ Dv1tPM<ŀnݺiŊՊ&LЄ |С^x3U>[SLvCn'ԮaH`9WMxvf_@@Mb;|޽{릛njYDvvyf*޽{WNNb(@~O?IfJ?A}nD,K7nƍg1)Gr @J4 q3V$1U,R^t嗫m۶fZaM0Aϗf:<0`-4cjرf˲4m4}GȨD"~O=}] 8"0܂F1ab1[8fϞ?Faƌ5kǩ_m8*++?^GbfV꥗^Q, ;jg4C! :T￿P(;/HÇ˶mM: pF --Mo|zk(@ e~i~,Kb []|*-R&(PQ;v'@Q)G̨Qͻᆱ+===ҷo_[ zH%ZyN] Dq3Tk3͛,X3lvm]*##C'N3<+]Z,۶կ_?=S4i233.&3 P/gqN;ul,˒m\͌Ų]FueSr @Q)Gr @Q)Gr @Q)Gr @Q)Gr @Q*zjg4ɖ-v .n!eOվ}Z]/Ky~? c3q1:s0td-JXpĝF*>;bh1.-N}>T*[O{y{? Bߢ=YyBT8`Iұ,Y- [^GKWuߝG(oM~`:=s϶dI ǥ2qc{pWe-wG1Tod(@F,;P8\Qtj+uhk 8w_}b]< JDy^|"u9/T7g /SO٫TaޢlKRGzp\9Y u#+Ә[lے,K@-gCO\2;3<ۧc^?;L=l+)QߏֿU7'hR~g_]ԋk̟wJn,XW\EJz~w yWB$-K gSyA|&p3Z/ȯf+n-/ߠ^I7%={y:ѳ+GڻhbrќGmj7WqJST{=3}0mN2C{Vs(꺒, ;Kgm`Xm9RrrsW_Cڦ)Cz}-QջoRNS0u WNc8v`_8+3P:^*Gmv-ٶ-K@ꊋ$oUSVHpKkUxc7>V?~Zok9iCj՞,(ϊVׯѺ4tO\ΐIlnV!5JuZ~}>np"fRG(_$lԆ6ڻ}Cۭ۫mrr ]@ճ.]PUk#yl9arwx'rSP$WĜ*u+v^Zgߡ}[vE"@۴שLuӫ %\emֺ\7$˒m*.UW${xځwVWijT.m{$݉ʉ_9B?-B=6%gM}a6V sEiFI%.)j^*jq_ۭywno9O}c ݄e=V*Yg͑u 2O/>~,v|_S=UXBvBU5axd(@q{Z5.7.G?=+|@ЀK֔}WX-=PH ~r @Q)Gr @Q)Gr @Q)Gr @Q)Gr @QЬ,2C@ߥG@mK%fh2[C4vk鲥ڻ[7eeei Kt2Ph(@hV;jUjl9R*վC ۷7Shd 4 Ց3[ (@RH9  (@R.hIrG, D4I(R6ѽl]͛U\Rx겗$&Q2z%g쯡 n]C{lS *mAUݺR-wo=!IVm^tzyJYPgƑ}ݠnHUnf:Pq|~/4-I*֫Wӄ35e&ͽT=㗺zj󺢓$uEźz :4$EGz{V?HG7oхAA]7SO^jb4uȾʳ#qk5I/}foMcժUzUXXQ:W4iD= ۷Gml2 T6]KH Hn^ ~q)-OzV6i|b-XN")ν>mi[M S\If-f)MWUyWD7E~P֘,빛({ YU\&xwʊiقEZL6]zk. JZoZX7v=gBS%(:7њTq^}zmzL}"m>ZluYMND[>ﳺ(#R  켮z߯֨{݊m(<,h?j㶘{wy쐥K[Z햋?Bn<ƛnN)#wLm]v̓vC:NmN$g޼=, ͐6 t[tũoONiV]|&t oĵt$9?h7}vֽ[~{wzJ7!;Sş?K_ӆ=2+W*>aE"[tg4!kuQ\ʖ䖯Y?(>]r<4K̶ګO7e>_[$9ڴdhPLT&٠:~ ;[rݿ@;HCgTwje룅a0rlIn~3Gj|WgiaOۊiTt*` )+F?%kկ)aCzM9nϯ-[wڴ7Sm~zZJ:vh{+'RU fَPXyê\Rv<.WJV-74JL*iKiZT(}PXfEWrF׫[^H|}- :r m[j֦MFuqVz!o<4VTV|ԡj? 8&;^wyMw$IGe5ʼnA(@eҔ|`k}~ɋ/ ?SZ۲%ǭ(Zڸɉ-ˮx[6ةxgvNk.rI)-Q2$I|e _jA\#ɭqÎdsT)_Kg-TN8,;o/ :soϝ5kQtdedxD\)"F P <| n ),P!Ԯ츢xd5TaԮ6t6h9jɳc5~-Nk*v%t1@:+W(*Iz{\Y=L~i/},au;Z'&>Vls$9*]5_M(裏jC'Z++VpAG.Q̕U^RmqɍD f)UP\E6VQymJ~I~ܶʵwkj $R|f{uڠKi[o%^E%exO"ו_|"VPTZ\RyOM8~]ccGhjԠ$9Dfꩉ%Z8㹊Xp_7N Ǚct#(`qd>~.:폿֜qW.7O=fo{;_(WZ~o@zכ챷)ú)j+c_~Ѿes|޼w}O[TdٺP}vQ%)P}Ǵh7d~D1J^Ѷ3?Q PZЦH_ Y]%}xlewUߞ[x7\q_Zٝխ`}} 쮽hh"q)ν++7wg@X2`z!MF MAk>^}]D_ΘLo~󊖥giFU5m/vLk}m2dnW\RsfSX5- Bn g͕۵׋ 0ZRT|hLcn %(@;%3ם׺m@ :[c~wj`a3&Dx"-^Xz2өKυ\ӈvفvWsm!{CO;]LհhzE񡙅!C7l6tJ]$-Yi4P ҃zݺF0A8`s^XI^l̓"55G΍uhW@4'Gk̹kcѵh`׷;sІkw-\TTUK*@h};Oo% vtsS[TT>~9Vh\odœ`庮^>MK/$u]O>E#eg:kN,no?)`촖pDcm0k؅bQ-; q֯_K/LL ;_S_zY/O ϻ@u]zeZ~[hY'Q3S!6G81y9?<~zffv SkvDm,H3`FkS8f:gt^p;~F|N>gt7M/>&^<\c^Xr_ 㺮2F}3k.R :TmԶm[ :DaWoI[ϩLOzs*\4Փ,.՞kQ|*%EEw 7˲k%?W۔?٦oB|]"'-z=fvh!^6Mш4_T۶^|⎫WMW"t_V7וQwt>[W;:S1?`cq%E#g5 B fj5u}:2ߩuى~r7DoYNW@e-wF=u+u;fz}A;MJ= l8*;`^yWH*1u1oˋJ?hjҧoh܅'iu3صtqэm%k#t/ *ޑj[t/NGS_[W[f?c=^'%6GG^ӞԵ1GFI})UD欉$ŽtG.裳*T ~mf(^j~:C.$)I驒Whj'F肣;+lfЩ:[+'a 8}nL:PGlhG͗1󵩭_mfQwiJv3OL>m jݶ@_sn:ur˟ۺ.z$Vٛ7Qb-QV75:6D7޺nDW՚C5o| 6*!2zƎoisR:km~N=n$)XWfG+G & Q-ڸb=ogk.mNEh6r9?٦Sq.jO%Ǒ:ڴHu Tf]#WZY34vIDATv@Odќm\Ku F ̙(6ZcN>U@@cLW[O?kon@Bz)|꽿6}?m~zeyXKRvAGouͷZ'IO?!C{tرuرz5|Z YZ)]9ktN w%۴aC\*&bEZ_N֞WI^ /_y—V$Tyy֮3)Rc)Mk<]> 5WjrԜ71,noVkoBC>hm+Hvb@u^DзCӥc?ETRfgꛪ'"<#W]s9D?\y5DfN{KcFhHvj׮bMze>y- 4᝛{BP+9Ekb24蟨[:Va'jU\iZQZ׾)aC뚳&cKCL*pUBR~ހsOvrPGvK~XY sG4eoŠZ:~737au=ռ }uM+? Y1ݪ7ޤK.L:G[ek޼z4[k)>Hj^o9'g.7m~so֔)c#u u@XRLReJfMn:{m>.=&mWg\szuuЄ +Sv?MJ5?qE*S =Q:)Pl{j&j1O,_]u%޶mi^7ɖomn$|1o;h,?8z:2qRjF=Ӌ4t3 pcYza4O/G2|6lu]M}2}[$ihɧqbƌ2dHs'xW]Db(GRTR've"&h{\ vD}cդ Es\,V[cXG ![,KSG0Sh*KgͶTX" -mC6I+&լTcbIcͦ %:fUCm d1Sm9kTUsmn}ms_BmsRsk8-Nc A1cfۓhP 헳x^'^ @W9x?_~flKc.@%ћ7cf>amܜֶns-%LS b~x`_ۮki}`O HȜ&ZyhmYy??SX4Mȕf΋ykh*N‹SnS jRw+m΂1=`~ѕyPS܀\NwmzL]Y,/Sܺ-';KK,Q= hɒ%4Sjo?o5|7ޢxwvIK#ufy뚧?y?7DVZ@=sC9LЩSgZJ_WB4p8luIVoQ6磵-6מD}S qUji{ܿ}şvٲ:0U?<IjX(@@YY1S5ʲ,d3)(++K98g sQsۓ̙kSxIu J|3 A,KT,Ky5ShDe)77W?W݊5Mؑ}@hl/ـ/nOVƼ5eC@S>sXsk&J45AOt2mx@SI͹bfMb-B* u}hdkskK3+GeY[͸SNKeTN409?.U[{xCsS9rsgťDHC(wo{D̓4f`G_rDq̵"`$cm3޶sDsUKtsnkշ5)@VD}Ť yK6 @Sk|sm'Q;Ŝ'SWDy͵wNj۾W@\U~^.ۮj]ږ@e;Xֶcmے6߷b޶헬?{X,P*Ƙ$8'dnsž({Ub?s˲+)+r[唕E*cq̫"z|S[Ur^܋koK++ \U{mQ#:YIOlKeUp'Q49*N?q3WE2y9/\K_S<̵W;f,:@cϧo>ڿc޶97^xdE/??3UmbJKOi,@4 (mG'>f;ޕ W|^Em+u׈Wۻq%ȃ IJ"JvM)|{[c?Ok}̘z4lj%ϏV'|AK[ y-kmDtx ~).>O'z,:bϹƥ>~ij3VÀԿO1׵rF\<Uaz|<y1A1ks<ﱷ>ZMbD/G5*~YseuF|ߐ}t㓺ހ7!v>rjX1y=aTju x8cyY4W>c~)x)@t^R_ﭵW/W~N9,-1b~P|}Y%c\?<ލ9t.^u1rܣlC<$X5 FIGN{=<Z/6*VOYX|/Vo$bW_͇g~=S늸|Sb .V:>ס-Xw {*bpBk1}y=nrU(UAQ9O'u1x]~I=[}d;,p@sF~պ^l.ŞK}6Rޚ7ym~}=_M?N6,뢬xw1}yGsb yG=rR|PkL{̯|:k>Xx#_/P kL!tЁ5[:С?֘ϭ=t+Z{~z/7:DxNjCR}d̞uTgXXSw_ʛŴGkq?\(yeyOh_)K{=Vcs[~G2Ww(XC{2WlޭK]bR}sֹ.ϼ~y@_lgN2QG&ךsבZx#nι9ϚQ㯿XMܯ ޲3ʧs]jG@R8ZɽgkԺ^,zm(Rs ƑQ~g5£(?eKby0,j3dk:m⪦uϮ6nje^4&k.}k2:wul5ęϵxC5R}0;Tk+νKdsy9t7 F Rs[Ī>~qO u6~mZǷxb]es^QF\O=^>cx'&'kupf\_gjLfqqR_n]k_׸㰠FoqDLAo/T}kO^sdN|9r>rFVkw5^~)庺$xlg"Z~g@7ۊU}BA7 t?ǯάu.eOWǜ5ϱ-XZjkRźS<bKn/>6j{X\WsW#pfFjqyM!CQFoBxlo\pW559J6ׯY(.]#]ۊuݺ,?jywW/ιgs9vF5H]jFܿys.>Yj;o@T}jY}Zw#<ߖ(5yg9 f=,W5yug.{l+:G(4W7rUk}h\5F9s:mm5̙ZW}o1cus_瞽9{׹wfYf9.kzgbJ˺\o9Zh]5U_s2{>]Mwf5!W7[;?ҠF3>g.ϸ}c]b2ˍ8t.V79Jjq+Hӭݮn@hM7{d<.fsXwλYWvUK69b5Qh>rU.G(XkChTMR~T纚>UߟTU\gO1gFQ35]ףy<[[M{yfo3u9ǯ12gme/[ܛ\|j>sUnhTsOMaϚn3FFswU+G\ԎqKw2,˵b9uȞ=5ݣ{ϳu]35U?S;㺺w=LS{F |U͛x'9\z]uF>Á.&mݳSǻX8^5o4kG.Ūu.&]]λȞ=5ݳ{uF?dv@٪ۻ'ݺsU &{35>|sy{6{キ{&0XZFq>&:[k.zfo޺CڮntVkFs7;(.[[=nGq5ՌnTw޺cܻ)=r#Ug̹Qh2~th}չ=4Gdѵ F4Zo9RG5{Nf92k5uUs;޲~oijz>kNWV~>x5g}]9v;r٬}ZwzumI]wfk]f]ʣڣ;Z_XXʚ\Wq? ~]st<=ܣ2w$Ff[`fv-G3ހ3=2{U|m4Gjegsg@Tkq(^5F{vQn8̞KB|3fn^V~K~=ī4ɷ|[lȑZu4{jj{r[^՚[>-{{:V{G=QM[-e^Ysݲw}֏\ujh^w{[λ9e^>w>UjGw}'5W}֫sWLbs~g>w{}{뾗?}0p_74ڏÀG=.~[SY<Ƴg=rq~ş?eg_k xmCCwx?sСwO0l! 0܀p?GW8rEIENDB`kraft-1.2.2/manual/images/de/wages.png000066400000000000000000002217301467704360200175670ustar00rootroot00000000000000PNG  IHDR z_^8z pHYs+ IDATx^wxB `HGbE+WPvEE+V(Ql bAZA "E]J INNlIvSyyf{ΜݝI{DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDs&"""""Zl5@x ,Vx(,Pǀ*1]8֒cQv%愼*eUPSm qez\""""""UǍ!qPQCDDDDDDKE *qb&ձ~ޱn.znvo%""""""bW0ռQWh=hMU9Mbyb:$zњ'\xTCDDDDD$TO/ZDUNJʻ8ٗʮW\"[8DDDDDDVQIt$pDžӾъ>%""""""g$ۑV<eٷ,[e%>n"bN ' wnl\>n.D%"_nFÍbB> t?E&T_קƅDO˥H/~5}LQۀ>8*UN՘эQcjBtHǗYE&>V4ƫPmuLP8"""""cMItu|muL6eRQImSej_m]LIY#"""""jʚOׯ1ej_Pb=>b8er:.XLקԶ'"""""qJո1AS듩}C w|,Io$G2(=>X[9sږHۡD:(>DDDDDDUQYHQG N۪`BCd|$c#d5T,Ѝ8m˜8m8;ŅPg_"""""X*Oj_~Tpږ9qږ9эtD66"LJÝ;q@~-Ӿt&RڂSHPmA[n?~(&ܱᎋH,p.8]Q@ݖnn#myn NX1DDDDDDGp㲌qJq_^'ؾ*Xu[vqeJsJq@:ސbNkY9u.8ǁ}DDDDDDG`ɱS.D_:^tm]I8X$Yq_mZu1A7NֵQ}$>N:t1Ŷ֭m!qjIDž% l8s3(=Nc}~E,u-V<ј(Hj(O\,l%N[qjI8X$Y1{A'uqu>u:ӭm_#Q}$N :kVq]\]}՘1av| g[nֺBOPbZPcXSSGDDDDDTK>q}vZblŶWׂ_m'&d[M. S层:F]tsۺvYEk"""""h 䆛ϨJu(,0>cEn0&?]-{jHE[Eukmy WxPVeNq'ʶQy%qtr\lGv?+VNۺ>ӵU[`t.u8ۂZT@ɷh}"&ֺ‰P"ODDDDDTUE6 :my-)L1"d5| d_ݖWj1ZZX*T?QU*UC}b՘گ듯bn]_my-N:E$Zjy"Wp"mΡWns΅ A)$X>""""" X'ߺܖǩ1y[SߢӶܖׂwwR'XSҭK嶼Vն'+EO_cc2Pm"""""c ;8POUjW䵠;mC`5IvOMd_^D (yux!D[s*CB7.& `q"ja@WT0jz|m]qmx}1 *6WcDDD{GDtc }~쬃Ϝy P\| QҖ ".U-Su~YPn;bY%{?:&3+Ǝ-:ضQ?/QYY0 V+/% bюF"XLVtD.'.&Zmyp&kmf NDDDDDDŤMw̄Oϧ ځhGB7sLe'е&nSFZ;l`1""""""h0`oxZRJKQ2OUWsW!&m!TBŢ{2]_گ;b[σ< ,qB} """"""h񴈋?BjΪۆ2N_tQn> kzDDA3-ŵsJ:31D/x ӆFrC|B=m61\UÔh}~y)1?PU(- *]aB9MD\ CCN/v-%rQQr/mRH@դ_>u,TL 8%8mZĶ8 zN_A;pb,ħـ/taefșm>r^IN+K&Th_׍ŀS=j[8&j=hta$ֶ5 \$7Ûc s _AKDDDDDDDEyxUEBAw%1q],HD0j/r\unq'T.Dhy0L9{ 'Q%Oチ8G:fa}+0Q0MDDt j~RSmR i۪%T #_/~WrZ5D[HFEeսPm䶼&"\Eĵ-f#!Qla~Xf.svH^dplAѠVԿt `$. a^=Y "*#ǵݯ(jHMŔFg+Qp{?~}c q5m&OT嫥⇟~Qy{زu.rA~ $'U͛+l sgRHp]Ҥq& E睃ᎁG@JJ2:q:,, ux텉xw?IkZFDD1rJ8][5\f><97v7f<pSkR5-Qz@(UZڟя?я?OV ix%d;>}˒?""v1{V̙O1zu0 ͛5E &'w fat gz w;qN3q)qs9|{m۴BA~>^)>^)loǁ0yWy!|`1zt)ߘ 8C=we۸k04i: +W K~:8p(Oy^/~?=n$''cߛ0qK>zu1`Y~ )dddÅ ۅ?o|׫ҩmO={\p.ڶj;ww_⫳0prHHH]0s^Ztr!nN;=Gtr<:?~ 3|G[x qeKrXO߂dru[_Jgw?YYʬDDG85}H}-8hNpg'N+&?SGGpB}T/Թb 2 R[ݖ>uEWAq> E<@3ٕ̅Q/3f{"55ޙޒP&"aC ++ΚSgio]x7M8|`1X c8NXr<=v<I:6Nn|%;mx{u?Ƙ'vců+afUna~z:Z6o{eaq5Wczੱ}=Np nL?o@sԫ[. ۶, ^=YsWOc, 7vm[Ꮲ#G܏ޚs-wqe붢a8?ao!pm1W{ %%. /: m0PF*& `ۥqqq쒋pEG!+; U8NMػ<ߏ ?;?\|BܰMCbܤr%E熍%"!#Crm#''~_ ׋l7֯E˲ @j6,*Ih۪%;^/vދ~g0|ǟE/x*|p\,+bex?[|1d;lҫD^^>V!/5h0`Λ8onM,{n6 ez%z莾7QÎ̝~a6|6z` {G"̞zڵkϵנE`@jJ *T=xtr!y`6mي~ujaȇއoJ6etA3N~^(e6~[M~?cOoƌUkP_V-T+ԘܫOƈq(@]9"ϕ>hgKq} XRK>ZVZW|0GdB| ,_3,ÌO| >, u.;A-|ڟ1,<|v]XQܽĸICc_c_Co/, r4trFfl3Rr,ƋiHZ[3 ΏVxu./Jsfddb4l1j8b>{wm[w`smU p'<=wt>*''-/?7R1f Gc WKǣEڵ0g/Bhj3~ F|^ Gjxjxp\p3~JXDalLmZPT*FeJ""Զk"wU/b&RSZqH0Sp Z ]kiumalܿag8ۄ]z)0~jC_'?mDDTO3# r)㐔u7mOSOiWHFvc_pG{'Cz%E˷%V-4M40>"77͚6/ (ƍN,+m7iZ6oWtSJ6mA׋x\=;07:nqO mǟsSaxG lHLH@bB̛O":Z~bTT@'H+>ko_6ᰴmR[h >$j>*~4WsZu}Zmu\ h EtM-Scℊ &0aRݗ_lIF\jasG?b?\;Ae$EüuE72T>|3缃~YYص{>kuX >Z!@Ōgo+̸ ߿Ip&S^|_b\4,qխ@ڵxڷzfy߆oǞ;00HNJBVv6>۶PwpYYd<3!~`wqn] ++_-].tVj8t,]/cIغm;`Pp\zO QoV# IDATѱ&*2^]!_ rQşnZW7"&E_Y~w\T-jS|М+Ԋ#}FrIl=_\Qr`'_Ish!3%DDDDDDT_sw~h(,@ȋ-m[ڒܧ!v).1&v>.rBɋAoBYV. f~]dlv""""""(.B9Z@-红OޖmboBrzj`ˋLJ QIU˴ADDDDDDJ@O(X j.,ǜQxu"_nP#uTqHE `+`=LԵq@qqhmwv"'Ը2I|t'CGq|XH>U'SʼnS1Q`/\> -8_n""""""Xr*jNjǩJUbэQǪX$$Lj*.'V^ 4Fu1"<' D5[GlP|R*\T|*rZ:T,ܶDMoBYJVܔ&3sF DDDDDDD}N(A@HM](X7Tӧ^}UF,p"8(9.-_"cq,DDDDDDDAEUׯWNq"P/BCm-6Q.kAVuBY, {ꉐmUTmucdXP`8m˂u'FgFDDDDDDDDP j[NiB:vpQѝ CWDDDDDDDT\T]qbׂ<LĺHu-s:)>y[7Q,-Ʃ>urW*@/4Xi[nk5[P'""""""5o9:jLiucp1QQ;8@,EPPDDDDDDDfd*oNk:LmW,@KwpBh *QE9zoBu[q*]Jj'A[P QEPQ"pjLPەʭbL՘zյ֝ه}=DG'q}SWٿqڑ:b1D8E7Fm!ԉ -/" l#&ƞV5]j7QiC3-~\߄_DDDDDedj氺my-u5bpƄ-hRj$'@ۺy6cNC4': ×gADDDDTvrR5uSB]D|@꤈ȱ2-̲O@T ڤ/jDDDDDTUk*X,qQUY';jD196U['"""" ]N,2]Ģ`t‰m$49bEn[6~LG}NQDePO|2ţ~@臊Wk,@{Ʃ\ԶzUjRVm rX][ NqU"D$"y(P/UcDDDDDDDCUgcCdlĺAq4 v>y'ɜ`sD[ T`/Vק 1ڦ2ػw/^z%̟?6l@AA: @Æ qE;@N`Ceq0b󸦮? 2Uc<( t"[.V-݁++Ը8Nq ̙3+ m?3 ׫vS5X=zD^1{7tykg]qeWᖉqв]wu7{|m ߊ1HYue͹B 5^ׯ;y>Faػw/|J+>m>Ü9sb Ra>o f`[wƦO>w#rԲ泡U/| Fy;8N}"3ѧOtjW|>lܸSL)ضm7 :} SQ B-Zipڨok""""rQU8SmٛD (痺O>9sfLmSOE^`YuaÆ h۶4n&~ #sfa鮚8W?axjL|9F'""""XZ]ZYf8q~ذaC%\ӏ4 ^z)L,Qm6l@6mbTIMq]# =y0 Y(DύHp܌ȵaDr/|DID6?2U` %- I<UOrR*q21U, jL>!$''WH򟔔7<`aۀa" 8K޸e 8~|mf\Nl/zw> %s1ri.,# W=o_'ÂwJ}:+zzx=?7Ƃ%b;>; ;˙cRd0])BX84 {]~ [z|3xq|vxn%8!cDDDDGppUiUQᎣ(ʕ+k.+,?য়~i0 n͛7[2Rvwx~|5_ ۶ߍeӆadKxF,T ˗3Go`ȩ O5 ~s6qq{R5ƒa4lؖ ۶acm'$ܼ4qN?^+XU*@DK$'(qTF1c0k,df:e}~5I&a%b͛7СCq뭷TrD,ؖ_X|0Hx3vhZ#ҷ1mƧxĂ;/NgGt3m߅;'Wڄeosl |駿Slۆ".wSѸ9Vcʃۀ,>t4S:xl*,>q'1p|R^m}qU]T(vՆEʕ-Z[(B˖-駟I& /a/ˢcYVq6lpQwӝZ6q-bC׬ZǵDŤ]P7pGr6߶Tff!xvص8ECLIBN>{?,,ڰ{F<6OE44l{ ]sعظn+W"|pSǯ5GG `YOJԪ(ƢFk!'<²epWcǎ%>"lۆeYXd uCC[߲_CFNmLE Í.ѭH 3 Q-b#)ڷQx+2u01*,qD,<-8pY)$r+))!+x#"""" JUʕ+v1i$o>fE\~4h|%K j@ZdX@}dyؿ?V\5PS7, AQ:Wb{8I&\twcye:*NLu{n5hժŮahժݻY 4kQ\o`ժ݅$[,ܷI34q)c*t+f.+ѱch,@%+Db;yՉU1y*ٹ8O!ï\o֏0ݎRVW}}YL=7wKqIH6 }p7_K`2w*%Ev""""ʎ|X,@QU`ÒjZ'q5c ^律m~p%EuR8t|{8,m3:s 5cW QB'cmY-&gmXUѕ8#)xh*x55xj0\4ouXVuX,ˆm;q""""*W@Q`AQ3i|[?7v́IEZY]W <=>_U`wF.|ip|68zyh_o """ DTaƷDƂCip77(lb0 .a7Ѱ4,V7`tiò!m,wj O݀:< ^[[E[13Nvtҟb^KIDDDDTűAD0QD1 "5LWGe3`@ D/:= (X """"""cb ySCDDDDDDDZ,@PX6laÆw'""""""`r bԩX`rssKĉTN ˝wމ9s:޽{(Lض]b + :uꄛnU~>ha񁈈HOX'O/U """"""  [5h"\z,BQDXԩS1^~eiF&""""""M()b}7ߌ 6`z+V`ҤI,ZAebn7ڴiSJۍI&I#XrRaFAQr //O DnnQCDDDDDDTXj޼|7m[ GҥKK=s""""""÷`PTn͛7KAUVWIGnn..]YfUW]d2AQe&(8pO>dLavCbb"%"""""oa~ /,[E->ѣѸqRυ*s\3guիWfX}ȇuY>xKאT-ܪam-7NI[ũ$ (&ի/ܹsK23'`T3|؟oo墣ߟףu&""@Շ|X!bZj7]w݅3f`ҥصk:,*<7o GFxjb]]p,1`IDDDTEԍ7!͍/z>ſIc)˅s=sN̯0 aP,n<Q婓`ŠqB,@P0 #&IDDDDDDULDDDDDDD1 DDDDDDDs,@Q̱ADDDDDDD1 DtL񭜀k_ ,𓞏yaU* "Z,d]g}%+7a_亍ѡPm ^Cq_H*ary":6`Mw7uV{`ڬh{8y.ߖ w>~vV:L`k1X̼ ־&;箉;c_nV'bbQe?n>]CYX|f7>oK,'s\m?Z 1o-[ vx郅pJ2EUC[[*th`÷cLgڱsU5={>|IO=E,ma=d+8m[ޝo<DDDD"쬃B-ԭ|ںoj^};A&"|wЂ2|=Hw#.숔\ /¿ζ7kQy| .B-0x`b0_ukR n1O]#zڿa/GJH '$bӒX1vR:Z6KGEDDDDQǷ`QeD 2q0@]ڏCIT\Ku7@=d` + ~Qj ?ԾKV~|r 2WM (,>X:NRߏ1ǻd,xsGF|Ѭ0RpGo'oqݝqstDDDDUYfzE,j#nn JUi9\H(Y?N HCj8YA2Y59#qQ.ie*2=ŧ@Zi;_x}5H>&0]0QP  ѱ8glr,FzsK""""o;"v>| 0X?w/-b?ao ;w;>c:+Ωet{{+{#Y{@MVbά;p 6SxU]uϽgn}|Ж;Wy}[^Un""" + scZܛxI o^?I/kFⰝ{a w߃= .Nn r(0԰-z7 jL }^|7<H@a3-p|4ÖO`6#qր{-]b&ܨZƠ IDATtb".omuWamKZR-bHmw`EQSxp-#L=*_cFׅ1B=Q<4'˶Q|_H).÷a[V0 imX׀a#𑞅۰&Xs:iZ -?lplX~[:",g3)凅·~ڀɛP& %ƈgcC ,~^-o~Kjm[j~$Xma'+W@Qg+ PÂa4$qp~ L]Xw4y* ADDDDDDD1Dd#ku y EKW~ڢpsqܽљ ch`'?a #x{æcUxQ؇~ł oEX`[{XeyXb~nowan8kl4ޝ>VfD7q/¾/_䯷W|B"""""""xJb.n=k0|r-(}z&>\8Ls?TkpቈSߍO)1+09ٷ12I `(Hn5q oזnEn8׹/{Kɗ=8⯅¨; d-?wӍ?ØqsѶX @ ംf~YjI;ȫԣp"""""W@TWYvm YߌÐAg?_5y%$c!Ϗ 'xǃ /+߽N>_S.ڇ xuWXf_$.~~+e^>Ec?W_VGg/ wx ̻go"*XAbɒO٘[XUZrxXxu p#xg#Թ _4< #||4 *(#9X>~κN.?kr:75ZwV1`$;^Rů_nE橈$ޝp&$"Bĕ먪"$^_E[]UGERꊣ*RmiZi4ABdg~d7l||f363J˲➜ܵݿ_*DrqSn}6B!Q W\xO??u._RJxPW\NZδT,U|gVox:+_3dB̋ UC70.A4WH6 Sy Ui*6Pʈ) UONh罅,x>}OL ߚ y앝YNX 44ENU,n+\NOU+#a$r,>gn$׹T8?-Iq%}{:WV(j)#F>1~GeWMDBҥY_9B!xk$0.a~i(1(jʅ W0:0}^0_eOo<a8M|kG@Qҗt*(EyRVT75jםr^wy{ 3AxʠY?)?ƘCh0.]~sMmFr"S$xmi̛ yҎ0pR2jޞM߼19կP<u8^i 4g> }d˿Yɒ%]B!=jY>G0a˜So˽LFQ3m`!4YJ|)_/{'`3{̏?RX8S nΓ6iG]E4Դb$2ɵ9|?N$S{2ۻ|^P5e)_ԓTk*yt8g`6^)cRnc/љsD:*?YCTiWi|o?"%KR/n\=%\Ȝg#;/jԯm߬dSTj#F"T7_W,M#=G",",\4nG9P'K?J ;1i1b:{ʌӠP{3O/@Ci7z=ۭ`WI_8mt'|ɜWcμ{{~ǔJӓYW+O1SoJ^^%3d8 !B!xTn&z9]{?ǒDA 9:MNiǢnNi}q^wӈs׳n [@駿MF҇Y" (tEU3P-:;&C?f`j鯗m訹lȲa(Xűfd CG >)r:ϰl9&$}[m2*(fgzƹR 6933tlroHEE]uZ|^5IY/ϥbOb͘4 !(5}b2GChߠA! h>n2w-ޤK:TDH [;VzB!HBP|^qpsnq[2r~` eȣOOG(ޏ`޽|1%OF3;Kj>bB5L Y4b33+Y7*G&2jE4Aޙ ]e}I$^b9i32[,`o~fcンݏOZU!B @!"*kPxZw{\gzV>;)rg3Ae1)W~\-Sͺ0xWKxo6,`2ϋދ~n\y%#{N4|5@z<ޱMym!VB验Go=^@P`Ln+WD&g`N*, r~63-]ש׳3Oy_=jpz[$i)i[wϢDC[؝(},[BҺR>޾-BpY-B!nIBV"_9p$ H?QVcZկ%ۉ`F'"xkZض{L46ƥwYpS>dКʐ9 ` O=_UQ>-?CO LmO搸g*zcbkw5A7yNr )S$P*SgmTeKeL~/CiIOڛvrvȎ+2mڶe,N%!B!n !AntCAP+f?p`yAmKMJ̈́g0׵FDcX1T(COH#v+o3Z7|}myIILzČz )ݳel:l@'ѯAW3y' c^BD{ K2ɘ6(^$nXHJt{Y1BRrZ٘1ul\MkgѽB!C1S$ aZ)JgI9kO58u! OBx_Z=vF_(Kq!WԱ&CIx*J&aq2vW%^b@R6ɳq*x(YB1{bVRHrcX,(f͞xmXҜ SHz5o;ç&*dV1yB![BWC-y< ,+<w}HZR2umw3c2b^(S1Vb&RN$Hi{NF%4v+-5Čf×2iTUEB!=G0ůʞdרY"hJ"֫:!%M(Bzm=_ __(ހ7doT<(@cQ&lL*kE~hhJ*'sy߱uOVDؾu^ŚիXt 5=+k2& dXZy7eKaz'a7޲mKcAOW вREA {G/6NJıˤV.ؙV !B"!G-JpP94G!TpKѠ3nFhJsDv-941a?bhӲn-j r2I'Dv|/z:_NBI|~*TiŬ׿ ~S+qt ܨg2-PPqSj*6f3 b̸N79\&TziӚ^!]fQ @!Bܭs,z9םӮ#氮ӿSv,*6uG 0Ӊ۹9cH'p#AGw^' DLfs}=+QQ8N#F^l}fF|7QDF&0H; /+Tl7#'mB ?/_ػo'fӁVB!E9r1cƐZucO?=qlj |hdܡEoa4{R#I?|0Q^([aJ_ӴDۏZ>:s9_[F2 E׹JFhAݰ4|5|{`eئFu^t؈{o=^@P`Ln+WD&c$bEh۷1a.\WMu 4E:zvI?ѻG No$:-#{lkHw3l<fѡ(p>V|fT' =n^!jb] Z`ڃN …;_Vxڝ̀@r QݞU,'Dž %KeS󗡴bǤa1el'W0QأZ :OA22A!nIBܑ˗/m۶l |M&Mw `̘1;Yضm.]PBNţPҲ]%>شQ, G2-v4UC1{D`JK:KP&6mբdɊ)*pyFjgJM!Og /Ѝ'Ү7=ٱ ~D;W>I}NIVg-^cZSiO3,$cV酧 KI&^NO=R+9VFGt;7 )!B! 9|p<յ77P3u,sa6m*oxdh؎E3~j+wm0|wGS Gt|Zxk KJ@{E|Y ij>UCU OKA4PrK1=Kq{C0|QO)|H:uV0 Zrz5溡)\>ysZ{ O~cf6wzy>Yw UC3sXN!x+ 7t6)VM|ٳ|-mخa h؀MfluR6XSUDC&5PTPwbDLn% I>aB!-2BPsԊ>ekH[yLT:cُGv ( `\>QK9|Q݌喌_wE#E_:J&tFb$fL/lxP o8^.w3,2V4Jb3/Atv$ÃBOԣtxU[JuO517*&F\R &^?ow„RrkƌDqS戗LTziӴҁ qI/G3_'B!Vnow^wN.Qj 9:MNiǢnNi}q^wӈs1-ma{W[~=;w6bdYf9kA?S:v(#$k=Yy˕ d3t2at %sq(((;EAUM{86 tÞR?>}ezVEEu|ֆSEAU2'L:lIw``z+R8ΚaWz2, B!Xt4%=n`)# HuI;;u͞N҇f;҆=1K뺑v-sݼ,BBQ5/~NU#3'{yFPɡ,) sz*PTr>DFrsVU͵-!Bqg$!80_F.\صJV+_5aPN<#HqX !BLB)+W3PfM:v?;3?PiѢjˮՄaHB!ģCⁱZiӆҰl$''3j(N;C4mڔÇcٰl̚5 !B!x8IB<0+VA`` ժUl6ƺl󄇇s1 N>%-B! |W˗/O?O( %#8|8zh2 f !B!xHB<0%JX0\x1ruW^<\B!B񨑞x`^z%INN?0 5kFʕQn'0o< >;b;-/%B!Bh^H1&TՌ+\Mg'#4Nfjf/2d(Wj&n9F,JBxzY4b[1'b ,|c0V^U[IfkT3PzXy$CgQ)3Z n.5B!ۂR{qƱtR^x,v|oR0jH_xFco6,q$ƪ}i׼1uCҸ֟`3KQg0[X;)/vQX( ;1xQ,;Gߒ6 Ga7MO5K3cIgX.ŧ*}FJ' `6_99u&w YĬΏcV]NҢuz=;ݣE eq,JXN;9HDz5)k(+K!&G B!nBo*eps>HAd6.ɂsy$[lR[ݻ?cc1c~n2z2?يKغk7[&qbL3'KlE2dO$߼4xg="?gRLٯ_qTU1PH8ʑs%R)Vj=P,9Sq)nlʔD[8cdRCe({1i8 N.q<[FuM۶l?iYG!BqGp<4m4ב}asDL+[PKo/-BX7Ƒhgfv uKe?[ҝ*(shj$zI/}^׃(BEG\܋ 2b8 ;؀T\wJ4pJۜ҆=q+ueqpN9n^2B<0 >̛7/Kb:u 0T'O$Ί+rlK)KgOqTMC44UEPќ: C2ֱ84׶]S~Ks|>!#1h|Pϳ9rƝut=B!+-k!so0˄u#aؖʍ>#H@B!2B<09 r >Rxq~Wʔ)C|||F;]vG*!BG ӨQl}p>ҥK0 N8j`Сԭ[7[B!B!~L>|8חÇg!'jb4nwwwq}ƏZU!B!#=A!;z+#y)B*Uزe adq; !B!x8IB(֌AZwNXsPmq?B i@gڲűћtiVՂiփak~'}Z\!Bq$!x88ޔﮓ]oVB|7\̜12\\tʠ#ػw/_iX9hgfW_7*G&2jE4dͺqNu d*K"f Ic yyn:ɺht nUB!m!dk_z\D '6}Z7"nu?b1 ~^- K:zRu6Ngig|m'n}ux\ϭ7mMt~T?|0Q^([aJ_c |# &a'8J 2`R2~L + ̃ɍ|d("w]^<灇5zmD\g eq,JXN;9HDz5)k(+K!fa,!B[ HB6zq<KVٖ(aBIܩRmzVv1bx|.5_ƶNnhdCf{]j?旗a\~McB1kSj;Hy?k}'4;`_5.',>uѽ(Gb!u͙bWںuCx/J>NRU,'jPM $^Dž %KeS󗡴bǤa1 c;WJy B!wKF@!:X[N|1 CXG>%cٷK\Lq*z>˵d9͎or.tڝno$>>}o_|A*U8{l3p@&MD||<̚5 ???֬s̟?plقbҥK̝;-Zp,uſ@7CUYͥN(WàwYąJ5P<u8 n`Q77ȦX***)A bAm|]3>f,}Yʸ>(K.27j{TnsӁ_zLsDX3c)Mqק!nV#9yqW)U,^HϷX, 8ѣGxu;wRzu6n( ˻׳X :T XcԲ {,zyBT+F"T7_W,M#K |^P5e)_ԓTkț|H:uV0 W.]X1)7ڱ.>&_/S{r&w=vi`#!zwq*м/{X #,x? IAopl,WSMꚩ޲mKcAOW вƐ'8y*.[IpcgOX)B!n|4ܑ6ypF.sڵv?ׄB}:u*ޮEB7j >;B!9 }ʂ PiK,qr_αc\jdӧGUUZl?ۗkB?E$ B͛5 ///OΎ;X"b2;w.}q$Drضm_PbEjݛsb2PUrʱ}vf̘h܎U!B!OԩSJ*e;p=Kd2{e B8ŋ+VXA޽{{9(ѿ՚wg-Ԭ\S$%k1t\ Tj:@ɢ{|KfFAT\M0pvN&z@\ү[G q<<5Ѱ ll ؄Z!T݌ΣVKb.'?)FwAH H8L5}86a5Z#Vu- өI-RMgQX] !B"!CȋҥRٶ',SPe)\~ +IήgH|Љw>S)SȐD^:VOg],15o1; (\^o}ί)fG0zʑE#w~́$F&0H;ah7bc{5i1 IDAT3Ҳ5XyF63U͵B!-ok!lj |hdܡEoa4{R#cR?|0Q^([aJ_NǼ]hLڍ8u? s^Hu iW%ƺn1AB4_eú6MD[G Ӫah trLԊj%'ŞlKABk &y:k+sYNlLX1۟x,vËP,Xs9W7U&EԎ4iކQۯ:2G ԩCh. ^r8]QeD + ̃ɍ|d {@ e2O\l6hIZSggݿ{HR1r^Ӷ7E ۉr;QX&o u|})Z>8%B%!éDSƽWHrtV<: WPj;-;X晟pĪ8K͎1tBEl#_]]l}sglG4/ WrXnZ:ſW߼˫sIU3arm -]Rz2YEAS |ik8\c,kvfG2ϓfXF/DYOu:Ğ/S݇in)՗Ёx'-"ض{L4?V}]"k `^ŬBZ('B,&͟;1 L)wgU,'ǩ %˖ʘ}Y_Ҿ9e ^2WγeT'ڴmKYDB! %C)JOp$"6gN?ڶ)Iq_Qj( zfDhMJ\l;$=5t>RhT@!_stwO Xr| A lB֥n\> +=s #Diޗg+ត*[RKzg]Oj >g??w&J-ь yJo+9@/I}vjE{W?Ώ'&ɤeUCU4 U1߻ş&%f³hZ_#"V^dئuـ3OR_?2ip#k֢ ci>1aI&3f%cYO%d OTxk2sdckǴױq:6En;L*_[=8 A19 dDPtA]uMx ``]"" 0  ‚Ja鮺LAK>Sg{BT\kՙZ: صH_;kwGR.3rْ%GP cWMUQ?n K9+Y+d*mʲl: i:nXzaWW4GaVP ^KI(6;]ǎe arb Rq:kUlfK%uTp~S KɉR.+Ԩ%R])g"[&x3ttjkݙVW.#FHWՍf꽧{]B(EYJ,,#R"UVǧ1K{׃S*`~*Hr7'U a YFvs EnAͮ{Hqoyu\v뗔j_?p/҃o>+I K0aQj,n\SnXRܵa\Fv|~["ຨޤB-)eѼ= lCъkD]5},KدξU7џ_XPVqS鲿jt肜ûfڧ4V%$Q-:Vy3io~#\ߓdhߎn۲mCGfIGw~%;BWᵋDۏ(cK/k_KvG'%{%Nٮ}F"$+MX$%ս>5_Ox=EoRt鬆HokLY9G.pϦRnRF ևh$eY:~'mwY#8eZ}էZbzYͣ]S] БjI.X9oǰKu35[5o?Ph=ϘJ;džCuU5:6ܛٺg`g5oAv7}HӟᅛS]ګJR!iRqzo5|yƿUǼAntӍ8uG/I]xaW4e H.ϐu|OQݯJ-ZS;fx'ܨryi5ou]G_&W )k>!->jV.=Yw\{S>jM*4==̛u&Lc^3=RVmuxJp+`Ø߿)q,wِ9w0sw9-'=pZ*kfjUX,;0z,M"32gw6ul_|:}p>|s@/Wм\D 5YCE S^y9Q'Jq~o|νy実?ϝ.Zw(g#ﹳ-_qk~5(>rja.6WKñ'$(s U6r42"ÔlC!GBX5oS˶2`=}G=?]W?F~\ٷPS޽V^\GɽYYmMTNEŔ!ɌmTKQꙛ˫zkoUg+Źw0Se !IoԈ:>jrgzvjbUAW{K/yzNI)!)%iȻc}V5"݊][lyvleGt #<6\ah-t?Onja{c﷩EUT\«UcjɊou ݭ^ܿFFjBUp+,^#ɲ SiH{n)CLK.zCz{5gjg3 85x^NnNS&ٷ]*+27r^͛.5iE< :>O_=Wf*'*^c}u+o+ߠW^ӬC7׿^-f0 ߟ*e+iͳzjckQqnCF33ْp^#3 S+J5Z ո(~s$ɶ C0+*\GݿY,\J)ɶ!~˴'IXVL@!ɐ2s0 ]*7Q~@^W9wO?}/TOY 44iU{vw3=* K0w϶_S7G'vJ5 U\Aw@vnẨ5ؤXY%e~>Zub%zlIyRmȲs ۧL{G=2\Cھ;0t`١Re.E5%5#;#Y*vZژV=beULޥ%xd۶l?zDwXxgJ)g3 lo6lݧt[U.TnŻZ)4U}x\ i9Y9ϿcRt&sjT=Z2UZQqMZE+sofDOc#o<\qAS0;i^x6'X T\x=r{s_PcoZO;XkʗWT2tz =;.[o|ҵ+r;j \Lό}'8; ֯Z~A>\>>nÔs;|?緻%nYKtL+Wb˲,]ay\; 2 I-mY|n]C%WKt6d~1 e)%{Ӕ,~&ci>,935I 7&kh1Y6嵙Н%yǹvܛwQu^s;]đٖ5?̀2d.gG`|'ke0r6o&u| w^e$ 6"!GB9r  @@#!GB9r  @ȹ xb}JIIq6HII޽{_#Gtv P*OgUFFXFu_i2y'r)))ݻ&O|C3fhҥm( RYYY0`֭['l.1˲4|p-Y#)S/eYΦӖÇ3#IJJ?0rM6a~m6lؠ8˒rCaÆwU߾}OzGYhj.Kk׮U6mN 6L|A'2335x`͝;W;K027n X"q5רug-,a9 2)))ΒVzFCo/Xl!Q9 $hݺÝeeffjСPF@RfM͞=[&BͲm?8 p֯_jРH͟??`ɳ O.!G pRSS5fo^3fО={##4ػwozIy=!l!i9vz3f{,޽{`-\P999뮻즌 2Dg.B,bYF,8r9KEQM6/8mgѣuA7.4JlZreiРA߂1tЀmz˲4qS3 P"m WTIwq.ݹ^z%}7~K B(Z]wݥ_|1~%,JJd׮]ھ}{ o-sX`^%cq%$$Xٹsg {r\2 #8QQQ>}fΜ+}cmW^eY~u4մiSbH\\ze˖-xgl25j`Yvܩm۶=zPժU( &hժU)Ym۶i۶m>=ij„ Agb&Fp(f͚iĉm!9{1hтp!@x@Ǐ!Bmz2@(#~7 5|կ_|կ__ӄ <8mi_~ٳ>#}:xY{R͚5ձcGS,ΈaP߾}tφ3aF8@ $ {@#!GB9r  @@#!GB9r  @@wLh;N2,FW{޺A͚6WԤiK]un0]*A`C+ѮlgGY--g  ے}i~ظN+ݯ.r~ߛspBf<;d,k{~6;?8 ~\w?-zuڗJlIR6ԃ7QvԶ07%z,<.>K־7>T?>%wӨYe%w37Ov;;m]nEmtP;on]N2z#ڒykzPUt;u>-YC^7[0UGksj-yv<7V_@^W̼ؒRC^Gk( IDAT?{wWGtޞ2G;I,ZmX]~flu_>_Z/2)7Jyv'Zp>6]]rX+O:ny @ ߹*1LKUm+uBs+f6r#ːMѝeiGջNLC216t.uPteTE_WSXKթ: 1) P؍ZD^VFuH*Үרί+t4 K.Ka+zŠ^~;ɝaTh6.TbJ5I;<4j\Ge 2].\&Y$eVX1DjuUsyfSjTStr,[%oZrwRLp'Y;UʻiyE`ݲ-ٲt4A{S#-OtEZze򊋋.H w\y<zgwf0 8y%.THN/N[ WX:jILIzҪ4Ul^`njNPڧ4K>N.Uϊ0zD:yʰ US[l㹡CEZc[(2Uc_]gjQϻt0Czb*ڷ'۶lzvɮgg(9\Q[.y~]U;9ʪqH;:.˶8L掁ͽͲ6w׳-KV Cg . R}z,M"32gw6uRI~|Lym^s;]đٖ5?'G^? %dpAaʷI+'!v\0e:z3L3g+8w;\D%  @@#!GB9r  @ȹZϥIP|/Ys4xmg K0@@#!GB9r  @@#!GB,'IMIGvLw6 fDS.W 8 P,'[ >TUfH]ʔcuAkeE8JNɓ~BMUơ_$lJ2QOr]= pR'[?ޅ2yt6J N*a݇䲕yh~(%,@l[ˬ:sgJ'_dd9Ndk+#Fsu`+3MР*4hfI} ^]5e{@ ֯Tα9PDVG+EEvk2|KG-Q߬Pf@ d,%~BcχȪUDEn tI) TtUDEV;~/{8#ѡoi8˯-uVY~5If :OC;L5{a2Φu%8mўYOJ퇯t]$)O*|DTd~`jWxlMe%gISPv0Oe{rCۖQCNjr3cprcK9' >/@?X2gN[fe ӥ*M;$aR`}*T)|i~.}FWvPt"k]\9OV!eڭ m2Cj7(k% ?!.gᏆgPt1:Ԑ-׻BFx,7aZ9](]8{pȿS` aֽDd٧oORƁṘ3')=b[W;e3 RqWQ_(zƑ= ETXLuIRα#J<$Uwu 8O0!eG;eE8dۖ2oub+~ g/Iom[q{ˌKȐUU}g2R$IRX*P7^E27}fKuUl\6Wk:^yiΒ̈hg P XX"EU3ۥ_:03;? 2U]n䊪^P:"UlBGVϑ]P6Yާwae)}NY$#@+JJfL˛?*r|._Y`.pj^dր;/Cd:gPJ pR;\uޣMTw=2"MRBSr?e9,Vlު?aUq6J{@X̰HUa#XH]eHY9Z5M$ZLni_Nlը?E3sTNeI2#4hRզ_/}@ /U_$kQScZEeXތ ZM~H5[i󅆖mHѐU)Ԑ+ДdԿYyLkuWR S͐)eBtSMC~,kڵ'CknFޒ [[f۶~5GFT`I-{2%Sضv֡(S U>\=*{HYYZqT[փ` D U u Ӗ¶-͒.2el[)Y1l[*`J]nQ؞;0kilݜnCaj!b+%PaZi.rⱲ-d"cK/\@ 9Cr0SꃖZ5e C_.F$Z"Nu"[ӠfnՍt̀ V^s{4ڱ^lTNwu.[Ǐg Z#g}^-.Ug2=Z (\( pFz/jGe-LƍSƍ5zhm߾٭H۷o-ܢK.D{֮]4|pZ|v:J;Ν;eY)(۶eY4k,5mT ҷ~[di& 2D͚5oLYUd'۶O?;(sBŶuV-YmjѢEj۶nV%$$'%%oW۶m`yW6>_s5۔ _^XG[nsUW[olV߾}5d-\>LK0Pl;vFU>**JÆ Ӛ5kpB]~.t饗jO5bĈ$#G4J{f@#@EDD8KZ0 nkzrzW~zOaaaE=Kg>[Zb3 C޽ԩs0nݺ֭"##O7_~gVVA͛Of۶mj߾lre:uTX{` (}(F 7lw^Z]tÇO>;|tu;6lװaÀg>[Νv8eٲe9\RJJJr6Iunݺ ;}jŊႯ -]ԯV.]^P PlUTQvZ`A5p@?~$I7n/^ŋ x$jРA;w… ڵS*U|zΕp3 դܙ7x233M2 C/x +<<\&MK/$쮬,=Z+W ;lo!˲} xVA0`j_}U@0_kСAۭYfo[anV;A_A/ʕ+_,kΨ>Fg(Zji3 ƏlIo0`HRTT͛_&eddhںu$h ڵkJ Ym6͚5K{UT"22R/V|||}>}h*WYIII۷vޭ3gj֭~2 #3Fh(.L`۶y 0@ n̙N:+0 C;vԜ9s|H5x`=/w `F7V$%%i˖-az7n`y23!Otc͛7+111~<@-Fi8--[ѣ0@^y >D&M*2T馛VpvuM7"L4IW:CBy%$$82G=g󟠡AVGiĈ1b>c]}AiӦiʔ)β$M0p_w}ӧroY.UTIC  5\6m ͛K`ղeˠ̀iyʕ++Iѣb gS>i V\ѣG+;;٤+R111~5˲4eʔ3.JlZxq 'ԼyTvm$eggkذa/Wuip6F;w&O9E?Jlԩz~.LG_˗+666`FCZZz˗2Xruqgbbbl25lP7t.r{ٶSry@D0 js%h"eeeծ*ݻ`B撳gVxx__Iҍ7ި7x# 6mFtم{ァ{V֭fA? > @,]4`P?vX\.aӧO4x<;裏jĉ;n8v5m4'`i3fLKv1}~DLL  H!СCUre :T~e駟ƍ%I|I@!.;w, jܸqJJJ*cǎ)66PG@֬Y>}(**ʯԳgO-] O>)2|\.]^z>H!E||_hA (](;w [nwaj۶>cըQ,۶+j?Vΰpr!Iv zm@:sAgIM6u2 CM4g}f͚9\yZf6m*%X` (}(&pOjڵڷo)~}K>J*3J-33YRbbm-_\-[رc6,JJJn6SJ IDAThѢoHJJr>3@7n,i̙E 3g:w뮻N۶msv9۷kرf͚ gI!oT4n-wQU{$!BBE@eEE~,XkYwuW]]Xw]Y(bU"R*4BHrdd!~gs=3ɜwι@5hA0oӧ+TRRLԪUl2*((eYe۶N֨m[~_K,ҥK_ZSLѸq㪯?QPP9s護ުuAXh?h۶[o߮QV7[ꪫtSNs=WwyfϞ]k4w\ 5K}!kg@c lذa:ku€S믿3<Ν;4MN:駟ҥK5mڴZ m[e8f]Ǜ2e222@Y|I'QNS]vV\_]cƌ79r^}UXBW\q\.W*իf͚U1͒ŋsist:uI'5{l 2Dm ÐСCjÆ SN9ENg㳆:,-^X]vm8xo?Zf.]uiÆ T.]~SOUbb Ði6?2 CaGuM7P-͛gڵK8p kr8A8$C>|2HAgK>ɺ袋Zّ]4;v  @@#aGŽ;v  @@#aGŽ;v  ,]ȍk5fI:r١+b+tu/k[G,Մk*_ ~G;{޺q ?G[UR n!u+TQ6;W KvU.R?[XOP˜KkNTB I2錞rEi \ FPyplPzd5)}w2NSruPPT|"G(1"1q):olb^}?ZcWST'bz{Z;Y?jv?w.? 4y&uhOTۖdTkiuz7'+>.-|F{dMKOϻY\VP]]uN㩚ZyWݩyW3GS~~ɮ~JiꕗЌ)' 'k֢=&L5ԅXt+YaUޫ ޗu9lg(my3pBtyۋZjt4!Q`x_=>'=ӳmNe$ے?hYWYoO~\?Uc'_uoi?*_:-w7hfH/NZ$-ٖ_~[{{<@,xDu)[uk 92=̲#HMFqtZGR7zsQG=5!)Qr9;qQWy!4 SUVラ _rEFk'jRn MANP .9xuݳ]{||;u5Jt*iK.^%t Ði2dt8p2iWnN{GTT1ZSY;Ol~K_>W7wuicjg*2Z;;pQGoׯ.^[}Tӻ*'Hq>wTgy>[u]~Qrrpe()C) KU9Qn7zSXU子5DA9k~ڒHQtH֡^@q,&?\Qj^If!8cwiTSֶ5 Cg8ztoiwF CVD=71zn{~kaazWU:;p&5p?o c 1PL=]7&ćt-/@Kvihϴ$i8;I=p;;)"\K -Z?^-ͺ)WuK,U>U2,znˡuM-  4K8 $ @#aGŽ;v  @@#aGŽ;v 육@}7z״{*IRZZ."wq2 #@TTT;?.˲Bkx'\{"##C ZM7ݤs6><ٳe^Zo_|$Y^zIl#h=~hqlC=Ԭ0bݺuF11B={q;vᆱn]F?׿_#?.C]1ip L7(D&ќ9sf͚Cpp˚MCC UW]j@+"@,X믿^yyy-z-ZTg$͛7/{1=Ӛ:u*+iG8;>}rss[4| 6g]e+??_ӧOׂ B 7P宅UWPWYK땝Zh׿oݻ7lC,k)yyy3ga_|\ZzuhRRR4qf_Kae˖)""ƾ.]ASNmE(+(1.&M^{a@Ϟ={!ĬY4kֹ֬sgr8U K4o޼#5а"C4}f8mmZwqHw8pf-*bccꫯjU8p^}UŅVAiɒ%/j[_jȐ!LD1 CzVbaGŽ;.BaY^z%}Gx< Pu7+999ZTPPYfiÆ m;N 5f5 Ow~hU-ah/U3ʕ+>H|xb;`E̚5K>Om7z,Kk֬^+d/zjYUkne\=\}<Тٶ7|VXl 1&M -ҤI4dȐ&q\9s&/ S4M͟?]+,|'|.Byq'#@ؼ⋺ djnr U+p=!qHi2;&@@#aG1cY Yx222YmСZpa.RW pJ-j޽{uEހaƍ袋n:VnfGF@MYt $ɶmkٲe h; "ZԨ>}GEjκ#-GULLLhqnfedd0j6lnZnf >m׀@я~^K. o߾Ȑaz衇4c eff9ŢmZaJOOyZUF.#FhĈU@ET0R \;`Yo߮y4~vm۶:/b h}WZZZhV\3fIe k,Z5}tQf۶~/pq8bƍ]Lh[nEwGGaa?K/mK.DsO^@AQQQ3g^z%eddpfaÆ^ܹs p 4Ʌ^?E:0d&##@ѮF? <-,!` ;v  @@#aGŽ;v  @@#aGŽ;v  z߻Mg^yʶͳX=bcW-yvٗiС0xHmO<0RJs!r?W:FG6زV >m]VfVmu|>S[D=S8C ~N[=rUAaH#uZ'CF[d*l = X.OX IRU> eę7Ne|XrPDl~ȫtWuQ0rݕC5[Nke4T==tbEvU'~q%z,y"53F(?nT5/5Y:[db I]Zw)ߊQ]!]tÔiakk;TE/ G6 \ͼeμ\?\Ϸꔤݡl+Ugin ]uwcƓC/gN u?MzG/PDu=y]7_usD@=qT1Tgض䷪7kЪwEO_)W_9C{-LAsH>7Czwz"mɶSO2F{Xo-WgPڇtzߩљ zEl`80塱}혯W2'곅ste{e*w uݠCts  ='.L_/-#~_שT"8x>K324xp 6J}b:5`-Y*萪@d(2%E >/GOcm&'I2ձS\c.9MK˖+ҧwS',gԒ*zX*(NTvmvLUsk|rSZNC h._Wh})h*:O}c1ƈOP\&K,JUjW. I=YsΈ d00+Cz9iwFV !Qfbmd]V!z|E}*7;SOPZT8g{hS0&-?pG:)[*%d u>M] |Fm?:Ρ:h-~EpKh;!:yC6[P߽4Oɝ=ژ_mWbް~S:: Q;ucQ靚P} y5:چk~gt 'K~c g]:Y]sD;Qg47<;G׃3Nر5aگQFXrU FS]]~c=ENn E{ned4SӦ_7[OSgp?@ ~`+ z fA?͠egrfJr-;nꝒ=45ѴIMm]׵ SӨ CmYV% ܫ3GseMޟ!4U+,Urgd:Eؖ%+(63GWr*6Lnmvͩ%mTW۶dYE$k-ˮ 8DiOiOF)1i ߂Ž;v  @@#aGŽ;v  @@#aGŽ;GioLÍePn/h59>>khM;:4T:wPJЊ ioOrJ44pD Oph>޺_>eԐGhZ#nxCո;v  @@#aGZ@[e۶T|~h5ZPlLeFhu WԜ6,K[2UXP(Z#r)1)Q}i6y"ö9=ڭu5mpx FQQʕ 7˲Tr$)!!!&ګmjNfnɔȑ#vCqx<^m޼I[2տ_xyn9món8ތAi*&&FVB{MiÂןq]ׯ Cjuv^{U݆n9m3nF# Ӕj|H0v5 ^nWh1-Z\ ö0&MZ_Sg5;vv IDAT  @@#a -hj*IRƈ5m[IUh'o.۶իW*C%%%Zv$iaYZvv{C潡#Rϴt~١UR|SeVhM…ZᇡG]S?^I? Z=5|=#%^lUnӖթaeĨɡ->G{kx))IuWo"v٣g?nݻI^|a.qyZ3ShRF-5kn[KhcibS=ںҀc,$#Z=ƎWn4$cS2y;(9%0XHk8e3.כoG4+ s5ٚy5M acب-4 ^n^[UC/%R$<_7obyRt߱rSO|N9QJ9HQcdSS3P~OrD)k?(w]ўylUo:g6m߫^C=:EKwUR:KW6FvQ\mٰKI# . ;TXR!e(28$T'Sh_fDzPCadZ-@^KθtO)ΑOY>ݣ*@1b آ**ߌRR-VޜZP:!g`(@7nrَ(%v.*zu=9Z=qou8[_s^r}AVv9}:zUV)d_5twOQ$XfY{VӺk得S^-]$)E] Ex_=-%H3isukiSsjOr.M>T G_8hU T:甖_!I;w=[.SC ٢!\)JKTvi,IIޢڴi KRD2d"7S窸#܊:PCz'U\?\I6hkNa K~X T3CPBHoNmK|2g)U Zz˥_eɌaz)Ɠ7kϾrYfkrےbyl;i)Ð:4?§+)#_2Td>ˣ|1=4bDwEycSv7v>n**-T㐯p[I{G[T,_K5)5J*U檵Z*'vQJqmXV+#=RZBGNhx ZSѣ{VvnhWp?D*hö$MԾچz TڷqwFt=pǨS K++5Fݠ5[:xsWZ!u02IVr24PF%)Α8b&9+ؤO_mj׺ʍ'&U֦581甯pVҶmۦ{S./Vm+~bp8t] Å)=Z:݁ڿq'ĿDu<%IV>=x&EIBw<CLP'=?Kjgj]kSPJK}=KJ^.}< E4JΚ2EW]}u!v늫YUl[JQ9ڸPgLHR۔d**1Qؒ]W{Kխw'up2y0p%wW r%BeVa)J$32Eǩ8+GUW3:KrwԾB׾{Up*Kb)]t񕣔48B3.eG읋xqJqJS4m>[q yvZ#|xu?^ ݬNV:}x>^H|N_je ۣ.)J *5P{ *τ١:FdHr$)!ң?v%N@OƈWZׄ׫#Zw"ztx Ks|W3:{ZdF(9VyYEh]>ҢV>^yx#kʩ-uǺ۵qHrc6$9)IQ奪ZWq@#J( iKw6/6$B%v$TTd "*d ٲdKA-#ED֘숌S!IrFVH!w[*¯ܕK@lYROVDuO[UU뮄Q4gk1t|tgm8GynܣAӘmy9*K!OFWIW %ϑ!W m_/Ԧ?Ufu%;_iZR^495ʮy~=MaL֯BFI{>8L%$%M5q2o끧jVFC1j~I׾Sr܉I,{UPzV_V@8A#C`ZpT1׀eyq]ci4**doӷ^߶ e@6ާR-ɯr)LСEN^-H^˖x+x +{IrG(86MClI~%ŇΈVqǫo5 x7 9k}=خu?$ɡwM0hM`Duр>{|Vť:c(c% %۵|m\n|Ū𫪣_S}] ""rUR`D\~w7UaD$͙\n.E]Rt5js_`ho- T>l6f=xjӪRAY[HeS^!i*FoWEUB!Td!3Y&SZϣ_aD(.)II߂npnyNl0+Gتr:e5՟K=+HS!-)7vdWպd]RP᎐ۙuTT ԩVڵQu6wh = ER,mUZɖ!V1.CڟW%U}#:Ey*$Y4h;)]I廴mo6%]Vjuq,}vk|YuG|&p:A'~^Y"dnՂ7R 0z)՜}e$KY1[թC%[yGǪaȝĒڒ}@>[WŁb%N)V~E~e,P%@Y;NNQyx[sj/r9/^ѩSpl[v-.SnTZ|)q֖: ?жʠ8ژF US1X}}YMN[]:+]T~,L-lK1݆jd߄6ΈHՠ 6mV_mvtP.C5[xTBZ逼r+0 L!ə_}2ym)ISjHlty#W_)YnÇ*Ύ}4sVLDtVڴku:萢q*Zߝ:PCyR~#yP|J[I˿ީ"⒔S="S{Z9R踁:d7kk$gTPLt<R0g;u녯T9h/ޫG.HOwJTl4-:Wj탷)>A&k=΁yϭʿ E$ UZ`.yJ7{yMEݯmU~Ia׀rt+c^yM4 iUZ#LEĦXE%Tڰt.":vU|5n6 &ksr<^yD;Ye#JLTF4¥=*}ǡ44zF &;sK 3G_o4خh[uW_Y<[)bAfв3h9p3U9-쬺wJr~+b$9zQw5 ;v(9;ۛ _RY<=CiիV˶meB kJ~:B}vٶoh_KGb+7kp_|&MZ\CS^wտ;]9|@rճGnhyMi?fT $$orz+h_d-+Ծ/4FEhgzZt hu{ Ux zϤwg‡t} - _yKoPn-.ѽ7MPkN18,Qu,~]h9 aGŽ;@p8d[ƑbYLW6t\xN靻Vhkvk]i@aZ6jeb!C111 aDhE:x>Ž-.- 7:;v  @@#aGŽ;vbah th m\@g=jGcqT6rmQm߲hc喩F:Stla˲%Szh%.KIۧFڬ5@Qp,ژRK Hg{b^ݖEu2djԨQrݡh%W%Svn itT‡CrhtNZ[ZUKA~Op.W#=mw@ԉmwe^"]b4Q٤+^Wn+G>i0-/m][([QsK/,:qǴ컶~Z\[ GsNvSp5ڜ~mі=MݾM6u--'OmzmZ[ $6[:ZRC}R֩ϡnb`QqM}'7P^_=[mkowhKIR}4suԩ2tFI+Nql@;yiݚcN^^nF`yޚ7OμFYj/K5|kąSoA/jIՇe5BCԆڥ@4t뫫/Y 4dh9voޟl *І7}לgLԌs<-P>}|ɺ;hO7"^c۶pǝZznM4IIIJNN֤I?aCuǝwɶ+';AEW.5\צ'몯AS^G}n28V=wa՝i("H186E4aD(E5%**(&* B%0fPF@md (6}:Z}ܪyd:<_>+???q}7Xvc(VK߭"˯Fkׯ?{yۧGFF׿AB˯&\[;qPoUq|UJUi}J9kŸ}y8uksؼyz4oX2Mq'g^cC.J[nu:B_̵?@Veֽ#-,i=U?-"}9ۦՌ锓LW_jz׵g%+kM=%"IӪ;Xy: N_rDo.;nХC^zʶڿ8du:X,V鮯ė萃_O8C_wFkkO8Jv˿ӿmG:∗?}>'?ˆ벓B]uʱ:Ňȓަ+ndPb-YSrnZ IDATnR1uk}C Jo=oFG_~_%a^mvtk7ܧ/9K7|Z b֮ե][-Z{FFGZأjoE.hd6ZTNqS55wm4'9ۍI]O+'4~4L̗)+͊m*v/&Wq `vuo;/\˵;.h0i~%v?X{zxcBkb[ZSwD\.}y}t-Ǿl>頃^c]D/[9G/[O}S:cK7 ǵ~R]SOkl?p7㶕TWkkn:[$ifD= ZJn[W/?A;Ě v.G3z^.խZgo-/0zR7輿~a6$GKޣ_Z~B[,HV:ԥzhlE[z7_5_7r_D{;Xѿ?GX/[Z`+݀X^s~zNic}k1ʵ+_ЏڏGz^Ty:zu'nےZ7HRK;P]wG5VW L>^n\]u@>g͉U (To#)Wg7Rkex0Gҥz.jg?7Z?|Ç'}\_ŕkm^\a̭3vv{jFtwO]l]t{J6o[vddvsOUwB[}>Z{ziiN0Kuu/}Hk@;z{kp qmz:L.խk,Ot\mǖuucJb6 9_~陧j:[kt1k(8ڇt bl}:y{0{?w Os7C˗kHsO>[nEtPy>{s֭[A[0hKZ/i"h'擏ۈ(k`q%F6$ƦuB3r7mkj#6 VKw?`:U-{1RXJݺFZe7?~iU1i.bh;|*f:tlDݛPVbPzá RO}j1?bQYΫ[WQGfyM60 e=iac.wn:sN7 |TMŵIM/48-k&:s->`jl8bAc?jonY? ciݺu1Ynz͛uXZg1(Sb` I똳yiKlirY똮{|l>`x}gQ}95iLYa~gW߷ŋjŊsϽ4~W/`ݺuZb-:(4m7}kkcx /fXDfC\ǹg9cm25F^wBgQh|:QZ0qO+wmyiZ~罉[tSvկ;OB̢kEzSvQ(~q48am@)4ii*G|>gc7ɭt:F HҶ:ҳY 6 E 5xqL0>>VUϳittT .YBEܤꢘc͠7 6[ S_Ji$IVKیkBZ-k1΃)UuݜH@rs/wCr/iNF 2=i6Vc~PD]olǛ2m7/ߓ^r9y ܀>o^ns[#s@Z\Ư9ecT6 n_Ǜ>.MF{Ŏxd}M|ey{}]\{4=Ġ~m(ccЭ/}E_ܜ1' R7#'֕m^c|0 M/coǪXuo}DaeR5&/3 [0 Wn]:sϯmkL*E}t ~)9Ut?O<;,'|~V 7 MQY>w3M",YO~O꧎\)U}FP'f}6|-i3Սv#Q|+%IZCBd:Z-t3S u^9ujzTZnG3Xc [nmS,7O,X0( [$vc#EQk|DRs??[a^_{z6k6lA466֏$8\T76bCYcmM] IVeB;SVf͚uXN|*~Юs}ߐhOD\}Kż Momyyq.MБD,֖0/ns`״ <%#7",'~`h6lC>T̏7qizn}Soغ|Tܿ?rc.L*An@J7ùIMx[|>c0]&Y|Cg4YgqlikvK9|?R7c6M}<Y6!,u}οNZq(r\g܀h>5~aTkھ@{rAjmnj=ik{xHSN]{⦄Xc<e|gc*f=k :;&u,y>reY5 BfnB*'M?K,kښl۝7%&4}S{ek1kfZ؄~1׹yJU-r~m}XoSͿ k[ (:q#">7~s\a kzcs M~iְǘ\̀2#jDY[οN ;F:s>Sss)8Uf}|y.&Mm F,6u>gy?yQ/?5MtY6Z-nE''WH省vtv]{? aOWX̥8R=a>r~m mXxkrk)7 ||}/4}CFRJb~4qO]]D{xFţXgxkO$[anםM4}C®ice״B܋RT יTL:[imXjC"+\,nNX>?ux^^zү ~)4QkxӤVg}6)l6 uɅ8ogq#\/:#Z{yS||rA[_u^ǹgŰ7 5oh ۝ Ip~ 6%l:1{ {ubvnW`c{s }./nma5vm>vX}\nڰ6 krd7[0mX=,(:s߈0E'o׳bs^\GUy->ϋy[[X[Oso*X\rq.M|Skk?Oω6x_ k"*4!~mSgoX[ӟFhuM٦@[6i v[.o,Ե,.SRT I阉wmqkm@L5vn"%W B͚T}*&ͼ)-slmNo.|b#myvع>15llb[WŋL,Hm XLy 1c.-.7O-XQP9NZ-4y}d Zg!wmVXj~L㺮&0LMu1cMv(\u7R:|TLbPyC󶶛7߯m#@ub~1J~b}-a1'`\X>7XܘQ.`PgTJEgxuT~5:UL1bb1*Yx&Cy]m>x\GUy-U qǵ y98/nal3!_xnjb|)Mj+ {S\U,o%b"M`׵![|p5v5xhrqif,`c{b1q?ČIuF8ڿ^|3~sR)umM,k MnH5Bbi~m_9buY,j4aJr9>uKRum$D<'MƫZlo@xf61WfЖ6ljv={"vs31KrRT I6c*VR+hy[jRX*7+fkTs)7͟oijps{ 4ڿ X,Tm4~Z\jR"}ĸlΦB.7rOBXݸs_ h:I5q4Q,c#U$Vϛs\69ՀjSz<'6xԑ3U87>8Osf 2&j}\.gs|]Y̿V\B_׏1fb<5%iQӼh|<Ĝ?Ru!b:ހ(4MrYn?XŜ}|m)1\99eI-Cʔ\.ĵ:U1&OcRu^U,~5U)k߼{1n 8:݇8beU`s:ƥ1ߐqq4xn|~BLj+X֩yy|ZBn<)˗`cPÕyb~RU},:&sYFze9)|scyY,8ƹuTa4O1Uܯ9us>~KSeFݨ],gRy*~Lx̧jIb6^פr.4iSMxru1m.c>}>S5>,Hժ57isc,s11~8RT̔r9zMC[vN*I<& 7c>Uc8Vh1q h5I5bUS6z\n+D?M]xj:/hkyT.uN:5 {nR|b}7ex8Oؘusr |ʛXs:qnuNjd[ujuF>ÍT\kΑTLǥlʚ\.OŤty.^*T]9u465ΔmΩ{N)MI減\st>RR6S~52I3ki6RXUk51^6 TS{1:7.Sn]#nt\nm.5Sr\Tr. R/ oչ|.nrMnjrs/WORIjtSMjeruMUKݝsQ7psb}ӵmQY]պJ& Y:uLo6r^*cqmrq@orMuǵ1\uu6Zt\uJ&9ݞsMMqy|*Śk/暮 a6M_1VN5MU׭Mp|(IDATnM)j-ce]ߕa7M_i>'ZJǢXR:&`c9wT<:%Ucq-cUӴk10MRTnWuA.lΪz|*Ƥ|Lsdަ۴kOrjr^:@ vY]Y.JզbRx5l<ai9WL7zӤnRkr+^G7vsNfsB1\.sFz\..n鋹ײ,ϲ,/{ey>u]mjʕ$>qeY87X>xWcT(6NƘ k$6,3xh3x㸶md~?L2T"0W6xVDm _$Ylq,L,,ǾWbV'qz])8sqh48. ,""""""5<6ngsqY c|mۡP*,,ӭիW[`fqS<湒rrrXtLrrXpز,˶my^`͊?qW!YDDDDDDj븬Z۶mh(  LNN ,mĊr%|M$1hԄa˶=oܨJyy=˲,[p؊F&p8ltEli&1)))& YYٶm ɡM)X!V0<ܐPnv>g)<1v4]׵\׵MAAq]dggBj;TXMn׮)((0m[1Ʋ,+~duc)-Hh2Zd %K~Q6 &*""""""R!he1Q۶h4&%%`3Ƹx-ZV\I4eӦML4)qQ6^oIzzIII1uyq˲-./I^J6LPxNjwrڈ8eEDDDDDD$I#l&du+liǡ4Or]HaIjV#D|U(u]m=[⺮,+h241)KIoQR6d%>˲xs=tLDDDDDd`Yep+RAP(T)**2P\.!8kh*ɿ/t mcdLjٜ DX~ccuLSۓK?˲0;+,H\{$$י4H_~̝@vm G"`abW<3\5IIIu]bON|*or8\HfM6woϗ88^*$`9 Wo$ d! ]D4~߹W275znٜ͛%N&""Rc:؞Oln;oev<=w~ ?BU[5*YQ æmL;IJJ"Tz aŝS<"F\ AQ.nKdFϰc1e]dYIIA{+?<1'n{NrRu0gq~8'oUXUD[ZΖֻ 2Çwqe|jp_O`B,ByH>D ۄK;`V ŸJb\06$aYQ92/9qiשCr|u>uv("""U[OM*q2397<ݏ:RaYDD1kv%VhZ#UK0`={YzYjռysj*;))6\ɶmxn亍/pG+IiX23,u6[UEDDDDDdVvyO˲c),0-ˊx-**r4h,^kР[~}/''0`@|h,~U+Ê_[`R3Slܭ7SDDDDDD um+T mUEDDDDDdQkf&Sx(/HM탲 6\TSEDDDDDDrpj԰eMAYDDDDDD$HjGKlm3wHe۶DDDDDDDj kfcݣ,""""""GAYDDDDDD$H ٳիuQV^mfϞm Pa0(쭶*L"""""""EaaɩTfPٛT*(PXX]]%o8fg18'qI=?1GI5 39DoEDDDήR%64l0.hyù̲uvMH.A߅,+sv)}Ļ\^]7("""" 캠 x51¦-,e8fc 8幆ya5ÎyǸv2>q 'm=`y0>: bjey.V׾| э,q=p'Úl#me:*ϿW\܊RxviP0>@$(suW&N⏍YmO]Kfl|>>|:|ԏKt઴o|֚~$%Dx.}5]Z<62!CdʒB|:pM䪮 P`٘LΜ\unIå=<ȡ7ȝ=2j$xca6>]Zu;[=t]`F 5\ɗ/= ˹\ ?..ya?m&t9nYVo8f>K_,c| SޟsC8gO8o63bw5DsL!uRC3H>t9Vua2L &|G^woF0%}7 ɘJU&9{R|~ҍ <~|m9\ LwWۜI砳.I|߽+MVŲ(`X`,۶k4$}3zt.7Vs:'XN/B3nCB>^a]DVyFgVOeYcl6?g¯m8i#ɱ<囯~!Rr`y^-gHte)1݆/MS|Rӽ~/˚)3qOz֎IAI &چmGz2y/DiZg9ߍ5Qu[fD~x88崞:z)ıSݬtoJGjl3yM,""""R>Z,?fEt%|V)`~I,;y X3OУHRVAܵ+tL ذtNe͆LZW*'}MX,|vvɲzx]qoD aŚT%^1 G<C 45ۗVndʃ}huBDNm4'/] Jnw޷i+n֏Tԥ^]4Z> \ؘ5셏v +isCD/ u f¨yrΤ׍W}ߚz:]3wKzF!`NJl1LF2K/o ?'߃: ӊ S]Z뗽GyK/JnV-/|lSK+k+>:|~;uYhT2EU֓]ˊR'usKq \osgLBxzi&/4dLF-R.VnX;,y>_L>6n|&.& y ( |9xB*_ fF1WyוTNn8SZMW<m7_({= .(X?XrO' bZ)ڈ #~[EvJڴ+3Ɣ쿪;y%'\:}(+Uc<l3dM:< }_2j.o`a'ˋA`q2xyދxaM@v'W$aá>ȍ=࿟ªMY/gS+A^_rs&Td|aPHڜLO q&n_ǃ{8Ro7L ̿F>k|_FS?[f?}-{ Nsg]"q{ξmmSiaýr#$7 o\x߽~>`}"q{`Z/˧y!$Qg.s-wS~5~??e,dSNgMSbWEDDDDjSUƀٳիM^^iժYzM6YSRRH$$Yy^yuƎ`ls+$deݕHe8 """""""qEDDDDDDjh4ʢEF#][sLcnŋ{1[T]DDDDDdwPk_~ɍ7\ʕ+RosW^bOD"̘>P8صUN;?:`SbII<4!.21;ٳgSTTصUIII(jeP^~=*B'p">]?'y߹.(\p>jt+u;Glwf͚mJ:u9aYeG{ԩmѱc':uTG\yY_]ҰQ#FI.]=HP+O?Ⱥu{krdƌ_ ӧ3o6qU USɓ6uuZy+;x&M"p=pW=n/;V8MU9%_ ‹&U"D$w.e_/"""""G @PY۶C۶1жm;䓏=BxǑݎ) [ӯ__~WBĮ;xK @AAU8MUӏ\˲hۮ-^{~?q 9Ë/'rJ~<[l.2(om=^h'r2͚5cƌuT7٧I9.XRmJo6/Qꐑ8q"<3֭['LYf2twCDDDDDdGL. F_yuXb*rUתԹ3ݺu믿f<8:&w_qA)?C=t `}=AGK/e<zM| kӦZ筷aiD0\cР8~yeܹ[̞3{2@ZZx_~rw3~xzj(m۶6W|-@ǵ^54qA;.=4Ν*m0TK(IJJ'6WJunGeض]c#//E˖<V^CUVS^6Ѩ 7\Cr}J~?_҇=ӿ̦|҅!Cb."""""{=.({DQ z೵VUye$MOOq'Dy,XGHeffch֬YTkk)hvmrAU+۵cܹ,]gecLCڶeqp|An*u]ﯖ """""{%ݜy]\u]rss-PN~}Yj~-^kEA&>-}i,*RѝU曯P[SAC o/&ѭ[7u_L⦛zjl"""""R;xCufɫUp]K/C}Y|d6m*~T&~qœŞF+t֍C=;&v%Kpх hպ5Ac޼y\|E|dZlYa5V]~ҟc@JJj"""""w#rΝp\姟~<= :ԹFCeYe>8~]-ZĊ+Jb222СCbN.))||>_X&#>_QP^{v'No("Ƙ /N?\}7p#UW_M-'O? N=4ؿ0f[kk ~&vj-cnjk .!C}lRUhтd~y*y:[ YYu_>?3`͛(;aX8nՆwԉ 2tSXwVEDDDDdc i7_)3۶+L`eȠuevnݺѢE Fz`rRR2 ~v_ysϮ0(ϙ3ǎeܸq<㤤$LYy-Z ##{-|Vǎ9CYr%q 2CDDDDDDj=. Ac 7xSbso-*#?_7`3Tѥ^Fǎoh_J??xz8N:> <5inҧ[Wy?f,*hi3g.G Iŕp8'x"P^شywT0o_߁zXdI[om*1[2/@4e֬Y; 1tؑ:`Ŕ)bb}ǟp<}RmC{Iǎ曯)T n֬/ %Y~='|./"""""Z҅ F >q\K8CKΝ9ꨣg9gY-lk㙳f2'ptԩteLU=Gc-$C6jՊ-[8Ξ={y'g~:6loλְkXLuᥗ _LJb Ͱg^z~?oӦN%WMKK+B_Lbe}8 ..]y~x7;vO' (MeY4oo>0,z yXR\j_8pg*""""""axq'F|٧ Dg3];Qo8K^C8vz\6ˢx1᯸+SȮV[Dn [pB^㵝weWݏb(N-x 3 8`Z2{.N_븵WEE_}/\DDjê^.s>qK'vq""=[;oM4>M1(u;onb39,cu5s=˝{!:9,mj}?1$Z~ﯥQ?T\Y=v,9>bB!`bsFD6r'|"6O.7nd괩e#8̞\r%GؓoٞUa]\pLؘtc D|*Od > n'λ4>͊Tڜr3n>ƶ 0$hD׵h[7zX!SFΞ+zqW]TqW?>/:ޞ7)|;B|5~#m) ?lq}|~1O _ЉTS!ݛG{_3=9f~Sb;pE$2Q3"GU}(Ə{bA<~ݸ{X><?Hȗ\!)7 nG^"yg>|in 5R0W^<̘93YSO=W_MRRRbHg7F3+>pd}ykyxey8~@^y&y7-|?-~Nz,=[X5K䁼1cƽ<^G6lŮC9IFU`S&233jj\wF9s[A49ytbisar)ˣ/daλ+}Zp=i݇|.]ڲs;z '7ʷxEt徛9I\8 &2~y78*_yr&|4+ {. +Q&=yIej:u7jE-E[>oc]EdR$}7feڊ> `gk+g/Yqu0`R\zX6[\u֭a]Jl?vFg=kCşߞES 9c8:-N~40f{af?Vms>PY06RY4o/}VV}+kY>7>Em&)KiH'e3EFݬ_ea'[7)>&=7k X1g[Cא.ڥh[> -=,#wŨ/CknҮ 4m;cʄ޽{cYB%ʟOJm`C#{s ƘylSzҨD +۔ Ʋa)Ƿm)ؘ.ʡgb{!9] ayРAwܡ,"{W|}:/O]%3(yS,M_^NiN 3^fÐkWB3ާ`,R[$9.]7 YӦ]ayO.ʤiYSY,?̓jуʰW'g =#X`G׃'>(: ~8,->[΁]rI ,yr,S™иq⯦]9l%QQL~}~At=3ǴpמN˔Qo0knyOp!IZM&ysvggWOhjޅ+՞3^M. JGh.XΚ3(g¹tg<ݏ |t6FDI?ճ]ITܚ@3TaC^1)'a=1Rɷ:|4=9~l@ۊk/ k ?j% \ѝZ|1P܂jݯT/<?x4KꜸAթϒA*ײ$x _>C111"11QJ*Dh4UU nnnb\Eq4S4K.v_={bmH,qmƷ?|w̙󪬰9ONIaμ9\|98`؍l[o~8YvQ/`ɻ˒$I$I}%A% '^:(ku1Rf[HRIf6[ ΃%IbJjjIIIIݭ/2PN\\aa1e@!{fbccpwN$IY``'P,KTN$P/M2PRsϱo^fs$ݷF#^&$IGǒ/V^ד!n|W@Yn7BR=Slɒttxxx8$I-o/|)IGʒtx{{$I$ITdp,I- %I$I$I$I(K$I$I$IRuPU9brӝo+;wO$I$I$IME`æ ̝7H:vJIMeyҮm[^$I$I$IR1rBUUwL4Gm6bw>I$I(Gn]za iAݘ "{,_xl UU_||NϲQ=K""Q3g^ 4ҎUQ\Qn||%&Ob =P#9js"*(ݐ=fOv鍳YU{&uk,g Ԧ㯻k]Ɗco͂Uan=@k֋+9v2Wڗe-1<%qV cDJGr9d[G:T).sB\:.^NDG*W6Md/ф{5fP{on'Ro|ݵ#P< FupEkֲeвvkl(T!ΝΡ,<4PlZTvw^P 7tm .-"^^ŲyD jCe s1%ZlQxcWŸCw3lw|J\<^źp1v}];zrh)u_&?d{ Dn)yrXk oܓT9ɜ&'9qNؔ!hh \ֈk6zrͽ,i/ c_K#~ {/dasJ mb p(]d  c-KW$Ebүr/|)سbgs+_7 wʥyp@H&ԋǮݻ,Zݻ AρgΝԩSN{Dx=X44͟_p˱DϴY Ei~~ z,.ldSРaU嘭N /hJeodS@K' : Y+NCd?q>FdgxE#a3Z ydl`SdvT)ukwΌ[4i^3S,.GodׁSdfd+@y8U3|cIeҥU%7λƩ^>.|FAv:E&s1q m.Qq>\(6 ԣYzcadD/f8 M+؃t-%qlkZ-UM8ReҬ=uʹ\H)qDmFBWX$Q<-0Q9U9}nJ#TƱI_%㰹vU=q 󻗳\QEk+'pkH^621n3xn/1l]t i&붦I ى$o@BWEj6){JRv} WlWhH55u v޺'gֳ7.=iYU싽NpF_Z7ry$ldW R|-j+GܙLV̝)=Trܰsl}xhG&Id({PM;*e_ hdŮ1$֜ +_Ķu쏻v}ޥdBuSػ)8SSEN'ē^42f.[< i؆UJ\/cǖ}\ >')4 ]wqxw2=~Z4ePnoQ:lHl;5:fikbքWAX.qYNԔxM¥, ~5-u5ע ~ڵML6il]R߶ۖg$N%O*>x)5%}r xUnA& Вf[u&NP&mhJɬؕ%`։^ á\{ڜfMr먼kغWQj?Y:ѿ&T"*GvnY#dh)4ۂ%KQQn|1gea4qI7D'ػo/VkkqIN:g̻;"ק49!Έ[@u?9+~ӈmF.e )u?-8BУW-̝VǿG+'76lᏓ$Yc5: WCyοSz9e]{_m\3Y,M `; |t36b_N`ʾSؘRqU ytfCwK ֥_#UV 9<4<RF=/ eK}ﵧtR፩dD(2&m6l~\fE  &(L:,Yfь~A ;l] 'vy4) l;iZljt[˨!?/pR7a0SXw y61,x0󢯢`MB醥>Ze͈Qo%+:gۭL=3H۾ĸdiF4G~pb@ZONyUv͸:gç"Cg`¬ Zi6}l0.hJvu-eCDE-;8z |Id+hӣWlXm0[ Q.m,Ryo\4z+jveyo$[өQW79g֣WXL&H(CKl6l"i~ Nѫ<5CqYGfz5l̉tT]ml /0rQl[-X6k/MkzϪ{C%i\_?Ů1JF]FZ\m, /Zv"~x[$ F<2tH{|Rid/ILzV3򬚲SԔc, @ʑ l;{ F>J| .X tV,'}]1xB &,,}+HE%0RR/wf~Jj ܘ,fOBOGLCo,lF4떥CY?3z<[x1.lf,PGVߏ,(&s&ߖx̞3VPOWF? ˅qocLY(A~u*׬3<;i,| Cy^T>Y` j2P|yO? \@7$^rt[Is'/Ƒ~bIL[YϔysW(e~Vϖv)Kꮉ,ٙL/:{|3o N[Yw|߿=jYew©F[֞0sv(dgF.YDŽ|ne!@t:ѪWi2\* 59g3vZ~*tq+l2]*e&,ϠN~\s+Y/Q>C2&|Mp}H J:~ WHܓwGrYaaLS9uMEl0]̈́٣^%s&풅G0By!4re9f0Ӄ~滹0 }+$mZQӴtΜv͇S3o!^܍qo>_˄߾C=?ls#Q[ەgeO?b< j\")sf@3NM3bjśSW1qw Q_l[ uK]ysJ&.^G}H6YɊɬ _]|P|f+\#_ƏӦW],ִUL=+4]d˴9f۷d_<ҩc>y-5i$EЬ8in#0~ַKԅoOԱ87#?l/:K!|3o ƼFU[ &c ïV3z^}.1z;cđXP7p{kW6q4{RLYw;1,?hXH361mRO֑l9ӒWF \Z|ȏ3'T9Nǡ3xo4;Ƃ+I λ33e8UHfߔ)Mc^8x ?/)o M8^cw=5^f>yKfaFLeŠ LݎOKA.cRƙ+8lə֨ߙ"ޭ>᧥2G*}cD>_V0ez|ClnͧYMΠi ԅqkq`4>'Η ?e|%=K\0^~.Bwv!мK\Sqbہ,ܛDUcK*qY=g6Aܝ. 2PZV Ǔ}\:>]]ua*u;.9uCP=Bf!XyqL멘3W\\{n;́47} X4cftEG $ЈPJQN(:))ޕ}F%2P>^so2.8O3jٽg!KNI WGh ۭ){WYdee WSu"0cJb߸&,{pw__ǓV c] DzOq0j@سZq..ecݜZ=*9Ϩ u Bꖬ T;:G+ de杻SqyeaH?%qka0 TK,nfGu.]\(BP"{4]3'XBoYf~'422Ѱrj d A'nȭv3xt{u VL.H gyeNm>xy|S ۨ-\B7lDzݷ$]If+n*B)Rԩ]z $1YɜE4A~QBhظp(S&4Wˠv++1$}YJWQ{r=L*XA3c1\=Dž eg.'IFx.( o svC_%*yw ZA]@Hy 8m{µSWTN} ѦMdDlA}hU!ǺBOX-hyS&@A}p䫄v؟*mꍨ";M߹Wc#*"gWͻhciZvBZ@s`LilŸ> yW‰Pum`Ųcj竡}qMc^;g[>i'8ujMtdx.Uswhֳ|ќ(֜PQ5O*~[=SXt7 綦y|Q@*eSFqQB`|-BI78g9pnoq~ۉÜF|-<FYӥn_Bn1>2 I>.ԳsBp}@X@<5߽τ8/zoR2FɎEM`7D#z:В?zАG~CtN_E g/X8dկ80Jq3X.y{Nbd˿~9 d| 5lHÆ AO1ߝI R9D첐z Q;I%ZUfVOy]lCVhn3aI֔'q"HM}6X[a4 {t ZJ(UWDkh_"$XP:q4{ƁUVxxE6֍Z igq1>~|ewQ9e_F]hMYhNٵ K'ʬòZhfsx$#ޝAbޔ) F*wBſ((t'{e.v Nhy#U]-cGI4ƔȩCW> T.=N&P9<Fͨ!Յk_P(Sc V']YKA2VX)SZbas(a/Ӵ+!,j`8veש'J]caq$a-N\ՙQG"s?Il^{e;۵o*xW/>v+>~ P]b I6WR(_A־9{n> y[]nP^"-"x4]E:

ИzFɢyx)gcHmޛ Jwy¸#ԯHx2|@)th=գw/<"SENL;fWц@K fX\XpJ۪_`wK'8i{9"=#2jPu&;(Gc҃Q@*mDskJ`Jl_1Wq֓9ѭ'k&mƿk/{+h܉z{=ۂ){ٸ6 /@憢&s>z ۓ^<36#|pE;%Kc2h kf:-/Wuxe_St?!.9~\JhĭN''iS77C1M¦eS%| i^}&V -۴ !DbiLe(VA(8@$7(;ni'쪺(`=3gfXMT Ҟ.Xy t:дdTeJrT.HSc=3[)!7c[vY;tm>ҚKGKTcV*&~c@dtlGp vQۧVrM#u`^f͆-f.IN Gȳ-w!HR9JUdnkB!"HQU5 4 t(wwwl6ո8Sjժ :-(K9ŜlBfT4 i EG!yNiR=0vv|r*+[8 ؕH(u]>/>]s}_B{w7o ͗+7TY7;^w7;0se yr!}5I_nD7̳B†K$I7&eI$@M͚+Hq)G|@z$IwUYOśӡR$IR$I`h<-yg%Ԭ\uI$In$VHrrW= 2( >O⁙35E_"D6zredܧes$I$I$Iƒ(;: MiV(aOhVWE#LfOˁS)heeO<oTRbf2g<'bu +xq=?O~WuPbdzOB [.,_± uˑ=N/Gg?㙎Ib(6DBѺx(ic{ne#\r'ūÔ9_NQ/( aHf3,@*{=:_b}mz~-[LcƠպibvH$I$I$=`@v=/e J \ ċdzS\=Ю$rM|3RBR C:BH7'*[KFKy\I$I$IZq%v+G b<֧Fݸ+.-aŦSd`ePukt6jG Y! Ӝ"җ;xX/gVRU-S[IriZa/fn|g/g?O1+9yŊih泜8v3 kU @g<$I$I$Ir=PO;>g#A炇_(azP֯~œ 2KU;}+C+zdfO}G^j 㙀 zYbǾͧ}lT:`8?]( :q,?))f2h!c_G If.,)Ӌׇ5 zl F.j/B䇊%I$I$I# :TĈD"*U$ѨKKKSTU5,pQ]4OM|/Yy~݋!!,TTwxp~XP55cEAYSQC4NA*Ǹ9qtejke{m%ϲNmi5tU, noz^f2$I$I$ eImm"OOB\Bd szzEQj6mj\\kj҆z]gONo(s@Q %_zNrpEgK((9A %_ ""z(y릵yU(ߌV7$`y`]9u'I$IK#yQ?gsuW%;Lu?w8Ht<8t%oWX6iLӇZI.#~NӠIOsNxK]i֤)M;?-]l9~K.eܰ6GҨI$mfZt *ïlN,>OmZDҸYK2rAЮ2zT]uR31ݞkKw0)jr{z4lۓ>Ȧ3f+\'5hHOd:l7ӀhӢ%M[GS7Ձ7gj2;ƽJO1dqol깙x+7$Yg9Պ -נ)zԨ{h̞y{6h@xw|bwZ6kJ-—,ʞ$WR''?_[6lDK}ݙJ9'~]O_ߗ9k|ETYa#~LT5#PY&Q_o이^EeUL}`E҃Sҿ*Ol\zt=?W~0ҷi(7 -S`鑬3;w:Fo>d\Æ?&">;˳ur6{1Z׽ϋےy&>#)e h**2fڌ͎ر~_?{c}}!QylƮ-Gcfԍ1< L{|;Nbu,ywiom}IVKWf;qo t̻m\Cdmo1T$/Ee%"yLtƥqx_[i0f9nXj|>J r+3XqޓwM^@PQ@^g5l\O6\DŽgWJQ%<"-?v?%`7[r =W)%≠:R;ʂ9.}|0iD?0F IDAT$٭6;:;g^5 Հ8{ @$ٕcW0׫3 8^kB%8_L& \ƽMЧGW:^z-A+|2`mUt5Sėw>=ѩ`n5TOF3;@+xwptH.})>fH.\ҹ'z|K]k]E.iF}@c3w]EK{СSo;X.CǮ6)\X zxMJ ut{e`78ɍ\lr dl7cv\r>Q| I岛9%= G`{n=LQſV|xp$53`BƉ\b86Vl6jz/_@bm,VEׅ;3gep]*sCOu2 ,U:0s"#Y U ;uqK[>"=~A^-ѫ^Rސ{҆ĘK:uo-`PPVbeCfljmYKფ$5~T ^XhШ6Ysm{6MZ^^8= {Z g-?}F.V}5ػ?`%̞ܞ}S^h6/~NJLŻ <+>Ҫ#6o)+fOZϗ|~i_Tz8}/}1嬘)/ܖ(ey~[ W~ˎ͘6=#}E- @.1pOnHG&rk3G˼?eaD73w_. 8! 7 y@ s+|7{gN0e~:/oa%,5oHM_|"V,^M%/-%wh:_ɤo|j8 kcd%y-<>3ELܕL_!1 f چ xUОl\O.o@l$%0 b x̵h\}˰í(:G0u$ K3i"Ӊ],l\n6MyYr:+#^eeNp*_!Yz5 ^=oO)~ɥUnL{bY3E.6o=Uh 1/Y%%bgjUۿ-,E2Rⱑ`\6֬eo`br_0r">&>kq G4#b~:d)Yw^K0,YMeK+yim ьZӔWg2wWcliS߀3դq={SKTfmezio?>YC!iZ8PV_x3pxrQ_Iwynv#E&0\-DNDDDI_.v,Ъ׃-orUδvO] [EEzolrtK1S 9NbH(2E^ Zr]]0cϠ{,;S;X->ԏራIQhfNͷЮ KdC'.߅evY7 TEtZ0GTWZ<&cqXAD7%u$\LVNe`hjՎ`,# BFUA:5nόӢٴ>-2&0]VKd=lL^{ngm Uɯʳ/@t" 5N-ںTÕ(VjϜii 6NwcIawp9gیNӥcG: z_"fg0_0W)_~vһnm%3iv= 1smpE M o .S|*)ID_DKji-bq*TXڎ[݁&0ŶY-W&Ll)sX_g8#xȪ,PCc}Oq0KB wb!irIAl+S_!]E:@ZI♬i8!g0(,'M_@ࡴ ]>gv^Q W*V C4Rߩsؾ= x1y"5v8|dGv$,m}awL#c b${=W׵ "ؽ#$n" ߿zs1iQ$ͭ%bdp`g<3n9ՇٹF|b˕f=x ҄O-$]d92# GDٙV#Ifr2 mdFhStNf|Z4ݍ7b0 nDT,dq2SBbxlHu9#S̎nbQH(&5ԩMt66]MZ@DOç|xсx;T%|-}>!/&֑<|}[;XldKL)?kcH姱Mq|7Uw䧸|>q Uc̛S kW\.W=YiE .4';dCچA=\G޺&>+n4fw/ĝLI:E^,3HώahOKjyH >sڵf Lm>[<;1e)ILDR5V0x<ެ )Zs!88OcO0$nIOpcN}uI2ov\1s ܲ4YKiEM~.G1rE<4"v rJ+G>rG.!8LԻS.bWu1^)D(ʣ8_pq^yn0u~jn03mdۖl]4> N&Bp_J u iA>&n]NQSǧgMhL&,D_:un뉒ӹ*"B?%Шomʢ1gy4&Z;XO; *QR8b'H=aN Rxe.dɢ,Yuss\hUҮF2~CAPChPΤpc! Z9 9&~dB&?1'{<ɇ>iS%y[u:0n0IL7"zo㹩әed~:ח@P [GlPY˜u]=0cMlRu6$Csܙa*c:lӀiJ-+^3H_ .B^OXӨӠ䃤nz*Aw绱áa2קMCiybvU(JC\̌c6%ɱޢYEF'lTN*˸Edί we5G"xMՑ2g/JIOyb7gcl5KyYCUQۦ/5.1&h5z3搲~棹Le\<I<':)0Y1?e\;76Nu3 ѺOٔ%dsLj?1Xa #~qXR^Wq]ػKy64{VB[1M>0rcHO旮L2 4nQG~ew2A*kMd7_F|/xhO"4V=ٰۿ?.8Uźo2 :蹇ٗ +sso'LYnZKts ԹЧ+ſ&Fr7Ǯ9QṖVOPX8œ~X? X}<%ϼ~7n`nRȏi]1l4)cWYhؼt= U*aRWsCrOEGKQV|L󶾼 rʯLQ&d>~[۵#S5MX=:8Sr^ESZ6F3]C/o=̐?A/yZ-0_v8 Vc!eeFvD_t^quiU{.yk\'h8.1ÌI]!'l'%WGDSYF-VRgu-1fʣ4V:Ĝ+Yp+WУ>6fJVt%J!+-{ޝsEj YF31֒2ULqpUCZ҂^}S/ثۮ䒃oAO1cިU|;_-@э0ܷIj5,K3G3Wl0RgǛ9~X7,ԋ<=_tV7,G(a}WtGi|oHfFKy䝇u_QqO1&L v)Enn_HOO׬V)??_3 p8,^ 5MRFK)geFx~A6mތ^{J)RQA&omNrC:@/uqD %9 E(U DK %LHh' Ch}_eh U(ECӟDp7ieJqݷ"hZhZ _~d |5mZJ YF.{]W]W |X;]__d .T4!D)L1&S 2*\ʷqmD ?xvXd%* R5ZP( e; |"SkF>X,4ix<=118pyr„ %rʣ83 #NXi;O Үf |z(8Zò M  Qƥ)?N/ٷɗϿe]Bkn?H#@9m8]7VFr埞){{eŗQVrJͯ,ʾeBP(vP( BqBP( BP(% BP( BA eBP( BP(B(wa+ ! BP( Bqn e( ߍ%P(*0j`^P(_qP g R(V(+磐֕T(. MRC(8'Q S9ųBP(~PV( ] ŅşvHfB(P(9g*My"8h`V(… Yt)GE$ q:ՋwyL 9sq|P(sXӆT^fBx(|̙3cDzo>z$''3m4rrrXV\9]/}:Ç/0:u*ˊa6suHM.7ϬrcM1K6f}<@*)-EFRW3>P\l2 f(DdzY>rijDpGHpS d1DH0/aONe3ȥ iC#jOh\\ġc^N:fWizƁ(0X/S"4Væ 7va1$bJѲ~4^OEiZ/ \g KV#6 " c.X9lp3ϻ%1FZPJcH|;"Kbv fXu IDAT=|ҼP}I#eH@NM+E~8XQ2<@3B0S!̫0?W' nus%mP@CÕ#Y)VAuΆLF𢅊d):A=1.ÿWdt]Hà'1EY`jA_JbUQ4r. 4703(1by&tmA'g.6Ȑ]GP 9Fw⽓:l⪖6MH@иEƴ U4T=Lt' $MkIV3\u xtnros'wers$ --MRǯ+q.2(,Y|nF&ьjjfbus:{3\oK  堘>XVve~4Ax+W7dJecָ{|=ǵ (3:xe^`@AH.:-x-y| =G͕}dѳu O4չap0o+'%Xxq|>ҌUtjհQ;*M}L9Yc4o-Y =TMOǐ9<&gDa=2>5X43ݫJ!_7XAYqNw;hRgiN>yqpH> jE=`~;\+lBJ'5OIjP%\X`I,CӅd)⸘9]!4x9UsHCzwJ"zEq[ O֑&6f4IF/w8Y+:|'#0tdy(.Z#i.^fO)ӿl6Fv+ZP2D?+%Y^~ޒ8jleV8txwAmzX>Lps$%Dp3;cf9xx&uSeo9t/YqUk$Sa:)$M-\v1cGx(U" SgifXËSJV`nH&t"usgr9c`1/_o$;oyq)Il:Ód@ eE1*:;w.C a+X.i4NE0uNR "MT+9Td?9kSDr"/L4wT/Z&N*ÐiEaU4o@I/[U<',q<&sQ>nos kI|Y\@b}XjO~KU^jb)fJCDxyr娎j"V7-΄vVm;{"}"ù15}e i(oZoU |,N4kQNWI xE3J9cayƞ#>|@h\w2 ip0O+Fta5ܡ3t8,\‰ k ER[5j`޼y 0@P4+\E1gW+¼L]95t#b Y\#Fx&E/J޹N]W'[ HE# I^i? !Ѣl1kt^NXy$GUg")@P(yy$M<0zC/D*W$#D ,doucWź/˿~E xY%i!BS./)\<,ipy$fAdxD)$T*Rtr$H(q6kmĎO/)N@(tqOBOt*ӭl蠳E#59E(s xYt|Y,\\ˊhF }'R $ax}h&vPH/L% w.2e.^9PgFRZg"G,ZBkV1#G'BˍiHɐ+Bлa] >QVQ`3 %.4 g>w.a63Uo^,ShifgJ>'[a2΂zvPC5>.]b5^Y$pCL\6|NHHٟð`hS/4^Xr/G駟Xv-=5kf|7|s;s_'2 %MҬ-3;眢S \P$*;̚M|qJ q=Q! 5t4i5|.5nJdHYouVn$icH#BΆYh0*RjՐE!x >Ç3b9~Ν;{@kqy5Y>.>Hɋͬښnj\&EtyXcfX}3qvk"huQ OVf;| `ßBP511{%o>f!a6S&Fom#》MGJ\rL\BC\P(2!B/zߕ[LIl7G :5 Aú,:Y Ťk28lriȺP<-\Lbfh= Q KAhX+7NyqK0:iV!@X- f*pye&"5'u":ny+ClT; (\xh;WU>^c^]^`!hXJ-NkڈM+`k+'Lebk#077m"Bdy' i$ 3j#dk.'wz5@U,Բ/IM}|>vW=g'!h߾=g޽Re~' vMf63EG @g<& =Ņ3Ci sW0\J4Y[*5,y|rR"#L IF = re֑4 |/˷YmEԱ<(wZS^V+))-[05v"3ˑ£ GJd`)hHO N@pw2jr4kf`ؘO|h>/_Feכj3.BJIKg{Gv=|vqtdytVzpԷtya1|Z` n"h5Ow! ~ٜO6Q|6PmoSOJ]<6fmx}9Cѯ8&L;w"77Wԯ__kVՔaq8k욦EJ)3f2#< 6oGŃ/!\n߶.xժU ,93ɓ'vź, %SFм:VR$ʳ"r!CH)eX O7˫\B'x2)d) BP(?D-ªU2d[0ƪQk9H FpP(,vJc~ W( 3XQ*iiiL>9sqFN/>>v1h 7oΏ?X8;]+8/mRAOM'Q(%(| ڬ뢂])W( gy|>6/N8y?>F_?{gfW:Kꖥ, CJfJۡzm'[/F$Z>/.ο\4_8GaOo{9q1MXif_G=} ld2!l6iZGQ78( Bqs>lϟK_|K<#Ŧ[_y1x3K8_Hskn}FZYtNgDVf 0ٽwf%ԥE$hÙ;~Hsl56XE펽h^nXȖӆYMD2vFRӶ.9}{NcO6d %vY&3 zV2[Gl)L7ֳxq6wyGe,ߒڽZ%mc(-HwE"M],S;]<=DEW]zIҷؔ&533ϔݙG űqVnMAh \GwM.ꌱ{?Ŧvh !hRlhJ4111{ nA\%06~(M.X2ByT6i%uo` įԉCUB ʧtw 'N)i9o Mi&ޭ[7nZz̙8ӄPxOtax eMu~8zmű\|\} |-FW\M~f.K֬a߰nM<wx99qgLg9Jd!@4effRXXCj&7xc4`L7o^+]wE︷ojEHgrTkEWDOI۷#{TQ :ڋ IDATfbm,tJ݂L]q8#]~$5 C.M=d5bشl!,⧨H?w*=[a͓~ .R ]XkY̖qZp_#m'5 TuK&5975}6!@ :e=5Bj$XT -,\JFXVǸWo@m׬]wBԯGn'>ٹj|U'#i̬G4%%?=e7dɒ%6:_!ΥxgYѣăNNA?U+9ڪ/WY-iUe}+U}mp`EZc7i*O0٨cun;0c0?9%Wpֿ'in^݁nG?kuJ)&`лy(v fraCwS\.M^gwTW< !Ot1$}~v]qA;YM)6hM&2Hy4^YIz!FDJ'ѓV^-4]\8 f9K:ck J.-[xPA[ާkjofV,'M7"M6f} sM =v1fzsdA L I2:_sx,Z!)h?/9׉_3wnBqyoX||o*]+mȐ!|NE߾}QsyZì;tw)w}od.?V-X*ǠG@#h?3Ph²9߿tk+ MqcbBǖy3I,J}`%ˏ1{> v}߼ˇilR{"wT v8Ck $ 08G8ۧN3_ma ބeninEZiM{UXHӛ&kXvm%g+v: ї'Bâ=!-i^pcn w!~}{.BqkӔP3. &Z+:t$įqPLs2(~k)FrQ]\RQ}n+yl3-fkq / GW:Cna ;?,."^#:oDzátGMf;o :I oĉNKгX6e?uZ{#+ݓ^=i`]|K۩â9T]j4MGY`Hpw]َ=\$)]?;n,$8&\L.;9_5f!U92em6Tjjl6^RRa :NiZii;c淾UYa;/~\wuucX0M۳k׮Zz!ZYQl_'Og7o֭[{rUOꪫ΋drt|ura9i"B<}qX{:]=\.8HO=B34M֬]GJR3, WjJUMP9@M˄]>_ 7xɱcFUJ( (ʭVԩi300p8hc߾}fppmoޜ2eJ;'/RJ1nܸ:~H^^^4MӰX, EEE|uF7,B!@g<uJO4Mxjʚq˝h!B!8$Pڶmĉ_|&MVz}***T͞8q"۷B!B_?R~ZiӧO>SJKKk(++cڴiӇ_uJ#""xꩧTB!B˒CL|'=t0ضmz+tЁxR9r-[PVVau%[,>4Y\|;B_97 !ogy׸{k իW{#$R\r%$ߤ !8[<$BJ)&Nȴi  4tPPӦMoIB!BC3D4ƌŋ ]yꩧ袋xGػw$gUJJ /cƌ Y/.G}_ƍǟgZn ݻ馛i^z%VOdWޚ}y[BIlՏ=G.Op wpq&( Miw7N~v.%fF~M/ 2M6tR20 3f mZ&##MI8 hT O>IYEJ)hʘ1c\!8'$PnM=z4Æ cܹ,ZStNBB bذavn-0;HKK8p`壢ջ77x#7pX, ͼۓ7 [qvdwoPZǘHppf~c w6\ A΢xsu 雈._ xbƌMm4uŴiӆS)//Z隮YӦ/*3}jp !mj*QԢn3j(F٨gRsO"E߂{3gһO4McʕL4 oA0`ӧOgԨQ{u] SFQ)\wqK"tT@ A) Byt8fdg#M+{%y-f?LJjy`_3A@k3^m4<{)I'ws1L{a$>ũJi躎ڋ|G&+d5c?׿`Ł"lBqxxBwuf1?xW?Yeآq+/0]|~PdL 1a;:eW9Td#钻xtL)^Q?qC `/Ouu,xE˭0{k:״hy5-?rݱkV`Z:vP}1|Az]]5i$.ڕ=zp}aJ)z?=ƞݻ}r'-|,77&0rX5|sa%L4vLpc),HcGG=~}: KYakJel(31lXn] 9!ŗvtvLY<ר̴4{w{849 sǵm˅Ye\%H ݘEY0-hZcq J @_GVgm@tfmoC]KL^g"U\. Ȯ#$hƬ8EE5*<7d*cv3rbc={ca###˅ɧB7|3)n7|5.8Ç:BsIe!y-%%g7<4C GϞ(x74iaW׭_ٿKC[sem/~# PDDT0+݂f hbk=6hET${;E)￘AAxdvJֲ9t3QBfKjfX rwEtd{'A "j<lphHupt  ,r+Q]9WR\Z-XA!7?0⒒:Nttti}޳%KԪzrtwfMt<B_o! !yB)ŝw?~ת| 7C˩yZ@Û n2k*NOdD{?gӦMSVVFfFYELt4}z3s΅B3@^ !.6W^yÆK/1bĈqiҥKOO#FPU?1i@n+a m?8 |\g({Mnf ILJ+vH޷kpO'OPlmC%|: ul0 u,+ye#4&Nk@Eeߏ2B x.4^Eӈ(k歜r,12.2&MZ˳SnhBPO4&',)?|=.\s=Hv ]>%'~I[3N)ѣ 9s鸘nf||嗬]cƐ iE4OMMyYaݻu-Bureʔ)j۶m*''GTl6D3 `u:6OӴ@4M vo}~Wo&۰drt| ISqįw)S{W0Z5\.~}/ ./ٽj;fXTR0j:JKK9 ᎎ6gf)Sԩ2uBq^QJaX'..:)뾩^NEif4QZ !B!5NV<3{(\"^zF 1p\7--B!B @w>{l<ṖFY)4faѺ1,/ʯ}6B!BqHe%bf  nsHw?_Wo ݋߾w>+K9x1d  G>ȱĝYfrA~}0>ZGUwcB!B8(C)P<c3fm~ǒp-ɌXt'3/>ssL}VWyhU̧K_hlQć/Le˄SW!B!DcH|ltZ:۰0OZ˹g ~; ֑If<ֆkoG&q 64Oqb 퐾4=NB!BQi|@""9+4MC %LS4iY䔯k.ʯ!Z QQw4nA3<=b|B!BKVc/O5mEeIz $ b=kPnIO/B!BI|(= K{ #'Ƃ ?)W!B!~äurFe&dut䡯@phzU8, R`mBiJ?@5O@5T倞|+SS9 !j?>isЩS'nFt]D!B 4:JZ^`++(4Nq^8QB~޽{`&ncB!@^ !~}]~m4i§~JϞ=ٸq#le: LV޾[Qׅ s(!&%B ʕ+4ig̙?wq9f޽w'.M6 1<+ص~'K YMГr=8< LˠnD׮zk\sT2&& kP4)0扌uaO/c&7mbѢEd>iDGE1vXڶiCzz:BB|ﬧ0 .[Ɗ+jCIMM\!8g./!oפIkW|ItR+H~駹uz;3aÆ8PLCuCSJ Gi94ټQ)\ڍz[JAx'gRuW~.btܙ++V AV| R 0ǙF-OzK!8₡iJ)>:'&O)S'xg,SG^v^fkGdl}V-S Ía:>8fx|-$R(e#eŴ85{S'OaI]{Fs8gߦH\2o-:)uE+ ωO֭}Gb14iڔ+);w`ɌJ9OlӬY3Qtؑ#SVV;J!8'NjQ! iiiDGG3i$}]| 3{m.IpzZ׾%.cIf'}v ށ֚C)4Mߛx 6'`Y`-Oc]•|8 6 J7XhxڇU {5-Pݢ߯>cط3{NΑ6t՜+v$Z<Ƞ~z. ?}!άb: 1cZ3*EEE+n7hƼ-QJJA@@eeeBsIe!4M9B9r/L4d &}̻7VQ<ͽぱVUQأ QY#?|Bpɡ eGO^8b-^mOV $<&4 -$P2/]G0w.ٹY~rWJ+{=£ԪCa( [{g``yifϙSu@` %ee.1B!ĹQBF4MM&PQQ͛ի))MbzNJp+?O8%fC%a_^ ;gOB&iQn%Ԭ^EoFHX0fg@@F5 MynxUx5NǼVQ)EADD ?tSS(tEɯG(9)bsjhG$'S\TġCHIN5n$$&J,WC( !.8W]u~}17r `F^~9nw3ܸUiwܟ& `/Wp&keW:`m-(Lu0ki| #[o&abbpo~ÿPwQGbL6e4W [ x,>4E\J0K@Aj(>}!~1ՋM͛)+/̌ݠ222ύ+<<}ԩܵ EYYK.ehDOB!"%B B$̞]ݡOBboI}(܎pՐl}(:/ n$or9ƏMg:~͂h<- 7v;z2^yG=EHRkxa 8?z1$=x3[_|kfF>鸱Kt(v7⯩S/^=t_N)رc gY~z-0Kf NÇ&Uw"''BJJ wq)))!猪j2eڶmQEEE*55Uh6M/)) ðXN 4-4`4ÿ1[߰{+~,[NΝOra9i"kUunޥMU_0j 5r!z~e˖1i$8; &Mo0hРFkV\]'ZWsVJCSg޺yB!~%$PB\RѫB!uIg^B!B! B!B/( !B!^$PB!B!H,B!Bx@Y!B!"B!BEe!B!‹WGS)B!B2] Aec|B!A;Е&qmjო&6=^筪ޯރQ9TQV5!ĹTu.RFs@=B.>+Y8_u>?)uKt>0#e*W%&&Wi`W4ܘn]eufBqV PiuPʓ4@)OW+*SgN!.0b\zQe\su;JJyUk4M è=ݸ:n+ί1JKKs. ]RV-[r[ -S{}X,t]G5t^ӴZR3@u\{( !GeH|<&Sy7.PW<Ӟ?@n^7t$ٳ7>cnj _dOc_o Ê5,>A obr|boň ^ٴi3ݻwC-'WUZE|bZVOrY{ؾم%TuB"HHmG0-f/dO`7.xazJbJ36\Wa}QyWEFLb*mZ%|bU^GZ̗a>r\є"0(-c#44rf?ɆHJN".6wBqN_ TEE;v`ӦMlݺ\;Faa!iFXXoߞ.]Ю];voVBw!ؾ9ii0Mx.2䤥7t}m;3G%ؾy9ҿM999? $Nqf((}Sa"BJ w&ҿoK.Jû~,sVn&vp<5 à͆aLϠmPiM),̛K@@99ĜxB!Φ\\f̘Yt)ͻ]f7cSk_:!~K6|}^yV|:l(AAAj3 ٷ#[ˁtM dƷVƂ;9܋fcl]3%+qӦKgRGV@R\Ӻ3]G`Vv K[ؼp/Mhe0SΪ {1Bܾ(7,$s$<Άm(PH:IpJSh JSo;ؑфI(;-RXnDЬ]gxm,IfXfC85-Q{X$)rh's[}?]Dϧ-{.r#H؅61~( 7C8J$?6FiVmϦU,kBW.s֛P\\LNlhFxx8a}Om6h߮-Ǐ"$22x=faXn&٤w>JJJ :C!8$P~z^x;)TѬ1|~|A.r?_֭ܕIUTu8Vx _5zM̲\rvg-:֑S`4p@F,}^JOX.H^̾8܅CcWd~kL7{Ӊݏ­8lVE`= +rh .'$ry{"",w!6gҢSѭ&y[~dS~, Ϡ_LܷYqmcm^6=_M#Vah@trh ?xzE}WOA ^e 0n~̨Ɲ=X1rG\BP μ]j~]n_ͦ:[^=|οF!UdnF7{\&wRV o ~l\C.K ĝek7q/O)Dѫ%3(ܹwI[›vka>+K IcT4Mm֬]U)??Hv킦i89OM&*:,R}'B!Ιz~NJ˖-۷/ӧO04==VTT7Я__<-ZG|T}98 G[oʆjpЈNN!ҮivZ6'"fQ& BImECL$9gFRIk~ D[K).oMJ3D%*dp0'wEt 6( #A\Z-vfK!9̆4D[q83wf3 m֔ I?TFlDu4K(Q9BaR}dZ%b4I4O<պ⚧ӅM[jCW:~Q-i[Fzz>n#QPFg SƧh|%Pq G*1B=#ʐ\#*1~4e#,!bJMUyFv6ӉZ݅t$,ƓuYvPz:k׮c bQJͱ\.W|BsIJɷvNwc&n7~L0AJoָ䪒SbaʼnaϼSf ,lO `41r*ܹl]0m0b]xdQd@Oe k-,Ё<*1of QE7Ք;l>Aղk2=7]CaiJvD&0P1*]7ݘz3&F@UQgeNQQnN ">S?;';!nocر۫nx> V3M Y:{oܦœNS^ P ^'@bZ"3Tv8PPP@zF.\jWB! ^xQwcbb袋h׮|oQTa /p7BdeQRR;J Wb[f5 Jy}_n7n}c/?Ȁ9ZLːZoy1#iቂ\W~2 B68Z]֝wBPOez[FAVUddC.O )AyA}lH513 ʴg#KUdT)(ڠ , UH6VNhJQ^VT4fP^^nh`{^կMuk  vJd"/FB,ٻ:gUpp0rV}ǶGC'KxXIi3e֭g(kW7j :Է !89;UW77Zǎꪫ?~<͛7|WL6͛=> ?6/,$!!aįŴwP\=TU\.Wur8p(:sF6 khLp5'Źٺ0~-h*!t{`ym;ݵ{-BJkBӐe(a B)("@&*qA5%4 ˡZT~ާ- ?MD&j M[mc@i++w!!1:r a!~Qތ8ye)?̞ kGJ)b%eN40 >jIp4ͤI= xfcI?f%.qMi;2"4+nʏ #tnÕSH{S}j"##bǎHNN" 4)+/'8(M4R΍c&Y٤$c״&30%%%'h,ӫ',{ Uj ]BxG@HJJbϞ=Ңׯ_Óu-[裏#rJ:=Zk_:ZOdeߨ!? ]Xp-_NHw1MȈQO}7;vgyd}C/ht H7ؖmR1a ǚ1ф#X %Yhk!E @э^u[y揓YU hnUɓ'Oխ/OV f|ޣܻv" Hy<|oV~,La +R?ʆ2>)CtH\7s .UX|l߻מsPlc2ͷ;) >ηqqm {~?E d󺥜Ṱ|u/HR90UmKQm< $oNHsv<X9ڻekըS[ Xpc?a߾i:YÝ?{m}~菺F~.*nY?j.}O}[̞O @Z̧ʬ H~h1v,66Kny*t_UUZF_FW|;ەOwZȘ\s.CYfuE69 QQ#>eKߠ+[((Q ?WE䒈\Oj599vε}J/^:xbݶmگڬAQn`"ٓâx(q+ӟzHEfCEW$Eݘ(';_zyeg}0Sl]O|:geK(QD/DĭU.9Ʃ;{ ;T5jC,^'+6*QD%J(QD9Q<y]O}3)\od!͑u>{M|-z}O**5Ox_Íc#XD%J(QVEIKx_gKp102JmRjzI`|o2xW,SޡYmS]t]&%4memlW-^ؖ(QD%JQ,x'?g9O_ O_:PT8ZuT5.|7U0yz^C3C$g?}gsosy_;,٦:ZJQ$$1ÿ$cƟD3Ί 8̓\:m73;6vZV<»r%J(QD%~rP>lY7U :)ܹs={sg/pygC> |-R9~'sF,_4g9s~?>\>ܥD%J(QD6ʈr[=6N: \ƫ04dhr\2q*)\bS{qyx 994Frrx*.1$b"vyGbt=xM%J(Qi6-"tEöj|Z+PwO[1ݍgm @Ĵh&AzN}?n@QAغk|i푀(YVPQ̋[,S"|tY,6@j&k>!%o>{MQq3FS.]HÜs^٨ .Op읷YYD%JaCQFJH{`)B1O]21Pt o^Ț7l!fe,ګ!Q$֧eZ/@+$M1ɛ\V(ov2vHЫQ sA`f6]{[h@$ۢD(h^2X` Xv!Hd)VE> {?fU$0ү\F9i%Q.q% wob)Tku&F j+-2㩗Yn=.}ik3ju8x4g.ӨAa,\j O^7bxI.^jjd%J(QD!cGFlT v"J1)J )E}aHSBW$q+0nP"pl`,LA̷c2?|^+"%W0R{ RUU~/pA BB.jz54@[Y5583#KJ4>5m5f$edV$U+(lyl_Dދx69QR ! f"HlQT]wJ\C?~25vu+W|zZNVZSo67*3WiFz/'z:g/#azzNdzd7,aETju}My^?ç@azE' K%J(QG UHI~Nm">y( XWE$,q۪5PH {BK.fѹdcV4h*@KI_^Uќّq3¶YhgT|Fz -Jo/G 1'~wn+E{}ܟՄ9-,zȭQ*jOf΍(yq) yI'b~&'h&gVzkz 4mQ^ADNz}F+ׇgwKhR< e͌97%Q.qK⎻b߷nԩk z I86Lt6g$IHj 6do@VΎ{67$N oglٰ'?@V&(QD?zdH5bGDӐ='BzH!.`*t3 hrNUP(>G5 ]hSjty]gɿ׆B0[ }S[4l$̬E d \SQg 7l TmG ە"BZ'55P$5'(ڑ3k^&WMC~Hj:4"mHASl곕NUP[7kH~0@ fȲ=Z.Q$ɩcM},B*u*HbNw FG'ryF6?FA&:F?n_;V3i{\Cs`GH+ )25}?o?<; . %J(QďuΉTq,<[ "Hd8KV:l[镬OfQbiEAI|qq*bthm&nFB#FsDk#R#:YC=sbތntGmʧHctΚ \-cL5R,FQ1(,آ^O'tcM#]!"i!Ȩ-Ld핬wLH5//-;Gk]Lj ZrU󁈬dF4ߢdH鱻-$q">6G.iA쇉gO{X2Dߦj@\bJB:٦8ܶ ;)#(QD?ɈF5v胜*oϟJx5= Y~Ph;:gMY@E&Q$(B,[-b0վ1})V`D&w$N[|Ɖ"-KCq{#,򚢴Qm9UEMI"E.>$ڇYȽt PGb.吐){1ˈbvkmO)BǨ|eߟ(r[+ooLgiZ™ `Ml8=XՓRꊟTN$^Ua_Y2&0i|nAqǠ(ΫH\֮p.ţ7"b?Tpv ؎(@QJPf^"T]&ڽΠI$A~3gfflv8P$*˩S\ާTӔJ$z#8FWnҿ h p8ԇ6lhLffRù)RWo}{/6ty7O|+{(T}YwOmTCUٵ{֭edx7D CRj4 [Ȧeؒ&\&Y/eSyESH0S#qQ:3tl` q2D"m;!@'6VզYH4 k|FϵtM՗0'vl*q,pZ88|R= &`e'`V-m, Mc|XgbSۧrugM:#"Yo3#ZCwN\޾b5f~l SY.{ۄ7naSġ~\R8W׍\GYTYx/p;DE;v)FTi/JR[R5~uk+iM\%KTKs]~%[]cbr4XreN'Չ .3:څGN 7`ǂm-C=\إ:~3,{a 8ZgxݰQv.ī!6\-wʁ%*T .r)&''QU֭edd8z^׋N|K/$appl6zKCPP*"U dOL誽&DԛX$Dt rF\\ 7/#[#)oY3Xt҂އ̆HD<.T1c$~Jha0F '(géZI?fm[p;s{[9~)!mV5aώ,OQ0Ѽ.৉*vU2m׏suIKKЮ.}uZEM;єJ6G UA\$ j‹ m0hM_Aj=S,[_ĉ?{߻ᛏ9e`}j~ GD7w`]r~'PchFs5Ыy6nsn=o}gH/3 wỖ^0iy]Gv]ȎGQ5GYv1o| Ut,wIRϒwcj]`-G6r#3$'w?ˑSL C+r5 9h=<;jgxiLO['?ysdGxdc?/مl-]cJ -JrzC|p}x.1ffZ8q7f$`hhU董\xq=vukYz5qW N:Ŗ-[z֪U,Yf(x߁ad{(](tv1PQ$TA7w'@JXS4 HPӢUϬ@)k*" ,#*@B2;!˶UFC 8+d25<J'N_\` H$uue?n՟Mc+*FTK :&(Zg>#sƣ Ѵ(B! @8,7GQx0h"nw~\ӯK\FRο`hA_ޥlSRz3|uW!q jcfhbZ5!qʱ|p"lv;m}]~QTO ﺓ'_Z+V-6{$w;`ews3 d9>1u |N'|NͣXJS'8G_EWuyP8y\B"$HFظc=g]lǎ[q^˯prp'R3'xٗ^puq)=)SSfb4NryȎd?oX뀧ugyǶ̜g^5wGgm*:{xrg0q|7Ͽ{NVNg2485O/o tT1µ] mfy={-iScr76-R`U󓤢SvAb{{ͅT-.DIvT(;Ze8'\mT<3BڎrLhN6X9 _7] $>4nO2^0yDIKh,ȉLNLQohhTAN'el Źo}GƹsgZ=sF>N`|bj?ԫď"6ھr ?oxO<Ǩj7υ=O]G>Ǝ5ܱϼKטM#Tp3u,^Enc8=ESѬ Srzz%+β$aV` ^Ɋ; {ګW9;j<|*" ^fýJ-Nj'/cI-ݵ@3) ذj4|icҿk H2-T_F-V}]HJn[3DIOO~CU6I*)1/6$pPU֮^=;UIS^yU6m{{*˗-eժUtKT{RUN#Ȉmj]6t.oar6dMӍrV6b%y91Ds"".,Z;!v/A6eu ŲgiQئXE"hS_5U'\vhx)^R$*>Fa$6d ߣ$(cW: C-F DpN"EƓg5w׬^Dov T3ό4_yVv," o2A}la4mP+_}ӍeMm-r[# &.N @lc4k6AӔ9fm'hp:ZKZǮt2KV<iLOs]sO ǂC](B6. u=8\V˟áҠQmj+O3SiҬGfZF#j|M(8|o_dѶlG>mN|fj43y~/}ӭ}$g^Al=ו=4Bym3=44c" DK̍JB;WQ s/D[o`|||k=9n~8WHki9>5v-xf!뙷|{132]Dp)VR>j[oau]ȴk`FrN7uEB)" ."Ѱ2;|ۦ*M6k1 \A"ӕ fp~$o;Skx,+qab]4xV\)80ɲ\|m/lF`z4S*5A*uLuj)j,, 7Y:u=oM{Rb]_w,:.5Xuǁ ٶTk+XQ--^m1=ɻGpbmj󙿼TՅ Nxfvq uV^޽{Y/¯ IDATdqnSG#q@(A-MNNr_`nHGE=^#qOl$%tdj"4"}ؚ,EꎒٽPN;|¾C8 f _B^hm*/_O_bb*Q"I Nf0&ϠGEU oW©)O+j[@d2 f T 'bɈ]@4lewy{{9?9//wÈ7Xh || kWmgooJ\F@fъ5fReR#O:\fn$SIξOS^yX{&Vg>2cK4݇;.lVH{{8;5I^qN[6oW_ϺܹD*˗/OO8}4CPͮ"Nq\^~/9ȹxt08C\Xz;-ο}slv8#xgo_F3d+2<z1&Rzo:]o0X]kY,2}GXFVfYu;3P2psVT¢2}e gu7oP'ׅq]WKص 'C쩭-1:K,wذn#è*3 $$LLLxcD`%>rmw>eūxH2m+b""UVJc\HxE2l cXEb0j YZ#Q$Ks2vH$Gyb a/BV|DQOPaUm-u_0@_͛T*Xw9Ĺαn:n 14tG_V\]9BhX^;m vus{3c9y0# hl VS1Wsl ۂ鷍,q|d9lI2!'2"yP"(h X[@d\5$h&YW<qhI *M#ʭIfaK|,_0{N33***pWځԳhܾҡUЖcqPk+ "-+P o.5ӃmuZBFqO0KcJ@ jd:skIa8o&Jbzz1T}?*oU\b8u#X9[1|#Q9MIJ ]|;ԇu\hsl?M  C_3Q7zG?:ҍk,kz\7 IS]ޑ_%ﶸb6a6}66i,Grn"Bs|bUA@24{?XZ\)vìٓZDz{?RLg:A|혏!~v5K%[![xLT.1"Š+XbEoCܽsGWڃ>е/"ds￯+RpϽt(jJS v p^`lHlɅ|D"uȮ x12cżb},k_]D sd!fI(^S\t% $+Ž ^0bϧ38pU6o:~?WW[?x$o{V.kExC}bg?cL$Q@#(Z&k;AX^C@$:<j\xl㛛& *3k\LON{r8 %Q.\O?ͮ]xٻw/ϟgfF#: .d۶mܹ;w裏xI{'Գev>\mwhTF3<2<ʒEǮ@ /Mrr@_hytøO P;"K/TjԿS^+W! A uMW]|/Hjx!b<XDYJNoEo؍}|esMœ.ϱ߅k1.LnR䙃b͂VO OCST٢>BO_i62-r kB9!j)P]ȂՓP(vʣ~;]+Ȥ]L'lٍ_?Eb>&ŚMu+jVxQ4$ebA5 WR۲qX9A>+4 0y,_ǒudfV޵W='/M3vLԃye^Y6ww‡F{s`~Юh|$c"qWBn_0U !/1He"( vYdَj4PwAs֍Y!j2bKDe gNeRe̢M7 eob>||3|;ߡnc3:;vJG}*^Iw/q$jBYgp`fJ_fzsg&X0b * j 08ج"i/F|s?ʁg GHkЦV1roCZM!ϼאڍOM,qp=픔E7yq|5FXn䝏%Ji8!O_X>vB"&12@N%W 2ȉJ7(e{ aBZ~ %`͑ e.zio#ڦis}}}Z]}E\hc!"3V A\L+a 7 Q%j}\Ddx&EwN;""a:B$ v sm> jku)zfQJ#݊,:d`y#i^FK -I MM Y}j,^V*@WTR8S9r18L!Fi O{L4IO(,qۉ4dԢdF#6=Zu$Msh.^AYJ~B)9E5|n3 HEa ( ruM JL~p`>=O| ک7/r]5* )Ib`&8`B-5'T$&(HƲ$\d*+\[EaK*Ci,Җ&к"h"~(-&WD%JaSS+\1[)l#8\ ?+M_IELa$!X& Jmeiy=AEʄd+J H\ɚ@Bl.*ű's)G\r$wXHV ) ^!M=S3-*f_^TPi i>A hO3% SS6T*6mu M3-*8F0?jxHV*#[LjA8 JZ(#l1uX4.Q@6Z?Mr&y95-'i7u*Q |5 DBuG"uCa/LtIzCNi}dˁ@b h.h̀oY*߆tr:DX2" 5VJf_eZ{ԶU dٶUuUi#zԉE $$qEnXZ V ^_ pvm(CĨ5F I(Gk4E< yst U~yYzD8/#뮻x衇{ٺu+ .dtt˗/s|M^}U{ljGF~Ʊ3*M""\ Ҫ"'B$:G-qTDPxΡވxUZ\%MAՃOљKv}Ul%8`?q%J(QĭJ ;醸/Rs!!RZ|OKPùZ yʨZ4#!!"QG 2jTO"ȅߩ, $dDL !_4ef).Ov?k3D0We4$_Ija "H'@h tqYi9%1 4nen$2^}Y< JH1Ϫ~gl10{>c.Hf.`*%I` R7DkzuA'w oDXjGMf| _ټy3م#"n/Z7KK*=)Կjժޤ[ On6;W'PqDFZ*I/d;{I78,N삞NAk<߲ z6z~D[+J(QD?(Td@7&ITB ˹~S3B9o?,m^}JA>K+쇒'461BVH}+ )-4|*=6zhuRf=3gXټ gxs|m:m}.1֎=[EN[;>yթZq<$0+J+`QM9Q$&+R%L'>'tml;VmDPg}Uo* Cԣڕ5E$%kb*`5g5dȺ - _ 1mn6 ^|K_/ۯj:{֭[T*bs$Iزe cooth4lܢ8qy.ɳ~W"Bot؏6PUHZ-NQhx7Ӧt:h{Zc0sF58*\>Ǖs㴧:=+QD%J=}JN|ϑڔO##YF tGst>ZZ@ƾM@yhGm Hd템$EB\٣FT$b]!DِGSESOn{ڝkn,[z$\0sfM_ 0}1Ơu5d8Y6q-ȑ#G9eX{܈X;e`F!!ybtkA2Z8`O684C{<$ugf($eIy]s~[mt/N) lDYV^ٺ[myH)!j6.#C= R@CDTP(F6LoqS{1ӫ謖PBKRR.V4a!B/l$BTblmG#v}li1b#Vcu XjA0ZmuZjl8񧉙ŮV,+O ?@-s[g]Ktw5;Č`yo*bsU9QM01+ƚe_5V#Ղj U Dn)ʌ*3:+tÍ{@U1}Fic5LPj ՙSoO˄f2%W]xMhX~'])ǿ=1u$G=^k 1x#+& x9p:$GlvY=C8:o* RC3,$` $P? eI^3N|SY(dNջ'AΧ%v:(b-- 4=U:s1KSP71JGLN)MsIlz7v@kj+q*ӭjطm` jF+ (B 5t<(6⍿޶9&ԅC>FUlfoM_uibjU(VliрH@r=l> ]pR"as89! VĊ9QαPbnW֖Ă!_ IDATUOPVJw%P NhSm[l?tq+wVjLETUhLEjLGm|;t0RXd@_HQFYrK0b3tʽڝk30rrAhI9*Q`)YNB1 f؆3 2Œ9@MhnI~jY-@懤2@cCF[;.qLwwL\uT5(4;,U X )@TQ^S)jCjbo^Wp$I~*[ "FeduvfⰺHn*kjGM ]B|,퐄劑l(@l 8Sj{-kg8 <&$9|T*X]twVVceJw[M ~RRɦr7a3\.c~&1xm&/X sp)VP5!^b#C5[4&^ײW7;<3;^-A6x2$ȯ 5z>Gp[\JضLbb">ֿOWˉrl7'h7?b*sf3* t4h(F4RD!\N({(TԦTЭU* q kkaɁ-,kG#G9r@lOttMHȂ?l'ֈU,Ȣ 2ُHSl#w@:hD*e=Q bx+1F|ճ5{ĈI[Zl gYNb6DQ[<SQRbM%[+n5EB9twWTu"ֆsQ𤻡LscrXtD#缭܆2 }_!Nʔ8 ?IrTs}Cx!8$s.Fig& \$ih%)GZ)`EH$UԴ `Xf!i0їKqId! & Ǽ~D9BrmW_mV_3;lOidlfu̦{Fsgt F#_v 2mthpPOS#mik Qsȑ#G_DXfR ak a.%6sF, kԞ(xMAM]Z# P3o)%xF5ND%7amsB`<)ä"_>/dbcDɀH"JB@@\Q(hh(1sf's::^Fŷ JňrDSS46) ,G  .q-/)enB4k>&gr0JWmS MŦێ^T.iZ,}OjEmT_T'VI9\05G_D9B {nښhm*ӧi3ɌL3.+tW(1"GNlJF r@T= 57DkC <9rȑ#W 5!Ɓt( FR±H[(< y[$Ww5KFs 1?\{G 'Wg$6Dm EqjT/!b'I| +I!w8q((P* 6&`ķŤfΙKǜ.\eGPTv47hn*TLcCrCRw؆\,]||+:q/bSGl#JجJ5?) fp(XǏc>aC?e1X[n!sIQ_ߜn8l9 N)yŊaIP3?RvYV=Q6_bDNs|-P.D €>-—ʑ#G9r,PGFPj$64~>iw 0yvG ]ņ .6iIA:THxj$[Pr^iAD"#Be}CPOo"ӭÒ\o|+3h]1k-C#BQ.hj.֫Y2gN7svUڭjKݳ#JM E44rscrrDTP("[9D rj_zw!G%"&*؁y%>FXD&, U909I@-$᱆02"ڂPVO 1 f+fuҋ>St6 iU>7>O '9V ȑ#G9񰶻`;hXg"K0y6-j9$>?)BYF-hmqUlr/Sl4rZOw0'߼aJCEB1S~ }E45iindnvvU!TVAQDl9]EbDChy5hh.7ڞ5eE܁'v`򉧼 OyXIoo^ T~^ ˚,XL\P«$!SE"y!"^c4 P:9LȔ}=ɦ1WmVm$nSC%Li|1(6!!ֻw'(.b|7O6ŸvY,|ȉr91x9cF{+0vXZ29rȑca#iY*iMl CL~)K=7fC0` z4KdbZZŨPVԗ̘ V:҂ U![o ($*"^^R?|Ol GtAE\L1R䊍&ƙd`k Qn{ETD$&+_ssk(x/ط`,3(jROHtwx5\b!eUKk';s.x{|d÷O0͖39o$֒t ЙHYmVl0S1Kȉr9裏i1bIɓV5nL9rȱ0C!i?+qF*)6E3 ]HBfg*@R8.fzn`Za:?:K (;DX8֚M˒һ`&eMRK|M'y:_U<-rBE8PJ8V;!^99bO@s69g6d| jD׮PX|b$ PnbYH81INAm2]W80dj3v輥$K9fF}jt2Iج,}XZ Iߤ0`d]U_^ D9G9s&NJR~=K/{9dioogۭʑ_sx*jQj'X8bI ql#b"pj(wz@52CI0 :NPMo;=p*\@:-%OCB# IG$1 D.PCB,JJāte  jO@1D Q q^k&DYP˙FpDpbӫQdci +C1ӢP ._;HB =V|'Bk-Ԃ'ߊ(.d/(IeM`u#HƄBټMtV-Me@A%NH8Xzl[ .$GQPc '9rFw(DQbCpaqE[p??bv/^]&/Έ]JzS0O1s-X-l/(b޿th3ۆ}'/ZuNcl0$ر<#tuuѫ _omfbҊ+' d^=CUk?a}4MMMIO<>dRQd*OYU_g3 Mw Ana5? ;&DBz,NhӦ&$G=#b:C!g$?$% "6h )/$3b Gl/|vk 081|:B dbO0-a]fܩuLdj%\iX9ȉr9xMXgu83VktyQ52_r1w8uXWw_]% [Ԗtd1nyhic_/gWo~reN%\wl&4751ᣏ̋/ĸq>(s2kl[."twuqϽ:ɑ0ԡ8T#f ad@ L6J*5MO*_Rƿ}FLXlU@E@luB"l'!H|ql#^1ēH'CL(6 V4tlX&ubPT&&媁u2H$=G%&Dc>QEõT$Z1d-( .9ݽQ;NSgQO#'_ `˻wއMƘ1cPU&޿_?6o{y]T}1Z"{/ F\+h;|G&\{9n}N_ǕTmew`f׹𻿏eʬNC7aENc>x.V^_z {9=λ3n!·yVL\}\Nc?÷NڀVL{v.w<3f&qsѬzla!CxoRo*;pι.p0~x;جǓO>߿>-7ߜ}UG`eΑ~PDU5G'VoQgOO&zا#%xl9,~tPo&“N1|kQ5%!gҹm!&L^OXO%^ۚ3_0%LF@b ;D%ZL0q4{Ϲ,xXz5}TC9#ˇ/UkCGX[E?Y)'ϨQ=F:ٳk=[rwn1tȐJk[m-w}46~3r|f>=q *OIFW MvD"?' -Ie`k7S ʼn(812m9g q$9*#A8Ȋץؐ8J`3 KS'it8M½'NM|pc'^j6ܟ,rWl 5i!YM;N8+A1mEugl|Ob iWIJjk(x=.i>Y:ޏ 6o?)26-ȉre_/b#Xʔw^>{e{9՚ H9^X [n57/eʓWrރ|~k1f^~e;F#F0lذzB zӯomCŰo>k.B T^'0oHboʯ$o :}|뮽4]Mf')t}.KRXymX7}XrJԻ79+S/#7oE ހ\|wۃ-/`UPvBӒ-T$rl (pge- /DY}ixC>ǹ˰2zs_{5u=}6оƌl#|" bLœٳ>v,5 RQꫮ>JBWW??wRK.ȭZ:Fz{;"+LG}qȮ\p{rNQ^0ތ:dm[opEfCYg#8nPi<iy_PR~yrr~6:V~wg#Ê c 7y8> զl]l4͝=#7d Sw?ȟ|U89׿+Z}8蠃gIҋ1u0}.|ܗ1(.cb2yE]FI bf'^JDPO|7ENRkYx|odK3a_/|Ʊyf!.RlWj |2AKvhIU1W g(VLm^&B?&| :m,[c5{iY'u50Qw%w$:Z4$JzD#Wyw([r[#q-r8'\raRtѽغ}꾌FWsrV7rZG'C)L ~<7^U`cp1_y?;/sI1hx!P&?K~4*#8ګ8h=:x_p?cV$z7x+xlR;r$;,VqW2@˲Ɔݼ˹YT_w3]t3xoZA˳۰NWsmqOǓHw0a7^όfe6Bh|=ƽXjmqeSÖ"/=ώaVye8|wViZnN N? N=4~q7@Pͻj`coГ{$mOl8zrFsi'pϐT>LDƵлWK~tM_0u3PCD=^pyf"bX('NdvU01e`p"@CX>mz݇>\{_ڛ6OeLn;)aAύ^zѧO jO=zy>}emwwɚkY#GJdS@#siؓIރ|f*#ܾc< O=OCN9aLQ|g5.ZB|«1_y d|S2HL| d]e MV_.q\s! {h7|#:k9S}/ i]uꬿR&N%;ݢȳ#YoXn}V&LѥZ)O>Cv[,NK!l!Vd;exдe4R$ ;pC< m ]w_/[8嗮k7C'az1tףJdv&C?tlx<~y ,7>jX)?1--nE}6xGnʳa׾Č~"\˦^{.CT#_̢owG;ӸX 0 n:`.xf2]UEaX?0s'aNUqc6?b77o|aYt <8?7I Z܄O=Vgh2sLYnP}nO.#g|țYnYLVeූgPc.<u}K[EGL!8YkMk?e{SLrӫ6he6<^s 7|?=i$Ѱ{\b&?ͯo{e;% |].Z~B]0iʢ]O7:`FiGeڇ݂֟hl?n)VF iC2!ncb\,QږcEn 7E\k-eMs~}CRYeb楗_橧f%Α#! "B5jmm "^럵6l ,Ă Hf7٩8v >G3F'MO^eQ6ciz$wʧ k{@Q`6=%m*X mTkX2t$9dAۙ&mǷBy`M6 Q بwP+КXYF"9q$B*IzFjE:b̄*&Z_%)z h +-TȉiLD32fwrՍ҄ 3>Eaz9?G_˵<ͦ;1S'OF d`f:d4MĔLLQ?ؓ6<κߴ~|7ע6x ^\wG(N.TӇ'o̢ܞqv O5a5!:Gr*( s8^η:kdҳrNoeU:ѧrn:_>wn#bsk>~4{o=q+ن op <5"squg^sY+vg+ocEY{4EYZ >b>e9|"-b}S,̕7]́Wb ]?㯻K~=fUZ2rߟrxN6[bM6eB+qy{˲zGpʏ{Frѫx_`uD 0U?ّzf'b:\v>o:)D"Ιt)tw4€g[yOڛ=zm16d-k!ZN?~;ʌ<`<<YEٟ]|>oZg$I%+$FOֈW|^ +۩˟'*#1H#k<\=j#cRQ60 JJN:!GĨ'YV"b'!i{!pr˘Q&*fϫVOVOO-OÁeNRk(ʄs;Hބ&K:wERn ūF_Ǵ$R\0A!zNd #\; 29=9QpVcE/屇K8rס_/N?݊]_a/ڈ*/qY# yjǰPfM#0Wɟ%9J( R^uF{o?tG{&,o23dfJ;z ]\3桬򪬾&|!}ir@HEX0F?.aN}W \__Kפ8ڿu?r߹!.<șϿ{WdיK?v:i/Ƣ3x> }R Kdۻݙ9&vm7\.ȑQ=CXlpg'9{EzHP69l6:(M Da\hkD9XfeWį+0|#l#G8/c\dDⲏ9GʻvM#3bfKXvSi-<>dqo\l{m%Mqp~M4`M;u$SgrSel@a?݀#ڀ#2"9VZi%VZi`Z[9? ;j{!"xۗ_yf}pkZk MpoKYxB/HElt Il r 4$X0nmL~b"H:/yDprNJ>\Qa`/ɗfmVfb>AxxxaZ+'ה?{|d/B{["XG 3L᯹$a6B U5 j^U_ҟC}2VJN; 21xÅu߃h9F)o:ox7'ͦsL&}0c*S3|!4"*f'][;mSITO&3y V֋b^x'VC@?n~x,c~u+,ͦ,^hbn:P*L~vF߬fޫo1 \-$}N[Õ(5?/Z7]s/'-[{<Kd:w!G,CVXu$惷БdC/I"BL0DDKtvN&olN8D;$.|lJqLHZ#o)F޾ $`},T?̐!Cp.*cv2 ]#":қ9JH6Mdd$m&䤦< INœsV$lߙPP'c$<=SzsM Έcu  N@`6Ҋ10DTp!(f]^'Cq*hW'@efA*$`ӽ%@ϧ:q0/4 @=Q+wA.6&];M'=_>`d?w0KaeB!!AGh>NHZK:WWUl Ag&2éiYX; 4 5 |b;V\x0dT.Tؾ)թ\Wn8_1-s[qnȎ[Eʁe{_ޝ~=~Y^62`͝j06S@p fp?b볦Qm\5v:sG-I9n}"s}oKΑ6mX[\}.3]ca`mѢ `Ǽ⑋|ޡfGbi]C5kng__0ww,^Ktխ J,)JW+|RC)po =ӇVR kki UNܔaf͵ܴk IJȑ#7*B('mkQU|C\*B V :^+A,!F!X!mڻ:/|NCȏ&U,η'·$ǩ/O]bOU0iIuMφzvh_ҋ/PKR_CDBr1ǂ\#&.4ȉrĹXS Z\̝?1"8~8A0N@pٷw"OElo;6WًӮ#ɷf:dԟu:p=eplv lrOi9h 9_1nXŌ.yif+n=kz{ƛ_Yg_+n|v'iVןEg1I^e" Oc% q]0՟ 㠺i,^뎜ȑ#75cGĥGxOL`SU]Q uzsAJE=k`9dvOHZ?YqLj W@0ϊ'H32 "9K\* /֧̄i^@˳\s"%yhNlBTą k/E4(>X39Nd:aSymgO!)$"|%Y}&L ]J tZ={s |܋0huLѓ%!1cc'TvhL˚42/bQ,ƞDYg8+Xyk՚&$d+??{ C(F2߾LOLdZFK=XQSkeæh~⁑a" ۀS%&ٙb' (PLI?-1AF[8 JU3DF>5y?+|o]1-ǟ¨aŔx/ K'O2t(+~̪[lʠqwo`#^;Lu ~:g7/97e.ޚV-CayFhf澶 9{xk\o9tлȬS-P~Q"՟җ1xLdv}Tf`N7,}lZ[}9rȑcᆀPQbXO2QO3@lrjSA(Cl L؅"Iٌ'342; *p[ ɫ?agl/eP тPltτXx OQ7(!lئ[XZ~0 ~{9{QАTl\&sBUAWbiRC,C(#1`>?j[+Py <P1U FDU/5Ǯ7ˇ;,4K*e*X e^s%A枑~ȉ9m3UHM:GϐKrw x7[։Zv-:e7<_?&- w\vк.\zuƏkrξ?>E g2ԋL k\: nyx&+7cRoEQ'ԟqSZF9rȑkڧcPՔph@(6R#)bkF&uge9yxQ?qFȒ S&a#jkH b!֪ ^f#X`l F}'uV&8POz˙bi3?>YO(RAH_MGAk'{-WT{/ƚ*"]8PX/;7=%!.އdս,M`B16KB:!'Y[QS@E&"ur*DIbUf%3y-ȉ6-;ǿ)8n]8b7,kv:1 q9-92?G9rX2oq[0F4CAŏ4O3B'^}M[ۀfHkZt^# 1]A}$'ٸBT4kL9ȫ/<d:{Brńz"`ޔZ$31YĊ$)A *Lu/QE#$7-娒ޚL924 QDw'!^)JfJc' K0tj3j 7^gaQJ BO4_$I F燜(N>A"0,qٹz^GO$=H9M9rȱp"6{rGz"%~2XbƸSyGE rFN`w DDFRl- | !+! +l3 [zs~-1D[r `~dԪ5ܢ-0Z`SN)8=_P|2/WMw"X$-(tk"O5Pq .BA5 IDAT;$F qp$eE)NyHQ.iY%IPPDA0 Y bEEәN=sF=NτYP̞EϬ;x{fꭷ޷fzch>k,!!&VV\lV92AK'I6>D9E)RH"F ?7Brr8'xAQ5 廂=#ߒ_TAuib)F֥ϧ'#Xg%'Hj%$7y |ˬZ?b5yzJ6ݷP>crDPhsY)QN"E)RHqG'aXiD"_XpP#>Jp>$zĢbzQCk"&|Q;7G[%JjQlqkl9A(KMbuFDZ;boc,"Q;eTWpSʈLq J>yU\Ibg-w}k: kYA%Ԫ$ ;_PUח [E)RT59i1C4T4TCD$aȶnH )QN"E)RH‘A ~.FvVcVTmIVS Ud(,BL"=cwq J%qzt_?D*J$n5I$q~}vĖ}itgT9u&eƮT+NµE"Q{9kkcZTęn_#fvDV ^dS1٨-\Jhʣ)7a:a\$mw;{$v-C9#Q]v$Di"BiS*u>K66Yb,- !tm,Hr)RH"Ez! m;8BHڀ;Hc/k5r7"c$ "6O#2ҁYFd%1*qu;K⿱)y$f{ Ζ*XYǴ̠>D0&vK\ž|_\fVM&ʉkOâ%㈭ "qx >oi8%RvoK> S *@mp/&g?Lӷ %)RH"E)6RDP0tĐ=LdoeC4p`ag hfUuu9.N@2F<:"|SLp\<)S~(tE$lDL`񄅂$ru9Fw4[ŶKύ'=,ٷSLVO _k$p^L\hI;ru3"D6F\E]Ee\GE&7kq}=}y+({3)!'z2 XRlGƆ(H"E)R8G0cTle2uy«=A )qOHDz=6 ÑUGknw D.tx.%(`Z$@ΑH[ʞUbfe:#I59g$ڹ߅V#UaӸ#6gHeN j-%e ~9 &6xVqRtGQ,X,-&o=%Pue\U8{ X#[NEC2 Xq:Tu21Dt%dڱ &/-q8.4ńU-M ^*b>"EբG+#_hDoa$x "0;\o\^]"揋tl\k 'y!ꢧ.Z GU[ |$5tNƕ3n|u&?zVGg-C-ICIIkx5ȸx H30!d"a68҈r)PU ɬ~B}׌>zӵv8}UVſ׸_7vڍ.]ѵ@>랜Ͳf_zW^"~=dڪ9Y=/rUs+ae 6p GݘED[j-#nc k(fIAⲈ'"B& %Z jp'H=^חYb%s4#,& &Se|fR}r/ aK=&,b2!uP0WGy|˓#pj:cId_ҢY5;0A|MNT LH` sև|ϊeBB 9gsWBCroeNqPiD9Eq?[ojV2 Fz,&?t*WՍ-,j_Ԫ*ҌnS- \5ޜ7 ߌcS\oAhq :8VviT-S-t0'X&PxNL_ށ+.!MJ8\rd ⨟]QW`F&J 8hSQ^d)^gu!ֲ>>bd&K1u\~ w<[u 94 ;1#{0O(8"(8.eArKL:".G_悥Z?UmKuvNɁ"xѝ#NQfy^.oRGQ-&|aE]^Y7H)xw889裹뮻9spqE}4y ፯[0` l Fr_JLydC:SG@ê'%̅ 4\Oxzd[ʄN'q3/1mzz<߯_Ǩ[0hd^z.>_x_+/#jm[dO/ OI=XbZ1S.aЩa ip1^CL=jP~shZ'uܛ[%-Ѥp{ܯuiOo?S/m8lY (þCit^<ێؙ 56mX5gN4ObCC>p&<>{4˅;n,ya<78yFAPL9Wu_׎ЋR: 0gDA?k Sg0}3r 2f? fs@xȪ*D@ Y/`I.\f]uqQ *4I# mt$mu~k͉EI!="4^|8q  mK_`+};tgVٙhuא //g@lLUIqUۨ+sY![nd=T|ߵK` eynğϪmXr"E) 0w\.k/D 0٩kWHY`$գ,^ 4 % XRz2M6.aZԫ_#^jD,[Rm6>_]J/'0d~%\PRZL~Ƃeiը +Ә 2*.`I&lR~=ꕖزl@ Zu)n!b}e򖄬 *@PJÒDe2~|""to^l6[@ۜ"H!^| V3qت TqHb2@V" ?oru=h 䀾0Yȋpɡt~~l"P 8Mh{S,,h((Dj&EH đ$5AY! !36JԽ 0}EI)YNNf#&&Dy6]n4D4c?Fd [}N,D-8MA-]8Sg 6ꊢ=8(0}QGO&#ݑm>+5g7L}qa\#X`d3 Dac^Xm:y0 Pgb+-OGu!$5j>G;Oچį5H"^{4iܘ Dmڵ#[ANl[^zs&~<2% _6eqf8 (ħfQ歨K2-2lk> 8wLFMlWe{1}q;u.F2oAbD.4(M>e Y#՗|,_SEN̯1,Ki>vNʋSyI&~`Q \zU+S=ף^$иICtrfAy9F , $٢p|y+g{?ܚ2*å,^YJqR1 ɋ&!"ave ܅hlڄN_O'#OFB#Lί%$*$'k>sW*JS,W\f:Z`;6FE!pdԽЎ :T74+:j I˺Y B]Ō[7u#V\\uV%b}"Y=Nv=G}7UړCd h<`;s4nhes5anyaaA 8Qt=zsᎵKgI=i,+شe}6~\K6ɖZeD*Vju\-۾Lb9ZRxUԣ~hbPv"ņDx!ZGգU1^@rLPҐҢ8NTAI2,a-gEF2M`Aqۨ]F^"L\NEELN(+>H4._P^ObWR4z4LR*īR5"x'#gGewGU`7LUKmn!V`&"UJ jM`m#vfIsMD}Z:!U@D1Q`9W}1&_C5y"Ȯg Z;̘2c9TdEęPҹ3g7(I(ky鞙n/ڌ P$ ilHsVs1 | _;I"Elzɓ'3ydTlٳu#C]Kw#3ZF5^}vcOW-9KvF ݕ~No}r  wdI{3`~\N+NljHHs1W̐uqTU٩[/s"yv]FM#:b? v͕G .s4tz 8ts K]_Vt?h?)/:~{kQ\(ڶ^!#y[?E"ƃܜ)<0{֨'" JѺ>'J)3/c -e_9V~m;{Χ+*v׷'] K\nkGPPO,R 6G#y_K"$0ɚ`}}FD^5pDHN WpäY`u߭Gxbr5K$"bNA vHM}2W~beŵCvXyli^U{p=9ԑlvEQQkK@-&1gkUPo~UEBRC ՖTgK-%&K4g-`^uju`/W*\Ƽ&Щ@6Cw5 7fhlr>~y3>[Rfsns} P?w9;_B ϕ;ҪеObE@9}. l`Ue9v.R<`\FYňI5vb/}2kݹM)LIz.&QѦȑcU~zt|65eZUnNTEq_]h U<|.9)E 9w3LuJOʳp3)c¤kM.m^SNaM8aswT85}:rΨ|~׋j!=Y$zі͇J[%|Ȱ.[ו"Ej4g9:k @(&ݫg9ۉs!c!: a̽}QWF^7F&3?dA ǽdco1~VwT[=GnɄNc5sCrR:% }ӹZ+⺩mX˧Ōs3Rc'\0iy څ5ekr]k8Sw, AF_|?lHsވRX7p+~i̚0.xwu4@'~/ލ)oI͙Kw]83q5d!0Sߟْrqr'Y>o\<=7?x8j,侳 yE{D(mن#.M-jRtCGp\+Jf<=δ5X=G{M+qܴhG~jbp :sʇcups,Kfq9RCyy@=V5#/|gRy6SPasĸzU-N}zkJ޻Yn˙4{27Oq5!,ziсm.a9MiR.ĥ|nmY/q_r5GsY5:]wue .˻Rr)Ps *G>ħ5} J> nMwSR?qθ>$..o}h ?E7ߗ :}Ȅ`ƭj[?T4ȃO`ɐxᐖ]s6I?e"I٥3:nG:\n}3Ȳ)ܳq֎xfz=0 ]QKaNtn'<xGU6jA@6^H^z2oC!\cbؘ7hs4[ N"F_]ⷃn/D.'*c /x"ÔhP,Ѵ5M~ 9B]E.t_/}D7ePԄۗR'zҫ}hQPm~~єFE*xϨ=7lQH@@zrlϕL~rEnHQV(h5:(s_AN*xO3lYLPvݗ\VvJnV5=#gpkVL+r˘:u.(uе)֡WT,Zr<!9ZSwdDL~'b`9qW kǽ'*)e9Yh΂_/y8Mm9v^}uuج2[KlI!H6۬6_L{PY[oxEv7T)RNPB0bfO+>%d{@ hb@fڟ{x+8UL@3o)ȶ甿?~vAݹb` T"E)pȝK˅~C0  (],=CEYDԪKr,W(@. ,DXZ s:4A%C6+4ocµ,ZQdiҸ6KD`K3{ ᧄ%tInh;"SBq#pW\qUJiear*r_Wt-i + kwdu{7Wonr~\(iP*(t5KVa&MϊҰ@`2 ) ( dfpoXyزvT|,.'>^F-wa`a]MRv}J?aw;r^޹쩱t 84!NݶJ~qW(MwRW1^W|-ptdK%K" k1,,wDG\D9tQd[w5ccS؂7-gђrBjz%W`brٯ~ *N&dڟz0;:0fy*HPF 2i9J]J~WFi:Id hTR@Æp7QZ-'<~kW@  KErw xixbpiS[߇OA媑%Ee_jYY{䁀6n~߸|9䖻f :4WO BMMr` K g5[m)#2l2ڃhMBe8U*K iTaO+ȩ]%y.P#ɢфBA jҠ{=s;gH`im2kSZgן]M5zq5f;rӝ霵vPr/rnq-s- 6ZCW=p /pE7s hw6/4ԛ^zCϠq*F28SqTF {PY =@6)`c⢻犣ʐlqnYPgoFc4qvCJqYT,Oޛy{LeQ ߎ[~`EB_f и#W\UU7=nWd 4z[ι F9D? ͇ 7~#?JޚQWW+ز{4zt]lT4b:磵UԀtIqPGl.\q=ܰ(Ga =~=8 [^,NF4Ks{n[e\Z3*( Pqۛ<%T(7iA–u2y5d;=m[ky˹oXԠfdHJP] -庻}io`sDn%,RJK#| iԸ>UeP} A@@-^fY7O?g]-Y5i\ԋ]H"EYؐ?b&!Hri<ȭN^%2-Kע<#@oqpyop,/>xu%q ;W}0(dCg`%HBCywĄ,/97- !Cu#(݊1w[+=зi#/H Ap0Nt&:2Yre#99NVQ}/M_פ֦}t4tQϺ-~v@:}P b'|i''\vyi 8'۹*lvsOjہ[ 3}pvOq)PJ8Q=w {+HyEP5U-]ZS]lSμHgRq/7IF|ɏa9?A @.gg%KThRE g3k^}ڶۄ,fdrk#Үe+X1IFKX:g+uݓQhn#/}0_[߰/-7Fa3Yj/bH Zի6[*t'+>e52oםّz^._DP Vg&JVU`r|4~ Y=jƺ"^X[9EbrIMy2߆Bb'GQ5llyp\YwE rdACE0bMʿ53(.l)jɷ7і$ۊwmJ_N?-P7ABU0*srb4jP%4|[ X&-XQb6NJӑd"e@%!Bt㼂j!%)' V/ϧʧyVl۟>uINd?z"s_=16f~(]<'Ke؉ Q`6Z5ִpq'|F7r!+{ٖswoCox%lnL %4f/捃{;m*~~[6к56WAEcax1 tOF Dllē! &ڶ|;1 0$Iw:8aj$($1JU# 'ѹ'y#V05,7&~ k97^k(%vA$fUyWCz}Сj_r;ߐ䌫kcٽWO:zG^}򣣤!CG˗W2~drCK,1=Wwb]/5!iaνa`kCvҍ&tmk:isf3.F`@5 ;̊{o.tc?[S.Rgy_>5?-w6-IFR_Gټ?^z K0@erj^X_.YŢV\|OSi\~CYAcV^]-M$u/+GD*Bl6;Y):Q3Tx >x`TV6g39[nlJ1E$u$rnQJwCQyֱLg9_XwB 4N"V|?w9d'p0b "Ѩ2'KBֿ7#â '_e&ikC"(C#hq8}h"E ~A@·qCϰH@ v:)S ȸ{K W៍[^\'%5(=_T'"J&O0=Ijav$dˮq}+@QwBr'A IDAT(_6hY j V/%Z&Ng©j4IdfmNf]g:}U%Yʿ $UR7*KVcC %)2Zu?VVW9rQ:$T#¾g7e)RD$W>xR ،#] L ȯK#E^^"T#F*pFmF&_UQK79n%4j.kUgkV7y,?P3E\yˏ:HDtBE ϧrӽ)Rl{)R#B2"ρmeD9N8?'6⍂ O£x]# ?% /GsuAL$MzZy}Iͺk/dt@yPGlO ø_]+=8_iTMw<_?=f5wsG:N"E$uqn*$t%U%۹o BĂDjU7]y^V-_|,}kԭN"E;[*lS[zP^dxs8Ϊ0ݢyFW\j-N VbW˳((' Jeޜg&ɽчB6̙3gM30J9"z\]?P/h۹,i@)5QQtT.pD4}Hi0iYEzӣѝt26,z5 h6J] ˕hKPxڄM# İA Zr |#FX/:p# W'\3 6 r1b_tntnP|طFJ RE;"jW|*`ɟo4jj d[i]}vwe2~d`oY,Fl `Xk 8/chׇI r$YӺt~Jq_Ik+]L$1~>U>y ~vTʮLgP u"nw[I kK:4Kb5?"BYC`1]z  b tr)'}vaP 7e ՉXVݨ&h!)p($[;nܱ"(B@Z.;S MhjE(cӡY 6 NUHnm735TYAY54ւ@`$h:9ɢ!Ė϶!R_OD˃XUPUd61Ղ^qFvUDǚqrHb#>~+~b#V+禪%/ ׬ůKߧ`fmcG6޽wu#oO&Y8=U4r.Nj>y4g+?"@󪿣/nleK{ʧv xM'8| xm\46~'d6=uo'yy߸lת͆ukXf5`lV,wea_U~9ܼu[8x:5F `)iu2 <|, ؊)׵ :XwL,% {6{{bFΨ) =74˵~ϺnKɪה?W+2qܛL\z?W ݉/aJL" IU $i"!N[*z ( rh&CB&rqS8\ࡌʻT(AwDmfnÁF…H5}3ڞy|S^߸󊞧#罬!@x yLD9 I ;%>o-CK^߸;-@|Iwl]wyS]Q:+&>٭~eKbC/Ã#od7XqYߩ}h۳*dp/mаTpN#z~rNTN|=${|A|/-hw>~owNѠI =@(bE/(!q?lo\s3 1(eauѷa)˦NeIGՖrg{7 2+Ez\1W3bz gji|v'<?OUNzVGn(˛95obk900KhvusX$sn;ϢI|Jcgܤ * h,+cew3}}Ôħ+e]i5Z 䀳ӽYH.W'N/~dh\xF{f_[yv:i h$>vۙ>&Ôw汦2M^ȩg'(dɛw2y4lHPmAzphInj*f: Ρs\^f.]MECx; C!`Pz |znm9e,^-v|ϭ;0>:~]1+κ'yrˆQz0"/οY1JK^Qo_WC#@ܠ[*/9eD{YL8 a{SフpVNz.\ 9Ļk78銗iP'[ʳBs縩/bPe:sH*u[> >g$rc, fS2$ccFl,KyիT`㜴aB1Nчa?o왍K#Z*Sn-yT͌b_'}{I)W⌱?2pme+I6m 4hv_bן}3-S݆^^SyƁLS%$$z]?Y_YԘ=jGN-kL\JeoS󸻸[gSW׻q/rcc<9 Yfd3Q4)OLqF;:]svc&s0AѬ L+/y1&qb9 G"j]ٚ'v,A 23}zO-); =;9·`~ ʆOem]Xv4F a4 u[e^j0sU c|B|tX,la}; J94N^op'p7Ȯ25<2n|ToҁμsjJf@/{pѣI.ݻg_Kdn!jq,ذeQ}@IP1[ʠgwsS:#e? tq-'j4=t!}ymg;{Q/ _ az[t{P?6~t޴m:o =^7ӯ4}ux ц>Gv@S:hŔ/P# ET?&B=iS>*_)xؽ]-i c0Fm80%<2c<|D0'tlou=ru1G(T"2nסiYrgpe% J([Ǫs-bJ{ٳm' F, K3և IRD.nt$ETX_PvK:U'Oi/'$Z&'b>ZszTtg&yWyuDSZnBpAe o%siA׷Xo4x}f$hJܥ4/1#C?}k8czv%Cǘ={$j:vG6!#3~;եz}ˋm6Yi;ROG1F>&7 fbQ5J>_'ݬ3O[(bOLfc1S=Kț1:LȺf38gҫS#Ld{Sv#<捿9=Ңo&/?ngMjac'Ȯ:ۛaT2k[/P;=֡ +RVLY~\L~/"i '@6vU?+߳eIR"iQPq &:cɩ!Q&j6TGȋ^`y넍l-XFd&urLZ_@?j~9/?_ؙoongQ1*W>L.5ky_j֮1TYy5iX;rKԡV~^[@*6TOߵGVyxը{֓ǺՅ"F)Ҫ@ 0Q3vD$}#Yٕ),ؒjx=$e&Ár9dSQ;M[Yh.kx^k$|"AdzhYtϜ]m1W7jcQ`te{w lY]PWj5s11w\{[ ޺:S5ipm\|l+2"/:"̪T˭MH[jsY[ P]S+a-i "JY]R֬\Cڵ0mحC /}6ެ*tl'GJ~~=@M"z7EP,O$љ_*VkYBb][ZԨ5+`g;M`JT˭LzM|Ǻ"!uI-7Tzl9ˏkB(e&hrHD͚W_1{EʑKF"=1Vpx.gWZ ɤxt#mn7n7)A FJ0,v4#%Axہ7q~.,_F hּ-xngiOԣuoX>1h9]8.g=i瀞+ DH6h^mt=ި'X.傭LWaWOzeTQ#5fzQXb鬀ࣕ7 ~6 t"F<"$]NP|`[m=@d˥a*.أi#e`Y$Й``{7 cWo>/fUv:vٕE_}͚9mZ|?s6]:ӡ2q^}UxzL, ?ü4[6Omw_a{g\S_oM?yN#|m}#nIAuߨݎ. yYڞ琣~ޜ-rߓ>`J7~7,ZVai2}*~I.$</^֯KRejf{E̚M&5 ?7eɦ>)zf.XH`y,_FmEC_Y[ROxUѾFz"6CGc>By_MOrn$D۳jdeSduCϠcwp[%j7e٬Y+|a%a[ 6L)]߾q;w{GCz&-=bO`}$ů<'ɽ1Yvo8ɪAJװlJM[~!u^>߮! H}H IDAT[0U+?!{_1gXj%ɲRׯc%dWLفKk)eeqA$2M[<H#VJ5 d is <..yξ`v0S}}8P$sҵ81t0.4`oh~rmyyx$#Ş ۇI|ߦs:+ũq9&#[6/T%Ǿ LC8@p qn-mp$ 2)ZV/ #No^MamC'ow;,j TG7#H"U}:ή\eaUw\Cߋgx^a$Sv۳ J1baӰa5*v2ם>+qp jwLGS1+kr;@ϧssI_y>"S`m_ WˤkXzZt>R8RHī7uw{@PHo5[ .ض' $LE1OܔN},H?%YV $fNgy_ITx"A;qAR 2ȩݒ.:13y]t(+xU8YKz =ߨN*-k/~df^ǵ{g tY'ǔ;N?7̪Eryͨ 6{]v=㮠4>3FG w.#81#yqM);8ЃLgaI V=:ntd-w0Ԭ]mu7ìHиOGO9DdžZ*gPagP.]z6 4WPAW/b(O[bo`LOYNӝGλӡd4ڃwŘytƣQӆ{s&_JyΧF.^L222諹!447iZлCcWB,):\_/+[-Iz4nֈuoϬ5]ZiS?ШPf❚\X෪S)HҲRJ$%%Ŕdd0$yÀi\E<#TxjԅJ99󔣩Z&^c 춉$$Evye,PQlư'G6vֺv0ՄN'@Cr^sp7c` glx70dx׈ V%zGϝG+ܮpx)=G"Sgz1vh̖xpZUO.,]汾Y/UJٰ ]V4?rF4ܓ~G\'/¾ 4\hW^AoS$o:}{ucGqx~UQ-pGݓ>Ȼfo_EC3o/z '~K%$7oљǒ[W=$~|@yK }G>=YQ‚pڡ]ιGڶ]7=u5vΦ?x C50m>To]ڮHm+\ c|"\<<;StaZ1bĈw<޼ĎA@I+ZBZ%mAQHKʃe*9WRV|c2!@ҒdP2I(DYJmP$Y`%AB_^wJ . 7m( \{VZ-֕{p5g|anzH_ĠHѣܹs͊+L^^iѢYb|Ϭ\rfiiiy^&"/>5=3Ν:ml~"$>Kz c?G3 >I_=*^aIy?#ME/n|_obnK&)[YY?ݺ}jan㼵pO ߧqۨz0Cx\]㧷1+DkǴ&aKfM Hl!W+$eO?ېa EySZR@Iqɲ"JJ (++IZ4"'+PbXϞBDA: M (I1v4ހ F[zHBBB#`:ygƩwj#%[O0VVf-Nw{] LpCQ+Xd I&RPN) gAisBzUbjb ԥS-)u>F]Ī*K&TBlsAѾlS\{`(K$ыߨ I"#,2221cnGzcc|233K J=+R_RR[pBVԭ[Wڵk'GN-;` e4*!*F'[&LĖPCj}XjEXxΘǢk 'чE2=oDJ¿n ږ6cCF bl{`yIX1Q#_$o91b0㏀{E%X]ݡRdR@|. J1t $8uarPv- l` u9۠FK|\-Uz-6QCڌ]Y- [xvm( r6Ѐ慚bGT D3pKhkhyGD$v~ ZKS|7]S]yAɯMt;?ipy8Wk#w8C[ʸM!8H F1&e쉠Yn1bˣylLj#VuE[)eH:@ILec(t𿽡 S&ꙴ䮜r>&c1X.ܤHW>ш0M zQOr> 0*cķU0 aAsF2D&L{UD,P*^Rh*FDH],aV0-lcG9Fyо6O[CsiZ]?#F15خWj, c dLj݉NN' 0~. IPamNRg\2uԺDzPvzmF@<;MUN kwi14ئ:݁S@5D fXIQ`l\ٰR*BgBs }ʉwe ewaneTkPt ʀA2V56s#ZB= ߷Ӫ!Rbȩ=sd^IU&%@z]CK( I- @aa .2wy xxC]X"#`Ir&زD+Ռd"!'0\tpԳHҌ{RCKhidGwrAK Z))A6 tp6#kLrHSuuŒ6\ޞ4]TO]RE;jR%6cooD9F[g>p>9 &V3mCc?B{1bk4] e(C4nnxbVۍ#=.gKum%p$"ԁ+?x9֗~ւǪMevX4\s 5kJU `ΰ4 Fo*eI(12y6@2HoX@1nfBq@ DW֮hjCЕ  wQ[\(A.O%(j46(us'ǂd8S*2(OkLm4VG`H_ĭ ҖO=P~u1vD}Cza8IV#Wak~ <ƾB+\ ;zw}r7喕Lz:s{)2m:C?3zڶ@8|xyZMp㙇ѷtG]p?s.&1bĈ#ƶzz ĨǹD FJ 񶠜 z%-iulĒ{J >zAyk 3AHZjѺӇ " Fc?业i[+AF0Fk $e6+ಎBI& > ^f#6=MQVҧUDGM2aEӨ]gVNQdիgNW {xP+lkyYԶ{ԣ:pHt)KJ;e,I"vGAC!H+Fm۾=1v|-+FrI2%kpyC.EF~ +ycEvo91b/GnA12I- 6Ғ? J4w-(rxc_FKA-]6敤Y;}'QI!JPp4$ufA4<`Ptɂ6;'n Tu)C01u}谱D[wa(@QLc($:󯌾0\wޑCfW-j;4jPUdE.v1w#^~3|Pg$s'όhhD)\u'~%hґ/aĀdd9~-88K f'>ZDdRsw%7:n A~ֹ5wNfM5Pmgt H5|q\<Wx㥬 v-\_nDѵAԂ01!#0 $[\+q1P\\LbL.&8RQlDӦ\5ZpSWmzL$ qv1WG-D#6  9hS !)eNzju55El-bb: =63Tr-z ![Հ1 ?i-[ P nc@3Z!h>jSh RAXl_EWGuck2յ ?ހ]`AW3`lmSM. - ~ _HY">O[cɡx;r^OIcc޺iW+}<'vƎnӻo}pI|8jޛ:=ϧ{L|w%̘=٭rb)v߃7"k28i^YBG81aG~<*;DeyyI>v=m8Nyf1|=5UEu=?T ><>˞,|ĭC'~μ[=JA{YDr }3؞sGA\g1b_']xz#kI@IQK~d Ga*p^"Ephr&:EC*mEE$_De G1V{J5#Kfl5[JPQ;"e6[ F'$J|XlDe$F`dy! +w{0A?,v8"SJލ%V1&JTM]M`)4^T*+B/$noUgQhUwjۦzP?xh#>`J@ 9o~z;L&2QkM WrJhe3xxX >ۗQhMf"}_TgTjٛ2uJ۟>ѭ`'W_6xӮ@q92{]$2;AͳLvܞ?"H$H?dӠ}wvS>~7%dٿJgOeچR'j&Tkw<'Uʌi LC9edd֦qʛo1bĈ#KtHPZMqK;68- آ!-weU=w16X=IP +z!H)9-imfK %=pS5%zAJ-R,J]mDZm0+B#tKgc챱-%bmfkwV IDATyf@Lc]y%=rUɠJ:o֑/< P>.>Qya팷,}:dBnVYS*g'xq$볐G×Q=Tz5(ذL 1jϚ2g鳗qSqs3m*^A5}J#jr*%02Kd9e,W^E^pąj[?6ojQVx9)[uB2]EDB3ԯOA;W%|ǂ<}2%0UZs|_{fIլMyr. S"{)*heA#AXRi{h /zԻ,@$@Ai( 5F7FpFMU4L}Wi]yZ=%[%ZN|( WǁbӺ{Kr-Uծ8"$Os򃴚(/ҩ=zڬy-E΄cB]B==ls |VM`RRbYQܴxcLJ$SR\LiIRo#E2邑mKw7/mϞkhp|>2\yWiiO}3팷~&obo f19_b1ykƚZ'I&-e+]!1\s,+x͏,\5b3kM))k OYtkcH5!RTtߛyo?S,Eo/a>Ou$ysͣfwN1bĈ7]h HmtuƤ-tT0"yߝo^̈=Ԝ6 z%iyنa%R 7h8ԤQBXPFcդ'Jp7-cpnUаn~'R]!? »w~"Q,K(KzŨC=k2g lΠy̝2~J Lֽ8QӦB̩|dz2G @ WKuՋ`n w1GVW&Gp n&}h1Z~, م  _}¯ O%$n 7w@v] +oOĕe㎥h(]A憱Zڜ>թxP1bĈQƀ1:x (>j+:_yFS~x57$<}qG6s5+V0yyyEfŊ^VVV"??}?rʙY@yUD/s|,' b0ܩ&6'c?B4}t}ع-Tʊ%tu1b~_7kJFFD"eg4)OTu0' ȍ=r?uEAPeAcE(ȍ x0*ȩ 0st#"}gުʌ~|*- }K[%߷vɌ݅wubDQ{GLIA؜i ODd46  ϭVKa@R f:wA*Q)3Y볉8+ 6RuWEE,]|Zx"">v 8qW`6aPpXg2m@Dvm'v;!.Nj)_kQAEeimmL\E3|Jeo#E)$$즆_*q-*-Cg{R -JJ(Kʮ=V#:Dd,L)K/^_E1cR___kʔ)顇q)StM7O?C3叆$7hРA/anD$gv$ $Zc@ TJly4j>IUsSPIuC9yq֘4na^4׊T&; ȤOc #G5`Ϸ`1f[a|ķ^0"S*=&USeꌡ dՕz42*PTiQ{:M&[-h #.^bSU݀AHMk+[zFva{״;dt)546hr ^Vxg8y[}N8&MԖޠA ^B )ۄV6B ݶJ-XU8@k~D:1jld}:*[<]el*=[lU  E _ճRjuiLmv/fQT V-."SbSC^E&V3m>)$E'XLjrVP3xEhWeTk7L'Dn9pbT߉\~>z$#hz֠n?x{"'dZ0;CseBAV7_ؔn*HAJM -ܠAz=G?&lҖ~s=~l4hРAuY@^@Ò&(JkW%V Ax@#41n@i jMG].$Ch ^$DW$Øɠ\52PӴ`#{+6l ؄gTASJĊ(͎Ei2y,W# x1W?A]FxL49Ĺrάxz0{5Dy>gQ$v.f7B]$ȱT5Q&Y*ם$V^ tIlJ @C4h^!Bk}4I`^.|KGƬ ).c>Y ݰ󡿽_ly\FvvҁCNȚ69+8Hk Ws %i! +l9IB83V4k!QռK-|Uv,e?3ӬJ;0ԄtvYfu'P΃u[!Blk1of,e6+B,~CSڲ ,!\|! 4xYjwD,gb纏g~ E:km=xn P?$zq̱gHr͝7=lǔ! mc`-v-Ga[Nz~p m?d{q'[xcyyh"yQ6tb .?wEQUrTk/^Ɲ X7\ z룓CGJ-/VBQuwmtH5P|Rl![j +. R[ѐo) e}DIHv[NS)qjfԟ/Qƣm2؈cJUGmLY|oK3 U%Q,PAjxnMF1n&ob?-ZĹBwq&^yZv_9d>$U\!s͙=ns7HNxJ>xoS2zzp{&r9ͽ3'^wc=O_ɬ9?“g]v ={;ܭ{Υ 'q]˗==v݅釜E#3CΎϻϺ9{3ܝ]<>{-,Xq,_?4{=A'LJo|#u_ώ;^o~3G#SNW3grÍ7393\C+%39pG?ʓO=թ<\ܷF0jHvi'Zy3A@ Kě,GojXZ;b'1=y#YX@gLg LOW ]쏨H}T\l3&4uǧR|J"GPÞ3u7ϰlUVsoGhg|?ϗ'r3x*ϣb=vgݏ%6[foفrg?ȉ]܋.=TnT~Ӯ㽫3V~۩x+`E+^~7/Ww}Kw߉SNǽo#᲏/Z9+cs+Wކ ̟?'xy;v뭙 VJ$Uj;0֙:EqO~1c2yrgv֡",K 6U¦x j(,/q7P뮷w;EQ00ñ+.|; FOfw/Î X Lb~u;b8b]kn2eNUFVE,\o疇_z=S罇r[ْ#:u6; a.q[w6a\#oU~5{) 7=N=׭^ppw.+Eaqo/"juflWuR¯}ٳg300@?Gqm!^=p#GdixG3rve F4K(QHE qr#$z3vLmpG޺@E^HkHOd uY"N|EH:)M*>89OswFNח+x0bn|VU( UU9WDZA+^AKG)î&3mup6<#̈́ΈI"Y1JB oC,Ϫp]mHuSvn+:+-O85Prg&$SG4*_cXXA& ((h ߅ݓ["wk{>z)t)Zva pqDZV[O|ofƌ̜9Bt?v:t" 7uCńL+K{6OO)Ƴ5I=ɣ*#k2E<5I&k^:U y0)JFeNUD` a.&v0Y:eTv.@ZQa4 C@Ã@A$S6IO.1^X\KX;Y1>Krj! 4xc㪫OCm#)% j^^WHQ5å+R-}oၩZ]˦0a=mߓ&iP '.Q۳?RaAj~r"'Anݑ,32X}ՙ8q"oY{;3lU84aSHKwC1RXd#^XAՈ_yΏ3+L%TܸbaG(ĈsAC0j# 1Zhq9 ΍c?wNm+_5fmRJ9i0'6eW {&>&hEԀ0R;zQhg Y]qCI*Tm=4=g! ̨OvęوcWTncTh V7gUhZDJː%Bgb8{E  ?Tտ4X5x≬chZ<#~"Sr'ïb{{?h+MOC?/lTB5;tɣyPn0ݧ[eG*bOrojpw2ksg ^t [2/z{Bt ,gケя~Ă osƎÜ9swՠ (J ¢}V-ɂD" IDAT P~c|rJ#U4%H9q^ T~ q4fj|ReI}F ,jy(X܎4y 4yBB0)4{UH ӫLoL啵}WYJ4"h>ĭU+l9-v'Z;Vw[iF|b3{eԅ.߇F]v ;bWmsşcWb]3Xs׽^2md^ͻp*Kx.Gq uz\|6s381~f%m?^/ɯ܋,j5n]iNٖwws?fp̅_{Á-^:ʢpMRb|L4mݖ{fNcCT\l  )A 8rU^GмHWj)W#בR5| ){EdI >T>6kIu_"Z妏1Hl1r%E[r>?׊[0i7`'}6@nH ..d۳WQLH͋eY &A&b^@e{*W7G?cov}CVoYkiV7/Thi 1K\Z#Ih6pˬYdܹpB` dܹEOOO[G,bS \{r17av4Ïz'[n _ϜnܙE;[JmkZm?gn^'oy >(mY[{uYzIIӮ4h𲄪r~c\ef##D}qgH-[¢OxS,Y/a/e`eKeu3 P1F?ib$pժ-Fy UU IAkQP/&1W,JG(*kQd[Le-Vk -T 1eLRQ3#vla׉g6B/^ HwT&' Zh. 髵7to$SGP=[nP.סۖnP5PzVqkg0=QdAX13QN?VOg"L[E&4Q}#娭KJ_V#:Dd,L)K/^_E1cR___kʔ)顇q)StM7O?=hn7he A$|}o|c^! 4hb HQP]HEQv1$}IJWo,SFD{azLfSX˞5b*$՞j~VAQM .hQh0EsUpi4%Pz%XerFf} Fmd'+%G yOSQĄMv B0cӛz5mZ@#OwTI2%m4'uܚ^b"LO5|,`:ӯHšbLPIP߃Gy5%E2-)h[OeLGKMn'  4xYaҤI|3LnРA/qyGnx24*R?E9 ]y!T +Bh[-7} F|8Y52T[A`BE$,7 =K,ǵ!PX^3匰Bhn[d+#D{[W6@ۛTA\m͹aAC ;7]A 4h`HeIQ4W–~DER͝PJr01.byГbR b.gKd Zxw@2$1 F#* >[mQ [<  LLQ#ȵ`t HU ThZL[b-.Vm0~7 B7~1T6j%Q77^@hJ$QV/;MIL T̪'4z{3$Q*kCTb=[ )c'jU1&6 "r2^[ T:SiРA 4XUREх*ȲADXGJKR( .&J/FFT8aK$G#nREZHJM:3=K Y2aUW L[1s]8BCmZ SH)x40sR.cx" xL<)EG1,^s:FD4lE[RE]m<3Jrqv7A]+F\;UIYPMMK_R#3dR vmƙˀiGju"_ i)ٹ0! 4hРA ^P%Eэt<l#pWDzZ:zN;zA|P1q+TuǁB(v_y$`ݪއltQ Ki'(lkܹ]cVSX`-\Ww]>B%RB (7hРA 4xCޣ\]6Zl1/`[- ζB&Rm @B\,¬"bxG ĪNdȫ=8i%:hKd+B ANٱrd1Q_UG9vߜWDh#.6i$<PW,P 1sIEΪ}}_H3YV@K|e%V`>C}r%`+'(&eVuJ O[=ʟnWo5bj?)-A5yl5lV<|Lh 4hРsP]]=]8SB3$1jd7IyѰ:䧶%~dλ&C H)>^4TT$w1,}&#%F,vU]_3O yD @@9a1){j 8FQ\ 1v iWdDIYF {9Voq`vM[ഭBIvGQҏz"j3jT};Q^%ԦzxËMn7nV^M6zl*QcUY]Q55}֬3k{zjqxi`>"(^[yQhQogr,X0H4hРA <[e&JhX8;]IBI^{fI@dHW])Ĵv^?UBW{%P#rV/l#!)XV>0uM.PҍyP|2+elsfpHlU)m$$W9gFQk+{9DvP[luU$ -տMŰ(OYs y_=Ǝۙe 𣏰Zkwf5hРA 6M()˒XqʣP".ŷD28;քE| $ ʪo@ cϫ8fW+Q.thh UrfH@)bs1$e*N1q)AЌ)\EdSVWGNESw223BmDme`;tyHVPnYS&j4ysՕeg"GQy6oS4^,k6#`+zI{B&\O- _wң ,@[Pm1\V F^s/147hРA "GP6zl+wQ?BK5~`=tHFqL7$@r*IU b8RDhE {5Rr`UsMm &?#oZ\=^@q#9T6bC_@`~n))܋ˈf) Uv<qiẅ́\0ٖfvj$'MHo\+VO̘ڈnT kf͎*c+넺 8Je?5rN=*3AzRYÈa'`٠A 4hРPe)ʎWEae,]:Qh_wmo=uO:ND:'(NXm)0v2O$xA\ۓ eLv2!DR'آPhh-*^w>g}/AqbjE=]LVt ehNg|: 2:ѐ v#cܸU/+v&^*>Q";a;U'hp&-Xm<nU>Wnqo˫ZXlZz5[7tYYOqW;|WyB4hРA 4x6B ~]v@Q@%; .e#l7':Qao"4e (6礽o@Ȫڨ]/7U/$ A4읳-bc@$Q uтSrܶ߂ƪɊ!>B-Wb S+epG[P3ь򎔧 LS0Ks*bSХ&%q6s9̋:AYs?#V}/073%{Zg][A V4YNJyJ4*Pա.(kAJ&#`]QPga>fW_?l4Z=4(-BderJ6%1bZT}H6l8u[R]/@XhVP-/xxKJJ-rZJgOF<#n9`q҄U ArCj5Zh"-(fk+ɎgVFM![NHRWVspU^:iҲ |0ԇj͏BC4hnj39s&_=:~ԋ81(S"8:{3Rn?ȉ{k5 Np,V5w~6rJQJ¯*ÏNa?HzTnS`^ 3ai9#<;0zJBb5bJ Udlk?G\=l}Nsi U-O2![٫E^2TW<[Br |% {M|鬳:YgN;!"nL:CQL-i6?>^)%*chxU_p5'7__|w-})c!?ln3  .u]O~/pQG7෿{oGUm5LjKWU~y]Oghʮu.ZC3V쭣kL~ V33KJFQ)C+WJe0Bȋu)[FԝuAhsF~[emu׵t}͵ 5Yw7uB]L&UȫjEm<|@A* U@K$+s>QzW-}/f:~>c[vcus]]y0{13|d𕷞¢S7DYu:ϙ@NLB?\κ4kmm*7,bk n&\~4o|`!ם/Wo9cm]ask>0'kq7j1aogO_</KYc 9 o2ΝWqc (؆4 yS,cG/So[~)%:vazs+ѯfod``??[up| _Cƛn磧j9, T-ܒ_フ5 spBMe4X`ӯzVݙP`2֜2FúZI@QVrVL;w.F<]њ﷈˹REn"Pqn!M>ĪTkx iS.0j]49vbdJV"[+蛚ohBEj 9n֢uJ~%UZV2:PcwgJ }r-WCQ IDATap!O|7Q o1t{Ϙo|#[n%wlf%V3kx]= {kʵ!(cy6oWOT)+fϝ?̖u |w.,rWE`o(k30gw>nR=NŃ,^>6?|}8{o濏9 Ft!768| /s$`\qʼn7/^.}N+9{ߗٜ1ϟO)'3edfl6u]l̛7CAU-CWٍ7⭟Ő&s[ny<\,r- 4[#5NዥužWCLOsHcPnʅ,4A2ᩗdJDt=[`h <r锎v P/jҷ_F~DP˺Z9Ӄ]Iz&5Sب䍸V靨ψ*VXK~)|J0bXO=[lɈ#:Fm̙3a T6یz+wws(ko剽cews͏&qצQ|_-w~7lzK h,ᮛ`ԾqȆc([+*μql.b'dֳ[!u_AB϶;?f1mvkqci1?}01#^({M9jo=m&u]f{C_Ž6c)Xe;^ՙu_/}Z^Nԧes=m]w6[oM__w=8XnL A,ms/O 7P]X!:CĨZN@ȬG]* 6Z).b%@\JҖeŎbdw.'j?< ToQr_#rnA#I9LR)1GSXڦ2Jh'oF1wH( 4@0aGDmDGCaS|wl0pԡ) >!0V2a1="JʯpTmBRU.=Tb{AY86j¾wKeVA|U12L2yk- 4ưvU1uVLo0,9CjK+XAoyK[Q0qlޥ9kF0c?Ŗ>ʭ 󇙯eͲQ{}+,⵽Mm1GU~].DFp"Ǝ}SE2eJgjg|smS띯7ߜ믿s_+^yM[F EZ\XetwSRg(zc$Dw?ȓ% WX!ZFMoJWԟ,A@g- Q ZcEFq"-{KN+~lR-vBeDbTjSGuFOn_u,{<cA -oIJ\նf*6VZBU4ܬGQC;_&{NfQV#@g/ɮGCb8?e{I at\&>ZhjFbOA ?<```B-sgɌ3: o+uOYls1 -c]8r|IzRx笺s>u\M*z4s梬<<&NDQ,c¸yظSEa?nدQϼ?<ッa\~aL,40Шu V_}u&No~[{![eE9bm9._o|޿^h}9N(e7eW7EN5J,ZF{u۽/*WBO؜GfƕhdՈ(/ Fk<0m oq{j9tF18\Ǭ*NFvRNz5Vrn|xFyY_E?+k/6TM5ApզZ&n;'@mD]_VUW ̦'j]ÞCC]Ut)Z+,ۮb# ^|Q?SV k$5J}T2Ṽbg{9mcYca3﷽o2F2e8̍ldy$7$n$o<>D44xA[UnVJ?<ɓ&ͶrϬYzilVz!*.N?63u*&L`׼VhUdʲtug@E[R0obtuc0< JUG1ZiFS]\gd^ Ӥ}|+fFDo!-4*+aTUinք?FTV&DhU2p摭Uɋy~WT,Xxx4j*ոaۍbbYMA ^woPV,p*F`X庒}Q;9AV.hHw#Y/eVo&JR(-TE=k5{VM5ʶr9;̰駟.f͒s… e 6s===eoooR=ztw0(1:NU'\sut ?ewl~Xw޹3 9vYL'HTZO)jhZ Ïv> y;#K)q%p 'pg?ˌ3V2M-TJ[%*%33q^7A HY ^tk6 tPMvw7'~,(ѠAAUWfף,)˒((I틢!AY;n;Rb``Kg3y橿p\,Oo-5Ϙ1%ou#Z-(Kס:Af8E}#FBku Zu%'Mb m ~˅wYd? W`ӿ!?;;o#*_MPl+WP\3\ CJ2Gu5dAv\wlyvB*e.nIC{"DL6"5X} ;#Pl8A+ *PZZ*$-P-HZ#H:)G(rޭAWCY=eE7<4[nrS:Dd,L)K/^_E1cR___kʔ)顇q)StM7O?+Se5w<%|x]1DV!nР!el!Eƈ˲dر}ټ먣VJ(~Qh)ʚM{N eK]/^+ʫC@+hz 4xVgݻ˵!B H7"E4+ED&H54EC=$vInoyJ ~<3}~~pgG)"su Da+ik~匑](P&,N)/x ,@qT9.8Un>i'1I2sҾiqQ!J9ʗ*ʹ+yjŚ;OQ8. EqBO/A >HI\ $^:ꆞtBG %Mg :K8Q,v@5tTy(@.AS(4JE8?{J(v |#E@sl>G\X%FZ$bkQ}ɂ |u^)q}jk h6F{7P1^.kʋ [o8*Bq r[û4-x-ˢ 'Ep!,N8'w:$-gԀtQI\μrT4KPPGF{:` xǕ y$¹sk8s$?ۨ = zʋx0e:p&+}n]2(nE;Ow+'\~.u's1cq?e-X/R JqDq J ;kP [yCh ,SER ~_U)z$q_|i/ wRdMlFiYM1bMϟDsIL:RĂ U޴8O§G)9r{W9W@k\Sin>KY)** @' z)NLP`e~s"WڂAZByVˌB 8\9lu\N}@GR_ U$hˆzzTw2>pKR-["RE1ӎ|>Yrn+j?|P%\CJ9xyqv8,e o unU>e-`5֭JpKol87A1~ eK^)YJ1\ݼUP ePXJ"VNH=39 r/dv8jo ϼ ?m;o=&zuj˖[Y)3ÅU?\H @;ͯ“Sc=Nܜ~@Q$3ˢ |zz'|^rb9+eshvYbwC,*=JY,XwnAWH†NÄ́MQB!ŢH:.-IL/N0eqo1:`M>], ݹ^Օ9˥ 5ա Ʒ6/W%U 0,.r('jCG]}/*E vq5)7ͭ\*NrY뮭jQXY6DzYuu561"6ֽ/l!"z 5^ +0qBR{;I?Ȓ\]\󹑮$K3EEnT#t6 B{ˮ F)sD%"著,)&OLK~"VAn ꪬ/hoosRcxg6c,1;N_vE^@Mιh6 ?]7Y/ālxÇ^ޓG#@<svfŅCxxΣ'_R7hƬ۶tQk 7A>grvjG዁R 7\ B9+PEX,% Q Z畜iX +rBs /Z[pSd/D@V!@*gRT3Sm}Ixm)oy1nqdWOד# tb9] Ÿ/b= ٹ0rgy;1 k O `*wj-Ft{@6X0PauV^XM[B\R:d%cEgYKQ]^&m]>?M6,Kõ%(U[͡[bZ:y?4:ƶNmr#c9pNt!}͜M zg΍,,:0 ˮõL8Aއ&{-,'MkuBB3ĺ2wsjhIriA{Aݬu.EYK/*8^%.t? 5EA(c]9|HkL48>-e&IDR,? O<[v 67PAԦ**/w~nq~ ^wtB Pg en!Z tXn|$rMb$rm]K/jC)bùיkpm|nWr2^ম^!mOP=p IDAT ṘMtXz4Z)tG)Es(CG΢섰Ma>6 \K/P)-S<[x)-۔]6 x=߼Kry~]<8`6=f_TCjXc1f2(`TRz2N{=fNU,ϱES˯tT /Le@ 5qW円z͛Ocfa1| 8dY'('S(X,5hM a~[cJ%z=wD_Yex{j[疎Fm$YsO)mHyNJ9Slbet8$f:AH:4w~>a }ye~A1<L8_tRƥ?U.A\ʜ.@ʝiR(rعZ+ h"J9ۀ*oM([v[Q(k4Z+ouRVbȖ{${-a`eAGG3YgbU+w;fr@yWeZMSr ;{.bfVUh0 ͖c6? ZkTy }3/ǫ'igUoǐî ̆/>+:Бb ( "Dx.ݴ,L:ү>AX\̟7e Ʉ1sv^ZXd-7\ B,%L391tv58!E a}J8a턢 -अau2KR WX,`Vtsa-W`SB9Xs]/Ov6`q8?/"ooue8VX-̐"<"Px?'ndA St6Dre-+lh Z\(N0.m@*%B>.p+HXP 5&{ie2+ bV: $0^Ȥpup>I`nj q#R^Fn#.-B.% ]H>T\=J9 V.W j uBcm ֱ~5Nx,B7e6ݗ.)bv?f-,-FwAY2bk)a))YEG1X48VƹF;!lK/ՌL8B||@N(IE)Krխ"duRsW"A}h J ӝ+\o7V`LULJ r|16EㄦPZuH 8 زɪוŹ@{ݭPZZ)_K{EpbUՂVbJ-9)SiaZ۶6E5B /2XqXa)_*Һke,3ݞK| ar=ѲveSq;ju~z|k%3(,o?cW:ҷ8q:Tn9 ɿ_:+SO呻d—AѴLm/MY)nݡm _ǝ_׺#ml*(<| φF7+& vXgZ> ILVs9V<81k-qcM6/vw&|9>L&^U4",P)'|(Lދ+Cڽ0’G+MPK!_*הPV %tK. w 8c0Y: cXp+ bw6c$ZUXtwA`\ڕA%&rWiETuӡ@v%DQɥ@q: vM|ZUq?(bb9_'Pϥ<\a|:؟>+A!gpCvfZkg5J?=W>ȐX}Y~C?pNѰtft#M?ǟǺ 4þ4g|?ml [k1)0x'5lr̕v,|v3Jc{@IicYA=fAPMV;J ~/dQ}{B(HE| V`L 2-~YkVwkZ,u~E0B"LMrԌʢܥ24V XaRnub);q¯YvɫP:Agש\|*9͙'K]XG uPn>2_#$M (_&7fܵ;ѠzPB+w:__T9JT.NhV.@8 bP9C"Zz[iꚦ/QEp˒N4_Sǫ'ӧV5rH5}tڪkkk#T/ cL]EƘwuO>$oy]2\wżT9yXcUlLlQck{=rO^'`-:W3z_L7D&} ݴ8Yt@Z|"=.-~u֯ZpM?} dEK{Ktt,`tt#.6 ɢE_>턱?M,0}BZ Uel.TK\n S.(|ٓD$Kt;V0>dd,QeB)pqJdZ|ؐR7wJ)F38IM|BY-J?& Ƀ N-42\y8q푔yxwѧ]띾}OL{Eyq2RN`;se^();FʽF GFwOV5ZZZlcccֹ[$,ʪ>:Дa1&(^vL xٝ8ví&GSڭy(*ipM#} dOhOE8r"cq?ㅲXjAk R+m򞩯Z4Wy/GNRƚ'\UITF ۙ|*!璱KSݹr3Y LF.CT:]/i/Iֻw. Mĺv&Q-_Gi*Rst̆M[>^rccmkkfKQCNi_EIO7j7V9a?=Oӝ KM<) K%JUZ1-MNCj"9g {3,K نrjy1{^ZAF^ЍPAX\(U]Hj5vr5Lha颷lw6-y/6A|PpdGb8M->U >iiza顧_VV;u:L; hPJ.Q)db'|>܅~Y'KRՅq540c-V?M_/>۽ ޾{sA?9mP{*|Bw$|y(;45r : K!i[&i3ߓ)_Ad!gqAO$rZ ΔSx(Y/42l X~Y.4751S:u*z K}Tgt |Nv'j ]4} # Xn456f+KT(777b^<8z _b(WUhcXM5۫[Z]u/⸚ _=֞oUMAXzYBY)Ess3Y/A(u vnJ%b9=dTQ^uɂ  _MPipKO<B4WKW ift4A ҍeArw]n/9MHI&զ;@{DwuA~D( Ĩ&;t'UEs mN9 A~D( DN,CNJ+ȄU>T0 K?"AX$Kr&MokAnD( 1 ]'=M'fa VAr BYϝ\giڗ |u~>k|AaE _je Y X(+~f+PjO#A}FA` eAIoZ҂ ! ݱHrgg'J)ERAܐI  WEYgAAAgZk{Tz%({?lg=łl <7̽gluML5p_\J/÷wźzN}Oe}.uaQ)J  (lǶg./}0{o3@oJ1vz/U%>xQmk7.҄3+.;^|IQ ",T w^"<b_LyAln)fhƬRz  z~G W2 QW̫ч3goX#Cenv^iH3Yyݵi婫]>K'xyyn7Zt\|.c/$&gRk|Ŗg  ,bf ϲ"]x;]GCQ56a9*ȅ߻#w+/޷㰫.`e?᱿%LȈỏG:Mn>O̚A͊[Scor1ᮏfP8bOn];݆=px5bնgali1>x=ϼ?m|'7kKjkN=7΂sg>῜FK5cg܈fx^p+h4Fͯ_Ⱦǵ[Ŗu`>Ccn=l=non .^N?v6G 6˻t'_8n;j']Mbmw3Ljͱr eݦ.wP:4H5$O_Jnf-#`Mo%-MWww=>shb's z>pV@څ|V~v|3_ӿȗקc>??Us?:SYmǣObY '_#3V,s;ހ#MK)?JR/?ދ׮Cst?@v|ݤ<ЫI?tqd?(M䂃.]睡~E;̍{>gKop3㔟cMmǏ?C\ L1`͟bmGp {phۍ;q- ?^˯V|?^ GÑ'a47 //U\/~Bnu4M߭M'NeA~8x{uf?t&]So׳4nK8rҵq>~8)G{v~^cZM>%Yw/N8l_2}Rq_)M䂃mǷ |xΞ0gg.mRAA>ʢ\(l>\FQdֶª0ӟ?cצ^{:/l[\w# qpWYī澿֓/+^Z;s{?_λi ks?`5E7q gPg.K7q]^7A#8Q|I-^]w=OgRc^ͽW rbÿ\np;/~ye]NC;?TW+7?Dr۽SKS`s.3px\WdX3Nۂ3~;v$*Kz6^^n:i-^?'jy?k[˼\=U+5nc960f6WsolSltzbkɂ  *Q(\.pB ς;,àeaɈ]FsC?j{t6='W uM12juY>OTXM7ӦjZk #Hh{A{H>:{ȪoOuQ7V1u6[+O2B@|Jylq?@Ϛ{!~"v%O=ȳwcV_.np5xG0 O˜Ox)w泼T!鬳[٘!5ا`O6bp!]7eC7aڈ\C'fZa#aDcXyh}n+7߃G6@USIDAT5֖08>;g-u+n&#fڡXa۲#iGZ0it,RYy[ʽ>lr5ưf ~ M^k5 `46M)F+@k("ҙruƄ'|}YvwW/[Vo wF}.ϠdF6}'F65Ζ”d='}RW"φ9 Ր5֛2|$&ǀR*rm"  ,4=m? }Zz]WWghkkBE:::߾`N54fe}=VH!ϜӿރCIL,0P 7\y=Xk̜ Z)L+3Zژq@x>Ӯ  3_+{WZ'/ *0hӟSMNh=b2-ˠ~Ȳiao};Zh]vb fwO=?UUV]D5?iUnxٝ@jO!3wseH]y_8&fi<\[׃e09nav `iП Du4%utbZeeLHaOyAzCxeKS72|ei?\1ϢenFz;DXarzq4fvo,)T3ѓCc.f?U$xJB  fSn_O+@VSg8M\$A* _=2BT rs+P<>~. zg3uZ 5ә2=YR5 45e'0l1#.~_FMh|8W=8k}2w\Z(Ƥıe칕s;3 s-Q15ں?M aff\S@4`0i ,4ڙi0l>@24k >;VS)+hyD Y1tWs9vgw\1nfLoUVuM3YsJQwoDo 4N4niv`vyQMoC̲ܶAA:z.}(}6ZM;  }7'cWcc8qbr~G9\*l,Z=݊7 (ϣe>yUzaz&\u=/͌Q.o}8 k3kV̲ɲ#1uobX[dž{oF:ˤ'3/'`g1m6j8"Mi~-rq:^i[x}6:b;۹ɴ[(~/.a"5+joF_[fo҈ff2ktF ghM^x˕z;9rwu㿙 unzjѬшbsx6`Z[ˬGa_+ôNm_og&;yEz\wٿaYth(Çʋ;IU#w9UAȭøʛ̪6;add뮯K{>Ϸ'u|c̿Rn3V>z&?1xkxLYFԼ/Z,̓om+oN՗EE):{#LP4-Dq`ΏbM#6ޚo4o^8]cNJ>jbқﰀF  BDZ-JE9rP555i'Zt1x\8~;G{e;O~ǝo-F԰aQs!z6l/Yh$~Ⱦ!]GiY1 akY{2vrG͏×gьP~}]6҃Ѓqp?7[kr'3ډ;ɏ G?M[౜tިbc^F˘8}]GE+1L]6xlR!mĆ*Q?z??XqLbU[ ycށmw?⌟nFCV{>^mϷ[:1߰ʹKcGqޛߟ8A ȭƓ.НfqqڽҩWbpQ`m.49~7ӡ;͘;~B:w]vhn ~>a7*3~N(l^[gsYMs~8'O?ƌan?we C?qę*pƁ;6;sߦM>!^VhJ4ǟ-'ocv`c/)};]wswd?<6]K&l|wێ:[DZÊaK(6;:qc0fú*F@{$vF/c@AAnx=V\?^M8QM>]!CiӦE\.5Ƙ:!t]c3QV]7 ʥe,AR`J6odx/U)fH*OSriLw)wEB+1h5ĩ2c-ƖMgv-\Y BݫLC|};mkBF.#S&Ҁ.,HҟPV}B&V2XUnJE;5j%s9M&  ,QƘ8cc1555T*~?   Emkk\DQd1ʯ   d1Q\.glE%'W&W`嚚[(LX8VJ|3+\&  tQ*:|)Rgg) By`M-Yr QԣFٝ;;;㎎S(1&ZW#|AfAAABNcL\[[wtt'h&w$ ǏA,MXM}}} R\hAAAʼn#R@>7b16Zkc RZ۞狸JqʹiLcc=znrUzi1prEQ-%WV)pK'NҖiӦEQ>(Ţ. :cDZ2ƨD$CWaAAArkd) &㸳3noo  `ai>-MWZi%arT*ݯ_?q W6AAA+D[[FQݎSSScrmkk3DQ?Q(z,8P͟?_RTOYAAAEr ޴^Drr -mmmU8PEc~YA-   |5Hjy P(,@KKmll4uuu KP(ZG͛@GGG`ZAAAzB X:`'NH7"yr ֪V֦Fy@΂   0Y 0qDlcc"sʁ.e     , g`nllUDȁE*,`,    CƁ[EiI,jX`d    FҒXµ" d    T#,+2|rtЂ    қBJWAAA,5B9AAA,rYAAAA*#BYAAAAAAApIENDB`kraft-1.2.2/manual/images/en/catalog_material.png000066400000000000000000002205421467704360200217630ustar00rootroot00000000000000PNG  IHDR"YQ pHYs+ IDATx^wxU{f7! ޫ4Q R)"b}E (fP,+bN  IΞ=-993;% """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" P T$l@"b.иX0 qx^"""""X:n+m׉*V+u*c-)%""""")[^sB+PVCDDDDDT*Ж唊Kz*loim2*p[Zۍcu]cX׉OE NN !-V1V WY_^(UV-j;"^\FI%""""GIBeI WI/뗊JrJn0n7Nb"""""Xb#NUdRQтXIOIUp-"""""WV/ wlQmdݘ($ף$Bm'T?!DDDDDt$@36ԘP*vJnLTuv=YmJODDDDD eI+mD^LwYGl}>:/UT#Y'&3EsѬ#8z0X""""":vD #+8z8Y7uJYxiH꺚`cGDDDDDǖpCaqTy=H׋t|G02#8[эՄ`}@~""""": u}n\5LD:D:Ezy5 k*u5XoJGCtuutcԚP"]'Q+ebZ QD%#""""-8Ai[G kUrJ:>ҶL틴B;v="""""*hC\tJi[EGU8Ai[&t}jMm Nu""""":8A}Mqdj_Pv@dk}2qN2i;HѭCDDDDD%Mtu|m);- %񑌍HiHX8` 8qZ9qZqw )ɺDDDDDT$-ԺNNu):-˜8-˜j:" Pn;q@`Um n=]zT'""""cSSڂ\45zNbYX׭&ܱᎋHip8]UebY˂S:Vmj p\4c:`[W.Nb=."v8cqNATxC9e[u5#"""",9L'.NΘF wюӅQu |ڧusAW8uYG4Qى&ȩ8NuVbYm8$Ra+m3  O]/3USeG" """":"9m$ur\Z8m\Sǩm' gLJ#,hƄ :N֕16Dn. NXKDDDDD+IPSu 8@߯[DM&uctuu.SUkNƄ-֡*E:&e /~ZsAݖ\Sʜ@>"""""*;BSSЇL/\mۖ-չXV\P $VcV  *u5O0گ/1\۶kG+V!"""":ޅ dn'Tx5aC'j+tޚ|b:vA WE/ں;͝9^HVj.˜N"D$:NXd~8gVN˺^ZӵU%[Rt!RWS̲ܯc:`\՝uHBUDگp$e8 ՃmWnCnǩ$X>"""""`!-XܖǩAVqrM^ԏiu,幠֝?XP uRnsuYm}r]=cN(}~&_n.s &""""I nNmSIP.S1r]炮  ;@紞$`*O5vf9 zϢ.e5pj['1@>U$cG`c -_uu:ue9+5C#'l_?/N7.RNq NP,RM}PVCO>u m 0}*~*i?'T@_պ e3˺Ӥ~ZdH}XburM]>.8;Vg,,TSjUkd81VWuE]BuTNu"""""*Na-T8Ԑ)ρ⳾8Hm9j̰\R[d Mi rD, :yQmGW r]L.÷X]6 qנj5{]lۈE޹)6QkDDDѱ:LDBO矜o=,BPruyZmZW_WJێ&V]v,(vєP=z0`[7vmo]"""""7kkjj/Θ6<\17D;9XM]VtX9 [\nYD=l0okܼ'n߲`TՉ'YTqj~? qw훋v$tV)`][irhȓMj5{ܺ#^ԈG cǶM%%W L~WYbCMBv*2]_گbY^ +ɯa;Qԝ-NB'g[k31U a6<72:UՈ*#0ܶm ـ7WdR1mQ5On/#%D~rIW\Gm|U..D5GGᩚD| CV]ؽ42SDnJiٖDXR\ےP"RNuuⶈe/q QM.F /=W'Fj6,um%*%C-8KE,Gzuu5g;^m~\ Nǃ\AnXBAm+9B>Z߃#k0Ǎ*Ac7Q#rK|Z*'0mQSjD:>X``*r]unrTZQTk#{ $ډGW샵T%.iX{{""""""G, ,WS}Z1vv)˰,;11V]1 r[,ˁXi-1,Ghт[+7=xFOyHLHQy((ȇ~sߘH\1ߐA0Ma`wCEvebÏb4uQDZl8F оm]NO޳L&ǽ+g9]&1 e@IzնXVkr[mC7tp~~.9!'7͇>EΑ4݋lPN\^k چz=FtTe0p0t@ƈ,,yuڴjYn}BKaNnN c1z$|ص; u:IIXdvmcx<a6na~8E)')'aܨ{xI7j$.GstyK-euLW+uenZW2t8ptBWj̓)Ҹ$V6ې|&4mMGQp܈gD^:)M,$7zAY0 3ahܰ5Ͼ2ouhX5طo?r`&I;v]΅a8ֻpߘqJv"! @F ՉHѪe oF-h߶ Zl#0yXL?Vn1mNmv<$N<̳g5DQCDT,N5'j1àcԹXVw*tŲN|Զt_whڮ $BpIo. ;Z3S3Ά;FB ՛zPf d޳Ǯ=zyA,y%[3""*mW  LĄq0EX/,uƓi׻'9Nyp}vϿ79gk~zqV-W͛9gc@ߋ_pj<#Fq 4no_9XOڝEF QVM^njDڝ&@u{Ͽ[o wv{ݪ/#C>Ͽ{C#7}wK6׫މga pG 7=-@G ?-ڑbu:3rqUgz|[W:}[Vkx;pxQEDT.WG܌w?\o# @:u0t? ˲o~~%ع -5>oW eᚡCpcQJ|<"xx2d<Ng=ؾsS0ЮM+|+gWqjz0dfĢwö;Ukn܄i3`=㉧o~pr{vL9n y;~.j%?0m.00u,h~HK" S]5J2|툯x,BplY=,r/iG3(ïC5v؈üW^il߹ [m-[uukX-˂mE0 s1[wumP!ЃO>mömx<oxpTJKì'&]VDD5۶ۺ3;oCu8=y|9ׁp#_#haE7QsXaeM,;(c9MEx}ۖAsTp0 0m Z۶ X`mԏ`GF }6ET#.W 4uz$- >3_(.U@qRd'mݕҭgKuu 7,74%hu[Vs]P6*ɰ<-ȇYWPp%!Z̄B-x򁼃 0B4<7%@wgòly'kcwh""*;wƦ[1pW,?Skw6~(TiPeU?U?U"\xqX9ga܄))Zk9gcb܄)*#""7`Y<~,`7R!C0it]aAYS{ĴsfzeDAYƢ&^Lxb"˺c) ! 7,6EM&Oe&~M~t!)9ůfٰr=(g l-~h/yU[0%qݷc߼w)ӟ7\f`&" >Nl~3{b ZxFj2XAArssѲy3M0w ϞQvm5C㴎`ԧPPPĄ@ѣm퀯Qpko K*m,LҾm Q܁Ǧ͈2Dv.P-_MPE[^_U׿q;[bY>/cqrFDE!<`jsXI DDD1!&.,Ɖn.@uO].Uy!ԟ* g.mv@8ִȟzR7V&1NsuY'TJ3,FB^Vw/ՃJDDDDDDz";%IJ:W12]B(, eY 2^-Am©;-vN0:!eꤾ#BDDDDDDܤ~U81wsAmC~(Hu.s:(>yY-"""""" M겠RԹʩ^f*,74XiYns+'""""""/5cf-..eul;X˓5DDDDDDπf ti.S!SeށB|ɓBsw0bW)oEEԚ#|5j׀!"""""Hrt2}'YWذFX.f2vĩ ŗ+7NDpLIfx)^VǼ!Q&z/Y@Sl޻kt@ @Jj u=tD""""""AMr ^ǰAN.jj[=*t@CsAxy=ϝG`āhyb#$\(5>HfJu$gn?mV^2sS3Ps_t!G, ?}5^Z\M].t!i?m /+N1}s-][ NuU"VQ,GrP/Uk!P1Ӹ])pjVy㸿노qj3 _'WEbЧ{;l]%{C̫?Sq_̀Y'F?sà'“^ n0ăaaw؍qѩ'DDDDDD2D L^$cKM$Ӎs9<&heQ'S .-]dn\\cz|m6@$l m4amy`x;l`~0]w[xۂ.^ ˶.(0߶l0,lzzܳV73K_DDDDDiϽ6e̝(T&Q\\,R[Lfu(cdrM_SÎFDRn~9Äir]f0MۖjQ4F0 VdpL >Klj .[IDDDDD75;mj*X_(ÖAd΁1] 96̄z88wN犈(85;B&8a-KeUԧm@_\0x0H{|L(:`t (p>HƖHYe@-.vSa0]pe"""""2S|TFe| 5^ׯ;xFDDDDDDT+T*%Va9ZvS‪u""""""rMN9Kp*á;B>"""""" .X W)gXvgӸPWTW;Nmf B7>jL>"""""Y*kqz1SrI{GDDDDDDTᎫ*RX. wpQ*qNJ~LU+poKdJXlXlbbaYAb"""""MTs^aYY Q 픺$""""""*.U,TDDDDDDDZJ*kXVU@DDDDDt 9fٱeā!"""""Dv,e݌J}ꟈQ1հ|pɃJDDDDDuv:2QPn@ǧ_2,,ZٖEDDDee-0g:NU8 ˄[XƝMuMDDDedcV!^0Lpz-#Q°LXwwv.(v5֮*f;j 3Qw Zhj2(3@nlvwï%#B|r<:mWMMց`7, ~M|mu g._6ઁtfDDDDDD&hĵ 3gC0Gڏ{QڶlAמ n$4Kε׿a$Y7EJ q5;㑑~䯑pmjjU~mQ3 RD/KNA{w"ІjK~:Sݎ=_=^dayh+ ;A!,X>^Y̓i9;}²Y)0l#@&P>EMbTEZEut,߶ f"""""" a9j0Z þ/'u]oGqa<ۦcVH2 Kf UHG4V?`? GDDDDDD%/ W|f3ҲrQ9}?뫠UFp7>-W!-p [y`Bfn*ZI. ~;n^ & 'm{/~<'g'JxaSᕟ2賂"3Qs3m8Gjvr㸽k 3WN9/Ao"A{ w2Z_3 U<ۂ6 ٘1w$NBAbcL!ܚYatԪu# ÄjQ00alLw EQ8\"""""""2aHLDDDDDD`X&Qq ""*/ ˄\tP-Q9`!N?шun kvy ""*/g╿n2Qb2"YˀϮ;ʀ0pB55u2Q9cX&ΨeqvQ1wNDDa8(2aHLDDDDDD`X&""""""R0,) DDDDDDD e"""""""2aHLDDDDDDp '- {aYEDDDDD۶U .aj)CؓCѦuk$%%D_vm۪e*'< GQx>=iؽ'9~ ;=hذ2UzU&AHO~ 8,bP&""""cFժUa[ŰLDDDDDD`X&""""""R0,) DDDDDDD e"""""""2arۀP2p\u)S{'ǵ/n }R`#sŃtbl+4 7`0uu,>']|N >AOǚBھ#=`se{g;E \6=DTA1,}K ܿ'>ƅ]`3k ?y'TA۾R4l?ΎWy]:.]p~GO)}(Y0ƞq6{Rщj]w[g[@ =>X>n`/a qaK)hҶG93>KSh |` v'Ly}2~jm Mcǟ_w<㏑Ѡ1 MUS2`މO) NL@|BӢ~":񕦤l -DʗekX zw?Xꃸקz]~;f|UÓ_cWc+0ie6,FK0Aӻ/_N(܀9W߁~Oz)oŷ~JzBtvJ&8{p?tߊ-{,ƯwĻ{Wq7`@nOfQP~Œa0r?}.ldض/CF]_(Glcdz1|{T<",Zx+z^ˆ 6Y|\5'.Y鱐v&r9zunĄOΒk{ \u?^5(XW`al@_5<llX 7_/BƉ˰ٿ/ xПج̽[^5R9N9, X!pqo;#T۷Oc|Z% _ξCA}119}: / <3p]|6H&cgq٭_.L_yc^w0n66H9cL2~*޹/Obopp;xn;{g /Fn(;,p#^à 7"yU*|ƀBi>6wơGo5=(zHF07•UX_X Kwqݪ>qKI{xb4,[] oޟA]0l^㗷ȏmXX#;^pg3<<_\o}K+:μ/.x.;|>6l>_խ?²WGOO/ږ#q'cؔ8#=ZLFnukQa-XEO6 w~Kl z|1λҗqo#$,Xo2nT.߬07tۘ^{j1}Ԩ]o Bb x<{l֋ȸ),Y¨BC2>њ׏IWθz2u|%D&0x XRdw,~ikKS^S)׎+(X*w/{ ڤŘ QX,\q1BW{ Ŕ?.7u/BF1l‡&⛺7c{Oob!ca#GxmR=$=vK_GM4v7f~OoMwYWp8 lOsƋ]0er|`g~U a9lzk˾@ W,2]P ;vv%i3$3=LLÀar`6]UaXfHG[5C@l%#qՙP=9 U^[.5(ĆApU#1ָ뉻p^ &v<7ླ<[§+nժ 1Z4Z QxQpǤp5+{Dx꟏Oc>Ǵa4M0`\p7(L>>ؙ&z@JxdZ_\Ë́*H{? KZUrFH+>WɭpMB\͎88dm$IDlzݔ;.ڜPn^?x1lkf-6廇`-{Pov:i)mAa)_iҢDwKk*ŀcdžY \>Yݹnhͪ0 ap\p9|̶hݧ7jVذ,|W um_OaP?wrs] P;| v&Vq#> x6uk0M;\7kJ,5]{'Ш.=σosqޕCpRj\ uq "x!&LԼb9 |clZZō ,?'ݎ/ߘVoA˄Qu\ݑ#ud4mVn"<:1ghę7` pt;xVx2Tksx$?zȉѩuP!@ۀm s~|WQ!5kY@N[5k% g,d{// 4G dwx7k1+ \~Zؿy^È_?%U\۠L<<>N}t>;?+^e`wس{fa!c5Jc)jDW≙q+9hzqEhSU݈3q/m~y%o:M1Tu_\p ˆP@ub_؋5=_J×>5XMǜ>͐`Gcw * p8sM1f4^8Ϊ~ܞa0B~wU`/ۑk.30d=kUp'f uMѽv޺nz'_Wq/5w8iuнOG J{:YUMǞfـ}ůQV^C taDuy|qE+'u]oG< gVFƁJ۹9)3Qeyɦ$ⴋ{𿭝Z dݨ-ZՌ b8Ea$#mv>8k;xq6 .[7#-_K qyD|Wk߰U}ԂζZj?<<.M$gF*νߙ~؆3^WU“|щ~-qՑZ% l΁eہg>)jfhm~s4r: IDAT~~;Y>J&'m{/~<'g'`,d榢前2Qk|o= 3mV>=&jw-bv/lFZV. =GoX>4fh߼\62׬ď ݥokûOT}R؞MOkvX6bðM [M6PF5ݺCf]ؒ5TKqF :_X1A 8g&;9sbSnwOj~qyDGa;6vh}z.nd0a<{{Ga0 7 ~ OL]G~w9{>ibӷa%E{cܴa`B:10驫wF\7) mX0j_#~ԉ`h^ :lT|7_r0cH Ƹh3U[Ϭ_3 )UoK!O>7wDB^pɷO }^yHp:_L\-+7F܁1a#>`<*uwP?m<\ߐ~8yk7[ Q0=h"M$58 } U9OOݗOr#9?z7]n*0)ƉnSMeN충Y6)R[L&moE{YFf N;T?6G|hE?a[XmnӲa߱}@l-P!~{Y!ӯOǎڶUEﻪ`|yz<:`ۖbmO}ECP#Cڷ7d,}oȏw⇍mx<6L.4`Q=k|;mؖ߱ xD<=epp~P߾_s4s[qx=6݆az?m* F}$mf[BlO| C X6POTNX՘ܫ;@iˢߒ_-=Rea'[ %d.E˳2tb4 gÀi(5"lt\wj\aΏ1׏JFX{#>+WIk/8612<~[w4C@DLDDDDDD`X&""""""R0,) DDDDDDD e"""""""2?{Eq7^CGz * Q.֣ H b7DJRC/BI6G J{noy7fwwfDDAY ǏsV\rɱc8*h{\[=-"")/Cdd$ȋȍa*qPX F"""""""7,""""""⠰,""""""⠰,""""""⠰,""""""⠰,""""""⠰,""""""KGMIIIe qL8 2r]EDDDDD:78ߑhOKN:ݱ/^,\o4 oX 6?ϑ=v^&uݻw`۶. ӛ2zZ`aɨ~ O\ggoXtN!kb4GX1lIM1 yLx4[f<Ѡ ZG3z*QfOJğş̄ûɼ2$WƓcaՄገ}Q."""""rQX3qLTНrdρaXU+9|j?gm/f`"/ HYOZ??{]TT8C'4~~`}3Jνqg^X)l݉."""""r Ѳs9\;^cqػp;8eo$<˹eY`IIYXMZ&Xd91pΓMNd0'7Le5;~bqjD#9f>s\H$5j KFOw*&f%m4` ;DݲdxJSX Ma/szdIX1+&``D2 w$W*T0kP|f0}w!*W#f[jGc:ǧ+)A sbbY6$yhXUċ#pǟHUxn`:?ª #;qgu"|;E 3oķTo """""rc¿L 2Ѽ0gOg&frT (mbM6 мDZ>wl 3%sOoT9w6|5u&y;稭4~KW⧗aHiض?3x ޮM';$l`½4ZDDDDDn` Q?vQEs_h=A;Sv? -b§xys3*䰉۷u0kkXqv+0tK @3Z֐VcI&s K=D[ܩQWCx/ް1 #wLI$LA2y +枌eVwao>ie n+PvݩKv7~Gn];05kҰ~=S/ϰbg66Zo42βmlebi9ODmmL5S3`&wiUDDDDD,j*^GV_iV@ٟZv@PSR{m;%M`ٖr4H݊ٶiܻM}鲁if0 L=\EDDDDDn ҥ>'IDDDDDDq ;L`ȵIad:HiNDDDDDDAaYDDDDDDAaYDDDDDDAaYDDDDDDAaYDDDDDDAaYDDDDDDABVGGSF gu""""""rPXBl߿_DDDDDD--""""""⠰,""""""⠰,""""""⠰,""""""⠰,""""""⠰,""""""⠰,""""""⠰,""""""vVbqv&V-S~BsHժT/ g׫.Ǣ7^iDDDDDDA3j%eI 35Udp,?d8q:[&[̮s6hf,!r-qd_f=ϖs(G-^MX=Oéݵ>%"X;,?QCޠ}5X=><ƴdY״=C{$<^ˤM2""""""+FT*Coۉ$JF3;7y9 6CXʏƆ;I'Fњ4`Ie)$ʦPV4-AiPr60`wP ӷ 簳÷f>?+)6FʱԆebcY};[dO`GKN@DDDDD亢|y.3wNraÜq1/%~3"0HXJa`vO/Aάa_4+%>lVf ۖnA>?y#""""""Q)\«?'_Y)-9(RNrS7I5gbY9o?z6%= ]p?Z6r;0(nqLzDVoHlKswbf K6%xʤurMF207}sIkfp\?̀;'N]o[=uڹ]!2fZ֯#ZZ5k:3t|eۮŧZJ9Q{dG9vZP}R)(۩uiL4eg[˭KG8(,8(,8(,8(,8(,8(,8(,8(,8+dsV g\%XBo""""""2MqPXqPXqPXqPXqPXqPXqPXqp;+*|ɤr-KT$?x<. DDDDDD|YG^{N%S+ 2u'<ݣ0xD """"""̿gæSUzbfa'-S:'2W,QhDw"gnt,g\ynͅn6 )+v$OhPlAqV]2MJДҹKt8)[Js:Wx.re %FwQ:]aNl~_,f$4o/r౓H/5:eUkYNvᶓH0|jM"73>AA؉8_ }L>dl1`{4^my(,_AUaDOWdsjG6mh۪8ݾ >_'*؅mNpw{1굎|1cAő\U~J쉎)cXԥDq[8eٜٴ_~~gGճw:ч-]]ZDDDDD ng6qv%cc`ϝҵRT\sptN-AGS~;SWuܘ;ѫY}A,N)O 0"iv_qv;s>GH?M04_ۉʯgDDDDD'Hqv0Yt8! u%ħ؀IPT; kAAL_k˜*b:Ia`6 P?0G e$+Hu)6%.dG<Ҧsub7z{(DS2<%Z{Cj=ʠϚS;{<J9~$"eӬ<œqz"u# ϰk Vn=+ 0&a&..,L:(sa""""""W5tpd/UML&Nbל[^:ª&3B^ܛyX1O)I( IDAT,f=!2nY 1PvnJ``5Ɋ#~\A&D?mkC:8_ZZ<ӊS >łٌ?ݸ>Qcxtb݄x|x6͞ehL """"""W::Y5Bhr>NscER!vmJ/sǠ&u.m\ԌC3:>4EDf3cXq my'kqjHzu>E 6طfgADӧI#aӟ1e%[G}ē]^JWQQΪ 06;}Y: K}vxajN9/s`@Z&e|$F<4ݝ?Ma¸L칊Щ>b֞èؖ56רMJ-dt&v'G7?+GPVy|L `Rv%7{w7RD5EDDDDD!:5d-V#6o/kG3i^7, a{mr9ޕ[8%MG/6A{v3>%>PBԝf(a7D 2 M uxk;zIXȿMaz̲MXRT9|eV2>~ vY >2=[_xz Noj5 B͹Np,9 X;wۛ>˶=~Bɗ rωid3/Nm GFL"Y~WZka_+ vxlgɴ#XjS0U({F&|2_ {Nfc4&T7Ϡ_3ꇼ .'/vAʅɟ;䃛Y2?ਪTY L>O;h^+ ǗgZmA}n͹E}>׾(œ)'P/1pWTOv;qAv}m#"""""kEQҋ ѧ;&R(z|؎ bè4tafԎEXu"8{ʴi]Sx91|j~%`izQ:ܕ'#gM/N5%#4<ʐm2-#9(oe_YDDDDDw %~ե,; ^|\?̀;'N]o[=uڹ]u2fZ֯'gZz5jtVg耱;Ö+,7zmXfl2 l²tX~ 4 lcSw,۩Sm+,שN9~- m0Lg[ڒ:v->E*U29.$;ʁڭ?# Ҵ?l֥ydIXvܺtg`.2= H \(XttӪӂo uugzK\t²²²²²²²Y!Bv9g\7 gugKU⠰|UMVDDDDDZi""""""" """"""" """"""" """"""" """"""" """"""" """"""" :A˼]6GoiޕmQ 6Cn;'s>h@i8W """"""Wf{6kC'b&Ƕ 9yG$Ujl((ܜ>zq fۓ:r1۷s.*QLmS^- W9ѐ]i+̞áל&r k1g.N%*Sn )RXl]')SGC x? qKLwsXw,hrt{\>|C74O]YO~/ #""""""Ϊ ՈpNNδِVeYR65Mse?m[ğM?RpԕvY$ʞwwh/?È߲읿ߏAÛPT#*Y2`v1w^!YW Fd#ZUEۤ=Ӡbnm'XyOxSG۰9 6q)EРIt}06|Ee'+(| CM 4 &00aDxm3l[Jm OP7-=CGį2aXe:~5.5[Naarp̔| 쎷)>-',< H]&ä5eY)Yzxk2rJ:ָ""""""7;7/f6Ν\ժ. %Pa1]ǷafΏ'"""""r3SXclI,O }z_Oc}~aHI+ml[1YDDDDD$Y!r}(W ױn(czVc[6[Meıa|aըVуa$hF;;%Ԡ-ǶYVBTiEAGⷙl='-8gos]^ΝVۏ}",,ٜ KJ p_-.]NvHdߚdcnuTL尳ֻ'ݿ%pGί3eOν ُe$m>{a0>LrC +󱉈ܼ4 o Ν]LLL MNشy3-SV$~&yOp'\Qbqߵ]"""""" [ժUxW_s~K/UQQ-+rZǶ&z=+'N5j4rxo`͜ jڭgC (w?XX֮ѻI *ϝ k h}[N8{ϰm~H"E˦ =\x8푰g.n]Mvoenܛv{$AwQ֭noj"vyfSQs{qK:4!|ѴV;M7i zthy~'Oy7.ɟjʔO[*ס뼤LK=G-")O:rwkИ揽͈5'/RXǦaIp_.ZICTvvFX;\( ,cד 2q"f}ٜ_ŠΏ "=]=%D3͌SEZ(/Ͱ\|,cĺA]1}/aݨ'EsE3'*=̀Y|=z2=ˠ Y I}NYY9C[weohXF՝2}r|u;G1IXv?y_b,u$dJ/s>&3lS}r ;?gӿw3}jX:;mkM}bOeƒʭv#y9|yii8הhq˛;]?}T/sYhZ1ݡtu KP- #kTkR!Fkچ_xoKfX쵰}1|ѶHSn==?~z6Ɵ#KC4kXڍZ{c92(xKӭu̙ҍgw;iJӽ$t3FQoZ7o,3>Lf S);/P@<'ɖװ-Y{2{cXȜUyZ "-xfLAW//>?ͩ[w͜+҃ި=ۿ\٘!:n0BlTIG8|H: w]׷ iÔbQ'ޙs}ẻ2( o2}j V[ @P>ʕ΍/!!)snњ*A`SΏ0 0V cngLv&%+7M 2pp؜^>ߊ?'h}WEEq4*v=qS3oRn[W A/xa̧Rnjlc͉cq̗˅+uI uQ^,Vga6 *\YSE˗ [K=<Kaѿ?]l«XCn+o g0R_`m, -~|f<5h LZ@R\ݿQ˂1jLǃIcxۀo/kWY0[mE7NʄWjjնX6a_sH6'ceW豩~擆>,=]m,'3oOt7nkn-I_CE9s'/ )+)qS : ʢkw釿fyL|5_|3@cy9yf·>kvuW Hͯ{4) bo^B +]2|qv-BAa%KvvݤS~͋Jw?s,X$87ߛ@7Z\l~y }qV/woM`6F{6ЀvB< Y xB =_c ViS.áXp,EӝF}mϙ-yH&!@FcW̲g_h9J6#xo>L|${  I77/y?П}Iɴ畟;9PYG"D1')Y]xb;]yg.&}ԘЧ~.{+:@)'IЙ^ fYJD}Fqً㞸]>e̴m3O6,Po%oӜR:^:'/ʝyKYbEs)ٲgÝvW.1;?Sɟ70\ȟ;c/L:?qWh֤ 7C`'.FH7$)6^B+a+gZpJafFvN7{DAif69 IDAT|}5P<ғkLg3SNf,{ BBH[$&$J%>4vb"F}Ӱٯ?+\d.U_EYj.gfE# L\5Fh!F"A^/^#l{a$%l&@h8:{Eq= P{/R6aT *EPY#Qww?M6Kh>uΜ;w3wvf{eR[u>~C_9\'Y8w}ڞ} O3ѭ9stfb`gFw ݀6 Mٶ{+?bM{FdF`ܡlZϟwxcII]s\>>/ĺ;y8m#/ҭ{rlôW.qopB귭VYD-kr|3GbNs#t9Y=cvyt` i0^o9$kpV 3;/sG8YN%GFfrP,]˖b 6|ҮBQa"݃8wƴX8`8+{p,E|u#:ᛳűsѸ0R95`$Zq_<kФJfL{Ij? L\ P;#$g6B &ҍQ,lރ#b9ۏ_M2ܔ}0>.Lu=.ͺ4k?&&N\GsaORۙ2q.`BM◹ cȤGz\Qx5ST5Ղn/LVmgԲ :ɂ{ o݈1u*CO^111 Kyt:߬>L U1ԥwdtClu+7sR|Ҩqg<-A)]8z82ݟcI-yM#8x!'.bbdo܄| .o2XzYof Kp2YoBDYhaG/,>|:Ϗ[`l<vLȕ5j46><ԩdby:>U*[2ah]LmJ.AL7{'V ]5/" Mq稿YJҢ +js8mh%']d^-v=y1gqfxݎ [)3(3?{Һ St车Bܾ}&+XDƺEh؂G9#[4|w`˚O2 ޯNlx 5z7C8Au :7G%d%i1Bhg[AeX!V-lLR}VYQQ>>V}؆t`5b#q*L.@}H_:5E+R0~xͪ!1s1C#T_*<;l MDk[4Oŷ7>~I5Oԧۘjc+̩. 28\f!OQg4~4fU^?9g\jm>`e7\ Eiؚ7;Ќ4s?aXJr@.06\w4wDlXvO&lOtO~ 'Cˉ<YG&:i2Llә|LYEfy5y׹QwB_W5i4g˅a.Y2n>mӍ+̦U\:1vm4ϪoZv˕a3lSCp$ON ksޝXv&/;cl%ּLnynZ3&0=e)w7,07&͖( 3(ۆabh 6Cx:{_{.\W 9u7~7Kc!7= FCt S,?1RG@Y$CS,""71s?W[6zȿ$gxܹM3wd4 % f.q[-|=`51oت,"r20u`Y(xQ,""""""E"""""""^,xQ,:#`k埈.e+ ߳K.QᇨVȆὂ#y7M\Bz4#֥\sEjӊj[w’|1|aYҿef e~wK. + &3u5GX,/Z}WG1,8Ѳ,"OFATiF`\if׫8ΓmJhuf'{ Kd% MY EҲP$?/HέE%TvBdAc8pg"$ϫ{?ُγYkb(XK01H<^T%5L[suE{PFv}+#v {޸416/S Mr+H{{#sV{B>Xle+TiprrB~ڴ/r 3w :qfVMi\6 ٺ>v1L9Cx9c.s,+p \LzЬF\r1LqX&!ixibl4&aԹ,-Bh3p͂Cb9c>}11;,ZIM?p媁rp`vwG)\#1qJc˘5H< #+Ik%WoN& ^:(BljXuqK_({ΤQvw [g,?cgW """""rOP|El읔|FX X4{G^,1/?oL.mLjwjS,Ȇmd븆bo 6w6>x\EJcxzLĚ?R`cұv dҳ4yߍ0E_fE~|4RBg{8~&4+)߻L,SCR/ft~/rmgt~1ψ/ W@#-Yo6t>Li^!F&W*[X& piT%;&*GN.]#E|>a!6 3-05ioMwwW\Mވ_,C0|(ݢ6 e嗣\MHeh6E"`3{ɑߎhU9W~tU5~J^DDDD$S|IޒAJg]a/\p8qøV#,'.!f/ygZNO5_L_00 ]őA,0́߬l[v O,>d=@j.5ճi)40m{aYXʔ/Bu,f(|,'ΐZ>cZ+?6aɣYDDDD$CR/NgXoޏXX},cŰu5~r=:x:sVgsn@z,jFj,sb81]+_SOcȽ@9؝/_Xhܺ$?~+_̓3cd.݄Gj'mo`@\$ ~té[.)2fn'n-?Jڼq|n%N_fr; >b|uLJ}aaW(zK{ЁeGyաkZ{ ٨;]Πhʅ"O/`""""":hQ\i IF Ƕ_6p.`rj#'ϋfn|zE/dl7w-w:82w.? 3y,v|5l&j f׹{ لAX4nk`VxoT&籕|wB-(FVs:߮b ^8Y=gƏ^n{Y^vz,[i&BywqDDDDDDD2"""""""^,xQ,""""""E"""""""^,xQ,""""""Ew[x'c;IeYDDDDDDċe/ EDDDDDD(X`YDDDDDDċe/ EDDDDDD(XK*W$"""""",x{'?u~d'wC" <;)X7Y牘1$.Z6pYoXhYDDDDD䟤`/;9[c+?m#@z7bݙ䵛+㾘E'sy v S)eXM`[z*Q(ݣ>SVlCܠc8.{R6컀#0*SB(Yt0/S7ycG*T( ]lhƌI``wv2o  >^X{]e/R&^__xFMz{P#>}7'!拏3_ӗ_ڃk;qSWN[ """"""KycG;ٵkC kl޲%dYN0Zp%a_|=L]ee$_nK|穬ZjwGFΈ$~dLً^ӻPX+[Yup:6oXŒqCxW""""""忨|rޝ#FЫgOʕ+ Νhpڕ^[%1d×кL.|(FABka6 #t(&bZl7f̬^tG a""""""QA ճ'»{0xPz6+V#GHl8c:X^_+X\$D"dd0 )a>_;dwbs,""""""(X+[ ~woLY0| e״ t7 Q VgRߙ|2cmӴpYծ5~Sz|5=3۷7w P|;f}G|  ǘNoriEخqb}2jv7lWΎLO1˼CG 4ay301S_XDDDDDD)Xg6 $ 3t 3 F9""""""I,""""""E"""""""^,xQ,""""""E"""""""^,x{'Ƚa֭UaY9aNL=ʲ4EDDDDDF [DDDDDDċe/ EDDDDDD(X`YDDDDDDċe/ Qaa""""""rwQf vGܔoRR9m+SijolOתS~nsF\ٱYyI Jɜ.r:pX6|Z""""""uh/I[8w_e]%bN.gDOgO Yݫ#mn!uJWewreYX֍mº-fhp*̚r $?ֵ<9B$"Yb9a-XENruxa植\8d&JL|JVm +.OӚ&-i @^*VE@%֨4awmaS|<'+ٲlO%#QxbgMؑ {gk.>51F}{(~λ'غ*r< _Rؽ,dՂǔx~Ϗr 3ʪ.( _;;mSLxv|2ccw:heo;#S~ >fwRf#2T IDAT[DDDDD.P|獎>b=w.`޵kC 筮]c4yyR ;-:/1rpK|$EylEJ5-G/l/&4 0Lkǥ\ >ΓG\YM W໭JwD6w].aŒ/Ưˌ\'S{O6x }6\=t[Q|PpX~/WAd˞\+XΰyDG"ȥ8nvd Fi80zB7GCkOo]`b˗g x~w$Pn|msWpr#DX6v=s'xq1Jܰtyq{o33Onއ66R- z|1 h560>@ޥhI?KY,e."ƣ%m e鐱,.@'Rf܆׸{qlOְd1r>R8`|||8v9뿛5YAZ *K/y,-XX>>QgkJӇlEԐ稟TugލR:z{.{OSt X{,'X'O|;`gAo./7mvj׬qAߙ[v[_""""""ILrno ;Ԑw:ɓHZw<Xvz,[i#_7o`r\sݴ4$S,""""""E"""""""^,xQ,""""""E"""""""^,x{'V)l޺1 ;KD|?뼓ċ 6n-HZ6S7l/ EDDDDDD(X`YDDDDDDċe/ EDDDDDD(X`YDDDDDDċe.?ԐqYޙepKۘZ1&Yх ~!UJ&x~bAK<{Ѷi-*UA'gR*>ԆjSf9k&gzﶥNp*h Ör4!Cj]f˸] jӢ?BaO ,N4SY|4߄$T#.9}q~<ڐ>kc/ש ㏦]7>xYJY}gH)u{&rrxi+SZS?}ŀ3?jR!*]QI? R1e'W-DN{/VUE3p|JZIeҲvr=SϯR|2=%Csۦ*U[EWV&}fuSZM}$r(X ٥_3rVzWOA~d{Ys׭c覜Ӌ;oADXWY3>u?]/fuu }òUl\>ײΧקkHO/{1lS.`˼T5w‰EtWuO̷r h&mӖI/0R֌cύ&枬+:=Όkظ|*f{#W{8eg$+|ȢVi{\Ǹ{?w'6yxr֥m|9|>+83쀔ΌTVJDΟájޭ(,ްͳާoC=Nuf]N3شe%SaJᬎb`V ƭ,g>1qY)'_f^̹6mYɔfJ~z; zx&K肁< =n_Ų3v6oXˢjKE䯻s'qz w5V!]UZt{kRC<캜z)sZvEiՠj֧+1@LFmFթ x!ĵ_>ޙzt>֍&8:S Px7.N&]|eƯP|{āFޖuP/8?yVPC<;`&o~9Ob <>vK<ƋX`$OrbxgX:=ڐUXg#c|z5V zrY\%?Q8NG>axY5ʵw׉9|4=>lOIV 7h'JO|s}9q^saزU99غd A^uaL~iJnr 0mlIzvUSrݞXrM]/wI;g\n\ehyb%KpL2$/7cܝ$Rq#b/~~h>)C?Wp8ϾZV&e%׳c/s]#5P>tS6ܕiZ-''KR ^_ßBM;h fo C4+J7n9"-^b|rSViΜf2__ßf _!{\cű;P󡡬ᗵ,z1`x|!$"vɸ6o❔J'[~.˸9N^Bu eEL[RܮБ0fngƳ|GSFNEX9P\ nFy>=OCM':?u4.ӫ ˅I}.vg~65 =߿zRcĽLh!ߝ99f}&9/fXT/=_u1GEOoU$ urXt5|(~_(29~yu0aaʛѵڍ%rwyïXd3yo,}ѥ2J7*: 0B}n=?—xdA.oۓڕ'AO{o?l7++]>OPR#D+H"BŊ>Ɵԑx,L-1يQ,8G/^czűE)qU}2͵0)o\!4y ~| O|z*N#u7}N2 u0sh;N\{ VX1OǸYrrB y]S*]/e?W8L> 5y;`˒qq12-FNws_' .d"/uDb|oVYD_b31x\nЎ R9,96rx89ལH ;W*wy{/~oCZy_".LxXo9y~+2-lKORh_*?ю02s_:{뺋]c%Pi_)A؎.aΞhb5rkca͊$&Ƽ|{gc#_?n+68SR !.ؿmQ<ԪZ[<;vԬE))N\w:9o oQU-{JKInS8+~7.Ν>Ko8\7S1m܃apYY>B1,v>]5v_+Y1G9Ct\,1vz'IHhAْc>ߜJEZY˴}O.V1juɀኍ!7c%_?bcH9)1nqal"4硂ה'wYת yKJ_8=1jOֹ1/ߣU/ؘG9 γEm;իTCo K[z=-[K>sX4o>+֬f^T<V">׷b. JѩA(v2ku,6oO?wIYz,_9-O {$'&)"# b=:o[qxvgJu;#4~ EyqB}r_d7| f:`,_9͏} .uȔ ?!G@&8rScu_gLF乍].ZT :?ZÞ)xs~ | 6'0У[s1fۉq*Oۏgl[}JmsCYwf4s;[>6_ WZ&~fv|uZߟ[=M\;Yuy_t-/35,缾)7s${ix<svr32y:˩s~dN E0-c[P\/H#ߕu/h[oJz潃Hqov_Kd̳Q65 dm|XC:N?1X7" iYwV~3ǫ4Vv[4*휶<<k'MaE+?g.*:p0R0v8N8NdZ.Y9 InV!-maUqNOfiJӢy&9ͧpazOsu1եYɝ|7e;.d": hLÏ}?̠39=ŕ_{l8 jiO.ʷ2Qvq|2P},_I pED+Na?͹cJҬI0'Ȟk.w2q:rկO -?osJ<˺o2; ]mA}$'N0g=2׳V.ǜ0{/3?2UnL02`,_+Vn\ure[+3_}ZΔ۸tZ4hR?cܽRqgRT >-JmgԲ :ɂ{ o݈1u*CO^111 Kyt:߬>CL U1ԥwdtClu+7sR|Ҩqg<-A)]8z8[qS˜4V}Z8GpB,N\[+޸ \ec| 91~E(͚ȂkU_6݈_DwF˧/Gcya5*z^3gCix 5M&28ߜ6çF~;˗2rATْKr : D:3{^R )gwoiRKK?_%~tYԮךk kD^ymfvvJ8өa›`m }$6 rF7|]ª>'(rˠ>S/HP*?+!!!S/ RϺ2oKu"tn\ >4RfPUHsS1̅M#V]aO)++ӭr9Q6u/Ne /֯LJIS̏#{ mƙOjx-{GCl˿dĚ*'o^J/O#SkֵX1:m^Vc ZwF=EZ<嵔2Uj˚TX:?h۩ ET4ȘwKѷ5*5M6 [OSz(͝9=~lMeDz{2e{9ηwr۶ov=wۼe aawܻz""wu^\6v!t 8''9wy,;Xܝ4Lnyn."""Dv8BǚזDDD)&왚j_FjȎݰJjNmfB9w3c~{oK>CPĀő$]a SzL_^'ʖ⭞u( 'XW\uێLk S+FO˹(rTj,ZE.I%E񻶏Yd eTvty,YIqiOLr\#CZZLz>fIو;}gcmx IDATzM~:/N =׉5hm:{|ɸN1. M~=OMdqNnbBoY:dO7:F<$N xr/ ~|R1m$yz˘+!+Eex_'ZJ͜vFX^*uHj8'O\/rD5{:yb眤+(O{? >I- _[|IY|W0X$c 7y}Kk_/32j>V/9ơRi 3T|':7? iS ka+}'6Ocy vuRq1LTA`;a3|<3bіtιsũa"?v|\cyѬ mg2w2N~v]%K=u: C{Sw}c*SOgָ\;{0۬T(-w"I\Y;ڝhS}nmgyz5yf-fs0}y/3ɳ5:d ~[Klljw扚]ygIq]l<:>B@ףm-9.t8U>|\~_t`tAhVCiG\hz9.CjF7_=Y5K"|l#;xZT0Ap<05 #ꎋ#Lac|1Y5)F?᏿ȞO/$zQl|'X&U[&2'2fy ֧]lܒa;X%#O}ZNը\&gONmxnB_&QKlZY3x`rmrd{j1O>>]vI}xR+,szYܡ]z3!Xٱs'wgg&, C4?W|qU1e'~ve$kI?3Ry^\Z nZUs'V^o,g_׳UzeIv=te͹ .=^{6psȥdGL.LM䙽̚lWlx13%MdD$'}̳_u?h5G"<[pB,LYդj^??LɡmG^ɢ{R7gLp-VD?b_\ٲ/Wu@Nå(xpj֣~dْ&Eϰu `jۼx`+ff4~8?n[`Ywҍa\da۱ <¨ LOt'\lvrWc&V<(۾ ųHƭU*wT41  2/?(D.(ZV2`#{G){ הu]A=\=ce~I_R$bBDWmU)Ñ_)[eNnFEC>'DEG '@`@ QQi.]>(U+;-ocɄq0G\9/̂aƤȴwT41> o?Dm/['*Fv4>եr +װ@u&ܗlz4!VBA@7@4m#I-YjɻE߉?A~D߶wep.SЪh8! xB'^: oħ rQL_96N䛙(~x?-d4}!Y6Œn:J.g|9='Ŵ$;-iaqe`p׌YnaDsge#4c(ÞYmܾ~7Ynf pʥ(.zM-"ݐʮPl爿 ܗq-wl G1bqWһ+۽v;KWH8?-(XbF@P AwI-LOBH6KkAm֎aAI&۳;=C,zB1}s9:s.[_6Pv0 0bӌ!Hp` AANb]}Ctliu;a6+^KP·_ґ%էEFsdg \wjN@#( H@L O~e~zg叒)0K>w{F1jd k֯>>bDDzyc'?FY-g|ɻ8$?"+z t#'|lya^0q޺|͠g)>b)$^Ēp$eNГm_sEZ#vw8"P,w;scR$#N?~gOCx9vBo^zV{)u[byj5:Č ][w&LL(8_ '{vtcNb\ DP@9YN]Ne-|tw|k_U5\4eP/ nOzsgDTQ%_ˇ@nr]Z0N9#8d*CgѦcIm$͇ޱC0]?kErz>*eK{"uSreyx.3ְə$\&ݜə./ͺ5)w3\X%ƚTkX?kTJ$>X<TNS+*N3 Ԭ0f|&4&h]kwN_F/o}埁u~:Tք7mI5S^g _cBG<;?h=Mzk-CA;]&Lgsr [pʼ* -Mĥ~_rĦI OQ#}^cs3dJa6'sK$bw/exvh$770?=Kl(O =sq)!&|E#<7b@Bv }̓ ڶBz]9zmxz#GZݘ}.eybxO]R/aᾯ}]5U_xnV;| C~G|kIŮݻQ}Wھc˕5~'&m'ӈٰa3Mc(glpv0nLm6O47Ig3g~nWE0o>OnDZ=a/ R}Z,yZIP6ܠLҩO??W3s9w;|aWT:/~kKBg<U҃{z )/gwm7#FL&yRDy?789yʴ}l)'*f"fXG8({8?'|(r/bRCCIT,?OTv."ﻺ!MDT,˽v,."""""HWXXP,""""""bbYDDDDDDBŲ-2YHrAbbYR{7]-""""""bbYDDDDDDBŲe """""""*EDDDDDD,T,XXP,/3yqw]qaZ90y=m@͸-{ޤi'"""bQ~aRX~8:{jԄ**Sa{;L XVÏhu&m&~ǯfTZnK#<Ȝfvd l߲{W.r's/nTZ廃1"W#fۭglĦOPasz|S(VM)r{3jԢNtshVFbXuQP;!E,[ud92e{F̝@ R181'W*yǒI_ѱqG4bkz-G'.qy5lvvog, }+cl>k$)Y6X {tl_SVrˮ mbc/ŬKs\>;DO<0# !*0QN4)$5dKL:8m3f z>%wcW-ήcrfF/'kWn){6B9P0DP&Ls`I 뫦c }&C)\D?b_dΝl߱㞝iap營 ^r.`H|o<;܀ەxbӬed֮e'92f$N;1eWho |KFh-r>ڊ'gŪ|| GdO'˷K'ueQAtx$*ݾAl8Ocl7O߼B?3l\OU˙vv~L=_}8`HP8zc\I;ft[VO9|ŭvY~= aۈ/Y{N;EE+(g Mɹ en6y~:2kʵB0\Gزӟݡ%u6+T @NpR)6.\39sc')P m S8qLۇ(ӎ׊c`,Z>hwx!;)xh.W+Lo("u(^ϵpwD;x>uيPgQ|\?|ffwzլ= FO6 Z<Ӥd3 IDATN+~[{KЪ|&u]`ޛ/0ܜ:vB%9t60o׳(S"g a.̄Ѵ!3~Ž>1ܹ/Qje*l 0]re `'GV{6&oyFQmWl@s/{&U(_G%ئe2B =LhW2#vCs:ŒǢ־m[ڵLZc#|+%o K}<ߞ?Y{/ff gl`ABMHĺlޒW ϟlU(NVm9x%w 6CT$Q(TjێU `UȌ9#}/ė "z={ grLWVu{2w;)k}l3:y"/eNV-CbcG-{fT$Q6tGr':(A 0 &*.||OÑ[~F iٴ4|yo=FٲtC5 |r~bְddd&XQQ 0oc4Qr*3βEs+ڧ0vCp6˚NOwዮ@;;Lfs{7qN˜tpOfw230,\yS]뷙?jR9QԸpUhG6ٽ+!P,fFrj$&5yIأ0 OgeLLi9zVynPy.> gcuƎGǧܳ{ti7Rjrmlʖ0/0˔2=-}a\}P[(yg үcR<#H_S'og$YT_-ß ݘy<:Cg)<|';[1|m7ϕE._wbor ᇿR~#' s/,Dl #'qQ ;`8y7G<{pDS3A]ysSC:BGɐOėG\Ų#yp7w8OS8|){q'#PgvkK~)Ӄj+Ѐ2K[,c{tc]XUyvZyba2\Z173=潵%8+U2ys`#_D=ewr9|urz#|߳3⫾iY ;6 QCKJ~=\T+Z}cV& pM3 t~> /#0)grsWhG,mQEi*7Ǝe\ѧY5y'ԢB:}˧s#?La-nqÔ)VEoZœYt2w%6Mo%P#f4ƛ|ϛVt.lb8  Ǹ;7J 0?|GJQa$G+4+jP!]-Zr֡i̘뮤ۏm_S.R>-RxQ.9ϴDlYaһ̗JlF=/|١KGET>e MpF~ޝCefV>[ӷݩ+rѶoNG*IWZ/ᝊw`d~|wޟRXG08[<{&㵡E,gj)C"?f35y+bG :??Nc>8nF1\7x{ ya@PŮ;b-Y˴AOw4G|Tm; f /;ڎ_oƮ#In8Xvӂ#!-OC;ƐۃcOJO3x'w;r[.ԟиEB %l?lF>uB(ŇL /GnlyzP@J )DΟN KXx1ʐ/>'ln^31q:~,35ϐ-E  ,û.~e{xro>q_(J᝱oS; ;\w]faI1nG2 HÌ[7RTi=$psN6n)Hqү3|طRnEwiJiԆyv$mv6~O~>8z Qڇ]wSz/;m߱&ˈrbWDviXRgw;zǯ\+ z7,ʃiM)]:zcpw. w;\ߑk3˷uÒЦ@=I{׽ED9qsm~3H=DmBY$Me"""?*O%`(rBgICPIkT,9JmJ޽^""""""w DDDDDDD,T,XXP,""""""bbYDDDDDDBŲ~:* 8ki(i2.""""wRfx2l """""""*EDDDDDD,T,XXP,""""""bbYDDDDDDBŲ?DǼz68MbggsYwԥ_}eϙ1y }+&az҉'e3:TDDDDD䟡bY_LVƦ6Y|Ѥ,"""""sX}Wp`U*؏}esPA%JǏdyj?WRl:ULG23l_WL2+Kyǿyv]=\ȻV8*QxXBM]s_"OfWҤ`nm:#!6(A`#~j\޹;N(?oa>_P҅CHT+5k왻7W1mX73&mo8+&gw7nzӹX͠NSrх .{4}5b_8G1č;:&7?u\ˌs±;SH=~Y/_u7|)&eꎈNNkS6,=#?aD8\N/B/{L}xv +ϛFA|e*xKm/öaIRnot^{,=Wl%>}ol2UC17m'v,6_M=y,l؇g3m9m͒#6J;#_>Dc'8VB>qMrO{}ǭc7 ΝFBm\_8ov8)c Gѥr%nb̘!5vv1fθmwLwY~?H """"" ʗ+gAySRFþ뷉;{ .aplBN&`;ΡㇹdOU 쮳,_das5:+&Dc<ΡSN;4%rڱwغ1~H`\wS~8벓;2>p3LMl՟֠u[)nTXeX-#]̩ QDpM|GȦ DEy ?M>fӆ:ĿDpAJjFEZgQSgKO,6ݱ܉rg.`g?dg:s' 7NN\ovƕ=feE,Z?ķ_ajt0"""""b92)be{d0āe =:Ɣ\6 } X g8qM6p]y NY q O0rJ~y񇾴i5X `@}g^;GX5+L鈈xX L `<="Sp0qWDZ e t:}{oP;4jRV2n7̃,=L_FxeיXF-P;d윭|7%z"gQ/نc2~5g6d-\f/+㻒Z_ Br|Ǭ-CE asF[DDDDD~kKmXſ>}t>m>~og|kop<'vFj>,]nLlؽ"&n 6gvcwf1Of{N 6 tra?8aLnMn3!>_3&ĝpV3- O|ȿϱ 7(Stuΰե/\@wy7ㇹ6S|m^;, YNs lvePa-aðLnm6K_3l0%!ٗOGDDDDD$=vIDDDDDD_IŲe """""""*EDDDDDD,T,XXP,""""""bO. TcuX̲e """""""*EDDDDDD,T,XXP,""""""bbYDDDDDDBŲe """""""*EDDDDDD,T,XXP,""""""bbYDDDDDDBŲe """""""*EDDDDDD,T,XXP,""""""bbYDDDDDDBŲe """""""*EDDDDDD,T,XXP,""""""bbYDDDDDDBŲe """""""*EDDDDDD,T,XXP,""""""bbYDDDDDDBŲe """""""*MA ðywu\~~~z_;""""""["0 k,8$ٲq GHHYDDDDDqN-{kXX99w<ۏ6ki$"""""Fgnm !gpr4J,XXP,""""""bbYD;<2Š"8A6-5F@P A @6&%QQ-B 4 !USս{{Vuy=U}ߵֻ9hhhh6f `&;mͲ07,Wm16Zx^q՚)I샇뵟/wSѾo8G71:>Go-C6%o,d5C2IRcN҅?YM'm[:%^8M]w!/^?H7ٻNIM?8];|]u[O;^ yzӿŧ.Zkb7?}*]oTkm>Gx?k4nzß I\oa+uSZcqQ:;Tu ^\~}ȹWƙmdz/f5nl.q]9 ]~zx)Zy zWUCG;>P|ΗS_mVHoo/d]sƩ Ӓ̆iWoo肯R/[Y?:IIvO矫OٮK}V`w{ N~kZ|N'|K9>uœ'K?_?KוUO_^U}kX_5}gU\ ?a.:]^U?ԭ7LRoC <33v{qz)JkBxCusVLi]^}) zzSS mnMmO~ vx~i-bGjg^wV; IDAT^v}v+66{W z5Xj`UaL~o3EqyTm7nԮh|BoW{o4dK+uNV~cn++=;_SʽyܿmST*Rw]3;=]J+w^ r}o?I̓7abnY{.{{Qz[ҽYs>p>r*ڏUPiz^sKffy^4x{t3zNeԽg\_ū{<[*nmsۯ53jc\ox*Tv~>z?UӒ%)_֌vC{>lkͬ_/xV=ok][֩R~f<=A>{?JIMfO~J|,]foRmTxV=ok]R{?)Z{ֵ:t3˕z׿X5hCuX-fyXmohۺzS#^$vyqa*fphQ}NЉQڬWhjCuݮ3^yVqe/:/;kꠃ^$Fsr}-=H>Jg\'k'y{үѣ^sV:oԣtػNоk>7\uq7LKJ{G_^uS+iqϺ]gzQUVG<לw}=:uA//CweWuLB۞mݒ62-U}?x~^b>^bŧk?S$wI_2rFU1qrTU4eRY_\/ReIto'3*ϩ쵪yJLb~9LU*S/8Bohy_p*e9_nQᗎOzT*+W[k(ﮛfEOʹϣ*5{}0O;cNX~uf$Mc8#rq1k0~smle{q]J޼TbzSmQW*zOz{Ssz;\ޠO}£wn^Hvguـ^ɥΟO}R:(׶`R԰WS>Z?~87;Wۇz*%8h!.o,uM.ǵR}Tz2)s)]jGr[uo.n_bSWW[KYA\`r5~Aw(j܂tA)9b,~0^< -Pj3|^.՝c,&,M6ݔA:k35W9Iډd R74VJ>\~+M]ZǘţuMY^H>T|b7(bۦ6f9ި:66^0˹4 `S{܋RkI4ˣH?4as?lR11'cf7.Xts\w^K>b~Ţ׶nYn#h<֦FǽAuSb.7w%gr76&`s0_|zljl8b|Uu1f9ſ3xN}ՏY?tL[Gc b1R787=a<6A},s~m([&,7i7/7ƹ㑋\W(\Ư1SCd5ԍxǥOmX(QVoGuqX*?+b` $SbZ9NR\u-x9nmXdW.T_e'cǦXumc3JoXTM*&uG*翊mkV[7]>kbCYߜl?yJҽSn찜\,E?\imiaRr#`>Semԑ-)?n45ҿnf x)i?M|%Il}bA?XLٞjBd_ u^9mjFМT }gk6/"t_Sf؀?5u>cVnc#Jż\>$. Zש\֥T_aiFnj=紵]7\\켶^hSRy$6b֟kF> fX,y:ruEPrtf7!ﳹ~cVPM̏&ismc-&b>+kOz*"3'iױkٹ}s^xb=IŤ~ֱr>tϭ-jXb|3~n3q_<_}#W<.:{7M+S?5$[+͝78/3ڑxGqO.Ր8TM76G7±ɶ͍sQ*hY4M)sk㍷F?Aͳu6}nOjԏgx#y1^ ,W޴hͩ~8>A~=5kku=q[\9ɋI۹0>WJ7op}om5cm<Vc&oc=C[fR,Av}\jJ 66žIƶi6U?obky/<vR=^󱘷Ro},S87ʖy꺶akB5QbcLua?-si~v>k`Kڼ_Sh;^e 7/4w.ƔT.]=tF168 o<웫󍯯rͥf_~Xbr!7ܚ]W՟۹m5urrs;vx}> ؔ&u{RakarMi:cs&4^|.cr͙}^QZ[o}Q445U?g5isck;Sqyړ[紭6UmX1'WhsbMͫ5DZ6>9Q1u=զ)T,q7˕5`TL)[[3[z;5/YcjS1)[دM*?R ԟǸ緸Di:g61xGfךXi𼪙:}ދ񸎚ijb>oSdytcoUu[98yJFxl/*לU5b>"f?85:6SfBsj쐛k,f`,LVGZ\h3y?Zkkǵ^F9}6fJZS|7\h-4W!f KkmO<91g8iҥ@^ȉTX*ԭ9'MkZ/nJf5ŤZhٵje;=Y?kq?u?b\N*H6c*VRk}ֹl(rbJsX4׫_h!ܮ2[bKƹiKxJZ`S{:ZOդUqYCۦ|S{cm㶮.q5K&Ħ2G]>&csFh'Q׼h|<ĜcT?M3,%cJf.,Sl1D5qN|bIS{Lk f\Ry&7^[i:}MnN9XrMkKSlrsuc*&87qq4xn|~,; k .J:5"6?OFY,S|]u9i~橘_Tc.mcMq󸎣\~ь;_]N7Fү56r~871ִƫ4؀\jqOۜ_}yJ].ɸLLڏzTM\wYuM*IzѵQ1Hs61>שXRWSd܍U41^yc{x*fr96%4_u{RTLJ7q41^y.[DZ)GSu4jq7Km׵&58bF/u8O5q5dUg:e\5Mjs65`]5`.ϯc>US7z\n+8lр1J<5O틹8*bqG/uqӦMMkhڞsغTkX?Lm/Uupi\5xjO\1Mw]+lڜM4Xk:cndS1sqΙ#㩘K9RTLJ7rIyjӦMMglڞ{غ\SL]3TvO)x4rX'WWҵqZ猻I6[mݶN!mj|SRT,lr _7MYMż\>ߋܺNڶuL)r\㚪5Sr\4댲Q|.nr jnjrs/WORIj;t]juy܋&]0[=bM׵s]M&]B6V]5kZĚ&mX6zmLN5Mk)3,tz]k)bM\K阔k0nrKc,SR51R:֤랮CеZ/mcjN.ʥb)1)uO,Vs]Mn_x*SW[ظmrQ6Ǜt׵~dd +^g=6-].&g\6;̞-f, Dǫ۟R}wSXw\.sm =ca_ðs0M (\[Þc}cTQ^({4v5K-MWMmSMSQ3ޱXj (gQsՎb`j\mmۺ6F9({j6VQzޮ9:e\atokw"r#6ku\c64mkk"C68k^\-n_ϸ7LrjZuqZ Y^Ӹ3Q˭Iy`9TC;rm''}~XJ&Nc14 :0I ո.u&bck,u9IDAT eźmMR|oK5X>b3_6mS{0NecB=M1NQl=1ڤ&4XhG@FA 6-5ںYS+"""5dfݺVcX]#""":`nIAwS_DDD9kϺ-6m *6~nm ٺO65$"""Gs ٺOOZZc}{4#""hnouߟl^$sj}khm4f[Y5&\6ft56}h11&~3%[-[a1d:?]ocm-54f[[Jwd61V툈Hr+er;Mw^:lU%`5~4f[S2+"""$H37՜Tj~mV4Ll ?."""Rƌ'KWCbM~C1%>j,"SCbEE!X:}CɊ5r &mdM&sEDDdݕI@dn jlѐmMf:?]&Zdsҝ'"""taylasjy=Lt~mf: [ 6/H6EDDd*& n dMeuLo/]^s> Pޟ{Q 5&l]^K%m2`3xez[٘oRs2t版%=?~{N>גi XMX0asjTQdWC\j6{N}=i?ҽtM=/٘)l̮@T]DDDoQЮ}1{^1=i?t;:eLB)j^Td3|h6"""} rncϴ Qm[yd2?iꀕӝ6/*ͅ9QmSԜvz x2VDDD5&6j< QmSԜ)jNZtAfs3ҔA*};MT~ Gm]ظRT@T]DDDQϮ̺R .jә煅N{ˤYmS>DDD'bQhL=V-~6fϳQҙΜ5EhJg *y:l[nϞc# [@Ը=g1ۊH5&FL{o-Ad֮dkNڲ_siuvƃOǰuޗY皢Ƣ|LDDD֜d-j,a31~:/mu.U;J%nv@cר܀=^m H]Y߃ av>5  jɾ`n0 _+$+2a)~:m!l $w6Eգd:!a/m:jt,sjٵivhJdc0V:v9Խ| j:v~*i`}H^ s3Ol,X6~DՒI6'XF/vޮnہ v-lm̶oK5."""M+UXS!:f s0'nCUW˯mQxq*-߀yf"""".?QjUpkof:Sa7*47yA?n3tX6k*Wh9-!q='جR@YDDDiA~ >V cAhYeMƛD3M *Ճll%hAۜԒl_)yrSgo8mJYw\lfLrX0Mla57li·A݃ixIQX=-ƛ.53t2=""""i95v0qjkv2adysvvɬb2 Km3cAukzDBpk*瓗_DbI_J'VӲ.*+I97ֶΜL3t>z(8Oygu1Cp}\.0k{Hlܧ799|ߦNK7[ к ao4Cq2͊и)`_7ౙ9VÕWFN {TǗH$Hxn9Kϡ|TWWli1nS4 J4p98uuFDY}lܧ~ߍ|&&e`]8Cd՜~օ̚=]v܎ {cMq]駜HN|M4p3 .7XnNW^r!nV/; -ԓ)++UTa^f\m{)VWhzpvfT-OB'X mWr |R*) OOf~߈vϤ2hCnIT30YyYDVXqAW.ܩ#7g83g+.嵷e-s9!@N<?®;9.;U"z8}z`3~◔-_n jwwۀO>%Lfϡlؽ۵/uVlM5{KJڻCN|T_`slDib뼳[yOyg&L_ߦN³iԱ:,n}7_]{,ן%ND-`ٗ`mLWY&oW7YAs%٘Chpsq[i ]MsMcϦϾO?GBm'Fnݚ >_~?_N;rܑs7S`!w ̜Ekg7sD=]Nu"A\}A./(8oC9s}C̘9 }qMm/|: Omę;EKc/x]\|\L:[l>/8︛~X&|3;)fw4.61F7;77X]Gͱf {nSgCpkpmeƂv=KcT.s)tv|;y zu "٧JmpߘG9{kϘ9igH$m4,SWy5yڦcႳΓP*+x}I$|\~HfΞ7}MEUa3[nʱ x] @~bf s] }}I9ay,mma5&[gY:0ɶ_Ԯv=Xy6ۗSб>qp.}K32u]rrrxy\DǟbqI W^|!?o3gͩ Ove|ڵmS/&~c,;p:P^}mOԇ|IuuzaaKO>u:^:_jC}v27:a %u7S-7?.繡1o aQxzo&yF-V*lf1SSaF=jۨz jJm^ퟀuX`v y^^BDSG% nn5 rZUUHTBŒ<\ v$ް7S_CHs]gxvٜ\wl~nү/\YN?ژQWt7~"Od>rx'tD|#r.]u9]wځw?GdS;ve\6zA7SUU)𷓧pu7SYUem͸s+C  09;sYں[~6~q[DAfs,f-x秽\ץNͯ&Z8{(Gmh n1M[l>=k5M#o3N=3/$"v.qvc[d:<+>W? ;lFx[&d(XtaUXjkf@j}s{9lJ;4'=/8<L32P81#5fO1R5?Mϡȭy㴓e=|k<3/Df4CswqaA3~&~ eGF-^̷S'sNsSX\%Kh߾= G{6No&թHWdgۊ4w7&d5osklA=2f)4G1\A4n>A5@ ٿ6fYUavk\;MEաW ͩDNf?8v?,$}IOflZ0)Csc=h0ǃHz )=n1՚5̓6%ۇ=1ac (""""}`+`MԣګESd'{'#XV'#IO Qus0$:4#^1/Ov;6fk[T}Y]~QmoZg/""""H;sEe-f簰v;~X]9͵qu/fTY+,EM>LvY9]a'Ձ{̶&av۬yZB}'%[TK3S09)fW7?#""";C-ڮv؃kv?A; ʐǒ_塇o~gr=t8a-՛fѾ[1?A{$<fi6);9ڙ G՚LCs:%l]TOL ϴ~9.yG wkS;ȷ[˹pGEDDD5jvsWX\k~T͖Μe;4g}P3yA;l?>&s c.u邃7Mn &q:og.h6<_8vmp(z:z7NɷOqg?m)~aw=L.6t9@yaWإ&p<3|%YsWԘ}9Onv֬I7%I b2- S~ҭ 85i IDATׇ=N1Ͼkcdq{0F6<|:9Nś7̫Shp }̵WHK>}gmOBUv\GlL˪5n(f}.th*$ۜni77ͥx"|uōňՆuwrC8ẻuN;??>ƿϤp(кۣ#:,"""YeZ lgdSQOf( r 'l)yGq3A[Wƽu|y, S6oemq(jS%XA~xdEDDDVjMyyF(j}ݷ@]zBSDqp9+Q*lI~9`M^{+C8e}!pFy'eﭼ]g kp<~_x/\ yzG4 w=2g\ $jk j:TQv~yA7,AkɬC:HƂimϜ1b` Pdc. PӯI5ߩ-Svfo.3jX̥b<|6ԏ=JO5ǖllk.gdc'&'n/廧og/;F}>Hf e {@Sr~9q5g+cgRhnX]ؽd\L-%8NE<3b+< Ϗ:1n v}ㄫ˼6JzWL>g=`;r.{o;u$V3/, ^[Ǐ>{lڭp].""""Rhnz(N w4Gj?J}ztɋmO1}ni77ͥx"NΜtPD<櫮CAiׂ.}ڭ 9l3(l߂Xڞ dN͐K_wh_EDDDtMs8ZӯbS;ss{CGqqU,zThҋy&ϫuaeď`ehv{NeSh1tBxP38-i>eqcW/ FDDDD2`E{x'~:up, [>_(?nf=(pøn\'ZE){ۉH61L9%T'p˼99n@^3T@,PW.H(aqylڍXy7ץ{i,K@bL)7fGHL畛aX:FҙK>Yȥk9km8vpFyCҥZle<\z$&LOrzv8Grp %TwgErq{%'gZ8a۶HDDDĵ:EV^bk;y i;@XF?nr~v1x_z<}\xʷ.y>s=~mTʽ1\KxX5K81p_}5uU""}}ʖ5O$7Ȝs%P]$*oq'jԼ+'_[ #ٷЙpX?dRf8ʮ҅Y}ppW l\DDDDBIAYDDDD$fEDDDDRPh\D+zPh Y.s.]FAA>(8HsB.]:}{Y',]iӧѹsE$S BV(+gY8C˖tykH& έ첈:E3HC)4Jf""""NoIAYDDDD$fEDDDDRPhIAYDDDD$fEDDDDRPhIAYDDDD$fEDDDDRռG5 {DDDDִoW$]y1z9w :S;_K}o-'ǟ~b~]sC(_^FrXSxjFlق[9$k.|4zo<l>zӅ3""""*geL/d`k-ڸXR퓖~,"""`NI1ȏA1bWp """"눯Tѭe8|r iu7IN2Z'H(Sca <}4#ρ"h=ZE9V*#wwZYpV\5> ~ɷ9=@Z^硌xVt=v'l1l@'{vUsǒ_塇caKA :F0I%꿎ɛ4g_s29MBȺψ@_h(47\?>TMຣnUqK=osOs;Ͽ2ӉF\+_jx dn}9@t[Kzԛ #.y71;EfC$8w]xo|7>i_?9[=8rOVu\D; Mxk!;w,pzr![QR]j'ޕKۭvf6t,pq 6b;`\6#C۲/C;үM'Vl߫98l=: }Ǭ7=^?Ge{:8tك!;ø*lf)=ؓ{~y= jhƮ=ZQkؕ|2nގ|NO'3WwZ1m{({u\nu~bJiK*=bKş7ouN=_{{LX{ =]v[#;1nlUߧ|.h /.kfBpTN Έ.X!bgH\@촢MXYhS=%UZ2~~}+f.rέbzѺFx_sICU,zTי)}܆8Ssp7G7ye/k.Z5@…TgtףGU9l|9>mR)lE!KXTtGY_2ܱ^'dbЅ\{;`tR.>p݈; uUgc?Qu';OD M!֖m;rॏs-ona)\55w/|Yu<綦ueՁʯ;3o+Iv4ƩX.ؕsΞEU]buӄH\zZඤukE b 8nۆ-[Ƣs; b.w{pFgoj^oThժ,OݳXO?c)2uأ$%ŋrE_Ѫ+p+"K1xߖ|ȓ|[\sE'^yz<*}?cN10َꒅ,ɦ=[)}>\PԦ~cveMxv{}?cNb ~eꂄWQ3l,{c TJ5MeRhl79}wˈsX<7攇FX_71c1lq ~鵣F ;nD8ܮP3'wBkQsmpjkmWd ؤ%W_f:=Ư}7ޤԼ ׼U/{kI%n~t\Sb?WZ9s3Z50h#cֿ}"kP2:udpb x{nwnSkaWKG挼+%TY}{F溨9O}QnKctkuLsV8]q]W uSqcֶ͠f]Cum͞*lq7Ά1&̚U8a7t@<5fURe*q?ţt㌙Г#Oxpc!u\D; ""N  "")4q[ZjdgǧeΗ̎ؿ мVU$z$EDDDDK """"")(4,"""" %ibڷ^3ChYP`d5PhNC^쒈`|$Bsao""""7],""""BH """"")(4,""""BH ȹbIb&%qiSuȺDƾ0?J_߲VU9SQNN6/3}~mF -gڴ}ޤYf⩯Jq]s?Q5?̨߫iwQDDD!inOzҖiU!Cwo49 }/'!3,̣Clk ^Ězsc٠nժ?A%v}8~[L8}ƐMmzK$'S_DDD 1cIO|yf]Eyy9m۴qo\4<됷Ϳx?s=ڗ;mZM||#'}dzv/+c /n.3lO,0!13Ҥ_DDD X >>㋉).?81:܅35ʝP!fWy_37C/w 3s!WԨVyt˷|Ƥ(=sB\o< ޟ?žI(/v]j_ '㧲ņlվ2q~ Wcg wL}^^8#wsl¡[|lMa=ݎώS!~<n<&VF IDAT1/{ hO58tR>3n~l?O) |:l'ڛBM=L[Omf6zsBg'!xszwNY^O{O o">=;oՓV*Yyf, E Ǐ|IPX\(77kٞ)oaδJwe?og _,*˩y.xAX4,:R]Ysn 68q,rhVQYH @)wJu, V$g3N1 ?-p{֛˷ U !?ˉ8Cnn.ϼwse/2"X5wnϨc6dǏq;3vE q[|3|TQ S\~q 43zڱ3 4sw/-s0OxƃXo~8j=/i! Ѳ3{w&ҏO):\t.>l_Z.ӷ>c ^9i}90#hGR]c ;N%+s 0!|ҧO|zObi91Ǐaۓ;+nq<)߾:,gkumq/~2 }+恻xu^(nW ;UquG$o+yOتz2s|ɻ}o|<3MstY:@9Cvu Nv>ėn[ߐى+8{nm2y?WV`n;8۰-mf2e ڑSDCd̮M6'hWၧ&|w35b2~g-u~l.#%ׅ;lujK[sAo.>N>0gL.oo=B'k@vݲß6{ޙM!dt[En6*XfqZR5|_Q \:־)1VXDSs/Ϲ;ZyiʖԜ=_mGO+(_Q^^-sVMO2g5 =r[w)l8.עE͙jԹqZkj~%U5g>Eg%?//ǣ_}|/E>n/ =?w_ c:w){tЧo3ԭwm_x;{8{'$†Ҳh-Җʏ2Z(R t@h)e#ĉqmYl-[NH x(};N[_}uǏλ?aTf-}s[|>l6M͎Ci(S"s猉wip㸇 ogq=h[|ПkM(핸"RtKC QRR|S3!KS6C5|`Ca4졦;2̔[@I8vn>N>g ~UгD&RM|@Ŷ**yXg{o4WimZ?6t1~?-w 7|z~u '9PŦB.EQe?Wm޽_<NeFUӫ#Fs CY9-]ÏEbƧ̆įOZK1ϘZKO$+8B!4|ڂǑD]LEb/c]8 9Tߏ{{9T>[q83 fB~ɂ^Gi2/mClk9|sI=V~Ԧgxo/#l6: r8?s7&[,}xs;dهw(Eȳ۰.]F[B[(U\L_;a.W>xͱmRY7Er1;1yK徻俕iİNq!B|> g$4!&r;` ܛ,#{X{jpEdB!ġ|i!M7B!>)IuB!B!Y!B8$4 !Bf!B!,B!DrOىK^NNѯNRB!ħGBafZM4^>5UjB|ժ"!DLeb%+H| $4& {M\k!" cB!CBB!qHhB!" B!B!Y!B8$4 !Bdiq,B!>$4&Gu`֛XҦGV !Bx$4V6@˓=S˚Yg_ߦc _`hB! >DnY&~+cg6kaiꍬETZٴj/&ZQZ:̩ 3cR[7}:omofkIg_hjgœB3G!BϜ4O/oUVVŗ\劬 H16/VnixT %гn-kuml(`8 z~xgyG_|Laг}%O?v7J|'ʇ\7mScq$my߅{7:K+ᩥ{=~?ϼu%gfƿl'+?&"Y!".q&Oį/︃__~9SL/sM1_0 al}t ֔k0}AWq&*TL.Kffиf+|N?o>I45ϝ+W~};'Zeb_gɄtG&/ƫgmLB!!)‚ظ1<0+bD6g @hN;n,2%E0ʲn¦sB^vn;"}o?)7"G9?_]Xɕ,yfŘ43O ]mBgD\fhlyz ܯrݟe#8dJq?N3ob)B!_2|]iSc/> g flo x3'GJ'q9/Jc^'a2)2" !B$4&;$Jd,e2]K1" XB!Eg!Bf!B!,B!DB!CBB!qHhB!" B!B!Y!B8&79wAa B!" B!B!Y!B8$4 !Bf!B!,B!DB!CBQjira!B' >Ǐnx3f aD.B!B."Mu]7`я~Dyy9&)z|{;oS~F$!q9Wq\=.Wûן]KJ~ͻ7ݙ%QSy#=_P;wSOfȑvis9s9~9>:=F ]20a&:/?k>OJhx KiP\p6?L}f3}i|7 muO`aF++x.g/K߀ ?p/xqvGd:S䮲J^s&O^3t_8Mq-gN*7P!d5pݑEQ&0 4M.n 0PJq7 6 ?{իWǸv~#^>KRmz!xjII#wkȔͷ_n{;Ok|q~i)&0_yOfAðQT+/Q}BYũp$gk/5"(Ks숤%d$4n7?g_!WYY_r).+j@GN wK,aS ٌ-9<)ݕ쨍|sѩ^~3Xh=#JΟ\.|3v/w<%̉{!%ew_eO婫α3r -{y㮋9cѱ;Tu|\/N[ȼ9;xmw竧K͠!{w]+ιw{)sx5+arCd~ϊޭ,{c/84̩|[3Z;#n?mwn-{Ó:rYs%җ98Vʠş^)_'6śE̙~'><~z4|_v1v.c9ԷVV?K9y={ܺl]xa~q3o.ϼ>:Yuz}n=11'$v*k}7κͅ'bwW{+F{&O;}AoĜ9G !>O$4v;\|1qG\VVoc+*XfMmvn'Rnf#ZAws+ kSV94^#p_[h׽<Ӌz?*)=o-[;yv5Ť=/,凿xK_0E_ݬzvN'm'%Pk:ot7KWK7h.~v_- ,o-{&m](ԵI~q2Fmh oηo?3Oa;ص|Xu#g;;{mngnG`ִ Kޘ=JbN ͯ 3neoo'S~\kڟ8qo?}Vpz _ÚL/O*|O( ݯ0hY~+?S-o|Uc韯"'1~mwy6/_q=WdB|nIh>JL<__~yTp_L6ӦEbBӴ6잳>}μ{*|o-μfc15uz 8(RiV2-df>k}Ba20"VZ_>[ku&mfKL˴aIgMwb勯 1)جL:TFoE1Q2ir.ea(0||O8$DGԯR(mC].hW;tO[n.6GH0WvݸbU.V> lj2"W x]T@FL;93lq3߻34T.'1/.g@jYiìB0>ˁŜ@Ѽ57ػVfs3s-)]<=x#>cc@5O~̽&p_d4|Y~%WaE𯋕K~O,f 04-g%ؔ9rJB}"WgD)}hn nnf;<&L͛yꩧpSvF)~$0<{0㝻wUR;B F-x4hbgs> #7_dSUAȸHJE*P rwpoĴ!ˤǶ\5+cj|K *]Ci6޳fǜ':Zi)& Pecz>7"3 οno?Q`4i?0^{mGy)SD><-%3$ Z8c IDAT=F<$͙i;{1fC NRN;%{P& s[03tlmA7мm޺%^Vqo:dz`кanI'?˖v< 9xFJqo--݀it̶ً2lgک yQ^B4ߞ|"dGcW_”9)TGg.yj_ rKXFfZ1N. e~8Xϭ9̓8 :ڞʛUvEqg0v4lב_+!đ!=G!p(..\UUل]vtR">c.e7q瓜 {W8q D6i׸h?z\ >c^%'w*OXж߯5P׫u ct7UG>XOW }> Bi t8fD>mخ{F`9B|544Y e+ZX248k}sLjd1't۟KDLC}i/`LB@Yg‘܂B#[FzRFn0ϟOyyyϤ/0(4%cCU}Su -mEGN(MY7V_8 E'}_҈uecn͌" SoCjc>e2EuǨ|JCzNB9N!/(7!!A00=gZ!ėf!@i!_61G !B!HhB!" B!B!Y!B8$4 !Bf!B!,B!Dr/w B!8XɊ,iB!" B!B!Y!B8$4 !Bf!B!,B!DB!CBB!qHhB!" 0iP-Ş7*?9>1Ϟ}lxY#]yc'>޷9}] !D,rmT@0'HO#wT23FBQ&&+/Pt~ ZطV>]aIM&or6N&jvѩVRGdS4;|FS OB%uUle9{8sT ZhUɤ-lz%yde ׎s0JGw}&cX,kF*׶`.ƨ"S_F '3Iq~}-{Z8$ݏH 7{߬5Ƴ9(:11Yi?BA{Q HW¸0|;\OEI0%->Gn۰X1+/jرi|=tidM/bTRZBQVP`a``FO oor$_0;h>ڶ@Na ʙ@&̡ 0g1hsIDS`w`HR^îz 6#"xhTG}OLĢ4CeIӒ0E<$_k+U$"2,Sv$tUcYBA44 HHK!>$4AP(P82S(cV{:]du]%|JQtjS n55lխN&H !zީNΤe`Fxp MpBIֈ+Sch8fP<1t j9ĆV%vkiɤ&6ҁP̤)WwK 'Me6V%P:? -vQbpn0:)MZ"͍lCICI ܭ{{5S<;{ņrsb:p{>'g۪={x9ldM#?+$ivR2 wc unZ F:iA=]t$ >Om:qN/ ʖ^-R8CQ -9\Asؒ |K ID I٫i) Hi}hM(/ P P78:vjy`&utC-Toe`Hdz&N;kW(,N f_Bi(!XVYYS/["ٰލ0à{6VcR| Fk +f:CR0nVC&Rg[YGKPJĪp`^3Q:I :PՔ$p;X)~_g'uwaJb0nn7.+EaBҮV;S=!u\BZ3\?=4f׶DR$W!VDji.v:хGkgf/16:eۚ& 2?Z b3vtFn% gnÁEK$]4783u:w!j#DomaatޑB1PabY/i4$MuP[m`f2LV2bT}as&JLB&L૯j>ØCp(75*cm l+{p9cjq\7B1DO {WFUDdjmih#)\?0$!dS14۶n H@shf%}L*ov}wqG@/U`oE^~tmCŖ.|^Ioh]CI?&nAkdJUD/gFֈD&+iClTxq(/Vw9q4P?""rg,nnf,LBҰش^*PF}x,^`Ɗ =n-kh La`xh3lQ)lkk25.1f/dD|Z ͠%i3{HOR?XNONw^6T7 ^ΨcȖm 8)c(KBΤ6@]I P$q+5D]K(5HTk"+tPVlt W>!%IXn6ֱe΃=}I)9 G)fk`8#d];Xi+~w$BOWۣnoa U^ewԧ0f 0./4QDMm&~ח<#B٬pqm)i |_:K&9]ecL+JuG6V"aD!XCA:ɟ$b}l2q#bdjk6&D{}I\&y|z*/mm$&^7u+kd04 辁Rv L4o-54"]mÌU玲%pRn5-݁1΢dihA)n 妽CPm$&*]zmI8m54'CcO"7Q_,]]Oc{pB0a/Bq-t:ty`Vb=Pf+VK-ӹw?so?,N[H}s`GWs`Bψ4A0h߼U4IvR0nDRפTMk.֭QXgY!$ RVrf@+ ='Ss"HOTS@Y-$H[v;?ekj]=4 [Z"s2I(|{Sۃ}U2Ťc<0؊?`ջ(ج%P#i\ Պ /fYa204S.e4,)Oe2I6I 9 FNJκN15m.Z4r&aVWb^C dLJ;`t^t2w`!×8x?L Lg6n'p3$j`Dx?g͘^]~ň8â'VʂNGނCNZȴ9d:xKȴ9p ;XoWrߍW\|A8kegDGYf͠h7jTace-00apUfkW&S%-a`^XÈ\>!1"r_w>6t0~~Ƞ6DGc{G _+w=_} #c<6/Da fWsw_m8h}EyΑ*o\MG-:{E.# D͢z~ bn$ G oB Y)_үBs(!B!D B!B!Y!B8$4 !Bf!B!␳g(y"!8r!"ħ@BAB!B !B!,B!DB!CBB!qHhB!" B!B!Y!B8$4 !BfyŕU00+yUqEofCQNoY_B-"z P&+,;J08pĺ(a#NUWu;?9Eu\ lٶ.Hͤ ŤF‚3Q Qn aq OĔ)$[ÚT7)az`]o/gk~ںuTp.KzTׁMl^G@Y 5) lJV0y$E- hfв|lM@O ߿,-]("m,NTmd 8EAdOhbIyCq#袾| 8mzX]m.F$ u;8nLJ9D{0&=Ehػ{o$SA׾mT '/'ӧ ?S=ԕFW!N"+hΚ-n0 o|z*0 M[WU!haʕLfHgsEwW׳Սg Pr E!>$4AQJ4fM"{X!۶2 Ԡ [kiqu5l ѩ[ HmAu J$gdOܶ+Sb &-B#q]39-Its h&,yX8! _S%evPE9)01v>ڪ7q[-->9S9"ӴWד9mcyoU#Ž4Jf[m*$ǦE?%! )d 3$0db iVJe0rD;>IJDӂVMl~s%=NdjFx.Z>׊(K56e gqdĆm5zBJ'/KG _"k֮,iiX]p;hܹFK CMIӊѺ+/1NQ_Xfs`}T!,a^-0{x4 *fAqfLc&pDo̅0wsښLr>b㙛[?;H?*N౒YTtL FMR킒)LnQ4yI @_32={13:>dJ,O``HȟԖF> 1) {Yt.K/q,E2-f^v=zk%+Wא2i.c3 z.*0w &,!ϧi?)|!6d2ydF>@K+atʇ[1%ItV}L[8Ʀ(vN$+Ի$tҮ"f'f-)x0wO!fxMU,[*5$8 `$; lb!gDBȴS 4/rf>sǒc ͠%gH!Ӿ.x ưt&0em@%jʕB)-,0x15ș8L R(.ΤqwZ0)EzI!);PAJAҺc=;ά"G/J}򇑨7kcѶE6U2l 57m +@!mvQg/ba^Ma.&=%h~>H!5r=Y_t.9 a#Xr#cՅ,Y*3=7"6kI(dJ*Z Uq(>/>LM!LfL9@%3<7`BSIfTf%P { QbFÊH^Mk$8;B!rQJă6n! F$r{5=Voctz r+,v޸A09X [R2ܸ=ԭ{އ0=^\u+y:X^dxլܓ̤9Hpа>(mB%(Z͌fD)qϠc{eGoHx1t3 bƕ&/)2~ {+0|VmT"I|1 вF0&7 R,d7fE(gźv@Iv+kW}@K6aR:>O0}sf;Pʂ*VN;>ݽTu*FB޸71llZ&ʖќ@, Vl6;ESgb)гR><63pLJDkUu2qxr2MUcnm"x2$[S_ IDAT7RAzJ'6Zz1 {R{ǞNq,ƺ-k$/3v6hd?F][FƱSɳ>l;#!Ca 42teZSwTӬh@r8ֿΦ6Ƥ&tt֩c$c_G.G2ɟ6Ql63Α XPebq;7Exh[v:J) O'-.[]-J[:w`x: zhUN&LCE92Y{[s( AHmT nt]]GOJV-t weo;^ w[+.뤥_nv@zc2\5l^[Niغ v֮I:]2awH.6MG{oe͆ݴ`RL-:͕3enn/ Gb=u4u޵}:J!?J*Zz &Ǟ~f*ggsCvz" !ħHzac}Yr,f""=K3&w oLc##+1}L䭛Ϋtxt4kY#0i:9*شn9.Ɇs8$c-~D]<s|k6k*LC~gLjEK+=Ed**LɄQ4o7qXmLĂєmWv`ɟ :^kp2qF*.m^GUK7fœŨ %?iSXip&<@]!8Ur?i]͋l`i?@}C"!L=Me+y}ݒBؙ4^7tL!x S]el\@F &PJ:r:ֳ-tVy>* XLdr6YFgfj2'VʂNGB[L!k!M,!-`0_u}7^qQoAg-w(׬Za`9, 0]L A 0@zc,ܷ!FX&/# W%.o?:G-O!d-z=7}Ou ](>B~>gۺ1I{koj˖%۲e+4hq~I~YlmVӴqF4~6Yv%koj{pľ@AQG|< sp7=8=nԲ,H&qWBCq ϝv´:!8{ⶲ_x+on݀g7fҷ~O~d9?OYөt0SYFlsܟYs&\h4,7(Mfi33}6NO] ZʬzRpsF TײGՂUn+xϟ`$9S)Jo `sSmWj]9M^m/gV&N46c^g/AsTЃkr/1ϑgb^A)x48-uZYO}+x}^'GQƢ`(_ULou ꣳuH ǢMt6 Sʄҫ:F IJ 1|DBµ2/.,Y`!J)RjsEEMfJ*B_;k6(.T40}=)|x 39YN SM^TcXtYyC WC1Rq4hҢ+#郃>hc-Hkw`V?sq0%vǽ]_@#}A*i>*vΞb}L٩ھJ 8S]yB\$4 ɚ~3Hvp-~f9>6v;%ʨ(NNck wdVhXowg7 31(>ZN2WX|n*W),PP? tCa\_<=kv(Fe1/0&1AoׅǢ gX/Q)|Ug^K$5cxUQa$eK&Kn "]a%AJh j۝_uF-x ʌoATݎDxS*@@M@ڞ$ECN,tuƉcƷr0-ÌG ?xl:ͽ4e<Ɖ݃8n*1ۯBIh]f'<:TcNAx3Ogb2Spp=r'S1b8aFl*jV(-0.m=BK *?nB)ŵ:Ì/udz_dwޤy t GO+ͦwaF[G˩&z&.htFZFb_z}ݵ+ehFI ?5(y0H&^mut0I5< -(#@9BuקCw܁!,+**1T0Ls.S3 1D%̫`r3G8B'-u+׀hN2xS]^qn4@+v686|ǒQTu%ty)85XX=94G̤o8ʄ9s?}Ǻ2C te4& !+NB lޛ. Jl&̉$ I8mb3\[GMPe$P*'R@MЊjuѻZQ*pi>r ZiXl *-eP8ʊ+-jhs;;hqgzO(+ހF{U;:D_{Ta!.MabK$X:0Pqogκa³% 2+1ʹ'mxf[ h=)Yc S 夤I1u7ޙ/Ұ4 Y6BW]M\uҽԹn7A_cu g̻hSFH"hn$uKd#AQL5~}`F|^#\(cd(q;S L&̦$#5<5nR`D$HH@)enG[QP@aUǖYC @[g3}M9T:=h#X @P#Nn:zܱ0qiCKB0a+pCIJpL p0mTsĈӳpI!LϴK<\9F0HRJl2#LTEkڱv Kul'JJ c!cfqYQJrRh|Y3u?ƸTR{ߟ%7PV e,Ius䌍%)xCd^y[m{Z6NӞf[MXlVN9)]b&QqC%,\G۾f:u gyy^+Fh3cĒ ͬ(4ъ pK )mSj'x+\+;Kg'uS)gu*XW!FFrdPFxqRd(2SP;9{?5aBQʋCTPV 2)td*cLV5lV|KʩhXѳ}'R( g5^lwb/eOqk3 !+B_~򵛭l<[gECisC,Y#z3`?~޷U07<ϰg^֭]P4{ rPi sY$Xrsޖ}:mJ孟f+'vf Y3}.la{/،c?55c_Naf_NGi:jIO~;Bf R\\[ q[Ybu c ?6嗾/~$3șy^ϚNe_'SYFlsܟYs&\h4/3L\CJia!ynFP0UF5ℇ/Ϝwg+ϕnFYܦmɝhzȳ3[ۼų0}soejƱ1exh20=κnG!UMB:)7U&!pY-OB!( =:p39lrJsw90F[i@2Vm]߮3Ҽû}-{>Qj7oc"9t/lVuqUof߆ иyv,d2%ٷWg7 @alʢER eӞ"W?;a&VWcH^L#p~G9od/ӫke^3K:"/aE-igb+[yHҹQvWy{&0BGy8+n[Cxg$B֎gluSvwpT/ X])_2bDVMY);ZZVfBAP$2󈷾#na><u)0ӱYvN;رR-=gyWm,fNvD<#7Bc(Ou2e ˨piyCDRfYNm'487^@3F)_PI_S7!`1o9A \Z)P-jl+Ph&? A>YSoyǺ,vqs(NJfC;؊fRmIpd [5˨(4!Ő| ٻo_nQ^֮|3t 9\zTh! 2G91b_!jQ2/N@ 7oܮ}Y'=zptp{(h)2{(_~EwTr}MWa -ï)438:A('*n\K `H$"~6=z)[2#fUSBX5 \aZ(]s$&[N97n^Mi3|]{:𮺞%EVKgkXqmltLWS 14Ȉς'%4;ٿ8\5bb)&.' 4qVD8ƭܺA {Yvb-qsrm=${Bcwc:9ƅxf2!xEHh]f'<LjcP^$gW Plf"T{eG\\H@[݀AF(Y9̈́R^jk46v34@]@ )8O(Yu>g5-A8 + bx)fj*ԯq,PL'B) M -Y7E*Z&y7BI':=/ϲM!ZFMI#m#[VZS-2ё{i>Q`P)/rs8`m;Jo?4"I_K:j}LJQXWL=8]8- rxu5zͣTP0?F_FB״E{ Y^@)0ðQl 5]9GѲ- \ϯmY b*ȊEY9FO;F% V(^\+wbLR ]jp|IoK;Zf5N=OAc& אi^( qb1te7mNϡ8TiXFQA'm~:QX3) S5QbVzX:{\Gy8Ǐ0Cߐ6 6ĉS FRp5o&9A9]L?0glvMQTϒf 8!}35>B7zsjI:sNca JSSV`$FuȣSI%@s_) IDATf;gN7̩8EXV3#HuQ0 ha4A 0kHYOLR\y/U&nBWfq^ Xpa,{lNXy ]SneXԬAӴ2#h>J:}^3eܘ\ec'2h 2@AC/Xv=7T1+}s,gv!b 4lPHK Pj8Y5YΑ牫 Vϼy''x'*dQ{븋[W APnJVZz0F|[A)PJ0z$/ X})q w*9Q9quPe L& wt,]Cߊʗwğ=nYaq/Ğ>Jt[QʂfƳ`+, !+I^)˪I E膁KHeJ=gil+ B+-t:MTG)ch463a(XxYzT 2Qt/FR߅YS㝴%'V,uIDƈ$f0و3L$)"il);S1ZYZ-WWh=NP C)gt(L0"C %@)Lv>sAW ʀ[f-JQ`rh'zcxd#CCi Æ^h!ʖ(Gr'X0J3ײ|/~[lں0>g^dlv6Ug&}r`8qCZPHXVbs> 8j3/eط :Y ()/4R`voLWĆ\#qm`EU飴D0?˗νىBb.'_&ʳΞ}Lky~V)-kڜ5=Kִ9y ?_m3r'(O(x={Nuo*ӻgiaq39TLޔefg& yӞU?.33>=ɻ噧uU3Z^933#_}z=SyXƔ`ZʹeOphY;߾0}e3>^FP8n+nau#!.psCV яu btvfh8o닟#$rO;3mTִ)1gcDŽܺ Z6C r < U7'X3t3-zp/cBRVfBq,OShؠP)~cLvp<(ͧHU`@=q U@Rq|g:cDb`y^[qxT/^yĚ3T.ؗN"x'p^e%SVzoBR C'ƈ0U|S sR5gC!w(_C,5q@BYI0əzPA*?e !2?3;Q; y.(">[4|8!R̚D)T:)OJs[8_z[E0F8!WSUxU^I!R!{-ʫlcLxΪKv^`--*Uv$h>9F:`G-cѶRl*AVOmp9G*d7NaLEo+`zXS6vrjw?[qk1ww3/eF>`b=FQJVVoF(|bŬX]TM#3@qzW5UTia`l3>jcCv OH.HʼnFxSO6cQ":Cs*N4b;Ƴڦ:i uk 3S_C#7<01 B+kĺksfաsfgrQCe"qLVV$)2:l绰Y +6:PX\fzlٰ3cN Ώ˦PʌgϹB.s;% -ZaBQ60)/f”R E,L\F8o*K%@{A: -k2khbyR ͔|L:T |}2۬,\_M6&+J)zϙ~,˷ЅW ׈܏OG0.ViŖ1O NbF<(DjbU HZSkS:dƿ HHZ'e(+8f29HJa m5L&=e0Qaڴ}uQ8T~˴ ͪ0Fr8x0J&IB+tGM0Oy7հ0O=(+nk+7IKOW:XVO&I$f`7aN$'$ t=^ыT2e {zErk/نÑ$:pӆ=5p8D5qx4#kxĤ~_A4݌nb7agQZO%9=HB\) qtQzX5P،>Cb$B$6aqٱYoee0b4jbTa Wn(='Lj@2!b9lG2\\ 4,Ri?DTdo?g ~QXi"t*XxScX+QC'1HP6*M V)&{u^6 h%zq1SP;9{zHFMн8;ojv̄2U`Wڬif,xFkr+ 5%P8q8mAý r˯F&oȳ/sM%j2uU˪tjwVB\$4 ˄yf˞^6b(:_WNf\ xKɉ"4 B1+gub! 9mB!k)"(BG$Y!B9HhB!bB!f!B! Y!B9- ƒ"!.B\Wf!Bl2B ȭB!|F/+0mo$JCq]wJrg!B!22Fy>^Vnȭ`O>$<o~swcFn!{GFKnU`䦟oKʯʮ8-|?xK1V_!{ԣ|?9a wGoYT!AWn8[}t]d2ٱc.ǭJ$l63tOXzg],1. ~5a-ypd0c[X4[IoʍױzyǗ=;l1v㫹_U>|}okXr->p^^QzrznB\i 54(}+|gO=< Ѵkz*\ Fv?(%w}8{m>(j:y:R=k Y\ϭdevq쟳b7ؖEs?ο_p?|G] )/w|{K{U24y>'(y'3ϛ!u8.O_8yFs+/eIBW4_Rӂq^|9Vロka2X|yn٥?_)7/V۽T,̖>s7Cq&:rRGo,Fy OvܗSDF~7yǝ|?wJqm}Swry/H5Ͽ-f|+q$l#On7z>"Ϲn뭼_,=d>t?o.q`dwySO }# Gk6 7eOi&LFyF'$SnX0Wsݛh;x]mHm7_zwܸk濼qv~黸X嵼_+9|7|3wq X |r엟/_7sۻ nY~埢>mcQlf,Wy[^M[7ob Ά5kXoz7fWyMmK5ϾMz6l?ȏ8:Ç?=~{nέoOS@Ǿ^u3ୟ#pǖMvMQ%xI╓ӟ>YػoߌFuu5f޽Ӟn:8p@V}yW}n9.62fR9S' >'|5L&ڴUovon;y:У_gws=q ΏGo[W_;~otTuN jthe+rG'Yyj7z+?ϛo?7Klزct <0QoF[hZdlrz#^}_Q۽|6a?BGwb+$ן/=3?[o* F ~;{7<G7{_&w;ղ fIv w}l!x?U~~x-o>c+n6B '7Xm[]ct_ï?x'_ n'??!{/I~:~U>|gӼN?pTܞT!ĵb˸|(4 ]'5kXvl F֮]˚5kxӛDWWge 2dR0] Дś1{r-o{++6̎2FV[7W%xJ=nVPE\͌h [DWn}!>9,aɂR,J qQzrI=QH0:|}_uHNE[(>JqƢ3{PSm3<#]/ח1T31kSmySVZ_[&YVs;wn+NJu[X-ΡPqc)}\j C@-d]z/f gm =kz3xBf3Tzgl{!VQ`ͷ+l #7l~]4L({=ozz~4R=:J٩.^748 !|;|0|}|3!=|9'Or:woyrJoP #FS Gm:)5JjqO&n??xCi c~ l?ԛso}R_|O||WSt%a1~TƜ`rBM`K)2jfDD5.{SկQzO$S_j˻ΚL/6 hEu ͤDc̭Q6~hmc Օ`zA)3M# GAXm죻<; ^Xr$%kK.MAJyWMquJ..柾tЇXvKwi=yJ)x֬Y|VZjV4}PA@p<>4~'DGOGinc пS~ȏ~Рllz'_}_σ+3cʆ}_y?S3?xv~|YvζL}0tyXr!~~|&~wDn zsR3o t *ģ~2˧Xg?~_Ձ]^]³hc|0pgO~O>9#%_{}&xE=)6\&z^QGEBkХ {Au?0x;sδfB(3#cml'an9Bovʅߣh=qq`],ض NObw<,k_~/l"4Tt4q,^Shĉti82Y.֓$]!qYR6A?59a/hqa`0~>8~Pm}cS6 IDATjhZ̫w~Nj n9TDv=cWUa޲oqķÞQz43Z1 (U/knހ+߼LK>Ǿ,ӯ -86Nbhn4R[Qv7~ĘVtF@+tH}GQ-n ={Qޛ"*^/v/W"(`DP[J*%${ i;#fIܨ.<CL$::cYt٤Amq.mSvyiQq9"g\U7Z 9qyBy2,nՈmbLRE͒SۂgeыxGyjaj8yGէNƴ}~?ʃMS1 Κxa֛q'oGym\z=6ld՚(Nߑ+w)ۉ@'iT:[؎t{Ir;uGJkq^o5Х[w~UJ( P=)jF=1 yk֦nz9l ھG# U=/,.MVa2O]Fuzy2*/ypx4Ng2=y{;#y_p2yiۇV_g ~YmnݚÇSR?ζm(T ,=maYvޢ/,3Xg`zeyr˫r۫*:O=]]ٺ4nN IA73&L@, ˕Զm[&L'01Sas% ei8\.u/JK{X,88l0ªR7LG\giizWp/H[]:mydLWϸCɓk:\Vxd ~21 gz>T 5OLf|=ŷVDD$-;ح3 ዌB:45XDDDn:fu&aTSWM,""""B """""~(4,"""".9w5߫QӳNDNH^*Phi`DDDDn!""""Bs&2)l~""""w$f?EDDDDPhCYDDDDf? #3e\KR 6wdκ|BMϮYd8iS[$ƌW تLv YV%{?+""""w7fؿh.Xz(޳őS=;*kCeumVF! fxunj1EDDD` ͷ۶-ݫYݑ0 !JvVn#f9brS}Tul`{8pAU?³&WlbCue%}_)',9K[+ĦVpN *T~dw7x]c8 NJ U;B-,X~V,Kϊ4!iǯ,۟nhb30zCFP FBIoP9}oXp~L5  1sh$c+2e^q =Z1N%D5٫)>`܆NObܷxglOͥj(4@7lJW!\,4h|q?&eDԼ(y?K.!fz}$J(e_KY] fGk8/~$X}J t߁TI?ݧlmT; NLRGQK"]|k03g/g)<}"oLs1wQPOmNQoUQURkSx2nN1,Y|R=PdԌmUL-X5'pbsJ{q nGY 2 TF"{iС%R& @g#JQ"{Q.&rq^d;s Nփمj(5ȝE22 t,]Fe2s6_Ϛ"?R$Y&Y u$peSZA8<}HF0Y$/21 #p%a`: WNNw5 İ/s|~t-S~`M!(|gs75 D&O()*4ܙ|oG[#3;wjtuY]DDD6R Ѥf F{hZ?{2ƹ87 %Ӽ\u 3/m¹[̆scSl`xgwUg0~67ŋ=e6.˾'Uvz= x{޳ 8 ΫzKlt ԬQ÷:]G4#m˅e^䲁H|mYX6r5-qԶif9@vH eacpia[,0Lϸgcl˲ݿGr#4!"""7Nɼ˗Ϸ.Т i-:bxX6wi |:R !$'S,.w9 vy.s_;y;û#uihx-0x?/^e4,O#@m@rڪrkg}@;g,""""B """""~(4,""""B """""~&7A]޷J*)u8[% 7BD3DDDDDPhCYDDDDf?EDDDDPhCYDDDDfasi\&i0-$g7pVDDD6tq=E\丷+u&N3]ύQ, .p[ıf > bΌci6kmNn &"""w(͎cW|"se e<17[wԢ@NTGaԧ84#L f$1u>}%m["""4~(8LGoeY$^')]9 Q'YX'q}?ՀTnԂ6S6q%\еwC89i)K6jp1j5mLIVNʮbh+Eьdo9J-Kΐ\CL$dOKv9&޹[`U;\g*K I;08U*^d.wC({b!(G5Fq5+HtՑ HGq䳧?~'W1*ώ+dݔqYĽ99;91 *ST :CRi~'㩐3mh>ziQho[իc>8Ӣe-VD̏X64v7 Ҭ}>ŵeoDHFsOg>>ёOfB Čh)p;9oFΧvwf|per9!ؖgҁty%xeJ bD/Y˒ܳ|誅e4)Z FU.0BDL Sf/>KGZR UȖ,}'c X G0pp?A,~}6ע;1,ԎO J^곿k)Sdde8M~OH`(4@2pjE2㙸`-_ҋUyEa_)_K3}IJfI6G<\6ias-Y2CKl+l6IVF_g0ؓ $4sW\)S؛dSExPؼ> MJL4/D5b.%Kw{5wʖwL?Fb̂Mi[#3G˙ 6Wk5[U4 ".6I\<ɞ ZNYxv)"""rQh "00ۂfUfq9L~n/|\U0]1y> g-kCvEq!Lrʃƞ ؕRGq*o|ěr: K)4dOPr8ÂI:ŪeS*e#\q_P#f_zWͤpT-,juqQOl~Ϸ_>»x}h&4-yC3(&s#{ҒS SYDDD> 7Y" /d嬻j e:s-) $̌E˘s(۬a&\ݘQ>՞̖6vE^&ύC'u\ZY(RyrT}L̝o cyuHkf.!^eɓt *;ʞN=Yx~@qD 6PF t5R46mc۞~c00Ԡk[Y#yiؖef%ei&_٫.}}{ƶ%3lGDDDnyɗ/o_fj95 ~ب@ =DgUvI$_SvymwE2y;û#uif3 L?_ 4C1$gt1]Wᾓó""""w+}.""""B """""~(4,""""B """""~(4vyߪXz7Wo(4 """" CYDDDDf?EDDDDPhCYDDDDf?ǞEDDDDts:藺 w!:T8o{X$%0pdwi15Y*zJ"""" 7}?=XF-==Wf-?^>:}NڔQgռݪ?sJĜ(4Y7#gj\XCT3bXz ]+G (Ӂ}qS'l$WV޷X*MZGP=~'9 ޺uvUdWԳg3V-S&'\=E˷rZ0+֧ipIVMFL˵+5sù+?z>B\W8~%kq&.b5ӢFA1iOMHETp>jUM.\wbJN%4mV!b_W>_\a(X(]*F[DDDu`b 0 K7f˖%z,gU6$jҋ{íx1"!bԏ1ORt'HlEfAaMˤSE\1 Cu!os8$">|U!8N۴o [R:ebGKӃdЃn_!Ȏ#$unoWSmltV'4%E;0t{.Њ |&ǝqtt C[x߰!Sm_?# p<+ E^Th@1a*֮Z؞,fqT" + ڼ7kDI|n8vXƾ֬Y9c|3m{)~3k׮dFd;N<mgeŌ{ V y'qJJ+~^_P,di(zFR =u׳1-^ׅ7|~]{}yΊKxjr6o_>Js4b%Wͬ+D7aF9p*.9""""D=7P}e1F zc|U [,g\8*Wb=$g*K✷sxڄOZ IDATfO<ص= Ja$%o(֐v4)X9D<0ƒqL]g 6NR8;|ߺuǓhuj^Ȫx Ivl,)l|GNHEwPtXf`$O{xEr_yC37$F1m[6XP+2irPjŜ0q+Ga)\Wyq. àٛ#y7pENUlkC_Gq'Vm80c6o͊\Gw;çF1`Y wW8=a`oVkN" Kק|"Ghjt{e^hl0Ll1eCglߴH<_E]s1'lc==˨S=]Rɦ3oWUL&Uv'yr'0x;Nlp1pHf'岰 gLml 5LƲ,/a``q,08Ǝ$ַj ;|`E""""Ii΄kvr@ypp8r|8w XX4|K$JρУb8;^B@~m/{Sq/=jv&cNOa_1uu 'J7hei-i<e9r!fK-(hڻ=p^2b%W>ft,>͏ÖZ= ];U'R/ l<3I`"FC^cBN#=s=.A=fOe3H1wčyk>λ=Bܲ\fbbo]C=~%7*GrsvwG2j?֖ 2f23gG[x76$ܥ(˓v]DM q7;Oi.g\˅o2n&.+p㻃iЩ21;RZRF'"j~ʗɎ \ɱωa u-0b,՜"wHGԮ j>_`ӽuSC(X(;F^vScL8'O[qX\:HVRt5A~Ogw!˕!&aO |g)\]WOíJtQ˜I{B&f:<%C(b2)ibʕ)\$} 7c³mRi'(-?#9X&#FV'y܁uxvYDC}')Q i 1DMc|JW癊A~J;ϾCJpEUHԻv!O'̮qPuL:AIT,)w9ym˦(G܃("""}Fl.FDgxq/?ܭhS!_wcU VE)F.b$Crs<[GN*c.D"iw*{c.?4JdZD(ۜbzmg(z>:ByPI uR. 18\^ݿ1;؛̙ڡo1y_a#H'ezƇ])?pCtoyи@ʕpq *Lszu;/Sk)=DDD䶒2c˨S=]:lOn;4,MymTn؆hiM{3nN:6DDDDSh]e4lCDDDDn8 n }RDDDD2vWg;54w曳u';qyN w5"""";&ݮv ͷ]B:݃$"""r YFmݭ~sݖF*O޻Qq4ߨw[<7荥$.:<Fwmb߸^)-$"'n4oڔFS9W~e޴'cED&yFm熻UCgNv&Y\ͧsl.2H tWZ4nHf]\4ןu?Q4'o ȉuyهhݬ KXx03V[uz#ѳGiӢMEWw_MMX_&6oi~3 ?ez1,e. ,No+aGb[:;\3zoN\Y52yyy ,e C\zF ̉\DėX;M YH 7mbwM>QlFz˅iu*மeβl]6v /]l.[@[ df|:{)KICysA, ke^.XR/Kam-m_&*B&UkXkMh}o(-{)FA߁n&QU_2:_o Y۔27 'X_&;>}v:K1'7'ba!b݆0e/,_4KlduzCM=__p/ׁ) ab7'3 /thCTv\q~ O`<t%5dkՓEC0RwWJm^ʳX\MA29KS'pbTm<q #%]yu4ZusP6Vg]ִ*jT^g[*bY)Ѽ!epIY {tLVG*^CK8`ẇ['S5_0&YOW8qڟ|"y8 ^|ڵy0f#l;Vhݪ%-us`taLwiMxrvnO>@Mi3ֳ~ě}вE Zvy7&l\JPt7y~=Ϛ/_a㜍|t5 \2 )ݧ Z}[ro>}9)o=NiqޘxgR0gw01A9اIes^OLcb ƺ[@`>ʖʃO꩎c5kM@0 o_ٌ;:e0R#s<X Jk ~ߗU(YL<дf:NןЇf%AͨWNEJ>_[":z/c\<ː"6 ?}OYFjz+$H=[DfUfnWObfmh鍬Nb]|b<9g-}a*ʸ̟Mfm@@ʷ|'ļlz>XgE܇yb̜ \]9/>E?p$VĠ7'2==f3bXM>-#$MzfDN{GՒ% Y>6_kEQd1ܿ%d!^Yƛ_90!QGr9#uS?Gұv~y)ty7N-Thۜ&`\۱}a߄8Nr%)pt2^r~00,3uh];{sO3Y6~ IS.L̃X';+ε,q$=R¥<>$ˌx~|X9waHN`˻f|x#1gd_07wj_^yhն4hѶ !q>|%(L1(^uc~Mn0L3 )oD*q{aY׾mNJQ|L0L ,b7e3|B:_Sϗk/R:W=ݝ:,9d @% suw)* '"7;o2dMFz7 evy3Z¾tK"OXjH@DyF8ٳSޝa8Cj^I6aUYp}%I8sX#" 1: 4Rs[]ίǒ8n9%xbZ=7Ηa3ֽ 5Q:8wAqNŌ`∽fj(cheujL)O`Hb+4j[-d }]KzF2w_M5uj^ǟn=F 5&$ثePAkƧͭ3+R+HX{mSAk0F{2/Xujώҵ'yNFѢYLE#)8eJ%niPur;! ]uPɃ4(f !'rڲ9"6H&~>R9r$u?+粶@'lZ@AZig6\Nb 4|!*d3! 5D?2èp_%}Kx eT6׮;{ :ңF,Kΐϗḿu~<֗hCp3`_%>0ԧApp0]#R^[H5q]\|H~yI<̜!_ru*9N?MF h5"? rkä*>ۄrɂy]#* TVQ1gEU1" AU֬eQ0êDI'Ͻ5SsnIySu~Tn͝=u2 fW9cGMgQѤ1[?X89GSe+GEtl*Od,kЈl@ M7}2x n䣱Cgv8¬!+?هk)} kyke&֬eŻ0Po_s6-h֢o& m L{MZؼ<:ǧ)Y*"/]ayY ׿øa^0Y9b\wЁƛ#W:wF^V (b!砲7C~Iͺ&0G3bYdyy`#Ϣeq{JƖdtg̷x !оb?qY{\YLOB\ 7<;ϐa[YxMh8*'{4l԰1baHqnob;Z< zK5k)Xx25g auҹU?E^4EiygC+ IDATobR]7 uߜoCj`ƈ|!45/L7o1}iɯ1xC>x[!yyyUlq{IkÂ#vvgFL>A{~e{pww]gVx9%p2>{nן+7?~w Re'GД9Nc/'cc}3Z(ɼUߓiNQ9˼y"^_ػ}=Nuը,bMi޴%{hVy 6Zg׮oJJ7Y,:z/E_4ְ6 ~7n.W&4IW=Tٿ=Y^:s[Czpt Y-)?w#G' `\q#V jʂѴTvI,sއx|zݸobøsLةh:ѹ/Zռ% uδOdٴڵ/'x?W胠f{c1d$%_4R{;rƢ7`[i'$oDӴEsWVټr%[M3ߧ~_[hҬ)uS \_24Űc>0w}8Z^4)B:!_$r2ґKXtpxw`iUh/={,f.9톋Xδ_%KrkC",;=apnGa{qҭY@"^y57=WNrxn؁n'=gˊ9_y,fmp@bV+}ͬY[H⯻B:qݏG^M1ʞq[EJD(e!yn"k&UNޕw=֢scQ&ͬ;9=Ysd}}i-‹9+Xdauil-9+`Ӥ 0f=<~:`]ЧeCǗxt6]\Wq6dyP\^< ߨ C(}דY|s|{/iO?b0osF;tyu^![f-+sCZ5d=J_t&7^z?y'cDV䐓K^aӻ1=< '?=+;ޭˌ]8[ENQq<;w%]"6ZΪMw畧holiuhO1k?}W%7Y[_6];ӜB S=?Ѭt[9is~&/еtŜgR8(X4/dSy{P{w;(O-!/y+Lna]wes1{Ѱ[_\ ~0o>Œ_=miޝ6X]':-⻙XQto}Ov'`}q@<;ֽ[n/gsgWv>999PGwLJov/=F9䐛_D?g[Ϧbfl( oŒeΣ%El'Ӗ''ҽo Lc,,rkIaUק(ʶ뿅zTyI~5zPDm͓'!F^#Z ..zh9 kQUz_2u\> 6SQ;:[:us_)/'aMCI 9r.3.N:2&_xG}mFp˵inh޵/gsTfA-3?fӰ1}wcyوr)6i:C'0cѣŞyqNNfKNgi|Q\:= 엜ml3sf~v0%B>{n\`Pf1z?ȳg%ʁd˸Q'QcϘ#q\Y:1;Sb/2yࢷoe)Ҡa6;~0E/&'V+#,)~>\7~3wN;njHP-w tx:)5~81﹊'%,Zv=+Lz8ұ1~" E qc9 9 :s셃byB#vDz gO;>S^^ 1Ny~NexxEcN3<<<t%`L|3-{;~Xo7\ˊq0j w3p>uY̒y/GJsgƀ$ᅵ1ß Ke<;0~hc~!: ~v0ׇ`tq m[U5ŕ7/amf[WIc)g"S՛kv~ !˗~D£h4|ʯz!X(.g+BUΕ%(v`4ۺ;UeLn=vz[UuF01=p~O=΅ggHedӬ9x|m8(n&ϷxBq[A"69A"o>B5WPkUFHymHqmx~9SÏ~h5Hr=P5Bj;"~ϲ(JzH%'#Y]Va[3LkUce(~<[-Sz(P2|I\S6ET]ROɼ((KI_n 糉%4K&2զ'rEQEQhwJ峢ȤڨNӜsm+,RzrEQEQh..W,5C.I.c4$E=.6VQEQ叄y?IJ]SYnT2\uh26D=AfMiDQEQEIkߤ2o#uC *:Lsep=d/TD_GpCߒ{o\ ad3yxaC `?((y/fcZ_9r6LεvU`_/;|b^.|?bȞ4)Fߙ}GCKף/✬t| ] b)LBVOzu#S) }!K/mcYnmל}w1YagzvӅzqnѡ>3s˲ ǠKZK^}zwk`1'mjA<d! z\xEj_pxfY>A829mF 9mN/ߛzYSEQ驌r0K$٤[W8}6h{e_ֺZӗc# ,a†f~gn>UQO}6)=֓G~"lb0w~9Jw`Ȕ̙9arY@ǹ9if6G»o%֫!\;}J~htοErZ4!BdseՀ^}v"+ s僯<FM|:?q{~=]B@1kM{_?_}wgM2vk `^a[sq>y#}o-E_Nkz3y[n|f u8|[ڱ5کOlJ.56GUtFj266յ!Ѯq{^ÿpҧk3buh{/_֟ G3c7Lp0Vأ8'9<(ԟ^}[÷_?MO#{MH-&tOݚ'. <~k͛)?SCNau$gtkM_߂*Y+(Ռ}aҶ.f ZqQ䃷7[n|SQ33'>Ͻ1s-񟵇xx~*Z𾴨#!GsXlb!{PwϬBֽGt$VZx,}۟m!jCfьfMY;slyx4Іa漥lvhCd.3ʐ3ѺnGpż|;ٽImbYU[Ο~sv;pOZׯMNkօ5kVe|Ϗ_t:[&djpnr-+zϏ_,78Zde[?KzdcKns4'v`@hfE2s&z?K{Bs/o}9Grse򝟱%gwss'zYVeV=%[bgp֜44sQqv=[%!%,sͦnq.9=ڳId穣=tdXf |i qW|듂Jwe%(T+CJ JM_i!<ۛʙ+QO}Fj fָyLh?)kJ&K{^Z1j CÀאQ.T"R\-oeS8 /=ۗ\J|Z^/cФy߹d_ysL1 ʡ(MM鼝 ~:MQnXBv>k=S+~Gf~/9ʕtT$Y*"/u0,g~1G/c8a'M+/Iqnu﫼:&fb8Qucw ?yM]/+u3r[ rYmo|)'&+9` /?1; y=^~=6Kv N?=ʼe9d}nȝA(J0)-2ocI\64رʹ =:[4#x96֍%^_GѤYS=':V.t^:{Q itXF9d&eӾ}({W^]m^dd48#J"N4i5kaa&6eZVky_1:؀X|2̽e?gdNxu2J 7,fѺ>'ߦM 9~{N.wrnh{4;]yWˇ/9;^;s7rN ;ޒS[৥E:-Yȯw&~wO^c'snPiKN(-'/s2DV$9gyO\4p bKV]J?Vqߒw|;REQ*OHշbңE6riVILGXv߾M籇gyn={~\Yvn1yE~B:? \i,_SNrna;B:,fo) !jmE!x icقȁr\74ĮSd*yOFMG0uػo_חfcnGpHZl׮5?_ѡSku''ݯLv.fV#{}/KMpmV䐓K^auxc~lG= X$.G<1Im+x94>$*g oa̳ߐK1 ?~6@̞8_t$=.LJY,5̊(5PPL_WW \nBinncטΙVnrpK FrSRd>x8RG2lاy '7mEF~ā_oF>4՘{\UA8yMO.>&6~wVlW~ M;mcYs3=F }r+jЙ>=;o?fEA풵 ^<~i̺Z,CүzoM`gаA-H>b->mqN悁OӰH2r$&;[|>G[߇]ˈwrDz1c-k>^W'"\&}c;ϟ7% 7z?Χ;sqFx߹U}sl߄cn?0ܴ7 Zd5>}G3Nu'?+?y`-v:f18|ڎ%Y鯜}K 0FnؕųmD+į׌qcчM?=ӚrsFQE6m]eIDAT}N"sD5F\v}͏qoXț%3aE7MKC'X|aAPCqiײ\w@l⏹dOk ߶yidx06#(gkR>X{K׬Am*Hh8y{׋G-J6ǸRk+;מ}~((5m|M+}Bgc7r_#D?-B9`ozV,kMNbVT-9w=x/((vr+3ٱK\6AuOAyyQXQɟvE)CSEQ?/%3Q^K;$keE|N,I]cr֡/P+s1((J4;~j.jvmt( obI1OG h((!/<ڞ**'qv,s qٵQȺd'd+(~hEQEQJdJK7^[Q,7,m|Õo0((rK8s$6vl]^Gi*mf>a2o((J22Hf{([}arXoUjүsO,D- >8jEQEQ%2ۿwQDm"UZnlL*sПL9֍)?jbtSKD˄{[jIPEQEٖ *~9w_9W]ff|FQ(ҩҌFΕ5ϊekn5F1or1o~0u&%qVVV0 MDlwɟО˞}K7r݈~2&^QEQe ]Q&ӥKLF (ٮb <筋b󂼼&Wg?mm-JjrF7lMm\M|_i )kLl~q 03Zx@-O\DOkl4^i}bӷ5nQ(([ML3Rx̨6& Ȼtzڨ3tW?j\S9mt+/7?IvĶ.b&ddrF/JP3&]qsC^U}(*WEQ,pnڇ4kF2Fy}Dߴof+MuL0И8;vBUF 4WԔlks5؞R%̼&ҵH#mZ&5W^QEQCMLҌO1Sja0u^os.tEQEQ(g{SQYyغ4f_-6=Nkk8}7z:[W%Դi~6~a"[DktS&rXu_{-W+fcml>h5W+*YُF9W+(l=lO,cd.&gƤkti:׷]Hl3k1}};u[tMkeBmb5:\Ӛ'6W7i`i9&)g4l#'ZyN_0ۺ}KSEQ%l\E5C1"*4!*ۚ]$&K#: fW%;]Ӝ sril=ZaYg49~!/ k'(HĞy)kf(k͜<\fn$ibn#Rt((J屽AybbYorv>aWon4cZhiP3}K W)4W!͝yFes^5}qhmkcylL"o_! /ͯ94[}#qi(T1soǮ nT6oQ!fh$n2'qi[iCJѷ͞yvxӚA 7پlhu yӷ͸9}u2жft}G .MQEQc˛Ⱦ|1ҏC. 1 ԛهLh&Szo1&s؏ی!&u۹L(<ҧ7^ιY5FΙԘm8cIIJVoS/5CSaj4elcr 2m=Jͫ!6}s6Bͳ!L|0^}noyKREQE.ob#&6d;:l#lk2vdf7}yMl]G!s26DUJMfIHyg4۱KD,7,U_/ч|kMO檴` ZQ:}'k]r.MQEQ#=545}[}Y+F]msVk}ٮۭVl 3c 7ܘ^۷j蛹8cj07fns.ek%rQTd(qT$2؇!ʜ,V߮3.u34vMF2Lj4!eMmְtYC"ɛ6y){035<˾v\c(ҭSEQ%NfMٱAY"[ӷ(-5&Y+vD:VԺ.j\+64df\. ogif mrvѱ49y5dɛÌ5R.&+(RHM2F#ї5uR7:VM]Z22OJUT KhTKڐU͓-Mydڷl}_3cnjdlv8]2UEQ%}21gҳXVeMY5*V V>5ŮX}3OT^"l\DBMfCHr'&6#ڛQjXؘWqhi5M}@Yu+9"*+(R9[n0ZLfx,>)&ʜ$qml]e,IHU+[ɼdNm$m=k >$XvF2+(R1R86.C)uqVyvayص]rl(jflV]dRleBRi2/ ٷGbiTmSlk:h=JԘoۮ1ѓ(k2VEQfDPɜekf?G5fĶ,/c|R3رA!YTi΄ƦZ(5q3 ͬ\%vlp3F9˜d?YM*2UEQ%}\# Ykb[wu>ʹB23vo7-઱I([4ۄ72JQjz55f3,Er} b{n]++EQE>fcM_.-Lb%3vQ5t5Ls [4:M$QjCoa_u65&acaF9WR!ZwI((=F2jmUʇB5FF36#8ꊳ8rlSU)j(25Hs)G2]jUJ7$#EQE62z.uL9F(pRosv+.Qzl+@:V휍]LcۅKGCv+5ԣQT6((JŐBiIJ5غ9{\}uYdlk2guvhvͰMsHY)]2l=`v̙mR[3]+5L_9UF"YNI((}E2ڹ:Y#cobWK=J .5ળI5FUT$GApHݘN˾'1֥%kmrbEQEQ~HK璵. Gtٗl .=/Il+YǡcLĮ~&ȵ}yU5}[sF}E|((O2ߑ,eخs]dm-nk/cjTJ6_DFciNM?}RŒTyEQEQT&OSPވZ|orL9[v,ǹ.2U .3dlz[yW3ʹ\9Y'TdZ((Ja.(kl.NI]ne쪑.$eDUTeTF/dyK۱leƥ4C\((f*b’q\ͤl R~.6Un d,l>m43_5Cui7ؚ̧;>Yk[]qEyEQE)KU39TʾANBKzE'k .=EUդŶAR8555;w^Bj Z9(EQEQjdGt(5.͎Z&[ӗzE2Z!9+Ru5zUحVƙP(TC9VWW`UUjm cUU6aҙ3(_2\X]5ZW.oSUz&T(g*X]}8!&qdH.ӔsPYd}Ejqɾ+NQEQeQ#'DNYɍke+tdEUץEutNEOYnC 2'[Tsƀ[wiC((Ɍ\TΥ4pRf#dkʹ4N]qԥS1iҝuQTZטTu鎑}W좪jEQEvHU&ʐ:p]M:W=keGQuQ+ݹӭ1 k+$ROtEQEQD? .l6RwnmuQ,ӭuEXW-DDmj.Q!U>((J41iFtCQDDmj\.EuYmFTdLj|}Xl6R4NEP1(T=1pƆ(՗$K"Lj3 VI 3md9WNj26D銢(2R15CFWld.8֧[Wajʨezg\ WKIEQEZ*jRs]Dd\q*>cj`ezZ؅4NE)("]×nAg5bpkɨ QF,eZ1R1515+JUϧ((JP&/j>.5pHMRL+LL 5@f/z*K:OjuWQEQ/C+\ ZOFc2[ˤezL Q2]ZjlҭSEQM0Y]U s=˴l+͆Ê1D*=((ʟLa&1UCEVdLٚ*f&+2&\s((arQ:$ϥCEWdL-l͑,+(TeerR9*:JV]eQ6Ij *(21ԦIOSU¶f*ʌ;WuYme((2z'tҡ2sUflʬ2c鼙GQU((mSU1y2O[¶l*ʎOʜ2cEQERCYRsTv|{0nUƪ']j|֣((5W멪UFmB!6Jm WmQcٯ,J4M#b#Dڬ6DCk?YV̓rk#U!v 7/YWm2`f?jT"B!b)$rWmSe!5݇. P}P~!`Mpt5].*Pk*n}nqW^Bavj}n}nq,_e>l&ܖVHi>/7))f  !U]ߩ))/CtHkHi>8/68tzk*BxExp[S\m'N9zLos:.i~@鶢Ǫk;s"mW'pBp plz~m'zNump=6?ҶJ))MMBմ8n9~Nω"mW';턛g#m>=/TʩOm[\!6Cmp>=/TJ]pͫX?\UzvN^89 :kT9:ONSS)fs2B!,5)e܊= $֧vph%x8 '91zTӗm™VUъG"BQ;Q|fipNSS݄NNb1ΚTWZz\/xyuyes1u^6=V][W]BƧ_ﯮ ʼn>czSz%L .eBͫSSmIP}`]z"׋p硢^ ܋9PB4NP}\8ԶHTScSLR1yNmzܭMmw+< Nyq PsjL݆TW][!K/zSB)>l0Q]sԩ)6 W+YBm9@ aǠU.|S /;^2;z!m'@>]$B!b#Tb4Io~uvL!a`?9QTO~SvEUN}~o}yfax<]AB!Dl=FmٜQkzթJ?Dq5gU⎊ 'g`&I*L(0-^3'!1I_L!L0eIGҧ~\iڧ߻H뇚-_"6wmq5O-Ȝ35檴_V:M|ð+#ws)[>B!"dPŖO>{ 5nKUD+@1V8O=oj e%%&mÿsHH\|w'#=O Y!eY}_ɸnWubh_ tbP`^o'NO/ܶ磐mtGRs?&~GiA\/ !9!B8cc孆g_r"Πj)J!E E/xWczMqz'T-|E4鶛> Ӡ`9-:iZ݂tLo쪰ǎ4Mfs/Bԫ=avetF0j#HU1cWuI?عve?lj۞W -Ϯ༝SȿV waXI$&JίH*JJJK<ފZ\J(.ˤķ&N;O٧SOVG"ve/;Ɯب^{GƔo4E=9x@^~ fxջE#p@Mٽt~R4n9$7*JUozLmdŘ'㎗JJ i=T@HXB<||V ~܂,<8O@Qa]vҼK)2.,uwc`O`7:u 3PEA&M8ch4%y]:QnFN1:WYG:<O0n\K5*˵hތ=Xl޲+ 0Im=NOdd鯰v ,[A~Aިs$,_{}@46>d gEI;SZVVc/ӯO/,[L|\MȔǦtJk&#O*KGŘސ_S=^c6+_b0 DmzՇS̎Uj1VE'f݋1J>.٢ԟEKZ?iPV EK?a[ P>Qei-[TlFfn 'oKXaS;4yx/++ k_^-Zf:{5>m }zWޘ?cy*#F|Bx,Y'Nvmҋxظe+7lѧWO9},/Z=Q-7^Ã?+nɤk'pCO]ۻ'7^s3"v#tJzb'\ʣSsUϖeP,uL(k,ԘM#+S.Uv?Bم03`U.. ׮uj}xaLfiiU>OG0}n\JKQ/708dAϕBAa}{sN{d-wpp~o~;?(.w _ǫo΢okq~&ii>i"/&?[Ar p7;b>zpgsOy 7_5️5ka&}|23^47NC[(,,dܹgPo&iq^z-.|$|ȮnM 6l]~--3ؼe+ it1vmȹg]+uK3|L}MK33oC-7\ÅW\KVv >}g[bWF&;I˦[8Әk.~^=3\qd ٧][ss݈*4ty*<7^;^CQq1II|g,[$xz0;_}k&FNN`{^X=1)Mre_^Lx%SZղPHY%xg麫&?dM 0: 8u}vL/~}`;+ArtvyR|eJJ3=K'tMsWFȟ:˂i_!sn9r0](++Ͼ]hѢ9+W ϯӶu+(X, ߏeY >?3oe>;wgѿO*#ܟX?d -^ˆ+//4p5JwYѬW@2>/YH^Up?^mӚݻ1)..f,e >{C.6PVc/z>odž|<^7 9pR֮[_Dfdf&99F'))[_hϱHH2g(,*², Y~?yZ7m[._&̞ξt5Wзw}ꑧ*{==1zܶ[[Ģ⽭؞Wm;i|w:X֕0'Le>}9}BB)Xz ;RDr2Z'!x( OE&,²,JK0M8)b$'7͚JmQiټ9/2RSR͘O}zzx8Pv`xѧP1Nnh}*tP۲n[O*mZ:=u*L*#1!*?%x|q>2<5)L,Wىf+[ȾqS|,_J~{+W1||/䵙Vz~|avb}*וk0YIfv6Z6/жu+mSUՉ߲|UdgТys֬@jJ Ӭ,g۬,+J_ձ ;[֭Ȭ0cGЃs;}iO>dh9+YÍS)g;+gӻE7lONYz:7_59ʽ'yAyVvge1屧X/gmyqqqwML ,bҵ '?=͒e+Ԩ8_RZZmqd a8>o֯A!fWVp^-B1|04hrxǬ~['AT޶c:R_94INK#5II4W/D隮:e=)^kӑ _ =:ۻg._=% [?֭Zr՗ӹSGhѢ9]:uS}:r8ݻa.4m #ɥK c0jyx<:wڏĊ{l~?CNA^=4?)ߘ LOa~e!cGOJr2^ˁ} ~ܜ\Z4oF^l寿pѸsHNN0 ڴnEV-԰lќG4M:ӞG`GMشe+Y9Wes3tg:rxrntN@`}_}=u4MuJ˅uӮ-99lݱk IDAT}W|E0!!$X˲hӺ}{~6KJ! 0?W//{vXlEW1l[S65Gmy"+aӼjT#B0 <IHdӷrbM*UY%Vp^)۱snOݷN"59|֮_,txLv=yykM|5W\̨+ݏs{z"*︙֭ZrGii).gƛo3LdGn\sA,&vgee6;=cFUB]mU6=[T#:o_1{UpB}T֯4iy ^mv}cZesSgvDI^f;a;m2,Ԝf^Ȯl2M33 ,s`oq;E04+y˲0 |$v5=jn9B4<@>,eޯLJ:U6ŻJrjSC-ԘPfi*y[2Ij]uHqw+Pu]>%/r"B4XlCWԱ SՎ9Cի_ݣ-nsOzՇq#ضU d,M4'V!#>>v=u.8TnnZ+aPSC-ߎlu7ה,lI\Z+%"n_7G !x\Wqիd(/Sim"̉[Ϋ1Sa5eQȮIe[ȧPB!#u\7䛸Jjswu"EXE;C?C=N}8L'`9=!bg_ҧmAEEpjywwcoIzWOa_ 45#MK&Bnv{qcN}P}Lu$W~z݆괌B!ӘT׫{y:^զӟl(N9N1p>8z~zVjL!i\vc@Զ[)X!쐞tT{W}{B!;XgPbݨ516;z *i(ԩ 0k P8,>?L=,7 !*Acr]#fw6иaCbY!`X\찖?=aC`3fpހꏩ,vթM'W/S\/kF( LGy6St7n^Qiu< 206{SwKs*ڧT,>UwvTWNEB!Dc_dqUm=m;bYՖӓO:XߞOB!=&ޯ稜b B}apW;>BQ?L*ߔ8n۪pnu"EHɰ6CBQ?X}Hy-Nmz;c"EX8ܞ~ 8NB!Dc}攧-^gӟhۼ֧zU/Bv]ncu\}>vLUDT=T}~5?B!D3\T7v;nSޮ3YTwN:VB!8߯ϫ1s5( ~X=_C!C6{>zUEӓcz;֧ B!D 5>>XD gr޶UwbBͫ;/B9} 4^ͫS}^68t䄭!!AS{i=B!{e}in7HU{@B')fP'G!ic- է 7/stv;QzLB!DsCN1:TNz"L?86oz!B4>cӼJm?DߧEVPP!BMbx",䖧p;n'T!u+8mquE,EX$"y(T1!BX1ݍ[Hrc&EX$-mz,ԉ~!B}lplTnq]uDWԳPO֩O?@n9ގ˲ؕAVN62[R_e7eqQ*90eO]kziքZbr}L:rt\C|t:P}*X?2vee5-D2;UX7=LYi)jJ >&/q?Py  u`t[S\os,&rB(E EXuCaqzq1I$RW¢֥RiB5o1"L 9šm'n0ëeu]A|~1!D2 5X̺/N 5ӫiuqdm:n}v\OB!Dqo[B5( ӉB!D 5Vk wk!Bԝe.V|6aоquO^zϲ(d7Mvx NjΠFW f?_Z =BБtmkQ6|[~ϋ9wЁ43?M;a4}UY~3gu .߆7 6Kyjǡ\vsLՆ­ZIKQnb6cjaYhB!i0gym+n;tI᛬LkOԋhzyeשZ٢y z<&``z㈋ VŷQgrQ]I5X|b4foҕ}2aWQ"egiTn^ҕEɱm;gWy5-4#vggOL[pp kf/YOzWv.'io^Lh5?k?M9=ъ5s,z9("P8[?{V ӆA'_'yv9m`#=8X}f|pȳht/\( Xûr*&.']}%#K>'s8q <{[W&Q[^so"ؤEc7(iO~i-suǐ ~5w*dwo)#e7>"ZL5zZ T7`S?>gWiqtn<)ZK03@=uGg_5T\ Ԝ?-&k4^OY 粮`m|{Jͫ3v k3/<[^YxLpF.awy㳅l7Hxcː6qw|rho՞Lm y3>%z[|kΕ2 jE*'&Z # /8nyMs~᥇gf;p@"UŠo[x<Ou"~wL}`L//ns/>:-#ZT$Ztӡ i{K;^1wr) 9?3cڷxOx<4UZy5Ú]#xV-hZk~~/A&m竩܃3x4ro|.apc>~@jZ_wjLomz1jܿ9}2e>呇!9at[2'>ͨlmblq1Fter@+ `\{H.=c-׽ƕwK#Q3y\^H_̳͜ ޾'P$ VÃO͜~7ptkO 1T(g1x<=G8&QxNT4U R4*F+߿c6w!W?G:52x>}r:Gćt xk>IX~6:13.\bI0?/; v~~'O¬ɷs|X=3ͼ,|~^t)C.W̚뿣wkǠp;ӿdߛ-eַGpSy" qD|)?WkEslzbN=Ij4~e8޴LjY[ō}G0ld:N =3^ ѫ];vczd̑ڐ?,?"ʽI&Cfzmn, `&a\5#Oz I #t?|Sxѿg[3G3=qӗvǿWߢ0'ZS=Ef\!x}螞Cf~@Y57]Dmi5"~u`[R^5O#o{nAZzS/ڼ<f,`qm)Wq,R|+ߧ_x}e?w+%{+ ̬B2~ؿ(݊lmk}|W! `(X E]>{$3 Ms}38Y sMv69~h;3 RSIcҲ\9<5bm/޽RV$5 q]sđ{M G>#pkcgφ<إ;~/G*Gyj6FM;`f-Qa$bfE]񓗟c/䍩:Zn< fOX^Ld$Ӵi3sIkjzC;ޔjժ=a}O0u<{N~ ˁ`<5?f䘖zfҬe3Lo֗f&qru { kzo}?" .֝rw*sKɒV b ~l9<r|HiZ}!xod4C&=!*G> qbTfj>t)J LJvodsr>g _bEl^6HJJ"?;~th(d/KTeRɤl۰" Jm/[)LL-UT.4\f0yjudPR΍kؒgͦ -ۥ1-rU 87>uy(s ,fiY늰+w%sFUKNQvnMėWw)i$gobCрxz oaC~|ϗ4aN/uc(e3=g44/Hbݯ@Ǚ~IO2{f)Ka ;C+l%;t=z8[7`5ÁinS4a+߲yӁ6cX06 |Z_Hnfuyd;.ZGƥMב@( ?o|oN~%X^s i+a:JK/y)3 t1@U/s[ȶ `h j:^MJB:~ t?Xx~[?wޝ䷲(Ixg]с5d!͵F N[|<ϡ/fDc5fu'II xCz.%+Ҡ*k&o?;J4iW_ƈvs)x۹95&m;'I[u>_[dQR"qؐNl nϳpN}-7b)NSoìR<]89qxLak7NlL; 3/)Z"otdB|:;BVGs9<9F?/s c_'L !#NȱM c ͝яtn{S 6~|LZp#dRfq۝F7n7;grx;  8KǵӮ;nwSnOMqq!bnM=þg:GJ۫ )mo^{S'VM%&mai_Tho~,Ca@NyO2qNO~-*-on$ RV3 tnU"V*+=oUΩs8n܉e7[X.= #ѢXO0X+qaUZao IDATXXT< \^C6yk'TX, V?xׇ}z5/@8TK#ج|?7ױs#ho$$T-|U_ <-Q^ h@$sZ>rxg_MW>Tkv_i2R>mcmn=JXVi+VTySrXJ9LH Fu;l1cU_ XyT9~zV:,B)zz쯺^uMvsXeq5TO.+3Ԓܗ{] p ^0񨝆{nݪە^JMפ2紼۞xOB!D'W:)]ųoB!D}"loB!|)BQB!R !B)„B!aB!@:2 /7_ W_m!˿TݿbɴkۖM"|:Hy!t3Q3CBD$ܟ|6o X IcaBPDԕg֮ EX V?)B b/..nC'/BQ_B!R !B)„B!aB!@0!Bz EB!D="L!H&BQB!R !B)„B!aB!@0!Bz EX#GM<%BFBӉr! >P~ '_x;3~ىXr53⪪B!DH@Y~'ә4t7o0_dX~svj !fk Ӄ%i>e6i\{Qi\/d-y_מqcᦷWk\e ^33s`Qf[E?yu'{T2^)zr1jR -fsq,>Lnﳔɚ2)ÄB콤kXY>u5L[Սki&FE@|3=^t;-2ؾҠS8g3b;y6ZMٟFg9UVȯ8|Nބ9X# E!boWxęF 2X$< ^ C[q'PclA.ËSMcҪcJ}ر+y)bJ, ](үJ!b#EXfѮ|J=Om'nix|x(V vKm8pWiN9ᖙ\wPvmt9g_ v!b'G6rew=:5!Ya_̴f]eXUA☣S~[ cbouHd#>Zq&r+ Buk䒇e=qysK׮58)9$K1<ҒeS^A}/|I}Vą'0rđ}X et<~i{Gq+ɖB qy xo]7^~>o3xA"-> cb`an?"4Sa^1@py 00=TY`&f[˯pFB4eE 0@}m#O(|@ipnv_i2R>mc-mn'2LQT00˫3!Uh -* 0 íS! B!")„B!aB!@0!Bz EB!D="L!H&BQB!R !B)„B!aB!@0!Bz EXb͜4a˪>sc䨣9遹\,rf_Kf85GM<%bqNWNT'^z]&/h֚6uzm‣{CǗfy{$Mo8K.:e eAd("{"@QPD٢ldlDd ?Z(PȸM -}^y5wύw}ҁ-N!|k^͞xh6ʕBiP=?RGu:B@^I(]S({!nŽm[ٱm33_,O{6?>JYm'2}o\F*Λ)\i&|}~M^ξKP ssћf3u,zF#"N~Ch{6, MtH~ ̢#lMZ fM = ?NxQS/V}c0mDc/ò]|8oBhǬ~>݂-9{<?C^)]GDGe⛴iTШ|GK+$؎u0g7iA݆-1jGo#r|݋ Ra[krH#hv~S.ॶXp06vxߛϞXOYƕ-SۥFޠ o|;4֏歩pq0Z6kNwh13DՏ IW-u-䥶Xuzй)C5#^WLj߇;1&<_ Z]7h\߻=Sn=69msmD~ed=jmJ9|1slX^nI(Z9?5cut[pD>tǵULzաV \r8R]'ξ`7l);%1B;I²4Žƥ-Zޭ~IrI/Jd(XKAJxmU4#{8{FdցD_> -f!/*_x3-onjJ&n񸬷k5|i]ԏ|0"C]>>4ǵ^4Ldg еDv1=c&T^YRt 3Pz]f/_úRpLtݞ,Ѳ{.oGy+Y~ ƾJPEc6Z88k cbլvu/NHƍ `: .ÑI1`sޙ@øL^~^'tgF][_ܰ/B%h;K]Gxߟ1MK]Ƃ+YC^kY9,[o8^#=C-Eo7kW2\p9J|n=N Ci{۸RvǬֳ~k<nM׹dMLYfCJcE0nKlnǗKWرGOf|7,'MdyG"NiO_r U!p$,˲rxV"RaCGuc˻mE kwz yv|SiXYO7٭Ue/r$kf:ӼD&79+tsh֬?ٔ's\dʍ쏶RPUUAUQ|[ֵ" j@U z7\z SӀ#goV&o`TUئDNd3]ZOk?B]7w=\H"` lOl=uҾ#eCLxYrD+G ?e$Ru j( 1f\\> @ %y]erxa ,IkÎ-3im*TEc"xUʅ\r*( 鍬>X] |uhVMc, %iS=4mYŎ/У^&rViFݐ?ٴz kڏTԉݺ]O4G KmKrp/vdLj*LɀOޚ..]BBAnIc[vhU*;& tkϾL!J/FjFQG! /-nD;z)%Z'G5 ݒ5&,)uvk,, ՙ-)&r X4c8}~̪qhO7{^0UtMSW5oS(1y9Ő/]`:,a3^$*eU gu.G[K¥#!9RxurNsT8T7aއ8()n3 G\0hoWv+8Pq$ԯ=\wAԋwO㝉gi;s`τ6Ir]ȥ)Bxu]E)Яs]ǧS=S&,ԊPUՀj]d͎2Ttn_e̫ۆA>4y zi)3ur$HL M_H:Bt"3)v+;53h L;~X:5}e<1kIĜ8CMFu8Ga%ۖJb^С+$bM0XX% l׎s$Ɗ .{G^h / ZGf +2}J.iWmtՀOhab6uө4 iBXQ *}*6Ս:#uHf=̊;bP&eܺ1TX F\3;8?ufuPa\HA!1('m.[ua=Ea T>-6 ؓǹD!Gx f|x Wv_.ߧ1n/|:js7o}@'׮ewR;]Zt1a%#.I8r ^ 4"16ٟ}7OFuOt m ٞ{O^ͦQ!FTQTrMqݺkؔ[-)lP*ٌb%]/yt ,s1#S56oRݽE/= Gǵ~7XxȌѯ⫷[SnGu ys9Lnwg19wKaB]gή3ȷ25s ok;0ѯz^)_KG1"*:U5B xHAFè;ך֣fZ9=}9z;!cZ.OzԬی^dBqk9(ޤiD]vʥ2m!<ʥT-W6^ưo};Mlәnbʥ K]!n٢6Na΃\d؅^<-<|g"zx`L{L;*`tr<\;˽& Чs>CJ܊])_ktޅk4P?j0NEGt4gh kΛ:ǹq8w:m؞Mò)<1e[릸džF:fi* .qr.㺝TqtsAظK}̎sۇ}4Z'|z6kdbPQpj8ru4ނczSh羦G^9~}.;9fi#eqK{ fq9Fwqp_ד4ȭ.3PGk7ʗw/z Mw![,3`l9YLV@wLyα tNeN ˢax5^Q1Z-UMEQQ< PT5;,sݷ*XP%N*䉧zzއ}F=6%XɮyuS NIItYt EAxѤ=F]qKYw}iV4יBB!&D>ى?([;jS!ĿE0! ̔U!6B! !BdI„B!2$aB!@0!BL IB!D&.?υK4+!`Pɝ'x½( M8z11X,,%'HhP+JKV$IXuynܼEEs/~doJ(>[8H|e};K/q…&bG#11ra2܋l9zT,J,¥+ZG8Zx"yp$'[6*y8z8ylrx{{0-R?$ ˒}24jB<^30bu[:ɔqg !BdI„B!2$aB!@0!BL IB!D&$L!"H&q)N:>[L!IxY0C3LB_1}Tc:~q=XEvۙx1pgI'1,փY,*u[DbZ]i?ZV7jF|4\~Nd 53MVoRG%\z^ %Z~ [IfEڡ^]wOoوm.X'h"_jt}]+H0q/'0]aXO9oT/s֫!E-]]K5clU:9,!ģ?~/'_WPsjV]Zrvbff@hmf:дuhst&}D4x}dzDvk߭Oϐ[aƝvЂ߬5LyE4G]t\mZʼnH+J~=>W4OV2~E^7]Z٠M{`[- Zԕ&Q lѝ!s!b/sFZK@B~2a&Pڱ9cw&韯x7N/'"5FQ<% s0WK"FѸӻ|Tяui^37N!AObf /ޝ Xsم\Prכ؍&éф'l'N|MSѾqC7jM+9N%vonN IDAT^ʄf? 7Ekta;Y8fAŔ  _+a9cmDƴ;gkz)^cow3fY3L_64y!Qx?\3n1~=.1wxu buwcP1uxo\Ny96Nz֑m؂cVr<lDC5vj.ՠϷWW_ONJ$a+"V u)Y^͆ )cft-JצW+̿;SYq" Ij z3WnV?Ǵ-ξʹ-P:-;D͏vȲkY:<'gLbua`'> ,ek~ol.ۈ&.U?07&/esВv{|"VZ>d%ꠝeٰal ߭b>d&Y`ujϜ1 z&6?Rz;_+/j45+f3C@?1f7Z|²3\8V_z.Kfu|)beеDv9{yY?|ϰztَh0~ ĄeX4-bМA_Wf\Y16#sI(QM(Tx^wnІM\rE; ?/ED<$>wBa Yb<-#-GzOv?|F&BA3X*qK? ^c-{q}Wu)zԓݺ&?~vMݒу'NoKד3XqQ.ccԻ0ڏT2cV@¶m +mq]ǡ<[9ܐCrRXu:jT.fw(UmFTXF@Q^ej&S .\LA~xQ61ͻodD2hX%- d0R&.r`rS{pT(%C}2RJEBMwLTh܌R& `nݒJ׶_Xs-;?G/|Ӵƶ_%c5K}$zev6x#|\e;u;ШHFlמᭀ`+Q6WjLq?6u]8c,<_4l6[Cut]Gsiw|[Z @E%\-*9^X*_H 'M+fJ[sM֭(ױo[:ֿwϧ"φ=D2&df5rA6ZRW׋Ũ#8y𺪪| 29(Hut-AiL* xt|sSK#ebˠ?n$as~Inh**-%]GpOy؛6I]\KZ%s!8Ӱ[,~syw8_Z\ا{T? ^܎| Lf֜\.}UTMx%O*n%:Q'sCvB$j׼Ue =&`j23mbXTg ,E1Q5:Oȡ6&MH6lN{O:GcuRc='y:NDڹ?ٴ8'`%)Z<ϗ/kV|>+WwǺ-ΝJhH*6 Sǹ?g(Tp.$jXNfx:o]T9{ iգeʽ`KԎ v]FƿRCj%mcR[A_;n08{`!η b4\ _˸O_cQUljXrU4@[JX1,PS*9\wG\l(S;Y\GG3:n5'l@2(vWxy"ekIp\JΛRF$EQR-@EAvohdzwАBJU$OJtilujxj&++މiźbF5z=';;צFwʼTgAߖ O=e}T%v>2e}[Y/o)EϿwnL?QFZ ڽZ!GX>ݔJ +6l)lFAՐA#2}C>kHߏk[`,N?~ ⦖"͇0J>wLfb&e+0?;®Z=&,>"75B vB 2Dֲ"oz # ֗q7f0yT7f\杝=:I\'zm͇ [q;)'~>^g(xl̊+cL g"9{K+I*w¨"!`(L6f*N*(U}3+BF;9S]+r^v^(K# eJdKO˥79zx˴˴Fi/ 8jҰ}:_=TT1MsxF.ʗ+q]]+zt4bPA 5l ܷkCQPj::)krӓr|i*d&ڷPqA4G띇5=QPTǸ4ǖy <]@Gcr?_E7o`t䊂zpJ[/y.s T08Ρ=%NǕ*)ץ{kkPUM{>K\=}?:61qq?15lzx1={RbsN6mzw\^8q])\fVekϾ+]cn*/^@6'C X,f s\s92ms4ܟ<\˜2:/mH/:_DSHEUSL+>&%t]HI.qIoeS(1w,1.׮a_t0ŋO5syV ~)+ ޾]x]ٮ}nsNk;_!ޠ(*Wt<]3+/Y1<6 $ BUd۩X̚)8o u!T-=B&"B!B0!BL IB!D&$L!De41ǛlhLSJ"kYի1y!9v-$>'NPHQL&I&l,B,`6BGsgQ@_޿bNJr/oic&88|Ow/Y$aYx!*((EQ fߗͭj0@`_+Y$aB!,EQ "((ȽH B! !BdI„B!2$aB!@0!BL IC&j}7=sc;xLJv{TEbǧQ֑z5Hgi{"F= 4Ɵg沞+['ѻY8T'ud -Vs4ym*;b4U7YǨZ9kЙ!ˏ+3d<r_72mW0^Rq7 3g֎#So;cj͡2;E⧥N +>x#ߟǦ9nKS+u:q~ƀ:/O_OqlЗgɣWv Oɥ@-r>;=;r΍Xx .X,%5!rF¸>i=v,{]=_ʚHhP+>WO03LO7)';O?L&S* 7& UѹMj?2fvb|B~ħ,4W.ΫO">hg34lȚ8k#TK'Ww2cyۚE~ 9Ȅ6`mW3KҺd6zy+LbV(ZL }o3wsp8/^}M_ƅC4KPPS{Qǿo%^ۮUcTQ(HP)UECy]v>*a=h>;vEAf 4) @m(d%\e3?/GϒǀR -dК}Z2'-ǗϽc,{g Le=3W˕FlfÉ9z+W /eMl9z%J,@R㇆<՚Q7UQT>1>c'ּ[\D6jKs{ zl M|oiY-/> Zn@̩3*Lnbד/dR-Ӊ*b(BS=mv$gsp6Q)VǏsc\V1m1c٢ҖXNˢy,.7/ǝdhD?~CboMzIl;PxKj1B4\'P0*gqCBh|X֬iW( E+7l7śJ];ܒl>җrY{4W ?/ ջt3a-ӵJ~L0(*}pPkdzm9Lm(jLZ: u)W&!>M'BO0땲⃿wt4mMޗ/$ēP8،-/dB,MI\pҔ!eX0d2W7oH&j(rs^ x(j{H$gMfCUr7lK9//ExٮF||0_OtiHJH7k2(>HJt'䃟jǒHbJ!됕$m;;ȵ0!;%愇Ow[ =Woz.=HE %{%.N._ 9dlа5ޙϴO]S-E_]E n.%/"a~>~&kMqOV@PO^9ɩۺ#>VN?C@Bdh^a|o_t{*b?9.xc)(WUy| IY,ny{c9yÆb0PI ZIJ^9߾YȞkVt5v^.W gRpu_|˹碨>,-O1E5QYgvp-g)VoIZ"6Kըl6T EEFÛ1Sh+옵DP3CpJe=\j>Ytj+L& bRX^s,KIe{X !2F#ţP}Z{bOZ~_4[DV%za X݁|P+%ĐZYRo\Opӛ >*F1cH7V=Dj{:3Q=hi"擭p~\I L)gẖ'ʼȨEȕ05%G}q:RxLy*nP(J[ƴeHV i4#zg ҍQ x(ʓ:  i˘ |Q} uDj @bfĐX:5Ƥ!CSbRqw\z]N?q `pL{L;*`tr<\;˽& Чs>CJSuef5. :MՐr35lG4GW*#V:6jPS.L],5l.߿(*u+\=)c@GӴgu\uu4u%kث21?9^((j [շjPu۾۷'3 -b.~ݺJ+x|sڴi3ի{~-ekϾ+]cn*/^@6'C X,fssg2msL[e2;9۴ݟ<\˜2:/i {):] Y(*ۼ-a60~ >[{eR1obPy\>%/8{cO0!ޝ$`B<:oFeɑ;'ϟ6m*{>}^%66ի}66h/yT7]ku{ɞxI&WxjUfϙCrӦM1r$#G}fΊsWswEt&IB_/`3rԨl0fXzigX2xyk6zU@ IDATz{3a[:6}ZOf׷SK =>MeRߎE^? !x,lGKޯ0mT>2FR^Ț#OѶ˳cpUٶX-uT P*oJYVHMB!cAu.]ӥJqEFCޯ/e&ɄQLv-IhU\NO9 5>eQ#IBB&MoЀ;޽{Z˒iCIFPϭnsE_'g 'BXh٪sgt ~@(%RѨn_Mͪ6-#uƲwiqߊ1`9'r`F,=@]ġ;\ģEZ„B< ,ڵkuWO] NP#?T^i2'G7Fe8h%lyM3^(}+v{>ۊKc0BN9Z? v v:yRCL0!ӦWXdo/X SMsZ͢{tt٩㉉CS#FU h%%{2omOD0e"IB,S VFUVs-D c„B!2$aB!,O]B<*$ B! !BdI„B!2$aB!@0!Yhl6d6[0ij*I„BdY;v 91?~"Eȗ !Ȳ ( سw$bq&ooD~"EH&" BQl6bq@@@E"$L!D( AAA Г1aB!@0!BL IBL(,! !q'IB!D&$L!"WT!Ȳ4MѣD`ȷ HhP+JKV$IB,ѣ$%%QBL&{±G9r(%Kp/YB!-. }0-R"EH&"˲X,LF"L&tfa !BdI„B!2$aB!@0!BL IB!D&$L!"H&B $ B!uϧ4i ZKܙ:m^$ !Yֱ?Nw/0I„B{(()_,\njBq'٘/X<>BD%T%|2~;&bY}ߥGP[9qs~x%W3gŹ{5gw MC'?$L!#ɓ|4|6۝Gc 0";!f} cٴJsy--GF oMau3zE$tn_ir8/_ǽ9r*͘N'Ի.6!9B!D:l'byuH]Wtbbgfb dz͉Mnc1?VAWCUtF8mTKa$-aB!9aaa̚=}=nr3[nr3 иs9Qc3x*6:ŭoڹ- :,j/ IB50c\KC[7?#;rX8iFSCNSߣHnnw[^< !0NY`/5⎰lvbT }Ϟ\̔'-cs>Mk/skt XN:M0}#,/ !1>M})ZԭGsN38\ iY655?r*)f@!z?˖]ڍ{Tv/=c[ \x$HwBqE0xfl|t+>ʵD!멑)Mxx0)R"""ٳgl)BX1&""R)Cѕ*ߕ%.*U-"P+թ/{%-- 7#Eeƞ={AzUD_ ҹSGoA]ٳWALS2MҥCU5jTryWB(S>>>ԪUZjzW("rn(c:_&""""J\"rqN.v aEi>PȅС#(NcŠk'`],"Rl>];.(QsNvƲevR.G!eETE""bTti܎V(""ra|(8@!LDDD a""""PqBDDDD&"""0(Gڽg:_ aQ`` Ǐy);NPPl9ۑQr8p`?*Q»XDDH:~8|Er)G!!!ڳ4Ib۶, ((],ByX$qB@';""""PqBDDDD&"""0Yrr2&-wH} ʕ-{r~(GJhJg!N]ǎg}_sO!<:x0U*GSdI""dTP{# ;ҎLDD%BDDDD&"""0(8@!LDGp-pk }9'3֮!f'E(kYZ> -hҲ=6Z5/ӻiS7mNi}0wMŎ36|[nq-MCgX޺-#fa}-L-fY8;mo?eEhS)l?mcb\ _~ɫw\ީwl&{$7z"}HVa?/#b;jS%"v8px ,oBth %P0Ӆo2?1C H7_OQsHm~̘!ر ]dW'2?tjՖRvbܝҫ[ ;tcoh^+8c7'lG6~vlMq܉#lݑn7L s ^1hӇa|Zx꡼4F A6IښF3eŭ`ڨ\ѩzᑏ֑bCvH=5GƬ:嶴dXQ>[810T't|4vy 'I| MdMWv+otVMk3kۇZ~lx]ߐ'X_&dm{3_7gt7<|'/=8UX1,*w7[ܷc/$.[b Ƴey.fg#bS'NPڌxuhy+ [CD0bNMOiJ4FBh SpUN+cvPs.*cy REXtXɒA`ߺ 5iѤ"%L0CҪn G<m[Ѽmwnxbf J;F`[n j3뙻Dr]9z~O!7 J߾M_mПQ/W(eOՃk37e--EkɍF`;nS6 ftWnY |#ҡ}9bE?-RLB&d¼'TB}Hמ2}\ٛs3q dlya]g\ԝC')DT[$oΘ&;^L=64WbaG(O" )ᵰ(qGSXx/.*у4'#Se(JrOfWJN*_4F-1K\eQCqfdCEp%UuIc1yrw]_l4|{dϡt\_ BJj>}jʜv$S2{D`dL9Y\2 o7C(]*#YFXX$}8z6`pt Y`/ h^aQTL &,4ϒFPv& v"Rz"Uv$y58'#؟gRvȭt)}6JG}̟+ӣ 0)Ӯ'w~̤;H+m[ؗVINO")#u0 cB7!ztȒ3Xy4 nn^ӦǑLll){ٰ(9#d&xC~-ӎv5|0/Bj?X?F(mz/ݤfyHW^cQt> 1سe;i]$"?8 H`QW~' $j#ɪgk3jb/lO|_Ed@Dl *fvr7b J (=W^QX]W_⩁8fRMP"ve1>*Ʊ<[-ӻ,GV޽L#ZFV. 0Kn3d*C$|}=5˞/20)m2_[REoƽr 5eS}-{ʜu+-g-^ar罟wgp\yy}LL&r}rny>?7w )yjj5m;GD:^8㣿cL˳ضqFE~ p<@tViOδ~iOi;g^n}[ev^>_%ED0hL\|3sED3j qBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqB|gHѓ9@Fz:.MTTAAA^K?l~ؗxGNXD4pѳ/ %DD7"̶mvOt 4첓+--x֭_Oxx8ժV0tcû[3X|ea.Fꟽ/'elO0t,bXM\EVDٶ Mָ\|!+88RJQR%6m W+\AesK-|HDD,‡xruc)ȅAcŠQ~}||| WaCzcglwb*ezpɲt~?!Sןɹ3 =}ɴlۖ]|e]Fu';W]$ٟf| k_?;Eoxautkߊ&/}1} '::Ȳ~'.{ܹe'ݭhԴ5y4wnSE'L"TX-!B8]m֐7Xf"*}>olˠO?7yD>zvMRgs,̝̕ɷNydpwy{2̓&4s1kߙZlR~-wÙb~]6^-.!<;W{Vμ[Pޯ_e{<.FgNBa~)K!:@2eΪ,HU:PY8n -VfƵK]kGitLng¢mg7Аҩ#1co -XYy ^Yu1<0׳nacq)q=б@ 60]MAhCޏ),]ׯ3zuYLO}#{>oѶM{:_utcc3/1] IDATZ#Cm3ߟʂ/fxģ,b3ߟN`ŝɧc ǷekK18tw_ߗn1hj;IgWҾu+.ae-cl~L\*{Ooq,/ Zg3k wƠ?acxƨfise/z.l7c0؞ۄg%:=:_Чg{VM>%+|PofŲ㐅wMf鏯r[vU6xd~msvw}M_=~]hղ ɧ,&ynjқuL]q6VeNU+cRN_gImWCQz3/36ӯ`֤Y]g_ߋ3L&uK?al,yX9'-J|3g3'u%)| 'd$ˌY]!* /~f1𥯘?Vp{&|,çGLexfxwf,x9?.Mt spi"~_4;ti酟#bWeQV/ҕ/gSә9!_Jj~c>;~yLVeN/y,i”y  f2s0f>O~%߿Ĺ<0m-}m29,Y9϶$Xd$ƲXҘ&7L)3YΗm7X|t1&V\3g\>GӟG)=,1=jn"{l8{*I-懁Z4RRK_L2F joIpja;ʍhqI0ւe96p7^L62p$mȗuI3]n7C OrOukH s$ͰN 0]5.Y2iR$ɉa +%ٯJZU 5Z8"ç{?aUٻ&!>>([ !0FhR.0CҺ^G$>qo:U۷ KsUK~'iSu뽖<ܬ<֭.c{RFO%r#yL`g/%m\ ?@T&ew,/ߗ]*okџ+YDZ/9:@iii{QZZ$C/!ώY~IWa{KxW$2qeƳ=Qmi{qrY[fV7 \qv_6m2h|M F\{[5/+$7Eb`wsە䌅L3}6ԕs!"$)&2мs~aְfaP>b D b16|wfd_8OƷIJHˆ,GdY$ieݑ ?B>xw4_ò#' DHL$x-#ϓ|wǼs}E| S ʊJB]@B\[aX'3|s< `'9 aEPXGX FVi;g/#`^925nwQ<{|g9?F:YŶWR^bD|+Ԣz.8γ$W9*DeÚك݇X4rZ<Uv`|]z!+ƿ+obҤsK~/6'"NBx4%.\F;8pl׳/k< 1׏>g>3⪛Tʲ`m5u$yƃ<2vM##{7q_YI /u u*CsHA&mboq <{ySlDDr)AAAAiSVqFր~:=y+z(;p?7]w#Co~e:.4g_1ogøYS#sC[:xfPg~AL`4<]GбM{z1_Ze{|0t]竸ubOm$J ]gbsg)#iR&f,o=/pSjC۟-i]uV3\7d8ϬCf<3'A6is(>t۬#x]\=h(79ü+>,#19 9 ݏ[;&0 y54El+vMta[A\3,fjv;a]楡!ymZ=,ۓ'_GѧC[.ЛlENA Wؼy;+_3ϴOܛ ɹ彟[|n4M֩X~Z qqqٷ𰰳 `( Lpg"|Cw--na*2R_kΞDҧ;f.I%+bHڄ>35rJku4 8B!LDS m'{M  41ʵ^估MO<8YW "6H%ߢvJ'2m! hw_k;{Q23]+c%c3٤j׋#ybݚf!^ϛ'4,m1үҗ܇/" w/ 惗 "d^irpL ӕ=mu2'O²mRIf37ӻK\ÃaqU1k׉+ʊܖ4}7}s" -LVOĢ[8n0GpkQ@ħcӿg7:vH!Oc݇~Qѵ]kZ5~8|?-CfÝ{R]Zx{47ENhV^X|Nb,q{ccX{g0]xkڱaS!%xeLF_%ڵ#{_ve~!\fj3 vbܝҫ[ ;tcЃ1 XG96~vlM'?{v˕t3/ѥ~Mz @p_{x? " F-jX/jAt @۶za%ڀ~ppY[FHSJ d4ʡ'Cv.4r0A߷7 a"$֭[ǺuHJJ..lR~r"26|;X1cډͱz]_ }IJⷣэ.\y}9 ?/<;xc,7gO?]%jrメA|CzBi3Y 3xszv2ccT^>Oekt>$.z+Rgrf"؄܇VdKnJރ]דOR *h-+/}7 {W"2pe%SǻV!S`F%Nh !DXXi{n$1NE),7gg L?StLŋb7{{3T ^\dn>_r7Vf;M穻ӹ'ز|WD׆sdu#HyF`x~FOߒDi@XrQMD.f0ТČY Gëu Mjim|wsD$~sf{̐҄B  71MsN$nyjN[?1i惵}n~k.8¹"(}|-lm>#6a',vB7ovhLky+F?q ID|LI֓t9 zkW,3[/-YfR |K $NwvxHhjw4T% i̍Q;8IFqes`Rd c;Y`>s[}^>;}YG/Z?YOm5˖.fYv^ lZ%3oF|-,bm mvXEN5>ߐ3ݸv˶Ma_DNd H,k7"N%1٦|D 6P\tSU̘vcÃ?QJwZ=6AY&p(jIt&T wҢ&7=/L.IKQm8޹'ˆ/qQ&2[pEk|i|txrCyRaۉgh?t(sEh5j:ϳYk{Ͽp\:^ӕ2miF\m7-#T ӧ{v{W˯ oϘgq|m wfUՋZ00K_k_1K.p>>NkstTw>ʩ[gyx2 ªҼ׳*Cn[ *4mr[LY1g,^aN}篓;}'+_3ϴOܛ ɹ彟[mJ7j]tN<{wdyM罟[nLfSvμ}v!\yr|VxRt)k`[!(nE `ғ{]tоIKww%1w]hqi "rQb*\5bMҎM E2~ 9cە@J5 .0dr`r6e?їR%!4ԟILA]δć25rɱĕmF99,N?=W9b$66%NV!}t7{R|ߎظO$spz~`ѲAYB֧Ɩeo aQaq!~Zv<L0|1CCEDDLŠ,1͞e2XS"U5j vwb3\Beb0vO>Tӄ 9ŤTh ]Vf *Uٺ%44 JFU&|6RrFi2q_yH,?Vf^#mb IC!1} s 0| ev:w[ IDATjDoV0Vvr-P'=[ٰ&, W¢n&wXR, %]._/Gm¯Ȳ} L aEiԬQ 潐Vuh׊S0ذ8c(Idf8Z*S2M qzopj7vyޏ)ESaW/J""r~nf N'g"58+#00{+_YSδmyXRRvQ0 ՊgTr bg_~z `""! 44&4$īTDD'0—34&LDDD a"rV թ-"r(1dffzq\FF&~y.Tw5+wȅG! !96 XRJ*`7wa&yn-=7{#q+pܝ\ݵ͛Uls{,wn(1Ѹi34kINWrXV1}MgIk[ݱZ8o, 7v{Oə#m+_Bvmhݩ/Ù{+iwyAFn̪F30--4~="&0(d2"&E/!f I0ML2zU= VBI׻>KAdƟG9xmz:vkFw_qE3QҎld拏ؓ!|<:vȴ8m^t=]>gRdybuo+2k05xQoP9n'&zU?zeޚO|7>z'9_O1 r9ؤ̼>7s ;GOfũ^7 ϊ2Y3c #naSrIOvWC(/bgwyq% ,ߐ޷vQΎ'2Hv*Q=-3ؼFO`T?2Y}vpmlQ~."qU-xXx Ha{ꬍH:NV$#;t^%tUzs o+uwTd[8RcŤOx4>Wdd9kC/~)@4l='&Ԅ Ҽ xi@& f|bjy“'nȵ/7ˀ#;EP+AoHY߃IS a"Rt B/ c h4y&qSxbY[<89a ?-_I\F˜wD/ iWL@VB,UoKaL.글9,n H=o?_q`|+y (nxC:_ǐdnP||i{Z ARBIq3gJ/Ʉy 0º0Bhһ l^<}7+ߜ juLge_T-T^9;HpG;ʭ*<ɛaըVP4m(1 (6V1iy{sԡN=Ӧ2uXG $K&UE:e! ~f2* ( o~,s a-Pq,F89y fP@NDuUzWP(_xHdo!'K>͡zzZŧc7p<ğϾ@yyl>qX]8ƮpOՖp-Ƽț8>igIOoybU/E XB K.4dJ-Ap+س/$L;ĩx4 \Lz6d+Ӂg !?\ NG Xt ;ZF X3TQbƌ _BVb8}: \hRl'f ڥr3r>V@݆ a_:%'hl:}RSBC* cԉ& Y[v% 󿢒`߁/ѿsͩY.Mȕ'G![z='+kKn9= QqK t%ӽe&tnLe7|عΌN]lLLɭBhKi=]ؿ6.Xi<:7yIl2s|(zXIuٺcCtxG%?K]ӶnmF@ݛR^';'xܝv]?O1=n,IKXܔj[ uOP%NƲnl絮H[mJJ(n+!!mu4^-; 8Mشy +T07=#O;;_g+4Cek1󊹬ytƺMX !;m%[aBXLB!H&B !Bx$aB!^ IB!H&B !Bx$aB!^ IB!H&B !Bx$aBGuC̄=Mf]j78-Bq$ B<\Z4{U|47reѻԬTVcnu'fRV3gw@_À:UX nK#rbLٸa/6z͗qڏqdGƖ}|ħ:Vs] <cG=ТէYA~,t^|j kmQV/BopaGnъN6c=4w$-˰ ,:%4W Wȋ~N` /s]r| ހ5qtH&xvUZGNnOQtbtwd$ Bx1-g_щ})ZP _`rWjKbr?Q3 Cx?%I`Kl.YzzggC\:] ro+WSnaP &w6w>KBniϳA-W> dt^?Vy7`O\uf>_Wk!sA,X;ߪoX*T*O>g'q/u-qMڷoOpIT߀/EP" a&뷸Ntւ #6 #Gr^؉8·5U /D:. |zr{O !CJ3qJ7HθM: -2xB5ȝXS #5,`}vj?uisu4x wsr$~ 5nXU:kKc$_ŏLy)S%lF6dY;fzb8^Yh)`M,z`i՘56EFa+Gox:KXoHWcWccB C,vb6 COk{4.Ҋ$aB/~+hwp닶g.+Y9e"sfWicQċMߊ:lpB޼=S㬚6_LX9.yn?N.XP&>&"ȟs'߽9qY>?5P۱+3\,s* {T wb;f;q{| /$L5Jp  : 8ظ88/دR>܊zl =:n}P!-q2v`7l>u}nFʕP^cB!R+C0*hfp1iƦ[X1~az}8'0Սe]5]u' %u%Sa6]jcIHN,Bwc8X>L<rcBYLB!H&B !Bx$aB!^ IB!H&B !Bx$aB!^ ?*"݋3ܼy$( AADDDfn^&IBt-::/Qx1"ׯȱ3r9R!Dv, = P>}$L0!͛7%Or)7$L! $ B!I„B jǎر$aB!DcNןgvI2" !"پ}G`С >}R|9SOə0!"پ}CϻR|9ʗ/G}:|`$ B'O7v݆ {p; X}X­$b$aBKf~T\URVctɛ. kV?W0Tlכ $Գx3D:|1oJJҸ z]/yĸzn_׵$ѣ=^vGc"$L6{W6o?KпV3 gi= eNqR\i 62GA("&L{ZH\GSvWecqwfg߳G̛.ge kfJמQLˤ/|7aLW|90sH$ Bx-8j[Sqs*ək,=ZաZDZq\:~][Q^}J)YGhXq#:Oټt[Ҳd;Y޿9 J uVLח*j!S4E#(V}]أyU 1 &JM>d?K%QMְTo\g3r6tf!NKQ_}n^!|I?>_>EKJ̷hXtb{ ɚI^߽H 9KTr"ꉣQBzF>|˦M  N5l1VܗX!$aB/p{̓Ahd2v<5|:M%ӛN,hڰhjo=H$ Bs ky|v ͷ3PI=(f '$*\ih`pEdD,铷rťr/6-s"F.)DnX =y43/tdlt5I2T»,ٚOԓ'ף x(CNXKzWscu.33DcCRqV:Jp/xĒЮ$'7g/4ќ4 ޽= Co-ߐ RNsSLƺyҏ7eCf1m[acyk.mۨR*B!7QNms'[}_w;bfTR䑦ilڼn24bp&N.azjN@3]oh02{3mƒH͇H!Bʕo>|1r$;vdǎ 1}P\Yswɷ#B DQ*V0|PgD&IB+Wφ M,KI&BdP|elrOB!H&"]o?I„BkAA\~wJMo0!ZDDGPE _Lj07 /$L!DCyU$GQ ,4,L0!^xXحdL 'L! $ B!I„B!@0!B/$L! $ B!I„B!@~'LG7CBGTU!% B?r9R! $ B!I„B!@0!B/$L! $ B!I„B!@0!B/$L! $ P9jߌ_^fnL=<릍eDfT IDATjR'ݿ뉫9Ƶ.= !iGmQrmˉ.2cSD]oqrYLYRo!3xaE_,xL>3SA,+Yy^fSp:m?i&Y"I'{"#@!8.dXJUCnpbz6;8TO w9sk#BjR&/@tkS@@=3lït*g^Y \~K%8kOaE'~Ak^dݪu YKԦqB$9{ٟ쾨xb%)_UIeeI8땷, 󀢨Н'G²MҮCp#iʺT[&PfNIHpK4%axׯ\_'q2fɸTnGP3-nᬹ?O fǍqc=_z|mN4ELI'BʓǺ 1_=i3n9'_D#lˏL^s'z) S@,_孙gܷe9n/~*pQ'$~[0iS8ig+oټ3[6Uz㧝)jV$=_>~b+_yVf|M7P #+,~k^+΋?\jvXLA?FC, ;.ppltSI5Bpd|1nU-*=.ʾ_T8l!!-~b=?IvtuZ<ѐngOҕY(GU3Śps"4q5֜䰸8wA`%VfL~=\*k'} S:F*EͶCtnՆ4̖B7ɼرy;)PQPbCޠ{_R_Cf鬹V]qVN^!uNnYSYӧmS. fŮ+y-‹$ KGx;qz1||cWs$7ݱj8-D0 )YacǔR]l_c8 1t;}&&o#(cjҶM!R-i\b {NWt<'%[*t< i !u_z R> `C8өKE*085c+'U eɠE{TRp`IrSrJ(y򄠠rvλ9si[3u|8Ͱ'm6l 8*#>'. "y.}9fu${D~>Μ@9(˃OqK6Y|BS;8gf*ʍP,dQkGs[:h1P;TMi<ΚSYvӁå12[8-^ 2}_Z7V_U{OcKd'V>N&݇E1W5[5q8 BCljOgM4ME5@bχz\b[Ү1܌ЮoapkP| K|" =_) Lg[²f Ī(!޺aNAA%f *[`<'7x(oe[@*ޫӟ=f2 rŬ`M뷞v7Tа.=؊#`"zǖ%U8|XNB%%9Xƍ `1llyq=!+:+ ^珟gqaU45m ~&G4)MeyTuzڷV \<?pxPo~[ʏ{B(T '*o>Zyڵ J(s Ȍ0niۢ)Q&nwId![ٷjěafO8놢s4Q^ŕL{üѝ)w%6Nlɗۂڅ3^'- q9[#9tZV p+Wl;Ȟ.jﳰ#onTp#g#Ჟ-/_BHXQ.R/FBVVTUk' ˋ@^_SQ,/ͮN4⢣ѬE9gA|Z]^|{'(|3:WΕm˘~_"]E>x~'3hFUSw$%>|OU4&^ùl铃}dYт*۔ƼѷbGƇ֝kn)Ё^NuEغmU*WBۑRP5[1bbQ@UQEAACÂբ.TMj:m8::}fhZMÐ8i. .=bbѸ=:}b}~d|$gIHߒn=ߎ$L_r`xH`܎$_*},G& q7|5h%K#-md !5>d9*289m"B !Bx$aB!^ IB!H&B !Bx$aB!^ IB!H&BB!D:"Xڒ$, pf9,B{7o$004+gNΜ9MDBt捛:s\9s$IX ؉1M!!RrEhhY<@&B!$a$PB!0B!@0 B!Ds;W!Ȁv /&a%BI5M%7V'ז!ˑ܆)w9.g,Nj ӗZbӚtiՂw gɮ˨z-?9o70{>Hl9*k>dΝ|5jժE,ɚ5+k(X|.W?Cq Z iL/Y>Py=:OqH-]Fv'PpBϗjn^eL>jIJzvX܁8Rc0o=Y rnoѣlڼ9Ib端R5~[ I۝7 ^1k_[1_ m^~UTaСm"ֵ˳,\(ILo]G_ЫYi` BJ(5LKNi֤! ۽ȿY79oL\ط:Ӽq}5?@qSQNCZvȮx>ҰIs:է_ wcqr;A+E3 n<>&"Q|\x@zr`߳caթ\C7 _)~>2Aת0Ñ,Y *+{LJ,#GbodgHmW n;(؆˒KN=8{z|?"F 6=>]'-e특LКb76|;^gbl>~l;~Go];~܍昻ۓ\ڼ"7g1B<2ew^g/?q8F|6a2~2^vkJ(7*.7}'.R}Sv[1c"6lPT޽(XaI3 a(WBA~&3oQiV,q2 `³d6l?+VCu)4ܫ׹x)ޡ"U-FyL6)1KK)E_6;yZ9f1F6sBf$KwmZfڌjҳFDM8i"-H,LEGc;F'gІ2r&ObҐw$kFh.\rdO.Xt)˗.ez*}fHmμ>#Oq@uZw"S(˙BiТ-^%kvz?0%Gs:A,zҸ[kߑ((I}Y>l ;eCr6mZM6駼ٻ7i:I%wK^iOp#W8sp7GzyKR8 u,#T`>iX/?Lceq\B2/2bs6^ϨA2\ _f 6DK6nIDAT&$7qwusL)n~w-U<Œ!u3W}N溧jV6d7ẗ>=F ЧT"永 ?{~ akRvms8E[t$ z$mn㧝r;㝀yR2IuSVdLsSד,c7s.)Km,8?hjywK3o(cټaUX!(kۖvmۚDsxܕqsRs'JzKBܽ6y;3]!Bx>&-X7x+ KFH`iO[B!.mq)f\Qj=PJRü\6u7eBɍqiYOIwtꮏ9fmTw]iM_ !"v1^6e#s\1Iݓ70\/uug!BxĉyNn~7˘>fv7nlOiSB1ݤ˩c:sݫ[掻 iBB|3lnBt)NJi3">)X*`!>>c>'wndg.x3 3ocwnh24=8ew#F0+[][Xd  f!DFF07yА{}㲻˒<{ad?4ich$沑fjbLK$VlgV!8n:wqw13'=(m7E'0I!vǏosSݼ>mbfvzi$U=mLyG1uu%1̅B,񪕻OƼDZ'aI)p1ze5~IJ|6ni C B!0V'CQ$D>.Ƙ>cgd{*{>ŜxR?wƘb%Qs=n1I^۬X6|i^WkbݖXMӌ2G/[%qy獩\L/F !%O9iq3&:zVRdM/=^k*b|>O\^?RE1zg{ی|Oح>31n.fR{ 3Huc]9eHؠ7mZbS% `#a,6ئ'`:$NOɢdLoPƘq)&EqnqHcw1cݘ@u Cfjw7>`{j3ӹ+{Z.ͥe>!׹k7o4y+$$c^71 Iimzܙ8 b??4Ղ{<QԿx}!qߑy3eT1Ƙ |18yE<^kbfAcs^{\G!?44Z#zu|f\ xqc_ 7bxˆC?+jhFc]@EY=E5t5Qó`j|#`{ !,{س%F#H4r1Ƞp]/%4[Ηxv#ٿu 3§A٨󌬟ici ӵ8t Ψ`Ai׷^K<25eʮhh<dޣ!n: ЂtE}t%,Lt_̱9XP=q {s:Dgf13 dZ9Zqwq9wҡeLׄh iW9jՀFvK|XE}Q<ЯО֠, sb [:xbc?{x1xk2ިjY ZsPBX8poؖ1Ըx̫#A+F}ccWڋx>uĜJ".4accv9Y?dZV!l=gZr# kP#$WVP=Ѓaԇ>.e-:c1=1|?zVuO_ MG`-ֹz8XTͳbc< d:Ъw[]9i?l i >xW߅A`֘͵ek1zjsu*o Yڠ9LS:%ڡ@Zn@\# Z/q`Si|A?QGu譱W1Ƙϣ ЯFЅZ ggBV24eֵQ33ꨚiO/5a4j֫@=|E9jչϨcz@Z%Y@Q]KH/@+kk=x3f]x%^{=Mo_fY/ފ:WМ=РFPc=紎xhS]G~#jZ}~zڋ@3B K<U9/=#D'\-+gshp=h:oyzx1Ƽ

ܶ5v.>29qO~VGCn]A]=Lݸ$'q7@GT<RqȈS6; nOZx52 0,ƜO֒xOgFAn0?O~ 6 ru]#zz"A3o.V^z ;7m[-#im뢻̽X<7V%vz֛]7Fۍ['gö`U HUASEfHr{za/|\񙈈(xx'j$[E`\|رcGUͲW;w. CC^#^x`ś 8 \ٿ1ܺt!M W^޷TW31~\eKKQ HhHqC)"u=!BG41j;vqI"iH9qioAгk+qI\G t?m>gh5OWsJ ݍvowiwlb_Qns9ɺD5 =ѳb 5J~s7]]q걫y3 h$s@\ht\6o* OyEGr:ڗ݁}k7v:>pkܿk@V_kbx/@it{-Q&^14Vgէ3#R8p#GDQd , +WĘ1c0}tz]())> 0cvq_Crz\@Gnh3[yrSnߎ|3A9N8)\v&hݮMvH MZD )Je0M[6m8jka꟯Ғ~BVG@h ;C+:\}CT-8KǏ_#K]jq FW&M;4sy:G聫Pw`BxOBe># A7F9/æh3Øzh0 =-2>DDYI ǏΝ;/.SS,»ヒ~Az~?Pq]MoF 4*Ba8}%]p?-,B9z.&3h.ddFE!95@Ia\jbz6OnȔWp~mK퍡[Np/} &vΛ5Ӄ5w' tiii6 *>b0Q b~<0 Ax |=T?-u,ӄQk/&#.dsDDDg.s_;^cAii)x㍐S>l,[ (---??gFÆ kY^y啠#kH֤=ڥktVV_U^ðMFCC4'h]JAfv6#ܲ2ӯ! =qϽZK01oڊP{ .72LS Ӵ* Ii8R}{3fL+NAt)T{qhLx;ucDDDUWU}:8zmPPP1uԄ~NFFn =XP;wn@G,0}":͗PWo- %x><$l@Ffzz!8d-Ez|V[ ?7Z*)u^=G#* E ߘo_QYH=3 +o˛;jq;˷w?¼_ `X]SU'1a蕪btd(;GS_ڵK-t钰@+h.]eDuyp7Po?jRaor. &,_]msCGv]Xbw K!Bii``tA*/Ft KXҕnv⸪*qࡽX([5ޟ=kũ)1aZ(۴[>&\y+ZEk7vi{q BwP68y-?mt}d^xFW]Xx0AAL܉C&ȩ[aKᗛ+.Tt9ʯ2`ocSkWbkSU9 PѤPK?VRLk9Jq&'۾%64҅V}zK ɨxp}9V6U?EJ4!z]x.:VPR DDD!9DGDZܣI=1#V)l\Rf({COcҭ(9{.CkxNCąoYۼ0#{NgahaЦ76@KBKɩi3NC[wkZ.#.Isbϖ5X2|C8;ztt^pd?d _t'%ii>=LXX2P䟸A8Ck8|p6 qϣM;>t4o %0+z3[B/ډ +Ńѣfig3s0YVM-H;wC5CEalZ0/%wDžC:/6wkn'.ꉖط7\=[ C&q\3ƀ'D ,[MKtGX DT'oAE @$ 0|Ӹ}P&\pL"Ϝ(6V̿y|(%^{+ ĩځnks:a8\#5)w\ !f ^>yKVq܄;% M۠sϾ8c` :u ȽO9+[[d4A.pjqِ8uLDDtlo8r[ ty KR-MMn~{nSsDJ1碆h/ .fΜ+2s~!F≺lv?=MVѳL>l=i0a6 J+U5M4 z?|3O4=k-=4*>W+m*X0 {RnGކ@<6}t]>bz~~SXзͯԷɩ6ǻO_z>ih1E̺!Z%H̅!#<q~0Z Q zAPآZo1m;j3|~. %teA^Ѓѱy 꿆UUsMDDTAw47#O\6%  b%"""":bҰaC|xWѭ[7FBQ3ǃ뮻#GĆ a/^)S4Qe"""""JDjjKѥe!ZAAA!A   oVAAAȷDQ  8{<7n`T(WVF DK / n=TRv~@*/ ַxgRG(ݷ[n뇯wa}t:A@ 2 }4%gGQbĦ*8䇀HЏ#qW._!-= l%00 \rs!KGsdkJ~[S_"ZArA8|2%S4'Av:^^_Gzq0nrTЩQޏ"QqgG30ˤgJ=F ިEh73ao?F5["C̣up﮼B6GФ;ˮ B~%ϩ$-AOMqט"Y )(ߍɿp*]Ѯval4ê+-FЫelHƎ|>F>@Uc\>EB=5{&ZF ,dŪ}܊I MX!\ YBM ?7p lڌ%4)㮕nU=CoeH)SW"j|Vd b iѯUl}~C1!Rq6ȯ#IS4+٭AWs;i Rp6)c[r2.FtGY<\ǬUI[ק/?@Hz܄4)ŲDwosM/ EoI^뭑([ZH~Ţ 1ӛN7ΰyOEڢpW,5X-hQ.x>?d-;VM˯;)%~{4ݴ}aS0=ɧ0ӱ,&Qs/#-*ɿbhB~MRΤދE% 0wAXd6I92΁oPw@'JrEWҸK+)9}x1_6W@<Bylݏ Gd,$l (*̛O$]eq,2_D=z;EEL.ȃ >3W_H=@I܏;(9n>SKlfL j*d+i۸R3 e:.&9`U&NK(rm,(S282 zS*$&>"epdRKy`{bsrŧ\{;+ECR_3w׼GߚifS\Hb됖,|3ʕ|?W%K5>4TY$FFvītQ!]X#k"ğ$T .U)@MM j<@UzϞNE98FP^FBr56zAxvSY7[^t9N圑%8fsz Xw9_9gqivNa˸D`y9KDlF2bzBuPsCY/*V21<<eUoڀ>v\"ݭ۹1h=SIzND9_(\7FA #<6l SBhjP'-jR+8=.pH*[v-;ʵk+s``5oYkѸG} y`Ͻ! պQQ# ^;ȹ{z{W + ;5L8UkKh56M);܏4NQZ RnGqށ%clY]TC1d^5;voeH9r]Ews 5bw{^.RkJXτ*bNUPnnxdٖl^֎bjvvoQ ~3E Y{\!4Y N hҼ%WUpl/a eI~s?c8lɊٓe9~vx)c(3dp #VsӢk%Z]AԾ\_֍VscyUrMxWgBN[]tu4Y辒zò*ҪGO:T.`Y|X]賃G_x2s+7;5=M\iW2Nn;n2) r2?`E(ӼǻT H&>NǫVnf%7o4#Ȩf[Rw9v :**($$z] fcvm$S91CU()$:dS3ߏAtS,]QT7qKb;en#z B ܖvc+kTq;ͻ jv8"fҴ36D7inNo4~ݲ )bJb+KoՈsNgzYGRIVTbD@sVFFEi>n۞k?7+`'K8s@8'M)F; S̵ tD+;Q9<ne녒W?; ӲB>Z!"nmi)GAV<2ף:W=b:?>6~=gH+ZpEʄTw=Z-  Fy8)\K-8e7sh#2PMSJt0M>|ʂ`]GUGxN܍l_>~gЗ3hSe/-[' c*(Nsw8b8_p&`zk]ecP8)<1YoNCN3{o;.Ή$kiғI3-J+y 5O0Hθ;j.,G598[L(TNQR8HL Z$ ky\9GHVT@! uiLZn&% 'fMY:`ؖ{21:3~6?78Yns>hW!4>~fDS=#lJTY<#ᡡ4x!+Nw'K^nHAsʷk҈ݗp3$ YAů4a=2]Ov^ə çDUΩ۴)&CIėҲuBٸ;Sv1<~ in,Lre-sW~DfԬU|VY JMkHrxԩٝ7'CדQzB}>,&3=}+qQH') 18h!W4H: QN[תk}&n*$pm&.e[wț5 Ã=_qJ)ޏErUc{vYٹ};;,iʔȠ[̉6$$?H> 3U͌=Rl۷zc^'S|2~ʦٳz}k@[N˯7eS2ΰn+X;I#Cz%l6A/8៰˻+aoa8`8'n*8Gy:sAv|:8혳i ?-A٬jɼHH-SzSgL,Pop&Vk-d#bU{3TTce@x;Y?m?󦟧 1xDтah0>Ԝ?Ӡw5B>Ow~ܞ-j3dbRŶjWZnL"/dȁ̿Y~] xjX& d?oS~(5T mxt(޻$ɷ 9}Jl ]zk\$O͐h$Ң.sTXÕ뗹c=^JrJ!a\K~y`# Нgmm`6IZNc'kv$MۻY>TYrfa9? qOAȋ~O9zz`Lspf]DamdTFkws}w\mx|Uleb"a(TmՁh(FY{L IDAT@HeƯv>z?/Mk"h2{GW79(.͊jA CX ,"y"`~fdOܥSTt׭al8G'_ &@2NVx*IΝ y]nB%W(e<HAԛp8<ɯ#v@zK2RFtPPmvJ)t`&yPH63&J,#}ƼpT5]'$Di>`i!\+1t9LOŢ ck W7)|HN úe7sf}/&06c< m@[_mc_cg`Zjon97 B2XiC8Ƈ3x>K>h͈tl[҂|l$|ɔ$;S&u(V O2v,JCS'T0}O0ilgڻݵBx=w-JȜ95KNѯ,m?+M l؍6fһۏQA¥j/;M봔cS_~Ʀ<7 ?/ <IΫEPB6t1Y9I9 rHyfz|UR{vPY˥ sѽ< X}{=`=/yvYKH&WI , 4($J 3ps39H cM-zޘ,C26k%&eZm; DPd"/ʖ/gō`F$ڜŋY3O&0sRM>V6$ aѶ`F4.cM'ySǟ1:}Jűc)~,b4{e_qrjSR^T~ k6;Z+L\::QFFgLD~3S>|)\',X$M1|:гH31<?EI?sєiCCf8ي~Tyg&loHwJVC%hV<9r6%rMrAa3S7+qxD];}H^2G]?B 7IVEAxR{]^Lߛ/[Lbe+% =:L͖f˦ ؘ-k/t->y޸j_;z=yO{Z1r T5dzr P%1i,zc˨b7mz mʳa\\z0Q>^5]1*srVGfflj'1lw<*j^ȧoe}7S)Zr ?m>>>XZʔ)m Sd?n@UU9Js;yժVy6 xTUo'o2mъ[S0_z #̗ߛeqYfzeո4|2q`t%`ryȃd9‚$cuD^C`f(i,zm2&ʸg{( ăAAA|K   B%ZAAA!A   oVAAAȷDP+~eڇS#8jS篥9t7G>G]A᱈V@f6r<å y9$lTOv`-P`RT mFK9x;?  OjAR~anJ:eɨ-fJ׳|19 cy+W*U{Ǘg\~s=|ǁ#صr0XvD<AAxDP+B>ny>[Ӯӌi^jsN&q hQ^'Q?V]DE%j>Ҙuk! DWf|A &(qhV_&imh؜;P~]:.-P'43e2u7f_€\Xs w$毾@+xlKϦr6gfr{lmhtS~e1věV[r& `"ZA76xAK#o鍭i\8 K2`Nȗc[QLü!4(Ekw϶=;#_vƻI%Ifկ1k"N"oHAkپu!֊K6k.Vugˬo=CT3YBؿ %\ЩCFmo=ȡ[q29 &)ȵ;ٿu6ex`A߯/+yXŇeWMSI'j_Sh1YWI2l R+7n)*ik:U)};FڋoUٿCsv%2QzY3t!W4/of>bʀ  B lfPZuUlr αmGuzVAg윽)Rn݋m>t싓3 㭅8ӂ^EpŧF{_vTkՑ^vhmڭo%dIB5h4d @C`Z-֑)wӖjRekRMnTtWrty?bv8Q,Y-[#٥+Uqzp.rFk{WE:[G-6h^kye LVj؛\<ݱͱ@ I26+z/}؇:nEzA8jmp}o@#hwRT|am*cL  `1xJ!?Ix7v"JZ"IҼ.N1?Lt~ȦG @!~iLʦZ%=쳎'9H\iJ^&#Ke7v̪a4ZdҬE菿&|("88GMWq}MH5fôENuZ?|8Zm77'r)';)RHk UcQ}#i*g?ϲNNA-\AAA WQ;/}cp}OdT&4V+;!:2U^vZfQ;|Z.%Y5Tcj}"\(f깸|(#bTҢ\[[/m+u$)뜲;zb< /O_Z]ϰj @Bhm=LȔc#qOBYG˫U*"}_nV * 44$eW ( $'&KGJaX%r B( \!:*L' _\666xd~jAȧTbmH`cVV"оInOTh="t9JvBH4E R~M}zy+TMy㋯XC]N#u҂JQ _[ͩȉep̫6]Jjdg<\%ny&qB!>&e(m$:_z$/buQm \I"h؉K~ox?;+9ZMZ_Sn}znыY ޓbҰ%CFa˩,SS^F}nu(=_n!Pnlg[ 6%ˬB"%rҨT I\L._ĥ˗)]eV233ٽ{7泧>;BCCG?B>b(dAMRISJ~mеL͚_s/Eƽ|wf/N0 f~܂9Qih}j1p-Ҍ R5gͧF@@f|<AƟ7t,٘R/RASߣ$mB;jZ7? l\:Wʷ #\3O6exwҦzCI;J),zƈ/>czn$Ѹz(mr hyMGIR(ZM>Ʉ}z_뵒1h܂xFS&/}ھH)ґIc1vJ[jYCߜ *a3Jd\A@tT4+V.+%8y$6_V$kδ/[y/fZeKl̖Ɨ{S3Loö013xL hQQl !(*FFBE+&߰l?+/2ƪd.@erCMVEBr4m׫? (HY!ϲTEBg%** X`k)Sj.\N;QUCGRb\iN:EUrٿo9tuֱ\'UU9GL[֔tƗȴX6oJW̖e-͖U:S-j/e4]h/2i$&MN׃Yy\B۶m>|8FB1,4($} o$XHd-@dٍ-H2r]%d˓dՊYI˕'Hls1!0Zm_0*fyHYKAAn'2k,&NHffs hͩ^g̘1Ey@AAAA^"ѣtIϝ(3SNіgЦ] 6qXAAxDcቍ? 6̔.]%Kk]EҥK9t:Ə?Ex  ¿IaZA Ą  RUUƌst9޾};?TAA~,<ӧO[vܿlllh4Kҿ\3zN>+AA"Z$&&Z'W`oyUA';ǜvMK&YOA{1Cs&K?y;5-fp2w[Bnj,ED8a0as5a/)ATX *-܂ Q<0[L@ Vޘ[ʵݘzmᛩ}hS(WHRbM6}QGdk7}_-t/tU<6B$ZAABP<'Ym=ӟ_@F8[snEݏ(VӣT]5-P'oO3N+"q(%kI>%jIzhx~Da]i\? @G&6cȆS|?mevsףk1i֥3Apig.}љ!ۈʌ?>L![; cmMxj7lmrK*WLwFG4m쾙 /~M|]ZS?!ShZsknk6lL.Cx4 wùH{ڵݥѩ}Mէ~۾>y:1> |*9{+9OqxڷmCy'y;%р=w2)shؾDP+ _:>M+}Drv`MEQԜjUɼ1mV~G>פԙm;3uXYǑStm۾gj\ʩ4Y7z {zt66/kG1pzT%T|u#ܳDkA7,l:)IHSv7 Mp1C#DŖeSUY0|,oF=ŔkS+㶋>?jtΗ۶q?mX%z'?^a.m5-! |s>ƹhG|E+9WCc˶-,hk8Psw'WzS%L@ahgѬ~=+?[;;;̙39se2gΞe̙;;;d% ZSU3gΰyf޽kPݻ={5AAt:-;`ӿ8EC[&c?dC[Ɠ屿{Y Qyʺۢq\T=̡KzBIu0ZT8,.J lYWlrG"x{Y*5A i]"[vDB]}BNoAmմ4^#]趛ƉQޢU)Wlm(ߦ1%=_8'~DD>mk9t5:]/Ƶ۾wh ?Gxꭈ>)y.TA)$l z*zU(_2k֬홳g5kBf{/ZᙊGlݺ[[[FhL{ѬY3Μ9@ٲeپ};>>>[ &CzrL/e%GCc'A#KfvH 2{Hxzg}I%ѧG~9]ȘOOEz*{e *l=dp&xe* y֪&Ŏc?RݱTuq㏯!O$S{`(w>ST$IzN*q$:㐝[/o\ 11d\ZλWSom IDATUʤ⒵Oٻb?|DUU[eSsE#v"AdddЪU+=$p}+LehF+͙ĮeH:Li尕d\\P"Q-xS\(Z5OhK;WMS+ɉH{z`[-;\Z aάQTtנ\n4H}bIJ^hw~a lǍ1cD@WUVq1E`T\{{{Ea„ yvEЂzU-$S3ST~I |ক MA-{+ 6̚V-H@EN_z+瞽Qa-gt$ruwv -rp?ʯr'4\k-ˢ)IwCI\=+r%:doR t jϗs@}"I2>ᔻ%;}-5|lTkRԭ_xYKH}}wIp];qzP.~1TZv}-v^#I4Tk9VHKĶ`ik@I®\394 >g1 WW};'-_Gfє/W2Yx Vxf8u񋎎ԩS)SIHKK.y&uֵ\% w;Pi/~N6|ޅ׉ӹQ ƼV5 ?|ƴp1^_%Zm2lUUPg6׍}bZx:Dݺu,WIUUNv-5ec2-ߛen6ٲlY53YWx/[<DK wwô.]ܼyUUiР˗vVZ?N?;: of7F*IHBD(t+)RB E(EDzH!mg?vl6 xsswv{߹eX/7 rP3_Ɇ]t>åwڱr:+_J?=ø[ؾ+XcInWÅٶv3xA[vps$7lf>o+D૕l۾C*`Lࡌh{VYb h!KA5'{J_  |A*lUT4 AEUTX\7mlWǖ#EEU7wKº)K l{g:}߉*6ҏ]=! !$OL%Xp!nnnW_}3g>l@+1^k>vMskXsjkꆃўzLz[ց0)wlo٤aF+Oչm;'R5P*65@XmZ?>m*`t]u뎐§U6%Ho;ԅ[1wuIy)my!___8ԩS9KѨ8R v/S'ޭeھ[J4+ 7>&q+p7-QUq;o#bP(ޞ4U7^tDUT,c9Rߛ1 vXXA5m2/w%xZȗ31HGK!xjّ&/INNk<Vc$bК)XbeJdӇ8|5  z,.d{5^*1+}bKMk DGPi<#f%!Ogg'N>Mrr&/HNNS8;;nԊĵkhԨCGaȐ!رҥK3x`:w>&W%Ə̉D4p-E1=fB!UT)\CINJ,aPxڄ"Vvuf;YBw( .h&ſB5prrve$OTZ hڵkz@[|y.\@JJ 9 4^z67(*yVB(bI7Hxbbbby ]8wSJΜ9C41=B!BHP+p=-d~Vb(J%B!xvIP+gfxzzRT){9bbbi׮ur!B!3NZٮz`@ ̙3qrrBuΜ9Crr2f!B!ijLZĄꊋ C aҤI9i$00;;;yNʨQ0Ȍ>B!B+2xbTU?棏>J_~(BjXv-}}B! j-EQUV!B=B!B!#$B!BkIP+N귨mR>Kf|Gz;[k{y o۔*B jOdk+>,5L#cz%rS9MZ)U.(gQHyᥗyTאr1hb$rtJG @\@#U|55xSN=CNr&]BRw.ށ4} ֟7?>R^ !r{?ts*wږ0 pu@7SP:AK<%4s7~öchfXǐa 8s3ř >T)ՑJz-QZ{SH'׉;wN˚ecgoXw".gx\o'QXnήy/˚mZHP+tb.cW閼9.Vz4̎k*z<߆A?!ޒD{C;gp{~ Ȕ)斈l߇&>xy NZ7W0+}۔ZZ@Qt 񥎧7~-1!ɺu#>h$eL\\Z>Kgm$d9N#[S'ne?ttN=]tY}7:=4A;=9ĝث=N_e=wq`:~~Mբ$j8j,Q^!qҲz -'MO1t ӻmyk1C_A:kԺF;ǒotR8::SR]<+*zsSLHZ}bZ.=jԖOIǷi<݉zn۝oV|ϐfQ@aׄ|yڴ57ǡ:/`x Qw&&H=Bx>޻z6ۧ.%siZg)Ӱaq6vY׈~V…1UMvMskXsjkꆃўzLz[ց0)wlohaF+Oչm;'R5P*65@XmZ?>m*`t]u뎐  -g/lYw VʹJ3/~ĸp5*gVǙ=5ZQF;*ԥK\IIG+Ӷ'O+o[#6"^uvo]ZqRoF߅]sZwj;f܈8ܯMJ<=pϚ]=ҊCntϾv~;Tmc.Y7Ȟ5󰭢vToсW ;b4:Sɯ6/sd.TEAQ  TE5.ҔggOZp?Tz2ecϋZ|،uĻ;lpjà6qM't]GB '!5kosʕL-c2 bݺuxxxӦMd24Dĉ1#GЭn-kƖ-[^:ᙶgIĵh7܈ hqX@ŭpA~w;F)[)11Z6b1,i)<HKԴB&ϭd U+Lz8Pw.OZw-GKb)R]ɛ66 I?L|,7b0jPue[H{Tβ.Z2E{s( KSh܌Ǖȁ4X&Eyv?c33gf6 ~۹w-_yff !r'2kb@g* iB+Xo5aTRXz8w/Bz2TWһ9b|Vڵ=n.ݲL$PyW:tLLQ -AQp6߼UCT}KzWu@A#mѵFuFR+w*%j=bS9wOip{zףfz [/?g)8{ 曾1^kSAG>\wlt-zP^tYH!saԞ}$R2^O=P~-]s,ŲMӺ[/۾jj6+DZ-^*!_iFF +CjHDcw##s˗Ӯ]ɓ#Fpq-P6\\\ْU׮]\2Ç޽{3iժ aN8xoedBW ٌ14E3ZMdttMKyiLC8mt bZkZZM웾M3*hf7:kwt.mϢgY~qj BϏe;VedLk:wg/1ލ1<~fT(-Z?.!lDEEQP6T RRE=zfuvRjYY;p 5^4׺ϫbUev,eR;`~_@1(^:&Q>KO]Gӭrf9e~^yeM'Ϲ HY;mfl,ղjY0[zv[]''ObŊh``9*T` 6lȱcl֭ѨQ#x vܙcc(R0,݈TXP5m:qqαS4Λ7/=~'OBd%B!r5 j#+TÇGnh4ҥKtG?aB!B<=$_ j?B!B<=rB!B!#$B!BkIP+B!"גV!B!D%AB!B\KZ!B!B!B!r- j6=Nj:=}&6?%01|W"ڿvIMh=L#Lkçs(#Q0LʱNxXg*3SKI"c'A)qMxѧ=Retj!_.8{׆Ӿ¹-NML+v]kqd$S;f܁DV "dX$w8Kz*7OGC4= =b@G3=Z#:{JuBzy5nn2R_plNKڷlEƲFoe"&t 7? eiл?*٥$ez_q>7NX¡;bd_YLgW>k׭+r:6_M>gMPjM('įEӹL31xk&m]?sZGJo˻ݓ>"s&d(R1xZMYȷ /2eRńR~KcHK䧼];cޘ‘/wr.h@fMB> )$Qxr!r9U%z#^t}i)?1̿~OJX^";gftf1߾!K!yqZC]}WAtYp ޞv3@ĵ_zSj{иח~ m澦EevԣN@B~Φi{p4ۛtsS#3w4DNC<ܖsީ 0#7!Aݦq$Et>Ϡ.;n)GN/&}ۇc;~1^ EB71tvܶxm%RuswAllwBL8hI6ok7OH=vMX?  |кa}[}*N5hVM5syF@?<Zo.nflw kB/>|54?}՗O#35 CZ񖻀N0,?@b[t y5 ŗUz.(fʓz,Z'x.h8wn¨)V+-뜿Rž\%J_=T K&+q"'Kp켗?g4A3/_?ҮCz o#- k#3hPL >צBMGxi QJ6\6?f”FL(h0oNLZ}[Ƹ7 bêq)i-}`xF>vEu(L~|d=Xr/➦]]RYlin$`/YlMܼ傖p:;;kJl]8|M6|9qF'?/b$?xDFne+Km] n׫ְnZw) >Ek7ch^=3((*h&L2|gg@ul߼QMQ,i3UjUod_oI׹l!sBhRw7bYyn~OeљyZ"~N|00u@7y{̕DK}e[0zZ,ek]K,1[{2}zVOn ?b1kٳd;o`u AX:EuN"fΡջ[s(nʖ]ȳCF5TSz3>M[72#cy#-feȏv+Qt̆80CGz*y!=T2QU]3($<9}{mс>U-粆 PJznEA9|Wfqs;7>=[Tu ڥl8M5=6$tbvl ܵ)aSڝ?|}"WVNf5Zxbt5V95 TUUQPP  .~ZN i"EkZ%a/g $߼Ik3J5yvVlEX`a } .A}QРXˁZQ+/vhKl?JM8Z=)h$G}Zykl))~opT G^E1F, ԭYg#vY՞1hi߉M eO BNlpgBz'I98иϾ/rmաU\0:FT\GYw=|ѬKD)K}r8p,V*.Fۖm93V@.u(hı?jwRtPplNh9'T~ wM[UI)kye֯yT Z~!>K9RT,`=ujPNTc3ubvbO A1PVK gxtsx =g(S\OoGq,b e:|> ?dZA({.?!C)YYsۨgݦ٤9뱞.+ҴIIfanDYϚ#)MT#B<mk{n0χ4\Ɇxk6[`K/Mt"wZ"K՜Q-1+ߵ"ڦ7RS*EJIͨڤ^X)$kܾ^E@U1^ 9¡c!fIE{-{w%/nny+Q;boulSpvSRujEY5{tV9}"u_410 *]mlhDǤP¨i-4.h5?/]-PBjZ bgT4xnEPlBdFv闞Zt5%?jIDJ`,&TB_ FL7t;7frںRk%`n{Uq)rbㄳ%1TLǡ:^,\XupN[ xͳft9buCJ4RXC҉t 65H{ё`6[t"Æ͓6U7Ro糩R%yi'W/yd] 1g}X&*+Vݖ| tsϋ+qJQQS^M=1ԚhCV*nDlMo\rBfՎ;xWdh<8܋orcwb7l8WB+~7K6ɴjgpCM:]ݿClNLlXj1Y*uNƒaY1Iӽ)We83܎&Z0 w((ׅ>st +}˯k-)梢q@~_z 'EŠ*P-W; JIf=iJWMfР@ѩꄛ[ѕuzwe|chd|bb5toնb%?\Pqǭ1~=tm1W# u;(r} 13\7lz-zP^t]HwRި`Ԛ^~}'s f}Љ__fP&g'1x7*gW5Zj y={n|޾mºMSg 6}B+wafG@K[ڛ^p =O0WP}n3Fw‘},Fl6 o}Z+eOj~׏inHn2ŎW7thӉN]?d}Y{ ^41(EB1i덧o(=}LQ߻#|ՠ_2ܩ+^~vϤ#̚vFo6 K|"ZMv֔1.WZ*s#!3*Ξ4]?B3IR)8BR6$G;%CU1>]N[mlJ;lVտղj9vVFF +CjHDc=LGuߝNΘ4ݫ;:x dW51,u]9p >^˺Ʉc2i(*ylQQ]t ՄHYN"аtMcIcVAU@ӕ4k؎7ngz8*zفət4n.CFˆ1oWTUieST XQߓg̚>w[_g~ViA1\v&M`U)}!( *d R GCs<ܵU˲ځjLG3Xk[\+歊y0vkɒFUuh]f\d{ٔ˿.ʣmҩ(*dz-0;KV7hsud.>jExXطrqYuK$NN]˶Os R-/blwvc2^%nlZ-Ҧ_[zv[]}7@n7-`ˎ^Z(C痂2>eVQIOvbx|:lc45~?pb/Bup*=gn ?y`>ON3jX֢s+!!k;D9B^țek|~ڭʚrKg rkRuhSֲQ_YKXjZ`)sNQHWh7b' k'-&.x$Њ& jߤ`LYPQPۣ*`:Q7oX.ё믳fyı{LgQL¦oͨ/~d8R .ۓÛPN %_o? c+ĥh(x6.[dS3!Y?d8􄓬35Kf9 !x%C[H*TGv&}v9oɌTh!XբVkE pOvS945-iE.'Ax*{y}[/y'>Ln?O=0kfJ DQC G ba\8^<4 *qw.6iۍ Yܛ{Rq+BٝvIBDg3vlښ/֤Ct[,}V!B!ijCZq;`&[ZbgҲ=J7Isxuj7>ߍ狰\7ap.E.;gV~.T%HB!B<$#z5{N`IJbPaT9=Һ"8޴7$}uz!B!ijGZ>p>Y2m9kڇ{m:!B!ijK !B!ȵ$B!BkIP+B!"גVL3]C'ρ&mSFt-cty5LRQqH~-=̬:I3s24x?)GD% (rCzC2O Eֿ]>g dG!ra oFKcdQf/Z*~MlS\+?/d5:yT; Vj@!.moHL~5NѝJ]x& DGJToQ]-ߖN绥]p.Wۮ*ʣ-#QPR~Z˜w,a}gq4g*Sʿ(M lu/ۗ>#S<,Rm2ECO$?BL*ώ;ٳ'N<0V -hs}V)$$RmʎMsXgFZZxNFN_b6"Kc6 :wwgBh?u?mC"`:4'Z푬[kS?`8D!A"STF<(j3c|/ 71@%6C<}C4b9'efB`FJ$~0}K+.p{72uP;||j;sqGHf xk~ mOͺ[|[0p2iujWe 8JhxK&Љ=<:7»/-]7̟Ho'ӝH;8}߼:{ J=Y'X4~Yד]oތr>oE& }j _SubK&F*:za}ua h-owiMHp}گh:̮ѡ5m%ߏVqO@`?<}m\M5AqF_<Z۝̮0C'|_ Am1ul˽R9m@_=*#5Fa|wLNh8ݻ^ i (*H{C_ " X^DE& EH %vqr H,].}nfg}&: hѶ>ާsN#; 9&ؑر}PE{EIQr臉h_%#Gs1.ԐVQ( ZH+2uŌX3& i?Vvt#W"C=o7s+|֮ -ֈf %׹?Z?=% 1.>/@qe((E(ymf䛉owEA%R+nC.\S4?  =[K?b1O~9լ9߅rVcgq]Fb~ze,YODWҳdqzⷼ8f1}Ū5K5;WÕWIT P颓OL]{>7C'ص+¤Б<ԨVBS=0: iXU"!Y ! 3!ز2wS2fޘkҿ_3NY_iBx.La`d̢!s##+aO]-1>&|+vUas f7R>(?/ZU?s'jvjE͒G64m֌fgnc|8;Q}ykU^DڒmjoG:S=Tbł''Wb Ko@poL^4NZ^Ϫ}UEUUC4 hڟ-ZЬy ÛJMc C%ڔV5BLnMN/BW@L nmLڈwZ5;:V[Q҃{E}2t_1KE-r+~UG[C9PދA# .^՘x)WG5H׮-}G$v=˟_W<+ 9>>nQ⃯\ێl0|?9q-$ecODJ^3Â7ls\TyѠgwZ3ظ_Z&vd޼+S]y9dc@%Je">}u?M},S_Vͻje|<fc Nʩd,{ݾrֱBiɤ\)dNd=}{S{SXQgHsBL4x f uQTLpKePY]/FbhpNP  -/WU5L̛#:Ԡ ;HU#1~ ӀdtRS39uN1昨A9Q3(Q* GIw/'J?`՝:3Gdxr=XF71jYMFLL-/@ǎb\RBn~>nuDL߇xѦyvn< j/B=,v28و01[ϢQl;S͞$Tƒ^ ORFH8qBPCBBn܏պQ 8B1*NL9fhi;7?/[ ) (kd<^(-B](W89VʮSy }v\8|%AEi!Ï/ÐMk9rOٌyU6~P Ϫd[ ES102Ug:l?wקWT@ޕ5?S{m}{Z ~UW5WTa+8OYg$eZ0=4OЬcsԡۃfdn!y^C%U{nHƆAe^q8J4UNjq OJwN[Np +Hl8BnN9VxѴGG,?g -?t] 93O2'Q&>ъrrrͳc\h;D!=BRoLwA $J}WQGEN፡]9@ LacyfgeTuI;/t w3Ugئ_ ~2๷}Ӫ܎y`] > _nϔEӷwτr o"fZT }o2i*"@;^cShbA{^ſbke{l|v  awt]Mg2wd#!ĕbg{w} ╠wyH'^}9A^*]zuRn~0' +y' @`fT7\[q>C?sXY73zU] NїW6Bkf˫%~,.np|dɹly38't!( PpMp=+O"2HǺº\@D|g=DX41,g>:'?'՗jaۨehUqlu.G!̹ {zM| Ϥ b8͙[;AxxNCw)gm$ΛJ{iЖK 5>6TƬ:ΊfƬAKT"ctӈo h juEOB!~,.a`34$,im{lZT,g8l$ tԞVq}yMq*(hOiL biٶ;^Aڗu632lɟtnߎVq ~i6;ugAN޾;/lsrœss64mގC?`rxՑ;d%ڊD.BQVHP+.X dZhϤ  0t`$*RQ (5Э;=7ޞǚ5#O^Z5_Vd~.s/<4-G1kj~7LixI}5>Yh-= _x5e5_8ۭ_qK8; ¶O<2~^=G]o8ǧyZ1W`̳_%[,BqmV\pzmRT(=oŚE(xPݜk^{nEY`χCԱ#;t}ALi+/6>܆Jd707Ѷf>&Au44'RgjŮ ] />;ЩG1'އK7eY1na:7d}m(gPB ?6gn/͠ѮRTbaeu +Fw9.<@B!(?$tR=%M߻rhY6ٙrI.JQkd޹&PL1zS+&OL+32c'|MX^ aQD T&]7@1ӠgwZ3ܰ_&ؑL_45eCxA2OBh39M꧈__\ͳG!e>@@/6"f3zO@˩bf &3EJsn[T BFV(lS0IBa,Y%ۨ4UL jX9;9m NF0B9bcT@mU\!'Ï1tg .toMqèOagg*~`BeJI^ԯYxM٫O= 5MQЪvOgNY2c.G[}Vs;3ْl-$?LC>Ci33̢5!8#=ցGwţ]s]yRn*m$ jeQ|BLQPTt U-cc tc7ס[ 8A$~!/yo3cJ. 4ؽ)\CUS50.34==ȗmLy'њo?-S5qԲ3^[AC!(v>1hߺ-·^|]!^ڶnMK-Q! ҖhXZX>#OOw_Ay=g9GqH[fė,*U$Ï6 Hԧ6%(hȓ 0lUSQ;'|ׅ@Pۿvϡy3;t\Gz?/__OJxoOPT4!¦? ˿ʯ԰kCfقFS>Hx0x!.:ZYF\I]䞬E7slkG%T3 +<=F϶%("3_ ʹG ]3[偑(7iݒjAN~J3B+!8EJ:)[`jmaۯ8ќ*n9JJPԂc<ٞu:XyE^sBaׂ"-?BQ??lxwtDn7skKH,kZ IDATd58):>5'lx?LZsMSлo^YZn͝ysVx{rkql(ys{8r 9%>ofоtܛa-]7ӵSf9b"k9n]@&Z..B!N.߫ `!+YyD>>!|h;^PװaŨ+"gד>=wf=J y}t|W_~<-q'Gf#y%V狖_?2]Am͎G0k"^X=y+L7+QWom[S@;WѦg{1 a3~`#a]B׉X6k/}Aoe0f.ZΪ%2~&pOB!.X׏cԢ7hO˶5}(*ޔ85<&@CV07 a&0GMn}9/PiF|O&\aM7B@@֟?nJw$NkgӚ]tDmOt2ΤqF #sF~Bwnn %֝XKװP#?ԁ~^1T)1R–+Ѻ _M?T5-WcR~p31u"1' !BWXF UO!-AT K ',QcM>!z,تJc\#S ?Bs+3q"5o tWU+U\ l% @#iPH C6Lp1MuqchӤGuLSr9anQi%f}YOs۔h#6 oNHP+B/$q:4$#3YE yF%*cgmpEEEw d Τcb䐚j|ӤdS!XE '?}NEk>f2%?՘&1XbCJz7ex츁̟fCGp(H`.~C}>h_[T←wމczס!BqźgצKئ.yX9U=J ! {&zWQw$F.f?RXHu/r.mGsǯfW3-WSCօ[$N?w,ӓV@W—9p:%Ӊg0u#}{Oݝn5gZ8:VWmxaMd<_'t$4,a:p(ÆJPTr`8ď_[10 c'-pveB!`:S GjB6ם.nչKXJ RQKR ZGO@Ngl~a{ƮrVuxdح=܇]1zC>n |mN}:ӾCWn}}?Ϡ/=07w]>rTًPg<W0ah8m ,8L(})ŰAtЁeܼ?4 k7qagniz)ԢO#E {=΅9gms_ٿꥋ_n\e۶o'.gB\d"#]N=zLwi7lqFmݶ-{&zbcc= F:ކYEEApW0% ]70m |(<0ݡYpՃ\Mt@w(ϕPq, چ*eénXpOwu>wq7>|@݆[+* o:F~q,Tg ]kAޓdt3 `˯[iڤgֿb3ccks6}۾õo }۾J˿|le|ӊ{jB!D٧hXQU{mZbEE=g]nz4@)M j I)r[MAQ^P bI,11ts_kxsLJBqfV+^^^YBjl6{&RFZqDU"f#2==ye_zJ:m%pT/šu)&ʐMSQnL/f>k>ˌ)O2dzCPli9Shw<W'+7|!SrecX<(ۛ`*%J jE[7ѭWLDBw'; ! oMYGZqi Uhm Dc߾:з,! |f)ݸ{ǁ,߀!ouzTž OfPEx)5߯S] i%Qev( AAgŨF`` AAAYV\qRu !SٗCt΀V Nc 0Ug|d 'Тh]&OHM&/hό\ QF): ӒI!&P+ؓ9z1갠"Gw/_!9ĿKQ BqԊ@7*Ն̞MوAy9/ixX M` ID8-N%k/#+G`Mm`E8K;Na Smn58$NxX47>MPP5UZ!B+@Zqը&/Bn%v'^$bGgߗ3\P̈9>JXG4ʗӾH[˄Z+}b'??m)aɌm4H*Cޑ.g3sz=ޞ &٨R =y/zcSP3\B!IfKQ@QQTE+!(ZN h':+&_K~;:J}rdVIeeƝ&tƷuR)/$ZS~1N.i۟Q`1io'o JVm?MqMB!Nzjq%+uRL%(fvu-S啴CEBMh)Zp`vcX%4STK\u*Vi(_lO.<5OT|*yd:>ZUT!BGZqAT h!ɗ#c9 ,mEEVJi0.VV !YYٞBk\vV6~~_$=DJ[IY+!M"[EBQŔ+GRQ*VgcIĔ" jQUbo\5N5g+$wTB!ʄ`>BNnGZ( >Ĕ!(HvHP+.X }`7G`?ak{ EheȱB2%88 Bqq$FQPMfk5&Vcpp !BxBOZqy| !B!9Q!B!D%AB!BRKZ!B!B2q+MɂHe׎֝>Y1Lӕ,d~zw +BQDQBHY|vWLnibz A_.h|We3Ḉ>>U<B!3 !J5Cw랩OeWB99Ր1{W%4 a :"] !]BQ 9g2,rFMxz63wpIZ6XMY<ګہ09$}:p`eݘxV~~ q-04Ch>6{18h3m] iт2z ݟԀŶÙ)60 Lۍp֡^eW/08#۴}oUF-B/VQF9ϱIU9DOjH9ls/Z,u !Be.1V\[ͦh]sIyi`9JZV%2aCdb#u>ruFLi+`*׫Na%ϡծ+t#3r = z hĴB!IOۻ}:fv/T!cwt+oަVtӠZ7wτr o"fZT, y  S' Ih z'3aďK[?`LGJ<}B!DbrgK+}s˿:SKx۾m?S۾ɵ?7gO}y#C+p8*ĵkEp QTvLjmN\l;d!$N"**3/gͦ~<سw930X6i%ݤg}vlu}kn}Õ\/c,[>}ϼ|V|/B!ԒV!B!D%AB!BR )TX#\?H*D{1Y [ 'ϛ;c4|9d%0q܆E_z;{L}}5b`XTM4 v{1!Cϴ"mVA>%KvjoZ$=?%I-beE{и/7xʍ5}hj錁\mV5jx]g]q~StB!B\-L|ad:ؓlş,첸7Ko@@f6Tv%f2iDzBl6>ٜ,+̓MBĪnuq+9-8OmT׏ 7],\,cJWgN2|01~a:֡`ɲ\v;mOB %7{,v[!D*EJJBKܟAi!UF-=-9 {u >tõ}kmv.Y\+~Mex{r6wί6ޑ7lp5Ϳ2 IDATXt;3V<+3~+Pi7dnMac1GrRsWNP6lM,. bW$bR$M!ĿCb, g澝-=ʸ3\i,,z>W~=:=W +u?JW5!(:kGןlmv?ĵ>ևЦl9d;yN<!uzjL&%4ժTLB/ZQ5UTrys\ \7ݏߏn!zcO sb4f$wQS1)*<=Ϻa(Pڵ8t0G%22 Sx{yQVMB! Ԋ2oϟg2׸ qgM3a>5Ohs"8~uQό`HF%lFVQMUҹ;w&110\276h]ԉB!.' jEg[(>Y"?2Bɘk)(R=L0%qXEȤr6w@칫jwQ5>6zOyZ ZY7sN퓘"/,! q0L4mܘ{f !HP+(ؒXURµiizR͌Q1iMXD?`@#z9%m ;͛r_ o]@ hB!2Q229Ca!*gi !,BzEUij* i .wۖ?Vg߰ )WѧB!BZJ`AJiDzd3H&8O=$ɖ-y{Wy9dc@%Je{V!"ARpSwY֨-ںͶ~#ovRzWzDRhXNe)iƊqB!6Bb*c3~2}ֈ.Mg ?USuLm{ҭ38< b40ZVT{n+0q\#_G>ÑT^GVd`ɃP5xy50^QǡnrsJ_QļB4LG 503$3e\^DDDDn aV`Ai(ɱjEDDDDD$RKVDDDDDDr,ZɱjEDDDDD$RKVDDDDDDr,ZɱjEDDDDD$RKVDn Lؑ!v&$qbhVp\R7x~ӆ.#|"""rsz\Nxx8 .dǎDGG{V^:۷H"rI/`wl8p$_ J׾"yMO`ҩL]wNc"2I\ձmG'?S|OC-`K4kz?M_zFx{(ׄ7pu3Bǁ-ó*ؑ;YCK\uf?-:S)Jꫯ2qDbcc0 MƐ!C߿?#G$wܞM&b+3 c[f_'*gXIr5 .I* "{?{~\ĶYkqψfe]mT0i=KbĜd72l{A2,W}=hZ`St]D(yJIGݏΜ9CӦMypeaYmߐw%,,ӧO{~,~a+u^|6e 'w5#SV>Æ O?6:0fW<=ЪL'ڸNo] ~n b7Q@?،`.֬ˀHKc0g`z`,7[Da^z4)[Otf Ӂ'ulO9t҅qcOK۳9?bY?&'*oDZCDZQ~CwȇO-~ >GвyK:hO}:4ahu[Uuqxt c{nH}7~ȣm`E ;/VGPB7$S&n9e;(պ=w?\P+Gغu+.WrǜIJ,vAvpgp֩lmv0 وZl=ݶEڽƢE@^E, e|pVVbj=wG:/W-Zw63ZDD\A5]uj!K׮cմ>_>as]XG0};Qtrw]+O~ʊUҭrjo3%6 Ch^Ɖ}fc}DV]Wb+,8iQFw*E|3&><ց?]+/ߛɞ ;Ӈ #vZNzǂ/}kJU_=Cry0 0kQl~&E,(el۶ ˲y4;~,ܞ'!ӛu:Ӭl;m?iW b!?(RґᜱutJGjħ` zvKq̠Rs"I`rɛfnݟ?')帋\,3q -^^^ԭ[|adH{O$$$ٶ͇~O?Mb斜$&2چBIќ=Cހ d9m@S&.ƒT7$LJ?ӛo-bbb Wrqy >F״9,"Ϝ.D3u9A:{ }fP5}yr^رUWReȗ;NsVCHn4X֣IB\,@^jY##קPej3W `s)bC,6zOm5_f@(#7"# ;S_~|?E:Heuq#^ut=<78&/aŜ'N0L˵b-x>>AJ1P5|Lؘx|2^ɄKvv,$$j}ըQze}&yLKswp\"3=ТP9noN;w2"8+z*dW4D;}ɜ<0n.?XpG>r(#7p~$9.b9̟ α(18p=;%g|?]DED,Q z4b8b=S4.3+l 2uvm:-x'"1!hV"f;ۓ[Rfϡ ,&111Z-[p /N͚5iڴ)yXe}& 44L]hˏBC'>n.r7^y( Wtw]OWT!~wQraQN/<+%ZѼ^?Z˯85:ͮex쿓 =ڞxc7LƼ{㟣ǗB2;)A 1|}_H?#/;?s;A:s-X捂)[#2itv[RrkFa`Oº*"""ْS˪,R? m62/ig}jpڄ{8qm<Ȣͥ[n̛7/J;vdΜ9浝n3~x`aSO=ŠAU/VlY5,s.B,²[H Ӹt(`[.,̔Al,pɏԘo 2qyOql{+#ͨؖ pxZ\VK)JݬaYl'y?vnw;x%30͔{rmvFJ]R 2pԥ}N>Xn3g2H<oagvcW}貺 ?׻Z$ .\سٶ6RZ5*8 O$\@Ǵzmڕ2n.i;,+g]얥ia׮]T^^z\.WZ"22cRZ5mۦre2qLhgqxzRj2,ɏO @6d\$ee #uWVRó4Uz<w#uϘv ϟh!mS=>'K"y ဘ_fzո͙|*+e;5LE:Rܕԉ\-G#feY=zƍ3sLڵkX/z߂,N4W#ejwgC LnMxcAbRΝ;*кgϞ\`[>3 ^2\? 򟊍{YSlY ȑ#8Hw.\[nڵ jóPDDD?Y"ϑ#GgԫWݻwg{ꩧHWv틸/e4O&3!_GԮהg^xVS bƌ=z4̶mKhh(*THȑ#8p˕!Ж,Yg"ɍ_pQI.[&ѯ}E,SM10-.^{{ EejlU_IȚn=n/,LSyaΜ9+mž}Xp! ,`޽$%%e~~~̙3'C+Dz[͇3cOTϏg~l~5M[?˜?Nr\?5%akzCZ>cp$w Ϛݳg7n̰}&73 c̼8+,G6Lcؘxqtx.)G٦c'O__94;@9,vTuܬ21&v>>ogV&4L"]hˏBC>ٺgYz5}-FU3(?5x* #I8FL7yR=o/WDDDD,DH"׏{˺4M||}7}-VDDDDP+WMaQDDDDDnJ'""""""c)ԊHP+""""""9BX """"""c)ԊHP+""""""9Bܚn漲9X7cs^ژIP""9ł3jC=#p{\,CDDDDơZlˠҀyl۶-˿`Tߟqo3qP,""""{ "ӉO`)<؞js ێfx}sPUo^_7Үͅҫe/& >ZZ>M׿\H["&>ۅښdoT?c=k$=Z7vxVab# IDATP+"7 G0};QCjxaBV^ɬ|YL$Xe_ k[w' Yfula2uEŲud$b+8?P^ w c?J4\W "%wBgkҾc!01pPZ E鐚 Lr*`bQ~CepH!>>>*H]k~wtt KUR,?g=ݥ@@@AéK uO))-$GVDnRQ8K8~Y]n>,\FBiHųu>fאָ)Y)gMsƎeDV4︴w""""_QcIyQS4~CtF^|TИæY/Ȏ3Liwm'Z?n3oF7 x ss[n݊ a""""_QGY붶E%.&q9 צ;Y8Jdn%:~ĶvTDDDDHP+""""""9BX """"""c)ԊHP+""""""9BX rh j@HSʬpSj=B¿yZ=>W""""""׏B\=ßZw׶Jv&%upEri ;6L{)p_P+ཱུ(sx;;"-llo}ww*a,3[Q88woGXmO7a jă#E7Ldo9+]P6lM[ ؜;aAmԆn#r41XDDDDDnf rMkQlmDz]ӄ6 qp&",ס-lONJIRutXÊ[p~;M<;>z EY?=ڜo^$!8JO>IKE>L,]0g-J8=vXDDDDDnJ rmwQ;؋][u Q/ArǾlJĶ휮T rG~|NʅPpf?ܝ|p~TN^,^r=L>8s}kn=Zy(Qʏk(\A^Fʲ"""""rSS{\#_SOsl]osp#'z-G}2%ȶLt e yEH 9u&Fo+DZ>Ngڈy'WMxuT驥VYuxr' WĬ]Y wl:X5 0 M`{P ̜93eagr5H!HrŬ^Wv.N_ӧcL~ЋC_өUKI{Х=c6%+~?G \߿x6mG[EDDVP+w/u8̲UԬWoBgS.0 ) rmyr@Ԏ:JWEbc+s5!%8+ѦUnLӉ;o=m߉H+/ʗ%E=B`G`@-*WFըZ!-~O7"RW:[ OG}N|zdrehYTν ?MfѠ"""r+PkgV4ǏXwR/@Bi;h,υ˵wONRo7e;b@̻dEu}1/1?8ҍp:[n LӁiFrWxÑ.Vhǐ1i=OwM3[ #1tk*oδ5L·HUJ%6ᥖ+89*mX9IU>al"71|$ ŨQ5>xB.{M.t8.ڔy_|<͹Cw,88hv~[ TZ1Gں L[pW˭bQ~6 .0PzGFL[kޝV~f$zwoB]d)?{J^]ػ0 d<+'o $C yc~Z3G|-\א65Ol/)D]b-hsoGiB6l\ > ؖ+qX`\glusT 23k:Lf u-"""P+7k׿PA'Fl*ŀWr%IЙZ3ts71pPj]uLiΤv-({Pz[ ?_Rܾ, T ԩsIgNsZ<[ơws/~z_}-l+rgqıez|[8pRz/%'!`qel/ݕ~&Ikc% Du(eU 5!}""""78u?AALl20-Iֳ^i|w⏱rTxhˁ#4%TiPL!WEK:~ɚI4"p1.Z ^;&X., Wv%IJ=*RcaZDD$P—z%> GHSeq 3vRk9m@S&KR2B jkzO#]6u! j4z/Q܏51:wA ~J]ϋg ͼQ~/6Vweh]x+?FҶVVe颬ց! *}z<,y?oՆҬNMjy_rw^xEjn@D DDDDnx;s|Yw|k3p6tN}$ :LyOw^о%:gyEn e^Ô,ܵҕٖ L/XPj`X6H#mnF;60|eɫ4RFqƲ kL#ym WںR\.,<ض)J\X=R}I>xzDn.\سٶ6RZ5*8 OR^. c}j6JNli۴R:,{;W*iϺT-KJ ""74t\KvE*43L̬V#+^ɏ,0af`f82|abdVAle_""""9Km""7"DDnd{%"GVDr 48g 3Y]DD+~,"9F…91ʔ.M| 8G$!!Zj\ r͛9pחŋSX1.ȗ/bJtt4+WĉS\9ʗ/O:u\b"Gp1UY-)2{pBB";NC$&$Rzut-ǹZj:j\ rN:ŀXheZ`RO\ ˋڴiCǎ)QD:_ł Xx16l !!!m{_z5֭[3qD+وsOU|||< ;ٹs'YوT^oo/*_WsEDPr);.5kְvZ F.]$ON_~ߒ ɶm/^̾}BIݏ%~ W^xyyaF4MLߟ=zvZϟQeeh˗/Ϸ~ٳ'iwߦW^ >CV-G*Tȳ(٦MnʤI(PluVڶm/'}lEDDDDP+oc>>>4i҄%K^1*U&M{ySe6߿gűc8vg"""Ϙ:e gΜBd[3ݻw0s.#,,{Ve)}lEr^WdMzJ3cGEfIؙYsX{jW0v+ԭS[,>Ր~F`csv0 ?MIVmvŀ O?Ѹqc?mĉ4jԈ 6dk;̰"9MRRgޡ4h~l +@ mangՋ3s,vKRR ,Ս_.\Y!CXp!}Æ 0z1 3gNۙ?>gϞMW_^=6ȭ( Wiz8’'po?uY}pᖸ[unPh+W7sܹTXm`6;t\$#t8pL3HYl2.-Өyz?] ٜ[2}O^w'~fʓiy(ߞu,MJH;c8gɟ>>]9$ӧO^~e/qx"{& VZmɓ'g߰M6jرcX.ݴukr޽LN#FPlٴ2cGodOgv*x ?WÌq;Ȭj[Wj7f???7ùگ|M\zǓ&Q`A&r[X`ڗ69-LhYOsԘK8o ǎc/e;p0jvmUspb\-I 0l.lTg_QvÔ |罂2F=2'fL88C'N0녗Pe,VIY3 ~-//|k1lY7}9FϬ'~YCDDn5D.sx{{+۴i˖-Kt7mD׮]3 N3fЯ_tA4M|IfΜxҥ 6mJe˖e(s:t1Ӗ_eY\mضVfYgqjwҎEVkCSVݮx,\GǿpRljw`etEc*rEn2ܯGXj+W&))#Gfhҥ %JHW&.]ɟNIأq\LlZڅ0Jccݜ= ~<Fs]B~] $Je$ү0=| ]Nw^:wHJ5tvϞ=|7TRs,yd[O-0LL Q\VRQB𳻁.])S?El}G6[8}&vYJvUbm@ M3L[a۸lpEF|/Y(BDq6IM ꦕl/ނ>;p ŝ ,g]U;$+mm""P+Wm̚5+]׳3fдiSڵkӧ32|7n|T0hժ}۷#""hӦ ֭cڵ߿?ݶ `݆ȍ* Z|f B+ޘыS[%;Ӑ&"R1`g/vn]8G,'r͛QX1|MZǷΧZꞋ\aӦ+M@J./p.aҏ u;7rҿR^p_mNaGn §J IDATYdwW /f?6M^ ?E8 oےc?8rwHIXy웱4ʕ#~D""#DB m6Imی1Ν;gٳhSAhh(g௿`Zi۶mKŊIH˶E0^ɢ-*^'0%.r.o7q>,]zvDY`sM2,m\\Æ!.XUZ qG]mqv,yNmÒ߲ꕗ@~Jŝ<.ۏ{[7w{ $N/\ Mf0ܽ/m!<,2[hYbXKZamMh]v'ȉX`{~?PDD]9]x0 #ӑ#""سgO@kӦMu> #gw̙37tЫڎȍ4[ 7iwqqt)Rn9͛Ӯ$"CRřUcRvh:58׸n FK~oAzi{-[6%Nj ZDmPƶac-h^X[Mgw >^BvO[gcpKvʏfp" bܓEq̃4mؐm{3f /W,c_%,#zq;ÛQ0)Ԩ%ȡ?;>j+.^l(D*{C{?,C6 CAeR et%?:hW(Zx\7I1rz(_DF5T&Mjm#K%WWuq!uk0$WM0n`}pM5 &Ο?z% ҽ{w9hիWe"5)3U"v~3d; !xI)ƾ}GWWW5kfMspԪU+\\\h޼yĚ1~x~wEaΝI3t9^jU`s͚5cܿ?~#,, wwwB!iE$"D2֫Wt%*3WvGYk׮d ~~~ԩS'@ 1'Qhd׮]+B!H$Ԋ|rXtMiP;v]דb۳c*Ud%؜ery !B!҆'!bݾ}ۼE& (G}?Ŋ3NH"x`yY,-B!"P+R֭[IZ=C䋘L&ˍ7^7ogϞ$ݝ_eB!BjEEDDb^lڴ%Kҽ{D7sJ΃ѣ%J/sq-yeB!Brcb `Νʖ,Y<{k2o<:i/ .\@ӦM)]4ݻwiӦO|2t]gIo^*,-q7O>1zoI!(O̙2ɣ2jE,XEQL_VZѩS'QUSNqQ }aussc̘1(СC NT:&Çs/JhѢO?v$S`DC+; 9Q#B7?~۷$ؾE$Ԋ+W\i]Yn6lHTԩG&C 4hЀCp$_HH/fɒ%%\l$,]wȕ3{hBqp'[֬}ڷ\S+Rp$ qqCr3N `ܹdʔ UUQU 20g@+BTz{{>}j^,CjE)¬Yȝ;yKYYYѶm[?ի)SpUUdɒZǏӡC'{\r1{=V!B#~Jdɂ?i UTҥK,\>*`p̟?/2eU[^=ɖ- ?G!Bkj+˒% +gΜȑ#? .`ggG֬Yɒ% yz긹(?j1UEQwՋ0vիWsn""" P`Aʖ-K"E, !B! 1 |)RxxѸ@ZB;-[B!BZW\!B! !BXAF&MnUnÏW5"w-HV!xm4/Jg셨Լ7‰0˷(;\t|Ҿ:J1J˸AIeϊ?궅]Wy=G!|wyטI-]lETl)Ը=rg͍ӸRnVػHv|ֳ.y-d{w-H$ !MlCCC2-VSljDqy;/.go`{)F4 嗊pWqyx9nLm|S(BI.e8 ܿCF]~]z+¤]k!;OBB(6В:VPU'kSxf0{ܻQ  Pk̟Q};;KUxf: wY<ez<cli_k;q) !<@>5€Kp6؊]&|71=,V,+0u%n<mޗJ<؟&Ky? w]&$ڞ<5z0|@=>3_K{g|. F_1{)\(F6bE?Mgyb ]M8*cqpHlm^(kϰ@=MW]Ȏ?oAa'\X;rtQ_lX SpW1gX.}WSӖQ9sO\ !D;^|^ ?> l5q?ڿ'y,suΞ' mC7<ʆ_puM/jdFNg@6IqS.fc F)yї5#<@Œ.0X8q+B*mZ‹{BDsB!x=./cӟY(qdVJQ '#ʼ:NJ+h-0]eԝd9mf9;BQs7gpތik׳N7kԂ9x6gΝl\ɪk ~Ų;s_rœ=aYSqQV~vf٬wMlGVmyQst66O92s?Tg6azC2=%&V &_CQdXړᅰerj ^̙zRcl[>E$۫co1[vmg^7ŭW4'NdA,ݺ5l85w .em c*dW38D"81g+s6 3bn0&m0SkK֮#`׶1ET_/ΝX17u󦷰%]Ofmnr?ϛc!wT!$*`˖\ 9#iak͑pmcHԨY5kR盭h2;x '5h쭱i␟rdmڭ (B| jނ+Dz4{줷2.s%צg6$.j eB&n v8!%([NS#X\%- `mƽDUJ:] ?P]ʴk/ ѯb9JWKP}9QyͻӅ6ؒdg:fæsL;<Ț^* #;TJm×M>"#ԳlJS FeF,[?rO(xʀݸVgsڙ"|wyxȊv6cő~ L9~[s^rNiE3nG~97?-=!B C6Gdtn9TşS6ZGe G'Gj+֪#ٳş6ݿy-ǖiёheaD#t"QUx|'ЙFPόx/}ƌ.;z`= MӒ_̥MX;7AyF`F畃{+ Fȝy쁻p/Ӷ yjijgoM ]f]>a"ƵQ#z~ ղ+tUW_̈TPh:b~4ҷy\reO-MU!_ K1,`)nx$X! B![FæPBXA#ST[Q%銔@JыebLB!᣾ Wca_XP/;vJ{0;~@ rO*@-.* '~ֳf265{v0WpuxH}䍉p£DSqw&8086tD7wT@u+L~ig!^ԁ,TAp(F ZA]Nlv O3Ư =[n:{!Fȗ%TuŎ'-tKGJR^\0%zFVLc[np@Ś~gw:b 4m?ē !?oB!ڳ\=}&r<'jw,VF6l>9zIPn_:߉*Ss7,[4@IE#t'O,)yǟǟ> r)Ą*Ul@:D`s[W<11'P1rlLT.{ٯ\~1?x|WaG51nYȚO0zb1ܨ] VQ9>g`I<6Fa$"~{[Ś+OЈ"p~ޙ-YƧ;Zʩ0h\Z-ƪԨ~4IyLj<^==QuWhtTDttӷc]s?=Wp(Q4[v`$/]4O( !)#g7t S,CW_ZqL{͒aDvxD e(\?詳^o*3D'X->r Zў+ѠVA{k&t:k2;k3,h֪gmɓ{Rw#tY)t,Zy&`B+tqj{{;2nB2 6ТlǎgݹQUc`>a (8>e#f7b#|OB6SF(g.IׯZ J՜)V17kOD9I >йݪ&A NI})o}b)AOU\taƍXT7AeP*$ !BGՐm ~͓dB!B!YjB!B$ !B!xgIB!BΒP+B!%VEto@OwtB!ߓP+Ro~lMGh ?@Q-Rp)њ~* _9H3P!B! "bpMC);EȓaZ !B!sVB>:6~NtǢ'w͞>gfCYs֝}Xj!0:V3f2 hpƫ'р\֊ !B!jśxm9 Ɉ.cS깂at)'zp#rXcPy,gK,Dp6dX!Bt?o&vYP#[7It嬢* dϑ;ײRz̛ kEZiB!x_Iկ:$[;(W>{v:ԤGVsl ,6.Gh+܏ڙ?M"2QB!BO;"(xά3>3?Ø.yK2j'KygS+1< 'ƑL'O 9zQ/Q}y !B! "|~l:yw>(8՟a!.Pe*bPէ@IBbW?Q˸),x넅qș۷W%B<^k&oWwZ!oܓ'O$ !{!EDGGcccm^Zؼ.͐P+B!%V!B!;KBB!BwZ!B!, B!B!YjB!P"8';oM*( Biӡ@>3ySto+vsi 3Q"3c2zSSoD'`jWj/K]YfoN~Tﺜu)&TcAyxуѻw~Z/Ϝ9 ~~1cz·4LB"͚ٴ4EH:ʠz0!J&^ג D4.%ZydxGrdtm|h^*tm@K[ﵬ &2uC\:dxҝNN!4i_6Y\d0i DZ=_~RLR>=zvT!ׯ_nz,U*Q;8ߎɨ#5kfiDde^ iEՇ}o}'4>/bNf]hG |3O+[(hZQPTbS?>o\]PgcQ 6okW+Κ+;\ (֑X1e5գc}ĵM\7}udC̺AN>ǧѶF;fxcmO4-;SE=TTt}:~7ZFڵi5}57_oavTnk1x ~TkQ }~ZPxizm l;*ySbڌX˕nh3%?}I(Y >_߅FЪe˖lSz>З*C7sxA_+% ^;`YM<:j]2rzwmHQGzR2htߖIkѷYMʖ)C45.KϿ u(Oǜe8TTTjܛ7k9hmjSxqWW{T| Xby㾣u^ϰDXDkoYK֨@2i1tgO)W4c٧f"Ļۻ&o`jIB8@ƞ-Uٳq*5dDJ}˚lc.N_+Ȑٻ{=Zƴ5j7/3bߖ/f$%M۱-hL~Yaxlڍi<L}Xݟm۠ԹVd򯙺!&]!{aJ˃ki*}-OPAm2*Mdm~{XusǾt㷑r& s*6Ộ6em2sc;+; Se`\:51l2Ramɡk2A& jZƯP8oW@f~o_d`YwA'(S+ɺ?3IQ3]n m=Р△"ǭ`ßou8ȂmXYszKttNeV}2w-?k-5 lncP_鴐=oYO\7}+<9w2ms;>/|Y3yprhb\lIy1?=,?vsp.~yȂ8g^9i{l0mlc=5fnȑ}M۟9gN<]ןDk6G TD5]cؑ?=%З|/?-J-QMyz~ jܭZ׏Fn%jMȡCۙ\OOĽT" 6Æjx顂B9slwv|b@EF ٷ-Ke"7%>-;TC9-,N\NX` VҨM)<:S*"{VTl %*%ݛ[Wl̖-I7jxÇ)B0p/`_AS4;Orؠ0qq2 ՠ:w`TTE,[O 34:Xo B"`r̈-Ӣ#=$19O Ĭh\ad_6f(*jzL\#b_*;%U242GeF|Ѻ(9szb`VeZc[!?Y[##ZLE+Ҍ>VNPqt:E#*Vƻi2/'ZQ®Đ\^ֱ߮FȽ`".Hc'1F~{.oH`ϩ༳-ӧG)Ѻ?{9~擘}]5R{Y? Ip12fܮE׏wa!# J#48<31>o8eD`k:5KNl 8T g&LHWk;lYw SrU{<=+kT̈́(i\n sEQlJ*㪇gϷbKLn<jvͺ΃! A?;FU[EGUxbꎇ[5VXY88%XG]g7-u1 ȑߚՊZ![ti P4Ktp \p1KQϦߴ[{u@5&xꁫ}e>Y?L,tx'lғ >7 6GPcDiJQTFჇ D:rT*;?cb֭S[ۍ &_VgҴm;oiv&1qE2AQ/DJ}L X7%:MUچ~H: @e<$%܇Nw7GwD5dπXB}i}, & +w<2t&Jrz%v{w sF%H*Nx` OJ90ɲ֙(ve[[<6ϦM*_17P԰ ll(GVcX9P{DohCqt7D 7ꁛC5zlD,7$>]'!Ҩ={2`|f}ܹK!^cǎ1`Znmq߿?FV!^GԵgM] lq/x7j|l8By☋P1q NN<2@u\5; 3 xxA)my15g{+AF@'|7gGֱö6?@͘,Q3t@ =Ě7b/WNWX4:s 3Cw4:[;3`y3`c \lͼ jB*UPϥLtG&@ޥ |:ե6O(xxxCg߸wb Bڸj{WneEׯ4t'dUl~G"1>+!Gs]@P4hX`jVp҈ wV3gMKaxY)O$ظpYp:sH T̍M~<֐r)K%4fn~Z!Trjc8_.?F?p>>Z T2VEѿV2s<~wa]y2on>ORa Y~&Rz[޵xo} v={A= -⍉dذaL:M{0c ѣIņ"'͏S֥.ÍX9tf>qʤ/C[pn[|g&BBgzVmpt#C+s`TBrk c?詳^o*3Dȗ1rZ''БFAr%&{#"%cxEc|3!]2撓+`30;Ϭs@ጨjK,Ґ d͎Yy) U+ 橇0y1V91|L 7)KQ!D`G1,[L 'ZDj m>ER7&MqrLG2-Y`S>o}(7Cz ]b|Ζ=g2bDƵ'/vԼ(S5&zVdЍi_UQ2cGЍj>DK2-&2MN=F[ؔ}Ϗ="a7O 9}@/ԙTtm1֎";z!6*@MƢ4f = `ޞfk=+U=$:} ϷY>DOF_`cN ϸ}E[l6/bag-xyy%iUJ[.qG `H`*xܠsYܸUu\`5hQ_萙j;m_#R[n,])3ҦM.\>SS/5Ul͋ߘ'NPTIvs)ڜ u}5%=FJ͋Eb6MO~T|w! Ҿ/|=Tg%^^^|?g{W%~Vb^,]9/V̼?1qΒ cm6u\}L7;`ܔ`\-;_oZOfpܼ.NJIBܪUXlY-i,_ڵkӪU+H']҅BQ7'O6/19u*ވ'R:&Mziwe!B!IZjq$lE%gΜZ`_Ή'M{ܹ$mfoϒB 9:yB$Ԋ7R+iڴiPn:Zn(ZzB!BZRU(Ԫ* !B!RLBH ~'Μ9󟴜ml0(T:u"sZ+!x?:H/qFzApppްh4Y,̋RDQfΜܹs?B%GG*!iTxc-=C<1kkk1JuQQX[[wZB7nEDGGWk/^DDA3̜u{ѬY3~4h V@֬Y|3'l" ׯ5kV$z*yΨ(^yxH Gɶ[`2O)Yd !^/gg.]ʓ'OjB%`oYd^D9}'N *2Ҽ:L,Y̫;FBHŋwk  0/XZBBBXx1_+_+H}.V!쌢(8;9{8 hZӧO鉷+w]vyG6Ѽ9`6lA%*NB!( 8ˉOBjE,ۛ+Vr"000QϜ9s麞fT3fdŊ D/Ӷm[֬Y#ϼB!" {d"{`0^yhݺu i&)`hZjUylP[B! 6l?^@ 6,I B!BP+GGGV\ɇ~h^ rJx_!B, )X dΜټ:^ƌ8p .B!Bdɍ( L8'W !B!+P+4WBttyB4O+JNBB7+DFFRxqlll̫B1QQ\zWP ~j!9M" !o|h=accMԬ^3iwFތ}Cۄ:O`HTZ-`46OG2/弻vGԦ׼ Lٔ+QI_~u:͂F9woL_wtSijP!(K*CDQ(.Dٮ ʼn e QDd PVҴr{IBS^sߟ&7{s,xyW_ށ֧gh}^?oʀhu+w/[X~9MKѦMr+~9;}ztr}WiW_eO.Xйlr?]%{SuSĠ{5kܭtYà{uDBXf&4.+e⟨Ԭ=dݢ$XشU) h~(*4ΣoMe|pSQ|C~ '4{3sF"wf/cccOZh lds(w|xzU0?>[Dg7x!4Oc⽙ Y0EzV'24Wd_i/LX S;٠+_;8J\̈́`]<ӫ*<%ޠ!uΉ"_ϧOzx! @` ?6%̟W?';|* QnJ~=fue*GXt;A e ~hHոgx|$ay;i\n} fL=+Gxzm}d_O}Kvgۿ;g׿4FMk~Og3!wNp:w[_|%GSxs>RŁoߗeڃ)lj ;f>{t = ⮻bܸq!/k0n8.)n Z3{H".\҂ W 9ծ]yԅ,A^;~ەeiղ[S}" c*nEEL*oAxج1q o|n J4JdéG-?Uzލ*PHaAWܢF1jt&Ԓ`in%y6Sko&SJ;Cԍ||`M1TOpg;aiP2b߶9Ύ.dֺ\߯ #(R,ٟTmB¿r} V,z7O0U9\)`DUIs(jG ПN31 Kn ٷd1ӎ[R\~x^4~DP2VS#4(Aiђɻؕ8jS eOFxnbP؛n ߍ德ܣ\Rϵupl@{SN-D޾<΃́ݻwӫW/xcY$xOZ\oDEq_-)/NUP8.fD"Ø @>-EY,9@ J!?o#1a1kk΃|e*K]b;vOy o5kv'az <#'cC,э]L&hGڹS]ϋYŏgFh4$iQ='\e*)yyHWLE$8@+gI?i,D~Gu릫K^Ԕ h5<hժW=e0 Xښ/~I{mRҏ[8.ɯ^E)a ԯgZH]L0}&"a v2Cl Ǚtz8~{EDi]RGwnJТVߴ6f/g?sn)UVenFG}gzWxJ6,ٕ͹7)N2xAIMvQ J\Gއ_NO  [YFu6roSO̠]$"K`;rH@+gIVUKŹK:r27y0w!NI\fD7]D8r *դjX;w[k ܰXI+h' <ƞM؞vSf!E5)̞(ʔITRe3f όb] 7fo|ޏN?;q*^NX4SuW|[4iҲ>ڲhT:vI%Z \ȼ?#.6nN\HKp"%/mٗkಎ`R iOfm#ҥUF|cFDԩ]aÆ1l0ԮnW"?OTTR^֩SPw8p uvf4.!J/{ET"MIΗWoz2/m&ht}0d~r5[xZmfkn}C6P9"FqW=jۓwX51lC-fF_o\n>cYɶx˙Af-}+fæę`m7bރ F"ޜ!Vߟ]Vuo#[.MۋxgesY=n*>5)fLcEy}U?"Auer7/Ըjvݹ\wO& ltG8"isGCzy'z,<Ɯ% ک2e xУG&Oif|?IJ,v?@rrr[jըWfi ?36m yrթ[ni?cS۝܅rUhڤ,ahowED[x1ڵuÊeY,_]n0iSC~HI@kݹl@z u+fv/[L6纻gi-}VraTPݻ[!eNiԯ_[鲺=j%WV̭툈Hs0EDDDDD$l)ԊHrRnZںuk MHP+*_ċB^n]Η 6cP+kxW2,"dkF"##x^wKDD (?HwYsHiҤ  SsbРA4kLV$fӦMY ~M6n2LQسg~ nѣGx-9*W̎;iOm)` b )S,)R're믿 %4 xkЯH~0 _L 0HMLL%r*_e&^{-z a`N9g -P+9bN|`\HDDDDDDJ """"""jEDDDDD$l)ԊHRqQOvDD10FR"GEA6l={INλ*]իc:jED;z(S"67sP"@vƍ$%%ѠA^kd6ny%!""]hED^_L ['ػg/ի@ FRZunIQOV9x# Oכ8P+""""""aKVDDDDDD–B-Z [ """"""jEDDDD$l|wԯWⱾL{& o*BHg\FV'{584^Z 뵁Y x77wߛ^|r/fR)ԊH5\:Bp7ٜ}?d{z@ ۲ mGf&?]ӽic7h>]z w8W$DD$ٶm_~7P߹s[Q=jǿaLHAѰEXdC1b쾎k˙Q~Z;9Y&D3[ӾpÔ/Miqoi`\І&‹HASTInïkСGp%H8+ݸ)U6Ȫ `~y7Ģ5Z~(VcbNthߖ6]nمd@^]MW2|a/3Oڵˮyח%篺w:Ӽ|G\]oLg܀\Ҧ5ě?revlәcagJZLZ䡷ѳSGڵmG>k^fѷ㹣Kk]2k][ xwwNLRV6%.׫8ɡu^Aǡد,,""yeV$8xdܥcd z˯xyp|KtW?U 4rkbOTj֞knR,lZ4 Fvѷ2w\>(_>!biutAa=_}9#G;~{11'Z`%f}OhUB[Ypx--K hT ʑl>lÇ #!!ݖBY']K⑛:ӢQ}.ߌ=k9 O&.iVͮ7V, @..{kǽuYB[5{/8cq{Vdžc\]9(ԞM+s)~$N!A45\9Mxk̕LV%8¡L6fELk^}uZio#M녱a`x0濛g0vfm8L2zY~e |bhv#<ֻ>š}I坯׳7U; `.mx_iEsaߘ+xԋ|q-NXmm!^-QBW#e`TZ. >ko"a v2Cl cLz= xkɽCad"LʦT~犃{+WEDD΀;]]9HU,2mUk?"j&1M4b5?+BUٲ'-8+WhE+vc1 /}4o0sBz^d qo=~S/`۷RtOl!2T&ܷ͞{G  $k]O.(ވ&U`ׇhҪV;y&q+~(րq&@A UEXv"6&gMLJD-Ҭ$1l\uϯEi/XG09LITRĞ#*ϱh_7ʁx맙#hہ9P0cFMs|7ggC?f:_;7"""U\\fdڴiӶmضm[ڬY3s\ ~|1b3pЂҮfA'%f4Ə`)}6n [TeoRxL 0)^L#3ȱ`h8X<Ae5S{aϱż`&9`#̒e(XM"#L9!г/x_$M|LpwBu".;*@w{ ~?% {jegj^G|Mp _qr\bO[-^^opUi nd -RƼ?,%qsHz1u հ9J[u{1d؛=C_.=;omR=Bc gҗ睧.?c8׶oJ]TU&Vbi4jN[lhԦ.8HR褓S>uwMDmn.J֭iKm׍#gck4kM^bvxn IDATZ"?cEc""##xǿ;XDD $?B N?o "iN8YDLX%⋉/ZDD1@{P">w11lڴjժ]lڴhwKŒBvE A~WWDD 7XEʕ+cN~Z$w;x "6G paS3H"VDD0 _L @5Ctt4111Z7 e^XP+""""""aKVDDDDDD–B-Z [ """""">""rF8p;vrwKDD 0(V(+V$6_ ٰq#{%995*]իc:jED;pKknHx-[6nظ$4husߟMذq#5?ݖ0$DD۾c'έ@+"r*Uرcu{RZ< ^o$իUgZ99@+"rGNz#0|H^}LoK/2rLdo+B|G~䋅}ԥhئ{DeTϻqOm|917Rz26I99<wlۃR,m|= 6k&f?XDD$)U$7ՁA5kx|PڳN?"i,='{VeԅK?gɨ+4KڶM;߼HRG\vBob;_8.mnt6s͸K|ԧ[vlۙ|VC\ա rlsB͔eңG3?ADT9j_:Ip+ߟ'}2M?L_H""ZlE'L]:FKAP+"[p'gNîyIW)R|>}(M)f˟o>ēg}/a8|HzM^,:t}pwMNS+?͋+ԊHXf3~}m9 dHzWl};I-%pk_0 &6(iL)bQ.dtIس wdŮh`x)J8Rc I8tCQnJgSۓǞ}KĤٰ?@' "N [+Wdذz)9(ԊHu{>Cq9i4IGi IسH ;Hi?{jbxQDGFn?!@(|>O πHbba|]uE%/%"">#r6Л"R`]WDz)[lT)=(/8dlm͘㼭FTy߻&<7nȑ#$aPXQ*V/&>Aʕٱs'? Rk bs- 3 ""rF|VDD0 _L @5Ctt419ڒ)ԊHa>҅DDDDDD$l)ԊHRP+""""""aKVDDDDDD–B-Z [ "6 pDDDDN;&_jE$l-ZÇ""""͑G(Z,gP "_/W;sNŊ-VSGa/Wݒ3HVD†`q䈎؊cE|ĸr)ԊHX|VDDDDDP+""""""aKVDDDDDD–B-Z [ """"""jEDDDDD$l)ԊHRP+""""""aKVDDDDDD–B-Z [ """"""j-HDFFչ~""""""jEDDDDD$l)ԊHRP+""""""aKVDDDDDD–B-Z [ """"""jEDDDDD$l)ԊHRu6Z5:P|2'WDDDDDZT`3QA ./E a """". 2߬/Gdh KY lڼnK"##)QժVf?5Ժdju4H:(/όcVmsi v6o"ٟL zdOfӦlڼky-iy 3gixnYpfݭ߷k(^o$ժU#auF#Oep cISs49@H,9T8""Gm'''F˒C^TOͬ[s|R w%"""""VXnm/O#Irk;.Sq2;;DDDDDD暓Ja#?S9}Nljf̩>WP_ttH8i|-?sd7&H8*d gc2_okՏodf"gl"""""rYiӘ6c:7mjtҕݺa9y.dVw8S ŧ,?MY̬z"""""y*%% k׸g{Mέe_Ŕ)/3gͦfa!乬OVN6Y/w+']u~ )[' ϟ~岖҉~ٿ'hpH;} xntI|β,8? UV,YRJߊ'J:>b$Q6y}6-i֪=W\7,M(/37![fuȺP{;'P]3~1' w3{;-zĸ)xW ՇCGsUu SӦO')1YreiyXic~|QL1E?zѪ/G_,@BMnjNNv);ݡ67`fr'/HH'1vDDFr'd`ͧ3}x8G)Y:e@'ߙn+X˿gy-C-+ƿm>ˠSBQe8zeLՕ}[Oo?KF]g2븢C;^q#~;G/5WEtmi2_zW v$*dBɬ_液u:Cp+$%2&5x9i#v7јoC#.Jy Ӧo_+P,T.M!x.ՊbQ\أo^;~:3;Yj\V3"N/9y'&1e[4c_b8%Wa0)y0 '~ JCT1AT}we´ GNZ~PZU֭V5g}'iܨ縥I/ ~pn |l &Lǖ@QT&%K8"ٲ CT-OD]K%,O0:/3{n[V.ӝ2Ad6.mk'sEDDDDqM2l^O?z/KGDMU{p)+ֻ_P!Gs*]=H»#1[LGk!cqr&3n]fVv?y?`2jY9n7ILd+JC~xvM?W9E9̞=g3w\Y׌8pgwiޞSfu+:2? ݻucڄ'{ҽ[ }7Bgnɗ#'1# + p0J`"k.bKNmͻX/I' "4Ԏ_~K  nipgrPfcs2cL^~lNwjdg䊈g.JQQ\xx*:Sɧ;H,N lx:.3x5c(z`bcFbøZjb&'Mu5rFQ4U/oMQRU㩑t.ڎO&p jw@⿺4 ǘ?䟣&%jHx~ L(B%F>\(fNVȽn*Zwlr:e.Ըjs# !םuzf1w/{HG^pM'_T$z,<Ɯ%z"\ڮ,""=14.I&k_]`ǻٲ,Ӧ1mWADd$~]ts6Yb;9ǹ+y=9eh]k9}H} R|0m~RUGfQj9}HG2N""<ںqe(p&KIm{~DGyfVYyf[9aqcٙYɝ2;^?mN+T{ݽd;=Vrm!N"aǠ{zUH~".'`_NҵBOFT!|4;':AŊ]^؞$KtL4*T8|3NV3ej{9'ytڬXxTםsg9ƞ={^>lpMWŽeLx"""ᢸGsàNaړxnaO!**ƽl 5s26yjx-Buz']uڱR iEDDD‡a||"0|O7g?7ke29_nsRN32[vl?|B\r+fsNNr;Kc5}P˧ř9jg8w{ٽC=;3gqg=纽/eA;ܽlbFVa6,ۜd5w/]?Pc\w!X{n'mDDDDDD‘my39깳s{):d牼Pԩ8~(粽I4"Q^JDDDDD$qsfznuw/ȋ#vFfZ#艈3g }gWzf-לJuﰬ'Os sl3Pб]>rH[vr1PP57ONF"IDAT%斬v;pIDDDDD$ܦn\6wwm+KFK\9L% HVU E }彻 w䵮EA! {ϸ4+}.͉~{gڥU}?"8|泾:{gk}}PUXkO{5h?E.Pz~Uy-l5^_Ije}A*U=׺/g]̿_}cȟ^=cǺ~Zfky{P{×~XCXZk Ux߰spkTzSI] ͺ剤kw3YhSkFX3 V~WRW{Wڥ.AKG0w\ֿ[k_kz-vlzpsZyN.;:ܡy!Z/5v74מ]9粟k_١v??BkM<7 _֚wktDk5:sL5]_P\dػV^W_ =]QC)ֺ|.gMF=n9sgڥ;H?.峮êä貮?[Y־KZ}-wO[}鲃˾=Z]TV}ݥHr/jR!K5}ujY߿5XU߃<ߺ׷z#QqQgkgNjoIk\l~cĦh5>kUon}/s3=+BRfW(/QZz)tܲ2Wֳuuz޽f[[fg/.h}N) g]03[zg̞♡v!J{{rֽO5ՃF7 L\l޽/ݙ~d}犼kר2bs6~޽^Z]3jaK J|WP>3+t~ue=Q.TԹS_z6]mG{_2W[eP˻_]TuxPͺ|.|^ջC향>ֵ.=Pf_z o`54Y#߫-;fr߻u:2 GSfΙQߕ]llڝ-[9~9ժxv!+ɳ}%P^b5zC_?'G gQT~QE]aWYBku5/y=O[8+s=kW-{y g%g~nMg.O[} YϽx_sT(.%f=:ojF!jV-4_8>VQ_[*[TeT Բkמ? U]aT{Ț>{Uk2n_kϸ5QPQ_auރez 3yϑ=}TlfˑY7Hjnr/պ^7Աp꽲<{f^jRׁ0{[.TT3Mojz?U3~j]ow5/ʜPל{W[&nYx >^UvKuG} QZjF{_eu~ո92 3Yw3]|&)x 7^[~&>YfQ]wgճ]ܑV=ޗٙ4.u]3G[kV==3껽ڙB^/i=skSs5?romh_s&{~k\Wog{eOr{m:.=fayQ粧H٬USϚz.όz,3Yr&־~GQ]zwF9UOsVzά? k] ڞl6]mvw}2Y]jaGͪkrKG9;̞7U]|ѹk=z{%k[}uPYV[>ysݺ3z~fϛ {]-~潞n&Gz޽t_s4P|r{o4|g?}7̬whyGGBuge=Ykջz#-!ivu>]zT~7}޷~}١ft|F>l-^랝ng|Nr- .o9?KWGΚ[,=i?k&?UׯTU^kȣި^uLWuoyn#l[y-3{b]~֌s-~{=-f.^?kwΚg3T]u!0g{9g]Y#xJgSݹ]^\uȞ=3="}s]@̙\2;;㺹\w=n9-A+όBaU̓dg;Z~]<{L(\U8d/nݙժy~5uVՇƮr.u5rG9쑡hoǜYl=n9k=떙Q`̹lgsGΞ;䑡hU]jww^k̲.Tv57w]ֻٽs<:<ynn0٪hF3uge?sY''DmGuڍfFk7Zg\ձCtk\ձ{^<΁v=y{x?{uk{!~B:=z[n!;9YmzOg=~Zz}s<0-6YU zmAU?ϫ^@=oc{pw B_yM2vy|~?`;m|F^O-*fQsq] IENDB`kraft-1.2.2/manual/images/en/documentype.png000066400000000000000000003206771467704360200210410ustar00rootroot00000000000000PNG  IHDR& pHYs+ IDATxwxUnzO$@WD@@PDDDTEPP+XP "]: J{MOH;BB>ffgds(KֽǬ+,:#B!B<)L&1ݼ)%qzZ ƔY ;F!B!QUVXذaVر !B!YHNJ$%%>Q$IB!B5 [[KQ1ؙPm(l$9CB llRB!B!D5ޛlJIHn1X;(j(BM3bAe!B!>]Qs[iNIdwRObɱ[,+bAuAGB!B0bHaaJPK2]q`JPb5b^B!BGO.rΕ#/Zj@l#诛8I"=h( 1B!Bteb!I çVjak%1CqZmJIdJAg6=ppd@^?K,瞥KG_L|^~mfsaV WU;I!ȢBX[YqW\s_唔D\cSObcѓ &DbPXPU/{y[sF;dY!D^8;3OO֯+qq9vsw o/<۝nEb4nL<9z$nɉ?bn}/Ēb2ѼS>v_!v;q*_gmeGcF1el]:cF)l{L[bkJ89#tboqw]!N$Y!NN̜:o锯 u P7!aDDd2~ {x$ x,c?,_3eƌz3K$O>^"2X(Rۄiرn%Z$TڂV:F[[wp)zb{)|k"$yيUқ,"O^|94=0n2yynx{yr),9Vzɔر{cFyޏ0.^O/b{ ޣZQ=߈;7%}ihw?oco̒$ !bN?4Mq}2E>4KWRF5>z+׮.|4q*.\N|:=<Ğa6|^=|Jϲ}zSCMrr2C^H)u/Џ~l|TR#l6wЧ'?-%UUsV$$wG~$%'cgk~&ʔfԉ;󵶲b ygDŽ2 !xAzesy?Ǹqı2}¤/g~=Gk$9N!*˱ L&S$ !_..΄ݮU st]؉S0m[5x9w"G$.>oO<eƬ}-qqL,u}X1ʹoݒORR2inߣkgWu7m$&%:opM._ƭ(-rq !xt'cF1~rNnDn΃%z 1FI1QGUtPu V vy력&Պβc2s$Y!=Exp,B)q{;J&3<>͕˿sy3 (n6%ܠ3K~9&ߴfe&tl{{;t\].ђ9i2}@$*W~2wk=DRmh`XYPrNF5cְ@r-Lf)m\̇ͩ3|B!X'NMcK(Z#2bE YUQQxq 0n'fU]mwߊ9| "2*)w9{.ݞx%ޫT[>4a_\t&!KOZs 8e:)wi*Vz 읜ptκ7V)%!,KH>SI>S=Kq}qA*zd˰yw&≷r:&(S[[<<)_ v]T(WEQ] ar?wn svϲ> 05k`4ܾ˟?g@ޥKso3-r|  5{d2q=Y!?Nb'ی/_S/sxFz3VW\)O֣EQZ3.l*za׽>O7߹ !@Xx>}8:8mt*NEKyogfqr }e?̝df[HIIX?" [4%11=QrŻsq_N1f=׮߸g<@J9lHFVfe "ns]pٯ  }4{!ђ_7~Xk}J* UjK`q)},]zo!Qeccê 0cb ;!Bťr.~Pɑ@ǃ !OreJS7`4Ч'7nH,B<"\z6Du kgIB<G ; !B<|Ml ?fGRJzB!B|qFTU5?ZrhѾ+][U]B( 2d97ښVnNB!G<w)0ضmK,)0DA-$_Ȏ`}a)9t2| CLNeB!?K`޼y9߿?lܹs̚5,KHK'FٲXvH"vz6FiX5k,B! I`ڵٖߟŋԩCϞ=,;{,ϟr~|Q@ >j.*Krݱ탆,B!2D9Ο?mC9vn9w$ʏ4#(V̐ۧ狃:c \$At~QԻ37BBt$q)]\p)DwŴ"BINweB*wO\l֙b (p hEl\Bגbװsv~BRL1)*.[䠓LdRfHTqr'˫rd>B0RQtɹBƃRܝ wپ4! : /4K\)wK v\"=O6K=gAucilu7\Z.`lHE 9V ^{O8̚ 4շ4n|Hm/8|=(6Wl@/rxvb8u Wn3AęSOiخ'=C"72~ۼcWS߇((F{N&-iu5BQ$QH-F}eJH \9KUz -g>ι] s<ŏG|ts,G71>53pGw6ج%к9G7]l>x~1xVBX8s1qy|ض(ߢzAପuSpeξ\K#'Guy&8+'2&s_g$g:m]O&^~7dpGOoVL R\2 niS\) oMb; x?.`Ӫht{HB! $ARR&(((7TXU_TVӧ̀N򩣜1w?PXsp5sA}=j/ޙ̦JzO'|~r]հ#E%Erm=o3]q?s:!Ӗ蚞?=+&2ۇW%{5[zzu6|1 >GoI#:-ST](aѻ`rt\sNB:wcUtjtGuh_t"a/|ڎU g磘i[UU@Җh0T|OC-u_L͚$+iiZ}|6'B'r g,\|ӳ-PGf 9]GZJPOGZMnDhॢg3dձ]xۛ|a0,NL]ԞoHK9tLOU*wWI$sQ!Y; Ux!~#uJ8to}+$ 8Ѭb1γe|&fģlW_Ԓ\&\̩DՇ2[]J%|l=&bMęe߲t9SlJ jWRnFSYz4Z珿hө8=\EO-{0ZpnohJ]I'cQި*k!yҔ;/֦# l#9t MW.ՎDZ>ɥ2cJNhFy,ӂ5SQ `$YťN"+\aϘ81ha;/ުU!NHI1P}>щE1DŽxu9*nB!xdWVZ̙3'ߓ\xCҡC"""1EAR(v{LKt?VO|F >G}SՉ7J֩f} i`ɔo>ֵ)_8%+Ԣy=g_ >A䅳*w`d:Ғ_{2x8]Uzn+ϛ_Ϫc鉗~~)᠂jW>,%Ҏ'dxν֊ 5LcT+ᆣŪc'P'}v-=բm!{+$f~FNNft'm9Vye:ZZ]Fxn,7ٶDjG7xwe—oҡ֊K9ھ1a psN@O'>؊R S-**Ξޔ/eEUK&BCO?Mhhhݴk׎B9/ F3O0teGª^=l\eZA:uh:sъHÇURe{j1;U*TȘZAZ1&UqDU 1i7FZ֪XUUCkB/XujgfΟ@N)Vtl7jf׉7ZumkZXZ?ezĮ3ʮ ѩz3*};ZU/:fF%# =՞Q&!85 ѨT\F q!kiJ'ok3NeDQ!a|N~HNN ɓ':t(˗//8Ŀx;SlUr+/l*WRkshQ\֠(ׯc8j\q>3*>%>֙ii=&^ѻb֋=u84"nLJ s͡A6@cVi2жVjEw^bZwY-Џˮ @ XlPRǍk7 @\IHAk5ID%ѯ->Jz Ԭ3Aƥqf]!B%mҥCv}[~;9cNmD9>> s9XfI@" ̤>H_0fxgjM[o `X#!B(}KJJb…ٖjՊ'Olqqqlذ77lǞ?~er'n'ʞ(*jhZ֒gE?% OO-N..㟳c.ɸ>bVT܉i=6 Gص,1V:оTgfXr}OhVlN mŕ/`寳ݻ>߇sq sF؍7 },B! Rz>]_5UT)ҩS'F +㊂g;3q[F솻q:F.9dzzD᷻qusAAvEwDn"._3bBjR;VIg(׉1D n߹+jvh1Yv:qјlzaaqo\pT@uqY@ :o-EﻉöD#׈>orhZVD%f IDATK1h:fkө<]B!x|c:i餜o8^vm[Nmᯓ|,WrM<3m(Q^(g~&?LԿx%i Xo_ceqw*iׄB!$M8Ј9 >bC@zCy^ЊO]l֑;XjY},Zyy4YԮUOQ/}n+2F#. H 'w\ɐ+dNUAVmR*>MP:Or~|bnO!q&gfu1=&t*EtCZSJ!/;>PkБV<3:6ؙzc^C֡Ynjƛ=2?<-GΆzy*q9XuvThK!)1qB!oOPA!z!q4I,$E|,G 2Uݚ2b̳Je@ׅXyӂ'p{jR̭KXB6?ʚJ={ }h&\mX1vHwAYW)\=A8W&Һ5*v̄N9C:c"6n"c؃~V_hh^9G~hP${++gw.ܬU_S>]PIM-2ך kQbp"}*|k W7E1Fݑ&[pe-5GT4.9?&݊Mu=]1^qUn|ymQ.V qvcI̝g~LQ'YlhV:{he"6,;Ɍgtɜi%B$Q0hAl4w}SDZ>CwVr%EG7r`X~f쀊m;xo%vέkMgÉ=h U U/g?g- Ј'm^y[4ujkߌSdȖ ͔).9:ZI~Zb]vmWo-HzJWH(gXr}g\I*gBQZ EuR7zLVw!Qpn6s?Gug5G1Rl=k3FO w عJ2s)lr=siP~glt.cnSX7io<}1`eۺ]e.ixmU{{sp={NbZeYD7gK)zWmSZF#V٧ξ*Ne'})#w-!B<ң,D!S-N,SƷ5Jߣπg˷Y—-Φ=8s=d;woWo@{l 8\Xtdztݺr5Bmq,K-ԣMԬzkwq5BMX9y]un8:.Ǯʮ3|)a9r Q+\Q\56iM-~1M-𨹄7b5\ZN(4Vо:f\-B *%zNcF3,u+O_%,Aœ5Сz5j5+5;p&[0:UJ5Ң}G|Nug%غa+~rZblqtL:4mםg;CXB!xHnjnj O/>t0[({~Wze٪U۷oךg>n?Wna!DQ^O>ޝ8'x_xz9eL6շ4@:Ғ*B')SZ!GZ6O@vc7B!$BI/r(9c}qV}-^~#E%OB!3}Z K_XO_VDB!|{ʃŋeٹs )!Jj:~8 Ξ݊g G 7iB!O(A۶mYdIef͢N:bggWH !`L[5b}ϘB!a(СC%ٳ"B!BQP"/5jċ/Xa!B!x$QΣ9sP^C!B!DD9ٲe B!B$}psscƍ,X*Uv8B!B! LuTUeРA 8s9L&gB!BC( +WrʅB!B|$B!B!D&(#1rlˬʱB!q!r>XbwڕmYn1 !B!șQGUVB \x1_|#FPR% C711]vhѢlwB!BǙ$HQFСC,d„ =;;;^~\!B!xIu>3 X5jj#Fd!B!x(ӧC?gfڴi(Џ/B!:I 3˗/g:: 82!x)=^^v8$QHPt"Fm ;!(T)VX+88KW.3Y",,reK B  IZGDph(F($ !D*Fe kB)!IB#GGJ(APppaAe!I,=Z%IB`@BBBaAe!B!"IB!BL$QB!B!2YB1?yׯPT)jը(_}Bܛ( Jشv|,em#xs~IόfRBWX4;v7^^}N,Ka' .Ϋ\Ja" $PdIlldɒ$pO<4I9BG4:1G,I,ģ.q?{(㸋=ⳭVBI! W(R#"EYǯE[u {nZe>6n [˘30c߁xU2Y$ux{16$q73c^~3.E`rLҧFK~# T1zVŨsm,~]ˡIXiH_`®/lw<;ŭM#9,Z$k6W_hzvΙ709Fgq[㻋V&%تmƟxW}䗿o1i#ke&KI@S R# 2q8c m(mx_%M>R))֕oQb:D$5eKdAYN^-^@1xPQQxzzf[nkk˵k !"Q8ܪy!ݺl'-kGٲh&cQqݹg^c6H(ζ\q ǀ2tq+ɤ*wlOݨ|a-Yo,嫕;Veǖk:fɌ?fe0 , ]Iߡaԏ \>O`w}t:M}'fw_iu$쾩I[>ko]+Fߕ\cЉ;!yǝ|1!f0{QO}+~Վhr5r͓>+O^{6=+?1mN}33$8f3N~`obL}м~m{\!4 UGUU4Mz)Б7бMKw{OoOoΦ^k]E ;L"Ѹd0Fn 6cق&pa/va3`w neo,ޭz?%K#RFmhE oQ=?՞iҸ9ͯW5,'gӣ'qLXK=?eߥ[uʼn8}|NV-ihLȸwkant:mK.10ki"o~}-ޥ}fCNWD- ot)+m.Z\gڴa8[ahߪ%mz&:Y Z'Bhۛ7[xOoڽ%zܞ8(?I[?7mS^aѿB߸t}Z" kE˧Q`v!KS4Csi]2Gۖ#p1,k9|?%Qw?8`U}zQ!%صt1yVePGvJ+~ЮdtO;FGo9d42;6Kr(8TmE`B3%ŽmEgTTks0!yB! }lشˏ s sZ)Jm`ayQ'=/_eU|Z(-J^o j1Z!AΛA wl޵?mX>Xq (/9/Vm= _}uֳ:_g2/Ok|{ew¾)mbv[|pV cعx go=\m6߶`⡸mOׅi \× C;8Qp~T^j5kQf]'߁Ȟuɭ| |kHؗOb١<'?/*m_6()\ؼaf@ݙؾ "*.]Ucэ5LZͮ|4kKtbrXR\T5}p hWlu1E`ݎ-t<68.,4zAgB¨ֲ7ڣ(TmQOz<ӻ*N*4I(n?zPڗ>b/Cߧ(]F E)glI( 38[u0,ƨGd|˥u1 ]Q,(.=k,$^dyLyN}s%^e@1rl+E>=t{x-4cFրF\d$ZHni8TrExu:-r|7Ց3zNrg3˜na7 -b>zU]qr&:idrfPsm Ni1턋%*dipL8OT9XIEUA5t҆A%E㚧} ≥~,d{Z#Z#U#\-( Et= 1'67o^|^Ou#Ivq+l<=q9[Q%ti;VTTU)eSQѰ`%"=ׁYgfJFk(}աPu_Pxӂ-YQ pΘ#ŀhvv5Ӽ-nE\c"iKPk4lq/ה&G1ό24i܄w fոuxSQE7fgl|yvtnq16/WcسmyQSڿ;g^iֈH粄7#zѲY3wĬyj`:lB.%ϼ5b!Ў{Nߵ؀}ʴ}uaW8f[ 'ʔ]\^ʐ7f=ߍ_4o֘F_=>V‹OQ4nۓaO?pxZT­g?Fn[cvvۿ+蘉:ݗS7JJWχ6E)Yل{jFy1 K@*Kt$e)[ 1Ƕp2,Xz^;7uТn [Ɩ;%aC 2cBolS'<D9Iu?fЂX]7p4Q\hAk{fہY97ۉOohf;1e?m>U>ۼG^<};Lٝ>C'fRVjٷ]ŒmѨgX_Jcml_*k/U.1SӇ,x`~^Hx{fKvҝWO)gh؃a]r6eӳ }OzEǪӸ]Z۳=^.j@[F zMԡCƹƖӑ͈9:/o=Ӝ7 ?ΐ`B>z&mk֫[#{I L~-~ՈJ@!d6 g}îQ$k&bYkIjݙlwvoU[$tR ϧ'*n%J`}0Gct@'Z61glߨk[|SImr=x`AEwoCJ^]v*OjGCfmgc|:Sr\"Z~|qKq?75@#> CrTpvs&ynP;9g\=g$6/ƍc&3K =,[Y-&lgPnOϗ^ ۴9P/:VZ2|`M/~{#J?qQ89Nɗ gk:"ȶ!M[Q"JWIZH1cgFQ+D$V=GFHBEz9{s9qh̴@a\je 't?L_?i^m | h:gwMx1ݚ%Jw+7 mnKrkKk3 IDAT7Ҋ)uHO8Pty(sQ%OqJU4Ԋ?co%|r3Z6g4Nٛi-(|#0=|꧜`De}TN3_oJ)ZIVM*Oi4Yw#c3b &7/ Mmo0[I+O3\v4۳[t/V!G͔<6axX,FE1E}S14x}[ѭ34siM8G:~d3{5fypuxC1ǵ{OP(Q/G"xbRm<XShAE넻Z[Fϊb~xMB1O )LoW-`>as3 `ljA Rb6mEa\"7jm:LLEi5[#g}zMKZ{uՁtXinÈi8&M1b43.-~5iP|Tbl-QZͺCrء4تpdDYQh(r|ǃ06cJ./V|)VI,5hZf 7NEUQBC}vM]XŠ8>InZb9 +Az K ʝcxuv._CE.._'-"6.mTh>/$Pyr,9JR4O.a\Z*6uty3RBE<q<`P%|\kC牟p6|]ra!F.mwM(K72麜S]ә 0~YWS8~jb ZOb w;'`',1ɼ@bXsSDl]n/K֎ !i݋SM6tR:2ϑA)gKq ䷝)&h~I ?7oMZ=:8/աeDYϐfW>i#WPhED߻ch4@}p _Q䏉}d}nK>u'o( ~|4E:DYW esc/Q#7ҷf`bO3dy|81x i0wmbEVԳ_N˚K4}F& !}{Q Y⽤1B1 t4Ω %ć@!T$iȲ !Q$vvv\ e˖I…tlC=>CB4SAYzdiPB!B!D&z^ !U.!!YB( !B!)H,B!B B!B$B!B!D ( !B!)H,B!B XrT6JURCGVaӷLGd37ѓݾ3B!XH,DKtO5ɘEd[PRe'Ŀ SPy?@B!xoduBQSb z\k4, Ld;"\!ӠF4X[^B!$7TsxF-ɑ{UC z4ű5=1yMbxƕZ֒~/$~9Qr5tGӧ9͠yBBlWzmbq@5l_v?"'zAF:6c}O?QQg2~wǚTulBO5:Mv&vtrtut;0sZQá6]g|M:Tui߉߭tyB!Oe!3/PeJ{4ENr%FC:4'züiRs=3W #TBwq'gᄖ3\2rtݑ/ŪBC!?aD/~G8mBְRbT"f's"`ͤ߂hU:WX6xz X.1M YC Ukg'c9j;VvϨ3C/Ikt r4ʞle(DUK,><= ?K%k L)Vžt* prVFEX4C5p{ֽeʹ`dc6T1L\%Uκ'&ql.tzSZ3*iJ{9pWAwۮUz6adyM$O) -Z,**I{ҵ#˚CeU7jZs3Ér˧Wch0)Ҙ845m{2ɁQj=,i[!O cwlR1?rƥvQteб5ə2qw}B!yFYl+|/jcYk$5䶴 )SMnluD>D5qo3Bk|~hB#ⱫnGj :EI%R{t[54O 㮪'4ʒfsWV(MY0Uy;eSR` 1|TDa< 6V)N:bik6ey*_|zuZ-ɝ\x$Q avs N=nbXKXYHVPQT5c/B H,Dv}u-'OV,=PPxN<$$J!z,Fh*=l!o ʶXZ`'-.9Ɵaja ϰjsceIh>)2x)]u*1E3lL(mš,x|*{zr Z or!ed PBUȟwȍ.: >!6[ƗO !RpBB&CCCllmdIہYe!%Ѐ *Ԅu'dC&v_к re?bI΋66PtLrQ=Ađ/'N[Sh_&1 Uܯap\3 =Cjŀ?C|b9^[jLլ>3',d8ږBε+ؔ-Ez4(`gj#v;"^goR-y ] c{Ս8 dd [V|Ҩ w©1Ё\tuvK>ţĚ^C^!D| 111TR##G|bcr2\R:7&Ǯ]طowA7t:OݺuiРi<(><-l8K\X㦔Z=)9=5-No^ѹaQL;gT{J4h|L 83ۙxF9{2(`_i\J=d&O"|TvF ǿ*6~iK̝G糀i#[2/15% `fX܉<:6CR(~:+T~O`@n#iL5ZkUb[Fk(:Haz:MM8h; MBu]Rn}$}xU=K !JBR*FFr(2!%KӐe_ehӧquv䐲[2d]q+V9sиq,Cw U*}Gj_Nٷ:H|-ouc}#DJ!!!٥Zr/-[&ղ .ұg/MWU{:}_?`!@urTP^o'>mz&TUeܸq4o<˓dk׮Ѽysƍ*lA%JgoG'Wqܶ U~,7} !B ̘1I&eu/4i&&&fu(B+vf ҃T!%]27>ԁB!I.^ә3g=ztVJGAT~,jl|Su@yŜnA !B$Q~mcǎEQ.]RJ!EҥK/M;v,7o~'q!B!ćFʎ;^ˤI6UU믙>}swAhh(6664!B!|,gΜI5'+™3gyҋ:ˎ1̦iYjYz5^n\ϳu#:(Yњ>l[!Pq@-4H`dW)ZeW odxԢj:4iV&9ߠ]8օ^Fa[&B!Dfcl/3%Ꝿ]COW:1}X࿏wvv(Jڬx42]9aւPxoF)2*&&̓I,B p9H-W֟_@sJipkE7|'rk][NaͪQoTGt;7ř7љԶnue<$*4psíQgF>8΃?j91x{+X;oά^|bCS|Z:6|`\\!W"ήdtצԮEA*Oy*=̓p'gnNoӳkۙһnniٗ|&LY%toF4l?p7`&$lNFigzkї9'Lh͂ ?j4{+9ӄGfh??n0LJ;yw}|>dYe!B̤oӄ$`'Yrg oM{ط NKX}[V~'4i=I%[ػg30we3UsI{U#}(:1ю9]i$kdZ}c 9ɱiаL*:J5mFIL/3 ڍ]} cJ|Yl>Ȯ *cVG'Q1{ya?v(U6.k2@}+/)!C|I2Hibcciܸ1'NxnڨQ}sҥi.\`޼yL81"T6տ6[H>/ߜ}u527hШ jr0v_sp. OQ1LNLSB+Szn{M WJB0JeZ-?o;N%9a+fXYxXݫt|1rH۬<1K+K*b–ؤ=syH&sbṰC3]54Z_xQD+>Ҫ*itVJJǏرc?$uY|yr\`AVJ O?ݰSK\~=X,A=)`*'8 j)6%#X !>2Z 4vۙVr"/Hؿ8})JJq6É5(j ǭp-C[>bAn?Ur~ Օ]De'DܺۉUE\f)xѨbXx>ׂ_| xq1.D\*(0~oHmX,P/~U NpE;3\ĝ'% Q,M:P דR.sgo' -GL5`niW " sVP<ƍcܸq| (g$?44 ʖ- $,?~eJ3'X=>sʙaGvۯڈ)ޔw" !>>=HY`نzktaTnnk3)̠ihhad/O#W8g13:ҒcY2fҽ 5kףx)im-7566i<1Vӱ6͇ϧ/t`8q`\;:9Օq'j$MoaYO1N^֜ Ov^vwٽ9ōToR]\~C]k4;qL{p̷Ъ}wz r<-<7z5#_r(_\VNh|GPG*C3>S&ڰam۶}iz|TƌÔ)S(U7oƆ[nDŊO/Iѣ~mݠ ^>]ooȐRrm?ߟJئ4݅oM.QՀS`x&u,G. .zxX8ou䞲~%u{ &2T3x4Iz0D-z8;aG\\?KW|i1`$_%dNXsscՐQ,]fi IDATe+WBٲ? yE:骪rtAOPRnDl,Y}^ϋw'00u]3<<IO&-ʙ?K.$ˋ *$ϛ$/GH6 Toـͩ~џmSrdv,g#QgWqr|#۶f!kX{I9?Ɵ9{w,I7 ?>*p?~Q99f Ǔx&.Ué &I{m~ln$ !I3I|ONԨQ99hʡ/_ل=7Z;5wK0.xWkGڗ5G˪nԴ ]ϱs3ܺwqц*Ikؼ5][&GqZ}{IʥuE

?Vs".ܠMsRN܏AE%>&箄&o`[&NΏFә- oH^viHM'?OW(aƽig+\?1P^ B!$Y5Bt[ynȊ>L5eAeQcV.%i£|)Lr$&ˆp8T33o 7hMۗ.L(d$?5.ظ K!Be&#Df0{D2wDdQ dLJqUB=B!>Df\zظg rͲ:DZ߁Mϝ;СC9x EחΝ;{[{;YpA ˒ ћ rfB!>H ݻ9{ؘG|ɝۂeu(\gM>O<у+W0iҤwhʺY!XXXXh07G:tannա'(gMcbbԩSr\dInܸA\\ӦMGGwB!h4,,,PxɃ$,,쵟I ͛+W+W`mm\jժ Z!B!$ʙe޼y2pB!BdCeׯ:=$ɉB pyJ,IXXXry2'X!B!$Q$/MK%ؘ+V3gN\B\\#F瓅B!D9t҅QF%0jԨ uS^z'tR&N"B!BzI4 Ǐglٹsg&D%B!"=Ң,B!B B!B$B!B!D ( !ހJ~T鼒ʻ^,G9|eJA뱊^ow/lȸ1YB!GOe!X{RTNfK ?ŦH|㹶^rq ;1 ytoWp._2+Q}vܛOW>Ci] zƅEx\ 7\"(<<:R5Ҹ~`O`KBf0F8SnS[ϟ/ٿp ]SFLE[cwpȰPwl?oM.qrY~#{w$Q"{|3#54o1oM^+0?tyQoW3\<đ iЯ~7I5(FY7QAٮ_P ;S:1}X࿏wvv(JL~4GcLߒ}Ock^9?OУpQL8Ya8{od-S}4&urV`F<]9Ec "b(nv +vINzfITsxF-ɑ{MnMe(Wzmbq@5o8ϣyGXgԬߖ?gJ,{zйNWR6(6 \Ԅ> D>qttCm[g;ġpgz?_fvX=l3[ѬMj&ת+М//[ը%c<T" _wnBݺx&ܸ?VNuoH:=Yy'ۿí4={U(xKvvW+e9*Yz>zG_BnԴ3Dc(yGAcQQ>*D{Ezŵ858$0IEM6QLiԨ.]Ju>EQ;v,VVVXYY1l0;Ӹqcrȁ C ]ىrm޲=S?۞uˑU۱G{F Ο]x_pla%}| 7ExޝϢ$WƝ5lk`}7GA%jT/9~ Jsr@'Ln]SMj`r0O8`B}_/Yk_9Y)cC(~z@U|ٝwΨ˿dځh̕8ndC(UjP@%"`6 x2w!F:L-knaZӌ]/0oڟԜcGspL|4ס jՒBd-5kY=*cHEA-jлPc,]q{z Iߒ0:uꄷ7/_F׳sNʖ-Kpps*B߾}LM\h1ZOz<`s[f+fIJwGXm2*&cq>Ϙuhr#7vtS;0׀6*Φ?vF*p2C}nb#lbhr֥0/>48cwkԋ6՚QMSJ_ˁGDQvwvNߋЪ8]A52(6V?V\ˎk[CИƫ7yl`xFFhӉ1Ӻ)twS=Ѽ-^c+oDK z[接˘gڀ 1`L^,?5kR$  c ѢH9I%.&~W3i/YoJ;K.ή]0aBIr1cРAWv>-[|E}u-'O<)WY{[UJ+HB@bB,q_Z=u_W1ETPUȟqBCBXXb3ƈT޽pl/T%ڜ?s XOe~ M|+Dkiu.7>9ZRv5ʄݖoI^Ja_hYU{Ba߼A Eɕ^>yLi򦃂 !&}%[H+t)^ǵYb<$=kܿGG+ Ay|(6<%¿K+K+bV=`]t'0Woo=ŕX,IE1g΢ pLk]/ڸ.ɋĴ-IrCjߔ?--=frt N3INtR .f,>v*8T *%OjҶ b@D}$DҨZhؔr~ **Q79w%4Bsw 1wlK9KZ==^~Bx@ ׉|X{<9(UX2s3WX]%r/#'>!E.~;M>=%?pԀ./C9wv |Ȍn_cFn 7/] p7 C:5nJezۓ"i$'̤p[bގu8ܘJ2o&S۹#9%-Z4zPt&4G ߐLҐ0DW.=@޴7.?a9cmiP0  MݻP 9՞1dw:q]Q:ϙAtu%"Vit3RyR|0mdK?F1d,SaQL;gT{J4hZFyVm^'.Zle|L!:Sx ç nΘOg<&E;0k^MZ}ٍsSbv-ĩ70kp҅+ި!f?e޼a4r`[ C}BT_3=^&P\Ȟ] |!2^nh@>q9NC }'\).id;X9Q/;;s瑂Ȍe]0 ik_ehӧquv_6lm۶icbbɓpBZ-,.##ӿ7ܳgOJ._ӧi\vm]9x*+gvӭ`ֶH*vΫ9c6e\INy !]e+WBٲeR-p"tUU9xpӧqQB&UU9y*(KL6M^MNNN9sGϞ=ӜTR?ST4ի/LJ3g6C%+A0Jv|'\q*Tɛmcͼ<{wbo8Yc8I,B_Hא9s2eV`hZ/^,*U*y$lWpݳgO-Z%Jw^-Zȑ#Sm]~UB{;YpA ˒ ћ ř=6(w۲: !B{q9]8;;S\9Ο?<ɉ%KPxjɯoJ,$͛7dgϞ,^89INEϞ=9tPrYrpvv;,>ploV"B!{E`ddĞ={?>׮]ݝΝ;Ħ,תU+/27o^sʙaGϟ-@<:4FFƜ9#2eOf/;JH]͔yhea|;ȑ\_Uz87-&hL)Jܙ_⟏ S6g,=z'8SgX4d'.{Y>:!^rm#?\tf֚%tVS@!d"~/ԋe_IYVMoײmV#X“к0G}k}EqM]bG" l؍=ذkޢ{( "X5vJ/wX%(yۛ[a~vu?Q (1.ހM7yn[|![S BHlYc[@eGO[Zx@Bj0j6b֕TOɁYC7OOZK,׺l|Dpzn:ǦhcKݱt;;=ZΤK}'ٻPTv.q`)y}R[{g괛D@.gSwpm=M2?6 }Q \u }=g֔xs=}|Wr~RjA{w/3U'j-\NmSDùWzmZ҇N5^.mFobOlDAm鹓Rڮ~| IDATB̎;[w³=Ukrngxg d;KjZq'҆+ގ:8oːI{%NyH^4p٣&V"MYk9;<\qti@[8h5owCv[ 5$5jIZZ$,؆:nn5hϰuI%٣εpmS ۛfu]qtnH)x"g/bۄ4cmz/ }}fO%eiߴn.8{ucZ3d!3{1903SASF^^\ψ^rODK9owo| |!(R:Ɣ.m;ƞ`:-$k̿Wb]}{.4ScY$ڻw#7ߏ?tA2Vu±N}aۚ:CєS;~Pٗyx1KC/G)Z{Xb!eAGmBu(٘WCj$uGl39Kt`?|knsjϡe H)ٌfGH3^*6o{q֎fi^l2ʽ^Y}~᭜ր@-H=#u*'6fo;8x7`Ϭ\f߉t6ƀƘ9#7pv؟}>dP[Pʦ* 3/O%Rˊ$iWnVIhҢ>BU}!{u_F"}odE"oJtlZ6mCljR$V'ߵ0.&KߡpxBC:4Os^:l?(woW $ +:?ҵwilJ@Y1͝l{FZ&H&hm;o|*MF]@MJ5@GҤF(D\=$K7c^F ǖ[ĈecY`ӒHTh#E{ϟ*}wt@7Z(GcPbVڴO5/A9KPFjrP>QϢ> M&^]iR<*UxvqLE*\N0@7 +ȟ(ARW M}k%͍mTX߾Hj*4iR#G^Kx3D2 ylhSc 9b_$e)C+TGg/K-0$Wv.*(h_"ó\g@x&^}sfxZpXMB/G3( _NsI\K1Aņv~}c6]p_TzUtsi ^AQ^K[3u+Z%jphPbNpJiZFxq2Μ#Ǝe>,]f)V\%>"v5]t]NHttA9e7>m*@I'|g~, K"O<9Ek8G$IPQY23Uaai<-/FSYg+z9>/3ueT2B6~IK9!ȤLvfFrj2r4N};-eL;; 2Qg7h~?KBT>L@ 9h ,jIXZ.[b ,+<A%)aWKe("bՐЌ$Td$Yn_j,@YNTrӛaN195>1=P057\ 0$!Fx-˖mKb0yI XRPFqG[oJ*Mt\yTu| &"@R&zfr3[I8G;QvY sRl1Q\(`\αڨRn u >,]J0#'Nuq@/h{b"]~|poL(ţ\Su Ͼ]mJ}_' eAȮbC|ДnWҪ@[,6-uS!@Q^i@%E噱^+M1c{i,_S A1 f9_RiaKljw\mncH7wV>PQK0Qms#g[k4ʏhQ$Ji4W4Zn>_bTΥF￿"-yfU|ظЇ"*f*#*vxnfwJ%5j 4 A2ĥȃܷm[z}/ByȨniuNlǀ5*hIyξΙS9x$%a Շӫ0ƿJl2vBEB$Ԋ")![R JHa/|#oyߕ/@<:ް6 {3 k{{$"c経uy 331ikx.mcݱ} A"pn+ܺxlN3"`y[4$\GzdV;+Aa,_Dryݣ}puHRfhV'k̋//T rw2.2&?"Pbww=s&V$"n^aڻ8_?f7@{bۇ"EJɟII{clomcJV.Iß-aR:'pLbiI5[J pi2Ω47b[lH̏yE5B,4`q #71[Sۓ}oM3[PJa4MV Ѫ}DS;ֻU}J\ӀXu/4jފ=GqKlB4Ξ`_Ӎ#NSؾtKkפjQۏk?Y; )=~TF-=6c.5yqu7}xJAm݂Y d^,٘-Ze#Ϝ^f UXƅ ǂ1taNw̋:{>y>} dg8NS=炋wo6ǫhF G3^w𤦓3[ʳ6k4[Sݯ\8W*J)^N.8:w!Oy[ɅF{5xO`dC7B]lZ\ڴ;g_^\SqЁGRϵCFS_fFg 8 h#q'e+!w{ @rzD])|z-'yjTԤS4W\{}jf杪NEQ:[t}vNNcku{fN8M kR=(tYRb]UA,ŝ3~۴uM5dPeП?(gqh0Qk"ЭHO8r4*UO˕91N|s!Up'E/AȦñz!ɚu)W:\J6ooJ( !Ϝ=m/XU[!Aü<3r}(;EL,Fu9/&^ Af.eKPFjrP>QvTmx_KMq1r*\dמH;wJ.5*4%"05-2AAAOHXLٍ,Zϒ$?DM+0!WڴTM$Ϣ^r:g)F^$8ZMtpc&}tqȃTAAA4D(1{!YUqeNfd,E@4YǔuYSyh6ɏճ8/5ڎF;Ɛ{Z| ?AAA<13Q<ɂ RdoXB1bc.zر>DͺЩWC#.Գd41rf$˝K7LAI%ȭJ%%S   QL$z7ΉQW4(]@;ͬQ;Bj$2M]GvyW*ǘEӘʅq2:&EuM5lW+(}i gn}޾Lj xAAA^%^   +D,       Bʂ    ( 1+hYD@sYMKh.J{w `O"(c ~Xv%Xם}$B`GzjC>XձH\aE {Ʋ-FKJ>{X*CT>*5װ^. @ʟ1n!Fww“Y|'!c{TPb%=p?_j1,lKCF7TnA*zVy$HǾXp)`T؞Ѷ olh.l߶XR\tnA(kMbޮ <䤨CkjK\*-[Ɔ*gZcXRyzbW"z8 ]r[{Ͼ+}Kٺ~A|"O~l̎u\؁aUNJ9Q ?[*J׍YCۜ:lzqS+$i쾑 #·I8}gN̓drt;Lp;/wE> -W/[7 xJ~<艻y&=֍ʿ38}g_N9R,v9JƟ2n#)O.rU5eQ3-#fz dxfƞ2N`tû0qQg<ނ#WsH0aw#V^G{ w0h&X^pdo{>zsf$ N&*'Sd,8AF}z}[bWJv4B{ϧyfʦh솝m \Z`Psdj7$tr#\0@?u FRVgHH*ciXo(#j1ͽюgGһ]zQ݇^O"='=bff;µ/KO]'hnouѹ!Iz/bۄ4cmz/ %ql~lR.uh FnmEMܲ T R2La0WM{F#~H8B'"TZUΒ>Aל!}`JIIOW&=A+ߺ ,H-(jDt *[$ZQ&Yұ fqlAgh EŖaJ}:QvɨLѶ[#1@DNDt(Z+\J`ZaX'D@Yʤut9{")pi/c.0aW0'..8ϻaNJ?Grm=|r$#ڣ#i9^00 bFsT ɂ ~+lr SV䈽]2B6G ڛ,7)NeV*}=\e}L~9bit); cbAP˩/#o2kSaJ[ky@¬#mΞ7ߓ5v?ՙ‰G(=KaO=7x?:'YxᛣC.sSRH\dמH;wJ.5*4%"0ՙoC9{x@ /ԂZC d4)!ir8~(ݐYMwﳢ]5*TLZ]f5c׼ Lՠ6Zq 1!?FTMU*WkԳPPOL *dg /1@Az䌱 s`50a >/?VcԞ ALq~v#~.euZ6/ͣK>i1g-Xpfvn+2 IDATW\ZJP)GYu~ޟ 7O sou7k:hs`@˛d_Css 4>H#{TzZaq /^fC |a:T췙|3DE83S,eǞe,s *ԪD>qU2BU SsưJR̵j$ dY n%S3reVr~I&&r:y,6ʤy *dQcai,A)<+c6q;}$'.)1 kʠ9{Tfr9h3).9ܟ#i1s[DMB\=?sMv@Z_dtĆIudzϜY $?cd[ω Fw_r,Dp{Ԙ? 4;?c!e=>:P>1BPPKQ"3D<&1sp5F.;r}g)=jPrcӍiY黺Jo4EnfJC\]rI^4i.L^G *>l\ש0eI ĊZSFD[xLErFG)q{ P@ý0.Z$JҊA fؙmyHh;)~6a]@I%.1mrXj?c/#Fv\EXǿ,jWY3;~MM, KdH>?V6tF+zpYEWInYo5)}o*\N-ve>hԯ"mb$7C28¬{ NEp%K7?`Su!x\Fyux<ŒyA8:$) v|O4U]XE]}9yJOªF-JƊRQHǙF1KGndLᧉ3~͋HLH !1|+}uB+k;+pu3 0h9OB$HHLA È^ Ij;VhHHH$) ~lڰ6^TaMS$Å!)* T9}o*';OKpmxk(oPKa_]y{1q^ӦRw\I`eݘgaYGҤٴ՟٘Rm)Zv̓ K= ڥ3{F]m!|"{h8)d֡| L2u>*Fx OPIL;5;+p[8VMowQ J.|6y%U}&0R2#ٳhr`Y֋շ +ŽG1h`طdpMkHrKצvƠGaῦΦ۹H8.PxMA/FQN S&OSA/Ĝ]΢)uɯ3A&M}UA99|;-p4>E  u(&&'Op-ޛ>.>giꃫPJA$& j_J ;K!0Mח. B!@jj*nf]k͙?+׮맞t   «D1~x߸ 8]T.6TAAA\b(55Lӧ>Y~   Dmں)ӧq*'WAAAH#^&111ܵ$a]cw |O0uTm,GAAA?'Oq$IL?ߕ~SOAAA>13u[ǬXP2e1 [AA#ʟIVI~t$v,#X2hիUW  «dY͛DFD#dwJ!Iw\VwJs-4Zk5Z SM  IݸydlllTn޺7)SͦeCBGvFF|:, LAAEFDRw"H>.J"2"K_tu̟Cn]iҼ)}اIq)Ezu[,e}K4մ>&o*AoMjj*zz_B6@JJLd9 6 GDF|kV`yt,_P{ʔuXWc  S@[ ەu9ʔH49)|.8Jpe/o|  _x2:勗;~cǏIMW S5&OLPu=!;С?._h}9>v`XRn3񳑊uEt6A[}gAaTJ!c9bodRAADdYaܾ}7o}6SgLٺ};,gyVelݾ)dO)6aآ?Z콑()ލsK_s31 4QRFM |%N /$6 }Q \u4܅α8sz;z3_)ދ4o#JCrx7Awy (<`s>,8AƷ@(Ů*\i<9܃7Oj͔M ; YWOg ï_ܛE:Mێ,tp, J|b aw0\zUfLr|mR~oŸN/ |r`f/,0RA^QOG** V[U*U,'eM'K&2}Am*f} I)ĜKnQDKԝKVb D( 9E!%hSĂ TZ:GʈhN6uplL _fןZ7TپL ĬVx5a,.C)4E{2f͜u,pmj 'KlZ7RۋrfFunBڮx Cƛ:4<72ߕ#NېvԯAF2i)K{80p_y6h6)])eayJmMAxY-m^>;ƒi愣[:N[w%['ӭ'ǧ\?JArInGOѴ "( Y[ - jGA} 0|D_8#ox6Z\8e 뷁;0-gYݐ?_ g]=f\ۃ67r&T^~Ʊst]3-B Ƒۋ1;46=NٜݱAAZ_p\@wIlP&uU4*>][SĿk h{0?`s$XӰeUu@7tkNz Rű"9=&"s`Ujam,duE|S|~׭iKF !AԆmhM %91*srg=[*Pƕow2rSihn *G 3GoO!ԞiRII& (}r)?;CtQDk)  WLΨkcr_jjWলo"uhzwdS*T0M?G%TUNIZQf2$+c312p0U=e\/5>1=P]FfcQ0"F,u/7Zw#Q/xa+wS9D _F:)UTXRͬ\ӏҮ7|*K"PAA05Ue1%K >l:CyrSKHȯ 1/bUcu%$tӮEd)L%z{Ϲ8kffÜUBٜF"%I"$R/T8DJ!9f]0nn߽??yR ph,Oe?M6f-?xn4T{G&`A*DN32Y,'vxHt0L)j9ӽ} Պ?68S5ğp ?uIa}$,p&fx?0#\Z%mp^vuJ|;)l]g`;ǮUв̥Ӹ6fGDq4HO>qf^f?vܷJ$55Ӈ`ϑ9TEcW> xuKPmg'/H=?c4E͞ӤÅs9x6 3~Gqw+iXh0"6lL\s,"""""-uHQ?^_ÄWnQa[*M &7B:uк4mМ~y3(% +eҞ]sxݥX fԜz[1hcq^}E*9t3zfRzk@~_62f {Obz"Z֥VpzeRJ6vݷ <2զf3 [/iWo½LY ,f/0*O 8xc#4hDcW} /5ћ?M5\۶oǡt.aM}7ޛ06^Āo=۷&jU~kɵED'111dyy_<{ԱCv0XnMmN^HjjBBvs뱛v_qV2߇S',r/yoX(ܷRCķkО:y$$?}'_?Bbq3#z-e_Ov'-@AYDDDDDD$`o---5GLIܿV?| N.~z/;{i !4?xw2 _UCB)*ԶHLJ9guLmE͑>`kyȩ IDAT۞uy+* ;*M;/,95yi9B:2-erj>C"A=0{bb";>WKIIם;X6u^??/-vyyll*EB99o3+8_W m)c0\h@DDDbooOjj*Y-ٗ}+lRD Umۮj߃|<{R3M5'cI.2YX,08adv'v28}ft2^0aO=~[t{/^gpn+4^WWONR+ҒBޢW&.L W$}]63Q>l=J9?ženoїla{L_C?zR!"'0ocMymX_"""ݍ}Ql9STۇ[nrGsPǟ+sϟ?WƖLn}S?t%u"_q%C q'eG<$<9ou s˿d"*}rtu֠ x%[QpKh 53<N?a=5̃&55l֛;3z&qx>XG>/kc׌t0_sEDD`ŋcu)+Dnё=(ZHnrGs/o wF|On)opOǔ`e|vq>R|s$sxx~-JQ+p8ŔYoU7^2ag1c=6KY_kXS`zӮ8_Ym-qmpUP>ɳf1] _F YDDDv& <<Zvv)ZiҨ[?d] P`Qt=^O nef7ؤR ͊wbIa;4Hq ^H p0yuL%?Ns"6 ɰFΔ{3yZi-""""KAQ'u-۴f7 C.LJSfܼu'l~b4i(NOjT TCZ>%s>@5I?Ȳ 8Z7&z}%w浈hh7 X9p%jр#upU(%%𸥍DDDDaDr._ Tkڴa[*4(2,وY1Fw},@[2۠[ހԻ$L@ShDݙkT }2v˚}3|e'0.>_azSV_w|X0".vƖ ׭fbx< 'tOYq#~g k~cdF5ǓS׶Ñ_I5睗0*b3),""""erQ=" 3Xӯg: nBip4Y jKc}rH5eH xNV~ k]}Z>JwiGu& Cj̀]yZ?FG09Aأ?| ȭ3"8N&oLԖV"[w8{?#6bAz 8f|K>anqgɛ-DBpANa)oV̮xpf #5g ^W1[`b3g&""""reٳ ^sxd>z*{lwyl5 ;ƾecwM#(F bm),0]'޸Ԭ.n_"""""JKE8ÚJJJRI^RF1m5lcxVs& LZsVL?8xuF<vX HݐfڲH5%3Z"""""wfEt~Ԝʓ.l^߰YS,2iеNp- #2 5c̴DƏCQ$O (ŲHfC,8&ͷhcL[Ml&#|nnXH2 88pPN޶};pI"w.&jU~kɵED'111d}y_<{ԱCv0Xn}~ϋάcZDDDDDD$#e EDDDDDD2Ûy8 l 0YRUШS*:vwqf;X/ݍ_^ձItM3yZDDDDDɮp&l-#;>+'N$ȃ2an̺ONT"(;ՙG`#n F4'f ܂</3;VG&}63`$S߂9}ZDi ~4 ogv?Iaۇ$u9H^tnʏ`3^io$ᏺbl6dTV:ɏ[3*jJe焦\U1 G kHX5r:/nw%dC\31[LMf fgg73߮\_Ѳ&'-8C>oZ{_s2GWL䋯Vs\:8R0^~T"""""0z&M>T]ߢ9FfS3LՃx!l4iG`OՏlD[ S?Ѽ;y/CeʷKY wU~:bq{v&YøU9:{2b`ݷya#Ff 7dxx 'mgs*ɚUv4i~O;&5_w屷1_<} jTH< ʀG~Γ[ kv޵h\$e z^ ;;g<ݒ́Se5λ&Z iK0yO{6*PC η>5 ~[֋ @r1Bs?N .LZa/WYζPj(fK~3<~fcqN~:oK/6KuZEDDDDDAr)Rf^>7]:n©NNot<+`QWLfLf3.nnW16lc8Rwi/e3n^^\٫.k&/ K9ԋ_ Ku3X?gÖtjz__ۣhսU͜=aB5.c]Mΰf/]Bi:]exMVqmRjd$vU 1ڝ*^79w:L|nv7cvQ@ tDHc՟Qtz )⁉4FzqVt̫|w6mW5Q!;=B>r7£5I)_ņĜ70yKD;.6'V~d`#M&\=I>i+Q+;gd̸WEDرkla$2WT#6S5= :A7dګOXCtRZ+Vbv'coЦ?=Yꎾ쌸|pm[26}ggrWG9BJJ*))9rGʕ+剈H@ cZ*ƎJYk]E~apr0:fMl_OzWlw8W ;GLgp$U*c2;xǻkX>ћn.4HZ;gwʎ{NvO1h]o*ԣv;`ʏyC_vѷO&,_.гԯWEr?E~X,w ""=e_N[wIj@ Og\)֍ É!?#jJ/,B[ ذqtPO‰eNѤgxMSf 5ve/8XTLhL6Ct:~$ՃjQًL|3Ś>E X);;;+Welʕ{=cQr4u|dǘ>qIjBhV5fQS&dXXYSϘ ҏ#y'Hcp}e .h}$C%F-g-mߙF "0ߵ{Y@!kx%)sel;Ѯ3{ۓ mQkJ2nG8wh_AGF"/""""rhFY$2pΔklɏ[2gfI`,"{cEif_Ĭ,CTV g56 ~O ߏ`+ WN]Jtv  .}rf9yr5Խj]6R)n&W%$6/^c^<[ ;g . nBip4Y jKc}:3ע|{L8Rf J!p5}1/ X Tk.=`.\bgn&=oƽptЋ2ew߿|LDDD$iFY$2{ؠ qNpV_1L̻Cx--[ċAٌo\3IHH|fuG{S|K:^~S˕WW'9e@LD\)Q+cxNN'ڙZ'cOgf_l3HOP!!#b˒aKIW[IN|e7]ѧ>̞9\Ӟjsq5&\9t"1GSPɣ̾}_VҥZ|~lJo{ܤٳ ^sx\{⬴z 8;;CR4S G}LfvaAq3A$JZwlt2a䉓^U8gvxg0?i?CČ{ZIv{.8 icK'Ѹ5Hc^ߘbF_^Qo< 88kٵH.kϼҀ؈~ vGӰı?S_a-KF4/MĴNVyU ϒ%p;=Bog1=Mxֱ|0I_9(߬>%ƴ.x2g0oYXIo`X |8glÉ`ӝ{9 ʙ8/O9O *]a)F"[bί-a~ř9vv (ãE]IOKp8g+]gHNSPɳL ɗ9֡UX1OF^3Xߛm)EIht*IXkx0ՒY f-~rE۶oǡt.Ie;"fۚuWrͮm۷V;$ƿdmà~xpVO>޻Lu*^#s_ݚ'YQ[()PLL >>>w?0Xn}~ϋάco "9Q2~N]P.Jzü/VAQ4q'ɭEDDDr6”6#26Nlx ,(ԅ p΄%J>eʙfWn!""""K DDDDDDD2PP@AYDDDDDD$e EDDDDDD2PP@AYDDDDDD$e EDDDDDD2PP@AY!`ɧ4#Fmkz:.un?"EDDDDv]@^r "##ٶmgϞrAժUiժ]4EbrsVg|^iYwgFlA0oq(7Gv&NgO?_ njr6$%%1bMFJJJnsSf͢_~ݛaÆ%I08rA`|=9e!GHQGlw8W ;?‘R4lv֖I (XAYDDDD(Zz}2a„</IIIa„ HNV}P'Woʅucpbf}ȏ√ҋ! d 29 ;1M8s֘ Ӛ5k\auzEn`FϷ.wnHF}Qf4]!8ER _ڕ>Kٿ2W$""""r[4|#F!۷3bĈ.C2# L)?Ɩx%slj\?*ҹG0>v`_$aK?ː6vq>Ncђ>ߕ*-tĮ"""""fĉL6-S=j3ӧOn:Үj6m}_'! \3~x'{8d/N&oLԖVŠlƷDq\o(rIN:KԠp^*ǖ͵64-""""rRPL$۳aTKUeώ;*,IϞ=s2̾}_Vҥʡ̦tVn>k,W\>.8+m&%_k.Kw2$ )gAKc۶mjժu߇d*UPVLY}&,+ ǰowp4> kJ>+}%nԖ2h^6i9d$ӯC~<000,hԕ3>%D ''4|Y'n-NHH`Ŋlڴ#GG`` ḺYzYn#3&<45Z> ,2iеNp- #s?!.MY?g{Mcćy}a^G3\EDDDDr=Ȅ _b=3{09IYɪS]yZ?FG09Aأ?|"""""5=|0tPNJ+شiGϏ@õ;+W?,9c`I;ɾWgaTdOwz Xng;kÖxӮ8_B9y ^Wz4[`b3=,""""9vҷ+ZUVwdUkVITV!bh=-X̤]9P| 癷ޥbDN%a`!&$&ރb͘) |8a" /tDDDD$juرcG.Tskvu2k)ƙ8/O9O *eOHAoOJ<50lw|(_GVׯ))WJKK#88Zj陋]ӧYniiiW;:: oֹ/Lu\'4oO5Ql:fUdVW1nmDtmIϛ_@I01i֟Qvh,v[L4mNX.1p@&Legر]F&jU?gk׭y?7v^Ȱa2?Æ 2DDDDDDpvvfҥy:,tRs؍57쾣YgVoFb.]nGкeڂ4i5wnH_3m?$}ǒiDDL[$`%="""",򀲧Z;:֭Ҷ,)ܐz7+o)ߖ1u5~pe/KY~-wis(q_ײf˃9~~E&f=ʖMh滉52Ҵ oYzckbn 2\-&  VOaRt4F"Z?4zy*)( h 8(['o۾!9\iM:TɵOD䊘|||Zav\{cjFYDDDDDD$#e EDDDDDD2PP@AYDDDDDD$e EDDDDDD2PPUYcf;WS.7rSZJDDDDDD? ʷF@c۲Cqfk̇լ9q))'m %ת[|xߛr 7G'fUI ]lBrXq|$zmLXjF9m\8;sv@ot;f}q*:0'tqiD`pnoߐ jHA 5-"""""roD AwqG589&Hd U+$DZUvu[URT%"FT{.R~ED"GАDnbD_^g~3E=Ң~N!J 9T:M =:i%vf=k.% 9?im{ٿq6~Wn"'b|shv{묟~رo-gBOwd[!B!MЖŘ#OpCxz!=žɄ$HyO@jVƍd*$GqφOXcgV]BG5ab}"zs_QL]3 b;]NAe!B! ɼ;o`ݖXꌡ ,? ,MJE \>4cLj>D5 ۄX-`6m'mdL-tjcp<29S^C/!rv}ӚXӿPB!ȀL&ƅezwOGwKpv񔯡(+IАLā v?۸2m?P!.[GU9[~Z[QQݻ X.& ̑=3[ELFlsp|p$YodF4h-˻9ԇ{[65\Fѭ{MU, /Špbݿ3h# +PN ؉eBgnOgV95Ųs!%_YBW@P¢o$>-VPejMFg1cp͚Ĝ'hs3>5f@";hVϙ?g`N\'O~WΝ%5iB!O8{wxlʴL]$T/(/0Qj[ĥDJ_ǤT-fO)ǟQ`}1!kE?l7 UI0fv ~zX, !.uI^3*/D龈{v ?oI:;3&` pPZV0G6s3ai jT9ArmT,(\_-D螝aԥy[o |+[x }RgUjͻٷ~0w~Ck={#wTɸ)k}^6kCc}l}&uV3 ocPo4 d$5Ul TnA.KrIa VgPα[ IDATdzL?=W1~?\9x(sGЬր !B${$oc'-psqfV>PϦL8>%U߫>W/揠yQ5S%f& SL=߭2o*9V} ʵGO}P<{ͻ!]}!ν>v>J9Ⱥ\hyY*`Dر:7bl[rͲF-<J+5jK荬?$sqfIG1H\7cG<+h)Ҥ3 ƚf8*QicJ`S WD q/X9i1paEĉ$@zѠWwhANR?<|xl!_?g%b5B!o7 r}h0"+"r%#YoIŋSBIЖhI2Y0cjS?jfߞFCηs\MU2&/Q6{~e[R׎?±drv6${lAOv.$FWby !B~( a.(~DCw7<;M"4ޝǷƽnCZ9DQrϝzqe]0Z3f]ބn7q19iБcqutڃps>}J< `LͮChtmm[wCalJ#Tkf4oYѠMFƩEo:zx}< @  g1x6em膴r(Մʟb\|ƓZ> 8^A~Ț!ԨBs8 !B~ʈ#Ց#GѣxUʹ3t7իU˱s_2g1#ہfs\_K=n.xܾ}멪ʮ{rs^!ěa2,H%:'\ "A<%oSf\ArD(sv_ȧB!0Pn+;I1ltϮSQ Q$];'^=kBe/sV!Dn F{|,6}yt{u%Z^9]!DqmwB.@Y\"\%J/+ "PUް2s." !$P"(X7opI?I!gϝ)j5p,H2, H!ǂ!B!^)V!B!HEe!B!" B!BT$PB!B!R@Y!B!HEe!B!" B!BT9Bw^'0"HJJ*RTi4k~>++- r6}?`޼y߿?kFFFһwLvssO>m334}||h׮]`9+kB!B:{l={>$fffF.] % gg,d.]$(BϞ= B!B@@iO~EQѣ̟?Lϱa=zoo B!B瓩s322q)R-Z(7'`E,ȾK.PDɻ#""kʠB!e.\8Mڱc >ԩSԭ['Ndԭ[ӧO|^qc?nk)Kw;ZMhZ`Ӧ j֨ηN`„vw#""Fn@}DE%jHZ_U+B!o Tl4i4ܽ{R~}nܸapy7nܠ^z۷ϠեL2'x'cIx}B6:~8Xr?N{2>=} 5S@L`Uס@ǥ9NP:iҾcW|! T 6󂂂hڴi+c1114i҄M6=4^622B7_6%бGf( iג5jR ;w⟳gQUâ6_׾}x{_3ѰVaL?ߑ@978~=ͬ{(B&(Ң?2<uӣF"00@FnxZna9k׮M{zzbmm9B7E&ѽfI=7b{Ѱ>?gXÏ-ɕ+WfڵY mjE QG80:6kHTӬUm O~f  G@i~߶Ywݙ1KkꕘGmLMićvfZ+a2n~Mȗqٚ&i8zɷ`x|Ѱi>ӱ*Bo:O xNb]iE|ޝ{B!^l<6o<>4iѭ[t^*œ9szqrriFBt:ݻwoo硫ʼyҭtǍ}Cޭ4V˗_}_jL(w3u1@u F,LTέU)DgCfU&o޼n'5Boޣ1=DrײR;A|>?.3d^I=g~ȠVQbaWk=OM|[zf?i2 %~5*O`鷮뮰i`Nb7iXOM7S [wch 5L_Rn,Kܰoff_nvBjӦMgOݻ;Ȉ_ O>+V۵NCi,oڴ)uK&s3؟SU[_{-hV= nBoTSjAkYN0?oN;pil Ǡk%~C'kke%sta,u÷B :SJ[{$@ӺuqӐi2e& ڦ=h]:/[7ܿ;sH3-: Ԧv9-N h+թ٭уv\z{` YQ}}_rmiS xΙN`Һ'yBɈr899ѹsg/_T#ȈSNѲet[f5ka;vҒۓԱx|}}ٹs'+VD1r4xPBF%J`_J{'O?U|=o·|wLyTpͽw{:cҳQA ND<7v'QSjT0kݧW4h5 ,SjhUd#1w8bp¶֡-*MZ&ftGIѻǣ_ZO!x[IEÆ K(9sKҸqcݸԔ7i&XYf޽`Μ9qEQ6lX6Z&x$@ЃL]ٓ>70zH#ki0۾=0@λYS *R i̱y'4>g?/̸Lg67sxR35ٚRO,U*ʹ5U>:`wTJ9IƪNy₏S346Z7y_bB3du9;;&}ȑn:G@f<==YfMӰoܸA6mϏ *\M7nEBɟ?ѹ%-*"`s8J:u8ª}y֮RLv9ɪGy%''׫5<W\}J"L5: ·Ţbo^xt GŌZ> 0gjb4^FZhQ+vWp󡎵4)ˉ?le|@hJ6Ƨ~Yʵx=pK&^ !00z4iќ8q"M(,[,&\fҥi6 i3=[z=E9+@3RvB!B5W69rĠ뇕;vLsww瞿j*oPY-wԨQàB!B!ҒlHowitQ*ݻwgӦMY.'((=z6jժؤIcB!B!2'r9s4'Ofݺu,X01NGٵkڵ:+T֭K7(^~=gϞ5!EF$&&t5r$3'b_/C[!ĻA,6mZ4gggzAbؼy3i$$$cM!!!!16mDbѣQ|yfD.`"Ӽ'zeBdrr4SLAPbE6l@&M*_BB[fҥY5=zHw$̌*V=ydZlT~q䔭v +\؉7opQ",,)sI?^Yo! `ݺuiX7775kT;WUV$''?uLѥK޽K޽:6|d###֬Yf/ooo\]]9pSe 0 [mgee(XLT(&ۛe˖ѽ{4ۗ+W0vX 9=ȈK EO>Oʏ*S+++r*o5CY!x$P6Pttt͸lllh۶mtKKK:tf6lvӽk֬I7H~]v 2'iv"&&&B!B!2&yh۶mibff󼽽ٲeKkpppA5[n}n )u:]B!B1 t4i...[vmvؑ2RP!vܙfMrFҫ˅  .O!B!D tڵ4iժU3J*{nViުUdwkCW,B!$P6Pxx x*+W2{}DTF)E,B!" &-"""TUeƍT^>}9ӇիnH,B!dkUP۷?xb|||}iѢ+W~7ǃq$ !BR^ss pi҉Q" ZZT1bќQ"mYp8vEyz IDAT+b׶I)5{6SֻubV/7H/n䧥 |Ѭ)¦b}rr/7}M]C"/0ggM?gټdޢZΐ@Y!x)&Vۑfe|1 S5&֒al%?nnvFբ}Nܦa(0T- 6rs,orfћ̜p`#;WR8u9/Fѵ_݉rW3tr^-7cZ-~>#-=1~cw>m2G-5*6|F5`R 0v/%)Gϭ?2aanjK#лJ"ʝ\Ɠ73vv/sEPcOr$~}N Ā[<ؕ}lLΘqL-fa|R$= n#uI.'n[{)Ag#HW0ث&k]x=9We3G|$c{khZ<~xscA17¦LULp!`m',Vmyo}яƅG`YMFXbi`}~ĜgL#nw,*ؗƫ4~ &<5ÜQhJw`Fi@|Hgx@.Ž2Q2\%v*9bv>bㇿbuxRbӏM]~<=`l A5L?k#330h=wӖpT mC1C^4/wٹ3#qdPI\#d;[ca%rp. ]zX1>nWG}F_[eCr=Y]$pf}6q*cs?gr ]ސ?YLTɐwh?!`\o\'ϪXg!+ng_?Um5$ZbXΐ-1ryy=Tk#j`fvb\xY!.x$PB! w [h3X#~ImaR~}<=1wcj" k GL1*Gn8qFP ~XŵXGJDގJ'MSQ7sh[z7*LL ԥΜٰHS6/N^ ~e~'{IKP0/Nu(nE<=;ѡ%4XWO-뛄CiB$Ҡ[gi.mxy/@{MoдΔNEM;1Ih0®z>ƠL Sۖl-lVRy`LP";^Dպ0uE%r[Q{XkA?GL;歱nhXSyH`6>Mh4Tjۂa; P'6~UR| l5-X{xq,ea2~-9m/|ӲbF,IB=2Z!x-3[3tDFֆ<,3r<^l ,D6H'wՓ#o07a֣4}CZ.ĭh4pZTe=QQP'uQ0/PGu46ئjV^_?Xx Z%4P`moKZD ]R*G+{7ڪ37}Mgi}t8TsH5jL6\Foܐ fl A_5}|D"i?56sE0\>{6rHuO〣}Dš&Gq=Ds}>5b-gѲM)@ؾ ?`\V,C(C>mN٧W :3;p-x$PB!r152} 5WRɃ5R1r5\fKAIck^'S{|RcOLDviO1 &PDrMlc8xV֧&tXgzOMMW2b]D&ãQL5>$^iV>쌹sΣ@ [Chl+jw:~c,(m;Q %XGpOr+*uOڂ67`og&_4#tP6Ո&66>.C3z`g7bήφ}!yLS>ؔ"xp-,˥mJFk-QY!^z-BBHS8V}dmjM!_>ie†1w9n%pNq)^4/usw8[:ԄbQb!LH-G;Қ|aHQ`[ԾIP!z (o+(< \j\z5X8tQO&e~jZz۴?У#R~mOf0Jƙ3y(SƺDtd_*1~ qIEPu Ψ}e9cA˹5JnDZ`\ؾx)G"@;^&Zok_kNGh.]UOT).MBEUrL&)IE' ۖ\!stIY83j4p!*h[%:"&]v^!6QB!r 'g,m DYǬEWc4'N|tNvjo,!`f )[1'Rqʴb+@u?ɃyZсP/#J7]i-+xp ?Ɨ1XomV︜ql仟\w(wtǛЛR|;+1w/ajjCYь̋zxJSdL0"+AmL<=2E[k\q!Bd2bHuQe>r(==^qx3 Mjr#GR+B ƇY{r~>so;rFf57|"wQUCǦL,SB!rle8-g9/MJMsBWC^ !B7ǃ O\1$5qpB$PB!x6ޅp"-ENWC[sB!B!D*( !B!H,B!B"B!BB!B!D*( !B!HP0F~rrNE!B!]( ׾}I?Ϝ6. ޚhEljuepw[ ǪB!B!2"DXnNxx߯] B!u@Qu. ӝnz}x_w[h^9ɜMil_K ԔmJQLB!B(+nQe{-%01]fFp~ha_}nx+v΂B!BrI2hQ}ӁkME[bgٳ(S!#naцM,fC)} !B!$ˠPϯ.7{p/)Q[zӼJ6&HXc:\D<ԃ WH!e!B!xdK`=q3>^.o~ʹbO'4E~U>9nh>zꘘ:%&&q! J/εk3q'2˾ Ę2q'╖I,Y\\B!x),,, ZʕkݯB!B!D*( !B!H,B!B"B!BB!B!D*( !B!;n=W 6Vt%H,xWcs*Ai*߄d]%t5ojuǙּ1ca0m}j֡] {ȁ Mi14oFC9q4B"pTroPv]ƕ7zu+JC5{8ԬUׯpYƎ_}ŏ?U|rBWߚUUHӱ!U@QhĈQlz8e.(Y* Fj4.\^eME1`N&w*|\LX(Z0yFA* țv|ِ|*7E!V~" |x/:'Ehhdx ꚱ{Z4u|u\KQPx&ryD̾@R/6:{{;zt8|9f̓淕|=-hjh6w%1mګ!TmBYm/|קW'F:ΙIj兇G|@th3~Q׳)G,ݽskltiM3x6nGQ\4sp{WlKIw`4iؐͻ1{v>j{SUL'JzWd'ˑE*;ֳ-&5ش>ui?P'/ w7ww`ȂD$\~| Jnl͐_tV4>!Trwj{mȜwRdH[u|4,=Ϯo}i= Їo35hMjS˽>&h8|;3eOmW7wsMNųNj7e>>Wە2xٻ?{oYZ5 APTVFU]GmjHDb%f"ȺHBDh$z{<{s{ @Q[8ȇO߽Rqz5+]H(K>ƾ&E_?G>^q ]F{|@_]6z/=N>U.N^X6h"iХtBBgˉZV͐n8+:mgBHg%{yyz|1/`n7/6eHb8s,l;ʺo?ޑ~[! >E}75˘?8K{4+ ӝNz GϯOĪ%| Wݽ?N"b B__컯.} С NN˜q(ڋ3h/c'.vwdúxho}V Fk]Ιf8své85=˘>mpw#k-gz8:7|XoF٫u\iDzt>kQ.45M}q&8ouMG'7C =c5Z|@e-rOos#/&> vqss'g2nӶ+8( ©Cpc&t4>! Bi<we ]w}މ1c?NxtٚY~; 6 e i7tScY΍.㖱5h'xr6/A#S+qlº뢯#ev".(ӞD$0+>uT¦ t(J+I ҜY[C[M/- ķ1豘 [m0hͥ ;ru2[eDŽڜғ2vn"C:q{ըz,"to(#`hȼҐM|]a6\5c**1ʟmSheB$qtƟg_8leZ+L?giYﯡϲ "ocLzEV FPA{/wGY>I3I V`rvGGϜ:HɌIgpT| 7/rpk'P}?!xC'ou<~#`8Ѭ&ʼ9*@wu#S 뿤FUzt=.hݥYAT, =X?k."3T*}G7֔u29d?=̐}{ž7q h.ͮOwtWf[m;:q1BHPV(?~6766ݿ+Ӆp-F֕ȶtI~!]veK&4eiѪwd$ȶkӶYI@}aAW[ba9vEr0x?iLc7h%%x3̜ƌ jxɦplC,fl}-ݕ?oOo`o4εֱo. )Cg.[N;ȉZ?o/!`]`ގe x^ckm]~6yVU||`XF pU0"wo>)GwѥqI `؀Z&EiЩ P@B\{Jvo24Xt!#j[>`=%aewRO5϶N=4T܇^a>Ѐƒu56]h/w}qlJGcDGWT/ ulyu`Tw]#t]Gn&oU*td=lwlr"cU& 79-16L!bKmѣ5zؼ[kMx+!+XQx7c^,0n*=١&&yk z~BTF#Cvq6ЫOW IDATglAmV5AcyOi6ʛwNŢ5*{g5S @ִ,`aC?k=P;n]VM 9m۶s͹56I/P_bvY#|VBOSw(mC]~`E)g$0ͨ *,vc3Ԩ'\̫PS ^Ӑ[U4Q9xǽvgOG+tFU>䓦3N,sizvFt ~^9{Y9Y7g=?% z}ֳ)p2FYm,c;%{3[m*:<8#P2EF1iJB(/-x<_}B_[xa>PQ=- I&bڇM|.5CPS 1ׇzN s[r`gOq5ji):܎>̮81*` -y4TB1USt(船C_ 4cBZ`}|]͜dI&c93kfrZR6KagD E7yw=&&)Sl]j2:ɅK[,?xzh:Rt h!c;@WC|IDbcScfSw.k"$rzl:ȕ߽7x*yO;l /MU܉US\ NZ bmS2?KAgQ(EG)uIK]Z2LY+ e 3htٶ@*kHZCTVh=?O! 0_7"EG\lb%A{]nu1ě.,SUAʨ=KsVjī0(6ģzXYZON< f%3y-EU/|nqƑ To_0d! fԨ7)x( _ڪmmdXO*sƄ=ExD޾IQQ>Cs8*~ǤJfdψ'f]ciizmI^Qclau;EJ򋯿xST5V6tPV x&`ugm}g~Ӌ!>Y7cxD6m3=~!Xy/j/ƚbE U2ף 1K}bc` PFb-Fm`Y#31v2_]#d@3ʏ1 F4 O#7㰲F ժe^!S)t K 1b^MPgYOJLM'29괣L3}mCU[3S] YckUlZr;q{v,4{]~з84Xl?.eC\*篋x0qvN:܈ѮV?d]EQ ۷ṷ̃.gO]g~~6/J~jaYѪ,ƪv k/}ɾ,T@!V%3~{֞-JQ$(&bsd_?rޱXo_0d! _7 `M,""ұclHDDDa)fzӢ) q(:+:ON;æUNݽ3^ {C>x<9NߡZ93h=Ⱦ̭(bYq5&xW8a\}tܿqs8_NB~~0jN /G*=~}=Pa]~j<)¯QaV0< Z@D3\ycT+RBظ#i{$wR՘xN#Rx>4__ͽKGQViP ZK%~aص^FHpZ0~V&ػLq ӻG=S۵bLKnŪi%9T64 bؒYiւq#pjaO2/g2nF5ռ4g0f@.ACW- ?i0ؔoKmw>} iSf0STGͤs]#hh֜RN 5*TnC?gjϷS1(^6gҷFzlRKF[1.xzgSat$c0]}25}#&{10x 1ŝ?˾^6 y\56_szRlΟ\CH9{J6аl-(ޛc^.?kE?Pr(&_"1tm,2uBu0~MycX6^)tZbDA2NTZ_]]#S~J`^xCIYZ%s94BzUH83RɬT;PkN2_[0-אv5bP1v7bCZTA/q9#?GrPb բ'x?x{mTzNԏi}*zƅx]+WmwҥG޶-rTXF5lp%W9Gz8S=Xj -lٲWxQ`_;W#89:<Lwet9NSit_aȃҖ?k}XW}&^^B6oi/2ZNl:^!=!VE!l^Pc߾'+Wyi#d( .L'M;a͚5/$Z͛ӹsWBY-,?Ka}Yx.p$M-^q:ݧ1R?Kٷj\.qpuu؟ ;׆!`jYIB0 -ǯeaAHLSPnۉjeb|kBm$Q.Nzf=˗bŋ9rsu.Ӎx}]`aG!=@@RooDt>Ytذaoi6lSN]V!B!ī#B!B!;ypM/^̉'j %;v|e4 >={D%xY*B!Ds'slڴ޽{MKK476֯_̙3Yp![~u!򟩩 077+PBKLs?OJJ 1m̞=ٽ6;vL^OB!B7GtҥPB!B$Q.G{Vʘ1c? !B!9D￿P\jU~wLLN4!B!G{ɠAr}E """*U`B!B!@ULLL2e SL)PB!B@e!(`:sQQ܎!55B!J__[*WZ-$BQEE=B!P))D?ǹ(ޓaJ.;!DC%IB!Ŀb`OSءu$QB~a!B zu>t,_\+JJ*bmmgbcc9s&gϞEQ={ }ɓ=3=,,쥒dHʹp—ZV!B!c(烄^fÆ !B!$ʅ~NQKO__޽{۰B!?O(B>>>lܸyٽ;wüB!I]bfܸq*,!r)fNy֧絥?X7Ůn'hdvlB!O^ 3h3'Y =WqUh"ĵ2._Ogt>,B!kBe!Rupag$ʝ9kF̊p_9:P: }gp.G-Bߔ/Ce!RN?; U:r&uFIТtƳ Z}Ԑ[;ޟI!C{0z=@Ռފ =4Av;|@&l[/V^K"|lfzx6OC_F%tWo-tNndgX;7У!ͺcں++lE8u)e`GoS"ړ>kJCҢIcykzN%?@we%uuc O~96&|1mh؛.#rD?߮Ii՘^>]kIuб7M{Ҳx^yflwóAa4BJOaT64iE.CXYk:z7gSZtςۓB7KRR:~H9~&A:tP"o)uYGlNC!RՓ+:ȑ4{\ʌu2W?v`E7#ڢ@jF8^6ml.&Y| db~7-22(m˧QbбHݔmjYgї!Z3Xq,ε~1jx`ކBveP>2F9[ ]9U JV1s";VPcM%:_ UoGV+d |RV̈́ b22Dݵk \L7mL]z:ū+dVo $xX/q/l uDzn{0 {`0F'9kc5"d?I? î2voeoivݍaQ}4PQ#R-7k+85Ь{BȈQߏ#M##( !I_N:Bjժ}jժ[ES:!/(k6cÒTm'޶}{ S AcKc'iGvƬb[>nT<÷r-5.Jc;!}Qa}5ETzB&<,g&'L#o^Fnݺ72** (^xF'<tÅ9g͝X^ZFr FʡTqKtोذw5XVa:nǑ|v1zx45-Yj'bjsʔzj +GOV5S4ՠP\гq^&΍GoN+EO?Z˵ XKcޠJS[l--wqԠӡS+:NFQq :‰ʢ(֭!Q[h őѠܽDjqWEǝ;`Se-m_lL,)ҫŪ  UGU ?ϵegm_4t@B5Y8a$ɅDHDDDIrA֭ *&3Dl0*kJ^{74NF˹e>sfVQ ḲueLX;6O.ilreKw ؍b ~h-٬OEF߳ó =j.bk{9+-O@!33E"+ܬTpr*ק):dsYм FF{Kĥ@􈈾 E1WnqpϜh@lO²;5ƒquȠV~l+6MsgدeY7p !xe&}`ܹ$z*U/˔/_>˿gʲ.N&08G r.8S:ŰLU*Հ.S'!*sZ|<EQa]%NV3k$]rA>=nIG]Ubk|^ fMYO̸ϝ vEv:q8{P5GĐ$_a}ȵӅ5 q:ktg9~Z@*4!-5B!4̟7I\H|>={sLgK͚5^fM|}}9sK-/3%ptfԫ3q5_:NT;.aalay"}9 z`ohoV0ٻc~zȌCh36a[LLily1 ۞zE01D3&ݕP(6QqrI:*CqyM)qfڅi#b⅞֭iBO0uG47äL=Z5Kf*K!ִ‡cszyCL+ؓ!1n7? Mcn}Z8TBs?c~|?!g 0¶7&T.xdėȏB u ;4հÕÿӇ9Gz8Cǎٸq|||Xn]u --]*Uzn{q^zyx߃}څG(W!!ԫ& iřu:ft75+b+B!aC_Qvɓ&Rxqڴi/Y1B>쬮(Q U<]E~|BZs!ȉ5u)KP5~= !BdDY!DTNK.L|4 IDAT+霯1 !Bzk!B!" .^Ȇ  ;Cwo> &'%%B![ %%}}yb~D9NNN|ׅF4hNNN(RĜϓZء! Q)b^ءuu.ƏOtt4V*P]2~Clٲ\~ǎ\! e`hHѢ!N\l27oɓ9u:ZM>|=Z* "EiB!Pjsss)Rءu$Q΃Ν;ӹ T?T*XXXv(B!"2FY!B!Be!B!" IB!B,$QB!B!DY!B!Be!B!" y=B;wpu߿_ء! R055TR+'u:碢Cjj+K__[*WZޗDY! ؝;wu;U*cffV! x.^xn|.*d100xe1u碢xJWWM uu*S^d!B+f[<׮]gcnPbW$Sb%bnǼj( !D$B!fffyʕ~D{wADY!B!Be!B!" IB!B,$QB!B!DY!B!Be!B!۷o/>eQuZaIo4о:3-]~9-q뵆| i/// /\ToOFd'7 AVzN0%3{cXvAo=%t] ZOF.ui S ;Wڡ4n2ȴ+dQV8a 7>!2K]\+.[eDlݺYffFe!R={q¨f.8\GI_}>8oϙPڟ?Ӫnj?]S n }S d2h99T^Kdܟ8Qg*!&($~{\.ċoWW'V3e%"h>]Q;x+Mt7VIl{]c͑s{2rO>\}J=I(=ܟȽۙտ_+9㉳u\ZN]ӫ̻Ұ} ;&!]t[Pׯ_37ѣF1g@I,[Sn:,5p<:zуa@\[D-A3e{iE[1k_$f k?'/>6,JZC5>m WQ4hҧ+1I6(#Dy nդGY=}=}:yr3U~C1֜ևMhhR̺JU$V͢只TjZ"": ?33'kNRgtܸrjxPB MXI|ң;7n|4o_|||~ o)['ʟPH*yvMr&uFIТtƳ Z}Ԑ[;ޟI!C{0z=@Ռފ =4Av;|@&l[/V^K"|lfzx6OC_F%tWo-tNndgX;7У!ͺcں++lE8uéβL5MrBѠSըH!|'I[.aLj4ȿѦǞmh]>JNtɝN&zf:/囏삳gG^A6}] ~pucݙcݚgQ w`h禸֣Aw].eޟgWfGׁ߰C~lECْ mqmئ@&_$`JҀMd}i2GL^7mG#Ywq'nm>f$WrBME[:QA{8= ?ҭy\\qnCHPqz5+]H(K>ƾ&E_?G>^q ]F{|@_]6z/=N>U.N^X6h"iХtBBgˉZV͐n8+:mgBHg%{yyz|1/`n7/6eHb8s,l;ʺo?ޑ~[! >E}75˘?8K{4+ ӝNz G%ϯOĪ%| Wݽ}شmenLW<ݝފ>¹y_Ѳ3^tϥyڨ 7CO0#/YȂ/ vwZDdtf F; 0 ܐVrhV3w)/ &x~Zr)[ڟLm1SϧoF8:v4tsN 7-kwdίKv V8ze k UMaΛ0[S\i+fm'w{ιȥ-*ݵ)NnoӏهSJ31:i ϧB#77w}/S6m 1#k1,+1sb+.눃i"| {ϞU07tn:J^h_iάD?D nn[XLնoR]!aZNf랽PSzWUnMdBZ'`ں|UE eb /ó+?̦+fL[e߹]]†m߶=DON !A[]~LXKo<,"t~`|OJgvfH bj]ѝuuY M:b1hB 4sLOn4>d/c\kwv?ӓˤC=TfہQ˷w7>1bӔehϱhN϶}ص36$23ͭȱ-FnQ)DN}{ YTVm(vAA[UO?-ZgQ5T/`H7o\|@Zx˄?Ng\M|U4rIu|s&Cjt3]cc8hRv8neuGٟڡp1\yJvq\|4# qa_=Kc`/:t/=9QRaajl @e~ʔ)n`OU1Wa7\޹ښ.SH bT&5&GClze`ldASoþgiNkB #Z4qfm'ޛgcjv=>Wrzziݍai5+WIPb,߉MKc>ESkF%1@cjA6kBevܺz q!~)فM``ґL?ƇXOasbsSmMszY{ ?AmK hֹ̩#"32.|`%u?kli^ tJ1=/ٔ 2Z]R4Xi ._ׁQi)vuU2?֟ӱjۋ nyˉ<*Ҝʖ%6Q=cl-&\jp< `,Ci7f̋=`_fޭy?˹b߃j`kb8Р'.AeT;8r;dg3s-tuVfUYT8dfiU]rM;AbJ3+qbkZy|s6)Jq|޶v QyȡXϻƨTFNJ9uUcL9pDKzװ7Z".Rs@e^W2j@]ފ%f7e}G0WQ9Z+:XvS-:ҷzάj s3w,J<3aoH^Ij1ϝ,w9 ݩf Cʸ9No]]K^Xk@cUO{k[c[\ڣCu{;bEMwqwHg=?% z}ֳ)pзWC!&h4]Gy̪Aq{\9O{;W/we׋Ә E'w ^BOL۔o'|1s-.̮81*` -y4TB1Tj5:E1$.K3*hq> ǧeY(It(jUؤC~l4gfWT͒}ag، /*,=olK1ա{MLR[7ৌٺdt2Z5Y]=4j):?es[g!CФt"ֱr\)^܊;Odҋ (6Y"1is(T]ye)C2Ot,t+UhTqCNۻ(MH4)REI PX+J/AAEP *(RU@ЄPPR dGHX $IBy^p;>{0=ӜJJ^ )ќ9ڡ-%݆ݽ-䍏jE𻰃36;9ٗiI~G{}*`ey_T4 f;cӚ(cYΥ{&:Nɟ"eQc!w%7|ޣiLys-.ˆ]eh0;1[2~&AܑD,_c9ضn;>;& kK00p`?N_j{l.MWK×SҁT⣶a<6< &GV|&Ph5:bx\*zfl>NJ{h}ݪe88ZC5\h;B_`ܦ(xz͘0-eyrFbԶLsJGi/%uy2KT0'(8_:{rLgC[#{wռΦ[3 \CꝙAg?RNF&Mfe~y |ICX^m;w2e<#^;XSN5,?X4^Õco;a1Nء A$ּTg7 _?_ x?J+fz,-F j2=pınj|[ϢR'ُ"ާ9v2*^L=YΑ@LL"F'8Eo&?~My~ś튞R1kE_vNJqWGa:MXʈWT{ b8UK6UE=2ӯk/{K8ؐ>M|/[=&h^|'zc5{m5s2{flVTAdn\7B޺BS/vk~<3Ќ}qEے2l4 nrŎu͕r\\NNs^èsMS;ro2XGχ~gOJKAH*?z6ac&u<讴Ҽ}&CH?۞G#`Xdz,՗xW^jH=wx">}2` 2${wͩ[t MuRewQ~e9-;Ya̹spn~} k~cps.|Usؑ"X>4/'p ܿ7(|N`~ܸ9\op_V{$;eɿp`غ9,ܝ\  ֹ6i93NH#,jקOs*R[,|P&7^1T*88rmO2%H͆?׸"8Nu{8؝|7w-TBgG윉=KS'jD^eChZ|_|`Od7k9HoXqc3Mgyx۳8iLHFt+S!5n7|6!CzϬ^3C r]qg8gxK6{y3gSknQ޲܁dKnw/n&p-Bu }`iMY4)mYԔ>WnabԩG&U.]\ <1׬KEWj<"!Gģs8ˋsCd IDATSOQ|Z6ie,HXH0 Cַe.KH']N_hJ?3%ڇ3fƍpw3e8c#u7qBvm/簮"7+ƗiZOǩ&o#m?+.ԡFtc9>ßci ˲c+"^%/"˘ޱ{J4b4iG=BSзRۓx8f&=קF >Nmص/~Y`5k1iYֿ%5סqkMn֗%>0ep#<ܗ KH}5ŋk);h am,kREVkFōCi\fc810af$Dcya,@yj@H n}f7jTjPWT%-~E֕3N3}~`>dmO`x֦~2wӯWq%{,۾J&uZ6̽;m#̵WjuOw:%Yg<;i EP0M̑JLy:V\X V~oNf|x }&܆A߀'rԸ{XRX|:ġC.{le*U*u!C9`֭4 r]Dw_\+>n~ahab|Lh3DS[ڽ2TszLefL.2ݟ~Ҙ匪{h5Û1{VñqC#wk։ˇQ}X=V+.ͣÚ-H^؏yYY7Җ-9*`_7~X2͗?9`/ݟI;įFw2̸6q{%1y:jTo߲u+uξ6=拔?x3?WZng~wi}c0.ViAC|SO7{Iu4&x~+6<nrܦ)w?_?MKTs1S6=Efip+J('ȭ*UM`.4s7w ]oH!%nfEWHqQI1unޥ.wLsfeYnvV%#,~ζJBܥSRv=WL|6HEPF>nq)( BWCF\\<wB\\vٻS$''Z]BL︬H;s 'NESb<<<Mųl?{D5X,V͖g^X1֓n߈/"r:urVHӃ2Ku4۾ѧ)_Bdŕ}*:WדEDXBBB9ʕbӻ󂂲e' """""""NEDDDDDD((8QP˭_+ժVzݺv2󌂲sbpw-""""w}P~}^xEf9?<+Β%:,3ϸw"ll{ Ϯ y_U%axlB]/k0Y(VM;W2݃SwhKpVN ȇ%"""r8t{GF￙:]Fc22JAYN=䵆fc蚲̪t/W;Yp{3'(qY^?yᓗjqqv+V fы#Y`hwՄQ :${qѭuiLЈS885AXBF=Ir,^aDMh{2Ŵ*V|7IXh(BCiڊ~s`7艼GAYDDDi-[ʲeKݫg~4GYec¥D<͠W=H"L /+CqgH19ǯm5Hݽ:%OnsL*EjL ? fS%6;^E=S1>^ çcBIm_ EDDDeG0fk\MSPSůg*/p&]_ |hC `̩XR - ۣ9~Ž6v|6f>k^r #ZVS9#.fn񛗱tqaW|2.%""""Wӷ/ !C򹚼;TO X_5% _tjU Vpp旹ۛŷ{Ӥa,]UKw~Op avFXٸ&1˿`$87,'se'!6/ #Vԋ+͡.Goug`Ȑ^3̐!C<e;r,#(ݲ >[Q…rMpxr7Z>چ{ӟU*ϽaSq8>ϒ17fSˡL8<7eÛ{?EP_ N==aݏաtmRB>78k}J*2m;tP/_RJUYFAYtqSǘc83`dogl] ;W7y¯m2n5!S)޹O'l=F[( 3ĸkL93}~/1g>>}0oWT)>>=? "wN6""""w ?[(8ш]B v;FEDDDDDD((8QPcPͣ7Hsww#..>;@\\Gt1/' """""""NEDDDDDD((8QPq,""""""DAYDDDDDDĉm0.ADDDD$JwEnnnn'w"""""7]B|nn .]LE:=w9"""""7EB|GFQh.%mjpп$&&s5"""""aXbxyyw9En#V5#0He' """""""NEDDDDDD((8QPq,""""""DAYDDDDDDĉe' """""""NEDDDDDD((8QPq,""""""DAYDDDDDDĉe' """""""NEDDDDDD((8QPq,""""""DAYDDDDDDĉe' """""""NEDDDDDD((8QPq,""""""% jjqv:Obrj~s[qs5@B4X)1GNHbcbINNΣ JRl9LټgEDDDD"XKPEqz\HNeˁsg7r_$ɶdjԨbɣ J6[2{CH*kSyoB (jf"۾1/_A!9Y,/_ؘz]$19.U%G'''cAErݧ+(8QPq,""""""DAYDDDDDDĉe'yH>q8, b"ElmG0 NQW((HIN!,M?{ҵmk zwbO8M. GCl\z`Ӈ |'88?12Ñ BG&.O)(HHNV`f^Z֝"Q'f}1 È-̲#qFM`RJ$%xw Φ͛/k7L}Ss"y"'WEs1 ˳k((HK%1y , 1\2[Bh]4B(]GЯً9yEtrl8+ cSUp_ӭԮ̈́:lXa{'X(KLdS*ZS"YKc^y-7Mϱ,؛L}y>ߴIϴQg*ʎF>ܕV-Biփ_\ư~{".Ԙf_ۃid-[ѬY :c:87 #4!Z=16FL}S}a4oڄgәh_((H%%戁tsهd;pZZvTžxxr%-ER]5rJl8m jۘeKؓ~=c!+W.`Rp ?l9lO˜hYT:=ܑ.->aL5ή̫35|ϷoLiqw~jĹXϤٛ蕌t2Tdz 7LǏ|7I"3 """""rS|L>tc$&1ٜ%9g&卧 Q&0w.$%6;| #'"QELX+Tv;v31MV_/TJ?k2co """""rS4o`ܫ}0M̘au!9MkpylӇp>:C[ =.e=%,\^w0jh]+t^ֶϙCÆ 0.F<י,²\,KlǤ{rńg?aStDbc/5-d&o%zqٵs@F?nWV8(IڄjjZG}UE^MӴu{#_|?"7Vtjm槉cX0ɩ$E+u_ {UZ_^| ܭ{aaM|8nծU^~ >ˠE?ڼ= HEoGJ;.יT㯯w KokLsZk:o$)@!j5o@ҏHNU~{_?lNE!*1oK(Mդe;B媗^Ã{3|udWU &t4ZTȢRF{3㝪 [pβa;#yO_w}J0L7>E*U7v Fï8Na<<姚iֺ6|]A`vvqmKH!+JL>aᜱp/^.&R>ߦ3)C;ީ$\xifd6u&EsؚWW r[ q 24GlJH\.IuԨ^=O^_)efvZNG}#/ʸuekێaaYdɹxC#""""""0 :oOq9"""""""NEDDDDDD((8QPq,""""""亂.M.w3"""""w &A\\|n"r:w.deܶ.$jζ+6-*lɸ^s>E8p.uHvρC (Z,K*Xl9pP0O.–`~yyzIrX/cوuEq1Zl6PA)o6cծ'idzxp+ζo`=;~m۶jd|G>IDAT9Y,^/zu=ﺂ2Y-y[40 ēzqf6+۾V0"Uz3gjjw)w4mۛn%""""""DAYDDDDDDĉe' """""""NEDDDDDD((8QPqb9|n:M?ZIENDB`kraft-1.2.2/manual/images/en/followup_1.png000066400000000000000000005027301467704360200205640ustar00rootroot00000000000000PNG  IHDRU(  pHYs+ IDATx^wxUlM 5( |쨈'bED@@їhj# *JD("RC%$!$o9.&$3;3;;=ϙY!ʀn\wA2e"""""""Û~Q111~*Z`⸸8DDDDDDt} о.YiU ƅ⤤$DDDDDDt} ~Gp9(qqqbA8==~"""""""O֭@nͥ{>111;$qvv(WQVU@``;²pϥcbbĺu 7{㌌|( ;t蠗 *֭SEzDFF;(l6vrCCC}ѵ-99g5Lfs~*#Gd`` e *ɮl6aۅgudq%"""""h쒜,0\Ag%9<<\IMMU.p:"00P7M|ѵMUU`0 LOO6===] ua|JdRϟ?ZVt Mӄ.a cZ'""""");; ΞZUU%UUAfggVUlZZҪ,4$n:uJ5*fSfb*4M ]ׅlkŝ*EQ`E6M*"UUli2tͦf"a(A`.i-lۍ 999hTNb2]`0芢HEQnH뺮p ˥UI`4(40(jFib0]wk4]5ULBpWQ)NS !i,tF;bbUIUUi&dp8%i"zx.DU"{z""""""X ʚk ̞Y4`0hRJ SuietYJ¢4jRi(늪BJ)t]W\`0(&"""""kw`vt:?빑RUUդt:F1GӴe| ZJ~ϽꞔyΥ.Ą mڢrߧS\BX.4*^? f)Bi&iNIMϿ̐LDDDDDDeBJןq>5NӬiIaPUUlJvv$%%)DLL`\ y.(:uJVUvEQUUUזMМC2)]ӱyFjRUt:999N٬!76MDEEȑ#0|Ѱ]Qt!vp8t ݮNYJiϝ~/>s/ ~ԉ=Qi֤15i|LF#y6koy&ѻ')eUbV]vȫh I/, N |eJlP< ~= 0 ta 6 'H׀:oq"w)yO(%̞!E,<&EQ oi1rkغmX}I9V+apjNH t؍'N]=K/<jրd8L1 իc˽( >q)m͛5_M10]G\&M={Ve ƾ?ٻD5i!['ڿ={y5캴\rP4M Cbr"/-# Wk۬_a諯 000]Ư""2"CZZ:>r~EQS=+||%bcڶº 1潉<RX۰3$]g ƺ\JUQrKJJbxkk`0@4x4M Eg3]=Cgb&OnΐLDDG7l6A1ziCX'ddfp ++@Zz:-r  .=*0 p|UR`KQ`Kpd, ݑ{EJ 3yp[d""*S;#uS#"ǰ1i»8]%O*QY@D7Bt( } ޟ<;v^rj(x/qHgj=Id <M'+R*F#J^m)kK&tء5`1jҡy ʼnm0XV|M0W0a4躎B?/yG!""*㑒 7c~3FϿZRJwPwo<#"\b0aRٖ +6'L=0y)| 0qZve ^UU(g )QF{-l84mߍȎm ۾ƐGp@dV VfM㍁0qLܽS \LDDT |nl;)%]t(tԯ zh""튍ÈQJ%$#G .{;j7n3].,^R ʗBU5@UMP P?k0SÑ̋yL " {Cxk""*wK'jr"y{8&7> [=Y>.]n no˰LDDW*!־ֹ4՗SsLLIII"11QbQ]׍&ɤUUU?)e땭/ȰW5ox8fȋ 9Wږ}.(隦e)m튢8Μ-<<\;~ dTT _rq(d68k2R]Al @n8Ү$"""""kU@UUbԣ*+DDDDDDT..hVס$,]A`0! .]rpj2e""""""ƠLDDDDDDAC_<,%,DY-laRJMJ E)<~rZ^Q\t]woN[:\>kU|B"_">]3骗B1ypgRA&?0W=)n HSt?>+l"R?sNL ~Uπd?Qysgc<0(y`P&""""""3(Ĉ8뗉蚒$DLL3(].}&l""""""";;[DEE+^4(]O}]Z1)YtaƓ`ft=%>B`dhOJuSۖ*YwC]1vcG6qaH Q H]2!9omAJ!5"|_m}36ڣc}o.U:N=g.`AH͛>h봍.̛; ;B +ԲY *w?|;Bq"vFO Myߎhݷ+;HDDDDt\ @_OԂQE;kC8U.pK0Gmt}ԉOFKH_ 6mС^ԡ:!ؙ[`71 k폋d8V Th, R+JNDDDDtAɔscߏ=Y8r>:JSy/^~:6Q nh^ YώgއLa:_)NXFW0 eTy'N+ic&?K{TұzcX~L^Y?S⅀?8'5>w8DH0dd/@@"mL56ȆJS/ܢ`ˌ!p]"]gxcPO! 2{ wMf>?A:#aL*woŎ?<vOgkХp|S|/bÚo6hѾ aopX}U$o܏c8,5M$rpdt|8_ ݆"Mr]wDgS'~2=<C{E5󉈈Pqݚ *t]/b[9GBuuId1NDQ b3"Y7UjHm)be+hDS1ǥqo"|(4 ɿ`›@{C,a)'$iߋoe bw , ;=nWbe=98~~<\ M@ 0/t,]6ұox?1;g9V-;?/bn6EOaX2j~ }~O{r;yhz}6;/-Ũ;>>%<KȹO>Vt =~FGc᪟& <}֣;w0uc: 54g>VZf #`@bN>RGںm>_.]ߚxoeא( *4MTS\7%t~AtzAtzEȽاl[+dǞx$2&c0t oZ2c@pH #׬鮧%2&Ռ*7DIX?p8Σ3ϡuBqCD8,BG:Ԅ*C%tB@# 0$>ԑ*l 3~Fn{+2·7?Y`0P3_vPT(B@(*TU-Ӑl8;v> e]tNWdY?z@t zxss$mX(B@QU~7!{5Y Լ]s8v,٤;^} jʿO)=3 ԿH:n ۫wAŌP3X<inϺ֣#ѱa8LQR<6XN+C~e7I߳D%@cOvubmH51Qs^Px& 0?q{3t[4'`Ղx'Qwᆲ`oމ@ 漂16w\qA>٣",<ؖ T򚖈1 ?07\+<=yn=~4x+q6! @)HLLEHh%(#)9:A@PAӐ4Uwgrw@p=9"ZQP@-᫪=KeW{JkU&TTȺ0)!翃ʅ9 O  KDWF(tz ):{YoaIO\R$L w3~ aw"S"@mij@P0fz: ^\+ntVUO!{2gÑ-K0nEX⁎~eҡ 0oS%y׍0Vl7;!u=] f žtj񶎂*wBߎ#*T@ʱÈ"!AAPrf½cbWBU qxJ^| M\7=#""""5̳b9ߗ_Bu3gW_CTth׮߿ϻHRJi7rsRJ,[k~^;v@J3?eK}OX|9N<]}õ##3mق#FOa05MìYbܸq-Z (0k׮PAdP={DZZ:`_AÆF#-;w츤^7fwwƍIi֭k:ORJؿE7o52`¯ax{HXSLEdd$ UM7h2!f(2^܈zsÇAu?͛n߲e3 ], Zn\,šjmtL:u̙l6!),ª9$T SC~}1mT 8!!!ޓhD߾pW-[бc10adfdE˖E1i$<700cǎ}Á.wƑ#G |Tpp0~)j׮,zJOtQd$nfݗ Q#ؿN,,ȽWd$-[ٳgaرx{HpW_~/Fcl"""""6/\夔8wit]Grr2 rA 6I48~8^z72^[Z(Jy&ٱê|t=& }ڵЮ];kk׮+ d*eQtMTǎS@uwm|Ӎbo{N^*:z>t# BX?V3/pݍJh׮nm͚5l'N@'fC!?JH8pOo@ݺu5j ~.]_<ZﭐREB4)ﻋ=%cpwKPP6m\.t]?V\PjUHOO|gyPycU۷.!|Xb^wG zN:ޓu=< A4,]`2|%;;hl.okוIEb-]>}^BO`6ԩŊm۶c7`JJ*am0-PDn FxxUL:"0|ě>=]./!]%<+`ay22t(?^Z頠 ԯ_?_[yi׮ԩ eeŊѷːRBJ{еkWAy޸^^ ˗/|Gԩ lٲ3g~ K!_լY3ڢV\ĄH)=k&O9s.kQu%ɓ@JyUTf\ŋرc۴iCay8FJgϧѬY4֮ 6n 4׺u}NDGG_61͘2u뾻/~28Nw+~ݻq-Q!Ւ[)^== ൮i]Ͻ\f ύ6l{ypF]|2'NYQ~UAu)j{@VV UӉ B4k M6 6m^}pq}4R"ߥK4k 2]6>5 y׏'KYtEաB-["((sG`0=Zt_;pkݗ$ys~ذanu>*U39߳sK%=TC Ų?ݘ:%N{/ϹTB~S0v '_-P%Rbֿ;Yj!]znݺNNֳK.RɓC8<7aDDDDDױ *U>+W;Z !Q .Ճ>mwV͚-⩰AYٌFywTVbXi)j{x܃ǎ߿"?7Pp$EQLDDDDDש ]u5(B 00лLg}&eSN$""""""<0(y`P&""""""LDDDDDD四7w DDDDDDDW ʞ!&W$(]<0(y`P&""""""LDDDDDDA2e""""""" DDDDDDD<0(y0x738]׽ QZu Gu>rpxwUXF*WB (v Y_ OH@ Et] @݈8t\ru0@: wWp8`6L&K d%R 33sDeХD""""""P&""""""1(y(כyUtN͉]v#vO,%_W\iN'NfC&Mѧw |K$b{6r.Nǟ.Ջ]JHLobE0TpEH)hbo^jމ _^l6fws>ř"ɫ1~>8/Ax(Ba#Gz<U?lƇ>*RJ²G]t!*~u4,B dFZݧ!CaxP(p&lĜɟ⇝{JWD`l);8wc<|nG+s`ذ?v'u{/B"erl g.vBd1PŒͿ&Z>6]v̚A݄7ޅg΄M;u6uMa#X|>~&{t*7/74T텈؅X7Zh<>7= 3hi bށ+gá4!7cm䩅7$bÚo6h>t/|c OXlig&ݩK1i"l9!o{oxmfo޽{#Y3n@=OjzwUhzJ8If ٭t,ݕZ>x) NZ͇c@ՖOan V3;Ĉk1y1 {cڌopXS]@-mhx| >x4"sGǎ9a4(e=\ ԈvX̝0MVYlؤbҽz7甀v  /Va%g  qkl~ `BwRa#f߀fMt4~^uz,ϧOgcUX}tIۄ-}ݟ GDaq<Ĵ;çL ·GamL=!FgcwQOtwx|9d0߬Y=`]3 v9K>ىh?jV,{Sp\%Gaeq'a o+l(<3nkg}% ǡkd83$Y +MÐ'[坓.fӦMîݻgL^zbxwUxjD;txB?%F>~Zw%`thC둸l-9Rj8c|qޞ߼U3[~ǡw0EPi3T3B ʅn{7 ayiU G6hjjDF);%cѦxVf5P+gm;q@pk̉ŶU˪0V j|vd5VķCۃancՏQu9ahD7DZѢ{gD>FΣ͓O :>{oXH:&XCjnuJ60pf]oBIvhq`۪_!;#A0Ѥhxx6 %!z?g/5@Ʃ&E #( UU Ԫe+THpD'fMb²+$77o^vDDzMx⫿`~b-Vݞmj,5;KCJhy 40VFLHN<>,,m+ J - 7ջPbF`z캤E1xUhn&Jɓu*kTrO޽z_ðHtz]| 3yw޸GP̫PT(znETK9p]>jjC*ΥUni۰;1mƭ@{EdYawx4B>۱{JJ<nKGFtCZLŹDݯS Cu&Φ#"BPPf闌_$WT9=KQ@ 'Y8aq-KCfY *Je}bP31r,xLފ{lh@/,00$u7#~\ RlہOw̼u[sa_`2`xR2`s)@jjpy(UA2;'O~es(?0l϶v#E\IT2c-P'& Ъҭ5h)KQVo?.` Rť`elҵxrT߳={w&su|5G~/*"~2nǠGG%s-1S,Ž >Yf+?sHցZއgu+,r(bގAZaZڎu;#>5N- gcOFoX;R#>5_,m%PNl[I-nGSڠnsnĂ_Ѥeu1c;]煓82l GDsZBqH]F-xnobq0STf9vsCcw_elZ/yCPs' 6 iOűI`Bp*6g5 WcM*??Yqk;zOPtcBhDZ⣱5VDt%|Br̻1V^|ګ,}X>y b'"C3!F#{rw:>cmoZ! {V RhVn}K[ΥF)EZܵhSIp yM$X2~d9392ޣ0{};dJ+1mn% Xhܺ lÿL"s3 c<†6`$]/')0 $R׫Dy@l^7Eo$wytHUhzV,,4|C^ t[ IDAT=|;iAćuyqdj?{%Mۇ|˿LXh [Э⢋hp}Ïe[B_x#~n.~7 S,W#Bt%I+dNf~9,8'<51}~dPiE5Siw{h-_ViOSҗw=W?@O`ʭ/kaczqy[\(WpRJRRSXfuEQEQEQ˦kh4`4+HNMNVEQEQEQ. bȟ *ET($EQEQEQ2@BЭk7>ZjbzkVEQEQEQ>ՙ5&zp^eEQEQVZϾRQ !+NEZ}wdF vO(Jyf1LɊ(UKffރj+f (+% 𷒒BZ1U@8l6[)(WYdd +##}Q_ T(J=v-[6cټ+ul6@ttȟ(5deev1)ʍ@Gddރ((+% BAf@&N{\ OEQk+(0Hp.b*գeEDB ((RTp(E (((( EQEQEQŃz dI̛7lח={q_0u EQEQEQMe`يeL2L:vd)DFDҽ[7^(((U2ɗMJքtqUVۼeEQEQ*u(yfWf @xxwv%y=NREQE!]}EQ. HMMtYWΝ߉&*;ʪPEQEQZSr >fdeez$V?+ 6b(((\*P.#VwUEQEQEQ(!*((\TKR: ▢((UTY+J1nd` rgBͧuk_E'u.jԮ[~RQE*rCGRQC+wy'+אnԯx{NTRᾫ,@vlNVvKߙXqfA5chMk 0 U勆TQ(_Ty(Rjjk-vajU+7+C .R!0w T!8((( P7Pæ8RTΟKjj*N݉ʜys ((( ıc<=vxܝVEQEQEQ. @&MMV/EQEQEQ(rO{yd~]tUˬ(((r μʀqރ.i*HVEQEQEFT\F dEQEQEQ:DeiץVyn G g_G=+Km̄ǓpROSwK[Ν#$$;8ww~enI0iaDkI|]ɧ5wRzt Ѧؿx4kO֥KDv%dvVN;Уuu|ڔHdU9KS@t\FOmTDs|կB;IП^|:O`.m>յp6mFÎ4/Ъng$#i.s&样Gp[yb %bl֟[BؕN;id,]*W͞l׏1_8}SU=ɯbVIbnґ+ȸ=\qX5Λw#O a1qķn@{䋡szό!ּpSe>&+[ֲ+9?!UѨEuQ&:þa5vA~yqzNYjنesI cW׃fs[ɹ9̞hNh=܋tbwxP.ۛFh@4gv%⤔̝?]eMֈ4K2wg$t?€>< F_ʅ9iXg}c0 <]=ixw2A"vkm**{'eG^BhVukܘ'ޙ^OnD8Y9gfVJޕ10uI:5l0/q˿i@62q3(|uA?%c\vS@f2&߾ߞ(;-7R Gf{ ST8#G6t-~JnVdH)5?yAzΠ=M\N`~ KstJ pys0}[7ddkBg$ebO# wiPb[/̉Gfz`4#5ʗz|\I:'gQ" M)hߌ 7i͘UpulK=ѽ"xU,)ù<gv*y3a:?~F7cTr6l=H1B[幜JZͦ}dHmiִlJ 2caYOmt5('tmә!Z=<ʀȿ|vJVLJ`[Ɏ#vku}$-cփVqn hb}RiI =Zq*q9$ǧ ;tn N=iu`ڍ^kb>v^1^eB .GaƄdJ(;G:Wr o$-:8&ȣl 挻pJw筗'`#ENLoƺ6ˌN]]he^˺hW7S0VNhRͯDBH!aKkuuXN5q,ԎoeZ'ja#)ٳv-Mέ)8};Ҹñsٺ8yhб #,84 ,3s1/Dw|.$V, MЦitR.g۾t4lׁ:)ط=?Ӓbyn+Kmڥ/ч9%}TWrhR$A':_ԋqIِ ވͪa4ן#/lG&bՃ]k/ع;ބ vPW%{26$&]S;4T@sh%m!^{ZZe%lM9[<2q`_ &ټ"3RG]i֣gmJH#Y:SJ: NJlǷnXؔkRbh_ M`gLfԩ4 knA>4 sjB\` D AmETd26n;Tnw3RIXNa I*Y41!-:!Ϯ`{߲\u:="}41s<a)kѐ*E˼c/cviZ<;[F.G~8ۑ- ִG0[ Ò\8J}l޲5)%c^y%]I4+dB 4~},XeӋ l qG=)y b謽JHDPOmZ7E] <|qU7I̝pnh:9bj4WVɤ;z߮<.W f9eGٽ<19L5')i*ߛJ%:0Qs-`d` d˴Q,hDjpnXƏD쳷y d%S;I:<"yh6C_'u &>YWn"uָ4 yKa DWhJA'sI Uk _Wd1`ϳvOVEr|d,i@D},Htbؽ5,ԫq3/KȗL9֙,6(?9?$f*S Fp8?ס_`J7}[o4c6:ȳĜ[0dngqd]HZf1L{š0v]$W^]]yKێv CF `æZYN-c'>9qK2eY| Ҋ-/!ӈQspwQt5`H\ǩ%'XXQ3J;й6Wrx.xiyӆG80a282;cplW_abrgٷ~=#ݲHӆ]`u?2vfl~3#x~Lj=M9|1uʶ}܍K|>m #'8'~Et;1fN2fޤ2w?z/QE=V|3 KHsAJN<7z#'|FR71w>x"Vm)u;Fgܫ*~f,{3v.m^)?LbEvJtp&~gӭ#%)Zv)6Ƭ}_ \Pν?o_=kEU>wSG1F춻9)9|ȇo)y2l.5>~1kZ<穿nGQV$'v^;#W_wቡج5>5Oi٫-F3ύ^>{TeLW"/u-Ns3yk@-έ KKτeG F\҈ ?_L᫟5Ls+@f|?cz/0Qs;= ڵv3޼0fC=}/~\ f?oE+HS*HN]rMA>w.ww?UWza`@qr;i~GOqmq!)4'm3wfs`jՊt]#A OZrk h~A]&Z яj jcNb݉ iڣ3Z;s|F: XNno_rE-kKt  p-7 UvVWaon|OsB}}\Uw"U}6ff8ɚmyXF`uP6o4b݇.M8mg_Nm̀ 0g۬hqRv,?=kUi8m kؼÆyHClvYM9'(2iZՎt d֤1̳g|D Ms/4 `@w]8_ڝkԘ.]bErYv'niNo2[t c~ 4ld膅,[t HG9]# ڄaKALkފ.^6-MۡGҠE,Ssv+*o@4׵Lĝ^#,sSu)ny.<-ҵ"}1Cם5dksvn']ɻ[ ͵>34W^E羍Hi\<ٳ7kFIٝVc4S[k.qI~l- 'M`Ɋ]ڽycrFSHJqgH;3 @dng݌})Wݾ{;vc[Z;ݮ ~+!5R5ȳdI Oǖ_tN%d!oƌq3H)V IDATc'u4ZNH3BD&dd+kw|{;h Fv`2c:| c'ɇ`aCkx:NaGG\ ]8|ZquK7;/FU_oL9KF@Yh~-DP]:xW! [~v3kMgurf!.¶ɭ94HMxAO=_f.l]1p}ԪYQGqXjQGy6Z T:iJ؏!7hjŌĖ-'~W/!*t}yvǴg l"w ||]hB 4 մ«> _"$֢u RꖼtAՊ]Պ{^naYK;ESg!R@b2 t{<~Gu>}Q1!Di&R@Aoy6dA\$DZ,3a:q9@箞ܺZ #G8|pvaYX2akAfAx~}`W#!&WdY{ lѐt|2C&h% 瞰`R䑗'O{ __a_~]{f懟_~e'Ee{d|c([N3!!`?;Wo<=B`PA jKA떭hߌ[-8Ww75MRH%4nBxL&S]gҌ8}Z">Єh̬bSQ߳LTFșzRKK%X(W:2TG_GcAhX`0AڰtWE2 |w<;pLٌ$9R9Ԉ ,$i_tshA{-ohFQ<.Ju# q/4yكpנRA}ڵ +ggġ4Q!ǺD+dRRȀHB9_*pQUL[Q:Չ#6M0_϶3pK+j`Wgη1a2AcyE#g1 8v(:h8z',<*Yҏ*X{AVpxϢ7 @iGХkG\9 o CGty:?#_?{#wr/n/J(Bru*$w&[BA`KFXtB0Mw^haqygJM 튼[;&pL- O&zA[~C)\רY,R˯ߢCO(iDGa cP^]O}`g'a'< HlOډ3^\T("+khyST@?RR9{=C%ڒɪw2Nv_lu/ " a)45L'u1tSK"4|!MH= GN=k [#xU0rϏSRYRhLɋ %?Xx $d2ѪeKZl z2 Td?3ịIXHZ^qO?C0M_:Gd߉Tqbͼ]P} ,FJY=e:܅t'>-~e<5=LTIv +hתCHdøo~3Xώ^׉K%mW_%>,A_s:u?/ְfOgb XWѵWv>:k=n.Tw]b|zPy$ g4/sq5ҟ%Lힽip#,Mdd]PקwijI|V:⣱qpi^5yMѸ5r05hO U;jֳCnwZDadpq,|BgN|o3PőGj=AۚT5 {LV\B{Yl$3lk -f_z5Ïu ,s++ΩuclojXd;n~yoЖԊ ÐDSXI'h-F#y'/#Pݹo|C>I\$Bmך,7̑ճc QX[s2{o-΂X?.:FbfWaݾz}5oѳqP~b9͛"@dsH*-`) ;g/}|4؞N>΢MWmرqǷU?39`+x"&n0a^VOkXqcj:#8N&q%/`\{_*Gfpw޷L=oDD;gf*` ?yc;iX5 f3kI." ڽ^b 1׿:wOLRArٍDAØ| 2 ΃5Lh•ws>9] _yf1w CP5jvDLCwΗL^<[Ҫ]MYqVnY[;btAVcχy]X[a1Kdz5G/qЄ [r16k ⾁dA:S,$_B7?7\>|?ޥ!6żpzxIcyM HIz+|2%}SlS'x}D0O}f -{A!y}EWW҃RKJ.e2R+RY(^t{#Yˊ(7ܲ9;\$g-dgdn\_sӀ}KrK[_DM"Вw=1ҴYu=`!U{ُpꌎ~p)ԣvT1bNtW'p7Z囸{MzFt!ɣ'h({n4O4!Gٶp))CjQ=r:UrIAtDJg]'ž>>Ux%!I)^SEQn$7=[@,H2NJkjGs$YE}+N3.%E*N\Ff0 ͊lWgZW݃"Ɋݙ|wI.>#9|G~ȇ&acbbSOKh#f&g14A#u, $glJfIYʕe;>jml˦w Ћޥ#RĮzaE^;*kjBGzE:Pғf˜MO@WP|?M39ai(Y=$?Ʒ `HV+Q 6]nεXS6:9+u5Az66L@fy 6\#H6#R[&'j{}0i<&0? IDATqs-ϿsbE6KǕ*t.ϙ4mN̻{ R1ſ{SF  REZ޹ّU((+{3} r3%Bygu֍AHnu<ć/:7l^hcB@dj:ti@l& .qA<˝\ʦP+=to`6qWzy<5жZ+SX4 8q()^\V3Tm"mVkn ƟDU獖$a#:Jl,/ >Hdql46bBkGʥeoO틥g~4hB|:G|Cҽ9FR,\ff7^N?cc\ݬ-e<7+R z‹3Wijn7iRաWwmBpp$F eӡ\=Z& yɞ[J`JC{ YQO4 <#ZAwk&* KGΪUICr*57H0,^ӽ?CcLkLv$W]Ѯy7:8GP e\9!G`kl lJonwr_@+(wIHx/&ܕl7?m&uճj;h|8]fj6#!$܏56H`ޝkKǫ--ؚRhv M|{3UMLKb7/, !Y5+S5|N'0ƘJ'ܾy^U5v㐒sY[LvH M8kXu .wdfXG3@JO]ѳ[=t*PVJ)T(c0xDC}n9y5CMx3=$Trl2P: C5{VnO7tgVF>0ZVVe2lInPPH+m,EIDJ픛,46੕ ]QQgzEQ˨ą7]ptY"icFФA ݼ2 zV6vZ y ӸkZ .#=<è% \@;ëfbHKpO|#/B]4Xsʍ=LE[[юgqw|͗)F@dcbK v^  DN/'JT 6 +9 c,t3 MaG6XraY vo M(ơƂ!9V2j 8.qb['9,1-ZI9LG͒d/tp3@>.~EQIܩ oBɬ/t/A0IKb6 ̚nUk9<K+"Yg!14\:U|t{ْ%r1C'z nfr.0G~OKo\L_h+Ms"Ky^NJg6wgIJTX&*98#LϏ).u<ȊLgCnT";q~o[ hQ͂#) w}eO} ~UK$+FgI'WĜaHwz΁EP]Mg\ &&[)ԟ:ب%l-f8vdfx$.!XUvok|l*|ʓ_hF("dc&_e\td9ef!"@zYf]Tb8.DX4^RsY,jmHx q t6!1=d0µ(\>E-ʲajU.=o CX-LEDDq)4m,w6~UkU$G$9&}u5^6ӣ7G% (liGco&ҳ?J_ej%D DY3]ý9"l8+=ğ)m|.L |j4oeC&ߤ,/@߸b߬5d+:7 V'slae|Z]L媢ߟč-v^7ftE+8kv0'̺O<˳L 5"h*7x.mO@p "dp0S"_r/2Œs:YhfYo# &"4(EQ˫dϖP|ӕtZQ6ƵifHhlNM?z|;OS/b=L>f6,@3PL@+ 4ATZ2Cn !@XSκ`cXyR8@ D.I33dYoq{Xsʃmpڭӡk:U,TsxIBV"[`/-VMgG%q y3~%d9lqg A*~XyNͭ`7ٺoYBh46S⫼FX+M=3Jgh?5{sIR01PC(NMiq`\Yo ˦9L;'~6c"F7jw" 0*Ο6]LO%]*3W]Ĩ)t$!I2G6~!HمEQ.VP)I +uV.VF!,i!Iqd6ubHF.tFK$<gA3cچ-uKeg0<ؒKh\ _ \yngOJi=<^^xWI@y-4ay+$! @07 E~ʊ(lj(Qt+i(V<+|z?+8']VEQJʊ\~e W0eZQr=_*0%*Hܴ^̈́-0: Wٟļ2HUl+i3vdӦ+D\Q0f*Hಙ Z5S+SA%_ST RQER(o xtK PwI7`~7 @J )vT\)VIOxmeF@my^e9, ]c>Os=ad 4aA"BS=_Λl\SEQ~(+$?$HSxM^r%gn4Tq};^&Mk^"6gm~Nf0WN̊}yToە&&iUef❒F#I{diVErrN$碇׬.a-8G2GP5 1dʵnFC-}'ɷDP7)!YǷ˚#8Xע]Ɣm0;XρuZ|Y;-؞´c وlڕMʡR-7=t6DSIcjp'mfNI6Ѥ?șAPՆ5A u>L#$: PX礒Dž+(W(իتce(W zB4MGMWnHpǒӫ6r600M^E-i=?L/RT(CM,[Iz8\CԎ,=| ջtj˗c_ZF\Tp;TŮkՒks!3Dl6TD-Ęu\#:+cJɠEvoۄ~Nir)En0dBut]CM߽Iwwgzˮ+umTEsh0B4/'/ _vD&b۷5 GRv77!;~.):CAu~ /밪(O{.R~RE@p,Y+V-;r8|0]cW%qE[BJzϰci2BIͶ7ЩkGFX">c> Vdb?[ ALa HظUKу6Ά9'w\O60gʱ4~+G3pPy FaXismRعz RGY4FT7Z0hĵ۰A0ԣӿ1fɲe\sS WT'ՙM~Cx}#u+Nlٰ%]{8 f`jXs1Ạ(sG)'N{)))";;[Ɗb蹹afnvi2PJ:g9eWhmty!Yp!ƍСC]|EA`khw˝*?HBEӤbwdd^d^ڴnuψ(ʟMJɦ[td^%zS4栢^\(\u8@!D"0\i6]íip\Hȑ#200PFFFƍˉ' T!W^ᦛnxޢ̽|=cǎ EQEQEQrQ]o+rق?)S`2GQEQEQrS-c&Lpقd,=nWQEQEQEQMK/rNAԫW]>uN:ƍ^T, !xT˲(((e"HMM%>>\ /OA2?wQn >P%{f[ T+#l^p)VOw%:wAQr(r%d-x减nR*=bDYOTAKų'w܏<\YEQ*:۷Wy̘19ea Q9HWq6;h5x4O iAxi/eäD_Ӈn,ur1 ґu6IW?ݟCAaC;cmMnl_co)8fbScS*Nui @VVVIDEEB IDATng* lF66<'3>8O7:1ʕgEVxxz$)f,gkH:/v;F6m vͫ#Af`47ϢhH/˒ /v&I[ozac|Bϟ5䗏ȗgӘZ~&6ZidШQ& Y(r3q虬_ų7ߌxli-iKׯg㚥#t5y瘛dq&{^`ֲ{:?z] XK4$dT.bk+ $u熖~L{l$>HwXmճx[3qbB.9vC槥+XOp[ HYVRy,YO|X#~4|ǒiR'N}vA~Ne\4'b0yO$%vEQPvzꕝaL: EPsn?+`D*99WEI'溇xT 0cNn`:}IXq)7قH5%&N#N[Lآ[ҳUOvѱ-p6^\Ѽqr|VDt/<ѕsNgYZ*>ÿ&Um(o4Wmy{jlNx%Fv<{ŰǕݚ(r,ATm֟y.IӘﺞE~=zn6 ^]~/c>_E^w(˱q&A7{~um瑅L5{tk4+!5pwyv>bĻg 7~5n 7#<.lCg0a zt}n兄JhݟtgNe?qj5ˏ! 5kNƃ Gu 3(ԍ,N,XW_؈ENEWm\b[<XFᯅqӱ:ْm"8}4$`u"lT^bF"9^u0ҨHDswXL9VaM9M 2T7/аaò`Y 4_ tgp aεW?BC+pqd7'#jRӿyaflU2%i-j$gOQhb&cL{q2Rv-;\Ҵ-i=US>/ylЍ0DsBK-8;+:|;7%_xI޲g?_}<ŋplVE-.=pl(1Yx%ˉuoQ<<=O_I^cdӀ p/IU˻qi2Co$'J~/P0^ǼՑ[^6!XrUp];Ӄ~Jv.`a׮,6 ǒתEDb]˱çK>2c7;OՠiC2qjfl"wOmWzWW  &&x,ZAѵ{?GJzqP[!I֩}#%X<?lE]6?8pZ6߽Ʒ.>SA@!Ck;yeSuݗZf]dv&,S0!deZAuM476_ut]@j߭-F/BEQʧ'7g;ij-7z_^M iօV9yqiQZpMN+[ê͹5QX~BB:r-? skVf.!fT *ܠ@ODo1m%-_ l2 j`Wa+ӱZ8^IƯ ۗ>`pm8ظ`9Ҹ\.<~UeE!j8>͊Q;y?!Vp? =vHGoiXj .&X~G`Ҟf²e |&<ߎ'p-;Ү}{̆N;i7~I~ъ%|a+<5i aSr"-GcbJ& YdT4ߛEFrW yӒIsbژa n;,(CLl!!XtR3C4WjDGIMu\o5B0͠C67=Æ1l(Y@A1#+h-KxA%}TC 9Op DTE%p>fcN` + 6;~4Ə囀1|l6Ob}Q2\p[dj歭B>'| O-ó @g%ߙ_=lv݉,|q?ț(QQ㮏Ybkœ7ȷx">?3{l6l1cZjY0 O?C^ErA+9Jc޲O_Yz5=E3 7}v7<(+^USsQ-c' ^ 9]TK􅪠uN7ӫ1>W;LjJJ'X2;w*6ECEՂAi|/˻(r+X^мM#LZIF S,Dۋ-z4xcdtG_|ɗ_|˜vU%iA!9ΑV\{En{_vܺ-ut@hh㬌2 88RrfZŷXyl'?^#j8^ z8~$5j%kpDAmѷPiR98m9V0HYmѫJDq<.Q:Z8+Wlq^/?cALM U ́iw 4I–K{(E*UTvwuwqwq='O,; gΜIz/vM-\d[gٰւ~G^?HgXWG^.]Uo?~tf,t Ylq_UG^87y<^ bשl\`88a"iP/"yDҾ󶓔ƛαu_}CKQ3=jfIvvEQ #/~屯05av{/v纖~eWQtfFFUuj [Ki.@-|7c;9s-Q-=$+Ӟ{Oub=-j-*]oFF,?Y0nV#c'ov"GN쟰Bd-1y/iлf;^Ǒ|l?Auq$`phWEu I؇veZ1r:sѶFynDd&[?~gW7QT&ML_[擴K榴g+;8S33A^Ӗ||Hfpg;7IU.+_UVrRH+d̞=og}5^8Jб֤uxZEcx2ßwžAZ7wa3Op;:-!G>z;DoN'gŒ|xw.~4iNOz{ɵ^~ ZrKCy?3x vyu ;x}.~\V2dzTTT2,;8C7|YKg^=x|Ήrkn{Yz $\<͠ŋaG]8s^yuI9@F[EC/dԫ_C2}t Cy71/+xù?LL )ƀax/slp^R0aFs׽1-2dvOǪ=KKBJ;XjINa 0sI4]Je-KƏ'/?!~6cc0`QQegWEQ /g?pBlBjj*lْ}2h 7n̬Y.P.ӵ a9fΚEΝEDDDж];.N/.8B.dzc9ˑ}U[g@k4o#'vx~.~2LWHlb칝bZ|9+Wd@4jMH`ŔvZZpZunC-kxDL﹑={pmԢVfO:>yj(z[xGvg\KnlxvNt{f1 N~3'{,f;m}#c71 ̴V[M҆3HVpn֎~&3b :N69m'iCA!5;]HN6BQՑC!I[U0{u&ʝy[.\q+1]7;Ea[plDYM*wC}.cG7Ѣ5N'lq| adձtgP+vX#x34 oޅISO_|}?aOC|x{<<7a~mÊ(WS}ya0|pfΜYvRaL>f̘Z+UN^Gn!>=a0eʔ@`-[:iu)zp}> }FoѧL/NO?aaR&4i`Dzt%"e:邈Vm1u ;sptV%ƭ݋ö-\Cb#5ZhTdD4…5*EcO?G' qQ岓WlMFXh~ࠢF:^ ԳG{x:eX\tMSu-V]׉04FC믌>yǃ<QZ5k%K(*FVɓ'7HĔLLL vd̚5I&n؊;5>}pM7j*tؑ[}vtk2h zɨQۊVwlNrO n9YVrnzh!dᇑ| h[*x[VbMf:7fǶX7aD7 $!~PǤH9KJѩCw|U;f2؄ljZׯUj[]mZ[kEqoą"ʆBBBf{3|i1)$3xCA; Wpm:v HL!1f*w=*_ů[,_Kl[ qEqlr;wFfJ)?|֮]KiYYdB:RMQʕ+{;Ɇa;w2qNgǍΝ;я~ԩXkͽg}vT]2l<peqsM7'P[[Kmm-+?o[̹"Λc[ռf'凛*ono`4p&S*ݼ{f3%D0:ʧP9n# {L.gĄBh Tl]?ンJ&k \ęwKh\O3`tr<-cTzJ!˻uۂ}XW#zުF\o-O<1^i*)g4ԫӈM IDATHWw;W([ i5N(,Mz6.+:1s+3wUwG*=&sUj|5Mb|_LO̞gʖU߃9 drA?pEO{OyDɵǝR9s搘o &#-뮽hfu{UW3o\"YGNΞ1??k֮匱c#OXW 6-x|dF~ BB!Nu `U\\*++U}}*((P0 ˲111v piI/jXv-ӦL>-~4^|Euj)x<7|/S|| s+H\r%,Z0Z#pwx_ /l?fQQQSOq嗟u5rdzRK.J@4q{1~=G&PYYɶmZ3p@nLenkȩ-ZX Mh hBm]:f(BVK2"B -ҍZ ՞mGn)nYvVjL+r۫U1z {BjW"iS҄мвZrjH,YUtgH+ܼs)jRe5mjjs\ nk׮]:..Nn]XX,XC(.>lCon{C)M7ģ>ƍӵa-B)ldffўvԔ3U^{qsÈ'2,B&=,2]R Cu?R]e4riy꼯OW^d!"ku on)꥗^^p;3*^-8= !B[(2jkk#1cF*ZkNijkk)++_~aB!B!N ?u: NgFNYlYB!BqI|>@tttdRFݻ%PB!BDcJG9sfdQ4iR[B!B|>($Nq\s5u]$$$ְa"B!B (.z7:ʦi2|***x:t(, lN<K/,B!@sꪫ:|{#Dk=:(W^)B!BqI9 2nS r-ޕnV-ZP7pB!BqH9(?>aZk{1&NSO=ESSSX>@ss3< 'N{dN]B!BXt|I̙CKKK{eYsͰaD)Eyy97n˲:]lx'ʒd!B!8$P>f̘go k 444駟,R?O}$ q;,yMFUW_i|!B!H@) 73͓ Yo_ӧO=Ǐgݺu5P_.~Vy-\U~BSN7a֭YB!iO^GJ) ŋy7xYlYԩS[ lG` !`Ŋr-ٽW^}ɓ'+w|dѢE̘1;w[okys`F-Ou"0sy q``ŒRی\7/4(nGLe7p/# qhY~=>eƝʼy2x0%%%6Y3˲pr>cVUaY(((]!BWN#B)l̙3 /o{nJJJZC^^{.sՑ-ė-˜ѣOʨQ‚{[o4Myٳg3-ЛU9 (i$(E{cԳ7s;^ S4UXƿ7e߸ԎOsG>dywR.]ʥ\BС(WRB {KRXXxLrm]a۞W_ecQ_v|>֮]}A"B|$PF\\\dUUUd⠔4M233k:J#V#UUUE&o_w/0 p]wq|+_կ7͎h ;xvG.:~Emb2qlv~sp{0p/~+TmMobuyӮ/ZS\b$7̿n̛ӷ~cq70w/8jkkyk(:=}@hyٰq#۶o7sizٹkin7.#G+_Rj?O֞V]]G̷-p:L:ں:/YwQ!8Qn5{?CvR 0¦ hy衇,+,0 F&ėQꩅ w3 ? /ַv48?v?ECŋy/#4`Y, f{ R^}H <VBv,K{e o=?߼::?ѳx/Eok-7NHT`Xm[ ou=[o=B%7{9z17˦rY|t#jy౗?!{52=a9FpşǑeϟR Pi-=1IP 5h=a\3Ɍoc5z?ZKx8 TfRbg̜(Lt`|L#Y|el*NA oV0ᶫTx(~s!y=+/( a21WZmswC+.rOpua&^pQ/ huyS^3O&V6^|c꺹i@lNUniu7wÅ^zL0AXOjt>z%'\dig2lKߒ= P_f02N;D2|WksX[!rʏ2 tc9[ԄWwQ q¤$'3qp!6l㡹ؘJKKsr8))I'…lݶ Oss3~!}1b$z!d#0M{1c;wFrRs}1w\ h777/voAVvvdLzy} -8҇3犋p;s|cOy [73oɀQSsФL3+~ x/"̯&TK9ﮇ+#KoW'NH _RNF;~؃Ƌ(mc0ڟqoArܝD?[ _N)żyHJJ_ 3=믻f}6 -ⳕ+(:";d*++ls7I~~~"B!JNa,XUeeWp8fccaY=&&@a.u:W^}96k֮eڔ]VdOuZk^/o>eeeG:uL$++ӧ3{lNiy -Q#G,䢔8dYVZ~?c3z|DZ|9r {ON=ӧOuu0B5Z{*XL:45Y[v~6L#KW["VB)# sne`_ h hUmo=`(zVE@4V@6K)Pe[#Ǎ# !@ZkVZM^ߜ%6uu Z?c!# !8v^顗~7w0|.zmڵKiۭ  "k}Ң[J)N']t^xqv4"&O̚5k\*E|~am 0TDn=C),uQF3*.Ui[QFIa)Oe;nB!8H|$XԣKB!qsjP%B!B|$PB!B!BH,B!B@Y!B!!B!BBe!B!"B!B!D B!B( !B!!$P͡y7=n,?K,«!Iq᝼VxI!B!đ"||Uɹ{?%yZWkfL}wB!B|N@w:s݋Ycz^B/y}>Ca،T(q՗IrP'|EB!B!"r+ʴp8p Խz^dz6_}3 LܠSynu ί*?gV̫O>Ȇ@ɿkr ?~'S ,Eʻ~R0\![555gmXF)q\B!B(wI)PV]mmy7g򷿽:mo?WK{烙fﺛoN&!g??+ch~}SϏ|ߧ2mwfLi_.Ueזfż;̛;KsâbdФ.h)Y{8q]pL4u[?`Y@?#KKx<֯g4l!$1sp%W0<Ɂ>1?iD Ne/QVczsů'es.O?xo=" `We|z6ŐN=;K/5ZkVT@GfTM[qIT|2YC=rE׳탥pqǾZapS&t^/{Wɚ 4LDҲ <0_CD'q?G,SYYP Wl,tR} x}>֮YKn^.B!}.[+8 00H4T0fb[UTzV򇯞˃ZOjV^w 1->ʴaX?WB8gL6ơKDfu&33sf\SCʐLHOc>6m<28 j/Ot^h%uRrOf3P;06x"ͪhiy4m=эnjLϸ)wx+)x-e"mHFKx}’=n>ƆHrZWZJO: ͔mZx,Y9<EM-GM‘E. WJ \F$j6h>)bz,̘dɐ.wQ?\?%R5\?;vr΃NcИ1O:lظ~Tt2yG18- ePtˠq^5S)9!nM%kdA5]abY#{bTq8tARRei)..F)¡ChHII!++3䠊m6223ҵuj%33sN ;4VSYc4aOOĞ=U7iqfJ\3igN$;CE,9YId4fR~/ajٶ#p^Ӯ93W3v8Q&T_Eޤɜh+C֭tT9b620!P3?c)v}1meư̆ݬZרivS{%tXu@h"Vlnaij`wh})[ U>e}uFO>V>4O`18ZJY:U3g0&&@Նts)ٓj)eݧ0Ml ,_&[ٵ' g͸(ڭd=QfwJT!':Oõ$Ƿɡ `AZBjRSS=zazC.0MrsslO!|>Vaժ߿}%%ZkZ[+IsQJv9\]/ !8Hc'qG\rݘ"~ΟBi*`8 5!]くfa'p:B Ҵ˔\]aN3z~Dk~ euem-GWCTIJao l8` `"X@E-}y?V(ExVmz9DKa~}ϋC}p(;QA\Q-3xRmJ %ŵdrƠa[|Xf_`Kc㯈BtژXx[Z0L㱈JyMMx}`YxNpt v,Z܂Ul_Z ?e#P y"xG3)@nc9cJJJ;uzPSSCIi)@*22>G+!8@ 0;@(KFuʌ%rat*\_[0|y==+ė1!Tt )1(?7C) I2FA~<-~h=4:te03ȲN+j =`Ue/Hbwn˪"?)(;NǢD]7f }|VVE~dEQ9'蔂f<Z4H} uD2qFx=@HcO (( UC_k/{ Ep?Z9N">>>"75)ɑY]Ts; X}MblnRT*T &T(7 M,_o@as%Q0r Gq=LMh&op~W#pϰ]>p& dG rQԔdw[b!ޤga8bI0Q̺ Kyc‘tEP;\ʴ8KڊnO/db&6|͞*:>#'0$)xpB;XeK{L*QTElA(Tt_F駸3M2|\"ccEPDu|v}'̵a <mFχi3d 'vB+E!E('O:Pn&TR(7,֌;czu*jDsWEzP[1-k8hYj5y}sl6MJ :^Y^s!8>fVͳӝw$0oyJTeYn{|a\.znڵkn[ t"H9uuB](RmI)Aݥnct—GU~. ڡrBu.3LwttYf#|ޡ~^!BzNvO/!B!&-Bq$ ϙEˣB!8I,C.B!t']B!B( !B!!$PB!B!BH,B!B@Y!B!!B!BBe!B!"B!B!D B!B( !B!!l Bq:ijj֭[,+2;Rrr"B!$PB>ʫf+Ͳ,^|\ox#JYD/y}’=nΞMRZ~FrILHB!NK=*W{Ʀ&>xJ#g õh{]&kк- pşkVZQRE [lnÏ*Ș STGҍ4P#.F+غa{ >?Çݰ埵b]T¦4jxĞ5Fv $IOX'{p02p*6*R}NoMiԚ8sSDp#'Si#[JS83n`hb)0Q}7SޭHfmkl!ne%I.{?݃) qT^cJdISթ]t⥬hٻg/ձܾ\.nJߜv݇93hР, uٱcgdBEx@Yrba?)zf1k,'@>}wa(zM:pf eT2l(#DN m4p=Lt~7'm&:v|LNnd'X`Ƹ>DV6csmbDU;sFa*#rL|Xr"i42Zj){Rh]V?nfl)cf0:ӤzgNIuhn6!C97#cQr-[t8 o.*Ld8̖[5n}&ӇŇ-?!ljwFV |. XDtG'f#1uJ)rrkh #=;ǃ2x0W'9Xq!+1UdĒHDr&yBcǡC'ujO#m:VJ[MfYq8šo֧*~SaAQd-[~LMZ|R&J{j/.~2)q e}dhEv`2րXCJ;3ɊBQSR"W7W hmT0C5 m&[6y|i&e^2F "elĶ3@P'RNffKM0JWlǮ@dA۪H7"7*-̙HnC)'g~" |͎ &7'OZklٲ^eYoBdfӧOpOmEu2uj;z>-c!Gokni䒾nA'D!avl"X[4 uL Ѵ`E\l=4+fyO(h[5)ݳ~SfXRl9נZU-?VKxtL9ttr$}UGt꼼iD%Gw&*nZEl6@ 2R8[abȐuzmYa0d`\.;`C~"hwjP e`MP* 2=a[ISBMť6ֈprH,N9Jy&_;5*NgIiZkX>&E  79tvL\9mxxz3̝7g)+J)uОr6mo"#7-ۨJޖ'~>;9qiASh #tmts x;~,-[ Mn ]E)&PvN[=,{JiX"DNc ,i{xtp*--@ SO6X>uuu$|uRJ''"ܧĽ$'6 41M >61 Z^, ߫m+/Bq@Yj#).4~;h| (έ>䠁xyDU5 buh_@#W`[Q )]Ùc6*CClrġTK'!:>Y6>ݺA:5fT\lkzmraۗLwx/%-{u wVwP;XO.pD+t:IOKc呐֚gTib7MqSN/Q{^ 9gR!8I$PBΜx&ٲu+VY0hP;\ ,:)jcR+EaDdhP1d-/O^;c)&@,gÿeo§ħc>Du(b $|.ށ={ 3Ge&J\ƎMj=NX="C|o=ťٌω`6|j͕D $DH:aEY4Τ2؈R-} #2ְwJzfT1vfg\z6| ʎ+/IERag}xldf]T$/?޿G&wE TUj4L![`*..V^JpeYsQaqZ뤗_yڬYiS&vg[ZZؼy3ׯ*>Lmm-ZkILL$%%BFСCqF;;'Sɲ1j= c^{kOeUǝqT#+xz3̙;g}`9%*Z[j ߈s6;ZUxwm(+U}XFEwLpMaG຺X;R~HǸnfw9w; qZkVZMjJtBмs)jRe5mjjs\ nk׮]:..Nn]XX,XЩJ"-ݨW^?"٩B*p0e.R͛GZZZؼ'|!L*Q*8_ 'M:r bJuyms52p^{5^/ݵTu%tfy}]n6.~ +ر=Wx3f pP>u]Z09؞o!Bޑ@… ?>%%%^=i [ZZx饗xW1NT}a\s5|${^d8Tlc]B!81$P&$Ef7Zkpj+޽x, !B!1@/K4ƌСCINN&)) 555TWWi&֬YCEEE䢽rʷ,ӌ顮 #)mih+p@@ТXT00L} /T8RWiB!zG)CFF& $2Q3|p.r.2{n^xy6l9[U~Ot%++,q CSזeۃeϞ}% !6qQ;nG"P7]!)+?@|\\d #2ˎ;n7O?4'OA<40`wy'?Yb_8p@|'ܰ秓 2{u<饻edwG97LԌ4d[䜍9``}G\Xb[r^0fL09k6 cg$MvǩHIl;ԩSv׷Nuu (P@#/Iy晜uYJFygMJ$^?[ӭ (P@ (=X(2-O"e)x(P@ (P4S Pe׶lForJB,Xq sX^@ (P@fEA pUa=ct?@Jgg7á>E+i/zPo*RLxN)8G SOiO*P@fEA ׸}#۩JJ_?ʼE$2J'fsqg_dr=t{߲ur!W3SpWn/^!'؞T@ GO (P@ \`nSֵTZbS;)O'JeJN(r>ċ~>Vޮ*[lcql]dtObM}{R󒗱ԗB[} A (P@LD~o7]nN:ˎLNO3@uNyJJ%G$|_>^dx |So1+W?g׹?2:P: 8x[ [/' V@ (P_ - /e]wP%HT˔%*4RMM122̎;ؾ}ۇغm+kڞ] r"4ʦ{ٹcs,{mpɴn?ߠ{m (P@ (";ԦptWuO+U9Vǫ09 ޱ1jӓĦdcm_'dqFƧ0",]nvchh'I珷mb9` *(P@$Om@ ۪&u/w_d߭}M@m{ȃ:1-uT=?('o^KfTu܇: * y1#v"|/6@j&k>'%MD} Qq3b_SA}`j6;ng~Q;W$(Ί H03.QmJf5 mQVctY2X` X Hd)VVN|v@XX&N#kV<"P\#7 )+U::;vT R)(.^AE_Zfmj ^mC#tTpy ,IGF{dCPMm@ (B>v=`F:`n 䓢|~^QԇFQ9%{y>CE-GV @Ll|3&cWf{5GT7=ЂRMm|sDR)d**aϓpAri֡]jeix4jj2k#qfFF*'7%H"f ̊=f5JjSst?H)"16TQ#bP#""Q-A@|B;Mi+'> 0SI@w$ŗ Ji.X5-RD ́dF߼dHi=?(rIRf9G߉(~q.y8Mzڋ=l々s(uvSq] .h)!ә89`_So_.`زe ys8IӔE|+_7W@ <oءrx=*9ԬL3XTYBْ<LhҢ2ي0WT)I$E53D`|#אN h_&$dJv0>1˷)\Ǩ>2Q%zIUAT(JrBMIPnEWG g?LgiZ™ 4 zBE`VOvR *~B: zR>iHdvZgz ⼚e R4ةJu_͛M;&pl!iߴ@A (.w~d#5*%6>*\)ԣ 0w*J,=Ξ6n? )4*8 >škn+=wI1Ro7rL4V^W~'?\`Lf =>w75q{=yt?Ǽ O9yw/ >u+uU]sgs_ϙKQ=?u!gmZY6ӟZF_?>L'066ƺ9ڋ@U[:\{/l޺7t>pUWif^|ᅹ  hV 4#$ HM%M"&g{yL(h.MUR,*j$Mzl$1UlaۨkT !i 9r%ʼnMUiq֮$ͨs-|B% EljJkH8-OH,|&eք]0Q3*0-'_, ՛cisCO-%8"`Ϣ:̸IԺ'5ۗo32mK}F$Yr-æC$qM_l_+fР KHRf +ԇP )>miJKJش%,},Rj.Q_MSYJm|g.qNQSOgp螻xx=G=Q=!MSn/׽FWg U| beg皛Y#+lsQoX'rw&G}Sc?/&^}{ygӷ_S g;_8^-[nnM6'Q SSS3`%]Dj\qyt(04PoT"#S!j >& @)ф0W ȖHqvV(+m`>!4#e,vD$81ˌYL jz2Z6~f: T[[ l[휰y{kov|ʦ] Wn%8Z9ϑ˅#C_7fYiwxzQL/huhKoEAL<1)z uA&XmC{`Dv%2$WTl8k "8Y}a7D=(r g@ I=)@}r+qIBG!KT:'kM[8j\Ԡ> $Ǩ_3Ț9Hf!~[U?A,9xŊ0O|Ƴ?{8z#>%'_i~|\ m~K ;soz8[`vޏ6046Mucy;3{'^++#O.qJ֌:*WfU8$!q] <#t|x΢)U>ɯsݺQ{y݋OfA"c~ŧ]͛'?W|m.ବ(Uc>Y'*9s*V6kM6,R*WιzlWA\$ ronΩG p>*t \QE*&G&YGL.Uw]x?2{_.~z2v&w _iw<:=]fwY |M| O[>YTg~9:pc^|?)^Lϼm_+<}uⲗpH> 'ˇ>[jϻ-z^Q$ɿGR>yAA/#ݼҁ ru:2'@}|{?>^qSC_Oۏ-pOxǞ"|[{g?Swo˾݉Ip'.㇫{G~<3ouï劷Y?l۶ _Y'x"[6of||>`7xUo?˖/PUzO:y aPP_LĞcKXܐӁd;j7$TNl'@JXS4 HPӢ9UϬ@h+k*" ,#*@B2;!˶UFC 8+dm15<J? vC@K@lV$=ꡪ|W)?#Y)4pv3sE@cRB]%Q ̇6}d.ずx$Eȥ[Z,e = -|wpM g(!PY~;gjbttzccLMfCJ{^ɫJxo_uw}66cxzƇ㶍58?wuqW~oW\ڵk s? Xq)K颚.*9>w5G>)TsiR1Ș K!Lq>qT}ܳ9_rf{Uʾk\cye~_?@ K?jJOy<ĻQ:gw %:;>\<<-݃_%߿0λtW:>dX#;bG-lܒs01>0.l!+WR GxK./|nq%}=-rz*G?q^}_ɓEkfE! 1ɧ73d<ߘ΀uϊ&e[cfD2"oo ^3ŵ̾DN~&5wWjPWa?rAQ.ߣc*:$Վ sz:(F0 84^f Մ[֍p̊aVLؾm2]ܻuiǟrŻyi~OӤ-rK__{6=Cza7;w{ZKzX~xGM>85~jLS|^o-__w pt:j eSÏcp-Wq LblP&~B/bA)гx]e [" v9cfW@IUC"Hdlj0aoRg&O,2eiXS9aM$[V]D@8ZՈ~w07!Br7aX becCj2d @e#A)A5El5[Z,Rk6Z񹨺YcQuqa k6.e[JR)S΁8:0Lߣ$(ã kCÅmpN"EƓg5w׬^DovS3ό4_4 [XD2h=<5ѼāWm~˚з {t˝=L=Ej5Bo#8Խi4MIc^grj.3^RT鮌pAРVk{xܴ?w"\/P*cVEq’Oq%V1۵6o.u\]5_}'O͵Llxv 1or) dPMQS\fk>{RT6uB|v@65?VyNff]{)ކ9}9(E,\y,Õ{ND;H*soMkƫ26U'Մg^rN=e,> Vp"ǟ(>d.ǝuo8裸޹]U9JK,aɒ%$ _8F-Kqxmhe(ӟU7 6ġ[c.Tع;eYYMWJ=**WwUQg>+y>Ip(hK3qq5{ӫ3xE',N>Lxm~f{8ͩO:|߶mk4EYZaS67HVK>x>O3^Ç^> t!9L3Yd.T;R+?sa'|27r o;8x޹綫#]CWjO=|#i*P O=W9j%FiS|υfTZ)U춭`lڈM fӯt;XE"mC@rȓJfp"YNDL !,Ehsxwp1f$iOP-.Rq5\Q.R24j ݻeՒlbh*F7 TДBy@%4Nq/,x4ca!k{uX*vl#59[a] < zqhfe (zO⚯Rm 4RmۂD05Z޶(G| -u`C/^<+ZȼA§\rr-c+Wʎ;\RIǝU9׭:;W|;"~ <3y .fK'}.q#Q`@;n'g8vT޽d$KwPOȗ=fN:z&tl &Fホ_Qʁ'2O=N0_ D&vvN@~< =n}'MӖO` z{=زe 'x"r ـ_^=˖-7j+o:hx*M62uԓ--"g 4CXK,M+N[в A!:PTi"iV;m"vDە4U\x`$%LXI[eEN*w|rJn-qε|b:HÌ۷M=n[~2v#6476!,N.|RV6 Fbil/o3m4'C\Qհ3yqn5) "6Кt MUmvF*|OR5d sգPbI'=». %WN#;`,Xs|vLVM[ؔ!_gQ?|" +ZGjut1ˁԁj/xH7uc1bzɒcU;W} ,ڱ3r4ye!{I; "88W9T+1Ck/v<<"KDFT\MLLԝsn_ 5khoo.X@:(KڼRDdLMM1<$"ĘnRFۃEwc= `s"cGn $OP/D[L@,?s]{d4e톚#ĢIJPBS4o >c}̳yc5ƧEy⾔yG eA%& jlzH6zU[W0iFby| 0ff;fdTB9qk[+fɈuS"#/_,oVh8Cu2;DShP {ڵky3/K:}fC`||7T*<l)eN55AY2]tvW&\my#5z8('Zp,#i/>''p6Nݬs|u.hA'BAPA됖ASH*mz.R7FA (P/>m:='$DP[d3!Fh=Eh@ wXG@U^ (1{tͼ=Y.lmQoK@cyK$%7jl@ E5GR j^4 S s @Utnb˶fxfzH+}n_AUN߀i-s<>V,HO"ئF*ꃭB (E5-?N1um&iƘ!VPIA=iljRl]1RhHV8EODm;TC (* P#>t(p7vd7MS~ey<p.'S\*sz;.S8::KTjQn0.BwDKqTH…2Ei`4٨39[;|+ݕ*Hs.PA;)!)<M7F7(P@x_'EwvDDC?tH;7iHS.C[ "#ZiĢU-V ,b=P1mV6CK⻧ A&D&FB}j V*@ zTdS;YvlJчJ,<1SS$,E}GǪZ/FzRDSF2S\gDVi:n ߦ9h4@ ,yB5mVSh-پ[eD̀< /3 4})ؓ=_IϞSշdWD%+%gSDpՒRPuNHgURUx$ cY.2%qt(Vi9<\HU܍tҚ&P"h}'~x=&W@ aSS+\>[)lc 9r`e+M_IELlHB M4 ȶ5 kʄdv"͕͞PX\#Mq MQ[- ֌ tXHV )WiꙜQ:NUkPPJLl8=09)ШCd]j4vA%%3(p Nd37}2T9(Y p+X%fO<&Yh ;b .wձ>= $Ur ςDAIJ{Gkz5"v[ (xKBODd )90Z$\"4Tl- D}ii6.R=OaUZQDnjmL (PO F :Jn{CE$q P"DiV(J[Lr!䦅uOu=hFvFr҉͛ lO>lkD> -%^ixO26 I'9mD́LCd v9QMY*_tr: DX/Tj J%IeHJ ˶- J pLԣN,lMPE$!+rKqPbq|&'t 1(+1j D-+N8@GG俛B19@:b<,{G '駟I'ի`ܹ޽!n6~sfS}i#wNmxFt:g)g IvVde$2#PU9T/KeԤ6PSutz]_up%.4 0tM#_@ @n۞)52"6U;Xz"?4/]++3QrDBѐv"QG 2^Aε@>NeןeDHۛ,ɣA +BLOd+;y KmV1'J )YJ:րI!r܀tN+x1ec.@\wms=F=\niRrYb1)4lAr͍Y5=˵@'ZwsDXl֭kOf\tEwyva{#Yjv/}KQU./|gex0/[=i F\v ?V%=חu"P)9##@)vyRHP&\?# z: v|.aNt:.|(P@ PU_yWt4PLʦVևYn71#l=G"mi_qPD@rdb$M %$pf!c$>Wև >b{H=)SijS,儁in9_>UZWMDkÞE5"PO;q el2R6{D.1O$ ̈ yXŦE 眂UDSu:Ƕj+"`ͷYvy-Q q ʎ bzbڎ^nKPl5g5dȺ{@6[i<-4hߐyg>J~nfzjJRFd'"#I?pַr7}=.2{>`?Ž։ovr@mʧ_E#e:Y>ZsY0~k1bz6}[,_ I~`Ӷ`+ *J^hdS4{{ ښKB3(4hhi4RuOܳw$$Lne`rv6?ay>zmPTJhxFJH\vHTsiv~0%64wLm1q ٴX^ö\(ig9q8bave+_6dB&Gh`߆MlY~2'~BA;X_w_C" va_. =|+f 0ݹo Y[}uA\bE|ftN[U@=wkFABhMm2~hQ9\QVTJJ w3Tc>ᴏJ >W8$KStq V/st,\7TWw`?bVOɴ3&'<@ᯊ>-G-Ώg!  R+-?;Pz37=!@zE)E  )E. &**TEEAPAz @HHϽ&Q'ٻ3g93;<3Yy x(vͰf+OHP3.`Y7u埯懘SfڒT1f:Zw֡_}OWHh#iTsRX8%=2"LMAozۋ)M]mWCUoF4򫮞& Vnu;b/QD%D,H^o;2H$`ar>X Cd bb HοĦa3/҅`̫la>PFThiЎ޾:iחucMH7-hЀB-JD*T @R ?bo)T!wVUշ I D8KRj@wrDW Vb(`Lb4pS IDAT.Dj }n,s_QΤj[ˢ;;HwDb1CjLzLT44z*F0סt#cB ua[=B IkJ/U~^gbw/UlAZ$IF4 eO%J(Q!MmVSoh2@(08#X1F⣴4'7D@lE!#(yV"}4"Ul N'"N`JqW#FL `S-=IJ0{n Č ZX,LQ[2E)h@D$)J֖}0$J>gGX.@IwsKm-M4e=W$ $61U/ʅX0d,OYAAVN5\/)ŋ;ڙ܊:hV|~-dK[EMk`qZ~6͎ƤEN,_-e2BJD±h%Q.X__s:c_1ws7SE #I>z VBgG;;жf*IK,8묳w}h:gW}%J(C@DH5.&@J&{}.ѻ0N0X@7x(f@Z# m)` lO|p|YsT@TrymRƓ eu@s!+# D} $AT+455Vr!IT+47ט3zz菟tmJZ5Fkkʹ6DSSrBR*!׍{мNV6 {zkaѵ2&,XʀF Mێ>\.i"}!ʋb3 }TC?1YU;MM䒀(Xla adg+M ha.f̞Ǭ.{{X/r"&j"NjUlζV:iUxȕX26>Iy C(,HM\zu%Zuv?ov]nC|sۯ.{܄Z'K[/0!A~&lkw/ DK֘A4vlI>7_p2X @܈χž[!~òbԨC MqN;ghC%\R[i֘$`#wJJ P5`IX ?R[V([YbDIK,h$;*D㨣 .Հ$I8#hD,esWLjO}3)L AIYO[J:57\xޡ\|@_-r%@A 7H,Mmi|4yB σ_ɉb#.gѠ 0GD'BsP#قF0ek{If**nPn"y9[\o^`Ѻ(Ri ڄ?;J5V!̝;>OOI>dg'*jZ47Win嶖&*45hU*gN"v]lty?{AbzૐGx v`^ UO& !QULF7x!βB@SV+hFl zQ혊I^TUM>@7n(r% dw%{,_BD:_~:?q.9`/=˥g>0 4G~ywRcS^FQ^Ny ?JYCۻ1G_>|A2Uw %K.{v<3'0|׿Gt5?e>|n&ͬ3t8rؿo^v\][.8ݗ~TD. E օHҁ2@{E1EB5@B賊$[ 1LE YYȘEͬ!?Y-l$1B"T WBkKc~O=uuP{.IjM jBsSjhnj5kjU#!IosGҟ;䳒rNy 4<}2)g}33ߚӯ{oxBʣʡ_ +^9םR<N|pهױ%e~mJ(; UaP)exG <-HFȎB%TUkY*"٧R[Q'OW`O(#".gRQCd7("DRž$ d# 0k˂H f( DDՄZJsS?}}uz{4k@Wj5;ɵZZJBVZZPq"ndkfeeE'. Jm1)jǦ߆ݽ8\gRbcK2ivO B۩5FB+:#v5 FWbj&n#.}YOI! v*qm5. ol(Qb~F7sO| [1~HCaض#af*Nz'HGq3|`>;cZ 5wߑ՞e^.0ck M˱ՇWf/3+QqRH LKAk$9Km\@P$SmM)Ap "T=WdlEkA$ /wاbyx} F e# DӲը@ZTJOnoo! aΈa С- lښimm٧_j*>\ @ו!c$vmRfO%~qQ^L^F^ਸ^ܦ-5x6m/&,]-b($؆NV1\J|&Ƴ` 7E%J,.~ b$,b~aEFtc~DYj)G#DHBJGՔ~z&ۡtW[RI8 ;IsH_s+J/[2dVD˱ł4H)Rdhhr"WykVl46ƉoAt!m5ԹHFr<\GUq:z})&xE ٽ7M+YCAf^qnSAR1[3!Ӣ CBH*iJ*ugUwBP)vDlu|(Q]BX&FsMjoJ.+@hMPP{gh$bUA$-(4Bfˮ9F= =O+~s7*`rRߤ0[W,.m.c`[D%3X{KK‹.zeU-oͫi?i/=/w [êq1W뙼Ѷ|hx$=3%J(aǩiu8Cla )_"B7yA A%da ӖƖ>JDS/ ܓP҄} B[Zp["hR,q§+ xbL#5zb d#Ö w ! PB@4 *HH# 4) >7 v=*[VTjM5j4JLkk3mTimi'j *jjŶJN։UǶ +;_Q`;uQ]gZZ D:("z Me{a[$k;H䋛5UAzx=QxW &B1dBjkȈ9/GK(ģR޳TjGQ4]W}/\oUh"~&,<{|v&s7ݓӾ-As՗v嫯̣i-`f ٌ]6>aڤ͞K?>`s jp]e>{ ]r.}v{^J\e t٬# 5zCNۙ \tFs?gF![#3/ t~+|K?>vֆVs1P| jVM 3+Y^Dlx<# !j`\  oy"q4B YȱkYHBix48Hc&hy}3Z,I%}B*#P:6 Bl uM,- >xoXk( 0XH,skW!T@ a>4o/{īۀN8A}Q:u̙3G&L SN Z-7o^HӴZ!6UPa hEJqauYd(ɒ-ͦV[qzN?^x7-]Ӿ9z{{p 裏;,0sYSRmH[~0@#|2_p&Mඑ<[sӷq͡k4r*x 6"45_L> jө ⾫B%?PU8*Xθ8%:{~;>dBs:EEbe@\7N55RͣDH R hd^EHl$\< .ox; ۍ~ i#᪙C$X2B+eM4[*^n 1`l*>)XR4vu"Z& E Z2j|c1B`S%+3 ؂Ïq^~2p16Izɴe0E/h nLՑۅ5FD:lyTI=10bO'DdIt0ZvuuQ{N;::tԨQk 'ИEw `_o/. J9%Jx[eIdMxuʔd BX{jA)K[=.ZBn 7髄%K(Qb1 i$L-q IFS' qs"FbL[YMKOg*vcAL\%S,Dxxԩr2W-d(Sd)f3#}f觝q80nҎ=чHcV3P'݆[4-!#ą̾U4W{3o>dS UKV5$:7; 192yɶ>q Ί(C6y:P<"=hT?⅒(7 e#ႋx)]6z*!o\$ F< y)RB!cQ+d0- vY䣯yn ץP'mWOq}T +\[& V.<\]NsV>B,Hu9PƓf]=vجF vu sUӯPR JQsw!g}q=:*v[fXA̩]_ʬˉ'~_G}rҲ}y8ī3W:{~Sބ Sfǜݟqh86ƌL$N~^aŭ>vܵ\(맜z5l!,9_]ܻfPo]؍K%v#X/ CԚ /74+{#[b#^/<#i(X?4?f"YA.YL\SԍىC%wC*NJAXm3W2L XL"!x:m,]o+c5k2jmaJZ''$j-eDJHϽύcoE{,FG>& -s۶]<2kW! ->}>l8'.u^Ɂ+5{:Fѿ+?mQz7~ǵ\ƅ{ߟWro;C KN^=Qe+Pz>=8u8 W|/?}F.Sؖ< N90-D (2}Q㛀j$DE,$g< e2X \Bm(brCz~\Ҵ1[BLЛ&`x;ztʡ3S3jdqFH*|`#lNN*mAi j+lf|jyuZXԪ~׭ܷnc^ `k{ͤuej0~c+ndr-<{o:cXt^fv?져vZ}m͏cO{O[n4џ:Y?+K==՗WOZ}#Sxw ͑wpyKbvz?K.ec㬽VELrK&4~Y^wk_Ng2Orq+ ^[ϥ5t}x|=LJD%JX8WqP .lu $D7 `QІoWdU4םoƙ$b*ɽzFE:R̅:&Ʋ2Ord("QD[a> 6@b(;}d QcR\xm9j{v`/7`-6`_. {sOd! 1{:߸!fUWGΫ0kw3O h}/NG4οڄހo3n?\ oA+ O^qge*?ú0r.9~fp)*Ks㪴eXȂ)QD%Ь,b$ٴd#4`xmb0d?d+Uch?Q1A G_5rr!:rREqm8Y bY'Df^<"EdY~_ 6=Kob+籠LTYը0,$V!TJ:K1~?ؕv\ȖH5ͮK{uы"˷FbūF\ȷ)_yqzxi r^&јp9ǩu?ęGO0|/Z +e)#vfI>m*K[bX!iZM>Mv&Gs #=v]~E}63椨 ew6Z7ޒO 6` ma2˲ oɽO[IKp-^ؑQn [yU7/>Qa?=Wb t; t/[Ny&Џ.7.Ǟ~[ !z,q2clTW 콽۝iyy<:! %?AXaH]k$X|N.{Gaңұlr'0\JP"ԨU#~s|v>wrZ[˧nMţ<|)*4"$JTn{yn]]i"I{"Yq,V,OjK?si|9M}Uw˼z$VY 1~,Zi$hZ,oK^=>6$ˋ= FLH5RL7k@o|G6;w1I'NE <%ǜAILP;Nj\g*w˰8*>xXt8 (VQ, 45ّ4t# i~HѷX/W=B*8 E4c{kR19XOV3XIcŢ܌!A\cn 6Tm<*d6L!E!CY;*5{KNUPrAI3$D.]yW~?̬+mӎړ;i9;o:EM&:>Iqr§>EGG 7څm7B='=9NIe6d{|8spt2nO@܍'q-1'hXy ;),H~F O=:Koo)]Kvٵl˹䚛÷sp鹟b\>zBV\X5_#Ԛk->$%Ж *N;o<UHˈ֚_qտͪYjY%J},+ G_ge%3 ' l c8FĦ]oj/SLܸM(W=kZ@V~52ģ2 fh@Irԛyؠ$EH3oE ~txؕ`+(WƱ W!;|: s)Nl̮H€d=>py P> < dñɗǯ~͓B!{ngB-loSw^©^w+ۅoo'F*\^|a*"Y/QG=l+oQn~?0iׄ AYn(QƲC4g@b i U!đ-AsOUtU Dzs~ '"" Nm4WAN =23 ިT}+,Cp<4@`ʼ&@Q/(s,5CiDGqټ>&L~[DJ6-1"(="by,k|B!I|j"_WNHB@BB#Γ$ J] .DﻍrDy v=#'ͤ7q'jNK, ='`z% $vX2K*R`-XFL8pREegRvnahUa@ħ~}(j(jbP(B[ZQE]J!F 1}T|d{+Pu[H:binM+#*bfc0ȲicvИ.UʜUXy>s%vچ\dDy @2nGN*$H&]bpH ɵ+4/Ak,D6ƌ B'κw㡿2siV|Vy7>`ڗb-?>~F& K7OȔyKᄖU9X4zMY[]TyWʋ̍>g:2Q<Ѓr̛=' {I<#IutK(QĒƧcPלphH( j؛[34)n9{x#I)0XZ 52XHǣ㻪E-'B4 F#P[28轘B)6KB:CDfS@Ef"TH>Ū nY[JDe UFǮ4CeS;׹d¾m؎#؆Ë:Dl ]Wފ/؂\&{gsUv>\v<2O,o58<|{HV>"Vb¡r}拧l/)rܾ>dh>s4zއ~t T%J(QbI B@52-# c&A䈐#X 8yp my-B״F1bI^<'ŸBh6Uטr vѬ,P@6=#f`V8u1NЛR Ӝdf.Xɡ' bT4XEoJZ8R@r|EL(xQ$1Q'1^)JJcH%mbRh5aqP"\ S"j-+|OQ,%%ǻ5r0D"YtH`"o1" RXzAHH`$I<͒';]srʥ?Rf퍜cs J\D:ҿQ;8}6(W/C؃~,vK."aS(iG))` ~R K=:xPyGE FNHEb!6Oӕ܌ Yp{T %hޒ$C {Ҩ5ܢ-0Z`n)n "9,HRY«&`]1΁xM+SMS$T^{A~%vTV'$u6D[)O|X:M[xCXZ!x>+:GKay'⇒((QbGnw'JC'EDcCمrĞr3tĨLfHz#9_h+~HcA?N(#ۗ?B?zFv]FߟSpJccJ{)={m?? O=Fw<[7ae>bʿ_dUVmqSCr+Ǝ9`ᄢA[y0^F06  [)Hg !غ\10}1Xa .QF(X`oËhÃ7.f!fcgUb);>TĂ>50^9 f]\臂B*`k@⍒((Q⽃ >kl W{*isO>ƭ^ŧ>8np(]s:w>ޘ)s^zWuw~G0[[Bx_]Sp׶ޛq|kmb)C8祳~"zO^ϨSysfg2˱sΚ !c3QVUOQc +:ov.!, SD6:i _P3>J@_9iVA1(CkG̮QNlŮڿlw\s?H-ߞIG< RIfa ߞij ;F]ˍ Z IDAT\NEB  N왎v2WaӣhYY_%sDSE"-Q+J\D,[Z8W[ˍgcseSl: #VܔRȌ>;|<>2z n1fiKmY>},"$wwEfwR]fsvM29s朙dL4o? ZOEݮ3#3dH1߽^mQڱ߰K-9VO0F8lgG\4O񌾱c1$8''g8Yw aRo$XhF v5G_^PPZm>y^u?|9ݼV$լ?;. S0@tLޙ0_~Op-ݚE7&rDsa]C^{8uLeHN{8lL-e4)gݛ`;?}p'O秢{ ӱNsj *f~Kރ8iwYk71-8xXz+Qv >FZfχKfN./iF#j9Mi~eCw#==6c_VEutᕘ*#݁% W2o$0ST D 1vا(AM[IIRXޫ`-SDz/66W*k|ʘX8`G㪄n^o[4 aVʈ%v;VW ?G4jn$Nu{[b'od% /ʹ(2-ߤ`?TwqX\π a0V\\c?-x\ߖnWWo؉͌)E4u񆗋jJqGoaB>w ,ztӊ`?T,ccS>a<7Ou]Vp-/mqέㆇyŔ Pa0v 3eV [&sÄ[Y'D0g^,c'MbX< X=Σrh׾+O}SZ 䋻y-t w. ߛݡ}Ie X8)sY"/^@>h[:;wS\wNCŔvX}i[s|2VNV^kxuxE!nj˜Ӹ{qҎ_-r5Cm}M﹙F_Œ\̇y0K"}xϾ^^Ԗ yɬɺcΜwO~a s$Q"%qIҬJi06E|; V VYL—kY;m^VՃ Ucig"md?la*QgCXs\& p Dϭ}ABn+kÚN>ook# Pa7Q5?Ԭ#80A ("' j~m둖JBt)oiH8 Oܚ\wlMnj=h١))9uB!]RM=OgL,䥄fԝs%һE)F.؁Zj nwiMJR:PS8ci|!4cY[ Q=M؀]Q~-ŻoۋIK/OUnmԄ$}>&s E xy_feKmodhP{Qb8Vo]D `%Q%^k 1[Mg(W&4<ol <|M`I,l,$^Z %YBmQhxϒXI [c%MZӯ䬉mP<g6^zjojxbn%a=6kLc#[^{TgME3#A߰gîGGqpۤiަ_ALZ&PM Ui͍ow#սDz+)#iV,`\_b'xc[٠wK|몼{CFb AIa*g@3 Dpjh=bubM YFW{b;dx?qGq+0a|׌z`bK;lKӼXr7nIbufc;5ȪE趁o|>Z>Zӝ$(p?dt/L:Y>n.?@ Uy}X$Kj ͩIF J25q=*H Y`-d[вM9o, 6W5"^Z<6]Nga{.ҭ Y~b.7MlD_)j@a N{ڸbWb Z_j3إ+/ވqG_;V|O5S|fº7֪C2a{xoaݲvohuBIY}!B@uL% 6m$xV6 46L4 DZv\;X!:Fy:XO k8~om)#͠^^J?_(9j~̉8mPtر:9c-!i@ `^^ߛ蕉[@`^[t.;wLt`G%Q+/QEОSMG$V`E c?+D]i'\(uձk\^UMZAD/q<_tظ珨-MWӶ1t{#=!y_pID1` ИwP5)BdK+rϳk)Imʾg帚U;^q888aSx+>1gք}CmԄ9:+'o 9w#ykCz^А@fp窛){hRhֵ-[ϧi-%Lӣ.r$E:5 !hˆ rŊD2aKFӷNq8Rr۫3.|~wi|m4.~0[қGthA\CCpqWQ"|Nm Cj8ԇxx}C1nb. <9hF<ЂCƎo}RBvnMvO{GEY)I)iڷ+5ԣYێ|FnGTUSBaN.Dqװ^^>LqqP轹# U~c{-1 ǠzXYNM5 Kbr2=!CXt1Y<>>d+88NFmg6FF1N@>WJUҏ#804?ndpÇg]ANk[k鮫8:۵>OAk^~+3 ^^+ iQcKkFl*{c;h>1{qt3M~}s0&dr3XL#j';T[={Q#=%<-W_baߞ6vk4%6)T"6+Ƨ6IؒOXn16ѵO/-ܵ]ATڃ# hG.]t+#ç%Za<9צڼ_kjkz6=+6=m2>C#؅:{z$>┳9|ؙkܴJ#8C!"q^{M' ᡉiQ o]̐O;YP}E^H>Pnm7>6cƨ ~ ׼ύ݅3/'yc:7pӉ-)xk2`V2o˻lń[bDR5p1nf,ݏ۟3΀#֭k5$?B!8Z*"xcbb, l|bl>hjHƳ"?t]M/ BKXi^@(LM=`K/W$vƊWkzcK:i{~^BE-B_Q!%j m+JKZkZxwph8n/XWF ًEjk .~>[lTƠj2 $-#b6xrq1ֆC^=g$H8Bxu۟GNy59 ʢn3Hy*F [f;2n(gֳPらL5o̲{ޠ8d,L/BB{|$ֹgdēqBfu))9`l+SB0 ! !=01~_0k}wT:!J/:؋xkYҜN*GUq2a}hدFd9@l6M$ Yªr*=3v$\% :7![bQC_\":7vH2P v ޽EJ*}VNJ28㯁_>8C{)٧н~)I~#4#RY1wI=/?sRHIN!I*!rK^[}%7 N^>GS$R3wp 2;- ]tpT Q`LȒf{1Ưk/n${!A/* lTL- 6ccHU$ـ$x~TMO׵=YS7h{+ab+I0ZݞgW])[7k %~' TPSA1HV,c-VXP 9{lk h3nY䅬lW]KEm s'q_M*(TRq@$Nn]XtOx7qӼvrdNh;[7%T@;JY4i /:Gs͉m~y"lSfu\*VcȊ%1JJ+Uƍ  "l3Ӯ^Fqy4t:$[rkW-7e g;3[=b@Ӱ/?oZcDDF~:|sx~=Az\,f%FXRN`K*V!A ><׵4Ayy4 gQٝ83Syg3j0QsAGW58JRyMx/S H5\P4slȰ#TγvUG ߏ$wx>8!zLpu3%`:kiOC(Gi,w|# Tz#&k9UlZt>Vn@9nNQ8۩cIA!^;Nu/ksĝu͜A" 嵐 i򪪓h&3MwJNhCc6^2 ~W=r WA{QUVU;n=x;ɢIѴ TçshEƑWnW}EnQDG?!D`v%Rwo<=ޗ'{4JX>MDk.ޖ˸Ι\UĶR]suhfۉSh=[?䥅(MZs-ѿf,D]'+nM7D~alfo>BN\q݁B)\w|8hІUmG<]c⇗3o]9)MZrUsށQd,"?,;f1sU!vvu'^GExc VӞ+GHߜ5d{$I4? Rbپǯ+(qO-;a:~Z4看zr؞aD"̸ ^j}(=}ty@d=w1rL#+!YKF^ИO}ʋ ŔgISޣa\١pBnYkp4҉d:T{-?2-4:+/LL!$NQi_`^107jh88hJ ?ýE=?s']pzȧ{32 B} 099-xڱ k7fHᕡ$;=(nX?`uuHMaL(XwL:/KegsI{9^Lxh,O(s5IOL"\O;+R qSb15|Kðy64]jvr`1] R W1Jk&hyHF&_7?ڋЏ9:fY5+ΛMc0%:^9OvieyYνr:M'ľU*MNnO;k\czqSZa]ӗ.I&O 왏# 58s{Z@2贫yhƏ=޻/rypez7 ]*Y7uvЅ/7\čxSnGqc7qvxkІht+I ͱ U"B=> iBn8PXVF,FϦ]=KG `"`F}JL25&XvqHrX =sH 'MňLh~]D4)M3 CF5,WfS&QE-rC f5HsjDVa6ǬȓZP7LR.MO[&/I'E"ڤ#'ͰV0ݎBR|r7oYδ +^!NVzJ`EdՄ2KT=MlFS(nO~OJ Izx#?o.?_ƒ&17i)}3a16M\` 0[g.bf M1vn5W3ev܊xbz؉Y` j[sXmpDw}i퀓H#0|Ee C /9Dr x'a nKt9߹sBTB@nاb?mo;IQVXʔoMNc&) |ޙRDcuvrlt&+\@H-]rENV #Q O|3of{9,{` "dB.^F it|^7/(fc'Gayw?ŏ8;kUàSaQכ؊%i{ 7MCt Cl2a XpMe&d vVi[{rf  {4AϜMयXs'kH dz<^#=&tNEޡCy6s6< ܙEalhr،M `³K1TNPoө!uvL^y~J)Pbb'쬰@ 9R 7ʦsy%,UFط4j0Z6"8!ݑs#n6og(njkuK)V&{86rkx#>-cll൬Dٸeq ~hCr$ZDV"M* n WMFQn*7#٤M*~AI ''֏rIO"ӱB! C-$#|i2w焳qjGoB-|[U@ER:swߝ)\#^ۍF2S~wtڷ-b;#_CƠq|v,ZLc{]Iy|yGcEI՝7aVS|Ĕ8v%4%lk[mnbGm€I!'c;\L2#rr)[ ̤jD~8&!GL#wޢ'pTDŘ{\us^}d%ۖpe4&K0mYWbJA6IF0m+{8+c \8"H6&$ -(D¥tLB̤rH!ʴ^C-JdM͟3 Q3'#εE# c]V2Mu BR\զl6M1d礐Ԯ=kO-GU]`"dpgpm0bD;$V<JGq4FuajH[8 F4 7U j}NzuHWVN ܧr$!t_y7ulHѫ"`98807&Vm+EJ>g܈M ޽ ^e< gLg PёG=ʛ`/sw<+wgiLF>kΫW7bg?i-!G+mf2hT K+&`~>Ni/62q^Ɣ}nk$ 8Qn|o-'ъA+UY .Wݼc5 pfsW<*(/+',lhQlV5 1IdV/@ BH@B=p|mE/-`vU1Hv iO6)!Cگyg~/e咟/3Py5MqVm"8d֯M,~)-aKY:&@%=*Q58[sZce<3#(a9 H/j6瀦RѼe@=вDIA/$oV)i Lg2'?ZQ!ohb~VD9}L~Mdr /˧p] $nZ=[yA>[Ά?L0 u="(UEk fTf<3.-cfVt/wwk\mo#^~ƺEc0U)dndc &z{kGH!cUšs9Q"kYjy(/!%- g{j ӶvS:R+9i3QQާaw~uH ;$@#ZBN'og~2dMWwpK2hTO$'s'|wiW0Baav.akӅ䳶wdZiqGqPk+ *\CT DP;,up`%mܯ;v17?㞧?`أlǠa59,y7=Ris/@pAR;;}>oyup6$.JGqp{XSM[ahlSWre^z 3DxMn}#E05s 69HP?OLaC̡ɃY*BF(rټ iʬ &#eb9Į=?}'LN^Ƹh_-8ys[9wUL)a[h@30izC.r gm@3M^IBT CS3x꣬w3.;=E퍍旵W IJT#.Vuj%NzɠZk*3ké9i1w?FeԧӰiĉr2%% e۲ꐗd&ZyYl_R 0IiyN6|>Ÿ'nUK36a琂-H jpDjel*@ZzZ+88TdիKڎ5  f^|/6&qGqB+QܪC (KϽr]6hг'wa)%VUV D+!Lx7YLF}Nl)\̅W [c(L*O=7OGl_Îv JOӃ9RWCÇ1aT0p$(ɫ ޮwBp֓$.Gy1wibq;LCGP1@=~ n Ѡ_W#ZlG=vy0y*n}sCY Y=p״YD豓ُ#IȤهlCX+BL}.&#=DcM,f^3.x2AHEGTi0L1CFʊӏp88c'B,T4#0Xx9fV4 C8;O\$ee~L(PJֹU&0Ɓh4R1grrxlh& ٴhY[{aBшOڥb0r(XQUw^a )#8#Wٞ;C=`byDlSiܸ&?Ο˺@Wם>- ܥx^c=\qQp_lj û#87_7fc OXV ҭ1xb"` zEt0v*oDIŌO/1HXf@l՚'U24Oю}5M\㪵X){AE= sKUzu8vbpj? ;6: =uL h眠r*g2h6sT܋'V,yq\zް~Zm_MeűbTO݀ %$#0j8D" %`׶Zcfɒ%&??&M|'111T\\츮PQQ$;&""ojU0ÿOgҾ]]}"D+8?{&b[< xv=NBp5@uTk0VA7Zlq>~^>(z[4E"a5]:w?8c "̙;  B6q*mz q= HR"eD*ʨ(̴2uIIcH(836hϮphce^eD('#իBiEZ'"z'^b?{`EO]$($ `@D0q#< 0G9&WnU)$fIg_ wŹO舥>UUbjuJf_%Rc }E51^A2FS@M c+oIl֎rDW!dPQ~)7ݿ#R"E? .]رcbܜ-[`Ȑ!ԯ_?'=E)RgC=vrK9)}v~VQ/P@D#q@. \A ax[w@L$Owy}I)qËx"D\٠[KDobrH`F #ڬV} q}}B @V6HrT:sd@Ԯ?_JBWRUr_,$WH;g-I:\H"9N<z Syix"aVL"Eib#lƪaV cm sE+FrHX_hyY;!Q_:I b~I7:F"\-{* },P7H$BE܅v$ʱf{VQ+睑_XںVr6/Mݖl*󉭢?$AB+h˯}8_vg藕W ٜ) KL_l>7]tUu\4t5UCp#QN"z+r;<x jS~ȭ_̒SsnUQO⏍|:uЧw)~đڸ. By 3q78*$4GDj2Sl}31͉D$lGV#& NL[׫Dɹx"c2\T/_%q$Ѝ ]C+jDHVt)WVDz߾ê{eЋ+ CYc)cy_P [}&=l[-aXM8 !~:;Vvze9d A usєow'UC2=(fp-Ֆ&RR"E? lNђds֏KE Ԧ838cC2ݯ3[(k]a$9羥U4!PXs3jߍ@6.՗X~P!K1_/9RNv^={rJ+ڶi_AU;xl ifՋZO(PB6+Q[ň8Xe:]1xSogCOu /_o(8/|la$يy.^ ͩUHűXGne4Ed#+b] 7;ʴb͑!%;!1qELLJt`qG OQ ()Hu4''e%#ۏݗ2 C9Xh|KlHr)^^}U0䦛nbc_0 9~wq4Z6isW+ SᾏmDv3r߯# 3=FGasx黸һg>}&nMO?qwM=8éQ: ϏK3o5kְr*T6A}ңGVYÔSwx;j֬/{a*R ЬLOlUc;Pk;} Ҭ(6lƋLˋW{O+k6\^dNJl; (l_GcDP\lzE5$׎)>"q0юmWϛ%D FHPDqU|\H8"hNI% ,~ & Z}P ڮ+RwP>l$= FA_4o&iTj(![ ߍ)QNWuEMz|>K֩K_W!\zԫ߁Əϧ[nhт:kPV-ZlI6 .@;.jt j6awłpÜz(L_ɋG`Y9*|L3gԞ/ʏe5fShD=`p<օ'Cselϡ]Ӯ]Wwcu6[w g OZ|VKE~r`GƦ@-'ΣKr&CMNg쬅dđ#Nտofl,.;;[&z7?)f'pئuǢsxE؏ĉ&H!O=4]vߝ^7m w}g}r>Sva˕cp!s1o<1"*7~o Zժtc&MĒKS&v`XCd].8[o[2d@pcn&HE kKl>ZZ-88k$k偦i<9s) m@_.sO~ϗ5jᨃ&ZfM|KCm%҇ӻաe3-Vg6wEeUf|,*QFL ^t]_+V >YNItBBhIAGH zai1iHy_>O%eCM_ &J8igܥHWu\hwl`}..vxǹFI#U/f (!K1vCJr1oc@'d|hN5Vh柏nJ8_F7)&34 m'4g{.ˤqGfL |w?d;o*kt֍{ǏQb{,_7(+k~Mx9p ,Sʾ}kYc'rfU͋yVLz7/Gp$.>JW0 ㆇzC_{/!m⍶qӠ+`^ыqnw>'65eFJP[N;ʇIgfg y5#:̺s8}cvU;ZАv?xi/:u'G7sb`ٲe|yYҡcժUqdC[pfĉߟ͚QTO`ʕ>y2kԠa)RoV2Wr/5+-`!.m^k>Άl>n ']w:ضsF=!m!˴ 3xmO"u9gsE/^kkS|s~W '8[78=3巘:X&ՐEy\vЫZ\'TUGjJDhH42X/m,y7(ʱ.'֕#qyuOWLd;rκ|N;?og?H֮ɔ]f"mC rҕ_rο$o$蚕(KLٔ5Zˈ~U.=*!<}WxG.ۋUǘozfY 0}t:vHs:0m4 Trfz]͟bCRDy}z>[ԢZբJoA^ӧ(lԍYbԮKmYɊJkE{Й նI'yc~*/|#ǜփ-jd(*ޜW<_Bۭ?ZVGw@*8Pyvky@<܏q1P;@n̏gn")~JVBDU\~ef뭩RJNS|뭌B}7}1#/ .O?,{9󬳸+?o'pUNkIB&GED(+l~d n[IfG@ nYIS[/̦zߺ ;ta`,Nޜ dLnߙ;$;nOς5PT_Ͱ t/sV.a"圃RU24%d#Ssu <RlNɅar: 1H,G]%ca^vИ4nrE6VQ!am\~ti';N?T> S}CУG(=EuAm܄4eJ":2*Tט7u,8d, w,vϸR@FYm e۠&A@&zQ<~d.06;3dHwiK4l_*CjU+~!̛ZlGIrB.>'&I щ<>}> lhP#S']#V~|杩S9_^qj4Y'/}2rzTc:TKS&5 bl8ݷzj 1Aŕ+Fo4רE+;ZC:l0 cId!Z%h`TwGN?i(.⤇fԩ.и-e휉sxjߌjtwݲ!`ŧz|8z3aȄ 8q"~!m+l$PPPPqk 7>ʱuO}ϛIkRd&?( ٣u3Vr{vK4ʗ-eyn2Wo31޹0/SY독ؘEFڵW͘헟GYιD@lD9&xcPgJ[$ݠ* garTjh9 /nd7&QčuD^3rn'#FUeq_RgY*5u|^N R1:%j%O^Ocgi)ihNy2 yZQXfd })UwC>ؽURW'Ep*3vN$m_+b'be1۾>v9<88F⚷xN&39>G VAc#wB B䶊R#"%<95,߯*/hmW3ku_L%2Etyp<̂V j :-ZpdYܛ8DiO=_nvPX|UC4tDM̀b*X@!p3[L@ _-rK.߫3[ IDATʃv%2SibΎ//.hD^8$zMBF|s|W7kɥ睪 'FeıA? z=iqu5`ͼM ʮF.A:w)RalFK`dG9~h.ݫ;oo}̒^=it&_l#+u>C&4kֵ((.&[7WtboG'n@uĵgwA#Rswo]3MhZalvodoeeiPVףa9r{z׍CW^=yQTFmF˖-Ehٲ%A0 d*6e652I=#zܩXw>ݞju=8;75/؂~)c{d5i\; (؎\nGBK댝̼|?]ԥU}i .sQ']w^7+oAFq6+h:#/;Wl[o*I.a2AK/3=G6 SGy]9kN;ġbvmvmSY D[(/ܵ1v=ˀX7FUe|BlNrW |+\y-cM3ϜҦ%t<2Y># Eh܂ցtͧNsoY7ψ#8u+&#Q嬾.^Jɵ ZYKuZ28jٹ38}ο |  bhWUTw`CDq?㘙}G#>>}(76] +؜s瀞?N/Ms}.Pbш\`)nf@-GtJm3&IK)QNLJb͋q\2p2^~ϴC ~G;gaO@9gc6˄=k6v[סJFem_tiЗ =O/\] 3A=vtEtULSz_8&D(h?\A]pxg85{24?cWSDѓʴ̣q hQwM(\Ԕ_C2? +pX,bӡm۶m6?Z 4('m}IBD8SXu5(7#b-V9*6+2qBg\1k ^ ܉gCn|RVI:Ż} yyHPH\E^bPOnK}~K{Tt'׿!VPO+8?kJp$9F-kʯ%#'@mRZ'O&O"IE>Q`WD|!zϟeS ?)R! HZ7S+/eJN+}5dNd'N[Q Moβ,aɗ<~>7L!jĭLF*#AWw,7}M7L_ѻ#~#) [s̅1cwLvngX&E{`勍عu C#cQuQrf9<O'y2c\)^FTr@-ZLJA~Pٱ QIj&6F.njCHk,揠 c^N W:?ĢⱇOp {${sS1~h9& C`^00zh5k,\PVX![m,\0(**ʬZ*ðzeeeE@ jj}ɧ{m.хoLʎۯظ׉͆Hq hZ #YB2dC2~ab(Ah^0Žgr Ck-9f)//狯S]6O"E ;G-jL7?ROjVYի(+-tm 5P^5kRv(Z=˫jDCUs+k ydHPLb\_u#\O3 bCIu.Hu kԑJ0$VB!"pozmdubr4LF͞ާM.3$81'MIqsU+Bf{t9aP69au9jwT;9o./LuPU])L+J3J A!B (((D$`7#@Y""+0\),,,-))) FaiiiaÆܹsX6lmڴѣGVtD9RTզ J@哺SH"EXt4&BeJ)PECŽ[Ic҃qk b ۂiHJz}^%̦rDB ":ؾhb4)nz#aЍ3p(h4=7lI8+暒=d6ȁx+jA!A(+ϬYR (Iqr悊K,+&-&_Q :c8%eլ@8Ux۾QoFn4pd, -HSvܾ'>~Z͟;b#b_ uǝNq;rDKP*|w4DJSH"E)RGBHr(o]e!٬6{eDuD+7]F>5uz߈':0(NOF[3.b'^78\|9G^狳樅M J x3|3{P,8]9 312ӡG4 5vE1 NW>'Ξs:o8?L%ψ:Os;/j-`ו:=*2x[.Ub"36-bbn=RD"R c(Ѥ)RH"E)`cl~|tu!$kl_o=hb#UP@6VrNAqJTTByXV/+b3#ybp 0)BUPGMƒ(CA S bCd'bv\^s;|ZJ#!K,92au^ںd7)RH"E)qdP͂dP\=vt`#`X>0u%fH C,6MHbH"AuvEA7MSAC%ZpSD1C7;#9NqqK1bR,'6" .] A]"'@5ًzj*9q>VPr]S9ת׭#9%Ns6GPnZ5$bnK0:v.O/+d* L$e`̍:;,#,G(H"E)R<;kX"e6(xkOpϋ䧷mb.)+H GP$Id[;!i\iW35d@Sn(:Vֈ\lÝ炂[I4<;FD՞{GUuWSDLk#Ԝ݈w̠9$."+)YuUH #y:숤3vmIc/5U ̰7ԌјBYѴH?쨡#w},ff]|r"4>іóƜV@¤O7/ t;\RO_3ʌ(GPwFŇ>RH"=wH"E?.G 4$K'~k_>KeoOPF@G:f;bIvHG#֞(@"NVvl(X?U1m[#AVA Tus F#璇uv9#Yl$D B\l&ϾLI$!h6[Ùm]L%>TQ -fi. o;栉1)ħ?KU}NtZGVk Mesw@JSo`g]٥SW\\V;qC.mߙ~H.Qh׾Wϥ8y`@/ey^6QwdmخM;v!Cnay׃ϟ沓bq};f"E)RllتتMhq.-U{;(!%1UPp!!ē( xR%`D+9u*BhdP",bdLYS/TH1')HN4:ߜ7$!>(ȑ2o#X{> sQ_V-jqpG˳#'qL#(ZocN% I.+#*u ٲkPQ7M#Q < Ѱ4UB;m"%)('GᎏaLe߱ >y!\KsǬRo$8U #/o5(˧ԍF:|ЩD4*(O_ 0Enq "&oC,V$r[Q痻Cի1.6ɭ$A-3nvQ]KMAI; wN`F.j3Q AЩLotD9v}wB:,/vG|)ԋo3kgjpB puԜG#`GޢWF^Sh[G?? U%A5D#W]MT QK ABP s)rng>83*ޛ2<#/>˸JX0tDۻ~$dZISԥQ8q89$,fNGh\9gkH@)h `TTW67*SA Rܳ*E,]Or)> 2G8\u{}YK޽V%")LQֻ̮kYLzGH)G]\ٮ:w+zqN=أk~VXIJngٳG/~/,ç-q@";_d2d}/ZҸm'gqYw}8zT8kD?.eLՕ{pP/׽)@"㸮((OͪGKCiP>uYVV-׏%KI"E8f/M?dC(+KDk_=5~vV}%4w$ 1h+kDJKDg!q a9+KD(ݏ&*gy7Fz+`#F{ Qna/WcNx@%"Z|L -LWF]WN]G$xQj {^r.۷l7HZ3duFjU Q55ϙCyxAnl ώUN(K';9]!lOyh,sPHp>([9{r.|+MD*y꒐bjCʕ( u{q{gH!A@s*fm֦"*&_S\vOhMԺ5^jbT9pS脑I<@.(NV/ԥn,aR"Ε1,'abh^:LDʒ-(TK Cm*7dL,fb=GԊ$l ع, Z%Ťv#X,B OU k-|J8| s'OgK90T$tI'6R"Śxoln?/HdYҏ`Й"ށg>C'e+P|Cv{2,e/C9%קAР!0?r/}z*ۭǑ`3vasO*SZ Se;Sj~"Z$ >cΊm 5Zq10TY3*ל61tcR~=2K$TZ"aqr{؊~GNlI|/O3f1s_xira dY֮{ϼgi0T>]EMe]%,Znфe3ޒ,ZNcJXֺ嫩%PXU2ԨQjtA/ ߲VS‚x[a^} >˲YVz{_+˞sHسg4mڔnݺ^{qWSVZ,//皫{ "tޝf͚iR-xMy4ٺ@&vN:R ;; R9n}|Z/ߌL?g?M.-&O?[oe-1c8`۵j?+aPU͟_'"4jؐOIWU=}:7j47ap*;.IkC{$7 6"ՉV/9d@>3#x9ec>mW3!vO,(x[Ɠ [pW&PTrM{#б&Ͽ Rt$ɥձRxsS׃h_KԦ{F\JWkM jHߌkt8KּĈw}QL._1ѡ;ԁvw%Pѯty$^ű׍/[geŴI%{{]ٿkޞ4 P+FڳӞ|U34;n];CT 28r$ZLc>3} 9߹Whud]vcߑyH358 .݇o9Ν{3ס0n؝=Se.{I48q ۳Ve_VZ< >}ه3g2k,{o.2=\^~7p0Ңg/_{7WgyjQwzMDθ{H٫;{=^n3\zF+APT;c8n~aD*>~RN8puG ׾Ǫ~]{;.>( t4+" +xjhW0啑W)~;aȓO=Ew׾RL&Cfh֬.<, aeW\O?ggEfq]*KU;2s,V^_+Vepy|HA$@88dVΒU,ϒ+ֿ 5ո"ho@4>Eq'B zM}U:] .B8 *l걋o\]Bv],? vDE9멁F4V!j(ޛZTuy﫪nYdwhDAvF Ψ3qDDD\Ad'.̠Oڅm@zws"滯z̈8qΉ|7'3,)EE o ƒ^Ȼ>qnz>珳W=_zSkb{ԋ׼x8'_~Z`{~<|H{)]m[~F` =<u1nqzZs"я^sk.9huOpmp5X87?*^/o=xk?.n^o;=Z[ޒsoyK.=כp,GE8XqFcY|\=QZqZ>&:+yH bikHR1Pj%+$)e,m:2aҹ%i[}M3V? IV(79 7" oC1L҇`'!]`X$,;4pAGd1:_\L1N)2 9Ff*w~uj.gCC.Z_= - 慾鷝V&ؑLI##]to~[xK^K^oN$9G= p[#]sB[_`.7X6/pIsgq=oz{ogƾ|+/uOr}w/M,nws9ֺp-x$[Fٗ<{vyc~%_}>ww_de{SxԹs^.|؃3>WE&\':x3'zWEz˝̮]ߊGo|#/x yяW]u?7/==}/ѣG~_rɒ̄ !̲ҞYXl @JD.@uqnL1ofg``8D1HЮ;^DF'EZu25(|d_, "귰l7E So[#^,C&d[Vd~W35LuKme85*-)T՘@޴(d͚`D[ud;nrn8DԸyEy1SnйaEݕ:\Q(?$'eRu0E'Lp1y~RrA'-x ӓyx.Z#-+߸/J|K_=fW9Wlr}mNNsnuWR l| NYpv*?3.4YgqEpWpo԰w?^3<p`i?pO?}\=8\ӿ x&?җC>}S$=F.r>Os .Ϯ&l30謃|r:ݦG79Z%ۣZBՆu^I[c7"FZI$&=y<4(tw{RuóiVN֒\;[͒vE-B%;]C%;l;6öJt;G*ņ@"T$>IW 榶di Ec]['r0.  ڋqEӫ&#%y$xY.MbMgvS@/ w87u p7]`zung'80a„q4EulnQCg=e\zma?'}So|{2o >w z'gO=j@ 7:M tCCh8 BcADzlqC\Ak+ϵ,%E5|3PI\tc% j,l(0IB%}Ko(ߌL&w{Nnx㹒 .hl -W3tyQjGyщd\','$΃s Ym!{ Yiom\.* 137! Ծty\r.zVN]܁G)X-a'u„ ''2<~g<y׊(nG{?«?q$pՕWvw.gP?y;>w?&/?m^t =H6Yɕ]xߍ"=W_(\Y:ξmXk4 9x]<|ܛ>#\SVdG38L"λN91~4o{x[5..u޽|scsss ӗ>// vq '{u"2;Կm:8wh6aF#?&/>Y~**L#,`~:M4mo{ʼn]mBO?ǜۼ髞}<;ϳxo_{q'?}]^_d.y:["ؗ@Ο?ټY˟$^u&sc2kxO~o >wc߽ ?grN/')yp9DѝX^Ӈy+_Esx[kLGãh7zkxcm=qN8fO7(:'? s%.~}S*l6E?C%n^|>'-: '[56y>Q"R\zƪ1qƩVBEg[EVVI )G[/4US@.]ʷejJ1:6(U݁"5 7'݇s(WҖ$3z`z-w- bk~t8M> i y$ kD6G[㈛YK#Fh8E^ 0ZZTg2ph. ~I,uGe1 %]ߺ=>\ѱZ4ums(H6V%ў\ m'Qŋ^"/۝t'˻])e~i766ր]u3?|X_W|Cj:܌w\|{~~@' Y,u[rłM>>ɵy:]-y =Ï؏q饗ֲe[΁NY:<)L{ t,zn, tҵ\oz5F#]ݨ/ z`t'z &lw{?wf}Ot]GYv]WCXYOy~/q~׏~ͣoas(Gس˹Ͻn' r';+]JMMBsj TIAȭ!Dymkcz~{ DV㢂Lȯ-(Ly=_ ]Aoqڋ#Vtb؁kwn<5/F#ɹDܧ8sqZC}g#Dd;k%fUKm2).q1ױQ½+*sۈO^(vA"[=G< ]ifK)#|СC]mݻ/=8 ?sE/Y'+2a„ 'k/]c0mE-0aµBNՉM6ȋoC.v>bI&@9In4ҰT2'bBKao$9V3/2r]h|5}yGy cr3Ml޹t:jW6O03W 򵸹8jLCq$qٿZ&ř)}Qx:q$,2 ["7Ŋ^۴]Yԧ'I&rd<%,HRlx>}P~PkʿS(O0ᔢ%"Y~wH n8oQ[~, 'hB@lzasy 86:k6>LEV}IIR X"oޯ+s^|D DD\)ۘfHs2mxҗ{b0ʳnL%$٬0l/$y=Nw`zfT{O̡]e,(8r<ڋm'GL^Լ˾ mtǝ[k-}&6FcõS{,č ϵOD$Xz̤5ujۖ^mjXg_HrMGC?yC.}(*A[՛D'LO4wbi' &L6ߧ ǁz 3"6ō68}|ybMNsf:ޙRe_rڋ ".%cIGP\5)0|Ы>vh[Ԗ$U]::Dy$R+RΠNLmI"_Jf r>3iuP TR:6igplb[b?;VLNgc |p*rcDSobܯrG;(O0`LĸYz„ N%8=0rg=XPR=G0ʕ<;)L;:G<܁Qy6D =3(KZ`xk;,א{Qmʫsտf_QX$'\YY+OFhWa@ Aq@.N MBgۯ䘷sDʔQM"Eޒ"*ѷlkyY5~1Å2g:6oD? '6c(o\YjC^,+H/[ LDy„ HsN,HO0a]- 6:M >ߌZzZK$&8mX'Id̆ʫbDy:w(>DG?- ٌn<@~d:fUO="_iQ;qhEy63D!TGp mL!|ëz3sr,S^Pqr\.6?p'UN5|Կr]-ʵߒI~y^`йU9'ESWȇ5;rk;noTTW:^ukD'Lp:Y>8p38},>a„ VR$yðgX?g C뜶CiD[uCdF- uIK)ŕ uKP =KEHi_Y@b2[v\op2P=3qɩKJ!ޡ:NBmnhhyl҆ޥZPe^J G}&dja+A$My76IbZ!x|j%K;:zNQElo ֥]Aէ΍9gԉ ̗cһ봪\쬌(eq+G=J9LDy„ 'fÕqd~uwgNۻM0a©g?y1ߧoתU 'a6sdC;Oz#ǻV ΅$[WaDŽHy,[Z- HE4T 'Q]B-HAF UdV- #jе6ةUnPW:H}3n%~%T i~ayhݺ*v˴A`ȿ%vQ&7=Юpm+91-6s9gh[pƉ 7 'vx"jfg3nw[SJaXPJ:IoxX}RpSƉdʭڶ:}_˺t-·6; 'uFPT9"̹$gƁ},|퀹 ` ,^DFE✓B \!t6@㰐K~HI$J)w}̆ 4`J8IzZ˟tAy\-H9D?x2)JP n'+U"ˢN5xuYU7I9 IPI7^ l7ʇ.T;ۆ)UХʕ𯸈|JjAfBg |E8 :Xs;(O0ᔣ1l'](Mpv]夐:ry|o&L`a]ߕ\[glo©w=]7l93oΰcBt>?W dG$.v-;F~ZJS=_ZZPQ'2 T;S3f'+:ą8f|8\$oPaKM=v ;JȄl+i jN"Tw$).)D]z„ 7n'ߔ1GdUzk*o©3lN0%m4WuМ ̃4 qqL^w/AeT0>Q5UTŌ"y Rbu$%䧼q 1I.#Hrwe`Oʚ.rtppIj1:;yK:8%Ls; ג_TA,%˚Ǔ';%|2aU1޻ [CbL7ۺd;T8uEqw\Z|.5jm(v軦Fټ/G~OH,v(wfk_nƸ$1ᦏWm[<!9snXy&LaAmVo2nhqz©YG(A/zrs +~3X+ y 3 }fM;+<#Zan5 ꭾ#HM3ΪQF^]+J2~BXn8WpSU^\BP}-NC Hl߉Ֆo\1u| |-ƹ٦[47KLӍު cT;rS `G݊O|'|s?hMf[#lj,ker"Xbʹ+Ҝ9Z~'LpvȖwU[{;?e]t\ UHF\2v"Zk9Weg"V ·Bset0z^5"duSUP[rQ#osȡK‚΍vU4(;UsW[ԆJw` (tx a#}/Wუ=cx-D-Oy#Mt1PaAaOke ߽!rb"su#9V~F78nѦRvʜ dY+ ;tC iLr'/D ^Vxe.v( >_Cb\k@v%Lr\<1NSwUu+IlՔx?YPp|'P [&|cwG H}!_khmq>cQ "w8{ ӄa*?_m1hrVoq:a„.6 uVmq9Vv*=Bc6c>_c6E+zWe 8x`EaWPsdH2\0СypT3ItsP1?Cn"YwС% -d@9t@"ьii)Cr^ c}荨1pH /40`s꫚3"HbĢD{OtJ_]Pf.ĠbG!?#Dzlo1od<[2ΗYq'XjaЙɚ蘍:!/G"̓tfblj2h0'LpiM|_ hyVy|-0ƅnG`[2<ގO+'4tgtUQIc&Glk:йD|e:7'&䝈jULVɺNU1O)v|IB}؋; UL KZԫ8HyjJ/DؚEJouMW',Mehdg?4<+rmL<*OWq_ivE3 m1O)9F#mHyσ[oVЯCnKEzSʴݵuou쯝B'LpӅj2ܢ0Vɴۼ58Xe&LXq٘M2 'YG_5:1yfnqy$+p'NV1jYf4e8>9iwn܇{h20 \{| b3ұEIP/(o0 &tw<'-qnٖx\Xv'Lp7dr'<]׋,ala+UW%3[ .E؍|ipȡ3~- (Z ]*߃co-D,;{D+Ŧ6E>*,QJ_1qTs e]NF-TkrC b2TP~װ=YP$3Z\ s@:A6@[9H2K);塸 v]Deȫ!:%?v Q0aŽ%n[  novD_0|n89t_Idq347r>4׹ŀ 8n,j-]|kLˁ vc+7I|Jk A6 k{,V}2p.VR$ƦC416M Dبy+gp*Ivz赡i?K?v n٧`Q2qŗ`ccc\}wp@K|ڼv2UUz'Lp߅yvy}S W׳yC5sOW$>ÖtwZ ˑai|oX\QĪ?IV+-0PU#rs :7ɋJLڐ*Qg^VPHFhVA/,qT8:7fjZܩdR󳺛)7c@k|S[3="ȋ%ѹ Gz3d\}8@lj7vs$q[ˏqۜ幜G8 po!=f_AαzÕ)y`QqA(Q?u.bv~ ȇ>W+nȓdwLy-W>a„|U\ ; -ƬcB誫A9Ѵ\y |F m 7yKhW'WEcJ Lzpǖҡ*TUHYT 2J˗xr|emK縮 K}E_h5 :@z1PUc)98y! ,ųۂJ|ucU_60WF IDATrST Ď+tڵk\4&9w]>wN9`)|~0VO0c. ;3úZzܛq5  +D'hG7bVQYJ;`Yh*bV+IH;Ң\`՝. EXĸKQ<˗M [SYNtR1GCԆ\9z@C:Ѷ,/ 04@*;H;frDCa[|VRZ #8cIovTfA'jwcN" /Xl-q]eڂg[d1YܗK8!,Ո?-E@7W S$q!ZQ]S$抵9#ˠ2Ɠ҉O0D~/'s ; .r7Êȩ&ơ#`>n5<ӉC%OZ}nJjJn`g\V^4p\RIkTU$Hb1uC.dLuZX&T"jS14]XǰFOa=trC4?=:Fr{+PX611G[AydkrfC!Su-25mz$?1BEDLv IU&꿀$k<6Έԙ%btNmcU0X&vQq\A9fe:ȅЊD6&QmތmyVq TK`uXM\q9uqDpjL8۞Y^dǗnNb41݈pYѪlQ3fĈ:ИInA*ϋKWYRXhqkKQG+W;%"EsmZh [=[;GBf:fb8XfuX7xFo9LDy„ +rbncMXO n>8ʼn˭?ag`f|nk8~6h:~GMME +9}k $H D9 d4:xl[HxO@,`_Ld mLi'qJSG1$Q/5eohV^po7y~P.*ĢY6L}E4NN=*Ne6}U9m1>+|9^ӝ YtPxWU IƝw8 `Nv拏݂ڙg{wD'LpF40a—wƈ3_;]1@g TabǤ>wչGd7һµI"NGD7=15;ґ/k!g[lDe)Hr$sU5BJXѡk-k>=*Hz nOr3cVO`5w0Q|-4y! c|^%*Dr\vs!0䋗A~0V;R ¢,6aᆻQýx.߃w{z|s._ú>],oe>|9`_w?yWQ0a &ׅce-E6Px`VðX :Lxy^Ys ]M(c3߆=x~=k_x$_F'X)s^ί}ݙ 7x +܂B&L0a„ 7H+Dg5&0=Qz1h0傮;qq*kߡ[Bl G'99Q:)RkZRm0nw0GO1d{_o*i[e1idUve+^q|GCS/$X}6&R>QyhF2E- ݩ]iEhq,wEuE^,N)ea,(I{ lPC]%Szgޫ->醋$c`әA z^%QNdۮ #6ff9;BMeO}// fo]zW.ȑ#uY>?1_cu@~7v+B)_7eߖ~{OwmT gyKW+|k} *>?>b曆Og60a„ &LA̰Jg56g=I߄6,rVx,EɠF]LDDD'47wŽ4ERT [ 4v$>ج3 ڢB<*ig_@r͑EΨj_)pK5[2_-Of sq* N48^`W t 8anusڥąs]K^EyMe)ޱX8Ctg467`X,ME7FYRl->b@7Į?aȡ5Sw]W[]wsYv] \Li6)bmmOS8)D{>Q9r+|/^9]y26!C o͝7wr߯9#Skoa *^X_ɻ+BE>u{rfyo7=!Q0a„ &H`9.]lcb:)ln8HJZ Qa l$: Hrol2")EXmJE#euS'g 3EbImɧޮ uƵËuA` DKxVwXS3^ m.A`(tv8"Š3 d5@Q+>`XI慍m>d:7A=t ="RggYٮ ̽nf*y6NnDS/5 y_ƽb:n=gaGjo/≼䊇<[6?ݗ{|{ʿwү= 8O^C|.:=G4l7?O_y)>0NYovʢt\ ..|:7KG'BrQʆ<_'H%ɤ2/( Z<"׈ @3ζ xa#U^x6atXʏ`~PS_lIcl RLX0l]ʃj&zl P y:|a7e~N=]?l RyA= 1 oPv="Ze{~R7k+]7DtSv ^:@aA A?~Lcvu+zl0Jr@R6*JB;IR8: cGm^S`ÿ"(e[~ytPٺDvj"_xznYVl|~MK;h1 ^fm0mvn&쒰0hj&NGAױR}Y6[seȱ{.􏽝tǵ\A8imm5Tx^ݛCv?!5k&?6@+͖{_^Yů2rj~]'_#&-<ΟB6yT r!600X>9s^BE Y 'dٟ5*]Ȅrk?0p)O c֠Xy.WJ!b%Tjk;qKu$2hmk`@ >(B{ɦM>(^bțcܰaz'_C~9?ݐx87Nr5vء;'u7 : [пx2[NߴEyݯIoE" ~*i}k:_?iptD s)Aqm.`A[w: <oBxIJ1Oi!%i!BVd'QD2-ʢ Ȣ-sg(8}ڱCkC Q]ٯ Gk5ʞ<[ `l!V`¸Q*/m@=# !*~fu(֑+ Cx`붻<h^%֞m~JpþSDZmlvAS6kcM* nV6mt~?JNi{Qھi]Ϯv!xa=υ;/h]n=fZ[8쨰VpXi#9oAv;< VW)?뮳.t98Q⼯yID8־k z{QvUGOT'>kٓh!sWp!;Ъo9c٪BTvx޻ڃUլH귥Y}CK8b;)=m+:&EGsޡsԄ+|Ӊ蚑q+\|~<]QN۰/Pl3@i<-O2 !bTn9:J RC"Y <aIgJf7gk?\_cE?b׵.kúl@_b6^~?}O+{m*KmӀ#󛳙3N\w܆vN)e#cp/ 4d;m_hPzz ll eSP?`mUS׶ᷩm=\ IDATDr^s 3L*ؾpv.KxE~Xf4JQnʮ7/.Zw(_ &zبՀTccnnnŎR*y^2J<+qSy^'?p/СC ǝ坲0kt>D7%xA9<4/g?)y^@)K:^xf{E/PP+/BvҚ !BR(|j oW_!2\`\ ӹy6WkG)"kpUSv~dV~-y-E_`y}hl0X@CaeH}e7-Xן4mǰ[~p]fk6>HS/m_s>~Np;?s"EFnZ׳}8(Gf/:"shޮtK]455-SPX{u(~a]Te|B!Xŵ1ૢ Hv=A ݂ƄA֖H G^)l֑[r _X h("h;jT:%+ CJ|/["?*m_+:[Upg?;/67 ˛=\ϼe:Os/ ];78@]ډ΍WQ]+ϨKd|wlv: Q]C2(WTT֎l8'rCB!DkEIE'0(kwpno]G/U8mGnͻ]ۉh Z t8ll}f5\v1TRm9Zo7JE R&6k1( ʹ2O= gǗwYh ;þ[nb$dܴ_߾ JJJL}}=={vn݄B!AnQКD"IQqy~!!VOv"ߊ ]J8aSWWgjkkLB!B!ĪyAAY!B!,V:?B!BRA9LN/D:!LgSVV%B!+++Q?

|,dWЊc6"UċUl<+ dod,_~&1bT|B!|Sq Fr9EoLo_[Jp]rn4StQY<}7_=WZ kqPD=?N?)8lMxWm0唽ypvwNx,Jzgu3)E;9ꔙܵo/?+Gय़??~#OBjӈ2U.~27_v3ޗۃQ윗,5w>kqWR}ɝaD??M:$ӼtޞܷQ xNdžsQ5\ćYZO/ܖ4ų7^};W ~lU/r۳iJ3`#8Oc{cwt)zq4832}WϻYwҫyoɖa'pP1.CK/[pg. S{}6!Rn{+CX}kˎm~݈#*^f0OƐNe|c\y|27Kc9CٴZb$J5_?0oZݘ'!+Wi~}]b?UF6R!BkD9Jd2iqhҥKF7x>li?,'L)j=z|t\^S}!gM䌛' acILy_\q+,MAΦſke[oŒ׮{2O/ "~yk#L :zyX\M`Z%luҝLvO㒏swpΐ/ymI)HsN}&Dgq_mF^$ x|K,\ >M76x^0ǐ9 cGy|EZt;g nf?ֳ/Asה)LR{}~]g Ƈ_̮K bϸxzFmV^y#>E?GrݤLa_^f4rqԽ2$n~1rN[/]uD~5"yn;Η~Xw=#8/mG^ɗ>htP˳M NamDZk~?1,^᥼}i\Zwdr7W "¸4=;f}'lJCv\9cKg3P}3=ƇUc1Õ/7c}ORuD>{0p̆GNgr}qdhk [sg/`Cۺo?mr6><{ćWi/ O7>] ઇ5ů^G ]>྇Zydn^{lyn1wKHB!.w9qH$ g,WP>̢,5=ra]N`PU^J[ϔ ?'InnLôiLw݃-ӫ,Ő-E[C#FFq4>)ȃc`d#LƋߴKf~T$7fAIeJk,bƱQN:̓> WCq축Ͼ Cb*N c|5 qpt_R/W'q{QPHR6_TĀ$uf̞ YOxLR+EMϦ5E$7|}gd h'r^9v!B٠wL^rZ[[M*2tocvNWRB-jK}5 \-M4[+كWmxţi wr/O5/n) M~vy`Ax4WUIuBFMk33+` ѭcEe!BL]^4UQQag'gYnsaöe=0Ηln 饋ij^b}F*cڭw<hL7||Y. \ՊүxfڇHh6?k`0M%>Yqg8&`g^k7~UחRG3+ՁD;΋ɻ \d}p#&_25ݷMCm=9k;f^'g#yWiȀi' ܑ g2yn3|>MߞM6Re#/iL0f2Nޞs/: ΗO%^ ?DvX9oem6qK?f9LJxy)^3b:E3fGxe{r4鵶g涛^fNZ8Oј;ː[%Ksm8<|@v>oo6ixxLQ_B}z[S3ۍɘ涷1(6a U'2w8]PjZ'y_CȥGdpa(e/kfvKP:PNK.?x?9"VgAΚ=7cwkyqNb#{+kR_9INm;=0_pt@Q 13b#v;cR`q3u]B! >׆y&LPQ577={ꆆ'H$։ֺuݪɏc 6}:on{7r7;=z vo>)

x}Vyu/'dXo~<"n+y:_8w|>Gks,0g" Xv{LAܾI伈AyO;e~lC}u|Lگ 5s,;E!B]vq-Zۖf&{zn1!B|q=s]<󊊊l6ˊz( M*2VH$;+VWW{ ^EE6lWuHGTccNRN:qQ:.J$)yq0$tWNޣjB!bntWZ{v:fөT6b!/ 6wp?,k ˍ;VGWrQQQHi'Hhuu"P庮p2c_B!B!~a(h r6R3Lq ; ȁ~u]]]Pof֬Y6ziVd2RKkmfҥ$ /ydq2,Hr7)`׫rCCS\\$Iq'NT*]U*TQQQ}0O !B!eF MkM[[ ^_YR)u]7ɸK.u{v ahXnhhWm؉DfM*u伟%%%۾B!B_V8q' mmm^QQH$LkkW($E ~tdGjɒ%Dgټv 0 !B!8cDrp PVV555.B2w ,fݣGN@&鴽xB!B Å$IJ @SSJJJL'!~Ġ(8<`xbڪsB!B455䢢"PRRbM}}=ȁX ,777VUWWŋ@B!BQRRb @}}=%%%@e漀g!B!by_S把 P $XAra ́ 8 !B!#ƁZ"G+:#A`ăB!B,`3+r$9k^}A`h!B! Fa%ʁN(@ !B!Qq\W˗XzB!BU&(~B!B2B!B!/e!B!B!B!?uD;IENDB`kraft-1.2.2/manual/images/en/followup_2.png000066400000000000000000002034701467704360200205640ustar00rootroot00000000000000PNG  IHDR.X pHYs+ IDATx^wxUnI ztEb{ . *6 ł MzHI;Lnf6)=3s=Sv&B!B!B!B!B!B!B!B!B!B!B!B!B!B!!MSVB!w1ԀRHWC!B Tݕc$B!!E!BqxOlkE !B`\P'!BQuPܧj !BLָC}ÁڎB!o9PZq㵽ߵ~!B!AFmnzmomW!BP[Zo; ךZOM:I!B9 ڧZO: ǚZO*sB!DM9 ?5ZO8[uEuQeB!S:ˆۨP-_Y6pnZB! pn~,[+:SeU+</:vB!ug;憚ꬫ:֨Cȭ~TgYSY?c 'W!B:)Cɭ,PUg=YF sUY[G>~B!wȯNPUuU]F*ۯ2VwsC𾪨 !BB=/UY*ԈY$WeUYlMŃ gprB!D H'LMCQeL"9톛orZ.]I`}V !Bj,/X..+rW(f༌]<Ԙ<)XT/B! `v}v1;vy9L˄_-Pw{2jLm}Lmsjz}B!5]p;.Զ5>Vp 7dj"_UֶۮL !BZ|gRmQs*k},ίU ۶Rm۱˱YU浪 !BTl9~J mۮLm@n'<nڧ볲ScjB!SQ6L>5/Xn2懚We],prb~g4omW&|2B!FU)]Fmr8ͫU֮L8䆥pj] .s歜r8;MSeB!e)+[֩)nrH8[98[9섚冥6PjT 6XP&3rvML+kB!p*xem5-o-v: 57Լf꺫g7P̸]2Z˜NySTB!(JQ]ie-UNj:/,YPrbӠ@̓5_ĜVn9B!DEj>] v1+5:U.Ok; %/F:g70Ps xڧ&]d۵CQeB!˪RT8 <TŬmujΫm:o %Om;鼐F:CɁyviPy&!Bq D1촎Ŝ&CҶZyjI(y䄬6 PY&5:[Wק0ɩ_UβB!)e }5թP^f˱S+uY5f׶SS9!7ʼm7[~S|:5\+>8B!/ V@;90kij[aiSs^S\eNj*'$n5pPtu0`>n\N֭۵#Bq8RSY!oWéu9D3c\nǬ7ԩImB=l}m/ m7uN!c ʦ꼕SIPeB!.oL cթӼԤnOٵUYMdWԶuʼIڧQV2k3v5Sە 7_!*ܢYWuY3j:Ny_!߮Y :Ucj]_-cl:5ŝ*p+[OjJy(밋[ @&u=N1' !B+}nyœZ1]LL[cNֶujRNN_*p+[O~bݮSu^m}ָz%E}YsP[16VN}B!Dh"کơb9u\Ŭ/zE}Uc9v}֩.4 W?UŵrjQ/3實8`ŌWvUƌ[yucWvBɁ}prB!rC)m2?%̌y7w֊f̵1͒cǩ3(TƺZɩ75Kn^EX-[>uv/PqPdS9mUuB!Wm5nNW\N//sO͵[\F]5Λ}jLYm_q`:@PԸ:PcX\WmթlS\!B9Ε&Nj5K:WL̸,m5'%d31 ed9=dؽ[]*Xa.k/yu@a7ѣE\s &$t1 -/,_Ba{@I+xޗw^œ]Ŕ Z9Ai[fܚͶW]],,c3 u)f@xxEG׋ccrrsnۼah !Bqlڢ℄'0]Ep/sgkb,Ϋba Y &IdMMݼeC~..(*uӺAWB!`ҀݭcbusTEW{<5Fl.5HW]zЬf.R-%F݄Ӷm^MC4cB!B 44?WT׷GjkpY꼩U7meWYL;5O/}\Wm!Bq(Hhi`-Uk]y<>=fFUSŪ3փhZۜ:3nYAmWg7zL(n+rS;W~ccńB! :hn0tk\1ǧ1k,: ~Tuf̸5:XcJ 99Di4s1} \B!D2kX#eް:XuY|kE+ i`7t>^yߜ晱N).$fN%*-;1 h }B!a>bgéu]*8kEM_q wbP`^m'N}HI8m K4?1D%:[~ƛř6RQdzMT!B!fְ^]?,}+/ֶSiTł 7?̶5n&5oPƖ[Hv{E534m@Qs߲5u0rP'*]{#K.<]י4 νB!8>bJg\P+umw{Ss.k9R;ԃk<̗6筃k9K͜ |^/,K*f;-#-Ie㿒"8"{}UqɅq b\v 5B`"##P>xsvWpNJr>~Ȉ5q{g%ǻOi0UIƍS|~ujZmZSvj8SviJ csȬcwjl2jNɭ򊋕U6՘m}':q̸eOD5/&gU^o,^^l\W EaAuZgغWtHú1-.7/>\y1}zs٧Ӳys4]'=#w?%j-fiJ ԮJtܱ4LMۆ44 ]j aCG!խOvmXp?GO^> Ԕu؞K/h~~G\qoʉ:hU(Esdȭ70s\~n2w?۶SEx͕ԉ'5i܈7n(`>ݻhҨ!YU#$+>nFffw|}`kEG0~\~0U2hݺp;ǭ7\@jJ QS\zc6. 0HnЀIoƐM\p9eE呧Dz7;;A W]@qI \ _0U᪅n]:3胁LuZ1^Cʭ[?bϽ4kZ, uYZk^k\bN>mrר}ť*oJ=8bY*˼fͯpGd}_-Р[! C+] uةT(4BN >ڵ/(7h4>%>80s%ҫ5g~pB㹗^km}pۍйc{K0 nSDGG}NO|]YyHIN٧1's|~._|@W+_ȩ'˥ӣk^}]ZcsiH|_B,!!.;p3EGxqYƱ~F}q">gӥSB݇Ϊ5k۟ksڴnɍ\IM{o0 Ԕd{&M~!܀0}rY-YM^isIoh^ݴlь 6scǟlOۯH|\[w?,;c֟z54HϮ,|>-Зo+W!59)-=uƫ'ǐ+O@ٺm;]23Y װvUzbe=HnSsW>spE z{K׮tU;3r؝U2i|BhGvc6\ň![gc\pؾc'-^e{xJJ16.` ^{F='3'ٽg/^_@6a}ùAѧ㣩_70 tȍ\όc-٩C/lܴ9{Ǝ nvKg-7r7Yv]sDѣ[.7žuҴ~1riw\h:hYyͶoE;_fv۪[7ƍRYF5m̲eEОШa* :uhǮ,2v\.:kKմm0쎛yl۾\_ߣzrez<&6^{/KLgҳO_1{ àqÆRu;~" g^w= 'GUa]`ۭ+V1vD{(c_oKv5%ҩSgA_+Qo2v\m7(֫-e>yZş5gYJ?_e" ڽ"㇟~eYJ'5%N/)**b -XG"pR (xX,FO>8>[rrr/gЯQa^>08̜=6xXEKq€~JNj:L_֩Ò+ҩ^,\Ա=nNڳxYڐ,X x3/n^=U^=3c96mb*{tc=ǟx5LȎ`g pQ0 he]7^%(**qÆΩO:4 #3Q=}NN=r{l߱g.xSߛ+/<î̬';naڷ?϶DEEUx^kAuƗOHao+j{(S'~!^7w~qq^{ -\BJ</u^\ a2 WK0rt=S둝9N{Zn=[U׻KwZ{ 59oun^mbMM]qqzSָӁ ڧ.2Oupb ez:} "44( Ua~xu>K>􋐋!jKn>p+;?$i(#n,Ai M8vSYQRD&7\NIIIHw)IlO` #3AONJ"]Nz,YW^JDDͫoGQq1}zܼ</(u7rrra4$& kbcHNN"krbzfiIlظ献h~ꈙ:2|d[]ɋ {e@e̬uă7DfVqHߕIK/_O^ݺ <4ƍyۆ##Gг{Wx}=7N㽏? '7w11с6@lLLeԣ0˯Yd%F?05a̳/N,3x@|pЯi?)Mp 1q|~7N0˾3vQRRh,D `ɲ VSvuQq*}N*[ўz9~_PPVlzXS̶N-gXN:E}SIݖ@SyujN-:6GGbׯGy#h\qED-B-htCcqW9b?g}qPm IDAT>Çjͺp+׬#&:=`ǯKktov^Caa?[odl~bEŜ~ʉ[vv'loپצV&AbXjr2ߊɡNLİ/;OJra{/ٛͱGn|6m'lII nM?b$7KӦMˌ?8Ѫ%ѵsGzsر3seELL W]z ƖXE͂EK|lܼӗ%i+* 4HNJxg\}{8chִ ,5Wp27m1}z:͛5e@y ԀQj }?;a0kp{y"&::0 Y|qh֔(B,_AvN.5dcٴo=g>1DGvgDG4H9gʺ7X7_+ _]#xijw@zq3%%DEEq΃\ AăA 7V]7tj߮ b [Zǚ@?ҫ2S5VPԔPߴgwyjBfn.xwt-h=q/qU]dͤ7aWf})7_wr5g>'/{O厛:|i|6 MC։e_>>[-`G~' ؕ3/L`eY2o܋z5`b@ޒei~Gux)gzRyմogĐ[yeX|Jlώ'cW%o=7ʺ =ѧr p ג?Ͽ0 > dfQϲ}g:^JaaeLZh^~/puW+/*lko+R6sŇos45\r{O:^Ͱӣ[nZbPv~b__MGp'ko`fz>+zbXv=/Lx;F) qK`٩_~×LsawA~A-^ʻ݆Vrs1x#YYeTo1p g~2mlN>T)Uei+yz ?O^E1kXO tj7̘9oUjKy5O{9[4ؼJ:Q95#Ssg7o9I-=ƶz`̷fOu 2MYF쾎u]/ohZg5D=<&ٷ 2,>gN}jJMUNqSeEm볶՗ucY_${I))Ln`br:v;G gB5eW[Q:o.cN_f̮2h߸Nq]y2c&3nP6_Rؽ<ϰǡ+..|֚օxtj}_eƝ>EL;dȁ9Dd[O9ofRs,O|&B!t]C/~(ְ F̨59om<6n3U6(PT(Su6ڶm!B!uj km̷˵:o*́KuٽiDXIB!paֱfMkTWsb1p y`quycקQB!ZԶU(q `'uaN۰/ut*B!ZêC/3Ϝ:ŭSu.pzTVN'Ů:o.!B!Ej ΛTj:U95pQhӼN՘ *>ߢ_!BCZZ:ջjLrPڵ@ \o0:Lj5oB!PQ~޵V:s0.;8hdNB!8̶:oYYTvCʡ6pQzX9_K!BÁZڽL|(S5fRՁؽy5Cluj۝ !B!jZVPQ`55=p erԘ6Uvb[_f߿B!1i:UԸ*ʅzP=Ԝ[B!`ZVg7oIk y"!B!'vNb`}Vը5pqbwv:QjW%\zG' hOQMJc1jN|c+%{y|zS0mCOlM3/epvW1;mپXt:MD7o6X=D%ˀ :#f/'y36pR7:kkܙ~/.I1] &3x1]m\99y0x sPze0سn-9Sp[͗?`Niq4nw4feg=0|pͼ`W3߱;{8ό^8їwĕ{{t~'+wU9];ڬbߓ|>zP?O XmF Q8y@g#˭X!_ͶڧY0ɭ5=p vTNI0`'JSk'c֯[꺂nг{ ?n)(mk|f~%] _ېդ*a]rP ~n2<f]#h._Nq1 lTs*8G]eqհّ_;:Ayz`_Sϭ}r/9,~c$=%^Wo?}M3fUĤ5 `Pi68}^^Nq,bo_OCya`EkPņY),_3c}U<#yox|PLd8\)=L'YS]Crn$iegc&8b賑Ǿhissw&k_j{ٹ6->3 \!ƥb6M{IFy2k[ `w7c_ƽdrg~>Ӯoj9B!DZϪ-C3++8UzCɭ@*;iP_m,K2h|;&|xnBӖgqsz8[Yl{ ݒWmh2M Ϛz΂7I[7%>^iAh:u{-F/N16ᣣ)ÝHNw/ k$Њ?x`qc.\|@Ghh;#iIK\@={Ahc~i6E>􄎜zQ4`ጙZ?*]ot^dngpV&veBS۔!B@:Vm4~&k*Xw \YٝĪ5(ٓo?ΆO'UL哴"sݸIԩAKwر_ɵv%Mc&/:l; j/E5GԷ 0pѸGwʊ߰[ѾM|۶ĠɒO:K;'1ҖҸӶc(uӧ CK9xSRKo2J(*qWq$߫eĭD]{oo(f} _mW^&2~p "5]3Y{E:Y6ns5/z3GZťRk)K^lZ`F,=sEk`q'0_+ް}Osr$,)Akz_Az+GW 7ͺnPƜ~6uw|3vs73>iޕ"{ѻUN#-vDnxg^7>_6vz ЛsБQ7]&B+U[8-p`.*w곋m 0Vn9vOw_SFE 50\0|nL=#lcyZE̛C#ESF,Le,ZU߲N\\41 )0~n KNMX7 Ba$qI>;VK{Wj݁*uq;kz*gy-ca7ݬ%M]QB,Y[VceOKL%:]蚆EҠAe%r~|Hg C qO'+`%{ ˷Njㆸƭihx--'ɤ)Sx8" /y[xٞZaeaߝ JJJj'GݗEFЉm+ҸqrpzY 2FQP/>{]b+3B!_պvUQԁb Voow>V;4p.\w?WiN2LETߊFWV\‚9XUCۛcK/,P새=,ޭX mfqXULy >}Eۍ+pnЂ ҇]xUq'!NҶPއuաM9z{ʘ'^aNN~| v#4-p>5h=h1_h F1P6!Bckupe*tT+5N- v0̸oP5^âp..>8LIbS~hˇ^9#ѝm%+sAbCrnkJLsCUϞ$U ?;~0tE~R";eĠ#|d\OV7ڕ*|ɳny F\zDhPh' 8*y MkhZ4 {]g`B;fciԯd@@Cд~W-Z] CX R$=?W4u {2f19NBTÚm5nҨ[8iCN:0dw"Mjۓn?dì}֏vsĺ?h IDATk-PA Ѩ#{)Z&Vُ(ӛN>}h#}i^ {YaӟDsEж[gu _Bf,gy/6Ϝ^0\)wO/fdKI ԩSÞ}FzjFT.|Yod(w5c?U۲f~uEņ -{K0h44WQ-)(Y _.?p+{I'tq{(R W-zS:eajYz?FncR2ps8>]o6rL!8LoPq3N5L~A(El€ 9l>߱ cDݣ1%l[=_~Z@ûbͬ%E ";үOz>wobѫC$[Y07SB~v:/`WC໹}^YMgіL~3k(64tm\hNyF[>•\.; ǯ[r[ж-IBvs?RKv発?Gjz7:Aeٯ{dzf.9HR"ٽu% ={@ԓSHa[nfMB_:ځӴ;FAGѳ}s5LAL׾tEooy9Orwn ~^F.SРx Ƒ6OS9X!'Jaehe;|.͛6lr;ǚ(Onv\PP|=%Q?wJi9n,n(*J+gswe6n;7<>=;H(9gENeLqI̽]Op*sc?x*Lk !Nn/ȫٶpDXBc2"R4SU([4 ÊLhD#R!xd]Վ̓,xp!g՜o,CP я !~= -=p M8~1.-#hv/swSnFÜs?!sgf{};ҴkҖ~¦w?r2l9 -]C3??I-6L\i'@'=p|L蔮49vZw$7ǁa'{>uau(hqΑ.?49)ǴH۽on=ZJWhSEUL[ulZ6.%(۸&|Fy][8Juu=f3GnvtV6/ʈM`>dvc0doboJTvj Uv!䃬Ciݬ*_r«иfQ*0(?{rORhTVQHB+R'FoEOɧ{3lP*RЖ-Tưn.܎q_>Oyk^g[M̻,k_eM,ۂ0sr'FgS0wE Wɧ3u:͇=&\C_ZzO`>w{kk_ (U{dݎsw L&eg~p5ӹ9@DoO1s.t~Zǁn7uZjppTF4 a-r Ewز7.'yRal{SRFгb>\BiL^gLB~Cx"x*z 8(G/> Q|k@L7%c-)ɜ8D4*i8׈\2 m 5@솷2&=gΡ_Y#J~vJ>!qp:΂I69ӱH:j:VbD&*ٍ7~AsZѥ|9}.%+JluK7z|1;A!TIND WtHOed TUc? "?{5{/S~;0d ?OkD~[i ޡehǼXVpnt,lC,@f]g8q_$a2R|^+%dޤ=rdݓR0j BU$ ^swf܌HVmj܊;)5q.TQ=aG PZoݦxXi/I:Ŋ?}WH-BuH?']fǷ<_)#(>M>(=w;YxNu~uNȤ\qXQEJ[јC( fl;͍?ʴ̘! )-Mȅ$CfD\Ko\E4,υX3Aa臃|9Cư.2YU>ө]OB8JԥA1Cf/VfVO펾b$~Np>`;Mb5y-?(͏-l]5cW呦oN"o.c@N  {}ļT8;c\ G}roxFVNo{f{nޟk6yDڧ.OwpKFƼl6KOaP@3;s| bV5y~MF>8~F,N:`x{:6-O3`qRu@7r<:3Wnfm23v'@Ɏܐbd˧}ϳ?~꾏Y^֊oǛfK|Mٱ3M~u;r6-aTKL`6GR{*|ҚSvZŖi8n}JO?ʵt W1m|?LC}a+}Ye~pUզ{3Xv&5%i ])-׺G>?iؾ4U4|6T9k⋵C1hf1Q-d:6OYꌜM%f}ݺ~$9h8z6c20yS-u78G"!59S-fX(~h2N+ϼӣaBޯtO?ZwT UJ9$r˰Bӹ25<~9\ǣ:) ķEٴK:=$uxΟbfLCZyN1%c[-~ESvk֬NgY0sN=x޿jOL'vspKfݬGK6yw~86s8۳׳eBF>uߝ/Ifty?ʡ}0[e[eZ VD!3Yi1mO|Ma1]kR:wIt3 ,ؐ16slzymbH3VʼnP1}u+'HE5G9~9Kcntz#Aڕt {?IAo#E):A8ښÓZhr݇nc* ' *b00dˢ{OÀGHIX /̞\ < xU{Znwbe>_JX3{NԺ^^|"wA6$jG)ӌ.Oe`:Mx Lز&zJ~O~ЮmU9P=ZC~@oԋeR9׬~[ ~ք+?*Mոyf"㵨eF>(|8逡<-:>AcGhӭ>ˉt};8T-}ÀOؽ7eN1ᘍְMOdyzab=W+yTnkq wkjM{o)V ٺ0R(K.sW,R}M_{p|Hqzٞ|-ş6\b4WۑWItB*@(ҲZY|:r7e!L{=XҒ1Nzs22IQ##''c!ηwl sxT I1v^XL#ѯ|mP _dq '*i)s^ inPGA| ʌF_ fLi- ǵ$h*JF 3gY#OE5jaea 5\6g,M *)ܸA},19v#L`D{U=Љu_sñ:xJ ֻ̧A-wNՒ R8VIxx qغ갽`^K"V27Cm5d=+PJ s\&)vKfp`\/1 QERI|;OP]isY` OP)5bb Œ}+P[i]IU[Ϩ`SD~lXSS K-U/+ SjL2?KS ߂w8aZ׭OJ>zk>Xcz3է:]W0Z|W~X0FqwXZԭm"sc[ݴN|&S*2@ #m˭ Je-W  dLb-UB2b'0s;5Mfsj!fO!gC5e= W~k53+4@z ^4Fvwx v#vՀg縕jm\9]o'wC{s(1yE@?O܇v;dP %qS݌"` Q (b4(pTQT[4Π ؚ8L;PFw1 /J A! @Qr37ݎ?e $GA )LSy۟*~Gf-è~;;Sٿԛ}`%܌3>2?e01QgP7 'a͏<:Y'9 Uꧬu IDAT+ouѐC@ nNѥ\huf7o?8znnW T/ݧ }FEuCZq}Av]9JG _8[oՏly58 O\ֆX-= T ֠ s'*;A V4-|awx<Ȁ~iyb M--ʴmþo/KNiZcq&0qRz15b1)ǣ!Ùrylؗ]RvWe5"ɧJaЉ?#޴} R7#S3n)8D['vZiI*E(TS6g8SͶ.*%rÙw /Ch3 3&-f`7)]k";nPe7eh9Ery]EsXzu àPnNXΉT/IJE..qR6.:z}zTT_3ǿH ,=ţPܠyzXxڎvػKeY_x>BBd2%s_js{3b(E#iC:7qt{kv_Mwjt(-13٢ w϶r1EcYzyZ3߶ O|Q/n<=1CkNG]#Nߘ>υ~ :;)ϏzRkDsڽ(*ȧ/{dOZD'ǩǼX;=rXgd߸>l҄&Ѫ$I5®p%u Pu(v2j?r%f'Cn,=ZӬ`V2zP} jX3etnAfpӵ$FՃ_o\1[ rz<Aӆi?p&:p~Se݆-ZӺ=&/sl(uhToףElqI-r,?miuEqkPxxW>̈́>mh֢;*@q㯢x兏ullLnrN]K=߫o2#JO5B`ݡ|J!M iE>Z}MN*ǧ]hn0_1szh鸈\rwxno?-ϫW_nh7mXۦ֏F ]Cw,EU蚎yvVPTQ͌0]Gӭ/ (\fn!7i:G 8_AQ ̗ut񪊢v 뾲h\28D[Nk ǬQG3v\WUKlY*vadW@^9F&n$zCe e3Uj};/GEQ@M9].˃viS,infdkf0ԋEkx.5,EM?wa>ܺS]E\-kRgYn-N]'M-wf,ܛCwNϽ8|<9[ڹKln)ݚk(GwofGYHN'cG!Z;c>ؕn10=d T+Ȼ%UMtH}YfE|kof+[~8]m1>|cLFFF:`@۴ݴ:mtiݴna~yMn9<‰r:-'Wwk(q*ݲ[(s]#g{ۨˣI75V T(>.ۺsZY5ZMbwhbRTT5X};rS qGyrײ>].KCN6dkȔ]]̱osS..]?m]$mEŹ2"|{nݼiksوt&M}xnV\fvwdwrw~ƽ+:>l7X8e=cK (ɎkN8ss^y]]Ϛv٧K-WHE8 __x:~.W}!6ڭo* hh5vyt\ȑ/aC@qB`|ָBBSnxe tr&;"]Wta{vy1?w"#E: (;54:Ao+pكMxADɎ˱sb'oF (MCx{e@OL\o Uo@0zY6͛ͲGoƷhu: zjb8nD2@,o@|3nfڛu~)B"O\"]SxBv=wgNf*sH0<.vfY6y M[ʇa2_·~%Js^b߹ʵĢTk܇s|4g-vm|v1z8v޴k锪\O|GZ=1xwvSjTקѦ`>9riPHKXQ_2aƏ_Cɵw.s?mF.`㶭,7fα 4tn<Wjtg3 |'c&m%Zƌl߶/:ʑ؝&ooXy+[OͿf03d螔~΂i,BH!SF<==X)iDs>7w_%=7+=EЬyMS3]&MG0cJ4{ hD.yaMض0DFfC|+zv4 ticʪY\{7]>{;+×Ԧ{1Q;]¨iAN} 2Qi[˜Ѹ!Z`Ԗ(LwN2fXD4kN&o{:jJv}"[1w kՂk`7#tkANdRuV1Ea:y*4u6C'J7&|yڵYW?`pf4x+N؅ : ՗& Gpih^÷+`J9#\2|N?dI>'./]yiquӿ3-[moɨW0G$G,ٴuSaW=Bؼk6$6x`1NϷ5t/VfVO펾b$~N4u3?,3sf6.@&3cw )֑K|joydT[TKY:%K|Uؼl"2Χ;i!LYelٗ va?~?Vij3;<.O?B#\3>FϏ>Ki_G7Ƥ͋0`;Mb5y-?(KE8ˢ);;5k?sQeW~;H\'⫸0a9Ym۰{>eWT|7[rM(vd;S^Ph.]I#3ǿ(?U͊s\_S(p4b.FM*(2Op7ΘB!xXP83?m۴eִl׏oO%qpOx6ye4xZfdӜt;xT D/L TY#N3q~, at:]Z51d;tǞ'OB  ynTOsp +6w4};8T-}ÀOؽ7e[{Ժ!^|"Ʊ D O %W8Jfty"/ԡlukhd2t$xiD4~%e< xO:W#KTT?EA5X_ |m 1+Im ?c5tts^y%`&f uԙJ@P $%PE5`0(ji {7?57.'a(0ݶt J}gj!0/^ k,l;K?je:?Wp/#Aֱ-H+E42;ҵ>wl["{)TSx{xҸXc蟘< U@Uo[/(MﵡIƴ; _w̎GG(pKB!x>E,(FAhpT[L$<<8rh܊DGfY1Q04?bR V\ڟBt弳4އ8_ _9qܳC`p֋O~I'hz6a8I!-N\L /@v[%_"N0AhA d.ρK\NU@ ְ hcI;̴u}--SdLi%8̻ F];[u^0≍P SG6yj 0З;/e/шus q5})P>9ْ>%J.2z:w8=E̢%ƑWU _pX/JU##)ëd+1|8/7Gv`܁t4݃*0g˝2n8yWkO4/|MJSI'+[?ٛS#6̟Dˏ\7s LǀՄP)$'O-B!ă BXXc|Rhu^7o?8G`j DEuv<⋱x {9X}(6̮|Gɨ2e YEQu>a0'&#ГMASy۟b909ێ_UQDkP\йŝ+  &1uE.⪀}wGQi{j`h$힘(*밡JP S@I4V Pqel0m@CVksj)& Ax<ގw$ՀjsK>*)٭ʟĥۉ$㰞E`P1n-0GI;ie-cE5X^˷P6N dI_6^L pKqSRLw2aL;mKE5`@@jth_c1 =jB!CV_ iojjyBqp0#͛Ǚ@Kܚl35 QjU3sh6kԣtjxu*լ Eb9y(vnO{iZf0%Rs~ڢp=MI^ފJHVԎZ"Y6k@q:xy-_I\jn{jƴ|z ir1^vITw?cLݟ¨%Ѫ)-t=/]˵ z*@!IPF )ɤZo_ֿR2erNo@PSfF ;䝦!5R34?8bR̀Nz_{)iܙ\$ҷŃ)BS| &7_fo|̋sc}1|d&iGokWQbJĬ;Dݗ(QtcyU4t܋EϭQɆT:+C41J ݗǽ7Ǣ /I:ݙz;Y@)axgl"ӦI } QZщ|1c('ēSdxw=P 1z$ӿeH1ħzot XʵOۖ;Ɍ*a7m~-7wM=l@"<fFWw{JZju:YG1d k5 v[QPoZxfWhqjR ~L'sڞwc3,ODtMxr ]4W,0]z\PG<m9/+Բԥ,2MQTq;qvB`_t K8]9(j6yt9lme+(*vȡ.=3+Ůlu2ߖ.kԲ- M>Ȅ' ˛5!!I1&###0f mrnl6ݴeA_z6ie6@EQQ{/AQ~m]AunEUnSB}'囯8X=-EA6X<2B!t\+c ~{2uOOBHE!CB!B~uB!B1qB!ByqB!ByqB!ByqB!ByqB!ByqB!ByqB!ByBICۇB!r"?@o'펌;o fӮوR~}Kc;OӨ)3aF1G5X:n9v泅S[m>Y3kNWêUT|TǘIaLV:ƅ (dzA:B!Ŀk^>HDty/v_{Y`Ϭ}iш/~]_A϶-hݕcl?ι{P!HeWhdB"mTSd"[%ɾ3cfjs~ܙq[x=Ϲ~soJ90`f!Ȟe߰=:ny"8 e,<ќ31ܕ\6T6.a'Z ?һײ ,}_汚p\r{rrYƢuhY7;hYKv8w7kk҅v F/~ܖ'G@><U~`.y٤HZLU)wWk﹕v7TD QE)U8ӵe_FT_荴jYkcF5)_XIwkI)4=}oBDN9IDT$'1%mW^>(wCxh?aGVtnP?oDg} 4طw(N5x;M>lXZ^:Z5kb@DD2늓S "Њ#&>t#?3#&!nYNd#Ķll,NĐk&|-T(yٚJmL+kFF6/-cۓZផ1"t |:;gI>±hMV\ba`\b;t/\_'N1u&l_ir?>V2qNW,y΀"bL0yxo@h" ]גv՟|ȼ`({\ูc )HPF\1=WbC_2bH.>C\H~ ݆@!q!_vq.DF',Nǟ(³"?\I; RБÏy1Ͽ9+^KO>0sa0M -DDu>6@w':"']P&s+c1aF'4siN{?@ݳ= 2O[60L+̮-6@nkyQϭyYT50gA{=N\@$a T ׵4~M3oHաt0f~k/9>f(&N<*.IԩTlSOr")"<Yb׬&Gr^}c]͌""e1i6/C<{'g}U (O91b$2*Z[5lw,曝k=]ڐ$n I nnzo1FQC >3p-hYj33Z~ y `;Y4GX0gN*PE}RX+Ϣ_僟 6g}洪T… nIabh 5IZsljEN|u.gls+ykSf? ӻ-NWndX9sn%Ѡ>}=G,x?q+͚Gp)Gs\,وΧt;ߟњ-b vcu>E3㿱!8V'ە?;XxF05Rz>glԃ+|a\ͥxfɖ^ޘ8Ioj)ȿB3.,'N aD+G/n;(hbH#? t&7籑=nbJ'_ǴI҂&Q;3NՕjn^<Ɲѻ ,p_Ma[z ].z~Ni,Ͼї~oY&xx&Q7kM Wg01jbL;Lٕw%cTx_q"GDjy.?[fv4"~fYY~.ڟ4LҞi1iMqi]"lNu'3{K3úQ)ȥ<$_{|eDL>x1&3ek͐ILf wQotpyK7=X !^Ajղ.;_ٷ0]'k'kg~Y?&88rҰ~;sΧ|``}`[V4a`;6e{ԛ{ l02oڶ-\#{ic,7xgX.,̳6m11 LY6he8Yym;1 q3#%۴GWiu>7#ӺuSNm}9mY1NCs|ϙ˶{]0:۶}ux>q|8nmq,u̕Ws9۝Ulaea`=9y/""ߘi7t Y˞-eW=]vfY[ޏd\reЌ50d]!i^`=wɭ3Lq9gFn[\w -u\?2c_T:b~^S  $&. 01l94Ѷ}ur{~ _86 ֹnwVY@_8EDDSp듵Y{17F^!5EEOfI:Lv{v}G x9/^'.6_")"Vnv\;.DDDDDD)SpIOwAzz~"""Uʞ={HO{_zWc9_**Z;ʖ-5"׽#)R|RDD8(220H OryW\WaaaDDDxWc ."WaDFF]%""""ASp"""""">OEDDDDD|<y8dtBG'99ٻJAhh "R5"""rMQpN'$s*eJ]-$"""r ѥb"WǹdqF%8vw0(99YmU"""\DDDDD)Spƶmضmw\\D亰u68yjE䚷m6^=4Mƾ:_xJ*z*"""(͸5mm3~}RTRF̋uDEDYY3-}zJaT\~}2ٺU\\v6v:QwkLO3tJ&_Es9+w!="}dwi˻[Ɠ7Vj0/|x&ىir<ɥ]Lk߂&aـIμ/K?5kQyg~ϱ &?|G^ZT{7}uqb$jݐ5а]?>ܚٯ /=q? K;X'5c}iiiL|sRLauadϼLx RRR<)""""km{b&Vữw8|Ha/KYY+}??̝:m0_)v>6Nu,}''̴MiXM/HVX r -@Ư YT{@߂o/>>n}yk81e omMs J_^T2~9BN`Z|06g"bYIz7` |º~MXrj֯̀6/9༼#7Ȟi52u$BBBEDDr1L~~~x{=v wಁ3X1Z5i{ikKĞ9I}yU5lFc[C>E~KLdif6@w':"']P&s+c1aF'4s``e[ 'z'rfd,<;7ʛmx| 8>0802_3{ې#9]9}acޫYTEMC _ԗ\PFQZ`Y*H2+)&jJK/eZtkM;}6F8ٷ%KǴ8r!?ggyDx0pҳ)5cbRI6LuCzEp\t 0q乑ZQaƻl<7 FPPw9.e}7Jabφ/g,܍Day󼬟5qN5Cq֧Y`4ڙ3m!fA,Eܷ_-llw,b/{LMsr?I8pK#FQC >C!׾ x˔`vw-HD,ƶڢ>)Kgx,ӕ]H㫙2b*Y!);|Of?J#5%4}@dŜw/#r |9Erw-x3}Ōe6T >²;roc 82)=黺 G=F RSHI= :-}K>X{3Vc5iV# 3e`ww``ӬZ[opxl ~O˶mx{}u@3.'N aD+G/n;(hbH#? t&7籑=2/ ړc$FuidF'JFy/ V;݄KdlWS :C*AD^#nH^pt|GHexvb}QǖzyA8Aa7Ҵ~}*6q$~ 'G˹gwοr%wؙ-EW^}!f1ڽ<##q_㤇.#U3{',]Fn뜕rc^+&/a&79\^?W9ֻpߜm'rl\\wϳdUTϞy1Mcүo~9\{\Df+W_߾ y%,b/+\g\D䚗52bT%`""".g^7+\\D亡"""r\EH.kULRRw k. *(Uaaa/HLLb}*T{kDDD)\En5o3  (HDxw0,2"";ߣ{\DDDDD)Sp"""""">OEDDDDD|<yѣ;q]%""")ä@)TػJ&ѣQb¼E:ew$&&w^;r(\ENR {Wu,<OEDDDDD|<7tlͨ`xxk{{ȖXĬy }y)57wⵏ|4IT+I-fMfٮ+]OWz{""""wy勮Z69=$ <к lDV7gH1Yʶ#*ѶU͇s6KȀ6r4m'm " ?[؍|8a _m>FFP?}U *3?fWX+3id?i\@8sLs&eH'iqc`1{c8G3xp;ʅ؜^ҏ[b F1oi47nN:m O>N gy[%&Pl- a`\}ߘMȼr0#2mDM6LǸ'Hm 32a8I}7?eT+Voo@/y:jzn/DDDDJь`N|;ش=Nu[(Z1-k7gٸv/Y>0azvƒex$f/2)ܤZ@/_qjڇ6 ޝSc>7%d^Nb;(]-Yʧna %,_:u1$~Ltyo##x|(}i+Nm8j m˳3OURVe\hW,_<wef'v.SMl[-*dr y))KτI;]e.B͞՗1QZȁspWKX9l4;QŹREJFGDDDF^WfUcۦ?HU(5pӎ鴓ÿl&|5*u ukPa:KaXҝjPP Jmyj!8S=?;+V%Rc;*3ҭXŲMi6a7Q `FVf bOn\n6o%_tpvv]ֽD,bcbH5mdn"#ʦOIDDDD(+$J ʍ%NcV2~Y;jTYs/srȐ%{^ne038o3/F ?2Y1'_H\cuȤ7bfvxa`uP""ĞdN']ݓY Mc]tA;m` ľ˞"2O[6p]0ܞtbDNR{X4*a&%j"t2~B&!. <*}90fFq |g08s/̊*6e_Ipi, /OyY?k6`%kއ|Op&(n*!ckvK9-:W0ש̩ǵTl9syz%^{vǤD?q(QhaDEs)mDmAsr?I8p\-:)#ȅfeDDDDJRpRTT u*f7֡VXf1)_@H3K~K4816Qx4Nϼ)FrxjނChW|ב1]]2F>KpGt#/?+u룏#TmTSsIފww`зh(/o<)/7<@S7vώa$\\}nғNSh~^\9_mpjLmyٛ=,e{θ=lܰ-EDDD*80Sn띯,OVx2sylMe?X|U 9iXr? ,l,m8pa:8{1&Fz˲7goƶlY 41 w;l;9uYl:\4eeuɔX׵-\vc3 ؆y럝9owde`g/32˲6e^}_6o^:*њR? ѡqC H |8Xve.;clgeC>Oe,Zv.08 10ޥ+: L3izvFnni\pe/f3)9wO2.<Ϲ,}U1#u 3e݋n$JSp"""""">OEDDDDD|<y ."""""\DDDDDY_"""""">OEDDDDD|sx(Sp"""""">OEDDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."""""\ Ӡ]DDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."""""\DDDDD)Sp"""""">OEDDDDD|<y ."WaE"""bhOEDDDDD|>YDD|eY/NŞ"##ûZD7_^nfLSsWvEFz~;"">'==]QtjDD睊=EeZDOҥ9{ ۶oPpA@wO W<y ."""""bWP ;2g{Tcҫ? jAz LgpsYl8b )0\h|m;eQ ƥ9Vp4"""""5 .Wӆѣ&8m-{?z/"ݻ꺕ƏcȊt1 ˀ%t1{L|!6nLo7m5FK~ysab+VoT9uDu{maYvV-Mk߀#GrOhP '{W fTJGo|Gཆ8r4]_dmfo W 0i,f#v]2z-K`q|T{KR L{3c1ON#|T<&Ϗ_ IFz?.cw?{I*\V=dݏΓW)O]%IiO cOS!ȫI""We +%1!旵2ؖ彊ӛУ ܉>Zķ'iS$ޫ?`Zsgrk|}o˩~b겓p$8n4[S,N;˻]O>V-+ppFOz3s~W&_?>#C|*Af6q+?] xsߌȊ\zJ-(is`(MF| %yu {| `)Ou_$ WW{/3tJ<*/gSFa ZW:ZΜ9]å#?3-K&06##|>*eȇl(E |W[96`ӟJ ђ)&0z cXj[:y;ªw1uo)ՠ+{KL[' H d*Obx2d(ˇ`nѓ8vyol3AkW ~I0掼1Vo2QϷ;XOz3}Tl9FɍwvO+u[i᧸y,CFDY1MY?Hjo}=HA _ d؝ -w}4*89f*NZoqm}%<WlNoqf`+ҦW 8{b}ᔼwChaV=AF]ػ7NacxO;6Zް>v 'Ոƺʇɝ>O‚xjT.biyO'AX1j}$7V4 TciT_97h(^m|ַ!ۖ@u啀c<-0&,:J%1"iތoG cs8l[R6bMʜ71M 4_1C mnte[D٬Jԭōp<ކ>sDQ2Umk>}& $~Hnj܆Jb_q.?43tI?-<{e?̛[ ]Lu'݇ۏ7auQ2k2j |ѻx+pXXpg|E͊wƺѸws;qm 0bxo0iex+&`f ě㭇OMx`v B.:rtϝ?n>W;(<;:~#^~5u^3fwϼ73߸'Tn"c"gו3ҕmsj|}axa{,~zliymKXΊWqQx鳘1]<U_ڟ;fk_pxBi9x譏ɛO@SyCqu'F:ig;߻wG<&avw>7Éi={?B=Wv1w07vxx8 8pQݸꉵ9E< ?qx2<އx?yibk{ _O??w>7& [ko|/$iWzE:)?_1]Qp̭xiē~ s_Zׯ]^w'H2|=e(> wf6oƾVں <9 : #{x_ܹ[ːjXl:ڟyѯwip-V#Wk9([5zzaR8t?[|, j:tK/'OO?,1yd\zlZ(~6exdزqnވG_k>h,2rl䢳 [3|l0N9koY:o>Ӱ'bP0ri`/1{a*៲V Wa옎`Ʋ8} X{ Ƣ˷1kc~l*F'~ँKB2t\A蒑߻38l®c`l3s`߱!BŦYqޡ=fX;|6~ ޙ)H 3`7`ęcHNVz_{0l3,g 8|_qY >\6O{ipR:sx3A8OR#]g,G' 6l ={`K¸[K "7hC JlkXEɲ(||E<R`ӎ(?)81Sq˷q7\)ǂTeLR,AkD,tH?4^w|+NS/¡NӳONYzo+\;DmѐqW6h^TrWz^Ef)7Ok-;Pس.t+-,`f6m|d((D>6cc[ :"[1[QAc0R?{3F)f2c퀔zW\lwEWu+y]`o]_QY] y6ՔxS tuCӠr9'„R:aEeRp]\ TŕcEvw*P3,R|vΫp@JE@𙄊~|5|Q~53B߬tF^+F)SW<'N .;i0r:v'WӉЦblG~z}!Ǧ: z۹bc-pQF^=~7c0 nأ̩z+}z_oQ8HE*]ʶfs16g C狛Pq2Fc!$<zo8鞮8{Ƴ6csFKUuyn*tZrX,̒U |kbzr=h<IՕp+霧] pkX\N9F 6@|KyqQV Dl*Ez`EiDR\^j}hWnĵ5Oǀ4бcTVjMʊJwXYM ϧ_{/N O3OwQuOpZL|'2¶JЛ#Eo^J`ظ4`^\4p|1\Eaq7-`쎡ӏwV#]S6] []EX\ 7Í,pףzd@7:f^h6=]"oC.h mTтaŶu-g0rq}1B,XpP?)v%2E;`H\>uFDвڦn σ|\t17Mjx8ܻ4|.:ר0~(ULܿ0a_ɠM /梨"?v֡yg=?6 ŨūSuEޱ,tMG3s( {~6n@t|n)=9yHz^xt90EX_zQy}q#5rP=G#OCɂ`UW1Lc-W/B^M- hFnkQ="Wa[Pd!'Fq׎ aChtFN8?!cUݱGqV>.mg_dP* Q 59ZH(/C ssce#'C@#u˷bkMbߨqdqYOዳ"sf¸/޹F{(vE Y%Fv U.ǴŸꃰ:ک=S"}FǎMlDN5/'NL0MK %j^ {Ca 섓;[^~PUQ╿◕e@1z|L{rᖯO{kĜ_Oj&|_?e7#T ?|$vZ~Uj(_^dB3@ T}<?(iͨuKj UVD~R!8̗XS */uWa[:3QlVU(R m n`0>2>欯 5[W%őB46.e%pa#@s(8/>5wLuw4Fx<hTaƫ #QQ֣xu&p6a/˱ŵ( X:r}xyHm˨1gKxhlu8XhV=S/VW8p6a QGd'ŜÑNBuM#s( :;f w4wY,7ukպaQ{$^u BpPv Vnua@զo'^v0<,*w8([+}UsQlx F7~j*7a;?F0y%CScNZ+ ^o\f~x |_e>Oa՗| ڹs)?~Wz6vP2W! =Wg[J>zoʀU/\{^ɹw]>9(++Cye \?7W!mV9/3a7YX}zE <7|3nf6--3J`^\<ȸ3nZ:=G? [SY#N\ݽNy"?n&zs2n,X5ػ_~"][GᲉb/F₽3ٽNkpgIt/\~Nv-U8%p:vcn¤ Ŷwոx t*Pqݓp|pspǤ3qZvq>\ޘsX)}q ~qI\e# v5ʗmÑ`ɸ` :l^vɵJڞ80?{)Oߍk9+Jd^gވ;u/2=_JE 8:\7{[oC=17`wp#B#+)G/؀A8ƉS%VWދN#ktÎ\ٽNqEptx$?^.8*'U #\ytnףBo{d*.:rK<= gݽ[;^n349 ! MY}Xwm;>qt(cU9C5{-@ ni…y]Ǹz,֛[~|O}'i zy [4U1MK85"enpܺGli O5*se6-&9DX:8 1<\lxzѸT6-DoםSqxjPeaPwNm..n+DD̓KuNpiq (Rᒩo*hQpR/ #ODDDD %`.G%xwQ\ظQcBDDI/%5UU^ODVTUU#%5QظQEZRUU-ZNYM.Q޽֬]W^MHKKCv0;)j$6.DD ,BvlB!&"J:@YYYΖ)j$6.DD,B0D0)""N3.DDDDDظQcBDDDDDI %=6.DDDDDظQcBDDDDDI %=6.DDDDDظQcBDDDDDI %=6.."""""J2v߮< l\(yo2DQ+CDDDD{t[ 6.qw2D,˒!Ұ#"""KavDDDDDq!""""ƅ"""""Jzl\(q!""""ƅ"""""JzcQ[]ױq_%"""vOֺmK|jhmgIDD())RB!(:ee! ²,'8`-/GY5s<2R5#Xgێ`(Pj(RSS9w;yNvS'E^#""Jj%%%(/@N0V+8VZ f.X5e)mi!Y3 ,ZU6ldƢE h" iL76]C9&"Rdfeii۶%y˱g߮lZ!=5=N2 IDAT`rj`cFFHKKEi&nmnKz&ĶھP(Ro i,S2L>z]uu5Re|JKKk[Y&8.H챈ZSj[Us'x"Y&^""""&Hd͛$\6.M]㩇یdj\zwQ2[]祩'T25.]GDDDDoKjи4$yb#""""J&jXu/o0ٸ4k{剈UZ+.]klٸ4h'3Z-[o? El_/oޓ0SUSqӱ2C-Y<9Z̈79[K6ZMJ㢋vr*.ꅔq""ـyP??NEzV >]aԐ;}`*&<=7/8Cv&s˰gK3Ek鈼^0/p~:aj^+D%h\\ XMy cDDD턋XYl[|t;Z׾*P̝ ZNG mòkXx ^%~yr\>-c/ y> 6(ml+/ŻZq15ud\x^q""6E"X EgG #{!K,ekۂQ\ZBz^<Pb"l~CwGz`ʟt 6b< +hUS1ᢟq+wbzNuoF cB? O=2~ZU 7%{K>]Xv V; 7 nA8awY>zv=,.w <};z>Voކs͸QٓǴaܵ(KϾ732r9fHʲ ?u{d,ae۰?o\+^"qvO*|=m:89[>5aڭ ?wcwb YW4_=ۀ3{s0/g| Tʘ>@I|[b, 霧]q pQ@h`|Q:[~C9̾ U=\c@ֱr.|5R\kE=YW__'YטrX扈 7}*Knr7E+y=5s%Vo, 0 úe"}ő**t@җ|B֐(nGR2r׹^aҰV.^RbױWc/ʏ'I@ĨH{6n0pKݟ׾V=7'߄sp=*seEjK^v:禣vl[ޜ"v(̮}Zם17, , JNC[с\k/|X;6g^T`ՌQ耴WcTg X%׶sV'sØq<_ͨѥ(s8)8Szv;p;WCɸXWf#ospה3ˈ+qEI㑵ep:a[ y' D}\V2x%fjLLbz\+=jжr8 }u%guQ3Z|9tɗaÆ ѧwo継a, zf͚#G|o2{l19gW3뫪jț@H1(7jL8 [5652~c4[żi+Dcql""""D5 le5ɸc&1%Ds4.MazN|bŀ!Q[X_SL2c'!: c.̍J%3Y5[-.ZqChd˱\kڪܗ-VW:NIt牚Ș+j:..k=""""&7Qc}+:s-эK,/cr|!V՜'"""Jwm!sk6-ݸ"~剏UX7""""@ֱ~2yJt¼N.˱5@ r@@H Fɧ2RcTTUU0TUUTCկ&:}d%l\24<_4W[5v"756QuBii)6/qsJK)+1 `XUQS9ˊ0 qŋZ(*,^2}I-cuV'"2rS9D˵N$5`0()ٌPEu<:ee՞hVn+PZ+/ꐂ9طGL5н{])-- ltCul(j,i7j\qQQT\qFqd"""˲E!5^N0, sJ %CvduB0;[, :S @VV}gYʱbZ'ɜJ^ F#+2VM/0vdl<e!'D3xe! F ׸c-cz.VmU܏:*? *.FbjQ[BZO+eF[Ioh\2 ʱ<SeCDDDD赬qUNdNd%l\b=i=/OV\޼2';N""""dYVūޕqEDʱI|5g"z¦IzEEmե5u%3U5^?Nu^q~̔opQWEh2/ """"j-z]땓Lq}.sI9N.\V^YQcWz kqeM,b~^ǖ0Mi\ ƴ;ov15'""""j Bsmsu\7$q4JSDvr'N|!7""""6cz+s[UKE?$)E{LE* |,uPd mKDDDDT-+(2ݼxZ$VY4w㢞LdjL ZxU+ނբ/΅oWZ`Y#bjXT\ZbNƽ^ixΔc6[v5Fm-5V6V͘Zrm\;OOOOs]W-<%2W[u]Xq`EWO 1Sc}ZODDD=1^EW. }SLoԸ把9yDz,sԨmduU%dYSQQQȫ0sxzN32Nx5r*brz\gbEBZim?9'6HNV .%#siQTj:de#Lo`T\)obDDDD3U)oRƁE'U>כ5w5-"o?h[\⦱~ͮ9"+5[HzNn4Twr*^SZgOuWWXL[/M%37mSc ț~C5MŽsȘ#2V[9o){ś9x' i}nʹbYȹzՕ1PMSUjWހŊSUsd3Ly"""Lj^)jEE5X)qSM6/zLGz^^7NQqyﺄhŋUbzFVVVz7N?uWS+28Yћ|u\uEǧrsUs9Vgz]gYKʜ^?>Wj$T\6*Xu&}?XXeLU5\k~ӃmEcUqbU[TN5$ꪊ cbzE~*fi1#[hc:|M7mĔ7ňtN:Q)FDDDcS(ZOi T~Z7%Q1D6VT\ɜdl\\X^p'O_+OڪVϫ\5-Ad: /*5MMSq}+r5VL1"""@S}(rU[Aքr.J "1^~&d^ռUt"Z?9FAŝHLћyeE5*jϺfF5}#SGjDbꦺdWs=Ϙh{$kEcUO9S܅aP͇כ =nj鍊O5-Zy|uSeLј}bZ\rNP@(6$j j2XBЏ70ɫ㩛!~XyKDDDDm>ɼNd^Ղztӛ=&禜Wc>6TދɹOj\$ iӟ>WcCd.OW?߼quMF5&D_nUc V)\ʱ\3Ś]k4..j~r} '\56X[ }% 6VV7Uurh9/ه5jXc*eL@VT$زĺd\棉gmBd~z\ADzsjޔ͋ WBTFrjl`XQsuӏmZ+z^15wQ[0u\ܪ~j$T"+6zN-"[AS4o6n\\W ֛b@Óbi1‰ZN_b6ꎩ\c5t^s"""퍬GLnP1Drތȸɸ~|66UL2Mh]UX\jS\^9+2׺4ȼzec^`u%EN>\Wk\i,~ų-@u˱cƫaP]q5ocbX+/u:S 7n\ iWsurIP4s@ 2wdtzcTLxz[y u^W\Qyj75h1ШzZ\̙#܍uz\\o*f:iʘ̫ɛ.DqVk2Vs:s)VUH˼+z!o*e\]ySTbjFM_ s+ȘcXn$15 e sb2/eNi.1Q Pw_u6FTVхPX,5 +b1%@\jyӟ)\TL%DDDDm"ת7ɵML9:5 zXG]yjEa/sb@jP͇Z_qQSW\gSGA)[S̔bʛbDDDD홬sLXnM17J4h Ws5Hx)*ZqqQWTcO.Z\WЯ5j?81ɜδVXy;nZ"""d hqSq=qSͅf+7(^W^߸G#mq*\WL*hq3LŊ˭W#yʼn(̫6"_#xcci+.NJӷrlZW\q.VC˩ շ2ȸWKSDDDDmxj.kdNW֙bUs=&s\TL&n\\/eq-N:SyQ&2C\X>X9KZ"""d khs^9jnZ'2+iŴN+fʷD-UENUs9c~Zyb͉Y{eh5ϧxr,r^c)Z'p,-aM˫3жjɱ)%Z>Zh{:Z9Wc=+XVq|Itxrwn*/ޜ̫qWN˭+2k.w m56|i>~sz\sil--Dю- zSLiy9'bjk_Ŕrl$j ST7fWS )δ0cKť9 _h1A&Ĵ)oI2kxʼnex2kSL7qӾ^h..] s|kM뼚Z{Xkl+4e_"""d֔B9־^y,xu^k:5u@|kl<Ǐg-p}yu2r}sūKŚxƥ\w";EkTtɹ'"""U˸ِ9;zx里d.޹i)ڛӱ3M1Iwx4d}%bŚ5c:""""ߢ:Ewn"ĚX4ͽQZ]191Is㍕m/]h{197119̱X'oz{SoqDDDDxjhyS31ĻO뛤 x7~M1/F#"""0.ZN25ŀĻ_뛬5()o4f""""j]UIT܏ۘ}5q}cE+爈Jtx^98=Gco> EwcCcE;F<Oj1_B$Kqݔє}u+[ijG<Ք4e߄H))J~wڦh!"""Jv-Uls?~]GSՔ}*Yܦ<MǍwDKTq]WS۔}E2M}lMߏGS%"""Ӕ)h͢-ωz:_-}$!"""Jd+[$ufіD=D'1Qd,uf zu\""""Dh梹pm`o'"""">~µCKm_ZhioZKDDDDmCk5 u מ d|n1Hd[!=_""""jebB瀈چI1a1EylLEw&"""j_،;`3IENDB`kraft-1.2.2/manual/images/en/kraft.adoc000066400000000000000000000755461467704360200177400ustar00rootroot00000000000000= The Kraft Handbook Ronald Stroethoff, Klaas Freitag :toc: left :doctype: article :author: Ronald Stroethoff :email: :description: Kraft is a Qt program for organizing documents like quotes and invoices in a small business. :keywords: Qt;office;bookkeeping :experimental: :imagesdir: images/ include::locale/attributes.adoc[] == Introduction Kraft is a Qt and KDE application to organize office documents like quotes and invoices in a small business. It eases the creation of documents and helps with repeating tasks. Using Kraft, there is no need for fiddling with a text processor any more. Documents are created by a few clicks, edited, generated and archived automatically. Kraft generates high quality PDF output for printing, mailing and archiving. Feature Overview:: * Simple creation of offers, invoices and similar documents. * Customer management, deeply integrated with the mature KDE KAddressbook. * Maintenance of document relations, ie. Partial invoices vs. invoices. * Templates for document header- and footertexts and for document items. * Pre calculation of item prices. * Material management. * Configurable document creation in PDF format for print and email. The code of Kraft is open source and is released under the https://en.wikipedia.org/wiki/GNU_General_Public_License[GNU General Public License]. NOTE: Kraft is driven by community of users, coders, artists and others by voluntary work. + Also this manual needs contributions! + + Learn more on https://github.com/dragotin/kraft/blob/master/manual/Readme.md[how to contribute]! == First Use and Basic Configuration When Kraft is started for the first time, it automatically enters the initial setup process. During the initial setup you are asked to select a database to use and give the name and address of your company. You can fill in your company address (that appears on the printed documents) in two ways: in the setup procedure use the first tab *Select from Addressbook* for to select your on address in KAddressBook (if you have filled your own address in KaddressBook) or use the second tab *Manual entry* for to fill in the information of the address from your company manually. This step is necessary for the correct generation of your documents as the address is automatically used in the document generation step. image:company_adress1_EN.png[Company adress,float="right"] After the initial setup, select menu:Preferences[Settings]. That allows to prepare Kraft correctly so it can be used in a proper way. In the Preferences dialog we have the tabs: *Document Defaults *Taxes *Documunt Types *Wages *Units *Own identity Each of the tabs allows to enter useful values for the specific use case. === Document Types At the first use you find a list of different document types, such as: * Acceptance of order * Delivery receipt * Invoice * Offer image:documentype_EN.png[Document type,float="right"] Translate this types to your own language. You can also add new ones and remove document types you wont use. ==== Numbercycles image:numbercycles_EN.png[Numbercycles,float="right"] Each document has to have an unique identifier that identifies the document. There must not be two documents in Kraft with the same identifier. The format of the identifier is configuratable in Kraft. For that, Kraft has a concept of so called number cycles. Number cycles are used to define the form of the *document number* which is printed on every document. All documents of a certain type have identifiers taken out of one number cycle. Each document type has a number cycle assigned. Different document types can use the same number cycle to generate ids from. That way, for example the document types Invoice and Final Invoice can use numbers from the same number cycle, even thought they are different document types in Kraft. Number cycles are identified by their name. User can create new number cycles and edit them clicking on the button btn:[Edit Number Cycles...] The format of the document numbers are defined by a template that can contain normal, fixed characters and also some variables that are replaced by the respective values when the document is created. Each identifier needs to be unique, and thus has to contain a counter. Kraft supports two types of counter: One (variable `%i`) is incremented globally for every new document. The other (variable `%n`) is reset every day and starts at 1 again on every new day. In addition to the counter, more information can be added to the template form an useful number. Examples are a constant text or parts of the date. The default numbercycle delivered with Kraft contains the year, the month and a serialnumber. That way you can compare offers or orders from last year with this year or the month April of last year with the month April of this year and get on this way an impression from the results of your business. See the following table for available variables which can be used: |=== | `%y` or `%yyyy` | the year of the document date. | `%yy` | the year of the document (two digits). | `%w` | the week number of the document date. | `%ww` | the week number of the document date with leading zero. | `%d` | the day number of the document date. | `%dd` | the day number of the document date with leading zero. | `%m` or `%M` | the month number of the document date. | `%MM` | the month number with leading zero. | `%c` | the customer id from kaddressbook | `%type` | the localised doc type (offer, invoice etc.) | `%uid` | the contact id of the client. | `%i` .. `%iiiiii`| the unique counter | `%n` .. `%nnnnnn`| the unique day counter (combine with date) |=== A number cycle template needs to contain either `%i` or `%n`, if not, `%i` is appended automatically. Both `%i` and `%n` are numeric values. They can also be padded with with leading zeros. The length is defined by the number of i's or n's put into the template. For example, if a daily counter with length of three and leading zeros is desired, `%nnn` has to be put into the template. This works up to a length of six characters. ____ NOTE: The "design" of the numbercycles and document numbers is very important. With the flexible system of templating Kraft can not prevent invalid number cycles. It is in the responsibility of the user. ____ === Taxes image:taxes_EN.png[Taxes,float="right"] In many countries there are two kinds of VAT-taxes for sold products. A high level and a low level. Fill here the appropriate amounts in for the high level and the low level. If the tax-level is changing, then you add here the start date with the new tax-levels. === Wages image:wages_EN.png[Wages,float="right"] A list of wage costs is maintained in Kraft. The items are used in templates and during calculation. All data can be edited, customized and new items can be added in the Kraft Configuration Dialog reachable through the Settings menu. Remember that these units are later used in the documents, it is therefor important that you translate them to your own language and to fill in the correct prices. === Units of measurement image:unity_EN.png[Units of measurement,float="right"] A list of units of measurement is maintained in Kraft. In Kraft Configuration Dialog reachable through the Settings menu can you edit and customize items already in the list, and also can you add new items to the list. Remember that these units are later used in the documents, it is therefor important that you translate them to your own language. === Own identity Check here if the information that you have given during the initial setup is correct for the use in the documents. ____ WARNING: If you made the choice to use the information from KaddressBook then is the information from a later manual entry ignored. ____ After we have made some corrections to the configuration, we go back to the main window.Here we see three tabs: * Documents * Timeline * Catalogs == Catalogs Kraft supports so called Catalogs in which templates for document items are kept. With the catalogs creating documents can be significantly accellerated in the day to day business. When creating new documents, the items templates from the catalogs can easily selected and moved over to the document. Since templates are organized in chapters entire documents can be prepared in different chapters to be used as template documents. Of course the items in the documents can be edited after they got picked from a catalog. By default Kraft comes with two different catalogs: `Material` A catalog of material that are sold, with their purchase prices, the profit and the sell-price. and `Standard Templates` A catalog of standard recipes of work like planting trees. Both catalogs can have chapters and sub-chapters for to organize your templates. First we are going to fill in the === Material Catalog A catalog of material that are sold, with their purchase prices, the profit and the sell-price. First we are going to add new chapters and subchapters. ==== New chapters Select with the mouse the column-name `material`, select now in the context-menu [Add a sub chapter] and add an extra chapter like `Trees` ==== New sub chapters We are going to ad sub chapters in the map `Trees`. Select with the mouse the name of the chapter where you like to add a subchapter, select now in the context-menu [Add a sub chapter] and ad an extra subchapters like `Loaf trees` and `needle trees`. After adding the extra chapters and subchapters for dividing the material, we are going to add the material themself. ==== New template Select with the mouse the name of the sub-chapter or chapter where you like to add a material. Select the sub map Loaf trees and select now in the context-menu [Add a template] Add the extra materials `coconut tree`, `apple tree` and `pine-apple tree`. Fill in the price that we have paid. Fill in the profit that we want to have on the material And fill in how much is in a packet. image:catalog_material_EN.png[Material catalog,float="right"] After this we add also in the map 'Wood' a item for a 'support pole' for later use with its price. Now we are going to: === Standard Templates This is a catalog of standard recipes of work like: * planting trees * cutting grass * transport costs * planting grass * sowing grass-seed We add here the standard work of planting a tree. Select with the mouse the name of the chapter [Work] where you like to add the new template, select now the context-menu [New template] and the extra templates `Plant tree` and `cut grass`. After we made the new template, a window opens with 4 tabs: * Template * Time calculation * Fix costs * Material First we go to the tab: ==== Template We give here the name of the new standard template like `Plant tree` image:catalog_standard_EN.png[Standard catalog,float="right"] ____ WARNING: be careful, this name is later used in the invoice ____ we select that this is per piece and that the margin is 8% and that the full VAT is applicable. ==== Time calculation We fill here in a number of work with the time: .Spent time [cols=",,",] |=== |Dig hole |32 min. |worker |Place tree |12 min. |worker |Fill hole |17 min. |worker |give water |5 min. |worker |=== The cost for worker which we have earlier filled in is now used. image:catalog_standard_work_EN.png[Time calculation,float="right"] ____ NOTE: in the invoice we see later only Plant tree, we will not see the parts dig hole,place tree,fill hole,give water ____ Now we go to the tab ==== Fixed costs and fill in: .Fixed item [cols=",,",] |=== |Transportcost |35 euro |1 pcs. |=== image:catalog_standard_fixed_cost_EN.png[Fixed cost,float="right"] After this we go to the tab: ==== Material Here we select btn:[next], after which the window [Add Material to Calculation] opens for a selection of material. We navigate to the map 'wood' where we select the 'support pole'. .Used materials [cols=",,",] |=== |1 |support pole |3,5 euro |=== image:catalog_standard_material_EN.png[Material,float="right"] We go now back to the first tab template On the first tab [template], we can now see the overall cost per one unit Click on [OK] for saving the result or on [cancel] for discarding the result. We make a second template `cut grass` we fill in `cut grass`, as unit we choose sm (square meter), on the second tab we fill in that we need 3 min per square meter. Click on [OK] for saving the result or on [Cancel] for discarding the result. We are now ready for the first invoice. [[Invoice]] == Creating Documents === The first Invoice Open the tab btn:[documents] Click on btn:[create document] The window document [creation wizard opens]. Select in document type `invoice`. Fill in on the whiteboard content a short text about what the invoice is, like: `cut grass and planted tree for mister Jonson` Click on btn:[next] Select on the new window the name and address from the client. (if the name and address is not there, click then on btn:[new contact] or on btn:[edit contact] if you want to edit the contact) Click on btn:[OK]. Now opens the window document [items]. this window has 2 tabs and the 3 buttons on the top: * btn:[Add item...], * btn:[Add discount item], * btn:[Show templates]. In the left tab you can see all the items that we want to place on the invoice, on the right tab we see the text from the header, the total price and the footer. If you click on the text of the header or the footer on the right side then the window changes in such a way that you can edit the header or the footer. Adapt the header and the footer to your situation, on the footer you can place a text: `We make your garden-dream come to reality.`. Click on the button btn:[Show templates]. The right tab changes and show now the earlier made templates, we select in the group Work, the subgroup Plant tree and click then on the button with the to the left pointing arrow on the bottom side. A new window [Create Item from Template] opens. Because we have planted 2 trees, we go to the field [insert] and change this to 2 pcs. Click on btn:[OK] for saving the result or on btn:[cancel] for discarding the result. The window close and we go back to the main window. We click again on btn:[Show templates] and select this time `cut grass`, we click again on the button with the arrow, in the opened window we select that the grass-field was 24 square meter. Click on btn:[OK] for saving the result or on btn:[Cancel] for discarding the result. We add now manually an item by clicking on the button btn:[Add item…] and the window [create new item] opens. Because we have delivered a special tree, we fill here in the name of the special tree `liguster`, at the field insert we fill in the number of the special trees that we have delivered and the price of them. ____ WARNING: Remind that in the catalog we can add a profit on the price of the material, in the invoice and in the offer we can not add a profit on the price of the material. ____ We have now an invoice with 3 items. Click on btn:[OK] for saving the invoice or on btn:[Cancel] for discarding the invoice. We click on btn:[OK] and save the result. Your first invoice is now ready for sending. In the window documents we see our first invoice, notice that this document has a document number which we can see on the left side. On top of the window with all the invoices we see the button [Print Document], on which we click. From the invoice will now a PDF be made which we can print on paper or send by email to the client. After this we are going to create a offer for some work in a garden. [[Offer]] === Creating an Offer The client has asked to plant a tree, we will offer 3 different trees which we can plant. Beside this, we have seen that there is a lifeless three, which we will offer to remove as extra work. image:create_new_doc.png[Numbercycles,float="right"] For the total price we do not want to show the price of the removal of the lifeless tree and we want for the total price only to show the price of one tree and not three. Open again the tab btn:[documents]. Click on btn:[create document] The window _Document Creation Wizard_ opens. select in btn:[document type] > btn:[Offer]. Fill in on the whiteboard content a short text about what the offer is, like: `plant one tree and removal of lifeless tree` Click on btn:[next] Select on the new window the name and address from the client. (if the name and address is not there, click then on btn:[new contact] or on btn:[edit contact] if you want to edit the contact) Click on btn:[OK]. Now the window [edit document] opens. This window has 2 tabs and the 3 buttons on the top: * btn:[Add item...], * btn:[Add discount item], * btn:[Show templates]. Click on the button btn:[Show templates]. The right tab changes and show now the earlier made templates, we select in the group `Work`, the subgroup `Plant tree` and click then on the button with the to the left pointing arrow on the bottom side. A new window [Create Item from Template] opens. Because we want to plant 1 tree, we go to the field [insert] and keep this on 1 pcs. Click on btn:[OK] for saving the result or on btn:[Cancel] for discarding the result. The window close and we go back to the main window. We click on the button btn:[Show templates] and this time we select in catalog Material The material-catalog opens, and we can select in the chapter `trees` the subchapter `loaf trees` in which we select the `apple tree` which we made earlier. Click on we btn:[OK] for saving the result or on btn:[cancel] for discarding the result. The window close and we go back to the main window. We add now manually an item by clicking on the button `Add item…`. the window [create new item] opens. We want that the client can make a choice from an apple, a pear tree and the liguster. Therefor we are going to add also a pear tree manually. We click on the button btn:[Add item…] and the window [create new item] opens. We fill here in the name of the tree `Pear tree`, at the field insert we fill in the number of the special trees that we have delivered and the price of them. We want add this to the material catalog for future use, therefor we select also [select this item as template for future documents] and we select in [save in chapter]`trees`. Click on btn:[OK] for saving the result or on btn:[Cancel] for discarding the result. We does this again but then for the liguster. We have now 3 items with trees in the offer. As last item we add an item with `remove tree` with 0,5 hour for 32 euro. On the left side of an item we can see 2 buttons: a button with a flag and a button with what looks like a page. We select the upper button with the page after which opens a context-menu with the items: image:context1_EN.png[Context menu,float="right"] [Item kind]->[Normal] [Item kind]>[Alternative] [Item kind]>[On demand] [Tax] [Move up] [Move down] [Lock item] [Unlock item] [Delete item] We choose here [Item kind] and change for `pear tree` from [normal] to [alternative]. We do this also for [liguster] and for [remove tree] we change this from [normal] to [on demand]. image:context2_EN.png[Context menu,float="right"] Click on btn:[OK] for saving the result or on btn:[Cancel] for discarding the result. We want to see the result and therefor we click on the button [show document]. We see now that the prize of the pear tree, the liguster and the removal of the tree is not used for the total prize. When we are happy with the result, we can click on the button btn:[close] after which we click on the button btn:[Print Document] for making a PDF what we can print out or send to the client. After your first invoice is now your first offer now also ready for sending. [[Acceptance_of_order]] === Creating an Acceptance of Order The document type "Acceptance of Order" is sent subsequently to an offer. image:acceptance_o_o_context.png[Numbercycles,float="right"] When a client has made a request, we will send an offer in wich we describe which items we will deliver. Hopefully the client will give an order for the work. It is a good practice to respond on the order with an "Acceptance of order" in which we describe all the items we will deliver. We can make the "Acceptance of order" on the same way as we made the invoice or the offer by selecting each item and correcting the number of delivery. This takes time and we can make errors by forgetting items or filling an incorrect number. It can be done quicker by selecting the offer in the list and selecting btn:[Create Followup Document] from either the context menu or the main menu. We have now in documenttype the choice from: [Acceptance of order] [Invoice] [Partial Invoice] [final Invoice] [Progress Payment Invoice] image:followup_1_EN.png[Folloup document,float="right"] We select here "Acceptance of order". We have now a copy from the offer as an Acceptance of order (do not forget to adapt Alternative Delivery items and on demand items.) image:followup_2_EN.png[Folloup document,float="right"] You can do this also for the creation of the invoice as a followup for Acceptance of order. Each document type has a specific list of follow up documents. It is a good practice to describe on the invoice precisely what was delivered. [[Customization]] == Customization Kraft can be customized in most of the graphical user interface and in particular in the output it generates. === Output Document Customization To create PDF output documents, the document data that was edited in the Kraft app is filled into a template. The template defines how the output document looks like, ie. by font settings, placing of elements and such. The file that is assembled from data and the template is converted to PDF using a special document creation script. All that is started automatically by Kraft if a document should be printed. Each document type in Kraft can have it's own template that is used to create a PDF. Which one can be set in the Settings dialog for document types. ==== WeasyPrint Documents With https://weasyprint.org[WeasyPrint] Kraft uses a very powerful HTML and CSS based generator that makes it very easy to create highly customized documents which fit the users expectations. The general idea is that Weasyprint loads html output that is processed to PDF. Usually it is considering a Cascading Stylesheet file which has a huge impact on how the PDF document looks in the end. To use a WeasyPrint based template for a document simply create a template file and save it with the extension *.gtmpl*. With that file extension Kraft automatically uses WeasyPrint and also the Grantlee templating for rendering. An example for a WeasyPrint document can be found in the Kraft package in the reports directory and is called invoice.gtmpl. To use a WeasyPrint template with one of the Kraft document types just select the template file name (with the right extension `*.gtml`) in the Kraft Settings Dialog. From version 0.95 on Kraft ships with an example document in the Grantlee- and WeasyPrint format. It can be found at `/usr/share/kraft/reports/invoice.gtmpl` or https://github.com/dragotin/kraft/blob/master/reports/invoice.gtmpl[online on Github]. To effectively change the look of the document `kraft.css` (https://github.com/dragotin/kraft/blob/master/reports/kraft.css[on Github]) needs to be considered. It defines most of the look. ==== Template Variables To generate the PDF, Kraft has to transfer data from the document you have been working on in Kraft to the input document that is processed to an PDF utilising WeasyPrint. For that, Kraft uses a text template. In that, Kraft replaces variables with the actual values. The syntax is based on the Django syntax for templates described in the https://docs.djangoproject.com/en/3.1/topics/templates/[the docs]. [[Menu]] == Menus and Shortcuts === Main Application Menu [[File]] ==== The File Menu [File]>[Quit] [Ctrl]+[Q] Quits the application. [[Document]] ==== The Document Menu [[Show_document]] [Document]>[Show Document] [Ctrl]+[R] Opens a window with the selected document for showing it. [[Edit_document]] [Document]>[Edit Document] [Ctrl+O] Opens a window with the selected document for editing it. [[Open_document]] [Document]>[Open Archived document] [Ctrl]+[A] Opens an archived document. [[Create_document]] [Document]>[Create Document] Opens a window with a wizard for creating a new client-document. [[Copy_document]] [Document]>[Copy Document] Makes a copy of the selected client-document to a new client-document which can belong to an other client or an other documenttype. [[Follow_document]] [Document]>[Follow Document] Opens the selected client-document for editing. [[Print_document]] [Document]>[Print document] Makes a PDf from the selected client-document for to be mailed or printed. [[Mail_document]] [Document]>[Mail document] [Ctrl]+[M] Mails a document. [[settings]] ==== The Settings menu [[edit_template]] [Settings]>[Edit Tag Templates] [Ctrl]+[E] Opens a window where you add, edit or translate the tags (like work, material, plants or discounts). [[redo]] [Settings]>[Redo initial setup] [Ctrl+R] Redoes the initial setup. After this, a restart of Kraft is required. [[toolbars]] [Settings]>[Showed toolbars] Here you can decide if the `main toolbar` and the toolbar `Document Actions` are shown. [[configure]] [Settings]>[Configure Kraft] [Ctrl]+[Shft]+[,] Here you can configure Kraft. === Document Edit Window [[context]] ==== The context Menu [Context]>[Item kind] change the status from this item between * Normal * Alternative * On demand [[Tax]] [Context]>[Tax] Seems not working. [[Move_up]] [Context]>[Move up] Moves this item a place up in document. [[Move_down]] [Context]>[Move down] Moves this item a place down in document. [[Lock_item]] [Context]>[Lock item] It is not clear what is does. [[Unlock_item]] [Context]>[Unlock item] It is not clear what is does. [[Delete_item]] [Context]>[Delete item] Removes this item from document. [[AdvancedTopics]] == Advanced Topics This chapter describes advanced topics around Kraft. Some Linux knowledge is required, and setups should be done by experienced Linux administrators and should be tested carefully. === Using Kraft Collaboratively Kraft can be used collaborative in a distributed environment. That means that multiple users work on their desktops with their own Kraft instance on the same data. This whole topic is a subject to change, as Kraft will evolve to use ownCloud as a private cloud solution to store the data. ==== Sharing Database and Document Pool The simplest case is that two or more Kraft instances use a database together and access the same pool of PDF documents on the harddisk. For simplicity this describes only two Kraft instances. A typical use case would be: Two different Linux users want to use Kraft. They both have their own computer but only work in the same network. For example this would describe a situation with one main office machine that runs Kraft in normal mode, plus a notebook with Kraft in read only mode to view documents, check catalogs and such. For that, the following prerequisites have to be met: 1. MySQL or MariaDB is used as database backend. Sqlite is not supported. 2. The database is accessible with a mysql user and from each machine for both users. 3. The document store directory has to be shared. ____ WARNING: There is no protection against having both users editing the same document. Because that is dangerous and can lead to unpredictable results, it is recommended to run all instances of Kraft except the main one in read only mode. This is done by starting Kraft with the `-r` command line switch. ____ **Sharing the Database** The database server should be installed on the main machine or a dedicated device like a NAS. Networking speed influences the comfort to use obviously. Find howtos on the internet how to setup MySQL accordingly. **Sharing the Document Pool Directory** Kraft writes generated PDF documents into a local directory. Where that is can be configured in the Kraft Config file. The config file has to be adopted on all instances. That is located in each users home directory, in the path `.config/kraftrc`. It has to contain the following config value: ``` [reporting] PdfOutputDir=/data/space/kraftdoc/pdf ``` There are different ways how share that directory, ie. NFS or SMB storages. It is important that both users from both machines can list and access the files. The main user needs read and write access, read only users only need read access to the files. A recommended setup is a NFS share with autofs which is set up on the main machine. To manage file access a certain group should be set up on the machines with which access can be managed. **Starting Kraft in read-only mode** To start Kraft in read-only mode, start the binary with the `-r` command line switch. === XRechnung Support Kraft supports the XRechnung standard. That is a digital format for electronic invoicing, and it passed as law in Germany and follows a EU directive. The XRechnung is a XML file format designed for that purpose. To use the XRechnung Export productivly, a little manual work is still needed in Kraft. Kraft creates the XML file based on a template, very similar to the normal PDF documents. That means that it loads a template that contains static elements (ie. the company address) that do not change between different invoices. The dynamic elements (customer data, items etc.) are filled into the template during the generation step. In order to generate correct XRechnung files for the specific company, the user has to adopt the template file manually to the companies needs. Note that this has only to be done once and should be easy for a person with a bit computer experience (Basic knowledge about XML appreciated!). To adapt the file to the needs of the company, it is best to start with the https://raw.githubusercontent.com/dragotin/kraft/master/reports/xrechnung.xrtmpl[example XRechnung file]. It has to be downloaded and saved into a location that the user can edit. Open it in a normal text editor, such as https://kate-editor.org/[Kate]. Read carefully through the file without being scared off by the XML format. All user strings (ie. company name, address and such) are user specific and should be replaced accordingly. Find https://www.xoev.de/xrechnung-16828[details about the format] here to better understand the meaning of the fields. Make sure to not disturb the proper XML format and do not change places where the template format `{{ template_name }}` is used. Once the file is adopted to the needs, open the Settings dialog of Kraft and insert the filename into the entry field for the XRechnung Template File on the Document Defaults page. After that step, the btn:[Export XRechung] menu item will open a dialog to pick a filename where to save the XRechnung invoice to. This file can now be transfered to the receiver of the invoice. NOTE: There are validators for invoices in XRechnung format out there in the internet. It is useful to verify the format of the Kraft exported XRechnung. [[Credits]] == Credits and License Program and documentation copyright 2004–2022 Klaas Freitag Documentation copyright 2020 Ronald Stroethoff kraft-1.2.2/manual/images/en/number_cycle.png000066400000000000000000001416561467704360200211520ustar00rootroot00000000000000PNG  IHDR 6ܽ pHYs+ IDATx^wx̦'Ы \)R" 셫{XQԟ rmXAQ;M{MB);?NNf6&x?ϳϜwlw' !B!B!B!B!B!B!B!B!B!B!B!B!1 %[!UcDŐ !p#z9HX:9FB!=).!BTú@?܊ !B,P.Hs$BUTnZAxρڮB!De;PEn ce=ڎB!N8Xʊ_!pQrEu[YQ[Q !B*`y`*<њ'> !T hSPC}<핦B!JjdeOy*DU.ʻo]?FyB!Y7\FyׯU,~gP"7|/њG!hi~3oy֭U+g]SsGemG!Hnny(\Y7JV(Ϻ)mQ"B!䖖Sx3Oy֍Puʺ.ƠB!U]ijyCsu8EbY_utC豲|B!.8C5c(eY'*dWmekhCdHrB!IIN(˺eYTv#W֋$*7Ԙ.x7--DžB!ʪB3Ըۘ[̍[^1:Ke|n/|p_nj}p1UB!'څ|nq3fݸ1DNeVE\ۊF+̉_pB!+"2<̏)P*:L*t;͏3"qqJRBQu0,m=q̉3"헦#VYZ 7O1#13/Ԙm̌}+.B-^ť7S13/Ԙ_p+."?\(o:3i4CB!DV0uHW6+_H#ɍHEkn[W 9^mWWۍ׸W\)m<+BQuƽWAyxu^9nn17AdȢ,ܹ̓^׺n빍.1/xŅB!"UHWmudm]~(憛,ynE֩[:VCV\&Z9B!84S%ǫ5}\_Z'Ժ&\Td@<̃ųoi19[ zL!Pšט[-[LgK3)nyfۭ%pr"V\s5ϭ5s t9fݖ[-m~8ʲB! e)u Y3܋c7mݖf[ '{v^X* gprd[k@1sH*βE+h!BFQ5GynP1pnKۘgNN* gβV*ft[W9jmiq3G< !j)OgUy>n.xNͥ\׌D+'l.™/Ҝpzm^iSN|T̹C1!BB^c^qp/\>D{-bns9Z\7^im/ K8HŦYK9Z7s3\6nbj]%/MB!"-|cnů9P5bW,P9"b-|Ơdk͸Ym}}x6uU܌-͘6f[1cM !QZg\1smLŶ:ncRq{݄5hjY3zlۜ-j^oޅbj<ԘB!. Pc^|gj13oQ1z̫bƽƽwT*J'ԸWV}}i;9+C3 kB!?f17PrL-dP̫棴=n渍K-6KUџR"k=85]bPWYEv\16xm݄L !"")BSX9f_Qjf~pQ1稘yjUKW<} "5W\**U\bnm3ŷYHŷ~3w{чŽ>f7 !+t\͸püDhcfjs~=f}̌m7^^UU9fٌ[x\Vqs+1yŅBq*K+8p՗괞׋iRE)n1EmG9F[QUۓ* ybPWŭȦmnEP=.MMyvL(DZb "b)̘BTC8_HH{?a͟ǪWB!( 7=ꗴ{|22RpVEQmۘ[,"ѺҠ[L1enm6`0`rs^`U/ !B谀G%'عS_<(u  Uati~qwfmk1Rja͟,8B!eaYulRJ(^w4zf[)_*w{:bWm>o=.|(X_Nm!B"..N U5[#Ϭ9m[y>;D}3Zzc*U Vwo/؉XC07ܝ h&B!q&'@AnG1W1}̼W[חRC/W^1U_&bܭ0cr$oĥXXvRٳ1MSR !BIbB;mL`fѫ\+mB[ ^:Сz.U[S#?qGIB*e͖X;I0 6$Bq}z]IMU[erwBD x;&?/{K'׿}E\Ru)W^~v[G`_/=7m6O;gxhuc-?>h4lPO=Ƹ^BDhӪ.ҦUKj,+U!nfMg|9$7*O'jTfLBWPqyyr/)NiE  '{3{m%//?=;5ZMP?{-ZVLaYW]~ل\{\?k˲?aEgv;u=GOǏ /(;iܨaXXUŷ㒋.O37k<ȃԫSL eY|>8¥):eqπxށĔ7W^֓W[V-}lׇҡ}[3\fqwӡ}_3ڷAw_,޽{x᭾j8}}i[U-(^OΌ}􊩸;'DSU.MrfB\iP q 9;aj&{gZձH'gŷ~[%mی1M^:aeqQ^ gu]˲ػ7.~ 7|o?bYݟF {cHLuˣؾs~вodn5W穡/ޛјɟON_T!͈eCŴiՒ|^HmyxY7##r+g䁻WYt9С}[ُ#F=U7j>Dl )X*n1xţ p Z@RR"c^=߫VsΙݹyԫ]7ѭ)ivR."ҪgSŴ  %j/zrrr-,[rrΌ|;︙G&!> 61ll߹#_C߫Ï?W^NLL iǂE?c]"jg,;owgȳ̡y|iFbɲxvȢ; (#z=q1*c^E3BUvͶN#Ԙ*mF+xWtg?|ͳ/,K %k0U\K>bf1m x4^>ԁѹp m귥Ke~=Ks_!//X\oq{Uo>ݢ{nՒҼّh2999ڝΗgQWσA #7/E+.n޾c'|~` _E޽,^ }ؾ},"g-̝-]N7UG]Ě|>u&-՜ZjoF6m&;;{N^=;w"gͥ)'[Ny ~I;,[Nnn.km(:vm_.mZd섏g-,gvDqض}}:jdwz: Wje=C||<?3؛«?~~Y(x q K6FhrK3tkW?iצhvm~ ZY Y}P-+5϶loZLMvnmor0Ѻׁ 9fP'T/o@|vꝰ:~q-l_]vź/ c64q?) \*q)Ŋ6[MVo(zm[z{'דe;=h_!;=hG~ܝ1 :ԭ]q]$%&g~F™{U?۷ӥs'[PF {kIJ,^|Q,6&_,q}q.ك ᷕ0عkw9{]|!}]/؉3n'fcw3yŗ߰vkH..$]}8.Y_e=xvH :iղhNssCV表{}id4nAq\F 2tSn9Zk]x-'Um\wSjV|8%GB| @3}Cv|;6ǗKlj.v_\@f$`~v#vmw<+՟ ZRzFIIIKZ-/ү?pi'8'&& ٲ,_AUUTXE 5kkw:PP6e:8h\W-m%wq 5Ҫ{6sz5kKܳLj^i;=@0 ,qo8,CN}`cO>5qLVl߹}99hd^~~e1a_R~OxE*¶^l̦j:.mbDI۲$̾K>o=>ŜmHJFrJ-cObs#+[oirW/݄uɦki׆Qe2/]3Fp}uU]>,b󖭬]+.IlL ժܳJ\VdFZuRU-@ 2'' \+*7lL6G}sOPFujOöm5lNۅ?0kלwn۶U3xY~Cڷ=dRUѭr}G5'1{7Eo[ęOUa6%%9h`*nIIXEu[6ݪ`Yv=H$=#g_A߫z_"5Ҫ5i'y{dѴ,Kƃ?UCʊ?,'iղj^h/Y{N֭"Z21~TT|1}9z; ½->i3<3N:6VoB,3 &1m lfZ<4З^ͯK{Q~% q0m\u}(;v's/B[n`ۯkw:[o[m^ÂE?2رs-o+`7q&1C˒eY~V侘6G5k&77iur3H:u᏿1fq ygRw+5k /7WfcO˷ NeE~ԩ]Oil߱G|ϼ27__ye|Ͷ;xedd>WFٲm#_aIb]}Sq!O*ѮMkNt<_Θ-WUW]fmfL=PPcTEނ۸EY?zLQqQW( U )\LZ|>!D婞ʨ#//GC?c !9>J᥺DpNa[^ߩM+Zϋ׸W*7PlZlbwVPaW{!+BW\}mfX!"Z_k8Sn*B-ZUfƫ:5zLQ1fAuq XHNF_X!&|_7d=OyUb^JQxg0O.˨-`-q{ B!-uU\uʃ5KWmj{Q)-* A?pnB'Íw{ݪ8cpR| !BJϼ^Um J] i#B!*[=jjit=<>~@7l(n9n1p?8fy;(ݕB!˭&s@[*z+GqL>D" Hv w;fmjcnO!BTrMQVcz/8ϔ'* X>l !&H8A ֎6C0`i-/C o;r,m)hsߠ|s p۬9qpl=(j)w Sq}9VeTf8/==?uFH^)&2F%:B~}'1YOia˦ďOK)c};n1i,Wsߠ6Ϋ\뜹UL4[J8~0ںPqs}6f1B!D)pׅjW.@CPuNZp]B!\z-f.l>TZzbá_!*4y16B!Xf-f<9f.M^JSYDCz\1ۜ_!BTGfs \;rmvTmSK?|I+k}18j?ۂK]ű.;m x-USn*$w̝#+ '&:Ӻөtm[x3=BO~'# BW-U)`V:UTD**C=WrĦF¹uQ b-]ڳ_ϴj\|V:9Oq6╷~Q{X'g⯘1oMno?7esf2c_27f[hNiSK 0~;Gf597tvmSS#e䗧bOꖔƜzֲ'}!oƚ؎bZ62㕷Xt%Y1o&aκ\%1oZ2}5iѵԔ$cyg7X5z99v33/`lIM9ήxl=7wŌ/b[OmO(S^'43g.nFJ8WݞOc4:7\h}'}!o`p=]jl3cSдI~RoRǎesReP ~W&1ism{!Mtԓij!U[%VAx9^,PT=U *xw[ydS'ܿܯXD5>d42 f x]W?sXh(grZݒݎ7^Kɜ}Y,z*d%,}d_>Y@kt2+$h[kXjM{~WǶv_YjOp'\pP٬ޒǶw.?A'ͮ:7rbZEH)xsea٩4N¼ٿv4=qL䵺_`{KH5ǝOl{k4OLm|-YrR/<oڄBCJuYy^%J* 7ZJ"fު<.YۇEZg_"5ԧz\ i8I8[8s#b$ߑZ}ڳcu` :_<ƜkYjx:ĵggAǖ1m7|-4Z%w_wbmhՏ vU8UC*f=F.(`:]_aߙ9{5W]{|,ʼn듾`?d𵺎!ᨸ+g:`ٰ،l̷h|{qmh_}^3Ucqn«deYWGiw,'q1e{/B I]wШx'sY7 d+qo`Snޞvivm*HkՊVFv;KݹN,x> kV#cզy4|$''b[6M0LR O__͚UǶ }鋷ask^MV&qas.*:rZnW+8 psRriԚϚ4,uHt6lZ|s,McmP0T,8g|Zf! OӘW .ܔՓ+.(B!aѬ[:k.Q3bL3^(cP!TEk UX4O;S|c :@&f5?+x a]}y,:厳kcʶOF6׳̂{,MS^MUϖ)9Uyg>, wս73>x&;؝ XoӮCs`ɫsbz0iMv NNyd(u;qn`˗I'Kځ~vTXǗQ' $Ҷ9ML+󒯹ŌRƧdcOV.n<}ډ41 %=7eXf^-l,6LI̱<}%!gas VOygf1css`q_\B!ŬLV <'Ụ_f-αh|\,oBQnu=v8B=[7..APC>P!Q&h}[pV{…B!G p! .B].&B!(R !BQB!I.B!D%\!BJ$B!H>P!D1l޲fYIIIԯWի"BQ$##;vqd#HNN68lYٲq)+B!lڼfG6!%%BRRiܨ׮=A3t`+/臙W} 8ѹ sGy_~rX\2>?i8 liЊk490~|փ Fy;eWW| qKJN&;; GS 66A'_lmbv*'z Sז^,8季%L_@99+KW'H0*; .V ݛϚ3Ye ~-,3H=2Ӆ>`0T?f1\-rI!DI^Ax/g0uƏ+肟,Ȏ;#ZE6qrdl ['>eiGWX3^ 8Sc={a+L+Bq{+HpV7i-J:uGpǏҫLu t]ݻ=i%9d.p>bj~p},o]ȘoIwy<}'6AH o?X1\7/CNW3xp/ڦ7^vN.l ~YU# _ۿ/I3rGX, b}dA[ɨkG\ޙuHiy>we{ dAaH(ܼs#|Anr ξehJmdޛ/2z vq0Jipy {O{w!VN=W6dHk՛GaA}]m, Ac=H8?vzk;g >7sEhwH;?x;6ag7y),eSZk^pWYa/wIjL'[g.Cyoc{n#˙Њk^z`-c̽`+ؙCwG )»sYGZ˳[~D\ٖWcmdЇ~o0`'iOK'y|6aB!垈_ӓ82<߮$LzqԺџ|䑽q&=+ 2J29g%Cŧ}G]y)[8̭v'MgGDy шZg<~ IDATȸ ӯx `lN>CL8v1gg8y+lz>;/}г?|" n0o(~k[yy">{|Sxd\<~>qWǰ~ΑF_2ޖ,~aWqc嘇x~Y{sN|7p77u>磻:/ayai3YSЮsΌϴ{ K6?)gs\j>|<H6۹X&X܏A&>?+b0 :7LfȐuh>:wlƊormkCl~|v2COa(s!k;@-$8> }G~ȤO/˿v/n?2 8d0ON?vKynVg}~]ٓt|4ZZE_} x:^;˔_6%H nʓ}uL2O_屏Qe XxS޻#~|׿6X9։o 4|0\8F\^E7BRWV\?|$74w[ޢ-9\7+[p5'R?!FݹK_rHv* k_@ӛG.{_,f֪RILkDؖm[`|>|vK^VQt: b}GDZs.αJ@LL*u֍l;XRڦK:Oh,.;61ڕyٜHғ닣v+j]@ W^IZq$7td7hҷY]<̞AkĆ'բIӺ$Ķa :3Vs!vq'v?Wg*q"8)t;(6l$ ㇯YBֈX5^jSֳkൖhW#_B]?tuȲm +-9kԝhBJ'qJ[Sއ[T#.:.:|M⯭C?"`|=`]o} Jh57y,ߞO|hDb uݛ#Iл+emak؝kNjhǥ8a[g ^' !__.E}|- !|r JUoy7?f7yly3W^{ ;g/6G;v~‚&H>h?}'Q/9QAv/wf\ll"JJVĢwk1汒Y3 m ZuR}VA# N6i84j״L dL>ՋUB s.,Mh[8)9N2hrNڎsފYP,^i4ulZggV,wO3~Ԯ+*|> :{vgBzSϊfE(++u ;\\YiiapNpwdp:rzm뢸ض6yˋ7Ntutk޹jգNz6)ꓔA:U5ElLq)V jigFd o-*ÿW?H|b*G燺$U9]Ǡ.6 Ɉ/1Vd.DBYX_6._5t2>JjڕDgC5҈=Bv1u7-ۇw#}- gOa< Iv><ѓYKX~r 3=AW2*2 U|dMAL;Z5pu\CY+jHgWFrw^ĪӝNxs#ey4Yة\?L=xqo,~`Nv w|WrtTQd,e%*`[PQ7DNAL%C)K~]{z?{Or;SIxŎkUDH+$2s_Y%^Q!T1^8t\yu5cN_>'9?o*G=ȓA@{9 b*דj] 8 ʚ6Ttub<巏]v>Oq4bq9R-v>Rwm@z n%MŪs8< ֞e*rn?s9 fkv'[5ﶖA8<L?eb8Ll#{JF,S8s/@u7&a[Lp -$0p仝^wW/V=SV&ͶI;Ǚ ׾vؽT: [OZϺgMz>F|mۓ<.L*&\] oP~kn9/KWrU\#۫ p# mA2#= g@ 793?6+bC^:E fRoY)~ZȚó3V!-g; s]b\''vfc0;Ѡq[z;F2q <£]Z4%ˢ>hKy Ce,MZtf3ņ~)j{biت/ LJEycT/ PSUO=}Ȼ* IA޻/=*4Y-͈i&[O^^xWK7mKWr=s툳p4.d i9_agJffYnlr {M5j35!$8Ǿ6=׾f΃>A]ZТ|G˲0t#^֝]>_TATGݷ8GUl,2Mfú~ҁ{$0v3፹߼Y0A:hN6y`|3|BY$^1 lN~wgy[ymͩA;athՙay-}s8ݜf8ݻ/eNylqn|nF8sjoj $7~)һC 7m]/`/yOg6!ǓLp= Գ#͛5ͽ#zKvu7ToZnץ3,}Yôy&<13!gʹi㧓a8mJbᄄDRj]_ wlȏzN6w'ISyog6-ܬC sHfیץq8^f(Tn{f UY˻sҲ]^ׇƻg'l^pecomn07Jd۽=-biqctgzҚ+|Mڻ=M4Q\Gz??ge:oogsa߇$8^^Þ z =@#>ޥ8leY6ece}iູ fœe[5_7*5>k\6S,\ӁGrtmc9m υvY]{Z%hx6g|Q,l cҤx+߸'Ɨotqcz~5'ׅ'Cxl#+ G}gF<.AOLfXPhsJR@j^B_uKt>D*"9Nit+`/QmHHܦZR2'I||: 䯯Ct]M do ~o*8==t2'f>A գT^Z}W6f~>ГUυŁ+H(u# ¾Osקe@n`=cyZ3[|1 FRe>Wڶ+WqӍ7ߝos_H2'~~)Lvz qS*v>a23jpyd?]b\b\xyJiqϲLtKӹŠoQWZ]2 ӫ̶?bNh;"ޫlY?}]33{55WYhf_oy\M4\~滺9`u¹1}v絰x1S"\0fUyZM8tbp{u"׶06'Nd&DZ/nyI!>>R1D#a x4^޳ #+2o`_έ.u:H~^[%4S $"*annFB;39իQ~D|WEpt.Nt-[h֮I3aQǓ;g'GR뱴/tFk-rV(\Y|NL-2ٛuYXJoa~>;Ҟ.l%|źLY? ~OëpoJJkeL7p8 R޳ 8*ӽo#O)ROrt&6Kvthƒ&XKZ]aK]];[(4&yvsBvF[= ;¤ayko]]P#,%f/;ޭݽY=Jp\+ ?-doG-0 P2I?]s@5"""(M!}XxhQ9>_QE,˭j4!֦wGub7}!0*pKx={Lu(*v&_ OxwXOORFV2TmP7)(ʸoeN;fTwd{]aNכQNL\=Fٮo1 _lWGyht^tٮހ+od=}chՄZHd>8ör0L 3]:eOV/EiՃ׺zo/;̈́\4ʣ^PxyYDD䊑weWO49&>.30}ϵ{MF#ټ{ʒ~YODg-|01sk _= B00l5- Y gi4mtt`z#""""Հ7;|ǚpl%pp89Wj\[3q =kteYE""~p)ZKe*==@} ;Z.0}:ϣ`B2bUpo//"gv)8TEK=a/skU&KDΞ}6/(uL7>=6-<Yhۀ[6i^,;qv 6gD\&x)NzՎpꏉ ّ͚zKvu7ToZ7#<3u @:K_jo0텻hޠ OLY3mdX_敾MZ,HJVKk4#Dz^MI39tTۙ؆ hز;:Df̶K+bZqݛ 8|DVƌRKQg(&vXx1˶̪D.= ~G>ґG6cЀ|.+ۜ 5gna,1"NuȰN˧տz4{҃V2&y6go\袑7-ΰ{; ."gY-fXyһ)JDXsmJ6{ۿ[1/?/Oe錨 'ZtM0w%fMcT=C֤Z`g^~|,~x|,㖜im7XSm 1C#+Y4qif ppu6[#_k<(JᙼW~/̌_ϯ6'}K3x:^y3vdY5Q.+iΘȎuHzMаVEެvA6jҨI#^u9 Ůf"(O[pKh )EZҸqc3طe >;6vr]PKT WB\oS&fvTzĨuK9Rᓗj;`=EX5(x@ xWu ]׎|ɨ)3yS0~;2lWvy4w1)Iz(MdatS\23 t}%5<'Ц[-R>jԙF%C ,Mrp?clי뢃pFS{Wj_N3t.%B)Ք,,\Oh]߃S"2Р>O"1)dQʬ9{qڐg4M_6U%;ѿ5 !DEJG{xRY9s.vӞtIP`;,=(ˠW55̋}0Sb(W Q+[?J?cT, B)ϡ]wd] 0 -\i=6~e]ڃZ`W#-&l(ܖ hzS'jcIkip``Pںv;y3&m$_ ̹lj 3(MX5>l>]}}4 caDDEf&aĄdT#ÓOtvi׫-˝idޒL&&Eʖ!"E8 `hұ[nb4yCax")`$M'i? ũq0 ]Ü # G83(@WU8wbᮬr2tbyC;wI2lJ;xQ#+)S0,"021H&$&4!,VKͼU2!yL^#oUIZN2L""aYueB;3Y8ݫό@3On;A;.MeΞ͵=Iڵ NJp d`ů&חNy}" rQH9JRz8+9ݝAh3f'3yY1m+G$NMƤi!O>ٙY5&ac{ LJ 4 ܷȿL-2K;qP2} kxV|p_VGCiX V"?ߢҺ>h0H=;d__Q}S<=EZIĦ}nӡeKޛĒ"iuuaR~,vwg>v0Zm<|9t&w>ƽ6 ՞1 H1v';3={a)IS{Sdb``~2MzؤcElbI߇9Yi#4]N $T)%E.3 ~dOB?}-'`ʢKIllL봦i|d)80 lXj^)ūP&&8Şŋ9h)Z;:fb8{aƑ Nӥ?rӐ>=u,gp>x+_w~dnwGu"63O..#pCP;^NyC36chH0&Ǣ˭ZQ|ӊmPkG,ՙ/$Giߤ! ?OcUqW%/&IcNo~D(*] ֱt|KNFHI,ƾ5,?s*nRle%oeٲ,mCSR(@k*x`KוUh3-)cׅ ϣE.[5]~<㽟{><'7r>7_k8k0@<xzÇ<л5kp3ٛ&uw|GٝL@jX_A\'7Oc/Yi]ݟ~1&˟Oĸ~ 0;oLbsr(Bb(ߢS6PQ 9~"v4QєYߥvP2!5o _r؝BHg`}])rصk8mի]N˶؆#G/"6L;_pW06Nn.k=]GhJVak/²f:Y'sO?2u4 {گϫ5Bxml/w1عkeK-W ۆ}P\Yߢ|ٶ+WqӍ7ߝos_H2'~~)Lvz qs9v>a23ڀAH5mp?n"tWd @@ጽ$ʴ׫-ﲫ-gc8 <]W0&p] FtUn6`۞[$ef[ T DhEDD.36`+k)\A}G%hݺu."""r u ,O?3?X[,uC("""rXFŋ/i+ })nrS %>7t#7PO=QXVQ.% """"9]ۭ~iRy}]m-uҴ}/x-Y9۞?|z"t[jj*F ᯿rRplWŀs)FC(;6è@\+>ϏѤb0:>AE*TM% $$y?Q5j\{MHHo\gddv+}RX8!!ZDayx9?ً6q4iљ>#b 5rFq36ێdYqaywG5mB\L83zavD,/yO'⚵ya67oW+n|?_=Bc~(^Ō3+c+3%sߢ{Ie񻰓v"l·.""g>O"1.>]]We[>%dzCR\4H6C L08L&~ i=(D[:[h5 W%a`ePz,N :1َT"\h:ԈY3£' @Rp!>E d8ϱx&#(X(,p`N܍X|X?rԭ^d 5ʔQgpED䬙jpcY0/z_UZpGLa7p8aC ub Ll6('H̑}j # b ўu#{Jt`:ky"L*DD9*ӽo#O)ROrt&6KMiSO+m=[j(N~2212r6 ϟNtޭIM 7hEyon #;q %eڜ#5N2 /55?m?kAK -q,Kڨ%]7Obmċ4=>}Ѥ|̨[Pa`Xo"g QQ ΰڈA\6-:2ǣE[« :4n@7f6|d9g-đXD.!!! ||oIS % pyN8xþIspx5=p?{G9|Kq^?mA""˒PiIVvO;Ml ˶sfbLƲ24rp_pQ\[f̀ic:ܽec3S,h_w4K@^wk7ˆǘW(_mUt㍾Ew'322ҁL d{{-a{8׹g5ly>yxxy\DD; Ⱦ L400}s`e8vcn"5!C5z4Oi= F}'%0 nF2ÆaYF̳[.n """"n/c65j(|_EDD j}yz59?Rx_*y.""r`KBhmNHŽڀ\fS5*QRmNͧRo\`T\fj6qNb8 "MDB(\j6UX%HDDDDďEDDDDH\DDDDďEDDDDH\DDDDďEDDDDH\DDDDďEDDDDH\DDDDďEDDDDH\DDDDďEDDDDH\DDDDďEDDDDH\DDDDďEDDDDH\DDDDďEDDDDH\DDDDďED$0|G9.""YED?p?RȰ|]IEDDDDH\DDDD;J."rE""¶mQ""r()))))m """")""""G """""~.""""G """""~.""""G """""~.""""G """""~.""""G """""~.""""G """""~.""""G """""~.""""G """""~.""""G """""~.""""G """""~.""""G """""~.""""G """""~.""""G#DDDҗ8uo\ à@0J*EtTo\` """9J* -+DRIv ~Q̾T."" ˳"EDD.3N""B[ "<\͐.B """""~.""""G """""~.""""G """""~.""""G ""r2N.\[Ⓘ,ߒ˔M⌁9_/ٹs2?o ""ri!:\[rYYJlѧ^mj}luqqH͞myg}^6o]S-8;֖7Q,헱tk#pẈ'DD\DDֆ+\!NgzҼQ#'l&5+cޛ)):p߳-\M7ӟݨׄrK3ٕm_2h'loKٜz48L5p udAXЩIYB ?ЅfҤ|{RQ[ݤ&Lj}r2_|/mcS?+yc'Cݹ qiԮ?.8e'^Vm:͉u1w;6mF۞G]5ZW{jφsLـŮmLZۓ3`C".瞉VQfdObY2۷<̌qS>p}m㓻4n_HN59h> IDATYڔ'̄b i\f#pvv]s:[%bf|W 0nЅ0TmpłnCתD: L}VHԬes[R!Zqo"Y;IVԤ ` A[rl6%:ѯYiBMoB"$ucS*vcKQ֬Mbf10ߎCo}V:/FTmb4vHhomIӓ|>㦽-fzB]ɷ3';~=Ӽt\e $-%Qp#!Эf''5cچa):ܙkҾ-Lө OR#0qy#YbgVd4V$S^0,?pK[=Zg\Z2:)n^0F$zd_hRhaOdCg4@nM+vh8ҏy^,9NIi=mғz*=ҝy峼B[W~M)]CXHnM4Nv}ԛN6f7q-x ѣ0j3ʄfu'mǾ][Vpf>Jo%pݦ3wݺYQ%*;(D.  ՏY p4I#ͷ it\~t=FR\2ED0" ?cNg$2ܱQiqMj#Z$ğ LUvȆo nN2`&?k;'ʑ/N{>-_i96;Tv™eTLs h8X$YiQb4О.W7b͡Aq*S]O%IP /7bpgLJ_QF^H\ED ޣpO h՘iWck52ڠ=fg(U;ӿq޿=f;pTQ/xmS7hJGᗃgk4ڬ1/lۢ>_t4>0;=ØU9MbS4.J.}VM0|3MRq;ͮ4y+z} 8~_4w@B{h;Oޜ;>c쯷0 8z2 aEMFf1ZwƮ?Ci:6VM]hgodo4-TБ"[QmKx 8OұNXv%L.qϽ}Ospx5=p?{_ysĐ{Guf,x'1->vöm~Y_}mxqF;+O?,ye>gI2k IHB*H ( Ȫ/e |Ae3*K@B'd2[WL̙3OUWl9@̤&3cjY-k5Oy?q ==F_QWR+_m'6vYG-f DDD}LeEÏ`ƍKy()ѣGܶ1A ^P DDD}Qo$""""#p""""r.\ǡԶbÆZ,\#GUV?`S'w| [+|gIx(m"".Ũ*,] H576Q^$ U#mxp7b?qiGl5Zs.ǽX;kgĮB৲?w\ux~U{p>zOc4cԎ c[ht.n}y58(F#q l* =^G5VX8">}$97 ]j(QRW/9~LsD!y(Ps٨9.Ű=6ӹ?Wcġ>kªaôpϦa$k+;UBn7vB'q!A5u濳 N{KnOpÃLDq-wqۅa,~f 񕊞v͈+K q ݈Dɤl $^þr w<ϫc˷~ p ~x?6FpƯM/f}6~-?ox 7GU'g`w-mX7!\r,̜y:<+\N3>fvgƗqi7啭>5NʷS|+@qJ2|yCO F a/,Sw$ZKo _ ĺ?F\2̛SwS>w;32z""f疣ncv.{irqE_s.op[8MOÞQ%N`*IuO*f+6쌑E;nPlz q*|(Sb'< 8T`>|p~z4ϻ_?}70 8鬯`~7ӱm?DDeU/,njv=J7oǏn 'u\Dqӱ^H5+:haŲ**Q<* FwaY=2Wc ;' mBv=n}|~=V-2F/|{m%`Ӣg>9sgᅥ=/_\]/ϙc'xTWMʔw߾)f= ux뎳p+NCݦFc/aޒhuXxjpl?5Of!x:n9"løa.(I\t5q{q>'/^˿MݏA+iTLLyrsc51ثpa#0#7nͷG\ _;c6!yWK#u鸵00 r0N=zoQ!ڏ|7ޣ|\ A[.?B[ZV6cH}B \B5/Hoz,^?CꏫQM 1dL8 D= n:lE*չ;M2DYi)***2˷yﶫ-p?yĞxcT%" ͷ0mm+'\x[ @}5Ohq?2OymG*3B6'pN yQT:ȥ }4 `[v֭æM!S[ccm-t [VZI&3|w@QQ!&O5ΆZ2|w@"@ii)6C8u/'ꤦ&3UTT_&Je >nklgfDDDDDyNDDDDG DDDDDyNDDDDG DDDDDyNDDDDG DDDDDyN5x8H~[DDD; DDDDDyNOx`dQnWRgp ⟟MID\rq:_nx_Xca'[kp{ÂEx{^#MxbKŴ='q5~G![n)[V>V*>0 %kbcLBPl=SIm1M4cÒhJlh X`°j h'ço+Gi[a1 6y(*y/Չz)o$pusǮ;qj @s?߸i0jNsȖN` >V(C>rd 8UrM||3cXXR4 3>ɥZмC #7vR 7cr_u˱U#"z>U7`}ʵ࿟b#?ODԧ0R^d>m %DŎvX6DٗǬyb7pdȖ~'&MİAH&@r,PF`p`h@*I(@ٰ(N F՘rx@b0 )iB}} @ 5V"Y5[q7˖G*Tn\6._U^šፚѥe+Z:  QߏlPEk֥0|ڈu{C1|Hz%x0hP јZ>!OPXTDx-'f46(\,M  ApT  o>/oIP4!Uեr\DD8Q/lx?oh/?w@IԬZ#b}mt0}_nxE(*{!x/O%X_@BFC!V Q;J -<EEIM(xDD#(DPPk`-004~}{S;L5}.n@F,xzFm]HJFbTi UĦTGCRQۡ~$1j$`Im3h\V|RJ|p0 9nTcƖ;~#6߈6'"ގwzİ! <_VAccASaϯō#TgW&gJ0vo_4@ fGX ;N>n(mvĄ=D%F֧I`8q>oE(> ەQoNyv x$]< d=NG2a݄GüAq xo;aS05'c0cw ITmQ4IDIT56GP(((h3'"1uRAa!mbjllBAa-L&->ɤ-3h ne"G6nĠAmrJQ]]I&(sVX`JmR֢d#}lEYiY?\/omz0m46Ehll‚aAl=ykj: ˕(܄]&dIo&jfu &Oޚ 1i$Y xao ๺M"")I[NSS mb***Gwrru.ӿ\DDDDhsu.S76<9Sxgds#"""܉uFO qV\w]S=)wT wWܜw]xG/b7 Ӛu )քq9ӝ?E^צYxDŽ]\"A蝭* IDAT??8 T/L4G:GqyVP>yv:6powڄ.!|oP?6_1eD(DY\Kxw-654f=P&հy ҆ڵTŐK@ĔP1{qkV`/!Cp6eH ʝîKx4ϽPN>{dq%l9Ũǿ~Ƀ& B"Q:S_k=N}o@!%Lh  Wbp XjzyZ*\'6ٹeXQsݹv\օٞ: ~T\{Y=\{я0x,wSaº4a5w^1f,ʆ~r03<6GtG:< |b{o4LY*{{󧶕"y}8{ӽx{q1$7ҵXjUR <[ΝΝ+^z7ٽ9bshq{žO [Qȉqe"3]FgDDDC1>} 6Ҭ7x#Iş3,FmS M'ƝO|gF J=q\v[{:>ÑLxWw ̞s= GYxzK󱢶 RXf= LVI߀;>Iٳ(/7/?[ O]'G_fA,`6)k3fmʏ8N.r7<39UcD2lm/OAS`TMξ n_KL8 ;`easaϒH$0gvx^>3+Ǟ܁ gkѐa\C~f\u7Q6`?;,!Jno>u $\ v wW| w,_<>f_04]'*ٹpw]Qw z9=yyؖT{;N(T5-qտ8DDD=5/|cwh˔?s.k[nW^m9#姝l5q~_}Uޱ_w>ٍwaccc3X61#6 c.[;qޅׅբ^(=GDDDDy<GymQ||&5Xu;\JO u훖*Ooj&wtW{ֹ[ Q%"""Lg7}X͊iqTw8ێZ^X""""ʯLf3v'< u5;Z9Ck0""""{[6]w۱fvkV5:gzfq7e,sY#""""mQlcp׺Lx&m/|3mDDDD_66!8{[vޭzZwq] 7^ڱ( o6FboJaPaYPXF[PPXhqHkz(s_h7M겗dz""n7">Y&~Rꛛغ"s//+ł d[Acc#$/Qd\g^^_TX 3 Z¬^#==?\:6hVtO?/%aZj^Rc|XmMy%S2\rH7݂Z]MB-}Vϩ|p ^􅕺>@˛&֠>ZpZ@%(~z.=8'ύ{1<]c{.au""" =dqX h vuuMŖXgϫkp=K=r"<~Cde/=?=u~.>Zn;r :|7_y.wIOVK\{;&""AW6ٞAs n뚬sq\d,}[ӛ^5znud*h{n+{y5IQj:h#=z־  GAz,$ uAz,ˆeAܲz˦vVT/LG!""peLqM&‚+C:۞y[sd4[(٬͉|mu]נ]\duVޙ{q;2M۵u_ r/neZ@,ۮwuOzxPcY껄q\. PZ/jr% P=FPZ)AX/kȰwմL9^63ՃخѡuMu}~C]sY%r3 ~a=/=k /o ˝mNꏥH_ R5v.cwOsڽپln!zئ Fo@"b,s[}'"")ھ H]8;MHvj0u;f鞮۱K6k3;_L5۷/sԀ7N5Wly\C 5Ak&kvNDDD8vl^zS.KpE\?} [zn{@uXWlh]skz,EkZ%X&A^-sya{BmOjv&lQpe0vuݵFk&5Wϵ.@vAZs;5Zy^uwZhYc3Ӯ{W jDDD;Lk] ZT}^\-+h z"}}ZT]x!;Pcy }7\\?}}I4Z;@x%DDD[6D [5~`꺦غ$$ a5Ẓܺc.W,jmǮyG̜3{QXT  ;ð   N_,+55N30IHރ$kژ()*L0rs}ЫG)+q0H//;?aaaaaai1+6t@% ˢxg㘡kά=i(LcN) g[uǦ҂4Xo͘O$~cjKP㰄 yֳݎO}bLJ\cu*Åa.4>@bwz#ǖ85e;f:꾯]71sQ>G#b6}.TpsKgPԝ[6 }qFn*Kڳ`ї{ař.,CW/*2PTl"-T}ѡ,޺JAe^v{v 7v)6.lOD"*1Nߌ:N[;vN CC/,$\[I3sCQ+*1S"- Ͻ 7čؘ^;O>@M7t)vYQևdSM[k;;ڙk;GȍKRn`^0GdX':͟Ɗh$)gCzm( GGͰP%@DhޯB)FJDDh(4 B *F=i&"@CVs0%!Vp3F 1Y?:a)I=ev9G^mi%ATD{I ahU{MrU5O-K~,2b"J O)vxB4bRuReEl%}%nYB <Ʒ;8ŨJ^y׃*eɓTA~ȽRIɢViA}hT- r$A$!-#]AI(6v~N~GUUI0XM6!?k ߦL6Q A҄ĥeD8i$ =\AWC%%&f=C;! /u#$'_h deiPI1y@ @*.,A3uZz[e&;dbWYr( eg+)Iɒy9y} Q/NUB4h&ӯ[Jԝ̄fE g|k\Ea*HwQT\jɭA"@2Ə-dKiD-QhOETUIzvCx 6F\D?ɈJ̬s9ؤJ*u= B|yٵ_&.Q*zwooƋ`4ىOikI^tm (znjRDhtd}Tk1-4RAw2(ٵ deej&lY J.y; gn}@P}2K"m|2iP]9cöV[ ymцnuPPSso;׎ݗEDlZ)[[̄u&Bb*:s߁RzՎfPCFoI(X.ەkJaUㅁ5:[ϟpr79eyYM+O6-vaEJ|{w{6oR#^^fm5 9guҬ {-u^ke%žFD/q۳p+!*[mog؟ *I3'(]wz7;zVFl~xjn;[n_e!"";INIINI3=K3ne<[d t\wۈ2NM1+@e O{ #^??lӯjUI1ff6]yϝN?9k% k]yzik>sFo1ݴ{1!aI՞=%0F!wٯ{,/@TS+&; 70r_[~Ly=љU~9țrEqx0>oba1#KH3*~~nȑ=e#w)Mȋ*?~ζ֖n>!fzW,ZXDL"7-88Q.ܽh79gEb):.`JyK7Je^v{v 7v)6.lODrVCe}"1h!;Gd~._:͘λثd XՎJOi׻~E(Vz]8D.+dEuGȝeXp=Z}y}VL!e-p֛VzwŅSR~.}*Z%<,|Ij r>BTG=祇.GxE3u\ V/]zz~kf  LRRR̟?xX>.NcuaC4 U e\]{K@JVME6LI,܌QBsΩGzvUsbQqa Rm ,vp;{v.+$$E^x*âi6SܺJTQ=SQՒ͋:ω Yz+Ѐ&;}*~_yAj8Q$oXyaDԇ\נRݤA_~>8A^\u) G$I2eH)IHˉrˋ*t*-,،ʇ;F 2`H LHIBZ3͊Od|zeEYޗׯs]U[4RȪK")`f|^PGk.*d fۻW'6gQ@}r^)TJPy3^k3Rm̘ [h=u=e5M $>,,aSܩ3fUk-2h߲jv+YZ1˷wWi@*Z9*zb?۽fV It]g' HmGʋ;M[l,bkح8Rf=o;׎ݗEDlZ)U)%)Er2W)^B&_ur_q}!Bz~wWRwv\8PѳF<i1y]grB2 D((u3Q>D!Bjk®g,V5hwoA(,*CgJ bܥMڗFFFS1{no5e$L ?p⿒1IErdN8[!a?$fB矋;~?_UpõYaFc&!!;5sr$%+ᘵoz|301kuu{WVV!A3~Ǭ}#II_0101010101010101010k[QE/C^S.R2p͓k%Das<}bH|d؃OU.kwy $mU%i˰>>?qX{'0c K[]g[s6k$C5t_qzJ\c%w"@WIUݧv|!Ttw-I;Gڻ]]hffi=(,;#A)vd}0mǃ:a?MnR}U1dj1@[F6]N&5`T-aQ0grqh-A fvWAieZiH]b\0e9#?;XɤI}mC |Ol_'yK^%)rҽ~T$A*mM19wdd3s \;_Y/aدa             1c7?;3(/N$tsYkpM]m1iY^ҋ/4[B2L?@/nDJmggc Y>n$[*0T:7qVwǯ 㹴~>cFHu36-׺oj7)M;(%AWY݉ɏRS񫿵YzY1zzRC~9t% vqoy5'+K>j:P28(nl7ܯT̊ #MLL}mp'g~jenbh;q[3UTtp PkcV*6i54 ŠC& ഖY/#&% 1mWWlRz} UFEѕo4X2=Nq؈7}w$ hwG,c!#/Uφn4@*@SPPPv^oP 4շbcCW4~Rd&4^TAn>TNV.!+W''&fJ 8 gwdD 3N?D2 I)DwgÍ?[-?l+w %|h4P -F O/$@œ{;0L ;ۻ72eޭ!c; ijgCһ26}xr@k}L^z_UǜRGNS@jY:<<~W@>w쌛g2*b7\q**,UTȸHM.j~1>U< >Z(JҨ.Z-ơ#*ES,ZIe}P" 5ռ8jϹ}-U9=E?b(g%ː+;¿:q'^ξcwUm6 qH _yTl[SSy%p*F~3vf$k#c˂7ו> ,h>54[6Yagjhl/Pp׸[ZztڴA'7[DŽ SVF4'id_[sec::NV }{?qz=N7y]hBN Y8믫S<6[T j7V>yL93W9MsEآ7_j^H.]jBոuКᓖuV%O. vXM 31|kr-:Txk,n^]y҂wi}v4OGp!˲`0ξNE< >r_g[Kl<-ZZ ڏ k*Fs6yu\>>AD{ZՂG%TnȒ n9c= RIgOh4bد61101010101010101010kG1)*R7Z;~%>c3} e/Wv32; w._H}oݷ3wwtbt7sc#3穛B>p:BŏzX36244TuZg-(%QJIX` N \.cwh$wmKs/:G)~hOv'9k|%^vpVREjWlK*O{Ib\ЭGV~ZMW29{"w̥vvՄ/+y\mGX=RuhMb}3tܘy:ΒahAu2 -7fdO1֔$ aAVC}΂''kʆc=GzS|Fv/_7cY=•&vo|?ri}HyMC'nݎg]+OV.@e\\ڼ1qgh?vJv?K`3n?f頲?/ݿRS3749mm}sϾu[hAhEXw;q9l{BfؼiK:IxԃӃH}m! $)dsMtX3*/):N-=jVK6/~{kPÃ#H7yd=_4q  !1/4bb:O՗-M L+=-o9V;]8DeoÎ{NFV6eV.QQa ZR~Cŏ-XduJ  j)v%QV.@I**X"Q)&!V}9WeYtB|yjp"fbNd~ȣA%p=_':zmy;[EL$dQ~^j$P% *?)`T-^eɇAe/YN tXF*kkI|`C*IgK=\S4S|/@QolljUu7& `Kk֔"uK5ۭb]&6T6LJ+$VbG*{ccXAo8rZN3LwSVt:=[7Tܤ.ciDiE\4LN,Ta>6c=pb?Yf6;6K`8kFSnZ3SZJLyk.R%0rھO>Vl?I"&weM3KI~k׸PY K/s XtNWrw{˝ڀ՘aH+qܓ;/\aaaaaaaߛqLgt: UGNN$p~'OivPVVᝁ1>~޵ @Uxߐ.2/>!Mk j#I*H9t۴Q1Piυ,vQbv{:xl-.I3:<;Ѷ .G9ݘήbcn͋kݬ-ͭ/;*{zwȑN6^㎊ Tރc~^6.ޫϽ,EPaɵgWyY/,^⾫iĄ%U3!x# {~{riD!VVI&Ɩܯ?.+#5l,w[+{c2O>hcmi'a'I8f *mur舳~{RQ3~BO\va"X,E:yQyK/ݗ"N ]8$L @7|vnA1Kib3zIO'}g0+3޼d d#x8 hZ&fOUPUQZz^lgZzʛ"bROҊ2iȰU촰yX_gv݉htڬMh~NF74Y`yK}ݲgN$x=Y!Bs|eN7D.Zo])RS;5{ !`Ye9Y ciWYO!^ԉ9/r*ĻW!amCs\Wj}}ui53V>uԮYAJ$Zڽ D[{œYt4`iݼ6.}`JJgڃ3;$e`Á&ʦS" #]N2(;SXTL%b6~$J_˳)E6L.dDٟU 8ѷxbQ駦8FA+{no5=N7ðERja[3j4ưw-W/Bu[18>'"|x/шacvƏV,hl~&X6pڑ֝,3 8h$$ijp7m_vN8тc͛>I mmQQQ?c/B8 DEEeeeygG$ea ~acacacacacacacacaW3 Iܼ:0 k\I:]@ߗ[ڳ:aѭIa10L@       `#2QIENDB`kraft-1.2.2/manual/images/en/pdfpostproc.png000066400000000000000000001023311467704360200210310ustar00rootroot00000000000000PNG  IHDR-Ǧ pHYs+ IDATxutWf7  ] -PbEJq-Ni)NpbšH)NBIvg?"E;{3ޙQBBtB!9MW@!yHhB!D`P7UtAץL!xEΎY4I%,, rboo*( B'EFFqmTKRhOn\"B7ٳύ1-DI`B!egoσR}M !"C"B ABB!2 -B!$!"C"DZXtU%v7ktdUM$@Zٓ^iX܍Sϡ) .9Pn['BY۳!Q 6f/Ds_H|z2--BV3ejR|[2gv^#J=W]y&q6SHtG3SiVػ{SN'zuoH~c >2c] Ih0NiCla3%jVX_s =2cܙ](J\2y ڨ(_YyboÅ_ -fU8w(/X˵MZA kT}ɟF4e0bGM.V}Q ޢu-K$E53A_~-KTMN,Ռ݈8[3{Q  5od3z99%LNr'0eqߊ{?NclX5;l 2C \TЮof%q-ʰ:P*_ŻгlbNlL3{! h\+9|3sRmOw)K,y8{a&\j7ҽPno;QEڝgQT6A 㨀qc~AŶU5>GSq/X<(zLf¢\5cM?g5s`!WO⇅{f`R0}lyfٔY"6_ $α0{a"5crr?M\'-33gy⌸O>i.172s"v.c܏Q+2f.FjHA=݈tyѺ Wr?0sEcl< q|ZȁuA6RiK= G][ >E-Z@-ě"-⭡= l;KdJsVQSG/ʏ>}hT)흀*K& [l:YnrPvgbluPC`,7la#({c.m˘qن)kֱ) BȈob4;v;.[1כď$щ ;ع'LbP,OT%W%u[qZ}—d͍1)ee㎝YgNe3#2/`izqQob *-:&wA>Wk1Yx1"2{%ʍ;|\ 'Wׄ˱"|wncE_/ˮ%W'LTɁ,ٲuMӟK2lVvo[Uo1s4DCNs9CQ4 ٱu;CVp]pɬ"+3jIq7w+c&VRپ^::&2ps6k2>MȈ""2#Su`̧EOynFDTV7nzԩW>W#"$'OkcӪ?elPU&uiYEc3š hVE FWTU!HM Dz5瓺92`:u,;HjtjGl5Y['LekN+S#ݞs+`ĽL-:= γkCjtHQ#LTԒO[a]5M(-&07*ݼҺF5~@tM6r 4c㑏Bm!Z-;b4ؐz7wvZɎ|ݪYUϱekջv хw}De'ƀ[STn;^3aCn؆RZphtx}wu #FF(&X ғmf{|2? ?S .HBBxN7<ܤSH}$=x}`񧔪8ae('zP]S)(w,u-zvY,h%C33YYiSqt#~ G[i;ܩ4c{c'n >i40]bf,K3w{v8c:ķn'2C=ffoä>zhӇA"8; Gf|ь} 9:=:aooChTTCs0;»-i_!CLrcn 3Lh>)b4.X[c,# c˫-~Xv nMLu*BA1=E>ϐ9n= C=l?応@in T\Y]yj?e4j}D;q7 W oۡ_9Ɯ_p:Pdgf $VVob>UU%[qրɓ/WMG!^X׈fK/| IOs&6~^Bs J*k=$x˽ؚ F ĉywp k.LԚȸ{H!2WX7z.nX{Ϸho7 I⭥k4T ~fI~*-JO![KQ ,m'mB!$!"C"B ABB!2 -B!$!"C"B ABB!2 -B!$!"C"B ABB!2 -B!$!"C"B MW@ܾs7]!(ۑ={v\9i\r@^YF#ȟU}9m$ZBR`tuBb\3+WtҘLWV8\+W(TK)SB%_no ,B@ooܹiɟ+ ,&ʔ"15$ ..j&vAIhB!D E!!BdZB!HhB!D E!I:HquqNѹS'4M{uE.%M@'h4|%4n-IaIJgP5LMU|2HXaz&wn劔эE9{t7Nex>%0f| =8*īϩX_|%?/Zϋ'5k66niS_{^8Lo]< +_zzlˋb3zls&åL2T(L9U;/fb8:+w@_rdl:{FNE~=Wt7|Ŭ#֭Iz2`i.ln-Qzm}1G{ڭ%j˗c:TCK8Ѡi|٩% զz6|1]ߑ|9eft8@ :Rvmj7e ʁf|&̫NTh%~$,Z|]oAV8E‹ ݻimrv fo\b͟ޣxhݻ-5V|Z4:O3Ň?զd.|+~!h}Ys -y+kӹa *TBzmb9bjc>̤O[Pj%lKeJ\ϳ4WJ+S!N͟f2vO h:SKT\-{2P@0?;塺N䙹WOF`[Nb)tkX)| ݓ]#jVBMdBt;[Fmn¯-ޝ+3>nefgj5/welnYb3&_:Ί\<=6D@-NFիPZ:~+ ݠ?ѡ05Vl'L^h~֧bJT۞>h=9d3,IJe2x1?o$KUTBvדertv6I'|mwJwY]1~\zG ܴ3CE_hXnStZrMatnPr*SLuu|'w|Ҕ֔ի5իTr[w;Q׆{mǗMt״[nZΝZN>TP{܃m"R*!aO<5iVr~^F+ɐ_gdݝNg@'b.7;vax }fmELYOvg37aڝFE'[U\q"6n߉̆/7 [ k7ٰU}cn%˶b f⁈3EDo? (eKu߶R `ۆoCgn..ǯރݷߴ{-Y8f+z/t̡޴ZPYLsSY5ubJ(ʎd鳔]cbEN kߔ0w\׹1v0i0fB׹)!Vt]{o&6=5R϶ ')ڸ}y9}|QnΘ ~;7jta;`ϼ&<_`0 Cޮ,غŴT-B%[ٽe*(@̩ l6קEO(5u05ggb|~ϢIy*{퍬ߌ98s6"knu2o_ȞÇٷ;w ty!S6`ǐrT/YX;a!!o[*#!YדjO_c'`R.9ioFjʖKТA6"@!4ˑ#}P!އbZ4=_eUOTu}mA./cF<=l] "ߤuT+@[1gM#4lmL,7Sn~z% aС :7ZZټ%*;Qŀb-JoWԜiS#+&T\T UZ5VAGrY}LwhҮ,FP оKmC8`Wwi*v (`6ڍl>֦E8lc;՘ PA|ZOPLBڍ]O߲Ρg⧌Ԝ<9XnJYqٝ 91e ÞlrYc/[L wu©Ӽv69t}r/+nTk-swĽAb!3+ .~R`-4;51gz9V WlKC<Xnmf4|U72DI򽝱R%s6e2oR8~'R4?Rت(vv(gٰ)wdMr/UwTBA]9ϗc^l0eFE9n: ju*Cu۞W| L̗9;Q'h:nDi .»])nT&w Y7[rX{VkDyvM?m>T(!T ds)p]l^g++xYrc*J+ Ѷޝӟo]|ޡErxX1KU"gw e->!^uw3h]^pkʡ-qhD%\=p7$T#.NjPtQ QqsJaT0zdBS#kn< %?Z-><>LKxNA3Ԭ41 ϘXhV%(+Ɨ l܈_pJdj1.+qBзCI\T'=JVkU2tB+}`y|n2Z6)U@c+ Fl©<{yRv] "NQB:ICNr{֮F5N%͉9Vhd:\ްj_Q9Y^:+ݜ֓usⷱ{,}ael4[/P%z c 'nZ,}Ӥ nΏV2}X@Bfãf.8 M'3fZyJpuХ]5[1ֶ"{[=CVߑ%CO##`D,^&1g5>$M[֫zxh+dFctB!S6&_TDeLLJ\|q1hU{uGu-qLVV*N.NрA_lԱc:t5  IDAT#F uy[&)v:<2Z0$ #"LzOMg1& Z Fd;5xh=OETl=pO~dZ}Ain~Hʓց%[4:a!avkv!/|E/eUޞLƭ 'ۺ ni:Þi}tN( jwۯXg<U# O$\ݰ..k3efS uGJ(o}bFб]::vɷأS1/ǤSиOv\$H5vlx ̑bopL61ܓwchA<^#WDVQR|+`BSConMy&6z>:4ǻ+NTo^&m\Xfh%Pxx> ?`?ׯ/wYqC{v]qtt85Ϭ1_d܏-FZw`s*oOUpru? KY8{5@#/.aU:O"ẀN kzGֲڇ%L9'b/rb4:f K#ơc9W!],ƥ~(C4ohCmΟ#d`L,q<z$:Y !o6nMEgfT{ 6]%h"DY64-azϚ%-<DQF-zWfoE~,4zP4Z^&0FՁk1saFBj7se ͨp7?߅Ӝ6*`C>7eH4Xn4n\$QJj)ym%7C\!e=܊ Qws <̒ ^v6~lT:8J"cf e|7ZW0DO&2h$|ؐfsQabEUFf_z5+rTq}<~]b {#6d*גFJf8>n CYm5=qgIU)%,wf,2y$x$ y^-]M~@>ų1}cPvɌ7|b @'RyZ} h۳'&u/:O5K3~qz`d !;-8!#KEc~;bOXPID1Ukm\ M*HRa*G%zxc*|`*|Q֔>fwkr3REŏF19G|u*S+&>o0VSTQ25bԴpƌrR8&uƨz-FSY:w/Av?2z?DqCͯIoi0 Ou)'L*c3Q}19 S44EMlQsaFMF͡aٰ ϖ.7~ ] 4N>{ :s Eݓi" !=||=T>СtJj5{6+WytVO&9]9vKz5 !⿭r*:}MW#Ur&B u__Ssvf7] !C؛B^"B ABB!2 -o!E~%IoᅣoB!^H}uHll~bc0Jqſ={v]<888!x"""ugiz*dzy"X^K+SB[KWk#UR{{;gώ3ϕ+w䩓ļzqqq&{l/L -o)g"B$rvvFQ,w#N!?DQq΀2W!!BdZB!HhB!D E!!Bdr[ȢÊGH#sVhHF o$Vlj 3r[a'kX!zQft.I[NX?J~VwtU^) -o{}P!xHhB!D E!!BdZB!HhB!D E!%գ+XtUk`rAz/  }kjEO Jpĩ49,↖FA \g'?QB< 2 ww-;=\v~OL(8y//G~ROae3[bp\/q1/e _ݳ\ϐxyD=Bbh% z8bڦ "֮MoMkMŘADmK֔ﳘu ;sV4L%h@>j>wڿ~sg,X5yYyO-b,%M4GSi?FA6+b.I:ysբw_, ڭ%t=_i,ǖ?M'2eSfyLo3}ϱTh^` \^j ~qtgs=b d)߁"C+j)4!q6@H)?[؃,6 ib,篛Dp-ىe8F`f uG?gӮ\}~ؘl ڽeL>:]]?V|9:zO數a<6OcZ~T{+q]rQ0 l=Sδ/[xkƞ{woGK3z$Į`ZUJ n蠇q?xhڟ\3`k^J?mfa=-M)l 3v5捡JV+t,: :1- tdk@=ޟːObT֪n&hHwٰ$!^*ΟqTn^:7/et?Xk(@2FN'w"3Uijr5p wNI` l%+S͈rTǺ[-nn[y]#ǽm5fZ rۡ(Z̦4oSGsVRP%TwT*Ff T "fOj1%-,7 `aQVþJ;`"Îu5bOMErk7'ofr8tI-p9!t]Oz(ʒt+W"rR~,IȱÄhΜ$H9tG"0):8@~kƒђ;ϱ݁n/LT_cNN?❬MF]G׍iEN;ݘ%sZ1WT݀sJ䈻KPM.cu*DxP0z`]! FNıYfPf+8L4QbI.8sH;oUB5y;zc)X,N ;~^₹fy'5|$=k❨Eu$gNK͕E5`e눓)u f?X:o{.cVUfZ,Y=xwFI%-.tEELN6IuτBD *Lwv&Uu\r, \AQGb01,Za!\Ԋ ^bC} Ȕ5zQpp~;a$=n5".eFdʉGʻe հ[h !^\^l7&H ,9 M zY_^R(XU@@6VƊ 2bopufLFIڍtt>Ů'u62 )׉9PHm]=z׬?.B&Nڞ4ߒ|"5jaqK>ΣwYtպSYW E?OFa!O"9g\NvSpO^ }Y=j)G3VLJ'`sbq)U]qtB_h]4ej95yH{R#fR`ZRMloTSQo0ܖΪi6 rm\~: 6?’>\ض3rU %$ *q<#(!aX,D^h߶kĂqqVyo*Qr p2G@!ftMxő]m__k@`,M1=}i^Uj6[2e֘w{]gzzu VCWOFX\ 7tT6m=sdg1#_$g,EE==[r76Mж>Ž3A/m*n:bT24o=z׷?FB*T,e:4mE N'ʗ{Y`mQ (jy7[BWǩ(=Cu?ARxMFf0 .D!үgF:u]j0y附 iUI!k<|}Fފ !x#E^#AflmQUiϥtyؙs+'OBGddwwwBJr3%= -Hjg%wxzxp^ /?Z9"Bdp t-`G, \u^'OsN $9+`Jfw`{ bnXWʳ, ֗(= y`r«jE<"HӱñEӡn6VsSِǻoT>˥f#+5۔&h9Ƀ"mRPSD. (RDx`: ( jPQc}i݉&RA)B9a^-TJzagg}ڐل.7K{VIOLVָWBN]fT>rw*#Df,jJrBE9\Lv}'=n(z| C˄c ⢇GrE(R,g^iWٍ?|PmY[E'j6?E!/i@Hpg7!9-]#bː,9U[h&+\{ԥ>tX;9ye{`/))Rm2J"9xQ3k:Eyʜ3iaWm]8vKòmIГZ}Y=rO3]BRX#U ~fDOx%#H2R>$#g.?i># \h\Oen61 4[fHd"y\cU=8 8IC*Q1NŪFⱃiF.p8֝YW*%pb^Z5 zh*=wQ8Nw{92)u1d}@#rKHH5j~܇F3I/=Knr`hM.V9FݙsONF*ס{mX9sR%Vp%Əx*Oc`|L|6!-([4<( Le <Ĥi*~bPz֠Xj\zCw ƋHLl1qg<թ[,/+RN po V!VåҗůHv.׀cǮ,imæK9kp"練~ >ؼi BP3OH-fmvoF񮩹p!W9rˀߏw+S'0{7~rʢ-{ؽ֛dzt%û3cZI|G40}4^+%ZL%)xFq|T=Q;q-ihP'R7C «2ʈX ̐}o9sNi'p8`SDDkr V;fԈٿ#^ Z^,%~'jtnҟsckmeT9 IӢ,^|NDi])W O+CMbw'G';`ceq$e}9Ce2mIlԦ _׮Nhu#m?ш=<4sFp?5ehd'fAI »vf<=}=Cmزe3[l}2_bAJ:$M}%%r-t'o9$ /`ѫ$h2.+OXJLd ZH2:(lLZd{sɒu88gt$3k{,ҧ+2wGʲy+W,zYw,yv`0pk4`/I>-c}^DY') GuyφRǒܶ"1A$nѦ5k[gʖSN1p Fre})1z+IDb @Xqg  ``MDi'bZ8B:?'g,K7a&e=H@ʶ>QzH?ͬ9xXhĮNmgYC7,n'} ⇒sY>Σ%Nxg~Q1˦6Uz "U{ƫDs-#Shc. RRR9?m.Թ3^(Ɨ_%-sy*ie2ށ~w_[҈2_q8)&p~>.MK89J\ab[p8.`2 +=D^ƃ<1=7-x bq- [w'M zƂ2vn8Ȉh?bUV9Ry:4zv孹|\Ax%֭[y-Yڵkm۶ooW .'Yo#CO\`@o0pN*V Z%pIryb(nz}Lhp i1x9g㌙bZ5ɲi0ag,!2֩C~pC,g͌l] >c\\?uC  &(cx+g!.[x-jùG46 ~aUT>4_ ªDOr)nwMcaʗ;IQ5@#2nY*Tm܃b\ |2:]NǥKqpiCeb6*6k:h7n_/dW5/..ˈ/f3j{/Ǭ4KZ6FͲ .o޼Dܽ3I2K%1Y^d KKɓ;! W~aӥ|6-6 ҄coTMk ? !Q$^+ddYIFQ(KLvkvPpy4,Ki]O"Ij7P]>#JB(n 0 /[DM#/nj5 /ـj\ο)anu<}PAx+9::( NIhpTܗȊ=:t"iy1QznS<wW$hqg/cHdCxi*Q恻pY7g(o/I?RRDR2/ 9$I8::H5iɉ#⊤ tIB)2OP)K勄ۇ4=ooz?Ǝ ڐ9aԘ(5Hʽ;vU6f b}A 6hlLK䌘\,݈3H3> B&#;@)P>l"hh)jn&Eɘ?+wId\@IӑHN8\Hql7IR5R܍Q DLe ?]1q ĥu,>N[Xztu𽺒ۯr_SP4b._V+wYACة-1qpm< Ub3-*G~SLB)ޘ!_2Y(Ӽ2qq7Z<Ux`BBF#R 33F]prJ{qƮaȿ@B1#fwQ9΅ /_$z\u1! P(R4K}lQ(# B#k'OR ;wNC?7sUUy z=`@o0p'.*V*k3uL  9S APk'T *T dH'fjbɲm$$YΘe ]Sճ?!j lڶjh$ Y5sܙra'tם_c%KiZ"oמ%%pIryz`(Ȋ(( ,?ȉ}Z4M-Si!!=v$?IFQdӶmCqd:c6~?WBYI$_ʏR}1UM`JtuA!gIK̒8e)Jg$*W|rzޙ$I#ac|.^pc1-z;sApW^vp*Vl[tDpÆ1lWav=HU} a7:V Wѣ$=Ϧ `'V|Wҳ]wx 'v ^[-sBmӷ)ҽ4CFfD"&rssgֽ{;[/^YLE#vzj̀ƅ9n%kL܈jU\#c8КM6܍իRz}ڌv6WKX]'W!JZG G[}R }~놬%rQF&iz:?_Ԯ'I(e tS?n[A $&68b3}ѻپٶOzm3:OKرw?oXrIo 8?ߞ+Ͱwg$ߞJgyF{ػ'~ hhDok9ؿs]fZ4odOQ?,SꢬJyc?6Aqhrkڞ>b?S{4!$ a|:pg"Z%_ӬV0+PXvNv W71CW o z>E#aʡ-Gt;zzR`6ԫ^_B>ȚKx ;Tjúy= )hğYʀOr/v/Dݐ |sMȾPA 66!3d`bcc_k,*i1\;4 r@v~`7^a儌K叨Ws<m ůmT96o"UK>p Ұa9ir/ T)qF$){_I$OhsQ37] B{xc0\eH8;I{qԯ^ ^+o*i4d_ObĂ^_7wO>̱_~~)݇m宩Wzc/Weܚ}ol0rfSˮQDmc nw(;́c@׋vr:,p$IPofxv_ƁC7,}SjVZv˚^z8k˨}vGaԾjAڵmÖ-ٲe3۵}>-:N̥{qn|)-8ݶ,$Hdgncq'$%_×ލR#@/nd;bbL%{ '78=|W׌9IM.mj.͈Y% `,7~\8sFSVםZ Lto>|9`k兿vpp腧UƵ9vQF}XWQ*{HO„x!"-;g/=*Y)W1ۗ4tDZƿ'3<Ɖum[t3o֏cqJ;Mzu[z퓄V}탖o{'*,%*Ԙ(T݉G۬ܗ4dYx!3}i#Mt!~rz88cYw`ٵC2Ye't-? ʼnu B ={g> 5-Nox)N~:1HܘDgC Lj0 Ȁڏ㫹ж6PQ -$¾dč.q@PsTsЋ? `$cnB|U)XFGV$+oP ԠR;orjnv E['.-5d'*̋B=l?yy\Y{#_܍QX;>113W_8ɩD^JjbIiy(+"mZ]=Axϟm۶fϷmۊ œv"<͘ k}lU>vPwf~ł*#P%_Ny&ƌE0#ga{~ed |._=uYACة-1qpmu?(^1ǘBNGXXXV*o 5K 3gҥsgVX1s+HN:E^u^InYŇǯq`hm&{L{wi=7sUUy z=`@o0p'.*V*떌7'I4  Y5h*MBMUQW$Ihy5*(R5m/aCwBTbOcl+4ė=MEU5cs$!Kf'tT.L`d 4 U˼,#cQO ›!9%'N3H`fff;L$;5JYf}O8p*=i?qe<6ߏ+!$dIaz%/=$?d*'<>BCd1qH[R,IB_IBVY&-NS IJҁ}4:7dP]'&Z ›OԴC VM(| e둦%A$x/llVz 9QKA7HZAbnnN{%07:I  Cr :]N˗ppxy7}ZA7o^"Ӥtcd7>K''G~!ӟ@$- qttDQTs/9i{{{uD" IpttD%kF}DAA"iA AA"iy7 ]@={BgԜ I0gm:=Slw}zJjtN-y] l^ҡ!ATBvx%+i$O ‹IÕML]xuEro칆^3UJ ݁]siе:.:|f/{9g9 `\D@¡q[e1pA"iy'DDfu Ʒr:u[ IfxnO۪beboXܽMA˲130C*WnFiF͌aB F>K~zqכUN?dp8VXɕ ҶN0t9 UJϙv>J&A]z IKN[/ȸxElٹkp"?_}\)cݔ6eN;JqnvF-;ػy5"wof jDf el+YC՝e$NZ޽[Q+Ec^dlB6͎a$.+*^a0Q~\ÆaFV Y45C˶a6[va4ukoH/QwoUXï/Sԯ"N2H$ȒHu?#>cMSU{{!;bu_oɑZжi/0g0u{$M#nPd\Ɉt d0DOCȘ޹N2|\1@ڱ ەs6LC][$lesk$#iWjY@`,3|(ŝ,$# ( "#ϱi][%EhҰO HVtU w{0ThڊV;R<ԟ|77XX(O@̌&"JIF@M1Ȓi}S'|RK3 ʅP6γcWA>%f^mLl>k\aK(WN/{Ѻ1}&KpSůܕ?b{6 $e (iATR8 6aѠ=v kI"f=MP38biDRnVr$_1l8ʵD >x;*H[\SDῒt? le+n$o<ھu=4퉏dD.l˜ ',Hܺc IgnT<pbH%:dS97-DȶddŒbZ"6cކ\OEJ4B'qvw<}9fJMT-2⑝fj"1i0n1?SHƮnL_%74̚¹SlV<;ѿ{=J `g oT.#̐ \lt?o+I#W )IԸ*%UU}``0d<|l}S6:-SK-3sœCW3p>YHme-4]wb:=&\|〢?øx%+9l@tlDA2,WH(΅lQRpYDŐXQܽg#$۞z`Nold{TgGX4)iIHУI 69[S|~TarCtWQ'ݷ'g`s1RHJ/Mq(^kmz.Ic!a3{]H$I\^O_#rttH^Wi5-YkYTU}aLX zȨǶ" 9b:CwU*fCES JQ7܎sS@*zY&y#?xJr\ш9w @فqSDaK-?i% 6%kfNuөlgQ(_"\E=NlzKp}U٘F,-[qo( FI=JL3K\Awk7N&A^@Bh%b,f[oN䑥ǥ5~ 3nTV PpbˍD=yJŤ8fmP(Z>\>6f$jj:7ۄ92tTdeQoiu35Z z5fLVtA-INI5-b-pgn&Xpbr~u2^זȹӿ9?Oν@r~5K@ Xg*|`i?oEh:i7w3qb?LEBtՎ̳(|>LWZE֍EkTti;JU+AVoANy5CM}x/%{ɿdQ!B7#(  «%AAx#EA7HZAAx#EA7HZAAx#EA7HZAAx#-SA^<I,c$CCAҽeHZQ -`{1jacx?-C?F+c4R/*Rc^9ZJ~7¾u= mrV3p釦]I3W^G` 9_@B(d IS`ʮ>9W{vT++ @[oJ{LU~23|G ;syeqw8:T-Hoay'CK8Vq7c1^$:E2wYL*r 7Xұ3eB\)(Bނdᅤ *?5av5ܾ\0hnStId3,,^uȁcדjT"nF`~i YJYZ`5}bF&?½WVI_jX0).x߱/h[ 'aY{;6}=-qƛhJ>>U/7HZ)3E *V ~W'p}Wznm&: 㓉W?/}6 v?Gt71u*ƧCgh$lN׃: |T5GҺv0U~ۮ_oВq?@Ϗ ':ƲNᱍVlcZ,~3b* QRn5 Ѳ$Bk0sT.Aۺ =\ zYą+R;mp`m_AATk>uLrd4]?`jϞ蹽gVR@Uj{&  u=?"r0~ըvE|G_yeO Z0n,5_d *{'ѹY]BC܀ӏ~#)ft̺d_ ~؅!W uM1|4j5N.ј.V%"V}lQÍŴ7%дfe|Cig^4_nw#HG?Mz0etڅqiG#B )&AJܧ! jW49%Uh"iyüPg*?sc\9ֿf5C8nɬMYڣ MbTf-;60.lJؽ)*FI̺]+_ҎNT}{m#Ҍ,VM8Ya? NC뿆70c b*³Xm[Ϡ`KT B%ό^r6L]L}rc7p>v-EXW)ز?x֊% OJwp`j9wbږZ^ʸ{9GZYcȬ_]xv_C;"}TZO} \X2mY{?GgvƔvs%GdmSOe:მ[o!@Kؾgf$Ir|JoE0mmHtၩ ?SkphO )z *1CIB6Ŀ1mCJ6Ri6n=fl K Ɏe͂MݿY;fg/ ͙vneIU *˿vܽ |/-1sJHD",or\@sBpe/nEJxZ(X|HO}lH2l( ,! d(26ſe+ʹYbn[& qo>ԫdL^qZϱ;g4q‰M)za7ogN6kCW3$jxG\|kwFol,QR6WmT] S,LvT䲒A iHLլ8T!%HV^Ň7nDB2Ӻ}e7veP< (>*DM½`>g6Ki.^t[S>pT@q\Gg_Ʀ ,(KDپ+ʭQ^ O?r ϲaS[QIA*L&ڷ?I5J|P6@]Eط2iV-|q7·#4PS6]̑$E #RÕQ+઀KY>k0\ %h30]az)/Z~ǁ /lyDG7$IhKre^IX{$෩>Q\g!4pMrno[ͨ܋LƮnLQ偒M-nEfK@L%Z4 1ɨ4GToU#pƏ_zYAJWo{AVdP F\L{wpvM$]W &Y,Â.6Ӭ4sl$k2; ū&dž^IBĭ4B5 1D%8Sa_ ӻnt<CHca4z=zK;.iK0mV Z$O ՝)ֲ]Zt$*䖍=5ʯ{8. bVwiǷ!*ڃy1*9DTT2H|D :ɤJټ9L(f1$@v>='Vj"闙IQX);'cmm )I$k`ɖڜ?ot*9j41*Yq0~|s(3FRY|>qN8&_$:gCMJ$Y3+;b€ciMٜC!9 '6J;A=y(yތ7}>IT:>B)Lec,Y0$M _YIԶe%LCRd\;X4J`$/kkT'qTV! p?O =Ύ.\$x)]R ŊzbבȎN8D" hZUix/hWشIA# 0=H%;n=;iɼ]K -2ØD_<˕44]s]#޹GUqsfI&n!6X5B)R@ڊ_PMKiIV(:q4X#@c"1uZ$${wl^]z>3;{NvϽޜw~\NQo7|3y-7e:h|^{Z|:hf[5;cvhbpۼvoy-]x|A+peftq/hOqNڑTda|[ߥUosS4:sE|'2L<-#[d>]CFSq%_<::;3'%*YS]I=hp ʬ!")q~U Ogssڐ*!?>-7ObxǥLcSF/nm`2~KBDZ,XZlJ.|i/Ŗ‡{ooOἎy琱k`e.bdҪ0i9_,}b؞Li?T#UNl4yC<[3hB<8 YR-f2V_@3IE̝XC[IDATp0yE9>3sLe\^߆c]Z-ϰ{]'&)dSְngϞU91>:祿Z<2WXs!gZ1sV>5SiU>N!W\JJܱr΢ul͒ R(5]oN un|]+` s{f =FM{ycIЋʦ?y(h?4U\"nZl꺮뺿i݋f&2m n[t4*cfu tgOo_NlA7^&wo+q䞥nBV}kH@NȢ|k}q~3'/{a ^Z_ST⇝a&wOtZUC4{t%9iϬFBsWevS!RH9{ P"&2BA/gW92zIENDB`kraft-1.2.2/manual/images/en/taxes.png000066400000000000000000002237311467704360200176220ustar00rootroot00000000000000PNG  IHDRzQnT pHYs+ IDATx^wxwf6z/Aņ "PA읦 ^ R`TFG"z3?vOr̖d73sLXffg"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""*)o""""c(6**B>"""""lt=ݱztݣ9UV:Mvz=UDDDDDTUUЬ獺!Uk!"""""*/xVDM jXDDDDDtl +/\]Gy^y,# SSW^EWC\99Ձ}(Y&*2@˳lDL$cE"+8-z8ʳly P>o"՜O8"""""ᆷ`ՀD\+*Txyz5;vjB> t?U[~>qz0. E:_FmRǨm8+#"""":E;9ϮԶ1jMmP"]&V(xmGi;pLJ;#`8Aiێ:&TRYA)H2/Ҷ1v5Y~']XQްj9~Ji[E%#VY( w-qdv}jMm Nu"""""ZWۀ}Mqdj_Prudk}2qN2i;H[XR2HۂSuWJ$#XHXqNn,:/8cv$*,Ѭ"J])~u*XCdrn]]e՚]NƄ-'E:&ym7[.T:ޮNu]rM+ss(PpTàԮf.KjS1թ.jIƄťj5AQ>AjjQ'Xg /ƩSAmpZ_mCN/̪c`5UeNu'ʷ QuT02N庘d|8gfVNvSA}>fVU?l5O {v5-OÙԠn˓>QS©P"ODDDDt4P6f(ϔ> 6X3/Ou;j/"@ 꼺ZW://RO]V՚TTZ*T?ѱ*TRCN՚o'k]_yy*՝hP뉴_ V灲Ъîlr[]u=N5'˂`}}my8T'yzyZkNr[ jݩIECV `NA.myΫmOg`Շ<J~_a79jQŨ˩ց>1u v5!gkG1r]c'OӼ*X?Xi95R~in +抺'`,ϫm;"KDDDDTE 'cԶ f,8!k!jbЪTeâO]m 00}*~h?&T_պ y3vmz9Աvˋe5u^Ԛ:oǩߩX-`N jZWZ 7ڍcj>S_ʩNDDDDD9P!NPà<΢ jWgZE]`HmUDpեq]M#,e^ Ն݋*dB\.7M'&֊:u.pm-KEDpU,ֈbh?ʏ,v/g|ܽ( " -QQǪuіuu"[]MPç:T*Y5v#1V]{(7}矙,Kk[1kV~Ȩ}'[0*`Ϋj_A@)5M9Q'uMAQa3{Z-_:-%7qI);O< ?vo|Sю+f:;®-4_5R u.gf7 ZUg4۷Z/z55 ڕ*EB~/tC0\qF;%sUg7GAvPƩHn}@59*"w?;Qԝ-NB'K**83"I%t f Ea7ABbQ,,KG;"#.E֥>dQ5O/O#%o ڊ7܎/"D]'\+“V">Ut&s?%a DDDDDT%D_#W4oI}"ԨARu}xYz2B]]`}x-b^yyQ%I;CHHsze]ƉY%>7+gHr;^Tv5>Sۍ;Sj[8Cjuz.x<`7ZCR%:"|-/.@J#J5}؅񘈈(fD, ˋE}L[-j* uZ0*ڡ65@\kxAcpTeEQZXgjjjv b:F^ڎ cE(Any9}"uy1&܏fL辥 AOn;IIRWQR\bqhDb`1x@MӰlbIF=ѨA},_LBvN6`Qۤq#<04iWuTN"m͙[mw;whlcDgnEQxn%T9s`"Uj$Tmy&Hr5|Q=Z\\Z .U|HmQMyxRొa8Cw!H' ɭNInh-& 뮹 lviK.D-:vك7.+?蠫@1ѧ2t4oEE*Ѿmsr%Btvy iiؾ-~y !"tz<`JO1`uzn]ǘ'Ճ9r7"7/rzVUjMjMp vPԺږ;^~D]=k+r 6rPCһqJC@|!2:FZsi(<Dž:)&twCҐȏh@Ӵ3eEW]/\}E?].& n7  4M6GۍmYmo5Maxg_ǞX@ x_O>/}vmZǟרC qsӖLO9vxt=ڵm7NCuEt\zqE1˱JccDZehPqܕK.OڷmލaCEsz⟬ػw_խ>ƻ.AΛ/b?\x>7j<5p[qp8ؼy йc{t \x>qkOoԫWkmP5jy؎=67}^|j58vM'ǿ-ǘسwjB1ⴈsf-V|BG͡&}jmA]O(OU֙Z;/0ySǪ`}r zq)@S<+5{J_fΞ@ZZvï"cTQRƊ'Iyϝص{otC}wކ݌ISA44l۶}e=E?|{a*Lx}߭^!GG=w+qZFb݆Mw5LuhoBР~} J<=a2FZj*^3˿[O<w;Ͼvl Ͻ0k5끱(,*1㍹pG+g'M)}+VeYhҨja7`z<,5lsVL2 ^V>,Х3Fw&OO$g;L29=oy۰ L{8"JS]5?_]%q[Ďpl^=K+|ayZUlg0e?@KDddU^]ts~;3O?))Mp1_P~-5Ҡl1v?vW߷㻕6Vbb^}cg p'`v.nYص( .΅{ߊZiB_}9(,,Z/k֣qÆ_eY4az, km/t.;Kg?ezYnCx5toļd7Uv*3N/J;`˪}rNˋ}S1^ۆzt7VneA,@`i\e[ǑXJJuqqqXX迶`K::u2qA!Gv]QVJJ=Ja())A\=6Li^:ط@鲖e@vRSS߯ׯ[͛5YKk HIpeYxr8{qȇq$_z{]vڴi8p`i?QMeY~]L/@Q#|WչCuQC~7о1)]~{TefQrVҔ>h%n,S=bZEŒ\Vv_(. 0=aWP =x7"ĥAOtÈ7)rn49$um;Kg8uL˜Ʀ2"[SU?v#'7iHLH( z ԇeY ӠzSssQWOJ7ٳsr?0򑧤3ۃ{aSwx{#Ϣ_z7F.ODTݭ]'9 ko'XCbBEM2-&V-߼`EMLͤDڎl0ߪ#v"ԶS'\w?V_J $!%. W %C(XE;Z`Ǘiۥ*It{”W^/kcͺ 7%6lH-srOqgvFHKMŮؼ%Æ D||<0(Z4i'hڸ9Gi]Yhݪ%R}gYǵj=|Տ?Ef{޹p @V-cY&Mm]vQ EHHHg9Z8|8-[40n7QuvF恻q|RAG'Ԝ>D<1r[W%=S-huNǩ5q@AZu .+)%{?y*m(}1lr ?KcrU\zB/IEޮitFDDS#9{͛ODDDU)YHJcT5P5A_[<ڨJHLŁu)h]Z DDG睋{ߊ8WϿĊ?È*CKE.|&$j: b9'NN eU;Pn;V:/vVZQTyrFn%ТDDTEZ"""4x7/" e.^H"Ӯn7\UfԺy&]5F]|\"KBa #*&""""sx(L tLTv;S=vuhen""""".GL՜!SU"V}؍;G`W /r&9v553HSAn;v5 Edqv;QM*QMo7.'MCm;%jb}PV {_DT}Ya1aj,xL 4߯0`1aiz@,L}MKXc;0tX.}B }k gVt:*;_l&mۿv?bMǮgn}DDD200?soQ9[@.v%վj2Cv<|ļ|]Pe_j0)@a*nQ |-pYg`hZK~ 2L7Lzv e,+7cM6X>v{jr7;pِ; Dn]Ur:S]AvTbm=H."""""F7r[Cjh:i _n e!ϫ;VA%"""""DyGyucdvj*B3evƮOC͢j27 7 j[NiR:9 1î>Կ\drQ?~>81uSAmC^L:Ԇ;Rʜ]S{ɜ`눊=^]jaϞ=xWxbdffXRaqݻ7nV~42"""""qԶJφ W[wOfw`SfϞ#G"77ebc̙31eÈujQLq*jUgWWۀ}c„ pjWXǃsbӦMPvmuUcY-,߻JEiS;Ȏ]Qkv (N$c+2C-`i]j]|:iٕhee_>qq95WO_V,ۚz̜{'+l,qJ @oe'ҝj]k={`ԨQUh˲_`1왢2=x(O&""":fPHWXe`;ǩO~q@:99s&rrr2}"99Y0ۍ[_{n˲ /`Ȑ!pjҏ0QL8<$hp>Ls%)/^pft={vLeY8q54oLtYMU鈩c)wbŰ,@oO<7m]L:h1"""QF_˻3]i;̀P{0~͎i۷/t] e!33:uSt7m?D W۶C;,ƑC8RBrZHW?EQܽ8Ouw?"P͕? 0p8 ZRN|x␜nDDDDQ*8U᎓e~ Uj4\eC G"J N6%4؄WCUrp3}\nىbY_MOF'ϕC1_W1X%6vd05L|V]Mǝs%Ӎ1ξMsO1o34ɍЩ \ر y`֯Uv`Ƿ դ t?to%22'( !VT q&A]NmO/Ǝ# ؈K/禖EO'qZu ݡ.8BYYYY1nիWCuh˅mr䣎Z5CۄiZ?jЌ8 ˲`y )uxguចVd['3^m5x Mߊ|g|`蘤C;?Q~K5]fY`mSy!k:8- fb0uE J/}֠Zr7j @ """pN㜈I)FK$(qTN1{l:tHQK:u*^z%Z۶mqcذa1UE9++./fwox0/G M˾u65 'ނ1~Ĉ(4M};/jNM0@K 7uk5^yu4NM5=Z!^Ÿ# /|8C?yZYX|+ M 6nC6W=Y;m`WDDDD/d-uQVX!C`׮]~7yufffbxw`ԯ__B5V>}Rґd>w @ougˇ2O5F+n7ƠwaBXf~}}"=+foH~lD]`"< 4qgqIi04 @}tt߻ 7ڄ"Bo_p\)?Rڝ!Ѐzh֦.9\y;yE^4XO8;+A aŊׯvi>cŲ,K /Dvv:jZHqyfp>ݝ{ .%UXBmVK F;YQx ?yv2n} Z'uXyfޕǝ3aؕ]YY}){Vvl̃5Db[L|?=~υFX:t`%""X/c1Q]ډ֎;p KWo;->_ X HC7~CiJv= 1W.<;ǟťvo,|ð{p@.L@WyRhbg`ԗoQsq%Ჾ'I].Y'Z뉹~4k.ۛ;U&˲h"|wjl~g4 ^?m7x=J-Ơ6qқn7aU-Wh8x,ƖSzGMn7iHv;^xn0׋xo(Ur o[M51o $7h6-"#%.Vb]VU;%_I 5{YctEd%zt!5VšYwᕅ·.Ě݅- LJ߅[.Q `VUK~[)p5k 77W-cڴi1T\|ŸSOK ܍vv'.{l"?GXT?]oQgb޸79Z^?‰@s.tJӀfcS!E>kCK5ZkcEXz'x_?G0ܓ)~!"""DGM)wT*++K-:t@+h:emjνm+]^!Pէ% {Ş}EAXMWKB˶o9^@X[ ?aC0`ywS 9kxq>ޞt :$r=_2xGc 揺Wb0g,nxg$&h`Cnqs6M;ވg_yC;%yֽ9 .;N 7Ġ5 bm[&־q OXB{3,6aGyb>i,ߝ-6RLgowNJ?xNJ{U&NEDՔ C iV=-;qfzep70m(&Z$pFlq7'-Aofy a@F z- iz4 xWq.cʾH|#<9jDDDD3DTmi)]0l[x>;= :Rj7An=quCpIHkeZ e M7^E&͘=-q$%ŋ~Y8pp%VhձN> 40x[hŧrOXufABbZ]4n'_ 2ͨj$ з] &= ZBC|}^BiÚV`9 }{FBu~ZCJ.Z6h:v:P+fTwc#8Nq;hoc.DDDD1PKDUFӍn jUР+w½۶#PDպJDDDDQPKDDDDDD5C-X ,vQb4nX-!333DDDDDDҫWӦMÒ%KW'""""",J mֲ݆1`kY"""""XZ Z@~:pv>h*1 8C-E4L2'|r@%"""""* t|'۷/-U u⣏>¬YЩS'RFQ8 :C Aff&233Q\\ 1uT&?LDDDDDPKi\.:uwraԩH"""""a Q?[iZ@(VZ*0P-DAAZB\\Z"""""C-EU۶m`ٲe,K-G8m|cǎh۶-lW:t(F:8ͭ,[ oVM.R6=j)t]ߏÇ㩧m- IIIjDDDDDtuÆ ù`MӄC 3ϠEj u. ,@׮]ծJ5b >s""""ۧ_>+ 80m%%%aɘ4i|LDDDDtc]6̙^{-4i8t #G1bZ""""coE1ez3<3vM4hˍpӑS1h Et& Ìڏc͝WVx7Yj2Z9Mb5>TgPOS{GIx0q凕-_bnLx^dt ;㸌h1'unNlk`-aU3 mvGVNDDD5C-U[|- (㯙]]:\qhX`>? j~<+$4i5g5|.zB3l8h #O3̜_tGNDDDs DTe\sϚtW߈$.svVOE!rfN1 NC0奷rG\ⲻM70_!^;|rt5"۝[B'œvHGF pǿoGN/!щ7-ֿuއ;n\?x}SX6ٴ_l‘8ㆇ0HՊ,5E`5cZ֭Q ^ yK3(ϻwZ%j<ݫ'Xn1=/{v}+f#'='dn6$$H: y+w()N I'_P Oc0v|l%\ EGk5 3? 4:RMn?7u?Q$qQh&E}>>3@o|}W[*~= oMĒZ0V<8[w?F*u}f^ϧ-zw:z(uLi#fE ptasxoɇxzdſ`ěO>[Slr7~?{<7gތ_?q۲</GÄn OMƎ0Oޔk-Y =Ko-feYU^{|Emwa)o)T w}g;tdX ๧-3b]M͢e8hc3o:iQc̥MQCX"̾?qcxm_/[)>[8Z^V5z y_O~'mY_Z]:ͯ7C\ 6~6t7Eq^ z`y-_u~ŲoF/Ů2ZGt0ƕg7A@R޸o}g6 _=WOG|\-t"}9V׷Xd4Hp!HK gGN7Ps=e{,ߟѤ75 $6>o⟝`BoE? =)]qr U?,zLO{L50`+( ߮(@q|F8e`?tũ[ -@\n)% auh1x0Ս+5.w"-[}pߓOӪ"ˏt`-uڋMoȕ/OcQ@x,oUۑkJ72q`~oW.DI1?@ IDATh9;_]oMq}am}J ZQ^mXؽ| X΃B!Nȷ9r IiH[iZQndY32,XJi룎.[CKeZ`"@6P!~ͅjC[19{ޏyhհR`=>^kn"{݇xsa":pxg\W~{?~ zPx!M DDDT0QSfFO _xK˳S{bg'g ĢKbhDH@ӠC5.x Ϭ<Ə‰u`92eV ĝpޜ|%Hwtjwny/n+=(~9*}9\&?@8&am@z6H< lB|)94*=# 9lfn y[1}8~헖C*8n3Ybع0/jd˟3Rƨ㒇3t#DDDTo"vq8%:LGa!g7XOߛ]G9ؔ=Wh['oV`׭"#]?ty1N__ȃC+A#79KבX55NDIq1}7M8,b/N:I8sٛhKLÀ9DUOl+[ߎO>\ _BP*:~.: ~܏b (ZS` ii(w* qгe G,u.ƯZ9.@NMlp_/]\O@jv ˲`}St=fW6,o0Wt>"""xCpIHMMDq@7W?:&Cj$nN<کxj|qs3qйHKzg&i8b#xvL6μsgbs7b#0j㸞Q-C +DBsIh>GeӠ7¸Cq2Z Ol,O;t4;/ïx}ż{ j z$uxR+/E->huÍׯ‹c$5;7:\~3nYĸM1m<\puB?ߊs;p+Tuy^nqXT;x.C.Ͻ74E_\ZUDnj >>{9_Z~L m˴`Zi~bӄL&zGx!˄Ҕn4ԬZ!aV!q6׹h,BW!B!xlIP+B!%AB!BǖB!B![ !B!xlIP+B!%O=gd̷'6gӻ>C0o^Dǣ͜19OB!ģDwx7=P.J~MG ^^EܒnA QuoR4d3);ѾlY7LFWVfb?!µfn%4r][߇58SK##'ăEh2s< l2 ju<]Sے.ei COc=J,3ca"o7F߽yӭRd!)?IG AKZō<@.1 ȝ™r%yߤ*lFE?\孲G~5Јu1#kA:un֝!_"̜^H䯋|KjWNmxa{&KrS68S;䕟ZKAٍ&ިo>OmSҍFQYwZ|h @'v _̷c_eúnNr>YrvC,2f}?D-j0`03oόsuZUbu['>ZsQR~?5~`j˸HӁ}.˧U#[g f'qvm݈uBۼ+/9^Vʬ!5B!OPѤC'AFQPhi>ę4:-JYlڵ ^""i:hIm5{c Ġfd @âelZqVl~s׳wzVO8;v":=qGͶWXy[e#'ƺ>BԖXz86bA> wDALڈE:3}z6~ޏ;9 Fƍ(}0d{xsS׮e+qSsv {̤.Ma[ܒvBFP;*\yo,—~ ll̓ٶ`>x(Cj8Rι|nTOe|}z:?xB!B jG+l\=(eTI G0 :7o2B_kP$SݼTc.ldYTP2?1q4PӪ43Ͷ2Ĭ-Y0wPSnU!qQ,Y83};:_PoN+W3kFĂ>cj!B!ݐǏύwWv9}ᥨkC|2 g_S (b4T /|ÜM牳%/]K%nqkHl~QYsj(ބ%eѼ}\Mp.!JM,'g~Q=ث8c0/Im"׏ksb(sƒ6ukѩ"ޞB鼞γga(ۑ 3{#fů[(XYjP#~(l}~1精:ߙF ij=^y>خ!NXcoy%soG8 &wU[])y7/B!Bܕv5_vitώ΃XuY Uqø}Pø68~O7Ƒcg6wR]li>(fql (ϥ:CJzEQT)]SA5(h ,)-i[>󬠨j,t͂F2WaZԢNymތUMGOm) zvxL5]ɪe^L3•gP橧]B< LZgWƍ|l,Xswl9[lf@w84xΟl;qivw4?~)֛nƠ:` <]<>1]UQUաa:3J4)Af hIח.z?Z8-9v,7Uq o[>wm!"k4$zc,7Q=H}O󝯾 $ɗ'x9BGC:w?E=b(E$Ac Jg rcl9O]06sբ`h`ZzIT:ʖSnCǰ|cC0j+bG2J+c:GP\؟2;+_Ӹ{TL `4p*Zz FP+~i9o3$}Uv"^oѬP1X :ޡ\\WHЄ YsB6n MQa&tʦdO}7(c_zdyq3Y]u/IIlj3OZMYЪrWB+[z_7MkiL6תE.jFĞ|v jr%wS};` e3 ;y;$F|{lCk ŧ bR@A5# J׉[ۡ`}.3wvUQ1FPjcՇ6Z3]%0\ ^^qO+;MFNkK%HWߙ#i9h{Pe^8a*3"p7}& ]ut<3aV"*}(D_пv)Kbh9e5ŰoOQJ.泟3 ێK7j ]Aww^B܇{)-&7ӊQ^)r{y3(V[,g a0LE]3Mwߣ=-CҴ@n}|Y^eɡ-Lz ̼cMRU/QiۺsNYksS.}PziLHyy>Ǔu s>a@ז4 mM7f/ \aotkA4tQj4aJ?&@1qaУC7mF?fdt9>9Zswhm"c]m qBJT8i/g cۼMAEoGw!$Ae(L¿pWJV|ʻt/IWej rK50;gٺ>=~3~zwo6˾YW~ǚTEqh+^[kݤ}k/m4gچ)rGD2o}ϗ5f"npd.sR&w-"cA:$PL'Md ա(wU */tS+|~JYRw8&?߉7q¿*2ߎNzVy(f'r"c'6oפ۱yr2G0{m#[Sda^_NL 5ZŘ1{7W`P1N'^ZLQS嚿%ذ~1 f梃$jT; dEone}%S`ϋXPRG>Oyc" BIP+xt+' Bư䧛;we㯒RMxb4xRF Ea(z=7p =T~~* %X/܊)7hQėg=?6/f_*IܸF]n""H+^nv1es_1R8Ƶ+`}^Q1g"|< w:֜/~IB4gHן&:Z7z7OŊOSp.YBwH}X3~kur@Q|&R0̵ͭ$bYO&2ޏ"R˃ӻ՝H"b('cyxH z5b"c OA[#rF9.o/ßQU-")yj^A^]*-ևq/ e6"[sV]]|_/Vt} zrFǡ)B} !q+kk_/cknL@ &ӹM⋧+\ s[vp._M 2vsϼDɓxFqSp \~*aѴ8d'Bwnc( @#FQ@3ޓذI1oº9P Ϯyh5K;Kٴ\X:k b2#(}gjMlm -ѥz gW,˭HAO#Όm>Eu:$+G4ᷜXS*S_~nA@#!.onQ/Sf"DJ-t.` ~%#z&͗\?Z}:?FV X&P|+wv$BѮ#ْHo;%JGUrp$S톁NDž>l/'q-.[=k'6o×j`gJTQylL裻)N'6Rwqx 4.z/ ԪȏcI}N:(zņq ̏mۃUs*n*ʭV>i*D\b|7zQσ IDAT,=Wˋf5̌R!ŏtv 0NM?X8r-GR̺W~pa&rSY䇯HD*Bą<ڢ>L4j?Ju(u~-K$'m!tY5).pVTT5S_/zӾ44[׈btYPa;B{$5BGwӾKa[uzO`@}_ *ɖ~_ǻ^޸yr\;Z*ߘ99붥yQ n?Mc< &u.Qq_,@ __IP}DYcKȫSWvw:/dnEQ86Y짫ufȲOY{;:+cMFd5UWR90'cvœM 7#^IP{؛B'JSO^:JS waN[{- @Z-7ju{BHP+BGwr! KmBMC!B!cKZ!B!- jB!B"]#|yjE¤E"EPB!oS&Ag7/G+u~KbWyxD)"5B!O➅e@Q懫k:QIyj w4CB!LZqỎqĝ;S- b0dJtM'UX)OqaN0B!F=Iy \ǿZSZ3fdii$߸9M73k[>ܗԝU+sΤjB!x B܎9cUPZj2HѣTTrótiNCQ:ʹ;ڰ,{$X"4ٛ -сz&exNv`:7K굩qbߥӬ|9פjH+}+l48weC[S~MzMX%]u ~7yC(8:2p^ҹTpn}Y'!i~,s5 c=L\}Պ5)=(GZRQ hm4 8HvZ#Lܩ^5RL?3dV| h'|[ /ˮzaY3`"JKֵT.o[3P_tI c݇#Ys67@OoyeaҮ?O38c^7fA!Ԋ䉿Zb0> nā/6!@rquhh:q'XvOסvӮWr7n@t$fF7^KL~C!͙f"N4nmh0Ҭt 7ϾgN4 F. YzX7^".m5Ĵ~?A'v ~C YqT^ׁiS_\=Sex7L^/Ln~m@٤ei^nT{<߫oYǽT˶h, nn9tӻIbͧ<9OO<vS, J֬D$@5f:nnfRT BǖBGn!b\mĸU8y*Ӈ1F=&޵)vbT/Ib6Cs%ӳmi5clJЦ=CuZ`ryP]6G/d֝l՜>ey3:kI_ظsV)|w`뚅̕Ygk9nM^_ԏg$k7rf5!1>) 'qֿ<  RmWOΧY=q4cYTj ݎFFLUƭ2oWkwwrҬ3x8י[j̍шO` ō֑_nt wUP٧^vi^b/G_jtmZ렅sJlAIc}@rIx?xx%9Z.OXe,'n޹R,W#ʬc9sѬ,YՏ=-BiQQ%UO=2c_6d&ٗ(ƼMĄtmWJjXg| S/]U_b&Bǜ⡲$'pmĝ;j4ܞ<5[rs| WL")2 { /,9&;XeԪ%"Ғ'zv|ު^j*G5c J`c:՚Âm'y|b;Rū/k Ɩ`>'G8X,yug}I ~8Һ}Ylopj\^웯m7fe2:`ɫ%rR*z̀縞8mNT O'{f5 Cu 3)ez8JΗkB![*tN%F؞Pc|I7/m٤i?JE;]{ Vr:NsG4k-Ed%+h|}'[~vdCC>֍9= ֎fqi׌T=vLweC@4)tECyqOC^~Lf[Ɩ]oTl߱ d [!RT7)LlX6VMnM:Q铟H *Wҩ'+#iA+ լwBb֚WG,Ҝψ>#ix% wxex.ߢ̩/kMN q}moσnUt}$;'-.$ӿoI,h089ES0d1͢jo*kcPiQP1دS2[ 1!9Q&>s{P);|8I²XQi+M:YQT@ŞOK|eYet*(X3w. ogri|Fy]숮{vQLaU 8n'1w[BkމHuh&Y|e>̶9;~O-q3;[u[=pg39;O۴LA;06s KR S>Ub]d\kd+LA͔X>cLQ,O埱=kzۂ4ND#)`ݿ#||SJD-ўѝJt~Uu=rԈ=?We}gg|9sUV٥g2™򔲻 ο%!; jCtC~ށ%9[H gx= h7#&yھ< u6|Um5L u4JTɑ#XehORoKAt Bdž1p׹ݧX='w*Ql6M6Q-'ݜSjLJ@+BljD *Z>"1x*o:&D7۔B!x|I 2?A:c}[^&B!hA3 B!G?NZ!B!ă"AGI@+m_?!x_o:cT߈3NX[!O j?FZqGz  2(-/sɜHʗKΧe=nKװX;5 ChLw Xmhʯw%ue'f f!Z>_Kezy3cfl֛VI շ !kRN z^͙n)/k@4:Eb$I]n2X:V3v@g v I*GPR%U U^bE?'!xp$s|=W~"g ^ПK'*Kq_j9i͘OJU k^Hô}[PX8uJ|\;xou\d8^ǖiM 5ώ%iE]?(ʟw4=jA{VeS$$\/ qN_ KXy'{woaBcHO "R=gp`v !wIP+:s| 6\X2 SH gJ5)z0Dioѻ9/)'9t܃5JbT 2~uCӰڟ7:F?J?Eel|^`-:UfZ2wH7իGf8@2g~L֍B]y}Iu@oXZZ \tl|om K\2Z&lЁiSk מ)2ҲP,֙)ޤn1;vo/uk%+NL--R|D&ٗDz4=5 5(Äɻ:?d-YB|ֲy<  >IDAA^\ !cNJorqe@jf3WCKN]/E5q` 8AԠfIKD9j5U2:XgU=b353ٴc+unF7b vd:7t|*V{&fƱh2Nu\bȷ 7`^XeҞ,1$ώ[ͮ];G hP wtnmVjt=W2֟55'H1Mڵ7 dIKx6?J:{6s0 e$)~TiJ̓ ]eu4K֚Owbm6AJ5/oEEMS9{4j5*h/W` MWL(Us縥-2ˆ *^ m{B.j ݎF!|R̈XzERTj:I>%}--DG㝏|Q{@4@& +b0j֚J-&ɇԥ 3l-)k'`6SYpV=OBDF |6(ҐCzbq%p̪KyRj miؗ{" yf;O1=<$.e":PqZ\mE925w։uӱi$;̗ ^x'ˆ1dc1F~n Ӎq ]~WrBDgseLݥR~"P]n{VQSӲƿePW)[̇c{k~t}$[5>(.$ӿoI,hФt4no9/( j[N4{ZE]ö^P3]Úd߮m߽b7t똮ihضkhn͓*>űL ̷**hזҧ/t~2-\55KvH9}}vI%ٚbzz N=ĎÈcBr؎;rNr\vrS=w:eTO,Mz[8{cHx]!y'"V'Y|ewQT 3)$&tcCD"&JU{( D,`{_A;^+H)IݙMl?6y뚋sffg6>{ΜyE>4y׼;}^ny;,?kvSyߺ [ٛD.ax?a03LG.׸`K9x|ɜͥ0^d`m;r4}kwլ ,NoGk H$iy@ -g]=!!w։ΌuDC~<ޟ9skWXܓ,y{""jED.9 ;uJ:WvfByVԸtO!hQ޺e:_DrHzeODDD. "" t4o.ꄍ.[4̋Nn8)^3?Wҥ^"""rPlO'9e\rGDDDDDD?(ԊRkj咋c+GW}CZ߄TQw1mE̦%`۔Eٛ{arW)/3{~ uM)תF.9;o¢me/jp&jKƕq`;?N#߳Nf_ض93;1wb/7;ۢS wmrJ'f~9Wb|eO2F\wcWHͼwz%1s 7~RW^2:m/FGVM yhf<+mHZvǖ:;_=ZӸQCǰ)8qH)LʭRqK<>?2ﲞӉ&Ӹ]0k76w@:sT9>]\Ҟ՜$db6>q[yxj qlb?Hu3ucW^'m6xLV.?'Zl+6ewc3ˎ,m+-/붍J <#Ц?̞s WŶR9s.#,+v:1{?Bٶp8v^6.Jb5{9?z6'6/mzu+2 ziG]62?ZZsa|=@͛ضy6o`_ׄ% WT/ŀG">8v1,E+Y9uU׾Dy {qc9m3c5i9; PKbH;=xzI9q_+DKܶ^< W|L6MZ|_ֺ=EWx;' _u%sx<2gHf͈lׇ'c.9= Z<5o_N4Qd{8ӷjŲtMZt sٛu%—[4lN~/0sw2VB^ nѝ0{1)R6x.~GW˃}iuK[t ?ce-Ou&c A~ wM9&q6lN#;p]͊rOǦ674=X|`sOڛUEodpD@TL&K']tF` Ds;6e17X hH@_݋{Za&fLnzMN" Xm>nxfo*O{ZS-,rMy(Ϟiy:gq]j(""Z4saJ9qLegM;Gr-~J{T^Ǭq魙i4{>vnvdͭsxn7}>d5 =S_NnNaUw߳facpO~mŬ]91v|sjiX:?·3^Cb(zH`AfkM쪅P (AXo9Ҕ~>gU,#Sۿ\o[yljקY8[7k\[V1Li6w|[k|v'X%:sifwOl?T0cٗLZ2Y&5}.@(Rj^Yvmot"3Q% uEvu"8 +4Ҭ@3^ore)~SQ0yGnON}ވly~dh}-;.o I]znz+}+QĄx_~.l0+U u@@(Zցc(aݪ`Tk9Zpj7C"&8д镸N'.BZ1ll8nfTϧnUY8jMe8z m88ҤIqzmw?D* t0w|>ވN" vZN!1%"&+d*IJJd>M|׊ڗQUpN*:&Rz:Ҁ l5N):_?+J+"j t;MPD0k}U6T9y _&!E2ۂ `jȢO97Ť1E=j,}O?qcg02&`P2"c `p(gJ%fȬI+(s" BԅAPv І6ŞwՍP_إ|::ӒRHIrA"Ekݗ*!tE0L0Th?u[.dڀ+E>OQw1B[  T ]#}aP]14[9oхȿg%9cA5|O\ա%UBp2 %b140bbݔZq`c_F5)۶ عi.N=^-wӡUzqpruMkRJm=A6YՕ~ 9s1Y-573񽥸ZES?P+?´38w2I$% ^.{Ҏç_6DqؒWocڔĺ,' E:-3uO#V5ؖa:p Z&}_ƄkCa⏯'S'8bDDįV.Hh *}GeU^f[lY]m%i~F[OhJoKhsDh9˷|;ӱ,hܕB|f84o_=HEu{}`$ADἾ%І7TnKx'߽[g#$&Z2-oFcfiw?gv>pmcV"ѥx)^et]5A_;3hz;򿼵z?y?Ψwg_}oSݙ{`.H}֋ΕxI;y*RN3 ,7'ZCޝTy%&6_X,0b~s-Դ= ¶FF7^maf"kƲVK013,ܖ]߶,.򆉉eV( e^nƳ|xwE''4O9} ~XqJ΍Q*5 k?}Y{F͵ <9qڸ67X(f6`'wR-C|)N-9sm̺Xzޯa`rۨ󙂙{ODUR䃯=苀+}ri>ޏ3-yw ^vzY< uη,s$!(ep^ߘL%9:}w40G1LJd2L||7L3z~Y?+7Z6Ugfޖ&ĵ~ǙͮO垉T_Dy'tu{9qf'?hTG.82y91pY_K8煈%Zg r YBOsw ܕh;unu˰61wkpP=E r_k{7v:yƴz*"""oR]x.yQ] g0K_72\DDDF?P+""""""~KVDDDDDDB-Z)T\[СOɸڿۇqG }Y3 &Dmsz49\`EDD2P+"DHC1175}!7Шvɶps-7V>iGV͝-̸sgL5j}_gv}V7նp`_ԏǖl?.$k ܂Ƒ-hw׋|k|]O!hIV ]ZYiY&mOҞ՜$)Aڜe&>tZDѴyk?Y`_ c3Aխ˵u6]l(Ԋ(J8i3S}VL_+Y}ԝ է#kbnc| ⥬0nϟjU3{{/:-j;=um-O4K҄Y[Sw|qitV˻OYƶ1{ d!T]>4ЌF|+~tG|E_Wćc|_n"_.ZꕋyCs] ƍlۼ3mZθe֤W\g\6jE2bRac8 WӕnV=iaMoTvLciu38fuM=wuid-?{Ⲟεq=0vܻ"Ҽ#cLf0tM-hޮOMI ]s^a`t+"GѼ}/dbY`Ҍ&-:lzе]kG6uܝ!-{I[۳r0)R6x# 0ߘ5'u|fmvϘ?ўmlI~2Og]hh%sV { KxǼݻZqe-lfƊ .הyf,F)DY9,VƿϠ|Of)$t:]K"NOt99.bZy5|㈈JՉeQ#v~{"[ؤ5o_W@ ]ٔzM >|x.[—Oes/3 <;eYɽl\ 6V~ޞʕ yCFfbr|>ZV#E0^,`oxɟؒeQ>+f?2kI,ޜQ ,dlbW-Dzmp3ftbgYK,pGztoHjR~fB?˪y[Rlߘ4f1e/KNOe'XsvyڒM]gJ6 IDATl&-Յ#0GApEjK{ C]s(⇭~ ̛3Wnfuh.#󘸤mHh' o`66۶Ӭm̘jNf+$e_jڀ_ǏnjIPL"q -OkT %'3_ rc։OțzwJ"gp4O1gD^7< Z_@Ien*EQG|Z%bhtc1L Umy3nq|n8pir#t^~~摅$:+PŹ0pp@@ =;v)ΆNﴤTFw[~,"d͢h pPy$aCH=Wub&[tޯx^l#r(ƬE2ĺlWk8upToCt-|Gg17◝GIM帺fiBp2 %bʑS[Z 1n\}-80SxNzmۃNg܃DFGQ4xW^̜{^"+VbŊ\չcQiluac4s~e66&A-L1 ecvs_:׿1p?\ǑpspU+>_FWѩkEC+ 'bͩ_O+ѧNp@#""*ԊǬ@Ἵ*قfE˜z: rѼV"o$]^?AD髣yjt-*_ǠןOyZAe[WR˓:w*i&p_9 !*zec_OB@1pX/j:8: /6aZֺk Nz{6!a5iߪ5g=Q=eyQ]y'8\T"s0 a& n!Z~bty #fmQ]L#}-y1L}Nw0_N%htGӢ;o(=Fo$-3v=kb ߘ= 5t"}ԸuF%08!z0nTtz4(ӫM,m^L%.""~\^eޏ}b3wzgL&NqFp>{#zΊ+kOoKQ9b~[2mO2@-7m`zu)magt,l+kta4׳m,+c$"}azu-q=Aux*wұDރFٖ;y|86*7&kc&yIP 鯧yiRm8v/901? Vv42 ;e<^l{A~_5%=a/4y׼;}x=egelxl1epeEďG LGROɥ5HajV8mFϮͼwf;kٝg yqlY2_o˳mܾ:duܷ)u2QܓqQc8;8}󋴕Ƅx?9 ;uJ:WκwfXטPXP+v1n3EDDDDP+E0~=ЃnR0hrCIj jib2^gmNZ,~c<Nelغ %RB(/ %ve<5(Haǒ&%NIY$ERbڎ3#R ŲC65d``8 3%4lrAFi)R+NN]<ܠi6IgR "S,8.;wEcqj2($f^I*xlRl J+""""R()ʥcw`{n6?Ib`n>^m]Y]Ϻ߳ԭ~"ؙFV.)˧Զsfln3}ׅˉHkjEDDDDDo)ԊRP+""""""~KVDDDDDDB-Z[ """"""jEDDDDDo)Ԋrȹ-\ a\V:EEDDDP """""rPc[ """"""jEDDDDDo)Ԋ@Q򯊉alڴ8طo :;C#OH:ZW0zhƍGBBm,uv{/k׮壏>BJV]\\ݺuvV7۶8q"tI-"""""kj%p뭷nݺ ,ˢw̝;[zEDDDDQ|5zh֮]{Ihrr2}e޼yt"""""XMLL ƍBp8hҤ gBqF<[ xm>}/ܹY#"""""BYfq̙le+VФIs>}0}t,S&O_-4(!IKK-.l e&{fƍ$&&_*"~,~0 oq"""""R8IKDDDDDDB-Z[ """"""jEDDDDDo)ԊRP+""""""~KVDDDDDDB-Z[ """"""jEDDDDDo)ԊR|[Drr2m_2EHP++-bÆ >}ڷYlY\Vl"""""Rp8} D.Ν;3rle111iӆRlY V6Of׮]SJlu,_SbYVl"""""Rp(JS:t`ZOoOzM ߉Mi}0?ѓiբamRYB[po=ܓVQ4v3/{8y:@7ד*k8'tNqܝ_s8zɘ?ўmlI~ҏ9>?5eG>'k+ nEd(cSvX,"""""F1 gyZM=::{ Wd)j/iUcx4y V} ]U'mvgt;3Lڸaߝy{RV~#ū_b\h r| -c'a3nl+Q|,Xg{o1E1Geۏdނy|3!AfmІ'z^ \M Yz9N.qD`w8U+gz=56%Yع{P>^{wrk3Yb9K>C-}wDDDDD$)P!J|&&fBWAmH([sוȆ 0;n*KhpekT!ip^Wӥw#; EM*r-+ ~T]}1{'NTjCo'Ͷ{9ג%kahs㸢#seCE|EtѠ{o 4UpϷE=TGX3;vO#(&WU I"""""o5͙Wi{.GYSM/KHqb\sQƲi,,GZ3Rfzsp+Q,s[Áöq`8䍼y{K_ݝ\Qt8o4-s tl{`9FQ4 10,(BmLĝϲxq̙4WǺ;<9U%"""""K rdkؗZNĈpXscT5lLɺ;B- X QgC&vf9w +"魝d mYѮa0)v\=i;%mա{z2N$&&c/M"gg"c8=xUsaԘx73'u?.@lW=od 1L[t!w~Xzt ~WuhIg(6%~|3ńxl%ʧƖߒ+n=3,79!>x Rc;k<7fPDQɁnrkVt +;iluac4s~+8sr_v%6qepEDDDD_ uHn JA}0;x>tO[ՓT^ݷ:Ix}-|+OYCƿmU;yV4%W!eB_OcUƾW Bc^t>:o߹-WYFcy)85^ x;'N|;+rHfqpr{ɩaO`ƲF26 +ڶ!\'lH1Yrmˍe8^mL~daFwXֳ2"u3vsֻ|J۷V:ֵ=pz$(6=3 b~yڞd ύ IDAT~Cj&|G_\H~Qoyͻ]52F}l1epeٜyL.s[t佤aVW'؟f̱.x Wlm"9.۵ ӑ}yȿEV 8[#_MP}BsO"""""jsr#_a<զ: ثZ)rvkYDDDDDn#""""""~KVDDDDDDB-Z[ """"""jEDDDDDo)ԊRP+""""""~KVDDDDDDB-Z[ """"""jEDDDDDo)ԊRP+""""""~KVDDDDDDB-Z[ """"""ⷜ"gs1fϞ͛9uoeXbtMtڕrVHP+%))W^yǓm>K] `ĉ 6~PDDDDDPs:qݺucƍnNFNLLdرXsRti%EDDDDZ9$uƆ ",͛7ӥK|EDDDD)Y+lܸ˲|mlڴQFqHN~,y:vǏB@ӦM)Y$adűn:RSS3lf„ ʐ!C.*flϷYDDDDD ~,[rM7/Ʋ`kYn8Fō7ƍJEDDDD$O ;w.7|3v:XŞ={[3gJVݖ-[߿?gΜ:$.6mڤ`+"""""9ZW7@{5Pzu ௿L8~ϜF DQjh"EW*],*ן ZAeeQR Uz % s朐2s]"<Yܼ֭[Ct |nvXE|/o2 Caaazwr|ziiiZpOlPqO-ڵkեKK>c-X@ڵaZr_Ȭ_ԠAmڴɧrJWRP1Ss6az޽{m{(P1 #,J?B-Ya~A t@5[oUppp޶ְahzv]Y~Ss$M0AGzڶm*[nmCڶm֬YVZ5|YF[n Y2e0 lR yenG,õl2x|ꑑ֭[vaPa2MSiʈ9Rci&o>+x֬Yk~{GQQQ>@L-Ϋx@SLў={jeiƍԩ4hݻwk֭x<~.҃>mZW6m:v쨌eYx<ڴi߻h4m4YZ` ]fG)<<*TXX&MCygEVZv."-\P^{-ˎDR0 %$$hݺu3fʗ/o'22R>֯_֭[h{j1 CztjѢEZr+I^Zj+RQQQY"Ԣ@t'i*_z]wuy}lI;Z}O0yۀ=u\r\% 6hٲe~{\Ԣ@}ѨQtԩZff:uDĔX-IGѲe˔S Q>}.kpn(PժUu]w_ͫgdd())) }V8B-Pg5zh5o/ZuA5k1c)7|Uxxf͚-Z[hڴ̙H{ jQ*UhѢEzjo_BBBt+))IUVul(P0EDDDgȑ#5k,}wJKK DEEyӧU&e ԢLT\\It!ȝY#Ԣ.cjE8XZcjE8XZcjE8XZcj t"P p,B-"P p,B-"P p,B-JӼ:kiy?wQ[&켢MSo<;@!ԢH%LV>ONҖkɶP?}}УI}b*'T W@ زjFʒ+֦dy-Ih0hUG.yupڥt;\P|b>yt&WՃ5O!zW _KtR+z'g$K6N7PǎԮsO ~td(8'[M-Z,VNvS+iےJZZ5նQ$S15jjނ$-xju};[2ݿ7tKskɌ4}iLgjjFzl}=U]uuuJޯ9_i5֪]0RPsLmn6eTRĚ ]iktQk5/gHk%( uU/Q+@WV-X|RnAcBYp~ެM7E/UZh7B5j釤YjQY媨~ݪ 2 Tc> (TM6U;}1 ojrWђU{rkhSu\LЄkIe}YlY7EiѪU)XQԌؼP{X^6'֓:TG>3~˵ #Ӱv&,E[5uf-8&úm0ԡc5}?2P*e\}g ~ =S/J zẇuZhDSʑ|H8SY XVkL V .S憇ztCOt]eW^HP:̈iԪ}}$juHT7_hyjS-Ð$Xx-5]^A.w mSK } <54@0\.{Ύ"P p,B-"P p,B-"P p,B-"P p,B-r @Qm޼Y+V֭[m6zꊋe]]*&&ƾ jΝڿݫ իWOW۶mոqcnJ)B-1b̙#+I,KdFޟAAAJLLTϞ=uuשFy(}i̙;w.]̼xbI9ѣƏc((k׮m~!S<W_aÆ(ضmK/O> _9sm6-ZHիW7 @i=(#Fh,K^WO֔)SԼys_k֬)0]VTf4i$edd8β,ڵK#F(up&B-l>K˲,y<͜9S;u~JJ.%&&?WvvveY;w6mdo(EX~"[|y٫W/ :T+VaڰaV^9sȑ#y>М9s4n8ѣGСCg իԴiS}ᇚ={Y˗+>>>^_ Em6P۫W/M6MAAAy6m;ɓ'5sLZ|yrx^:tHwygvAZjo]_"""$P*Ik4h ͚5sP N,?Fm߾/:TAAA2 #cLTddnF}W1cFz?ג%Kt-(***v5tPtkPzjQd!!!*Ud/ ={ԪUo+66>Ott|MZJz gZ]3҃P"=1 C!!!֭.Bj͚5խ[7:6Wq\(իl͖-[ԵkWmذ%6mR׮]yf{@%5(=(./ ^Ѐ*I~t颟H-޽{չsg-]Hu]3҃P"ܹnfϛ7ON͟?_ݻwWJJ_蔤][nѣGճgO}͕sqҥK(( *}>!155U3f(0p~ׯN8aoIFYfiz^,I'NP5mڴ3c ۷o *OYowߕI93CUFF%0kiر Upp|Ir\:} /ޒeYzw^ ԳgOkPjQ,}UppOm?,5hРvkʔ)뮻|3;S}QWdffjZ|ϹϟWsݺ(=Rzu 0oSffW'O#Iaaa>}zcׯ\ru=9;;[=,UF ҇Pb{f@l٢)S觟~R޽ua_CCC5c o P5{lJIIQϞ=gM3eGU߾}vkԩҥK¦aԩNYۧGի6lXL0ңtI)))ڰa_5 C|A3v3'N +99|=P$!!AÆ )IǏNÇwܡիWo 7|oXI6lZj,-PFjqΞz)UX^1j(vm$iڵҥ&L>@;wl:j(_ Oh2RJ;vlAk׮z}^ۓ߄ .+׫ M0!`5MS?ufo;vTBʐi("U`4 +OrXٯ@tEjjF]`]xƎ[`[nQPPP޶-R`0;v/^l/=z>l/(8gG.rS%Ijݺ,XnI7x.\v {9y<{+Ç5f̘C4'͎@!֭[' ^F'vکm۶yہ5rHegg[~&NnM ta ъIѭު/oV7[4kذa̴?wŶm6͞=/87NӧOW5|ti B-e߾}6m_`7n\ޓׯ?\>c$)##C дi ӧOWuI{Kaaa1c5j$)ƍO/>Z̙3uiZVt5͖>?VppX)g)СC_rK%n[SNUbbOkԪU+ڬ,͚5JB-eܹ~Aoݻkĉmvv=ZYYYx{IM6 ƍ+))I͚5+))Ǘ_KkPzjQd{ȳxs*ȑ#G4|phѢO1NII^3҃P"Wɓ'85uTuY_lRh۶mN:iʔ):u}][iJHHдiӴvZ| +TڵoQ,qqqJJJR^ uݺ+/jǎ8q7n,u} ÐRFkzեK"ݻ+))I5j8y8Ԣ駟jӦMZrnݪm۶)44TիWW\\֭]B 2 fL Ða5b}:z.\]viڻw222T^=կ__mڴQ|||Y`rI&s IDATDs,YP|Psg?.<_ P p,B-"P p,B-"P p,B-"P p,B-"P p,B-"b)eukOeoB-Jg޻!Q=&o<٩ 3}n1X jnI/>$jQ,'`p-j ]"tz>ye(cpX:6~]*>XCɧUʻ4^$T:6>]5H_?ZxHAД#??Ҋ_+U^yj(cY I^'=c$+גk_>U52h꘷c}?NڹOO1Pf8ƕ% v+4 uiޟYÐi2dtr2H]T3LW;*WEVU,-PVjQjIcY*ƙ )onTG>Գ]ku oUvQvP*jQ2cdy׳hߑ(Q3Oa ɟY8tY=ه=42PaĨC:5]Z꿴(Juo-!J_:&eמ;)AU%`eOPC?^kߪ~>ʪ۲ƾ75 -zBC#O_No=js?F^?^U@@E1˫qG^G~['I25aʍL CA>0>`I9<{p0MEY T"ԢD)ecrR^7|cyS p,B-"P p,B-"P p,B-"P p,B-"m/ի5m4۷ޒ$UVM P֭e yÜ>}Zcƌ+"koxu}iܸq @[SL)4zו'4Y)IiӦ飏>㱷 zkڴi,B-?|m.˲ /yv@c!6o7ڴiSժUaP?֭[3v˖-~D$,QԷo_P;sL <'$B-DirZ4y"#ԢH<?P6mSfN R' \.5lPCUjm3gÇ5I"1 CoyٓY`)ʜ9sh:p<,:O ۷oI9OA>աCԯ_?͞=;8:x^(`ǣ;Cﷷ84i:tނfz쥀I&j \qO- qF{I*URbbbM1cUV)$$X+W77})[{AvaŞQ,Z!ƌsN֫WOcƌ j'| [W>EEE[ P?Pl2=VJ*{l25lؐ% ă1 CzPlP p,B-AQ(^W},XL{;a5rHUXޖ$_zbbb׿U <-(C(O?~iy<{ˏa;w-[0^ffj_^e0 }JJJR˖- @c+;;[ezڴitRmܸQ^o}^2224ac((iiiYY3fܐz~ϾP?Mbb۫aÆr[oe1PpO-Ϋ>}4M͘1Rpp_ _ھ}{g^5l0nJ/B-Λ>Ha *UO!Ԗ)R|)G5ozgD {wY-߅=n1qzkX1 C³{OZyaPLP'Rf>!Ԗ%FTTDTU]v0=hWN̑5xgWuQӫTϦԻ -y*L|w?u혨]7xplLCiDh.:_wXugzAک:eFM^^Itl}GjxnxbvgX|CmFF6g֒'񛕱s鿣Sp̭G[S{g3 \eZ:u`Q0ժZkն0hYGWSג2*iM.Yg˒G{׬Vr3$oM򷿫/Ҽg덗5—goՄ g U_k_nO-8\/ւ 7JS֋K$Yhd}tI]Uzm\}mjdH^>[DzH*骊.Fm ?2W-#:5߫ٓVۼ.u盽35~{5kȕ X^r&~ .S*oH왨!O_ֵͯ|fx 'Cw4J7hH)ߚwh-#)˶ܾ7߶v|mLͫ>o{Z=eatًvLmaʿo)~gi+0gӐYz*O^Uth $ek7Px5O5jI[MG[_ݭc^[$B-pRd<~ p,B-"P p,B-"P p,B-"P p,B-"P p,B-"S@)byGrgwTL2yT?ƭRT)$R֪'(o7wiQf>leo8RiQ[ ]J.>ڥxs="P p,B-"P p,S z.*++YBl]ZR,RZZ8!co\."#"T|yaoj~إ,5o\6"33K;w~]?eu/})==Ce'$IѶ.J?pԔTխ{nݺJMI?qB4MEDD`R8FVVeQpppm{czRcz^>/׽}^l{'GnMp^2c/G}p4ҩWkŮ4Y ӭHָTukF+>a(AY[fˬUu\%X/Y3oaRĬH]WWcgv%`@L-PbNi*w3G4u^񢼙_Ѣ]Z%^=ˈ;cϗzٷ rrO:t*Sdȣ?҉,CUuIKU9̔u'}ᔪV֯?TK\ˎz*K Z ($H֞hުuGAvjQ_UY X'J.X-*:j lXMEULKRRREwflct٨˵UĪ?ˏՁIo]YTHJ 4kiIgR}k3 *$WT# Fg{,_/[Mb}oOWiHeTn[QyR2,6TZQ# Ud)b\:mIC:x2Z5k*Ĕ**Ph~%gGZe#I):Ud:_Gڱ 1$3WRc=7IeVڵ5}j3&OʻGfW;tUKҏ+xRݕUaǎXDU-VTTN| \`BSBl/3bCoRMZs?ӧ=8^Kmk):[KfH!;_1 dI23UHJvHBLCժ*xdWTL ˗hWWV s(Sޙ߲g+)zEE+.r=qL'.I2CŒ:k_M!F] Z֎{puV(4exn: +6ؐTUUV`)yUDUΔ`w%Jl1|,?~SZ9{]ĸʪ\9SAoYQ+Q+}O>Z^{{}:~fU+Q/;ܪp%:LT}?h̜߱YQoN;,۞EajieON{%yNʈSl$#LUE*mNzVιJX,y2Dhiq? gf.߽,g5l.hMҰq*1~)TWU's5ЧQ3}digTShsb/S:s -^R5 /~1ʩFة5lR XS*$gB*WS-JmJFݹKknVWrWzMZ#иjݶrg_Y%o۝o;c*gF'׹}$=؇\MEtWoX}@)uNfv|7С\#)~Ҩ(?*Vd/$'V/KoMg3,vs|۞3ʹ8wۓo:S}.kO^|6ҬYZcjE8XZcjEci/23 \.YW\y^\.{%P LjЮ]eoڵk"#-?:qℼsfy:y"#  U5_nZflۻ(KSUXj/݂(FF ct@61"1pT'\ ` $aK4ĥ+1c^F Hs@wUy:k׮y/RuNֻ{?{{E~'''qzzbjiIF r IDATE05^bphj02jqF5557VK6mҦMb :4VK<?S Y4ES[_`TMLLnMyh,ZȢ,ZȢ,ZȢ,ZȢ,ZȢQ{s~֬ڞh56>XuҺQoлv[Cz#zxv.Qbq=ұ>^cq}iЁ-[5VqdPG@-wPw=˞d_7_ݳsw-wP?wA1ȝ;̬8MNN4J;MwS<㐘hdo4Vέ=varrB[nv(Vk~ؑЛg~b׍Pwͮ[ên_ӤWz[nS.}5LMmкu0>u04:@UMYFAY_SIjr7+ۏͷE'ws-XFEQ7ޠw$mٺE^uoۦVΗk^UGu^ Ó~*e9`7o^|)7>q}kv>7SNw(n u#13peOYn$RS[vsV@s'Z}KtѯRozQz㫎?Զ~/9 _}-tG=V7䊢uk_)'>Z7<1:昣+9\<E/݋SW^Gg>Vǽm?\_\?drq<7TVmzsS*c}>S3ύŊ]ޡ^k??/ߜvWw%-U;R}  7ܠ=3ze鬳֗E1[NRѩ-G߸T_^{}?:zt_\EL:GyUi}ϖ̝+٣uMLs/d,Y&}s<]LGm~]:Bs;|[/n=Ciop3/x.Bq◾fݺuzޠn~Qwoi'@G$s;Yy.bw-il;֎o-E| 踟ސ~*ۚئ?tտ>?\ f8>};t]mڭwto_u>kN!v}z.>}G|Uk;RT$Ry.ImO͗ Th?c(6g{iF 46>(#R{mH|>q6jؗmK__APQIlcj%n"mA6A}=`B-MI/8R[|KǼNyiLb9}wW[ҋO^h(񃛴屡}j?{}Dw}:53=BzA=N\G1_U] Jcb.mzͯY6޻N7뭧ӠYGitGųvn):N?c맿B;?n}ob۫N5jJuWi۫NXT=#tק`9}Kˮ5W_.y=5tCwlZLݯʝ6^O馛tM7n}OgN,]׉}Oݜr}1覶&oq_\]'DWg.=_kvN@p>pO4^-=ym͗wmk^ll/"S599۶-GcRq„C?zhN7o?0v>'-ƥC[uCxݳtK5ʏgGǿTnm;WR1S߾Z!6U}PNҤv`DžJ\j?}@^_Ndrs56峣֔}7z³/\/;/I˷Yzsu9/tPiZu褓OѯtaT5n]zO?jev6OB{WCct%׿U/r> _xS.;.Lto{.evo}yw/>~jˋOy=ES4Sŵ)R3xT?r1_ވ'ĶnqI.fu;?|iUӫv>O{`;뺗aE|S1{H /}NsL W*B]}[m:A۷mnhW:ꨣj\yǹ⺎Ag{'tl`߼W6:XCkjy,c:c^QԦnXJˡf Iۿ]{]ML7'm%'ޥ~yb6lܠzZ+8eoxhRq^g=Ԗ){1VKzS3Zis6Mm0cjiZ-}nj||\SSSX>'&M.8FtSko…Orhԇo;FZ-`tZ-m֦BZ-MOOk|c?7k߆sU}Sn4q]G7{i3}Tnnh!gX<~/yщ_usZb/e5>(O͗J4unqozôyl`>'?XͣTl( z>o^ns[#0RZVY3bS6yJUklj71~o_IHގF6߱}{)_^..-1_ՋB ,m?D\_`&>=O.~sCcOjS7#'֕m^c|"k`&þ/ű*Vw_[V&UInboA59-@m|N65&O":KS/e7ǿ9M#~~Ttk5/}vXN.Z-4s6Fe4X[ur#*sSZ]#'}VJU~ ڛj )̸ǭiV7ޙuF]z5?$[j-u*{'j4'}f>f}ByNf1.[Ѿ:X|)uܸ[_~( [$w:kNJVg>?[a^_{zf,pbq&kknZ+$ߞεZݻg:x~?۞߶F.gq>b^U~OjB,[xj^/Υ:ڒZ?4:ua9kh[C1ͭ6T܏w17b\ZZaTh1 6Sq}z\.֙T<5A6 V.nRxӬ&?$؜P Y|og_S&:-K]ӎT6c,5F=n>5lx'րΟubmsD=dSۄAk:+ºFĵ}UZh1cOS9mm׍ж:uv^[K ݋Xc<ů#;ؘYais;v8Ύbqב;X<.˭jj , xY״5 ;5k9-n4ZWv]\'_W[ ײbNlQgms?Ƙ<*D>}m_'TCθ;m_7g_Qtjcs+3ōG~Or5PF*k8fM`Zh0ˌiԘrNc;:s:Sss)8,KxG湘hcsci|~_<)Qsxubo̊ڏrhq/:9:Կ'vkd}Ck kOj[{ lrb1RkTOabs_[iMc>fuVZ^-cX"6;sڏW"ozf՞oBUy}kot:ޣ7><%OQd_{󱇈{{k7,v'^hqkQN]+u$Gչ6UIGbqi';Vy紸QOhMӮcײs&6uM[+Ľ(O &7~n]b&7Q.^:綎1ד~5RhieoIshsԵ}_kfєXu k3؜ڑxGqOYqJqשK5o8m\oXc3l1uօ#TlŬdS[hѲJ}3o7F>o5orթ7v-tXFx11:77>z8\acOgSU[]v:/+bB͛+sxx3qOd~]kDՉ5:}ubvߠĸ}Gԝ[sxt3iF&YC:a1fr:ӵjj krd7[Zh.M[KUWLZZt?onM찘:}~nbދ*6y[ż >:|cqŹS׵\\\ -m,߸_YS];%Q0\XsYm]6rAJLlhsXþcQubA5vnrkaڏqkTlV-TZs!D[SjVduvngM+:s{]mG>Gr9QR'&<M1Aq;wl}Mx̗iRZD}L.u־7a?A&6qnlm?w6>oR{r뜺uL:9iq_G#j2I܏ꌩͭ6Oդb-ԬQJէbқr1ckk:۝oXrr1-ӚK,o1UWϭ̋}En]/28#hZLyjq~SkEx*Vi}~7U Tܿ\ՙBʘ;6X Z-ɖ?W+`[M\܏y\դX 4O8cǚ\3i?+[?6rs;O.:/X*obvs^ZZh(ښKuօ0ʿXVc?sXlsq`5W|n4;leZ/"51Wɺ=ѯFǟꜩ8X[,-X%kHKϫc*6UMVǵM^8/n(aAM5 {Pc>c~8OiR[iOjE嚨BKsUoI:6iS[uƖ][Cn_FKKcq `^ZZ\3B3Z3jk+ǵ^F9~̔6BZS|7kf1{ U?_n{G9yYM&jrb}{R(5~LRT>֢'H6c*VR+k^}ֹ(/r+bB X4+BZ]?[ŜsS&0=@\jR"}ĸŬӨby=q[{]yrqjhb,c#U$Vϛ=Q.\K5uTF16:Ru*)|.^J=-ShIr69וuo+:1?cx.kXmQӼh|<ĜcT?3,ǡMmōalbv3~cy_sMc1DUc8Vhz簾֤1TbK;Sn<WϓjĦ0p8ǻ_6T<7WM-Qhqfh5s5:>s)j|\*IKue_#r5_T,6nZFuMM1xj&qD/{լ-ejnR8WMj^~69HKRM`R:S5e^M0G;G/ߋܺLںu yjr\5Sr\TE4QU{s\^&Uԭ62FJK1rs/ƛ4%4XMkk@s󨬮j]I}F{u&7]{eMlYKb,M.`8k)3uјbJu][Fuzob:%UyUnkEVվT>bMӵsMU]r6@MՏZĚ*u菺 Y:뛮SbMZJ +(5^z)'ZJǢXR:&MX|xuJ&ZJǪ4Ӵk1 6cMTnWu>A\@U}}_ORT]ݘii}OVjzݦ&I<)-yuM[Y]Y.JզbRxl%Ԛnn~tpjҸ55=nl%Zf=^\.sV~7oerq_Н~5pMӴ^ށ憩:zF/{ ^^5z?X5?tcwy[\i@FmJ]h[rw6 @ c8gkZkڴ*<Ѷfj#+iM7Uhz= А-/76Шj2͚IENDB`kraft-1.2.2/manual/images/en/units.png000066400000000000000000002356221467704360200176420ustar00rootroot00000000000000PNG  IHDRzQnT pHYs+ IDATx^wxlIH " W6TDDņ?+"XQ׮JQUEzׂRD$(=$ݙ{'3[dCgy;3òofv """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""&""""l5@" :XW 𸍈6 mo]}{DDDDDT?՛BP.%:Q%bQTmZU[*4kycP(j55WxE]-^>QUĻcoZx-(Uk1WXkKNDDDDD^"ZX-'B1ur"UNQ%ZQVr" [uDu:QNWy#UqUu֫:rwQĪv9G:˭μqhSu֧:"]Vy@tQSCDDDDTWTaDi^$SRUg=3,rQ⋦Ћ$7\NHUg9ՙ7&:Tu>Ye?NDDDDDK:"UeTu«*_ydwsǪ"#""""؊ujyncnq X$2U扉,UGp7VP'\"""""yp n*[y h7|mhN17rC"#""""i*/Ԙ))D'ͯ(}hyƜ89ńPc@q"""""J ኷PNcN1'Nyx(m~tE8ϣ>S9jp򈈈Xcns1)G}9ND_e5YE\WcNԜhDiFYym߉8Bw~TT7?ھL))& 7U-4S9eXp*"}H5?ھLSBɜԘDDDDD 65 ydXp"͏4]HEhr-ϭ-SÉ6PyQUhq˗mH̊Wnm>sꫪ;X5jLp*bj_FB51 'c"&N+DSDODDDDTD[Pjs*(y̒꘍l11-Ou=b 5X@j \4mu~5j[_-H1u^WcNS5&թX*8Q}RbO1uiL>S+ UL :ܗԂSL<9&bj\<Ը۸ꎇ'rBrNܗj[cr\=>(cq9&?T6ODDDDDգXn}5TS)&?l#1y*8ڪPc@}^nZ@ºŭ\Ȋx".Zm$ *\""""DMq*7bMQyCu\9G4)G,s-p{qr[[\p+D[_bNm58jq*ebL].}r,վDDDDDpT㢯y\:Ģ4:/Q/Զ 1m-xPEZd#"""""Jd4 #kkjVkTi0ҼS|tV{RaDJj:Q.z|m٢9n?-Cu%Nw@rRnp|ѵ ʼ^Fuȍ|5*?++܊SGEt(Hk.5hrc6Z x# jqE[}!M5wBý0|kE6`˫Q5/q>%z9gAm:vyc՚ Eo{Ѧu+iKx;1e? t 9ty#/(P olĤ{Бn]:aHҧwO5kINJ=nӪ5Ac}zĤ'ӂ; /c?> χcm|olժ%c χ3ao5Ma;9 |xj ZzIx p,_RM%"J,/sա U8Ox޻wHL _b0 <)ض]^NnPgs# u|vV[*cj_pǔka1R-E[-HE[>+j_L O;[75؊&}`H%m0,_L$gz OF6ښHoa-hs DriSu| ZxwE'"Off⾻nì__-CQQ1JK˰c.1+pagUXn=^/5mSeY}x\<|ѫ^wr#zv={!˥+.ENcu#zݷ݄1D>(!:}0~96BnA,w4k?|/lێq<}>gҩ#e.dtn߁;wnINczXӻ'r :[n294h~9fj?\]ƌƅ矃c:֭GqI)&{tǙCNCiY.hCN&MrrZվ͚I7?6"wr#ڳG(2>[5&232;n }~}ݷ݄7ކg_u]G6m.أ!ye2Ngzq0axc3_omhټ9fb/2̈́9KMD$[Sg7])g Gof=JrΘ]*V Θnc̊犒Z׈T<1P6Z#'6iPm,J| *_;֬ŔPV-DD@vvvًo~MWnBxy8 i[.FQQ~D֭P,񊘿v|χ oIJop[G)xWy6bo~L?ۻ:+ )Ƀ]0}NE QRR X*ǕkT~m?,˂UiDDm\31q<գ|^=pxg5rn[U=uhV~\r}#r$r%W9jMԺ(9aBͫ=//LEw,8b4h<6ttFSqmۀ/5C8:냮HJJo-8~""OۏƍqAeM4AQq1,*ع #++^=oW׋$O{l3{X&9kמymƞddd#_;-[MsrЦuK̛3< mO~N8wz#nn,^oNx~F9\tx84 {lj*۶Ӫ5:c6L5wU=v)_y<-w{C)_i<Έ{n%J2&}i>[ZEI}.yCS 1u*huؕ)YlAO1?ѓ샑QS}0-e@ia*t݇Ǖ.-rG[o3glL8[տR֮[ #+a"3#))a͚¶mޓuh8'2+OϬT7nT'g/(mx@Lۅ.B]p㸫3msc{u()- ʑ%Ukbbz#27ljZ<8yʤ?$FK)Q*"$U;Ж X |3)QxmcRm+#6"ԾS<& Z9&~.h%5C Z 5=wFn(^zſŦO3q` 'Ux=f<~\+WG=k.ZgXGaUxb4Fi8C;dfd`X>_2HKKØ/W˾X'oGU8[m!#pgоm@֭1 !--UM b69]:ug Q5oҲ2`@?vmc!כ(ZwHL Z폍! ZUr]*Unݺ*s8M\>ICSAΑj^LmD<ԖԘءb-s &'-ޝ8Hrx]9g?VU\jZy/=&" xqعk7F7 7\w`<< 8x?6]u9͙2ko}to~~ll4&^-ڼ?Gj ;̜8y;d!^PxQ\}`&k3y|&K ǣO<op,B_:2 | ۏϗ,ũ'|8~7g6,O0WM!"JH(fkRU< ,}?#YXAD[U,my1Q@g6 Ֆϰe/b*Zѧ-#ʶYyhpX`lK4gⒸP~(\>z#"Zs1'l /j--ijIcTSPjr #?KgrAC}!rL~ˉ ݛے.Nq3""!u$oжMkzX [""ZV먵!T?Xn/-.8k.B w}gkc*%5{V#p/XJ27I$?p~)~FDDT T9XEv-hRLDLGZAm-^m,jUUۡSb}@EUaЋ`~4 "Zj(h7@[lT|\BjV.>Nm&Z'nW7ܖc9UܘKNJi()`$UDDDDDGrTA|V-<<9TݸkDHF9Om;-CCޙNcpƔǓLt6vz DDDDDD1!ξSy@ETE[n˫u!Iqyg8NqVVr,NO͂+\p6.bNc@I.oLu8=<*^Vy^wF`hZO~ < A_pV1Q:9lcy;$突}̀ڕ󈈈ȁ\:.}] u萔[_&FqODDD`tV>j]ԖTqSEXnhvTś}r\6gݲ=ӭfZ"""Q"1̭X(>vBLeDZ ST~ȱ*)6.z@Tig{P*GDDDDȩQc- 5&4/ju6wQjLˊVY,DDDD ͩ U9eȜb&E!Cqʋ$/Iin """""k&rjԸ"9Q)&Qu;3T<Z6l؀z*mOȶe,3~zOUā]7bཋ"l("}"KhTVwF:yC%%%Xr%o^2H8?@uhǃN:rzʷ,Tl=) u'!4DÚ#;g] 4nT19:VC/=ewFtlX[5۶ x:3z")CDDD':;}qTJ4;(<={`ɘ;w.ۧG4+Α 3gēO>ԩ&N/<7c۰#w98ksd{جR J'Ac#~R x4 #nx }65ێJ>[3z}옶J  >7Y +Z{')R$de'?t zRcr5zңpn?HmW0u%""qPJQ+;$vL]}v5ڵk?V4tU 4u,ce2[=v ];&IqEVi:t=M&gIZ^|X"""݇:P,j:S 0P\♪.86;s:v V8\V6g4$u> 'IBhE(,,GXؾkQoitO~Y?d %""":dkDxw!S3 .%`Yi׎!C1hၹo~ |zc<,wq[a]o^O[ GL/vyMM| :hͲҠş?-_DkHiF$""VkXQIFѓp xB _")ͶagkhsxJߠ718{Vd„{\Ml[Cfv˂U k?_>*.Zm tZoSZ"""y"QZjW\: L:p`hY#Pj&w飘}4D-j cЫagۆe0M忓qm6A%7qM?CDDDD13DT4Y1z< X k|&qЫ!9=M[uD~1d8}&<Mw?;kt.FMd'?UAGˑbtC\@Fp=Jq94htM]O]-¾"""">DT{4ߓtDtSPyƄ0i╈jSKDDDDDDuZ""""""XQŢ"AϧjZH-rssJDDDDDTsXRDN>Jgkg͚EEEAq"""""Ÿ\s5x`fy,??^xaPkvPQ"kC:BmCQ}8EGlEl^|Ω-,j) '?>gk5Mi,fzqꟜTV?Zg|3DDDDTU8 ?^{o/qSQDT%e!#tFqDv4 ?ma'~95[4Y,i;J,t?7N8=/AK 1VXt=._*|^)PVf`՛B8q8'aw}puoꗹS?&ET rd<`,t8" cig0ܦ5V:ADsڶh'V>_ZclϠg#_OW:F/2,{h86ּۅ]q1vH_1;?U [Vwmo1Jozr 9ޅo.RΏ3r&c;{qۛ& >[:݄9o_6g%aO -~ w?o`[Wc|6Vx=Gǘū37.t|) +=9[f>xϏJ'`M\[A'c-aӶQtt /a5}:;O̾_XYR9eYqm`ŜXV޻lM}X<1m|˸rz;ij-`Z7)Cz!]MCP Z(?B 4iq- oP%"#DOҍkļPV1 9)0<|h}6̿?zaĘc<Հ'=\1 ;>eh?&\|T+de4@C5@a9`#bEa6HO2֢?>>-b釣a'Ğ6nov8c&<hwE8K>Ǝq><.ǘϙ1QpFL$h _} Ul1'oTc-'# m6;[-cm C/CK8qYWd9 /|WiDHKѽ"= Frs{LGލUYxfH?8sq8yx|E|C#4QXE1y; lq&rDd"&!|RRbȳ^~LD LCy_>hV*%ڶN%k/o7bCnU*"Wq 7cx1gM*pPpT컴hAp&"S#/o9|iOaҦFu06kh bo&sȒߍœ"[>M{ IDAT`cߪpëpv[5@" 6JKJ4DTL-%8 COA3&`Q{㏛`4@|aZvbqykSi:sTyy8/GPӑ@]+[D1UBc عBV,ei`I} 2MGE-fbo><;eZpǰi ({+bv9fcman~ѡ>))Dai> e{ߍawy9ON?)h*[֬nPJC\mD~]4z&|vp, i;Fg\pIƽe}wJ`ϖ_nK Vf;v-n;(-.BQq1,@o17VPx6NɎ]#"^~LD +x kډf2[v M``LoݏO㪳ExhfhOt4|=}܍Wo={~~ |V tEti><ԍ>u?̴{=x`D{xJ 9݂{7M̱`#{z{Mcl1vo 3^U8;w72bw4\w {=.[Ԍ1hhXS|XE8SMO _ųu/l~:b SѹBecI/-IxwJWX ƞb;8E8[c9x ⸋ҥ+jFo;Nyn1r_}tH}$I}O!ŸGqB>+o?؋ONQ2c .򛆶 +E? .~^wR32mhlVMӡi@ܲߋtTݯף[׮j\廰b=lX7_.϶`Zږ -3kv\?^>?WtM %1V 1ꮁK=Gje.Xǂʟ_i%rֹB" o?683|dݰ?3i5=pV}a + ejW]Wֶn'cʶ`3k: AwiLD`T{:10WkYmN?Ú实ڻ!/&"Cڄfϗ.y3SCgb5qb;$X۱i.B~ON/P'8M3v9۽cOh}{|bW _>{ԬU/?cc%B!廊MoŔ +p_9c_\{Gi?5[Wɹn0=EeBCDZش`o @S@Z]XnoG`*1k%?2ʍSXi3KɳcXaѐwِu_qzkagA,Xޢ/d5(ޖq'g||%?AYFUPT3ԧ>mMtt 2<2._ׯǬf#/0賥lشo:yr|GSmQ[ '.ᧈͬ?^u7B!"s6ʒ3^wns0~-؊ Äwڼޱ,)ְЋjY//|_Rgr؋aƔ5>ӔU2y?(g9{MY{˄w ҉ؼԂ Լ8>f^PΙ/+^*%~j)wyr:lٸCUR67, JkCc^)K6pO_}ZѻOIoWW\41埓+W.6T;<I?~s!7$R WŧjG6史t(ܾx;9(d|:o^EQ p**-7q~ua%ޞEEQ%^]x#k0,KHv=(mr+U8V0iBSrA=O& 䗼!D^\WUV&g>Cԗ(C3EsK!Oo򔃑M"aͅ[37S nUȢ >[/wt&u)bԐ'eƚܲiJ> ʁ}glF\`\{=Z4/;sgo}4t㗜|S>~De a/JMLԋcc.@F1cq9(B=ھ5}|*lx4^OD/R")7B!B$IRK@ΓcohNN&yǤN&ر 1W$Qؖ(օ}*0tѯ({^a;]XpcTT Uqi-3 P5ݪ/aj7G:+(^V]As [щ{*upbXUQ]h~:8g{5cEU@7PzSVFC~Q,B! f}QT?cޙC|XۙΏuy}NVy8]Tl(2 HƳ=G*\`4O""V!0CHY(+|Y9]EAnc$VB_MNw^s@=.i¤ط7|:e< ]\ߥg76|Xw1W01xzh(>o6P6& /Tiה1pbܭ"-VX zZO뿤=rVmEul"ne "h^h'~fq FiN5MF[iٴEoaQ,R& 5UKe[n݆N9Wg83ǝ,ZdKmI+ko!K3pi9~K6=_éu/4#sԹ5>֣.o LZBIQ+HT{r9̘#Fgҡj'(}גp^:a(iҢ WlՀ{qSBǤ8*ȭKВ L@4ݷ1UQlK4TZrm-[fDSV+DY4[fnr,%5E,g[@K^kT$9n`62a| yRX8ޚʕ+QZc,#fClBt!s$/H_ԬmߘRPU?վye002Iw*^-eg*حJ+.u |}޹ft "Esc;64sPr,%/4HN?1G̫M%0Q|٥ N%:9<BMZ!DۘRPE(>+uo5ܚN}rijB[hK-n/j4P˙ Y8M+:Ȝ9ڒölY/)ͻ氭nGPWq,3'V'ZyKz3P>{8BC?B4B-aq 5}]6Ur7ot)nCcg> a ’áT?-rRN_79laW T y@̓Cg+_Ler-!Dz'EB!没4s!-Eq[kIіEpMjBVs]m;+.c e̔n y3jR{L>5A;7 _˶x@̓K/5^y7 DY%{]b$rz<:9 kcМUMNIb`H-Q Gs7z!2F+#kd=;}YVT VאO:fV 1 %nnEinqTlڞ[($?c1܌;Xj{֝ҤsJvmPӮB<#i_3]J?cޙC|Xqw~X;[#[ {qF"2# !U\4I ǦZUId( +sp3 cr8&n'֞%;F܅]_wmBVB!B!-)jB!B[rbbbظq#[nٳXV.B4Opp0 6l6vB!BdpRԊd 000bDx('|B?~.wb*B!8)]Q<B!BkVst,ϳv!rj MK]=z*q &d?M!D: {jE3 b Ο?ټy36mEFd9ɽh٠AuUz=[ugѧm#j}¬~iHyw ў=bS~)d'Oq[^ ur5hF ô##~clzaLVփSipۢt t.FLͩ_6Ճ[_@4hh֤]-Mк֮Oh \^n9sb:Tو×ޅ yA5 {ܶ3q`_jBP:k&w\j[=צܪa4kҔVn` 3nG`B:0`>Įo}ur55ecjw. ԱqfnaGw[H$$7:~T~!^4o~o}1~/>OϋlۅV𻝚R+ڼ/{Ms$IտvR?0X)֠1ٷ`mbszb."ٌf pԭY0`^iD!D V"U]v֭[SJڴiCɒ%7nVֺp4i҄MRF .]Md01`ւ:"IoZ*zT1k%?2ʍSXi3KɳbC+Zu` IDAT3{ėl=~ )4}df遶kvEYc7u㱃Uw_%Gt9U7~zcn͟',G yn 7c|c_<7/Pw6o1rc:1ÅP,zoh8BlٲqUN2}.X +ko!K3Yi=Xz^'o㡌hU#Xr/<}v? fb }}wZ_?GًdgռbS\u,,O0ÏR ƙ%7M sÈXq37ra#| r4oYϢ x+WrxۼsءH#ɏq FiN3(.q`9曜o3-<="VhXr%Vʽ{x8q"X'7.\@&Mطo_s] FScŚ8sׄ_Rul\Һ=r1e-Fp"4CL tY^K<s^e֫4<9;mD[TC*x0sdM7hejȉɄO@*\-/3sNsVGi܃|4QM39m?DJӢ}5x_R*뵥n,T]dՉXζ֨Y=hM#=l} CQQPTviUY^ $ iy?1+trZ_ חŵS㪕J8/R8Mn'CV&DN* Ͳ awvT5~ޔ& Iñ9i ztn>ۇmɫ^~Xt,!ٝMv*x<VnѢ/Qe0f=;峺B58H)RH… ŕ+W.]vK."/aߙW<ߛI笧wcv.-a~~j~'b`un禣PQ(U;CX.avٗ[]f֢<[ Y΋./۸Z^:\G4TM9r[N;8ꧾ%|)nCcg 9|{gmV!K3s>hD]:K34{\;.ixv$l9|uI;ga{פ}q9S!aecvṳ)X(xS%,ˏ#d ^Ho(*~dlW3ޛĶHs"m="ٓ3f_a>mBrb-OJA;}t<41-Esx'i62Qx=hu<Mv9?v,7!cG 9ቝźP4w,YB\8** )[l]v\v-r,[EIrA{Xlg,9,\6m;L7VFC?Gd=}YzOvnA64X -!autq3|0nE9~6c8^::V}u+}':u|'}{8ٞ.*>׸@P+#'gf?,]x9l`l p4ÆnŰl}F:$^cmt !샑/j_1!}>, ĸ;?v,םy `8[ {㊜D&yeIm'a"D S;fԩSѩS'dO`U\[7}ҺDkpQQQ}j_7p(⺪ ^Cq) V]M/GgfϘ˟l+h.J'x VQPݿ]MUs@N}/ױ6'M!*)jERB 1rH @ R !B!;)jc(dј* bꄇTq@l\Eꊋ5B!RⱓV $q}|$B!R$-+)hB!)IZHA+B!HiRԊ*h>>+Ws+ !B!S+R݅  I*hg7o΍70 #G+p1FSB!BK'>ݺu-hK(dBuƏ]^A!BIQ+RMddd9رc'O0 ʖ-ə3'pؾB!B!EH5:t(-`(Jcw%B!ȼĉn Z@ . SO=Edddo޹B!"Vu6=/ {ljw!((B!BLZj:w̐!Cח駟&Z:ԪU-[РA<<kVsՈ=J?]ԏ:0gG; r06}.wy~o<2p jz([N`p?w$!yLinB,}mi!2˅mL߁ըT?M<,kBpP ^zGn6s-ܪ+7>mQ30xfՎTߞw 1n? '-66LlxyRL AeP-y^G;rp*-`[n,ѸLjوc0 Zſ:7E_Ȯ4Su[\!ݚףz4ym?_u]-Cк֮Ohgߟόnhm=mps?`==.yTz4I?uS6>9 Xi7R#ph}9\V¸Oi՘?81Lю7YʵWm4mĊ82U\!߬c4?0s2}Sw6o1r S=kYzYκӮm1˿KPͫH}C=Y9}9v4cs>lIF{)7Ɉ&snsu ?9<|H^cPGVp,Ov(҈vc5{|b8|5zHsʨJiy,^Qτxn߳ /iB4zb k?K^)I/ UQOfL~}Q'1nL;ɢn명о~A<]6yPM ɧ4usX{Zvm)_<~oӌgmeyEUQPP5 MSQJؿ]9+՟&oNb9Ȟ;ΏqX c6sCՀ4c-sXKFxS5gΡ6(yts9u ?sl+9\+F//ܼ̓Bt*o"Yk̒|N,O7zC{f%gNrT_4k44 O~Rld:Wui" pc)Y񠸸 GbWsWRULZv|c? US Cťw8V;~rK;tgB-9r,') SEU̱Dso"9l<䰢:rTRm;HÕT@_0Z[bUcIZ _߬ܺv;/o/ٓZBHQ+HST_?|=\y|.!cq}NQp*Wlm<5T*0MeJ*j|5nZvqOӊӫA W=J[M$X[]lyS ,Vj(wlc!Ӏ.G]gᡏcmq3Ga{aؼgRq|uag s8;r$q3'V㙰r^VCȭ)-e*G_o֥_܏X/U|rF!D !xBuiPwٻ:F5Nbw߰/҂ao3gm4_ˍyOunqCy.Byr`b r Ks-9nQ~a&O9#Ø&V˹7Zp:Znϑ0ya#{Tȱ3c" lX0ᾣ:==S5uÖ[6Hcag T >=Yj{ ~_K>]%A8KB'BZVXAɚ5+͛7ȑ#]uQF'O8p 11nn \p0gN޼y߿?.'dH߄8 jP1 0\|ѳ)j7ѫTr90}5ôe<ݚQz=B7ª;]هm^s[MN#6W[=yqQKwg`kM:ߠL}#SFu5zarj/G> V w8sک)1p['pAIaFK~r9ݡ95[{Pr3Ye[4=rbIUW͠W|zKjTLF\~Mx$HB'#_S%hw~<:9T7@sWu79;&p7'ǎ&4dL: ¶D.3%Kо}{Vc!**7o;`V+a(sN:E|bN߾}b_KUUf3qpM4?-dUU^z|Ν///,Dž\l.\H6m5YP'YWՂQ,b h*VWCme tw>ajhq ;.űa(ɋc5:*c/2t+:q15 yty}o`1=0RcaCb(qi88qk @7 /i+wfCP?]nWy9U)gyg`OV ec4o[i4ol L,Rʕ+Tb^$0 V+!!!9sp_:ڣ۷ol(h<oϬlڴJ*lٲjh}R[**گHeJiBBq<7!a"޸lSz:/SUTU_yk)S1 (j*u}8qȄ9\?[8H lsur^wqYG4MCGavލ =W_Z!9IH_|1[gI&Zq1gΜD :-ZpAEa;wv%ZB!Hū8/N]G[C"X!)jExXQix⮋u9s0gEn=콅BmOkBQrB!BtKZ⼽?~<ݻw')i׵٭nݺ1afH!B "E2c J*hƜ9sܞ PdI֬Yi4i҄Çvս{wiӦl۶-B!Bd|V$kYdaĉlذҥK*&pz+h .LYv-KvІ鉪,Yu'6uB!BdRԊdUe˖ȯJ߾}196LL6nݺkw.h p[v֍iӦwTEQwڵڵk{eßB!~,ӓuǩW:u#d21c j֬ɦM(Z({&O< S@6oޜfs~{mϟ}۵B!"V$[ܹ0 EQPՇ7LtڕΝ;?9}}^ۤB!"㐢V r wUih*u7c"3V[FUK^wCt4޴1'kb 1d]/.9VLXu++?.((7$T(ab{=$6!IAJ kc&,(@QpԳv*fRf-]٥.HǤBArkHt{v4 %cFƝh\xUu:%Li|i9ܖc/\'*99x6OŇB9y[^(t^<+LK@݆|KԧF+d$>jnCZkrݴ5nO k&%/b)BF~BA&ʽ/CLfn=c{(ӷ1[\!wTFܪ}c/J|_v)o.-7-0Q"v. ؋H9hL:ހqs8ݰ ANg M/ İw?}ofvH~2w x&c_ W!D${ji< i;ycc+ټ?ojfF_+0f]n9?M;iiAb1O,PKX<aۓx*(q0\*~LWƶȠ~VYvg ( j"[@iI8eʥ?|-E߱hH,[I`"VYV~r\%'*Ȼ~x YM [X玭MzUk֝+.b ;Y\3Yα4{޿7?t++&9¸x8yWAp4oqcSFRLtc%??yJSD,\PdK )P ? V^XɲѮo%~,HM͙| \wy<?QvlΖ BA) ۮKS#Х UkIrS nöEhi8띭87µ:JϚS;6;H~X<ӈĊ[}[EQ3MvcgXPv8՟Ds_ף;7%*7en;51[%>O /ԙKw [!DKyur-V, ĸ;?v,םy `8[ {.`D&yeImG?B9i'վql[-SU[~{^>fίXqfIJxxx[󔕒c^xm5`ISA4TEIy|M!Hc!Db=gD4c1ۭE2wm8 ;޴@b3wBdVhB9q*p6޴@b$B!+)j#7-,BFZX1mgf"!xTfȊټ\!B!V^v@N>h:ly/TEdV!Bz?R0͘ff i7aZŨҠ5Ъ|m@|ٽ>]0nstK_yg0-X/X_wlWy`>;5v j eqM,B! )i׬_'M|4JX49pm'QCȫppvFxa߮g)40wf>Xi +^jcB!ȔJ^UcHf^DWLX6m C +W]fTG ĥճQ77/cYPxU2B!ȔdHE:gupUUy6v& 5Lٯ5DSe.^O7g#CQx7㮞2|9-Tc^3&kB!tƸ1o}|޼J4[>}GQ} ̦jH)* $z, ґ* "M)H.SS( -!tB;f $Myvn={,ԒyS/h3aoTFMVTMEAN9g&CGyͫɤTB!Bd22X#*rQ|a4W LЎ'h <-eF b_0rDDꑓϕ$#B!BdS+Ҍ'WcڰNȖ,EiyR- &nӾ'Jwz~VS>T|ucaf}ׂ(5zO`V ?3v_wb:TB!"VL:9mȰ/5^˧/n(D[T4Fl㰯7Ͽ/هwEUQ?ű"0dNǑug>kxO]52>clv1$B< 2X"U'UE4뢪(*쫡iq=iu"-ra[}NugPsY?=DY&-eKk)/x$1i;QbERILj:̘**VJ@ayyOMZ!]w.R'2L w9]!g"IQ Hb8j37w'>"Yje Qs9i6]8#o}IR+jzΎ|9?ʱhڊ{nOeLfգAwv/v0gc fO>:C[޻.cxW7p&T"/IQMxzzIUPT-vwʧjɋӲU }CVZ!H t':ld~h4l! դ0c&ڹ z̯^o}fkS0i H4>pQp?YeR^$f"a1Y{ !;Z!H=.bz-A954.NVOnOwzQ#FһFa|gKY&1MY|$S7^CUZe6dPh%BIOB%7m9/6Y[`FfXa F󢳓_znNZ!p+rūR;-Hx3k@ A"=YCȀ^1Um2, !ܖ ?BtD#Mi%9.za nAhy?CE<}ɍ6 S icfݜُnLZ!ϙi~{WNjթ\&FTECCh\#ׂ Cɼ-p!͡hicc$ƞ></HB!xB}]dvԨQ#zVcbbd(po-  m!lD~N]yJqBC9/RFT&1=?_Ĥ~iP Q~kSQgUJmwD|>/Tp* ?i}h7qTUExeׯY[2t 6dɰ 0ݟ#R&($"ݒ~k%ʑ3DU(C?qEl3(^,[V vn|%} B7 =R剒ի\LTTaaaرCzl3{'?w,6aCsyuj6+3ٺb^ pe<:7ưXJn mc.cyiQo?/ M6nh]/>ao+c1 lHȄ||(j4Q~f}hڈ@u?0߫m>^CQNaomݽ9ul;UaO2]of>;P' &}fyXPac6EsݞXSE]NmԥVpszL? !dN/׏:/g[k wj: K0Ccj׉Í0[g1l<:ڑXN̜;^](; 9W ˑgذP299mXΖ4 B V­(Pu}r,Il3c}3W++1~~_[Y30{?:ms{dqCYss%۫[,  |9Kn`g:Ox&SQ?u>jXb,aLݴ;/[ Owqˎq_7[ts782'J <]\ =$+};_~VFsq [[,SXZK>>~h[?aR]!b\b|s6]miU& ;e;9wy| /f-ob湇`d m C|F}F&.vEڎ?S[wB<~_V&rmOFysҖf݇f4-94r|AQg{&z1ܧ1ܦTvLlhe :<~ S1֞UXMzi.czpֶ3rye-/M~ ~Fѹ??eo޺u܆]%k(hں?nUxxrӺe 4IinBZݻwW^y V\牉l6c6]&.\pYвe$.]HbΌ;|p!" fǤ(7?LfE/c{"A1_7jg'=~vc.)>_">_nEDwcn{O^Ԃ(~͊ѥ aݺH7UR˭(i*9r=E |@͊_,WPU5GNrʤasάY&&5 {L[0Pf8"=[q[*~ŋW0qq}~}$Jvb,[OxEzkl_fğ<6dM&/bX2^0AbwÛix + %7($|{S&#dޓy?/>Z@^vٺKo>E''IH1]ի'NH0q|||U@"~GtB.]ڵ+g&&&y7=zD>}1c&)^d'mO?6Duy?MLgAAAQTrޞ.GnZO ojjer6~ fnGrӤI9<5A䮏}fg/1q=VܸGM -G, &Afs]ŋ<3U0cx1C̍%+>|abӯBC7 k^ɑ[j6 鞍?tvyo żq /Ѧvv"]VڵkٳgOZgyƹ(Q;wm:XɵX,Au&M\,܅ƣ"|\;х:15nq V+Mz8y'oBB:Ø?hC`@=Nrg ި_ϒ lКjySgZI޴ڝVclDь eKkO/9'A /B@ ڞ;Y1})ǰszQTF:țvpEY5 Vu`UUA`+ۀykEݴ-U|nB,? \XbT]}:ްޜ9s2`ʖ-d={?>Ǐ_6mذa?a0j(͛qf(b IDAT_M ~M^$֞ ~EU]h]7MUuvJ{av}{'> Zkrk] CLjmEU]i:wиڗ;U],h 9~9*X,jq]> ( K`1?48؁$A;ŰbdB%"V۹8X'fbb۷ۺ0-놭~bHds\wfܲx2w"m/ S]t)mڴ~g?~a/&EQ&Mč7LEA/rX\w)BIGQZ鎢j8_X*d=WeEsˏ췒4c=WT5Lu*|<_kA}ҜLf9UCy![V.)d+WQjwkMGrЉa5{5NTך7_s}sѺQ=Ѱݫ,<~M;&V_;t r+F`ta^ĸϛޡoT^Xs60}r-cz4#0 cװ?-J1|mc,%֞ b׼?k%׍ bxt?ݼ5d^#qοv.-/ϔVo 8@{\Bɗ ,rfNN9^ɖ 4ER,n@Zf08\$=3'{ #F`{'' u`}TQ $ E)xk+v}Kֵ(VY|&]K*Ɲ, @ojtLj?\ovzTɇl‘Y׸8Y=TnO_o}s-rK3*3'絥B6O: E~1֒[V E`*4}Zl6wwH^_oթ1 leG0׹YGx<ڻ7m9/6Yc%B{1a+lLTU= z5?@)ѝEeňKeϼ#y^\:lŢ Gp|A8^L X$iEL81^YDD7O>˗%ܹٳgXb=xft=A-[.܃ 9sС9f7cQ [R*綮ˏ40lXQʡq=C),_xUȺɧ=OQ5$~^Fc?[XZsݞ̈-S h1~-C \}Ԟ K;%i|svc4}GEL_,Ȅ$iB 4mڔ;v=駟2dHZ k8?0QlxW w/0KֱxW]6{9ןNBxl,l846,dcZ=UKR~@|߸L~jaڬ|h] y"PpKj}E{3iirQ8{e) &e&ڸ}5dcZGya`0E bΌ% b`P j-YƂ=5x1\o/qob>ʜSgeUQe3k6.?Bid0OQfϞMܹX,-.9'ӦMPBE;1ezsy5bNq%[PF]yv3ƾXOrQt>$=gMDZA4?1 1흋ݣZSzm}-Zah*6״1=8rc3J5SIzLBRe #A +[2ent'\/)mw8:g Ǫdh9-GFݓw^ !2~/QAם{bxúaݾúɶ8>o7SLկg/U͛ b/Ǩ(La_ҪU+߿9M >wyq'dM6K8ؓX{.W*0t :Zb_:nĞ)˒ؓ9EAUCmӱIb1Pc WQUFlƾMU5b'3Jp1֒nTaWX}]!cKNEЭsqxN̶8;>o֭c8[ [Z?F"6#g"M)BPPO>:uyT-[6ON߾}%uSO'`UKP$cI[45ac)fPTՆ)6'XZKî6$V."Ӑ3~ERJ|W|'Y[n9yzzRtiZlɫJBPU]B!B DZT(7={{.MJl0>cڷo}(EQPl΄B!$R-i3! !B!2"=)-B!poԊɞ=sE&NXB!$"E*UՅ &Oj0 ­TURJʄB!\S+Rߟ&McǎxÂgΜɎ;(SL]3:;gΜIԆ'OV!BLNZbǏgϞ=ĖΙ3g8sÞZUU?~c!B!D"YHʕ+3a„Iai88q"UV^Z!B!$"EaĈ3&Abx FjCB!f$"4駟38oNu%J`ƍL8QZ!B!D,VkҲeK4i_|C|r͂i $88&M%CB!HR+(xyyѢE 7o'(J"B!$BOi\ڋ U߱'KF;Qۖҽ)cϻ9рҞҾOBb鳜]x/<3nlLhĸZӉTlt%Lɦk#/`a[X۷ !܈$Bt.GW:4*ED{ L#۬OQ US%H q)όciMb1d 9ʛcFT򰶹z/r>;sB4.\Zb#6Q"(BNDQBøőw3u@Vs;aPji Dg׬~jH ht|9z3{ kJ݀:#2t{=1ߌv"ZJc%'"2uz֣aWY=yp)K)cm(ײ. !ܑ$BCEAy;$g:Ɋk?.Ɣ3xs^iA5]ݱ`zImOǹ9theՌlN6ssZ#6fKk9C1 p~6|) 3=>OgYҳF |mykPaN{3AIR+HWC5ϰk-{joL(%ODa͓{R#7&<װE^Hg&{Jae/"e(o}˶]r Qo2IBO7!H'2ɫG\z#&L?׽fKC1JLci-r3{fSY ^rGz.By~g2"cV(͡gy`a<͛qtGpӌ׍҈ճuOc2{Dbx>-gq;گx_g f!Q4eDJ(q2s$ab[dIR+H_E##i\#)OlW<䰆ԩے!{0xHsmR= 1\pwGF lM@@=ueVշ2Ni8?\'~Gf5|x <_ ?!Lr2/Kg;;/l 9: x8lcv`=eQz"bO ?Xl\D֞ ~?P ]Nvyh[tpDEAUT[/ k$)c,I ]eUB%"V۹8X'fbb۷ۺuuۂF"6cr.Bj΅%$,+*E"2Қ bXq]!pB!BtJZ!B!nKZ!B!nKZ!B!nKZ!B!nKZ!B!nKZ!B!nKS,_ћ`4|Q>9^F`a uz#{C" yx0G|of<c<!B!ܟ$v.?0bt(A[2twB]$YxйQ_Ւ ) B!Bd 28#Ѽ-^o-?޲cӭVFfԭ[&]8Ͷ^M.?ozSzM`̧Ѫ[ұsquoj ]rq5=۾ǫޠsh=j !쭭a7'0mԽC08&]Gn|Vd @àj65ks7iڤ)fciYxEASUT ~[܉:sb ;Pw\ !:46 ޳91혣8;iِ C;33D9w !B!Ҍ$ аq%}{b k;t#J{:x}+^%7xdK~s#iR܄bX,б& j nǡ(pd2/N)8xpӫ㽅n =z~;}Yoc1rlnrcJ5.xue|NdlV/ubjmFٖ-)vb+Yu1aj Fi6Rxq6ʴxwb}c8fcs3Pef<O_x?!B!D6{3 "yq1yR0׺̶}7?Ďx4}U;)I!Y㖵giV|& J_Ղ*}"t\3ҹoMd)ܘ:Da +b*DZW"XWـva-DQmèӟjR+7cvq,c*HQ+ݼ7b+E>Z!B4HR!܏ */T'?L-OU^ >7oaKx<ڳ$#kU?rDN4rľih=7aVԫ_zM6cy|3/)4P+;wkCyQKjCB._j+Y7"o7QAΡc/y[3^ Q H5tƎ{N2(t5|9m0XOkdKkWй`vLYRۗəHXxpO.5P@|C @<cqJ,i%ӲZzˏ@ oyS/#Wv"H>|p_mJ&7凛f M]1_Q cf;G5 -k~--&[z.B!x $HP*P/G.m@Q@۔vEA뾀͌%PUB0w.vjMi= 77eۑ6]z_$zRJc\ˡAԨD9p)ڡ781*i=֣##;SGؘO2'|ziB4}ceېt_i~܎bX7cu"[/ӽy# Kw9&uzR\߾շw g6Ʒ]WQW_\c {o\6[qV:ƚ |:1Rî3vP̗ܖ9b(<MY;:;2`i0Tc_WUnC&U.!}f T6'!E#ԢfLvْKnY%v+( dAT\. G IDAT?zCtncbnĐ+xm`['~l+ʝH9=4vaђmqaŔ0YQr^o6e} .mAw?qz[㍑7-f^%`<DžG ^t1B6]@+nBx5Ţ(%6އw&`\T}9aHa}}9KK{cu Qq:]g$5͢e>{EYVTh7!};E'cFQٔ6[8c,XZKI ;g%[{Dc~ݬ.ML9?('N{79o pb8JQ ..g)/aXW&@:x*(T;:L ~*?_![H䯈pj7Kh;*NwWM'tN媊:&uWO}x*攈Z9I).G_bOڍZv Euh[%v̉'M]dznԎ8¡̀F*u)' &խIK2]bW8t#EퟮxSCWmX'N1_.&e> 7-I,K,pEak;a !%ÏE;D9nu,҇fV TYJ{bR/3v7rǟ7@nηѶDgF"%"7}mT+VDc##YWLG6Oͣ+is'=M~ K~&ڞ#(nО8s*-w^ʖ΋%|Z;[Xl1C{sm>Oi_ ;ynB!줧V8H=}׷H텥`: G_*i@pӶDŞh\zYK<9P&첾2gOnY TXan՚y70˰iɏȳ|u8^ӰcvNLR:0~}ۅTm\rum]k$7Y TWg1;EjFԫH'RGy\U]@-610F.:yӅpvh{D_C3 k|ysbBi)exݲp}=Rd g0mHSfxG@F-M$уj=9o>9bPB᎒wj厏ם{oh&u&ؾFOY0qTH/dHBd!ous`(^aa>vø3s !t@؇**k t]&J>0lCٟ7a1b8 :6 c ;X6}jYvm͟4ZZpsO"5zLx$neɩ^f,^}im1N뎏uum uVf:Hds\wfܲxV.gNxbi2O)Qĺپ98zsRmؖM|Nf\EYa!VrMB!B%=B%HH.iO!1IjLfH.iO!-~,B!mIR+B!mIR+B!mIR+B!mIR+B!mIR+B!mIR+B!mIR+B!mIR+B!mIR+B!mIR+H_[l@0 @w8ԷȌUV]t.ҚɦWutryU͑Hs2[o z(jiNp[lUϗl RF]5&$Bt-3qfoz`,Bؘ-S; 2E lR7~gQ7S16oCiT GJٌKq}7dx{usuC +Ķ_dXS;_kѓĭHuj;/.[׈s1u[30? YuGAW7ik:nB$GBT؜J *m)p&!H Eh+wK2l|Ġ\~K\`Xb cw( oUq|B:Wߗl{eQz8.$o0h`E6-S(Ĺ% %+\3yΡ_|WbUionS]Aw rei8MC>~ /?IQqV~If!H$BC,IՎ':"!wƻ|ڗʎ_޼i;O&KǫCC)M$^ߪKeCW,餾遅3K`U6O,o_J, *: c޵ώKpi -Nh-^ҍm | >ҩt6TKNѯ|%NkÛRGt(y>a(\Id`N/Bm^á$y4X:~iDm"}Vٺu+ޝWQFaP} V[\QDV ZڟZպ wE[EQQYl=wGrސ5;J朙Y|rrrF!))I Ҕ)SԶm[w`ީoo%Ձ%j?UQ>Q6):#[v5q]5ӺS2E]>oy^s#>kB1\yMNG$՜nF./te؅*?j=u_ڴiQ/xvR=Jr^LzQO $Iuq0 CO=n]{F.*RSSUJHfZ־=(ڻ7[)Rdʐ)qDC)rԪb[*.Ou01Ks\U&cxu=r9e{U`ۺk|‘𨨸jժՑS|ofZV,9jS^,;-Z,;FoN(#N;hߑTb'd槱}uc^?CPc^;)=yc8nZ9VZt.I~6oeCȳO޿wyׁsZ3z˧X+Vj@yZZOUl\-JRRǓ%9&qI3OUK|Rl)+ܧ@~~޾au=48jw11yqk2 Ȗ%$Ӫ\8bf̐aUp;e'9|V6d5m ~c Tua2pT>]cs?ͼ)_H*umWoWo%9UvvCa~vyTUm-3VVV}ѐ@QF)%%ŵtq֗_~#c=3g*-84Vi=˴a7Pd4mJ)~4M6?1WDŽPj*,, EEEO?erJVXX~[{P{ZTkrU=z "O5  ZT+}hݥzG}ŋ+33SԾ}{ 6Lzj\){ xubێMAA~a=#:tPmx#NJJ_nmܳ"&##C ҝwީ(ֶmegg/KJTPļy4~xmڴVm[[nՄ ;lEqb ]r%wjTXX.L˖-#98 tWh{N8Aah˖-Zn{4m4edd(11Є1S֖-[eG .TFFx ТEԯ_?pm۶M=P.h:8n>}/ШQdYVcذaGyDyyy2&Pc|r͘1CW]u^?裰}@a(..NO<, hA>9+Vh„ *,,$ 5j(ŋ^ziȐ!amUC 'իW/^;ORͯ 1Sz3g e۶lVqqTL3TyQvl}".H]tqձcG͟?_g}6ˎER0 2D;ԼysJ۴rJ >@ ZSaJLL߮nA}/^LIR5l0zJJJ" wa+וij޼=\s9lC;L0TkРA˰{Z%˲^|-Z>}&L-5er-*(((==]GVJJJІE0)S4 ~V۶mu5mە"-X=C+I3fPZZ ,?QРAB86p@q\| 0o[0`͛Dw jQ6m裏>7߬Xwъo~-X@m۶l(P=ΩE$$${̙3okqk4h M2EڵeY!"ftWK 1ƠbFgGE4gjExYZgjExYZgjExYZgj xYZgjExYZgjExYZgjEE99zqj85;K\=B/{VEek ImT<ug$js2 X'+-6V?g{*kk:d:XUw Pz0jpuټL˳m9rgZ}Ef}hlGRZ-Yúɒ gڋ'kq>EW?8o^m&ѧO-O{MߕLMQ%zS;^n 7VN9Sn{[[K+fD2B-<\#Zo 8ZYڏ3Է Q`b-+}b%J4Rp>|t>?KoQwzlO^Xe%Zuת>}콇=gпK'ZˆD$B-:Q#D)cɷ*)ЧZkNj3f^tA IRt!ݽb}>%Ag-t>8_c~NcqjuX!tO܀|I4;-eޟnQ󛞚[ IDAT6&@@1WbF2r>魥aʪX+ܬ.N;aJ,Vr󿾨K*2SI{@\{V=i4 Mre@c1aZڲL:hkeci4ޔU $˒hų/kIvX4+oYVepߪuZ4 Chþ"يR ctݿP(@h LIs&ffyaʲE8:v8,]" 1YZgjExYZgjEx]jh_ 27@JaE)*1EnF ]Ȋw?mJ?Js*U;Ŵf+6i"uV 9#qdȴ,5xTRϡJlT+:a6e`B^sI CJ>@i_!_BrP:hn f+8S޶udOPLaح_kmˊ5H3mNu6R܃DB-d"VHdK ^H 'Rȳ`IRm;nǮksgծVn N"V/S߭{Ȭ8rG+J?NSk(Ijg)rzY܍*^m:["V)lLlY0dT|׾Y.|E0˒╚~iE5YdM_q qYXZTbqj5L_STb+w7DTbK%t+W@+IFqz7jQk!x 8ꅝ*ڗ/EE{[!vhw({wZE{OUTb \ZZt˶!{6mW ;mWHFiAm{| pݢ-`ZZB% nZ)_TsݼJ__\wKеq%I|m{ݔnq%ݘ!ʬaZrH@"Ԣ֬5tbP-P=CZ!%|a٥E$3qMtj5jrL$9EY{)P|fOTYC $;#[/S߿%dž/Zϝ潆˽ {SvKՇTl(ӹAJR#jQgG2Z/SVҜKaE7*G n›eb] s}*=OV⬝2 ~jB3AEŴjē=ӺW㵇Tzt2LKιV ]=V0 w^+#RdAxc~2W|>obiվvQg@An5$PW+e3U؋G٦@}&ФBlnj1 V1䑒u+ܳMvw wmq%P#v2<-e@ucxU5/.i9L%Hw%mݭ+?U7 [I)ǫ|q j~Q,ZԛYRO6D&tse%I:S9ʎ#;P앟._$PsеSu5KrD0B-a_e0E%(*R(koTR0ݼZ Z =U|o[,>lŴLSLk]q^@!Ԣ~ Sqm:HI3A6lYQ^<ί #T0L Qb&"9nC6c4r #a8H-bˮr\"ش&QvIXr@jU;[++c{:돃u\}POZ4[KwUx]R)EG[+N$lqضr&PdK)dێv-C!i@SL-́| 2 (;C=$۶ fҍ7ި/u@?kV=\¬Y~=2MVERbܹzܭjٶ^xAsΕ86jøh+8￿ֳf͚K.Aھ}222Ʈ]6 j 7K{- oMb=$B-~DiʲPk&PkZ޽{Ok?|d˲Իwo]~j׮ jQyiƌڷo_^KakoKbfϞ'xBgy&@yiԩڳgǩ#ׇդ a۶tw oEEݫ3fT;{zptWk׮]#ԢZ<󌲲[ٳP߯gyAPa(9֪U%nZGo%K(&&&h_/2)SBQ_~T x wѣG륗^sܹT?A`jӦ^z%YT4LnMa,ΏiӦa۶@+I]t|>_>kzQeB;={w@"_~Y'|U={_VRRK-M7ݤvڹەڴinA-R޽YB Z\( ?0Ow uL-"|x>D.B-^ PLL]mlݺZZl_MǍeY,^A4Y ,B-"⸹KXw,X+666O>?~.$ 2q(7@]QVVNjC 4uT]Viii6&Z4*/VnnnVQnn,Yrq" {Ru.sR2@d"ԢAd۶ma/4 rjQvڹKZrO.7Jmp wjQ /P=XPq\x\  )~4Æ ̙3=Ը6fΜ#FjiDža/Ap뮻dY88=zgկ_?Oښ>}駟֜9s852MS]tNr0 fjQ+at@㝵jExYZgjExYZgjExYZgjExYZgjExŶw鋿LօViPj.;S Fhy3tkc6|}e4.J @[_[@bui]dPۤ8:]wymzkgokfhƿרx 6)EyeE1 C}+ RN>Ec% 5ڦ$^/>R.W:B'NTBR[8Jzp~5s\D@>A~r*,A ~D'Qi_?|M7Z'L/QnplLCa4ˢky늟iq:5{Ivs7_{4J%y7jkRgLOw-E^7?5^ugT]o)-;'Gרh\B:_cn}3{|fsFPۄ{Wh~JEGfD TҰS4ܷRKݴeiڎTB sl_\T U8C  >{ Ѧ5/!Ӝ[ozݦ?^R͖~2]/i~zKo(Hr}yh7둏.oZt@_w!v J?={,޻X*Bma%E)Ý|jXC9~6\]UV~ũ늱b!-_MF V I^(AfA IDATVOѰ]ڱ; TزP 2kڕ6֧tɅP lԅv>u8U珵p7*-߹T]z J)6m&cl( 6eY, ^l!}tޠ4woq:kLQ 6!FR9 69:I0Bђo͂|tN?REЖ }Fh%˔$S)U1iDg a^>vjWbe(u-}Mq4z$8/G%?lVTϔ]hSァZ2N<_ . r48-\CMQUZOt99J$ףK⺎հO雖Cui%UF17WbF([V QӬR)y*3)˔mTT8ZO Oy~>:yN{-fj͘Oު?BK(:-_<[<_-/~ʒaiȾ5-Fk|wJwY,{puUg泺SzR ; nЫsPNLu©: =/X,(k6g(m&%+Fm8!yg4gGTghM?wJQM/^_CUŗ/#N2R=3(0zN2!5GFVL^~t8[oݩk\_]כm:s8Mt2E|Kv&|R:}3%5+IVt)״?QenSɓzT5htjzq*U~Tk3φ$?*۾*SRTm_}$}ogjO-e^ز3 ӐT[aʪ8_);W0[HrlUS$ǖdo8rk V6dU~?Pį!2'5uvkfj8:|xyqk]>]系Pٹ~II?W*ہmTv*mfgG^ւpNmSd2-w͐iBKKaW0MXIFAl-ޏ{[5Kv^ѡܩI,-jI_. Q|Kۇ*= !$\>VeǦ뾶%B-P.d)2Fvu986Zi&jРAvq%%ڸ;mڼI'8"%7OQCF0۶'IJNNvuq]]7 PpAq"ԣGQΒ諌U8N@ .ՍMO]q^t)J4Pa׮]z8/~KiF~YZÇp/`R})'(-O֘UNTNCg푿E;5؃aGLwғ)j C`k{خ]ԓsԱSGI=\U=Uo<<H#/lyf1ؘ5..$eIЄ$/6%셦@hCh4Rl8vCRPbc flx4huwEH}s{gy;oV=\qX]dv b1SPewKLta_[X%ls&$m)Q6DDDD#B;]Ɯv+Jx;8_οOfQ8:$;6w}<&o܌>{>}˖ s3;<hd4vl|ӆTchT/"us5L&5b֬Yc.Uxqֲ9XϽstòku'݁}Ƶfws:ݝX{G5abӦMohSޟw<DQ(*e־aqc=۲/`dShk;>zh6;vlc> /SO; 7ٔߍ};Ɩct(xwZ:q1 pX`⚷06aS18z| ϼ:3<=ٺޔV[ϫB۳;z4O$FM:' W HvC{Ö8pfjc00j&lnD$mށގ-S4^MĨI6NTn+"""!h̙Xv91C5'Wf#~Exk=9@׾H-_K_ѻڰv2&; X̮6;)0_餡mnnglNCڊ/\EL:n $?ADG͸Q}1/T67S ,1H,ߌm@+~:;{бEnjo4$ k*x<7u4FFW3 5H#P<7c{۶m16g=mxA6{OW6DDDD\Gqǿ]ó2=jv ΪoD}Wf^~6Q߈}-Jt/ݡ- %Q]! ۠ntuC)Qw fMڄ7lƤQU#JbAᄙ~Vo7<TwުفДUOb˶vlމ0& UTDX0~hXkWO~KS$&`'e+y .R:|v&%^[[}$>װ𱟶fֽxɧwZl>vZԔ1w:Xj0S'M/1nW 39ǎQ^M3f6{ L7Mb xm $S;q6yг5Icqԗsjdm3{ Rk9RK @UM_|~3":&$]h[v<|Y ""oժUXh ƍpj*,\A7Ą m(|d2rq m%ضm+ft (u\bq]ktg]fϨuOvݍo˺GlL~/޾95#_l`[m* ;ljb%"""""Ŧ*Z""""""Xljb%"""*ji.TUWp?d~FiL+ Lp?ΥzSq@}]-6l؀t˦(t: ^C}]-<ϳuسg2lb3ݳu6s\o*N Q|Ӧͭxy6T*zLrMx1Y L&QW[u.^MaSKDDDT <ulbJ&E}}MyhSTBTIyhhh]"Ɵ%"""""Ŧ*ZnDDDDDTzGt_7_<U66DDDDDDTQbSKDDDDDDM-U,6DDDDDDTQbSKDDDDDDM-U,6DDDDDDTQbSKDDDDDDk$69*وqkSшea ǦvXQDDDDDD%0*Pox= XkC{WMS1I9q46D=L& -ctuu4=k6ys RZ{+(7=SMǨJ<8:zqڜ6cCtp"J4HakвrM[EWW%Tڭplh 0:cgNڭlwCeC[TgFێ6<sURS[ [qo6L.R6LRb]^T)WU|SҞh(*U#XWCNm.\E DDDDDDeP~T)#ŎZGDDDDD4TEkJc(5^UNԺ /*ZGDDDDDTɢ>Q놴zjrDDDDDD jdˋr'J<(ODDDDD}<|9?-Zf’%KyQ>xN+).PS[Ja3,GDDDDTV]xumx۶m+.,__x!|W^/キn/| hݸN^.\?5|? DP )ƽ8]y cDDDDDeՕwu*|m:R|{n̿P_u=~Z۱pA-Xή4s睸kO$ʅֆ+\%4F<xzI,abZhԖ EW߾rTUWoAuuʖ[I×_3O<j`t [z5.9='X?݂GoξѨKTN.O<|3*'q?Ў -.`i_.|k Wo Qs5Mm"(5Tw`Ԙ1[Lk 'ja|~8V~~3Q_9,eC 9p[oUW_ݯ3pzNR":]Y.>_?k-i`E_<XXњp5ᯗĪ9|w{|ߚ"n'x{ۘw@x%NmQ*Ň4kW(~/9tg'}SWK d2'=i:ǧD}#]سW>fC/DGgWd?)z`]0>R'0uI8l\506lcז竱rvRr :7F9'""""*3n%hY20 _ mQG?_܅7~ fjچnb|񊏢o S%g~#d2}wk}[%gSc{,۹=`WM\[e7 3L7&0v'۶x-ƍݍ+Wѕ+GO^[;0lc9aϧŭsDڨ|žQ욈 zR|p׾ p#Y&}qFO~#~Ճb݊[GS/85^} vn ]w%H&<{܂K/ T K,[ggW7\{Z-;ѹ ^]]HMYI k}GpXۻL'2q`ϊg/nuob냂|ԖM9~#ZP\PsbAo.QNa}]ȵ1ŖO~}7owX:nAGRvPb22G[/9":&$]h[v<|(&""nyU|mbo7j9VZE܌IDATp^˱ƒ%K7ի`ȯ{xUt=2<rHs;Ҵ8]MnXrܩ._ [ {^ ׯF,pҥ8gR褙Dv\ssZPk\/27-_ 7DDDDDDNz\kܱA3XMmԋVzl̇ ;/Q%=$ǠӢ֕`5Q /Z(s9/ArJFykẨﶻ%ko"""""ލC]52ףk6n׀;fEMm>'ocv}#(sY ƞ8ܱ6Ŷ>(|G, {Fd_-ODDDD8Cw0hٍy""L4$A0*BsF}:›pHCV_W̚5TAوN҂ڱ6g\BW=TШshv=`֮\жVW?˹3={;QE*|rF E:g7\6twQ[j|Fgڴк/ƔJPW_S#_ ;t+dnG᪵(6weu\5r蜌v"{I|iIx#""pa^#L 6OCC<Þ:^縒$jkkQ:;΅β9;ZASV^`>wr(qכb㮯|,%"""硱 6E%y/1_,:~n%SLSk/XW+ĻӇ+,k"""""Jփ(#Cvmp]1K?ԖJ/N.~o^ۼ>*~k/}rH*f蟩s2Za)! z%ΡF"""""J%}K:u/_njk})\L_ǥi dv.qKf~][7( ~o{DƺYI0u̓D)msuSk;Wm*'M%TsiԥNrI5߿5jT}Y{uUv-c}}.}'x>oyXLz j9bq&S wx'1@r7LGGG:wow tN?o3mkre+˗N#ɒa轠 G$eT|uNZ94Ґ;^Z:1(FDDDDDI +Go8J!qW(1 }]q@A9['\qtLQ) >$J\~5s\+E+gS@iڕ:FRصrk1!wS9e-kur^Y}]c<Hd?[w>BHӨrsH19^#:!q:,7n"r@>7AɠAdk$K7=m43V=ٜ~^=45ٵhcB.DDDDDZ>GPӮ{fU=lmn]CB- @5GF +q;G&MA3k0$*ܯ!gkDZ_;C s 4A %4#A1ѴTV>{^N$6/(֕@7AFLb1k=J\FeĥS\2 y (9ܩwl.ih]Z{~9DPrJ76XR'+ɒ?W G`K]\]Gh8<ٞ®\vnkIYY_@iu텚y\1 8^ MZ.ݫ/RDvn@nz!1 A_5֣= A8p\ŅFC6ͮ"Pq}HӊhszZqk+_,J;֎6f9{#dAF@"d.kyʗ'""""n5Y6oB7y܇ըCM霎%Nm^S+O*?/f{ֶM<ܵEvJPsu$68?fDDDDD v l(s}D KZ?} zms@Mm>r0٘ }QtփkC_S꡷YMLezϡ{asBmNbvVOZ""""qW+99]ǮF˷Pj>76/RiLFߩɝZ:ofѣ+q]1"""" ;!1šWuPmu劇\A1XMK]$/ޫ׸j.JЇlNsڹȗ.qj2 qW+4Qՠn^XԸؽTMMyդQGX\.N,_܎:/XAq""""" Ԉ:W{l/4:\u"_΅]ANmM:i.,GbƄ'""""ng+n^v:nklN1W+ڜ] [s1M6^a1z9&RXt1/=ArVZ""""~VsAuƮ\֮:XP\=U勹TMM僚5j6.Mk;ױ(9Z;ba˷&"""",hm@\?4ܮ(\;@M^:G\]8ss{Wj da}AXk]窕ټu,_\ܮ(l<(?hJ/,7tO/ne \X/ODDDD4Rkl>(F|9\힨9y\s|X.R7?a Wٵ]:n|4q*[jl 9{Bs6n6v.a5aXJ;_|/hmmu^h+\B E4Ia{\9W p7{v6yP]5cEaVJD9_ܞyj.t5׹ܵ.TCDDDDT)J8>;)U̎2B)UM$CEGn&Qj,1s?9ctarAq/k\1]1; y,׺"k 圅DmmFv.֮(f/pVLf55jaOصKj"+GQju&s}zm󮚰QsZqDDDDDCA)sw]lΎ71Qsl]R&r45QYhA5@x/6l檳s:BQ4ZvOPShF۸k]E:RHE9w]Pshw =;q L1{*Q1MTAj$ZPM\ qջb.Qxщs8@iAuAs[h$)]4hn[>Nm,E}u]kaMlXNsl̮EPFpDF4'j}Ժ T#ql.UiA GDDDD4Rhʻbl.:r6 P*E[ؚ|G#""""҈ڐE>[Xrdp115B|DDDDD#]6f.k'KیŭQcŊq}˻r.j 'n}QqEо8qW,HXmXNZGDDDDD#jV\?O}q6wjE![!{DR8[ZT( [Ȟ fS G  9"""""~Jݼ/(sQ=%1BCsDDDDD4kɇ*+x<٫;O<Fĩ%""""/Ns6_M|TŜ%1bO1{Zī-@=QF,DZE1*foI U0q>HCDDDDD)U&k^"""""e&׀*ۈi`]kDDDDDDiD7a+!Mkؐ ,^o""""*p)auIENDB`kraft-1.2.2/manual/images/en/unity.png000066400000000000000000001635711467704360200176530ustar00rootroot00000000000000PNG  IHDR2c pHYs+ IDATx^w|SU_tP:){#{Aq "C_"8@@AQQQ e/Ae MGz{4i}?WښG]_허,W\ij&}u]}_ DDDDDD/O_]'_ǯJC3UܗN]"""".К><_/*u+f2-(gQ5Q"P\l늧ވCDDDDDIOiYEoQ@k؊r}Eq]yCO.l:3lSҀze[jOj4S]ެ(D 4v^oڇP<Qqr׀%*gv;(ϛfrFqu-n"](g\f{ol༹loUO񤖈OHOjm|7Ûm٦Jr=$3UNf'ͣ:W9^^ <yZ_d%yzW9}p7>Mez9N1Sg44UfMfUP޶r\ݟZCX0ʫEٖ( Qyu-h"b29WW2u[57||ٟ5f\ovo^/u_rLW͝Q(7z-ύz1}i\]Wׂ_՘J TUySsUyu{VPkԵLoXo-_퇈q׸]ݏ&SPYu; Φ٢1qPԊ63&_Sׂ:/މf۟y1{PsX^iFpowku,3n"""""*̛fm{6̙iQ#hSczsUQr?W9Aԋsymf,ٜ.DL.W0SxZODDDDDӆNW^C+94Vs 7Юrbmf,z\qU*_7`*nZձWXu,o6jNV՘Zcu5nr'""""ᮙS~՘g@ms5ׂ^hUU#jӼ|ɋEc iVw_y 0nu?F1#rDDDDDTr\5sr~Cr\'^L}{cFcy.5n7RԼ[jUިk4幼V\q 5Pr/Co-3ʹQ6xFs5ΉQA=[.jZׂ^hr{m6j+/"< mT6r#-fc1\uNI-9sUkYTkԹ [:ur#bV1T#cwh(xĶb2"/ncE1VH1j9jm"_o(ܰ9Q^'"""""rys5.y16:S77ZԷsfRN^l_cAΩ1u(o7g᪩TW5ՆXmD^Lqu-WۨDDDDD،:wM6?,A ^Liq 4hR刜q:`(oG/&s4qz3rj([s Rȋ2}wy8ǓZ"""""2IgT6*ZIͲ޶rN^Ԣ4ܱ!b\\VLtE/HI6 R,Jp"׊^R]{bVέ'""""""9Ϥy/OLO?)p`!箑kqyw~aS^okA4Fcyq3 u.=D.KDhXxч ͯʂ9WݗߔԙjA=zsyAVkE=-i!>*:=􊎉  8{- RL^#Ŗkf^TFwSr,rb,7j,ZDDDDDD =@~%7ۻX[rczs5ILeJQj{CnL4b,ۻX嘜wOX:rr,̚9џ"žZ/snRŁv1y1DuqO.^D}?GEb`I#,w틈UZC݃)TVիUE.{̜N/6dEۿEOoы3zM8r2˩18nl^^ (3oVjgL}FӜ$;"{QGNn=[~V""""""*nM5'CDx*iX{ؽ^c-"'#H^Nʂq+ֻs9.zA[-\뽭AL܌@ն6KD184eT~}!"""""=ޥ#t իU;~k֭5됝lQUVtC-Dc쓏WgEo.3jdɍ~M "n ש5~ԹgS-Q+b\YΉSܱmzSI뚄K]ςp13 Y㼈#[Sk5MccMDW>* Xa4,^R--;Ï"G4Y);Q*zW\'MCVVedX0tнy f)NCHp0֯p t/^x}Q_#*ܱ kH91F\fW< qjIPcu.jLˋmrs-]Esm(;; B|l@#!*f_KH;@8Ԭ\ݼH;n7㖾y 6ym c`4|ڋhݢZ;n鋽!O`ǟ_aß[ԲѨa}|2ݻI#:*@,V+ڶVˈݕm L9>y<}SgAvVvzjټ)Z6oMkռ)6$oqoNFRSddIg6/߂ʝ=^_.HDNUW9X;j|^AS'$!,ޚ[sgq2uRGhh(ժQ8t`ΆEA8ܛ3~O>05E%0ԢydegM< #GO!8(Æ ƣߏS *ǡazx|gFí7>듦7^_}-]CCJxz0;k.~'ԫ(D3&i;n /1 iT=ޟk7l嗶O>!Ořte/N5!1n;8rpeO>YYȱ9󑓓Q?nwgӽU$Rd$`^~Ec\f&^ys22ΞUKLٽo?&MÆb\PO>/q.וh5 ~}h 5G8{,qZ ڟ圈1rWJ#LsW9w91zE )I'Q}B PeS?Tp{3 G[Ů ^),qn9]0fΆzb6DDEQ)2RN>'WCƗSl|xo %qm6_6Z}M_qi=vk?X~"m!b?-INWCRr ~[ ǖDufXnC@1|`, phޝ5v{%k[xKtt9QIqϏϖ`m߲1q <5|(&Nop[5o Ƽa-*M,zUp 2-h z"|Tr\>@zqZ'bhXrոythB.VA/UȎڏ  bcD8zT(}/]E_.eCMD1|Nq~Mff^,99*V\^J}dg#f+O+($J)KI9&ּm nk8C>=7A)yۄ;Tvj4^? t1O<'y *NL=Ǟ7Ezu`8Br:U9ʜ(@\ަ%nۉUMymێ]\ͮpLjҨȗn? )SQz55nj߅JYyD&Lv7(1MzI,@kh-ت Է1h48U[)XC,^{BªOiբ> <9 ;3=۹gpycK/J=saa k4+Wi8u:1η94G kHM;ؘoX1"7!nj-_F85- 3/ƈIIXx)_?2o#\/8^}YtN.ooޗI " #ߑ>~Jܱx '.:c'^4Y٦n= 5򗒉&Z˄{]? j-bbc+ܟ[ ܗ 7z&.˪J8P"9'g9&&[,hT ΓE_oiռ) ;}'ޘ< CW .\xNMòaұ=*!,4Fňp;~ǽnGpp0BC+;nÚ둕 Ms*S{Qp.5@sǖS.54MC* tU;h0=|6oX~ygɤdnC\3x|ߝxa;1~T\p1w\uMO[+qϏ)As<=kq?:w4?/ou0sG눈ʨE;;owaמ}h3Y!x鑅~6 p6/<=!w<ܽy'kΩ?%5i.XKk\1[p]Q^>hFkWc *<_s V^$܀VNNyK2,5#[;X,hA%6Y`9`A]кys"""Ά#<,.DD7-5AfMΟ8,jT_{ jʥa_}$Tˋ&!䵜SPrp3vVwb?SmDnչp "͚/rcd0vsxm;8zɽhn5䟥VSBӛʕ(6r[)3 zyq'^^DLqF\,L,@6"*F"bd^,5κ!pϽj]u ퟈ʥCDpp02ΞŊ~o'/'߆Zر{F>y͛6Vܽf6"""""""b?}#7$[68 ̚L%F?TAׂ1;u{r%]zy5sjڳŁ/ln8\<DDDDDDe~('2yձwyrCw;BV͋ޝJDDDDDDS.o11Vj^BI40\cE/)3ۗ \f&n4.n]Wm /C/.Fg~L};:6kA!/TateFw^NDDDDDDdDCg,թԜVŋMq5 u57su@e9z3՞LԘڣժc3s(Zz]"y9DDDDDD`A]/e>dؔdSmqw y,rRQ OV}^&Tzh z;AZ@r2;GTndd9ube3.r""""_R{,R󮸪s+~̓(Sɓ'51Q V1":v젆HFٜބ"j B]hDJ\̝FUAl^ >O?9F0u\_)gE"""OkNcz{Oj|;p2ڗ(Nؚ#TcxG0y93o\xyV8; tQ9N.lO}ݞࣷ`W,h<wހi\az((`y~6T6) Mp o@p=qC]ߴDDDDe^m.*ֆ([QNռC8y`MjXzv5 !}"ς?[Oe}916DDDD+~LpmpJSSm)bdB֭ѳG5lk*iA{{, $Diذ~?DDDDT^?e{sRI6LՉQkZvOE6KH%$E@{ۑGVBd={f 8?S T@tXA>9p ;Y!*q DD"2OHnʼmq/j")VOO,84+bkq+յs"""R]O.1bA 5B 4Ee0[G%5vq/>zbn({Ӛ"N܈%S/a8T*Бs1H7Ԭe`Q5'gS֟֟cYV(Mf{/u-Pۛ"JL܆'OaC{gϝåm_~ְA4h@"*,gϷXeu|K%4UVC3HJ̈́]`!<&QDU"lJWl-V+,cѧo 6DDDT֙ۛ9 wT'w'9b?a}!###1YhժU"}VĴW5{ v0 oLei=~}wEВGe#ynzK$i,{۱sZ;˭[q/vPqQw ~;C~s8MTԖT`b_T2220衇X)քxq:R+?1lI88þD)s^Ķ@+j#2Wռm߁'_cb?qvZM;~CӦtmMLy322aX VTj! [5BВ9 -]|TPn-YËc1ZENKH' i!Лj/y_/P߳>{,kr#}B KӰU>Mcvh)K0aRW2\wc_s LJUjUڏߕNRD4։`bdD?9X:a촗ѯI$5Kgݎ|U"""@SzT @MEsY zueA*GkGN֓~[?z %lR'_M"]AqLu5RߕП>Wj ̂J:Nd҅ٓO IX]gMEiG0~r|3M -V;u= Ƃ=pQ9RfzTCDcukfEQIC[؜ 2w-³/YԺ{&Z vDZaMu7u@&"""RM;w@V1}{*w2` +O_X7>g[F<&ݾk "ݕQ)3DT,-pEǷXr 6n߇N\!H-.W/f4 7.X؍éaEmѻci3 ۬οq49 @pX%lwF~}Сoj (={];հ#F`?a*5BQ~x~xTM`k2 66W>`P2 __\މF]TDDDDTN\bSMDDDDDD%6DDDDDDD^bSMDDDDDD%6DDDDDDD^bSMDDDDDD%6DDDDDDD^bSMDDDDDD%6DDDDDDD^bSMDDDDDD%6DDDDDDD^bSMDDDDDD 5@d֜ybJ5gk65DDDDDDT&%&nC$"""""*Go"""""""/L5ygػk5|5LDDDDDTfL5xŪWCEvI5DDDDDDTTS>I5DDDDDDTDDDDDDD^j BnPDd`55CDDDDEaXЯV+^֭[5ZaAԏ,oٽg6iɏx}ǓX0NzP+VrP89h|;/Y"""""""/&""""""j"""""""/&""""""j"""""""/&""""""j"""""""/&""""""j"*rv`1~c!|ea=q=)_~ @ױ!"M50;1ANpUp#C--/\{4,>./c&"r(H  7{IDV$<=uW>ƈTQrD!BF˫k;9̝1ݯY ?<_ 0{| \FwaYρ"zT?5_﯎Cjb-Hޏ[6U@d1J} *•/CUC2<>iR*AGP'->یd-܍lL%ʉ{ea7cQ!h>JMpcbWd9Ga7/c08ppnbO^ǦޡV,Cnߍ owX9dG4B/cD*~n1N㎫pezƬ|n+ ~]̸tAǣװѩV$BC`[_1 5]:I8M+p\qs4dlѸ2u~W75C|x8*ơYHh%>u ""*7o" hKkxz(Wמo,ض /`u8 -2*w1UPi8QU;@ji  Uq& %&1Rd@shp:ՎK+EXS^x1 ".ZcP9ފthH uijSg5¿yX5)8hox [-;4+fLW F+kBtq9'69fil* ""*H>~@ٓ'q.2b3Ţ{{`@L Oos8{N.y9v*npdQ1Qe iͷ kކv[,^PMnA]5Pa-))Hʨ(ZaC:jłG"_1q,yi||`>ϝ "rJ(`8icDRWXXpe76ށOmDR6fo@h?XP)G5>ٳdہN7_a#Y'DAmwah ~1~< +C@`>4:pdįsҡZdMjY{>";R7aG\gRR)DGv~7J`{C U7E@lhص5OBvfWpdK|nr ,ZHDD? :cy.&]߷ dA&MpsǢwaM1H5[17% k_ ɐPϩ99;0α8;z)mWՉʋ{`sH]5@ /YVXܞ;_]"\ˍc`乚 (79ز' ‰? жEZJDDo" o|=7 +B*7E/>(@EK)c;}8 YT},, ߦI$Xk݀ޠ)ӋI g 5JDDlfčfe1h=F~}9o퐠s! uG8*hpiW#6TSk)&|f09!f2'""""!]amصu=;V`QX|WӖ.cHrQBK͘evm 뗿&c{)>h?v'B6XBB˯1slaS]B[74߂wfE&=оUh9{N<OWmWIpdg;݈s%}b3hn]\{޽3ߊk:e]㙯A=w[ѹcGt(hH_:ů=eÀP`)?!vZ!=õ]._3!<1=4 3I-'RG{ =1$~p IDATDhgi ZtzޏO8_ +W#:\w;-ؕwcS]Yڞܟ'pXgF|GbF-]ǖ'q4i~bulفϾя~Ħ5 qm F7gaغX?q~9>~j,~6_Y5 QxsMFYd b]/ah L ܉)^0sÇ;PFl:Cǜ1]P}j=Aqmxoۺ5P,0~=\)oF)a7xzDDDDDO* OK|WOxb#v;u*Y Y fPrxPL9c`A\כ0k@։_GѬϵcJhsp&F ;64TcDGkYDǠI^t;=f{ߞSp_H˶ Fk |q*Wuj֬?>o)5O,жKbbGѧI<>܃q=O֛GTX,Z~=lsmB+˄ho,!:cy.lUglcbmA\,V<(w"/qigނI}Ʃa5ٍ߮s,&>c ^VoflK},&:j,9@2"|[iȭѤ]k1X3Xyo"""""""/&""""""j"""""""/&""""""j"b#q>xgoR=˚B[fd\Ev"c96DD%r\cXt_s ey>:3>cSMD%' /f~pe X{f tl˺3_B9QGoTq)֝KOu -j g.=pUѥp{2Z*LxVº7o5Ƴg~^6݋_(c&"rM5GlZؖ`}Sqv,nVgsꆥV'nK~I1ll[&4@#y%^xSX_%rKy\T̰꒻fi*KfEK-S˯Yf_hJ-[l65\r)~ei  3sp|<{>̝;gιwXnRzRvϿoO_Fn\n^F[(ci HYyDq-4BZt> m^Ti߁2qx陑2,Uٯ).\'pz _L]l YW&wFH@z'[U]R|9| F({ci HYe\vV?e,XV>Ya4r/\ߟo/Ye?fcWv'I}.F3ԩ<PVHL1,""ej@,epߎcڢ)vZ z`!($Y }'fP00.6/6'9?Z ŜК㮺իWZִiS Rp4i㯼Jv%yxGֽ_xҼٸ#?3y_PZfA~ưưH٦Z -d՜ls rsq8?re__bJ(p#+Х>>NmYw uuD[:ˋ^Sl2gBn?{'|$2Y" Itjׇ{gm"8ÚF3b/|MDh͈RTv4uoODhz<fd;:׿]ƅ)N3bz3g.%籯ybGXn5Řp$_+zO7 4\΢v烱YQ>[ xo צm>_QH¼βNc2a(Z-➰+q6|gd9+UeZ'֯ j6"Kͷ ԢcT^rah*;pUG:w5ߚˬ1N GUg5䮻[l*]ɟOVjؖHu3cuwMM ˱~XfchW=|'HkB3;mmz >؜ri`]unˮ5o@z e <7XjnEP+_[GG0k_'u.ϢZ -d۹sgY&M8x ٱs}Ou^UF rܸ5S-%V82͙•gV?e`ZʟmVl8K7qv.y_0H_*W8;}Bèd1A֌`ۢ]OYYNdʵj:3cZ eIU)*`B:bf蟹jf8 'I}.FUi`?cSNHqħmbZLG^p2qKL|yZ mÙ.ϢZ }&ؼ*unwy+Wj;GmXTxddlO8s>ٵYpf]ã I}4lޏѽ$> lbOJ"Ũ+γcޞH33a8y&#?o eZ99u՟Р\y|n8` A!71gb %bgXK ,Yg~Z|`Sr$cXDD%4~U?5*X^ʐw>%3Ȉ׏D+aȤ4R{_p4/R5Hy/抻ﻗ͛kVr+6+ \e}U*$HzYsHJJbԯ_?kʒs|ot||!X,9Ohh9T |wDFFRV-S#..ps8ۄMyFd~x^:-N`qg5Ec4hVv 4=n0 ǢEFz騯ED.9Zh߿ 8H v20]Kznά6[V6b%K}#Žls)h,w&bNgu6+)>W]QpHqSR-JݗZ_.EDDDDlQR-bN=j8߭0Gb_/6J ڵ:+Cj2미 r_[) JJZN'N3..=\_ KEDDDDPR-R 64 |=W}AODDDDD((B+Hn:s `ZUyjԨ@###l氈%Z =vv%v%*Vbɳ./@DzX,&EDDDDDj)Y^}e2228vXv|T\٭(ŜHa)B+Y5Zm֨Q#RRRr7WR]Xs).JKrTTTv\UV$s)NJP<=i5'""""""II'~~"""""RzXqV'N3G6)e[ՙI25ežAᴸ#: })|1,""N3R(MX7nhW ؽ{&{wMBBBvA ~~9O/'yGO[X.-aKQqٳ[R"zq\)ư]J p}/u~Zj$\%%Խ5H1#WP 69zv:37GbAYK+)5,q I})M˿P ttf3/.L6@ŊXbv9%% u 9s& y?9.%ߵm6<ϲOۙu[7:u'qkYzwv>3p{EL1y*x L{s/組\˽۴iÑ#Gr,6kР9bȱ~W={:QyC'/pǻ-)<2_ %y罕4ϻ#ne2앹x9o&0xt}~'y5 S~}sUZIu_k]]O-? P:7!ˬ-q-4U}*/J\;3I9a !,b|ŒʖW1:k .UέWnݑk+-oݦ `Ch470-Al?SIOK!8aF*l Y1 /Jbp̟O5,D_DZFqGT"0a%TXqcXDD')!sKS8=%vxd?W,G(3;n#P ^Ns-u{}72C$gxQrz{ja{:>z, r uA-YwF Fw_uTZ| +1挚 )!\yC^U@V q &"rU 5}/en7K>EDģtR^e-oln?ne/kne}U*$HzY꘳ߕ\9r_-Zd};..???||2?~<1q]/}ds0;?`Ŋtڕ Zqqq&lJ6`e8ŝ 3o4+S""""iζ-o*8 S}Ut+;v2qne#+ygsq/\ A3Rh.h k{>@'"""""RTKK7*"VDDDDD"%"""""""H˿%&&d\rlyɥh%rlBRR9|YC""""""FI\0FzzG]OŒ׷=%R(˻+T@*U8r[ a"""""RTKR^=N: Q>.c˗/OժUa"Z jҨQ#sXDDDDDLX ZDDDDDD)@JEDDDDDD.nT&"H;xU zc Σ"}X^'P-qND<׎Yʎ >x6S Kz=h?EDRR-"O6viJ 8}œ KnӉ~g뽻#ݾ u'0b7^O)kϋVAytp7ЃA"""jl4sdVڀndef|Syc+w?|ɴV[xwQNq=UY{@}^?YlŚ ظ]&ن6s\FZD/ZEݟUh3d"o} yÓYϡZD<}Ɋox%i$Р@?YGiե Ǘ7vmEY'6cS(_ha)ݾt'X+Rq=B-ؿ_)[D<3jѢzZ|fĽyfD?WBN ݔX1O2hR+&\n R6%&/=fhq^ɟhSiY4KqKD@"""]AWʫ]~1W}߽l\<-խVvmVۭ앵]IR@1Xbx8l6%CL0uZY6i<Ьyli%sb͵OY{@}^ԟ""Ejζ-o*{2Le}Wӭ*íp+Y1n|6Υ[DJg.6vT?OOfMKz=h?EDo)U|lF;Aa7)='=ÐֻH EK)""%j)Ul52pU^'P-tZ-""""""r4S-DZ{~Vm\sdrT%,x&$]5<ӯN:Ns qmpwTe4Y-"""""j)6Fr<o~aNnη_beNg웪c !427N[VnGtB!ishz*#L׳b17)VZ-8HbZ ^Ay ?fן2To"'pۏebt gw/Sgtҋ S-3npW"ӱHfm89[hJl;xsRҙk;"KcXDDݨLDYh,woO1cKybG-t6I|*7?x{2SNe1,""w) ^Ⱥj71k |-6B"3gVn>yG MVUX>Oxa)4S-"R"9?Os5Ne&$j ѧ4EDtPR-"RBdNҹBPH0-Agq9.ri HiED<8Czzzv +-Z{ןa%,:=ҿHv4~HJIeggˋ1\ۼ͚Yڟ8ܛXt]T[3]$K2ۧ#՚]6?PRj_ww/7Wboc~Z^nef^YUI<,*1!氈lj#<<6aS9Ԉs([ ,\(@3M9Zh߿ 8HY0]N#l':!WV6bW4l.esKAc9hZDDDDDD)@JEDDDDDD.j ZDDDDDD)@JEDDDDDD.j eTyz9T&tvaE3rY^^9,"""""R("MI\J9ۏ(KTe4 N<]X똹X-:sHDDDDDДTex:Ma)[;Ido奁4KjkaʯhUm`4.-a)[Dr2V w+t|==wi[]zz01,""efED3懖@F|0f+La TWg&m07$;|0vzwDd(: ~/f}+}L(9#oS_5ƊưEJEcc>~G)`sC2q*> W`lu}g5,YH>k$ƈ9|6m/ۈObΎ3Syc+w?|ɴV[xwQ\]0H\ױrB}*Ӭ#;6q578E|vt GSuS ]g|ƍyf\J>Ybc{+ټv>پ`399d.+֯glÚK,Sci HrIhQ: 60W]֧09,Êq+)Uǿ ,į[t> onoɞ&qK,MFNqj*e-?W޴1#[ Pǝ{9?R#+mC+ӶmC2őb@WiMP=:W|hٱ97%[hoj1/90UUq.em7K?EDS(be‘tf Q2N/H⛙/cqS%%5N'b LXV+!aXKAS7jyb?UcfebfVl#A V+V@]abHcMcaHU~ {~GӮYC7o'x&̇֏.ӱUY'5Pٯ`IIxPzjiե Ǘ7vmEe F,9Qr1V4ED1x+KR8?7ՁSDLdCNXgy|&>Ղanł۱y%y'/}r&Ûf~pHD5ZQ7ovVG^JO߀ݺSka)R&Xq j_ww/7l5} `siu+{]v+{emzW9$DҳP̪4VDŽå͡RivsT#<<6;y)Ԉwv][X4Mf7`<*%/üwG6޴91Q_hyaB-uJ9 S}Ut+;vp+;FVuygsq/\ A˿%2ҺI 8̶Mf꾥[G&]l(3~QV*ƘG@$⹒!Rhot3Rwӳ CjM%Ƙ'@ITV-ֈa~0s\dٗi5\4<ưJ%""""""Zr1tH(\:o͡ ҧgwsHDDDDDRR-Du/b9/Zr)ܵ(Y)JJ%.c1DDDDDDjɥ8rע8fQCDDDDD()\#y-c1DDDDDDjY kQ(!"""""RTK.F1 1""""""EjFnEq̢8y) cX1,9A+%ưv\mOQ(!%wX-` Zfn_ҝVG~HPss{9ưr\31M<׎Yʎ[uG pRNIbFnMJ ^Չ?-N[ѺE Zq8<^zE#"=ëOu80AFtf Gfmed׋4Rع`2z-imuI[gDFcp i˴}^Xqݟ>{L˿%-c1q~|??~+dPßبeV+ plz)kk׈ p|/+Q~$U;h<ֶ%(n) _$ƈY6s!o6@cXjp[>co{5NưqORWJYl5w1Vrgq=o"""jɥ8],cHIagK1\3ӂ_uw忯_}OnaQZ*uUPBX#VF{pKHp6#p/ZWF+`MKVQ~m6 nM ~BU/6O2 &&yic-,1ܷ~/""ry)\ s[nQNBCJ:/y > X«R4j{;;omspe72~%!e䌏#>mb:+]*vg [d'I}.F3) jR_1VϜc [{LIRfzԬ[!Jǎr s{а'#c{;aFήұהAWbV\{@G1o,|sa3ΣlV\cXQFo;FzJzJݸvǼ>N9rydLxף~324?l'>I%^7WpppN8b*ѽɋfoI8p_HCyq_$;gq`r+c"""ri(\_=u[aRN=jԩ6)5 1{7-xog*΄MziieZeжzC2:_IVm>eVB=wWb\׼5ŦNUbl{TkZDveo؛f~2>Ɗ[1a#ߋEDDIWb{ټ{kVr+6+V]rH≤g)Ui 1K&CeDvjkTJӢAPGxx9m¦dsw.g_{xY\lK`hݢ}.Rx29 S}Udjc3Wd7\:rKqn\c^kgPx2%ՒKQ >KR """""RTK.EDDDDD DI䢔ZDDDDD`TK.Ne""""""ZrQN-"""""R0J%]R-"""""R0J%""""""Zr1VjE˿EDDDDD FI䢜ZDDDDD`TK.'~dN}z#""""""ZrJ6EDDDDD jHhZDM?b9{vs3LIx?A'QVf ak)x._9norRcEa]z0\FWapKEDD\LnI:*'#]Es[)KưY""=m; ՔLO }x|].+^6oޚǾʮ x6}Wx"Y (fUcBaGxx9m¦dsPNX3L1o4ߔHq-uJ9 S}Ut+;v2rne#+$ygsq/\ A3"""""""HIRR-""""""rT\ %"""""""HIRR-""""""rT\ /s@JB~ðبZo>hY2k`3՝ZVnAsYd$*R'z ?no[6\\#CAi יNsk&no۷kn2e>F  %եu:e7^[G*N)Z2{gѯkLiXl6l6V{~?}q}ib2]0:Ѻ ѷLd94r2HDd[n3ُNIuidLn9n瑅<>3|x57-ØƁ1_?9^˼:o΃^vڧ:B=̜8p烱YQ>[ xo צa_{ڰϵbK|~=\Xr9ƶ.쳍PE,;5mtۉ `ϾwWi7<~K3͌oq:|2;סt-sQR]J ܩ4 ~ڃ޵:,S qMKVQn6֭IHrjjB! *FйX+Ѳcs{Np_]Ws}Q{w 6Xr v,E&ذt]g|z/nw.poXޙ~Zͷ, Z}Q ߳j\:uvr$z4SH)T28OZ`N'` LXoB*K'B|X.`BlaY ?{,a0G|&tmm=đT[ q{63׳%n_}4~Zn}(/OJgۗ#?Is5< *oσ/@[I80AFtkJlLڐ 9sScXDD.]9dTjs lVBaÿuBM+Aʑ# P[EmǠrX,XqbdIInf)H6XB ؙҭ6J8{2RMtg㛮?4Mݥeod) PnsznDܸ==ϭ"w A)2dSJ^G~HӕJ>#$5~wi~Ǎ\P,d%eGsUઞؾth i-L?&f(ѡ-;=$,{FD~OTT/Q|:4䌑}%SN9whf&WZ~W {QūouZ_A]=YےU(*&Ryi_:.^x]K[syB֧;%gVVSOU k$;%$GDK/Y#T7E?ܯ'UtoicǏVךpfx,UQKG&Wg_|78a«M|iMH}]WiN4Bg%T[49h.;Jlrux{gj[k:©7Ҵu=us7`UKhS4nP u$\wu\I5+Z=6M>41TC&L%ɽ}4Xw?K5}z~SU^*dk'5iX 2R>%4Mm]S*5MM:Gj7(K,Qcs!T&?&j]^^jүm-躧?uGʌ}G:Y~hi4.DzjzU^p]qzb&jqz[kTը-qzE"Kk_Q7/u pPہ QX~|.~]1fN7gz8moUt?Ô,m(X^ԛ Wkq~}F=4nV{oJR1?~ kJcn~@ԔƳ|jksy:=ةLzWMmOޱvYPC9=YG|9/۫Y?.rtٷ_uiJ'41o xPF 4q%Z7"47YQ[^5UȮٚl2\6يS䤣}+PKJWlz{nzޮtAoS|ѿAZmVP)?j|RS `x60 `ikRAtWߛk*]ooݩWfԤI[Jh" eJ(-*\}b*[ɼ^g5ϧ i2cD4lFa@o-H˔CouI,m{([a(DmhϿ()I1 jW핯_סEzYZt6ǎ64%Me3Vߚx60 P0S xȾPº/]ݮ+nןf< {]QwS̆;䫧/>gĄ(7\gv+]-=lː%8DmneWz3ܑB[==T8uC+RNocnQyv 4!Mf3Vߚx60 `T/S}ۻl< n[$ټzʞ*U*ݼo{=̧䣉h8s5p9XWe$I4W U N 1W ^?S%soW}zc^OhnH]iR%nNIŦmO˫,-Ƚ*uC̷J6ﲹ׺r8@@W3s@-p"T'ΩXُxsT'B5~"T'B5~"T'B5~"T'B5~"T'B5~"T'B5b]ܭ7' dx7u yb<9B5~"Thm8c ߬P$)[o\~x-'WPw酯R`]zA}M;^XBnпw╫#x6 hS^D˱KN $kWK6q.BVIk/7O_,atgo74ƘԲs{+}.Mmzu1ߥb</B5dS)/ImگoV[%ɕbRؕKb^,ڦtzAcU >"?oߨ 3[鴩wK+O2@@*>>tg=VdJ,,VRRb[*0\Gg(P,Iu@8c(c\MV=zblh^M 8^\MP7A%_ּsRR׽7(H!j>F{E)NI*Ў_hMy?MzA}K7hWF ա:E;UTlmO@L5&Ȣw;;G_>Oxb$䫧/>gĄ(7\gvʴx{>PtK?@]Ug >!UwobIJTR9%޷=.\"GunQ]6yZW3ըڶ-UPg8?1S xPiҥ^gJII-{XTFCHh0ukUX,Xvқ_'XXSOiUJHHлo~AKv]v]{>w?%$$hUz⩧ͻAFؾc̝+ŢyZC6w)3d`=SX,xm߱ ?Ҥ/A2x.B\.}fj4+WJ&]tr/$}  <,J O_}  m6ܗ򕧯hhÆ$drs͕thh_vVDV67c՚ɧZhݻuIdgZzպi2 CL|_ R/1MvUtSuEjœV޾}̛y|*04lP;^ p`vޜxi}h&52bh-Z\p-^GNQ#))zGGQJJT'۶l$G))ѻG`KcGРu/RޣYNX '鮷?M+KgYGhȨ3tCk{$}5y!Ԥ_03A[ǡI+KӪ#뜱y2sJ)'K*(]Z'0,e3KT5/ީW/ʯ^ԟ}9<ɸH_UoV)8Q*٠ S4fm%.p,^یHu~ES IP *{PCWWiLK;dNj*ZK=GVE-_/h_E6Kr4ÐiJɊQ-YZ*..pj~wzf]ErYyy==Mqyz2|N]3\(CJjlR ]xKX @ T6:$^yAQVm>V"e4LJWv: tuΰP4gt]4q5zK'kp LCo|Iߢ'&ՀAC54Fv~.;LGܭsP|MS}ۻlUg >!UwobIJTR9%޷=.\"*;Fi]v_ûln l9%$UkPZSZX hb=vPŮcuש/PȂ`Qi`4s4OjDOjDOjDOjd@-H5WgPs L5~"T'B5~"T'B5~"T'B5~"T'B5~"T sАB*Qr"2تO /Ks]l@hpvf<&PKzcL"sB5O WbM-é~sj[Sf'{ *!Z6C-é{ pOSfYޡP> ʳ($-Sbs])(+{@DjA>z'BYZUdѐaOm:C'T IDAT%ϫhZ>D:C)CE*r"8BFS[zLyNw)#-jj-[L_\ ]Kr"IRچ۴%D\@ T^ĆX;sҚ#ZPkUTq jP]shPKeU "u®Hi/Pըs=,]eH_-{RPqUw BŇXueP!DV4Up!6n=)\W~Quo\`N=svg/Ui'Б|9XrS \k>UD[䱇:\uSDf>WYrUcgw_coSW(Pln1Sw /εǪdyиN5Dݢ'P.s| aQ}w?Ge2m++@C"TN\;lύIwWzacnHx7.Httۤ<\#ԕ-TB{v9:>! PZgJ'ܯ/D]v]qB$)sܳIS{!Q+]#mg$I.z^=C;=+x'9U4,B5jGgtWWKHwxYӝG.[ aQ+C+s'9&~g=xb%[=$] P e#HLꊍk󆤟Sa>!ԦᷓV^RRF .^*~K(.$ή]>?iz{[ϳ1B=YG;!j P E{.%e+[lmyf_Rq7"GlV-C(,ȷ`4܏Qj P  v2 k7hCjJ-}vqÿԂ6x3ޏV|ER ׇEg2I:9@}k$&@;$u-P mN+QN9#[;L 9ņ^PjiH$I]"mju*̦]uHNNЀըeIe/0.ze>hjO>yb'ڄ7lup&vr<~:5BF -_dZt]0Ss}0~ޖb~hXjڢڕ垭&Xu 5{w YN-_hPZsӿdtzipԫ N"g~ub[SO+IZEhlLr]֡GEjq%W265AFn>>:fу#4gJoX$Mx@m5Oy%&E0 k-Z%'umput,2܏wBFh{rjƀ [MO/)B-O*Rvq'AG[5,Ѯ3;?y%fъ\> @#T^8\k{iLoӐ6kwSiR DLJ밨SM'Uzw, sB5́\Z^AOǹgm\_R5{sfQQfeYJjx`lqA{6)vڐZ8|vܡݺ+""\&))Ya!67ɑbaof 77@] ˯vXC'@a90 aEM4~;|@ƹ0P a0h*8 ԞOcS'Tɗ1|X;f2\wGh&8!ZeH7hԵ3%kQ \wzGh qwm2z ӵfj=F!!!&ɗkqnɠ!CUd,{sV]{q[ZZ:xӧv[_dH*Lڠ)0ߪ587_fPbEź{e,kޙz>8EXck?oUAA$w^7?a=kjGVghU_.9,gL+E6Zbqv+?nMHŵn+7FA3cQQ+]3{t(u=]cVj^+pHi׎ O)ԖivS8wҐx"T#84`kb/$TPޜ5_~=oڗXkZ3OētiZZݻwKOOE4h`uY˗/;$IC ,僰!IFwUh޲ЯZ~(VE*i/gPǓOR U=g3cd+4Zث#yrdSG[b="Q]ztUPZk:/U%6%t ڷ}dqĩCjFAvoߡCrZ n)P/"ڄj/YnS!{D ]ۺHzD*k_O$Y0EŻ]*Y%LJunС*Iׯ^\eR/y/stW ,ӏIukG.^t߻W_>7ߨoܹT!)X?KW[eܵ<\CۄhTFf3 >Z\!ÆUX_W ~Qmg$Iy ^6Td+EZݗ=6NQ Ðg[Mxf%"""{n^RXאaΩ*TQ!Gk?oi^/[#q) U/C݆J֜? Q" R$Ϭ!%DQ%a$,c,RPPP Ulsnz^9T"Z$$*J-Sta&SEB93}OYz7brRTQ{j?KeWK^e!Yݿ{ahՆL=1TK<=.FTK7z)QudfOs"SigeWNrpITdѷjРڹsV\ k:}Z]${EEEJW7U$m }S_-ګs$Nl`K6?E:#KC,:Uvc@ V"=Q?+95OjѪB-eW}Բk5X/8Ju0V$ŅZ6 6^T٧N~q\ZGY;wIg ]UOomyZw6Q$(!gsf,FhD:We$Wv}.}Qjo3|+((P65d7N!!!ڷo_i&0d.͐dUt|UrSSicf ݖcd}omSLإiŒi/硝:U$C*R^v+eew%[dT əU`C(!2v*);J-Ȑ%,A;]\rd)ez6'fQG\ZXK2rESEA6 Ņ{jW.2VuȒgH}U9N %e:&?p0:P05ѯ8=k^}+v -JA]8/_4su<0dfOv)ٽG;vTJeddh csUYc{jX N^i˴RX|Gn4s2$YbԶc~}]X}58W4VثV(2NK;[? 5X0y5,ajۻ\;vj*QlHE2c(^z?]2vү+%D 'EpS:OFE*{.7ĦI6^ g}PTy{qOG/0WE=:.nĥG ޖ\+/7W7?z֭[ܹKqZywn;>~B u󔚒/]1Q$J*)ݜMe۞vWYZ.ӫlֹf]6yZW3ըC՝s ee}5&˷ڹ;[%mԏ4@+:sŕW5_З> cỲ!l8i T2԰p7G\wzjia V_ƹ2ިB5p*ȳ`[d0@S9 an3B5pǯh>C|@ƹ0oqvIү%܁S7j8d!:$%$$Ɋ0Wj _s|_X`GsuQ;jfw^oھ} >P]dW@Z+%5U99&PDD8@|oR޽Cjf###eXZ`/!T4|yns`Tdb 8*u'B5~"T'B5~"T'B5~"T'B5~ 2W XQZZ$)66V:vn7DFr\ZZnʵk:tYgj` Pr*=}vsS"-_BWoMא  fr\euC}zV֭%I-[TXX(I}vMz6]{5e@AF z7:tЍ7ܠ3&LPhhWO)?@kڻw\.}nu VQ,\X.PO"-b?c$/kտZpWOh|c6LIfVXYySCpx#=WO)91efe j7}s7PVi4hNS}4h$wH5 `sXd1T77),,Ԝ3OXVU3O/+ϙ;l!3MNkefWjڵɑ$ 0@={0]=4p]N999ZvFaJJJ+778uIrJJJiАPuޭq#&5Pm>fÆeGQ#Gju&Tdա};%jen֞ݻձc'EDDlܴI۵UBB >8|vܡݺW9I绚۸@o%%ҥWvRv{MAvN[l>o_ tnn.W83;d4jC\ԤްvhhWo&( ×TϜjS=T"P^-އ 8RWwOՋ@=I QnomWo(͔?UScXO P]5E 辶$-^]1 CWV7@/j!@ I&# MлW/kN={hwin>Y;޳GԮ]; _@k9L|ZLm_Lk?ŢkYTfVWdfe鉧,+pݵX @#|eof }}|!T;p_]ܗ:xnfzU.//O7t<$Iڵr^Mw:dCͩ]Oe_iPzy+kGlܳeZn&_z籶&_z֮['}I{V6il5|aH2J/Ur?הS5j3FSN.uLfwV|&:ט>T5UT:ҳGzKr/Pw3M˖-/7se˖{ ., 3q e}F܊/ST6C#%%E7tz3}O5oI)))5 j|sKsI ʪSW7{:n|-:"ө j…(IRF׳n_zI574FEQQn.9{+U漬>] {U}o%'ǹg }~Yt\e{Y%h/襫z}be _:ef6lܨ^ *k5rF W_{M?^y1s;zswZ#IPŶﭳn cX|UY^-4LuMWJסO |)W]U6k푑yL֔_jH~l6~ ssyF̺^7}wU IDAT.?i-9~6r7Ѧ1O+!P13Wb ¬Yo Y\b _/˥_?m}];kZ]>z~3G/qFu@*b#ߌV]YMZCTYf UV{ݣS҂ b m߾CiiXuMÆ sQbbiM++,,-ݮ=Ӳق| ;u3ue?2L~XO\)/K\/҆dМ{}W _;Gy RSA35} =>sXjK/ᆳ=幒ѸGGD8u0Һw+٪C*﮳nyPIUZFCgsm5~QOIR} z{ѯڗcSlKD{v,|IϾD;sl9anvNmk/{n5Q1,UQ*Uz循Րڐ3荑*7ceԳD]{5kMX~,((Э߮z'K|9mXb>*׮cF*5Z}Gӗ?cowU;ww^V{](+W$U1JS{ڜr9chist[/Hz޷kZ3\Yk_&./ݣg67:\vC9+_ݳSt+]m9`~ұue7z궊Ԥo4թW止.Wԋu{W [oSDDWK9YrE*`QϋqыkҕWXRqC5.{kז[ H9.ddɈS\CmUC#.v@uHVJ[5j.!?F/%l֢%3j i"#Z:ˡJu B}?K'Xe\۫RUECTPųRŃg~c*}2A~{9Bϥ2!A\{ޜ:w|-͔f 53M.0HWF-Qna)mQzrʓ1^ܩqF ڵn٪#G 0@|Tgc3euҹ}[BHSPNJM^-y}z\VYSws6dQt\~ lV.%J͌V8[ґ<. sZ'd5jp˘3UEe3s{u}̪jkp؊>Vf*dsy T}܎e˖e˴{ȑ#Bu˖-N:j5rM{hjzzj^fZ&Gj^dujIR.Y#=U'TVvĶ4ϛ( s?PÇk6zzl棺o#ONuc9E=2?AaV0C3WԬgSh\{5SU(DdHjk*Pue31!*GUYaޟ|77ЪV:3QλjҥjQ㮻ڻwoYݻw~^^}>_ws&M֛o_kZ4=u]uM7ꊫRb=#٬n>G7ŦO_ڣ̢eӚOoT2vc6ѧ˕V]Мͪxb}Y{WO>O{+^׾%I?đy6+><>;z+_y`u|;ޡ _z\]oUzmч_;n8w~ᮏr=X>7/ӏ\o/ ߢSk~|7Shw;ueio__Wu=M?czߝwH:+_w?Q)}w,}E?w]Gڿ_>}#߇ԩSם+~W~C~_'}By/7N[?i~{p܌[|rTkV܍jf+U]+1Ocn'^b1^SOH#]_vy'>~ߞ>s]W]yr9o:cҗ'>lE.H?s?SNqŭ]vo{[u}[n9Jp⡇`wtNQyO؊\6not>jy^LuxM~ ^?~w벿n ~㩧֍7ݤ?U.ñ )Qyr<1omg笻V5unju;->v皱G}T7KzoH:h>o{ߤtc &=V 7ӏQꖻxۖR<ϣ3ZcnLhnT/ccs轷߮GyDt޻^pUm^p~w ׏<{V wtOTq,u,!o6saUv W>KCZGcjךJuZ7W:/'y?nU\rIخK.Dzo~:yd8^]cɣvVNE,s>ul礣7ߠE<ƘG̫z=uׇ3H:ܿxuV}׿z[~7M]wYV?:qg'~18Is9rgG|cɓ:w}.t:gU1ǫ#֌b"U<A#u'%;1?^/xSOT#=/}Ωc{πcqzծu{gyy7KzB:e1шG, 4~7޼WWCvNux#F9eɗ{h:s?#ַ)4;Q g{+b:9]+5n &xH{bLjWogZ^1 yuW,b:殊M6C_tk>i5`-?Z,畡6T/1y7=s\DǛLUeGuZqpoĦQ*:-~YYǺoJiKƮ[k[Uja}*&ME5`U)zXg9<{MUױUu9|מS8`'uǒn}_S?VN?˷nf7"b3+{j>|0)u<^mlorWo7-CuU>ǢZ:xD}_ c1#ؗrI8"k:rN6j X60P#W=M7.#ryyvn5(EIIߵV_˯?Ӂ+G];u<U,oIT7vuܔ<ȝA;K{'tKcns xX50N*c՘7~'#X{ys._c|Xʷ+dS=E|ul=&%*}L5wfvD]XX'b7hQ"^rj[MuPb߄,bfǭryr}Jݙ*855Z Glo;hy=5 <il;r|;r\Wq5xsV|TN976>Mǔ3->:ב}{g:k!*8j5xɢi[1iX~y1u9<|[n[`rcyxLjG}7)'̴x dy >o"ǐkئzj:>wq|sc70\u~BG"bޟJPx5R颿ȪXA|OuntttX4LG+-Γh g7qb9s{\9UV3.uU㱪ns|jsx4_wi"Ϲ*vlh 曗kg1 :?Mu1f=+hx}u_ǼSt'̚Ǣ>9vu}c.ߜo`4c!7D:khG#y,_w<G:cΣɹ*ީnf1\QDǾh5_{?XhXfҶTw=:\ufmhxh1 84\j?εyG{MV68N7'7Mqܱ/\<Gt:1]_e=!}{|VZ5J\Axۛ\3td|)kͦ&.9cJk4_7QX57:9no}bG>wUc·jOk2@͜}1G+6F;bGzJVMӴFbћb'0+rMĕbZ3u#* [kz(5b>jt#kru珸ҼZGU*gj}u7C: __h+7NZǛMw:_#6$<窕DuX}=֔ZҼyOk^jfgT4ئګ4*&:to<97ߴ=-ڼVub7;˿,o};~-|+`3Z]+"CX{/vBJ|DӬ蹪^=nrvCXW3tΪGy>b#,[=o6xM>U<vCy5y!7UqwZ?B4UG}{;XXʔAxR/u:y޿"&q4u㩵:jPםk"1ј[|--b1ǘXȿL1XX_z~ 4>rKDS=E `S:|}b]OZ{yXj)5Ūܱ8ӢJM{x{Z4]5S먉u~<粪a(/)ڼӪwϱ\E;Qnrzbcc{n]MUq=I1Ǖr1Ϲ,uoι11Y<7 o[VX/=|} 95{sb|c ^s8X̼?D>y.ι\1q_P.=-}97@}jsU5XWux+֊*^ U]6[j<}VєyQXƬZ8ysZ{\:y}kCo]_N:' b|A{)*yOc]ͧזT[iy\|^Z}9ǧ/I1byڈ{1ϱx>fWrRμckԜckG Pj=?61y^yWpIDAT}ռҗM|}P5UysU"cuPCخ WHs:yy_W5^_Ml|SSs=q{zU؜UGm5Uǐ목Ƭ_WU3&1S#P}yo̪\k+>:`=Zīys>b}̪eLݘ6T=uU5R/S۷'|^XfݳL{ZMI{k}eul)s15ѺVsuRV9sV{:^Ťv\8s5z\bRݴV|̪\ Uϫu˘15m){eZׅͫ3T7vϫue]5vߘoVuRbY_]U/յ>-뮛dMs.Ӹ5վ*_ŜLJ֡j =>US[ŲVڟyZ[;nM7oS?k5UԮiͳVMk^i[0^ӭ m[jd[UӚgUIj't5Sj}keSL_q5qS;>MWھ\6ئ/*&MojʎIuXy\fOh]W2{2qRZ{cYq6r2{\+.`S;e]pfZW9d|LDDDDD*154QTA70XϡhX5%q'zDDDDDD]s ozZ/Q"%*&jqל\kO(d zLZOB50D/d{ ,KDDDDDɧ!!F"YUCWC ':KCDDDDD0zb!&D<,v]юbu?DDDDDUcX'ڱюFCՐe*YPCGCEZO~ 1B,c(iLh5d= Y6.!X1w9YuODDDDDH!UuwhU2p{yՁ}Q|;ą[WW,_e)T}>^ƫN,2_,.2G>gk:^Z.%p}hQӈ6O#uX7XSX32z58]MD'"""")j:qz8.i:/61jz}{}DDDDDx1jMmƨ5 kĺL1Qj-R[Gk;hG;#`8Ak[G k$z|4VP~:>ֶL틵"{rDDDDDHu5:&ֶL틵IǬP8Ak[&t}jMm ^u"""""JN^Mm@_>u\>k;hG;bY,cõ>8yZI-CDDDDt OЊuu|m+zͫԎ$񱌍IP,vnWՍx˼xx{ՅH4dY""""!A*Ҳ^^u+dz˼x˼j:юbDh8pARm n9]zU'""""z MMW-ԭjh$)uw.h2Q׍-cnb^W:Vmk EM਎42Uƪ󺶗xI"CQ4f PwW`T:ސj^SYuu] (zWqT q꼮%qьY"BQ8]hTǩ}j[7tu]MЍSuhg""""">K]+}:j[7UhƩm/Dh8](TubiZ4H5u^z,""""d䵎uj^SUjѴuSOD3.1QKDf), 8y[VSǨ}:/xcv,,!J]+}:\&j2SZӵu5&j?Ѭ/1mT\~qucuNu]rM+pʫϫàrkJmu*պ:"{טB385(S]MLcu:֭5SD yjTs O21V58u*f!ڝH답_uj[7@taV#[w:/{ucD[z릂zjMV5?j5OЅ=]Mmh5Fgr~hjj;Xhb Tx  9Ҽn 'SA}^p xp  꼺ZW://RO]V՚nyu j-R[@)Lڀ>S#r`uSAW /& ?k75U]nr[]u=^5/…p}>jr[N15y^WSOOVrk^nSA{{ihD ?+邞ܖVzVc|̫/RF X^mS੫7A=Z"]<tuyU> rDq}rjS|5QXjG:+rWWV5h)H/j]żבZ]릞N,,>uny~ rZSuQKu5hìnzߢN~!2*:"8A 9*Ԗ&"jJ]M#\e^ALIՇn=,\hS&+BjU3=eʘ7_"T)? j(STs]_L~;%۫PhEJ[.U-S:j1Qc}֣ jTjr@b ԮL/Sb5\Z(8nϧ'SRèD;6\MWtSP9P PTn^z4`^}]WVۼaɀ2T'"""""JF`duOڒ7 8 {Tc_u%LS8uCFE[7F֔jh- 2`Q23`~ٰ#P;gyHQݨjuOZTSu_̫ߛǙ`R^S """""JfRSRzGAy(L$> kՏ`(OeS!rMV3'յ*,Q +3-tTPY33ň &_q*)ɧ'}w_~y+~~7(6u~U%89®\䯪Un 5L! W?~\ 7g{jK'B$XܧEOG(+DbCs_D-셲UUgl!# -,\hcUƉ+7+gXrvut5>R׍ՀSj[8Kj/ضr{ځĦaYzf9:(Yo"PCZxLDDDDD0"بBbD8;b+EMen]W 'a;ԆHіrM/ct7~Cpeh{720Le `O(9*PS&ܒ6L˅K\u0Mo\7nԊ*S#TS3֝r,qyrj;a3 F GT-*iŘ:Fr`*ߞ@zF^س0j_U f #TU1uҋa& o`KD ;uğnỹ8.v_v;vwszy|DDɦgHMI5kFߏoPgȭ&j"QrH3.ظhP HNնWkr[)[+tuժr);@v* ΂V1QZV !ʀi|/2{@~XG\ntD%-Ўz$?{$u4Qm^:.^ ug8PYYk{^\k8"g8}}Q..V\o= >DNN6 dKOjJ z8Y,YVߠo㟪Ug߾}@0߈0мE[9W59Ī5+j X+ѩu-7|D]=j+r#`UJW9R2]=@jr"9@(Ju0{r #=Z0 -lсo.83f@v_~ ƃlF 7&ap1CqX@ |quh,\%"J(kԮZqSk{Ѹە`SSp7aSSlJ[h?5֬U"fEI7BmW. 5Rb^y5yH^նZO;_7mU"kt^]mf _V.Zv W0gE'DsOM8cZxWBODt iS_};ee娬B(+/bܵWẫ~K.:uWGvm1ipw6">?@q 돳Gofz?>?|Q4r[3Nsĥ゚_;ЪeKyڷk'[܍O%z<q}N>8ZPwT?om8apcħ׭SN<g< :vs;ᖱcaGƪUQ^Q?y+퍁쑧 #O=m۶Aʣ "jz۷_?߀mK D|?ovQ!OYo {ض}Gloº С};u8LxzjL]Q7<5ASCh z"~⨱N~uC>uz '[m7S0{N:i֮t*}1x~ }8d+8hglt ?spO>z7`k6p]0-p-]{5<aCPz_:f\|˯''c҄aμmiV!"'vwVidi0\'QPyMG}02WգO(Pר{vt,]#&Lb%"rs[bg.}qj׶ orݻ/|;YYCX.Aq1G B|<]s.z8Zi+׭(//QCkw1{l cb . HIᖱנe]40eڿP\RJ%KQ^^ ѩCu7qY7Qrp]VgݷW>?mx9,_ye+_ke0L|#$n^mt&#^OJ{mp˪}r^ӋCS1^kCU>-Dl|.LLVWs뺀 z4Mw̷Ӿ"":S֭spA]ڶEYy9+n4Ѳe`ێ7 ~)):GZC0pm۴ƎE˺ήz{lz]68Θ³յTdeCu]<8 xܱO;}eݶ~ݺU.F]|zdgh׮~"u],Y'={㟚G]U>שG߇?T):'vqQRu Ţd(}2%nrTZ֫hCI/yCSݼ  !=-ۿ,*iv'zR+ҢfzV ,Ii*2ԵEbpvVW~\Y8jp-\v9HOKzڷY-[4z.)Aֵ-;&|vPܺUݟt}wq1֮[;T(ܶ>[^G\* nw=v,}H|Q(q֩EIU74/XQ+3QbR"x󺩠N6CUߦ#6$ԶSMVf2s)푆NH< uP/ʗGp`9ػՄ[;o> # <3 :KD]\?7_G|pEffztll-(ĪkpQHMMEFFR|;gnuEKЭ:A:GWoZݺ";t~}н[.BƈSNϲ`Yzt늌tuh-ϢwCqY#jr[QYU48;@i^tr|q%}>@ ?6 +W]먲"sM8oeԌ#^{jNRoO kh:Nt8&vة`ˆ>NAd e¿=[ڈEj)GvcӰdi͹KSB^:؉K.<7G@A6Iػoy|n㕘TTVVakoutb<$\+pۍa/[ ]t9~&OJE5{nOًK/?km7G ux-{'#ߋUjC3^uWg~ )WfԓSUjw8fxY̚="0ۘ Q`7.t ly\G<5=qJ\7?DD\2df3Q<츂2C|syG:R<6>D7UyՅHL09Ъp}r[X7y=qawkJW:#"F2^_*r 8WB}Ur〚TżL{{i\%$ԅ!o8p8*+\K]3QbE<^7/^"'DcZpO\ޘq %"qںtSy 5;937^IiZm/cD_(!"mD tByjkz.T"J^.LXP0LX q€eM ض0õḡo&| v0- cvk`Y&\ۆS}wh xoermB}aZ0av^u9Fp= IDATj;p e [䀼M m'^ M?piھi;pÔ5jeVo7ka/cߓx1붯T<~f}W[с̲,L| k2ErCn|SWڗ43k#SA;@ˇu,P3N=|sLL4On WSoX/`Zu^(uO?QwYoVŀes= 9($:0ھY#̲vZI}{Ѽ] î;4|c~A̋q j]S* nh_mau57jrRD[&1^Su^'R%26I;BW7/՝JDDDDD܉#\TWtV^puuyݎXQsfEEږESou6N82!}M䂈9K&ƉW] j;"ѡ6^OPݐTSt}n]DDDDDD͉oyA7NSW4VUh׼VjMw~V]?Qsf!L䕅Ԛtch XVG}6PwS&r }2Qsevtk*S!Sۍ)Cmt'҆ y^䂈9F~:/d8T-ԪL j-TG5gj1T jIB鞼ZSP7:76/j)2p!>\ݪ?""""JpyGGWjB,%LCm4E7Fm!Ҏ 7/D=#ol`>EM_ZSFu=Q18y5H7/Oż.uUSE3&jnXvn*uڇ0\+:paLLZ""".稹ȫO=r+#§R'p"1or^mwY5C~>T(rZ^5U>Y⪩BFmpԚ\W55['"""Jj.jn2]$"Ԫ2ݸhjj[1;kDDDDDD͍.神H7/Sj>HDm wfz7(Q#S#՛Dh78uVwJ{P"""""(\.RB\k5v\jc A}vZ#"""""jntFAjF򢎍$ PFnG}j?Qsf5D'yU;ឬO@^cyMm6L6 ~!֬Y*uHN:O5\aÆ0ˈjQ*6UFloP!\LcSO;%%%p]͛7W^+&MB-aDDDDD:5yG'ܸ @pFn{j(J?&L@ v%뺰m3fʕ+gUV0Jb P:oѦ]RkVQ FZKth=m(. ѪC+dx &""":0Ze' tb j/uuӧ7zEw}C(I-xf E)l02_} gt6;๕Up/7n4S3v ޽ LY&S޼ CR5col.x@#Z ҉ucE<@_(l۶ wuWZu]|xz3ް\m#PK~n9bUmm_8satǺ8GNDDD=HUo>R6WbuϣX-cԨQ1b233ծ Xv-LR]œO>ѣGkNyCp+lN1-ʧj.J~UUNz̟?>_%=u]K. ~ k֬AєC~%6~Y ~8VR݇%ܑl7kn2;Wa'O<&""">kc3eƉW?iYN=`Y H4M1s]c$!WX+*r.\,%g-7;!Cک*CIlU+ȩڇEQ% JP)8U{*T[xN>܁KQ?H)xUю7EEO> iL>TV}랕C"f߯(ie`Hln ,Zai#k r_Ѫ:crke`J1B?/6v0ruЉ8o͑u`է/;Q0t=wƜYg~>chy6> OW;{o`ƻ+46=qwC^ۺ/nf~u߰e6Rѡ{? >v ")^(i2/꼃k\hw@(Jhiae`` مea `cf+>G.n9GȓNJkCa(â߀g n Re;n{w)xQ/-[1-e}(\ ^i.< Yrƻ݃ɳ\^l}} Wv£r`%{g`7b

  • >}{DNsh"""hOZ2چnhvQEEQPPPSu,Xi0 |>cNRfhopb͡Ӊ d杏+.Ʋ w0˪Nı ظdB^Gn]¶#f /Gq.lv~n*s88[i`—

    `و9Mc3v%1s7i{{?̊X*x&Zff`r`Ucpw]n6m6Zu+Cmp]pLjvH1 -7:Lb kk]8*-w[u_ۤ4>v}}W}d7ݎ:u >V##v,νL+>"""♇z4oVS^8 @C̞={.l٢ .7|#Gbj2r F/@",]ʑ?o)B?cu; C;Z02yYgcylYF&釴Z[mЩn>܎‚2S3ۅ~oFR}H!ԫcWpG_an*lؾW~ GSw-8@j*#uNAvdž}`'u }G](*v`K.;OYRDžw=~~z= sy8shWd4LDDDϬ$\s{ϝD 2~xlݺU{q.z-̙3GbuAC?jb,[?Ӛp>H1s:REr?aނMXm~j>~*'jK1ʫՊmՊ݋={ŕ dE͏ L^).Ft]GߚSh p?'҂/ˮ.߁_o-.xevetV&6t uN9>0i$7!GM+**/~ ۃ߫ݻ y7[#Y1l@ZuH5; Ű+;],bj.dh}ȡ޹5r}0[GT%ҫ. OHl0sz68by|LBφpm?v޾+{y0R"?"""hJ{ 5PbM())Q˘:ujBn';;gy&n&e;o}Y?v]Ub#8M4ᚈ~Ȭ;*((PK>}$, aO>j1Q0apԍv$r ÎB; E`ǐcͫsaqnHLfVŚHjӘ]T]ŦM;k~Wbvnv2&, {{ERrno๫@6+BJŬλn @O~j+XL duymR_jqTnݣV!ȓm׌ gd*lߘ_^yGt*qά]5t |OR1GdB=_߿ہЙu8:x)l-ۄ1 3 }zVlQ%5Oզ6/B޹N=16)w@d[V#1t'!>Y:f`#q18k*fat5L8LZ,.s:EjxZ\4Z7iGCf~|נQ8e ز~g@IxζH+3}+3NGC;Av+oc8rlvF"}Y0t9C-5ÇoʗgC&Z97lkƐ OR3y{'%`pr߱}]>ƣ7|Z}Jp\pJQ$S{gj;g5>|OX|gu:̼p%?7֢,|vqp]ms]ǏM o5u2qع8n'""":@Q3 )f 4mR3{1?F@ 9*3M8Cju85?㸀|PgLDVpթ)ZN5l=c}Jy\Nh=w]0 eY} W81lPGQ5?k0j.5\-07>}u|8k nݍ !cw 8 }(}#€ />}0o&nٿ-['\zCY8)yl|1nNV9@]{ ?ti: _|f-M۰g>\\p@Oc%"""1Q!w0f6`Zaš c^ߋu V0k}νasWa0 ƌo 03pȱO\Vsef0 +\|=Noo=KWl00o !8q:W66 ("""""aZ@g4 jY0LDWtښ1ZAח8PV"][7bk&r^ݥ""""PKQԩ6o\f D͎Ls.򵛰en]^O틶 DDDDɀrI'aƌ~dԩÈ#)&j ȳ~!gUGuC-Ekk۶kwƥ^ZH뺵57FxyOp5l0\qu۶@ P}c%""""jTpZa4i R'5ZZ-'`Ĉ DDDDDj)&mڴo ׯMDDDDDԨx(YJJ ƌѣGc͚5Xf .ɓ82%C-Ջa|ׯ_#>'OF%C-5Z 5&~ʲ,PK Q^^h?PKqճgO5k\UqDDDDDDO?۷/zիWת3ƍC>}<6Dyy9f͚_~E9Zm"""""0R\n cǎ.w܉z(߷u]Nu]WFDDDDD~LqwWO`ǁm K.jn PwzLC?^}e"""u2ڷ ZX`` 0Z+믿ӦM÷~["%%={9眃뮻]tfpvYYYj{DDt Dv:t /qj),qc=6Gkeq%""RVV\\ PK gFB~Ƈb%"""""f-Z""""""jjb%"""""f(qo¢*G*#2LW'?MDDDISKDIAO^f mW 6<8zbsׁc;`IRn ><< |i-СPw}T;'VWrIj(سYxWhsMx ?b=!C :]*`e <OpF+3sa@KDDD9Z"J^F$v d[& 0`@`\?Q~ʍ>|n""xLb0ij]YfDv]\~/)?36>j r_C0q+/b}g/%jN}K}YW7^9LyXPvCppIw +gnS IDATW ki6"JZΎE 2r`<"g7>_i}z= ~~*K}EI[1bƄq8 n0oþ xd[5c D=жM(*Md0t #:}96wĥcD4Rs ";.gWtU/\1݇N8 ]Ɯ~O:#/ X 7?~3 vkj߭raA>|]Q#3-{tEP.D;)≥U՗-WJ?VB!BNǍ P\m'GS xw(*r#_N5΂S.ahy47II]z{u4=#`S r6%} m?a ,Xd5Cf׃9׳whSBZ{5s^m_ɦ(D>]ASy>]3Swݨ A`_Ҳ݇ oDJlRQ5*홋Y~s;[Y>;Y-s@ | oԉ"6oѳn qB!o1\7 .n^mxa1rXx GZ)ƅ-Uz>WV+ RvA/PO *TS^Iʦe-zK*ܐv!:6hM-ܐ-aZ0ztbN_@WTUTL&L5/ 0z"#cc(T))\b㈿!Ċz[ R4o,[;yKTao+ʄB!OK7.^Ė;_R|}NN\LR.gJzbӹ[c3TL>(SSjJZp/2q*EYdEY"Hzj)GZy4< (IŐ>5U-i*MIWм QX&t Ģ*(E W`jBW ~PW&-ۗ E1NΫMs% VI~˽MLeZݷb}xszS;F2zU[-@a-֜>8 p-T&FN&Zգ_ꦬϳ>>7jlx?O| T[/Pv^+B!-uVsq 8{,6 X\f,7!㧎Bܦ֑64ϋ)>0tu+?`.+9ut=SQM[֦ajRQ05u Hp؏}VPT5}[`r9x^ϫ8|0PmDsMXAQ g-~<-Oav={Z;X !_im<[}[gŒ91ys`w,iO]םKZs\҆#0v/sݼLd#NQMt3=έNr5s5_UQUe6358g Npfg NQ3iYy9k뢺ڶqSQ`!.&gԛny>~B!V0X1 >gp5-|fzwQ< B<70ch7 F`B[bRY/tU;ߞg}7 Gt^P 6uv^Fg uZTY?c[{B0HP+xt(9RI3ZZ`$`+Q|9 T)?ݘ(m[0kNVKN_3fYy9iaLYm?67TI Ge@H[g!B<` !!*פ_}Y/t^pC<`jR{NԮ]/2 ~\h BGmKt ´= Aڹ)!akۗΓc]^N z/rW=";|~>RO!r ݛQ{k)9%jQ*<箸{+q3Ʈl t<"6\(k3_e^TS"''b >ͻ\I< ڽ=w RzkBNZ!#T5bD #_7P4+M;dv|'TVxw(*r#_N5΂Sib24MbƙS+߮7_ұy Ax\pq5cC{a֯e~ش!ncg̋XÄ&=tlgELi 6}yVTǃڵD̘rMSхo\e'YzW͑3Iќ+Ls x,1Ljq2FR P$0)E]&B! Ab*Mͪ:LJ^6E F7=A#߸t *{å-Y 5,FXC"8e7+S&NrxP1. cǢMK5,Zmiw7~#W;m`x{{*FJ:· Z^ 9|nz}ڄ֢J6 ]%mK&&P [IXLfª'rÖHb /o-+V|V/$;ซa$≷B!66Bnd8˜n7/(JHRT梚nE&H{LniEAUn~# 2,ovR9ZP$c-ϯrGB!ă"AB ՇD5;,BǕB!$ÇB(J!B!cKZ!B!- jB!B1w Qť}leLCr;b\MaaD6tMCsCѬ^5jں"ϦW.Y-mlv'= Gt^P 6uNq5=k֢jͺⴿB!; j]4iƍ#55xi?>]юx ݓbEYl/6HGe/?t v FnL[k5'GNd% Cc٘!,ʗ7qoiOaCƔ[h*|asH5 mĠy `{\d.@B!#AcgĈvNuF޽{`[- 3r;aZ _KM27ܪ1au jڍ#Φ-3DLIu ~י C);]9fMiNu3sSBBè׶/ӷG3R<}fS=KUϢ;|I.Lۓ@96DN{ *~ԫ\kLܞ9(VR9wElm!%rX>D]n7Gp:/w|yS5N ʞ̞-4s%}*Hh޽HB!:yVܱ1cƐM2e(]4&ɽu?Çgʷ3틸5E,|y1)\#|έgZv˱H:6#(=l? 5~z+ߊr%v$3s\8} )TOOqDOMJs%Es20JxֺwR<s([m)I`c0gdB!'A#/^d78c> 0 Fĉ3 9^z5C)Hxr|,s)+?/1tLLAEAWؔ%,YZVX2&PTL&&.nZװ8>(o6zV-}+vbh J4{+ywB~XTMCKxtOJa lLQ-(eQQLR#.<@xq3s^maK" +>֌-(V/z"7l$&vTx$s6IiBMZqGۗ>}`X}ᣏ>ʔiQFeĽ^+O6=%Zf!3G\O?n?ë́)L%:3|Aۚ= IDATz*ݾJWػer| ؎΢ky)IPF">J@䔀0v4\͓[ŋ hfad/KDm=:m=ءĽ?~׫F pX*$2d+>V/$;5ILKB!66wիY?1mg uh<˖oaߩ2| .oftv6?xuo[V0J&3&g8P糽v-G~۶oe担0;7(}dJo;0ˆHd˳tww~J{&Ok ^K]{)f 8CTtƣɧN[ *Mhs '\EkT!xXYܶ\#?泓hۭΕ1.Ó<0+78n3'~bc&JTA/RSR囓ēNsjZgkNq0aRRtg\ʵv(K` qcseB#os&/Xӿmd_L): f|ren&Luaͼԩ&> cb IlG\Ѯgm׫˓f+UŶGS1k>#e2!B< !i4 Q=z0SԋKw,=iO^o>GPP :2=)úVC1Qiw^0@׆ui:n ;EiY'jy僕HevIѰQ4k gJ' ͖8jtj-z"fu5˔(*^\ќ劂=WW##E,* gIQQմ meBm޺g+VoN1'!oERҮr%9vpIk.iÑ眝}fqrM9n^&/ Bl(%XPPfVT97uR(KE*YϼMqoi]DE%u=+ٖrx)F!3pUnylB!$A '::UR@*JIIa֭AڵB* ՇDB!x\3⾺|2m۶Zjk׎ҥK4|9+Ν#88p6mJZs&wEI,BǙIIIu,_M4$}]>#t9fΝ#<<}gԩUB!aԊfܹر])R+Wj:cǎ%66#@F@{A cr)B!V76mJJٻw/e˖EQl6vBSݺuݳB!aԊXbEje9}@ۥK^yl!B!y?$)) 0hܸ1*TH_ӧOb -\7̊K߿L<<Ln_lB!MԊPB,X??LjժU5kfsn7h0MU~Up[*w3vOܒ@2N״ hkGX:?7 Z m\2Q$$g?AGX83jP59't!#ݳкn-֬Kޟ-N%B!#@S+0_|S sx{{ 77R3r|8eYԨ_(9v?Py yR8(z 'GC_ģ?1I(U[̸)rb3},`67Y]mĠy Eҗ `RK0&BfMts|I.Lۓ@96DN{ *Ԍn}=ohE'xR:.e"(xx[_I'ꥴ#DlN;PׂgʼҩVEeOfO|w幒>xx${{J^A !PUɄ]rЊ&1L})oj|7*"#`@_m @Гjr%+7DJ:E1H{i/X}$KÏ!'Uǘr%\ұyAx\O/bO,>h׺ q7qԞeka? O_*kS6*FJ208?U -/}{V>^>7_d„_ԷU@WQnkaK" +>֌ʊ ["I&]XH&1IξBeR gFϜ/|l8|TՄv9䀠lzT%O`Vul'yD ;3j6RhJ܅@{ITN,*kMCKE<91Fj5gw]'qLlAzaUIe$+V|^xY5lIvYHb'^roX!x$P8b 峯B(`ˋ$|\(JΔyh5'ީf%Kd㺯:`O6QnleJo>]H9q5s`?1}c>j$>f˻%ӾO @ E=Q›E'( 0Nu0!E%B!66Dllyʕ *0{l[\*\_OxPY|5x4͛s!Ťb8ᓗ0Re}n,$LDk툻x?/mF0.ƍYiq vdK5H^ОӸ}FBIN"11} >&+ɀ)4ou~ކa0ԬLH+PSz`ð U^bBTϩ46FMaiC31vj7[|j Ξ̪'X5kբjTDiI_nK1Px\OAh:ME2kY,wLl0{}e՞f5$B!x0n8z9]]3VXW˿Kv.*`qI뺳 :zpϗ qZGX6u]64h“O>_|رc1LՅB!aLoTUeȑiU(PbEVXagB!-ԊvYwHB!oy!h\NXux;m3BE:}53l,]F{{w_(ߍi"ضu dȉa/0\&-ĶGS ͝aLYխ͓4OWlˀB B!BG ?X[+/"OƳq|{tkQPB@oa3 w:7#44yqN\]&_vgܓF63mZ9Svrvp7G;Iܪ1au jڍ6sD)lو7>_̤^Lz8 .7Okn"s .]'sx'lBATn5.Wּ1=1sP"s#DlN./'*JjZA{0[MfO|w幒>xx${{J^A ! B@?˪]M:Qm`CT|Frh[!~&(K:5hoXzbtlGPz4^6j"&kW8*JYI"ghp1AR4' S=ЃO(x,1GJ1xʵGj%k|5ӿ4<% =cvfn9@! !9e,C_̾!='i-DѼl]R[ {9)Rԋy we|[X7b,/C*bR@QUL&#5QR0{a1{S,:.'>}}0n8.^ȥKO#%%%SsΊ+HJJ">>SҴiS.\#rq|ΟO?Oz (XÙl} ogİ9jxfw|%cs+oz~xJ&3$;Z#}(߼͈7|lf<_(iK62fJo;0ˆHd˳zcnOz/Ҥ)vC*Aɀ3NMh, b RԒ FEgIODNH8I”(*_B!n0 [}L=|rTw}nOC0 4Mq̙3ѴCul6}nOq3:ׯJ*,YD V)m*PiKZo͋6oC*&'(SSj 5N<P-)Z6TS4i kڕ̙ zuyҬ~X$#uV4m7,Ʊc|GV4B?$]y2>W_e[֬Y 6-[r,08{,۷϶-cX^jMK c&YsJ^Ċ$|?O| T[/PʔecpeT9Q`Z^c\Ca+*4cXx(& 7N[r4{Sot^zkryQU=>DMoߒ~<[{k?b+0|vy>oکl^&?IGs t"p䉪(6~ϸ}ߵ,UA;=_A_r1KZ݉c33֛cLB FjOQz׃B!.Ϊ^vy|u״-VXW˿Kv.*`qI뺳 :zpϗ qZGX_I<;RFU*7k9a$WhZJBis:[㴇vBAZ!#ț^kDzjQ(>E\]BJ$E >_т~ٱEB:p!'J5͞?yސu=*3Fˎ랛5&򒆡rz^[cLcdC/0|}/KR67TI+_Gs|Ȱq9o!!B<`5!4J4hBefiQ+X|.6>ǘoDV LPnq6}ذ@T j@p(.”^hB/0pA:R<m$0ޞÏukS# G-%ܳD-Ou O>fMtJx6v}9GlQ?rӍa=_r0/u}c$65<S6s^s6JO9Wצr)O¯n H/eR/[ѰIKn\3w:7v7~A~%ޱ}mTi I@npt ´= NAi?vʵ捎ٜa(|sWtP 4ٌGgl^bܣw"6\(k3_e^TS"''b >ͻ\I< ڽ=w RzkBNZ!ģX#ZΒ͗RS9t%FsS]*9(Po\̺I߱?EЎ1+6e7L\h_f2b+?FԏYc1<e{Yv/te4K!'Uǘr=Ӣueʇ!f6+ |!{*:6tйdH<ݦ"&R6}9)vO+弩5pW,bLwa:"7^>D;ndƹSϓͣJBuN+~( v$3s\11l[W <$Es20%Kx8΋wR<s(['m/>$Oq,n !2 !IRؿ,sIz?kYq"LL^X NqEEӼһx&PT@Nڕl!ϳaTtenH䴘 ^бkZh؅×Աl9֋_U3~ysb ϪXYIRגm;}XӴ{_u݇NWsUVQ9r=GIYu:^|-7({A3Nu.=B|N[rr?`RXEUTyMMV|SG˟^N+p;OQ6K$;+U|>Ec[O= #eLb%9~;}q wʅfcmyNVLD(&گ̌Iyvm5B-)Fڍӳ>Su +~mzo^z15MnIUʥoҾ Gk!F:vq SB]x˫z{h&[m;g*6SBaq"i/TɓtK䉭[i}#ʟLFf_Pڪ[e~ٞ-Ocֶ[:UYqc51K; ]\(Ъ豧'_v|L:l[?M>G6W%'A+Vn $G6j{+dit0K"uM{O??NS|;7ZͺwP74o{l>6\Q*i 8E^Cݪd(4֝jz pͭQ+-7h;{\Wln^GKcNQ?U]V⺛ػuNSxk P_ҽ7WtkC|_Վ?EN.=n{ԥ]]}+{53çUY=:Z|YMёm_/6hQƶ=զUK5>+ӯy[z-Ԣ *j 8W\7/U_.|vmrlɻVӑK0~k$H#l>v#ߖ;;->8Bcd%cπ::<^u ?qKVc}NG~#3N99c8Jq?9NVg_0Vcc).Α]tO;"^ okjuE5mvZzT S39 pPˇW \jcT.%}tΆ- ,jlRWbE-B- lqM-NVMܒ}َ"usu/7cpFjqj< t;_.I}ݞU?_/e,y# y##H,Yިmm]պ57QGmC:߄Hr닱5o9Kx^m4G߽tWvW=4sO8jq.T!iƇ霱jE{nWҤt4z:i=/}_5{ܫe,^&i+T59P3ʔ-j\G MզaR6F:4O_t/ume߫+oUQBL-&;N5k%tA9UԠy0,rEo {EvO,Σowrw61rw!}:*I_CtW]Vߛc[akȕU%B-'zr?TK1&[W zd釩hi$u94C/骗{T7A 5Ejdy,UWG~ҖE/=ę/We71,?dPjz]ذYE_g|~7NƌA;d4TnedқZXr~ƭr#ں'dKVDylPGle 9Z1Vt뙿Ӓ8Ŝ|~1s+2f޵"ihT?';_ԣ_s^G򔫩G yzvv"]!%UAZ>mĒ9[2޻#q;%KKzEF?%w/1NƩß=X,ci0\Pp!42۶5`͝;3JB-Ψg}Vi 5o޼z\8cRRR/z<nZ]Bfڵ]lѣq"⌙5kjGK.U֭OD_m$~iJJJ:>,?_-nݺZlyc)2p# -9> /E?>8' 2ƜRmѢ"""eeffj[CEXZ***DAZ5k.B(::Zznta?[8GСCծ];ڶm|>rrr2Tn߾=d$1JJJ:n[@I9xt7xC>qRl۶M|fΜ)ϧ{75߿zb @9(1۶5h ^:hyƺKEZoV,v1deeiȐ!ڽ{Ԣ~m-Z0ywIRnUReiZfӕYw!#,cx LiE-B- ljaP [Z@"E-B- ljaP3&**]RffqOtwIRP3~V^Ç˧ŋBsz^w8]z1cRRRtjȐ!R1samٲE UV@[zz,YzKm%%%l(=8c5j]j֭_@+)})x;3`1cƍ+Ǒm%zٶ] 3Ϩz2RP3N:zwULw;e5J+~eQvl25j|Fi„ zꩧ(g1FM4ʕ+5}t[Zv"JIzi"ԖVuv$5v^RH t`qiVto i¤u z_Oш[m۶jyJrf5#t:y+Ԧ0ŧ/kYܞvNVۑTI9ewZNjsMh_ PuU>[%)[>~,>ԮO^G[~ye~1uU7yNU\4B#oqtpsvcW^Ǒߟh8aQ9zOs'Z6c~6VQ~WK?ZlՄ ϑ߮w~D'ޭ nߑ;CPNԇKj͵4sYr6hG)j*%Z^/0_s|l=r^ʰꃹc>TSK.Go=j+*p8 Bm)[1^iGuqWCb7^ s?ѶtD]ꖦUT&:NURרX=WJW骋-UWj.So;ז? mT5ګתU/Y'H2p h(ouP joܙX#+oF@n{`r){B}NIm#)J-z e QF&*3-ߜcΟ;jVX%p.TruTrT=RV痷doFJL7E{OGSoSdLbq)՞K5omZ(XJhRכ뢮T[FW\w̛(G~Y;82UjjZcIUx`Ys.\)WhwH6}cpuzwէ']T[(;giՌMjzMLh{ 5ycڭ6UcS<]|aey|ʋ~ԖٟQc$O*Tˮ S{Y܉]?QS]z>goRu_A/%g[:{AW=h_,_Ik]֊Vd<.㭣[|/Nm}uꮿ?ђr^~I>vvmv$жжW˿)╯-_qkN4=<򸋡#StOc,j.JA ȲB0h_\ |ٻ4: ] l1,O~xv+E^(r7j;{T5*:CZr^5_}'V[`,IFE8'Zz˚ s/qNx ljaP [Z@"sjOBy)pY#A $wc@"E-B- ljaP [Z@"uI;Û*cVٙ泂*M-S !ԢXl%ԯɟ主UJڷ-7V% rҏh{/*cϒcZl_vlT~[@ZhU-8u;N/ jq\+f+sϒsv/7>>G} ˏQCJ#9Zcy{~=y4IS(돔вqE:yl_v@X^վQT#Jƞ:u>oZvY|9gkߊ:g:ן]H>iN}J'8>_=#V.j;سM;gl_鄜l/e 8_v/''tJ^^jfIԎt78qM-Ψ ;.+R U:D1q~o _W}kԶ'ϘPZ1vvZ u mt=hbk\(cyryk,Rl=h G^ ZjqJ2lo &')cOmG\jn{mW#j]X_O;+CGJ?e٦mӞwPG(][rPUUkBV[ Ք+k]" c'ro8҂ ; =>󂮟M)x(8y!cZ!ɳyN}OJB-NZ&%+`X_vu7.}{ݥ"e.WZu-K%V[~kL e8wWeU1e5h66ޟ9.k8Fj+yF]P&2FNV]8Yue-ۢ7 U~ˏq3VT[v 9ܻC[QƮ-u)wv1س-h6EgYQ@L-Ψ+ww(9wN{RQ_E^eU+I**Uwÿ83DFf?x;]:k2 h7R5{YVT 9P3.:=2Q2Hո.EWZk7?"E7P]3 cS.JY@W/%). -*eWYPBȊV=UEm[?w$GeSn(OTL]P"33%9:Sc䉎Q.-V{y¬?3].c\"ŜwAPtM2lwUO1yo{+}OAϺ>mፙZ\fڻm9삚cuX֬'+:Pﳇe$Y^]g{ZWA]> :SZ|ƹfh%)Up1*_KUk˒x\^zh T7|RUt:}AY!n| jqB2UتwYzвjeʻ\Sb"UCUlYG6}dxdUL TfP@)FEجTlٳ{<%g[8WpM- ljaP [Z@"E-B- ljaP [Z@"@"E-B- ljaP [Z@"EI0<^.*d)UE-hꅾU iv0jpjq}߯#t%I&2BWwQ6RXFJM7'p:x8RR|FҮL).!Rhdiv[jRw;l%%V}#U7Rlmܞ6t@zԨV(2ǯ۲tZ;KQۋhp *[;d Y/Uְ1jVڝei5҆ZOdzդQ*^/[ua7\>.4g! 8URڱZV_[cT[vDDGG/Et_O|~KӘX=Z߫hc}X>NU%>F ZǯҥzjhkM_->R" xЧ9aGtOgY%˫9K%֚_!ɲU%K볤Qym肪Qj]Β-_@f,?Ir19G"TQ~T<V E$z59G$IFֈр#T+9QXi11p+ӑd,[S(K-/+fAEmGk?ԌQkhOL׻ɶ4RPG麪Fξ4H}zVSޯo68RDbF_ќՇCWw/HI>B#p̶ѺcWlGrdmiv{jU+ǛQ#Z)q*tc1NxաuǖSz(5雴`鍴kG9Tb9Yv>' JDH2F_vvh52x=0.+xo$v!(GfjqMu{J fP {34j߮|RJJP|#zQ=1V6i?)~|X+mU=BZ娞:*ժy+GY>ژB-NɖM}S2m(4/t-P1S76R_:FQЏ 8+ܛ K%gP\\S [Z@"E-B- lړGEyq(ړ1gE-B- ljaP [Z@ @q_^_~~mܸQѪ^USNwvJ:?X?~WڵKՠAnZ5r"ԢݫaÆiܹm[8$SgDDڴi=zW^QF1Jbݚ5k͛+V(;;|.^XRywǫZjP:jQ"{UNy@[X~Ȕ$߯%Khҥ1bx@^zi=qF7NNA-| Ν7O>Q PpM-JdذaEPǑmҴiԴiSW_}Uuڵ߿.rM2Emnh˖-6lX <jQlׯXr\Rk֬YjӦ.%''{Q6m(''Aq͛7O @)cʕ+C̤$ }tQw$i={̙#FݽX=}jEg̙JMM ho۶*VX&8Aѽ{ω'Ԥ+33$c^z%=䓊Vddƌ_~Y]YYY2d,Xn88qbcz4V %һwoEFFV\ ̒\R h^M{'`9eY뮻o|Ovvﯕ+Wk…A5׫^zPz?Jzׯ_ c=lIw9ݻHRLLf̘w}W&eddgϞwEc=4KۿըQ#!Ԣx 6hڴiھ}z%'']3g{AfQn4g)SݬC[nԩS~scB@o(K.DIII3GU޽C>Vǎ61j߾~Β{nO|xP.bŊ3f 8T|"fN<^{Mm[m+33SZPkYq]s5O>TB!PLi)2J SQ|;t(HMMȑ# /֓O>YdAQz5hР"O>ŋFdw@)FI9rr{#n$]q裏t-o+2d4iy~wSd5 }#p|&O|i۶^ǫo߾+R[.hg̘{W999 'O߮͛<҅Zgy&(dVPA7Imݦ _wkYVpB 2D&5nX5۶@DEmܸQs cǎՌ3TF$eeeiZ|y~EYbnFeddTjUM>]O?t f͚~!t"Ԣƍtm%\!Cnݺ4󚖖=z?}zP`;vl4h>@eʔ #IׯO^d1c4wbbb4sL5lPRǎ4[;hΝ5%2k,eeeZl]̖ꭷRddd@_)w)5qĠ`;i$ 4(c׫~[mڴ ]vU˖-fk}>fϞt| %2o޼8tPy<1FݺuɓCۜȑ#5zh 6,M^&Mnݺ-k,KC ϛ7/hF@#}Plԧ~jէORn0`*T};ڶgyF_}1Oxn}ÕRpO?TTBB7"8EXdIc|u릘[Ν nŋ *TмyԥK"|wPŋC@@Em޼9( e m?q+>?VvBO?J' ݻ%5i$(HbQFd]~ 7֒%K}|)XB@AEڵ+h"kڱc ۹s-[ܹB@AEeffKڿq͟?_͛7СCnTVf͊}㔔w)Z_.iԩEΌ СnmذamƍݻڷoiӦ)==E],S IDATRnp2eJX. _<֠Acٳ5` t7>{ݦiN8z=a*9@DEӰciMz봦8S9eU-ͬVJw~?__Oޥi~Q@;@EӰr4õӔW$UyQfQ~N;&g%Ile[s9mZp6G$;9KNND5R4A[HC}o2zxRx%|0x:ꞁc(JQjFo:&jt, ę7x>ISO 14e)F?MϹ_H]ֽqɲmى\ M"ԢIY-+dV=,[!o!*}oyhL- "P ,B- "P ,B- "P ,B- "P $4s꥗^Қ5k̖$)??_&Lȑ#eY]h1*z!]s5;j@-+г>[ou=CڴiL"Jy"^z%=sFf+X,^/1@E˸h]O.ˏ".\Xl#ԧO_j*͟?E:$B-ZY_W:3k^{M{nw,HZEm+ mg|$P_^O?˽ro7 B! ]'Oƍ *++͒oM^y˲)Y`iة/;ӧOׄ n:EQ9Өϒ%KjjRշ 7fbڰa:,M6q_^'O{tOLZSF˴vZ gц -h8,֚ʦM34%h\3/0KܹFꫯ%}JIIq[|gnǏoE}Z~}c\Z-ǣG /ٻwo[FGc=V~֫k׮z js_q1%{e) 5x9skX,h4Zc1$s9JJJu-e52`!ԢE|͍u7 jB222/0[q 8P/233H"Ԣ 4H|~_(??lҵkW]}4x`.!_cY222t}3`XZ@`jEIb1=s1c"Ų,ꪫg%IEEEz衇db1+''G\r9-hGhwu.EQUeY׿>@iii5zHD'x,X qjbYy͚5Kz(h'MGQeeǩwb/5{ZuΜ9/jWTVV'|mhh%%%fNW_@ݐX{r,!b=zYҘ1c4x`d]tE\z #|jm[R8@SRRo֒%K>󚝝I&iȑn@EEytYgɲ,sκ[Rm Pf  4m+[h~ "Pf3qD)55li֬Y>|RSS}!Ch̙ ")m_fFR6lؠ &$nh]t&LE{f@;™Z*|m7J8ڶm>:hh7KׯYR޽R\  m"ԢI|xa;tP]y啵+RÆ wԢIwqꫯ'lп >\Plɲ,8q |//0` {<P&aYwO?l m1bFavxMfSP ,.?F\Rl>dʕ_4 "| 7˭R,j"">[ӟjQ4Q >/ڐ );LW]uU .5NUW]QFj6m4 ˲t | ۻψZÎȤtq>;_E1G*YwJ9jgsiȡfIoo)'ћwЫU qWz{_wg'/Q7@FWn̼ɚֻDow(Hr*~y}u[\^߯?[,CԩiқO\ɖ*HvKOSh^HY?Vy!@BmGm[Um23ZR:eiKI6R=/J->r.k9m>]AV,IǞs(%)akmaTN=6zΝ4RR4L>Bկ誙z}@}h&):klL\7n8^2IJ~o7*fYgmB!Bv˚-V?$yךUtoi#u꘬U Զ#VfmKQVfXIa;5(*`6_WGSȖ$[9]ɴd܇!X%XYJE 2i6}gGc5K)ݡ#.Xm%'ي%p߾<Tgo+4C}@J2 h.#tp?)ٓԶ=}Z1B,+i:R̝)>J;VUۨsCҮh8vV2JisԪZtk;ٹxo=^Le+dK[vܪz_?ߦ *iZLm{s'Ӧ)i Eˊ͜t3{:!/$JӈÇjAh$+m:h=bT$FfP#uTy*tݶTxiJϴ=^g2GkʥPH*۰T7DwHmgf+hn8>O3O>Wu$.=Z1Bmb {Sd-:gH}.\uQ=vu85p7>Z'YQ5LV+Io>~dyX_UWLB!o~so)Gq70?IN;My_/WߓOT/ox$~o\[n{ ֶ϶%)Y۞$Ͼؒ=IՋw'IJជv3+ۧ*‰)󞹴dٖAQ,c u>+k١?#ɉEgLqq9birqUCrbs]?O91EcB'yXTU'~-![oI@gޙ3^okT_+D͟Ǝ1m4MǦs~VJJ0n?ُVWJUwZLUm'=WLm{dٲCfd,[K!,WͲmc$g|]Kv6W}k 긼h$R:OW}:;o:Tf$%iĕ/+Tu6-VP Tu)2Vo?XZ@`jEXZ@`jEXZ@`jEXZ@`jEXZ@`jUe%6:͏P `mK۶m7u6i_YԥkWXB}Qzzm۶kŪ-ljU]iBKŢQ HߵB#wWw~ F3"P ,B- "P ,N-`qG%%%ڶ}ѨFB2ӕ%˲v s5dc hs***6ꐜNԿ_v\x=7^C^k|cj{MIIv,SvVzȢX,۷KnMs5d "R:HplH-Z ߀v !gy5dgxm۷cz:omk[0ύאy.\#6B8hs15zn=אƞU kh">˶,y3sEEd.g}=3M#ƞ ,B- "P ,B- m >$ 1 QEE%I:4+VHkt\vء $ 2T;v4F8S h7 /Cf 9cfΘa6qmfYTN;ͫ4;U}lK/փ^̜wfQ;v0큈OD ?Gζ:@3L-](,,Ԕ'TIҔ'I_|cG[@_FA yK+ 紛ǜYJҕsqVɒ$KpeW^Mk/gѨYjJ=uDzcaZv^xorK.Q׮]ݯ ȑyIo1dOOr^꟒KذN߱ל7NRrjr{׀^ JI e h v3<_INLbmXL ?ۢ4VsX4M_OӬGk|^snY:[_?֮];oFѶ~S+%GSwb[`즬D>PB;_h DЦ[nWx$MGz٩MlU߂#o7kgo`oes&Vcz JW苏|fu9 O!9lNiӎ )N=h9~uר(,)v>\\#Go%69_+w*0r|BVV[gSPԮmEaa3$iԧԔ)JNNҐ!C#|X,':JVLSٞ T.4rx ,ڝٟѷL1Ltume'C}%}6F(Mھk}rWX gtӾK]oO ݬʐ:tW껥TTZ!vRgfU@v6iݲSQ+Yy5`@OuܲH}*?覯RKF RNf\Lkԩ@+P16myڧ>:oD]p8H{9͟7O'9j|1T6r~Aw~uiZj%wt mԲ_jaPU*Ρ m޸]i-m޼S;V;GgXRT[mt/]Vd|X7ih`aŊj\r I;jmف1z hW%_xDU\}P]gr6e աCsjybIZT<\vV/\Ct葹J._>B_w8\/nW hIpҤuI:$YYI)d%eh>]TR{V7Sl))SoBJE)i;>;Ȗdv־2pJ:);TmTYfGoڤ-UV+zvKWȒtsgy`>1?MwqN >9م$K!:QX+hNp)Zk׮5sNuuO.A|6.ԻԻCOW쐣l,RR~w I֥$ئE=]7=}d;H}2,IQm)\/[_퓞$JR>ݕ}6Ume*g–d)/RZK%+Yy T#9;6hlꛫ[RCjSe򻄴i]TY7ե[*ܖ}sbIvjYڼaO|HTBi(YɻߤZ) GKTS`|Aiʓ=[sBp≞#&Z^hr-GNzY-P\vrZQC*I~*.XHWTݲUunER8E_eض%'u۷\hv^gmyR8nBQm\9QJSvT}awͥ%Y<πerw"U$*Q]+%U)(My봹2O9֩8-_}m9[W{)l$ +LReeJ^ZHđ;2EBa%4JR~~&]|~j]_ߣ$;Zn;Ve"%E**SyL>ZYVh8G )Sicu<@ᤐhM sܬ"_Lכ&i`؆4k1:53[**ܯmߪVqA_WffV3 qY!%'YK6(RuǡmKWeXRd!u}^?m(JIQreʢFLe +7lJnis~S(=) 'uVCՅjUXZ.ݔu٢#'ZkjtuqPmZf$rV uuIlPIkvJ}jZRe6hߧO"+lVn,UTRlV|[n]s}+頼YJV m]JR;SBA dL%wFw.]nS-ԴV3Zc:O/>@Q)kj[u ѝhKv?***4nܱMhGNEӹ"Vi}iLRLeպxh'+*qPpNZTlN~UY5[#UA?ю;TaCWgUV+Z߬VYnw%YiꚟT-KݺT}UҋjF:E˶j{ 4j\:Ԑa YOީJ%)53O= WO C9PP;+-mKu릋&]G$iW486.]$YSӕ[#n8R˖ׇK"rBP Y[d+'eVݕZuLrۖw׶g?ɳ..qOt=q%3+ۧz.=ڏq7c<U,7͒> ԜU'[Bo6mڨ>{z?_$iFJdgϞcǚ&b IUmfϞ1cȲj׳$wmB!]ɍA9湽Jd}M-熟FU_'P))*ng?Z_gߩߋenWfϕhb k0޴0ڴ0yf @kmgjh"V: ƙZ@`jEXZ^ ?qb ItD2T()9,y$zfF=C5ھ}bqj0'ӎەnja!󜙑E"f D"*(X̌tYekx y=3{!=ß5YYY-FFu BHO5ua!>=TPmaefe{f^ύא323Z^cYmЄ疑%˲IhP(teffZx= ABhe)++2L- ":+U499]vFXZ@`jEXZ@`jEXZ@`P Y8m5zvhf3Q[ m&RY6[h,wӢ;UZ5ۨCwNӸ)d}N,`y6lI]<76jS@\.]ҘSIA} wUD5otNlP@ tA fuD*TPL ߀vs tj_4N4Ew] A};kƝfE0`?m#߿8{5.s)6I)*59dԤ.ۮP8lp8m7eiivWUMHM{[5UqXS^hgjj$@3hq$fDų7j+ MtY'qZkD +ԗc[5s1&׭hA_ӧiyrIR4tD{xuS$p)5ufUYY}i۽M6jitE+՗_Nқ~K/\67 w颣ӌfՕ}RBm]i&WQ\7_~l+ҒW]7ZO=Yw=zkabg޻5nXOd*wǵr7F.jmOru+ג?| kw[/衟OИ~Y }~ }T/&W}}SCﱖMݖYwxuYTDURr.%'!58ߧGt蔑*'rh7tm0:qo4#a'6u]r$9Rwyc4ڴkM o葧먛U'QTwQCjx[rO]INӉ'Ӹ3&Wh''#??W'>%*u|f}:q:'Oˈ$`o3q'~fhmA~)o^-j&W7%Ф"_)C] eie:d\kzq:-n\^sҵG*38yV` :@t!螻 7X+4P,Fʹs'"cN:,_ֿg[O7tDVeѿfn?HL]~1-͞|i/h闏oo]]n~QTwf/;IR=? GZ2&_Wo½~}^~ZݪHy~wꐑoCv(T/۷) wvf2ھ}ӚK " 9ήO 3!5Ĵ}V9ٹwmu~Izd}}6`f35^QZ9M6F;~ynݟO*/+}r:nM0J %SOje*vRuzVO/رcvռ֡Z}9d+=+]VIcR_ \J>W>^NHvf}:K\Vvn' 9p)Z[կb۴qNNz}^bQHknNf1Mf1z-nJ&OqnìO3@;e~Kt//_7^\]q UR8H}K>gK/?RqPգ2:םo+KZo񧞦=XlZft\MyjƟzZ1!i-s4sޮOzD7hSS49\;K9[aӮkIվ[ooof= L9eY=\yū꺍&ܡ6Q yMDq>(Ǟ|&LL٥˯E䆇ˉ:f{ޜWDUmO[.?4u,uq~vNX3yXo [ǏWȶ wua>~|~.=-Y:=RVZB(x=_vHmӢDN:@Ny+X6~ci:c}ڟϯU)ɉkUj6x̱ifӜ;)Wqz{~'ˏYvOS>=ߐF;5GG~)VErV ŗ뎛\eYuone/׏&Aʲl}b=9I 6LvQY:G`ǮKTf(X]vm:+tG=Nr:*gy+qtС߫y@w֗4"4zcJK~G]ۮtfO]wՕ͚+^ݔ畱߸x5o}זv!vus?퐤dON2t{ez\=ƍYjhzk}Xxz~fٳgkرf^_ӧ}񧞦Ǐ?ж!sѣ~=6uo HR$UHَձwC.rgj;MYpT{\Z].sz.-˲tO7[H&Ue})D5Hk u~7jR@й'fԼj.ٓk{ NB]?uDf!]ǫy%:IPsmncy,Y]9Ef/ޱniPc}ߤMݧmx@keuoo]^fܗkD$Cm}~xf'|"̵{3{bBu<ܗkͦCm}ls[- b #Z-8~Ndm\^B 7RUr(s',ٶlKYڼŕJ"CrHek:$r-IɊD"f D*lf.16^q&Z6Qj=Zsk2KUO0^7Izji~<fZ-zj7y@0 iʍ:w&ΰ[YeڤY[fF/_~+nT8k"/_f+v_zl{ oeކbZ7ܞwͱnpu\>!2?ܪh)5d^IЧ;[ަYr+!SBꟕQ=V-C `|6P8VFfwGV?efou7NdYTgeu[qo] d˒ysvƶj@PdepF  LUKVV, 湡Bӕ<0g2{b;Ժݺߓb.;IJ$"-@pX,ege-4!˲,湥yY2doo2јc)mo+ބr>!nݼܩk~} 袪sEfrxk޵3/j̞ٚZs7Ư&5l'λ dQ@1~}Sw6Ǹ~5h= M>8wڻOw{&G3yժ_^2s'OU-ZGUcuצ&e>n-ro7Z-9YZU~K<ޜ姾~hP>£#/r'<[wCvP]ֽN]#I[ZID8rOZY?#>fݺ$zxG̰O}ޚ7%n{zn(u^ȳuw ywq-I}wm;-۶$xn?jw+xa,^WGw{WMYSJYIxllԲXYYYfގyN!=m~&7Vuخ1ܺ[3Wgj Y]qT5Oϩ$'.gWZ6PR3|۪ nO}w[{jjsy޼a֥n/,57<սyY\~ux5 V˯oN;Ɯ|KUO{f-T>qn6זOw1ʚfoϞGho]5w =P[]o{?fW6ɯǚ36ݐ9~Lw>ViwhtrϦzow\֪݁ޮ/ٽ̠j&oͯGx7;k#\nhnw1cqǹɠd IDATl5vܚy9-8[ۯWTuII5sO[󎉩* ƪǸ=ݨj͘vϕ{}D{ޟ+TfUעmϣ}wۻ6k.~m?0ۏw'RC@ ~eajް쫹8cpw޺l{nǘ՛TKZĂ9;nv׎475y1uUU2Xޏyٱx?kUo9]ޞxuYդA\u3zk޳n[wǙgf߭'"qMCm<1 fNwݵۋUݺ;ީ3{Ĵ,L{;nZ uzغgݟy̞P=_p9y! n momf,7ky.9nH4ռmw߻vy']Osê{6&dyjmGsk vZm1` ޺A便yyf0u3y?޾7hQޚw|fuǛAQ]~Sjm'j޹udzvkM8f}vlU=S U[ƶ{Q ZfuoӽXteԽ̾Y7j@[ .T;Wx׷xåw zSwk~!ugjXѳ{.=wksAT_;||Ls}Z[dZATkdOts9=^?\jg9۳-AUP~Zp>qX}~d}CuM۽哹uΧv6u׫9j革8?I4Cڗr@|ðyC߇5:xf={t`VFnoPs)|WL+n0}{-\kiFCfj-}^/dUrU|-E<~(7噌su` iOCr.e=<UN'+Z(5rS {tPzCU9W\jCUmnn}zbЛ Fe߫ 9pZ= +Ó^W{Ok̿+IO^١:{Zu}ExPY^8??-Js{INz_^}2`oQc]֖V~pʧִɓ{9vs CkWUщ{4uݨ~gtg缞9,8:[&'3֕=v:ی,{tȫ>~z'Z hoXc?Y紦9Jj Q[!{}ړG<<#r^󼯹g&hƚ=\kԫvPbX=k_C->r[ֈ;4_<^K{-sA5xoƚz{\UXN׿gCyMUOzD;_Yޙ=^W=U}sfPmtxm}c|=~jZ|M>Y}zyUOշ}zq< V uUo5[(5]}_i[ig!-W͇r5}kZɅ^]=<ߪ߭35i{g5WU9vkkk9]ƫ->xrauZu?z5\yLKVzwj=>oZT3S\U=zkXӁPy>¤57ZzjF1c|8kŞx*}ﱯʷWׇ^MmZ@7k=z~7!k5ʵ^-{=UNcz35^s|ﱯ˜="]5ikjZ5QFu a^bzZ4u\ڒ}Z*籮U^xR\릪}@`=k>{kq^Ohtj}ek|5{ZW߫*_Rֲ I3UEÞ[yW=:zgh}C}=U&9ϞﭪUY?YS }O>6{9[So[P[|2nќ֪[DZk]ȭZ+UӞ*qkr{^ ̝{zfD5i]}Zuxőovdp>\VT}M?ZU%+gLbs'Ɐ'VUOoUUWgWqZwW|M<Μ}UU9##\D;CX*9+UgoZV>_3xl{{N"-HWN.בq3G^oe곎s)m:~uwE~g b+3;7]GΞ]#ٞ{W[κ>g p:rx{;z~Ƒ8r929;k=0XϺgֳ_opwž~zOtzgsw|Oq;=uϥ~0u^UUsW=6tax{ zKAU?ϫ^U{< qh|t_ ol!g WCq|`h=A~TIENDB`kraft-1.2.2/manual/images/nl/000077500000000000000000000000001467704360200157675ustar00rootroot00000000000000kraft-1.2.2/manual/images/nl/acceptance_o_o_context.png000066400000000000000000005156031467704360200231750ustar00rootroot00000000000000PNG  IHDRU(  pHYs+ IDATx^wxْ $ "R(H+(TwU굁 bkÎ(W(@TDl H3@oɆ& <>d9;3{vwΙYC0"""""""K,ZVbLAYDDDDDD$He8ĂmiȐ!藈T1dȐ:H檏Ze sέ\DDDDDDvo:u6(o$@WW:7W^]m޲ :.8W~KsMႂEDDDDDDM2@YN ujr bCr,N:ŪDDDDDDD6jܹ$''{8couxӠBI{LJN|HaѨ庮l&333kq:q4CضmX˲,ձJ_J"R)+huZh&K.m3#&>TDDDDDDZNi(˲BƘmN4u`0c\qVZy999DQ8쳙2eJ⢀MLޘtb18U0e8>`: s*v'g:|\ǩT.""""""1LZW?1`[h4Z]5>ⷑ8C Ѽw!ɍ]"%%'iU6)6&Zŀ\׵<3>": BSޔ>Gyc\5eFr) XVN_FzR>`/qFx9笾Xśc""""""˲,cLlwpM6+(B *T04ʆ+uJ5*Ͽ%/tȟ"9)Z9gG!"0X.vJmj㜳rgaYx}e)rP7E$$QLa""Skۦ5y$VбC{‘(Zc 뚤$.+_'4Q#[а} 8ƵJ((^IQIp>h‚\hzb8n{}ٲ/l6SeEDDʿYTqAz:O<|gzw럌|Mq5|9}nI-ԛ.wXW.wy^&f(DŽaS>mLٞ$%%F ` Q{:S<"n>Jط.t4 h(ek)gXGOa1ƘedYIIAf~#cOܢ}NrR1oNσ3N=?fɟ˶h""shlLmGe7kN }̚37E͛ඛeOT,kN >&_LyȨs˨VAyK 4r&l̮dv(ƟbJ_ $e@FpY6eI9aS>s#_em9gV o;7ypH]| Z~_QoWh_̛.G_f߸ػ~fϙc#M˰,+et?u̅QooEDv#{?KFeoj}pXbUtٿ#w`j\omyQL([Fjiue8ƶmb?FF@\ vs5AJ,n=7UnjӪLs{1{8*'n?ʨJ˲ywx*p&0$'%=wqTØ2kyQF77ytܷ=N)Ӿu]dFccdT:ˉ֖y8ko`j\χ8Ov 5ڲGB&\h Yf͙Þ$W*WHmᴓN` p4oc D"0yD" w5my\-y^yRtďƟl-gcZ9Ӈq#|U풽Ya- ʳ")p#eGb2-~+[>oW1}ǭ|T<TWO3)3k\>D^l+pGk=k\(-Q>Ql[e(۶]9Pvd=%=LMH25юЯR2#_;-߇O)\aUI]'?3ypUWO?7F- -55`0@JJ2h${SO@""{5g.s_dXTcH7_QcXt5=Z,$(o c ö&ERª,,Ha#7me'ᇟʦxO*""͍3Kr}(,,➻ncwsygٔ/Uz3:²0k: JlԺmꭑW?d3w\zjj*e˖fժUvRRmumN+qdS9yD:YiއJ6oŊ\Ұ˙#<;qn:z^kNm];`OQhhBoSV 8 _]XDIgN:&ħR*߈eP|ݼ\za#F|UpAd~ޣ+']grѬcb2^^C}^| h^n|zzdٕ+3 (t8ʀ7 p[9u}yi&,܃fdjp 8|kS&FNURvt𾩴YoWWxmkQHՈrl^8&99ٸ[wRRVi,,2vӑ[^LJopKs(v?}o<csVcN̡Wdۯ@%.g+PzGtF/#Ѹg7AW^(s;«HkVT7bV_nx(cy=֗?p8^?=x;#)ţYC[1|2 Tv4Wacm0#NY0Znbn|}>(Scx~9aF04a2!'xy;ӇbxO!o {NwT}k͜Ox_?6}83{n9FOȘ3?z_=V_n~|*Z|gg+p*zTOǜnyė{R&rVi,""""d8%Zeһqќv4zNor~ᣏWqh~t Kmivc/X-ęXBIydcX_۶˂~OT?v)5k(}ɶqʹGW_JKzhK{,i;sօ$#?gq(i[[GÌt")I_8BoHu\pj&~ <>|=/7O#-d v^ޫ9)>?YSR{"sL:nI?@ѻL<9~׀}{F嬈սVu΢DZO|R>d!כ=mگ'{Inv$Ӂ_&NfSO^˯es}hNjljø7>{Gޗ+a'&xaZz=ܜi)y5|NhٛsOhCMRcUi|N=O>֗F/+3o37-zsfHHmuO_|OAuEDDDDvze/0_ &_npFV3޳J'D$x]C wT{@Q.4&lEsfo3uA.Q]P΋5jlWzl,p]\IbrFڿ VlM&M2X,'f}CZeMݤa22i ՖNaz4t0Xzx].طl&̬#2Ʋ\'qjڛ;?{pQSgq[ M"X5݃ukȋ&7BVs؛ !xqGEFZ咻zKxytZI#Ml[3}?G^qחMJl1LF48c$_Gڊ<6e;#_ogi(n F maHQ0sY􆤗F^H*+s )&Ͷf@ko'Ӹ59=[DXj(R׳:׉_P\oA7u )?`LEa ]NGϠIƲ<0>#`dslda 4ʄosXGQNEidYC?W,ߔ>~^G@Oe/!q#]Ψb,+9)pJ]TiMv#2791@5g3t24)? _)&|ߘp/o y@ \VZ n"""";S9.ةjݚ'/r+^ɂ%yx1%Qi!l[D:4*ϧ!gUwzd;o"`!7m4-Y3FsߍCKWIz|c+!Jymz#>f_[2^{ׄk-%5d4ߓY\Q>5R%n?*:D=^| &BYYj$V-chxg?2q9,^b9yy79+YmYLM4׍9f3z#Ox{W\^N9|6~z,%qqd*WߪIƘ Y9o'ŮGɒ21=&}LDDDDvyDҚﲮ-Η O2XZk7[7p;t|OϛT=;8gpi_~zvK') }֋_Tޒ1\l58+o?n)9DnJnə]ļnǍnA#a9Ks8Mՙ?˅O.bӘɭ'6Ů&laC 1s5W6M6fV ,u)))H$,J}+Շa>4 Y0r9g3/6LkУG=@ XUk;Bě3g7p5gϣ3=~oKtڵR?6K=Gr!yN9<wU%]@Æ 5kWpO?1/h۶Gt?Vjә6m?#vX[?M2H$]w>'N.]mS[pyX~=ۏ`RBD~m.fNGEDDDDdSlmUmch߾LqPޣ;<`mɠA믿P %Vm?╔,ߞBpRr2xWm`Y;+'68sl<,mtV믾6,mNm.4h([ aĉ<g\wݵ|3}z6oˋȎe 6䢋/f/W^u]/^}Un8ʨkmu֍=z_25<#8<`m1v&}2x7vLq˸qXt)s,gyVmGl=={og̠gϣ_巻8<ܳw}r =ɓ'>苈Ȏa >\p曼m׮N筷ܢ^w;mwua=8@YpnLKh<̟ςy;o.wqVe4^M^|nNƏ}Q_?`W\+ai"""""m u](ݺPQ>c7c$$%%q'o܎avGAAO N֭yg^jj2F'k####i~?ۇ믿og̠w^ <CRTX°anu@].=(wV[/" {Psq 'D{کU~BaÆZhQ>Uܫ+˗Fо=p@^N6o,?e˖IP6Ɣ]ԫ}{Ǝ?ǽ]w P1|WDDDDDdװyfyk׮%77qp]\rssԺ… t+Wqے%K(..΃mWcYV(7L޽hUzW_e1@ UWg)у=z0y@[DDDDDvNĈnE߾\s͵y]DΪU^X8trEEdg2AjC=8ҥKbV?wB!AcׯSF֭=F3~lb sOHIIx^vܵ[W;p\fy|Э^CeY~8~]/^_UQӠA:wXMKJJ*&|竳D x𡇸袋krӍ72q\uUնTSK/KiժUb3MASN夓N`};8cƎjRRRB$ 'OM;f W\q9s. VgjUV$%%?0w7dd4hho%;+`0-[UnX ) []vI 8emՆ{=l]BAďƂmՎnK`ʒ%K+ݠAgJeJ=hժ> `rRR2n*Ğ1sw}td(ۆ6mкu*'bbٷo_w.]xGt렊I<#tڵN^D0\Xٳgbr =NBDDDDDv>;ePݻ7faѢEDJ|>?[&l2vU]d yyk;<c 9̳XxQneVilO>7N1A:tXU dZJM âKHMM2-cHMMcNU@mڞ,ˢe˖"""""ir̎vlȎ~EDDDDDDvR """""""qEDDDDDD((QP]ݺU\ 9om`,"""""";EDDDDDDvT """""""qEDDDDDD((QP,""""""GAYDDDDDD$He8 """""""qEDDDDDD _+WתUX%0۶n҄=hXp]kD""R~?7>m,Kɡ(Jd`!55MajVdbղ BE_iN8[njpvm%Vׯg<:kKZZZbNX$RB-Y M ʫVa7I>R3m$'gh_ܵtvBȶ g}駟JDv+srЮ-U"4Zlɂ~ߦAycs]ݖ .x^bN!($l`P;nhIiiimM2N9(""""""mEDDDDDDv` """""""qżvvQ'ʬYrnO\9(+ZI8+lOJeg+#YrED[VΪU|>e2oz Nh%""""""ۊ^oy5m~-_xWg8/>lHl9M8~mI>^xVayNg?q ѭup{qrQ"""R[kFEd5Xhxmd(Y'\+X3Wq7̷XY/׮$b[=<2㹙bN"<.S*:^k^HkVlp.";ΛDUCrkϽ0֖ǚ ae^[K<"3I IJ,|9$1di03.zz^vfH{6h](T(" &W9mDDj#.&Mo^7gce|.5,o?PP(M7e]F.]<3F^̣^~0G7-2Ǖ7_Aeo֥7ĤwaQC~'qlfEv>G/ߏeY[u31R ˻Li/#t?12If8x;c9}(O|Gb~w)>orϾ78ouAú78OO߼ݕ|2r s ]'+FHsÌ` /]dBNʫaxxl4ǽʐ1hrQ|8q/Ў_JX0n~a| 6p<w\qK'06D5 #/gt+|; 9p1/< 7i@JsKI4pFOw` ̠Sy`^mF^}mP`0e]O<ٳ<\z$%%%V/Ȍ 8}4r|yxe<8#=W>Ý/͡4~'հ[y: XۧUw?~?e ^ԃ;Gq/1o&!M!((oDQqQb 6L,WqX9sg9/-N3$|0ZQ|K;ξpHԼ7}p6g"={sމmhI(t [1~eN?Gpjߩ9*{}9Y's-I>tz7&{\S# 9etu6'u.I_tmߐ$ &~ &M#pӵ )4ٛL_@&8";#Ywogg3g >c?I9Yz}ati РY_Of+]0emۂu[ !uܙkJXs@nu QD5ذ9iJ/‹㣏Wqh~tmǗچNi_^Ɣxx13ibc(?}o@ߐ@ߧ1}SqʹGW_JKzhKk%CZ/p{6kƊ++viؕkY!-a~nqY5de%W1喍6;9~dty*&zx1XF4b<7aZa|!Z 3>`ѩ.^x|.ط䭏Ҥ[S{ʢIc-"wmq&@ӦX<-$7/Jv=6נJ4df\lCzc=s]SsJ,f6)g{'ۓ1RXk,K!YDꟻIc΁7|,|kj~"<'ULlf

    ɷ ;2$Y4H?m8KeTٷVWe7K[;ƙ k-+",Ӱ}qɋ[10)7;(JKd:k/OgelZV<9z\X~ rI~?VCٯL>f_&zF/ޯwX)p XP숊]c%5&b17c%7D]Q@pǡ@0A%:r;;{vgvg;8!*d9vh]b#v%mGvm*>dş4M(7X>|8 %IsXڼ,n*ٌlCuf+p}qo+P{~t]!t Z9%\ͿO@ATTDD)>W IDATd,£Pu:[*O97tKڶJt;2F,9Ȟe!e=oM 5g/SA]ᡏ>^7kfz{ jT#Y^b0֝ӢXqs i&.D&u//\n \79?ZW'?47Ϗ1c0yssEN奟C5CI. G>^x{WM'[O3&*v}ghxtδ׻JA[$f9r[.FON7_o&-s/>IY<@BI9Lq_^^B\j?Oth2_%ΨϞ.D>È7$Q"節#F$*W.ѨKOOWTU5,pU]4OM|F-Z_{`iJ!,sl}s͚നxSRS5g/_.'60a姪n%KNXC=B%76y_ MG Ş^Si4Ն7mƍDFFϥ64}MCpy]9 <%}d|9nO99[T/}r-Trcvfu6k*ݟmrޯNCUs' 6nH6mJp$I*(C;X]Ӿ {WM/lwmRD={h){i6mQ1qD^={ ! !RUUM 9##â(]56ɓ﯅i#F$!{o|wH4M7qYR R (\? O/@(rw+<CK8.!PDIT\ eU|!w_?#w6;/_6]_N(N$IYamׂ]^p]E%ImuEWj"BdTU-WM8w[6?$I$I$Io@6o f,1 8wy$I$I$I@6 <Ur$I$I$I$C2PtБ?͚}ssCJ$I$I$9m& 88xD4߼,I$I$5$ݭ&rQQoa  fF,In"ق`p,ItGss3$Vėfn(KR yzs jԨ(/%V0͜8qOwY$Iw  Z,Kw4Pn&(KR UTsϱwflInш'+V!JtWX +zt'BF``^γo*(KR y{{# 3 <[@W$I˫@p oJҭ#eI*!!x{{;ϒ$I$I)dp,IG G$I$I$I %I$I$I$Ɂ|ƬXd1γoĽv$I$I$I K =gv 𔚖Ɯs SǎI$I$I[Lʥ &&UU'c/f;v@j~{<$I$"}$4n|K:e\ ;OnFÝ'I$I$ݑnž$I Kώ];sӳGOq, I$I$In7(/// :DzzNhz8ϒ$I$I$In($I$I$I K p%I$I$Id,I3D%Z_ܒ$I$Ilr kI*:A`=Bt{@2PʜqV\Uy*nwʞأTYTYY%ˣl9{Ye,n-nn\QBjq,F3[y$6EeZq- e\J,V+"=#y ˠ{&*S TuֲۚI<MG"ˣl!IRipZXMǭ:ܽX)JMMe'ƿΦjժxCg2m,{%I$I$Ij{)g݈C7⥋æPU_$MA$I$I$Ir8B_(iI$I$I$@4hyҿְaûn I$I$I@ʥCz"W;WWc,4,i[kՇRⷖ9m,!t](_5FC18'.?j;Fj<ΤfA4ĵ,]ul*UaNuֶiX=Ңu QAZ& k } @%Yj: I(ݕd\jժ(nThJ4/]|]Bܽ4N{T6j I ?C]k3lɢ T4pryT1V!\~7_nXche mGNqxN b:PWtB)̝qi0>N4 !̻[\xx&[/5-}noA NLW1 VMOy/*UZ{wœoTC퍉F]yv/2hC&p1a_^31doi^Bd6@  +'llc_=؍SQT.-|7 /Sͥ哾3~wiIw4yۛƍs׮ٱk'*JZWv}A̞7BDMt+i8I-_IfP쏹.hIm[ω+ۛz9;ifvj/٫{J|: &!z9իZK~>+ hC9Je]k<ˆ׋Z{l$bpFmZ6`V*}3]а=-W3W8uR#"2@*;\٨.˶rh5RqvNYPmǷn%^*W8$6S$k929k1b/mBhdNGjQN^%0ԅlqdfb#X'ky<vA6/8t ٿE]?΅6ܫ6yz@KǪypoϬf4|?@fkT̼!rѴ߱Idٺ3 *كJ-sr(4ײ\ "i\ʩLLsǐO} 5$q3qI >ڰ9N6' aト)MXw̃}ꭠ@C=Ѣ" 95C0"ïpZfTIPv% vǔp'Ԥ&eb ^Rњ0}l8X(w$ 俟US8B"7%0nkGױ}W.uX5~?WYO}&zj6l@V׳+&4]95mOxul._ǮtB6snB+qmŔdGi_771` ͌kۙO/?jz:%\9B/ jӨ}zRbރJLNDL*/eddr/ HbӐcq4Iy i1?+'qZDB5lߗH);S\NqnO$9Dhs1G洌O!Z,;Dvף [~FS'abv+" HԺ,ٙ%` 3Xt{:z &"P/hHg*99;uH!JF* ~R?Ğ{Z4MԩS$&&:{ޛ݃xdkhz}ע{HS?D~apm&| ?2{fObg͖5W1SJlzGu@=r:_?zQ):t6}ۃc>̢^gVL2 h3g畯_=H7=9 87I߹x[9*VO`mJ]7A{_Òm?[_ұƅ^J@xV.OfCwl[NPڃq[ɨ+Nhil%\XTuŔew ˚Je,]?Wv$}rN"[385y0v9jjSQjN&;.(llD3YCG| T ՌE¶W/ywGU!~r.Ci>feF=Mض$tC=?e3qFWuj]">LPNVL&{-32t08gɖtq?ʮ+b@"R2fvTy f>}%ĶΒ׃m<^~&Rl/DؓNZr&: UcޒyGfT}>n=)*tAA4s"W0!?IVFfk|ovX{ :Ə_04ӢJ:ƽws3W-̞R_Hڮa!vö@cn6;ϜezKTZ2F==mb2`fA SaD.,Njrz Ec]7N̜3V45k`,Be;P?gZ6>/R;gM?I+CcTq^bMemj\{,ܹyu{Dx,OGջbԲ1O̖&F@;wrMbmˢ{>7Pv~1[mZ2~zr;2r|5`݄e$fjXe#d5MRg$ѥ٠@9S$*3u;l Bz ;=Fڧ`? _4BQ-[W F胚ѰKQWjϷ 2}W&yAvckl+;y[0a]}f K[ÚH-4g|MŽCx; Km6,yV/j?;d츷ivqsKFu0?S*M{Cۨ ;z5gһs58 h]8MMWsV0~Ot"vx6_p_ccu_|;,c|f-IZa{[ &Q:8ebF-pǮihM"wJU~:/3ΓSE᫝>1&Ogh'Gt+_' Vo匛 je;k[.Y5{+?匛;ulX1Ӵ Μvûu|--qӾKUuM#iț4j,~[Oc;?#0z N~dbƧ׼|etb?L[sF1V2aT} :>]^lj_sopq. oJ}GٻVUv|3/۰ɱ 7D9-o }')3yg@M 5?NSO%>%YzBP__5sdnT}s Qx?G9֊7ԃ&.c쩮ɣ|JLh"%{>)cbh_YɄy~`e5g-v&Sŵ|5gc~}ڶ,KaC~u*pLdꮦ]eۏo3``gjFULZZ椰nlbE 6Ӈx]@O^~~ekjR>i+>MHMy}Z{*gsrޜ%+PD6tT"}6q0a[ٿn;?Soʏ 0i4*\ٰ/KΧlɊ`#XYE*H2~Z~I;< (ZՏ #yn05]s>߾z..jCg{h?O ATke!C`_~-W?C`4 0Zr@JӰF+[M5};I:(uzҫU%\VE*>"ޕTЩ^K+*кz?B+K-3OeFzr=#ؗ XD=+S'^' B:xx7X8sK:)]#nIXty LUE. CZ1rOj/uN2-ز.[`G6av.06s(G9݇0 ҷrt6 G %Je+"@6ޤ [DRϔ-;8{)" P*G^ޅ SIK.XPP{zN&ݝꤑm;hңOe թ[+Ьd^!po8sa>4ѕ@3ڷ| TהXͶLB%+# r#y_Ŭ|Ԍ4PPt(:CS9:a1ԩ.yBC|Y6%ځ>ݱ4z=.w/JM4)!Q,`ݨupq<شtN8S~FUтYZTrCo'~:5RRmNXFh ^,5UN{0'rK異gl8^#r)f:\.}2z7:vEaɲn)Pm)$]FO2Gn&[xҨkYzP3{]C}4Gh8 IDATZ EeX^±k:2 ncyX~:5a"^NF=%V+b.T ;R2]Fz%fVo8(2BŬ\>גHV}}Fqp4+6Uuꆫ4E0btRH~%MoK'3KCK˚'k at5/?ŒKh[VA)o$R& 9>_{^_T*uc i Fݩi90sPpu3`ƜEf -J׻`ЬeGtTmً;=n7LFvOTӨ >nr}--l -:a\d]|g_auq27<<]Ҳ[޾b0 pwhJ DF7%~? }l<|0H 23w wWb.E.*!(9w𧼿) u,>P>1Jt|ҏ_"gE"Q#sIB7SٓOǏ~f~x)@,>p~Gn'^cM-=ihLdƄ؜ؙi 0RI#ܣb `"6"7M$Jr}QE/rc&n?ѰcZaokR^Ó;0پ-fŀFV]:|.Q$}uW 5g!ӦD&L=DG@B#ܛ?@X9-F]hOeؘRޢAXx!ސ~0цƋ*<&ynL ;k[z'WY1jREbEˊa}X4/&|m D/A?A26 sgͬpU*FTNdc\4 WT 膫W2XF,Tg-:_U_E_>&kgʯ\#}uGW:f+_(P6r {LN=ɻjWcԟr6Y`éǣP557?wman!PP['ma,YD5֏~o_@G?!𿰊%LgtxN1/?ߋX>c:Z(艛E\|ޤsơ?c X"Qo,%:*7GŔm1EKBWٯ;53&5 1g]y=}y j=k#%;M2B;Vxko>L}86͝5U M4/gRAӪ]etOq|SG9u c0a :OGѼ9vً̟9x͟*Wa =[4'gB+УBi^^Jo5,c:`to=8F>72zSӲ|MЦW+gĊ |/ЪB;fOb zf}!m,;sgl1 o^Mbվta_1qz9/= ;<ÀvQ&ٷ!qIs8kJ_oNڬ]3XtW-N^_[PhԦ.z!05jMIAiVܨ*n#ѬbKQ_3ǯ0j"^t W$8cKMcjszAokN̋){?Ip%SX\=+?KmWwݛȧ#؅YL6ɦb "0tU8&gnԛ!v2~>;D/Y2~q3c ƒ\yuu[8;ϑAYVOϾޤ >ųco_bCJK`? zjfo`ڗ1{}g^5Ljjvc:;soך  c6c@űnLv@I<LWVٮFĚe|91Bӡ^4*4`$[q@6b=)ᘡ4W )TŜmAolfDIqqs]..8c^V넽k-!_E iSڱB04\<”J!*˙c֕HI[Ez[qUj:e0EQ,l'O<==5-,,L1b$Gv- !D1I M~2b-/ hzَN -[vyA )ߐpP9Ιg}.Ưa)8tERʢ" V:/8*I,l6Pg$r>6쓋ɯ YPvVA=#Qv\֙sX6NY9mQPE=Rv|| èANr}Z!aϝljnLhJx.w(;^q˪`Pϭ#jE,WªP\6_{M$I'eI^Dvϝ wΐAu1\iKKK,> ~O0KBnFN)FXܸ=i>]yƒfKP1!nQ;ٰoٸoߙ`YbNśҥfaI$I7 %Ik <[#N"p;r%?Oߐcǂt&my$b뎳rF|۞)UbE$I[Eʒ$㒒t(G4oK$I-QV^$I$I$I2Aʒ$I$I$I@ʒ$I$I$I@ʒ$I$I$I@%IW\wqr\|yt([|(Cdy-<~=!qRdHn;0PV0Y>x=.>Uq Amy9MAP;gs$I$I*+2$T<妺e@SQ"{39wc__YI_jSKX8'Fsu !πH$I$ITܙ2PPt: j-4,`fkIH=0fs 1ͽ2C6['ԃә5q1IX݂h(e?45 (F|Bqo@9ܗ~@GqB&=L䱏xkm,=uauD^1OC<Uo0bg#zynf\vbs<9>*oN%ʨgaƉѯj|ё% ҅XǏ'?$լZ!C9upRw*cX'$I$I$Iv"節#F$*W.ѨKOOWTU5,pU]4OM|F-Z_{`iJ!,]έPk`((%k*Pt ;w}jH t  MUA'g-ToM `t[qXGվf_N 4ы,_]I$I$I$I}]pc ݫgo!U!D@`0gddXEfﯞz e? @!s&fNWt:P  -B!v*oF 4?I*+lt7ds0O$InFʂ4ylgԇutۭ(uYHtܙtg]ayoZhN{Խ\+ˌ[/o=Jvhс |/>{Z彏dhfnO]DD#p4ݾdfj~}IztjKmh <[ڒn*I+>{ZРiz:㖛tmyꥇh#OUSI>0/^D6iظ9 {ȩ8ˏgڋ;X[/Ki 8·r}^KǘxM#suu{[W., Q2=ǁ ~>i֢ ɔO朇}sp`)|}ن:Yt237H5>טRAC7/+8᜸?a0aa9Acv|'φ3f%|"Ҭ#??yᅾtlKb0OL[ܺrDMynޔF9wZqa<#-i &ǤϏ O@ӈuS坯nzѶUK"ۓ(.;7cI#>2OˈgW'>M-Ic3zW\K.YǶՓ>[Yxxsbc, ye)uG%j6Nݘ/xoqmiXgl:!ޤA4EWޮ (ŎN/ҫ^B ==g~n d>ϳO3sfΙ;3}֮YgD3W^0+57&@8^}PufH7Np{xelu1?Ly;;)=pOY6FfgY8,fO1SWb̼0/;9ۘ='D}߽M.,뭾|gD]0-.Lg -X nQo*K&_{C ϺyKt.of?\ʀ {e?o=&~Nn?E/c#nɏa_@Ob3f6nd{I}{bϱH~X˾yys5C`ޝu. IDAT# s?r/싡%$~hY/,0Ifs5\o[NRMl9^#u6?~`|~#_cUD:P,76[6˔n|>y׳e<`#^+E1PV\6# llbt}]%ɩ\ۗ*B`2iy3]I} ԩ<;ɼ\ N潑Cեm;憗WmHg0t1_J]7M*QToڅM|kwuS pMXJgՔaLZz5HCxnQV(o^]K^z{?-|P̣3DŽntқG~\ Hw~w [t9Wb]ϴлGw:u͠{^eqjГJfn"_}9SnuxwP1G!-0~thۖ˻^͘y!1;m/߀~bQysvÃ3ORH04mU^m  F/^X ෍Eʺ搲~ct QZEz|,^(R=;%r:u\&^S{Y!ϱ1X̘o>u9Wu?W5 X*ӱksl{P"@Yg-wDmZ6,yԷd i Ʊ#$WO@Pa-2X_K~7ЦbKK(%o 3ŬZ)w1ÍGʴ1ﻉOG2,f"̎z-2g 3W&0`p#B)E ,ae.ggӋ:,'IN:^}*5sMqIRpf~;, NމL|#BHߍ7[>}myUlZ3{a&;8ú/,[ů^7_d*6߃o3U_2Wx-Yz׭eX䍚ZezkC~Kxz77X;z)MGDmq+7#b^d3ՠQ]CR|2sێץu~NuLd=U%. %c̚o x[[1+/Ϋİ{ WnKSrRtƗ}g]<9ao[\߭mks!4nV^u[c3[ض'R8vTjof3/`C:`$-cvg9X1멲v+τ臗Psxl8jPzR|ǝhـk+w+eN@bŐMfd2|{ei]56Uz MhohIhVэtEmblf, ӥ""8lD:*Ӥa,BPvu1krhj4GŠh Լ Lq=iY|@6FzlO^)]o{݈AKg 2%p:p3'g.& ZX1I\ynl!4.,;|G`IO:w@ǁO0'F mqS 3qbb.T0)<m!7W {f0*:Ƨ|/Det&f.ʖ6Φ ڂ~x%Rr?SyD|˕JD|<\[ m|6k/#b&J]j Ԑ)sx:]FuN(fJ 5">-W.)mytph1‚Y3vB'YԷ|p\w [ڐPVFA"&^lJA6~TwQ9o7M}cTNp._3*._p`r \O3~t%8a'?6 ]D$g"v85QY}7{gKc71Ҿ^ΤeNZV< -Z%$zؗ$3]1i[?,di7Br; $ ;*U-Z18, I3_d@TJlύq7+hC lHD$N9;nҳo_H%RX8{_o ̲4+iu |Y.ɾG0|e=4"v+G%G{5a|O^Ap {ϧlG>ʆ&1X:G(ʣXp1!}qu~jn7namX:. NWp :yIyiA>#NN_g{MhL&,D]5qӹ#B?Шg0C2U4&Z;OXO=i*PBѼ8bI=bN Be}m.K,a%,_ S\hUжzKO~PChPʠ`c% Zٜ9&~d&?1g=LJ3>9y[5:4~Y$fHIݞw~/bʪ"xaKec70Sq7;X[1tMTY.f%u19jקVˊ ҖaeWӿf+ KqƙtMOQUC|7"v8!4L&3z\yZ̦]og1k]fM Tio"#6*&D"2&<}&73ݥd_GL^gB^ֳ3ۈؙf% xqȴVڏGWe/{4V!q1b%.Wn˭uLZrT[MnГ1;Pڥ(BYe Ӌg+2<cӨݰ#C $AB}oG>ǑO0}@jXbp*mWb(q㋑Ud*n\N'.@Wxpo\DnortUm  %{Jƨr:qI޼dz0@%6n$( *dGYw2 JMu0nWNK( ҭB1eS@z28|49FllM"L2/}GK~POfOW?-|wgeO)RYvn?߽w3אT"┲זf\/@z;FO`xa';hмfSY%/Ñ8K& =gH0YӘ:1>w5GR[,9#e릍cҜx$wۧ<;vʲ1Ԍ>ȪG\/Yuem<{\Cs{=x[HY?Lp>.keY6Ne]~ǧOo9c~<ՙ\;76Ncf2ѺO嫟لŦdՋj'yC?1ؐn {\^^W~]g9K{`>c+ -ru+ʶt9}ܓ+ wWǡA_䝼Luѣ>d+:9׫*Ծe?a:ѝMUI5>6o>fʏFnh}?Bz1Jxj_"ZobIV*7ybկ%ȚԌ9_S~eIPcיּdtL\KFޫhY~((bghwM 2<OyVv7"jWWn}ȏ]!{l00:Y`RٶbG U*g,fW 檣OqOGK.|IL kq\7&u#e \se*G="WVyЀO ;d ~{C؈ْcbX,iK^w71S@FSnKyox͋M %Oߴ#IטsKk0쁵Lv-pҜ_㟢NUZs7ryR cF\\.9bύqW$?Zy),<t^TX"}N`IK>)Zun<'ƍe@TQ<>D{&}G {1̷Jj5J-K?'2Gl0Rf8ƽW}X'z!1$5tV#ys}+|XFGGD٬Y39~b9QV\ yφhL,дLezLaopJ:(zZ M ;r(jʎsKn爽kDco٘ЊŮ#@m(e]7VFs9MQ½P=SK)rJ̯Ii^FBP((P(2_ʛo47]ɣz^ BP(.LPV( E࣮O Ӵ* BP\ (P(9Ǵ[BP(K BP( B((P( BP( EJ(+ BP( B}r2ߡYP( BP(u,B"ew+ şB + "PV(·~sφ)J+ EH<* ˇ$). PV\@AbBqQPPijBP(zPV(u8+ E8\2% B eB_ ?VP(,eٜs}SYP(. Px^,YŠ+8q'Cx<:GXd EM0B8 Д~2+ ť=z4DJ:FJIRR3f ;;[e%ùss^I ŹK:7R!TbYP(.RP>RJ&MĤI|aa0|pN٬.{2JLGP(RBm)QIJBP\(5vLĉ|Q }ˊEr)% &.%^P(0!+%ۖ-ӑ\`VbYP(.>+;v0nܸHgYeɡARPJ/ 4 ߎAaBeIJ,+ ERae/xƒiܸ15d2G7)))lܸDQBy% %2c) ϧ 0#lP ؙ@,ZJVJ,+ ŃR`pY.\X3>rH&LD2̙3:thXV\ԖčGpIz[clޓK'$:;E(iEh̼e97( (龐$D4/E"\Y |S=ܤޜɌ6ʲ?#In3f$|C--R%BJt5dGRDu9EVK IDAT:`?W5q*?YkhDڸq :naehհip&͌.C0qKd25MhQ/' ⧼´e=@YEyksmgh}bI@%V`e6;yΔBInm`KRӎĄno],_q"PB(<͐4R렍4b9pLdx@9˂(&%YN[N |0fX>njF<|N~7򙗎%#\MonAx t7t1qWe2%MbѺa6"o UVan.ega7 x{O`t3;-" /÷1C"FUJ@zt~{U)1I3=| ^). ʧ:ÃTB~) 0}}.{\GGqwv&o,X3N4ѵE4#ZM4qmHg/Qv"(CP/AKɷZ}4xl0kLxI U֑[ W_%[{8탪l"lF*94\9>|/AXU->d|@rEDo(iY (+LO1HOR[c]M5'N,#?ƈܔХQ9#]jtnM<ۋ+;q6 [DrF7!u{quej,pQCJfj9٘/iRSrp&1ȷhS t87;R% UoaylM>~ٖ#ܜG`H4<44fD36z\RO#y/GB?xbb>F2*mJs+hq`SOxl͘>ޯ#6Frj{&cOI*Ո䵶$e#&ZDKmlId|/tάL; 6$ai4:4a\+{׹9yQ]@M9T][$7jԈ 3 ?\e2s?~dg{rp] D 0'G!t֦xF+]2ͷ쌮nfF>ˊ4^&LBǝfFVPISmi' EC/uk.}(tpm"~T'N0QA."jii\19norl5sS ̺#G6c铙HnL^9!1/:_ѬS*54s=/9ixE6:J#ig]gO>U-7|rme3&IrzHqJHŌ-n߂z5"z6e'ߝ6RvɆ#:V=.ֹU#y xKc&ƶ9/Dy~ 74o 㨓IY=By9Ǔ,:]'BIq֫KY> =ЄMOǐS)<*{Du}J, hfVlCnw/6ΫvФ=D%ffï9uM$rD.1jL)8E! x>UO T8 g_tdBf 9 IQehP<{BMj;MƄ߁'9: v;ɱtx:]gK }UP!&{QVc@D)$ǜ@z=k)ǞFr~m/$΂ ̵0@iQX.EzY&y 1Fy,6q+4Kdc@ж%C]17;w:@X?3tf vjm$᮵^-fniCUF/7POK%!"l<}ܽyBk5Hmcg|[+w}"}"αc91} nůКo |,K4kaU x=E>KDx}j&9e@HGd%9jCgOft8,\9 k ER[իWg…_P4+O^E/1o.üL%]1ufl-b Y"Qx>Y/ ޽N';I>K ͢$CR' 5ͅu" !!i",5"IP(.XrsH<'#ّkCƒouHBŲ*dy$(E3ӳ`7{<HrN }*perYy! O":[#/3%-"Dcۃ^2$S%<.$, (6ZsNq'aVvND B$Dg3>:Y4RrِWxFqUl\K\eV'`4=Sax6|h&rPx./L%Y?w/3eS.^;+WG9RZ#[G,^;Bk厖1@"@l9fu#wK+53gO?aqj(>0 >wT1$9hy7,eBWfoዳ_>NM_qhU{XGnpy&ZkFn;&'ja#mGt#H4 @\"HV(!H QBY={|&V&ТlT6Ze峬wZФa4x<6|OdأI5Do36|Nږ\Wg|,REAQJȢn6СC6lǏO?@N |?=BX GFG۸ƱL^@ $TVfeVXL"@<,6sM=3qvnO"hyY U1m>?TM!AYз\H kjIVii#㈋՞NLa'PRd|\u ť@-ۻweΉfҨ[莑r)iX|ܠcC;ͬ4A/3PL&#:+WE ,fԵ&kv0íi+wZQvn"RyR;68q,-x8{%< N>ؒG|h>';Ϟ_ K(f]ήT7Ot't{pm1K otMb,ّ͔Ԃ"5ri%guPW! lˣJ(>az g$-.m'xa?+}"|Z8.6m`f>!;h&/a;[MjˬvO[XGYɄhSx/=;yT)ѭT1LZ_Q~OƏ/#DNNWHKKӬV)//O3 p8,^ 5MRFK)g͞3+< [mە].?-RLl]ڵkݻ7^yX25j'OF y!jZZjUfn{Q5QJSK">m2p@Z5kƏ?X6b;]+mRA/KGy %BM )SO>} h"F?&L@ڵCrQ(.2Bq)J(+K=+kC.I/˓ Bq^H):u*-[?v-.z|״lْ7|ӿvS)=HO2X$2BP\lH$`y?(x޶UP(Pf<ƌ< OP\v_=P HB eٽa Bq^?PuR0/^CPO @JRoP(!Ґ,ZP(1ʣK/*իWz8`L89_ ݇^~`szV)eq B 1, ?DQ  B4i]vov#XjU1!]Xru&5c#\KY(73 ^u|>fW2K, CJfr!uSGY/"\>/?G/]ǜ &4wC/Y_TBQ}0͘L&f4M+! %BP(7?h"6mTL<vW^',2zӦM,\Aw^ ŅF g΍D[q;ha{[d֟$"#m]<žq"ˇ-['!DDT~3=cҠe$̊}.juA rbWm$❒W$6*5iCjvtzjݐ `I^2bǑ3x,iвu, طr8ƾc[+ҰUKidʂqX`"ҩg3BH7ir6߲t0QsnIJeYtjԕf );VP jhEL/Mu.rBa,u5NA$>,s{E6pwfБދ.M+(V,دXZ M:RQ: BO#ݝyMlvsٳݙy9St,s]v?/fYJ~(ǥ+\N9 2쾡h)Å:ʶ XCtwmDdY+ϙ[ TVf s=mm0T[4ؾoZמX.έH$}Ĭ]`;qs2Y{ ,Vā kϨGOKBj[V< !H|3gά(9oj}| ve˖Θ1҄xOuPyZz)!,<|q-IډXu;S3iJj:k6[#i765$(Ezzʕo]MǨyoKyLxg>;f%&/m]Ö6t8oj\ߚ%|,YG둱AqAo}[_ޘ\? 6`R^@Z~\S3ubO^[o'^qp`3R\_35Tw A 6o/&Y?]aTxWοĬFZIArwHTl!n$@BK&ӭ[39ɍ7X!7Kb=tgFaZQ8psO*5SB芈h swmPŨvtoM.\ IDATA(&VBf͉[H+5y?ݏa޹.16,_2O`S+}ma)IDj[)+TA7sM-ѢR]PPK71(qggA((PeL(d}8ÿh+}qKݐ_8=IoEiv9~]< jݪi۞>]yB!.(TcU}gʮҥKINN>r#Tw|^>IT{+ٲE vM$^?#h *2DRhutem:ƥ=Ҍ^Uod{%nM!ŠqJI{tttt=z0eʔrigCr).grxN΃;}rng IVYLĠu@o'h4)PZβ~拏JhY;g^rrcꄲMgP-+ l볡o؁VQ[XLLoL`t/!/(On=YC;-a4ۚj5 &;ٲ0iKY} j|"\ys OlGTY[ݾ= k0OlL*$\Moڀ9) DH!:M|{&'"9JHHM 55]1ݻw3a„Jk>.7Iƙ ^0E6CIj;N]; ʎR~8Z` Ia"])-tƲ5hkrOwoi6Sh޸cϒG0s!E@Duw@wuvDl\s2Z7úg|Y'VK:5-b1@>aϨǴg`=|r#6^3i+506;3̆;)4צS=&5-DJH\=zLr !IP|&!(RθqTZZPyyy*99Yeddh6M ðX 4-4`4ÿ>{J]Ν:^;o뮻uEEEX,LӤQFl۶\>+Rn6k0*̐'7,^JJ e3it:&OW_}I?ѬiSEyɂ;-}轔~U8NvK֭N}Biz jbz➌g~'/QP!*{f6_wS) QJY֒i@mڵ 6FƍЫ#]H)СC+'N$++\iX,*<> =oC={2 !B!}$Pn Alvv6<@S1Mxri\rvY!B!@( 4`ȑٯѣGSXXX.2w}L2#GҨQ !B!p$PR<3DEEK7MO?3yd 2uTڷoχ~X:""cV-B!’YXKHqm --[n.2QJq!6mDaa!aT.b_ /w/!BH|t֍~{\ϰi\.N8U^QrR[t]dVo@!.%-B&{(9r$SN%$$78AAAL:QFU$L!B!CD4 Ē%K֭YwܙK,B!" #]v?ӦM[n z5MK.cܹ4mT&B!B?\|6]J)ba\q=z{n1MDիqqqhvF=Ч{o!B!UM 33x RN||<#F*(8T]W!B!gOVYf0aB{R M-g$Ʉ 0 \i4k֬\B!Bs'=UO>̚5\o𫯾ʬY[)?> `۶mU{MttYB!B!*');sp8 --45÷5Mcر| !B!87aB7n\@ge˖қ,Lѣ,_˗sȑJ+B!B OA)?̓O>Y!X=<o!.&i2o\zIup խKna )!..ʖ[}B > ];v,-ZGaΝjժ4hot裏2eС<ԭW۷3qD#xװZ>%0sA<t?Ѧ5vcwZ#6 c ST ek4MoҥK9xaiP> ;ęr:<ϏdLLtB!y#4ҧO͛Ǐ?ȁzs: t҅>}`e[2 ;nsiܹsY䣢hۮ7x#7p999|X,ԙ]Dtg,c 5~[?6;t[!J>#f̘O4+W2zh\.&LSN\~L6sw4łNy0?ڀh}{ >JV=y-ǼɧsבZ:^0o5wJIP]xjbuܙ ^{ TԽ׈0?r&DE/uF:UW\j֤ ?;wR3I)E~כoҾ];W]E!8oQ!$G1krN~^le*n Ȑ+3ڗQΟm5ڐ}"Y$68c7e }Zl ٟ%}L]1a vgq3}}ӈԗV{;uF; JTA(ҷ4x Ww? )0 >*:xS9Y sv7L+.*kӆSi& (,,.d[1Ѵo׎oo1%B;B?f7ޠo>kׯ,4M5kĉۯYNR߽*t{щ hY>֞jv F?o]=w9vͼM4j+{WG\1ŵs~b3Lx IvkStQU0dl;m| (Vt&ߋ;c<>->Ë&љ=v׷<W\TR 80f̚EvNiM#FOnݘz25jS))$'&Wн[7ƿ*k׭U˖B!yϩP?Te%V|-(t7P**˯繾,$ !@Yq=0B!ӼB!B! F޹v0-/0Mf=L;dwΏoc (4L\1C:a`Rqp!B! >fv(q6P11Wժ $64|?wD?rB!B\0ހ{Z]?W~hJbuVkAX_.]B!B{SRXl6l66B=[Мysh_49>c ot 89M܍voԫ,:l=J9%,דR))Ǖ7]|Wt} :d?#`̝3&MpÍ7*B!BTIzϘBӽd4LLJ؟~*t]5 i^B/ ~Ai:B9g=$ Q'xaW_Mjj*> _~feB!2(pSM7J9#|Oՙ:#Ҵs!V\ѣٳ{7g̠cǎ(?Δ)S֭;w;Lf.31WcGXB=nNr)^{ *:.tOa.[rK?i]KrAL$:*Ӡ~}-}_z `XX-ۻ7ɾ !8/@r =z4-7駟Yf<}݇{qԁ2`wMѝyܲgԚp<~mfw@d{ٽSU d^y%6D)žtbXx15:@9qtM#(%LdlJMꫮ"V-֭Ï?֑#[W)B!%Cݻvѷ_? BPP~Y|_zO4ł?O`~&.(Ǽ70OUά'^yo=u1\OnI^;11i?NG|\ٷ]_'mx]b*&2+ճVuљ;F gn!>%8Ɗd⣬ ۏ6^eU aϳ,߀,0azѣPn{i:; =m7˒%1zh:\2LSÝCn1#>y&EAԤ7J酁;~ e|Q{"w4ַ|?g{x<:qg. IDATMɼ. ȚNjN5-ϛİ`8t%iL6aoNc™7/^P:#n$f|5zT8Oi̛-v>ț}"}L~)DfcWO&M[%kz 0~foNL ^MV4w#OMÂ^סxÍ&ox}5o|‰hd=9aю^G B [g&I:tѣGpSsu0Fa$E[OM!.rHUz`_OE)k5]"4XP0ML r2(wʓoRRh_.VPvT4ER~D' g2ֈwl[ԚYemO7 +sC2lM?"ЌMR'ZfO%FEÀSGKoki>`=p5~M]u(.gW3k5繻==KY'رcͮ貯ĉbs`2مQFtϒϾ`mf QL}jհ^&&&g0wzbogiD]ޏ{=@GWrvSSA(ҷ4x~T~D:\?]buEQvve?mġESXd 5f5W̖mI('>Ӊ5C'\Tl17^+/ i%:>tJO*lDFDЮMo#qz]:5s퓯R;VJ) BDDg$3+ Xnfѽ;L_eWpjMrDFFibPV-5ZjD!8g)gܸq*--Medd<2224ͦkaXihfiOoy֮[GNV,]͚6=wEY]\{J{?z/a[\.Wt{>ڴnu˗3zh@D&L@.]θrP.Xyim"lbf|=\!Igfu˶?fzbd41 rt\. S'++3QPPNm0 7uᖑ->`b:皦[RҠ;8@Y!.(R aŧi&IYIقr{͟OfVÇGf70` s`Y$kKb%{ 3o'?̦fV$[̞ߓNsoKXr.[%UTTĆ iժ%.[z!J}T[}%fsOϠ6#)1tB"HHnHä0T@,ub glֽDg/۟Ӝ(} CdddRTTAAԩn';+Pt=(q8Xv5j-BwwOU\\̖-[ذadffr1rss1M0ˆQF4k֌ b}ԅ._޽zߘ3woViO=Nۛ\tp=٠)ۄ;?SQ:ee b?IH;V0P6M~ۆ %AAAA^^6 0؛AA(8hJa䵙q4ؘB߫Hә6m˖-g*kl6:ubС |ɧ9f̃ӛrf.V3͓C=CqץVȢտq0-5lH]V {@ ~ soJ͢1=@bj7il^3|Z<%kÛYiYVz1lMgpIN6n<'?ͨ¤fm9Hna .NxrSZ6#k;1Yl=Gx>ݓwEQ}[5P5,ٙA^ [xM.kވ@urhvF\‘ntHpw<9TjFԸvېʞB\Z u$dh]jd2)0"ӄe mf]>rjdݤ8s'vWi "V#֍ƮۓƦ8D~6$;`e16'NWIe,ʬE߶Xwt '9Iuj iZM;8WC-~vg`U}/D\4O$}+7gPeQktk}É'hҤqىZM0 lB6oތR ϏI||OnGjo&GV$vM~~AA2B Kek׮e̜9Y>-,,d,\1cп{1R-[ʙvV:!Nd9Lc ᪫*[G<3͞YI )ٳG k1H\س?z${7&Z?k8܌νc`_I Fx .L']GDX)LeϩH!YukrW 5+wLtg]hW@\Yz]ےa!EmBl[iY{u^`ܒ^ ]cX)9[HnՕJЂ5uCyh߽9%lMlX!*li`8Hj [ G_k8ܜνc`Ͳ_I 8n{~mRc/jhȊ_ kFYM;ӷZf^3ʓ_5vcoҞ^ՂЊij~tcJ0CX]inQidOi7NeOa;:h85Kֳ4:̍Xe?:Ÿߟ}g_؝z'Cg[(LeOw9"7%M"ȥZh&MӨ_.WaÆyETT$͚5E4JJJ^yzhFHHQQ9zdՄBBO/9&MN:tЁiӦQTTa9t[\\w}Gǎ/xk>] q))QCٰQTO$0S]?(95O7d} On7\7Q,uH j)$V;3):zԭEӰ$_Ň䩛B~0; 6zDaxM/K%0j$Gg S">D/ȧ3oiOqí(m.ÁZqhN͚5X,W^׬e5\.\.W؋`ZAd@NHHa6d4/MuRTeB Vl ۰[hܻ ViR/%E`,9v$wL*Ȫxn. $$f?wP\轔^NgYt:ٳ/? #AV֔KnO5B.2"+>Q2$GPҪ[0 8 rW!>'|vMq?fAv wHmlIP(:+0 {q%z0a64eRu&ċlܴ՚nUG5fKtu\ض{ Kwn޷uz}3`&$J) a[ [3rTX fnH$6`0٧饺ꥪ^|^Uu W/s=dsfFg0ACٓw 1{8gVdec N]O(l*Kw$G/s*ͳ?3 _^%s2v,M_F),tV;H3v":{Sgo?)#߼r8y.\GXj%*33twu9rΠ\hx3!Μ9{CR(,g>|D9{_#G?8{=r ZcǚSnGc=r(bÆ o&///p…ZUZ&xew^,)lO{7H#7oDUhϚՑ<[=Դ`QQ[oH>m^U=HY$^ ~x;c.ҹ]&yskrR A+p^ЈjJ?Gǒl9&? bU ]VCg;xxf?^.f>!Y9clKR]88΂۾LovBXqkٿO/|-" dr}bPD6+Cf*4e7G?=v/񯰚kohk d D_Gi=sڵtİ IDATn3^lmmzjB[9>LPU^y5V\Gsȑ}x~g~VDȍ$I&bX;ꝝIV'Nhww ֭[~2vSZF {Sa?9>ϵ'h#G @E|Xw's,(S\Ҡr$4n6f^asfX }:iϫ` [(}^̭uwn~ kt`^sɑ#G9r|(w?Tv4aiAXT.Кo/#LJuLR:X++ f9rȑ#G9-D9]c^fٛt RT)Svpq6<^>B~/]O}f{egmkb}̑#G9rxw5^%[vtSXBT,R.U)U*9_cݎUARfq:%Ag35 S]E lWl/#x?ʑ#G9rъ(kqa{Rr 7 9slDPbQ(/~-b{Up/)EVxjp K蜹ƥg8s}w_,{W#G9rȑ#G9QqW}w/s[Tz0=;d:i(* B!"Ξ׍_jckw6yc/[6j*W2v5?t3ȑ#G9rAe.gLLS*) 4ThPabb˗/s/]1ȉ#hOMػgnpW/_̲E\:{cSLE6o@_+]9rȑ#G9r主Gsu,G4 D.3]: =]Uzʝ\|ɛ7N"ݎ3^r$3T+%zJȊetvvrM\gEE=tK3ܿȑ#G9~2$Im\Q:lɉVL6|m\C֑H@ ք:hWߏ;Pɶ%S_kGz6BBuT@b6T_,-ff P45BtڱvT̒o>{MxA3NSMy3}m9յE};f;[5/iїL[W8P+^mDn׊9QqסP(P$gʁՎ2JčzBSўn$sMx6_=`oJDT ":Xdz{94޾BR\X#G9rI$0R:%4i FؕѰ!sE+HIjF&]-f|`{Y92kp) }ljߦ4\M=xSPa;ʹڹ"^FwZK! ~u I(ݦdL%hEQ6Kz lskx!8#S0P!Dl>9U? &\?C(࢈la?]{ RJJR"QՕZ3{̰|-,/\Vkp.^R. .X7T` 8tN4QOLq5Tc%ˑ#G9rP$tuS:-n9A&i#!hc) D_eIGJ#w Dox7(j827|Bbk ی13JI/4+\"BJ`xjjg#jJ!%W!W~tSqMӾ`--W.KĻAU[I33¹C[C݆`i_Cv[RJf@R_4 vQB:(XLPMp%@Dsև5 !YDQue> D9]G?`zGVlqrRLTX.SV)W*7ozz/'&4 .]@ F֯]EJe*U>2/9ʱ03[ۅ%G9rBU1RҼZZ}6ۑX( X]E ,a۪5I{|E.d6s ˆȭה!$}͚̍,lvA%IIO^iMьAneB~ ߭ĹJ$i?F$6cmAcl곕U"_[9LWM"x"m0<RQ7F~ʵ9QqWUΟRo))Ks ]1(W<&F:rcE6>IAF2J'mf ޾jWt*v9cdz[?oĵ_9l(V4A)mv"ԸP{(+EE֯^Jo_Q4a"js sYpPtqz&Ë{(T+ԩoOթF[WFLߢe|P?9rȑ㣌 hD~S%!O?vi6YWh;:[Ӑ KBfn lEjIFEfhA@ 9Ei'iЗlUmdߩbYCiq1hPI#Y,=Q9UEE+j⹨z%>'Ȫ@Jէ8{mwuv= ?as-斸u44y3K0P'rD:ă(ɉJ%Q:_L$BI( -chm:8rbHH}e"JqbBz=wJ#w#GH,aƍ 9rȑ.@Ĉ⣶z!CفE붓hX&q :F 10ĞtHYMlɷۨ=c꟏طŢ^Z1bXTն$xǥqOʢ,MQO8Sެף8-+zCH(L)a| D)SYܛ@I`i>FjC٦DGbvs)%E${x/ CE GoPad PɔY6{ vmbmWfNI$BY 8g6ϑM͵oA '9JQ&8M-q6HbS(pmN:,=jW/Lg>_OZ6;B "$q("}<]erGe>u/(n}J?~ĖQ9r|ٻիW۞#G 4,IѬHVi#`KJDHNrQLjs-ʫXTH.cύ J{TmVQ"N@m'fȵ=Ħª40k|fPaOɰ繖ni"4Jk@8-ObrBĵIt %S{zK|XZ\32SKt9س&J۩ 5]پl5f~HmSY.ۄ7l~Sġɴ( ۾V?%{9r|H!Q~W @IL78X)6jJ#O"B^J _Ǫ<}M) AzO~St/v?Ư395ų_/122.W_Gm429#=Olch< ?˧f bul۶ vsNp9ꋖ3Wʕ+W9(}[}aǤ)AH EA}],mh܁W;TdMcgmT4Mv~C#5.=;7☤@"rW(⢈H**U(#&k<[#"MʅNq]E<;{>* ogxSO8yo~KaÆtU|}kOn_=1WL<],q 9r UF07Ν;ϹsXf }LNNRsߖ(χ87 slݺNNرcl۶w?TAP4WA[N#-SQ y 'K4?-$6Vaz~ 6MDL_!xRiQXOaq`.LMy`F#Ye66Հј`5JsAWp8cAN9>/8t\(PtgeE@ʑs GN9:{٭} mŽV>XljW`q@bgƫU0!:m6<+ۄ0>,H1Ѽ. PU<*wڮruNs^\LiIjc4nGc Zн]A qE/ăY qWpfn %7ifdR9T/yo|7_BDٳgg>ç>)$In}1v]ޱe1|qoWN` s*ì>'u' Ogs\Aw[wme:E; j^'v,6뜹>ENlɮuIڷ8ֱޫoqubZG:oMF}7tYw%OOu.MwnQN_wk]?E8'7 ],^ٓ{M=Z W?NjWģvW"RԨ0^voYBUꌟ޷sm&1Ȫ;ؼ߹}իVɑ#GXb4IΟ?=ӞoT,xGk$I@9֬u ޓtUf=hT@8 q&PAz*BZ?#acoxud"mUh8'B5YFPt'&e"AwJ}m8@ g:5WT!=,5PQ"rBev9QqW#*wQZ(gQw)zF\.6n/"Q!rb_}$39I98ٺ7.P? p?ʗ?';˗/ѯ327UY6<]y_~#'oڹ^EW@Q=1u"{{iQ  t:y}WѧyQᕗF?#ėoPC9/{bTD}}s+V^͛,]E033˅KؼiR'f6 .]DoOO{V(jӽ12;s {0lpH=T] FE-X$) bZ]"zJT*.?\a3~.] R4hƗ-kqGG m^AE=#ʹ[B! ZQFv =>ȉrE9{aiʕ=]U*" HhČ3]9Z8prkY3[+tTtwvp$v>1*yg타 óUɏ?ITj#CX\Mi~J"=a\݅OAGbu_H5+=vSqfu]hBiVDt V{iZ hpbiy_^Kve! 89ڮhptaVq6^@wg?Z/΋gg]~?Ҏt-gp^ƕxe꫆rnì-D,%y*hQX=[[Ǥ.~40:#Zad&vG0sHE'a^i-}QD^tE惪jŊ1i睓FkazH"@ʲKX|!GIB DAFnSτm0馼-f|dmn(keC'V,g53%Po5u9Eh++#5Xf|$[6DBעbMMfSkEj-ѦX+I&nXT]pu<3p yM9FJE81,#&Ph=J2~HydoMhggf8&rzI .`LgiC1BZ$qvu9GESݜ^ufgf~S<ƅo19%qk IDATbv.-i)b^a^e&R@L42z;Rb:6f-Th *QhTb~IIКgׯ5fk%+T6^Qj  x`b_*=ZQO$T=膈jLm6F:vSd7IXI: VfgIhNu;'iFPx^v7o`bbb$Ipαy&:;;9vB_wjIlO풕`BF!t&r .9$ԶlBpjN7rN|" jE$@jG^onJӣMX. "ΑNWv&곹ׄǪ_=~%9Ggh- |ߎڅ컲{L)w,'"lCGtKKEzcl(5ƙi`S`7^mҼШQ!KG_T3;-ߠ>׵ E*j#P;Z|.0{ 7; !@D(W33@X)affR%SW <*-7ݷr7Oԍq+ezw-K/MOaz|/MGqJrDᢈ?Ʊ)yJoSgtny)H&S{bxYe]K*XobW9]<##GH{Uo[/U}\Ɠv9*˷mgrhI_%[V2FW<%xx!}MѨLϲM_Y{Olp Z)Q_HvP`hlܳ~0u0z¥vAJKm<8UJå<1\b6WC n`ޱ7 fh}ZYnVz}|31: v]M{{M5 1KA+p_ЈjJ?[A*KzmfQq G8qbW^ykVuĞz`a.+a9>Ha&IrbM`Ï<Ҟv0vŏ^|1z'?93D;iBg ]yAa+|S?@qh;>ѻr;؞u elKv~7:ϤT%w}%Oiuu!~^aG? sYioih;O}>Hwngc}.һ^[y<V>WM[\wEocG:u-<] J &`껟v,[IoOw7;|;w;_lP`}|IlQ ) 59A)Hzu^/.Ff̶'MiZug1(+@æDJ^ҿ|f/^ J@5~7!Lq{U=r|\rg}={o~Ƙr [neΝܹ'x[ZG8 nTRXC,gqO@#@-.\d2"PKkS\U>E,JQ?_(.mHfoBYAcH⮾J2 9wۅnF"p[?#>z2 ud.PZ~+wz[n?~ nS>qQE$񓌕h/8 qN=rb2g@ޜ:aAwμoBy -dKD$I8Qqm}|Ig˴)#: dCm׍آ~Vi(v}iFZw>#v=2F$K[d7C'b%5DT'}jV$Ojpe'nČ]qY9*A+4m2u/x:Ƚt3ܵo֘m&$eio{K R2-@P=Ϸ\eӣE°+ܼ҅Rrk'+O}^cG/ ff;fT|ak[+fɈuS"#+],o^?Cu:=DS[h~!' `tt/| ?^c3>}o}[B'x9kx*_ N]TVtwuQP,3Sx$5"9(F"P""NJ8Hִ^dS\I]Ck}܏,YNj7M1I"h Qk )t>v @{#G9{ԳmrȑD7H:$PpXߧo c$;!4ٔp`4[{XQPA"4&Qit`K2fx4dl%'ɡH %7jl 'ݞ=j '8Vo0N@{S2t Ykn \g9:KJgRBUO,_zY3CA<M|x(Eջ͟?N1um&iƐ!V_I=ijRl]1P`HVI9EODl5T}˓[^Q"U, ;M[?DyٳN%q|'MQ[&wg|:ƕtY\rTeG(L6TE8J]rDB4^|Smp`?`t-hqe(vAD Hc-΀+A<< 7$ y|ivҪG9rs$I8(u# /`wpPMXmR.C[##XiĢU-V ,BS1mV6}K» A&&FB}jx' D,.] Vg*@WP 3W99zQ9TzQ@\ 4f`fPW7D$(,q끳ډ4=Ԭ6<u Mh.vAYJ -j,'7Z. }ʈiY-"@]TDmevi?ҳP;BzJ[P=tk ],Q(vFNpN"[3Q.8K:Ke(9(r6QE!VN~,KEF N5Y +2;"@ (h k ֯"rȑ#G?6lu$(+`lu׌ r`e+yM_HEHlH'xM (+iCm+Mku X8Ll~EiII/.օ\#Mq MA[#,`f9tOV) B'L(H+}UA1u2o- S>& 1=-ШC`]b^h$4bGfJ Y$jm/(!γ@S@pX=eS7}2T9~vouSaQ2Ksa|BzZ@z@\Ca}s4AtU2σ~"'SzbَMc7j<;Tr]EHpN.łU*P.8{FOJ=W$Xl- }p!6N DgӨw%(V@K0sfm7δ6&G9rc!Ič4HQ t=SH&o!"$%|P ZC(M G& 9&:<0f=>@P>bg_J Aw A'n!4(L¤FPkܼ yh *0Us (wJ[{иYHjV9&C݆@A: 0JZh rx0@EGdB! FU~_o޺9Qړ{Gc oo~:W\СC ;ŻNa髳\+U""'Ҋ"'B (:G)rDPYqEI*:'FċRjq95R $1$ut]_up.4s Fa|:I&Lǟ#G9r HT{a_2sCJ|4ڟ,L")?4s']+jHK_@' :U\WDkÞENjEktv:>qtLh8\d"0IQM9QD&+RO'<'4۪v, wށUꙹa# 1 YPP@_]PAϬd/ b@U# (`Dd%e;S㜪, H?}9멪`mUo*X=p}hzT\'W>k* _Cx IJCrKA-żJN4*Wsgy&jq's-O|%4LdӖP !P/zы8裹[8Stg~^L]%+H:2 N흖A@(,ӈ̓qYCW3xf^g2o\FaF5jԨ$Q{3Y#l16Ȉ@nW70RX\ Dl.h~0je4bz6}[,^uɏX$VBIFBZ9FT tӂkՖx6$Q(ډFF"#a}'7,E04φY6KoQXX ρN۠” ^WM6wnG:D_&|JT+~3%erN9 <c߁GЉPإA&tڱ*tP*"e$ m? Q`AgX`ĸ4t}ݿGe;'2 a5jԨQF'ܬVF1p& $"R YԊpאc4= nHQ.R/HcD(pKXh6Q-S$7s:wC*FL$7e$V2PKdr+>C1y$$cC=AYȘgAdQ{i`#Ib*Aqa&f5f 4E)h.^5/3VUXn׍JZ- ^XP;wS IDAT07ݶ؈mdPnuܻ. axvqXx0&[GO25QNĉ9C !;,?1QNQjMQbGHӡC&UE)FP Q% nD?ᱡ(4+$( 4Cfj y`c6<2ҦjZ[1ZQΏ"-B4i5&X "bէ%1h ZAQ/+Ԃ1Kb afܼT5u7QW^j~9eyl\~B&<ٮ?NhTTZe_'*NHr'BGQ@+e=Qw;f8څ@G37`]_0̦dA t=>{xy32z/߈R!RFYlA50H&rM$}GlvY/C8Y]MGEFy.u I#ؒIdٺ/9Ix5 \E9l%#R$Uâ@3K &9Oe?C4f1cZ>bPBdr1E ,kcQm`1 Xi`c7pgtkrihiTsRl_4%<2"LMAo|ۋ͑T֦.Ov 檷dvWLYWOCU)ܹVlh 5ϻĴ9ڛXjy^rGl$nI89@;tvAik$h D[G :;P[DڡB[#mUF:v;ʃ |t!o/@x ?_ڀֲ; }?fը;jRFg+$K7w(IP>X J! q{FSCCXR/i`斋t!2j![r{eEc8np0#bDb'1Ā,b9}PUhH&('U8\<Ϊ*ai )R$vS"\\:E'3d=~nHn).^JI9sٯ$gR]j[e(5QBb -|JT!FA#tQv@:t#cBB!jz։vS@F:#Qi+Y۳HTlAjQEEh eOO5ɩQF h#P!95jd:{Ĵ 6ɫRC2#(yV׎J1 U[]98NǚwsJbB&@HlV@Y<4PN'(  m$*W[gAu }դղ&fZ Ә9?wfbz14!x)* uȿKudbbE#Q\^qk&cf3\=Xٛjɪz^yL@5{ |Gz8fG[{mHg1萖-HP/j[`Mk8usdE.`"h/hAOoj5fh2btNFCۉАDzުcY{EYF5jԨ@lMrtMd3;5*݋YT S\"2F߄rшT_&;QJb8C*_uQGXX[zHeaT97Tfլۨ-F` QEh08bd\GIF(@E Gi3D B᤻1} @QB}urDr! 7)ru~SxV!rNFjgfMu|Ү˂VF%VQӚ*XVb_&be)irx\Η`yEr<./K?rcɚ<6o3g-G̚02ws#D #E>z  n6 48qc4~8FQw5jԨQ㙃5-&@$Q _}.ѻ0VN0X@>N}O\SRӓH&[j~ |/ΡG5DRns&HOaB&VG@{?I@D)h6닌OVr(h47o>FvfA__>Əg`}5,4 }(qμ -تۆOo-L#V&Bnrł\]?ݜtZlImOP|-픖9R_(6@G<H9V9v,,25GD {nd` 0{Bf] Y4b~Rv.)-p$`#wJۊJ񕋔CUd'VVeX1Q 5 V4)VnU5jԨQc"A7H,MmNi|4yB+ qɯFݑHdPzt1Q%ʼnuyj$[Pzlm2#"!L|PTM,t+x\8+- ߲4ZEQh 4}c?a/f.bxMgDjKճ ZM>k5h g."v^ltݟ += L\UQj Hή„Y^_͘F ?d6FKE[XZ`p1,^<vNE^+V_AY״ż[7l͚Vӈr( ܉gKg|g4|.)WᔷILxx#ɤDMgͤJK zzC5b:`3eD>OI&~\*]$|(h6*k5i54[  '!"_ΟלepHUI%=^m۰,%6k$OTRR؏ZZc'ɮIH0 Udγk^`*im5. yP5jԨQF+$ĉ"h DҨ6XՆȟc5mK!ձdEQ5[*ٴU61!*FvVj˓7Iv΁+lʚVS?ITm1(!@T#!$Gitiw;ʱ8^( MYn64 ͆l4(`kwMP)3UD)W9o*BUsX&γC΄J> |36||<[|w%1/b&dmj+)NQD'&F.5QQƳOs̝3'y|?"]F5ВB`$J% T>UIs%JkУ?X1=dAXQ3c.>U-"[G`yCAU+L2 Ri!灞8()h "!Qf3n+$m4Y5Vlɶb#E]nE&BLVs+J/[M׌(x)_#t),:4FQ#*VRJ3۩ܬ=դFYKG%XZ;ʱx0)`q&~Ap CYjb yOAcX?r5Ux{x㍙8qb5kpw;n\QFN("h H45P) ڸ1Gc bJ)hs@ԹD*4b>sb4Mӱc|uh)6z T{;EXT 1jעe9!9+52?)m*>lig!Ӣ tBAN$6P1*ͤUw BP-v\$!TP)Q#vߩLāe#4 H&ZR)^t`&mwQ&b,v^DbEadj+Srs"{_nϓʒ_؍ -\cy[$c3+f_ղ pBMkԨ3?V+_tEL{;d9]x׎gוC/c"GlڪN+Qcķ/'Fը1*Btĩ:) Opvs!1ڈ{M85'J2ۺN7OXFt(;B'(ԦXU D# BhH%ѷL4%4;DĀPD =5( NkdX@р 6:"yL,@%m' XKzVr މBe3Rz[%$c^yAɕ5FI g%U&m~fbl9PPIoF{Yg m/yBC( je~+RI5j<+U&ͦM򭿯zvi'fΜٓz.vlz/@oŽEQ mw_665T_6wяr 'pŕW0|n֞KFƪ*gNα'… ⮺*yy]a5+E'JK=p4$塳jx:Щ<6Dm I*e>c:G@6m9KL!vP~& ABh4VUkj5kkG}-LդAh, edQ ?rAS5k0jTxˑkVR4R5-W-xu f1]\WFO۽5lVx̛;[oo~ĮGc^i_=snnbn̔"?ȗo{uj*CJbBEُR?^GI+wYZ%cAm(6ʜM# 񐎅"mPB*+[fkk VQfa,B:|6i7!尪'Q%{/FDu*_ɋ4xOXf;*6=> BM*5Jӥ_{7ƾCT82ˊO&ײ0O?Ʈϝ#OYY:u]̘1_vaEgǃ4r2AΥ}z#Ʈ}-;y̎]C]-玟ʤo>H[%y-~;`.ړl;Ü]˙]w؞W'=nSvg\ݶۖ^+} _1;4tnv".(]xWio_vl_}}r=83W@rx~8f=9ğEK>ʎGǏOz{|Kk?t }3_=x/vc0?ӈ1r6۰;3~8`ͩS:u*]=?R|{ '?#>$qm| _ {}'? `woUQow Q>stOv_mCnl!5ň5-ܢa;Vק`SGoa"&Yk|Z;dΓo'<@PW +ruJt؏U-gN'@W2M 3BuY#Y4m3PKߊ¦^;ɽӭ̴` oW|x҈i˿D/\Trax8rED{]R;D,.;i*r"{^3hil>_Bbm풨jKdvAM@d-rgme؂wy X8Pg]ſwҠ3jC|hګY~ksGp7Ӯ3s8;(N\tʑ|{+Zci89kxTUvЃSso >y,WN>s~z?}/\3qlڼnoDZ3;~G#C7s&fuߠ㜣?_7< .K@GҹouY_p?>rIB_q\5|+^ \&fW\_;C|{O~_;c."8BazΑ|K9滗fg"P]]~K~/Aֹ |tqIKx?asaƌlfQl&lVl&Oמ{ y{pdzI=) Uen~Ă)5Hf*D;c0/7kۖGJ8"x<]ABj'"/t1> Q#)qNKMWӿ}m ܁\y_Z/eY IDAT!vfp5򲷾 [4/2?&l^#=y cyנKM[2_s^[m cewɪkt5߱!=Ncp⚬4q LvoXox6x˙ؘ׿i& ٖ֙.\l[xRƘמ/_۽1L݉w__vFg&iA^ ,@DDSeG!cr׿w>ys_r-Xe$.^5o6Qo9y`JLLbG1[pMCbPO!"w3` J>H%eJfn[< DɾbS@}td)O­~MHV'`eLsY0yB*nY"jΕRR)eHb?ywgDZ XlI4TXO! j[3'ݥkGEvGRuhwN©q k /q_fH>Y~7;ٌٿ([]YןɟkYOۂ) uϧ#u&\ѹd\!vpsշVZAk] 3ᤫg4^:o0~D}?ux~Y)k_*_Wtr;!tRr;Y~:;:)lh!-vZBZ2&[&]=׫ce»n`+bV&ΙŜژt&Of8k&'3%CjLY<:K̝ɬUY-1A0i%ҭ%8&%m#y˵']ihvcw>&rH]xZE}DU7>cǎ^:D2eJnVBཇ'W_}5<_EN?mѨj#=q2ŸO&&v/)> 65RXM(W5?b y7>ZY# yws5>EАFļ n#CHF-}cZe*M=̵.<249[~bXym]~o]9R +ш]M>|l"oyXmF`sT>+(VS.ߪ&DU,%gZ-nO~2zrgxBE̛5~~| ޅ?_"Gcđ?0/񋻆q9?ϸwwx!h4X}Y}՟2I6<|G*EXwGXy<0duk۹cf暴Fe_/K a-|[o㥯ْqR60?^[^뾊WMfu λ}M_W.8Vt\vօn*LYVSc|qdv9|p #U4r6]gC^^ eoq7C_f7Μ{-vm?<^zsz;M}t|t&J^,x"]ՅN:dsD`CŕN/]:wq ~&8fWې};Wm0A|dܴ8k$Ʈm??#\B޺b[wcI| }:8yZn߲ݵ{,8˼kccXg7s;1SGsg>8t,_}fS?›>Vbg/?Z89ݹ~bZlOpc1֦pF|}3NϳZ7ޘFQ+ৗ^J'F&Nox2l)7r 8^ϛԫbx{Y=ިʡYA,R%.FD0F:l2mC G1 ?;d N@I:@ij_]>B;uL)jlgE+aa 3.g<F 192=S9#{B!IkbTYխ4,%VAsφ$gtll*FQ4MڥΧEmɣTnjj׈ PWVK.(ڡ.Hv, 29`:L&^k~+.w`C{Nu_惧_>OxT <aUVF}#XP?c Vژ̞P#PYÒB?25*̽Oܢ;㓨9[>?q=؆`>&[W^qg{篹:1ZvkƲf188Ⱦĉ{[MJod?!Ey)/^*fL=2)3xG @kv;w}S{6Zl G^(^ϻw원0{񯽁Վ%{R4ys9L.ށ5_ap9iM߷%-^5Pl|.[θ7ks>GIO4_w*Wn0xʬ&|jp ` Rkq7G~xQf8`w{2:%kVoz{`%5-Fc%%ɣk)(`|#4dRTMDV)D|Oߜkq2.9; VJRaɝ/G+^Jӟ+%3'N_@oP=^zbe1^u9r0=k hf=Noo]œ}ps۩*>w0rXޫP(CȢR`>u!U-%&eou>[r:lsi`Ķ g34ZUBQB]ֹS8+0g`Z'>-O/rK6b͹aP7kԨQYV{7uu?DMVdjDB4h:mM0:)Ntx@D Atc0{%~89s D bDI}3!JSLY>U{L`TI%*ZTm?MG@A TRm2,s I eǩRRxC.rGbvvF|J{%(9LU2EKճ^^NZ#9kZ@v}E<5jԨQ FAmҳ# yVX];Y) q4k )qܠvޜ U wFjiz-ߊj$#lt;NlטVj^&ihҭIuRKLyR7kBal\L~v|9ZH:OE12W<X$.=M *ii )E̮>0mS%")0O DT@ŔD%RYt(P̗hK:cVoP:Zyq)zi#wf8B*/a#u^c q_90st]e㮇zM^7 Ob li]s ם/;~{qַdžըQFKPQ h6O(lȣh8DSS\% > تIi\/KWMEPh5euvTj^; KVv)]E*Lԣˠ NQ7`_KɢM;Q*~0 S]ξ4T5'TJVTIW4Pn"ːIADDȪfV$Pu[b4TLFJĈ !ⲹ\Sz[9;elטt%RZO]FAt!cjkY@M%(ڃ㿱{ FQX>G?ŷ'ϚfQG}cȩ⪿^Zu7ƩꊊAs"?)yhf`헯͸ըQFeTrwZHvKBm-5MyG eL#}O” F,Hp "xtzWU0d`!F2H[28$q E?7}6{dɕkԨQFKBl%`[!:F[ MmAVD +4yٓ#B F@pZ!#EK jIHJs#N\qBT4O5!Y_* 'T"gb {[%Y'B FMiI2"-urIJT23 ֽ`{I瓅V2fQ% OM%Ub2Q:p;zj~:&8OYۦ+/U%V'ܸ5YŽQm9HX!-'h= C&Y2KJ*gjxir~H`>·!7AǏ.H^ 5jԨQFe 6rQ'RSD 1ԟjT`D{&jnnX F!+[,=LoplDw$ZkɁDR!=JVXtlXr`i)n 9.',I|N ?^9yJoAs TcDB@%T ]'_bٟD!N,.$b:--{>,`S&huY@EL,<ދvkB#񰲓dCMkԨQF5jHq*tR+"`5DVbiHu;bbzQ("&ȥ]i؏Vyw\K?oO#[Ă e$f3wHȾmZdvh IDAT`8!XʩHD`Jz-p>rfT\Utaӣh墹,E/ɒK9Q FDX=ueEBMkԨQF5jpr @Tk̋i[Z=XR)IXE|ڧAT3>d(,BI"\ٝA^WN-{d)kBmSoRSLF4cOUƗ%˽Tęd߉ $ %'bV_CS8&"F*SU.0iXHLV Iz;Yv:#ٖ&&"K;צT]K ,Fz#4\M׊(רQF5jX! A@ jmŏFIkpLŒ'RӴXL&Q_MG5Le-8TJ7 1$ɸm[X|V_,88p_z$/i%C3aL@mꗸyVQl3{o$T)"UtP(DA`/ * (HQDPQ=Hr3 S~Μ9sΙUdoorʴ!R{% [1tMb+rQ[dOp$0rT#hy66r*,՘]D^ip4X #Tdh2"r!B"D('8F._d(2 `^ҳl 艈~ >T+S)oZDT,D\Cm;dUk)FƦ S p?Z'"dvm[{͈<=}&O&M2ɽcɋ5>[H9;4ghCwn;/hhDh!$!B"D!0qdu̍U23,;A8@Dmm^aȌbP kW;|"o5(W|p% '%8[XǔHF{$NVAc !pd*{3+ٵA)PBllyOR1}#`  X[iB;2hlZAo/qRe%b|d3XrMV1 &,𬕑RFw5{rf[]E]L[hmʘ0S ZZ#lsZ|[_Ę4ǜ_h"49m8"DeL099d.}OvVǍu."D!YLI: mQ ޳벝luC`v@)9$|!wُs1`GFJ7FatB w6y gaWHpi9 sFP^ʻZdTFC_'reѨq㣎.c^Q).pZ;?Ld\Qd.C u(D嘢ls!BoCzb#L[~)w^u! "W[6/"_ z*p!m[M'*V\?A&([[\9XI];h1$ \eG92Z94*0vKRX ׵$=(P~Y'!  pLRBz]sCۍWI)4 p!/~9aQd>'^TN0PG { X`0xD@d6{7yX d{jIWHQqWXL1 ~ Eqr3˗pqKئ0פ{m>hW췺̗CQkp ^܃c0"D*\w}<ų 0tPh7.SFWMn^'ϋIhܶ "b^U=xfh8Om;g޺jKwqi7N^MM)o#-+!O#(e:W+pq뫼xa8,[Q7#4>Q\Ƕ.cgs9E  /0膟hf~7#{S?C/9v) 3&WQ޳<־Yڽ'gȨ!%3|/sWrjBb3OO=Sy0L{v\.] e`ˊ$_Knz2~d2K>k;SQ@.o\׉`J{z>J3`*GFѷ[eǾ;2|(.@s/sSo<~K7NJ{Ĩ@h_6˫.bΘy nx7N~N{cҫ?9l&}^.wn7.|u7G:_dM8 GI *bZӬpլ%i 9wd\ڬl+e5Z Q]%$#x+XB`B>(joʐ6`|V$kzo pm kLԒ l P6( YX!J#j}nxٖ7Yemd/}XW{Ӂ|ʯK<9y6+gW $6JqͷQkR<5ڍu48(Jms-v9.8Rh$SDBKiH.6A'e|q_.?!Q"^r ߯]K<'3|0>ZB.&~~3I&O/mc8+BܟrQOPx:^ޝr`N3u)Z.=Q.%JbZ-z^>|/ y!o~s hF( P` KQ3Ąt̉-Ⴭq'ELJ&%S%[=hsӡ8yKHlw)=j&1Dvm9sp,C.Y$(C9$nGS,.l]D2Aiޣ3ǗpP'rfrlٰ8Kdy\~VER{>S|k+A(TjnFͿ>D"_kfS&1qkt[sgqQ,ϰ<.+{~go5FD<o0g6r?!EF޴C_uS5xw Ǟ S X`N:3tIN.Jdvw3{x#urL`~UkE\Rh"%eL'~B9Fot:H#k&ӐX _HK;X'_D;( ;LQ?~Fd9⣭vʂ"˦9X%{JCw.xπSG hLqhS/ A5DmLظŠ;5ܕC +>[tlN"6o̝cr碔"L6mL&Mxz"#J#t:Cb$q{j &]p ⻶DY)m!Kf. )JtIhf߰X&c+;?yĦk|˶p̳pQ@+g84IVǮ]1I ;4ٹ4g v&˜ҙتPNdUIR2ˮm;v*O򣜼uRHo( "ıB (4<-{H$R4+'1.81sA7j=mKeݶ<@bm$w5x6]oVU5- 2m$~O_~. xd@\EUdcxO2_$+듒tM*4ڋJT=[H^P$B&lT +HTbidꫩYI,Y682 H(eL`o!2W>#4"A?i @ 1E?6 uyQY(}މj,t{{?LQBikvkKl~ -sIFj!.xj96h;cViHm6\l06h1|XL \^]>QZ|267EiG"_Db ֍X̏-[H҃CF*dM0֣ J$#yؚ!Yݭ[F&M2. -ܾI DJt }NڔC9@fz2'zg/y$ l߲ϧ[wU'nnA8J1ˮ-Iw/<҃b~:|U!fC%J4'#lwdeܽlݖǯK;P9]v܃)GYo<ΡLvQ&Rٵ/e19~㛤|ݱ(@)RqYscoj!R!PAT̳%-zSخc~D7gNwI( v[ZKFO*|+EڴbR;PF rz}41~J-~yba|R=6Dߴ5Wv_ ߣSRMe_limkڐ@cѰAK F@6rhPJ\u&E|AIM엕W.~\:rn *;MOe-썖eȣ=[YMg.C1aE*uh[mcVd&㬳5 %Ц=oA۹੔w@02Ҽ4#f~j][㷄ZB/:u0yǴek_Shsf g n>׭gȨPu^Yfowuuf'8G>"DT!;׭e{= T)J+~0!4p؇c<~9T9)Efzvz}Et̞SjKgY>h&W֌V: c;L 4{rvxKnv higgɃeAGnk]k:Z+%3XUe7la k[!؊G%m y?Lx&JYMZHom cOcD.^YSvAc756mUg~yC|ۀ9LEfF>k FI-m4ź4Ҍ:Pe2Vim06--d \xWrP>gMYҳf;AW2cDu4|?!w`˘sM%JZ K(NmnH!BK"㏙={6gFkMB4RH$r_IUr=٤pchIt9ݮy՞4E<ߞ]Vj/ibw;ۧr9gqfqckECwP9>{ gnE.=kYAa$wvcڠδnw!#Vs E&Ws,nہw}SpT* ?>h~fGNX&(q k zЫ@1J69NN'Fדk8͙Ѫ+~#Qnٷ/-m2j"BQ5=n.~Ekɜ޶1;bl_{6>KvtN~X#{CL^B4~zZ(G2*e/8gȌlEl2jk1q,ڡEzFyĺ0q,xZw f+(kVVZ25hl"@)!E.J^(KM1 mHa1DCP@Y*h;u_٦ArЁu3|8&LG)&MкM+."S˕+ǚo=:aVtnH;OneqY@Bē8;SU<#ӈ:.T*5:Ýo({3msDiv4"x>{۩T<: P%OQsbtq n &^@uw d%4c j bo_V|n|~@TΚW$ũz)/Kջ^S. IDAT9l 'CsCHOnmh"Mݖt4A |gμǯ}{n:I&F۫xW=wnֻddZ,G@nQyesɮی"Tn:A.nzzRfֲbGќ}\$UUdRehO-hU(g6B'vFx!j >\H'2x\xR~^ꈯ1`Os@q\㦌ܹ3aUϔ%[ؚHSSo6=V|\z'{d0ovKrʜ7WY4{D34;,ւDjmau|{<'QgѮOhl|g6W=-iQy0r?+'5b8yZ8 9fu涋*@do܍TkՒ;֧FȐcټ]no ORopdKsϢ?1g'drf<%5xn[Lp'4;QeZC|Ç\|cPL>K<^hK?b+YJm7*> g5~z >\Hډuqh5z!3MnB&tΙB0w0wylFDȮY׵[j_)>я!'J\Uइqm-&Mm"DR<71ѨbA.9]:@<)C1glx''~| 5݊T$PHm7HjwQ3dU"prZ2y FVw-Mwi?a~VKF%~-xޟ@[ MO;=Sa.8ff-'NA>2nP7XDS&z0^)?3~L&-8'`YvS/f^EҎou\_RnȤ6jR*OЖSK^`C>Ƞ'D\s \]Kζ ?b-}x,w~5.>=x-&OgЭ˩69ռUQ9ܹWفT' 7l$만{!7?|$ͯxdn`|ELyѫNS7i;ύuuME0^ȬRKF y~0Ul?h`?L"6Y/,{q:Sg5v~>|BmM_ϨIWhN]OI7Kڦ|姝ybN yjj'ngڰgz/\2' &}\4kݍKW<:oK+`+opňEd?Ӓs-[4,`obmpRؒ7l~3;]G;ay9s-gt~B]_DvOjۚ'i95'n̉L$ז7?TBr9՞Ӈ[&11-Ƭ#:S7q7:O-+ݼxBTksVεrBЃ[~rڤgy{~Hқdvuzw{U!1oT>$YOnN߆]>Kx_?G Jy3~z> '﫵(1m}j]joDv2x+|}K>o[1φ8DQcRHz0/D!5kXz+yq6-}N:%@)CM'^!x\) oK+3=lhOGӂ`\E 4րSK*HHA4ݽkD(pJi: 'OI`ǶNScJF !mkïG[gBqPwD\pB"Y31{ޯNEɨ"!$l%*d[p&TO&$SG]j7jmu(xݮnC)HO_5&@bS9,YX漽3/iFtJoVe{.de/4?>50g?w Ѣ j(EFݚ4IM7pYz7v hګ%vt(7".:^nCZҪJ%#y+>(Wm3Hteգc,4x9 85MCr&-!R6}EQY5N.Æ]]ͧ W'ZAWg }ej. 5`FjuIIvKMy wcB>%7|s^w:cۛɷ@ 6Aj\mb^tODIZ>ExgZTi ,).Y oH@iէ<7|-r |fkp2RBZEFylkg8J Jٜސ̒Q2e;Q}u{.}Voƥɠ][ No."T7c/1 ܇ұB& غKoin:pAE}͛KyꭟX_Qlr4"L ZW9D"¸ RK+EVbv @$*dlͶn:@h4I$3S+Q8%SH$Q8h8%xmR+g;<Ǚ-Vi8@lˏ},>p좰 uQ9\{d+R4vIa&6X=:w wXs]mAje Zr.ahJؼ%̬^XRऐ@>xrpl;%L/] P_GVf)zq 4pc3.bC;ыF NgƝ*>kO.SrR(^Gn6u@69nv$k'۶O|ٰmr|I%;=\teY Pnm" ]3=*Ӷ (cgZծL}9_|SL>ZN"ٙn% h\6o9 .p7em5ILF*Gz;6%LpvvQ4`f M˶1SjOFr6 {qϫYD>{o9c_SCo@J:5bV0iCNf/yybLX[V.?-ngf 'Y;Tim2o,xe ^tNj`.GE'w,1PXVϋ~[vg_ljWIFgU,xG ,@ "m:JPOf|ʘ-VvdWQ䴨Cus;ɍ+p ٺn3о)R)6ӻI!%?qpf2ތD VSZ˙(ٹ;, 6ZQb &J'R8cfP@L.OsV.ZOq#BfpFL!6-Zg%_r{&U?'.T>.U72ٟp@޿}ow_ɋN,CIX{S PPs'!("%5>Ǡpջ,ӄ}O#;9:b.9n[ZTɆtj[ĨCR{u]Ȉь]*)pjw,\].5|r"=|2ѠJPŻ&1|}OɝQJ%*EmK,3W5#M!B"ğ;]Z xpUĵhVdZA3G0!mhP9 s8ijO_(Wn. 6"N\wc=ۥ(QDz;Q(% a4dfzLdqȔ6ԋJ;h㉫r稇3NBVEuCNi{ "N<>](n'X2fELQ} z.~Qx"?WkE)|pH="oeyOx]z?sisyzIg`9i({z4mJci mX _UrFrP5v1r0nByqrN:.K%o5g!8O\;"گ;?Nb4O蚽{噆ddAu8gV )%ХTyCryZl-xeY'1<݆uarX컓!٠oeWh\\m,FF(u/ȭӖqϲ~&Z*ƽZ1Jl1ɠm)|#\̮BMreyYT/WMH$\}z_ۍ|>{7^$ӎ̡Z.8ќ50D!B86.E BA#xl†+]!8u3q`KYMؒl= hy'v:! f`evl";lǎA &i]zisS@";uN#qZ4 cWɾEE6H k2$54Abmte49fG<1JJǕ^G? 8D JEh=|2gJ$Ic(C>=ċh J ^b%oVސs9%+6 1rP2yK(C&ص[CBvlߍ{)Y45k# (xGu^.;& اO;d6xY2"F*'>xU>ܐvnw~ s"w!B %fѴbb] 4;ާs&Z+$5e>y%eK[|LR mtյAt1x2XrDN!4_!-ƚ"VX+)/3LU"[chL3HcFl6W.VMy(닁v5 !֤[{yB KDG5!dٚ(SڊRrc#Vr0秤e P֠\sV˒ˠvqB㊤k϶|[_o/ցInLmR@|3FZX+c!ZQ*y^ rރP!Q?/YԴȩmhz#MFy$*eʡqlmݚ̝Ou; 얠j,~6ŪQꜜfsf|ĹÚ+t?nk[%|ƬM PJyX|;ZD||VrQvFO1Թ%~b]|ifL %Ѭh7P{_ryyZWϢw)n7⽉!B=ȋ ͅqp]YY؈%! /hedEdL4Lp @[ j$H 1 A l0>[m'n,=1L@oz?5.h9AYxj<)O#:[ )Pe ORB&hKL S]o[L@6م 4;m0$֨ =,Q-ITjPv4f6 B$ʬ5b{R 0+8ĵ[AK`m`Y4:ȇ4[-2CIAaR^ɷBhi@ $irGM!eTW<Ŏ@5~&vvcRli!*@E~LWV,&r2XFmB O)*4~X>4Z<>k__& \W5M* VhX $!C.FR8GQEl}r^9l7D!B!z}%^΀ҥB-S|֥=EVH>JEZl-#!ئ M!uڿB#d";BSmÞTOvFRLݶu4[,,A"g;دʀ\SkhyUצ"F&Hߦc=,.|4[ Jb] i+bw`: @E)heQ!WrTJy'.CĴW w"vx1͠ >gHCA=vI6qnkqU@WPUp[I{ٷ\E?`] @ !Q"|)o;zikV1I-U* "D![!* κq-Sy<\C,I9 g~7]yBWLk-F,a2dIȌ+e7.d*7 JH*kwn-{D s LQzȾ% LÛ WuQb2(PHYzl[+Scg}006{A}LTE%>S<QCBjd6ųQk?%: qD {L4{A.mt[̣Z&L ZQ2hiG-rm? }lj"vl̍Ǧug8!o"Df(G:궓m{Qb !i>!0#aKcJd[-a%Q'@bAȍ!SOQ@=`5nIY"VԖ6 DQd\c<(6Tߙ! 3À JP$GQDATUTawUEňbu?p9!fWń"fP 8U} `@t~N:nw]HU#_ $Qvi6<߷p-#'*Xۼ5VkG.چZ~?7ȭ4[ϮP!A`(7׾Չ%J2۴Gm!v*{mʈɿJ Dka2#QRA%alW6,3[BUa1! PUt`9ϾXDqna+IN̋&GN }qX7~65C?yMcM^%k|JS>->KӺ]d6'!k.x̟k\ blm5um!!{n5#ꉈS1:[Sԇ_ž;22DRnTJr48PrFZ6Z;"X M8GyՊPƦC l@`Un`'t s g-)r 7ƳiH+|'l럭CX]ѿXUPUd6Z?vgc\իm (0QA_5K$2#>~+~b#Ư@ջ/7lD/S8QHa̘?82:{@=yS)ΛëO>Qg6l]v;SA<%AZ"A9ێ>u~Cck+GӥG [!JK}`8䄳/lŬ]#YXea6٦nݮ=C8!87Nu#b{JZE8I~ǒh;qŠunXbxn]G^#z5GlOK{Blp.-B-sbuC|SGJ}{BDuhXH$P.38\ࡌʻt(Awz"Y[\Ep lp!oF۳ Lрz=f^pD ՝&H 2RL h(ت0'svƐdc8mbw;uoTGs >}J y'GQloQTd{笝~ɥ/sщ͖x#i 3-frrH's=7rnz}.hjj,)=Gj9eԷCISYx/hw>M#[sX+y4y<#|-L䩧aiG683c B܉L f/-'Q؉>'_.ML_~ڍa9wIW^Z)j:N ݏ?Fǹo>/`yI.GsԹ#n5\9y…bG+?Hp=i2a<\FW=biӺA2yuw$s[aMy[g>4J/;C"RW`SX\$>n$n7)YWϽn܍\πb ;rerK6:4{:#rZ_xzu'Sf-'U GґY7Ϧ`2*Qa(}g,|3:u~:-r tv oTW>e[JVd|ڶߍރŒ?pSؽ{(I&?n|vTW}^kbtqޚtygO?] }YXdw_n{O {l.d.:(MɈc وLQj T& n-yX-ߨ#%%w\i7|àpv_I7b=%E _Fp7I^rz_ާym<2fo&7V~zDD^7t@~[es+p$ꯘ|ϛ4%n~&z>}zt=>*+e;?;e-ͱWEӹ׸龛:Mo ~2^^=3{K7:->gy֩x|QgaKlm| {z|KO߉w[rv=nz%.s][4$߿V {^a?N'7q_Ǹg8yox)_̻7^gM䒇_qG?w|Xbנb o{\k\,}N \̱CZe\~3.[%IS)f;u\+iݩcg:tv.Ͼ 3P9)cĨ:s@;:e FUMNh%`Jq*˰ OL8(z9f2yWڧ:GQn -7> l-ǝ#M{oy@J>_#c>t=A喷FS븡 v S! 9qu2⫉2U\u`FoА&4!/;[հRPE };rs득ÌVcرQYw˒̛&qo[@VV; ݟy9˓2{nO JOl^ !(k@tKo;^"Q5ݏ>3^`f]}pw"+|4޳.|D 3FtԉĒm'['QSoԈԗ|>yoZZȦ~طwsz'үmC:4뺒9{]3t܆: h}+6XYڅú0'A6ƣqܬBD(M3{Ma9ҿG")r{g@d%m/vn+|t5\xx^eiΐۢSEhߵ'-ZNzaɯpMWЭײ~]1r t%O,^te͚15! mOF°:)2~14[!$vcc\`?O6E̲FXj=o~7gx{ʲ*?c"q}2RUl~ z[H{W^.$)Wz] V^|-.99YӫZhJ!$o%nj5Y7z^qD92D||?~ ߔiIr['~YXoU`_1 &[_U6o>>8®?M>~dewBjhaTG1R4/pɦQQ#֭Mp5~!A;F[K兺<O| YuCdk}xѠ1M%HxBu S>e114,z נRI=o~Mڶu[|dp^NHlP"FX-)N dk ;6hẗZaƀF RsWG7k/y¨I\_i.bDs~9R+2}Tɞ `lzc N4X$Nz9&jJ$@V }$RIڢ<(ɦ}я|\J!ѵc9^Fj\u5$/}+v:0bla݌,Xx)NKHSۉ^ʫW 3S%Rܤ-EwcFH1tq.noWaXX*X;/IAMZ$Hcߵ!gͣqÿ`b9a߾s;ah͝w=Uh76?>:Aw% 1`BbWH^AzwgXUCw=+k/\І)Rաz%¿Orz-]!{ ` WO+ږËl;wĶe_D; 9eoxYlv_ϙŘ3;1=)} >KWQ]u򰮢U՞{2Y:IxH,YC}PL[PH`R%Xe za祓xy귔)YVBܛ;>8 R{O&9iS\-/yw۞t &;ҫ6zo~aQ##g>ϲr߼"_Z]rs*&{۲.C!IFtkWc)|/SSb!+ szA9v~3 IDAT:sﱪBUw+k}CnA>K泪ܷNgoV-_|WJVSn-_ @^T*UC-c~w25H&O~A$2M[< VμJ5uec&2h;5;׿i҉ko莙{=o͢* _'Y.2o '%_MFtJ0Rk QH0"-\å>@H6hU^)N9-6A޲yOP 3 r6Ql$n$!$@?qhAeJW/ #NY^Ma֡;mbmF$.\gWxA*;C虯hjF)El9la104oG]OSrq<ƻwكt)e%v; gϣ^دmC$ ,,)rA1Eq-hy{ t}J5 |%~*W;o7N@͆0@_̥^q i[@/[mS!O";!WйYL苏?c&L"~*ŧӦpyer,V`퐌iٞU kӔ FKQJBMȇAQt#\ lD]&¶V ۲%5cȀc0&v'O&{Щj ӅNI;d_ކ,m}}w{xK#D6YYp\2XyvPZe*OmөurɫW~ڷyM"Η'$=ZږM5Vg1n{/)crwjQT/ߩ5ucT5jHJYd' /r٫=/cojn#;Cxc%صs7֫ǥ'FxǞW~=R)*ʸsM/eҤ))Nx!3K3cri1p$ rw9c?<3ȡȗD?gF8$ݰ9oa5fat reo0~LrjYC#9 <GHl^Cv<2ZoejU;.q/G'3Rn'̷H?ӭ[O~*f\~ݻk䋔dUq9|_Yy9G۝ _W6|BHV&t_췏5T2iTgTcJ*RQ]@ mi]:]:\@XDt~%>"l@O4.$L{naku1BTUDЖ%nl@ ƏZ$u'R_ul}GIns=¨_ZVT`ADۇ? C#I<)cVA=51cƘٳg+WӦMrJ/'''QZZ]~y"'"t|ٯm11et}NTx .y/GO O/:zq-F!z^d> -JmdE.GnA]\gǰ6"1s~=r,My+M} cog/D^ċG#aÏ>udeeH$66G51t+J,/2R H&+QA6r(Q1bБ=eA#oo'VQbc^iٮA@)~Um `l$!L#D 0J Dʋ>\܀CҪjv^F x.` o0JP=[0(A5ii-@@tc#Qk9$S# [cll n0#NOT%"̦90l 8GE|#(/^f5'Q?m0@` VNMc2U#d>eX%C SEsQbaeDPF >:c"=]XXO?e>,rZ. ѢCS[ƶ[aI!oH$b#F? tTxs`s#F .16?Q,@eO*% N%l bV&O0֮m\'"X=-l0Lt;݈a 3EtT!j+= bd]k2 eCiM'!!4y橘2!, F8E%4EP+֚կv0@kiZ惡 1vtNhCcs K:r.O2e4#0Tacꡌ=@r10h]Pe%1bĈc oT'㷇쮺9J!' Q8v4RR>4LZrWC){ax{,`nRd*@@hDl = Hr> 0*cķ#`@,T Â}% D dGMNY][=m*:݂2`Pi ܈c4QGvZ5DP9~pn]X;[۪6DDhQgWQjSdG1bĈcsCWBWVbtĹJ FJ JZUK"* 08:AiDFE @-*%>j} Mvf?,6jY9GTΞ;FsA&1Vh2A+רyYԶ{2pHt%32$[tyC۶,[?Kxae I2v)kccf,}}_qu[=ys029eS r[8oel!Nj>]7n_Dڈv]&ٞm֔9u^?PyLlF^ՂW<"wgԩ7+yh\?V1gʻ,p}\VbZгG̠ }x ov'io$w_Z;".G 7V kqqic.'ڮ|k3`J2,@ϝ>@“%AqB> Of0(Ytɂ:;''A-Q jS`bk2aC~U !_}(QO*vcsdb]Gp_ʲ6}޵@٫go)l0nA-˧nxgѪAZ~X?)no}Zg\]i@Y<\IS;uU`c ވ |1(0<$< ߪ ]I.Шn0@6&vAQDz eۢ/zX=-_ە1APXMD6kYj=#hN5a*B]Wu!kYCࡍ)C3tR--Zz1ble0Q6{|c/]"3#NxIO `w:}2k?Ǩڑ SYN>jNNِ+}S1gGy~ҳ\w!ל|^S LyP~=F橇8})kʒϲg.'9얉d~u,6ILS>^Jˍ%x8}{a}dM1~4r񦐦Ix hBi\T@źbBj^cĈ#Ft<ó9zp$x/JLO7P A.:h.b;ڙw9+M\-i‘ǎHHHg$H:)pJP<;'[n$MiLgMZPuXF|MrsF:(bCPh=Em^0'pƷEXTTY}VT7~K#&1~)*N>UTW6R<[Fȯ)=ee^Ĕ ٳGC͎Of1ol͙ܩW2 ~x ~cg2O- 1o&V)R%巘hN&v$tI>K\ KjegStM )[Ĥ۞K(u߾(R|+L_*1dשGDu1@nYJ`KXBvY}lk}/ѩYױ)1bĈ#ƆaChەWZ~K͈LuƤ:,>~w'Ӧ@ QhG,Au7tY"EQKpKCMz%5 et :VMF=Q{wPk3==t#؈e Du-.^|G,żbl1g=Ê$I_jx(߽>>e{ VggyڭpUQm[GqvJMfŘ~1yڿLJ"FD|؝.ʀa8![n[:zCw$A#F3r圿wdq(u1.XJjVjz_^uaӧkE2۸}Mv0{Lcs~o.t8aCu5/,#F1blƀ1:x QF}Z)tmVDƋn*nF@ Vy "JtejiFcqBy>s$tpx(Ġ#b4&BɟtQudQDWkv0M ~ 1::t8KF FDa+2!`|;+gP?ݕlOfiJ} ~S0Y܅=H#7@UTemwG4 z}Al[Ʉ:2n|- 7"02 7$<eqcƌ1g6+W4%%%M6fʕ^NNN}?~9@]rE$OD=‹gsOٳ_H#)Sߧo lv">p1~%2dEm-Lmu1bl!~1[$++D"ywgrN(/TWSUr*Y~5("~", '|{Gj z/E ;g 1JҌcsYbV <X47;/f[(AV(/i6QVNFuBQJFcu+ \1`c< C3Bк7[l9zVLK,m/+ WwF'"Q۶}@` fu.F 4M>D֑ x<5lTDpmш\R9=ۀI u;`ccL@EvvvUYYYyչ~UUUI&… %//O4i":t1cDJ@(1bĈ A PI%׀6 @ۜ5ƞA5"js$ Yg(;}g&{2AMw! Ȣ/"KED (** /# !dL9U$$(owW:ԩ{骮=XּܢET`~ڈ!F8kLpVpO}F0/ ŋdIDHOc GHݏ|oc9nb1Q I6*Pc ] {|QTJ]plJ4xl؈-02_bsV ~0[I vm%B@*x52t^Al[(r%>5k]tJ]GsG2tк%J(фddA|MhN{f#Y6*ޯ_RXp$y.=/Ĩ%Vj*cSb'`-P d)UR[Kf 2b#OiDɩAUQ^Y"V3m>)E'XL rVP8Q-H0f?|Su"ڨ,N?664ۏj="bNLa>7l_faԜźPPAE/ؔn*HF* DD% |0*Z]O=o[{=K^D%>w$|$V~#0AYyŃB$aFA>gK4ߌ#m= AJ*LAXw(V ¢ng v@FbKU\mOP<}n7YD)rp*Ha4M($F?G4AT 3bP)`ĢS9T]S0IJ pЮb6:T56=]k5X; QT*h50Z̈́Ǟ'_(r%>2PU~~Uw}4i7\}̔&Aȸqe&tտv-?ҧȺ0U{72|T#?ƌyDy[L&klBe!ĪDOxOV[n{M}y{ʔ-[o ΰm7n ::ӟO<78B@Dzx!# &`AWQ~o#%_X, 1lP'Ǒ#rɒ F$شHlq$&l1$`PrwU$iրٌr•R*w3#iWtU+bu#Dek1TcŦKVLuqSLE$}NJsbsD}^ mn;E)^wn9΍ " P+>**6l|DQH+e[MokM A!: J!K=(Qć9dѴ( YajL8j\Zg'M.5:]w܆ϞG\ v;._ns6tKv83ՇQЖ۸97 (sn>O9ןy0;o3ͷ"'o<{۶lVr<6+*~ ~yWrX~;5>>~g'b,[u4W<>f ȅ{3~v!΃~ö[1v8Ǚw.x~+)T|Elvz<0;@x&Dz^x-njc_wgmgbJ|.񛗙_׎JS? q_@(Wm[M؟~sd|4ۜK~wΡl6n'8^{sBছofM7ecT|wԨQPw^MFpa_ۖ";9ksܱ'i|ԳYPް>?w;:_9\}(c:"Ok7a@#@FϷ+p!s?m,b4~qi0Wsі#rv-ڔ97KnUl m+}&~S{:-xZ?>V?@$ίN:{?sW9Z| 5(mw?Ɗ4O|l.w,0(̞=S>4f3ed{P 7^{rFPr1w\x!aK|L>W::jI|$(sA@4qA&yB#)uEEN0b9l&UnMFbAq2gYM#8">ڇb>ip^b LANU2gNFMg7JfKMbN& .Flaׇnl)U; k א [[# 6R\\mn):_ X[E3隉R(q1gP-U5H2~CʑIoȤ׆ev|zMR{4K(QCZFeT*{1>2lкmG!2,Z6YL4:?]sU}~ ESs+~v~Mu@i-9MMSV[~8;96岴1xXo+c }in SߜBU3?.;od'OH }Kl0 ~|7\]s+ ʛL}7UDVڃ-Co.p,aL8P6@nY̯N΅AxSngc1R-X}لMм챹н˝ϖ۞&@ Ge57~z?ގ0p@O7YU6tSV^i%zH (%])ʕ? >z*O=_z)t-{u9Lt+AA%+'/ v^kd+#hoX|!f-YoEWĕYPT$'OK-FY][;mzjRTA-5R@jv.28e^1)Wlg7\ԟ6Hs'%fkvbŠhD<.=eTQ4øjYC-^.PEM< Xe|i]Zu[Z(GK(I'T;8#x'җUfLC 36ÛDp?f̘3/Wjw}:Qdd SJħ'fLA?Hay6ː!}]Lk?틀[ʕ7?Λ- ?9Y3 #aDrCم7}Gk-xI q͝\ ٭_gm;Lx?A|⭒l0tU*VO+}EUi;wɞ a፩dY/ă>cnvbܸqt: 6I`^{aXG,ַBDS@P4CL'G~ Q'="6,>4$gu1-vݛҠa$Oz>NU#l^;, 2F[(~i(,LH =Qn!@ X# @jlCm0o.(WWDy,?z4|3_=2<{g]9^ 7O?4,>t(4W^chL^B0eZ ÆCA 0wޭ§Ian(-f3sNB LWddc/: QGt>q |-RY?Ylj yՓ0u:]fX6ikW93 ̟ʈ d~9kt+9jH{ᑿγ9XgP2xmWn8Z)RHIYB^΍*6r12EuܘYY<0j# 6glmعJ IDATzrbvm FЬM e<k42'6eW {&;hNԀh$w<> !6ZΊۻS U#ˑ-fh<R!X2r3/X蛈[=.>`V׀ B&d%'r-~ 5tvBda ~x{E%J,}Y(Qc9VXC>Zk+|A5c9fgg÷~.OݲJLq(mV B_w%նfg{ClE_Uyz: -/?(̍\'aq1l6z.%K/(h$#8ΚAѬ|2jL.y'6"c&c̋Ӈѡ䚻'SmT\^|Ⓝyo+Ÿ;?3_Gpitoe.'s:;gU%[avZ ~rك9?);D#* ;}ǽ˜6:;;yg4ޝ>1uTj%b@D RNb?aN }g#YP?Z 6bL)GB-vD$L@U4MD׻4A'kVH*fR#8J7f< v{!y!obEbC@ xj|sr&ȷD\&ھˬk.cHm]4N==)+&RZ"͞h|\3` b`~h.J槪jD:^3K.a疧Lə$_Jwv ,rDDruס1V\QV\,˘477S_%_s^jl?ǨZX+1e n~H6З~.<_0u^K`Mƹe#2`ٍ+-dCNw*z5d[pw}盌wg8$ s ?p6}q͈Ύ?ɲ按py{&~fc3{iQkb/Ǯ/ň&lu? v*'ukzkK[N?tygdڴi&+L6-kiig!}6wuu,맪Tu7ݼw;<0vfݔux:,O2n%>⾸ZVUU^}l y=, :kf]z[oa1I2hBLއ_%JfJRGJ] tvgnۻ̛;U]@g|]T;ٵjl9mB)vvCq;bjރR*C-"rtU3B4J\L,bǙz9xzԙbXN?VO7-D2ylUkJQ鳞qOE]wyW)"m!v`Asssy,ׯ_ ><+:`>|zG>b%J|+dN;u#;Ϗr[KVT$(Qć YFViB*Md& #4@}^'su{q+=Q㞙^#ՔVMe O]Ǻj~AQ 4\мx)FVù @U$/36[P5hj-'>8QȌLo#ӍilgovcVv4#V&zoInM i]0$(lSiS'[p}̒`:ӯRUU$@%d=x~,Ct\>Eck ~@ ӯIK%J|$1tP8%J(1 輝'̛CĔ}{zr. YӼ(T +H[-79} F|8X52[P 6Q*bRr#b!Fz:\}\mn5}DXL:Zߌ ϥgٸUہN 9TPK .QD%J(#D2J,qjZ [*t!"mB|dQ$W3n"QO[ZKu9ӧXG̳/2HF{hGBhQȡL5rwl O/j#YQB`t y TZL[b-.Vm0~doD}qAԏZ Vu~!V  JѦ9hv NFojDX{Is*NfFVz 5Qu5@j@fbJ؉Zlmk u͂%BW:}*Cm]KW#)QD%JX\5a>,>w$C"m$KU( .%)Mle#x^qP#=q-5vJN|!)5.A0diB| Rj`؊ٞ1ώ1tqQ]͝SVfJ)+ 8i˘*OIEC18 Y4E$hrي(zw7ɋv-+7 xoebD9ϵ [$5"l>C"`fHP*dY3Y[_iЃwPG W|:pݱR0 ㈞B$yl#;pV>dC IJ#qS@"RTa'&6l^Q*ybA`nLxɋ62qi" AA jTsv1ߘIhwW?懊:[)w*gטxuЃ.׫һ.CVk'PՃ%Q.QD%J(񡇈GRibyeο Th,'3: H12q||?n"f;!$J֎S' D'ulNH0=E v\qdL8 .s $;jy="'\MONnWo5bj!G5xl԰TrK7J(QD"BViBgJWHt&Nn3)2#AG2ć_3|٨X]!X)7f}hTQdQ3)1`ya5(o)NvqŤR1VP(ӚsIF0=BU-QRV&GjsG^N i7J8`vM[-GIrbI?ד&k;IG۷TooxQmʫfFM%{:kUs=гϚt}!ڞB,BFǥ.|D;1 iK?%J(QDK J^%Mu,PhۑɎIBI^{fI@$ɊRӲBy ^R3շbaU=GtCQ dt#oT;̊DC6HufGD3GnŷD8;րErHIU߀ ƞWuqYQӥQ0ԷsȮӬjd*,4(+ILX1 H BU%#Cc .doU5ߊ˙BcX1SF6d,j7|1Rs(1fȏLe6>j"'4/H~:կq?O@Q:o`o<%e[,F{AB m{v}O^ DX̋pC$XsڹtGv XD,䷧ק&j%>X؝FT*#YeGl*QD%JX,JMM-d{NY$gbE'v%-65g|%_# 8eN"1D#}PDr93n$ ؔ۸bs1csH$р@dH"o:%4#aHb$SVWGNESw2 $f>-lclDҶbxw[=D'2橪M7W]Yr b.yswox5F[7\^@)6^,:+܎mP]G3A={QI.Wԧ㯊;QsZ>*Q#ˎ\1G %J(QD {ETss Mͽ*6zlV@.@/B=|Gz萓BG8phHj!!'$)"OuALV'RH$⾹,( F 1^q9䟑H7r! /am rqC_(@`QnJ))܋}MRheZNKk&1uh 1kG@-~*4k]qU"5fGKuB]\gDrvO@ inp],-9wˎ~[^']},v $@∬ڥ|SB A {y]  {lu >?ALh)F"ܶ߂GUC|: _o:'_]g|[)<X4rp fI|JEQl B$HoiE GYp?!,^/of+JKϐ@\:> >Dy2JƘZ?|m8)P.I6 J(QD%JCTijMKK2i‡!=[xwNDl%뺞~*R05!-`${2Cӊ0jL7J!'bƂ￟{,ecƌgW]K(QGrrKo*M-d dRDaNT!Gɤ~l+ * P"B|i#tb% &fq TV!dI|GX4`C$}j9Cj>Zh6]jJY̆9Hvlg,8ӓkM1e+\{QB'%MU<#Ӝy&XD亊RܳT#'lQ'Z{ĊIR?Nϑ[kBF݁3 e 1M\wA`qZn_Piocm6'ޖ`զQx#?_,A P:T֗J\DϢ S&Ofƌ\vL\s<1sLvЈO~xt#iJp'IPo6d{)(?]wK/Lgg'Z[|z;w.:kFcU+_䘣bQ{q7]w٥.?J|pϤMMʹ4MMͤ ֹ*[/VV= x}DBNߟ "N8ꏅ("8:{3Rn?s 6YjjRm4+^R38S]ﶵE? ݉#ĘG3fX^`ԨQl[yKWggYV9|B7QF-^6ǯ3wZEM跰,g |\P{V.OLT(o/]Ƨ>)N>$?\r|ӟO?t]GgqL2[YaOKWUc,;rd]K~BKTZȲJGbSc^Զgou^de|sl5/L<[leFlzrB'RvI&`#F6L6Sb]N5nsF~7ώnZ׹XzU6*ԘgGS }pb2,Eͯý~hD^MĪ6hFy> zdi yLۋ{SLϱE4)߂oAM]s_R[^NϼPUu>'[NRQ!+/3c KKknnf!)%* 55LymƤK.R?_*< 'x"Gy$tPcd,x R=z'5-f IDAT yx9{y-cȪ9̈́7~ˇ <ټ?:;U7cC)ηgVw0' +Q| {<G ?yƷ1-@c?9sS Vy֭6T/…g;_h2d@ʯN}+ΝčONa~e+ݏڋ5 Lly%|{ۗ |o8jfjOq7fM/^s~˔ Xug;f /"~7ik^-&_1=/0+yL{w/xn2䞜فjlM~R'}'nZ^`ݵfwgvogɜoEj5xIT*yé*묻.|Q&#}SikkcVH%;a~ԒJ9# `6|OXeb".YSM:CE`;{(rn TE}4Ty&9T"\ W$J[WBunP+c7,Fd bqKs }S H^mYQδZDuJz%Xdk#GNIꚞV`1$"i4S@E-Nw6a׉Z܋7nXU)I@^7>B0b0= v)b`uPjjRR%/2|aKwgg//^F"Jxիw;׏8oNZe?ꫯXdȆc ~/~WZw<ʐ.fpeъg8#N+jك#.Ӈ^[xrr3맩ɳWYOz5~ͯw-@ip7Vy|39̸lN;})X9Q}xlz._1s_{_|c"slÇ ge 6cg̙ %azTiF*7{ays[ny4P,r!4ӛ#FKk=Zɺ1=nyrPOIX΃)bNzQ:n)-ԝFخ=C*y"QXVKHvHwY?{`zk 8IOcq<=nF\FgD)VX ~)Bgͥo3`VW^4NS*-M4*0cƬ%"Beq睜viqsKDVsLmwLc_bA{v}}^/B7af>rçW)2AkoB?ϝ~lf>3{#7Ќ*8t0~#GA†2afn+~[9S9f֬Yoqʩr_'F㏣tttnX'S"dJ|9a9D,WsF,xqp)4B-/Vn䏓|ut(U[ު`(Z*@s\qL$5yF^)sio$YLl4:u鷅[rP034jس.,h*_8q~CG(ĩq!(iVR(-^-eWE aPcF!եn JY}M,!WUP+055߫9&]oV7POWu2kӫPMi,U,宮.zZ;%>hii)ܗBDݻ7G}t]^˼vvm$p6f^Oa/_GoDZ+fLh%td`v@'Y~TavLn_(~6Fkә6}oZߎl0\T~t\fΪ1|y@2(\@=9G2o2lj2p#3130k,d2 _[u?]Y?Z[{YF6`,##<>}͝Kޘӄ 4aj}vbt[naڴi[,2J4prYq!¼]ttuT4XW=jq*)Xd>f#7݇$W BV7 "YK5JEF<r6RL~O?̩d*"y̩;(FM>}UUˣSTj]K&n ,lIJ\6!Sl5j9[=\ ) yqx5y uޤu{Rt-] 4O/U\D.,.9* "uko稣;gGј}7b-gu/˾V~"2 ԛ_}en@@I|8g2".]!#r|oeğd4Œwg,ciF[[XD6^bF6 gpߙ:OGԷyGiSo],x:g1'bu1(vRJ1p@ _W.},}zf͵O=ƛofloNQwP$ʕJ3fJT #"js;2'Z=湺ɏID\Eq A]Ҏ̌+јT#꿀$6طjF1] v(xZ %Jbq:#8;v,?_o?wߺc}fWo~#8ŸYz[=Cya-vj9ad.gfڳF3yי~Ag>8~XR yMkxNJu<ч ؀w^ott2p =49x ڞ}FoΫ>ͯ~(t;~t=S6!M-k[5),F}.}._K1l`+ " iJǏ{eN[3mN@~xVu6h#L6Ϭjc82%u-5aO4Z^Q'uנiEX eOsˊ@ql+n–;4G, ~;7+o6l*Wɳ$m=\ⷒ^O 2\bo"?6cz)Y`_)JFc=c&QԫL/9b=˛=(J[j*$Y^WgGMAizM5MɦhPlGur^vHe<iFe$H%[(GK(oE $dY=Cxw. kn϶}~oV;Cb'K1|K/2y!aytr3MWrw>< 0`Ӹ Y8Gpb/Y+ ia98m}!Qy 9hful1^ˬn:γS|쳘h?+ٗ OٞOəI_gfPOˎfc2u0|;|_b 1j{-OvOŅ?=_+]g*~=zBwمaC3pڷź˞{ѨbhjjܨQ > 5݆X)\GFU\# !sŏQ4x"jU#74GVZ&(L^wKEAgRڠJ5Fkb& ~CUTV, uw;ѩ8}.>,Q;9ANV.h/=,S2PwrA3Q%LFyQ{;ɖd6ݘLK-1fz&!tx BKz-Tc @@L`0$\eKt;թldžwgvC ѪLTGPOKcjŌ ƍI&ISS477ˈ#I h޼yJk۷oT+j1uƘ<8lx{-"X|ygje꫌~n х!䨵&c8X,F.P`8C?;ng$A#Hmzč! *o&&&/l"JDhb#eqwr+]_#Z}Zk Ij1I(@ +\(Q9gJ:uuLGkMFklfϚƬ<ۈM;q?X8(raqSnV"a3GJUb4s-`$Q E3im:Ľi;:oI$K0^)oH whc*ebәNSRe]x[.uc]Yx)* RɵMqq)!g@@vR9lNP' ׀ p_}N eCwv6}qe k$=g`3b-hA1 m" mF!j9(U D*"J"G3X'wmEd4k|{KKKRF zɦ444#Gqƹ̔F<{ooo率Ϙ͊uੈf`Wxw]uj |vEErEqaR$pERJL$`h-NAmgQjAMt٥}/,\|_> Q'CPM/#5-&O&[fE Nn@BH 0:ZNJSK]V$''̴oB6rl^JtŕGkIxRT"NoIbO$Vέ' R.|;A;-Po:GSEFZw'bر` k_}w_ [\\\\R]nC}ɡJˉ SC쌚UNu7*apLBr,B'R[xFv'tGͦ^Ω+#M7Ilvz1(+@g/ >m>t, /æ q$scp,YkPmx҈ buOW2iQ1{.KVYsgVrNRlV8h8;-vV؀q_(G!.B1Xb?c?m 4v=rvfEʏ=ػK%bp][,iC.e)23C`,{kI;%l}kJyiqX ^OYy1V*.76m-6 ecKh^11c@lxUDPBB"+UwϕG#;\ن폠+zm]]6>oK—[m9 fړcrK5ZީɯKWvrߏϞ_^æv |)=̲@ X|tחugXODYgBLNs;J^ eL_r[@`{>$1܀*BϺ9ɸMT"S g`)XGΧ8t|j F1 uYƘw.đ⬼M5QRc36^[F\ Xow_J*alॸ+j}[6ծEH87[.6G3ⴳvs+>]k?XY]cx}7 Z+t, N$7l:.^*7NR͋->CdZ}w]"RDCT{^(}Z~ٵ 6"\rH.zP~CYL:Iܼj_2|GDZ+/8S 1;޻ g*~= J;ͭ?УnQuD2p/WgٳLu*=fO؛6Xv3_cNTX5nY;NUCLZyF1z%sIJ)*mK+"v.^Xt!(" "s#i1,$b X1fű'#nF]kCd'@@ u^3I{NBsm\{wm(qqvk36λͯ#)+{G8hqɲ˛?ĺOࢳn %/֍_{Z[1 !vO l0`1bOA ׿{$0AClk (P EE-BGcAQ@i]\t*h'd2uen.@NN ˒k(=e `Ws(eXG9RD*Oˮ#c@EW˴#ɣr<UQ(,,?W9@"OcWÞHf;Үq<vԃH̼Oll|1x$ +/5[~{kN>78K "0s?+yyKyd-P$x[ы0x YXj A$UUt1 TQbArfÍ!-p+|[H) 4[' 2*v:-aܟ XQ($NȺ*k/0-3;XxaDJ¿oK2jUa`2v+cn׸wuB^Z$ԭ11RbRnl> Vk%rB$v$ʠ NȦ0`Kĺ6b3%q IDATC/q[7Flzιb?)r(y1r9˲UWD,>jܽ~\p>0EnOmR[˱~V}W_um9C=1#K90{pGXf糹kWbw~ŕ?]:opفW=޲?_{4KWƴyu,&'^uOY8܏]X`cofc׹DrVyw%dK4G~] rrjb]DbALL"Ny`g A`ņs(TcXiu l%ĸG"7ʤ y>=fFe5bϰYϨ4Z{Y޹ `噱l$ɋVl,\AkY1Vjc[jh-=v)Fƺږ.FhYh*m}+VniA $9W|وytƚ*"ysMYEӺN6dZ78a )f5w0M3/V/xؙcQB;`G@ fL;mΊhUTBBd^Cϧcݿn$Y`YO=2U3=zzs~ݮwcg?]^CD|mųk݄x*]p2׏ڎ!eO/ϵq[~z[ypiW0dc8׬7UOyx5XM"~[/~NGӟ|Bʶ/_旹'' ?1Fp{7hy@^.ܱo*@{*f?(ˮu,l_Vru૓fJݯUtڬ VEÜMXѐeȀręc{K'F[N%u;s 5!xMsiIDž%LDYo6,qiqy6\^|s01xQJc#N37nnzNj{B Tg%sf>Np\i$嚸lG*-JqVb^[.җNkbqor 26+u] 'pS/plD@&^/AEyDHCEvF a;kl7rb oq,fj\UPn<[8Dn~;_A!öbs&'3QD f<>ymn! gw&ѐi-xr6 "*PILxl{b>̅ SSxL#:7Ajl=w^_30 ,-XD(L,0wnmv*6eupXg^H<0+6}0L/`,m\Y _ EPR%?YU ^z[{kl۰;;֞em3"θsI>)6D.I)`SqɁMs:<=SnkDYwVEF ^zITHE)nfY7 VJ2"bkT ;>i-shmcՔ{d@ݎ sb;֌;xh0ŌYR UJ YJЁy{< B傟3:3TVXhf ^olCEO[(t κuCi3Æϧd$v@ $3o<>C )2U:tٙLGQ\|6 Et9tthXX!Dn]"+PnW%ޯNF]C\i1~Ը cFO+Y`+0)gsm'9k?qv_bn>lp3ñ`"!!Km"r93ޓMk)4_0(ܵ/u\9xlw/:Gj>8$ N(mzƹN5~}"N۰@%D&|M5MIU vV/8ٍ(̲..aٙcq^eGW'n@By馺(Lkk) 濹{2,a{":mt3@NՖ;Y;)kH*gMsuS#M `5р~)՝nbZSjzW\C3ຑȑ'I~q%WYji3vO)7Y/z{=O\ 3h >͛K$"BMM_ J!oALdv F7I`r(O1cA4m-24Xi3`Vߖ:ԥSQb}kl#1XFW-Zܻ q.*F8ZBYtClbl(ā'caNW."%7ف[ "pdp^ĠDh{^}(AɪНxB(MPZmv[?]J+д-KJP&0v) q_︘x6-TnAB(JqKri'Nf|ŕ~؝#|}%'%*-(J)j(2Y $b-++,b w4x̼iQ247-$֥^(g@}xYG=Vb3ig0԰c9%U<\~ys4W_}4G_p U=S`7~ gvVjv Zdz:G{ Lbnc»́)~Y)G/8{̞@JMcϻKۥl|HwBn$QD._Q9h1kЦ}o@(n1CI;7ѤJ't'$,+I b/E(쾯z{[ >+f/>)ZAe;S$㢳3Oڥ̰Q<^%a@\lD؇8{[zo[M>|;KU* Ihرwϼ˘50/1Ne-D*p fq)D:RT̲Xq7nL4IYF!MMMYUWWG"Z BAk'Ƙ:@6Z92#d/mQr%t`d.C,ݡdvv* Ɵ{xqf@ ;K,^fiuS,ADOw.^c߱ \՝#NIyٺ1i_%4B*eu&15Yմ;)PbJCkOtr{fpB٪f;ilּ_gꣶ83pL\'Ά>7^iڴ>DpcT|)S+Ibٴt-Ӕ #e^*R~{W ӧO7uuuY.P^Yeը~v t_*,@ԹJǴHN _?{w]Jk%@ +mVW"Rf6Ol'{jrL{?%/k˸(mk P6Ƹs_E6R}%qLԈ1YPo^V׵{8Hƙ'\Ukؔ{*#ix&gg1ISQ\LwbřQ}OˮiOr,켟h;:҉o\D ildҙ̰"k]ux%= 庺:uΖ(l@ Ӫԁ?"8+.}.6{+@ Yܟu"8kWI U t@vG)!*LToJ(++o(ŧ\HrmS f~gyOi&;k(4rdFrwK{4>tp3I AaEV* t%d}J}vX)!eZ\έ!S&.Okk_t*oGWK}1&MbȐ!=VmB γ<}EQx]i;Ow;@ ͦ\ڮs\$ww`ᒔ9TUז; \vKdm{^,~pz_TTƍ3ƍcҤI455wRhDg1-,J"ٟg i|{XJ~*YgoWI$gJׁ@ Xzi1=fiu P,qA҃He1&mu*I44odn]e@ 5"\B9NUUU*-\>5DMM߬Q`)B0d&&{̚{RГ'@ |5jj.7sP"ɓ'*R(,yWÆ-5 ,n%$sWǴ}wx@7dJuEO@ (g1idpXg[ny}>^Y%0 z cag:Q߯S?μyց%firӕ@ t%t]}޸ o;"BMM_ [~uuYEbsq: &"jkkׯ_֪"QK%JG.q%@ *T ߲n-Y ,P멯ZK{4Irzh@ d: @ Xr fӕ02qDsp@`AԷh¨d]@`#@ P$2$v{i|Ha.="5Iʁ@`SI{s< @V͞t8Gwb@`$@ HJ,Cׂ:(܄f XdJ'@ ,݉eb&9CO̮@OԿtEo] 7|]@ XB9,vz;a@B_\Po5_E<R_o. U( iҁ@`aSo E(wtt "&0z 0 @ YثU @ o3_[(+Wb1kXПaN֬WcFNg> TݙsޖYL8y'Jmf7fz'1:}:V+P,'9nzO#\uk'o Y8W[0zBrƷ  H4t}Fe-G9Ec1@ F""Q|M`P^`G{}w_H!2kn0'q1 d{ɍW/x o21p10@ x74F_m;:(^.q]r'/NOav;tv?{oXl6\'}C֧pǩ^fν`V/ -|LnG@7/^bx9aߑ/qLlvi5蛎†n+᥏B l s>}_#2A9q?Nyøm*l}ʣ\yyT[X0#|<Ͷ=x*÷!))<~\Lo/0hm9#3="iW] OF \c~{!ˑ_{P@3lx+ws>>?{['NffAp O3gBv1'qƃQI\ye}7{թsPgI/? &62U6<:oT-J11f.{TCŸ>gFn??jN|;\Υ?˻3;8r ^Tv/Y{8TOq>gEpsVQ?Նty;_ op3W,s>omeٜ0GkxΣkFSĕH;.&{'k8tBڧ5p#oW#ʙ\rNۤ |U[q?ߛ ;_R,?8~=2_pG!@pj3d6⊃/}7{_Z[}g~qL T+gpN+Q-ՏtΓa'㖉e[-# ?ޛԥvP@  P(|>or(iL7K.6;M"3:}EIDATtm=ï.b5op*>SowSߠܗफw2[:sθ;Hq9n>pCsQy73ѮG4z>\s)s"7;;wݗ6ndm|\_I|菹3xrȑ\s|,;~e/4۩vʋw# p/e#iR{=KN4~~^ÌÁTM8Mm]UtLOf6pp%a  3=^~>x 6?5prCrfS+<絫NW嘫onSwf`4qEUһ&f-'pikeGsʳs[)h*8׵ ioaÏ =ݟ _s3HP˳I`-vfpu*{_XVasum<ȃ\*rΩ|M^73Ɋd@75]tMͻ1@;op翾VٽtwϽ mR|}"o}"7; 7qW==۶)e_|O7:[z{>ǧI#4Ͽ%6ܻ&mwseXB677:?O=WW_(ų5?#w=:sKzCcsxPeuM{ŠG.G#{QbsCxy~&nx,O ?q'/~t˽x8X@ 4DFQdr\g H(̜aut0|_pQ_ۗxnbbyr5ߥqDދχG;V#g=wb&g13 CvmWO@æ{2zпxy3 {к:T )㡷d6cXUDrsgz+~[صGy}o}ǝaǣWo.2[O09Vܖ[/O\c8tA2e2WxGOu]7UDx}=tC UAnFߊuʫOfr}Y~3ЋsGQ?`cmPcOaÎ`ek(ĊÇP]IDˏfﭗOgF[vU3#js` 0mgĘbہ/E > W7ei05Q %(J"Űmwfh@نcz0I1z'[yщTp{џ|TEpf_ock:nO ܇ruMY|E{/mreRӳ[eV&Q5lKөMtO1P3鴿w3?7Ptš-0T+Pyp^ ]|xN#3^wK[ N(Hir'" kfN28 5CR3{:35 _%iW n/ϢYc1sд&?,mf*͔]̪iT@GF}y̜3d!hLψTsS:3>?#Sd |"DQu%hAw.".ˠAթ|(QVD|1?:'ɦGnNhse?R1}F(3d|:ZAC0`@f5ݽch>?H+.Bϙɜڡ j[wѶf1cNyۑ~ED$udN͐ vXo336Y̘5c ʐhc~nZRDhŀi԰0 X?yhbe4~E6;εx|?x- ף }fu\Z*mj42s3dp,>o,ª~uӚ Tz΢"uJh1Xţg3sNV)W`7"ҶqE3~l6f .㼵AO'nRHRMVL}e֠3mkQSǀ9|9#mgTw}Dy]~kBMG2֧njl1PQ__3RòeBy̦YEu&~>rAP .J>@ 4qfn:3iҤ:?X,82j33w|e 2}ۼ5C} o3#´|ƻSfbÆ;bCrs0Q佩E1x˝h\iH:LkCO݌yoz &>l5Ne.VޖG׽B m1,Y܅ͦu|_5Obv" Op0Z? fg ‹ȘUr[ };o9td҇ 3~҆/~'u+7 乛o?bͼ{<oØ !?ѣ0ƛyuz6&LܲTMi~ޛ۽uP jg6.Ĕ]nEѿ;B.Jh [nޙV+eÓjۏbEUƻ^3"3^_mpfa5<}ӟymF*Jm mDeqVכ5zN4| lx;n}1w_^Z"zogO_1;Zx#46qǭ1KxIjhvYMn%;~cϴMwb [f)scSh7‡Z!ZL>yb mWWO]M/&uU)OHc @ &DZ)ɌrB`LmmӧOGݡJ'E +mO̥rԎxݖ.sU 8e[\x Kn|u&~ȡt=9*? 3jȎܱD>;f/~)ݴcd83h;m /Uݎk&"ח}t eeWB!n| 5gďuN5wVF?yK؅mFoǘOWch=83]+tS_C:_~;nG^͜wgOQ;2p ~K؅._7VAT3f1v{\Wg6ǻmv{fO?u; gcm(F{5Vbc#`̑^vP?-_ٹUu.G\u@ 4~׿uꍲqɤIIeȐ!1r9TZj8pCOhZM :֠$֏o`.{7ODlcFAm(LdI\)eŇhJ[/)x s&.7+~ڽ<wl] 6Mq*w+y{^T*줛'1REPRKy3eeT'ֹF-Nee qlP2qv*[}eOmTC'*>KݵN9M TO% иfb\֫>)\|m~Su$*htiLڅ[.tNv˺䷛@Jm7@nmERq6u>noo!CtCC9r7n\ieIҜG.K>f1&8Ki_ݥTjrDҵ% KQQ0 zAT9 tvi8eb݆k߁0+͊yLs3ޅeg)lƟ($[Nک,~./]VrSN<]kmufBtәtSu.iZ "LϪl-Qq&^ - nNmR݄$֕Exly.@]uu@ $XkqֺJE硲B9(7n;vl2$5f2Q ("o 1_t6Vx>zs{OO/В[qY32{@ :"ҭ&"cafȐ!f;jVUUB 8E~"C<5FM^(G\퇧Lfp nu,K%a9q @DX8P(h ummillz뒮q9444q[[v3qGGGR~w)hͻ Q(Jw5Ņ(TY;T=@ @jZq[[H^ 4iuuu!=,] q/݋Ϻ=5551P\.n@ @ ,41m\]D:bMMM\SSㆆM~+ӼLb?n88q_Ϛ5KUUUE۹Tr@1&o98RJ)chUEb)?uS+D y@ @`)#{ރqDĸO>J)m1Ʉb1f~>o@-߿nlluuufԨQw== 2X1b455B{A\^ Zkoq(JD2@wB9km@ Kqw)xaiq(:Jb^(ڴmdD)ShswkrK܍;V\if*ۣ\.8V\N1DZB8ֺ @ 7T"^^@+bQ ';::ڣ(w"KY]GlبGaNJUU`oSQ$KGGZKP/SK@ @ @ XH.aK)R(rڹZ'GQEт$Ȃ ?{ҤIYnll|>EQB88Ek-UUUH8{@ o~FҵRʴ>Y 8ϟ2$F$ }Z,766VZI2\.EikkS}8 rٱO>  @ E(LEmkkUUU:˙V]I$92)o^r(>,QfK2q^KrIN{`4̩A<5Y8k&>~s]M(W>\-/;JL]mGDDDDD n'vknhjA6ק6V P#"""""U5TKrDf[YN5`UQum'^?$6ƓXr% oLDf;YN4VPbm#VԾ_DDDDD. ՗nՉt5k:ޞl:^X_Xb%&d:ј&]u ɌSWDdݚSk̒d{KT kl>Dlj%Pk\>Sؠ$_'_k̒dC:ADkA< ~lXA}A AAx=dIv|4t8K5 59lCp 5UQ!/l{Auf1kfk$Nk!WUZvsLx8i |m1kCp-_# ڎOg%4&?LMکi^PPdIg%ێ'U89>ٶ/ϬmOX]DDDDD,aAЬmy}X}~f_x j}~a–zx5[GDDDDDj&.uɶ=a8lk\v<ɌOflR;X%D Ac!|Lز_ؘ aauOXjTM@nXX^ÖƄ- T 8HnlR3@%DAxu j& ),xmԂ ցuڱ$:6qIPk:.(~^=hl:V-'ki< 8ck]SXs9%>V"Nd TDq;-_-loA@p=u'"""""/V  8q9V3aȘGJt5F1{g枠zP4\j'&눈HéI3 8A5ۜ{f;hn.{gGJd¦9%je'.!""""9ԃcר%vD%2&afM snncn ˞~sNFm&놅KsskL^_T7~f-$CU"KvL"vs9 ڶԮڎȖ.^ Kx1(7\ϥ, [}^;ցqc7 D^^;Naa9$1Xێ77a5[GDDDDdKR:auo9yIxms4gւڦ'RȠY8>y5otDjf;dNjHH66ĮU-}.Ճq>oȲ1GX-Xcb%Ua\67f05A3f-hn\xmS~[B !Ҝ5?foub-瞠zrXRW*v7Ce"oPmcm6cn'&V>{BZ>A5? ?_/̏iu-l=f=?Lm㪫Po;bPssl}y؜c05eEDDDDi2[X۬C>ohjc]6xcusLP -bAװk3LWgƛz^-ۿl$2b+""""%J&tH4ǘm^gNe>jXfx .U77co^ݸdm' ޲-5feǧ>sA!m}~mm$&^@Kku[;̏U{!_96h}os5s9HXX=a}f&bE3}f f-ѐ4Te{usZVC2s<A5̰We /۾qǻ5=uMFЍbAs]ݛQ'mܰâsUy]DDDDDdKbJob.{׳)--5AX|4۪7 4̠ljdedVWYXvl5Tn.{T}f|o^]>y")?zm^Ȗ}Zjviii1ƙY6 '2j6]+߉y؁ 8_=Ƣ57i^ݬvq6qM:4Kon&""""")Jq]&/dCY>m^g~'>lZ_ fɫsPBo bݏ%-J_Z_ """""Yr8[v}}^X2mg_/bQa4X}ex^bYiq1%͗\P/j*ߖ)zQgAjPug;l{ҹ.h4J4oPRdt^DNQJ -r)OY-"""""rSʌ}U^w7 LAXS]X`u1Ma@z!e[ -n>[BXknn[2ec_Z>cmgٱ Ue/{Y6U^3k7߮=]o2,{̝7 e yi._TDlpVӥ]VT,9[ݎ/7<9V()HII1vjiU$a'`6eԳ/(0l4CB$b3Y2sHRzAZj*?6oͮ0OBYdLdm*tЏ{ï?X['b$zͶlm6hO^=tpqqzY=mqSF8v((ZAqqYx: O! 8xX5;^PD"Xũ'~`LDD³Nw#_}yNtьuH5Ⱦk`#ydd}4"";Hv45ʕ;ȕ.%-5 UPPʟ9ym\6]CgͶ_ yu T=ՔFѺFl_(Mp)qؘ̝JmsiR@vŴꐹCfg7 ˲*0H޴,.Qrϴ̡ zN\UVSq#ms<[9p},wٙW^3ϻ^N}#Ų, ]l.""^={зOo\M>ճYNZvkk 5os?q cF;Ș#0г bdżV cmOXN]T1[6w*T޲ 2<Կ#/[( hR/&{Sލ%%ة.)][&J\#ZZ{˖s~EzoDD|±GضW'/q\:oDŽe_˸y`fߙFi'ϱGNjJ 6NNxdeҳ6 g/9P>k ͫҋM.~a_()).[w]6|7j?<~}w`_37)""@zH~s>+W6򳳗O>Uk֘ n>b|V\eMڊԱcF`w3營ᡶy) y}GɈPc~Fje?kN9;۸[.}IcElYϽȓ3'Q%"(Zj%^Gή˲о=O 98êիv?5ks=[{_˖3eC,Z4S˲ؾw/z\_߰.;s9g.gl~;0?r]?V߹__FBO/sUK;3@zZm|ό8]Ÿ;oy DwH򒙣̓2?֐μf˱3(o{?USH{c;͏Ll,*?o?y}ezrzvCzO~^u.-57gCC$EYDDDDD6A˦컿Vc6-l|Pj 7ˉQ8s9hOf:FKEXtDDDDDD437*0s-0Wcc #4yg ՓVPMS,6 jA}^4tXwy&s׆Tʛ+g7ڄe4&;k|N&""""""姠 LuHZ}d9.V;h'x*TgQ$d檠4WK]L}Wmۉf *U(x{K""""""[H${䔗9*Bksyzد_}MFCe ۉ_ocqD&"""""" f6sAY>> Jdn.7q@[DDDDDD2sm ocrx5Vany 5e󠊈H0/;y9_͹o 5 ;#l/V\?YTȗTgSǽ[H=lAwXsb1 :Aus2z9yyX?D_/;,'";Ҝ>rжDDDDDDzn2=ALf97LCej-ܬMPEDDDDDhfe4\N]/*,1o`wŻQGAYDDDDDMe. p}dx놵jr";%hY3۞x&ֲIYwj2}FpȽaO77D#F+"""""Ҥ؀Slf*3o-rP5f;\w` IDATfJdL:,%s&srv,`(=z"7ݟ̈t~_o0aScyRi;WW8-˟|s ύ;ly} CL93?䎻a|JSZu3#薒.Fd歰>L/ ˉ&Xo9+b2-철 U=98IIe_zw+=t;ضMI׽9ҽ%%=̥OqFϪi9vfҕO2Zn>NBy=lzN.a9z\HDq\YSg͠i<{|6eu[DDDDDYj&ĂrT,hGpv̚nn+.7o-][ +dm+s;mZFHmӟ}vHcʵm[)ivcIв>ok*wם欃Ej[ ӫ0Z}Jr-IMɤ۠3%iK5>7@j؍-EP~jmM}YNMf=a;;`A0aVVtױvpX<Իb# K֓r| z(%`S%_mCΚ5ж#S6;n59)Nk}T+ɾ/=ɓw7ߝu} [DDDDd̬gQ5djAMdlšڙ2`ƪ@vwz5.iӘ>m z!MgpM{/gP۶+X}+(hݞ֑ "ɩ\-rK8nk'unmŞ']>avx^_{lJT7iAa̶yMf=Ͱs kOcu!ֳfgCkZsɈD(]!|WXݲ9R\ץ$g5ͻC,R#.{/VT`{)tx<> dO y\,Ls1ť߯%eg,Ahk!"""""[Xyl{b孠YMKZ}| &v(TwpZ)gwqK/IE^ V.?h9Ǟ-ho~,,Hc9kkzL4[8"33v?em ,sS\ mu57 F m]ƵnN+.I,.&:4hߚ̎{7q[)ٕ}.vli2?_+7y`Ɍ7n_иZ׼3޲WO1Y@#R}픀[GH฾4ca6SB8XD]Qяq}FcEˉ8nY?V]m<{ne-=VEDDDDd2G2vh Wϣ@ e!kG)?[v}mor&1_ kU43˞X,ˣ7ɳʂq˶1㒿]߶erm-lzg\_M:agxe^mQ1e-̶ɢ2=1X} eޡX}~AYCcֶ7_:{8d ?XTP ˱v) mm.rGQjA¬e2X}A[+ !xTض̺ EDDDDeX*HX&,(C0xDDDDDD$/"""""҄jZkXp7˃*"""""R%eR̂@^n.Vz`Y-Zdбc'Zee""\V͡v4EDDg ""LaYYb}E˖-.GYY-ޭs,"e@gEDDIL p],""""""bPX1(,EDDDDDD """""""er(Rƒb8.Yk8)V )}[mނp4Y(,@{WgZ73sDeijN!554R⾻Fѹln\wd1C|Q|ɝKy ?0y~/ 8]7ʰkdI kqG2vݼpX=9Ǟp ˵$&ށ/;N|XneG.xq{Nfv~b~yJЗzY3qȲ\lXw LͽyCi N_+9'yǹ|3Y._c\KT7{ ~FچwމnYBDDDDDD$r-8kΉ߰F2CX3o˾Bv͈f3_o-7\^Çӿm)-zrѻW^Uďab_z9wiwa>+ZvutH!% %Kss :erV;.偃VeVtkZJH{:+55\g7 c)I?*w-fCjnmYϪՅ,h C.-#ЮM VLIr8xvmFOۏ6vebUz{W|u*md`Eiۺ=G}KwkFe~#@wžwud_&7v d;yH^ˎ*2dI>]β׸m{9P\\\>EqRrmɧ!|oȐݛcc|SYSq 1waNojOsU'>}ӾqRC:H;yKXxx)7әX|zţe_:ǰY73Q,i@νBƢ;={x2u GI^ =Tl˲,;Wt';w%Ncg1myN_\{6dV^@?jW4;ع""""""(D)h\X⫺eۜvD|sNR}ɿ)coQckN#e1vG̖mU>"]l۲uٮCԡrg-ƶ-ʼnX*:8`۾~o9`X+,""" u]>ve=HKn;:|%Fۿ;v] eCs_T͈5Q.k?toRJb)CfH\r޼?Rgьpa5契5DkԈrm~ÙkIc~0i <?cc-^t6q!݈]Ir(?)g{#f.j~7~>onwɒAcɾۗ91!s;;]Þ*\z6Mߛ9_<97$8>E2g&ep!XQ5o~ɰa1Ŕc:}8>}}.ONJcf۰!h̫Ѱlt)+z̍K7=S6kMjQo9a`IMy!ҡ?B3˂f]++Y{^lbR̂$uq`V ۍ[o0k~ !{n>6{9؎G\7)Jr8ӚEӹi&'=gHi\tg݁H'y/YÊywͣøݭ<rylErXTn}ȥɦ˸=h9B^E8g .fr.XV!:l{7tMY^)<79 e?'=~/*s*Y8{H핁E7wݗLt< 媩_xþJ'+e/NcFjpyh`7Y@Rޛ~5NKF8^V] ȿ8dH5^I9'wfϓ.e;m>¿[}eLz|.W_vҼ-;Fvc:<+GNt (צpW9wM]'p#3mnϗ!ckg76=Sb*3L}ošbq%刜{y܂xrݙgfEU_N_]. co×(ť_[܉zY3qȲ\z[fM?)(̳dbf^=v7=*/}2kInG(9o?^G/wqyQ,~<+. ~dFO~,c8 r5ܿ nx5^j<} |Fy3:E|̛d9ΌwfyeYks>~*n<ͭ|X&3? o8 X½c'EϓW^G}q\ o۬,?n?ɬYOqn26aWxZ}tKLzg?^UmcW]>ێeb;<}ÿ>6$cnK7xy˼x=w}HpL:?uɩ^wt4f*O8yQ9jk ⱞoO:sɣ/3xһ%_ |w5ܿbxYO̐܍叉a ?n]i7\7V]|tW|gg^~X/> =,3Amr*bȻw'W?2C\̘Q;Ew㺽9%'" EaV 9r{+^}?CAOtyoלHs{wdu#ؖeGD"ؖ˺gY#9nd~c8ͷ|[^ʩ{lM̌hU] uۍ{Y$\cɰнX;V7A}H6wqHKmEcc?>⓿n ;et"XXQ'үuz0v_1+{s'Of\s=8؉ ˲>fD""]i=`(GnےH:쿈odN4RZ䘣waG{oKfJa <`(.t{e;SH`|E)$+-BzGŋWUsmhYǿ.Ke_6W;֟ePMɯ|qvr1N'MF}s!Yd 8v&-J]dX,>tNd2S߮lz&wyD|[w3SR2sGWdSecOh[ǫCzW{J5eWm|9- ,o/O;"8 cߟ#dvs7"}8r؞tLO!5k{~ Kɦs}cاg6@9*#)[^[*Ju>t˲?/̻)'7;HNC+Jß؋]WsKqßveY8,v_3b|ŽD|1fx RvT~BrTLRS2>4R"+2Q۶$5%.̡=P IDAT:ac*{9SʛxGx:6V(>a{ (t() ֱ2٦[;R3QXgجoXR6E,_^z ͅE>]w΢7m`XebiQ6_Bs6]RzkN*=Vt#7/ldޛo^GK K6拟,2[no Ía<>f{vэJS540SweG~5eߏBJ.ċJV[XNًS+m*EJgB2oU=;Pu]MnO۴Fq &]BJecERo[ZѽC~"Ԯ_WPtȨ|:ҡ֮s5m'7/ V ~G]xUql]7ߤ;Ӧfqtv&hN[MNF;ўue+h*Rbڮ#!jfj"{a^uj(١G^,y:pn؎ Χǐ蟇aM^+=VjWXy!җ _?tߛߚo{څ |`.k? eWF8Y[J*ZmiR:=9fKyi:r_pg}J?G;ϊQ=y 7~7.mRq<ƹ TlѪu6;Cw E'*b_^=y!'>k{ga~]^WGdb/ʭ~@?1tXXv dI[Mˢ#cz{[K, rYbfTڵmAJv.UEA pVd%mطw[[[%| |OcqA.yLA"DHم?V_Ufz偺trrZٿQ[Gxs |qwrDpשWyQަvCu9c sɡ~ٜY#Sv^KGŨ[3 4+#dzebfө MI16?2vrǃe|&}nB= ="u/,ukXݏl` 'McM¿+ w9~S6,wߝecƳl24UKo+9`cS9\?Ζp Ӭצnt~߶~^%:?l6lF9rghnZa5|<iT,ڈ{Jo+9v~¡Ȧ֗OO\V&YQ1 q $$$L^ow\1If&eszͯ~f"vz66m,N|$&$R+&OcuwT fբ(m*7N\Ffj)ؘ+y:̬O[tv鏾!Tmə_&0P6ND&OT//t̲?M{kNՂc&YJ6/P+ `;0D=HnM.!56l8KPس=6JUm3^ƺߣExGOb3CEj[E~/Q5,X^wK%*0)tv| ,u/s|e0mL=Ҷe$g\+t[jc)^? s-uI]mkg$Noö_6|͒^Kem0{#i^^W0}p{ou{L.>R\+ǺT?vkX}rNC ;>r++t? z7'Io :nm~ⷃxpI.ҩlvypjo,>e> (^zYӶ&oN 8mt&/(Nn^_~e_%Ws޶3mɮ.Yfy5}%L˯5RinOOQ[|G|+|_6%ו.tE׶+nNf ̠2| RKL]7+Wֵif~;0L\x8Ӗ3!wVW-_~}\Earsɷ=4W~g{]\qyNf^sipIAa2ܡ 'w=fY)]*7fG}hZ>Fߜ"OPXۆ" z㰌MB5Efʉp*{j1;p9Me ^ƃE\fw4nJ@j=8.r{o,_ϵ1n7?lu_d`.^.T13y)y ff=|{n.Z7L qPX ESbIg8(,_CKۈΕht²²²²².7%$$0t1$QWwwv[4a(6!޾TpݻPXQ""""""r0a+dH}{nl]ٽ{m;r9ic :?!SbgoY KB_s@h doNÆ1 y ıiڷ%KhW/?.Zǖ3vJNP&OG+W虁8G&p,x>QVNAvEDDDDDn# ޽{9jl19)] "66lYaej9sк#h;msF2lq@H~^g"R)r!zL)Aef$z?_rJb6NtPX~[3!۱ͱU8q0Gc.rȉ}9X `ӊ0p9gĶ, 4*$`֬{,,&9qYt9wb@*5ZE8a&sL%KUv (_Ej҈*1,;? EMYwR-zː5$*6lJ/"""""5h k$0{b+7$W@eU9?o6i6vRhd\8:Bp%Ē0'^ыl#fޞ=64!ixGm+o<U!CyQVNɔݹ#JS˷+R:F~3%E;'Sn'xc9_~ ;2rݴ bmM<-"""""1(ěY]m֔'2+:+&OQK5z$W?9?Nb 2lb.Ƥ ӾЪUt٣1r1!nF'&b3 ^zEe"sxci@F}h_dי$vg]r a{l/Gwf4/=W1~ V湦qch+aD^ $9+\񜴠`y%"GoARmedISpIoy6EDDDDDn3 Qpmo>ܾ89,!,?7R w1nV!CfbɝylOɱ8GsˑS/;7/eM.@q-sN9#io`5cHpv(, n@"(RhdͲ1Ujڌ?UaQCr v}1VL./0Q _(Y9XƏ?@s ٜݿa2K9/rvk0TS2'3_GcfOY1SE'ҩQvn}Ʊô[J(u;N k'% [Cl`1_axO#wg%"""""rܓ^.M'윒mpo~n; гKfAsZ上p_*`66Zm4ҿβmyleb\tMQmc&.HfsRs 4Z\fr˻t*"""""3N1Ac%}>Ч[7yDGvrW+{ʶ.ioLζdW[a_'+4eۦ9qr6b.c~00]_[^z(,_'J&l~Y&),_'.wud:ȭHiNDDDDDDAaYDDDDDDAaYDDDDDDAaYDDDDDDAaYDDDDDDAg=^vV\sZe8kEDDDDJUTtV1yvQ`qY%""""qV5b_b4]]o4C,8(,8(,8(,8(,8(,8(,8(,8rX\ؽ/!sPJB d{=xln$"""""rPXxO|1qg-lwn0nlj_d[??$ȼȵ|y= >mѥ)%ձ 0lbnd wŪԩUL.:ɪ[6];Y8yҴ%ٿ sAeQq2di7X7w GDU\<Ȫ_VMը_ #?,>GLEl;e=1HEDDDDDn- 7ZfLE|κ>jesc@aq| &./I|v'E]X7y:g Xn1~qof~Es(JZʒwVfVTsFwAb$&ħ2` .$WAߎ#U-"""""(khUt*]"C#û~&I5eu%e1w)rݯvx6~1ϰ5`[ĝ X/''A3g1~0c>YlQ4*dq|YB+}^4lK.u)Sh_VzM?qm9+6nϰ 6/72_#-EapV렱9O Aa!7rٻs3N@R@n3J7l}'`N r^|;u[t kAR*e#fQZz7 0=};KQ<:Bpymi(e$Km\&wk/`g)NSy& """""rKQX< 3;9ܰoX㸘G<-<73if&GN3i/7X2{v xc^ fd+Odao\/PlpG>ͮ{h# ϝ.Fm_X0"iq`˥WE&>aʆ01c$poW(,hf~?4fԅ?U\`Nw[V}?-OQ=T 8Xg-=9b]56Y|U:;r׃ew6?K ;͞gޫW$yrį7C(ô~6/5)ª=G#0~/,^lRGWsc9|wE;j'hS"q0\}=m29{\e~ vĠVfY p7fgK3l/˕A[&eTwi,n>e^}_<ϫcr N DvϠˆakΜsH1W:B'G@x~/FmB}- 23h{ ^mPXVEG;a$EOW<\o ڃVmp_:ʒ>¹mHk>&A.-oܟ5xKkC]iבӦb5J)CHJ|ٶftr}T-,ʠ?3{ȋ Yc|ʯ$6qq؄|A@xEB\ aA.lr!~7 㛱q,0@;og׼@9bg {R? ۝G ab(XZU >{cqvR,S 1l9}rp ~i`fPyi"~_U0lh4޿+ ˬ=Ghi '|qrKP G(]CH:Df|f!`Up>< //;)7C'y0*P(3c_xͪui%=Qذ,V`reI/yܾo0Wњ/8 lE|oW:E\& ߰ēؒ.CPLdtإUCMΧ320MfUC_& ! se*yT-rQ-"""""r ^oSa3+ɓ ݾvrpw=gNm 6 "VUl˶9a@mXm`L |u1 Lwi'k+`my&, X|Wx"""""rki:e[t&/(Nn^_~e_%e̿lKvuhfFɺa.gi:| gwt0IWx,"""""":²²²²²²²Y!Ac3RDDDDDY! 7ⲈJðEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDoyĈkca u)gѣ&2bX67-姟9?#.-"""""Bil2Ż10݁C*T) {^-w3NhU''ǎH*~[}s@)F( uO _cxu".R/욅|?,Oȫψ H;;ݿ```LTzmz=U޿:Cyml$0- oF~.4_KD2AYDDDDD֤|mj rab|n8] iTO)6{.bG<ڦsv K8k]3z!4%?8OT eDB Vr ua;o9 .B{]Vs` ~ïmbob"sUR.RDDDDDSXi..%Q&ɲC$ 7 ˫Q}mr4M{3v~1~ Iw(h LA(^3'10 ώbQ/@oo o:0\^3g#(tzxn\^^ (@x,Ļ gy}V쾐."""""r),_CUBʉY0x";^.^ϯ]{>am'}c62 YbRt+'nB"hQ5Z]mЬEd1>/&T~+OV̢Qt{}Cz,~ lJ{Y=s޸}Ԁ\3'Le?F\>JWȈgUU؞,ye ; c˼7If;èzL)}V51*GȬ 4hF݉28ű ;8LP !i(vYc2kو{Oi\':55dMiv+Rì5ckO,wE}Ô{mr9߷p,K:*>I2|CT ͔GL,!fv\<'!>&,/˒r%_㔮T9I< BE1-ό^Q8tOS:w`եF5, -̛~ l'wrdWld՟mDDDDD&|`CP0.^yapc>ց{3I|8+GѰ<X/qmYCp*{&]Y5̪ŋYy"(k>JiRxzz&0b*~&x8\R #GM:~ Wߙ,v.ew:< $:-WtirW}uger޶3mɮ.Y  j>Ji0]=101ҹsOҼ3DDDDDDn:RTDDDDDDAaYDDDDDDAaYDDDDDDAaYDDDDDDAaYDDDDDDAaYDDDDDDAaYDDDDDDAaYDDDDDD므]Y%""" Y!"r :B_""""""73 qPXqPXqPXqPXqPXqPXqPXytw+&""""""ׅY!86M w`FZƻs*}4c- 0G=M9o4;msF2lILZ> cP2eVJe|u})֭O_.)(+DDT#2""̈́7#W^F8X.LY?Ja[7sT5[9L͇Q(<w|2!{X8wX<\AnBף՝;϶uH ,G@J hX֕!),MaPjzM>Ӈkױv:>Ӈ7^{ HJ)Q8ʡYBe ZՂ[z+Oy"JH#p0!ذI!6ƆBai@\FXrBXᛗRt҅}}]dxsF*TB5; .MTd0% 8zY& !:Ŏg|grhۡ+E!f/;xfncxrS _&r s=C%"""""G'%aR _M^jUY(*ը r֩J逍|zwrWhG)bax FM(53S-\IͬI\+NjDDDDDDgH UZ_F* JmJ;\JRzdHǡ/h͓2]׹\I@`ɺ_{(۶3S,.ZѳgcJƮǡY|(*By"""""")YFVEGS=2Y} >ѝ+)<2St(Tv_Dֶqf&k歨V\j7SfL{VOS6."""""o|_o1L\.g%.io: ӕqaig*"""""">-""""""⠰,""""""⠰,""""""⠰,""""""⠰,""""""⠰,""""""⠰,""""""⠰,""""""vVW.JcYa8DDDDDDG⠰|C\E!UK3DðEDDDDDDEDDDDDDEDDDDDDEDDDDDQXqPXqPXqPXqPXqPXgb *VJ*UY+9o"v͟ɺsA}?ԪQw彟s3o"( ۦлԏRT#Z=ן'-&{ePקh޸Q5P |KYVx6jY^IJcޔ%^IyOvSIWԫ^JQh@L=w>n=&^EGY^1>ӆuU!<wŦH;^fT j6k{?m'oZSЛmP#*M1k9{3iT65< sězx3衻yo$z 4jˈ};'M率SvY <o#x}+ժAD{ SVKlDFա]|{{5z;SW}+CG^fOyD/Di4of-l9[|i}_wOb?JaLY9_4WD::;~75w fc (Uy V֑t05+}z>Vq4vg2c+cSLևi dE.ct-{Nfx0[/WzY˗3˻86-Za&zG&G\~u9>W'by1L {Q.c(쿼2rk q4]hL!اW3JK?xw3[/U螲:_Oe̩ljI}3{ VeI˷N{yu">Qm]~)ޓSo&=/ dl{ؗ/1y0X IDATx9mo/['|#/Vƿ{xݓx9q g_~#z:ǻN;\3 ˷)tvqeh{D KO:ѪI=jmLg2mG̥kG{g?Y=ɧԮSc }jP&OHt}9ףv[4N&4SMӪqw%X$5_yƻ4mbwy잆Ԫ]f|C~)1og}2d!Yr%&M^zT兩FshVD'kQ4k(rjJ3wxUn*C TMz"(`DPAD AwTz'ٔy&LsigfLUɟ>3P(gPcؾd5Ӣ`rPϻq\ΒCaP!Mv6 C3'ī||Er1e"%Dk^y y8"oG(ss)I/ҡvA9TVgF 0 y :w`H[tq cFwc'"lknZX<,UԩghKh؜2`h@N+Xr4g'CGX0o Qg>οL햏JWߡc|8 VA,>v 7/ak6X#F yt +!#mxzɐ^5]_/kr%i.^O=3BO7~mJ2%pb3ֻH ;'I OtyrS,O(X-X![ne-;Xm~=.mDzSEY) &.v|&V&/f|R(} ^wc? |b|XO/eOћpݳ^G8PA xO ? Cj'fS)'oK7TA/+>K%Qtl݊[DsaF|;r8’xCjv$/9ϑc.ʏӛdf*HG9p,m2$.V|܆#jH5oF&Mi>`L8̢a?TSjII uqrߌCS 9Pa Gr> L$a[vT>J' n e%^5nfPx8-I˲).`'CZ)j*}6cU L L,;w]DXQx8~8 5y:sS$Ɲz8i⧛i鳑 -P,]P8_<^5;Γ0U𰂄:o|@p`%JSS$"^#ʇۓnHqǮZS~8xܱxhO'ToQj+^͇bIYd/DEIaxAT$QSS)ҳ -tsr&A 5z ֬h<[ea# <Cxۏ"@mF!?3h("j@Gs:/7&&!Z?dFΔ|"nZ2#7c.ܔ77_jrsd\G.?r.E ?`H!3x~ (BϘ=u'M%ߘ:rG=%pbc&t_PJ'zH8Vdń4R)b(veVL∊tӣD ,O$AZwAj]=˗ŵM_:ye)9)e*6l` ؙ3ib.qj=x0K7ܗ"?kR>LOLL 7s:p`Iq;-u"n}7םI%,/Dpj`cՇAi{9ue\pWZpQxQc:++{~?e?g'_>k[Gй. VyR\A~g 253g.,rBlRa9\'s GT'޳{oZdT~7#bԳ~59X/$2gPQ,ZK|r6Lb~Dڕk_b$,w4 Gނ>w;qqG{nі|j T}s<_w(_ Q޳4w;'?&x$0cAjoI[t܍#o!;đȄq9xt?:ȏ;36>nJSH|x,YS70r(:j#_|=HhL>`z8x6]j;Guۂ782[8Gs!agpQ[0G|:ȴ&Wom)uv#[lo[%ɗŵ;=h8]㼓,"wL}͍c˙$ ޿ ͛f_`ϔQ̋KA~if;utR_np\/=y$31D d 8;XD9s8\p`]lm{ϕ Xr6_Y.M ۸! dQ~i FD<رr GDǿ%uM%8s;0s֡iL+n3g TD׺C#d$22(W`%9*{[x*RU9X'$Øn[Y0{/['Kklډ7V/S&Edd$QѸ1HW ՎOesZ.N.UQ4;~2tN^l_9$%s9wߺk,Ifs Dfb9|ѧLH"cyY/%= LuaH0L/}A.g# ǫ_F&/^+?V4a6/^E&sJǭ9(/Fj=+}gnDZ| mkmϻmh> F*I>r~v|TcV y  sB1pT!ul1~Ⱦ x2.Mw93nw̫s,3A0Oױ.d.Ռ>}'#m?E ƋMz h>QǸf%g|6p8?og"2-K>Cylmfhۮyg5oxKKRu:5jAN߇SGJ )HF-E,'uOMJ+׋y#7i1pF J/MDob tS0sT>ۗFR/gΩV+}pϙ|vNnCI ͠Uh <P{9+~4h1owL^̚/7N&mMڷeK-nʚhۂFDzRnƕgi=f4!HG䮸ӶZ[%~ <3k;}wz N_}ثs;.HjM3ǿ66mL  +r Hx[x0Ioܸ-x8).ؗ- ߳,$Ѳ/ܱ<Ǔ}w?%2,<#(Y 3̞-<1se&jJ>=ɿD=g qzmW{oyV3}='ow}n 69!3ϸg%n1$%Ӵdtg>dK/R2LenIńTxn 501n'1pدp^-7Ri'-00ouߞ_wqΘtv&^JR0#w-e$'̩`w4TNȃAݢ,""" #"""""""<"""""""6 EDDDDDDl,(XQ,""""""b/8eƲ'}J""r/fO<ܫ [DDDDDDFm """""")PQ,""""""b`YDDDDDDFerGۘm_֥̟<,iOOL]|-P%^\py9Cm ɱu 3W_mDf0kNcqitF Oxm#r缻s{uc&0iM&GQnGʈs?CU:@hY7;W1m}o9hQ)Urh sgy;5IAz~/Àwuf"""""R|έgʛnN[WP% g4nkf 4z+O=Dz-hX&(Y\{0[V9S lcvǕ&;aVTv&V=͠ M%PN`ai1f0*au5Vr0V`s;1e*i։9u2aSL iL&1Y2*PJd:icOiu,L`5wBtkȇ>GYV==e  bb!k{|\DDDDD M7ۓRBp+ g2ЪC>yXkܐNp>Zv u5:XnF0 ˔X6GIYS* X\Bh:l k/o'?/9OOð\^@ WY^>w%L|Y.-Z;rPu]-"1rse%Jwg 鄥˰nW4"{/ߴό+kQJX /2n`L8ݬ|<IJbp$&oLyjy4{0nkB^nB1vZ?[]V~=')@YDDDD侥`.P=)U#7,gI^e͏O,=XE|4V90 K6Ti(T!7wnaH_6"22)x5~ 81ydsƕ9[!<ԁaRi)iuyׄ12,`#guw(E `Qi @AJg$4IXW<N3Molgic#y)eYɚ!}x}W >^:3U"""""1w20H kKqn+0fU]c,u'z/g#s}x87$oS.'i2{& /E ӥ!nގL4/ü,~?&[1v I{kp&Mi`:Kg,eʟ]=1DDys͓f5aV~~Ynܡ=9 c ]?6|A "fuz VG|ޭ`]aa`)[:kK&˝J>ɢor2<=gu^'O$+f`$`̚Pé}'pY1 y{ s—S0 ʔ,Y^:p:rEmXD87,vIM%1%仓pV $ Nr|+af9rtLn<9J򝒴x .etDDDDD^`_ȜLV}9VFmQohl0e!ft9!%Ъjľ50}ZAɤYZeg|2mv"}5ԝp`a<0fL03\dDN@fDoZoN&cI<~=.'nbst7ȉE uFrv~ztAyȖ.n Kh"""""+u"7Egx>B݄d_fJ.`Ë/![˾fV||9v7ԥߝw#?~gkܹLu)w33"MXf_LL媔Ns;´ـiOpV,ےV$ˉRN.Y}R𫧨Lɤ+y)S"VMc<=ydN/""""";=Oܭ}?ۇL8|>N|ƝsBpW.;jM3x۴ݦ͛X=9UI,:ƴI泯'n8 }?'{|8>0i ퟭ[ |y 4-xODDDDDD`YDDDDDDFe"""""""6 EDDDDDDl,(XQ,""""""b'/Uܞ$"""""lOYQ,""""""b`YDDDDDDFe"""""""6 EDDDDDDl,%+T'S EDDDDDDlyγxɍe xs^auMӿe<)e-K||8 E""""""$"00Оqi  _cnٝ&~b̈Y|2+B0[Bƫr ^Ù W OpBzgžjH IDAT-gcDbڄeKXq-^G%d& ..]jΔ-f`׮] Æ~Ipp=Á?~G2naV,78X;W[?Vt4C{/jl"jDWJ\ߪ˘A"{4Y<,+oV>4L޾}&Hn* Hza@@t&}^m&m?3醉4aR|00m&$ 3t 3 A9""""""KgYDDDDDDFe"""""""6 EDDDDDDl,(XQ,""""""b'Ƚa֭+aN""""""՞ 6 QG?Z^DDDDDDnEݰEDDDDDDl,(XQ,""""""b`YDDDDDDF{T;""""""r)XG}f2:iCdx}MWDDDDD^'w5Uc00 JaJ7W-`d{}fs."sZ4,+"""""r/Q|b8x>SWEaepk\o{"00О̝, *ΊT ts*|[MZgb$m.{;rHL]|>q\e3֟fCe͍}[I92Qve Jv-Kvp\,AJd6dբ)Ɏǹ %#<æ;8p"SpjUE㧷-2-KjI=Ԣb\X Gd.FyHHXR)X\.tƫ;Sl=]v1dW %T S$ӱ]yfܝQ01bb}E OL;qgMBmIم>TM>z;6s7qG:=FZ9=ݸ-dc=La%q&qyf 248 b2igLЁLy?Frӊ#3YfHHj2ysg ;ڵ +l޲%`v7˿CgXϡL 'f"NΌc~p52Efʳoc\^> 2{z5ʌ#SL]7iӞ%y_-xUV †9xlpfn˄/kjFN,<7J~-c{qr4e㘳C]읿cX5t2/Ùn}ZeOS8,ŠA\ѧfku=*f idfҌZ6 TmF/?pzvn(՚24Z1u d_9[:՛#ంd6wPgzy}x<ۗr.{Yvg+DXLvv{o0&p_VTp>r?]yi8KkRtJ #?>U,PRV\W8*""""""{TRI{UNa NOړTl%=s&21 2SGy4v.Yi65}=c_PʴGˈNFrβh'#Ş|W#4ަ Ma1E`4Y:6΄H:} r>Սʄ)[X:b2\ gdk4HܭҒ&/0nm>Mqx`~>N9! 8䫏zuj[h¦o-שKDDDDDV:ƴ7>z™O>@msBg#A nq˛ٺŐwܞNӒѿQ,""""""b`YDDDDDDFe"""""""6 EDDDDDDl,(XqV1{R n|ra{ڧS.F}N-/weEDDDDDp-""""""b`YDDDDDDFe"""""""6 EDDDDDDl,(XQ,jG\x,{G۪=Y~eq}kT0qH,8P({ΰv&λoԖ?q&TT D]澙9+C4PV_ BVS SJUyrZ˛ ZkA8k@c ׾WB7c?L[ƼNZP]Fb*rߊ~ަ>bXԣ<%JHqߡ4un%Χ$3y6%[|oFTIug]}p}mӱy-ʇSt~qjTDZJڷZ5QKl݉2x1FT/Omyv93ktc(NHUiH۾3 9j/6FhӃv݈?7q_bԲvzӻ^^7w;4zʄWN>f;<̊tp^u=w)x0;>ܗɶ-ߜC+."wes:00i2ݏYs׮eW 9?-i?y0yΣ8Qm̖%?Zh;TZY3>8]kY7% ^S0ۍe5.}Iq } oײXaˇ5 XX9ݧ8xl_79ӳ\>Py6O6k.v|G٩Vrnؗ'3Vg>݌w(^ƊAl}XGz(=͆XEM.}öqgV^K2Vn`\?oEէU +s|[9| Ab,ܴr CҦvstWiA zhf6|B Cwt6nY}nXunx /G_knM3׻}wdj,"ț`#'osBaEaۡtɶ{AQxI܆]y v ʶ ~1ժUj>f#S=DshZ7 qXMv#:4Mթݺ+CW"z?ׄիHҐ.Tj;ܧVHYiNfӡJ~EqYM.Q#{SZSj%k=AWnBer1aJvykT.YDDg` E(Kqg}r9]mȓswG ۖ!m4ᗕ/?CsYzY?%>tt0LG`rewOۆ$=0&gðfuOŰu>^WIK6f+;[rh]-4g1ZF@OwF$/'$ȓ swг+n/s]NuR{T3!iX% uR ^ #< _u^|z͐^__/o /)D:'Kp4S\1.4_}ۃjT{;=Uж?z81%5:iWm[gxP:<-XclaͿ;XV?[)`:M0ɢUkX>~E)GIYq>N ې^O:fL{qay0\l5KWfOBerEܱp/cݲ8FmKL]&62/q[׿0 =^ȔI߾&v*W+Y9U2/|3}J_go3u9VG`\wc'5?,%WI,_/3+L Wz cpxÜxӚ'ՃI~yB6D{9Kn>;k2|lVDؿ(w÷pAhؤ)JBٗ/GBYz~ :aZތ^wgL<+ωNf-D`U(mq9r<%52`??ѶiԇM^~ZS MLInٖ7gȱ>Rd|L%'!ҟ?)oY7V3ke5/q)MZ!Jq!]O`|څaAܣ Ĵgر%Š#'HS Yx9y8CN' d~JMMulMPwN Thј"!.2mj <,a``q}|&V m*7_嶺k; {taL`W|2iMߧ/}ihZtRə=Y4?EStOMB=VEEEAPLrҼYDgt__vxAPp ё.ch5J|Dznf{6㹁yg abk>ND;?0g.~.0ɔ%YXXΞLL*ϾØ֏Y=3AR0JEx&SYg/3ܹ+%ŽN.P*А]syBsO܍&IΓ/s;܎A\ OI1oݺ7#ѫXZ Z~ϵY;Y*Vj^B̹n]IcW;#K5V[ҧ+ f7èֱ_DǎqՍ[ޘooek˖#diC`8kٶ$mqZ$~I:3>t5MtL,&+֧҃U=JfѮy H]jWڮe~ 0B9d gQ,0"!Q+25ŀeW94,Bw.x7)^"E/5l ^\9aؤLܕ:ccrˆ_$/N%*+ _hM^bf~@ᔱ8O<|Q3^ԫ 3() շnm*luT+X;OC>)cq hYng3M ӳdʒnz ٚv!4pHQH6΂^U.߾^W($̚ցRHA ܃ɖ 4J{n*wC7 )j3r)&f]"5/𵻴xWf_OaBNΘY \Y3SSb,^ߓb5!iX yeZt+ӝIF2K ß+lQ>c҄i3k`7mR(x+qxotzw|2]%G4i*t`jgTHx?"\8ݩT?,j4wXŕi㏴̫SߡQgn]F]`=Q*vs+*ӣjc9x3?.8OPy>>7q9.՘ph:f{|7%͟GPGՖYzN^ >2C.ɋlūkzOQxmcQrx^7&˾YL>hs}Q`T]0BaڶSul?ۏ;}eVݿݸn6ݸ:F}^~;Oӿ3g(3Ŀß1eI<|$<PʵUkXE͉ǎtoWYnD&nrEqy/WNdW[P*C z/Y1o&}K;1f3oGG`tgL:uإxehO/|l:B/%WȨ_GX)H.͟ɘY/iar&޿CaϥH>㫦9,J IVkJ8[8]Z i C0q~ 1ᑷ$f%-%?~xْөӜvf9qW ߭BRܩT>w$)Vry6sa,3wdz2o7悿qLf'%hՏcrc[ buP3YucrHfTݐ\HlMf&NB5i]goIbEpV=l9SΔ- S1THaṈ\[U@ֺMh(wC{-Vry6Z۫94t|a ۛnj3 ǒ*8̠TsH4Wl XבR^i5(R>O 7C&ğBR*rYN9AKrC!M41ghFd#c9 Y cYMV΍ڛFxKF<7La|t_5P9̺!W8Q맳r og섳0ihg/j,<0ftƭ ^Yv(_4hvsg3y# pgF˧jwEmgG]=F.elEOyq!Sg-:>7;«O<¥)9˩M>tn؛Ǟ'qVGlYrC<]"oqQ6 uKL);9mStomp=%{, ⓝ\iwLJxiʼnЌFLvTgNKP^wO{~ZbgT f#&M]_}Fg?"PQNsCFIKx]k9ml;!Q9y3S~%s㻡NzΗy<$ɝo+j&%/zU ~ܥ]9QTNe2.K+}9"~J(G䂔IƝr4 .žjRJ jIJˁa.DoK8էhgtJN6ndw<ت\t٩ݶ4+9oq~?x ٪1VVܝ?y4ñ<[^%?3Wq"^zT%eӱ%)f-~1uYQpqsX ZME->ѣ*(W1+ +2U#vǿܿ ezq(F7FN[#j&*]a˯:c ĺ|&_0hqqKXqujVC%Y)JMl9R%11CdH">CWͯ95Áþљ RvA [g9/ |~D-)Ih 3(sOV[]jB,bֈQMӣ`*gwgx\ܜ0Mը]{5p~=Yѧm>BQ_DI8;RHS5UrNH}$_B,"SpS x/AQ N T|4d̨2%f2/95mf#N銿EZ5KCژ[547=g ?'B3c|S:0UN 9U 88C,&}LMg ' w@TT̘ڛkrzV]%PY'p m/ ;O'>dzڭ{=nƒMᦺf$`}Q-C nnGA]x|?#Wq P2k|S|GQN/OJ99DkVyatOk;)]B9|Q3YYnxAr`->h9XR Оe!_j,=%S-'4+Wwg|k-KC56I{Ui;i_pa|F)VJWo۾qoMgJ8&ɲx3>9? 7t]W8a/0jNH>1UzzC.|5|_qIrY)L0 "\oz1 {S3d^~tQTywrL|n0_蟪1m䢏machiM,IlJ׆у˒5GZ]d h煥M #OVґ+oc"*=Ax&Rk'I1vVu^~x|0QI_%+#~ ϟ ]⏯B\y]ّ*a}8,ϗs%&ƦRɧ#!TMN.(VvT$n햦EIݟ^sP*L%[<"\_0q.dk9O1$M|,1 DIJT/|u YͽCbqX2mľ{},-e<i\Qi:KêѺk}<$v^9QA7>Q޺W8Ѽcq\0qsa"wbmbkD,bvXNlG$ZeԁҔ®6 J{aٵRkb{i^pÈx˻O ϸx/Q(02$('7wYkB,C( gsdFnw.SZӅ THx1OGx<[Z_yN\ҍ@UvKK Eygd//MFXE"a֟:2U~~xH3~,mGDardn|M zUKT_̓!sRqY)k:KxgDz`RLN0`nėY^Eh?1޷yBc~I/՞i*]g6` n&]E$ɲe?fPyL%S+/Y>k9\c|='4M|+9-y+zqЈGk_EKſMG͂:^!Nq!C247 ;whTXwO]<:NesYGz&,>q9.x5ҕL=cqV>'G!zNN^ ;I"ɝ6K:3'=2ןv5J*dܷB1'Iq: FB]vJnmgqYtvvzq۠by6mz@?p촑lh铿/vJ3Y^r's54ٖO*'Un Ӿc=aTPTۋ1Vn]ٌa]*YAS E΋la{XQ,π&xSyue}mf6cFA/3 Z7̐؏uHO!~?-h?N=*2O7gfu׾p%cv0ZamfquGMvug5cͻNKB,$TIO") N o)O72(*+:˿) I%WQdc l=-yK<s5-w-IB.'ݻG)].|ͼڊG$p숙AyM !DHb"o !?,?]V.B!DrIU!B!p ɲB!B@e!B!$B!B!IB!B6lL6$!B!{%qp ɲH'!B!or6 [!B!p ɲB!B@e!B!$B!B!IB!B, !B!$YB!B!H,B!B8dYr/6uLǥ<4jB!BTJe8?dI+`L/G&L!4^^_Ϩ6B)@ϧrn8v-MѢE)T~(Aำ0pgdjY +??Jw36FtMe(S-`+"93'MSL cO}gLj @{CO*Xu;2t ^jE]c㤞]2eRz+z;MxJcW\bОx9bUegy^X flA?e6i 1%]Lo^Gb8=Kw:ե_ilwo% +s :|Ƨ1<>:SliJCaa] =]W#rKQhzƹoj ^<>A6rrLNc|76Ŷ\<Ц_lx;ZG&qÑd'n_R#?ʱHH,ͫN!;-5EAq1AcXl(eϴ:<ޟOAH![tdաӜٳQRPL'Z IDATtW/[3K' *B-/cc<4dWƘdh~h4N`:<1RG9l5d76$gxU o 8 oClP[ㇲv<_Ż9uf5&fQ~<^8;Ј:0!Cih1a#'Ξb*<-c6=a~lowl=>-15iZ -cO: r8%ԫٸ R/M!6<]6$aHEm$ݶ}I:P$B-Xh[ϱ"?'vZ|1kjA`@Eϲ_\|}yu{[E+jרJ5hg.S֌BXOmeUV~ۙ&ujPbej|2 h fnM`Ԡ~5& 9#:QFUWmSl;j/z86Fּ;?H¡p(2+Ug߳Vu=\ϛPbE*5_e]iT2e+ԡݸ=ŧeSAO:^ó@ >i`ǶKֻaoeĤ&홴f6[֢|tdvV@6|q/Ln OvOg|adv8R*6<3ۼZIYw0]c[Bq|#WӣGN6Y4m%q~QvAn7LT҆Bg/,xXТ_㞋rz❯b1ă hJ̮(x ?K$߇scǹ=GRm<Rt+L>E;cТϲlw $>cy*oJBl=ićΠhM6.>G:gVtö-{yk8՚TKjݾs@nG5]#P8@N߾cF0^df}i@?Lv:Ħ989iW_1-4:1fѩI#o@чWriƊk߂N*ǧ8^7ӡi6u\v"oyZ2ʼnsq&όOs@yqn>?=׻'hߨ/ن/ Ở|pSLv^.ղp~c" ūYSz?*wYhxBw+5Gm:4Gg=YX̣ar5+$z,TX'O2N?z7ً#.;<\h]=z=nkбA&?E9[3Z}2\ 7]&.2v<'S{JgtEb?' voE8;xdv.E=wcꝖ4cA ųx2~@넯G`6LK vGl5#2q%%>KmCWY媱f֒]a3nŐk 1\l _̢I6vt !DcKJQXǓNVfJV\ue/돿H(u^SEaL< KyЄ!'9vn>5,=CZP9UZhKA{.6!Ih<۷#/ٳe%[dQ }9n?amGהk1GPx<:!q|%Md*\,zs{ ;׼D`'Kw>bvpK(~ҹQq- L ?Q~QKаA,\p#9kHòn'PHHXF3na%^0"Dj#OӎT1Ass?*cL8ێ͏0>-Q;PfM2W;y fBO2wET NAyFPP81Mg”ڤ ~e[E?\)^*%>?⡒%gV"Ol%9ʮ3Λ[8x5WF 0N `8Cxd_y;Յ So<cqXV ml4,֗smXpca-DToLywKvl9"Lv1o;.mQqM2Erj:X?CWDbBb}*=XCkЊ論z횼^'?pjB9d gQ,0"!Q+25ŀeW'ׯcul\;.EݨgVl}⏒n̏غH$Ut[ 7QmrԌQj^OOrTQ"}cf][pvjg3?uks_o@@WLB;3\D mU3z0=,ũ7p"_uFw"CL:W i>T@h9t a'zjq*d6#g2im%R"[Ɏ[_Kˆ X| &@oL491h_eLl:Ix?~.=)NQC 286V;:dx@?W-ٌѣZ=\c҄i3k⡒p|薁<7+hN(rGx5S=Qxtȃx&s]&J6I Hx?"\8ݩT?,j4wXŕi㏴̫SߡQgnv jiÆQ?x|Tl"ʺʦ6sf~\p|Z}nr\1tqntK%?mǏ«-ꝼ^ |d\K3يWTK,Sv'7L'54oL}|!}H8^+=,rBqڶSul?ۏ;Ìgڍm 8ٍ뭃g[;md/g57Azl >s~~)vBoǑuq:kt$3-}|eǒ%U\&`%cv0Z0nVn7YǍX:54[!kq2wD**Bqzn6ܩ$ͩ*5-BtrTE!Zq}#wB!B, !B!$YB!B!H,B!B8dY!B!p ɲB!B@e!B!@rqxIąB!qp {C'!B!H7l!B!$B!B!IB!B, !B!$YB!B!H,B!B8dY!B!p ɲxgbє5mJ:kDr&Pnu̟z1ɿ)B!4,wwkn}#ZW#!,Dž0CGvjq8&B!B#ɲhhf ɮ<443oB!Bs'9s8~ 0b3S?ų8[&_ !B2Tˀ`_9u>όx+A@w_);s d8i6]~D.ET+6ȇ}(DEթ<~p4T_ta9&R %,wFF"/;]e WH_#rmB!"Ud}clˢȗ qf;Fe}n4^ssY%n 0_ȗ]fd"6v-g80LFMfJ6/1K(qqgnEEow0BNiUL&̪L_V=,Ƭ0iP 7r'^osSOuHY3cl<ٶ5hfX?:G,p9M̅B!Y*8鵂PrZod]$*%f rx o΋]@6.(^W|T f-@L}i<3{ؼ<]TעԨ-w!]nΎ Οͭt!]*4r-ϒW_ Prʇ(:(T<*j'^E-z8ξ4;+ᘽřb ((^șu^"N7fB!BT@(EyMA~ᆻ_@Xzz\h=B.",wnxx:'{(1%8 概)bb@pM@u]A %ֺn7k]EAQpvUX>i`!:45/a8hG~Wn+ !B!dXR`oQ&t/2Sjb'=90j^]{1qWH%:WߊB+'a8&c dԁ9{wi2=m(ګ\gB# +$#n9-NDŽUm(lysF&ႄB!"ud9Q]qV4^ܹ =O5쀓+zvsr14`v|&T2sILzT ߗػ%c㜨?&Yw)`.EX^{z("ذ\"TA *RD,Þ=;Izky3%3 LXW1Aй>i d케jOӒqv>7;4kJsmQ=]SrڴјQ iYm}{~8""""""X)~Yx:^5ǧE$v{+ pil}~&/=M9f{ët,>l$r9G񿷖:c5oKj1!ZϾolBH\O7y孙x> sE ȉEy շf/O'ѡέIDDDDDZ9Koǘ;p}xF^$A;zjX'E<"GcrŌ"D,>/oE߁lL5=9vc. r6y\ 1c>yv`2쾛3+@Wv<"Ѩ*"nAhg]/BU{懱R"qVEBaٗ1 Whق'""""",""""""P,""""""P,""""""P,""""""P,""""""P,""""""P,""""""P,""""""Hs4qC""""""IsЕeeٿE=:XN!-`C/!aqRa(0 IDATR3Wer%9m啹[Z+ ]\NN_ ։1̘>}WFԣK4ՎZ99)xS'J:Q7%1}]DDDDDQ\*EDDDDD9_"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""˻hןuԾ-6/B/7)"""""ϥby7MQ7O 6iҰfaѴa&DDDDDDT,^9ώfXX`3bOrh)fg^q]qV߽>dlVS+轲-fNa m2y>S' f~e-BZctmT*62w*߬+g297 ?{sc~9|!sJ}qT{{s'g6ة]DDDDDdwϮf++^$ok1 gsX O>qîo^cUq38aw#O?;h=27[xX?f37~UU>!~ˌ4̚cee}@wB[ôQGxg0k֛.wF30jo`{OlODDDDDdPJB,]G:I _˚ Eskȡux^~JVu(%j +MȚŰ~7ө^ZkW!AXN WhˑQKz;+mݲ~'RW!bWHO+!MW?/ѨI]ңQ9ͪCok+]uhHH#F1Mի oODDDDDd/m)+0w[S]n' 5TzU,}$sK3JEn&\X;>UkL7fQTI09>^ zV~gqkhP yrD/~QXj)]ZM-~fY6]kl Wv}=~[uY58F9n/'"""""7XN!s~/yUKHE?cE9/sP `\k@;~]z뼟Y\h[.es6ljY"D6 z9nK⑛Q&Dv;lWm_'Y永fL_߈-Â8r4sY0gJ4Ca XUN+Hc=AeO\7Yl'U3t="ynG='~=P._M嗟P&Tz]J}ƤQf/W(F)Bl|0N=|6~:LFHb;! Z@Ƈp_~|߯x/c,Zbf|@oLgvF!k/'y,DDDDDD]YN_yiy^~.VG(_]>ƹ:9Kjqh ƢiԆ#%snI<"w \8OwmI/[&OZ8)t^/ެVEj Ө8_:R/e:R8?w= :5 !㾆~ymv Ǿ471`ЙY Dncc/s=ZJu~U(bBۻQuEE6.Qw'SZFBfYdM> HS~E m}DACA4x/!Xͻ1| J1/V `'[|'<<۲Ѽur~|Dx8(}g{h4m. Rv}sǬ~qAɰn(j]YN"Ő6]4A,DqK>//VMߋใByD"D Iz~9} 쿥 WZÆysYU`?B)+U^DDDDDDRѕ$*uĤ3}*/""""""XNƋT*/""""""I6leeeeeeeeeI!`[iuݻ ܤ/rsO/}T6C!Eoq]>y<<3?K,`݇wwX⻹12or݌Q\$~N6|'ŇX'3s:pɭtQoޘq3^@iL.Ef:;_Ƿ魯EֹY59n>Z'`}|[,^rS3hӺm^νo&@^E69om|u7s%gѾ][Zwϼ̽,̜SfuNͩGDEy9uhsuѨ4<ʵ8/<y#߾=FNiXA*]y{.)d[;^W;d3\oϸiժ-/_b8]Zu1qdF~]՚GF|ٜGE@|=8oY3䆧G0i$Fl{Wۓ-&njʌә1}:tuW3c \JU7 ]I[^`Gh zfqŊ+??MOGe3zo짬ޅ'ҥs{Z-imtrr.\8~ˊ/lWnNmh,.=׍_K,d\٭=mu 4x+}oλt.7gE6hwP՟ KsZSiln|<3O8z;8|ԧ{O`w7n> ]/{fWvkO6mt<3m9y~':'A6hN^BKO̚X^:%uc7r\hkp]8ie'><ٿXN_Τqs9)4jݙf3iYl b}Z_ 0G_ũMuG0x郉L|zjn$ `'Op(=G^sxw%0`̧մ?ަw5~klk3{ys{{/D:T2H ՎļJ,6V)Fzka_C28?o3{& y aLAz?x4 Ʃ(<=)ޠQ?KkcXTH,6R ~|&~>#^"x1F1fpD9y'psh/FL!6f8r ur{2]41_F>c}u|m<:9w6 ԭ5ȝ˘i\hL~Y̓w?_?z-_E{6e:c׶˵ƏIU'sU(:M- _qshT 9?~ϯD k1Ԡ~gԭGe -r?fayZ"Kǖe ])omѿG'Zn KZ8r4x* Kz'gT\8Wgq6W?<[DDDDrJ_'0v~B9eV0~¼+EWGEbQU/Ff=Ռp9>@'uz%P_Jƿ2eضm;3Q$z(NV6<6Gf2''x-OL1%O/OH- g&lGRZ%.t>[ޜ/[|8gp"'̌ooj~%M>gQ9ߍ ]J-ˇXu [1L f}Gxyx^۲]`{#Y캮rI =z wX5c{lzk{%Rl3J4pg>Of:U'(s_|$UӁtڂWe~@Hb2џAOpV2x*zycm2lw:Cuxo Re[*y`+[^i*UȠyOe x^$ ۡ+/,ۡ1d{> ˒͓G6lxҡ%#9|vð፾GVwn㦾<{ Ь(_$. ]~O3__7H[c#P.2LGSw,>ow2z|M͘+xmlz=C)[rِ/gn!3މ-O_Xolb+:HE*UY:ʕJm?dݺmdլ\S*ujd\;?jFȝ=Ow濧$A'npU+2ot*\uHmוc'nͽG`?sOۆx:?V.c\ 'T@˖ٶcY 7ϋV+W\wU5}OƈmKz td./+sml;s֓lU o0ټ.~>H#9O;|4(Վ=*߾ѲEą:9,|A^ z :ZN<`#|3e/v:^,9^PޟI#RXe6 9eӡWΩS W5齈m#Z };{@ 'FQ i /;ˏOc;|+n vz~l҉^/e~_b)۹n7R֐s*8QLnؤ#w:#9˾@mYg r#Bã3NT-TQlcƠKP#j~Ջm=Lu9.|U\AY2Jף)mi|a '\p!E O|dIn}x-8_sxc.w]0ĺ,[]G %4S ]v =?}[v/JF:h?έC X7>{v5M \5OKM`\F<0}n&7$Uą^C*`;|L%ۺ5T,t/5geo;{pRˇPHjaԟR];;/|KjdUD?cW+=Y, ;F\XCxLDDDDDD XXM<fg%{X.d>Yv~X^DDDDDD rk'r$,WkrsOL1v틈Han]n>WD(Lqcssn^DDDDDD¹5[O5g%crQ̃LuPern_DDDDDD5S*wl*;3vٝrQ`qa4o0n<|-o$nHwuN۝dD'4,b kܸۇ¸Kb{{R dLd_lLVs Gb}`ݶ{NifOn]er&ibY,zv=xn)Q͹ry^"9Q o/läiXvzaq(x-fr|f(UV޲/B5=š`,,[}Hx!ms<>ps:EDDDDD${Ѯ\aqrHobܽlځ)2':̝o_)LؘAtO=[M_DDDDDD _[V?Ue爷mvߴ1FX<,O+lAۓ{"쾛'xNݻauL+{՞r@ܕ,`01umd'}nؔH]I-vwlL4 Ǽt>M܌ۑGyu)^xo) ȫ(yD: &nL3)ʘ-BI5.,o<ͭX9S욶E3H= f ^ӎ^|yvovi}["""""y D[\ԴwD61|L,rۄq8wy˅mLUdռ??LQas{cd_5=xqz휽7ff%'eX_cܾ90Pckv e/>ά!mnma1 ˋȮ.&1󰘩O Sm3}Sdƙ-Yy{?MfaadjOᅛ9a9(i'fbӏ19o\v`v6b_>2yXjCo܍v?Q;L?[w|75CQbvVŬ[lG.Sa۰$hۓve/JߥTl@sݶ4S\1O~L'Tcqo6=g/cgX۰saEDDDDdHT5'ډb_w^;f_61;nrz!m7oEQqĞ.)L.xߞsX+_5<.{+fsُMͅݶ9v-Vn)NMjnqlnl/gŴMލٓscq{EQ尝]EY@u=7qBb5ssm&g`s26V.31ϊt$>jhƹ](H>S7b6;&p1D]m@vg3-ö6$f +uXNl-x`M +rǙ@NkN{N۬7Fؽ gN-n8ۦmnލa1yv bŠpbx&hۦ7]'X16ywaMߍr_]%pQg ܴ~|nLAmdSBzx޾"m5Sw.wWXLDDDDDv^XAVL}~7V&jۅiSv!&FXm͹b{, 8sP]x377'dx&>x޴"l˾5xKb9`qfv܎am}5y3..D9B+93-ݶaf6֝y#lDD:NDDDD䟪E;9(XsӶDTū)ݱi;gQ\DDDDDvN-Q0Ds#&wbnmj=bͅ'I?mvͻ}Wn ({=6֝17obnΝۣIҷ&{Ꮁ'(^MߍywTy)Tśw]<nmd7v'{,N7fvn;ΌMiw\Y6;8 (KsBbw۠njf*3Ge6c̄նcb&ln$C˭G>ܜwmOEy"X۷nÍvAcFܟ;P m>([_z3` C:9fw3쾛31lL*;3VDDDDD ;qǚcsړ\keܾ6ƖGbPtsbPz5c+f}ʲ]c;.cO8}{?1<,K$,]ǭ? hdqs= jmWӷ^{217g 붍TyH3cEDDDD"Dcxؘ|=ƍ)hR'Eq+v&IDATqO]vUR$aş;7ܢ]֞X6ngbɖq%ޑ +Ɔ2n(gcaS8#UmvΞ0E,'Wʙؿ^mÉnpռ[Sv6oܰ7g/kƅn17g윉}. nA,fa87gvqj߂mn3mwSl2$˹vf?[O$lK4重snݮ,S y}f~4٪zukW}Ŏ;71SչßT٪z9=3̴';3g"ƹiU3^͜9ՙϼ>gwnʓ3Йs [;3uEF\WիZD=VVgUCj3,{rؚj7a4VgrgWve33]ќU5U:վgwnɓݳ+[U-W~gC5VV_ozu<=?rF3u+~~89 pvvn2uU2X.yzZ%5?^[?vz&W`[gJ~%U{fs_ݷFתz^,0>fkl~6w٫ͯ[T:\=su;;WZ3V<_j];vl~6Ao6w}%gum%V߷ZGԵ,g>EWxw_UϵT\vfjsV|DLU5{ln^UTZD>zf5w g]zVUgZ9wGQ/U-b~fjÕʙCȕ3gYWޙ]W^9sw׆+gZ^1=zqoƕWloz5cԋlf]-ewζ9Ge+Ys 3ٳY֝{;sl6{l.b-{ǫU{fwsvw|ם#{v]=Ywsz>cxG z a>#6IENDB`kraft-1.2.2/manual/images/nl/catalog_standard.png000066400000000000000000002134041467704360200217730ustar00rootroot00000000000000PNG  IHDRdm>ig pHYs+ IDATx^wx̦wiRDؽz-WQl? ***Z +XP/H^{:Rvf-n<>3=Y-B!B!B!B!B!B!B!B!B!B!B:eU2B!'!B !RՊ !'[Rl! A]lxBASJC|l > !nbAShB}=:BWT_ǍPWB!$uU4qb-2}!`)~B\ h7B$R5RxB<bDPD>Fj?B4ODECk{j}(jsl+BDKm lGEC- jsjm 7|7ڏB[ pn~jl mͶPj[uu!pjny;jmD5ɻ66۪'X?c 'W!+) 6FDC( jzj*>ABQ6BU}t&ǯ6@ۻ!p_MDzB!H }5&"sɱkmH gprB 'M⡨ɶ5٦kܶ 's(7P*l! n۶`n@yNnX=yPs܊'\pq[W席;qwۂRmBԟuw $u[ۺ-))$</7,ќCwyP=7Pmvm[MNkB!D$zCɁyNi۱Pb*RpDbB!"'>jwZs[,-JirPB Y4&PY`MSN۪q}zi\l+M1oVyܯ/mvc*5ח*}[=vEze愲N뷿E;MߗsUn}nq'0pss!It9R^ҦolMrBz9)L%۫6=G_;k*RBQM V8Mzog/ >;f_s>mSoK/zClm'vZKslln͇m#"zjRH[Ym1;nKuM?sjjHOȁT8 eݦYT}KSc鸶Pbz;pB-| cNŐM)zE+P e]] $PNDz@}P^z1q=c꺾mz,X[_!-X!ks/ԧ^!Si@w[w?P_X"5qOzJ}S:T\>}{ags?PB_B P8#N1ŒTԘjm]mKwwS"5qO~"ĩHQR_zׯ|75O߿گc8-Un}B!T/zK)lU2,G9N}w[AE[5-ܶӋQov ^r 3q^׋:u]o; %B}LrC)4m5i<ϓss;f(9~,^⁨ .mnEoo(1u=Ř^XŘVݧK{jέ_oj/a VoMݮ9n[v!ҧ:moo_6ON!T腏ާbJZ9ٹN1;ێKh[\! VBF]B+5WN1 7ҶY25M/uZ\AxŘGiWc i֭mYFmB> vniAFFfы&ޑ} Y,PL_99bœҦUN͎R9q-w膿VFzy\!c)y7?a9yϵʗv;N5WwS[4n;73iN޴nuo#Ύ !" 雔~Um0}.oԸn ֮S(Ȝʩ/XLw|{]glXO)c!"bc;ũ_4k}wZGsA11j6߲QQ]n'Ž1.<%xolb=_?*^)nt>u~,oyv,JJ(MDS OBUNbc/FF>|Y!)˲ωt8s_uSs{<*"},;޶O!@s;^lqIltԽ$7R OvB!žTJ}Jڶc:qX ,j\6=oP0s#K.IM4&JbMG$$g`D";YeE ! Fgb >1}VNoS<=GݯގK b}m{]->b2j|^/|,jX +Tb;S0 INn'--)fOQ!J(.ˡě[W;ø𼳕ϯrԠ7VL$Ic^~I/a9gFlќ'o,*ŘW9:P=\ a¿4 Ѣy3[g:u@]p]Щcp^y չ\>@v[ U8Q_VNTTm1ǦfwUR.EĦT~.,m Vn^/^=[)ڻʊ]_4;~O'IYqmc0sj=ቪߘ=U&;^X֭IINf5|WXEnn^}U:̞;_GąeckoUT41 VϷu7j Xl}tؾ2iwsi٢9u:c7uvԟ̈9gw]X\l,wq]n"!>^rUTTU 1{vMmK}]Q9Ţ^*tqJZ=ՔyZL,Ic֓k mH;h]KL4'ѹ6>RZHii|PnbfO2DU,kC\pD_K>Uukve+,2_f Z:6l4&ZjVzW\wW-XDzؑXJOkMV-[YrV-cW6;wboq1irxPd2V^=x侻x侻ݫ]#+Vf)zQz٫SXrU{dbn,v\9OoU!=(}p8Tf9U%P5߱ rD3G{MaΘ$HȀ%7 ށ~G:5uESxy뽏ԟd~& yhW_HfF:[䃏?cXpУ9cjҘ<GLwRR7m{享 777˲8N!!19scYP+##+G\DÜyy7())cЮ-.g{(((ضiVg<~5gqII:{.ӿkFUl۾INe 9aSR(ڽ^}cYpD\pd5iςϿ?}NKM{?UOMIQЮx<6oƣOW_1#ow?G⒋i߶5|>5{OgFJr2XSN%;7;1겋i٢99y,Z xi$xC>T4aǮL_Vb<n}%ݻu%!![0yTnc!)9ݻyaϻLwFljYMw05~[fM]xf8ze^/׎{h8O>qy4k֔L⇟gЫ4ncދ{`Wvv}uIϰd >z8Y a=3 麀 ǒe+8y nǞ|ǭ7\<ǒ?\`RlJOc1:!ugLuݧ@}vQfř+ު -],߳?a׸IMM|̛~W~^#-]a=3wBއ忯bƬL|b<1gn|x+W? /$F]>7݆eرsL}6ӡm:{. ~3 ii\yX,ˢcv4  |>K\MbB=xC?Gn|xq4j۷Ñʽw+oO̤i&}X_@fMe<f=L^:))qLye~u6nn!;'49Sora8Jz'^8,zy0Rn{=ÇœϾݏ?_µW]׍4M9kڕ]qkoC=DDsۍVfM>JNn>1٩lظ1elf̚CYY^t>ǎGoM㶻';'@^],^J^=1LxiVUI.˲Xxi>oc<'YdYMΩ>'Ŗ}|W^:x$8^!G\oZ /꘡WSVdAcv,^G'?CIIշҧWO `3wB6mJ^^>z!c֬7.`̜=E.5g(--f-Պp&ٽ{e"^}=<䤤*W |W}NYscm1km߾.X9pٳVPZZJAa!֬YVvϿΦ[3#&''?w6>N<*cSRRBqq1ͧmV-;w9mzYӿ%eZjYѧp1|>,ZJM+ +W_`߲͛kWvxY믺4b.L/m)..Ϗ 7׺4 PԫK+Z'OUzv֖4|C:9)غ9M=(560n U.+go[fԤ b,Lk`X/.e_xMXeYa&RՁEKqӵWѬi{vg__1ח\X9pz-vqf[_Ѷ,o6iܘ={RT"}NL$--5[W /(%&&_:gзw/bc-Ƃ*$;'^ݻlde5agyc۶c'UPrJKK))ƍiӺ%0"7>.dK;wX/--rT(3 =gosoy<;L=דP[ӈ^D!^{=vegsߝr_}7mVᘣs ǒeAFzZ *Yzu vE&w[n`),,ۦ OD*܃?Qo:/r(jnWTrRnۺjA?hҏtZgCY7ʘgSŽoQ'ދŌ+ÓRLlZ1fB8(O4hyd 1P^=wL4>;oe+V^Ϻ 9غmG9-.gWN.?LfF:׍G'=n7-(QffXjJJ-$((6YӬE`?is9z}x"yjՒ&= @.QqσkeTs6ko|X|㋼eY[y 76l΢%*rbccy|OXcWUMeS/Un^U[YՊ41c?]|.^ ;wb_q1|=agQ'_@V-ϓU>PlڲUkp-7pmwQtҙF_ɸşpbe /]΄'{I1SEIi)LxWѻ*,^&>D~_˲h4zVfXV': IDATƜtP<Z2cV[Ķ94 =CfM9SUu2komݚJǃcv$&&Aefǟ(.)!>>G1o(6oM]wU[V4JKKٻw/thT>V.H1ǟbO +Vr3ݻvq,DŽMR>?O >7O]ՋPEJZs4u5O'>&FEax<ڐb(ݑBҪsݨy|rђe\s".YưNgh =ʶۃut8Ν!G8ʬѪesN㘿p +~_U%GOrKyu0oB^|͊+S|NJeYՖO^ԧpn>ۊ+}-\̊xq$srXlEŷtӿz-cGrО{J\\,%4cf]Ĵ7{Ɠm|7tԑ\DII _LI~A|`׌#/#/?/[0y#b^u7Owoߟӽ[\3RN; p]ǾYO=S=YUM=tΫnp#زuqpD!VpNWkxMeߞ|[J[v] $ԼPD As[ZWlڶi{iT+n{x? hA.LӷԬZ34,gD3 7'& />\|eeaYU|j0*y_0c>$MLB9|[?zu)}Rh}YԹmC:ej1mojL4[b.B@-˲z΁֤ʲ"2 -[g^JKK+-FV=t܉x<ڷmߓj -- n!mq=flځU4߲t{nqSAJ=jfGy۾*YD'$ĥKu 㤦0wyE?kW'Oal-quWs#1sNHu+9*_JLI+d6{;7nnZfASPmN_ߎQ+mx<{W!YK1"@?mwp]ڤg8B ssY:[T~rbL-NnE]]dNAq}u5fcNW-bص$}>G*a rzB!PW:yPYlQJ,ƢR@pb;avƢR !6_ܸ1>u]9 OMϳPXB!Drչ^s|SUm 2svZm1!B?9) eiSn96SL߇E yNǜՏ'Ba_An9i,jۍz_"&ꯍ`Ǡ2nPVB]o\yH!uSl:W{,_qoU} F]d qK yN<>B!£vqinyv)ϩHjUxҦ}BYj|]sh !~s/8Զם믱hdIB!D`\u}9*XP:n@q}{gP~!B?uNmU(q:$ot2z ~ӫn!B?un?n<{W6 uQ,nPH}r;)N}ӾBQY_9>}sי*sAϏB!DqFsy\sSJ;* s?@X]7ޯƠ[B!_U`TP:SY'@; u]BQ9YTj)֠4L0$@K{=M!On6{=zUӃcz;`K{ !a4Ws XD ;1m vb7;/Bqziv[WJmpB YC.HA K{i?B!_h}Nn*B@y p'"B!D4g1uSQUqn'Jq}_B!_Nsty)fsڇ)VoQS^(1ms|>'mB!Ns>;ކcN(~ԓ(B!Ds^עY:@ny1@w;B!?tm 4;- 5/l, 4P/cB!N:=7pr&Y8=D}zB!}PlTnq]}DDgS>@n9ގ0+7GR2$|bzv '&4d50 z[g,G5 OtbG /OEX$hJK i+POz T1Rh`tܭ)93sc X/N+C41yI8RW"wG،G. 1BLӼhw :V?XN8Ǣcc3߀Bi_W[h0oP=.B6768kP,N'O! Ky;P~> f۸BQ?nq]y%Q> O!u'Мl>rtiYmzBB!D u5AkHYm4Ck,r?eQ¯ϭwji]c_)a+sGkϕϏ_c?uY:я@Ǿckמ@,f> ߲SΥp<jnQ p8Լ:eGc)C4?scB uM'& ô>۾|#Grȑ\1j475_n`53p)fk݊qfvй,㏷PXeL;aMIT1|"+Y,;mDXĕ\v坼gIO1zHn{{sٷ~s7AJ9^4v{*R(BÙ `ľH^I+qw8$f}8q@k,#0Qn֖M>˻b[/+N5=gѧu.\5CG|6K 1 X8kG ]~"w'QӚnɇ_-'fUrYV͚05T)ɬSPs˧ìӨ+{4#N^{D݋\D\^ZP$ODn?QT-3R3 Zu@K â8#xcsͤWbu^) zscuLk?/Kaj:-K;%G^v'wN~H3L<'&V}Nd`_D[ǯό3i.>x:$^-lː wy.cIw\?|f_lsE&{嗟DD( :+/R:}IaߚOy9O~yɅ.k孷e}x2:s#8G&e,~y,e̽gw |V| olo-@11#ZǠ`-`,׆Xc+?gɎ=%᣸_c<51}dm.<}k㭷)]:8Wfyq>dA4cO/(#I}1giBQ_ # ]OQ2utck2n9.~U><+}O &^/°|9y #/L(<--ȮIBfőU/dgJq+8c~=Hџ_m1:{}|1|lhcgCyh܉d{E0l)d/N]Uq3ޏ[=zA䉉Ծ >ELp#қF|x+.d/oTJV{O:;+K.yr]F\!m/rķxK"1Oay%~)k&o/ßxR8i i7Ԙfbs/(|;~m2_Ik ^[G*ٱݩd%]¥dpqڕ)#%N͹Hػ}g1`y)=>pW=p͒3ցÒUqz#tH_?Ť|B{ϧ޹>P&g9CN ~#]G6  {_!?w֯T7iS~ \1^=cxwI8z Mch[Ln|[$Ps<4Mwqv|_t!nmp+JoҖk.[Iϥ4ه ~cپWքAQgszb=qd t_fm6o"58OF*ZůsVshlbr5LL-#-=5'9փ' =;R[PWaq@e&iKcCJ O |"hc)f1ѿ 1qd83aŬAgH$bbhDlY DsÇh?``թ2y( sɳl<1E4誏9cc.gO-hobPY t:Cۦ%i3_gIYLcgyWFlzkei/M<3sSKLBkӕE PAv3k'nIr&}8;skP4aQY37} R9Vx Ky1<'1UΉaax0MӰ(X4b=UHKi9"vh)I U9/_~mэ^mRxHjۋd9T!f+d*{@ˁr(Y9nעؤ}rٵ\4J׏U;Ff?! }2g[gN8%ۘl >,Me0[f0>s(Y)̩j2_RB}G^A0bh8; cmchG: agqxXu~^ IJj:j]lP]c@骏xmpXjz;"R~ۿObņ]x)_/ֶ]P5,wI8}[=wx? ,~᥌yo3X#?7њBu^'؍X#}Uw1[vg)x;s>]=Tr7ǎLVkOY0HJMxvZ B ҺCS<&ޜY]~e`cmaXw,OM1dLܭEX/،xFV2r}όes #7fca`;3mc1Meaw4uL!ϑt}\eS\HɠQF7νDʾGǡG;3~ڰ^ VŗKп=][Keb&dҦu&fI eɩ$ob}˲ ||쫲(v瀯0="iQjr8h9+d:bge4}`a$eѱ)?a]bLv+G`ЈKIMI39L+2R9al|2&Μ2^.i_7H4G?wRbwfTLۇ\n֯NRa6ībߛ-ϳJeA4 ~瓩_Gx2:t&0i:M[Ƀ#zW|3Hϙ_ʛSc~b M۝ӎqC'u-L_v /!_ۋ!g>S)-6h꠪7*COU KSi(mfJ;_y IDAT1@G~`pxb?6^h*QW[8s }`?4mX V ŇS>S57X/y}`K_@||vfi10Lm'Kʪ}gi1[X}èr0U+QXX.oՆB(L04cBS_~V?j_2UU%]9PPu|*ؗ<ǫW00, qwPtM^1o^TkvOi{eJ*ٗmufSz-XaUR,,-wBr _@=Zne0:7߯ %9I @BǢJxp-ЕVW rҏ[6ngJc1Wi~pz|Ƕ~L}߁ǽi|bUy*0B)?qәB ! )N2Xo !b'01@!BԽg/B!+R !B3)ȄB!dB!L 2!Bz&߲ VўHBՂ jO0HJJE椧" "OCݚ:zH!D!ݻؼyeQ$hB}B]))ɴnՊu6JAE2?B!dDc$؃&9B!DC B!D=L!IA&BQϤ B!gR !B3)ȄB!dB!L 2!Bz&B!D=L!..9˲' W{eYzCzZw@ 2!8峻 S89|>vШQ+'S;IJr zh _B^u0LϫE!B)ȄgR !B3)ȄB!dB!L 2!Bz&B!D=aQŭw{l++BʟW͖.[s#3a>| nW|Ξ\M~z%_crSe _P|xmL~¾'+MsQ֙o+_2sfiҡ7N?z}evphJՈR/ɺ>*fHH)޼9[39_{j243+DҲt63_`ĺc5UO@43M`+7>ԃqEl^%n$ϏNHc0;1d4Je߶^kn\8^S\=&y=hxWшsX=B!@V.g.AlxSoCBf@L~?|f}8,~y7#K8k\^4.FiB+\p3_xi>~5yx;ynU+>v?VocՈ^}4Vcyaళhgd=c;ʶR;*VΟݗkfꏫUL[NCl\|'7A&3ﵼNdmmɑɝûm:Wߺ,w精0_͸3o9r)` <26QܙnkAwO|-E$v📳԰X4$im.ymI7(IAJ[x6+V0|dJ$o#=eI$U'kDe[3/ݒvz}6Y1[i,/,&go: ^%KӱcG3nXv-{l?Ro@/%xy<vgk_9aslfL#뽥K5o91-WP$Vz`=>wv򘮟U|MKӄֻ4eJ%޲ΘEKZ<-mʷ$مɕˊ 'Rֻ|* =IHTxB5UOTVj$ҕi).ڔ}b~ntzK]б.8B}-{}`+7evHRvծamْFT70V˥3Ϭm۶ȑj9m۶^zJ@V|KeEBUiE-G?ѦK詇_U\ZµcB}-SvjjX4LӔ!C%˔5b_\o볳2h%Cc#P5 +4A\9Tm?ڟar*+^7uG0u`2]$ ԤmM4aHFXz\zv,;=ķ_Co1PgѺ_4NP!){Z}U\76Wzq !Iѡ(c UȕmoeS0c[n{gUQaeRb3]41 n>yzT>Iygj3{4dza\M2~JbyTiQ8qL9*~$^26R?! +OCӓߥVnY_k~9ZxE8e$4RaHFµ7ma2d($,LJUт\yBbN;aMkz֏OkDI|{bcT~}uШQ#)L~ߞ-}aUyyI-2eg]ʈIRsuCd7dɶiזJ˗̐hjTWvr-I!1 ;~Βe۲2MIi/u]}zo/+_ UJlzB7W2=']^}K_ƷW.vT6蝷6GwhOuz2tSzO?Wr HI;R[U߈?aWUO+\IuSu&/8M+w6QX?Zr:[(ؖGvbpm}NdlV֭AIcضlı̶Ǎ۲27z Z.~T;np)ٶoP-|uP~~~IIz+`.dL{m_LC}_tp_yˊB~1aj4L2L6/$#p>I2\e΋,%8hF#+};fX* %}mURWVYO20RxIe۲]UT`M}Aᩭ?[U>^mK9!K!{n2l@D K5")32>+*Jtfva4wRr7-|N12Nyy:0΋I~NTl8@0͙)Ue.* DGX1Y,۲}L1QU sqq>r$S'.K1х5*8)g?…p!>ڀ1d#8@0d#8^T`z6E]2U=9Yר\ @VA߷Oref T2N^6+vک*(Y!l\Q1u*(ƐUPe)jb~( d#8@0d#F׵ #PQq{I wl ݠFQ˹mc1aN_OZrWS-CMGJ>Yl_f߭?:?(TgVVC?CJ0]rrnz{]+('vi5sf(I/p?3B$R5~4yӲ.k]ou@klG<{~PQu3^gꢵ-ucZj2=pSG%xY:MJ?T'N-ܣI7U97׵hs[ogܭYbz>7o?O/4)z vߥhX3nگ𦊢 0z*3m\URI2uB̼]4Ӹ7kݪyz=9i}r#ɷ%+o^$]B}% w}]\:EW{gim}S6嫵kTe8J3_]6e-ZJfV%q}2gbW֢}zoKNWBp޹<ٿ{꒕ZҜ#%d-toyIJ@]s=Wi7/R;5^L-^W]IrT?-/OzcޖP{P5 j]u>̳):q>(7=5[mE(֯BGK9Z׏WۭFuN4L|a(0 k0wb0ear\r<-4Jw+Uߪ@ŗ Ub뮅'i%N$ssUg(W5~ͺ1^Ù[-{zR:MI1lOR2cU'zbO;)2*>wzSLӔX]rɖ]F1cW.V=QGtԖgzaz-ߗ-ɐd*.)A!+"iD)NCJ9S|e\ dny/*!2VByF|҇URlKC3[p"eK?!I1UaH2_Vt+=Ui3dHt@򾞡QO3iRh ߭ {+C`(4cWƾzEEhr)w)<ڽFޫ\&W^V~|-P62B_) zٳTo,Eٖ;hTz"^i:Zή~>=V1?io77Yk_rI'oχ=!t|cfxѵԼrS+ =<fi][L ]5E^AW>6Ig㔙'UL}Z 2Tl3(moj$W_3`0Bݾ[}[IyӈlظQmm;|ԡ})q10eےl˒?g2 XW,%. crW~tuV)?mcr Io=UaJ$û\זe` (.U}}ڜ:l7U˖Ugo(???OR$|}t}0MH=Ӷʹv7:CA%c. yyʮ7dj @)c{ױ_ 0L55J_J?! ^ʼN<2C?Sy?)IP^2q)KF p a2F p a2F p a2F p a2F p a22W IDATF p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p ۶PAF p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2F p a2ಿd#8@0p+@0d#8@0d#8@0d#8@0daE.T\ 4 ;\ orhc;CdܵSuQdddp5喕uL;wR5PA*ڻ,'rsL%''Frrp*Yvzcb*8lcP?d#8@0dpeYOJKMS^^^p5)$$DIjؠLWPYoWnnZljS^^~ޱ]?m߮6 T28"5%U-[RXa U3iƍjؠJspD~~>ab@%B 3YƠ~ 2rm=]6ex䱂kK2q.4La|@OoUi足Zs yMޒW+ahsG$)Ԕ:TwkKz9mC *?[GU;suà{8ͣR[տ{m!~PS*+ꥡmGu].-=<~ޮN2M0^-ɰeIJV\ 7N𧳏hԺvFS!Gg[Xm!f tC:-cƀ Yz{t4#=$;Somko2Um4`&ZvF-\We`[-_n/Ջ)WmÓ :>D˷ncz=Tc UG=oB /Ζ)3*Y02u'O+8Zjף 9UE%gT,Yvڰny[7_K|bϸu@mSzIR4}y6giKW'm,}}@aԶ{ %H5EMb9U}P-D!.g~TρW9iISRqoҥ}zs4r҇y"sPIRjGa}/|\7\G{եj'4kz~*Qm xߢ`f\q1HKn}ZPh¢*/UrMU6n?9hFz_0J>L YJg{T{oEYϲUaP S;W7a[G6q#k5=yjaf uS~#t:j[ڿxn/_ А_+ײe|^Wv]=K@ό^];Åu ;mFwN u{aGݭ%OvU⛞ԢCn-FwZo,[/\.J3N zH-۷0ћ+ekf9w\@<}1wnūh>m>_DE֊qjK^װ@̼CmmoG+#hmSy-)W̼CؼXMKWZ^Ԋ5F[`h ]jDϞOk0å6ta^L+ᏍtȶJrK!ջ>^gUZIv,.W@;C14)S-;s h6վ_{[\[%YzC-Z"K\b]Ts|+x;^qYjo$y:ұS%)պ^UVBtU-Z}$9j[7ZnZZ%p5"sNWUS2cZÕv8(Zkͧyr052Db(kx*$CVabzg!n+koNOn ̸$%q^nCUԛ\rꭣJIсwiRV]]-m)8թR8̌MR©pfTU\|DrMCFTc\.ek1͚iњ6mnIԩS5fh޼d)1>ޝM%IG33T_3VTBj3U-e.>?@7tk[;RUgD_KK2 n?;LOnՔr۔nPS\SV?XSηƄ qa&SzLXŨNo? a2}o_^^BB:dpDTT~gWW?oWttTp[pDڵw>}F F9)66F5kEa#:]RLt<U nEEE)::: P0*vC0d#8@0d#8@0d#8@0d#8@0d#8@0d#8@0d#8@0ٟ0"*%\?QDDsTeJb$WfRjp5^lݿOO\?O#IS\ PDD'+::: ٟ,&&1*,Ƅ@@ M F p a2F p9rDRNNvpaRvZ 94թ]KU$@%}J*dNZ RkԮ_D!d3To2d#8@0d#`[o\dzvuևiI'Ã4-ʷ%ǥ_b[z掺4yJPp2gʷ]CzI.bԧKAsT>4rLՋ5%ɠ1:rψ l+ெ@Tx!j{B-[ǴK443j2! P3^}URp=(oMQ.PUJcCLt*76{tE=ձsW]86M__<֝wv1/GCk+.V SW |$:M1@]PwSUl oW^ռ#տ{u>XD-}{{x3N->fIӺ{h?*߶M;bu=i ; 6kkt됾ܱz_m+f uS~#t:jKtq c'/lky%)G?D^S]7Mъ}%X{՗PWMP 2 0 I~2YJSڵ]~X>OC=3F.SqkChZ<>Mv+m&}[3dRyk5-a- zONл+VkK(b8=4/XfI]w2?e2Ԓիzl<,UU-uYk#~w=yݚ;~>Zo,[/\.YǿNR jW|_^c:63E@+W N_pS IDATܝ]ػ˵v&J'O|5{/cskWtMćJ]ZL Y&Vm@EV @q\_-^#uI2V|C~Ee%iόV UmpIJסTKve+}B}|q ^^Ic*1MYB ZSa3zk$m\|ta\dڵht'ajey USrŪՕ.}nڵB~ll$R.hkݪMƿN b#J{xvQr z_KWˌTKZ߷-ݍ5hD'%JFX-u@{iaZS:m4pGE~z; kRLuQFjv\dpJ?led(ERU=TX".zI/-ڠ} ,u)$YJOIWum9qqvlE/ѱ)|@SeuDY-ɕ\[SU潪}Tma7ѕm2=\11Jґ<+-wG}՞y/ d'['OI[YJI=P϶7l["ɌWb\^%Y׌WB`?ٶ?.[_Ⰾ)#ӣj^FK<*2C*3R!J9"[|:t(C 2%A,e^]4Ml)Wz{Wl.I2g+VzlwJȈUaT)!CFX]v KԭwNR`?"CCYѪctǼQX#IwoJnޤR(>6\9+ k$2NϖUϖRҋ^vfPCT!I:,~Qnϖe|^8Qz7[^ښmLWvT]5)S~TzG1رY,I U{s{Ӽ<{i=:a:{^\](D8v~R,ɬTVSsmGk+oN%nA/H{[,eAu28Nwu#v@7{Y%C ~y~Sn#dGuJ[ɕ<--V@@Pl7FSGOcwҌTk=s5Xw[S/5gѨኊ W.Q߶+%hɒdVOhԱT*\Ih UJɞ]uhS?+N9&ԯ}B;NKw+LaQu;/)wLy:K7rQ>vJR]]6irӑSUiOi%O~ણKop[j3ԃ4PսK`FY3hgS9{*g#_t~q0)fi|$m0j6U㴴vq5!i>ONRb"V:.ϟ%Iʶμ0n:nd [EdܽwP< bW||<\|WWWz{#I$Tf(笡Q RydhN'WÇ>Vh. [Jd\r%5UCdPB\vWPL :Df,ܭ%ܭi8'1Ax;>d{YZV4В$ VKٲeYZr=Yr{˺Qwͳ^eu`D]#j"^F ¿愜YTL1s$QtiBCC7~Ib觇MC~^[#0㩪`xMg#5wv ~/}ܛ,WYQYzBy(㫖=W@:H@{l 8ʚŦ~UXُwPz1槳+3Tc@gB靎|A e~(J ]9 oӧO)T Zm[Z-  T%CVs7~`ᇤƕ)^3r.z$R=XyR^y^v[c9飯 :Lgm>;fEtVkcNd߸DZTSG`> zmrsz(i^RE;֝a%^u{ExZÉ{OQ\ G"^uƷ`QĽ24O5uGSkvÀu !_o&#<Ҷ%.<{>*EJ~́2U{ ư)nk/3L x~+?CW6݇}NvH:-xdn׊oZ֎y'Dg* -p`DFX[ Z}1^msA ξ0 Eiۖ/d/?[~7sаI =|gCO/ObPANfv)؝5(~H}*f/hҵRXqX|\% wi o·|Ro,f6·+@C)_6gM~CFьP { Ԙ+<ǃI)@@$[v~P W%f7 SuscCϑChc< Of|n!- _F?gw_Eeg% A2%grĿ( b_,)Sfʾ=yKNޭ;8k ]vS$**Jz~y^?kvV .7ЧEdme㳦Le{W!I|<:5ǯbϾM|]> Ad U影Kٴkf7$f\6Wp#[yo~XI}[00ew1t!ҾK-OKKٷ;:ԑr&bК]e{g4ye!*_JiҸ62MjمRUa-ƍ*U #6-_S$dIňhU!\/܂ydl4SwiJҬ}%\UVBgk$;R/6Ϟx.H@,-Z y"x׺eIݵ#4`NՠVT4*;w sg|4H´hYG]K*lG' hХ#9zӐ&z+ZGdF0Oei8, \ӞTA{pxmH+lJstEhݺs3wiOUkGktJ[cp$|9dy?UHǶeqѦMNޣC)48U )OH Di XK*U*/' Λ֭+ 6)k,|Йvv_еR^lY0ml B6&\J#>>?Ng>ٌaj/$119%k9t# ,cO{@-&ӼFEAUU#Q1v\ EqqN[^FwtHov4dZ5;ö-''g'b݈xEEż5NV$k7b6\њ5+\^=ߕ?̥h6>^mNrD&[>5d W1HRqѽ}gl,ZYM&aޛ>߳C/¢9>ӎ&ħUi U0)'R7~n$-R25sA3^6IžtieqR5Ժ5<&i-Y!YQA""օPr̃2ߎƩaH8:ZLf,xzdR_%~XB/M>f`廉l ŸY.Lhh_^xWhm]qss" AIV+ؕl7-j䵒9w8ozeÈPFPly$^ ~R%[8{٢1\36dUU&9lCh3Pb,)Ƶ]pqq deҤ"!k2) TR^5!1x:OSEji$7Ć|ze1dQa;%PMh/fA8spW1͂ze( 16dSѺ \D. wZJd,Uv-AӇVTɓhT*.KmW smkcDdCNr.ab7jB 1)}AZ[w,P',,mN-vL._-YK-۽&4г,Cys?Y\oXy^  /_ 'HHfl8# CANzWI;ΧoL'V&>w6sT{Y{I2zW#Bt,4y~?=O_ɞy y`fQ8h.ʙ>_h][-[z$#xt@g6B [S.թUe-Ev)!7p)O~;)vwG\7bLkaIb;_AZIQbF^ f A~9{8YҴ-3ϓQPG?0c0fN&O]]Q%no,E%nNl12afU"iV KQP{z!-Rp3V}8Wm\ Ʋm!Iz'H/Vr2O-jJȍ eD~[)) d6ᵳՕk׮kWn@S=[q~^o쀵]Q3vs&J4o@fU_X7{+vVԂ~'@@hsd(|h-}4y [}6/STjdEa9|q3ch=e$_{Z yP_O[3iVkل)˂q#Brէ!HɧazlrΊ ~B iӘԔޓ d'屒\\4i4$8րƾ2k!{4 ̞3<' n4iDr1p(_T_2;4MDM>_:Jq?VZI|8q25dTy5 o1ev|Qc|Sr^jW5c |u 'ulSOpT_.XZp+ׂQ}+`%!͗մi!#g2.֔W6IkMi Xt<-_ hO3Ax Ν?_JZcEQr*VV.]:V& W^%>1e | Wy2b@4A(ƻ$ YEФfT$&=UBglc(ki5{ ϯ(F%u˃/LҵUPL%YF6i(1~fX+c,5_f*c/S 5W'[ (,W'Kq_laDl4of´l76 TUsTP<1e򧓆M%0)fi|$Z՜:j6U㴴bq5!iלBB#t؋.[4hŲ[I,bÈ0\R:4t+.ǟ-2%ʶ SɲLQoo˳g8pqvl2Z={ÒPH5z} _:&)gq -DXvi$cE*ۃS8ps\u2n&YSF|9"-ߓݣXfe5-mi|0o46Y Bn!,әdwZ%  VR{㌯%rŽwm' `$2A36 hAAa" AAa" AAa" AAa" AAa" AAaP||P oG;{!hɁ[1Tw}Yd٢nV2vߪ^q8Ȩ("rs0 ]kNy>SW1VԫWz->dӄ)*10{ԯOFm܏_҆fm`3Bȑح=M5NÎ| $sl\m]iP#A;cPT@y=h]6@'x㹽ziDMhw9NHSиn]6bk$ZOj$5 IDATƴ}?1(ݲs%{0ke Zs*H*0;ZjEx YY#)!kGgkfv+ẁy Wӑ^^ U<' gDi]8 _Ji T߭ސDLbܶ{УݏXVAU_$)VsC qLS>4+Q8#|W!Y ɸZR ))VVxX=YBN DFFr |˖ŷlY߸Addl9H Nw f Jݜ-؊ `%G zu*Õx^^691)N•v@mЗ5;]ں yll2OZy,֡kӼ?tX5i!m viӔsjZӕrC'ԉ2XTH.ńHG/нOq6m!ɯQ shX:w֛PXc6tҝR"|"ڻt󐀾!#y+g7mf )aq"$4Y3iA,Q"VdLYZ~A̮ #y'=C0;j _adTSUFPr}m?8H < QTR[e ybkvy/Z9jtцh^%@nKA!I;q*"+5X\KWKq|$rlx#d{~1^l|?~>%9d\ބ}#L+*'VKTƿ&cwa?2'zLߌ|~Ti@eDu2ɟAw͛^NNN0(ˌ |s%E%.$8Ȁ_!]S8t"L1ʪ V 6.0ڌ Jd*OM<=.:-dU4E(& g(^xjՈCLJVk+^:j ~5f&ϫ&S jG{(=KM-7J0[~:BK3_*5!p9O]%]Alz6Β s|nKįQqQρ8L$ÿ]~ӆh/;t37BH0=ݽoGw>=Dз(ܺ}3 (í۷Q+KhN@&Q,^sb6 ȶ(QW)dp)Ġfl2d!;d ï,CT{Y/u]ϩX2v5~Mݼ_FH_{@(CC+s+N}8n|v^xnޅ*w3_y>!wyaRxt0GQ%G'ֲeJέf4Xc&q8*$=!U@}=e}PJr272aA?hG Q!G+׉vjEg4qEVS=KM|ʵ+ѕ%I!W9w&qP{ۉP2J4w/\[*N=!EKT>.FDo)Y;rֿΓdF}hu4uڌcJj(wcڞɖX/h2{2v$=/ӦƇ=5tVWLj^)ЦO{DJ6p1Y}2}{ybB:z->HxzwlE[SD\:1*ӧCih\AӀQ=c:?$J@.Lm{1~<7BP58@]؁P a粝X4M`gEUY/^0}<,iѹxl"SB zX hcEcKvwjZtqӴVA5S&f d ZxIeT}ڃ'SF+A*+ 2R#.xNrS^/_]ADdo( ((ƣ%sbcgIɊkjS@lFҨ≍W:u %>-v䫢XSj=QASO;ggA'oIA^H> IU>3ppD@IN >I Xɋk|0P0r$<\Hy=,y (aXc'IHjQpJQ-X;ld['i # "(b!Ҟ O7 5AjRQr> 89::&)22Rc !tTS*-+1A& 䄯o긣Y 𦉀LD &{>d  9Ld !IT.:, 99| 䘤d,2 Bx96z {,qqr$*:dT1!H "cprzCH6J%??ǿFZ~4^?@Ͻ;"nEWSN8Ë7ʤm[ 7]߹OYtW϶Fgx07elkפZqY0%.&hA5#mCRZŹe_СAMj699ItemR_.E)rNNX_zFhA(O8n"Cޟo6&_` ݀ro:4_͎5iP<3GngD5yRBv2$759GlV3'QC&?F0EklD 2>̨EY+cmrUcpoT:B+kAљ Y{i?31 7;"\:=0. ]kNp.au0l=oӇA~*12u:~}AWՏ; }GX}҆V%ɴo<)Xd5sz{qr㗯g%aU(_~AS/K԰S,b zAԩh ?0-12}~}{9ZJ*yB8ɷpTv*!McўXR>Ik ;f3܉ңG_2cz/0e8)sXz7 DoL*8"4Ŗbz1vp,OuEL+ك]+&K@AV)Ӕdw{}T+Îp4OҞ4R9Ǻ~w%(CqHP _ŗ;.ӫtY~?p&hCBGn(a'CJ&L\J!)l}xiPB6 8ˎہ[ĂZ\Hػm nqOx=,aOF>,ڹ:ᩕPc_NʏlI}= ӍNPg\ /=Xyx &noؤnMnZR? ' A 9wĪ13ԚȬXąC|]fI9xn<e0C̛q 6𽏎{)cQI6 $t:H'Dt&?ZHBb&O1bW!Rӕ, *dvh <,̓<6FQcRo\#;0ݦ 'ʟeKmWKϞ}W'YB7V,Z͡e%!QTfX갖%zu>xET /I>Ut\<*&x~6?(w@֥DL7-ț'q|`?.eR(ݿ;^od{NXYiJJJՄ+4 EQ2v<L$rlx#d{~1^ւfEY#-h2.HdYUlm.)JbB"Xb#ILj" I:lt^=9ώS  |s5C'tZfHHToV_2`>c/Rd VR%bg4ۙvPn|U+;p03of\OprqƪbkkG?=3K87g4 .b@e{$7=CqMs$- 9Հ#s0z-Ŗ~@~p@g 5K*)H)t]|kj: 6);H$޿óx5|qP@;/셣"6l%j=Ev!&-!R9![X?DCNxJ4 Kۄ&+ RD\d'ܺXS6~ML> oJKX"T{=~ RPq(X/))*H8:H!w#G4>[ߑ#+~F%+VG@5&q8*is+.iP{v2XJTlH|~keQ]b_CވQS:C:46gҩ0ݭjT| &L瞾ueՃLΌVhV/#ǭhԴ4oZi~UwڿD+Qkק&,*.54Aܪ2OkـdO D3ս)uD06ukQ=9=~ij31~f+(Ka<9퀔'RA3zn۠vxˠ)Ն,ԀA 7OOlHui\?^@{,Ԫ4ft5N:m3O3)vYG_cCZԡzKE%l(~ épKZծɻ}6cD>AƯ/;ê ؁e[  Wnejfe5-mi|H+r&1+&A,LZ`:'E|Οǯr%WuA+_'dfoYIj3릪*gΞb Y)?4h@o @Yt<-_1Iޕ:j6U㴴|\bHc6KiXA&\YV͋`Lx3D~AAxh|d|[NԐ  0  0  0  0  0  0  0  0  0  0  0 BUh>*yfDob'Bn"2Ar5MRϏwрf{wr1/٥ck|5x@'*;JHo+ӥ$NDKC'&WfJ?eԭYuZ-J0'Gfѭ^u>!ѫyq?$);`6T~ sP{3fIΩҶQԧYq!H|p>e:TY3hUbmbrߎ4[u1|w,nS wVz@OքWָ֧:Ĝ]r1rAe[ϙ'9k#jz7 óKH٥zhrdб kաYϙzŃ:Өn-7ʘ-58 Ϗ|G.iԠ.귣D Ovܳ<5MaR%$̻uRi#V]"(c0p23udHG?Ts@E!luiMw4U }:ѬQj65\O8ɧe#>=/odqI=zZL.,mq/_Q+ [iPō'.ځRt OMbAl>i$YAc'Xq8MG\ׇYVb||( dg)oIRtk>XO[c^ͪK Y $rrJ}ɐF>8#S)돂 ̟p~6^I[ouPɅ:y/rAȥ"qlzW%d+_ۈe>x=K{w=DQh<]rp"FuӦ<=uiz|6&>CJ IDATU6s6]J'&F|2cہlTS3q4@ɫȶ]Ccxc$O/ٲ}+VByQc8+`QWcc͟#Y7:eX5qNq?eOEÆ * )FSYc/7Oҝj3+ߩoA`S4T*vݑVmЪ笾QyŋQ._<5PԬ!>6ҫۚ Ã܂#[/N\=&Lީy֒]rUe7e>Ql *Ye,s{_e)Gwit7365fOl|Z$~fl:< U)y_ oL&G%A܎TN̻UARV%nlEzң:}<//āktnsY,ܪ-eF@a^%h^}Z S4>H1]La?V Z~AN‘<ȓ!amd5/e0mЩod3(mqrzyjewxnBz-&i*ҋD;TGBGz&IQze#266<<3;3ٹgn1KUi~3vfD)ؔh.w񌮃T}Wc+/K|LsƢUOTKoq`X-(UE:h\1ѓbXTnħ|;crw9R;>yL'o=,+:qYQybJ:0L(I93}~Hjܑtdz)N0;T'~֠T ɽzHPr0k'hk[?Љ|Xȍ<4nӒm@&*ڄbְƛΚpߚvi^) $Cs;w irOo'~M`'Mdd,TT2g /pI#fkȋ\*JˎTy#-_%A4 B})J8 _jp BuWka[d |P7$+MI[Gϧxsp -r"#0/~3ܺoQ|SԂh LC+{&~M>=2%%ͱ3p4+.䊺Iޙ;2`T~m*4i2#Z2}YniEtb£qnB2:f͊STz$2@A?/XsjHHTy5OÊWh[4|9#| XˁK%1ƙ? WQ[1lh՘ 2@aT!2Z?}/{BoP\)/g3ุ_Cuȯ\qhVY %c:%pݸFdpJB͕1)9]Q ֥Qm3q_Nы9 9)õq52B&xdm- }èҢ^ˏ_^I"U_2hJeZ-7_?boxRjCk#{ԫ5xwޥ&ECh۰;7]*j)k6Ve@Z]π_eyp yYn}dxjFWӂ*h;bR %z^7kQ}9yp_̰I;9ɇ &$li,FA ;1/UH/M̙Ihr #,Ls=|HdbԜ2g!K/84/uh{hJhMwo^F< ]ٸĨ`~Or**yLoˮ}i2s4o|Xt0)3^=9Ž#2N;7]R1#n^6;4<,+čsTƤ>=~2/vޥߐ^ڽ4mvT!x칏0doD,&ۈWɕr4:|: er" 7@ulFUI?l^65S_vwQvq7^MxX֓ 沵ΐX"sXBيWM8?a4"Ru*/K}(WH$!B!a;vo>ѵsgʗ/gi)3d)BFγ~f.z_=TL[}!b=|?݌[=Dǵ sh_9111w$c#)^B+$,6~/#L8'gy&4n;ٵ! /eKgVʼ^e2Tx6/İxN\Zj>vb%sI7{3xCh?ס&JM>~阚*Uc( -k_8:la"KZWl'ڍUYԧ'f9 "V3T8իVtR/) w(n@\<~!/NL" 0"v ύ#GjTm*:**J<3Uޙ B*SyP6 (px4HB&HW*T,X)f\Ԫ]g@nUɞKQ3烘h"^OosR3?Ew(ǣGNR %CQ^?ys&=9- 쨺eJRFIӄ+LZ8˖SV.n1+R-=gٿ"!E! zCW\İgZ/zOOi6԰h\b;o[#l.y^Y1~[ |]\˟ǣ&&&K_wɇBf|׺5;'l36sBx*W,;uܹ;w@:wDreE:v/B!HEb tԉt߾GD& B+_\9IE !ImrB!IB&"Mɷ+9&$dB!T``nEZK""n(5{ȄB0Ʋ_2t!ֺ4]Ӗr9'̈́BtAuREYq…j#(KOTNجvs&2-sF(ObmOf$W.»c4.-IA{R.GsI>j~S;b&uuޢY@]z6/_1BݺW{n#f4jXvk0{O&&pՓǯ*ZI~/ӣo\e+s2Fftl֌mB2ƤCѠh(~)I1};CSqi|obpalG\ 9@~8<܃ iۋGo_& \gУ}/vp;}FIh_s`^/~)PQpۼ?CֳCVř5lU+ń,j(~;CZiB ?4a#kC%eޣQQ#:xy<ʚ]`ìvA3K}wEI43=kѦN8lmn\GRֶ84vpi_qE-{ݮr gT/k(g_^5 I~WH>w7W~ֳ553u2dvhvMfI]{u>r4ˎ\Ꙍu˅mK:WL[΋wv71gN`i'yj# &aԸY5rF3tVNF1r {5's[Y8e4#NϽpGY3g"ȜGEOɤ8f6cGb9|3vSF0~).^#Q"fEC>| ];wFḁl8z:7,b´՜1?SsG0tF7Y'gg!;U>uW3h0lUVl&A986n$ӮmJXZ(X fɆ㢯PԿؒoiYDzExckN~hU<>gHR-kfU5_N/Dnf;mq,Rם)viBCٰy[iL>-=s40>{`ߌN`qhcv6obdU})³όo3Ukfox<~_5A~e'3@kشf6ݞaϸ~L9`y7X>j4cKvJ6K94ufW~^V0la/֊g<+EF%ff!sJʡ~ _Up8F1yGe䩄]ƹ'}y,F`|4|8m0?-v=Bx+˿MŜqkw>FK0άƸU3s=j2LgLDEcNv{ub>Ϛ+ 6ϓ='Kl;Y7f3f8 Ɉ3'/dĖSX`_osɭڴ4+-g҄PMhDzV%ݛ]YrI_!&*`6қr(r>cH?2k$tK7ٷ.N*"ٽyyaUb-Z[Xv^U#?9ò;8#W-fmQ$4k\ b F%"XQ޼q +/ۨn#y3-[^`[W\ ۽(}BP8p8r4= }mk=Gu؋YSN+*鞐MәOHשhw29y^Ȱ QU L;˹Y:5͇b(!έWuԈ;! sfnІ' hv&?A #(lB3^-Sgrk7}:JF4_z5uvu[)U#)0m>J/JG p9t 2qŚ5M %[faLDA"9vҟ_+gE|?u?A}5Y33ʻv3nRNY/R1%՜e1]4c]HEw'X7|.p_dIuq→ݱ:u2OΘ?w~nK2yu @#:2;yݞ&2O?ыx Wba*I^t[ڋ*;κqlFjÓYڤuN2S=|7; ,WRXc=viϬe1;Uǯr%knrf~ȝr/шVN/FUT IDAT T5vBΟ#oN5M]);^%oU]Y(O}Lҋ%7V7(vJsJem'vLn!e+͢:D9W(Q?)֕<.tbW>$QvW$w]BQ:OrʁYp 4~qSncWgJ"~KvʛjQ?2s7™IB)uGO=Lށ_Kᒭngޤ](k(2l%3(4Y1 o՝N\F֔T[D:0`©'ZS ߨbCU!hc@ &(` [iQDF[3~G|T??tȪzl,F},dN]j'1}D,¸atVUOp9p Aq'Eߧc՚@vMk nFF.1s~:[ZuL-[:JBn{5vC!ny0tA f+ą0y` N%~ (qt`ڕ-Z|X] 9T-̞KDgٌ5A;b҆(7{9mh\\П^ P j]90/h͏i3Wdzl j{ 'Wkg' $ W6s@9_.q=7r֌ҞI}D;wP0 8pMǷT.yLƖ-;V╏Og{b;/pj &zc(A׮]6H!/b7U Od5VYT;zƙyuPA^ELQ3%bڍkBBCPpN S0}B'~d@q-[ѷ4ccNJ~c3þĸ#xt5yɟDY3G֘ڬ3WkB\f3i}$AӰn\дVӚy (>y{^ f?X9i'm%hߪ*h=v[y( śҼ(V,9Ή(rx1].Y_*[.T!+`Y*j\ٽSz ˋMzToxcEF]&=nh(! /,=rc8sq+8Zj%JR i:>F*adđ)ߥ?|޲+4ν>]u(I | 3=|8q8Fe t׃6RP k's<퇵8ًS~a~3_hTڇ/`gg+NW*0|%V 7w]RAYӭ_RVa;+W'֦roQrQ‚c{&d(F,*߬ aV-.45W O5;)դ9f cםY'gWZofؘm7 HI|?2ShAlˎoEZβIԭUKٛ|G@ K&!dAk2`-J*syNk,*߭йt'ƍn3h3'Z˂dmިug&>`%]b^w~9|Ho9oQ(ap@)T W0/o* -5 nptß,E?a;z~7_{b5E//?7ͪ]\Y]\;+amj8āsuJC3tk׎}`u#g 7qfBr y1T?D=IU^m~E,lɛțr-Gj,Z[Zz5-Gme؊Y/Oݕ6%$/F>AR=~3 ԆɦY :,ȟMO!=5(s .{y}1@mG4g)3$l3yO.!S~=ĥ#n.;ꧢU ގW c1.4'vOH*Yȓ;g^gP@`YpFgtͪn~+M9(L;:ފ*ܸ@x|b)p,㧨7g̅Ll#G)AvMsDZ&,J7{Ӿ W֮b+j+~YR{^.7/x?fT6&1qz;`oHNEض};U*W|:F3>UII5tMO1EEAUUt4j{N\!&M$ϾINO^ocgeSHf WF0cK.8+6㲳iq>xj'~9T_K6Uǭ(-~TG" jw[Ke`^F\;YO(*6);:nMc$^x 2ޫwf j\ю&?\ո|Q&]9øO$o5v/|1-1USy2u-[Q|yk1pĤ|pOni)zTvǗ]n*Me=>f~g]֓ 沵ΐX"н6l6d9(>JFd?9ɞ3=g(^/߿gN⽉; Gt\fN8qNo)S{q$^7_cMiSwfs{MK<1~ԋT*v E5OO$o I0d.Zt*Lq/B<(ΔF[>nD 3"rت;. Rs7eְH7[w͗m'5.IDf/go3k<5tj>ƅBt B!ă! B!IB&Be !Bx$dB!^& B!IB&Be !Bx$dinBI$!KCDF=B!)V$ְx_'\9srYr& 0Z-B{"9s,9sVH4 S2]׭!!"(B@?r"$$Z- IXhh#kB!K@)!B$GnB!2It4kH!?_B!Dz B!IB&Be !Bx$dB!^& B!IB&Be !Bx$dB!^& B!IB&Be !Bx1!-B!??? `gBm8&dB!m]_oQm,x|5/J4Z$#FlN3]uc-/UUK)UA"IU'Ri/kRݶo;!{/0mYK*.5#wfKnf-vW=hTȐ1w}rrG7l)֕,wK.;RJK]ٴys6V7pAtφB-آ0f져KzLeh9~]IGB}Ӓ8[[간ۏ 76ѰUGFo j|&/~VWou \ m[c}H:yr7mLR+\n.{BG֬rD1Gl,?|Ӊ> OjFTD8Zh&\jHFpnEPcƎ:StBƗTL>}ҵkLQ< %,kנi ,̖. @y =svGd|s}"6l{WJsϺ["U jVdPdUjeCU4kV+kp 0[~[YgX듓\"JNogO;z`jc^⑗)k6zuhOׁC[ 1 %2qPm6*IP  Ay;_'\ !(8U+Lַ_GE j׮u;VRۗ/KJطo? 2i`t΍BtgTkdB&Sf)~R2eM+4^4q;lD'5_^n>U._ 8h-Q۽ֲ>6V=ti[KLs;c'[;SyZ/M^DU)_QCȒ5:d,_Ɋ;~@2''DPBB'/r{S|8/㤝4kҔISPfD5f\ҵ+{b츱4k̴ŭ*6so}_f޿t`\LQԫ Enr=S71s&|˿̴!-z.B*-Y2gɷX:>4b/6u̒[=Ky,ḛ܎;Qg- !#Fy坶}dG_˔)9R#͒mt8˾)'g!a`4o 0|4-Pqy U7OCI\Ui^?}2*svvEu[PZUOgزcq#Z lTO^Y9f[/;qEfѫ0rJ}xRmSr7mLZ9IRjT6,OB<߄Pt{y%R \=Cf'J>ECytǓ6xsR}S,z(Փ=vV7(Q8o~ƎKRݫ'J!% KDJUkH XvU {t?ْQ3O&kC@ހoF1xHG^xD#[kk_ʴcwp=$/U3[tkِ\l[]K%3Ǎe\!ad(rR4.SX[&K!;}VB8īUX.tnYv-k׶=2ǎ: t 1̠o;tq8.:ip[I%3l$\8Ʋ-DbxPO Ν풊%W6Xwyٺc5C!AbؼJx?7FӲ5n-Cc]Io ηbpg+B5K\R`.[skv'$t<'`mW!c}3ϓY%Wgv԰hζ.[zuB}>ZԺIm'y Yj^6֘lS=tNc٨7IB!;`d{jc,e3kZ1ԴIӓƬ԰X6kB!H?*~<ݰc-Xy YJ/޼;>$BϞ&5f*%dxaI\Yo.["؈qyu1N7>)(Gܿ ~!~9˒z3s;+Otś u:sG[qcn,kq"M er݊qvECSNB8z(Z%Ҙ#YRC'qҥIͬ0aXOtkre벙QgֶZ|LO$Ex&O+I`hdV!,,/fzj%VIDATgǎ2RLXXkUjX&sf0sԔJȒs/CB<7m\g̭e' !@P+ e2햄nl6 V!44EQ,al䁵o.ݚm1ʺ Yjyk]tOX&sB!>sm:#f3e+Ot!-^޺[uJ*nfB!EQKĒǭql^'uٓYZ&dV)`O;\ts#` 5&:B!_6ƭE>MMC'OZXozPfo/!"mXLuRuV沵.H2O;#)vɕbֹu$XMuB!>s6Y}uR,夘s? u%SO1h=pSQB!I5S9\Gl,[<=ŬOB$s/m\֛'!Bx~ǏrkKٺ1ubVzz$Wڙ0bq2_4B!w}ut|eӔ9')էNȌR~cgZ7Ǎ[7◍_gIgP+( !%:z\72$yJČ9fXڙYI-'%5m5IJJ<՛clMmj3*c٨$hgL˷~~~eŗecnޖy;Ʋ (ϼl}XYRB<><%I% I%!S̜˷$o1iMQﻌy([Q-&&n:jfml\g~{дnTgčun,fbf)էN(㞖[Ϻ q;TP1 P8{|_ouF2flHdʚ81'fFlyIńB<~Ϙ{ɌOqO3ɔQ1%czOq㛟yRuvOqOI2!$7x4u+$sQ6ǭ17q uuF?ď q:W[cu4̺ly'~B<\œ{'sX&9(~i8 㬼@2ְ4]uj@V\eȖBVx^8?.6i$p]\ZZ0WnbXs<8^c̵٦p9ǹ4&-eUc](b Q*P2d`1}`ky/ F s+A}.k_GT;qHgeT1ƘIedpVqE5UlXf3zcy8Lc矮kp^U9$5MK c﫾ijACZو3H6=jzz -HWW|xc/7x6Yf,٠aO\lk"dzc|z&"~Ըl8bN:̠m!M8FuȺ]eȎbW ]ZsΈm}YiIx,:^j0*u]d1Ƙ';P1Yjyb6KyTlA5_(yhMɴNC$ܒ?<u|0c& Z}k1=\Īg5cÚqq-lXI `Tj丧7յb4dK<䬳3kΦ ubSfW1̙*73{Rh:LXca:kܧ:=(rhJgZ&GKf!VsfHհ ƛ/DG :z4Gsk>L1ƘaPsyX{*#߆-5\ڠTuELSڐ%Apt-?[<0F ilZ h~<ɳ5WTJ7TƠ Uoijp<`bG#_֜a]+)uH>=^U:4?%F#g GшuFu͕^cg3ZÅ/!*3Y:7D\.ңXXg3fz 7U%^k=Mo \M.\obo-CFP=РfPc~ziдΈyh #V]s^C5"5Ъm C6!c8P/[< -"o"_8ϡ5֠i1k1sζ Ez}ZV3V\ wjFs0RmȘ%^͌zZPTߐa?!~q]>LjY=ӌ1\5uδej-uU:Q2e.C,p:?4^˴t|xb\ߖ9{5&1k1|jQdEtָGuh0M#&xUoXՑеsԁ\S 3:5.GKW-Yߌu:hQ*cߠ2!z3kTV-YqFUa3A5\cuڈ<T{c>=:rڣ5^Z֗iVLk5}\nCijQ0y=@: s%׸WHt=jhՔ^c1gVV/ת>ќcYUJYӲeu i+fQp1k#z+ߍijcx5Uzk5gZD*=]cu^Jѯwyst#uY<6-hF:נiizf1:Z:L^Z:bz:kk3P~ZDmF29պٚƱzҫc {yīfմޫe1f:9uYѪjS}pk@fT2Ms~ֵh>S9.jڧy~c1?Y3)ўZէ5{kMuuͳhjS}xjFz5յ:9Yc&3 j[c9-|kMV˴ܨ T_(tg=uy5@seo}f{XP]LQ Xd{k[9jc1rԡdEcFg3bַo ӫ⨞!>G[X` f(W=zָDuxnQZ51Z^*=QL㼚3MgĪoVzF3jnOgQ=Þc>=Cת1buՓLG s=HOk_f`'ⵖ\YOkfZ3G31Ƙ8␯أgqNk:E4͡i3մO󊑾a8Gڗhi&8GزceI5Ѿ ~ճ51Ӽ!h_k3WٺiT1sPeSճ*o1;7Y_eވ3z^Şc[[+T&'ϴѾ)>gxoZc*fT{Gl[c1̮T橊V_/1?;UuFLˀjLVSMsPc̙T&Cu#r (1Z{m*0{9<#4WغcbIꙦhlhm6qv4W޳:_^=y>c15}@g M\}^o?"_hQ[9z?c1 D_yF֣cvlfzMj{Rϸ1S;ZiYߨQ-f]`Z7gZEUcF1Ƙ=V_d1]7ۿw![ǖ5Z{bc1LfLL/e5y!fTaZZGkçrhW*=]a-k{غiѪEc1?iSoFٺu)a}Y#zL1s3dӫg=kLٳVk/bwW]c{D\gwo={Y{(zx﹯=k[;_q>c6G}fGٳɇ{ۻ~=سc9=feQ^cS {U1c~Ws dc'.3o6>1ƘO4ig pHYs+ IDATx^wxU̦w]XwŮ{ "Q}UD+"HBH&ْ&y{=3;=-B!B!B!B!B!B!B!B!B!B!B:eQrBM,= "C ړc(BHV+RL&H!=)bCBVoW!؛7Eھ\4B!D >ھV 㩯 ! A}I߰ z u!b_RWES]'""#;B!g." HHmW!Evno*Du_õpjI!!.OND @c_ !NC+(kND4I6ͺB!DԦpͺ>j~D4Ԣ66vCw!ؿ u;6ۭͺ&ܟڬ v[AhQWBQꪨe?l6UCks?j*vCp9PrBJLn@vjnX4m~\!*^j3o,X5FM .jۘ[D'B8 wo{ncnq?_u¢>'& WܟP %W!PPrmn+[uj&PjmPN17rB!j#_1SS BzZ}L3|p_)l̉SSo  !74sl NR@ 5czc:=Gs 5 !7p۞S\}'N9zLs,P 5rRu_cNPlB 6Ϧws̟HH]MUX}'N9N1Uq75]O!ޥBƝb:='ԾJ HCVWw 6ϦWcz1Ә6BInņcz1>j?`ͫHl?\ﯯ*=j?Pf!ԤHu=?ԾͭskJ~(!us+r=ǭrqk;qwSuBԟuw $-ǭrqw9 6B I$'`lTW}w[i=q!6BnԷqCi=qT;'`Bɉ?m4ϩH*;봎Q~Ro\$\9B! 5q+z*@}!n}=[So6*~ 1uisu x@eMbE/~ԛWL-xhv\zQ`r.\!/7BC6[v\oj<:1;Wͱccomβzu-p{prێ[Vdm}}C98czac[}.}^c:qB)P6un]!s B eLuZ^G߾6uLm'nnE YM+HGz1ǂ-Ĝ\m:n-.bV*@lz!.ꕚW+}ˎG]tJ)fcYZf{`8=pڎSLUTtQ %"ˌK[MIktbTec!1ʞ\ zL}uAԌRooG{rSYم]BʎzMƝb! rڎȘNz-WZ1Qo\n^nƵZѬ|]!BDu^ʄwn/j!eB(:1XHZ ٜb6xrZԢʩx0Ř :¢=ׯYu q!BD$dvOoUZZAYUpʯ"@8Ճ}c#%щ׮k`1!BDa&$@y[L.15mu*ӃV9NnS\6!BD^FLtt瘘|Nm<}>W9j- K~ۉjL1;#J;**,_'3ôEQgwKbՄB FeY&y esoiq;ReC֯UAVw}q5O-Μ 55檤x-KLðW+%S  B!jퟶP /Ҷ1{B֋ 5noKU#p+7bq1_j(-.$~#mN#6V;iymf!,˲?'ӡxՉ-S +dy|T=?cnRVF>J M}wvKnMJ[ !"{nR9?k(c,+ejߎ ǝbW 2q5۸}B̑׻.$4bטh+-7~9+rs4MXVνB`.ϐ铞Qo6s+кD\o6oբK+&mTzIF_fZۣ1xⓉL]/LbbLpqQ?.zo2w^JaԱ=vztBByMmg/(os>ǫc쾞Prâ^~Pcj_ُM-<7;xY.D'U~.,m1V.^/^YH-n8"vgifǮkh~:v1x0 ?Nf#cLII6[ۯȊU/f`Y9L{]S䇟gyz8,.:,Vˇ ?oSoWQM0Z=?֮۠1 oh\[ѩc~:KӣO9!3kn8$$cFO^=ӫh=q}z#Շ\@B̞tfSRo9*X+ۃz_t0bvܭVOt5һa*KtE/u$6oifh4p#mO, s1m|$ܨŘ͞dj3ቪ-^JT5)~}*u^=Xn= fXE/ XZo0&Zj_+WzSTU]#c)*y<5mZdw0XbV-}g&;v줰4v$i.LշwOx^x^dq+}{|ݓFgYbe{dbn,v\9}LaU!=(qzsKjcAI'&Wef44]w0 . :lXgioҭK'.>*{w?OIQ6l$7/^ݻ2wRiݪ%s?_~*ko%{`NaW_aPRZoO?sѩc{ڷm͞"{>|>5Ϧs駒ȪVܔkN\w%lќ^}.Z:yo g9&Mؾs_+<nZztJ\\6o/ev$$&Rk/O{y G5TedO85hcioE4kfKqۍQrȻ8oo.z.Y|1c& :/:f͚ |,zNF<|>;3KONau箑gՃ#nG0z~K3Ɍq3OM[oISY\kL*B퟼@si 5fS' շQu]ԃd(}\o.L\1[Eoֵ-E4Mq Ib|KҧW[쯕̚=%E)^zg_~ P0ǃ]_7yv|>c&eUy;}8!}t<7o#ckYmFz#n1=&î婉y&쓏?0 fMҶu+nnRSyGٽ+m۹+yd|>+V?"''N>뮺#FaY>ɤ^cMthۆ{!~}.[ 8}|Wԓ4Mi$eѱC;srciٹ/YbqqIVv>_)/~F:odzO>/άs(--劋/Ƒw1꾇ʮ<שW=<,2޷wO}8y+kvUnއʲ,,ZR&D.^Zsve(_1;gަ+D>0*K:f(jJ=2\rEK䳓(.c`a s-`-һgw0Xj}j|>>/+Vs+^"YYn=%%%|lڼZѤ1zt>dwa!v{2Ё$&$Tte0/fPTTĶ;Xfɦ-[)--e?h٢yEVy h4Xn=^k֒M&+4oXɇ~[>m۶.`b^½{w!.|Vf@$cN~wJJKٴe+?Ca`__r7o39#?/hۺP;9@۪Yիb/shݪeŘnނEp ͛6(XENn4oZxm_| ;wfVُ'IMI!&&Z4=lٺ"~F֬]GVvM3QI~˾5ɵէWjqomyL o:l9αLz_7BԸہ>vOZt9_D^=cծ4NOcu}˲r6nƍ]XHAض;0M?o^(--%7//R( yg΁}{!Sc$11˂T 80M,Ų?v~Mݜ}\}E|tf|SVi/]:giFc, 7Ҙ_dfeӻG7&(/bl[ =-ʿJNII Q?eѸ1mZ͗'WĐ|cΝ풒*WMUӸ˿yVmfVt>C'N#:z.C{Fb?1À 7)prqGeAZjJ *YzuPVMڅ1wg'moG=p>UZS*l0VTvŠzw[-` 2AE/@K={Jڕ1&+=O#ڋS'"̸R<1>Pibj񅡾{2z-<>{W^ᑝ8Sٲu{9.bgV6Q9@Ryr*P5yy4JOKNJҷ员@bBye k4o$}/4 942OvvZd'֥3tw}kbYoT\͞'M{A,["oY_<8fnc9<6v /|eq[@zZZ~FdKSy֬iF"euP˺;ST)'у3p8rshժ%/N|笋C5qfV?wq+ݕ[z㵌a-W*X]pdh2=M3pQxCѣk.0}xP$UP/s~ԥMQz^ Y-\L]ٺm[.``>b0ٌ̞֮'Z6!66y UrT?=7^zbWxʔ6RYx/殑sOk_Jߟ |J^<̬,/]^;W~O^ݹc άe_gD^71 !jA<1fdR>eSԥ:Թmƃ:aj1}ojL $]C.B@-˲z΁WIe}0 Zl݅Tl[z~ڹQ?po:'ՐAJJ2IBv^iCה,lBΚ|2`6T[mgԽڄI/P!Sessiy[-b]h9v1NNqzW ~ն1jzv1q\Ϟ\ y'R!HR܊&5O;n:,؂GNzSO˰!ΰ|`9=!B(^R<,(_}nm7~XD ?߸z2N7j])ߵcB!D0n77nvi GD]dN=p`'}|N!~9m/9>Mө6`qqst+jVcB!NsSLҦrlNqN!DAsZn?O!àlnAxeX}7} H6D=qxթ!!BԵ{m(_Vje7˗uv[XQzqmMυ8t!$A K!B/s>sj `<8!pt *8NSBQhS SD ?NyI=inB!Dpܩz9SXD  ROxB!jD'P|ɂ,䖧p;n'T!ߜmtu,Y(By(T trB!ӼF $܈tAAqsۆw1}\! >Osvc6}{*6"J3iL?@n9j[GeYd$'/oi>,D(TI"^-f)vqbj.}7yHMNIF C~@,(Go5Wcj7r:1.sg&YXV9BuN?NçFSA"Ғ22h}>?s>UA߲T;0:m)99yRg$),ؓErr9zi8sJnp>0mq#Fަ i9-:4 F k~i^7;qׄA^E B?XƝN8DŽدXx zu.ľU{q]cPoY֖6fqq!Bm.X7dp:6cB!hXJY`[^J[!#i]Yj9pr !\6 `O@yB!5h  v` ߧ0oR,~m}>%6%jϻƌdڒ|můCv>WV.?<}Oi|gsӇl QsScQs8vOV湩aU?{i`ꔵg|.\͎t9b LRcNcVui7|>~8~`1$5@ce1T?7U^ƠM PjѴ|>gĶp/χ/,/7ǑX~}gܒg޾~ӱ0cy'ޚ 7dV>?Ok˛r=1c:HޯskH:nsiϺ9,6b@$u9 | `{2d m/?»s}:i~GuoF,F]߳1ATy{)ˇ5Wjz. R;L .p @4=N<9_kZ\{= h>S~ZOI#f/1 TcY14kZ_@s~YCz ',}fo(!tF]kaι<\ ~,'·*%kg.][xbLzaEosyxdx {Ll)K̞F}emȥ8 s% jN~$BΘϺRbtasAe}<{R6oM3o& v%W߁x}_fxLOT Ϡ?Ǧ<|!g1}#fdH~'q!N}bqM IEfz^MW3Uo nʡȤqSMb\loo.K<3&~8vi~0g\vGboxoXm}3 R6o灳;M.?{w~XI7G]zs$Nlq=3䔳1'ߊnLiR6ePؙSo}Ǵ ʻ<ԯYdפ g(eM)xΉ'{ycDv/ Ͼ˯vݴgŵӕw+3΋kxvI͊Nd[*f}9;{Xs#`&6߅%<8Mm1ķ9O`i`yC7|j%c++cstHÚ/c‹Хp.y;d&-q/L9 oIZEܷ#}xj!k;&tē:7?ie凯Yrރa$Ѽ<~4{{8ڎ7K71{^сyqLPƝ!o,?/̧!F)kе˚ovO㮃d5I?cd@ s8Ai7i'꼑ߠ _nagƻs9E7zI&!mo呕[hkO''qdM,\SQ+f'j6,멜;_Rr趉e[IsuH&Ej׃螸matd4n:u,CoNѰus7v3z$΃'~~fQQ32 V!y;Z$QV&ǃЖݚ҅^Ϋ+_0v DQ!) 'N<X܅XHNЂzԿrwsjr9#Z%GӃ簖`ʤ'cLm仯WcheI˾=#(O|(wYJ]0zsdwxobb׭󑗒j/뿜ʫK0e:>N IRr ѝۏ|3|_KzUoO g{!>$&RZ )ڲ%V¬$=ɴД87k>sV_Yt0JoY_ Ve}6~c7|:w VYi;}t=E(%kwZW? ?Cv|ɋ_Г'49YDJ1xV| ׌mXפ#]ZSR\eAJz æb,&GʀuҷkمQBl.t~$FjMƱC)}~^ϊciQ4>;/d/z7~mqw#t =xѥSS)֑C.34*ߚr7j?=[yv[q}<]u<K3'KTT,i岳:e4tG'}zH-2/>}8l`{zEԣ-|j4i~ ;.&føn>h2wCCzù64S7bveܰ??n$ib5-qf̝˯Do \}$ǥc82m`e+Ţ>bh֏C_&0l{$)" IDAT}caҔ1NK2NJpjq.r#GC3)+s 6frը1t;kIԖ0aI~e"^;J$XF]SshT 8]N<_Nbl @eFN>Ӧ2(z]|?9kn)'3l%a\tSkY(:^u8.i["H A9zP՛}thf/M D+ڶǣ1O</oA\Օ XO 40(u"܃GG@R?b!^*UQT>*?-,,_}ˇϲ?~(XUʪcUy\e#ð(6}Q9afv|j*| {X>oc(sSe4gaxL |N5 ̊ǨgxL1+Jᵌu쾏eY><},Z6fUeǼ1V0Ͳʏŏy*;sJs(U<疽M[s_>Uy^ߟץ ^n؇Ɩ' (-yqKK{U/mfS-XZBRvnς&U&t@]b̰ *WV{F5j7)[)xB!_#T%]49$T_zi+ J&n y3TY9ŀι~rs)ܯ?Vy:BHAnq%6pm?M!gHA˜ 8\B!L FBoB!b"B!D=L!IA&BQϤ B!g-2L]zXz1P;ezHR0a$$$ТysRSSaFREЮ] / QO9Y:@=$D u`׮6m EYIAaaB5@͒iݪko, ?B!DvGmwott~]^!!L!IA&BQϤ B!gR !B3)ȄB!dB!L 2!Bz&B!D=L!IA&BQϤ B!gR !B3)ȄB!d",1cs !A w#aa`zIoݕAC֋hX,^_x1+{!35!,(gw_Oylv?Ej?)?ǫ !Bր(T :c;|w#h=3>3YMzz䍜z@28FxRl"Xe7I]0X3m2,@^TAƜށ*,b}>_=Vv8=j.LWdv[>Nn~}\>h>N%[ݒî{v#[9${/nOt6y>YV vF]؇4q{_ucFr(b%W=l[86wfp&xꯞy}:3g#72isƿ6e|\1#f~"C=sS=)>rֆ?Y>]|}?to}5_x _=oL^3߄o*][v2\=OO:>|4?a4chMO?[>5W>S/g\,o*8BB eS/tQ }&90˙M_z1}Fs$g{JU@4~.=b$t`]NKk6;X= Q$v8+NiŸ$ԘqzHr(gm]xi|Q [|`ax<qQĵ:1%XR6aq ! e`Ecx6D%ƎdD$^ i;>j']'tL{8Y'*d˅K@"dq#qw:( W/yo&{K͎ӓE7Ÿ1qzl?C|UUE "HS4 #| 507.y0^~ LhqᢍJpX(5aRtHW.iZk\bq؀4XҙBHB!5SOWb(JXU.E٠h3!~(jnƒ2(PkE^eM P1Dԥh Jue6OʘRCLM+) J(Z --8`z[4shc~B!D6',s;7Ooeg +^ #jʏKk bm hY0-[dP~r-|8 :&AU(?l{|z4Wn&]/z|0b~f3Yt/ro€qa^:̵=O>T1#8n|=Ǯ+nKoDB^h?1}ۜl6_i6ϙʼͿqb&wK.b;'3gD'*ݫh3fx8 V3L/`)@xkU ;ufU>30/3P+깲z,?2=:SJ {ktZY6ꓗ1؉ex~:4%/@Jn5}P-j4>?x6i4 rGM#Y~]W[I^܍JS]G׿\ N x'ye`g rԵ]azxe@' Rq{ -:'qnN\T /94vaaۇ.eXJӪ6-Xw0W!/?JI5:،Żh2_ qN?{ab h DZ{Bnk-6{Jc\/fup#":^CQ=Tm'+X93Crhn=b)ڋιse!,zj>W !Җzo.ސΰcӖuvlEPTVPmӖfӆ% ,}8_+ v:׈1Š)1G,[&1'nJ~Sn󍛓ׅ_z{Xq53ZbٴUeii;o`7OIl/[h/Y8WIȲ#%je X ߛ`RPC)W&| 4Cm?BPx\n̚J t3L5SS7F)ۨ&/XxliW"ɏBҪDD EAUUTMCR~[z<\Bmx93Uʄ{0*N'ί˯ 5kœ-{'ϮѱʦxV=;&`*ͣSτٯ(ٳ\O3*vCxi>6y~=şzݸ{c( |Z;Vj.rP (|@Z!oc򿷘[V@UCʥ(v^Gq1LhT6㹨,=fuݎZp(~ߊ14 pERT4 Jҏ'I׌J:IO`FLt,1θ͛9G}ܦ_Ì95i UcC#Dq; g]aƥ8_D! F[g3)/]L*'5GXlͥ(2AZ Z-)QP5LVZHWv+PPg~smAymQuE5ם!H̶|Բy,u4nsND2PO߱:1uj&w h1@Ep™#gaRMC}?kgu(SQ'ӌƷ5ڎeP~\_cm hk@˪p- U'8bX0 HcaEӺi QG9| s—*yOǣcҮU;v ;sA8 tHՋgI4o)i]#8_.V=*xL2ԢiSw%WsZ hEӶaV.H.I.ћرpq'|~8kC3?B`DP5:"MLn_>e5n~LfڢCbj/W1BFzȲ1GgAPyzwx@|sYF+.'hxQ 燢{;zoj#Ƶz)}>`Ƹgs97%f̐w98)"3@Oޞ5%i=&2Lz4K5bGs0ZCíxO$^Fi4]A#X1ƍ:U_އyl$J_MU!uf"aDh(7R*DG= O) 3ѭxfFL:<67OJڦHb*$lrJOjJ9(O5)v7 |IC[)(넷H:mG:kuM*7Z (LA#IUCFdqPۼ1&{MBT>C0u{t) erp,cR:~\ t(i3 4.QQ1o1up [oL{un%j6uDQp~eR]cTuoW9/Ro2 Gff ){m~rpfmۋNmM0 OHϢbEg4jZ arm۰mps]NH>Yq)ܯn8~zN$@)^}7^-b8:z.Jr3Ӎ(K J nz}ܮSxaٻa<ǹkƶI䘤9V\eT9/Ro* nԱt|ҝGnrnWl[Lƒ$dBW~쓼Cdqą&eG#!+Q IDAT!H<b#9z2K{l@l+/V@?ϢGQN*;dL⓵}(pĹ&dQw_eC%9pH>-Ie6e׍3&oAi8Պ3xyy=Ч;IȲ3B! !Bd1IȄB!$dB!YL2!B,& B!DL!DqIN<9ZO2/\0}Wrv5ü߭v'rOGy߱9~v9= x{ ~+;04?l#wdNĺK?Goaq{k,{w~yUm"ǒ,G'hT&~e ?oӸך{ilg`|p7_vghڰ>u</Md;s VM/ңq4*=FȫyS U5jyc[ymF!-^jZO3;G/)ZDE*D&W vvn+w6bܲ&&,۵Yvt7 QXn9MwL0Öxg:[V#i~R2s`zwHViX?m@rǝ[~g;ӪE ǗGn&Xds<ڪ%:凸z/rCz%.YQaIB| (Jz(f2z;:=[]zx6]ێG+8["MlF‰Ճ쌶a3=G-i֪ü߽73ןnOi58Nln5AfMdvt;V]8mdV4oٚv_ffMd6兗jr M2sOkNmyi?Uv;]wOXAtmےm9FQޟ{61w{5yeg\s~v9=cMcX8KNy6o+ۻ3Zo0oO4:u'c[taa{3yv[f<蔣.qlݜ^o3-v&$M.pCSfThejQq|s] 9z4/U(ύ}?y5GCsO;P y;|6ud?83I^*@gFW\؆WZdn8pZEZT2{)+?Ց)`^gl+6ykG1' IٖV d@bhS7ygn[Hy6tTɘ3d?/2B̛Zw>^ݔP%GlQ:7?)QgL Ϭ۽"ϰEoS5@ٓ\Ao֝p&GCyƌx"9[ :S#ةNmxJ[ ,Cum>g",_'9f*#,nau`|M$r Ǻ^.9y$Əf%駟1 ^xٍÆxId1pho$ﮩɴNSڪ~e |w)|֤őȳx r{LN RL W.BHF*jTX<,Ҿ^ڴsu%]*I* 0kC*QW.$whB%[;( UTՑक़_d*+֢l/&͗5R82I]Tiߑdt[(LkYi?M.R"wyWd;7^S݈ F3S [ޛJsPT-E;Άѭ!fL%h߮Q۷q4M0k?U >.uݞ2 0cm蹪-x*_ho`}?FE7{R#[Rx5]E^ok%(B{ݎ-21t;88l5sVB(%hg-^-\W+{LqJ㙐%ϵ P k9_h٫<1-KptF ]15?g%S{"V`hyq3% Էc~.)Rs}"v;Uu(wto ּ7#pb'+W`9ۯpnSkFt2#yB\kw$?\ +^dάݜz{*JWC2J<$!ˉn6m 8/\`kzwo*Uԡ_̖SlہP2Ѫq㇤ߪ>%:;Gdܮ=i0!fO:&`OB@h!eQ4p;X)*w w(Z3oiYv5 O&(v;OzQ+WC3+ '&& 9c^SP *ٜ^l} |@CRC ƥ(;rӣm&,ׅ;$w&BF{sR NKyT>v9!vHZkiI ٝR\T*M{ ɝNsU=Kf=F&@QxׯqCw. 5+%[PQwBQ| գZ'šjt/ϖ_7Ikq b~Ů|-hWs ֠CP~\+q1Sl4 ŭ|K=AcWlSWMҶ4ov+%e۹sS<-~'RJdWr(u~[?MLhEӪ/,]MSH:Ɖ4)e[po.\f#l:dRP9NQ|#r41ս| Vn2%7h4Ms0PT3 PĤ j{,+9QS =PU|ŠS2VJT-Bصl}l5e3v[{3ޜLм?-`ES1.pTlڽ&.As/߇= \j#N͝OiޗO%n+\sCŹ8|¡_9.4#o*T/-+mMbxWn]3TAq 1c, ^1qgK{ȶsl^{R-^% QE+J,[ǖqp k|a>sCsbsSц =yt{%/wfx| SGEQu(ϥ_DZ\+GAx(Oiƍ?Y33MKS7 @S t{MF~el>ƿ;# *DX VQ}}ڟ7?ŹD>A*w$ juXد#.]Ǽ@o01d FxyZxwFޔ{~oϷrJC 9rB@ؽlo//?a/^>бj)c:O:vCA9fǎ4lsm}YtWL씑ZV `5U ۝6p qnGF:/a2̎KAb% Cr\J\7qn@\ _+V Β1EEsGhg- B{bCtUh=a=g::Ge__vlj9$dBwjP^ Yn$"v+:3vZxHB& 5s=ii9B!$!B!b !Bd1IȄBf<9 ۲Xf"+Qr#r/H|2&98~8%J<±cY$ IȲ;BlᏋzJpœ;_%1ѳ8[2ܟMpp,ل$dٚ$cB#((EQ nufKiY$ IȄBDPPg6~!B,& B!DL!"IB&B$!B!b0 '3z4x=?;sF*VU+ȁkĈφg0ud5H:UU1]`g=Xm╯bS|FiCӺhYuۤNͤy8u5Mzy}ٞb֑5ӓ^n9ɽZg:>M'>E!&1,gp heGzXw2'EoTUd6໯D}swQhF 7KQ|8a5"B*x[ݕ3u|#7-_onƛtz| ^ǵTES_K;p6 ]T|Atsd͌T|ҮkN7> &?J?o9=vhVgqzPnLXxJDUVܖ$d9 rn_bYĚE+ۗ"¤P7Tpls+mtRp tiQѫ\eܖ˽nκc6#8v|[NM1LSy:ESzh_-d_>,d|&=WCҎOiQ2>n|Gsޜ%=v"##,Rbr=Jҥ=E6 irVCU;vb0z>>mݟwWgU ($N7ZM?:ޙ #+׳[M>A)E1,F[V3 f :f7я~Ϧ3d]ʫ7qyNаŒ 55g|7־Gbd,<\=ޑ;;;IL Ldۖʥ:O\xq;K3E*տgc .Q,EOr씝Oq' uRZbw4fOs|V(JoooEVJ"MHYN((,5O=H2S uTRf)M|Ҵސ&Td7gaT'p7nWI:{eɟMOP> M ҳݨHEXyx6|M(EN%;10,OU/M *q2CW#"ύE<9F-QgQ[ħn|$㶻P|JbEf3>t !,Q2Id.>iM?>w|j;{d^^^TH& v|E)J"vq7-alquHN #,TM:ચni3yY<>%_KpnQ|#uktl QG܉GC5B%BE1yv|"TO E ҳb^(~X.R7HLH_G"&ݺ>~⃟Dg$Xߝqt#BA*8~-g1\VB;iiW| z{;Dh*ziiEJP0 o VPqir-JG^\κElXQ?>~;Ƶ)H;pgf:Йwu9T|ҬA|jBTُ7POwtO`!N]fr-C W”Ⱦϗs0/\ϡW҄V)mJd10OϹP-uBL!0w'r?U)86 vq =!#ڦӼ/ZvXέd&(1?CU{rzM٪x:zr3y(bퟥsJ|V,||Ү~|jk=>BIzD>7y2\%h֨ 3tv.ZxQs$<ԭne|E1`TQQb<>~"Πwa4)RIٚMAq;;L%t:[/!W1,Rtmʈޜ3=s*}暞3jV ½29? Ftmt oj?3~UP#趬 sV \KXRTUm"oji#P0)-:=[#(*Z6GM?>Lws'x0ev_Vƹƻw|vj@s ܆]/0 /r`:a})=UtZf}wOTkCE9nAHZCn()uqMEAU@Oc >Cv6EQ~eヸ>h ovYAU{| t]O>QƲƻBL1 t˗R2Cc(,*o,Yzu vpf,}¾;^]ll_i֭yرc 6}[aw~*EFz,:;e䠱V;`uw wnv 0܆nÆs?}س%RHQ5;i( SRzTKzN>E#y]TNƲOsU5J IDAT/]I~+HrXw+>IE:u]|rM7QBv}M+ Jk<ϱEeF·|@5Y`xV?'"M N~7o.~ dҥTVzVs2a0M3n}l\"L<%ڽ{իU%"<;w$?`СѓׯӬivA&M=Q!r29e)8`*1l0"#+( s~ȰC9jG4>`={Y枳HII9 !oN8A-i׾| 6cпܹ͛[0q/ϳiBo:iN㖏~t;Uk'ӻs 4ocf9+fҩh9\3ˎWY; =F|=͚uי'< ;ƶ/OӼ^C^p lՅNon c_OJL%x| [ШQ3:{m@zȲ13q!2 ˗/K͞>oqy2Ku|#…o/eZpvWxr|P\{:Uo/#UbsW;=JH!~#U{͌{S|_yuMqsT^9<.3e`%qs+*zZdps ^0=iskx[9iڋIԤSBۤL!D7DDO3g6Fdر'SV אn-˶}4ػ;&PUE)u|?Fz ~;/R[g7 lGsȧ2UXǞyqAjhvn%Xb7+Kf(E総3t+&HQ/2i͟ML睽`Ҵ{.@.D:%yRY' ҽhw}KGE3w!7r,eɆ(*ׯF.ŗjmqk<>=,K,'8u|Uv_ɅJZ߿/f\JX6T?7 Dsq9JX}Hcn ew=ہǸUw/GzȄB7 fӦI{ڸq;nO%;'Dv˰@`A{C}9нC(Ѡo )BV|@P5qQhq̘:'_!KaЄRX4xz1/ǘ)T?u19LKcryNz{N| ?JM<̯A|S CҪ8xÞ/Wx.޺f4Bmw+߹s ԩSE,Xf̠~G3pq 8WW{#gKfǥ =dB!ڵ{IQt{τ/L!}(JE)D.B!b !Bd1IȄB!$dB!YL2!B,& Bl6c8'$Ŋ|v$!BqWpq,gbcǎp"!BqW.\s_$&zgZz77Ac& B"((EQ nygܥS5=D6! BBQ ,B܆\C&B$!B!b !Bd1IȄB!$dB!YL2!B,&BqWcLjjl&,w}^ 3,>ZO@lG_f}wI"""g 5CYrzT ׯr6clބ%ZtT3o󋵇n*(ˇ7wHc劮tW=r27|oV:pI`(K `8>Z_ro7֘Ou s8:VcaNϝ-cWr:vBk<:Ϭ#?2A ]>glxs_0,f͇qU6tc;lr{'OqStЅ~wC{D3!̮]xf,]UiTZջ ̊tVi_`k`g9Kw]HNHez'k_,L}O΢[ X1r׳1m㷻X~1kWڶ_}.bD-^<9[+li1Y7%$+k=y-HX˜;G1ͲvI}&:џ_dXd Ct&k/2C aڶo2tT $8-i k`MzEߏ,m q+] OY4'υ_DC%y=dex1]uߥnYrӽQL9Ec;ߟf}纶 Bֵ8'>M7!0N}{j՘4̈lGϖyoN͒eGք)IH ],4I!pQ9U`h8)vߪ_̃m"\cm<5&H)\Q%6pDFnxr'&)s^ӝyvv&,WUv4N!0,W1}L,,8AJ!29\ң LZ,lȖA`Bz8i `b ,4nـ b_nCޫ,]~jSf3,$ee։ + my3t *\.M6arap+y!yw:df0;@ {v7lQ;(;}<ЋZP/kE^il5eӼO:f3?d m|=Y3=c۫ٗ;̚v` %eE#39V~1~u| .}Wo+ꧯk=1_l)G1cԈ;q͚߰,߰eEDζ~xbJڴi]eƵ _@o}vŧe6k׭IUgŋ?r7w?~~1ΛliǴW nZZ)OՖaal߾l*qXVV۷o#44ĻJJ }RDDΊʕ+o~6Ljq?U]%}1 <<0 rAEhh(aaaURJ(Yaᄇ{Wi2)8LLDDDa d""""S qDDDD@&""g0KDlQ qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02q\vv]_@&"""02)8LLDDDa d"""4wDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d8KaDDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02xHq BmE"r)b11"8˶mqXD" Y8LLDDDa d""""S q)۲ؾm;;w"99ED$iNըY&.SEJPNNW$#3H1uP+Ze?`]t DWyhdegQbN"򗘦IPP+o>~ݸ7MDaV9ٽh}iDGǰgbqC*W&!w_pʕ+{C Ǘ={e"rf,"--={ g󐯯/:v`?ٵg7{U(mEr0MԪEZ5q\޳S>>>\pA.wg4d)"""02)R1)5 C$sL2 GzJ4t9tQ)Ul4#ED=d9@rQ޵"r)RUʕm6?&" IQT-]%"gY)eUGS\*~7UDR + """JSDDDa d""""S qDDDD@&"""02)8LLDDDa d~nFDD-tN;Ρ@RSӼEDD+'R .Hey/WWA"""^T\rUr)Cڳ40 (_ XfxW:Ϳ2w\0ՠ#m=$i] "Z){,"1}| y>F*[˻Ц].~^_lFw=}z떩lq[Z5eiJzk ޝouCt0~HL0ٛթ=;]o|a+~8ݞ^ON7ld\mf>tЁv]2x|v{?qop#|6]݃vm'GXZ ?cG:̣ ԯ%tK-HczywJ;^cG?fHdhB۶}۫ l*HqsXj 3˺12esWtg7q$ʥ |}~wG#(f̃` ̢務q_,{yÉ_k1|tK߻xzgst>Е-aطg`kok2V`ż)qrbn~g>VV{xؐX5 ^wx$M)=˘pdaƣ 2`ymsq#t%˖~̘Ǧ3/8Z2kg^| LcWY/ZȪ%scW}7JX\,Mwr駌OODJo"rHg•51!`nl}_mS_զ\\= _ k]E1IJ,_~ \ET+kOplY2t0܍zǰaR5rQ;2S\dQJۗ}ߓ vE47A믡UjVڵ[2Voocz&jENeRp ϶iR\n \f Wz޾Km)%:Ej||aO].bG66I-f_.?LKg5wU1 :]Gؿ"R|ѣ94fȗHŢkl]-XϾti?dѾh,$486Yi>MM&k~0"/xBh5H! pB3:sSxz|ܜk[s{~Ąp츅;0xWL* j܉XJHB:Wnr\jC`FYr|(x֛x|:d7M=ڀ+q IDATQ"RpBT/G&60C]"YIj<׿9gk?JV ""o܏o\I߭#$P!w`Ga`RLH<_V>Lws7b,Q_wktӱ#J j? ,,ع׋Sq\=ӈ>Iaؒ%{Bx#ImN!%p)!"r0 ZL©|=!Ӿkk nl&;9jԫ5>{/&mb &, 28m+i޽i{fd63u~"M;4'@q vnFBf0.N#VL|6_Nb31-k0ugL `zw8T`nQfNiٻ#' YGٹy7NJ=It۞S@kJY7,~7y6H2AH{0/smH^x qK 7n2ۢ?=ZG0c{Ը4^ ?@&̓&..Fv4Wd;z{bS39 /.Ej=c{,.v-@5: p@5;W&rKQ1 *ߐD'~UW_?iZe}k ĸ'aҡ4ܾQp;>ZP̲=yj\:/$aS7E"uṽҍ]xюj%o=gRc[ ޷^:kzLxLLc'y?y义cF>< hެiާDrB-k(޳XdNbu=Mov$)0U'۶Yn=M7:+^q '=[v{LyenV3Q  +|˻L*yR,EDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""0)}8pIIdfd@Td$*T ((k i6Y{MB 4qѣ/ EDD+ dmع*ѤQ𕖖FBBmH2eQ:mxLVtsanqDL݌\Nr.nK/9O)Rmq&h}%\"+,,P*WMhPBkmxjC&YM"6 6Ї1>,ޗS2DLDOڱs'~~4lbaРAرs,iC8j9YUBF&+i|U ~k#6XgqGXxU;-7{RkBJdY6l,]6g#k}{Zcg95M‘s{-v־HS)Ñu-6y3 zꑐ@ZZwu!M!iáQxj[>3_}_ޮ*tvz v9O^w0S\Ynj8j4et= te>7hk1}1M5-h֪]'>\G=`c>< ZkY57=j"יv*Wϙ(P).{Wa[şJ*/,|7V![y#ZmS/, ~{Z4JԈN}4r뱯rDΜw']k…Q..\X>4 ֮5.`ꃍ;e$~v*ۄ-mILJrFg;)66?my"2stOd_~^~ĭK 9ɽM. r8j2Ͼ>I&u:ѧ2%+~:C>|OIJ['OG!CF=!X^=g`cّ4 OkJƒy5?1[%OxUF>}y}̐Jr#rT#k~ 6dRFۛZ^/g#<~>J@v `ldovo(ǭFiW2)e>2W~]}|X&-,:"6 .Ay뎸RHbgL߿ {0g3vldPt1S̊g43G Z<@jC>̐; fW2u֝T4qdTbGe4"fۻ={?5 >S^ u1چY~73oCy꺄`lbwdz혼w#Im7^ek/esY;pcѯvFozD"ρ7'0 [Y?_!v_a滏ec-ɤm48KgJ̌UAAA_Knw2a<~=*ī~Oe69{2kGzE0'2,+sF?[c|` 6JN~"&g<8ؓq-bɌ;(s3kۗ7e8k}"=|[38sQnw=jJ~UɿT[Gn\-c(l,1۲>eMpвe-r9_CPD65I۷ERە0 ֓k;z]Ք2>sI*u1p_Ґ9w.҄V FKGpUV,_NP7~\onEoNoczyCma0hҞ?`A&V|ER/Ѵԟ9 #…P~(Ÿ m_t@Z%.Ҷk\9뛖# v:j"g@C@iiiyWRZZ^|1^_0$Yؒ7s'f;[1MɻȊmU$EG .w\`YضDZcQ֕wC(eH"w2 B +>֯uK7pƁ9-:uT-y2c(6q'p88ߍϛ!'nY66_Pf±phPr|bUe2|$s݇rNN 0Iδ ,-:(2d мcw pʹ 8yCg0v;V#sGۼsu"G. AZ~ǛOU*=#Idn떓C@fc7 3C$f.c|^uq:}k&e<>L,GODQ#֧uhGS/ͺߎ1 +&&m`RRT1-df09)/P{OmP +"#IHHˁȑ#DEFz' 111!Xvs~GK(o<-x#oނ‰HJA&ʼnm+k[<8a7&ܿՏv)'2$$7ge筍ETT,C*Mnӎp(%Jay)"wxrخܜiF;UzQMc\l?&6po|+kW,¶mwNiۏi6N#FGlC~UgpӢװf2l+Df~ĽYq/dhڕ1pEF܎a_SPW}Iw{*`r#n욹onR^ ܶ}ӳy"i$&c͹m;]ܶ}3])aSCT{gML?B 쉏''̿Ov'>9A`k& paff ,`Ӳ ?Lmg J^d9GH Bja y2~8~ЈPvmg_̷./ujZ`gX{>vY0+M z=_;䧨Ki[LYߨjԮBN>#Η_d{\GߡwG x;n|| {u-5MTܜصϖ[ =oYX˦ya̛It۞1IbVGm%>-~bx:%{sljUc-S'47`zw8t{dG r0 g׶=P&vvldg >趴Xiu*}SD69炂(S ; 6.͛)S0@j/޸ #0]w*c`VяWS.^?bbx`n_O_w=a!D7CߓI\+k&!G1piq ~E6r4ՂA?V\x <=&+8wչyWԝ)9V B2^hwoS љ_FygNZ[D?b.èw JD<+J*/9}?7kkzLxLLc'y?y义cF>< hެi{cY6o&ߟz^U ͛IȠA2\'m Wn-,+Zier+6琞m./fyᔯ݊o!-b sعb )Mra,ךKplRg+XK<Ǎ06OΥe _L{c' sݏrGۧ0pdx<,%^8~m>̥ٝRi9YL sBzɵ0ߎ{>HN_:V#pj]fd e|"'^c6f͡L'֭ɿQP%4^)f*ГgҏXΏG݃_磯K _e>Fѱ.x4{aѱKk<~rڊ΍fqzvff<~;vcw2|Nv2KO,IbcǬ`O\ߌ`?"*Ҡe=zq喫[P)#J[Q#ڀipn6>IMxs $zkWLtl ['^}-c}1t m_~4d)o7аA"""( ,2flmL*.C_ó p_u8#>}-/*q6bms*w3|1Ldn&E 7pHf<\P@2C߲kdf*̭x &% aO[-6O;N7P"7_Gxp?&9zI}ܦOڍhBYnC2<='2A>~?(qd[~OWbst|iatyGٺp s.aX0L#l?в?n8)O$''eV6h@ زu+޳9(Ъեt^V`ՋYW/tl݄QJߓpPfڔV \A<ܯ>AA}U3W-W,džk9agf2\n L3{rUoa{teobt|-BMuh\A@zg5$c1)h;b"CΩ|1{6sf擇.!<9F2ڷUyz]u2 IDAT׃.;uxuJjYyk[Z]rOCnCY,GʰnjCv"ޟңIQҿVD;Ɩ[N^ 9Y>4cMRbFLY * HBG2xﱫԒkﺗ- '2]-XϞTpO};mgǺ0沘b6^ toYøT&]U =ݯĈH+Z,, 'S8%"l㏓WDDD) e1riI=tԨFDYW?D+`Ǣ᱔l.Z;^g[' 3^(Y>l%'rԆ S$N$JTx5a5N=&0"Cq$ rFRKZ[)hL.3~DleEQ5tx6~N +~CߥYR0םП6qeEBjo˛%W&"Tn$73VA~_˖|OlwLd$lgwXl9~]<>?>NYbKW~ڭH<$Y%KY'~OA,bԮUAڵٶ};UZQ{\]O YgM֞* vmNBf0quQ"|É??S9IV!IX5;lar,auܿ:Lv1i޳='|6%ny?o}ڴ2YlK!'_f}Ɇ_N`Ӭxff> IރhxI&'(wpKbUxn,l~2'3dw .cl'o_6"5߱YRAmE/xf p%uFQ!;ةٴ I$ԽnI,;o:LiGͬ[#؎l(O_mw0ͪ析3%Q%# R?OIӋ.4KFFFvb*AgcѼӼxmUL;wjZ6G f !Op%^a'r] j}#wxg "88$+V$WcqgxOYL p1qa4,(jvgBh {2dsMrB*b@_zU[mgfqu=OJR*]5> cȔ=Bk4g&U]KxeJv^1]. pB|{O} IjWLO-7GL ! :-zA5Aq6l"v)Xr/+,-y7_cػ(ߙJ{{EPP)C{ ; CMHlvg?> \\9gfge3ggmp6& Fg脁=;[p K|饎Wv/=:E_(4_  Vʖ MU@cDg@Q.?EB 5(` ?ŞP7JΉΩWq.Zi^A{:ܺslY)́Av,N=vŊW-O ;OןK`mǓ5ikҴ Vi=,~\Ővھ.ٛ@Z#z\ NF½h5\lμbcb17<\u£|cw!Br(¸|q?iYE ,ݳ^'R6|1nH {Xh`4bHlJT-i~ů<T44*%V>!o!_M/9 dUE_ _V ]^RUݒ|Da00i:Ϯ*k*JMN_9N'ׅ=(Z0]B! d7S$VR4bc1sN f7RGt uA19KZl4qn{3g]!_ yIOӴ?&!ɞ=8'g7žXosBU@3oAf7ša%6<[>1dHȃ[DZt_bLK@#w.\N S4Ocmn!+qرޑ?""cǏ^!?O t,wH0y|(Xyp EX0-F /bAq%pA2:%6uyf/L g sxόy(Óne*9SLȥ8k:y1o1 ʷ.G'wn.^DdB!)LrBMRf})&>ތӋ!&3{ԥմZ!?Tۋȧě:2Ȑb$Qx{fzd` %KSb-3?~Н9=GlNp)ӉS|JUŇ_Obߣ= Gf~؋,׎zU*QzSۯM +TrU+HIZ([ͿΡnHIҩ?qqMqɈH⥥L(GGpuIwHK-ǖ o_N!,,kQ]Fq`x6TD\)zm=SLStoo7ӈG7>/Dg> ;|U^95G x5E΢_s.p$k2z}݇i9е1{7fnQӕgbȆ{F$B..ς^ F̔E= |"N.aĸe nnօUu,eĘe{E@Cw/kn>f,vg,SґH #O9P1ǨM:co 6a1,?y18eJ=i0M`u=tG|rAaawFz@h8ՉnsQg2j܌ME2i_{Br'F́S 6OɌ-xOtޅ]W׍g؜\`pHV}X }{-mt+.1|0O`ʼn{X\Pպu=hu8=1we&QG[}Ke8{J;oƵr<_G~RtdP̉1m)NhJrw0m,ر;? Rl6B?@N7vk;Jz|qՌ\D g@!N؏GqpF[Fv?χ~{wI"҈Ƒ%+9Qf5P33=/}g0LQ ַhz[:Y\0KN[AhoS]736nnmlZC3:DPT  j*d$;pc-*ܽ> ⓳swMomf`53wh$8E ߈գN2A+XΰeSoKomށV~?Ιɖ.{Wndx<>9ȝm6%2֠iEسݔT| *8L:o>@G\g܄8S:w&٬Z+W8'7a삳Klo-.MSpvqX0k2lB)θ83'R|B_-dvvgV?z.=iU(-5w*UA%\oiWCSFe3g{(,l]+*XdE f{.eVP7OOvM"4?xL|ZgRK1x `Ld+s. !{:HMG \xPlV)@'>ϣlQqIeZBp$ )Hnh~~n2CqB5< ™=3ŷ=N4eoZk6r0 zzGLׯr/S܆l9p뱐7!=9՛Xɋ#C }*Y%&j! >Q6wfmIs~f.9K޺U P~ ndΛ_ŌYvQna5>U=/f9G$R'c|s=6Mat4_=tT<&JB^ 7.]%uߊu ]M׈W.q+%{xi;yh`,H: Z+hQ\Z9/ ۜ?N8#W8X7rt%[ 8i{1.p9UxNPYlRL~sQ Xpܵ-G y]Ӌ˹mE<͂I_*9 =ǘtP3Vn/!ªsu5A[J8*[Ӧ 60'<8_+BW[/BjU~2`xlkkЮn5ԬE3c)t*̥_?ZY#S10ω `A.ͱ,@UjՐ}f=[զRZj1e~ʮxP];2w^FݯFB]ٝf+Sj#:׵ h =g5Ҝ(q8} fG\=$a/W*j5*Ww*7c'Lm]r|͋GE\5 -4R] tEU5kEPjK\.M" Uyԗrqi!-d\ 6Uit6Ƥv< 0gvy 8A`(B2s`PcƤ//Cmsq+f_>%>],IHOl8n3m֓ʒ!}]7-{c!}bNȥl4i1nH~!}b×ASK{NZȄB!R2!B&L!"I B!HaȄB!R2!B&L!"I B!HaȄB!R2!B&L!"I BTHzn_t /f_'HM$ !R=]Q20)]?هН9=ʛg[iՌ[kJy)(!m9O53{q.]J ?˘_XEsWHj0w.ΓqQo>UˀFe9 <\х%JRn(B^ؐ ,[[L/V$_Ѽn-VÎh)l'S~NZըP 5[~˄=X-u~5þnEըR.}6GJꂎT(ۉ%I MԤ6Dm'q/R2!D*cp=rc,+z_ȿޔ́OEIOKkmA9O0qjj7~E1+ ޻c;Ӹhf^X.K'(C>8;~&]>{}IǩH (![G笻6#9<Ψ~*Wգ0׃#+3la~Y];2a4sEYCz;71;ɖ~%4;ٽsCj&ǟ 1dpL.y ~Nm8eQ(ݑO3eпt ~oBwM螙2?%4@#BkDժըڠuz1}7zjTՄvŒX} ;5^cw(ḟ2ftOhi ;bf6ԭ^ u>߯'hH׶M[:k~Sk8qoS?>hЈch1GjWNqiPVdm^߭@9v~`ShO׶MW;i}ӎQԥ5 ֢Jպ굄s ~m\~NƖ3Xu,ͪ$Ee MA>8;ᗫ49]_l T}ҥ+eMUp+E2s. -=;ʧyMjyFLnɗܟKQQ  Irg e<џgh.BWCTkZ59cyHyȄFP]qb 0U8~2;wevG|ϲh]~;'&iNvAOJZPƥf㚑4]64sΦa5?~9&nVv13P6nv6NC̒ɬ LүYײR8ha, ;2tel1ތ?,SFsO,۾au_4PIP6=]0a:E#Xa+; IL} .QYl[q" hWu!쌺φ[ѤY3 "j8u*Es'%ŋ Uְ@ǟqY?_rKƃ#p1>ɉ񕛪Ϩtq,=Ƭa 9HoQ5*Sr`}`ʑNqO[Р~#Zv֛oSƱ?U1|^.mH y.Q49KJB,Ԋe+PL\㾣=9 jdIuAήFrujv9yr=oSjҜ*8Pl6QII_",wxs (AQp]86_O˒ӬΞ[zD[z5-HZWW^n1[I!i}%=&➇2%ংUyte, ria K ]? IDATgPsaLߚxgl̰VzJV6pDžXB/ek/|nh60w-ZtPiCA€4[Ά:ik$0Ƥ'2U+RZKAnf~ǝh3f 3qk<=WK8&oí9tmxv%93ZXb"J! #ZvYV?z.=iU(-5w*UA%\oiW CꆷC^x&KU1isb Jw-TuxIԱ>ϣlQqIeZBƮc)0nfdvG0E_^M3!MZҸULږ{)Y'S'34;K#Уv0yOeV}3eggԠfo8̣{?IWz4gϮ|eҼ2(K]&}i5Iޛz'?EQ]p\[ίbɱD\iC:qX.7Yտ.n%;Nx()kngQP:G]')wffHn˲(8%7qkv޺u'g`2B~϶a+Sqq^S;[!RO(naϐ^5hB\YՍr૘1kNwt% ބ%11(G6s ~Lg~es&,Ƞ%gs,MY| K,a钅4+5bN1XbG~GcNm\%I.)\v5s N˽x$d_]4=rs]JG<4 3{M}3;NXJpW@{DUϦ+XM&ХN s5y̼ 9:e K#-dB? fԨ.%3GCB d0bTG|VgOZH tߗHk´qyv A/~<Դ5}ڭ`]ip5*8yfԟ=:|  5MAO,Boc̠A\ C78╵u~E"({ 1mkr#։,2d4*_hwFfqfO|m;y4>x϶CX6dNL!8^9_u^U\n;n;m?% eǏYBfȄƆUi6< zRve_g %ϥqΔo70%;&+7]?kŻd!d)kKg۾16gK*s~&c!%Ke'Ndzٳ)R dBTd;z;IH8KxeDˉ#P:,wrWBo3y!Ÿ>XC 33avNItʾS#| zq6.r%~r+`9͸ x00XoZRZe*nC%gI'kѡImTNs]YFs>75iDNs``ˏw3-M.)zk'[CKѮC)| *y[ym׆`yaNn9O\R S¬ğ|(&AMÿ+HԬ L{c89ԭD땣\AG3n!MlܹuKr}x j\5ڹMA\-;.Z2`구)NdWR2oirI!ڍPnE#9rq Z,U逎 &-mѠuo\L)E"0lIN@S?~+nLq G(4u]t>lJ2.E<ȹhUE U`Dյ7-̛#RWӄ"E(iJQ:g(=tI]*w=JP&uos|8qܹhMx<¥utLY4AKZAj4sĪsy96ԨSWD;7gq2d%O}BoZ^Nd2ίɓ!|+ eV^Q3XʗX$C' ٹ]Fނ'NX$뮡!?ܡGR ߂ݭeet]'x>Jz%]9z8ŋ[ twh? $Mێ'k6֤i L[mڏ'~C2idoZyBThzɰ 9EH) N=)Z"_B (Bݳ'`ؐ!/m2!=WXQ~:E%$ !o҇L!"I BVɷ+SyMR dB!*77WcE M~5>dB!ު̙3vWw(**аdΜپJ0 dB!*o//+HKYJQ77W2gΌ}HaȄBu^^^xyy !H2!B&L!"I B!HaȄB!R2!B&L!"I B!Har2!>b_$ϔ)h_$R2!dg+d)B$ !B0 dB!)LB!D @&B$ !B0 dB!)LB!D @&B$i '+fkl>/`_hb&.Dj`eKu=~6!"UNJUL_7- g}3T9{asd<xӤY1F/ b[\| +ۦ2l{cd1Rc/'h 2TkGBnnqd.N6551.!o:EdR4_?#= X~& 5ӈN3ΥUiʩxiٿ7Yмm%2@ͱ{8y V -] |>fWxJBY678/MU"uN3W6~Hk&V0^G9TZo{*N)iѶl?mv[ɨ?iiQYZpz.\{-3+Ul@D'1 v;Sp:v`?ɶmG u&S.] e=᝻<*ϥAlj4=O]@\޾{M(( 4j?&^G%} WO?!ٰ)?1b0;eb3]EEӦ1}7̘ yLGz37fB8FdI<.ܞyjz,dD_R!R5۫k9J _ dM3a1-Ϙ:~ψm7EEEêObV[_,v&!GmSOYl4~7KZ!>hF-=~Fōz; wrAWljR} fSȘߕM=Yݥ Oj4q 5|yg(\ueT wˤNE̗q{ 4mۏc%p^-\hTX&3Lr*0Mӱo<_TwHλS]GwН8?zS-M$'YCk]=XONȓ:Wsi2fOͺ3OшM,56N"=+1~\vLtbn367tQ#t &vw|4Zֳ^8Ìs f0u}Ŧ@JyL1{}h[0=YӦ1{n.G&ͬoM̟1Y[u2gp!\C ¥KYĴ3lFbA':.uhX57?vI*#5+_MOͼLf%#.v+v|&6?"vvNCAK77lLBgOe;Kd+Zbkhl2}}`#oGnrP6?ǣV|p?k3'K cF?r+Hͮ}A/GGn[aԧ}Њo7;Q\6'@&ra%M!G~5_yT ~z?6%2u?ΑՐ#kW'5,=Gσ=~]6"ǭ&̻6s8x9?Uv,`#6m' i[ŀn\Z8784g"bz΂.0Ĉw0i qoT]{NWi!KT%)^e]3,akpvk88*Ә]3/,/ܹIwbZnarpbf"t<ڮ3+dx֟G9q-3sk"f\r SLƪ8:@E]{Be_ #v*|$'.Jf(;('CKt.dȜsRVCƊ]ϞU(C^7,[pK_'oQZ[$+*MKXvN'W֔wK. ap%c-j;`Lx]dp9"nxoH,N(dIz ^C"-( 8z*cƴ*䁪xPEU&X͞^zhl{-> qW/`|HAovJ!ޭ+l1I1;@ )ɶ8L=A:nĂ h:Z \h:t1[wld@uXxXRrS70,O7qq~O8oが0GnN&ٰf>w foҎH%gsٹ?{t}O5 S8kO[9p`'(we [&gӼ|:s m`l 44bhV꟪qw3Njuj8:NbΝ!&'\DݳC;3cutTٚ_:Ӝjŭh A9f2c"ѰY31+ %m&28% 滷y qĚ4b!]Sq:͓:|߶L%K5eUp|z t"o_џcՎ{rT 8ii<:A)յmsFúy^LQ_;E'֤ U ~w-`w4i!M|&ueq6蘣Hn7Ǚ8۶,=>=Cg 2^rSh)ֈ'D`S^:7BN_w*0dA]ɚPLd2hcVwop"0s45TTSqU'+Ӓv1u2Nrc1g "rnhw1dJ?K"ϑ(Z IDAT23eΓ=c! ά_el Z]@~0_I58E1`eֱ>X%V֋1:wi 9_̛$flF#F,VwV-u HF\ÎH 53NLgT޻|y$BKMn@u0?:¾ݙ>r9 %:NC?S(k(NN`M>TIQHlYE#+ۃ{3pv>;O/ȨFDwN %iMq-At3{NSqv5J%&NG:9' AuvFYut1y .9O|r/>o]MWQj^K6c̮ 3#!,f̺cNѱJv:7bc/6ohYHAh-:h%Oߺ g$+7_"ɤɞ.2Öw<pfPX8@{x_ ^2+5|@,=3Գ>42%pZ-TΥ6]KI_u x2w57޺8h{q*+GY$59ki@kä6V̰BX\HLԨMM\&qE . .IPnѸ%KwE ~ .0U݇9}Vu63soUW1}_kzݰpnyj-L<&O\۝|3.?j(6u7.8\1_bb݁bm?`I:ף*69 VjC]}=L\5ozWl6`٠#FM4oIy!Hϐ%3 cF㺗>G6à~ $=̞3:6) $٠}o_ֆW,|N{F:[~ϵOޙ!d z{h|Xl_!ڪؼQ12wGWV75wh&$᧍a?{ ;~x}>`r K=>} r>/+x&@W*T{&8߽|+|Cݷ!hDccD/C]}<%_ @ȃ 舺WCOy&қ_,~y:n\߿*{A#3l ^ymM?U7\/:oÆ-== HnUԇ?\,flzW V=of2>\.%ƞ^~&>]`qH?ǃSvw6vQxF÷c/^}tƷ B2 NNF7dh79n3zr,[ë׳2CCV4.o5<#11wsq˰3,zK0bQ#Cĝ_M cÜz?| '|-q;p>8|9vtL^=wFòw;Y7Ipy8 8`jxy_v+N>3ej }e)FOGnv|o{n L-3qM1fu^_0 }Ӿwf݇icBKo&w5Taԁ0j,|ƙX~x+5=``u :rpT--l$^w0|OWA?H nCKf'5yW<4/QCugXz|ط3Rd͋槿œס~Vh|\$$mq^Y O.Zr_q=<8ۄE7#D"Xn+c0&Ưu`9?0yu-{W%fwwY=1x8_Dur%FWI ݏ$֪Np;bCqcΣ 9k/IȖTc1_]k7<_t lKqmbf8ݴ:Ɛ'`H7F`hӘ{gzOߨ#= ql>CbS1g'<7/tA=[|7+{q<^t>_ϬFrp+pѬ0qga1y{XL;a7y w"NzL\s=LǞƪz˛ѳl_'!Ov Cf_' H`YGaC0/__7ZQ>;KZ4*U+n}K: fբ[=.߈*N ؿ+OV[ pQB?=W~Y>\0|)8G`|髸wXԢг B'ذXǀGG/o^sMbm&a'alg_xzХP|8qe7œ 1v/뮺0Mtױ){MJŲ%T8ٗ|]}S~%_ĘG?>G7 |S=DM>vtdëOO9?߆z%Vy#>yۼɷٸ 'u=$sS>}=c}}&^7z'4D2}6BӧXp8:*?,DS G=;%ϔχ4~y]dclK]?-_|4m\7;瞎]bA;MKgES>ĺ/y_Mx@M*Қ<~gA&愸Zy,ox$I7K1ST}Biz=~XWOy1-]_w#uԛMK]Sz%BlOHœ N;{<ٗݏ_2myOk񞘮ͨl34Lzs"sl32R~]S|R?-~g^}M$FCG5?N%T}:yޚMn| ^?rӌ! X\ng"/;/mD$Y8JAꑃLbQ}.r`qN*2RTmz '[=U;۟IV'B*oB!@CF!Rfh!B !BH!#B)34dB!eB!АB!߰$B*it kw !rfv2)"I%_߾1vlӄBHųf|чY_"Evmwʂ !R2ţo}oo,Z iPSScӤ444}/°lԴio*M!FoXtNb>xl˖.Сh@MM5eKTkB[2d:m"Bkб:ieUUXۘFT[555~T\uXJoZ1/ Pܹ!R:f(|%Rĵ@!PkSr9q!RZɹmJ2dB!Nǭ E Y=q!R~q*J0d8 [MTB!GԚm=Մ︢Q߲e oL=,O!d!3>߻K/AL< LAghKW]']I a:(ar=9]y!{s"ϧڦ3 V~uv8\qcn_g f} wsv>N:l8:؂ 󱾱W^qΚ6 >\J$8>g0.Qj by8 Yw}ϖZ_0mȊ沺\0B5 q٧8B$O>yoNcD}msl3lxG܋̻gа? ; p;tm%G߻2f .9S: h]}!|XUz.ul9Zpaz>sL./u򅰜K1!]Ұ~=~siX[Ռ_bu4jlnyZnO^r~N2uq~,^#Fyg\4s&Ϙg{.nĈXxI#<`!vpH+F$ zrz|ezA #x1gm'g}uk /0~\wq0}Cx˱G_Es5ۜ{)r5\>9DkDuuBHeMGᅲ5_fڮu8󑬎}]~}w]D]7t Vby ]cx_!A1;^ga볍-6kuJm6[PpI9{"u+6O!m<8 :v٫76=3ȝՊ[c䶝T?r|K!8]{1gs=wީśv%1pmaw1rYg 7ހ'=ᇳ~OӴ?S7:4ϋ> \ZMn[7ŶШ Pq6&6ͷ~|X?=㜘Sfm6]^xиC1̺'OC~_t5^^?<&Mdõ ϼ(_ziر#&K8>}~`~O`iLÒʪԲ{Лl!z;3Z‡kCj[ogtvi5_腓q3COwa<Ξ>O)~pԑ1b8=еX|㛽-?f\W]}t)֡#zj0 Pm'_3o~jUu030sH[\jt Qk+[Lȿ4K_IumI~@Ҥ_eԙW_zO0Rb.|m|wLrga^ìO>qYىI,yA`I5Kg2a4lGlbG,KpwZC&;u6KuaZT,h6B6A<&Il1BHzX@|Eܺ4CzQ'^lB!27eF YܓUV 6`QB!|Z6LD4qJ Y'mK!F5ƆSqېyXpTI|S5{لBȦ &]5׭kncYĦ؆,`/m/lB!b6nd!ˆ}d~B!ǮϮM~jJ2vrf}'S[ĺ oX'qX؄ ?DZFT"м.G},i]gqiE9 =9:9剶H_4ѥޤ!Iʺ {ah}vCV׵ /^F"%/B].6kK?946n5JŰ.d~kTlmk!UmnxUxbX,tHbh}5fS-0` >cҋSԠk]W 0Ц`M5A\'. eȢf]ZtNZoL!нzMM4dL&ѥkT yVwynm$t邺Ɂ]m_pYlζ0(!h T6VtE5K 'yף[}M"yQk@X+_JP!J M`*"IDAT {Q6/B!4&zY\mb(2EҏlkI?P9B!6nbzfac+2{¢pո4 h/\9ĄB)?Mh^}g[uFҷ5Kwi}yQ!+Q'G89E^ۼ!RN_rvl,:_VZ_jʇL^|y}B!Eh{wLk"[$ڐɋf|ik] }t_tK[>xz^^B!dS"@ZSwyHh 2bkMx:aĩ)ktVkSmcS[#zBPI_rI)uKƸcǎ5AHHt,m"=G ^zGiױ&BHe$B ƥi#I}gh>2n{}r<ݺu ic2Ϡakrf[k]4%C i$ֺ5 M8rA:'KBUstʴ:'fLC'fRhc&9XZs !_dݓ֥VV2͌h:fJʌKՆl]q%,+oOؓ!utNb[ )%[roH@>T@zHsS6{7j(4O!u닋yW7Iߚ;Nb&z)]yuNj#ݗfqi|^04d /P ]>M\@41cZ.Sbٯ݀f3d^cX&Kh͕'vkE{Һ4Y1L>NW_9a:!I9F~4$i+\i]zWkpuECܺچ, DMEu+ӭRsPu>w4GL6c0+w2&'9Z%\Biʵ v9.JNb n kM\i͘'"}[MoӭktlB\C:R-2Xá+\@h]0K(M/lj)MDk:kӺ}K#R>dmҸ4ώˎ*,&ɚ-iMi=@Azk\rmt+ظ5w\C ٹ]V4(bD (ԅ;Vrt왾ۄLeMȾdnm\Fؼ-.ݥB|:'4(g۴1}1QZ.ˠ10Z4k$oݗjg3 eȊEA^9/J_ӭĴ4ϣ y}g5ViZ}cqiB*עZ -پ]5Vs6K[X6[ȉt lF9 Yf 's'O/ӭ3it~:/}md_T Һ˜iMtھK#R5Np{o5S]l,w\y{g iM%5}GmNc/qYhmC wcOkO &he I>gĤFZ}~1Hk:KBHîqNK6Bbt^(Mj$ 3tlkIՄ0=ɛ2d&6Hud뼇fc$hi/w_3!He>DCǧkllɖ'R=K,Fk6/kι6mfcWL3&y+6ɇas6ZAMpKjHȼ[@)Ӻ'&GVt,wd~@oZO=4%yݗ8uʹ4B!]&X3b[kmSe7GLҚ6WF@Z :֭K+90d'GO*K2ät_˚'Aen\wdӺmu #1BJk-Fkބ02IP}]'͉mɶinQR[ZӐ4k]kP k$yfK2mv1K Ε kl_X6=ֶ:/Ƅaĭ#:5N6d´lI wtNEu/KF YyWKZOi2Fb1L~Zf *kDhSuMj YZɦńBvM Af[LhHm6YVך_t+]ZGRlCn y龮 il^.5lrΗއIS921bDK_K-!!߮6}ھ 3BlXjzk\c2OXb4. KBk2!@Ayرyh6C:ct(M' DaO!zTFX>L'Rل0]|X+jQ5jBzÅtkszDA:hmlɖ/ Z0tEdix)Z\](VX rj+Q`@twHlly Qc[ Ǧ rrqVKT_Кj\s۾+ΗbC!u)֢oq(Ͷz>Z(VM,*|i0$k"霫pm-r \s@}BiDt9k\Zf[[=}6AE<̙OM\scl+hX5}!,okm %Rb:Xk\}bոZM 6vQؔb3gee5N6憎j5\X_S,=1!QE>lBtW5l+Fho[+glF85)łw|\u>ڨ1W83BH%`DŽ[D [ou8u6u(g85@˺0ccYriVmN4 \sB6=LBXΥ4mx\Vʹ4Ug88uqjr zܹ 3>N2L1⎱}WX5B6★|j̎ysZwa.'Jǝ;nв6ӓ\ƹ.blB! TX=[, Kӄ]5Vw [.'J2ZW]9r5a}MXMXEX>L(d,!Q66, a&( kj\.E: ڜ("-bӄՅ5V5F@~c!=1By [ȥ>ڜh;~ >XerWj6tB! pkB\es5FuyZ& Zk\cɖ#qBl\yf55Fs5\Uze]ؚ\lĭ[G!h⚉u5vakŀ[yڋ|˵pf56K#>(ϥ[.\5V1ֲ\&iV W#k=>ƥ %E-~ !0MQyWΥpՀp=\Z_27z!l\.K #6*[G!B\Uj]\Z_0C&c<#-E>c!RȥVS,=gLӐ|hƇt :G!T*6Qt :|3(T#*'B"LK!\\#qERLC!QXMyx5B.BHk1S&[>.SآPi)d%\qj C!e?qkš [T*u. EZF!iS,<ǥy [*y/ BQXB!TbV BQLAXĥJ;B!4SkЖbk)&xLB6*Ѭ똊5OIikFT[y !RR[tڪ)qz~B!dSF`ig pHYs+ IDATx^wx̦ J{vk v.,U\xUb4E@I@Lrr2%Mg̙3˞7 !B!B!B!B!B!B!B!B!B!B!SQ%-b_b ԞB![H2BQ{ ɆB ہh+B$mNP5$Bi QC|N%u<_!!$qC"QWPWB!'u4~b_M2ݿBq v#n_K<|կB!V~#n_JD"\#O$5$H=HUB"~BU =!ih E]?H/RDECkj}(jl+BDKmlGECM jjm n{7G!ā-RH>T6FECk|j.ԾBmᵭڏBUWIE8 mBQjmD5ɻ6ϣ6۪Bkc BQWIRBiMPզl !)sv@} !`KmՅ}t嵐&6@ۻչ!p]MD?!I@չ!p](j}Mklcs6R@&B!DM|M⡨ɶ5٦kwᶷmN)&P@uP !j]:S[&m_k1pۃ6NPcN9l xBI@NuN1'NB{

    lu5yPUj.PʩNe[\!&dCep:]:^n9PۇڮƢ8mz@eNm]-n{6B!=5IFon斀 V& K'pS;ɩ-q[Wq[wV6 !?ImV%Hn*6n*6NbNBm K4'PTo( 6;vNCLǃmnq!" =lS>vn6P=[9Pۆ.,ќC휒$}]eǝ:mc?uuzI!8p,Ԥ[ңzuh@Ne7nhNJ-AdJoo(1*XNۀs)q\'(Yps;9qvRoqٜNe7 Mآ1gM9%d攨8 eݦ'YTHSciPbz9p !7 29%C6ΧuՓ@u2uuiӟ[,@mՅ%ғwAG_׷z򣯫ɔ^okRR_`e]z!`^ ΉczSzLד/mKSmI@uap%zuL>Uz_~bnB d)vzd/vjL]wiq5涮եMջm}P- qJRԲ^+_CmV֫1uNK[]BՓu-ir~Lk6Nuw[AE[5Mܶӓ=Qv ^rk'fjfǃ]Ej'u^vJ\ B gb6DCom&Nq~2ucv[36v?nsEgok/un@֏[dsZc鉕5uzN\P=StnzYWz! S$ zmjv̩?1:6zjL_uzL_wVYDDO|:='Sz,D̩)f}q}ms !80%ȨKzC)ɕS̾e yNL)fcYں~p:p) p۪qasJ(_%$LHH7>9&ɲ~Bn|_5#*[ I_xo*1;5Hq*=SS,,zSSN8lz⤯ Ke4+V!`Gv槧g1wo/j"e?D.G") uNuND/759lz䴴IӺ$c&`^q)mUǁVB!D@r~^vF8,a*_p8i_QSɇ>NeuzF}ɘHMo|ƵqvL!g`lXg䴓:o럀s%u[rFBt*`1iu>1Yybb=?!Bˊ~О9i>eBٜQkem:Rt;v\uv2f3Q⎊ƗX'3 ôP% fB!#Ʋ,߼m|i*uGv܎u^j ?lZ%d>q'z]+W۩əS\h l0(T)$dB!D-sjU-Ξ$H}uz{Uxe(  =ЁuXu^Wٱ_j(+)4q#mN) > V}:Mmf!,˲SpxDs{<*"},')USxl8&@=s^=lqHltɺyhw5RZdIYa S;!Ba^*qb ξtL-1AS,p,=j\mz[}B̑׻.$5bE (hBĖIiIXMHOnj^Fv30M?s/B4ɖ}>1}VNSvz_u;5vZA nk'Tæu5R,_TzIVfV{bX$$ߙ]H,LFxb*Ғbv$Ju5q3hp.1 =KMԗ# ѷc&YMxHL |՗]̈Elќgxw_{WT֯ѱO=Bp5'{O>|O8h8w3w_͛btEW޵ {=o?{A:sZ.mBNۈw+U/zL-S㎗JJe7ɕ%-مk3PX{QRR@YY1 ZC54?yNZ F͒k;x<] OT50L{6:ɍ*bmZb_'Q#VMeY1ػwoE[' q9g\rMv4M è'v=\a`"OyN(wxoN|Olќsʨpu#ٲuG :̈ݳ;{v5˽wtw{H*Ww=G;æեQ9ŢޱNe`[&j=fzvMvN..Dz,ʼ^~mv$诿ײ~㦠jUr^%z>eڥYȏT״iՒiբ9wfcNc&\~)I{ZK6*SmՃ''>z5|*ƌnOzpר3n{iҵd鯌ItH?!ab'}.ܳ$c?S|>'YDm۰Bzvʜy HOu|/x!,,EK8#9cl+=͈KƏ;)) 7qr5?˲v?8c)$$&0{<,⯿7U{JOOK.Wn0{<)))Q7ѡ][\rF~Šmfe|Wu%%9|\{%jќv0vD֮[9gcQr2w⵷eEXگsYY0e &>sNMIFշ3oԧ$'sU{x<6mS>ONn<4/& -e\yŴo݊X/Ys^5_|χ~Ah߶5{)|>5aS9!$7jĪVdеs'Elќ<^{].Z6~,p2g =LoϿ> 뮤]IHH`͌?-۶?أIjԈݻvw*^w;|̙C,++~"iV&W' Ьi{'/N|[2G!}zq4ig1e >l G%KfMymXzuF<|>zvfh{W".׫]n1ٝ;G}< #op,^1sx |>nz}%ʟPg'/P~C 9'C2:HRUvV2df\VFPoyZeyV殑7\/?~8F-\=3g;/X/30Pi_T8`'Wt{a>˲|wHޜ{Pxt 7oأkd7+Tqul޺Fމ1++y<1G_묹^aЬiSڶnMZj zݺ蘱lٶ^p.cŪ_+U]w`Y>ɋ_gMthۆ{:k[ 6~=_[ y)'`&W^? ˲8C;rXAn~>}1e+Vӏ>QG Gg;4f˶m,uw=w?ǟiLcE{0ohެ)]:uFp]rYxu;$'w2Y ߏ{57FvNirSygù+{jaOf(--Q72b<7UX'|>rairgٹ3b?zJKK[nɟWfMypO}06rPv{~m̜MYY^x׍'$7;79^';ғϾ%˪Ճo'}+kvUc#~eY -)< /9d;ٲ/jӓ3^_+DӀ@v^3j =2Zrl9,q/RRRc'IƢk%0p!̙Oء=a|>|>|XoT)IQG _ffzJKKشys$ + =Dў=ڵ#QRRANW >2bm59w6mJYY3gϥe<>s-yӬ7nbx^VYKvN.M3Tׇ\g[b N<*c'bf͝G֭GwfUsӳgŶS癳iݪeEnނEp ͛6HXE^~4o?^۔/f*D^Tb*L˯ɖ(..6f:rrh TE%z}Ek̸񵺊ջgwnj_?5MͼK ?c(M`YмYSJcAaasKmdeeJ{1bqexM-L([ f-/!_ӫw'ǾnaW>Ddv:}[n1xee\}^dqUP54ȨKINR()FII k4+`$sOg;# ǐGV-yiSܥ3\w?(׬Ų,ޚfϧ~=Kp|,2wB:wC`m,\Mll,=0W|˲kԍJ/^8{TyWil͚fUK(7/?W=WUluر{zŜz {`1#>I~~Z瞮}9ٸy3+\|ݷ-w?gsp|ݕy];LbuɁaђe< <=kTQRZ#O>ԫ*,ZG|̚pHg_ hYje엎IeFy\_wZr$U+a_' 혾tzuv2oqW0MSה%ag{JLٳ;+cmȞmYu 6\Ⱦ/pR/]>5],aցp̝_͊ULr՗??]'rQӪc}о}[-[YOypILL _~vmدT6nOl =4z{wk׭Dz,ׇ&W';'u67[o"5%J=@vmIM7oF]UiGRR"XeY4kEL IDATUل?C-8cefGĶs4+9CfM9kjm̜;m[!pPv$&&MHO㯿R\RB||<OƠr *ƾ`glڴ7\WU_G4JKKٳg;*_EKqϿH2kX'+WU]8&^vy7MR>?/ >N]6jYoW/BB)iМvz>I01BOJ ц<G6~($.j`n2}*7B.\kGoѵ`R19Tc֕۶}cҩ#=Ν:rQG˝ڕs~U<=1obJ<ǵW\[_ޭ2~NTe9^m|W5F&> v1eW~_+Vcaߺ}wٍnxsء=XKߪkn&}}`4yylٺ~_gХA\q񅔔0˯ef /(G+.+E^~>f|[q-{ \s%x^֮<Ǟ=Nq2(((cϦ~:Ͳ,y%18̚[7ǒeT;Ix[j-,H}Jx W٢ۓ/uK)1{ݮSm ]DHvn꠹-W Y-ٴՌ^Oٿ Bvlm$5+?waCsf&忇L=sROl웭Տ{|>O&g9)+eU_0'fSe/=Ǹ IQ; ,eݧ,}JT2ZA-unq[ЯE@ujYɛSj?a&ksl؉eY^9ߚTY[Daкe PZZZч|u[fӵs'baCi߶uO!3 RR/(ЫyZ*W6z zԘ͎'UOH&{q#*%.M!%%I~W^X ;w0fxvZ8Fp 8_~$/y~#q=[6C3zfoƭ-^kLte}`@1z An)ǃ'5d)ň.Daln[ƾ2ǁe9ݢ/ۉS.`'cjwZw.2!sbN냭1s'hʼnታO"B9*.-iR۩1N3[ND;! 5QN}胯>ԓT2bbH3XN B}K_*-ʗv^Wqu7~$$$Pz2Nj()ߵ$cB!D(n7nv̩GE]'dN: pz2T6B!_N:wK}PzUL?@8yp;=ZͶ՘B!{e66SL?E#! Q9-c?O!?7ۿNs2X,ԲDLoꯍ`Ǡ2nP5VB]}B!M/dչڃfz|޼nߪLԁsDuiS ˗6-T/wDaBun3=Iv{ng9%iz\ף*YԁpT(K}]-ۃ%`e!B/}nV*q[NX4r:hD~RB0=W1{]_zSAL uUӉq3_!Ϥ 6 %^'@mNTz-BFng/ҦCNBv@KIqSםB!Df}NK[UBhۺZ֗zB!Dq;Gsy\sS[}=rTUBD?@X]^ƠGB!_U`T}rτ,TNlNfB!뭯1NkPZB~X!BNRr^>^w:AB!hܮ/áo95NByNm^;1Շ !f>tեzcPڄ!'${ԏB!W9ZӃ9P$P;8!ptթBmQqn'Jq/!B/9:м9r՛h$d@.^ ԓևB!\N*=!9ED4 dG|@BQ#ܬ'>h&d[;}^ONP!Bԟ@s^ӝzׅ.lLPZ1!ByYݍ6pFMpŭ[z,Љz!B4 <١Tnq]>""FԳ@T[u]/GeYd& oY^-8Yu~ &Skho SePz)WL%g3KYF5wS93l,o!D=*/UWe\;]'}~j>@T2Rh`tܭ)9y !7Y_sb9zi8sNZ+d<0=n񨑏)[Ws!0͛b4/Ýk uBVNN'cBu&$ YwshXt~Vd # 4nuv\OB!Dpr[5(RB i T'B%мnT YM3m˴BQ?nq]T5K">2[M> &PB!N99|qS"!$d B!_vv@C>v E 7l) 2>&Wj}iDyWQLZRR픰ͻϕ\uYu=,ra7|=XLy͵GBCm禶GT}E3S {L}5;v[$d1r$w94[UgY>|~6X}cǹ5Ì#i?u$nX&}Pjà;\ŷp}.χ/"޿skbD,v͞f2t NVY2k;u##É.+FƣsZrpc8w0_I=%>/NGъ̌=;M ߹ܘEOP_ZLYQD_u'޺\tX^ ttkF<]9G3B1P,0:)ޖ'=5eț+N5=io$*#Kbh?PbqU9V f.'Aџq>˜֜woLeQgYqiŠ(V+|[ fڋY<ϴ/O45 !1#O譵E$@2rvҥg&g4m׃,0,vԍ8,.IcCN!{|t:":婶~y)IhàyWú>YWPF\fq43*ݻG7zpepp$3c>] ǦEk89Y |ؗ^Vڦ ,v/~?/7=m(s ^pAןz*N7}=GI^M=u2ྒ|6.o f{Nck;Ǹ7y E7+%tßq1׺<15f3iwĜcyM,:[Hؽ=}VȐ[*_'9^jO]Cv x 4̶\{n [}=eͧw_nxf:'lO3<4X^ `饣'&^88k$"ڞȐ֣96&Fk7vЪݞ9fLWFlZkei/M<~˥?NkZ,1 9-\5Q̾r;rkxo`p-8n,-ۼߧ3x uLZLDb<|(mr װazx wx4!* ls2ܞΌwh9t;p%V4waQ|)s|p#9Mc @JrMF\i)#?/uSxe&'d`ʹ23hvy2 }0{kgN8%[7m /L,ccYp!m?( ?.)xK7_L"r۷OUEKX5R/l֎7oa>EТӢp\ X.7_㺖Yqt;0"|x)X5RpX{$.2)+I)(޲VĬ)Д7g>Wq0JoX]Xݬ Rзm }}|:g {,i;K36#&Z2r~/"AJ7OgcPoMؕ_Վ6iYrֹiTuL!tmc.ؼ13i~0\y"e'(kw4kl'kRb iYRB@7.ߋeYX>(y_|ɪ2 ڳu[ R9d؉}8 dC9ĶJ&qxݬ'x#T VSdedu*߬1J]{Ǿ*ybey;)LjGz okBԂӛ>mBS3f{}9y^v.GoggA1$A\uz{bҿ"11f@Wi 9m (Kj^ɭ=iШyr{4OA iTֿ3n&i lΉW_w?^JeA4 ೉+KLL< 3;c4xnCKTGcưӖ@B>=[b3XiOs95k%lr8Wݴ?Qlőο MN _̵['G-1X6ާًrQ+&1t>>JT:՟)cX14cW1_zWX‡Uszù4MpL?vCU];͒{o(8tOlw yəq=g錛cuOtr׵r@~4/_7p̣/sEoA3O\ IDAT7=#.'_=væ3y{xqh~z$uDkb;⺪vG/ KxKII'0N:7^>CyxB=(vn1ASU}kLumT1J~@R)v} 3KZ+W~u%~/0 ,vԝG<,U^1 ˂{,}a[[}@Y jeuݮ)eoy W)[1$}ryԲ^g 5VzlV-,,s 1 IՉ + mģߤ-d2'M@9#s 9 [6nTØ8*1Vva >}}T.iVG/O}æes#IBn“7fN/I B}$dOۡ{/x!B$!g(H!g/B!) !B3IȄB!$dB!L2!Bz&߲"4U[ !@S !QKO2aDIKKӫEIBEvC2"5ӿ!zHD@]viFIʢH(3 rBQZѺU+֮ Y5t?B!F(**Ñ䍍=sB!IȄB!$dB!L2!Bz& B!D=L!IB&BQ$!B!g !B3IȄB!$dB!L2!Bz& B!D=L!IB&"̢`wl.J!B8a<[1']8 n?MR03gyuRKb8D.uC:&a(;Kbi֗-克w@9 e(#o953y bpܵ1$T gQ0FڛS~&jB3okGm c/k?jkEVξ:f)>:_Ce咭m{FL'c\]YI9^&|(9sy} L^҄V 8V87fcG\v=~aQ!āK |{ٶp*?n̑fbRW?z0̘ͩ|Y^,j+Y/?fƔW{@YO|pK~u~)Q킜X|}3+r1I_ǿJL b}t'I͇>|Amz-|:_t>|p?rŦ!B45Xe,{B:H>Π8Lrf|>ĦmewLtYz^or'GlI|L<-8[؜ӟf~lШé\zj;Ƶ?A3Đe0}dmݯApN <4w Ӷa 40Lǃ4˻piCB9pRr/uʏ[!hx#+׼+!(%oO(F#?Y'Ӕ%)084M4aW#MAA /U  AAxD@& 𚉀LA5  k&2AALd  AA^3  f" AAxD@&</kp44|FswBݨ5|'Ǥ 'e/r(80οNNeo9nt]2`_ ͑f$Oq|.H{A`"Th҃:!5n7f m矉̊RHS1Kwnթߕ;mҗrFSiן#MlV>Ƣ.H[_L1^R.} +%c{Z dtOJBS%Yƾ}8s-s?.έF0~SR2NI/Ƥ9d:^xJAH~o $%0)XoHf,V\sRvI_ÇHAhD Y:& :K ͩw%FV v*]{晃1sY2)Y8ɫrC)a݉5bC|}Y~׎l:s7}dyk]6swlQ2k,vAƃӫ2uǡT g`0׈ J%xkw_&FLnC쳍 vq!҄o6=HZ,MdF_jZmZ؊Ws҈fջbnޛOu,0;&֤Zoa̘==[g|s5/5r;>]ɬݼElgt㖱}{(Ąa,8hڥof ͝ʉCYquSc7X9r7av{K1m̚N8]mzfV|31okomh^rR(Z}-Qߙ f=8m/d37YҠL;v2J#jveGʓ˵;㖅-4u/3E|۱1'/Z|׿&Z1yJ` P:c>u'~Vx[¨ԩs:xuP:/}rZTVٻ4FM& ?ן˜9Ky,Eyikx%B.BiW&W+YT.c4-F֐wi] {߱@ިXz,TPCx5K>}R m>NeG/UW5j8`Q$'K1<񘛯gݥ. .oҾu=$ YYQPdK7fٛ9ݸg#{/>@P ipJF]UZ8zŅL;Т YhDUMq;PtK6lu_^w[ՋܾUŗK}WEtY[:轐s\˜89m#ˁ/ZDD S5M_ (@ EUET##т2Ig3"%3Dc"d0me9JTd%/Ś# ?R FLt,Zp2%*$\XLf˭k$>G߲/[3(^zۺc$$YBլ ;]!VQ \2M+%'n y+W:' &gy?|Bm:8PNJuz)}ǂ_#ԫ*#d*nw$}# KL\9Nc92L܄ٶyq*a2s?"cZޚhJDuoft:h]VΔ6/1S8Lr :5f~,dlj+2/*+ *j^χF%A2cŶY>I1\\ѲoAɋyoL ӗl9՗7bb4$=\H:6},zf&Ifʄ5鼨K)kk=Ւ9 D=Vݏm g"0Kt!$q?Ndm ",PVSD͍@0M>_Ơ2v7 Y#)AhL# #\20_$G!*"jYE{ģGuyCt$1*XZh=òDEᣤt_?\J6cѴA}wzCt/%慄K3`E&;2_IkZ؞TOs%ͤO(KQ\L;'374C.HTn\ofl2~ Ay1 i&?(!@<j{۵H2z`Xgi3` R,kT1fLvyLU$I [wB%:"XkV$,\ŧbwe0ŌUȤ iVTەkIc4˱kof{BVNKD%ny懱<6kVʷDֽ} CEilf)mGʃL CDwa_ҟv"6qxHytcEPa=Ov'#LH.E'iBŰ,&q*g)X:T-MԶr#aVzn YJ5(zeK~Aݬu30BU ]^1c;+vNJڐrfގkDDKX| usH7ۥ׫_$;)6"p"W͠A=Ov.Xu0%[9+'ZF>SFvsg3A&0$|I{x5k.=ƌ}?|T5ךh1\e~'׃g獆u=9;Qae|%Rͳs%O!rĨ>u6N}̅3F{ĵ4!gh$gCsg]zG\UCK{XA{;~I׆}Wcsd!c3$Z-)WWK*˔,ԞMȄ❓>|ON, 9S=>˴i>ft_˃N j _ܜލ;ks(KBъ7H*4(%β g”X.ݚTeKfrFYhu T,@vg{8T>n]Y?ŚդYKMΝg4J3Qôa|Ujw\]yQ }]JPf4(lq-Aډtɕ>7 IDATwMzxWoޟmaDn2=҈>К^Yzø1g棉1xdyN@fJO2qO#ͧ`9_,2aZg {1fnE0|:DܒW/gt&7F $zx'Yk˔ѬW Nz|pO5ɹc=xJ4̴͙Y:3}N.ohZzk4mׄW-H)҂Շ3SfgkŤ}(i_%rmxvDz+^@Hҕ;';Hd>RS{Bj9hKvv˖K6 I=cC BZӜ-<|ӎ/ۇ %,ݴnݴoKagڷKv^'NPl'Bٗ J$')ڵZIl35$ŮIS1k @P%$[[Q$k7bTT۸!Iœ.|ޗ #Bp%t PI{[$dǁÐ\,eo[Č 2&R0,jw\+4mI]%g-OSk$*Xi|RǮ\MSlZ-ieZhc|@u0cI`%rRR~|m4lSNaa˱NK&zj`9.`cr瘧8vLs;ϵ6H>˒zk)=:Aۍi%Y.$RlSRT'}gZv}?J4;NR^IfFKm-]6[-jot+LKIFv(*S%> !+)Ky$Tedޖe'99vkJK)tIqVOJO+ϔ9G3;R<+Uζ4KrSoWrVNŮڮ48=?O+78g.ySmgYiߺI7^: H¦ZyRwv\3&AxiD@&=Z,?nШ!ex mpxi>em'%}IT" ^L{2r+!/?m#,gÙ <A,u O&BA5  k&2AALd  AA^3  fk/ұ;os^jUAdΒٲ9&*/]""<'[j,e PȲhID@Nݹ}(XKty.8;C7?8֝;O .^DBBJ~={.' F.^ŵN,s/ $ddߴ/뿺߯'Y,\|YpJ*c𚹸)X 'NK2RUU .xzz= шe,#pqqOw%w" AAxD@& 𚉀LA5  k&2AALd  A ڵk\vq dx" /1-x8M0<^Wx94b7N{WBv7ValpZ {Q . }='j[|^_cc_O%  I{{T cj+gxNlGH)MP_^`c1GM}s=`ZTTU?^z.9s%:iM)ߴi_C5_[rH*Pv#3GI+գM I>ߦodwd2ЗNϤM:^zy7d|XtńF΢-#q{ɠ^< 瞐FAl1/뷃׶0oNh}~b۳}{v2cntN|˯jjD^Kصk;eHhQfE-$/ TNQ PKR\wgd*+?|kF_C5'ȲkWS\?Ld6Z,'W4nXzoc0O-dh4_=DZ£qwY4l՝N F՜-r4t/QvѰzc+tuFԭ׌N# KW'46MQ^+zNĵ |Rm[ӪbZW\]NGg }ӆ>y?6|ۏM>0v}ۏvQ~+zqImטz my(ѻl ɪ1=hZ.ZveH| $+t:\}sRMcJqzs)wŞsm]uÙ3ؒ'j%Faghިu6mߩ7Z)EhZ;{|՚ Ѵ'-x0lrPo>;!ueY3~Q5c>3֍@Bm$/2l̀?n:we圶|:Fiظq_azcư3'sldvhG1v Իl%֤H&<;`) 5:}?o`:;#-L3*ς ]ܗG1g伭Q rdⲕљz))Ev5꥞T?mw w&mWo t:6{`4>SmOl\ob\>TBǑ9#~VnbI4=ġi/{ni=xd.0UZMQT}+tR Vyk6eR|ԜV*\v^ݒ^~GѽIz+WWO͠XԏotUoF`0~aAl9)Ut\;v H8A8&@Ĕ@ 7Ǖ*qבVE)X\aDm4W4oI1?o}rQwфNB*Dn-{-ZTVٿ4ƗGlfWEB*|)f.y|\x %{m:4ʏ^-K5qV8$! #+ ,!_xXr~SZQByʖ/Oي wU{%{m:6ʇK~ܼ9jӮe]3WIO8n7ZEK(xq7SvbxӞ7(n{9%v˼gfwZji1T5sGxy`9ĬcٛEwlNziY橪eSͨ^e3̺&%hD `psޭO [R78>~(LYr;Ʃx0ҵo.ab8q:E+q%`Er*Tes;>˻KtS}3s3f[8Lym |?[ y䷑?Ĝvp:,Yke~QHhjZ->*kߣ>;zBHϽ]o@tE!4b h&AL8 cJdd$|5V1+K# ӒS9wȱ q?_6T+y3sc^CA"_şF2P8Rzk?ҽ9e≎N@NIc(zQ<d_oI)Sh]g9&4x[G+an$ƶ`m,bM羖{~$VIy;Lga|)@<䃟g,Q]BZC4y?m#Xӧ$OTg!9 >gf|yYe(JR@$ɋz{cvs/xR9KfM5^E5xͱxZIW{doσ{ΪZ(G/¿ f6b0^FQ1@ 9k?WS#Y"֭t Xά\T-CSNt!&H$_jxg֧Yd͚Q9qqQDhv<S^~=zF+2"Mi1D''ߒ HE@; =;eVYw>UQy %¾kXS Ve%`2+gkB*DNo#N =ldCRJz*&~<4P#8'oc0cdžߥ$Qǭc-'`UQomi D6[!o)xL֕^LZElOwy(to,05:{vK~W|a&N׎jl:軄$~-k? {s9]{O5$O*CoqSeޘbџ1u x>s+hXjez2!M܀>c'E 7fBdM]93#HCRt|R^S[!%r1W8Q>M&tWVqL  /$I$SA  AA^3  f" AAxD@&dPMg07k]AYa&SePbmtFko.A%xU)b1aj=@qboթIH8'j=<φyqM*UDź(v#dLO֮F4py9 Rk/2-|=cõd66ʋ{\:oz U:g:Rjt~ JIB2gdo񙲂%] #;Ô`j_+rc֢OhS t)l?s&`[~މQO|s1E}e߮丮5_a߸[w4+W T ѐ#ńM?qkl9ٛOs?QO5Cpq\\? s>VƯH#>Cvq(㽙ɵ';h< SNF}"V؝x4gȠ.?n@:|, 0+6me|d 0,ފoE|\+g1BKC!W|,I@nj)ofȮKY7Y7/-e2_zufB+мy 7kͰ]$tɣpO'Ǯ'W :ѿ.bԂU}5NdB$ yuڹ v-;q)>+e]%$$$k0k|քWQE?d9YY= Mԧ~:p'ZO_⢧`DFD:& 2 b;y3wt>ǀvWʵlO@Wt.Aցsd}n͗ӱge)ѨO+XǞMHÏߧF=I2,( .jmhQW٪G—}f6ojΔGv=i,mg $mPmGɷSnq ޞ$!30F\=햓qp%>.s|&a{Hnq] 6s%׮aڕ|8OƃLkgT7s|8v€]eV.bޒ70j%8S2Ws\7_mZW̎޶aP|MOLŏ>N6Gܽg{&kBa{~ld, h4ꚾZƄd...+YH& CB-BbiraОL<X4RP%wݒng0ޱD?P- >!] '#3=.KVh"bq9'yr>? _?_tu@dy?'w9JJf%(復5WjԤFY{,nnG%1>wwwF;;j IDATd7wܤDG-1DcdOlA(>Y[N)(h16*=/iF~/fetm5lDz`Ȕ|}8eᎢ|fg| c.!ڼϖmI_/Q3uѦ7M ᢸz;d:?k db Y"!ko6L}uuaDgO#22 7}zd=!] ?a5ɘqHH17)=!pP#oƷ/l /{F(jĭn qmI$/)y6?*))Fld2&n5.]\ղxɟ6Wв$HvY˱JngS%gh2G+{G-YQz6'Z͊ATp^~z΢l&W)+&뙁T IEy~uȑ݋4rZ̘ b| ) |wȝxL8\?,EF̑:y Dh:KU?q"ʄf% FB@I_FT}(Tcƿ[4E+ߨ[8tL2LӛDLVÙ3([ϳlJ^3s[&2h9c_V6;QKc f79NA@p:@ cM͠}v7(UDxP n~<ΐ/4a=L[F_|;uN2RRD,R7?1mn"y+aW ~.}OWY ΖKkm{iǗN$;y/_nZg7m{ɀnZg}ٿݰ3 %;'(W GR-J򺚊jvc^,ݗI݄Aǚ[߶Djmeto[ L;Rj$# a6kN֑dv^Yٯ;$$YN1VGSUT[,%oQIWT4cXy)΍>h}N8n լ$ojƜb,s Oʪ֯Q:b9s%㓪Xfb9ׂ4y8\ikӾ:/ Y`4믭^Xt+[&y='vMHH Q4ǎST)Ǥbŷ9ph4& mmݴ:m,i:^Kec?fR-d$POK4IFV~>9]BN 'c%(i$ˤ$+)$IFJkXyOj+ni e#CAp! 'N@~ " p ˁ2۲ K~^? E|>]}>$>gg]^0NŹYh!W^y%={ތˡD_ɌjƓ~K8kĈL~ 4hȻӦaY{M_d7Gf-FA~8sy@1˙\707(S |!#(-EjS Oz(8l0̂.+"V%.6իW{76t(}رci݊իWѺUkWb[G]""r<8`jfذaԪU02e2ÆeQ\.xcEm}_"/ϏD.vj! fkמvXbLÇ ɧS2e2c;s;smEvaasיZڴiG^xjtGϟM&8},u=XLTw<X?㧸{;ZhC_/P  *:3fLgazI xɓ`={?wG3s"s7QG̜X~<$Y,^1OgFdWf{Wxrl[Gl W^u!iO? h<c2X?~5 LܙYcLюR~Yi=sd{sh!Kͭs_UDDK/&.w}&Ψ#yjh}we*׊$oN%uOvRVҭRJnMF+O^ڟY{&sz~ :L%厖e0\DF Xw"R5{hjĄ-ad[yaW=՝ Yj{ד.-#,UxT9lf}ԮU}{}gf[QD4-DDaxw Sٿj0g;t#RCa5.6uMrdTV;N9Y?$$&]wM8M `Sa>?Ps:AڕD{siʁt;O6FqbnIwAť Q"@&""ԩ3n۶iqzt~goPV2p2Gl(Erb2DD xTrZwRױjE*kv^XqReT?$0"LЃf'#1tƸWhPF~PT&ӭ~Jn#ד?ADDqu4ޙ.ҥ_ӵK,p'w/fNِk>UMjSS NyO7κNac6u}+'W_M|sU^i4D3p)`"qI=Kbxqb'{b}0IN`5Oǿz#y:kR?S6i7Nz+zG-d""r+W k*uv&NOrK9JqjuͰα@xGy1e2/ISn )OvΜie7ىų|>qɜ"K;ت|TSLߧ^ԑ4o(/3P߉}Gh"{r|o(@7W^ŃsN*ʔ)ëӴi338,)]#o]–2`?Ys~_az&o@&""aNqDDDD@&"""02)9Ozz턤IOss)rDDc۶mgVٺu aag8E!s\rٻ~4B+袱ABߖJ.429'"""0 pܙՅ{EXXURD(9aDDDVY2)8LLDDDa d""""S qt 9',b֭$%&q?11TRT[LQ@&""Ė[9uj" 4셓ټe ]zo""rN$L% 0> J*$'%VI@&""DFFgog+Y@&"""02)8LLDDDa d""""S qDDD !t}cv[`=݆p"]}5"ӭDDD NO f`u*F@&""RHZ ~˲y0 o=.KXxΖݼ߯g"vnۑg鞬[Y?_f׽nȲ8d$0)=}iy ߘɱoegɬNmҲe:Sxf%[JǶmh{<1c#z`#g[xԓ,Sg7 2i1cr3Q(`sdLm{?|4IXwrt k\>1/F^ME/>j! ƶm,ˍ}e킺LJDͿxXx1{uELk,hs;=Ae9f{?MGZ, 3kNU[w?pHXZ w.dŞt{=b\D֠u (i!v~͜/;dҭ7~%#w>ԖC)g9۽0w)]oiJ`~!iѸ v%xZb29g 'WXL-یftj0wl,0oLBbIzs"݌v 4Jr_̿: j ;II^ɯ\&lx+Kn6"Hɝ*a .8wNVxr'P:^ف z;# 9,YGe娕jC1&&*]3l)DDcqM&4q1d49C ţyoӺ&fDWw,3 &4F_flLag8fx$[9gYǏqb"Y)>!e05C gɿr\BuEJUGjSS n:L`f;ЕgvU}*oiXL#飙l,Qz%|tUhDu'X`lO%ftdӦdɬn}@A)˻f9bv-LDD I>y| =ijr-kќ]2f9(?f\bWT0PnN\uSlGK˹釸dHzjM&qe7rUg2ڊpcX@w94]3,\ ؙxe{?}dof> ~d5gyϳc'<5>9o@uzNE~~\iEDεoV^:y,[&MkY?o_ys -VZE|ʶm֮[OZ|Ή'GGgdd<~]oy =Ù5=e}n=[ey2ƲՑTmF"""Gz^5/ER/@&""w_3`NƖsBLDDo10]^19EDDD@&"""02)9Ozzo'Emږalݺ *qXzz:[n!,,ԷJRDDΉrʱg^64jqP@` .UʷJ29DDD`Xno8t #<<ܷJ29' ""*9 C&"""02)8LLDDDa d""""S qDDP -sDLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDqoDDDD@&"""02)\5 d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)Z""",)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD@&"""02)8LLDDDa d""""S qDDDD[ EGbbog۶oc dEXll,a\Pm-"rRDDDa d""""S qDDDD_Y^ܖ-[پsG|G4 \2.S߹E. dL.[Ω4ԎWK8ϲ,N:7}Zjv"}R/B7m"=#2eJ ("9L$$$rBHHH]K}jVڹ]4VD Ǯ]@W((8L"T\9tK)XbAʕ+[,"EEg׮ݤbYdԟʮ]+Щ " Ul$}Bc IDAT;vd׮ er:71MH.R*U*r|G"J"e]e][%"""uY8LLDDDa dEND$K2Mti qQ9tRU2>;qqq""āl۱RJV9@VDǶmlΟ[V\.I||<}DR +ʔ*EiC""YȿNqDDDD@&"""02)8LLDDDa d""""S qy싈ȿiỷ"""O[,eyŗ,޽{(]!ŊVy' aJ([%y]IMUK\\ 88񄇇V9@vEDDh#"K焈 dz"""r&:_DDDa d""""S qDDDD@&"""0]<;z( 5oHf!!!,Q"br~(GG%)) RLNЉٓށF=hT(_P*Bhh1ʔ.͎]#CvP˘\B=32)8LLDDDa d""""S qx96a~˷ܳvL.CNnz72l1}ӧ gYW!> w;z)rt2"/#_!=.b Ti_"̌o̝VR RۃTCJFLsX98+dʭ0ML? poi oWXJ6rhISj)queHVľ/H~L?e@g864iւ={[?f}'<ص3OŁpkw:mI5m|/3ѧ -ZM1$Nʹ96QZ=?s'[5qjZ~~|1kՈOGnq Hg哭?ȰmR~>]i٢tϨ9}_y;x)<|cG5iN۞͹~`^mْ0lwcV3g  -_=Kkмe; Kd!xgO64mڒ.Vn_Fq{4k*~v}o2wguAz+:S6hڪ+7a`sl<<%/~x5֍[qUq[]59S2ITF._-|WP1fNb҅x8ßfwr|,~i0ϖ,c;w 逵Fdi|h) ߾!*%'df ΓFNVݶ^I{K^1ç=_ **Vqƅ->{__oDDHN< )""E>DD.Dέɜ?϶"?ϴU1k_ ?Z’g۶8ra^>7Ikm֙>Lbt)`"q˟$eq^9eۜ9sӢ}-0QK(nlƚO7ӔU\[өzN`qbl>PPgn^fVtiХ%ǿxO~;L`f &1M;nΰӬg4,ٿz&7nEhP E ჼ:5܍əՠntS ":*RJ3ȿT9 MttbLƺXƟ2!$"""̶mmNRReKv͚9+55$~ݸŋSK0 m;X͕Q.ڗ'20k;?f!kNҼ;G@D.R dEml7h|5\<+<<0ʕ+~/W( OmH#ݲj >'XQ/֏{2xjCj+IQ۶o'( 5jo2 ??? ض}(EirR}·̍Ls#=eV^hv q_?l]ݒ:?-y7cY-uWoʸ{L_yksoy`<]X;gpwa,8|R 9qJvwdj b àz$%%[>G[qoZxo+}؟t4ļU *O~ҥZXuY :]̒p7R7Y+|MI@,&5(_ uqUm،6q\ƀ oAU7m3,٘;Dm"Taur۷reWe???ʖ.޽{}mȰ=3oQIsGE D]ޜƕ0 , Z$V'.UfF:_=tdX|23r]M2ł=ˏbYj.Sb[CxyuEpDmZ/M h9 ė &!լY1oqqq'l>*lE46Q\1{=pmbG߳H&:h }+&ksx$Vt-yJݏUGvP ǯ!>x^Wb`qp$yk[%ՎF܅mۿronOb_҂ѽjF毼sQz|<× lJOngٶ)DD3EPکSR!!!9z?s6K?ߒjـMh[̘o;pMS\A`\>X+$3;a{6wOx}\,A1Y 7XA DłEߎ&w+KL|,f<\@ûƤ-xE|tJ-%VZhrY|3Wzeͼ"J sc? ;k^|Dk1neyd1+-c1SVί)<kǶs })ҽѬ~,.#؍x%, mN`Д_HL/|d/YA.=1?9K28uj #_p k'3`i` ^\}~?s!Qܥ˘LNxd|LNj _~͊/_Ǒ|{,xE,2mN`[?,G0kwL˿`lmdgK{q1ʒ%qcka<6sAֶtrg@D*S%R1/;m{ϣc_ܔ]cFS6KULNxvR҄@#,͚T&uI߯ ]Ӭ$IE\_. u(gw5\GѴd Akj/=ǂiX1 Uj@LrZ +NҬMT wA@WFdnbDEHFP^[+ْ$lԽz.t+ZD#YٝUmsIU' &? 9a 2U)~ dhjoLGoU412c$͕&FPEwCҊlɌCдBA+Ne 4\D7vX.L7'}NG_ v,aӫ_C [ѣʥx "j0ݜzHgAo,[N>7S=1Կ37.G #wmg/GqWxnEC+lەL:%)Vm{<϶]Rm"."(0(T}(55 b~T9ףLnH3yGfL&4qAz\<-&ڕsҼ¶m>W.ωc1x0ʞޅ4v2\.LV8Λ;sֱ礁TϤmOi$bN˓K죉;IX=:~!3Z66'SfcphR\q||of|DyJ}ON 29f>꘧^F=ftˏ+`Z2v:Gൡr_޼1cٙ{GwVf7|mP!JG'}_(EvInh˫2+# dDI2-->M8ϡC692uZߏLDD@pP m3eْOgVbd:{;i9 "(:*->_݇`c|UfLGf?J^/`xC 8r`~;i\ W^.5DtMqR3{>@X[ ] e mz-;йyԋMg`Y%7ۿC7'::kGuLAdtgkQ"h@ uҟΑQ4+n!X3r,B|Bs)NTQؕ'SH|\Y?gUg.SIN>M2gmT^oڶ~w&c z<nA!6L <۶rH,Ǧ Z4|:=g^·ӔUyKK#3#ϧ?mrޅPxq~wjԨ[M6Qxc<\ڿ^[ '8m c`QC˽iUp{X<ý˞c-  $NWdLJ߼ݝgz3MqP)f 1~ ү3 3qy⧷*%hR?Π}'ЌG ؇2y;dD]q_-} =JwpOv9ɠe)e59lb֐_XYjK$Є+7_ڑp܍+oŸD'z$' Fպ*(NGyjLRn /}pAH| n?8wyY;;O!XiN _y1 g9^;S2 +G۞J}^ 0Kj7ەG Rk>ןABa%&?+2Zo7^AeϽ}{3Y}MMa? { yϳN3>7l^:gmʏeYiT^=<|n6mDS\qw2\^ƶ؆++a``J,ݥg[s(xyr<{>ofLl/Dҡ2ag[Z w6LLW~z__6 'vN>u2`T@mIc4jD"s9ÞzMxWQ8"_ڶE}|04t%ė,YO9 ":*+. _gakrDVdś1P?G]ˀUPfnB dpsݷA&c]LQGm?SؽX~T]{M?e)""RT2o]–q>.9e)"]ܖH0m1"P mDhRDDDD@&"""02)8LLDDDaEʑGIK`  8Dw9ȊT'*"NΑc) e""瑺,#G0&EB@@>rԷJDD!"&==5\J@zFoͱ9ҨLgߖov.C8/gh^\t/ -oŃ}&6~WmȵǂC&F|{$8kvꅰm.ltC'G}Ɇ(7urwSɒmHW͠[=kFOCX?/$na f;[@g[f>Ow8a94OY@GlHW0w3eUG8Drproz>)XWkkbd爎 ^FL]Sǵ"0O[Ţ"u]ísX4ebUt*fY䇜_?+ӥCrTW_|osY(%/VŊqy'@&NMjKŊUn9/ϸTv։ܵ#9ѵ VvE9z3m+z67}^[]T p(Oj2߼(YO _ճae 80Ck`h-;.mјBv떆nYӕ|{ ؎"*f%z|#; fh8Y&2#@}:˗rr|Y` @U܆Gܫy VX:Eڷv]_T\&\bn(j6J\!G 笓۴BhΝ?O׊*XqˆbgVVD>D%'_Pu,a7mTv=>cez,׵G%;5u*޹sluRݲ]B{7פMLSJa'y}慗,s}b^ha'焣 Y^M1"y3 W|q&0foCbi{rO`mߊ֗FE7ǵx^J`'\OtmΞC jxۑq'.\޶WNqɘRU=J N;S.O )qNw#TeULq$NPRLT[0K,:MFS}0pdGwj1z0?Njk^G#(hߵ8؊ et=pvv| VtjŞPkщը0T|/*^Obwp'Γk\zg*6NÆӭTL.9)߶MN)֍:ݔ{"8hDdqI3N3WC'X c~ӛy[[[wiN,6i Z ۤvi6̀1;c*W6Ks5:_=*DJI)(hD)(U {>oc,T,珳G[>q\{U(e@Qq]aΔ+W-/P<Aw:ܸu<"}Cfl֟YIt]𑣔.Uʺ1rJz~ R;3l5lٟVY SMPH6[ +ti,Ҽ츧H DO#g%5$8|'DGo^qظ!- *θ:D&yHgb 1Ƅs$i؞9ys,uf!*%CٛlFS O} ϴ#!+jP1էoyV hh)Y(gUW,HڃZ>!!OBXo8 doUE՟_f *))tM`jL.Oɢ9BH {(.87 ٙϐL'g̷HҼR.e ƁSVGC<:8̡ǒk.WpԞ  GJ= {i _f!<9A_Eq-!)&W;ZR&t6k6opAf#¸良 F6_; ڤ'Gq}|pQֹ ܊IBC#ˣxf7i>rO䏊ѣB%5doő\E`dЗ9Xu>`}!>89RDZ8!}F Юҥ#k0eK7K>wM}ߏv2sV!A3=>~d=Afm313z"]O֧?O Y_xBx?IXQj}56NA-йOwu\^3q9ڄ9;%`HS ?37WM8hISAfcw09;߮nΣ5}i4֋Ov&Էv7~K2dw^2+h.,~ުX{ZӇe9NvX.uG5lMAW bɬ̈́ۙ|;vcn|i߂,uH1o݋kq4w@ʝڐzvoD+}u@&Ȥ4shr-b_{Irw?Lmcc^kxK7tr:y'lrS!aOEL_ڑFA i9<mEEubJXjׅUpȊ;e6=VE ymScX) ?n\JaGs[MԆ<4ynĿꙏ|n dl !D&cԤTX3bQMeg]9]kaoU>nWӫ7N\޶g#1;x%unL+t h\c7 E+A*|>.'6re4'ʋgGUְ/{sɉjBK{aXPLY[QYLc#jv@ lٙF&~?~9gr_ۮ]siQEm6{mW][OLIUI[,s=t<*ucķoMsa>ŊY|9KCJzizBFpLq8h'>h -$ēx JqH1Od( !2}:Ys[}c4 ۗ |}pz@B"ߴaS<)5hZa<Rg5O2tzsEQ=vȝ&(`HT{vdrF,Eik4ͺb/v3gO8`Ȓ,5ꤾ?O$O!B8P\xuL%s8!M.}P0^̝[ yuW㡐+w/yua=I2B7gզT[n`!)b/3`+\=}I̋Dغac?ÒSP#j&a֜(uS=: mz|hD^>dtTrLr+n .\&u  [ W6{.p#>A;+n>l:t)J^lj(3h1\X+͵hTnrl `M|ؚ1.p 6 ]H;*ZͺLH Bdz+{VlPeSj][f&¶ģ*/K<7:٫QvsWP @ӿСp>Jwդ|JTk_$驹oܒZժR)m:;,Iqt]V?U3_֝eRʪ+l¬6b|TL?OIQҲA]jס2/` ԁv`TA63aW3Ĝ]Ɉm_+ 1S2uJŮ,H]uh^렣sGZwĉ笾8Ȅ {.+_Wd³ҋ%drNF4n,N}.*.(]己1ȉz;.g,obpy:f]\<"G1h唰eO2Y}_ixN`@!k?t#i-nCJez!&5{ʜҸ.w6}j&6fEA.L\=;70 ?SmE|rh2csA}A"O<+Cő.m̓ulX&] j~Z0KB)ظQ[2shDπMY3;!h:1'2S3jSn3:ZCX|({bSҵ ˲[V"Iƶ~WFԨLcz3AT~5GΉМukQN+zL=@qkzN: xqSڌ=L2?/}SV-j5 NRY8KmOJ& \:V c<=;4aM;DTjFծchv4iP5ж"ħs dl:+"3/v7hu_ tmET-ΪO9Vֵۘ{aT5ÙۆO_1>[@򺩠8pIF5p,ҜOV sjYJOC0r`|Z}ϗ HML=`}%mAOW!bJN#22!D&0ݿ.k)"VW+{o*mY]4Ki_xpmc |,Sp7,ٲ=Z5P_){4o5t@ɚGx&J˓Gm ^(S9-+q!W#hУ0eݷmi֢Z«/;8MRN& tR_a!tm?2CpֻI Ӹi͠aUUևT;3}ǮbO;R}ƖP5s`̡:ZӸQS˦Io#i)GdzYvuH y*Q2^=M:G%!H&NMjKŊUn9/ϸTv։ܵ#9ѵ VvE9z3m+z67}p);5kIWZ16NYOlJU ns+*$f_Jnؠ\q?vu3kGlhQMg)5=^%O]Ka,ܰM]^H"k:(.T(gTT.Z O*ey,+ɛ@מmF˗1g<=z5O^I  i>ޤMnSBj~%_" ϛPӮM `iZfAٰI}Mh]*0H{5"0N-E]BGc,?]jw`U7VOy/:!_[\ OMd?V !kaCO3cn(޾d}\s"5Ő! *ЮtLuɩMUUTWwҖ4@\} %&j:u 0?ǸqZr"Z@;ΚBܚZs `]4"/eMHDU!fmݙ =xN)#&{gl σܔ_ Б^S3>3gAynX-bOlIS8ñd79k_e#e]s`rogIw6%{hI\3=`> 0c&'M>jC12mNGGOڭiw72b}ڌH;ਜ਼ð#)tsM; ӟJ Drf^8%OFjckS(J6`dԠm˘qx CRXNπ8S*dynj{,^r ٦Qhbhx-~\Л6Gn M#F Iԥc|bS㘶:;\lbŗ zdcoEOBjI`rO~ýɐVeJ¤aVƍv*;7`Ll훰` <^ͧP-`$.AO{Z=[!2go`!)b,wS.h_4 $#OUs)˜z_,7?vx[S 0t)zV/]EXh>?6ύWo7+%lL\Z"OMᮄ_E.(ٯSsؓT"W8u7wu쿗TΉRI-{7ŊxiMe$4 (㢀wJRv<.cI:Ac>5OuHuȗ+5rN6Jڸ0RC&xcfd,GwGh~ [3'N5/zrZF"xd!Lf~;38S*~ ?実\}ϲUh7lc&е@M*NًQt֡O-QԬu=ث-]qU!E8;ayt. V(7֡EG1Lےwe-@/F30דkP>i듗ɨgFn^"`{Rf4J38Gvõx{r&r3D}4]2wl8=6dQ}ĤO/3K9Z{;DFxcz=o\x~aq tRn6i Z ۤvi6̀1;c*W"_|Y?L۹j ?YחX8-RJZM)23d)BXZ+U$_Fq|&@&xsN2CKK._: eGCdfȄƺ>5i1,z.K>DqCKJoݨqJ^~ ۦ5m==sڂ'l9v` 'G4j҂g"!uvg9ݚbGe F3a,MZ(?q"Fczl$ !2 rn#=j?/wY<#[ r\(PE<'/eD<}12NmbOI'k=5"MgsX/ٗOaG4cw*=/SҔ*U'`]$2! dBL;y.C Љ9Sn+ #4O8QB~ kݘ!$v}_W36Nz4)$7ry:7GZj._?C¥%r.gW4:s(n$RA7);ӠR-3vu(Ը~&~;Hp.I<5a?wB{2ӈῶ !215wyx ûbmT+xaP@An3Xm;k~(YuKL{#W}6 [p^a䗵՚Wf/PƞlPPv+U.D 8!?Q.R5h\c؝3}SE.d f@&< T,kCH6c_VɅOj8}'Գ%Vm󻨄Lo dBLĎKa<~{8Z*yT >΃79|*+-ݚ+^Xj5l1tMid'Z+2CRc4&3NOA_x9(m+4w-K^,yql9o dBLũtFDZX@fjسCrP!/%ݠBRfFd>˱!O~rG\&,>mKp˛,֛žmGe|3{&Q 3/3wLB d)G|alU vWp.CpJٳ$h7bgNn>ą&utZ0Gyhֈtj/f1aQ Kuʕ{iF#]?‡?'?PB7r^īeVI}CTvP<ʏ%bϟаfM6r'ӊ [58PTN&uj{Oݴj$qjN:2'ҰBջ.}#vN @Jîcg~ W>?!wZ!+'7.meuQW_bb8S[aβ?0|~:f8zAʢB8xժʱHi鍳:;w|P9uGRT))!-`J@հeZf1lN6ŰbXOvumvi,Ҽ츧G!N%K~1r$' =#_?J,a=JſB!2EQ(S4_G1lX5c"s@&BJ*ɏÇP72!_@؛Mڐ !Bd0 dB!^)2mH BJ9;;g=ZdXWZ3iC&#,*yqqq.QLL,aW.LBW8qqRSQE ???ܬE@&swwz"!B!`ȄB!22!B &L!"I B!`ȄB!22!B &!_C֣ 僬G "L19 !ěA.Y !Bd0 dB!LB!D@&B$ !Bd0 dB!LB!D@&B$ !Bd0 deZC&2qqu ĵH.{GY`50fEl`=B)O'e*FήÖ&tT.^~,W'Z>4kQ wz;燰\~>lu?J橌}njƍ]忼sk tly3/zڼc7Nڥ%: 'ZƍJcq{NnvJ.gTc_l^P!25+jE6nOza!,6)1UVQYfÙ=&^ h'Y0&lI;Tl_OY|44 Z1j?I*4,ޙF$sy|=( ho9,YLaS؉Xٽ;Oaj8q:M~|o9W ̘&OxԵ$VR҅ytxGAMNѣ Nп6Gh(LV y< Ɔ,XU5ݙ;a=߻M "8K4dhWؽr.3fb~ӣlt6^%ekN=B#;G70/XЈg;)h/z2wϝYˍa3#\Ncl:ozt\#1Yhїٹ|L]yZ{M%d.\iӘtS'"3o w^ ̝>.s"/r.BC ܅ FrwaY1uj .U h\[1=h};֣sO>8iô 6ZYܫL3[z3 .f[\]S 5MJtZ)֧ i) IDATa/Mf%:. YH,5En|p6>ϻs^vaoh_(5PQ;sxbVylA!FЕ1xeyәs 7Ii1P!k?t#i%|V4*~*\M=Fܳ`)lO^AnBVՎjwjO&P5Q6$tVQ!vrpRn˩YÙw3Gyt%[9gk;sa]Kl?e-^ IZy h͝SYr%(RC))[<󕥨ʶIt0OG#BN!)i bĜf<ڵ[1vTo3 F[;lMILV'QAeKo>y wG10bgc"it*Ƹ6~سYۖ%94q.pb]?x;[H6ikkLW켯`g4 0{p]|y+B-j)HNJfʜ0c0rx<~+kVpn&Px`33ӾikUqtT0'O &.a;.̰ 4ZѬۓݳ8dWdR 8y5h,J`T0{v%}#!2[l-WmiZvAnl v":~}뉟qeϪ/ȇW1c=e>lqV\¢ ~}+M*`uyΉbP?EP'8Y+Pm;ޙGQem$d_UVYDA@GwEqqA?qE\GEAQQEAwqE%$CNNnUW'syϹH߷+W4n:хxo~Tl왐_Mˋ\Cxg8\_)Ux1y+y6`.܌ ~}doKV}[ւ}1袓0iUS;(%K>g_U'y_7jy2nq7`' Ppޘwf,()$G z)Ywq[oE0?emG'goaͻ0ua pmX{m:E7-~Zt+]g|S[_= ث{^Wσ <x.j _|}#rny}O A̵xog( YONϥp3ᕛE=݄9p9YxdPSyqhh  _gN28(] (XWqdt tBmvGlFaR,\]N'E_wۀz+xtG^ǁ*|R>'u͇ `ccEXD>;cEUEAedt<k8 ?v .Z I=ɷ~?p\?6lL)uPÁc}'˪B4e 3¥p¼ɏ+WѸi.qFO=^t3ftPVhrl ˲,>.cuphԆ]3 ~Ƈ gEC݌2n[CGbvpyg[\8}a`S"΅/osqLMݯG+NxU2ŻSƚڽp#QÅeQ .cp܏ÍucmvVbDf ( oG[ЯSϛ[Q 2U3?WWR4Ī}Ƽs7 o ~h|>poLeuXjali!A}Բ,D,m,` ~3j!;7Ө[RRA/_⧍O3(\4 RVY˂SfA^V1C.v`G`EnMEݶrcn7x"`gg-5FE:ـs'vR^ԻD\#<fM=F{NBsۆeŮܬțb֑wbw:<- eѤUsԲU_R<5d=5<\|oY?Wo->c+MЬYh3c68*tnzVZ?`FY]QA0B{ଛzo}sY_\O,P_G`cǦw?Uajk#p#h`g O_^ g?4{9n JJ\ص"Fټ] yy\^ڴ@A(J:ZJ`Vᙷǽ`z/Ƹo3K 2mbcd9~N?o|j>:W0m< hy-]?mp8Ga#I^5кA݈SN܃pPjNh: tA<fo] λsgz>>G_fw@6!|{,*>ݳ_1Z!dơáO}PGyF݌Xy|V%Ũ!KGJg'`Y~wV?twk7^-Ph-.܄nCŹYe?8W\<re1+6vF'\1 {Lxu$ {c8o>mxoi޸j]1}Ol'L73Go⇝N\#/=b-Y;?n@6nq9X#~<=zGEyV4ۄqoa!eOڡM./KV+. B0[fc bå'wn&|?higd%}'Vhw~Pbgcp#?%ҕ926[#4{98$ :>G_oEkZ8u[;<~0"wnq|Q9݈ؖ;?i[ߘ\zp6^^  `[0ױ m0w.ot10c'\_ށaF1ֽ81Bxk:uukmi`Pp\3݌Np@]p4<b3}1/܎^~M2|y=]'zg:'+g3FI1pӗ]~P1O.+vPv4@ Y,ǜgeȨ~ g!thW>+V9Nͷrc[2VſKFq@泘<Ѹ!: oۍpS_;޳cƽ?Cv8om܉L^~4aWFe#īp[c0F j/Q!rD?Oshѻ7ڎG!#6Zz/G{Ęl^om~z/T6gq!xt-AĎ@r2d g϶xۄC٬kpJ Ty ꡎ-E^I+4en!O%-p`]?7ncG [;m`󆅘9i69h8qũ]PJ7ߛ 48ٖC/ĤCh Rp6W?/Mۣpo7~<|_Ze)'K#y,7y } @63XL ő}g:汑7}^={D> Ї8²`[e7qemXpءIB"덳r*qr3xڮDZ8gT9/#D\g vvv:NGG1mqhd;.,;(5_xsq70tX<\̆m[lሼɷDe#~*L1|hzEq*kX:Ʋ}Z57Ax`Q4<>pyϠgz:QY Ο1K04v3f.|-w&S S֌zp- DļOyh\ eqnTdT+G%7%XvěegX>ٽXU ?''r'6?Z]/sW?;#rț/Ux !xݱh" E=&ӵ8<+m.˸={b\e)~f*[q^ǖ=K#g4Ȕ!3lKUS溮EQ%iXhִdZI jȒL~~~Bw(P3((P((JQC‘((J833s${WEQEIԐ)(5d(()F ((JQC((bԐ)(5d(()F ((JQC((bԐ)(5d(()F ((J +6EQEQR>ﮆ_=*(J Gz;B)(nϐB eů>'߁maV| K8veKqFȴD233QA}kv v2y SQ%?fco575͊/NeK-EIq : deeɴDK˖C2lj7@jVEyhDX% Gy Ѿ}5c) ++۷ eq~&DwE=^FvfHJ@32$W%%%ʔRMdeeUDӉ'ǴD^ s)(<fH|I!]%Ո(('\5OIWCV9AEQEI.AxC:)(R]yQ % Ye zB)(zAҚt0d=A.@((Շߚk=xQq #eI/*E1^'t(.ޘ13f˖u]mOT_WʈF{钠u*JC N_NQeY]p(ڹOt`%2u*fϞQ#FÆ4E7gm\&]:rt!(RRRq+f:M*l/o܇{.鏋O97|/i#q7cУ1beo➗`'ե!bÏ?!CpᇣAhذ!9Oxn>d(C=ouq$^kZNx.H!Ī7M0k(=%%xΡ2pd32̚(nIΝxkio[8hl>{oVVZ 79yA~*,[ :ucF#:u˖*7{c߱}񛘳. NnԷ?/^V_>q ^Y?nqx{,L)1o%Vo6/̞{Eo?wiՏ \e6iU:81M/5ӺxD}ߥcחcFF=hbiۆoc͸{%۱LpQG5^luYpw"d7_cP$ |Ts.mpQ {®ހu )]4NIq[볌%2F◫vmv[+qa,sDSe^QFs)¶-{5aSAFr8XW/s,S>~e,e+mN ѱv7tb)0eTvXrkzm5r$&>3d#[?qOyFχ#D4?>y۲ǍقMeB{!xа„/!-BpঃT% N4G8^$h]}/zXⅢX(J易̋//Eq-w|pf}[K()f¸Vh u]9cvǠ-#e#NZ|\EmN"\UqRrs>mld\CL07Z9qvj2l4'uPf EQ=˲pA8u RR!D[vfs.c f"h]\!1H//Z, zEQEIh}vs42*C$ՙ.\ ߼(^4zi'h]BI! iEQEQ~CE~m<12ZҨnC ɖ'>VKX((GϦ~VjSJ2ur&}WEI:9!º0r2c7P(.7AJS\\J([y"LPD /R߉n7GQ%)aG>/EhېŲeP\\"SJ)..ƲeKW7WmRrj9rdaX.WX9'Z:Q )T /W+QSMY< }~&iYO*ТEKs ;SVdeen^]hR g5%L$N epQ/e:o5_-'YQǡ"VCPus'SχeYZWsu ɀ\e0IdN/H!( T,\tE:5}[EQeYz2$˲|=5 vcE%ZZBA̘H3dEy9^'T>/g7QEQ%=ձtk~ C'VI7]LK3((Jk\)G$ӐzoB^h@($yÄ^9I̥ ɸCf:^:~l0,((Jki,rm,-h?QC&Ow)ǿXQEQF8s9L\wYRlEhL.C}O!~yWEQvLF,xi`L7=e #A˲_/6:-rG5i>-As"vՀH'M:Ǥqb~㢼A릾8"'6h4ȅˈh>C7Ix*LC ؔsE;[@!35b9) (3cV(;v4iԚ4 LyEQ" _5idxx6Z鈍hk4ir,ڨ RJu2fs@'ʏ>xq51&-&Aٹ>?.e"sE¬ϏјcXyEQzk4Oܴu/Ee((ôo|ȵo1$>VIF8Ry?Mi\7sk`:G sDyf2nv1Q77id6>VomMS)o«Ƥ⤑hC"EToҀ'b չ4es1qX!Fk8tXQEٽkWKw=4dHC/kɒ:xM1inޗDX0_WΊyfHbKF|}P1)ϟ#Ct1yk8(*(C< \e,}Ye0ՀpƂiDqL'6d  ɑcIPfxLe7Ot[6#뽾䭜t (7^K'(.(&`:p!ʜ>9\yKbBi>O9M̓&sr_%'k Y7S,uH]ƒXyEQ%=ed^7(&"uwa6Cr#\Lx-.c95R9leD<1I2:(/b.&[ \8)&./-CPw˨6>?n^C~-5+(r͓1PɜeK}?-)旗1ߟ܇\#r&,\7Q ~Rx '%fPY-Wht tw c4Fnuc#MjbO(>6/d-\7:Y7L9Sρsjr S 'V\ڐq\T432K*P eL;d4!~7I30M(Rsk`8-qy|#M8Z'boD<(J^\7՘йkN &KNׂ!V;Z -!7?]jTK-~c$^(ge"LTk2/r49^ze5f#bOoe߄WKL"b0:Xk:ɜ&s9x6ڐ(ojidyQ u%ZKc8r~9I<(Jk~O}c^g%]d\sMe,[B^o>mFLfǼoNyx_OH-V,WEQj6 NJ&JMcL}1As\yq _..p#LFŤɘz˼FHִ_”u2E(J$^3 MDs^u2'lN2/uF֛EXśǰxԗ_^.RyV9&ݤ~9/*3FQEIYƘr& 0RwYKyS Ų-7$zA2_5C5i\Zin7ŕ%Q((K}9ɰ>! l i>+3ޯ%LWߋD" . ZPޫFkᕗ2UEQҟ9V#S0eKp=Q5w|M$&0XXg203̛jZ)$JD̡($D,^sTE7MdN+4&rN^ Rd,AlNWo T'8(T$1^F&HK4FƲ}"HHt] ;H P:lL!sĚ40& (gr&ݤfc8NSΤ:7^ R7\Ѓ]:/#?d.7&U(91 2;0MǯTke{躸Htu@ʘX4Δ7iNJ /]QEQz0"ʛsn6h]\${g:/sdk NQ(Jꨊ5+^&ȫsjL&D: ڸH"bxy9R7E@((5ʘxxc+>;aM;Z~x9PeѱB`oIm[x1x Xz 0ި;pL8(pPР~ٿqB]qĥ[W}s1x3<1/b'.O3_:yձ})Z'OWhmH6o9Ƙϭ?D7cljHDUwt2_aK}[7Aoaӕ|%O=s۹3](\Z6w^tň]y)Y*Du_/A}WS`1fNU£1|];gg|}OC""oոD MbBo u=}ice%/*,&Q[7yoQ--"bGO;o^۸&7gصdtԱy?*)>>6qnjBZ_~|mDЮF*=r߷Jc-=z bΐ[Vo?y[eLjv>'uS5_5=H'O]y6ɧ]]~xz͞٭&!#DXxLjıEwaFgE_KzĊ!ͅ_lZ"^uuu^O-&Ѷ}艈v">쉨*mTYWn=~+)#W+~!-m~<m./s}Ξͽsx}2u}~8nX;".SJmw3IOubzZ\vv/sj㡾Φ|v/.5 _tz끣ZM ;z9Q )1U6uυ.PZ\s9&~MxȼѭS]̦I[vLc{v gF-d񌮶Tj-mXS"q^jV w1TPLp杼s/\X]ؕUA>lY[z? XQM"r5MRq̤\~ 'UiVO4qݺ %eԉH}f[h78d%{ z D\~! ftq!K~PyM,u'V_6k/:]<͜NːK4.fAưe4{bop*f\T)D|;t\3nr73-˹{ѼV[0n~l׿x\YO+mgdۼeGA3~PIo͜v^űNmV{l_-?dl QUYbd ;yM%n>yϧ0ۥKn_-ؙoʲ&7v.^hUmpg0Ѫ>Rۙ՚1 r_WǶrWuLX<뇿.߁+|?Iz+uEx9W*sh'gHs$W+La?3FE_RYcILϏftMuTCf=ڼgW3W1-qz̓z<;|KvIM 11uR Fu=jJxvGņgK}՜%%-NDe ,}[Zſ갳_G y߻ܱٻ5V+Ww)jer /wֱJL!/1Q*eY:UZo> )(sv^.Qb|NFκual3VWNpb[yza3'toiQ:tAϲZ΅Xg>Wn xOka^0ghXZ=}3)|߮5SqӡT.=Mui؋krZN|E/<)_huh}hJ*sX6;v>vq.L~r2F ^:y}4Ͽ]ض9x!Tua JIKKJ -FT4k[:}oRƦ$gKMNe,+"Ƽzv}?:+gYp/;&bO߹Sy3DNOϱJI E.z#-D4G""ⳳ_41ލ7;sV}.q Hwo_.{Li={{ڴ;>2vֶSN]|׽KsK$-9XHRDo~o]|yV/oيJߘ"l*o#kbfwctU,t[F8 oSs}Mݿ\]n˽O ^vəjZu'l]͞kSְ`I|.'|?vfsMo(۬UO;b9Ҧ^\m@2:y֌gוT-':ĻSF'JRVKZKP^~fZYΔ!N^{ڤOyht\toQ]l'9">?Ăe! ӏ;Ir@x+b,{7M;w3š,Cmg["興w&"bVVʆuF.O&n'v˓NwE˶mk4osD&V՝m:K:Je'܊{۟7m;~MmEd.SyD<ϼHcxLU!]Ss9hѩ5?͊~ǘۻ>{:,e 6wF`޳_Vg [?`)yg*Xx/I}~NJzL[8 Q/ 0u,dNͻ9C:յN%S뺾c߮u3F-xD[}k@˿/Lj¯KCm ~ngIQTab,xO%gQDV iy\SR2bJJɫV͌!ҦeYHqdyt"HJDFM°X_9z*kE/Wiut3>[Z1+@qc[emFΞRLFdR䊩N2y^AnnG_SDD$u>_hU-!$p?/Hke2"ʿϢٿegHK2GCL\ҙׅZjɋGcUZc+\b9bU9u&Ғ!>9W:t>ve |ƾ/#b|1j]?H,eR4LH!wvfSNUMHS,,xuz\Ll\j2+':խL_>rh MkU0:x"mƝR,54j]rvmҿ*C}V&Mb!n/ypu/]k_[/W^ȧ_SKgvqb.]aaaVMdcZIZwE[w0C|W\ k^|b)t.RCD**$yE5.fԅMg !̮:uq=:|џGy.s4 ?Q{oWb>܏fGw\Wѐ-nXq 'b,zz#nbd4]eGFfmeҒӥUlIj">+5V|^kmqexÜ ibWiܺ}OC$݋o"bEڵ]bbc2T *&6vmMDm+^{rC(YƬv߾1SL_'̿cѼLXEûHՙu/uH 3g[c0:>3=QZ)K|UFA*z{%֩ãuܝ#?ZDbfCښ3DDC!QFıc?o+Z3v'v^J̗X׮[IM 11uR9F PΒI7+.ldt)cIR0.+l8%ֲoKx'q^-l$Ҷ]}sǁ>&*5?|[YLy8pĖ ċ~s+KFti)6f&6Ii./=MVxMJbԩK'%%' C$%f*j*YVbȉM'qY9DVV>I>˺q}F?:ӗӦ[>ĪEsC~]] V{yQj"bVɩD:a^|r}t뿚ye3Y QbJZP+y 5u= ̬mSRŔ!Ԅy*xL,^4vtiYy1*F;FPFEEQ*7[VxfEƦ/2J[[+fqYw$9b͝׶ajH4y׶̞-2W!iS(KOsbݔ ɪ rto϶ov{mfpeIUxV.k9 #oD'jI\ԮkV]0c\@-հKs b i[tt)g/l4..=MeRD\ƵGo==$Ul nH,̳6 D$&dDKlK'}aQVʔDXX"-ܷP(ׯW~=ɓc+184xڪ ҉=?fz|v > nT^{¤v QQn+f];}m7*rvzنkf-xIk7ɯW87:x~R|ԥG51!#NH;|m.=cHTj,mJޟţ#?+ZŘ;1y`m2^nذ3f:DD$k5nyGwplާM DܳX$~c [~VW [ wW Gɝ-hed6{ J+ "1R6375$ZVmذ0]QM[RȕD{3&-{ <[WK{uIٓNohNHq=|eG󭫇8Uyz"f~ަdQΞpwׯ}B%`hԢ]'2NMܟΣ|f+tDM=f^FeR?F1rE(Mtf7sxh46ſ,[69&)c$V©5s IDAT'`lEx7EEE`ŸRJ9fQuam|wWz-3v#YƎ0:̢g>ĊEyff v盚>Vo`ooB!755_.AJ%˲YHp#255շ ΒF02 THpB@B*c0//ڵHW}aYyfbQCըFD׮E֩[^@/^ҲbY!Ptշ o @=oo~ѭ͟/cpB@%ȝ5gP9Itmmq<֞mM`kbL%ܡDl FS!ׯwڗϯiZ|*1t[!z*r?scfme CIl*k93y""uV9V;2k"eT?GkՕYpc7~i=Yv$HIܕًojKd_5-e]=FEL}sbVVQbn}-+dOY>pfn6"Nq+2-/"[=4/,<+4}n":+Y6Lj'o:NR?Թ7.Reh09s~'rYzfEg.eƣiMU.hk5uQƒtiL2rs>7y|t)c]WV!Aeh=y$Egdb̩ؼH5=ț2e։njt3I:]zNKaE&zI\zW=iI#`qj.S8Ɩ`(i;SY,q3R:QXUy|ou<2kZ1~Va1#&zu^\H"|Fz_DyGfKP+sWxMLZJ_ʳ~ =?wʝ۪k{*7 q C>/?v  Tb22<׳ za^fQ  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*$8P!  THpB@B*c'8+b"[&/e͛6xJTt~,ۼYS[f-==o @B*$8P!  Tva,J*,  9+󱿒-UD~lPJu71Xs>f ^הN-?'y8^;#R3I&> o0ϢT~ 1܋7ut/BÛB]Eg n;r[oX[>R*Ŷbz{ƏL}|f+tD\ơ__r(3RA}V/Qbĸ Χݣuѳ#P2 O;˫U6m}5s}D[yD ._|֣eϥWW_z!w %87r97-L!0f|VMp""q;ϝ;{NoVsM^1 O!kjeK+2 ;eV-MKO*\|辛U]^YhN.LjƳO7rș6,'Iz0u}ZcEEX!"άԹC݇NRL&tiwkc؜>?>]:y:;Na='f}:C =3#Lǧ7GI|̃BD$2Mwnx^zq7#v$ev9G+gq1 W\o+WO-Q 0 ^Wc} 4~r+[)v=?{~ӫ{ρK"4)d)T٪?׾]砯(G"">e8ߠߊ&ԐG(ށcvk׹E.1X^]2`ԺͫM˫wm^]{O#>9#z{uby# >d.1qvоӀK版3G.Ov=A?.,v7p^]ү3z1Hp=ܽSq#_->QpgvᔭaGW?#'r؍fl(Rgc,YիW^]tgcHfP^xgΧг>-8S`rH`is%r.lǮgf0kBb`2$\R}f[ÎiɞGO.ڷg)u?;cw KdDeԉt1:vCV-&/Jp,_8pª.w:W_V;dbj >26GD9gǭ7i?0 kh{-c0~k,^0ޢǂ ZFA#[ۉIر7H0{MK*}qI:ufƐخmQ=l!Q\e,kѸNjd ;:%~^eRK"o/V6b2.ԿҽB,ר`D52.쏈f:7&VrY(7<9lt9P"G{nkS=NLuvDdʾ|x%%(Xb-/vq1v=e:pMC=>z^ܵЃnb)"V^؃{擶:jx8KLʼhrv9KbK 'c^.51#"Ƣn+j,fm<./țdOLsݐjO^:4G,z2""4Wna[Z="q\a,qe$%>:6! gg$+\xUZ}2J[9 +|Tr5n88xKҥ˂7nX0H\~==o8po轧F6qI7Xomav6 ,S%YK[XN]x-A;F75ׁ"3\Vbl5QI"bSʭ-\cgWB:""s335/ܕQX*=#bfOa)km\M-8xs믧5a,Y(4*ң'#"ʴ+;XO|F^%Vq\%WI&_Fv^Y)k 8'ژ3lu"C61DT5Vnc#IJHɞ4iֶ6_!#~^`ȯ+cj//7UMg>:ˊ)Pyuy{+8]㉭թK_=券щ&mճCFixuڝTVا l캠)Z ?-W;WÑ.\qՇY:"u:UeZ(/ry^/Oܺ5vώ>vx{kw^mOŲ{[sA_(9wZƀ_qn|qm qn6m#.kuҬ3H7c3yyެUO;b9Ҧ^\m@⒇MO͖jXÂ%]S9"m\U5c(.GFndߌ)F%c+lӣ8Q)uͨnm;X 41v}>3ۻ]gQY[kvn=k>gXO*3U|3kq:v|m7rt)'ٿk^:yˍ<_T <߸QƍW0.IrjnZV@񮉽}xQ|"×2t?w<ͷWI~ڜ@~< m̟Q/IQn7:v=+x8ÓtQLYn؆g}0vk%eXΟ|d!յ~0raêصC) NtmLZJ_ʳ~U:ܮ];jpĉF:::7@3G:-+$ګKNʞwz7gyW_RUk*EUx2>T+1-*|B%=0ۍfFjx~US\se?k Po4(Ĝ>AFC<_/Cȧ)^*7>ͩ]J+& [٬Dr][q:z nT[6<Ƭ7 D$oT豽߇Ô_Wϛ֥~dܪ31V|鵾S<@FK*eYH$bV$D";94D?&~ƽ??գǨߣt\bߡ}c;ϫl>_ۙ#}>c_pvGG߶[q1WPeցׯM9ND4`E̫[ǿ!oZ{uɀa?X[Nbhy.#)9ѱ !UݳyֶV#HDkmԹtÝS1(z ;k̄C NXFē=iӬmmX"X#~^`ȯ+cj//7pҠcime|l.5)DD$FiY DIɞ>`y;)0|NJJ.OIJTT"S[+s${ !'2|߶|R|.𑖮9E]Z(§,fQlfzk͑6u'l4 KyJd&=5[^a tBO=֛fmw29"./):uqn IDAT ܻֆx;C;bNk0j{\Nב.5ٶ#bkucr9".;Ftb陡X^ڪg+L;빞9RN8m_v*!,Wq˿ޭǴAQ~S V 6wF`޳_VgJnŹKM]r>59JgIԯ^Čov=K/|ޝ BLM嵼'Ldʧ}TK9RNĄj}\͒壺MWiYS֭RbE>y 9SkW~ucu9 [Dt~%pgK* 3M躷^P}|fe?oS%^]2pR[ @9wwKzы-zwI(Bb-w fQ@@/5#FE(EԐB*$8P!  THpB@B*$8P!  THpB@BUn'SՆ ())v+=Uj9:;&Q-_G o!P*I.8ګ{U''"q}߽{͚]ͽW:IX(&]s?{8"g ٳ1_MATߧ֭[Z*[r'\nEԋ(|uFE5ʟo_ů'x {Kmow{Q_A}~,Cމ9}~qw|i!~Ǻyͺz2YW9qMeh.}9~æ믎OgR8xƨ jPR```7{ЍܽuC?ߗQ>B} 3OIEF}dXGZ(Elj"‚zḀ|D27ϻZ".[zIwjޢ{K}|o0*+(cЄ,Nrc;պwq}Hg_Clص7ǿ{cѵW Îxv蜢u?Wۑi(qr//_.?5"9/ٻ(ߙ]]r QAPk`ww\ب؁"JX" K1WEr&vwgΞ9;QMhKQ խD\ ])}<}VԐ}mvPyn.N]q֊'B1*OӮ ^VV&yTTJyS6w혨i r3Ćmx/z!tvܿNjqS_cT:V/hP=򗫫k_?Ai|qvT8P˛IP'5`\ kHI[}Ϊ4%+ dhK*82hJ\ּWFQA)@ӱӓ&i`gTY"lj:23Däft /3, (?i(SY(LV>! #MPdi"5͚q-N2̈́|T}#mm,{/t.]W?ñ .zpڰ41p7u$E.U]Ȇ9ai]*QAL#0c:6gtb{uc"x/T~?:PIY(@HtJTTu`=#ԛ{=CI~ӳAc+8NT:4urMLP dU`ʪ J K\N`8c2M8K ;v<,!`…$I'*j65& uSGSPPhFDCEW/qeYumK`h-ddEy%j85-B9g/,؝?A)kէ _^dj+MGP啇l ]nxM@6 ?CLmoyU˖i_YЭ]wva }#:Qʹ_?:QCU-`4~A&Wnu ybLy9#.r-]2i';+`9E9Sh1'pIUU$UWΦ>.q{X3TzT34V><訂ʶN'x@s#G"Ϫ5іAPXرLCvF>>o#ֵ#%w $5)!_SyKF9Kɯ{98%A):9EʯK[72zTډףve~T[\W6З]+:yZ?7< 8e $FSPbj YGM u q f]L{1g/gԓ||5UBxzz3FtZ !.yx3;T>G6k˽G^aHs-:KKMkK7m弖h8ixٔ*(^ԭC5fW?.;K:QL8l~ŝ߅dmTK~꾑ZfWC ],rU<޽gF+ZEcCS|]kOw=4`^ikZQwQi&a?$?YR6 ҹN*VhwJHL-m[Gr`8a!.jÎ"NhkO ^V۶~;3q쫱w@N9OuVͯ Ѓ^V˖PkϞ[~p{;9)+*@qQIYEYl}.wI R~efl76 Oث$NfѥI2dՐx= Wu?g[ZZ޿SZV(+++Ϙ>`HII.q YYH`brM17dɕϞM;w}s8EI׎cv-Qpgn}\G=lhȼu}܆Y";lu{1n4@w~SD ]gmҐљL[>a2l(-I0]g^Iq 8 qB-Z6 \JZMŏ1j&o$WW# )Q# 8XDYs m Qrsݲ "bb _2A}50NLL͠55=e0vF[M؍Ew9/4WxHw:$*Ux:nyz\ڍ7J ^XzL䕍ݓ6,Y~x>~ U-Tޮ=qy:rdp^^uU]PubFWg>}<Ρ1WtV>њPI*)Ӌ /GJKOfj4-=8?uH[[fv]o$Y0"i}511\֖xu5mԥ/"t,dIؙ+U7e0i>~b~#Ti4>`2vo7'[}3E\Bµ$*N(x "Аda?; ''hh*+*1% $+'O)a3fl[!ŽKo(p!]R'-G7.#| Sd5U5rvჅna D#n^O`& <ڵT:w}a&us/%Nm;bFyȺ3]7WjeG"E쫂.@4]P25iiN~NÑdWTrH`g={VR'5Y.Dwf(м)7GOi淳Ooj=T>1/njSqY^&ʖu0t*%yUIƊxcEˤ\Y;=Wr=Rzj1 9) nvfLхAP,)V&lkRG+Qs,wa=ohm,OD"..p`9vZ5~\tK4'fc^6O>f$u#vd@浃q^K>s M-?-%a?$?YR6 ҹ@r SULW Oa)Қ]4@PXL^A5RBSB u+A~r0*)ISYHἚF &?H~##W\&۵Bh1ڊhd~S*%&XUVy ܆F4 Vbфa68*;u5[8UBN@ \.+7uRBQi.YBJ 3sXl}jp.=s⟿%1*o]iOx$n)ߋBt10;~rcFVF"4EsEB~m-GVUadXUZRD>__i"n~r/ jX ?]7D? =pcB'xJj*t35E ?KJpd2 #: AF# A QGpÙTKpV__/Zi_w~ IDATWC͵iienemu'g1j6s][Eq[gaL>zozM\[ [8"/Ji،lvHV1XUv=9*8y{z>hxͥMB^U7wrq Q,oդb6Iw7IB#[/:w_WcӔ{x-\9նܓUOwsxcG)]2SywcIcn~j陷0oT>=mb>Cvc`dE^-><QΓoDm~EfRB:~w|m]JbԈ{wgR6߻:JEB#J3>_ 9ai]*QAL#0+r#s7 i7P7OBwZo1rΩBCCD $:x@gЉ72% 1:6p8T:y+`tǗFm{i_TӹONlʊJLITQdUTRV|;%l̙r[7c{{^_w#zudb/~z6|lz%lj|Uĕn>.sCk޼?QYV٘~|FI} - +{Okp!kn\IUVYOu{$[ зg&(h|cd=@ ;vS)~:@`~οΣ]NsX|G].gfuAabcH| t!Ao$F9>.A= +Rp Jq\zrk9pbh`:@+Y8 tܱk+nyEW/qeYumpᬌNNvaaђ]7:CV)/'sŃ#ۼVY{zdYkv?\dK |#QZTFST0yӡ vY`kO _ (rr^Q D|_ג3 '&z; }\>U"#):zZerH9Yy:Lč<R*ޝ)eEsH>EN,Kj)`\. &/JWKI~֞}=qsؓ@UUjJ4 އGRy$Z2L)}H@{ój S r6V~  OIf Mt춠oޔ q%*b|.aJWK/Ib8 MEo3JO zvt_q,:3x]fc?쪼Y>bb*{̥z~u>. ٕp5wä3I,QɻT h.S?pH^ٓ!oLj((K ]]'VmMݜ{s8Nw"O% hcuK>'8؏ }1(f 矛RHq[Ugu/<{[+7G;qD7>(-TzvB](@V^3|^{~UԿv?d `Xf5fz(hcm%Z ;><$@qm]<{oan.ZL  r3t^R+ mtq:P JpA %8 HGAB QGP#tT(A:* JpA %8 HGA:<"'xU=$6Q|)<ٹϊÍ' J8mwh|a}ڊĀ99{ؠKno$[vEwNUyvirC|"(>?6{#eӷG{=#d[(bk֖hzg tM5'?W_ގ:Tm+HsI;OyNn%?lk~#gDaJ# @==dl>}x ,7- Mvl;Džk3>K[]'s{1v0j7 )!f_;Tx/C^jxweMB^1E(rf ť%87Rc|@WVP( 1VE4Ve?:y%QBB\*m¡ǧ2W @E7va s3hk z;g0L~}pϏ&+iG;>rmuEG.< a=rc7 ߭\Pw_KSm[7CZWV{ntѱ;Ւ]/{wn_Loߋ"Ѡ([tӔ{a5#W(gP/aG^94HLe9~DkND>T98:n18xxs~vk#ȯoJ(]o$YiJL&:ʤAg*iq+&Þ( ߼zam?cGq}^LnA /|u3`_緺*4ogir։wZ:8J%@Z o|+0k粡G<<-.%@ ^\UG/? ) e¶}q` H^5,ENQN~$>N.VID/:EY|蘇ƮpPt?>X]kkѿD'"sp3 =)L;1/?)< A!D@EsH>EN,Kj)`\. &/JWKZ>^ZD[ Ay|Ra_&#'Ӑ$q~_|&%mNb5*tNǠ *"- G zΨF׏۱BbqP6Ň&>zU7W/L)@+ *9$PԵTG$CT[]]&.x^R^u#ڬ;N'w;Ƃ68•ٹk_ аm6Ngm'"Mu\S ;a.SVפ91[֏+-EWyZkOqnoa^ikZQwQiUZ]''=$Wd1AY'Ln92wkܺw=u8SaͯL:j>NT6k@%,fx9&]&l^Pcz@\nyt4fSɥH(t}/XZ;%$&X["O6 P}~۱yhwj3 HG$I:]K~?ԋ 6JE  QGP#tT(A:* JpA %8 HGABAGu~_&(Zʢ~_%oһN1D oPUU-aP#tT(A:* JpA,ZGVII+VZj/h4! 7IJJ?U+V}68 ȿƷ0zZQ#WS+ZIZƷ qȟbgo?ҐvV_is*u5اžQw+iUHksLkMȚ'5x*[8cqaג^_C|g@@[6ȟưEB!@>ʐ}T /T4)R&L%(7-P`Qr;(h]h$5|f9J^H0mf@ CtB{xPy6;(lyZ)_&.8*!Ȕ p3 A)On۔Nh&`,^xŸ8bU}Dk+RAxϞ;;9vL"?W>x-yhwj Hg_v_At_j ̬B|JpAdGP#tT(A:*(RR%b)6+(FFoߦedN}III0(QpD^A %8 HGAB QGP#tT(A:*4wϞNj!U?ȿk B( JpA %8 HGAB QGP#tT(A:* UGNp/'USG;#*I!_(Bl[tAU{9Х5ue_'4>TAUlv^NZ#+>ݧzP~]_β"8IZ1ddɠi:Q8RBc&~Jpq̉<H gZ;xP\t Vgg)ȵ~zPob~5aDXU}T3%Otn)*z/vMd`2ik^˒>s pE$Y0(4grcIsTH)<7$Oӗ[ 11s Qu+uS0B@8P|Jm@k^^ mG>b꬛gm9=e2K*YU4du⥳eF}Qk@SZIbLlF'}z|yW3 E<~JO}FT 2lV<.\Էsc"/WnAFn#Мݕ.]t.#Fs>A_ÏkK>pnPf |4)%|Ѩ| AG ̩0Opmg6ȱ_6&@HRFn]) q4>ԥRO rtc3aο,`MZD>f6/uةSUc0aR8 o޾ͻ_2#LD<Cej-}O#>VĆߩTWCUC *K /^ -R=:bC{YI;Rr}Ϩ #c/-ZcҝI^ ZaDue<>*k`HYڳiyUqXj&].OPQizWuxs>zރ[,h^f[[AfԪ>1t? $G}?bgJ]A܃ s))~7"9g-zwȎۅjCn?|yGqGd]C'c?~tafwǵۇNO9~ɓKm{l]}BG{ս"!*љzfLͥV_?pu s-URPun^;ikQoI ˗.P. bDNdwmZ2nC/FV!YFx&ːJcdC]9$XU "Ne 1I}=UqYb=0e_\:M p.z ^%b;ɢI';>[—pX" ꆥ8 d$ߦ zm "U|j1 @{>U;v.t8a߃;o^W4{Ț Qo3qB ^*8?(.,ચjbND5 Op2,g+mbBԼ ܌y< ;3W3 Uu^MXz3e9E]KB*(e7 ge;F=4<)c7Z)x1ni`(y%//_tԞPϓu1vǟr|%Zi6f_]"8WmitwFusR 5+zT5A1Ck7ӈ+o5id]B$<8|2 rb$M]ܦM)N"Mb/ p&Ir`u`7d'ӛڤt0 IpV\RBf&_yWa4q%@r¿/vG3N_}fmqWr~>KbR4@s;@"|&dE䪱J{B$P6M)=eeTMfٟ-Sib<.WEw{q>$ΤSeM_&ty:O'.M~؞À> \ v㼻|8˚={c-;v~[irTjujԮ W42f,-T6iqm\EK]+YCӦP Yqq!FGkwҠ`Wִ}x*jJ/'=zЀ(/TVߕ0+ @UjJ_E{97>mr IN&%+Uխ)A$Nh.?P/v[qԍ=jy^/>Ox< X,rzRtH>nt=t[Z' [Yf*6 pyEQ .N*cmϸ]QQG'ߜ]<K)M׸k4v|{a(cI?X&8/3 .I /97;#{^qfRk $Uڝ>?dFTty\ɒO.PqXԩ'2=6kk}<$)s\'T#^Zi*{=b@1ڻY-d"Ph' -gh߸uVҜԬ7VzԺG#iZg=)HOO+'>fjuyI+=:ȪG=vUaBxv'\wq3p2f F] -ZřD W2춉PY&KN5UkG;cMAfu;e7]YJ}ӈ{54cg;UA깵SԼ;oބZFIgv%F3)ԥ4Hx;&bQJ $/+h`sfeRQtOW9PAg bRn{<,C6EVa&3O8'irN\w̽'bsUơ>3} c 2zO[}WÕ x.(%.[ r4bZ={>F@Wַ[x*Ŕjqh=mbcbKG qeO?@`*H4IP( $8I'ڬa/2sŭܿ5Do&ϣRMmh*Hkk|DOb==\3{x <,r{f@6dsD+^CPMK,SYXdS{4ͽ4'ԀqzV*.)*JK ;83pcq8|?g|3Y\ zT(='`J/~;1=l BU0 \wsrrfOSwܹZ|գH$bϙ^5ZzImmIs]]]U=80 0c&XjA}+$8<~Cp,c TZR"$8_`v>\7O{7-߽ j鈦GHlYz1 eԾWh=c)W?[㸸|8EQ͚HәYZ7W{"+5)ѧ]/]FҢ'Pȣc,,-n؜0)11lx/{+ N=<,մ'(>.h+gz n8s,c*[&C.MM]w)͔@ fLu65&"o"Td,8>xZ'KiBQynoہD&[zP؉#>W\OTi M./^7 !g_Bk#kYp`RnW~b%'>{\{x6v1} /ԭ:qײsw~䪍GTk7΍.]h7^vh9?&,Wu/-kνp/[^ں𓋃wݻ7,Zj?*J$MKM Z5UUSxʮhJpom<]Q'W>nB{8%ЛZ  D~!#wjzJ}lb0j }91wӭ% x&tD慰(++ ¼eodH~'nzّ֯ճ wOJLlDTFъg~Qk>iSzA:p<$pww+T?BOZj⸸_K/uw+I~auboҁaC;o_ )iF8$F0 Xvᄁ諙T gm-X0rJu{~KUJ+huzoYS&4t@@EFFXbuN &Vx=Z(i([iĮv]c/D,JJ!btclߵEz㛖q\|jJrtD B!5dzؾv])B혗}^244ewM բj,J^ؔ[RMB?(Ztۘ 0p3 ao^*)kx:``< v{'lYes?Q4 bdoku[}^X@秶xIK,y?rδ@PXXm6o/%s9~c]( c[Zkk:Ud=hxڪw^2l(5׭۰erbw>]-՗i:_3l[: `$/ֲ')[ܼHWZ5ZzHp㩮a_;v SFkqWO WI&_! WHpB|+$8_XRzIENDB`kraft-1.2.2/manual/images/nl/catalog_standard_work.png000066400000000000000000002631741467704360200230460ustar00rootroot00000000000000PNG  IHDRdm>ig pHYs+ IDATx^wx̦w JU:4{{ןX@_TkUVVHG;?6lIvyssaϛM!B!B!B!B!B!B!B!B!B!B! "dBM,= C9B!$yI&9B!O$ِ9B!uwKFnW!؛m}9Ai)>'!MSLs}-AhXB!J/$ 8B!ľ:NTIFwB!΢K} U}Q&y^7p H#-RH?T>FES[|곯.ԱB:BPIE8 oBQoD5Ż>ϣ>Bc BPIRBOPgM!)s~@cj !{`K}cuh줡.ǯ>@!p[]DzNPcN9l xBI@NmN1'NB{

    Uz[`?l xzPUj/PʩMu[\!&dCup6_6n=Pگ΢3~8}v@uMϭփ ?m!{$ nsKʺ@Ճ 8};C-yr }*>ne'nnq[@곯BS$ ؾnnq[VVq+8w9 7,\C;~Po$H۾N91VŅBHpK,xMbNe}vi_z _X:v]9%IzYeǝ:cT>첺6v^w>B!>BI-s O}uN}SM% z(cjsKv~8Jm 6>w{ ! ,9ŝb8Tz?ulNSM(Bh,衎Y~N wٜez(겏B}W]}FɒSL[םzJ?&B=1C9%4zݦNݎ ˪H1BDN$y1w*mm U9P'dXC.}%:6uW}16^}z8곯B>ɀ[v}kSq>Nq}cNu'H/ܡnPji_v(N1}kRcz_[[ !wJ 8Zw:ŜƲz\DOHb^BO>$G:6v}MoUNcez]Ej! +آ>Nimғ }? e81&ns1v?}k{PObn]w(֭n!DLc 4v^V݄궏BK">nո]g(w>v]ߺ6xz̩o{" /P)QquuJ٦'YHSmc鸶Pbz=p !; :9%C6ͧ6W6{JY $P@mah@mP;z\O~Lmv\9mZַz٦ǂuڅB݂%z{:8'*VNm2]Oqj TV6[I@malp%v2T'\N@u},pOl8n17 !Js2Sj?=Yj?5bGz\պqv7m*R wq%!NIZWzYmj\?>hmjSU !P;9pqfoݒ&wG>j\ԦnmNq.Po*ڿeYפm?=YѓaǠ/zb&av<]4;e=SzI(} p.B!/=PP ^ٿ5i~C'S@;fU1CcfY|~VD?*^\qܒ o(1dLOdLnwzRɞڦsk !h%u=nS2CNPN1lS^vYEDO|6='Sz,D̩)fcq}s !{pK% 6=QP}JRW+}ˎG묝tJ?Sfn~pzQu4SL(UtQY%$LHH솛Nh~|L2b+b/}^=&ݾ FOUVgaA7S_z=;ʨNDNj"eվzܮ>f NNO]9鉓^vyz#!!=;}" ?mӺ,hUB!Ç:0#W&+?G)5)a'v=IY^99dɓ֦&UNeaCILysKJܰvQ`WƅB=9!1ySA/{EE}ʭ]S5|TW'MmN}ԇJoZgDŽB}FƵ~5m0}-Ը^7h$dN/Z,;M]ֿ'3+6OLkǔ1B}Yq]_4k} w*sA11>eY'NUmoNWcjL0bҒ1K$cW`J%>!QM!`Xe7/v_Jcj]/]݆PݮɕΎ)QScMJĥ`0 { 7B@2!jUʖf/z6*X{T3n Sܞ@mj~-vnj?;*(OD OB5Nb /FF>6BQWeSpxBs{<*"},')5'Sxn8Kz2v,^/%lQE$6Q^b:TBrk/T0B!DzWPwu;3wn"'?v]1MpkO9z-^ Ӡx-:g2 +I1?tLeE !MFwd1}VNS~zu\u?5vڐI k'TætmvdV>^vχYWɎX +TbR0]INSזR=eyVPͭj>;; =Sh, ă4M2[ ϒ;\q uZT_6yxˣrPz_|{Z9r8Oz5ҩu.ҶMk9}׏f6d IIs`^اX;q➱Iכ\޽j&bZWzYrE]Cc8=UNnzkѬ{)&Y (YOJ?hF_Nnk鲚6dt-#v>RZ_5ًL}v̍ަmnjA^>jj9e-PcBI/$Xho-01I]2o.!}='yiv{Vd ཏ˻O,>oD~A!}zvh~?c!y\,%8ȃcdegKW'O;))6spWeYvʉ~ $$&0Xşo救U^D=a۔s筣ܱW_~ ^xª}[fe˯9ԓINJb_n䥴kӚmw2aK[s1G '9%EE;,X˂CIVfs||>}>sNKM狯ў W_NxR< f|=|㿏tK.SSZW|LJ|U,{n}gz2)ɬs My<w=/mZǫo%˰W'Oq戓dǮL~߬ϚOxգ; l޲_b=p]TSߪ^<3FLljY<0^&.Z@YOc1 d=VT5tBR'PzYe}G6;)3qKfUPoUM6x+G+GG04M})~b|ʟ׈˖s`^`W1s/~b<1TO|>x499\|rUnZrXyL~y*yMw<;e~_~z p͕\uYCa׮p]!"*==1>5Zf}8%6lDN<{.3̣.:o ߝʘ{AvNnd_]zYF3ϳbUJBqc:n,bђecނ4yϲxS}M-A-1=9S2x$8!jDĨ&\*ۉzwPʵTz(+2u-9%~ɉ(+$cѵh2a :d,XĦ-[˧o߹a5|>|>WXszS ᧙sX~|Ol޲Vق>z{ݼ6tII590 锖}N֬]Ϝ_~emTTT0g|ڶi]WcEnUuwæͬ[˚ɥef1M3+W?oIgaY]\\’+(//UUV_vOR^Qal:㐃~w6>>c:Ɯ)++av#;wycS_}CNeRy׮mUn%Xx[JW\M^~ŴnϿ]kt͕7alݶR}lظ ֓GˬLԻK;Z'N]⎛o5qcXX|>!Pfvb V:X2&&оz>jw|'t` 0 L OcUX>fxuaYeQ^^iJ2/]U,K~e!зO/n@;$-eveYd86nf{wqUlIZZj߷R@TTT_PGKLL CurPxT3~;p,h$' aɲXV9..SOK.dڧ_0GiVw;`>}-Z`YкU Ƃ$;'zmdee2m۱f5PSlZ~myU}HV~c]UwMU͛ep9gVts<:Pws9!|?ǰrڪ6À6+Ær1GeAFzZ Yzw uG.zuƸof,ۦ']GewJB9 6]~3洟u-ԄLQѤKh}TWC)Z:|(ňbUI)%63Oo'`=zP;&<>o+VϺ 9ԓٺmGy.k`WN.sLtnJt0.Wrm.!t͕} 9bԩom\wǓ6?Μ]46mOl c<4zd{w1o,9-71NvN.7nFZs[n}HJJ,V-8OdX IDAT lqG]6{̜Sm#xhӪ%g8P9J㸣 ХSGA5HϿQZVF||},XT5>ҧgwm3t=`> \jwV+ڶ&>>U5{Yyo ǙsZ䋯\羱YϽsO=駜~},ZU7ڑylٺMD!wz^-{ʭZv]H"B}֮N6PYgjΦfP͸{Λن)*LIjUy-M_34,wD3 oNꉍekc9;L>O&2κJ**òj |ίa51/9,-LB0xǍB>,S>Mݪmz @[[=CQ&cz=PZjԇ:ND)m ;Ѱ,:>&U-"0دmK(//[z~edнTS20HKK%55YN@@m*Y@ͩݠf5fꉣn?,R^LFr%ڗӤ0yEUVa׮O]ZϿ7^ˡay!IB}_?tl31wl~n̈́LNZ'V/O/ۓoǨ6R]y<̒Lկ#MG`õm=6aҿ?S5bh9v2&NNq~Qא {uz\llv鮚E\\l&'߇'B>B!RhN6I;n,ԄG'_}'ө mDđJW>^B!]/}v?Nune7q$$$Pz2Nn(<$cB!D(n7nv̩ GEC'dNpu2u~N!q9mo5>CSU}2)Γ'gjƄBhޫM9ŝb:9- I8OH4zi>lXxB!h+;mBQKDKlT jfꟸP&ۯPB!DCKoMV{ެܪ_qߪۚLԉsDukS K;x"aBum3=IvlN4=娊G6u"V/u{z̡.Bƥj]W>n[$X{E3!/On*B^Ze}}TN&12u2ʪ@q}fP~!B4>_uMuU(qrvBhrq:V=S\YB!6_7v?{W6 uvB OU64B!6eS?ަounP Bj]1>B!9zL_PQP =V}v55?B!D2[ǝJCLc&dr`tԲu !k]oTj?SIij >aIcv9C!O_6Vzj1 }]v:AB!hڮoá95NByN}^;1ÎG !n>tZV/^.>!k >}kB!D Fkz6]o+! uBOS>NB!5[[.P*~X IppvB!DrZN1*XFBOd NBuI=inc!q8zTVqǜ)"5'3P<*B:f= ߫E3! un~uz !Z-КTc6.~afBp^` mNB!DpZ5\_} oD;! gR(MoB!DӠjMO#"b@# b r룖zXEl VT" Ogў |MRݻO(|bz 9S0g3K) *4@m*X=wee5W3 "ly~ܝe)yzMREy99dZ>J_Zo$P&A?T] wksupEE^A$chO$cda!|=$}NksZ=ۜӷ^Y$_Xzܞ|xǔ3:/ 8H> qzX&MK6@kx]4]N ߩsL4Q&$[뺾k5h2 e}L6;'T !qnk-ۚ)! ӉjB!DhԶWj̄>neB!hh.~%ј /> 'PB!N59zqS")$d B!_vwBC?~ME)y[V 6{ū7j{yDU,sG=ž=zl.}qr6Hnh'^Y7_^sSb{s\7s)܅NM}EJ8jeOoΛʑp2ՔXh;/-<^Y_?L͑:d(eaGq7ɯ_rMMp|^o1xzv#Wn:?߻_Ga-M憻珲*X%;\~@ felFx؈ 陫rYqȑy$]g<~X^7Hv4{O@8b_:h Y&'c5/k>»;qxa<8يx <ͻsHVąǹB|C⫙?3ۏrCw8 ?)?n< QǿfмQ ?epi!6Vnh B:BmMrûe6ӦF^=h8Z,YP#%rZN )淯grBӼ;z"b"Gj[kIȍE'AL$4hٱ7YaXf,v~N&YsF<36}zҺ0< ڽYVsilb?a1LLӀ?0N؆82zɠU,XUq??}7 k}QyQ6cZ:#?ϼ bcVFc޿=;'DXbûx*/r3kmKr c\wg2N1W}O SvX;[cG\ĉ=HIJ}GxRvI"j|aoC'zqd>z;w^I%wѤb/fdGA)dYӓREp3fi& 𑩌SB^A4cߊ3bhOcby'Q(N%{T3_rJNj|Z{fךn(s0gE䭇?y8g_p:ZŪCy-(bɫcYn_2*RZyb =y5X>vg6`=?μm8bL~k{ggWme_8|{HUkLp{_Y< noMt w!U_N9{8s]9PRc{ov+tH{2"|OBr}$uLn&C~N.>ZT&]^rs IMO a]KF~',l/ ۱F m/ \q\koU]9ٕצa؟ϻgdd^|9:ўjTR3v\=Fy vja$ޜį_Ctߛ _dM-=kќ}6eVf_>a=X;Vln,CBfI ˂ԌT25J-iFHPGȿ\jOG)~Ve/qx8?>oQQN5l)ђB#"jC >>>O>G!bEQ~fVGڧb%e *?w3M213r/`L (,(Jebl.vHɠyFιX*ǫvڝYk˥kbRf h_3̲2*SI|/eay!I,+VW`V.o-ПJAxznð>S@?',:'Dj XAFUss_Zǫ|Aߗo{}N͘^rZ9vBBz NǨ)/I Aq8z-%&1C? 8~?5(s9wq^9. 8m8L)w1-Bk_>O'!U#Jxh1+ɒ]>bh$?qv'\Y?=õ##{yoa$T213aesK15vqʱ=X ̥gx3ck 熇G?L<3i8}j{')KR1ͭ)5"D5|/Zrs4uRՇ}t(?mRQbzLC-1@̸ǟx! VZU>-30Lݳ嶟zX>_冁aY_|>ʘǨlXV? ^k,,,_s={p0 `ZF+Y||_4ʋV[eaQ<kP;GΏeSϽ|,C=>Y> ]חQ5/:0,OͶkk"~u]y^צrZmկO=nGsrXK[7VPs~^WΙj 4ѣ/q**^\eݧԽ R^nU۶zryԺf 5VþzlV+,,];r 1PcUἯx!`{*ܣ0QSiV}Za`z\:='; pn4LOj?eYyhg꺨V! pMՠ'n8SAccמ?8͏S p?ZcBQ! ^ûsl0sUIw4!b! ^a&B!J5jD B}þg/B!* !B42IȄB!$dB!L2!BF&eEiPT[yLy!v7h.ZD=?ARRmZ&==]o$ Yf!",2w5`AzH7kQn6o IYIBea| mr- !•~ڱnFIȢH>SQ!B8HJN8_wsB!h $!B!hd !B42IȄB!$dB!L2!BF& B!D#L!IB&B$!B!hd !B42IȄB!$dB!L2!BF& 0/kcK7 !AMgóK00=4ۯ;GhZ,^_d1+w1aOB!Y5QϠu?3뻏ylz*"B^͔7՛B}!k CLL 1F:ѝ?-EH,.Yc9y$ }WY,<ɳ̆>ebR`-vd-HAL{AƝڙ7, yԟyㇿȵZhQ <ޖGՌgWYάGroղmŶzP8qL=+9s^"Gԛ!6g>iQЎAƘ $,s+eܹ=Hm7B}o[2LLJY<{oƽ361is-bij_oL .!3>r:Ҟ_>jݐ|| K[͗/^BW϶Qkc&p޽/1|28 {|%yiWN㯿f? f˸q͇F>:^t:pk9Ǥ|B!IȚ ~{"G04V]o8._f<1< N;eg;#ORg =8xv˷%ߧ?1GsI!I\vR +u!Pf.{\^͈#88}+01M4x8$v*]ȄNf+-bp1x2B@&LjpyK9iylY};ٶ+͓0fdh0 ;Ua`W"hﯱs.HK=/rs9o3[*wϻRa`T=ZOChAFpnt5Lnn\-=h&d"z+IL{} 1 %Ydo*b.\P iۚjDEٮu4TAAx2AAL I½g=) ¿!2AC  AA^3  f" AAxD@& 𚉀LA5  k&2AALd  ȄWpj2MN4YfwjŸqmg^9Wgڴ}T 90S$*Wu]ĪZbmiK#b ||AxGiX߯ƣiWB nE5"MhTM_%A?"=8CJI\N 3j|j^ES1w&<]k{wd0ˀGɖ|勿 ۵>AQ_BS% ZspZ]?&нR{/]DYr@YU!JX[HF2/gߌ~tjˎ$]A% Lt:vN^*ՈS"nè9-TƮbM`Iך^}%KAX~yj9tkJZ5EG 5 k8z6KZmߟ{o46~I1[cZWt/]ĸMY#m1äLYfiCq$\sWWӷYZ_ 5]nUue4[^k [h<}&_tiI:ԨݚO!"^RAiCZ5_'>8WaӮ_;d)MM:Ԙlj*Azs)Ϫ#ڴ.իӤv5ZJ$%(c{IT KޓsS/+$X`-ٔ5jQmlKICj~B nԅOe[miNCf4h6_n%h쵒;VƲݧcLlѐOW_ycrA7YZ8uZ< dܙ" i#[@ 4M9; p~n/]l\YldH-'떭lC:M#d!WuFd8f$| ~]+6_9e_,f"g `-6 p'1Iۺb`dS4a/2_6nA<^9_Yror>_7obW89n.R )ڧSgI)юU*З뷲u'82Y{hng _a+EOߚXzk #Fزm0X"262^bЉ)?o֭h:úͬ~ XؿORΥ\o,j4v;//AlLw(:<\Ix96oO)m%Mod2'v0rynC _9jN)Ke>l71[bWM y`8W *iy. ɡ|B!7\OK4^Ͼiѩ,~ ^hӼU>:h9[mN1KUU}3, P Ұ]U;9F|DߺEaUgͱRU|Ft '| hS×ԦFqZu*w :L<.]l<_]*Qc4o< YE9f6=42AF1'pEq`TsgɎ'1FҼɻbѮtidp*q9<_kf#È0/މ:1]΄O&@QPUTMU]̅j$DFeI:}3!YZ#Èt$5>a'ڱ-Ë9 IN\Ax Eea(ytWɔɏWЯIm/Aʣ{!a*n<KI/u6eĄԺd%<\!"HLqʓOHMewOb/iu\'j鍧s>_9 7IQ!q6|Ax76p$d0jl̨&p"7zD+F,ZΩ0"EµT/.eQ=~? EQ*7 :I a9 T#DA-a1qj Kd"{Ɇ S^Mܕ{U XDq_ ׈f@l[=ڹK'lNI'fasQ8;v D'xx~#.c߹Z! zH}|jD'[KfsdU(x7|@7VsȒ(yPW!J5 kR/I~Zp;(qj;<rc4&xߍbcA!˰ ي 3%W|s|@6 wW 3{n=1LmcfPz5t] ' obi<F,j81seG4s)J/)"|0Ӵf4Ӱu޿g[&t617K3&E {KL<6eⶫD8'}'#JZsN|{. &i>)֟jbYdtꂦZ"IzÑ4+PDtlT -Y{[ͼ]LOشmRۇdA] 2͖pfm %}Zs䌄s/Zř[0J}Q D@&Jv'J}8?]c#į,AA^3  f" AAxD@& 𚉀LA5  k&2AAL܇,s6wGU-AR̙ɞ5mV r%BHH7qCe,s6P ~m xP!s혺]cwI7(xqqq`oooNx]* \\Vo#ePwݧ@d#ؐ$? ю{[Յ,Rf.^n@ 888f ɓ I[fP1A2g:û3&3:  f" AAxD@& 𚉀LA5  k&2AALd ڵk\vv D@.1cf&;C i7 ڷs?hÄqF!4l 5%mV: &Ӽ$ӿ ӹXf#4$8.-'ƶkXE߰5hV;f4G\zgA;Gl%Jv9=5Lh㋾Mb9z>e[ٕ1 C!{$I½d z{Y)k)V 4ը8,;ZaB7\5Nbھ]< E1n"G$'?aߏ39[lAq-G׈oА9@yvM2(%%ٿz$ zC[o?/RW`0`4>i83Js.K8 6y6? Ddo$ȘRvU Ƶȅ|,!e(~%+=9Iz=gX3W2_2ɕ'˧Rùu[OEq 2Jm# :c뭤_[9(W3wMk[4J$*+&SiQM|ggAH ~ %CѮ)c컏1§#BtnNڵi}4kyae.4Wͺ2t#{{{d$d)mC6cV?iDmA }&GPHZ¾Ո,ԅ\zOa#wu3z7'$ 'ޠ ۰3&$+Ym2Cj3;|Olԋ7 $S51 ⣕1hQɷ[9kթA1+w뮟aA4i5kn/ȏi۬uBjӸ6\C[+,~Ǫ IDAT?O[S,ƞefc  ݺ>!u캩G;˲Xy9S:Ҭ06AIVt8x|_= zt}Vm7 F"O`x v ^r0[!}{9;}ZTB^?r1x2?jN[6?Aڐ!,Y#όќuѰW#  #kdڹxn:-!yuSYb;< ytŁė 8C\/Q/ Z;VR=Sd@}L"1l. Ϣ>#F+]WN|:2 μ%,&ġ\ZFK/粮Ff/k7J W0e0͢o&rh~\ؿX: -IG}z%òi;hl~}GW0iu3A1t`r:wB>vIp^LvӓISch50ZϔՍt*9lw],{@ ˙^ԟ/GLi;j(q]qONjتӭ8 s*Pp7ҘOǯb8WLdmPЃ0Ꮃ*H<:k8e3s/Ԉ_NF|zS='Ee /]vcFc09rMds7,+ Q C&k qB83 98ɁҍRΓbZP6_4`e dvᘭ&M*{K*aGWtnк/ #+;x:Ѳ˃"^;%h٩,~:=ߧM @}P&+8U S%>4B>n8e YQP\)>]P}XO̧fDOzP5n.$H]hV{;oZq$+HW+q{QJUj9 ϩ&#I !Ux@ԡڈnAp)8ėm]\VLl0cGTܕ \w&g.?%KfnSe㿧*F1ifbY2Q]K:8n'z)iD~Vn\T)>'s,:NdK!9 ?]:W%CNNp}J@x`ϲz*T)!>}l "į: ^^ȑ2u2e KWT_Mq$_Kn"e$Y#)c#cu};^v? `P0_P@MkEd/L% zm`6dY𵇇bUIN{2B&OG.yzYTeY?hw&8|Pr>ll;^.}9pbY#N9cK-в,S%1 {^J&nWWBO/O7fiuҽG`x݁3)GF,dPd*KӇ bGe+DL(D\MVs&jgW^_&ubC܍E?)pe? ^ӈջoc4@%9Gd;r$[ JT=iE~QITJFpm`Ǯ&HT]kMFW5Q$-+WOqF_v!][<-$V"SzŻoa|Z9wPe"ԨKr2Lj_1!z'`(T'?Љ]L_Ԯ W2T1Y/IˮE5u&hн1|Lun8%Zur}aZ$<*~2c̻E> '/zgE 1Qُ̘&=BuB@o272gK߅2=R2^E:1vj< 5ko۵!379=(xîE{Rp+ݝA|mp $d: ô_|B8q8[>}$s.љ>&o<<)P9gbZo~!P)U8[NPƇW81hǝspX $eQ$VxK=;-ri-,~n}X]r*%@+[uViC:%_>b@N8yeJrGd@ Vx6_{ .~N[24^_e[yx9yZNΧiXjtUU󲓧NQLib)޽ʕ+[W\A4|T*ɴ؈IHyXS1jJcoSz54cOP2 6류0{ɭ H0?[Uќ6`aIҦኤ0ϵ4i]>`>ʼn(o" ‹L7K6w3?AAMd  AA^3 /zvA .21? ]$D>ޙ ],<'ю{ݍ+W/_~Ņ?#\t 77W,!Y+W.qA2n.J!gΜܾsSBm׳Ѭ9OOej%d" $CM$Ixc4l3wK(n%d" A^ I6KtI  AA^3  f" AAxD@&4[7fxw4e8f D@|HZ(Y$%+֢Qסr9tK]l8c%I ҟkPbGS5@CܵU+Rr=:X˅TR{ȯXL>GMI/P$^܄|)޳)9"OnM T?=bcߪ4zeV D矸X)?H "P7+"3ݑF KPqbߨexĞOP~R4|> ϬJ L_àeSls(9Tdv Jh3 eh`,!W)|Y1Gٗ YZ= bgIirƳyIz+l.e˺$r)X&HKT3ݫǒFr8ȣbߎ{w-鐈Cw\T7Vrx4[K #!!6zWn;;;||}(X,b2B`- D~NF\$Sւs㵍By% Fu;og|R3Nٛ3qnw%$;~ uQ.o]eVL\ ] L[OлaҮ_o%s[gE',֞=ACO/cz v%hw*O3$z Go>B-Mۯӫ7e<оgMmY:нX4ɛj$m ZR>FԪs蓲0+A5juLi%l`h X7NĆxFֶnc^%WSS&gHIXAٴ?;<}ˡ Maձ~;)M]VdC3Kx.Ot٩+nKƷ\ xdGr<>3n9Ѯef9DI'~ۉ+8x1K[~hDj3:6-:Hd9ON瓯RfTztqZd5'P~C2v^%#Qk7/Ԑخƣ+vOo ZB@_ ?vOG_Mǀ5xqqq`oooZ+7M^KŋWm0 b٩ۼ )3zVduUoh\-ᐷ)WK(jӭYov"v²n,n a 6SױgYOڻd+wngYGG6LZʟl);c"5^ƖE[++ma+0X?׻4@՟f/Ѵ={63v$',:'!1-!6gMh =% I6c>/\!4qE8njdCoˁ[6Ʊe0{41&5 iHd3r(mXpnr |Ē-;C;X5}QKڞGy)ɥ\ 9Ơi1wljѰz!{pUxKS#|:e=XؓL[˟퓘};o*`_c/;(8h=!疦qdw/+vle|+ ;[cc6Vö0 sr aɖl, f">%_888>2]gooG 2!aDjd1}IJTZUj~$h B\;.Eb GddYdEAIhDM^3;:;< 5S-d5u?y3l%+Q ;3*#WT! (ye[0rynOý=s3z >ή́=e[v#:; תD{7mR\^* Lr5h32e{VV~2vFѥq5פmT?Q#EyIO *mh[ =>kP7yl:^8{V,:sТ]iXƲ25)y e8y/'s̗ʕr_:C#xJ9C#{3zNS֪|Ԯ(g~5HNUE]uhw77~|!2s yq;r FI͌}'Ɇ*5"w ɕX:Gu1 LDzc=UTv+!!Wܠ3pCB4 ;Gh }߿mò8*[^,,u ֶkKJDX?:I ޾^ȑVŔΩKQ?򿃗4*(PE$4*?_K.#FPOU2CC#^j^>Fǘ.o bMx+3l^cyNf 6yX /@My8 El[k25Pnb\oFk9!q12^I$;t)s5>qGU0ˌ1*Fcoo/){:GJT v>.|GB\{ \PrxW|W0[#B W59knr:K -m3f`qy&7|9#avn2rF *Hܛ=1;h!mL%A(qйֲeX1rB s1*Y o*!dҔ>m[/9_% ',8yl0}6 r,36 ;D9yrbw bJLHq_2ƓwazQL- O% ~nIzSB~"t93=tյRf)鼗dXX?`g$w2 !7Rv'fI{O0*ǡ?6M(b#$ vxt*dwO#.r!ԀVAKP(z ndyUG|I}~R!Aq{a.Ɣrր˙O4EJ EnǾh̿{0u' 0ue;?Gf~J=Ej\wJ%CLl<70%D!֌`4lq@eɖË'$̠q\^czK/1W)yiv<( =V5Os{/F*Kٲ*^U*&9bIֈJ2wMUϜg( \TLrϛ͆2#+7Yέg:59 #ML<27t/9O9 D@Ɛ6slTdȒ2T)Wַué7)WHb7R9=jD2md⍢[њQCqe\+U7LtQ]jޝIhk֤U/c ;@Ef37d씶(kѨZEVKq|F/> byJLO~"hF/:͓ U2R| egçپhY)m{y4:5iM.0^ij;B&{nVVAp X9ǏV>SU4vҿg!g|9ob2T-Wcҁ֙@ٯ.'E[փ:U+QtTvy"2x8!71d?ds+Mԓ\W'gnȨImVXor J^ӱ LJuR|,w1wRW":ʥ̲ua TKbWJҖ YusK ;}Āޝ8q$e˔~_9z+|j͇ @MUQ-JpZ~'!h*j=Skf>z5S, IDAT)GVQQyj\$$YUC*c٦i()EeɼNk*EeI&R!4hz;jMFVJj:.7y^CCU-fմcMט_xΤc:퓲-L3'L^BIv:ڬ7s+}uKSM{Xioʖ)m8ݻPr唟[B~Wf8]q Jff/о#0 疴sKj6@JҚy:mg˒ICȘ$ YJN,ckd%E~"]Μ&yqܧhB]a{Q4-5ڔIsiK*dlt6$稀$+VAHI&S%+Jei&4-HۖIynUW#y4?=r,vd붭/^6m>{OT" D!|~T$n8-ZΝà֭;QQQ e+o=d +i>,ɠA($I̛7A2t0>EaΜt!!!HN\A իW]7Ņs0x 'ay̛7QF3oӟЯa4B:|A$ :&УymBѢ4vNxv:jg_yөbezs;!} T4άdhצ^/6%zGX3#!UcMw6%;@ ֏KQ'RU#ڴ65j컟C[Ld +%2$brİSΝÐ9rN N\<eaOc̆h<9ܣDpcO4 c)J疉ܿ?27惚ٱ2mB-=tcۨ0>8ؙIR,g72nDSr꤄tNY;LWF+$TT'n%ʽ! MӸw.%{#F䣏z?LiH^x&v-dB;ccpoow*z) b)XOVWc4Z['zؒ=(jq+4ӣrF1e GG 3B=p2sSMu{oNoWPU -FP" A^`44h׮=zӧ\KEP'n+^m? Rˑgqjzuq,ؿ"~8H2hIQ@bjT27aܔrl3K0S~es:nR&oAA^f͛p".ZLQ]vҨaCT&ong[iC)U,e z|w>t\:QYP?DjpE&s Xʚ XYRrWW2sG ܎Ig RuPfFT'Zv1m v1q[9ѫkwMxD ̙[$N췵eff5wO&k.NIWy7MG2/2^/e̾ꐉ|z2\+y)_ T Wx֧iQ 1L%'#wlAo~8KRJ[AdȦd*-8@- 8\l  -tG6M {?<۟';K'[hO|f1dS Oa㺍bѼyek$BgZ^6͋/)We7_N}?tf6 DD.KWGa(Y$cy&Mg؞qޮDv/ai^;.p1{ֺpOlg?F{>`ڿ7Ҷ1.S]m֞מ14l 9zxM(K dW ;ףZTQѾ>Z{ w.\(YGX=g=]9?s%I{⭍LȚI 3M֧V};~?qO3zTم1R?zy&rj4q#J8ftmemfvqg; ]n'Ż}83O;?PǦG''r0y Wo,NC|a8Ngá0&/)]Elˠ߰az0O1יw…. מ9^_NBTo3kJV5*v]ʔNf-ϴ#,+e#p*6mA*?~%HbaԪ[7q3kX3,c1C96Z)yp_`[N["0a?YDm]'~8ә-PiWw-'-HamxʹlC0$=A&c4؞|Ďlat7Z5A.< x{?ө9 bӼ# cE#4jA#;F)߄uWШCn'K~Pa;\?q^ƿG38(>8{'2$<Ҷ^!:p8\v-͚;ҵg.oJ۪>)$mowoNjkR`y_Ix#naMd{YǑyCؾG#ٲqŮAhٴ))?sHa~D׭Ogacv+jXW+n vkq6qmiԨ1m{3up~g'ҤM^Xіpsvۇ.o>eۜсMѢc|ǾĴiZ!I|=mF@%6S&6g}ڧšy]ky[eIQLޒrHmؕB1 #i4IG1m?Cj|r6T'_)g*;fj{̧}Oy'rۣ\2^Oo7纗`5g6_ K}iCeQLY#>_ f3lë5?92_mMĶٰb %f5l\ױ! >6ჾy_şOGʼnEo1pK^f1iH%O<ώpr?%[3DžL{ #w?0MXFT\E:3R,.= xiط^ϼ.k?ӆ<"0e,vb0VDj@vUIc۸Ԯ].2J<5)YNuM̵t^) sj q/zU-@3BS7/qi&Ԥt+niVN'%[ҷCa6.[OȺyK nw=$Bwsw̜4#  ʭXĬ}דׄAզ(TT`eSx~R2<$ߦT<ѹ(m8;Wfuِo,@q{맷oD 64q?R[P,DJw'`wn?K+ȩ~Rru70֌s%'i@N;!e3d#.#_=㷒4XaRP `s1AHSșKDǦXk=l$7Ny R_3E|zx Ӂi@r˸㵏[No3[)ddvt`rӳG:+0q\1^AAA?I))+NY>A|T)A6Owy $.~MörXg r΂Ë<76K~3:5o"4Nmħ+ ҡCeѱC&O8ί>anZs: x̥|aa㻏2pYey^jr>)Ĥ̽~ Bݥ i߾ȻѵaCR8e+'l<Ξo/Axd{P;9ʷk73UN?<3F:4O,>CFlcȿrk֢a9D5LӞR϶s}vfP(wK39 v/x}8TNI>-*tg=9iG&M;Qt.'K]Pxx{!%%mx)))޽ z6G zJh['NϘ=nb=3an }3(.n=F]]4 G1rpWŦ]CF3j{6xID5sӝyxFOWqVחyO9L:`fa }wf*|xO'F}'HCtO@ɋY4o%2zctq$;w橑(Z;F qYN@=m*qNa?I#~Mtؖ~aKe13 `xöp&3m\edC2?nۙƲ2n0 3O~Ip6},穓 oq!XG{Ԟl et޿~m,g ۉdOv>61;ϭ.MImOBB~U?)3GW?wŎ_x,tU~|߰l:t2s'9c&FN4s^ۆ_0,!RR.~ ӷ|:gfne3.e.&z!u96 `<2Y=K]aDDD?ID. ۾|DDDDLLDDD$DDDDLLDDD$DDDDL_{!""eYڽ'HM `/ Eb bD d""rIڽSF =UϤkk\ED䒈=5%$$ |.|pmNѓMLDD.TBB.3&|Q%0DDDDLLDDD$Ha-6n)6N=k]Ҷ1.S2IƘnyyy3OP $[kj֬I͆|s|gÏussu96rZusy _F޵#n]n_ź2}ףj.ٖ; SAiV-Q6{`.evff-?HZ *>܁M2v;)[Ǚq}9酲86>>=6uu1;ףzY`qp]4DHҎEVmϐgOXջ ݖj/ &=s7i G3'IpIyst\s7m<ֳpX QUP'2kʔNf-}`֯D7©شU 7Y#.9@Z V ޸ÞnYyȿg+y96Z)]m9nc[D_S Z1m'j? t^BGT:7LM[9]ʎDpO|_`6CvL'3͎1x{)f>Ҁ>gdXnٞ+v ?ѓ&114lu+&o-?;Нf1fl; yor^'5p#APp0އ'_MM̝](4rQM—bM~L]{0xsUI!ixKk)9&tM?&?sLhz}guad}^ˑChߦ-]F%ٲYFY`fL5lIXm`^9:+4l6M^mhР[ &~֣4>>yN1yn%9}w6m<}01M=U<=}dFr j QǑYӫyWSl5XLu)܉UI*aŮeh߭&sF1*7fV}{'΂P'o<݊20n|~^e(ؔDzse?d{:T0\6d( ?%+qR_/0zOHIa͗?| Fe1|w0-<i؅C'q23>19T]Jq7Tv̚ݶ#u}~Lv}"Ay2l*s'bH-cɧwׁ7dk>( IDATOu(]z~eDl; +dtlZ+pҲq^Zԯ}l6ß;?fን,2B m11WkF\C䳽]_3K4M xi}cj`1 {G \Yf,]mrKN%-C*e}n:MQz~]~|hYiԊ\-Ȯ-lzNk%hx[5iB͹Cw2*ҠNCEHL`b2LLL_I'[q~k;ӻͿϵR[P,Ahb`ٸ LZͩ7 wOcSs}?;Q+ublHZϷ?S8v}LzCqL 0M`x42A'yJIT&KnՁ"keo$mahŔHf\}9kNqhFbohy+ٝڔ&MЧ g.d_ 6MD{*E?{z>2O|EAcM qghw.K` 7AM,ِfU=nxxy/f Ju3b&fꞳ9|+ w6e.jK6$]Kibo]ʿt~x-]凸}ږ7e4Dru `G)N @ ČRXZ/>?ũ?hi,[ז|;2l}%3 RqFY>g:q}KkyƹIkxL DGYg4]]QlVMaF\K^jWG]+&Q-R,ߝw}OnAmIJ.$)Tf ˆ\F&'l[S ضiӜ9oSg옑Qה'gF0Y0܏ 3'-͟R'oνc^Fx ݚɨ9+ u;5{ %aF96y>sho 5LSk5ʑ9|0`s`qb|zo%i0ä@(G9fAic+X(o lTKy)/2 `BjoOOa:0yip˸㵏[No3[)ddj Ӂ]OI>hüTkb )E2M00r$A,Jx''ѳY) Lp_Vo'Tb*T+E iG`ӹUivƅکkd܂#4ܘHPTsy5 ٭#35mRa3~R 8wq On7@PtkK7/0n_cD\\qw]3'l"KfQ =s(|p2uiXO/:Cƕ 6 A&[95ykSuoAYrl%MFZQ6̹lF GQ a/R D=3~^F*$zQosR0*<1_]1֧'wᤌu۷.?0<ͱL9E"gNmiզ7?K?|X?>Y=֜[e~4}|lQOcj^lߓwv?w MQ˽=BI{1ZhMރps+v?s;ڴM 6s0)zjLkIُ>av[^/rO4oޚneű f%W*AC<6 o]Rf-귽)i\% G/-o羱׶rz7R7-i{<[ҿ(*|;:MT'}IO$n| }zjӺE\(mMܧӦu7C䐧jbgΧ|"2{AwClוa9w]tK]oMvx¤D{wnNWVdI5OkŨ['$6oȓ4!&,fzT4L3ϿkCs+],}v1l$Gwձ}$6N׏}/fuعpiXx thYuyzkn;_A﷿㇉S;7<`aݪ},{uai6y#*?/m'{U2}fN<Wq[f<ˊ> ^/xO9=&mͫZ$:<5/hG2Q7rwr/rw f6 v {&3<|{;^|%l޲:kaO7lI6m50L۲ 2M~2Ʋ|_mlYwY]3J_od-Wٖ r}N+/}κ c{]o8uֲiG~=S>ϠaxoBwt8|o4ȺOv>61;ϭ.M+VNZ3Yt5޽{yqrs8 yʕ+? -5>;|=1̸cHU O>̣ĩM/~?L(O\LJ{<weH;N1c­>N#iy#nᅮۿMp'8N`7ORg~7E@*γC;Isტi$tx`fLhŇVlN~(ݖ4q)CZf͚ ۶ٸi35ktI0. ;;vyg3l{ƥGev/ai^;.]Cv1 L#Oii?w0Y3c`Yze^gf-~)kr0>!$>/Y|~ϸm00:~\^'ٗ.f܎G.uy%-+WNұ8>];Jeяq<Ԉ;IY5seH1Q3цPQ%|aPeH-I8dH?5'[`l fpT!=']'s*yczONMj~CY4%VQ#ц|QB`:M,ܫA@ d""r1hء1o_k$ 15d7 bjԫ_׳V5}BC<+WZ?k1# Oͩdal<#2|MWh7c97}ad!:*Ӟ+8e9fN朝>_G*`ıA؍ur[IDcaԋȯӧHQ6FћϜJ_fVt,Ip,Y⑝:dޏ4.f?j{ RWcTVC{N dXmmތf7vs`fZ)|Өz )}x?Zu=_ɒ*c[}oѕ*KW_Oй%MǠ ڗ18 NcY> Pa>ưux;(;̒w/d)ʆҥ$}'IAG㔺=ɚN<ܐM"¸I>{ꅒ-􈈦%1+~ZR>>úWofnɷ/?Kzո93lٳ-Ӭ~3Sfgm =+oA WҥKsR'KA'Bj`QƵLYVe: ul3숽E${N"p Xi@2!Y/glj>~ aab1ؔH VoxM"v*VmGD,Ob0 ՠv%%m,-^jMf6e #կeҬm5k;boh?$ v'i &£1Vmay˕cADx8?Yt8 #<<\!Ȯ &RlFvC&?b_ٞ'i־_*ӈƟ#-oE{[A|8g7)ytDnFLKNU cvͣ_gN}.?-Fh]\Z?)&׶Cͣ|g[^{9&m?&=C2kyotʼ)7w>3wO+SZ8[!h㾛(j`/vd^_W=E Q`Id8V(j4fnԙ3沿rKN`sǧxzAm^xVRC2feցR=c<Ͽx[&?G5'o_nfY⋬G(SK4T_nrٙO.,ۆjtx?Tk_G#iZAҦ;(5Ϧqu/9fN% itLţMϲiOaf9Պ5\1Ne҈0g ycd?xg lU0hsyo_7'ɔ3x%0ׇcd2e<;Jyv,5\a Ӱ u%<Ɏs2V~Mötl.40^س1}CBzo\Ȯ\_-][wۢZ4j7+-!9].B L Un@٨PPԪM9c00LӰ_7:ѡqyc7j 3v mϗLo`6D:4,A3|:׿=K.L!q"Z`DzevJ6oC1~eݒTv"p潆mkv9c4ք¡NyR$9Yw{Uַ\lA0il&:e{pskϷA<r6Q˝ס(a)tŋ4&3;Pj vx"Tj߇J`:)SC~7 VOP߰EpSR9.҈]g^̗tTyq>-IZpٷLmjW0\\.mK|mZԸt\Ӯhѫ8 .֒u,N?""W jPHr~ggh=t`5jaRGo$VlCL;+H8y=Sx\IP&)f%9` ib8 *q3 RL;/J2)DHt`ïpMѥlSOǴ~'. /= iG(Hp/6 D={ܸEɓ]7ʭ3}|,Mڢń4M$6~s ĝH产yfBq;($yKx%2jj UOLooM~HI(XpF& Z6p xVx6Mu>Farhk޶0(Q7pCh4fS2^#}-_+V1$obƀ|)|WsdkU$j}U5Qi`Źn1n,N cbqaLX b'֡)ue~+2IP. }Z(Ӂ:Fn>s`|.Bweݳ߈A _FErZOj41G&i ÓQ ogr,g#88d|~@ʺ4|$sW%ɵm\Cms6>>#;|:NLsː D_56Fa~p "Fԫv fgzT{z,LY5epEC 2mWS'[0/1&0xL/ |S$;ERtéZ/)hC>Ӏ ^ vF&sф sSiu{5&NT+ch]g }簂 R}he^qm翏Q w g1x|VbTl;i\۬9`8<5O=em IDATk޶li4>6?>]QFT{;ן<^+eh9%R>z~MaϰaA>Nwp1ŧ[-[Sߴ~F&a]X)۲=m``eg,g[lpl۶2N pޱNԾ}AF>e9߻ 7^|nw#f߶l3yYorYһ.{l}忬tϰe==@i/2\jVƲ1Y{>yg\ښ es϶\m"cv?^+ٵS3%w?&W?۶ٸi35ktI0. ;;vypz.a3wŎD=dWÁ$cZ 3|1̬>aʕu;u]9C /dѲuqn2 #Ezrm]Ù֕\˒܆3-,H]eSK*`WrO;綖/vxe0&Q KÎg//8fc":CDDD@&"-Oxna@LDDD$DDDDLא]]M"0KI fx"""ߦS""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""` d""""@&"""jDLDDD$DDDDLLDDD$DDDDLLDDD?2S  02S  02S  02S  02S  02S  02S  02S  02S  02S  02S  02S  02S  02S  02S  02C@DDDKaDDDD$DDDDLLDDD$DDDDLLDDD$DDDDLLDDD$DDDDLLDDD$DDDDLLDDD$DDDDLLDDD$DDDDLLDDD$DDDDLLDDD$DDDDLLDDD$DDDDLLDDD$DDDDLLDDD$#?JD䲳m\b dWh -"rYٶ?vKH,EDDDLLDDD$DDDDLLDDD$DDDDLwY^\]ٻOg2Mʗ-ǵaL*ƒ8L(T}GM%w^-!Y" @@@Q*C6EP޳ҽ.h?E#'>I|>IT9؋|&hI4RRR8s\EfL&Ʉt)(Z4XNBPJbqI^q2!#ի*$QG !D6 ȄB!dbň\ 񨈈CѢEG !D6 A+Vd4qu, &wX Qhbڵ똌&V8BdN D͸p"W]ڵNuQŽxSLʔ)`pD!I@2/_9f !#MB!L2!B|&Y%B$rLRUpy"ݾ}DŽxSU8(W.BPGp%)%I@V@:/] BP *AAA rB$ +)BE B'B!dB!L2!B|&B!D>L!"I@&B$ B!g !B3 ȄB!dL!"I@&B$ B!g !B3yǭX,IYB!D(  ~عx0$ {∌xhn$!$ 7nw@#y=@nS<4www,!F`\.$} %IjƄB<\dB!L2!B|&B!D>L!"I@&B$ Bщ_ۚc?OG)$>h[_ݿVz4^mUQrB82! t~yCŒ9]h>y+ǫhٿ%2mj_.ԠzEJy3;'d[ o#6wN"Gvee|ֻNj49ΐ&.0u-3s1*ܜv"/_n+q@+`BܨF&''LTPN8gJgLhԤO<=O$]#xS:36=ܻ mhNymAb+Љ;};ҬYKZƂ_#5S'~Û@Miآ;㎖?6patk8-'BjfD Hc;-> Nۉ͚ѤUgNUl=ά3cgѣM5sXj^<Ѽ9eL]5}gϙ9įy`M+F7haЯT]1[Ѹqs:<&J5k&Яs4i;+ohVo {&4nщ&m5! ɬPЉ77>ٳ*pxpJPӆ7)f^A'qzMu?`'z 4[ٲs+`ɬ*$\ñX}ۿx 㙸.<3Ӊ5nf0yiXgvϖ]ص~!8#,kyq^zט1jG*+ǿƒǝlYoF3'k>X \&ǎ;^t_>fZOW1L˙vc+/7Uسm }71eARS~cwr3{}.yF5{ono;FZ:Q[2zJ[ؽ;Կ# ! oBGF27ƥ t-톊}ya6$SS/ 2y?H =Gwua@ˢ8+|vavJlZ z6 YQ0k 9 *.y'(Oz?ravj.DypNמTRM>OS/z/{Юlg zF0nNF:{w6YTeҮ`ÙJwj=́ 1y]1Tցf4Vs9BeH [f'Y`7׉i]wQn݇,}x LpgPO&x4hIXogD@cȥ/ٍ_#HV0`fFӜM%o,{t,F*$YtTOoJBH0R:n<>jW/嫷c<K'v3^^NvB'aKCTaf<ݖO2ml?[&[ԟ̯%ͽh9FZǒtpT_ ܽ5 /~jVmdtnPӮ (~ ! <CBGꎯdL'<<B~ːatq`%-T ޾>8Wy)tw-:(ds;Ϭy\{((A{fz)IG?ad1%O{ ֘aߣk=X21Sr߂R}l@{C PPtevꎗe@O !$B"xD :ZbݼUаW,THFGFuh5'E >,t5ܡ t~XݟǞz:z SalBg4:cH6x߲RN%xf$Rgv㉳U)xo= yv{l8Ye;O37܂Kfxol(?Rd>5G;_#oN)Cu ڎa||+>н)9gɄ=Ƕ<6]^'>ۧZ:5 `ڥvALvic`9+L3i䠾A<Gvw o?aՂ)N;fergg3IgS:FY/5uk`5-3mt.g˪ow1dO;eq9æB/9ul\c_V! iB3xv!&Ԏ !ĿdBg8~2]c|qBL!"I@&B$ B!g !B3 ȄB!dB!L2!B|&B!D>L!"I@&Bό#DcXuQѤl6C"EpuuuC afZ5QUqE!)`se"## Fjb!22'NG%Q9)_KemU} 6QcSu.}0 <_BGd8y 4`0<==Xb>}'ORR% ĿMwP'. .Fjz#w2eBG!+.]ɉ*U`4s Eh4RreNN\|q@~44Ǭz}{0m S]pt+y86=< 13.DBjڶz?򘶛q1Љ6L0E(@-܀^A-/|_EgMMuR&߰'eMcԨUjסV&>:L8?AG|0dP~'?א yapOjzIﺟcxnݺEE1Eh4͛7rеOy/4"v=H3^LTQ @УS) Ky*su[T_F:| 축5=aܳ۫-k?5nIH;STCp,^F3s!- R_<4QVjpu73|?uFTb*!Mxy:0_oЪK [VX+^34 2`֞NDkAb/ia8-:%\Kp"@Fvu7-zUvGAh>T:w$e4F;ȭ3tX z%oSόb9wOcɾ뤺PۓXx%;?O{Pq?FH7g=>3uUVM?MsG`Nyx\a~1K3G|rE a_ѯ1z!M79g s&*MſG~Zn #l*b1nlt'_x-4f:fO;!uee캙+jZOcSAf'Jv+߫ +Sw|'W0} ^M)]ź0o:I?gԞ1/DEfp{vw:"x0/eӉp4zTC=$˧Me0]TCLv's=oq.6W sfQ,lG?`Y[+d91^gX`Lsp$k[γt6?GO`PؒQNBޫĿ3Ӯmh9SwkT_*ԭD -5*Ĭ|C9:=ۈ g9&Jcqx]#=)މM 㬨h3rf(OjgT0ԧA9#!ͺѸ3EUp};+ Ru^(;Zv[ع'&}zRNۙN c=Ջ*sq:=Y{9]'j=ٝJ0xSwOc9[FF.U3w3Y&7?ȺY,<9Wi IDATdrbSԫWZuv8n%TI6na>TRQ%ҥ&{p>gO!/Ӹ.f?㗠.obn7ZfH[xgj 97zcP@ g*zLA-HgcM ލGO xhJm[ $Ѭ3T4uzwzV6KҥK͌98SkO*gǞE9v#S0nY7l,!l qɲr6X,xzz:f)ł8ځR=îEI V 3Ikg*+5dw7 iN|Ldo*xxyf7;)*ZF-MKban$+p붕ƺ BbD)I/lbNd<&uiXSIwiEq|s8şmNH1?Z.=j3̞_̥xJW:ۜoVM p=hv(kw{d,SUO#>3W,GQ{t4vX*ތ*{Ѥ]Lw͚jbRrF@DZu DF>$bI\_:[ΰvM* !NF'#-'xyr\/2OsQ5,? *S5 \rwkt;C:C߁9߅x 9FBq»Ts7]H_ g(<9q5jv5n:>8Sk I oH%h`)[09|HcyʦxGD tō@Bz`(ON\͈L\[JF'c3ʶ'Že;oe{ּycG2ba( 5kBxȊ)µ0fZXAAA9NPQP;ID([@5*w"8=}2FK!UI;o!翗5&P*dأ;N֭ X\F莁M7gZ.$isbzeX6O{2~T[ǣR9z%X͑+88ܭ_Z9%bL%([k_.6MNt?_oo6ѹ`:&@*o6a) ۺ/9t' kuN^ jܞ:3w4@K!Y,Hqߛ1a&OVDK::?qb4n\}4i95p$̲mqb^eC_|oӸ~yQqÚ~)ꊟOJ*ٹ:u~~~f %Rgij?x^VMq(O1aCw iEdriЗAg}twPN(T[?Gןf0 [gś^vsQ畉C:ͭ0:ԡ끌lř/Ϩs%Z1xP8+woH:Vڅp.ބ'H5WEXC,D8;ڑT2SWfAH}&4/b_6e!2zPqx*T}i:ZhQ:&0_ˡ̞3'߿C*f+t)e(j GQosQU?_gGOx[Ĥ+U)Wʮ42LLݧбet^_h+Fb~-/]Z&m|9Co&R%jfGd8d2__=;!M׸ӎC֑GBF[S_.mKg *`K3YF8fI# 8r(khSpqvbŊra8u*W\lh ]1d!eޭ( h!#ͦ7\4?ΜߦlkZf= ѴA-c󃒼 SHjhvW:fzf o|Ι5b |;{i{QE_DpOO21'UW'1[>7sa_۸8]9t5WwG|0魩cE%iY]:9c.mK*?y YӎyYw\rA^@Jt2{#$8/ZX~(1>8=)gJ{|FLŏhd_ ?l+)BSd)TUTɒ.۷9s6rJZ={4R0]G:? 釙sk2I2(п3ml Kgˍt3gVo`Zmm!sGܦk\xiR!((2}1/۸B!%MBے2_K$æ'G !2I@&XJ!D$MB!L2!B|&B!D>L!"I@&B$ B!g؋bGjjcɄ.h!x$ +`, xy$/+-- ʄ&&6.O D䄗;1qYB!A0ii8RN&'Gox_\+q4cxSn4 ˅$9@8AemAe˯ӯ ]Hٚ[)jᆼFJzɾ邏t~g,aa+љq/.,Ϳ]$2E%:O+Q.,W}-S&lMeGO `yӘn[)xR ?2 !DF ^š6fGmHogx?\wgEۢrW73ܬ7_0wSJX2O`O[;tY~eUi@m@ޖ@ [a$sKE5.3wb7ygs^ˈ Vxpp Tl\qo=:Ow*nkF|gZhIN3fA4+xWZlI6xݍ\C'YrW:tꛎg">ahhߦZt 'cؚ?X56e4nu{mz0j ֿπmhު^ŎwNkax(&gL'b[ѶyswoNb]@{*>*AE 05-ӿ$Z M<$Z1 \FLd x#~1s i !#Zͣ(uգg E KLA)!ĿCll,gϝ'.AYnT|}ѲZZtI򭆯 1_Җ:j ~O(.Xia7)#[OL-^Q?[$Q (Z1~VgLߢkiW%u|e3&Mlx2 bi=v:ev ټd3ia:QmYEgX=}c.F1N)|л&+_3pbΥ+Ẁ9 lU ݵs.qY?ۧY vU.5.m?g㘩s&7ѣԮU3צ\zG\o<^ '38WaRͣCZ \0%Z@#T3(` ?nԪS -c?_\e|r ;tnޤxh1,!DHO2,C t]#Ԩ^1`l@CsVfedPJz測JzCc^Ԑ=B$, Iݍۉj]yY,C0g:h~R]qS6bI 1*_"*Mt7dR=B<|+q8/P1pH@(TC`0vO?2ͦ2jU˜^y˳j@ECs)FI|ZJrd=XBc#NG9/fՀ!^RUݚ a00i:٭ʚ|gq@LFG(*+B!"#Dqs-% T Kϐ̘Ww7l7H22d Al!ѢK%d!5sb9LkS;˞T=4M3By!9ž\CcM腪%Պ ƕd4lX/KEpWÈ\s@b,DhQ#7ϜfB)[!)q?}"ll,)B/!{(.THʩߙ*3`#/2TaB ScV?BT"9˳Dʞ9{ϓ9T%=VYճ}'SNEWQ*e˔s+[geN|rRC&@GOٚuГK4P;Gu)I%sLMuH:蘑IqƷDUp'>s&1@M!!zjqj>rțWkbcc%BBj%s5x jʎ8@ʕ%B|&ٿc~y{{SJ^^B!6 Ȅ@L! C&B$ B)EtiBId28Z|swA)'V%YE\|"ii:2Ȑodc x{?fz,kקfl:MogVT|ס l6=ވV3F>]ֵw(-|3^_@j8|ʞvaoATyO±̏œPN;73~y)>6E²?T8]QaAɯ\DޙNEX$}33",cwE%;0KL;RϹt[_WoZ"P+ [?U'J>-\f" LQ8ܕyit-y&Үrt Ĩu-i$o&FtR*Ś2蝑uB:$Nlk0>A܁3pb%gɘe(-Mzo|<.w{9[}On·|K{v%\.nʹ/vq1Ί-j=0 ƏS7.p)ҕ>G,`R:Oe3UTt7 5乏%;F0Na %՛1;.ƥupVE\78?=O 599'YϱsO2MG.+kDmeҰ u-H#^;e3X=wSTII#v f-IUO g{efތSt55})Aa/3FE]e^nw8!x;6ⶭd9|=8Lw66HAYN ?M I2΀_T8K#+^hN:drEW”aג)vKiP.]L)JeDňr?Z?4b]dBʉ=Wqu¼6k( tnpμ"g2J\x]ky:ٟS%E{j\ʶk6@۸Y=MTPT f ԯ_HulǶj/oGU% ZE5[P"ZCEz}Ç/TM'q{z feS' |g0(h㹰3˳)]HϕNz|<V7Z 삙)sΔR\TW̩܍tRS WŌJJϨj՜Ճ'uBB~ BTp|eL1_Җ:j ~OɌVü œ;4b'9Y;)M[Eͪ #YWb*.~'as)҅bnĝYńÙQ&>}}pхS/ bSg[|Zy!o@Q}+1dLVPŧߘNA7iޚFQ!0ǭ ~x.t)f~ fu:)xWN( \"% u8s$$W,Pʕ(!%\Yw:6a\)Jb$k! ;R/|#E,Zqrm$r"4P.W?%4 0y|ѳaϵv;c?lOu'PDbtʖ te8шx+qx-Ct<u}WM%vF({( C~*C( "(_6( {2,dϲeC){ eB&?Ko/-VZ|<9ɽM;' e<Z$._Vx {.؞uȖaHcQK>E UdIr}s炈 ϗ  3z= Z@QrעA̟[v<]xtB1KI{*\F scn~rP=ٳhYОhA2y `n&R5K EX4®gTUGőkهM7"M8`9֢|2E!xg3pLk?u>ʽC&7uCPߛФ|= 3mOn5K'2:qhw~"8Q1/Hvbi{vz }[ץw ?CWPRadӛ5S0zF 5޴!Uj4󯛹;#ZL:d-4'u zώ=U~J5Ә.]'UPkM5R&ͿI dϮc_gӕ&l(0pB7rPcO>vsЗi;?4Jۋ_|G7KjvZO4^rEUkF%]QF+F\*/?&$% MX`H c! o'*W: !*5c|ke7Mu;NR^1|s`,n^VN4͸f\-cz"}UR|,BK,𿘛M 0&_!x g}xIB!D2@&B$ !B$3 dB!LB!D2@&B$ !B$3 dB!LB!D2@&B$ !B$3 dBiזйI?6=+Lɗ{}"%@&H9DY//x|:4rs? 3~8=KRֿٰZf5K5:jC9Ožyf&[xi ~kX+Q \uxsEs cjVJ%ft'"l1qw>Uo=ŒcHq:Wv|}6@?V+gkd klׯC 4A,D^cN4Mjթ[& |fskukw}oydʢTߠ؅]fttBe)JdE@&Ha﹒Gq`|~G9El*Twa6 +pAZ%>k,E%^ӓWgvVލf%oP.GcY{/{ș_eɕg߄tlu"g3b@!}%fi^9gfv\Ϙ5(ޙkvf}Φc듘϶/ e?vmfD]wԗ$s1̎֒e|+~6pʬ|gȼ| x BM融 mR|+4@#bwhBhԁ?oNMooiN_ϬifviNf}XyǮ)20/r&Z742g1w[*>?h3?~|X~]Φr{i&=<>m[&5u%tEoHC[uRR5[vs!=?Aכq،]Ȱmh\kԧ 9Gݬ>=|jV߭H 1}x~CF7PMG?yܸ QBܸ@q%_+i^ZӸ~$ӟk5RTTCYϢChբ F4cNZi1׊ ![Axp^REGKں9bU"){u C`~_ԱTI ܟi(޳ymWː~t@IGUZyD@&H4oJ*E\u ϦϏs;n@/g$6n?+Oגt۝ .E_1є΅%aKN@K%U$ cS0 Jcќ]¥]Kْ]K4f+̥ [>9p(:cмiX'wD ٍG5 iܩR4i݄p23򥏻oMQj@ 8 #VC/€eTJ.X lg(I)!H~*i3C{NXPaiKVLxOsuqVk3-Ey:6N i;u* r fӍbH4nv8c%N]iK^<4z~ϦOedw f~kрQ/{:sYfL8<03M u.7J?W!NA4Eed ͷßɦ^e`:ڣun5nr-~Љ|RՃqv=;nPtJ1 M-wU*Dž*1-Jūq!] d#gP<2/YqڽƭMݺюx9}ŬːZ2>_gzSIX߬{V'[!BjMYoCt~fqB ɥ<#%FkP^)Dk'rr(:K/9%9$T) l kG/q+t]GSF3wnE|9!9.%܏!$*fY;;r,^I5֎!N_'rLPZ6Ѭ;Hs4AW8Yҟpl7S;R)p#%C{rVחQN](a0sy~) *]ٴU.)|%0n*ȑNǽ(; OGwqӘϤbEҡ Ҩi6͘_"o7OFwp޾GHJټa%ˬ˴k\0?9Meȗ#6E^ɑqlLP3cg۝#dëPF UH:a#NP4hm1=M޳8ת_cH~-ܝX*|{zKp;fPMKÁ<1f)N~`~|sXkX 5}mr?{f{*7\s|HEn$?w&Sddm*;8R8F1 c~,s}@)>6ӵthW=;Zz1ҦMK0D"]7^|V=d$FWRLR#]*G]9gcХPn vƅt#9KQoX FyڎdHhƷ͍p'{}🛑Ũ|_4Y6v4YZ3|l Nfaq7 ]9z8Kz-L;A9v&qzf;n&f<˘ VuVI-lV!ӦOΟпm L;utŽfޭFm0&d)s)֕KKE8P2c n^?l}H UB!2!Bd&L!"I B!HfȄB!2!Bd&L!"I B!HfðB!޸'Opm[( nnd˖Ԟ"I BFp# PwGp񦅆>@ e)\BFݺ}rJKRr'Oܾ}ǾJ$3 dB!ި0 c)H*wwtI B!HfȄB!2!=}xGȷ,Bw))Y"@&BNgĨQ6 #GS~*UnJ%K!e cVTI~׏Fq\|H BLm1#gƬlC'l)2!Dw ZL9I-k%*|[u*˻Q+yvV.7m!WӞ.i??=7a|54ڽUtvW`dd$~0fe e'O&22)R dBlwwbr}Iu}[Y8''sy/)P:ER+qO ,W70u!>X?ӥa&~L9eq ̪e}Ȳj?eϔE(S-¿$;9}Za̪TL:ggg*I B*a?8] J\eG1g8|ʕrc00e#4\1Vub~<+Fѱy]{פfv|,燅^͛и<ΛCSCB%Xn-:#AtɆuMqm̋z-D|$AKJJ4"e}~)<^r4 X qn_X{TROgF E8=c罌l߄Oe(yErP]\qx~>DFFZ(4CL>rJ e<%<,]܁jOw2!DZEN+VPPjVN_Y1у`P)J^cY~dϼ IDAT_|[SC B`LxCT֣f<:Em쇽hSE U`Dյ7-NR)Cb4!HJrȖO)_ploJHoP!+os\3h1aTԤzt͠DrzPx3lh\ E# l֩UvOmK/dI\ ix;9*wMdd$]v{鏿c! o'*WeP=wW*7 _O̖ٷ^:GtRUŘi>wG90d7nZٌ[b̀n3ncˬ5+q:8B!O%K_߾3SbԘ1ۗ%KO.RWB!D ( eʔ_߾ؿ?FHgLlȄBw\R%=r%KJ{I B!mrB!D2@&⍒oW(W <'Y%iSӼE)< ^# ,a{|٨ 54=*[uLuϕ_og 2{wY17^[پ#qE%Su6Ir4jXF{tj_8fjN;I/N]9f.zmX\3AT)n}C+YUv\-cW|ԡ /;Ň= \ܝ7O :ӨMSiE9e*d7^/hiEқ{G>얍jR1xq;vs;ʝ<^5Q<Dd\w&k-طr`^=H]2u$!||-ޟ5߭'6I KI(.X}(( 41~QԠ7cm?FiTZ`ʒ489,Tokqp0vGޝppuE #r,jޑt껊k )wt)I*}qݾ`PAfu\Ca4*SQ{ X*ywJε鷟mI?<:5t@{r}k2{^ii$+b`.ZܙsY)Q;sf2{f^8Пpr &NMv.͌qQFm7.fLmg;Ìsuf1}/[cО\aϪ̜U{1 /ދ\ڳ93f0wn.=X bisY8k:s]!%\|z/p)ݻڇg`f^y뙿d"m@i.vޓf3SYrшW?whK{C;>)[a:hRF5M͵8ml3W[J^lM{:o(g.?JC{peq۸+k!g|0vUFQ~ڍ]ɞس·#жPl0f$9?w螥|W# ZH&i͙zI[ĥhk THb2u8o9bXX{#51UG֭IkYAN>?S.[V!|?&z ]{V0CNɢv8U.wrdjrIy0-;XԽ; a:ˮ&tEzR$``t mͤw7kc 4g0/CϰabK׉³D:8`ft:Nؾ3g~Ƿs.X:d7}0nG詳wZe%[ƊDŽ*(& i͚Iuw Yxt%ܝϏu?x%zitv{T^ɾ8sv[:7iw64,?O8ył[I/:vm'f֜%쿣asf3k~>+b߯s軷y GjDEC(- <[0r0ЃgeːC &&Y5aO(cӄy(W&eanYe,c w\/z= yP) 8Ri'ZJbh<6aQ/ϗ)v 6s߽ >?T8%'Mnޖ >ZhuĹ;8lЉ I'e ǻlY88 gb<1\T# G9܋+\\48iuCU wiWxB20mu:&w5C}/@>n\-[gf o@VUEI)D 1E3,քdfV>˖(7Lt34C$гY_I/hz6Sn!O[o%H`E]BK̘L:p4(7'J:+7JSzYb4;=˸pR-V T? ?ɻx: 7ݦ4h;c{i>T75;ǖ0kD}n9>3f6({Ho0}V1h~0+?e;딝R *r?IU<0= }s>噦I6#1)k7{&yJ#O_IZptP :HR{ *Uؓ'YTT>enu)QTny((dʑ'.b\ôϲtfF 齊1QdJ[reI6WVlw S3%%FCIG&ZcVrfUQ 홳EN # hs>XDZh2x|9͂!cYZP__!=ߎ%lR/2#7rc(xc.%մ*N- ^T,7  N5b׏4n-Ay_&̺ IGu bZH0!WCI7/]!Rg<S(:aKgNJ_)o xr n2(.dҋw 2`V |UV53` :=kHnD_t`NzLud,Dcr1Өv3i,m!vOpϥS(;h,}p=\9[֝;W`IOƕp/g=ë\'T05?s)P!.45K~Å y5)ڤ9EOax❅;rAOFEpz.>NcD^.Cld?P%p"/#bPY܋V!G,^X##y *.#8}Jl=_v3N|4{0܈ a'{_ijHL{0z/Jj6|U+{LfÀ Jɫf+t덳.Jet=ӡOعp5WKvŪW,![}S5g쮔v?ĨfX]GQCre>%Շiy>yKwswne {Q"e lPhɈ 3GZc9T×3{?#|L.hA{Y<ذ">trw4\[ߕH$@*[BQT.iUtFZ`:+vbLN[!y*+=u4~BE^*e@͔.2;oJͧS1gmk#9)^Uxf3(WGbU9A*yS̏`v@ҍɗ:3e5}a ;>z4}{K/eQO-dWN#0 Gsd=ur;;ZTǮV|%^@ij 3jFNYp^v~Sakȋ4EW`@x(*{~L <*ayPcTLsG6"SV2fI"+b&,eG1d`Ŷp crW4x|z3N=gVc:,)d|O;֕8`ၫ0&*Zj=ƵR7Z7˕bL R㦤#{TxrI=>9oF5I|gUH]?2w'&<⚉B5ѯW[(u!wI>+~TW綝 ΊJfQ]G d*֜Ahw8z.{l=:%w7x׏f7*T+mzB%Vf-}l;n?X'5 `ڌmƭ 8،q[덀ICv됅7x+{0it͂f=RT%&]5=UUQ,=;10ugueɕ7qExn.-Jg!Q&Ҧ"L-􇲱 ^]vVP :l]_L綿sMUǢ(!Tw%?eHˬ1;2UUlc!E`#Oٔ%p :M{y^2=8о{]PPT}voh;w)99fXm'7EQQ5 ?ȂLK$t].Uʾ3=m[5qKm-6zl;z"}URyMIj`&cfSS~rӦ3}VjF2fx&7W,۞WbפOZ7(1 )!6/lXi/c7 MY +JϛkӺ/'T/gecK<8Z#>.w;LBn4f,^I cx! z8Ww:d܅+Q(2}g_j CxWY2q{Sb$:#p}H $XoW[0⛥ƾ\!Ha^@!BȄB!2!Bd&L!"I B!HfȄB!2!Bd&L!"I {B!R2i, do aa !)Y.5eɜ;wn-kV\쫅B/Y&sU5@yzzpM}OEB!( .dɜjI {<==_ˇX !/ do)!B/B$hEB!x,/R IDATL~B!)2!Bd&L!"I B!HfȄB!2!Bd&L!"I B!HfȄB!2!Bd&L!"I B!Hf@ B!H~} d?qBw}޶c {/7B!{z};MBEqgFm/`hj}MӸ|21L rpp mϗok޴j BoDž{ רU,.w<"M=j_+1E(S 6qE._Lߴw:+Z!B!ޜf[z7"Nl!B$uy^:B!ެg@oWpROtB!xN'u_^URWhRB!DKjR^u%&e4/B!6sH4y^+JNIlZB:k֮e?z*/>5iJM֯͋8F'Vn/7_K@&leN!fW/`U9>`ࠟӗ_Rpt]ܹ,ZĖ-[6tg5y7i~Ǘ/{'Ke+>ĒuCڗ !{df/ظ׾EZ0֌fx|Q 4OQl>fF7?/w 9.=ժUeƴ(Y~FדTDsTj>Ҹru)JrrnڠpBLh`Wǧ?쌞޹UwIB INm@((rG\MڹxiUb[G@ @P[@{qX[ѡ3(RıBVD4LNr?zs=o]$k >W髸|u/K~7~// 0 cM6`)>_o{ojZx;މG,X+11Qm_onݎWw)N;9|nmůEk.+?=󩍸ceе87_e]ᖛq[߆{,Z]{͎Vp\r g3=7߉|xڥ9gr^ujmmlK>؟<6lq͸W?٧;ȱ;eo[Nz NOӢo Sq_ݏ|5ԣ N>g}leןz"][߉=<"wC?תd4ya7RH5!)ں|,^x]-߽?|zb,A=6t}gՈFZu8cU.7キoժƇ;9o~z x Ww96} p_m*6z}?W\dzzm=K_Ĭ6G^~u˗{D˳@ZkMz{b.e/nϣB[g=mjV\sdruXXn͛О\>j-_e&<c_ زu[|ұW^֮0eYbzm__5XֲW n-'M<KZ}ǫ{'ɻ_w ~XM`cऽÝ>=֑oy^K`컸oFxlsz;ص-j3eFB* oLǜ !ļg^{cݹW_\lݲW_^L{њ) ZX|9Zx~')[_B{S9ŅkBݳCw|pءs;>jzsxq!Vlq_B ^q [E3]ي=n &2|&ܫ>?}S)ug -V=4r~@x?ۄ߿޴6guϜ3\ajCgІlǟ5&Gg7k|#}OT1ׅb^sCC~øŞ{퍳ϿaGṿ";qrmOr:^t֐Mp l?=k_3^Ox#^:~ט}|yڵb:7`n&ݸk!^b^>Gj-GIv>/h˰bXtk^s2J8GkO[3x=OJguM䅖X`e9\!55x[߁Kﷱ^\^cNs*~ yGԶilp8m>sv n\;nXz5&Z>@(>kNN<.n w̶΍Z<3 YpNy'?x| 9rlD=<VѤw` YO"R}vC}-zByϫO>>oϖ'ޅؓضp%;x ,A1>p3n9Yu%^wnMoĪU!ZxqßހbuR=)gמ_ lbb% pY#O`8-a!{p)97(gHLݾ$!Ki^؏fYuSDŽ9i/uk~߻߲?b\xX =e SS۰!rǒ\>&ƊQ29>0F4m]GB mjSlߎ~<ڐ-_7n6.355eKT{t%F|h Fee9ͽBkB1;hf#ؼU Kw'_~ EaeTޟo y4^aXs3?0cPnBI,pĊ0=-Cք ,]˗siȲ O-}6Xt)xxo؈Ȥ1hCf/ T9'h~4=zSXf"nQ]!NeX19\}$2LNNbRynZ}tkU{~j48C7s1=os^h6BQpWWk~dx~QD7XGolB1z{L-f"m,!zѾ7/5rl9)k줅B1,+3b}u~NqDUkiȘMׁ'`6ڣP;xB!F~=?La8tSa_҂oi~5a!B ~`Ttsmlfྲ2G~fqjB!=~on{{=UZ<ы!VFi@o?r!BimW"b1"=]ы!e7ǿ8EsB!%_rA9ϳjp#e! ^zfFZtÍB!-G1VtHսGA2{1U'G~=04`$u6V^OL~5}fus: 6d)6a7yt.Fӭ?/jp}6f~'h0o=!O]k4E#B!v^~\|n l|5~*͘gbYhsHkȢƟsmh:\ X͌=ӼB瘝gZ4oZk>6Uތy=9&bt4sm9_ro44k]9: ɋ(hpOZ!Ns73g/<fX{beoP3mit,~2t4[c粵i9Hpu&#M!9#Ҁ{o5_:1(nZdxH˝fgr ՙ2d"\`/ti@g-+FӮv1zL13I:ހ'[1+;R9fxiB!ƟhӏB0}T͒HzF4ybtp1JCc$Mɂ |/xm~}p3cI7h(lluѳsrp=(Ȝyt?ry*6"M!8#81Bؑb 9O Q́n`%ֶyf|_^v]lvDO:ΔRt3G!*DN)$53wl|Oae4 4d9: ^7MVo)f:\yˋ1ذvˣќTnBPpϹt#az٘"UOB!ƛ1HSr46j0ÅbZԏ& ]T[Ҹ/< 4`F9 o ŘaYpnceҁB!v.xո:f/HY:|| s e!kBN(44fXYCah5-`f nskϹfe=U4B1>D{[ Q^բ͌{ji~L7>ì]lOˬr~?L'بi=IBW^G=Q='ku41Y)ԓ2-/~mȩuR  6.<e:k5Ѫt}(ät!)72/Y q^Y\Ue5IB{Ve}lyuSZJ7"=cD}*-~mUSFÛfh s:zY7cT*B!"̭y~1<P]dOȀa^Pt_G9VX:ye=eF{ZiaI^V\g}#ǞH49B!G7|ٜi@lTx4X]ҹXcUݏFszm!YiOi qqwKB1\:a`Cã;GшT_=/wCNayj>|-:LIDATsi(s!bT-5i>OƣŬws(TmPgnzzzȱs/MeBsEy4ޯh]yDzj3Κuz}`n-sG=e'bO&c !|j^(qG#'s8ոufr5 }MoOqס9B!v^1 <'eh(7Az4s96q}^g:=ܾ> 6KfpGO՚ # H@yM!ĮGIH"=ҀDxDH3> G/^~]c֩˰WŸ]Bz|Zg ̧M_گu8^B]q4+~3Pj]!BT3(4u|5"A/B ( z3aaG!ؙ9yf2FzFu^!byl$5 !)5̮fv+BgvJ!{ BFH!]pU!;B! WOL o! ,!B!B!B!B!B!B!B!B!B!B!;'ɺߣIENDB`kraft-1.2.2/manual/images/nl/company_adress1.png000066400000000000000000003661601467704360200216010ustar00rootroot00000000000000PNG  IHDR.zA pHYs+ IDATx^wxn 4E z. ع^˽vr֫bب? D Hh$'9{2;MB~g33 f @DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD J(o"""""RLatG}DDDDDDDFLʹqۯ [Ҿ}^""""""jbFSNgkDDDDDDDkƸMu< DDDDDDԸ5T17B]_އU\I}5Ov'zDDDDDDDv]dHn_KZ/Q]$Аݾk[㵞xjDDDDDDD36k= /$xǭ~HUcK{{~ZOB4dVݨ{eY""""""uI벬[u}.5yvep]ok=DDDDDDd/^ {v[uYo]MƖe{견܎[>DDDDDDU}%Ѽ۱nǹQueٸj,In]."'R?nX""""""jx$nF߭.EcHc݆X[G>DDDDDDԴDJϭXrqu,2p;9Ł}(:Níϩ)s#cY&.2IcYFpZ6^pY&DDDDDD$ьW܍Xe:k$9v\4qpc܎#"""""pOe7.D$_g $Gюٱg~DJ؍sDL뤾h/2jLm1:Fm19xw>Svƨ1 "vhǬ>h+XuLH܎w;q|'mQDjp=>& G>um[E۶c7.&$刈XHTh2/v$Jrݾq:>ڶLSDž1-8ʼna8%j\m1ASDž듩}Ѷ#q;%:YfьjVdNejuvf1%"quXD*8yjWקQ!ԯUѨ˲DDDDDD$N:WDL&թL]VٵkkNpݬ/1nnH!x:u1u̩)#"""""K}o4٭˒T̫qu*Ew1x>BMb<}.~uyyQ2uvXk=DDDDDDEm'R"oéu9 „f'bb[ԩ n[mh})Զi^ !ܺ#MySIؖ!"""""j$.4^hN˻9Bmu4o7ScvmU]]wn}.婛yA-Fz)'bbjڎ$DDDDDDMMI:^mcvEA3yB"E>1u3/Ou;b/*Nrí/\P0Ϋ˫qH˫EO]V՘TTX*R?QS)aV#^1߮O>BWv]iNp}QWi= ~1u*.䗠u">y*ŝU%"&N˩IZ$_"M4^-` tV}b^-~jێ1@>U4cR4 pnruSBD\丸߅++1M#Y>O-8d\̫kRn^E !-KE:볋E%^Uzh `7ݼq7E ~5*eS15 @FqQ~f[=lh~8 0 NE;vc]W4t~Ѷ#Ԣ.Őb͹hВE!iмnZ?0-#xj+^pqu^ԮW(\}h]_ożz y| oG=R䤤5D^vPƩyV1=.O;Qԝ-NB'bh^)n fn|4⇦[0+Ogo6S#"""""" мe FtODELSE!h-_E]nGmQPyCD[V4c6qvTݩj[̫1-g KmOʑݳ I50`X>z9J桬||SOMh{f Fo؊Phxi=k,DD؝܈TtVf&~l ƞvrLwwhgq*pٕ7my9|(o]TTs桲RqGz5M~j\>uƩCk.m:sƟ 7K9󐙙Æ tq8_ܿY׋[} O?_VV,D.k/AnSu^#%\l?ԸږL;U]S*Kt$Y2KPSD wYrvEö2!@Mdt~('rB!"IHMMoK_>8K:oknWVBu\ ̾p7 |dځ;`47r.hǟӔ&^ǎ[zJFCÈ( lHb8k!ၻ2@ɯk )^2n<4i]+-H Ղpj^,~;Ŝ}j[pU}C;WgTqv&qJ<޶p.Ers3$!hk/2Lhzӛ9|{4 ʤՕ?< Ϙ>zg-൷ż7މ+""p ~fubࡩO㲋.@&pqh",SB~&;m۶KO?E|~{uxw4Mz}عkwi ӟxοa/ЧwO{Fƞ,TVVb`Ūոס]6xG7x=x}z=nُxq܈gwx=\p:^1>ǎ:<{A4|{<̘ =ј8t w?^q)Çg^x,U탔-O<3;vFΝpɤqggGrr2~WfSޙ"INJ&_ ֬UZpCSծܿ/&_w%nw =Xf-4&_w%|)CScZGyx*>G1AN\+p!w(.D:V} g]~ՒҁCڕQ/ g]̌ZzwaDD5/͜{<+˳~F݋d<܋s_@a߷7v|>w8g3a׻gru&f:#F๗f󐝝wVZ?,OXⴓN#0bO[ugcٗf7 3qWa0pÏG.thY %"]>[oS{+WȀ~冫1'9ky==yeYXj 4n|=4hÏǺ^5wE BpDL-b4MgJ[a`Ū5(/ߋ4Mܵ'w4Zlbl۾#>5+oG%ػ}#R.Y;(Bcr|8|PXMӰ;}>vڍuGHXѢA0S Ӫ]??Z>iѮMe)""Uk⡩{O3$bC*x-?7#݁O8iH_B#ǎBZZ3XYRAiaUϲ,x=0M{/Ɲ~2>x/~uy O4l hۺŸ⒋]GUUU=Ml)Z_.@rBAaa{jxpitD5h0 p?7]k/ >dvo+UoS98 84 @AaݞFDDYW9@3$bѷWOdz*Xo!c!ÏNִDۮb%ŝuGmBPթݼZS{gdZ=OF%*I6aʢT?:ͽC뮪RvX7_qںmvލ=n7t]<{zko7ӎ[#L1[}:8kN=1u:m\qӵWֻ< VYEExA },w.(@yEx~vh'5_{e(((-w _UƌF2F.ODDur/ؓ}|UUwca/3Y;1b{.Eؓձ("&VZ0MOoxn؉P"N^r(Z1q7Vut]GZf&22[Yrj;U{(_ [>Ğ<6gFtp5W౧Ū5kjZ<E,""?r`_[AFz4FNvb˟[C99ʨUUU(//A]@~>x^*lO@PRRs<' [}.<,kL"+3;q>_5.<,m@r S}Mݻ՚dcUU!%%FKKӁ|9տරK6lh!] 7aWYhbnj+j+H/bb^}>y*c:A="^~huNǩ1q@AMg.xodTL7{:,+/=VZS]u[j ude$+z ]qYt^ËO?Z?Rbq?]z}.=qKu\t9t`GTU}N<܋0- oڌo,3?B\uxu[)wߎtw߯.84 NU/ǖ?աn\̝nJ\wn+s_ǿq!ƌ>%%8vHuX/Æ ܗWgC((Xԧpgux6|a-<-"_zBmIQ ㉈N1µ5D.>S\ZhD\>p uW)_DZ""""""ڏUir_'vcb2~xgv~y1y>r"`[eޜ3Vze+m """""" 5 9UY2ݼr W7T9}P5L  qݫ؄'DDDDDDTr. Ծ)"TPsh94.u׋D.q:ԝ/Ԋi\yD` `j,@DDDDDD䊎@B%qy'}"YB0g'\|0~8B5XߚE """"""HyˉS v}pygm-CDDDDDL IDATDXr+j.%S . Æc7.u^jIJ1"""""".y4.nSD$l:.\n'1=bރJDDDDDDԘijk M#ܶ79g]Dډj k@ɏ>:{`hݏPe4Mxu>qEuGr[|]Pa&""""""jVn̷+:o'RY+y^ݱjW*Qc'X11N~u.(4DBNpquycקDDDDDDDs}-swNpeaW_ju1sXvKS<Զ"х 7>#թv"""""""jLVƩ>urכ*\4\i^nS5fjB]?Qc"W^|WXuM;!paGvP{S%r dGwdL]Lmכ,\es"h$)""""""L=y9&ǩbJc+\;L=j,TGz5fjkļvjLmlu*P^ǂ?(7)գ8'8DDDDDTrZ5XR;bYS,a]pSƨ1-D:0嗈G}kLǃWG&jr^.,^3W[5bޮնSLfk.\ēS9vS1oǃ#r'?zx1wn^R ='""""OrY5uSyQ8q須c1)79z+ ixQ)jDDDDDr[5&Obp}2⪡ NvWNJqu]i/JⷞA_`]$ppƹmim:V{ej\mcvmD.z.JDDDDDDgj"i,\AN.bj[=*5t@pvm5&8UnE-hDP /UcDDDDDDD]*jDI4c&хhv8upJS;5Us[}>S\nqU ,܇Swy^mS v؁ ,@nn.|>:4MCq1' M!#""""Ǫm#QwpP!\V'f̘n Ű, -[0k,̙3wN,u>b? Yi3d/H^_n쩂 @Тm6RAN"""jO<WYHػ3>ǜ/xvQcݬ0nX9v,Nz?TDfbS.ų?ì߷rZ5fq |hI}.~0uqҌ3]²,,_&Mi ,4=쇱8Bj\=cǎřc'? wnJ؁e3^Ǐ>{SQ|ZUU(Y3?#n0Ma0f|yoEϏ53kc7COb8DDDpx,⹮Rh?`vv ;vɓh!XO?s\{^kDjZԂidU߿RǕ|o5M&>eZSLĮo_E`xb܍cOCסU дoU=|к AV"7ux7rG8?%OXH* |)IC.bng:/'ӧOGQQĉq#--M3ߏ' yo˲#sυ׻/}iw˜Igch6Q)XgێcqщѤJV 5 /#;#}u3W(PL(Ҙ`,,;7.=7+O< }9,Uծi#"")uy EeH!\E`Z8q"f̘eY8C1nܸ\7$N8h;y%|fR=9qUГSM?=˱de 3̍l ,'^rXl { lZ MV}_=JDDDu. ׷OJ\Y;2NDܩl㎃IWð, ӧOBߟ;+Ho#& (w6% ZCdwTh9hۼz}*JQӐ4wByN[hIh*?`@yi1ʵtdToO>v`3IJ͐dCT4o0*PR\3%YQ=ҚCN:ۃ =9i[2I9JuG* m2=&|e("=+¥_;V`G=EfL |D+X]FແRܞ-5= -f#8:cTln?oj.eB|d-578QDe*db%2ߛQ,; ,iHcR !==^NTUU!* В1Y-0rgKg`C@G[Dgү0ܻE :ڟ$_79wÂE˱AKF⤉bQ]r|๸rufw$ľKb7+g&4x3ġG ǣӗ7~J€s;|nbΫr̀ 3;;2xn?#p{Dz3|/M@ӑֲ;{:.tҹ26ŵ  - 'Lwrb,xs,݅r4/<? ERw ys6^MOFNC0sqa1qϨ4ut:Yrf9>&>{l,wN:8=>fśP$3tpEx:ڟ _;}/>m7Z.Xa{$ˏ`>y- _(Oo}+1q5);ra)܍q Bc(\ԕvTE "u Ξ ; X?BȮ>cɷ37eKp +',ngbJMw5U,)6܊/)ᑛM-Ӏa0-@uQ ?OǍƪ*MF&|sX8sD Äa*ŪYc]G_X |uøkl*`4M(gCo^ 1 __ijo4}j*,=z'᯵`>C7=7°u2ď=]<5m0B~B,\!ƔoS0_KfB˂iR[܀VǖӴk >U=dWaMl?"oFc`yNJ23,rߺר5E]wݎ8+W뒓X}u{td?%Ѓ0, {Wߪa(anÒ%Q%}]˰d! | R[7 15ɤC׬F~>޶#/R# qfaUaUH)X rغ.L~լA >´@BZ=~Zn8,#|+Na Tn[iSaç]JOxV <~/T>ӂeT!ܹU֞ki5-[,ˏ_{ƣs6wr8ò`Kv2bhۮ* 9msj VWAzhۮePZr6ZL>cBFD31ҴT4oQ̖hTC2E*`5.nY㜈m=op/ (F2e fΜbNM'x"$ֽ{w\袋?!Z_,Ea,X78W(a\os_۰tF\14\W~ ޞC00c̿δX](ZhoW܊O>|ع<->^}E|r8~[eX:E,Zq)}>{_}{?K/K_eiu15 "t-3aŸ[ނei9 _~NrZVbǪ/`v&L8gw5 o੅,Z0qޑ!*+>KOCQ[ֽ6on-48&-[߇a(Xr"{df*`Yts.p$w7bGػa q5)y^$ M52 vO:^inyXkO,-zy!٥g4-:G^'2MFv?e#k5x։8hSo gwg (\M@tx<%נ{<GsM ]^{q>b[C"ŢQcϜ7^;x ~/^SO=[ni4,+p-Ep 'PB< 1C0Ud*߮A($Cf¿;,H|kšRoa0uRlΕӒz㨡Ͱ{vl oGq۾<ª_7g$ hx&%N=-|Zt[i#7amƒqҀ4Rªi:.rbU"LR삹VT9cnojHy"F?ß vϡcށNǘ_bIFk_T$^;}]~~>?|ٳG7eaոꪫ0{txz`GL~¯UaXOX,p!_ORo-|_`O+Pdz@ /PN- <}Yx&d X LG4SF0Qe S3ӻ9Bܭ:{4+a0`f_u̿aj5Xfঐ`(/z!AdsT-4(y3OCCR\}iݲY 7bwf)z||Ske,G߂{=)͒2 0LV1'̭qqDDD/g>$ܾ QL2۶m eY?><iΛb?/ƏRK#=GkU-GVȃ4#uP&aY(.Iڗ4E  d{J,gEf[D3e?YiöOmL v*Þ=!Es tdeg 2 EšO>E}\c평 Ϩ5Oc"""}/ޗθOAEEfΜY#<ӦMC޽rCEEk\tEϯ[ӧcȑ|HӔ1 D̫~<ޚN7K,3 XX ~&`ACR#pxH>rޟÊX>xN- Df_ ͓_RKx<'#=9 "EV.'mB'XPWԼHHGRך!Y tx.i,xh$~j"泯`XbCMMN"##cƌW_{'p_FACfNV?T3; L 94vm?'!;':y[n,[kVr~_<‹Gv<@/Xafr|_#C=1tp5CVV4<q&;o;D~"Yb ( *B L ( 4Ss,þ/z'k P@}vCmaoa|Y{( Y!8qIOaРoxPQ;w"""w5<9o&q`UyyyjЫW-MЫW/5<.ml񿎱~=4;>{xA0xPM-|1\#FA8 û a~` q<@]@LW`&+ v%!N5܆_>ز[Pnkn>YGTLQGЉ #26 R2 Y]eb>"Ú4kt715&K@S,\%1޾ Jby<H(vԍ (ڰv %^w_u5[zdwúJe9?~%"LkAΏ+?خ"lX;*v|_UȪ>^mUoR||X9 |>X([{ARxT*ݝy,]a+jxLJq<[().i1ya.7)MRhI\0='>{a-*L(X9 OQvC /",'l+<z }) -2bQip@GÏ@^~Z݌mc)Tu >z:?- iIIHWf'ٓWK`DUj,xn i\l{N]48C2>7,>x~$i HB#{ o2hj4w>:ƞ.8bxeFTY#^wy]'$W"WZj/\ࣸzH dY&LSzt /xO< -zk ܵr[ ǑC[`WvO-jx;ŽSo˜ZVp o͛d;[{G\0- AxŕmO9/ nXGpZINg F+vCZlC&aК|W):L3c-)q~҆x\ah|eۯ<AKqq jfm >YҢx$>:, AQCDT4pޔ8O࣯lu.(DYx N= #dXy ~ aG`@ZHǠ"PjƵ4{>~ |ݶUCIgZxi]+wHTt:F8d|`>')eU[Gއ` ā.!'Z}3]{3,];+B>.p\uIAs.xh6cXj=UrCGJF1=tn ?ò`g9cJR9?}+7nGV1~yc={}it>gn+/9-;°1j#vb".m%m5iKm/@_NpE䔖'?RSS>`޼y?~|}%y}0UTTM|߿oJ_g/W],gaGelRFЂۮne_#9U,3pZBm Ix|<;榣5[ $\rc4b~ we;..OM4NiۜYwB|uh.q;%7QcWủ"""o=;+[/eR7vV16ƫKj655Ck܎sI$8M8u.I mZvyѼEVu7MՎq;Nv.|r\;M9rSQcWGDDD%"zSe<2U! c;>9vtFRQDDDDDMϸ "j`Vq.>"}s,:E$T _3 =NXh_Q`|E=Z}˂ej7Q\$L4 >rss 0m4&oBDDDDDDuD4x^' ׋iӦI#bՉz -HG""""""x;Lja7~{M^DTPTA:H{]"M:H?qcwvCw>x$3$lfg&b !S)b UE||*z*AAA_B4\PB8vٯtGMNzyAAA|b+FBq?Sht{ex=ʲeL ڢE dY    !Sɲ̀ӧMBhh(cǎ}_hՕO>䵦+   >gh!uޝڵki,PU>Ǐ'Ob   ¿x^)S7   ˉ e:tN:#GM2^x 4K.ѧOh! B̛U^m72ojNӉ/Gֳ$i]d܌lȓ;XxKrfoA&.JQ~m.]ʝ;wHHHx-h.\ ȗ/ɉ$;tQM?d-C:_a¼;2tj/E#|~?z },p~ِc|L.@6q6)36^7 sOp%~;7nf5ߤx+^䧟r6$`$_anȬX8k9'ô &*"v$W Fm;$(,RnC4i񥿠G+4 %^ ћN8uc)׀R^2 U=f!(mn㴮6u :gxnr@S1fڹxSs׍-Z3tSq'G*5hLJej \KfpOp&z}̴kJдl0ŗ.}iAyJ( 1=5=Sdq'yfo «  cLcm8<`\^P/*sɃBoۿYw ~ȒF[Y}*Kr$aҭn>tryJ~~D},luҼr~a39ա^8[6JÜ.[IjթH.7sCɭ9y+9yRA l^{ztP&>7sV*ۓ;ܸh g{8y7 Mz/T 2&z A1j3%C)Hn(7eBW5 ˾矒쒃JeҘuygԃxtYJӲW|T%EóS,mgyF8ʘ$s,_}o駙đ1oUBUO~)QB=}+~!D6 Sʆ$Rj$ZK#, ߂Bnv+:23R_W ZM!n"֟nu_j_elO;ֹpn76i=;;d#%S~BNhW+i K2sBμoza*d.=X=ފ:_ueت]5{(isS%oR)Luu(s(ͱ!m\f!;A'ɧG|]B&gC佴}W1ݗS{n?MvE:19Sm;1߻2rbzȎ?5S$DU:Lu471|]Ӱ0-h&VuI؞ zQj^~B>'U?ʰv^zTVwx8{lSJkD*IVt)ׂ/m 6f(I7 6^xHXL"yjh ~2/3ƽݳw" ((~c;:Cr2wͿ "M?/r(HՀҴUBolՀ>WD%Z} kOIלLdӐ<"pdFHK¼xzTL_T/+gʴb_S|tYzy`[%ynOF hJ>F'ol^g}}TCF#nV,[Ő.g gj‰gX;g"x^#jE,Ykm@a߷}9wIK$Ѹ=ÇqO_2\$-)y3yTz1}1Ɋ1$UEE]eUDG< 'j%ߖteQbOW8'\j/ù#UKܐ(y|A(ykP;%NZQ1 -@}Ȇ1c8ߓyvyf u"2h5f*oaq@g4mVaL߰0C9 495֮ci8kAĵ%Ø|lc׺I o_"A4#aGfqFl- 3sG0mƭՓy7/O6{275~;Ce^5^ Ýl[one϶trgHԕTt+AkذzaIS1KumxfȂ`jYm+Qw; ,%~ PR6[ehXcI#TnP oœle3`*왵K-*jJvԆ1i?8[TZ~btջlFcu<;`xVcpejc˹< !7e7c9۴*y' بteq|[kxNo:F~sٲkkllpbNɨkV9s{15><?3FvCʻQi*05ֳqw.Gּ[ I^3ذs7Fxl@ˌ&h;36v;|D -Ґ$ԯ♫$iPqo;7f-;MK9j4ב?ƭalZ ʛ ǂ2f&voU 5d},J?z]H~eK7ngךo(w b^t7|~9ߝA%[صs3&Qw^\K ٯu? D\"_xnv.C3?0hѐ {awFboTc8_&s0f[([kkw9t+ȥ<3Yt!r.b}Z; V1-GG=Ow7>$Đ Sr)QRJABBy2朝\O80'W92QҼ}UP\sSzAy?ZU}U?IT!z_Yw"48 לyz`H{ZWdLKΕۑ~ ٸrdn_+WV}nCr*8VY-I$ ځ|;?O.s]晷V0T`JhHIVЧ:=x(!"pduq;144F˄bsIv#S-}"!o>%\ ɼd %84SioL^/ Ԉ d<CiRFf)hԤ+fM:)"!%do: \GIX5i5rXY䌮WdRIAh$jZ&\<<ܽ aQ auAQ#PϿAB_޳&s Z%yXγJV8>g2DŠkce?k̦1^rюLڕ ;7N^M(bswDzR2w\~d_ޒo~)Iu.g* Ź|/%k/ƥDWW.Êbyջ+HBBQzN&`싿o͆tbT_l ݄e|\{}X8 (u,_&kݦ^#wu“K$Z5ӣ=*G:EvK!,$ fZkZx=DlD)7 >q ۴<`+!c4v #ɶuH"5S I)C,Ǜ9V|2N8UgΣ 7/8goOhܗ܊$eTӻltάq2jGؔReucj c}V-#ΪA617SHKӲ$Zɀ, IDAT|‰#7֝? }X}﫲d=[)#|7'Ocf<<\s@v:%.܈5<+~ŹYٯ4)mwRq$)}3q.Z (z4wd=Ct" c)4WFQqkEWJyqlhܿ|$qC RYșIOϦC)ID>H2H$sTͶ%9ZAx&QqmDc0ri;{/)X8|hZ+I"(D?vdy)lbĠHɄ߻͓x 9_-%x%Eps' n8\(M$Mslj.-17ɥGhKBrRRڛJ:Ғ߂%r*Ba1N,{I'RŜ(e]}jT/UxWNl\0a"hXؕﶤ|y_|ŔKXpb0<4OعK;y(8JA D4\Ѣm jH:-:ޝ'27>?njNO|޶179}d /!6aۿSmܖOn"t;AsN}j5h؍wӪ9$AΗ~3{Lf`[ՒҴ7,;kܩw ]<2mcN iMrGx͜ܚ֙f`=mۅ}Ys&ɉҤ~}ɸM׈OP? ۩nֆ|ִ A'.Qӯ)j?OnQQR}2虒. ƃ$}ZҨY'>fu|%ioї;3򓹄lNiKF9/F9n՘m>c5"PZ6u5;y zwNObgU0yu)v86AOErxz?hݶ t`ܡ(Tedu%iN]~B4.DͷߦV|9RQ,Ԗ2wz/]?I!0TCnKy273>j܈&g3ކ|iU O֍{9ATWSEל#v%;ҨQ3 R}Ғ8QߧMLƂ=(ܠS8+T,ST@KjI y*W"NgUڿ{{Wlut0n\ eK|ɽ-e `nd ؏ك9b O'QM<"nAx58.u[/,ղj1uе,-:@7l1tKj}8-3Uc}mnӯH3a"e$7@S5Ԕ_$$f^9/ miq0N=|j=L3*)uAY}L"gq::_sof'GeN!z@HY 4#V3,A^9˃7h`de-ղѼl4eղf^gKiz>eȬVA?O~56}w$+% Yr%,; s>4$Yv&/Ѡ)ͷNoþ^%^ >vbzC2(ܴKOIs 9G.%^K-+?;͢|H/4Aɑ- #΃Ii;״'s4qY(,kGCwTSdڔ~N:|%oa~'s\pV}|eLLGGXJ2d0mg_AW$.AAAH+16ĥD/JwSB#w    !0J\) G4\  ֟#vSAAAAXBAAA7hAAA%.AAAAxc AAAAX" 4M#4$H}0h?қ D TIG)/;  HTZdOkE sMFFoLegë8/U!i}XTADF \Ӳ>i AAOo=jW}oՠ^Oz$O8WOS/z[Ѩnr/ W2p..FGBHh9.- #n  dDxb(ɢݵ.E5";;4W"P_H2EFY;}9f5W^&!o/PBy$IP;w<eW   o5GO(٣&|\%W $ u|R.W|72m^O?I8s"WΘ1S >ƒ7It`>\$Pe8&=Skw|^ WY3vk'4:u;kZtA"m8~~1$/3~ ɼlްif ΁eiLI.vfnxvf#b%o /;PqgMͦw]Ր)uWZ%sT9{)㌫On @~V hU '7jW$<ڗI[AГx0\bgT+8w/{+|(7 WҪkrлA"< "Re    CE0> 6yv~3wV~ZA+J؅ [Od1ڧn!E!ɨj4a+dEUȚE4mxzе$ ;$fnꑑpKL*:I|qDg'% @| }N[V.[vpB"TԈ焹e'`kCqٲ,jhDrl;\=]"t}VIOAAACDHd$ŕ;2C4s^fE`>͂yq82137$%wžI9LL)@}ٜ̆k$ oOӝFn,5Tס]BZb$deoo{^!YP G8bviXQעvV-?GA}ki|hY2i=6Tḥ8-);w1Lܾ+V^\(4>,oKT:fqѫzt܅xH%RI]r 5GB{#LǮCP>T^U dEt4ڨ ߏlFVE}qzNE3Ҡjc;$:vLtmՁӊ4,W'BOgxLڐUkPA,54!8Ue>5;ɢEЈ<=ASĐ%jAWp=ƹB >8oאY7|˯&e~ҬY(S4Fc&`R;F"e̜t2>toveM?^OAAғsGۥβoeDv(VuV˖ 譖uߖp6q}%>Lͯ$#Qa~C`Zv$d4TdYMŨJ(VTcj8/#Ii*IB@$2BB2")29 f>}@SALRpddqהa?21umRr$Y6a4j6S 4syN2z5/9˹qZF]O'? ҿ[jjNay 5:Rd Nʓg+Zn>k6/݌ G5W뺜 Y;b6n%T TXv_4s FɈoaK-_as%'1V}OȹV7*wtn_̬~WиF.ShnɥkS%uI:& 7w)=3o9:{e˖_- 9˃7h`de-ղѼl4eղf^gyZ: e0]gCqF匟$Yf Y]*:%}vRLoư @r&3/az2IܬЧ-7 ۆ"*Kr1ͮAzů(ooqhD72a,3H4k,Fȑ#/^,ֿTYW='$IuW\  CDÅ 'g2Xq~S3qI8IC甇_nu/X\ƆwxGkNMd-η5*"a(m֍ހ{Zn]Yh=zMqnOl! ['giF.ޜϿO ÄY;&[>-⓯Pe,ʃh'-XjNߏt T4_J+o"fIuWoXǙy]&u {S&$zJۖ܎(G?9;yVw~>G%d -*Na$r$$No˖crq:>LiÑS a'Vΰۙl8 7337AAo  7X x8P _m ,&G)*gǼ.֛_+.{fOZ%ew-WJ..'NȲ?vy0{kvFDVz8%G-Z5.G΀q>iY=*yų~+gE1yd':flA ch3rYp̙]>™ha~z^իS/,#F?OP|?8YB90c,9EupEp;.=d>L^RCxc%Ѕ쬗 Cލ;t2׎'l/zLץF~m F3 JߓK4\G2% ϺapQUg͘~.\C95{0o$qu0&]zI?M ׋Y\m*wj>$)%@8Z(y_1 ZyoMM8e_ř?K'R[=t]YJLsi@&Pi8^8٢É" Ѡy iP$.6]Q3M悓z')٨ E\rQVQ".ѕ@ghTg?CgOGzuRP\sRAyKày4ײԢeЪa>D8VSuG@ !V 9YGjۗ|^rޗ7o^6n˗ԩ1̜1#⋗!Y&4jb4CEdJT-M=S6U)Lb,J\\n:n[ AADi*!p5oK͉NWt`;oR*%{ Y sQFi\<"<)_YUCy2,(y W9x8;P 5;ջKY'6+*ާ:zϏ㖃h-pˇ|#'ysGJ:s R't2Ui{y*_ mϝ<}Ƀd|-  'z\=()gwD! C~(b\s-탇dF ɍټS' 5F%CܼNMTD͕|M#ؽ`$KPM{3Kxz)DOJ IDATx{t$H4|Re|q$J%<" 괥qHN0?Ikqi#Z5=fI(W7mm6ΝUUMsZ Ct-Sژ'Pq\7/Ek9r#,cGR`U ?))H(iDGf#![a@ײ+_RdTnZʲx q H#{oiP0ʼnqmeyC"ɮMS54 2ʇAX/JǴ"$,N&ƒdDՕojv&&1G}HAj^AAj;]k036K%*P잺;PŢiFLdr@^r{Qxz 󳜒,e}op`M=߉UJAWuν܌4 Z|DǓAD@V ̛/ $[Q8~2aɠ%<辳SP)[ҡGq*$_b;\l3%jEm*HX=xF%o_oN7i<3fp"$43q"N hˢKX" '$^z 2UjRV &Qӈa,ퟖ!҄[ Ifn6e  z ػ(> lz'$P@{&**"MAz^AH( H% dw!9g$y!YLڏq7eڑB!B!c-;3Bn'(wl#BlB!x2mE!BXIT!B!BdY\!B!"˒B!B!YB!B!ȲsNٺu+;wŋX,*B4rEjը]6NNNUB!B<$dӇ'N`0GBQ&MD;v, 6D>QU!&:qx4UG?CQə#>>>!B'a0rHFl~lS{ ZlI~8p &|RRl 9Q)](!x"J˥K$d\d1XXbaԨQ;VY(_g !xRyzz+gΝ"I{`q~w eB {3x`:Z!B! ɵG& 6$Ѽ .\ݦ:Ǐ篿J3l63dVXE!B!DBܗ6lؐ.Qӧ#FxAa 4ѣG~z J3^!B!ēEnСC>k׮IеkW.!B!S_i'ڭ[G:X ty]B!B<9$ -.[!B!DB!B!Yt)"KK: !Bd EQp'W\8D !YNTTW|xzz: !z,EGp / .D3 ?gRlYrX厒ؽ{7aPJ\\\!B.^Br,B!T^^ \dDžT7nܠE/_-[Rpa> ʕ+R^=ׯOJvc5!S(66VZZ!$660c 4III4k֌kb6X,3p@ƍ뎓r СCX,, SLtB!B!.\LpB݋ΝҥKꊮ >˗/;N-9&4 SNB!BBd15x)REQHHH`߾}^)HQF QB!B!b\L>O<a9{hѱcG:t耪i+B! s?1 :uPxGO[ho2m4B!B<$&88K&([,sd>B;2c yB!B<$z8pӦMM BQ{ -MrL0aʫM/=xbZ!\yX!B{%W"S)Bv( ftnX,uCcTϹ`f^ĆG9ny2>H2oس#P`)I?ҿGi&jiX,w8ndS j߁B!xIp! 5% b%ŗ#CEw>>靊5'_Lf}(gNe!zj4ryG͕,0)GX `i?g!j;FqּhϚ\!♗ȀYl6|~EqBank粭vk8t9|x듞4{Hm^WMb,/d똳RxLm<8 5ˤ@1=Kj7 80o SX= Q`z 73OCQ{F3])k"r&L\̞q8D}xb i$gD x.bWqEߺ(^ }-Gnz늜n5.Y!=? 䜩|i.,|u`AT30rEA!5=건BIw3DMZL kËB~>{ CHw.IqAp݂_C  gg 41up&oƐ:IScYqD5o`yӭcע,>5RP%u-ivn.eLAxݩlضf` <ߚq}k-~X B R-5P7o"ؼuB!O .##D㍟~DJpLVOvR.r7[Ďs/Ѻ}Y]L&ng´X&\kҴloh3MѰRJаyQ|5CBrK3T)Z8<МsPB!c*Q"n47V*K`VF]a8*7veo@Cެ3R;Π Ж,ꇳj˺5yuvLuFsO yQ סU츘\Jᤋ\J/f7r!-PjU*/lx''f71܃(R(N*ihi;PkPz 6Ůa4KR,';! qk?+ նJ-ێD}X!~^dbB!OUD<Z9rO>~C۶m! /^-n -㌷m>;T&sb87tO9\g[1G\%<5d%1s85T|Yo+T̈́ +D U](0_⯗̪+Z/2αoX)n*ZR8'ܾ5nuLxogBKؤЉAxm cP_7?N;ȄII%Ίٲ{UUQ}l 4 :ƃ(^>xID\ĮmXI;Oq{[ b{y^ڃNsW35'MݢNBUW|]T$aܯYQtIk v兩XluU/B`"BdBd -KF0 ;o6l 5rNgst(PE7{G_⽢Ω߾GFc w^VQ]}?DoXT_|d(IWT4֢CގZ:Z_fհ~{0gT&5=i? 0犌1~K73|Mq?|"R~||q.јyZdש[lr{#+J1aRP.$6oUQpˉ_o/S D%dܹ\T|*>磾#ɾr2nc@/}\$73hw(S&~z.m8RqK,*jҜB!O~CD|Т`L&t]gر޽;VVT'b Ƭ:d,78|F:Q3[JАȯ/fDr`e j!aT :%e=kj Ki uKKM _ UCM<GI6tnF)y ;)۶Sf6f#I?z?gpl≯'30Tգ| 1hhJ27NR|?+w# zMqJ f]'):)9\ Cn6NYDK#y DT_#f #e~) ӅttnF ;cRb9'Nj'~ 玝 q֐g2eb q<pB!Bd -ӧ1 bŊqQz*xbTi䊬J%Vf.`t(ݕ|/Q$5*(A73fKjt6%\U:FX\49'S~^1)3d7Use1 _Z~wnjo<5#ߧڈtzc>^~k\ڵPwuEҡaڲidwBٌ_Ac:>'?_F$vgAQ֟yS0mtKD9F1TLhߗ&Ҿ"^<hǿZ3֟"Zu+*QЊ5>fkt}`ݨ9xś֤kMX7ָP|6jq!GEoB#-DnsB!x͌i\xÎVj@_6 Tnd{ٿO)7~ ۥ}0َ65wxcʕi7 Li?:QF ۶m~X,^|EOr o6ӧOOw/^L˖-%xjdy5o?˔4*}Zc4Ͷ?-)8Ok d).B!}3 ]{~lw͟s=ǹsR۴ii@I ;CQQ.8ǟ!/ ߬\F~RZ&(FZhiFXNCO j; g0_k82tpouٕ L}u3X4^~_v E4LO%i %B>.DQ㨻̙3/// ɓ$%%лwo$ͥQ5fsK~WB!BdIBdsiMa 4gߌ]$e IDATJvؑq}m۶h򍢸S1-.(Duk t[*B!Y"Ө8p`cQ%Jn: @IoſޥB!"Bd{ +)"+B!BHB!ia%BM>d\!r݈u-BHDG.E!!r9} CBt,B!419w\r9D !YO$6VZ^!0%D( X, .BdI>>A!B^q$Beɇ[!B!sn͚5(Q5jıc:Ç'((@Krrc5._Lf"G] !B!xHp!H:uDV8z(lܸ%Jp…4uu]{1"##8q"~~~$%%{ԩúu눏'<<ɓ'S~}_B!BXv-eʔa bP^"%ꫯX,uwlEz믿Ҵum۶QLV^:^!B!E Pꫜ?o;vzq9u.7gvWGɰi0t[v,B!B9Cq"a_(P(]י={6gv,п-[!B!ēKZ\!B!"˒ssscС;vsfx=J{7)R&>>ޱXK: !Ȃ3OEQp'88_ux$Uhh(3f^@u4McwCVpa6l؀ipIN2e NNN4hЀ]vqB'WTTW|xzz: !BEq%-::gHxEHp!(6l]t EQPU)S`_u!%ț7/qF֭axZi7mČ38p`i]Y߅xPAB!2'CB8~Yq!K*U(VXq{8;;IM&SN孷J31fƍ)R$Xo>}zjhdɉ]o>BCC̿Xb7BŒsC| 0dor۞0󄅌 ;!Bdi\!DKy ~5T |hMq?-ݱSBЃi_a_n]j!z}qOH~pMVu 7gI\{u]ObEn@w)OFYT\F]gM.3sQdi,Ke+S; Z|o̩B!xHp! b jرa1;ąܣӅçq}rz3)ׯªSOݶL#03{m[\p_Zįohz~cТTՄ7Gt-%vLArƬε]c+}uZ}>"u|ɷyz9=7{s;S4aޔ 8v,ﶨGWӲdOzhF |ҟ>eB2d3[w_QzT LXL%ºNɻT~O"%oLW+4sW%R[s`979FA5Z` Lj>oPr(kJyGoݒt-ШFUB7Е5==d={|D*:d ɂ⎇9cROp_#EL&lֆnqTdHp%ߢiݗ dF6NΌ7JXzތ:ך/נR4﵀?bl9?Fh6AU8]JwQѿ]}ªVf*?B!xIp!HvR%,NKJEQ*Sz4 =8NBYn"r9f]ؼd4'X/ſ5ڏdulZ>ҧg1skܰu{ dMlZЕ<&2}M[v<>̇װi,@QT|T/Yn'B:cA)М=j9/_;PX3! _&gUX†X ,W|?bOW&BVzaĕܹ7vG`@83cu 5膭\d˹-l^I`j|[W0!ɎI}~&n~N8e/~!me纉Ծ23`X:kv>=sgIa(koM{Eǒ\.s tcwرc=Tw><6 R,[~Aٓә\50]t ?m>t=|#z.T6l̒Alt8.O!B<}NB7?%?Dn%[$7tw斓P.,D2yvpVJE]v#\ k ᚳ*Պ\<~c\7 9_i*>燫f»p%JGp5\TUT4MCSoI`-5yo|(ޢ>Ob%~Z8I\':ތ)v\rCZs<ƿ,W%W톔:MgX8i5V`2nF^ٗ-Prܞ?c< Ԃ}-S!OB<4/^-n -㌷uX$O^L) I-_8^>:7[8|%U5>ŜrQ`2)z Z5kog_M[={7[wq+fn,HO8.ƛRrr FJ<4g~X>9aϑkTgwOM̈́%,1H-SkиDfo9E 7GRKU͵\ރGA9oG@/uGӠFSk*jOT-Nĵ$=7,UIbqrS!O ."%(s:wC8]x C ?h"n]Q& `}a|0&ӐF̼];<@Aŧp:{?S}7{9ZOϐ^h?zv۔wzוO曷 aݦ*+IlH iK@EQ ;H0G6ָ*c'mH$6W%/ _7 %K{돪Ly#hblkD!+_5(Da/%ף٨ֳ,d8t=(q(*ICKŽ~feLFNWmAVFtjO0VBY<A`ݯ%O!Bo4yp\MgI1 fnoXu_MtMC (*13KgW=| $OP] Wزj77 򍨕#lǨՈn nTh\U3X=[=v>8FƎ; .\$[ez=>{({NGZ_59Gh*KaD3;Uƈ!"B Eᦡ&eӶ? _K?q 0oKsa0_bI*٫5♥LtCCS<#wBH !T*3u3獠KD{'1QQR'VssEAŰ[bٿ8nF=B!CfL2y~%Kk1v um/ 0l>\؆̀a7l<"^)R4ŅB< ;>!-蓇9E=78he{A*(֋aǩR5]ȪZJFPN-^lۏQ(*JF~)tۢ3p2nߥr\ߌe8;o2G⸎w; q7vUz.F0fB|+zZ* kҕD6O<Sr5[tgip ֮i-aV6ԪV:g!n`ե6\ZRj(j#Dg}BG*zB!Wy$BXuc(_$. s1WafbYuٜy5΁kЍim`ǎe _Cnآq,7ۍص{fiA>AT굔V2yۏӓxE,M]Ν^/ycqXcVɆYV- ,ן-gml-,q?Fa1ٳh#>dUSƳ|'x݈u-BHDG.E!}\?&,~%N*ZPۿ#GӴGy;' 5 LM0m$w/P5T@MCU3Z\ *.U<d/M*8딖[X :*&ܯ2lNr oXڼ臋R}s#I:?1 3 ӱX!"DGpYrX$ .qNUiBc4c:}pBCb]'9YgNR< mpa ~]'Yհ8EbPe C%(y.o?@jtmJ/AM̈́[[T׉t"#׀|d\Oϸ֯0VÒr,fTqJY K{ !7_8IlB{Fj`BMQ<< ۱X<&\<Eq*xHfg&7l~l2UCUnDwz2p#+XՍzŃ5:2Z[nA={3>jWM*i[>(;T}|;NdjFgXT_<{hx^M(%r|}|B8fBgq!R%GgʟW|J@T<chhJ2'bC`i!pPϲi۟$:'tEs/ 6l≟¹c'3OGZjT-ؓZZWhTD4H7'YnD )"/yK^{ !ijHZ\vs!/jc@5Ou}xe {gtH/O e:5˒ouS}6 xn&{?BAr !B!ē^cیi\v_)> +fj7lNyݰRnLFMڷK`Q lj菖?a BU0 vkrC :nXoPTtCI--HQTTն鬷X,؞0j3um ]Oy ̓+{u*ղ[/OQ{m$˫!Nb1 -|QPW&g¤V sawYY~f5 7`kYU]([Λ 0fB mB!D"B W~'SJ(קeQ;kmf qw_Y |JJaiBǮR77YյKxRPz/W1?~,X?:p'M2ͩVSѬ9i?B!x6d'K!xz 4wy4Q"94 _Lfrs}\xYтJrܸ* BjJ^‹]W>i>"և[EM(ME 28a.%#M3Ĉ:[vwb>yWF [G( !ibr!Df`ܸqñ87npYݻ7ڵCy6DG^Jrި^w =?%;cw\#h+̀ҥ xGa٤rjoۑ3?${~sm FWngQyoS-c3}?nxoE,7X?]fHZLYK==Kj7 88}>ZH=qL=gp x&v@4Zׇ&?eWqy!t9~ٳg3f@UGTf-~4'47>T27&y=/4M V3~yc>1A;;sdCz7HlpaE?ޚU>o:{\>`^yUURB ŏzCSp z|[ꡠ(>z!9{9:n30sqpz/=nˆOu<+_&~$>2ߌqE`XRy7-H8~|ItzC oa]!&+k;zOcCHd%`~OT(q؆ܒsz/ƸR׫~Tg;=FB<\y>#UT==kYLCoplR ' og碕KX4*FA%ZXi>/tdix1<# ,Ž+sljvYخpZADܺ/@lR@_H-ޒ}aJƵ(rx?L TN~`{MOkٔ9l\.+QFeB\;Xi]ǮD6ЮT0>A!ڔrf4!D.}uk֠F^,Ց'@-DDD*Ņ\WgΜcǎ_J?qeq3{lZjuޯ}"׏# -FbiTI">>H՟}̂"2qD'\Ϯɒ99r4z^7gd:7T N;ff}9kwEfbƹ$u uo$v_ڤ$K̎S2+)yn;N?;i400 pq2* ;"?ޚ`\0?'Om63/lKyiQ:źZ]d\I܋0pK1p 'H!ݛMw`dr{B{@F&ĴpRA_Bl$Wb;[I85_tmX)&vjEbZ'S[!AGvE8(T>`zow>va3Q}L\.r]5 6\"Crr2]ve֬YnZ/[Gm[U5]uuk6c~WFBN'OY\-3гqnMnXz_Z/ vU>Ky4s|FϽÀڏ {AW=ͪm$0hh92o3M|:m'8+Y&6)pi7nDѵ3 bӫr+>$~-ךG"7cKe/`[YY&=R\p|-N SPNV\ybE>sZly0DN'Sϣq6V?;wF `[X;봱\6Gp/>7?V46e0٧缆AgVOH=خ,p﵍i1m,;c{j,,\eZ>㱇~42=˘l-Ype]/{x~uוHs=" 6Ho[,GH}H1MqbrZ.}?{x,{vyGĽlg 轎ctȍmU*W|ҧaT Nw5FM 5:wc1n2._ <ǽ2\jY&zB111EDDD\4dt;2 L&fj+>3D*t?$s,=vvy{5 L#z0q6mt~9+wrϋ |\arn0l;/q?׺Ҧ(zxnn5?|wUQvV%r]F/Wjժ~:%Kdq\w׵o؃{m:NYTِ.P`ųQZ\ `ݛ￟Luٳiݺu:|*Igoq BڌVٴ~riOZz JDDDrնlO , 55={=IIIt҅3f\Hq5}ለ\ :9Dž\6˲xټyy\L@@wQ ,]O?> *...9 l3gdŊRdIlu҅I&e*m˕B,bСK .Dn ݿ[#(Hᅈų*TȻJ! .ضo}^xs=G2ep:dziӦLj^rjYZ5zɸq($p"BCؽOjEDDD0 `xW?D\?~~#{=ڵkUٴiTwa :'N0}tjɅAD9C\ݻwZ4iÑ0 rK+W.>#4io͎;Xt!"""9m:gtӿ\T":ݼ\ireINNv={Ņ 8EGVN~KX .DDDDDDD$Rp!"""""""9:ԩS`McVueDDDDPp!QiѢK, W^&x.{^۶xꩧΛ^= ӁZ]ZsQ " bq_v`auxB^豳~iҜѝ!};WG!2]_Nb܌58oDe3%LNeLɘ?pB3Nd≌= 4Wq̡KFF=8o[OEqs̙ܕ"]}csMtA}h}w^Nu†=}ytb2&a T:'*\u=3<+Ǻ㝏݅f><8fzq'+3q\X#E0a[osҟ""""r]yH &OMư` V{~T%ҿ烕6MW0OmSV}"5_b̡ | ~WfGDDDD.U;\H%KHHwuK/c:9~֩ݝz1[5 b7|X8UOt)˯KװpZovbRqb`&Áabl(UGK% 1/W"?BҶd0>4JNp2?,YAڗ '[pop njgӻo}^nam5S(ojV/Mʉ(=X^z/Fia_Lr}1&]Зc$/ȃU%q0֔ ur4Ȏ˗SZM>1 wǫ4Q!&/Kf5{Ru^) tԕR~&#DDDD V à^zZG}_~{k.((ѣGӽ{wNnNn{jS(ia`&dt4vD~: wP`T ?1QtQ{ ^0`\*t~y9F޻afjc]xiĦs>3|yL04'9ڮȸwd஄mN{Q?V%i IDATu w/3ff}9kwEfbƹ-|0&٨KXozk+2})VNB<83lkMJ8+ #7mFE+E,;G^Kas8 ͛=a8AׅY *3y嫡D:qbZWFDDDDN;0X"7o?gzOz|}}[i۶-<  D2|l'o8aA1&1I,H}޹{WŋAܱqp "4$D4y]d bB97O|<fC)$>}4"[։xs>ܭ6, _ĩu(_@ۥF)g<1t >D اY=s>{Ge &>><,YG|CVONRRɜ>}[2x`r rnEc_2m-H9ft5طsQ)*s F*)J3E5_6ǒEⱿ8a.3VW3Yw)_Ÿ=&Sb~Ny7zd$5}'+?)'Me;q/+V$^0""S4;6!wd_ƺ/%OD(ϝ?1bȢKf|Rr.a9|>;2z6!*ؤ99SJ: oY0RlHa jb{O2}b9xj/!@ueyÑK:ޔ+amʫof܄^3\fûiİoj/ ~AE܋k`P.Q]2<:~,5z73N{"g<7f]`IDWx}cPչV s0o=5ú1XOnJ{!} "9|m4'w WB9!<َm>_+$M4Ⱥ LsSOZX3/zʏepr]W?4/'<;?Mg`~˜WRiYo+bIs\ m 81bNf?F.z, H>z?EDDDDK=mjζx9=d0xmMqx`>N: 80"D$u5Oƴ`vTOkŶ,=k,^GMdN}s_?nF*h[.,Ñնl~sea}Ragm ˲wgFzm /Zabba8rӧqx+SBý m3 lý ec8܏x_f_wCNgH|cB#id`{Lwv>}[~^ڗv\11HjQ e gGF]O/6reDDDa6߬@U2m-?lRŊŲɟ|Ia7 p^㞯3-q{< =ӛrdf9]R2Q ,EDEE][4E$Cz_`FSap0L\YǑ"9zb{2LLsAxMӟbrvtƲm / ӝ?~dz8"z1̟\B.K |ĉkq-ضĉ1M *x?%u6y-{#}Njq!%""f͚dwF͒%K[Ye{nv]Efț75#ϧ""hX+B.Ybg,bΝY W3 β凈Sm """"+?l+V28m  DJBDDDDD_@\60x0`yꫯҷo_"79}EDD䟦{)7 00`sΥdɒ-œ9s4h5CCDr\'x_],q!W4MڴiCfꫯXv-fOq8*TӼys|}}zKDFFw>n)V j&..]%rU Ϗ֭[ӪU,aD#,4{$!A-/DrkHNbDFF]-rM(\k-,4T' "9 ɱt$""""SDDDDDDDr,"""""""c)KX .DDDDDDD$Rp!"""""""9*""9ҩS8x0 U"r ٶ]$"eDFF]-"":uc'(SAAA"r]$"_(!\HsaZZQxqvGE>.DD$IHH 00лXDDD"((H .DDDDDDD$Rp!"""""""9 ɱ\HBDDDDDDDr,"""""""c)Yر,|:+TL*դ^ykL'hξ4ZO[XgX,qq)l֊Eem%ilِ:3d Fv6Hs8z*""""rY\Dlˠ|υl۶_Όg01_oc_OaufQn()>_URj5i=GOl,׵8طv9O!mdm Wƌ4yY q[x8 鮹~݊`S{;f+_f ?EDDD$Rpq2}C)R^0Ƈ?bWv<{G[7f4<9@Jɻǯ= R:[<nj=GFXqq`qGk qtk:?K Q)]}/fVԭ]__ۜ>WjIz h?Lp}7y^׫MF]xilK8tZÛ3yhf,JfC^IOfݠ<|F=َujScXNAۃSA+ 6`szL>ԊzRak{/ja9wvG}G2>>`SDDDDr~^) Vf5l~'glߌ?SNh|֮[}˲uHoͩuϻ9`] }hV܉a۸MKM/w5,X9Qat;G5kfսL.+j9C_DٽUYx$ $6\Nt Ȟ cXp@ PCr"F<,moށkb) lZA `%ݜ~cZyWTlRK|kCӣ=eIiY4v2Q'l-Naٽ"79tt: -Bpg^::xNjބ:sfN/Z5QVw6;mHG/a|ttxyٳxOےw7={oB6_hZmC:wNR o';v3cu?!Rzb/:hBxlėխgi;FlLR0MO\Gj`':X΁i镲9z>u߽%~ξΙ7qx;|ks}D hD٘w8= RWׯOfgۉҷ^4=SogsT՘/NckLT ^ܴݮo{NZm<~}e-eDDDDn@ .nz>G IlZҩL~N?UN:Yt)VƧœ40M4M L)KvEb&{Y`^'ڕOOй̟pW/,^rZur>}e].+Es/X+; ?JǸ$73|:MŠԠd_mB,46O,aŜAT;)+pOP-6O9#SCf|2pO/w8˹WIVsbVJ#ۥl߂eۇAhX(Ό;)T)(Fmhذ!4H=@LW?fDD߉>4vNuqw^L]^czQ;}{-^%sprkM*Gs,¶*ME u5o#x 6Yp)ȀևRv2ń?2`bv/ot/OӀ_Y{}q=87q0&֑ i$=Xp> K:GXxw+0S0w,O-O=  8u$"{~8 "b./'DT % wEq<4^Ȧ姝!5Ws/9@L{vp|pyΰm"vw0+4qy{Y@vgr6:Ud Hh14ŔwW|[qjq'V&Lp:HZfzfC3.g|IAlpOlgf gi0>V3""""73I,=3ͷ>s`Toҏ4.8c}fnZZ-~wƐģr _)IMc6`߸: [Sc缻b?glf;Ľp0`w{Ncٶ;` N,̟ouB8!6p‘2{W))ç<[x"ab'淽'80}B)Zyθ<6Onj}\R~K S=~7ÇχiDzeǭatO ~~0j;/} 7>zׇ|ξZ=؜.#֕Pҥ3 3&>뼷->W~GGYx ˖,aي|.G&-Oeg3Fw]D)e̙=y'p*l<}.`ӧ,5+m׬@zxg=o|yQ=҉N \Wdͪ|;ݜ00 Ž&*N%/0_yXj6|t 3{ٿ+}JQbE*o3ch>R?yH߳ +n3{g4 ›;{Q&ƨ4Oi6D{D6I%2 1]q,xkQN ?/鑆&[=Ng<7iHaߒ[߇~ӧ?Hiimhh=T;hTGƀa<\箧ݭ 5jԦ}xs.+ R~CZЋ6ϵI".劇mx1i'Gtvl%'P#g\zw0vdLT>)g`n`ܛ^ϛqKd-L%OT^>uQ.l4oڏgST;;®}1K*<33i3n6k!%*&2PP&[k9l!aOrQfy= 4(U'*UY mK'p8 .<~2WN_36Vܯx iȝos WDDD_L,0MDLtyUŇawv  d~ϽC.#) G0pgrJLwpp/ۧV.4awve3:~zCVQpVϢe`Ç a=^āAٮ6XI$Cu+.}>ɫxÿ({Ϟۡ^/->[.!V7Y&û=LpҤwDfDc{x#oYVweo![.Q]hVƏfX# EБgOcΦ goK00 'ϋ(9|M^h<ޚi8P /cKce1xh nd6ʴKag'%ZO`S# &[>F絣3e~TIفk858 RN/Bn0YnoAwybS Нt}mJ形srՠ~ޥl;M"k< s$ƌ{#H[ /*Ma_\9cVeWQs{hafN|<ƝuFp1a=ErگIfEsԒ%x|i~4> u5\ M.>ɜ~-Wޏ۶QJe&.-?PNp=:+*HDDDnm TZŻ*۶V*U]u͌7=?Hs. kuF1r~WrƸcvetf9]R2Q )%=}MBޚ0eID.mV!@j+BnJ_c@ƭ.ߊ""W}V(ڂW0""""rMRnN]xa:@\6fYxt8>g#""""G\ _DDDD*"""""""9 qnȍM#9 qr],"""O``wCDž8ݿ[#((ȻZDDD争g}DFFzW?D8a=]-"""r]A``xW?DHADDD"gQp!""9NDDDDDs~ IDATHBDDDDDDDr,"""""""c)KX .DDDDDDD$Rp!"""""""9ӻ@DDZ:u&!!JDDD$G1 *DXhwC\uhʔ.EPPw 0 "I׾ /r""r.?~/[r)!$$ʕ+Ӷm[ (]-""""""7rI>|8'N$11۶ `ڴiݛg}=\EEEEѦM~VxDFʕ+YhZ_܀Dž\PRRڵc֭7Dh~v]%""""""9 Çe,aض֭[6l >j؜^қOp%pv ߿<4QgW0?( Z{H ͼ_ӣCEI滑6u{s8z)ODDDDҭ"Ǐ3qD\.WrjժEܹ1 #S]NÆ HMM=[f6&MgϞ*TcjѼ۵J~H﹓ZIGm:oe|..c>Yfb[ɥ/FZtQa&G=x¿鮥xkDOFv pp;W>c~ϔ䗞q|ź(R/ZqxX~?CI1(Ua^}wgoK>joBi<[2޿H1yq.L\?2k|nɂWY |n;z1rg77bR hMed,z-ggMX<%-_DDD_Gd/ )))Sk׮r92Ȱm64h@rrٲ$ ~raO~mRgx 4M>&`p9ш۹/N_,F`zgoo@ Yl4*|?2^H5>!D~ZK93;zt8<J/N0Hd\ѷΔ{y|3&j8>:Q' ]>4_L_~ c֡x0p&'vۧY3+ UМ.ޝ;)ۏ~Hm{'G)ww`{a382EDDDÍd+~-j׮M*Up:8;TR:uPd__'&_?_|})X5'6A{> v'dyۜs>rM./1wq6_}싱YRɖ$%RDH_Bv!B%dhlcjf}ř3gRƯs徯9uǖN=8[;H-b͠_4lؐ{vɛ89&eHl}/wӐ{zwV!No^:F?M{#f<:|=fqpjޜ6&QԭՈa뒱lkޥg6owG=@9e}f#ovjų~#F>ۉƑD4L;8eՔud]Ģx oL\~uEN*~;wC1_ TnvR-+DݾߡbV ݚKMM"tC1g`aקh~kqN|= sq\Y\?b{Bqdw9}2B%JL/;b2sžb"Ngɦ3/E|">T_&)>T(Lٛo \ɶV"^':^_PnjۋNW|lIDDDSBrEXXgeIHH믿tܙΝ;ӯ_?Ν{6WoIHa'xm ޤQDLIH:Q/n6,O{`,ˢDD/?WWLv  y<|;M`, /̀9fۜ]}&"r,_}*ct?>)9cirn͔XYOl72y,+RIX<4xs-eH=y]v>3_ c7`烇h7>Yo?`ƭh;Sۛ {)5]YH(܍ݿS84ubb_t{;-%.2NY|̦Qn})Nߊl3L,mZ7x|ė쎵TvoSݻ}uɹH⯆iRA]xc.+MTy35}lRp'mXaH4^bN"""")p!0.Ebb"#G|k׎7x>>7|zr+\chq4u:<̭}q@qb~69mcehVDʪ-qXi`3xLY-׷R8.l_WpȕȦūL \.CJ( C:nTr#]ЗBP?}o۹ㆂ;VmO}"k@~f ڛ_fcsXVpOERGNvzDv~ԇ11bX[*:2+)d@ #:H;q։3f{v<1|+:)$D:ӗ{W>z krwy,f>V}Dz}<7f1iq=~_Dny|d_zʾ׷L^ƃkq+p==6EҺ8qR歰n.'a]3i0 q!m۶ѡCK8bbb1bӧOg̙ԬYS8I<˺m8:#/I̶S$F26))V7SES̑95 .QNTV+sjRXg`e _͂E)l;Y!e/t>)L]É cqmvqt{Lu%Rz3VNEsV=Ҍ3.:HZD2y3¹j?̀@S8/ yFˉy=N mXZv p&,L}4})MmGw2!t¬+,(SoXbRuy|5t=Vr9`7iޠ=>Ά=.c\I^-q4~ғb7ct 'O0tF"otÛkͻqmf~/ODDD?G W,\N:=&,4jԈiӦѢE *"9 QP1 ^58aSǵ-( Ӂi@[]0)X h[P*coh JAG0g p2$p]9?~ dq$gH7㉤l õ \y ^6p>u"#0ay~0"C܂ ÄY_X FU/ OΣ79 aiBʖ`FiGJwm&o@Py|cόZ#y8(PG67!o?@Z-O??54V_mk{Q;macdx01'`S*EZgا1cR(up[wYX-zRT*:e_MvS=oDDDD5yxk(lݺGy<-ӹsgnz* bՔl?0A M ׿ZǁH% Bw5o_dz~P@NcoqH#fǧL[WȨJE+2L1#-(rʔ/_0ؿ?{B||<۷g֭xd'^O'q$> GH)jv 307a$ޝЏ_?I2~ /z#9f{?,oAqCPY&,ot1T*>p_Ӭlr?7?m?ʶm֬]GZ5=mMp{EW̘١@ZR=3-+#n)Z^۹Ӟe򚗍f\?&!!~kbڵԮ]uQ^q-_ LG[_I\?nix^׳BIXZ6`-?}PYv>Y=m>ַ@lG#\0`ax~^^b`< 7L`~y?.ԯ '"""ߢoٲe ݻw穧bÆ X|9nM8k0ox˲e˲qErXD{{#qBz9UEDDDD5q!m֭DDD3Xt)wy'aqʕ+5k֤J*ڵ+[ƍiݺ5a\}&%Zɢ6{_N!""""oь l&M")) ˲,sg+9qYq^a^_beʺ+""""r)p![[m(tz'""""""..=cfN']v 8Y\ؿgVk^}("""*?Dž\5krJ&MnݺYu8~g6oLڵ/`ٳ'Gk_D@ ,ɷ ̾ZSB.aԪU5m $**PΜ9g6ݻwgݺudKII{\l!!!DEEa.־\}8treqq8t r:B`{9FeYYv⮻ޣN:߼y3< ۷o1g%444[ޅ/@R ""O0 @)1G GL>dٶΝ;iРUTɺ{ٳg.+ҥKӫW"r+P@)8-""" \?*88ٳgӰalڶb׮]ڵ팜3gN"rSDDDD.>\ՙ6mAAAEԩS5RBqaТE /_Nٲe=sUT)-[FVRBaPfMm)a7!!! 0۷SNk!"""""=._c!!! 8={|r6nȑ#G&֮]F(p!fLLL;~\*4)PmڴuY˼Z⭯ޞ_H[ru{f?}aip8p8ył۷ogݺu99H-[ҧORRRhРգ`W,p%İvZѲe|gbcc9lD ,aHxx8aؗO] \HJ(3<رc,++?99+W!޽;_"3gp)np#""ų/ .䂆 իټys`@~Vzu ?EeGDsψY,3Wɨ?G@lu~ 'ix8? S+!""""rh%KOLGzҼ6H*rG! JPNR$ކ Gw<2QO a@zwL970cY7 6T{#0 @K7(tux 6E2NMdG}xw#FiK@Il^;5ZiPTuGg[0_ʽ%}}+L Kfے uG>4U"4q9HJ;f0!PqL4f*k6gyb-V-V0W>;DL8)Wi+]m IDATa:@wsݔg3zƴԵ#sBD2dw<;g\XsXR3CXYwNAZjVlKvQ( פvX38,;ZM!q$rtqxV2 R4|qM`ا{ICDDDD SBDJpS>]XkH)'őG/=UPb4zY*{֜ʶfڞ9|)/CZѬEKZ>=_CѢJP3R[ VEdIz/FљF A垜A15fh  ϊ"""""WN^?kV/|i#3xbzyl[_5ߌxg \#몷⥏l2f<ς#l+'Ζ[^K8 ̥&.~s0} _i˭M6}U%={ ߯ZcY` #73pRV-|#o{6,vd?T|c)uƭwW|L_[3w뎑17B*RVBz7r*4V«ףj|W219VѺ/CC)N%|JV.O⥹f/̑$Vl#m7?ΝtF?|n58j5Y`Y4/O!ő?Nx黈'B8 TY4a}X73;KWippړ;T'#;ӧLˇɓќJu2uCO+ԀB$fD&B(bf1qX\Xy"L_"""0 $<<<*QB<ï77b¦U=?9!LaՀxt\:%Ǹr{a'ցtzxOj-? #r JN_%0*5|2%^XH>ks>b`: -?̙3?y*HppgHρC',ÛXFJR,ι,CFɻ9FKtz;lIW8s*gJT(⋓8v.["٫D8ogTl/VlhRl_ؙNR!`nJ*8oy ^S-(:{_R9rkNDQG͇RUiX^ q/cep0*pr{g?8ЀTkAyIr$ى"1@G&֔܎[޹ĹpvqCaD_"""r 2|$ocIr;3ydnjzyl[HۡH[ \H[ \مimGӼm`lszqZ!RX7 ԋU[.;ayFQ4>;RpH>v,_l@xwwlbK;iq T=rpr.ηkyo|t>x(dͪ%voK ,A+\;Hn9JNow߳n:?-}K]ywr֭]BX>Qh^"焵I_J҇3&*>t2S"} ЭD6jBX~sű%xa&-FV&Y6rgۈF-0`NXNΐK;v 'a?9dn簬~z4O(؋V9?;,}ylED& OLwn$MέhHv/Ꮷ/8!/\ftRbԎQ,v'V2O'6B'NGVw'mi<~ ]mSImP5OwG~8.7/?q_A=H9|sQ_ߌéȕ[@|4-k2 {bFM8?ȴ/`K_aeY\:ʚsKY<oJ/w[JbZʫ}gzp }˧=|(^: ~4t e'#d5&2Z}r\>{~fA,/ҍ `>#Hrv\a}u4Mټ|/ޤׇ'9W,fFK|S26A^f|K?gd#{gX)?ڼ9e+0q9_r$9\7Ç+̾}J [}迖"*^ZtrXDD ae sEsW,oaadlgR~v>o`yVH5&)>sԮI\(""""C fQZh I[ W}b.gkɖtm ɇˢ8pnH%3=tl\kmxs(PVD-qd6#-o aSܴ-f_ruh%Rv֡O?屜RIb3-o ƁB=£NxRRbيԁj`Pc46Mɤ7CͶDwPM;?rXI$cI$Es?a%`@m2Se\%aLwuqd2vuqWm,c=Qi6We{x5C šb…,Yu>e2ؒdFDDDDszf_&iF͉3XGKZ>d}nDN:]8EFƔ~ 9iMQ -DA|yac!,RX>qbVF]D Ie:ˉ[-dƄ]$%5c q乭{gK$N"v\e VORZ3 _ ,͉0:pD~9\PHpb.bf@ )I$g$'' X(I"~8|>_֔'a>3ɏ+4ef_z}[~P% c༥sֹ_7a=si<]t%#oRq-81lI(x 3ƒViSĜ0B<aSǵxa:0I9_`wϔ+dD3m�ay~0"3N&35XbS'Oedr .i-pipozuNPP`m[r9@mLf` lY RD'b0p߂xZf|#kD8v~҇Hw^1|&8R1g|4N?|`#61 t=p…~]+@5&"Hz$C;C1(tW3+hA|<'*ۀ2#\˙<ѕ|([Ip])\~j$p0R9;G5 ӁÑq\v,{ޫ*'JrR"IpUl?K8n Jn?ٳ3{s>Gt?Wl ~glx%X%""""L3.D[ :ͨ鿁Y^:˸wX\q{!ھ,NLomNq R`7+,ބxwB?ڼ~sS&ꍔ ^@xDƏ X>ri dI}fX5Ep@fGH}g"=ZLI`ccT| W>#y?aPQmFwB+6kR/\Qf)>cÇhRRHz 4 nxd4#^Nu50bH+n3R:wlᏤ<}5`T:ÆstGX[hMWӟb)J2b+:PhرW \)y}^nyӞG;cp}5Nta>nig8 8zgx3O_TYҬ?/imԪY#] <ٖ pdmc,lđraq>mcVj 01,\Q[yn00gma[nV1;ʸfV˲7q7Kkdzn篛UnYYE]62o/Zcfy.xa㏛hP |^~+u#0mj`412q8_UDDDYmf:jתYmlڼ۫W,bƼ?ب~2vYn]4vKvF^'v.G&gYe9(>0d1 L#Aafd*L~-v $ Lӳq>xR `fs|qŢ^rWr>-tˡ"""""""o)p!""""""""""""""o)p!"""""""6˶{n6l={'<<믿+I=O[bccY|9{ѣ9rd*UDʕ[.ժUD2RBhѢspdytޝ$Νĉ=,tЁ+W2w>>A IDAT6l%K6l?5ht:2e O?4NI?iSO1uT|}}HBǎ/Y 6X&ҲeK TD|1BDDDRe\RJXa6 %%H{H6mi9sСיiҾ}{̙C``g1iӆ={ƀrСKVBDDDDD\^zat~'OΡChѢ'NLgܹ4m4 àI&|7ys)4i6mZ[A޽/؆\4KVJ7ouE۶mt2sL"""P0  0sLF9Bv߿-7oN*U4BDDDDD E</#q)vؑ#ha&ML O3/>A۷sk}})f͚t5G 3ұcG{Zlٲݻӭ[76mڔ|0x衇xrYk׮Ԯ]3[DDDDDDQ \e{W(Rgv6}:b֭DDD0i$&OLÆ /x #PPB 6k[""""""rm}(rEe"##2dH[4iIIIXeY$''3i$ 42dQQQ&Ns-YfL,:N;[d&aq`J"$O(i_' Q4s`;f5dUnH]|\6}&~;#F]ԿU |>e& <@ ,ƿ4j8]'z2WD/_L\;*"""1 \ӧ4hP+V0|\}Q|||NG}4Yb ĉ"WmTyfkֲ~j>-+E[)0|Ǻc9ru~ߛY zYH%&_͚qh|>6g7̩0a|ΟϢ/ 6sgc#6?wRDDD4B.۠A5`6%K䩧SK.?ƶmcᆪ0g6=tRׄz ! *ؐ"V(MiJC  Z:$ٙl&@@3';l6;{:ud`Μ9L01!'|̜93xVVVXߣ?=S %Ź]C?2cSܐ ?߳5cc]ԇwF ǯ uN_r?nŸ8\ HKyH^ﯰUf?.~bW_w6;l ^C1\ >׻*K&/UWDٰ`f}=kN$^u7îTȯ:ѧ~eE_Kʣ }^>vs=MY6n3c2g_GڪzШoPɥ">UXr.FʣFaҸ3^KĤs2րE}~͏~EB),[E08$:9.Qix*]|Ui;`8Œ$lů)sjO"β(7/)2r/ȡH㘶,z>^nܟQ;?9aۗExk7t,5^[@i% 3Rն;FO,Bѝx"'OdMF4 D@@@CQԩüy?>1pXb>)))U̟?Ǐ ӵ܃9߲oE!ؿO4ul7ϒߓS}XSŻ|d-[3 hFO/܃[lܲC_=II;Iȷ+4:MY(/[g= SH:<p=[c,mO.^J>:aoW Wy;y4wDEL\cf/{r\fOvtIZ̻A !Kߘ͎;X1č G# NOy[GfuW9ۣ:PDjsb)?m_X~!kg~sXWutNx2]EZ֍ر(t\[6m(Ѭ{K :vgPZLXqiʬ3)%IN~f۾}l_NbUHj[u-EPY{Zٍo47[W杩e[we -Ri$_]Œˍf7w-ZFxS#B0V"DL0![DJFKPPPᅪ͛۷o=-*Us2MӘ4iR2!NߞڵjQf-gɔ7T5^ʇE~ׯEeڗʀ]x-Ӝ+*RUAk")4 x?C9[ܟ^<$~tm!Y+-O.䳷^ѧIq-pݎ&'}<ţ'hIn&XT MQ ȣ:ƍx JPE5`0L=:4t;aX_ %(%}װ+\#bZ {͋bp19J/13Z{ٷ#X3>ժ§B|V-GsdjE 5iYlPU5>HLટY378q~\ ja?M'Ow7&n, ȹ>6ӷ7U (6/өc-BwB؜YCŦ8% dtB!M2TD͇uހm:r `pRTcU x= FC/P1 \]P҆><)^kB#"4ċ y)IW(Ż'y2%[a۾qxP3縲藙3[gm(kg(%d I"ˆ+@یC 葄EspV'%@i|Ģ.(+P\x}ؐX;S~ɵNAu({.N$r )~Њc\_۰s._gbOƭ[@F)韷U#)0GM{$46?\ w׌߹jPL+B \7dQ|y틕6mQFDDDd 7# __߇7oK.řWLPPJdɒ̜9ӧOΤI;wnCOxRj"K=qG:Nd5!-|žbO(hQ>͠~9僈p"5S4bcbɲWE4?3UڱxZG]]څsnFFz@a.=GڜZE>'ݪJi:]:{㧇`l[{n%@F q/>&Ǘi6h:onK>}%511fO\Lݴ+xqs"v(:Mft4.Toኛo#QC>B! xm1v++WիWcooeD:wiVXANr -lmmYr%˗RD2vX_B31mўYf=hRep= [vAH=!SpU]: ׶3$T\뵤'F@K$Enhw.rF,Fҹ cLN~qnhw>_g>QpteuW1hNgX4 wAO?"N8piו_O݋gG%1ҋOmc˚^+1cq\A{}/`t"βry0I**qaU XP'Xƒ9_ӧV5NXȊ?1h7Y;;2Nն9MYq)O\-4XTMk{3GGG'5\Ka儳M.\'rzhXzބB! .cYv-N˙ԪUVZ]Ntsɒ%XYYeݛٳgg;;w.zqxK.~YzkjՊZje)KNN&000xr)։:W=,3vh}RR6裎Rz?x'F}RkYS_}~>t<|1>SF4hҎlJy:ѤI |Գ V~[! vgF/FoA4iЂasq,JI45 մ?.5P eQeZTnN+P?Fú!H_\-0:+c8}ZTV#hǶC 0J6HQ H!6 V*J9wqcp5Qf4=FF0cH!6W} }ˀYit6zM/!FV592nwXt%co7 BlgN=,[h( ]t!_|t=Џ+DNEnݺl۶"EWz*Tm۶ѠAG>ܖK.o!B!/ .DQJlaANEbŊܹUR%vܙCmɩB!B!^\\qF AFõkyׯ{lCSWNmB!BBZbbyaaaEΦMQo "##yw^:6lx@9f!ijR!"1y"ʖ-k^… \4.]JFh߾=GΝ;GaѢEǛo# ,֖eϑY($Bboog^,ȵrʡ(J!00]һwo\]]QU#Ga"""4큁 ƍCQFIhhhz]1*"[…Yr%OÜ={sacc' TR4iEy( ŋgDEE}v.]͛7q-[rEJr!B!#x"ʕ+SR% u ȸqZt9B!B|Ip! !B!xB!B!3"B!B!,*"_ōřW !B)`oo'N9B!Ŀ&::;a+Sj!B<'&&^""B!57BnrZ!⅑/%K $yxN$B񯉋#_> -Bb \ .B!BgIp!B!BVAQ˞ i=s-_BF _:wږV~e0%Z˺ƴie=:עR+Xưo,3߭B_B*P6<ƉH Q3+EԳIg9zچj5_Bk4kn]L`A?h޴)| Hu{0?M5Z}3w'ZlF"L&MhҶ7.\Ô^}sY7)gLjνNxQnjIw捠g4m6o1yN OeP{<Gg[qҨik>Y3+xE3Ù!oX7E}OҚ/ʇuӬ% ^ HLkNh ,Á[nՖR?^q=$Iƣ Nq[xS~XgnziD]]>> dƁ\zƵoA%H$ݟ5d,#ubW3_{6O-F3`fr,4ӺsX>-K?W͋ngxyE7XX>-Sv>Sw>`Ɉ^5mWuɚR{ҲIQ4:n$0cP֫Khk"C?_}/jkAב;K @<|E]!MfMB!g$B\Rע9G87һ> IDAT$k7U2wHMx('U=|?^㷬 Zς1znXiwҚӗ o2LL=$ԒαvBi+ٺe9_ռDSQ/:>U1fDNc .8~nF'f2_bw´R۩8Pz;>m; [©,~OH`s`'j|87+S@vm^}I3u-K*X*@'9u`#=f'S'kf fwo\+VVRu%$[PQǚh_uҌl8:Ʋl[M"' b[ Lix?6atZ&FGoZCu+M'p>m@K?05(T'&xUm?ɼmku|YP 6c9o!ϪkY0+iA>՟:eoVTj;vppF;ğytcI,=9w>DUW,X *Ⱦ@iێ:1ܷNG 4>HBHp!e(Mj~Ixx@rfrajR"7pݏ>Mcoi{v4q=11VToӞW0X:QsGjFbڰ+w+W^`U^/;cc ios'LCO9ˎ]qޅ Vl QOXf<sjh];,=аNPS;T WCYK(]w }qu.Yե՜ J#oǚyRŵQWڿbK Mrٹ&F",p=7q},]^-\o ~ՁRx}#k/զ]SӁNzFt8@ei6mq^Tu6!廾5hdk-;^X+\:~Gzd$_f8}#uzoFv6+CE7Tz ٩jOAm\L?M9qvoѹ*G?>gyPݨX2mT0xPnC'NdQR~ʽƞ^57>i[h7f-6;MvM!B*^#c;mey>Ϣ6ŰUQ#O",LN!S=@ fNbƌcwoEôe2oG3Snyi27J'b;4`WTL!Ntdt"o&_7M|`&ynfmè8:.-{puT|7P_Yw՛2BlɹL/䍺CgR iʬ OgB\Z/ŶԬWKET@REQqߊbb$yOn&ksl NEv˖sĩ. JYsluG1 q%F]qʕȏN&UyQؽd }/$}Hcшƺh9^q2v3wӘQ|89*}񀮃D5uv/eX$qsl^(C0$Ǚ$)eJDr ײզm+Hl"CZCQZکQ- #WFb8l6h[LHŽ?.ۍgD^8})swǹl&*HzB$olex2(p6{sbW۟fqNmn `wh~|sѺ9)c)TU X'IVzp9KB8ȪmLFSbe)d$)YV}EcG3%KX{>Qlj۔UXv&@ɟg>~YB!x$sVLҗ*",2OHG3>x"BԬBR{ ^C,(m{A X 6Av5e3WLܖNcѤI{>{cޤirAŃRX854c%4mT׳͸hVU5v5}y׷1Ma~YR@>T9(iاwa e;^fth@.9J7ʵ ]Oi0f^2mRo»~3zϺA'qn=KA6N;~k6lW=?G6T< 5iZQ)h߀޾ QGPjAO{ÊASj9!4j::~U\a^@+h߹o~~r4zomHVhg5ZvLdiı?ÿL¦J27q5*04DA'ԯL}c^C?:cΰtx{O;'1Juϴ9R֖po {{yrq^:y#?ss7ؖUO )_cnU]^)!BWDW1h-M\[7|Sôelc_eszGך0qfl[HMZm櫡b2[Y6ăat90fa]#p &mHg~1*yVvoJ'IH%(K7bϊ!;4wDGG%iT߇z;3h ~&$B!/ .D6I{n<%D zө#VNTؚ2vҍ2ِXڗOib :-0(lk]15(e׉س}V[ZQ]h ZvNATrviǔ3[:=zRKWԡ:wwB:EѣK䷲pCWԸq-4B12p:>{a" >Øz+{!xvNeg/<+džAeB!{X|ŞuwG!4YVq_/L8; ZX@39k %촂jP1B!B②"";]G31-Rۿ qf|r_O L⁜U|-W d"DHҨ]Wp>FHN,^$gŜMF1q!Z!3'WB!ċJ\l~jTRURՄ!0{FugTP a̷]1OjkE 3^CǁLoתu}a~%L*U>K#s$L&9#&&ּX!"OμX<'rAe3μn'j駚i"zڢ-LKi'㧍nBkJ+GHL/t]C :jaF]e===t-uOEAUӶ5-mjHZxEUQ%q4%]u͈F|C+|2yN>μ*O{Y!B( ѼZ>޼X?EJg)ˍ{c>L#!/TEˡ߼vTq秈qc\y9^˲.Ec~LCUf|HU !$(+:b0y P,a5ER>Pp~!̷%%?B"oJ EJQ(}90m)Y"o%,e`" {Gci&޹dBrzNB!^t: t/;/q7ɎW˗#ZSZF~5 QϒW^g(ٓm >ґW+hQ웕ӆߣo G(Fתt.O燠?`O|=1UЮnb”%|Dkf.T:ŜX{=~,*KYc)0ۏ L'ིЉ>SzV*OC%,oùo_߁3YQHmדq诰vՕvCA E6,9(#N1!40$Z1! 1bT:!O`tL1M!s/O/gŏhNy +;bXy6)Ez}8wH~%}۰s eN/dYޛ#٥$ook\_D7휘9aؗM3u2^%o־w[41VY)y3o$)Jj<7{V35%{o ^O4BtbvpGa;ol˘oQն5SRB"s 7ncکtHZ۸kL_dȷ| QU{)66V8sSR^I,]_i{U%ޜlo6DjlܶŃ ulSŸyy/lܺ埔_4Fq{}&fiǬmѾW2~fvmGOmLZp#K.sIPUt"wOg&LXkb|n}>PY*8A4OnI؊۳ٰ}cYw3YS\W_ ض} *%{7߉B,,jjWq4`W%Cj(F~K.ըw#&Հe:{ю͊agaweDZU*8@0XQ\fwM4RU3k;BdXm EZkL }Z,N&͖݀33ӟ1.1Ss7iѼLk/TFys҈ Bq-ڀ \|L!$ .3cKF3Iہ#Nz^=yB3EA;qgc꽴;RYD5(G Dzv0a d_ql$vޒӻ*KGf N.XWH̎=15#IB$4\#y'Hkǰ[43_yR^9_QhvƎYS)-RQ2T0JftP3$i}L_FU솳iVlGAA@'.& !ϛϔjmG;S@8AmG<6c'b-h׼N-J?)e2uG"_3ɿVMRQٱ,L⑴~l$ \woso##(slgxMUZw?,m#-.bMP}T>[st "a?\t"""K,"""8E}g=)cON!s chtwiGˮ1ϫOu+ǟ/Y#n/GnM0x!tNo a`-~{7mW{ٕ_{l݂fsؓcƠo7ѱM;O= 31 5B0_䝍9P0#2rl(Ja7*0i1nMm;,=t`Gİkumׅ^FDD~2^nu 񕝋/yb cģ_ӯ++3ǾpֳCﹹy{q 6rBR22_Zؽ(g] .nq&6ȸ ȿqٌgXD$mn׫ ]2/Ç3/(?-7NUׯlg2v.k]q!""""Xضn''R3'sQ~"""/m_livt@ix]8XDD]J\ȥaۜڶ[^gԏA`HFw]0 =9H=qLerPNk d ~ zɗK؊i[> i ;6QQW^/N|{åNYڲ7=I!Li $N_my3FHaI9' ~%^l9by=ܼ8,"""""" J\%a$9o$åޞMUUJP<1L7uZ;EDDDDD29.oUjop0MΩ rrb<<'CpQ5KWC󁋈W(q!2=~U#0 ~sXYF. wBDg l)q!44JBBDDDDDDD1%.DDDDDDD$RBDDDDDDD-q!}.uDsgO!gHJv5!QB>}A3rBz)My+%:#5 Nz+~ whagXDC$$$8C""""0 BB EDx3,0%.$_I> ۓ|`'aUH\\GڕU uEDDD.X||P_9.tVW@ /ʕ;J.CmcJ>_A*/\2aaT(_:CSB.Ro vVHG^sDp+(Ҡ#[a/"?%&&\Za$&&:KEP*^"Nl;"p$J#Yݜ#@I2 GR y""""""rSB. 0U8#ٝ/`,/""""""J\ȥu) r[""""""rYyH>ą[TD. NwY%""""""%.$Wg)o8gud8J ),Y[1ttF<,u5oxoW ۱L}s[MkN?1C?9g8Y#-ޣ_3j_DDDѥ"1u5lcVcUqL9 cݸ 1{FNx?_C^.ǹle/=_7K}jYY/kIӘwTvJF_ۑ;>,+٧lۂ1d<O˞]֣væ}#'nOQ:~OEDDDA UJi鲸,$/Fw@*¶ 75Wz >|6{?0凂\3WlɵicyX٪/R~f[^Y ;'?ZᵛQ Yց)z_E99_kj179v?cW\`'u_-O5)q!`Pe_"j4#t?.Nx&h}pRQOWJ,3[jݙM$3/ zvhCݸ86 ]=HǰDN)lbOcUkxJ#'{{\۱1Mٜb)/pW4iܜ==6qdiݺ 㟮`om|h&gg-X;6O|8d$m;{ХL>x#(R2ݱ -t+N˚hѮ<;3ĎcgZD`_Ƌam׿ŏKfP\6?DZt~j_b eagyz2ȸN@vw֜x-Wz$SQ:x18a?I>n܂frۗvf;|>:Z7nBLՋ!nXz0-F}˒ t(kbŨǧx{[" ~lv`ze013|?e)}1S#O?Lft}NtvmNSMnp.K~ Mvdluy(^⅓yfF+vg4^n7U JVGj% \}~?_{66ӷդdn|{V`{+i3y||!y|:&qXy.oeղXw#9;m7≮cxsr}qKXvl{<>OO <0n3؜\ u9YDcNźؽ0dw8?:varM9224j D`${>G~`Պ b%c_NrP]y?M X< 21]IAo0}2V}?OI.X:ck~m3ɒQfҶ@B.0k?qRF<} 3fSRèDk:m.\]?#k>/n3u(bIj*FghVwF@%ŷX3+ŨլXf!fͪ6(69^cUitf!>k ,fԹsm)P1v~N6i,/}-S;%Ȁ&quY6>Wڮ>#6wyn,Ff@搯2]Kx{= I|nĩ͓pI4!@"~p,\w)HZrEҫ+?w0gIZ=Ԋ4G%qh5]vXM(Bg*FD fN~#'NlxGN NR t9:Yxw#CYR &=V==?H;/c[Yo|`gX2'C+/㤛.=j\0'6~ûeL ~V1Q2b''Qt˅"""-]D$1Ԗk[kkc #e 6KggP՞D9]$d[<ԕi,a'9z<xD?z;K*¤H"0G-(k$9Lb14α uΉ6ulswL XѳlC^b`xIM*XG9t,bECmıسj HD0nz/2kHKŤhr.YQ/lNϸo,qM &S'9meQ=[3չl0?-iPp6IT~X f8COqva`'&>-MwQѳyaf}9 ~?%hd"L0Oey^0 <S+e- |7geG|1a  kq_ET>uҏf˖󻣈9e0Ӽ$Y̤E)V"RK-J 6 ېđ1 Sx$Iodcs|TVJ:%XJ5O,o]E?cÉ4R9ONZДYbtx'pn492'ϑT҆rI(wm6`tnw?p"ێxl\~>wM^]eN8/Xktc4hՀO}x8b"~qQmI>|td~~֓捛Xw(ޑ'_1q0]ڴír W(.m'/p 7>'Ѻmw.rZBot{H26ׁm؏h\נX:вݵ ]\d~j( .͒QhӢͻINլvֹ(ATm +/Q9tS@aw>}]zgS.գg'Kӵ=hP@i=ч&4lwO~ 3BG_殰ݱ; |̓;-F7Atc~ǞgTM&Wu(WNmiӶ;w#1,~x /.N!yL#޷9L9(hn<ݕ&meRGXu㍃4V3w͒=\O禍ߤ#7=RkA^^nuze 9<6߿_W-&Wvg.}q7>gsi{qn"Eq/h78ik6lHL# }r!omy0ٶeـr)Z`]v`ym m% 8{IG6kbbag۰m :; 6^m?͚hݲp%n¶ȨܟsiK2l/۞ 㜞똳kgQrT`gݯ,0L02uv}̹ l,ζp92 l#qlYW~mYxY/o{9isSDD$lf4n u7P^=gy>d^ Q[~eof9^Y-e/;c>y"?nH>L+< au3Ǡ}~L̶o@01rXΝn/VNv.01pȩ 81gmHrɹ91>7c^%~4rcY8lζEDD䲒eೈH~ą[J\Hą[J\eDDDD""r )H||ZDDD/O $Za\صg7˗'44` ޻(gHaJ\e/"<w$110aRҥK^3,0%.DD?!"kLًydef& Q_fjfT4ٞOi229%6.a0* Y^D IDATļ6vNMa4+JqU@uDDDDDD$  _G݀޴d^6{6}N` ndΡ4bmud=~n4&ggЭZGץk+"M\\"11 aRҥK ?L3G$qct3u8Os6ESc}*'{ЦUC"şyTvy )-Xt i] 59yTlD6{ ͂t+"qW"oJ4D3)݅ 6$nG"N'ow {a 3𤤱ࠍ/ SoJ'+%uu9+[SS P-nDjb ϮKe0~>)<ጯIwr?gae˜pEwM]P56)Lo+3;Q C\\GڕU uEDDD.X||P_KE 464UąW@tN LjsD:<ѠjP([bnQ@1cgǽIMg޴L`'2e/&$ 11+s;8 pٹl[D.D%-DDD e.؜w8nj(W`v+҃y:MA;iJpt bA&1ui MA&yRm3{ fZ̸a )6gn!0ȽWoYӓb~hJ8 >;×ȳ 8g"""""")qqK 5 R`%95%20OOKO#nܸ'әm<~vn{l."\7pO<q[2D^yWW&_۠`څvsβޛS2CDDDDDRC(D2Z6E-~Fv}۶X2M2+s 6,Ib=_6|ۅmᷯծmxnB9͜\(3eg'uYheĿӟgRŶ3ށp:ۦATa7fb=`Z>d"[{9qqƜerkr>'U:G8:.g}{""""""wJ\H-^! (l'RC:""""""7aFAl4g^,} lJ}䁈\- Qq{6ݖŞOoahG7AL3Zv>>n>9m\tqL҄ݞeILVO->_adzT?~<#~2a3&9 H?CiФ= 'o򮙌Ә's$lzGZ^[i`-5Y*WwF[U c:Sh֝UL|bRBgynXOn?WSW{^:kWkd]jg\{b.ݤ9_]algc"^71Mes5~|!_:{XYxuE2t|.jo-EPxCS0$gog8>0g09dr~߫=g &`n g?ކs Y6'Nbyq]VN㾃M΂Eɴ?L\q-3kd.,o'֡~bTO|*eM*˅̒ z ؜\1ZS>,#-akOf$mDE \EjӺ~1:׶8r+^V% 6)e D,fDȂ q^ٗ:%3{OYo"""?(q!""EU^Dteq˘ Tf[qb,~ic~?T[e;N#xF DZB&% >ğz\%̜nP^]~ZrS9kٖ(ṽ*-I=ԅu9SaTؓۧ2gf#y/{R\`Wfɻ[F~)HoK%}@rf0pƶ[(]1@Ν!Yq(sv G6} K׺6GH}qJy/v$쏬D Pq;wr"&DDDߣą\0gi׸ м6zG:P8<*[cI7{ɞԍYnPP n$l(4)@ksxˍ4 c-ц#g>ڧX{ϫ<\zH2;1KUkˤ%F_4mFƱR&,m_g*f¢oM)ARj|%!ʆI3 hیyxQ1 IF I)g7hb 48-dVa<޺HI<~G 99byԼ~0=aHV7pufVp}2elܴ3f >^(P0ԤdEjr* U dQ/6P yyK?JC$huj;e:{sU槌}l&CLg\S±^<~bnկ6s^B2}ߐ{}jww筽WrO6q ã3oTA1[>aM&~8y&Jg05GJ_0u~[! WrY|dzL(|nA8J޷>ɤChԪ"#cOʸ#uD9{ ~ {at8iM~FƐ/_}Ouo+w^2-JX,2MI#-MO.BpuMx5ցUʓ4iǬ&6ږ&|e8IP= ;P BDDDI]ADDS1sJ+\Iw- c/ZDEރշ1&4)q.1qS<fƘghm\Ke3y?Q˓Jjjീ3:r1r!UOӶ2yq^ۙ%#)Y2%KR58<)ۜ7dȬa\Yߝ= znJ7q '\[Tf;,ݘ뻗I?pܬ՝#X7lOmOVPC{h“pOjr4IC&->MN( {|)7ߧ}fT7g^3} OTvj֕~ˇKjoއL>Ҍ.1!MLd#';ЮSlȿO ձ/r;IK{r 3 ghܘ.0z1eiq\]5k,N3_smE(tl"{֬b H^wĽ?}4k"]~R3ϭKûsniьFeDcGC4ix;ЫQX3šӻm '! 渨G͹ oo궑\xd>fNL bT0YM%)={Рc,c見@ŠXbgn\(V$4y/;qc}DZGpD5֎Itt{W]s7ѧu#ԏIa IIQO؅#Y\^_NEFRSt坓 25*=r:˭Wؿ\|__ӯ++3ǾpֳCﹹy{q sw_-[Lksaٰq#1"dunY-"""ض+h2o~z%һ=| =sic_+{3Wx_+s!v.k]y)N.OuFEDDDDDDr(q!""""""""""""""o)q!"""""""""r3t'{ƿO 셄$>>Y-"""'RY-0UDD.{QQQڳ \vCTT3$0%.DD;v"""AHHA/T""~&!""""BDDDDDDD-%.DDDDDDD$RBDDDDDDD-%.DDDDDDD$RBDDDDDDD-%.DDDDDDD$RBDDDDDDD-BDDrǁHHHpDDDD.a$**pgXaJ\e/..#ǎS*:"""",>>]{v(y/ӥ"""r +WBDDD.P*/ρ!)q!""D%-DDD %11Y-0%.DDDDDDD$RBDDDDDDD-%.DDDDDDD$RBDDDDDDD-%.DDDDDDD$RBDDDDDDD-%.DDDDDDD$RBDD:;iCPa4Ѱq+:\;'k^ׁfty2Ďo-=i4[{ykI-\<$գjTQӾ,+z035;f]FTUuݶw<{__65[QLxl;S&MP)ϴ{csr,^;s&KՀ ykڈ [pߗ⽾ ߼wiă=YEDDD.J\%IYKfu8XY7/ 4޷C Hegq[(9 Gep 7uͶ-ذ+^ġ3_!q5(DEL^p>S`Yy[7`(%` v<^_ţU3᭓xߝ]6cc/~$[Re +Yd_SMoLDDD䲠ą\2r \^́XaXGf1C2vEBJLKDY>Wsw.]ƾ FQdz]gz6'~Dz*8a\.\`ViO%9 iu`:oLp ee"B-^f7>KL|s |M!l;]葹(aC7tX׾J\""rY)8EU9~$o^͖tm\(T׀ZeBs_$+Ʀb14ʬ<)?ݧ#WuE/S?L}˙4&m$m^/EZЮVc@mIkx!㉘-҂ MY""""_vV\t՗JO*P?5rJ[XǝŠF:ܮJ"k=7ݢh{x;hR0#c:SeXB-N陼oxG_8Wtz(Y22c)ݘ뻗I9L ʴIIT.0K侾.} >[S/XS h>(Baèz,osm,O*TRSSIxZ^8;.cpCE$x0-7W/?9%5 ukm7– /lRDDD$""rVջ3'O`{RHѡD|7#8R`Uh=cBcf IDAT+".eZ s`fjETĂzPudfF+*BF=yyTrx-&^X u2_? F">l!5`eMьHn5 :_y ƜBw}^Sx FRI/^zw ;[VhJ (ێyz﫢cpk~eb~ewwzv=7"z/Na^r:zv3O0 ͆i k֮ujĶm._A_~s.CF_{wgY]y{jiފ!`K@5(cFɌK$1 aQ6䥢11/CDGn"#ƠL"Ҩ#gt=lw:<9ֹmS%kf-rz ֳnc dqƯcԍ-zp`$и#Y4.ȢqF eSO?qX֮];w0@Wvܥk0l"Xj6mڤm}QZn]L4s.}ѦMb F05%I]۵kO^dYkhӦMڰ!1`4.SSX> 0h\E,K=4. ՚5kk1 w=5k1UCua{ѣ7mҚkcIzX|^~1q`|巿{FOeZ:õaÆFѸ0tSSS`dѸ#Y4.rb1;99+Y4.ȢqF 0h\E,`dѸ#Y4.ȢqFJl\`}rm\s~e+uw96.@ nO<KԲ,+l}?٘F5z!/?0Mt]҃y6.#1[#`wKgxVO,mp왙W#r+'<*k]I'UV4hzzFw-ݵ.=t-=@<=do4bSc~EVO>T߿'yuqi1VMcC><vRW7v}Hr{fV'c5OǩVa ȪU^g{uvf/?`z=wEnܒ@/NύjMnv:޵~xE7u%uut{~ORSuoh:FYmݺ6 Nob,((ۻV{z5E:=g-VUk<xy놭[m~vI1r~uW׭#>J'{.xnOF82UK^ )Z?6 qö:zSuWK.ї5zK^m]_,׃A>z~V?v|Bֶ?~zu޵7u-7//^xv%S;_˵?۬3|_^?uE6} /կK픦-~^x֙:W|}sk^7(މ^^ M~7ETƷlgF_?mOD&]G^oStެOv=oM٦oc,?Ry.ImWٸ/yש<e3}{]޻Wo"YA*/ȧ{NjlZЮmҽ{hޙz6BQ"7!~n/ji5zi?.ͺGu֌Ig({}7lUzr==G/?Z_8W:6}_)/Eku'Щ/}45lcyV{-c|PT+WS7/~0E5~7.}]g={: KPi!IcZa!li_v<[k[LNXWdUo>Vo9Ru_mX9q7tśV|n}hZ_ mOtLR>[M_tRr7@ ϔ"DK!cfv?\4?{|w7l5֚i:q|UMT~7.Y[M˕sFTc2sX/@]ǺAbǟ;_]dF[1gqS>By^ox>~{=y>t:ԧkll;^s>͛ݙ[ug67Sڣי[+uív.e6{ Dz1+`?Ўv/UO~>h G9WI\;'q?غ9ţu~g0e7VZA:_~W?Ўs떷\=횙{u֫uݍҙ=O.fZ JzӻztlټYcS+.O9d]{5zk^իWkKa"A>9t衇=k>z06=J_;w~nƾX(iLONGuw=1ڣS.x#'g-!}iʵot_wqZ-k4~>qkS)EuvC}.VJ}g<=O^$A#:=k{~O!LzљO\Htިq'˟ӅCeJ]zz+/^bpʲ1~_~@O~ғtUW*[ӺGo:? nؿަ=KgT<|]xzK_zT=㙇BIcK߼Gzk>=ZCiӚX-Itoxg{ZpNybq}ڔ}S3En]cI|~4}IhI4vVa <Ƅ+1<Ȩ[O\؋r-+MQ~olK eݲEnSk==Rs/ZK[ȨmS?d͏ZULZ`>b>W3~sR:64j\Խ eu re`}Z̏E,խa5.78\FY^6}cܢ댜^7.kk[̶T>܋ұNMmn\TI:GNK -ĵ͠UovUͫFw 5&=ؼc&j)VtsXB8&2}'bXxh&[>Y39=N홙#'wa &&'cۿ:H{.JFD P.o:,fc01/}6#&;w7_㧆y';<c7߹O'yVO4JٷO_}:vmXN۷o1U:@Cھ}֯[Su5n}rkxq=0څ*nRu{7:Zs"y4G3yv6>XVgzQO?}ឝi^CuqSM"6=Z?tm“j*߰^z&e;c06Iyu_ qQ&+}5vq&gGlŒe+LMiYإYMkuڰ!ReڵLǦer9y~6.~h7hs[ǣ(sHɲaQߍq1Sg"S7ƯMk>Qa=ZcG<QdW>{_q+K c|_9k :)C;3~i(krQ*172Efuekyr2Mq/8U"L7xʤjR1M?R9"`j~r=ϩ=ƤXGGi\J?lC#~~`4ʔ0HyvXN.P ;.r}QYfAXkugsQe{Q()Uw~Aq͌5&|%i=ՍcQoy$es~HR|n;LcU"հ^X΋y:5] "UuenGuXc1ƃ-7֌:ˍիWynLx{=^8繿$ey| +%%.EO|s &g%,X.i,Z{nuS=v=;~GFk5r9[,6q/}˵p#mkO΋si%ry;g`BsD;7Oia״Ƈ5beLs|rrkX*Ǣ}Plhc*GqiO5,׾`\i}~Ƣ\3xj^t^q+.T>47?܇s\S(-|Mi%q4w^5OWy"`T}XJ|j<6`&?,^Լ9:1fk6ƹ?T+ŻEFگS<[oОִ1cOEk^7|"kum-Ϳw/63lL"K`9{mLlh1v)[:;b:EeT"Wzm7!gs!x5-5Z͌Y-l&4u5f9Z-kBX,kfܿ6c.T`T=`Es[o{0 ]۵z W7~sxO qar,:c-6lcre4jL e^[οN;bdB񹔢8,7Eh_lX4/Ḯxxl@jb>ns^)QsxuzbЍ"Ͷ;ohq-jO@ 5+|¾ӮkO\'/i{?-s1`%ԾĽdHxlTY]_M [>a9?_ױn(6.Ro_\ mk?Z\6YT #r1ߠP{kQd{8/|>㹶ϋؾh k>[x ͐kh⺗:vE{܍Gb<4֞^ganםfD|BZȰkkٵ}"V{1Q*R&m-Uo 5|K529 bScו^5.z% 7MZڣcܰ5FyD aGQeGb>m=n\j7ǟo5 ,jnjoN'+Qay;f1ׅ53_[혽cvX,msMĽbݹ'}.ϕnX}FgM ױ6^1Ss:6Ef:ڳ\L ↄ) 0&Cޞ?avޮg&潸Ԥ^uż}.ufu*¦mz][y|kSA5.\7?_<^§\Zؼq5ZX{mOgs˜xkYm]6r,eq(c&nhsX|=]oc khs _~Xb}7Eh7ǟ?pk<mD]γƂs{_`9]ێSvx}>*ԞJ9Mzc5R1 v5U1_ImO qkF>crq/֨[oJo Ƙ> aMsck;Sqy:h]n [ s똓hsŪ ֨ S'7T>&K׍\6éTLZ|S2slmV;r9_cqؘi ;/Y;T1b^Uh +E;yA,H5,`{¿Y﹐;ǚS󸮫I-,M6qq85E Q1:Wnn)GKŤx_ qarocvseo5^. olbK:Ex "qQR nIDATEEqX6EqcubCrqXcB1R*Y1QU/zשf61x_PNj_kb?U1^uTj#qmF>8ϕnX"ՌUu<751s>q&ąrŹXcSTH*rR:㘊%:>o뢚5Q*^KbX\j?Oi\,n|D :Xy87Uy8Ҥ)x&C|M[̚ uE1ߠ(zm]&;pڸ](nR8,c#U$Vϛs8tE=Usb3(i,uLU<΍1SEچE\sq}\.gs|]Y̿W@|NL!31^/mmG&>KS1>s&82ݸȵp7e1|cy_sk">kcLx<窜)R0Ž]Z+5qN|Ŋ&OcRu^U,^m\S/ڐM7~>V'^6kTlrUk@/ZǸ8W6bRSU88Th|a?q! (sqW"ϱS&{ths9y*V,_lWmKZV88/M7e+IśԦޯXt^\ۼ,V8ƹuTjUkiq3 5XWRsuשXRVSkכܪ576|xǸuKS1S+90 lIR1)͋1u~4e瘸k5I5bs)MHq<'-~ XAE45_Xm㝼Vj$Tmv;Q皝mĺ8Ucm\7͹u9BjnR8UMjޟ^֏ nk֩ץ6FZK1)Th*D/Ћp5b.&XKb]\SW~l\^ӺT HuڲsT]utrDl9EX'7 b}Ή8ƹSEz]WK?7u]FZ\WuRWu9R:Iq<W.ʥ⩘n b^ʥb&Uu:uujƷ;+j:SXHSUW8OSzU)t>RR6S"kߺ׮['-9PՄHʧbQWMQ_EZT O[.Sn]# 7~T]Q!U+ͽyJQ(ne9FQ7sEqS,({E5Es&Uԭ6l7חc++{1t]i9tnzNo6EMyTVWҤIm#}u&7]{eX\8`861R:f6b΋*uulP妯m}ӵsM)T̫<X.:LWʧbQibJ&k>ƪ)Juzn֙XtkR:Vf5X\KXkZJǤxz}=Xz.^*cqұ*MiZ߱R9xX|x]@sU{|*Ƥx4ʰ6M_i):I<+RV[Ƽ,jS1yJwmO\N6蝜cUL'I):W::9s6ƅنsrEq<XzzA/^Q(.NQtw:=+FYN>X^6ruuzNQ\w>9׫NU^WcNmUMUn͹=1jnO7FuUNjVۍAAmNںuutsnQv9L6/ҫzIozuusnQw޺=n^sͦs5=/WWשkЯWetk6ڃ~?z^]/fWWQ|O=:}6z.Ws_aHwCA0 j" ubmƇ umXMan- (l͍bc`SVFziY6)Rsm4)RشWiE7&)PDtX=1lIENDB`kraft-1.2.2/manual/images/nl/context1.png000066400000000000000000000307541467704360200202530ustar00rootroot00000000000000PNG  IHDR w pHYs+ IDATx^wtfw@HBI5B B(VTDUxAET{ *{:!{Ov3 v>x>350yd[olB DԒŋ lM h8BqS'̙$d2)AW<==0Ć(7+% ]a5+v l67jJ0o !7|Hq͙fnFAAAÇZŦᄫC*&ԀY`CHD/3_4Ŷ97p J\INZ^QJ[?p^={p6aקoW*X]IiQ%jݕJIm&umOͿ3$0sR\+M.kFlpu{\؁NWb48v{ \52$>Enl JNhOeNaIOQjOWBg0ceWDU=Hdǯn ٵ$ŕ4Tꌋ\AFa8 Wv8@uf{EɉR !=>áLJ2Z`8۳Mo>kvїI$G5oGe rrg[WBh`8u56Dn e^NolE@S҃!+| BڣD])N͠Ruw낏tBΜө#TNDIIs ~CD@鋻mg|T?pGua%jqmם+["*M2\UIZ|"Zr+Pgce&{ >9Ȱ Zl=O~P\@m/fh#瑑WJ$*H!@=\ I:CIKL;-h}]BbFf,IO-5Z bjX}!&#yU!USTGp2+/fitAkud7s)WaUh]iӹ]۪5}b>xM+vcDOG[>'Çr5Ϡ |Ft|4vDھ<»P4u(f7G/'.]pҏ^9qFQg".Rr 6v T4d69|%@XaٷO ul6RNn]\aBZZJVC j(aWX % ]a5+vP®JVC j(aWXGY1Hf3,#TT*DQwׯV`0|INQVZ ;t}t P( $I:x4 @Aa!G6 EBq.O|cvYIJJ"/?:ѯ_?Bt!K"## $==^vrI6vbJ+7ɲLnn.:ll.V "##}|.0~͑AAcwPu@uS֯`Uk$ @~~>*\Lê T*>|8*QDZnA2R8Ko n%k~+rIЂqBOYJN]ũ޳=mȬ4"c 5u.%fRRUYܓޡh1SzDz(lNBv7j~lD  Lb ]PMޱ}HC6O:AAq_.5S,˸3r$9CPp0>>g(boo£y3d3UdT hлNDn>ih:fp!#ld(lΥ֯s+cL?En@pDgo>2|篡: †mODq]J#y.$CII F"dI:;({+/Qxd-d Y_: Xz4pai:IIW7ItĻxR`ot/Ua-:DYB֯VW })Rץ.pdO9~8GK.h42R9... lN1; jpE..΄eg6<A Wyh)% $G0NШ+^֯}sp  &RpF%&`$o>Τ쌫+$Y޽; r%I[֑ǀ֞r.k2޽;...$'o//;t˫"7-Y_L^A2$Ki֪TBZ~g4 "IRؽu7S)Uf@B@uſW8AV +VnTCZeec5S®JVC j(aWX % ]a5lR @K6FQ)ߖ*JVC j(aWX % ]a5+vP®JV& {5[L_1VzuQ7\ݻ e},R-A>Ir!e}e:D ~{1mtM^֑0G_^z+|_g׃/;"œ"bZs>}UGxq~|=kwRȡC̲df2O& ٟUc-L}~ I_o)Sc- E:1JU< {0|:Б<6iY JM9s_U*gd9Nw>grl}ù큎'O#4rh=LzFԜL{O=Οc= W/H5[ǒ3p_FזunNnC2Ex~^{r ^Y9?c9SBF3> ^392 ȇx t ޲ ۶wb#f}*{_zM|YCT(8(< t -錾[ϲ&،K8^xk2ލ6hճzDD8~VᥜdeM_$-LGYR,cW/>> lfkELڸgÊukVo??$_xulYYQi|2vV`>ł_ckf?ܻkȗIy6 =Y/"fSRUl-9DjC9Qcp*X;SEsVmX͢X ʩpG _{1oCxFeE\ d߳lzV~KfIeN1k;DǼ5iqO.cWRys?ٴq=~xDCC5 _Oc摞:611fWRR~Iײe]oP}vCak]Lbg\qq4PRZ }n."h1_{T 6xD)̺]pGG{DDk6iYzmOwŵ,m@J^X$jt{N|^ʖB)e3ùT`ړIZ :1^Vl.D V͸vnYy|ZA[zeC|y]K~?omMu~$ mVm#<ٿieM 94# YHN~M:ᇽsOt ײضgۖ@[t+4;A~{7sPn4_ HEz:M>ѕעaLsAU?S% )ʴ8;վmETQ!q@D\b*DAZA*"ԕ`z艏c)SwvD/o<" dE׸,4>";&Vm$wXNތ:=µ)yñ f7lRQ- h'\8{|@SB Ng9[[JPEvPY$  r(ǀ(ByFî??YCv;OMya^l}9F$T־g* $ I+Ea_./@Ixؼ ֎-*7ܓ6 kE7<5Aǚgrn'GȩMM 7Qrũ2BPyRE9rS_m =| XdOmsaԿP#抶x~?Fj97=Ra2oA"7;R]Ou<${M^oGc+TQ̯[n]9l4^yՁpsַ0=qkq9h0fzpf`p=/Ugyrw8Hfm_{|eӕ1,6T} pE #,f'FRY!U@4!>aJ%*No۩7$aL3;1:Xx CE|e ;yfVTÜ2UeD C.USq!ti瀈=;?Y_Lam{\p,Hxd:Gs';x6UcƘ8{}=ȘJHH*hТ#'15Ͼ}dP* ň|:.ICy̘CN N. ił^G9 FØ0sz"VeOȉzv gU\wa*(UQ®JVC j(aWX % ]a5+vP®JVC jdaLƪ7)ZvM_iѯ9uڋpr#{2uڋ '7Ain(&ô7{2LpOÇk{E|"Lx|kg4Cenya" f`t;D~yq3C5m:]3\J/21͐qO0{!8 J=//ǭk]EŖ71ۀmo.; 䫩9lL兇kzSf,S&2SV!-;fW8f8rhn͟ogT03_fV fayvBRj|55EaڠÕnGt'7mEPyѿ'5is!nj4C\$Z'btlY @.u,;ij%u!jOM5a-C }g&<8af6]/^ը@;5u՜V]|m?LkW,SN~zbE3|"ˀ!u;R(ETakBMXܟZŎA޺~qk$sk斌U5ao Wdz!wO G)iն*2L!vYJ6W`[WsZv87`)PjMЁ+7^di,n ^?eJ3'7w 泹oEt<@"sk@ hGY4iTEW!aʼn [zAM ~[/ :yC"s;<7o/ܲoӔިv۾lL:?7톓P7s >=+0bKOqǿte9Ut7GSo ?Gr2:~gO;4 + h/1`_Ϝ5̇Q/{ (}q2>e^mKu 9}yweJ= W/'g_o H+@- ?6zN.{n L-$_ymHi xdr:ֳ짿I)66ޚL{AEĽI\K_oiRW~ZUK7@5;_-`m{#g}+BѤax1)E3.S\}:B`jN*"j|ּ3Q$<%ӚB籱1vm( Dt,?ApRv# *"$s/˛./jiڮ#{nrvs+XD6:G]*D$Ia1]Xf滞's˻>ELk sox[f؃]q?1?̤Da^!p삺LTT,u]_aϾݪi5R0mu<%} u8I'7Gm큵Ws*? w.-8.nh{hRFS7Eti5"De ҫAoje[p`XaRJȈ8wQg3ǓdHҏo<б8Yc&/ӕ(IOW6@팋6Ieu]K{ǣ?^YB$6,nyokڴF~5&gK;AEYsi3w7I/jJ ~HsLNFӃ@pdȃfT↍_[=?\i׳YӛOt SeMeӾl~sCo.IlZQ_4Zzy`_vZ۵{OJ7k0Q( % ]a5+vP®JVC j(aWX % ]a5+vh_=2s :uD޽-~)ױV),,d?BΦdJm`MId/gmBq{I:'N ::NN#::(22lX'K~_]);l ɪA^|4 J^YQNYQYQQo Š0OT.7GA*8 Y-:Ba 'ND2i;!*9*m#AñGHɯBRݱ=:A";~Ia8 փ=@BZ&\uo6i/cOSV$.?X"d62Zvt_M!Ƕ%€y5'U.DEhg$>$GSN'r  [Sw.ߏ>?m?);}3)1 h xm Def{RT-uiK{s$J"܌s'{OBlh0Qrqhu/?;p"J ;ޖӍ\Nx2{3l7}ws~8*@"7962Q0ao3l q.xm}q LJ%~g =GBTeTK#$cx" W5d0-oxuAv' #`۞*]랕#$w#rdolTs㨞cr)J=I8 A(OfO|VTz=[=kMƾ"SAއnxڟ=1`9|5 'uI-vC7"`ז@#,D򵼣Z ;Z~NU>{tJ3 GktR!+OePѕ|S8ǙTea"/=u l_'ڝW_Bᬲ,?@g-(idWvgd,ѡ1rk Yصgx vy&%`"Å|5d9CksnTiF;% R˵`yѰZƠ7NmZƠG/c ;ZlggDd~YA֣[/hFd}F&*w"vIH;6TWWή `E1TJiɺeIhDQ㒷1uUaIh2/mm?\kVJ2ԌB0VVaҺ\H jZQ3FMU[VkS(:5ʌ\`Bz 2jc6ilA l[\7C.VAp#)G0ɀK ַޕ)$fT`l q hKkhU~hg/ i'I0So[ml$,3(+*);[o\JR8GL$~*&`WiGΔbٌF;lǍ1ʓgdGB>bvQ'fdz˛}%e%{7{?l gm_3/}84уnٷe+!Q׃e9q r)il= ;ʡ$T@ũM8ZjCpwDcQDGH5O(oȑ>nj K;G`] 뭆\IҖu1 f̍U`JOF>gڹ%V\a;qJIݟȮ2+ jEjP~p:r|P\iJVC j(aWX % ]a5+vP®JVC jocn{$|$rQGv??m3nc ;N/q/5Lf3fl6"ٽ3svύao*MMk& 4TώV*ϙ~9i 9io#7ǞWpU>5Bkn䐲ؾ|ysOqYhХ9 Ol\߮ZG*vbwbwkX4j9ܿ  ߤ2~4'/gz^Շ֢#{J!LSψ8ZÚLَUl gt/-Pɥx >a]f)mo6oLboj͙M '"}ԌGrȷئf#?eIQXUeOj3ǐy[X/䫩9lL兇)f,S&2SV]t㝝FI2uSdze|)k #^Zwe܈hL`9|CT0nyKv_&Ԣ_nG4#X& 3\֕;pGwLOysdżR}Ü"pelFv"%~?E2Ϧ}f1 wE=ѣqY|:K6n`׏b{ ǥT*|Ok6?Ĝme5~#>^y/Pu .>]e_=Lp˔3XnՃc? [Byudq%̮I\2?kVhp+} =C5a`(:α$mfkfhd' pBgkK}?ϡ*0n<gY FZ4f1h<'Ws (DJ˯"sbՎ!$ b+dllؾ/bϱJeG Os vkOnuiL*)oKf.ȥχwdn2FRxukQ刳 H|2n:(]_Df%UG\l % ntD _{"g{ Dغ)#}yM5Ktv2ԖJ)-Cxϙhtm8٨ 9w_5̊u\QZ#nE'1zxM{/:" / Wr4fYZzFEPbH =w$U`Q^,He/J Ϸ^%Yilq> I7,#\+auQ)M[AS/ߜШ(=ěKH:'c0N*;"w'/^\Jcn2G>d=wQ-Of`0n<-YFU<1/aĤ/8,_+kq#\ x}CL\3Q :7V5H2TQ`DM&goq/sy}z_pXgսd#NWԮBq5)aWX QTy|͕BqSC$aԨQ_:IΤP DQL[#cM9ޞIENDB`kraft-1.2.2/manual/images/nl/context2.png000066400000000000000000000114021467704360200202410ustar00rootroot00000000000000PNG  IHDRN pHYs+IDATx^wxTU?NdCh!&ERV:a!$EEUREY ,RXetB !mi~$Lb]y6V:-<mSgX|u#F>PGRpHW #[ XdSL{;'@!@e+ b)\2NLcq^/sx ˓9YnΊ j?V7iPhvs!TҔDzoi9TA"%שn3ĿOU&֗ ՈR(Ԉ `^2},SY( yd,%E2H(422VE-%H@ -+>TU1I(e v7Bqt5 [j9qs/`rH JkŅZC~IaU7[(~332ٞHYL"Wz!|V׷{;&OƖZߍYN4rpoEo$0tUw ,`fpT߼ŨĞtٟ* T)lç pLlE1GϘp .űpq2varn~%(){3nF")Y5rGY1wu^Z˞7T)nΎ @AEzDK:=k#2M7c+V'='7l4_#ѭgb%}=:~}z-a-9L,qmL}p47$Exϭr=1jRXlnO5MVԉ";x$ ,ŃR5l8Mi0v7ZQ4z'&"v8oL!eh*\h"ӆ_ncצyKOP$=4/oNʤEɦXΈٵ{ XjxDd|- b^ډD͛X3Oh捥5ϭĦSQTڕ`!fqy$N:ʬJHu{.׻1kbȃ r Voec 0xp;rwlqc_ôKnOtx1E*AӴw WQoG!(7Lh#YEYjn((- RldOU<2ز͓]E'&z^-;lfCȒ?!abNzԴ:ͻK~x 5fuus͏#ydS:ҜK :c\˘}8gYBضcܱ|asx9a凋V2^4*05 43tE pݡÕJRЪQ(M X =4j*U:w)@ jHdPߍZ{99999999999-q`ϰᵹQjա Vண%{ l /߸ P5x}wj,XN"'HN -!9%rE;(syC}QӷjyW읙>_8do:2uXU_v ?*fo O*+ p^F\9jt B, nUL7yrרͻؿ+>Ӛ+KRn kzRt/Q#hj%rx͟䖰hk$ {/m'j mGl>F]G֫ o"9q~O=tX"=6K͠O,8@9 #C^JOb(/i#չ+mLbR2Ծ32j=zG(^4#c:WG gx%s+1IcXV)y R/zh*pU\HY8z5Bo׃>UNzY{zfwK8LL/vHI_mܺmdګ/z9ϾA#?{YEs9+ٞʜ>ď\)lټ%O4!S!emIP?ԝ;zSm”5)7 <;RYB R_yMYe%8ksK*";*RaJDԩʆK2xkRE%F݆}z [@$G6R[0ϝVVotٻDяLrG<Q:R󫙾#?N3qo*G el:hPtGsj6.I2=9Pk0O%E#(8GؑVb"di/xc|&P9R`ϰa>.6 VJ0NE!`"$C{M[4ς%taPLf -%٭tޭȳxdL`~ђۉ^|Y"b΄ +f~j"m1D0}L <;LjrF]uSIs[a&R?1ߞ*7(enk/+q\H.(t(gȔ hC ٽ2O/3a\BȨ0,KC;/a?}{–z&I(yjl=(ZKr)CN-ɗcY><"p:Em#cͺ-->"Èmғhh?x5ѯNHoGAot§ g)~eJ.Jq#E)Z=׬n|.)3j, %;9|_O>㻨nh{ĺKjH9݊D@O a!.U64Ǘ0=:T@Dׁ>s-m!+[|v=E%jrHrΞ!x5aƔGxs2~~ͩhc]vkE":FT {˂Vp|*fIK<=ྛ?(֤{g/Mxf!چ LXZUˆXQ""E<̙{BGDW%#C l@.`'Iς1Y/dzL{{s%qI[Cg㊬)& `œ&-g!^_L[قO4#?FY M\ .p!2FQ) W٩amnw{hIy/)~(3HiP` MB]`bR$Uo;uT[JD[[GPM-rhdIFP >/pP J6y eKƯ[0]?' ?Gܜ\ 9_~'M~y$ } (ޜ1=Gh x IENDB`kraft-1.2.2/manual/images/nl/context_1.png000066400000000000000000000434041467704360200204060ustar00rootroot00000000000000PNG  IHDR# pHYs+ IDATx^wx?3):CGPx]?kW콡(V젨ҥKz@z3?v7l6 $|g3Ssf @ @ @ \H&HshD4%pBe֥ޟ@Ըdb}\hybqBr1ӐW h4D [o[T9rAcqBo櫓K]uՕ#4e#κԕ^/KLs1Dmbi1TS ;Aetra_M"twŅ1nۊ-u (],8A:8*[[v~[ ؋^֘=jJQNW4uѺG1rHp5·w]Xq21[Aۦ6 zM'@p>GPDkn/`f6~_8V## 25mۋ~~ۺn6n"߶[Rv4T0;mm]bn]R>K#a5D TŭQ! }~G"t$l66yteώ6w߮{ֆ}^G=? kb_V hr&Lan^}#ccQ)p۞ܾgR׶CV*ӿj"\9ֺ롣^m;9ղmzAkþݮMزu1 a d\\]1c 뎶R_q{Aum8Saym;t$fD+@ 0cC4!965 kKOtb$r@`>tVo.Dtvf+fu] ׆q wM;r5t?AKVuiǖPz_D-TV|> N}QJ]oYc2CDS_Ԛ.qb_}T+ qYw ? &[itj‘6jӖv{``hE"Rv}I`uzұg}1 R+B< ^]q30Ӆxc84VK.OH :* ___,Lm_k!\OAM$'ÈPw4EsXM-'^NSvx@ޭHtk!/QQ'_ Jmz am>f_沠Sx^+!iuvHWS9BjGnmf#aqPnJtGٴv%%'KK@6K(Ke GPHݽ~ mmG.+Ϡq f`GBR'T:-O-ƚs>tҝhJ%1NIkxQ[PjkXmiIEXބv*%lHQL,QR Zgl ΔRZPZR 8mi %*H9>/KIݽ{A& Zazᐐ$-:T&$ P+/M'33=qB{m]5 1m*Tۛ|Hƀwx7:.gzjk=zcF@cΦSΠbJT>X//.ƨyUS|Ǡ7c8FY$(TM Y`OэjDmBgq] 2e^e-O?2a֣ZE]61K%}@~oivb2h֎عK>lhɲn,XbYl[+5Wp9"Y&@U!;8m|Mi5- ~jRz~A4&$jn}h=w}$F}tS<4TܵѠ 4S !-P@BX>#Jkb۞xrIp-.1BA E[ hq -_L9zUU  "::??f nfj/[*8x,Y˜1c>rZMՙJƠ1yiҭ6) d|3ݻGXQmB9ƒ=xeLڎKSc}a"5n-=G'5!LF#7C^. MZ^Crr2O>^^^ PUSoGD7bՌ5PFҖNU@I֢s"0WE=43xTع nWuX]t333Yln///N%%1O())СC}tЁ)Ogd*e8ڹ!fe׶uIV*"눠iKRMVqH =ztG$ٺP H$HDhϛO||G yuGq8!)f)QU>R|n?qϒSTI6^1`"T" ΑSjBҺۮ;}*]E0ОҸ3cXoI[YKg]*s(Uhՙp8GtU'<Qy t%\^m*M=G`d| Htԙȶmh4p.5նQMg"Ћ` 9}W[Pnra_jA6oGR`::@Bb 4|rXD]@TΩs)9NZ~ \B܆8'7TGyJ";t0p3 lYmUwo>1wEɊ=~*˗@QU-Z$SWE!kTUFH>DHJ#~z dv8,]|8ewNQ\ "RO)_gOړ$I%Zo+恓,KA* JP8sMh=% =B]AwP@ wAQdY*s)0EQHNN檮]qw{nI,,wnfi "+>R+gQA9s()B#H"V*e`?N9L^t֑Vn|c,ISRbq\%ɀA~pȎ#&+,Yz쁪(,_2t:@|B&(*j[3lHˢ4 #_SsP*غ7Kdz'& dW޹sk!pFF"[Ne`I5b༱ 9oCS???ƌ… ˣ]v<ܳtڕΝ;3hӶ-˯5UϒRCXf4x%(L&ؒTHNv1F$$3H"%5R{PziKҏTkqh†&s 9Go1ydzt}[ϯJ@@GmYOHwuE#IX>_NARövM`ıgZZ ?G)ZL=)E5h]}Э-AV;_wiCN u7Ǔ~ ayKg\0&Ľ.VyXjvȉq1) kV毿Bj i 7#G^NkE۸ }qiKˈeĺv ^+h=7F9j$={ ..nW]EJ@-%D3ZI(('s=ne}9hg$I3|j+cI؞W EHt6/E,m[(= %&iV9A}rnV+ !n"-P@BZ(M꫰;v^$e#oeIO^!Ф->dA E[ hq -!n"-P@BZ(Nܿ+ m|A4+q'&&o|)c+i~ʯkJ'vO7,h6NLLdĉV9[f?Cw@,Y|<>oQʕx~ xY6/A|4 q'&&r tؑ~ӯtu^˞={ׂJ׸wr$_-Zƕ u_7|07w?VG t/>n;7M^s̛7ZyI߃3&&og9kdP{hڽZ%Zǎ>`}vƏeۙ_Rv>~fƏqOȷDX#0n#rXQU1m =}+F g/ϫےel~eϯ/ΨAx|Y9K`̌{8z8CFMO6q)CIȱdUC?f$CƧb.'ccO}r'ͯ-GC\6[O#'9,k܋~ȟ)FTJIi:3.etu&Tqx 3wJV.WfRt}O3or~} (1QGm%s-*ʵu5+y 0]ɷ`Wv}>{.]+ݑQz%+[qY"y2oYj fOXdl$vm~kkx^>Y֓ /awҩh{okX?4eI^۝]ͺ?gdGM^܍M9lt۶"P{=;QF] ທt&}1BHbKCӑJƢ81fsrw5MX7ԫveh_6} FP9,7aLog4mb~~fibE@ 6_~J$Jq\95CJ>4-N$ G|I$ H+_y"E8i)A}q;{9YG9 ;W%5߾縷oͰ;f.ʒ߈z=޸m,iE<: 7f$Ep/Q9y q%Tyv4 IӉ^~f2 1'AkH ?gyP˭t ϿQOab8=!.T5;_ey~B ZEe&ac&oD%R۱M`ڼ.ݢ|XWD> ɓ'QU6m']Qo}kuyQQ[8aUUٱs:|ж0Ybv ^+hvWxx8N[ (y ] #h4a[I-TQ5.=+xC3/6cx9~q -!n"-P@BZ(BA E[ hq -!n}INMn$FO)y[9%-<3{ڿAyu:CCO1xI3/s3gDdzēs O\!d ̙v{>wGsh\qxN(Y͗4?oF8=ø%,N:_|!?eK/ Nt ~z %A,]7XO$+՝E>Yn}0ȴK,q}F4̜{r2s#ڔk="3_p@I^ |J.qȷ92Ws_,p?VgHF&\/ʂ6yX|Bǧӱh=s?D7fJ~" GJytF+Bx^|NZz}%O vWܪ_sw^q"5L8|$ 2y2zvqGl}үܜӞ HdZEƙ N#Äg5:6AocV/F ,߁OA!dظ6=&w#нYm&LKAGgqCb.7yhx5=29W,ґ~}pӃ]ufJ2,,#ZEI0boGgDu'S:I:6X:g Zb#+Y&|72iDM+Er-ٳg{^s]\ǑJۙϬ;Q1圤,-=o[h28Z0e7Y]ǎUl@-+<:hQS(7e%R^ү"nP\쁷dZ_|Jk/n7KwsJg_U vy+EBH(&ec^bmB܊*~ޕh4\"5gIL6 W77nfmBzQ/q_t,^zŭg K&-0qx~3D{(Isם=,ь UNR:1GFB勇a -|Xt$ JA"=[Qy92 ^x{><ʹgrwdSL}R@i|15zϏӊՏӕy %g;_M@[m 1%Yg85)$I"::ξ}ضu+۶nv^%l;c"C' $V~SHG8 9f#-sCEЄ2zl;}]Vی`|.|3)HxzWrP3۵m'ncvtiこwbkY$b]c:VUs9 #Vg(AFDvhJ1L̄X P5dS Mؽ{wXC`2Xn=zZ2# xKN2&m{0ټ8r0Ԯ7H&>0=ϴ3fx,a$7/_Sهnb9uWc|;3:W"G/˼+D7^<4dKwcߤ}`-K CuTW[TXE^-ZEW8ޜ~#"cd)ku1|z{E$O0 71\·v jYm_mn(#?*7x[ ܛIH\6Ť⡺`R%41bBA6 bǔ$d *J}y((jeqL|ύw~?h}`涪er{9WgTAcpGj7=$IoX?o$R%P%!9eVddY%85**hq71$Y eA[ hq -!n"-P@BZ(BA YڎYh0qDĴ5Οfs׌;m۶sNƍs碊9u4 qgee1c x X+xw1cD{졨NEբh:u*ٳB7}qMg0է&Hс:Z ZO%FN]FBÿ́f!B\]+l(њV72ß`ֽ=Gk/NV%}|4@45gx|D1Op?P+..&11UU?YUU=zt׈ulIB+^Ovp S;,<|N[GߛÓ7E%),Y?w7>v|ZJkңCi|اf-a ?uAk)/O6X4YÆ˄J6xmǝX9G^獵lk>Y$}rI++cJn~6.FǞ-hE=c?hDwϵ=sbJ2?̏ȩj |`#AwQQƎeϞ=(wQ%d2޻jJ-_{C͓gz,x&FLִ㓹ZsQb6Gxtm>[}o<},~:{*s1|wnC1kas] t`wڗ0A]Ǖ#8{8> 7_xoy_#~g<ΊwM r%c>csX>2mqϳ4=i]\ F/_!2R4/*Q<"N8$/3 R{xkn?>Ѥqqq:|223,99;~}?ۊTѓ %o;X&^i]e.5`ۺˠk? ^: .C|ͻd}e (ib/Ǐ&\d_FAMw<#|U?<Srm:FBp6)[͌&dmXkwDkw~KV#\e7NNG׳123oL$}(9Y8\&| VEUUKTU{Ae{׎)1̱J0Uuxxcq˲;z\,c3XQkXq8k_ BYw( ,4U  s=~3@]VżI:}n`"+=p*Kt),N(7D1_&-n{x0LՋ={6?/_\1ncP hd[$UW!Cߝkb56T=eւ΄ Fߘ^ڪyXWL}-^>OoϾ}Jrz,y*";>^"o6SH3jtЁbbbرc#[ۃI.3?ی`|=|[G;*]ƍkO|:CsU;v_jqg)(dˉrTdO8AF2W93vArGN?Wdk3'-EAo߄'n  d) U36v,BqI 0T<>b 71l p`+h Ԧ4"-q$99>{ӧOauVmNXXX &aHkjv KHȠHE [C0Q%R:4;$$?L&%((?naYMœqsn5fɈ,T:Hm>,uV5lmDֻOz]\V0pI#-P@BZ(BA E[ hq -!nCșӧhV۬/\R:RRR꫹rwѺukɰh42w3sL^|EB[fܯ)+k[ Xi>s4iiiL<__e .*y)ͨ s;j_N= .f1,ӣ"ɐ!CՎJəx=MNLNe vu抦BZd&TYV9y$jF:=#;Y80gl29xXeee9sUU8鈌Dϴ9%kљ8OȘͪ4 Nz04*$q(FѸ>v>P8s9G]q39(z?uG~ʢȨ+v%&S& !­-Ө7_cVZ1} ZqiML)H2Z;HM@t%ٹ~;Ҏj0ƹd͛z5Cz#gDWBbblkWs$l6E'|T 8Àpֳ` =Կ N?d\'xYr<ۏKt4qlYw^)Kˁn7Sj[ P>;1nuA*8gq!Ψy'ٱ8y4fh1 ƴ6lߍD8[d<5-Kh?hVCDѣ8}4rl1cƳ;v]'ׂY摾}D@;CR7b1ȀKm-% %| nKyr6^8Ik H+2aSz nm9Yq,qVA$&RTtI?syoZw Ykܭ5sԤdii,iבӜ+jO; *jYr<л=x. eYz6T[ޣƿ HI7n#IHWG; =MZe毹\]]eUUٴi2p@dY}iy %IXĊ 5hy+['Lq©Bǖ3F:9;--D,n*K@%PU[߄JrJJU ~6Ǡ\pO-HQVJPQ$Wʱ5 ]lރـTRZ\{uKTW rTܖjWMZVΜ9ï(Q%Q=8H:=zm0%ѹ/p$zH-D˨bz* KNe̫18񚱩\r n :{VӈZ`CAI *H*emȾm1Y~=A4[@DD&" IØK弓#p@_zֽ#v1}Pa yOi%Ckz+#1aj\oۗnH5!هWDkM=$_Nfw1jkېv4/ ^^fF{m̘H PF8~ybⱿ{yX^ZN_y9 'N`}_sT[*y>ƈ~Wfˆ yOsQ ˵,qhj4N໕G8e[ Q:-؜ nhyyDνpw~S/Yæ=doiv麝Mtrfnm8X1gfwXE lƜ$1se~\<y7'==xɥʅM~ƾUN(Ih[r\ 5l [ЧӴ=x-N{]IEɄɲ\0'C'c Ykg0GwDC ۗF3N&sAݸjx:]F85>0 !N$~ۃq@Ť{): 8t|#dՀ*nڿb^sj_ NAL-3 =oɉW₾ӆV?xxEyrHn^rbkh"#v`p Si=wxx8_͝[pz,~{! ڎ婶2(yg1F/v} r+zhCo]!8Xۆx]6úه[8yk[ IZ l 4O2L#t'0Y2(- ŭd/_K2Ow9$*h46sfcҗkxmZؙ2yg̻7ڐF9 PyBH|c6!l a VEܲEG,dݦ< Ts`IDATu#=3O߰cT5oC>E>y.#zzf?܍q- ,_ecԲlNO"w'_7RVg?Cj@͠,~;!6ő_l&߲OGd )6Og]xSKp ̣0"5rƳ̆䩠⶧>;S-KF{W;4N*XEER_DQBɢRDp!BTRDAą* 7BK.IZ` MBѹ.2'9s|{1\c˽0Lݹuskxfr'Nc[y{/^EIQxKWW6{y'}3g?xDG1^ o4+^[Mm`[Ly>\dOړZbh2O }-lJjL.:T٭6ڜ~݂jCc'Ҕ[H_\Ć/`;:ڋ V.(ka]KRVnW"%G;}ښ^ae綕^弎EX^U.}Amb+VĖcǽ\zJ\y-YKHl$W ;ϓM\1ŵ9L&>!e -wZh-Ԟzv]{L"W;ϓ͋sr#$4!٬:j/ܫ(# E{^yyIYxy 27j= t %0O6ݷ1糷gxBRNH:-6׋5DJE֚!U fǬ^29:z:HY)!CT> Tbz.U$ꔸ9PMNa˭T[BC! 92䬓{5T[/ 嶶c#d'D˕5 (_ +xٞ +׷=[~O'ߤDmր$%2}I2hRy^(ϢWĶӏ1Bv1 1E/Jm+5!d7#ejNj<^˔y+^$̶%d/PF2sTuQw}BE])e z6*f7ȶ~00=X{pB!B!B!$>$IENDB`kraft-1.2.2/manual/images/nl/context_2.png000066400000000000000000001305051467704360200204060ustar00rootroot00000000000000PNG  IHDR؂ pHYs+ IDATx^wև ,9JNT9Uŀ# *^EU3AD2$' `atnmmYX駪9==h4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh41P 2EϷFр4eңPh}AP @GϑFє_E@9h4E?Mih4cDoqLFs)"[TjN49Vsh4c%Ǫߘs"ڇՏFhshS&U.5F{Z˺sYYh4ͱDڍ9Ǔjj'1i4Mi)b1Ū2xX1VD/m<RDh'VŪ2T jZh4\J#0j]7QTٯ[لMF;8TFڜN*&bb-mL$y: oϫN65m65Vf>FPbs8:1/R'S[TVSWj*P˻UTS'MX2NmyrIU; DzP 'zN;UXz67|&nD9ՁM_ĩ@-DhtPe-/1PmKռݍhdu4GI):n]IGr.bDYMN@O9UJ돘XC'p?'ZHU#}/MN "pDh42 !I`ϒϦ4 qB*&/*b- "]T5/WZu]9MΫpep~Fq"pep?5Um'~UН8BTdw;pDW0䲚BWpjW.mł@mF((FѸJ\BYlrYSXrlN6qjmny,wJ µ&lN'Tͫe';tucP|j_}82npeF)KTq+v(;Mͫ[ٮ8Tdw˫AxX [=UUA7awn.]z ղ@hJ4%x1jY ޖv5Nd|^> c͐bD;nAuEf~s֎]&\"7$S^b- ]6\PBղJiE8a/ʪ] ENީ충߅#XھlS٧Լn~7{Ĕ|I%r>ծ jTܝDMվ]Me T7Fє7 'jU 8,N6q'.-ܔN6Gl%/ciiJS;N6P"֕b8 9*Nm&$TS\4mE8N(l6&NĿ YiG2ΥPŁ@),rjeծ '-*T1-)N8y7,{rPwFedfTܾy];6jj4`oMV>C22Ρ8M\r,>Mͫ8lQ+mY`N6*N@j {$om=r#'oݴ\0*F901a q(GS|I*3T'MSoJ6*Vhu 8ah4ݶi}JRT ԧ> lWpJYN8T䋼g74 >Wh4K8Y\\U(qFeN}Ҽ]_ȓ(2dm!]>!"+9|+i?fb<| ?OvjF9v`xm6 =@<7%8_؅M~9>~D4wBladwJ^ɻh#L ڑ/-FS{59YRޖ|$ lm>5^&Ly[]Lt("/r|0?7tq& ' l$VcfbX4a۶]>G_@nK2!w)E'Sx,N}Bxf7=Hb&[JI'/ /,/!/4Fs{? 8!ĝ\6v'[(IE>lmj@qbAew?Bi$c{ ȬNbׂThx?3-;wOLiӱ혭Fќ?.>WOFЦj\vzD/qjܮ\O-hNb(Di B. )sGvf}v" f4#$5#9oR^nه8NNrip}7}͍^%9y} kZ5s^it:o:&OsVݚѴq#Zh hբ9M7R͡ފs$I7T])Ƅy'/㴣ꤪeWmrYbb nx{J-Kd@J\2VOobNczy1x>HRTi'1#8`Í !O`7]{5~ GV~kRS+xRFeY\н+sı[jj)\^ЉqQkPyl0KWl*3?YjxDsG?&5xh֤yl޲M G!.FXxJFCdԘ l׶5C3СC8)1!*SYvmO=Xr%M7"cuZ4'7/ mR]QѮmkF<9 aG咰z:Fz!L!{B7>,pǔ%u"A,ZW;uyzjxq_O,*[Ez4}PƗba7 R!qn` KDy'KMګ,ap нk^ .w'''u)m kzQbEV/CEW3/?4W+$Ԯ4MƎzm;vevt:ڴSgނERdžPw ;Ѯmkx/Æ(&ʥaيUEJվ,9QmkvM FmL9"/#Ob'nތ'`3r2xTRQGS?޶;O[`~ ˲ẫiӪ%?Fnn.?7^Ӌw>atr&_}IoMC 4%KcOc[#ǧ3fEt =3gf՟HLHg~W[9g1?)vM7f _\jpk?N {j\wuO 3{غm?@*ܵ+Vqc^x=r-3:ƶ;9l޺a6mu{:?0 jT΍\Q/r -˲0M+xؠLxM֮ЇiVu?իUeOm~_=./~Fڵmdo)v0Mﻛ |=CkoNf_9Mbb>Uk֒ȋ#✳:3<5y 8Y`۴>9_| sS֬Y^ᑁؗYru)mZ{=֬[_ 1/O,#T%aՌ CQc']&1pp*/\7|1<4(w;Xs^.8.qkY8{W>9L3盹􂋤ü_%K~|C,]kEهYr5yyydfevFjV@׳y شe+yyy|;'vYPw=t5l@NNlu/KFf&yL>zujsRԮUV-'Î]u46oƑ5iLbBmNn_vkۊe+WEug_AvaܱǤc.>\`V*O Ĥm`L?r $x2֮߀oDz>|:{=/6Z_쯾ekm`. O$?|L`G%Z* m/$//` .lHK(ÀO ͛6+/fj6ԪYY_} @*ٸisȶm(ūoL沋%;;Ntm?( Zh^Цڎ3Dy1 >?(Mwj :lV5Seڗ3? X,~q|<5lS>ʷs²,ZFSSR,Y_}˜o9gЇ{)Iʕ TX@߻/x@f鲕ljתU9hբ'@Zz/5Iiz>ig, "_'G_oq\~TNkzmNmX/{3IIAթQK-y&mu2; /WKؽg/|rԬb 4R?2;x"&M!^zߪEsG1_ =zsX,O u>91rY;&Dz'+"i5iҜrj *ĈB0 <e 8N`i|A* ݷW&Dzg\8?8ΧTRAe y3,ϲ@ y"0GINJ&`͜Ŷ&cxO#snᧂ5eoԩ]LBB<,+(k3ylXEC'}4JT6m^*˝}_cw1@Z:{ȑ|ߗr]3}朂K}$26}&[n FIesлLt^ݧV=L'7ow<9xgZ_7W +'`=wr~sxw|5\ q?zZP§ݹ8ڜway+]|q1AމPs˓斆wU\Wh">b|'3t䄏,swРj6AlK3ii0?b:ib  `̣/ƌ|OgbނKє!vk7yy%S٧Q|ɇJUpbYr(\V7@ɛNL0R8X!~H[*|^-kub勃ETZ6o0 |: c jF9:UmPmb*SqN~,/lpb|LOHadRWI?8n& oF{+(vQ ;Ma3)z'/pQI IDATKMY/;jTiSD թFhNLTՍp")yugCdQc vԫ4 Ni4dS5DސR\v8ٝl*,D.qNڜRy<"/~$GOh4'N* gvPH5q['wjKh4'^ TTُGK Uve5UmN<^m_h4'6S5MTNj>rpD uCM`97mPFhNL j]8mpTFmCF-5G䄛hFhN\y^}K69NV(o"N-T*6Fќ|M 򑤪M)G[v^HP'[MEi4FsbꅚFZG-̈G2xզ&T^ބ=h4cz'=p˩Qjm*DLy9uR]5yv4Fsb꼯D8S^%J#Pq8BZFќ8jS7J(Lq1XN4jmTlWh4͉y?V8Nm8َe!D).ZMhnmh4jS^Fe:U )ɋՄZ[ǣO`{]mz##]B-́ Y;0,J/Gჵyg͘ϥ'ih4zW4,E> rS'\Բ*mAbgڵ/"4m17'sg 3ʜ\Ҷg,@\~i4K(PT*nvH㢦,E>I ӤȾpBi֏7?97rrG&TX;0o}~]6UZuEXČ[ɷixe^˃O$F5CFSp:˺j"6{4eFY| SqUAB-SaxIф10D?Nc;"fӟǼxì@ׁc}dm. Tmؖs.K Nɻisf-iy$jȵgśo>>R뷡Uӣm<F%Na J]mH bv 8k)sE+ֳ=0v|*Zt=9n|aCaϙ6Wܕ)ui"z_ĜW>5 ]3̾xRI[:u=n\>h45_ՁH}ўUDĖhqH/ܢAqZ0w-ƾ]mmZ~0Siz¶s4)#ۏ Wt<3f{/ށJ&`em:Igdɳ5V.㷹?[q|#''b1LbXj8}nf:) 4?(n:9~DY?p߫/qc_`  ?XEf~}75ڼ:b6}>bMV>E?1{!L h4(sZV1(]5^ Ǩuʛȃ BdF]X_r\|`NZf'߬9n[-G>rWN1?Mr.\znk-i,<#SfݬZi_=vkK՜͜ *5;_9ۘg\{nZsؘ3EzZ-@V/x+M\*|<3%^ԑ:^V%+n񂵅?aMfTh=4%][XbV'_mFSzszzQWȇPsep*m/zg`Ty˸y\8Ng o1ջ8{eؿ]|3kt: RF ~m``ѻnxi Gq˯B><.,gUERQ\^u~0>Äda?s?$+/ѧI&`߶ѷ= wmW>6&cu!QldT񖷗5 iE9i ڝD<ωhbKyp֖jf/=ңo#td)B ?mshfXH"oB1 VT3/-; LiѲ!>c7VmQP0R8qxkӸA\C8d}a, q"^?tz3LhìOF>I,ɻ>65Ph4Rt NKQx8"OVx'⁳̱vph+ iԈv^.g`PVufz0 *ժOmlƹw|oڸ820V$R̲:j5H"_t~O~6ce[z825?'(fUc#%%d]UeC?rIsWx[Nڐv,ZZAl1rf"G|SwB\SxBF^RFS BiA(qɱRI'3:nq/1f"咓#9[ӾË>aں#nv3gڵd:uhKb*1[ҺZ#;;@=9;={!"cc9İ}ǾFS2*ɔTbBy/G2qbB\W;\5kj|{|Us|9j.}Gyt_#{?[Vs}IczbɱR_L{+rl Ѭυ㝵9wIk:SחɆ?aKcdidTT3 s"6SZIGhTBJiDㆁ#ByD犵S>qkn=Ĥ'.FKL٘yxl>@CAƤ޹ij1j[NO[H{=D0f/pـib oceq8_ZƲ []]+FĎH Ҹrͱi,iHaˎ/-fgr# w0/hC ^Lo՚uC}UtDy~W݂Z)> 9L}};'l`eY'ϼv2RضM8aLx'ډkĵ&ܝpZ$x )isqg' <-}__ztnAJ x3.M;gxsKߓh41%sqn~Lt Nqn6aWwTM\hR^ #T"7K, 9G6`[wf{6e)mcVr%8C|K^m0=EvCUagqmc۲ck\?nGVLgyh43z]#x 0/)o"%_*A8YMmM U R[z#N, ~1?Na`10: 5P>7B 1VCdZ2K,x֑gu9 0(Fs>vŠѦ kG3 pmhV VzdMRƩ.]Sbu KqwĪ-rq 6:pm 6T}wu'5SF);byU;e$E_y$.XƟwaI V#ڜu 7|F9TnU7֒QN0*5=ȅ74 7Ǎ WWтާ5є=XqB,Fh:'~"E}FȨpjĉ*\TF>E^h4Z5F9A"h4 yFhNPk4FsE^h4-G\~q}&&QD'l2<¹wOeg x^5࿦jmʀkrb_oQɱX[\_ui4h ?{Ű~WqAt9 {$=aٖ' ;}_ߎ/PI/{7|1W5k!%]Ku9H͚gr]8dܭcJ`cGR(aԓ_#xWpx>'ež'ڏ/`cX|!_uhSR=AOy10b{1:FS8QAQJÞF\߭U<I i[FX~c/3}xoZ$l2WNe,zo\yC\{0ymv\>'[Z[@xsi/v3w?"fUn{/id-KcIsBһg wkW0nK/5;ahR'+ؔ&q2ŲF3UH;D^r3.uǀ-_2v|5qMXN~w {$Tk* v˿Un?Fdkmqk%كgzyTV7WbW:^㹷dݞ [='F/#cF'|oBAcD;d;8O`< CW?f4щ {[`9N<6{5 4z QtW4~(g,v|ԟ[^QAZsɷkCa5H1}&HvƣgvG:W2bܭI aR&XZ\5q?*Utb3Y0)/gy+|v|9?O2Nulboy;n㺿|>GCM!YЖ~)Ǎ0jp-Skƿ|ʵ ~v&rWʿ'Rqy{"c_8$E[zcOvL31ux*=x{{>sY3QFhŠg0{( #6`9ë;O7OXD*~3LLf86/?E ӯw?΍-8` uO4Sr9ϗ/OeE 䋬n=wŴn˜9G11p̙_.j\?yF{sK;'^m6tˆ,^]4cyJ'ua1/ H>bau6y mr fMZ F:zfN̛~k7lj4CdQ Wr}gӏP펗d,>u*[^\ּ=V-o^^ ;UNQN B6eaq"s[F=`泯旦2\FFLbSb~v^uKuhx]~l?OgEaL|k˺WcOMxr.x ӷǘyxT2?Czq##S<ۻFv$M/9k>#}_O0n|Y_j#"8a#\7|tq&  Zגǿրc8\3kMs{&$=^gYqyEۤϛ/5z$޹W?H6siT1Ժ4ic[Ŝ/M7Ѿj&ف?xij{EVuft:>||Usf8}ɯ+0La`<OnۤN39Z"^O"8iocmﷶNx/U3I ^xjԧvfG|TnЂ͢wm ˖nò0]rcoZ-S؋aR5Xl iѤ2 /ZIٳB,ٖZ+x[rS-CB9IV7 ݖ=;k٤<8yÛ܄W:sT<7=U$rsPq7vYsrF>Ûܘ+hoQLL̽az0@XyYPrn=I8wsѡմNÓԐ.c4kNF'gELSǷ)uaݴ*N^ ֽ7bڈlv6*ҹ4NМ.`Lr-4N1<^1NK$EcO1a<65|tFU ͕e# \@DLba=q*{qA?`8w:TLngpҞ"PO&O׌ MiM{r{~=s g /X+'·)}]?z~Z 8)N#g;yl&'6V-nx1MqGaUiun'o. TRRh8ݓ(<& IDAT3 BJS;'oE qr"pGcoHbz!AĖΞJ!j\6}853i00=Y. ; }1L>If??݋@35Dw> ~.s}w?0+VRrgVAoREԅܺw =uۖ8ivkKS6N+Vx痟ig.mKaC8%Sd,xYE匽"ta~Sh,&"kZ2q\xiby L 0Mfzfuѱ2UT?~}.ЬAʩN\iHvmT .I[a(x0V:7O1I>SsSt66!=5Xk`TSO Fig(/?6+0lW+|4iVoR{{r1ٻM{Z&պ\J-[8G:lc6JK.I{~⻥NxD/F  H6`mA*qx8ğs)8]Rs S?ZEM̚w+v6M7YrsݶO㴪k ։ gA0}]:uH@X؀TI_:E]k댫TrqWZ~Lq`/f۔xm3+9 yp/0GUg[{7q;ײ+QkTPkz^z5EkCݯsw|Y;]Rw{4X_v9nF|\`.K72.fiD~6jJ1 0[^#U51  ߿K7sgۗ~gf\tzcc`ּ8y{[;B.1y6]@Yxn.:];KD j'co\~=-ztw=n{K_~1_o}.%u߼)tr[wRQڿc{ K^CybF>;8Cɘҭy\Qq)OA;]/]/~_̷/k[j%SM\V7qa: #TJe䊲7yޡ#& -u[}6,83ؖUpd`&A,|la`'Iv'mYoqo``S/υWEx>sZ6x]d ?5c9?}>E(m6/8[bc-0sPl @4J>E:!Rأ[BGU(~c׽}? }uw*Mf~;'N5rǁ򔲜~K*|~lm⡉]6\V}HmEПGa`z\Tav4" Ldw> |:anAHگJ9uǂrٺr5vԯZO~n ؅b4Cn_ y$y ^|nBWl u8X&}+FqsZ_CcL j}-H4'4 -?Gײ $ڛ':WFE^sH~xcVFhW>h4M1Fќhh4EFh4}GQޥ$H $ޕ* R)A#MEzUQ!4ґ: zqwp\ $yIvgwg(A!A^A(A!нtSG ;A*{D"Z:[)}+Od&tu7ƶ 9jXp.t >;DϦTÝ ^w^iGp5/Y&|6%顤 SRR$6.E1u>|,Aٲe, vגC`F`sL`` ,̤Edd$+V4t3) 9DKXٲhYߤZb쉈$E#FذaN-R%[DfzՒ̾qo1k"+bJ)f!ጮiys(\xr+A^He&?UK=?r}VN~y B.&ޓ-WrAq**q>FJ4r,3$Fnaۥ:m&;ʴ@E+ף|b/MUW%~]2[0uegqu j16D/7tۋ |.*v-¯Nl1lY;Y! X: R85^V2/RU;Iw߹½:(/>s={'OW7Frf9p][7vX05Ǘijoz_&oѠqKFl}<bƴE̢oԫJV|aU[>Yi$͚4C(*vpGꅅҨC ߏDX՚|1]ckAb*%A mH¿7XuPlV+9S 5;=,dӽ#5Mknaܠ;am|?0?F|κ;`gɔ;K"՝V8}';/MFYoW%&mŷ s#|١$w3{Y*M\ݻضb<}%O|93`Ϛ~7wǞ'ٽ{D1wίիGtMvmnck*bl[?e T;޽Ye'vU05!zT%pǬޱI ]𛭥b?_M#y*I2ܰpL:;hެZХPP0e}:R4*Ec$k% I֠h%׊ qڒƛ4:Ʈ# ࢦv(T+v譤MeG|)1TKiWX1t{ˏbpJ`_"^wؿv;aU7@)Eˎož`(!d mG?G^T?6 W&'Z-y';Udd $YFѠ%׷~$i*}B>y<]]p5_1*nnseqp_&U5U.eyi_!.}B~2z \֕ F!&>nOǥ&A'.AkH.fuB~+>he­gPH7q4jS g~b&=\ I['4WwWdc944jQ8a! HܺB%~ol8}J"O/Z [i$=AȋDυ$`ڄNc}؟;oG#qz.,jH*yiQөSR!@mYu;|5*x$Y$Wr@fuy2=eXwP{F}uGEܠE F@A3hs2b3K1w$5$I Ym. Rekt;/JѝdRacSCMY+F6~K Zzd6Hޔ6b9 a>pr~˼jqSx֯yۢp~^^ϖpq25OР҈r[IYޕWu<2[tː1/%\|U&1GME{$2'_Jȇ&-5]06g=fᑓ?eܰc~+Qjb hQ8KV h4}+f?,Km4͟GV`yRԽ3ucOS:ƫ!ɕwSpPiʐ Q7ѬLTՄ_nJ!籞^6cߕ-mxˀ$is uHi=hZZ{ځֻ͡|X$uHǷïӴqegmP$uԏ[Rz(b,Sw y/Cz:ս|37|cd+Kl656}dlXkoÿ=vXnȢ6+C;vvXX[޳zu뾰zUѣJ{*^Ad4{G4l$KH_UPkYUEQJ$dYF2. |FYONʕPUgZ O}aP$$`\z z=Ȧ2q*6(OE$P7};t],| Xfg,Z7ew&p3~@Űٰ8Taٰjg_cb>l9$^D2IԵk v5dm%dt$Yó1;3ddՔ$dr$X]Iʴɓ'-G:9Varab-d>Jd\_秗q ="ҥKs9vٓM]͖)SWBdDK!/A>SbEY" wA>tn1}V0  K)+2w[k9J$ƥQll5j)P {Ϣ"b|N~uӏދn -G 丬G$F+xsZ5;e5Oѷy͂g'ѩWa4a]~g}[~)IB݁,dJp ;I,^)Ұ&{9aYjꊔDH1v9p!K6\N|":"܇F̂7W:.f?﵈ig_7dD=!;yS|ܵv2|i2m2dVO c̟K)VOm$;Q$)=ק :{` rf av7}?nF\# 1 j.`ʳ(ݜPuGʍb\;O+NNR'"KwUVx g5!)*?赣UmTn/jV0v762(~vh0|zR>nkva0צOf<>7ơ0UKMaLfǮjF˃ͲhQY7jV X:0Cc(Mª=_tEoޮ[xeidq]C7]sLNUM̡R W&k|AvL oFӴ_ĩ='YTzmʱݙ}>߯,h2&~Xc"\"<<4}&mQ(qܧf ? Mq\ҩ/{|{k|L c-yo)S]+圯7)aY**H.T܏SidmΠ<ٿQb 9#29f 4PQR.aL%ig`'㺮IOXo>rt/zC똵;?}}˚zf'no}򹅦(h9{0 ]J/B*{$rs{pP]n\' -sSbCSG-%2` W-kTɇڭ1zβm+[&]V d>;Z;jP\q4@Q;U5.ؚi7 2{0GI\P>G4l S>ksE(:ED nNB9r2.q2҇^p({.A\:gbMZGvxZ ɯm[FƮ T}=NmiP7^1 -;4${VݻD@u%yw ^6 9n۷ރzQ-{{lS9~M4-$;RC(/-=[*kHI P- 2! >!A8@A <x<=H8z xr_|m̒Pw֏4rs($RaF"סk Q%l& MiȲ#Y\)i5?R(TSM /̎': ښ= U~Dr.7%SaTw}WI$ҥ Mex艷ӳpK}D\ 9ݙD&g鞮kl$TEEUִl; =^vf2>ࡣ^ExA>ó|"11.L'o&li%dYFvq522*"4ew]#C/ƿy[ׯNok!wyNI^5Qyo;\=bZ Ij7DAռ$7wq>}`KɝXe<~#2veRA>5"o$(.-CN Mdo?*==iJA l l83&Iq (CFtC+I'Fl{cr t҅ -:SsԏogWJUrgp'I6z'fOρ) x-ghuƆR5_gu% lV-Ӻj jj?R'⣺y:P$)rd~B,g|&1,[u\ٙ5R6펬bʇ$NXAHđ";.O ǠL2=ps/@pb,^KvFuTd||7c$;7cؘX~3,x=*vvxU,rbf͗8x͇-?$[_4feaٰ#6fZt-t+Dٝw'v^ihl5k 7ESnL/F*Yc 憱'z%MWUEQuW+IiW$4s(zdx8,ə?Z^K?LQ%-Gg*<}eza8BUTLyj+YEEHgy* T4BeSU+ -;2*vId)HvOJۭe念gmo7[6*P5aYL(@g4aMaqXfza8δXf11fqd/" rʵ~5YIɸt ZJLƯXo9{t]rT#A$ͳrz:leO_$dYaeVF%9eOdL뜉vDI/4iDį S?Pܼ;lji&;ʶHF;{$F֋)/n1'(ʫ ? L?jJT @3vEǼ%^Tq7Fl_XfNH<-S2 .Tuv0 *]0|_%|ϟ\?M\EK8~8'naxHKLV 2u)fl`Ŕ}l I Hcˆ$aˆwRa ;cM`il1T_|s5Wo%V|4Wގ'^X dJ5hZl<ܚg!^Megi; *(fPGFh}7t>DjQ>o~G <Z F49 WEi] SO>ԟEcٗN1;L;>؄Z5 iՏoǣ(ޗ ;[4hܒ[f?z5l !MGѨYsC.B֍Lͦ1qmT@wig͌ր*auC90Q2Cs>XyD5'^zҸ%"7ҵ`6=qk8:M#i֤)m"EQxxjvmJHhm9kR;!=YǔYZ1HvCT٘_ KkҵIjSA;>\I DLɸ؊z 1|C1gC!TV6i}JyikԦIɄ/@$)*?vؔSScV=.:NMkNx՜)]OOy1MVTMÙAkjVr[ Zy'(83qgpoH)3n(6OzLi6S~OPZ5j˼CKM$qNo%~BkٳW5I`ĕDݨ<8Rclٴe7hQ7O8~3JBL|:ʮlQRϱhV|.fێt*}ցK GdCIfTݻwmx r%z?D`n[cYqkU&n+Fam笻c8P$Ea+صWf׉ҩ 7bߪح̢:H/Q}=?|IؚAؐ)_ցs&&6vI:С2G 3NPna䧻(0G~}?c˒<[4!x`,iش1ap̨/dρ=28a]0yt_™Zۏfs+&)nd'X2x;zlaXA8 &ϑZSN㬆T~[> gL[PX&+gӉl۱UI]C_DV<}VDo|! X9Q#Dlr#qB$|vz DXvůlq5]lH~ (n 9#ϰyj}ںScOK?O;vNhm( ·sKdIB5h4@ ҴUYXzOZ(l! UE9lU hbL1EMXW'^JÉ0VBþ_q~vޯQ9(I$Co {ٛ54 Ɩ|5;$OX$:ж Zk[bW$Zpv6?nl-&thV yw$zPcw%Q[GCw|}e{gyp2RI?^v=EIX^ Y'Yբ6庎^9 Xɑ|_WN܅?ZyU<+EzY 7Eg:> wo7MYl { 6ޢ\!.&'?>O70Z䦝S9y76ZPӹv(!~e5>y~;* =Г@g'{Z2ZMf'vc?WӾV=,|}/Whd}V=M߬2} o/cnjwW$ 6.$º 'F;@ㅏDAIW}[d麇&_)^E+=\yauO>ʼÄ>8f2c)<{dUFKФf|* Ww.q3TU'9կxjHi]ĭL2^z(&gϘ֩_ˇ&5 &q%cz6NjQ{l! zӬYYZ(w'HU2=LGjujlN״OԸDo|owjݪl\ɨrg ֝bBS\5ӞwM#9UES gܽNVQSr5<-[x` '$pl7UU{ R7?i_/4n$^V1YO_ۉ+\E3ZP~ȶ.(OfK0?<>g[{J5ȶe9},)gѩyD}Tg2vƵ͝'eAHaߗsThC*H|щJe ЕLmʾ*-ג澫X o8HŽ ~DsvTxu<μ8_$ Icx?vN.<; {C;PB5}{&n87/#D5_ƐS&_@wH8F)ayZrq`42~+jW)=8#?oM'xC}l9Bh>ﳉFq}dߖLiy ؓLkO+Et]»(aǝuާ}c/"g@|4{Rl3ӟqD֖Ǵ<0xZIT_1nnD24g0qN~ދ&^wTX*>_to^K/8:H[{g_i=}k2BZ>Z/q[~Lﲕ%@cW662M1?k/f֧[!d6vIlzٽg}axLB$dKxUѣ %P7$l^EQ]MK&H$(׹$ PU52*^ݳ յf7Tar30.3UE*a۪,Md )|}aҗ $$YW zYޚ)z*j^$d0e Y2}dX'1UU Q2pnv;zqAWӭi?PU0 vK9Yޫ zEBeV)Cy24e08քew&p:@Űٰ8Taٰjg:Xf11fqd/" $5dOIVICJI7$HȲ,g$ 2Auxsw-G:lTlme 2OwA>.]sα{,xzxPL^t/dA0xG0`-t*CA*j!7GbooOPPhArM)n!z㬂  fJ%ܔfA!Z^@‡A_%|IMI%-ĥ^ Y#aCr~e|gWA sHT-KR"x^ux=( / _ |IKxbj GR<EEW~r+;9hhA$Ii=%Øٻh>Mrrc^J/M%~ >\WI5PwCAȳ+t9 DM`k4*׉:䍞e3MvE}n8K _O lՅTE<\?6:}n;]S:>G֟!kզ1'=ދ9?B.&|"lIi=f6{8\p4 {WyKX*q)`S k5Lw)Ұ&{9aYjꊔDH1vCVsjBlDtNE7Foux]] >t]1~f)k7[ ξDoXGzCv=k12\%m ;Vv5ot3ʺe,ʵ̙W8IƧfKkk* @iO;v 471~&.߄M~ޯkE* S6osmdzß* FZ]Ŝs=AƵT0@Z]fˡkyn͙)8װ ^ǣylK[}\ȒWy*aϟFҥWTjmNYג4@N$܊&p&:F-M>T%c+#puU|2pC>U vnC{^ՠ^g ɟ7IZ&3[t s] iɑ|B;kf2xt!PJjkDEc[~rL`D_NeoWajpy]|+zm1?ȴ.Y=12⓫tƸNv]UU\:o1W IDAT;|ɘNȒʓ 5A*~a)%EPQR.i}E,MIg$㺞OX3k9Tτ3kw~>Y1A 7䑻WU9f,ݨL.7mP57\JW|GDW1 ƴ tVųJ* Y 54 /FsS$w&?A|ݺW!,vRE!leo JCïVY \Q;U5.ؚKM‡pQW>ѵ9? [PہxڀOՐ!2rF\RJ~5 ry[=|z\.R7[W7sz*'i֚%dGJu#eZ-5\MZWuC Js/^A-@g~[e\SUd^S }[NMʆ>;OTd)[:jݠtv5;Ó5*LM-,hּ/"$RaF"סk Q%l& M飘#Y4ǬpKPeLݬٔXyBXPmƫU W= R@Z|sѩȲIh;OB Z~Y+(O݈t`J@OƛƇd{<$dYFvqiȨ(Єq߹vя m_Z8e:A>W1'Iڑ5v2Em3gWd~o^%R5eu:?ǚ|;(@ɵ_gboX^qWqB$>%h4#ϡ9Ev#T0>!7}Af G(NJ㷏{lI'DJ7숇d^/uFd\K}J0oߏd錝˂Axd(Bc pBQyx'Z{cܟ\ѡ*ʽ3 EX!{R_-! lU/ XU5,ØGh mFJ\+N>u8{Oa|د(< r t#h ֙~u8;RjT&=S I㣙=z7s`6{jcctوVxởQV!qNPW=O2P:P2<ϣ)[fm/5dάJNx%cf5܆JC?gDw||0IBs#^{> .% ?'2Z8P«yGsliÖSml И͆fæ ؘ kMӵvӭYfw2 [E_yլ-Z?Nź%_X]* *2Cc8FFB5|zS2 ա3.fեR$dtF%IB>mU F Gf96UQ#1Md g2!cyR ^E4 0h7%ZH]|xCք?Nz^vgGa)@Űٰ8Taٰjg:_cb>l9$^D2aÕkW)jܳ j%7gc]YWH{t𻽖r|4ggnX繤 S֢Bey gլ e *^Ȟh e";{[^`9Z,H f+«DHAM;D8e^|xl9E{'ODDTPlDDD&ODDTPlDDD5|l6""* }/jo}seBa{D|!(""j;~ #J3R.'ǣ/#6M sv{ruxiKij>yg_Rާ)LOM~hº2=hLM++m.<<+~5A m‚ oFCCxbp w?nqoGNtE ^DZ { cū=8d9<!/ &MbI~a͚5cq;uiՉwoQ#ܗ7g60l:6G+:Nu|+""U}@Sz'ߪ7.""VV庵7#ZGDDS|1ntSog?kGkֺfonjzBQqeYZ74FOb7 &)GDD_u>GjBݯe'TWlNCy"q+W_VS}'-}vŭuZ36MNfRm0=8A65_".^_v ⸌{߻&^_v)fϞcw"16:'8 ?K7|ͷuzARn\Oo]҉B䍴q"ixxW/=~tM+|}DqGԓN9_ K(KM*Xrտ<\'UPǸxRGpƧ?#<;< gQG<@\t`݇ΓF Bq 9UƢ=9i^{C?FD 7.==ܗlӵMX{pmk~=>uu⦇7 7?Zz- Cc-"X׷n7K.5R3 F1V\YsmV޻#O7x58iy+o}:[CDzqyBq"jV\| K'ĭwl[ 3vI; |>{R{;d|<4^B󉃱c+{+q'>; ˗-^6Qd5z1^w~>{cg݌_ >h|~?}N[v(u*lxq]cl-Xr=8`_z<_Ǘ| z?,|hѱ8_W=*ϭk}R_hRuyakQC[kɓ/]`ˣkġ{>p!f >'7_mྯ3?LO b޼brϟ?O{&VG^vp'/[;blxpy鎻q-? ݳrkgaχ}5EOqy"᎟Mg]K'VƚoZpn^ ˎ7<߲wv58~:?=~~UC-'6 sbJb'w<ݏũ”7H g^~q= :0sVx]NƧQf;{ Mc-(x fOIѣXuz%D~[y 42|06$.)7&?~wV_g7&TvMD3geg}:=uV\3go/] ;Lҫ/ccu /cC4S=>#enw:_??yOd}Ͼǟ9s39Xz(֮} {yo6GV܁? ߅@<|Rn1S]1{{"_ Iqeq=.N?*#C=y3bLP7Qvz\5t5yy ~_|3V%a?!a{`ڜ]~\>4o_8i1nf,\NV//_ 7~F,^Xilz3qʮ :|!q.=[A RT1br_KcfD|83;Ϛo{JO @sk{/6kNia_3|ڧq;ϞPhq =W/Ū5 o|kW\n=m1c/v\p&>~kۄ"wءbeɓ'c c6<8]s1w\}ٸŽXi(avŤumv~\Ǯ0pӷFSނzn<ރzaeضX;O%;^BMmy'sZYDE RT7܀]{~7]8kq;:燿=v:npْ㰳wQ/_,g~??kÍ߹o;`\~٥ }P*?;WOo9!%WbpN5`q⪏}7̝i~(]%Wn]s.Nr=`2pp~m~tql*g8K|Yݒ]>mLVֺܲUB1#T k֣F;Чb25[\3?Ʃew?:|_nAPj?8LVZuoMpQGpЕ}6v+0b沕y9af;ki:gjN^4˟uXZĖQAD2Qa``6EcC+*暍5=ZK59E&|ŀORDDTlr/Υń^X5'!{l,ԓKDDc{c(f%崬u-5VM> {ɶs[2Qq%]mоtV7,/ԫ1INzed.y]忁""ޭ˦^h皍5Ǭ,5ɧ񞼍ue/CDDŧoloH5ڦM>}d6w6m}S'bw \n?wߏ3c]v,5?i(Z;ϲnN5$1PQ5]#h9DӌXE8x&t_񣧧SNmL:?>9΅WgٜPc}Ehr%)6.wʼdDVE1cf̘aSB<mZΥ(:Fe,'_ThN~C$nWb28Q,i}1=ZvocN>vnOf~@ "}$'1k[^+ɧh'/4ڹۜtFDDEQRszIܓoX;뵎w2 CDD#z}o>olouv@m˷E1jyA<}SM?HDD㋽= ^\hǝw2Bl]ZI1;;v*GDDť^?A?˺ϭei%j$7No^N^DDT\#Z Cem^ϣ!4VI:9/ZokQ\KtkO6A,S|_jc%C'S7BbeK;RCDDTLrݷwI˷Ef!;9v&e=ĥ2~~{QG""j^x#P:z5w :C,5M3$XvoTN%ףE$ףד'OXʺDZ>>K>oyRLzꉈx)ԀB6E/̷7]o%VFR(GQ6+HE-[ Ub8^~FKsyGw^(s׼oZǽy~vВ+9D?}z+R%kF/ǔ Ҡ퇑Ff/9ű1#"K2z1=믍 RZ7hYP 佸~||P /C];| ۓ&5G}tN:nc#mINrVFC#=lmCQ1k'kc2nX$ju:d\F;כŴP>oZ;|赗ͺjc5v-o܁&* ^DŽmcZn@G:9slыY:剈,{]TF/&U!MTek&uFcr}u^?&uB:)7:c GNj~42FfR#9?\񏠶Q=W#~^eTKĢJlDAe-s=ژܓ'bKKCsk]n^Mخ=޹Jmc8sIXuIDAT\蹥BT15[O\o4EQmIJUB˕/˦U05yzssPH 5}mb@Mm1}7.1W%Eֺt/Zt+k=J\Fɕ+ĥ>~.eTGnwr\wUy~ӯU9os"5л {ݵ9}^KS+q\Ǥix~\d.yӛ(t^ۺ1{O]$FeGÉ+yݺ=TL7sT1I,R1Kj.Ql ^ǽ=^ދQNbkWvֺF]t}Q~pېӣVjY|yp4tZ-թ&oŨo:/\enc +:́FrҤ _Ge.ǖ 뺸2erlټwt܎:o%Bه&iDzjd9`rl@פm|<-&Zu *TֺK^jt׍^7PKÖq%'5۹l^u^x!Yh|\l^P{5]i~%@dGTFR=/ۦM>F{1D*&Zp *k$+zLil!ebZZ<&"^gCxQo^*s[똮q}|Cͽ,/ŒO&&߀~\T Ͷ ;tR'KߗG>H\jZzvUZ"*<^ch&\{-kqByi^ ۢM^Hn:6/k99v_}"T^KEen!@o?}i^OCBP&P ŅC&kO/fޤ2ڜWu\Yk:nvmۢU~}czv1M kmVE\6۵'%ؼ] hvovҰm7] koljlLtLhBj.FycMb6yv.@8SKD㗽&& Wc1]cFqbu,k\Iת|8mv_%mۼ<u^$cDD5&y^C76N\ʇ♍՝|MKF\4]ӏ^`z1a|Hy"XʛWݻٵٜu:'1=vn1jmDI19z!y]gsMU^tۘsNiv/{LTs:[cz.km< Ņ^Ӫ|qf$^۹e'ŒF-K[mVы劉v۵ͭO5w苐%/(RqH^<C2q{|R($:j2bzZۜ\:fvmGaiu3H:^R78Cټ̓b΅<')|ohc6zmɚqk7$r$/)'Z^ۼWcyr{\l][ODm0ktͅlќۼ]{5ޓT˥ !xyy`h'mmu^hb")>D444r^ jۼW#k;(vm5Ϭ,[1l܎^,Rsc6uQm޺Q:C=\&iGe4 /&nFĨmZRcI>TcGtΫ׫q 9?QkF(՜bzen<C# Qxjh"vG3L#fͅVx]{ZUY;Acf뼦hk^ۼW4j^.4Zϣ ׊:F3qogsvٵ܎uv.KMfg=fu^ô5@ro6iͫsoE#Hqo,uvL$;K P_j6gG->b@8$爈Z%r^܋~b弘[dR[;Dc7ZjN$5aoعYYP#5j?Ŵ:k[.v6Z6HbE(NDBk^L 5 dZKIgB ׫5 =|(.Iٗo(Pc ͵PMhjz/ZͥN6ՊzK[{lMuY눈:!kZ'l}޵֤? txykYƮ?j񈈒)m̮=^5'o}zl6@x/5֬,oj;ҮwIy/<^]'ɻOUSyEhZ\($爈&V7r8ˢ٧%A5OK:FRh>ODDUi|R.F~--̾Zq@hԦդj8hy>ke=V: _m3:8DTLjLy'kmֺ,9V3T6fW3&{ܼ!:Q;=N9n3E77f[gc4/xLlf߬}fohZ[u:xi궦Ӫkqb<][\[uVDDԬnlzN:N[ҮۮiW#nq[n6v?vZͷo"4NN=TEXz\"";VrEnNں9uZ76n|NMhMg^""WȆa9 "* =lpxׄnisHD>lM`,o""6n""""""""""""""""""""""""""""""""""ǿsIENDB`kraft-1.2.2/manual/images/nl/context_3.png000066400000000000000000000167031467704360200204120ustar00rootroot00000000000000PNG  IHDRj  pHYs+uIDATx^yxEހ Kp ( PDD+"`]@@YeQP.Nx 9rLL'JLO y_UWdޮ9D"H$D"H$GHy$]  S ARz Qڲ$R; JCKJ[R2ӷ?m%dm[4m'R$%Ka崻v>)N|쵑?뫍z[`):IMВEqHV1ȋ{Ĵ[-*" bf|K_Z\O"վbv%j'%((1T/bIaES,U([ bJBOx2ՏU+j1f\N'촑v$ٜLysx, 1FqOeQh1/9n%(XF^,[*{_[IiɍYtq3y_ǔV#A[i*fĴ]-[SC'gge60TH-$$ؕ2dS4WzQ`om,}}ëTS^txʕ}%~(OcSSܩ+_eK@!1Kn658zuDH*:ԋLesZ$̗sٛ쪱dg7p7H\T'';>&W*[R\3(4tC2ܕ2P72G>rSȳfv;[Jp#4J׃HNfmt1ި=4.fs8ȰJNq{L p6u"w m*5>) XyjH|>_Ȥ+ur(%R󵼈U @Vqsq\j7I숕V1~b>q6 /] Ma3OHKx5}v7#vd.ugh,f=}Ϗ('VxM,{ x}¡_dK]4UhY8ϾS4p4j ~*#BQEc5B]' &]3)kh沤,'L3b/'q`bLܧ ↁø-Vwh="Q N#-i Kci蕣p9$uɧ_a#X[з=W3Wkπf#)ິ|`ϥ|~_E\;݁>7pdVN:_Fc[-02'&2G.:E#)\REiLuATn؎5ϒr-RVͨY9GHmlDvaWJ7񄷁y+G:<(ߍzޡK;4ϟ*TUgIt5&T/DV[t8(Unz:ɛ~^NgΟhvM?Qc\6o(y gw3jL]r厨^й|W6S2hIsQ:ONBH|DIv9ߦFPHY&n::1{SlƮؾ"|.T649 ۏAٯXG;wG<g9.UGHNzf~<~?zIF7R-LE<ʾ??\D< v j%}]һs~zAf;{ ow@Iq`%;mrWxou`ͭ/_J*JKҤ̄‰+bXr| 1CpQ7fQ||<Tnd$B+l9rE,_f·v-a9p} TfQcSPR1%mDOϢ%EaqClySJJx+lٲZR( MDRH% )B!T(^K־=?=?vZK <$F}&_222dI&׏{9rc+Yԝ$;P_Lr=t Ӿs#cܭc֞x&L`,_UUǨQ4oޜ{ [Zcɒ% 4OF~o_Kל\3exo~~kv$!}cpvdc|)Y:v0+'dMhEQ } PUװׯg˗K-+ U ?kp^ǜ*g/m Rq4[]='ңi,U !f `V ШQG( UTC:t&ЩcG'%%[oF+U/k7F?e'ߗ>O|:dģ#qyd*~ ~y.==q'WqߣXc۝w{(&Jqڏ;@-)9X7~zsߐ=o寲]Jf[O/N:!!q%]o6#9׈)7pXE)wsrr8q"mZfteҤI4mڔ0Ǝ;{D+e4CV'@x7&| SqgtM}G&즷s"Kֳbt[Tг~`g _lZ͌4M_/J2iĺI]6ѹ.yGTD>[%ڐB&fJR ^t#[WA쉷w4z{01>4r'9kv ̝;/̗۶ϲrJN8 W$qtWHUS^k=_d݆32(a1ۊ۶R't,WLXqj0B`%?ކ:$sܽOHL+5$hY+gM7{"֮?KҼ x|_)WuC aҤIl޼?M*dlҧw+s 3H 7*Dl/<鳩wdUIrq] BpjԬ;(AuOg=$_Rp(9yJn+LNtf#}/HСC=c/'&rM7ݮ];~WwlSfd`{E0FIJiE4^85Qz_[C , ({* MHY՝+hƅ1./]vk_s/ńt֝!tޚd$㯽{ߥxD;+rr;cJٹ{%[Bdx6F=k>g{q.i)L{X>|-SU%澷XrW.LP8c4dk7nd܇\3uyv}3YZbSYu2'W~]6qx/nyz XE&o=iJUGZJ*oBi^Us-LlEX,b+m7dz.6|Uz4#YS'`ҿߑ]o51n"reBM2d?4 =}ykBݑ'o6?M'eJv]׏GE8vw]{*,Qo0m ';ޛVyI{^-*n0V5-E4.:! ߝOgWZGnݾot\nc[xZ.3&~ぷq( NRΥԪMT^6ΑidI!y$t0L]3~ fCfuV C _5jO?EuTU͝ř><"3fPBBjil~F ]d7o?BƆ4E]Z=l2ݪKe.W|ZCRV uUtO$F+j 5r =(˜ [G.D^'-OKMaRlny~΁ ((eʠAlĝ,x83 ~ح;/O#1R Hb\ֵ=|L=K&ajғQSSǼdZncdz?a 6݇'T]NX={:1olzPe)5oA7o_ַZ 9}cI{f9Ϸ XLR\V!cƦRc1e$brg v@%_}l+vU/oO s"⠊<2!9#?Y#F%%'o՝"N"x^ɍXX"N7Vi&ة3K$1Puބؙ1Ps\=␔5v)5cF/ #A /M^ 2F݌X czpHt^RaH 88(._,ǒ:q5ŗEi/^|u#*$ O| pG*oU/ş9oysZ6.2K9H*.ZppԴ p̙lfxf@l%z:|B'2B%.+BG1 -b^RzX f,:s yWxCJ#n7 1 <([bYReԐw,(1~E<-Wx3f1q2F;Cv#;5Grc%U*Jmu%&; eY hky+z[^b_OO"S1oތ\(| $"SL̋=bٌ:IM:N*ۘV1Oe+U{O{JŘcJ++3c0x+NSYXYIZݲW #>b̓E{NIaG0O%oUG +~bbY$Ϯvc^)2}$U/)X (2Ptsgnn@!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!_JB!гRUC!B!8)“}$B!p#iRL>B!BTuAo+m+B!8krv8nxB!9 6U?:TsW!BQuUx zB!UGjUշB!BTuqXW#[U !B!@y+ݑThUmy*xB!8YeݦʚJ Neʚ'R9nB!w; }{**k*q8!m]?+B!NE ^GEׯkSUuCvhT8‰vh`-^Wep}'zNp"͏4O!BHHlz~}'zN>8Br9XELSh*},ھ*ܸ'B!ᠼPƝb:='ھJNUG`'^Oy6=?ھJB޷ŅB!s+MBhDi^UuBP}}LVhD[G!BEyh L.T^~8G.N?\<)s*q-x(YW!BV"'ܺnnq[V帵Un9NN1'AtQ"$ҹ#̓f3>}r[o;˫B!2+j"}szyzpcI&;sZ1<}iGHbwS}[[]Bdc 5wVD[G!BhPv|5nYM;KҦ_s*:.8BjT9mӋH JVczm~8 !Bq8>9{6u,1e1{I[] %TNTvqjPcPz\/^,cv\9-֗zۦuƅB!8+tp}p.ǝ3^\:4.mNqPƢRYIy HPRPs8Cͫp܄5&B!*Tj -Wb^yjLm;q5VҦTt<*Ljܭr*Ծz_SK栍jLm,\_!B2qq(;f/݊Bzg9K58KSܭ 5ê_-oQ䶞^ŝzcP[^xEwԎcv[/ZնwIE+B!DyESʍsY;5nS}o\5ǎJ=krҷ^^⡨W "PCAju<ͩVB!#Ʋ,п\ xvLӿkhC֯PY w}xq5O-> Q5[?~mfW3aثeـB!B2'jaWږ2fz1=_nJFku^u=_efiwb(v]0ڷjQYԶsRh3YVX kƟّEԨ^#BX?F=e<\hi dQZ=6t6#vMĴ[O;i5  2@jn(7ji_/fxL:wiTq>NYr!-8=1 G5g}wXn5%%5 0Mx=_Ef\|Py>H 1@z \r0{fKn '"=#Cfip<3%$pz6'M ˲xdV]7X\~yg9ӽ+O<;OΛo`uLw&~f&k԰?tS>EKcY5qqXy^={pi԰> S@24n܈|n]иQC^c~z'c{.IFlؼm۷Ю _}%mZ gbwӋ4aCϦIÆ/QZO?:+n8Φ[<3U&O|/Nϡql޲~1WNn]ǟscY v5tڅ‚BMo;oҥGw@n^_~=ff.5m;DJZZ1x%W`Yb4=F ?%I~Ț<'ar;{͛6a#i(bbILZkoC[\0{-ɋ²,ޟK.Fx6oo˾4nԐx~aCY&7lշ& UcsU{g~*GwȎ]`1oL~ ?!Of|<rrxg',]ĕ\y _};&1yb>S5 !t^yĕa x1wsuyӽ+cンGzwzr5_}xNFWdyJ-;,DAs)j̦TsU]pԝd(}\j.:M\rq>bЬhvmh`T)wPv21[>߯qXY"ݻ1ګxqe<{d\֯y]x⏙x<U\vx<~Ns<;vwcٶc'ڵŲ,6o-]֭]W|ϟsBaиQ#.x8O2'ٱsm[bӏ׼=!.=eYT㫏eܓO?9Tz N&!ΝOVxI\:k/\7ncK^~>=k.Śuhڤ1}gom=9ǟO^^Oy_ NOQ2w"|>;vqͣi԰>QvɅ^b݆ӽ+EKsn3n~$~̛>?-d{z[hy{Xź ddd1!n$G[{2\~pnumw ccc9{@ĸy'xf+yM׼2 V]Oy'8߉̚g| PV-i"eѳG7RyvU^ػoqO`M4Sq8 `w3b3*;tf*w,I'&vY"w0y۰Mff5[nϾZx<އXEjZ7_ /o 57I<0.6_85I(=]hYĕ8q r<5]Lnqu̎ŧ:)G}+C1*C.21]/CaAcvY^}Rq)68|;S>ѝ9O2o6iLΝo(((`מ_O'-۶_P@Q:ݏ̗_G^=1 =b2EAzƔC;S>f=_o߹۶ٴe 4n˲ Jڪɞ}|.X\<1|ڽiO0 ?璸rl۾zogdIl۾e+]5jP^͚6)>>^/c%|Bhr֭߀gyJriڸ1, ޾KcyEseXdG5kRj?Jrr >?ΧU53gu;W/aKò$;lYW1iР>7oe>:֭1ݻ_\~WC~f6l\ksמRwCF||M,+x(4_- RRӨUFVjݟL à~zlشuTQ6IjZZ>̬7|>0hP7^zxؘHIJ,L 9%YŪ_/.Nvm1 ]i@ G^=xĔO$|Lv[gd*5 qѰ4n˂Mg_ڴ}֬]MІ pR?XAA!`Jj%at؁{RZf-c>jY?;1wpG8P }zH,bيA>_& 5jPZ+V2Shެ -%qjE8irdw~f:ン{|qYKF|i6mيeY|49bIg 4Wꍳuj323iܨa'&'#3y.ԧ?%[P)RTr s-$'0g/(!gpZhPЇǞy,Z՜-uCq[ll,<|;icN IDAT @Q*'==}y/i?Xgd݌JCeu6rW|~_}CQ~ݸy+TVqB:ڳ, `+O\\,5k`XEƍ8{_v"'Ͻ4K/FΝ9 4.:bqqqtؾԺeY$:uh眩 ![qO>[)&[BG2KڹSbJ FFΝy^{ES65GyDg8+K94jT#0 <mbj_nX6quJsxK}}yJn{)8\edf1)<|ݮ}UF]{*1IrJ*oN)|Ïs-Lzu<99Xv/HZz:)ii2N[nf|.-7 0ܳXx .yWHMK#qj/[2/kmu<7_?IFf&3f0w"5lc~RRxٳo?oy dshӺUuG puWfǓ~_uiV^y4/?3 ++0mOL"99/o[;p )~ӏ=DFf&va߬ض}}9u>̲ĕ;SF7jDAa -e݆M]VV6Ͻ4g_yO18YRS!Dd*J4 VUB!Bbom5RtNVp;L?z,n!B!DUnGc6Hiޏv:@B!BQB"z/9Ve*;1o w`BՋB!BGij*=9$'bshN!B!DUU5K1?,3*O?N1@:8B!BQ՜j=.bPcH*ա*88S\2>aԨ FqߧkZylcϒ2 ӈßw'3_ݏd?>/Ph4ny}} BCʩ U8lNsbLlSn$1oss:? |ڏxCSiTƊiy ݛWׇ# k1N  ˞uI$m ШS2>4,g`V*[-rsr&/oY%Y cIIIy MşgBQĩʀRhbN$7bUQp RfIIlS N#{e` ^ݶe9ݟXLcZ5tMZ5G^ry̆8uiղaŲ,EL[>ᝫZyF!k.$~Dʂ3䖧p;nb7o7@<8~4gun\5/Ь,[M_/'sTTGyh66c:!2gU<#BY xȩfq:.ҼUe }UXLjvNkF3:vhD A y&/<lmO &ez0ۼ'!hY,]ZZҹI>D[ٻ0[~A G_cc@|LCQ0Բft7/=~8OJ'5q_7vgۊccXռ:G6:q_H ?ܙF{:.80>ww99љQ`+tM!VsxQoG'03Olݟ:U2IږF~l-:p\ekNO_gWEmyy =r|$Mr#s.nJ[8No;$KM8 _ hB+g3sMcM$zhN>g8gۄj`eTՌ? )c|^71j{oNY>:6[Lcc'S0{f<nۓ^j ,g[j[sLa\0 pb#&LUρ ~L{5+{>_3k:vexV)zʐA'СJ޹gs Z_( mQr69o>o> L\ ?m%?|2癩pegyo0c$ό_?ļջ ӬSξ|4V#BsE=f/1=Oe纽E[e tnAPJ+Q2a`U¦$= d/> }{m:91F?s߱%Wq9>e4O -#{֓ j^ @߯2扩*q dƷqrO5CX:w~6<۵Mg1O\Ijc9`ae<0e9@6,{&N¸WmQKVVob=ˤ@`XJW{m\>7?VG3;RlV|ToɱY|ƞqExws=nj-}3? \I&%ߥͦT|X%`QlD)lZD3|;{my%qL׽+7K-nYMbRq5Ry%I48U$Xvsѭ1907~0wƊO_aboHz ͪ#ܽߨ%;FKfF\  Ԃ&qCgg&4eZoݣtHo1 qL}I嘮''0sԠE3><L]xZhQ+o#IL.9NlA5X/|8\{`kb2Xg,-z|e6獦YM+1%)7q]7յF%_s/1?K)BHU-!{яw(W4-YrqY8L7 . <) S2lr:} 0g[GC ̙5z {0Z\I :/Ɖ,Ir}WkrO;Kg |?~O#O[cX4o=;{{,.ef~N9bwn0j Sfü12P0뇟Ĺ XE38whz)NˠOؓ˶.cdXF@ !G.Ux(/P# ctvۘS\s a4 iףib.f?Zy0&Al3Ҫ-]W:.-@fFوEs9q6s}0{x >zx wʰlN6K ,#紡Zz8|0mOaSjaD7ǨޗkDjXVKI[Xl뇮`FqRܴ kVOb|$oӧB-2kӲe5vmKeE켩3+鷠zwV ,h4~^r˽9Z#ߢ[^؜5g萖ĘE8|~ vMhe'x]acdzL^tLGLc fXOM|ŵSNf@ژERCGgD߶ewj~Ѹ LT>Զ&? 1Kn?+ "!_ASquW0SR_A+#]{ڬ zKV1lS })~$E+g0x7An aoXf%'NV^ J}ҠV1KLvi ϜM>g ״odž9V\#u/EĔz!O 1Ʒ/|~؛L0EI= @L61oo*J&RFQo>e呾/OOj z^t`ER*H`kyoϢ h|=x<ւ={eIG>9奰HMI+-KfĘkK $- &1 Sm⒮4jҰ(;fW0=Aߊ1_*~c+ӄMK߿M0_!88v)-^؄_pB;+\Ӹaj墡1~ ?Ō>1#uMg7xh@f j/\)5Zu#mS@љ l쉉 ,[~_w)c~c\ӫFaҤ[\1%?S0B?SԻ&f9l;YuN̉uLH9`*c}0dģSEWG|m+)@s6-˜1v;?TJ2r|{%yY| 1'sr,_2¤c/O[οNkXY.Eh7=Tfllə?"1)= Q`WYt߲F}ďma[q|[4# IDATyM!ph]tN1UqA,6jgq}>z3 b_xo|S8}Yzu}PK~Fp u{,QŁwH0lMS;Jh)QJp5o sY2pc?})/^KoY H0=x @>{-V^?!AB,@p܌mIzu1 jztx+llq6'&i9,ԯljݫFMk@ԌJ"+imiLT!B8U;"3ݙg)>c/*%z$4zuuTʬ,hZ 4qC|lSv>{H{/J`#=pW\ j_1\kh_yUg ɌcoƯpc\~2͌dO˭9it zK=ޑ#өAξͬc&g oKe'0䤺1ܜ\ѩgp|M#x'1pdq9ݩ/d?є`'_9-~)m4)5;;`iS/bHӿ'={QÛ5 uBgϨFmZo7OJ"Oe?*׭j[ 'rR4ӗe[XuE1Y1+?&pۃ۹4%e*=Rc Oi>J[.gB>;}{3+atwjCqs?C>=9tF_x>~\9u.nQ̶Mg:ˆ?B! nq]y*{x1֡,8miY.'X0oWVc{?b=3[4ŸӧtXF'\5ف3tɫ3/7M2ګy֕"RS͕|[<s婅+sϹ xdNK> XLV>=+Fo{3<7xԲʬTA܏z3'?{E6p;3^IW^tJXTTPi H( 4H;%?|N),xh dHX7R_ՠvY;~,p݂Gi3ej$Z Z?5gtNǛrGP=6xt GKohBĦ\}sEHxq9yZO<ۖc6p&gemWaq{hZiς+9{m?}0 tB j0 :=|ۙ5rvmzy,?B!# mo'n玾;+nvSʾN'#5Ӯ3!}nKad\L?f8dmiyinoo8̷8LyNY?^]u;|AE^MQ6 LNQUU$OU%':xk^xzcX2qY=.Bmp\I=L'ݹ=r+yg<;NY9 V q@0S@<6u)/^Cټ2rg},B!;r,8_:Smϝؗk_3edlA)W, %gPIB%B!wrbOWN; p#n{Vrbu&XoeD%0ʑB!~w׾@>tt'3NKZ%>Ćops\NNG %XdP{((o !B;9Sw'L+Eiqry B!rC+mN;{BH_^"B!skvd)B!όo+NGB!B~+B!'qg+/T!B!?B!Bp !B!2B!B/d)B!"_ȀS!B!DB!B|!N!B!BB!B! 8B!B p !B!2B!B/ddϤN(Y2HgZ3bU,^2"EA?c؜Fb<YcRN} i yXfa΅3#ו2=9G.ʕAsuN.Jt]k}[Cz"-Ne|'%u_^Y8/۶zݸA}o\gcpװDni-׈?G&OtxΌt$֍:9i}+VV̜ڵ. ݮ7͇f%9ATBil7] tPGX =K!u=G 5cx\0t,y+ܹr |GXʹ~}sWZ楣KqC K|=73vn%fk/eZ!?Rґ*•OGVZse||V .͂rᱹ <0srjjX2-xP%n:mؾ>: OMFz&_ _ذd:S $;b6c _<dzξCSɃȃ=u6i;vdΝ^?{S?K!Rs EU@+XuN-zW[ѸL( `9ًsv/C^eb̕痷 (NՉzq3# .W2A&[ |3Vr(˩ ^o;@OnV` %UcKA=;;/X=Ut^iML1U ^MNlQhWɄp֯:Hx|46~3<;>z7%QTq/wCʆcKO%$Vn@cu{k6C5aira~8{%=ːQāS\(ո#8ÖS$dU!O>L2־; [fOcW?r&U@޼:uQcbr{"UHe9齋yʐoXה8MЍ̘DVR7JE!,8ną\Kۙxk￟n]&O_4'KѶyV^%)_f?hB >: Kz[.P)G=ErE=;=U?]v/ N\[Ώ#yG:';=E@<zKTuz> e6vxGCa R,>3M7vv_׼%;8r&:uz@Ѳcͫ<g/ߞci |'|D'.}u w)9bbC9˂ 6!m3wƤ9?6>fRtz͂i(tq1ß?O| 6-˩dȊ11Pӛx|u<ԯ,2hSw?_3R1xԓev3/[j6qϴtSWUIc\g^|Qa4f{9=5;ObzNgPKXcELI?-a|}!C3Gg sX2'.iDh#04vk։Ҟ\bۏ|\tyH5Ә2o;'R5 oe1> ]n, (^1f.kr$I#B+t Nż=}ߞI)N#ym]Nҏywr>9-S|3l-#=*@9̴B߆^nV^y1'>~?'կ-{K i8xsPQs}E߽5x(nʴ|@ +"^y&teATt`HJ+Մf%1o|}2 d6ϲ|EkY97sz&[[,_Oc+SXwٌa9&=SodӲػeZ=%:~,?_ʼk`qLǔCxnj/Lˋ'ek;fɅj=]y]#(_|NɋXaoNcԥ AַxiNwqB^np]?eacy5l\)/7>cfmY͟K3|*[Œ1(nrʰmjeޗ|lUM{19+ٸڤ}ά/Ob8/[!Ζp<"}+Qy,_q3赡韱|<ثſ_+7clٖHVR<- .e%\3_o9/ae!'!dʻ9 M',fOW o9 xH/LǛK=DZlp+#_ >» `wQvN3p'vAɀ \ *֦J '{N7f&Ϧ.3slf u7E[s^dHӒy9H {Q e>|!6 @qTAFWX~?ă c ׼t 4<'_bBҿs/T9rlW^ev.4QU 7 keשת!Z{Oסt^{%2ys :3^tD?VP(D`tiͮd9u_gD IDAToLG,I?:" ;O|r'_Q6txAE)]8UUQUTMT1qKhL!eܩWw$C l[S.&@c>I߰u~ڗZLTh^slk޻0)ּm:kQlN~}Inhmlc0 DGSd{mNE 6S1¨ߥ=0IX._ߧeǹV f* i*bmZ76n=ŀ[~ پֽQ?45vv7c9m- z( ]a]3ywoEi5J=\s=ٵ/bSYq.#~e@b* C/Hw@ yP+ҹl{,^ )٢1 6~Æ Zle*Ǽz]HrkԼ\eæcd  ҡt~p*6A:W$_#DcLśRX'wq+?&?lލ zW#8 2%6)[MثMhAi.Ν'X#R_D--Q6`֭\ݖ汮W,A4o|wqӻq=M\ـPO zX끜zVŗ O#`#lpU _碎P)TEC7!9ۆ໽'0iխIG.=f lz|_\(AWUQ|b-vO4-:w}OwrniEՠAE\.J+љvW'z5q{-g}hK/VR0Є_xzo ~Lr/"߄) pk}΅潞Шқ:WPxA_v֪ڕbv%̹tW[? k߽# (*bsm9 eъw*`mDӪd'߭ۊvFUCܭ#O N·;Lw7+?*e:ѷe\f3?ΰE R`cWkpZIس{n2W"tJa*IRhѻV&L5jL\LOoe3>&+ܒnM q(;b߾46i+rKECi78c[>#4q.OjI8Ȍ]ж~:Χ!: dݖ*NM99 ;KcZnr%1[{[2 lKBP yY|lo7Z !:&(EPuWt^1E)QDBr%céht K #('(DI #"zC70й-qKQiѥ!?^Hj'JADpXBRba- ^ޥq5!Fm}m TKxN'2/sD,~ |fAe#KȃLY>ƁQEESu'$q|!û}(Z1UH'..環ni=PU-({RT0 P>>/~0=6=8ׅ$3H":JЫ /wRB)^2m((QMPw _qi0 BQDN)wQ$BTtPNU 5/XD 2;OUb @J2i$\"Jri+d.gz. SO\OJ؂lQ1Qɶ \%2i'J8"[/:Ȍ$gAW"̩D:BT)൞@ܙL(o 0b S|{^D(N}2 Jv:;+N׊Ѧ]9l8y/S3PAu滥UvS(p8:'7tXg_A'S-Lt"sqS˱PtALAb+$z"IAֵd-䰽KwP@`ΤFfߗ`IµyO{Y ofo4nssf|$;FAQh*u=]3*&>(J8 7qfn3C<r<II MӸ}廽|Cʑh(9SF&lED % *ل س;jӧd5}/1q(njDGp*9%\*i;y{Bx|*ە XbĮ̶ O)AR"t(H-F>ED҄^vCUHOgK"ּ6'^&?? O'c?$%I팹L9Ou^ZxDڟpxu_#ޘ<Q~2l/ tzu:7_!~Jz}\DDD@eu(P|̩ipL`T'8MS*_%OGؘj()q#D!<"%n[4[V) ^Jv]̍5RlCPEQ \'Uwn/ʍMD=v444%S'x@-ՔE䳹{pKLX0n:Lk:V6Cص` ?%Q4#"Nrpy&_+>p{ոI_}371ʷ<mFw%AOl67M JhO?`B&$ݵ7HJ["5[gضX׹T6p(V6 ǫokrg3-,?Z8Q u:i_3I?/ӽh_?[!s?lq eN3ɴRy}6c/ɘIt"/B괣Y7t'Fvvm>h$ ˗[ٗ]riop?,X]6WCuA UVاէIiVqlXrF]ʸ\ 5,Фh^XYneֳ2 voB&uSէ˥)#k7 PbQ5 l8'*P,w 景X<ʕZ%J܇zb5r K? k~_Xt?W2 ?XNFMۻ}G8ӟ&fad+$_KT:E,8y&JҹTRs+])бiYɾis Eѹ+?@s۱7f)oobZ>UbCW`U0yf3o` QMŕ|:d^Ü%G(߮%TT9n>MԳq&h)ȡϓ`Ė5{;^[Y.e*|r?\45<0[]:IKsOI8`1kki~/^ADIlW>Bі5}vt(qZ5c.m{ۛ8yS9L|z>N4m/9ER@fx׎|sRޏPudFV9δ:ߚ^`1p:o mv|:3;eth^a?ObtcL|/f̶MA0<ɃӴ }s,`0O?{C3\=y|oq>y3j(a4ןB{_[!_MzѡS|v hn߁ORm+kGf>}mb%y|(&kkvu{Ypu7q{"=dϤ'냼-8ɹq-#Zi: 낾1ы17jNq{::Ae['3?c\\ jՔMШI}]7uv}w$=[IJs|_ڵ32rۼ0nqjdvnCoה>q&bG2[^C-2#_x>ѾY{ mP3pc:2;ti)]B% zU 5j֣칓R֤!l\'S^#N+߅$3wH':C~>ѯcCRݱ Vqx8c43t` da<jtɕZ/ϙѾm'Lgj4}_}9m n`t,B2qD5k{oӑ]`'=i p?p7?}v4OcGޏl Ƴ19M5_dtkۆv3?ٝ\fn(ź3ab{2>MV͉SSnN 8͏hcai5Ǎ<]*@!3HavOOii(TEѺ|v8jLۀoU|Oehƶaܔ(KGеM<}HbWԫ*:1:6_nb%@?})Қj޿M+EW&2q.vix}v_toh2i2 HsM.ϾKHqۼm6>럽YQ=|V0mrXOlMi̤F PpeEc[C7гϼc}7眤)g¬Km^fap3_4pw}[89Ggd-ն t[8{mę0Iyb)[.e_ НPlo[x[DZX ToUFlh(X!o=-u~[Y6(ye0%;Ms[z><)=1\YϢ(bui3.u\\X|M{7 Ϣwzz5烯:`=n8twN30e?z lqT1gvk]˥s=T[yH?F5q^1׸v<4'zy } X= tݰMi{peŇ{,kN><‘ԵeCAQarXu~x[]ˣr-n^.VnSMy^zfbVVV&`,@}}0mMa0mX~69N.<'HQPSyZCQ5xZe{?&)P.n>)Tt?,VyO۹{oۺCQYJRZ>O(@QQg=xP>8nyPFת.錧9ݲa|-N?e=\q<)=. @HAynL:n&gE/Q~jnʣ(RX˛zsZZy*<6qI30yyC=>aγ\a{Gv|%;O<-)كpXe8w1B]W=x8x8pe[:纏~S[y ;il%]xvL+ Whf~~(ϭLX>Y\foX'V^/6!} ǸnLZ=xƞEգ: zjUDNބ*yU=m^W4ا]\ou`yK(۴lKen;ֿ;vPu,/`-Eޖ\%N!c%ވ0Ins7-mBV!B!B!B|!N!B!BB!B! 8B!B p !B!2B!B/d)B!"_ȀS!B!DB!B|!N!B!Bf}¿-هs WPlN7{w[!B_d_نlA:;#>[`Sľsr'v@0eI4En̜ڵ)낿A/CGm>;[ҋeG!B#p#q}1OyBu ˩^wd|PR3 E-X1k??/! - B!'3 VώF0)`vJg6ֻURn(X?cr(lx`>n1nO +7vGE:3.}(Ӎ|b<1ñG9hF\X^GAg2vɞ{03 =T ?%fY |eWY} =YXJ&ARMl6O#`u:+ˡ ZR/g{&t~YԏCSn5''gzQܻ"0`9a*pd+=;;?\T=UT#_׼%;8r&1:~nLwWK>pD=RM0jĽ)a9Adg.]ep0#(_|NɋXaoNcԥj3ʬAYs~՟ByC̀WR;%XNh;0ֳ~(kr00y2,bU|X_ºf̞vnZVy!MK;S,'L`[0Z1g7ױ׿.Po'۴S Lu/cs0P%K'!n`dƧS3d|~gps,\/f =\Ⱦ: z !B]x IDAT79WN-zˌ*JԭU0? 4OkٷtjEZЧ]5 = Ο((QxJbٵ/b1©м>E/p߯ߊ~ /*]Qn^QTz\} Ŏ3@mb5ӯgBU׳7#[$ϟziuߧX[W.C"(JN w C3Y,=4PF`tiͮd7anLѻzĕ)AIAu7\^߾TRΝjpu.u8)i)JDh0߰|Uz6ҲSBlKe32c`>31OǬd&ZAT'=$p%1o_ŷc +-w<PJd;DJHA ;KL-]%Bd)B!dTJ p1F;#^e^v444%S'xӀ nQL,9 3AԱ_Hj/#R)d\W-@['m?RT!BpO(RK( K/Q@, da<9jt|ߓ!wle‘}=|>"=ɔau8u592GnO)Krg(uekߑæqtM .qZ5c.m{ۛ8y0_dtkۆv`?ٝҚ=ɑ4}&<֭ -k,~R:t #gCoM/0D,;!Ӷ-kt=-Wmx*;K7B!BM8񸞷y]^g&i 9LlMi̤F P|` v{<MݢQu :m?yZwKcYfÐ|mHrڼ{4x m'@63kߚjB|UxXW[fEAt8\X< *uHZ?#LlŠx_EA|9G]IMO׊A̿3 +scz~XVѵʑك1G;b ?XZޖc84k`x]Nҫ3 leXE䙴Rڳg7BA m] O5fe:-o甛ʝ1kx*49kJ˜0*@!ƷoULC׷/&$yB&vm`ųDѣJt pi͛ǔɓqsss !BdIF8_d4r3$뉄/?3mQ!ט;tGI䂡L/H9kضq6 khZ!7]3:K7s Jcڍ4нg|AhOY{Zv& _V_7 dIlmB3ZO Kذy5SƲMnT`+/exMk d7C*ql 'I[5u_7Wy/ǰ dX4I1ulZ>Z71S$xx)vmd^1nd ef.:K_j (‰cYv` Ӡ'NglG"f 9}7W(EI෭0LRAxJ>rפu|x:pB:ׯQe#^E*Q*#5tv#sS.9w3YŠk0~Px8iz͎4/⍳o4O8tÌ](N5(킛on wp+_՛dKUQ_ NFYvMgر;mʼ ^%KO>SO3}tKҥQl+B{qE""ڇٜR#Ő)72EDpoKNU/e k::""HzXnk$*~㡨T~q.֘Ay4!vb4b|}-R T}ɝm> $R\逊cɄȹ;1lВ뻞+OR%ZFg$6-]Њ7]'(JfG$P|Wm_&( 7ƵxPI֭M} 3O )5!c9[͑}:{Tɒl !H%['ec} E h܊p"E#tPP@FD?pHN%u:n^ /N%-OQQ (Pl5d.nOEq~~2ͩMEQ̀FtD$&@ǝޯyD_6]e]FSTÿL{5h?m-s[3_dY'e1QQCDWoP%h4vG0vGH m4+s0xeZMLo?d|@=32XVH#dI.[dXוmuiB?w_D$ɕ}-ms T* }CLN@ڜ}"YmO:Ǐi :TF6Bd6 ^Z=.Y~ծTz9tL=5߱Trn(ŨYݍ}?dt-W|sIN?щc#ΦdHS%J޼;/BԥLpb&O|yxxIdqZM)wa-37ߠR|RG+Y{.3*HJ918Ah].^HAEɟnf3&:P4-9sZTynCYw.3&"-eZ)'={DT A~%S &(W"aX}6/rAZILV RQ{ܙL܀;q*:1~zGU‡?cz|\5cExDjP}yh75\ ,\ǾJ.ՖYSi߁-F"̙ }3a`ZI|L@ 4<TǛv BJpuFwAk4Bh3z6jwʵ؂ȯS=m{vNZA2ڏ(Xnd:ËZkr}fI׫?675s֞.(M[R`Pk#g1kd[F$-SFSˮǽRGz̄.]t%lj;=a7)ѾͦWxP5 lw\0 T=S_3KFQJFk!BQ&2[.ylj&`j7mݴg7ơgԻSn^v,Z隆fTTEKttM[QTSl=YW0؍jf ~s43j2=Ede{:2V]G,#Hٖ-Y3'$$$Im>Zg43Bj{ٗZWvS]ʹ^ Ǿ EZZߣ[Dz%a;C[s`yʖIXAkԡfطo? l, ߋ(VVB!`צ|oLJJJ2`@m-M[,Mu<=@,lc6:/|(]tC$bw+&&ʧ(Jf[̸e(-c'C\~Oyɯj08!MuWTLNQN:ۖɪREQ3Ǿ3'lS:.sٵEsyb0Eqc2-dQT5þ]<>mp/}!B,I)^xZFFtQs.jMْUBP } xILL3ǔ+WEQRcPt)ٳ[S!B#* IDATPڽ[V{p6NǓOz?Äea%Gx=ytO> r=f1Cv{I? E]禜^4*'Xط c~w#bN/d={e(7g dDKhY˛s|o7q*v}2C?Oڝ/f|!cF{H@!)2m>{9kC ʸ1L WWWf͘Ne%6s֌鸻;B!3" 3F#Nn~+ݘ&,Y&}.6nhS:cuH>ŢXw~oa(6 +˧b|=N27Q{֡~|},{}z m{vs3ѽċaL݊кia E@'1g+ꇆReW/miD/c{ U2*6䃌oҞYFgЮ%iߙ=fAZ-ߟhXg7C]"yzuvG& m='B̓iRMR;%?ĥD 3W2V|g1%F?xː4,љ ?㏱ל4VNqcNRD~Y )8+tߌO^5}fKӮs\ymՉcpR4kLe7 HCV.N@\t qv~ߚ5rAh潛 cLHZ~. 9Tηoa%&6H)B񜑄y(|*PM#'9CBcYj=~I X3t׍rxw揬\6-Z]k ^cͦLwң+Wlbvmғ)Lgn@߰U;AnXlb5(rf߶Oʒk770v*e٦-z<=*gàfr'aUBټv. y4ď6:{b5tcp&*oױijݜoN[RL~#Žt퉁-ݷy[0arVkήZuTUM,Z2)3.ζk |\F2`?kРqhд4N : EӮ\jP!^U(T8?i_Nn`srmsGQ@QUT[̷ ?CRaD+RRnb~H@Ql5w0 ?JP:B!$ sň)$竼Y6^NKQ3wNQP  O|*7aA/RlR4lQ_gnB?7SoKe}Kq}[T;cХf>< [c..Do9ѣkrq/| .FDU!F,--#^**>~8Y'`慏߀A]xsaB%0J  9f%0*sAal9ɞݡܪi zmq30k9;98 4[#/uQp2*Z:(ʣ&Ə *Faso|\ _#3Z׏=Giխ@?nE5h9ƿ/kJ"st7=/N,9do|sP@ݕDHJH=Н3pN+q.뒖aGY9lKz3{X]:9o]̩M@]tO ̗7r0='k{t*(t ^ hݹ_4d`n@*Y} TO*W78wViD!J䝟(]1R]`te!BS%‘7^J(D%Jܸ ne {p&?@ut݅|v6I\ܼIG72&$8+$ ڃy!k:Ґݮk|0tWV'@Z.kk\jrgImvnxF\:қș 5eWO&B9xM耮(˹S+ᡘcFhF#j4|K?=Fܹz3TSgaL.cuv_. )BbB< IQi@,w$-k۾[ zi9W.E%a;[3ѸYj/f9Qso֋9 ݈7.YTeg5?&`vI#V%~ybR4)ny%sEߎm#/*IxD %N`Yٔfy(qc ;.ft)6aA|>m~Czyz,QRv}Ŵdu6Jc<&%^w!{괛:օQe3Ɨ{ռ5cGӬm P$>~~ ӫh770s1$JҒZ|K2|EFO@!8(>^JYk÷uq`:fT'/rR]N{3yTO2Ù0i2>77t1!B<9_fe56mUUvӶ?p6Z_F8tуzwቲ =)u MP0XLc{Ri:(kP{a@{萮:nپJH}J7d-ڊ\rXF`-nZ[l1i:YO+keOaͰnvI[WA5nYqU a>9Q[AMWTEFgRt P>+,þ,V/~H_FuN8!O6˕+u]g)]:CL!i4w) 3b}mmkvf vӺuşcQ##ψ EఐdƸ:n5m:{fX߲L䊂<@ zI$s#f޾.ulǑI[em P_{8xBPWdS!VH;IN! EM!B!RI)BYB!I8B!`2cDžߐS!B!S! B!BBN!Ŀg gffٟP73'xvЏ~2{?MI'?:c)S2km4h8#Ic!tJ]IS!ē' 3M2=zi.|ڵe;ZҮ,[#i4Pߙݾ9'= M¥|5PLסiOXu>剽3e(@Ҳˋ^]ov\_̘j/tov|ܥ*9la6g~\~gٞuX^kgB!^Rp>wwN[ZWoHaPh~EC IKSIMhUo|Ѫ1ơ:q[6jtՊ2+q>9QmN/[uokwp?WfDzȕ FHZW4ǐ,+UvFfB V?S6/(r_N%&8LNl1=(JB㒗 JdPPxѥ;gnQ(/ٸ2?M59 A@"Y'n 4W^!E%ah^UBR'|>"3_[ԨNjuhen;ZkLٌ!!Ti>sa痽i^΄\ 'f1i^CnؕϷ߰қe}FH|Y|_ih;cgu_N-Ʊt:6Ij>725=̼ߦvT׎OR5x1+wQT OQ븐ٖL%=դRZ4>tR# y!UT!^{/</,woR=ub—2읆TVZ?bYڨ^ jרJHn|b'^b^4]UjѤ$֝OkKl;5޸Ĵ)i-;3uWy+6gUԭBm ~K2F1ГmZ~8gkZ"t&}1ͪU'R %Y6d:& FWw&Z"N2-ulB%KƦ lJ%WNtR1IG枱ΰbt7֫Kh _vzۥ(o8q/Ll櫁(hHݺ%pঢ়vobf{,ӛ%Ɲ]6MɖY3@$g ^m;W6|'-62^?me/sm'(.aٹ|6n[Ļ(g8t[aq~aʞڲE4l{V|DÓ#*uI ^߱c~\S$Śh3Jټk7ۿ! f$#o6ؼc+? d𱬹O*9^aw96n8ϥȉLiF,ƾ%}S/P]p~ܠ -Xn3i%vdM6=ҏ{TlD m%Xrh4glzkFZf"Oc|j;&d4ǎ]09G7ᣀP˄rH9G-~˺_囉[굀g.ڲKݧQ<0%~l [Yl#4=p]jMZ;}i=N%>RVj9&g:C&rpVɖ^ il KٱImOa;سyM16O?Za[wY퍃G[|~F-ly&}Vٓ8Vz8+vnebÛ;p}r 8&ͷHk2qow]72zQ_a| ^}r4,bWF[[ʘz E=]!yL`B!RZo,~ʪQe8ooF\}zSƔiB' ^m15 N/̿Sغ|*H\Sb1OYGz1ڴ#?k'~˓hd2\ŸֲuBqGItzɭKGѡ;>\ϫ~bd-oCcn57>A= :er6o^Ʉ79t'u0_dދkuHAoYT|U Xa3k9l%/я6gl]g~R\^$d5ޣѣ#҃d^juBjl}Zwֺpw@J&\T y;wx+Cʩ0HMb4dv9oiN>Qei٦F TJhݴ&Y'eF67RQwp11bT҅.8y平{75Y6N5iɣ 5^#5bvP孬(߫B.7#nyBy'R5o=mZg#jRƵ+i/wr@Kz͋ yN6*NMӊ^ d-w mY#º{udkٛ9əxXNS ydt&rg.v]n`N9ͦhjtLl}y{4VH"5^Kx۞iq QGAj@}+fBj(|QZv8@phԬ_C:گoWߐټtbpQ.z(̟UFw2=CJ1fٲ+oeo=-cX1RO敷ҵR>iѻH l--j *协=CD赅jP~_GsW wdL@͙oZ֨V>*˲L7h8I5E_"%gմK@}Wc;:E gܱn܋A}ߖTlU !$|jT|IS1`4$:X~vqcuТ!6ԓŐ)72ۉdz5܋%Po63_^W]xrx()K C6Zŏۨ?}-CFdD@˭HImͺv@g Q͘"rF{ !(و^7ƵxPI֭J@Vb)?f/ǛyvNy WE/'n~۝(ZVHmP&+?y2gaUrBԚ>4(ٙ1;}f%2g+nFjX4Edӧltpn[Vbs+jP-# (vmO ϣ:O] R,O"޷&h oW@En\WåtK}vO+!-I pТiu5 hnI"dLͻx?>3T ! zmWQZAXQ)6!)R *pAiCΜ3w?=gfvn~?93s&wfw5e,nv+堸nuz&y|%lx]՛5*I:T=u`]{.:LQIG7iŊUyq.\G(Ʀe FY<%$_Ba #FkĐcy^~HFN׭׽[c̲5r=($M]QJP|C7^iݲå/M_:" 8sq>s~0A.O ]P7Q<'=|.. I*o6jSSw'֭Њn>\-CVjҎx*jJrtccwA WNҠ}~KgM{>u }3"5hQOoMw~s߽[Z-[V8Kf )?rZ,ϽxkFj_F<1U:sU:gҹ3 VXTZ\e'4^%K 7(uϬ-jɼ'⊂|FLUk}ةo%԰it}hGt=uqCt5k6E^לvaw8R'N!^uEWs 4C-8ڗ֯Z#q-E*J ԏ~v90m- Ә'hK7q^MK?׽?b-෺y*Ԯ7nzfv7~r_ڮJxl?L'8HQo~U#Eö:]4uS{#,GQ~]FoΚ:oS&>#5|?o3u ?61]oVyWG!Ouu?_5iPH5T'yJծL?}p>z5VhؿWXUҊW;'ϯyHoF; s Boi̡'i;ieARq=7G(<1]sʚzn܏--]k&)^3_wTِgT8rG:~ڔ յE1jFPʵ~:zW֓ڥ*=uo  Em5E=d٬׋__XwSzhԾ\Ot/pˁj_'J\'^ӽ&oUhZGzu|9>Xt/kJ^o@\vSS_m4Mؠt?ⵯ꾟ަ78JȩMvnOzlQ狊NZgnX߼jr5p{4?٧~)GW{xwigC_}Ho?:>m IV?+5uaqEsztJ3tY_-wj~W_i]z֑2es7JvЙX|>|!<+tk*W/?t}+Sҥ!i>'O{#7X}Qt:i:̫ơ3vPyGxq'-.Ka#eg ~|]gب\4@{}O>Q5Ng5}xNJ/tG1^rw?iti^Yu=:@{OG-ӁQ$5Wk~CFuWS^⺎/su֝b:V=t)*%>+R)vС:k_=pkܣװiO}s߾9D3ϼBovuqw޼F9UcξBzwPstA5iQ:?uR^g}j}iݸOHQ~GwՉ<]ckO1]M״ޭ:Y_$5w7scjWk K?殷sq$)ms޼[NR7o(7Hj8W~sg5^=Kuw7iC?r޸T}e1/knyDz(j}M'hmNg|\'RdaC ha5₟~}wG_Wې|ϝkx+OH ϼAמsX:O]B:}˜rT|W;oSXN{~};4v~U͛4g@McGhSݤjFt>y5yzu47wk5pz>Sv.?@~]!n;OKlPf~{inACI'j>;)z%՚gjt˙?='RpIM(W:qr=*RQ{HqTZc~Q{~RqQ>z |Soi)SEﻌKo\\,=s-P;=E6܏U!TqJ'R;]>?IEyw]k5sTIHJ<'mX= kEEUPBsXI5ZH*G\i*TK.kЛmJyO~N =g"p2Ad  'dhk' N@&-lnL8 p2Ad  ' N@&L8 p2Ad  ' ΈsY l2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' N@&L8 p2Ad  ' NN 7' N@&L8:GQ>®^@4"]n؈<] ͺis kkfjll]ޮ<޾]x>*=uK+ߑ yB78:z?P$' N@&L8 p2Ad  ' N@&L8 p*Aq\d D- Ss2DZ-28k0}m uE- _ \ֆY{8 p2Ad  ' N@&6dej_/ٌM1pn/M&ela#~E8b ZZB"kСjnnVEIXsEk\y1ff2N\{IbQ%KfHبFjpd7koAՊ+v:4( MFX[WKZZZLY-Ђ5E6ذ^um~if=@Gmw2oj=T{J_%e~5^}"4qیрUL4h[M:lҊ?k{hth5jǙG{4{R>R}?4bC_\ft+;#RK_>5? nm&2Į@2IwKU?ơp]I'݋TV-ԫ/k܄h"*&6xz}:Aef5Hj_/=t >d{MW_٪Crkӣ˷})XӜʶHӄQk-5m;KtqI֚ʫOZ7\;mI޵O핻uw/-aIbNڣ)GuWO,Tퟳ@) IDATNSC6=~ɩ{˳5a/Z8^q>|ʮ$)^kj<^{4M }s2_:}4Z;3g-~FF;?<2I~v\-mf~T_qڮjIP_kΘv4LJw{n=׺qk7ZNc֩>ʩU]xnG^^\D?kô԰Y_.L.m-K߫5|qX|E|+zlon7Q7<|تnW#}t._kݼt>{u +?W6Ϳ ?eO=h:SW[|H+]sגV0K7ts 3ߜun/~Imu՟VUn1߼W_Ms.✱ik?=_.}zǟO/o7/\JccZ(Hu)RoQ_H{i=_PKգͻj~j둃*,ԿW 6ۏҀH c%oVQ~i6U@Y҅Z1d&"5 m`8F;̻WQikLNZȽ:吭Ic]/;K6zt4B=v1k^-pȎ]Չ;ȸS[)kSu8>gO]րiuM;?wsNuO>Cjf;O.'z#Jm&i?sF&5W5jԖ[k-Giq ZXy@]XPxoB#Oo]x5|!V?[ޱU$^ PR[M;R~v܀m9qoM2I;4U} B.kmt SXR%_Dk`q*?.֔/~"5_+K[K*]GiR{Yު[xMcm_uh#8s`?v)K?q0LM0[!-ZWTڅUuyXj_~wuߠٰGoAϼ٪X ^t9рu\^|aSV=q:eq;vldzh=t^ڞȩeVzbU[s=φsN/FWV%iҰ=zzcq\zU_z{W=Pȩi9LQ躿 ꯏr4(}k˫?wr'\sNٶQЎ#H ~Q]FiИ :_S?EV4p=t.ֶcG.߻Tsu* =O=Yl{GߤκDr]CQl?}y*oRpspxcu}H>|}tؑ6nf6Fمrc՗/Y+͝5㏂I{}2}w>p^]]TmtY_7w/]]e;w2KhnkNRݪv]BA/$.Fxg'֎7[o^y>k6O=sg[m5x衇4mڴ_aT%?o[[[U+y[10..Pun :ǿ%V f=Q\6+:\ZQa`bkՂ+J=(&s.詼)iu;TY~;bu}ԯ`_J5bL `3Ӧ<'U{,)?P-[]ƕ &~rsZ6CMՐ*~ C.ozP'k}g2$mN ~"hgM ~֕,[z#.2Yi=_?bžhd۱]ںAlf};pVDCklΝI XoWkJ?'at7Z֎}nRfUjy5 an C攴m->v.kY}ɶ'֍+ +6nW5T !trR-etPTwEƼm5XV纡Q*іrGfm篳B~/=9'ھ@n͍CaCj*:kzkj :Զع9_\umhXޮ//͕aC5o<*hmm4lEQ/Hs }o>{ (:z\?vm\t,IZb P- 9h=*zU^;:A;4j-[ ;5jjj?~k۪i7?:nlNhW3Do4¿k_k﹭I(Ң辖fM"ղZB4ݸy :TÇ.EQjTyÎ:JV'hb%[W(̕9@HU\?os{2MֱjtgpO*iK:{0rm,9TYlqkqYOۓz1؆UȊAl6q=W=V/d8+=ioO^֎ޒgRuEQZL)sTw[ӪC'ƟۓLuoe?o3f9:;%եεP?YРW"b_d{0#}#I=+Todgd$nV[N^gP6qo,cjΓnz8 KZIDPX@V 'Eo^)=>vj8'^N/?}+R8Ob\O^}3V&J'LǾVTXX2}we$gJLd8ݓb@;v_/JʗǮ\yo%IQi}W_Xq)T)W(Rǻ~eu>[O'fM ҺP߯EnzWy=؅hx|Mqy$)_7n?7I؟]((%eZ:7ߙjEu90I(\-ݻ(֭k-q컞˸=q-v۰F^]nدB5_~pbu@nCX*\{V45{rl .hqN%~t=ys7kMw]ﶡKÚ r汼i㑷MuN'헹,gpI;=in=J/ssnkz{y+uO\T/tfʹc[ mԃRm?o~͍m7C'NW{ؚsAҽ~b,U"\y+o잣[gC6zhk!~ԛj>oǓ~0Vw3X@zbC)o;nYs`zm]M^ݲ\?Xr*GȌq ";Rݗ;0C2uۺj@_PMzvJ7?czѫZ(}djWa:9v?{jzz5'I{Qy֯Pꂦ RqrgҎ c-زXWB&tokt;5 Ic? KZIT]MyWogj}/gNJA?yZ{_,o{]ܶXd}[r=>[;}ſwBvlI;{-on+]P߾3rͭw}}:۱j>'@Bꕤ W67')؅BmmυW[wǶA_SuOSںsqs}vs?[I?ta9u~хӸsklc?vh}'OUg%a(ThR/*:=w/ v\ֹl]>Nypn ZVKvn֎횤73jeh_ycweB5)NdnN?i:ž?wOyps5ǮOpm~R I'~։zZQ *om/^)w;7lZkN\e-]J='IZϪe-],5T:zP͟'mC5uc[}J!;9fwT:uz[;vvע'}'k_hvz m}iϱzZcVF.k/?К/KUE=TRtC~gNljvjvlPϮ$լfMղBͮY/ΎCjtg`cӝdI lvz[cvkN5ﶼ-ZR}Bjk=U͋JiP/T &%ԺO{N[z'iZZi=_tUmJ[ֳBkC5z%Ww8$[zvZ:Iԫ^۝}z/Խ ֝}|i'Rz@wJ;^R/.ѝO]|iHI=?*z1_]Pԓѓ}}S/UƩe-%xUҚJj8=ٷ.[ɾVǪvTڞ[!vmѓcdߺ''ORzZSj=79tj>z/$dj>z&6SXT﯒xyoO^BXuzꏏ 0VTdjc :Y=ެ `U(uw:f}Uo=޺_o޺Llj!O_/UM9(鏁?>|?d !qdg !8GlցTqMK =B$m%3?,IENDB`kraft-1.2.2/manual/images/nl/documenttype.png000066400000000000000000003747061467704360200212360ustar00rootroot00000000000000PNG  IHDR.zA pHYs+ IDATx^wx&!"]" V7^_z֋ {lvQA:ZzBݓْg}Q\jǛh`&ucHDDDDDDQL1""""""xba#&<DDDDDD԰ׅ-i/bƾ7_E!k}-[go허UL[}!ᮯP_!"""""C}k?qXxxoH'Exo?[E n5=V5Vۉa&zMN\59V1VۉT}/zꪡ%zbXm'.r2[V#Q}e]""""""uIn꺏 5y˺Dh;vH/V {ۉv|ݺ -)˺H8 uQ_!"""""j+f?t\$겭S %ɭ˺p D6Ff,}$ 7&\겝 !ykzPԽ-TmQbbo'׵m֑Zߩ)XoD=@Hfڬ{3I;knDN4c(Iң+8x$jnm֩$Gh NEŜO8""""""HPBtcu1 x8Ѯ:Irv<༎.iLG7NB~KCt1ݸHcshj,\[Gm;HG:"i8Am[G c{|W2~:>ڶL틶;zDDDDDD&b*uLmm;xZ}%'q:>ڶLSDžԘDDDDDDw8%j\m BԾhD:>qd9G39>T[9sZhD;:DDDDDD$Ѯ-8*UƅkhF%In4ۏtnSA7p,s㴬Ru$uw Neex]L'q@tcd6mG:96T@m "n=]x'"""""rJx -MLSX֭ԌujHE% rۮ8]1A]nn#8ey. NX1DDDDDDYR]1Nu J7V]ֵz\TFH59q@袃:ސbNsYmq] pJکO}@:^te]I$"x$ntu zڧusA8uY׎Dm!"""""&Vq*}QA\,m\]"z\DFH5u PO]/E2SeG# """""HQn9Ti.J,n.ԶHE2&bH\#fmƄ+8y[WSǨ},8cv4.QcVY])W~u.$b29sӵub5&bNp#^c"Yۺnp!x]L :VBB%N}Nq@"溘n[VbYsA]/ܲX[ 4j. S层:FtVuڊvpqyp.Sz6 C'b?Xѧ[q\PۍBbm/~})Զn,ρ !ԶeSIڭCDDDDD7&vr\,G3wZ?3,VN˺OڪG,։kt .y$˂Z@KI>s~Hbj;hkMj ϒ>5 _-RZ.?T_TbNjI䶺 T&m⡶+mAݎSIP}DDDDDDP s>@br[\'e]LD1e-5冷a* PNɺ.\]VjWϤP'y >ur˜µ(45vjqf;t1yԳ.)9sAwZV流6vZOM"<Pl jC.Vx2D\jC^V:BKDDDDD7EIBQۂxJI]ȹ31b;NO+*x(Ei;Nq)-1@_P rBCMph5"rʩ_mODDDDD؄Km5.b ]iR/ H}XburL]>5.8;#3.j#T>5X 81Vqu"~!:*8)q j/ρ!qrBgL%E>*4Ng+˂x b`Tm趣B%r\L8ZP#̤ cnl;ն O/*F˵O#""a_ۃO;d]T;o}XVӋ(x\pqymW_Z -vt1A-0N1DWpI)))s/(,Hߺ16Z%""""""o j߱MK^}{ vzAL#ڱ(^*].XU墁 jA7nYD< ꖱ痖ڼ!DƉ@jA~N&)[xD%?q@`v4tkIz tm#Oj”bHl6lƬC  "FDDDDDD70[6ퟜ1[5br\]µU< 7-/X$W!>M)EHLʋ_4iYϧQٶ-c!¢zB oKѾxx] ~0ޤD-Z8 ~؎'#=&6I O-EJk?*(XoWFbQ֏|W\ "r\'ΈНy!ELef\ %!źpZ$m9.:F79T.`heH~P;?nEZ2N]ɉ0\\0lw?Ϟ=.DQBBM`LsASەSq#*5I= &Ane8!ʂ\cj~Yq!Z;=0&HjwA7M*!%\O{JPG/^^e_m\0l\2j.5t ""\t6yLkFEfxIHLLT<4ޛHxamZۯ믺еKgBѵKg5|ct'VD*1MUme5&I7 N"=M-EFxR[ ] ehO6JJw-Wm@!z nDr0 \|y,^5`s';ʟiix8km83Ƶ7ށecQG 9YCLծ|qf0`_ar[?L;;oX.y^^3SgT <ǎ}{Zݸ_~}.ܷ7{[TEzB䲺W-euLӛSj[;N1w8t >W>()IQaܽ 3e;mh~:d0ݼH;Bj; moʉ\ca? IIx/K0ju_6swvڍrk M ߏE?v`y\1M32 S`Y"׮][Z BY<G>@FDDQg+Sv_Ykp׭7V+^ү<1Z%H Ղ_pj^,~;Ŝ}j[pT}ݛRQ!*Myp(BBSM24T t'I@foFe2ѕ?/>3SNGps-ݏ>;|R?~ns-Xafaebp핗Aqmcq`x4o >r.>5_< Zk/<G=q@fx,cعkw~[S&?7\;vW٭+⽏gb >w623Q^^Y_+p߿nCV-sOcwn~?p\}Hp1p]괷žvpţp1*{e x^ 9zp?ٳ0Oצժ Fn]qOpk58o/ :j ^| ,'to^HLL?۲1)ر;w~3:w쀫/K/<}</ү ޘg"" 'coÄgn&vA3MioUK].u7(ٳ زtp ~WؖK/m#1!:ͫ;2 4qYǟuqpx`%(.ك[n<o؈t4IJDxu \{esQ#F=q㢑`WOgԈѧgj]|0 's4^~m*ޘ22W_ĭxqiq1GQ8@x]yxx鵩|_+Sp7aygaҋ'Owhۺ520W*KDDY& OL|y ?Z!;ng欅}<5EF˶m,]OL| gk]5wE 1!8w}"1~uv|~9=`/, \o/iGβbY "j<>T kΐbXOml6n ߏu6"/-h,˂mەgYw k ߏWtڶn ˲sn ?4o ض}Gp?U9/PPP={J8z5 u Ù!?{⫯Š#m0 sr(zsnYlE`g !!]& ǿ/] ˲hݲ ',:~9PZJLuzwZ)H ꛊ'u_Ve %溢 ͽ3Say%+㇙+rI>,@y~Lm{NRCnRwXjA""jnۆ]wI/{ꬵXn4MgO@pk0`MsFp!1Y:EŘ{xqq׭7އu_&+WEu6D~~ye?B>RQ۝Ҳ2<1yL~qu0|NUqGyyߏ[QSUmL]fي?1C{q)VTτdي?g]2*cQN ;,)DLlDս/`\]K5oD= oBm:Mr(Z1q7VuLDrZRӚIBK$mvwBn(_+z|uoB<7 &4gup-c/aUXr=3]yi "# V ~)Hdfd6o 8!hRQQRԹFr୨M[@aa5Ď'l͛]t>Z \& ^.|jyBz2.5ݻvQ+57[QD?﹨lwQDDTwVy<&E {E a՚,~Hk-B=w܌>={DBcŊҋXV''yVq+iuqjL|CFśMϔCfp& ؙ_oD^}X87^s%ye,]tJ\Xe$5{mca>6mޢwd?]ވ~P{.éÆ.Ɛ*_G~z%,\^|u:j!ꬎZ!E!rXUO Ap./)ˢ6g[D:.&7JqNAsZϔP+Ir[T\ȕ)ws6b?x$ ~omgf=.#w"P'[Z%sOmCCPsS\q&-v>NrCɓ0+RQuB1HϪog :]cm1.b*1)9SPQCKDDDDDD9S+\?9L9;>kMLˡS1b ysr\0[ gPQ,*^ȹZ@-ȢO^e⮾oΩrzj`˓L  1IMPV`` """"""9jޔD^Fp.9s`"ޅH 8uY ˓ZqRǔ۝4t6ֽ""""""+Թq@UQhewZv"n\%qA>p:CG&qv(jȱ8 E """"""pyĩ_t}@…N7.LM8ޫn""""""J9Dp[ IDATpI.7n.:V=IyY-""""""DaeA7NsSWB}Nr[1Լ}""""""FwE.NSsaXu9v\WBG}Psy~9Td2P=dL݆LmכY;кH^SDDDDDDD ]{6rL&Sb JC+\LXX75dj\ j{r8ӽy5#lu.uPì->}SYqagWQ]i`KhuNu"Զ ,O"'na] 2#åv퓲 |zX """"g&+j[bYWxPj)dLb]%FbYÄ3+?zfqydC!Fut>eשO=ClG%3b$Ҵ'Ըp˓R?=Ӭ!@L7E]nSLO鸘[ ';jRcr\VČگJh[ODDDDWrP.&!x.n\$1-8|iDDDDDDD .U^ݲLm b"A3T<(V-7j,\DzƩ\ԶԸJDDDDDD}ն*յ՘WE:.j,\D#7}jrNԱD36n]8sچ A}j?QCjninOWFL^4F^VT ;v?̚5 YYYz:3 mڴ'뮻Gq wo޼o&f̘K.'NDzz:h_jNj\*Z[u`TS.}"Ca„ |jWض ߏӧcժUТE u5vi>vt$79t1PEO'uR @ji[j\|8Ehԩ^ٶ%K/ٳaE Z (U.p#Y;t?d 9 g< """". 8kފ@.V~݇c;v`ر{h!ضsbƌKyϋƶw*\7ኻn[͏qK1o/Χ⦋ |k0sX@W.0""""FSmpz-Z{pQ[SU`ʔ)Wø 0tP$'']uvZ * tm5w\kADDDD:B": ξ>H!T1k֬7 0uԸlơ#FT_B޽ũq qY7 &Y#|>K`|=yd7׏ ?|,[S """"'P}R2j{0#]i;FVVVOa`Сjm#++ z)Hm[' pvCp%bscܧkQlV&|8iڭ8,pk&32}2lWvr&2Z{e I,Yov)Z!#1WQ9ڀSgX܅HlBXHJOGae(HD76Jw Ԇ-5 =-lO"ڞ ;Xu2d4o1F?[*w!;;-xY%%@JJB`O:ZǪ&kOv 2[INGrV [2 9)8 -E(3 ##ŬrArzzDDD :UuG*fBA"+|$j)))R4p B Qb0 T}ˆ#i £wgm o/COkuGޟ_wga/Õ]Ég6![EXvJ|6`HHivcIgciu[ CLѲ7|ka̘gf&xtL^3W|3wV;wo0Qg9a?YNCރp֥W'3o2m' i\ 댔j9t)M-,ed'>o{ᛟŽ?,pB#+.{ !^L*Vt( ?+Oc{wވY"i'ŰL|n0>+zEtxb<]),#gL&+o|oWg|@O 6W^:=ӝ">3_%~0Jn^G /ư5*V!~!t~Ye{1 =h0<t/""""I?{81 BC(\U@(BQnS=,~+-.oF)\XX}xp]a a_}߆!j(]? KmTm҂X_do}k˲`-ض_gWJV^ܬ-N^0܄={ZS 4|lY%^^32O]M_]yK6u7^^-qdOZٶ Zkl-W;⛩{|KX8u qEpRӿ ^]?˭jmۂ_j9P|Ok^r! _~?,ۀ߶xru_,6O<(^ocSIտ#vy}u vycP=+ŷ>&bu;1(+ gJ|O,<&9xQD"o#נ5E]hG:b K.EvvvKNj_~i0 n]v#WqBWJ/l(]VWA.*qߑW!.P؁|M@KtO}sWO% xz M Wrm[oY@Ѣۆߗ_LcvUxL=~+ |UÄiذ@"mKncxU;|U7? 9fmۆz|% Os!Y+j]](32ТYr)Fj:[uEh|.wj|.osSA+rQl>GÃ'AGub?}ذm?ʷ|'i֯ކi?zc_U14a6,[ʶbEp4 ge0a: g L<"""" )|6qN?]C*\J4P㨖rrr0~xL6 jwL4 'Oڵ+nv\ypjMJـU, jc9&E 3N\x|_I@ކk/`Ư;,OMic&X2u2*0\qY8H*ˢ;$SۆmxثpUп}*3&La&oA[!x-8&~^ Jbޢ8vf>7+ E #=p7Ɯ풽عs<79| ڃUo9g=Zּ öm9go`Sxki.6-V;-Ν>Ƿ'-eWI#Ѻ0`.}C|/`DWwrXMm϶Q\|L 4@9-X%FB_ .dmL3nS|YoN| _] 7~?=Fwx?!`b o-utgz+&N>}N ,(_=7% -'9z?z<һx.5ADDDX漱N5…v(ŋ3֭[aYǁm` >yyyjT =rZ vcɯQLVC16'&0h?mk~`lxohianjf=`ͱ'_Y ]{H:l(oxmA0{g{Z(/@ [ }3<=qMs;egQЪ7dT>7K) O?vJg$R0n}ۈ_!6 Ńt?ú'~Y^7Eٲoxw#;5`؉mQ#1f6,| ]%?o<(ƎU1{{RzCambl{eXț_yt:+~LKL?" ijӥ": Cirrr0zh]ƶmX7tOl5:ҳPZZ&ݣ!I[q8@b螠{LXظ1Pe lޓH7ԡ~݉Hox-l&r?Xle!pD*qʳ/lRpxQZ3<`dwl؏Ѽ+4 +HJڿ_f,:b)%(ۨX;_zy`K?EԁvlSm1<:֌MУOgʅ϶acv ܌=3pk~l ~Q)et1A3̂//_yoUp̓E;yE,lw-Dq2~xl۶FxǶmk"'9fshfv1 @Mf"zU̦tMѢi W iM 6$5o:8#U w@QQ$ 35 iY s&ڞt*h<÷ 6ҥfq.w01h8K7_ɩH6tDFfFg`d*@nr}8ɇ\lԶ-+JmWx15< ũCDDDB˫Cpݨ ӦMqyȱ{AYYY̧|̚5 ͛7_۶1e.+_XgFb0QޫvX&~PHN2 wd W22fJOM#Dh~N;:-x9[r {[Mq찁HumPpP6`&8f)UR, ~V[2eެ/{*gqp ) ^xwh C ~ǶGRGm=eș}Rh>XhD2XKnرi5.لƈfQq8]']le`K]W⢓]yioH@sF&O= _  xpLF]xBظ - 3Ч%??&ڸꌃ&ы 1{Kp{Yućc!K^eaԨ8KK^fc㚥oθE#mdD),u1~v0!kyڟ9 }[]ko#pJ$\2pi4x܂|W!+Prd{v=J\8`a#w|Li:V VF*1m h; _ː]zyѣu\،e?b?cmExmjdrxp 9PMSL_Ms, whWy : DXr܍ZІmUOrWqGp^H9 <6+`o/oOGtڰ'$ w_ I¡ߊl‚ 1uwZض ^jC<X| q@1rp wI;nĢ>ضk50 vwԜiR|$Z|2 }6l6t+la{NFN8f~#*,ÓD IDAT &\}`)q%TAt0n--?޶z6*@SݧvDOO۶*o"K0r@B3<:.9xR[7?6 RA'6Rܶs-1VK=5v" xF1VͳV68+/COWmf"3Dz?"tM#.r7&?4}߱(^em0JH~  C1chE C0{pZKs~W:qAD{apyִ%uއN>ۧ ?mS6DQ&M[s8vy8h=U@RCqO1tf((ߝ̖c0s0() NUt>#3{>ތ5C.`Љcę}ŔjORs?b/ % y< =}[Vs!&\0Ѭ 7G,[EV"28 C`8 .>dmˇ7!@j/@ሉ?"?l!]axΖϰؚS39: 쏖'Ipx1,w!9% 2A^C08cK&NAsſaؙWFRZ3 >=2="""0j@7)&V'7Y6)R[L&v'yYܣco "t299\wKJJWFY| .B~i$PVV;u}ݰrlm_ѫ | fE mq~aahPSಒ3>F~)Ja϶g )ǠZ_%_\8=Tއ@k&z ]0]>XW}~1g[? Z$0yDʛhVك9w-eck˨~,qE{܉txq _pP跤vb1Km;wWmIjifrDT yGOW%x:to10`E-F#w_}1|0 ?e0 fGDA;Q8 H6myj,ض-jՍ]ѣ&EzȡpǡsI'DDDD/b"r '`CСC,&"+͎ Mz>Vѥ]aʕ s,\PDZ[<5mWCDTk 3WEXW""""j8TK!B!#Lԩӿ>͍iӦ1qDyB!B<$p!xbv/Hc(_<?~^zIB!B!rsN@ ԩCڵs<( !B!xHB[Sw闩i3BwHBK(䶓}o)}B!.狢d\//\w^9;Q眾qD6-;cͅf]w}Xis#*-(x$[3{uϴ`;bSPr(K{6u⤤qut,ŕ |jo.3j+T~i5jO9<{~;~S(Q#9|lbHSY$=SUS~cלO㟤+D=Ӽk;"}! `$T!f,.[ %UQ0ggyn鞄4o԰O⏬1~N! ֖oQR5R >^x 7%[B",> iSFV m~!B;=(OJHL?1WWW.^Bt O(~(ʃ>tq `pB$p!xi˯j6bU)|?F7QAI?JqaWn2dK4ͷJ_2Z `DSU,ჿOYRoPQN]\h2*!~7_kS(XzD"^X!sSs5qXۜޟLq8N.d9f:p+A&9f/Nпe9y!tr-pA_4o,! .oCkf\ag$7uOwZP15 "N@qڹL?-%-b;tT7%HwQ[4~ԙ{&{w&#k u|#ŋjO1tur-2-nm/͚#H2[#ڲ8 u{0ݖv `e:gMwD7>EaȐ8yIc@-l/I{VIK|<[N}J2"[B>{F8ȘV3%*ێASN`_NoQOS)ݼ߭G*^Q{tŒ;9g;=CGӾ* )]? wr6Ilz EN(Lf⧋OrB<]p.HH.[ u)͍Y[^KWz-^Z?k})~ޟw!8i"ad巷i=6oY2u9tK~f@9S 2S jQ',L\k[ϣ{>x{m&j&[g.`_F\m+8Xz ">qsv%@W"mr5ktZ*oYbͨj;ﯘ=xo~]K|g>G} ,؏=&M_tmtͰԣIܾՆͬgf%`[0k9̺έf9:~æz.w,}m,:xtI!V&nOxTFvo2i k_#7`T!{?L۱I'&[6p&>{1:g;mg3^*^ޖi Un'%*㉄ci֌3Aoo"Pj.?vSQ =?n2W7p,nt$%r @ :֘Gleb-'BrS<~T-1|W\)P (g]`/wY_IbR@!D.%jb4zQ~- E_=0L'ٴ:ϼ؅~KҦubw2tB̠>\Dn5 t6"=+E-TSZp(=[tp=nšmxE9|]\ )A!=vZvTqƐ8u)R bt!$,׸h ;noVٷW-Jl5.4\EWTUT >*?'Se,;6(ቓыB2->|EèU4R3P է]B3:_#n<ۺ%s5?^;GY>mf5~i<>Ȟ47z!hyFeߡ([иYr'pS#_IoEJW'*e$ LlJbl:! q3L?e7j D5c[LR#"Ͷgۺm Q*#n9Ǎ$ii;d'>~8e~o1*i]ʞ?{YU G 7Tō5AQή`Eѧ& c(e#gcHL5RFu!O}彇N{ǝz1vHKJ*c'^Dtm)=o_$..E{.銢'1L8o^2(NcL8Am6oBѴc-\+BG=oOd+V)2 D%y=)W]u/jM;}тoS/p"_^ڛr?bƆ\/ b :)~?b'<(^5jMwżΟ<>KG^ r4;g} ^iWOXXn@$X\ ~F[ (zd.j5O{ J+FBP3rAQX G:H|1\ ѭw9q%qۭ( {a0$Ω3/֭rvKuI( WrFوz5^Cz*U"T Y)ӣ~$gT۱ obN#\?c:WLzវ} >B'wun#4bcнc+(y<07,c`u A~۬,˄);rU/o{8 e[AU@-A0%&rVE ;R}ﲽ ɐPK޲`WL|t~?\ړQ=Jfg-, u ĩ< xkG,5 %;ɠ|v`lߓ N _)"^Ȋ [ٳn,5̨~L|;ٽE71:qR܍޶ay8=+H}j;w`@1tP<ښe,)_s;9dWsn.stc\72ԨbrSw[Wl2Ud>ٶ~cڸT+b2t;O2.>B'\MٌMt˙O5﯎5VZ_bM(UN_.ST>ѵ9 /PubQ4Вϰvl5yS,_72@O- j&5Aŋ2?50'_TP)ɣWuCLB.{-bwpzzqĚ2)]N](PЇKǎkց;ߴCw+~o7j6G|{: `@5'qeKFnjxxR+r!]ي IDAT37MMU7:̽xٚhK5*:sM4P 5kK\>@=aޟ1hrhx+e3Q\+r,d([ml:J)ψB Ֆecwl%mg:%>NX\Z٠P1:\uNJ:P=GXp-L~ujGv Tgݜ[PCYZwGaw#ReuD]!XUQPP  *("CJpg-bPjBms:`Zfܪ㕼`wtda niTUE)0 lTE%z% CVbPQ(GPRˉUFi[(΀kms@qP[_8UE,TFԣ}omW86+_vchk3+ Bh+g_n} O >yƙxV*Tn"_>vk0xLւ˷L< SW-qWuz ?d^xg~)^ӗM۸ҲS BϧY 4f4SfJƝ:2~h J9||<&B4<Ҷ_7NL@M>xPvCBYmSr2kMaތy!m0{\0e -Gൎ+įB XQ3g3ydgfE9R[eZ \-ˊ "s]C@M^sK5ykbW|OL:X.)@[UKEnd{v佽 N'ݺ8SwduP-76 he: 6Rۖ` ߪoXwf֦e,m=#lF[T/^5Nsz˱Nge0PBqdAi6RޞJ5SxdI!d9Yr#zg"x"]-@w[%ή0ӾX^w ܌iHJ赫>0qotӋ3|_ӧB^rV;dXϔ߉K#k~dR"l#@\g_*+ 1Y/l7LM 1 V̬m1D둫RYZ|m9a}+1 ` p9. gڴ|Oh^8!Ȣf ;tLK!퀢jEAug[G\ͪ7<.`IȾ e{s jV6Ǻ9tv?>F˥N!rIa;vD$_U[~ǷLiTP|;c,sﴴxnPb!܍L;:t;{y+Y&qb DXʺ2,#*4X) w.e";D 3F6m5CŇi1'f}$Z!3Xc^(w_$zVsV30h@BY1E=3|F8r3g,wLwzƌ7i8 =UB!^dCD7ВOXsORt\|RaS7UA)ߎ7f E/F|2#;<l*5d3"uPry9BZF!V[&]|}G& d8,ۿkvf v˺5M~1~Ӳϓrks'GyvɊsKpy;W~^}WrM@%)|E%B!BNBGJ.E[!17SBG.BqoB8B!B!+B!B!CKB!B!xhIB!B!- \!B!% !x9!#x6,G斦;c~gjF !B1Α/Px~H/OSNmfw657cǰq־z|;:4CժըޒC?gϕf,A !BHBQ}kw ?;/NfS 9K)U^N.租>o2Ҽ:e9;eWho;Cz$//EB! \!q:7wav m_I l܇V>Hz2VgԨ aMl::ǖ~fvz0y|wnJ<תsmL{=E"žz톴$MlڋV9/Z˙۹L1'"֡Vxs^c e,>}q5"t}a M*"Ui3dvmB!O \!i߳Z8mm\g05ßb%pSRiAjAzT(F߽xQ1ܝ |dk0ąm:S?5zD>cՀ((`=6Pjp2hAlft+F'oGԦp%tLv鏊tA DAT oNݨ{)ڷ΍]9m0ty6q(A;v(6Aua&16>8gKP t^ _<]H<3NxjE׆ױ7m}mYU~!*Q˓|9!B!Qr#k85݂ hiI$~ˡWGlŃ\k7P5U(7bH;W,&=*N.7|f֧D|F7{Hօ_Y 1IUTu?_fY1Q5ˈ->BbȞ-9`ۋpkNn "=+Nm !P'6A\v'9> %[FBBxe00ŋ:Y6: 7 (bib?5Ѳ~܍N+Mά3EaB!O4 \!]X̓W>KBFkڃx9o{&p#6 xJG7?.UڲlnF ( z qq)z'fN/}aL:j~F y) ؉ez>x&&UqF?|h=r5Cjf¡:P}ɟr뷳0_+ `Q䇤4Fb]g>!(CTD[_c٧snYPwB;MYbcbpWݹ NNNStiTU&<$p!xD\Z! :N|T݅r-yoBiKLx- _oFkq+^ߢxޣ;FEh .f܋}i0r6]:,-?s"[p!ONym&冃I4{P8{*oNϦ2[#L6c*=F2XNACI)^EoFAAןky^5 UmGwn1؂XgƏʨrMx]nW[Ѵ۹u![B!O1T\œىҥJsa#-r+WZh_ˎ/ۘ5 `_[6-^*dlqG3G׫[ASiD\NlܸHΞ=8EQP%J0aZh! wϞp f3j =YC1P5(etkh״[2t-뱝uLGv IY z:uLy@G,OEU@Q * :YrSϬ-I$3ۢb5-kEUّM:Tɥ 98!dG[Y1Už?PT@C܆<53Y+bbbpL`7)_c2'Oˋs|Rr<{fw-#?m׮݄e'aw^ׯ瘜']{-.о#e25eu򨼬eݲnM u|_v̳ߴldą[t]gܸq7,ll{YڷoСC15^<;)v`An믊*eX芊mUC2#hQT5):rmCyaCnagK_+)B!rL2cǒ-麎l棏>bҤIB!B!QѣG>|8&1?i#F_~y(*1cDQ B!A"/=z4G)Weʔצihƙ3g_L&Fի'LB!B$p!86mڔc4Cdd$cǎ3|p>l7n$66lB!B!-2UD%K;ӧ:)B>}4M!B!c?$$G:&yU!tmF繧Ȑ>N])J=.ݛV"hЬ7K/ڞ7N0Cs>!1Gq*hg !oqφZq S34~ߊRܣ>*f1m;ES(=]  !B7D4,-;j;3vk5\;evA 48;Xoӈٹ9/s"ptǤx4IB!BB"zn[/WubK8WuE6}775~DC4ٻ/r=#b4iKqfL[$m鰯nB/5mHxD+^OΦC1M]׸ FFhz|CjB->v=_Q4<%'n;B'`D϶h?Őn4k܈F/H2-%kjdw?WmݛO8J; ѸC v'B:I'V2<|3Zv?Ƣqudޝ+ߡ}~/мicʹ=-&20Ygf EOͦ >;Dꖏ?7C۶ty;r\ݹs~s ǬLO_:fǀ.B!J U/mYt=фJ.*P2l`2x( N9$tXKԆ|X$7Da͡Iܶ(C1kg":gW0gE1]ZϷM|~s[ʦՌ~mYV~Mw:#V>F?Y1|^u~ngX!%ơy8Rq_nXF>Z"E_ɲ|~=gwZz6ƾ z=_'ÏX D dz0 _ңo|EձœHXW[bԨQ1BOZd D4 *DjpuuE4ƌ紑܂`٩;wή6՚9P9w_rxB<\|}tyƨ(+5G`޲'cDѯYߗp?Wܨ^-Kz9 q?bo9N:?U S 4OKuW{!o_^-րf%Ղ\BZɺ٣cBgڿ1MV.;JY :fԼ[ΓZ1JJnsr1̩{8oB(ljW,a&S4$1PEų\I_Z"ÇgV-Cݻ3wqqq9rˣ( iii9vy-lׯ$(㾃e_pi>;/bw,-犍p&ۦb(xˤ5#"c<}_HF7Ma-iش#7xR!Hſ{]uOϱQ4>R^#+ǞBO8O~l|)Mãi߰!_KbVT=W1(kѮa=6l[՜ڹ7ΦKڇl jH*(ws;U^;f~Vv*B[^oބ $Qʕ*QR^}M@Q|mڴ__!`֭ԬYq#={XWFOyydևHpXnKD[6-uFfύG_-aS*<eul _0tu -j^¦XЯ8{C Ƞ ŠU+Y(A !T2x#EQ-i%-5y=$OEhh[daʔtoJzUEQQ 5EEKTն)q_+ѴW;h!xIBk L(_<ӧOOj%񤠅cOd5y`Ik,[unִ.剋əljR*1v: Ԍg~Yv;P. &"4oR6s"צed4Ȑ7{_cF:u\L.d/Jh0 h G !bNhT53H˂&Bt*uz!5jw^Lٳg}dh)4A &DcߒIzkQ=6{Y'82xz{t [ܺAAo礻\Gvܸu-4ǒ!k 5KV!ύ_L HAQX!D#W_( cX>-x{Y.'2<0,эC)H3s4lGL4/`?);6 :A՝l^D\ unܸg6Ϥni}B(R!D:&]EOS1ܸmyӴl^myB`o,Dmd4b8,w9`9[CJRߍ Sg7"US1\عktݠldR]԰ߧd4f7_f%0$NGfbΝL&B</@BO?'A \ [׃WD]jA:FG9rAwXn֪Qq罱 97P/~2[;U4HٿѬm'r0l ^?ź~A!([>xUQ[3-M S÷P@B!+/*"Sύ6쀖ӷA4! ɇ+Wm,e0j.ogĄs>2X?k~ɟW˔t N~dECmICQL k O4?z(B!xzNNN$^a 23K@Z\-hk1me=*9x54 ͸˾Y ˇ2G'a}$i 6(]=n>eV!=3O&>>1I9}D:#-.Y_~lٲ зo_~12x^.g>E U|G!BOr*#>.1Y]\BܶEz% {֠Ŏ;hРw0 ?N.]8y$Cx{1TUMs!Bdɂ(dqwG7&^Y9sfD:# z֠E\\IA"Ep=z4uOFϏɬyB!D( Yd!K,IBtNn]MTT3-mƹs0 %Krf ̛7/ͲB!B$p!5ƍѣi Z@il*[WUB!B.Ŀٳi%9r^{֭[K7!B!xHBkj֬A WWWON̙1 3g@>}d| !B!xHBk:t@ K,׏'>2haSZ56nHڵqrrhѢL2aÆ(B!BJYEĿFUUK⋤姙TQ||| 0 6=B!BW.ĿiEB!B!B!B!^\B!B! KBD/NNz/-_bq "=ۆăkՈ>DwU"0Cs5@<Xs_G!xHBgߘ?]1 c\ar%Hn4콊knȼQ =;V'(~ Q[.SrZA~Ѓoφ4gC[WBŊ&>NIQ7@JƮ9 yujWF}E:# !D`e񟞵*"[)aCCg,K`|>y t#oO;4+~sјGS)_YUٮRc,J !ґ6?ٱ[BhY!īG!v[bٶa.} K;.AԆ%l+Ќ_cҍJbg˗uy29}T%5q(#Am"Fi vcl7j`쮈+J5Rkv>GSHMQG|߇]\ zi.R\i% s yNnsNcb?}SAʞTlҒxM;2f>i]jUkԝ;#.;wk lCߙ{ULd͛W&3\Lԉ^ѓ/Wc'4^ꃷ@ VSHM|;/X[h$A nrzWtj_uZcb cP2UYA\F$p!+Wホ 4YuaÆ#GgΧ~JBBc6]F&MȜ939sO>>ЯzajT7Sr\6'56l,]  QcD b33&\gl^!7~c8kxܛaKl }<~lPYdžZC_'0 O%lڼgH~:OΠ j!X*E'(vm?C*PIqѸ =r0F*FF%~nrO.-zA-~@ij&ֻǯr4>`6Ƿ>@̛O9^wR0st%g6QlXa0Y͖}#qNp)߮ ūT{G i2.DX+xNϨCoVGpmcO0qxT丟NТsbrB~+`K.W֡ HH~_CRB5;]7~R%Cu~Rޙɔ!]+¡NGZς>-Cx&^M6^sHū͈ʵ)h BE\%afիիɛ7oRbʔ)椼K=?~<&ׯS^=;awѤ:ׯ\r7.ixıoJN\OͽZJTҰaC>"hacW^e˖IUqo;e"t$ZަaƇYkeSÑgh"o}c`my5/_WE(=@m ?  dQL r[KƍxfL @Hا+-NҧLxk:ʻ)))%D]͟>FYM>WԭB,c\hi7S[j&yfHIZ 'UCIQ%(8ei4 'eLKKz< xC\\"Ҳ5kvBΣw9߬f;EA/'Tiې3JFzyQA08v 槟~zl~]י:u* СCz\Yefa  y|͓ӠH{姭\M؛'8sy|2Pq,Ekj].# G PrRhvL $*j;gVYDtTAJo8q޾nLSnz4g7ØmHJm{p'cogre*A|r^IB> [k;EMQ^0-c iH#yՠzL3lR 9ɷP/~2[ց*U4 A4IDƠ9U>Ǐs_c|kdAJK^'Z:-!NMC3e5*ĎIu ae\LpJS3 nwSru? 4 ~clܚU*Sn{>ww|cPz5omE{>e+̩[2N3:ߛK5kԢnlgɉ;s>z !҃Do'-RatۇM$]{s=jmseLJ AM㹂jl[=Tnd}?S|ڭCR6-]֭[?C 2dǏ_~I}'A,Y{CJj(Q/:&0o<7oV]B&Qo01T-10uMCws0:$mg`z5%&(3w:P9VT2nc6TWTT2 CnXMJEuK@  jLp,F짮i k:k~YJro4ʲuVxO;v,#fZ Gb>*_BB"""v\ (Qj9J6Sm)*}Pc-z!JR]٤BWa޳L IDATueGh0h}etnl]N,w{mˆu-~x~1iץ -.sˮ]ٳ''NK.+V{rJ(ᘜBN?~<={dT^e=RA,c.( jvѧsj hq}er%7'LHlrvi;(e MC/T۶i1}C5_D#ձ^~~&߶JE;O_iMeKvS'`_!29>{"gD!ңo)iIB♸; cƌ :nݺ䄢(ʸq0 iӦjyQX1V^MQ5kıcRKbܸqX&2*VL4/8l}^ۇ8Qݿꂏsʓ ' 9z,MF!BwϤZj,Y&eɼjF<&^8-ɓf"44'b2%\EɉݻH׮]پ}{R%KOZd'P4ORSU[(+5PTM&@B!xHB<7ngΜVZo>EZlJ*~z ,Hɑ#GmÆ Ro*Ŋcݺu̞=;=z!CBhr+B! +A!ۛcFR'1Ltؑ:jٜ&-]w_Ӳ*"7Z""{2PmKwx<W/q={iv)+X"yN'@'*u0͇})j}W©+d-woB~5xS߮fV3y.쨹[0qoSQ.YL2z{ B<'/`BL{D|~!G-nb(,[2s?e9y)t 03\~zx˕xqBsQ@37K7r+=V3.6Oj⸼v};gaH~\Ȅ?gѹL N',/=, Uã׉AvA,=k vkT~wgx;ܫ5kSzmCG [g'G-Gv_IAsN~ݚw~^WVuЫ Ozvp&G ȧcsoN?̓kta ihRUy{oLׅ71й4#{,Y1^ٓZdш.ԯYJA)?BAaƷnĈ"ƽ,2jО~sc4†=iQAM?_q.|f1ȹjژF±}TLN8;;bRQeɄi:Pn4up<GSW2VԢvLu{26֮ Afd4 nK>iUtF4{g ECP| 7d64luC1s~&]׍p%˲v \R SS"$;==nGt˜xM1lgA3:dh8.Ag8saxvօб;GTo8&oc8A޹^IWӹ:<^Z0hb6Ɲٌ/ĿN*9:%’GBMeyQmlLYsٜtofgfٌBڟ2긿6W`V|0*Y1LoSf օ3:%;B>b¢ldm< K}00W^:`oYhjϬ5ٺn ?m[٬?uqOYa%cçP0_`~fYio~|.荌}#qNX%@ ~XߧtUN[lY1g&2.< 74򣛭A;뿦|֓~g +9+`;Nyu1b`f6/Iۘ(_Rғ0oTcլ]8&u.3F\Āiyh~cG^L_N{&n2gM7囅Y2;uk74?^2ujVNj ?b61S$;Ha9~US{\V~ד6J&r [m]Y=n>ݩKڕ@Xt>!F sXz%~G'E˖tLz*[(̇D:~FSPU1"2~EVx/iW7p-ߘ`ͬmǰkVk7ݦ8wXKXs4 7YYyK')-k؝:6UqӺQݦjeYKBk+Yz͟~6'Ӽ8cʍٞ2фwVps\ЀLTlӆ|7ٸ EQ8=95VEYWU3GW!DǾ%+9q->֢zl4.cOhq*etox:d*9 'w2sl6$A0>K\[Q9a# /oOۖ70mDŽNw>gP2!dRq;]"7o[a5Cb$:UǴ _^ {wv66:QӯEUtSK|iw쨶8ldϦ1ÛfNSɤ?/_0uϓٝ7^7oEmX3vfH#!C1 ~/V0t7v n!L!R *Ybj2d&(44{⑴sdsxX{ fxY -JY}4!Cs Tc܄0N5j|ZD"ݐ"E2:y-Zg`FZuawwc %z6d~TJaI<՗\p{GԳv#!][7 PstzV 0u!_[Ds'W5nY6vw MU M{WM%OܖG* fMD.ɥhYR\B쁇UN n4Cq(39$g 5`M%oMJ^{e=]D>Ĺfς)H\ph1w98g>۳VF1uhPd/'W@ 4CAxh $Q8a豷H4o$|ѡ:O^)(_"W"C k>+%X+rv/-ыQ[X~U_:$썷M% Ʀs+ES1\)GU3j,d:[iq ^fM84؈SxB0_Z ^cFX$e˓9Ν8yYД_1 Lx+\:y0Tգߘ1$u4W`>򑃙ם>vQTT-3s5k*%ќ?SPT9K7[[%:U^̘rK\ӹ~ 2۴w֌e4+BU+BB{>nz톔Kj9N*Z7Ňd8W&V=O6(窢 ԎλAթX:ȆWX? uWZ Bҩo+L%ѵm~n@69^WKZ}wD77k+x `dSZh;J2vӪݦ)-s4װ$O._sJatȴjФkTzTq._Y|%5jQfT3i6ީOP|S!ڍJۿҽQmרC|%>Srz:E m;"6dsh.bL>m΃X&=>R1~#!cZcZڇF5рw |`px/d_EA4fk:gYA{4s(mz q12?GvX0|{q6-tAR1c\.Lͬv5;u^&~Q_)i $\{O{VGn}4+fW[6-*dl>MqC>!OXCEf/i1@u-k~JhE(ow<,n*tI.KEmEn@0ꮊb}}^7a6c=YG4T Kbt0 f0@0tkH˝ 3:6c)~{:smΎF+~P4Kiuͮ"5q<^WNDDގ;%JwROvQڵi0 nNTiG'%R[-ZXRRo%;wB!D:+YOwڞ(CtXY#)XGw/#u In[D#B:ocoن;.Wv}*-5 5SKoyw0r8gdGLPηX;:_sq,42{M j OGy@Kn4 㒥y0arشt= ?1`}ɕ}?fWl=0_`~ڗ\KpuǷ0F !殡¸d&=cϴoBB+FƮ[霖/ַkgit._!܃ec]ZxTHA-LIP W&|>׋Nf y<CW ̅IۛW5{#)3٫46}/i5'&\V-F͛3 [<$ gsW3Dai&TU u -:PSJT%K\2CMPᒭ,ﴩJ&|)Nξr5J< IDAT!olpkVִ.剋əljR*es鞥vʦF!i8j>!Alq¾Gt bOL'4p5NC( Vw2l8Aa}U1 #5Q٩l^O[-[ƤPuˌ#zTQs-)Woo<\Dͷ-0ΚCbXfSɶ&U'6UTF!B!.^qZǸPp^M*1v&fVO\4eޤR">*aiaLG.W#((jvd9A] n+q,IɃvYaF $As'2.MQ4|B!"=xi{ԺvVj@-mp[6Ym&ĸ!v됇dc,!^M ݜzM2?y'K7t3:ց ]7,>Uݰm^( vY͆unr #ynXVY0u,$ ;u&~\ڋR2tGAQ-sK_OPwU ]g}^E!Sq5s/D⎫8r(ڴNUm)*}Pc!ċ0 vĺ2z#4H>@òs[nl.'bo[6-u:ύG/mzQ,@JG:6'nw!xiH !DeaG|geYu3oq*wjӌmM R$<-~ zN".)V=ӍrѩG x<],;tI!^=3;fg,~l SRˮQߛ>#aֳ)͙<)]'0Ul;yD'K~T13ϵ闕l;q&/JYw7k$b+y5πNTRAxGRj}GQ]+)k H -X@ * "H,RRCJQEB G.rI|Vogf632KܔtX'_vRk U.О ӫzg僛QK{򕎦׼t`;Os޺{0F7տ߶y̰B=!e9q+m $`ڸdl[4Ldh57B׹Q471uh'iWڎ]–X9!W`Ow;D! !DF#^ݎaG̊ 7"Jf6ǻ+8Uuh{RI>f/H51J0_ǜ qxW KJp݆]M:ёa ܞ)?I Tu?΍#3AMhֱ?Dgu76_ŬA] Gtra>= .3C/&}1:0[z<{[{b'h[n]C!V($g6!k:715PHwӱ%MCBimv\$-s<?z"Biڒ}'t4k͐f35nʠ .2C0xws5+x̩5ӱ%!#w:[.g/_3w{uxϏkqk9+OUkҍԢ__C&yz};m8)a]2sem՝y}(թ7[IC_wжySqk9gh9:v;r #pPɀvavϒޢ[d#9v G^[41:c[[/^G_˭7D'֬"{1b/YF3۟n4kИna7,0R <Ӥ nFG8^B\n0To_sK*jӼ/_L:5Y"K8|i\X ŵ&Ͻ a0br8A%91#%Z<.EQF;m6G?#Ux{F<0)i."imckς[]SӖv8#ߏQ[yX&E]Kٓ80oĎt 5?qQoN'yStnƪk֥IAbX-Y?+ftI yMn0wNv=kPPI>.hiGY^9ٱ;&=˔!s ՝L%g ZJ s;BMmBؼfo'{CyLeg14 2Py?KE6G>Ƥ*3|Z6_F9t:3!q@]Ÿ s awYYo՛Luھt}<5-Ž$5jU(4.?229v#GnPZ95ΝM2ų&WF0 Cc=ۏd}Vf3&P 5gi^X.o=Dp@Bkgu}R8` TS89D' 8b? 8<ߍň7Z:oW!ewB<҉I'NX`C+sRgEEU VUT;ONQ=t^5k>Ȕ.-iͶN\/%wַx1inR)c[i^78PP j㑭e#,,QΒZQA%?58T`U! ƒn 6HFND_=2%3,9ykIG<bE-Xp:׮%텪'c ֋-&m ]XqX1恫/w'JwΗ<U!0oZGm~lՀ P\ps3{$&)c Z771$n\4V@qDtӉۮ X5Pt6P]YF %DR#g郧K/~;Ќ[o)b,M`T?~Z/ˮ~_ˆx{k~U?Jrf Xol|Q[>CXٗÛ`߉)vX[Ѿ//_`e_,)qڻQ}jJ~C1(=2~Kocq"ZUꙬ:Z0( i]K`ks͸'T*a{r9W_$uw;SX)hgfeMV?qK7`Pҹ~$RtM -zswq)YCOkX U}pqr_,{ 7tS8ɺ.OB<@Nheק, ›`T:!X6gD,y!xZ2-½ٻpG͠%r/2ӢvqnYܾ룩TjD6!y R ܾ[. TA/F=-~?+Z*Vewr1E4hW0u ^Z)ѢyA%dL:Fs`JDb :vUzS1dSҰ@͖MI]?uScJ(|UH>W5&dImFע9нCBϙyZ;jLir<_umD1''[LeRO`p+NgGaDoUB#2m$On4=?Ob i\*]FLއUŽO楝M[`F PWix cjV̔ih3!ߊ:EIH8øa)H٧7Q~!fx1ׯ&T)&LM'Eq#gXqLl#x5&`=N*LJ|̔;3'.w%‡ŪNB3Ы%ג t3-'m{RXM;KEV#*#`8a^|fLpV7FNHa<5)Tɠ(b! >-qL~, ~ͽ؝-w[?^2(l䃡gWVoMdBȤĻ\fiW "ÐXp^L?$RtSgR08J7?wVO8ÏKWfs?=\cp(Hڗƹ Юe3/NC0mBdט}{)*>OeQ!iǧLs ;`'MsF{!򏼏V.t׶K9k0_Y7ڬg.*`Y7ZיF8|wګllnβ`{:|F5:=MUqx?; 5 V"ȏbbbO`ђ).Z(jƜCmZ-+4q33E1?*5!ȍ!bV1$Z6d'BGɑ2x%nuf #B \99HzKZjI߈zx<و#x0*3ۗx2`x)"o tnBOIB#4}ݿ-6:xHt-g5LB!@⡳&qᛏHp*]#kZB!B!C29x4-2:V&a׆B!B|I⡊۷ '{<% gxBB!B񸓡"1''/ ݮ8-`t{ɗ`u>/V̢Xp-_S!B!OͭS)JoQhl鹹r&7~!% ΠX~i-B!1 CECr,C9ǩplib~B!BB<4I9B (QFƜ3(־u؈B!C4N"a' zP(jΘ[f"i#B!ؘXʕ-/A !rek% \-i.3gu³Oi~(X:E1s/Nl%StE87ssTgbO2am;~$!Jzz:9{w C9o[ qTlZȍ_vg<i71_.( jR}_.n~ x4'Fwz+Nۋy#U/ˈ.Op5 _ok9v^eOQ׿PW^'#B!DN%%?M&ҩ{ Xd$ݰO/i7Ytz #n^nNŠ|*@xB~6 IDATgqLjY10 ߙ ϩ5Μ䫄.)僛ȷY!BPqtKkw@5:'aDs\X1 ŠY[#hIsi]sb0 ps4轐 fGY&/]Z(!e8kO y[BQ?-}f#nc2UU@Q0Ttn~fl֘z-6zgRuvYKֲ]Bǰ+I#=z73 M?XW'ƼS{!B!G3z9 hW(5Ef+}tR"e1,oC 7ı%KS@I ds)*RT2ϥXy\0Ǚ50rӥ$Kc2@C+콍ʼnhUëgheZ5/AQ0lNGY\A\A!{*5+ǘ4t-p]s^V} h&@bB@ځYU\ۍ *.I4v 9DZڅ`wdAUs^ q΍_ݥ ]?*^]6留I>A#tݣ*T95[ۀRt0kD>,Ԟb \d=ĘԮB6sɢx_+ĎQ]jPzay$X'B` ]MC*?hG=$gKs;6p4Uyogjz?~E<*"ȿC ]+ƾHA2`PAPYՠPnz(*An*=g~7e<Ui3}2&m'5wkfDWT 69~xq^<ɬh VhkYʷœwb(v#1#yYa WwH5jߡhtmm Y6[LoNwױ8Cۧ'm3 !. \!5E5CVzgŚ=?g=wrYe#ﴜT5tȹ*KQT2BSkz%?ER|+ϧ0+2UI-f?p\ fH*):70Fyl(`+&Ewt(}>waK|v-q]f<%p ѝa4` .az=+ t(ʩә6N'ЂW|fEL_|!?|PIcv|]JƠyWA}(lfET*DM*hһ/tY>N2Tވ߮Tߚt@\f x4'4V1C\K?Iqm6ykasgo6Z/.`ѫ$ٷxsE @!Bo>yMNco{>:&|#9k˝vi +ٸ5Nٰi%ja6ho ->i*1:OgyFQ}d@;wF-/mb휮hKFўDk/D3jY֨eО'֦&g֮uvq OWUsJBll̦sޣ.T>YPH־ KV)kFWF.ZF [uk7c~l952fNk:7l.߬L_ydKݬ~K&)%QlٴE;|4~t}n7l159=#V]A*".B!ȯO즍7~}'",<R8a'-]Tx31]+/wu_JP)X==BϳdH)c14*ϭW6ht-`k@ 6{՝OR 1Y׫n׉J*8Q*^#~ ~+[X{% w粅]kЎ!EqP xmOsCl?dWhԑV%Q*6cMZw E_&ڽonݩ5MPIE_Y_"7fݏ\HRq+Vy u}oi芊G`j_.UƄB!kN†/szGJ3 ZqT >x 5[<}<ظ9/7Cq!pاb>TݷSه _ _% !B!3: 0~6w(DkZ ]kwO7*Nrb;|+tn&ܼp x·h['@Q>w7=q ʴ2QoͶ sOCUl#{dZ;fԂx{:Ql.c~ġz'O1~՟ɻ*ײa7Yq~ #0qeYG!B9RES]䓴lo=wnQ_Tf{ {O&ёq8>IěB% Ȩ0nbW’Lx"N9 IيI o߃} =p/NPh}\ڗ|H %Xҧ6#IHWq)\~@99ul)#r G'ʇɛ]T?ĬQV詜]7#kILK_E0N4T35p S_cd4G/a%pkȉL1H _"9z%<<|6?GtڊTÈJC^X:?'?@OSTep`4 ȞW@zmzաÇ j?B񸉉7s@v,'*'pدt%VuvKjr:t0uj2m۶ƍ',uވl9ẽ 17BFEWlkhes{?kn ͢;'vQ}]1doAE~&T|SGtOϛc[kfkĬHubNwYcկZY{:n3FQPUv g}d\#:Qiڝ0MC$69>][Ck.6mb']Aj֨a70[ nn:3_YX̀nnY׭iS]퇜ۊǑ.B!'˒1 2:jBTo5a-8~LigXk|~a|3$ !B!eBاרzzڧ !5AB!B!W$p!B!BG.C9G"Il==-GJ q,⹖CXk !B!" \pR.Fb$=}ѫPuЈ4.aZ m~R04wæB!ąx@\ frl D}>Ճ1}<ݒBZB4qpɖqQn݋l  GE<T|C1'2K1y|Gʚک8P;+B<&4쳄wdO.CWex'l)q-YOn`P %,)*`0(sT+z,d/We,B#ݭgu/0< `iyެ{LHR)܃I˅|07O&.|0?%AwdQ|1nKl5T9]r !wӧ)S,r&ĽJKKӸg|F ASXRg:C:Ͻm߬ Ƃ1k)YErA|D7\(vŇǀ~h?O _y0?!~y֏{cY2%>X,Z7ryCfS6p%ɃJ:G?#|t*5ϳxK SjR@gB!ŋset۷ypptÝ"g|FrX~_6mxVo*]s<wKO Rc+hjFY'vOْքw[SU>!(&,;b`+UxfZ(=TTR!֬^qĠSZ̞UD.B?wwwE bBA5puu>K3KW%Nup" +՚rߣMt `,ND|mpnv 嬠_ẳ?.w3ƀB&hP +->΅(f ZR1D`i!B!9,EEEQUpKnבQ-K4b6OI>A#t=7 hAq2ۄ ^M aSGFoPLO¤Q;=BPq'8CH>Syq&jN44OrMB!B$=.ăaa-1ߐao:4chn*@CVՐ5tù(b`NjBWZbѾy-J2xV3ٔ5 8'dv{ B!//:ߎ%%CW’l(U+%E`!G5=IA/v(yCV4$c=ڵA!{^B!*"S@Iq6'}SAQp (AnmB!B])XIO1߯!aL^2xtM'= 16"Z~Y!.]H"EpvqBGVҭ$.^DBY_$ ( _[m_r?+nk"BG;8OrJ]B<E@' M{HBukJҙ$?fn3ߠ(*FW\WƥLUTQ!{VC!;$p!EA5p-WrI#5P! !①1BHB<Y 0!B!xpd!B!B<$p!B!BG.B!D/%! !cr+zGeMS;-Ѡً;~m.gT~Tvkӳ~!BBGL)ȿVւe2mγ AFexw2rr @%cq0uAXB5ǒ !B/TE鮡EAd_Y)QB!&*"x,Y.̧gA}ԅ`weH4.m@y IDATIH8ZHunYĈ4jB' 4v ,4uwU< ?ś=# jLæwML$ ֥N*fH/%Ɓ}Y0ro C0(izg~zMi0/|Ȗ!B!2 \!S:%#h &WEoDB `U,xƸ( \陬߲%o񭱬QI7o`bX k?Cl߲k>gQڕx{Z};ٲh 5]cn f`˶(D$1b?i ,:KVTBJ 潥عKqZ˸O EB!! !c&;V{RHXc֟IGAUPT wb_[^j^~ :}? UNU)抳+Ŋ{?O ZE:jJx;9V4ŲpNnuht|zfY%a@^M(bRܺpB!"?9.=-6رeF L 8F#Z N4sT_j  |g;0@=H~]2fGa3+Zooh e[s0c sJ_S_iBG.=O`~pW(*U!Ͷ0 ^8V?NyE5*bMtzS&1`{J}w7hb4(K6#B!r9BEqmF0nN벇n.Rkl2p['bSmAOѓĥjrӸmQkԜjgH%/6 B!#q!<#ugb 2KOŋ-&! Wˈ)yTZ3vJ2S ̈́XRtG|++Pپ41| N%h4`( է &L (F[sԾ;f!B!Wz.ryeymndPsy6FEL6Fb:3W{?{Eqwf6!4&H RE]+E+`o("A"I =3&(rE|9Sn֘yRŹ3_ zU\':>N xjuؾ&[<¶sz8y- Ʋu9 .1Xu|8 ]q&9ze~?Km.75%("<$$${sgyb\eiִi""r<':>|@Avz'`W܀m_[XV4 Rs"uE}m'"lBv`YGXU`BYVY1cQ+q6 zϥ{ =ơPH:.J > Dr[Prs CoqwTR?3 y9=E|OZ~%^իȉ`9_4tJϙ6>ؐɌ4 1q j9Q,Iup0:;>lsEcOYKth=-fJdaYL= 6u|eKX7,!g&,mGlvT8/ d.MӢ=9]|ΐ2خï9gW\}f%ForƝ-~vų͢H]v/nY?2.%Jϴ5qƄfq\pC\N; |CՆ1t].> jd e 9R91'Fsif4zJ4y쫃|"NqN$ oYԋ -DDDDDD ?d仄z !ήB9|~Хs(բs-!pv|f˾C>Ҏr%5X^guޓ.^e^/y ⫅qN^\Ю)P4|g}Mv-\(h2wCڡ $,Mϟ7y޽99hsneyRbͶ<;TeWKa0>zȟM=.NxPCnC>ai.tٗera߁?uH^2 u]pv /?Ć0.r0d;}.QT准a$E池R-r砋\2 =q]Rr!&>T huv%Z]B|eզ e*qYgQsl&'8Jj;^\AMj!#u]2!>< N1E#s.S`C\|Kj1. y6\(79)\^Cff=|JavƐ;ېΤn,Ȧn(FC=BEDDDDDw ²-%3ug=~gv.q#/ ui0&aiml 8ˮ iBBs Q8S/1l{ WLf nuaotDž]<--! r xs!d3yKjǛ>ٝOvtp s 7a㕵^Ř9'1]ڝM=MwWL;bGX0\)xEX3q\6x DqKxjdž2y<֎fPMH\ |ޒB Ʋ,J~UVI e/UX=9fpÓ]w3sa.?ɐr1@Vþ9xoj2r;rC4(jk^>7 }֟q[a1DX_'{9To+60p;}p}8?~\]]ODDbDnn.%sssTLDD8!Q28 'heS.w+R*:OA딸V:nɶ %/2?9.\>甚(9=sqR><7mKK_dm乏sUӦ3wL)y9կw2.f߾\^pF=.V=7%"/irV8TFND^>eIS~S>gRp3{"7ru<j SlU"" Oi;vLBB5RSS AA{}\ )oO&(RA_(׍Ce3I 5 L[aMdhBepӒٙQvgU&$$Kxl]:oٹs'RNjG"H+ 뷺C*4<Ncf 1μ~Q<;+hE,I_Eɬ:Ɓީxū o<M~xMνz$\Ӕ8+/G_Ǎgxy<& nHxh޴)͛6 )7\H]˪uH:)\c,b[GkC#1*/# ⳑqxHsz+k` w?f.n'}Ý"p\V Fą6EDDDDDM)"{(Q9Q9&|e ۶- ˶mc>k7FݸE((i:{/91Dq!"#dBBP7¨{t o/{y7& Ebh2  f"K )dYʂ >#xoĈO=:| v""RqٍjPMGf%`l[6{O7s~U~7z5\[-"""""Qpq ^ThQ7² K2M] V7`Dc`Ϻ)o )\HBDDDDDDD-"""""""Rn)rK[ .DDDDDDDRp!"""""""喂 )\HBD̍L֏: edҽTߔ3ϙT̞+{ܛhh9x:znΛ]cqM >\7N $YC{0(:Os ~ D.3shwZVwr}Dv0`B8۩i8y{M6 Re l<4O}ލ<X>Gtyk#%Στow?u:ҬyK>w~*%cûۿmu P&.ۋu5g ]2XpFҺu<>6m#{Ъu[ ả\F:кm: +6uzɆ|ˑ'Qp!)''}f\bF_}\%w-뒔tRa-;:dDvxI>O1?3uŕ<=VZFзko=jCxwN40p(`gY~>ZĕwYm) uX$Vw~C#f`_2Qu}Ͽ3'C^v2ձhQ㿮G;Ye),%} {yG}IJ0륑nI[`2sC b̥ur?{Dkhj6'ʢ%H36zSMMF1xf}| *X5'=W :=cĶYz)EDDDDN0 .7=Z q* uYf =X~R{(Q9*= G\31 b,l2˶0,ƶ ΎW؎"jwKm0sK΢fl s3'է^&K,"[ܪ$zHT;. >&ǔu e+ʞ9ľ4/  þTr-ڙ83+²?3ʛL'|6v~*? s $FeIL|*oOu=I o!hmrdQDDDD@YfS,$$%KТErZYn:u"77,''YfqmѳѲ,] 76h@H5sbV4e!XqUJb'S?{iX!XaPPExx8d T <'A4"j=8PpܻR֥(sUP~cNE\&03U'że$ڇ_l,/ԑZ֎y)\sfJqfȁ\ ulpX5۟)HRO7#r%<"~n""""rP9h׮-[4v}lْۗ (zMR٧s]=r3fUJϑo 电Ly+~ۆܔؚRQ s; RXysɃ^mR8PS7,~Ť7Ҩg(E8+|]^|dC^&~L6ogXHr>ixjΩUC,[·nЉ5;8耓O>\FZ0gOĵlNQH tmϠoXB(###,,X7|Crr2jբUVt֍#ZkP(Me›c_p"H8l2=qSO7%nY W<$ʐϥyK|jr0ݰz0 >?O㋨E8Vv/>{bj.j>i.wӥ .zX@Hx{b G\^T]O,W]u3f(1e~c^`񤧧/a `Cll,CeSq_ፐ?pGZZ=͚5cժU!X=;(t(ZY$SXS`e8m̴ֿ9)}HJ&huH#<R*C (X&/!˶!>~o)nfl zEq,b>=?"9sp5אyTA8l߾nݺ1m4zHcwd`n_#6;vuι'uP]xbFg(ZVDDDDXv- СCU+33kEѬY3uKrߓ@"hy$fRm0ODDDDr\eggӿ#~:ömؼٿbL ֮]KLLLpCƲP#""""K /m۶RC7nҥKYn1c֭cuY%ؾ};ƍ+1Ѧ\q /P*lhܸ1˖-m۶xzڴiSn:زe WUV0^͛7 9{9\H3c s-[, vJll,e2h /_NDDDqy| +QC׮],G߻T|*"c eaYV ::;8h(i&ڷo_W}_TСC-Q[ fndʰ~tlׁO`myOr8}7F1_H=.>|8o6۷o/.s]7gQzȶmؼy3>ThQNR!{4^|SmN&NM0I% a oνǬQ5D`˶E8Բg)""""rM61k,fΜƍzB>R-Dev~?oU_!ڷ{v&4 !<2;39*F|}tu9>\q׬Y3MV*8[4o\CA47iUїn£hzz~yj0FJ&e/|#xUYtmO.[ \|+x+钔DWq;|9|~Vm2AfIÝ^dLIԓkk+ C޽Y`W]u?s.e:餓xwre:$WPP)1"y<-Q<2h2!>y>'魗F6}3h}ю2{{҇<)eK>h$l@\x4] Z: |7.ݘ,q #^ˇjNb?LF_C˖-YnFRJ`nZZ9H,Je[8*䒞,, ۶- ˶mc>k7FݸE((4E"C>~9{i;ZZT #$!kAʒuJODDDDDz\_CLL > Æ c|7$''PV-ZjEn݈U`!k2Hp!!қCaT (o/{y7& EbX Io*{e^|]՗KADOpWrDeMVj?ʲ,*U_L~g)~jkYI*.+-kҥpc|t2,feASrTaW$F|1cmd(ѵiS*;fQQJ[yE|׬_T p,wm}߲b,_T;zMRٍjPMGf%`l[6{O7s~U02ѫZzmmCnlMzXhqa8k7Q,z֦`l 7k[Ъ#"""""H=.wMvvvqY~~>IIIk׎?-h3l2rssKѧOrf9V fJT&9+ 'ϦMxoc~khG O}<^5psJ~Ud#nye6^dzvC>:n cT !"""""G@cvaz`!Obknzn,>X?;>X%>>4Y_k]vX%jֆ8>ߪz\H:CfjJ;:{?|CDDDDD?"RW6WYV~u3XNv\RK׹똸62׽/ C^]x.c°ұ=&Q1o4 <6m;㦱,U?)"""""4 .DᒗeSg&-z0&2_8w3wؐr}FܷS[1:{jM8:>㹤]<ˬqp}[v,5i_,9<]={}.1J c$WODDDDD"Ry0/͚܋nNg䤑tdaռ="DR}kꥥ1pwaQ}5B!ᴺ2ć 쫯,ыwBY 5#=DקK|&K9.iDΣN9idL&C9YC?b:,carf7OlT~?po &/;~"K20U ?V1pprYj'%঳?݁Tj2hO?J7"Rqa6eN㇩#,{o[O]Fqm-ͻw拇eqnro#P%+YXU=YS=PpXa\DDDDD 9A9OST c~lb¨Z /}M#3x\VN 6DS=xuwoy' X>|g"""""r4TDDNP!4?Σ_˦OIt`U}Y3p$u& t!\a-rǞlvg"˜Sd?מ?Cn'q.$68. """""JT\&~V/PɽxxZ=9>wҹ?si]~ϐ@jrp[p`4V (1Ī#5TDDDDDHCEDDDDDDDRp!"""""""喂 )\HBDDDDDDD-"""""""Rn)?φq WsFw^p,Njȉ\ d>~:OOo98Njԁ[~^uC0r|αWqgj'RDDDDDD6Q>c̈D5/Ob=Z -Q=TDDDDDD4TD9v׀O!.,u9+'c sx<ڴwæ2zY~svSR;^xO.؅H>_>a"U[|F;8W+)6gXzeډ:[Aq9vz2r'GNc7ѳsZA1-HB: l=04 ќ|c: sShj4g2|aC N.+'=˚F<#&>o,{ jyK8wdXR%s\(c<u$}I2~aZ鶋HB =^}'^Dk/71机ĆyҜvCٿNɳ6̄B>U-P3}5}5^% O?KkiQ5\vI R,.X1W}bC=D&ɿv)O4Dž0ؕk?Įg?6oΫoeÞe83rf7OlT~?Ý,! 9EB'x+C|{=UcU͈;y_S'qkO›kH/yRٳ/zu'ڗKADe r5ZEG,B<1O&*"""""" cYaUig7U?='̾yg oYƤ>~:Q񹩼[e4,`0&ϻGޘɧϝO*FrhTHggp/\%X /#]Owx72><,'i\n8s2â,{7Wp^M\ǮlR !rZ-LdѰqm<6=&+C4<qJP<&V_nG >J|FԋəMxBCNAA~xЫgx-oMCNw0U"""""POvp3<>~N!BIg4y5;5O EDԁ`[@CC<%l 4ۙo2;p=~iɹB8} WTp6j<44^dzvC>:n cT `\x < 5?νҘP㐶yCnI ]Fc=c^ջɹWkx""""RS9,.~o-pea,kccò 7 <\ǶԾТPᶗh[QQm %/m;_M洬hj6}?cE|00Ϟ{xi^{<'h+\jٕu`ϙ;f\wxhGh"/+cٗQgϾ?<ŻOM_׋<7wV{ pٿsVAl-}R,-_Og͘Ἴ)p_R˜_ 퐈#e^; w%Z&XDDDD"Ry8ZlM>yq3qc, 65ʡ¨ꥧ^ͧ0Dz4YU34zv"mڜw_*fnDkn0utYɿA .jϡsٔ:),b#N];o>_J7pIl4TDD*8Mn)RZe,4Cz xd=+xX%ƗĶӽ@B¶mq w _lk-Ϣ#59$]-WQI%S?Pt%5wc/Ƅ½}yxf-)\HW4EAEKci^Ń} \9`&,UpFIGFjC̡\0'xǣd |ތ^0;i.Z^IˊJPRRpM#j|ntba_  ĈO=&`ؕ4JDDDDʕqEDNG4o+6^\->5:6V.pcs 3/A~ĹiwQ{,Ӻw7|̌ˁuSUew?IEbnt^||;rwWõ2~ۆܔؚ;o_LBK~/ϕg I+9k0K4^ Ⱥ‰< x8%vJ)F1t>3qO Ym%_%ѫutaClxG ۗ: yX̪:2x'y6huѝm&]O?AGGZۑȢj_~T~G*+*|( O2 .zX@Hx{r£ G\^TEh?qRX_gutl߮Đ `cú8pi^hi^]^E`7p?q {bpxXEq@X6)c_W|"+[Lu!mܮHŗBjՂ|l9͚6-XDDg^>x > h;yQ+n/`-,+={G"G[V}O("R.,_Be{|NtJLw VAekR~}X*(WVDDDDDʗ2)히C37 .D°,CffVpEIÉ_*""FBjԫW5k IDATj l {}v`""" "RaԬ^]{v~ӷ8>-)Zom[$VA*JT(5נFbbrI󲈈\HAM)"""""""喂 )\HBDDDDDDD-"""""""Rn)rKˡa붭j_9 bY?3uBBB\Ql~,EDDL .}X͛7ex8ݻKBOB舠BP %H` R(R&%4w!B\H }of6e˖L2T\@m7Wnܸu|2/^$55*UPjU6lH5l79uiԪU gggl񈤧gpIN>E*f[m(m NNRRel+'O$#=//jpK[ !.=z* `ٲe |A( NNNN֭)W\>ťKXh˗/'::]~=`:nXX?#JއK|\<5k6Kl5<^ihd+k/ .$333 [šClB!B݊v䝱NPM]ou"4n|08wa1j̖;eNSϰvYj^k&QHg]wYc?]OBMC?XOi\wa}&Ŵ0iϟSӡE[{*.X!I䲱kלf8p<.ZS0-?Z|;Q}XeX'-B_K~4iFUVѳgORSD+¸q5jٙO>ǣҕF޽Yr]B4~g*ģvYܗ޽zf/ݻлw촾}piSEK sdK~p+I |׌j:+,[̴Kq,)P%?FJuW[޴X>͊KV%1_珼7M>CY|X ~<ә?tfJ z6LRV\'t5 ҏdZMʅ|og;ou:?MHb,Ӭ]>bK kY>ʂn8g? ؼ b_ʥ}H3_:G#>w5M: ~`?l['Z7SuؗY-v ߋD4kV0kP ~)QǦsjO"jzԏ߱BrzIՓ3gnn̓pݾm754\CHStv3nͬ\{'}Z3g Ƅy}{/ƿّYJfo hZ"wS/ 3lNah6˦ݷνkR:j5.<ŃdҌX%Uu$4 v~uM#MȞVmUb \s~~kFNE@NHDLGK=ceW^)ݴ"-Q!?BNV4W*G߼'m+NWڄll:!Ѩ\as/q-6my !BErС3g̾4aÆ Gm۶ϟ9spXNC.\N:͟D۶mٸq#ժU#33aÆuԉ~Z+_<&Oiӳx=SD)@|XO6*)P%9ܛZGflbK3KqD 7n\QILl2lJ5IUJR;Q_]7?>TWZIP Q,MӣS$hqAڵmCՙ=EΝ8|0/\f9Ra81*}G?_;i{%ʫiVW;]5hO0iNuyU;EQOdȶ0U7kArV,AWiY$"t-qqAmJ-4\nE7N^t+TϷ5{VASޘ2.~Ş.GC(Ur0Po`mHvˡ"ui. #%ꔸ#CxѬ5&1)\:U9]Ij'kЗ鲷[ƘR!1B;ٳ9r3gL˖-̗/-" aLQBCCYt)Z֭ƍٸq#SEw߽1xT@z݋| Ԙkn8yd7m(]EG@_MlHiQu"j P*k ]K ELoګbxU(HI Jnӯߵնzt렀`QvmJT(O`cdx#!oUO\LMiZI2@W|<fhמ:zB!"ۿ{BUjՈx4h׮G ̙sנ(4mڔ9s86rE^z%>-"""V"oU'QZN_q7PQ/dʆs$Gdp)붠iV~i j((n?ƵXr&F2~pX'uBr:KJ@orEP(ݔ*1kW]MA]I;㔒С?5-= PO=Dس{e.J?qj&g\0N>4yF.ֺDԬ]PǛg! a ĤyGOe(.xw\0x1˸(8g2ainJɿAӕ qMۆS@ jdWo+dz%Jx{5w51 |Όfκ]fSfB\>za$-Ȃ9v.kM{?_w{B!Dt;H!l( qqq8p.h( SNqxHN=/M0~bcc7d+t:Iht|ѷ>EH` 2z_0T>|gJXXKEZ,Nƒ\4i_-h|э.#4fqye Milb,T>/ذ)[37]5kMgj5MЬ0~w=wR_NY"x IPk^z gl7PD4j6ʖ-[hܸmr6w7άYⶻw]tGF}y^^eǣ !xxiƕ8Z@ͺksjnZ4uźf}尘Y6͊q!ȑ#Yd ׮]6x`f޽ٳٰaճ+߷o_Ο?_|chѢ|'v ה/_6G)UE]ϯekг2Ny+z=mi(jQB B!,-[5jT1b#O-M:TUEUURSS:u0u1bAAA9&FEɒ%s"P9`jݜ`Z>RSJϢi؉hVZ.ȄB;p|G)D.oE189(N;E韣SigTw BG߲mB!KHq>|x3jԨ{聓G zcaԨQ_a Çc,x,{HZ!B6 \6|p^c A4>s&O찌7k֬[ntڕk0p1ydƎ{9cbb裏r !B!xPq_Ǵi$PUAJCÆ -"##0`fӦMO>ԫW6K!B!Hz\2vX23憧Uhwެ\Үy N0hj*z0h鉻U|ViB!B!\رc,].1zh"##yꩧԩ7o.'t9qʔ)üyO&\x1ǏJa189n, Dѓm[ !.=z@TV޽{SbEVX][nΊ+Xjaaa$&&fʕ+Tz^4/Xx.ĩSHOϰPzz:'OpYv.ɓ's)\6ˎMfٖBIҥK̛7.(0z'TZ FRRUT^z%Nj7Ydd${v",Xjժ'=VZY1b˗JA+S,WٙE SdY,;e>%mۦL)xm{iK!A'/&--*~d!̓nΞ=]|ѳgOnܸA~SLaРAvۀ)H1g7nlMHHg׮]=9222Xd tAquuEQ 'D^PB)R6ˎ٣%mq/m)B>ӧxbTZj]Qc@s(T#zƳnOGFJ hՁA%(B{FA"EsTjA߷^ƯM\B ٚMhݫjy. atdj(AB!x4ﬧTހg=uSMXE\XζI/YO}9ɛ!1orgJE0~|ĜbW؇#1Les&w{:+PtB$ !SO3ߡ|=ap*H* Rt|ܜg4l[+nBE֍@ט4=uۆGӈ~|*@71_',-#'^IƃYIvE` a`! 7Ƈ#ywyG,*@!uw1s8~MLڕFⲷhLO`|1*aiǘ˴ k?-dYv&K㯹9MZa>RL|} T,_Eԧ{H@Œ^4~3t^ JmQmd%ӑoҲDI\&}r9SC|b/sչJ;1}"hğ᧨o%{nqm'9U$h*W7g`6IЋ y 듣?%7Q w[=JzҦM ?yGz L^2oQ60Ö͋BFB!xkyۭ71DԸe׮`X3S d#rq /3v777D{ZsQ~8&lL4ݼ;0r;vvR͛fǍ}%&.cCM 5TTτhy}{/ƿ#<@=g]"l(ޟ+fq7 Ym98 kdrq'=ו׾x _x~Q,X?vEY<=;qZfs5MVoLQX#}4ZCf$ΞsYE:;$֭g(/NMhܼQ=| ҵx} !/!B;ڍxnPnf-:3m J.L~a_ç[wjuP9ڶ͵8aQ/ՊàOyz<wk*(:J֯ܶngױhU:t>Ѷhm[dk^~g7hK3]ߝu3Lݨ[Ry.: \`?Ka'=W]ӾtTINK۰ibn,0T#Ŝ Uug?ā ?X׳a;S=(iP9y+$n8y, KByۇR.eA̝Zy%oL̠׷Ҽi^{N6'\g6|-:Gqg=.ɇvdJӻY9 Hۿ ~1+9w\c4_J8k\_Sqɤ&{(G/f\eAXHAMLq$\K<5ë6q]B)NqB3AWʹBPu_o:<Po_y*s/.&;Ӓ~CU) ZiV;b$(K &S,5tks=hedU63+5Af kˤ?b>/'΋ ;ŋoZ\ψ!gдn>D S,^Gm(M LM="2U/#V횃^A⥃6o1ꍎT}' !al\!Q,h8f㌯;2I xo}En8S?ebCr>Ovi:uN|:?æM4ޝUrE~=Q-v@OG>n"Z !CGRi?s*4XЕaė~G(V%w>S9ugiJ[MKE/TfAҍ"\(^!wkśV w-MMx}B:Y#_fN|mn{}Vſ:uźyalh^7d-gߏjR@ ,*Ȧ.v=*{^:- !xelCWEv@^ BD4vރWڶY?͸YȰY|mW-M Me4uźffZa1\3m*"B!t+m3xzQAB!,ܽB!Sc\M@_ޝlm !& !BעC# !ȳ$p!B! ECF!B!B!y.B!BgIB!B!y.B!BgIB!B!y.#a0oyN(h89-q*^vo+>%+<̜>cs,K×ZN!N-ij/3VT.ޢuuV1zh}B!B!B8m2+ ~gtp&'34@#b~;ٔ1_o9'IyI֟Ul^;^W0f)_]ȷV_7Kf(_D#m߾Ï4ecx^̶"-F·ְiw]w'#E4#Wf[j##_2nu2D!B!4 \;?·fMZ /^Z*.[=i_g7j'6MӺ p* AM+t"7}UZwiD ƿI|KR+Pə cvDM?M4Ow JҰ{[j;gEW2t5|uN1 >Gvui3e`E<: :T HB!BM+[~3sU"h+ɎVZmS{JfLe^Ľ b24'D2z<ǿ3^( 7^ !B!xPaOPFEՀx I~<UGȹLukNqY4=z%S' 8+7UȼY ؕ5Dž:0e{c2P:[8v&ޔd-B!B!8vAc//jԪMZBbP`ƿ^#:ҤauI3\*JE0ꛎC˦>kB+8Q߷һr^ io+.NxCJ>ja5e`4CgL)B!O\Niٽ-^[.k[X7XdnZ,_ Ͼ5ɥ6SYݓB#49)Z<,4F 042SOM5M (tfMQtg 1߮ӡSqTjD,*ȦyGuPqx2nݲB!}R PlY\]m'NKFFmDŨ\:]4]UmcO3|@fb2l-_Uucz&Y-ֵ43 l_k9,fyfM"s\+Ny~KGEⰀu`-SAݬqz } !K+SP!l!B 7o&q/>q4pvv~`38y8A矷O܇B'Ky B!… l \t6NlL,PN<ķmC {ė7q){2iXchd˰ >>[Z!ȧ3=bޤ˳8P߲8}f?<2,=ϖ?W_AÆ 0_~/^/] QQ?~f?LB0#vLah5_(aL4]yJDUgv;[Q"b[I^a]Ĩ99!6H\.|;/k3EF= bi}5G.Sq׍wQJo[ARp׍!/7}̱a;w!!ԭW*K=vOFdG[MBgiq+(h ֬e DRzRc?k,%%{c<IC_yU~pp-`{X.ZP.~x"WK{R}M$n~Ȍ] [P4|J1ꚳCKJ MKաSzмv~~a4 jEI4Uw&z e7qYfҳg̟;Ѹq|˦9hƳLԀs IDAT.LMיQ$AC6n%LOq2=ܹ9j{˯kv4'8L|}Uͽ}~vLDo]|Gl%t:_.uy%7л>>÷_BmvYV-J2 \!Wd˙D(ٿ1{~ YaƢ嬎י. i?;d-}p&G׮i1 !!ňU(X#>{L[?4|k"7j,R :]Su -quAB l ^γPZB@*QgC 'haʵjw4srؾvoZfRW4f7A;~k~0s~Z.T~{v`o_0J$ xR}7eWS,(0_nf|Rp;|Pϛس%9p!JlݹCrhV\O˘|wNgǛ)3v:pB!KT cB`͈u K/k2ٟƱH/fh`O@5|[!)_N&0+ڦ=3`1ڱMl86s _ٳ\vy-+[۴nbM"^Wp3f]lұ'rYks.U637qů%='p+-ҡ#*VxT[YŘ$9әbeCBwQ0mdթ2t:oC:ٶOV} iBqw{Ǫ+ayj_@mՕ*`w96Bx[_v_˰x<㯉B$)\^{hV4'7sy q9+`G':1%.TW\ I(X bM7n]_n/תy~.V0(wvL 1[Y=DūNi7Hr#c 1iÿ́ВibwUn/r=AI#*"<~0*y R@[ƉZ#~%qk;T[v+RhHu>Q53:OjSi~ĺ Qnz<&<}WOT.?:ёQ;/ކ 3@Aĝ}|ӺSR#ZR"Z= >6J'_j.NxSu•\t7{ sun➡n DEA'x[wQ1xPW}M{k/tF{>5˿EM7b?f7+bb&q ]p2Qqq1p3" ԤO||Ş9ӟXH㯪EA%:ѱ*v}Ỉ| m`|Mz ٱ2)^{9}"*^9=ٿ?CK.NfϞ=Nhy!ٜ@5l8fMޙ>1Dq2|c[ $|nfkԦQA5zʷvpZ8΢ ~' sjsT[Qrf_"AӍ%MMdvp# ̛ſriMͫK)`DԳkתŧw5P_j&s2ZKt9 ޯ _6 -Z7&y,9s dn/=h޼S(Z"^8w" (o 0s N_OrQXp,ek-Ou![1|a ILLdԨQ|wh}ӦMcРA7[۴Aڄx4z)VMZÉO5ijnP=vLڍ-EF%Aot dp\3j7\ [ T:It$kvcʈ)Ot=3rR}?`Gv_mgThU^c;-8r.ve7PPn|Ew3xbU鳉˅ct;l '4T0坺2KC~ׁ)sn|;NM@RYl)x41wC&݋6 έ[I-(lȹDZmvK Wų9Chꅻk!6:\I֍MF3nv5H8e6M͢1(F[])fpRYa@GNN.;E&l\5O+OO`¤4]l]5Nˉl=Ń#Ʋ`_Yf7\keP>mg';vE]DX.X/Sml)(+ oC3fwC- +gw<PSk|NXjeǵqR7- ߣh4uĮHX/c^=ל[ר=x8.AĊO6oDGR)8cf|ѫ~#"09qSޢΨX j/|5zN@U1I mTÕ;٩T'kY쌕2_Y?&^a@b}Y> QzY[.gҾũ 2̧M*`a*uwZ tCjrH6*Z߾}0sxdgAUUvʜ9sP(Z|8Ӳ٭+Ŀ@ݑ+=!KP7[ !E' Td?]v+WK.٭+,BB!'I\gFUU Cą2B!Btƍ;v_cTtY`0Pti|Mc/)I !O+I\Zf #""_' "99ٲ(2˗[=EQ>}:3gΤUVA*+[899ZB޲8 kkkL&F2ؙLIX[[[$.}Y;dN:뙒 ie+{NǎYd$/x˗/^BptB8BEgىsQh1'T0L?gg'ːxHBƍ/VUvɈ̻KJTquqsܾ}"*BKQɗ/.Ζ, ,ȕW9|0DccՅ|y[ F"Gs%<<%J(aYmܹs>|#!x9'0Bl( .hb 899|ąѣG-FbʕY &Ӷݛa{9ٰk.nܸ,cB!B<=₋hR[!B!xHB<#FWW(QQFeIz!B!x5HmP<NNN,ZRJYrTD -Z$!B!+L)Y$;wdx{{[yyy1p@vIҥB!BdpN(&L`„ a!B!" I\!x%hƙg$))2,BO+&ӉNB!^ gΞ%11___FeX!ɔsg8s,%^2,"0!ȈH-.I ! 0)V!!3I\!x%$%%a4Z[ !11S<UD<`1LtPxqe(f̘Su2-WWWCJWHB!%" X|W|WfPzjv܉]dI&9r䡓~-[PreI^!B!KBbƌ$'''M8vY;vѣheMq]fϞeB!B!^\Elle}Ί+$YW!B!G♩Qe5k֤tҖښ޽{K7!B!x @UUV\5h̒d!((ӧ9lS\ !BjąxbϟOQ3szzz2f̘NZ@ʶ&z{e"tLsfx`⹠n-U-?BqUA<1!}zTfZAYCN[7Z8KޫF> '9- {%LK[0{ '7\?+sAƮD<~B!xQHBҪ:jjNÎ383LJ"OJe1]'LCBǚZJk9MDsAǼ*`bm2~g a˼ح̼#hέO^EH2,w΅ZJ&-VZzfGWj0o;Ɛb)XFMdQ)?tCY)!ȍ4kֆkf(ipu9FJnB'nbu ^8{'CH\jT3Uq d IDATb4fagd@Ĕ󣜭( z5A/3_pjR홲|f?,9<u낶3tbFV 5]YV|l#O_Wg;~ W1ofPJAHs§W &;& ]<1ye-!xlll2eJɋǎ1e>lll,B<OLݱ6eʗ/mS2eؼy (P9$Iw5k?N'.+YƏ7TVN wkZ Љ]n6 ?6wv4<ȖRZs&`gQPp՞PJe%}IT)Pjcz.p}k14Mۢ#eڵĹmI/茝1C]I>Fw SA Eh;+ޫ& K^ʭ;WO9gyOּU??Fŀ{648ѓO&5ztb[Dn/ ޴*XvYr9"s<*A1p`9z QGEAq,FثZinGYl3uKѹV`]65uvl=F'bO߁ )j15eU*n^թ:P+TިQWnTЀRxcc_~ʄ1al[ B,+[gI^%-Le3!ē%5c6[YtؑO}8qyZH3k?cSU:RQÎWH:pkTYl@bHos)ˍ҈"z7-49ъRR*# [dU\ݰJLVQ X9^a3iv;\צ4ռʇO~p\Y6R3/sMbo+\R^EŠ*89;Kz Y}x, '|I&3NN!+xf,LݻϾ}_e:VUQ5hrS3ggZ̘: y~"}[)wZڽmXc{<,oH@!3lNROv,MKj6Sp7yN3Xn6|ETg7\niX=OouB.wOZ}SWN(wJY6s>I\WL7A?s*&n, WZ]>zQ$ErtfH4ݶ yʹ*lSF/ŏ="./=z$-3{BѢE-H"EXQ.ŭ~EG%S*kTiz8VG4bc)P8mpuQ9]Wߔ*/dkvsײV$) {]8zzZ;_M~SEV%sddUe(T^Xqh Xbw*5Qbfnp:?ÕФ!s~P KՆp-d){_6e^ *6KL;EJV6i]G)Tf1\ Nsw{7xoT'cm79SLFŨQ([eXBptt,Q)_|e˖Y-}ᇔ+W MʹHP+_޳\C9Pя׭!uNkt=Tމڽz7t(MdHtf|13V+PǟuZ .&fd)863uM,?I@§(>)_rR8'wŴ%3v|FFMhg*WU;ҫ^mCiנ 6{{JdrԮSF>C;Qա5w oT-Ps7=4 CWkT* D֎MhgS_I9kUZunȏl£/P-ы/`͘Il7gN!ē( ˕|y-SYZyƿ3[Ni5_5üUI%oڼUﴸ`c?ӛ&.A-ra_2]taٲehڽmڴaŨj朗\v{:-J1 ! oɹs2RhQ*T5Xz/NQ,mWe%$d+J;NLZ؟RT !"ԭ[Dz:7,CĄÑ@rd,32̧ ޕaޜa^O-K@Y08oKePyҺukPUU *PBP/?GO5z).FPHB!Ϝ$.c k;B`f"OO~Gta2ΤB!x$q!g3XeB!xHG!B!B<Ņx$/^d//^vpO!B!/I\y{g#GЭ[7璦iYB!B$.D:u?LufsINdO!^Q֘L&FeH!ɔe_<3UTa/D1`V* !^QN;w)2$Bd2qY,CBgBHQK"""X`An/.]0vX eH(X W^Ø-B!66/o^ː$.}1g7nĉ9~8Y.\RURJ1tP:wB\\\Pgg˛BI\!B!% !B!Bǚ&o"o9Ϡc^0g6?BV?Ye^OMfޑd4]hf'"$x_;Bj-|u%+ta-[CIý08`Dd{ uCײۻ o7ȏbݯ=ėnHOQ1vZiYUq/^F_ڗI5V8wٷ6C޴-j:R] JFhZdO|?ԕ>l$;}0Oir|СVѻ=oOn`x({oYڽ2Rc*BQ(Q:_/`5_Y\0kjmG{$q!Bӛu[},`eY ?fƜMr"ƶ @QruA}e |ָ2 La>oC_{)( '3QY}lY< #Vά3NUXHEUjPg;_!E^Q gFY!)ͥ,7J#*"sD+JNH(n!Vqqw*VTVvN8T4MCny?ڴ;H#Q͋m|䷼9\Y>Z8c{Ouv5=M9.eߡCh>Q{[⸄?C/kڦ2y=U Uu{`-68G/%lB!^BSƲqQ*n(#[Mۥ A56oqNhϼ>t9ІUߵÐc̦f)\/BI4sT1]Xı?x:QgE'nG.D&:PK2WioC6vWy|<"S_Wr8gfVTf2~4?.cݻ9ٖMc+I`27/f?K~β[۹ֿ=NYt3A U|oaA3|;>>z-ޢuJKMCI?g X'Cie5VO3U¯yRdjV`8ZJFLt,6JRZ'q>m WN#u\MB?Ohw8{ YG&M\+B{0ܬ=m7_F~t:$^ f޺p|TQ߾5Bl:*.^LRyz^oz>PMs`#hş%;Oϋ\d1`B!x )![uÇjI\ GT-A#DiɜٶFoZ;Dw޿Q/75v IEҾME·ntrf [ @U×^]z6D :Uo[+7ƶ-뀂g:qʈGźTq?mƖǏ`߷N,dXFmH_s3>ey ޻ѽ ֥;#VҸϏ6hCN͡t΅B~} VJ T~} >>>ty(]^O/SR?H|YC;CO`#NUTO$Gp#2m#E^3Ђ up-*({/҇W%#oqw?uj&[n^bY 8M7il㲩"B!Tz yԲXxv ߌR'~%|+O Ӥk)N`(N5_3{^6mעZv~pbk9UZ4s`/9bPo_䅨,mk} $ {w'GU[= YgBH"$,}\MwY @ " .;E Ȫ d%,]?O3ggzf>׫^u_殖jjU¬ݗQK ~?Eږ?1--^70J fZG3Z4jyzuR8 @FѵֺR}]>;4tĺmNhwа(~.kn=vnO+i^ֵ'M}>qnǂ/mӯOmuh: IDATw7nJ/pؾu}uėoЃo7l^y:r}uЉ7hS{V(ktݚ-,-9Hz𥠉zm}i[|/闯tiҥ]t'cn7<Ƒom9<7-lk%^|W\xI)cZG#78V>/#E\(F(W&2#%*XmmqDZ^C'kF{)R!T1η)jּ"vHn⼼|{kqEDjqؼk&3s8Oe]kr uk~`=m]l7 7hůXz{UY>8`NDZz6's\}ٗHj-lmZ|ޛ歒boB}k m/N*ɖD9JQ.P/WzA j¨:xD6Sq]r3uyis!;Mtl=pѸ@Fy[u/mkk]>W 1BĿ-ʏ2C )ZuuujnnV}}M2XYkpMn4.YG@?0zT,]Ɔ(0XDQ{be5Ѧhh9shT__Bss0Ҧи C $-^[Mt_:ըaC{f 7yϩyj.ҨQ6~`:lH jkm鲩ȑ#`Sgh\zMEjllTcc+$)gՂZ4.@բq Ph\ůC K,siŊ6)" >LǏר 4ٳ`ti1|͔w d71bMXl^{uI*ڼxul^Z;ml[4i^=[[|c6~`Px{^c~og ?Zh{^Ojmh#cƬ#I:'ϟ;sMsqKN]EmL|u.b-{~=6 ZBӦL>C?GŝyIjIStʕ34Cw/'&}SI:O /T;bvQھM5kT;b]m}Yǫw7jH555k\sעmuԬ7s>RGs&7oA/v<Ρ't!8I_=z^{K>9GO9ƫ@F-|`$)@q>d]+ҲǮu.=7ng8_?yYO^^_Ӥy7[Պt#}V_=HůoߩgGn&؂5lul4C:LsAO[Nj//D?Wza=r D+ЂXRMSg7( =IGMLnBHzOjǟ^B}i5jFik-O\)&ItФ߽]Y!|}pn['EC'hk_ʿwZnt>}_j'ez^w߽:Sm@ i䞓/1gM&Mr+xqn7V?lQq֒+ڦ Kܿ)Z~V.%֘iߙQn;qB_i kLIjwD>/Вc5vhˍƋpqku'n|jPy]ze/b0q``ؿMxP5&_ r4BGik\EキXǬV=NS.]-^Xm+|E窞? ;׍uȎH@JZ{ zoe,5ォuH5/LJt(@;tIvE&_@?v|rHyu~G ]TD pc붵_mowQNuц[IL'"j8VutaO躟|QrV^wN9pM?tјHRFUW?җLK[sEh л&L"Wq7~^?k„ k?R_͖Wl\CLJ_`_^&$Fk/\;PgLo iozt17>_U)MNrw@G\vccwjӮM@/73od„ 70  EbhXYW'ꨭ~MsϽ?eh\@wWߪ^_|NkJ~2}zBiG  G蛷ua _ ET-Aj2-*`P>|-[nL-[ÇpuuujnnhnnQ]] 9oh 4b=lr?~Mu0RMMMtӉ\SYMMMjhiSgh\QWfъ+LtWE>|ƏƆb 7yϩyj.ҨQ6~`ظFcc(RcCmm6]69R )n4.&"566L@F|9'Z4.@բq Ph\ET-jѸoDQdC@Յ~cذaZ| eb 6Ԇчjmz뮫sk6 Ȋ+Zol }~Qʕ+M(4lPzjhhi!5 q Ph\ET-jѸUZ4.@բq Ph\ET-jѸUE P%}PyPh\ET-jѸUZ4.@բq Ph\ET-j El6٠^ƅa0`ٵ]ŀ`km%`0h-m6jCuUm.4ѢbӨ:^g&n:Q"S urm\GbcYפm>!u7VӃC\ߦ;4G--qU__oӨ͙3[sh6Jk^iQ4CGhZtÐ8`Muh"m4-@}}&Nŋ+tYqQ>$`[Ҧ!u56 ?bҢ:F/s=[T\3H=}\k[.*Z(׍P5oSvڸRnv:Jֵk)~=YZ@5ɺZǗU55.+ Z@5˺ZWժqݛ(V]{l5I{\oqo>-.Vcn'`ЋXwMwPӜ&IҦ7Ք1S(,PFֲIq+k'E%̴AE6665,X0_S/TV駞-Jq׬Y/_J3gԴ+.ט1cU$.Бwo֭7(mZ_O]ڍO%uif}tߟ~kS];֕SK'uοۺEʻx]%O3h_jWW87^_:3{kuFk̘1gZS/TqeIլ8qzQ6i$ť\UE7X}(@p Ҭ}b_fӝ5sue?n&}~Kѯ_\t+_ԝߺF-ʹ-"gf}K.<)3|3ft|J3-OYtOYaB1_Uj}v㢜o0\6>8AyzjˮT]]-$~>fe:rMaFة:Xz߬2&=p%zjE:52W q׌:Snit멧TS[[N1SXKo|.}=>-s2{oxeXK_.=u&M:Tf=v:םGg!IjӤ-J;ꫮ_zŖ[nך^"?O3gGtv5C[ Ė_ӯ_7O^ZZXg_>s}>qz[iѳb1>]yZz_ӷ_^vr:xtOOV+M6ZKq)=RJmf"7n? @-֛bͫW;Sװ :wtʇrRJ*0J#Z-5hlJqGs!yE`5ݧW=R{=QWS$0y# Iu~HsߞfV,Mŏޣ'@QFz~zEǹΟ u ׉Ӷ9EC6֔);i_(k̮cel>MZ]ZOo)X8n`j3VWeM&pVZ|?ոh}oflZHRN`寁KkiԠݒ&҈.',m\oW+NTf}{Mo^\}UeKɦxGZ{]t(ԊQ3ϓ׎ʉU`mM8YwLpB5Ͼ]~G!Yr ZKRNc6||m 5R=)-Nɯ:-/Vcz]ku ׹lsF5?yG\.ҴӮկ~|3Vg}l6Oz3i\7=RѸh9v}t7;>P3娣u~S\Gwo^\u~)SxG]57HXps/]I;7=E]{sQNNJj0/ -";^wpt9aD~fm3z쏺`:/!IJBz־٬9Ǟϗu[g{zG)o4J]?(79#ѧN.9 Zg̸n5-$):=xٷM-tҤSָ.+H÷?KgGF3L\frwUW^sU 2D$6.b-|.=:fu5nܸm]u1zlZېӨkמӿ/Vtfj %4f#˛M3_kb&J ^ܕ /vM>tzf~bj]^jZϊbk$Rj+O\DHR~.4?Op `L>Z6zNO$#?֟~%~bԭWN&m=<5S҉N׏P.sQik%gNr EQN/4K?Oݶj+'ȯkN:;B9C3N֑~y{r]q5rݴc[()7n~{nZ!Wml$kӯE?{d<چj.Uŕs'mۘ֕,OYwcI7vx{;Tܸl;uxetC4uTzw uClǮ~p>˦6&]|f6ɣ>}dž8]ӧk3M6DS:ZLܴ@{L{WoλUZ$q>es 80w ?ލCN*ąhO!V׺Xܱ7WGHs=Bp Bc۹=$նpɴo?b1kwjֱysb?9)3}ոzB 7* @5Zb>)f|YʪYl;cfikYcSuݸFC56fN覆nzgjepոc۹YYj2+w㢘Ћ1;~vnLv/=ΥpbzqQ}Ͷ7ލm%w "5eq9vާqaI7Wj/cϬ.iVY[UKTȰVݵMCk/jl%-,5AlYXU^KA\#371R{&_ؗdGkWV[ }yʒV:n@eLlѳo׎iH]M#ŪV=|Ml,~FPSS6t뻵F7577I#G ,buH]䤽Ϟg罦V!vn>ou͉8VبF{M}V|8/ t̆F? .IDATc{N'^gRXF5il7;ᆪ'/zY}}F6WT`ul757{'TkY[4>]!u5nsno%(>Q>L.@jlQmF-W[Rhjlh.E>1B >c'Tgٜ[I^Sƅ{wb.Pl<#"~$Q$Ѷ'"jlԨFBEQF5rȈ+6N;vEw)IPJnqqs?q!ծMײY־vjqEVX;7=amzP]㺜ٜ?wc+ l\{~޼ݒ6g;NT(I]wLގC廭 no?R'*=Z6{ ȭ_5]/uvKKc|ET9{"Vtc7s\_ @okrV(mjT≋Hbn{d^jaCk\vMlbYIV6=i\&TID[(PԱ{bk`?8x(f[zҸ(9w7o6oTXX5=m.'/f>q{%J'L~.Wy cy{[ڧ-(mIZ:X"*ݸpoX V8ʹqטyI58W>WGzC@b'-E~TEa~̭e|64NGlC IPޏEݏy9xpcƮ\2>c7$浅8Ǎscei17群zHW[[[Khź]b~s4 M?W[lbIn_8=UEQ~ժUͅ=} };_|akj\ލ/W _ i7qqv,\ r.Ԫ-r|9״ptt 7wc?TV)>tPkJ:/zC ~cyM G>)gP<4N:*ٸ^D'ŝP4Wco~Ϲ67\w\:_Sjs~\nOWرIzjBC{cnlv`pMs態uyssnofb|R*ٸ({n!Ch5v>@pM ?渧"sݤETsusl3C1ˏ0ٵ>skE5[Sf~̝~Is\<4Oj\ /Mǹ!\̯ɫ /Ը?wfF:7Wm긖kBXTyc0wcoc?O@k@'[e Po,ع9wQ-.F~\ csq[1VRzqʶXuuq;vX[ۘx^M49ʩ scDmbDL:Ccυ$`IZDE[+&bRG3n~6 Ԅq7c 96Yd+n\$ߴ[l snr]}\ɫ_K^OSOdfߴp_랸pOsr{usގ`0uucג6]ΟFk$mTc?B6-kqc1s95Ћ9Vswqbu{\5$S7ȋ Ʊ:sȋ͌\a/oޣiC{; C1Fn |~ޮngq뺤LͅX]c~}չm3$tЦw켜ubB؏-[b8S란pP0؝MI s#Ý]]˝oT2q۸bПA'ֻ/  ~<],Ȱb/f.o6#j\K lf]4s.*z"_1p L:7*TOJq>alnKq;1V(YhqZ3Zngp״*Թ}wc!?!Fx\۱'P 3-ևvlIkK kB;wXOYI bkmgv}J_@7?@(p|! dkTs:53\ 1w w}cTul\)cLZ1ح'\(+0p?7\ wkZ0ns6$ų1[XŴ۹B7l?յ!) a qaA70ws_mؼέbyoBCͻ[ͻ m~3y(gR禅˻qnC'9;we[ +Vׅoܟ07,O?DԹy\3!Z7 w~9fyy#uCBP 31.ލZ٠BoB5nKO`soǶU\_4.be_DZok<8Xؽ.dp9ycwnp{?ot 5_1iDŽvoNR L7\ݹmï)lӔR[ٸy~܏ɋl soJ )70r$krą ;vmCv1I$Ye]0:nsR絣ݻ%Ŋ5\'6{P>$& +܍X-CD^殱/_b9u5qc*|Is,1i^,'BSalkf1󻸼qhbV()>U /Cq&دչi`ö ')k:Ws!pqWcnCc;ϪZJY u۱c[0p]{51:V؝')o:_(&%+Nͻ9XEhs@Pa{1bt'Xp}|RtRq{xZ64zS^\cBͅ2 sy;+\Y<{y9?¡OZJy۹U,M۹/CzXᦁׄ5#s~۽R[T%p/*ikX1T#41랾Paثqs񴽓 6s#fs6nnoYbE*]XZkؘmNsrVE)bu^d*צ&^>l6bvVSL)րIlP_gkBP]~N {;_yƅ/VEI]ohƃk> w>ąn ?o7:mB$|(] Jϻ݇bqJ,4wkP<-j\XTo/->H͉kO_7_b6 ڱS,/%CJdyijx&M܏56bIO^q7OcuZ&')v=6BuĊ;iXIqۡ{6ȷf@RssގCIꉋ4n,1^oc'4]Y?nkl?֏B1) s?fss.F_7.bu^uZLx:syQkmL}r>{LUJ-%KVlc7ټ'ŒN(: B^Skgns;cYic{->Krtv4qk.mIO4۱۽'T<_T_?q! wo(~^˻yh\ }:Cލs1;Œr0rRbܯ պټbq?fvn'LiKIɋТޟJټŒrرbsXb m/66B{b؟c8$-+IiK9}(f>Tm>Tc\CuB9[gŔZMf[Zs.칻qq?o[V+IWj}ލm<-os6n6۱/Ŝ\}; cBPL /ޱ'm>Tv_,c;zϬ ,+&4q"o1z|:U@(؞'c.މݻi{'O')WM&B͓r{?B5R8ok Hq)='u ti려\R\5?Oڇbv6ޝkBnwd9gwj6l;~\5ގRXz8BhvrՄyHj279H]B }[#uͅ6IB\RʱN:GOq8{'61;w1;{_(glI*+imNq}6:6i&kmֺTz\ֆ꒚Z)&iKI$N| ը' b&NR iKIjBXH:ڒTz1[K֧mΗT4xbJw $YDz/u$5VZ]y1ԗR[ZfN:֗:5*rPIFb\ ǜ\bgZ,z֗:\PM(+O`bq|(fٚR>+u^LK֛RUz+65΋ZMEw:֗:5R8ۋRWj>\ ,[cR8&%ǻ 6f!s)+cJ.K ųz*ˇZJWl BP]֘OS1H_-KnNqC$ii9_:@ed]եPm(&/Jﱾx;8Iǖ+;F)RjcϢ;vƅԽ}wKK9@SzrIq)=Ew1eQ K;GZNy0[$˪qeQ-랼+vby)[SJ-R[X>'ǖE-{zzr\Yj{ժۥ\'kmֺ,zr[VպɱiJ=oIu@X饞zrޞ[ռ(kY=9zɱY=="\\ɪWLj[h)uOrr5sQ_TTT[0WVD :o{_w@H > zo޺`p&Bo]"bO_]PiW-V Pjl Tkl00 &E y &EGJԍbXD]ohF(FNIENDB`kraft-1.2.2/manual/images/nl/documentype.png000066400000000000000000003070211467704360200210340ustar00rootroot00000000000000PNG  IHDR.( pHYs+ IDATx^w|l wE@EbkCx++VP*by*jHo! y='g$d~gs nrDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDT) 5@ǛvUN+ǐa8Lj* ^pRc@DDDDDD.lnQt3jD>_[(>'"""""" \(B9UXmHW멮QhbBu7jÄ^CU퇈NUU\T:]'""""""ҩ"Ceo?joem"*PY 4as v)?X)X۩T5aK=""""" wU?`/X۩*.UL+*_)Bu\Uu t vH/X@h*݊[)BmR\SuUn< ܊|sGEUu*T&yYWk;r@r2'WqUd;Y7(Ba\Pd޶m 8.&6nEuO˳#ݘ]>V&uo۳Q˳NPT$<.:ݺ{:Q2I$W['XqgSa5It vx6&7*toyT\] _G}@S9jxy{{DDDDDD]'v՘1cNV@|5櫯|󈈈?N@:j>ySRU@S@2u,о.GSjN}TjN}:hߗXUMrݏyh_&yd158UIW>&cj1:h+ʞ,@r.Ϯ-S} 4(:DDDDDDIy&Ӂ vm<_}_$7 = d \>Ǯ-˱k؍_Td]"""""PTɲu]!-˱krty@`ɬ7(X[WnܡԸ`'"""""e7W751zv㢭[(׭k\Rd]<]1AmD\[p=D[^mn\U:!""""""&ɱ+y~\^z[ۺ*];/ 9gejRn)M:>q6u1@_ djTSۺ XeL|fyt5𞧎}Ru1Au}g"""""Qy&:v5t1.E[j['O v_*c6&jPvL]/S۲`mU`LQ-f,%O_ЫK5+.qH[G7-/]ܮmX@5@ ?!6PZP{ۮW@u;v1;ƽf&]rZTK9Om]L(cvm//5n7n>kk;&ɼܗj[cr\B}9PrLއn)'""""""I]_eҮAB}ʑjnL^ ][m =SeHy'v멓zH ?D ._-` uUc?'> $:2τ\QWԇ"&r3'K]yn;vqn2.ӵ/Zh!C=`E1ݸWUt5Yt\ո C(X@Ssuu1-cjLm؍VW\Z PԸZtPc,ty"Wqu".q:*8nk.~y ^ !AE]L\1!0/棢8]Lcsː{Qێ.&61Wו!pՂp=$I9b\PW7&'Sյ_}\'\"""""d.W-,\Kz>PZЭ+j c896DLUsոԸMotX@ &ZP e pV\pD5{I+Yy,+OxjɓGDy(:J\K:w 9.㭸 ʭaj.b<&Rq+- ⱄWF+uEun$a?29F_mUBP/4y\.B9C*C, U}͈^Bb s>Ϗ@ b~+vWc9ѯRQPJ7+˅1&rW" @ U}瀈,VB9\? "X 1An\*R_|yy)K -rL'X9<>CJ?zG\ុY0z(T/D\1 @[B:.q9O.b  pQ?1z#&d p Ftt"""t^+Qev퉎 )1p"#[򕫱asZ?ېnrBܠኋ11Vw"Ŷ15_kRTuB ..1-*N-E[03*,(@FvI`fipG`kP/v""""""ڧIF{خ:&)$1.plہKCl9PQ1}LDwB\m<֍1>^)]_?tY|9v}q2oQΘZ,CRTXv"V4<ۄ,gGġu;n+mQӱ]Loԡ2:kg)Lǖm;a</ĸPQe/b*e㺘7{…7r\{؍Q]6FYl0- p3JXc=u+sU\G^.\XiQ1x8s8|֠~{Õ~cЅ罹 A}wDvjҸ&v4JN+VYs"Z)22N'22Opa@&1lsNO<35Vϣd&wbǮ(,*BL[!2"mZBtT&L~Eʗ%(-*4&py(M A!.1jAm5&xmrC|Bۿ W vCLQ[lM ZuVWG^kF w5] "3 eCؘ:I l&aİxpSs$>z SSYxOR85T㍼Rڢ}3~G\X#uf<|HnoMx0\gX_n{[o`޵3Nsޙ5\`Yʿux⹗PTcoM[ЭK'߻3 XcnAPN8xx'2ЄMqMk_}pt W?Q-s5 A]Vx "#gu^~\u߉ǟ x^kcҫ-];{/)d:ogZ\V&EҘsMdJUՅ |DqAז15W}x gp}H`B#^+_,i;#ېq uEJ3;ҐSw+:\έcb}//a"" !ÁǏLg~՟oڍBԩWg}-Sa?ۊ(*.GI8o6w[= ؗˆaCĔmNt +Wũ\s ݇Xԫ[G;ؽkF GmpFqq1}pr8>d{_-ZŌ?ĻAB|<>R7nƊU.:}9~y{dxh|[xC˖;qՈaxxfx'0o7c%#.6ߙ)mЬI 7rs/#;'GM˖m17107Dbob˶c#mOJPCJϼ8 <mpnC@劫s`<&bq W_+[u.tāv(\1&ڎ2E- 0M Gɵr1 h5y;Dz!EhM ,rfc4C+#Ħlfen܂_~h,Z/ 6lIi%X)߷k^ddfa8z<g٢\V^wm،SrҨҶcq%1oqx:]\Կ/ޚ99 >ܗ+_};~8M[Y0 hۦ5l0Mc?lٺ.\R51Jד^Lvqxчg_b/WΥn܂_{s^|ЭsGL3Vv۱oEY`6=wǎh䏏64}ub<$paw |tq'br!Xyjy5:,Ddr>i@Qv1Ș+a@l,j`N; o4eMQq1_>+-j Xz>%^~ <-Zr! AGTT]Xg{藺-'2by}Wmn*7~~Ɖ Eיzʞuvu9-nlںY8pNdfbkoI#mNص5 (8Em0ǟf+ȹsi9Rg[L< sr0x|zux`~i+F>ӞÆ\o+,,8o0Z{ 'CaQ\|N[Ζjh 7`3/h (,*3S_1ԍWQXTkڔLB(Tn)lJj/1?v"}n)`*;c_.*8P".uyL(V@X˘,3 )Zlor˵OmZ¶;QPX={홭`YNfDbBu$,’ѣp=v1HJL_{Cl^~mz3`20exegqIsbjNH;3ϝcFp8bDD5тIݰ lWh_6oݦlO 8߼u@!߰s{|oWp]]}J  9y D_<y\RS5Olm9Oz,0lѠIXX- ufE ";os/挋IE;Mظ9 ׭̓Oa۝Wj:|tP(님pGEf(.*0Y~['O}O`¤x|\?xɈ'᯿{lWݯt`㖴x4a&?W_G^gcۯW`{zQnx2n،iЩQ0!t} 7m|'1WQ?[(rےrLŘW9B~ʳ[[RB.:}%rz\aRZ IDAT%dGtODDDDDTt]:u'~ iys&>>KhG,\KjҔ#TsDgUXDĺch9kiۊ=;ҧSfDDDDDDssOߢqK?gܱ:aӖxmƻWZH 8 9…Z-bXBٱWXe.TUS\}+,+t _ƛĶ4$s-""""""8I=];{K_? ~lou6Gn1 Pjs_ +.5 EBޱ.kۭW骲p#J[n1AtWi z3ҏa?=b(..B7E8DqK"""""" ea X~:T]Po}qAΓcv ]JTvB_<ۆz|2ucPaj"""""""y"(-J}іq_yVf^m\>:b\P+Tr6?ZÎݸ㕢 :^|0{yVuP8DDDDDDD:℈C:ǫUE&FXPO\cDDDDDDD*Wܷtq]L>U='y-#aDX奠!oRTvv/P=RfwRtcr[%"""""" %jScRe2UUP_][K5{[ """""" 9˫^5WPcFU **F=Xt.wZ\{5DK:5sᛝp{o8;pQ|y.;;0f@ #QfUyqU-)\i7&8jp-@հz䛅?aixfDKD)`L:ο i0{g]kqǀFj a漂":!&.;ݘ.F~ѽ; i.9y & S8i~ocXCʼn25D?꤯`?qWM+>V#UgᢼuDnpD'%#9C )[91ƛW;kV>|{ 8 UܬL!*>1*:̬< * QʍB\B[74(8\ցF+Ʊ9(`D!~c0& s2U8l8e^\"lJ2' IH@T[_+Vo? 0fa=([;:ķ8=1 wx@Ώ0UDt/uga?v<eQ>ڞnw++{;2_,NX4|1oSۏZ?Z]0-FD wa h(_G)t>`|B|7Xb3䚰` <1:knCۊ+a ٘\,ݞ Q(Z?1ýG.] ǜ?#>q!~;Fxf 1#}Řo[ucK 06 iAqTrG2<c3)#}pa6stP>̿'W?`ƽ(0QM۠kq%C1gs_DDDD.歾r GՀ *Ñc" rj d]zfV= JE^jhگ47|(<R-/o|}:E:;wTS4hqq 6E$<8k]'9[9Jq#'ueBV7 &Ķ 7צ!Ǟe{1R_p2"ФLcz4Fg1wK.,@\+1ahmmXƓxi~[=Qפ8~|9Clu2#98 Mp7xWd,+[漅#^CN c_>g ,^,X0/1hcZ"یOމ ['"0Îucɢ8zHtS @rk P-mQƭw!:m8P3Y`b$\0>h$6^[E:׷ϱ"׵?բ5;7\g6kfma7aw7ƈEr0q <1ʼn~vKԏB\J\5i,ĸU]worY|,}KxڞhؿGbUXqUFt3t!:5MDLT,;\O܆ +Jo<6lZ*Vz,\z} @Z,-}=0bg‹x8391Ihk4{vB-Z&8 Zo? W9 v.ԯI k^QCZRSY~vv6n|^yqZ2!G,<xPi':0ȷ3k\"Pe֊~8'*MB"t@{ ,=ab&rN@L[\U#ɫɝ%ށ&`c(հM>3p$wAUBVIςBC}7yv.tqEʡr9 C.*[r4f`ΫGJbC32[ >%2=֯סRi[d6o=n-q Ld,|wX7ΛGqߌBDDDo<"ccwP#o+X%/ iDnn^بzu d9 i _ڡ0Щ ;c{ 3wgY>ݺVp4oռD6,7EF RLuC*\WoWK35L䦟@țAv UuJ%f8Z`e]nZ@X&m knC%h-qFn.wn`C&;zocG~ XU0ݕhll/`]4z!]1#'u>[N+&'jQHMFN/8t =y4 th@TbB+#! w: Y'˓9G"$V[z> ԩWGEfVa",2GL,l%J82hw,كŋ8k,y U3FT򵯂 :S&`f!dGΣX]xu 8+!ԅx0jxȬTqjuāQ*&''ipl/-\4jV¤,o?NV}oJJE 8z=gauxQ?(v~y`EX_^ߑCE*.ǷJ,K0`#Gdtc{G+ }[ @FP_0OYI"""JT5"@ŋyݻc#e 8pVO PȱX9v yҏqp !1 ŔN ϰΧV(G pL?=k.Dҏ_  w ?W,8<דXY21qqHq3kl35 <0V|>ÂkZU= ୋz>ϝjl[Q֧ysI0;d|{u7↳]3S#; fR|8\[`q~ Vϝ?2t9 $$^V^/~5isy硅\ƼW?<$I!m^=eơ,dK"< '|3Id7\6 cЂ+;9 b{@f|V(­㳕yg{{4#S<x5Eq@< |]r /Gtuk&_<\^ɭ't!6zSqd[*; 'a}1Krq#=3`qcwEbع fɭvFqyuYS>XJ|Gd뇡Wݛnx? E`!˻qdZ|{v]%ڍs+r`D󶭸:Q(@؝VoWΈFJJ<8@Ɏxg&ؚz-F\ΑѴQpiHىp=d@8:\z)4w!-gOĄpnhg"}̚>ieĠyaM^?\Um݇ )pB῰5u9~q9v$܈?jV̸9 @ǖ)Hv c?Wf- z7=&>6fJuBy==ߩqq/>͕]TOt%V=0 -XEGrsX93@T[Jozup-o=~5qOőAw7,Iy>s=# vwlS Ӌ گtwGM2WW\Ñ}aCѹ^+9߹%`fo?pvw/ b(.䥲 IDAT5%m/6~cXX: 4(E3q(R-e1el5~qN,7ye1bPZ{#Q0w%N:0qh7nLpn)+}xZtsh]p48v-YH苉m7@eZ~j@@šijoL¥-쏍қwET1?Y7<ѭlDhK1dGL"x0v3N=4@X:?{ge }={""" jgEElR#4k>]r!nkF{s/ϿVcc.p^Rc . .j8ad!<,\K|ݺGQ^ Z91t/nhAguyj_8UH9^|9F_ JE>+}\ui{p83FѬu'uޅ2:7~H%]g㓅#udu߰:]0]:gov?ƷY(A^ $ s_?Z DtK?CdP2~~\O6gߥ+H4f ¢`CH?UC|&hձz-qsvwXloߋPhnl}4ig_0#G\>+DDDDdTuyv1r_}׉CK}pyѳ臻r[~̬)jhb3>k^RLElݼI~MwQ$''aG<SCn}DSM\wL.`EI_Q 5W\bჃ/wYUD"""? @:bף@җbܔΛ9s,_"-WLܰMm[6Ac1j|v! C/ldDDDD#"<>@B+pa?""""Mx "" Iy{aCv5C0g3y% #X-j=.(㿸u(R04~/n JDDDD?*BDD5=3DDDD ^qADD!@ݔv|v@fgu~h/!""":mpADD!@ҀxDuOQoGE(dpADDDDDDD! """"""" Y,\QbႈBU3v[^  *HUDDDDDDDAďQ!cMjX hjo₈B*hb5TaQCDDDDDDT˰pAU !"""""""Q""""""" Y*m܊a]Uݻ;a""""""""DDDDDDDX """""",.(dpADDDDDDD! """"""" Y,\QbႈB DDDDDDDQ*ǖ4:DDDU0еKW{;v\u(EECvpO"%- h1 !""hd5\n[nÆpVꐇ;vQFh؀DT;v[oG!&,!QQbcтڴoY8ˢX 6@Sj DDDDDDDX """""",.(dpADDDDDDD! " :b<:+ :T.Np/z[ꘓyC<3_ E>>DTӘ-i[ÒaRlI ;.(qM/bk:FDDvnێ;wعs'nۮQMQo\7.77|QE E.VG* DT_E؟lu6 5BDDwQToM%zo#=@HME(t*tAHHD)^Iy?$lT_OyŞ2g'3yhţG̳K8]sCo Zɝt堡t,oi^"cx©}vBtBD]Z( U SX.J]Y; cA<~MGyCMS9,<p/(Kt<:< ~Dy3X} B"I0RvM5>E_P}'+Iʒpx8Bibe*<=4 xP5捔FNe>8r">|РDc D{_ hev[xo8} k<:džhNMhʛӵIKi}6g $.Ŀ-!!<<1MdDcO~< ̣tmܡ(KVs9 -zAUȊ 3e,[ ۿEٻU}}$xcJ̙,\N L>b)M6˘q!a>m'0SC4:tw%?[1)ȭ5օO׽C1`~]9d6H@%v7GikI,\BwѸ7c#zS&pxFml>ѩ4%ly~u3D4H΃L٥y~e.'D)jlBtWs.hv.]ONmB(#&lC63?M.^CO({u>%ֲ3Gyfϰl5Jƞto.c&>.ė`J^YݪA>,ΎF0S?+)m2r! r2 k9ŷSNnI:]W Z_{\զݞC N@\^@7aZTp…qL>B)Ђ a[}W y7ޠbQ'h)^a@wֵ'RϮ63m[ F؂BNXY%qm4*nFcO6m)r(>5`+вoclX{.`_JءA|#9=%YӋ&QPؘOҕg'B!^qXU$kgmHϙz*st՘O`Ndc vNi?v'b"Q-*ePIAcSNjrwu5~rC0xiwOӫiATbrH1j^m<,Ac[7vn 9yE3],,*FAGfnTpP(u-ߚ5\=qDr0<n;mOKURy 487Iwj~t~ƒ'9=Ұ+C|xYUC8(`]>uGI,Hsz4 7|.m(nAcWs~?VҹT>Ş]R1N+j"%*]Wzv8NT9ȯ "]PY*/|K=n|dvyQl+ZSnS;H+i?e{q`D_DzVpDjp" ؕqFh+4_V` { 늃Bdp*/r8ۧ,Z3a {4+lzo :("#`O!Τa)8lKn˙V"҆{.?MD 9k{(( ߏHbTjf(@!^&TeiiPC85-g$ vyn;ِm]Ɨp2 ~[I^><;Yф‫ %,>lj$/+JKZ4sIl8{1Ls\C_> SBMڪD) 8z;GP4DE%dW|E@Οl;hr`E#9EN3cI4|+ĩclgîkbC='OwX>bWNfS۳<4^g]9Vx[o虰A۬>Xp 3o5RZ"͜<{oÁltʦ#9cl`: ˆ2ju}\.:^`o'8{޵͗ߜ#Ѻ*"zIX渧;(+x7mKk;9jlAвޥ ݡ)(1ψ.ң 3fpw (Μ#Q˹iuw\g_ yuP.Y>*F|VTqʹmiO zo<(Gqy)=A/6/ljShe 5bQOd~~ GɥZ)#h+r1(] M \+.xxxDZ=^ȸuwm4ȦuW0![78U)ތv宱۳%'WnI64pۜJ?5>ā֛B^!\I>EFNoGgBr+DE/ #k t/ew/Fulݮ 1;z8:oZܿg!K2&GzVl_ɊYW>nUq:@Pz5Slgp@)&/N>G** €%éJ:H*ԬJq;껧$_,IVV`u_ _%?ZDJC:JZ2}zgS~ϟxZh3;wA`t ;MSiwN^A4s|hF5.=}"ioy{[BqJҭk--XT˻~(Jsr:Hy?ISiihzŎ^ɉvSsRr֤t68Q㗌h_p˚fXQmT Ռ}˘(GhjL6ƾ-l1Ao5Yͮyl)t5a^E&t܄nfUFI>FUfj2r[Mo~{FYm!xX0pWhdx?Wp*R-`H[qъ0v\fmɃ=Eo"K'_Ʊ*UOKޛ6)ci9NTyrRӦ7s}Z!{q-o,##ZM@g[c1λ]?{>^W<](ӠU~MƚkY}hwf`,՜%1w*f,g$&̥oxz8^-J4/;0˞,~+cb3!: \jT6e݆VfBc`󚀁?lA;-ڤ*.HѢnYCD8QO7>gMrlBd+?j8! !y8ST6\Ljhm_TT]B#91Ǎ 1صK/a2#U'ⵤ+<)M(PnmUiӼIBn3yE%o?.K)֏OSfV<iY ú{ |/-ÄmL\Ӂ*n50c_+~Y߿nj21؝P՜J-l[2-,cJm+gLj u9ʗ40IbQ&_-eIKyڊCq$COoO;%B-3ɿI6d,mM | IeW^|ǟ&# IDATf^`ᆻ]c\}`ْf7~0ð K7(26B!ّ[Z9xߟFO"~8ppSH)67 wLłj O컐m/[դ!{WxTyrr;ozWcP.gk)c DEb]]`f&?l:1Nmyt,+떟YqoO# ڒMiQ"qcC.u !zxŅ;Т2qhw2~/Iydmvq~;QɽWkJc|0wg#̘;ƥL6B!ٓ+DՇqiuz՚4zgWˏb73iK4ķbܑ{1`c귭n4ێgvXVnD-v /MV);6;oӮ[Oz|"y=Kxg8MͣKt{k${ Ke%>=RgGҢn=ZHDˮT766rm1ޚ=ӯ. {, `Q&SytoUuf$bAw9n%=tgA,˛24$[T/`ZO?jԬCN#Xy1,g(jgpnLjC&YG!B!9QM/ծ{ 5W1I[/ƴEܘv A'y <= Ig̹(,v4Jxw(=Oet2V%jg !D),{MkmY?Aͳӹt2kgB ֽ,.NP@IfirIZ֑j76}ԡR*Tm[_$B!B$p!bϰߑNGz:Ƽ%Y칝.!f~HF\.+͓ӦUAP=[P^u’t0]/fl^ʠM]~ƱsP96s pjz7kØAal uݲS\{sg0K.41>b4|+ĩclgîkED56n8{+D Y5|4n.<gnjؑeCt:_>Khx.C\ᅑ2>cGY k4Uyo,) <0v="t\3lF]ڂ4nR'.`܆ۙIC9#>Ĩ1x鳁lS+71~l5I\XƯ#6 z|+Juo ON551kEɖN \S wnXZ quYp5Wqq,|4b]';큇.XBB(yhG;'~"zn~cO5f)TwѢ-=zH)Р1 NSҤ^tq5y+OcUpN^ih]; |jVnL"ܦ@17=hPRhptvD &9,P!ȒN/󿜨[jRl̋D" !D⿍Eڱ7S/Γ[Ҹ2l*:{z=ŢDQjeꌥll1IxrkOoV2w_ FY GMȂdSZKx+{Xʴok'Kwe>=ˇOitc[ұ-?MOK'4rѐEȄfLl9Nbopx,}֜)oW@ CsQߘ D 4@~6Cr3YBl\W ,M {7ܡ|ٲ88|Yy.DJdd$II---qrrB٭lg|:~ir@K)j{3qW*␙L&sߐ̦HL[jrY#.4ge\z|Z0z Y8x@N|Čwt%#y\17I)y>L^Fi2楓g!QlWF^j[dB!呡"o+P66wⰲB5f0d9H'̅B!^'rcAdFO"0nފ?bŊg gQ !!=no""O  EB!*sD}#ϓUU1  l^ct:ϟ?7/B!BPk,2h4Ԟͩ2"B!^-*r(2&{E' +Afk׮.cё"EdX^pa&ˇJZ4Z-\? Yv7} lckkcNuroW.D ef5^TbE OOO|||2\txxxad ^!v !ՓٛTfŀ } 'm25cv[jh4*EUETgJ~-*fiW|J5&$ɎR>b6tΈ0`z^9yCЪK,7k7|?{N&]L|ae}CY-D>^p$rvl@6_"vKƓXJzD6BI: pO*$-7kdMmMJT=No.x.笱o25CjO pDJ̋z*K.ey//2+D^" kƠDVu^3<|05mcc:߅N˰}B!xu)~u?ݥeЪ8pKlu|WF3`NV&9o=Q5DŨZ7Ɏv<[]_1}&L]=87{.=Hŝqe}O6G@|S]2/Sl` $qy\}4ͣ`MH1ՈӋ7wrt6/}b 0[=M{nN׺k:Ѽ]@)@+ʸ<6 ITIYQn9q_cD0#,0x ͟a^^\z5]e],`EoP$"+HJ>lիA "Lb73zjHF<==qtt̴~F剉$&&RlYR5 IHPE!/zo;k6 !x%0ãɜxz <uxT7q5}O,V`"+.: 4 !3zr "4"`AJ!)CݸGIersMN6i籖n8i 0oSP'j)AGEMTU"pv(}}LۢԔSJUsg'X"Æ e 60lP*V '2 \\1Vd<+K7/OLLʰwE'Jm5o#7)_-S޿ߤ›S&t͒xTNٳp\wVqqVW%&ִd>1FF5\DFD=ACSne!.5]Si¬>%28:;a `a&V48:cU3t=MΆqL9Yc:R(%"R3{DYsRJ 6ɓ0~8*Uur-r4xagY_ȥb^]jEv}@ !ʚo6E9 nWuSUjk*ݍŀײ;-[7 gKƵ;%:BmfJx@M.ߊ~/qJf-yUˎ0}e O0o"V2;O}K" `mV|[S,Oq!rʹG{c:;((2EQL#hGu{Tt>ӟPyOVwd̿ޏ~>B>,+X#Rrh;,fȎ, aYcg1 c/c]fk #EtVe ʊƽ%C\dҘtvũ(%=mqޚ5I38"u +c,xe|QDž3ۼyEyMBtg%@hɸY %<ʴfR!xkAnp|:4rM:yk+NΔߔJˍmRUTUwt:1m¾86+tPEw3ogT/L:ƴ d^hMUL&iK!1m2}o,7#"gC lfڈ䯿D%1S>^P]6E5 إEcEg0v37&/]_f*@#izb)]=9: /b- p$&\gI,?E [pAC '`uBUJ6I:Q6eȶ *v'wz|5^Z@YL_p=yh7&h>x9r [?%'+BTvǂgжMkTGF\|ڵjgoq`uǂ6?BpI||*޹{Y\F.Ҧ>%#9gLMjJ{5iڼ(yo2EQTӼj@ٲejܸqü 646ׄ_[_S5ndv-l&r_;淊>3w[w‡)^]6IW[d2!8;F$?,1OL n.e|kKv Fw~/B!?;SDZώۥhW1mBo!y.D$0PBFɰ쟔]lڄQ QlҹfK~mz8\j4zl:OIo^4|5mI^Wv Ѹ~Ts%ֵpkxb-+Myrz#s3 $_t/m7̔=WTjg!g=î+gIk 3E3f!;Ts"WL׫>OR "Z͛_У'G!$]Yv+w䗍9RnQm8;?K@EEWuuBCDͦPcKt{Vv t^oӦhprq["mSv6>lE1Ӣާ8i2,P]|e*ܚ岙Lǟ1,R)+(>ov;5^(CY<|ښyIXyU h@8j*{'4H+C!&g"3o}Q``0`0R4g/eM"Q׈Rw7]|@)6Ͻ~}?5qB[k̈ǫ/bkYЅ4jƱbtFKl)n kڍ1/@qoĨe^ B!H% +e˖5ʱͪ<"Jԝܳ-CBhu\X=gOĥHeuB!>>\~;wט#J:ev'ɩ5iƠ){{{4MeqpHfT_d@,_ipo< eB9;;Sr%bbb̋k:BMa~qpp ))<[[[wsssK}B!"ospp T!$p!r-y^F;̕+WtO~!p[mB!BwIB|c^zYquuhѢ?6 !B!$p!rU RB!Bm^ !B!9 \\3*bd0^BB!Bs$p!r%3gΘgeL2ܾ}֭۬۷ M+S O1m_N)B!& k9 a|tUfz{{ Td%B!"oUU1 sS\]]&)) ]O >/'!B!y.De0"d4\VCCԩӧO3 X)SWWtyB!BIByiРvکuQ]UU)UJ2/JigeȜ( e˖}g155SSwEPmmyNn9HxƟ?Q.|p'3o}}8fkĥ5kS4l[Ԧ h%?!pF;9Pчcs'!|@~Jx4cSsW7 7\4>ԭoS>:dj )ۮQD*50u:M֡>sXӶOꇔUbrAT§ |XwGM5߷˗|򽓞ݒ[7󢹳m/h)-_mmގVa҉UFEm7XL#.N!ODÉp""פ 6ξ~K h >J^͐WSgsz,[A |.K{bˉsNGӭ3fфGj ĥh;zVX[~{ɮQD*PpTcmm@P jߓ˗XXe{*`l@\ z=DZ ~35V3N>TϬT4dae>7zNDw_yR k cw[Ɩ}NeuZ K8<G5_1&9'A;ԖXZl6etK]T B!koŗ cƒrDSZ,LBӖ" hԖ,t@zx4\ZdUǯ) rU 1r'<DŽ~VBIOY;ɧ2®7dRߏZ[=T['-$gSx 4T`QSbPr.MrgY<7' 2!5nvG2Ʈ'[j$ɽ[%=՗$h#[*/~j2)(#=+E)KqEȣ؜ ._Ni_g^]/9l^H뿝i]/z"6;}]Od~=}*uTrP"t3^xAHHe˖$/yhh(FFFu^^^TXQ'Ghh(Fɾu2`ۿנn^Utx2ɿC~pZ y_Si1 [U §C7oq޽,ie˖R Y2 >zڵj&gq!$& gΞ`]Ţ0 HY:}{ZٷͣdZdZWiwt_+9,2nK۴,_vEuU9) T+f:5srƦ6R f?fKy75uDBrxEHAO\Z&))ݱDT9:(H~ČǢ 'Q;Q){uPZtAȑ$ITX=,AI4ͅ#P *˗/3tH=-| kaqAAAO\ښefcce}^ccc .,   1"p!|I^   D_zAAAA>Y"p!   'K.AAAAd    ,AAA%    |DBAAAO\    A۔sR/1׍On%rtL#ZλʿxtA^aW-t*YwKÌpϔBpf/+e!VF"p!g S}5sIOs{=6g,Ci{A{fͻu̍_-vh? Q1!U[O)q១.w4'D9² ѭ~mjzwv!>m+.ǻFUִ2(\ՉoV?z{ۤk۶5-~ǜ3Ѥ=!' *Bw-Aj~-'n}/*\Ԩ OlRPtS7{Kr ݪ`9ac~Uq.yAҨQхZFs?+M5/rYάyc~=~nwTPSU{;Uw |[K62c~[wT@p3sեod -\q58v@UV,yF^WG_A8-/ۖږ䖃g4Fcѻ?!#r @)޴yߏd+썫O6>K$x 7axkkգXHڡ]h]{\w4-2 y\v-ݜ׷47M1>?t3vai` Ϝ~W@M¹ySP{ ;3 R@~sS'3I.:N ?̏#Qx&N:Ħ!ؿ0qhfeˑ=PJ[/8z>9q"9O9p>!I!k @l9r#QV bʑX؃̚rsq7N[iŬXhoZ- YwtPf@![ Lb+sv&׽ʝV \É*?=w r o)_-ӳ(܃Y{sdlZ>ɴ̵%CtcWB!99,ׇMzra8`&.zsh;gka.ջ*Ej7g;8pVw6bϯk)@&ѥ mf_6ƺCdM:-d@`K ~%ڊjSE'dCP)rwPVPT*Ϊg*F5Fd@FQIvYi۴à\~`T9Gu"F[cxۖ{/? IVïy3ZƱ}/҈ݚQGS}u!O A4͝l{FHhm;oH*Sؘ`HTsBF PPbl[w+fV[᪰)]Kl9zhL)R q 0~T1@2ZGm QcEhtTb}ΑM{ yeY*5N/* -hXݐW6ߑo -RSQ7Zm?TJc"~!ܿTx8o*_<,O$$з^HFz}4Lus QZM#VRqo:Jc :RMٓז0=7~awZ:*;tP 6A2c- ԢYJI`Xүy"1L\bRaT_7s;͒DTGR2*49"T|Q CoPei9z"YU|k/y|:Fvv '7lnǴusWV_@KK*D\kW8+VEZln{Wf~9pZ@)4ǻI >\Md'unz-|?q)ۈ2Ѳ-OU|)I.˺B w$qa.n>Tm\v$ uy=AK4S /IV,\JjI)숢DG)i즄%RTkfX{B!<Ƞj`2@~XE-#LJx~nSƓȀرt cBކCóDvA&"d# D$IEx ͗5R IDAT 9TlؼmJVX s%K2 Pe寗/C&%em6SUXhkMa1 'ҳhRM,Tg*dY֭>&"hlml \H[ZdWIjoM@$e?0[amkr.X'$>"hRz@"NྦJDEtkݼWg&Q9."`!L]?Tpml=3q;ŌS%_T1=oPUuOK"xIV L;XL(V #o܌j+|+.ܘe_AGK/=XG {;R@Tï:/F5+R֢!spcwD\7zN;}&,j\Z}Y?0tX>ʯ:MT%]z2V7-*C\3!;DEP0-M#$@& 5:s4 S"_4aRbMjK,-mi6nj>@I_GzOMQ[Xca̷;'N6IONU[N0"(F0Tȟ Wg)'Mj+FFl}TXa])]:$uQSl G3!K'#ymE%T juZ/T;~c+'|PR0Z&X+%83iZR |Wd`QviڵsxY]B[-,A(/є5 SPH5%xA#qE5ݱs{bA, sN Jv"_+T[P'0mmiN[Xv2T D;|E&eNAAy*!9AN"g6b4\\.F]֛fβxn0Od@Ckz IOv% Ȗ L  mni@QJ⋪E1VA?8vPY1u=g&Zc%,yBb@͕m4y}|A>{Uq8f Hu IOL Z((< wK`q[q9J{Фy-<{qۯzy($<Ͳ=vK,QDjc?{2Ƿ(/gξ{ʀH؝[KS2 Od^uRڀB>[8 WԣPƅTʗeBX>0GSjet&hNۘ& `2N _S[B-'u"p!E:Ohk{"ũT ^7-Ҩ)ď Dn#ihߋav4zˠ.X_za6pu9kKN4mӞv}V%J3y\o]C7xv]\YÀNԵwaܲw|^fqWO0x)EM@]XDw;ju?OgW9zٔFuԕ=hnW,ѻ ӲWt&U3濔MªяLo_ }X˷1L{2&jJN]<||A>w&L|{l4mLR鵔{dTMCGgۏ`EHd.ՕZ5E_yWrwP㔉xD.GchG_䶀wJikHOMDE|vSW W m.]P`5eľHT};=z|;#I&O(}RQAxf枭K6Pz|?|?fP3夫Xƽa+&tmɊhY:nX9PoH Hqi]$4i͝X!',w唖uu%#ki]/z"K׭^GO%%rJ794:HZW 5UͲfL(wf\~3s~k{99y4r5 bkFy&26 ]r^ Q79pmv+z "xUQ~Ϊ-8:~f[wtй>zڵj&gq!$& hW.jO!qQ%|F7d+?g`\&l]K:R< ?fn_اry+~C6:s/̇@v):_oOvyLL6-.2nK۴,D5g2W.si,Iɐ) 풶?-c˧vg?K-M~V+_21WtYڷ_Zϡ -T(FK"xjB5Lc0(XC~ͻkyC& R- dḙlyIbU9M}07:_q Z]l|/14̓9$ɶ~@iJɣԦU ,מMIMɆ/I5.H~%UbMT]__c߱ )/QTq4M(>n&EQah[?Oc'O/ §#x"`CzO+T+{d-C*2Qr.t3ɴL TӉ[B1م jN"p!hi{rGR C@Oc<|)>Exsb2CGShX&rmOZ˶T6KNlyt?zhv0T–#X0SJlg!ɵ{qXCUL93νeY'M&%1yC3?] ¿OE8T7]{ bO ˢ?袛H6~ MotӅN\%5V&B )B/Қ^^1TkKc}nFɚj_RHuA*J¦tqR/]1H2XgHQJTѐ/T8],kugGLX@vܨF"^uQ ¥Gn4x繙\AAA z\8fG&1&d6mJLX8I7e6Bjqq(:R_d5NF~Ž(DfX{B!<Ƞj`HX[^/!@ 'ʴ o;X[S@9<3Lsfv0>㱕6V~z%dR   $Т=Zխ,1՞杁o_8rLg' (Dn=)ڝI]y}m##gZLvJ*T|vqH$Y1K6dae>7zN9Cق   §!_r)qj~ K u':  W(xU۫A&eNAAy*!9E*ݸCDܜ3+R)'>9?wɉ&gy&F7 I&ep.RBBpqrMArs_|kMBHMA3Μ=Ea@]4@zӺ]dm%Ӻ&ӺMKZk%%]umr,aI<<^bnaQ2   B 0W'c뼌ARv舩nVAAA!O !3^[7]AAA\"    |DB4崫۟ l̘I>kĞ΋$Plesdht7(lw[#><]}3A8!R]M*VNjթe=ta܏͜ 2L[$3~U*TBŪ-{Bdݜua܉z=,]?? ,wM2Oȩ sR /#9/X}Qd^Z߶ͱ!v>qwhBV # =i5`1g"ɑ\4mic.\wm$0A#v =hW>K,U"p!BGA\r~ls,N㫞˹*3pvE.1R)xWB8k6`urGPtF›c2bDpZ>Ȩ{ A{ȟi1i3'{#b@C}G96G=i7G>y"p!gC20D\8'7<ng}0fۈ~f'S;<9iHџptDЄdAV898`ю.i#r6 o}zް~z55,%j}2۴w0_{ W3v8aw)S_aN68ׯ͗]i18o@w_1uz5w~|#nŃői=0S?b,hD{>JbO縱;kǍmGgWdޑdPfZxE^3^'sl7]dOpsd^m%?cyٚ Nqqϝ]g7oZEP][ѿ)xĢ:=FH,DkOg2~/]uoKQ"ߥ-nj>| z𠡫7-zʞCpqdbvcvNf84˄jsh1>o& Sfxr=)o8pcf!8Px [*Ur$V;^9srvffƴu#`T˙bU~Ý"}IkG%=S,%D0ٲwhAseFd\Z~Rӏ=ٲWW̩}̨iq!^;9$/3w |4څƵݴ9h;W#(΀%Q#X? .ד$..[5)2 t\,),?kb@x])q"[{,bܮWiw|Ob0gpVUQx PuZCQΕBDdod?G63Bލ\,]hZ??oiP8HH~!}d%?ΘC"XiȍBlNUog0PLݐffyPDi[8u`~´~T~GȡB}Y!v83==U楨Ys9QT§I5 r-D~Tĭw}o֢1&PbOp _HqVxE!8"MQvW~j]Mh9ȡI&$*?by:TQN߰v0+{cRѠMAmA8ʡfAߩ ؎? Jd0{ۻj8ƍe9S$Օn سW <KNT/Ɍmt]g߆gZ֢ &&jKzƩAa7:Q9'O7Z3AQU*=±"T|Q Cot. >y4+eJeHQ4)MO& @PU*4c ȓ\ݝ aD/Za/o)L$/K5gOr@2~`hXQMq82ɜZ ų=X>"0=7~awZ:*;tyV)dx7yO7WcҙD"D=2QalHB741;'?UݿBLW=1{7!!'GKKRyͱ^Mo'ȦM׽1>U4:Q^NoBj'a33$D%0tԯ҂~8 %'>z,ۚ ;%є*@CxX8I7e6Bjqqh‰2-L @eLo׍m5utvA*p ]@.i2oLŦMZI,cAYLZɆB)܌C )Q(qǣ` PCygZɺ-XAI=|]4Lݤr̰'e )z,F,d"NͦxNwГ  MB8weT܇PUǯ) rU 1r'I2Sׯ"!;fڗ4.zӬY I h{~[/wk]qnLnKePTLCvVK]b4Ht N)k؟3nr[ ,odˑڛ~3vd[Z¼$ΞvQ㔉:$:U¤p5ڍ?*s9LRp#-".<7Zv3~NotLwxU̦FB)BoI("RD?PT, "Hł(AH"HW:"% |d7l& DH }y2ܻwgfwfgPA_?aήˤ2}_DžX9GN]0n̰U^IA9g!5skWmleb沮&]l[TѮ`]moLlTV7 Q-oe64{!6tZ708xH[^̀y|ޢ96f/8ao?w!/۶YӦp6$e cX5?g"G6_w!nn7[wx{yu>sjEn<&lrOY !(`?c y8!Evcy|a=_Fu!ȍBBESj8rgk!I7o2fe:ky̫=>!D$ !(d_nk Mv1*81_1.Ŕ$.D<1TTo^s+B!zSB1,B!Bd# qW5b#( !B!yąkħ&IB!B!DtcR`5:X]}CB!B! I\*&%cBWOB!BQ,ȥ"B!B!(dƅB!El#$&Kk( \][6==UąB!EءGXҏLjlBQ:BO' Q$,qjXZuk[qٙ;P4|q%K{=~e (LFĆyUqFg=}5 L9z 8kB!($q! -a&ѮeS5iJtd-DapɘYhkՄT#$ [aY3M@JZ(B  q{5TIB*qc薴mٔ6-q1"0DQLL&įEiÔ3X;ߜ'S(h27>ɰ84 ԧVtW>C-ykoR yw'xBO^푲5'xw$Zng;U/juzWAi̇v $L GH=9SpA.&Qf.IcdN8nT zxфTr̾B!B9J4od -f>+ZpI‘oWtY1Tm#>NI;wݿfxucG7+vMW1bČM~1D`[ ]k5t6gW4koxÌe{T~,wcƲYNrXN: ;k [/jj]0㾤 2!Nq!/ątpl`-η0U`м%<LCin׶T,,p C64/a:3w5T #]|x1͹)}B]nIm;▰|iCs\S.l#X՝^vO`>º t46\*WHaꍘz.`@mwT[_ F%")!($i!P' Ebcp`KE&,g TwuꀪY/a8c>^LJ WZz/߬'Rp0h8RW< i:TZ&#q/kSLec ["8oj.≸ma4SyZ$ھ!BqIB 7qtL2qaWIA~f3j?<'̨jw{喿07'L5{r_YyNWl#%xKU_:fJ!ZԱC+.bSW !(P:rC^=ş9hcMGuW@Bu /o1Ug\9UqH*`BzGrn3@OqMo:ؐЮlx#3@K%5WZFsYv,3Esyw^!D:k_ҿ=qwh/㩾s'P-<.-eXWؘbl'Ŀ' Yqk?GyjmwYI4"6szKFscܨv ldt%%LU2}:!Ա5-gaFfrߙ'F;2-\JGghݢͻ<ĄN/BQ|5B/ud;tk'p9m=G;H h3ǛEu;/~^CؐKED2Q71B> 8ZT1vl-L՟`~[L! ?k;;xJ?5 ~-{ypt(>p_oH&S@F >ZgbBQLH,޸+}Sd~ThFs\uY.v+0+毤¬n/u?v@W_ڦbu]]}ut2o}$ CA]Yn1tKj !Bxy7S)9bŁ>cv@;>Nڱdvo~-A|0s9{/%9RL[/MfͥhG>2<6w }˥q槹L_ gMxa丑tۥ繱 kY v՗oˏ%3ͧ1njƾ,XT7jxFw!O]Z;ʠh=pׄc&2 ,x6EtCޡYYxLY\3Ly`X>XG3;yDq! CadD{uO?/B!(T6gyZ8vm܋w94pI9:s j82~ hWW_I?=odp$R98!3gA5= Q}#TȔWWGtL>]UK+,؆'߯n3Ww-~f,#~ ĤofC#9b=)U&=ƘY1UfKȲ'TJÐPCR JthSK/%z p,ۚTԟvzҸMC\.s- N4ӏz*8WM*28:Wuec9c@g뱬}Us]劋+`9ջQvUUiu3[6sY:yR;gYŶV <> Nb ~>5PR۷lgU 1;ײ'~\'ńw˾t;ȶI ^mWUWŝmPֹ NհTƉwjwhMK\P 'Iţbm*1}"?877g끊W4 k5& cfCAY}!B;{T̘Ɇc=#UynI *&2dez-DB|= TxS⃯bŤnAQ=^GtF{i{*(}-st oOϧ*(JaFEAEGt̑D`C=%ihɰP&)>+X%O/KGrmA:=ٴ9#;Ac>bʯXCroɀpK?L}W-k\9^lk$LԵhO-^_۶KIIh3: >^~UUT4MCl cy}gUE,ob!_Ŗq,K_y4'Lw4z9gVgꁏ+a [Q/=})c3ProՍGn ܍yuQ%y1q$KEDz/ nwB!(nř!Pw|·&߅=;c+&a&W,KzO0U|[U,HT*P.$NgͶ Z3ݫ䋏wr9E4Lx^1hĜ;΅ tTJWEҭjP_~ s;z"N!*]՝dNx9ql::BI\ \"o87#AT"ϜrG i8z9 SZ0g^$_8 uq[}\T/”Nh0wi9rg( 2B+ ,>B!Mw]Oz{01aEeW/OaX]nu]G)ߗ\iOv6)ICu=!]+O=u)o a?^h9 ry|fZoj'2kY&1#FD\[3jϟp[&~WqvV%?LJa+uqut-e֦I69Q6ϾH/4a Cg``L9o=GhN>To$^_KfWxpziW߮Iy}˹z;N^ʱH 'gɸ 0 =J3q72oƴ16efp|l?ζRz|{Ֆc95:gsY%V~6vylquqPsYWOծ`W-*hWv.z[7&6n*{k~n~Sw=oӆ t 1Jҝ[Y7o 0%1(Vw فؾ1,"7_p+mAMlD>V@2vş$.D ,>B!DLb5j5]c\qHBP B!BQHBP3 ςC!ؑ7ABy {9|gA!ĭ#3`tzJB!D#B"J"/>wlh QZՇ/Ј6O1n,F~oSӀBqg[ !n?I\ };}VVkV$RyS谬j!%-pLPpecT!BQEz/bRT&- z%Q:&tW>t y8Idphz/Z_3G>E`gCP+Z ׾ᨵ l1)G^9C`3v{;IH Ӈӣ}ۅФ9m}Bq+\ CuYd_.ax0D1#3.Dz!JՠRX_hKN<2jw\Đ?tsGX)/wK;'/ʯM݌ XH~Óf),X«lg2_nD9-ˉG`.Xc_4پ!"{/Ǐ3*!M.]5k,Ċ3I\ #OoX!V(xʪ= IDATw|- n֙V[xEԴU̚_@c orn35e;U9jK/Qg [Xw >Bw(O5;hej`̝/4aa^"a$&&쌇̺($q!r(myͼTZUeU*~v0J]On!Y !Hbz曦1DhOb"q/GFH£j0mI ->5@B!nx !$q!r(|A``c zL_ܛ~dYEϏX|I:BX^X®W%^L:IDvOK{w-[8^ !B!nܜS`MI]ݙ>feЋ53AЧ\ S.nw\nӛ3!];ΕT=="84w/w6,}i/rt$ZB!% YDqmԓ_2zwBwj׃J7LU2}:!Ա5-ga? z Ag2}s=+ϓ3ˤ'xwPGhEP1|{ !Bqo[b}ٸؒ'j. W~vemQGu_ʾ1qSɧ[SŔЖ<}*c8SKCY:bugc9p ۷3B!"" nŶ;hִ1́ lBbc7[wx{yu^+[e3n& ׍?/lFq!roB!BqHB B!BQTHB y !B!E$.D.B!B9ȥ"B!B! :T%uB!Dpsw#Z1,Bk."{t@cH!Nڜ:usswNư$q!rz!BUU[1,BTD!B!E$.B!BQdIB!B!E$.B!BQdIB!B!E$.%/%~֍U9Q8]ZѲ|qblQֳ̇30C*'uyǸ[*B!]%_*(w~롕ebM:2rLjz*vYN}M<.Y0;Mgh}B!%$.%Ke+\Dx40L89 >B!% l1)rnG6m:1_&^׸m};CKxyP0ѡs} tMȨo5mɨ5^˜A!ؾ;ǯ@#}(MҴ}[aˁ#\`ڴnEޣX7-omk ,d^zxE60D!BB| ,;M^důDЉ|rJx6l`3Pߠ<vm㇗Yn ϛʁfXs'rbmw/xsh+*@^cwsx__-;5gvgX4e)',7愬Ć=lWfK겚I%P!BbFBra+l##w 訳m!Dtp%w6KJssŹ4Usz 6OZeq@u2}{@5*fwÙV 7jur\mЎwť :%KB!{\!J<-2Խۻbihm1oũy->桎1sII*eT=뾟tx+S>yﹷ_2DŠlnib_WsmA-'QM*h4IB!($q!(T2Sfp9MӁ8鷶V 2V̺)zMʬKk/Ok\Ӡb䅂L7/ɫ/!B!o-餥Yt2,ٯ0x6I IWs2, *~{f=CR8'$q݅L@-Ez5(dnQ)>1wy4$\ComB!%̸BsfMV}vML1mvGl{F y}6urTzdޟoE R)@OיF#CӉN` qs 3ξ8|%)::Gͤ)]֙)i,b!TG*(RXqn݈ffEfpt22gTak)3oBQVQeϙTn's)IZyy,glUB!B4qQ)8k) et"St<E "#fK0d5bү-:$fg&!T]T<]ޤ)TUEO˗S3L4Fju22's-<TEYe/mIEA5k*:{1+z9Lf5n[B!BI\pu5c!: |TTl' ~ >V:hJdcʎqiQ<[*QJܬ+~cR)AHq$TY2SQwXM׉I` ssn$L ܝ O3B!Bq睢PM*]ʝq), 9x1 *yI+jllW2(Uɕ=L򎠥ZWh虙PQt˿@Qipቊ&J)[ځrLŧ븖rjMVhq>gwxxE˖ )B niaW]3N:4vD]&|T@ 㿘 "B!"y({b=i:3)ga&"Z2t^<É|iED^wq<),ܓt>9f^,N׈MJ:ɥ_Sxˆ{dK<5:(.¿9Nѣ^:̊>sW'L`ܹvQ<{ꉴqH>ٯd/jU٪mu_;NlkP:ho(%4.nLv8UE @k֫^{ s, M8 !wz$%;PPU& I,;dUUWH7t)s"u:G3񾄄q|/MȒ'2p4h.X~MO⯕2wt #cpUOHO3wbsszVk!l|J^ xn6z׶Mc$sW/Gܵ !ف؛C؜:}gG_`y#ӓ=gfT}jڽnWdFȽ|BHa Z,kte蒿c¯obyl1<7MNyc0va~xt5ܳ?32aV6tgt2+lL'heJx c=ɔkNgy_ GaBQ$q!ŝ_Ox]6Mm&R-r#S^]fZ<Ǧcmdy寍f\hBCzv i .%x 6mZǒkǔq|ggc?Fש߳a2^opw'-U3y;O/f,z<[Nuܦ놘թV3;8f,Tei/ UUy}D6m'ͣvZƇ݀96­u:E} <6GїMdn&-jqabu vKu h\> i^aFla:]ώZDm>wcʷ"̷3}hP fcC:݈Xa?LjYs5+UZjܕҿm7krjšѽ/J^+zҞpWX~-o C/S;R##9tQ:UDozT}?lÖfkre V( ?N]fqwR!/I\!D!2LNhMM1xXKAqL})Oֈٹ=x 8)&[AHsw4@-\mуi߰G;*4yEnq̤[1?Jnj)ۃg명~h> m*jaHglSʉwjwhMK\CSϜa30 ߲u .\WI =~c;m svdVx(uec9c@gq|7M#;T>EЁ lB)1~ER޽c;ŭ-?ו^8nq+);z:ϵB(xHx5@30e tdp|bZK:C}e\]qvri:\&7@ܬt 7~%SE6B)d`\2tpvL|6ǿs8^Bh cw'G=`%uY- DǙkb󡌷bkNCwTJԬ}7c? m,B$ !(L>eJ:NDsp"U|pjKfL.ԃaւ,mix ND_C2X}}PU|\|nYڑ1QDk$%\d(ܭ~|gyah~^SJ{e]̞5;3-rcr-K~=hh>Y۽VLu-*TjCq )T'%Dg>L<>71Hb`j} [~N:0y n8.cf?j4Źm;9Ȉ{]vM֍Gudz9=Dk9.ڏ1B!J:=!BQQڙl>erV؝ /m{r>x RݍS9[7/?'zѹK7?Kviqttt|x\ϛKOqñ3OZ ՗!nlJnSv t݁{[6 \5IMuj6r3gV_<7't> Vwk^s9om?R!(( [b}ٸؒ'j. `ڕʶE~Vo+M%zoM޾ưENDDp{!6tZ.ڶmh۶1|Cس{1\Y89U[gVsNԩCrUYn6f===39Bؔ<z~ᵹѕ$EI~R!DDٻ訊M% $$ U @ ޤ ("AiJHWA&X @HBH{?RKUuΞ읙ޙ /+I}N}oK3mMN44FrZJM^)Nxܴh ZB8q$El _Fю//3g&[}HQD$]3H[~Gc50d R g:gYڇN`[>K+)""(p!""O͇Ϥ}f6Ū"""r?SDDDDDDD-.DDY㜏)#O)#ϞΓ.:gO{.EDD$.䱤mi%Kfvmߞ&7)_aaۭoɔ)E!::>KGG'<4XйqΥȓ%Ydf`8haaY"O~蜥_:7"""bO K{KՃCDDDDDD*""""""""Z\3qYΛǞ{t29rdl@mZ@vsH y:| .fݕwyΝ;ϢӲE ~GGǻʈE yjxݷDiѬ9 $8s, /b;~wOsLc\S3tۇ/ H8::H"lf} ݷa#F/FDDDDDD#jq!OřgYp!&1FRti"˔aБ,-4ٳgy"2dpK1?PBah٢C)˔y,\ـE9tY%}qZϜpY($OŞ{hѬ]΃l3HLl""""BlL}}A>-[R )""""""(p!OMߏիWiߡ#ĉ$$$'?p ;tի >#""ϫc|z#ϹUs<*_+=(bDD+#ӧNa؈|` -f0ʹzu~]""+3e=ێ,X7N|wNBaGD~AX &'_^,Y7{Ew2@)6Hh,V(mȣ'""OjT9::ҿ'޲sc޽\tH!ehӺ< x%dU8ܼoC3ɝP&}^^ۜ^ЗY?M3[Q6to4#1tSG~Ųp˒+M)؈i#-bhpE@n|52t~X9o7\Y>N4[9fvhǞ/kN^;ƍ#?~Yz"JPxrv1Z>3(jcXӯ,iۧ\Бs{7,dZR$=Ǥ l{9L.| yHLYi@ZCmL b o^iև!Kizveº]d̤A5_2BFL7[I \2b5EDZ%7Af E gD_I7,*Q-Ɏ?oa })V~X͖M y?^LM\J~hWK׳ud&̣4.Ɯޟ#Gwʶ_4~.=>_O#Nmfݖ--<|NjΧnrȈ6}㷴s^k4s.j)̉y<K+1mbwɺs:j#g֕ {w&MZ5W46`N`ɹLacd&Ĵf-#pnlFu)Z~ggF KWĆӝ 7RR%dI yySW2ko( ̙)Ze\`lٗH p(Jf%5 Zb޽fc (A7qkjunBa#b:nBj9p6_׺Wl$ iخٜ䜛JxjfաX8~!03X-نk42|rq`rDkP'Kڕ'廿8効~59 }t(BS\՚S93Q«^:SR}!#p+P>%.X~'e&Kndst@}s4{|;1M2S&2AttL99=իWZT n'v3ȿ!f{3p g+ ",,>YDDL/Qpjɉ5ԧ3F~GRwK i߱tf3IZ#vk΄W;h,^; Jb 㺛>wjf_?|H#DG`#KLv=0{+ͺ,ٰ@Jɻ2dƆ?h1#^E-EiS!39""T+"""6+oh%VKň&Aq#wle,k `ƒ[0*TUWO0nc%\ CE/3SmH񡻘28joPUoog0UK '#$`#ó3 5 ?֓(#:og&츘M;t+91x=|+aֱ;C3)SxVfcO):.Ѽo=ߣ~qrED_8s"ԂADDMF)Zs׈:ᙳ(U:{`FLiH.M8eG}W Nw8nM+S.F;l[F4尡9v}|Z3_0YLO0b.5e eD<[pzA :=Wݐ8LOFѹM%_si4)/3f!}J~t7FocK"իWMiN|>)UpWuO~jeJ'"ߡ^N!""R%K'?^@b $M}oK3mMN$)ڝ2mM34Н{iRqAN8g$1tO}=lЮ⇬e`\@ߺc|Ѹ&oF?t?cgųV3پ't=A(Sxf{=不' gFթJO 4Hx+]kʄW~2Y-y"SUm*Sb0ª 6#KwvIlWصמE0o;!wD' jTh;{n;F.i.mL|m\ɑlWJXqo޳m} |$~;ҿ7[DD$sOqm{-l˜9BF'k,YK>U1V2㕸U5sp  &w Tb?CL)oUL'5KcnW*URgMEꕩX>k`u);6~^ ccYR[8mkJXvQ`U j]1Bґ]\Ï'JѰ&8gU)W9AʮZ"0TPUĤݞA (G`O9翥Ul2ZoǬ7̡w-Wʍ1q~7蟿uP&I}o#dXn^*SB=:OGa!t98cLlL`,%X2~͇ܧ:37*R?c6"~-kP?}?a֤Zڕ*fn.[fg[D<ZS\9+բEeڨ0}\ŝ@&̨zT5N?ueҾH L=79/hO9_45+Rڿ˸-HbWw3{*/O|0gRo+)na zϘ;7M*5_/Ga`\̺ӥP~b'{hDYq{/>Mx)gaǮm,zÅe#gsj%%_P,۹15=lܑ,ryb%2I7ov/{Q&96;+˷wDj^KG $5ˮq.<1vÍ{]_DG:p&;w/ST47e`J6#\#qs _-]5i0csOklo);rtgl[%M` ]A?kmos||.-ga7~K; ~ b|[;glڴ1.1)[:Sɬݼz!ͭLs2#u&U9#?wf||%+vŌW46`N`ɹ6q{|w붰uar̈́QG?i5m-7.fh\خna^LG~=}o#{y9V9̀Vbņf2M~qkٻg'[ݪpJ^\6e8H~HɏWسGz͈);I>vq ÿ3~.~Bw`뮭,1e@s& %<0qXxHa߱qNN͍cYAѻ2/gƺu,ތwFYעt-k"GJo^4,咼v#`%W2eNoL} ,7lݳs൪K28Wj1nN6~mѓl0wg,>@xqs?n^؇Hqή IDATߢ͔5ݻiun0c\Np|qֱ4:9ְov|Rvg/~mQؚ~ɆٱKޫ'>Æl]lcv/oysqw38 >1Sdd66OSc YϘ21~*DDDGēcQ̘IN2S0Am>aB`(Hҹpٳ$^q&<4>A 9JV#&Uޟ|W+ozO'C\bO\$﷟nd/`Ζ\d^Eɘy2 (WQ`ryfMpmfN'G_̹kѡ~>21kjp|S,̱0'ON1q ^i_¿TN`Tr\&pPJmk> ļ{?-Q6o&<܄l=FĎu݄rl' uHj 0 U"sX1/t536mٜl5ٓodۿ >|0%y}s:^jTNyKQ8`­@YJDvSdL:y>g~ 0O[4LjÿzaK01<O}X:.8,]EP2$e-ZO!q~9R V4/3})5Zs^.*Y]`|$\3>.Udʼn[3{SȅBͩsɭf+beR^3)_i*),k~=bX,݀{~~}4h&G0MvlHAۂ.5rbxt]j S@~X\quϵeHnY=cuPE7}ϼ8zJgv;*'<fק59g]K ǞU[P3 cƁ,[l11Il\۾y^{Âdrp-k>rf2asKOL۷kм֍G{\4j]," [Uufs'U. -a`5؞{ͭ)uo2τŌW~%jwN#9f2t[*m)Ggڜ  їbpln`@RϜ LwbxŝCSkd|qMSLj$]dvIdT""}:IN@X Ǘyo,-Lr#|ň|cMXL hvxńfðEy݊o);kSf|XV~]ʽiH|WT?RZj1D1v|bi||WѽTmxeNjl|ITf "ђga¸}j*LN3HP,&q5Ĉ󢩧O(Z>`IJL]v 1I+Ai׷dGN{1MK|Ә31uŗqp=FDX8&?||nܳF>9{r=t]*Eәֻ!ҶG/:b̚e(d0~zcv#Kf;װ͚tJrcw:vgH*q|^8vsHL[U1~eƤ%V!DࡻM{ɂb&c9If,/rm؇m„X<ߛ7̩WS<2~>ыOv2uJzY>-N] 'C};#seXW2MQy~ؓngfxd*Uf< "ާ`>xkkf΅)j2NE~nI?׈tӮo+Bc ȔtBCjLo >ް76y4 !ƻ$i*edM4i%"I\HL@.e\zq6I=2 FJ9D?V-dJs{4-Y:>ˍ}2,iwZj6!~x31 ჻%%{ke,\~9jiW4I=l\Kz0/xdWA͐bKݹ{pJ@~ރҵgdY=7VV;FTjPac8[$Zc iK;SHNL"Krj׳q=ιP(Y3F~= r"[I_H{E p#1!^~]7M$Fؙyep~k:VKu3svf͎ n_ĺC)$K<{Fo,B^Q/̟ `:iKP^f+֧ܕ%Lx8Cw1eq $߾# 8z ([>T)HJu(w|7n[Μb8q"[6هpL'0g#,ì`$\ #EcJ؁u0WJU.E9pxBv-`ůn[zZ4Hs"~'Ρ-b?lHC1"dw^{5%[Vŗ ň&AEuJV!MTO0vY-Or!ָ`r&y 迄 '^ H:{Wa6vp#.^90Ncb9rGI0SNɰU8m!c2ۯ@#F)Zs׈:ᙳ(U:{`FLi*rfq#z`rUA"S­iu%|hrmˈq7Ԫ'9- K К (ƌBQ\sPPF̃^)Mm|ӹ.GBp}!;Wbh0<۸S e6[tӜ`*ܘ΁3Lь:в.iLm\ߖ2 0Q3$_4NŶZ/||ax홗 ƕu8J2F`똜\p۟".)u/K~ukΡm0<^npMl/x9k}MenF.iǣs>~ŚVۗQþd&=6M_@3Tv]_gu(;{*ҽJ>Ϳ!,2 ީ1n:›S [!_F1|ěT o>bmAm2}0ٖg?8KL֠R -8Ap<-uݞE`(!!k 8t)}ss!c;Q 2|ڍI¨qև &rJ)wKGwTV/j3&JKDD?3_}vk|&9ʹC锗)ɯSS3G^1Ts[2,իWMn}UN5?}R,~#~ 2c|Ѽ71/ަ~**'#ҪmO+""lݾ/ܷJO~&<3HN>%?ޝ-fښfHNKyfx+Eiv0YD0 l7/q=tIUDD31lߔ[Z' ? \sƍkOgƒ ا$QiItK ItK I Oy?FUDDDҵ… q)N}CSp!dQBDD5LѢEEDDD9""""""""n)p!""""""""""""""n)p!""""""""""""""n)p!""""""""""""""n9'$&&rDGGgs,+ DLDDDD5 \=|9g%ϱPN9CW#::ZA 1j#"""OZ\Ƚ 0SE@ׅ:+Vܕ^^=}җL3ޕ."OHz"݈Q&-XAƍe%"O 6DDD)SB!++Z dg)V(/_""""""")uʕ+---ʂpttQÆl՚_gMc^<#ɺܗ yB8Z4opttEfiˊg괘r}_dN^7VRj{/M ynDH}?)TZWKՒ\r߲"^Uh< *WqіP,Υ_ɵl8o,e9ȵG{yv]\\nC_r∋#$$+Wƾq_ڴo+}vj*_\)5edpeJwě=տ>'Tn'ekCDDDҏLVZM:ut]yٳgLԨDA)]|ػkbgƦ͛ OSZn>{v?'5r'zefh^Ϗň޴k\U\3b3s Ξ1ͨU16E7~Gv "E/ x/vf澵 Pd8v ҄ʕlܝiOu4Hu8z+!-b9|Tr`uK .̡C lo׫ӯ8n?Ĉ˨߸ jum|0 㾯a V:uZȔUSd4 ƍ б!5jSuo5elНfkT1o _ؤVV,Յ&ԀNCWg6"Y٫o3ylL@QL.[?064[jAuhw!'b .G9uo܀T^iKhЁO;F6|fYJ sypOէ8qt;4F@jcSg:|~ؖ`MTj 00~@s|K v1^ѳG'/uQzAl{M W\ MVJ+2zHŖ3k&Əg̙5-7o.FIX,^] A{TQ]]H*s2r?nqparTVBܶHgSbIu;K5lؼ9m]X֬]r+nvL݆['2#:C^qWj]~-漃a= Cn )SO?bU 摼fgט^LiO7vuuk.|1nǎرc|1n]t>[DDDSBcBf9p hѼ[7mdڔWvsIu6knHRla٩eo݊c!"wD@)G?IBaB\HceC+QN,[T5yioږʊ N&^R?_L&7 W,SI4-sl\ıF,5;8fw5Kؑ%ч:GquqJc~OUr c;X^_YJв]I,*[%;W7k:ÚɂWFTb0aͺpʷi˙̘\Q~IwlLrKK괪 fpHbp5f^{q,@֚+gf߰9rdN nOĿ/f:#WPӂϙm{2uYIJ Oo/K4eᤦd$^LieӅMa8 IDAT[/Dv|XSf7;M.2([YeIƘ߈ $?ktLFypU"gk{83u63M3s\3'.v|w|BBH(RD@ $TQ@Al\&kE@E^r *("HzFSAjBK B{6'OnM}?cz_s-,] P?; |oIvp.KAKZ'wB/r;t{ Ew ~^{|Dt؍4Dע९,vPt: ^9 V ^$=c#r_|b:V?3ƓA<jnSn_  9ݽX@sU%,lMJƥ-.ĉ.ZDDDD3pC8{_u%0AțCaԘ0} ݞ'UW"KfYz57oZ}5Qia&mFDLtGmT}wkL8(8S[ޘzV)X`c ʷ_~pS|2E`-\ygzJ0'eŗ^֧QIځZƅ,ZQsRc6n]t3Bŗ_FNЪUK֬Y6`]qc OQ0 $m|O؁3nU u݄'#",+pJIDzh=|>.DDDDDo|Y*@ .@|."[06oތuQ ?ZO#0>mA ""B޽pa@Np>`|_ $ӧQ>o`c,-pAyeV_L[rף޲G_S?DDDTX<;tߨQC-{7ǃSGCbb"vC^|pNʳǏUV2~|>L%&%f͚}Dk"X1GA\\LQv$1Ud@pAyDGkaʰQ9oLL/vI_E_k.2,** 5DxxL.("+GNSЮ];kNJII##7D-/ӧeʸpDFfpAy'&%pIII~("##@%""""(($j 5QYzu}~)\?_O{MDDDDDDTpAyֺukDy?]~w߉lYs(2%""""" 3˅ ;wbbFvz[\.1J2.(_zϙ;W{e4`^pAO=Qpo|y jzDDDDDDTP)_>c&^V Ϙ @XXADeơG~^  Cqp:w% oûo;wb79s0t9-{},[@&MЯo_18t8*R\LQp:5'v2E%NoNO?5瞟UWYjjL1NaQDDDeUJp.=]jBExj@ff&5 _/Y"fW_LSEb,\P{-k$̙X˰,K=˲0륗0f8={p]#kL""""""*MXzhh}haVY#foոAx7xޚ2nCxhh1J~8']wމƍc#55;F ;tףG%wdr2VX/}J*aѽ6J+.@ ?3^xKaFlظ. m۴AF8@bb"{nlٺ9J﫮¸Ơ^zDDDDDDTzpA~zxi ضmϘ6|xM|@:o>-[r,\Pkٲ%>>:/Ǧ[nDaaah߮-z쉞=zVZr ,\PU1x01x0,ɓ't(qqqE*Up8Dtt-^>1\2c!er|-Y>9ct\80yhz%WU*Mbbbpqƈ]ƍ͢Wcc૿i)DNh?#wHs3Km m~R:Q(pADVێMpx$zgeD]ՉJ7ڣ"ڹ (B^',peQt",}G\{#X8q5~nz+no+?c㶊hױ\V 6x-݅:3Ǵa݌ځx,$o=@Gxa]x<3tr'>~t"ִÛ WƮ5 VO~mMb3N[m!~]dn[ ٪ZMQ]0tvVpTBQ8 d ?j[C5odQc'R, -/ gfoŽ`SB'.H??l<Ivr8ɖGfsyP/7'ǹbX|ьs,5SpFnݪBD1op8](0wn7,w*ƠbRw㜳6ڤZ@E.@:C2q೗,. ~ΨDTr))~@lߩx7jޙ;=[=<olhu(]ꬄU#>UN+nH\5*faիXM""""R "**懿eQGq j#>6>Y)Aqp";u+/>ˢ]p>n7߱*۱i,ˉ]E?>K_)7Y$ځijў_د'N/x 2X'{NT&c}qXy̼CoqX_&Mwn7&'mQ82\5W$m'sI7>g N""""*X Y WC-ZޏWyѤG[@/aMau#IG$ ګơO~xpԸOθuХ{?|~)2~}G^8?/W +'݂ 3>-ȅ uڌp₁fte2}bb88/ћBB+qOcWkEu:k gƠ=u$_1 Qapnyv1X6۫wpi[6.Us06j\gdILLD\\ ߐ"C;FɐOǰg.4[nEe֟C:7QٴoA4 a&mFDLtGm΋Wy6=_]5Ɩ7K-cSe_y>.bႈ-.bႈ-.bႈ-. Cjj Qq:- aa2L%L9 ""*-jՌÉ8v"Y  C͚q2L% DDTj9NԮ]S[Ebႈ-.b EpsQQ28ʔ""""""*Eᜤğo}gnG K$""""""*,\Paݟš!RNX """"""PN.\9U" ;OW'csXyw2>hI) C9l0 m/<gNDDDDDD $ VOǽ/%KKn"Ll+t.xk=W`UGVa!&>`]eKW`ΈExMOޝ&!`Ś|lz ?53«Iڲذ5xr%VX#c6xjXLz')K?ĚcuX`}3M:O,\PߏGfѤYs4i ܃LuHtq%8hyS\s9V>QnG{S{?Uu\spG( zvk[8=^Uu nƲaߎVE(NCMyq3a6|(ZG7ꀤc7@E'PfwjeaDDDDDDDT<3.(Ocݫ!J 1) V܏n_hqUS-"guV˪9]N *\81Ɖ8[}oBF -RSaOh*#:ü#(KƪǮ.w:ܕ![pVE5;K(r{aDDDDDDT\pAqFzL{_cϳuOsށjU,xf9"r2e3[i)8u[x(W ի | RS SREM:e($&%RŊ2LE ɲ̄c5Nt>e;annQsǮdTos͉٘e[<֧gOu+^^ N<1hZ|_l:r-ѿo%<;j0̔ۑh޸<`M_;wbϟQHTT M.XpA9:^/8,a ~xc bzĬCpWC^`z.gx4}^{OQ.>.s*^`Tq:hڴ Q)yv1X6NC{֩ic՜krަU^8,Y|ߟa*'>7>$ aa 2LDDDDD$&ʣLX﫼[gz,m-oL}[6M2ˆ*BDDDDDDD DDDDDDDTlpADDDDDDD DDDDDDDTlpATFE?#"""""*J\QUmȭ 1"""""U Quepe-T`Ⴈ*tO SOfU-.bႈ-.bႈ-.bႈ-.bႈ-.bႈ-.*'Dk^?~PjU\X>ʗ//fQY*ۍ_}`-HOOϖ Cm1`{5p:PQY6੧]d'==k׭u0{ۘءFDDDDDDe T(zm0En_,<<͛5CZ/svڅG11r~DDDDDDTvpAn پqzp=޽QA 9sK.ko}v3q*3:\""""""*T.^hqM7b 0r- "\7t/Xx6ʂXD)Sɓ&!<<\eɓ&aԩO!9%%kQPױp2{s[g#[hh߾;VcѾ};B[DDDDDDe\uoi,\UҜ;wxyjSӉ ߇wQnM\Z>VJM7vmۢi&bF6ivmb-8}46mތ.]4""""*222sN!<<^x!d*6 IDAT /թpET@ƍާ)5ZP1mv_kBɛxl޲,\.vDuPfM >r{ _HϨ[Ր)*G=ѸQc5t/Z%B5/ɛ /cQpiԨQ3-V3Μ $Ejj*EFHK | Sb'.,yJ +)}-71cQ)aAy,XV0l~8.BySTd/DA տ.jVP]qJzΖ_gPA =' Bu+\ʅ˖},²e4`loTJfnQ*.p^?"<ʇf\:u`k^|;\urZP]ڻPN41J:// vRቋ`/h(yo̳ӐNrJ yvo|]#p䵶EDDDDŚ-o-,Z܃`zPE (OphxkL<{iiib4{8xaÆ8`EDDDDg{R( c'LQ.zn)D\.fxUl-;w9ع 6ou/x.K$"""B_~`y5Psݘ?>nݐЭvd7%xjWCť`r,䊲pQ]L)F!ҴI|~:x nyk֬FZZ֬Yyn+pa}st?O?~_xIiBѣ`"> >),݇G݊ )_E{[JӭUw_D*N oSqֳG|t(233pb,\] dr zuhժLQibQ$1f8@{a˿_mN =,[vÍwߋ[[Wuv 'ZL{2\; /i s!O, &NĶ1С}{_.!>]:wo?^}5ϠKOnŽ+y4ˮ nͫb( 4ߔ7PBpex:d drrEXX `т Tzz:Fy. M{FNc̻q'?n6a-~-  76.:mx}dm^ -bΥì3 iӦlyÁ{n7| 9Z|2FĂs !EBtϷ.\;gB}˖.KNB\l,tqc²Kأ ::ZJ% BogϞFxxfL\9z<|ASN P5"-O♛;;c:<7/e EC˛3ah߾=:'L͛q:m?pѢl,X .¦+p",r =]{%z\y=|k=LލDq_:$Nq=q׼C )a҈jQwy/>/9?富Mƕ܀]=g<s ,o3Lqx^Xf"7?+v9S\19VF 16V\_oï۷ax1rԨQCFDDDD+v<8z*U{ʹȓ-mf=\y4)7 o,8TW^Gcƞ=%ڵkg[䒦?rpEuߞhb,=|6\.|l׾ODrO?)p+XK|p,}|LT<~"w?ђ/1W?/0ϣסW;ۑ#T-y89rP9͗,\/3]p}lQ<1P0^}u_bgϞF#22 ӟ׹q:9*UmXI9cmidϏ&M'v.> "By "{\%0W+1%[ $߂-P>8Nk^=/@ÅpeVؒ;u` #"_/=. ƥUpThتMcidDqpN t䍱9s+O*_c0b]x7ѠA9s? W 九T% 8,nw<*.4}">y ӆNÄ4\X0+,4lx~7wڶmN )h׶~W\tQ?KO žēx28XiHYxm,Xx*.nn+7hYZgXq|#~f"3݅p[@l Εq ISnUu-w:FZffCX@s$BWΨi,穋,sBsL9/TN&'c͚5Xf k/;lXTV ^X;uFB|~Q`o7py^5 3g8<5e \NW[e;\r?кUIo߯ARpYewD]Lwj6mQPaď}჏?BΝԞh׶:0SLƻkNpKa`mR'>3 ߅6]+y'ʥdw:NƉup j4Z /@|0é%\1~9TglNť`Yg{ Gn~PyX'TΜ9̓s|0>[-}a? 0G)>7| ~]iG&"""Gv{q!L1/Ps{ᆽHN@z4o)pӽףS͇oLO530B fVr8ƛoyڶ)1桱P!m XuF5i5c@Xp%br"vm#\_r"'_Sn8{'y!ZU5),dڏ_8fٜ-y)gG $7s LA>qa!h",=}qWwky _a}S9W5;kXlB1aZ^~c8 +X{ (#^ wnvǔ1_mcE/2ť`嚩``bg㪯ozC5}ZLˉ{d,5&gsӧdrrx(t h۶ j\3gHb"lيUWcڵHNI6'J<øalq.11qqq2/=žd(֮]n]0~@ PV-YbeȲ,,\/}{E5@}ѿ_8%!zj4i}DW @hnx) } a z Ʋ)'.ISl!<"/ޗ OXKx'hm۴=w߅.;戈\X>._7 LY&#ge0ׯǤ'DDDD5/NLQRbk\3u2.@1`JA.Âhb"ț(,XcRc={ڶi1F}vq\蚐 شi3^xElٺpbo64k6i"$"""%֗A*4j1=(c̱"㔁BE7tdBXTԧ<عk +Z\.<4z4>;'_E }vp5޽0d0ܵK&"""R`s@~keB'1]L;/p y-ri\0lYԮ] |!kdN Ӊ{ |!j'dr2İ?,Ph}q}v 24GX1]TE꫼>'ۧ<8|0G)Z|8w.Zj)f^V-ܹѣ0t>|X$"""B--(|H=Dmo|B[ɸ̜p˘CU}56'ri 8t ..s}Ԯ-f jCa b VolykNjyW}mn}0 La.?~U`ҧ5k""*ཷg^zbV_{{6*T|E皵gYDDDDT2_r n<y횢leL"U & fwqOL~ y BbR}noH#Gx[G *d`!Z㦼1tr\h]b@VܡMq"WE7bjK1D\m8&ܹf=#*d(RRR{.rHԫWˇ-`$''GZjLQ!E / xt1Up@<ҩz-nUCX Yb:S˦8,A, *oN_,S[ٷu#[ Q>DEEqqi R 7k\O~kZWL$[.^h p~@YhB}XߪȸYOm[9Pdddnt%vĄ\ڭ#/JQ|ƅCuvT E!*nzEw7i}Ovkb_(p,/ˋn=L!""""""*U1}b2U_2Ŋ,\xv[Wc2 """"""*-V6NʾI|dB .>]qD٪}#~״/v^ɱ.d?3?,d}@WcySMS)smQq%ikLq},sFAV}9G1M1IyE8.CM},z;7's d_1XAIzHg\X|JvS7BK7ۇw7瑵O['0z8M , 4ϔcpULϓ z_=q7zLU OF @As9oMMAli1`剈@eS^[njki9SS9}<[ *v9sT_GK /D\S}KWb ɂy,j.nx* OQ(h"{aámb^ؐE5WmeLCԾj,ODDDDDTvbf5]}7^ jn9u,8^ۻU1=':9VⅢ0 /X}sTBYޜ>LV x*8:z=oSq57iň"m2oU3ŁSq=? zAO- A<7+pY`^DS^^45G^|<7Iϩ1dz~N3O&ց ɧ+d_L[;:$ؼi7= ă*2MeB'yq~Scxj+zL1].oY >6,1v#S & 0zLqz1XW6 hSUc d1CmM1IDDDDDD\IPmM1VTTa@﫦՚-,^1uyu55OQq_HV‚y.)dOS1}Yò^DbYJW#ӛ_YREsxcZ_=U_ʘ&DDDDDDŅ\Jzޮ-^0 ‚gxvzΕ 98lzSqEK>]< pXn,Ve_m-xnZYEr"[FޱoQMH }:M}EϙʼnJE^ԩ].dd&TL<aSy/*`Da.?Zlc}jrnV|˛6OB-nd=M?z…UO\O^9S9gUc9V"}]gZ7*r-)sQ*BBcj䅊ɢz-27ӷ>GyE"…BcUqbU[uu*۷9^pzgTdA/ZqVMLyS8Rk8)r(Uho:}SSy;2'NJ]< p!YȹV1Ǫ/cs#o^xg;ct:nuhyE:}551L1"""""LsLvU}=.r|A6t*6Ӌ,m\)Xʾ3 \Q.,Vs+o_pUxP7X}ul*,,o_.YdP9h}ulLOYVKrvQQ0i.טzS b>OmeNAd\[ԅ 3IDAT<9Neޟ ,\XȾPVc=Ǡurcj^ЋzQ@/`8IU䰼95G0d_QccʭWL؍;`׎rz*$B+soݚ&vsL1Ӹpa!wa|S yQZLƪ>GšŜ:* V7\#sȜeNdߜ@r3$0ȹjMsyrT̔3ͳ?GC#NJi.иPuBg!_ŀԁƒ*>9x z^7:}krvLyS4kAy՗[S3e_BϫYH)W$pa!kQMT^h:qu*NXZ_CBQcuя79i+}$7s\c7W1}*.S '/Xq5G[Bp;]\1-V |eLr [=Guvm4״ȗb]<1S3Se_sVMvX,VC˩炉A[Sd.o'y"""""FXn=.Ȝ33,dN)rS1}[luBſ\\ﯨ>OT^/os\!.c/_sNc_N\"""""$v9r4Oe.fWLq>i.P̔/4Z:݂\_d\-},z,rkrDDDDDD\ۍeș5ϧe_V18PQ?qx~W?Cy>*Ʀ~nצжɾ)f__4U<\9W}=(d_Vq| EiQ~ɼʾ"cR<Qih-@bi+c2(gcO9=7˕P/p_N1-M19ַz\Ms879S[ySNΓ@r;Y7- {nc5'2/z^Ms|sr%ԋ@m>7 {˸ɸ˸r+:SSe"""""}L9S 0/VqKe4G6P^*QXo>h^s11d\nM1Wtl7*T!"""""*.B81-e_ U,-&󲿿bjNPÇs慅 q5۪9͑cz40\ yMs8?<QiodY9})ܪ\qh3/s-yrPѷ\9΍KDDDDDTgq.S_1V㡚c>EMB5'h r3- gδ>y[)gׅ*8QabdNnKXd_nu'v̜5cu yoi>DDDDDDeQ^r/2nGV`ɱP JA.|9v0s r`.*bɭ.1M)9""""""o1m3M1\0trL9SL1͓}N0󂙓k ygW >&CDDDDDˮ: HPyֈ8ہ:=r W2K:WJz(_Ju\ʝٳR^]BD}~TЪp]GCtqZQY]z[l.9sl6ʵ.l)Li=GZa߳ F+򨷵ߪZV|D͕˦=fdK7[{g\g#|)z~ɕ!:SC뒡\FL>Myjȝ}lPEEo,ګkЪaRa;l{VY]GLT;\WQ_ju&>둻iOw׵:Rgl9ClPHKk=w/yzξ//%kV3VJ~~Au^Tk:eZ.%d{ |)힨>[[5z{ph/Elv'ۓ/Ԡ}o6heQ`jQ6de+CwWJ3CgW}ƕ+=>yqQʵJYת{ZR{3_ Cow;W>e4ܯf]=joWclth!2LvZ9gw +߳[=k6WJ.Sv=܌Vzz됻]+=s]5gg{7ū߶?c+d9;3{vwΙYC0"""""""K,ZVbLAYDDDDDD$He8ĂmiȐ!藈T1dȐ:H檏Ze sέ\DDDDDDvo:u6(o$@WW:7W^]m޲ :.8W~KsMႂEDDDDDDM2@YN ujr bCr,N:ŪDDDDDDD6jܹ$''{8couxӠBI{LJN|HaѨ庮l&333kq:q4CضmX˲,ձJ_J"R)+huZh&K.m3#&>TDDDDDDZNi(˲BƘmN4u`0c\qVZy999DQ8쳙2eJ⢀MLޘtb18U0e8>`: s*v'g:|\ǩT.""""""1LZW?1`[h4Z]5>ⷑ8C Ѽw!ɍ]"%%'iU6)6&Zŀ\׵<3>": BSޔ>Gyc\5eFr) XVN_FzR>`/qFx9笾Xśc""""""˲,cLlwpM6+(B *T04ʆ+uJ5*Ͽ%/tȟ"9)Z9gG!"0X.vJmj㜳rgaYx}e)rP7E$$QLa""Skۦ5y$VбC{‘(Zc 뚤$.+_'4Q#[а} 8ƵJ((^IQIp>h‚\hzb8n{}ٲ/l6SeEDDʿYTqAz:O<|gzw럌|Mq5|9}nI-ԛ.wXW.wy^&f(DŽaS>mLٞ$%%F ` Q{:S<"n>Jط.t4 h(ek)gXGOa1ƘedYIIAf~#cOܢ}NrR1oNσ3N=?fɟ˶h""shlLmGe7kN }̚37E͛ඛeOT,kN >&_LyȨs˨VAyK 4r&l̮dv(ƟbJ_ $e@FpY6eI9aS>s#_em9gV o;7ypH]| Z~_QoWh_̛.G_f߸ػ~fϙc#M˰,+et?u̅QooEDv#{?KFeoj}pXbUtٿ#w`j\omyQL([Fjiue8ƶmb?FF@\ vs5AJ,n=7UnjӪLs{1{8*'n?ʨJ˲ywx*p&0$'%=wqTØ2kyQF77ytܷ=N)Ӿu]dFccdT:ˉ֖y8ko`j\χ8Ov 5ڲGB&\h Yf͙Þ$W*WHmᴓN` p4oc D"0yD" w5my\-y^yRtďƟl-gcZ9Ӈq#|U풽Ya- ʳ")p#eGb2-~+[>oW1}ǭ|T<TWO3)3k\>D^l+pGk=k\(-Q>Ql[e(۶]9Pvd=%=LMH25юЯR2#_;-߇O)\aUI]'?3ypUWO?7F- -55`0@JJ2h${SO@""{5g.s_dXTcH7_QcXt5=Z,$(o c ö&ERª,,Ha#7me'ᇟʦxO*""͍3Kr}(,,➻ncwsygٔ/Uz3:²0k: JlԺmꭑW?d3w\zjj*e˖fժUvRRmumN+qdS9yD:YiއJ6oŊ\Ұ˙#<;qn:z^kNm];`OQhhBoSV 8 _]XDIgN:&ħR*߈eP|ݼ\za#F|UpAd~ޣ+']grѬcb2^^C}^| h^n|zzdٕ+3 (t8ʀ7 p[9u}yi&,܃fdjp 8|kS&FNURvt𾩴YoWWxmkQHՈrl^8&99ٸ[wRRVi,,2vӑ[^LJopKs(v?}o<csVcN̡Wdۯ@%.g+PzGtF/#Ѹg7AW^(s;«HkVT7bV_nx(cy=֗?p8^?=x;#)ţYC[1|2 Tv4Wacm0#NY0Znbn|}>(Scx~9aF04a2!'xy;ӇbxO!o {NwT}k͜Ox_?6}83{n9FOȘ3?z_=V_n~|*Z|gg+p*zTOǜnyė{R&rVi,""""d8%Zeһqќv4zNor~ᣏWqh~t Kmivc/X-ęXBIydcX_۶˂~OT?v)5k(}ɶqʹGW_JKzhK{,i;sօ$#?gq(i[[GÌt")I_8BoHu\pj&~ <>|=/7O#-d v^ޫ9)>?YSR{"sL:nI?@ѻL<9~׀}{F嬈սVu΢DZO|R>d!כ=mگ'{Inv$Ӂ_&NfSO^˯es}hNjljø7>{Gޗ+a'&xaZz=ܜi)y5|NhٛsOhCMRcUi|N=O>֗F/+3o37-zsfHHmuO_|OAuEDDDDvze/0_ &_npFV3޳J'D$x]C wT{@Q.4&lEsfo3uA.Q]P΋5jlWzl,p]\IbrFڿ VlM&M2X,'f}CZeMݤa22i ՖNaz4t0Xzx].طl&̬#2Ʋ\'qjڛ;?{pQSgq[ M"X5݃ukȋ&7BVs؛ !xqGEFZ咻zKxytZI#Ml[3}?G^qחMJl1LF48c$_Gڊ<6e;#_ogi(n F maHQ0sY􆤗F^H*+s )&Ͷf@ko'Ӹ59=[DXj(R׳:׉_P\oA7u )?`LEa ]NGϠIƲ<0>#`dslda 4ʄosXGQNEidYC?W,ߔ>~^G@Oe/!q#]Ψb,+9)pJ]TiMv#2791@5g3t24)? _)&|ߘp/o y@ \VZ n"""";S9.ةjݚ'/r+^ɂ%yx1%Qi!l[D:4*ϧ!gUwzd;o"`!7m4-Y3FsߍCKWIz|c+!Jymz#>f_[2^{ׄk-%5d4ߓY\Q>5R%n?*:D=^| &BYYj$V-chxg?2q9,^b9yy79+YmYLM4׍9f3z#Ox{W\^N9|6~z,%qqd*WߪIƘ Y9o'ŮGɒ21=&}LDDDDvyDҚﲮ-Η O2XZk7[7p;t|OϛT=;8gpi_~zvK') }֋_Tޒ1\l58+o?n)9DnJnə]ļnǍnA#a9Ks8Mՙ?˅O.bӘɭ'6Ů&laC 1s5W6M6fV ,u)))H$,J}+Շa>4 Y0r9g3/6LkУG=@ XUk;Bě3g7p5gϣ3=~oKtڵR?6K=Gr!yN9<wU%]@Æ 5kWpO?1/h۶Gt?Vjә6m?#vX[?M2H$]w>'N.]mS[pyX~=ۏ`RBD~m.fNGEDDDDdSlmUmch߾LqPޣ;<`mɠA믿P %Vm?╔,ߞBpRr2xWm`Y;+'68sl<,mtV믾6,mNm.4h([ aĉ<g\wݵ|3}z6oˋȎe 6䢋/f/W^u]/^}Un8ʨkmu֍=z_25<#8<`m1v&}2x7vLq˸qXt)s,gyVmGl=={og̠gϣ_巻8<ܳw}r =ɓ'>苈Ȏa >\p曼m׮N筷ܢ^w;mwua=8@YpnLKh<̟ςy;o.wqVe4^M^|nNƏ}Q_?`W\+ai"""""m u](ݺPQ>c7c$$%%q'o܎avGAAO N֭yg^jj2F'k####i~?ۇ믿og̠w^ <CRTX°anu@].=(wV[/" {Psq 'D{کU~BaÆZhQ>Uܫ+˗Fо=p@^N6o,?e˖IP6Ɣ]ԫ}{Ǝ?ǽ]w P1|WDDDDDdװyfyk׮%77qp]\rssԺ… t+Wqے%K(..΃mWcYV(7L޽hUzW_e1@ UWg)у=z0y@[DDDDDvNĈnE߾\s͵y]DΪU^X8trEEdg2AjC=8ҥKbV?wB!AcׯSF֭=F3~lb sOHIIx^vܵ[W;p\fy|Э^CeY~8~]/^_UQӠA:wXMKJJ*&|竳D x𡇸袋krӍ72q\uUնTSK/KiժUb3MASN夓N`};8cƎjRRRB$ 'OM;f W\q9s. VgjUV$%%?0w7dd4hho%;+`0-[UnX ) []vI 8emՆ{=l]BAďƂmՎnK`ʒ%K+ݠAgJeJ=hժ> `rRR2n*Ğ1sw}td(ۆ6mкu*'bbٷo_w.]xGt렊I<#tڵN^D0\Xٳgbr =NBDDDDDv>;ePݻ7faѢEDJ|>?[&l2vU]d yyk;<c 9̳XxQneVilO>7N1A:tXU dZJM âKHMM2-cHMMcNU@mڞ,ˢe˖"""""ir̎vlȎ~EDDDDDDvR """""""qEDDDDDD((QP]ݺU\ 9om`,"""""";EDDDDDDvT """""""qEDDDDDD((QP,""""""GAYDDDDDD$He8 """""""qEDDDDDD _+WתUX%0۶n҄=hXp]kD""R~?7>m,Kɡ(Jd`!55MajVdbղ BE_iN8[njpvm%Vׯg<:kKZZZbNX$RB-Y M ʫVa7I>R3m$'gh_ܵtvBȶ g}駟JDv+srЮ-U"4Zlɂ~ߦAycs]ݖ .x^bN!($l`P;nhIiiimM2N9(""""""mEDDDDDDv` """""""qżvvQ'ʬYrnO\9(+ZI8+lOJeg+#YrED[VΪU|>e2oz Nh%""""""ۊ^oy5m~-_xWg8/>lHl9M8~mI>^xVayNg?q ѭup{qrQ"""R[kFEd5Xhxmd(Y'\+X3Wq7̷XY/׮$b[=<2㹙bN"<.S*:^k^HkVlp.";ΛDUCrkϽ0֖ǚ ae^[K<"3I IJ,|9$1di03.zz^vfH{6h](T(" &W9mDDj#.&Mo^7gce|.5,o?PP(M7e]F.]<3F^̣^~0G7-2Ǖ7_Aeo֥7ĤwaQC~'qlfEv>G/ߏeY[u31R ˻Li/#t?12If8x;c9}(O|Gb~w)>orϾ78ouAú78OO߼ݕ|2r s ]'+FHsÌ` /]dBNʫaxxl4ǽʐ1hrQ|8q/Ў_JX0n~a| 6p<w\qK'06D5 #/gt+|; 9p1/< 7i@JsKI4pFOw` ̠Sy`^mF^}mP`0e]O<ٳ<\z$%%%V/Ȍ 8}4r|yxe<8#=W>Ý/͡4~'հ[y: XۧUw?~?e ^ԃ;Gq/1o&!M!((oDQqQb 6L,WqX9sg9/-N3$|0ZQ|K;ξpHԼ7}p6g"={sމmhI(t [1~eN?Gpjߩ9*{}9Y's-I>tz7&{\S# 9etu6'u.I_tmߐ$ &~ &M#pӵ )4ٛL_@&8";#Ywogg3g >c?I9Yz}ati РY_Of+]0emۂu[ !uܙkJXs@nu QD5ذ9iJ/‹㣏Wqh~tmǗچNi_^Ɣxx13ibc(?}o@ߐ@ߧ1}SqʹGW_JKzhKk%CZ/p{6kƊ++viؕkY!-a~nqY5de%W1喍6;9~dty*&zx1XF4b<7aZa|!Z 3>`ѩ.^x|.ط䭏Ҥ[S{ʢIc-"wmq&@ӦX<-$7/Jv=6נJ4df\lCzc=s]SsJ,f6)g{'ۓ1RXk,K!YDꟻIc΁7|,|kj~"<'ULlf

    ɷ ;2$Y4H?m8KeTٷVWe7K[;ƙ k-+",Ӱ}qɋ[10)7;(JKd:k/OgelZV<9z\X~ rI~?VCٯL>f_&zF/ޯwX)p XP숊]c%5&b17c%7D]Q@pǡ@0A%:r;;{vgvg;8!*d9vh]b#v%mGvm*>dş4M(7X>|8 %IsXڼ,n*ٌlCuf+p}qo+P{~t]!t Z9%\ͿO@ATTDD)>W IDATd,£Pu:[*O97tKڶJt;2F,9Ȟe!e=oM 5g/SA]ᡏ>^7kfz{ jT#Y^b0֝ӢXqs i&.D&u//\n \79?ZW'?47Ϗ1c0yssEN奟C5CI. G>^x{WM'[O3&*v}ghxtδ׻JA[$f9r[.FON7_o&-s/>IY<@BI9Lq_^^B\j?Oth2_%ΨϞ.D>È7$Q"節#F$*W.ѨKOOWTU5,pU]4OM|F-Z_{`iJ!,sl}s͚നxSRS5g/_.'60a姪n%KNXC=B%76y_ MG Ş^Si4Ն7mƍDFFϥ64}MCpy]9 <%}d|9nO99[T/}r-Trcvfu6k*ݟmrޯNCUs' 6nH6mJp$I*(C;X]Ӿ {WM/lwmRD={h){i6mQ1qD^={ ! !RUUM 9##â(]56ɓ﯅i#F$!{o|wH4M7qYR R (\? O/@(rw+<CK8.!PDIT\ eU|!w_?#w6;/_6]_N(N$IYamׂ]^p]E%ImuEWj"BdTU-WM8w[6?$I$I$Io@6o f,1 8wy$I$I$I@6 <Ur$I$I$I$C2PtБ?͚}ssCJ$I$I$9m& 88xD4߼,I$I$5$ݭ&rQQoa  fF,In"ق`p,ItGss3$Vėfn(KR yzs jԨ(/%V0͜8qOwY$Iw  Z,Kw4Pn&(KR UTsϱwflInш'+V!JtWX +zt'BF``^γo*(KR y{{# 3 <[@W$I˫@p oJҭ#eI*!!x{{;ϒ$I$I)dp,IG G$I$I$I %I$I$I$Ɂ|ƬXd1γoĽv$I$I$I K =gv 𔚖Ɯs SǎI$I$I[Lʥ &&UU'c/f;v@j~{<$I$"}$4n|K:e\ ;OnFÝ'I$I$ݑnž$I Kώ];sӳGOq, I$I$In7(/// :DzzNhz8ϒ$I$I$In($I$I$I K p%I$I$Id,I3D%Z_ܒ$I$Ilr kI*:A`=Bt{@2PʜqV\Uy*nwʞأTYTYY%ˣl9{Ye,n-nn\QBjq,F3[y$6EeZq- e\J,V+"=#y ˠ{&*S TuֲۚI<MG"ˣl!IRipZXMǭ:ܽX)JMMe'ƿΦjժxCg2m,{%I$I$Ij{)g݈C7⥋æPU_$MA$I$I$Ir8B_(iI$I$I$@4hyҿְaûn I$I$I@ʥCz"W;WWc,4,i[kՇRⷖ9m,!t](_5FC18'.?j;Fj<ΤfA4ĵ,]ul*UaNuֶiX=Ңu QAZ& k } @%Yj: I(ݕd\jժ(nThJ4/]|]Bܽ4N{T6j I ?C]k3lɢ T4pryT1V!\~7_nXche mGNqxN b:PWtB)̝qi0>N4 !̻[\xx&[/5-}noA NLW1 VMOy/*UZ{wœoTC퍉F]yv/2hC&p1a_^31doi^Bd6@  +'llc_=؍SQT.-|7 /Sͥ哾3~wiIw4yۛƍs׮ٱk'*JZWv}A̞7BDMt+i8I-_IfP쏹.hIm[ω+ۛz9;ifvj/٫{J|: &!z9իZK~>+ hC9Je]k<ˆ׋Z{l$bpFmZ6`V*}3]а=-W3W8uR#"2@*;\٨.˶rh5RqvNYPmǷn%^*W8$6S$k929k1b/mBhdNGjQN^%0ԅlqdfb#X'ky<vA6/8t ٿE]?΅6ܫ6yz@KǪypoϬf4|?@fkT̼!rѴ߱Idٺ3 *كJ-sr(4ײ\ "i\ʩLLsǐO} 5$q3qI >ڰ9N6' aト)MXw̃}ꭠ@C=Ѣ" 95C0"ïpZfTIPv% vǔp'Ԥ&eb ^Rњ0}l8X(w$ 俟US8B"7%0nkGױ}W.uX5~?WYO}&zj6l@V׳+&4]95mOxul._ǮtB6snB+qmŔdGi_771` ͌kۙO/?jz:%\9B/ jӨ}zRbރJLNDL*/eddr/ HbӐcq4Iy i1?+'qZDB5lߗH);S\NqnO$9Dhs1G洌O!Z,;Dvף [~FS'abv+" HԺ,ٙ%` 3Xt{:z &"P/hHg*99;uH!JF* ~R?Ğ{Z4MԩS$&&:{ޛ݃xdkhz}ע{HS?D~apm&| ?2{fObg͖5W1SJlzGu@=r:_?zQ):t6}ۃc>̢^gVL2 h3g畯_=H7=9 87I߹x[9*VO`mJ]7A{_Òm?[_ұƅ^J@xV.OfCwl[NPڃq[ɨ+Nhil%\XTuŔew ˚Je,]?Wv$}rN"[385y0v9jjSQjN&;.(llD3YCG| T ՌE¶W/ywGU!~r.Ci>feF=Mض$tC=?e3qFWuj]">LPNVL&{-32t08gɖtq?ʮ+b@"R2fvTy f>}%ĶΒ׃m<^~&Rl/DؓNZr&: UcޒyGfT}>n=)*tAA4s"W0!?IVFfk|ovX{ :Ə_04ӢJ:ƽws3W-̞R_Hڮa!vö@cn6;ϜezKTZ2F==mb2`fA SaD.,Njrz Ec]7N̜3V45k`,Be;P?gZ6>/R;gM?I+CcTq^bMemj\{,ܹyu{Dx,OGջbԲ1O̖&F@;wrMbmˢ{>7Pv~1[mZ2~zr;2r|5`݄e$fjXe#d5MRg$ѥ٠@9S$*3u;l Bz ;=Fڧ`? _4BQ-[W F胚ѰKQWjϷ 2}W&yAvckl+;y[0a]}f K[ÚH-4g|MŽCx; Km6,yV/j?;d츷ivqsKFu0?S*M{Cۨ ;z5gһs58 h]8MMWsV0~Ot"vx6_p_ccu_|;,c|f-IZa{[ &Q:8ebF-pǮihM"wJU~:/3ΓSE᫝>1&Ogh'Gt+_' Vo匛 je;k[.Y5{+?匛;ulX1Ӵ Μvûu|--qӾKUuM#iț4j,~[Oc;?#0z N~dbƧ׼|etb?L[sF1V2aT} :>]^lj_sopq. oJ}GٻVUv|3/۰ɱ 7D9-o }')3yg@M 5?NSO%>%YzBP__5sdnT}s Qx?G9֊7ԃ&.c쩮ɣ|JLh"%{>)cbh_YɄy~`e5g-v&Sŵ|5gc~}ڶ,KaC~u*pLdꮦ]eۏo3``gjFULZZ椰nlbE 6Ӈx]@O^~~ekjR>i+>MHMy}Z{*gsrޜ%+PD6tT"}6q0a[ٿn;?Soʏ 0i4*\ٰ/KΧlɊ`#XYE*H2~Z~I;< (ZՏ #yn05]s>߾z..jCg{h?O ATke!C`_~-W?C`4 0Zr@JӰF+[M5};I:(uzҫU%\VE*>"ޕTЩ^K+*кz?B+K-3OeFzr=#ؗ XD=+S'^' B:xx7X8sK:)]#nIXty LUE. CZ1rOj/uN2-ز.[`G6av.06s(G9݇0 ҷrt6 G %Je+"@6ޤ [DRϔ-;8{)" P*G^ޅ SIK.XPP{zN&ݝꤑm;hңOe թ[+Ьd^!po8sa>4ѕ@3ڷ| TהXͶLB%+# r#y_Ŭ|Ԍ4PPt(:CS9:a1ԩ.yBC|Y6%ځ>ݱ4z=.w/JM4)!Q,`ݨupq<شtN8S~FUтYZTrCo'~:5RRmNXFh ^,5UN{0'rK異gl8^#r)f:\.}2z7:vEaɲn)Pm)$]FO2Gn&[xҨkYzP3{]C}4Gh8 IDATZ EeX^±k:2 ncyX~:5a"^NF=%V+b.T ;R2]Fz%fVo8(2BŬ\>גHV}}Fqp4+6Uuꆫ4E0btRH~%MoK'3KCK˚'k at5/?ŒKh[VA)o$R& 9>_{^_T*uc i Fݩi90sPpu3`ƜEf -J׻`ЬeGtTmً;=n7LFvOTӨ >nr}--l -:a\d]|g_auq27<<]Ҳ[޾b0 pwhJ DF7%~? }l<|0H 23w wWb.E.*!(9w𧼿) u,>P>1Jt|ҏ_"gE"Q#sIB7SٓOǏ~f~x)@,>p~Gn'^cM-=ihLdƄ؜ؙi 0RI#ܣb `"6"7M$Jr}QE/rc&n?ѰcZaokR^Ó;0پ-fŀFV]:|.Q$}uW 5g!ӦD&L=DG@B#ܛ?@X9-F]hOeؘRޢAXx!ސ~0цƋ*<&ynL ;k[z'WY1jREbEˊa}X4/&|m D/A?A26 sgͬpU*FTNdc\4 WT 膫W2XF,Tg-:_U_E_>&kgʯ\#}uGW:f+_(P6r {LN=ɻjWcԟr6Y`éǣP557?wman!PP['ma,YD5֏~o_@G?!𿰊%LgtxN1/?ߋX>c:Z(艛E\|ޤsơ?c X"Qo,%:*7GŔm1EKBWٯ;53&5 1g]y=}y j=k#%;M2B;Vxko>L}86͝5U M4/gRAӪ]etOq|SG9u c0a :OGѼ9vً̟9x͟*Wa =[4'gB+УBi^^Jo5,c:`to=8F>72zSӲ|MЦW+gĊ |/ЪB;fOb zf}!m,;sgl1 o^Mbվta_1qz9/= ;<ÀvQ&ٷ!qIs8kJ_oNڬ]3XtW-N^_[PhԦ.z!05jMIAiVܨ*n#ѬbKQ_3ǯ0j"^t W$8cKMcjszAokN̋){?Ip%SX\=+?KmWwݛȧ#؅YL6ɦb "0tU8&gnԛ!v2~>;D/Y2~q3c ƒ\yuu[8;ϑAYVOϾޤ >ųco_bCJK`? zjfo`ڗ1{}g^5Ljjvc:;soך  c6c@űnLv@I<LWVٮFĚe|91Bӡ^4*4`$[q@6b=)ᘡ4W )TŜmAolfDIqqs]..8c^V넽k-!_E iSڱB04\<”J!*˙c֕HI[Ez[qUj:e0EQ,l'O<==5-,,L1b$Gv- !D1I M~2b-/ hzَN -[vyA )ߐpP9Ιg}.Ưa)8tERʢ" V:/8*I,l6Pg$r>6쓋ɯ YPvVA=#Qv\֙sX6NY9mQPE=Rv|| èANr}Z!aϝljnLhJx.w(;^q˪`Pϭ#jE,WªP\6_{M$I'eI^Dvϝ wΐAu1\iKKK,> ~O0KBnFN)FXܸ=i>]yƒfKP1!nQ;ٰoٸoߙ`YbNśҥfaI$I7 %Ik <[#N"p;r%?Oߐcǂt&my$b뎳rF|۞)UbE$I[Eʒ$㒒t(G4oK$I-QV^$I$I$I2Aʒ$I$I$I@ʒ$I$I$I@ʒ$I$I$I@%IW\wqr\|yt([|(Cdy-<~=!qRdHn;0PV0Y>x=.>Uq Amy9MAP;gs$I$I*+2$T<妺e@SQ"{39wc__YI_jSKX8'Fsu !πH$I$ITܙ2PPt: j-4,`fkIH=0fs 1ͽ2C6['ԃә5q1IX݂h(e?45 (F|Bqo@9ܗ~@GqB&=L䱏xkm,=uauD^1OC<Uo0bg#zynf\vbs<9>*oN%ʨgaƉѯj|ё% ҅XǏ'?$լZ!C9upRw*cX'$I$I$Iv"節#F$*W.ѨKOOWTU5,pU]4OM|F-Z_{`iJ!,]έPk`((%k*Pt ;w}jH t  MUA'g-ToM `t[qXGվf_N 4ы,_]I$I$I$I}]pc ݫgo!U!D@`0gddXEfﯞz e? @!s&fNWt:P  -B!v*oF 4?I*+lt7ds0O$InFʂ4ylgԇutۭ(uYHtܙtg]ayoZhN{Խ\+ˌ[/o=Jvhс |/>{Z彏dhfnO]DD#p4ݾdfj~}IztjKmh <[ڒn*I+>{ZРiz:㖛tmyꥇh#OUSI>0/^D6iظ9 {ȩ8ˏgڋ;X[/Ki 8·r}^KǘxM#suu{[W., Q2=ǁ ~>i֢ ɔO朇}sp`)|}ن:Yt237H5>טRAC7/+8᜸?a0aa9Acv|'φ3f%|"Ҭ#??yᅾtlKb0OL[ܺrDMynޔF9wZqa<#-i &ǤϏ O@ӈuS坯nzѶUK"ۓ(.;7cI#>2OˈgW'>M-Ic3zW\K.YǶՓ>[Yxxsbc, ye)uG%j6Nݘ/xoqmiXgl:!ޤA4EWޮ (ŎN/ҫ^B ==g~n d>ϳO3sfΙ;3}֮YgD3W^0+57&@8^}PufH7Np{xelu1?Ly;;)=pOY6FfgY8,fO1SWb̼0/;9ۘ='D}߽M.,뭾|gD]0-.Lg -X nQo*K&_{C ϺyKt.of?\ʀ {e?o=&~Nn?E/c#nɏa_@Ob3f6nd{I}{bϱH~X˾yys5C`ޝu. IDAT# s?r/싡%$~hY/,0Ifs5\o[NRMl9^#u6?~`|~#_cUD:P,76[6˔n|>y׳e<`#^+E1PV\6# llbt}]%ɩ\ۗ*B`2iy3]I} ԩ<;ɼ\ N潑Cեm;憗WmHg0t1_J]7M*QToڅM|kwuS pMXJgՔaLZz5HCxnQV(o^]K^z{?-|P̣3DŽntқG~\ Hw~w [t9Wb]ϴлGw:u͠{^eqjГJfn"_}9SnuxwP1G!-0~thۖ˻^͘y!1;m/߀~bQysvÃ3ORH04mU^m  F/^X ෍Eʺ搲~ct QZEz|,^(R=;%r:u\&^S{Y!ϱ1X̘o>u9Wu?W5 X*ӱksl{P"@Yg-wDmZ6,yԷd i Ʊ#$WO@Pa-2X_K~7ЦbKK(%o 3ŬZ)w1ÍGʴ1ﻉOG2,f"̎z-2g 3W&0`p#B)E ,ae.ggӋ:,'IN:^}*5sMqIRpf~;, NމL|#BHߍ7[>}myUlZ3{a&;8ú/,[ů^7_d*6߃o3U_2Wx-Yz׭eX䍚ZezkC~Kxz77X;z)MGDmq+7#b^d3ՠQ]CR|2sێץu~NuLd=U%. %c̚o x[[1+/Ϋİ{ WnKSrRtƗ}g]<9ao[\߭mks!4nV^u[c3[ض'R8vTjof3/`C:`$-cvg9X1멲v+τ臗Psxl8jPzR|ǝhـk+w+eN@bŐMfd2|{ei]56Uz MhohIhVэtEmblf, ӥ""8lD:*Ӥa,BPvu1krhj4GŠh Լ Lq=iY|@6FzlO^)]o{݈AKg 2%p:p3'g.& ZX1I\ynl!4.,;|G`IO:w@ǁO0'F mqS 3qbb.T0)<m!7W {f0*:Ƨ|/Det&f.ʖ6Φ ڂ~x%Rr?SyD|˕JD|<\[ m|6k/#b&J]j Ԑ)sx:]FuN(fJ 5">-W.)mytph1‚Y3vB'YԷ|p\w [ڐPVFA"&^lJA6~TwQ9o7M}cTNp._3*._p`r \O3~t%8a'?6 ]D$g"v85QY}7{gKc71Ҿ^ΤeNZV< -Z%$zؗ$3]1i[?,di7Br; $ ;*U-Z18, I3_d@TJlύq7+hC lHD$N9;nҳo_H%RX8{_o ̲4+iu |Y.ɾG0|e=4"v+G%G{5a|O^Ap {ϧlG>ʆ&1X:G(ʣXp1!}qu~jn7namX:. NWp :yIyiA>#NN_g{MhL&,D]5qӹ#B?Шg0C2U4&Z;OXO=i*PBѼ8bI=bN Be}m.K,a%,_ S\hUжzKO~PChPʠ`c% Zٜ9&~d&?1g=LJ3>9y[5:4~Y$fHIݞw~/bʪ"xaKec70Sq7;X[1tMTY.f%u19jקVˊ ҖaeWӿf+ KqƙtMOQUC|7"v8!4L&3z\yZ̦]og1k]fM Tio"#6*&D"2&<}&73ݥd_GL^gB^ֳ3ۈؙf% xqȴVڏGWe/{4V!q1b%.Wn˭uLZrT[MnГ1;Pڥ(BYe Ӌg+2<cӨݰ#C $AB}oG>ǑO0}@jXbp*mWb(q㋑Ud*n\N'.@Wxpo\DnortUm  %{Jƨr:qI޼dz0@%6n$( *dGYw2 JMu0nWNK( ҭB1eS@z28|49FllM"L2/}GK~POfOW?-|wgeO)RYvn?߽w3אT"┲זf\/@z;FO`xa';hмfSY%/Ñ8K& =gH0YӘ:1>w5GR[,9#e릍cҜx$wۧ<;vʲ1Ԍ>ȪG\/Yuem<{\Cs{=x[HY?Lp>.keY6Ne]~ǧOo9c~<ՙ\;76Ncf2ѺO嫟لŦdՋj'yC?1ؐn {\^^W~]g9K{`>c+ -ru+ʶt9}ܓ+ wWǡA_䝼Luѣ>d+:9׫*Ծe?a:ѝMUI5>6o>fʏFnh}?Bz1Jxj_"ZobIV*7ybկ%ȚԌ9_S~eIPcיּdtL\KFޫhY~((bghwM 2<OyVv7"jWWn}ȏ]!{l00:Y`RٶbG U*g,fW 檣OqOGK.|IL kq\7&u#e \se*G="WVyЀO ;d ~{C؈ْcbX,iK^w71S@FSnKyox͋M %Oߴ#IטsKk0쁵Lv-pҜ_㟢NUZs7ryR cF\\.9bύqW$?Zy),<t^TX"}N`IK>)Zun<'ƍe@TQ<>D{&}G {1̷Jj5J-K?'2Gl0Rf8ƽW}X'z!1$5tV#ys}+|XFGGD٬Y39~b9QV\ yφhL,дLezLaopJ:(zZ M ;r(jʎsKn爽kDco٘ЊŮ#@m(e]7VFs9MQ½P=SK)rJ̯Ii^FBP((P(2_ʛo47]ɣz^ BP(.LPV( E࣮O Ӵ* BP\ (P(9Ǵ[BP(K BP( B((P( BP( EJ(+ BP( B}r2ߡYP( BP(u,B"ew+ şB + "PV(·~sφ)J+ EH<* ˇ$). PV\@AbBqQPPijBP(zPV(u8+ E8\2% B eB_ ?VP(,eٜs}SYP(. Px^,YŠ+8q'Cx<:GXd EM0B8 Д~2+ ť=z4DJ:FJIRR3f ;;[e%ùss^I ŹK:7R!TbYP(.RP>RJ&MĤI|aa0|pN٬.{2JLGP(RBm)QIJBP\(5vLĉ|Q }ˊEr)% &.%^P(0!+%ۖ-ӑ\`VbYP(.>+;v0nܸHgYeɡARPJ/ 4 ߎAaBeIJ,+ ERae/xƒiܸ15d2G7)))lܸDQBy% %2c) ϧ 0#lP ؙ@,ZJVJ,+ ŃR`pY.\X3>rH&LD2̙3:thXV\ԖčGpIz[clޓK'$:;E(iEh̼e97( (龐$D4/E"\Y |S=ܤޜɌ6ʲ?#In3f$|C--R%BJt5dGRDu9EVK IDAT:`?W5q*?YkhDڸq :naehհip&͌.C0qKd25MhQ/' ⧼´e=@YEyksmgh}bI@%V`e6;yΔBInm`KRӎĄno],_q"PB(<͐4R렍4b9pLdx@9˂(&%YN[N |0fX>njF<|N~7򙗎%#\MonAx t7t1qWe2%MbѺa6"o UVan.ega7 x{O`t3;-" /÷1C"FUJ@zt~{U)1I3=| ^). ʧ:ÃTB~) 0}}.{\GGqwv&o,X3N4ѵE4#ZM4qmHg/Qv"(CP/AKɷZ}4xl0kLxI U֑[ W_%[{8탪l"lF*94\9>|/AXU->d|@rEDo(iY (+LO1HOR[c]M5'N,#?ƈܔХQ9#]jtnM<ۋ+;q6 [DrF7!u{quej,pQCJfj9٘/iRSrp&1ȷhS t87;R% UoaylM>~ٖ#ܜG`H4<44fD36z\RO#y/GB?xbb>F2*mJs+hq`SOxl͘>ޯ#6Frj{&cOI*Ո䵶$e#&ZDKmlId|/tάL; 6$ai4:4a\+{׹9yQ]@M9T][$7jԈ 3 ?\e2s?~dg{rp] D 0'G!t֦xF+]2ͷ쌮nfF>ˊ4^&LBǝfFVPISmi' EC/uk.}(tpm"~T'N0QA."jii\19norl5sS ̺#G6c铙HnL^9!1/:_ѬS*54s=/9ixE6:J#ig]gO>U-7|rme3&IrzHqJHŌ-n߂z5"z6e'ߝ6RvɆ#:V=.ֹU#y xKc&ƶ9/Dy~ 74o 㨓IY=By9Ǔ,:]'BIq֫KY> =ЄMOǐS)<*{Du}J, hfVlCnw/6ΫvФ=D%ffï9uM$rD.1jL)8E! x>UO T8 g_tdBf 9 IQehP<{BMj;MƄ߁'9: v;ɱtx:]gK }UP!&{QVc@D)$ǜ@z=k)ǞFr~m/$΂ ̵0@iQX.EzY&y 1Fy,6q+4Kdc@ж%C]17;w:@X?3tf vjm$᮵^-fniCUF/7POK%!"l<}ܽyBk5Hmcg|[+w}"}"αc91} nůКo |,K4kaU x=E>KDx}j&9e@HGd%9jCgOft8,\9 k ER[իWg…_P4+O^E/1o.üL%]1ufl-b Y"Qx>Y/ ޽N';I>K ͢$CR' 5ͅu" !!i",5"IP(.XrsH<'#ّkCƒouHBŲ*dy$(E3ӳ`7{<HrN }*perYy! O":[#/3%-"Dcۃ^2$S%<.$, (6ZsNq'aVvND B$Dg3>:Y4RrِWxFqUl\K\eV'`4=Sax6|h&rPx./L%Y?w/3eS.^;+WG9RZ#[G,^;Bk厖1@"@l9fu#wK+53gO?aqj(>0 >wT1$9hy7,eBWfoዳ_>NM_qhU{XGnpy&ZkFn;&'ja#mGt#H4 @\"HV(!H QBY={|&V&ТlT6Ze峬wZФa4x<6|OdأI5Do36|Nږ\Wg|,REAQJȢn6СC6lǏO?@N |?=BX GFG۸ƱL^@ $TVfeVXL"@<,6sM=3qvnO"hyY U1m>?TM!AYз\H kjIVii#㈋՞NLa'PRd|\u ť@-ۻweΉfҨ[莑r)iX|ܠcC;ͬ4A/3PL&#:+WE ,fԵ&kv0íi+wZQvn"RyR;68q,-x8{%< N>ؒG|h>';Ϟ_ K(f]ήT7Ot't{pm1K otMb,ّ͔Ԃ"5ri%guPW! lˣJ(>az g$-.m'xa?+}"|Z8.6m`f>!;h&/a;[MjˬvO[XGYɄhSx/=;yT)ѭT1LZ_Q~OƏ/#DNNWHKKӬV)//O3 p8,^ 5MRFK)g͞3+< [mە].?-RLl]ڵkݻ7^yX25j'OF y!jZZjUfn{Q5QJSK">m2p@Z5kƏ?X6b;]+mRA/KGy %BM )SO>} h"F?&L@ڵCrQ(.2Bq)J(+K=+kC.I/˓ Bq^H):u*-[?v-.z|״lْ7|ӿvS)=HO2X$2BP\lH$`y?(x޶UP(Pf<ƌ< OP\v_=P HB eٽa Bq^?PuR0/^CPO @JRoP(!Ґ,ZP(1ʣK/*իWz8`L89_ ݇^~`szV)eq B 1, ?DQ  B4i]vov#XjU1!]Xru&5c#\KY(73 ^u|>fW2K, CJfr!uSGY/"\>/?G/]ǜ &4wC/Y_TBQ}0͘L&f4M+! %BP(7?h"6mTL<vW^',2zӦM,\Aw^ ŅF g΍D[q;ha{[d֟$"#m]<žq"ˇ-['!DDT~3=cҠe$̊}.juA rbWm$❒W$6*5iCjvtzjݐ `I^2bǑ3x,iвu, طr8ƾc[+ҰUKidʂqX`"ҩg3BH7ir6߲t0QsnIJeYtjԕf );VP jhEL/Mu.rBa,u5NA$>,s{E6pwfБދ.M+(V,دXZ M:RQ: BO#ݝyMlvsٳݙy9St,s]v?/fYJ~(ǥ+\N9 2쾡h)Å:ʶ XCtwmDdY+ϙ[ TVf s=mm0T[4ؾoZמX.έH$}Ĭ]`;qs2Y{ ,Vā kϨGOKBj[V< !H|3gά(9oj}| ve˖Θ1҄xOuPyZz)!,<|q-IډXu;S3iJj:k6[#i765$(Ezzʕo]MǨyoKyLxg>;f%&/m]Ö6t8oj\ߚ%|,YG둱AqAo}[_ޘ\? 6`R^@Z~\S3ubO^[o'^qp`3R\_35Tw A 6o/&Y?]aTxWοĬFZIArwHTl!n$@BK&ӭ[39ɍ7X!7Kb=tgFaZQ8psO*5SB芈h swmPŨvtoM.\ IDATA(&VBf͉[H+5y?ݏa޹.16,_2O`S+}ma)IDj[)+TA7sM-ѢR]PPK71(qggA((PeL(d}8ÿh+}qKݐ_8=IoEiv9~]< jݪi۞>]yB!.(TcU}gʮҥKINN>r#Tw|^>IT{+ٲE vM$^?#h *2DRhutem:ƥ=Ҍ^Uod{%nM!ŠqJI{tttt=z0eʔrigCr).grxN΃;}rng IVYLĠu@o'h4)PZβ~拏JhY;g^rrcꄲMgP-+ l볡o؁VQ[XLLoL`t/!/(On=YC;-a4ۚj5 &;ٲ0iKY} j|"\ys OlGTY[ݾ= k0OlL*$\Moڀ9) DH!:M|{&'"9JHHM 55]1ݻw3a„Jk>.7Iƙ ^0E6CIj;N]; ʎR~8Z` Ia"])-tƲ5hkrOwoi6Sh޸cϒG0s!E@Duw@wuvDl\s2Z7úg|Y'VK:5-b1@>aϨǴg`=|r#6^3i+506;3̆;)4צS=&5-DJH\=zLr !IP|&!(RθqTZZPyyy*99Yeddh6M ðX 4-4`4ÿ>{J]Ν:^;o뮻uEEEX,LӤQFl۶\>+Rn6k0*̐'7,^JJ e3it:&OW_}I?ѬiSEyɂ;-}轔~U8NvK֭N}Biz jbz➌g~'/QP!*{f6_wS) QJY֒i@mڵ 6FƍЫ#]H)СC+'N$++\iX,*<> =oC={2 !B!}$Pn Alvv6<@S1Mxri\rvY!B!@( 4`ȑٯѣGSXXX.2w}L2#GҨQ !B!p$PR<3DEEK7MO?3yd 2uTڷoχ~X:""cV-B!’YXKHqm --[n.2QJq!6mDaa!aT.b_ /w/!BH|t֍~{\ϰi\.N8U^QrR[t]dVo@!.%-B&{(9r$SN%$$78AAAL:QFU$L!B!CD4 Ē%K֭YwܙK,B!" #]v?ӦM[n z5MK.cܹ4mT&B!B?\|6]J)ba\q=z{n1MDիqqqhvF=Ч{o!B!UM 33x RN||<#F*(8T]W!B!gOVYf0aB{R M-g$Ʉ 0 \i4k֬\B!Bs'=UO>̚5\o𫯾ʬY[)?> `۶mU{MttYB!B!*');sp8 --45÷5Mcر| !B!87aB7n\@ge˖қ,Lѣ,_˗sȑJ+B!B OA)?̓O>Y!X=<o!.&i2o\zIup խKna )!..ʖ[}B > ];v,-ZGaΝjժ4hot裏2eС<ԭW۷3qD#xװZ>%0sA<t?Ѧ5vcwZ#6 c ST ek4MoҥK9xaiP> ;ęr:<ϏdLLtB!y#4ҧO͛Ǐ?ȁzs: t҅>}`e[2 ;nsiܹsY䣢hۮ7x#7p999|X,ԙ]Dtg,c 5~[?6;t[!J>#f̘O4+W2zh\.&LSN\~L6sw4łNy0?ڀh}{ >JV=y-ǼɧsבZ:^0o5wJIP]xjbuܙ ^{ TԽ׈0?r&DE/uF:UW\j֤ ?;wR3I)E~כoҾ];W]E!8oQ!$G1krN~^le*n Ȑ+3ڗQΟm5ڐ}"Y$68c7e }Zl ٟ%}L]1a vgq3}}ӈԗV{;uF; JTA(ҷ4x Ww? )0 >*:xS9Y sv7L+.*kӆSi& (,,.d[1Ѵo׎oo1%B;B?f7ޠo>kׯ,4M5kĉۯYNR߽*t{щ hY>֞jv F?o]=w9vͼM4j+{WG\1ŵs~b3Lx IvkStQU0dl;m| (Vt&ߋ;c<>->Ë&љ=v׷<W\TR 80f̚EvNiM#FOnݘz25jS))$'&Wн[7ƿ*k׭U˖B!yϩP?Te%V|-(t7P**˯繾,$ !@Yq=0B!ӼB!B! F޹v0-/0Mf=L;dwΏoc (4L\1C:a`Rqp!B! >fv(q6P11Wժ $64|?wD?rB!B\0ހ{Z]?W~hJbuVkAX_.]B!B{SRXl6l66B=[Мysh_49>c ot 89M܍voԫ,:l=J9%,דR))Ǖ7]|Wt} :d?#`̝3&MpÍ7*B!BTIzϘBӽd4LLJ؟~*t]5 i^B/ ~Ai:B9g=$ Q'xaW_Mjj*> _~feB!2(pSM7J9#|Oՙ:#Ҵs!V\ѣٳ{7g̠cǎ(?Δ)S֭;w;Lf.31WcGXB=nNr)^{ *:.tOa.[rK?i]KrAL$:*Ӡ~}-}_z `XX-ۻ7ɾ !8/@r =z4-7駟Yf<}݇{qԁ2`wMѝyܲgԚp<~mfw@d{ٽSU d^y%6D)žtbXx15:@9qtM#(%LdlJMꫮ"V-֭Ï?֑#[W)B!%Cݻvѷ_? BPP~Y|_zO4ł?O`~&.(Ǽ70OUά'^yo=u1\OnI^;11i?NG|\ٷ]_'mx]b*&2+ճVuљ;F gn!>%8Ɗd⣬ ۏ6^eU aϳ,߀,0azѣPn{i:; =m7˒%1zh:\2LSÝCn1#>y&EAԤ7J酁;~ e|Q{"w4ַ|?g{x<:qg. IDATMɼ. ȚNjN5-ϛİ`8t%iL6aoNc™7/^P:#n$f|5zT8Oi̛-v>ț}"}L~)DfcWO&M[%kz 0~foNL ^MV4w#OMÂ^סxÍ&ox}5o|‰hd=9aю^G B [g&I:tѣGpSsu0Fa$E[OM!.rHUz`_OE)k5]"4XP0ML r2(wʓoRRh_.VPvT4ER~D' g2ֈwl[ԚYemO7 +sC2lM?"ЌMR'ZfO%FEÀSGKoki>`=p5~M]u(.gW3k5繻==KY'رcͮ貯ĉbs`2مQFtϒϾ`mf QL}jհ^&&&g0wzbogiD]ޏ{=@GWrvSSA(ҷ4x~T~D:\?]buEQvve?mġESXd 5f5W̖mI('>Ӊ5C'\Tl17^+/ i%:>tJO*lDFDЮMo#qz]:5s퓯R;VJ) BDDg$3+ Xnfѽ;L_eWpjMrDFFibPV-5ZjD!8g)gܸq*--Medd<2224ͦkaXihfiOoy֮[GNV,]͚6=wEY]\{J{?z/a[\.Wt{>ڴnu˗3zh@D&L@.]θrP.Xyim"lbf|=\!Igfu˶?fzbd41 rt\. S'++3QPPNm0 7uᖑ->`b:皦[RҠ;8@Y!.(R aŧi&IYIقr{͟OfVÇGf70` s`Y$kKb%{ 3o'?̦fV$[̞ߓNsoKXr.[%UTTĆ iժ%.[z!J}T[}%fsOϠ6#)1tB"HHnHä0T@,ub glֽDg/۟Ӝ(} CdddRTTAAԩn';+Pt=(q8Xv5j-BwwOU\\̖-[ذadffr1rss1M0ˆQF4k֌ b}ԅ._޽zߘ3woViO=Nۛ\tp=٠)ۄ;?SQ:ee b?IH;V0P6M~ۆ %AAAA^^6 0؛AA(8hJa䵙q4ؘB߫Hә6m˖-g*kl6:ubС |ɧ9f̃ӛrf.V3͓C=CqץVȢտq0-5lH]V {@ ~ soJ͢1=@bj7il^3|Z<%kÛYiYVz1lMgpIN6n<'?ͨ¤fm9Hna .NxrSZ6#k;1Yl=Gx>ݓwEQ}[5P5,ٙA^ [xM.kވ@urhvF\‘ntHpw<9TjFԸvېʞB\Z u$dh]jd2)0"ӄe mf]>rjdݤ8s'vWi "V#֍ƮۓƦ8D~6$;`e16'NWIe,ʬE߶Xwt '9Iuj iZM;8WC-~vg`U}/D\4O$}+7gPeQktk}É'hҤqىZM0 lB6oތR ϏI||OnGjo&GV$vM~~AA2B Kek׮e̜9Y>-,,d,\1cп{1R-[ʙvV:!Nd9Lc ᪫*[G<3͞YI )ٳG k1H\س?z${7&Z?k8܌νc`_I Fx .L']GDX)LeϩH!YukrW 5+wLtg]hW@\Yz]ےa!EmBl[iY{u^`ܒ^ ]cX)9[HnՕJЂ5uCyh߽9%lMlX!*li`8Hj [ G_k8ܜνc`Ͳ_I 8n{~mRc/jhȊ_ kFYM;ӷZf^3ʓ_5vcoҞ^ՂЊij~tcJ0CX]inQidOi7NeOa;:h85Kֳ4:̍Xe?:Ÿߟ}g_؝z'Cg[(LeOw9"7%M"ȥZh&MӨ_.WaÆyETT$͚5E4JJJ^yzhFHHQQ9zdՄBBO/9&MN:tЁiӦQTTa9t[\\w}Gǎ/xk>] q))QCٰQTO$0S]?(95O7d} On7\7Q,uH j)$V;3):zԭEӰ$_Ň䩛B~0; 6zDaxM/K%0j$Gg S">D/ȧ3oiOqí(m.ÁZqhN͚5X,W^׬e5\.\.W؋`ZAd@NHHa6d4/MuRTeB Vl ۰[hܻ ViR/%E`,9v$wL*Ȫxn. $$f?wP\轔^NgYt:ٳ/? #AV֔KnO5B.2"+>Q2$GPҪ[0 8 rW!>'|vMq?fAv wHmlIP(:+0 {q%z0a64eRu&ċlܴ՚nUG5fKtu\ض{ Kwn޷uz}3`&$J) a[ [3rTX fnH$6`0٧饺ꥪ^|^Uu W/s=dsfFg0ACٓw 1{8gVdec N]O(l*Kw$G/s*ͳ?3 _^%s2v,M_F),tV;H3v":{Sgo?)#߼r8y.\GXj%*33twu9rΠ\hx3!Μ9{CR(,g>|D9{_#G?8{=r ZcǚSnGc=r(bÆ o&///p…ZUZ&xew^,)lO{7H#7oDUhϚՑ<[=Դ`QQ[oH>m^U=HY$^ ~x;c.ҹ]&yskrR A+p^ЈjJ?Gǒl9&? bU ]VCg;xxf?^.f>!Y9clKR]88΂۾LovBXqkٿO/|-" dr}bPD6+Cf*4e7G?=v/񯰚kohk d D_Gi=sڵtİ IDATn3^lmmzjB[9>LPU^y5V\Gsȑ}x~g~VDȍ$I&bX;ꝝIV'Nhww ֭[~2vSZF {Sa?9>ϵ'h#G @E|Xw's,(S\Ҡr$4n6f^asfX }:iϫ` [(}^̭uwn~ kt`^sɑ#G9r|(w?Tv4aiAXT.Кo/#LJuLR:X++ f9rȑ#G9-D9]c^fٛt RT)Svpq6<^>B~/]O}f{egmkb}̑#G9rxw5^%[vtSXBT,R.U)U*9_cݎUARfq:%Ag35 S]E lWl/#x?ʑ#G9rъ(kqa{Rr 7 9slDPbQ(/~-b{Up/)EVxjp K蜹ƥg8s}w_,{W#G9rȑ#G9QqW}w/s[Tz0=;d:i(* B!"Ξ׍_jckw6yc/[6j*W2v5?t3ȑ#G9rAe.gLLS*) 4ThPabb˗/s/]1ȉ#hOMػgnpW/_̲E\:{cSLE6o@_+]9rȑ#G9r主Gsu,G4 D.3]: =]Uzʝ\|ɛ7N"ݎ3^r$3T+%zJȊetvvrM\gEE=tK3ܿȑ#G9~2$Im\Q:lɉVL6|m\C֑H@ ք:hWߏ;Pɶ%S_kGz6BBuT@b6T_,-ff P45BtڱvT̒o>{MxA3NSMy3}m9յE};f;[5/iїL[W8P+^mDn׊9QqסP(P$gʁՎ2JčzBSўn$sMx6_=`oJDT ":Xdz{94޾BR\X#G9rI$0R:%4i FؕѰ!sE+HIjF&]-f|`{Y92kp) }ljߦ4\M=xSPa;ʹڹ"^FwZK! ~u I(ݦdL%hEQ6Kz lskx!8#S0P!Dl>9U? &\?C(࢈la?]{ RJJR"QՕZ3{̰|-,/\Vkp.^R. .X7T` 8tN4QOLq5Tc%ˑ#G9rP$tuS:-n9A&i#!hc) D_eIGJ#w Dox7(j827|Bbk ی13JI/4+\"BJ`xjjg#jJ!%W!W~tSqMӾ`--W.KĻAU[I33¹C[C݆`i_Cv[RJf@R_4 vQB:(XLPMp%@Dsև5 !YDQue> D9]G?`zGVlqrRLTX.SV)W*7ozz/'&4 .]@ F֯]EJe*U>2/9ʱ03[ۅ%G9rBU1RҼZZ}6ۑX( X]E ,a۪5I{|E.d6s ˆȭה!$}͚̍,lvA%IIO^iMьAneB~ ߭ĹJ$i?F$6cmAcl곕U"_[9LWM"x"m0<RQ7F~ʵ9QqWUΟRo))Ks ]1(W<&F:rcE6>IAF2J'mf ޾jWt*v9cdz[?oĵ_9l(V4A)mv"ԸP{(+EE֯^Jo_Q4a"js sYpPtqz&Ë{(T+ԩoOթF[WFLߢe|P?9rȑ㣌 hD~S%!O?vi6YWh;:[Ӑ KBfn lEjIFEfhA@ 9Ei'iЗlUmdߩbYCiq1hPI#Y,=Q9UEE+j⹨z%>'Ȫ@Jէ8{mwuv= ?as-斸u44y3K0P'rD:ă(ɉJ%Q:_L$BI( -chm:8rbHH}e"JqbBz=wJ#w#GH,aƍ 9rȑ.@Ĉ⣶z!CفE붓hX&q :F 10ĞtHYMlɷۨ=c꟏طŢ^Z1bXTն$xǥqOʢ,MQO8Sެף8-+zCH(L)a| D)SYܛ@I`i>FjC٦DGbvs)%E${x/ CE GoPad PɔY6{ vmbmWfNI$BY 8g6ϑM͵oA '9JQ&8M-q6HbS(pmN:,=jW/Lg>_OZ6;B "$q("}<]erGe>u/(n}J?~ĖQ9r|ٻիW۞#G 4,IѬHVi#`KJDHNrQLjs-ʫXTH.cύ J{TmVQ"N@m'fȵ=Ħª40k|fPaOɰ繖ni"4Jk@8-ObrBĵIt %S{zK|XZ\32SKt9س&J۩ 5]پl5f~HmSY.ۄ7l~Sġɴ( ۾V?%{9r|H!Q~W @IL78X)6jJ#O"B^J _Ǫ<}M) AzO~St/v?Ư395ų_/122.W_Gm429#=Olch< ?˧f bul۶ vsNp9ꋖ3Wʕ+W9(}[}aǤ)AH EA}],mh܁W;TdMcgmT4Mv~C#5.=;7☤@"rW(⢈H**U(#&k<[#"MʅNq]E<;{>* ogxSO8yo~KaÆtU|}kOn_=1WL<],q 9r UF07Ν;ϹsXf }LNNRsߖ(χ87 slݺNNرcl۶w?TAP4WA[N#-SQ y 'K4?-$6Vaz~ 6MDL_!xRiQXOaq`.LMy`F#Ye66Հј`5JsAWp8cAN9>/8t\(PtgeE@ʑs GN9:{٭} mŽV>XljW`q@bgƫU0!:m6<+ۄ0>,H1Ѽ. PU<*wڮruNs^\LiIjc4nGc Zн]A qE/ăY qWpfn %7ifdR9T/yo|7_BDٳgg>ç>)$In}1v]ޱe1|qoWN` s*ì>'u' Ogs\Aw[wme:E; j^'v,6뜹>ENlɮuIڷ8ֱޫoqubZG:oMF}7tYw%OOu.MwnQN_wk]?E8'7 ],^ٓ{M=Z W?NjWģvW"RԨ0^voYBUꌟ޷sm&1Ȫ;ؼ߹}իVɑ#GXb4IΟ?=ӞoT,xGk$I@9֬u ޓtUf=hT@8 q&PAz*BZ?#acoxud"mUh8'B5YFPt'&e"AwJ}m8@ g:5WT!=,5PQ"rBev9QqW#*wQZ(gQw)zF\.6n/"Q!rb_}$39I98ٺ7.P? p?ʗ?';˗/ѯ327UY6<]y_~#'oڹ^EW@Q=1u"{{iQ  t:y}WѧyQᕗF?#ėoPC9/{bTD}}s+V^͛,]E033˅KؼiR'f6 .]DoOO{V(jӽ12;s {0lpH=T] FE-X$) bZ]"zJT*.?\a3~.] R4hƗ-kqGG m^AE=#ʹ[B! ZQFv =>ȉrE9{aiʕ=]U*" HhČ3]9Z8prkY3[+tTtwvp$v>1*yg타 óUɏ?ITj#CX\Mi~J"=a\݅OAGbu_H5+=vSqfu]hBiVDt V{iZ hpbiy_^Kve! 89ڮhptaVq6^@wg?Z/΋gg]~?Ҏt-gp^ƕxe꫆rnì-D,%y*hQX=[[Ǥ.~40:#Zad&vG0sHE'a^i-}QD^tE惪jŊ1i睓FkazH"@ʲKX|!GIB DAFnSτm0馼-f|dmn(keC'V,g53%Po5u9Eh++#5Xf|$[6DBעbMMfSkEj-ѦX+I&nXT]pu<3p yM9FJE81,#&Ph=J2~HydoMhggf8&rzI .`LgiC1BZ$qvu9GESݜ^ufgf~S<ƅo19%qk IDATbv.-i)b^a^e&R@L42z;Rb:6f-Th *QhTb~IIКgׯ5fk%+T6^Qj  x`b_*=ZQO$T=膈jLm6F:vSd7IXI: VfgIhNu;'iFPx^v7o`bbb$Ipαy&:;;9vB_wjIlO풕`BF!t&r .9$ԶlBpjN7rN|" jE$@jG^onJӣMX. "ΑNWv&곹ׄǪ_=~%9Ggh- |ߎڅ컲{L)w,'"lCGtKKEzcl(5ƙi`S`7^mҼШQ!KG_T3;-ߠ>׵ E*j#P;Z|.0{ 7; !@D(W33@X)affR%SW <*-7ݷr7Oԍq+ezw-K/MOaz|/MGqJrDᢈ?Ʊ)yJoSgtny)H&S{bxYe]K*XobW9]<##GH{Uo[/U}\Ɠv9*˷mgrhI_%[V2FW<%xx!}MѨLϲM_Y{Olp Z)Q_HvP`hlܳ~0u0z¥vAJKm<8UJå<1\b6WC n`ޱ7 fh}ZYnVz}|31: v]M{{M5 1KA+p_ЈjJ?[A*KzmfQq G8qbW^ykVuĞz`a.+a9>Ha&IrbM`Ï<Ҟv0vŏ^|1z'?93D;iBg ]yAa+|S?@qh;>ѻr;؞u elKv~7:ϤT%w}%Oiuu!~^aG? sYioih;O}>Hwngc}.һ^[y<V>WM[\wEocG:u-<] J &`껟v,[IoOw7;|;w;_lP`}|IlQ ) 59A)Hzu^/.Ff̶'MiZug1(+@æDJ^ҿ|f/^ J@5~7!Lq{U=r|\rg}={o~Ƙr [neΝܹ'x[ZG8 nTRXC,gqO@#@-.\d2"PKkS\U>E,JQ?_(.mHfoBYAcH⮾J2 9wۅnF"p[?#>z2 ud.PZ~+wz[n?~ nS>qQE$񓌕h/8 qN=rb2g@ޜ:aAwμoBy -dKD$I8Qqm}|Ig˴)#: dCm׍آ~Vi(v}iFZw>#v=2F$K[d7C'b%5DT'}jV$Ojpe'nČ]qY9*A+4m2u/x:Ƚt3ܵo֘m&$eio{K R2-@P=Ϸ\eӣE°+ܼ҅Rrk'+O}^cG/ ff;fT|ak[+fɈuS"#+],o^?Cu:=DS[h~!' `tt/| ?^c3>}o}[B'x9kx*_ N]TVtwuQP,3Sx$5"9(F"P""NJ8Hִ^dS\I]Ck}܏,YNj7M1I"h Qk )t>v @{#G9{ԳmrȑD7H:$PpXߧo c$;!4ٔp`4[{XQPA"4&Qit`K2fx4dl%'ɡH %7jl 'ݞ=j '8Vo0N@{S2t Ykn \g9:KJgRBUO,_zY3CA<M|x(Eջ͟?N1um&iƐ!V_I=ijRl]1P`HVI9EODl5T}˓[^Q"U, ;M[?DyٳN%q|'MQ[&wg|:ƕtY\rTeG(L6TE8J]rDB4^|Smp`?`t-hqe(vAD Hc-΀+A<< 7$ y|ivҪG9rs$I8(u# /`wpPMXmR.C[##XiĢU-V ,BS1mV6}K» A&&FB}jx' D,.] Vg*@WP 3W99zQ9TzQ@\ 4f`fPW7D$(,q끳ډ4=Ԭ6<u Mh.vAYJ -j,'7Z. }ʈiY-"@]TDmevi?ҳP;BzJ[P=tk ],Q(vFNpN"[3Q.8K:Ke(9(r6QE!VN~,KEF N5Y +2;"@ (h k ֯"rȑ#G?6lu$(+`lu׌ r`e+yM_HEHlH'xM (+iCm+Mku X8Ll~EiII/.օ\#Mq MA[#,`f9tOV) B'L(H+}UA1u2o- S>& 1=-ШC`]b^h$4bGfJ Y$jm/(!γ@S@pX=eS7}2T9~vouSaQ2Ksa|BzZ@z@\Ca}s4AtU2σ~"'SzbَMc7j<;Tr]EHpN.łU*P.8{FOJ=W$Xl- }p!6N DgӨw%(V@K0sfm7δ6&G9rc!Ič4HQ t=SH&o!"$%|P ZC(M G& 9&:<0f=>@P>bg_J Aw A'n!4(L¤FPkܼ yh *0Us (wJ[{иYHjV9&C݆@A: 0JZh rx0@EGdB! FU~_o޺9Qړ{Gc oo~:W\СC ;ŻNa髳\+U""'Ҋ"'B (:G)rDPYqEI*:'FċRjq95R $1$ut]_up.4s Fa|:I&Lǟ#G9r HT{a_2sCJ|4ڟ,L")?4s']+jHK_@' :U\WDkÞENjEktv:>qtLh8\d"0IQM9QD&+RO'<'4۪v, wށUꙹa# 1 YPP@_]PAϬd/ b@U# (`Dd%e;S㜪, H?}9멪`mUo*X=p}hzT\'W>k* _Cx IJCrKA-żJN4*Wsgy&jq's-O|%4LdӖP !P/zы8裹[8Stg~^L]%+H:2 N흖A@(,ӈ̓qYCW3xf^g2o\FaF5jԨ$Q{3Y#l16Ȉ@nW70RX\ Dl.h~0je4bz6}[,^uɏX$VBIFBZ9FT tӂkՖx6$Q(ډFF"#a}'7,E04φY6KoQXX ρN۠” ^WM6wnG:D_&|JT+~3%erN9 <c߁GЉPإA&tڱ*tP*"e$ m? Q`AgX`ĸ4t}ݿGe;'2 a5jԨQF'ܬVF1p& $"R YԊpאc4= nHQ.R/HcD(pKXh6Q-S$7s:wC*FL$7e$V2PKdr+>C1y$$cC=AYȘgAdQ{i`#Ib*Aqa&f5f 4E)h.^5/3VUXn׍JZ- ^XP;wS IDAT07ݶ؈mdPnuܻ. axvqXx0&[GO25QNĉ9C !;,?1QNQjMQbGHӡC&UE)FP Q% nD?ᱡ(4+$( 4Cfj y`c6<2ҦjZ[1ZQΏ"-B4i5&X "bէ%1h ZAQ/+Ԃ1Kb afܼT5u7QW^j~9eyl\~B&<ٮ?NhTTZe_'*NHr'BGQ@+e=Qw;f8څ@G37`]_0̦dA t=>{xy32z/߈R!RFYlA50H&rM$}GlvY/C8Y]MGEFy.u I#ؒIdٺ/9Ix5 \E9l%#R$Uâ@3K &9Oe?C4f1cZ>bPBdr1E ,kcQm`1 Xi`c7pgtkrihiTsRl_4%<2"LMAo|ۋ͑T֦.Ov 檷dvWLYWOCU)ܹVlh 5ϻĴ9ڛXjy^rGl$nI89@;tvAik$h D[G :;P[DڡB[#mUF:v;ʃ |t!o/@x ?_ڀֲ; }?fը;jRFg+$K7w(IP>X J! q{FSCCXR/i`斋t!2j![r{eEc8np0#bDb'1Ā,b9}PUhH&('U8\<Ϊ*ai )R$vS"\\:E'3d=~nHn).^JI9sٯ$gR]j[e(5QBb -|JT!FA#tQv@:t#cBB!jz։vS@F:#Qi+Y۳HTlAjQEEh eOO5ɩQF h#P!95jd:{Ĵ 6ɫRC2#(yV׎J1 U[]98NǚwsJbB&@HlV@Y<4PN'(  m$*W[gAu }դղ&fZ Ә9?wfbz14!x)* uȿKudbbE#Q\^qk&cf3\=Xٛjɪz^yL@5{ |Gz8fG[{mHg1萖-HP/j[`Mk8usdE.`"h/hAOoj5fh2btNFCۉАDzުcY{EYF5jԨ@lMrtMd3;5*݋YT S\"2F߄rшT_&;QJb8C*_uQGXX[zHeaT97Tfլۨ-F` QEh08bd\GIF(@E Gi3D B᤻1} @QB}urDr! 7)ru~SxV!rNFjgfMu|Ү˂VF%VQӚ*XVb_&be)irx\Η`yEr<./K?rcɚ<6o3g-G̚02ws#D #E>z  n6 48qc4~8FQw5jԨQ㙃5-&@$Q _}.ѻ0VN0X@>N}O\SRӓH&[j~ |/ΡG5DRns&HOaB&VG@{?I@D)h6닌OVr(h47o>FvfA__>Əg`}5,4 }(qμ -تۆOo-L#V&Bnrł\]?ݜtZlImOP|-픖9R_(6@G<H9V9v,,25GD {nd` 0{Bf] Y4b~Rv.)-p$`#wJۊJ񕋔CUd'VVeX1Q 5 V4)VnU5jԨQc"A7H,MmNi|4yB+ qɯFݑHdPzt1Q%ʼnuyj$[Pzlm2#"!L|PTM,t+x\8+- ߲4ZEQh 4}c?a/f.bxMgDjKճ ZM>k5h g."v^ltݟ += L\UQj Hή„Y^_͘F ?d6FKE[XZ`p1,^<vNE^+V_AY״ż[7l͚Vӈr( ܉gKg|g4|.)WᔷILxx#ɤDMgͤJK zzC5b:`3eD>OI&~\*]$|(h6*k5i54[  '!"_ΟלepHUI%=^m۰,%6k$OTRR؏ZZc'ɮIH0 Udγk^`*im5. yP5jԨQF+$ĉ"h DҨ6XՆȟc5mK!ձdEQ5[*ٴU61!*FvVj˓7Iv΁+lʚVS?ITm1(!@T#!$Gitiw;ʱ8^( MYn64 ͆l4(`kwMP)3UD)W9o*BUsX&γC΄J> |36||<[|w%1/b&dmj+)NQD'&F.5QQƳOs̝3'y|?"]F5ВB`$J% T>UIs%JkУ?X1=dAXQ3c.>U-"[G`yCAU+L2 Ri!灞8()h "!Qf3n+$m4Y5Vlɶb#E]nE&BLVs+J/[M׌(x)_#t),:4FQ#*VRJ3۩ܬ=դFYKG%XZ;ʱx0)`q&~Ap CYjb yOAcX?r5Ux{x㍙8qb5kpw;n\QFN("h H45P) ڸ1Gc bJ)hs@ԹD*4b>sb4Mӱc|uh)6z T{;EXT 1jעe9!9+52?)m*>lig!Ӣ tBAN$6P1*ͤUw BP-v\$!TP)Q#vߩLāe#4 H&ZR)^t`&mwQ&b,v^DbEadj+Srs"{_nϓʒ_؍ -\cy[$c3+f_ղ pBMkԨ3?V+_tEL{;d9]x׎gוC/c"GlڪN+Qcķ/'Fը1*Btĩ:) Opvs!1ڈ{M85'J2ۺN7OXFt(;B'(ԦXU D# BhH%ѷL4%4;DĀPD =5( NkdX@р 6:"yL,@%m' XKzVr މBe3Rz[%$c^yAɕ5FI g%U&m~fbl9PPIoF{Yg m/yBC( je~+RI5j<+U&ͦM򭿯zvi'fΜٓz.vlz/@oŽEQ mw_665T_6wяr 'pŕW0|n֞KFƪ*gNα'… ⮺*yy]a5+E'JK=p4$塳jx:Щ<6Dm I*e>c:G@6m9KL!vP~& ABh4VUkj5kkG}-LդAh, edQ ?rAS5k0jTxˑkVR4R5-W-xu f1]\WFO۽5lVx̛;[oo~ĮGc^i_=snnbn̔"?ȗo{uj*CJbBEُR?^GI+wYZ%cAm(6ʜM# 񐎅"mPB*+[fkk VQfa,B:|6i7!尪'Q%{/FDu*_ɋ4xOXf;*6=> BM*5Jӥ_{7ƾCT82ˊO&ײ0O?Ʈϝ#OYY:u]̘1_vaEgǃ4r2AΥ}z#Ʈ}-;y̎]C]-玟ʤo>H[%y-~;`.ړl;Ü]˙]w؞W'=nSvg\ݶۖ^+} _1;4tnv".(]xWio_vl_}}r=83W@rx~8f=9ğEK>ʎGǏOz{|Kk?t }3_=x/vc0?ӈ1r6۰;3~8`ͩS:u*]=?R|{ '?#>$qm| _ {}'? `woUQow Q>stOv_mCnl!5ň5-ܢa;Vק`SGoa"&Yk|Z;dΓo'<@PW +ruJt؏U-gN'@W2M 3BuY#Y4m3PKߊ¦^;ɽӭ̴` oW|x҈i˿D/\Trax8rED{]R;D,.;i*r"{^3hil>_Bbm풨jKdvAM@d-rgme؂wy X8Pg]ſwҠ3jC|hګY~ksGp7Ӯ3s8;(N\tʑ|{+Zci89kxTUvЃSso >y,WN>s~z?}/\3qlڼnoDZ3;~G#C7s&fuߠ㜣?_7< .K@GҹouY_p?>rIB_q\5|+^ \&fW\_;C|{O~_;c."8BazΑ|K9滗fg"P]]~K~/Aֹ |tqIKx?asaƌlfQl&lVl&Oמ{ y{pdzI=) Uen~Ă)5Hf*D;c0/7kۖGJ8"x<]ABj'"/t1> Q#)qNKMWӿ}m ܁\y_Z/eY IDAT!vfp5򲷾 [4/2?&l^#=y cyנKM[2_s^[m cewɪkt5߱!=Ncp⚬4q LvoXox6x˙ؘ׿i& ٖ֙.\l[xRƘמ/_۽1L݉w__vFg&iA^ ,@DDSeG!cr׿w>ys_r-Xe$.^5o6Qo9y`JLLbG1[pMCbPO!"w3` J>H%eJfn[< DɾbS@}td)O­~MHV'`eLsY0yB*nY"jΕRR)eHb?ywgDZ XlI4TXO! j[3'ݥkGEvGRuhwN©q k /q_fH>Y~7;ٌٿ([]YןɟkYOۂ) uϧ#u&\ѹd\!vpsշVZAk] 3ᤫg4^:o0~D}?ux~Y)k_*_Wtr;!tRr;Y~:;:)lh!-vZBZ2&[&]=׫ce»n`+bV&ΙŜژt&Of8k&'3%CjLY<:K̝ɬUY-1A0i%ҭ%8&%m#y˵']ihvcw>&rH]xZE}DU7>cǎ^:D2eJnVBཇ'W_}5<_EN?mѨj#=q2ŸO&&v/)> 65RXM(W5?b y7>ZY# yws5>EАFļ n#CHF-}cZe*M=̵.<249[~bXym]~o]9R +ш]M>|l"oyXmF`sT>+(VS.ߪ&DU,%gZ-nO~2zrgxBE̛5~~| ޅ?_"Gcđ?0/񋻆q9?ϸwwx!h4X}Y}՟2I6<|G*EXwGXy<0duk۹cf暴Fe_/K a-|[o㥯ْqR60?^[^뾊WMfu λ}M_W.8Vt\vօn*LYVSc|qdv9|p #U4r6]gC^^ eoq7C_f7Μ{-vm?<^zsz;M}t|t&J^,x"]ՅN:dsD`CŕN/]:wq ~&8fWې};Wm0A|dܴ8k$Ʈm??#\B޺b[wcI| }:8yZn߲ݵ{,8˼kccXg7s;1SGsg>8t,_}fS?›>Vbg/?Z89ݹ~bZlOpc1֦pF|}3NϳZ7ޘFQ+ৗ^J'F&Nox2l)7r 8^ϛԫbx{Y=ިʡYA,R%.FD0F:l2mC G1 ?;d N@I:@ij_]>B;uL)jlgE+aa 3.g<F 192=S9#{B!IkbTYխ4,%VAsφ$gtll*FQ4MڥΧEmɣTnjj׈ PWVK.(ڡ.Hv, 29`:L&^k~+.w`C{Nu_惧_>OxT <aUVF}#XP?c Vژ̞P#PYÒB?25*̽Oܢ;㓨9[>?q=؆`>&[W^qg{篹:1ZvkƲf188Ⱦĉ{[MJod?!Ey)/^*fL=2)3xG @kv;w}S{6Zl G^(^ϻw원0{񯽁Վ%{R4ys9L.ށ5_ap9iM߷%-^5Pl|.[θ7ks>GIO4_w*Wn0xʬ&|jp ` Rkq7G~xQf8`w{2:%kVoz{`%5-Fc%%ɣk)(`|#4dRTMDV)D|Oߜkq2.9; VJRaɝ/G+^Jӟ+%3'N_@oP=^zbe1^u9r0=k hf=Noo]œ}ps۩*>w0rXޫP(CȢR`>u!U-%&eou>[r:lsi`Ķ g34ZUBQB]ֹS8+0g`Z'>-O/rK6b͹aP7kԨQYV{7uu?DMVdjDB4h:mM0:)Ntx@D Atc0{%~89s D bDI}3!JSLY>U{L`TI%*ZTm?MG@A TRm2,s I eǩRRxC.rGbvvF|J{%(9LU2EKճ^^NZ#9kZ@v}E<5jԨQ FAmҳ# yVX];Y) q4k )qܠvޜ U wFjiz-ߊj$#lt;NlטVj^&ihҭIuRKLyR7kBal\L~v|9ZH:OE12W<X$.=M *ii )E̮>0mS%")0O DT@ŔD%RYt(P̗hK:cVoP:Zyq)zi#wf8B*/a#u^c q_90st]e㮇zM^7 Ob li]s ם/;~{qַdžըQFKPQ h6O(lȣh8DSS\% > تIi\/KWMEPh5euvTj^; KVv)]E*Lԣˠ NQ7`_KɢM;Q*~0 S]ξ4T5'TJVTIW4Pn"ːIADDȪfV$Pu[b4TLFJĈ !ⲹ\Sz[9;elטt%RZO]FAt!cjkY@M%(ڃ㿱{ FQX>G?ŷ'ϚfQG}cȩ⪿^Zu7ƩꊊAs"?)yhf`헯͸ըQFeTrwZHvKBm-5MyG eL#}O” F,Hp "xtzWU0d`!F2H[28$q E?7}6{dɕkԨQFKBl%`[!:F[ MmAVD +4yٓ#B F@pZ!#EK jIHJs#N\qBT4O5!Y_* 'T"gb {[%Y'B FMiI2"-urIJT23 ֽ`{I瓅V2fQ% OM%Ub2Q:p;zj~:&8OYۦ+/U%V'ܸ5YŽQm9HX!-'h= C&Y2KJ*gjxir~H`>·!7AǏ.H^ 5jԨQFe 6rQ'RSD 1ԟjT`D{&jnnX F!+[,=LoplDw$ZkɁDR!=JVXtlXr`i)n 9.',I|N ?^9yJoAs TcDB@%T ]'_bٟD!N,.$b:--{>,`S&huY@EL,<ދvkB#񰲓dCMkԨQF5jHq*tR+"`5DVbiHu;bbzQ("&ȥ]i؏Vyw\K?oO#[Ă e$f3wHȾmZdvh IDAT`8!XʩHD`Jz-p>rfT\Utaӣh墹,E/ɒK9Q FDX=ueEBMkԨQF5jpr @Tk̋i[Z=XR)IXE|ڧAT3>d(,BI"\ٝA^WN-{d)kBmSoRSLF4cOUƗ%˽Tęd߉ $ %'bV_CS8&"F*SU.0iXHLV Iz;Yv:#ٖ&&"K;צT]K ,Fz#4\M׊(רQF5jX! A@ jmŏFIkpLŒ'RӴXL&Q_MG5Le-8TJ7 1$ɸm[X|V_,88p_z$/i%C3aL@mꗸyVQl3{o$T)"UtP(DA`/ * (HQDPQ=Hr3 S~Μ9sΙUdoorʴ!R{% [1tMb+rQ[dOp$0rT#hy66r*,՘]D^ip4X #Tdh2"r!B"D('8F._d(2 `^ҳl 艈~ >T+S)oZDT,D\Cm;dUk)FƦ S p?Z'"dvm[{͈<=}&O&M2ɽcɋ5>[H9;4ghCwn;/hhDh!$!B"D!0qdu̍U23,;A8@Dmm^aȌbP kW;|"o5(W|p% '%8[XǔHF{$NVAc !pd*{3+ٵA)PBllyOR1}#`  X[iB;2hlZAo/qRe%b|d3XrMV1 &,𬕑RFw5{rf[]E]L[hmʘ0S ZZ#lsZ|[_Ę4ǜ_h"49m8"DeL099d.}OvVǍu."D!YLI: mQ ޳벝luC`v@)9$|!wُs1`GFJ7FatB w6y gaWHpi9 sFP^ʻZdTFC_'reѨq㣎.c^Q).pZ;?Ld\Qd.C u(D嘢ls!BoCzb#L[~)w^u! "W[6/"_ z*p!m[M'*V\?A&([[\9XI];h1$ \eG92Z94*0vKRX ׵$=(P~Y'!  pLRBz]sCۍWI)4 p!/~9aQd>'^TN0PG { X`0xD@d6{7yX d{jIWHQqWXL1 ~ Eqr3˗pqKئ0פ{m>hW췺̗CQkp ^܃c0"D*\w}<ų 0tPh7.SFWMn^'ϋIhܶ "b^U=xfh8Om;g޺jKwqi7N^MM)o#-+!O#(e:W+pq뫼xa8,[Q7#4>Q\Ƕ.cgs9E  /0膟hf~7#{S?C/9v) 3&WQ޳<־Yڽ'gȨ!%3|/sWrjBb3OO=Sy0L{v\.] e`ˊ$_Knz2~d2K>k;SQ@.o\׉`J{z>J3`*GFѷ[eǾ;2|(.@s/sSo<~K7NJ{Ĩ@h_6˫.bΘy nx7N~N{cҫ?9l&}^.wn7.|u7G:_dM8 GI *bZӬpլ%i 9wd\ڬl+e5Z Q]%$#x+XB`B>(joʐ6`|V$kzo pm kLԒ l P6( YX!J#j}nxٖ7Yemd/}XW{Ӂ|ʯK<9y6+gW $6JqͷQkR<5ڍu48(Jms-v9.8Rh$SDBKiH.6A'e|q_.?!Q"^r ߯]K<'3|0>ZB.&~~3I&O/mc8+BܟrQOPx:^ޝr`N3u)Z.=Q.%JbZ-z^>|/ y!o~s hF( P` KQ3Ąt̉-Ⴭq'ELJ&%S%[=hsӡ8yKHlw)=j&1Dvm9sp,C.Y$(C9$nGS,.l]D2Aiޣ3ǗpP'rfrlٰ8Kdy\~VER{>S|k+A(TjnFͿ>D"_kfS&1qkt[sgqQ,ϰ<.+{~go5FD<o0g6r?!EF޴C_uS5xw Ǟ S X`N:3tIN.Jdvw3{x#urL`~UkE\Rh"%eL'~B9Fot:H#k&ӐX _HK;X'_D;( ;LQ?~Fd9⣭vʂ"˦9X%{JCw.xπSG hLqhS/ A5DmLظŠ;5ܕC +>[tlN"6o̝cr碔"L6mL&Mxz"#J#t:Cb$q{j &]p ⻶DY)m!Kf. )JtIhf߰X&c+;?yĦk|˶p̳pQ@+g84IVǮ]1I ;4ٹ4g v&˜ҙتPNdUIR2ˮm;v*O򣜼uRHo( "ıB (4<-{H$R4+'1.81sA7j=mKeݶ<@bm$w5x6]oVU5- 2m$~O_~. xd@\EUdcxO2_$+듒tM*4ڋJT=[H^P$B&lT +HTbidꫩYI,Y682 H(eL`o!2W>#4"A?i @ 1E?6 uyQY(}މj,t{{?LQBikvkKl~ -sIFj!.xj96h;cViHm6\l06h1|XL \^]>QZ|267EiG"_Db ֍X̏-[H҃CF*dM0֣ J$#yؚ!Yݭ[F&M2. -ܾI DJt }NڔC9@fz2'zg/y$ l߲ϧ[wU'nnA8J1ˮ-Iw/<҃b~:|U!fC%J4'#lwdeܽlݖǯK;P9]v܃)GYo<ΡLvQ&Rٵ/e19~㛤|ݱ(@)RqYscoj!R!PAT̳%-zSخc~D7gNwI( v[ZKFO*|+EڴbR;PF rz}41~J-~yba|R=6Dߴ5Wv_ ߣSRMe_limkڐ@cѰAK F@6rhPJ\u&E|AIM엕W.~\:rn *;MOe-썖eȣ=[YMg.C1aE*uh[mcVd&㬳5 %Ц=oA۹੔w@02Ҽ4#f~j][㷄ZB/:u0yǴek_Shsf g n>׭gȨPu^Yfowuuf'8G>"DT!;׭e{= T)J+~0!4p؇c<~9T9)Efzvz}Et̞SjKgY>h&W֌V: c;L 4{rvxKnv higgɃeAGnk]k:Z+%3XUe7la k[!؊G%m y?Lx&JYMZHom cOcD.^YSvAc756mUg~yC|ۀ9LEfF>k FI-m4ź4Ҍ:Pe2Vim06--d \xWrP>gMYҳf;AW2cDu4|?!w`˘sM%JZ K(NmnH!BK"㏙={6gFkMB4RH$r_IUr=٤pchIt9ݮy՞4E<ߞ]Vj/ibw;ۧr9gqfqckECwP9>{ gnE.=kYAa$wvcڠδnw!#Vs E&Ws,nہw}SpT* ?>h~fGNX&(q k zЫ@1J69NN'Fדk8͙Ѫ+~#Qnٷ/-m2j"BQ5=n.~Ekɜ޶1;bl_{6>KvtN~X#{CL^B4~zZ(G2*e/8gȌlEl2jk1q,ڡEzFyĺ0q,xZw f+(kVVZ25hl"@)!E.J^(KM1 mHa1DCP@Y*h;u_٦ArЁu3|8&LG)&MкM+."S˕+ǚo=:aVtnH;OneqY@Bē8;SU<#ӈ:.T*5:Ýo({3msDiv4"x>{۩T<: P%OQsbtq n &^@uw d%4c j bo_V|n|~@TΚW$ũz)/Kջ^S. IDAT9l 'CsCHOnmh"Mݖt4A |gμǯ}{n:I&F۫xW=wnֻddZ,G@nQyesɮی"Tn:A.nzzRfֲbGќ}\$UUdRehO-hU(g6B'vFx!j >\H'2x\xR~^ꈯ1`Os@q\㦌ܹ3aUϔ%[ؚHSSo6=V|\z'{d0ovKrʜ7WY4{D34;,ւDjmau|{<'QgѮOhl|g6W=-iQy0r?+'5b8yZ8 9fu涋*@do܍TkՒ;֧FȐcټ]no ORopdKsϢ?1g'drf<%5xn[Lp'4;QeZC|Ç\|cPL>K<^hK?b+YJm7*> g5~z >\Hډuqh5z!3MnB&tΙB0w0wylFDȮY׵[j_)>я!'J\Uइqm-&Mm"DR<71ѨbA.9]:@<)C1glx''~| 5݊T$PHm7HjwQ3dU"prZ2y FVw-Mwi?a~VKF%~-xޟ@[ MO;=Sa.8ff-'NA>2nP7XDS&z0^)?3~L&-8'`YvS/f^EҎou\_RnȤ6jR*OЖSK^`C>Ƞ'D\s \]Kζ ?b-}x,w~5.>=x-&OgЭ˩69ռUQ9ܹWفT' 7l$만{!7?|$ͯxdn`|ELyѫNS7i;ύuuME0^ȬRKF y~0Ul?h`?L"6Y/,{q:Sg5v~>|BmM_ϨIWhN]OI7Kڦ|姝ybN yjj'ngڰgz/\2' &}\4kݍKW<:oK+`+opňEd?Ӓs-[4,`obmpRؒ7l~3;]G;ay9s-gt~B]_DvOjۚ'i95'n̉L$ז7?TBr9՞Ӈ[&11-Ƭ#:S7q7:O-+ݼxBTksVεrBЃ[~rڤgy{~Hқdvuzw{U!1oT>$YOnN߆]>Kx_?G Jy3~z> '﫵(1m}j]joDv2x+|}K>o[1φ8DQcRHz0/D!5kXz+yq6-}N:%@)CM'^!x\) oK+3=lhOGӂ`\E 4րSK*HHA4ݽkD(pJi: 'OI`ǶNScJF !mkïG[gBqPwD\pB"Y31{ޯNEɨ"!$l%*d[p&TO&$SG]j7jmu(xݮnC)HO_5&@bS9,YX漽3/iFtJoVe{.de/4?>50g?w Ѣ j(EFݚ4IM7pYz7v hګ%vt(7".:^nCZҪJ%#y+>(Wm3Hteգc,4x9 85MCr&-!R6}EQY5N.Æ]]ͧ W'ZAWg }ej. 5`FjuIIvKMy wcB>%7|s^w:cۛɷ@ 6Aj\mb^tODIZ>ExgZTi ,).Y oH@iէ<7|-r |fkp2RBZEFylkg8J Jٜސ̒Q2e;Q}u{.}Voƥɠ][ No."T7c/1 ܇ұB& غKoin:pAE}͛KyꭟX_Qlr4"L ZW9D"¸ RK+EVbv @$*dlͶn:@h4I$3S+Q8%SH$Q8h8%xmR+g;<Ǚ-Vi8@lˏ},>p좰 uQ9\{d+R4vIa&6X=:w wXs]mAje Zr.ahJؼ%̬^XRऐ@>xrpl;%L/] P_GVf)zq 4pc3.bC;ыF NgƝ*>kO.SrR(^Gn6u@69nv$k'۶O|ٰmr|I%;=\teY Pnm" ]3=*Ӷ (cgZծL}9_|SL>ZN"ٙn% h\6o9 .p7em5ILF*Gz;6%LpvvQ4`f M˶1SjOFr6 {qϫYD>{o9c_SCo@J:5bV0iCNf/yybLX[V.?-ngf 'Y;Tim2o,xe ^tNj`.GE'w,1PXVϋ~[vg_ljWIFgU,xG ,@ "m:JPOf|ʘ-VvdWQ䴨Cus;ɍ+p ٺn3о)R)6ӻI!%?qpf2ތD VSZ˙(ٹ;, 6ZQb &J'R8cfP@L.OsV.ZOq#BfpFL!6-Zg%_r{&U?'.T>.U72ٟp@޿}ow_ɋN,CIX{S PPs'!("%5>Ǡpջ,ӄ}O#;9:b.9n[ZTɆtj[ĨCR{u]Ȉь]*)pjw,\].5|r"=|2ѠJPŻ&1|}OɝQJ%*EmK,3W5#M!B"ğ;]Z xpUĵhVdZA3G0!mhP9 s8ijO_(Wn. 6"N\wc=ۥ(QDz;Q(% a4dfzLdqȔ6ԋJ;h㉫r稇3NBVEuCNi{ "N<>](n'X2fELQ} z.~Qx"?WkE)|pH="oeyOx]z?sisyzIg`9i({z4mJci mX _UrFrP5v1r0nByqrN:.K%o5g!8O\;"گ;?Nb4O蚽{噆ddAu8gV )%ХTyCryZl-xeY'1<݆uarX컓!٠oeWh\\m,FF(u/ȭӖqϲ~&Z*ƽZ1Jl1ɠm)|#\̮BMreyYT/WMH$\}z_ۍ|>{7^$ӎ̡Z.8ќ50D!B86.E BA#xl†+]!8u3q`KYMؒl= hy'v:! f`evl";lǎA &i]zisS@";uN#qZ4 cWɾEE6H k2$54Abmte49fG<1JJǕ^G? 8D JEh=|2gJ$Ic(C>=ċh J ^b%oVސs9%+6 1rP2yK(C&ص[CBvlߍ{)Y45k# (xGu^.;& اO;d6xY2"F*'>xU>ܐvnw~ s"w!B %fѴbb] 4;ާs&Z+$5e>y%eK[|LR mtյAt1x2XrDN!4_!-ƚ"VX+)/3LU"[chL3HcFl6W.VMy(닁v5 !֤[{yB KDG5!dٚ(SڊRrc#Vr0秤e P֠\sV˒ˠvqB㊤k϶|[_o/ցInLmR@|3FZX+c!ZQ*y^ rރP!Q?/YԴȩmhz#MFy$*eʡqlmݚ̝Ou; 얠j,~6ŪQꜜfsf|ĹÚ+t?nk[%|ƬM PJyX|;ZD||VrQvFO1Թ%~b]|ifL %Ѭh7P{_ryyZWϢw)n7⽉!B=ȋ ͅqp]YY؈%! /hedEdL4Lp @[ j$H 1 A l0>[m'n,=1L@oz?5.h9AYxj<)O#:[ )Pe ORB&hKL S]o[L@6م 4;m0$֨ =,Q-ITjPv4f6 B$ʬ5b{R 0+8ĵ[AK`m`Y4:ȇ4[-2CIAaR^ɷBhi@ $irGM!eTW<Ŏ@5~&vvcRli!*@E~LWV,&r2XFmB O)*4~X>4Z<>k__& \W5M* VhX $!C.FR8GQEl}r^9l7D!B!z}%^΀ҥB-S|֥=EVH>JEZl-#!ئ M!uڿB#d";BSmÞTOvFRLݶu4[,,A"g;دʀ\SkhyUצ"F&Hߦc=,.|4[ Jb] i+bw`: @E)heQ!WrTJy'.CĴW w"vx1͠ >gHCA=vI6qnkqU@WPUp[I{ٷ\E?`] @ !Q"|)o;zikV1I-U* "D![!* κq-Sy<\C,I9 g~7]yBWLk-F,a2dIȌ+e7.d*7 JH*kwn-{D s LQzȾ% LÛ WuQb2(PHYzl[+Scg}006{A}LTE%>S<QCBjd6ųQk?%: qD {L4{A.mt[̣Z&L ZQ2hiG-rm? }lj"vl̍Ǧug8!o"Df(G:궓m{Qb !i>!0#aKcJd[-a%Q'@bAȍ!SOQ@=`5nIY"VԖ6 DQd\c<(6Tߙ! 3À JP$GQDATUTawUEňbu?p9!fWń"fP 8U} `@t~N:nw]HU#_ $Qvi6<߷p-#'*Xۼ5VkG.چZ~?7ȭ4[ϮP!A`(7׾Չ%J2۴Gm!v*{mʈɿJ Dka2#QRA%alW6,3[BUa1! PUt`9ϾXDqna+IN̋&GN }qX7~65C?yMcM^%k|JS>->KӺ]d6'!k.x̟k\ blm5um!!{n5#ꉈS1:[Sԇ_ž;22DRnTJr48PrFZ6Z;"X M8GyՊPƦC l@`Un`'t s g-)r 7ƳiH+|'l럭CX]ѿXUPUd6Z?vgc\իm (0QA_5K$2#>~+~b#Ư@ջ/7lD/S8QHa̘?82:{@=yS)ΛëO>Qg6l]v;SA<%AZ"A9ێ>u~Cck+GӥG [!JK}`8䄳/lŬ]#YXea6٦nݮ=C8!87Nu#b{JZE8I~ǒh;qŠunXbxn]G^#z5GlOK{Blp.-B-sbuC|SGJ}{BDuhXH$P.38\ࡌʻt(Awz"Y[\Ep lp!oF۳ Lрz=f^pD ՝&H 2RL h(ت0'svƐdc8mbw;uoTGs >}J y'GQloQTd{笝~ɥ/sщ͖x#i 3-frrH's=7rnz}.hjj,)=Gj9eԷCISYx/hw>M#[sX+y4y<#|-L䩧aiG683c B܉L f/-'Q؉>'_.ML_~ڍa9wIW^Z)j:N ݏ?Fǹo>/`yI.GsԹ#n5\9y…bG+?Hp=i2a<\FW=biӺA2yuw$s[aMy[g>4J/;C"RW`SX\$>n$n7)YWϽn܍\πb ;rerK6:4{:#rZ_xzu'Sf-'U GґY7Ϧ`2*Qa(}g,|3:u~:-r tv oTW>e[JVd|ڶߍރŒ?pSؽ{(I&?n|vTW}^kbtqޚtygO?] }YXdw_n{O {l.d.:(MɈc وLQj T& n-yX-ߨ#%%w\i7|àpv_I7b=%E _Fp7I^rz_ާym<2fo&7V~zDD^7t@~[es+p$ꯘ|ϛ4%n~&z>}zt=>*+e;?;e-ͱWEӹ׸龛:Mo ~2^^=3{K7:->gy֩x|QgaKlm| {z|KO߉w[rv=nz%.s][4$߿V {^a?N'7q_Ǹg8yox)_̻7^gM䒇_qG?w|Xbנb o{\k\,}N \̱CZe\~3.[%IS)f;u\+iݩcg:tv.Ͼ 3P9)cĨ:s@;:e FUMNh%`Jq*˰ OL8(z9f2yWڧ:GQn -7> l-ǝ#M{oy@J>_#c>t=A喷FS븡 v S! 9qu2⫉2U\u`FoА&4!/;[հRPE };rs득ÌVcرQYw˒̛&qo[@VV; ݟy9˓2{nO JOl^ !(k@tKo;^"Q5ݏ>3^`f]}pw"+|4޳.|D 3FtԉĒm'['QSoԈԗ|>yoZZȦ~طwsz'үmC:4뺒9{]3t܆: h}+6XYڅú0'A6ƣqܬBD(M3{Ma9ҿG")r{g@d%m/vn+|t5\xx^eiΐۢSEhߵ'-ZNzaɯpMWЭײ~]1r t%O,^te͚15! mOF°:)2~14[!$vcc\`?O6E̲FXj=o~7gx{ʲ*?c"q}2RUl~ z[H{W^.$)Wz] V^|-.99YӫZhJ!$o%nj5Y7z^qD92D||?~ ߔiIr['~YXoU`_1 &[_U6o>>8®?M>~dewBjhaTG1R4/pɦQQ#֭Mp5~!A;F[K兺<O| YuCdk}xѠ1M%HxBu S>e114,z נRI=o~Mڶu[|dp^NHlP"FX-)N dk ;6hẗZaƀF RsWG7k/y¨I\_i.bDs~9R+2}Tɞ `lzc N4X$Nz9&jJ$@V }$RIڢ<(ɦ}я|\J!ѵc9^Fj\u5$/}+v:0bla݌,Xx)NKHSۉ^ʫW 3S%Rܤ-EwcFH1tq.noWaXX*X;/IAMZ$Hcߵ!gͣqÿ`b9a߾s;ah͝w=Uh76?>:Aw% 1`BbWH^AzwgXUCw=+k/\І)Rաz%¿Orz-]!{ ` WO+ږËl;wĶe_D; 9eoxYlv_ϙŘ3;1=)} >KWQ]u򰮢U՞{2Y:IxH,YC}PL[PH`R%Xe za祓xy귔)YVBܛ;>8 R{O&9iS\-/yw۞t &;ҫ6zo~aQ##g>ϲr߼"_Z]rs*&{۲.C!IFtkWc)|/SSb!+ szA9v~3 IDAT:sﱪBUw+k}CnA>K泪ܷNgoV-_|WJVSn-_ @^T*UC-c~w25H&O~A$2M[< VμJ5uec&2h;5;׿i҉ko莙{=o͢* _'Y.2o '%_MFtJ0Rk QH0"-\å>@H6hU^)N9-6A޲yOP 3 r6Ql$n$!$@?qhAeJW/ #NY^Ma֡;mbmF$.\gWxA*;C虯hjF)El9la104oG]OSrq<ƻwكt)e%v; gϣ^دmC$ ,,)rA1Eq-hy{ t}J5 |%~*W;o7N@͆0@_̥^q i[@/[mS!O";!WйYL苏?c&L"~*ŧӦpyer,V`퐌iٞU kӔ FKQJBMȇAQt#\ lD]&¶V ۲%5cȀc0&v'O&{Щj ӅNI;d_ކ,m}}w{xK#D6YYp\2XyvPZe*OmөurɫW~ڷyM"Η'$=ZږM5Vg1n{/)crwjQT/ߩ5ucT5jHJYd' /r٫=/cojn#;Cxc%صs7֫ǥ'FxǞW~=R)*ʸsM/eҤ))Nx!3K3cri1p$ rw9c?<3ȡȗD?gF8$ݰ9oa5fat reo0~LrjYC#9 <GHl^Cv<2ZoejU;.q/G'3Rn'̷H?ӭ[O~*f\~ݻk䋔dUq9|_Yy9G۝ _W6|BHV&t_췏5T2iTgTcJ*RQ]@ mi]:]:\@XDt~%>"l@O4.$L{naku1BTUDЖ%nl@ ƏZ$u'R_ul}GIns=¨_ZVT`ADۇ? C#I<)cVA=51cƘٳg+WӦMrJ/'''QZZ]~y"'"t|ٯm11et}NTx .y/GO O/:zq-F!z^d> -JmdE.GnA]\gǰ6"1s~=r,My+M} cog/D^ċG#aÏ>udeeH$66G51t+J,/2R H&+QA6r(Q1bБ=eA#oo'VQbc^iٮA@)~Um `l$!L#D 0J Dʋ>\܀CҪjv^F x.` o0JP=[0(A5ii-@@tc#Qk9$S# [cll n0#NOT%"̦90l 8GE|#(/^f5'Q?m0@` VNMc2U#d>eX%C SEsQbaeDPF >:c"=]XXO?e>,rZ. ѢCS[ƶ[aI!oH$b#F? tTxs`s#F .16?Q,@eO*% N%l bV&O0֮m\'"X=-l0Lt;݈a 3EtT!j+= bd]k2 eCiM'!!4y橘2!, F8E%4EP+֚կv0@kiZ惡 1vtNhCcs K:r.O2e4#0Tacꡌ=@r10h]Pe%1bĈc oT'㷇쮺9J!' Q8v4RR>4LZrWC){ax{,`nRd*@@hDl = Hr> 0*cķ#`@,T Â}% D dGMNY][=m*:݂2`Pi ܈c4QGvZ5DP9~pn]X;[۪6DDhQgWQjSdG1bĈcsCWBWVbtĹJ FJ JZUK"* 08:AiDFE @-*%>j} Mvf?,6jY9GTΞ;FsA&1Vh2A+רyYԶ{2pHt%32$[tyC۶,[?Kxae I2v)kccf,}}_qu[=ys029eS r[8oel!Nj>]7n_Dڈv]&ٞm֔9u^?PyLlF^ՂW<"wgԩ7+yh\?V1gʻ,p}\VbZгG̠ }x ov'io$w_Z;".G 7V kqqic.'ڮ|k3`J2,@ϝ>@“%AqB> Of0(Ytɂ:;''A-Q jS`bk2aC~U !_}(QO*vcsdb]Gp_ʲ6}޵@٫go)l0nA-˧nxgѪAZ~X?)no}Zg\]i@Y<\IS;uU`c ވ |1(0<$< ߪ ]I.Шn0@6&vAQDz eۢ/zX=-_ە1APXMD6kYj=#hN5a*B]Wu!kYCࡍ)C3tR--Zz1ble0Q6{|c/]"3#NxIO `w:}2k?Ǩڑ SYN>jNNِ+}S1gGy~ҳ\w!ל|^S LyP~=F橇8})kʒϲg.'9얉d~u,6ILS>^Jˍ%x8}{a}dM1~4r񦐦Ix hBi\T@źbBj^cĈ#Ft<ó9zp$x/JLO7P A.:h.b;ڙw9+M\-i‘ǎHHHg$H:)pJP<;'[n$MiLgMZPuXF|MrsF:(bCPh=Em^0'pƷEXTTY}VT7~K#&1~)*N>UTW6R<[Fȯ)=ee^Ĕ ٳGC͎Of1ol͙ܩW2 ~x ~cg2O- 1o&V)R%巘hN&v$tI>K\ KjegStM )[Ĥ۞K(u߾(R|+L_*1dשGDu1@nYJ`KXBvY}lk}/ѩYױ)1bĈ#ƆaChەWZ~K͈LuƤ:,>~w'Ӧ@ QhG,Au7tY"EQKpKCMz%5 et :VMF=Q{wPk3==t#؈e Du-.^|G,żbl1g=Ê$I_jx(߽>>e{ VggyڭpUQm[GqvJMfŘ~1yڿLJ"FD|؝.ʀa8![n[:zCw$A#F3r圿wdq(u1.XJjVjz_^uaӧkE2۸}Mv0{Lcs~o.t8aCu5/,#F1blƀ1:x QF}Z)tmVDƋn*nF@ Vy "JtejiFcqBy>s$tpx(Ġ#b4&BɟtQudQDWkv0M ~ 1::t8KF FDa+2!`|;+gP?ݕlOfiJ} ~S0Y܅=H#7@UTemwG4 z}Al[Ʉ:2n|- 7"02 7$<eqcƌ1g6+W4%%%M6fʕ^NNN}?~9@]rE$OD=‹gsOٳ_H#)Sߧo lv">p1~%2dEm-Lmu1bl!~1[$++D"ywgrN(/TWSUr*Y~5("~", '|{Gj z/E ;g 1JҌcsYbV <X47;/f[(AV(/i6QVNFuBQJFcu+ \1`c< C3Bк7[l9zVLK,m/+ WwF'"Q۶}@` fu.F 4M>D֑ x<5lTDpmш\R9=ۀI u;`ccL@EvvvUYYYyչ~UUUI&… %//O4i":t1cDJ@(1bĈ A PI%׀6 @ۜ5ƞA5"js$ Yg(;}g&{2AMw! Ȣ/"KED (** /# !dL9U$$(owW:ԩ{骮=XּܢET`~ڈ!F8kLpVpO}F0/ ŋdIDHOc GHݏ|oc9nb1Q I6*Pc ] {|QTJ]plJ4xl؈-02_bsV ~0[I vm%B@*x52t^Al[(r%>5k]tJ]GsG2tк%J(фddA|MhN{f#Y6*ޯ_RXp$y.=/Ĩ%Vj*cSb'`-P d)UR[Kf 2b#OiDɩAUQ^Y"V3m>)E'XL rVP8Q-H0f?|Su"ڨ,N?664ۏj="bNLa>7l_faԜźPPAE/ؔn*HF* DD% |0*Z]O=o[{=K^D%>w$|$V~#0AYyŃB$aFA>gK4ߌ#m= AJ*LAXw(V ¢ng v@FbKU\mOP<}n7YD)rp*Ha4M($F?G4AT 3bP)`ĢS9T]S0IJ pЮb6:T56=]k5X; QT*h50Z̈́Ǟ'_(r%>2PU~~Uw}4i7\}̔&Aȸqe&tտv-?ҧȺ0U{72|T#?ƌyDy[L&klBe!ĪDOxOV[n{M}y{ʔ-[o ΰm7n ::ӟO<78B@Dzx!# &`AWQ~o#%_X, 1lP'Ǒ#rɒ F$شHlq$&l1$`PrwU$iրٌr•R*w3#iWtU+bu#Dek1TcŦKVLuqSLE$}NJsbsD}^ mn;E)^wn9΍ " P+>**6l|DQH+e[MokM A!: J!K=(Qć9dѴ( YajL8j\Zg'M.5:]w܆ϞG\ v;._ns6tKv83ՇQЖ۸97 (sn>O9ןy0;o3ͷ"'o<{۶lVr<6+*~ ~yWrX~;5>>~g'b,[u4W<>f ȅ{3~v!΃~ö[1v8Ǚw.x~+)T|Elvz<0;@x&Dz^x-njc_wgmgbJ|.񛗙_׎JS? q_@(Wm[M؟~sd|4ۜK~wΡl6n'8^{sBছofM7ecT|wԨQPw^MFpa_ۖ";9ksܱ'i|ԳYPް>?w;:_9\}(c:"Ok7a@#@FϷ+p!s?m,b4~qi0Wsі#rv-ڔ97KnUl m+}&~S{:-xZ?>V?@$ίN:{?sW9Z| 5(mw?Ɗ4O|l.w,0(̞=S>4f3ed{P 7^{rFPr1w\x!aK|L>W::jI|$(sA@4qA&yB#)uEEN0b9l&UnMFbAq2gYM#8">ڇb>ip^b LANU2gNFMg7JfKMbN& .Flaׇnl)U; k א [[# 6R\\mn):_ X[E3隉R(q1gP-U5H2~CʑIoȤ׆ev|zMR{4K(QCZFeT*{1>2lкmG!2,Z6YL4:?]sU}~ ESs+~v~Mu@i-9MMSV[~8;96岴1xXo+c }in SߜBU3?.;od'OH }Kl0 ~|7\]s+ ʛL}7UDVڃ-Co.p,aL8P6@nY̯N΅AxSngc1R-X}لMм챹н˝ϖ۞&@ Ge57~z?ގ0p@O7YU6tSV^i%zH (%])ʕ? >z*O=_z)t-{u9Lt+AA%+'/ v^kd+#hoX|!f-YoEWĕYPT$'OK-FY][;mzjRTA-5R@jv.28e^1)Wlg7\ԟ6Hs'%fkvbŠhD<.=eTQ4øjYC-^.PEM< Xe|i]Zu[Z(GK(I'T;8#x'җUfLC 36ÛDp?f̘3/Wjw}:Qdd SJħ'fLA?Hay6ː!}]Lk?틀[ʕ7?Λ- ?9Y3 #aDrCم7}Gk-xI q͝\ ٭_gm;Lx?A|⭒l0tU*VO+}EUi;wɞ a፩dY/ă>cnvbܸqt: 6I`^{aXG,ַBDS@P4CL'G~ Q'="6,>4$gu1-vݛҠa$Oz>NU#l^;, 2F[(~i(,LH =Qn!@ X# @jlCm0o.(WWDy,?z4|3_=2<{g]9^ 7O?4,>t(4W^chL^B0eZ ÆCA 0wޭ§Ian(-f3sNB LWddc/: QGt>q |-RY?Ylj yՓ0u:]fX6ikW93 ̟ʈ d~9kt+9jH{ᑿγ9XgP2xmWn8Z)RHIYB^΍*6r12EuܘYY<0j# 6glmعJ IDATzrbvm FЬM e<k42'6eW {&;hNԀh$w<> !6ZΊۻS U#ˑ-fh<R!X2r3/X蛈[=.>`V׀ B&d%'r-~ 5tvBda ~x{E%J,}Y(Qc9VXC>Zk+|A5c9fgg÷~.OݲJLq(mV B_w%նfg{ClE_Uyz: -/?(̍\'aq1l6z.%K/(h$#8ΚAѬ|2jL.y'6"c&c̋Ӈѡ䚻'SmT\^|Ⓝyo+Ÿ;?3_Gpitoe.'s:;gU%[avZ ~rك9?);D#* ;}ǽ˜6:;;yg4ޝ>1uTj%b@D RNb?aN }g#YP?Z 6bL)GB-vD$L@U4MD׻4A'kVH*fR#8J7f< v{!y!obEbC@ xj|sr&ȷD\&ھˬk.cHm]4N==)+&RZ"͞h|\3` b`~h.J槪jD:^3K.a疧Lə$_Jwv ,rDDruס1V\QV\,˘477S_%_s^jl?ǨZX+1e n~H6З~.<_0u^K`Mƹe#2`ٍ+-dCNw*z5d[pw}盌wg8$ s ?p6}q͈Ύ?ɲ按py{&~fc3{iQkb/Ǯ/ň&lu? v*'ukzkK[N?tygdڴi&+L6-kiig!}6wuu,맪Tu7ݼw;<0vfݔux:,O2n%>⾸ZVUU^}l y=, :kf]z[oa1I2hBLއ_%JfJRGJ] tvgnۻ̛;U]@g|]T;ٵjl9mB)vvCq;bjރR*C-"rtU3B4J\L,bǙz9xzԙbXN?VO7-D2ylUkJQ鳞qOE]wyW)"m!v`Asssy,ׯ_ ><+:`>|zG>b%J|+dN;u#;Ϗr[KVT$(Qć YFViB*Md& #4@}^'su{q+=Q㞙^#ՔVMe O]Ǻj~AQ 4\мx)FVù @U$/36[P5hj-'>8QȌLo#ӍilgovcVv4#V&zoInM i]0$(lSiS'[p}̒`:ӯRUU$@%d=x~,Ct\>Eck ~@ ӯIK%J|$1tP8%J(1 輝'̛CĔ}{zr. YӼ(T +H[-79} F|8X52[P 6Q*bRr#b!Fz:\}\mn5}DXL:Zߌ ϥgٸUہN 9TPK .QD%J(#D2J,qjZ [*t!"mB|dQ$W3n"QO[ZKu9ӧXG̳/2HF{hGBhQȡL5rwl O/j#YQB`t y TZL[b-.Vm0~doD}qAԏZ Vu~!V  JѦ9hv NFojDX{Is*NfFVz 5Qu5@j@fbJ؉Zlmk u͂%BW:}*Cm]KW#)QD%JX\5a>,>w$C"m$KU( .%)Mle#x^qP#=q-5vJN|!)5.A0diB| Rj`؊ٞ1ώ1tqQ]͝SVfJ)+ 8i˘*OIEC18 Y4E$hrي(zw7ɋv-+7 xoebD9ϵ [$5"l>C"`fHP*dY3Y[_iЃwPG W|:pݱR0 ㈞B$yl#;pV>dC IJ#qS@"RTa'&6l^Q*ybA`nLxɋ62qi" AA jTsv1ߘIhwW?懊:[)w*gטxuЃ.׫һ.CVk'PՃ%Q.QD%J(񡇈GRibyeο Th,'3: H12q||?n"f;!$J֎S' D'ulNH0=E v\qdL8 .s $;jy="'\MONnWo5bj!G5xl԰TrK7J(QD"BViBgJWHt&Nn3)2#AG2ć_3|٨X]!X)7f}hTQdQ3)1`ya5(o)NvqŤR1VP(ӚsIF0=BU-QRV&GjsG^N i7J8`vM[-GIrbI?ד&k;IG۷TooxQmʫfFM%{:kUs=гϚt}!ڞB,BFǥ.|D;1 iK?%J(QDK J^%Mu,PhۑɎIBI^{fI@$ɊRӲBy ^R3շbaU=GtCQ dt#oT;̊DC6HufGD3GnŷD8;րErHIU߀ ƞWuqYQӥQ0ԷsȮӬjd*,4(+ILX1 H BU%#Cc .doU5ߊ˙BcX1SF6d,j7|1Rs(1fȏLe6>j"'4/H~:կq?O@Q:o`o<%e[,F{AB m{v}O^ DX̋pC$XsڹtGv XD,䷧ק&j%>X؝FT*#YeGl*QD%JX,JMM-d{NY$gbE'v%-65g|%_# 8eN"1D#}PDr93n$ ؔ۸bs1csH$р@dH"o:%4#aHb$SVWGNESw2 $f>-lclDҶbxw[=D'2橪M7W]Yr b.yswox5F[7\^@)6^,:+܎mP]G3A={QI.Wԧ㯊;QsZ>*Q#ˎ\1G %J(QD {ETss Mͽ*6zlV@.@/B=|Gz萓BG8phHj!!'$)"OuALV'RH$⾹,( F 1^q9䟑H7r! /am rqC_(@`QnJ))܋}MRheZNKk&1uh 1kG@-~*4k]qU"5fGKuB]\gDrvO@ inp],-9wˎ~[^']},v $@∬ڥ|SB A {y]  {lu >?ALh)F"ܶ߂GUC|: _o:'_]g|[)<X4rp fI|JEQl B$HoiE GYp?!,^/of+JKϐ@\:> >Dy2JƘZ?|m8)P.I6 J(QD%JCTijMKK2i‡!=[xwNDl%뺞~*R05!-`${2Cӊ0jL7J!'bƂ￟{,ecƌgW]K(QGrrKo*M-d dRDaNT!Gɤ~l+ * P"B|i#tb% &fq TV!dI|GX4`C$}j9Cj>Zh6]jJY̆9Hvlg,8ӓkM1e+\{QB'%MU<#Ӝy&XD亊RܳT#'lQ'Z{ĊIR?Nϑ[kBF݁3 e 1M\wA`qZn_Piocm6'ޖ`զQx#?_,A P:T֗J\DϢ S&Ofƌ\vL\s<1sLvЈO~xt#iJp'IPo6d{)(?]wK/Lgg'Z[|z;w.:kFcU+_䘣bQ{q7]w٥.?J|pϤMMʹ4MMͤ ֹ*[/VV= x}DBNߟ "N8ꏅ("8:{3Rn?s 6YjjRm4+^R38S]ﶵE? ݉#ĘG3fX^`ԨQl[yKWggYV9|B7QF-^6ǯ3wZEM跰,g |\P{V.OLT(o/]Ƨ>)N>$?\r|ӟO?t]GgqL2[YaOKWUc,;rd]K~BKTZȲJGbSc^Զgou^de|sl5/L<[leFlzrB'RvI&`#F6L6Sb]N5nsF~7ώnZ׹XzU6*ԘgGS }pb2,Eͯý~hD^MĪ6hFy> zdi yLۋ{SLϱE4)߂oAM]s_R[^NϼPUu>'[NRQ!+/3c KKknnf!)%* 55LymƤK.R?_*< 'x"Gy$tPcd,x R=z'5-f IDAT yx9{y-cȪ9̈́7~ˇ <ټ?:;U7cC)ηgVw0' +Q| {<G ?yƷ1-@c?9sS Vy֭6T/…g;_h2d@ʯN}+ΝčONa~e+ݏڋ5 Lly%|{ۗ |o8jfjOq7fM/^s~˔ Xug;f /"~7ik^-&_1=/0+yL{w/xn2䞜فjlM~R'}'nZ^`ݵfwgvogɜoEj5xIT*yé*묻.|Q&#}SikkcVH%;a~ԒJ9# `6|OXeb".YSM:CE`;{(rn TE}4Ty&9T"\ W$J[WBunP+c7,Fd bqKs }S H^mYQδZDuJz%Xdk#GNIꚞV`1$"i4S@E-Nw6a׉Z܋7nXU)I@^7>B0b0= v)b`uPjjRR%/2|aKwgg//^F"Jxիw;׏8oNZe?ꫯXdȆc ~/~WZw<ʐ.fpeъg8#N+jك#.Ӈ^[xrr3맩ɳWYOz5~ͯw-@ip7Vy|39̸lN;})X9Q}xlz._1s_{_|c"slÇ ge 6cg̙ %azTiF*7{ays[ny4P,r!4ӛ#FKk=Zɺ1=nyrPOIX΃)bNzQ:n)-ԝFخ=C*y"QXVKHvHwY?{`zk 8IOcq<=nF\FgD)VX ~)Bgͥo3`VW^4NS*-M4*0cƬ%"Beq睜viqsKDVsLmwLc_bA{v}}^/B7af>rçW)2AkoB?ϝ~lf>3{#7Ќ*8t0~#GA†2afn+~[9S9f֬Yoqʩr_'F㏣tttnX'S"dJ|9a9D,WsF,xqp)4B-/Vn䏓|ut(U[ު`(Z*@s\qL$5yF^)sio$YLl4:u鷅[rP034jس.,h*_8q~CG(ĩq!(iVR(-^-eWE aPcF!եn JY}M,!WUP+055߫9&]oV7POWu2kӫPMi,U,宮.zZ;%>hii)ܗBDݻ7G}t]^˼vvm$p6f^Oa/_GoDZ+fLh%td`v@'Y~TavLn_(~6Fkә6}oZߎl0\T~t\fΪ1|y@2(\@=9G2o2lj2p#3130k,d2 _[u?]Y?Z[{YF6`,##<>}͝Kޘӄ 4aj}vbt[naڴi[,2J4prYq!¼]ttuT4XW=jq*)Xd>f#7݇$W BV7 "YK5JEF<r6RL~O?̩d*"y̩;(FM>}UUˣSTj]K&n ,lIJ\6!Sl5j9[=\ ) yqx5y uޤu{Rt-] 4O/U\D.,.9* "uko稣;gGј}7b-gu/˾V~"2 ԛ_}en@@I|8g2".]!#r|oeğd4Œwg,ciF[[XD6^bF6 gpߙ:OGԷyGiSo],x:g1'bu1(vRJ1p@ _W.},}zf͵O=ƛofloNQwP$ʕJ3fJT #"js;2'Z=湺ɏID\Eq A]Ҏ̌+јT#꿀$6طjF1] v(xZ %Jbq:#8;v,?_o?wߺc}fWo~#8ŸYz[=Cya-vj9ad.gfڳF3yי~Ag>8~XR yMkxNJu<ч ؀w^ott2p =49x ڞ}FoΫ>ͯ~(t;~t=S6!M-k[5),F}.}._K1l`+ " iJǏ{eN[3mN@~xVu6h#L6Ϭjc82%u-5aO4Z^Q'uנiEX eOsˊ@ql+n–;4G, ~;7+o6l*Wɳ$m=\ⷒ^O 2\bo"?6cz)Y`_)JFc=c&QԫL/9b=˛=(J[j*$Y^WgGMAizM5MɦhPlGur^vHe<iFe$H%[(GK(oE $dY=Cxw. kn϶}~oV;Cb'K1|K/2y!aytr3MWrw>< 0`Ӹ Y8Gpb/Y+ ia98m}!Qy 9hful1^ˬn:γS|쳘h?+ٗ OٞOəI_gfPOˎfc2u0|;|_b 1j{-OvOŅ?=_+]g*~=zBwمaC3pڷź˞{ѨbhjjܨQ > 5݆X)\GFU\# !sŏQ4x"jU#74GVZ&(L^wKEAgRڠJ5Fkb& ~CUTV, uw;ѩ8}.>,Q;9ANV.h/=,S2PwrA3Q%LFyQ{;ɖd6ݘLK-1fz&!tx BKz-Tc @@L`0$\eKt;թldžwgvC ѪLTGPOKcjŌ ƍI&ISS477ˈ#I h޼yJk۷oT+j1uƘ<8lx{-"X|ygje꫌~n х!䨵&c8X,F.P`8C?;ng$A#Hmzč! *o&&&/l"JDhb#eqwr+]_#Z}Zk Ij1I(@ +\(Q9gJ:uuLGkMFklfϚƬ<ۈM;q?X8(raqSnV"a3GJUb4s-`$Q E3im:Ľi;:oI$K0^)oH whc*ebәNSRe]x[.uc]Yx)* RɵMqq)!g@@vR9lNP' ׀ p_}N eCwv6}qe k$=g`3b-hA1 m" mF!j9(U D*"J"G3X'wmEd4k|{KKKRF zɦ444#Gqƹ̔F<{ooo率Ϙ͊uੈf`Wxw]uj |vEErEqaR$pERJL$`h-NAmgQjAMt٥}/,\|_> Q'CPM/#5-&O&[fE Nn@BH 0:ZNJSK]V$''̴oB6rl^JtŕGkIxRT"NoIbO$Vέ' R.|;A;-Po:GSEFZw'bر` k_}w_ [\\\\R]nC}ɡJˉ SC쌚UNu7*apLBr,B'R[xFv'tGͦ^Ω+#M7Ilvz1(+@g/ >m>t, /æ q$scp,YkPmx҈ buOW2iQ1{.KVYsgVrNRlV8h8;-vV؀q_(G!.B1Xb?c?m 4v=rvfEʏ=ػK%bp][,iC.e)23C`,{kI;%l}kJyiqX ^OYy1V*.76m-6 ecKh^11c@lxUDPBB"+UwϕG#;\ن폠+zm]]6>oK—[m9 fړcrK5ZީɯKWvrߏϞ_^æv |)=̲@ X|tחugXODYgBLNs;J^ eL_r[@`{>$1܀*BϺ9ɸMT"S g`)XGΧ8t|j F1 uYƘw.đ⬼M5QRc36^[F\ Xow_J*alॸ+j}[6ծEH87[.6G3ⴳvs+>]k?XY]cx}7 Z+t, N$7l:.^*7NR͋->CdZ}w]"RDCT{^(}Z~ٵ 6"\rH.zP~CYL:Iܼj_2|GDZ+/8S 1;޻ g*~= J;ͭ?УnQuD2p/WgٳLu*=fO؛6Xv3_cNTX5nY;NUCLZyF1z%sIJ)*mK+"v.^Xt!(" "s#i1,$b X1fű'#nF]kCd'@@ u^3I{NBsm\{wm(qqvk36λͯ#)+{G8hqɲ˛?ĺOࢳn %/֍_{Z[1 !vO l0`1bOA ׿{$0AClk (P EE-BGcAQ@i]\t*h'd2uen.@NN ˒k(=e `Ws(eXG9RD*Oˮ#c@EW˴#ɣr<UQ(,,?W9@"OcWÞHf;Үq<vԃH̼Oll|1x$ +/5[~{kN>78K "0s?+yyKyd-P$x[ы0x YXj A$UUt1 TQbArfÍ!-p+|[H) 4[' 2*v:-aܟ XQ($NȺ*k/0-3;XxaDJ¿oK2jUa`2v+cn׸wuB^Z$ԭ11RbRnl> Vk%rB$v$ʠ NȦ0`Kĺ6b3%q IDATC/q[7Flzιb?)r(y1r9˲UWD,>jܽ~\p>0EnOmR[˱~V}W_um9C=1#K90{pGXf糹kWbw~ŕ?]:opفW=޲?_{4KWƴyu,&'^uOY8܏]X`cofc׹DrVyw%dK4G~] rrjb]DbALL"Ny`g A`ņs(TcXiu l%ĸG"7ʤ y>=fFe5bϰYϨ4Z{Y޹ `噱l$ɋVl,\AkY1Vjc[jh-=v)Fƺږ.FhYh*m}+VniA $9W|وytƚ*"ysMYEӺN6dZ78a )f5w0M3/V/xؙcQB;`G@ fL;mΊhUTBBd^Cϧcݿn$Y`YO=2U3=zzs~ݮwcg?]^CD|mųk݄x*]p2׏ڎ!eO/ϵq[~z[ypiW0dc8׬7UOyx5XM"~[/~NGӟ|Bʶ/_旹'' ?1Fp{7hy@^.ܱo*@{*f?(ˮu,l_Vru૓fJݯUtڬ VEÜMXѐeȀręc{K'F[N%u;s 5!xMsiIDž%LDYo6,qiqy6\^|s01xQJc#N37nnzNj{B Tg%sf>Np\i$嚸lG*-JqVb^[.җNkbqor 26+u] 'pS/plD@&^/AEyDHCEvF a;kl7rb oq,fj\UPn<[8Dn~;_A!öbs&'3QD f<>ymn! gw&ѐi-xr6 "*PILxl{b>̅ SSxL#:7Ajl=w^_30 ,-XD(L,0wnmv*6eupXg^H<0+6}0L/`,m\Y _ EPR%?YU ^z[{kl۰;;֞em3"θsI>)6D.I)`SqɁMs:<=SnkDYwVEF ^zITHE)nfY7 VJ2"bkT ;>i-shmcՔ{d@ݎ sb;֌;xh0ŌYR UJ YJЁy{< B傟3:3TVXhf ^olCEO[(t κuCi3Æϧd$v@ $3o<>C )2U:tٙLGQ\|6 Et9tthXX!Dn]"+PnW%ޯNF]C\i1~Ը cFO+Y`+0)gsm'9k?qv_bn>lp3ñ`"!!Km"r93ޓMk)4_0(ܵ/u\9xlw/:Gj>8$ N(mzƹN5~}"N۰@%D&|M5MIU vV/8ٍ(̲..aٙcq^eGW'n@By馺(Lkk) 濹{2,a{":mt3@NՖ;Y;)kH*gMsuS#M `5р~)՝nbZSjzW\C3ຑȑ'I~q%WYji3vO)7Y/z{=O\ 3h >͛K$"BMM_ J!oALdv F7I`r(O1cA4m-24Xi3`Vߖ:ԥSQb}kl#1XFW-Zܻ q.*F8ZBYtClbl(ā'caNW."%7ف[ "pdp^ĠDh{^}(AɪНxB(MPZmv[?]J+д-KJP&0v) q_︘x6-TnAB(JqKri'Nf|ŕ~؝#|}%'%*-(J)j(2Y $b-++,b w4x̼iQ247-$֥^(g@}xYG=Vb3ig0԰c9%U<\~ys4W_}4G_p U=S`7~ gvVjv Zdz:G{ Lbnc»́)~Y)G/8{̞@JMcϻKۥl|HwBn$QD._Q9h1kЦ}o@(n1CI;7ѤJ't'$,+I b/E(쾯z{[ >+f/>)ZAe;S$㢳3Oڥ̰Q<^%a@\lD؇8{[zo[M>|;KU* Ihرwϼ˘50/1Ne-D*p fq)D:RT̲Xq7nL4IYF!MMMYUWWG"Z BAk'Ƙ:@6Z92#d/mQr%t`d.C,ݡdvv* Ɵ{xqf@ ;K,^fiuS,ADOw.^c߱ \՝#NIyٺ1i_%4B*eu&15Yմ;)PbJCkOtr{fpB٪f;ilּ_gꣶ83pL\'Ά>7^iڴ>DpcT|)S+Ibٴt-Ӕ #e^*R~{W ӧO7uuuY.P^Yeը~v t_*,@ԹJǴHN _?{w]Jk%@ +mVW"Rf6Ol'{jrL{?%/k˸(mk P6Ƹs_E6R}%qLԈ1YPo^V׵{8Hƙ'\Ukؔ{*#ix&gg1ISQ\LwbřQ}OˮiOr,켟h;:҉o\D ildҙ̰"k]ux%= 庺:uΖ(l@ Ӫԁ?"8+.}.6{+@ Yܟu"8kWI U t@vG)!*LToJ(++o(ŧ\HrmS f~gyOi&;k(4rdFrwK{4>tp3I AaEV* t%d}J}vX)!eZ\έ!S&.Okk_t*oGWK}1&MbȐ!=VmB γ<}EQx]i;Ow;@ ͦ\ڮs\$ww`ᒔ9TUז; \vKdm{^,~pz_TTƍ3ƍcҤI455wRhDg1-,J"ٟg i|{XJ~*YgoWI$gJׁ@ Xzi1=fiu P,qA҃He1&mu*I44odn]e@ 5"\B9NUUU*-\>5DMM߬Q`)B0d&&{̚{RГ'@ |5jj.7sP"ɓ'*R(,yWÆ-5 ,n%$sWǴ}wx@7dJuEO@ (g1idpXg[ny}>^Y%0 z cag:Q߯S?μyց%firӕ@ t%t]}޸ o;"BMM_ [~uuYEbsq: &"jkkׯ_֪"QK%JG.q%@ *T ߲n-Y ,P멯ZK{4Irzh@ d: @ Xr fӕ02qDsp@`AԷh¨d]@`#@ P$2$v{i|Ha.="5Iʁ@`SI{s< @V͞t8Gwb@`$@ HJ,Cׂ:(܄f XdJ'@ ,݉eb&9CO̮@OԿtEo] 7|]@ XB9,vz;a@B_\Po5_E<R_o. U( iҁ@`aSo E(wtt "&0z 0 @ YثU @ o3_[(+Wb1kXПaN֬WcFNg> TݙsޖYL8y'Jmf7fz'1:}:V+P,'9nzO#\uk'o Y8W[0zBrƷ  H4t}Fe-G9Ec1@ F""Q|M`P^`G{}w_H!2kn0'q1 d{ɍW/x o21p10@ x74F_m;:(^.q]r'/NOav;tv?{oXl6\'}C֧pǩ^fν`V/ -|LnG@7/^bx9aߑ/qLlvi5蛎†n+᥏B l s>}_#2A9q?Nyøm*l}ʣ\yyT[X0#|<Ͷ=x*÷!))<~\Lo/0hm9#3="iW] OF \c~{!ˑ_{P@3lx+ws>>?{['NffAp O3gBv1'qƃQI\ye}7{թsPgI/? &62U6<:oT-J11f.{TCŸ>gFn??jN|;\Υ?˻3;8r ^Tv/Y{8TOq>gEpsVQ?Նty;_ op3W,s>omeٜ0GkxΣkFSĕH;.&{'k8tBڧ5p#oW#ʙ\rNۤ |U[q?ߛ ;_R,?8~=2_pG!@pj3d6⊃/}7{_Z[}g~qL T+gpN+Q-ՏtΓa'㖉e[-# ?ޛԥvP@  P(|>or(iL7K.6;M"3:}EIDATtm=ï.b5op*>SowSߠܗफw2[:sθ;Hq9n>pCsQy73ѮG4z>\s)s"7;;wݗ6ndm|\_I|菹3xrȑ\s|,;~e/4۩vʋw# p/e#iR{=KN4~~^ÌÁTM8Mm]UtLOf6pp%a  3=^~>x 6?5prCrfS+<絫NW嘫onSwf`4qEUһ&f-'pikeGsʳs[)h*8׵ ioaÏ =ݟ _s3HP˳I`-vfpu*{_XVasum<ȃ\*rΩ|M^73Ɋd@75]tMͻ1@;op翾VٽtwϽ mR|}"o}"7; 7qW==۶)e_|O7:[z{>ǧI#4Ͽ%6ܻ&mwseXB677:?O=WW_(ų5?#w=:sKzCcsxPeuM{ŠG.G#{QbsCxy~&nx,O ?q'/~t˽x8X@ 4DFQdr\g H(̜aut0|_pQ_ۗxnbbyr5ߥqDދχG;V#g=wb&g13 CvmWO@æ{2zпxy3 {к:T )㡷d6cXUDrsgz+~[صGy}o}ǝaǣWo.2[O09Vܖ[/O\c8tA2e2WxGOu]7UDx}=tC UAnFߊuʫOfr}Y~3ЋsGQ?`cmPcOaÎ`ek(ĊÇP]IDˏfﭗOgF[vU3#js` 0mgĘbہ/E > W7ei05Q %(J"Űmwfh@نcz0I1z'[yщTp{џ|TEpf_ock:nO ܇ruMY|E{/mreRӳ[eV&Q5lKөMtO1P3鴿w3?7Ptš-0T+Pyp^ ]|xN#3^wK[ N(Hir'" kfN28 5CR3{:35 _%iW n/ϢYc1sд&?,mf*͔]̪iT@GF}y̜3d!hLψTsS:3>?#Sd |"DQu%hAw.".ˠAթ|(QVD|1?:'ɦGnNhse?R1}F(3d|:ZAC0`@f5ݽch>?H+.Bϙɜڡ j[wѶf1cNyۑ~ED$udN͐ vXo336Y̘5c ʐhc~nZRDhŀi԰0 X?yhbe4~E6;εx|?x- ף }fu\Z*mj42s3dp,>o,ª~uӚ Tz΢"uJh1Xţg3sNV)W`7"ҶqE3~l6f .㼵AO'nRHRMVL}e֠3mkQSǀ9|9#mgTw}Dy]~kBMG2֧njl1PQ__3RòeBy̦YEu&~>rAP .J>@ 4qfn:3iҤ:?X,82j33w|e 2}ۼ5C} o3#´|ƻSfbÆ;bCrs0Q佩E1x˝h\iH:LkCO݌yoz &>l5Ne.VޖG׽B m1,Y܅ͦu|_5Obv" Op0Z? fg ‹ȘUr[ };o9td҇ 3~҆/~'u+7 乛o?bͼ{<oØ !?ѣ0ƛyuz6&LܲTMi~ޛ۽uP jg6.Ĕ]nEѿ;B.Jh [nޙV+eÓjۏbEUƻ^3"3^_mpfa5<}ӟymF*Jm mDeqVכ5zN4| lx;n}1w_^Z"zogO_1;Zx#46qǭ1KxIjhvYMn%;~cϴMwb [f)scSh7‡Z!ZL>yb mWWO]M/&uU)OHc @ &DZ)ɌrB`LmmӧOGݡJ'E +mO̥rԎxݖ.sU 8e[\x Kn|u&~ȡt=9*? 3jȎܱD>;f/~)ݴcd83h;m /Uݎk&"ח}t eeWB!n| 5gďuN5wVF?yK؅mFoǘOWch=83]+tS_C:_~;nG^͜wgOQ;2p ~K؅._7VAT3f1v{\Wg6ǻmv{fO?u; gcm(F{5Vbc#`̑^vP?-_ٹUu.G\u@ 4~׿uꍲqɤIIeȐ!1r9TZj8pCOhZM :֠$֏o`.{7ODlcFAm(LdI\)eŇhJ[/)x s&.7+~ڽ<wl] 6Mq*w+y{^T*줛'1REPRKy3eeT'ֹF-Nee qlP2qv*[}eOmTC'*>KݵN9M TO% иfb\֫>)\|m~Su$*htiLڅ[.tNv˺䷛@Jm7@nmERq6u>noo!CtCC9r7n\ieIҜG.K>f1&8Ki_ݥTjrDҵ% KQQ0 zAT9 tvi8eb݆k߁0+͊yLs3ޅeg)lƟ($[Nک,~./]VrSN<]kmufBtәtSu.iZ "LϪl-Qq&^ - nNmR݄$֕Exly.@]uu@ $XkqֺJE硲B9(7n;vl2$5f2Q ("o 1_t6Vx>zs{OO/В[qY32{@ :"ҭ&"cafȐ!f;jVUUB 8E~"C<5FM^(G\퇧Lfp nu,K%a9q @DX8P(h ummillz뒮q9444q[[v3qGGGR~w)hͻ Q(Jw5Ņ(TY;T=@ @jZq[[H^ 4iuuu!=,] q/݋Ϻ=5551P\.n@ @ ,41m\]D:bMMM\SSㆆM~+ӼLb?n88q_Ϛ5KUUUE۹Tr@1&o98RJ)chUEb)?uS+D y@ @`)#{ރqDĸO>J)m1Ʉb1f~>o@-߿nlluuufԨQw== 2X1b455B{A\^ Zkoq(JD2@wB9km@ Kqw)xaiq(:Jb^(ڴmdD)ShswkrK܍;V\if*ۣ\.8V\N1DZB8ֺ @ 7T"^^@+bQ ';::ڣ(w"KY]GlبGaNJUU`oSQ$KGGZKP/SK@ @ @ XH.aK)R(rڹZ'GQEт$Ȃ ?{ҤIYnll|>EQB88Ek-UUUH8{@ o~FҵRʴ>Y 8ϟ2$F$ }Z,766VZI2\.EikkS}8 rٱO>  @ E(LEmkkUUU:˙V]I$92)o^r(>,QfK2q^KrIN{`4̩A<5Y8k&>~s]M(W>\-/;JB!BT =ފm{B!G= qێuB!xs4|G:۱V9RB!BT#UVcP:\p#B!8p-R[^ʞB!SaeϿ ZʚB!UYbeͷ Z׊OE:I!B0uTCSQXQ^^8G!BV0U|*\w;}$ʳL+B!Ny L.W)zgPoN*j>B!B*Њv>G<-ϴh+fʳ>V"̓rp-G!Bphiny(ϼ3m:ZGy 7pY)\!B!DDSE.'\3L[!PB#T_!BqW?T_:NW!tQTeP;9!t_YTB!8Ttj~N}NqL_i*đ,nʲLcrD3M4B!B)59MSQHeڲLSnGv曜&ns*7TUyB!B"-BS x8Nm~&eF#ٱ˳BA~!B!Dx Pv}v1;vy9JD_.vy4jLm}Lms*z~B!B*Pr]\m;v9jLm},h6g*"_kQsmi~yB!B"-"3Ѷ9` p1.ѶԾhvrbVu:!B!e-MgoS9ѶԾhTv~Wqr"3Ѷ}j^>+>5MNq!B!D)5>fyԾhDi^UvɅjSӸNPiB!8Zv5?ڶɩtW 'hrRI44.ϩ8q+q;NNqSP3B!3fk$É6_!BIŎ!t̮3YqϠtqF2np*'T_T*8 5P}PSոZܩbQS5jnƬP7pmU~!B!F ?\ 1u~>NkZ\Mcj:4ŝ*L'~0|X8!B!V P}`_lŬmkZ Ck5f?U֘ӸmԸSUQIw*0k:Tնgg.Շ5O.nh-B!ıL-~jJC.f}Գ#\5Y&Ӹ*TR[֢i:S;ÌAɳNji-2xfgEu\mۉ$BB!)\BFRH9jdu֌y7~7cf5njis>N J99T9CοR8m\79Q:fٍ1/6ZlZ k{ІŬOԯUB!p WDoոo;k;=ԟȚ&>5nzsu֘:n1u܎SS/Z^׷!;#?O ).6B,FQBь[sոٶRv1ZN1k.K;scOYmǖu] C[4B!BDÏFM[-NNq賷G<0 u]Eg:볋E}{&I-&kh7n}HMoѫ oۼ/hՋB!B- HHk[+[z<EC ΫJvmNmC-6uKj5ݱe]W -֌ !B!DYihןP%z?J%/4Z|qSaUF[v;WӴEj]3ZuB!BQV)11ccc7j5FGSk[c&e[yR[ޕDJ@qkgfUw4\ 8/n/pS+q dB!B0 w@mbVYrk͘OoF˜?mra]q;j6GYOBs)ǗfgGɼdl@ N!B!D)faka鳌>P,>B!$04uH45_ Kex3Ѯ]] JLuǫmŦӲ|䱇&}sHǓx|.^Gb=\M:l7q!KW!B!qʬ=|)Of3@ڝ鴶͘Jt.J!UtZܙmkSMjé<ӖϗO6TC5rjU j|2TȬEdtwU 菮i,Qa^!BQɊ4INCVSkg&3Oͱ:ڮ4f}8;13,͇6ǭEϬq3G)]ESA3O;5Y ڐiMbbm\SX@l 3(З+k熫p-׏ !ѣNJmƎIlLU&cGiFjXZ{o0z{j_UthF uhۆV-P̺([kQkVs"Mn8g86TݩjWcֶaLk*zqӒyTo{$^HjRH|D|F!~= \WG~^UZf /Z uu#c.W`5 F4oքkېP1q2cL2żlݮvQ \~=tUJvN&oLq\ӋDv_NJUk['{--sQ?30 uRxN<+k֭F@zD~'a7jU O1[ {nO Q{̅8t+V)=eS?(5.:ʈwJC9tjfAYOkͣƬg+՘&Jw NO j\m[Ywa3NX R j-@|pbgAl>OlU@~dtS3O[椆FY4 ]׏`BI۶'fSzgdаA}Zq3[ ~Ԕ2;iՒxDL9;w(t%`rnqT뚆i޻ƍ2gظy++WH:))ԋ@;';нw~f.6a-l޺ڰn&>jyywm5f^x tMå>x9Lv\>W^v .9ꎹUİj:mPaf+*];wdsO XRɈު·<}yvܑ|v,ji(fiCSAiRԶ)^WiRwV$Nkg0:F)lk~9Ȓ\ճ/D=juͧV\bhz]!Eahi׈P~p>5ڴ(Ql3Q?o=BAL1GN7wVK<}%L9g/Z$6m uDNN.}zF~A'cuWQ'6o~`ӢYn<&_P'3fxuR[hբ8nx7yJB|<SN> Ocn7O^=IJJb-|Wl۱nJzIR*lڲǞ}Ox7zX_'Y}zѵs' 8e2Cp$%%z:x#rs׷.+/:));?׮tҙoG3s}c3m&&N.ge܄ӫ'Wڵ9voüJw aʵtԞO;?3f=[Lػ?۶˯_?ulu0jMV[nFfϙY}e@0k|ntXoۺm;{~:]n7O>|?7n.:_7n⶛oYFc,O]~Buxs l߹wrjܱ_Ǭ X젩,g tԁGᅴ_z G;r|*Fapw#W(aY JkQs>bGF *.8;, ƭ>5W}3Nzz2(&+Y4@T'#jդRj3~9XQ>իUU|% &k:o1Χ#Ci5 }-3fn]x{sddfwunjLfϱk.Y\Y< 6SRF x#222Kt؞KbӖtЎ'Ͻ¦[4>zއQc޻3fưR 99|5I<#|hf̚C:yg_Jcú ;$%%CtWЬIc{)k _sEu̓/ #+3K.:x{1 +ҩϼ*$v- +:e2jii4SWе3O>r?.ǟE^~q?,~m]:u噗m^3 x~?..:W|42m0>v4:cIL1_N>3O0 ֯Gxi1ByvZui L>/eIunx-?-qoXz- >Ũ/ÃO>GVV6;?s!׭>-b>f-|0reK>ɇ1@Y$YLNqkگSԎz+#1Vv;\m7 KM2^7EaFmvY|@aaaBTjժi?`?ko`܄93`̹lٺ Ǹ iݲjդ'v0x)t܉ҡm~ ܽqj0\֮oL .Kպe 5mJH;Mq嗢i}{b٬߸ ˲ԕ,Z3"kL9;pmٶL6z̶ض}'={tףn.Y't%- Le=:O>R_իB-ǟ/(@A~WO&I~A?<.Q4۳b9vǍGuv(8~ǎiL9˂K|1q2"!._A鳋7xkHo_ػw^sӴIc Pio*6ϚKfMR޽Ncђedffqv3,M83}&6ltyq|ͳ}n|g\|:k22K~a'99;ṅ|#..9^j@4zT7zեO툋gSY?77e+Vzfԯ[ XP00 *kEbY_v ܲ2ץt~gD/f,jUSǟ`z7/?8/&׏BMӨS _/f{'hYY%PH;HvM:3)S{L1KJJm(}\}fqP}Z,jHfk]f~OBFdv7O\oXrujSا`xk [mwM*CyM`܄1j۪7n^)װA}|~?P 0˲jִ14ut ,#!>EK?i=a{Lw ZhZ eX~#-[9i ]wFڼc2n<M޳5kPJBצMU.C?)SK<Ϟyy%vMzF?֬ ^ %[LL <M  ;o/.ıjYJ^{ O\^{m$bZ؎xM3D,$qkqi7 72l&]]VɿG͘:{Xbs=NUIZ:k)lԚ5K@;[ J.sHH]:u? Xbw|Bܳve4_8ԫKJYILY}hۺKV-p143{vrh޴ qܵ 7sM7XMӨ[':E? gݸ1tBW4-pWUQN yySNӺe 4MK|BW,Vӷ7Ӹa;/30 rr`R4={ek`1upV^\.׭_K_>{y6rt]'J.`jּ\u%TMJvs̀%g Od.W\z(Bn\{I;vE$%%7o֤OM6Ǿmj̬lZ6oidrf@LܯOƙzѪEs4Mkt?La=eg9ö?M7UĸhFMuZ֮ߨР~==?OB|jq uԡ aggdܰ6x wr#>vȧaoÐGu?GN99K;~ȭ7^=5'sxxX|%_| ٻW|ٿ+WӪE3nx4wfΙ{4^|1>`,3+g^z;ozL8L 7;n/>&++f ^Ϩjԏy ^~vtKYi3{=x-oAk/džM[xY,a}LYοX|{nıw*T?<ン'_~?3fL6.;/K]g_}ãMrruϰ7 5\O {'5j$gT atgcCM`Qn`|̯ףx?q]3z˯GjMmoNJmRp:g_Nn^zEc̯ж-u{sV99hQ223ٵ{NWJw̅8^TDy8:,u%x;ڳֳfaP|YqɌf_YnFW!J<~NsTo ̡ 9?z 9;iz^-:ƎNfOu #p 1<Ԏsӷ7ՇG)ԭ {1K!8fxJݯ>q Nð-C:m>ŒpݫdbSm곶Շ8Ƭ|*I"gWLԅc9z%(?͠Tf]:uFru pã]BJBq\pC:ESv#2R봁Nq]Fz18g9+T\|iIn!BSmx;IJB^~-Q?iB!E?5khܤYbzƌl펥*a5!B!qB!BQY4_2ĮEvb] S7 *p;QAq\7bG~RB!V~ðXVs04 #Ŀ4o-CEĆTf鮴jQpC5n=IͅB!BQB jnlT y B!B!lv5bP}VU#Up: v;\m;(5f:xICƐDZk3c[ oW1XpxEKįF<;ΣgP >ۇp띯1qB!8jPu]d7+V ˍ$MN;<`v|f1M˫^s⮰%3l^܍ЩA?Y;Vw \vM%u69 #B"vZ؍[iP{sM̎Hr#V瑠 w:Q1.5ւS>7uw|g76/ca`v'K]& b!K& >z&4Pu4~p1 ۧpP>ot`2!=%*t9;܌mԸ-3wǻP>)x|}߶N|@3X0g^_[28e/g7uz0lʭEfՐC("bdg>#BB,jۤ8 dWص|S\i^*BV־pWj6aB}ZJ!?Fwz ֱFy\ع@noOfd$4m8充42b~.~,ψCM_5pic.2kw%ѠMw]v15FfyDM>ҖOgrW6Mһ?[`O<4V_'?O͊ҲۙofsÙ&zvoSiMڻ?WݖJ32|<4~;ϼ>b: b}H_9_Eփ$Өmλ\N_z`qLZU4뙗pqu:ޛKO ;ߙ j'p#rZM伣ny若osIqhE34r61_x#s]TkԞ^F3{:ȈIvM?o< qx;g?E̙1<~MftIUM*Ϗ݂7+Ӓ44_'¯Ӗ5C\ͦtݟiGMc(ܳ5ѓi,pzt>'/}>I<-;3<լGgp9Ъ >}cj4Q伹|,)iw<طuϟIL^*؛27 qjIb@&TQp^m{ЯEů(7+O|4O/>>_ UIOI?msҽA\׏BqЊjZ<+3郍*JSgrUI:Pj_jhظb9\h*6웹L'~r_KMA1:mVQг /-+SIsX7-::ćbպ`bIsdٓb}5- k_wxW(^/Q0#F|,>G3oaEj*oy,?->c:o>BqSO_}&s~L9U|#-r.i wРt>,,YCb3bM 'M߳)%~ Z~xιo7<1O}0 ߾gA/O~gs]iZ$[;à}[kKjm8[s ۮ:3X6e>[^@y `8~Z\0lXs ×9k~C^n4txn I 2[ws {g+7=F2>Kb9Mu<s c<☎}1]/-@/mIҁ4NES{ ˧Fn ڈ8Z%y n ;^]jů,r>o <'/~ix֝%gtϟm4 <[` {\ 7 ھ\#gX^B!1G?ԶJ wUβBYH\rNUg.o1kZH޾,{رNjapciɁ:dhr3 xqu.>9xfq#g ɮ?ApuCsm |~>GOA[Μ ֥`ɏ|zL[n~#t(AҠy;:.U 9qBV 2V{.{n"xX0o#;`l^tVn'ƕ3Qn"_i8!i L7koh@qhXo/G=}jئ/!ZOd¨!œetYx:ԆD] |HA/=b;oe޳q˭|΃՘k}C'W km>z785_[d݁>zeY`-E E3}&E3 #|t^LC/٣~m\GgId.[Y |B!m*/(r8 P;Fj;6K*.t]tuhO]}![|Yg1\Mhą=4֍CVEs u]\ǢE[ɼ2xV)l#tamn Σ"&>-ۍxMIn0Fn,-cAr.ÓMa`xe٣U果Ʈl7&^6-_IƸg|;_[YY01]4zL^tL-Ic zBu3i^G-h"m-'}VE/ږZSOJ/l?@DwH7huJ`}ӝf^u'*qUu:vlkR: 2~ B{J4+lbP+(Cى&\g ;{ IDAT͝?Lt6!ƭihׄ͹XYtp 3G}@^xkS%hsOSQ=J?Om6IlԄZ3Z" TG#7>ShYٝe&[h JR#~=;pz WQ$Zw2#g#L-X?m*ۼ$u_hi{35]x"MF'=`~҄F$hwO~miWFQw^|a䑾7OM*lD:,KM##qh '3Dx7e˨t~p>nI{>0 /9i{Qg`x(,nM~ %N໨߰>n}Mq}yLET f4O tD'n#w5zԴ,N]蚆ψ5_>K1Kz%ߺ˅i/Bf.n)^؄_pB;+\]icrQS$v{ߜȄfoِ)#ynd<O| ?>Fԕm?+A#QsyD#m/:sr.]΢]KCe Cݎ%coSLCB^srfMfilԩNǩtH3B,g|^hfR*-yJG)*#W6tJs>pK1j 7[*_ZnTk.b\?uIӫ0?&eaE_NNK#WtWs.}N.|AI;ۂ_MVzLL? 1]Qi@W^2iZ}įp5)f@s.WbۄB@衲YWibLYVvSWƏ8rrK> YSP)6x4 -IpժszS:c2|mbhiZZo$Y3 Z$.\j?m/<-"Vrp.@`܌mN uNEʿ^@C#&^&3[ypBS~d#={Pj,vg<;0t;9nM'Fub47Tzc6T^C5(~fY ZZp8S?SzU4 ~qٽyXş" H_-HE JH\B!4C[* CE1i:v )T"`!:ĆqFq"qovEĠ YjB5ϊyu^9@oD1(L,˙,Nc:fG:5t>63 6ڳ\^4zTsy͛?GыsOND@KLfndžiw-bdcʂh$vLKw vY?^LzjLGevT5C3a+J>Ot?Ob@1H'ò|/x0EUpSkulؕVǷLc(Nq={uݴhӜX]ß-?4rXhMj;ӭicjXim5Y47rL|xhUH~22oAV26y u/_?B!. t$pugF:Sw/#?>߇뾨x ssb6I|&aתO8gw/p/,k(ERJiqJŋJ@xB ]YB oiy{|w@ (@X=w,cCI#§[7Hӵ5UxƆqvtnY• MuZEeҨ uNv)-doNl(B4k]US` _A)E"vx70(4UF|ط#@&V0%hֶ+?E ROϦ%ɒ|MFV5%h+s0.mcᒫ$\KB!?C·V;e;ʺϸ' zԕfM_ٻ?`*e0S6ȋ~-qVQ)ᶕq[ JުTe|LJɯACC¹hyJ*go@m_${t .NSp|^n˚!qmԯF#*yp#6S70wXҦ"&S&HSs)vG>e7tkC\nŅxgj"$d"u!baZl?~58Sޮ?ƹ:㝥ioym(KPE8ӤVLۏ@  ^%=Ϝk^b$Cɀ3"4\92* ˉm{ӯQ/W CCm[ȹf&R6rnTspotyoz^駉Ć٘Z+_z3ٯ|-ge MxRp1{ssݝi*r&TlX,TA .b 9Z㳳fCnn<)m$T4~ԭ }FvҐ\<Ϛ/x6 N5{;}.>Ԫ)^m44͉Lސ^9a]Lw =WY*qeQ+Wi 2Uz4 /l ~2fZGM/e_R@#|+Nvyc34')K 9Z 3Qi:R?k̵;uͳTO!,>կ?I⁗8E3yRsb>d]3VΤ@ q̑Q;ƅ??ՒYdFNX<ɩ{Tp/<ԫ+KAoӠ\>=pJ7a }S"':%7F.X0,L62N(׀ke,%f1y@ *͂"䓛3eM)-a]W">H:rSN'>BW|ģ|jPVe\H7th:v.u^йlc~5V/;2eeoע"=pR *B1}WgQ;2?` |آ2Pś+Ӭ0zTp6#cf~Ez%$;㕭|7=lҼ ʕe|j-SZRtR߸US\\Ϊa蜹՘y*:W|sf}q Ή|ma>4,/'ՏU;2T07]N:AE3*d Ŝ#\<~n$WJ2HxW߽OH@3lo""@ 3%4?@ @?./~+@ $,cl_ 8aR@ tp @ p @  N@ @ D)@ ׂ8@ @Z@ @ ^ "@ kA@ @ x-S @ p @  N@ @ D-U5<Z5d0a"oj `w:y:k5ȝ#i7p5wJЈy&ш1Vl 3fDTx;k Y}?Gۋp,2#^p]Pf@/a@K_氜C,yk֞]f.4nDH6_}5*"˃~%8@g?+pQO]䟷p^(>,\ÇWdyj ^zuşs8?[^o ᤮6 lEϝ/ۀ˒yg嬿4.~rQlwpw^vB5/ >:/lyHxkO,2g6xuvxqHxgZ}(ذJE2 jiMɆHvA2S)|}k2m%'=GP?w  Op\6MEf]cg!t̞:V-Pvw? T̢LYwGj>{3{._`z |ƹ;{Lc ܋R_OƏq%&+K@;csLv=-" FWϝXxz|Kc}'#s*A(S;U\^יCt 1ަ*~)9|Oj4 Of+` aUiV&tV~{K ji0=tX#-?GfuG%#V&KƼ?=vΜ:V͜E (K!ӳu=nk/'*>㽧akOHVZ};*Ś2`Gή Iww19K2ZK*8[x̞S-LCksl:'/\W/U®d݆~M4Z ۇud]}'?2 #cO*^EQ_ ϯ-a\|_vӻ?o1;4ʗ#q5Teh=h)=(=3>dw jٟ}MveSaɤ)+Sb_Z#Fty"Q0a6.G yn-FS,24ROlj Kٱ4bW])~f'8W r7׍aJdԑ!úQ[B ].~4s&(aɶNok$a_>y٦ W-҉"9Z,L䧝WxdB u#?`ҢC⑍21S~N׹(/v ,ڐ aڶD$ioj~biD6pf8n٨3`*7ΊnK98m.>3]JYDŽgnoK?`vY긲{InG-֔VVsH }ԇUc1>:װT3<D&|9)c4&.<8,EoƂA_9)NaKz͘@,+Q ~E*y T/k^7|\%i2NCq$UL6Tꍜ"I n͟ sC2y>5|?wI΃ҹ$ޒFt9Q =(P=)yge\}2.\rf´r0! C|5 ',X lgر뷲az'q,{j^&Z$n/qૉl{G3bŗc9Օ)kwkOT 0yNG|j$-K`3WO~l/4@3yp<˗K7JM_oOww۔@ غc=Ƴbj~FԾI|Qܼ1Uosd4M8o?\+[عu)cjӈgosG}V0cD mVWioRّ,ܴU#KqmG8\As7s4_ŬM18c}jlg7U?.Eݨ!kW/gT*܋cJ֮w;6%mxb0!_c*5 Z566e5۷`L;b>^hi [H?LJtjmܘM;7JՈn[/Gǧ2]Yi!.Lk/e909fLŢX3lgۜ.lߒQ9?fvЮȡ@) Caۮ,?4C1vzvlnn4&j7X6m/gqӏ˥XݴeLIpB\sG&V`4g IDATeX{clatqŤŦz X6GʒX;+Җ՜yatd4X q`¶sv*?9Ɏݦ*yQBnH|r7 ,VΑ*_Ζm(Sp=;s&(1nÄY3;E+ǸSu7le>d5m{^3_ڥ_ou[ؾsݞq?y~Gnb}Vm6v;n>t'0~fvHg+bab\W g5.Sh_)G1v6VY[mY8Xđ5x:"]i6y3{Ss$OiƧӖi&tva\qG3eG/ck%v3=T-CCt +W-.Hf[Iհ&_b.6ϻQ4K]5gMBOeF6!tz|\bqEg,D;c1QWs0 x͆.nvPx%l.`ցX44ON㳟i\͘R˕֕ׄZs6eD`k30>Z}XY~.={㭌箳ؼ{wHF a[3lV߳qAv.2|诱~B7<:)Ow{XINM@ǚc8?a.+G2Xg5bd,ܲ=+~:͠nϤS/l2sA8;X|IZ!uJ6W9Ѫʱ×IN7jDΉfw'g+yG{,Aw7ߜ,Ȳ((]PGZ(#iZdHѿ!pxz(;}8xit\.tEh*|zӀs:{pWBs'Wݎ4.`Wٻ?j];S&ɗmzPώ/ВջjNOɓ7WImK9q9P%\*^N S| >B}.߶>,IHe YQP]ƴ.}c ^IH5/Ӎ g7oO,(֑ Q9rS:a _֩0Yݽ}H zк7N>lB[G8POe=6Uu֓+쾍zۈ\lN(YZ Ikr@%Wm6 ҡngpTV*ժQ<5l*M]}F=hUgŅrovէud@§ZkIMe ԕYb:+AQ< {'rq6ތFsp }]t*'A⯓[uEhֱ*]u(n] MiLеbN| 1<~j¦kp;${#ϙ$$P;ۣg1H.,-u4CɆ(SͰgڭ3ڊ&b xBISh&О?Ie7- \9fEK]i564,HDUG+}=6F06}39?g:CeFl#V!ٱè ҭX0uedV??'>zy$_,iӁEYG.٩S*y?Me/LRu2?$o`\+TöXʼHꘪ&}xMȄcPlsC:Fyq[ ы9~$Y*9il)w+;\`KHbF_SωOI4% ӛ]Nȸ1 d>OIxy{AT*T=C#}W|IecPbSS"f,= _3 ^YEXs/ma%' ʁ._}B \`٢%H$>O-n!Ty"%ua5|+ -);wb|xqNzpx ~#)2ZB7F 캥>nQ=+}9Iv5Cx#["am#ZJJ%xw%'*̯(+ΠD@A3DOF z}^hv廞PfEd],i("g@+ Gwze*5)f|BxZ@"OmϡΖU'y]gCP% 诳m)$ih y!굍[;\ Y#T,m>HFKOORFo9}I~ /Q܃(T E>J7/:CdקĝsxB)L?4)KMUˁ8! $G &7*5dz-s{,in8Cg^`jØ-wHdr4A+k݌煜~ zO`pɛL{% 9Κ^Ɛ!߇Xto<1MXگ% va4a3{gXkL՜M:1b} \dBjoNnU{1=F1lBZ LlՐѵN|Nm|G8rt]?tiOXyG(i۸ OF%=K?nG}6/3_ mb> &|1r5F6EVk>[>}NY;[6zنI1]įxl mP5kRfM7U&|mW"#A FwI% >%\| @hش%O~4<|EgԭO8i&N2u!qecG;3NMѺ4/G6Bq`ǜ//#lڭUPm*)(1\lwDQWhnA>s`.mJ{.Qu?gX(W|~MӧGFW|C*/i%rv|9 $q OAfUq+ޫOǤΡVVunJ6ã [8֗R#]dXf4l1tfWD\`s]:"n޴wP7u>5e;}HGsۣ7΀Ly>CЦq#4kKM.tؖ<栍|/6rBOiӠ.3T%_:]:iHToZc(evLmʮƵL=*wAL ;Guaݺmч6\'Nݒ]{#ؑUCW7ۄTmS=u؈Q;!@F_1cd@ٖq4#qG4[퇱s49/>iߵ7 )mc|tj,#a`jmH~HB)Қ޵G3Bzɲ #VK:,+ٛ#1K4P# KģIX'$s\ksefc~K{̷#vڎ2MطosYY_ @FO}1^:3jp<2\  obn(EM_?? wroǗ԰(?3͊}M5վV>lX@E~gۂ9p?>GN*npx,cX3.EܠqfyIЭw.XNn_N`u IDAT2{)-ŧ d^[9q N 4bj7¼(ɻ ; dPRʀo˿燕'Btho**wj9EpU}F*A(Z46/`#\zKCL/36'>J76@ -Ch1kvl]ʏ}KS- [tdβSz1vb]g3[([5{0FwF/b\gVϩV&tV~{K 1NG:$@ɰK>(ƾ9S2 )nbdVCZ]hXY:ˇ8/nds{.Ah|,<-x.F'hK oPi3qf8n٨;p:dbxJ:!x{d,JUzNCk_{p!9Y8MdhJ@w\%B"_ М!vp,ûYrIח? ! *C;5GKOAQ' }Cn|*HĈC:|jvf`6F0Oxh?f6]8.:C Y*n'd p/MAcߋ9kS77m痢S7o,=LLNt ŕL (E'}[ @$$I6GQdY4EJ4ti؝$ JŪEq>F -ΖA$p-LK99ZY;B{${Q{[ vшF{-~l ~jXB6p?JjvH{)Q: kɣUn:ER4S @r' o5dX$ 򵨠kIhhIؼW۔l߾10VFo 4"\`2pi~V!sR35`TF#XvZo^WXoY4G’[Y7;Χ0e6+Ǒyvvɫ^4Gj:|Ŋ<<}H,jf[/loO]͎M?^ƗgVn93s!U4p/gȂl_=aKƧǚ}k8'a#>0nÄY3;EL&{2fh3N9S͆sMv,{iby|,3ظGJ @~C-[ʾ:cpEx|u՗/NAKX| [Ǐj#V>%Ee5Nb햍QȶƧۢrJU6q{r,ɦ`S%!4KV%0mdc ^rXnJ@Ҟr ȃ9K~{=H)x~2Q"H苒h<%YVDp6 @ 28_Z\ qxǴ5G烯G"1ɦg7oO,(֑ Q9r˝M`/W4Prh% 6n@^w պvL /EgSsq܂ҬN:O6BE;8ީHgߒtj[ϔEC$zT!g>nAmeoŻ͊WXDm)➏ jH\V:VAPK;(@eyz07MAI5[-jx(()f*. ʱgH4_sҗ&%qV:Ꮅ|ie)֒V̉;.*7G̓␐eYdEOeQQPd?;:jnz'*EU@:7ADT E(" UB&BGZBewfTsv7ޙٹyM9|=< oԝ@-j[r8s%*۹؉^+Y:kC>cۃgTǧslsN3gvFUyEzflW9sS?S~.Ilߕ夵&ӜNS!r; 9DJ&)s&I`#!($)'$6D tBR߳t_ q ʅۦ(S8%r=> {)h!fKJx1ElDS{+,eGo8`(A8I$$$'BX #4?)擻)T@&le&ft W`Lf݁t0 Xì0';%MiJ=_cHV6ī&>1 PQ. _Ғ^t?|щ#؇ :9P5=&=͊}TΗ@?(wI9/dqc\қWveySki@I,Ydx{=^aq=1Ux^?U0^^KJڥټ dr[L _lB!IYDZ)~8i&iw?&OT{$$d`ǐĦP&Ptjmo~[魜ۇa(FXb.[}z<-r %8Db|"PVf>8Nb8dՇ33˱\&!AAKek(y՚|SsʷBhH8-gx=|SO5"1mo0فbˮ3o=̝BW]|bcq$;*ujOiA Sޚv8ADa49oSEPH0zD8]45mQxkdgFK>GiL4y> ck[蔻vLNŤ|^hCi/hA>?u+# Kqij\!kܭ.b*̈́ ҳG>x-m5)HO'/ B!$Sj }kI‡Srf%rzL->JbiYbщ&rOXSW2:#pj&!HS`F $Z@OؚҒ>,CI ߜB{F7YAV8Lc^dV5e}d\hI3M[SZrT+XSqbh%(/6K nM}vؾl-(~?$Zx ͨ +sd;l[]#&7z{|ONɬK~"LKi1Xr9{i5D3x3b¤rH<}ze'Y2ܜ+|ݤ[]̑]9虗9zEffKS@|:a4?gb$#=, ԉlIl:ze}_i:mR{MblAzz9:ƕٳ$V ;w֭CVŪ'喳8{e !Bwdh|YQg_$Y&\MZ | ]F[t@YC  ͘Kxg ;#!b0=(,ÌA]Ԓǣi(B۽1V߅MpxTO0k*vH3ngmZ9<9 y$R ?51Dt/&MIfDO:e5l1~_L&pVϿ^ʋ3r|ΟV́e<*s]]=t$ xuj{ƇFDT] Ob\#M|͋ Byţޤ{Ox1.-Uvb~40oxaAZDG&ƂEzxV#MD)O׵](߰r$fpQ- *5F]y*ug؞MW_)jӟ-?%]kj=j=ˊ(Soάa=މ1c{QleGz* ǖ&XS8rQΐd0SaowIrb~2U_kqkߏP}j8%4[| l{.NɭJ7tЍ}s3VP.1P)4LJsxC14#MyxCnxsVXԶ-0_3bc/4+<6B!W1ef4bjNNN6`@c^wZڗ-lnQyٵz΢n}]kV4=/SrZ61>eݱ DV]Yv[T ǵ~MM\j>3_Ia1(m8m.7mWOĵ\4 -Jљg.e=(MJ6W w}q Y[l\XP׷пI!BqmpH?ӉdUh=|w~Σ(|k>{Kq;bIo1GDžB!_' fk>t`Oj KB!Ppt1PWB(B!7_!B!DS!B!DS!B!DS!B!DS!B!DS!B!DS!B!DS!B!D0!]9q V AH*UoB!pON!n'OM:ut_%;;'s *WZ-BH) @ur_˓+r!J)UB!N!nddSB!*I8B!B I8B!B I8B!B I8B!B I8B!B I8B!B I8_2.iIWw :>D#>C!ٵ@ܢ+Ջ=Y`&TAZS߷܂p׳kߚ0~ߘ?zMkTvGkOkh[nΆcw8PwfhVJ*Bq3mՆ|wocWœ[i$&}g[r]oQ;o*nc޴0~z/dSf =ص`l]Ybwx#tI3$j5$3{O͇$6;+ۖ& B~q~=ԟt*!BvFmhG62~wZQco+^<p [6`nT [[8V]Ñ:Yv 1n{EF,k 2S==~+'z,>[% i3c죬^NYsfOeś+HL_U=V~̄ցyRA뻶{4l&K7_? d;(|i=+ˏMe t3Tg_qt\\%G4@F O lY+:jۮm[.8˕o2 36|%F;L}:%VCodLwPj?kwa܏Y~-ÚHܕ ;_( #94&#M M0t8}^+:9P5>WLhߟY+#f$N11++贩aIxbu5X@nkevc0o=+u~2U㢧h!Vq['ZŇ)p"RlufY_k⊮r9aw<5)Dsey5ÚGo8y0/A8I$$[솉 _Ғ^t! GVeٺ_ըCW IDATTݞ P $c<b/Z!tM M{Y]gf>x䫬3zM 9.AA 1(Tq% 02.@@?+>~w7飩S Ӻ/-0ce?;ck #8g.gC2!4Q0SNM)-h4V'(QyJeJw 1Jk:i)i`):in`o9Rکּ ~λߞ!&C\pݣʟ@Ź?NGkDNkM:5#(70Hkb% 4oRDcLFE81߳`Bwrjm-Kw{Ҕ,Y*ӘBٵ~jr{\׺1d,ǜ| 6V|8*-`Me+XSW24\IH\.*D}SpTJws!SNXNM3|k:W9e602%k !oJɬK~" Ki~a/Rs[Dcͩ|K%0s+;oo\>*凘ۗ#̛;{4AӮ!Bmo޷&/FXJ{i(>(1K0cPWb34*i[h'b4$j7s_ax/< 06:iJ: qdMX<7|$ YjIgΎkO))=?4牆~NI-jGwaD`FS3r|ΟV́e<*%dxoвc~N)evNtLTЉo`_( a,,vJCss_MkGVX/wTsIaSx Q\8[Jf!Bwp۞>k)ZB2bB!B,p۞֙WwĠTYu4u_\׸LB!ON/ng)WB!+r{!B!EBN!B!EBN!nٮBkeg`p-B!% 7H'O$;;ǵJlN8NkB!D.i7Hex"NI@`JFyB!H) RԀTVk*& ]B!rI) "(( *!B!/5B!B!$B!B!$B!B!$B!B!$B!B!$B!B!<E(.ĐZ%ǔRRx YB!7$B WH*w7AJJ*ΜS!&)B cb|YI6o!/WK.V !BI8A$ټaUB!I)B!HH)B!HH)-EGGZ,B!n!p !n;ьq"cOCB!!EBV>c&_z MӘz֭㺪B!dSq8|81r4Ozu3j͜O?t]]!Bdprxly(jѼ6s&#G7YVMƌŬ7ސB!I8o GifӬhKK~˩M,5?';n%%l>e 5C+_Ѥq#D>Ĩd?|z>ُ͚Ѥmo 6Xփ# i5{s쳛z 4nB./䉶2.2hڄ;3ppi%f\ٚѺh>8|p~pq2& V͛VtzU֝Lff&oΝLjé_J:uf /0oӝB!7$7+ >1 7'G-:}!:&&|N_-7}?Lbq:9?cCjK4C;lS!\Y,*5^dͶ|f$bL[h[3qA'Zq :_~VM/3 r c70e7z%L;WW(3|vv՜uMۛsP^|ɦ#?wB!&&R ٌOet2&ٯ1zwL )}#_3GX2~z=0'qL$C%|n ୣ9d+'#[ǜ%|ƶ#ߣm"sѽS17;Q,>t$^!I3a~rO!M+Zwyɛcd"[7Bg=~=;Kǰ‚O2FIdGѦ ?En}_Dv!dA1t1_ tm}zLƩ/ ǠC\=o'a5;Ѣ\cش1GM 4rXkU`/K6C0Ν>I޽apzQc{RnLΏ3MBLKҤyu_9.,7Q|~= ]\hn kP_ X`![&1y-/gduƊ_{Q͊sVi[1mgq >r?s,Tl~]:G3/ٸr:m..bܒm a%U ddҮ˻"螞t9jnM^4S]܋rYOd~^f<^4 rT7. x];XJ.wQۋwR:zAɷ<EUnOzax(Ѵ)U/r1IQ6K~NwCmJwi»Ľ[Ji lq4>Se$o9i 9yW_~a-+GYx=- M0f {wsYsnRZhF>ʑ)|}} #> ޵[Ѕ_~8ٳf #-/?4}HOCKl^M7IYӛj[HۅB!Ŀ`I^˷R6u=qL&>y90i`;WH+Nq?o pUa%7; %M#Qױ'BxI_n͏bIC &1f2aFk<֛]&zo'ّ 'Ա-  AMCΟ|⳼9ÛlV@zW^O4|KԡGF#fPE6})iv[4_s2-1o_|40ŎRt]Z9\I#N&,Du/7YIN7̗ D5 ',>b죱x\/B!& -HPgX5̩ۘ=#er1'8V.M]Cٓ\WeWid 1ɤh=CY\ZL i5 Q !^25fSWHɗunaBC2n9y%D(4"i7;fNF0t0z>1Ѐ&)+@B4 a@+ݚUI6Av54._۵-/0f !3#,(uٙ,q,=s[ťD6G˸Jo,ˁ_5jq ?_L~vUgǢ!BBd[-˟;Ѩ$^ʳ q2MԦ*gg]\i*<:u7./ z}ZߚS6<2ifMxFMpiZx{ƾ/{>%u"S/YS21iJ  ׌$r|9MƔ(Ka卑*`*6i݇\p5Ogҝ?SPLPuLw`нX4Kշ =60j'+( ih}:#X@6H7(^%^MʞhYQGNiSc&#|uB!|+QyeܼW_ixiӲr~7qQ:4cF;* `t&zw 5u~C M?-w{ M ݊l`m:ܑ2zlw(uޑn+{0FF`mvZGyqj0tin]X l[0.y*4q+OҢy371tnGm&^)4G?p1gۚ|}8_c.t:'+0ؾ֩SN!(xkٹY/ X+cXv~םe `8-[ {K{k##7L\kRR& +4uy>u Jj ;S\Nis4Gi[`ۂq)k7Χz7ϧzw|T0B)@)E: Ii6dS!B\p !nIIu'K)BqSq[QJQn^aԮ]u!BqSq[YkB!H)-Z!B[zL !B!D_4x>_lՓqj\]p\h {r!o9h..Z0"zfz7cnd˦Lk~c'Ŗv< 4} _D+_g.җztZ ?Jފ^vf#C?\5~d۹6Z^.|e & IDAT>Vsӓy/[?eb@HBԸX{拍cc}ЇAVigL-PS0şbگzѯn!jAepY~kgGB֜31'ߺJ+עvxk2*B!_! gQ5}wbB#ֽ Ĺ}j"YozTDŽF` [K3hT(;6ȼԜر+Z o{i~DBj0"ׂ t1iӠ~A#KrhвwX)%B!B p!ʑN*+\B{ǥ8B<ԙy+YL|F02RHhVٰs'i@4Ns&d㷙^ #T&jmUQ;ыSbЬ@yuVV.AҡkqnQ_3V]5UGIs@zQ^I]W>(1K0cPWb34*iиtyy>O_EXhӺVʏ&OOaٌ콄Օe7'w7e314?P4l^Wh zST?ĦMgajLx%82&rGVRgCas})ǨT9<9 y$R ?51v7g2} ׍wڮ\׈Ʌ_h4"+B!n]_QV{՜Nˎx8-/z3`5oKO:n]t<"Eaʽ.h&4.WVGwLU MX_6=TἽa޾n?o+ֱ;_h[ sc5?.`6eӍ|B4}[4 7oJCit}GQmg7لttQHbo8*z`9` փPQ@P*@EAA:! !!!ٙ$n Cf<3n2U6n)^'XE_>8]{O?B]=t{rn3! %J K Een:ÑRIc9X" ϯ%C>EŨ]* >V0reuT{t}Z6so96j7l03lX֍,)}+g]=gK&| 'N'O8 pJ\zfxt0j◤RloٳwfSC[^ww3髙*{~΅tŧhPߞѫ;wzW1azn =1#|Bl}ɏ~f~SLӄYU@uXRhq}ԣ~4m}I^ Tckș㟯SQԺ/ihp=p.=-+Mm ]}ӷE,.(k7g 1} ꖩŒ6|nt _} ш=V%Y*~qޓZ;u@yz֫6!Yf-3,`un-qƟqwv/$ޡ!߽ C .Ҵ'O[=;U}=FcO^1K^?e=# ANgGYRWO^meJnTr:`(.QVk Z 7.x#꼃԰uxaJ:,{Ij{衩35tn5QGyZz>9g>r:nOZ=S]f}OOi[BK֕qENfHoq6<7NddsPNSPfM֘6 u=hi( 4 =J_]6}s_ j`s rԸE+8jy?4m8}Z5Ǖ[q<0t ;UD_եgݣ^ Nsn6W_2f), ~ 7#.ԭ.R"-quq<:4oUlկjyOϞҕ R߳sҖYc5״'xrש:4mMW“iu]3dS4t =F,'YÇjt9Wo ʃ{Sk^;X)ǧ W_=vd?zN:t>oKUz!uGe+֪2㫺u2B<[m G:[[wⓇ߀vk$ńa4sul~vVdmW!#4η'iJ~^3N<^ ޡW#׷E߽pF>\'Cn>S1Me,[Fj؀pHR#\y]SҀcGh=iy Rt.;e0T#.{Xg@o*)υ5p ~n߷-NanD [}=Mfg } CN%\K)ݥCJki蚳W5|#t Cqi+1 s4l ~nyuqaiˌkt-/k5b3`.kV74)y3b~QK ¾$T=5WGީO>\RX\;jn&}5u4{F ?Mn-ܶXF~M+e{v>S9#A'Y&gH!F*zOŧViRԪQjܨN_z_rZiqJl]gjʵ Y w-Oy}^\Z @'~)U#DW?NջEV&Kqj9|<O˟XG kcJ5PGjݻhqFוʫOh*GAA!pz`s{z?U:e ?OOJ75iF24R-]Y굴zQlzzٚC:)Cm [,սЇ+<\>>F61I=|IonV=_3 ^X#!\5O.?XC4qnmNyDo0G=u?YLYŃ< o@/_A?sŎ;!-~8F4kyi~ eDȮx7?:w&N缪-#/6I2RԴp]5g^8;A3}UŵZտdpޙM˟xDיTߤgrw>ܷ҉Ђgɡel}΃qf3WOm?S&krM-dJ#g=I-U2%mcRxz룏tQ jǭ3ۯy'UxDE$/v˭53eNI/{Җyoc5e\}8*XڞOCջO$s~mkR;[uQ5V'w_ؓOфGkbw#jz왺s`j+u#۹oH<**)\B&: RxhuN+(Me٫mV,zy~ZJ]:&s*Z^j)u5tf~=[]}2hôO{=HS9|_ 6Q@>%ٿ|>I-l9B7S!y~~#4MmjoqFNqJjZq#CBKZn7Zuy̕s5cA:j'7zYE叏@3|R|^YZ:k VA tO|+#D[ aIm:L]; 5HJRBsmK+V*j+o~g_T}MWNe?=SAg莅ˆu+җ+:GWHq%$&gd(!1Aۊ+vBOkЫtz/_1']iߧvTNb+dv `ҥsg3J1cԥsgN*Uf[ֺϗd(?whپ#$CSii+`HMKjFIߨjr7[R$#M~?7H%?kp8grJ ӑYRE*5 qS~Nc_WX۬RdIɒ|el'P5mPV}?JMOB'e)lIgGjiUZLFf &jaj92 SrrjFҭ-UC:jԨʋA5*7/]jY sSy |W*ԸgYx/Yy_; Vh/?+82o)dYڿQş#2#enۆK{fHfPRF-m6VůLJ Ay${LKR&aZ_22* )J/S)s6*;=|P=iB%2,.72T܏ ؽ )_y*=1$)Vj~>Tbh"֮t,./ӟ_M]\܇ѐo./Q@C$I*oSoMI2T^J KdZ[*VĆ*޴ 襤znSܳ- V7\/]#$)IIam-* ` cƌ$.FHzf]:ᑲйr,Rmv0lJO-[*is]/;boԋ IDAT.KIfFez7bISN){O4gJw3KWiO5}=*-#ꗿm[iۻ+kv/{ k|ԲOӲ}%h-cfEP|j y4}*#K*VQOxmcv?~$iܸq]({vlj5iG6+2d>vƝ[w<2ZӰ?hCВUJ>X=K_kCВY^tTouTA7_J$PI2TO Y/ݥe *"wk;vӕN˖ȴ,YVnMl)j4Q`R|hV,Y }k(.4CCErm*"cշKoʧ$uZZ,)+=W-}:*ElL*ǗW5xp Sc+ڠR|f.ojs&vTÀ!O͞kk*?o-:m_2 dΧXR䕷VK*Sq5tH=;YeeRi*<$ R_sܵ [b۳ScϧGP?sV0, VuŒ7Ѣ"_T^}fm q'}5Ŧ$SE~ղ 6_ZRsd uͺ{Z[R$O~?yjt( Ȍع矡-O=`>2kza3QMS@ASY_eSǬ;V>o )aTTTXR#WMK_mP*њ^#5$W29Z]Ci%E***RqI,s}VnʔdnwSSȸn[?64QսKκtm6w3 4z,hج`HF\Gn*0RuYgk=It4ahL袡}C]4 xO&>vN@fJ+d(+'Nӹ!֠kЅ`Tf(s5=:x=OWÎa\m4ÓwҔ3@-?xzh ]tދJMN>Tؒtk}W8?::]x~xj*.;?m.ZиՐqj?H#Oj~"w8Bn{F ہ=(Wt[DmU^ǵzϽ)IWܫ7ּ]sFu?imhR@o:Wƌ[{'ҐۊhMA3 yAO_ݤ߭.W/λkm% YM:ҥ_m[@?tmj:|]UyRq^MyCe>rcپ$;"')ƻ#6]!*oV/hJ$T.e+ja3$YLU '#UWty?wWmΒdSh-YUyU*kYfϥWNeDnsٶʾ!֐ale*lJ>O]I2"a/;S"-|ulU~Lv;s>S UJջwowyM >WKի7|rgiMv tJ3?W^ʿ'dGuwx-J#k9opdTX;H>=oŸ؜6[mklg4Bu:iưJ*3X)U?->yp+ ~e0Y[+oWj7_sᓯ*o' ȑT6Zm_e\ _ٶ$0*m#lJ>|>|^vݏɮf,_7}0{[uy{$IzӚG-m]^\3TלAݩpPkWKCzPo$0tP+;ēؕ2} 4coi-y6H?Z7M=]GJ>:]j:h.+G|Ԥ9gT+J4a2G p1/3P;P{| 'N'O8 pɝQټ/}LgeYWAa᰻JMIQzz p7W6M]^KUbGR_76W$4l2* QxefeꀶW8ב}&쭁}竸x23d욝}iZX(IpV6 ZWdjPJ[wOwmبKkp͕,[L`HݺuS p7`H˖e˗}fgo˹4*9%|>RRRT 9XiL~ukPKMU]P^n,kƑ.M=j` pxW>O2|Z\ +1.ju*r(R .Ξ\9=m|Pl$vVybO}ˮnxeVԹ=5pQ̱=9f'Νڮ_~PWjCj/]NIsGv@kR\R~{=!p Oum5v}b ;:p]'V?RM$Vݭv4wՉ8P`VX}˕;t^r6nAX2c\֛}FuҞ;N |X$XieGH_{Un1Wjj)ĦmD:=r}/%:V^~9O[v)u0y*mn#gh'G뿯_nw;C+bե(NMG{@5]RiFXމQ_Jo.r kן|l]ѷroGؔI=~/D#E-q:}wnΉdRSi%9ވ9]Xu]R`VXےԸu[Ż #R'!dhߵ&o,=e[+NR Jޠ+6)Plo~}$K+O 6TC(Ne/ӯ)?(%6QbhO vSUgĖ>I~;['Ә UΘ^L+Jh|?F'lZy7Hnyw tIݥ_dޜHe/ޭIUt4xI+kU_ TG4eGJpνrpwOC}?՘(q4ڶ̸Vg~M}`p];Le?LJ\/M9-o7ꬅ'kƃÔ*I*ЌkwhRH,zM<ڦ]tUcuQ)/&Б?>R5_k1ƫbܶkuǩwGq2J4;.U]Lޞ;mmڢR, kOehEݻwVIzbe'S>['K0w:PJVg&ٿڦs?WԿM )˹:&}ђZ/Y?-TPtKUW/c>ʶ|8Oi@$FcZ~\%qt̩  -v*^F[wjxLN*_jOkޟ9C[+'7쥾5wU7]v,}nr.\ï#NҠ ɷ[+ușvAjcf~=[]}2hôO{o[NܶsW~յښX}ms?08eҵvoxe5mf)9.nOUV6yϴ.aY$ի&-!)!Q  $d_j(A:G4Ec~o5XIV7ѹJ2W͊}Lմ 5teRVVP+!H)uH+:YR$_2+IYLP?M?6nM',)Pa{k5rکZߐeZߨߠ*6ٔu?FBP_R$Z4W}]enFk;Kd&Ƞnmy^vsǭ]YTR~ 9n_iԺd6K?tP3U35 5T랝(RR *NKyA-հ}]}.3̕'I)ʨPlj9RSܰz z{%7fUj}O2-Y޻Ey[Ȭ!hc#Ԡ9++~eY"U{FE&飥e>[ZtKq떥tb&jԨQ٥:ih}'SFy5hotԠq:ϩ?T`J2){Ryو:$Y󞝬ﲃd`~^Whmd{z#gM~:ۢ-;hX.OTFX #Y-:u2-bBW/];*1LB= O,OVYʅQ:vܦKg $3UF}=P\!>j?J#i(+tݨ'SZnHq :hāxi9#45ޣQ/=g/m>OgqIRPPr K6nT/eT\/RoRJ|j}q:隽fw6퀤t ztL69B}57|4t}9ڦD5<8E:z@7<`VKk#o]mW,e[u%ڲfUwm-E_^ʯ8j/;XcKw8w]wF6ˊ+ՠACwyf`>Aش)[[r+{:{[woJ>s]v/tGW|Q {r]sc0,U΋w@®ybF7ӊlJg]Q|ZZ%uw- &Z6@9睷R`}Y۴%PAl)\^/QZ4Ov1;)2ugXN{Y}-m^R#,U=rꬹTl7R_K8X!Sewl*Ru&΃^h5s&E6+pZ,mhszv #U-9R-u^p;D0h5ڜjۯNgK9ywhS{޽.x ,Xgmh>{mP %sYǞwNN{Y^sMZYh7]s/׆pOy{/ +9sJu^ǽ,EyfWΚs_Ԟ^qh=_fs/V{Z&ڀ\ev*~,virI~m+-uQKBa%] ;wTwڬ-Zm;{p6@ f=oF.|$P&sYJMIq7U.ݯֶ_jlO9phٲe C&  jeJMIa,U Nuw5uroɽ쪟ETM[v;m΁v5#5%IWjJJVg _Es^tn8ψב3MU4k\֯/Hv JKOSfM]afϻh}YĮ ձ6s;91z5IDATg=uA{'0wԳԥ~=at4wS2 Ciigpg-Z?7w{x; R#Ω]QO_djnbku4;qmX}jLkjs/Ǝ]vg8w*ּSuuVfOykªAjY99n#pVp{=L{V+ &v]s9yh=;lw^{^v_bmw Q]ЌSusٹNuS|450/[Mw88݃\v֥G0}(۾fg?,΃a^vU*ע{/ *Kq?(fam{3jsVw.^6UlWWsOG2y^qfh>H2iM.mufg{O}~hmjeJXt,ה]m;9yw[zv쐝 uq9{wyq?ewuϒ}&f,^Ͼmrܜծ MSc @5Se۲1/}tyeK,ڝ(=uLMR/ӽnJgݔu?2LuH] YrIّM|E*bF vY3\XԦNqXjY3}Z]9hm~Ǽ~v1_,^6$#qe{,˹-vy$#}-|u5{޹?bX!Т՜Ξ/̴k*LXi]$Q̰amۂ{;s9o3fj}hv=uh5=?drhխ瞗͊5Syĩ쁋"q6jEw03xmr,Zsmz{:.Ukvт]s.;âl6]w9lc9/'V=hv*{mUw6^JS*g\PzѮӾfݵhXv hjm8k;Ĺ/#v8t^ziםu9]y-Z)V{N2pnȹr-y>eLJΚ> ܦl_"UM#ޮ,Uv'wjnZv`Ovsh5{f:}q.Yt]~:5{;vͽy;b]~6mjWNKÏ=ڤɮ9* of\\Vhb뵯#is.SeGfDjaǼ(l;͹k>wwsǚw.ݵ9[ Ҳk bEgpcy6缛sX:RBs`{ޞZ*{Q7USʧʧ֚ey=SisFd^>ml&Vؓ ?|'{?|Tg5QJunwλzmԶ_Ձ3睶C]s&ۻu\ cVi: T.QwϺQq}_\YqY_o/ Qͦ 7SoOUk2׍9~%{srVPl0}1ul6OEs3r>:^bo}G56K}?[k&_Frj$SbmYZK}Sbބes˦ћMwc;]wӳb|{|{<>Z{MR?fz?RPgݫjQr}Sgm8x|Qx:rK}_ꍣ~A#:7UP^:ZW]3x^ş㥋U|:卟$zu h-fTk1}yޞ}pe~XKXGm:zLMM5U_xYkLs0Q(ܓ*]S='=]Mƺp4fPsFLfX梸_K]e^p.Kh(ku~j6M7i\{#{[ղZ]1}yGsb3t9'Pc|[.o&k^y]Y2s_ Rr|o~j\cMeTe)_}]N5j޵tn5KFƵܑ9[3޹uFOMI.( ٬uy.gLF=9Y R}\;/H_?Hj9\ֹ{)˚yud:mg]X &cr9l*yw_}]ʏd.2Y gZgW6ʕu.4ˍ=o隫 Qc5esӘ95٨z2#xfùGk{,ֵ7ʫƛIo:QTgEk]~vW3Zd3W?GŶ@5YoH=QMswùԱ&bU?ij?׸7e9Q,_}ONy]ۊoV|rku5Dfc^q?_yV,u.6s~sR}3>ֹ.˼~ِ7~թ89U\5n뽎v\ǜgͨ\lކ[69|:Ūxv)Kk/'Q_͞պ^,͡^{Cb1P|68 gG,viY,Q eqP:fzYu?]MufWc2X?ZGJUܚ̵θ]s3m5@ϵx5cR}yȼ"ܻDM<1ΑMxé5jpۊe>&V[g ۩]es^QF񪟱\A>+稹_{b@PE=6Ș:sUc2˝󈥾7Gݺ֘ſq/͏j?O#DLAo'kµ'/92'Μb9l9R Z{K.-uq\hɵt5nkTn8R?mŪ~~0iTyzÙǯάu.wU}y^2uKk=ɆkRźK\yGy|ro;U?K̹6粕;Gj|fT/d\15{QћNk={ct(.]dc{3]]ݑVs|=sxYn3 lObU}#d|(F>l:]vwñ缣5rW.JѨ&1u5U}>k~޷ǫ湪uūr^|=Xg̽դ35{Q<~W9Q>ks}ĕ\iro6~\|j>sWnhLg]נeM\יjfr+~g[hbFg\wn_r%bV,9.uSfG4{<[5oYS53=y9QÖuU&/3u9=unG6,{SSnԸe]U v1\nnOUbUx<-fM(ŻXUu1u9.ŤySG6,{>[7jNf agnw]5o:S3j沮w17ڜw둻ydòuU?k4u[cw񭵌FMSƷ5|]̍~nh=vo!nl5]mոf4wѼ3ʏⲕەgk(?˨ݨf4wuU=MȑV3FuULstO]˨9ӬnkHC՜:k7k0g92k7j2>&{̹]o[g59Gset19xg}]9v;ÞٜZwzu`oN躓5[>6S~Or]R亪Ug}nFud,U}l=GO {kq+{oɕues֏u7:z{eCs3s]ݿǕ{\ +ؕ{]>]myۻ5HэϿX=gx}g5ϺCmMԫ~W㼪{}o77Jg5нg_k+ g6##tCf:CECys}G }~UkhIENDB`kraft-1.2.2/manual/images/nl/number_cycle.png000066400000000000000000001562211467704360200211530ustar00rootroot00000000000000PNG  IHDR  pHYs+ IDATx^wxnBz. M@E{`G/bk6TZPZر REQ:J $!$;?v'lI6$y}f{93; . B!B!B!B!B!B!B!B!B!B!B!B!B!2TrB!*D吂 !B\dQRF&H!"08s B!bsXO0p{B!8l&rA][u<&!BCAu,1UءVV !BTUQ_UC=P@G!BTUT(B!?BB!*+kܸ; xkƉxLB!Qu,uLR k1^D@/vGEB!++m*n_)k[ȶ:nn5B!"^sĚ[m+Eu+N+r<VXAlq#BUDzhs͋FEƪȶqU]͊GEUE'R?Dc%W!BKQMnHѪ86.C[c(vpc냊 !BخHhwnU]gFn{>8+x'Bqwn<>8Fy/6qQjy]mln+N,Ē+Bq8X%M(϶٦ªXuܶ%s.7\*=/\ʩOm[\!Bz\oșyTz_H͏6*heXrl~ާrs[WXۑĚF!2u=?ֶmථ I,ƤXƏ6)ϭwu[ۺ~-R8V!")Z#mn*u[SSIy[nL*vhln]o۶N91ԶŅB!7nԶCi;~{i(w֭NŤ2 h.oSQS6FaK}֯m'B!)n˓Vyܯ.mn[Sv8Tf@<\σſo(1*ҘNۀs)q'BQ+nN1p.ԝb*=O]z[攧;DMN*v9zwٜuv4ʳB!DuPVƭwm}imn&Oow^T*fhrlS@>}Xv,eW<C!xncT$.涴YZ,Rԧm7E( <9 s.Uxz>mnzގEEB!nfi;RN9Nq}ҷcNm'ʉZ hƋ5'ut.R-KzSL_ԘrsC>!B \!雕Զ)4M.ҺxDūz)L%۫6=G_םqB!D*RGq"N^Y'Cl}N@0ӗ6}P"F+xmvZKninb͇m#B+|c-_,ݶ;nKuMߟsj*x gs*bz[]Fn'Icihbz;XB!*[ū!|̩x}e](;Yg/YW68b x e t}]^źnzcNK=K}ݦ"uB!H ΅czSگOq .mNqu'$^fqb haA)n\>[Mp}B!R5\8N1ŽTԘoqjm]mKwwSUhF'\[TTmumO,5O_Wc>*Hm!B^̺8nESL}w!G58KSm]"GTT"m;֋uaǠ nDB4HRq^'!vMŒ+B MamJv\j>{[{s_)ܞ\q܊b{]PbNz 'D@<}N\PvrB!hnqov{$>=i{{}|5>=;qwG߁(p^}z\/X<;)f}q}ms !BT7nl٦;桴ɀS~Giu=I07V5,hV!B;hy:y=3.=D:>XLWx9lzﴴuaǣ=Vhic_ޱ*MUpj'MN9Cu~G^{\bj\_EjP1pz*H1<3y vۖ}!Bj.11Q""kNu[iyf6i0|l.f9L B!v-iU:Q+gzѮ>=_R{%p+؝ק^u5ώ ZP V(5Zr}?F^~3!BÁeYԺ2UX:+E߁bPd'^oN>yp~\(.005 OqA&/5NEB!!Į%;XPwމPvLgP6 '=G/WczMqzTH8Q}&) Av#Ja jG)XH魼E4M&<ˊ۵B! =9?iF(כj%JcϘ$$caS:IP 9e~vѠ[3U +x۱$#5>yXqQ!y9+ʢз"fI_y\4_8 S>!aLyMj앉Oѣ[ט~W61.p({E{%4nw qX8Mk:uhKtО#۴u5SIfhŒU'UozLm Oa6(**v<!E7ߏ*"`+$7g7fh4d=OYGS6`o2hO<apCe!+/o4KЏW&>U0`6hղtmc9gkլKN`ŢY&\p:^~[mg`ޤ[tY[bBuݺvcoZyyyPz`TVrU5p{rz\oN[̎ ]ϓE?6 )Łz7u-D[w_x۬n ZGz"j6,@ZS+rNla`L D9g{CjJj0_V켳ϠU˖wPPWRR __|wGYl߹ݻPT\i\w?HI HcW|Gݺvf0{ }y}d1u]䩉/5ař>qPkNS$}z(ߓO0yN3>O(;NeqdV\upZ8}|7>+o9M+23/K^?s 0xw),,aȮ{= Q Nbz7x}$?Ȅg^`P|˯|>L3OG` .|>ky 䧟e͟qѥQw/EEE76.9\| àa p?43ܱ '77&;vӏS'={` 駞i\smXE-[{.;ʹ9'kq2gh6n˞,v37m檛n~t>6oo9_|_ݺrϘ,Z;}+ԓ_;4oo{ rssp9}3݇] -[Y֕O4ٽ999iՒM.X|>^8.bԘ{|jתUrlyg==޽9ԮUsBݹ[nde;}E]o’x3M1Ğ=nu#yM{y$'%싯iS[y;~?]|7qeq|% Uk2I~ <ܤ2]:1vLxv֬- u{73/oy,[;wge5=9nqώ __'Ԏ/U>1*íCY/×(נk1;~._Ͼ@QQQLDu4sOthߎ 0x@~=˲٣way|l޲/ʉ7n؀vmG]SK|;v؉c_8f1HN1̬, clظVio$''SNzIonF|>,_SXXȦ-lM`' >O׻gX dlJ~~>Y$sqHQ-[c,_ QIJ-f۶?-k²,@ eYك{2=g|~? -!33]Фq#:uh}Faa!n X_r;wfܟ(u,n:999l4k\4vdfeQ/i5mBƍ(7о{t>=^.bx)}zkN,Z ǟ޽9ʹߧWk˲`ҫo;}űݏK._d]ك]0{~Y,wׅKXO.9gNNGQF"~߳tcY36~F[GfV6 .B~m@ 5˲Xl~%v GwTwtNKp q>5~9 ((՚qM)VeۓRn'&ܶzþ$)8`7hԻ>Z' "d쏗R\ hBB}ΞL._A`!-7+CT~)o۹:e~F֩C~~y0vA}sW|x~(l|ide-Gaߞ̒?> (T&>O׫kcl\[1Ga0c LO|A9'XϜ9y\8l||3m,!hP-7㭗oHL$9%zuxxߏ%x,Z eY2K}$3+dܼT#5;fcQYÏHI+$V!fObf'a>+[ϥݥw Ͻ@ `qm#58`~= =ï  mԠ>;w.zڻ)(( --TNmuVzm$̬l2K'DnܔS_Nz:Ż|orӵWұC;]?R%KYd)ڶ#c[Gb_3އJ!<@n"ȶܝԭSdFLK#3+;-vax v:>=OyVխÀٵ{;Bdee )Shج2g;8s\1"yz), {lўs/B[_5kKqWu5!^2ǻ,F8`<ӎ;eOԉppaO 4a IDATк:YcFx*Sž[쓨> mC'jԼ>~ VԴz$'4MH(<vv:e(\ +-`n1f]:1֛yŗYd9K౧'r_D˯ _. `֜K ~[Lz|<63NYsL nhxHMISOvs-9ֶO(ύ/f?ubໆť~RSS9f%y ԧY-0{uj$L1kF glؔ@-U&[n''71rhۺ%a0o8Nr<^CV-IJ-[Y\{e$c6(-<$pѰsش9x˗ﴴ2^t92,\_pr%Шa àV͚l<5߽'_}ƍrg=WUmxϸQ3[1:٣uߊ+..[׋Z|%<8>.?^v`}{JL`Q7"dםN5ԥMQz^xIyN'i]c/*$0 <ɉH"\f/*7^=g&K WrwK*,*⧟ocmIlzI1F\F޽LaV76,b³+xe_h*XQU7a W3xP 9':uPsC}.|RSR؛SdMZfPZZ*cFDzzm}Z>s.m݊ 9g-^ G~蛯yc\{\?߰G&<> ygy&;v⅗_/ E7c{^Ig+_ׄ=WU)_ѱ}{Ft]-_-}ym3޳e+~/y]ywlٺMO"xLpr,]G'< v-iە-u>J5'h"E#'mn]}@ѩm{g/>, ^{~_6!Nr64 ]C X93M䯙BLL X8˱ݏùqzaY?ɆS8qa%!@@**<}]ZuԎ~foƭ-^a9Щ'Pm'V_n|;F !‡`'k] cBr&2ɟLÇ7ߝ̛NB!`- 5G u{Nqu*݁@8q~u5fcNZKLHbײde$ZȝIB!V߁Ћ|5O;Un'j4~Շz1pXƕכHMFB!A~WA_u'v^Wqu7~"[a'I~b8 BUЮe BqT_=ܸ1>_)I'L8=< 6B!BD˩TkM{פjNR@O68=W?N}՘B!p)bz}>P6cs;t1Ĭ2 XH v:zinsB! XKךN52R,ڶX⦲?D]Nq3A+[ե 0WB!, p:FU_!%R߷.&,?~4_~nXS `12N%1+8GIP < saQjP1[kc}4ם5 q>kF 4!EN3֜V = %GeգQz_q 's;Ҧ `o\؟$\8P@U!8wj4ES?W2azmU_w-oaRrjleYj(uם9UcΩLFB!aO&IvvsTqO_Tq M;e'*퓯& z[!Bh鵤픫RzR_w*sQQNOZ~b~{]B!Bʮ'RRsTNj*&p[W;]>B!"&?@m j۪hnDeNN86N^p}(B!D,ZR]^y-.mz;'p{ԗ*ԧ;%B!D8z-ۜtzԹ5Пhۺ֗ze?/B!D$zizVw1&uףiW5p?p'ʞ`u>lzҷ2 !B-utө^u[1Tz DNNtuu(B!D,RlTj)VT ~-H!B!bדNRv:'v4/u $B!DՖz-/co9Vi=r޶E0ՇB!>[jMuu.UZ?^}i;#B!DՔz inWKU5/S̾.B!Tc1uӅSEWU5ptNvPzLc !B-2\9rUʘ@'2hbzvcR/B!BDT[ӺJm>D? DU/z1~BB!!O%B=RVhO[~/N]P!B!۶p5S[hbVXÝP(1!B!"q#՚SG蹑Ē[i*{IqsCPz/B!DR1pcEeO b:'-G]B!BB'N wU ?ATN& 'B!D4zR-pr˓wzcB!BSmǜTpC>'Vȁ@@|Xz>nq!B!bTG9#cEt't9&B!DE8՘G#bͯ0>;T͇2躛9ٷ%;yH /{0Z񄈂'^-r>y,}'?@ 碮$<.VK՞6`6NUQ.-\_%ik/ߚowL)Q٬;i6;*ek<;,̵\#TVz~>3g,7/iӘt+>`:v!pufRUN {2-/0. F2>V8M5kfdcEJ]ˈ@,nd~rgYAB AyB!UjJ.)'\_x"$gY4V0sV>jwHjP3v26dHk܁>'D5h㪬_vi.Hf1V_Z}Ƭ>21jې8K}YNy5'~\vyϙϫ/Legf ^t9gQj~f !P5=O?3ֶoB~7U[Ѱ#8^M{Njm@.S;4>rX25l P#:v ~!F765엃_<;ze~r2Ky+7UHGҭqoc΂\Ek5ѤkyJs9o\GL_Gg0o-`"Zt礳Ok?ֆ]˿9؜@#p&Mqp9=zEߚ1kkLAzU_,*K=޵M u /2Kɱrsr n*IQj3p'vmH" 8È fllA!,\ ru@D4 ^hHω&3wjfeZ5f33|P'N ^]Avq j0 &n7 mK>8`eչ[: >Z4gӶ4~-n}ڳUm!#`2Wxx;Y4wk)`# fLgiN\_ςǢ{3ۋk|3 S~s}|2Ͼ̍S*AsfԿ>cm/Whc K?˨u = uۊlTZ=z+}~#w9q^8rt蛌iſ۟3uK;I7<k 3QG;Y1s+Т|r:^qo/#+t] #txNlŰrXꝌr ug5_+7/nW2t;?BK>r)O6Auܧ=2o g|0l8W$-7fL_͆qQH LyyRpANm_=&ù0bܧ<װŜ_s(Z?zS9̋?[5 ؇?3L)GRCN\muy8`%BB3֪ͫ&]EOhGW1F:$z,6-/"WAyya3y/7g#ו<:e{-Y,|sd߻B(E[WF禢ա.m^9w"RÚx[YM!H3 Z\t.J L拸w|3m5ïՊJA1u9ֻt`MLiOdt:F\q7٘z4Opl(8μ8mՖ]?~ˣ?1Lf-ESسi;вZ{x:^νN:ªyhlfqG o仟C5 C޵Mmڽ4 ~*G~kN㗜 ]懆O{'` ftܕn=qe`4Kiڌu<0il.68qy^7MZ{#xsgWSܱ|-StcL貏_7{krMw1TLXV~ɼ7~ ~p{1qF;S76g&KoArk8N 3uby, f)߆K#n=;Q0r_CU%gw|O{Rk8H]I Ƕ!O;}53nQ韇cZh?h?$0?ԥ dc2W3XYLfnAz?N<6Ⱥ X$sT#a❾u(Zڻ{Xt阊i6@&wJߓVT,_>?Vm 7/-ڴ$Gr IP\DquZ`](`> AB,LB4>ϚªV#?r΅\:8OS9<'1cN4儓Q} .7W|c⿝qr/?%ES/@V-dBQ= mٖ։&a7$rЦu a`&i)@/+%xcI; [r6ǵٸcZ{ur%uo{9C,Ϛ<*CnlzP}_x|D 1ChN?Y a;?KL;-Y5<!g(ǩvoW -7NtZҋ3gfLϙMBT*g%!T7ě>|>|@"5 Y%R#14 Qx>`BFB xCNO}[ _a1`Qi!S3$)tCR*)Ȩǀ;^ֻ0cBxi1Ӿ8{_S7ӎ?`Z~'prDn\7-Oy?|m<0**aSTl/o*]q1Es|1ʜv8eo$Xo51xu6:kwީXӋXcaűuawQ"x;}NckAB|rfԿ-,O?B!xbcP '>Pk jB?2}{<1bcI1 0ӸcMvY^o?7lAȨգn vmGj&l2:եa-cC k }[z aQeI51- OmQʄgi rc' >~~Sy%q#;mN<^#}.Ka7Shyљ]Y<igیd4KaV}_9 ˕X3m9;oAb7 c4I"gw?zݙ.׸4у#<^5%tϓ3s\֮kg h[jdݔƺPӈ BD-?[8N 0j>r `ϐc56jk`WL?+>{y;_wHOebo̱0?g8Txҩ[DŽ&VK\M˖o.*&- gSG]#iK;(L s>L9~L:}c`QPPe8󸺘 vtR[<,ɳ֐Ylb&s8*``&`ҫ'bVfm׎v89[HHH׀95/^ן$'X׬$vN:QARcdߵ~#'zسk~6jвPe4lA3`iM1#o2Ӯ}x`<[\HVh׮m[ڵ]B!AWVVR}>5gL%gPwMibH^^2Ht/2Yx= Y1p|=2aQdzr)[_Uϑ ܊m_!y݅zM0𴿘Cl IDATg1%y0OEQ@Nn!>`ߗҟQ拧_'Y!鞽lۚlB!4C2|O⤖ K9o u֥Fv)8k"FBwI-CVb-73byWJ[KξbB굡3Uy~.Bj,}Nyn1;$?2tX7~G4WiHP J7*mݏ=фJe])}Oy XJ>G,It޲XD 0~sUngF6`+ 綝[l ["H=O=,u?eEO]>y @E _i~;Gi mC\q\&2:B&&,}>"]d|V:Q^?a| ~B̈́#|?,VPBώKiٟP-Mm}hcz=* Lmv|u{Ѷ^ǚ>bn^;7з9 t85⶝vIԊl *uG>@ _EPs9 4w#8 ꘫRpN".8cmnŅB5gןP@^܃Xg&iuH+3b+ [bO5uVemwb #NBq;$:'ca?صf*aWs%Q$ŻغǢVA 9 Z'8b&B!l28H%=[<՛ vzQk2-~@!Bdq*A\Q>rB!D*"B!&@!B!&!B!Dd!B!L B!Q B!"j5Bqf]Bq1 7jDڵnG2BPvv6vU椦BqQylޜ J$!8 mݶV-w !A+--#5c݆2D: |+yʋ>yh du'ôSUŷI?F`Ws?R99wx`㇌>eZX[Ps'<!I)x'$$5a+WwunZW e ho>6Z2y+k)¨_?V}qmDE}=9eq ^; #'BđL *y}Ƀw S#Ogã6gv{w^H)REA`DE"MAPDĆ N&(ґ@ Ivc7fs]93ggfgwoN+&~űճyu~2+|g|/ɶGPIm^B&@\xpVk4 s Fr .3^Or܊L |WBEL&錢wжv# R}4ƿ%DWY@yx>Zt{Sc3ۑcȌOqAp|?6Fw0wtkb{x;?gN`mOwӡ(~ϴ_c0M2_R7/)Tѡ_} _ό w3\ 5/|-sWNY={J^͎cDW{Q/6ok7_$#n{ݪmzk)u>+6L@q5!]COF։=am;yx].„UG8}:nߙ k-]7gﻮ;m)OTjNW`bss볽vVMȜ{9Vzp{UOtnfQ,sg[Y\/SgLxi>~SiN ΐ!]n`O{c1 - ]˦2#5nATqe`sCXٛ4 ! SCζKe|c1xz/isƉdK;Q,O <ұ9+ yd2EK?ip}/W69-W%KY4NcZN;}+}BsYLhy/-W6[.&6+V@ WձgɎxgR-ɏf'öR(5>\>nH́Yv]wr 6f`9ǴɈy3=./,dꗷ}eK?sSH*nM?#.gn/smFDl|Ik봼*b7`pĶxy 2o>ewq2|Ȭ>q,=ba{Ώ6W>?>lvŇRs(o}CcZ?|U3?`^菼M},1/gKn؋3uI\績{h',|x%} رh 8`KXx./HXi:kfy k '>E{a|ssϭ&t/7+֯wfX7^{׏4d8:ZǺt1$d`UzECNr4e,˴Fkӳ'+10 40q88LH\u7sw҄8Ib׳3Xs~Gs97S8Ӑ*\ױ e#pFTQ3O)k,V.=S$Ipftl`d6`y}\M#Mq},Hq%9˾i#00Lp`6Ikeoh@9X~5Jug:(w3]c6曱֤r]#uzV@V}r更i}c@ڥp[rȉsAE)sob bQXԷJDD.45a: " ൻSw2߯{as)֍wY,Hiī<G,)و#6{cMp" 7xs?zwG{YgSȼ.LLbsWÁas6OgJ@@;.Չ`qXgs؜L< )uNbc1,N3h8q:҅MCMEҧ2-Uآ%8lb5/@?f4q1 2kyԻqv~]Ofq}v^1#`"oW!Wa:`?`XPWnֆj]ʪ?ع6*hD·9jA)ÜhFDIg`<+4 / 0L I-rJf>qr3 #! qhynu3⹑a}esAQecVw$4$}hXܿ`N'[iհD8y8Jqg?•9\~Ԅ<300 :=FMDΪ2gL r{;'2 dZ{Q<NH >q t%o~N0WEFL#Ǘ3?-0m̛ؖ_#ł#2kVjy|v2hTh=n ?X:N{sx l:@ d拥HwPFG1$ut8mǗB`2APP5ڷ aͫ&%ʻcI?6DDG7m7jK{H18 wΡT;X5{qs~{eӦ澹Cg08{78sw\-wmaϩL 3R) p# E `&di|@& 5®gm}p67 F|v!3M.f}'qVM9I3w":;OƲm$NP:d71yAo?B&BT(#3S# ¬?k+yGZ2mZ1lt ^Gb|#|mF:p#=oϺ]cnj]pAaDŽy,\ũӹmK/q'AT5$*׍+qϤu74n #dC4=pb/$ "HM?z e\hFvP]Gaey.^yc-jD 'y_=)$Tc'~πW~Pv|BdaWs2mf$!#m fEq63PN=!swN^ H)ׂi!g}fs61g^znk0AKY^aI1(ׅQyKgqzgKr]~11O ߌ"qՖy,ON{2ke"d>ىE5dfތoxTbǿI*6kGuaa(mo;FfLu0W} Ӗoϔ0*#mJ1'Z:nT𯘳z)dLʐgX~[2o|o +?C{p"0X8=6t海{e^oIaEm(hrToe~=kc^^N?vz_g;1/p6r7{-&,^"ld&a70L[`V6q\6#{a m':oYx']k<;&E?ӿwL}F1:ҺY{7rhru穧HͧEXdw9v?8}/sLSieg==><_~=֡iO3=uR\fgQ33A@ 8?LψCt=mLNG`H ߒTca{C54 }7樛?4^=6uXZ і {P58^w]3gTX;-LIrGzSD*Khšo3GV^&n[bfd[WciC~`W&h"=4RcdN-y֣dB~7|LF4eF3y}?Fgrl՟7aszɉx)J;ϣ):=[m~ڵj&#ƽ:ggH2y5:+vy3k5m{e}m{7-r{@1y מy€ȝnSBF9.yeyV_ /Y҂xY0p*}ٷy#-L#e'5v~' IDATv?|~{l|O㓋;`;wyg˺C}v99s3MW2]=q+w<{Y}N.s{7V.B11es%Khǽ-JHuh3~J9рkBp:B(ՠ.%pu|6owG;3ڙBA5E0k>Ӷ+6UqY߫ q^ֽ:Rx֜]-sywvjL \߳#5r&bVn ԉoD7Lr*7vD:-Ӑ<#蹙%q[3HluR58R."J4[$Nǥa7AJunC߾fm(qz%",GpQJb_ S"Ǿq8G(%jw }re^ 0aUogڄXˋM㜍,Kisqvx 6)לI&g] m/_5EeH?oל3x2=|o{['&pC>1/H6-)%7|_&Wtbo<E/,pD'╍uc)5ZYTq80p4,ѧ-wITlz!Dee4UkFk&Ӂk94DY".B36.3Uy,u#hVڿ"/ 潓x@9W'ŒB_ :ۍc с7'wp<dߒwM}&DX'֞m0(Ӥ'O7m3j&]3s՞9ʷutnR>@֏Pa':e3GRQ(ԏr"&gns*,#omΙDS)UЈ{9yRpW#/yu(ώ=)vrЩ,ߦ+ +yÿ~3u_C qy9j`.N$PW0ΰoY} F;+]gsQVmb'Y2miess,mԽ!뵢Qlj  |#~;cu}̏^}ȧ-bţٷl,,]Ogs?BwsSR{cgk?> ۶eVW8䲢 }(Z6 &PY]/HB/F<36 H#Jmy|U5)nnj{⭮ak}1TЌ&[F :}Κ>M 7oCiϱ4qs#I4=i;2vH+ 9 \q#9nv+5]K:'պ?Aᓹ;$G_ˮ]<1j8z)z3X1o #"wq<$h=z J9ݲH\A{J6GaXi g101|k9kF3LFY#k6x>Â4 S6iߴ,E5"""aiݓ/4 Z=▷gY},3oa{ݼk^Bgs꓁fe@X{mOϓEDD!d]Ysnhy;~[FCGj .T}bɷ+Pem )Y=zWlH9 bՆܨ2 yء\Tr v/g95ʝ_Jrm}?M=Pҧ|´}yL݉f-z3o_&?ư{ж5mngBRV^>{y;Hf7ѡٔu0&=Bm-?fٸvϰs"v-}f=#]&pԪ5mnl#;+k|i+O[ؤ͘NiCin-iO[gDDDDJ&L瑝S>GaXCc#`_3px!PW$^$'ⅇ2}nٙ(ƾћ*&2e5'erP2lQ|7HYSV*߾Z㧰p#C^fI)t+HQBΑK5瓝AqgDKm@)$x3:6Xf22'=/NPhJ"S(ތ[["ssC>Q#C)ZdG3 RDDDDě0]@f)oYp8 ?y nftl,GJ͈(ض~ۏ#% w|ݱ ϫvzMg@״:+ 8yy{gc,0slc[6_Y'01Möpl˅=϶,z,rޢX.nN囧>MKSn&""۶ǟ]o?bܫsOxȌt pYޯ-ig:]^Ӷg^V{vY}Ӳ;/8o Lw&  tZ0M<ldOyEDDDJ&L"""""7"""""7"""""7"""""7"""""7"""""7 *"""N$==7@?KA@`Q&˿L\TRRR8|h| Nҩd5aJSDFD(xNbI$720+f?en潇344׍<~/nlGڌd?$/ ߠlhRRa`gDM߯": GXc2鿓hVm[9~?.H>Zx[V~A3?j7%Lc˿3NM%-8`L,٤# @>NW\@XX\Fq ">hEtO7+& kcp̋sV#)5h<Ф?)Iֿ9q ~E&iieMLϙe鶮#aΗ;8Fm)l2hlb`^op Ƕ"|zb/-:aٛH1C '7$BkQ9{<x|/-;ߓH8o$Zi!2KpՉ6Y; VI ~ Sp!R@bʵsh8^ht_\9MN4I{^0)QlCƵHc+;$5#IJUX(:vXz*F?NnƕlRmco'Hs%g*ԯ("Xe=z#zM^ 30'v~~:e[z/\ - ,e۽)+}OVsuv+8_C7=/^yi>{ǯvO3yIliK>7.fTv.zw2OX<։qRTQҞ©>ŮMH͚Ѥ^9'깴gy^(]@ AڴiRjTLV:s]h zhڴ)Ku7IYsa he!hU5n 2sB'/L`WA /K\+ykBv/2%i_>g8en6s74 t\ 7T8MCz r\!W2)~-P<g@,V#~dm5YXH=_dvO; .ނN[Y 3sUFFh_8͟ݜ6)~uYf-K^IG9C鲱`DQT_!DIH|ag9&rQ ڷ |T=bAUiqu `sloƥ 0 ݙ:1d140 4 r=uRxNwy/~ҋҋ]M+8q"jprc<`؋3h-˾#cb6׸$RA-Za|=w~V͊4 z7rLE&fXZx5ޅi#Z7%q<>ݟM&XIJyڕ0 Xl~`dZ],Ӝ[Yp8 ҎdQW2Y5noaL 3ҕ(AzuKƗsFœs3H>Ξ݉LfcdXA ň;!ɤ|<^l1B# 21ԟG8a!%))iyX3  trv ˕j . TC-6Pڄ`X-1ߖkyk톫38{E*{i8Y%c1dv5wYBٴu?U<ϟ~ia>)6ь }.~""nUoEBޭЋⳚD yIOuUՓcxZ03ĵ|{3JkG*~gLjoI>?2tJ :n~fd8d<%)$Hn8 󿬞޺q0APp>.~w3r& L ӑxfxo[w[=3l/P| 00\e|ҳ9w<3\ `񺸻Jɓy_x5H *|0qmxV^(OK \5""r)"""""7"""rQ0[F\THOz\ΞM'0(w<_Aԋ|w'-Ԋb7Y&e2s[ Tqѧ!"""ysoPWJNz]}_BDDD.**JEQNvrΖ"""rQw\ \\@@%#,,w\6nƍ}g%B\06mbȰ2)֯, *""""Ć ;ncF`q 85k,)3@yaFƌY| IDAT5k`ȠA; ԜRBDDSKw8icGY~Ҩ*"W71fXLڵרQ+(퍨wԩwC?Yp@`[T˥A>fsݰ1c4^2Tf `'8驑< J""Gbs]ng^Y2BZy:~(Z]f9b-DayNfvt${/͟ P r9HKK,#5a o cyl80݉r|<9f}ȹ*7D⒖=s6lȃa\/ DD!j;xv4kڜep?:ʯSXi"r ~ |X\?j .j$"" hӑ}.IciPN0ML |aPN]zYݏvMrQ~F2''@``: pdYW``fYsZ/K-"53x@&Lƍظq/QrS waPv-=$ `̨QٵrP!""""Ly1jt)R!"""3gΒKK@@Ešő5\4@E|'3}gh{R&WEzQt/Ȭ)wu(TTRmOd3Y>7IeVE^a84;N| 0 4| uTqQ!"""q&u}gE@!MMMMMMMMMMMMMMMMMMMMMMߐaλ()wƕFMMMMMMMMMMMMMc "W&0|g%ED@mː:HBD2""r>))))))))))))cã>g6NB{7,NJ T, vc,(vM P*H/IByH6lMh u͵3眝=3~S!"""""~S!"""""~S!"""""~S!"""""~S!"""""~S!"""""~S!"""""~ pl`dee94`aaTZ(gdJ DDDBٿ?{Ұ~=ÝrdMJ"*Ma eY %pjլ;Ur) %++KɃil9rYH7.|m-ngW.%ΚX[?dh{uYSӁ{ 1iiJD%""R͟*VÏcd+U720h0 ypQSWrGn ZEEeG2>.8Wf._w˟k߬WJ DDL{e̹ ~fz"ԫX#zpV7 xme{\~7,L{ndX#CjЮW *[o·ޛxys(?$uMӔ l2bqi vkði߱3=.Wp1~.ޑr/e*n;6b;ӶS?=ͅzܫ^aPGYS,~x-I6Sw]|J}j4VDrLXYpR?0t@QVgțw_N.]w(#?^A kί~㋇.ysFF<ԟxcڅ]z1?ϱ`+77,9k rzuc^\r'1\޿;>׆_FΝ YUpЀE1?:uSߡޯnk\3 >0Cw}.y].17׸ k#{j㌀4b]3~:P>q6ŬMX ꑗA87YHaCk\}.W|jC.k?L1Au*GfOY@Z7?cO繕GD*2%""R&3}Zne :,idsp3V:…0z,}7ov?F|ap[X'u] tc>[Wi3ЫkøYX}QDy+ww>%PH?IIMwP]ULTI)khg]w^l {w:qŃ"3hI.(nfIema6(ϋ}(/xb: "w{gF4_\#%t-vk>瑻|d;H}pOf|`/^;tR[VD\ dl YwLj]؄Xq{,ndEVl b]R{'A_вgA<; \&@iqXbu:2p'ou{\v+< ,6r, {4gNV8 !5{p+uC*EzvӖ6? !Oϊ=Hi}9=NR JvEDOsL\߄>]+Цwg˗'m8:>DέIs9Y:Urײl]+'&F2ku__ywwl;dY;װ~"ml:ITԈtW?Gb1/'5S>y`gՄ:qcڔYoȞ<ma[_ܾ1m?w~[scCyU4ݙE Dɬ7e,eSүj\Ԫ̎ͻqDJNw>P~nO3kں 7Y:3pub9I hʠ^Gh@߾%c`T=Ğrxj:DN 6EJiÛT4 ;xWxAO`b= 7SyO1fX'OfWqݹyt\HLT :v?M'(s''o+A䛄&7ᒑPe}`BBb}$#;0zpuKxKFh ݈-^m^Фi6!ePx1kpc9 9,© 'Г=sB*Ucy8僽,l:,_j7^m9F3kD]6N@Z{8q?k|mk+)z$\FxEa6fVϐƌo ?3s<9n2GNcLJ^6]US^d@"y`\+L,}[۶nnuDm˯K|'F_<ǶvnSpgmyrx]>*)'V:M&:luFmcelg0"#\Ѹ.w׉xdW~W[KtQ-ZX{b \\Uɢz@ eV#s6z&ݜr0 ,B:?ʂuk~Yf`^vX䔢WDDDDDBDDDDDBDDD*KrQ!"""JXX(G<222 dT4ZDDD*UifjըAxxZNlڲU:$S!"""JtT dei$tdaaTZHgdJ DDD‰"RiO?TLJ DDDBR(R1"j0 gq9@Ga,9n@OJ ʉl޼ l֢E<-[|9:~7n]ec=tj*;n_b;ǼuSD,S%)w?p;EDʕeR9)ʕUv~3^MƒY,ԕ>̓bWc6;;vǥwyvpx /{tC oŰإ'oG9b"O.ypqEwfpa:vnt9ol82N.敵7{w]c=t1\lNn#&0ؽ3m;1ٜ[x?^bPGY\s^Kr͐|\޷+:XS:{hUvKi5OXy@}?ݗӣKȏWrІgwP\.cjXMᕗIXɜ}ދ[\FܱX۾c\>1.pmfM_IG[53 ϡ{v|RtI`Tz󨓷]@ ɌD[=gC~f.!Go\ wN&p7LKG۫s6~8OkΣy_dp ey,<ϾX̖̹&bf?SvaaMf/F?1,R00xG"]&u.k'nf2g;0b;ѿ\`p6˪o=>(5<-ɷM`|xG-DCge!Y,՛{j$55f)"r [Ӱ,bX8$.5 $DeFczI0M9ٛ ^-Uh&mO*9ǰ^EC؄aeObs|aKc'cֺ& i-"m_:$& Fc1ie$WtPe@8+Xb prDDE=O:2S'ۻffs7m X&?;ǼìJCMΡFhѡd{Vmxj{!ɼMc@ᓜ "" mMNn̙OrZ~ٻk/6ؽ;8LMBT:CνAk*6T)"mOFT bC}x&c8b17̧]HQRd"m_6IevGԌ~݃g [Z]AX2N c"nA `U<0?7 *8]Z ۻb ɏ+ ξI?(H]"w=B'_dYG\5ϤlΆlNJDDG3̠Xt^}żqC$MӚEDOsL\߄>]=ڇЦwg˗'m8И}Xއ V|mRjkl opvs7*ѦlZI\޴8fp X9s۲Weǖ[c>e(@>=^ C~i@}Pl&wцyTmdfT]˲uq4SfnwǶC`s wo`ϸQ/3g)(b§yl ]yj&!r-0;ӻo|ow[dm@n ۸oY<0琝M\Xl[Vl?HXlOq#gB(r-I/WOLآϻo}ī&6pYAgxgsiwvrݠ fͤki(.}n3iv,͇11lw72#ʮlXtG *> /͐RɱIh؟֥ZO {cy ukzmxm{(\=@'^}CL%,"ec ii *R@bbS;mۭ\.DEE9}deiY,'5^άۢUm_~]J͝U|bĭsl{{-mwv>W0y^vagpѹnxxo;<-+F#">lL!p.͚5#(TVpw*?׳!esVs!:*dCfYY KInZ`ͳ`^@o"RuJć4>^_!~ nݺ,[ :k$JC1Mpدb}v2mJUh>1F9/"R(!//y8]w29ɱ1LSN\\,9[DDDDDBDDDDDBDDDDDBDDDDDBDDDDDBDDDDDBDDDDDBD7ik;{+˾_\gv:tY#""9F֎p8~g=?-b˯?|ͪx25?nypyݥRڮЂ fDDDNOJ DYR\t1 կqٝP0 LS?fR9)ͻvS<]Nc>?+8%"l&zW-""%"4 Wp*~U33_]_@9SSߒM`BSv׷aSxZX#^8 _ pMHfq8LlO 1{q7ӥj fע4"akbژӳ&dk M|} k/]1h/&tĀ\|C k}cgdR; jl#PQ]C_F@`674F&>31oҋ ca71}}ыL3 %ѧ =z7`7 e:o6MnId0f,&]e˻kr_b|33iMX;'1H̙;n܏r=d\j1}3j,H/|yxA>|ֻ wp $b©byەJ`$LO]ϊ$6mK(z?kye՛}3%$#}ͤRh> uHClD)>k9Ո6;Ѷe-\i{9TUl_{CҪC'ڞSߗ_b:G7u4Pe%tКNnJ"""'rdm^7r$Q:3%SY&}4~Lĵ]dm=n Hڇ7盭`q6GY$;srb^3 (WUx;{7;3"^+`̐&@xˎA\ÈJxBL %!!C+ܟȉ)L"ȝx I`?ݤK%w{Zw.4΂iU1w~mojGEZz>M@c8-`C\<>=-,rdgIO/EL| vc1h]@ay]l0-QqIĭ[Ǯ Łd`q}xeT":pF(^IlY@x;x(rv7{?a u p={af 7# r-o|vAJ`OݶMH<*)tT HE)L"ȬٕW3?'C[<G߾/7}9)dXþl.ZCEËx{, V}?=ސ|~~GPV};9uXN>`禳i&vI|s* |p,:Wgo,:eTco 2H qH-\f:' &l=J|\0Gpp_!6g-ɳ`}yfU&)<-){9wA2=ӑɤd&dN/ّ= F{3l^yu<BH߇֥j(Ԕ]a?Ax[y^ّ0>-)o@dۻwx=vwecR㍌.v2H̙Ӫ.C.<^ N-<5U vRQI$b[d' >g~$%'\A%ᬈ_،b׳ɨS-F]GNXgzvy[V0Y;Y45[f3a^7O`VN6@|}d"""rR oggǧcN2m̐4={zFBV~ZɎk6%FJ D\Y.3c{^G:EDDNsLMDDDDDBDDDDDBDDDDDBD4d^Dw|)! 0\g)77ara[`Y.W?XJff defZY,H$CdD86lNlذȈpgQ"$,<mYdef^v''%}6UJhXZD䔔ŶINoOJ D|Z;wde8FAAADFER%(QQQ8cr/xlَZSaV"9)Hg#%">DEEa l"<<ܯo0&::Y%'@TT_Ɇ7%">JDDDM:)W܁u }Z?y96J DDDDDoJ DDDDDoJ DDDDDoJ DDDDDoJ DDDDDoJ DDDDDoJ DDDDDoJ DDDDDoJ DDDDDoJ DDDDDoJ DDDDDoca;cqZǓd'WDDDDNg? ĿD)_8 NQ ODDdp[bCd庝R@g%Tk$\fZņ 笖(00ظXԮYy*'xTM CD"""RlS)T N<7K7f޺]hXY]̆ ѢE raßlH@)˞t-""r*Y-kUV7hyf"rV%-5u)y8 SiI /OTJ ʫcO$""re t9O!d=+//@g AAAtXyƕ嵟㮢P'w_"""""P~1'-u:8 """"PgyU81ĥ@)qJO_*Rwۡ9ƙ*Bw;џPVDDDDD|)-,+ڔޯܜoa4ÇhذmfZ>0ٳg3fc'8Z>S[3KI`OiqfiuSԕ%ՕzN\DDD*\~f| e9X7)֏k{}'GE`DgF}HpG޻a c>[aO ȶmx!~_[nvK||<۷ѸIc|ho/ Aϱ,Y'~*),)(JPNFqSV{_N(. $//q 0K WLVq+|}f7 ·C|<盿_>͝#٠4y2ryM䖛nmLq*SL^NȅL1Y+?WꝎ?VqQO}9='r r?Ulk{ >OoDU &8 zo0ゥq۹)=_V/b0|]᝸q#AElH=s=Ӿv,~w_=r=w/Eӵr*) ؊#K9})(}D&|uGIuʝLDDDNÇy{ F<ZhQ?QH'6e)2s܆ <lHaF: 1ecX;=e u~~4_3Y;C{>dž1a=ǻxrU3d6s'=Gp+)>6ϱ;|ũPr9^˱GNdҞ|iu|uz9|mvlR,au/h\}8Cƌ&>Hf-bOo9w:V}$/)0 N.3|Ŵp{qUΕkjB`b{:6NbI_43k5 =~ud_ͮ %XŌY F!8%[ȟOylc/gx0Ҕ֮IJ)W9OLImם"""rE%0z೯R9ETL,K LB##1q4" /d~F_{=P }vڬYy'OKsa5YL{:l5w"OW42-(h*(>+,R\2wY&gT?2̝޴,yd {Nڛ9I經6N՝p;([+VꛍvNv9;һ:ug ] 0l {zncH 4jA_lݍ4jRɫ&?,!v?I U'" yE W ?&Lm1.(N">8C&-W_*qocҒh10 )4LAyIDATllOTf :6/. LJ*b9BesJ=W:uy+v[c]'Ʊ<:>Qm"""rt3 ?鞇TQ7CX\<7yY3e,AkxTDivM%A|ԫ8XÁ2 ^ ,WڞӲ%cFλ"$$?&X7$X$bPx &QU +3lllLcκ|I|> T0d7e=۳n @@czclo.66[Y1ǝ3,+,mYqs֬܇= w9>n= ˊ9#,ݮҶ=X#Hf bA*99<;ޱ׺7gs/vǤоdid\JZVR:a>!r|4sT_DDDD1?13n.ur q2 u;;;cS:cMOwMM]o,`6{0nq~af!Q>(TfdV#ʼesI}<@}h+1ҳ'?ENa;S9㎵<}xs׫n0h֫&\Hx/ӷz_HպSxaDk#}iu Q-tϳ1< D0FdRxI94(ԿNo5v -tZվ_Ƥ`?7ϖyQ;+靖}#Xz8C/^3z"i}q y|ҍ{ڎSxBfͨO`Z3׻c9UUu/>ϼyөk-Cwpҽ_'55ǚ3t3yb2w)s]Md/Po]ׄuUiӾʫBs%uuW)qل ۝cO#ii~>!˗joUz3ժn)/=纘ܣ?ԟt]]\:Z: H;~j|wFK>=ڢ̻,WV!4A5}H'&ji>3iۄY]H?u/=V4wtN8cU&<7_}׬a{4&WHxgiOY%$uTsN9}W,[ szTq{3|QL}Y}H;޳6ԳĞCxb[êut'{j䫮?!͹$̀\SO$25|7gn( j\Uzik^7^SsswX]ci]4>@LϔvVL2YAY{i_uSF^Ou uVNsQ.Í5}h9LCAy_꾿˥%iK_Sj9ީn{eC_,5ԧ^&wektؐřoeO/=12猳gdۆzb[ڲXI9V5֟«beCuz8کs47zm ~??s%sKQ}Ȏth /iy+}P󜵮i׳yV GJgmϮ7Բ.-k9Oj!w}4WdBez3kޱIĨO=Kr(i~Ppm|\r2}F q"v֍ou&vvIS>պ5=c53Gfb.Xe5^soI5k[ 95>:J֕,\ϞZ׺NYܵ4?w 5ir4=L_/T|kޛZ5zjjNTK8鱖Xڨ/{2XyחGHޭ]uq\g>2neE_w9wjk9FQziU/\gy΢GqTZ7U!3t2Fu]7mE٬uI˸F,՗jdɃ-ժn;szg-][]8E8h.T\{hZ/i9g,R[˓:X3Y_˫nN-k.bKߖ<@n޾ΌgOr_ӻ2-ܳ暑ϾeӞwk29c/Gmt[zxUDrvTzU'djGNﴪޠw}9;]Dחqҷg74[odԳO,nZ5wyQ=s{OȜg_U_4g{3Gt[cݺiIk#Z.:iΨޭwR֎%nųv}#3V{F3Hk%Y G Q}iΨg;:UųMV}_ʳF|Ux&ٽko.Ff'K}k{Ufsuߛ;KR\t02ũg^kbϚ[ͫL<ڿ7w7z:YwԮꝖd|gfs﵎Om-Ȟ[l5[D;g-%6{_ZUdOUV5^цw_yGדZU5{^^㻷jӷjK}u~ּRuZG׷UK]!eX^woۣwڈޥwaA^[%]oUػnoü (߳F/q$5G[g=k=kHZmFzrm g!|],Tzed?R_m=]wbrG:kի==FzKZZ}+C4<6ٺ־}lUwun#{=P>l>r_]b{GQfy>{Ⱦ} lNGok<3׏ʣxtSLQx>[y_O3w>Og2GQ''{:jg_gg{8?q~}?{9x+W}W]ë~5S>eu'~O'_O4xOk% j9,t`^50Ǐ3x qLibIENDB`kraft-1.2.2/manual/images/nl/numbercycles.png000066400000000000000000000366561467704360200212100ustar00rootroot00000000000000PNG  IHDRKk" pHYs+ IDATxw\U=L+-MQrȑLKssLGAqkns[VP>K!0BAR! a)FB#HX !$,ԓLo}/U_ų>Ǒԗ(A9(y`<[LቿompQ5b%uM jn8D1YH2壌g]*^vt-v+9a2x$,_ԓLjىɿe@@֩C}}(-czF؟6MB$ȷ^M4j-dC@t:hЪ/Ģ<2_[Rǧ)tlFDU&}[upj^4gGUiéd_ʣ}z}ZUǛq ?kGzu!߬FfOB/>~aOhMtk`r z5 $Ϝ3${=gjVyA;\vǺ>_x#>~/?{-ǫ{3yvLI U+ Y= }ۆ/̆1ti拧g=6kХ/^>[)+]w 1Y#~%"aRϰ$ZO;71a -9=gOɷ+Cٱn1` f]!77;LG'>38hg۷iN,V Y8kv/wsTZ&BQ @@ ]x>dɓzUtq=;̥7~<6Ym9N0f5B lgDz>?ibQJX=]ٝ(O[!8tMw~T5.MĚƆN2W者lٱ#ӫ'{0v-h ,8u%kdU6}&}J]d3g W]EE#~d~߄5l]*1x1W3gȂ [(s.iUP."G>WQՇTo:k{ע+C)6l ǣTSY$(;wr1c^DG t<O+u*m;M~=*ӮUMk\}>),Ѩk ~_ˮH{9Zk3o;AQFbx[}Ts\k{P>UW)LJűRԵu5n#:mhUn16,u8iIVtT𬊫YUEjSD4<\B)Kko7Ppxۃ*VxuYT/w0C7DV(J>*s-R-aX[Z`o;[KȦPӞXhw fAXD,{ do'eHA'1cԃ0^Y?Tc犫գҙ99aK[!*hkg-MW\\q֢RFR#oYKѯbcq88AuTw؉n^QIV_";G=&6ؚeE!K82@`g'q{W_g,P)HՄ)6)(<@2)P**G{Glt茩!qtt|Q* ]mnj2R+K6boSK ƨ޻}]~<lmĺu(:дGMdǨ}}j L={JWPHKtIFs(D\|49 ,'Wrez{/ǒLV"Вz:1D?ϑIf:i8cҷ7k6{qh #]_`QW9~xxzQ |*taфM+ј:8&^u hW(h3f4>gϛ:=Ye?tjivSr`i|8?_'ҲX?ظ&#~Q%}~s:8ۏ1 ٸKwXԆĿ_t3rVw/SgR 3)"#$%=xyrcaYU.ټшeZgWKS_~aOhMtkiNMϷ\ʍ/D@Gt`˟G̉e n:k5Eu~5l?Az hWOAZ}WcWӓ0C}}eY>'tmF o׏GcQtUbN,ehf4hGs fv8zMEiD'IQc8tnՔF~>4w1hZ^7lөN==F?a<޳rhڌvSM?Iۇ'Nd;ω'ӷIOO33Rqlvbؽi QL#v8Ήعs KȈx&5iDo+?'[m,ZX3G#.t)*bIvv,C㙶-Zǯ2mV/Iݣ<;3+̜LYEc;E_2aO\zR8Dxk0˷0]qު&%쌭+Ǥ'r}0CBX}',lɨ=h%κ ,̖oƲ>ϔ^XhÔիʘQjSZ mgƩK9iLg&7A iZGoXۯ,U-k.ޝI'sɧǷ`ye7iӾzVu;Q{6@S+NC |HB6焂[w)`3 x ˿;}y*03o>b 鰩qt+NC8VK*[Ώ1@􍨬j\r+e9UuynQP +6oJ04\gN޽(g*ph^-'e߹ӡǎFLtO+uRX? k/>^3l%QPlILChq$hր{G{h)A8F`aG.gl EI %b^n_^ٝ>}z3bHzf2C̩ڨ>Y,} XP/R*D1y{kXĶwu"7-dd Y$ŵq|j~^PJX0s$PIs V&}3mw/d9⵩reի~'NP;W+ĩK5DbVX\֟#KSЂ+-ɪ o)uFϠ?cc@c:m(z}ȩ}hg;{ԮMmMCtv hD>i|Mycʕ*.*:晥zU#s=Ud]ȯJSunM7H#"kFϦhRTs}59OD$_!gE KH v1"TD"J{BiHj"OsCR! pXYYr]\\\s("w>vS*WgxRnE!.] ss\+SRŝ.cͱɽڥslllrYBAR! a)FB#HX !$,Ba K!0B!R#v]j*7sI[*!xRsi-ULYfX!x&5?ex-Er7Cr,,{OwM6p<ӷ t(xZ1~-,+f7T%RLQz=z:EKI蔞˷)F1Mlӈ]חÃ98A޵|״!=V@ͩBv:3s g?J|ɜ3ѧەX7 0rQۧ2u+VT2U^8WcBWŪ ݱ`L=ņMx*v :U#|N.>,CP 3=K|(> a)Q, EIJ@fl͐jOF,w+FaFN!kF MjOLԈ;t?g; =HK2f0~<f !]^Č*]'0YwӋm1h %3qn>^B(]Tt3sѣԨ.BQjYt !$,Ba K!0BAR! a)FB#HX !$,Ba K!0B!2$1z_'ogW;\ %uLt!]"S΅~{Ӭ“j wػa!b:ըƛU{?oܟ\x6-9km40-2.-Ne_UKZ}1s5osaGϺTCl`=8BmiA:ȁy)nϤiZ x/!Lf.7H9h9k3ɬŧH V0;|^12/^ ZnX6M*¿{#Cy9 Լ#ŝfh兗|L@^0&Ϡ_X3zSn FnZ2.-^M 3u(c(i+Ѡ^='=̏2{ |ݼ7sgǔ4oMm@:ߑެNkfbGu&~]jog3rYw[-? }|ūqWmEgbOn`߄hМ[KҾ1>ӆԐsh׹rIz85M7PTxl',Ի\HV@ۗr}tWAjaMz}#k8]yGzE]a"><$hћܻCmWDeV 7Q^}!Sp&5Shc3cDž.e_A, Ύe}(<ӶŢnDZ{L];Qڢz%_ a[Xy!?C[%d C;):`![vlbjHr߸m ca =pʉ#Xs;b~{:t(X_f{'5,nFNM93|ܼmrE%;M5wg^9\vjJ#ْQH=MHhrxՄeiMƻ}[*(`DfFc+E08V ֡ƭaklZ(UGlni{ OC4)aNgMϪUi (`^65KDs΃u*ڻ:ѹ38DSU(f-;Ì5ߡXl|4"we[\DZF p<.Cg[9}7?oSn<+GI,<|JpL4qH"- , ,Ioi"_=-~oZ7ћX*Pe37iL}|Tj鶵Ol>AF,҈og}pZ)x[֥I|f H)G9,6bLp ǒ@ס KC}"f{ 75!jͤTst)zL,m5,Br(eS P q> ]%FSЧDpP)DE\:-kC*&$a+!)}͗PV§L0Y̖ )lQ ̹Vw1sk/G ҽs7v  D5u"mus~+ W-˭ˤP"Mqۍ 8~7ՃR uGVɁx^TlB׏Y+7; t `ڌ  1;mv{5a!_ a(=ZRq)cE k/>^3'=UaDhP07 Cggm0K)Cy^zm~x6sٵ0%fIQ%:Ɍ=bMכtQ݋QiףbGUzaÌG_;9e͡ ӚM~S}ZԜ[Nb{J`{@{lKbiWЬ<TWoMi'u |' Jʼwmjᦕ񪥰\H 5?ь>K<жD\|4ڦR‡R.n&J\O 7684k똻>j/KDG`^r*x36Nǟ/hS_YMSas3Q%TIDATхp|O 솟mܺA˵k*KYЈ=&ӵF>%(wU^S!ZA ғiS 3`4+yoGiLUu+84ՌpځZjfU fSsUWNJZ)z7K&ڟ3*/;x}t䇶IcN_ǎ''ץg=ɮ;/oxSPZŧ/$7ׁ.OXSҮ|i>(?5fЦHt|; &i]OjmC]pmgGTiCt[FbޜhXբc~ C~/O%2w7H;jx?ޏРYE΄փHojY>6A%> O,K<;n4׉,Y1Kߠzm8(7o#O/o;oyxx = jMuφ+1>ʯQ'}7ƥMRo< MSqv ]UϏ ͼ;=g\'ݏ^xoB/W"YvpZۊ />Yk*݂|#$@AH~SSi-{2Wrca'j &Po,c,]4v9sb7'Z d6_xO~sshנ=JGDnљSo8sG4E3+7-ݛؠU4bw(N;d`YϏgߝok*x`rOL,X_uQ JOq:}n}}~ְ=tëc\UyYhD_ fW F׼̶Oα.kgs~G!-O@Y + ^m&)Ȗ_v<֝뽦L[zR`(:@dy 3g/SgWI ; 4 t^]Ne0Qsχ+Uh%)i{ןjQ'9~8oTV[2NE_ %rq{˿&C8 Z6vϯz8i'i^WH'0o_ڃ37U/*deyzA_̇ 0sLJca\a'BQQE /dmβcIqFiZΜB'Y'l .4!-(dYF[9Q] `Biul=IEy&`ZzoW3Pwn=_1c?yʵyi95n=?H/R!S P-HT,mZ`eX `о̷Ϫ=q>hEoO5j2 M4gN@]#7o9*6>ކ v7 Sw/ G(g(Og>wpoy11AcvGޏDg瀭G{ Jz r~YNODX䣲kqes $׌! *?6ʝ Jt;آE>FB\Bּ{::ME\@#&:Pqҍ߸1%)9w\OYjWEAKJb(br50^EyxU_ `COTYk*{%|N}%\QmNFQvbw뻦o}I4UPI%_ T&??-x8ί7 nfx8+xE̱DIzme{%t$%&Dr.9>`{C|-B7fuه)M绁͘;ѵRZql˽$=kRojY?ok woh9*#qZߞGam~7̑U1\vBpbs[YjB: b̍w=%:ȞJU!.st9s2A~1G)ܒo1`c:T/>AG^V4w^5b[)1 Vnje]}֢ph!j{X;8SiM0bTD04eR aCxգEM˯?T㷩rᖁ|1Q`2r&c8;-={<6s"w8u2U@#Z0 pZ^/"uWiX-E|bY gP@\H2җŴr!i !Q$,Ba K!0BAR! a)F,_T?A|||nE+KKʗ+]A59v 5"?ν{8w"ʕ&W $>>^RJbBb̤fhs ׏,){rB#Hk$}BsIu>wbu6/aQ-Z>d߹b_1CzRUpfmEgj\ oOķY"F9Ž?a@NZ?CۊziN65q6eӧWNc3)wa|P 3@ ?g=R- Q h]F܆;ހEߺ*,75)%|1%wVyjS(VfIZg΄I8p3Ė"vb؀κ~ڜf8m4An~mr~|ŧ+d hĞ\Kw3 S7hk;A,/)%/$l8㛴 df=_Fzs?I ci`~8r+[?ѥf1k9"S©M" l28䋴~jȀ4n%[ldec|6uw0j. tG [.'u%87ݼ$Y^ Ȥ,cdEG/#d󯌬z~!,N=˯z:fJfr2CX֧(eo"򯇲@wahK0yo\c?e`~W+ym!trmFhФ*W7s%ʖ˕ Q4G.d3!f1]u ZOyǢ]ffʱ?n!q [5͌Ng]tf7cp?ћջ(<6n^H~ޛUl,'ԳZVyZ4嗉˸`#ldKz׃e)7!M +Eaj1~.q:![X=*gNaݝ| a7lX-K-rG [=8ˆhZ|F,ތNu `B2x Y* &inf3/W2$ܼEn  ֤VY {ij)(vY woyQY *(`^Ջ/אVU1(r;Q*mlPklCcSK/J[bafB0 aWլp+[EWDof@PnVَ"E} ;EbpL)lY8ihV EG ^;l`tW3A:eǑa_9-)_-\ߢq(`V5p#ox&WMܻmQ((7FMɦh1~tyey]nK|: [ԏ]ݛWh|Wp`Kh5??ao1ٺ:>՝g}Uc OΞn̨[$x+!H/Ő|Bf;G{* z lL2iYnjY?`8+ jH[hOubɂY|:7~յ!ڢ܋qwQ/>ã}JA͙>\+,ߦaco0B @>;~/ S/O4 tۢEEB@#!.敎lt :M}l~XJ1vC~=r8ޖONՈ{-)!_{O̹ՌKږTDZώ:|^:mSW~o[&2pw_6@-Slpd\v7pJNOcZ7=~ҾtK?X0+-’>?ݵW˹}{hΛ~(; ]? Gj|~J*Q~amPቻBwP xx{2Źn)9v>S>ĺR_x=8{*wq^v D+m25~+Ҹ,?oZ<\""YŚeKK!E7qO-xǿ.~`hR-9kg$VS;W+ĩKzkA 0u,NV:lmHv[)i׏q].N/gH{ۙ6|&;OMNn?kIE_Y`Utx4u6[1+"348M~] |y1>a)%=ivi MGf4tCnG=}v۹`oWz5=f:hϤi!2k1LrD96Ũhե5 'Ӕٛq0^"#%|̰EqcDG {di Zdmgcv}:Ո8|U-ptv hD>i|c}nFԾfPCCSs $i<{*^.YYک.*:WGQ]Эxxx– ݁=XUgjonl|fID{ŔVjl_N.g^! h$śéfd3]z] 'W/Pc9lN!p !s|izE{3 bkrїyr6O[]! !0@4y)#/|sH5kHR! ʒ{Ej$,_ʕ*q.^E֖ҥKannke|MRŝ.H^R5[BAR! a)FB#HX !$,Ba K!0B!۰"<,uE!rLxXVV9lUU .cBښreʠ(9Ӏ6,B<"}Ba K!0BAR! a)FB#HX !$,Ba K!0BAR! a)FB#HX !dL *2IENDB`kraft-1.2.2/manual/images/nl/pdfpostproc.png000066400000000000000000000710751467704360200210520ustar00rootroot00000000000000PNG  IHDROe7' pHYs+ IDATx^e\]{fv @.nV$D@DPQPDܘy?, ,㋊z_??93gY"/ԣ8+ s D+BLUUUo0;]!TӦ}'ESE$Ig!@}+$I"PLL+o-&%%hKKK! 4-Z 22'WS@/kD]#-gi@e-BWoފ}"54D+B>@u 5uR7iL!++B5oB!԰0 BüB B!;+!j0 BQgihN|DP6Ъe+?~G7cيJ_ﴄĄicB>$KVp8h%ލu\^|ۄĄֺE !1c!X?mٲLLӲeܜ/ n}aVTma忪/B>x<11<`;11\nzq8lR ޱ!ToWB!üB B!;+!j0 BüB_7JJJr^^^ʢ!PC[WVZrrE+@ժ+W035]W?ާǺxWzg&Z]k%Kl_;!%o?X+C#n5O<>lXii3<Oz[:y FRBΞcK416#%?}/Rb~rX;w>BO\FF]a=i 5|K $H=0z'Oxy00?sS'o_dΦ+rヷ]\xICkzzM;%M)% Ej_~!d9" YaY{ g̪ / ו痏1h΁LéΓ.~ 8O[7{"RĀ ;z#.ޣ^K,0`8X:1zƔ88׈US>_"*MvL/g{'ޓL W4g{ښRPynUuǺ;5Eؼ4fÇ =xpĈ?G;D b{E#Utnu ]{kWOP _> KAUȭttJxhb{GζYv*04}US`VN\g:c\:0Ib显[?o.0ܗz=ticTƥSV|Ϟ$goo ߅\4l?]8\} %t>Χ(Sn)s NlYМ/^䐶sg\&΃Nk.ܸ:Ӱ|]nѝ+' xrj¬ɽ.Xa~+wo`s޿?bCoa߿} ܽw@ƍOJ$о)bxo}7tp*73q>Q-TD=*){@&7d݂+䀽7]i'Go/qvzj{NrzlT[XUw#c+yhTaaiZk5!:j.bI8P+ȍ >N[Q1aT֥7S mT*Bns{Pb] 2 ~ţ1Zrr=]Z%DKD?m1ZSŖ`B0yQ݇79aaw"bɶ1HM}RZZڿ_ߗ/_quu]0`miǘ@'i v^uR7æ>+cO"c\L~\lr;c}i9v# 枞ٷ#)%9‹&)hj6M5'ɋViߔCPF=݊-a9~}ʐ@Ywpy廱:9E Eph<|m{Z0QUNi8ӳGJߨ͇AbT4a6ĵɣ\i+McCenʺ Б &Z <& rֳ$IJw&1N @u - q~kcې/GꏝP2j@p$ QM'*YO@~n '+r|s+`fx{-:f( y()wT%[$8tQVvizܞ7kj]KyyJKAY:7;r\ZcRR )4ӧ{v3°2g/^ܹsgѥk#d6\]`AiƳ]7<܊Gv tE/m\TI.wO" EB8+0zw*]JiRf͗0So?S*CNRK99c<|:j[Z€)X51(pU)G6wrjv&vMr2z@*7Ӓ\o}NN<=RGdiFBZ6%yUJ*N*.tg%ֵ Jfe ܪױWD ?)RP/}Uƀ8 E\(JnnPeees~zZe$ã#Sh4M|@QO7EͬS \/d X\n<0/JySBLIE^c׬JʖF}w+7Xv^=|m'@O33k/ 21?thzE$ ,s N`ql[j% m^x`y_%3KB$)o@jY6k8/gG^8R`U/.νa@5}1{vl d&d۠5M_98IrfS֏Rzרhs"FCrZ`U/lqxy+KV*XX_.?p݂*$P:V9O{+^wG~tWiISk] $wz_ոiƹ^ojmc4p8d;sKN&U]K]kܦI7.KעtI{IvuY8Gcup:uyW``E Xm- K2ۙI.XPrҽ(;[x9(-4"tkLZD/ !_ Z[277pRR0͛7ho 5oxX-HKKKRy98΍o+/ |F-ء/4EU6;,Z8yC8@dzz;EhQE|R^GQ(r:$ðֿ~u{E51 C9?UHE/(NK^N㘢gW{ZgHqN. f*c+g G4IoS-ywBP_iB.R{ oR-`^i!B!a^A!Pcy!BoWXl6-Eup<knvE~"+#D+P \.7!!^FZJtBBvcMN};wBWԤOWp8Y 5Mъ*ME;zSъ*i_;!󊜜A2@U(JZZZVVV vc]i?ȿv,B *}B?o?!B<+!j0 BüB B!;+!j~ >gV B7AZcqC畂m-)/} [9B_$5#ySzu!Bii?WJKKpd!3HJIt WB!B5vWB!x |y!BB5vW3cD+~:p9e?rrPn2&'hn gLRqtsχŽ*#Uufh WZqRbĤ-)х~F nL`h-&+QN fAPՖ.dl9T*[ZE+#{)ɿ2u]nվ:N=>9"¼P]Lჭf}I YAvDh..Rt@K+2]WwTԺ:b֐vҌ_,{lZbe%4i*ΓN܌ İGA;"YqMk%q[Jy[YK]z|a"~ 6U~ )LaCl=lϠ׆ǽb:YA4Yg۹Y(S!fΦl[[ʮ1^<յc=mm]$Rѽ]lml],VY @VdmΉzybGMO'=,)LJ[NgΊ>8{pi;xPe}}w~jrצM3;8z+Wu7cޱW{vnhQe_oe=z>CgDl4CF.upζVN>sϾoQj{4E4!_j_R)(Q>E2:GZ ~zgn$]n^H9ʈF)(),ֻr%#cO;%)3ac-ujjԋRا2I̜M]pL{D4Ӓ16\ZN"R TT9JJrD&:=|=<ӣ{bpqSaK (KϠmY^Yj,g~Fi >t~jMd倜a,݁nJPrZ"K}H5=&;BC⇶l#J)**z.4ǠIܥvn['OIG~% D諫% ĺzQcxH%KWwg%tyV FM;0B_|,0N36]ؤ{=[tMO_6J„yFzWN=:2ZGRAEEfKNZ=ԳB+TN Pv7BtWsKdז&A|7PbxOvM~Z9  BTvX}|MXRmlTbN6;mE[)u?zȊ+trQx@X r}&XJg =HI}UcUK6l9{CN+uuӺ>߈j5;nר$[::4 a0{ij1a4h i@mɆRѭKr:wιvRg1`0,9n@v籬OJw={?ji Klau_1%{\ 嶎ֆ !cnnڍ4%$͇vb*<]EO"HnW WkP}` IDATѲϣ8n"P[Qv˹Ip`a؇]VHzMQI$I ׃B' x ]ܙ謯aiBdE\=UF)ϚfR @WB ;ύdKxXWB$B!B B!;+!j0 BüB B!;+!j0 B#BF obE!PcrKJK%$% B! >IA$AP,B5E))*$IQAEdB B!;+!jp i%%%!~ $555D46>>;+wl6[YEnF.???#+]Ңu!~wIKm||EE>\^Bbmڈ5JGB?ԴVu0 Я%##BG'55MJvVn Vaj*;+[¼+))BW.x<-Zp8 riA!jAnn.A$I$ B! *Mq$I B5^%WB!Ԙy<B B!{^ ru 4HtVc+{]{fDk菧GϽ^,R̴g[]WD7{1'X#{Kqo-@lpwXvD&'jH3#6LNO&7LkSGjw''?1158q=vkh4}6~U^dF;[1 m?v] C 3_(nOwbhDݷWLaL?~h ޞYy=>͙PE^i3ì&]XH!aaTl)B(={Ưuа$--^zl%ܹҿ_W 7Bn۵hC;u H]K пT78 >v?!>V|⻗h~|5Di34:Sî;ϥ )Oyr*|^݀z94 'J{VN! :d!.]N<{…=gtnzj.VF|gik'rww0Eq'Q~Оn>sOg7g_ X0}ܣ94rbsKz:YZyr+8~mm].TXJgEdgg>dg 0Ekwf:*ݻ9ZtR8Z۸k杼vM+m?}++ &8xo_;[Wt<{Pg],FT ԟP @g5uY4lv^vzC@ QZ9te9@<ЦS/J;VlMMl/ G|znuqL;YZnHW0Ot#/:=|ؾn6Vcvc+G /|wrsmwó]m]MszK mo4ZpS7q27tYz9 @%Ǐvfl5Hltn>.&&&|g+l=4|_HzZAS3;[w%JM1WO=Sxei4.cy a=&phiŹ%], ͬzN` r2:Y>Fs2iASzY9yIN 7'ܯCw3_rÑݗ8:E7c>;=c+q37/OXӫ_W(m gGV|_( 0 ;R !_>Dٕ6*b=6_?;gKdA w/Pp@hĵ'qmˬ;o-4o޹Kt=2D,paTNs/,oU궹s3Tt>̩\v``f}ϲWʭGn8~uA]7P{ uvj;n &'xˤρBϯ6MHXiݺRf:3j\_|^\N|;nۧ xsxmp4%-l( ۺn];Ѯ8ЇOFFn4JزbGa\}Qe@ 1tH.rz֝[f^rYxeoNNqŎ]eiO:ל uk[3. Ͷn9Pp>O60Dpm4I ;y/f纇KF"lϔeWݎ咶yʮ@c_Pԃ==X:ʼXߺw 3f iOE'nl&ձ6^VlZSB}ZKS@u1R!fRYguq(53ּLF}xkmY qNw%FPJ&}\U34dO1kLaaQn-X@H63PM}Q}5Tͣcկy0C"))N<m5l3ѣF=J7z_DPrmƭt5 ǧ:>Ǡ{zЩ$Q>Hyy `)()(~,"ȗRQ L^v.6Ѡ^tVFVك^6@v(4g񹙤"@X,RN^0wbbb/^˗/ARS~ASa1f¶ݮ$H{ K /;O\^ꇵIUJg2 @ggJ"DgѠMS^Xe:-S[b٦r$% e=j Ռ1;VŵFa N?F{MKZ費n+Hi99*'+UHdr@*# t)+:Ihێ\m;,׼jLQԕpEC^hb^vu9-j??r OZq܋(~*5}TfV,8Uɯ:pl1eءȐ5D/ Be#tfv=6 WRRVT&`a_RWg~W*pS& :$0E%ʕmїV3dԄՓgTYp5|uCbu_a͚ןsoT-5TVd~d@ x鹊Yc2huRAYQ "oj"-z#7B3~̙3`ܹu'b?GҬ׮?clySWТ$gD՘p{?0ﮞ`̭;s ds}Dgp,KL-HEf. M)qgߩm]mu+b.>]}EK]lнe=?tɧWo3ͥlBri eerd a VPP8K$ rNTM{ɿpZw?NewRy%մp_ž*::'|\:.OD tWdz{լ׊/ U誱/O)g4uPS\D5RŦi <ͫRFz1K_JubudHdGF{# :| cTչGw݇dT0 ?<Ϯ\#Q<^?FX %/?1Mnu/p@]A)ݴ]Ke_^ϳ4M4XM@ M{[L?ᡃ;8!լ|_BCBZٳՃ;noOO,^xY:B!͝;/VDs~ SFeIE||C6NWTa-0z3ޔԲ.ĵ KR &&Mzv5+6Ẩjn1pBge@y-['w_/4z]mRc?N/ha;u.h>p*ޖcIINohR2JLL*=v޶4l>3vĽuSHIjY{OXM5)+7 w\X'ݻӝ׽9UD` #Vqu!Pq1=f,Owy5Ey[g w?;9mGdj[L\˒"૏;{.΢ԐK|q)M |tħZB3̓s0+$Y.PC )LN<jkk׮-_yj( aE H$?6`NѴM ^~~u" ʇ$>Q}?-E?^o.{ 0v[|\߽{g?Tڻ133H[[}ߵhi߉gE$I?| u0 SZ )MA5IE!^ff揟<-"$|ʔL'o B!6$H.l/?lBBߢ>B!T!Büor!3K0$EKBtEERR_Q4l.o7.f׺ wcX毠_ESS]::Ңu!~IUdeeZp dpDYYъ N^N'!)ԔҬYԴq܊ Ѻ#&&//٤hEcy0 ju~#)JFFFB+N/eToB B!;+!jT B5vWB!a^A!Pcg46>>;+!Ylrk]]ġz`^۽p8u!~.m||6mD^BYٺZcXA_a@yx,B' B!;+!j0 BüB B!W_*B!> W-sp#:/-G ݃z-G!K5|^3lw<әƙ8/ :t̆Kk~cP:NLl7A6h&?:ꭴlrLPZȰiM+{|k[h1YwG|Yt+svxA!`E| ?h*: 3Lуm y/fދC i)xzf[[~3Eg߸fj>djyR 6Ohcm=7Mv5>bx5#={:~;"nae{GN&/zÀ&Vptp>`;{g tss"蔓#>{z`O';7y'^3sآ3ϫKɭ7+(wikoˊS;;:LSjʞG!K==}=}qUR‡G޾?#27)hO;;7Y|{yܨn6msKJZ=i/!T}<xӻo,Ob#L]-۾ΣA|#iM r#ɡ[N=[L]=ɌA;B3\|fj2h 74x84tg&$7|DGve7! }˅7mq+>1wpvpC}oSS}ƾluC[ž¾]~F||t`^ IDATӝ3}Y7ɭl4^zv+s] tdX37BH߮߇{\!aW'Bug^ZgohhjC*-7Hdy3oŋ,G_k PM q^n?T0R1}]O}ѸM* hjef`0y4zvh*FPƽUތ-۲RͥHBG߳w;ĴM}*(J n%I{uo)^Wq2β8GY?EwnAZz/Y5T+tR$=F*l $~ZjP Tm{8aon]O &3>Qz$I=$FI(;Om%#!aik>I)!eZkɈvV^[#t1m&Ըv^f6 tRDGC)`) o&%A ,i+C)gMS0H7$bA,' Bk ׬^]3ʚի k/%Zp:y0FƤIڇbRyIm̻ɡG]!)^;A{u[p¿% ZZ5)" H%!#[kIM ]]v{EWMK`ij7W^~.1'KT pYy~e)*TT '3;UЦe|(+S ʾ]K45[RgG=c]ZKUVԚ[oǏ\~_P$/GBG,ԝ'C+)V=E1<s\! ֵݽkF~v[aHEyCݲdvy3cݝMկ7G)(<,e@:3# (`rsi$+&/_#/PJRV.\P b#[s2-Ǯp袹5=;zV^[==6y͋Stұa^) WWQwR.^6L NSww']!!,'LݻvaX~ BqB#v,ݠhn$W ծ<tD?!;0of.!. I(B M!PBB  & . PC޻HO"DHHHv?vr!#k\ffvE$/NJe"nR̅Yn&]fYLJ0\:k~^zO=y͚͑ԂBjε ;nf_M"+\X.֪C^Uuv|W{Dr_biܩu/~9>盧K򍋿_Ͱ}֬fXx'>6LBB<|;%PNu/d%"hQϤ$g]ZRlu+22'z⎶@!B7^` B7)BC~_7mlFx3ϥ4#"}C[O_Ѷi""٪_SFDwm޷3:w<7y#>L&W]G|X+6j"m;a~&k+_ٝ>CB[!7m쭷ђ˖,]lWPqÆP:L^޺s귾|cB~g*X5yߥ|gkY[xKJ`1UW GAXXێnQ6,J&*!gv='*7m^ž)9I1jm]mߟzxgF'\_i)Fuꈕ۷x_Yc[l۶|pծJ}eGvJ7Fؾos̑8ɻ:]c/SꟜd""k9? 7\Z]I"wo?s5\r?o߶eoxo?eu rv|]V/>G |uߟRz^rή>]}o/ₕ(Wcf}z7}9%]Iek7W-&L0!%%E[WʕL^!VFY}\~ks0-'䧚4,CDbu| MCSn$iDʞ *x}%&4y߱G3dA$5zӨ{W#"ݲWj .gUדKfRKtmR=8x.ubwQƫr:FxcWdF<飁OKR`Z7*ӹG3DW.+[Om^7pPO@f3 iTVǘ{6ͫ\`K{wbe%LO|3I{NF3|5 1:zWjJ! =JD-(&MȅҎx6}*,E7{$X^Ȉo[/.\:Ht+7:|\=%{T[1.x[J,BLJu9W F dW!"&^TΪjt-(pZμ}DZJ5-)N6)zd~|SMop=DDw/ .rSFIDžU&oy+|}MLv>GDӧO֕E+ְɓעm5UK"aa<N֋KGO:r $9~YgG2/o=~Z1:$n7Okj n 2c=waNEN""|-f6J>^5,\9{&znդTa0Ggt-K//mG#"n2f]M'"eu#GODF֕r BݸI-B[*aM=o:ѸI 'SSnT%vfˮ8e2?/f ˆGbtHsjViҵmƚEΤ sʥ &U77N릶ϭ?zm6n rVK-r@by]g3Pjp+LIN}j칼v椯sr6z;wعk1ںҤ_!^!4ufj7\A:"8/=Omx&"b7"lruć'bļ7ΝײdOPzjIOu)k>p59 Ȅ^s.Rن=ω Oֹz׊;19>=iGĠޚAY.ѻYDD֤206NM5ƦMсy+]#B~Ӄr&ր;tHR(vB{4Vю; ޿ߐE#00p͛i+hϞ=mڴ֖%8rXpÆڊ`g.~P$I8ׯ\ k͛픶SbW)h4y 8;pD+PsPB+P0ww m) ww7m^7lzmi8qKիV%&==R倀mT`x!l6/ZBD!CB+;/.fffjX0LFΦJ* 'N0ggkPY!yLECx=yd21LF53NitA$yM%1f2L&TD̷'DM 8x 8ey 8zWW8ƕ- z5!zqebLLrRb;^[fMΝBPCWwד֮JPzz/m.dgg mݽ3-q1cbԮ+Q_<&$UɃJGU6I5j=BD>FPrR)h;Wy233VGC停`0<⁼NB8a<X#Wyhg*WY:Wyv[Rl} eO֥ @)6d͚P"Ztْ˔ *nذ~y]AA%W܂uzfҮt{yDꚡ6  m5p7d"22$qHpu7u[//8Q۟СkS׾G:@ 8$^@Dgϝ'2mO!|#9|y9)-=@c[ۿ_իW+ÆݳgilkR2y|q[+EؼL ]e[=함Vm{ v% {GDVQwhղ}Ԁi8_n$# r90G2gs~*$sӊ5v;jX.]^r[4mZl5`ʪ3^_x陶mv;mEXXێnQ6,]JʖV"l:Ld}w_tf׮_WulꈯΚ~=j޶sũl]8ѩ71J#g\ڷlq%m%m[9|vѹB zoS6lb@n=o/ߺsߙ5Y+Ǝ^~[o%{Ӌf/%%e 'LHII֕*ֻbc)B̫Uf[!qkg :ֱ;G6.i` wNH}l99E>MVѣQ]1;GwcnU0VJ] "D9?}iӰ6ϾBmmADL&PG,gGEDh͟K;\j{P?=2=[aݷ|yۆO4 { 2p@t荃^+tڂb:g9ٲ%[nv'A cǎM0L+-QnJnqI"έӶnwȉ8y蓮% '"")>e%]ğG5rJ3I)7S'"ocv<ٻ4ze=MEwYLn-|D^];[n!CFNDF֕6RADD.V\ש]9NDڥ}Φo~͔)։KvXWשǶ/a$rҮ)SFCR|5L|h1"g]3g->v7zyތl%!X]᫃7,$or_M;{3^}GYHqcvܵcѣhJY=@H8\ ^Lj2?Twpku(y46oY#/ٯ=i`D˹suayV ?à#9}VJu1(ʲM1w/[NhoZFۨRZ]ػg| ӧeY8Lrl9ceDR՗fL5썮r[=V|Qy&f[DI?7o 7vr! e8ȾED~Ӄr&^{P:28tHR(vB{4Vю; ޿ߐDDhôDDgϞ6mZkKB9z,aCmC0{Ҙ%ι$I%I_o]߶^%PZcZJz8|rb6;yqg?Jc,lYE Y"8+;ww m) wBWFfY[/ OgȮϷ" Rj@KOϸ1=j2@0qqqF-Z&e>2BLlf Ƙ[@@hTR%!1lmݽ3xy*VV0e)[DK yLJje2c&QZuKxT2PYRDD+cd2_/U(kByiWY! %O`HIDATjA^!Lye, p=D(ym8YغX\MfBX5ma77 (ts+-}xdr=m+/pR@J̫̌ WV<4Hk+D0T?uPJ0T(_xO3d+ ='8M`ʯ^T6%Hs4 se,B+$YG+,,Heo K!By eڊ p6B]sEq+|P֋?J!'!d%XW(*(PdeLHD+=,+, u_gÄ bjH감y "YB+\cBKa8pqsث΁q]$I$tS!`q$͔_N1SW0"[_ cjPA^ˆ1b1վp38K\=0`I+tԎp 1.$K*+L#NǹW8+$$Iq%8㜑m PB\903Ƙ}8.\;t'b=rғ~e.MАe96.[E[>e}j'1l2;.nK+p_WQ*kt}kԭ#"ظXl0u=[f-m?7I@g4Vq+D䪗U?|W[as歚5k!`J-Y^Җ>\u;|Y,A-/GʐW!b 8?p.W9Fpn{cq<@BYvuqqDT#FTnݣ z~iɱq|'i+Jq'4p`ݺO!;w~[l6uv Ң6d;X2Eƃ9Y,&Gm|_2CXﮝGp[R%Rwi3aUH=䵨i+/f;]l۩SCnѢEٲ>->_zO?U_'?٬fmţJ(],Nb17~c7^{*94+ȺuV=,˵kׯ]_׮] yŜ=gH^z}gףW79KneVcܐb۷o8a:u7%3Sdͺ lڤiFsQ{N5:4w$n\sZϑ=ZDnZ8#:\D|WZNW3}֯iWNѡKqLDd;ӈ\=3GlJ'{.2]Ǟ>\w |}*?L&y9;{]?] dy˦fk;7;vÒsuϬQ[X2Y(.6n'(q3f;1ԭ[珸?r[;;װK4<`[>q~7xryJ̪oHohq#/7qZ-*Q]1V{Vhtxؼ}sܜUf}3ȰBDhS$d@J.=ԼbTӯ+NO4iuE)c߽8Eul末YfL7_GEE݃2a^9ޞ܉/QbSP9gd!#ohLjgoͤ.}BDDwY~?XFQ7/BAݟaXNvϚ}JjIO8v1o:`7t1%qŲ;5qӧ; +5*u^BhH߽kw޼*qT go9i9$~-D下 YnFW/K2 9W;ipVo3o %Md k=1'__~Yʄ޻-;L[:|>}S't(acM:e ҷua={o~~iSK u2Bvݺ- ]n ?0en?,ߤUypqޝ?g]r56"CAsFG"d:c吾f4Jێc -}:7mMm)ٳ'<<\[r4PVٲ?!"I cL*P1xPc=wѽь)qSNL @1WmpbŞZ+DUMhVJ}ݵX fY[ 6fEw\ȿPqЧAF夻9ewsr2zG\\lVlpVY7^܏^o?w%#я,.RM>4K[aPkLJ^e|׾[7E `D'o4VmA}-J[t1fOOR2B(z!!6WlC""""""E00 ?sQvJ6NTDDDDDDtr:e's"_?[E|ODDDDDDX8)l'["}>z]""""""؎W1xnĝ wy}z"""""":5Wq^'*Nd<;'"""""""Cq'Z#Zhm7N=R5Rۉb&zONT sc~@*!""""" WEKD"l-k.pp VQQQpW8vCo'R!""""""kJCNvY7**ZR g]U vpUT|: v\0V8FTEIry+ @@pcPJ2@c+턳nDT乬m_~?\% VYQ"x'ey#]]W&҉}(eY'"g\.:ݺ:%""""" %Ie`N(˺eY'l+IuC/حJ*fX}`QtOe5*$B$ױb5*&Q곊Yl :Ky'ʡ^uԘc*uc}"="""""]nY՘ڶb5Fm:H:3 "1^j[QDŽ$#"""""|;NPLJڶ cD{|W2;>ԶL mjULNY#""""":Y5UUL -SBm!+$7 v-qdV}jLm vq"""""":>r5 ԾPہ;>qed92(=_[ٍ[Pہ:(:DDDDDD'$ӡ-*UjPƆ$In(v8"X~ݲnݲ~ߟp%"""""Iko v21v21VbV66$Lfvc Զ vZgկ[Tj1fY oD:=}@€",>u]WcVs5&/suYPcڪ@DDDDDD'@  X'\V}rZZǪ߲<vV I@ _MV„ mu[}DPc__Nڭbr[\'ez)cvr[ jܮNE* vɺU2/幺>9IN(}~9&\fMDDDDDDI][ܮ`'A=B>y.XUE"eMSzH O"SY{ Cvb2`UoY-(X#Ԙ잒V gij1h xU 'w":51nwΑCL.-DC5傃cոhԸMb!Q eee\B+Z8vsggNٽ3ij5}7֠iis{s P &QH/eUU,$E*&E Iă)Z;3 ծZ/NDDDDDDt `a "y's@DB)-H<=GB!874݄QDAf< .>A](:9MI#7R|)ܧދBʶ~Xpo܊/ڢqy\İ*h1[|x*Ak 4MFس0 DDDDDD"< iٔD ؖܧ gD]*.v>yY|,ŲL3bǞN{\DžjmC1N#oW^OmGԔ'u'#Ɗƒ-'* oY)xoDvtZyc OH3 PR58BW ߕ!<ʢwnWwҫ;A S'G:U8+.|1 t]G0iQԮѯYLĽwi""4m[4кEs4mH #_9 X*\X߈hc؈LˁUwjLn˓lrD4 +sT|ߊ.Σx<.zre 7o\#p p4';PNԺbj]jv he+Bဦi,^U`?(n)pxNZyxp=<$&Z:++SfFAA;_{4 i'-^}>ХYܢ#&Dqv+]/Zۏ=jmp6NGwHkBr=Iu $1~(;rB_ eb5qxvXj[e.[āWP]qm`]p{ Hk^ܣ(Lg#0itj }zPh}fy\Qp8xm?ܢŤq1rx=V4m zu^QJ Xk|:o!:?o5kob銟pz˖^ F< /n0iht{<w';V-e8?] BRSPPPšucQf L~u6}oXk{:~\+>>[ye"" $6&Oou6g- }2r3ڴƐa

    ۺ۲7`Ҕ:$''_>|JDT麎G3K$=4~0 [ގcqÿCk/bUXo0 }i".6CCKM(LGupxغm;h yGsϿ;v"%% qطMG{u6[bgr쐇ѧ:kNYսNoټz7SǵiBL| >>)sXnV:jŋ뮾:\!Q勺k7agSv{v|?y n7>zxNWF_ s>?ԩU )Qh6mI1boa%۵=O<2x+J#^c *4f3 y4<ͲnW]EQBLrE _]?Xqpֽv, \;Q /Y7bĘvKY ":qtUhӺ%b8CnWb8 4k.x<l۱Qz5CdL,:0Ͼزox<YyyPV-;j*ƞ|Su.| >[GpX|nB f]̝YY8v,_~.< Mp0|.8-[AӢVhޤ1w0pt,X5 f-\. k֣VZDDi6l1޳{O3$xBؽn4h0V,˹c[-mU츉vJ}zv8rq*nYq?K2P|$VsNf Gxh0EQ/ 4a& _bbbX ":Os~9˱`%ۓQ")K'$&&4ԔR ۯ:Yzi]a0t?1 7oLC!Ӱ4M+:jVA܁w8tE4M,TZw .?].{p[ ۚ9S̚ơY0<`_. ػ?ޚ Ķ;b/d:}| 3HT Grr0EE;? aϣRbbzWZ6mI9Ϫg~{o#GrѥSuX瞍ᅢe?ĄC "Q(O(Y"5Q8B1,rE"Bg/4eL $EIEQ\'_{?~6"?4fka`YuDDDDDDDp3^{rM.ɔ inH}\SP`\eAE On\c$o'"$rB1HaϪ︊f~ % cYuPx$N!"wUsZWU,2̮.̮!05&/[O];_kI^9p@/AADDDDDDx!j#>yYfZ[/*v

    QPtx\w8(\ŲL-h\E%qCqVÊ跚!Ǣ,ZQxv~GEy.TդmZCDDDDDDTQYwA IDATr+j.hǩ*…acw:VVZyRr"ebj^,Oܶ#Xŭb*=,{(oHm՘\~?bفJDDDDDDTijk [łmۑKDPP%?T0w}!""""MӊA>Ncf4:)7TSDԾ < ۉ\0:(>_DDDDtB {l㉨sXQPj,8ѶgUPrUѸTD[QQe-v.UhUTj+̷+l%PEp.yYݱjXV*QE'X1~u*V!…3eVƪOC :*2%ol+mY0qrG]`VquRSDDDDDDDêCP'1N\P.\;RUl-""""""DaejJS*x)…A:WcVP*5jLͅƪ Vow<'Ac@KF** %@Ul7ېrs< 9vQE&rWTV .5o.MDDDDDDDZMXf}\9@Y}x5lu.Pfd`0 C":)9:ר:j]DDDDDT>j0v(ĺvmXDpNԶ['83h$褔s{fxADDDDTtV}X*Moi_D~o/"""SU/׵b/ TsN+@` ۷C 9nE 4M|ט1cFT/Q(1 x<.@ξmXk4),߈Ś#axeȶhMM6U0VmY@PLJϸc'j8jlL4 YYYj{F׮]vvc֭x뭷Ji=z4nf8'ҏ0DŽi7 U dC̟> <%n*uz `{F!'щ.y gFحSlYՁQ/uC޽1eʔLęgݻo޼hݺu8@Lj1,Ý#vcoK0ؖk܍s1wMx}<_k=sۄ3t/(C/2"""";!E/ ;3uƉ]?YHOO/X]~p8Q}DiڵiHOOGVMN$UZb uNkgvE=_Y, xaaofQ#GRS"vMu 99(⑚`{?y$XpڥpczK987û34=Uk"(23eʵ݄!.T 5c0Ƒ'*$!!bd#O丢}>9.Rjj%?}}<\ޗ\QVe$Ǒ\qHk쉈NrY*q2E,\ei@p@c@ RJR4 P E޿A4 ~~{p.ǯn& Hď/ƌY_ұ?5Ѫ~k\25* do _-KW_dz\kGsk~,q[Ū p(!N9Bt \vvMZ9 nD'Ξ}Dux8x)D\B)f`g{̟(0t>!fŢ~ߙB\}msI€•3>zXa@3μ*~7eƠ30 BcV>k1wȀ{~u!mĪMqvnׯU $l8,PW q(ZЩSҐ|o5O<9aݷSaWX(pcSdcX=> G =0}<Uboa 3bO{Q.C?|FX)x 4!ڜ4`h!OB05O' Ä߅xXu ;a1q ,;c=i%1$RZ_ؽ `Rs. Bl>8;b}/g"."%8*L >SNEvvcbܸq%bM6?)B?# /k/ +.шmz=_tIy{Lxw2 CD bd' =׀_L] U;߀K]5 ګs[~8hyᗩ/kƑݪøjЌ b+}ײ6{'Fm{c{H ݡ[,&L]u7u1MǙ/Q0ܻv푠krj{Xcw_vcqlF,]L\GAdG pナko,,:M7Lx0M }pMP--Qr K]: N%~ %>aTEvN$E!ѷo_ٳFict 8s̙3QzuuUXX$o}4$G^qI2+al^~w 8߷OބD_}ШYn҅xxOISM\nNǒl®{A58<扟E ]ͫ!ѡUqZ* \r=C48(MpQT`HA~BOgx?& ޺hf*,\nWti_4 -z?2.Uo/}^kt2eS_ĪᅱONh]ؾUAfmz eef@ZK|{f3v? W}+L 2EKdZ2:M-LO6,!|m.뺞:!uѬq#>!sGLc.?1k,Ub7Cnxho\䞸xk_&C)ѩ%lu'RA(>|8csc&̙{;vM;+GC4-Dž+02w'aʊ](0<߹#Ɯv8tDz}*E n[  ?7܆'^k0 x sg͗`ט0[HI*xbR/9s8Jzr*R>=SK""""2yu_wp!ͯL~~>NZ/cǎE˖-rC~~>/_ 33(n&&M:pQhN8?dRkY]ѰMc8χ~?R!zՠ&"9!Я1'[jּ$ 9hzW\ ӓFarsDJr!)%}8mu1^f1ASJ/_J;"DDDDTF'M|;GIq`NTjТE-MТE 5 .N8&h Ɨ;6qOnٵID橈qu:n&zgQ="s劣zǃz* {ya[Q3'_N@sFUyB_b *w^ Y6E<ߙAC|B\s'A=hq1 p`F7}0n[o+}7}ԐOMG+zuX Gq?7Ѳv \޷ kWa5ޟiR@׬B6ꏋ$`Vd>l5r-Cepi8+qivhհ6*WQ6|5 uՁJ];:`l[IŽB?k@K".="nD):ԍ_6: .Fe12ܹ9 """RN!bM """" 4 &QW"3j$nk(с]bqz #c0==6kz)& ǀa`Pԓ;q 5Li'pu-Gѭ;*]p'b}͢u]ZWṑ}ugnx?{b&cC<qqg\QŠip$ ):7ks.?\( -/?|?>lޑBԪѰe;2\yYe qn)ͱxl_'9|!f#л8TՔ^ q˘hb|Xu΅t"> j7l.n:E,Q]mf/Wb1ZZumʣ#xsOxşHs9Hvo0~gXSݼyf埶ӂ8DDDDDBD\^$4ץSjI#I^N'_{kؐFO\ұ)w/x%+0{lѣľqM7)!~xn?voX+$MM Sm0 w94Bq%In;2^{rгܾPiˢߐ_ mbi3 r[Lʏ#E5nG jX5M}w]?O .ϰ[]-5'*WI0Cv{)!o//\xbwƃZ4WGE ϸ ":X8=|A}wi\tvhPU*Š_X6=L&hm~):/(QpADtJ3ac;<~ >Y4g]\sh(MKDDDDTXX݌QY'bE77ŝ.L)'QpAA]6vU"4-DtbH9|~W||V w\^*BղeK4m[l)0` -Z؞<,[ SN-uckщ (]c% x饗z 4K-p=Du(zqv:uTX`<O&h/2ׯ_щ 8ӉYfm۶jWz0p@^&BDDDDDtcFGQQzu|wݻw퐐1c`ԨQ| ʕ+cڴiѧOԩSG1111hժq_dт$E@ǎ1el߾Qrrrf+hذ!/9EgO"|uLވm4,Ʈ9Y|,+G ?wލ{#pFʇ͇iw~@^y9r<|խ̽v,x]wCDDD=|EiQy*l,|&4i t6:]f}LXɗM @Z\}/oԖ~(Lh%rǽ(lr,8~0[V])+1}i:;WaX3}8FY}F*]S ur'{B؃oG _w; m{Ccضh<^>#{piXh\|#&᛭GWL\ۧ)Oml}3&{9~!hXWޟcl /.V?Y=Hku5=u?.72Va![tx1 hԡ7t#NOFm,<7?_uykx  ' sxWB~i8(RFMƷ[sW-t״ws6GF=){zT&Ϧ <wlƄq>v}k2j<8"6_ٍ#z|sF/\7 îc1p~DDDD<よ*#}5EsA <[c1~G.@&bμlx"YI6gblHl|#^|3Իg'oC 0_Eoc1qY6La čo7b(`}Jct; S>]=vL31w `Og<7c>>yt!O#Ggax:1M 3_z[0wM0}WDŽE2_Ο>q_aP`0vaÖbFشb+z%q7&KsĈoqP|fVCbxܝX*)~f/’#^.>6x.ħ!}GM$ދ.{E qCDP2Dp {dޥwkkA-}^y'y<| 3QyC!BEy& Vp}H;wkϤEj+4w¥+X\vNö:LU(_OZ!"GB,ޗfM٨9~/ҹ PW/z`-Ƀq-w1G-f¿l=sM,@KXW )I>(*ih٦$f hT{OxG})&?E&@QT+~](f sHUZL\FOj@ZR6_/S֦TV*u[ H;M i[ϗV==Axiͻn+  AxhfB5%]qVэ c.Ԍ-ٻe7TvY: lR69#/Zlf*<Է&&J`hHfS}Eär`6CbI$bbDuƭl`KO8ގ40tܶK=z-r?Ja!ZץTut )>ѷb"$,5ޞk}|2h 'k x*D&p]02#A=a 2=1D|.ϰSF Kpw涫  r4L:((ǑB!{B}\hR͈n8O|n|^YY*Ki{f2d+ɺIG`k` Lǁi%xwFRbZ 9#EqP} ЈM3nf#i~&)Ώ#;3y&EAͩ2KЬ-?]SO x( A< D8VT U q\k~yQD>}L> U=$lsvەckYY[RkPHйtwja%j_WcJ0Cy `\%?E]?*&r-.sMFJIp.?߉w.$ @z獍%xpIɌ^(Yp҄B!yTDXqG|%0WuK_},(|cg$Ē]0k {7K9C**OeJYұ ~'pi}˛jkn!?\Hµ]߲hzFeOu_@|J%GӰ\{]i}"r)%!jcؑ%JPm}[fm8 44%'n39E?#YKY&* kxSmW jM iSX빼BvەcReeSZ%nCʜ\12 Rέg nx3ڕ=̢yF9Z ȱ[n1`g_kHrjm`@z?.c7tijRъ7 2lG|vy?Op1S(T}'"Ar7>* ^`L(3.D D'ZQ@}0_Q{Y9?)Ebk1mGjiA뼀Zn#&e<[$K:5]S#mah\IX#{1x|7m|0}Fo!jFwM+KW 1Fҳu2h߽=NyJDt^_7bp}á & JkJ}VXr.և>nB!ܺ_icgq;EuY4Ӹi1id?;Mio6ؽgF:5KcmTZopPEͼnHWU{@T ݰ͗4]ECuÑ*j][VtT[gPtLh8gY /a\ lYoc;m4:ܬ/~ڧX& c a.`0ul5F{yclg1t ~Hgqty`8vutȭkWMUPq1벍e9-u_u=2s:rKUA7@U`\bۉ;8oqNاa&c[~埭LBO=tb@˸gG4n[i4nاظ~6r]tZBRT6wm2(5((2cLAUnw&Em㎱jeDࣦq姯Xv*:lNn˺)y:s?.mt-L~Ui;xhE1d_VqV{]:VV5[+*7BaGgݹd/cym~!BB"$ʶ*eiP7d2qoƕd4 xDJT!B_& ! ­6Klw678?F.1S_BB!$p!"Wwÿ<!BgIB!B!ȳ$p!B!B]ՄJ!hr&IfXDh ߇%v[ï)8U2/Zz[U=)/4E~%*_B*Kxko:=k׾$p1\AQ2UL(/WpsW]!OV2j\~)=o?Le?H\`@f?J-_Jwz?|1_ek%zS,9p-Ś1at.b\gg0i :. bgbͥ \4UVgDUlg.2>%re+L]RI^{Ul-,dvI J<_Ʀ۲|/Iҷ2L+l} ?KɽsYq*j:r?OxӇ̘W(dV <릎bC\( LY_y/+VǙꛬ [ضr6cVO? jxS 2uV29*0i>]M_{xIC788_7Z˦G ݖ }-kTse,|+Ԭ^:?p2B!#EOWg3g ?OO1rb- if{@/K4aAd%]QOW oǒx*ؔuΟN 6_G.폇ٗQi_ک"QAU 1y AYbbH24 Ub7f"P,>XNJ4JtyG!өl<_^% *?h= ZϪ+ (cWvt!c=NT(JyT AѹT@*5I~su:wD ⍈,K)`9Whз5<1ktMb6mžtה"&̾%hѤ,7Ν纡* w(B!"gHèu0 ʞ Vve҉5aU! L3PC"SU&]7@O".BD|piaC|>c~Ja?ɭ| l-2ROn|[5KّOy \-@G$;Kv8|,SD& W)@Nq\:ژK%84 j&4=Kj*aJu OǚJw{u{j8aj3nB!BH"RE@͞گGSR730^ᣦLvIQl+ŗqJA4_;|< ~ ڮrtod7jB?5>v(YV|km5:7 ;K '8WnW.C! *$jJf-hcNo'IIzA\YIb !4$G|뵽Zt(jk颀ΟJ C!B!L⟓|6ZI _=NH2wW-O\r+פa5nfMŇMksm[FVO8DC+ٜw3o\H18y*+*̹@*'-[FANT|0 v_MGTT\r# ϋ=02B!BᖴC kϷr-3ZĤk*(fC+)1qNoz|ܝ ~~xiă+p2Z3sv$<Ғ@J4G!lU$]teGOзMT n0Q 5&;ʝ$`.J<5&3 D)wn*A1cHZ %D^Lގ|Zyc'ӧ[(=X^ү\%WgnE'ƌגA IDATIVyd }$У&?SaEdt969B!Bi}|9MsLw<:8z 9UMNAN&ّnLCGM~ qvC㆑Y5g (*JF7dGutj{ϼc4-s[ ݚYWQ1 n(e t Ŗ(4T{>}2CI]GQQ]zƶfL?aZ&rs^mrEU}XFe1t\Ysq[nZժwޘMp:LvGN>BЦT7q~ɼXHwwHםƭq `8[ 4+\?9 iw:- iq(:1 E2flwDlgvn9Kۛ1Htecn~)=6eS9_C@mR_m}7L5Y!B!ĽuۖBϱrX4-6aTGz<;g,@ul8q!\ X<21tF,܊|tKHۏCˁ)tkܐ iШ1Mv!Y{*zi7~ԭ24OBgΉُҸVY3?lkGgpfDiC7WÖ ONݲm=-n՜ȦXrgz69}ʟ۔r/<[B!$p!ȳkrxp4_\ê/'F(׀$~Y0):0m9,erǏa~B%NNttV^-~`{3FY͛6.Dkm?|DN&+oi/[vްN]-^祁ؚw]ƒ 89cĬҿ_ k`_z2UOggORQsd.Fy K (6R糔mv !GEy+%Ѥ !>Oq*C!_M1\3yWPlh(&<<:wpf]iĻ_.gQ-uXOa>6JijWSؿ m|m'ޭI10?5jtPt) ?X\$ `|cJnצkʢ,ה]Eɹe)?o !IBw'x~;]~y;.fjb\UsE`z ƤySnMk7?6)Ez*D^4*.6~P"ӄGP%G7G-f¿l=sMn3fwB 44SLKI (vK NppdStОC'u=X[KxhUCzWY7~uI0O4sUR1aMF`4ә朏m#i5nFƍhԦkK'T&i.N[_H}'{.o\e)t7NƲ@"Ef2֢/0}lk.Ϝˎ# qMr?_\?0E첖/۲BQ!DS#ihoͨ饢'pq4fNohJF{c4x.U a}/pR7xkZ#Fħ_ǣRW]FJф@j2_iXڔ5/C/S #2 rZ?l}\B!{B)(JvW+ݻϒٟ㯕 0Y3g0cDgJdy.m8ur[DdȔc<0fΜO^EX̝E5pAԚx$Ǜ!vٞξBc !<<YW 1{$p+W3X3!>(J~I\wݺM 9hѥ ~嗓v֠vѓZQ/(Ymf:CZ3zɕG>1gZ_fCBh Vkhщiצ4kהW??X~߽>-!BYlsK )XXƚfJ)pIй@&G6nS},; ROb-o@dx+I$][bI.FbT%zVwPx_ ,Wذb; k]% )^j /$X߿/<fsZa/9o=K҄V5Q<ӸK9qS=C.cwڝ57ҮqpJ)]PͱA-B]:(bouQ>Z76XQj l=rr%3Rh=(V2?WǠLBa绻? k:iiiC՚b\)XXm/IBYF~5pAP=MT0kƼIj >M3x{ScSǺJDt^_7bp}H#:JޞJSׇ6c̣EXD\~& ך`(U)95Q?=Iobzli<^ UQ(|6v &E%t5* ~m}7?Uצϯ+`caΈEht{wi4J׮ykP2.4@Mj|tTUQ(*[vzH?[Ng>4(g5;\8do\Ka^B!_ryupU7@s: M#k޳ #]n ߰e6UzW荩|ԋ793 t΢*wmu @߅ ME&TGG˨5 ݰOCAQ| @7 :P|sO1 X$2tԹnu/9r(xurCbd{9O7 CwRb{iCm4*S԰ۓS34*1uycumM(;qdvN;O jtI^<Χɼ藾پ]ݯNݷ]tkBmmJeqԻd'Ώ:h`V e#]w-4nu7(~6r]tZOqyWžQ؞QtUu?#":eUq<ɚzmȶd/[rT_;t(*3EU]i9U,]-C*]EpvqC對v9wقWA}5A|rei9K)(ܖm]M9_SBşrpB/a?~WS3%S#oB:Ae˖扠3]Yb<={b:]wHPPPB!B!/o-SN>՚u۶ۃоm{ӧ\'#~&ȭ)^l!zt% !B!򶿿)k7oN 00u&u߼y3[q0X\]*UBʎ=f שճӥgdV-q5$VNBHqa?IGX:%jD: hЋLvcxx_"QqΦ#,Be?~5sYH::Qv$6)VvFD/_{I8e -\YjVt Uzw,!B򨈸+Ža }ìE1LQ43fw_@&Ag:4oԣ JBA ;݊>ZܺCzc{!ivϾ!eG ƔKh,+18=R }қ2te2RKߣeBo1t.%K½4άkSH@ Iaȡ,[R/L~M^Μʺ?_=U#{q2' !⯑⮐͌G` qً퟽Duig`9ºnҤ_O*{VGxW\M>c[ =D3ONe' ; 3㕿ms0]AjrҮfeݵf(B5BQJa%vD>oֳrH}TjoI&|,[))3𠆖&q,Z-Kߥ։*h㵑]uWmFmږ>@fV0k]U֧sXvk!鋏0-XMS3Xa#+F#JF r~Z %U76fG-oʺOfg}Z*5H9é"*aOW)Us2plXe۲x3/B"?2ިJsİ{b/s\L2R/a0!7!"rhF?7kFh0cx5橗R.?o8Was J'&|Muyԯ]ODVڕ8 S9;aҍ$`VZwk% 7;QC2(Ik\ձu͢Ԩ'=+i f3]%==w9#֑ۥ-_eê=jߎҦ1Ս+_x^ ^ ^z27SncZ.=gϞjL e˔C(MXaW$F3[L 6c`1zPK x?\sװr xQ}4U,gͅt]7ASx!fJ/bƤe䲟vQFH_"q֌IFJ7m#q=^ ㅏ١>jhdt .J8+vN 5u2Y1.un9Ϥ(!6S) \O5u?\T|fǮDDEhn+`w]g)A|9y& -s .(IQ} kԌe}/,yujK:f?W՟ƈ['4#q>!ɽ(_n0V+s+-/|w/U 5-N:U-{iXrCVv}3sEEjlb1Gtijg7f)%QRa|MY4|(XZ8o{ Y %>DT,Y]kJf@.E"ۻXrbr~e~&o|P7_vȎ vH;a}4o-r+Ru] 6}5%Y&cmD4oFBeLˊ UC3nxcԓG) cG>(BDZ\{f9z0 %((ΑWҬISBBB\Z=w.[ʕ+./0 } QG':_ ފƘ"xuN:N^գig,f~w 8\ag-wx7|AeDϞ{Q3l25:!:/ <[i쏪@ʗiu CA5u;\g,2E:Ŗ(**< IDATNkʖgv("#wn â6_1t\\(mZ(jƛDncU&1윾wq︞B!kZ-cq{`'Ώ:h`V e#]w-4nu7=FkÝNBZ\{&<<{.Z fF,ټ5[3u(u}Ƴtl[/n@شu-l_$qfHy+B1\l/yEXی` lٴ+n&qGofΝݵۧ5BY!YIBs4hۑaٻ[i8Na ./MTԣ￲+^ iI'ز-V)u{QniL \߿a}ѨqS?Se>rb<ڎi=ɿgβ]a73yg[F6Qxǵʿғ&MhԺ7KKᱎQD6jL6=xC_"yC7iG﷖qY,8۴Qd#Zw'RWr.|?-D3a_lTKtcŒif©Hbً 3 Yҷ2yW>j~.SϹ@ {G#6!||&q%BeUS4hGS&a_fBu]-vAhR/?K0u oAmvfgZ Wˆ]ȗc ~XwXrɂa9̧ϾoX%5/IcӦU|6cpb c]س[fX727n`2Y <1=^?{Eq{B-Tk)*]EĎ*E (Ui!@ n]ˑPhGnf^llFΪmIiPUfLumDd9^lNE-"-i{3op|Ԗy.N&lML6 A:xםuγ(&m׋01S'I3fuXPhTTmal>ƮP89 9ʖ{U4  ">.cn4kwUwϿa{=%-[>s^\0ryylb-\BT fڂsӞGz1U,e-Y̡Ç3 4dD%7`jֿ yY6 cL9'gC@Ԧ$oJ ϴ ~yHpLbKT%r00sRPHjp81-O1N$l死[ܝy\ yX$^VH{v -JiwI9(LBԖL8{Nl:pNbضA@t SD KvW+%qdy*~ eGRc"HH[>3;h8 4Bpr >%$$@p9RӇr<^?01  &tY$'o0&f[X=Y(Q=;QiV;N]  @ E#b]$t)J?"""r2o5\c<='],hQre *̱8pE#F|֖UZ"/?: 8"1m,=% {*a@~nLm׼,p=9;$P|ɟ1Ii0qIg#D}8^EIw'S'Na=[8,X˃[U>_#C̼iػkgY:FeQ:}<ԑE+zj>sTğLM!< t?I+~$o$2 b]}MGOypzWr@ަj>$wٲ7;]U୻I ej?'2=#$n>.z1. 0.෮d -\"""9 ,Szu-y=]ǁG"vK.TZ5Þrc1ס~}, uFa6 'wKRN äpGsv097ۘ"hSqe3r28ʷcm|6q-Gင㿰c$&E\1GrɄPI’qX$qtt>O)7P43˾MZO~"R9]x7 cG8J;LR9c'']6؜hg<4֜o3}g:*AO7ǣFk?lk$)>x`hN;>u;\ӥ6[T'3l wN&!>D oKCsQGѪ$7)ǭ\&|̺rK'(\#CFWdj ,ѯH֠K{|eY{GAy͋$A9m*>Š1Ù"gZ ܃NCypok(;/"ҥEYvg{|N: 8C[˴mv&6|1o1|5kNA۶S5MzKXm۞IKftb w隵븽fkzM#W%,mlgvPl˶<= sY)C! l ~=izO`x|=|Oʶ,  Ƕ,o4 :Ųrh$ ˧jdXNt33iǹ@{̝Ћ&6c۩ĶX\63Ո1Rsk$;l.xoR}=ςd~?YDDnbv,d)|a˻dr']vmo^?dLiſJapBa ƈOid2mR& L3}g4'`2-pcqvd&/GϪm4FafpO N7S̙ʬ~߇8~1C"(,g&.~]<2;eݬ2dtI^kI l:Aǰ]VGrwigj>W7·WƕpP,L$0wnWK!!U:-kE l,ܑmza^0J`>Zox%YsJ?G lrYK.B#""""$"""""""m)p!"""""""ٖ"""""""mi 6oiԨVPD հ,Ysfdblۦy  ٹk'A4iܔ} r٧?Xd*rUbS fbccyw9f 99m;On]˲Df͞Xbϝc7.;ݺO/y8{, -`#8sLu`fcvGgJJ_ȩOS;i3f rcR2ECߦa<:7w&J^?DZ-*OpGc֛<ԵaO*٧6iݚ7vXS:=뎻I$I_/}yyo_};UנRafHFbhDKYMLԋ5>Xßj[l}>wGiW @ UoGDh&m+>:UE`D7l]̪n\fW@V-z.m@Sc_K{;Qirٗ (O5#ޞ+񸭬R\6G"s"~L􎔫a:@ǖ2mc%zwLEDDk" CGYlE׷m+CrL!)./iC뙷&+!/jӉ:cY˪)P`vs<3W|گM n&xvEωX+4ʭIi=:PÓ|geȿ6Ҧcv-n73we:+# fsjR6ƃ-JÄ" yOu,.l0Kot@@V?"6m? 4)Ѭ*9Ӿ7 R~u0QouvukGЪl8gc['X*kC,"X %sgR,2gO==ŶzeLᦑ4=?&a9X-C/g% sG|OҫÎ'.IPfMB^]|O9mN{Y4g'1.=q!]E6K"?wCȕE%EDDn$ѧgO9·+dJ.ԢYsJ*Ŵ/ ))ѿXn(&u@W6:h~&rIBE(4ŊrіM,J!3L],E>" { H,]v#(YՓ'4?d=: "1H\R!9LLW $!H=M)̊iΈ6Eq_s;rϫC99 z'h :4C_R$i"OeOy\z[\c \5Ur}a(e٘o4xQX1<40>J[0p:Թ6NݻW'Ȉ^{~Sa7m *(-(k؜;vkR0`şy:q (ɳq6'_<%_5X0{;16.bݝ桎,i$m'Oypv2&9҅2'l`uSg,lKӻATҁ/eւ8<>>AL0؊Jr!w7U1SFMVJ6Uؿ ˖%JaM^EhI I ܬ ʶf-dX1? q IDAT3Hk.Y> ش)nJ""" u+;_PPWST)Lt0hѼEq)R ` {yJ_ H Z81 %J0oAAi} % Wtiׯ]nPq'rނckmS8+_xy!iR诧@I]??'{z>&rp`&`ٷ}`RUW6 18{Gc}z\%WI,Kry pYﱟJ6v+8%?%꙲:Yq+W_>t8㉏#>M;4#X?+8>*͈u(єvw0}vN,˧KmNF9ǽ]m}NF ~˵YSbzU,v("""WA "UB2eU\FEH߉tP ߠEJ~/Z4kC>;oqm++S UaD/U;ЮH<[w Q70C2ll/&"&ϟM^etEoB2C$qY^.- x&x4X[{\ZPwJ ?kBz<N>ߓWLw6-aa={ҳmus\/q iѽrw<9ADPo=+\rm*LUS ί5!tlԀ¨]/?&dV k)41Rw8 t{'jd:C7D.M!4 iws9vV ̒^@a]٧h~o{JO\׌,/%oI8|~>iO:e1ӻN)wxG2m۾rɸ73gΰh";Ni䂠?5ٵk c˗5SN͛JA.]v׬yMBX֡`'AؖHrac-lLXm,J}`&fj2p{۲R3&&Vm >00 lg.XVd\|T LiusС#!}=%g|n (`xSj&`y^iO6\12s:L/WF+ۓ} Iz61 Y$ú^o4Ҟ"Y; 3ϲZ-:AYw`)|a˻dr']vmo^Li["ț7/{ƶm #2t:h޴͚46Y ӷo`:,h0/0}ZlLX_UI}g܏iy^OI?q.:lO1ޞe{gH u+FQdp^c`a/z-%k\\ \wW͕l#wY'tQlKjHyFo2o+}YH`9,m}L~!&vR닌iY(]/kI ,܉wa醾\)LO:-8*o77ȿ@ ɶlK ɶkڶDVS|hCu ?vRk_DمO6snʊ?L >3,~&@RJ:ά¸)Hm[0ߓql[`˶XYzdzMxtn%$։<Ҡ/Q<Ҫ珊mHe؟13u;NoI{d@&7}Ø'[jEob^4'y7L9,Z4a&xI/>H8dIl~o/xY cҕYQma^Š`lؼ[x-+.rQJ7HlĤp0 -=[}k֝4wqW0Ui]zo;E4Y'p]ڐ} y;G4qv8.u9miހFS3ٞ4oܘF{3xN[ *:6'QI'YkMz| a-ӎ ;=+5fojb; [>MỦ:[@p||rf7g:שMd@D7Vҏڠ Z=u`%1},CzvZ~=!l\8px+a8 RpH 4"=~?Lu@įع\1_*vЍAHˁic^6nRZ^Ѝ֭[,;x:ɮ< jڇvŜ"""r )p!"ًj}ⷳzKaH&T! ]޼qgD- lYF[Y9}Q<\^Q4I`ӣ ]}[$g@^nkހRGqe:+p; .Պ,V$98 a:LPZ2ÈgʍjӏȊ Ii_'`Z3 n!qbumKl8gc['Xv*oGEa``pѕ3D}:RbGi!AԉI͂A8 Q_o¢#Wg;r]ӯ^)IХ02|횰n.Kc c|a:*eќĸlg~be`(R>=*qhnj|C6kNd\\Ý.u ,Y4nkut uəM."""?CDL?a?8Ɯa)lH2t䍿SA68A/ҿ4IP|1Yb ¡3SfN  I'K:y y-w'jpW@C=|6|U-ǞHR8uEE0S/)Hmi~ԉYɦw$imTL,:E߰dwU:R5jYW՚\{';cQZ(` _Ԇ3g9cyI)S0ktN)r7zzf"TNX`tWrrhOHthV䥈O:(j>Ŧ#x<9u\ȿ%iwOj avNTŎX&D~>=rm!""r)p!"NZ"/?: 8"1m,=% {*a@~nLkl_;7`O!)zLi+H4MZN74pM>3.!B.*L ش)R:5""P>~s o#0e%lEXY'aRqe9g;pɜGmr4)8qk9sn(ߒĵI¾nHK'(\#CFWdj ,ѯH֠K{|eY{GAy͋$A9m*>Š1Ù"gZ ܃NCypok(;/"ҥEYvg{ESRYDD$K\׌,/%oIaf>?M'@O]|_;o?|ȣ}KpmN@d\}~ɠk~YkL$*e4mˍe>?r[)C5Rm,J{ja`lJx0׳?L'+S{Dix%%;5ߓ- +e#6DZ-,lkXSXVd\|T LiusС`sؖ;8.o ]T?4^On2p2<0L[00sߧ'5O{|$dGE8(??> py7}Rn޴ tQM+OI徊 .Ny?`wjEYwx{ Rf1?G`hMF¾tx8:%? ꇿpJgե$vӕUS|_;KPTGx9rsHk#or`,g볰:bl}M֟p]8D`a6}'>iӽ&DM^;SgԃT,XjѲbUIFy0Hݬ\G;cO4>NJ 38{Y6-~7_sL~NΏadWV` M^ʨ7{b/xYxX 8!>yc]͠~""""""P&:viC/sG޸g7.Bhר 3Zmg^FAY!8RJN Άŋc gPr5=#eb z:Rmon-Ù2a>qGH U|פUᕬV]N5Q[ui8S sc)犈ȿMCEnr32mb~a_Qn{ 'I} c]eən?Y,v;0'p6&ygH/Y2w/N(][ǚ HILo L4gCBɗ# !r.cI:0{,;<; L9ÉH.٥qa\* ZaksՎyP3/FYMb͸YWN ] CWFN_ޜS^}Efӿn,FG$\I@'N8G<҈'VNcfa%OHDDDDDDI*"\gcI(Y|a,Xxf27N:3+F`FA g _. 3%n%4w26\yؾ$ORdL0K7fvV6nz{jnNX,b=I`: hO &b$`cX6қP;{19㥏I$|r(g'fyۅfҼ*O)u&dh0>r 5^๕Ty[fы 8+ne.L$0-iP<Qύx I&EQ([_DDDDDzwhRg y_Rz}6O'I,&vz)Nh\m۷P6W:c[X Vaض§ؘܶWJضV{û mgbcm mY`8|p{Ҷ=?}$|~x1 s~ﳯǻ~/t5kq{͚!6Hu(h$EE8,0zo>0]@_uJv{.<'m{R&mgMܼt01~ pd6L|üڶq.Lmz8oy*Q"yBԂ5ط>OͼO/II0?㉈ȿI 9Sx !V4N)"""""";.:J啞>=CYDDDDDDƠ\ lK ɶlK ɶlK ɶl!V"0Eݡ"""""r#Po0d- lK ɶlK ɶ49?>[l!&&ƿ111+ IDAT8p Ľޫ'DDbb"Gfܸq;w۶ֺxu1~xLSDDDDDDn \H[n[_|lfҤIoߞN: H_[KJLL[n]),ˢw,Z{lG RGfݺuX_%$$гgO/DDDDDDn*"Y&::q]pP~} *tщ67oÇOW^|te͛9VZE/lիsɴFBBw}73gԜ""""""7( ,u rԯ_u^2hqݻ7/X""""""rSBLLL%\JFAMHHG ^܀.ld!0*pQNS'TBDDDDDƢ\W+ƴi/Jr6õ>HŊɑ#_^00 ;2c SK,cȿO Ν;`߿d\..+2̿iҩS'LBDDDDDƠ-OM6L<ky r `Ĉ8q?ܿXDDDDDDn*"W_ hвeKa\\9r駟gQF S!"""""ي۶1#V\d,&ݼRiһwo6oL\\ .3fPpCDDDDD"r]0 }^""""""rcW"""""""m)p!"""""""ٖ"""""""m)p!"""""""ٖ"""""""m)p!"""""""ٖ"""""""m)p!"""""""ٖ"""""""m)p!"""""""ٖ"""""""m)p!"""""""ٖ"""""""m)p!"""""""ٖeHHHmk&..?@,N(p!Y[nbӦM={?o/TT 0剈!rtЁÇˋe˖ 0"E\Q@ٳݻ Plteqqq\iӦaYV;^qDDDDDD$PBLi۶-/N bΝx\y=p!%e\.W`\.nq1 p6 JK.Νݽ.ȕ5j\Cb̘1x<Ͷm3&,4UF22ȕŋ;Լyp9RS/e~жmtwDo9 pB>}:fYm2d׸0MSC 9pyVf͐me 4dժUp @~Z /.g}V< \!.S'.aht 76_p]wO!C\548oie˖;h"-[L{`oq\QFt]w)<<p!b˧xŅ\0 #k\y.pA..ָEp8p, X.c\"Ep8p, X.c\"EpqkVzZfVnkUYO؁5][)\܁\ºfk==:Z VRr鸶W'jǡtEֽVۯR!>3kh'5z:}!jaʐZz ;I];ڜPhm9)}I%_Sd֑呟N*DuiPJ.#M_ ה2T~'OwSNtk:yGŭT&5N"*#E[>[ 2$VC=8id+M)n4Q')P|lu" Ii{4:a46*%n^9Y~;tWa]V.qq93 oѝ~6-j/IM^e˗h3TٲudH=8U˿^k2l[OhےVl6G7f.ѲUN5z|.= eXN}t>} Y˖d[)Z9e w@Լ55sw sm˩]iMynт9]m"K^yDxBkX.us~CRj2-[ϟF {V<-[iA? N[eۨ?0]kXHrDpQ\\]N?4h/~W7GdpoUo%*zV)EEPQq!d0ZWO"܊MV0Ӥ/wx1չ"ܭK%[{kb땸Xf`(t_"W:MT7G2Ld\.\!4eȐr2eU=m7s˖ug|ME$SEok67V>wb:g-[hTT,JW|Ϝ)PZf1+j*ЌPts.\-m$~?N]y򉓲%TŔ5۴5\ܺ&Uxm[Rwkl #]хULK:r}=VytdNZu>j ukP̹ eN^++)b•Wld8}H"2(Er)yleȔ%Z#d<0 ɐ2.ZDjw۫+c I2LL#-sزa70J6ӽ[U>q]ޏ괤pIh~ W,,uJŋR뙛#df݂!ePnuxT?-'3=%]!+1U2IIOjH|nZTz3>c ]]闄_t WDkɧղԙQ# 'ZeW}?nQfφ$OgLIa>-F?teC6nm cD8my22d3O$۶d[v Cإou̅/1–!3Rd2\r)cLۖeL?1lf+3ܒd88^mYVFF3w枕I#Oа fk迏V\G#ĿeQn;{WVT/=_ja|3'@4!YG/Wޝ<6TRzt:`d+cwogּ+~ټ|ۼrZÈˈa ,`t4 S3r}:f۶~mG111>NFpl͞=[)))~0-[LkvdhqF~JMMͪhzG}3.PZƪN:r\~uS6lK}w":rH`Iсr -YDk֬ў={$Ie˖Uݺuռys(P u.+a 'Oo7|SmY#".T{1oUƍUV- :Tx<,++,KGUfM]`$͛&M+I-Ү]Լys%$$66lؠzHǎǏsڰaC}qɓԩ;$IXz_~E۷oǏcǎڰa , 1o_~%hD*U|rmܸQ3f7jʕV__IڵkFi&.'N7 T+VArr\Y[ݺu /|M?~< \oY~zݻk~#+,Y#G{)***kU Pdd}\.#Gh~8yk\mذAM4QJJ$iZh4h 0f͚ bŊSNW:uTR%mٲůfs=2 }y;vRRRdY,ҩSGe{ 8BY qa!\}8oP5_a9WP U]8o]vUxxx־VnݲefyzHv~9u}@8ouQbbƎ+ǣ]~YAzvءu֩nݺg ֭[۷<2ւ+ΛaUN}РYf*T>Um[={ʕ+U={ ,f͚43 "[ Ði2M3(4(P4xmٲE 6 u֩aÆڴiSPc=B v}@Lj \T}դIk׮mԨQ#UT)!o.Z\}ׯ_P\*PMƍĉYu۶xemٲ`>}zh ?_㢫Y&NsԄ TV-ajժ,Yk69[W]u/^6mZaS6nܨp],XP ЦMT^=ֵ+k\1 C kɒ%Zf#I*[֭͛PB d/b zGn… m۶{gFv!P \I٪UV`IVҦMaLӔi,شiV\tqlnZɓ'jiiijԨbccUH 4\HҊ+Wϗ/Zn{Fpl.]Zz믿.˲ꩩJLL<#-$gϞ!<"8!CvAm;z TfM :? )gYf /5jh֬Y l8ΩTRZd마fʗ/|I%&&lٲy6x+k\ G (^xA}ٳ~z9r$#*THkVVTL\.<9fbbbԣGIt ֳF TxEp8p, X.c\"Ep8p, X8.c\"Ep8p, X.c\u4qNsVtWu|\܁\<ڷC˫רP>ŠRlp%;(,\*[3VKD*̝_5OGz]5*|&NoY٫vYP*^dZ1)uړk+¦<( IDAT_ ),FoW[-dKfz*VDjRҞߓB;IX> WP^V#w#i`:3?a6"4ttq;CRZ<~>[y\r%釴:3TkVAg匬JzA NI+j{ME_ƼW\>~G]>xQ7?RIRўT,ɄY#ܦ^Lp\ !4W\UZ?}\U O;07Ӵlx<kX9jjs5^>ݿiHF%? FkE7zP}ҫjmBxo:o}jSTŋRa3:2]I y=1UYW;vadn<8v|y_}Ue5zu=,Za;㟫RJ,P@WݪVwV/A[:=&CǫPdUmD0;u|{Go/{cmJU4W-n|0J#;7$<_{8k\"Ep8p, X.c\"Ep8p, X.c\"Ep8;֭[zjm߾];vPDDʖ-/_^M6U"E[9%K~={(55U*TPŊU~}UZ50@Ep\۷ozY%Im[dFϰ0*>>^mڴUW]uػwfΜyiŊJKK˺ҥK%e\7..NJ.u@Dp\ٷo6m~!+ $(11Q_~yuQSʕ}ގ;kO? +|˷;vhɒ%*[O/@^ȕ޽{gZb۶,ҩS4i$ժUK۷׺u !6lؠ;f͚0aRSSeYVٶ~I{}9uV!e۶<f͚X=#JJJjONNV^3f(===aE ۶5w\mٲ% 0U97߄ Zl.]x2 C7oڵkCv 0Ə >\ahРAڿYhǫnݺ^ Prrrֹ|϶m}7VZ9cǎUV>}\.WVAٳRRR4sL{!C˲~uݯ-ܢ=z]vʟ?`ձcG͜9:{&"ȱ;w?L3Qdd~%&&j̙9^WŊ5c -[L>`BxHΝ%=O@ ,D%?av+..N~{=+V,[hoղeKsu/w\ ΫE P|ԬY3]uU !j5kL߹grlٲAMf۶mjڴ6o|QӦMulP ;.c˗ ֮]{Bx#I&M稿mڳg7n+V6^n馠{ȱƍͼytIZ (..NA$5mT͚5 0>|XZ`AcRRR4w\>n[M4 y^@@p+Z6l3{:zh`$={̙gy& tqkNӦM:<ްaC-Zԧ ~J"...h| W2FZtEM2 Co [o%]NRn_mߗeY~{-ȕ{Gaaa~իWk…~ի -n>c=#~SOLT5a!--M:uҪU .իnݚ8 UW];mkJKKmۆӧ94MuQӧOWuqmV۷o$kA0~]}\ Ŷm4i$ojժ„͜9SqqqA2 C-ZМ9sجdhBvĉ^jzꩳ^7d\TZlrEvBvkʔ)jҤI0ԨQ#M2%䴑={Czgֶhٲ*Uh `F7$''kAa;v9GZ7n\bӦM:p@~yOΟ"uQn݂AƌN:\bٳz衵ko>Anݺnݺe@Epϫxe??ϐ# 6lؠ&Mhر?~7n2_߿PPhѢzB^ 7eC%4lذlÄMjȐ!~<5vXȲ,YT;6dpa f͚eL 6LJʶ~rrem!)hQj^g;t{Mg4hPaҥK5lذl~aen=نÆ ҥKCȐA)))) .p }e$ض_~Y~a>ӢECŋՠAŇ~^zI')KRRmP{B/>ƍ5nܸseO>*\:vJ ~YBӧwg -ƍy#.p^^z%բUZ5$y<uM_|E :i -,Xnݺ -U"E,+W]ȵ;vhΜ9A!5}t+Wί.Iiii|㲳b uI)))MѴi /-9k,ܹӯț.kZJ*[n4|+V,hʼn'3X`t&)RD_|n&uU+Wkm[9w^M6-(>|xB*V3f(**ʯ$C6mZվ}{8q"ITR%Io">|x@/iԩڽ{w`\ Wf͚SN֭;kwɓ'+<<ܯ$:uJ]t|^|GzCNqݚ2enVw}֭W;}fϞt~@Bp\;wnPн{w\.ajѢƍ2HOOc=Ax<:tzr裏ԢE5-LT=̝;7hd ouȱÇ뫯 .նm۠0A/:v쨂 SNAS?oٸq ŋΐ2|駺C^Gڷo~ZYZVb|zO@A@ wżyBeiѢEZpa"::Zs 9W4]dҥA#DyGO@~!(\["0ŋ|UmA畤2ehźy )! .c{ ,FAaA(ajժJLLT͚5TVM9>^B3 @ٳ'hB`Pp6G˗/~vޭe˖MMɭP ;.c%8p Ķm͟?_uQݕ|0СCٳj׮M&.yrB %M81Whʔ)jܸڶmm۶(ckN5ҤIt.2‘ &K 9\9VbE>̞=[wtbŊ4Mm޼Y~ΝʲlEjĈ2 C RRR_mx}ի'MiN:6m6lؠΝ;+,,,9]wuze@^Sr%&&Fjٲ9G2n~zWc7NUV:뱆arJ*裏sNkjҤIB-Zhٲe*WYp>ָ@>Ӗ-[fm߾];vPDDʖ-tMjڴ-*0ka2 C\s{1[֒%K??О={ *bŊ[TZ9y΋RUZ5INHa >+:d]b_Ep W\zp\"Ep8p, X.c\"Ep8p, X.c\"EpgD=W[GR/,Jѯ7)L;DKn.çonٲ<(tp" -oTT\\BfH+hI8 b}Tt31qMյT͟R?pVjqqZ?֯OPŖjZ6Lln^JTW2$VMyE[Rʪ~[򹵴ZMV]4_k&<6+jW4~:p*J74ϴ$q )yֱUgjL%.\ëo'Ӷ$[ԟiĴjz8bRNNߛ |Due[S8F_,]O(Ei֟uRF;5ҫ K՜r:*?aUiljgzoR,IGN֪֔_j'tzs!ykFp i+zuUZMҽvMX$5 +_xL_mKrCm:߮ N{t* ;j|M.KV**,\%+q1Yi[tYnIՊ;wnJVIدuVuڷ˖tK%\s=z w+"v5jiI_HLAFk[Uw] k''4[tʎQT@Jwlv]Q:*R$~?VMl+=Mrl,K"T<CǴ|` }>btTNf&f*/SanSg"@ΘT,:R7v~_SWOa.ٻ;Yвi.ZDjmRYCƹ=*Rea2 >yTOgb*V9"+ܐ .C2? mxn-)RZ5Չ9e\2ӏ귝3\\@vS_靅8?)VYc]y̒i'imZ*oď>ц2\{cv#s9Z֨5jv: _o=ZFˇܧߢzw<ݪ{KCf}rVw瓖lP/[yumm&G+CFwjdXz, y\N_vQ>}7oxblHr4}>͔|?{ݒyq{v.ڰqnk+ûPe]0ʜaۖl|o-ǖ3C%m]#=l+cOI2 -۲0Lɶ$ӕ55$)02c~w-,^șVT/=_ja|1}&$kVʻ|? y$m|=l}ϾY Ӛָtɻe(a?(>jWFP䒌gf{7Lp""Ep8p, X.c\"Ep8p, X.c ŶvZM6M{ l$)SF:tPzdF`3 BpKԩSSUT))[*TЧ~B 6d*V+Wo߾*SL`sRJʕ+Ure{9q W^+ @F\"Ep8s₰,K'O֒%K؜0 /_^{V%IԘ1csNٶRttu:u\1bF!0 ͙3G+WTdd_[ZZ.mڴ)ǡqI&)11Q7|3\&* b̘1JOOm,Җ-[_+Vw}'˲;fYRSS5vؠs w IDAT. \G ,mۚ9sfP "9< ,aÆ\r`9GԵkWe5.pQnZij֬YA!ÃB|i…=zy-Y^s. \4|^(g0(QBCqh!e˻.h\.\.y ,&k\#Ep̓>HEDD-y6^"""BnUTҥKsx' obqN\4'tNWtȑl^{mۦfep5kرcنd۶;y|TIBQ7p}EEkRZ~WKԵ.~j7_vovZh-"*B#sɹ$d}s>ϽwΠ_=mq5jhȑnHÇwCrEJR<1@Ayq= Gַc*Xc}[jw]r%s=36~yqGjΜ9zT__鍊5jƎx<N}ٚ? FҸqw"m6:ݔW'%bƍqƹ>h\ Py]E,*,ZHӟc.Z" : i֬Y:묳pAJ&-(\4.O,DXWrßЅ4Ǐץ^%K/Tp BNJ"xgyn&q7(`4.V>}G՞{٥b}#藿 qb8 vi-~AX,_t?qh\ _Бh\ZW] Ph\E,`Ѹ(X4.@q  Ph\E,`Ѹ(X4.@q  DJ,z\MRϬL(t(ufީ^ےۤ]w8c9<Ԫgб>9 qQ]'fJAo>YGJ|D{گcdnT"Er<:[|}®iL}k4HыuI! IL(iND:4(h\wL "⭐+Zfz Av:pVSxćcN@~?h֚<5YqN׵G;wt+ךd()O&\VO-_N:M8t5occMGu - &L^{_ĊWǜ>:KkT^.ɓ#&M{ M_?^MNDZ1sPB{:G['j 7LG/DFߚ|9皽sʱjU'_g;Y%SOQ~i Xc|S%$%U*gSom kk5r}TQ:5?^vڜPIćz{?;N՟_U_P$>oZu}CgKO\^^D(ϫ_ҳݭ?{u衫o;c[zjq"Uq;^PR׿wJO<^wZK#T9Ki蹟݊dIR|/_Ƨ`J7XMbC]QޞEwjf&٠y/Pru°N9tՊҹayv:+ڧOGe}>/}.R3RiOPvMEQĤ^~Շ@PUsW|O&\lexuuHZ޳@T-HG]{D?ZA+4;ӷF#wTQHt s|!;PNt`?K5= [:~zizišСo׏ )q N=(8jg3dKP@6#&7ģ3U*3R?*TV>XѠ0 [59=UR^iuJ@4.gλ^_qOJhʝwkSK{8V+~A !7e[c/G=}t4__Ö]uю}O=LGuWS+uȚc'i4Ջڶ`/]r|cN4IGsV6E{g"g Y]7>T]pj#t?uҖ죳.Sr9"@zi._]T=w7?^`= h\ k_E,`Ѹ(X4.@q  Ph\E,`Ѹ(X4.@q  Ph\E,`ѸЩxmo4.tX4aYݠ" @G:e"b&;v.5AQö70Nu戸~0N RxSn yF@;sD\go\E,`Ѹ(X4.@q V$I_0_5jT__AU9RFR,0ڵk~% 7NտT M#h\=U_W[%%%n^~8ONwrͬ]V7תBA&:^2 $INğ~YUѣwiJJ5zhլqS-߰AJKiZX,RO5/~/URR JJJN"ut k< @q  Ph\E,`ѸpB-\ @qn&f]-V^hBPT%oԹ tsEn$)HZ|ͪw3R|ycjAgJ+_m?Wj4oДȣwv]~ŒWa52Ws5tU4.Ml3) Ĝt[KNK A-[=ZR˗iCP֧uZRVVh\ȫ@XjKqS/z@O\28ejP[uϯZUS.JIO\x}cO\_]p~rz=?ᚄ .\ߘ4TŒM㑗`}\v>V߼b>XRB˦?^W՘uꙛS^VŃRi*f޳:XKZNA{+yTt4:ըaEbQ˗oTHUZZVa*E;o_"%r }Vy_-߬wUт*{FRFM}V&1XE 7muzm7iǓZ9gKG)Tp>\Z*VT;$ ml-\njRuMku>2Ч>՚vQ_WE̋|Vtm>î]xHsѸ !o$_9gk,׈#ƲH_sfyen.L{QZ|ݯiG զEݪCGzE-;Lm.S 3n׹'dd/ya]yzxCpL6z.J?';&5~??G×?O j}]woyc%IɕM#jk5ݥ*%5W菺}u].]Fy%äj&tG2Yʇ QZU?Hp2-սpϞw~x2y]{vIJj͂OARק7),'_UR^RkUך`}1[-$m/s n7wl{M^ gjOoWRy-V;uWLZQ1h^OrܾPVy<}VkϧNjE//WuI:h+OkFMB?WVcqU?EGU?ܬAqU4))w-X7_uEgQzZ"lJ5mLdڻH iCvkI?ҩC4WԺU?ppr-]_F T@ְAҪȴLõ2i@emZF a*w>5Z6)%֪f]_UVJTJBkVԨh/.)>5 aE " F7Ъca/ +IYmY*P%\J1Bf1>fJ^5iPjl` ^ЪT7lD]\c6mL/P|^{F.:XFiPոA"Xvj%bf-qT$U6%zjn\(.k %)Onv,X2b׀:3p4xH_}lTѲ@IJnU]b0Ҽ@Nd@FkʵqUBFҠʵJjR [j.lP]}^z7ł*I^[$Trf,5AU4HK oߦxŽJ?GJ*ҴXh\Aq>J *uPeLT2z/ʳNzvܿ 4p`V,\*|j T,VzkdzЯP9+y @u[H Tߐj *)}߈75x _!b;v_5- nD/Zz:HU'k>ڄdV@K65.Vw2]?ÎոI'џoTR +=:1*R70maj5H Vk܏.C5f ig//-I-cc^dԝ5l>hbCTZ-kHi>^BPu`WeE՟,S] Ǥ*+Z,˰-ҀA[ojzPOlf\Cհdkl4%qFy%^I}} @%NmὺĩZӈwT}c:m{iΓ[w6}d&^?[_<& Te];UWɠ=uշ]K$Ie{.zPx\I^yȅ*T]Kug$h7^Ncj{kxn ۤm75~n=pfΘTԧ\2V~|`|V`LU }LWd^ EoyoT~U;h%j|E*YcGׇェ RDnA?mJ|a OW3q{lǬy57[LR5/Jm$]s}7]yW*K3~[ }{{y ^ntӧOĉpZ .=GB?x.]uzPSͿl>E*s{kg!Zrv> >k.VRCjKHw<7H yšRwJͰn6LsX#FMRli\m= G hy4ǟ=W^͍ϴ!TP;]u.7]_%Ƽ5R3WZѸГww>38:PanhWE@q  Ph\EUWW UT\[ I7L&0/UWWЁ4*_Z_Z 6(I ɤ6nؠ?K * .[ߞɓDeefȶnrIڵkH$,:[<Wҭ (//W*_"qM***TQQᦀArv@o\E,^@J{~Ѹ(X4.@q  Ph\E,`Ѹ(X4.@ꉍ(d=z]c?\@u;6.@ݚ tQݶdR`[Yni-kA}tCTKwdRWͪ׻ibUԨ9)*Y IDATIY'wƅH .y˵tSRGzueJ稭O譅tmt3W}]{oiz͟/F[^CwH'mΊg`л8}v֜nU5=z'XF N]vuuWj\v 6'Ի8EEڜWlURRAJJJ|guvW|~(R~@g֬uvQO\uV7_ɻBm\E.7;::Kk\]F!5.z=>: Il뢴*Eke{CeͶB㢵71 SM 5ӺWʮ&Jk˛WE̛E3 1Q7ģa'zJO==M /$5RSNqz~v&\9L~IӢdͫz)w0 S;ᆱo^|>` X*Mx~}5,4G_Ё'P3ZQq)}tF"כޗ}?=7\xHunp2z^ǿܯYR=>kwnzOZxuG[P@6M[twkͷjb Hzjڴf9Moh?JK?5nc\-Sޕk}ut"o0\n|xQq=T}5Jߢpsu:u;j@i_8e99~>wVakƨuƩiO_|jғӞjo)T?+#+^{zB{r; Mb}#tStlI-~ϕQG6.rycoD|qw.cz-[tw߾(Ԣ3~A\>`-9kWʋWYa,$I /И1Jw_v뭺{kѼ3f}fis Gh#N^sBu^s{ۯ/vP.p˔^r_t5Wpz/Ko3S?fFOn9S+]õwb럵fQP:sݜ{#_yԑ'X,͗SW|}X5H߼zﺷFbuz-+Z=\Ը(v;λji]X)'G{L&X;c7/n=C2euc+z2}ۤΓHF=E~ hk&M>ĤdЬkzorJƞ'=UU-Nh` xݽ$Z'}m]Ϻo6ۜwe[jt7VjA{;M>dvoh`Uu >^Nos3?Ն/ќnOKG{[dM]rFr}zǻ.'Ox,?yPdo}u-o[{ɑP^zRl{NsuqU?ͷ!aۨGo˻s 7b8Y}{GO$kr<-BqӋxToSP ?՜qS>Qu9|xԇ ;츓4tvi͞$IP.;/V} u:j~ōT}_=_?gn v tM7j‹}ƌEAӜ9si{nTKr9{VǴñ5W’tj_Q?<4RCBI4;VV5h[GkX_ZJw_?NnHl;tJ[s#7wcFTܕm]"ોq30s;ΣwqIV̌-vͭq72LYۚt@n3^{a6Fao,5vL>]'Nt^aɧSOO8rGM9$Y|B0 |cwR1lrRh wߛLw-SLjЙul҉ٹL1Þ94ո&}n,Q"w]kyMG\rlpo}ݱ[ۛ{,,Z]cSpݸjܘ;7|7wC5=>c&o$Rc T츯ƌ;qw.cljE&y6ݛ +]=ƝKXE&o{38Ӗl;?)uo383y*ƅE\1 ;vY6l膁noݺoKj0T[P˻bչatzlky] J@${dݜ}pRaLs2hp-ZvR7 tKoТ?!C@^*k{xz4Ҩmh̏WhTyVֿT ,ȑTRҪ4ZN ,P~n*&z]䨽=͝wj\nRswl39F9fd!CٲJ&mO xLՃhn /^W׋s?Ն-\ktypS- .[YɋVRRe6Zlwn{W뎳j\RSq]c6;gU7y!C5t7 tkWU /sUڿTeenrA -TeY|N:sxiƅyxBȰ&Pܸ+"v>g, @(/wSȣ T^^rsWcqXعLk㨽γњcro<ƶ03{ZBPl6k_wlj옽w3 ƺc>L3v2{-qMܜ=7c/VڳqMyEݱ[T͹' JQ]7nst{w)jٸpezþcݛn 7֘=Bd֯r]/u|v?~06 x{]sxw3uf.'+8r2{ [㚿w>S,yM[ KWID7_PjZ&y5Sjlf/_Gq/nͶߴ=w@a ȿua[Ǚd\vSuo\j] wGL L,s&RcY{ Y˺O[(mQZ'S]w¼L P47=ގƄOJ&nq,}..wG-݅/f7xk#!dcI5ńd&Jj0橊DںT=Gs>;gn72m3qsflm-Sݟj6s;;K74Ʌ%%?EjRX*_iZsƇi:  57c;7Vf}hהn\j7I5L̞M3e5-/n_~=Q9}]{6.BQq×woqo~Ιwc 56LwL!_Sj3w85>]ݘoy(:'ۼooov̌fO0&xT:vξ3sf٢Q6kE.4 i{˅4{_̬ ffMt6Sg6yayL=ۯ#j3urhs|9qfl6kjl$S5&g.PfBRM\\#ٯ+k&XۯG{7fO< w Qc{noi`7ܹ (-Lպ 5"f=vǸyQ #Tveξ&>TfnLV<&B:15WFq"b6w1XN:}cDZDEY+FbRS3ۀcS&f>=Ι=v&lQ7m&f/ޛٛ\27qSr' גTM ;ۻc_Bdp6_fu{Yǘu]n&ͅP-cv}2ռafZMibpԪsg۸\]ڛ˭318jSk0P259oB͛RF99ݨ]mnލ|q_ 2{=hbR˵&g3mvfOZq52cB+65Lޭ3챙1==_6ǵIۼYwo<fl?=Lini&HMJ'%q2b6 +-}kFYc{qc&Cn*EM abJCkl9/i:qi1mnJ nٵ7{s|27M T'Sy3"ZSjv;vQc^ ;vQkK pׄ܌CE?e˻OJ(3&oͽvͭywl杢r_@7>ֽQ`T̰QaTcj 0J5umQ*f6%sfnr@OC`f319Qa3M n{~z7fDųњcZi7m&Af@M # 36OQ dSc}~a9LLkcܹ+Sܬlv͛mv3Žs_K͛&oƾ뚹=m&͹s#*Wոpj61s3vcJTXj޼|TcRst9ÜIgXy5rte:P w؎c}٠TnB5f KO`صfs{/:q*Eo}!n6؜g v]6LN؜l,fݽwEi1|kL[kL{3f]gn4Aܸ9k2m67ɥ6/:qB5Jɛ)a7/즀rm`cfW;&j%:l.:{kGwoH0 }bΙWjﻞ}j|1߼q*ŰZޔc4ݔkL\V,s9έ3yc2}1[xz w5#b|Sj7n:7ne}ssX:֧E&j_~Q 5kC5oya ')k:Sk}߹uirqfl}cw\j+eݹ;حj߮Yc{˶1;V؜'*rloݸ0B_Hy377=־i4Vn2tƆ#q룾bsx}|TtT0Zt1a֛fJݜ^iajnnޝ2Ey2Wݘ717nW8fnǣ6pkMjy^67]dZHywn yߢލP kF]+'cCƍ9;fݽ;ɥ6x¼rL17?8, ۯۮ11O7R˘;]s)ܸ7c{&f?ĩ4܎˻sz5ܘaݜ}Hkh\"TEoTMkl 56xؐy i |w߇3칛31w&\j+fn}5v[ko&BրshǸsWc4PݸjwsbR`~œwcGikw}5oްnc:_~͹s; Ι/ݸ|.ʹ7Lޮss&o7 쯉9֍wcfL9{Lt9W.Йܵ]:j\T[ܼE _w᫳e&_ LIZۋ~7 Þc;M<] wۢrx܍K-sQcLqwݽG]rR|Fą&"ܼyy1&oq.fݧ3d؎9sǾXtt9ҭy3]5q7؎e1wݽƣ& tKE=Qsf.n,ܕ)U4Z6|{7ZsIDAT3|c{mΎy{˧$ tK3| z_̝{_wwKw]×sy&@w٭-y.͹nm΍y7nݹƭIW.|/r3/|. ty7ݼݻc/rQZs t,bA 7Z㨸՘ϔFc wjk>k^fs\k|cnb56옛t{7o| Ey| {wl woVݛo/5sF q3ڛGոױcvW#n):.I-]uPT.*.5_̞G}1won5ͻL札ɶ ֹ{Î޻c#*ֺ\Xڲ8wu˻{ÎƷ{};WMc9Zn2;Ξy_M͗E>!s%ss;71wm[ΣdSMMc9[[k5R:5鎱ܱo=Qk1Q NJ,pݸwݱM;ﺬ7sgS#jun2wbRt\J4I⾘o b6|9_չcQ)N[BԖrcQq#Y5EDmQ5z_':)ڜb6R+O7ws͍:$zu@wҚEtǸ΍&Cؕ.<\sIG-rNu[ܖQ.gܘ;7w\njl nrgm}uQ\\67W2壴8.Zt/ܚ\67X[,c>,3SnLd¢thLfkǹE:IENDB`kraft-1.2.2/manual/images/nl/units.png000066400000000000000000002501631467704360200176460ustar00rootroot00000000000000PNG  IHDR.zA pHYs+ IDATx^wxn tҋUl`GE 6@PPQQAP •^4EB JINNlny99Svffv """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""0E7VL+ǐatcDDDDDDD†Ly (Ӆc-i?֞/bќs}""""""b ŽDOUmb[Ujw4$ܕ*k;DDDDDDtlBem'*k2t]d#%h"Uhz#:%H'bq(6HSU!a>Fj=kCDDDDDTQxWDj{ZOTr2[}6*,U$Y6XFEXM+_Y֟Px'ZE*au=VE[e"֒OEU`Q;;6qȺ*lDJ[Ȳ@ 7Fe,UP`?XYOEXH݇p[>DDDDDDtt W__]GEDU'l?edwsQh"[SSpg$9mlL(c(BIC+8-x0Y6e*PxiP⺘cɂGDDDDDDlo>n.$B_aU$Pttt1_*G_Oэ 68 uPWHe'ʡn/~5}LQۀ>8"p;OWcj[G7Fm@ $eBL~CV$ƫ@muL@8"""""" Nwu|muL6ad8Tt|mj[G7FwrDDDDDDGp@u1:&ԶL HLJ`8Aj[&t}jLm Nq""""""NIWۀ>&}8}2/v v\آ,Pk}2qN25j;P-CDDDDDt4 'uu|mP47.P;PƇ26$NrCYcu㜊 yy~ߟ,KDDDDD*,Z֩).8eNceNctu1` I4`8X-Ӳt&RڂS)Wڂ41rNb^ P>[֩Och&;qb:/qX2FCSu^pWǪmH!"""""p8q_[߲*Xu^vq!f̺TPxC9Me֩[u19#"""""Rj>]\]LxuSLЍSum' fLȢp 8Om릂. q꼮p!""""":T8qmu*նn SN"=.(H|Yg0ct:(ߧ.J[ĂHCuUH$NH\7/4l%L[7qjI0h$31 :Nꖕ1:Dn NX,KDDDDDTU$iVuJq_ 1׍թL]V:H'/1mT\~!x]L :V%N}Nq@)Dn;Mu1ݺlNżW\y'&$]-S]LL)cu:֭zbE8e?J"+Sہ:hjҬWۀh }4(_'SA? I\/ j\-jASq51y^ V'""""":ZJ@m@ЫS5+.~H[Fo^ Ӽ~}!Th= ~0!y0C^ p.zbN#""""":K]8 89&bGIԸsTPNN*P@y-OyqJ !ҧ_c6tSS_6&Nm5S.&? hW䩠;ͫ\;-&j@~Pj jC.Vx2D\jCW:BKDDDDDTBI &!WǨmA|KԇsEc1"fHczr;eO,+*?Ʌi=Nq)ͫ1@_P rBSׯ{ /}*~h?Qu(Y_ո y+.tmQԧ-/Q/yASc꼎SS[>i=p֣%r\<]qjAAW0npﴌZ=񮖶m𽸎*6UcDDDDtlb!=^C}7eOsvh! -D\E[uB¥[.&u)&!Њ.]HLLѧFI۾5m%""""""l 9ied<]юD_LWtDJ/ ]LP tCă)Z;zm^A~d q""""""`H9>^b תn85j|Lm*" SzDDB3-ŵ J F!\5`&x`67 = 5ň* m&qFLO(ܧދB[Bw\GmQP;O6ӂa<8Ov|u DDDDDD"_y*(Ҽ-U-q.O/ ~4B..>y^<1/ż "r\']y!ELe|\'~EpZ$m9.:Fp'T.`hyHkI0 GvڈHm`FRBLw*}{i/`;DDDDDDT B%=.(y}-8#2qԃ+ǁWTqJF-ܸ!UffPs>jE\u E=re2'|m$&Mڴ\Uh}>\Qpxi6LӒŤ`wP4ntnkeϾ ][ncC۶[^~~,_={K[nL z^wAѶUKY_u=^ i(((ybUx!hP&*ۏG~n 9n u)ޞ:=n 7>dSu;' zF, ޙV'}{B-/<wa 8c;uF9=,e ۷CBBّoN®xAh޴ nZ|+WUZxxah+$'vlCSύ<8M~NJBԧT9&ȉkxuEUe.dAݼLcՇ>Q0pՅAq]D\2Toڕ5J_&MԔr/0c,xDD14M<|8xޙ:LrfEB|{cS(,,C\3flOO^жun*L1agb;S"== /? \%/ZKz[31pw-0s֗x)xx<0~x<<@\sdK9K%4@zZ*Ƽ5dDD21jx<XjMΝ:akorB9z6^vCe6\Q㩡_~=(JNqO"ܯΣ?h8BeuWEBrr#gŪ59z<O8DDGK/Fm y~#mm[׋M[bԫ[`!, m\qgYVW- l'^/\\נ,={]`])ݮ9sy8˩ u~s_Y۶af-@Aa!vً 7iVh}B ua |=(,,eYUhPEk1jj 0Z(Vvr~9r+rbݼVbU&RW\8=)9t`-9= pkm_g~|$na W{h|EUm۰mEE7Jqqq,ZU3/3> .y|=L?;$> 8jrY_7;d{mSeYsR֬ۀマ}o2 j _ 2M3 C[LS{}}90]< rc_5h0c,5}gÓ {(ɂa%TfNhRSRož1mXU 宐G6P¨Xn}1Wu<*&|W;S44q96>h+l)SF/+./~[ZQwc߾xPXT{n](3F.ODDbx 8 ߔ`ɊUk܈P(C(ʈ(7U$yH!bbe&J}ayTPۑT.F*ꈃ(? -bTDB/a&RSZ5!hぽP ַEު(X Y&4Wtbxxm[Xz-V^^T8EkϾcޏdiT498Ψ*UTT<мTF6rPXTFBB B^ [7_-}L"-5M4/7_-׫ tv F:7[PKHǟ LСhxʜ*nŪ5x^HܼoBX!nޢҾMrE ؃СmPVyXP'y! *Vn^ 'Lo|7=Skģhw"-zF|Zawmxm,_|j3d2Ͼm`ȀK-c֮߀ǿ}rZ,c:)?]<>r= ihҸ<ع{7ޘ6,Ʀ-[_#o?>8f 0BJr2:OSRtq'`^~~JJvC& C}Z7cs͸y8x~\u+E8a;oa_S!DDH,*:¼CB6J-Sy^\M!}\m츈?9io^RB$mQuS'nT"Wļ .n9\^ Iϡm`a[陦Yr """""""gg+\[%SOmCCySS\Q&-Զ>>"z",Jq! ㉈N1Uh.S\([hOD\>q(n"S2Eyh"rW5u}Eg9ǖb2~xUfv> 1yr8"x9g\.̂:8+(( /W-b-ȢOy墮oΩrzj`$9&2".>.{W@~W /\(SN{ESA͡x].\[ǩu_~'iDHE+/2غ@DDDDDDb:]1(-Jx*b^Ɲ杈$~N_|2tD!E 9%śfт*&P^p/b> pTTvBztuhU Qr+j.2Ťf IDAT!SU" UV䪔#""""""e\VSbi*m1.}Y4PvH篭;jL7G̻PzRb_+Squn(lۉ/sVDƀҸ(O y8DDDDDDD\.F>]ⰜӺ)YN2quy݉(A'Q,3QƜ澂ږwNet'CLmCN29Uo>81uSAmC^TDp 'Hu*s:)>y^.""""""X꼠Rԩ)^i*p>QmyN՘~""""""X"W^|Wn:L;**p>A(~9Q2P6dL]LmW,\Kwph Q,zFu^q*],ZB=`IPcb>Ѓ(y!`jLPUʭL՘zթם}Ń{U{N.W4vp"jlv(IJNmXDpAэQcj[tbx鈉geMK&:*ex0e}.>Ef,^U2US\oVUߓi<) vĉ1{ldffPRaaaÆ8sѿvi0 2""""":yVli>Jk @@}2݉QOOA2e ymv^}L6 7x#F4uQ"g>^ڨ9ؽ?HSiq """"Y8snYl5 ''vb2RfF iW;d{V!Ԅp(u'8]UUY9h@p@c@ !999@bNC)**RCT0凝}>zVm;ۆa#igtt4JטE#oy \6 H3> ?,Y]G`RmNko=[9'`'cohukR ©_[]5xi3gb/lp%G3zMףgtBD%L6! qZqk Xg8Db8^8N? b]Sga+]߶Z6 3M;pKS0>JDDDD{s(@,X(\TT' q(ZɊ9k(ț~ŬKQ:x*٧Q= Go/,*"o?Xe!>CՃ[˧XV>;bex|3r5}+ { +Ջ/c-QC^>U?!H^֋h-)ygØۑ-Gvf?/Nr*ׂ'o=4_AQsೱ܇G݀vIHDDDDl~츘K`vEP~~>/_r9 o4an7ZlɏÛCǜMya4 ؖ۶aX!y!y4U+Ao_mÛ_:)tK/-~H`!_ lضۿkSF]%1t[h,a& ۆe۰m 'Pw`T Xx^/ū?’4*޾E{'^Fwº埿g7RBf۰]:#?9o|C񇈈l>8'byݻJKH ;”#F`ԩQ+d̘1;vlX˖-n˥؞bknhkMfwnߧtsha${cx &. ŁÔ_.N۶m {qy'i-7r^OƼk޽?a=3 *q m@ϓNbv#'`Q,}5|#ޜE:]pq͐f'W pz-N{|E U]n}_MRoo= Lm<52rwk0޹/[ׄyh+3}$^6<~9:#Q}^!'ƀ;{6 ݇u?}`c7y=h웪Pj#V :b=XhׯvrȦ*@L 03gQn]u + _yߩq!,<˸ Fb&XIw!xyho :l6 g{`{p x<{ HtOow> FcY3C{ ?0ř}qc.܄`aXs,mpɩpp#k#n-ףy+7 ?fL4xG}ߨÅb<l/9X|(.| .S/ DqNp޽ñMxwXݿNI(xrt.~iq=;˖C[yWU0vYYڙ䶝P,قa^l^ 9V_wK\r)H-. fɸF+DWbmD.gy^Yz;5/ngDn Q1dtԪn[98pHt;*b HȘ?)]vv6Ç]ƶmZ |ӌ9qhfھ:#aض9`> ;vKix64Uf-XS!0`~,_ؼ4 3/"ۂ%žXHvQ̔6hU~歚# rD!,-ضUrݏФn4k\{(8B"""" W$H'SI(1bv V۶1sLs=8yXj[&M=݇ǀ2aB΁-/^ovT*++K ڴi`ڴiEf Ys{CS*hѴơbu >}n~/em\u7-Py [Y8Eظl%fu""""MGݻp,U'.W #rE@BL^+ܿ qkwuFMvV;W`{CNɝ0s&'Z%6s>p"w }].3<9prpdh<` 7)s_""""9j{GGEB!ܣXFfX_~K`8ThuSHHDDDDǢ`ߕ9D\C\aj .ijJm@v?y~7z jMbb"<O؇~k}%>s\wuz1??nwdU]n l ^&\ٶF_SjP>:5ay̶҄ʎ_'ZHK"0(F s7|42q%.xJ q3 Uys^o㈈(hz?= S(R跤\vqLܣ]V`ce0#cK5 %}‰qɂW\ kQ{ނGDDDDよb DDDDDDDX """"""Eެ(X4lXW233QpAA޽{.ƍ9s 77L(RuӧO-߿})Sаm""""""6,5D~]uzxJ,ZE1dpAA1 G)RxADDDDDD-,\P0w\\x,^Q`BRvm|嗘guVԯobX^,:f """-99e 5,\P@%"""""5MDDDDDDD1 """""""Y,\Qbႈb DDDDDDDX """"""Uo~:a0.|flV˳o荗 {%G9JXcDᲰ;p;^D5BDDVDD+݄A?W )&Y>g㪺. my#|nK*_r{S?O7cO:M:#9%R(ww;!& |ȵ}x&p}72.xE u V5ѣmЋDE^#vz*Kt^h|Ss a={s5 ǟ -w?ļ6aau6+{>ƍo퇝>\zj'bX ؗ$׻sRa fmǮ:ЩA<po<[$shl\6=#joYhVY]qn0Mȉ}d }%>)MޅS0aME?}Amh4xę -?^Dq׭wb#'?_iXFT IDAT^_W1Փm=26cQ8%Mz/sƾ/A~FNGK;c/sjm/?/ħú \)F+:ppR{dT<2l N~zk/xoDY<#Ͼ^i&';L|63p_{Ŵvopդ:p2<7 cmŬsxHq3 ۞0`gJk_ t5:o .k,CJKpbvt7FK#ѻo]bG.ۆS4osixO󠉚{w31z̒c}SmPnv#ޱ 1k0txΓQA{:{*䵰}5iޞYpDvo: %i!~y>o큷Vg\]hL;o(?*&~V*s3 - ܻo} i.Ǯ܍q9..|4< }/{0 @t;^,^",׌&` 7u_:ܺ(x6+ }'^|.ڞ:vxaDs"yǘxGGw-D;'`Y|qX0s!y|oF1O|: {_=,xn*{o͟a?í`z`ƓEY̗+=v{m6<`gz&ߋ> mk)t挰sk2ɦtEK݂~~]Y4S/.\Ͽ| ׸♁k>=36Slv:gb޼1ԭ;Xf6& |5{lF>16{lXF`~Ӹm 6My7=i`Ġ3Q7SE ÒY?żYm?}ݍIף.ĺ)ObԪx٘7s˚]|;.ߣŗ?9⻟r3no |-]G9{n!j1}4E 3+n?Ou\YgB{^ /k e_#ɷcg+{88ǟ] ˾Fj)eP~~a-WglM]^9*qhxز|(L,\QLn_eugÝ~&.?k'} 7&\.\&lr9nI8-Nl_<s)n9)Q8XpG ;s^Ġ3 m 1K'\{hP wJ3\tG/[2g[ sݬ&R2]0 *>Quj+oYW///@NjtȈ+F qͿ gօY: Y_]5ኯoSEcټ`WNC|\::^u1ZmZ`yo+k-eaȱ./ KP.(Ipm sk!%9.Z5kU y%.m8wڝ};ҫ!#ޅM9gG>Yoݍ._εNn+.? {+.BˇS!=% -{G?}lpl\|F 쿂y9X 3R^'s^~&z]Tg3{\Q,'/ KmĹ!3EbNsjtnoۈZ˜RnQ2n?.~QY>~o#&1\UP!VJ"0%M!Ր" ˶s̙t+|[;Ċqkt8K AE¥x@"ܙwft%Rw;Nh5#㖇 u"^E.)`iР't=:-9s Z^F(NxOymdǰ_mSR!z8EEg?'\ hd:=v3U[P'>^-$YX X}[kq)Q U(˜ ؔ E8r&K=~Cfzc6k ?,qv0G|шUl^#.5sf\\B9O<:U*Pű_\}0B)z}|6q6_h{_>2XBG8~ó~3`EVl_}g(]Ê?ɯa>v*ҘeR.ъ78V16ET=y{Vl;FoИ.g1\,m-'0ҩL>qѳOw\}"WF46mL/ߴ0 d:nʤ|eb,k8ac:O9L~I '$dVNZW'#ntlhBqdą"o2O~Tmm:ڴūpve'yiF?:\^16uo@wGe̙,!@ؖ&T?8HVfOb#3aq5^FzNOsy \&=ݚH]a:'U!D{&Z}y)-eUYp6#o /Sǎ#S)ۥ-|0;O'B{:Z/F1̞47O] (B2vdyB"K=j;_AY3 ʺ T 77"0ͯY@&3ټ63.BRgP(~s_T( 5`ƈ |$\ b-yxi| $,QMcߴy~d _O:7o;{gw/eF"z)|oXqnouۨBni5l 7q I"NJYϰbj5>2qmNǩKyQ?S_6I*T>}BuY3\zitޓgnjn6yפ~n6ٕol&7rp2dQ-X_H^'C{pKݺC,RRxB5eb9_iv<P&ggi9 RhtyS-,\Amr֑laөz:/T&dOiP4m>a)!nn?Åa3]Д7,r7R3өkg^&uS2s_m2 L4geV>up!qڶv9!5Th}c21Lhm4-P41>мdv|:>qHۙvR6bFʶдe~Aiև[?dzמ{[g)siб9@׼gW6o86o[4V:wKV<Ȉ !D4=דBsEe8/5*kK6P_U\+S M/]ih>lv}JiNȠvu|=:άνPh%{8SC]J2 w:d6ཛྷxzzʲO'6vf>!:w|rr-HF8/ͱt.KB# !Db]G/\[h%v4_B!ȇ$p!RY|hgo]"oJ1c~jW@5qѫp6cȘ}{#B!N󘤿60Dquny5'ٵ[bLoj> )ν@WV1q9+멓-1D\LB!My~m֚|S=sU"Jf 5],??^ Z@F!B!r*18ÓM񶒠oSrO!T;x'V3i{4tJџqva 켕ayg/ 3NTT` L;NT[.|O^B@f<:YxuŏDRMtzr"[̞:+'xeJ i_sY%"йMa $`Zv2o,p**3{9S_gP 3.[lun ۼBīKVb Y\*}UNc˽7ym\:gS-( 8Lb֊8kRy~x+c 0/Hd]3љyу9t ߀X͛JrB!BkDF\%~i<&c\6A9G7[Qn^]ROB l_>ێάu1,2[/>[z*nð,ή}3w56~䨣lٝj0HjvʜOװe7Ρw_y뙗W}4m̺w9~0| GakGYv+;W͢g" ü7b BƪZSBaci1f>fVX̢xkf~ЏyoOā7bZh=[WBS1|LǺ~ߢy l.W1q$S Z˧KB!B!2!<%;FÜ^a|5; b{8crާ9w}W,*Zy&r6+2*缥4 _u B!BOnc_1n1Y݆ϞL7c>L&{?ֱTJS\8v [ZD$4׳"4liysv"o-H8%鸮7$k:FQhyO8CGO:ͯI5S۠Pbqlu8\RH⑄=MlN[RDZq9gb;MlR I}h'2ؚͯ8uJo|;4BGܜew7b9{ )Wc{qnYXɛ6y>5Kwuͯ]\\"dI&dI&2Ɉ<2ba|~/[DTn'xui U;=ͬ-]nf{/'{pa5s_4E2Lߊ0*5KTVn{kP B-)ƭ sw *B.͉?SZ g_CǦ .Eݣ Y˷UɓI}[LF|{J <8Os(L{^PHy]Sx(jקU嵩ۖ-}h&ߜԾ뢁Z2bGq7]~ͦ ~כB!B\z\zitw54]ۜgW 4k}ːE]$cQt_{Y+R*7dX[0MLJaak ,TnkFj>`y,ab)q ebΑ J)0-\4\_(#k(gs=.sRGihnu+?e[Sҝ}XVy׉ܿQ&^7@iY!ay,ebXz:(k2OӬٽgMGɭ"B!"_ھsuɱ)siб9@׼gW6o86o[4+?[L.y.YM #.މQBt$?I/?t:I 7@#It)B!B[#ۅB!B!+B!B!D% !B!BYB:CP떻?)HLbWz~ To7|V ,"+:߶&"WIB3[2wQT<0'{*:-zң$GJ-e_]L=Q6bYL4mjnҵ81iOwҼcǎS҃Vm;3zyL+\~mA^OԳDLVۈ?(asP4F`x9nٞ~S׶ !MB9f~>^Xp_|WXi3_!26vmգN6W@.("ɭ"B)?7K0 (㏏x}\ttLÜH@P$Tס߈,,+Bq'Df2o#١ &GWXS$y."ّ%(.n-m!B+ى 3z/}эq;M^͑xPj֞+NcAy!>"3~AUչ_rސV!-}K/-egy<||V6oswM6osN]66jҬq#-CuݒȺE}\땱|v ={h89,4L KCOMH[LKϱJ40q´LRhp,nbW*W[׭o>;vHvq$89 Lttsy!E:ug)siб9@׼gW6o86o[4דȽ?[L.y.YM ϸB1 MX^Be r/*MZ)4N( ;+icvIvq$*+M!DB!BgIB!B!y*"d6n֭[9qaxStiiݺ5~~~EB!Bsի1bea<,w(xW\2SLcǎ9P!B!OnWŲ,&NH_1 4S5aoуqڈ!B!9O̘1'e( _,0 &MĴiӼB!BSٶo>yvw4M^xݛ'*B!B!yƅȶǓLjըZ*4_=v;cǎ>˵mB!B3$p!ٳY&h#F0q\X?K/䑾zjΜ9C%<҅B!B/rȖ{|!CдoNJ) ❌irB!B) .x'422; H[B!BB!B, \!B!"ϒB9|9'{Qt?&SПbfŶc l>!}"9ҀZIĮxuo$~ץf훩5:bY:$3ޭxGkwr,"[E"άde<>+a% lMy}jR&OH B+Yjէ/$kxpX͂]=Yðh~~40~=9M_bn NF\gYgŊxi{'  qF߁ƍҤ%//>iNx9L^=}߫С]{M+qkx-iҦ7#Ilʨ^nٳM4wIT^~me<ڊ>,;ՑWndǏRjD;Dٶm%/;sfaa^'`35b=/Nl;绕hq,_OOz aM~X Ӷǰ|mo8Wu]zuɐl13lY1QOI{SyfgxU)/z]ȯ*S/Y=I՘m:QCs*Dyͧ&+{EaCxӽ !-9&))]rJv;as=Ǵi0]c0}8uڵc޽a̚5+D(Os߳b^4i?uEW"aӻ~$J7iBmĿ1~ፇ:Ҷ:Iml9^o'2І:ِl5xQU"ŭg9ur^ٙu7S:4B|b=Ntx+;6ܫ%miJjMr[: λc3YLnԮMRZaQ\Őtc8ہQ `"E#{7KM 5Ʊ.M96ҽkE)/^MHjy9/Lݷ*ia+-OG!nk'c*4M3e[ͻ`4VHxnO>yufH B!rA6R =*TH\\99s|ݘ>/O"yv 璠Pzv7^Waʸ^ 0#_c^wّ%.Y@QחSSvkB}Y\zitޓYgnjn6yפ~n6ٕol&7rpߴZHG-XMK.W^i ͖"b˖-ٓne˖R*ӠE7o[d =z++c$:B޽gMG'Ly?ϲPX ai iGucx|g*G_ 4eb_ݲ@hfʨy4340qS2\`asβԿ8Xc 7 HIs,Ҵ dX 3)Mg,r7p`Y:u},R LttXؾsuɱ)siб9@׼gW6o86o[4ףƽ?[L.y.YMjOk;d̟?GҤICB{3g(BuTG#!m(:pʷTZ+㙝:6A) +ii֡4)iJB;jP(ʕcرXrYZxg !B!NHB jJBkv֬N;Y;R;!`uKg^/9vB!D"JB!B!C"HB!B!DvIB-8@ǎ v,\tG!B!Bq!r\v_}:uXšCx_?~|} !B!( P-\€RUTfa&SLaΝ>#B!`1 Zڵ˲Y&G!""4Ydu !B!($p!r̬Y8x@QV)/x !B!($p!rѣG} ZDEEQ|y~'nbccS{B!BQIBf͚y'e &$$˲8rIII >&MHB!B!#9o߾5pxgx Z4nܘ-[вeK?>&L@uza̮m+3@.g=w1~geqac*|ˬ.Eq>!Bi:Tc4M^KʫLRԩSUVaYJ)4M0|_tH&,cJ]+ Τ)~S27=#GDwt[W*A)TteKf~BpsNӭKK nO)=uyeP֬CSHs֨yRb8W,fX,z aq4 ?Wf䌧iX1328ӦMB_Q !Dz"\0-K{3g;4}K ~fvO14jB׼d/ZEGQE/]z\.*Q{IL{%5J&0025hR#;weھ$L"^Vؑ buJ5l8]*J2q|Yw\+^d@4lؔ᫳I<бQM[q ueo çh >:fOSàql!z-񿎍%{ovwu9K_v7pW?]^VDJwy +~ *lKȖ|uJ AGW,&6tgJtҰ9u.l|wG1jôYDnP^|$WCB+$p![ü7b BƪX.SBaC XƦ+7 3i?odwW_ƈq+,ߴ/73dŴÃ|um:Ԧ+RΓn 00+5l:ö=B[+ M_C3Uh͡Ev uf//eϘPƏyTm7UgЂ]>4'(l2eIWuCˡ8YW<]o>hwK,/]^ė3}qg#G^Ut*%˶9g2lӉ+Vgk;?}4  Wͪp8!IB)-9R>[P9kI(d xJ!Y?a%uЪ?wW #?:=;r8i4 But]C|XXFQ=wV $8(oVw]eO|b6NH|.Ri׹VlaAw|;TƦ|io_&$",4DÅ\,JB)fib T"T! JM,J=ohDDuBה#ͦcaYY9yap3qM娂Օz(:azk)FQWj6=PiXẺmOz+.n`DY€Vײ麞/]^D˜ؒN'2,}"(ڼ ?|Yq8KuŸ$A3;adŃ} IDATi]B! \!-,_8`AW@l\+# /R*u6S PnW,-+kf5f>~> [LʓV4`QYX7V#( ϳIi)o SHUe]Y)MG]v|NL[rֵlw'}fTh]Ng#tEq]wAlԨW5s \hF`&qn9L[Wއq~&| Zq]-M>;tS1.S$o~eaY_H-Lv֥O4"6NWȰ|.Lmw8^!]<ƾ)[~%3|,d./dxe}B! \knŊԩS`:uġC`&&LDDFF2rHpIvJHH%Kdᘦ`Z U/,oِ[GI,=LԞM;Ķ2<>!y t"یm€MwGs:>8O^+sVs3h{ͭ"&>ʱ/S5}-ŶzѴ4h݇1a=ˈ#}"Dbrq8Smj*`aeyMdM9Qe׻;wQN2wF  ؝${ͻvnsXnۼLs\tl3{d5̓+P ĿrJի|nOyeYAv8~8Ϡ+=11aÆaGТ]v#,LdӦMԫWe˖Bi:4H54x))?8qa\˦$-ycJv|Wǻ׫^J1CN7<(ylJj̫QPjU֬Y)LG^˗lٲ]ի{RhFժUYnӧO'88ػ8 !B!?$p!qԬY#-**oaÆl̞=;M=hJ/Sŀx HISJǐ!CoX͚5iҤπB!BCnu5kGy??tE شi+VdȐ!(Q"2eʔaion7n>HYa9B!BQ"ŋgرXR M|f7e~苬_!B!D! qU&0B׳^B!B!WB!B!DB!B!ȳ$p!B!Bt{i]5qOxh3yvcVep]H7_e~O/ 9>&o3I:1t4:rY|B _mhkZȿ{QrmCܡ/{7(eO9)\ļiADD!.DĿy!+JtZz/X;98]"ft5?ad:;G\"M;-+TW9E oġYbkː.)g9Z30y޿ E]ՠ^f70 Rb͢fZ֍Y6oq#"7? mR wTN'ڭ?ijT-I (H쿇97'giU:qgvu~E ,@er̯ <>&P"Ǫ_ 2 𾪕,¢X~R.2aF0兆ˆӶQ4ǓT8X3{-[E1Y35GΗ!""ז'rQi|ХF"G\OķKiNl[.c='q '=H0S.:0 Y'Y껰2aiL5paۄȁ5k2 jK9ѩG/,K/kqwӠ 6x6*?љwwL3>7;R^{-;&@qG>OTDDz\_JnrZD ?{ FzCQxgG|<]z̙|S-7Y>t'DӉ䩬yLep]HOyTWɅoFPQ oΚ0?,غ%ݝgzgØ l8u tdz$|&'s\~9f`̜1$""~A snN^gVf9J/N.EU,gS#UVȒX4Iz ~J;_Q-KMw9@.Le۷I[̯̏E ;Fl(qMp8Ncxe̷TR,6r,0m`?&.]%o պ7+JbE)Vƴ!bBmK$""~@CED%eݓr彁; ȑ&{K^}/+s& ht;znx w`lh- cݗ%iCÏ{_2]2K pyO6ON)I<I9Η^ˊV#3*LLXE&G2w4rtx+%6aIb]FW=`T#ojeMED[~34fҔ$%/n ':ev'+J;y)|_;,)ӾR\h^*""~0-,+b&_x֛gיgK;g g,7ٿD )M NP-Е*s<12طYL>2oBkACED$[q~coΣ$v F=L s\{:>j"""O VbaSfi\WwPUWܿdm*"QkG H8 5g!=N+O]DZ*Oet|DDD2n~u;I8`@ *nϓOBǴۍ q;> aVH=yC""""""zؘX~شœ/8sUZ~ c/gHlXp??RDDDDDD.saa,,W0JץUdObkmMMݶO3eUDFDRPرyw׎FT}u'x~~֏[0h1BZ}XtI6gЫ}cjE$e:E<׭)5jFR퓼6uyo7ލH0ۓ& #7yst,˸s <8;i/qr8٧NxfH(sEwh91L,0<% T~e/9Y ,1ܽXe$rw'$Beop nN`<ư_,&q&#79Eϰnv>u mOOs$DŽuS^Ͼ3`Y8>,DDDDDDz\\%V86~go&D?؅E`a5Latŋ^ãzs4O4[$G#\7Q$Gh,ZQ&\U_DDDDD$+mY^i%ׇk7.tb^iW:e p 5ax^ϲP~,Ʊ'4 LkX`;^ۍeضa؎Fabs!(niOL3y{OVgtl;)$IymNo[xa{}~ >gOh03.k|y3Q"0R$me|~;5/{e]Sy-p4¬mU.]6!""xgg/1=0 )yq>i)m;9g~Jvl<|_;,)ӾR\h^*rKyG;hɁgn6W@0ӼGj<V|fjϮ?_[6e_9m NJhqvi~OO³+ϟ5a3]OwSVH=ف!K3?SɤZܛ*wY*=bkYrܝѐ{zg.!;zLDD%,,U{ϖukrf05 Yd=S\NIJ'x~~֏[0h1li ܔȨmog8DyE<ץU?I(Yڄ"00@\aZ@`Ӳ\A)\-믝q'kN=.$K3L)♋1Bstr/ߴWŲ,]ˆqȒFʼn IiЦ؉?3y2:ˇ3KsH6!i99 lĩeBDoDžHsh=8Y3uZhR P4 ߜ$pc~5H2 @~*av> Pjrqe8XXF"}5Ŝd}jr>#*Վ^>~&;/gEDQBD/%嵶TZJURJu}mi#/v~4Ӕ 0r\9}h]gkv|&|2#usPkwjKE\).2K;O ^vySJ)]k wxńbeۋds ffteoLTԾڞ'`Z}v{&fX&fJwƶ=LL8c70MCe{*6!yI>dfP2x^糗טISsDWڝN32%J;y6Liu).4/ q!"~[ô2}ԯ95LL lڄϹ@Fy""r-i-.DDDDDDDo)p!"""""""~K [ \RBDDDDDDD*WUll,oȑ#9rw& }ҹs+|d? \Uqƌ9y$lun?06l`ҤI: \+ȑ#mۖ 6v}W_0qh֬-Z]-""""""ِn[uڶm/)h¶m:u… /džd= \5f6l؀m۾x:tu@CE䊉ezZXE5 ;D| {<;2}tbbbιɺBsrԩ4yej*VZŬY9sfK59 g||<{/ ,]%YYk` IDATV^nѐ_cCMƒj;$fHmZzMdk_\.P5jPZC"11N:hѢt%e9G#'&)Z;G{2J\%9 9 ʈiPwTB:-g [p0GuWj pxSU4DDJPb9u!cf2i߾=3f̠YfnRsr+oƖpmLn 4nMIهKa)+cd@J#%ΰdf+_frf)Z&O\Eq!WaXZ*٩vEvpr;I1,\>k V}J68e;C|?W,gͧOPdst3ѣ>e͚Xu'O\~g{;a+.Z/ާ5~Ʊ0J)f saw}t]YlgH&VZ&H&~ߵ,%:Qu 2zdpC)Ք%70{NdE8cH1K7#PtirApp0̚5+ݰK a͛7gƌN ^,^K% yz&aOLpxr/њ'+[@BXs^x "q7B+BUҵ,F}M'giU:qgvٷţO7l<35X\Ey p"Yeiѡ:.EY֤hv)+ *Qw\H?+MD(ykS:V+D+ܖ}Gv`]{qgYMM&\n\7Qj2#6'bZ)gI1M]jEEQ3%/l nMZy_Nob0bވ5g'OG%**ɓ'k.IJJ")))ݻ3̿iҢE Oi}69|D6:Οa6)N+d԰-L̘>*^O<&PH!̔;Fs4}Éi[a J3Dً¤<):wH᷾ڼPB `,!ySð,,!E9o`&f|uYX8W&&I|y1pJȤ| jN2 ߆ˢnҭhZ<}oO:ѣ4nܘɓ'x'Sͺ(vb̙3D| >}3u lO멏ڧ8Ke!7#z_Ɲ;VLBK"hchʁIyks3K?,?,:rq3Y] f Z3ݏ:e2@v4]  u7\ХXWF`JjY!C_`OgC+$$*{;sXgvlte-N/]?SɬE[гSny񋷲x"ĩC8Mں1I30qwm# .ե\iӦlٲ }2վ}4w3GN]lfĈNY$C ]m|M*es 0rpۃ5 n1'evffo^{˟iEdDmZB/;1 sw4$nKz]]_eY7Ѧ=m"S";y]ۡ\ΟMdTGrR[ӽ N=uSjD[rWZмi 4i]W .;82K~]RR6+J,&v%/ޯSֻ׀Q@1.PU, n'esʕ+m۶4C0G=[qsW{6?M̞ΟM\6dTᙓı8F&ߟxn^.c&M;z@a@R}ޯS^iwr: pnrdI]BЕ\~~)ݼo6ZJ={6_V\Tc6 #FpA>cՒmXc~E*DXAܮ%|_=|+ ZYaZq6ϻ|5 ٱ?~K89Yfrz. 4ş3+xsAGϓvd}sջٶt'OmBҕsy lѧ/wա\_5]AX dfmrO xٶm%8[}O1 S1f8b±."(v=s~coΣ$v Ft'7S]66!""qA+O (My1n^,4ԩ:t8odܹtIʺMW50 SW̺!6g`T5 d aё˲ uӽd>eoj"""3$\# \RBDDDDDDD"""""""-.DDDDDDDo)p!"""""""~K [ \d1]SyYrMdo. k9ܞ>+(EnAZ=}vt2(I'otbϗzw|Gm:fϧqi^яrzrOoOwд4%<0}`+>HS&G8&信,lXpΧ/sr՝M\,nh;',b[[8 pf;o?SskkŤﷲ ,y_[q'%H6m_/çoWb)o"""א" (5oE3?nl|!wu#~ˏӼN$w׌vG8v̬ {>O~śOvZԬߞ>n樝;fQT\uqp8e*tjL͈H[dqg2+szWr4󱏦w7Οev|xHڗ_8 Ax{ vbP'f0aeӡ~1}' N48KJkGCEDďٜ9MgmJ.{|Bp,z4q,g!og *5BĞ?9?7F 8ڽgEb1Tˉ5cyjAڿ)WɽX\82 \Fʼn IiЦ:k̽ݛZ_[fMwAgϕnwM_x˒n鏚.jOeL@udZ>DDSB ,q+w*..7@,{IlЖ*rQꎺ?"¡eKTf@M]Ecoݔ,UY;20qʽ m/KQ vao=wE+ h2Ε rݜ 5YW%"WImi +9ArgyzW zWlTYfʷKveRN#ʏ·5f!|W]iR6"۾+J,v(aiD-f""rm(p!W-ŦM8~8]uYX"]`L2-Ÿ4>R4L ͑8P$u,_L|3&AwFssGӣ9esg{eCr0^gHy$$$QR8fJ0l8H/ӵԔ=pʝʴOYwgwz\ι2;>WM7ޟ;_)ƽɞ&k[Ȩ|!&#_ Xљ"F]!""לr0|4y4hЀnݺ~QǏS@J*f]\\+WdԩvѨ͛7o7_^8t6f0LB6эyw??,ޕʢAZfH(sEwh16L,3bq^?eR ?A0}R;­?g9/˸W&7odwdz2>>i]6ݾ_k<7 nްϏg}gcADD<.䊩PM4aѢEizAlٲ^z]t0{?8N-wi)m;98^iWIK{dI]B\QaŊ+֭?&]ܹ;v,]vU"2L 7ӛabe??tl` $adX4idt2纨wyۄq+/"aTTM61ydׯOHHf$003p@~'y-DDDDDD]U}Gǎ3\}i۶m00H\Ua`]y,&ɾtkZ.Aq1EDDDDDĿ)p!%ORb 琘8qbG^0qDlLӤbŊ""""""h (aaa4jԈE1vX-Z-r氰m_۷QF,XP[ds \E:t(˖-#1115϶moߞaRqa&Æ ˰燈d/VR \׳>KʕBDDDDD:\40߿?N3rCDpiiR8kL"?V`{hиK53- ˲,ðL 21wIZuyEmMQȖ=xccuWE]6Ӳ~m""kScL}tJ`+Qꄧ~dHٗg13 rբ#ZO>GsR',]4 1Iy!j{cq7`'leghV^MNiH:iM.Lm"8}?Yƚ˘51esMv$T%>UeONJba`ӕNv,;JdU0W`?L3 o37n U=@`\^Mnؿ}Iι0^TﲨKlFx KeoRe)OCO$7o3/eo9Ilۘn/ǭ x$ߍDD*SBD$prh~^XVa<áؓgflϝglۄu#ulãI;yKɖ3'=Na.*[O;ˎ )DD5ok?KtP  w_>HhhԻ~)TﲔKny4Xp3]dkV ~0 Iz"HV#79ًWy5 ep}gǢ:Tq39/ջۄ$iV[ 1!;% G<~q.UDSBDPt]?iJq1Y{wnY9(W/]uim‰ě=[QxXSuL"Yi7 J?@6Il~+ i ./sFe3wwI 6+J,&v%/ޯSֻ׀Q@1.PU, .2= IDAT0͒Leq.M""""""""-.DDDDDDDo)p!"""""""~K [ \R"p2Gu*TY* EWr|߱`R$\-mDDDDDD$S"ql OelٸZR縯N xWW&Ilfp&;"""""";odf`>nԒB8n0/mk-ñ8Ɏy郕t$i٣?k@8'15^-V> Bdn8HZ s3x30hAyϡn\`Hb‚ڹ ۊ[r5v*_>N5a԰`TqV4wsƱ9v,Oycfzr>y, [?plXzc/5Ogͺ̞ЏF\ӛq)9I^3{Pdst3ѣ>eժXu'O\~}h)#zO~"KV|Ό^|>h$sI4-%ߣox*=_'c1MqBgבu\x,2i*m8#%k0k7jN|9s5{O+oI9)%0rky9B͜N'qDXŚ2Ku+("""""rE(pē'H4_/^E`n5 Wtk,X4$ɣtN܄\0ҙ*K v\4Ȳ&E붣NCu'+ԒG"W@ jawDr $'HXT qab`&eaib``Zebuj*yhS`L DU|)7;G.ர rwq`~sSDX9Ume `\HR"K$QrO} )rmQ8CIC{MaXg+NaL`ԏ``Z&E3T ~_6?O؜Wi]w&uݹ2pn]]K)s.M\Ȧܧc5sV;x9;hx1)ݻ>e8XXF"}#3ȗ?/q;coBr#0؎`K8tӶNLâXck?a/'p?c/U+1Msݏ`"evqNso&D'3n'""""""J[^mEJݚ_xS_@`yk'VDFԦ-#0m8W ai]uz%a5SezP;ZuBK)V9#\9֜>IZMb;X&ś=̽ڠM[GB`{~~5 n Rk:;{WsY^',J׹^L݈ڴ?G0`|l<4#l:ێ#T?uhZJ=݋g{%J60I!5#w>n8tnՈlڍ&8^w3=c"6>y5GDdGۉw;>{Z֡JD4=A0#?fSzDDDX/1 ?.OS':dQs9ʼC292MO6Ο]6󈈈Pįi0 ̳W`LӬ_r0=]`}Ù1eG_~3%!b`m< _YO3Jw݃Y>mBw=;Hd"j ja,[C}/>`X0Y:~f4qg PE-BpFo 42u8[wQׇߟ]`0QXmEUCjmU [U (`JE!!\r ${z>|W>w}FY ]x$Mbfj7[WnҀt;F}m(wͺuOnV$ɱ#0UU+{-=-U봡4KI ]}YJWQN:eH*>|Oja\1X8r!6>6򇓔bO6Vs?|mumqm>/iCYM_7=O|2ϏQG c*W٨~XEh?cUQkcV0^nY,2ܷ,UY196؈\1$bбU5b}z7l]<8=Ѿ!jIգzQW;Z t,IxES}M@|7T=[(COP<Y{} %5?Zڥʘ-~C%~.ߺrEa+K~6>S;ǨhS 鷧lT6)ukz6Ong\>;/DDKIgak^q$QjG ld<^_FA|MyoNkQ]1U}F\g麛Eڹ;ZDoL35kZSc,#U< 6(]9~k6LÏ1ڽ3_vttD^}=}WK7Ѧ/#H*weNZ6:|iխkK*UZW boPS0Ms7W?h EO<[Gk}whmC=?^{OD/z\_ke3&lݫN'{V$/^#.:e4Q1#˪~V'6o2Szΰ6=ӧh~ =?'?uohj+ ~z}X1~6BӔʪ- =,I aGϡz$yO^si謏J5{T3wwiFvRD?IJ5l萚nցٓwIU=f‡8.ߦj\#S=#۶V18NՊ4uk&fu[ ]Q0脭#ɱtVqlmG&om^ȫU6?;/s'u6׷sz%Ua$'l;Tv vׅԵ,=.xSM+D\FUס*W*ϝTQbspM~byXܴycq~b}b Y-^Gv7jڠЍ61".g\"Ep<x, Y.g\gf^7D?A'K!x3"m}ZEyM{S}ڼSX[jyz.U=DF\v&f|R砾',<~=5:y$x~OjX;W/]׈$^.$ }Y:wF@MZ$VꤤDw}}QK7c3oֵ^ɓ'+--ͽ<.!ZlЅ`oN+S͚%jrԶ mۖ&͛Ȓ%q>VAmԈ?T6hxuiUںu>|wm)M:|}vz]oA;;D: \ TzUnh2"= xEBjS5o޼&)-]I35ٽUʤս'lmۼUNAjRsnи׮Խֳt4;vhĈTTT$۶e۶#tŚ2e[-xQ凇dx|)ЮeO괟TM) 8J;y? .m6'#|㲜6/V߮ڂ/QM:N*#Y]z~vWȑO:tSAUDɊx b7K_(U0P-Q'1\bC0BcrN1TRR1chҥrC-''Gcƌܹs7d7቏ߎѣ˕Т~tu$VQGE_[/Rn_ɍu?䨛𞰃 _l*+)AJ졫G'5aWlq+ѭjF(sպ8=" }2y@?,Tsog#Vض?l;$%m??zͥY>*Q&O)S( 1F7tYV?K?{wfd'˖/װC"Euls=Uv0(Y;-}[jd,+*{TmU:N񎭠m蛙6hx?Z;ac:oDë9EcQddYVJƒtB4c!Jb_IZnNZa&{jڴiQaCϞ=`tI|ՏA^ \ b3D~ .p.r%&&Vo~]qՁCVVVu]HFjvZwQ9w}@c h޼yzꩧ uk ':B%KhРA ,YUVE0jjȑ#ݻwW9k…JII.W^^+ FgddhȑʎB> 1T?1Feɲ ==]&LBV\C\tɒ%:trrrꮿzeffFG R&M /uU9+V(;;[ݻw^=dڵZj`ThѡCtMQ!FpC*==]N>dݻqA\R+W ;"ZJJf̘pkr}?4w~S~ G r=ZsUNյj߾̙1cZ hըQ#.222tm)''G'pZ9.`1ɓ5qD͝;W/Vnn$)++K )L jk2?˲,5jHg}:cC{;Q~h"D#˲dYA -rrrp¨;ՙg[nEe֐!CԤI4LZ`JKK#ʓtgz\V[5\|PmWj޼ya{z$?҄ IDAT^m۶%8PG?þ8~Wwq~@S)%%E3gΌ^ċ>}h̙JKKsW<ժU+͝;W7t՞oQSVVV/p$c IzzM0Ao.]nkjӦ|>{@ @Ymꪫ{L/`> 7@C(, Y.g\"Ep<x, Y.g\"0^ŇvY.g\"Ep<x, Y.p83kNEm 8:puU/i]Ł8\8mu#oiѷ;To~+t =c+hh`ԸiK DTsv7TMQG){r2ZZuZkw)HPTw}.:h5NJTZ:>{:'WΫ광'k:(F/ @KY9Uó_\ݢQ ?Km({I|~{BP{Ĥ5rx/_n6kkt:'ӳңv$oҜhl ~.L}Q047{ONr.-qO!@5_a O( SjU?b^{o>y. n]A6}79K$_I]NF/ϝOk,K&A}4^C}:M=y9Rutdz7hTtS/Qwɯ[7M#s'Ė?%-:7i?SЇ H쮫ZO^5J]:YXʫ>ܛc4x`Ge&ЬLmdGEOY}G%Sq uӎJM6y,USvd꠶hK[ƝS#K&ޙ.T')!;>[r$)䌣WrV1%q0FFtwi[O[ɃSshϦ"Ǻ!t<^_FA|MytnԪceXa3gTh{\ƫzꅉuoKˉtA_5|}^xv._Mםnں@ o?CB`*R*Ts+{Rߒ} \eKjgެM|=3q>Rr}|۩z}Zot!zhdk旽]|Ѫ,#XS~'_?g_ݫ^n՝RԸ/t_Nӯ~IOt[yVs[d!FϨPV",V[K+/-E>6Ktv7Vמ)#^} Iv̗]7%cۦBi?^Բ2>Kߺ]F~zcgDƌPv/8*-+1tT?ռ~J4~nTMm, ʗA.Cti dj+ m^V$_[aÒzK/yKۨTG5/oG]Ga#VUǶe;:,9egɱ|>#ɑ %#ɱ5DžVd%2g,$˪{ _?{wfd' -_aC .P}?_~w$AICvvj; r9ǚжSUZS#$|]Rײ@ cd|jƲ䮭6jqXDq0pb/=<9.g\"Ep<x, Y.g\ ]xQ3R/ KPY.g\"Ep<x,*]*߱EƗ&g4UbVJS4a?Ht[(WE.9 %6ofڮ[wS}*vǑwdd|JmһUfJhީN* g*Z⍫e/%#w?BF%@_GeXE#;`h*_^UFӕ"˽sLe;׎՞>m* sMǑ ]RK~/zN8Bpz~su-9#ف \=_.T1rJns{gIRڱ~LcZUGe[gᜉa*W*fYǑ8*\TE,S2{@q/>¥*ۤVU8Ap:+]3L8ʖ?2(ݺQ%[ת Vu3_E,S챒]{ b^#ė}Ҧ[u,.R*f"po^$cjquV#WcY%f8Fjc$IN\{V/Qҹڻ9F8ػG[Ri*2$w2M3ўD\l氽uVs{-59 ƟF+T mz Iڪ刱GX^KƨqaR+e;Tmr.PgƗ.0A1>et=UrMCHR2<5>'| F_jay@Sm DNX#ѵoTk<ɶ#ʤʞ[f=);XᮒQS/U%X~>WmNdE,`6 丫$eq]Ĝ??!y@+rkTv[|Lv<\‘5j5S5;BθZЦx7kW$wM$)F@#@$d6Uf8krzVnզ]VO%OT'q3FL'kTjT=r*WBҨ`%d6ķ}k1"es{U=d| p 8:zIcѥ:IƟUP^۵{m5?q = [R,eO >~M_=;a,ڝu;whb:g_+Kp*PK|X>zU9FF׾JjU<I`qJmkBdڞq2"JeϋQy\ XbŐQ"@"InEMdiՎ^V%[֖=-kՒ1jcڜvLݚVJb@'A-ϓ/%]ىԸOv%[k wkWbֿpwBR>'^)j}> 0jZ[kP޹Zf-cU9 U-qr|=DQag+sOwMɟ.1 ƘW0fCI\jVUV%tZiU[ N\J7U=B}Oފ݃BRIzX>55,lH?뿪|y_S dEp} qplv2#%:][55TzQ vQkGڱ9vDŅʛ?#nJS~|9 G~N5~1(JmW 1JIv]%?g6]U8D ލ"KISre$YWw$##(nErE:Y[߫pҨ!-So?iD$9 mz1ݰ]UV[ʮ(sWɟDϞVE -)vvl(' ێϢ{[$5R>JhB/UԌzIre*\]pKU򥤩*i+5=L-"wpϻQ \^* gBϓ1>IRr,?}o:J_tx!;?xV.ql}٨`D -ڎ25,K4|Ϸ9W >D ,٫ _Gb)@du?QVR6юftzIFEkWJ3!ξN]ľ Vo\`^Rz\Ί6D.KѵLBRDYSGEkWh튘/9MݼBLBReo%U;u_^.Pg;t b2FQ sT9N̹(Vi"$QQUuAp: ˝];V?(u'weJiݱN}YYꬢhWTcBTU PQS{7cGMwn?uf*E 9 [^Q1Kj˿V)縐`{+?.PgH뾌(_Ie`EwqZ>Oś7lfm|}Riߓy@@GWΗ E YRv2xQ2mʖ/5CFRɶ*Y@IQUؽ,)j9HJPأ5It+ԧi+ըm٫ vOjs4]:.*]ojgT>8'KR U؎PuZ9τq\@ yAY5_qBy) jQX}IXVUlKj~Y45,W˥`ֲeZqauJ{KKז˲kkc@Z's+).ӛA -ʗZY2 PD l+ҸT>XjlԺMپP Kd*$9vLiے*'4QgXJjOI|m%LRGNvQDK'iAԪke$)Bq_.n&|T ,԰ɤUO*Ykj{>$XSa4Chw_5Tyojq/1=|G('\SF,2Pj~]ʴ<=Y)URPF2jdvip$ ɲԳsz^v@nv4kz% Sdq(Vz8b{.\\m{DŽT]ٻ.K1l[ނ 2u{ZJ]ezbY@[PJ]#R *g] up=z4]9`EP_)݅ D]N]Zܽ潕sVj(#io&~P9$4$c=K*/J-UۑYUHҚm-\]EӨǖTPcr×wu]Z{x"9Rha?VyMXz)>!~-<qs_g_Ig\"Ep<x, Y.g\ G5w1)>^g  h Ep<x,&Dꫯj*IR6m4vXp 2G4 42~:ulvWGxu 7讻Rrrp @k /7yᇵc=Ӳ,F5Oh3fЋ/`0讪mz饗ꫯqw5@p1eʔz!hʔ)u80T ⫯5ѧOu)b 6h:pd @[n14 IDAT9\̜9S\pADPX?˲" ˲XPum6=ZrsT\tE^YGԦMw5 \`f͚k@Ě"bIқo.cy==z49 +lqf͚cj֭ r|Quʤ@m+//Ocǎ;"@mۦ ⇊"*;*mٲ]0 S^^! u.YvرC=w4<@VX.R-4dȐz1s̨"εx=jysѢEڶm[DY ]UC _~!QG͛7GM>]?xDYh^pZ/,Q?]tx㍈$}#Wvض`0ptGscL{ b4EntG# 222+{ZuM233U#q jҤIjӦZV4qD-\P=z`  D, Y.g19' ۶K/iܹ*//wWW3cu]͛%Ivң>Z㸫cjܸ 0UH0Bpw߭`0變b;C *%%%\vrrrZH|4o< 8 A裏*q>lʕ+駟F ,Њ+dvqzضR=SQ/ }rGoVT "9= 2]CG:IHH_0803|> (&s\#Ep<_%''GM̹/S޽ѳgO}L0tW^^ƎZիWsW_}mۺz\S/^ZC IrGE׮]EեKw:v.U}w9s@K82\࠘:uŵԻwzu]Uv~8(FUViŪpWGڵz-箒1FSL_5k ҵkWGE; mVcƌqWŴeO>ӧھ>.pP@`k<xCEP/ׯכoc_>ApZi]]tEbOm;*;7n{챈2q #ɸqG3h M0!.ń t'\@9<>0.¸;sW<~Z??}aYzg}V<ܻ<9._eرc&:c,ˊ#p"@cfhpq.ԋŨ @lx, Ygfe(!!'Z (_ AAĆfP@j0$lB 黛l?vN{lfw'x=;3ɝ h\E, gѸ9Y4.@΢qr h\E, gѸ9By@ξL&PxfpRk<0C:?MOKuhE{иyz>n+rlpԚ ;-a3uEִcub,5-GbEG /&OSgk?J$C˟~L7B@BV%~nq>ݹZ+{`?O҇lN;QWڗ$׬?~ WO+/~~ ]5}j^y}$~VKUS6Mze;`w{TM ~qys? knץ?{]+n[{͟|3Nч~ZC{W[zBSgJ^[ۤ/m׃KcO?G?DU \[۱Pw_~OzT?2( yݛE1_SFkś1ЍRޟЏM\$Kܗcɯ| `?} uXү?'ړ"q+J4}o!ޡ%=/蔑i륅#uءzҹcZq:fu>ݿ[khaϝqJb>G:wi3zj}I*f~ZRAy9XMXV\l[^8P +SA~:SG81^ו"{>2Fey*q+yD53t/L O ZcL?\eۦþ>KǕ>罥A/Ԩn_PzݰI]yExڋOQxz5 bT8d*Zn:8ު$ETY[||EبM5tHiАԯ{y])R]퍃"xP) h\\z^OGϫVuP?iVSS$WyZMķnQ9TTh] ptQ4dHyJzMj:I_W91rR|ki]E_ D׬5{?Mm[ݬ:Z'~hJG׾}M b[돿>; 5,}ϛɮZJKmV@b'unquu_bs-~u5UyR$=ILTϿMm|:oÖ:kKcE;D#zuPïÎܮW؂`K4+uQGiYkñstyV(uYՑF'/ۨ_1Kǜ./^ םO@-o$ =f'')j#<Ϛ-")ߚ%6{lyk.JiϴSeۋjO^$7+nw _{~<<'W,w=xxZxcn״ADz~<"nÝr%zɏLyMe#z_XʊW_{M5 ;=< gMwݻ+zǭy,1[51 {tc; _Hʋ-"Q8J^$Rc/[ޛ {?]EɟzFS$r#hݦᯛ51wp󝱐k漞Ѹ@Z_Kj֘h)]Q*#,H`rO/YOx?tE*H[##" gѸ9Y4.@΢qr h\E, gѸ9Y4.@΢qr h\E, gѸ9Y4. (=T$i˖&7 ͛EsПjՊwVhQ*))q@NڲI+}GC wS2Ԉaõjj4шC)d nİA@~, gѸ9Y4.@΢qr [x\uT^n$??_UU7v"W6mڤ-MMbnYFUZRry离L%v dͲejokA7~֮KhY2M?Mwi&m֢ y)qx\[$IN;Mn^bYPߠqӴ`?~T[T\R¸D"hKb &er/c/Yޮ|7PPPubXʯ H$~por_; @΢qr h\E, g?XB4zh'\uV-X_IҔ)SU\\Tqu'Io@N{{"Oyg~Z_❳yoҲTl M7_ߨЂAS5mL:dҺ:pd.T,sC)WV_mzHѱׄAZJ}СC[nւաooZ^yW-$y RqE7VCa%~$OSGv^{qjz+Ѩe*ΗJGhQ@3DF|ZI[S6諏\y}fժUͯ֞{)I{uYg;UIGꈯx[.E Tr(sDj q*M׶kT6\6BHUEۧeҀD;%OHbỊQEүn澱F-r}5ԓk[n^xECiSNk}^/~r}_:[>~r-yǺlSLC)_/5\f-{vt3Z%'˗_FKiͼM 6FU3x3}~DcUQcnmgzHܬȐˮҹWL÷7+_ _SLuHSTCWimjbI~kYT6(Ľa~42Xbڰy0Ti^|MW6[7My*2F'PITX^jk j=@3,ش\[ʩjLy7%KSCsLޠ FU 6,|^+WwzSb5Y,N IRj=wM:t.ZvUu_>hl5\yk|?Uo|[nSʫ[rO7j_Ѫ1ukۻ/?KQkh4 nЁ>Lߦ teZ=UolX!/[hmKFv_eߗ5&")u;Y)V׺v,Xڲ^nܠkcVVW)Ok7]EzOc>J#=m[H/k|GYת-+^ S!T$Cst ɗ{/a/?))ѾĺU1տ;4s0(qst~U\C>~ʓbMAz%iq}j횵: ϤIaWkO陧g{QKjjKj29Z<)RXCuWU[)&7WC06lvmlhViuMZU{Ry'E5bdZׯSSo?L%QE#fAIVk4|}*ԨSA:Q:I5{i|y_Yʂmkٞ)x4tPlhk^=\5F_&,ӠhTH*JܸQմ^^( ܠ Rl6jP'bڸAyGixqTRDksDL6Z#Kyy*9BMUߒ ;F5EF#RcW"@=zt=&EmF-y9-3~\~UL*Re*5nPzT-WjRQkRp+,RϿ@oں:)MVŷЫ^=b)P“'_qRey6TVVS> WÊޚj5bXȬu@$j)=벭C oܧ{]N|o>VMs?-lT$Q+~DՇI}W|X*ERޮYzBoզ+Q`O^P +iлu-Kk٬_RDڶ=Gj4("E*T]٬6HU*$y6,u+Qckۛ-* 5Q}m!#T=խiR/ɏitWXae SybJUU5j֨*^mQyuYh*TmͻZխfyͨת:}9qomںydIs4f9x*j)lO^{v3ڪ>3['t>P{Y ~SZT!gO"IkqW&%C/֭_S|tЮt7ɝn.gk+أ5ﭲ;@tNؚ13unMd|hےzZ[wiѾZ]Vk&hx'X{Nez_ k}WIaTy*ݶ^-{SPF g9@W,S"Es1 T;q6[G ;t|vbhPMZY;iJ-}Y{ +j,x]=nߗg"*PՎb"y^b&') 4L8ZѠOf=Rgc޼y:#y+VHGLou.?}̙3p7jj_z>F: {ߴv6רvݤ7ϡcK({#n7\իMI1I|ܚI5Ys?|T1aݜnF_vE|z}OAb|qbk }oնmqEKr 7D}ߢ{Uj<\]}o7RpMj :h\}/:^~}ڍp䁚9ҍ+qr h\EY67֮|7C4axe.NY#1vbO/Yq?uO˔ӫ+kt¤neu֮:Hn}]˖-ղe0~k;_Q:g,֑27ҍ \;7SAo]w)‡g֥̏@/hP?~е(]%j5u9}}ʫ47 /ԑG*h#~)Sʫ麟j??z!Makذ5r@4.28A7T ؍^h4O_;n;I~ynyxOܩM"=FSo~KލZqtk[C;Wm[uUWW_햏D"K+ܹr_gKO?5n,bTyW;arZu˕)/?__u/pK>?<Ҧc.N9t*K4zv|-<] znVt**-W^H4-,-/TiJ*RVRF\jimOF\k^x^Ep#kҩG*Rz>zeY5=י'RQDʯJ\}*_j?sg/CCгl:եs&Hqg_yD^h͙s69-M|켷Xe|2DbssoLX=vva5Ct%_ѕܩ{֖VJswlZHRDEeeljԖz5p|s6{e*)6KO%3.5g6鞋n]Ot_m7V37\r.\1cXG4GUn.?IyfmT%U֨ZE=qb-UD\ն^w򃉘X4y| Q^{jk}f9ivŋNRs{=w]n>U+Yubn`EvskrE}#)t%_֥ެ~kNMNM+/>_i;~AcOĒE{twS}bqgG>{_3fH;c7/:5gHG z2}Ο#-}_p:3y={$G`|7-‡՝HǟQXz*> u8uE#~wi믻Nk*,,ԩ _<8Y7L:=Qusyu#zPRD53gkڻԝO,|b&ޢ uKAsɛ>\u^]&_:u?kn6LjL_>qSAsAsfqa7.ؓ>#Ԅ)w{ #^='П?@Q>(}ڟ)Ł@{{:kym뚫?yu_g~V&#ϋhEwkӵ|_^G,z|5oixKѨgk}s'; EGK^~x'*;TG;Dq %EjOҕ?hCTjēkd[-Iz-tNMqig_V}-ם־As7f]e,OYAua1;nSדfny8*)ߊqE.#ӞiT+]ܬGбn`R}bX7 :]qx7ͼy4sL7}=z1chG>S oZ ^3fHt׽+KhkknqIblq,ء,ު͟y7ƕE;u޵*̏i$ѡ]q婯[Yi4v8j^jkkS]]JKT:|u}M$nva{{;7 ޤpfrvkMsOsȧGEwbߛp`Tt^y7ػB/ܢV~C?%_#+T#GkV7^ɋ~VPPҲR1R^_vױ6a7jq:>_d||B{;nkfg|=OԨ>?<l(/ឧMh\d"DeenryRsF*))QY)uFP͹{WXu|L;Ȱ&tSxWD|Fh/qa_Xw^in\fe5əf 儾l\v޽xa{wlwsn y^Ez׍>&Iﵾl\R} c݋n 7֘=\d֯r]/uǂ}sGN{lAܛbnaN7鏆ܿ׵a9WPܞO\]0n]'{ 3^q_ڻkbw*<޲fGK&&(&evgoA9"f@.kvN͞[cŃb.}ʎ4.%ű?7Fs7oo&_ױ7 qf39Y1P:W]apoy.sXb,k@2kYi A[*'qa>L4=ގƄK&&nꢉq$׍?IYכ$;׷OZIsRSA cf-,aҩ!nC L󬹻7_WqkLl.bvs7M;W[I{gbOoyoiiiKOaq4sv##yY971wov6_fnǃɎsRDⒼח _谸w/q/Λd܎: ;er&ޑK_S3w4t;vcA0;\aÂۛ3cn `o&ּ0q>_Ǎcw a֗Lh<(;󸺚v;77<)!u5LŽfn^ݤ35sf\v,("wׇf3kE4YSƝԙm^1ssLaAd_ _hsrRؾ 6kl5&g.SfB\]ʼyX"g^4!LKb~?J޻1Þ@p׀.;6fNn5 Ƃ;7߃11!aZv\!c{3qc\aƅ+Ų[g_Xwf󦙅LD"xbnr_1^b,~Ac &lmmf6I]wnŽOM7c8vLuv7t[ݸch61{'≽z?Ug?a01 ia~Ӝμ36y7fo&g ƞu"EЛ6s{o  iH*̿0"+f7(:<+f73"m>M ;wAA1Ef g 켻Nt5< v̮'⾺72L zMIbpԫs۸Hż㾵71Yq[gbq(k07({؜7I {#ÜӼy-snQf.'nsn^A1z6`Mǭ52c|+65Lޭ3챙1==_:l5.W&^4{K~z"10 Lc7*OJxm@-,fݱ=Y8h2k=wlσjXP!ll7j01%56Lܜ+(6`qk1m.0ųk oxbo 7M Dy3"짼}IDATt0Dޜl&~kcܹ+Uv6AC7s17oւv.hv̝ܱԽiaffn6ܹϪj\|\H1%^b,uo^qs>L֌#y:Üaθa➺e̓b3sׁRppތ;vk'<]o J&]c6ڛ]ko=ح@4.|6űuo˾`n%8Xؼ/`rf zlvyW\!h͗JcތAP3Aخ3{7g nܜmx56wdRٸ}lv܎Ɋ%vsMݔvSn`DI9S60ܱafTtLdMmP>HXMP,hgݸb8>(&(3ǘi,q)!+gטXD]4 s[gf31las]kǰysL01%n݌pv̮sM\8hnbxP,Lv"_꠸Ar^bl4pf s͓k:Sk}߹uirqfl<] nt޻c&a`~·jd-Dбߍ W򅴛7ssqc橫i`MAo&yLnl؛?i>k!='ۇ ˇ`g&7|k3s7,64zSVLcB W츛wT>Ŭ}T un͛s7+J2a]k5&<܍ywTy٤ZHywn EwǾf&DP3Z9qw;5n1{qLjS'.̛ [(KsbR獳4wvc¼yB'.|lkLē퍰3`w ݹssnݛ3Tbofnǒݹzk1Þ9),k}ѸȄ젹1{lŮd:kLSgCwb=%sss1f7gs7gb8YM* h ƭ5s;Tc׹fbA:_5 윬;1n\|\T1x0Sc?qagpλ؛>{ ʅ `WΛIbAs7AaLsnތrݻcÍR`WjSͥ̀srAc{nΎy{4,,l/p/YZܹn>Ɲg31z]#(ֹT2]Mf>hHsaun=wosnͻq;΃j j2Eneda7c7,ܸwvޞ{wl Ōd09BoɎ Ť7ܸon>}7cs׎Ӗk:˴&hÍg ;=>tnw4lrEyp𭘻7c;ޛ퍠x8LjҒ ?/9rю,Sa͂-&ll INʬ6#}J=ݜ-.llsSɴ^1+":cLFX!lJVjJ&fNu[ܖQ,g ʹ1wn#l1ݹ3m69tJZ-3}tnss΃laz{*zNu\P>(rk2\T>cQR̓5SI>:@z]t[g΃5Rp,^ gzKǸ1w.\n;cRx}>e{vsAjܘ;cdzLu wR1Atc;* \5\|P.($.ݘO&c2!Pu37Ž$ 6YΖno0OV, ISLw@qLO g:qtZg٨3#{Dz靷6Vk^M|TdN7E'Ѻj#vPծ=shh݈ȬHo!7WoYVH3[?*27һDP-?"rG">;*zG;}_O}dݗ5g;٬]d5C}NYs[`^調qatw ^=>Yz~']߰a#®{xZ{ڮz4tON̫0Pq}/GOyJ~0 tx& 1V6{IENDB`kraft-1.2.2/manual/images/nl/unity.png000066400000000000000000002074261467704360200176600ustar00rootroot00000000000000PNG  IHDR.( pHYs+ IDATx^w|SM(%Kv_@DŅ "EEE@ QܠY {A$Grړs3ڦM~=9Ϲ7MQHjB盈` .琈|a爈B (9 """""vN6εExt3|8>pODDDDDDp,}*m!]VKDDDDDD᭬ euw6,K1qPZŅ:NHxwODDDDDD"C_=T7T%""""""*PBW%u_Kj?%)SI'ÂcI'P}<W-KJj?!΋޷DqQDDDDDDT/@ŝx.*\_oVJj?DDDDDDWR `l~ p[g*}[u"""""pUZ`hny(ξ3D"88seo,G&^0@rTqS%"EE'_c@ljo_q_c*>:D(/VcVqXQ(8%P?18{,E_9%,E9vQVsK*K0s%""""""=\jNIQESleH VbV|GDDDDDDW1.W`,3|z.hLG DDDDDDT:-}t1]^1:Ks/^({`5}L}@EU#""""":ەjS:5}̟`_d X%uԜ`h&wyl_G1_B_$8/Sǂrt1q+EGDDDDDt(<ݸ.RsԱ`:?h 8 j~}<ԘDDDDDDT6j\ ydX}4BXf}1UU[ƃl>P9DDDDDDg, Vm<}&7(^@suyVE].`cՖYXuƭ₿q_3(goոU\*$XeV9VmU._ 4.7(\@¹j_qyq&RUBj9tE[7(͵hnyA 9}5OWLP2h[-Xj_r(EuQrjm]JI% @HP8Ϫ(j!Ŭ2q] LjE՘..&S䭚X]HNB tEw:u[A]Q9DDDDDD碢,9V5t1nE[j[$O[)鼀b> jPxLL_mYIŃQ """""* %Gq⺶V0X }VSԾ@ X((9 'ous帺?5G݇mն`5`g.QyVE:jqu+Mdr\[:W:%^`si}V7߸5_S/9ʬƬ1"""""s՘U/u"n_Wխ׶RR9P儺HWVSSr[nj[/Q8tB^S<„1Go+tswL>S/}o Z-XB|VmˬV6,e|9.lr}ukmxjLWw<`%p?_cnA}yH[P~+<&bb;HLl>&E1]@\R[3QHkLli[AV1_| JI/r}P0j\-myZtPԹ"t[5&խԘ8߂Y zuqݘ|Ņ<)tstcVŭ:}츺d\ >tq_*f׸1"""""1@h侜VΓcr[SJU[[A[[)_%_Vub^[19^I(cq9&CYo"ڪƁcbkU\䛠^uq5G7&o]ܪ5+*RŵP("վDDDDDD卿r㢯y\n[?DҘ/cj[Ԙֱ,W\Z PԸZtPc,ty"Wq"nqU\gpP ".&q](Nؤ}эbA)+.Y jAA01]sP]NLtaتz򉈈JiLK]b2320\Qt08=[xⅺv 9.㫸 (" D-DQ1*TmYZvl1]/+d A=|q7 Q$&%_S5#"""""""kIɕ:Y;:)&ء^!ȫbOTpn_L bLBQ,瀈0 ֭kZX!Dn ձ`b8xp!? V& -[AD[<&`g>? Uʱ#r{O5LDDDDDD+W ⅈ<qy,hU(/*"QPP E . dBNN&`3ecߠ^auf"4oiiغcVY[#.O[.PybLՃq/yL͗.\ʼn5&EIŸhy"f`SϺxU99HsAiE0lMkvŨV""""""OмI#uj@5йغc~ _bɆum"b+:i5nL(…ȱ'S6hᎩU.t$y987-._ȒX8߅)hEDDDDDDgMaҼI#plݱKkX]B1 ^V"2P8lO%]E>9r_15_Pst7qz0t稱!#q pt m?0^ ]n;elDFFsԱjլ8t(XEKW //OqvUzE bl,gFšÖW^鹉ϸP'&r\\ O͑+S!S A=\Qx7A\%6O[h r,1T\&v~\4f &}.+Xwu%pa&DD瘞oEk;f3̋cqq5%_ʕ0őH!s͕㺫ij/G*1qtWjըEjհbgj Y)** ==i8xvڥ3."0,/ZrТi%mD P16Qc^Z;|v rҘhӗպ/qIiO Ծh1/c kdD\0,b-60qysk2ToN/݂o~k~ϨaqM0iK.RVjըۻހz>9GGB j* -$>)Z\ 5TuF|j`~0 (~6[~%Vl߹{?8\ra[5vƤӰs?BfVvNC^n^z=lݲ9Zl֦es4o8MĆ, 7q+]Ҽic>3zVUoܗj[͑b!WZW\X=85eiq *`U-4+]2' @*ڢ>NUBtԭR`W4]p\VU3zvիh!+ ϐh< \s_ffj8~")i͆/Aff 8XV v~ˍXd:i~ oH1oL3VFu^LDnn.r4_k֭WS*o*|uiATdd~4_QQsЬI#aաi/ xq{V%ÿ/ثߢi:&Cmk7lܜS":] EDu,5n+BSUDVBPOV } ɓ(P.tL. GSvF95Lqu[ awO^n.RLfϏ?A󦍵EfSDD6L4acرk7m{^듦q~z?dխ^oCJp&i!#:^v u'TJ{oǒeeq/cPjL}k}|"={nFF 0edQxfxE6-㩁0vE:ЦesCRb"&<6lڂUkv K.ij/CVNW}wsc3p:p:lj;c8.Z| DD7unUoٻiZ2Hx(~(;457n3Y:܅O\Yss6&] yBaCRjUȓj^`0q"%Y٘T5%t3/WXph'RRKc;_:^PPP?S] rLǵw4sI4XQVOږԘ(`+.V0 " c)T20 Zs}UP ߓ,Z;~@&1豾dw\\١=7yNbӖmXo<)f|1 >}Wj>r`Ps"f3lwԭS<9v`+W xJ*g~=^ 8o}=_Sb%A[3gc܅ fJmuIcVSPk K +rBM.r1.*U #Y '+ &L89سDWbjf3׉7HO퟈,ѪE3 _̚3}&<( (BQy+"+S,\KwU\Ѝ'A>M GnGŸxTϏUC]wN;j4yܝB'""""":|>s6>y-M[a0__lTyvLrB-Z1y],b6x_q!yVƭ…J>r_=j<-N-m%.Vx%6Hݱ w_A-q嗢U\ %%nWć[e5Q(Zumy!W qUj\=r[ "JC-dsr\ Ñp 黝@Ry.( ވިv/ViuqAΓcVUTp!N?rC=M~2ucPtUCEWC L[[E䭼@AQ苶L[+BOq㺛ZcIDDDDDDTYnVEL7.\zTM}౪s"st79O%,.G'GUO>rUJ`ַr_A r*Gu1z{0wHםD5G~R‘XPWm[K sƀ xrEؾ}O(|$'}%ֶ.OH^PLg+JĭED Š|N 5(S/!"""""" gV^՘fVsuU(R…{j[u s@DDDDDDTiD_&7^dh=hUE[#um+ִrLխ:tP dXe|3DDDDDDD t+}Y qvuE{2V>.ެSDDDDDDDF]oQo"OlVP.\'RʬݘVs‰Z-T꘺UYKMi.oՖVn-c Vu+1uUہC :ur'X7Ac?߂w]:j+S!S, ҝ'Zm:U?[}fn,TXX Ez'Aڊv 7""""""p_nhUc/Sj t^@'[݊v OO[@S!:E L(uBjwխ)!Zb!S҅@N.G}-D<+Nv`Hxt97 ?֛hM>6 ؾe2JǎCjpMp N V׷Wז+ VyߦP=]"w[aE v5uͪ1(~%5LnݺWTVR[ʼnd-}w<ꀖZKo"""":ֺ֯:V(P6q=y>FDDDDDDTֶE]W_leQ(*_'jLqq""""""pcZ VqXX)t1" 5[t{e 1V1vi`CJՑ-<,# 񱈴LBEDDDD kY*<ԣ=j%[X1PF ! h W1o+Eڞ՘Zso: t[U<88NƦEa%wL*G_ kN9?sM+SX?}O:< co?aЉxSN0?.²_Hx=,UN|ia徻}|;~bw uj̞KV o܃1R@׷5e'4Q1OC_.Zl6څS[>dz/~yU-2bhދNYp(E /&r'|c^>_U0l6،G` 1y8_.Zx1k] wC1h>ÛpŔ0E'Ƕ1[)Zx1]Hc ^""""*@׳Y)N &JCb͚5;p)<܈E۟Ç-ŪU+xC܅0m1#.:?f|K,3ƢODW|i" DּNܟ`z@\UyA1qzhL]I{j8~nC َvl+g!7U70s2\}4_Zvfk?[?aCb{?aʕXx6HE&;bCr^ab,]5<u2HMI 8t}⛡E]"؏^:d@3xLCJ h4i ÀF)$"""R׳QR 9$$"*KxhxRY(ąi'-~tŃbb|+H+0p+a$UBcp"=p /O0숋b"""K… N4w&:HŻ`Tf\An/,E"GB'}I!6zT|v[xjö"]GDDDDgnM|6.ʒ|ILw?v;:^-/ =חp/\ljӭYp`X`D4U\X?M߯0uh=6 O4Ѿc Dz^\~ic/iعa`G |c\B enQǴNN-{oy]pm;n9NDDDDaA]떛uoΖC~rIu?e-7:۷ f2la҇x륨-!zB k;G9ዉp7]<ǘYؿ~9м` N[\X?FEqgS̟&:} Ch'ppf]+uղwi w ``ǧC;qwЬf÷ߍnWDH82O]ظf)-M݈gmu ul)8 u V@W^\$htqusGrws&O{M}LNJǑZ?W^bMdy7-o!IKp"7ފQ\)X9Eb-8޸H~[Ff|k}H91Q0 0Ob^yp 4a0s z7<=sø; F;t16#>pYw y B- Z':/Ż߬ڃt$aɈX83|yEXoyl iĒgO0oq^+p8">uFM;X0eL)f<Fl̛ \Hnu;F:&oĻF})z|ѥ~_Qi9@㻟A g&{w@eHAO߀ C0o'5`O:Qmc3?\'0) l6.W_ 3=bcfQT3*j+0]/oƧߍFu{a_Gت4M܅˰qddc: >Ŋ%+jӨXL$L8K:ˆ?^5b;Q涡`"\-[,0P;lR| s_Dù[Z?wxe ,*ZĎ;ǝ0}3XzӘt2r>/&|8,fk~_/E3|"L L(>Oz_,+zr)Ob 1foX;D}&[5}cũOZb' InѢ(b7WDhI͆׎Ļ/݁ 6?erhD't3zyh;#su3' d$A7ĬhZ+6$TEV>OcgBhuzBa0Ԧ>GnUj5E{)+t >_~*Mkʎ ɨ*|]|jW٪bgahθQ $Df!*6 5Uų<"""" 4+1]5Əꇾ)0s@K5 )~)ٰ : 2lW}Rӝ޾ZVpMf+}/j^ |>f؍th?ԫWӐW5b J QU"p@Zꨖz T3p"W Uw .iWH@B etєXL&&rx 2EUPU|$\Ήu~ VԾ uB,nx}9|;Qy)iU jw.Ğ ].#ذ3~3V<wA/67C;:dެ?f쯆 UX&""""*.V_t7FY DU3g8mSxv5xWpa=g-b Cےpf'Ndtǜ'qڌ lrUT:71$GQ*`s%#v2 60MWA"+٦ZB"*Jcx.N8kDDDDDDuQ1Xx=v9lgN_/܁*͛ %&!!ew WVҲ+Iڨ`9~k3սZEk阿/&rqx!iټ%Efn_ QSO"n 4N lW{Nj|2O9me_wߘ8Y{ûpl~~gt9L76abcp"Kƾ?k\,HmpiXs4&L82aN믖Cض3&L+DDDDDDd0b:SmWv}ccxwň`oqw W?lt#=DDDDDD?DDT^lܸ 7mڪCTXdggɓj8,EGGB j """"" \bkjLMo/,\P) lR y5=D}+ZYLwGaܜm8 }.8&L{$F|Exp~zF^sDEžWA:\DeQpAAQj\-^X(UVVRZ5lR;qƨZ Q~RyoB%̧p[sט<ێ>pDh"kp]{p<ˆU;+A5(sf: s.S6f*q޸iι~\7\'MKX jAC%|IHHeM7tϻQ9sǡyR]^U1y Uo0v;OaէWc!b"cd<:WԸ)9R4Hp"eF6#FM/7Jܔ&olLhE ?Ļ[X(& "":װpAA+@FFPjU?~܅D?~vvgΜDFDn`\> L.U cb:o RJ SGmxhsX.^4Ҽ jom_Q0+Lx ܟȪmx*bęMbpo6qp]&y ۖW'@x߆/'†[e^ L%O~篍:_0bíe՛^Ꞷc&&pw;s:7c=mf?Suqmxrl{&ճ=g!S8V+I&v}7}Oّ<>? XX9i(^+) 1簤sxѶ\N} Scy;}M4}?yThnZp'qq*CCU}GQlH!PJjA{^ @EHoR ( Ő B#a3)$`|߼+s);{vN]ߥMwg`P#LގndʜsocsyT~=._ê5l.i)ύ ۍSYtŰlx$_>'p seElqd-ZrMƇ$:0W>qkY0Yn<}̗fӉ+;6Q{6Jr! NXl7򫷸>ƉA1w2>{:'ͺ4?3ow1?繖{t 5F/aOwV1{\ms9h(>Ϋ9*D<]1<9"aG>_Kx^t찡rϸ^m  ;KX>w]G h{qY,зXx CF%;~Ym{#u[׾ٌ{z- 5?v(cJ1"""R$E~ U6lXy֭ݺuJdr+Iܽ/vqkw Z#Wc١2Tl 7w4|o*.oj WGmaw':blbܨ9Tzh X?p].g 7~G4Q{iW-)Ebu4 6 :bkboЃE1qmiy)3ZDa4e0RֳWkػ04؛װm˜} i3s)L۱`#ݵY-Qɿ}m@uc8,ZL[pe|-oN5,qnfRYeX=oa#@ё> ~"i~} wtj>YteO1R~s >FDDѭ"Rdy%;v[5jԈ}qXjطo_v#VJ r<3BJ [ģp7qfعYteO1(h?{R)}"$G5XG9Z.G^ à\r96MF ᶩop]U_y3x:ZR d`zf4EXD8M)e=I?=/c<=&o?IhOn'1̈́Ь]Hm#lp<' ޲~L1MhZe*+-g/7[-Fr)Le%N&15qFE"Sy:Q.,]qۜ_իV{j;wz9/op"#lifEYs1aӹ7WM{e}('7:=h`q"z>GHvAʼn'ZYsq<Y?J1"""OD bMP//\z9b!!!Zm6ad!RR$K{1d*3uV#6j8V٪? ՞wR]+ÿ~UF[aT8 ~5Чv>L0Oe[s8غm9jc/^cxb~ON##v_ie4}1;g ߿!ӡuA -{w7S Ha?9nm.l8f۱N+3ʷf LLiw2yw˽,9Gl׈*î'ɸR63o_۹ [os0ڻOV8y' cnsHRdymMh]ֲԯ_O?dKB)LREJ_,#aPGo?%{q,Zz Mn'^Z^=h0bz2vbMyk'&Nyfz\}I䇻Y yֺ zyNMz;{?I*R+&^Ӎ(y_[Yh, C3xgDѮbId{fT2O ܯsbDNw?:E`Ό7W}%6#xiJAGkRP[W(Pwӌ~7ϽЄ(<0Y]qF ?W /ѓ}'\Tc_'{AmߋڂՆK=q.;m,XT7x{}b0*Z][dz<=&'Dױ~DΝ煋J}p >F O79\|;4/v^q4'˘X_lSm.SF?LZZy{6<,t4LV8LK{3Uw;;c6)uJ\HV[Cvu _A )$֭[g Q^= SW|6mְ2J\Hy'.G7xv$UX͖缼yof@/.""""""%R$V'NÇcTTk)Q/??xeQtTdo MmHIɟ{Ӭa)fJ\HêA\Z5kZC"""""%Ÿ{YCR̔"F9b$`')ٔ"Ā5"""""""%RdSBV1|aDDDDDD(q!ERƍWv́6mڰk.c#WߦąYa$DQ[J V허,J\HQ,h +p RSSEDDJff&@^a+""""""R2(q!EWbDvn iݺ53aQ^="""rĬ!R")|~_gl>CU$?YK3YH"O۱ңuHɠ>!""Rv\ OAlll2gײiRn]֭k5Ią ԩɢy[ڸLˢ^>_|=#/;$MJ6 2˰D bMP_UN8'r+[H(>ʱCHlCvUl]oȊ0mصtjKA<6gO!ORJ(In Y>^]K&u޿Mm}Q&=cøLgW$tڛ1KS_;om\3C:Ӥa;ߧ>!""Rf)q!EVĀfU W9퓔 |Йټfؿ&sbt_5٘0'+.f/Vudg W/amV_#cX4)JLJQ qc'c_x%T}֭M*t< IJ啸I:ur r+AAA["%YH`נc\- rsHr4#iBaRS|yƞ}frd\Uݪ`fcKQ 0;[Vb`y-Xu"""eq!E_Rۼysz^<ϯ,srkժ5/ϾXIJ# 00C ZvL\3626?!""R)q!EV g0VFFF%%s[ԱN0o-?HmlGFl0sߺhk"+gYޑHmK Gu-""\Ja9BHQ{Igmloߏ6兿q Ie'LjϝYy"""eR$%%aE \~riQ 0zĵYnWBtםT]= [Aˋ"""eKa>\~1O{ڻn-䉑Ǵ {4~^uO1r^u?w#S{B2U"2lٲ-Zd←X"ދ_p{aŊt֍ X(;t`|l5dw,~;EDDDDJkyfp   $wqg˫td/;;yu̧xx׭< A#.DDDDDDDgrRRR8}4uu|vRVJJ5$""""""%rζnʱcǬ* L 9gvӧOC0ӱ;DDDDDDJ %.HoP+WСC^K#\DDDDDDJ:%.HS'O̎EGG䟌(ʺTRF )0Wȅ"""""""Ⳕą,%.DDDDDDDg)q!""""""">K YJ\RBD89n*îB&WѸeZ:mK\xx6禠v->qqPBD|J욚<1-6bk# c;,3tr6-/xɜ2K/ IDATe׳ptM6&LcIFK{xb9;~͑&ϱxzVw/⻬sB0ٞ[&|X=}x^%o"7Ǽuԣ"Z"=_[Ư&[;z&ݫcul U֌汿/ٸq)Zf$:'Y~5_aѨs.4__^X|)iE9|hU5Y3V̙#yaM*f~ETv->qQBD|QՎn bs il@ta_nn~Tn߁ĕc%NF }]Իyká+W@ nv]m7 VK AҢ%96Γ5&BʗKKA0`ԏwdw;5bVDApjns0hѱ)ȪzCU#f' zE'']99XܝWp˿rU1(d8Zڵk).T%zƅ{x}5n,QQ?0/^҆azRv;&.3?K[p}>8aǂ)< ) L%2hl< O3}޷;in;NfA lui_e9mJ˓&T"͎n5J0&NE$NFH^ KſGb5YP<[Yc/FFsxlG!'%)p_Iu;FYѽ0uq,㮬͓}y~0&~$sA F6 ;a/p@ެ\lGFl0sߺ\dh^'#<W{ϑvvR)"""DOqa/Q,ꥂs&|+RNpqh˧! /\W3g|פf_JIlݲLA|5GGp"6kc$E+ކ@ ϧ#8voñ",0G8\$}i&`#4<a_FɚNw)w89y` /\TOb&obI@@yb ǏEK?xDN: ~]]Cٮ/"y#t4*_5=Ru{]{-m"N=i5 *tk%$8JO >6B:<ʴya5z$H.$4EggTDŽ)iL|i=M"4cP}e Y0=NHf«e4G3m]rCN~b̽;Kť>q)X¼/{O{׭󿬑Ǵ {4~^uO1(gr؋Ri Dbbblc6b e4?=Ϙ(oB|ְ tdWchttQ\DDBZk7kf @2p'i{O{g ;S\eLӫnci3](l,ey'ùg&vɂ#g=vEDDDDD u2ɞ畟0 (GPd t#=xPSv,bmJ<=|uC/니oS⢌5Sbfrռx2=|=#/;f'.(_ns.&"k+YO]K.}v"""n,r5`֓19}F Ft8gC>u}vM8: ~9g}-+iS]K|jۉdLgW$tڛ1KSq -FB!$|>a]MXRo:b8xmx6LïC۶ugn YsyLobi:F|mŧą99o֞MfËxrGn{Wz9H]W#xk 6èxuY=^k4*'pW@Ǫ -غUpl٧ͯ1?NGǦՆ xٳL|hU5Y3V̙#yaM;3Ya&d+ |?'""""""e\ڱmҔ+lJ^}գ&GVe]ڭ6;m+;o>FW WmdN$մ]m 7DkY#/7AH?UAv8}%ර[ifyK{܏p;vcP[a# "|rb#IU"&̃<e}ω+)MLבIӸڥё^"Õ+-#""""""fP>cp f[7K>_y9xgV*>.,HNw1 cK3DA\ '.ӁrY1T Yãؙ/I{Vȋ{ٶBؗ/̝uPnߏ6兿q Ie',GT1`fQ .Nh si-P4,({x:WY3q_sԽ{SV pr~9~r<(㲞q10DPU^J:vr?&LIcKl'Ԁj#u~ f~JzރLN8|(NO1StN<9iGLkg׈{'>qsF7w\{6NHf«e4G3m]rCN~eDDDDDDJkbwZ%ͽ6!i ؙVqt}"+v~ôaҩm,؜=dxOrfKԏ*_T-b\˘v}Hyf_gS oؼF# ar|9OBvia }hٲ-7)4vy[z'm<=~%2V^o [өp>yw7 |^\Ur+ǝ/Sڕ 'DDD|"[xX/f̷?ۚf=pu%_:ŤSrڽc;,3tr6-/xɜ2e׳ptM6&LcIAMl&6":Vy1X|V^7_ [^d,ߔ&kؼz:OljIH/yƎn& }mmqKXx27\byɘ/x#M_7t4'DDD|"SWhOSօAvRJY{ `sŐK^]K^# (_q7-#Ï;0s?cG8j$:>[[du!""KZD"Bj1cZG{"Y,8y3?`CT<]Y/s]8:c_8Jҟ;ؾ/ ӨJIlݲLA|5Gs\^.Z[¢hɃ/܂kh&w"B ̀I| o?0Oa=30111ͳ,qO%.Dķ]νIˎYfK Y_&3˭b5s]i rQLZ;o~A (N;\w^oRBDDDDDDą\4)y!""""""3.q&b,y:w{skHDDDDDD|rQdkXDDDDDDЭ""""""""Ôą,=BD|uN *q崻f(֒ȲnU\xjsߦGDDLSB.IչzYg]ק2m5,>Ï&#հ9Rٷ]}h$ B|¥S6}>"""eQye>#bkDаA=L)R2_v{䩻kj݉#f=ͽӾ5-ধ>eݹ$JǮ6澭x?݉#COn3?ޯ("""r^xݕiڴ.0"%+CetnQ[5,~ƫ_%cbrtxF|lp{&{qY[ .gӜ"㪇;aݽWe9Xֿ1 #J%<2"*ܷ'cg1ӷԆ[]qР ߠą15$r {57tM5};߷: Vd#0;ɇ`R)k}$'JxLmp}[q>*zA~[4zES&2;!""".I.ևX"%=+d_ԿR#mp,@Zvm͑_7~ȼdэoD=x8@ Gmۊ1S]$vQK/C-;BDDtӈ Er񝹗/z<P&߻Tщk4lD|?bǐ>}_HR\xjsߦGDDdSBr)ŗ[Co֐H.qkLQ\xjsߦGDDdSBr9.gI_->/%""""""M |cű )Y\ȆfqlCDDDDDDJ%.$(m6DDDDDDdQBr9 fqlCDDDDDDJ%.$y6c""""""R(q!alCql8!""""""%xfql8!""""""%6c""""""R(q! ű؆,5 bs!XQ yiFBΌݐi#sLn6Gt+w%Hąb[cű kYf %gee}LPi;xWe)RF}BDDLSBr1_ql8a'R"N\RzF_()'DDDJ=%.$Y\|iRV\"R9Yš$ֿПN]{3fi*`rl܍6q8pS7κJFBykBҙ&o}"%H駇sJ.lz:T]mCԱ5|;x ux!OGfuX?[G=E( P;u/"""w\b.+xVI."ɑUsYW:vFNdAOdfuoÝ-P1ûnQXq!@\\\PBrQBDDDDDD|CDDDDDD|2ܯ IDAT""""""+\L.DDDDDDG(q!VJ\H.[PBr9&ktąhЋo0_ą,%.DDDDDDDg)q!"ű]yzSux854絟pZqWOjJ\3Ւ3򄎬]}NNk{\?j"HoqmL6;/':v.&RfO-q!">Ķ7f^^i&wOd;ir2_`(7zhJ m !)nўqtOf Oִl׃YOtO019>~\7oW}j=;`mډ64Iν3zovmG. ;[?&qiYFB!$|6;*6Odo6Z:y "~:|H٣ąSb#+hh3*#>eƕ|ȥ,~w'+}lD=∰Y29zOKהشi-_<ހOg V9Lh%f哘z'.Z1)_++ظ~o7qʽk> il@ta_nn~Tn߁̩ㅡηO\>!"" =1fz8ׅO]IJ]3F5K.T<}t9Ӈ*+LGs朮*Epto .W*GDoDܨZj7Y9 au2Dac{4qf/DDxywņazvn`ĕ;>q#AzS>{ L`e G :].Oq|9Ow歵Q?iٵ5GW!v::<&U.oD?iYd;Qr+!'DDD%.Dw٢geFEfLx5=;6:3oަ~+O xq 9m6>´UX2c4}j2C6"{>ABL1HZ_5^ ~07<0FG.:J Z.'=]Ocؽ~^u?@9xO{{)GH![Ϊ~ְILL$&&6fqk!PNsv~; Ɏrᑬ~=jH~\y@6^is%O:J5 )kyfp   $wqg˫tUwzMwsI:mS.-`]TVk\ ^?>o KAtܕj"""ORBDDDDDDD|jJW+ixU+.4%y;އ3;`lM=iEDDDDDQTȅllv== pgsuْՕ{?˟"""w|eT JDND@PJQϮ**rgE=E@z@PD@Q@ZHHl $L3Oٽ]32TQ[מ{Ћ |5jqW'k KЖtKNjּxQ]׽Z]Ac?#{]\?Pڏ!=Ԯ}'u0\V"rx\={ouiV]C3蘼7^[=PI{G=5k>7^]ӊ,VSc<˷;}w^mԦz=*wrj3CջsuYd(}zxHOo^qsG9DpQ"۪W{_Y2l/FZz\IRN԰i[B_^uH8޹еz㫕Z3]xcvx Ym^|q {x3#n}KV-g#cq EV\zOKV7SZWOSkrzך؍jzHKzQ=Pׄ/g+}iԣچf2,XRP>wvz$jk#4as =5o~3M?~TwU}5Myy`dW6l#koqZW~{_-ةt$ooqM"kA_H!#?`PT©낀ej*WLׇ\}עWҺC92d(/}6HЮͿ*)++%cs+9X\)y>jrjڱ}a>O^dSDGChC6MYǽI)ʝԲyucxeG#X>n֭-R~ j7pjF--ԮlsϓC59[7wR'V*7nT['QnC~c>[\k-ۺW|]ܽLNqo^u~bnfͶjxlV<7?"osj`|;Y=B}Db@g{H?R(NPjdNU\,xb?ɺM3_\egoSR&.ҾjXUa=_Ov WjW虪5w%evnDƚ NH7WI4W:/Y󺅘ʆ߹SaMnUQ]#J=_cG'[.H cnwg*U%)YR^6ހ'''l֛׍S,~es_QÈ a>s0P7j7N5@?oޤ~΃Oja5/AHmڹeʤԵm7>?u2 m)e3<@-rӎȆȍ=զE tF-H7O}=uwT\N^)xniv1y[[ߔ3$֫#SԾ`=&d2{nI͚R۞4s/PO}=:ڵ.kg8oMYs1/;+;w yʤtsu ?BjXW9Gڙ}V|C+⡗Mzr&UJhy.Ԕy]W{v*RqN'%4{GFK&:(*qe&\OWP҉6nyqf4 Sòq{x3#>&Gǩڧj=>񘗿ϝx~;79GNXR6=WMRk_^^PܠөjfE\Zټ}ԮڍT'4_V"vnbz 7lS/QHaY[[CGls( _OuNu~U ,ȩ~oeJW=JIN-U5ŮbΌtkO}L}sޝϛME9vT7CI)Ŷ52U$2]7ƿ_g(/ס&ǎPd9%TǼ<}Txs8."6UTQC:jwbSd>yx?򠆿z<ҴL韋g*:t(I]Y-hΌµsWw W?ZUsO5^^y%Oܟ%mao<\Qpݒc5ffW8T4eڛ{ձ[`0íiȣ;'æ*}܂JHf+q6,7Ҥ8>$\(Uiʳ}oR-dʛi죸Nu^ wҾViզ}*䎺)nZ^$?zJZUjټ1M GW뫉/$'ի}hCLR/]R TXd0IߩeO'YIreb (;u6YEwI6WXsu *Iq]%k^sYٰq;w2W²+ԲE s9U(x$Muoac}/{y8X68Ep,X, `Y.e\"Ep,X, `Y 82,rWw8Ty~7]sj,?sq(ן;+;@Gpb2"Kt\^1'*9zKMvhţo:}7e6I&S}4 s2pp&lvg~.[Z0yzwi]4,߆y445+6.NWRd;:T};*}'[;!`(uyx4T^X6<\OnkLMVͿY~֮VoI[Om'e||JN]1+aR{ii.q7 (-6k uV5rH5rڿ 9:)*Qsp$@Yt V:}6ov+v#Չ$j.(U*ǪZ\%'o+&:cSv(;{^kjmzI7;'c|[ hVJсDwa'+&Bqg])t "9US5՟g+*Ұ*K۾u VgPTEvo̫ۡ+_\t3h;n5mO+5M7N,ރ۴]S׊r=5!F\[y/=4r~2e|Qm^YֈoWU 8-|JN >]때~pw ~b{_X6/~u$G_{@P/vI3 \)iUD}dkihsu8"&&Z/h;+))\G^$&&*66\]`tBJt\@yɚ<6nT|NjTX|Zha>g*U%)YR^6ހ''߽'lyc^7Nm~E;#.pZbb5~Xs;V11/`ѐ8-Viwe{R7'xň ;v3gjڵڷo$Fj׶qMjPi @yDpvx,yy^|vޣݻh'j(\ ۭޣ l2x |+vةYٟ֬Ï>Ү]4cP1Jӓ&kmBbcc ƩqKrrԸ%0n} 8yy7r%bΝx,l6=;uڴ1w)צ2Y6M}vi('.P">9S^W T֭'kF^/׫f47 5kJdj9!K*P\Dyꟈ(} `Y(5jT{iQ?(ڶ$d>=KRY㬎A&MMcW- guQ\D㦛d5k'JX|u4Oen27 k2 C?:/Ëudn2D }BO@Bp3QjDz;~n&-ۭ[i;vmߣ5e]&MMMqm*1=ni4ءzަ=($)Csѐߟ{Fwx$ektU]׮_9Pzr%ЖtKNjּ|{h qT}{V,J1SJc^ޔ. ˥M7(ͦY?рWԤi3 z͚l6nF͘\.y7(ӅN7JX󥞉MS|Er$*F5/bw}[NyW;9o¤mjWZf͚] J]:QæPSsn mzqH5Z*4BЄ7|6ť4y?VRyyTټp (˥c׼9kASNNԩ!iޜ5vr:QnuyER;oVZGC5ZtT.ZtQJBjnBm<#WzjX#TR/QHaY[[Ѿy$T. utJ3_ IDAT}ΕcpRJ1/J9N!΋k¸qjJ ˡU4GfLU)Ýy=|FLQo"`Iʊ)@UXH)@ Uͯt#\%ZvdI-(JUjXYl sCUzmJ2K)5z@yJSy_L_ʫ<%oxK3ǨOKTjԊҞ?*#I9gSq J^qsw]nrbFGn8=e#.B6EtxD=|?VPf7E$HѺS5{[QUUSq J^qsCG7_^}9.DQq5@YU'w:}z`ټG}Onk(;.Pv/v9:%5ml-m,'11Q >ts$HsU5[lظQ;Raj٢TqdIyGT\{ʞr|S<˾g/:ɺq/ln+jqUX, `Y.e\"Ep,瀡9-hVx@W9S=6@y4W< i$eT.ɱ[a|f=ZJ 0ؑsUm L߯*j j-ճPq xAOu~*)$IFM@C*mzۃekվE "[MI5muAm:tUN^)O}=uwT\N^YwT$բgwK7\;$m,w'oWԲ2n~ xK"@GxQe2B5w jZxI/| *F5/bw}[NyWZdmh9^sW.ӳ"6hS4;n}*[>_o=6Pͣr''Pc-W꥚H](\6jk#4as =5o~3M?~T$Pұ|꬞I;,\꾷4Ξ5cAm վu-;${xy%8ѢWvɦ`Ru86&WadSj)o}|U]_pjgjQ"k7RHOR;nSJBimtxmO_쵯}/R]rUM '$`%q"5і/k̃i i\%oJ?ʖnSƟ Iٿkь隽7zr3ﲀvUS[ᶀv#?oߧOVS;)zX3%jpztx_5t$PrV~2 {*.x=^[\䜕uiQwy^^.ݣ'O_S[\-U/G5R>Qyv[f?ij/Tuީަ-4R+MUd>yx?򠆿z<Uu K^`U*= Z~d)ϓgkjԸlY)JɎMj(&?̜^ISpj吼ڼpv'8%w]nrbFGnCރ^ԨFny^EurdP^mޑĭ P1ҷOԘ݉:J/wGʡ4l*=9ETPX&üuŘu]7T1+~2w<CG7_^}9.DQq5LMu~;5g8/"캿I|\7ǔ6O*izB IfRQ. P\pU sHzczv1mOH9tMJTl`T2MwgklkeZAxѣVbCx@yǕ!J"NI;[no\n ʁ}W(QAsW|qn8Tu鹆 }]æ+jjR#¯JAc+!;[*ÓF!@F6=!C*#HDtA`NIjT ?ӊ #֔yX(=׫oѷ(&Į[OmRjA q4pݲ$z@@pshT7_4ژ?2|9=Q+pG mLrk1_ltL-#T?[N.P\0©'_s?SN&U+ ܛ~Vݿ"M#ʚMH{({|ciR\E|ż?5E -NvC4**7d+?ge Ή{< d\Ǚ uh\8L?]n P\]u|L&pT3hqJC+H򍲘Q̓5]OP\(L!c;ǩE5uaxG[]T(un̟".W(;.pj;T%pح&I$6ԡ.e eO!)/uTxԍEl! +GWyDoo*򨍨`C|酯ʈ (K.p**5r8cnCmԢ9S}|_;=J?E C .ܓ0g{ʹ׮Hpe Ѽ eSjه?% s_d=[Epƒ C7!𵏜`8cIٞ2$t8=JwRo߱qҀG'@Gp3H)`SkQ)gXV\y )!1WT7ҡjaSW-̡"|p(W2geAwuCZJ\u ru07D U=F]Tw`G+F ;۳$I.MC/ 3(>43,'e 7hWoEAX/T/T/$?sL=eΚא1m6.SsMK4cleΉMtLdIZG(oDĹԵF:Bvӣ,CrkeT-Npǭ"8Q X6Cj"4VA 69%I2:[+&逹(lbWPP#a~u$Tehw?\elWbɞU?*%IOdh }xy&_&gGwh`ں=]_:EK=ڸ㨞8eLQ>YS$6I3_\egoSR&.6W4GU S=Ayɚ׭psaƍ\ ˖P-LT$%7`$$o=<=e#?3y8X68*,X, `Y.e\"Ep,X,oihs`9*(uq,X, `Y.e\8vS`;@Apb/7,(׮][{zАRVVZH#׫g}Nz (@jDž s4B I р4 47Լz t=S;nM?^N.88X?^w~[t IDATAݓO>N2fo*=?hhݺ9=2rZn%L("''GϚ]P3z=nk7ZIdzfki(yyyyy=z܄ +22t׫Cr&ݮȈMPsCpb U˖j԰G5jPZ6ѣZء?Z5k(6 %СCN5@&*4,D+V27dg(Ql6M)Wss?EO ;wrf:uXo`-ǎ#U*33oGY ZBBܔg(,X[3S^݂}1 aRsaPŠr97'\X}g.*b^rfo`-\dYKG:+q/JbLj ڵkoe;me[zpv \*ܔGpbѺUŋ=$У  9.J (GsS:pX4լYS& x8],V-IY_r B k|(.P,l6ɓУh5qC>8 ,%{,^ \\wWa+33233u߰IRzt^J IF#QY,OIr$E_/ZXz1 ?X,Bq#@q8zg e rM믦'rM~Iǡ>3r8kgB9rD})+;>f1ҴcJ=?ڙҴx3h:+(Z+]ޓ5}?,rOv?Q|ŪQÆzC_ՀWR~Լy3I5g\-Ky<IRPP{f^|q%AGErԻS?T{iI9rD_%Bo^={*88ԻCk7Qll;Vj׫^ZGOVХ**m#k~H86-U;xn׶ĨN IvEVPN ʼnŮ[׮zwt:$ǣykJ+JR7$UѴ_VӦEEX.t.׿^!yF&Q \[vQk4SR|Et0`A#G|wG&$ޝGULV ".*Euߗj[U[[T[[U *j @ !!$d!3IN{N2Lz]9{g_9;3Hx-jQy-6OBȞ8֘9O _fga= CVZ@PYqd'vÓڰĴ%`mƧ_ՠ#ޭb2B:~]ZOwBl^ڼc0~`P[~]!;#͛2or oV`Gj_ߎeU{Rk0gHɽi_&XWrD{"[>=@x_2;3BNF|  F-H/jG%5.dffހK.^16mڌ}9߿ƏY3g@VYYb/g֡ ] _NyXu؛v$FNAbnlklN^Yi_)$)JW2ʒ _e[Ʋ|5v(2c/7)>/wn^  jv۵;? RPo#\cAdBdi>Ԗl6aWpe%g zR."xQP56 U^=UY虗x_z& ౰[(=+#p|r=ԩ-I=: )|MX݇N@׎l_GD*TDG%5.K/^*SDDD΍7N㟮\)C-;ۆ /@bLl6ѾqGKixzJ7$y115r,L9C ,\k8>~ԓi}; {`¿ٛ78ox ={wNNǍuF)RPb*0s*$aԙbDv 8~X0vxc8:U@bvCnr}Γ<ť(޻53SGƇA2Ō1S~s/`' =p%;47 %˰ v}tff`xE-J"+7 R w|M˂s[^/0t!sz --v۶m:m23X8j`x_ϿŀQU])6}} C62}QR懯hANF5RQr#' Ԡ_}ɭ.Rسu OB_(fmbP1`<'/~:*VI1?[8PQ7s|M{'Pnoc1زe >Y1;v`ihtxj7(FJǒ77ߌ=SO:FjM=d}y曱%(--!""8?{{M)'?CUo?*v=2}ș4{U(ڼ?V_}ꨓ1#W`H@ FϘŏoJQ )Ŷo"gq5<w.*yþrUUUK.;n,&pRRR?-C"PTcP鈎<QбۿۋJ@2Wx?ěɬD}@f:x,m~ڃ8PQ*6II H2K۝:ֲP7{t‘<)y(8ÛW o(x_,y:"+BɎBTg"k)V~StxUߋLnǞJ??rUEV\wmβX@ F nMzƘiXSx_›KbگeIJl߾۷oW ׋ ip?CnDDDg~Cה}`>6鎟v;*xͺ^? țy /OŨF 5@8\|2.@t_ޟ |V|IyG%`Y@sp; ">][o莴1wpᤊDd9'_Eu{^ݪN=7y۾GϞ=Qg/JKK1mtdefݯ ?l)݇C$8#amي5C !%]NI>$gSFT1!3;Յ%^<߄͟/Ge-MLEfA8CcuEiOB^Aؿz6lO1h[ŧkɝ:NHտ##q%DWr3eAtO]OQhZHJGͮR+ Yر; 3ipD?) Wn/c=%/ B8Vl)$tA: tH߇~7)GQAS]L>5=|Z Xm^8E *9%fWg0 xSODtyy{pAQQ/33_x!?\tQIسgC_lp'ߞkl 9aQ1M7e˖aҤI2h܄ Xb s~| qm5x_}}.]T-["'7 '''c'-9СCjM@.yFdp#7923~ O:8$z_"Ԣǒ(AueӒX|₢W{7gc„ 8v$9ע{Ͽ}+V`Yp]ZZ|O<$nzyQtX,ZvcyH/d'{Pnʰ;qWPI邡3@(+BίzK)б3$x.(*6|-~5w.D1ΙѣGi|8cqܱbժp/,zuYz 8PIDDDG|qւ'q k~q'-nKof۸i.E χ_ϝg>լE iQxfSvΜ'7~;.blܴITQ{ jmŗ^Z}]v<+^oxy^\uxgеkpIt~\|Z\gÀ+Bjs!ޛ<џYacݸPTT h…:Q}Cg.[(**E\ݻwJ"""ji_-6ŸzsK-69.\P4ovS?n]ֵ+us׮]iUO@B-\ W^/&/qk( &""""""Ņ """""""[\ """"""Ņ """""""[\ """"""Ņ """""""[\ """"""Ņ """""""[…%6""""""xvXc…~3ۛKDDDDDD햜yo{\h7ȅv7'N6ݮ,jkkqFTTT^z!==]֡\~aSyr[]QiF~ :w)rawa!߶ ={BZZLY~D7Bl޲wO1Цm"mB((pz9++>IQQQEVTPPߧSrڌą#M oRaDDDDDUj*7ϲ`Yn )fw|9uh """""(DE믋sGx1 5 6qOX=7Zljx]hH.v$DDDDDSќ yk$mF<-\ ԧ, uDDDDDB,?7ۯNw\inn4wr{AQkOE{v~.ïCmEtsՄ-~% wƉS§2kp3pjqB8g_戈șќ[6jpy]5ąz~4Ă}.L->_p ~uXvD$jO<]x1.quG_=-zN|8s,|}pʜp$sޑY yZly-{ {!"""jmeY IDATxزe o߾8SqiϸM%u,|4[ةXt1r@JL6>px\\߲>1?4 8~ d(HLwz5f˝cO+nj/4BkK.ƫ/W^~ \|1x-\}5(** eK~z2צn&N6--\8]x˼W7w2}vv5~ Fz)s1P"qX+0㸉{I8cSe0~:z[a 8~/kE'dÿgs&8秸nYPe7Oe?_u:0 ~:Twm@rky0fDw5˪j+P5tSxyŘ~x7?"|W7=_y{WMX_2_qȜY({j\u^ھ?'4/ضoIDDDSZk_ ~Q(݆8cG 'ndzP5V }xp{]*YϚ˞,i ˲0[櫯pUWaIFnN.4 {uQwF |LL}Va5kD2]pŕXÅ7M70ھ0|?>[~o~(XVUJ'[0h4E >:;+y's.>oXbx_zRmx.K, /7XEg@/+={r|: bzXx1.=w͟g}֠sŢŋPl>=U;-Xrf<䔩8a7!7vZ7i|mѱeV9x0`ԨQ֭55؉7`)0 :,{E|2,\~8eu(\ޭ@۸Ɨo-ӿ;_%{9xkϾOL\7<&~O8qøk><cv(s$f/h. 5)3]p}l)sPe7[@zV9v*GQOYue1I>/P;Z _vy]Jof2*6 P$Pq|V.;Mϗދ&͝H؄"(:p)4;^3 e0kFDDDԪ N5?(f8{UUUs"##.|e!1df!*Ci={; 3VduѼ`]cԨQp7c1gbpĿ76@]qSqI= X OO$4f6]eW`)aYG"v5\Zם3zc֬cŦpzm鱸r+;qsʵZ2䍱N8C31db =XO|??/͋߇Ҁ}(d ' c-0|6jtmXsAn}7i9r$n7> ~uѧOForزM8k:N?7/-7P ,xrypeieQwj6>gI3fङ|˃#!U{?Ϙ|| Ŧ$j$\…2;9k~%7b#pͿ8pQNcR=qR HLW-đGaW[6#GÄk|{Ga0?aqVLL/~ 8#FOIW?w[@x4~o 6~&J#ԳB<ȳpaO5bYh\pPr/ """gy&*\vu旿@^n.?>QQ\]-r5;pub^d̂iS瑛-f5T<ܳܨp;p[Ux1k j(_Eょó ♅ s'Icr0ܳ y׋jE(؏ xWח%K7;o3 &S~5To{7Uk" mmsStvqQ/(FO/=\, tv/V#Iw{Xs‰sd@aj٘l-J _X\qnz@pܸ]=R'; >Qu:oHqz 8aKޫ5kx :>,:[ """"{3f /IӦa"szUg7]SwCj.yQ 8ϧUi]݇O݈ _qng͚o=@Ȩ0qc>fY(^+8 SCb\\;S"kW$o]@xZظ6g ~)eŘ;Nwlu*4ߓ7_ߟQ 9kgD tnx!L( !;FJsXMur41..iTg㪯DEm>}_b 6/YUY92|ħ_'6n6QֶgpW@Mғp/9:aQ1M ~qQ4Xw S>ѻwotE,[ &Ma#˲h",~ҧOo:s&f: /';}xtYsP+Cn66ajaBЪi!mXߕa9Oku:9n1ng!:S {)o@pAE_(bΧDq6tcpjT[OJF\$""v 7oe\) =ztGbb͆ 8XQ!SЧoIq%"~Ij~@ bzBC ("HCTיX0`^Qq:FX*ZٷP#\IOu| Q3(//)rd8##C<׹O>sZWLuVX/\7(±p5[77}DDQ+JKKtBGMsW OIOLخU؍! 7e]Pu& (X> 7j?͉~h LC//fa:Q<V} \xv쫱2 """"""GrN+7N8o.d\½aӅc=P7[mr""""""xV#>?"z@Ø)rPz_MMQ7M}1y""""""x#ikLq},sq#O\.Y4V}loi9""""""xaMs\rN,p1c;k,\ Tc]Dy͔+UjLDDDDDDj>zNQLqSL_G4g"Z.ߴe^JCq""""""xSXX!r?[UKDžJVr]LE x,u\P[śCʧ-r>v,sipvՙzL-qc $WOxDVɸy\QH%jԦbr\^ִ9kZEsL.ODDDDD/MMyo'Tki9Ӧrz<Z0U@ՊW H Wuo>WL1]|?q!Y0Oe\Ez>_.*}-~@.lxV_6"U}SLƒ}"""""49v@jopqB_pPZ+sX1źPbzNur[DK.\Xh8Vc=n;'@ =gr*Pnp-Gz=P> S $^mΣ^'#c4v1"""""Ñg6[@5Sq=? ƒ\:-X Zku)ns\`DS^^4U#/X˘z2C C!H}TD?'S ~Nɧ+d_L扈>3q7T_.MA-2蛊 8sydLVM2tvyxr" >6,1S &~a@-Z1jc:܀E ONW׮5$=fGr&C՚bj6}: =br_=M)*n;ZUK-\X0OE0倆~t*P h9}p~4\LZsC9uP.bP̯׃XV}l7 '"""""r(y>V771}h/,qmp >&rfjz6}}SqEK>]46Și/*rC[Z_Qq}9k5pa~2.'kW?jjBB_@NP^u.)h5MzLVخbDDDDDDm>TLCٗcZ sB9V} OYI b^s;mN'ƭ.,D>/j@/N'+BB1.bZlύPLCGjbjSd2z.>D|Rϙ jA zNmF Z@h,kզeLє}.,'2.:3] u J$T_=E/E+ 0+WS!O?Wd^'R<Q[cd^ռNd^i#r4\Py7WiSy;2'NJ]`^o>[ٗ5:S,Zc‚I/ ~ƒFc‚^guEWV) qy)g)Ӝ/}Lt97nשV"c&ܦqwImT…e5z Z\'k *jE }B_0h$ZB9U#0d_Qc6V+}v6fYeh8w],BZ =zPk:5MjL18fpa!ɰ_SZX^b^S- dʫM5tvc"""""Å;ڍ-lʹbe!zLq*odbN"w텋p,'զFrP_p@͖ ')s:U|D﹀ZPqU#ǪI-Q[YXVe݂ K7 }qәb}<&ZzB8, pm#~QE X<.HX"^zZC>dN2bTN$DDDDDDmihG֪7uVT̔3YlBAߣ!cT 7nQpx/sb@ AƒZ|P5x z^ocu5L9;)FDDDDDɹ `b9-Py5 zd;LVZ 'zDsA℥9/TC?~ }S1әje_ &&9sbWM5%zLqS n#bݓzm\}[\&vDZ+l9S\L.Xlⴏd'""""":MMwSi/vLN }E⮵N,'rtzSL?[@D\?ʘ"vy;5r~'EWc*z\Ȝ3ՙbS2'zLYTLoFk/\Xh8ku2B1= qS}tr;N9)Z"""""$vNj]cƦ:q]\1M(:])b5q w݄\d\M},zMܩlM1Vg 7&""""""grn7qqΩ5藺e_ev})χO\7& y!jlGB6/΀֪s*&S=s9倆y7^gUqyczLX[M'NsvӤ^~d^bv9/[Wd,X '"""""jMe>h`jeLL}},qz^L}S."ў:)&뭩^˼F#ɩjMUL9Y'DZODDDDDD:iɻdN9yrl&N5ND{x#۵/Nyqq=e+:SSrvQkhDiSz*2ni}̛jXz8ȱܼkў9^5<h}EɼZزo7UCDDDDD/591Me_**]Nj\/l 'jlתIjy3漬TDDDDDD<.gsz)ZSL/M9i&6c6"ǣUeG9e͙}UxjL)rlb1usL75@:D_s̛jZ)gE+h%Dc2lwM}~2'[19V1ٗΔurlMb1qu{̦֙d \'R봏T'MهpԔɴn/Y/}Xc;Ѯs%_7vS4[uyQSdNp4`sDDDDDDTi2m3M10`dlu)d4MMb9u{-:iaO:Ⱦil""""""r7nJݢySLTg̵oۉv]Db9u{lu@ڦ,[0gʛb+vq""""""-ɷ+SLg7qӾvc'nkE$HTg`k:].;iξDDDDDD9pb]_gWc՘M1u@dd6GR 4w˜ήήHDZ4m""""")HETnN$F&nNuN N9)'crʼnuMe\sLq s:tzuMRHH:tlb1tvQ{tLySL5u28XG%'+2nl"k"mvNMdM1`9u}d8EZ191I1`񈈈ڻhOg˘jdLs,H|2"pGZc5Q)fbsN"'fir獴^/)fǩ)s[GDDDDDDvbT甓Lyъє}Oд }S9o9""""""j{=Aw:].8hM'*atNpQnrߜSέEEL:.qw5J$DDDDDD" W.VsӜ}"&y=Wr{,u@dR!"""""W-5َ/Or„y^""""""o" 'Q, pR|DDDDDD Iw&"""""jADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDm(]IENDB`kraft-1.2.2/manual/images/nl/wages.png000066400000000000000000002247731467704360200176220ustar00rootroot00000000000000PNG  IHDR.zA pHYs+ IDATx^wxU{f7=$wXQX"EE QD}T7D^%H/)ݙINNfe7لw]{͜ylKDDDDDD<lGyhOyU:Vy@pQQCDDDDD*jh^ 3Vy hsg[qQ f2H*86,agu;1|'"""""$<n=CFk{>8/@}(ۄEeNCyP Wܗ` &/Iz06"mC٦*k/mL*fW>YyDDDDDDN}SYZŀ]V`3|~x1+VyV1W࿟* ~>@c}ܗ` 6\*zXo6`S9jP{<""""".njLm[Qcj6懬"'W8՘5'ض?GDDDDDD th۶k1_" >-Sm[ʱ u;"""""" b*5'ضL OVQ@'58UIWۀuL<_}2/ض?HO?\l'˳[` Qud:m`ۂ]n]+_۟` J'hU]*ϱ[ح[뷋 })϶DDDDDDѨ"""""㑯 ]][=)Dn-bVcR[]u5.u;v•"IZ V1OХگn/ jY[Cqq uy9Z,P3-Lh}"&[>moL~.]%zo`EڶZڭK #R] Qee6vr\>3,DhKujpO\}O[Զ d]Pi(})'bbiB 1ODDDDDDMf5_mcVEA3uD"> d]^ 簋+W_P=5>la@]WWj@]Wj1ե.1m~"""""߄Y'RV}rZƪ׺vV| J& _/^r[]J Vq_mu,"GDDDDDT0'V1-E䘼nS/%Qrn]nKA)o_Wdj2/奺>9I(}rj)&""""""I][eҮ`_zօ#>y)XU~E"NS'j@~Pl |!+DY".u!m+TU`&r9j[O q5O}qq y(b"W1ML|b[T}Ǐ/,qd\kRj]E !-K5X XF / qb2_su[9.^UqEjAǧ |_Z8cLS) UGQt{=9͌o~߅(x\pq9WLcbo Z 8V1A-0v1WpHW||j̐ONٵ-ij%""""""h4hҼ?ii5ˏfg/@邃xhx+bA W^.V1A-2X-`.D<@} ؚ~ʼn* 9;P]qz_v4BU\h_}.b]u9O|ޜr0a]zq5#)qj{=DDDDDD~iX`¢KKe3.VV1TwNIZ{/x<a/]p U<<4,I <(ՐEq>K DDDDDDD!sXJR1}3/䶈4[| 6ߧp.|Q-嘚/9V/~q@%')m2XMplF_w ڐ36Ҡ;#Wj躎y~ ۱'"""""*(!qN:ϕV"O͑ǕS#*5I݉\Qx/Anu8!ʂ^.r0<Qh1'Ԁ35rlHJS*@#we}.Ofq_(7퍛 }ADDǃ\_{oOEF RԮ1 qqqjWD]C݋^ _lw ƌFdԀE;v;8xйIjNO?"cǀ 1/AnKu]͑Y".rj\mˬv]L*N.BͶХ_:bM9(pnGrMhzNe?Nmt:c]r i]@rcɍL_ʎ\/e(:5qxj폿/Cԯq8躎n օ ǃ~] iF^\`nxut45n71_B3OY]NSӈ(lB8kRN'OOΝO߄#Ç*^tt{>BYU)5reƑz5R;v\$to3ONty/L_& ]>=o7\m!rEDDt1{ESqm7Uhڸnk0O-]:oᝩbOqRv[=? a/`[nL<ǃaމ}6h׺r0"|R@guW#-5XWXj5~4_oMygbSp`@st:st8p}s{kl\.\\rr'Yg@4,L{gfH`}5Z:ϼ4yyyšqr83[_~Ac=t;x#͛΁ps>p$xw&""bcbĈ1װj: /OTrrq<CISm7֬øIS1!kC_GɣPyx*>G1AW+*p!w(.XD|.X7b] cWx{s̜Sjp8x-8XL6vڍ͚╗O_~abC4M9ȧáÙe~&_QDu\{xlڼ'w'G<G{ģ^ې8dۏgݷ݂-}5:vhG> ˅F<3.(~?+}{_ڵ)ݍ}̹ i{63>RSS0b+^\uyOtz6F<zO_ .̀Əò¤ ^k 5hԔ[QpmLⱇØ SrR;G1sB8=O~}e&VZ'Nœ# Ϗ{5qչ(JvqO"ܯ~XqPJֽv. ^d>+W؉vhADTu\}eءb8Ckq1vcx<ؼu2QnQ0 Y|Ɲa}?+qx.9,gt)ShϬ}lo9g4i:/Y MѼi-ڴ<Xf}~c:|5 b%\. ?+VAzVDDn֬g+gHxB1q޷4h07b]9պVY*MθRrnVS{*'▅G^3l"Gb74k&phМ_o ȡ9J0MiRLL DDU̟|/<+z^%_|]R9 \ 0M 5FKeaWh[UW3ݶvZPT$%huiVҪhޙq0-c0#-= GrbR ǻ5qYn43^-p;-CCñf_(:ڳĸIo`caC&lڼ:~̬l:VYYY٘4_|}>قcNjp>|<5L",쫒gѧ]ru=TLݞg3a ^8g^(Wa!3e&+Wsc&%ۃeu)ʘ ScAL h].RLGɽ/nv8#*M;Qj[ԥKE 9&ƪ_Lu$֨[ZCĸO@(y;`C{Z"os3f8ԯ;v Ƅ5j:4a2vs "# ֬[y}GIIRV;;w5ҔC'@~>8NoBl۾qqqAiZo_[nIԨ͚ .P]eW&㦾ףMb5Rߖmp"..ݺ;9r͚6QDDT~+WϼeϢnc:۲U C6e@I!vmYcņҋXW_O^ rV*Eg\K_ZͳiVrTTС^LeLExvN(bSJ30iXjMqmŪ5J&U- ڶ.>N׿+nF=U:|֬_TJ1g>^v\z(]qۀЬicw~L6 /WL }1]`3O"9) 9GO]BhqϏBRbbvwTS+ܺ阳#<2| xw|s- s/v몦~O8a;o`Ͽg)DDp,*:BBaM<-EKy]M!X}mh^X_yvN[ZϔP+Ir[TRȕ)x)hkCSî4Wz=.<7džp!Liݐ'/> ~}-Uvq_gD\P۾rL~ㄅ^{b.@;)|WREpaU҅1Ax޳.*.>V%0'#bi澢O,[f˭"gꗐw}m/b(jϛsp@/AADDDDDDᠡx!}"Y2պvW7T}Q5nL  amk """"""*y. )"Ρ] .^!"]0 Vc;_~'˰r:cQ0Q@txR<(hu[#_^"2qAqV|Êz+DQCEH[hADDDDDDo^kc/bV}…__\ޙzy |Wm LwPR~ɱy6izUAiN/Uv1>YyaUY ;V;jm:V7%RYe}b2XDBݑXSۂI>hvcE9:Zq ~D2H>aߡDDDDDDDaaxE;.O"Rv(mת*мEp` wpQs]ulG'܈t"bg7u>(کYunh'|N5P|}Y>ujBo>Xx1rԔr4 6\AOqGǪm|Uh+\;T':0U)@3f#l[YvL]媸 #JS"""""*_(CW_n}Ey9v}"ӑѯ_?jWnlڴ SL)ަibtV?;g?g>\}94M4atFVp݋ 1.ie7 ό&TYA1)#?/^\ ~aƌ-SN9{._~=ѡCRq^f2̘GZ\t395'9XmHWɽČC2b'Q|o}UIq t<' e _|1GDQiz衆a&Ѿ}?{XqZ,:9c@^r: nةAckp,' HLMErl| x\y{АPjusBP~*3abjnd=?#bjFbl x4$:}E_GRH]nfg#OK@JDDDDD<sY*<썈bӀ r|@ !))Bv!blKm&u#AӀe϶(<˾,+w#-艨T\t@ jÏccO.Hƥc0oZ3`7b<&l{7f}+Z 8 S,s#HmNzg i~khV;#/-Xt!:w 68T<|,iznm|i+~׽G.Fؒ}X] q`˸oϊލU?ѓ1[=t(Xo͋jT( t@(b ddd$Tt]ip:hժ/b6>~14]XΓPkPwߊM6`bAs nzwӓ_N['έ*;9Iz﬉س#R55h xq=4]FQ4M ^~bB\ãOCL 4axadƘvGī{l<[h8'=Ǘ'"""`: 4ώ Mp G!:tƌ3g";;[.I&aɥbZm"8˦?9eX÷Ž#Ew ~B; V/?݅E$F=[lZ>2b_GU M en,VxZl\xH u*'g|źo㫫z2P -)~/n4Dοa<GKlODDDDA W`UF.µ8?cسg Pjt < ,9sPn]5*M2z8=ຯ`Ħ8~^qeju()  &.'ICˋƍ_~c8c:H`ݾ 6jo7& ©i΢1:РiS8WrD͓p-CC 6k:M.ꋡе<>G[!E'݅- ؟꧃u]}8ԃšc-СHm:}'`˄iaӆ\?hpy8Qq(΃oƕW^]vY"4MKgϞTSiq㸷18A]a0  s0[UȲc$]Ӡ8yf`cI/ n!?n7~\G\3v&hҼIqa<~8|3oCж1߰-j矞bOFw/wIEgXش?,. b:K[ N-A ѩb";+oA;"kGFA:ѣjW1MWСC{AףFwР5Y+E%Kriisd+r?2⿭&rw%>Ɲ[tyd=/-&3^twR/|q鼕XƁ 1ŘT\tŕXW<{4m mozG.ex0<8vM Aj‰5'-֘&1KDDDDlƉ6 A3f c{b&,X˗Wg4]G\ݎ`uR'PX8XDǰ~HtCxe뿽/}҅xZG8^ϛpҺ O޳(L9'F>1/hɹ Aoc!;%gcɫ`p-5PCF(TyuU+\bGW}<̙3\ryAnn.ŋQvRk&OETҠ:ؚhf<6U2\[Mp&2G]n#K@bݖ\pA7tn?&94D!|;pI:E.5aEjr4:/-NżYO1BloQ*(mDM d1[M8/EjK\u,\+Kb8H(lr>s'ޯx+:5m j%2y".~"N Gyo~[Ngnf,|OpgF8GfܠX:9=3йmsKMwӗf]!q3 l!m48[_cz2(}@!Is l۸MFD'$"""|t/IqQ~Ըq:xȏb-*@hpֽǟ 8]&>Z$y/>x 4g,by """"<よ*@ N>Z6cރ<lji׬5:v.bti\ƐZRG:q&:-y_,vH-;^7m7թM#5nt[x_} @LB j7n˯sN-!5=l\b,Y+Vn؆<$EqʙpIб^ 6DDDDD wRtu CZR)K#E/y];8{is#!t||իv`/vKw2/u_?SKI%o,mS\ 4hР4Mhi4fxm hQrzgh)z*I>\_>F~}62wSVt 𿯉(8/1+dž=](T7`Jm JF Kjh䈨ˆ q5*h-^c/ڸ;1ꏯPK(||}(TE-.(jpADDDDDDDQ յ: HÆe^DDDDDDDa{eκxװd斊 J1gxC=X """"" vXhz-o^&"""""" +ޜbHOOGzz:\.?ĤI`u Mt:Ѿ}Rg^8NL4I$""""""  T..4M+#"""""" qAap8 ??_ ED^^BLL""""""* VZ!?4p-[}&""""""~Tª]vhժ6nX*~maذah۶Y呗e˖a̙en ګW/:ktDDDDDDU VK:g}60ML"!! Q)nVt֭L0 x<Ԣ }'\)>懣lxx-I0ڎ.'s3]K0#.oݎ1ax +LAS|x^jt}DDDDU {#ed"5Qu7 IDATiefKGx&$8L>=o~ po[vwB^i3\4c)>_o9 ❈o|>נd͛qA 0mck7>CS =P5+6gw8%q'"""KE(ji)HF6g̃Lz%5XG,2aDNR}/W.jháfQQ p28᮷15@Ӡkޢz#4kcY*MGKI 1{X0{q'QE-^g & hDQr@ {cƁ882 P4ESk!5\7g.!_áS{\X>EDѠiI8x1^z p87)1R"^ָ3oFYs?C6`\:,Ly;ͻ%8 k+#_St3 qى+0g( Pt R74=5A((e@DDDDU ϸ (@݋٘6{}{7:T%.:7n>Aޤq5pLB3őC老gѿg.bu}@my-Q(:{?,Ćp/e}gcfG} OE&p E .(ihzxPrL ^t@.ٷqKQt?Z_ǧcVhUG.84\S|8)F^.}| ~\wiS2;n9x^5UMn»X nrRXe+ރjyJң_Jw>ewL kMUb P  pY%TrΙ| j&4pRCU 5\Q/LW u{j^QI9 9?\ĿXܹvkB!iSHQT͋:K[h 1}#Kܸ7c ͼ~xhBs%EI^\)Yȑ]#j,R09O_QC+<ٟRnzfl`(vɴۄ~Ku@IY5GLγݾ]s%g\3_L ϥǸpqA/lK΅=|8ʔ& jv珫V @7 6އR&Iz9{R;M5~gѱpǥ><ˆz ߲率&a#$:7T,cR8vm.p,]X\[a-/LY..' g鷜ݜ\Z4.EBalxPHN85^+SZ4–Ͽb$MňbSns>x\؉qo>8GHYdEYdE/BɈaeYxrd` Ti0.YE-JQ|8#[fūH #)i1IgqAi ]?ﬥhڨ1E K/~IvThӐz>3u>2(ߊy5O&nMr\p9nB l6#k1tl) qd)6<qGo~V!B}g+Uʰﳓ,:?q!վ؀$\wJi+`8mNiÞx뺑v-sxԼTdSEAU5TU#U UM&9*$w] ]_{[νH1RI)L @I#?<'!u(9KMRh_d2!8CQy!B!#ۅ"X78֟wcom3֔LbVFn9W8yU^WЯ3,TvQ:ݛ{13,YJ66X砂ߌ㋳ɒ ,9CgնlL̬a=hFܠ܍">~-W!B& !SD%o;3{oi;L ldGМrmy?sx`2ex:J囎/!Bwxs6"+ӥgM|=Q#dz>I;n2Jfݫ A;Rf:"c$!B!$p!xh~c}?4emuۉbJ<1aߠtȭD|ٗ\kظ191‡/2 o`e:dM,3Fc%+nf[q(+lbrS#/1mR'^Cѻ}[ZjMۉ;HL+ (pvsG+bzcycWS!4Σb3I~|KR"\qd܌ Θ)V8&\%)4$_B!"HBtP%a?[KQԧԯus ;ֳp;@>cr]7(l9[|vfeƵ+M+X|\<Y|~EɖNZ<.3QӇh< -;Ρ_U4l8c91^̅t5{=5PL2cN10鍗ⅷDS F"$/B$p!xdVۨ$0KF0ESTrɍuw\!.g%r;:˺-fe"Q^\9܎es^$FQ5T, U!<99z6 m|U5Cl杗2 t7l>x?}“-W&7ǩ^^5WuK9_ItAy+ϒX1r|)Yܛ( NqFaJB!"70!SGY:q(F@gw5j3( r6%N˕Wi?VX onJŰ {?vg O>OsД$bst{PTwJgsqVts,g ޜsl[Xt=rehZ6}oV,g,Lnv|cvX.\%P=ĝcz+xRE,tܼ囋,&IE2*: |T+ 50ʒ>oϘґ&B!lJVi-PMc]4U)XT)m/r`6!t̻z4enz!Ʋ}ƾ Gq`6tCAu] th;a躞2yrCǦ+h&v 15&qپx2pUS=VAQ=i$C'4(XqlK&LqW~؛ST5U;ƾ!BlEJ>LaoVb\r)mᔶ9 {;u#9ZyBj?(_AEI'ṗR%(}//D<;(it8׵fQ?N|&7XB!FB!ҼST#xB!?.B(rB!?2&B!B.B!BԒB!B!Z2Dž˒`֭\pZ%ChFWVB!B' 񗄇;p 0'JQ>J(ɓiٲe=?Y!B!D[EğbǏ};v ͆)Zt]fq :t1c2mć MV sUZ3=u!kޢN4h qckÚ6.V3ojVbzmۯp>E g0gx/Z4 VmgjEy4}xhNݺˤHH[n`BԩUMz0*8-}9RvZ MTL}B!CO:u*Ǐ')) fc„ |Ǯ=+51Nח~ #o1ey3"`k 'D~8SnATB^G\.Swob̰vnd+0#cmwvn"6?zYqfȉ*>mg`bf cA3:wOn% .k".!BL' <ȨQZE;]=z4x**ϲQqSEa#Wnu|S&id/нMn^LHX/1?>e K}Z4kNw:ݛT1+ 6r?Gt^ͺ X}Ӿ⯳jKH:&[?T|W՟9<0R~J%^M믑poL϶e wJgͪ=$.l#"2]zӝe;ҫq<[f/ӪdVܽ Ի#e#2FFt !Bd6BpgŒY1:>pInN#uo\գ4  ӛ3Yߤ0?}̫#ƑtC7gd<_ʲ%漷O3mR7F'3z_²xNY()w۝SDY1,$C;|rw<7tϞoIJdo@qd 5?Θ)V8&{LU9q GB!Dfo_\~7wa(0 QF1qT\v|R3\n։BI{6">-ןFjQlƯ\AGX3EԡXg h߳=_nRn YH<=ڴ^;T"ڛ'ޝūڰbt:_J-3^[0hl+J(jR|VFuT}_70_l|_zBfx;{'n IDAT(xyyCB.MӒ@BJٜx)^x{Z1'8gO+B!dąx,ovo{ k%?m0y<*톑WS8R 2j?L{M觾KP)ۜս.%lpE yĎ">rQH>MM]Q5T~kpor dx?xsr/m.jZQ4мRa.c[^gzגMU=OsД$bsAn pN6=wq.ΊnĤ c/[9pq>j9k\<(H>i+r) FB,.Ē`Z`ZuN1ApW<֢ Yw:=)]s\C|3v8!B!#.O9-io[S;&Dծop,^zK{B90w\qw$OWwEpt:W_L|7%3i5 y˾KS;FEPS1,7؝ sK~'1cJO HQB!2ۣTVi-PMc]4U)XT)m/r`6!t̻z8{f6}Doaaaty.f3&Kk˖-C2" ^zOۿTmfߎn1;aCHPPTtESQ ]w:nm@7y.SoSd{UttyL9W׏H)VTTؖLvjJ;ಭ4E!`(*Was8j_l@KyQ;m06asyu]7YӮe=!)AT;QT{9D4R(K*iOM!pI4'ۖB!0 ~WΜ9C)PktY,v܉aZE!N+?MZ&B!jrP7nܠ}ԬY:PL>n5I˗Yf4oޜ:uZM!*A !B$ \ cXh۶-k׮jbHHH`ȑ|zre5kƁll6~WBCC:!B!.fɒ%ڵ ])\0UV]7n.]r} p/hqaYo99ySM!B!vf۶m)ׯ~}YEl6gϞT H?hРA,!B!b/eH"xzzrڵ4A={/r !B!Eӧ>>>?~Ν;a4i҄ *I;n2Jfݫ A;Rf:"clM !B uB<1iZĚ̹jظ191‡ӗ-`7뉌E~bQ`'t9|FHMΉЩb`go3sb[M' OnpiL-+`ŜH̶IxuQ}Fmi٪5m' 1C(`F]5@#64*(i=9ߒjQtQnFGszSg+U 5WIJ83VVB!Df"IBg}jF٬=wR _ 11+Kt~.'GK6GX uA<hJ):mFYلt:/́PC ,Xˎ=(' A?ڳfˋ>W#ڄ|{5 VNG%[b4R7agQ0nB!Dfo`"S>? \Kj4/{kՉ; W]ZX/dxv_Αr \B!L"=nb׮]ԯ_7ѣGǨQ$x!RJЮ_}ntk`cdT;Q]۟0o5lBw5 ?Fw&Nmj+kZ<>5o0!) =צj`L&i?1 SjSV]n"11J*a*U3gΐDDDxeС}uş6wt#0P$ǯDB!2.O!-מaJSX$tG̉Fشl> (( ZeJҹMsV֏֍XF2sM΅ߌ\\>-5ǻI/нMnLH'lksW1SaG^r;ŴKDj6W-b3} Yb>dGM^ZWdJu(x7ul].=kN8Hr9 kaLYq*HPٻ[vB!D{i!Y0U:\T|η N$Punszcy3Bxv5]Ep\(lCf&< [ 3f4s'3;`Աq-VSTU08iptzQK7P#3g/T?[Ӵ{Ј*3&uctq?w({!,!S)",rTDss%)"ōr3JGU9q GB!DfB.գ]&@\bcxhK CW]g {(Rԋ-M |<[:?nOJ kx>R,h (d(Tşyp3yS̿&~7br߁O`g:?;y5E^Ay4dyS;V}7CLYΠ]P rS0y8Fi(xyyABM^í"Ƌ^J3 Y=EǼ/71V;3ȯղ5}&t%i~;׺wcnr8O3on[ zotxfaxCNyKOJw^Sϻ6_zG,gsJM x@TFzF"cS!"70ҫW/^|E~7ٰa*U?~<ׯ_'66ӧ3gN,K/_I&[]ƌ3h޼9W^MUW o"ܯfrV._η߅c3anc ny*n4YAdԈJ2P< R{f~꫶T`EQ)ۜ(I.6X0Q;{.^I/R.EI^q=6O/`NxƬeXlWuO*ɣXܼRa;͞1(~%(sq=dtY+FNO;ͯduM,͙8f0n/*B!M'bڵTV ՚Y3 FfRżyMt:fb&ye5kjl޼jժߧ:aDjN)T`R[e{V&#W0*Z-勖d!ɸéǹn-E-A.B\8CSg zdI'sa twLJoJ܌uQ\ړFz՝mz\#'I5ƹ_r-,:`|rKy0jHXx?Va`Pq#! bI0@-u=֢ Yw:=)]s\C|5B!C!N: B:z(͚5cݺu||֟?>#FUV>|8Na\x;*<3-ޣpI(Ѣ%e/L?nY T;(%uX> ?l~./SS= Ӹp઎'y*`D+ɼbh8f/%ٽrR]0|~M?Vz_{ߍ+yԼ&0}z?M=++vgܒ;f 71u~xS"B*j:1Ż='0VTz.._wL6}K!wґ& !BdGVi-PMc]4U)XT)m/r`6!t̻z4en0:wnil2:t耒xsƲOo~< f!jL > +7/B!_}g+Uʰﳓ,:?q!վ؀$\wJi+`8mNiÞuHgqpN9c~}YTUd2J޽yZ-Z… a}YjRL6nȔ)SȒ%ku }B!B! X(_|<vqwwO0L̜9s‘_P4 g#%OQ0`{?˗'000̀B!BUD<6nHhh(4lؐݻnU7oXb 0|B e˖7ҾT/"""ꫯR8p̃!B!ixya(>|dgϞ㡯y/}!B!һhXEQ5ݾ}t#چƒܮfvoEYfB!"HOt1n֯:V|, ]=*er:vEUl X~۞ <(~%#+b,9Ffg3rmp4cpgTPxi^/gH+V׆B!DF{Ʌ QqSEa#Wnu|S&ij/нMn^Lrf݅FV1'ලČh\?ڍ:,liL׼IánBoZ4 Sžs|zlP#Z34~7g\>ӟ_.esMx÷|s)0f |c{Ҵ~۹qNsxtDՖTk3qocj>|;|Vx йouoN@@M绉o?m頋UL_Bz֡7Q%"4%Uʫ\[^OLY)^p٫R߶T/7>eS.^N\.l#"2]zӝe;ҫq<[f/ӪdVܽ Ի#e#2ҒB!hBtֳaL^l]җ(qJʁ\Λ:o`ú0瀘5|γX/k{=(683&uG;۷eִDhڣV;?5^ EQP@t㻫i^;)DV>+n,]\^3Jdߖ$%rS+B!"3~BYr\e ?朴lQܣ(Tşy}GQ-nn)4zG@,ADQEE,v?bA*E X@AQz Mٙ)n:M~g9gfnaޜsF^Ot&[H?gka<1Z ռA,#IF݆։x|ꐴIk7*.a56WBGgGkl#LLso]SQj{^&K;8QLU_T9EntRsu߷Mt-[Ճgt{ða]?hN '/G~obLS\<يK>E+7/w&vRzR5jf4W߄W^̀-`V'WMT]vPKI*$`'&ת̖:7W;v+u5IJ*:uS.ة@FjShSy2Q\^flvU35_}\5C5h;A*8Hz r374ܛv|LTW=8K=3ˆ%uxQݿkIVL|~J\~X_@nr CW#LBm2WeݹwmE@E>sڧxz]^$ɪߴ-ϕ|efL/*kg╒w7.XIL'K;sU=Z7cf-kY6=HvUcIn&%TMRpMwNW.X tBQjuV:.ȨHXM*S[G5դ?*dIrwҟ uZc btghHuv3hLyV(yL(Y?nC7_ ܂LjʖWƸ"51:e`/|>\Cm*Қ+btUCviZ9GEEyJm9Z?w])=k[5YNNI=:*5K=N2JJ0Z|r]Wk}llr`=l }„QoT%翮$SkzP'@Z yTnircT;44 ܦlaz&4B<?-ٮT~wkP(Kd䃷j 2d;=8<֞rEIs2 ~:η'ӈQYzz0{l1 tҠ嵌BCuFӿ=JV;x?2=Q3[Fe[rh%6:A}E]\>\4g=.o.%e|zy^M:!WnQAlSvc8YF0\O\zifq{jDzUV6[t ^IvO+h_YA-uiGƎs Ι׌{;cJ}kԭkkr\c.t^TT 9]W^p<(ip$!cd~:rݏn-N\W'IXeOĐ\e}rzMdhwq*}7eL} V}׉mۆ{Pz7?~#$lIaK띠@~᩻KݒҿQv+JוײqB׆(Y l.)_,YVR_B㍱d_bڧnu*IJ+fhRZX*1Qqs1.TJVMtG!Jx-e.՟R׿rHTq5[S;Y+ǎ֤u?`CѡNlw:ݭݤ[֓H_~>MRNuFp;{+Uwn^yKV*غU\)I2CJV 5Iў(C7j+)uϤ){6{MW_QAt\N\Ņhzw4k6Z*NgZ?oݬ'j7 )\HQ+Ne =N6eQZjR)$9[ͿPO_GcKZsU9GE$KIR-c9Ke+G8c5.,k9[֯i:!9I' /:U6xD8kRÇ«OF9USWjǯ[on'SP`d{NfrW(/W\R[c%()nq2l8ܐ1 "1Ue wДI_+iK5-ꞦSWfVk6wm lmvcU7ƖF3f.U+IEvd(%5m E/t%W*u{zݼN&_,GrrG̒v>G D4F\׸xD+/S %=<:WMHWZ'[alItØk4xbb[_j:g_3RdW _dYVд ו:GCջN@,ٖ\GO0Fה.d%*BqSP\,ے)yˆ;Ku8O!1*WLU*>Rq_|C3dчԭk j|ضa/o!d H* ~]ZJT#䄔ٶٳgSN{ ."}ᇕ {TSLa?ѩS'uqž*,,_S#a^!{ScP~ BxP@02TpѡCEEE-Ix zizU!z A[pE|Pna̓ aр*:::,OZ= l :TݺuӸqzjHEEEk֬|Xj„ yȎ;ԯ_?7NիWkĉ4i uM7U8m$//OC o /q]qZ`A {^TziѢEK]׭ꫵaq>ٸ~{w4cƌJ=9ꨣ‹*5dȐrO q]W@l[C=vĈ u5j(5kj:ƌ.dFTTT02;vM7ݤg}"@Apkٲe֍xW4hР'Nw}Ԫ zH۶mo^ 80UeŊB Iӧlۖ1v0bbbk7 ':"}߃=.0H-,_ *77W~w%j"1m;Q?MEp"X b\Ep"X b\Ep"X b\Ep""~^|)***PE\iժUx,XCf̙傑-[R<#Gm߾]}W_:uW+W*99YM6 լY4~x9R7` r\iӦ>^/}Qy<̆1Fڵӂ 4n8[JTT?xs=ZlZ@52^W\r. ף^~[.[#c SC!_#۶Ëmx<, !#(<7 \`ԨQ#H^tTv>._N< אx‹z‹eYNӜ9saÆCt۶U~}u]STT#-CpbQttԿ פ8Ƙ p!!A8XD, .@"D, .@"D, .@"D, .@"D,ݡ6'+wRW>X[o IDAT9nx*A\V?g}YNp3@GpQQ>O?Ng+Gtɰ:|FEnI>pT)<jl96QߧטV~~}eWD=N ;$w~8FB7*:}FC/ܛ2tϒuo^<_>KU7r4y·Z}nнrΨ5oUT]úM\yۚ&WZm5{t]:Mz0MVlR~X^WocTe }:]ޫ-߱${ޯ-Iy_?#o]SNtԢ75m*Hh7>[5H*XϟLc'/v'^z\nVqRS,5դ؈j5abEufST~v]GY_=_ڦONԜ/{w#o˿//W&˹35q# F3Ni5i/47]5r?_͞=YJ?7Mz yNf~wo}Xm*+u49}:k>N+ǎ֤uW#m~#ɔzta:58 }Md.ww9nڗN?Sbٜ&{rU%ܦ>^L*]u&DNL%CuY:ūQM1Ҿ &[k#_n:=WDnm۴N[2Dsk}*ڝ댔4kᮒ( uID)꘸Qk7$c2,ٶ-2,KFFm˶-ok3dW>WC}g$Kנ5~낣М(ESnQ.IƵy眤soN6>vȍcZ֕_+m;$ TmmY7&Zu$iL9.gV:AZVR-Z $$&ضlUuu/9QAt\N\IT+Ee/WˑlxԤ9:a0@|oꜩȘ"IF5kSz~;EukYڹctmNߩ ץ*\Ng`^|=QEWw\C࢚sєIw+(mۼMꗴ(Ԗ-JJMe)1RF)ڙS!0 y`dd*>}⹚cA!IƲeSUݙ%80{N/ϗ?ySG*%INl 15e|&Ѡ>Ye]0lKFuw nOw>Ivp*RMkhAk5W,)(kpE*ROd{&N]S^{K3Ur7u\: U`~\'W&\@px=bV4=0c][)TkC^0ZOy旧vWܿt~3u kPZJDztRJӅ=ãs54tѪz|ƆgaktO>o)tu'GQ[{A6kwrQT;h=Nڧ/S۔Zi=+2Fm}F򌞺 NhWRO.+JMwj@ݣFξkUԮ[F n$oоd ~]Z#vysf5#-EvEu% [22}.Ir]GL02VbNىJ4axʅ+#*~%S)J{g: 8uAOL"%*9$r.+)9ݿ}V"=9}V}y{1%hT98%\Z~$8cJ9Iݺv fT_Νڅ2Oq- 0l?ui(/R @о[RV"@kT~x]}- jX c졡1 ++/fd9~1*HcUĐ}+E^Ԕsr7FO! //a,ϳ| %:ϕS=z.{< *!@~>sGf>T*m M tx*X b\Ep"X b\ /=83RdRZ.@ /SE@"D, .@"D, .@"D, <To?*o*9`E*nS%^j@Bp}hۼ  %M"ʎF[gWR>}92&*{UKkJnd (۩^\pY2{>c؎Es+'PEŠ쌰-ekZQTRrYfo/{>  ʂKfQbƁ\P\%]eƲ}O|RR[‹*U9H{>c z{cluxB76lU6T"A Oߨਠ6FU4h^Հ^p!A0LozLT'l_1BƳ{D07Ц䆅VO͎ &|}@T$#x hR;+7¿eV1RyWK#-V9RyWmҡh_Hٞq*\ReVS˛TGQ-O( $oBRO/cH] +(^%u߶^V]+ C Rn^.p4Uó RÁWYx@pQһ孙^Y)oB]r>Y_G&ָ_k< )}49y$?=$Jx,Op"_ȊVAJO9(o*ʔ[#I1 Z*c=p!@LT0\Ij1}1J8i =-9! ,"YQETLݦܵ˿yMX2dJCyr.H1_ݦ!ƈ T*I2eeSUo>-eZGǟu+$Y>鐅#Ï'*>JӐ N@٫~="]H IJjGb@cvsSyp R0zT2<T%a'J|WUMx}UGpTKVeyxL5yk$Wָ>>1Djo?(oj9SF%67N<8֊հcվ%hM9G_dKnx`Fd_mveZ{ Z#@֭'E+oYXci^ P_T-(cEJ5E)Z9P6zŠ֍tR K5likzYH2j"^W5^H_,˛dԱmڱK?$~%SMhTk׫d[Վ]z}]`sx]UߣdەЌV+Dz8]Уdh<5_RPoDzخVoը_ ; \L @st 1ڹܯٮAn~kyS ]Q@ w%ï|Mjcc4w[~ HHmS _PV+OSMZ4S[f(5`ɟ/)1N@f)>Σ|Wn ,--u U@7,+T~N9K7- :JtU ,,ݜ"nNIzK.e[Rcz@RQ~pcdLY$I3 /m+ԆhK)*&$#iK##' ;)Zkيs]mP+9~G^jU][.ҺBɵ<kITTЧkR7JJnn&(; LnUa]R1qnu-tHoXUFmu=*Fim%Hr,KMv2r>"Dƺl^}G^]]yz;G-Vo+km5uRc 8-; F+Y%uEpr\Wr~[wk'd[LK7tY(OFNLҕ*x^P~%ѳ]Cjj<ޒ>} ݡQ[\e?kϫ N[47W>[C/lwCR|YC *2VW]SlՉ2hJVg9rlKIGkvJ(uK ?Ch"ʗ2jY/JM#!YãQƎ"m(2$ѱqF+3ϕ22NXK D9d!Vc('jٺ|}[-72>:J,WW7g-եmk22[ \Y2NC$W xe~v@UBp2y[HK\%viz)Jڕ/Sr\IkSPjL-,9Ԯek8#OUɴI 8.}[q ]R }>"BF,$. z;Т"q뭷Ru￯45dkNo~ǩ}8urJ >| LgK, \U G}.]Ӷmo߮aÆK.8q9纮L_~% P0Uo0H0`Jŋk…[|y+eU5E]YfiҤI(gc9F'NԜ9st饗VZHO>8 DGGVZE!1x<߿,X^zI)))ILL? hx<{5QQ_*3 >;Gc޽{QF{ !7n޽{mL{g 4(,Z(dO.]^zi{/W^ZdIxU*KE}TgZ*,\p!TD={jڵu]_^=zмy«+TQ_ZlYGxBD3uT憔>}۷ $W^ݻwÎ;ӧWxlKNNV׮]Cr SVVVx$;O>DwuWHRvv{|ڵZw߿W^yE@ L*iqWWg}V?|>4rH3Fm7W~~jM6\xẮ^~e9RVs;L)XKҋtPPP`"V$jL1ƖX_ X Mzlg6ݙن<<=綹wgsΕV|r-XZ|rM0!dht:5}t~պ[oUnw%y<]s5//X@˗/&re\@#GpiٲƎ[-ۏ IDATm[ӟx$=+=$**JsC0MScǎܹsXG+І $I>OӟZa?^Z"F vE~z͜9Sw֥^0!22RF|UahԨQ?bbbQFiΝ1cF-S oZhCuU\rIVW^ye[:N͞=[#FW`ٳg6o>3FƶKԵkWZ[i+H a!5kahԩuTbڴi!CիW+;;;h{O"*막'!$=skBi;mݦ:hy04n8=A+I'NԀ?j>|![@\R#FԩSꫯs ^H-ܢ/((*11Q_Bn 8|!%%E'O1L9r?WiUSNUII,˒eY*--ԩSCi;ɓ'+--z@'QcP`FA5k*Tۺ8~%"77W&M1lXh&O\c 7 ultn1|ZY||zYL~&N?A-/*0M3dhGiĉ!C={*!!ZeYz'/ 4ƍ5bʔ);wZhQ\<Ə%K-We˖kQIII`2224g=AvΛ7O6mVh.`߂Z@tU'NT*)))EQQ.b}u}F#GV)!!AԱcGtM֭[z۶Oٍ. ל9sB)SCH.];(&& d`Y>c-X dh?dKuuYhQP @Q `˖-A!@Cj…!ojvz%)==] .԰a܆z_nrƁ";(,0 C/V>}S/jm߾}A~-YD{s{> Px\JKKXĶm}ׯnV&;P߾}C$sV ƃֹs"͘1[h:suWh ڸqJ >\3gTqqq,Ñ^{-h_:w\g@v.]0jÿo7N7xd֬YJrsseYVEbbyI&)++Zm˗ѣ5p@KW_}U N.]M Z/ضyijSHU7xLTIҥ^I&iڴiAV/;;[3f̙3KMȠAxUֽ{w=:(lQ)Dt饗jٲez饗ԬY3)4_|Q_~~mm۲,6CmoԨQٳg? ԛazԾ}:9NM0A+Wܹs5p@9d9shʕrgS۶m4ƌ:4HFF/^K.Ζ NSsz)mܸQӦMS=p8j]0 9u]6mڤo1bDBQF>S-j 1,##Co;XB6lƍ͛+##C;vȑ#(0a2 C[]wݥ;SOuV8p@Sii:w.]hРAٳgƇpW^ٳq'ڡ2HJJҘ1cmdo"qBkSN .@"a- .@"a- .@"a- .@"a- .@"a ];7%;xxwgӋ'f} ,O_^Qcʬ?Pè2oCٲ'(tGζ8!-%7+ Ô9i:jaQk61y][=R}8 m+륺_iD|që$MC i_iKv$9[*٫UϾ^9V?te#y3']BS~EF@8a `HA |Zw?{P>Zm^[-yzcp=2g>_8]7D~)/n'e˵hH=>#-Y8C7E}G^)?ÿyC?>֛?Mּ>*֗O߫ S-yKeaeWֽkM^]X}iWĒdu}wѧZ2Z(O~@X#@ϒ5W/uS]{^*]X:F]9Nxj˶%9ϯ?G-crŴy;}* ] g)#)gt+;cE%42z~ŸJ|.HV.YEjרgBi|HW|4r!WL]}e_l6,ɖKک۩Ȍs4}{dUh@X?%\ZXu8HߣU[*3tf-5HQjCFE,HVJzK9Ty?oF̶|{Ql+_yj]2Ҕ6W%#GޘU\LIJvT/S.)Dp1()>JIo$WP0VN+EBJ;0SBed.dQoEHRRb.mpC2d: V<4>tA0ۖ_lIQxHޔ/;ݛ@]@zS/֠]s‚]:j;0ݾUKlMuYsВ|yZ9-}]WfieWÔ]_w@Cp =t-8 '/8?5I ު2ILLe0|nTu:R}˪a TcUoa2BP=(/2ef}7L9*Gta- .@"a- .@"a- .@"a- .@r'_9shUt3Fa 2eeezO˲jys=2e"##?8e~_j̙uyeggkڴi2Mz5OW8%ΝYfVȲ,3gl\x'ZTm[O>d[iN/t)~V{V6m {nZڼ4\ӕW^Y-7oƏ_-,ু?4p8ir T1LM>]}qcTL0wq8֭nFV wܡ BQBI;XT/agՋ/K/4'l{3f:$/۶ʦMBI<,Ç5f͟??5wQc+*TDt*@#@^{5>| ;w, Yvdgg^;.S1.Pk)%%ECmX @+EDDT[׊+.s~̬V5j!Co]vڿ^xA/bq)JKKo!Q.&Lo]-0 aW3 CqeW{4n89Πu0 -C`PijDll|Mu5F;w֛oMV~".ptE_|~(===4W_|nݺ~aO<'x" a- .@bpNe_'|"X}aԩN%''VKrsssiӦMm;:xM8Q.$p! #G bϟ/BQQQ<.B^ޡTΙ3gj߿?&*瞓mu>,w}K˖-ڵkeYVr=,RiiNN@Ep Vmw *C hX:Kݺu ,˥nn"pa T]vLԼyZC!""B ,г>{\s80hƋ'ͬYtUW0 U)`HIIC=TB*_Wp Ip8p8+L0Mz11 .@"Is***JAsfի"##C>wE5hN@8i~`Q>1cƨ`bͺꪫ~zeddVN#@XYb k -$ɶmꫯu>@GpCEuj߾}`ZnXT̋eq2ON~ZM4 ,ѝwީ^z]CwygPyK={s>@8!;kV۶m CݻL Nw8! PFF~VT[K 4ջwo;ږ>.pB@Dи- *ٵkyF10]B h<.P"^Z&L,Ke^ |\Fcǎ?_̶mjeرcòtw7n!qwkРAЈW8) ?k_?^'O1 ***JӦMӌ3ԳgF4Mu]ӧO׫Ya1.P'45n83&hpgLl-F৊b,\i~r.4Iz71N4~ l\Ep[ l\Ep[ l\Ep[ l\Ep[yz?/;$kO ӊ2+d[g^jm|[]xm.žOD>Lծ}Ѻ_Whv&=NOI۵-'(amtw늮2BP|aJwJO;5GTÕ!‰mNT~DҐ (i_ğ*umר8wgW*: n #D}TaHek4oiu Y'tPTλTO|[V޽FO^OC~-[=3nл}Z/tzh]w|{ ﲝhQ2ln=uwg-KuoIG_^Æj1u* qEݒiM4d0{]zw}tЊҊq(whGkٿSK %*?Rܭ҇?ӶgwC^Wٮoq'hLE_}YkoK[;S-{Z-R\'Zv[__|[Xh[1V0'Рnh4 ӁDuoW+i˒eޤ5Khņ40Uʥo SC^}#頫.ß-f_ݽuMTDa5 ^בּ7UzSQ-Ug[Zx-P4{"n%=WhA%ZOfN{ڱCS2jTnW2[.in"3шɒe2MC)!TN(:f0d3P!C uuo+3<`ھVЎ%;[Z^+:vƶqVb!_2 QZ(<\*df)7:Mi1YȔLe~'T.-5H>Id*wpiZTʄD"RRYە̤T% L:[:"{U-SYYlС'CUK_/^tgHI˴0vgީ3;z[Y%0d:LU7մxrKul'Bf|bU?Һ00Ca)xrl@GZ+), :)cfuDWFV#GzViQ%Yz " IDATZ7Im[]x^;9 Crt3Z:<`zEru55G.rvţbYZ0eƝAێvuNz5*KVveʫhhw.RkITzxBA@}8ԯ5{Jl 7keoM4w6gdvwvڎYmq@[eۡ@p8ڌדJ=#WuٓO_#sp/emWs(0$W pT;u>1^=?ڤ'?_ Wݧ.ز*WWon5suC?e8*ԝti iagx]UÆiu(ԧP ^utRs?U. ww}&S\/]3wx@j-PTVY^yGexbxnHrT׬22]0%L;+UW;%9g'骧?-ՂTy~ض,E!4YQqG t+/CFy׏vٶ,YUkH/[m Oх7oݣ^nS*ꏭ}-,r;ʾ~d[jn11r."Ryw;`חoc=۶*Ө36.#ѼsuX:!]R ;;h,]3 ,>axqI|$otViŴO]e_eڮ(5 ]ãRJ-1. 2Lbձ Ӭaeڳv=:%F͝DvYy/CYÚS=hګMּj8f3BlP'K_G~A1j05ma~oҊǨ} '$U- .@"a- .@"a- .@"a- .@"a- .@"2 #h4>{\Q£@;rP'3NԴ4ܵSm۴Q&MTXxT;wRZ*`~TuAZ,?KfJOK FpG,]$B` .@"a- .@"aXN,۶UPP£Gqb4Q\\ s4X[;+';G^7RbR: ӬJVCO֐s@%%Qϲ,=*Is4Xo۾M^Wgynw`5Nǫ[hmԱS`u5?N87!? dG*It`iI&*XӐc:Zn:vܜ ?N87!? N2_gSm4|sX{^ݮbnw8~܄K0 @"a- .@"aX~|kV$+Jnn$)11)'Ν;%Im۶ A+**ҺuIw9azz:p@`R%Z??m+ ϵ) i&?M~/s6n>YP,\ggkmr6~pg/*#I~lB_T{+paСC6EEFJ^6UoEs(6ܗlåT5o^-2GH.`8 dxC^V{k$G5smrlٶt-(--M{I[81v*!ɐPL|ZuhN؏şN_nqJӶ]G+Rj}r>dT1.Ir(yGwD9j.W)==]EYYM}Oy[=G/UAvmYJzWD?:)-#ۖ^_gn0 +>i8WMUV-%Ifе]0W-\uV7%,QenYjҷb8o? GbR :Q IC:4]ݢNb`F+15ؤi蠇@|s YX5]S"et9ֆLˬv8(e~WzAWRvg_Ju5$:=RRz_N7/֬[no+Wk[^Ӗyg-Ѷ"z KWqv:ƅЈ.I~Z}w(8B?\kڧ2}̄ gi[#2SԘ'ТJf̘"ۥ{,QC;ViڶDe#.Ѯ[u TVuFheB{_+{2MS!삭Z֣NC)(yTLJ;)CMjk1ڼ+[ڹe`|}.)omٲG~jީ$FȐ ˴/b v`Aft1p$YʗR~h)3Hq-Ri|^vT89+Jߤ%;۷k:_~M{hh49ed*wj|KiKj{D hTQ ں/Or)&!-ڲ밎z c]J2eʵnoh7[j-5F.OSU+WyFs0AnXֵ]ٳfiʕj6j A Ij42TdES#(E}fJW˞gjHO<ͦNT$*Sƙ5CZz$U([hKaz8_Ӛ5[E:ePIuhJRauUS&׮gMG8{ΈTӥ"L2ͻr-E9Bg4OP[*޷Fl٣NWjYNɱ޹s&?jCI _wph҃>;;ҲSڣۣhS|%|)_?K>O肋:u0%k"-KWLGMѽS 5*X5M~MK[TRǻܭ_=ھ|Z\*϶w]sTBI]>=K%6y? e=7uu) -n< Cꪫ<8=ÇH>CIv[wv\eᛵ=Hb9'_61rG m%I%yƵRґkHz8X{~u;b4c$ɓU;}HwE9L:rlGhݺ,5z9eҦ{WC"٬6*r`/GHܽػ6uʗE+T~6y}" fοZ6׬\*Ǜ4dRfiڤFT;/U=/5ٔd)f9wՀ1rx7Xv\TGEg+ߟdWyEMJS;s's7Ծ0e*ܨU,Erh23T}b+zkhIv~mB*դ۱ױ%zбcK.@#5zn8QUrݺqD=Bz%.\ʡ-iHfbdĦE[ E$%+*U\ɭԼS S.UI$@3}JnZq.C2mN͔y~EYVmaJrD+] EfPG+$^-['mH;^Z%_>M6MeeeUx<>m>:9spVӤ8E8 ɈPRR2+X)TTbءuS|O6kקxWo]s$#.iiky-6JpO^Ͼ)QQc$Yھ0J$+1rȩ>놡Y?JٍCfu|ؾD_+翟껶kfrTڑ%ZbB]uLtJF8gZfr\j -f͜C;ԹKBԚş%˵$UgKK]Mղm" ɌLU)p *S_ LmB*?XI r:tLI۔9bٹGYن!yeE&kڟS$mHv_k>ֵb{mV^^k3fV+?^Ǥ(%se)E+';G-u˨+jm=u).kg';uݍ^-\ْd()$tȴ4NBꦉ7+###p+Ƹl mкo6sJ,+ǟ-]mۖDə#wbo%ǗjQ^apKvʼYT9̶$g,2Z?{}drTk[2Y;-C~l9TXu*UJOD7>1Jk=TCJ:#INIV-r'$)zG}q*+cR&@~3WD6c UgڊH(Id8Wee~fֲ3ز(S?cz\vFq j٧#+W$Y*VYla5n̖V2SnCFD\u]VR6d.9}G屪}ۧ@zz&|:Mf86@jehQ1F$4AM={O9$٥ڿaFP~Ɋ0%ρ$:;mIQ2d7_775ӧ!#1E Etؖu8S}f?{C!ߟ_ }Z\v~?0Z2 %%ulTUffp4QRB]f>YuMorkILIU\Xٚ¨}|s8^Kj4Ą G[d(nVYJrGLQ]ԪoiG^\{DDNegVQ$HetNUoQ'p0M%tF}~wS[r2[j-&< FPTZbwepV'HNPkgЛqE;ؐ|"!ӐLyRdl7AٻˋY܏pgso:O?SҸ0c7|9))sq7ϚG'S?9S66Ef׮װhh/-¡ec~'9, wN9b֮.Ѱhܣ[9 cQ=K/!7z䑆of"@ȴctǏҎL jUtԵ~<׺ײߟu˯ugcOP:y9@d~OvG?@4.@_kAO>~*4Hi'i&_=G-j9 IDAToѸ}=Vו5נֿ {йzphH1Y0::3'M+{/EuV5Ϯ =u/ZSp:SZ/YH6mXLaj;dq{ߏUU $h||44Kw зh\E-oѸ}[4.@ߢq зh\E]q ~Kck]歸֝ظ7 ݚx0yYv㍆q=Gml?f[lۭ{߯?z˟bAY~v֞w~N :72[~J.i[tؒ=hOYsR1U>Z߱n\t+FwCkߩ!K544K~{pͨ货e1{X7럹F ltvyst_W_3_jӞK/D{L+_2]~ݔt|j/X⛼\*R:`3c>Zpzޥ[[o/FxCݱ-9vJ7]nٛγ%ݳ$mڸI~$\}kusvm~w:WX't&zmꛫ&uKTKRۑl\Ur^y*`gVSb;vk߮-k/@>%жTcd'VRKjq>lKc~7bȲB^VK\`|ӵO\ NGw5|HC{3ս.Zt |4\ku'u5Gh…ڭvf#-x֬yםНVZ\Ɨ"EuEYѺ82uN]xcj8c˖屢~~ xڱ}>id^Xi!IZd~jh?7_֖hi o?Cr!:TfU+aZGcyqe?Q2^z[8n%$)ӃR{둸lyyl]Z?33|Т +MQ69y٧u:M՞ni!IǞZHtk졻uۺKt5s_=m%[ǾAoz鰾vuKra?N_F>7Wј?)KU ,鹍Lyniy8y[ejH?~hbymwBIZT/~6LcSݽ- *Sݥ6mN|gknXJڞ?%WgRsRb<Ǟu ϊuQLy"O w߯e?.{ō4^^bÙG?O{ g]V%_睯ם/Zm@ݶAO'>Q\|jSQpW?gʥЁrVz]w:ͧڰg/҇_}j=qO3+Jd}v}cЋ>Y۵@{zvZ0VKҰ>C:G^uu+e+ŽVsSMcţu)&Uq}MOzR~[>dŏ7UL:b>*f⼌x#6?\>wUc\Jzf/v6nU2 M*cSq}8UָHI]+Mrq̗64Pӝa`pN ҷ=ph@w>6 ^  itt41CFG484eAbuQ*Wc`e2cbLK7Md-a#ys;; <UKւzL;u/ժmEڴiV\h6mڤŋv22MHÍz7:9osxq>cfj)IqY_Xk͉VK_~1s󠶍W>k:zɁ8`tuߡ_Ţ:xdHO]4Yb?ē3lxxX,־P`ulqoRq\f3ո(id}5Eդ?;.f6/@,k5ti\TQ׵h",YSӌVibLZhO q &U\Gyƅ}L'2⩛Jj5=ZMKGFtd$EZM###:5~kca?2sy{esL% {y4~鈿!?5cw㚺-e1񌘍EY/lNj6M_5,s~n( l\>/^>mxŎ}V5,ֻ1nSVq KS=Zc[<~dW>k_qˋKSc|O9;i :)M/挹_ L׵y(x"u1ĺbqqr3Mq8[54.+IŤj18rEl@?:>sbmq-E8C-?yП2Ք^Ɵ0HqYN.4ya&eo+[Ƨ-OUjXXl-Px8OĆ@Vu؜~ 2.H5}+b6s/عsg PlppkԂ;q怍m$4 >[Ԩj$}x{bV5o>ڌħ0{|>wa,n{*'.LS6Ը8&.@"5skH5 j 6s`5-Cl ho`XNnncK>/}oΝ1)[>{qi֓O5,`Li}~yXgR8︞e"Sz7|hV/~M7l16Fu,gͽ45:k}Mǥ^ӶtEXj< K)Oc6̀'75/,y}οN\ͱoQ*e T. &&ړdc>fNMlZԚuv^K݋ ۧb0ŵZׇOlh1Ƕ)a:b<yEY5SLE]TNzM,kh45sLhhZk7s}54ZքXwc~Ԝcy8UE\F>7s[@i qn?c1ߐEYqfqǑ?&ʋwL5.LrX/&n-cL.dȀ&@ hꏌ4s׉?"b^ZsPgjl|.%/M"گ=[+bd3!n>>柚cJ8-^FٺEmm1Κs-h-nY3'W矀率ɧ)vkV})מO^,?-s}ȯRFג1׏skX#Q>fu8{/6|r~o|ǺYQqzZ gznŕk{!aOUoLYb1ˍ3Z]l>qʧbЏl bubpqXbaXg1fq|eHݒi>EjͽǬa k&H 5I8nc¶qR1RԚ1^y&RMo*oy)Ssb.Jfl6.2M.c o{;pkZ'+|#C:7yCFxc8I`.kAZq-AׄqnLOYI 5cVoy[|-y163ݸT}/?6^@kXьߜOVXf kfX1{ {5cY,msU+kŲc[O\*)0ff5 ;Κjcm,޿?~lbދUЋyۺ󱘷ϥ6ߌ8OXڴSks?Nmsqn]5S(sǘxC96/|g̈́&jm<Мv~ŜxM粼ۼhʥb0uh{xCzk6M_c[6~3~qkTfq"jƛ nF۹8k,9 ۹mK=eaǽGE<!k"=1ff> v56/cHڮE eŽX7,o5))$59fjb#mNƽϛ1y%&K{ۍLéTL~Qj.f f7%rrMv\mv>ZkǼyx{ Ssk|3"}Ÿ?ƩŢT<+RPdJ/SqArf4yٱa7؞auV|{.䎱&ŭ&mqU* n885y ȍV1:VnlGKŤxOtd*^HǼcEii@Pso2c:7/'XsXh'/*o7ۛm6XlhzS.7kLT Ysxy*Z:g6c,-sq?¡mIϫcUV 阏sE}qt nƚfD|Bcߧb\T>(ty}*R+jPjbDxQ,ո4vklNdnl៾7Ŝc*/Sl"y>I1_K AIDATBfD^7(qθn-\Γ7xܛ(c-UW%*>o[l"?yvc-UgZqJ^>/^l=qQ$B>.y(_+S}4sM\EU6{&>KS1>s&ov"\\b}]Y7 1%1f[xL\TfS\)X~lT]x^,/nR1&U絊3[ V)-ߋq[?c+/﵈ThZ"oo8{獣:l?q!M|[+Xqq|:Cnoc9q*(_hWmKZ*cqqobsOx̧jJbOIb]R曪XZij..xǸy&֧*",6|xǸyDZb(c`6.:&KŤ>MgnTUM1&ΣNu{Z|UkRxTbE{/u8Nխ@8'cqo2{x;M*7ӭR9ۑiBy{,W_|.U#V)?.]:(/&s&}*6v^+5Z-vQԔmĺ7>ޭcq^E'\<IxjR{8OVMiX9giz]jkq~󩚢卽nū9`&tc1wNq긘{X[,Kb])SW^,\˞ݺT HuڢcT]es YLcN*nOqǦL]v])\9wiz]^ IB*fb.VL#㩘sIE\*I@*źRT̤85SLMe\=wuy Xg cZՕ=&Sn-۩k :)OżTO|bq|*Śs/[u}e3ȭZݨVXSuJur.֙X_ukZͥtH2Ӌ᪯W^Jcq.cQs)`B;|xyJ&\JZzLc`T]pWI:UuյZST,%UW6&NjT=j}Gfk\u֛S/{T׏~|OһOIBkoL"E{k\#@/ҍVXwk(Bc,gDIENDB`kraft-1.2.2/manual/kraft-de.html000066400000000000000000003102171467704360200165000ustar00rootroot00000000000000 Das Kraft Handbuch

    Einführung

    Kraft is a Qt and KDE application to organize office documents like quotes and invoices in a small business. It eases the creation of documents and helps with repeating tasks.

    Using Kraft, there is no need for fiddling with a text processor any more. Documents are created by a few clicks, edited, generated and archived automatically. Kraft generates high quality PDF output for printing, mailing and archiving.

    Funktionen
    • Simple creation of offers, invoices and similar documents.

    • Customer management, deeply integrated with the mature KDE KAddressbook.

    • Maintenance of document relations, ie. Partial invoices vs. invoices.

    • Vorlagen für Dokument-Kopf- und Fusstexte sowie Dokumentposten.

    • Pre calculation of item prices.

    • Materialverwaltung.

    • Konfigurierbare Dokument-Erstellung im PDF Format zum Druck und Versenden per Email.

    Der Quelltext zu Kraft ist open source and wird unter der Lizenz GNU General Public License veröffentlicht.

    Anmerkung
    Kraft is driven by community of users, coders, artists and others by voluntary work.
    Also this manual needs contributions!

    Learn more on how to contribute!

    Erster Start und Grundkonfiguration

    When Kraft is started for the first time, it automatically enters the initial setup process.

    During the initial setup you are asked to select a database to use and give the name and address of your company.

    You can fill in your company address (that appears on the printed documents) in two ways: in the setup procedure use the first tab Select from Addressbook for to select your on address in KAddressBook (if you have filled your own address in KaddressBook) or use the second tab Manual entry for to fill in the information of the address from your company manually. This step is necessary for the correct generation of your documents as the address is automatically used in the document generation step.

    Company adress

    After the initial setup, select Preferences  Settings. That allows to prepare Kraft correctly so it can be used in a proper way.

    In the Preferences dialog we have the tabs:

    *Dokument Voreinstellungen
    *Steuern
    *Dokumenttypen
    *Stundensätze
    *Einheiten
    *die eigene Identität

    Each of the tabs allows to enter useful values for the specific use case.

    Dokumenttypen

    Beim ersten Start finden sich folgende Dokumenttypen:

    • Auftragsbestätigung

    • Lieferschein

    • Rechnung

    • Angebot

    Document type

    Übersetze diese Typen in die eigene Sprache. Du kannst ebenso neue hinzufügen und Einträge entfernen, die Du nicht benutzen wirst.

    Nummernkreise

    Numbercycles Each document has to have an unique identifier that identifies the document. There must not be two documents in Kraft with the same identifier.

    The format of the identifier is configuratable in Kraft. For that, Kraft has a concept of so called number cycles. Number cycles are used to define the form of the document number which is printed on every document.

    All documents of a certain type have identifiers taken out of one number cycle. Each document type has a number cycle assigned. Different document types can use the same number cycle to generate ids from. That way, for example the document types Invoice and Final Invoice can use numbers from the same number cycle, even thought they are different document types in Kraft. Number cycles are identified by their name. User can create new number cycles and edit them clicking on the button Edit Number Cycles…​

    The format of the document numbers are defined by a template that can contain normal, fixed characters and also some variables that are replaced by the respective values when the document is created.

    Each identifier needs to be unique, and thus has to contain a counter. Kraft supports two types of counter: One (variable %i) is incremented globally for every new document. The other (variable %n) is reset every day and starts at 1 again on every new day. In addition to the counter, more information can be added to the template form an useful number. Examples are a constant text or parts of the date.

    The default numbercycle delivered with Kraft contains the year, the month and a serialnumber. That way you can compare offers or orders from last year with this year or the month April of last year with the month April of this year and get on this way an impression from the results of your business.

    Folgende Variablen stehen zur Verfügung:

    %y or %yyyy

    the year of the document date.

    %yy

    the year of the document (two digits).

    %w

    the week number of the document date.

    %ww

    the week number of the document date with leading zero.

    %d

    the day number of the document date.

    %dd

    the day number of the document date with leading zero.

    %m or %M

    the month number of the document date.

    %MM

    the month number with leading zero.

    %c

    the customer id from kaddressbook

    %type

    the localised doc type (offer, invoice etc.)

    %uid

    the contact id of the client.

    %i .. %iiiiii

    the unique counter

    %n .. %nnnnnn

    the unique day counter (combine with date)

    A number cycle template needs to contain either %i or %n, if not, %i is appended automatically.

    Both %i and %n are numeric values. They can also be padded with with leading zeros. The length is defined by the number of i’s or n’s put into the template. For example, if a daily counter with length of three and leading zeros is desired, %nnn has to be put into the template. This works up to a length of six characters.

    Anmerkung
    The "design" of the numbercycles and document numbers is very important. With the flexible system of templating Kraft can not prevent invalid number cycles. It is in the responsibility of the user.

    PDF Template

    In the entry field Template File: the user can select a custom template for this specific document type.

    If the file extension of the template file is .trml, the ReportLab based document converter is used. If the file extension is .gtmpl, Kraft automatically uses the Weasyprint based converter.

    Anmerkung
    The ReportLab system for PDF creation is deprecated in Kraft. Please, for new templates, always use Grantlee- and Weasyprint based templates.

    PDF Postprocessing

    After Kraft has created the PDF document it is possible to merge the created PDF with static, customized PDFs created by the user. With that, it is easy to add a custom stationery with a logo to the resulting PDF ("Watermark").

    The static PDFs should have the same page size as the generated documents. Keep in mind to use optimized images for logos etc. to not blow up the size of the result document.

    PDF Postprocessing

    The watermark options are:

    1. No Watermark: No watermark is created

    2. On first page: The first page of the watermark.pdf is merged with the first page of the result document

    3. Watermark on all pages: Merges the first page of the watermark PDF to all pages of the result document

    4. alternating: For this, the watermark PDF needs to have three pages. The first page is merged to the first page of the result document, the second and third page are alternated merge to subsequent pages.

    5. different first and last page: the PDF needs to have three pages. The first page is merged to the first page of the result document, the third page to the last, and the second to all page between first and last page.

    If there is another static PDF document put into the entry field "Append PDF:", it is appended to the generated PDF. With that, Kraft will automatically add for example terms and conditions documents to the final document.

    Steuern

    Taxes In many countries there are two kinds of VAT-taxes for sold products.

    Ein hoher und ein niedriger Steuersatz.

    Fill here the appropriate amounts in for the high level and the low level. If the tax-level is changing, then you add here the start date with the new tax-levels.

    Wages

    Wages A list of wage costs is maintained in Kraft. The items are used in templates and during calculation.

    All data can be edited, customized and new items can be added in the Kraft Configuration Dialog reachable through the Settings menu.

    Remember that these units are later used in the documents, it is therefor important that you translate them to your own language and to fill in the correct prices.

    Units of measurement

    Units of measurement A list of units of measurement is maintained in Kraft. In Kraft Configuration Dialog reachable through the Settings menu can you edit and customize items already in the list, and also can you add new items to the list.

    Remember that these units are later used in the documents, it is therefor important that you translate them to your own language.

    Own identity

    Check here if the information that you have given during the initial setup is correct for the use in the documents.

    Warnung
    If you made the choice to use the information from KaddressBook then is the information from a later manual entry ignored.

    After we have made some corrections to the configuration, we go back to the main window.Here we see three tabs:

    • Documents

    • Timeline

    • Catalogs

    Catalogs

    Kraft supports so called Catalogs in which templates for document items are kept. With the catalogs creating documents can be significantly accellerated in the day to day business. When creating new documents, the items templates from the catalogs can easily selected and moved over to the document.

    Since templates are organized in chapters entire documents can be prepared in different chapters to be used as template documents.

    Of course the items in the documents can be edited after they got picked from a catalog.

    By default Kraft comes with two different catalogs:

    Material

    A catalog of material that are sold, with their purchase prices, the profit and the sell-price.

    and Standard Templates

    A catalog of standard recipes of work like planting trees.

    Both catalogs can have chapters and sub-chapters for to organize your templates. First we are going to fill in the

    Material Catalog

    A catalog of material that are sold, with their purchase prices, the profit and the sell-price. First we are going to add new chapters and subchapters.

    New chapters

    Select with the mouse the column-name material, select now in the context-menu [Add a sub chapter]

    and add an extra chapter like Trees

    New sub chapters

    We are going to ad sub chapters in the map Trees. Select with the mouse the name of the chapter where you like to add a subchapter, select now in the context-menu [Add a sub chapter] and ad an extra subchapters like Loaf trees and needle trees. After adding the extra chapters and subchapters for dividing the material, we are going to add the material themself.

    New template

    Select with the mouse the name of the sub-chapter or chapter where you like to add a material. Select the sub map Loaf trees and select now in the context-menu

    Add the extra materials coconut tree, apple tree and pine-apple tree.

    Fill in the price that we have paid.

    Fill in the profit that we want to have on the material

    And fill in how much is in a packet.

    Material catalog After this we add also in the map 'Wood' a item for a 'support pole' for later use with its price.

    Now we are going to:

    Standard Templates

    This is a catalog of standard recipes of work like:

    • planting trees

    • cutting grass

    • transport costs

    • planting grass

    • sowing grass-seed

    We add here the standard work of planting a tree.

    Select with the mouse the name of the chapter [Work] where you like to add the new template,

    select now the context-menu [New template]

    and the extra templates Plant tree and cut grass.

    After we made the new template, a window opens with 4 tabs:

    • Template

    • Time calculation

    • Fixkosten

    • Material

    First we go to the tab:

    Template

    We give here the name of the new standard template like Plant tree Standard catalog

    Warnung
    be careful, this name is later used in the invoice

    we select that this is per piece and that the margin is 8% and that the full VAT is applicable.

    Time calculation

    We fill here in a number of work with the time:

    Tabelle 1. Spent time

    Dig hole

    32 min.

    worker

    Place tree

    12 min.

    worker

    Fill hole

    17 min.

    worker

    give water

    5 min.

    worker

    The cost for worker which we have earlier filled in is now used. Time calculation

    Anmerkung
    in the invoice we see later only Plant tree, we will not see the parts dig hole,place tree,fill hole,give water

    Now we go to the tab

    Fixed costs

    and fill in:

    Tabelle 2. Fixed item

    Transportcost

    35 euro

    1 pcs.

    Fixed cost

    After this we go to the tab:

    Material

    Here we select next, after which the window [Add Material to Calculation] opens for a selection of material. We navigate to the map 'wood' where we select the 'support pole'.

    Tabelle 3. Used materials

    1

    support pole

    3,5 euro

    Material

    We go now back to the first tab template

    On the first tab [template], we can now see the overall cost per one unit

    Click on [OK] for saving the result or on [cancel] for discarding the result.

    We make a second template cut grass

    we fill in cut grass, as unit we choose sm (square meter), on the second tab we fill in that we need 3 min per square meter.

    Click on [OK] for saving the result or on [Cancel] for discarding the result.


    Kraft supports text templates also for the header- and footer-text of documents. Each document type has it’s own set of text templates. To access them, open a document of a certain document type in edit mode and use the show templates to make the templates visible. In both the header- and footer-section the stored templates become visible.

    Directly under the navigation pane on the right side of the window is a list of the names of the available templates. Clicking on one of the names in the list displays the text in the pane below.

    Underneath there are buttons located with the following functions from left to right:

    1. Add the template to the document: This button replaces the text of the document with the selected template.

    2. Insert the template to the document: The selected template is inserted to the current place of the cursor in the document.

    3. Create a new template: Opens a dialog to enter a complete new template for the current doc type.

    4. Edit the current template: Opens the dialog to edit the currently selected template.

    5. Delete the current template: Removes the template permanently from the list of available templates.

    Anmerkung
    Templates with the name Standard are the default templates for the document type. They are inserted automatically if a document of this type is created.

    Macros

    Both the header- and footer-templates can contain so called macros which are replaced with calculated values once the document is rendered to the final output format.

    The following list of macros are supported:

    • DATE_ADD_DAYS(<amount_days>): Returns the date of the of document plus the number of days specified as parameter to the macro.

    • ITEM_COUNT_WITH_TAG(<tag>): Returns the amount of items tagged with the tag.

    • NETTO_SUM_PER_TAG(<tag>): Returns the netto sum of all items that are tagged with the named tag.

    • BRUTTO_SUM_PER_TAG(<tag>): Returns the brutto sum of all items that are tagged with the named tag.

    • VAT_SUM_PER_TAG(<tag>): Returns the pure tax of all items that are tagged with the named tag.

    • IF_ANY_HAS_TAG(<tag>) and END_HAS_TAG: Includes the text between the two macros only if there is at least one item that is tagged with the tag.

    As an example, this footer text template can be used to automatically generate useful texts:

    Please pay this invoice until three weeks after the date of the document, which is the DATE_ADD_DAYS(21).
    
    IF_ANY_HAS_TAG(Material)
    This invoice lists material in ITEM_COUNT_WITH_TAG(Material) items. The net value is NETTO_SUM_PER_TAG(Material),
    plus VAT_SUM_PER_TAG(Material) = BRUTTO_SUM_PER_TAG(Material).
    END_HAS_TAG

    We are now ready for the first invoice.

    Creating Documents

    The first Invoice

    Open the tab documents

    Click on create document

    The window document [creation wizard opens].

    Select in document type invoice.

    Fill in on the whiteboard content a short text about what the invoice is, like: cut grass and planted tree for mister Jonson

    Click on next

    Select on the new window the name and address from the client.

    (if the name and address is not there, click then on new contact or on edit contact if you want to edit the contact)

    Click on OK.

    Now opens the window document [items].

    this window has 2 tabs and the 3 buttons on the top:

    • Add item…​,

    • Add discount item,

    • Show templates.

    In the left tab you can see all the items that we want to place on the invoice, on the right tab we see the text from the header, the total price and the footer.

    If you click on the text of the header or the footer on the right side then the window changes in such a way that you can edit the header or the footer.

    Adapt the header and the footer to your situation, on the footer you can place a text: We make your garden-dream come to reality..

    Click on the button Show templates.

    The right tab changes and show now the earlier made templates, we select in the group Work, the subgroup Plant tree and click then on the button with the to the left pointing arrow on the bottom side.

    A new window [Create Item from Template] opens.

    Because we have planted 2 trees, we go to the field [insert] and change this to 2 pcs.

    Click on OK for saving the result or on cancel for discarding the result.

    The window close and we go back to the main window.

    We click again on Show templates and select this time cut grass, we click again on the button with the arrow, in the opened window we select that the grass-field was 24 square meter.

    Click on OK for saving the result or on Cancel for discarding the result.

    We add now manually an item by clicking on the button Add item… and the window [create new item] opens.

    Because we have delivered a special tree, we fill here in the name of the special tree liguster, at the field insert we fill in the number of the special trees that we have delivered and the price of them.

    Warnung
    Remind that in the catalog we can add a profit on the price of the material, in the invoice and in the offer we can not add a profit on the price of the material.

    We have now an invoice with 3 items.

    Click on OK for saving the invoice or on Cancel for discarding the invoice.

    We click on OK and save the result.

    Your first invoice is now ready for sending.

    In the window documents we see our first invoice, notice that this document has a document number which we can see on the left side.

    On top of the window with all the invoices we see the button [Print Document], on which we click.

    From the invoice will now a PDF be made which we can print on paper or send by email to the client.

    After this we are going to create a offer for some work in a garden.

    Creating an Offer

    The client has asked to plant a tree, we will offer 3 different trees which we can plant.

    Beside this, we have seen that there is a lifeless three, which we will offer to remove as extra work. Numbercycles

    For the total price we do not want to show the price of the removal of the lifeless tree and we want for the total price only to show the price of one tree and not three.

    Open again the tab documents.

    Click on create document

    The window Document Creation Wizard opens.

    select in document type > Offer.

    Fill in on the whiteboard content a short text about what the offer is, like: plant one tree and removal of lifeless tree

    Click on next

    Select on the new window the name and address from the client.

    (if the name and address is not there, click then on new contact or on edit contact if you want to edit the contact)

    Click on OK.

    Now the window [edit document] opens.

    This window has 2 tabs and the 3 buttons on the top:

    • Add item…​,

    • Add discount item,

    • Show templates.

    Click on the button Show templates.

    The right tab changes and show now the earlier made templates, we select in the group Work, the subgroup Plant tree and click then on the button with the to the left pointing arrow on the bottom side.

    A new window [Create Item from Template] opens.

    Because we want to plant 1 tree, we go to the field [insert] and keep this on 1 pcs.

    Click on OK for saving the result or on Cancel for discarding the result.

    The window close and we go back to the main window.

    We click on the button Show templates and this time we select in catalog Material

    The material-catalog opens, and we can select in the chapter trees the subchapter loaf trees in which we select the apple tree which we made earlier.

    Click on we OK for saving the result or on cancel for discarding the result.

    The window close and we go back to the main window.

    We add now manually an item by clicking on the button Add item….

    the window [create new item] opens.

    We want that the client can make a choice from an apple, a pear tree and the liguster.

    Therefor we are going to add also a pear tree manually.

    We click on the button Add item… and the window [create new item] opens.

    We fill here in the name of the tree Pear tree, at the field insert we fill in the number of the special trees that we have delivered and the price of them.

    We want add this to the material catalog for future use, therefor we select also [select this item as template for future documents] and we select in trees.

    Click on OK for saving the result or on Cancel for discarding the result.

    We does this again but then for the liguster.

    We have now 3 items with trees in the offer.

    As last item we add an item with remove tree with 0,5 hour for 32 euro.

    On the left side of an item we can see 2 buttons:

    a button with a flag and a button with what looks like a page.

    We select the upper button with the page after which opens a context-menu with the items:

    Context menu

    [Item kind]->[Normal]
    [Item kind]>[Alternative]
    [Item kind]>[On demand]
    [Tax]
    [Move up]
    [Move down]
    [Lock item]
    [Unlock item]
    [Delete item]

    We choose here [Item kind] and change for pear tree from [normal] to [alternative].

    We do this also for [liguster] and for [remove tree] we change this from [normal] to [on demand].

    Context menu

    Click on OK for saving the result or on Cancel for discarding the result.

    We want to see the result and therefor we click on the button [show document].

    We see now that the prize of the pear tree, the liguster and the removal of the tree is not used for the total prize. When we are happy with the result, we can click on the button close after which we click on the button Print Document for making a PDF what we can print out or send to the client.

    After your first invoice is now your first offer now also ready for sending.

    Creating an Acceptance of Order

    The document type "Acceptance of Order" is sent subsequently to an offer.

    Numbercycles

    When a client has made a request, we will send an offer in wich we describe which items we will deliver. Hopefully the client will give an order for the work.

    It is a good practice to respond on the order with an "Acceptance of order" in which we describe all the items we will deliver. We can make the "Acceptance of order" on the same way as we made the invoice or the offer by selecting each item and correcting the number of delivery. This takes time and we can make errors by forgetting items or filling an incorrect number.

    It can be done quicker by selecting the offer in the list and selecting Create Followup Document from either the context menu or the main menu.

    We have now in documenttype the choice from:

    [Acceptance of order]
    [Invoice]
    [Partial Invoice]
    [final Invoice]
    [Progress Payment Invoice]

    Folloup document

    We select here "Acceptance of order". We have now a copy from the offer as an Acceptance of order (do not forget to adapt Alternative Delivery items and on demand items.)

    Folloup document

    You can do this also for the creation of the invoice as a followup for Acceptance of order. Each document type has a specific list of follow up documents. It is a good practice to describe on the invoice precisely what was delivered.

    Customization

    Kraft can be customized in most of the graphical user interface and in particular in the output it generates.

    Output Document Customization

    To create PDF output documents, the document data that was edited in the Kraft app is filled into a template. The template defines how the output document looks like, ie. by font settings, placing of elements and such.

    The file that is assembled from data and the template is converted to PDF using a special document creation script. All that is started automatically by Kraft if a document should be printed.

    Each document type in Kraft can have it’s own template that is used to create a PDF. Which one can be set in the Settings dialog for document types.

    WeasyPrint Documents

    Anmerkung
    Kraft still ships with the old ReportLab based converter, but that will be deprecated the future. The WeasyPrint based system is the future. It is a recommended to port existing templates.

    With WeasyPrint Kraft uses a very powerful generator that makes it very easy to create highly customized documents with great quality.

    WeasyPrint converts a html file to PDF. It is integrating a cascading stylesheet (CSS) file which has a huge impact on the PDF document’s look.

    The html- and CSS input file for WeasyPrint is built from the Kraft template file.

    To enable the use of WeasyPrint for a document type in Kraft, simply create a weasyprint compatible template file and save it with the extension .gtmpl. Based on the file extension Kraft automatically uses WeasyPrint and the Grantlee templating engine for rendering.

    From version 0.95 on Kraft ships with an example template in the Grantlee- and WeasyPrint format. It can be found at /usr/share/kraft/reports/invoice.gtmpl or online on Github. An example CSS file kraft.css (on Github) is shipped as a good starting point for adoption.

    Template Variables

    To generate the PDF, Kraft has to transfer data from the document you have been working on to the input file that is processed to a PDF. For that, Kraft uses a text template in which Kraft replaces variables with the actual values.

    For example, the tag {{ doc.doctype }} is replaced with the current document type during the generating process.

    The syntax is based on the Django syntax for templates described in the the docs.

    On the PDF output it is nice to have a logo image included, if the documents should not be printed on a prepared stationary that comes with a printed logo already.

    This chapter describes a few methods to achieve that with the weasyprint based template.

    PDF Watermark Funktionality

    The first, and easiest way to add a logo and other details on the print out is to use the so called PDF Watermark option.

    That means that the generated document, which does not contain a logo at all, is merged with another PDF into one doc. The so called watermark feature requires an otherwise empty PDF page of the same size as your generated document, that has the logo printed at the right position. It can be created with a text processor that can export PDF.

    In the Kraft doc type settings dialog, the watermark options for a specific doc type can be selected. The watermark PDF file can be selected and either be applied to the first page only, or to every page of the generated document.

    Once set up, Kraft automatically merges the generated document with the watermark PDF. The result document contains the content of both documents merged together. This is not only useful for logos, but also other details in the document footer.

    CSS Directives for Pages

    The second option is to use the CSS directive for page content on printed HTML pages. This only works with the new weasyprint based doc generation.

    It uses Cascading Style Sheet (CSS) directives for paged media. CSS uses the @page keyword to define attributes of the page on which the content is printed. Weasyprint makes heavy use of that, for example to define the page size.

    In the Kraft default template for weasyprint called invoice.gtmpl this page section can be found:

    @page {
        size: A4;
        margin-left: 2.4cm;
        margin-top:27mm;
        margin-right: 1.6cm;
        margin-bottom: 2cm;
        color: #2f590a;
    }

    which defines the page size to be A4, with the given margins and a default text color.

    To add a logo on in the top left corner of the first page of the result doc, the following snippet could be added:

    @page :first {
      margin-top: 20mm;
      margin-bottom: 3cm;
    
      @top-left {
        content: url(/home/miller/miller_logo_s1.png);
        width:3cm;
        height: 1cm;
      }
    }

    This displays the top left content only on the first page, and also assigns a different top- and bottom margin to the first page. Note that the content url in the example is a local path, but any valid URL can be used.

    Show in absolutely placed divs

    EPC QR Code

    With Weasyprint based PDF generation Kraft supports the EPC QR Code which implements a European standard for payments by computer and mobile devices.

    In Germany it is also known as Giro Code, in Belgium as Bancontact QR, in the Netherlands as iDEAL QR-code and in Spain it is also known as Bizum QR-code.

    In Germany it is accepted by the Giro Code and in Holland it is accepted by the official iDEAL QR-code app.

    In Belgium and Holland it is accepted by the apps of many banks, and in Austria and Finland it is accepted by the apps of all banks.

    To use the EPC QR code on the invoice printout, the bank account information has to be added to own identity settings dialog in Kraft. The giro code is current only generated for documents with the document type Rechnung.

    To include the generated EPC QR Code into the PDF document, the Weasyprint template needs to contain a snippet like this:

        {%if doc.isInvoice and epcqrcode.valid %}
        <p class="epcqrcode">
          <img class="epc" src="file://{{ epcqrcode.svgfilename }}" alt="EPC QR Code" />
          Dieser QR Code ermöglicht einfaches, sicheres und schnelles Begleichen dieser Rechnung via GiroPay:
          Diesen Code mit dem Smartphone scannen und Überweisung per Banking App aufgeben.
        </p>
        {% endif %}

    Main Application Menu

    The File Menu

    [File]>[Quit]
    [Ctrl]+[Q]
    Quits the application.

    The Document Menu

    [Document]>[Show Document]
    [Ctrl]+[R]
    Opens a window with the selected document for showing it.
    [Document]>[Edit Document]
    [Ctrl+O]
    Opens a window with the selected document for editing it.
    [Document]>[Open Archived document]
    [Ctrl]+[A]
    Opens an archived document.
    [Document]>[Create Document]
    Opens a window with a wizard for creating a new client-document.
    [Document]>[Copy Document]
    Makes a copy of the selected client-document to a new client-document
    which can belong to an other client or an other documenttype.
    [Document]>[Follow Document]
    Opens the selected client-document for editing.
    [Document]>[Mail document]
    [Ctrl]+[M]
    Mails a document.

    The Settings menu

    [Settings]>[Edit Tag Templates]
    [Ctrl]+[E]
    Opens a window where you add, edit or translate the tags (like work,
    material, plants or discounts).
    [Settings]>[Redo initial setup]
    [Ctrl+R]
    Redoes the initial setup. After this, a restart of Kraft is required.
    [Settings]>[Showed toolbars]
    Here you can decide if the `main toolbar` and the toolbar `Document Actions`
    are shown.
    [Settings]>[Configure Kraft]
    [Ctrl]+[Shft]+[,]
    Here you can configure Kraft.

    Document Edit Window

    The context Menu

     [Context]>[Item kind]
     change the status from this item between
    * Normal
    * Alternative
    * On demand
    [Context]>[Tax]
    Seems not working.
    [Context]>[Move up]
    Moves this item a place up in document.
    [Context]>[Move down]
    Moves this item a place down in document.
    [Context]>[Lock item]
    It is not clear what is does.
    [Context]>[Unlock item]
    It is not clear what is does.
    [Context]>[Delete item]
    Removes this item from document.

    Fortgeschrittene Themen

    Dieses Kapitel beschreibt fortgeschrittene Themen um Kraft. Dabei wird etwas Linux-Kenntnis vorausgesetzt, und das Aufsetzen sollte von erfahreneren Linux Administratoren durchgeführt und gut testet werden.

    Using Kraft Collaboratively

    Kraft kann kollaborativ in einer verteilten Umgebung verwendet werden. Das heisst, dass mehrere Benutzer an ihren jeweiligen Arbeitsplatzrechnern mit ihrer eigenen Kraft Instanz arbeiten können und dabei die selben Daten verwenden.

    Das ganze Thema ist Veränderung unterworfen, da Kraft in naher Zukunft ownCloud als private Cloud Lösung zur Datenspeicherung verwenden wird.

    Datenbank und Dokumentpool teilen

    Der einfachste Fall ist das zwei oder wenige mehr Kraft Instanzen die Datenbank gemeinsam benutzen und den Pool von PDF Dokumenten gemeinsam verwenden. Um es einfach zu halten werden hier zwei Instanzen beschrieben.

    Ein typischer Anwendungsfall könnte sein: Zwei verschiedene Linux user möchten Kraft verwenden. Sie haben beide ihren eigenen Computer und arbeiten im selben Netzwerk. Dieses Beispiel beschreibt eine Situation mit einem Hauptbüro das Kraft im normalen Modus betreibt, und einem Notebook mit Kraft, das im NurLesen Modus um Dokumente anzusehen, Kataloge zu überprüfen und ähnliches.

    Dafür müssen die folgenden Voraussetzungen erfüllt sein:

    1. Als Datenbank-Backend wird MySQL oder MariaDB verwendet. Sqlite wird nicht unterstützt.

    2. Die Datenbank ist mit dem MySQL Benutzer von beiden Rechnern aus erreichbar.

    3. Das Dokument-Speicher-Verzeichnis muss geteilt werden.

    Achtung: Es gibt keinen Schutz dagegen, dass beide Benutzer das gleiche Dokument zur gleichen Zeit bearbeiten. Weil das gefährlich ist und zu unvorhersehbaren Resultaten führen kann, ist es empfohlen, Kraft in allen ausser der Haupt-Instanz im Nur-Lese Modus zu betreiben. Der Nur-Lese Modus wird mit Krafts Kommandozeilenschalter -r eingeschaltet.

    Die Datenbank teilen

    Der Datenbankserver sollte auf der Haupt-Maschine installiert sein, oder es sollte ein spezialisiertes Gerät wie ein NAS verwendet werden. Die Netzwerk Geschwindigkeit beeinflusst die Benutzbarkeit natürlich erheblich.

    Howtos um MySQL aufzusetzen sind im Internet zu finden.

    Den Dokument Pool teilen

    Kraft schreibt generierte PDFs in ein lokales Verzeichnis. Welches Verzeichnis das ist kann im Kraft Konfigfile eingerichtet werden. Das Konfigfile muss auf allen Instanzen angepasst werden.

    Es ist in jedem Benutzer Homeverzeichnis unter dem releativen Pfad .config/kraftrc. Es muss den folgenden Konfigurations-Wert enthalten:

    [reporting]
    PdfOutputDir=/data/space/kraftdoc/pdf

    Es gibt verschiedene Wege wie das Verzeichnis geteilt werden kann, zum Beispiel NFS und SMB Server. Es ist entscheidend, dass beide Benutzer von beiden Maschinen die Dateien auflisten und zugreifen können. Der Hauptbenutzer braucht Schreib- und Leserecht., Nur-Lese Bentuzer brauchen nur Lesezugriff auf die Dateien.

    Ein empfohlenes Setup benutzt ein NFS Share über autofs, das auf der Hauptmaschine aufgesetzt werden muss. Um Dateizugriff zu verwalten, sollte eine Gruppe aufgesetzt werden.

    Kraft im Nur-Lesen Modus

    Um Kraft im Nur-Lese Modus zu starten, muss das Programm mit dem Kommandozeilenschalter -r gestartet werden.

    XRechnung Support

    Kraft supports the XRechnung standard. That is a digital format for electronic invoicing, and it passed as law in Germany and follows a EU directive. The XRechnung is a XML file format designed for that purpose.

    To use the XRechnung Export productivly, a little manual work is still needed in Kraft. Kraft creates the XML file based on a template, very similar to the normal PDF documents. That means that it loads a template that contains static elements (ie. the company address) that do not change between different invoices. The dynamic elements (customer data, items etc.) are filled into the template during the generation step.

    In order to generate correct XRechnung files for the specific company, the user has to adopt the template file manually to the companies needs. Note that this has only to be done once and should be easy for a person with a bit computer experience (Basic knowledge about XML appreciated!).

    To adapt the file to the needs of the company, it is best to start with the example XRechnung file. It has to be downloaded and saved into a location that the user can edit. Open it in a normal text editor, such as Kate.

    Read carefully through the file without being scared off by the XML format. All user strings (ie. company name, address and such) are user specific and should be replaced accordingly. Find details about the format here to better understand the meaning of the fields.

    Make sure to not disturb the proper XML format and do not change places where the template format {{ template_name }} is used.

    Once the file is adopted to the needs, open the Settings dialog of Kraft and insert the filename into the entry field for the XRechnung Template File on the Document Defaults page.

    After that step, the Export XRechung menu item will open a dialog to pick a filename where to save the XRechnung invoice to.

    This file can now be transfered to the receiver of the invoice.

    Anmerkung
    There are validators for invoices in XRechnung format out there in the internet. It is useful to verify the format of the Kraft exported XRechnung.

    Changing the Locale

    If it is needed that Kraft runs under a different locale than the actual desktop environment, this can be achieved by setting the desired locale in the start file of Kraft.

    On the linux desktop, apps are usually started through a so called desktop file. It contains the information how the Kraft binary is started if user clicks on the icon on the desktop or in the start menu.

    The desktop file can usually be found in /usr/share/applications/de.volle-kraft-voraus.kraft.desktop.

    It contains the line

    Exec=kraft %u

    which starts the application with the default locale.

    Changing it to

    Exec=env LANG=de_DE.UTF-8 kraft %u

    would change that to run in the German locale for example, independent from the desktop environment location.

    Credits und Lizenz

    Program and documentation copyright 2004–2024 Klaas Freitag

    Documentation copyright 2020-2024 Ronald Stroethoff

    kraft-1.2.2/manual/kraft-en.html000066400000000000000000003057631467704360200165240ustar00rootroot00000000000000 The Kraft Handbook

    Introduction

    Kraft is a Qt and KDE application to organize office documents like quotes and invoices in a small business. It eases the creation of documents and helps with repeating tasks.

    Using Kraft, there is no need for fiddling with a text processor any more. Documents are created by a few clicks, edited, generated and archived automatically. Kraft generates high quality PDF output for printing, mailing and archiving.

    Feature Overview
    • Simple creation of offers, invoices and similar documents.

    • Customer management, deeply integrated with the mature KDE KAddressbook.

    • Maintenance of document relations, ie. Partial invoices vs. invoices.

    • Templates for document header- and footertexts and for document items.

    • Pre calculation of item prices.

    • Material management.

    • Configurable document creation in PDF format for print and email.

    The code of Kraft is open source and is released under the GNU General Public License.

    Note
    Kraft is driven by community of users, coders, artists and others by voluntary work.
    Also this manual needs contributions!

    Learn more on how to contribute!

    First Use and Basic Configuration

    When Kraft is started for the first time, it automatically enters the initial setup process.

    During the initial setup you are asked to select a database to use and give the name and address of your company.

    You can fill in your company address (that appears on the printed documents) in two ways: in the setup procedure use the first tab Select from Addressbook for to select your on address in KAddressBook (if you have filled your own address in KaddressBook) or use the second tab Manual entry for to fill in the information of the address from your company manually. This step is necessary for the correct generation of your documents as the address is automatically used in the document generation step.

    Company adress

    After the initial setup, select Preferences  Settings. That allows to prepare Kraft correctly so it can be used in a proper way.

    In the Preferences dialog we have the tabs:

    *Document Defaults
    *Taxes
    *Documunt Types
    *Wages
    *Units
    *Own identity

    Each of the tabs allows to enter useful values for the specific use case.

    Document Types

    At the first use you find a list of different document types, such as:

    • Acceptance of order

    • Delivery receipt

    • Invoice

    • Offer

    Document type

    Translate this types to your own language. You can also add new ones and remove document types you wont use.

    Numbercycles

    Numbercycles Each document has to have an unique identifier that identifies the document. There must not be two documents in Kraft with the same identifier.

    The format of the identifier is configuratable in Kraft. For that, Kraft has a concept of so called number cycles. Number cycles are used to define the form of the document number which is printed on every document.

    All documents of a certain type have identifiers taken out of one number cycle. Each document type has a number cycle assigned. Different document types can use the same number cycle to generate ids from. That way, for example the document types Invoice and Final Invoice can use numbers from the same number cycle, even thought they are different document types in Kraft. Number cycles are identified by their name. User can create new number cycles and edit them clicking on the button Edit Number Cycles…​

    The format of the document numbers are defined by a template that can contain normal, fixed characters and also some variables that are replaced by the respective values when the document is created.

    Each identifier needs to be unique, and thus has to contain a counter. Kraft supports two types of counter: One (variable %i) is incremented globally for every new document. The other (variable %n) is reset every day and starts at 1 again on every new day. In addition to the counter, more information can be added to the template form an useful number. Examples are a constant text or parts of the date.

    The default numbercycle delivered with Kraft contains the year, the month and a serialnumber. That way you can compare offers or orders from last year with this year or the month April of last year with the month April of this year and get on this way an impression from the results of your business.

    See the following table for available variables which can be used:

    %y or %yyyy

    the year of the document date.

    %yy

    the year of the document (two digits).

    %w

    the week number of the document date.

    %ww

    the week number of the document date with leading zero.

    %d

    the day number of the document date.

    %dd

    the day number of the document date with leading zero.

    %m or %M

    the month number of the document date.

    %MM

    the month number with leading zero.

    %c

    the customer id from kaddressbook

    %type

    the localised doc type (offer, invoice etc.)

    %uid

    the contact id of the client.

    %i .. %iiiiii

    the unique counter

    %n .. %nnnnnn

    the unique day counter (combine with date)

    A number cycle template needs to contain either %i or %n, if not, %i is appended automatically.

    Both %i and %n are numeric values. They can also be padded with with leading zeros. The length is defined by the number of i’s or n’s put into the template. For example, if a daily counter with length of three and leading zeros is desired, %nnn has to be put into the template. This works up to a length of six characters.

    NOTE: The "design" of the numbercycles and document numbers is very important. With the flexible system of templating Kraft can not prevent invalid number cycles. It is in the responsibility of the user.

    PDF Template

    In the entry field Template File: the user can select a custom template for this specific document type.

    If the file extension of the template file is .trml, the ReportLab based document converter is used. If the file extension is .gtmpl, Kraft automatically uses the Weasyprint based converter.

    NOTE: The ReportLab system for PDF creation is deprecated in Kraft. Please, for new templates, always use Grantlee- and Weasyprint based templates.

    PDF Postprocessing

    After Kraft has created the PDF document it is possible to merge the created PDF with static, customized PDFs created by the user. With that, it is easy to add a custom stationery with a logo to the resulting PDF ("Watermark").

    The static PDFs should have the same page size as the generated documents. Keep in mind to use optimized images for logos etc. to not blow up the size of the result document.

    PDF Postprocessing

    The watermark options are:

    1. No Watermark: No watermark is created

    2. On first page: The first page of the watermark.pdf is merged with the first page of the result document

    3. Watermark on all pages: Merges the first page of the watermark PDF to all pages of the result document

    4. alternating: For this, the watermark PDF needs to have three pages. The first page is merged to the first page of the result document, the second and third page are alternated merge to subsequent pages.

    5. different first and last page: the PDF needs to have three pages. The first page is merged to the first page of the result document, the third page to the last, and the second to all page between first and last page.

    If there is another static PDF document put into the entry field "Append PDF:", it is appended to the generated PDF. With that, Kraft will automatically add for example terms and conditions documents to the final document.

    Taxes

    Taxes In many countries there are two kinds of VAT-taxes for sold products.

    A high level and a low level.

    Fill here the appropriate amounts in for the high level and the low level. If the tax-level is changing, then you add here the start date with the new tax-levels.

    Wages

    Wages A list of wage costs is maintained in Kraft. The items are used in templates and during calculation.

    All data can be edited, customized and new items can be added in the Kraft Configuration Dialog reachable through the Settings menu.

    Remember that these units are later used in the documents, it is therefor important that you translate them to your own language and to fill in the correct prices.

    Units of measurement

    Units of measurement A list of units of measurement is maintained in Kraft. In Kraft Configuration Dialog reachable through the Settings menu can you edit and customize items already in the list, and also can you add new items to the list.

    Remember that these units are later used in the documents, it is therefor important that you translate them to your own language.

    Own identity

    Check here if the information that you have given during the initial setup is correct for the use in the documents.

    WARNING: If you made the choice to use the information from KaddressBook then is the information from a later manual entry ignored.

    After we have made some corrections to the configuration, we go back to the main window.Here we see three tabs:

    • Documents

    • Timeline

    • Catalogs

    Catalogs

    Kraft supports so called Catalogs in which templates for document items are kept. With the catalogs creating documents can be significantly accellerated in the day to day business. When creating new documents, the items templates from the catalogs can easily selected and moved over to the document.

    Since templates are organized in chapters entire documents can be prepared in different chapters to be used as template documents.

    Of course the items in the documents can be edited after they got picked from a catalog.

    By default Kraft comes with two different catalogs:

    Material

    A catalog of material that are sold, with their purchase prices, the profit and the sell-price.

    and Standard Templates

    A catalog of standard recipes of work like planting trees.

    Both catalogs can have chapters and sub-chapters for to organize your templates. First we are going to fill in the

    Material Catalog

    A catalog of material that are sold, with their purchase prices, the profit and the sell-price. First we are going to add new chapters and subchapters.

    New chapters

    Select with the mouse the column-name material, select now in the context-menu [Add a sub chapter]

    and add an extra chapter like Trees

    New sub chapters

    We are going to ad sub chapters in the map Trees. Select with the mouse the name of the chapter where you like to add a subchapter, select now in the context-menu [Add a sub chapter] and ad an extra subchapters like Loaf trees and needle trees. After adding the extra chapters and subchapters for dividing the material, we are going to add the material themself.

    New template

    Select with the mouse the name of the sub-chapter or chapter where you like to add a material. Select the sub map Loaf trees and select now in the context-menu

    Add the extra materials coconut tree, apple tree and pine-apple tree.

    Fill in the price that we have paid.

    Fill in the profit that we want to have on the material

    And fill in how much is in a packet.

    Material catalog After this we add also in the map 'Wood' a item for a 'support pole' for later use with its price.

    Now we are going to:

    Standard Templates

    This is a catalog of standard recipes of work like:

    • planting trees

    • cutting grass

    • transport costs

    • planting grass

    • sowing grass-seed

    We add here the standard work of planting a tree.

    Select with the mouse the name of the chapter [Work] where you like to add the new template,

    select now the context-menu [New template]

    and the extra templates Plant tree and cut grass.

    After we made the new template, a window opens with 4 tabs:

    • Template

    • Time calculation

    • Fix costs

    • Material

    First we go to the tab:

    Template

    We give here the name of the new standard template like Plant tree Standard catalog

    WARNING: be careful, this name is later used in the invoice

    we select that this is per piece and that the margin is 8% and that the full VAT is applicable.

    Time calculation

    We fill here in a number of work with the time:

    Table 1. Spent time

    Dig hole

    32 min.

    worker

    Place tree

    12 min.

    worker

    Fill hole

    17 min.

    worker

    give water

    5 min.

    worker

    The cost for worker which we have earlier filled in is now used. Time calculation

    NOTE: in the invoice we see later only Plant tree, we will not see the parts dig hole,place tree,fill hole,give water

    Now we go to the tab

    Fixed costs

    and fill in:

    Table 2. Fixed item

    Transportcost

    35 euro

    1 pcs.

    Fixed cost

    After this we go to the tab:

    Material

    Here we select next, after which the window [Add Material to Calculation] opens for a selection of material. We navigate to the map 'wood' where we select the 'support pole'.

    Table 3. Used materials

    1

    support pole

    3,5 euro

    Material

    We go now back to the first tab template

    On the first tab [template], we can now see the overall cost per one unit

    Click on [OK] for saving the result or on [cancel] for discarding the result.

    We make a second template cut grass

    we fill in cut grass, as unit we choose sm (square meter), on the second tab we fill in that we need 3 min per square meter.

    Click on [OK] for saving the result or on [Cancel] for discarding the result.


    Kraft supports text templates also for the header- and footer-text of documents. Each document type has it’s own set of text templates. To access them, open a document of a certain document type in edit mode and use the show templates to make the templates visible. In both the header- and footer-section the stored templates become visible.

    Directly under the navigation pane on the right side of the window is a list of the names of the available templates. Clicking on one of the names in the list displays the text in the pane below.

    Underneath there are buttons located with the following functions from left to right:

    1. Add the template to the document: This button replaces the text of the document with the selected template.

    2. Insert the template to the document: The selected template is inserted to the current place of the cursor in the document.

    3. Create a new template: Opens a dialog to enter a complete new template for the current doc type.

    4. Edit the current template: Opens the dialog to edit the currently selected template.

    5. Delete the current template: Removes the template permanently from the list of available templates.

    Note
    Templates with the name Standard are the default templates for the document type. They are inserted automatically if a document of this type is created.

    Macros

    Both the header- and footer-templates can contain so called macros which are replaced with calculated values once the document is rendered to the final output format.

    The following list of macros are supported:

    • DATE_ADD_DAYS(<amount_days>): Returns the date of the of document plus the number of days specified as parameter to the macro.

    • ITEM_COUNT_WITH_TAG(<tag>): Returns the amount of items tagged with the tag.

    • NETTO_SUM_PER_TAG(<tag>): Returns the netto sum of all items that are tagged with the named tag.

    • BRUTTO_SUM_PER_TAG(<tag>): Returns the brutto sum of all items that are tagged with the named tag.

    • VAT_SUM_PER_TAG(<tag>): Returns the pure tax of all items that are tagged with the named tag.

    • IF_ANY_HAS_TAG(<tag>) and END_HAS_TAG: Includes the text between the two macros only if there is at least one item that is tagged with the tag.

    As an example, this footer text template can be used to automatically generate useful texts:

    Please pay this invoice until three weeks after the date of the document, which is the DATE_ADD_DAYS(21).
    
    IF_ANY_HAS_TAG(Material)
    This invoice lists material in ITEM_COUNT_WITH_TAG(Material) items. The net value is NETTO_SUM_PER_TAG(Material),
    plus VAT_SUM_PER_TAG(Material) = BRUTTO_SUM_PER_TAG(Material).
    END_HAS_TAG

    We are now ready for the first invoice.

    Creating Documents

    The first Invoice

    Open the tab documents

    Click on create document

    The window document [creation wizard opens].

    Select in document type invoice.

    Fill in on the whiteboard content a short text about what the invoice is, like: cut grass and planted tree for mister Jonson

    Click on next

    Select on the new window the name and address from the client.

    (if the name and address is not there, click then on new contact or on edit contact if you want to edit the contact)

    Click on OK.

    Now opens the window document [items].

    this window has 2 tabs and the 3 buttons on the top:

    • Add item…​,

    • Add discount item,

    • Show templates.

    In the left tab you can see all the items that we want to place on the invoice, on the right tab we see the text from the header, the total price and the footer.

    If you click on the text of the header or the footer on the right side then the window changes in such a way that you can edit the header or the footer.

    Adapt the header and the footer to your situation, on the footer you can place a text: We make your garden-dream come to reality..

    Click on the button Show templates.

    The right tab changes and show now the earlier made templates, we select in the group Work, the subgroup Plant tree and click then on the button with the to the left pointing arrow on the bottom side.

    A new window [Create Item from Template] opens.

    Because we have planted 2 trees, we go to the field [insert] and change this to 2 pcs.

    Click on OK for saving the result or on cancel for discarding the result.

    The window close and we go back to the main window.

    We click again on Show templates and select this time cut grass, we click again on the button with the arrow, in the opened window we select that the grass-field was 24 square meter.

    Click on OK for saving the result or on Cancel for discarding the result.

    We add now manually an item by clicking on the button Add item… and the window [create new item] opens.

    Because we have delivered a special tree, we fill here in the name of the special tree liguster, at the field insert we fill in the number of the special trees that we have delivered and the price of them.

    WARNING: Remind that in the catalog we can add a profit on the price of the material, in the invoice and in the offer we can not add a profit on the price of the material.

    We have now an invoice with 3 items.

    Click on OK for saving the invoice or on Cancel for discarding the invoice.

    We click on OK and save the result.

    Your first invoice is now ready for sending.

    In the window documents we see our first invoice, notice that this document has a document number which we can see on the left side.

    On top of the window with all the invoices we see the button [Print Document], on which we click.

    From the invoice will now a PDF be made which we can print on paper or send by email to the client.

    After this we are going to create a offer for some work in a garden.

    Creating an Offer

    The client has asked to plant a tree, we will offer 3 different trees which we can plant.

    Beside this, we have seen that there is a lifeless three, which we will offer to remove as extra work. Numbercycles

    For the total price we do not want to show the price of the removal of the lifeless tree and we want for the total price only to show the price of one tree and not three.

    Open again the tab documents.

    Click on create document

    The window Document Creation Wizard opens.

    select in document type > Offer.

    Fill in on the whiteboard content a short text about what the offer is, like: plant one tree and removal of lifeless tree

    Click on next

    Select on the new window the name and address from the client.

    (if the name and address is not there, click then on new contact or on edit contact if you want to edit the contact)

    Click on OK.

    Now the window [edit document] opens.

    This window has 2 tabs and the 3 buttons on the top:

    • Add item…​,

    • Add discount item,

    • Show templates.

    Click on the button Show templates.

    The right tab changes and show now the earlier made templates, we select in the group Work, the subgroup Plant tree and click then on the button with the to the left pointing arrow on the bottom side.

    A new window [Create Item from Template] opens.

    Because we want to plant 1 tree, we go to the field [insert] and keep this on 1 pcs.

    Click on OK for saving the result or on Cancel for discarding the result.

    The window close and we go back to the main window.

    We click on the button Show templates and this time we select in catalog Material

    The material-catalog opens, and we can select in the chapter trees the subchapter loaf trees in which we select the apple tree which we made earlier.

    Click on we OK for saving the result or on cancel for discarding the result.

    The window close and we go back to the main window.

    We add now manually an item by clicking on the button Add item….

    the window [create new item] opens.

    We want that the client can make a choice from an apple, a pear tree and the liguster.

    Therefor we are going to add also a pear tree manually.

    We click on the button Add item… and the window [create new item] opens.

    We fill here in the name of the tree Pear tree, at the field insert we fill in the number of the special trees that we have delivered and the price of them.

    We want add this to the material catalog for future use, therefor we select also [select this item as template for future documents] and we select in trees.

    Click on OK for saving the result or on Cancel for discarding the result.

    We does this again but then for the liguster.

    We have now 3 items with trees in the offer.

    As last item we add an item with remove tree with 0,5 hour for 32 euro.

    On the left side of an item we can see 2 buttons:

    a button with a flag and a button with what looks like a page.

    We select the upper button with the page after which opens a context-menu with the items:

    Context menu

    [Item kind]->[Normal]
    [Item kind]>[Alternative]
    [Item kind]>[On demand]
    [Tax]
    [Move up]
    [Move down]
    [Lock item]
    [Unlock item]
    [Delete item]

    We choose here [Item kind] and change for pear tree from [normal] to [alternative].

    We do this also for [liguster] and for [remove tree] we change this from [normal] to [on demand].

    Context menu

    Click on OK for saving the result or on Cancel for discarding the result.

    We want to see the result and therefor we click on the button [show document].

    We see now that the prize of the pear tree, the liguster and the removal of the tree is not used for the total prize. When we are happy with the result, we can click on the button close after which we click on the button Print Document for making a PDF what we can print out or send to the client.

    After your first invoice is now your first offer now also ready for sending.

    Creating an Acceptance of Order

    The document type "Acceptance of Order" is sent subsequently to an offer.

    Numbercycles

    When a client has made a request, we will send an offer in wich we describe which items we will deliver. Hopefully the client will give an order for the work.

    It is a good practice to respond on the order with an "Acceptance of order" in which we describe all the items we will deliver. We can make the "Acceptance of order" on the same way as we made the invoice or the offer by selecting each item and correcting the number of delivery. This takes time and we can make errors by forgetting items or filling an incorrect number.

    It can be done quicker by selecting the offer in the list and selecting Create Followup Document from either the context menu or the main menu.

    We have now in documenttype the choice from:

    [Acceptance of order]
    [Invoice]
    [Partial Invoice]
    [final Invoice]
    [Progress Payment Invoice]

    Folloup document

    We select here "Acceptance of order". We have now a copy from the offer as an Acceptance of order (do not forget to adapt Alternative Delivery items and on demand items.)

    Folloup document

    You can do this also for the creation of the invoice as a followup for Acceptance of order. Each document type has a specific list of follow up documents. It is a good practice to describe on the invoice precisely what was delivered.

    Customization

    Kraft can be customized in most of the graphical user interface and in particular in the output it generates.

    Output Document Customization

    To create PDF output documents, the document data that was edited in the Kraft app is filled into a template. The template defines how the output document looks like, ie. by font settings, placing of elements and such.

    The file that is assembled from data and the template is converted to PDF using a special document creation script. All that is started automatically by Kraft if a document should be printed.

    Each document type in Kraft can have it’s own template that is used to create a PDF. Which one can be set in the Settings dialog for document types.

    WeasyPrint Documents

    Note
    Kraft still ships with the old ReportLab based converter, but that will be deprecated the future. The WeasyPrint based system is the future. It is a recommended to port existing templates.

    With WeasyPrint Kraft uses a very powerful generator that makes it very easy to create highly customized documents with great quality.

    WeasyPrint converts a html file to PDF. It is integrating a cascading stylesheet (CSS) file which has a huge impact on the PDF document’s look.

    The html- and CSS input file for WeasyPrint is built from the Kraft template file.

    To enable the use of WeasyPrint for a document type in Kraft, simply create a weasyprint compatible template file and save it with the extension .gtmpl. Based on the file extension Kraft automatically uses WeasyPrint and the Grantlee templating engine for rendering.

    From version 0.95 on Kraft ships with an example template in the Grantlee- and WeasyPrint format. It can be found at /usr/share/kraft/reports/invoice.gtmpl or online on Github. An example CSS file kraft.css (on Github) is shipped as a good starting point for adoption.

    Template Variables

    To generate the PDF, Kraft has to transfer data from the document you have been working on to the input file that is processed to a PDF. For that, Kraft uses a text template in which Kraft replaces variables with the actual values.

    For example, the tag {{ doc.doctype }} is replaced with the current document type during the generating process.

    The syntax is based on the Django syntax for templates described in the the docs.

    On the PDF output it is nice to have a logo image included, if the documents should not be printed on a prepared stationary that comes with a printed logo already.

    This chapter describes a few methods to achieve that with the weasyprint based template.

    PDF Watermark Funktionality

    The first, and easiest way to add a logo and other details on the print out is to use the so called PDF Watermark option.

    That means that the generated document, which does not contain a logo at all, is merged with another PDF into one doc. The so called watermark feature requires an otherwise empty PDF page of the same size as your generated document, that has the logo printed at the right position. It can be created with a text processor that can export PDF.

    In the Kraft doc type settings dialog, the watermark options for a specific doc type can be selected. The watermark PDF file can be selected and either be applied to the first page only, or to every page of the generated document.

    Once set up, Kraft automatically merges the generated document with the watermark PDF. The result document contains the content of both documents merged together. This is not only useful for logos, but also other details in the document footer.

    CSS Directives for Pages

    The second option is to use the CSS directive for page content on printed HTML pages. This only works with the new weasyprint based doc generation.

    It uses Cascading Style Sheet (CSS) directives for paged media. CSS uses the @page keyword to define attributes of the page on which the content is printed. Weasyprint makes heavy use of that, for example to define the page size.

    In the Kraft default template for weasyprint called invoice.gtmpl this page section can be found:

    @page {
        size: A4;
        margin-left: 2.4cm;
        margin-top:27mm;
        margin-right: 1.6cm;
        margin-bottom: 2cm;
        color: #2f590a;
    }

    which defines the page size to be A4, with the given margins and a default text color.

    To add a logo on in the top left corner of the first page of the result doc, the following snippet could be added:

    @page :first {
      margin-top: 20mm;
      margin-bottom: 3cm;
    
      @top-left {
        content: url(/home/miller/miller_logo_s1.png);
        width:3cm;
        height: 1cm;
      }
    }

    This displays the top left content only on the first page, and also assigns a different top- and bottom margin to the first page. Note that the content url in the example is a local path, but any valid URL can be used.

    Show in absolutely placed divs

    EPC QR Code

    With Weasyprint based PDF generation Kraft supports the EPC QR Code which implements a European standard for payments by computer and mobile devices.

    In Germany it is also known as Giro Code, in Belgium as Bancontact QR, in the Netherlands as iDEAL QR-code and in Spain it is also known as Bizum QR-code.

    In Germany it is accepted by the Giro Code and in Holland it is accepted by the official iDEAL QR-code app.

    In Belgium and Holland it is accepted by the apps of many banks, and in Austria and Finland it is accepted by the apps of all banks.

    To use the EPC QR code on the invoice printout, the bank account information has to be added to own identity settings dialog in Kraft. The giro code is current only generated for documents with the document type Rechnung.

    To include the generated EPC QR Code into the PDF document, the Weasyprint template needs to contain a snippet like this:

        {%if doc.isInvoice and epcqrcode.valid %}
        <p class="epcqrcode">
          <img class="epc" src="file://{{ epcqrcode.svgfilename }}" alt="EPC QR Code" />
          Dieser QR Code ermöglicht einfaches, sicheres und schnelles Begleichen dieser Rechnung via GiroPay:
          Diesen Code mit dem Smartphone scannen und Überweisung per Banking App aufgeben.
        </p>
        {% endif %}

    Main Application Menu

    The File Menu

    [File]>[Quit]
    [Ctrl]+[Q]
    Quits the application.

    The Document Menu

    [Document]>[Show Document]
    [Ctrl]+[R]
    Opens a window with the selected document for showing it.
    [Document]>[Edit Document]
    [Ctrl+O]
    Opens a window with the selected document for editing it.
    [Document]>[Open Archived document]
    [Ctrl]+[A]
    Opens an archived document.
    [Document]>[Create Document]
    Opens a window with a wizard for creating a new client-document.
    [Document]>[Copy Document]
    Makes a copy of the selected client-document to a new client-document
    which can belong to an other client or an other documenttype.
    [Document]>[Follow Document]
    Opens the selected client-document for editing.
    [Document]>[Mail document]
    [Ctrl]+[M]
    Mails a document.

    The Settings menu

    [Settings]>[Edit Tag Templates]
    [Ctrl]+[E]
    Opens a window where you add, edit or translate the tags (like work,
    material, plants or discounts).
    [Settings]>[Redo initial setup]
    [Ctrl+R]
    Redoes the initial setup. After this, a restart of Kraft is required.
    [Settings]>[Showed toolbars]
    Here you can decide if the `main toolbar` and the toolbar `Document Actions`
    are shown.
    [Settings]>[Configure Kraft]
    [Ctrl]+[Shft]+[,]
    Here you can configure Kraft.

    Document Edit Window

    The context Menu

     [Context]>[Item kind]
     change the status from this item between
    * Normal
    * Alternative
    * On demand
    [Context]>[Tax]
    Seems not working.
    [Context]>[Move up]
    Moves this item a place up in document.
    [Context]>[Move down]
    Moves this item a place down in document.
    [Context]>[Lock item]
    It is not clear what is does.
    [Context]>[Unlock item]
    It is not clear what is does.
    [Context]>[Delete item]
    Removes this item from document.

    Advanced Topics

    This chapter describes advanced topics around Kraft. Some Linux knowledge is required, and setups should be done by experienced Linux administrators and should be tested carefully.

    Using Kraft Collaboratively

    Kraft can be used collaborative in a distributed environment. That means that multiple users work on their desktops with their own Kraft instance on the same data.

    This whole topic is a subject to change, as Kraft will evolve to use ownCloud as a private cloud solution to store the data.

    Sharing Database and Document Pool

    The simplest case is that two or more Kraft instances use a database together and access the same pool of PDF documents on the harddisk. For simplicity this describes only two Kraft instances.

    A typical use case would be: Two different Linux users want to use Kraft. They both have their own computer but only work in the same network. For example this would describe a situation with one main office machine that runs Kraft in normal mode, plus a notebook with Kraft in read only mode to view documents, check catalogs and such.

    For that, the following prerequisites have to be met:

    1. MySQL or MariaDB is used as database backend. Sqlite is not supported.

    2. The database is accessible with a mysql user and from each machine for both users.

    3. The document store directory has to be shared.

    WARNING: There is no protection against having both users editing the same document. Because that is dangerous and can lead to unpredictable results, it is recommended to run all instances of Kraft except the main one in read only mode. This is done by starting Kraft with the -r command line switch.

    Sharing the Database

    The database server should be installed on the main machine or a dedicated device like a NAS. Networking speed influences the comfort to use obviously.

    Find howtos on the internet how to setup MySQL accordingly.

    Sharing the Document Pool Directory

    Kraft writes generated PDF documents into a local directory. Where that is can be configured in the Kraft Config file. The config file has to be adopted on all instances.

    That is located in each users home directory, in the path .config/kraftrc. It has to contain the following config value:

    [reporting]
    PdfOutputDir=/data/space/kraftdoc/pdf

    There are different ways how share that directory, ie. NFS or SMB storages. It is important that both users from both machines can list and access the files. The main user needs read and write access, read only users only need read access to the files.

    A recommended setup is a NFS share with autofs which is set up on the main machine. To manage file access a certain group should be set up on the machines with which access can be managed.

    Starting Kraft in read-only mode

    To start Kraft in read-only mode, start the binary with the -r command line switch.

    XRechnung Support

    Kraft supports the XRechnung standard. That is a digital format for electronic invoicing, and it passed as law in Germany and follows a EU directive. The XRechnung is a XML file format designed for that purpose.

    To use the XRechnung Export productivly, a little manual work is still needed in Kraft. Kraft creates the XML file based on a template, very similar to the normal PDF documents. That means that it loads a template that contains static elements (ie. the company address) that do not change between different invoices. The dynamic elements (customer data, items etc.) are filled into the template during the generation step.

    In order to generate correct XRechnung files for the specific company, the user has to adopt the template file manually to the companies needs. Note that this has only to be done once and should be easy for a person with a bit computer experience (Basic knowledge about XML appreciated!).

    To adapt the file to the needs of the company, it is best to start with the example XRechnung file. It has to be downloaded and saved into a location that the user can edit. Open it in a normal text editor, such as Kate.

    Read carefully through the file without being scared off by the XML format. All user strings (ie. company name, address and such) are user specific and should be replaced accordingly. Find details about the format here to better understand the meaning of the fields.

    Make sure to not disturb the proper XML format and do not change places where the template format {{ template_name }} is used.

    Once the file is adopted to the needs, open the Settings dialog of Kraft and insert the filename into the entry field for the XRechnung Template File on the Document Defaults page.

    After that step, the Export XRechung menu item will open a dialog to pick a filename where to save the XRechnung invoice to.

    This file can now be transfered to the receiver of the invoice.

    Note
    There are validators for invoices in XRechnung format out there in the internet. It is useful to verify the format of the Kraft exported XRechnung.

    Changing the Locale

    If it is needed that Kraft runs under a different locale than the actual desktop environment, this can be achieved by setting the desired locale in the start file of Kraft.

    On the linux desktop, apps are usually started through a so called desktop file. It contains the information how the Kraft binary is started if user clicks on the icon on the desktop or in the start menu.

    The desktop file can usually be found in /usr/share/applications/de.volle-kraft-voraus.kraft.desktop.

    It contains the line

    Exec=kraft %u

    which starts the application with the default locale.

    Changing it to

    Exec=env LANG=de_DE.UTF-8 kraft %u

    would change that to run in the German locale for example, independent from the desktop environment location.

    Credits and License

    Program and documentation copyright 2004–2024 Klaas Freitag

    Documentation copyright 2020-2024 Ronald Stroethoff

    kraft-1.2.2/manual/kraft-nl.html000066400000000000000000003203531467704360200165230ustar00rootroot00000000000000 Het handboek van Kraft

    Inleiding

    Kraft is een Qt- en KDE-Programma voor het organiseren van kantoor documenten zoals offertes en rekeningen in een klein bedrijf. Het vergemakkelijkt de creatie van documenten en helpt bij vaak voorkomende taken.

    Met gebruik van Kraft is geen tekstverwerker meer nodig. Rekeningen en offertes stelt u met slechts een paar muisklikken samen en worden automatisch gearchiveerd. Kraft genereert kwalitatief goede PDF-documenten geschikt om uit te printen, voor email en voor archivering.

    Overzicht van de mogelijkheden
    • De eenvoudige creatie van offertes, rekeningen en vergelijkbare documenten.

    • Beheer van klanten, door het gebruik van KAddressbook in de KDE-infrastructuur geïntegreerd.

    • Beheer van relaties tussen documenten, bv. Partial invoices (Gedeeltelijke factuur) ten opzichte van invoices (rekening).

    • Sjablonen voor kop- en voetteksten maar ook voor document-items.

    • De voorcalculatie van prijzen.

    • Materiaalgebruik

    • Instelbare aanmaak van documenten in PDF Formaat voor uitprinten en verzenden per Email.

    De broncode van Kraft is open source en wordt onder de licentie GNU General Public License vrij gegeven.

    Noot
    Kraft wordt door een gemeenschap van gebruikers, programmeurs artiesten en anderen vrijwilligers gedragen.
    Ook dit gebruikershandboek heeft uw hulp nodig om verbeterd te worden.

    Lees hier hierover hoe u kan bijdragen

    Eerste gebruik en basisconfiguratie

    Als Kraft voor de eerste keer wordt opgestart, dan komt het automatisch in een initiële proces voor het maken van instellingen terecht.

    Tijdens de basisconfiguratie wordt u gevraagd om een database-type te selecteren en wordt naar de naam en adres van uw firma gevraagd.

    Het adres van uw eigen bedrijf, die automatisch op het uitgeprinte document verschijnt, kan op twee manieren opgegeven worden: Bij het eerste gebruik: gebruik in de basisconfiguratie de eerste tab 'Uit adresboek' om in KAdressbook uw eigen adres te selecteren (als u in KAdressbook uw eigen adres heeft ingevuld) of u gebruikt de tweede tab 'Handmatige adres' om handmatig de informatie van uw bedrijf in te vullen. Deze stap is noodzakelijk voor de correcte aanmaak van uw documenten, omdat het automatisch wordt gebruikt in het proces voor de generatie van het document.

    Company adress

    Na de basisconfiguratie, selecteert u Voorkeuren  Instellingen. Hier kunt u Kraft correct voorbereiden zodat het op de juiste manier gebruikt kan worden.

    In het dialoogvenster voor de instellingen hebben we de tabs:

    *Standaarddocument
    *Belastingen
    *Dokumenttypes
    *Salarissen
    *Eenheden
    *Uw eigen identiteit

    In elke tab is het mogelijk om voor uw specifieke geval realistische waarden in te voeren.

    Document typen

    Bij het eerste gebruik vindt u een lijst met verschillende documenttypes, zoals:

    • Acceptance of order (opdrachtbevestiging)

    • Delivery receipt (afleverbon)

    • Invoice (rekening)

    • Offer (offerte)

    Document type

    Vertaal deze typen naar uw eigen taal. U kan ook nieuwe documenten toevoegen en documenten verwijderen waarvan u denkt dat u die niet zal gebruiken.

    Uniek documentnummer

    Numbercycles Elk document moet een uniek identificatie hebben die het document identificeert. Er mogen in Kraft geen twee documenten aanwezig zijn met dezelfde identificatie.

    De opbouw van het identificatie is in Kraft instelbaar. Hiervoor heeft Kraft het concept van zogeheten volgnummers. Volgnummers worden gebruikt om de opbouw van het documentnummer te definiëren dat op elk document wordt geprint.

    Alle documenten van een bepaald type hebben een identificatie die uit een één volgnummersysteem komen. Aan elk documenttype is een volgnummersysteem gekoppeld. Verschillende documenttypes kunnen hetzelfde volgnummersysteem gebruiken om hun identificatie uit te generen. Op die manier kunnen bijvoorbeeld de documenttypes Invoice (rekening) en Final Invoice (eindafrekening) nummers uit dezelfde volgnummersysteem gebruiken, terwijl ze in Kraft verschillende documenttypes zijn. Volgnummersystemen worden geïdentificeerd door hun naam. Gebruikers kunnen nieuwe volgnummersystemen creëren en deze bewerken door op de knop Volgnummersysteem bewerken…​ te klikken

    De opbouw van de documentnummers worden gedefinieerd in een sjabloon waarin normale, vaste karakters maar ook enkele variabelen aanwezig kunnen zijn die worden vervangen door hun respectievelijke waarden bij de creatie van het document.

    Elk documentnummer moet uniek zijn, en moet dus een teller hebben. Kraft kan twee soorten tellers gebruiken: Een type (variabele %i) wordt bij elk nieuw document verhoogt. De andere (variabele %n) wordt elke dag teruggezet en begint dus weer bij 1 op elke nieuwe dag. Behalve de teller kan extra informatie toegevoegd worden om een bruikbaar documentnummer te krijgen, zoals een constante tekst of gedeeltes van de datum.

    Het standaard volgnummersysteem dat met Kraft wordt geleverd bevat het jaar, de maand en een serienummer. Op deze manier kunt u offertes of opdrachten van het vorige jaar vergelijken met die van dit jaar of van de maand April van het vorige jaar met de maand April van dit jaar en op die manier een indruk krijgen van de resultaten van uw bedrijf.

    Zie de volgende tabel voor de beschikbare variabelen die gebruikt kunnen worden:

    %y of %yyyy

    het jaar van de documentdatum.

    %yy

    het jaar van de documentdatum (twee cijfers).

    %w

    het weeknummer van de documentdatum.

    %ww

    het weeknummer van het documentdatum met een nul (twee cijfers).

    %d

    de dag van de week als getal van de documentdatum.

    %dd

    de dag van de week als getal van het documentdatum met een nul (wee cijfers).

    %m of %M

    de maand van het documentdatum als getal.

    %MM

    de maand van het documentdatum als getal met een nul (twee cijfers).

    %c

    de ID van de klant in het kaddressbook

    %type

    het vertaalde doc type (offerte, rekening enz.)

    %uid

    het contact id van de klant.

    %i .. %iiiiii

    de unieke teller (verplicht)

    %n .. %nnnnnn

    de unieke dagteller (te combineren met de datum)

    In een volgnummersysteem-sjabloon moet naar keuze %i of %n aanwezig zijn, als dat niet het geval is dan wordt automatisch %i eraan toegevoegd.

    Zowel %i als %n hebben numerieke waarden. Ze kunnen ook worden voorafgegaan door extra nullen. De length is afhankelijk van het aantal i’s of n’s die in het sjabloon voorkomen. Bijvoorbeeld, als u een dagelijkse teller met een lengte van drie cijfers en voorloop nullen wenst, dan moet u %nnn in de sjabloon plaatsen. Dit werkt tot een lengte van zes karakters.

    Opmerking: het "ontwerp" van het volgnummersysteem en documentnummers is erg belangrijk. Door het flexibele systeem van sjablonen in Kraft kan niet ongeldige volgnummersystemen voorkomen. Dit is de verantwoordelijkheid van de gebruiker.

    PDF sjabloon

    In invoerveld "Sjabloon bestand:" kan de gebruiker een eigen sjabloon opgeven voor dit specifieke documenttype.

    Als de bestand-extensie van het sjabloon-bestand is .trml, dan wordt de op ReportLab gebaseerde document converter gebruikt. Als de bestand-extensie is .gtmpl, dan gebruikt Kraft automatisch de op Weasyprint gebaseerde converter.

    OPMERKING: Het ReportLab systeem voor de PDF creatie wordt in Kraft als verouderd gezien. Gebruikt voor nieuwe sjablonen altijd op Grantlee- en Weasyprint gebaseerde sjablonen.

    PDF nabewerking

    Nadat Kraft het PDF-document heeft gecreëerd is het mogelijk om de gecreëerde PDF samen te voegen met statische PDFs die die zijn gecreëerd en aangepast door de gebruiker. Hiermee is het makkelijk om eigen briefhoofd met een logo of een watermerk aan de resulterende PDF toe te voegen.

    De statisch PDFs moeten dezelfde papiergrootte hebben als de gegenereerde documenten. Vergeet niet om voor logos en dergelijke geoptimaliseerde afbeeldingen te gebruiken zodat de grootte van het resulterende document niet wordt opgeblazen.

    PDF Postprocessing

    De opties voor het watermerk zijn:

    1. Geen watermerk: Geen watermerk wordt gecreëerd

    2. Op eerste pagina: De eerste pagina van de watermark-pdf wordt samengevoegd met de eerste pagina van het resulterende document

    3. Watermerk op alle pagina’s: voegt de eerste pagina van de watermerk-PDF samen met alle pagina’s van het resulterende document

    4. Afwisselend: Hiervoor moet de watermerk-PDF drie pagina’s hebben. De eerste pagina wordt met de eerste pagina van het gecreëerde document samengevoegd, de tweede en derde pagina worden afwisselend met de volgende pagina’s samengevoegd.

    5. Afwijkende eerste en laatste pagina: het watermerk-PDF moet drie pagina’s hebben. De eerste pagina wordt met de eerste pagina van het gecreëerde document samengevoegd, de derde pagina wordt samengevoegd met de laatste pagina, en de tweede pagina met alle pagina’s tussen de eerste en de laatste pagina.

    Als een ander statisch PDF document is opgegeven in het vak "Voeg PDF toe:", dan wordt dit aan het eind van de gegenereerde PDF toegevoegd. Daarmee kan Kraft automatisch bijvoorbeeld een blad met de algemene voorwaarden toevoegen aan het uiteindelijke document.

    Belastingen

    Taxes In veel landen zijn er twee BTW-tarieven voor verkochte producten.

    Een hoog tarief en een laag tarief.

    Geef hier de toepasselijke waarden op voor het hoge tarief en voor het lage tarief. Als het belastingtarief wijzigt, dan kunt u hier de startdatum met de nieuwe belastingtarieven toevoegen.

    Salarissen

    Wages In Kraft is een lijst met salariskosten aanwezig. De items daarin worden in de sjablonen en in de berekeningen gebruikt.

    Alle data kan bewerkt en aangepast worden in een configuratiedialoog dat u kunt bereiken via het menu-item 'voorkeuren', waar u ook nieuwe items kunt toevoegen .

    Vergeet niet dat deze items later worden gebruikt in de documenten, het is daarom belangrijk dat u ze vertaalt naar uw eigen taal en dat u de correcte bedragen invult.

    Eenheden

    Units of measurement In Kraft is een verzameling eenheden aanwezig. In het configuratiedialoog die u kunt bereiken via het menu-item 'Voorkeuren' kunt u de items die al aanwezig zijn bewerken, maar u kunt ook nieuwe items toevoegen.

    Vergeet niet dat deze eenheden later worden gebruikt in de documenten, het is daarom belangrijk dat u ze vertaalt naar uw eigen taal.

    Uw eigen identiteit

    Controleer hier of de informatie die u heeft opgegeven tijdens de basisconfiguratie correct is voor het gebruik in de documenten.

    Pas op: Als u de keuze heeft gemaakt om de informatie in Kaddressbook te gebruiken dan wordt de informatie die u handmatig toevoegt genegeerd.

    Nadat we indien nodig de gewenste correcties in de configuratie hebben aangebracht, gaan we terug naar het hoofdvenster. Hier zien we drie tabs:

    • Documenten

    • Tijdlijn

    • Catalogi

    Catalogi

    Kraft gebruikt zogeheten Catalogi waarin sjablonen voor document items worden bewaard. Door de catalogi te gebruiken kan in het dagelijks gebruik het creëren van documenten significant worden versneld. Tijdens de creatie van nieuwe documenten, kunt u in de catalogi de items-sjablonen eenvoudig selecteren en naar het document verplaatsen.

    Omdat sjablonen worden georganiseerd in mappen, kunnen hele documenten worden voorbereid en opgeborgen in verschillende mappen om later als documentsjabloon te worden gebruikt.

    Uiteraard kunnen de items in de documenten worden bewerkt nadat ze in een catalogus zijn geselecteerd.

    Kraft komt standaard met twee verschillende catalogi:

    Material

    Een catalogus met materialen die worden verkocht, met hun inkoopprijs, de winst en hun verkoopprijs.

    en Standard Templates

    Een catalogus met standaard recepten voor werkzaamheden zoals het planten van bomen.

    Beide catalogussen kunnen mappen en submappen hebben om daar uw sjablonen in op te bergen . Eerst gaan we gegevens toevoegen aan de

    Materiaalcatalogus

    Een catalogus met materialen die worden verkocht, met hun inkoopprijs, de winst en hun verkoopprijs. Eerst gaan we nieuwe mappen en submappen toevoegen.

    Nieuwe mappen

    Selecteer met de muis de kolomnaam material, selecteer vervolgens in het contextmenu [Submap toevoegen]

    en voeg een extra map zoals Bomen toe

    Nieuwe submappen

    We gaan nu submappen toevoegen aan de map Bomen. Selecteer met de muis de naam van de map waaraan u een submap wilt toevoegen, selecteer nu in het contextmenu [Submap toevoegen] en voeg extra submappen zoals Bladbomen en Naaldbomen toe. Nadat we extra mappen en submappen hebben toegevoegd om het materiaal onder te verdelen, gaan we het materiaal zelf toevoegen.

    Nieuw sjabloon

    Selecteer met de muis de naam van de submap of map waarin u materiaal wilt toevoegen. Selecteer de submap bladbomen en selecteer nu in het contextmenu nieuw sjabloon.

    Voeg de nieuwe bomen kokosnoot-boom, appelboom en ananasboom toe.

    Vul de prijs in die we hebben betaald.

    Vul de winst in die we willen hebben op het materiaal.

    En vul in per hoeveel ze verpakt zijn.

    Material catalog Hierna voegen we ook in de map 'Wood' een item toe voor 'boompaal' met zijn prijs voor later gebruik.

    Nu gaan we naar:

    Standard Templates

    Dit is een catalogus met standaard recepten voor werkzaamheden zoals:

    • Bomen planten

    • Gras maaien

    • Transportkosten

    • Graszoden leggen

    • Graszaad zaaien

    We gaan hier de standaard werkzaamheden voor het planten van een boom toevoegen.

    Selecteer met de muis de naam van de map [Work] waar u de nieuwe sjabloon aan wilt toevoegen,

    selecteer nu in het contextmenu Nieuw sjabloon

    en voeg de extra sjablonen Boom planten en Gras maaien toe.

    Nadat we de nieuwe sjabloon hebben aangemaakt, opent een venster met 4 tabs:

    • Sjabloon

    • Post arbeid

    • Vaste kosten

    • Materiaal

    Eerst gaan we naar de tab:

    Sjabloon

    We geven hier de naam op van de nieuwe standaard sjabloon zoals Boom planten Standard catalog

    Pas op: wees voorzichtig, dit is de naam die later op de rekening komt.

    we stellen hier in dat het per stuk is en dat de winst 8% is en dat het hoge BTW-tarief van toepassing is.

    Post arbeid

    We vullen hier een aantal werkzaamheden met hun tijd in:

    Tabel 1. Gebruikte tijd

    Gat graven

    32 min.

    worker

    Boom plaatsen

    12 min.

    worker

    Gat opvullen

    17 min.

    worker

    Water geven

    5 min.

    worker

    De kosten voor een werknemer die we eerder hebben ingevuld worden nu gebruikt.Time calculation

    Opmerking: op de rekening zien we later alleen Boom planten, we zullen dan niet de onderdelen Gat graven, boom plaatsen, Gat opvullen, Water geven zien.

    We gaan nu naar de tab:

    Vaste kosten

    en we vullen in:

    Tabel 2. Vast item

    Transportkosten

    35 euro

    1 pcs.

    Fixed cost

    Hierna gaan we naar de tab:

    Materiaal

    Hier kiezen we volgende, waarna het venster [Materiaal toevoegen aan Berekening] opent voor de selectie van materiaal. We gaan dan naar de map 'wood' waar we de 'boompaal' selecteren.

    Tabel 3. Gebruikte materialen

    1

    boompaal

    3,5 euro

    Material

    We gaan nu terug naar de eerste tab 'Sjabloon'

    In de eerste tab [Sjabloon], kunnen we nu de totale kosten per eenheid zien.

    Klik op OK om het resultaat op te slaan of op Annuleren om het resultaat te verwijderen.

    We maken een tweede sjabloon 'Gras maaien'.

    we vullen in Gras maaien, als eenheid kiezen we sm (square meter in het Engels) of m² (in het Nederlands), in de tweede tab vullen we in dat 3 min nodig hebben per vierkante meter.

    Klik op OK om het resultaat op te slaan of op Annuleren om het resultaat te verwijderen.


    Kop- en voettekst-sjablonen

    Kraft heeft ook sjablonen voor de kop- voetteksten van documenten. Elk type document heeft zijn eigen set tekstsjablonen. To access them, open een document van een bepaald documenttype in de bewerkingsmode en gebruik de knop Sjabloon tonen om de sjablonen zichtbaar te maken. In zowel de kop- als de voet-sectie worden de opgeslagen sjablonen zichtbaar.

    Direct onder het navigatie-paneel rechts van het venster ziet u een lijst met de namen van de beschikbare sjablonen. Als u op een van de namen in de lijst klikt dan krijgt u de tekst in het paneel eronder te zien.

    Daaronder zijn knoppen met de volgende functies van links naar rechts:

    1. Voeg een sjabloon toe aan het document: Deze knop vervangt de tekst van het document met het geselecteerde sjabloon.

    2. Vervang tekst in document door sjabloon: Het geselecteerde sjabloon wordt op de huidige plaats van de cursor in het document toegevoegd.

    3. Nieuw sjabloon aanmaken: Opent een dialoogvenster om een compleet nieuw sjabloon voor het huidige doc type te creëren.

    4. Dit sjabloon bewerken: Opent het dialoogvenster om het huidige geselecteerde sjabloon te bewerken.

    5. Dit sjabloon verwijderen: Verwijderd het sjabloon permanent van de lijst met beschikbare sjablonen.

    Noot
    Sjablonen met de naam Standard zijn de standaard sjablonen voor dat document type. Zijn worden automatisch toegevoegd als een document van dit type wordt gecreëerd.

    Macro’s

    In zowel de kop-sjablonen als de voet-sjablonen kunnen macro’s aanwezig zijn die worden vervangen door uitgerekende waarden op het moment dat het document naar het eindresultaat wordt omgezet.

    De macro’s in de volgende lijst zijn beschikbaar:

    • DATE_ADD_DAYS(<amount_days>): Geeft de datum van het document plus het aantal dagen dat als parameter voor de macro is opgegeven.

    • ITEM_COUNT_WITH_TAG(<tag>): Geeft het aantal items dat zijn getagged met de tag.

    • NETTO_SUM_PER_TAG(<tag>): Geeft de netto som van alle items die zijn getagged met de opgegeven tag.

    • BRUTTO_SUM_PER_TAG(<tag>): Geeft de brutto som van alle items die zijn getagged met de opgegeven tag.

    • VAT_SUM_PER_TAG(<tag>): Geeft de pure belasting van alle items die zijn getagged met de opgegeven tag.

    • IF_ANY_HAS_TAG(<tag>) en END_HAS_TAG: Voegt de tekst tussen de macro’s toe alleen als er tenminste een item is met deze tag.

    Als voorbeeld, deze voettekst-sjabloon kan worden gebruikt om automatisch zinvolle teksten te genereren:

    Betaal deze rekening binnen drie weken na de datum van het document, wat is DATE_ADD_DAYS(21).
    
    IF_ANY_HAS_TAG(Material)
    Deze rekening vermeld het materiaal in ITEM_COUNT_WITH_TAG(Material) items. De netto waarde is NETTO_SUM_PER_TAG(Material),
    plus VAT_SUM_PER_TAG(Material) = BRUTTO_SUM_PER_TAG(Material).
    END_HAS_TAG

    We zijn nu klaar voor de eerste rekening.

    De creatie van documenten

    De eerste rekening

    Open de tab Documenten

    Klik op Nieuw document

    Het document-venster [creation wizard] opent.

    Selecteer in document type invoice (rekening).

    Vul op het whiteboard een korte tekst over wat de rekening is, zoals: gras maaien en boom planten voor de heer Jansen .

    Klik op Volgende

    Selecteer in het volgende venster de naam en adres van de klant.

    (Als de naam en adres niet aanwezig zijn, klik dan op nieuw contactpersoon of op contactpersoon bewerken als u het contact wilt bewerken)

    Klik op OK.

    Nu opent het venster document-items.

    Dit venster heeft bovenaan 2 tabs en 3 knoppen:

    • Item toevoegen…​,

    • Korting geven,

    • Document tonen.

    Aan de linkerkant kunt u alle items zien die we op de rekening willen plaatsen, aan de rechterkant zien we de tekst van de koptekst, de totale prijs en de voettekst.

    Als u op de tekst van de koptekst of van de voettekst aan de rechterkant klikt dan verandert het venster zodanig dat u de koptekst of de voettekst kan bewerken.

    Pas de koptekst en de voettekst aan naar uw situatie, in de voettekst kan u bijvoorbeeld een tekst plaatsen als: Wij maken uw tuindroom werkelijkheid.

    Klik op de knop Document tonen.

    De rechter tab verandert en toont nu de eerder gemaakte sjablonen, we selecteren in de map 'Work', de submap 'Boom planten' en klikken op de knop met de naar links wijzende pijl aan de onderkant.

    Een nieuw venster [Item van sjabloon creëren] opent.

    Omdat we 2 bomen hebben geplant, gaan we naar het veld [invoegen] en veranderen dit naar 2 pcs (in het Nederlands stk).

    Klik op OK om het resultaat op te slaan of op Annuleren om het resultaat te verwijderen.

    Het venster sluit en we gaan terug naar het hoofdvenster.

    We klikken opnieuw op Document tonen en selecteren deze keer gras maaien, we klikken opnieuw op de knop met de pijl, in het geopende venster stellen we in dat het grasveld 24 vierkante meter was.

    Klik op OK om het resultaat op te slaan of op Annuleren om het resultaat te verwijderen.

    We add now manually an item by clicking on the button Add item… and the window [create new item] opens.

    Omdat we een speciale boom hebben geleverd, vullen we hier de naam van de speciale boom liguster in, in het veld invoegen vullen we het aantal van de speciale boom die we geleverd hebben in en de prijs daarvan.

    Pas op: verlies niet uit het oog dat we in de catalogus een winst op de prijs van het materiaal kunnen toevoegen, in de rekening en in de offerte kunnen we geen winst aan de prijs van het materiaal toevoegen.

    We hebben nu een rekening met 3 items.

    Klik op OK om de rekening op te slaan of op Annuleren om de rekening te verwijderen.

    We klikken op OK en slaan het resultaat op.

    Uw eerste rekening is nu klaar voor verzending.

    In het venster met documenten zien we onze eerste rekening, merk op dat dit document een documentnummer heeft die we aan de linkerkant zien.

    Bovenaan het venster met alle rekeningen zien we de knop btn: [Print Document], waar we op klikken.

    Van de rekening zal nu een PDF worden gemaakt die we op papier kunnen uitprinten of per email naar de klant kunnen versturen.

    Hierna gaan we een offerte maken voor wat werk in een tuin.

    Een offerte creëren

    De klant heeft gevraagd of we een boom kunnen planten, we bieden 3 verschillende bomen aan die we kunnen planten.

    Daarnaast hebben we gezien dat er een dode boom is, waarvoor we een aanbod doen om deze als extra werk te verwijderen. Numbercycles

    De totale prijs willen we exclusief de prijs voor de verwijdering van de dode boom en alleen de prijs van een boom en niet van drie bomen.

    Open opnieuw de tab Documenten.

    Klik op Nieuw document

    Het document-venster [creation wizard] opent.

    Selecteer in btn: [document type]>offer.

    Vul op het whiteboard een korte tekst over waarover de offerte gaat, zoals: een boom planten en verwijding van dode boom .

    Klik op Volgende

    Selecteer in het volgende venster de naam en adres van de klant.

    (Als de naam en adres niet aanwezig zijn, klik dan op nieuw contactpersoon of op contactpersoon bewerken als u het contact wilt bewerken)

    Klik op OK.

    Nu opent het venster [Document bewerken].

    Dit venster heeft bovenaan 2 tabs en 3 knoppen:

    • Item toevoegen…​,

    • Korting geven,

    • Document tonen.

    Klik op de knop Document tonen.

    De rechter tab verandert en toont nu de eerder gemaakte sjablonen, we selecteren in de map 'Work', de submap 'Boom planten' en klikken op de knop met de naar links wijzende pijl aan de onderkant.

    Een nieuw venster [Item van sjabloon creëren] opent.

    Omdat we 1 boom willen planten, gaan we naar het veld [invoegen] en houden dit op 1 pcs (in het Nederlands stk).

    Klik op OK om het resultaat op te slaan of op Annuleren om het resultaat te verwijderen.

    Het venster sluit en we gaan terug naar het hoofdvenster.

    We klikken op de knop Document tonen en selecteren deze keer de catalogus Material.

    De material-catalogus opent, en we kunnen in de map Bomen de submap Bladbomen selecteren waar we de appelboom selecteren die we eerder hebben gemaakt.

    Klik op OK om het resultaat op te slaan of op Annuleren om het resultaat te verwijderen.

    Het venster sluit en we gaan terug naar het hoofdvenster.

    We add now manually an item by clicking on the button Add item….

    Het venster [Nieuw item aanmaken] opent.

    We willen dat de klant een keuze kan maken tussen een appelboom, een perenboom en de liguster.

    Daarom gaan we een perenboom handmatig toevoegen.

    We click on the button Add item… and the window [create new item] opens.

    We vullen hier de naam van de boom Perenboom in, en in veld invoegen vullen we het aantal van de speciale bomen in die we kunnen leveren en de prijs daarvan.

    We willen dit aan de materiaalcatalogus toevoegen voor toekomstig gebruik, daarom selecteren we ook [Dit item als sjabloon bewaren voor latere documenten] en selecteren we in opslaan in map 'bomen'.

    Klik op OK om het resultaat op te slaan of op Annuleren om het resultaat te verwijderen.

    We doen dit ook voor de liguster.

    We hebben nu 3 items met bomen in de offerte.

    En tenslotte voegen we een item toe met 'boom verwijderen' met 0,5 uur voor 32 euro.

    Links van het item zien we 2 knoppen:

    Een knop met een vlag en een knop met wat lijkt op een pagina.

    We selecteren de bovenste knop met de pagina waarna een contextmenu opent met de items:

    Context menu

    [ Soort item]->[Normaal]
    [Soort item]>[Alternatief]
    [Soort item]>[Op verzoek]
    [Belasting]
    [Omhoog verplaatsen]
    [Omlaag verplaatsen]
    [Item vastzetten]
    [Item ontgrendelen]
    [Verwijder item]

    We selecteren hier [Soort item] en veranderen dit voor perenboom van [normaal] naar [alternatief].

    We doen dit ook voor [liguster] en voor [Boom verwijderen] veranderen we dit van [normaal] naar [Op verzoek].

    Context menu

    Klik op OK om het resultaat op te slaan of op Annuleren om het resultaat te verwijderen.

    We willen het resultaat bekijken en daarom klikken we op de knop Document tonen.

    We zien nu dat de prijs voor de perenboom, de liguster en het verwijderen van de boom niet is gebruikt voor de totale prijs. Als we tevreden zijn met het resultaat, dan klikken we op de knop OK waarna we klikken op de knop Document afdrukken voor het maken van een PDF die we kunnen uitprinten of naar de klant kunnen sturen.

    Na uw eerste rekening is nu ook uw eerste offerte klaar voor verzending.

    Een Acceptance of order (opdrachtbevestiging) aanmaken

    Het documenttype "Acceptance of Order" (opdrachtbevestiging) wordt verstuurd als vervolg op een offerte.

    Numbercycles

    Als een klant een verzoek heeft gemaakt, dan zullen we een offer (offerte) sturen waarin we beschrijven welke items we zullen gaan leveren. Hopelijk zal de klant een order geven voor het werk.

    Het is een goede gewoonte om op de order te reageren met een "Acceptance of order" (opdrachtbevestiging) waarin we alle items beschrijven die we zullen gaan leveren. We kunnen de "Acceptance of order" op dezelfde manier maken als waarmee we de invoice (rekening) of de offer (offerte)hebben gemaakt door elk item te selecteren en het aantal te leveren aan te passen. Dit kost tijd en we kunnen fouten maken door items te vergeten of een incorrect aantal in te vullen.

    U kunt dit sneller doen door de offer (offerte) in de lijst te selecteren en vervolgens Creëer opvolg document in het context menu of in het hoofdmenu te selecteren.

    We hebben nu als documenttype de keuze uit:

    [Acceptance of order]
    [Invoice]
    [Partial Invoice]
    [final Invoice]
    [Progress Payment Invoice]

    Folloup document

    We selecteren nu "Acceptance of order". We hebben nu een kopie van de offerte als een Acceptance of order (vergeet niet om de alternatief items en de op verzoek items aan te passen.)

    Folloup document

    U kunt dit ook doen voor de creatie van de invoice (rekening) als opvolging van de opdrachtbevestiging. Elk documenttype heeft een specifieke lijst met opvolg-documenten. Het is een goede gewoonte om op de rekening precies te omschrijven wat is geleverd.

    Kraft naar wens aanpassen

    Een groot gedeelte van de grafische interface van Kraft kan aangepast worden, met name de uitvoer die het genereert.

    Documentuitvoer aanpassen

    Om PDF’s te creëren, moet een sjabloon worden gevuld met de document data die in Kraft is gecreëerd. De sjabloon definieert hoe de het resulterende document eruit komt te zien, d.w.z de ingestelde lettertypes, de plaats van de elementen en dergelijke.

    Het bestand dat is samengesteld uit een combinatie van de data en de sjabloon wordt geconverteerd naar een PDF met een speciaal document creation script. Dit alles wordt automatisch door Kraft gestart als een document uitgeprint moet worden.

    In Kraft kan elk documenttype zijn eigen sjabloon hebben voor de creatie van een PDF. Welk wordt gebruikt kan u instellen in het instellingsvenster voor documenttypes.

    WeasyPrint Documenten

    Noot
    Bij Kraft wordt nog steeds de oude op ReportLab gebaseerde converter meegeleverd, maar dit zal in de toekomst veranderen. Het op de WeasyPrint gebaseerde systeem zal in de toekomst uitsluitend gebruikt worden. Het wordt aanbevolen om de bestaande sjablonen aan te passen.

    Kraft gebruikt met WeasyPrint een zeer krachtige generator waarmee het erg makkelijk is om documenten te creëren die intensief naar naar wens aangepast kunnen worden en toch een goede kwaliteit hebben.

    WeasyPrint converteert een html-bestand naar PDF. Daarbij wordt een cascade stylesheet (CSS)-bestand geïntegreerd wat een grote invloed heeft op het uiterlijk van het PDF-document.

    De html- en CSS invoerbestanden voor WeasyPrint worden gecreëerd met de hulp van het Kraft sjabloonbestand.

    Om voor een document een op WeasyPrint gebaseerde sjabloon te gebruiken, creëert u eenvoudig een sjabloonbestand en slaat deze op met de extensie .gtmpl. Met deze bestand-extensie gebruikt Kraft automatisch WeasyPrint met daarbij Grantlee sjablonen voor de rendering.

    Vanaf versie 0.95 van Kraft vindt u een voorbeeld document in het Grantlee- en WeasyPrint formaat. U kunt het vinden in /usr/share/kraft/reports/invoice.gtmpl of online op Github. Een voorbeeld CSS-bestand kraft.css (on Github) wordt meegeleverd zodat u dit als startpunt kan gebruiken om het naar wens aan te passen.

    Sjabloon variabelen

    Om de PDF te genereren, moet Kraft de data van het document waaraan u in Kraft heeft gewerkt overbrengen naar het input-document dat met de hulp van Weasyprint wordt verwerkt tot een PDF. Daarvoor gebruikt Kraft een tekstsjabloon. Daarin vervangt Kraft variabelen door de daadwerkelijke waarden.

    De tag {{ doc.doctype }} wordt bijvoorbeeld tijdens het genereer proces vervangen door het huidige document type.

    De syntax is gebaseerd op de Django syntax voor sjablonen zoals het beschreven wordt in de documentatie.

    On the PDF output it is nice to have a logo image included, if the documents should not be printed on a prepared stationary that comes with a printed logo already.

    This chapter describes a few methods to achieve that with the weasyprint based template.

    PDF Watermark Funktionality

    The first, and easiest way to add a logo and other details on the print out is to use the so called PDF Watermark option.

    That means that the generated document, which does not contain a logo at all, is merged with another PDF into one doc. The so called watermark feature requires an otherwise empty PDF page of the same size as your generated document, that has the logo printed at the right position. It can be created with a text processor that can export PDF.

    In the Kraft doc type settings dialog, the watermark options for a specific doc type can be selected. The watermark PDF file can be selected and either be applied to the first page only, or to every page of the generated document.

    Once set up, Kraft automatically merges the generated document with the watermark PDF. The result document contains the content of both documents merged together. This is not only useful for logos, but also other details in the document footer.

    CSS Directives for Pages

    The second option is to use the CSS directive for page content on printed HTML pages. This only works with the new weasyprint based doc generation.

    It uses Cascading Style Sheet (CSS) directives for paged media. CSS uses the @page keyword to define attributes of the page on which the content is printed. Weasyprint makes heavy use of that, for example to define the page size.

    In the Kraft default template for weasyprint called invoice.gtmpl this page section can be found:

    @page {
        size: A4;
        margin-left: 2.4cm;
        margin-top:27mm;
        margin-right: 1.6cm;
        margin-bottom: 2cm;
        color: #2f590a;
    }

    which defines the page size to be A4, with the given margins and a default text color.

    To add a logo on in the top left corner of the first page of the result doc, the following snippet could be added:

    @page :first {
      margin-top: 20mm;
      margin-bottom: 3cm;
    
      @top-left {
        content: url(/home/miller/miller_logo_s1.png);
        width:3cm;
        height: 1cm;
      }
    }

    This displays the top left content only on the first page, and also assigns a different top- and bottom margin to the first page. Note that the content url in the example is a local path, but any valid URL can be used.

    Show in absolutely placed divs

    EPC QR Code

    Met de door Weasyprint gegenereerde PDF kan Kraft overweg met de EPC QR Code wat een implementatie is van een Europese standaard voor betalingen via de computer en mobiele apparaten.

    In Duitsland is het ook bekend als Giro Code, in België als Bancontact QR, in Nederland als iDEAL QR-code en in Spanje is het ook bekend als Bizum QR-code.

    In Duitsland wordt het gebruikt door de Giro Code en in Nederland wordt het geaccepteerd door de officiële iDEAL QR-code app.

    In België en Nederland wordt het geaccepteerd door de apps van vele banken, en in Oostenrijk en Finland wordt het geaccepteerd door de apps van alle banken.

    Om de EPC QR code op de afgedrukte rekening te gebruiken,moet de informatie over de bankrekening toegevoegd worden aan het dialoogvenster in Kraft over de eigen identiteit. De iDEAL QR-code wordt op dit moment alleen gegenereerd voor documenten van het document type Rechnung.

    Om de gegenereerde EPC QR Code op het PDF document te krijgen, moet aan het Weasyprint sjabloon een code zoals hieronder toegevoegd worden:

        {%if doc.isInvoice and epcqrcode.valid %}
        <p class="epcqrcode">
          <img class="epc" src="file://{{ epcqrcode.svgfilename }}" alt="EPC QR Code" />
          Dieser QR Code ermöglicht einfaches, sicheres und schnelles Begleichen dieser Rechnung via GiroPay:
          Diesen Code mit dem Smartphone scannen und Überweisung per Banking App aufgeben.
        </p>
        {% endif %}

    Hoofdvenster van het programma

    Het menu Bestand

    [Bestand]>[Afsluiten]
    [Ctrl]+[Q]
    Sluit het programma af.

    Het document-menu

    [Document]>[Document tonen]
    [Ctrl]+[R]
    Opent een venster met het geselecteerde document om deze te tonen.
    [Document]>[Document bewerken]
    [Ctrl+O]
    Opent een venster met het geselecteerde document voor bewerking.
    [Document]>[Open gearchiveerd document]
    [Ctrl]+[A]
    Opent een gearchiveerd document.
    [Document]>[Nieuw document]
    Opent een venster met een wizard voor de creatie van een nieuw client-document.
    [Document]>[Kopieer Document]
    Maakt een kopie van het geselecteerde client-document naar een nieuw client-document
    Deze kan bij een andere klant horen of zelfs een ander documenttype zijn.
    [Document]>[Creëer een opvolg Document]
    Kopieert de inhoud van een offerte naar een order-acceptatie of een rekening.
    [Document]>[Verzend document]
    [Ctrl]+[M]
    Verzend een document per email.

    Het instellingen-menu

    [Voorkeuren]>[Tag sjabloon bewerken]
    [Ctrl]+[E]
    Opent een venster waarin u tags (zoals work,material, plants of discounts)
    kunt toevoegen, bewerken of vertalen.
    [Voorkeuren]>[De initiële aanmaak opnieuw uitvoeren]
    [Ctrl+R]
    Voert de basisconfiguratie opnieuw uit. Hierna is een herstart van Kraft nodig.
    [Voorkeuren]>[Werkbalken]
    Hier kunt u beslissen of de `hoofdwerkbalk` en de werkbalk `Document acties`
    worden getoond.
    [Voorkeuren]>[Instellingen]
    [Ctrl]+[Shft]+[,]
    Hier kunt u Kraft instellen.

    Het document-bewerkingsvenster.

    Het contextmenu

     [Context]>[Soort item]
     wijzigt de status van dit item tussen
    * Normaal
    * Alternatief
    * Op verzoek
     [Context]>[Belasting]
    Lijkt niet te werken.
    [Context]>[Omhoog verplaatsen]
    Verplaatst dit item een plaats omhoog in het document.
    [Context]>[Omlaag verplaatsen]
    Verplaatst dit item een plaats omlaag in het document.
    [Context]>[Item vastzetten]
    Het is niet duidelijk wat het doet.
    [Context]>[Item ontgrendelen]
    Het is niet duidelijk wat het doet.
    [Context]>[Verwijder item]
    Verwijdert dit item uit het document.

    Geavanceerde onderwerpen

    Dit hoofdstuk beschrijft geavanceerde onderwerpen rond het gebruik van Kraft. Daarbij wordt enige kennis van Linux veronderstelt, en het is verstandig om de instellingen door ervaren Linux-beheerders uit te laten voeren en deze vervolgens zorgvuldig en uitgebreid te testen.

    Kraft gemeenschappelijk gebruiken.

    Kraft kan gemeenschappelijk in een gedistribueerde omgeving gebruikt worden. Dat houd in dat meerdere gebruikers op hun eigen desktop met hun eigen Kraft instance met dezelfde data kunnen werken.

    De hele situatie is aan verandering onderhevig, omdat Kraft in de nabije toekomst ownCloud als privé Cloud voor de opslag van de data zal gebruiken.

    Database en Document-pool gezamenlijk gebruiken

    De eenvoudigste situatie is als twee of meer Kraft-gebruikers de database gemeenschappelijk gebruiken en toegang tot dezelfde pool van PDF-documenten op de harde schijf hebben. Om het eenvoudig te houden, worden hier de situatie met twee gebruikers beschreven.

    Een veelvoorkomende situatie kan als volgt zijn: twee verschillende Linux gebruikers willen Kraft gebruiken. Ze hebben beide hun eigen computer en werken in hetzelfde netwerk. Dit voorbeeld beschrijft een situatie met een hoofdkantoor die Kraft in de normale modus gebruiken, en een Notebook met Kraft, die in de read-only modus is om de documenten te bekijken, de catalogus te raadplegen en dergelijke.

    Daarvoor is het volgende vereist:

    1. Als Database-Backend wordt MySQL of MariaDB gebruikt. Sqlite is niet mogelijk.

    2. De Database is met de gebruiker MySQL vanuit beide computers bereikbaar.

    3. De map waarin de documenten worden opgeslagen, wordt voor beide computers bereikbaar zijn (shared).

    Pas op: Er is geen beveiliging tegen het feit dat beide gebruikers tegelijk hetzelfde document kunnen bewerken. Om dat dit gevaarlijk is en tot onvoorziene resultaten kan leiden, raden wij aan om Kraft buiten het kantoor alleen in de readonly-modus te gebruiken. Deze readonly-modus wordt met de parameter -r ingeschakeld.

    De database gezamenlijk gebruiken

    De database-server moet op de hoofdmachine geïnstalleerd zijn, of het moet op een gespecialiseerd apparaat zoals een NAS geïnstalleerd zijn. De snelheid van het netwerk beïnvloed de bruikbaarheid natuurlijk enorm.

    Howtos voor het gebruik van MySQL zijn op het internet te vinden.

    De map met de document Pool delen (sharen)

    Kraft schrijft de gegenereerde PDF’s in een lokale map. Welke dat is, kunt u instellen in het config-bestand van Kraft. Het config-bestand moet voor alle exemplaren van Kraft correct ingesteld zijn.

    U kunt deze vinden in de thuismap van de gebruiker met de relatieve pad .config/kraftrc. Daarin moet de volgende tekst voorkomen:

    [reporting]
    PdfOutputDir=/data/space/kraftdoc/pdf

    Er zijn verschillende manieren om de map te delen (sharen), bijvoorbeeld een NFS of een SMB Server. Het is belangrijk dat gebruikers van beide machines toegang hebben tot deze bestanden. De hoofdgebruiker heeft lees- en schrijfrechten nodig, de read-only gebruiker heeft voor de bestanden alleen lees-rechten nodig.

    Een aanbevolen opstelling is een NFS Share met autofs, die op de hoofdmachine is ingesteld. Om de toegang tot de bestanden te beheren, raden wij aan om een gebruikersgroep te creëren waarin u de toegangsrechten kan beheren.

    Kraft in read-only modus

    Om Kraft in de read-only modus te starten, moet het programma met de volgende parameter -r gestart worden.

    Gebruik van XRechnung

    Kraft ondersteund het gebruik van de XRechnung standaard. Dat is een digitaal formaat voor electronische rekeningen, en als wet ingevoerd in Duitsland wat een EU richtlijn volgt. De XRechnung is een XML-bestandsformaat ontworpen voor dat doel.

    Om de XRechnung Export productief te gebruiken, is nog een beetje handwerk in Kraft nodig. Kraft creëert het XML-bestand aan de hand van een sjabloon, vergelijkbaar met de normale PDF documenten. Dit houdt in dat het een sjabloon laadt wat statische elementen bevat (b.v. het adres van het bedrijf) die niet veranderen tussen de verschillende rekeningen. De dynamische elementen (data over de klant, items enz.) worden in het sjabloon geplaatst tijdens de stap van het generen.

    Om correcte XRechnung-bestanden te generen voor het desbetreffende bedrijf, moet de gebruiker het sjabloonbestand handmatig aanpassen aan de eisen van het bedrijf. Merk op dat u dat maar eenmalig hoeft te doen en dat het niet moeilijk is voor iemand met een beetje computerervaring (Basiskennis van XML is gewenst).

    Om het bestand aan te passen aan de eisen van het bedrijf, kunt u het beste beginnen met het voorbeeld XRechnung-bestand. U moet het downloaden en vervolgens opslaan op een plek waar u het kan bewerken. Open het in een normale tekstverwerker, zoals Kate.

    Bestudeer nauwkeurig het bestand zonder dat u afgeschrikt wordt door het XML-opmaak. Alle user strings (d.w.z. bedrijfsnaam, adres en dergelijke) zijn specifiek voor de gebruiker en moeten daarom overeenkomstig vervangen worden. Zoek de details over de opmaak hier op voor een beter begrip van de betekenis van de velden.

    Zorg ervoor dat u de correcte XML-opmaak niet verstoort en wijzig niet de locatie van waar {{ template_name }} is gebruikt.

    Nadat het bestand is aangepast aan de wensen, opent u het dialoogvenster voor de instellingen van Kraft en voer de bestandsnaam in het invoerveld voor het XRechnung Sjabloonbestand in de pagina voor document-standaarden.

    Na deze stap zal het menu item Export XRechung een dialoogvenster openen voor het ingeven van het bestandsnaam waarmee de XRechnung rekening wordt opgeslagen.

    Dit bestand kan nu verzonden worden naar de ontvanger van de rekening.

    Noot
    Er zijn validators voor rekeningen in het XRechnung formaat op het internet te vinden. Het is verstandig om het bestandsformaat van de XRechnung dat uit Kraft is geëxporteerd te laten valideren.

    De taalregio wijzigen

    Als het nodig dat Kraft een andere taalregio (bijvoorbeeld voor een andere valuta) gebruikt dan die in de huidige desktop is ingesteld, dan kan dit worden bereikt door de gewenste taalregio in het opstart-bestand van Kraft in te stellen.

    Bij een linux desktop, worden programma’s normaal gesproken opgestart met de hulp van een zogeheten desktop-bestand. Hierin is informatie aanwezig over hoe het Kraft-programma wordt opgestart als de gebruiker klikt op het pictogram op de desktop of in het start menu.

    Het desktop-bestand is meestal te vinden in /usr/share/applications/de.volle-kraft-voraus.kraft.desktop.

    Daarin is de volgende regel aanwezig

    Exec=kraft %u

    wat het programma start met de standaard taalregio.

    Als u dit bijvoorbeeld wijzigt naar

    Exec=env LANG=de_DE.UTF-8 kraft %u

    dan verandert dat naar de Duitse taalregio, onafhankelijk van de desktop environment locatie.

    Dankbetuigingen en licentie

    Program and documentation copyright 2004–2024 Klaas Freitag

    Documentation copyright 2020-2024 Ronald Stroethoff

    kraft-1.2.2/manual/kraft.adoc000066400000000000000000001206161467704360200160560ustar00rootroot00000000000000= The Kraft Handbook Ronald Stroethoff, Klaas Freitag :toc: left :doctype: article :author: Ronald Stroethoff :email: :description: Kraft is a Qt program for organizing documents like quotes and invoices in a small business. :keywords: Qt;office;bookkeeping :experimental: :imagesdir: images/{lang}/ include::locale/attributes.adoc[] == Introduction Kraft is a Qt and KDE application to organize office documents like quotes and invoices in a small business. It eases the creation of documents and helps with repeating tasks. Using Kraft, there is no need for fiddling with a text processor any more. Documents are created by a few clicks, edited, generated and archived automatically. Kraft generates high quality PDF output for printing, mailing and archiving. Feature Overview:: * Simple creation of offers, invoices and similar documents. * Customer management, deeply integrated with the mature KDE KAddressbook. * Maintenance of document relations, ie. Partial invoices vs. invoices. * Templates for document header- and footertexts and for document items. * Pre calculation of item prices. * Material management. * Configurable document creation in PDF format for print and email. The code of Kraft is open source and is released under the https://en.wikipedia.org/wiki/GNU_General_Public_License[GNU General Public License]. NOTE: Kraft is driven by community of users, coders, artists and others by voluntary work. + Also this manual needs contributions! + + Learn more on https://github.com/dragotin/kraft/blob/master/manual/Readme.md[how to contribute]! == First Use and Basic Configuration When Kraft is started for the first time, it automatically enters the initial setup process. During the initial setup you are asked to select a database to use and give the name and address of your company. You can fill in your company address (that appears on the printed documents) in two ways: in the setup procedure use the first tab *Select from Addressbook* for to select your on address in KAddressBook (if you have filled your own address in KaddressBook) or use the second tab *Manual entry* for to fill in the information of the address from your company manually. This step is necessary for the correct generation of your documents as the address is automatically used in the document generation step. image:company_adress1.png[Company adress,float="right"] After the initial setup, select menu:Preferences[Settings]. That allows to prepare Kraft correctly so it can be used in a proper way. In the Preferences dialog we have the tabs: *Document Defaults *Taxes *Documunt Types *Wages *Units *Own identity Each of the tabs allows to enter useful values for the specific use case. === Document Types At the first use you find a list of different document types, such as: * Acceptance of order * Delivery receipt * Invoice * Offer image:documentype.png[Document type,float="right"] Translate this types to your own language. You can also add new ones and remove document types you wont use. ==== Numbercycles image:numbercycles.png[Numbercycles,float="right"] Each document has to have an unique identifier that identifies the document. There must not be two documents in Kraft with the same identifier. The format of the identifier is configuratable in Kraft. For that, Kraft has a concept of so called number cycles. Number cycles are used to define the form of the *document number* which is printed on every document. All documents of a certain type have identifiers taken out of one number cycle. Each document type has a number cycle assigned. Different document types can use the same number cycle to generate ids from. That way, for example the document types Invoice and Final Invoice can use numbers from the same number cycle, even thought they are different document types in Kraft. Number cycles are identified by their name. User can create new number cycles and edit them clicking on the button btn:[Edit Number Cycles...] The format of the document numbers are defined by a template that can contain normal, fixed characters and also some variables that are replaced by the respective values when the document is created. Each identifier needs to be unique, and thus has to contain a counter. Kraft supports two types of counter: One (variable `%i`) is incremented globally for every new document. The other (variable `%n`) is reset every day and starts at 1 again on every new day. In addition to the counter, more information can be added to the template form an useful number. Examples are a constant text or parts of the date. The default numbercycle delivered with Kraft contains the year, the month and a serialnumber. That way you can compare offers or orders from last year with this year or the month April of last year with the month April of this year and get on this way an impression from the results of your business. See the following table for available variables which can be used: |=== | `%y` or `%yyyy` | the year of the document date. | `%yy` | the year of the document (two digits). | `%w` | the week number of the document date. | `%ww` | the week number of the document date with leading zero. | `%d` | the day number of the document date. | `%dd` | the day number of the document date with leading zero. | `%m` or `%M` | the month number of the document date. | `%MM` | the month number with leading zero. | `%c` | the customer id from kaddressbook | `%type` | the localised doc type (offer, invoice etc.) | `%uid` | the contact id of the client. | `%i` .. `%iiiiii`| the unique counter | `%n` .. `%nnnnnn`| the unique day counter (combine with date) |=== A number cycle template needs to contain either `%i` or `%n`, if not, `%i` is appended automatically. Both `%i` and `%n` are numeric values. They can also be padded with with leading zeros. The length is defined by the number of i's or n's put into the template. For example, if a daily counter with length of three and leading zeros is desired, `%nnn` has to be put into the template. This works up to a length of six characters. ____ NOTE: The "design" of the numbercycles and document numbers is very important. With the flexible system of templating Kraft can not prevent invalid number cycles. It is in the responsibility of the user. ____ ==== PDF Template In the entry field Template File: the user can select a custom template for this specific document type. If the file extension of the template file is `.trml`, the ReportLab based document converter is used. If the file extension is `.gtmpl`, Kraft automatically uses the Weasyprint based converter. ____ NOTE: The ReportLab system for PDF creation is deprecated in Kraft. Please, for new templates, always use Grantlee- and Weasyprint based templates. ____ ==== PDF Postprocessing After Kraft has created the PDF document it is possible to merge the created PDF with static, customized PDFs created by the user. With that, it is easy to add a custom stationery with a logo to the resulting PDF ("Watermark"). The static PDFs should have the same page size as the generated documents. Keep in mind to use optimized images for logos etc. to not blow up the size of the result document. image:pdfpostproc.png[PDF Postprocessing,float?"right"] The watermark options are: 1. *No Watermark*: No watermark is created 2. *On first page*: The first page of the watermark.pdf is merged with the first page of the result document 3. *Watermark on all pages*: Merges the first page of the watermark PDF to all pages of the result document 4. *alternating*: For this, the watermark PDF needs to have three pages. The first page is merged to the first page of the result document, the second and third page are alternated merge to subsequent pages. 5. *different first and last page*: the PDF needs to have three pages. The first page is merged to the first page of the result document, the third page to the last, and the second to all page between first and last page. If there is another static PDF document put into the entry field "Append PDF:", it is appended to the generated PDF. With that, Kraft will automatically add for example terms and conditions documents to the final document. === Taxes image:taxes.png[Taxes,float="right"] In many countries there are two kinds of VAT-taxes for sold products. A high level and a low level. Fill here the appropriate amounts in for the high level and the low level. If the tax-level is changing, then you add here the start date with the new tax-levels. === Wages image:wages.png[Wages,float="right"] A list of wage costs is maintained in Kraft. The items are used in templates and during calculation. All data can be edited, customized and new items can be added in the Kraft Configuration Dialog reachable through the Settings menu. Remember that these units are later used in the documents, it is therefor important that you translate them to your own language and to fill in the correct prices. === Units of measurement image:unity.png[Units of measurement,float="right"] A list of units of measurement is maintained in Kraft. In Kraft Configuration Dialog reachable through the Settings menu can you edit and customize items already in the list, and also can you add new items to the list. Remember that these units are later used in the documents, it is therefor important that you translate them to your own language. === Own identity Check here if the information that you have given during the initial setup is correct for the use in the documents. ____ WARNING: If you made the choice to use the information from KaddressBook then is the information from a later manual entry ignored. ____ After we have made some corrections to the configuration, we go back to the main window.Here we see three tabs: * Documents * Timeline * Catalogs == Catalogs Kraft supports so called Catalogs in which templates for document items are kept. With the catalogs creating documents can be significantly accellerated in the day to day business. When creating new documents, the items templates from the catalogs can easily selected and moved over to the document. Since templates are organized in chapters entire documents can be prepared in different chapters to be used as template documents. Of course the items in the documents can be edited after they got picked from a catalog. By default Kraft comes with two different catalogs: `Material` A catalog of material that are sold, with their purchase prices, the profit and the sell-price. and `Standard Templates` A catalog of standard recipes of work like planting trees. Both catalogs can have chapters and sub-chapters for to organize your templates. First we are going to fill in the === Material Catalog A catalog of material that are sold, with their purchase prices, the profit and the sell-price. First we are going to add new chapters and subchapters. ==== New chapters Select with the mouse the column-name `material`, select now in the context-menu [Add a sub chapter] and add an extra chapter like `Trees` ==== New sub chapters We are going to ad sub chapters in the map `Trees`. Select with the mouse the name of the chapter where you like to add a subchapter, select now in the context-menu [Add a sub chapter] and ad an extra subchapters like `Loaf trees` and `needle trees`. After adding the extra chapters and subchapters for dividing the material, we are going to add the material themself. ==== New template Select with the mouse the name of the sub-chapter or chapter where you like to add a material. Select the sub map Loaf trees and select now in the context-menu [Add a template] Add the extra materials `coconut tree`, `apple tree` and `pine-apple tree`. Fill in the price that we have paid. Fill in the profit that we want to have on the material And fill in how much is in a packet. image:catalog_material.png[Material catalog,float="right"] After this we add also in the map 'Wood' a item for a 'support pole' for later use with its price. Now we are going to: === Standard Templates This is a catalog of standard recipes of work like: * planting trees * cutting grass * transport costs * planting grass * sowing grass-seed We add here the standard work of planting a tree. Select with the mouse the name of the chapter [Work] where you like to add the new template, select now the context-menu [New template] and the extra templates `Plant tree` and `cut grass`. After we made the new template, a window opens with 4 tabs: * Template * Time calculation * Fix costs * Material First we go to the tab: ==== Template We give here the name of the new standard template like `Plant tree` image:catalog_standard.png[Standard catalog,float="right"] ____ WARNING: be careful, this name is later used in the invoice ____ we select that this is per piece and that the margin is 8% and that the full VAT is applicable. ==== Time calculation We fill here in a number of work with the time: .Spent time [cols=",,",] |=== |Dig hole |32 min. |worker |Place tree |12 min. |worker |Fill hole |17 min. |worker |give water |5 min. |worker |=== The cost for worker which we have earlier filled in is now used. image:catalog_standard_work.png[Time calculation,float="right"] ____ NOTE: in the invoice we see later only Plant tree, we will not see the parts dig hole,place tree,fill hole,give water ____ Now we go to the tab ==== Fixed costs and fill in: .Fixed item [cols=",,",] |=== |Transportcost |35 euro |1 pcs. |=== image:catalog_standard_fixed_cost.png[Fixed cost,float="right"] After this we go to the tab: ==== Material Here we select btn:[next], after which the window [Add Material to Calculation] opens for a selection of material. We navigate to the map 'wood' where we select the 'support pole'. .Used materials [cols=",,",] |=== |1 |support pole |3,5 euro |=== image:catalog_standard_material.png[Material,float="right"] We go now back to the first tab template On the first tab [template], we can now see the overall cost per one unit Click on [OK] for saving the result or on [cancel] for discarding the result. We make a second template `cut grass` we fill in `cut grass`, as unit we choose sm (square meter), on the second tab we fill in that we need 3 min per square meter. Click on [OK] for saving the result or on [Cancel] for discarding the result. ''' === Header- and Footer Text Templates Kraft supports text templates also for the header- and footer-text of documents. Each document type has it's own set of text templates. To access them, open a document of a certain document type in edit mode and use the btn:[show templates] to make the templates visible. In both the header- and footer-section the stored templates become visible. Directly under the navigation pane on the right side of the window is a list of the names of the available templates. Clicking on one of the names in the list displays the text in the pane below. Underneath there are buttons located with the following functions from left to right: . Add the template to the document: This button replaces the text of the document with the selected template. . Insert the template to the document: The selected template is inserted to the current place of the cursor in the document. . Create a new template: Opens a dialog to enter a complete new template for the current doc type. . Edit the current template: Opens the dialog to edit the currently selected template. . Delete the current template: Removes the template permanently from the list of available templates. NOTE: Templates with the name _Standard_ are the default templates for the document type. They are inserted automatically if a document of this type is created. ==== Macros Both the header- and footer-templates can contain so called macros which are replaced with calculated values once the document is rendered to the final output format. The following list of macros are supported: - `DATE_ADD_DAYS()`: Returns the date of the of document plus the number of days specified as parameter to the macro. - `ITEM_COUNT_WITH_TAG()`: Returns the amount of items tagged with the tag. - `NETTO_SUM_PER_TAG()`: Returns the netto sum of all items that are tagged with the named tag. - `BRUTTO_SUM_PER_TAG()`: Returns the brutto sum of all items that are tagged with the named tag. - `VAT_SUM_PER_TAG()`: Returns the pure tax of all items that are tagged with the named tag. - `IF_ANY_HAS_TAG()` and `END_HAS_TAG`: Includes the text between the two macros only if there is at least one item that is tagged with the tag. As an example, this footer text template can be used to automatically generate useful texts: ---- Please pay this invoice until three weeks after the date of the document, which is the DATE_ADD_DAYS(21). IF_ANY_HAS_TAG(Material) This invoice lists material in ITEM_COUNT_WITH_TAG(Material) items. The net value is NETTO_SUM_PER_TAG(Material), plus VAT_SUM_PER_TAG(Material) = BRUTTO_SUM_PER_TAG(Material). END_HAS_TAG ---- We are now ready for the first invoice. [[Invoice]] == Creating Documents === The first Invoice Open the tab btn:[documents] Click on btn:[create document] The window document [creation wizard opens]. Select in document type `invoice`. Fill in on the whiteboard content a short text about what the invoice is, like: `cut grass and planted tree for mister Jonson` Click on btn:[next] Select on the new window the name and address from the client. (if the name and address is not there, click then on btn:[new contact] or on btn:[edit contact] if you want to edit the contact) Click on btn:[OK]. Now opens the window document [items]. this window has 2 tabs and the 3 buttons on the top: * btn:[Add item...], * btn:[Add discount item], * btn:[Show templates]. In the left tab you can see all the items that we want to place on the invoice, on the right tab we see the text from the header, the total price and the footer. If you click on the text of the header or the footer on the right side then the window changes in such a way that you can edit the header or the footer. Adapt the header and the footer to your situation, on the footer you can place a text: `We make your garden-dream come to reality.`. Click on the button btn:[Show templates]. The right tab changes and show now the earlier made templates, we select in the group Work, the subgroup Plant tree and click then on the button with the to the left pointing arrow on the bottom side. A new window [Create Item from Template] opens. Because we have planted 2 trees, we go to the field [insert] and change this to 2 pcs. Click on btn:[OK] for saving the result or on btn:[cancel] for discarding the result. The window close and we go back to the main window. We click again on btn:[Show templates] and select this time `cut grass`, we click again on the button with the arrow, in the opened window we select that the grass-field was 24 square meter. Click on btn:[OK] for saving the result or on btn:[Cancel] for discarding the result. We add now manually an item by clicking on the button btn:[Add item…] and the window [create new item] opens. Because we have delivered a special tree, we fill here in the name of the special tree `liguster`, at the field insert we fill in the number of the special trees that we have delivered and the price of them. ____ WARNING: Remind that in the catalog we can add a profit on the price of the material, in the invoice and in the offer we can not add a profit on the price of the material. ____ We have now an invoice with 3 items. Click on btn:[OK] for saving the invoice or on btn:[Cancel] for discarding the invoice. We click on btn:[OK] and save the result. Your first invoice is now ready for sending. In the window documents we see our first invoice, notice that this document has a document number which we can see on the left side. On top of the window with all the invoices we see the button [Print Document], on which we click. From the invoice will now a PDF be made which we can print on paper or send by email to the client. After this we are going to create a offer for some work in a garden. [[Offer]] === Creating an Offer The client has asked to plant a tree, we will offer 3 different trees which we can plant. Beside this, we have seen that there is a lifeless three, which we will offer to remove as extra work. image:create_new_doc.png[Numbercycles,float="right"] For the total price we do not want to show the price of the removal of the lifeless tree and we want for the total price only to show the price of one tree and not three. Open again the tab btn:[documents]. Click on btn:[create document] The window _Document Creation Wizard_ opens. select in btn:[document type] > btn:[Offer]. Fill in on the whiteboard content a short text about what the offer is, like: `plant one tree and removal of lifeless tree` Click on btn:[next] Select on the new window the name and address from the client. (if the name and address is not there, click then on btn:[new contact] or on btn:[edit contact] if you want to edit the contact) Click on btn:[OK]. Now the window [edit document] opens. This window has 2 tabs and the 3 buttons on the top: * btn:[Add item...], * btn:[Add discount item], * btn:[Show templates]. Click on the button btn:[Show templates]. The right tab changes and show now the earlier made templates, we select in the group `Work`, the subgroup `Plant tree` and click then on the button with the to the left pointing arrow on the bottom side. A new window [Create Item from Template] opens. Because we want to plant 1 tree, we go to the field [insert] and keep this on 1 pcs. Click on btn:[OK] for saving the result or on btn:[Cancel] for discarding the result. The window close and we go back to the main window. We click on the button btn:[Show templates] and this time we select in catalog Material The material-catalog opens, and we can select in the chapter `trees` the subchapter `loaf trees` in which we select the `apple tree` which we made earlier. Click on we btn:[OK] for saving the result or on btn:[cancel] for discarding the result. The window close and we go back to the main window. We add now manually an item by clicking on the button `Add item…`. the window [create new item] opens. We want that the client can make a choice from an apple, a pear tree and the liguster. Therefor we are going to add also a pear tree manually. We click on the button btn:[Add item…] and the window [create new item] opens. We fill here in the name of the tree `Pear tree`, at the field insert we fill in the number of the special trees that we have delivered and the price of them. We want add this to the material catalog for future use, therefor we select also [select this item as template for future documents] and we select in [save in chapter]`trees`. Click on btn:[OK] for saving the result or on btn:[Cancel] for discarding the result. We does this again but then for the liguster. We have now 3 items with trees in the offer. As last item we add an item with `remove tree` with 0,5 hour for 32 euro. On the left side of an item we can see 2 buttons: a button with a flag and a button with what looks like a page. We select the upper button with the page after which opens a context-menu with the items: image:context1.png[Context menu,float="right"] [Item kind]->[Normal] [Item kind]>[Alternative] [Item kind]>[On demand] [Tax] [Move up] [Move down] [Lock item] [Unlock item] [Delete item] We choose here [Item kind] and change for `pear tree` from [normal] to [alternative]. We do this also for [liguster] and for [remove tree] we change this from [normal] to [on demand]. image:context2.png[Context menu,float="right"] Click on btn:[OK] for saving the result or on btn:[Cancel] for discarding the result. We want to see the result and therefor we click on the button [show document]. We see now that the prize of the pear tree, the liguster and the removal of the tree is not used for the total prize. When we are happy with the result, we can click on the button btn:[close] after which we click on the button btn:[Print Document] for making a PDF what we can print out or send to the client. After your first invoice is now your first offer now also ready for sending. [[Acceptance_of_order]] === Creating an Acceptance of Order The document type "Acceptance of Order" is sent subsequently to an offer. image:acceptance_o_o_context.png[Numbercycles,float="right"] When a client has made a request, we will send an offer in wich we describe which items we will deliver. Hopefully the client will give an order for the work. It is a good practice to respond on the order with an "Acceptance of order" in which we describe all the items we will deliver. We can make the "Acceptance of order" on the same way as we made the invoice or the offer by selecting each item and correcting the number of delivery. This takes time and we can make errors by forgetting items or filling an incorrect number. It can be done quicker by selecting the offer in the list and selecting btn:[Create Followup Document] from either the context menu or the main menu. We have now in documenttype the choice from: [Acceptance of order] [Invoice] [Partial Invoice] [final Invoice] [Progress Payment Invoice] image:followup_1.png[Folloup document,float="right"] We select here "Acceptance of order". We have now a copy from the offer as an Acceptance of order (do not forget to adapt Alternative Delivery items and on demand items.) image:followup_2.png[Folloup document,float="right"] You can do this also for the creation of the invoice as a followup for Acceptance of order. Each document type has a specific list of follow up documents. It is a good practice to describe on the invoice precisely what was delivered. [[Customization]] == Customization Kraft can be customized in most of the graphical user interface and in particular in the output it generates. === Output Document Customization To create PDF output documents, the document data that was edited in the Kraft app is filled into a template. The template defines how the output document looks like, ie. by font settings, placing of elements and such. The file that is assembled from data and the template is converted to PDF using a special document creation script. All that is started automatically by Kraft if a document should be printed. Each document type in Kraft can have it's own template that is used to create a PDF. Which one can be set in the Settings dialog for document types. ==== WeasyPrint Documents NOTE: Kraft still ships with the old ReportLab based converter, but that will be deprecated the future. The WeasyPrint based system is the future. It is a recommended to port existing templates. With https://weasyprint.org[WeasyPrint] Kraft uses a very powerful generator that makes it very easy to create highly customized documents with great quality. WeasyPrint converts a html file to PDF. It is integrating a cascading stylesheet (CSS) file which has a huge impact on the PDF document's look. The html- and CSS input file for WeasyPrint is built from the Kraft template file. To enable the use of WeasyPrint for a document type in Kraft, simply create a weasyprint compatible template file and save it with the extension *.gtmpl*. Based on the file extension Kraft automatically uses WeasyPrint and the Grantlee templating engine for rendering. From version 0.95 on Kraft ships with an example template in the Grantlee- and WeasyPrint format. It can be found at `/usr/share/kraft/reports/invoice.gtmpl` or https://github.com/dragotin/kraft/blob/master/reports/invoice.gtmpl[online on Github]. An example CSS file `kraft.css` (https://github.com/dragotin/kraft/blob/master/reports/kraft.css[on Github]) is shipped as a good starting point for adoption. ==== Template Variables To generate the PDF, Kraft has to transfer data from the document you have been working on to the input file that is processed to a PDF. For that, Kraft uses a text template in which Kraft replaces variables with the actual values. For example, the tag `{{ doc.doctype }}` is replaced with the current document type during the generating process. The syntax is based on the Django syntax for templates described in the https://docs.djangoproject.com/en/3.1/topics/templates/[the docs]. ==== Adding a Logo On the PDF output it is nice to have a logo image included, if the documents should not be printed on a prepared stationary that comes with a printed logo already. This chapter describes a few methods to achieve that with the weasyprint based template. ====== PDF Watermark Funktionality The first, and easiest way to add a logo and other details on the print out is to use the so called PDF Watermark option. That means that the generated document, which does not contain a logo at all, is merged with another PDF into one doc. The so called watermark feature requires an otherwise empty PDF page of the same size as your generated document, that has the logo printed at the right position. It can be created with a text processor that can export PDF. In the Kraft doc type settings dialog, the watermark options for a specific doc type can be selected. The watermark PDF file can be selected and either be applied to the first page only, or to every page of the generated document. Once set up, Kraft automatically merges the generated document with the watermark PDF. The result document contains the content of both documents merged together. This is not only useful for logos, but also other details in the document footer. ====== CSS Directives for Pages The second option is to use the CSS directive for page content on printed HTML pages. This only works with the new weasyprint based doc generation. It uses Cascading Style Sheet (CSS) directives for paged media. CSS uses the `@page` keyword to define attributes of the page on which the content is printed. Weasyprint makes heavy use of that, for example to define the page size. In the Kraft default template for weasyprint called `invoice.gtmpl` this page section can be found: [source,css] @page { size: A4; margin-left: 2.4cm; margin-top:27mm; margin-right: 1.6cm; margin-bottom: 2cm; color: #2f590a; } which defines the page size to be A4, with the given margins and a default text color. To add a logo on in the top left corner of the first page of the result doc, the following snippet could be added: [source,css] ---- @page :first { margin-top: 20mm; margin-bottom: 3cm; @top-left { content: url(/home/miller/miller_logo_s1.png); width:3cm; height: 1cm; } } ---- This displays the top left content only on the first page, and also assigns a different top- and bottom margin to the first page. Note that the content url in the example is a local path, but any valid URL can be used. ==== EPC QR Code With Weasyprint based PDF generation Kraft supports the https://en.wikipedia.org/wiki/EPC_QR_code[EPC QR Code] which implements a European standard for payments by computer and mobile devices. In Germany it is also known as _Giro Code_, in Belgium as _Bancontact QR_, in the Netherlands as _iDEAL QR-code_ and in Spain it is also known as _Bizum QR-code_. In Germany it is accepted by the _Giro Code_ and in Holland it is accepted by the official https://www.ideal.nl/consumenten/ideal-app/[_iDEAL QR-code_] app. In Belgium and Holland it is accepted by the apps of many banks, and in Austria and Finland it is accepted by the apps of all banks. To use the EPC QR code on the invoice printout, the bank account information has to be added to own identity settings dialog in Kraft. The giro code is current only generated for documents with the document type `Rechnung`. To include the generated EPC QR Code into the PDF document, the Weasyprint template needs to contain a snippet like this: ---- {%if doc.isInvoice and epcqrcode.valid %}

    EPC QR Code Dieser QR Code ermöglicht einfaches, sicheres und schnelles Begleichen dieser Rechnung via GiroPay: Diesen Code mit dem Smartphone scannen und Überweisung per Banking App aufgeben.

    {% endif %} ---- [[Menu]] == Menus and Shortcuts === Main Application Menu [[File]] ==== The File Menu [File]>[Quit] [Ctrl]+[Q] Quits the application. [[Document]] ==== The Document Menu [[Show_document]] [Document]>[Show Document] [Ctrl]+[R] Opens a window with the selected document for showing it. [[Edit_document]] [Document]>[Edit Document] [Ctrl+O] Opens a window with the selected document for editing it. [[Open_document]] [Document]>[Open Archived document] [Ctrl]+[A] Opens an archived document. [[Create_document]] [Document]>[Create Document] Opens a window with a wizard for creating a new client-document. [[Copy_document]] [Document]>[Copy Document] Makes a copy of the selected client-document to a new client-document which can belong to an other client or an other documenttype. [[Follow_document]] [Document]>[Follow Document] Opens the selected client-document for editing. [[Print_document]] [Document]>[Print document] Makes a PDf from the selected client-document for to be mailed or printed. [[Mail_document]] [Document]>[Mail document] [Ctrl]+[M] Mails a document. [[settings]] ==== The Settings menu [[edit_template]] [Settings]>[Edit Tag Templates] [Ctrl]+[E] Opens a window where you add, edit or translate the tags (like work, material, plants or discounts). [[redo]] [Settings]>[Redo initial setup] [Ctrl+R] Redoes the initial setup. After this, a restart of Kraft is required. [[toolbars]] [Settings]>[Showed toolbars] Here you can decide if the `main toolbar` and the toolbar `Document Actions` are shown. [[configure]] [Settings]>[Configure Kraft] [Ctrl]+[Shft]+[,] Here you can configure Kraft. === Document Edit Window [[context]] ==== The context Menu [Context]>[Item kind] change the status from this item between * Normal * Alternative * On demand [[Tax]] [Context]>[Tax] Seems not working. [[Move_up]] [Context]>[Move up] Moves this item a place up in document. [[Move_down]] [Context]>[Move down] Moves this item a place down in document. [[Lock_item]] [Context]>[Lock item] It is not clear what is does. [[Unlock_item]] [Context]>[Unlock item] It is not clear what is does. [[Delete_item]] [Context]>[Delete item] Removes this item from document. [[AdvancedTopics]] == Advanced Topics This chapter describes advanced topics around Kraft. Some Linux knowledge is required, and setups should be done by experienced Linux administrators and should be tested carefully. === Using Kraft Collaboratively Kraft can be used collaborative in a distributed environment. That means that multiple users work on their desktops with their own Kraft instance on the same data. This whole topic is a subject to change, as Kraft will evolve to use ownCloud as a private cloud solution to store the data. ==== Sharing Database and Document Pool The simplest case is that two or more Kraft instances use a database together and access the same pool of PDF documents on the harddisk. For simplicity this describes only two Kraft instances. A typical use case would be: Two different Linux users want to use Kraft. They both have their own computer but only work in the same network. For example this would describe a situation with one main office machine that runs Kraft in normal mode, plus a notebook with Kraft in read only mode to view documents, check catalogs and such. For that, the following prerequisites have to be met: 1. MySQL or MariaDB is used as database backend. Sqlite is not supported. 2. The database is accessible with a mysql user and from each machine for both users. 3. The document store directory has to be shared. ____ WARNING: There is no protection against having both users editing the same document. Because that is dangerous and can lead to unpredictable results, it is recommended to run all instances of Kraft except the main one in read only mode. This is done by starting Kraft with the `-r` command line switch. ____ **Sharing the Database** The database server should be installed on the main machine or a dedicated device like a NAS. Networking speed influences the comfort to use obviously. Find howtos on the internet how to setup MySQL accordingly. **Sharing the Document Pool Directory** Kraft writes generated PDF documents into a local directory. Where that is can be configured in the Kraft Config file. The config file has to be adopted on all instances. That is located in each users home directory, in the path `.config/kraftrc`. It has to contain the following config value: ---- [reporting] PdfOutputDir=/data/space/kraftdoc/pdf ---- There are different ways how share that directory, ie. NFS or SMB storages. It is important that both users from both machines can list and access the files. The main user needs read and write access, read only users only need read access to the files. A recommended setup is a NFS share with autofs which is set up on the main machine. To manage file access a certain group should be set up on the machines with which access can be managed. **Starting Kraft in read-only mode** To start Kraft in read-only mode, start the binary with the `-r` command line switch. === XRechnung Support Kraft supports the XRechnung standard. That is a digital format for electronic invoicing, and it passed as law in Germany and follows a EU directive. The XRechnung is a XML file format designed for that purpose. To use the XRechnung Export productivly, a little manual work is still needed in Kraft. Kraft creates the XML file based on a template, very similar to the normal PDF documents. That means that it loads a template that contains static elements (ie. the company address) that do not change between different invoices. The dynamic elements (customer data, items etc.) are filled into the template during the generation step. In order to generate correct XRechnung files for the specific company, the user has to adopt the template file manually to the companies needs. Note that this has only to be done once and should be easy for a person with a bit computer experience (Basic knowledge about XML appreciated!). To adapt the file to the needs of the company, it is best to start with the https://raw.githubusercontent.com/dragotin/kraft/master/reports/xrechnung.xrtmpl[example XRechnung file]. It has to be downloaded and saved into a location that the user can edit. Open it in a normal text editor, such as https://kate-editor.org/[Kate]. Read carefully through the file without being scared off by the XML format. All user strings (ie. company name, address and such) are user specific and should be replaced accordingly. Find https://www.xoev.de/xrechnung-16828[details about the format] here to better understand the meaning of the fields. Make sure to not disturb the proper XML format and do not change places where the template format `{{ template_name }}` is used. Once the file is adopted to the needs, open the Settings dialog of Kraft and insert the filename into the entry field for the XRechnung Template File on the Document Defaults page. Next is to specify for which document types the XRechnung export should be made available. For that, open the Kraft Settings dialog, and proceed to the Document Type tab on the left. For each document type listed there, you can mark the checkbox btn:[Enable XRechnung Support]. After that steps, the btn:[Export XRechung] menu item will let you open a dialog to add a few additional parameters for the XRechnung that Kraft does not have by default, and lets you pick a filename where to save the XRechnung invoice file to. This file can now be transferred to the receiver of the invoice via email, a private file share or the like. NOTE: There are validators for invoices in XRechnung format out there in the internet. It is useful to verify the format of the Kraft exported XRechnung. === Changing the Locale If it is needed that Kraft runs under a different locale than the actual desktop environment, this can be achieved by setting the desired locale in the start file of Kraft. On the linux desktop, apps are usually started through a so called https://specifications.freedesktop.org/desktop-entry-spec/latest/[desktop file]. It contains the information how the Kraft binary is started if user clicks on the icon on the desktop or in the start menu. The desktop file can usually be found in `/usr/share/applications/de.volle-kraft-voraus.kraft.desktop`. It contains the line ---- Exec=kraft %u ---- which starts the application with the default locale. Changing it to ---- Exec=env LANG=de_DE.UTF-8 kraft %u ---- would change that to run in the German locale for example, independent from the desktop environment location. [[Credits]] == Credits and License Program and documentation copyright 2004–2024 Klaas Freitag Documentation copyright 2020-2024 Ronald Stroethoff kraft-1.2.2/manual/kraftmanual.css000066400000000000000000001037561467704360200171440ustar00rootroot00000000000000@import url(http://cdnjs.cloudflare.com/ajax/libs/font-awesome/3.2.0/css/font-awesome.css); /* normalize.css v2.1.1 | MIT License | git.io/normalize */ /* ========================================================================== HTML5 display definitions ========================================================================== */ /** Correct `block` display not defined in IE 8/9. */ article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } /** Correct `inline-block` display not defined in IE 8/9. */ audio, canvas, video { display: inline-block; } /** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */ audio:not([controls]) { display: none; height: 0; } /** Address styling not present in IE 8/9. */ [hidden] { display: none; } /* ========================================================================== Base ========================================================================== */ /** 1. Prevent system color scheme's background color being used in Firefox, IE, and Opera. 2. Prevent system color scheme's text color being used in Firefox, IE, and Opera. 3. Set default font family to sans-serif. 4. Prevent iOS text size adjust after orientation change, without disabling user zoom. */ html { background: #fff; /* 1 */ color: #000; /* 2 */ font-family: sans-serif; /* 3 */ -ms-text-size-adjust: 100%; /* 4 */ -webkit-text-size-adjust: 100%; /* 4 */ } /** Remove default margin. */ body { margin: 0; } /* ========================================================================== Links ========================================================================== */ /** Address `outline` inconsistency between Chrome and other browsers. */ a:focus { outline: thin dotted; } /** Improve readability when focused and also mouse hovered in all browsers. */ a:active, a:hover { outline: 0; } /* ========================================================================== Typography ========================================================================== */ /** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */ h1 { font-size: 2em; margin: 0.67em 0; } /** Address styling not present in IE 8/9, Safari 5, and Chrome. */ abbr[title] { border-bottom: 1px dotted; } /** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */ b, strong { font-weight: bold; } /** Address styling not present in Safari 5 and Chrome. */ dfn { font-style: italic; } /** Address differences between Firefox and other browsers. */ hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } /** Address styling not present in IE 8/9. */ mark { background: #ff0; color: #000; } /** Correct font family set oddly in Safari 5 and Chrome. */ code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } /** Improve readability of pre-formatted text in all browsers. */ pre { white-space: pre-wrap; } /** Set consistent quote types. */ q { quotes: "\201C" "\201D" "\2018" "\2019"; } /** Address inconsistent and variable font size in all browsers. */ small { font-size: 80%; } /** Prevent `sub` and `sup` affecting `line-height` in all browsers. */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } /* ========================================================================== Embedded content ========================================================================== */ /** Remove border when inside `a` element in IE 8/9. */ img { border: 0; } /** Correct overflow displayed oddly in IE 9. */ svg:not(:root) { overflow: hidden; } /* ========================================================================== Figures ========================================================================== */ /** Address margin not present in IE 8/9 and Safari 5. */ figure { margin: 0; } /* ========================================================================== Forms ========================================================================== */ /** Define consistent border, margin, and padding. */ fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } /** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */ legend { border: 0; /* 1 */ padding: 0; /* 2 */ } /** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */ button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ } /** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */ button, input { line-height: normal; } /** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */ button, select { text-transform: none; } /** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */ button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ } /** Re-set default cursor for disabled elements. */ button[disabled], html input[disabled] { cursor: default; } /** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */ input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } /** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */ input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; } /** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */ input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } /** Remove inner padding and border in Firefox 4+. */ button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } /** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */ textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ } /* ========================================================================== Tables ========================================================================== */ /** Remove most spacing between table cells. */ table { border-collapse: collapse; border-spacing: 0; } *, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } html, body { font-size: 100%; } body { background: white; color: #222222; padding: 0; margin: 0; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; } a:hover { cursor: pointer; } a:focus { outline: none; } img, object, embed { max-width: 100%; height: auto; } object, embed { height: 100%; } img { -ms-interpolation-mode: bicubic; } #map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; } .left { float: left !important; } .right { float: right !important; } .text-left { text-align: left !important; } .text-right { text-align: right !important; } .text-center { text-align: center !important; } .text-justify { text-align: justify !important; } .hide { display: none; } .antialiased, body { -webkit-font-smoothing: antialiased; } img { display: inline-block; vertical-align: middle; } textarea { height: auto; min-height: 50px; } select { width: 100%; } p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; } .subheader, #content #toctitle, .admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .videoblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title, .tableblock > caption { line-height: 1.4; color: #777777; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; } /* Typography resets */ div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; } /* Default Link Styles */ a { color: #417b06; text-decoration: none; line-height: inherit; } a:hover, a:focus { color: #417b06; } a img { border: none; } /* Default paragraph styles */ p { font-family: inherit; font-weight: normal; font-size: 1em; line-height: 1.6; margin-bottom: 1.25em; text-rendering: optimizeLegibility; } p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; } /* Default header styles */ h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; color: #417b06; text-rendering: optimizeLegibility; margin-top: 1em; margin-bottom: 0.5em; line-height: 1.2125em; } h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: gray; line-height: 0; } h1 { font-size: 2.125em; } h2 { font-size: 1.6875em; } h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; } h4 { font-size: 1.125em; } h5 { font-size: 1.125em; } h6 { font-size: 1em; } hr { border: dotted #cccccc; border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; } /* Helpful Typography Defaults */ em, i { font-style: italic; line-height: inherit; } strong, b { font-weight: bold; line-height: inherit; } small { font-size: 60%; line-height: inherit; } code { font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: bold; color: #417b06; } /* Lists */ ul, ol, dl { font-size: 1em; line-height: 1.6; margin-bottom: 1.25em; list-style-position: outside; font-family: inherit; } ul, ol { margin-left: 1.5em; } /* Unordered Lists */ ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* Override nested font-size change */ } ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; } ul.square { list-style-type: square; } ul.circle { list-style-type: circle; } ul.disc { list-style-type: disc; } ul.no-bullet { list-style: none; } /* Ordered Lists */ ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; } /* Definition Lists */ dl dt { margin-bottom: 0.3125em; font-weight: bold; } dl dd { margin-bottom: 1.25em; } /* Abbreviations */ abbr, acronym { text-transform: uppercase; font-size: 90%; color: #555555; border-bottom: 1px dotted #dddddd; cursor: help; } abbr { text-transform: none; } /* Blockquotes */ blockquote { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #efefef; } blockquote cite { display: block; font-size: 0.8125em; color: #5e5e5e; } blockquote cite:before { content: "\2014 \0020"; } blockquote cite a, blockquote cite a:visited { color: #5e5e5e; } blockquote, blockquote p { line-height: 1.6; color: #777777; } /* Microformats */ .vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid #dddddd; padding: 0.625em 0.75em; } .vcard li { margin: 0; display: block; } .vcard .fn { font-weight: bold; font-size: 0.9375em; } .vevent .summary { font-weight: bold; } .vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: none; padding: 0 0.0625em; } @media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; } h1 { font-size: 2.75em; } h2 { font-size: 2.3125em; } h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; } h4 { font-size: 1.4375em; } } /* Print styles. Inlined to avoid required HTTP connection: www.phpied.com/delay-loading-your-print-css/ Credit to Paul Irish and HTML5 Boilerplate (html5boilerplate.com) */ .print-only { display: none !important; } @media print { * { background: transparent !important; color: #000 !important; /* Black prints faster: h5bp.com/s */ box-shadow: none !important; text-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; /* h5bp.com/t */ } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } @page { margin: 0.5cm; } p, h2, h3, #toctitle, .sidebarblock > .content > .title { orphans: 3; widows: 3; } h2, h3, #toctitle, .sidebarblock > .content > .title { page-break-after: avoid; } .hide-on-print { display: none !important; } .print-only { display: block !important; } .hide-for-print { display: none !important; } .show-for-print { display: inherit !important; } } /* Tables */ table { background: white; margin-bottom: 1.25em; border: solid 1px #dddddd; } table thead, table tfoot { background: whitesmoke; font-weight: normal; } table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: #333333; text-align: left; } table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: #555555; } table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #f9f9f9; } table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.4; } .clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; } .clearfix:after, .float-group:after { clear: both; } *:not(pre) > code { font-size: inherit; padding: 0; white-space: nowrap; background-color: inherit; border: 0 solid #dddddd; -webkit-border-radius: 0; border-radius: 0; text-shadow: none; } pre, pre > code { line-height: 1.4; color: black; font-family: monospace, serif; font-weight: normal; } kbd.keyseq { color: #888888; } kbd:not(.keyseq) { display: inline-block; color: #555555; font-size: 0.75em; line-height: 1.4; background-color: #F7F7F7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; margin: -0.15em 0.15em 0 0.15em; padding: 0.2em 0.6em 0.2em 0.5em; vertical-align: middle; white-space: nowrap; } kbd kbd:first-child { margin-left: 0; } kbd kbd:last-child { margin-right: 0; } .menuseq, .menu { color: #3b3b3b; } #header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; } #header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; } #header:after, #content:after, #footnotes:after, #footer:after { clear: both; } #header { margin-bottom: 2.5em; } #header > h1 { color: #417b06; font-weight: bold; border-bottom: 1px dotted #cccccc; margin-bottom: -28px; padding-bottom: 32px; } #header span { color: #777777; } #header #revnumber { text-transform: capitalize; } #header br { display: none; } #header br + span { padding-left: 3px; } #header br + span:before { content: "\2013 \0020"; } #header br + span.author { padding-left: 0; } #header br + span.author:before { content: ", "; } #toc { border-bottom: 1px solid #cccccc; padding-bottom: 1.25em; } #toc > ul { margin-left: 0.25em; } #toc ul.sectlevel0 > li > a { font-style: italic; } #toc ul.sectlevel0 ul.sectlevel1 { margin-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; } #toc ul { list-style-type: none; } #toctitle { color: #777777; } @media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; } #toc.toc2 { position: fixed; width: 20em; left: 0; top: 0; border-right: 1px solid #cccccc; border-bottom: 0; z-index: 1000; padding: 1em; height: 100%; overflow: auto; } #toc.toc2 #toctitle { margin-top: 0; } #toc.toc2 > ul { font-size: .95em; } #toc.toc2 ul ul { margin-left: 0; padding-left: 1.25em; } #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; } body.toc2.toc-right { padding-left: 0; padding-right: 20em; } body.toc2.toc-right #toc.toc2 { border-right: 0; border-left: 1px solid #cccccc; left: auto; right: 0; } } #content #toc { border-style: solid; border-width: 1px; border-color: #d9d9d9; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; border-width: 0; -webkit-border-radius: 0; border-radius: 0; } #content #toc > :first-child { margin-top: 0; } #content #toc > :last-child { margin-bottom: 0; } #content #toc a { text-decoration: none; } #content #toctitle { font-weight: bold; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-size: 1em; padding-left: 0.125em; } #footer { max-width: 100%; background-color: #272727; padding: 1.25em; } #footer-text { color: #bcbcbc; line-height: 1.44; } .sect1 { padding-bottom: 1.25em; } .sect1 + .sect1 { border-top: 1px solid #cccccc; } #content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; width: 1em; margin-left: -1em; display: block; text-decoration: none; visibility: hidden; text-align: center; font-weight: normal; } #content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: '\00A7'; font-size: .85em; vertical-align: text-top; display: block; margin-top: 0.05em; } #content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; } #content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: #333333; text-decoration: none; } #content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: #262626; } .imageblock, .literalblock, .listingblock, .verseblock, .videoblock { margin-bottom: 1.25em; } .admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .videoblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-align: left; font-weight: bold; } .tableblock > caption { text-align: left; font-weight: bold; white-space: nowrap; overflow: visible; max-width: 0; } table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-size: inherit; } .admonitionblock > table { border: 0; background: none; width: 100%; } .admonitionblock > table td.icon { text-align: center; width: 80px; } .admonitionblock > table td.icon img { max-width: none; } .admonitionblock > table td.icon .title { font-weight: bold; text-transform: uppercase; } .admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px dotted #cccccc; color: #777777; } .admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; } .exampleblock > .content { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 0; border-radius: 0; } .exampleblock > .content > :first-child { margin-top: 0; } .exampleblock > .content > :last-child { margin-bottom: 0; } .exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6, .exampleblock > .content p { color: #555555; } .exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6 { line-height: 1; margin-bottom: 0.625em; } .exampleblock > .content h1.subheader, .exampleblock > .content h2.subheader, .exampleblock > .content h3.subheader, .exampleblock > .content .subheader#toctitle, .sidebarblock.exampleblock > .content > .subheader.title, .exampleblock > .content h4.subheader, .exampleblock > .content h5.subheader, .exampleblock > .content h6.subheader { line-height: 1.4; } .exampleblock.result > .content { -webkit-box-shadow: 0 1px 8px #d9d9d9; box-shadow: 0 1px 8px #d9d9d9; } .sidebarblock { border-style: solid; border-width: 1px; border-color: #d9d9d9; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; -webkit-border-radius: 0; border-radius: 0; } .sidebarblock > :first-child { margin-top: 0; } .sidebarblock > :last-child { margin-bottom: 0; } .sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6, .sidebarblock p { color: #555555; } .sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6 { line-height: 1; margin-bottom: 0.625em; } .sidebarblock h1.subheader, .sidebarblock h2.subheader, .sidebarblock h3.subheader, .sidebarblock .subheader#toctitle, .sidebarblock > .content > .subheader.title, .sidebarblock h4.subheader, .sidebarblock h5.subheader, .sidebarblock h6.subheader { line-height: 1.4; } .sidebarblock > .content > .title { color: #777777; margin-top: 0; line-height: 1.6; } .exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; } .literalblock > .content pre, .listingblock > .content pre { background: #efefef; border-width: 1px; border-style: solid; border-color: #cccccc; -webkit-border-radius: 0; border-radius: 0; padding: 0.75em 0.75em 0.625em 0.75em; word-wrap: break-word; } .literalblock > .content pre.nowrap, .listingblock > .content pre.nowrap { overflow-x: auto; white-space: pre; word-wrap: normal; } .literalblock > .content pre > code, .listingblock > .content pre > code { display: block; } @media only screen { .literalblock > .content pre, .listingblock > .content pre { font-size: 0.72em; } } @media only screen and (min-width: 768px) { .literalblock > .content pre, .listingblock > .content pre { font-size: 0.81em; } } @media only screen and (min-width: 1280px) { .literalblock > .content pre, .listingblock > .content pre { font-size: 0.9em; } } .listingblock > .content { position: relative; } .listingblock:hover code[class*=" language-"]:before { text-transform: uppercase; font-size: 0.9em; color: #999; position: absolute; top: 0.375em; right: 0.375em; } .listingblock:hover code.asciidoc:before { content: "asciidoc"; } .listingblock:hover code.clojure:before { content: "clojure"; } .listingblock:hover code.css:before { content: "css"; } .listingblock:hover code.groovy:before { content: "groovy"; } .listingblock:hover code.html:before { content: "html"; } .listingblock:hover code.java:before { content: "java"; } .listingblock:hover code.javascript:before { content: "javascript"; } .listingblock:hover code.python:before { content: "python"; } .listingblock:hover code.ruby:before { content: "ruby"; } .listingblock:hover code.scss:before { content: "scss"; } .listingblock:hover code.xml:before { content: "xml"; } .listingblock:hover code.yaml:before { content: "yaml"; } .listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: #999; } .listingblock.terminal pre .command:not([data-prompt]):before { content: '$'; } table.pyhltable { border: 0; margin-bottom: 0; } table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; } table.pyhltable td.code { padding-left: .75em; padding-right: 0; } .highlight.pygments .lineno, table.pyhltable td:not(.code) { color: #999; padding-left: 0; padding-right: .5em; border-right: 1px solid #cccccc; } .highlight.pygments .lineno { display: inline-block; margin-right: .25em; } table.pyhltable .linenodiv { background-color: transparent !important; padding-right: 0 !important; } .quoteblock { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #efefef; } .quoteblock blockquote { margin: 0 0 1.25em 0; padding: 0 0 0.5625em 0; border: 0; } .quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; } .quoteblock .attribution { margin-top: -.25em; padding-bottom: 0.5625em; font-size: 0.8125em; color: #5e5e5e; } .quoteblock .attribution br { display: none; } .quoteblock .attribution cite { display: block; margin-bottom: 0.625em; } table thead th, table tfoot th { font-weight: normal; } table.tableblock.grid-all { border-collapse: separate; border-spacing: 1px; -webkit-border-radius: 0; border-radius: 0; border-top: 1px solid #dddddd; border-bottom: 1px solid #dddddd; } table.tableblock.frame-topbot, table.tableblock.frame-none { border-left: 0; border-right: 0; } table.tableblock.frame-sides, table.tableblock.frame-none { border-top: 0; border-bottom: 0; } table.tableblock td .paragraph:last-child p, table.tableblock td > p:last-child { margin-bottom: 0; } th.tableblock.halign-left, td.tableblock.halign-left { text-align: left; } th.tableblock.halign-right, td.tableblock.halign-right { text-align: right; } th.tableblock.halign-center, td.tableblock.halign-center { text-align: center; } th.tableblock.valign-top, td.tableblock.valign-top { vertical-align: top; } th.tableblock.valign-bottom, td.tableblock.valign-bottom { vertical-align: bottom; } th.tableblock.valign-middle, td.tableblock.valign-middle { vertical-align: middle; } p.tableblock.header { color: #333333; font-weight: normal; } td > div.verse { white-space: pre; } ol { margin-left: 1.75em; } ul li ol { margin-left: 1.5em; } dl dd { margin-left: 1.125em; } dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; } ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { margin-bottom: 0.625em; } ul.unstyled, ol.unnumbered, ul.checklist, ul.none { list-style-type: none; } ul.unstyled, ol.unnumbered, ul.checklist { margin-left: 0.625em; } ul.checklist li > p:first-child > i[class^="icon-check"]:first-child, ul.checklist li > p:first-child > input[type="checkbox"]:first-child { margin-right: 0.25em; } ul.checklist li > p:first-child > input[type="checkbox"]:first-child { position: relative; top: 1px; } ul.inline { margin: 0 auto 0.625em auto; margin-left: -1.375em; margin-right: 0; padding: 0; list-style: none; overflow: hidden; } ul.inline > li { list-style: none; float: left; margin-left: 1.375em; display: block; } ul.inline > li > * { display: block; } .unstyled dl dt { font-weight: normal; font-style: normal; } ol.arabic { list-style-type: decimal; } ol.decimal { list-style-type: decimal-leading-zero; } ol.loweralpha { list-style-type: lower-alpha; } ol.upperalpha { list-style-type: upper-alpha; } ol.lowerroman { list-style-type: lower-roman; } ol.upperroman { list-style-type: upper-roman; } ol.lowergreek { list-style-type: lower-greek; } .hdlist > table, .colist > table { border: 0; background: none; } .hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; } td.hdlist1 { padding-right: .8em; font-weight: bold; } td.hdlist1, td.hdlist2 { vertical-align: top; } .literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; } .colist > table tr > td:first-of-type { padding: 0 .8em; line-height: 1; } .colist > table tr > td:last-of-type { padding: 0.25em 0; } .qanda > ol > li > p > em:only-child { color: #cde62c; } .thumb, .th { line-height: 0; display: inline-block; border: solid 4px white; -webkit-box-shadow: 0 0 0 1px #dddddd; box-shadow: 0 0 0 1px #dddddd; } .imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 1.25em 0; } .imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 1.25em 0.625em; } .imageblock > .title { margin-bottom: 0; } .imageblock.thumb, .imageblock.th { border-width: 6px; } .imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; } .image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; } .image.left { margin-right: 0.625em; } .image.right { margin-left: 0.625em; } a.image { text-decoration: none; } span.footnote, span.footnoteref { vertical-align: super; font-size: 0.875em; } span.footnote a, span.footnoteref a { text-decoration: none; } #footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; } #footnotes hr { width: 20%; min-width: 6.25em; margin: -.25em 0 .75em 0; border-width: 1px 0 0 0; } #footnotes .footnote { padding: 0 0.375em; line-height: 1.3; font-size: 0.875em; margin-left: 1.2em; text-indent: -1.2em; margin-bottom: .2em; } #footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; } #footnotes .footnote:last-of-type { margin-bottom: 0; } #content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; } .gist .file-data > table { border: none; background: #fff; width: 100%; margin-bottom: 0; } .gist .file-data > table td.line-data { width: 99%; } div.unbreakable { page-break-inside: avoid; } .big { font-size: larger; } .small { font-size: smaller; } .underline { text-decoration: underline; } .overline { text-decoration: overline; } .line-through { text-decoration: line-through; } .aqua { color: #00bfbf; } .aqua-background { background-color: #00fafa; } .black { color: black; } .black-background { background-color: black; } .blue { color: #0000bf; } .blue-background { background-color: #0000fa; } .fuchsia { color: #bf00bf; } .fuchsia-background { background-color: #fa00fa; } .gray { color: #606060; } .gray-background { background-color: #7d7d7d; } .green { color: #006000; } .green-background { background-color: #007d00; } .lime { color: #00bf00; } .lime-background { background-color: #00fa00; } .maroon { color: #600000; } .maroon-background { background-color: #7d0000; } .navy { color: #000060; } .navy-background { background-color: #00007d; } .olive { color: #606000; } .olive-background { background-color: #7d7d00; } .purple { color: #600060; } .purple-background { background-color: #7d007d; } .red { color: #bf0000; } .red-background { background-color: #fa0000; } .silver { color: #909090; } .silver-background { background-color: #bcbcbc; } .teal { color: #006060; } .teal-background { background-color: #007d7d; } .white { color: #bfbfbf; } .white-background { background-color: #fafafa; } .yellow { color: #bfbf00; } .yellow-background { background-color: #fafa00; } span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } .admonitionblock td.icon [class^="icon-"]:before { font-size: 2.5em; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; } .admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #d2e943; color: #b1c918; } .admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; } .admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; } .admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; } .admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; } .conum { display: inline-block; color: white !important; background-color: #555555; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; width: 20px; height: 20px; font-size: 12px; font-weight: bold; line-height: 20px; font-family: Arial, sans-serif; font-style: normal; position: relative; top: -2px; letter-spacing: -1px; } .conum * { color: white !important; } .conum + b { display: none; } .conum:after { content: attr(data-value); } .conum:not([data-value]):empty { display: none; } #header > h1 { border-bottom-style: solid; } #toctitle { color: #333333; } .listingblock > .content > pre, .literalblock > .content > pre { background: -moz-linear-gradient(top, white 0%, #f4f4f4 100%); background: -webkit-linear-gradient(top, white 0%, #f4f4f4 100%); background: linear-gradient(to bottom, #ffffff 0%, #f4f4f4 100%); -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15); box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15); } .sidebarblock { background: none; border: none; -webkit-box-shadow: 0 0 5px rgba(118, 137, 4, 0.5); box-shadow: 0 0 5px rgba(118, 137, 4, 0.5); } .sidebarblock > .content > .title { color: #181818; } kraft-1.2.2/manual/locale/000077500000000000000000000000001467704360200153505ustar00rootroot00000000000000kraft-1.2.2/manual/locale/attributes-de.adoc000066400000000000000000000013161467704360200207550ustar00rootroot00000000000000// German translation, courtesy of Florian Wilhelm :appendix-caption: Anhang :appendix-refsig: {appendix-caption} :caution-caption: Achtung :chapter-label: Kapitel :chapter-refsig: {chapter-label} :example-caption: Beispiel :figure-caption: Abbildung :important-caption: Wichtig :last-update-label: Zuletzt aktualisiert ifdef::listing-caption[:listing-caption: Listing] ifdef::manname-title[:manname-title: Bezeichnung] :note-caption: Anmerkung :part-label: Teil :part-refsig: {part-label} ifdef::preface-title[:preface-title: Vorwort] :section-refsig: Abschnitt :table-caption: Tabelle :tip-caption: Hinweis :toc-title: Inhaltsverzeichnis :untitled-label: Ohne Titel :version-label: Version :warning-caption: Warnung kraft-1.2.2/manual/locale/attributes-en.adoc000066400000000000000000000013161467704360200207670ustar00rootroot00000000000000// English translation, for reference only; matches the built-in behavior of core :appendix-caption: Appendix :appendix-refsig: {appendix-caption} :caution-caption: Caution :chapter-label: Chapter :chapter-refsig: {chapter-label} :example-caption: Example :figure-caption: Figure :important-caption: Important :last-update-label: Last updated ifdef::listing-caption[:listing-caption: Listing] ifdef::manname-title[:manname-title: Name] :note-caption: Note :part-label: Part :part-refsig: {part-label} ifdef::preface-title[:preface-title: Preface] :section-refsig: Section :table-caption: Table :tip-caption: Tip :toc-title: Table of Contents :untitled-label: Untitled :version-label: Version :warning-caption: Warning kraft-1.2.2/manual/locale/attributes-nl.adoc000066400000000000000000000013571467704360200210030ustar00rootroot00000000000000// Dutch translation, courtesy of Roel Van Steenberghe :appendix-caption: Bijlage :appendix-refsig: {appendix-caption} :caution-caption: Opgelet :chapter-signifier: Hoofdstuk :chapter-refsig: {chapter-signifier} :example-caption: Voorbeeld :figure-caption: Figuur :important-caption: Belangrijk :last-update-label: Laatste aanpassing ifdef::listing-caption[:listing-caption: Lijst] ifdef::manname-title[:manname-title: Naam] :note-caption: Noot :part-signifier: Deel :part-refsig: {part-signifier} ifdef::preface-title[:preface-title: Inleiding] :section-refsig: Paragraaf :table-caption: Tabel :tip-caption: Tip :toc-title: Inhoudsopgave :untitled-label: Naamloos :version-label: Versie :warning-caption: Waarschuwing kraft-1.2.2/manual/locale/attributes.adoc000066400000000000000000000013751467704360200203740ustar00rootroot00000000000000// This directory provides translations for all built-in attributes in Asciidoctor that emit translatable strings. // See http://asciidoctor.org/docs/user-manual/#customizing-labels to learn how to apply this file. // // If you're introducing a new translation, create a file named attributes-.adoc, where is the IANA subtag for the language. // Next, assign a translation for each attribute, using attributes-en.adoc as a reference. // // IMPORTANT: Do not include any blank lines in the transation file. // // NOTE: Please wrap the listing-caption and preface-title entries in a preprocessor conditional directive. // These attributes should only be updated if set explicitly by the user. ifdef::lang[include::attributes-{lang}.adoc[]] kraft-1.2.2/manual/makeman.sh000077500000000000000000000032101467704360200160550ustar00rootroot00000000000000#!/bin/bash # set -euxo pipefail # FIXME: Check if the tools ascidoctor and po4a-translate are installed # FIXME: Be compatible with other ascii doc generators # ===================================================================== showhelp() { echo "Usage: $0 " >&2 echo echo " Creates the Kraft manual and its translations." echo " asciidoctor and po4trans need to be installed." echo "" echo " To read the source from elsewhere, the script" echo " takes a source directory as argument" echo "" echo " Output happens to the current directory." exit 1 } # ===================================================================== srcdir="${1:-.}" srcfile="${srcdir}/kraft.adoc" version="1.0" outfile="kraft-en.html" if [ -n "$1" ] && [ "$1" == "-h" ]; then showhelp fi echo "Building $srcfile in ${srcdir}" outdir=`pwd` pushd "${srcdir}" lang=en asciidocargs="-D ${outdir} -a path=${srcdir} -a VERSION=${version} -a stylesheet=kraftmanual.css" # english master doc asciidoctor ${asciidocargs} -a lang=${lang} -o ${outfile} ${srcfile} echo "built ${outfile}" # build the internationalized versions languages="de nl" for lang in ${languages} do transsrc="${srcdir}/po/kraft-${lang}.po" if [ -f "${transsrc}" ]; then po4a-translate -f asciidoc -M utf-8 -m ${srcfile} -p ${transsrc} -k 0 -l kraft-${lang}.adoc outfile="kraft-${lang}.html" asciidoctor ${asciidocargs} -a lang=${lang} -o ${outfile} kraft-${lang}.adoc rm kraft-${lang}.adoc echo "built ${transsrc} to ${outfile}" else echo "File ${transsrc} does not exist!" fi done popd kraft-1.2.2/manual/po/000077500000000000000000000000001467704360200145275ustar00rootroot00000000000000kraft-1.2.2/manual/po/kraft-de.po000066400000000000000000002217751467704360200166020ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2023-09-12 14:32+0200\n" "PO-Revision-Date: 2021-10-13 22:21+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Language: de_DE\n" "X-Source-Language: en_US\n" "X-Generator: Poedit 2.3\n" #. type: Title = #: kraft.adoc:1 #, no-wrap msgid "The Kraft Handbook" msgstr "Das Kraft Handbuch" #. type: Plain text #: kraft.adoc:3 #, fuzzy msgid "Ronald Stroethoff, Klaas Freitag" msgstr "Roland Stroethoff, Klaas Freitag" #. type: Title == #: kraft.adoc:16 #, no-wrap msgid "Introduction" msgstr "Einführung" #. type: Plain text #: kraft.adoc:19 #, fuzzy msgid "" "Kraft is a Qt and KDE application to organize office documents like quotes " "and invoices in a small business. It eases the creation of documents and " "helps with repeating tasks." msgstr "" "Kraft ist ein Qt- und KDE-Programm zum Organisieren von Bürodokumenten wie " "Angeboten und Rechnungen in kleinen Unternehmen. Es erleichtert die " "Erstellung der Dokument und vereinfacht wiederkehrende Aufgaben." #. type: Plain text #: kraft.adoc:21 #, fuzzy msgid "" "Using Kraft, there is no need for fiddling with a text processor any more. " "Documents are created by a few clicks, edited, generated and archived " "automatically. Kraft generates high quality PDF output for printing, mailing " "and archiving." msgstr "" "Mit Kraft wird kein Textbearbeitungsprogramm mehr benötigt. Rechnungs- und " "Angebotsdokumente werden mit ein paar Klicks erstellt und automatisch " "abgelegt. Kraft generiert hochqualitative PDF Dokumente für Druck, EMail und " "Archivierung." #. type: Labeled list #: kraft.adoc:22 #, no-wrap msgid "Feature Overview" msgstr "Funktionen" #. type: Plain text #: kraft.adoc:25 #, fuzzy msgid "Simple creation of offers, invoices and similar documents." msgstr "" "Unterstütztes Erstellen von Angeboten, Rechnungen und ähnlichen Dokumenten." #. type: Plain text #: kraft.adoc:26 #, fuzzy msgid "" "Customer management, deeply integrated with the mature KDE KAddressbook." msgstr "" "Kundenverwaltung, durch die Verwendung von KAdressbuch tief in die KDE " "Infrastruktur integriert." #. type: Plain text #: kraft.adoc:27 #, fuzzy msgid "Maintenance of document relations, ie. Partial invoices vs. invoices." msgstr "" "Verwaltung der Dokument-Beziehungen, zum Beispiel Teilrechnungen und " "Rechnungen." #. type: Plain text #: kraft.adoc:28 msgid "Templates for document header- and footertexts and for document items." msgstr "Vorlagen für Dokument-Kopf- und Fusstexte sowie Dokumentposten." #. type: Plain text #: kraft.adoc:29 #, fuzzy msgid "Pre calculation of item prices." msgstr "Kalkulation von einzelnen Posten." #. type: Plain text #: kraft.adoc:30 msgid "Material management." msgstr "Materialverwaltung." #. type: Plain text #: kraft.adoc:31 msgid "Configurable document creation in PDF format for print and email." msgstr "" "Konfigurierbare Dokument-Erstellung im PDF Format zum Druck und Versenden " "per Email." #. type: Plain text #: kraft.adoc:33 msgid "" "The code of Kraft is open source and is released under the https://en." "wikipedia.org/wiki/GNU_General_Public_License[GNU General Public License]." msgstr "" "Der Quelltext zu Kraft ist open source and wird unter der Lizenz https://en." "wikipedia.org/wiki/GNU_General_Public_License[GNU General Public License] " "veröffentlicht." #. type: Plain text #: kraft.adoc:38 #, fuzzy, no-wrap msgid "" "Kraft is driven by community of users, coders, artists and others by voluntary work. +\n" "Also this manual needs contributions! +\n" " +\n" " Learn more on https://github.com/dragotin/kraft/blob/master/manual/Readme.md[how to contribute]!\n" msgstr "" "Kraft wird durch eine Gemeinschaft von Benutzern, Entwicklern und anderen vorangetrieben. +\n" "Dieses Benutzerhandbuch benötigt Ihre Hilfe zur Verbesserung. +\n" " +\n" "Lernen Sie mehr auf https://github.com/dragotin/kraft/blob/master/manual/Readme.md[how to contribute]!\n" #. type: Title == #: kraft.adoc:40 #, no-wrap msgid "First Use and Basic Configuration" msgstr "Erster Start und Grundkonfiguration" #. type: Plain text #: kraft.adoc:43 #, fuzzy msgid "" "When Kraft is started for the first time, it automatically enters the " "initial setup process." msgstr "" "Wenn Kraft das erste Mal gestartet wird, wird automatisch mit der " "Einrichtung begonnen." #. type: Plain text #: kraft.adoc:45 #, fuzzy msgid "" "During the initial setup you are asked to select a database to use and give " "the name and address of your company." msgstr "" "Während des initialen Setup wird der Datenbank-Typ und die Adresse der Firma " "abgefragt." #. type: Plain text #: kraft.adoc:47 #, fuzzy msgid "" "You can fill in your company address (that appears on the printed documents) " "in two ways: in the setup procedure use the first tab *Select from " "Addressbook* for to select your on address in KAddressBook (if you have " "filled your own address in KaddressBook) or use the second tab *Manual " "entry* for to fill in the information of the address from your company " "manually. This step is necessary for the correct generation of your " "documents as the address is automatically used in the document generation " "step." msgstr "" "Die Adresse der eigenen Firma, die automatisch auf dem Ausgabedokument " "erscheint, kann auf zwei Arten eingegeben werden: In der Prozedur nach dem " "ersten Start im entsprechenden Tab, oder später über den Einstellungsdialog. " "Die Adresse kann entweder aus dem Adressbuch gewählt werden oder per Hand " "eingegeben werden. Dieser Schritt ist für die fehlerfreie Erstellung der " "Dokumente nötig." #. type: Plain text #: kraft.adoc:49 #, fuzzy msgid "image:company_adress1.png[Company adress,float=\"right\"]" msgstr "image:company_adress1.png[Firmenadresse,float=\"right\"]" #. type: Plain text #: kraft.adoc:52 #, fuzzy msgid "" "After the initial setup, select menu:Preferences[Settings]. That allows to " "prepare Kraft correctly so it can be used in a proper way." msgstr "" "Nach dem initialen Setup kann Kraft über das Menü Preferences[Settings] " "konfiguriert werden. Das erlaubt, Kraft für die eigenen Bedürfnisse " "anzupassen." #. type: Plain text #: kraft.adoc:54 #, fuzzy msgid "In the Preferences dialog we have the tabs:" msgstr "Im Einstellungsfenster befinden sich die Tabs:" #. type: Plain text #: kraft.adoc:61 #, no-wrap msgid "" " *Document Defaults\n" " *Taxes\n" " *Documunt Types\n" " *Wages\n" " *Units\n" " *Own identity\n" msgstr "" " *Dokument Voreinstellungen\n" " *Steuern\n" " *Dokumenttypen\n" " *Stundensätze\n" " *Einheiten\n" " *die eigene Identität\n" #. type: Plain text #: kraft.adoc:63 #, fuzzy msgid "" "Each of the tabs allows to enter useful values for the specific use case." msgstr "" "Jeder der Tabs erlaub es, sinnvolle Werte für die spezielle Anforderung " "einzugeben." #. type: Title === #: kraft.adoc:64 #, no-wrap msgid "Document Types" msgstr "Dokumenttypen" #. type: Plain text #: kraft.adoc:67 msgid "At the first use you find a list of different document types, such as:" msgstr "Beim ersten Start finden sich folgende Dokumenttypen:" #. type: Plain text #: kraft.adoc:69 msgid "Acceptance of order" msgstr "Auftragsbestätigung" #. type: Plain text #: kraft.adoc:70 msgid "Delivery receipt" msgstr "Lieferschein" #. type: Plain text #: kraft.adoc:71 msgid "Invoice" msgstr "Rechnung" #. type: Plain text #: kraft.adoc:72 msgid "Offer" msgstr "Angebot" #. type: Plain text #: kraft.adoc:74 #, fuzzy msgid "image:documentype.png[Document type,float=\"right\"]" msgstr "image:documentype.png[Dokumenttyp,float=\"right\"]" #. type: Plain text #: kraft.adoc:77 msgid "" "Translate this types to your own language. You can also add new ones and " "remove document types you wont use." msgstr "" "Übersetze diese Typen in die eigene Sprache. Du kannst ebenso neue " "hinzufügen und Einträge entfernen, die Du nicht benutzen wirst." #. type: Title ==== #: kraft.adoc:78 #, no-wrap msgid "Numbercycles" msgstr "Nummernkreise" #. type: Plain text #: kraft.adoc:82 #, fuzzy msgid "" "image:numbercycles.png[Numbercycles,float=\"right\"] Each document has to " "have an unique identifier that identifies the document. There must not be " "two documents in Kraft with the same identifier." msgstr "" "image:numbercycles.png[Numbercycles,float=\"right\"] Jedes Dokument muss " "eine eindeutige Dokumentnummer haben, das es identifiziert. Es dürfen keine " "zwei Dokumente die selbe Dokumentnummer haben." #. type: Plain text #: kraft.adoc:85 #, fuzzy msgid "" "The format of the identifier is configuratable in Kraft. For that, Kraft has " "a concept of so called number cycles. Number cycles are used to define the " "form of the *document number* which is printed on every document." msgstr "" "Das Format der Dokumentnummer ist einstellbar in Kraft. Dazu hat Kraft die " "sogenannten Nummernkreise. Mit ihnen wird das Format der Dokumentnummern " "definiert, die auf jedes Dokument gedruckt werden." #. type: Plain text #: kraft.adoc:89 #, fuzzy msgid "" "All documents of a certain type have identifiers taken out of one number " "cycle. Each document type has a number cycle assigned. Different document " "types can use the same number cycle to generate ids from. That way, for " "example the document types Invoice and Final Invoice can use numbers from " "the same number cycle, even thought they are different document types in " "Kraft. Number cycles are identified by their name. User can create new " "number cycles and edit them clicking on the button btn:[Edit Number " "Cycles...]" msgstr "" "Alle Dokumente eines bestimmten Dokument-Typs entnehmen die Nummern einem " "Nummernkreis. Jeder Dokument-Typ hat einen Nummernkreis zugewiesen. " "Verschiedene Dokument-Typen können den selben Nummernkreis haben, von dem " "Dokumentnummern erzeugt werden. Auf diese Weise können zum Beispiel die " "Dokumenttypen Rechnung und Teilrechnung Nummern vom selben Nummernkreis " "generieren, obwohl Kraft sie als verschiedene Dokumenttypen kennt. " "Nummernkreise werden anhand ihres Namen identifiziert. Benutzer können neue " "Nummernkreise anlegen und sie durch einen klick auf btn:[Nummernkreise " "bearbeiten...] bearbeiten." #. type: Plain text #: kraft.adoc:91 #, fuzzy msgid "" "The format of the document numbers are defined by a template that can " "contain normal, fixed characters and also some variables that are replaced " "by the respective values when the document is created." msgstr "" "Das Format der Nummernkreise wird durch eine Vorlage defininiert, die aus " "festen Zeichen wie auch einigen Variablen bestehen, die durch Werte ersetzt " "werden, wenn das Dokument erzeugt wird." #. type: Plain text #: kraft.adoc:94 #, fuzzy msgid "" "Each identifier needs to be unique, and thus has to contain a counter. Kraft " "supports two types of counter: One (variable `%i`) is incremented globally " "for every new document. The other (variable `%n`) is reset every day and " "starts at 1 again on every new day. In addition to the counter, more " "information can be added to the template form an useful number. Examples are " "a constant text or parts of the date." msgstr "" "Kraft unterstützt Zähler, die automatisch für jedes neue Dokument eines " "bestimmten Dokumenttypes erhöht werden. Zusätzlich zu dem Zähler können " "weitere Informationen hinzugefügt werden um eine nützliche Dokumentnummer zu " "erzeugen, so wie konstanten Text oder Teile des Datums." #. type: Plain text #: kraft.adoc:96 #, fuzzy msgid "" "The default numbercycle delivered with Kraft contains the year, the month " "and a serialnumber. That way you can compare offers or orders from last year " "with this year or the month April of last year with the month April of this " "year and get on this way an impression from the results of your business." msgstr "" "Der Standard-Nummernkreis, mit dem Kraft ausgeliefert wird, besteht aus dem " "Jahr, dem Monat und einer Seriennummer. Auf diese Art können die Dokumente " "anhand des Jahres verglichen werden, um leicht einen Eindruck über die " "Resultate des Unternehmens zu bekommen." #. type: Plain text #: kraft.adoc:98 msgid "See the following table for available variables which can be used:" msgstr "Folgende Variablen stehen zur Verfügung:" #. type: Table #: kraft.adoc:115 #, fuzzy, no-wrap msgid "" "| `%y` or `%yyyy` | the year of the document date.\n" "| `%yy` | the year of the document (two digits).\n" "| `%w` | the week number of the document date.\n" "| `%ww` | the week number of the document date with leading zero.\n" "| `%d` | the day number of the document date.\n" "| `%dd` | the day number of the document date with leading zero.\n" "| `%m` or `%M` | the month number of the document date.\n" "| `%MM` | the month number with leading zero.\n" "| `%c` | the customer id from kaddressbook\n" "| `%type` | the localised doc type (offer, invoice etc.)\n" "| `%uid` | the contact id of the client.\n" "| `%i` .. `%iiiiii`| the unique counter\n" "| `%n` .. `%nnnnnn`| the unique day counter (combine with date)\n" "\n" msgstr "" "| `%y` or `%yyyy` | das Jahr im Datum des Dokuments.\n" "| `%yy` | das Jahr im Datum des Dokuments (zwei Stellen).\n" "| `%w` | die Wochennummer im Datum des Dokuments.\n" "| `%ww` | die Wochennummer im Datum des Dokuments mit führender Null .\n" "| `%d` | der Tag im Datum des Dokuments.\n" "| `%dd` | der Tag im Datum des Dokuments mit führender Null.\n" "| `%m` or `%M` | der Monat als Nummer im Datum des Dokuments.\n" "| `%MM` | der Monat als Nummer im Datum des Dokuments mit führender Null.\n" "| `%c` | die Kund*innen-ID aus kaddressbook\n" "| `%i` | the unique counter *(mandatory)*\n" "| `%type` | der Dokumententyp (Angebot, Rechnung usw.)\n" "| `%uid` | Die Kontakt-ID der Kundin / des Kunden.\n" "| `%i` .. `%iiiiii`| ein eindeutiger Zähler, der mit jedem Dokument um eins erhöht wird.\n" "| `%n` .. `%nnnnnn`| eindeutiger Tageszähler, der jeden Tag auf eins zurückgesetzt wird (Kombination mit dem Datum)\n" "\n" #. type: Plain text #: kraft.adoc:118 #, fuzzy msgid "" "A number cycle template needs to contain either `%i` or `%n`, if not, `%i` " "is appended automatically." msgstr "" "Die Nummernkreisvorlage muss entweder `%i` oder `%n` enthalten. Wenn nicht, " "wird `%i` automatisch angehängt." #. type: Plain text #: kraft.adoc:120 #, fuzzy msgid "" "Both `%i` and `%n` are numeric values. They can also be padded with with " "leading zeros. The length is defined by the number of i's or n's put into " "the template. For example, if a daily counter with length of three and " "leading zeros is desired, `%nnn` has to be put into the template. This works " "up to a length of six characters." msgstr "" "Sowohl `%i`als auch `%n`sind Zahlen. Sie können auch mit führenden Nullen " "aufgefüllt werden. Die Länge wird durch die Anzahl der i's oder n's in der " "Vorlage definiert. Zum Beispiel müssen in der Vorlage drei n angegeben " "werden (`%nnn`), wenn drei führende Nullen gewünscht sind. Dies funktioniert " "mit bis zu sechs führenden Nullen." #. type: delimited block _ #: kraft.adoc:123 #, fuzzy msgid "" "NOTE: The \"design\" of the numbercycles and document numbers is very " "important. With the flexible system of templating Kraft can not prevent " "invalid number cycles. It is in the responsibility of the user." msgstr "" "NOTE: Das \"Design\" der Nummernkreise und der Dokument Nummern ist sehr " "wichtig. Mit dem flexiblen System mit Vorlagen in Kraft können ungültige " "Nummernkreise nicht vermieden werden. Es liegt in der Verantwortung der " "Nutzenden." #. type: Title ==== #: kraft.adoc:125 #, fuzzy, no-wrap msgid "PDF Template" msgstr "Textvorlagen" #. type: Plain text #: kraft.adoc:128 #, fuzzy msgid "" "In the entry field Template File: the user can select a custom template for " "this specific document type." msgstr "" "Im Eingabefeld btn:[Nummernkreise bearbeiten] können nutzerdefinierte " "Vorlagen für den Dokument Typ festgelegt werden." #. type: Plain text #: kraft.adoc:130 #, fuzzy msgid "" "If the file extension of the template file is `.trml`, the ReportLab based " "document converter is used. If the file extension is `.gtmpl`, Kraft " "automatically uses the Weasyprint based converter." msgstr "" "Wenn die Dateinamenerweiterung der Vorlagendatei `.trml` ist, wird der " "ReportLab basierte Dokument Konverter benutzt. Wenn die Erweiterung `.gtmpl` " "ist, wird automatisch der Weasyprint Konverter verwendet." #. type: delimited block _ #: kraft.adoc:133 #, fuzzy msgid "" "NOTE: The ReportLab system for PDF creation is deprecated in Kraft. Please, " "for new templates, always use Grantlee- and Weasyprint based templates." msgstr "" "NOTE: Das ReportLab basierte Konvertierungssystem für PDF ist abgekündigt in " "Kraft. Für neue Vorlagen sollte immer das Grantlee- und Weasyprint basierte " "System verwendet werden." #. type: Title ==== #: kraft.adoc:135 #, fuzzy, no-wrap msgid "PDF Postprocessing" msgstr "PDF Nachbearbeitung" #. type: Plain text #: kraft.adoc:138 #, fuzzy msgid "" "After Kraft has created the PDF document it is possible to merge the created " "PDF with static, customized PDFs created by the user. With that, it is easy " "to add a custom stationery with a logo to the resulting PDF (\"Watermark\")." msgstr "" "Nachdem das PDF Dokument in Kraft erzeugt wurde, können statische, " "benutzerdefinierte PDF Dateien mit dem Dokument verbunden werden. Damit ist " "es leicht, eigenes Briefpapier with einem Logo zu verwenden im endgültigen " "PDF (Wasserzeichen)." #. type: Plain text #: kraft.adoc:140 #, fuzzy msgid "" "The static PDFs should have the same page size as the generated documents. " "Keep in mind to use optimized images for logos etc. to not blow up the size " "of the result document." msgstr "" "Das statische PDF sollte die gleiche Seitengröße wie das generierte Dokument " "haben. Es sollten optimierte Bilder für Logos verwendet werden, um die " "resultierenden PDFs nicht aufzublähen." #. type: Plain text #: kraft.adoc:142 #, fuzzy msgid "image:pdfpostproc.png[PDF Postprocessing,float?\"right\"]" msgstr "image:pdfpostproc.png[PDF Nachbearbeitung,float?\"right\"]" #. type: Plain text #: kraft.adoc:144 #, fuzzy msgid "The watermark options are:" msgstr "Die Wasserzeichen-Optionen sind:" #. type: Plain text #: kraft.adoc:146 #, fuzzy, no-wrap msgid "*No Watermark*: No watermark is created\n" msgstr "*Kein Wasserzecihen*: Kein Wasserzeichen wird angezeigt" #. type: Plain text #: kraft.adoc:147 #, fuzzy, no-wrap msgid "*On first page*: The first page of the watermark.pdf is merged with the first page of the result document\n" msgstr "*Auf der ersten Seite*: Die erste Seite des wasserzeichen.pdf wird verwendet und der ersten Seite des generierten Dokumentes hinterlegt" #. type: Plain text #: kraft.adoc:148 #, fuzzy, no-wrap msgid "*Watermark on all pages*: Merges the first page of the watermark PDF to all pages of the result document\n" msgstr "*Wasserzeichen auf allen Seiten*: Verbindet die erste Seite des Wasserzeichen PDFs mit allen Seiten des generierten Dokumentes" #. type: Plain text #: kraft.adoc:149 #, fuzzy, no-wrap msgid "*alternating*: For this, the watermark PDF needs to have three pages. The first page is merged to the first page of the result document, the second and third page are alternated merge to subsequent pages.\n" msgstr "*abwechselnd*: Hierfür muss das Wasserzeichen-PDF drei Seiten haben. Die erste Seite wird mit der ersten Seite des generierten Dokumentes verbunden, die zweite und dritte Seite werden abwechselnd mit den folgenden Seiten des generierten Dokumentes verbunden." #. type: Plain text #: kraft.adoc:150 #, fuzzy, no-wrap msgid "*different first and last page*: the PDF needs to have three pages. The first page is merged to the first page of the result document, the third page to the last, and the second to all page between first and last page.\n" msgstr "*Unterschiedliche erste und letzte Seite*: Das Wasserzeichen PDF muss drei Seiten haben. Die erste Seite wird mit der ersten Seite des generierten Dokumentes verbunden, die dritte Seite mit der letzten und die zweite Seite des Wasserzeichen PDFs mit den Seiten zwischen erster und letzter Seite des generierten PDFs." #. type: Plain text #: kraft.adoc:152 msgid "" "If there is another static PDF document put into the entry field \"Append " "PDF:\", it is appended to the generated PDF. With that, Kraft will " "automatically add for example terms and conditions documents to the final " "document." msgstr "" #. type: Title === #: kraft.adoc:153 #, no-wrap msgid "Taxes" msgstr "Steuern" #. type: Plain text #: kraft.adoc:157 #, fuzzy msgid "" "image:taxes.png[Taxes,float=\"right\"] In many countries there are two kinds " "of VAT-taxes for sold products." msgstr "" "In vielen Ländern gibt es zwei Arten von Mehrwertsteuer für veräusserte " "Produkte." #. type: Plain text #: kraft.adoc:160 msgid "A high level and a low level." msgstr "Ein hoher und ein niedriger Steuersatz." #. type: Plain text #: kraft.adoc:163 msgid "" "Fill here the appropriate amounts in for the high level and the low level. " "If the tax-level is changing, then you add here the start date with the new " "tax-levels." msgstr "" #. type: Title === #: kraft.adoc:164 #, no-wrap msgid "Wages" msgstr "" #. type: Plain text #: kraft.adoc:169 msgid "" "image:wages.png[Wages,float=\"right\"] A list of wage costs is maintained in " "Kraft. The items are used in templates and during calculation." msgstr "" #. type: Plain text #: kraft.adoc:172 msgid "" "All data can be edited, customized and new items can be added in the Kraft " "Configuration Dialog reachable through the Settings menu." msgstr "" #. type: Plain text #: kraft.adoc:176 msgid "" "Remember that these units are later used in the documents, it is therefor " "important that you translate them to your own language and to fill in the " "correct prices." msgstr "" #. type: Title === #: kraft.adoc:177 #, no-wrap msgid "Units of measurement" msgstr "" #. type: Plain text #: kraft.adoc:182 msgid "" "image:unity.png[Units of measurement,float=\"right\"] A list of units of " "measurement is maintained in Kraft. In Kraft Configuration Dialog reachable " "through the Settings menu can you edit and customize items already in the " "list, and also can you add new items to the list." msgstr "" #. type: Plain text #: kraft.adoc:185 msgid "" "Remember that these units are later used in the documents, it is therefor " "important that you translate them to your own language." msgstr "" #. type: Title === #: kraft.adoc:186 #, no-wrap msgid "Own identity" msgstr "" #. type: Plain text #: kraft.adoc:190 msgid "" "Check here if the information that you have given during the initial setup " "is correct for the use in the documents." msgstr "" #. type: delimited block _ #: kraft.adoc:195 msgid "" "WARNING: If you made the choice to use the information from KaddressBook " "then is the information from a later manual entry ignored." msgstr "" #. type: Plain text #: kraft.adoc:199 msgid "" "After we have made some corrections to the configuration, we go back to the " "main window.Here we see three tabs:" msgstr "" #. type: Plain text #: kraft.adoc:201 msgid "Documents" msgstr "" #. type: Plain text #: kraft.adoc:202 msgid "Timeline" msgstr "" #. type: Title == #: kraft.adoc:203 kraft.adoc:205 #, no-wrap msgid "Catalogs" msgstr "" #. type: Plain text #: kraft.adoc:208 msgid "" "Kraft supports so called Catalogs in which templates for document items are " "kept. With the catalogs creating documents can be significantly accellerated " "in the day to day business. When creating new documents, the items templates " "from the catalogs can easily selected and moved over to the document." msgstr "" #. type: Plain text #: kraft.adoc:210 msgid "" "Since templates are organized in chapters entire documents can be prepared " "in different chapters to be used as template documents." msgstr "" #. type: Plain text #: kraft.adoc:212 msgid "" "Of course the items in the documents can be edited after they got picked " "from a catalog." msgstr "" #. type: Plain text #: kraft.adoc:214 msgid "By default Kraft comes with two different catalogs:" msgstr "" #. type: Plain text #: kraft.adoc:216 msgid "`Material`" msgstr "" #. type: Plain text #: kraft.adoc:219 msgid "" "A catalog of material that are sold, with their purchase prices, the profit " "and the sell-price." msgstr "" #. type: Plain text #: kraft.adoc:221 msgid "and `Standard Templates`" msgstr "" #. type: Plain text #: kraft.adoc:223 msgid "A catalog of standard recipes of work like planting trees." msgstr "" #. type: Plain text #: kraft.adoc:226 msgid "" "Both catalogs can have chapters and sub-chapters for to organize your " "templates. First we are going to fill in the" msgstr "" #. type: Title === #: kraft.adoc:227 #, fuzzy, no-wrap msgid "Material Catalog" msgstr "Materialverwaltung." #. type: Plain text #: kraft.adoc:232 msgid "" "A catalog of material that are sold, with their purchase prices, the profit " "and the sell-price. First we are going to add new chapters and subchapters." msgstr "" #. type: Title ==== #: kraft.adoc:233 #, no-wrap msgid "New chapters" msgstr "" #. type: Plain text #: kraft.adoc:237 msgid "" "Select with the mouse the column-name `material`, select now in the context-" "menu [Add a sub chapter]" msgstr "" #. type: Plain text #: kraft.adoc:239 msgid "and add an extra chapter like `Trees`" msgstr "" #. type: Title ==== #: kraft.adoc:240 #, no-wrap msgid "New sub chapters" msgstr "" #. type: Plain text #: kraft.adoc:248 msgid "" "We are going to ad sub chapters in the map `Trees`. Select with the mouse " "the name of the chapter where you like to add a subchapter, select now in " "the context-menu [Add a sub chapter] and ad an extra subchapters like `Loaf " "trees` and `needle trees`. After adding the extra chapters and subchapters " "for dividing the material, we are going to add the material themself." msgstr "" #. type: Title ==== #: kraft.adoc:249 #, no-wrap msgid "New template" msgstr "" #. type: Plain text #: kraft.adoc:254 msgid "" "Select with the mouse the name of the sub-chapter or chapter where you like " "to add a material. Select the sub map Loaf trees and select now in the " "context-menu" msgstr "" #. type: Plain text #: kraft.adoc:257 msgid "" "Add the extra materials `coconut tree`, `apple tree` and `pine-apple tree`." msgstr "" #. type: Plain text #: kraft.adoc:259 msgid "Fill in the price that we have paid." msgstr "" #. type: Plain text #: kraft.adoc:261 msgid "Fill in the profit that we want to have on the material" msgstr "" #. type: Plain text #: kraft.adoc:263 msgid "And fill in how much is in a packet." msgstr "" #. type: Plain text #: kraft.adoc:266 msgid "" "image:catalog_material.png[Material catalog,float=\"right\"] After this we " "add also in the map 'Wood' a item for a 'support pole' for later use with " "its price." msgstr "" #. type: Plain text #: kraft.adoc:268 msgid "Now we are going to:" msgstr "" #. type: Title === #: kraft.adoc:269 #, no-wrap msgid "Standard Templates" msgstr "" #. type: Plain text #: kraft.adoc:272 msgid "This is a catalog of standard recipes of work like:" msgstr "" #. type: Plain text #: kraft.adoc:274 msgid "planting trees" msgstr "" #. type: Plain text #: kraft.adoc:275 msgid "cutting grass" msgstr "" #. type: Plain text #: kraft.adoc:276 msgid "transport costs" msgstr "" #. type: Plain text #: kraft.adoc:277 msgid "planting grass" msgstr "" #. type: Plain text #: kraft.adoc:278 msgid "sowing grass-seed" msgstr "" #. type: Plain text #: kraft.adoc:280 msgid "We add here the standard work of planting a tree." msgstr "" #. type: Plain text #: kraft.adoc:283 msgid "" "Select with the mouse the name of the chapter [Work] where you like to add " "the new template," msgstr "" #. type: Plain text #: kraft.adoc:285 msgid "select now the context-menu [New template]" msgstr "" #. type: Plain text #: kraft.adoc:287 msgid "and the extra templates `Plant tree` and `cut grass`." msgstr "" #. type: Plain text #: kraft.adoc:289 msgid "After we made the new template, a window opens with 4 tabs:" msgstr "" #. type: Title ==== #: kraft.adoc:291 kraft.adoc:297 #, no-wrap msgid "Template" msgstr "" #. type: Title ==== #: kraft.adoc:292 kraft.adoc:309 #, no-wrap msgid "Time calculation" msgstr "" #. type: Plain text #: kraft.adoc:293 msgid "Fix costs" msgstr "Fixkosten" #. type: Title ==== #: kraft.adoc:294 kraft.adoc:346 #, no-wrap msgid "Material" msgstr "Material" #. type: Plain text #: kraft.adoc:296 msgid "First we go to the tab:" msgstr "" #. type: Plain text #: kraft.adoc:301 msgid "" "We give here the name of the new standard template like `Plant tree` image:" "catalog_standard.png[Standard catalog,float=\"right\"]" msgstr "" #. type: delimited block _ #: kraft.adoc:304 msgid "WARNING: be careful, this name is later used in the invoice" msgstr "" #. type: Plain text #: kraft.adoc:308 msgid "" "we select that this is per piece and that the margin is 8% and that the full " "VAT is applicable." msgstr "" #. type: Plain text #: kraft.adoc:312 msgid "We fill here in a number of work with the time:" msgstr "" #. type: Block title #: kraft.adoc:313 #, no-wrap msgid "Spent time" msgstr "" #. type: Table #: kraft.adoc:320 #, no-wrap msgid "" "|Dig hole |32 min. |worker\n" "|Place tree |12 min. |worker\n" "|Fill hole |17 min. |worker\n" "|give water |5 min. |worker\n" msgstr "" #. type: Plain text #: kraft.adoc:324 msgid "" "The cost for worker which we have earlier filled in is now used. image:" "catalog_standard_work.png[Time calculation,float=\"right\"]" msgstr "" #. type: delimited block _ #: kraft.adoc:328 msgid "" "NOTE: in the invoice we see later only Plant tree, we will not see the parts " "dig hole,place tree,fill hole,give water" msgstr "" #. type: Plain text #: kraft.adoc:331 msgid "Now we go to the tab" msgstr "" #. type: Title ==== #: kraft.adoc:332 #, no-wrap msgid "Fixed costs" msgstr "" #. type: Plain text #: kraft.adoc:335 msgid "and fill in:" msgstr "" #. type: Block title #: kraft.adoc:336 #, no-wrap msgid "Fixed item" msgstr "" #. type: Table #: kraft.adoc:340 #, no-wrap msgid "|Transportcost |35 euro |1 pcs.\n" msgstr "" #. type: Plain text #: kraft.adoc:343 msgid "image:catalog_standard_fixed_cost.png[Fixed cost,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:345 msgid "After this we go to the tab:" msgstr "" #. type: Plain text #: kraft.adoc:350 msgid "" "Here we select btn:[next], after which the window [Add Material to " "Calculation] opens for a selection of material. We navigate to the map " "'wood' where we select the 'support pole'." msgstr "" #. type: Block title #: kraft.adoc:351 #, no-wrap msgid "Used materials" msgstr "" #. type: Table #: kraft.adoc:355 #, no-wrap msgid "|1 |support pole |3,5 euro\n" msgstr "" #. type: Plain text #: kraft.adoc:358 msgid "image:catalog_standard_material.png[Material,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:360 msgid "We go now back to the first tab template" msgstr "" #. type: Plain text #: kraft.adoc:363 msgid "" "On the first tab [template], we can now see the overall cost per one unit" msgstr "" #. type: Plain text #: kraft.adoc:366 msgid "" "Click on [OK] for saving the result or on [cancel] for discarding the result." msgstr "" #. type: Plain text #: kraft.adoc:368 msgid "We make a second template `cut grass`" msgstr "" #. type: Plain text #: kraft.adoc:371 msgid "" "we fill in `cut grass`, as unit we choose sm (square meter), on the second " "tab we fill in that we need 3 min per square meter." msgstr "" #. type: Plain text #: kraft.adoc:374 msgid "" "Click on [OK] for saving the result or on [Cancel] for discarding the result." msgstr "" #. type: Plain text #: kraft.adoc:376 msgid "'''" msgstr "" #. type: Title === #: kraft.adoc:377 #, no-wrap msgid "Header- and Footer Text Templates" msgstr "" #. type: Plain text #: kraft.adoc:380 msgid "" "Kraft supports text templates also for the header- and footer-text of " "documents. Each document type has it's own set of text templates. To access " "them, open a document of a certain document type in edit mode and use the " "btn:[show templates] to make the templates visible. In both the header- and " "footer-section the stored templates become visible." msgstr "" #. type: Plain text #: kraft.adoc:382 msgid "" "Directly under the navigation pane on the right side of the window is a list " "of the names of the available templates. Clicking on one of the names in the " "list displays the text in the pane below." msgstr "" #. type: Plain text #: kraft.adoc:384 msgid "" "Underneath there are buttons located with the following functions from left " "to right:" msgstr "" #. type: Plain text #: kraft.adoc:386 msgid "" "Add the template to the document: This button replaces the text of the " "document with the selected template." msgstr "" #. type: Plain text #: kraft.adoc:387 msgid "" "Insert the template to the document: The selected template is inserted to " "the current place of the cursor in the document." msgstr "" #. type: Plain text #: kraft.adoc:388 msgid "" "Create a new template: Opens a dialog to enter a complete new template for " "the current doc type." msgstr "" #. type: Plain text #: kraft.adoc:389 msgid "" "Edit the current template: Opens the dialog to edit the currently selected " "template." msgstr "" #. type: Plain text #: kraft.adoc:390 msgid "" "Delete the current template: Removes the template permanently from the list " "of available templates." msgstr "" #. type: Plain text #: kraft.adoc:392 msgid "" "Templates with the name _Standard_ are the default templates for the " "document type. They are inserted automatically if a document of this type is " "created." msgstr "" #. type: Title ==== #: kraft.adoc:394 #, no-wrap msgid "Macros" msgstr "" #. type: Plain text #: kraft.adoc:397 msgid "" "Both the header- and footer-templates can contain so called macros which are " "replaced with calculated values once the document is rendered to the final " "output format." msgstr "" #. type: Plain text #: kraft.adoc:399 msgid "The following list of macros are supported:" msgstr "" #. type: Plain text #: kraft.adoc:401 msgid "" "`DATE_ADD_DAYS()`: Returns the date of the of document plus the " "number of days specified as parameter to the macro." msgstr "" #. type: Plain text #: kraft.adoc:402 msgid "" "`ITEM_COUNT_WITH_TAG()`: Returns the amount of items tagged with the " "tag." msgstr "" #. type: Plain text #: kraft.adoc:403 msgid "" "`NETTO_SUM_PER_TAG()`: Returns the netto sum of all items that are " "tagged with the named tag." msgstr "" #. type: Plain text #: kraft.adoc:404 msgid "" "`BRUTTO_SUM_PER_TAG()`: Returns the brutto sum of all items that are " "tagged with the named tag." msgstr "" #. type: Plain text #: kraft.adoc:405 msgid "" "`VAT_SUM_PER_TAG()`: Returns the pure tax of all items that are tagged " "with the named tag." msgstr "" #. type: Plain text #: kraft.adoc:406 msgid "" "`IF_ANY_HAS_TAG()` and `END_HAS_TAG`: Includes the text between the two " "macros only if there is at least one item that is tagged with the tag." msgstr "" #. type: Plain text #: kraft.adoc:408 msgid "" "As an example, this footer text template can be used to automatically " "generate useful texts:" msgstr "" #. type: delimited block - #: kraft.adoc:411 #, no-wrap msgid "Please pay this invoice until three weeks after the date of the document, which is the DATE_ADD_DAYS(21).\n" msgstr "" #. type: delimited block - #: kraft.adoc:416 #, no-wrap msgid "" "IF_ANY_HAS_TAG(Material)\n" "This invoice lists material in ITEM_COUNT_WITH_TAG(Material) items. The net value is NETTO_SUM_PER_TAG(Material),\n" "plus VAT_SUM_PER_TAG(Material) = BRUTTO_SUM_PER_TAG(Material).\n" "END_HAS_TAG\n" msgstr "" #. type: Plain text #: kraft.adoc:419 msgid "We are now ready for the first invoice." msgstr "" #. type: Title == #: kraft.adoc:421 #, no-wrap msgid "Creating Documents" msgstr "" #. type: Title === #: kraft.adoc:423 #, no-wrap msgid "The first Invoice" msgstr "" #. type: Plain text #: kraft.adoc:426 msgid "Open the tab btn:[documents]" msgstr "" #. type: Plain text #: kraft.adoc:428 kraft.adoc:533 msgid "Click on btn:[create document]" msgstr "" #. type: Plain text #: kraft.adoc:430 msgid "The window document [creation wizard opens]." msgstr "" #. type: Plain text #: kraft.adoc:432 msgid "Select in document type `invoice`." msgstr "" #. type: Plain text #: kraft.adoc:435 msgid "" "Fill in on the whiteboard content a short text about what the invoice is, " "like: `cut grass and planted tree for mister Jonson`" msgstr "" #. type: Plain text #: kraft.adoc:437 kraft.adoc:542 msgid "Click on btn:[next]" msgstr "" #. type: Plain text #: kraft.adoc:439 kraft.adoc:544 msgid "Select on the new window the name and address from the client." msgstr "" #. type: Plain text #: kraft.adoc:442 kraft.adoc:547 msgid "" "(if the name and address is not there, click then on btn:[new contact] or on " "btn:[edit contact] if you want to edit the contact)" msgstr "" #. type: Plain text #: kraft.adoc:444 kraft.adoc:549 msgid "Click on btn:[OK]." msgstr "" #. type: Plain text #: kraft.adoc:446 msgid "Now opens the window document [items]." msgstr "" #. type: Plain text #: kraft.adoc:448 msgid "this window has 2 tabs and the 3 buttons on the top:" msgstr "" #. type: Plain text #: kraft.adoc:450 kraft.adoc:555 msgid "btn:[Add item...]," msgstr "" #. type: Plain text #: kraft.adoc:451 kraft.adoc:556 msgid "btn:[Add discount item]," msgstr "" #. type: Plain text #: kraft.adoc:452 kraft.adoc:557 msgid "btn:[Show templates]." msgstr "" #. type: Plain text #: kraft.adoc:456 msgid "" "In the left tab you can see all the items that we want to place on the " "invoice, on the right tab we see the text from the header, the total price " "and the footer." msgstr "" #. type: Plain text #: kraft.adoc:460 msgid "" "If you click on the text of the header or the footer on the right side then " "the window changes in such a way that you can edit the header or the footer." msgstr "" #. type: Plain text #: kraft.adoc:463 msgid "" "Adapt the header and the footer to your situation, on the footer you can " "place a text: `We make your garden-dream come to reality.`." msgstr "" #. type: Plain text #: kraft.adoc:465 kraft.adoc:559 msgid "Click on the button btn:[Show templates]." msgstr "" #. type: Plain text #: kraft.adoc:469 msgid "" "The right tab changes and show now the earlier made templates, we select in " "the group Work, the subgroup Plant tree and click then on the button with " "the to the left pointing arrow on the bottom side." msgstr "" #. type: Plain text #: kraft.adoc:471 kraft.adoc:565 msgid "A new window [Create Item from Template] opens." msgstr "" #. type: Plain text #: kraft.adoc:474 msgid "" "Because we have planted 2 trees, we go to the field [insert] and change this " "to 2 pcs." msgstr "" #. type: Plain text #: kraft.adoc:477 msgid "" "Click on btn:[OK] for saving the result or on btn:[cancel] for discarding " "the result." msgstr "" #. type: Plain text #: kraft.adoc:479 kraft.adoc:573 kraft.adoc:584 msgid "The window close and we go back to the main window." msgstr "" #. type: Plain text #: kraft.adoc:483 msgid "" "We click again on btn:[Show templates] and select this time `cut grass`, we " "click again on the button with the arrow, in the opened window we select " "that the grass-field was 24 square meter." msgstr "" #. type: Plain text #: kraft.adoc:486 kraft.adoc:571 kraft.adoc:604 kraft.adoc:640 msgid "" "Click on btn:[OK] for saving the result or on btn:[Cancel] for discarding " "the result." msgstr "" #. type: Plain text #: kraft.adoc:488 msgid "" "We add now manually an item by clicking on the button btn:[Add item…] and " "the window [create new item] opens." msgstr "" #. type: Plain text #: kraft.adoc:492 msgid "" "Because we have delivered a special tree, we fill here in the name of the " "special tree `liguster`, at the field insert we fill in the number of the " "special trees that we have delivered and the price of them." msgstr "" #. type: delimited block _ #: kraft.adoc:498 msgid "" "WARNING: Remind that in the catalog we can add a profit on the price of the " "material, in the invoice and in the offer we can not add a profit on the " "price of the material." msgstr "" #. type: Plain text #: kraft.adoc:501 msgid "We have now an invoice with 3 items." msgstr "" #. type: Plain text #: kraft.adoc:504 msgid "" "Click on btn:[OK] for saving the invoice or on btn:[Cancel] for discarding " "the invoice." msgstr "" #. type: Plain text #: kraft.adoc:506 msgid "We click on btn:[OK] and save the result." msgstr "" #. type: Plain text #: kraft.adoc:508 msgid "Your first invoice is now ready for sending." msgstr "" #. type: Plain text #: kraft.adoc:511 msgid "" "In the window documents we see our first invoice, notice that this document " "has a document number which we can see on the left side." msgstr "" #. type: Plain text #: kraft.adoc:514 msgid "" "On top of the window with all the invoices we see the button [Print " "Document], on which we click." msgstr "" #. type: Plain text #: kraft.adoc:517 msgid "" "From the invoice will now a PDF be made which we can print on paper or send " "by email to the client." msgstr "" #. type: Plain text #: kraft.adoc:519 msgid "After this we are going to create a offer for some work in a garden." msgstr "" #. type: Title === #: kraft.adoc:521 #, no-wrap msgid "Creating an Offer" msgstr "" #. type: Plain text #: kraft.adoc:524 msgid "" "The client has asked to plant a tree, we will offer 3 different trees which " "we can plant." msgstr "" #. type: Plain text #: kraft.adoc:527 msgid "" "Beside this, we have seen that there is a lifeless three, which we will " "offer to remove as extra work. image:create_new_doc.png[Numbercycles," "float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:529 msgid "" "For the total price we do not want to show the price of the removal of the " "lifeless tree and we want for the total price only to show the price of one " "tree and not three." msgstr "" #. type: Plain text #: kraft.adoc:531 msgid "Open again the tab btn:[documents]." msgstr "" #. type: Plain text #: kraft.adoc:535 msgid "The window _Document Creation Wizard_ opens." msgstr "" #. type: Plain text #: kraft.adoc:537 msgid "select in btn:[document type] > btn:[Offer]." msgstr "" #. type: Plain text #: kraft.adoc:540 msgid "" "Fill in on the whiteboard content a short text about what the offer is, " "like: `plant one tree and removal of lifeless tree`" msgstr "" #. type: Plain text #: kraft.adoc:551 msgid "Now the window [edit document] opens." msgstr "" #. type: Plain text #: kraft.adoc:553 msgid "This window has 2 tabs and the 3 buttons on the top:" msgstr "" #. type: Plain text #: kraft.adoc:563 msgid "" "The right tab changes and show now the earlier made templates, we select in " "the group `Work`, the subgroup `Plant tree` and click then on the button " "with the to the left pointing arrow on the bottom side." msgstr "" #. type: Plain text #: kraft.adoc:568 msgid "" "Because we want to plant 1 tree, we go to the field [insert] and keep this " "on 1 pcs." msgstr "" #. type: Plain text #: kraft.adoc:576 msgid "" "We click on the button btn:[Show templates] and this time we select in " "catalog Material" msgstr "" #. type: Plain text #: kraft.adoc:580 msgid "" "The material-catalog opens, and we can select in the chapter `trees` the " "subchapter `loaf trees` in which we select the `apple tree` which we made " "earlier." msgstr "" #. type: Plain text #: kraft.adoc:582 msgid "" "Click on we btn:[OK] for saving the result or on btn:[cancel] for discarding " "the result." msgstr "" #. type: Plain text #: kraft.adoc:586 msgid "We add now manually an item by clicking on the button `Add item…`." msgstr "" #. type: Plain text #: kraft.adoc:588 msgid "the window [create new item] opens." msgstr "" #. type: Plain text #: kraft.adoc:590 msgid "" "We want that the client can make a choice from an apple, a pear tree and the " "liguster." msgstr "" #. type: Plain text #: kraft.adoc:592 msgid "Therefor we are going to add also a pear tree manually." msgstr "" #. type: Plain text #: kraft.adoc:594 msgid "" "We click on the button btn:[Add item…] and the window [create new item] " "opens." msgstr "" #. type: Plain text #: kraft.adoc:598 msgid "" "We fill here in the name of the tree `Pear tree`, at the field insert we " "fill in the number of the special trees that we have delivered and the price " "of them." msgstr "" #. type: Plain text #: kraft.adoc:601 msgid "" "We want add this to the material catalog for future use, therefor we select " "also [select this item as template for future documents] and we select in " "[save in chapter]`trees`." msgstr "" #. type: Plain text #: kraft.adoc:606 msgid "We does this again but then for the liguster." msgstr "" #. type: Plain text #: kraft.adoc:608 msgid "We have now 3 items with trees in the offer." msgstr "" #. type: Plain text #: kraft.adoc:610 msgid "" "As last item we add an item with `remove tree` with 0,5 hour for 32 euro." msgstr "" #. type: Plain text #: kraft.adoc:612 msgid "On the left side of an item we can see 2 buttons:" msgstr "" #. type: Plain text #: kraft.adoc:614 msgid "a button with a flag and a button with what looks like a page." msgstr "" #. type: Plain text #: kraft.adoc:617 msgid "" "We select the upper button with the page after which opens a context-menu " "with the items:" msgstr "" #. type: Plain text #: kraft.adoc:619 msgid "image:context1.png[Context menu,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:629 #, no-wrap msgid "" " [Item kind]->[Normal]\n" " [Item kind]>[Alternative]\n" " [Item kind]>[On demand]\n" " [Tax]\n" " [Move up]\n" " [Move down]\n" " [Lock item]\n" " [Unlock item]\n" " [Delete item]\n" msgstr "" #. type: Plain text #: kraft.adoc:632 msgid "" "We choose here [Item kind] and change for `pear tree` from [normal] to " "[alternative]." msgstr "" #. type: Plain text #: kraft.adoc:635 msgid "" "We do this also for [liguster] and for [remove tree] we change this from " "[normal] to [on demand]." msgstr "" #. type: Plain text #: kraft.adoc:637 msgid "image:context2.png[Context menu,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:643 msgid "" "We want to see the result and therefor we click on the button [show " "document]." msgstr "" #. type: Plain text #: kraft.adoc:649 msgid "" "We see now that the prize of the pear tree, the liguster and the removal of " "the tree is not used for the total prize. When we are happy with the result, " "we can click on the button btn:[close] after which we click on the button " "btn:[Print Document] for making a PDF what we can print out or send to the " "client." msgstr "" #. type: Plain text #: kraft.adoc:652 msgid "" "After your first invoice is now your first offer now also ready for sending." msgstr "" #. type: Title === #: kraft.adoc:654 #, fuzzy, no-wrap msgid "Creating an Acceptance of Order" msgstr "Auftragsbestätigung" #. type: Plain text #: kraft.adoc:657 msgid "" "The document type \"Acceptance of Order\" is sent subsequently to an offer." msgstr "" #. type: Plain text #: kraft.adoc:659 msgid "image:acceptance_o_o_context.png[Numbercycles,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:662 msgid "" "When a client has made a request, we will send an offer in wich we describe " "which items we will deliver. Hopefully the client will give an order for " "the work." msgstr "" #. type: Plain text #: kraft.adoc:666 msgid "" "It is a good practice to respond on the order with an \"Acceptance of " "order\" in which we describe all the items we will deliver. We can make the " "\"Acceptance of order\" on the same way as we made the invoice or the offer " "by selecting each item and correcting the number of delivery. This takes " "time and we can make errors by forgetting items or filling an incorrect " "number." msgstr "" #. type: Plain text #: kraft.adoc:668 msgid "" "It can be done quicker by selecting the offer in the list and selecting btn:" "[Create Followup Document] from either the context menu or the main menu." msgstr "" #. type: Plain text #: kraft.adoc:670 msgid "We have now in documenttype the choice from:" msgstr "" #. type: Plain text #: kraft.adoc:676 #, no-wrap msgid "" " [Acceptance of order]\n" " [Invoice]\n" " [Partial Invoice]\n" " [final Invoice]\n" " [Progress Payment Invoice]\n" msgstr "" #. type: Plain text #: kraft.adoc:678 msgid "image:followup_1.png[Folloup document,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:682 msgid "" "We select here \"Acceptance of order\". We have now a copy from the offer " "as an Acceptance of order (do not forget to adapt Alternative Delivery items " "and on demand items.)" msgstr "" #. type: Plain text #: kraft.adoc:684 msgid "image:followup_2.png[Folloup document,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:688 msgid "" "You can do this also for the creation of the invoice as a followup for " "Acceptance of order. Each document type has a specific list of follow up " "documents. It is a good practice to describe on the invoice precisely what " "was delivered." msgstr "" #. type: Title == #: kraft.adoc:690 #, no-wrap msgid "Customization" msgstr "" #. type: Plain text #: kraft.adoc:694 msgid "" "Kraft can be customized in most of the graphical user interface and in " "particular in the output it generates." msgstr "" #. type: Title === #: kraft.adoc:695 #, no-wrap msgid "Output Document Customization" msgstr "" #. type: Plain text #: kraft.adoc:698 msgid "" "To create PDF output documents, the document data that was edited in the " "Kraft app is filled into a template. The template defines how the output " "document looks like, ie. by font settings, placing of elements and such." msgstr "" #. type: Plain text #: kraft.adoc:700 msgid "" "The file that is assembled from data and the template is converted to PDF " "using a special document creation script. All that is started automatically " "by Kraft if a document should be printed." msgstr "" #. type: Plain text #: kraft.adoc:702 msgid "" "Each document type in Kraft can have it's own template that is used to " "create a PDF. Which one can be set in the Settings dialog for document types." msgstr "" #. type: Title ==== #: kraft.adoc:703 #, no-wrap msgid "WeasyPrint Documents" msgstr "" #. type: Plain text #: kraft.adoc:706 msgid "" "Kraft still ships with the old ReportLab based converter, but that will be " "deprecated the future. The WeasyPrint based system is the future. It is a " "recommended to port existing templates." msgstr "" #. type: Plain text #: kraft.adoc:708 msgid "" "With https://weasyprint.org[WeasyPrint] Kraft uses a very powerful generator " "that makes it very easy to create highly customized documents with great " "quality." msgstr "" #. type: Plain text #: kraft.adoc:710 msgid "" "WeasyPrint converts a html file to PDF. It is integrating a cascading " "stylesheet (CSS) file which has a huge impact on the PDF document's look." msgstr "" #. type: Plain text #: kraft.adoc:712 msgid "" "The html- and CSS input file for WeasyPrint is built from the Kraft template " "file." msgstr "" #. type: Plain text #: kraft.adoc:714 msgid "" "To enable the use of WeasyPrint for a document type in Kraft, simply create " "a weasyprint compatible template file and save it with the extension *." "gtmpl*. Based on the file extension Kraft automatically uses WeasyPrint and " "the Grantlee templating engine for rendering." msgstr "" #. type: Plain text #: kraft.adoc:716 msgid "" "From version 0.95 on Kraft ships with an example template in the Grantlee- " "and WeasyPrint format. It can be found at `/usr/share/kraft/reports/invoice." "gtmpl` or https://github.com/dragotin/kraft/blob/master/reports/invoice." "gtmpl[online on Github]. An example CSS file `kraft.css` (https://github.com/" "dragotin/kraft/blob/master/reports/kraft.css[on Github]) is shipped as a " "good starting point for adoption." msgstr "" #. type: Title ==== #: kraft.adoc:717 #, no-wrap msgid "Template Variables" msgstr "" #. type: Plain text #: kraft.adoc:720 msgid "" "To generate the PDF, Kraft has to transfer data from the document you have " "been working on to the input file that is processed to a PDF. For that, " "Kraft uses a text template in which Kraft replaces variables with the actual " "values." msgstr "" #. type: Plain text #: kraft.adoc:722 msgid "" "For example, the tag `{{ doc.doctype }}` is replaced with the current " "document type during the generating process." msgstr "" #. type: Plain text #: kraft.adoc:724 msgid "" "The syntax is based on the Django syntax for templates described in the " "https://docs.djangoproject.com/en/3.1/topics/templates/[the docs]." msgstr "" #. type: Title ==== #: kraft.adoc:725 #, no-wrap msgid "EPC QR Code" msgstr "" #. type: Plain text #: kraft.adoc:728 msgid "" "With Weasyprint based PDF generation Kraft supports the https://en.wikipedia." "org/wiki/EPC_QR_code[EPC QR Code] which implements a European standard for " "payments by computer and mobile devices." msgstr "" #. type: Plain text #: kraft.adoc:730 msgid "" "In Germany it is also known as _Giro Code_, in Belgium as _Bancontact QR_, " "in the Netherlands as _iDEAL QR-code_ and in Spain it is also known as " "_Bizum QR-code_." msgstr "" #. type: Plain text #: kraft.adoc:732 msgid "" "In Germany it is accepted by the _Giro Code_ and in Holland it is accepted " "by the official https://www.ideal.nl/consumenten/ideal-app/[_iDEAL QR-code_] " "app." msgstr "" #. type: Plain text #: kraft.adoc:734 msgid "" "In Belgium and Holland it is accepted by the apps of many banks, and in " "Austria and Finland it is accepted by the apps of all banks." msgstr "" #. type: Plain text #: kraft.adoc:736 msgid "" "To use the EPC QR code on the invoice printout, the bank account information " "has to be added to own identity settings dialog in Kraft. The giro code is " "current only generated for documents with the document type `Rechnung`." msgstr "" #. type: Plain text #: kraft.adoc:738 msgid "" "To include the generated EPC QR Code into the PDF document, the Weasyprint " "template needs to contain a snippet like this:" msgstr "" #. type: delimited block - #: kraft.adoc:747 #, no-wrap msgid "" " {%if doc.isInvoice and epcqrcode.valid %}\n" "

    \n" " \"EPC\n" " Dieser QR Code ermöglicht einfaches, sicheres und schnelles Begleichen dieser Rechnung via GiroPay:\n" " Diesen Code mit dem Smartphone scannen und Überweisung per Banking App aufgeben.\n" "

    \n" " {% endif %}\n" msgstr "" #. type: Title == #: kraft.adoc:751 #, no-wrap msgid "Menus and Shortcuts" msgstr "" #. type: Title === #: kraft.adoc:753 #, no-wrap msgid "Main Application Menu" msgstr "" #. type: Title ==== #: kraft.adoc:756 #, no-wrap msgid "The File Menu" msgstr "" #. type: Plain text #: kraft.adoc:761 #, no-wrap msgid "" " [File]>[Quit]\n" " [Ctrl]+[Q]\n" " Quits the application.\n" msgstr "" #. type: Title ==== #: kraft.adoc:763 #, no-wrap msgid "The Document Menu" msgstr "" #. type: Plain text #: kraft.adoc:769 #, no-wrap msgid "" " [Document]>[Show Document]\n" " [Ctrl]+[R]\n" " Opens a window with the selected document for showing it.\n" msgstr "" #. type: Plain text #: kraft.adoc:773 #, no-wrap msgid "" " [Document]>[Edit Document]\n" " [Ctrl+O]\n" " Opens a window with the selected document for editing it.\n" msgstr "" #. type: Plain text #: kraft.adoc:777 #, no-wrap msgid "" " [Document]>[Open Archived document]\n" " [Ctrl]+[A]\n" " Opens an archived document.\n" msgstr "" #. type: Plain text #: kraft.adoc:780 #, no-wrap msgid "" " [Document]>[Create Document]\n" " Opens a window with a wizard for creating a new client-document.\n" msgstr "" #. type: Plain text #: kraft.adoc:784 #, no-wrap msgid "" " [Document]>[Copy Document]\n" " Makes a copy of the selected client-document to a new client-document\n" " which can belong to an other client or an other documenttype.\n" msgstr "" #. type: Plain text #: kraft.adoc:787 #, no-wrap msgid "" " [Document]>[Follow Document]\n" " Opens the selected client-document for editing.\n" msgstr "" #. type: Plain text #: kraft.adoc:791 #, no-wrap msgid "" " [Document]>[Print document]\n" " Makes a PDf from the selected client-document for to be mailed or\n" " printed.\n" msgstr "" #. type: Plain text #: kraft.adoc:795 #, no-wrap msgid "" " [Document]>[Mail document]\n" " [Ctrl]+[M]\n" " Mails a document.\n" msgstr "" #. type: Title ==== #: kraft.adoc:798 #, no-wrap msgid "The Settings menu" msgstr "" #. type: Plain text #: kraft.adoc:804 #, no-wrap msgid "" " [Settings]>[Edit Tag Templates]\n" " [Ctrl]+[E]\n" " Opens a window where you add, edit or translate the tags (like work,\n" " material, plants or discounts).\n" msgstr "" #. type: Plain text #: kraft.adoc:808 #, no-wrap msgid "" " [Settings]>[Redo initial setup]\n" " [Ctrl+R]\n" " Redoes the initial setup. After this, a restart of Kraft is required.\n" msgstr "" #. type: Plain text #: kraft.adoc:812 #, no-wrap msgid "" " [Settings]>[Showed toolbars]\n" " Here you can decide if the `main toolbar` and the toolbar `Document Actions`\n" " are shown.\n" msgstr "" #. type: Plain text #: kraft.adoc:816 #, no-wrap msgid "" " [Settings]>[Configure Kraft]\n" " [Ctrl]+[Shft]+[,]\n" " Here you can configure Kraft.\n" msgstr "" #. type: Title === #: kraft.adoc:817 #, no-wrap msgid "Document Edit Window" msgstr "" #. type: Title ==== #: kraft.adoc:820 #, no-wrap msgid "The context Menu" msgstr "" #. type: Plain text #: kraft.adoc:824 #, no-wrap msgid "" " [Context]>[Item kind]\n" " change the status from this item between\n" msgstr "" #. type: Plain text #: kraft.adoc:825 #, no-wrap msgid "Normal\n" msgstr "" #. type: Plain text #: kraft.adoc:826 #, no-wrap msgid "Alternative\n" msgstr "" #. type: Plain text #: kraft.adoc:827 #, no-wrap msgid "On demand\n" msgstr "" #. type: Plain text #: kraft.adoc:830 #, no-wrap msgid "" " [Context]>[Tax]\n" " Seems not working.\n" msgstr "" #. type: Plain text #: kraft.adoc:833 #, no-wrap msgid "" " [Context]>[Move up]\n" " Moves this item a place up in document.\n" msgstr "" #. type: Plain text #: kraft.adoc:836 #, no-wrap msgid "" " [Context]>[Move down]\n" " Moves this item a place down in document.\n" msgstr "" #. type: Plain text #: kraft.adoc:839 #, no-wrap msgid "" " [Context]>[Lock item]\n" " It is not clear what is does.\n" msgstr "" #. type: Plain text #: kraft.adoc:842 #, no-wrap msgid "" " [Context]>[Unlock item]\n" " It is not clear what is does.\n" msgstr "" #. type: Plain text #: kraft.adoc:845 #, no-wrap msgid "" " [Context]>[Delete item]\n" " Removes this item from document.\n" msgstr "" #. type: Title == #: kraft.adoc:848 #, no-wrap msgid "Advanced Topics" msgstr "Fortgeschrittene Themen" #. type: Plain text #: kraft.adoc:851 msgid "" "This chapter describes advanced topics around Kraft. Some Linux knowledge is " "required, and setups should be done by experienced Linux administrators and " "should be tested carefully." msgstr "" "Dieses Kapitel beschreibt fortgeschrittene Themen um Kraft. Dabei wird etwas " "Linux-Kenntnis vorausgesetzt, und das Aufsetzen sollte von erfahreneren " "Linux Administratoren durchgeführt und gut testet werden." #. type: Title === #: kraft.adoc:852 #, fuzzy, no-wrap msgid "Using Kraft Collaboratively" msgstr "Kraft kollaborativ verwenden" #. type: Plain text #: kraft.adoc:855 msgid "" "Kraft can be used collaborative in a distributed environment. That means " "that multiple users work on their desktops with their own Kraft instance on " "the same data." msgstr "" "Kraft kann kollaborativ in einer verteilten Umgebung verwendet werden. Das " "heisst, dass mehrere Benutzer an ihren jeweiligen Arbeitsplatzrechnern mit " "ihrer eigenen Kraft Instanz arbeiten können und dabei die selben Daten " "verwenden." #. type: Plain text #: kraft.adoc:857 msgid "" "This whole topic is a subject to change, as Kraft will evolve to use " "ownCloud as a private cloud solution to store the data." msgstr "" "Das ganze Thema ist Veränderung unterworfen, da Kraft in naher Zukunft " "ownCloud als private Cloud Lösung zur Datenspeicherung verwenden wird." #. type: Title ==== #: kraft.adoc:858 #, no-wrap msgid "Sharing Database and Document Pool" msgstr "Datenbank und Dokumentpool teilen" #. type: Plain text #: kraft.adoc:861 msgid "" "The simplest case is that two or more Kraft instances use a database " "together and access the same pool of PDF documents on the harddisk. For " "simplicity this describes only two Kraft instances." msgstr "" "Der einfachste Fall ist das zwei oder wenige mehr Kraft Instanzen die " "Datenbank gemeinsam benutzen und den Pool von PDF Dokumenten gemeinsam " "verwenden. Um es einfach zu halten werden hier zwei Instanzen beschrieben." #. type: Plain text #: kraft.adoc:863 msgid "" "A typical use case would be: Two different Linux users want to use Kraft. " "They both have their own computer but only work in the same network. For " "example this would describe a situation with one main office machine that " "runs Kraft in normal mode, plus a notebook with Kraft in read only mode to " "view documents, check catalogs and such." msgstr "" "Ein typischer Anwendungsfall könnte sein: Zwei verschiedene Linux user " "möchten Kraft verwenden. Sie haben beide ihren eigenen Computer und arbeiten " "im selben Netzwerk. Dieses Beispiel beschreibt eine Situation mit einem " "Hauptbüro das Kraft im normalen Modus betreibt, und einem Notebook mit " "Kraft, das im NurLesen Modus um Dokumente anzusehen, Kataloge zu überprüfen " "und ähnliches." #. type: Plain text #: kraft.adoc:865 msgid "For that, the following prerequisites have to be met:" msgstr "Dafür müssen die folgenden Voraussetzungen erfüllt sein:" #. type: Plain text #: kraft.adoc:867 msgid "MySQL or MariaDB is used as database backend. Sqlite is not supported." msgstr "" "Als Datenbank-Backend wird MySQL oder MariaDB verwendet. Sqlite wird nicht " "unterstützt." #. type: Plain text #: kraft.adoc:868 msgid "" "The database is accessible with a mysql user and from each machine for both " "users." msgstr "" "Die Datenbank ist mit dem MySQL Benutzer von beiden Rechnern aus erreichbar." #. type: Plain text #: kraft.adoc:869 msgid "The document store directory has to be shared." msgstr "Das Dokument-Speicher-Verzeichnis muss geteilt werden." #. type: delimited block _ #: kraft.adoc:873 msgid "" "WARNING: There is no protection against having both users editing the same " "document. Because that is dangerous and can lead to unpredictable results, " "it is recommended to run all instances of Kraft except the main one in read " "only mode. This is done by starting Kraft with the `-r` command line switch." msgstr "" "Achtung: Es gibt keinen Schutz dagegen, dass beide Benutzer das gleiche " "Dokument zur gleichen Zeit bearbeiten. Weil das gefährlich ist und zu " "unvorhersehbaren Resultaten führen kann, ist es empfohlen, Kraft in allen " "ausser der Haupt-Instanz im Nur-Lese Modus zu betreiben. Der Nur-Lese Modus " "wird mit Krafts Kommandozeilenschalter -r eingeschaltet." #. type: Plain text #: kraft.adoc:876 #, no-wrap msgid "**Sharing the Database**\n" msgstr "**Die Datenbank teilen**\n" #. type: Plain text #: kraft.adoc:878 msgid "" "The database server should be installed on the main machine or a dedicated " "device like a NAS. Networking speed influences the comfort to use obviously." msgstr "" "Der Datenbankserver sollte auf der Haupt-Maschine installiert sein, oder es " "sollte ein spezialisiertes Gerät wie ein NAS verwendet werden. Die Netzwerk " "Geschwindigkeit beeinflusst die Benutzbarkeit natürlich erheblich." #. type: Plain text #: kraft.adoc:880 msgid "Find howtos on the internet how to setup MySQL accordingly." msgstr "Howtos um MySQL aufzusetzen sind im Internet zu finden." #. type: Plain text #: kraft.adoc:882 #, no-wrap msgid "**Sharing the Document Pool Directory**\n" msgstr "**Den Dokument Pool teilen**\n" #. type: Plain text #: kraft.adoc:884 msgid "" "Kraft writes generated PDF documents into a local directory. Where that is " "can be configured in the Kraft Config file. The config file has to be " "adopted on all instances." msgstr "" "Kraft schreibt generierte PDFs in ein lokales Verzeichnis. Welches " "Verzeichnis das ist kann im Kraft Konfigfile eingerichtet werden. Das " "Konfigfile muss auf allen Instanzen angepasst werden." #. type: Plain text #: kraft.adoc:886 msgid "" "That is located in each users home directory, in the path `.config/kraftrc`. " "It has to contain the following config value:" msgstr "" "Es ist in jedem Benutzer Homeverzeichnis unter dem releativen Pfad `.config/" "kraftrc`. Es muss den folgenden Konfigurations-Wert enthalten:" #. type: delimited block - #: kraft.adoc:890 #, fuzzy, no-wrap #| msgid "PdfOutputDir=/data/space/kraftdoc/pdf" msgid "" "[reporting]\n" "PdfOutputDir=/data/space/kraftdoc/pdf\n" msgstr "PdfOutputDir=/data/space/kraftdoc/pdf" #. type: Plain text #: kraft.adoc:893 msgid "" "There are different ways how share that directory, ie. NFS or SMB storages. " "It is important that both users from both machines can list and access the " "files. The main user needs read and write access, read only users only need " "read access to the files." msgstr "" "Es gibt verschiedene Wege wie das Verzeichnis geteilt werden kann, zum " "Beispiel NFS und SMB Server. Es ist entscheidend, dass beide Benutzer von " "beiden Maschinen die Dateien auflisten und zugreifen können. Der " "Hauptbenutzer braucht Schreib- und Leserecht., Nur-Lese Bentuzer brauchen " "nur Lesezugriff auf die Dateien." #. type: Plain text #: kraft.adoc:895 msgid "" "A recommended setup is a NFS share with autofs which is set up on the main " "machine. To manage file access a certain group should be set up on the " "machines with which access can be managed." msgstr "" "Ein empfohlenes Setup benutzt ein NFS Share über autofs, das auf der " "Hauptmaschine aufgesetzt werden muss. Um Dateizugriff zu verwalten, sollte " "eine Gruppe aufgesetzt werden." #. type: Plain text #: kraft.adoc:897 #, no-wrap msgid "**Starting Kraft in read-only mode**\n" msgstr "**Kraft im Nur-Lesen Modus**\n" #. type: Plain text #: kraft.adoc:899 msgid "" "To start Kraft in read-only mode, start the binary with the `-r` command " "line switch." msgstr "" "Um Kraft im Nur-Lese Modus zu starten, muss das Programm mit dem " "Kommandozeilenschalter `-r` gestartet werden." #. type: Title === #: kraft.adoc:900 #, no-wrap msgid "XRechnung Support" msgstr "" #. type: Plain text #: kraft.adoc:903 msgid "" "Kraft supports the XRechnung standard. That is a digital format for " "electronic invoicing, and it passed as law in Germany and follows a EU " "directive. The XRechnung is a XML file format designed for that purpose." msgstr "" #. type: Plain text #: kraft.adoc:905 msgid "" "To use the XRechnung Export productivly, a little manual work is still " "needed in Kraft. Kraft creates the XML file based on a template, very " "similar to the normal PDF documents. That means that it loads a template " "that contains static elements (ie. the company address) that do not change " "between different invoices. The dynamic elements (customer data, items etc.) " "are filled into the template during the generation step." msgstr "" #. type: Plain text #: kraft.adoc:907 msgid "" "In order to generate correct XRechnung files for the specific company, the " "user has to adopt the template file manually to the companies needs. Note " "that this has only to be done once and should be easy for a person with a " "bit computer experience (Basic knowledge about XML appreciated!)." msgstr "" #. type: Plain text #: kraft.adoc:909 msgid "" "To adapt the file to the needs of the company, it is best to start with the " "https://raw.githubusercontent.com/dragotin/kraft/master/reports/xrechnung." "xrtmpl[example XRechnung file]. It has to be downloaded and saved into a " "location that the user can edit. Open it in a normal text editor, such as " "https://kate-editor.org/[Kate]." msgstr "" #. type: Plain text #: kraft.adoc:911 msgid "" "Read carefully through the file without being scared off by the XML format. " "All user strings (ie. company name, address and such) are user specific and " "should be replaced accordingly. Find https://www.xoev.de/" "xrechnung-16828[details about the format] here to better understand the " "meaning of the fields." msgstr "" #. type: Plain text #: kraft.adoc:913 msgid "" "Make sure to not disturb the proper XML format and do not change places " "where the template format `{{ template_name }}` is used." msgstr "" #. type: Plain text #: kraft.adoc:915 msgid "" "Once the file is adopted to the needs, open the Settings dialog of Kraft and " "insert the filename into the entry field for the XRechnung Template File on " "the Document Defaults page." msgstr "" #. type: Plain text #: kraft.adoc:917 msgid "" "After that step, the btn:[Export XRechung] menu item will open a dialog to " "pick a filename where to save the XRechnung invoice to." msgstr "" #. type: Plain text #: kraft.adoc:919 msgid "This file can now be transfered to the receiver of the invoice." msgstr "" #. type: Plain text #: kraft.adoc:921 msgid "" "There are validators for invoices in XRechnung format out there in the " "internet. It is useful to verify the format of the Kraft exported XRechnung." msgstr "" #. type: Title === #: kraft.adoc:922 #, no-wrap msgid "Changing the Locale" msgstr "" #. type: Plain text #: kraft.adoc:925 msgid "" "If it is needed that Kraft runs under a different locale than the actual " "desktop environment, this can be achieved by setting the desired locale in " "the start file of Kraft." msgstr "" #. type: Plain text #: kraft.adoc:927 msgid "" "On the linux desktop, apps are usually started through a so called https://" "specifications.freedesktop.org/desktop-entry-spec/latest/[desktop file]. It " "contains the information how the Kraft binary is started if user clicks on " "the icon on the desktop or in the start menu." msgstr "" #. type: Plain text #: kraft.adoc:929 msgid "" "The desktop file can usually be found in `/usr/share/applications/de.volle-" "kraft-voraus.kraft.desktop`." msgstr "" #. type: Plain text #: kraft.adoc:931 msgid "It contains the line" msgstr "" #. type: delimited block - #: kraft.adoc:934 #, no-wrap msgid "Exec=kraft %u\n" msgstr "" #. type: Plain text #: kraft.adoc:937 msgid "which starts the application with the default locale." msgstr "" #. type: Plain text #: kraft.adoc:939 msgid "Changing it to" msgstr "" #. type: delimited block - #: kraft.adoc:942 #, no-wrap msgid "Exec=env LANG=de_DE.UTF-8 kraft %u\n" msgstr "" #. type: Plain text #: kraft.adoc:945 msgid "" "would change that to run in the German locale for example, independent from " "the desktop environment location." msgstr "" #. type: Title == #: kraft.adoc:948 #, no-wrap msgid "Credits and License" msgstr "Credits und Lizenz" #. type: Plain text #: kraft.adoc:951 #, fuzzy msgid "Program and documentation copyright 2004–2023 Klaas Freitag" msgstr "Software und Dokumentation Copyright 2004-2021 Klaas Freitag" #. type: Plain text #: kraft.adoc:952 #, fuzzy #| msgid "Documentation copyright 2020 Ronald Stroethoff" msgid "Documentation copyright 2020-2023 Ronald Stroethoff" msgstr "Dokumentation Copyright 2020 Ronald Stroethoff" #~ msgid "```" #~ msgstr "```" #, fuzzy, no-wrap #~ msgid "Template " #~ msgstr "Textvorlagen" #, fuzzy, no-wrap #~ msgid "Material " #~ msgstr "Material" #, fuzzy #~ msgid "btn:[Show templates]. " #~ msgstr "Textvorlagen" #~ msgid "" #~ "image:numbercycles.png[Numbercycles,float=\"right\"] Numbercycles are " #~ "used to define the *document number* which is printed on every document. " #~ "The document number is an important unique identifier of the document and " #~ "often must follow regulations." #~ msgstr "" #~ "image:numbercycles.png[Numbercycles,float=\"right\"] Nummernkreise werden " #~ "zur Definition der *Dokumentnummern* benötigt, die auf jedem Dokument " #~ "gedruckt wird. Die Dokumentnummer ist eine wichtige und eindeutige " #~ "Kennzahl des Dokuments und muss Regularien gehorchen." #~ msgid "" #~ "Different document types can use the same number cycle to generate ids " #~ "from. Number cycles are identified by their name. User can create new " #~ "number cycles and edit them clicking on the button btn:[Edit Number " #~ "Cycles...]" #~ msgstr "" #~ "Verschiedene Dokumenttypen können die selben Nummernkreise verwenden um " #~ "Ids aus ihnen zu generieren. Nummernkreise werden durch ihren Namen " #~ "identifiziert. Benutzer können neue Nummernkreise anlegen und sie durch " #~ "Klicken auf btn:[Nummernkreise bearbeiten...] bearbeiten" #~ msgid "" #~ "Kraft is designed to use the data entries from the KDE address book which " #~ "is a module of the https://community.kde.org/KDE_PIM[KDE PIM], an " #~ "information management application. All addresses are collected in the " #~ "https://userbase.kde.org/KAddressBook[KAdressBook]." #~ msgstr "" #~ "Kraft arbeitet mit den Adressdaten aus dem KDE Adressbuch, das ein Modul " #~ "von https://community.kde.org/KDE_PIM[KDE PIM], einer Informations-" #~ "Management-Anwendung ist. Alle Adressen werden in der Anwendung https://" #~ "userbase.kde.org/KAddressBook[KAdressBook] gesammelt." #~ msgid "Features" #~ msgstr "Funktionen" kraft-1.2.2/manual/po/kraft-nl.po000066400000000000000000003240141467704360200166110ustar00rootroot00000000000000# Copyright (C) 2022 Free Software Foundation, Inc. # This file is distributed under the same license as the KRAFT package. # # Ronald Stroethoff , 2022, 2023. msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2023-09-12 14:32+0200\n" "PO-Revision-Date: 2023-10-08 08:52+0200\n" "Last-Translator: Ronald Stroethoff \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 22.12.3\n" #. type: Title = #: kraft.adoc:1 #, no-wrap msgid "The Kraft Handbook" msgstr "Het handboek van Kraft" #. type: Plain text #: kraft.adoc:3 msgid "Ronald Stroethoff, Klaas Freitag" msgstr "Ronald Stroethoff, Klaas Freitag" #. type: Title == #: kraft.adoc:16 #, no-wrap msgid "Introduction" msgstr "Inleiding" #. type: Plain text #: kraft.adoc:19 msgid "" "Kraft is a Qt and KDE application to organize office documents like quotes " "and invoices in a small business. It eases the creation of documents and " "helps with repeating tasks." msgstr "" "Kraft is een Qt- en KDE-Programma voor het organiseren van kantoor " "documenten zoals offertes en rekeningen in een klein bedrijf. Het " "vergemakkelijkt de creatie van documenten en helpt bij vaak voorkomende " "taken." #. type: Plain text #: kraft.adoc:21 msgid "" "Using Kraft, there is no need for fiddling with a text processor any more. " "Documents are created by a few clicks, edited, generated and archived " "automatically. Kraft generates high quality PDF output for printing, mailing " "and archiving." msgstr "" "Met gebruik van Kraft is geen tekstverwerker meer nodig. Rekeningen en " "offertes stelt u met slechts een paar muisklikken samen en worden " "automatisch gearchiveerd. Kraft genereert kwalitatief goede PDF-documenten " "geschikt om uit te printen, voor email en voor archivering." #. type: Labeled list #: kraft.adoc:22 #, no-wrap msgid "Feature Overview" msgstr "Overzicht van de mogelijkheden" #. type: Plain text #: kraft.adoc:25 msgid "Simple creation of offers, invoices and similar documents." msgstr "" "De eenvoudige creatie van offertes, rekeningen en vergelijkbare documenten." #. type: Plain text #: kraft.adoc:26 msgid "" "Customer management, deeply integrated with the mature KDE KAddressbook." msgstr "" "Beheer van klanten, door het gebruik van KAddressbook in de KDE-" "infrastructuur geïntegreerd." #. type: Plain text #: kraft.adoc:27 msgid "Maintenance of document relations, ie. Partial invoices vs. invoices." msgstr "" "Beheer van relaties tussen documenten, bv. Partial invoices (Gedeeltelijke " "factuur) ten opzichte van invoices (rekening)." #. type: Plain text #: kraft.adoc:28 msgid "Templates for document header- and footertexts and for document items." msgstr "Sjablonen voor kop- en voetteksten maar ook voor document-items." #. type: Plain text #: kraft.adoc:29 msgid "Pre calculation of item prices." msgstr "De voorcalculatie van prijzen." #. type: Plain text #: kraft.adoc:30 msgid "Material management." msgstr "Materiaalgebruik" #. type: Plain text #: kraft.adoc:31 msgid "Configurable document creation in PDF format for print and email." msgstr "" "Instelbare aanmaak van documenten in PDF Formaat voor uitprinten en " "verzenden per Email." #. type: Plain text #: kraft.adoc:33 msgid "" "The code of Kraft is open source and is released under the https://en." "wikipedia.org/wiki/GNU_General_Public_License[GNU General Public License]." msgstr "" "De broncode van Kraft is open source en wordt onder de licentie https://en." "wikipedia.org/wiki/GNU_General_Public_License[GNU General Public License] " "vrij gegeven." #. type: Plain text #: kraft.adoc:38 #, no-wrap msgid "" "Kraft is driven by community of users, coders, artists and others by" " voluntary work. +\n" "Also this manual needs contributions! +\n" " +\n" " Learn more on https://github.com/dragotin/kraft/blob/master/manual/Readme.md[" "how to contribute]!\n" msgstr "" "Kraft wordt door een gemeenschap van gebruikers, programmeurs artiesten en" " anderen vrijwilligers gedragen. +\n" "Ook dit gebruikershandboek heeft uw hulp nodig om verbeterd te worden. +\n" " +\n" "Lees hier https://github.com/dragotin/kraft/blob/master/manual/Readme.md[hier]" "over hoe u kan bijdragen\n" #. type: Title == #: kraft.adoc:40 #, no-wrap msgid "First Use and Basic Configuration" msgstr "Eerste gebruik en basisconfiguratie" #. type: Plain text #: kraft.adoc:43 msgid "" "When Kraft is started for the first time, it automatically enters the " "initial setup process." msgstr "" "Als Kraft voor de eerste keer wordt opgestart, dan komt het automatisch in " "een initiële proces voor het maken van instellingen terecht." #. type: Plain text #: kraft.adoc:45 msgid "" "During the initial setup you are asked to select a database to use and give " "the name and address of your company." msgstr "" "Tijdens de basisconfiguratie wordt u gevraagd om een database-type te " "selecteren en wordt naar de naam en adres van uw firma gevraagd." #. type: Plain text #: kraft.adoc:47 msgid "" "You can fill in your company address (that appears on the printed documents) " "in two ways: in the setup procedure use the first tab *Select from " "Addressbook* for to select your on address in KAddressBook (if you have " "filled your own address in KaddressBook) or use the second tab *Manual " "entry* for to fill in the information of the address from your company " "manually. This step is necessary for the correct generation of your " "documents as the address is automatically used in the document generation " "step." msgstr "" "Het adres van uw eigen bedrijf, die automatisch op het uitgeprinte document " "verschijnt, kan op twee manieren opgegeven worden: Bij het eerste gebruik: " "gebruik in de basisconfiguratie de eerste tab 'Uit adresboek' om in " "KAdressbook uw eigen adres te selecteren (als u in KAdressbook uw eigen " "adres heeft ingevuld) of u gebruikt de tweede tab 'Handmatige adres' om " "handmatig de informatie van uw bedrijf in te vullen. Deze stap is " "noodzakelijk voor de correcte aanmaak van uw documenten, omdat het " "automatisch wordt gebruikt in het proces voor de generatie van het document." #. type: Plain text #: kraft.adoc:49 msgid "image:company_adress1.png[Company adress,float=\"right\"]" msgstr "image:company_adress1.png[Company adress,float=\"right\"]" #. type: Plain text #: kraft.adoc:52 msgid "" "After the initial setup, select menu:Preferences[Settings]. That allows to " "prepare Kraft correctly so it can be used in a proper way." msgstr "" "Na de basisconfiguratie, selecteert u menu:Voorkeuren[Instellingen]. Hier " "kunt u Kraft correct voorbereiden zodat het op de juiste manier gebruikt kan " "worden." #. type: Plain text #: kraft.adoc:54 msgid "In the Preferences dialog we have the tabs:" msgstr "In het dialoogvenster voor de instellingen hebben we de tabs:" #. type: Plain text #: kraft.adoc:61 #, no-wrap msgid "" " *Document Defaults\n" " *Taxes\n" " *Documunt Types\n" " *Wages\n" " *Units\n" " *Own identity\n" msgstr "" " *Standaarddocument\n" " *Belastingen\n" " *Dokumenttypes\n" " *Salarissen\n" " *Eenheden\n" " *Uw eigen identiteit\n" #. type: Plain text #: kraft.adoc:63 msgid "" "Each of the tabs allows to enter useful values for the specific use case." msgstr "" "In elke tab is het mogelijk om voor uw specifieke geval realistische waarden " "in te voeren." #. type: Title === #: kraft.adoc:64 #, no-wrap msgid "Document Types" msgstr "Document typen" #. type: Plain text #: kraft.adoc:67 msgid "At the first use you find a list of different document types, such as:" msgstr "" "Bij het eerste gebruik vindt u een lijst met verschillende documenttypes, " "zoals:" #. type: Plain text #: kraft.adoc:69 msgid "Acceptance of order" msgstr "Acceptance of order (opdrachtbevestiging)" #. type: Plain text #: kraft.adoc:70 msgid "Delivery receipt" msgstr "Delivery receipt (afleverbon)" #. type: Plain text #: kraft.adoc:71 msgid "Invoice" msgstr "Invoice (rekening)" #. type: Plain text #: kraft.adoc:72 msgid "Offer" msgstr "Offer (offerte)" #. type: Plain text #: kraft.adoc:74 msgid "image:documentype.png[Document type,float=\"right\"]" msgstr "image:documentype.png[Document type,float=\"right\"]" #. type: Plain text #: kraft.adoc:77 msgid "" "Translate this types to your own language. You can also add new ones and " "remove document types you wont use." msgstr "" "Vertaal deze typen naar uw eigen taal. U kan ook nieuwe documenten toevoegen " "en documenten verwijderen waarvan u denkt dat u die niet zal gebruiken." #. type: Title ==== #: kraft.adoc:78 #, no-wrap msgid "Numbercycles" msgstr "Uniek documentnummer" #. type: Plain text #: kraft.adoc:82 msgid "" "image:numbercycles.png[Numbercycles,float=\"right\"] Each document has to " "have an unique identifier that identifies the document. There must not be " "two documents in Kraft with the same identifier." msgstr "" "image:numbercycles.png[Numbercycles,float=\"right\"] Elk document moet een " "uniek identificatie hebben die het document identificeert. Er mogen in Kraft " "geen twee documenten aanwezig zijn met dezelfde identificatie." #. type: Plain text #: kraft.adoc:85 msgid "" "The format of the identifier is configuratable in Kraft. For that, Kraft has " "a concept of so called number cycles. Number cycles are used to define the " "form of the *document number* which is printed on every document." msgstr "" "De opbouw van het identificatie is in Kraft instelbaar. Hiervoor heeft Kraft " "het concept van zogeheten volgnummers. Volgnummers worden gebruikt om de " "opbouw van het *documentnummer* te definiëren dat op elk document wordt " "geprint." #. type: Plain text #: kraft.adoc:89 msgid "" "All documents of a certain type have identifiers taken out of one number " "cycle. Each document type has a number cycle assigned. Different document " "types can use the same number cycle to generate ids from. That way, for " "example the document types Invoice and Final Invoice can use numbers from " "the same number cycle, even thought they are different document types in " "Kraft. Number cycles are identified by their name. User can create new " "number cycles and edit them clicking on the button btn:[Edit Number " "Cycles...]" msgstr "" "Alle documenten van een bepaald type hebben een identificatie die uit een " "één volgnummersysteem komen. Aan elk documenttype is een volgnummersysteem " "gekoppeld. Verschillende documenttypes kunnen hetzelfde volgnummersysteem " "gebruiken om hun identificatie uit te generen. Op die manier kunnen " "bijvoorbeeld de documenttypes Invoice (rekening) en Final Invoice " "(eindafrekening) nummers uit dezelfde volgnummersysteem gebruiken, terwijl " "ze in Kraft verschillende documenttypes zijn. Volgnummersystemen worden " "geïdentificeerd door hun naam. Gebruikers kunnen nieuwe volgnummersystemen " "creëren en deze bewerken door op de knop btn:[Volgnummersysteem bewerken...] " "te klikken" #. type: Plain text #: kraft.adoc:91 msgid "" "The format of the document numbers are defined by a template that can " "contain normal, fixed characters and also some variables that are replaced " "by the respective values when the document is created." msgstr "" "De opbouw van de documentnummers worden gedefinieerd in een sjabloon waarin " "normale, vaste karakters maar ook enkele variabelen aanwezig kunnen zijn die " "worden vervangen door hun respectievelijke waarden bij de creatie van het " "document." #. type: Plain text #: kraft.adoc:94 msgid "" "Each identifier needs to be unique, and thus has to contain a counter. Kraft " "supports two types of counter: One (variable `%i`) is incremented globally " "for every new document. The other (variable `%n`) is reset every day and " "starts at 1 again on every new day. In addition to the counter, more " "information can be added to the template form an useful number. Examples are " "a constant text or parts of the date." msgstr "" "Elk documentnummer moet uniek zijn, en moet dus een teller hebben. Kraft kan " "twee soorten tellers gebruiken: Een type (variabele `%i`) wordt bij elk " "nieuw document verhoogt. De andere (variabele `%n`) wordt elke dag " "teruggezet en begint dus weer bij 1 op elke nieuwe dag. Behalve de teller " "kan extra informatie toegevoegd worden om een bruikbaar documentnummer te " "krijgen, zoals een constante tekst of gedeeltes van de datum." #. type: Plain text #: kraft.adoc:96 msgid "" "The default numbercycle delivered with Kraft contains the year, the month " "and a serialnumber. That way you can compare offers or orders from last year " "with this year or the month April of last year with the month April of this " "year and get on this way an impression from the results of your business." msgstr "" "Het standaard volgnummersysteem dat met Kraft wordt geleverd bevat het jaar, " "de maand en een serienummer. Op deze manier kunt u offertes of opdrachten " "van het vorige jaar vergelijken met die van dit jaar of van de maand April " "van het vorige jaar met de maand April van dit jaar en op die manier een " "indruk krijgen van de resultaten van uw bedrijf." #. type: Plain text #: kraft.adoc:98 msgid "See the following table for available variables which can be used:" msgstr "" "Zie de volgende tabel voor de beschikbare variabelen die gebruikt kunnen " "worden:" #. type: Table #: kraft.adoc:115 #, no-wrap msgid "" "| `%y` or `%yyyy` | the year of the document date.\n" "| `%yy` | the year of the document (two digits).\n" "| `%w` | the week number of the document date.\n" "| `%ww` | the week number of the document date with leading zero.\n" "| `%d` | the day number of the document date.\n" "| `%dd` | the day number of the document date with leading zero.\n" "| `%m` or `%M` | the month number of the document date.\n" "| `%MM` | the month number with leading zero.\n" "| `%c` | the customer id from kaddressbook\n" "| `%type` | the localised doc type (offer, invoice etc.)\n" "| `%uid` | the contact id of the client.\n" "| `%i` .. `%iiiiii`| the unique counter\n" "| `%n` .. `%nnnnnn`| the unique day counter (combine with date)\n" "\n" msgstr "" "| `%y` of `%yyyy` | het jaar van de documentdatum.\n" "| `%yy` | het jaar van de documentdatum (twee cijfers).\n" "| `%w` | het weeknummer van de documentdatum.\n" "| `%ww` | het weeknummer van het documentdatum met een nul (twee" " cijfers).\n" "| `%d` | de dag van de week als getal van de documentdatum.\n" "| `%dd` | de dag van de week als getal van het documentdatum met" " een nul (wee cijfers).\n" "| `%m` of `%M` | de maand van het documentdatum als getal.\n" "| `%MM` | de maand van het documentdatum als getal met een nul" " (twee cijfers).\n" "| `%c` | de ID van de klant in het kaddressbook\n" "| `%type` | het vertaalde doc type (offerte, rekening enz.)\n" "| `%uid` | het contact id van de klant.\n" " |`%i` .. `%iiiiii`| de unieke teller *(verplicht)*\n" "| `%n` .. `%nnnnnn`| de unieke dagteller (te combineren met de datum)\n" "\n" #. type: Plain text #: kraft.adoc:118 msgid "" "A number cycle template needs to contain either `%i` or `%n`, if not, `%i` " "is appended automatically." msgstr "" "In een volgnummersysteem-sjabloon moet naar keuze `%i` of `%n` aanwezig " "zijn, als dat niet het geval is dan wordt automatisch `%i` eraan toegevoegd." #. type: Plain text #: kraft.adoc:120 msgid "" "Both `%i` and `%n` are numeric values. They can also be padded with with " "leading zeros. The length is defined by the number of i's or n's put into " "the template. For example, if a daily counter with length of three and " "leading zeros is desired, `%nnn` has to be put into the template. This works " "up to a length of six characters." msgstr "" "Zowel `%i` als `%n` hebben numerieke waarden. Ze kunnen ook worden " "voorafgegaan door extra nullen. De length is afhankelijk van het aantal i's " "of n's die in het sjabloon voorkomen. Bijvoorbeeld, als u een dagelijkse " "teller met een lengte van drie cijfers en voorloop nullen wenst, dan moet u " "`%nnn` in de sjabloon plaatsen. Dit werkt tot een lengte van zes karakters." #. type: delimited block _ #: kraft.adoc:123 msgid "" "NOTE: The \"design\" of the numbercycles and document numbers is very " "important. With the flexible system of templating Kraft can not prevent " "invalid number cycles. It is in the responsibility of the user." msgstr "" "Opmerking: het \"ontwerp\" van het volgnummersysteem en documentnummers is " "erg belangrijk. Door het flexibele systeem van sjablonen in Kraft kan niet " "ongeldige volgnummersystemen voorkomen. Dit is de verantwoordelijkheid van " "de gebruiker." #. type: Title ==== #: kraft.adoc:125 #, no-wrap #| msgid "Template" msgid "PDF Template" msgstr "PDF sjabloon" #. type: Plain text #: kraft.adoc:128 msgid "" "In the entry field Template File: the user can select a custom template for " "this specific document type." msgstr "" "In invoerveld \"Sjabloon bestand:\" kan de gebruiker een eigen sjabloon" " opgeven voor dit specifieke documenttype." #. type: Plain text #: kraft.adoc:130 msgid "" "If the file extension of the template file is `.trml`, the ReportLab based " "document converter is used. If the file extension is `.gtmpl`, Kraft " "automatically uses the Weasyprint based converter." msgstr "" "Als de bestand-extensie van het sjabloon-bestand is `.trml`, dan wordt de op" " ReportLab gebaseerde document converter gebruikt. Als de bestand-extensie is" " `.gtmpl`, dan gebruikt Kraft automatisch de op Weasyprint gebaseerde" " converter." #. type: delimited block _ #: kraft.adoc:133 msgid "" "NOTE: The ReportLab system for PDF creation is deprecated in Kraft. Please, " "for new templates, always use Grantlee- and Weasyprint based templates." msgstr "" "OPMERKING: Het ReportLab systeem voor de PDF creatie wordt in Kraft als" " verouderd gezien. Gebruikt voor nieuwe sjablonen altijd op Grantlee- en" " Weasyprint gebaseerde sjablonen." #. type: Title ==== #: kraft.adoc:135 #, no-wrap msgid "PDF Postprocessing" msgstr "PDF nabewerking" #. type: Plain text #: kraft.adoc:138 msgid "" "After Kraft has created the PDF document it is possible to merge the created " "PDF with static, customized PDFs created by the user. With that, it is easy " "to add a custom stationery with a logo to the resulting PDF (\"Watermark\")." msgstr "" "Nadat Kraft het PDF-document heeft gecreëerd is het mogelijk om de gecreëerde" " PDF samen te voegen met statische PDFs die die zijn gecreëerd en aangepast" " door de gebruiker. Hiermee is het makkelijk om eigen briefhoofd met een logo" " of een watermerk aan de resulterende PDF toe te voegen." #. type: Plain text #: kraft.adoc:140 msgid "" "The static PDFs should have the same page size as the generated documents. " "Keep in mind to use optimized images for logos etc. to not blow up the size " "of the result document." msgstr "" "De statisch PDFs moeten dezelfde papiergrootte hebben als de gegenereerde" " documenten. " "Vergeet niet om voor logos en dergelijke geoptimaliseerde afbeeldingen te" " gebruiken zodat de grootte van het resulterende document niet wordt" " opgeblazen." #. type: Plain text #: kraft.adoc:142 #| msgid "image:followup_1.png[Folloup document,float=\"right\"]" msgid "image:pdfpostproc.png[PDF Postprocessing,float?\"right\"]" msgstr "image:pdfpostproc.png[PDF Postprocessing,float?\"right\"]" #. type: Plain text #: kraft.adoc:144 msgid "The watermark options are:" msgstr "De opties voor het watermerk zijn:" #. type: Plain text #: kraft.adoc:146 #, no-wrap msgid "*No Watermark*: No watermark is created\n" msgstr "*Geen watermerk*: Geen watermerk wordt gecreëerd\n" #. type: Plain text #: kraft.adoc:147 #, no-wrap msgid "" "*On first page*: The first page of the watermark.pdf is merged with the first" " page of the result document\n" msgstr "" "*Op eerste pagina*: De eerste pagina van de watermark-pdf wordt samengevoegd" " met de eerste pagina van het resulterende document\n" #. type: Plain text #: kraft.adoc:148 #, no-wrap msgid "" "*Watermark on all pages*: Merges the first page of the watermark PDF to all" " pages of the result document\n" msgstr "" "*Watermerk op alle pagina's*: voegt de eerste pagina van de watermerk-PDF" " samen met alle pagina's van het resulterende document\n" #. type: Plain text #: kraft.adoc:149 #, no-wrap msgid "" "*alternating*: For this, the watermark PDF needs to have three pages. The" " first page is merged to the first page of the result document, the second" " and third page are alternated merge to subsequent pages.\n" msgstr "" "*Afwisselend*: Hiervoor moet de watermerk-PDF drie pagina's hebben. De eerste" " pagina wordt met de eerste pagina van het gecreëerde document samengevoegd," " de tweede en derde pagina worden afwisselend met de volgende pagina's" " samengevoegd.\n" #. type: Plain text #: kraft.adoc:150 #, no-wrap msgid "" "*different first and last page*: the PDF needs to have three pages. The first" " page is merged to the first page of the result document, the third page to" " the last, and the second to all page between first and last page.\n" msgstr "" "*Afwijkende eerste en laatste pagina*: het watermerk-PDF moet drie pagina's" " hebben. De eerste pagina wordt met de eerste pagina van het gecreëerde" " document samengevoegd, de derde pagina wordt samengevoegd met de laatste" " pagina, en de tweede pagina met alle pagina's tussen de eerste en de laatste" " pagina.\n" #. type: Plain text #: kraft.adoc:152 msgid "" "If there is another static PDF document put into the entry field \"Append " "PDF:\", it is appended to the generated PDF. With that, Kraft will " "automatically add for example terms and conditions documents to the final " "document." msgstr "" "Als een ander statisch PDF document is opgegeven in het vak \"Voeg PDF" " toe:\", dan wordt dit aan het eind van de gegenereerde PDF toegevoegd." " Daarmee kan Kraft automatisch bijvoorbeeld een blad met de algemene" " voorwaarden toevoegen aan het uiteindelijke document." #. type: Title === #: kraft.adoc:153 #, no-wrap msgid "Taxes" msgstr "Belastingen" #. type: Plain text #: kraft.adoc:157 msgid "" "image:taxes.png[Taxes,float=\"right\"] In many countries there are two kinds " "of VAT-taxes for sold products." msgstr "" "image:taxes.png[Taxes,float=\"right\"] In veel landen zijn er twee BTW-" "tarieven voor verkochte producten." #. type: Plain text #: kraft.adoc:160 msgid "A high level and a low level." msgstr "Een hoog tarief en een laag tarief." #. type: Plain text #: kraft.adoc:163 msgid "" "Fill here the appropriate amounts in for the high level and the low level. " "If the tax-level is changing, then you add here the start date with the new " "tax-levels." msgstr "" "Geef hier de toepasselijke waarden op voor het hoge tarief en voor het lage " "tarief. Als het belastingtarief wijzigt, dan kunt u hier de startdatum met " "de nieuwe belastingtarieven toevoegen." #. type: Title === #: kraft.adoc:164 #, no-wrap msgid "Wages" msgstr "Salarissen" #. type: Plain text #: kraft.adoc:169 msgid "" "image:wages.png[Wages,float=\"right\"] A list of wage costs is maintained in " "Kraft. The items are used in templates and during calculation." msgstr "" "image:wages.png[Wages,float=\"right\"] In Kraft is een lijst met " "salariskosten aanwezig. De items daarin worden in de sjablonen en in de " "berekeningen gebruikt." #. type: Plain text #: kraft.adoc:172 msgid "" "All data can be edited, customized and new items can be added in the Kraft " "Configuration Dialog reachable through the Settings menu." msgstr "" "Alle data kan bewerkt en aangepast worden in een configuratiedialoog dat u " "kunt bereiken via het menu-item 'voorkeuren', waar u ook nieuwe items kunt " "toevoegen ." #. type: Plain text #: kraft.adoc:176 msgid "" "Remember that these units are later used in the documents, it is therefor " "important that you translate them to your own language and to fill in the " "correct prices." msgstr "" "Vergeet niet dat deze items later worden gebruikt in de documenten, het is " "daarom belangrijk dat u ze vertaalt naar uw eigen taal en dat u de correcte " "bedragen invult." #. type: Title === #: kraft.adoc:177 #, no-wrap msgid "Units of measurement" msgstr "Eenheden" #. type: Plain text #: kraft.adoc:182 msgid "" "image:unity.png[Units of measurement,float=\"right\"] A list of units of " "measurement is maintained in Kraft. In Kraft Configuration Dialog reachable " "through the Settings menu can you edit and customize items already in the " "list, and also can you add new items to the list." msgstr "" "image:unity.png[Units of measurement,float=\"right\"] In Kraft is een " "verzameling eenheden aanwezig. In het configuratiedialoog die u kunt " "bereiken via het menu-item 'Voorkeuren' kunt u de items die al aanwezig zijn " "bewerken, maar u kunt ook nieuwe items toevoegen." #. type: Plain text #: kraft.adoc:185 msgid "" "Remember that these units are later used in the documents, it is therefor " "important that you translate them to your own language." msgstr "" "Vergeet niet dat deze eenheden later worden gebruikt in de documenten, het " "is daarom belangrijk dat u ze vertaalt naar uw eigen taal." #. type: Title === #: kraft.adoc:186 #, no-wrap msgid "Own identity" msgstr "Uw eigen identiteit" #. type: Plain text #: kraft.adoc:190 msgid "" "Check here if the information that you have given during the initial setup " "is correct for the use in the documents." msgstr "" "Controleer hier of de informatie die u heeft opgegeven tijdens de " "basisconfiguratie correct is voor het gebruik in de documenten." #. type: delimited block _ #: kraft.adoc:195 msgid "" "WARNING: If you made the choice to use the information from KaddressBook " "then is the information from a later manual entry ignored." msgstr "" "Pas op: Als u de keuze heeft gemaakt om de informatie in Kaddressbook te " "gebruiken dan wordt de informatie die u handmatig toevoegt genegeerd." #. type: Plain text #: kraft.adoc:199 msgid "" "After we have made some corrections to the configuration, we go back to the " "main window.Here we see three tabs:" msgstr "" "Nadat we indien nodig de gewenste correcties in de configuratie hebben " "aangebracht, gaan we terug naar het hoofdvenster. Hier zien we drie tabs:" #. type: Plain text #: kraft.adoc:201 msgid "Documents" msgstr "Documenten" #. type: Plain text #: kraft.adoc:202 msgid "Timeline" msgstr "Tijdlijn" #. type: Title == #: kraft.adoc:203 kraft.adoc:205 #, no-wrap msgid "Catalogs" msgstr "Catalogi" #. type: Plain text #: kraft.adoc:208 msgid "" "Kraft supports so called Catalogs in which templates for document items are " "kept. With the catalogs creating documents can be significantly accellerated " "in the day to day business. When creating new documents, the items templates " "from the catalogs can easily selected and moved over to the document." msgstr "" "Kraft gebruikt zogeheten Catalogi waarin sjablonen voor document items " "worden bewaard. Door de catalogi te gebruiken kan in het dagelijks gebruik " "het creëren van documenten significant worden versneld. Tijdens de creatie " "van nieuwe documenten, kunt u in de catalogi de items-sjablonen eenvoudig " "selecteren en naar het document verplaatsen." #. type: Plain text #: kraft.adoc:210 msgid "" "Since templates are organized in chapters entire documents can be prepared " "in different chapters to be used as template documents." msgstr "" "Omdat sjablonen worden georganiseerd in mappen, kunnen hele documenten " "worden voorbereid en opgeborgen in verschillende mappen om later als " "documentsjabloon te worden gebruikt." #. type: Plain text #: kraft.adoc:212 msgid "" "Of course the items in the documents can be edited after they got picked " "from a catalog." msgstr "" "Uiteraard kunnen de items in de documenten worden bewerkt nadat ze in een " "catalogus zijn geselecteerd." #. type: Plain text #: kraft.adoc:214 msgid "By default Kraft comes with two different catalogs:" msgstr "Kraft komt standaard met twee verschillende catalogi:" #. type: Plain text #: kraft.adoc:216 msgid "`Material`" msgstr "`Material`" #. type: Plain text #: kraft.adoc:219 msgid "" "A catalog of material that are sold, with their purchase prices, the profit " "and the sell-price." msgstr "" "Een catalogus met materialen die worden verkocht, met hun inkoopprijs, de " "winst en hun verkoopprijs." #. type: Plain text #: kraft.adoc:221 msgid "and `Standard Templates`" msgstr "en `Standard Templates`" #. type: Plain text #: kraft.adoc:223 msgid "A catalog of standard recipes of work like planting trees." msgstr "" "Een catalogus met standaard recepten voor werkzaamheden zoals het planten " "van bomen." #. type: Plain text #: kraft.adoc:226 msgid "" "Both catalogs can have chapters and sub-chapters for to organize your " "templates. First we are going to fill in the" msgstr "" "Beide catalogussen kunnen mappen en submappen hebben om daar uw sjablonen in " "op te bergen . Eerst gaan we gegevens toevoegen aan de " #. type: Title === #: kraft.adoc:227 #, no-wrap msgid "Material Catalog" msgstr "Materiaalcatalogus" #. type: Plain text #: kraft.adoc:232 msgid "" "A catalog of material that are sold, with their purchase prices, the profit " "and the sell-price. First we are going to add new chapters and subchapters." msgstr "" "Een catalogus met materialen die worden verkocht, met hun inkoopprijs, de " "winst en hun verkoopprijs. Eerst gaan we nieuwe mappen en submappen " "toevoegen." #. type: Title ==== #: kraft.adoc:233 #, no-wrap msgid "New chapters" msgstr "Nieuwe mappen" #. type: Plain text #: kraft.adoc:237 msgid "" "Select with the mouse the column-name `material`, select now in the context-" "menu [Add a sub chapter]" msgstr "" "Selecteer met de muis de kolomnaam `material`, selecteer vervolgens in het " "contextmenu [Submap toevoegen]" #. type: Plain text #: kraft.adoc:239 msgid "and add an extra chapter like `Trees`" msgstr "en voeg een extra map zoals `Bomen` toe" #. type: Title ==== #: kraft.adoc:240 #, no-wrap msgid "New sub chapters" msgstr "Nieuwe submappen" #. type: Plain text #: kraft.adoc:248 msgid "" "We are going to ad sub chapters in the map `Trees`. Select with the mouse " "the name of the chapter where you like to add a subchapter, select now in " "the context-menu [Add a sub chapter] and ad an extra subchapters like `Loaf " "trees` and `needle trees`. After adding the extra chapters and subchapters " "for dividing the material, we are going to add the material themself." msgstr "" "We gaan nu submappen toevoegen aan de map `Bomen`. Selecteer met de muis de " "naam van de map waaraan u een submap wilt toevoegen, selecteer nu in het " "contextmenu [Submap toevoegen] en voeg extra submappen zoals `Bladbomen` en " "`Naaldbomen` toe. Nadat we extra mappen en submappen hebben toegevoegd om " "het materiaal onder te verdelen, gaan we het materiaal zelf toevoegen." #. type: Title ==== #: kraft.adoc:249 #, no-wrap msgid "New template" msgstr "Nieuw sjabloon" #. type: Plain text #: kraft.adoc:254 msgid "" "Select with the mouse the name of the sub-chapter or chapter where you like " "to add a material. Select the sub map Loaf trees and select now in the " "context-menu" msgstr "" "Selecteer met de muis de naam van de submap of map waarin u materiaal wilt " "toevoegen. Selecteer de submap bladbomen en selecteer nu in het contextmenu " "nieuw sjabloon." #. type: Plain text #: kraft.adoc:257 msgid "" "Add the extra materials `coconut tree`, `apple tree` and `pine-apple tree`." msgstr "" "Voeg de nieuwe bomen `kokosnoot-boom`, `appelboom` en `ananasboom` toe." #. type: Plain text #: kraft.adoc:259 msgid "Fill in the price that we have paid." msgstr "Vul de prijs in die we hebben betaald." #. type: Plain text #: kraft.adoc:261 msgid "Fill in the profit that we want to have on the material" msgstr "Vul de winst in die we willen hebben op het materiaal." #. type: Plain text #: kraft.adoc:263 msgid "And fill in how much is in a packet." msgstr "En vul in per hoeveel ze verpakt zijn." #. type: Plain text #: kraft.adoc:266 msgid "" "image:catalog_material.png[Material catalog,float=\"right\"] After this we " "add also in the map 'Wood' a item for a 'support pole' for later use with " "its price." msgstr "" "image:catalog_material.png[Material catalog,float=\"right\"] Hierna voegen " "we ook in de map 'Wood' een item toe voor 'boompaal' met zijn prijs voor " "later gebruik." #. type: Plain text #: kraft.adoc:268 msgid "Now we are going to:" msgstr "Nu gaan we naar:" #. type: Title === #: kraft.adoc:269 #, no-wrap msgid "Standard Templates" msgstr "Standard Templates" #. type: Plain text #: kraft.adoc:272 msgid "This is a catalog of standard recipes of work like:" msgstr "Dit is een catalogus met standaard recepten voor werkzaamheden zoals:" #. type: Plain text #: kraft.adoc:274 msgid "planting trees" msgstr "Bomen planten" #. type: Plain text #: kraft.adoc:275 msgid "cutting grass" msgstr "Gras maaien" #. type: Plain text #: kraft.adoc:276 msgid "transport costs" msgstr "Transportkosten" #. type: Plain text #: kraft.adoc:277 msgid "planting grass" msgstr "Graszoden leggen" #. type: Plain text #: kraft.adoc:278 msgid "sowing grass-seed" msgstr "Graszaad zaaien" #. type: Plain text #: kraft.adoc:280 msgid "We add here the standard work of planting a tree." msgstr "" "We gaan hier de standaard werkzaamheden voor het planten van een boom " "toevoegen." #. type: Plain text #: kraft.adoc:283 msgid "" "Select with the mouse the name of the chapter [Work] where you like to add " "the new template," msgstr "" "Selecteer met de muis de naam van de map [Work] waar u de nieuwe sjabloon " "aan wilt toevoegen," #. type: Plain text #: kraft.adoc:285 msgid "select now the context-menu [New template]" msgstr "selecteer nu in het contextmenu btn:[Nieuw sjabloon]" #. type: Plain text #: kraft.adoc:287 msgid "and the extra templates `Plant tree` and `cut grass`." msgstr "en voeg de extra sjablonen `Boom planten` en `Gras maaien` toe." #. type: Plain text #: kraft.adoc:289 msgid "After we made the new template, a window opens with 4 tabs:" msgstr "" "Nadat we de nieuwe sjabloon hebben aangemaakt, opent een venster met 4 tabs:" #. type: Title ==== #: kraft.adoc:291 kraft.adoc:297 #, no-wrap msgid "Template" msgstr "Sjabloon" #. type: Title ==== #: kraft.adoc:292 kraft.adoc:309 #, no-wrap msgid "Time calculation" msgstr "Post arbeid" #. type: Plain text #: kraft.adoc:293 msgid "Fix costs" msgstr "Vaste kosten" #. type: Title ==== #: kraft.adoc:294 kraft.adoc:346 #, no-wrap msgid "Material" msgstr "Materiaal" #. type: Plain text #: kraft.adoc:296 msgid "First we go to the tab:" msgstr "Eerst gaan we naar de tab:" #. type: Plain text #: kraft.adoc:301 msgid "" "We give here the name of the new standard template like `Plant tree` image:" "catalog_standard.png[Standard catalog,float=\"right\"]" msgstr "" "We geven hier de naam op van de nieuwe standaard sjabloon zoals `Boom " "planten` image:catalog_standard.png[Standard catalog,float=\"right\"]" #. type: delimited block _ #: kraft.adoc:304 msgid "WARNING: be careful, this name is later used in the invoice" msgstr "" "Pas op: wees voorzichtig, dit is de naam die later op de rekening komt." #. type: Plain text #: kraft.adoc:308 msgid "" "we select that this is per piece and that the margin is 8% and that the full " "VAT is applicable." msgstr "" "we stellen hier in dat het per stuk is en dat de winst 8% is en dat het hoge " "BTW-tarief van toepassing is." #. type: Plain text #: kraft.adoc:312 msgid "We fill here in a number of work with the time:" msgstr "We vullen hier een aantal werkzaamheden met hun tijd in:" #. type: Block title #: kraft.adoc:313 #, no-wrap msgid "Spent time" msgstr "Gebruikte tijd" #. type: Table #: kraft.adoc:320 #, no-wrap msgid "" "|Dig hole |32 min. |worker\n" "|Place tree |12 min. |worker\n" "|Fill hole |17 min. |worker\n" "|give water |5 min. |worker\n" msgstr "" "|Gat graven |32 min. |worker\n" "|Boom plaatsen |12 min. |worker\n" "|Gat opvullen |17 min. |worker\n" "|Water geven |5 min. |worker\n" #. type: Plain text #: kraft.adoc:324 msgid "" "The cost for worker which we have earlier filled in is now used. image:" "catalog_standard_work.png[Time calculation,float=\"right\"]" msgstr "" "De kosten voor een werknemer die we eerder hebben ingevuld worden nu " "gebruikt.image:catalog_standard_work.png[Time calculation,float=\"right\"]" #. type: delimited block _ #: kraft.adoc:328 msgid "" "NOTE: in the invoice we see later only Plant tree, we will not see the parts " "dig hole,place tree,fill hole,give water" msgstr "" "Opmerking: op de rekening zien we later alleen Boom planten, we zullen dan " "niet de onderdelen Gat graven, boom plaatsen, Gat opvullen, Water geven zien." #. type: Plain text #: kraft.adoc:331 msgid "Now we go to the tab" msgstr "We gaan nu naar de tab:" #. type: Title ==== #: kraft.adoc:332 #, no-wrap msgid "Fixed costs" msgstr "Vaste kosten" #. type: Plain text #: kraft.adoc:335 msgid "and fill in:" msgstr "en we vullen in:" #. type: Block title #: kraft.adoc:336 #, no-wrap msgid "Fixed item" msgstr "Vast item" #. type: Table #: kraft.adoc:340 #, no-wrap msgid "|Transportcost |35 euro |1 pcs.\n" msgstr "|Transportkosten |35 euro |1 pcs.\n" #. type: Plain text #: kraft.adoc:343 msgid "image:catalog_standard_fixed_cost.png[Fixed cost,float=\"right\"]" msgstr "image:catalog_standard_fixed_cost.png[Fixed cost,float=\"right\"]" #. type: Plain text #: kraft.adoc:345 msgid "After this we go to the tab:" msgstr "Hierna gaan we naar de tab:" #. type: Plain text #: kraft.adoc:350 msgid "" "Here we select btn:[next], after which the window [Add Material to " "Calculation] opens for a selection of material. We navigate to the map " "'wood' where we select the 'support pole'." msgstr "" "Hier kiezen we btn:[volgende], waarna het venster [Materiaal toevoegen aan " "Berekening] opent voor de selectie van materiaal. We gaan dan naar de map " "'wood' waar we de 'boompaal' selecteren." #. type: Block title #: kraft.adoc:351 #, no-wrap msgid "Used materials" msgstr "Gebruikte materialen" #. type: Table #: kraft.adoc:355 #, no-wrap msgid "|1 |support pole |3,5 euro\n" msgstr "|1 |boompaal |3,5 euro\n" #. type: Plain text #: kraft.adoc:358 msgid "image:catalog_standard_material.png[Material,float=\"right\"]" msgstr "image:catalog_standard_material.png[Material,float=\"right\"]" #. type: Plain text #: kraft.adoc:360 msgid "We go now back to the first tab template" msgstr "We gaan nu terug naar de eerste tab 'Sjabloon'" #. type: Plain text #: kraft.adoc:363 msgid "" "On the first tab [template], we can now see the overall cost per one unit" msgstr "" "In de eerste tab [Sjabloon], kunnen we nu de totale kosten per eenheid zien." #. type: Plain text #: kraft.adoc:366 msgid "" "Click on [OK] for saving the result or on [cancel] for discarding the result." msgstr "" "Klik op btn:[OK] om het resultaat op te slaan of op btn:[Annuleren] om het " "resultaat te verwijderen." #. type: Plain text #: kraft.adoc:368 msgid "We make a second template `cut grass`" msgstr "We maken een tweede sjabloon 'Gras maaien'." #. type: Plain text #: kraft.adoc:371 msgid "" "we fill in `cut grass`, as unit we choose sm (square meter), on the second " "tab we fill in that we need 3 min per square meter." msgstr "" "we vullen in `Gras maaien`, als eenheid kiezen we sm (square meter in het " "Engels) of m² (in het Nederlands), in de tweede tab vullen we in dat 3 min " "nodig hebben per vierkante meter." #. type: Plain text #: kraft.adoc:374 msgid "" "Click on [OK] for saving the result or on [Cancel] for discarding the result." msgstr "" "Klik op btn:[OK] om het resultaat op te slaan of op btn:[Annuleren] om het " "resultaat te verwijderen." #. type: Plain text #: kraft.adoc:376 msgid "'''" msgstr "'''" #. type: Title === #: kraft.adoc:377 #, no-wrap msgid "Header- and Footer Text Templates" msgstr "Kop- en voettekst-sjablonen" #. type: Plain text #: kraft.adoc:380 msgid "" "Kraft supports text templates also for the header- and footer-text of " "documents. Each document type has it's own set of text templates. To access " "them, open a document of a certain document type in edit mode and use the " "btn:[show templates] to make the templates visible. In both the header- and " "footer-section the stored templates become visible." msgstr "" "Kraft heeft ook sjablonen voor de kop- voetteksten van documenten. Elk type" " document heeft zijn eigen set tekstsjablonen. To access " "them, open een document van een bepaald documenttype in de bewerkingsmode en" " gebruik de knop " "btn:[Sjabloon tonen] om de sjablonen zichtbaar te maken. In zowel de kop- als" " de voet-sectie worden de opgeslagen sjablonen zichtbaar." #. type: Plain text #: kraft.adoc:382 msgid "" "Directly under the navigation pane on the right side of the window is a list " "of the names of the available templates. Clicking on one of the names in the " "list displays the text in the pane below." msgstr "" "Direct onder het navigatie-paneel rechts van het venster ziet u een lijst met" " de namen van de beschikbare sjablonen. Als u op een van de namen in de lijst" " klikt dan krijgt u de tekst in het paneel eronder te zien." #. type: Plain text #: kraft.adoc:384 msgid "" "Underneath there are buttons located with the following functions from left " "to right:" msgstr "Daaronder zijn knoppen met de volgende functies van links naar rechts:" #. type: Plain text #: kraft.adoc:386 msgid "" "Add the template to the document: This button replaces the text of the " "document with the selected template." msgstr "" "Voeg een sjabloon toe aan het document: Deze knop vervangt de tekst van het" " document met het geselecteerde sjabloon." #. type: Plain text #: kraft.adoc:387 msgid "" "Insert the template to the document: The selected template is inserted to " "the current place of the cursor in the document." msgstr "" "Vervang tekst in document door sjabloon: Het geselecteerde sjabloon wordt op" " de huidige plaats van de cursor in het document toegevoegd." #. type: Plain text #: kraft.adoc:388 msgid "" "Create a new template: Opens a dialog to enter a complete new template for " "the current doc type." msgstr "" "Nieuw sjabloon aanmaken: Opent een dialoogvenster om een compleet nieuw" " sjabloon voor het huidige doc type te creëren." #. type: Plain text #: kraft.adoc:389 msgid "" "Edit the current template: Opens the dialog to edit the currently selected " "template." msgstr "" "Dit sjabloon bewerken: Opent het dialoogvenster om het huidige geselecteerde" " sjabloon te bewerken." #. type: Plain text #: kraft.adoc:390 msgid "" "Delete the current template: Removes the template permanently from the list " "of available templates." msgstr "" "Dit sjabloon verwijderen: Verwijderd het sjabloon permanent van de lijst met" " beschikbare sjablonen." #. type: Plain text #: kraft.adoc:392 msgid "" "Templates with the name _Standard_ are the default templates for the " "document type. They are inserted automatically if a document of this type is " "created." msgstr "" "Sjablonen met de naam _Standard_ zijn de standaard sjablonen voor dat " "document type. Zijn worden automatisch toegevoegd als een document van dit" " type wordt gecreëerd." #. type: Title ==== #: kraft.adoc:394 #, no-wrap msgid "Macros" msgstr "Macro's" #. type: Plain text #: kraft.adoc:397 msgid "" "Both the header- and footer-templates can contain so called macros which are " "replaced with calculated values once the document is rendered to the final " "output format." msgstr "" "In zowel de kop-sjablonen als de voet-sjablonen kunnen macro's aanwezig zijn" " die worden vervangen door uitgerekende waarden op het moment dat het" " document naar het eindresultaat wordt omgezet." #. type: Plain text #: kraft.adoc:399 msgid "The following list of macros are supported:" msgstr "De macro's in de volgende lijst zijn beschikbaar:" #. type: Plain text #: kraft.adoc:401 msgid "" "`DATE_ADD_DAYS()`: Returns the date of the of document plus the " "number of days specified as parameter to the macro." msgstr "" "`DATE_ADD_DAYS()`: Geeft de datum van het document plus het" " aantal dagen dat als parameter voor de macro is opgegeven." #. type: Plain text #: kraft.adoc:402 msgid "" "`ITEM_COUNT_WITH_TAG()`: Returns the amount of items tagged with the " "tag." msgstr "" "`ITEM_COUNT_WITH_TAG()`: Geeft het aantal items dat zijn getagged met de" " tag." #. type: Plain text #: kraft.adoc:403 msgid "" "`NETTO_SUM_PER_TAG()`: Returns the netto sum of all items that are " "tagged with the named tag." msgstr "" "`NETTO_SUM_PER_TAG()`: Geeft de netto som van alle items die zijn" " getagged met de opgegeven tag." #. type: Plain text #: kraft.adoc:404 msgid "" "`BRUTTO_SUM_PER_TAG()`: Returns the brutto sum of all items that are " "tagged with the named tag." msgstr "" "`BRUTTO_SUM_PER_TAG()`: Geeft de brutto som van alle items die zijn" " getagged met de opgegeven tag." #. type: Plain text #: kraft.adoc:405 msgid "" "`VAT_SUM_PER_TAG()`: Returns the pure tax of all items that are tagged " "with the named tag." msgstr "" "`VAT_SUM_PER_TAG()`: Geeft de pure belasting van alle items die zijn" " getagged met de opgegeven tag." #. type: Plain text #: kraft.adoc:406 msgid "" "`IF_ANY_HAS_TAG()` and `END_HAS_TAG`: Includes the text between the two " "macros only if there is at least one item that is tagged with the tag." msgstr "" "`IF_ANY_HAS_TAG()` en `END_HAS_TAG`: Voegt de tekst tussen de macro's" " toe alleen als er tenminste een item is met deze tag." #. type: Plain text #: kraft.adoc:408 msgid "" "As an example, this footer text template can be used to automatically " "generate useful texts:" msgstr "" "Als voorbeeld, deze voettekst-sjabloon kan worden gebruikt om automatisch" " zinvolle teksten te genereren:" #. type: delimited block - #: kraft.adoc:411 #, no-wrap msgid "" "Please pay this invoice until three weeks after the date of the document," " which is the DATE_ADD_DAYS(21).\n" msgstr "" "Betaal deze rekening binnen drie weken na de datum van het document," " wat is DATE_ADD_DAYS(21).\n" #. type: delimited block - #: kraft.adoc:416 #, no-wrap msgid "" "IF_ANY_HAS_TAG(Material)\n" "This invoice lists material in ITEM_COUNT_WITH_TAG(Material) items. The net" " value is NETTO_SUM_PER_TAG(Material),\n" "plus VAT_SUM_PER_TAG(Material) = BRUTTO_SUM_PER_TAG(Material).\n" "END_HAS_TAG\n" msgstr "" "IF_ANY_HAS_TAG(Material)\n" "Deze rekening vermeld het materiaal in ITEM_COUNT_WITH_TAG(Material) items." " De netto" " waarde is NETTO_SUM_PER_TAG(Material),\n" "plus VAT_SUM_PER_TAG(Material) = BRUTTO_SUM_PER_TAG(Material).\n" "END_HAS_TAG\n" #. type: Plain text #: kraft.adoc:419 msgid "We are now ready for the first invoice." msgstr "We zijn nu klaar voor de eerste rekening." #. type: Title == #: kraft.adoc:421 #, no-wrap msgid "Creating Documents" msgstr "De creatie van documenten" #. type: Title === #: kraft.adoc:423 #, no-wrap msgid "The first Invoice" msgstr "De eerste rekening" #. type: Plain text #: kraft.adoc:426 msgid "Open the tab btn:[documents]" msgstr "Open de tab btn:[Documenten]" #. type: Plain text #: kraft.adoc:428 kraft.adoc:533 msgid "Click on btn:[create document]" msgstr "Klik op btn:[Nieuw document]" #. type: Plain text #: kraft.adoc:430 msgid "The window document [creation wizard opens]." msgstr "Het document-venster [creation wizard] opent." #. type: Plain text #: kraft.adoc:432 msgid "Select in document type `invoice`." msgstr "Selecteer in document type `invoice` (rekening)." #. type: Plain text #: kraft.adoc:435 msgid "" "Fill in on the whiteboard content a short text about what the invoice is, " "like: `cut grass and planted tree for mister Jonson`" msgstr "" "Vul op het whiteboard een korte tekst over wat de rekening is, zoals: `gras " "maaien en boom planten voor de heer Jansen` ." #. type: Plain text #: kraft.adoc:437 kraft.adoc:542 msgid "Click on btn:[next]" msgstr "Klik op btn:[Volgende]" #. type: Plain text #: kraft.adoc:439 kraft.adoc:544 msgid "Select on the new window the name and address from the client." msgstr "Selecteer in het volgende venster de naam en adres van de klant." #. type: Plain text #: kraft.adoc:442 kraft.adoc:547 msgid "" "(if the name and address is not there, click then on btn:[new contact] or on " "btn:[edit contact] if you want to edit the contact)" msgstr "" "(Als de naam en adres niet aanwezig zijn, klik dan op btn:[nieuw " "contactpersoon] of op btn:[contactpersoon bewerken] als u het contact wilt " "bewerken)" #. type: Plain text #: kraft.adoc:444 kraft.adoc:549 msgid "Click on btn:[OK]." msgstr "Klik op btn:[OK]." #. type: Plain text #: kraft.adoc:446 msgid "Now opens the window document [items]." msgstr "Nu opent het venster document-items." #. type: Plain text #: kraft.adoc:448 msgid "this window has 2 tabs and the 3 buttons on the top:" msgstr "Dit venster heeft bovenaan 2 tabs en 3 knoppen:" #. type: Plain text #: kraft.adoc:450 kraft.adoc:555 msgid "btn:[Add item...]," msgstr "btn:[Item toevoegen...]," #. type: Plain text #: kraft.adoc:451 kraft.adoc:556 msgid "btn:[Add discount item]," msgstr "btn:[Korting geven]," #. type: Plain text #: kraft.adoc:452 kraft.adoc:557 msgid "btn:[Show templates]." msgstr "btn:[Document tonen]." #. type: Plain text #: kraft.adoc:456 msgid "" "In the left tab you can see all the items that we want to place on the " "invoice, on the right tab we see the text from the header, the total price " "and the footer." msgstr "" "Aan de linkerkant kunt u alle items zien die we op de rekening willen " "plaatsen, aan de rechterkant zien we de tekst van de koptekst, de totale " "prijs en de voettekst." #. type: Plain text #: kraft.adoc:460 msgid "" "If you click on the text of the header or the footer on the right side then " "the window changes in such a way that you can edit the header or the footer." msgstr "" "Als u op de tekst van de koptekst of van de voettekst aan de rechterkant " "klikt dan verandert het venster zodanig dat u de koptekst of de voettekst " "kan bewerken." #. type: Plain text #: kraft.adoc:463 msgid "" "Adapt the header and the footer to your situation, on the footer you can " "place a text: `We make your garden-dream come to reality.`." msgstr "" "Pas de koptekst en de voettekst aan naar uw situatie, in de voettekst kan u " "bijvoorbeeld een tekst plaatsen als: Wij maken uw tuindroom werkelijkheid." #. type: Plain text #: kraft.adoc:465 kraft.adoc:559 msgid "Click on the button btn:[Show templates]." msgstr "Klik op de knop btn:[Document tonen]." #. type: Plain text #: kraft.adoc:469 msgid "" "The right tab changes and show now the earlier made templates, we select in " "the group Work, the subgroup Plant tree and click then on the button with " "the to the left pointing arrow on the bottom side." msgstr "" "De rechter tab verandert en toont nu de eerder gemaakte sjablonen, we " "selecteren in de map 'Work', de submap 'Boom planten' en klikken op de knop " "met de naar links wijzende pijl aan de onderkant." #. type: Plain text #: kraft.adoc:471 kraft.adoc:565 msgid "A new window [Create Item from Template] opens." msgstr "Een nieuw venster [Item van sjabloon creëren] opent." #. type: Plain text #: kraft.adoc:474 msgid "" "Because we have planted 2 trees, we go to the field [insert] and change this " "to 2 pcs." msgstr "" "Omdat we 2 bomen hebben geplant, gaan we naar het veld [invoegen] en " "veranderen dit naar 2 pcs (in het Nederlands stk)." #. type: Plain text #: kraft.adoc:477 msgid "" "Click on btn:[OK] for saving the result or on btn:[cancel] for discarding " "the result." msgstr "" "Klik op btn:[OK] om het resultaat op te slaan of op btn:[Annuleren] om het " "resultaat te verwijderen." #. type: Plain text #: kraft.adoc:479 kraft.adoc:573 kraft.adoc:584 msgid "The window close and we go back to the main window." msgstr "Het venster sluit en we gaan terug naar het hoofdvenster." #. type: Plain text #: kraft.adoc:483 msgid "" "We click again on btn:[Show templates] and select this time `cut grass`, we " "click again on the button with the arrow, in the opened window we select " "that the grass-field was 24 square meter." msgstr "" "We klikken opnieuw op btn:[Document tonen] en selecteren deze keer `gras " "maaien`, we klikken opnieuw op de knop met de pijl, in het geopende venster " "stellen we in dat het grasveld 24 vierkante meter was." #. type: Plain text #: kraft.adoc:486 kraft.adoc:571 kraft.adoc:604 kraft.adoc:640 msgid "" "Click on btn:[OK] for saving the result or on btn:[Cancel] for discarding " "the result." msgstr "" "Klik op btn:[OK] om het resultaat op te slaan of op btn:[Annuleren] om het " "resultaat te verwijderen." #. type: Plain text #: kraft.adoc:488 #| msgid "" #| "We add now manually an item by clicking on the button btn:[Add item…] and " #| "the window [create new item] opens." msgid "" "We add now manually an item by clicking on the button btn:[Add item…] and " "the window [create new item] opens." msgstr "" "We voegen nu handmatig een item toe door te klikken op de knop btn:[Item " "toevoegen…] waarna het venster [Item creëren] opent." #. type: Plain text #: kraft.adoc:492 msgid "" "Because we have delivered a special tree, we fill here in the name of the " "special tree `liguster`, at the field insert we fill in the number of the " "special trees that we have delivered and the price of them." msgstr "" "Omdat we een speciale boom hebben geleverd, vullen we hier de naam van de " "speciale boom `liguster` in, in het veld invoegen vullen we het aantal van " "de speciale boom die we geleverd hebben in en de prijs daarvan." #. type: delimited block _ #: kraft.adoc:498 msgid "" "WARNING: Remind that in the catalog we can add a profit on the price of the " "material, in the invoice and in the offer we can not add a profit on the " "price of the material." msgstr "" "Pas op: verlies niet uit het oog dat we in de catalogus een winst op de " "prijs van het materiaal kunnen toevoegen, in de rekening en in de offerte " "kunnen we geen winst aan de prijs van het materiaal toevoegen." #. type: Plain text #: kraft.adoc:501 msgid "We have now an invoice with 3 items." msgstr "We hebben nu een rekening met 3 items." #. type: Plain text #: kraft.adoc:504 msgid "" "Click on btn:[OK] for saving the invoice or on btn:[Cancel] for discarding " "the invoice." msgstr "" "Klik op btn:[OK] om de rekening op te slaan of op btn:[Annuleren] om de " "rekening te verwijderen." #. type: Plain text #: kraft.adoc:506 msgid "We click on btn:[OK] and save the result." msgstr "We klikken op btn:[OK] en slaan het resultaat op." #. type: Plain text #: kraft.adoc:508 msgid "Your first invoice is now ready for sending." msgstr "Uw eerste rekening is nu klaar voor verzending." #. type: Plain text #: kraft.adoc:511 msgid "" "In the window documents we see our first invoice, notice that this document " "has a document number which we can see on the left side." msgstr "" "In het venster met documenten zien we onze eerste rekening, merk op dat dit " "document een documentnummer heeft die we aan de linkerkant zien." #. type: Plain text #: kraft.adoc:514 msgid "" "On top of the window with all the invoices we see the button [Print " "Document], on which we click." msgstr "" "Bovenaan het venster met alle rekeningen zien we de knop btn: [Print " "Document], waar we op klikken." #. type: Plain text #: kraft.adoc:517 msgid "" "From the invoice will now a PDF be made which we can print on paper or send " "by email to the client." msgstr "" "Van de rekening zal nu een PDF worden gemaakt die we op papier kunnen " "uitprinten of per email naar de klant kunnen versturen." #. type: Plain text #: kraft.adoc:519 msgid "After this we are going to create a offer for some work in a garden." msgstr "Hierna gaan we een offerte maken voor wat werk in een tuin." #. type: Title === #: kraft.adoc:521 #, no-wrap msgid "Creating an Offer" msgstr "Een offerte creëren" #. type: Plain text #: kraft.adoc:524 msgid "" "The client has asked to plant a tree, we will offer 3 different trees which " "we can plant." msgstr "" "De klant heeft gevraagd of we een boom kunnen planten, we bieden 3 " "verschillende bomen aan die we kunnen planten." #. type: Plain text #: kraft.adoc:527 msgid "" "Beside this, we have seen that there is a lifeless three, which we will " "offer to remove as extra work. image:create_new_doc.png[Numbercycles," "float=\"right\"]" msgstr "" "Daarnaast hebben we gezien dat er een dode boom is, waarvoor we een aanbod " "doen om deze als extra werk te verwijderen. image:create_new_doc." "png[Numbercycles,float=\"right\"]" #. type: Plain text #: kraft.adoc:529 msgid "" "For the total price we do not want to show the price of the removal of the " "lifeless tree and we want for the total price only to show the price of one " "tree and not three." msgstr "" "De totale prijs willen we exclusief de prijs voor de verwijdering van de " "dode boom en alleen de prijs van een boom en niet van drie bomen." #. type: Plain text #: kraft.adoc:531 msgid "Open again the tab btn:[documents]." msgstr "Open opnieuw de tab btn:[Documenten]." #. type: Plain text #: kraft.adoc:535 msgid "The window _Document Creation Wizard_ opens." msgstr "Het document-venster [creation wizard] opent." #. type: Plain text #: kraft.adoc:537 msgid "select in btn:[document type] > btn:[Offer]." msgstr "Selecteer in btn: [document type]>btn:[offer]." #. type: Plain text #: kraft.adoc:540 msgid "" "Fill in on the whiteboard content a short text about what the offer is, " "like: `plant one tree and removal of lifeless tree`" msgstr "" "Vul op het whiteboard een korte tekst over waarover de offerte gaat, zoals: " "`een boom planten en verwijding van dode boom` ." #. type: Plain text #: kraft.adoc:551 msgid "Now the window [edit document] opens." msgstr "Nu opent het venster [Document bewerken]." #. type: Plain text #: kraft.adoc:553 msgid "This window has 2 tabs and the 3 buttons on the top:" msgstr "Dit venster heeft bovenaan 2 tabs en 3 knoppen:" #. type: Plain text #: kraft.adoc:563 msgid "" "The right tab changes and show now the earlier made templates, we select in " "the group `Work`, the subgroup `Plant tree` and click then on the button " "with the to the left pointing arrow on the bottom side." msgstr "" "De rechter tab verandert en toont nu de eerder gemaakte sjablonen, we " "selecteren in de map 'Work', de submap 'Boom planten' en klikken op de knop " "met de naar links wijzende pijl aan de onderkant." #. type: Plain text #: kraft.adoc:568 msgid "" "Because we want to plant 1 tree, we go to the field [insert] and keep this " "on 1 pcs." msgstr "" "Omdat we 1 boom willen planten, gaan we naar het veld [invoegen] en houden " "dit op 1 pcs (in het Nederlands stk)." #. type: Plain text #: kraft.adoc:576 msgid "" "We click on the button btn:[Show templates] and this time we select in " "catalog Material" msgstr "" "We klikken op de knop btn:[Document tonen] en selecteren deze keer de " "catalogus Material." #. type: Plain text #: kraft.adoc:580 msgid "" "The material-catalog opens, and we can select in the chapter `trees` the " "subchapter `loaf trees` in which we select the `apple tree` which we made " "earlier." msgstr "" "De material-catalogus opent, en we kunnen in de map `Bomen` de submap " "`Bladbomen` selecteren waar we de `appelboom` selecteren die we eerder " "hebben gemaakt." #. type: Plain text #: kraft.adoc:582 msgid "" "Click on we btn:[OK] for saving the result or on btn:[cancel] for discarding " "the result." msgstr "" "Klik op btn:[OK] om het resultaat op te slaan of op btn:[Annuleren] om het " "resultaat te verwijderen." #. type: Plain text #: kraft.adoc:586 #| msgid "We add now manually an item by clicking on the button `Add item…`." msgid "We add now manually an item by clicking on the button `Add item…`." msgstr "" "We voegen nu handmatig een item toe door te klikken op de knop `Item " "toevoegen...'." #. type: Plain text #: kraft.adoc:588 msgid "the window [create new item] opens." msgstr "Het venster [Nieuw item aanmaken] opent." #. type: Plain text #: kraft.adoc:590 msgid "" "We want that the client can make a choice from an apple, a pear tree and the " "liguster." msgstr "" "We willen dat de klant een keuze kan maken tussen een appelboom, een " "perenboom en de liguster." #. type: Plain text #: kraft.adoc:592 msgid "Therefor we are going to add also a pear tree manually." msgstr "Daarom gaan we een perenboom handmatig toevoegen." #. type: Plain text #: kraft.adoc:594 #| msgid "" #| "We click on the button btn:[Add item…] and the window [create new item] " #| "opens." msgid "" "We click on the button btn:[Add item…] and the window [create new item] " "opens." msgstr "" "We klikken op de knop btn:[Item toevoegen…] waarna het venster [Item " "creëren] opent." #. type: Plain text #: kraft.adoc:598 msgid "" "We fill here in the name of the tree `Pear tree`, at the field insert we " "fill in the number of the special trees that we have delivered and the price " "of them." msgstr "" "We vullen hier de naam van de boom `Perenboom` in, en in veld invoegen " "vullen we het aantal van de speciale bomen in die we kunnen leveren en de " "prijs daarvan." #. type: Plain text #: kraft.adoc:601 msgid "" "We want add this to the material catalog for future use, therefor we select " "also [select this item as template for future documents] and we select in " "[save in chapter]`trees`." msgstr "" "We willen dit aan de materiaalcatalogus toevoegen voor toekomstig gebruik, " "daarom selecteren we ook [Dit item als sjabloon bewaren voor latere " "documenten] en selecteren we in btn:[opslaan in map] 'bomen'." #. type: Plain text #: kraft.adoc:606 msgid "We does this again but then for the liguster." msgstr "We doen dit ook voor de liguster." #. type: Plain text #: kraft.adoc:608 msgid "We have now 3 items with trees in the offer." msgstr "We hebben nu 3 items met bomen in de offerte." #. type: Plain text #: kraft.adoc:610 msgid "" "As last item we add an item with `remove tree` with 0,5 hour for 32 euro." msgstr "" "En tenslotte voegen we een item toe met 'boom verwijderen' met 0,5 uur voor " "32 euro." #. type: Plain text #: kraft.adoc:612 msgid "On the left side of an item we can see 2 buttons:" msgstr "Links van het item zien we 2 knoppen:" #. type: Plain text #: kraft.adoc:614 msgid "a button with a flag and a button with what looks like a page." msgstr "Een knop met een vlag en een knop met wat lijkt op een pagina." #. type: Plain text #: kraft.adoc:617 msgid "" "We select the upper button with the page after which opens a context-menu " "with the items:" msgstr "" "We selecteren de bovenste knop met de pagina waarna een contextmenu opent " "met de items:" #. type: Plain text #: kraft.adoc:619 msgid "image:context1.png[Context menu,float=\"right\"]" msgstr "image:context1.png[Context menu,float=\"right\"]" #. type: Plain text #: kraft.adoc:629 #, no-wrap msgid "" " [Item kind]->[Normal]\n" " [Item kind]>[Alternative]\n" " [Item kind]>[On demand]\n" " [Tax]\n" " [Move up]\n" " [Move down]\n" " [Lock item]\n" " [Unlock item]\n" " [Delete item]\n" msgstr "" " [ Soort item]->[Normaal]\n" " [Soort item]>[Alternatief]\n" " [Soort item]>[Op verzoek]\n" " [Belasting]\n" " [Omhoog verplaatsen]\n" " [Omlaag verplaatsen]\n" " [Item vastzetten]\n" " [Item ontgrendelen]\n" " [Verwijder item]\n" #. type: Plain text #: kraft.adoc:632 msgid "" "We choose here [Item kind] and change for `pear tree` from [normal] to " "[alternative]." msgstr "" "We selecteren hier [Soort item] en veranderen dit voor `perenboom` van " "[normaal] naar [alternatief]." #. type: Plain text #: kraft.adoc:635 msgid "" "We do this also for [liguster] and for [remove tree] we change this from " "[normal] to [on demand]." msgstr "" "We doen dit ook voor [liguster] en voor [Boom verwijderen] veranderen we dit " "van [normaal] naar [Op verzoek]." #. type: Plain text #: kraft.adoc:637 msgid "image:context2.png[Context menu,float=\"right\"]" msgstr "image:context2.png[Context menu,float=\"right\"]" #. type: Plain text #: kraft.adoc:643 msgid "" "We want to see the result and therefor we click on the button [show " "document]." msgstr "" "We willen het resultaat bekijken en daarom klikken we op de knop btn:" "[Document tonen]." #. type: Plain text #: kraft.adoc:649 msgid "" "We see now that the prize of the pear tree, the liguster and the removal of " "the tree is not used for the total prize. When we are happy with the result, " "we can click on the button btn:[close] after which we click on the button " "btn:[Print Document] for making a PDF what we can print out or send to the " "client." msgstr "" "We zien nu dat de prijs voor de perenboom, de liguster en het verwijderen " "van de boom niet is gebruikt voor de totale prijs. Als we tevreden zijn met " "het resultaat, dan klikken we op de knop btn:[OK] waarna we klikken op de " "knop btn:[Document afdrukken] voor het maken van een PDF die we kunnen " "uitprinten of naar de klant kunnen sturen." #. type: Plain text #: kraft.adoc:652 msgid "" "After your first invoice is now your first offer now also ready for sending." msgstr "" "Na uw eerste rekening is nu ook uw eerste offerte klaar voor verzending." #. type: Title === #: kraft.adoc:654 #, no-wrap msgid "Creating an Acceptance of Order" msgstr "Een Acceptance of order (opdrachtbevestiging) aanmaken" #. type: Plain text #: kraft.adoc:657 msgid "" "The document type \"Acceptance of Order\" is sent subsequently to an offer." msgstr "" "Het documenttype \"Acceptance of Order\" (opdrachtbevestiging) wordt " "verstuurd als vervolg op een offerte." #. type: Plain text #: kraft.adoc:659 msgid "image:acceptance_o_o_context.png[Numbercycles,float=\"right\"]" msgstr "image:acceptance_o_o_context.png[Numbercycles,float=\"right\"]" #. type: Plain text #: kraft.adoc:662 msgid "" "When a client has made a request, we will send an offer in wich we describe " "which items we will deliver. Hopefully the client will give an order for " "the work." msgstr "" "Als een klant een verzoek heeft gemaakt, dan zullen we een offer (offerte) " "sturen waarin we beschrijven welke items we zullen gaan leveren. Hopelijk " "zal de klant een order geven voor het werk." #. type: Plain text #: kraft.adoc:666 msgid "" "It is a good practice to respond on the order with an \"Acceptance of " "order\" in which we describe all the items we will deliver. We can make the " "\"Acceptance of order\" on the same way as we made the invoice or the offer " "by selecting each item and correcting the number of delivery. This takes " "time and we can make errors by forgetting items or filling an incorrect " "number." msgstr "" "Het is een goede gewoonte om op de order te reageren met een \"Acceptance of " "order\" (opdrachtbevestiging) waarin we alle items beschrijven die we zullen " "gaan leveren. We kunnen de \"Acceptance of order\" op dezelfde manier maken " "als waarmee we de invoice (rekening) of de offer (offerte)hebben gemaakt " "door elk item te selecteren en het aantal te leveren aan te passen. Dit kost " "tijd en we kunnen fouten maken door items te vergeten of een incorrect " "aantal in te vullen." #. type: Plain text #: kraft.adoc:668 msgid "" "It can be done quicker by selecting the offer in the list and selecting btn:" "[Create Followup Document] from either the context menu or the main menu." msgstr "" "U kunt dit sneller doen door de offer (offerte) in de lijst te selecteren en " "vervolgens btn:[Creëer opvolg document] in het context menu of in het " "hoofdmenu te selecteren." #. type: Plain text #: kraft.adoc:670 msgid "We have now in documenttype the choice from:" msgstr "We hebben nu als documenttype de keuze uit:" #. type: Plain text #: kraft.adoc:676 #, no-wrap msgid "" " [Acceptance of order]\n" " [Invoice]\n" " [Partial Invoice]\n" " [final Invoice]\n" " [Progress Payment Invoice]\n" msgstr "" " [Acceptance of order]\n" " [Invoice]\n" " [Partial Invoice]\n" " [final Invoice]\n" " [Progress Payment Invoice]\n" #. type: Plain text #: kraft.adoc:678 msgid "image:followup_1.png[Folloup document,float=\"right\"]" msgstr "image:followup_1.png[Folloup document,float=\"right\"]" #. type: Plain text #: kraft.adoc:682 msgid "" "We select here \"Acceptance of order\". We have now a copy from the offer " "as an Acceptance of order (do not forget to adapt Alternative Delivery items " "and on demand items.)" msgstr "" "We selecteren nu \"Acceptance of order\". We hebben nu een kopie van de " "offerte als een Acceptance of order (vergeet niet om de alternatief items en " "de op verzoek items aan te passen.)" #. type: Plain text #: kraft.adoc:684 msgid "image:followup_2.png[Folloup document,float=\"right\"]" msgstr "image:followup_2.png[Folloup document,float=\"right\"]" #. type: Plain text #: kraft.adoc:688 msgid "" "You can do this also for the creation of the invoice as a followup for " "Acceptance of order. Each document type has a specific list of follow up " "documents. It is a good practice to describe on the invoice precisely what " "was delivered." msgstr "" "U kunt dit ook doen voor de creatie van de invoice (rekening) als opvolging " "van de opdrachtbevestiging. Elk documenttype heeft een specifieke lijst met " "opvolg-documenten. Het is een goede gewoonte om op de rekening precies te " "omschrijven wat is geleverd." #. type: Title == #: kraft.adoc:690 #, no-wrap msgid "Customization" msgstr "Kraft naar wens aanpassen" #. type: Plain text #: kraft.adoc:694 msgid "" "Kraft can be customized in most of the graphical user interface and in " "particular in the output it generates." msgstr "" "Een groot gedeelte van de grafische interface van Kraft kan aangepast " "worden, met name de uitvoer die het genereert." #. type: Title === #: kraft.adoc:695 #, no-wrap msgid "Output Document Customization" msgstr "Documentuitvoer aanpassen" #. type: Plain text #: kraft.adoc:698 msgid "" "To create PDF output documents, the document data that was edited in the " "Kraft app is filled into a template. The template defines how the output " "document looks like, ie. by font settings, placing of elements and such." msgstr "" "Om PDF's te creëren, moet een sjabloon worden gevuld met de document data " "die in Kraft is gecreëerd. De sjabloon definieert hoe de het resulterende " "document eruit komt te zien, d.w.z de ingestelde lettertypes, de plaats van " "de elementen en dergelijke." #. type: Plain text #: kraft.adoc:700 msgid "" "The file that is assembled from data and the template is converted to PDF " "using a special document creation script. All that is started automatically " "by Kraft if a document should be printed." msgstr "" "Het bestand dat is samengesteld uit een combinatie van de data en de " "sjabloon wordt geconverteerd naar een PDF met een speciaal document creation " "script. Dit alles wordt automatisch door Kraft gestart als een document " "uitgeprint moet worden." #. type: Plain text #: kraft.adoc:702 msgid "" "Each document type in Kraft can have it's own template that is used to " "create a PDF. Which one can be set in the Settings dialog for document types." msgstr "" "In Kraft kan elk documenttype zijn eigen sjabloon hebben voor de creatie van " "een PDF. Welk wordt gebruikt kan u instellen in het instellingsvenster voor " "documenttypes." #. type: Title ==== #: kraft.adoc:703 #, no-wrap msgid "WeasyPrint Documents" msgstr "WeasyPrint Documenten" #. type: Plain text #: kraft.adoc:706 msgid "" "Kraft still ships with the old ReportLab based converter, but that will be " "deprecated the future. The WeasyPrint based system is the future. It is a " "recommended to port existing templates." msgstr "" "Bij Kraft wordt nog steeds de oude op ReportLab gebaseerde converter" " meegeleverd, maar dit zal in de toekomst veranderen. Het op de WeasyPrint" " gebaseerde systeem zal in de toekomst uitsluitend gebruikt worden. Het wordt" " aanbevolen om de bestaande sjablonen aan te passen." #. type: Plain text #: kraft.adoc:708 msgid "" "With https://weasyprint.org[WeasyPrint] Kraft uses a very powerful generator " "that makes it very easy to create highly customized documents with great " "quality." msgstr "" "Kraft gebruikt met https://weasyprint.org[WeasyPrint] een zeer krachtige" " generator waarmee het erg makkelijk is om documenten te creëren die" " intensief naar naar wens aangepast kunnen worden en toch een goede kwaliteit" " hebben." #. type: Plain text #: kraft.adoc:710 msgid "" "WeasyPrint converts a html file to PDF. It is integrating a cascading " "stylesheet (CSS) file which has a huge impact on the PDF document's look." msgstr "" "WeasyPrint converteert een html-bestand naar PDF. Daarbij wordt een cascade " "stylesheet (CSS)-bestand geïntegreerd wat een grote invloed heeft op het" " uiterlijk van het PDF-document." #. type: Plain text #: kraft.adoc:712 msgid "" "The html- and CSS input file for WeasyPrint is built from the Kraft template " "file." msgstr "" "De html- en CSS invoerbestanden voor WeasyPrint worden gecreëerd met de hulp" " van het Kraft sjabloonbestand." #. type: Plain text #: kraft.adoc:714 #| msgid "" #| "To use a WeasyPrint based template for a document simply create a " #| "template file and save it with the extension *.gtmpl*. With that file " #| "extension Kraft automatically uses WeasyPrint and also the Grantlee " #| "templating for rendering." msgid "" "To enable the use of WeasyPrint for a document type in Kraft, simply create " "a weasyprint compatible template file and save it with the extension *." "gtmpl*. Based on the file extension Kraft automatically uses WeasyPrint and " "the Grantlee templating engine for rendering." msgstr "" "Om voor een document een op WeasyPrint gebaseerde sjabloon te gebruiken, " "creëert u eenvoudig een sjabloonbestand en slaat deze op met de extensie *." "gtmpl*. Met deze bestand-extensie gebruikt Kraft automatisch WeasyPrint met " "daarbij Grantlee sjablonen voor de rendering." #. type: Plain text #: kraft.adoc:716 #| msgid "" #| "From version 0.95 on Kraft ships with an example document in the " #| "Grantlee- and WeasyPrint format. It can be found at `/usr/share/kraft/" #| "reports/invoice.gtmpl` or https://github.com/dragotin/kraft/blob/master/" #| "reports/invoice.gtmpl[online on Github]." msgid "" "From version 0.95 on Kraft ships with an example template in the Grantlee- " "and WeasyPrint format. It can be found at `/usr/share/kraft/reports/invoice." "gtmpl` or https://github.com/dragotin/kraft/blob/master/reports/invoice." "gtmpl[online on Github]. An example CSS file `kraft.css` (https://github.com/" "dragotin/kraft/blob/master/reports/kraft.css[on Github]) is shipped as a " "good starting point for adoption." msgstr "" "Vanaf versie 0.95 van Kraft vindt u een voorbeeld document in het Grantlee- " "en WeasyPrint formaat. U kunt het vinden in `/usr/share/kraft/reports/" "invoice.gtmpl` of https://github.com/dragotin/kraft/blob/master/reports/" "invoice.gtmpl[online op Github]. Een voorbeeld CSS-bestand `kraft.css`" " (https://github.com/" "dragotin/kraft/blob/master/reports/kraft.css[on Github]) wordt meegeleverd" " zodat u dit als startpunt kan gebruiken om het naar wens aan te passen." #. type: Title ==== #: kraft.adoc:717 #, no-wrap msgid "Template Variables" msgstr "Sjabloon variabelen" #. type: Plain text #: kraft.adoc:720 #| msgid "" #| "To generate the PDF, Kraft has to transfer data from the document you " #| "have been working on in Kraft to the input document that is processed to " #| "an PDF utilising WeasyPrint. For that, Kraft uses a text template. In " #| "that, Kraft replaces variables with the actual values." msgid "" "To generate the PDF, Kraft has to transfer data from the document you have " "been working on to the input file that is processed to a PDF. For that, " "Kraft uses a text template in which Kraft replaces variables with the actual " "values." msgstr "" "Om de PDF te genereren, moet Kraft de data van het document waaraan u in" " Kraft heeft " "gewerkt overbrengen naar het input-document dat met de hulp van " "Weasyprint wordt verwerkt tot een PDF. Daarvoor gebruikt Kraft een" " tekstsjabloon. " "Daarin vervangt Kraft variabelen door de daadwerkelijke waarden." #. type: Plain text #: kraft.adoc:722 msgid "" "For example, the tag `{{ doc.doctype }}` is replaced with the current " "document type during the generating process." msgstr "" "De tag `{{ doc.doctype }}` wordt bijvoorbeeld tijdens het genereer proces" " vervangen door het huidige document type." #. type: Plain text #: kraft.adoc:724 msgid "" "The syntax is based on the Django syntax for templates described in the " "https://docs.djangoproject.com/en/3.1/topics/templates/[the docs]." msgstr "" "De syntax is gebaseerd op de Django syntax voor sjablonen zoals het " "beschreven wordt in https://docs.djangoproject.com/en/3.1/topics/templates/" "[de documentatie]." #. type: Title ==== #: kraft.adoc:725 #, no-wrap msgid "EPC QR Code" msgstr "EPC QR Code" #. type: Plain text #: kraft.adoc:728 msgid "" "With Weasyprint based PDF generation Kraft supports the https://en.wikipedia." "org/wiki/EPC_QR_code[EPC QR Code] which implements a European standard for " "payments by computer and mobile devices." msgstr "" "Met de door Weasyprint gegenereerde PDF kan Kraft overweg met de" " https://nl.wikipedia.org/wiki/EPC_betaling_QR-Code[EPC QR Code] wat een" " implementatie is van een Europese" " standaard voor betalingen via de computer en mobiele apparaten." #. type: Plain text #: kraft.adoc:730 msgid "" "In Germany it is also known as _Giro Code_, in Belgium as _Bancontact QR_, " "in the Netherlands as _iDEAL QR-code_ and in Spain it is also known as " "_Bizum QR-code_." msgstr "" "In Duitsland is het ook bekend als _Giro Code_, " "in België als _Bancontact QR_, " "in Nederland als _iDEAL QR-code_ " "en in Spanje is het ook bekend als _Bizum QR-code_." #. type: Plain text #: kraft.adoc:732 msgid "" "In Germany it is accepted by the _Giro Code_ and in Holland it is accepted " "by the official https://www.ideal.nl/consumenten/ideal-app/[_iDEAL QR-code_] " "app." msgstr "" "In Duitsland wordt het gebruikt door de _Giro Code_ en in Nederland wordt het" " geaccepteerd door de officiële https://www.ideal.nl/consumenten/ideal-app/[_" "iDEAL QR-code_] app." #. type: Plain text #: kraft.adoc:734 msgid "" "In Belgium and Holland it is accepted by the apps of many banks, and in " "Austria and Finland it is accepted by the apps of all banks." msgstr "" "In België en Nederland wordt het geaccepteerd door de apps van vele banken," " en in Oostenrijk en Finland wordt het geaccepteerd door de apps van alle" " banken." #. type: Plain text #: kraft.adoc:736 msgid "" "To use the EPC QR code on the invoice printout, the bank account information " "has to be added to own identity settings dialog in Kraft. The giro code is " "current only generated for documents with the document type `Rechnung`." msgstr "" "Om de EPC QR code op de afgedrukte rekening te gebruiken,moet de informatie" " over de bankrekening toegevoegd worden aan het dialoogvenster in Kraft over" " de eigen identiteit. De iDEAL QR-code wordt op dit moment alleen gegenereerd" " voor documenten van het document type `Rechnung`." #. type: Plain text #: kraft.adoc:738 msgid "" "To include the generated EPC QR Code into the PDF document, the Weasyprint " "template needs to contain a snippet like this:" msgstr "" "Om de gegenereerde EPC QR Code op het PDF document te krijgen, moet aan het" " Weasyprint sjabloon een code zoals hieronder toegevoegd worden:" #. type: delimited block - #: kraft.adoc:747 #, no-wrap msgid "" " {%if doc.isInvoice and epcqrcode.valid %}\n" "

    \n" " \"EPC"\n" " Dieser QR Code ermöglicht einfaches, sicheres und schnelles Begleichen" " dieser Rechnung via GiroPay:\n" " Diesen Code mit dem Smartphone scannen und Überweisung per Banking App" " aufgeben.\n" "

    \n" " {% endif %}\n" msgstr "" " %n" " {%if doc.isInvoice and epcqrcode.valid %}\n" "

    \n" " \"EPC"\n" " Deze QR code maakt een eenvoudige, veilige en snelle betaling aan deze" " rekening via iDEAL mogelijk:\n" " Scan deze code met de smartphone en betaal per bank app.\n" "

    \n" " {% endif %}\n" "```\n" #. type: Title == #: kraft.adoc:751 #, no-wrap msgid "Menus and Shortcuts" msgstr "Menu's en sneltoetsen" #. type: Title === #: kraft.adoc:753 #, no-wrap msgid "Main Application Menu" msgstr "Hoofdvenster van het programma" #. type: Title ==== #: kraft.adoc:756 #, no-wrap msgid "The File Menu" msgstr "Het menu Bestand" #. type: Plain text #: kraft.adoc:761 #, no-wrap msgid "" " [File]>[Quit]\n" " [Ctrl]+[Q]\n" " Quits the application.\n" msgstr "" " [Bestand]>[Afsluiten]\n" " [Ctrl]+[Q]\n" " Sluit het programma af.\n" #. type: Title ==== #: kraft.adoc:763 #, no-wrap msgid "The Document Menu" msgstr "Het document-menu" #. type: Plain text #: kraft.adoc:769 #, no-wrap msgid "" " [Document]>[Show Document]\n" " [Ctrl]+[R]\n" " Opens a window with the selected document for showing it.\n" msgstr "" " [Document]>[Document tonen]\n" " [Ctrl]+[R]\n" " Opent een venster met het geselecteerde document om deze te tonen.\n" #. type: Plain text #: kraft.adoc:773 #, no-wrap msgid "" " [Document]>[Edit Document]\n" " [Ctrl+O]\n" " Opens a window with the selected document for editing it.\n" msgstr "" " [Document]>[Document bewerken]\n" " [Ctrl+O]\n" " Opent een venster met het geselecteerde document voor bewerking.\n" #. type: Plain text #: kraft.adoc:777 #, no-wrap msgid "" " [Document]>[Open Archived document]\n" " [Ctrl]+[A]\n" " Opens an archived document.\n" msgstr "" " [Document]>[Open gearchiveerd document]\n" " [Ctrl]+[A]\n" " Opent een gearchiveerd document.\n" #. type: Plain text #: kraft.adoc:780 #, no-wrap msgid "" " [Document]>[Create Document]\n" " Opens a window with a wizard for creating a new client-document.\n" msgstr "" " [Document]>[Nieuw document]\n" " Opent een venster met een wizard voor de creatie van een nieuw" " client-document.\n" #. type: Plain text #: kraft.adoc:784 #, no-wrap msgid "" " [Document]>[Copy Document]\n" " Makes a copy of the selected client-document to a new client-document\n" " which can belong to an other client or an other documenttype.\n" msgstr "" " [Document]>[Kopieer Document]\n" " Maakt een kopie van het geselecteerde client-document naar een nieuw" " client-document\n" " Deze kan bij een andere klant horen of zelfs een ander documenttype zijn.\n" #. type: Plain text #: kraft.adoc:787 #, no-wrap msgid "" " [Document]>[Follow Document]\n" " Opens the selected client-document for editing.\n" msgstr "" " [Document]>[Creëer een opvolg Document]\n" " Kopieert de inhoud van een offerte naar een order-acceptatie of een" " rekening.\n" #. type: Plain text #: kraft.adoc:791 #, no-wrap msgid "" " [Document]>[Print document]\n" " Makes a PDf from the selected client-document for to be mailed or\n" " printed.\n" msgstr "" " [Document]>[Document afdrukken]\n" " Creëert een PDF van het geselecteerde client-document zodat u deze kan" " emaillen of\n" " uitprinten.\n" #. type: Plain text #: kraft.adoc:795 #, no-wrap msgid "" " [Document]>[Mail document]\n" " [Ctrl]+[M]\n" " Mails a document.\n" msgstr "" " [Document]>[Verzend document]\n" " [Ctrl]+[M]\n" " Verzend een document per email.\n" #. type: Title ==== #: kraft.adoc:798 #, no-wrap msgid "The Settings menu" msgstr "Het instellingen-menu" #. type: Plain text #: kraft.adoc:804 #, no-wrap msgid "" " [Settings]>[Edit Tag Templates]\n" " [Ctrl]+[E]\n" " Opens a window where you add, edit or translate the tags (like work,\n" " material, plants or discounts).\n" msgstr "" " [Voorkeuren]>[Tag sjabloon bewerken]\n" " [Ctrl]+[E]\n" " Opent een venster waarin u tags (zoals work,material, plants of discounts)\n" " kunt toevoegen, bewerken of vertalen.\n" #. type: Plain text #: kraft.adoc:808 #, no-wrap msgid "" " [Settings]>[Redo initial setup]\n" " [Ctrl+R]\n" " Redoes the initial setup. After this, a restart of Kraft is required.\n" msgstr "" " [Voorkeuren]>[De initiële aanmaak opnieuw uitvoeren]\n" " [Ctrl+R]\n" " Voert de basisconfiguratie opnieuw uit. Hierna is een herstart van Kraft" " nodig.\n" #. type: Plain text #: kraft.adoc:812 #, no-wrap msgid "" " [Settings]>[Showed toolbars]\n" " Here you can decide if the `main toolbar` and the toolbar `Document" " Actions`\n" " are shown.\n" msgstr "" " [Voorkeuren]>[Werkbalken]\n" " Hier kunt u beslissen of de `hoofdwerkbalk` en de werkbalk `Document" " acties`\n" " worden getoond.\n" #. type: Plain text #: kraft.adoc:816 #, no-wrap msgid "" " [Settings]>[Configure Kraft]\n" " [Ctrl]+[Shft]+[,]\n" " Here you can configure Kraft.\n" msgstr "" " [Voorkeuren]>[Instellingen]\n" " [Ctrl]+[Shft]+[,]\n" " Hier kunt u Kraft instellen.\n" #. type: Title === #: kraft.adoc:817 #, no-wrap msgid "Document Edit Window" msgstr "Het document-bewerkingsvenster." #. type: Title ==== #: kraft.adoc:820 #, no-wrap msgid "The context Menu" msgstr "Het contextmenu" #. type: Plain text #: kraft.adoc:824 #, no-wrap msgid "" " [Context]>[Item kind]\n" " change the status from this item between\n" msgstr "" " [Context]>[Soort item]\n" " wijzigt de status van dit item tussen\n" #. type: Plain text #: kraft.adoc:825 #, no-wrap msgid "Normal\n" msgstr "Normaal\n" #. type: Plain text #: kraft.adoc:826 #, no-wrap msgid "Alternative\n" msgstr "Alternatief\n" #. type: Plain text #: kraft.adoc:827 #, no-wrap msgid "On demand\n" msgstr "Op verzoek\n" #. type: Plain text #: kraft.adoc:830 #, no-wrap msgid "" " [Context]>[Tax]\n" " Seems not working.\n" msgstr "" " [Context]>[Belasting]\n" "Lijkt niet te werken.\n" #. type: Plain text #: kraft.adoc:833 #, no-wrap msgid "" " [Context]>[Move up]\n" " Moves this item a place up in document.\n" msgstr "" " [Context]>[Omhoog verplaatsen]\n" " Verplaatst dit item een plaats omhoog in het document.\n" #. type: Plain text #: kraft.adoc:836 #, no-wrap msgid "" " [Context]>[Move down]\n" " Moves this item a place down in document.\n" msgstr "" " [Context]>[Omlaag verplaatsen]\n" " Verplaatst dit item een plaats omlaag in het document.\n" #. type: Plain text #: kraft.adoc:839 #, no-wrap msgid "" " [Context]>[Lock item]\n" " It is not clear what is does.\n" msgstr "" " [Context]>[Item vastzetten]\n" " Het is niet duidelijk wat het doet.\n" #. type: Plain text #: kraft.adoc:842 #, no-wrap msgid "" " [Context]>[Unlock item]\n" " It is not clear what is does.\n" msgstr "" " [Context]>[Item ontgrendelen]\n" " Het is niet duidelijk wat het doet.\n" #. type: Plain text #: kraft.adoc:845 #, no-wrap msgid "" " [Context]>[Delete item]\n" " Removes this item from document.\n" msgstr "" " [Context]>[Verwijder item]\n" " Verwijdert dit item uit het document.\n" #. type: Title == #: kraft.adoc:848 #, no-wrap msgid "Advanced Topics" msgstr "Geavanceerde onderwerpen" #. type: Plain text #: kraft.adoc:851 msgid "" "This chapter describes advanced topics around Kraft. Some Linux knowledge is " "required, and setups should be done by experienced Linux administrators and " "should be tested carefully." msgstr "" "Dit hoofdstuk beschrijft geavanceerde onderwerpen rond het gebruik van " "Kraft. Daarbij wordt enige kennis van Linux veronderstelt, en het is " "verstandig om de instellingen door ervaren Linux-beheerders uit te laten " "voeren en deze vervolgens zorgvuldig en uitgebreid te testen." #. type: Title === #: kraft.adoc:852 #, no-wrap msgid "Using Kraft Collaboratively" msgstr "Kraft gemeenschappelijk gebruiken." #. type: Plain text #: kraft.adoc:855 msgid "" "Kraft can be used collaborative in a distributed environment. That means " "that multiple users work on their desktops with their own Kraft instance on " "the same data." msgstr "" "Kraft kan gemeenschappelijk in een gedistribueerde omgeving gebruikt worden. " "Dat houd in dat meerdere gebruikers op hun eigen desktop met hun eigen Kraft " "instance met dezelfde data kunnen werken." #. type: Plain text #: kraft.adoc:857 msgid "" "This whole topic is a subject to change, as Kraft will evolve to use " "ownCloud as a private cloud solution to store the data." msgstr "" "De hele situatie is aan verandering onderhevig, omdat Kraft in de nabije " "toekomst ownCloud als privé Cloud voor de opslag van de data zal gebruiken." #. type: Title ==== #: kraft.adoc:858 #, no-wrap msgid "Sharing Database and Document Pool" msgstr "Database en Document-pool gezamenlijk gebruiken" #. type: Plain text #: kraft.adoc:861 msgid "" "The simplest case is that two or more Kraft instances use a database " "together and access the same pool of PDF documents on the harddisk. For " "simplicity this describes only two Kraft instances." msgstr "" "De eenvoudigste situatie is als twee of meer Kraft-gebruikers de database " "gemeenschappelijk gebruiken en toegang tot dezelfde pool van PDF-documenten " "op de harde schijf hebben. Om het eenvoudig te houden, worden hier de " "situatie met twee gebruikers beschreven." #. type: Plain text #: kraft.adoc:863 msgid "" "A typical use case would be: Two different Linux users want to use Kraft. " "They both have their own computer but only work in the same network. For " "example this would describe a situation with one main office machine that " "runs Kraft in normal mode, plus a notebook with Kraft in read only mode to " "view documents, check catalogs and such." msgstr "" "Een veelvoorkomende situatie kan als volgt zijn: twee verschillende Linux " "gebruikers willen Kraft gebruiken. Ze hebben beide hun eigen computer en " "werken in hetzelfde netwerk. Dit voorbeeld beschrijft een situatie met een " "hoofdkantoor die Kraft in de normale modus gebruiken, en een Notebook met " "Kraft, die in de read-only modus is om de documenten te bekijken, de " "catalogus te raadplegen en dergelijke." #. type: Plain text #: kraft.adoc:865 msgid "For that, the following prerequisites have to be met:" msgstr "Daarvoor is het volgende vereist:" #. type: Plain text #: kraft.adoc:867 msgid "MySQL or MariaDB is used as database backend. Sqlite is not supported." msgstr "" "Als Database-Backend wordt MySQL of MariaDB gebruikt. Sqlite is niet " "mogelijk." #. type: Plain text #: kraft.adoc:868 msgid "" "The database is accessible with a mysql user and from each machine for both " "users." msgstr "" "De Database is met de gebruiker MySQL vanuit beide computers bereikbaar." #. type: Plain text #: kraft.adoc:869 msgid "The document store directory has to be shared." msgstr "" "De map waarin de documenten worden opgeslagen, wordt voor beide computers " "bereikbaar zijn (shared)." #. type: delimited block _ #: kraft.adoc:873 msgid "" "WARNING: There is no protection against having both users editing the same " "document. Because that is dangerous and can lead to unpredictable results, " "it is recommended to run all instances of Kraft except the main one in read " "only mode. This is done by starting Kraft with the `-r` command line switch." msgstr "" "Pas op: Er is geen beveiliging tegen het feit dat beide gebruikers tegelijk " "hetzelfde document kunnen bewerken. Om dat dit gevaarlijk is en tot " "onvoorziene resultaten kan leiden, raden wij aan om Kraft buiten het kantoor " "alleen in de readonly-modus te gebruiken. Deze readonly-modus wordt met de " "parameter -r ingeschakeld." #. type: Plain text #: kraft.adoc:876 #, no-wrap msgid "**Sharing the Database**\n" msgstr "**De database gezamenlijk gebruiken**\n" #. type: Plain text #: kraft.adoc:878 msgid "" "The database server should be installed on the main machine or a dedicated " "device like a NAS. Networking speed influences the comfort to use obviously." msgstr "" "De database-server moet op de hoofdmachine geïnstalleerd zijn, of het moet " "op een gespecialiseerd apparaat zoals een NAS geïnstalleerd zijn. De " "snelheid van het netwerk beïnvloed de bruikbaarheid natuurlijk enorm." #. type: Plain text #: kraft.adoc:880 msgid "Find howtos on the internet how to setup MySQL accordingly." msgstr "Howtos voor het gebruik van MySQL zijn op het internet te vinden." #. type: Plain text #: kraft.adoc:882 #, no-wrap msgid "**Sharing the Document Pool Directory**\n" msgstr "**De map met de document Pool delen (sharen)**\n" #. type: Plain text #: kraft.adoc:884 msgid "" "Kraft writes generated PDF documents into a local directory. Where that is " "can be configured in the Kraft Config file. The config file has to be " "adopted on all instances." msgstr "" "Kraft schrijft de gegenereerde PDF's in een lokale map. Welke dat is, kunt u " "instellen in het config-bestand van Kraft. Het config-bestand moet voor alle " "exemplaren van Kraft correct ingesteld zijn." #. type: Plain text #: kraft.adoc:886 msgid "" "That is located in each users home directory, in the path `.config/kraftrc`. " "It has to contain the following config value:" msgstr "" "U kunt deze vinden in de thuismap van de gebruiker met de relatieve pad `." "config/kraftrc`. Daarin moet de volgende tekst voorkomen:" #. type: delimited block - #: kraft.adoc:890 #, no-wrap #| msgid "PdfOutputDir=/data/space/kraftdoc/pdf" msgid "" "[reporting]\n" "PdfOutputDir=/data/space/kraftdoc/pdf\n" msgstr "" "[reporting]\n" "PdfOutputDir=/data/space/kraftdoc/pdf\n" #. type: Plain text #: kraft.adoc:893 msgid "" "There are different ways how share that directory, ie. NFS or SMB storages. " "It is important that both users from both machines can list and access the " "files. The main user needs read and write access, read only users only need " "read access to the files." msgstr "" "Er zijn verschillende manieren om de map te delen (sharen), bijvoorbeeld een " "NFS of een SMB Server. Het is belangrijk dat gebruikers van beide machines " "toegang hebben tot deze bestanden. De hoofdgebruiker heeft lees- en " "schrijfrechten nodig, de read-only gebruiker heeft voor de bestanden alleen " "lees-rechten nodig." #. type: Plain text #: kraft.adoc:895 msgid "" "A recommended setup is a NFS share with autofs which is set up on the main " "machine. To manage file access a certain group should be set up on the " "machines with which access can be managed." msgstr "" "Een aanbevolen opstelling is een NFS Share met autofs, die op de " "hoofdmachine is ingesteld. Om de toegang tot de bestanden te beheren, raden " "wij aan om een gebruikersgroep te creëren waarin u de toegangsrechten kan " "beheren." #. type: Plain text #: kraft.adoc:897 #, no-wrap msgid "**Starting Kraft in read-only mode**\n" msgstr "**Kraft in read-only modus**\n" #. type: Plain text #: kraft.adoc:899 msgid "" "To start Kraft in read-only mode, start the binary with the `-r` command " "line switch." msgstr "" "Om Kraft in de read-only modus te starten, moet het programma met de " "volgende parameter `-r` gestart worden." #. type: Title === #: kraft.adoc:900 #, no-wrap msgid "XRechnung Support" msgstr "Gebruik van XRechnung" #. type: Plain text #: kraft.adoc:903 msgid "" "Kraft supports the XRechnung standard. That is a digital format for " "electronic invoicing, and it passed as law in Germany and follows a EU " "directive. The XRechnung is a XML file format designed for that purpose." msgstr "" "Kraft ondersteund het gebruik van de XRechnung standaard. Dat is een " "digitaal formaat voor electronische rekeningen, en als wet ingevoerd in " "Duitsland wat een EU richtlijn volgt. De XRechnung is een XML-" "bestandsformaat ontworpen voor dat doel." #. type: Plain text #: kraft.adoc:905 msgid "" "To use the XRechnung Export productivly, a little manual work is still " "needed in Kraft. Kraft creates the XML file based on a template, very " "similar to the normal PDF documents. That means that it loads a template " "that contains static elements (ie. the company address) that do not change " "between different invoices. The dynamic elements (customer data, items etc.) " "are filled into the template during the generation step." msgstr "" "Om de XRechnung Export productief te gebruiken, is nog een beetje handwerk " "in Kraft nodig. Kraft creëert het XML-bestand aan de hand van een sjabloon, " "vergelijkbaar met de normale PDF documenten. Dit houdt in dat het een " "sjabloon laadt wat statische elementen bevat (b.v. het adres van het " "bedrijf) die niet veranderen tussen de verschillende rekeningen. De " "dynamische elementen (data over de klant, items enz.) worden in het sjabloon " "geplaatst tijdens de stap van het generen." #. type: Plain text #: kraft.adoc:907 msgid "" "In order to generate correct XRechnung files for the specific company, the " "user has to adopt the template file manually to the companies needs. Note " "that this has only to be done once and should be easy for a person with a " "bit computer experience (Basic knowledge about XML appreciated!)." msgstr "" "Om correcte XRechnung-bestanden te generen voor het desbetreffende bedrijf, " "moet de gebruiker het sjabloonbestand handmatig aanpassen aan de eisen van " "het bedrijf. Merk op dat u dat maar eenmalig hoeft te doen en dat het niet " "moeilijk is voor iemand met een beetje computerervaring (Basiskennis van XML " "is gewenst)." #. type: Plain text #: kraft.adoc:909 msgid "" "To adapt the file to the needs of the company, it is best to start with the " "https://raw.githubusercontent.com/dragotin/kraft/master/reports/xrechnung." "xrtmpl[example XRechnung file]. It has to be downloaded and saved into a " "location that the user can edit. Open it in a normal text editor, such as " "https://kate-editor.org/[Kate]." msgstr "" "Om het bestand aan te passen aan de eisen van het bedrijf, kunt u het beste " "beginnen met het https://raw.githubusercontent.com/dragotin/kraft/master/" "reports/xrechnung.xrtmpl[voorbeeld XRechnung-bestand]. U moet het downloaden " "en vervolgens opslaan op een plek waar u het kan bewerken. Open het in een " "normale tekstverwerker, zoals https://kate-editor.org/[Kate]." #. type: Plain text #: kraft.adoc:911 msgid "" "Read carefully through the file without being scared off by the XML format. " "All user strings (ie. company name, address and such) are user specific and " "should be replaced accordingly. Find https://www.xoev.de/" "xrechnung-16828[details about the format] here to better understand the " "meaning of the fields." msgstr "" "Bestudeer nauwkeurig het bestand zonder dat u afgeschrikt wordt door het XML-" "opmaak. Alle user strings (d.w.z. bedrijfsnaam, adres en dergelijke) zijn " "specifiek voor de gebruiker en moeten daarom overeenkomstig vervangen " "worden. Zoek https://www.xoev.de/xrechnung-16828[de details over de opmaak] " "hier op voor een beter begrip van de betekenis van de velden." #. type: Plain text #: kraft.adoc:913 msgid "" "Make sure to not disturb the proper XML format and do not change places " "where the template format `{{ template_name }}` is used." msgstr "" "Zorg ervoor dat u de correcte XML-opmaak niet verstoort en wijzig niet de " "locatie van waar `{{ template_name }}` is gebruikt." #. type: Plain text #: kraft.adoc:915 msgid "" "Once the file is adopted to the needs, open the Settings dialog of Kraft and " "insert the filename into the entry field for the XRechnung Template File on " "the Document Defaults page." msgstr "" "Nadat het bestand is aangepast aan de wensen, opent u het dialoogvenster " "voor de instellingen van Kraft en voer de bestandsnaam in het invoerveld " "voor het XRechnung Sjabloonbestand in de pagina voor document-standaarden." #. type: Plain text #: kraft.adoc:917 msgid "" "After that step, the btn:[Export XRechung] menu item will open a dialog to " "pick a filename where to save the XRechnung invoice to." msgstr "" "Na deze stap zal het menu item btn:[Export XRechung] een dialoogvenster " "openen voor het ingeven van het bestandsnaam waarmee de XRechnung rekening " "wordt opgeslagen." #. type: Plain text #: kraft.adoc:919 msgid "This file can now be transfered to the receiver of the invoice." msgstr "Dit bestand kan nu verzonden worden naar de ontvanger van de rekening." #. type: Plain text #: kraft.adoc:921 msgid "" "There are validators for invoices in XRechnung format out there in the " "internet. It is useful to verify the format of the Kraft exported XRechnung." msgstr "" "Er zijn validators voor rekeningen in het XRechnung formaat op het internet " "te vinden. Het is verstandig om het bestandsformaat van de XRechnung dat uit " "Kraft is geëxporteerd te laten valideren." #. type: Title === #: kraft.adoc:922 #, no-wrap msgid "Changing the Locale" msgstr "De taalregio wijzigen" #. type: Plain text #: kraft.adoc:925 msgid "" "If it is needed that Kraft runs under a different locale than the actual " "desktop environment, this can be achieved by setting the desired locale in " "the start file of Kraft." msgstr "" "Als het nodig dat Kraft een andere taalregio (bijvoorbeeld voor een andere " " valuta) gebruikt dan die in de huidige desktop is ingesteld, dan kan dit " " worden bereikt door de gewenste taalregio in het opstart-bestand van Kraft " " in te stellen." #. type: Plain text #: kraft.adoc:927 msgid "" "On the linux desktop, apps are usually started through a so called https://" "specifications.freedesktop.org/desktop-entry-spec/latest/[desktop file]. It " "contains the information how the Kraft binary is started if user clicks on " "the icon on the desktop or in the start menu." msgstr "" "Bij een linux desktop, worden programma's normaal gesproken opgestart met de" " hulp van een zogeheten https://" "specifications.freedesktop.org/desktop-entry-spec/latest/[desktop-bestand]." " Hierin is informatie aanwezig over hoe het Kraft-programma wordt opgestart" " als de gebruiker klikt op het pictogram op de desktop of in het start menu." #. type: Plain text #: kraft.adoc:929 msgid "" "The desktop file can usually be found in `/usr/share/applications/de.volle-" "kraft-voraus.kraft.desktop`." msgstr "" "Het desktop-bestand is meestal te vinden in `/usr/share/applications/de.volle-" "kraft-voraus.kraft.desktop`." #. type: Plain text #: kraft.adoc:931 msgid "It contains the line" msgstr "Daarin is de volgende regel aanwezig" #. type: delimited block - #: kraft.adoc:934 #, no-wrap msgid "Exec=kraft %u\n" msgstr "Exec=kraft %u\n" #. type: Plain text #: kraft.adoc:937 msgid "which starts the application with the default locale." msgstr "wat het programma start met de standaard taalregio." #. type: Plain text #: kraft.adoc:939 msgid "Changing it to" msgstr "Als u dit bijvoorbeeld wijzigt naar" #. type: delimited block - #: kraft.adoc:942 #, no-wrap msgid "Exec=env LANG=de_DE.UTF-8 kraft %u\n" msgstr "Exec=env LANG=de_DE.UTF-8 kraft %u\n" #. type: Plain text #: kraft.adoc:945 msgid "" "would change that to run in the German locale for example, independent from " "the desktop environment location." msgstr "" "dan verandert dat naar de Duitse taalregio, onafhankelijk van de desktop" " environment locatie." #. type: Title == #: kraft.adoc:948 #, no-wrap msgid "Credits and License" msgstr "Dankbetuigingen en licentie" #. type: Plain text #: kraft.adoc:951 #| msgid "Program and documentation copyright 2004–2022 Klaas Freitag" msgid "Program and documentation copyright 2004–2023 Klaas Freitag" msgstr "Auteursrecht software en documentatie 2004–2023 Klaas Freitag" #. type: Plain text #: kraft.adoc:952 #| msgid "Documentation copyright 2020 Ronald Stroethoff" msgid "Documentation copyright 2020-2023 Ronald Stroethoff" msgstr "Documentatie auteursrecht 2020-2023 Ronald Stroethoff" #~ msgid "```" #~ msgstr "```" #~ msgid "" #~ "With https://weasyprint.org[WeasyPrint] Kraft uses a very powerful HTML " #~ "and CSS based generator that makes it very easy to create highly " #~ "customized documents which fit the users expectations. The general idea " #~ "is that Weasyprint loads html output that is processed to PDF. Usually it " #~ "is considering a Cascading Stylesheet file which has a huge impact on how " #~ "the PDF document looks in the end." #~ msgstr "" #~ "Door https://weasyprint.org[WeasyPrint] te gebruiken heeft Kraft een zeer " #~ "krachtige op HTML en CSS gebaseerde generator die het zeer eenvoudig " #~ "maakt om aangepaste documenten te creëren die voldoen aan de " #~ "verwachtingen van gebruikers. Het algemene idee is dat Weasyprint de " #~ "gecreëerde html laad om die te verwerken naar een PDF. Normaal gesproken " #~ "gebruikt het een bestand met een Cascading Stylesheet om te bepalen hoe " #~ "het PDF document er aan het eind eruit komt te zien." #~ msgid "" #~ "An example for a WeasyPrint document can be found in the Kraft package in " #~ "the reports directory and is called invoice.gtmpl." #~ msgstr "" #~ "Een voorbeeld van een WeasyPrint document kunt u vinden in het Kraft " #~ "pakket in de map reports en draagt de naam invoice.gtmpl." #~ msgid "" #~ "To use a WeasyPrint template with one of the Kraft document types just " #~ "select the template file name (with the right extension `*.gtml`) in the " #~ "Kraft Settings Dialog." #~ msgstr "" #~ "Om bij een van de Kraft-documenten een Weasyprint-sjabloon te gebruiken, " #~ "selecteert u gewoon het bestandsnaam (met de juiste extensie: *.gtml) in " #~ "het instellingsvenster van Kraft." #~ msgid "" #~ "To effectively change the look of the document `kraft.css` (https://" #~ "github.com/dragotin/kraft/blob/master/reports/kraft.css[on Github]) needs " #~ "to be considered. It defines most of the look." #~ msgstr "" #~ "Om daadwerkelijk het uiterlijk van de documenten te veranderen is `kraft." #~ "css` (https://github.com/dragotin/kraft/blob/master/reports/kraft.css[op " #~ "Github]) heel belangrijk. Deze definieert het meeste van het uiterlijk." #~ msgid "" #~ "Kraft is designed to use the data entries from the KDE address book which " #~ "is a module of the https://community.kde.org/KDE_PIM[KDE PIM], an " #~ "information management application. All addresses are collected in the " #~ "https://userbase.kde.org/KAddressBook[KAdressBook]." #~ msgstr "" #~ "Kraft werkt met de adresgegevens uit het KDE adresboek, wat een onderdeel " #~ "is van https://community.kde.org/KDE_PIM[KDE PIM], wat een informatie-" #~ "beheers-programma is. Alle adressen worden in het programma https://" #~ "userbase.kde.org/KAddressBook[KAdressBook] verzameld." #~ msgid "" #~ "image:numbercycles.png[Numbercycles,float=\"right\"] Numbercycles are " #~ "used to define the *document number* which is printed on every document. " #~ "The document number is an important unique identifier of the document and " #~ "often must follow regulations." #~ msgstr "" #~ "image:numbercycles.png[Numbercycles,float=\"right\"] Volgnummersystemen " #~ "worden gebruikt voor de definitie van het *Documentnummer*, die op elk " #~ "document wordt afgedrukt. Het documentnummer is een belangrijk uniek " #~ "identificatie van het document die vaak aan bepaalde regels moet voldoen." #~ msgid "" #~ "Different document types can use the same number cycle to generate ids " #~ "from. Number cycles are identified by their name. User can create new " #~ "number cycles and edit them clicking on the button btn:[Edit Number " #~ "Cycles...]" #~ msgstr "" #~ "Verschillende documenttypes kunnen hetzelfde volgnummersysteem gebruiken " #~ "om ID's te generen. Volgnummersystemen zijn door hun naam te herkennen . " #~ "Gebruikers kunnen nieuwe volgnummersystemen creëren en ze aanpassen door " #~ "te klikken op de knop btn:[Volgnummersysteem instellen...] ." #~ msgid "We go first to catalogs." #~ msgstr "We gaan eerst naar de catalogi." #, no-wrap #~ msgid "Catalog" #~ msgstr "Catalogus" #~ msgid "Here we fill in:" #~ msgstr "Hier vullen we in:" kraft-1.2.2/manual/po/kraft.pot000066400000000000000000001646611467704360200164000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2023-09-12 13:09+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: Title = #: kraft.adoc:1 #, no-wrap msgid "The Kraft Handbook" msgstr "" #. type: Plain text #: kraft.adoc:3 msgid "Ronald Stroethoff, Klaas Freitag" msgstr "" #. type: Title == #: kraft.adoc:16 #, no-wrap msgid "Introduction" msgstr "" #. type: Plain text #: kraft.adoc:19 msgid "" "Kraft is a Qt and KDE application to organize office documents like quotes " "and invoices in a small business. It eases the creation of documents and " "helps with repeating tasks." msgstr "" #. type: Plain text #: kraft.adoc:21 msgid "" "Using Kraft, there is no need for fiddling with a text processor any " "more. Documents are created by a few clicks, edited, generated and archived " "automatically. Kraft generates high quality PDF output for printing, mailing " "and archiving." msgstr "" #. type: Labeled list #: kraft.adoc:22 #, no-wrap msgid "Feature Overview" msgstr "" #. type: Plain text #: kraft.adoc:25 msgid "Simple creation of offers, invoices and similar documents." msgstr "" #. type: Plain text #: kraft.adoc:26 msgid "Customer management, deeply integrated with the mature KDE KAddressbook." msgstr "" #. type: Plain text #: kraft.adoc:27 msgid "Maintenance of document relations, ie. Partial invoices vs. invoices." msgstr "" #. type: Plain text #: kraft.adoc:28 msgid "Templates for document header- and footertexts and for document items." msgstr "" #. type: Plain text #: kraft.adoc:29 msgid "Pre calculation of item prices." msgstr "" #. type: Plain text #: kraft.adoc:30 msgid "Material management." msgstr "" #. type: Plain text #: kraft.adoc:31 msgid "Configurable document creation in PDF format for print and email." msgstr "" #. type: Plain text #: kraft.adoc:33 msgid "" "The code of Kraft is open source and is released under the " "https://en.wikipedia.org/wiki/GNU_General_Public_License[GNU General Public " "License]." msgstr "" #. type: Plain text #: kraft.adoc:38 #, no-wrap msgid "" "Kraft is driven by community of users, coders, artists and others by " "voluntary work. +\n" "Also this manual needs contributions! +\n" " +\n" " Learn more on " "https://github.com/dragotin/kraft/blob/master/manual/Readme.md[how to " "contribute]!\n" msgstr "" #. type: Title == #: kraft.adoc:40 #, no-wrap msgid "First Use and Basic Configuration" msgstr "" #. type: Plain text #: kraft.adoc:43 msgid "" "When Kraft is started for the first time, it automatically enters the " "initial setup process." msgstr "" #. type: Plain text #: kraft.adoc:45 msgid "" "During the initial setup you are asked to select a database to use and give " "the name and address of your company." msgstr "" #. type: Plain text #: kraft.adoc:47 msgid "" "You can fill in your company address (that appears on the printed documents) " "in two ways: in the setup procedure use the first tab *Select from " "Addressbook* for to select your on address in KAddressBook (if you have " "filled your own address in KaddressBook) or use the second tab *Manual " "entry* for to fill in the information of the address from your company " "manually. This step is necessary for the correct generation of your " "documents as the address is automatically used in the document generation " "step." msgstr "" #. type: Plain text #: kraft.adoc:49 msgid "image:company_adress1.png[Company adress,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:52 msgid "" "After the initial setup, select menu:Preferences[Settings]. That allows to " "prepare Kraft correctly so it can be used in a proper way." msgstr "" #. type: Plain text #: kraft.adoc:54 msgid "In the Preferences dialog we have the tabs:" msgstr "" #. type: Plain text #: kraft.adoc:61 #, no-wrap msgid "" " *Document Defaults\n" " *Taxes\n" " *Documunt Types\n" " *Wages\n" " *Units\n" " *Own identity\n" msgstr "" #. type: Plain text #: kraft.adoc:63 msgid "Each of the tabs allows to enter useful values for the specific use case." msgstr "" #. type: Title === #: kraft.adoc:64 #, no-wrap msgid "Document Types" msgstr "" #. type: Plain text #: kraft.adoc:67 msgid "At the first use you find a list of different document types, such as:" msgstr "" #. type: Plain text #: kraft.adoc:69 msgid "Acceptance of order" msgstr "" #. type: Plain text #: kraft.adoc:70 msgid "Delivery receipt" msgstr "" #. type: Plain text #: kraft.adoc:71 msgid "Invoice" msgstr "" #. type: Plain text #: kraft.adoc:72 msgid "Offer" msgstr "" #. type: Plain text #: kraft.adoc:74 msgid "image:documentype.png[Document type,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:77 msgid "" "Translate this types to your own language. You can also add new ones and " "remove document types you wont use." msgstr "" #. type: Title ==== #: kraft.adoc:78 #, no-wrap msgid "Numbercycles" msgstr "" #. type: Plain text #: kraft.adoc:82 msgid "" "image:numbercycles.png[Numbercycles,float=\"right\"] Each document has to " "have an unique identifier that identifies the document. There must not be " "two documents in Kraft with the same identifier." msgstr "" #. type: Plain text #: kraft.adoc:85 msgid "" "The format of the identifier is configuratable in Kraft. For that, Kraft has " "a concept of so called number cycles. Number cycles are used to define the " "form of the *document number* which is printed on every document." msgstr "" #. type: Plain text #: kraft.adoc:89 msgid "" "All documents of a certain type have identifiers taken out of one number " "cycle. Each document type has a number cycle assigned. Different document " "types can use the same number cycle to generate ids from. That way, for " "example the document types Invoice and Final Invoice can use numbers from " "the same number cycle, even thought they are different document types in " "Kraft. Number cycles are identified by their name. User can create new " "number cycles and edit them clicking on the button btn:[Edit Number " "Cycles...]" msgstr "" #. type: Plain text #: kraft.adoc:91 msgid "" "The format of the document numbers are defined by a template that can " "contain normal, fixed characters and also some variables that are replaced " "by the respective values when the document is created." msgstr "" #. type: Plain text #: kraft.adoc:94 msgid "" "Each identifier needs to be unique, and thus has to contain a counter. Kraft " "supports two types of counter: One (variable `%i`) is incremented globally " "for every new document. The other (variable `%n`) is reset every day and " "starts at 1 again on every new day. In addition to the counter, more " "information can be added to the template form an useful number. Examples are " "a constant text or parts of the date." msgstr "" #. type: Plain text #: kraft.adoc:96 msgid "" "The default numbercycle delivered with Kraft contains the year, the month " "and a serialnumber. That way you can compare offers or orders from last year " "with this year or the month April of last year with the month April of this " "year and get on this way an impression from the results of your business." msgstr "" #. type: Plain text #: kraft.adoc:98 msgid "See the following table for available variables which can be used:" msgstr "" #. type: Table #: kraft.adoc:115 #, no-wrap msgid "" "| `%y` or `%yyyy` | the year of the document date.\n" "| `%yy` | the year of the document (two digits).\n" "| `%w` | the week number of the document date.\n" "| `%ww` | the week number of the document date with leading " "zero.\n" "| `%d` | the day number of the document date.\n" "| `%dd` | the day number of the document date with leading " "zero.\n" "| `%m` or `%M` | the month number of the document date.\n" "| `%MM` | the month number with leading zero.\n" "| `%c` | the customer id from kaddressbook\n" "| `%type` | the localised doc type (offer, invoice etc.)\n" "| `%uid` | the contact id of the client.\n" "| `%i` .. `%iiiiii`| the unique counter\n" "| `%n` .. `%nnnnnn`| the unique day counter (combine with date)\n" "\n" msgstr "" #. type: Plain text #: kraft.adoc:118 msgid "" "A number cycle template needs to contain either `%i` or `%n`, if not, `%i` " "is appended automatically." msgstr "" #. type: Plain text #: kraft.adoc:120 msgid "" "Both `%i` and `%n` are numeric values. They can also be padded with with " "leading zeros. The length is defined by the number of i's or n's put into " "the template. For example, if a daily counter with length of three and " "leading zeros is desired, `%nnn` has to be put into the template. This works " "up to a length of six characters." msgstr "" #. type: delimited block _ #: kraft.adoc:123 msgid "" "NOTE: The \"design\" of the numbercycles and document numbers is very " "important. With the flexible system of templating Kraft can not prevent " "invalid number cycles. It is in the responsibility of the user." msgstr "" #. type: Title ==== #: kraft.adoc:125 #, no-wrap msgid "PDF Template" msgstr "" #. type: Plain text #: kraft.adoc:128 msgid "" "In the entry field Template File: the user can select a custom template for " "this specific document type." msgstr "" #. type: Plain text #: kraft.adoc:130 msgid "" "If the file extension of the template file is `.trml`, the ReportLab based " "document converter is used. If the file extension is `.gtmpl`, Kraft " "automatically uses the Weasyprint based converter." msgstr "" #. type: delimited block _ #: kraft.adoc:133 msgid "" "NOTE: The ReportLab system for PDF creation is deprecated in Kraft. Please, " "for new templates, always use Grantlee- and Weasyprint based templates." msgstr "" #. type: Title ==== #: kraft.adoc:135 #, no-wrap msgid "PDF Postprocessing" msgstr "" #. type: Plain text #: kraft.adoc:138 msgid "" "After Kraft has created the PDF document it is possible to merge the created " "PDF with static, customized PDFs created by the user. With that, it is easy " "to add a custom stationery with a logo to the resulting PDF (\"Watermark\")." msgstr "" #. type: Plain text #: kraft.adoc:140 msgid "" "The static PDFs should have the same page size as the generated " "documents. Keep in mind to use optimized images for logos etc. to not blow " "up the size of the result document." msgstr "" #. type: Plain text #: kraft.adoc:142 msgid "image:pdfpostproc.png[PDF Postprocessing,float?\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:144 msgid "The watermark options are:" msgstr "" #. type: Plain text #: kraft.adoc:146 #, no-wrap msgid "*No Watermark*: No watermark is created\n" msgstr "" #. type: Plain text #: kraft.adoc:147 #, no-wrap msgid "" "*On first page*: The first page of the watermark.pdf is merged with the " "first page of the result document\n" msgstr "" #. type: Plain text #: kraft.adoc:148 #, no-wrap msgid "" "*Watermark on all pages*: Merges the first page of the watermark PDF to all " "pages of the result document\n" msgstr "" #. type: Plain text #: kraft.adoc:149 #, no-wrap msgid "" "*alternating*: For this, the watermark PDF needs to have three pages. The " "first page is merged to the first page of the result document, the second " "and third page are alternated merge to subsequent pages.\n" msgstr "" #. type: Plain text #: kraft.adoc:150 #, no-wrap msgid "" "*different first and last page*: the PDF needs to have three pages. The " "first page is merged to the first page of the result document, the third " "page to the last, and the second to all page between first and last page.\n" msgstr "" #. type: Plain text #: kraft.adoc:152 msgid "" "If there is another static PDF document put into the entry field \"Append " "PDF:\", it is appended to the generated PDF. With that, Kraft will " "automatically add for example terms and conditions documents to the final " "document." msgstr "" #. type: Title === #: kraft.adoc:153 #, no-wrap msgid "Taxes" msgstr "" #. type: Plain text #: kraft.adoc:157 msgid "" "image:taxes.png[Taxes,float=\"right\"] In many countries there are two kinds " "of VAT-taxes for sold products." msgstr "" #. type: Plain text #: kraft.adoc:160 msgid "A high level and a low level." msgstr "" #. type: Plain text #: kraft.adoc:163 msgid "" "Fill here the appropriate amounts in for the high level and the low level. " "If the tax-level is changing, then you add here the start date with the new " "tax-levels." msgstr "" #. type: Title === #: kraft.adoc:164 #, no-wrap msgid "Wages" msgstr "" #. type: Plain text #: kraft.adoc:169 msgid "" "image:wages.png[Wages,float=\"right\"] A list of wage costs is maintained in " "Kraft. The items are used in templates and during calculation." msgstr "" #. type: Plain text #: kraft.adoc:172 msgid "" "All data can be edited, customized and new items can be added in the Kraft " "Configuration Dialog reachable through the Settings menu." msgstr "" #. type: Plain text #: kraft.adoc:176 msgid "" "Remember that these units are later used in the documents, it is therefor " "important that you translate them to your own language and to fill in the " "correct prices." msgstr "" #. type: Title === #: kraft.adoc:177 #, no-wrap msgid "Units of measurement" msgstr "" #. type: Plain text #: kraft.adoc:182 msgid "" "image:unity.png[Units of measurement,float=\"right\"] A list of units of " "measurement is maintained in Kraft. In Kraft Configuration Dialog reachable " "through the Settings menu can you edit and customize items already in the " "list, and also can you add new items to the list." msgstr "" #. type: Plain text #: kraft.adoc:185 msgid "" "Remember that these units are later used in the documents, it is therefor " "important that you translate them to your own language." msgstr "" #. type: Title === #: kraft.adoc:186 #, no-wrap msgid "Own identity" msgstr "" #. type: Plain text #: kraft.adoc:190 msgid "" "Check here if the information that you have given during the initial setup " "is correct for the use in the documents." msgstr "" #. type: delimited block _ #: kraft.adoc:195 msgid "" "WARNING: If you made the choice to use the information from KaddressBook " "then is the information from a later manual entry ignored." msgstr "" #. type: Plain text #: kraft.adoc:199 msgid "" "After we have made some corrections to the configuration, we go back to the " "main window.Here we see three tabs:" msgstr "" #. type: Plain text #: kraft.adoc:201 msgid "Documents" msgstr "" #. type: Plain text #: kraft.adoc:202 msgid "Timeline" msgstr "" #. type: Title == #: kraft.adoc:203 kraft.adoc:205 #, no-wrap msgid "Catalogs" msgstr "" #. type: Plain text #: kraft.adoc:208 msgid "" "Kraft supports so called Catalogs in which templates for document items are " "kept. With the catalogs creating documents can be significantly accellerated " "in the day to day business. When creating new documents, the items templates " "from the catalogs can easily selected and moved over to the document." msgstr "" #. type: Plain text #: kraft.adoc:210 msgid "" "Since templates are organized in chapters entire documents can be prepared " "in different chapters to be used as template documents." msgstr "" #. type: Plain text #: kraft.adoc:212 msgid "" "Of course the items in the documents can be edited after they got picked " "from a catalog." msgstr "" #. type: Plain text #: kraft.adoc:214 msgid "By default Kraft comes with two different catalogs:" msgstr "" #. type: Plain text #: kraft.adoc:216 msgid "`Material`" msgstr "" #. type: Plain text #: kraft.adoc:219 msgid "" "A catalog of material that are sold, with their purchase prices, the profit " "and the sell-price." msgstr "" #. type: Plain text #: kraft.adoc:221 msgid "and `Standard Templates`" msgstr "" #. type: Plain text #: kraft.adoc:223 msgid "A catalog of standard recipes of work like planting trees." msgstr "" #. type: Plain text #: kraft.adoc:226 msgid "" "Both catalogs can have chapters and sub-chapters for to organize your " "templates. First we are going to fill in the" msgstr "" #. type: Title === #: kraft.adoc:227 #, no-wrap msgid "Material Catalog" msgstr "" #. type: Plain text #: kraft.adoc:232 msgid "" "A catalog of material that are sold, with their purchase prices, the profit " "and the sell-price. First we are going to add new chapters and subchapters." msgstr "" #. type: Title ==== #: kraft.adoc:233 #, no-wrap msgid "New chapters" msgstr "" #. type: Plain text #: kraft.adoc:237 msgid "" "Select with the mouse the column-name `material`, select now in the " "context-menu [Add a sub chapter]" msgstr "" #. type: Plain text #: kraft.adoc:239 msgid "and add an extra chapter like `Trees`" msgstr "" #. type: Title ==== #: kraft.adoc:240 #, no-wrap msgid "New sub chapters" msgstr "" #. type: Plain text #: kraft.adoc:248 msgid "" "We are going to ad sub chapters in the map `Trees`. Select with the mouse " "the name of the chapter where you like to add a subchapter, select now in " "the context-menu [Add a sub chapter] and ad an extra subchapters like `Loaf " "trees` and `needle trees`. After adding the extra chapters and subchapters " "for dividing the material, we are going to add the material themself." msgstr "" #. type: Title ==== #: kraft.adoc:249 #, no-wrap msgid "New template" msgstr "" #. type: Plain text #: kraft.adoc:254 msgid "" "Select with the mouse the name of the sub-chapter or chapter where you like " "to add a material. Select the sub map Loaf trees and select now in the " "context-menu" msgstr "" #. type: Plain text #: kraft.adoc:257 msgid "Add the extra materials `coconut tree`, `apple tree` and `pine-apple tree`." msgstr "" #. type: Plain text #: kraft.adoc:259 msgid "Fill in the price that we have paid." msgstr "" #. type: Plain text #: kraft.adoc:261 msgid "Fill in the profit that we want to have on the material" msgstr "" #. type: Plain text #: kraft.adoc:263 msgid "And fill in how much is in a packet." msgstr "" #. type: Plain text #: kraft.adoc:266 msgid "" "image:catalog_material.png[Material catalog,float=\"right\"] After this we " "add also in the map 'Wood' a item for a 'support pole' for later use with " "its price." msgstr "" #. type: Plain text #: kraft.adoc:268 msgid "Now we are going to:" msgstr "" #. type: Title === #: kraft.adoc:269 #, no-wrap msgid "Standard Templates" msgstr "" #. type: Plain text #: kraft.adoc:272 msgid "This is a catalog of standard recipes of work like:" msgstr "" #. type: Plain text #: kraft.adoc:274 msgid "planting trees" msgstr "" #. type: Plain text #: kraft.adoc:275 msgid "cutting grass" msgstr "" #. type: Plain text #: kraft.adoc:276 msgid "transport costs" msgstr "" #. type: Plain text #: kraft.adoc:277 msgid "planting grass" msgstr "" #. type: Plain text #: kraft.adoc:278 msgid "sowing grass-seed" msgstr "" #. type: Plain text #: kraft.adoc:280 msgid "We add here the standard work of planting a tree." msgstr "" #. type: Plain text #: kraft.adoc:283 msgid "" "Select with the mouse the name of the chapter [Work] where you like to add " "the new template," msgstr "" #. type: Plain text #: kraft.adoc:285 msgid "select now the context-menu [New template]" msgstr "" #. type: Plain text #: kraft.adoc:287 msgid "and the extra templates `Plant tree` and `cut grass`." msgstr "" #. type: Plain text #: kraft.adoc:289 msgid "After we made the new template, a window opens with 4 tabs:" msgstr "" #. type: Title ==== #: kraft.adoc:291 kraft.adoc:297 #, no-wrap msgid "Template" msgstr "" #. type: Title ==== #: kraft.adoc:292 kraft.adoc:309 #, no-wrap msgid "Time calculation" msgstr "" #. type: Plain text #: kraft.adoc:293 msgid "Fix costs" msgstr "" #. type: Title ==== #: kraft.adoc:294 kraft.adoc:346 #, no-wrap msgid "Material" msgstr "" #. type: Plain text #: kraft.adoc:296 msgid "First we go to the tab:" msgstr "" #. type: Plain text #: kraft.adoc:301 msgid "" "We give here the name of the new standard template like `Plant tree` " "image:catalog_standard.png[Standard catalog,float=\"right\"]" msgstr "" #. type: delimited block _ #: kraft.adoc:304 msgid "WARNING: be careful, this name is later used in the invoice" msgstr "" #. type: Plain text #: kraft.adoc:308 msgid "" "we select that this is per piece and that the margin is 8% and that the full " "VAT is applicable." msgstr "" #. type: Plain text #: kraft.adoc:312 msgid "We fill here in a number of work with the time:" msgstr "" #. type: Block title #: kraft.adoc:313 #, no-wrap msgid "Spent time" msgstr "" #. type: Table #: kraft.adoc:320 #, no-wrap msgid "" "|Dig hole |32 min. |worker\n" "|Place tree |12 min. |worker\n" "|Fill hole |17 min. |worker\n" "|give water |5 min. |worker\n" msgstr "" #. type: Plain text #: kraft.adoc:324 msgid "" "The cost for worker which we have earlier filled in is now used. " "image:catalog_standard_work.png[Time calculation,float=\"right\"]" msgstr "" #. type: delimited block _ #: kraft.adoc:328 msgid "" "NOTE: in the invoice we see later only Plant tree, we will not see the parts " "dig hole,place tree,fill hole,give water" msgstr "" #. type: Plain text #: kraft.adoc:331 msgid "Now we go to the tab" msgstr "" #. type: Title ==== #: kraft.adoc:332 #, no-wrap msgid "Fixed costs" msgstr "" #. type: Plain text #: kraft.adoc:335 msgid "and fill in:" msgstr "" #. type: Block title #: kraft.adoc:336 #, no-wrap msgid "Fixed item" msgstr "" #. type: Table #: kraft.adoc:340 #, no-wrap msgid "|Transportcost |35 euro |1 pcs.\n" msgstr "" #. type: Plain text #: kraft.adoc:343 msgid "image:catalog_standard_fixed_cost.png[Fixed cost,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:345 msgid "After this we go to the tab:" msgstr "" #. type: Plain text #: kraft.adoc:350 msgid "" "Here we select btn:[next], after which the window [Add Material to " "Calculation] opens for a selection of material. We navigate to the map " "'wood' where we select the 'support pole'." msgstr "" #. type: Block title #: kraft.adoc:351 #, no-wrap msgid "Used materials" msgstr "" #. type: Table #: kraft.adoc:355 #, no-wrap msgid "|1 |support pole |3,5 euro\n" msgstr "" #. type: Plain text #: kraft.adoc:358 msgid "image:catalog_standard_material.png[Material,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:360 msgid "We go now back to the first tab template" msgstr "" #. type: Plain text #: kraft.adoc:363 msgid "On the first tab [template], we can now see the overall cost per one unit" msgstr "" #. type: Plain text #: kraft.adoc:366 msgid "" "Click on [OK] for saving the result or on [cancel] for discarding the " "result." msgstr "" #. type: Plain text #: kraft.adoc:368 msgid "We make a second template `cut grass`" msgstr "" #. type: Plain text #: kraft.adoc:371 msgid "" "we fill in `cut grass`, as unit we choose sm (square meter), on the second " "tab we fill in that we need 3 min per square meter." msgstr "" #. type: Plain text #: kraft.adoc:374 msgid "" "Click on [OK] for saving the result or on [Cancel] for discarding the " "result." msgstr "" #. type: Plain text #: kraft.adoc:376 msgid "'''" msgstr "" #. type: Title === #: kraft.adoc:377 #, no-wrap msgid "Header- and Footer Text Templates" msgstr "" #. type: Plain text #: kraft.adoc:380 msgid "" "Kraft supports text templates also for the header- and footer-text of " "documents. Each document type has it's own set of text templates. To access " "them, open a document of a certain document type in edit mode and use the " "btn:[show templates] to make the templates visible. In both the header- and " "footer-section the stored templates become visible." msgstr "" #. type: Plain text #: kraft.adoc:382 msgid "" "Directly under the navigation pane on the right side of the window is a list " "of the names of the available templates. Clicking on one of the names in the " "list displays the text in the pane below." msgstr "" #. type: Plain text #: kraft.adoc:384 msgid "" "Underneath there are buttons located with the following functions from left " "to right:" msgstr "" #. type: Plain text #: kraft.adoc:386 msgid "" "Add the template to the document: This button replaces the text of the " "document with the selected template." msgstr "" #. type: Plain text #: kraft.adoc:387 msgid "" "Insert the template to the document: The selected template is inserted to " "the current place of the cursor in the document." msgstr "" #. type: Plain text #: kraft.adoc:388 msgid "" "Create a new template: Opens a dialog to enter a complete new template for " "the current doc type." msgstr "" #. type: Plain text #: kraft.adoc:389 msgid "" "Edit the current template: Opens the dialog to edit the currently selected " "template." msgstr "" #. type: Plain text #: kraft.adoc:390 msgid "" "Delete the current template: Removes the template permanently from the list " "of available templates." msgstr "" #. type: Plain text #: kraft.adoc:392 msgid "" "Templates with the name _Standard_ are the default templates for the " "document type. They are inserted automatically if a document of this type is " "created." msgstr "" #. type: Title ==== #: kraft.adoc:394 #, no-wrap msgid "Macros" msgstr "" #. type: Plain text #: kraft.adoc:397 msgid "" "Both the header- and footer-templates can contain so called macros which are " "replaced with calculated values once the document is rendered to the final " "output format." msgstr "" #. type: Plain text #: kraft.adoc:399 msgid "The following list of macros are supported:" msgstr "" #. type: Plain text #: kraft.adoc:401 msgid "" "`DATE_ADD_DAYS()`: Returns the date of the of document plus the " "number of days specified as parameter to the macro." msgstr "" #. type: Plain text #: kraft.adoc:402 msgid "" "`ITEM_COUNT_WITH_TAG()`: Returns the amount of items tagged with the " "tag." msgstr "" #. type: Plain text #: kraft.adoc:403 msgid "" "`NETTO_SUM_PER_TAG()`: Returns the netto sum of all items that are " "tagged with the named tag." msgstr "" #. type: Plain text #: kraft.adoc:404 msgid "" "`BRUTTO_SUM_PER_TAG()`: Returns the brutto sum of all items that are " "tagged with the named tag." msgstr "" #. type: Plain text #: kraft.adoc:405 msgid "" "`VAT_SUM_PER_TAG()`: Returns the pure tax of all items that are tagged " "with the named tag." msgstr "" #. type: Plain text #: kraft.adoc:406 msgid "" "`IF_ANY_HAS_TAG()` and `END_HAS_TAG`: Includes the text between the two " "macros only if there is at least one item that is tagged with the tag." msgstr "" #. type: Plain text #: kraft.adoc:408 msgid "" "As an example, this footer text template can be used to automatically " "generate useful texts:" msgstr "" #. type: Plain text #: kraft.adoc:411 msgid "" "``` Please pay this invoice until three weeks after the date of the " "document, which is the DATE_ADD_DAYS(21)." msgstr "" #. type: Plain text #: kraft.adoc:417 msgid "" "IF_ANY_HAS_TAG(Material) This invoice lists material in " "ITEM_COUNT_WITH_TAG(Material) items. The net value is " "NETTO_SUM_PER_TAG(Material), plus VAT_SUM_PER_TAG(Material) = " "BRUTTO_SUM_PER_TAG(Material). END_HAS_TAG ```" msgstr "" #. type: Plain text #: kraft.adoc:419 msgid "We are now ready for the first invoice." msgstr "" #. type: Title == #: kraft.adoc:421 #, no-wrap msgid "Creating Documents" msgstr "" #. type: Title === #: kraft.adoc:423 #, no-wrap msgid "The first Invoice" msgstr "" #. type: Plain text #: kraft.adoc:426 msgid "Open the tab btn:[documents]" msgstr "" #. type: Plain text #: kraft.adoc:428 kraft.adoc:533 msgid "Click on btn:[create document]" msgstr "" #. type: Plain text #: kraft.adoc:430 msgid "The window document [creation wizard opens]." msgstr "" #. type: Plain text #: kraft.adoc:432 msgid "Select in document type `invoice`." msgstr "" #. type: Plain text #: kraft.adoc:435 msgid "" "Fill in on the whiteboard content a short text about what the invoice is, " "like: `cut grass and planted tree for mister Jonson`" msgstr "" #. type: Plain text #: kraft.adoc:437 kraft.adoc:542 msgid "Click on btn:[next]" msgstr "" #. type: Plain text #: kraft.adoc:439 kraft.adoc:544 msgid "Select on the new window the name and address from the client." msgstr "" #. type: Plain text #: kraft.adoc:442 kraft.adoc:547 msgid "" "(if the name and address is not there, click then on btn:[new contact] or on " "btn:[edit contact] if you want to edit the contact)" msgstr "" #. type: Plain text #: kraft.adoc:444 kraft.adoc:549 msgid "Click on btn:[OK]." msgstr "" #. type: Plain text #: kraft.adoc:446 msgid "Now opens the window document [items]." msgstr "" #. type: Plain text #: kraft.adoc:448 msgid "this window has 2 tabs and the 3 buttons on the top:" msgstr "" #. type: Plain text #: kraft.adoc:450 kraft.adoc:555 msgid "btn:[Add item...]," msgstr "" #. type: Plain text #: kraft.adoc:451 kraft.adoc:556 msgid "btn:[Add discount item]," msgstr "" #. type: Plain text #: kraft.adoc:452 kraft.adoc:557 msgid "btn:[Show templates]." msgstr "" #. type: Plain text #: kraft.adoc:456 msgid "" "In the left tab you can see all the items that we want to place on the " "invoice, on the right tab we see the text from the header, the total price " "and the footer." msgstr "" #. type: Plain text #: kraft.adoc:460 msgid "" "If you click on the text of the header or the footer on the right side then " "the window changes in such a way that you can edit the header or the footer." msgstr "" #. type: Plain text #: kraft.adoc:463 msgid "" "Adapt the header and the footer to your situation, on the footer you can " "place a text: `We make your garden-dream come to reality.`." msgstr "" #. type: Plain text #: kraft.adoc:465 kraft.adoc:559 msgid "Click on the button btn:[Show templates]." msgstr "" #. type: Plain text #: kraft.adoc:469 msgid "" "The right tab changes and show now the earlier made templates, we select in " "the group Work, the subgroup Plant tree and click then on the button with " "the to the left pointing arrow on the bottom side." msgstr "" #. type: Plain text #: kraft.adoc:471 kraft.adoc:565 msgid "A new window [Create Item from Template] opens." msgstr "" #. type: Plain text #: kraft.adoc:474 msgid "" "Because we have planted 2 trees, we go to the field [insert] and change this " "to 2 pcs." msgstr "" #. type: Plain text #: kraft.adoc:477 msgid "" "Click on btn:[OK] for saving the result or on btn:[cancel] for discarding " "the result." msgstr "" #. type: Plain text #: kraft.adoc:479 kraft.adoc:573 kraft.adoc:584 msgid "The window close and we go back to the main window." msgstr "" #. type: Plain text #: kraft.adoc:483 msgid "" "We click again on btn:[Show templates] and select this time `cut grass`, we " "click again on the button with the arrow, in the opened window we select " "that the grass-field was 24 square meter." msgstr "" #. type: Plain text #: kraft.adoc:486 kraft.adoc:571 kraft.adoc:604 kraft.adoc:640 msgid "" "Click on btn:[OK] for saving the result or on btn:[Cancel] for discarding " "the result." msgstr "" #. type: Plain text #: kraft.adoc:488 msgid "" "We add now manually an item by clicking on the button btn:[Add item…] and " "the window [create new item] opens." msgstr "" #. type: Plain text #: kraft.adoc:492 msgid "" "Because we have delivered a special tree, we fill here in the name of the " "special tree `liguster`, at the field insert we fill in the number of the " "special trees that we have delivered and the price of them." msgstr "" #. type: delimited block _ #: kraft.adoc:498 msgid "" "WARNING: Remind that in the catalog we can add a profit on the price of the " "material, in the invoice and in the offer we can not add a profit on the " "price of the material." msgstr "" #. type: Plain text #: kraft.adoc:501 msgid "We have now an invoice with 3 items." msgstr "" #. type: Plain text #: kraft.adoc:504 msgid "" "Click on btn:[OK] for saving the invoice or on btn:[Cancel] for discarding " "the invoice." msgstr "" #. type: Plain text #: kraft.adoc:506 msgid "We click on btn:[OK] and save the result." msgstr "" #. type: Plain text #: kraft.adoc:508 msgid "Your first invoice is now ready for sending." msgstr "" #. type: Plain text #: kraft.adoc:511 msgid "" "In the window documents we see our first invoice, notice that this document " "has a document number which we can see on the left side." msgstr "" #. type: Plain text #: kraft.adoc:514 msgid "" "On top of the window with all the invoices we see the button [Print " "Document], on which we click." msgstr "" #. type: Plain text #: kraft.adoc:517 msgid "" "From the invoice will now a PDF be made which we can print on paper or send " "by email to the client." msgstr "" #. type: Plain text #: kraft.adoc:519 msgid "After this we are going to create a offer for some work in a garden." msgstr "" #. type: Title === #: kraft.adoc:521 #, no-wrap msgid "Creating an Offer" msgstr "" #. type: Plain text #: kraft.adoc:524 msgid "" "The client has asked to plant a tree, we will offer 3 different trees which " "we can plant." msgstr "" #. type: Plain text #: kraft.adoc:527 msgid "" "Beside this, we have seen that there is a lifeless three, which we will " "offer to remove as extra work. " "image:create_new_doc.png[Numbercycles,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:529 msgid "" "For the total price we do not want to show the price of the removal of the " "lifeless tree and we want for the total price only to show the price of one " "tree and not three." msgstr "" #. type: Plain text #: kraft.adoc:531 msgid "Open again the tab btn:[documents]." msgstr "" #. type: Plain text #: kraft.adoc:535 msgid "The window _Document Creation Wizard_ opens." msgstr "" #. type: Plain text #: kraft.adoc:537 msgid "select in btn:[document type] > btn:[Offer]." msgstr "" #. type: Plain text #: kraft.adoc:540 msgid "" "Fill in on the whiteboard content a short text about what the offer is, " "like: `plant one tree and removal of lifeless tree`" msgstr "" #. type: Plain text #: kraft.adoc:551 msgid "Now the window [edit document] opens." msgstr "" #. type: Plain text #: kraft.adoc:553 msgid "This window has 2 tabs and the 3 buttons on the top:" msgstr "" #. type: Plain text #: kraft.adoc:563 msgid "" "The right tab changes and show now the earlier made templates, we select in " "the group `Work`, the subgroup `Plant tree` and click then on the button " "with the to the left pointing arrow on the bottom side." msgstr "" #. type: Plain text #: kraft.adoc:568 msgid "" "Because we want to plant 1 tree, we go to the field [insert] and keep this " "on 1 pcs." msgstr "" #. type: Plain text #: kraft.adoc:576 msgid "" "We click on the button btn:[Show templates] and this time we select in " "catalog Material" msgstr "" #. type: Plain text #: kraft.adoc:580 msgid "" "The material-catalog opens, and we can select in the chapter `trees` the " "subchapter `loaf trees` in which we select the `apple tree` which we made " "earlier." msgstr "" #. type: Plain text #: kraft.adoc:582 msgid "" "Click on we btn:[OK] for saving the result or on btn:[cancel] for discarding " "the result." msgstr "" #. type: Plain text #: kraft.adoc:586 msgid "We add now manually an item by clicking on the button `Add item…`." msgstr "" #. type: Plain text #: kraft.adoc:588 msgid "the window [create new item] opens." msgstr "" #. type: Plain text #: kraft.adoc:590 msgid "" "We want that the client can make a choice from an apple, a pear tree and the " "liguster." msgstr "" #. type: Plain text #: kraft.adoc:592 msgid "Therefor we are going to add also a pear tree manually." msgstr "" #. type: Plain text #: kraft.adoc:594 msgid "" "We click on the button btn:[Add item…] and the window [create new item] " "opens." msgstr "" #. type: Plain text #: kraft.adoc:598 msgid "" "We fill here in the name of the tree `Pear tree`, at the field insert we " "fill in the number of the special trees that we have delivered and the price " "of them." msgstr "" #. type: Plain text #: kraft.adoc:601 msgid "" "We want add this to the material catalog for future use, therefor we select " "also [select this item as template for future documents] and we select in " "[save in chapter]`trees`." msgstr "" #. type: Plain text #: kraft.adoc:606 msgid "We does this again but then for the liguster." msgstr "" #. type: Plain text #: kraft.adoc:608 msgid "We have now 3 items with trees in the offer." msgstr "" #. type: Plain text #: kraft.adoc:610 msgid "As last item we add an item with `remove tree` with 0,5 hour for 32 euro." msgstr "" #. type: Plain text #: kraft.adoc:612 msgid "On the left side of an item we can see 2 buttons:" msgstr "" #. type: Plain text #: kraft.adoc:614 msgid "a button with a flag and a button with what looks like a page." msgstr "" #. type: Plain text #: kraft.adoc:617 msgid "" "We select the upper button with the page after which opens a context-menu " "with the items:" msgstr "" #. type: Plain text #: kraft.adoc:619 msgid "image:context1.png[Context menu,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:629 #, no-wrap msgid "" " [Item kind]->[Normal]\n" " [Item kind]>[Alternative]\n" " [Item kind]>[On demand]\n" " [Tax]\n" " [Move up]\n" " [Move down]\n" " [Lock item]\n" " [Unlock item]\n" " [Delete item]\n" msgstr "" #. type: Plain text #: kraft.adoc:632 msgid "" "We choose here [Item kind] and change for `pear tree` from [normal] to " "[alternative]." msgstr "" #. type: Plain text #: kraft.adoc:635 msgid "" "We do this also for [liguster] and for [remove tree] we change this from " "[normal] to [on demand]." msgstr "" #. type: Plain text #: kraft.adoc:637 msgid "image:context2.png[Context menu,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:643 msgid "" "We want to see the result and therefor we click on the button [show " "document]." msgstr "" #. type: Plain text #: kraft.adoc:649 msgid "" "We see now that the prize of the pear tree, the liguster and the removal of " "the tree is not used for the total prize. When we are happy with the result, " "we can click on the button btn:[close] after which we click on the button " "btn:[Print Document] for making a PDF what we can print out or send to the " "client." msgstr "" #. type: Plain text #: kraft.adoc:652 msgid "After your first invoice is now your first offer now also ready for sending." msgstr "" #. type: Title === #: kraft.adoc:654 #, no-wrap msgid "Creating an Acceptance of Order" msgstr "" #. type: Plain text #: kraft.adoc:657 msgid "The document type \"Acceptance of Order\" is sent subsequently to an offer." msgstr "" #. type: Plain text #: kraft.adoc:659 msgid "image:acceptance_o_o_context.png[Numbercycles,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:662 msgid "" "When a client has made a request, we will send an offer in wich we describe " "which items we will deliver. Hopefully the client will give an order for " "the work." msgstr "" #. type: Plain text #: kraft.adoc:666 msgid "" "It is a good practice to respond on the order with an \"Acceptance of " "order\" in which we describe all the items we will deliver. We can make the " "\"Acceptance of order\" on the same way as we made the invoice or the offer " "by selecting each item and correcting the number of delivery. This takes " "time and we can make errors by forgetting items or filling an incorrect " "number." msgstr "" #. type: Plain text #: kraft.adoc:668 msgid "" "It can be done quicker by selecting the offer in the list and selecting " "btn:[Create Followup Document] from either the context menu or the main " "menu." msgstr "" #. type: Plain text #: kraft.adoc:670 msgid "We have now in documenttype the choice from:" msgstr "" #. type: Plain text #: kraft.adoc:676 #, no-wrap msgid "" " [Acceptance of order]\n" " [Invoice]\n" " [Partial Invoice]\n" " [final Invoice]\n" " [Progress Payment Invoice]\n" msgstr "" #. type: Plain text #: kraft.adoc:678 msgid "image:followup_1.png[Folloup document,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:682 msgid "" "We select here \"Acceptance of order\". We have now a copy from the offer " "as an Acceptance of order (do not forget to adapt Alternative Delivery items " "and on demand items.)" msgstr "" #. type: Plain text #: kraft.adoc:684 msgid "image:followup_2.png[Folloup document,float=\"right\"]" msgstr "" #. type: Plain text #: kraft.adoc:688 msgid "" "You can do this also for the creation of the invoice as a followup for " "Acceptance of order. Each document type has a specific list of follow up " "documents. It is a good practice to describe on the invoice precisely what " "was delivered." msgstr "" #. type: Title == #: kraft.adoc:690 #, no-wrap msgid "Customization" msgstr "" #. type: Plain text #: kraft.adoc:694 msgid "" "Kraft can be customized in most of the graphical user interface and in " "particular in the output it generates." msgstr "" #. type: Title === #: kraft.adoc:695 #, no-wrap msgid "Output Document Customization" msgstr "" #. type: Plain text #: kraft.adoc:698 msgid "" "To create PDF output documents, the document data that was edited in the " "Kraft app is filled into a template. The template defines how the output " "document looks like, ie. by font settings, placing of elements and such." msgstr "" #. type: Plain text #: kraft.adoc:700 msgid "" "The file that is assembled from data and the template is converted to PDF " "using a special document creation script. All that is started automatically " "by Kraft if a document should be printed." msgstr "" #. type: Plain text #: kraft.adoc:702 msgid "" "Each document type in Kraft can have it's own template that is used to " "create a PDF. Which one can be set in the Settings dialog for document " "types." msgstr "" #. type: Title ==== #: kraft.adoc:703 #, no-wrap msgid "WeasyPrint Documents" msgstr "" #. type: Plain text #: kraft.adoc:706 msgid "" "Kraft still ships with the old ReportLab based converter, but that will be " "deprecated the future. The WeasyPrint based system is the future. It is a " "recommended to port existing templates." msgstr "" #. type: Plain text #: kraft.adoc:708 msgid "" "With https://weasyprint.org[WeasyPrint] Kraft uses a very powerful generator " "that makes it very easy to create highly customized documents with great " "quality." msgstr "" #. type: Plain text #: kraft.adoc:710 msgid "" "WeasyPrint converts a html file to PDF. It is integrating a cascading " "stylesheet (CSS) file which has a huge impact on the PDF document's look." msgstr "" #. type: Plain text #: kraft.adoc:712 msgid "" "The html- and CSS input file for WeasyPrint is built from the Kraft template " "file." msgstr "" #. type: Plain text #: kraft.adoc:714 msgid "" "To enable the use of WeasyPrint for a document type in Kraft, simply create " "a weasyprint compatible template file and save it with the extension " "*.gtmpl*. Based on the file extension Kraft automatically uses WeasyPrint " "and the Grantlee templating engine for rendering." msgstr "" #. type: Plain text #: kraft.adoc:716 msgid "" "From version 0.95 on Kraft ships with an example template in the Grantlee- " "and WeasyPrint format. It can be found at " "`/usr/share/kraft/reports/invoice.gtmpl` or " "https://github.com/dragotin/kraft/blob/master/reports/invoice.gtmpl[online " "on Github]. An example CSS file `kraft.css` " "(https://github.com/dragotin/kraft/blob/master/reports/kraft.css[on Github]) " "is shipped as a good starting point for adoption." msgstr "" #. type: Title ==== #: kraft.adoc:717 #, no-wrap msgid "Template Variables" msgstr "" #. type: Plain text #: kraft.adoc:720 msgid "" "To generate the PDF, Kraft has to transfer data from the document you have " "been working on to the input file that is processed to a PDF. For that, " "Kraft uses a text template in which Kraft replaces variables with the actual " "values." msgstr "" #. type: Plain text #: kraft.adoc:722 msgid "" "For example, the tag `{{ doc.doctype }}` is replaced with the current " "document type during the generating process." msgstr "" #. type: Plain text #: kraft.adoc:724 msgid "" "The syntax is based on the Django syntax for templates described in the " "https://docs.djangoproject.com/en/3.1/topics/templates/[the docs]." msgstr "" #. type: Title ==== #: kraft.adoc:725 #, no-wrap msgid "EPC QR Code" msgstr "" #. type: Plain text #: kraft.adoc:728 msgid "" "With Weasyprint based PDF generation Kraft supports the " "https://en.wikipedia.org/wiki/EPC_QR_code[EPC QR Code] which implements a " "European standard for payments by computer and mobile devices." msgstr "" #. type: Plain text #: kraft.adoc:730 msgid "" "In Germany it is also known as _Giro Code_, in Belgium as _Bancontact QR_, " "in the Netherlands as _iDEAL QR-code_ and in Spain it is also known as " "_Bizum QR-code_." msgstr "" #. type: Plain text #: kraft.adoc:732 msgid "" "In Germany it is accepted by the _Giro Code_ and in Holland it is accepted " "by the official https://www.ideal.nl/consumenten/ideal-app/[_iDEAL QR-code_] " "app." msgstr "" #. type: Plain text #: kraft.adoc:734 msgid "" "In Belgium and Holland it is accepted by the apps of many banks, and in " "Austria and Finland it is accepted by the apps of all banks." msgstr "" #. type: Plain text #: kraft.adoc:736 msgid "" "To use the EPC QR code on the invoice printout, the bank account information " "has to be added to own identity settings dialog in Kraft. The giro code is " "current only generated for documents with the document type `Rechnung`." msgstr "" #. type: Plain text #: kraft.adoc:738 msgid "" "To include the generated EPC QR Code into the PDF document, the Weasyprint " "template needs to contain a snippet like this:" msgstr "" #. type: Plain text #: kraft.adoc:748 #, no-wrap msgid "" "```\n" " {%if doc.isInvoice and epcqrcode.valid %}\n" "

    \n" " \n" " Dieser QR Code ermöglicht einfaches, sicheres und schnelles " "Begleichen dieser Rechnung via GiroPay:\n" " Diesen Code mit dem Smartphone scannen und Überweisung per Banking " "App aufgeben.\n" "

    \n" " {% endif %}\n" "```\n" msgstr "" #. type: Title == #: kraft.adoc:751 #, no-wrap msgid "Menus and Shortcuts" msgstr "" #. type: Title === #: kraft.adoc:753 #, no-wrap msgid "Main Application Menu" msgstr "" #. type: Title ==== #: kraft.adoc:756 #, no-wrap msgid "The File Menu" msgstr "" #. type: Plain text #: kraft.adoc:761 #, no-wrap msgid "" " [File]>[Quit]\n" " [Ctrl]+[Q]\n" " Quits the application.\n" msgstr "" #. type: Title ==== #: kraft.adoc:763 #, no-wrap msgid "The Document Menu" msgstr "" #. type: Plain text #: kraft.adoc:769 #, no-wrap msgid "" " [Document]>[Show Document]\n" " [Ctrl]+[R]\n" " Opens a window with the selected document for showing it.\n" msgstr "" #. type: Plain text #: kraft.adoc:773 #, no-wrap msgid "" " [Document]>[Edit Document]\n" " [Ctrl+O]\n" " Opens a window with the selected document for editing it.\n" msgstr "" #. type: Plain text #: kraft.adoc:777 #, no-wrap msgid "" " [Document]>[Open Archived document]\n" " [Ctrl]+[A]\n" " Opens an archived document.\n" msgstr "" #. type: Plain text #: kraft.adoc:780 #, no-wrap msgid "" " [Document]>[Create Document]\n" " Opens a window with a wizard for creating a new client-document.\n" msgstr "" #. type: Plain text #: kraft.adoc:784 #, no-wrap msgid "" " [Document]>[Copy Document]\n" " Makes a copy of the selected client-document to a new client-document\n" " which can belong to an other client or an other documenttype.\n" msgstr "" #. type: Plain text #: kraft.adoc:787 #, no-wrap msgid "" " [Document]>[Follow Document]\n" " Opens the selected client-document for editing.\n" msgstr "" #. type: Plain text #: kraft.adoc:791 #, no-wrap msgid "" " [Document]>[Print document]\n" " Makes a PDf from the selected client-document for to be mailed or\n" " printed.\n" msgstr "" #. type: Plain text #: kraft.adoc:795 #, no-wrap msgid "" " [Document]>[Mail document]\n" " [Ctrl]+[M]\n" " Mails a document.\n" msgstr "" #. type: Title ==== #: kraft.adoc:798 #, no-wrap msgid "The Settings menu" msgstr "" #. type: Plain text #: kraft.adoc:804 #, no-wrap msgid "" " [Settings]>[Edit Tag Templates]\n" " [Ctrl]+[E]\n" " Opens a window where you add, edit or translate the tags (like work,\n" " material, plants or discounts).\n" msgstr "" #. type: Plain text #: kraft.adoc:808 #, no-wrap msgid "" " [Settings]>[Redo initial setup]\n" " [Ctrl+R]\n" " Redoes the initial setup. After this, a restart of Kraft is required.\n" msgstr "" #. type: Plain text #: kraft.adoc:812 #, no-wrap msgid "" " [Settings]>[Showed toolbars]\n" " Here you can decide if the `main toolbar` and the toolbar `Document " "Actions`\n" " are shown.\n" msgstr "" #. type: Plain text #: kraft.adoc:816 #, no-wrap msgid "" " [Settings]>[Configure Kraft]\n" " [Ctrl]+[Shft]+[,]\n" " Here you can configure Kraft.\n" msgstr "" #. type: Title === #: kraft.adoc:817 #, no-wrap msgid "Document Edit Window" msgstr "" #. type: Title ==== #: kraft.adoc:820 #, no-wrap msgid "The context Menu" msgstr "" #. type: Plain text #: kraft.adoc:824 #, no-wrap msgid "" " [Context]>[Item kind]\n" " change the status from this item between\n" msgstr "" #. type: Plain text #: kraft.adoc:825 #, no-wrap msgid "Normal\n" msgstr "" #. type: Plain text #: kraft.adoc:826 #, no-wrap msgid "Alternative\n" msgstr "" #. type: Plain text #: kraft.adoc:827 #, no-wrap msgid "On demand\n" msgstr "" #. type: Plain text #: kraft.adoc:830 #, no-wrap msgid "" " [Context]>[Tax]\n" " Seems not working.\n" msgstr "" #. type: Plain text #: kraft.adoc:833 #, no-wrap msgid "" " [Context]>[Move up]\n" " Moves this item a place up in document.\n" msgstr "" #. type: Plain text #: kraft.adoc:836 #, no-wrap msgid "" " [Context]>[Move down]\n" " Moves this item a place down in document.\n" msgstr "" #. type: Plain text #: kraft.adoc:839 #, no-wrap msgid "" " [Context]>[Lock item]\n" " It is not clear what is does.\n" msgstr "" #. type: Plain text #: kraft.adoc:842 #, no-wrap msgid "" " [Context]>[Unlock item]\n" " It is not clear what is does.\n" msgstr "" #. type: Plain text #: kraft.adoc:845 #, no-wrap msgid "" " [Context]>[Delete item]\n" " Removes this item from document.\n" msgstr "" #. type: Title == #: kraft.adoc:848 #, no-wrap msgid "Advanced Topics" msgstr "" #. type: Plain text #: kraft.adoc:851 msgid "" "This chapter describes advanced topics around Kraft. Some Linux knowledge is " "required, and setups should be done by experienced Linux administrators and " "should be tested carefully." msgstr "" #. type: Title === #: kraft.adoc:852 #, no-wrap msgid "Using Kraft Collaboratively" msgstr "" #. type: Plain text #: kraft.adoc:855 msgid "" "Kraft can be used collaborative in a distributed environment. That means " "that multiple users work on their desktops with their own Kraft instance on " "the same data." msgstr "" #. type: Plain text #: kraft.adoc:857 msgid "" "This whole topic is a subject to change, as Kraft will evolve to use " "ownCloud as a private cloud solution to store the data." msgstr "" #. type: Title ==== #: kraft.adoc:858 #, no-wrap msgid "Sharing Database and Document Pool" msgstr "" #. type: Plain text #: kraft.adoc:861 msgid "" "The simplest case is that two or more Kraft instances use a database " "together and access the same pool of PDF documents on the harddisk. For " "simplicity this describes only two Kraft instances." msgstr "" #. type: Plain text #: kraft.adoc:863 msgid "" "A typical use case would be: Two different Linux users want to use " "Kraft. They both have their own computer but only work in the same " "network. For example this would describe a situation with one main office " "machine that runs Kraft in normal mode, plus a notebook with Kraft in read " "only mode to view documents, check catalogs and such." msgstr "" #. type: Plain text #: kraft.adoc:865 msgid "For that, the following prerequisites have to be met:" msgstr "" #. type: Plain text #: kraft.adoc:867 msgid "MySQL or MariaDB is used as database backend. Sqlite is not supported." msgstr "" #. type: Plain text #: kraft.adoc:868 msgid "" "The database is accessible with a mysql user and from each machine for both " "users." msgstr "" #. type: Plain text #: kraft.adoc:869 msgid "The document store directory has to be shared." msgstr "" #. type: delimited block _ #: kraft.adoc:873 msgid "" "WARNING: There is no protection against having both users editing the same " "document. Because that is dangerous and can lead to unpredictable results, " "it is recommended to run all instances of Kraft except the main one in read " "only mode. This is done by starting Kraft with the `-r` command line switch." msgstr "" #. type: Plain text #: kraft.adoc:876 #, no-wrap msgid "**Sharing the Database**\n" msgstr "" #. type: Plain text #: kraft.adoc:878 msgid "" "The database server should be installed on the main machine or a dedicated " "device like a NAS. Networking speed influences the comfort to use obviously." msgstr "" #. type: Plain text #: kraft.adoc:880 msgid "Find howtos on the internet how to setup MySQL accordingly." msgstr "" #. type: Plain text #: kraft.adoc:882 #, no-wrap msgid "**Sharing the Document Pool Directory**\n" msgstr "" #. type: Plain text #: kraft.adoc:884 msgid "" "Kraft writes generated PDF documents into a local directory. Where that is " "can be configured in the Kraft Config file. The config file has to be " "adopted on all instances." msgstr "" #. type: Plain text #: kraft.adoc:886 msgid "" "That is located in each users home directory, in the path " "`.config/kraftrc`. It has to contain the following config value:" msgstr "" #. type: Plain text #: kraft.adoc:888 kraft.adoc:892 msgid "```" msgstr "" #. type: Plain text #: kraft.adoc:890 msgid "PdfOutputDir=/data/space/kraftdoc/pdf" msgstr "" #. type: Plain text #: kraft.adoc:894 msgid "" "There are different ways how share that directory, ie. NFS or SMB " "storages. It is important that both users from both machines can list and " "access the files. The main user needs read and write access, read only users " "only need read access to the files." msgstr "" #. type: Plain text #: kraft.adoc:896 msgid "" "A recommended setup is a NFS share with autofs which is set up on the main " "machine. To manage file access a certain group should be set up on the " "machines with which access can be managed." msgstr "" #. type: Plain text #: kraft.adoc:898 #, no-wrap msgid "**Starting Kraft in read-only mode**\n" msgstr "" #. type: Plain text #: kraft.adoc:900 msgid "" "To start Kraft in read-only mode, start the binary with the `-r` command " "line switch." msgstr "" #. type: Title === #: kraft.adoc:901 #, no-wrap msgid "XRechnung Support" msgstr "" #. type: Plain text #: kraft.adoc:904 msgid "" "Kraft supports the XRechnung standard. That is a digital format for " "electronic invoicing, and it passed as law in Germany and follows a EU " "directive. The XRechnung is a XML file format designed for that purpose." msgstr "" #. type: Plain text #: kraft.adoc:906 msgid "" "To use the XRechnung Export productivly, a little manual work is still " "needed in Kraft. Kraft creates the XML file based on a template, very " "similar to the normal PDF documents. That means that it loads a template " "that contains static elements (ie. the company address) that do not change " "between different invoices. The dynamic elements (customer data, items etc.) " "are filled into the template during the generation step." msgstr "" #. type: Plain text #: kraft.adoc:908 msgid "" "In order to generate correct XRechnung files for the specific company, the " "user has to adopt the template file manually to the companies needs. Note " "that this has only to be done once and should be easy for a person with a " "bit computer experience (Basic knowledge about XML appreciated!)." msgstr "" #. type: Plain text #: kraft.adoc:910 msgid "" "To adapt the file to the needs of the company, it is best to start with the " "https://raw.githubusercontent.com/dragotin/kraft/master/reports/xrechnung.xrtmpl[example " "XRechnung file]. It has to be downloaded and saved into a location that the " "user can edit. Open it in a normal text editor, such as " "https://kate-editor.org/[Kate]." msgstr "" #. type: Plain text #: kraft.adoc:912 msgid "" "Read carefully through the file without being scared off by the XML " "format. All user strings (ie. company name, address and such) are user " "specific and should be replaced accordingly. Find " "https://www.xoev.de/xrechnung-16828[details about the format] here to better " "understand the meaning of the fields." msgstr "" #. type: Plain text #: kraft.adoc:914 msgid "" "Make sure to not disturb the proper XML format and do not change places " "where the template format `{{ template_name }}` is used." msgstr "" #. type: Plain text #: kraft.adoc:916 msgid "" "Once the file is adopted to the needs, open the Settings dialog of Kraft and " "insert the filename into the entry field for the XRechnung Template File on " "the Document Defaults page." msgstr "" #. type: Plain text #: kraft.adoc:918 msgid "" "After that step, the btn:[Export XRechung] menu item will open a dialog to " "pick a filename where to save the XRechnung invoice to." msgstr "" #. type: Plain text #: kraft.adoc:920 msgid "This file can now be transfered to the receiver of the invoice." msgstr "" #. type: Plain text #: kraft.adoc:922 msgid "" "There are validators for invoices in XRechnung format out there in the " "internet. It is useful to verify the format of the Kraft exported XRechnung." msgstr "" #. type: Title === #: kraft.adoc:923 #, no-wrap msgid "Changing the Locale" msgstr "" #. type: Plain text #: kraft.adoc:926 msgid "" "If it is needed that Kraft runs under a different locale than the actual " "desktop environment, this can be achieved by setting the desired locale in " "the start file of Kraft." msgstr "" #. type: Plain text #: kraft.adoc:928 msgid "" "On the linux desktop, apps are usually started through a so called " "https://specifications.freedesktop.org/desktop-entry-spec/latest/[desktop " "file]. It contains the information how the Kraft binary is started if user " "clicks on the icon on the desktop or in the start menu." msgstr "" #. type: Plain text #: kraft.adoc:930 msgid "" "The desktop file can usually be found in " "`/usr/share/applications/de.volle-kraft-voraus.kraft.desktop`." msgstr "" #. type: Plain text #: kraft.adoc:936 msgid "" "It contains the line ``` Exec=kraft %u ``` which starts the application with " "the default locale." msgstr "" #. type: Plain text #: kraft.adoc:942 msgid "" "Changing it to ``` Exec=env LANG=de_DE.UTF-8 kraft %u ``` would change that " "to run in the German locale for example, independent from the desktop " "environment location." msgstr "" #. type: Title == #: kraft.adoc:945 #, no-wrap msgid "Credits and License" msgstr "" #. type: Plain text #: kraft.adoc:948 msgid "Program and documentation copyright 2004–2023 Klaas Freitag" msgstr "" #. type: Plain text #: kraft.adoc:949 msgid "Documentation copyright 2020-2023 Ronald Stroethoff" msgstr "" kraft-1.2.2/meta/000077500000000000000000000000001467704360200135625ustar00rootroot00000000000000kraft-1.2.2/meta/CMakeLists.txt000066400000000000000000000004201467704360200163160ustar00rootroot00000000000000########### install files ############### install(FILES kraft.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} RENAME de.volle_kraft_voraus.kraft.desktop) install(FILES kraft.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR} RENAME de.volle_kraft_voraus.kraft.appdata.xml) kraft-1.2.2/meta/kraft.appdata.xml000066400000000000000000000034771467704360200170370ustar00rootroot00000000000000 de.volle_kraft_voraus.kraft.desktop GPL-2.0+ CC0-1.0 Kraft Kraft helps to handle documents in small business

    Kraft is free software to help to handle documents like quotes and invoices in your small business. It is a Qt/KF5 based desktop software with a strong focus on ease of use and the just enough feature set for the use case. With Kraft, creating documents will run smooth and free time for more enjoyable things than office work.

    Kraft runs on any Linux desktop. There is no cloud involved, your data around your products and customers stays under your control.

    With Kraft, writing documents like quotes and invoices is very easy and fast. Repeating tasks are supported, documents can be generated semi automatically, ie. invoices from offers sent out before.

    For efficient work, Kraft supports catalogs to organize materials and template texts. It focuses on high quality printouts because paper is still the main communication media in the small business world. However, it also sends documents via email.

    https://volle-kraft-voraus.de/images/appmeta1.png Main window of Kraft https://volle-kraft-voraus.de/images/appmeta2.png Document edit window, header section https://volle-kraft-voraus.de/ kraft_AT_volle-kraft-voraus.de kraft
    kraft-1.2.2/meta/kraft.desktop000066400000000000000000000010111467704360200162550ustar00rootroot00000000000000[Desktop Entry] Type=Application Exec=kraft %u Icon=kraft X-DocPath=kraft/index.html Terminal=false Name=Kraft Name[ast]=Kraft Name[bs]=Kraft Name[cs]=Kraft Name[da]=Kraft Name[de]=Kraft Name[es]=Kraft Name[et]=Kraft Name[fi]=Kraft Name[fr]=Kraft Name[ga]=Kraft Name[gl]=Kraft Name[hu]=Kraft Name[mr]=क्राफ्ट Name[nl]=Kraft Name[pl]=Kraft Name[pt]=Kraft Name[pt_BR]=Kraft Name[sk]=Kraft Name[sv]=Kraft Name[tr]=Kraft Name[ug]=Kraft Name[uk]=Kraft Name[x-test]=xxKraftxx Categories=Office;Finance;Database; kraft-1.2.2/po/000077500000000000000000000000001467704360200132525ustar00rootroot00000000000000kraft-1.2.2/po/de/000077500000000000000000000000001467704360200136425ustar00rootroot00000000000000kraft-1.2.2/po/de/kraft.po000066400000000000000000003055151467704360200153220ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Klaas Freitag , 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-04 22:35+0200\n" "PO-Revision-Date: 2018-10-31 21:56+0000\n" "Last-Translator: Klaas Freitag , 2024\n" "Language-Team: German (https://app.transifex.com/kraftproject/teams/93132/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: addeditchapterdialog.cpp:35 #, kde-format msgid "Add/Edit Catalog Chapter" msgstr "Katalog-Kategorien hinzufügen/bearbeiten" #: addeditchapterdialog.cpp:41 #, kde-format msgid "Create a new Catalog Chapter" msgstr "Neues Katalogkapitel erstellen" #: addeditchapterdialog.cpp:45 #, kde-format msgid "Chapter name:" msgstr "Kapitelname:" #: addeditchapterdialog.cpp:49 #, kde-format msgid "Chapter description:" msgstr "Kapitelbeschreibung:" #: addeditchapterdialog.cpp:76 #, kde-format msgid "Create new Catalog Chapter below chapter %1" msgstr "Neues Katalogkapitel unter Kapitel %1 erstellen" #: addeditchapterdialog.cpp:83 #, kde-format msgid "Edit name and description of chapter %1" msgstr "Name und Beschreibung von Kapitel %1 bearbeiten" #: addressselectorwidget.cpp:219 #, kde-format msgid "Name" msgstr "Name" #: addressselectorwidget.cpp:221 #, kde-format msgid "Address" msgstr "Kundenadresse" #: addressselectorwidget.cpp:288 filterheader.cpp:40 #, kde-format msgid "&Search:" msgstr "&Suchen: " #: addressselectorwidget.cpp:325 #, kde-format msgid "Edit Contact…" msgstr "Kontakt bearbeiten…" #: addressselectorwidget.cpp:326 #, kde-format msgid "Edit the currently selected contact" msgstr "Bearbeitet den aktuell ausgewählten Kontakt" #: addressselectorwidget.cpp:329 #, kde-format msgid "New Contact…" msgstr "Neuer Kontakt…" #: addressselectorwidget.cpp:330 #, kde-format msgid "Create a new Contact" msgstr "Neuen Kontakt erstellen" #: alldocsview.cpp:64 #, kde-format msgid "All documents" msgstr "Alle Dokumente" #: alldocsview.cpp:65 #, kde-format msgid "Documents of last week" msgstr "Dokumente der letzten Woche" #: alldocsview.cpp:66 #, kde-format msgid "Documents of last month" msgstr "Dokumente im letzten Monat" #: alldocsview.cpp:72 #, kde-format msgid "&Show: " msgstr "&Anzeigen" #: alldocsview.cpp:79 #, kde-format msgid "&Search: " msgstr "&Suchen: " #: alldocsview.cpp:134 portal.cpp:303 portal.cpp:304 rc.cpp:686 #, kde-format msgid "Document Actions" msgstr "Dokument-Aktionen" #: archdoc.cpp:65 #, kde-format msgid "%1 for %2 (ID %3)" msgstr "%1 für %2 (ID %3)" #: calcpart.cpp:98 #, kde-format msgid "Base" msgstr "Basis" #: catalogselection.cpp:50 #, kde-format msgid "Selected &catalog: " msgstr "&Katalog auswählen:" #: catalogselection.cpp:159 #, kde-format msgid "Append to Document" msgstr "An Dokument anfügen" #: catalogtemplate.cpp:52 #, kde-format msgid "Manual Price" msgstr "Manueller Preis" #: catalogtemplate.cpp:54 #, kde-format msgid "Calculated" msgstr "Kalkuliert" #: catalogtemplate.cpp:56 #, kde-format msgid "AutoCalc" msgstr "Automatische Kalkulation" #: catalogtemplate.cpp:57 #, kde-format msgid "Err: Unknown type %d" msgstr "Fehler: Unbekannter Typ %d" #: defaultprovider.cpp:63 doctext.cpp:80 positionviewwidget.cpp:418 #, kde-format msgid "Unknown" msgstr "Unbekannt" #: docassistant.cpp:52 #, kde-format msgid "Show &Templates" msgstr "Vorlagen anzeigen" #: docassistant.cpp:57 #, kde-format msgid "Show mask to create or select templates to be used in the document" msgstr "" "Den Dialog zum Erstellen oder Auswählen von Dokumentvorlagen anzeigen." #: docassistant.cpp:121 #, kde-format msgid "Add a template to the document" msgstr "Vorlage zum Dokument hinzufügen" #: docassistant.cpp:128 #, kde-format msgid "Insert the template to the document" msgstr "Vorlage an Cursor-Position in das Dokument einfügen" #: docassistant.cpp:136 #, kde-format msgid "Create a new template" msgstr "Eine neue Vorlage erstellen" #: docassistant.cpp:143 #, kde-format msgid "Edit the current template" msgstr "Aktuelle Vorlage bearbeiten" #: docassistant.cpp:150 #, kde-format msgid "Delete the current template" msgstr "Aktuelle Vorlage löschen" #: docassistant.cpp:319 #, kde-format msgid "" "Do you really want to delete the template permanently?\n" "It cannot be recovered." msgstr "" "Möchten Sie die Vorlage wirklich löschen?\n" "Sie kann nicht wieder hergestellt werden." #: docdigestdetailview.cpp:229 rc.cpp:78 rc.cpp:120 #, kde-format msgid "Amount" msgstr "Menge" #: docdigestdetailview.cpp:230 #, kde-format msgid "Type" msgstr "Art" #: docdigestdetailview.cpp:231 #, kde-format msgid "Sum" msgstr "Summe" #: docdigestdetailview.cpp:260 #, kde-format msgid "Results in %1 %2" msgstr "Resultate in %1 %2" #: docdigestdetailview.cpp:261 docdigestdetailview.cpp:294 #, kde-format msgid "Year" msgstr "Jahr" #: docdigestdetailview.cpp:263 #, kde-format msgid "Month" msgstr "Monat" #: docdigestdetailview.cpp:296 #, kde-format msgid "Results in Year %1" msgstr "Resultate im Jahr %1" #: docdigestdetailview.cpp:315 docdigestdetailview.cpp:324 #, kde-format msgid "Customer" msgstr "Kunde:" #: docdigestdetailview.cpp:319 #, kde-format msgid "not set" msgstr "nicht ausgewählt" #: docdigestdetailview.cpp:335 #, kde-format msgid "The address is not listed in an address book." msgstr "Die Adresse ist in keinem Adressbuch enthalten." #: docdigestdetailview.cpp:337 #, kde-format msgid "" "The client has the address book id %1 but cannot found in our address books." msgstr "" "Der Kontakt hat die Adressbuch ID %1, kann aber nicht im Adressbuch gefunden" " werden." #: docdigestdetailview.cpp:340 #, kde-format msgid "The client can be found in our address books." msgstr "Der Kunde wurde in unseren Adressbüchern gefunden." #: docdigestdetailview.cpp:351 prefsdialog.cpp:744 #, kde-format msgid "preferred address" msgstr "Bevorzugte Adresse" #: docdigestdetailview.cpp:355 prefsdialog.cpp:748 #, kde-format msgid "home address" msgstr "Privatanschrift" #: docdigestdetailview.cpp:359 prefsdialog.cpp:752 #, kde-format msgid "work address" msgstr "Arbeitsplatzadresse" #: docdigestdetailview.cpp:363 prefsdialog.cpp:756 #, kde-format msgid "postal address" msgstr "Postanschrift" #: docdigestdetailview.cpp:367 prefsdialog.cpp:760 #, kde-format msgid "international address" msgstr "Internationale Adresse" #: docdigestdetailview.cpp:371 prefsdialog.cpp:764 #, kde-format msgid "domestic address" msgstr "Privatanschrift" #: docdigestdetailview.cpp:375 prefsdialog.cpp:768 #, kde-format msgid "unknown" msgstr "Unbekannt" #: docdigestdetailview.cpp:412 models/docbasemodel.cpp:32 #, kde-format msgid "Date" msgstr "Datum" #: docdigestdetailview.cpp:417 models/docbasemodel.cpp:35 #, kde-format msgid "Whiteboard" msgstr "Notizen" #: docdigestdetailview.cpp:422 models/docbasemodel.cpp:39 #, kde-format msgid "Project" msgstr "Projekt" #: docdigestdetailview.cpp:432 #, kde-format msgid "This document was never printed." msgstr "Das Dokuments wurde nie gedruckt." #: docdigestdetailview.cpp:439 #, kde-format msgid "Last printed" msgstr "Zuletzt gedruckt" #: docdigestdetailview.cpp:440 #, kde-format msgid "Opens last created PDF document" msgstr "Öffnet das letzte erstellte PDF Dokument" #: docdigestdetailview.cpp:441 #, kde-format msgid "open" msgstr "offen" #: docdigestdetailview.cpp:446 #, kde-format msgid "One older print" msgstr "Ein älterer Ausdruck" #: docdigestdetailview.cpp:448 #, kde-format msgid "%1 older prints" msgstr "%1 alte Ausdrucke" #: docdigestdetailview.cpp:452 #, kde-format msgid "Archived documents cannot be found. Check PDF Output dir." msgstr "" "Das archivierte Dokument kann nicht gefunden werden. Überprüfen Sie das PDF " "Ausgabe-Verzeichnis." #: docdigestdetailview.cpp:457 #, kde-format msgid "Export the invoice in XRechnung file format" msgstr "Rechnung in XRechnung Format exportieren" #: docdigestdetailview.cpp:458 #, kde-format msgid "XRechnung" msgstr "XRechnung" #: docpostcard.cpp:33 #, kde-format msgid "Document Overview" msgstr "Dokumenten-Übersicht" #: docpostcard.cpp:125 #, kde-format msgid "Netto:" msgstr "Netto:" #: docpostcard.cpp:136 docpostcard.cpp:143 #, kde-format msgid "+ %1% Tax:" msgstr "+ %1 % Steuer:" #: docpostcard.cpp:149 #, kde-format msgid "Sum Tax:" msgstr "Steuersumme:" #: docpostcard.cpp:154 #, kde-format msgid "Total:" msgstr "Gesamt:" #: docpostcard.cpp:246 #, kde-format msgid "%1 Items" msgstr "%1 Posten" #: docpostcard.cpp:248 #, kde-format msgid "%1 Items, netto %2" msgstr "%1 Posten, Netto %2" #: doctext.cpp:61 #, kde-format msgid "Standard" msgstr "Standard" #: doctext.cpp:76 #, kde-format msgid "Header Text" msgstr "Kopftext" #: doctext.cpp:77 #, kde-format msgid "Footer Text" msgstr "Fußtext" #: doctext.cpp:78 #, kde-format msgid "Items" msgstr "Posten" #: doctypeedit.cpp:49 #, kde-format msgid "" msgstr "" #: doctypeedit.cpp:50 #, kde-format msgid "
    " msgstr "" #: doctypeedit.cpp:85 #, kde-format msgid "Select template file from harddisk" msgstr "Dokument-Template auf der Festplatte auswählen" #: doctypeedit.cpp:86 #, kde-format msgid "Select watermark file from harddisk" msgstr "Wasserzeichen-Datei auf der Festplatte auswählen" #: doctypeedit.cpp:87 #, kde-format msgid "Select PDF file to append to documents from harddisk" msgstr "PDF Datei von der Festplatte zum Anhängen an das Dokument auswählen" #: doctypeedit.cpp:91 prefsdialog.cpp:409 #, kde-format msgid "Find Template File" msgstr "Dokument Vorlage finden" #: doctypeedit.cpp:92 #, kde-format msgid "Kraft Templates (*.trml *.gtmpl)" msgstr "Kraft Dokument Vorlagen (*.trml *.gtmpl)" #: doctypeedit.cpp:100 #, kde-format msgid "Find Watermark File" msgstr "Wasserzeichen Datei finden" #: doctypeedit.cpp:101 doctypeedit.cpp:111 #, kde-format msgid "PDF file (*.pdf)" msgstr "PDF Datei (*.pdf)" #: doctypeedit.cpp:110 #, kde-format msgid "Find Append PDF File" msgstr "PDF Anhang auswählen" #: doctypeedit.cpp:176 doctypeedit.cpp:214 #, kde-format msgid "Add Document Type" msgstr "Dokumentenart hinzufügen" #: doctypeedit.cpp:177 #, kde-format msgid "Enter the name of a new document type" msgstr "Bitte geben Sie den Namen der neuen Dokumentenart ein." #: doctypeedit.cpp:215 #, kde-format msgid "Edit the name of a document type" msgstr "Den Namen einer Dokumentenart ändern." #: documentman.cpp:93 #, kde-format msgctxt "" "Text to be inserted into a doc, if the sum of another doc needs to be " "substracted ie. in a final invoice if there was a partial invoice before%1 " "is substited by the doc type, %2 by the id of the predecessor doc." msgid "Substract sum from %1 %2" msgstr "Subtrahiere Summe von %1 %2" #: documenttemplate.cpp:113 #, kde-format msgctxt "Sequence number printed on the document" msgid "No." msgstr "Nr." #: documenttemplate.cpp:114 #, kde-format msgctxt "Document item printed on the document" msgid "Item" msgstr "Posten" #: documenttemplate.cpp:115 #, kde-format msgctxt "Abbrev. of Quantity printed on the document" msgid "Qty." msgstr "Menge" #: documenttemplate.cpp:116 #, kde-format msgctxt "Unit printed on the document" msgid "Unit" msgstr "Einh." #: documenttemplate.cpp:117 #, kde-format msgctxt "Price of an item printed on the document" msgid "Price" msgstr "Preis" #: documenttemplate.cpp:118 #, kde-format msgctxt "Printed on the document" msgid "Sum" msgstr "Summe" #: documenttemplate.cpp:119 #, kde-format msgctxt "printed on the document" msgid "Net" msgstr "Netto" #: documenttemplate.cpp:120 #, kde-format msgctxt "Printed on the document" msgid "VAT" msgstr "MwSt." #: documenttemplate.cpp:121 #, kde-format msgctxt "Document type, printed on the document" msgid "Type" msgstr "Typ" #: documenttemplate.cpp:123 #, kde-format msgctxt "Printed on the document" msgid "Phone" msgstr "Telefon" #: documenttemplate.cpp:124 #, kde-format msgctxt "Printed on the document" msgid "Fax" msgstr "Fax" #: documenttemplate.cpp:125 #, kde-format msgctxt "Printed on the document" msgid "Mobile" msgstr "Mobil" #: documenttemplate.cpp:126 #, kde-format msgctxt "Printed on the document" msgid "Email" msgstr "Email" #: documenttemplate.cpp:127 #, kde-format msgctxt "Printed on the document" msgid "Website" msgstr "Webseite" #: documenttemplate.cpp:129 #, kde-format msgctxt "Printed on the document" msgid "Page" msgstr "Seite" #: documenttemplate.cpp:130 #, kde-format msgctxt "Label of Predecessor document number" msgid "Predecessor-Doc" msgstr "Vorgänger-Dokument" #: documenttemplate.cpp:131 #, kde-format msgctxt "the 'of' in page X of Y" msgid "of" msgstr "von" #: documenttemplate.cpp:132 #, kde-format msgctxt "Document number on document" msgid "Document No." msgstr "Dokument Nr." #: documenttemplate.cpp:133 #, kde-format msgctxt "Date on document" msgid "Date" msgstr "Datum" #: documenttemplate.cpp:134 #, kde-format msgctxt "Project label" msgid "Project" msgstr "Projekt" #: documenttemplate.cpp:135 #, kde-format msgctxt "Customer ID on document" msgid "Customer ID" msgstr "Kundennr." #: documenttemplate.cpp:200 #, kde-format msgctxt "" "Credit Transfer reason string, 1=DocType, 2=DocIdent, 3=Date, ie. Invoice " "2022-183 dated 2022-03-22" msgid "%1 %2 dated %3" msgstr "%1 %2 datiert auf %3" #: documenttemplate.cpp:321 #, kde-format msgid "" "Please note: This offer contains %1 alternative or demand positions, printed" " in italic font. These do not add to the overall sum." msgstr "" "Bitte beachten: Dieses Angebot enthält %1 Alternativ- oder " "Bedarfspositionen, die kursiv gedruckt sind. Diese addieren sich nicht zur " "Endsumme." #: documenttemplate.cpp:332 #, kde-format msgid "tax free items (%1 pcs.)" msgstr "Steuerfreie Posten (%1 Stck.)" #: documenttemplate.cpp:338 #, kde-format msgid "items with reduced tax of %1% (%2 pcs.)" msgstr "Posten mit reduzierter Steuer %1% (%2 Stck.)" #: documenttemplate.cpp:347 #, kde-format msgid "No label: items with full tax of %1% (%2 pcs.)" msgstr "Nicht gekennzeichnet: Posten mit vollem Steuersatz von %1% (%2 Stck.)" #: documenttemplate.cpp:377 kraftview_ro.cpp:225 #, kde-format msgid "reduced VAT" msgstr "Reduzierte Umsatzsteuer" #: documenttemplate.cpp:385 kraftview_ro.cpp:197 kraftview_ro.cpp:234 #: rc.cpp:21 #, kde-format msgid "VAT" msgstr "Umsatzsteuer" #: documenttemplate.cpp:439 #, kde-format msgid "Template to convert is not existing!" msgstr "Vorlage existiert nicht!" #: documenttemplate.cpp:442 #, kde-format msgid "Can not read template file!" msgstr "Vorlangendatei kann nicht gelesen werden!" #: fixcalcdialog.cpp:36 #, kde-format msgid "Calculation Fix Item" msgstr "Zeitkostenanteil" #: flostempldialog.cpp:71 #, kde-format msgid "Create or Edit Template Items" msgstr "Posten der Vorlage erstellen oder bearbeiten" #: flostempldialog.cpp:213 flostempldialog.cpp:604 #, kde-format msgid "No" msgstr "Nein" #: flostempldialog.cpp:214 flostempldialog.cpp:604 #, kde-format msgid "Yes" msgstr "Ja" #: flostempldialog.cpp:251 #, kde-format msgid "Calculated price: " msgstr "Kalkulierter Preis:" #: flostempldialog.cpp:255 #, kde-format msgid "Manual price: " msgstr "Manueller Preis:" #: flostempldialog.cpp:260 #, kde-format msgid "(+%1%)" msgstr "(+ %1 %)" #: flostempldialog.cpp:264 #, kde-format msgid "%1%" msgstr "%1 %" #: flostempldialog.cpp:266 #, kde-format msgid ": " msgstr ": " #: flostempldialog.cpp:388 #, kde-format msgid "Template Error" msgstr "Vorlagenfehler" #: flostempldialog.cpp:388 #, kde-format msgid "Saving of this template failed, sorry" msgstr "Das Speichern der Vorlage ist fehlgeschlagen." #: flostempldialog.cpp:416 #, kde-format msgid "The template has been modified." msgstr "Vorlage geändert" #: flostempldialog.cpp:417 #, kde-format msgid "Do you want to discard your changes?" msgstr "" "Die Vorlage ist bearbeitet worden. Möchten Sie wirklich alle Änderungen " "verwerfen?" #: flostempldialog.cpp:446 #, kde-format msgid "" "The catalog chapter was changed for this template.\n" "Do you really want to move the template to the new chapter?" msgstr "" "Die Kategorie des Katalogs für diese Vorlage ist geändert worden.\n" "Möchten Sie diese Vorlage wirklich in die neue Kategorie verschieben?" #: flostempldialog.cpp:448 #, kde-format msgid "Chapter Change" msgstr "Kapitelveränderung" #: flostempldialog.h:104 #, kde-format msgid "Calculated material" msgstr "Kalkuliertes Material" #: importfilter.cpp:50 #, kde-format msgid "Unable to find filter called %1" msgstr "Der Filter mit dem Namen „%1“ kann nicht gefunden werden." #: importfilter.cpp:58 #, kde-format msgid "Could not open the definition file!" msgstr "Definitionsdatei kann nicht geöffnet werden!" #: importfilter.cpp:143 #, kde-format msgid "Unknown tags: " msgstr "Unbekannte Markierungen:" #: importfilter.cpp:184 #, kde-format msgid "Could not recode input file!" msgstr "Umcodieren der Eingabedatei fehlgeschlagen!" #: importfilter.cpp:192 #, kde-format msgid "Unable to open temp file " msgstr "Die temporäre Datei kann nicht geöffnet werden " #: importfilter.cpp:198 #, kde-format msgid "Could not open the import source file!" msgstr "Die zu importierende Datei kann nicht geöffnet werden." #: importitemdialog.cpp:47 #, kde-format msgid "Import Items From File" msgstr "Posten aus Datei importieren" #: importitemdialog.cpp:116 #, kde-format msgid "the Header of the Document" msgstr "Der Kopfbereich des Dokuments." #: importitemdialog.cpp:125 templtopositiondialogbase.cpp:58 #, kde-format msgid "…" msgstr "…" #: inserttempldialog.cpp:103 #, kde-format msgid "Create a New Item" msgstr "Neuen Posten anlegen" #: inserttempldialog.cpp:105 #, kde-format msgid "Create a New Item from Template" msgstr "Neuen Posten aus Vorlage erstellen" #: itemtagdialog.cpp:82 #, kde-format msgid "Edit Item Tags" msgstr "Posten-Markierungen bearbeiten" #: itemtagdialog.cpp:89 #, kde-format msgid "Item Tags" msgstr "Posten-Markierungen" #: itemtagdialog.cpp:90 #, kde-format msgid "Select all tags for the item should be tagged with." msgstr "Wählen Sie alle Markierungen für den Posten aus." #: itemtagdialog.cpp:105 tagtemplatesdialog.cpp:150 #, kde-format msgid "Tag" msgstr "Markierung" #: itemtagdialog.cpp:106 tagtemplatesdialog.cpp:151 #, kde-format msgid "Color" msgstr "Farbe" #: itemtagdialog.cpp:107 tagtemplatesdialog.cpp:152 #, kde-format msgid "Description" msgstr "Beschreibung" #: katalog.cpp:137 #, kde-format msgid "not found" msgstr "nicht gefunden" #: kataloglistview.cpp:355 #, kde-format msgid "A catalog chapter cannot be deleted as long it has children." msgstr "" "Ein Kapitel im Katalog kann nicht gelöscht werden, wenn es noch Unterkapitel" " gibt." #: kataloglistview.cpp:356 #, kde-format msgid "Chapter cannot be deleted" msgstr "Das Kapitel kann nicht gelöscht werden" #: katalogview.cpp:119 rc.cpp:182 rc.cpp:195 rc.cpp:250 rc.cpp:257 rc.cpp:900 #, no-c-format, kde-format msgid "%p%" msgstr "%p%" #: katalogview.cpp:167 #, kde-format msgid "Edit Sub chapter" msgstr "Unterkapitel bearbeiten" #: katalogview.cpp:169 #, kde-format msgid "Edit a catalog sub chapter" msgstr "Katalog-Unterkapitel bearbeiten" #: katalogview.cpp:173 #, kde-format msgid "Add a sub chapter" msgstr "Unterkapitel hinzufügen" #: katalogview.cpp:175 #, kde-format msgid "Add a sub chapter below the selected one" msgstr "Ein Unterkapitel unter dem ausgewählten hinzufügen" #: katalogview.cpp:179 katalogview.cpp:181 #, kde-format msgid "Remove a sub chapter" msgstr "Unterkapitel entfernen" #: katalogview.cpp:185 rc.cpp:3 #, kde-format msgid "Edit Template" msgstr "Vorlage bearbeiten" #: katalogview.cpp:187 #, kde-format msgid "Opens the editor window for templates to edit the selected one" msgstr "Öffnet das Fenster zum Ändern der ausgewählten Vorlage." #: katalogview.cpp:192 #, kde-format msgid "New template" msgstr "Neue Vorlage" #: katalogview.cpp:194 #, kde-format msgid "Opens the editor window for templates to enter a new template" msgstr "Öffnet das Fenster zum Anlegen einer neuen Vorlage." #: katalogview.cpp:199 #, kde-format msgid "Delete template" msgstr "Vorlage löschen" #: katalogview.cpp:201 #, kde-format msgid "Deletes the template" msgstr "Löscht die Vorlage" #: katalogview.cpp:206 #, kde-format msgid "Export catalog" msgstr "Katalog exportieren" #: katalogview.cpp:208 #, kde-format msgid "Export the whole catalog as XML encoded file" msgstr "Den gesamten Katalog als XML-Datei exportieren." #: katalogview.cpp:213 #, kde-format msgid "Import catalog" msgstr "Katalog importieren" #: katalogview.cpp:215 #, kde-format msgid "Import a catalog from a XML file" msgstr "Katalog aus einer XML Datei einlesen " #: katalogview.cpp:219 rc.cpp:527 #, kde-format msgid "&Catalog" msgstr "&Katalog" #: katalogview.cpp:237 #, kde-format msgid "Opening file…" msgstr "Datei wird geöffnet ..." #: katalogview.cpp:239 katalogview.cpp:305 katalogview.cpp:319 #: katalogview.cpp:328 katalogview.cpp:337 portal.cpp:750 portal.cpp:773 #: portal.cpp:1098 #, kde-format msgid "Ready." msgstr "Fertig." #: katalogview.cpp:244 portal.cpp:1042 #, kde-format msgid "Exiting…" msgstr "Beenden…" #: katalogview.cpp:301 #, kde-format msgid "Exporting file…" msgstr "Datei wird exportiert…" #: katalogview.cpp:310 #, kde-format msgid "Importing file… (not yet implemented)" msgstr "Datei importieren… (noch nicht implementiert)" #: katalogview.cpp:315 #, kde-format msgid "Creating a new sub chapter…" msgstr "Neues Unterkapitel wird erstellt…" #: katalogview.cpp:324 #, kde-format msgid "Editing a sub chapter…" msgstr "Unterkapitel wird bearbeitet…" #: katalogview.cpp:333 #, kde-format msgid "Removing a sub chapter…" msgstr "Unterkapitel wird entfernt…" #: katalogview.cpp:366 #, kde-format msgid "Created at %1 " msgstr "Angelegt am %1" #: katalogview.cpp:370 #, kde-format msgid ", last modified at %1" msgstr ", zuletzt angepasst am %1" #: katalogview.cpp:376 #, kde-format msgid "%1 times used, last at %2" msgstr "%1 mal verwendet, zuletzt am %2" #: kraftdoc.cpp:160 #, kde-format msgctxt "First argument is the doctype, like Invoice, followed by the ID" msgid "%1 (ID %2)" msgstr "%1 (ID %2)" #: kraftdoc.cpp:308 #, kde-format msgctxt "Document part header" msgid "Header" msgstr "Kopfbereich" #: kraftdoc.cpp:310 #, kde-format msgctxt "Document part footer" msgid "Footer" msgstr "Fußbereich" #: kraftdoc.cpp:312 #, kde-format msgctxt "Document part containing the items" msgid "Items" msgstr "Posten" #: kraftdoc.cpp:314 #, kde-format msgid "Unknown document part" msgstr "Unbekannter Dokumententeil" #: kraftdocfooteredit.cpp:52 #, kde-format msgid "Document Footer" msgstr "Dokumentfuß" #: kraftdocheaderedit.cpp:57 #, kde-format msgid "Document Header" msgstr "Dokumentkopf" #: kraftdocheaderedit.cpp:65 #, kde-format msgid "Manually set in address field." msgstr "Manuell im Adressfeld gesetzt." #: kraftdocpositionsedit.cpp:94 #, kde-format msgid "Add Item…" msgstr "Posten hinzufügen…" #: kraftdocpositionsedit.cpp:96 #, kde-format msgid "Add a normal item to the document manually." msgstr "Zum manuellen Hinzufügen eines Postens." #: kraftdocpositionsedit.cpp:100 #, kde-format msgid "Add Discount Item" msgstr "Rabattposten hinzufügen" #: kraftdocpositionsedit.cpp:103 #, kde-format msgid "" "Adds an item to the document that allows discounts on other items in the " "document" msgstr "" "Fügt einen Posten zum Dokument hinzu, mit dem Rabatte für andere Posten " "innerhalb des Dokuments gewährt werden können." #: kraftdocpositionsedit.cpp:106 #, kde-format msgid "Import Items…" msgstr "Posten importieren…" #: kraftdocpositionsedit.cpp:109 #, kde-format msgid "Opens a dialog where multiple items can be imported from a text file." msgstr "" "Öffnet einen Dialog zum Importieren mehrerer Posten aus einer Textdatei." #: kraftdocpositionsedit.cpp:118 #, kde-format msgid "Document Items" msgstr "Dokumentposten" #: kraftview.cpp:89 kraftview_ro.cpp:60 #, kde-format msgid "Document" msgstr "Dokument" #: kraftview.cpp:257 #, kde-format msgid "Successor of %1" msgstr "Nachfolger von %1" #: kraftview.cpp:395 kraftview.cpp:847 #, kde-format msgid "" "The address label is not empty and different from the selected one.
    Do " "you really want to replace it with the text shown below?
    %1
    " msgstr "" "Die Adress-Beschriftung ist nicht leer und unterscheidet sich von der " "ausgewählten Adresse
    Möchten Sie sie wirklich mit diesem angezeigten " "Text ersetzen?
    %1
    " #: kraftview.cpp:442 #, kde-format msgid "" "

    The Document Items List is still empty, but Items can be added " "now.

    To add items to the document either
    • Press the 'Add item' " "button above.
    • Open the template catalog by clicking on the 'show " "Template' button on the right and pick one of the available " "templates.
    " msgstr "" "

    Die Postenliste ist noch leer, aber jetzt können Posten hinzugefügt werden.

    \n" "Um Posten hinzuzufügen\n" "
      \n" "
    • Drücken Sie den 'Posten hinzufügen' Knopf
    • Öffnen Sie den Vorlagenkatalog durch einen Klick auf den 'Vorlagen anzeigen' Knopf rechts und übertragen Sie eine der vorhandenen Vorlagen.
    • \n" "
    \n" " " #: kraftview.cpp:634 prefsdialog.cpp:329 #, kde-format msgid "Display no tax at all" msgstr "Keine Steuer auswerfen" #: kraftview.cpp:635 prefsdialog.cpp:330 #, kde-format msgid "Calculate reduced tax for all items" msgstr "Reduzierte Steuer für alle Posten" #: kraftview.cpp:636 prefsdialog.cpp:331 #, kde-format msgid "Calculate full tax for all items" msgstr "Allgemeine Steuer für alle Posten" #: kraftview.cpp:637 #, kde-format msgid "Calculate individual tax for each item" msgstr "Einzelne Steuern für jeden Posten berechnen" #: kraftview.cpp:694 #, kde-format msgid "Tax Settings Overwrite" msgstr "Steuer-Einstellungen überschreiben" #: kraftview.cpp:695 #, kde-format msgid "Really overwrite all individual tax settings of the items?" msgstr "" "Möchten Sie wirklich alle individuellen Steuer-Einstellungen für diesen " "Eintrag überschreiben?" #: kraftview.cpp:846 #, kde-format msgid "Address Overwrite" msgstr "Adresse überschreiben" #: kraftview.cpp:1111 #, kde-format msgid "Discount" msgstr "Rabatt" #: kraftview.cpp:1351 #, kde-format msgid "The document has been modified." msgstr "Das Dokuments wurde verändert." #: kraftview.cpp:1352 #, kde-format msgid "Do you want to save your changes?" msgstr "Sollen die Änderungen gesichert werden?" #: kraftview_ro.cpp:198 #, kde-format msgid "Reduced TAX" msgstr "Reduzierte Steuer" #: main.cpp:58 #, kde-format msgid "Open document with arch doc number " msgstr "Dokument mit Archiv-Nummer %1 öffnen" #: main.cpp:59 #, kde-format msgid "Open Kraft in read only mode - document changes prohibited" msgstr "" "Kraft im Nur-Lesen Modus öffnen - Dokument Änderungen sind nicht möglich" #: materialkataloglistview.cpp:40 rc.cpp:108 rc.cpp:695 #, kde-format msgid "Material" msgstr "Material" #: materialkataloglistview.cpp:41 #, kde-format msgid "Pack" msgstr "Gebinde" #: materialkataloglistview.cpp:42 rc.cpp:123 #, kde-format msgid "Unit" msgstr "Einheit" #: materialkataloglistview.cpp:43 #, kde-format msgid "Purchase" msgstr "Einkauf" #: materialkataloglistview.cpp:44 #, kde-format msgid "Sale" msgstr "Verkauf" #: materialkataloglistview.cpp:45 models/docbasemodel.cpp:37 #, kde-format msgid "Last Modified" msgstr "Zuletzt geändert" #: materialkataloglistview.cpp:51 #, kde-format msgid "Material Catalog" msgstr "Material-Katalog" #: materialkatalogview.cpp:106 #, kde-format msgid "" msgstr "" #: materialkatalogview.cpp:136 templkatalogview.cpp:139 #, kde-format msgid "Do you really want to delete the template from the catalog?" msgstr "Möchten Sie die ausgewählte Vorlage wirklich aus dem Katalog löschen?" #: materialselectdialog.cpp:39 #, kde-format msgid "Add Material to Calculation" msgstr "Material zur Kalkulation hinzufügen" #: materialselectdialog.cpp:44 #, kde-format msgid "

    Add Material to Calculation

    " msgstr "

    Material zur Kalkulation hinzufügen

    " #: models/docbasemodel.cpp:33 #, kde-format msgid "Doc. Number" msgstr "Dokumentennummer" #: models/docbasemodel.cpp:34 #, kde-format msgid "Doc. Type" msgstr "Dokumenttyp" #: models/docbasemodel.cpp:36 #, kde-format msgid "Client ID" msgstr "Kundennummer" #: models/docbasemodel.cpp:38 #, kde-format msgid "Creation Date" msgstr "Erstellungsdatum" #: models/docbasemodel.cpp:40 #, kde-format msgid "Client Address" msgstr "Kundenadresse" #: models/docbasemodel.cpp:41 #, kde-format msgid "Client" msgstr "Kunde" #: models/docbasemodel.cpp:109 #, kde-format msgid "Looking up address…" msgstr "Adresse wird gesucht…" #: models/docbasemodel.cpp:111 #, kde-format msgid "Lookup started…" msgstr "Suche gestartet…" #: newdocassistant.cpp:52 newdocassistant.cpp:96 #, kde-format msgid "New Document Settings" msgstr "Einstellungen für neues Dokument" #: newdocassistant.cpp:55 #, kde-format msgid "" "Please select a customer as addressee for the document. If there is no entry" " for the customer in the addressbook yet, it can be opened by clicking on " "the button below." msgstr "" "Bitte wählen Sie einen Kunden als Adressaten für das Dokument aus. Wenn es " "noch keinen Eintrag für den Kunden im Adressbuch gibt, kann es hier geöffnet" " und ein neuer Kunde angelegt werden." #: newdocassistant.cpp:100 #, kde-format msgid "" "Select a document type and a date. A comment on the whiteboard helps to " "classify the document." msgstr "" "Wählen Sie einen Dokumenttyp und das Datum aus. Eine Notiz hilft, das " "Dokument besser zu klassifizieren." #: newdocassistant.cpp:107 #, kde-format msgid "Customer: Not yet selected!" msgstr "Kunde: Es ist noch kein Kunde ausgewählt." #: newdocassistant.cpp:116 #, kde-format msgid "Document &type:" msgstr "&Dokumenttyp:" #: newdocassistant.cpp:120 #, kde-format msgid "Document date: " msgstr "Dokumentdatum:" #: newdocassistant.cpp:123 #, kde-format msgid "Whiteboard content:" msgstr "Notizen:" #: newdocassistant.cpp:127 #, kde-format msgid "Copy document items from predecessor document" msgstr "Kopiere Posten vom Vorgängerdokument" #: newdocassistant.cpp:175 #, kde-format msgid "Create a new Kraft Document" msgstr "Erzeuge ein neues Kraft-Dokument" #: newdocassistant.cpp:265 #, kde-format msgid "Followup Document for %1" msgstr "Folgedokument für %1" #: numbercycledialog.cpp:52 #, kde-format msgid "Edit Number Cycles" msgstr "Nummernbestimmung ändern" #: numbercycledialog.cpp:67 #, kde-format msgid "" "The template may contain the following tags:
    • %y or %yyyy - the year " "of the documents date.
    • %yy - the year of the document (two " "digits).
    • %w - the week number of the documents date.
    • %ww - " "the week number of the documents date with leading zero.
    • %d - the " "day number of the documents date.
    • %dd - the day number of the " "documents date with leading zero.
    • %m or %M - the month number of the" " documents date.
    • %MM - the month number with leading " "zero.
    • %c - the customer id from kaddressbook
    • %i - the unique" " counter
    • %ii .. %iiiiii - the counter padded with leading 0, ie. " "012
    • %n - a day based counter, resets every day. Combined with date, " "it makes the number unique.
    • %nn .. %nnnnnn - the day based counter " "padded with leading 0.
    • %type - the localised doc type (offer, " "invoice etc.)
    • %uid - the contact id of the client.
    %i or %n" " need to be part of the template." msgstr "" "Die Vorlage kann die folgenden Platzhalter beinhalten:
    • %y or %yyyy - " "das Jahr des Dokumentdatums.
    • %yy - Jahr des Dokument Datums " "(zweistellig).
    • %w - Woche des Dokument Datums.
    • %ww - Woche " "des Dokument Datums mit führender Null.
    • %d - Nummer des Tages des " "Dokument Datums.
    • %dd - Tag des Dokumentdatums mit führender " "Null
    • %m or %M - Monatsnummer des Dokumentdatums.
    • %MM - " "Monatsnummer mit führender Null.
    • %c - Adressnummer aus " "Adressbuch
    • %i - der eindeutige Zähler
    • %ii .. %iiiiii - " "Zähler mit führender Null, zb. 0012
    • %n - Ein tagesbasierter Zähler, " "der jeden Tag zurückgestellt wird. Zusammen mit dem Datum " "eindeutig.
    • %nn .. %nnnnnn - tagesbasierter Zähler mit führender " "Null.
    • %type - Dokumenttyp, zb. Angebot oder Rechnung
    • %uid - " "Kontakt-ID des Kunden.
    %i oder %n müssen Teil der Vorlage sein." #: numbercycledialog.cpp:141 #, kde-format msgid "Doc-Type" msgstr "Dokumenttyp" #: numbercycledialog.cpp:154 #, kde-format msgctxt "do not translate %i, it is a template variable." msgid "(%i added)" msgstr "(%i hinzugefügt)" #: numbercycledialog.cpp:227 #, kde-format msgid "Add Number Cycle" msgstr "Nummernbestimmung hinzufügen" #: numbercycledialog.cpp:228 #, kde-format msgid "Enter the name of a new number cycle." msgstr "Geben Sie den Namen für die neue Nummernbestimmung an." #: numbercycledialog.cpp:286 #, kde-format msgid "The numbercycle %1 is still assigned to a document type." msgstr "Der Nummernkreis %1 ist noch einem Dokumenttyp zugeordnet." #: numbercycledialog.cpp:287 #, kde-format msgid "" "The number cycle cannot be deleted as long as it is assigned to a document " "type." msgstr "" "Der Nummernkreis ist noch einer oder mehreren Dokumentenarten zugeordnet und" " kann erst nach Aufhebung aller Zuordnungen gelöscht werden." #: numbercycledialog.cpp:346 #, kde-format msgid "Dangerous Counter Change" msgstr "Gefährlicher neuer Anfangswert" #: numbercycledialog.cpp:347 #, kde-format msgid "The new counter is lower than the old one. " msgstr "Der neue Zähler ist kleiner als der alte." #: numbercycledialog.cpp:348 #, kde-format msgid "" "That has potential to create duplicate document numbers. Do you really want " "to decrease it?" msgstr "" "Der neue Anfangswert ist niedriger als der vorherige. Dadurch besteht die " "Möglichkeit, dass Dokumentennummern doppelt vergeben werden. Möchten Sie den" " neuen Anfangswert wirklich übernehmen?" #: portal.cpp:105 #, kde-format msgid "&Quit" msgstr "&Beenden" #: portal.cpp:110 #, kde-format msgid "&Cut" msgstr "&Ausschneiden" #: portal.cpp:115 #, kde-format msgid "C&opy" msgstr "K&opieren" #: portal.cpp:120 #, kde-format msgid "&Paste" msgstr "&Einfügen" #: portal.cpp:125 #, kde-format msgid "&Settings" msgstr "&Einstellungen" #: portal.cpp:130 #, kde-format msgid "&Create Document" msgstr "Dokument &anlegen" #: portal.cpp:135 #, kde-format msgid "&Copy Document" msgstr "Dokument &kopieren" #: portal.cpp:140 #, kde-format msgid "Create &Followup Document" msgstr "&Nachfolgedokument erzeugen" #: portal.cpp:145 #, kde-format msgid "Print Document" msgstr "Dokument drucken" #: portal.cpp:150 #, kde-format msgid "Show Document" msgstr "Dokument anzeigen" #: portal.cpp:155 #, kde-format msgid "Edit Document" msgstr "Dokument bearbeiten" #: portal.cpp:160 #, kde-format msgid "Open Archived Document" msgstr "Archiviertes Dokument öffnen" #: portal.cpp:165 #, kde-format msgid "Mail Document" msgstr "Dokument mailen" #: portal.cpp:170 #, kde-format msgid "Export XRechnung" msgstr "XRechnung Export" #: portal.cpp:175 tagtemplatesdialog.cpp:135 tagtemplatesdialog.cpp:140 #, kde-format msgid "Edit Tag Templates" msgstr "Stichwort-Vorlagen bearbeiten" #: portal.cpp:180 #, kde-format msgid "Redo Initial Setup…" msgstr "Wiederhole initiales Setup…" #: portal.cpp:185 #, kde-format msgid "Kraft Handbook…" msgstr "Kraft Handbuch…" #: portal.cpp:190 #, kde-format msgid "About Qt…" msgstr "Über Qt…" #: portal.cpp:195 #, kde-format msgid "About Kraft…" msgstr "Über Kraft…" #: portal.cpp:199 #, kde-format msgid "Quits the application" msgstr "Anwendung beenden" #: portal.cpp:201 #, kde-format msgid "Cuts the selected section and puts it to the clipboard" msgstr "" "Schneidet den ausgewählten Abschnitt aus und kopiert ihn in die " "Zwischenablage." #: portal.cpp:202 #, kde-format msgid "Copies the selected section to the clipboard" msgstr "Kopiert den ausgewählten Abschnitt in die Zwischenablage." #: portal.cpp:203 #, kde-format msgid "Pastes the clipboard contents to current position" msgstr "Fügt den Inhalt der Zwischenablage an der aktuellen Position ein." #: portal.cpp:205 #, kde-format msgid "Creates a new Document" msgstr "Erstellt ein neues Dokument." #: portal.cpp:206 #, kde-format msgid "Print and archive this Document" msgstr "Das Dokument drucken und archivieren" #: portal.cpp:207 #, kde-format msgid "Creates a new document which is a copy of the selected document" msgstr "Erstellt ein neues Dokument, das eine Kopie des ausgewählten ist." #: portal.cpp:208 #, kde-format msgid "Create a followup document for the current document" msgstr "Ein Folgedokument für das aktuell ausgewählte erstellen" #: portal.cpp:209 #, kde-format msgid "Opens the document for editing" msgstr "Öffnet das Dokument zum Bearbeiten." #: portal.cpp:210 #, kde-format msgid "Opens a read only view on the document." msgstr "Öffnet das Dokument schreibgeschützt." #: portal.cpp:211 #, kde-format msgid "Send document per mail" msgstr "Das Dokument per E-Mail versenden" #: portal.cpp:212 #, kde-format msgid "Export invoice in XRechnung XML format." msgstr "Exportiere Rechnung in XRechnung XML Format." #: portal.cpp:213 #, kde-format msgid "" "Edit the available tag templates which can be assigned to document items." msgstr "" "Markierungs-Vorlagen hinzufügen, ändern oder entfernen, die den Posten der " "Dokumente zugeordnet werden können." #: portal.cpp:214 #, kde-format msgid "Configure the Database Kraft is working on." msgstr "Die Datenbank einrichten, mit der Kraft arbeitet." #: portal.cpp:215 #, kde-format msgid "Open a viewer on an archived document" msgstr "Das archivierte Dokument zur Ansicht öffnen" #: portal.cpp:227 rc.cpp:524 #, kde-format msgid "&File" msgstr "&Datei" #: portal.cpp:231 #, kde-format msgid "&Edit" msgstr "&Bearbeiten" #: portal.cpp:236 rc.cpp:680 #, kde-format msgid "&Document" msgstr "&Dokument" #: portal.cpp:251 #, kde-format msgid "Kraft" msgstr "Kraft" #: portal.cpp:254 #, kde-format msgid "&Preferences" msgstr "&Einstellungen" #: portal.cpp:258 #, kde-format msgid "Toolbars" msgstr "Werkzeugleisten" #: portal.cpp:264 #, kde-format msgid "&Help" msgstr "&Hilfe" #: portal.cpp:352 #, kde-format msgid "Database not running" msgstr "Datenbank nicht erreichbar" #: portal.cpp:353 #, kde-format msgid "" "Kraft was started in readonly mode, but the configured database cannot be connected.\n" "\n" "Kraft will abort." msgstr "" "Kraft wurde im Nur-Lesen Modus gestartet, aber die konfigurierte Datenbank kann nicht erreicht werden.\n" "\n" "Kraft wird beendet." #: portal.cpp:369 #, kde-format msgid "" "Kraft cannot connect to the specified MySQL server. Please check the Kraft " "database settings, check if the server is running and verify if a database " "with the name %1 exits!" msgstr "" "Kraft kann keine Verbindung zum angegebenen MySQL-Server herstellen. Bitte " "überprüfen Sie die Datenbank-Einstellungen, ob der Datenbank-Server läuft " "und ob eine Datenbank namens %1 vorhanden ist." #: portal.cpp:373 #, kde-format msgid "" "The database with the name %1 does not exist on the database server. Please " "make sure the database exists and is accessible by the user running Kraft." msgstr "" "Die Datenbank namens %1 ist auf dem Datenbank-Server nicht verfügbar. Bitte " "stellen Sie sicher, dass die Datenbank vorhanden ist und vom Benutzer, unter" " welchem Kraft läuft, darauf zugegriffen werden kann." #: portal.cpp:377 #, kde-format msgid "" "The Qt database driver could not be loaded. That probably means, that they " "are not installed. Please make sure the Qt database packages are installed " "and try again." msgstr "" "Der Qt-Datenbank-Treiber lässt sich nicht laden. Das bedeutet eventuell, " "dass er nicht installiert ist. Bitte stellen Sie sicher, dass die Qt-" "Datenbank-Pakete installiert sind und versuchen es dann erneut." #: portal.cpp:381 #, kde-format msgid "There is a database problem: %1" msgstr "Es ist ein Problem mit der Datenbank aufgetreten: %1" #: portal.cpp:399 #, kde-format msgid "Database Problem." msgstr "Datenbank-Problem" #: portal.cpp:411 #, kde-format msgid "Check commandline actions" msgstr "Befehlszeilenaktionen prüfen" #: portal.cpp:501 #, kde-format msgid "Welcome to Kraft, %1" msgstr "Willkommen zu Kraft, %1" #: portal.cpp:530 #, kde-format msgid "Creating new document…" msgstr "Neues Dokument erstellen…" #: portal.cpp:556 #, kde-format msgctxt "" "Dialog title of the followup doc dialog, followed by the id of the source " "doc" msgid "Create follow up document for %1" msgstr "Folgedokument für %1 anlegen" #: portal.cpp:601 #, kde-format msgctxt "Title of the new doc dialog, %1 is the source doc id" msgid "Create new Document as Copy of %1" msgstr "Neues Dokument als Kopie von %1 erzeugen" #: portal.cpp:636 #, kde-format msgid "Opening document to view…" msgstr "Dokument zur Ansicht öffnen…" #: portal.cpp:663 #, kde-format msgid "" "XRechnung Template file not set. Please check the application settings!" msgstr "" "Das XRechnung Template ist nicht gesetzt. Bitte die Einstellungen " "überprüfen!" #: portal.cpp:667 #, kde-format msgid "The XRechnung template file cannot be read!" msgstr "Das XRechnung Template kann nicht gelesen werden." #: portal.cpp:672 #, kde-format msgid "XRechnung Export" msgstr "XRechnung Export" #: portal.cpp:692 #, kde-format msgid "Save XRechnung" msgstr "Speichere XRechnung" #: portal.cpp:702 #, kde-format msgid "Saved XRechnung to %1" msgstr "XRechnung Datei in %1 gespeichert" #: portal.cpp:736 #, kde-format msgid "Generating PDF…" msgstr "PDF wird erstellt…" #: portal.cpp:759 #, kde-format msgid "Generating PDF to email" msgstr "Generiere PDF für EMail" #: portal.cpp:778 #, kde-format msgid "Doc Generation Error" msgstr "Dokument Generierungs-Fehler" #: portal.cpp:834 #, kde-format msgid "Printing archived document…" msgstr "Archiviertes Dokument drucken…" #: portal.cpp:886 #, kde-format msgid "Opening document %1" msgstr "Dokument %1 öffnen" #: portal.cpp:1069 #, kde-format msgid "Cutting selection…" msgstr "Auswahl ausschneiden…" #: portal.cpp:1076 #, kde-format msgid "Copying selection to clipboard…" msgstr "Auswahl in die Zwischenablage kopieren…" #: portal.cpp:1083 #, kde-format msgid "Inserting clipboard contents…" msgstr "Inhalt der Zwischenablage einfügen…" #: portal.cpp:1096 #, kde-format msgid "" "Ready. Kraft is running in read only mode. Document editing is prohibited." msgstr "" "Bereit. Kraft läuft im Nur-Lesen Modus. Dokumente können nicht editiert " "werden." #: portalview.cpp:68 #, kde-format msgid "About Kraft" msgstr "Über Kraft" #: portalview.cpp:98 #, kde-format msgid "Documents" msgstr "Dokumente" #: portalview.cpp:105 #, kde-format msgid "Timeline" msgstr "Zeitverlauf" #: portalview.cpp:113 #, kde-format msgid "Catalogs" msgstr "Kataloge" #: portalview.cpp:152 #, kde-format msgid "Kraft Document Overview" msgstr "Kraft-Dokument-Übersicht" #: portalview.cpp:159 portalview.cpp:178 #, kde-format msgid "Available Catalogs" msgstr "Verfügbare Kataloge" #: portalview.cpp:161 #, kde-format msgid "No catalogs available." msgstr "Keine Kataloge installiert" #: portalview.cpp:210 #, kde-format msgid "Open" msgstr "Öffnen" #: portalview.cpp:221 #, kde-format msgid "No templates yet." msgstr "Noch keine Vorlage angelegt." #: portalview.cpp:225 #, kde-format msgid "%1 templates in %2 chapters
    last modified at %3" msgstr "%1 Vorlagen in %2 Kapiteln
    Zuletzt angepasst am %3" #: portalview.cpp:276 #, kde-format msgid "Kraft Website" msgstr "Kraft Webseite" #: portalview.cpp:279 #, kde-format msgctxt "The string is followed by a link to the GPL2 text" msgid "Kraft is free software licensed under the" msgstr "Kraft ist freie Software lizensiert unter" #: portalview.cpp:280 #, kde-format msgctxt "The string is followed by the link to github" msgid "Kraft is maintained on " msgstr "Kraft wird entwickelt auf " #: portalview.cpp:281 #, kde-format msgid "Authors" msgstr "Autoren" #: portalview.cpp:282 #, kde-format msgid "Developer and Maintainer" msgstr "Entwickler und Maintainer" #: portalview.cpp:283 #, kde-format msgid "Developer" msgstr "Entwickler" #: portalview.cpp:284 #, kde-format msgctxt "The person who provided the logo graphics" msgid "Logo design" msgstr "Logo Entwurf" #: portalview.cpp:285 #, kde-format msgctxt "The person who provided the user manual" msgid "User Manual" msgstr "Bentzerhandbuch" #: portalview.cpp:287 #, kde-format msgid "" "Kraft helps you to handle documents like quotes and invoices in your small " "business." msgstr "" "Kraft ist freie Software zur schnellen, flexiblen und professionellen " "Angebots- und Rechnungsbearbeitung." #: portalview.cpp:288 #, kde-format msgid "Welcome to Kraft" msgstr "Willkommen zu Kraft" #: portalview.cpp:289 #, kde-format msgid "Kraft version" msgstr "Kraft-Version" #: portalview.cpp:291 #, kde-format msgid "Codename" msgstr "Codename" #: portalview.cpp:293 #, kde-format msgid "" "# How do you like Kraft overall?\n" "\n" "# What kind of business do you run?\n" "\n" "# In which country are you working?\n" "\n" "# Are you planning to continue with Kraft?\n" "\n" "# What else do you want to tell us?\n" "\n" msgstr "" "# Wie gefällt Ihnen Kraft insgesamt?\n" "\n" "# Welche Art von Geschäft betreiben Sie?\n" "\n" "# In welchem Land sind Sie tätig?\n" "\n" "# Planen Sie, Kraft weiter zu verwenden?\n" "\n" "# Werden Sie Kraft voraussichtlich weiter verwenden?\n" "\n" #: portalview.cpp:299 #, kde-format msgid "Send Feedback to the Kraft Authors" msgstr "Schicken Sie den Kraft Autoren Feedback" #: portalview.cpp:307 #, kde-format msgid "Git information" msgstr "Git Information" #: portalview.cpp:315 #, kde-format msgid "Country setting" msgstr "Ländereinstellung" #: portalview.cpp:318 #, kde-format msgid "Language setting" msgstr "Spracheinstellung" #: portalview.cpp:322 #, kde-format msgid "Kraft Initialisation Problem" msgstr "Kraft Initialisierungsproblem" #: portalview.cpp:323 #, kde-format msgid "" "There is a initialisation error on your system. Kraft will not work that " "way." msgstr "" "Bei der Initialisierung ist ein Fehler aufgetreten. Kraft wird so nicht " "funktionieren." #: portalview.cpp:330 #, kde-format msgid "Database Information" msgstr "Datenbank-Informationen" #: portalview.cpp:331 #, kde-format msgid "Kraft database name" msgstr "Kraft-Datenbankname" #: portalview.cpp:336 #, kde-format msgid "Required Version" msgstr "Nötige Version" #: portalview.cpp:339 #, kde-format msgid "Database schema version" msgstr "Datenbankschema-Version" #: portalview.cpp:341 #, kde-format msgid "Qt database driver" msgstr "Qt-Datenbank-Treiber" #: portalview.cpp:345 #, kde-format msgid "established" msgstr "Verbunden" #: portalview.cpp:345 #, kde-format msgid "NOT AVAILABLE!" msgstr "NICHT VERFÜGBAR" #: portalview.cpp:346 #, kde-format msgid "Database connection" msgstr "Datenbankverbindung" #: portalview.cpp:355 #, kde-format msgid "Database Version" msgstr "Datenbankversion" #: portalview.cpp:363 #, kde-format msgid "Addressbook Backend" msgstr "Adressbuch-Backend" #: portalview.cpp:364 #, kde-format msgid "Backend type" msgstr "Backendtyp" #: portalview.cpp:366 #, kde-format msgid "running" msgstr "läuft" #: portalview.cpp:366 #, kde-format msgid "not running" msgstr "nicht funktionsfähig" #: portalview.cpp:370 #, kde-format msgid "External Tools" msgstr "Externe Werkzeuge" #: portalview.cpp:372 #, kde-format msgid "RML to PDF conversion tool" msgstr "Umwandlungsprogramm (RML zu PDF):" #: portalview.cpp:374 #, kde-format msgid "not found!" msgstr "nicht gefunden." #: portalview.cpp:377 #, kde-format msgid "iconv tool for text import" msgstr "„iconv“-Werkzeug zum Textimport" #: portalview.cpp:380 #, kde-format msgid "weasyprint for PDF generation" msgstr "weasyprint zur PDF Generierung" #: portalview.cpp:384 #, kde-format msgid "not available" msgstr "nicht gefunden" #: portalview.cpp:389 #, kde-format msgid "Some Icons are made by" msgstr "Einige Icons sind erstellt von" #: portalview.cpp:390 #, kde-format msgid "Acknowledgements" msgstr "Danksagung" #: positionviewwidget.cpp:90 #, kde-format msgid "Item Actions" msgstr "Postenaktionen" #: positionviewwidget.cpp:93 #, kde-format msgid "Item Kind" msgstr "Postenart" #: positionviewwidget.cpp:94 positionviewwidget.cpp:687 #, kde-format msgid "Normal" msgstr "Normal" #: positionviewwidget.cpp:96 positionviewwidget.cpp:695 #, kde-format msgid "Alternative" msgstr "Alternative" #: positionviewwidget.cpp:98 #, kde-format msgid "On Demand" msgstr "Bei Bedarf" #: positionviewwidget.cpp:103 rc.cpp:281 #, kde-format msgid "Tax" msgstr "Steuer" #: positionviewwidget.cpp:106 #, kde-format msgid "Taxfree Item" msgstr "Steuerfreier Posten" #: positionviewwidget.cpp:112 #, kde-format msgid "Reduced Tax" msgstr "Reduzierter Steuersatz" #: positionviewwidget.cpp:118 #, kde-format msgid "Full Tax" msgstr "Allgemeiner Steuersatz" #: positionviewwidget.cpp:127 #, kde-format msgid "Move Up" msgstr "Nach oben" #: positionviewwidget.cpp:129 #, kde-format msgid "Move Down" msgstr "Nach unten" #: positionviewwidget.cpp:131 #, kde-format msgid "Lock Item" msgstr "Posten sperren" #: positionviewwidget.cpp:133 #, kde-format msgid "Unlock Item" msgstr "Posten entsperren" #: positionviewwidget.cpp:135 #, kde-format msgid "Delete Item" msgstr "Posten löschen" #: positionviewwidget.cpp:226 #, kde-format msgid "All items" msgstr "Alle Posten" #: positionviewwidget.cpp:236 #, kde-format msgid "%1-tagged items" msgstr "Mit „%1“ markierte Posten" #: positionviewwidget.cpp:268 #, kde-format msgid "Tag: %1" msgstr "Markierung: %1" #: positionviewwidget.cpp:270 #, kde-format msgid "Tags:
      " msgstr "Markierungen:
        " #: positionviewwidget.cpp:281 #, kde-format msgid "No tags assigned yet." msgstr "Es sind noch keine Stichwörter zugewiesen." #: positionviewwidget.cpp:410 #, kde-format msgid "Active" msgstr "Aktiv" #: positionviewwidget.cpp:412 #, kde-format msgid "New" msgstr "Neu" #: positionviewwidget.cpp:414 #, kde-format msgid "Deleted" msgstr "Gelöscht" #: positionviewwidget.cpp:416 #, kde-format msgid "Locked" msgstr "Gesperrt" #: positionviewwidget.cpp:613 #, kde-format msgid "" "This item is either completely optional or its amount varies depending on " "the needs.

        Use the item toolbox to change the item type." msgstr "" "Dieser Posten ist entweder vollständig optional oder sein Betrag variiert " "abhängig von den Erfordernissen.

        Verwenden Sie die Posten-" "Werkzeuge, um die Art des Postens zu ändern." #: positionviewwidget.cpp:619 #, kde-format msgid "" "This is an alternative item.

        Use the position toolbox to change " "the item type." msgstr "" "Dies ist ein Alternativposten.

        Verwenden Sie die Posten-Werkzeuge, " "um die Art des Postens zu ändern." #: positionviewwidget.cpp:691 #, kde-format msgid "Demand" msgstr "Bedarf" #: prefsdialog.cpp:64 #, kde-format msgid "Configure Kraft" msgstr "Kraft einrichten" #: prefsdialog.cpp:98 #, kde-format msgid "Document Defaults" msgstr "Dokumentenstandards" #: prefsdialog.cpp:99 #, kde-format msgid "Taxes" msgstr "Steuersätze" #: prefsdialog.cpp:100 #, kde-format msgid "Document Types" msgstr "Dokumentenart" #: prefsdialog.cpp:102 #, kde-format msgid "Wages" msgstr "Löhne" #: prefsdialog.cpp:104 #, kde-format msgid "Units" msgstr "Maßeinheiten" #: prefsdialog.cpp:105 #, kde-format msgid "Own Identity" msgstr "Eigene Identität" #: prefsdialog.cpp:152 #, kde-format msgid "Tax rates beginning at date:" msgstr "Steuersätze nach Datum:" #: prefsdialog.cpp:160 prefsunits.cpp:53 prefswages.cpp:51 #, kde-format msgid "ID" msgstr "ID" #: prefsdialog.cpp:161 #, kde-format msgid "Full Tax [%]" msgstr "Allgemeiner Steuersatz" #: prefsdialog.cpp:162 #, kde-format msgid "Reduced Tax [%]" msgstr "Reduzierter Steuersatz" #: prefsdialog.cpp:163 #, kde-format msgid "Start Date" msgstr "Anfangsdatum:" #: prefsdialog.cpp:182 prefsunits.cpp:80 prefswages.cpp:90 rc.cpp:323 #, kde-format msgid "Add" msgstr "Hinzufügen" #: prefsdialog.cpp:186 prefsunits.cpp:89 prefswages.cpp:99 rc.cpp:335 #, kde-format msgid "Remove" msgstr "Entfernen" #: prefsdialog.cpp:203 #, kde-format msgid "" "Select the identity of the sending entity of documents. That's your " "companies address." msgstr "" "Wählen Sie die Identität für den Versand von Dokumenten. Das ist Ihre " "Firmenadresse." #: prefsdialog.cpp:219 #, kde-format msgid "Select Identity…" msgstr "Identität auswählen…" #: prefsdialog.cpp:225 #, kde-format msgid "From Address Book" msgstr "aus dem Adressbuch" #: prefsdialog.cpp:230 setupassistant.cpp:342 #, kde-format msgid "Manual Entry" msgstr "Manueller Eintrag" #: prefsdialog.cpp:242 #, kde-format msgid "Manual Address" msgstr "Manuelle Adresse" #: prefsdialog.cpp:245 #, kde-format msgid "Bank Account Information" msgstr "Bankverbindung" #: prefsdialog.cpp:309 #, kde-format msgid "&Default document type on creation:" msgstr "&Standard-Dokumenttyp bei Erstellung:" #: prefsdialog.cpp:314 #, kde-format msgid "New documents default to the selected type." msgstr "Neue Dokumente sind standardmäßig von diesem Typ." #: prefsdialog.cpp:323 #, kde-format msgid "Default &Tax for Documents:" msgstr "Standardmäßiger &Steuersatz:" #: prefsdialog.cpp:328 #, kde-format msgid "The default tax setting for all documents." msgstr "" "Die standardmäßigen Einstellungen des Steuersatzes für alle Dokumente." #: prefsdialog.cpp:340 #, kde-format msgid "Document Date Format:" msgstr "Datumsformat im Dokument:" #: prefsdialog.cpp:346 #, kde-format msgid "The default date format for documents." msgstr "Das voreingestellte Datumsformat für Dokumente." #: prefsdialog.cpp:348 #, kde-format msgid "ISO-Format: %1" msgstr "ISO-Format: %1" #: prefsdialog.cpp:350 #, kde-format msgid "Short-Date: %1" msgstr "Datum in Kurzform: %1" #: prefsdialog.cpp:352 #, kde-format msgid "Long-Date: %1" msgstr "Datum in Langform: %1" #: prefsdialog.cpp:354 #, kde-format msgid "RFC 2822-Format: %1" msgstr "RFC 2822-Format: %1" #: prefsdialog.cpp:356 #, kde-format msgid "\"German Format\": %1" msgstr "\"Deutsches Format\": %1" #: prefsdialog.cpp:357 #, kde-format msgid "Custom Setting in Settingsfile" msgstr "Benutzerdefiniert aus dem Settingsfile" #: prefsdialog.cpp:366 #, kde-format msgid "Prefix text for Demand items:" msgstr "Vorangestellter Text für Bedarfspositionen:" #: prefsdialog.cpp:371 #, kde-format msgid "This text is automatically prepended to new 'on demand' items." msgstr "Dieser Text wird automatisch neuen Bedarfspositionen vorangestellt." #: prefsdialog.cpp:375 #, kde-format msgid "Prefix text for Alternative items:" msgstr "Vorangestellter Text für Alternativpositionen:" #: prefsdialog.cpp:380 #, kde-format msgid "This text is automatically prepended to new 'alternative' items." msgstr "" "Dieser Text wird automatisch neuen Alternativpositionen vorangestellt." #: prefsdialog.cpp:391 #, kde-format msgid "XRechnung template file:" msgstr "XRechnung Template Datei:" #: prefsdialog.cpp:397 rc.cpp:308 #, kde-format msgid "Select…" msgstr "auswählen…" #: prefsdialog.cpp:405 #, kde-format msgid "Select template file for XRechnung" msgstr "Template Datei für XRechnung auswählen" #: prefsdialog.cpp:410 #, kde-format msgid "XRechnung Templates (*.xrtmpl)" msgstr "XRechnung Templates (*.xrtmpl)" #: prefsdialog.cpp:450 #, kde-format msgid "" "The old default doc type for new documents was just deleted.Please check the" " setting in the Document Defaults in the Kraft preferences Dialog." msgstr "" "Der alte Standard-Dokumenttyp für neue Dokumente wurde gelöscht. Bitte " "überprüfen Sie die Einstellung der Dokumentenstandards im Dialog " "Einstellungen von Kraft." #: prefsdialog.cpp:453 #, kde-format msgid "Document Default Change" msgstr "Änderung des Standard-Dokumenttyps" #: prefsdialog.cpp:701 #, kde-format msgid "The identity cannot be found." msgstr "Die Identität ist in keinem Adressbuch enthalten." #: prefsdialog.cpp:703 #, kde-format msgid "" "

        Kraft Addressbook Integration down.

        The address book backend" " is not up and running.

        Please check your addressbook integration " "setup.

        " msgstr "" "

        Die Kraft Adressbuch-Integration funktioniert nicht

        Das " "Adressbuch-Backend läuft nicht.

        Bitte Adressbuch-Setup überprüfen

        " #: prefsdialog.cpp:709 #, kde-format msgid "The identity is not listed in an address book." msgstr "Die Identität ist in keinem Adressbuch enthalten." #: prefsdialog.cpp:711 #, kde-format msgid "" "

        Kraft does not know your identity.

        Please pick one from the " "address books by clicking on the Button below.

        Not having an identity " "selected can make your documents look incomplete.

        " msgstr "" "

        Ihre Identität ist nicht eingestellt.

        Bitte wählen Sie eine " "Identität aus dem Adressbuch, indem Sie auf den Knopf unten " "klicken..

        Haben Sie keine Identität ausgewählt, dann werden Ihre " "Dokumente unvollständig aussehen.

        " #: prefsdialog.cpp:728 #, kde-format msgid "Your identity can be found in the address books." msgstr "Ihre Identität wurde in den Adressbüchern gefunden." #: prefsdialog.cpp:739 #, kde-format msgid "Work Phone" msgstr "Telefon (Arbeit)" #: prefsdialog.cpp:740 #, kde-format msgid "Fax" msgstr "Fax" #: prefsdialog.cpp:741 #, kde-format msgid "Cell Phone" msgstr "Mobiltelefon" #: prefsunits.cpp:54 #, kde-format msgid "Short" msgstr "Kurz" #: prefsunits.cpp:55 #, kde-format msgid "Long" msgstr "Lang" #: prefsunits.cpp:56 #, kde-format msgid "Short plural" msgstr "Mehrzahl kurz" #: prefsunits.cpp:57 #, kde-format msgid "Long plural" msgstr "Mehrzahl lang" #: prefsunits.cpp:58 #, kde-format msgid "ECE20" msgstr "ECE20" #: prefsunits.cpp:84 prefswages.cpp:94 rc.cpp:329 #, kde-format msgid "Edit" msgstr "Bearbeiten" #: prefsunits.cpp:148 #, kde-format msgid "Edit a unit" msgstr "Eine Maßeinheit bearbeiten" #: prefsunits.cpp:192 #, kde-format msgid "

        Edit unit

        " msgstr "

        Maßeinheit bearbeiten

        " #: prefswages.cpp:52 #, kde-format msgid "Code" msgstr "Code" #: prefswages.cpp:53 templkataloglistview.cpp:46 rc.cpp:126 #, kde-format msgid "Price" msgstr "Preis" #: prefswages.cpp:54 #, kde-format msgid "Sortkey" msgstr "Sortierschlüssel" #: prefswages.cpp:80 #, kde-format msgid "Up" msgstr "Nach oben" #: prefswages.cpp:85 #, kde-format msgid "Down" msgstr "Nach unten" #: prefswages.cpp:201 #, kde-format msgid "Edit a wage group" msgstr "Lohngruppe bearbeiten" #: prefswages.cpp:241 #, kde-format msgid "

        Edit wage group

        " msgstr "

        Lohngruppe bearbeiten

        " #: reportgenerator.cpp:113 #, kde-format msgid "The document generation process is still running." msgstr "Die Dokument-Generierung läuft noch." #: reportgenerator.cpp:168 #, kde-format msgid "The temporary file %1 is not accessible." msgstr "Die temporäre Datei %1 ist nicht erreichbar." #: reportgenerator.cpp:193 #, kde-format msgid "The template conversion failed." msgstr "Vorlagenkonvertierung ist fehlgeschlagen." #: reportgenerator.cpp:201 #, kde-format msgid "Saving to temporary file failed." msgstr "Speichern in eine temporäre Datei ist fehlgeschlagen." #: reportgenerator.cpp:332 #, kde-format msgid "No converter error." msgstr "Kein Konverter gefunden." #: reportgenerator.cpp:335 #, kde-format msgid "The ReportLab based converter script cannot be executed." msgstr "Das Reportlab-Script kann nicht ausgeführt werden." #: reportgenerator.cpp:338 #, kde-format msgid "An unknown error happened." msgstr "Ein unerwarteter Fehler ist aufgetreten." #: reportgenerator.cpp:341 #, kde-format msgid "The ReportLab python module is not installed." msgstr "Das Reportlab Python-Modul ist nicht installiert." #: reportgenerator.cpp:344 #, kde-format msgid "The PyPDF2 python module is not installed." msgstr "Das PyPDF2 Python Modul ist nicht installiert." #: reportgenerator.cpp:347 #, kde-format msgid "The source file cannot be read." msgstr "Die Quelldatei kann nicht gelesen werden." #: reportgenerator.cpp:350 #, kde-format msgid "The target cannot be opened to write." msgstr "Das Ziel kann nicht zum Schreiben geöffnet werden." #: reportgenerator.cpp:353 #, kde-format msgid "The target file does not exist." msgstr "Die Zieldatei existiert nicht." #: reportgenerator.cpp:356 #, kde-format msgid "The WeasyPrint tool is not installed." msgstr "Das Tool Weasyprint ist nicht installiert." #: reportgenerator.cpp:359 #, kde-format msgid "The PDF merger utility failed." msgstr "Das Programm zum Verbinden von PDFs ist fehlgeschlagen." #: reportgenerator.cpp:378 #, kde-format msgid "There is not template defined for %1." msgstr "Für %1 ist keine Vorlage angegeben." #: reportgenerator.cpp:379 #, kde-format msgid "Make sure to define a template file in the settings dialog." msgstr "" "Überprüfen Sie, ob eine Vorlagendatei in den Einstellungen gesetzt ist." #: reportgenerator.cpp:384 #, kde-format msgid "The template file %1 for document type %2 is not a file." msgstr "Die Vorlagendatei %1 für Dokumenttyp %2 is keine Datei." #: reportgenerator.cpp:385 #, kde-format msgid "Make sure to pick a readable template file in the settings dialog" msgstr "Stellen Sie sicher, dass die konfigurierte Vorlagendatei lesbar ist. " #: reportgenerator.cpp:389 #, kde-format msgid "The template file %1 for document type %2 can not be read." msgstr "Die Vorlage %1 für Dokument Typ %2 kann nicht gelesen werden." #: reportgenerator.cpp:390 #, kde-format msgid "Make sure the template file has proper file permissions." msgstr "Stellen Sie sicher, dass die Vorlagendatei passende Dateirechte hat." #: setupassistant.cpp:36 #, kde-format msgid "Welcome to the Kraft Setup Assistant" msgstr "Willkommen beim Einrichtungsassistenten von Kraft" #: setupassistant.cpp:55 #, kde-format msgid "Select the Database Backend" msgstr "Bitte wählen Sie das Datenbank-Modul" #: setupassistant.cpp:92 #, kde-format msgid "Sqlite File Name" msgstr "Dateiname der Sqlite-Datenbank" #: setupassistant.cpp:146 #, kde-format msgid "MySql Detail Information" msgstr "MySQL Datenbank-Informationen" #: setupassistant.cpp:188 #, kde-format msgid "Create Database" msgstr "Datenbank neu erzeugen" #: setupassistant.cpp:210 setupassistant.cpp:223 #, kde-format msgid "0/%1" msgstr "0 / %1" #: setupassistant.cpp:242 setupassistant.cpp:252 setupassistant.cpp:290 #, kde-format msgid "%1/%2" msgstr "%1 / %2" #: setupassistant.cpp:265 #, kde-format msgid "Upgrade the Database" msgstr "Datenbankschema aktualisieren" #: setupassistant.cpp:314 #, kde-format msgid "Your Company Address" msgstr "Adresse der Firma" #: setupassistant.cpp:319 #, kde-format msgid "" "Select your companies address either from the address book or enter it " "manually. It is set as a consigner on the documents." msgstr "" "Wählen Sie die Adresse Ihrer Firma aus dem Adressbuch oder tragen Sie sie " "manuell ein. Sie wird als Absender der Dokumente verwendet." #: setupassistant.cpp:328 #, kde-format msgid "Select from Addressbook" msgstr "Aus dem Adressbuch" #: setupassistant.cpp:418 #, kde-format msgid "Final Status" msgstr "Endergebnis" #: setupassistant.cpp:512 #, kde-format msgid "" "

        Can't connect to your database. Are you sure your credentials are correct" " and the database exists?

        " msgstr "" "

        Die Verbindung zur Datenbank kann nicht hergestellt werden. Bitte stellen" " Sie sicher, dass die Einstellungen richtig sind und die Datenbank vorhanden" " ist.

        " #: setupassistant.cpp:523 #, kde-format msgid "

        Can't open your database file, check the permissions and such." msgstr "" "

        Die Datenbank-Datei kann nicht geöffnet werden. Bitte überprüfen Sie die " "Berechtigungen.

        " #: setupassistant.cpp:532 #, kde-format msgid "" "

        The database is already existing, no action needs to be taken " "here.

        Please hit next to proceed.

        " msgstr "" "

        Die Datenbank ist bereits angelegt, sodass hier keine weiteren Aktionen " "durchzuführen sind.

        Bitte drücken Sie auf Weiter, um " "fortzufahren.

        " #: setupassistant.cpp:581 #, kde-format msgid "

        The database setup was successfully completed.

        " msgstr "

        Die Datenbankeinrichtung ist erfolgreich abgeschlossen.

        " #: setupassistant.cpp:582 #, kde-format msgid "

        You can start to work with Kraft now. Please do not forget to

        " msgstr "" "

        Sie können nun Ihre Arbeit mit Kraft beginnen. Bitte vergessen Sie " "nicht:

        " #: setupassistant.cpp:584 #, kde-format msgid "
      • adjust various settings in the Kraft Preferences dialog.
      • " msgstr "" "
      • Verschiedene Einstellungen im Einstellungen-Fenster von Kraft " "anzupassen.
      • " #: setupassistant.cpp:585 #, kde-format msgid "
      • Check the Catalog chapter list.
      • " msgstr "
      • Überprüfen Sie die Kapitelliste des Katalogs.
      • " #: setupassistant.cpp:586 #, kde-format msgid "
      • Make your business and have fun.
      • " msgstr "
      • Führen Sie Ihre Geschäfte und haben Sie Spaß.
      • " #: setupassistant.cpp:588 #, kde-format msgid "" "

        If you press Finish now, the new database configuration is stored " "in Krafts configuration.

        " msgstr "" "

        Falls Sie nun auf Fertigstellen klicken, wird die neue Datenbank-" "Einrichtung in der Kraft-Konfiguration gespeichert.

        " #: setupassistant.cpp:604 #, kde-format msgid "Database cannot be connected. Please check the database credentials." msgstr "" "Die Verbindung zur Datenbank kann nicht hergestellt werden. Bitte stellen " "Sie sicher, dass die Einstellungen richtig sind." #: setupassistant.cpp:610 #, kde-format msgid "Database core tables do not exist. Please check the initial setup." msgstr "" "Die grundlegenden Tabellen der Datenbank sind nicht vorhanden. Bitte " "überprüfen Sie die einleitende Einrichtung." #: setupassistant.cpp:617 #, kde-format msgid "Database is up-to-date. No upgrade is required." msgstr "" "Die Datenbank ist auf dem aktuellen Stand, so dass keine Aktualisierung " "notwendig ist." #: setupassistant.cpp:622 #, kde-format msgid "Parsing update commands…" msgstr "Update-Anweisungen einlesen…" #: setupassistant.cpp:665 #, kde-format msgid "Upgrade failed!" msgstr "Die Aktualisierung ist fehlgeschlagen!" #: setupassistant.cpp:667 #, kde-format msgid "Upgrade succeeded, the current schema version is %1!" msgstr "" "Die Aktualisierung war erfolgreich. Die aktuelle Version des Schemas ist %1." #: setupassistant.cpp:680 #, kde-format msgid "Cannot connect to the database. Please check the database credentials!" msgstr "" "Die Verbindung zur Datenbank kann nicht hergestellt werden. Bitte stellen " "Sie sicher, dass die Einstellungen richtig sind." #: setupassistant.cpp:686 #, kde-format msgid "Parsing creation commands…" msgstr "Erstell-Anweisungen einlesen…" #: setupassistant.cpp:694 #, kde-format msgid "Parsing database fill-up commands…" msgstr "Datenbank-Füllbefehle analysieren…" #: setupassistant.cpp:707 #, kde-format msgid "Processing database creation commands…" msgstr "Datenbank-Erzeugungsbefehle ausführen…" #: setupassistant.cpp:724 #, kde-format msgid "Process database fill-up commands…" msgstr "Datenbank-Füllbefehle ausführen..." #: setupassistant.cpp:734 #, kde-format msgid "Commands finished successfully." msgstr "Anweisungen erfolgreich ausgeführt." #: setupassistant.cpp:736 #, kde-format msgid "Failed to perform all commands." msgstr "Es kann kein Befehl erfolgreich ausgeführt werden." #: setupassistant.cpp:780 #, kde-format msgid "" "This assistant guides you through the basic settings of your Kraft " "installation." msgstr "" "Dieser Assistent führt Sie durch die Grundeinstellungen Ihrer Kraft-" "Installation" #: setupassistant.cpp:790 #, kde-format msgid "No database configuration found." msgstr "Es kann keine Datenbank-Einrichtung gefunden werden." #: setupassistant.cpp:792 #, kde-format msgid "A valid current database configuration file was found." msgstr "Eine gültige aktuelle Datenbank-Einrichtung ist gefunden worden." #: setupassistant.cpp:814 #, kde-format msgid "The database schema version is too old. It will be updated." msgstr "" "Die Version des Datenbank-Schemas ist zu niedrig. Es wird aktualisiert." #: setupassistant.cpp:817 #, kde-format msgid "The current database schema version is too new. Leaving untouched! " msgstr "Die Version des Datenbankschema ist zu neu. Es wird nichts verändert." #: setupassistant.cpp:824 #, kde-format msgid "" "

        The database can be opened, but does not contain valid content.

        A " "new database can be created automatically from scratch.

        " msgstr "" "

        Die Datenbank kann geöffnet werden, enthält aber keine gültigen " "Inhalte.

        Eine neue Datenbank kann automatisch von Grund auf erzeugt " "werden.

        " #: setupassistant.cpp:831 #, kde-format msgid "

        Kraft failed to connect to the configured database.

        " msgstr "

        Kraft konnte nicht mit der konfigurierten Datenbank verbinden

        " #: setupassistant.cpp:833 #, kde-format msgid "" "

        Please check the database server setup and restart Kraft to connect." msgstr "" "

        Bitte überprüfen Sie die Einstellungen des Datenbank-Servers und starten " "Sie Kraft neu, um eine Verbindung herzustellen." #: setupassistant.cpp:835 #, kde-format msgid "

        Please check the database file." msgstr "

        Bitte überprüfen Sie die Datenbank-Datei." #: setupassistant.cpp:837 #, kde-format msgid "Or create a new database by pressing Next.

        " msgstr "" "Oder erstellen Sie eine neue Datenbank, indem Sie Weiter drücken.

        " #: setupassistant.cpp:845 #, kde-format msgid "

        Please hit Next, and follow the instructions.

        " msgstr "

        Drücken Sie Weiter und folgen Sie den Angaben.

        " #: tagtemplatesdialog.cpp:47 #, kde-format msgid "Edit Tag Template" msgstr "Stichwort-Vorlage bearbeiten" #: tagtemplatesdialog.cpp:54 #, kde-format msgid "Edit a Tag Template" msgstr "Marker-Vorlage bearbeiten" #: tagtemplatesdialog.cpp:55 #, kde-format msgid "Adjust settings for name, color and description." msgstr "Legen Sie einen Namen, eine Farbe und eine Beschreibung fest." #: tagtemplatesdialog.cpp:58 rc.cpp:446 #, kde-format msgid "Name:" msgstr "Name:" #: tagtemplatesdialog.cpp:63 #, kde-format msgid "Description:" msgstr "Beschreibung:" #: tagtemplatesdialog.cpp:69 #, kde-format msgid "Associated color:" msgstr "Zugehörige Farbe:" #: tagtemplatesdialog.cpp:141 #, kde-format msgid "Add, edit and remove tag templates for use in the documents." msgstr "" "Stichwort-Vorlagen hinzufügen, ändern oder entfernen, die in diesen " "Dokumenten verwendet werden." #: tagtemplatesdialog.cpp:165 #, kde-format msgid "Add…" msgstr "Hinzufügen…" #: tagtemplatesdialog.cpp:167 rc.cpp:60 rc.cpp:99 rc.cpp:138 #, kde-format msgid "Edit…" msgstr "Bearbeiten…" #: tagtemplatesdialog.cpp:170 #, kde-format msgid "Delete…" msgstr "Entfernen…" #: tagtemplatesdialog.cpp:223 #, kde-format msgid "Do you really want to delete the template?" msgstr "Möchten Sie die ausgewählte Vorlage wirklich löschen?" #: taxeditdialog.cpp:36 #, kde-format msgid "Edit Tax Rates" msgstr "Steuersätze bearbeiten" #: templkataloglistview.cpp:45 texteditdialog.cpp:76 rc.cpp:6 #, kde-format msgid "Template" msgstr "Vorlage" #: templkataloglistview.cpp:47 #, kde-format msgid "Calc. Type" msgstr "Kalkulationsart" #: templkataloglistview.cpp:54 #, kde-format msgid "Template Catalog" msgstr "Vorlagenkatalog" #: templkatalogview.cpp:101 #, kde-format msgid "" msgstr "" #: templtopositiondialogbase.cpp:35 rc.cpp:500 #, kde-format msgid "Create Item from Template" msgstr "Posten aus Vorlage erstellen" #: templtopositiondialogbase.cpp:51 #, kde-format msgid "the Header of the Document as first item" msgstr "als ersten Posten" #: texteditdialog.cpp:42 #, kde-format msgid "Edit Text Templates" msgstr "Textvorlagen bearbeiten" #: texteditdialog.cpp:62 #, kde-format msgid "Edit %1 Template" msgstr "Vorlage „%1“ bearbeiten" #: textselection.cpp:42 #, kde-format msgid "Template Collection" msgstr "Vorlagensammlung" #: textselection.cpp:100 #, kde-format msgid "Template Actions" msgstr "Vorlagenaktionen" #: textselection.cpp:129 #, kde-format msgid "This is the standard text used in new documents." msgstr "Dies ist der Standardtext, der in neuen Dokumenten verwendet wird." #: textselection.cpp:138 #, kde-format msgid "%1 Templates for %2" msgstr "%1 Vorlagen für %2" #: textselection.cpp:146 #, kde-format msgid "" "There is no %1 template text available for document type %2.
        Click the " "add-button below to create one." msgstr "" "Es ist kein Vorlagentext %1 für den Dokumenttyp %2 vorhanden.
        Klicken " "Sie auf den Knopf „Hinzufügen“ um einen Vorlagentext zu erstellen." #: textselection.cpp:201 #, kde-format msgid "&Use in Document" msgstr "Im Dokument &verwenden" #: texttemplate.cpp:103 #, kde-format msgid "Failed to open template source" msgstr "Die Vorlagendatei kann nicht geöffnet werden." #: texttemplateinterface.cpp:53 #, kde-format msgid "No file name given for template" msgstr "Für die Vorlage ist kein Name angegeben worden." #: texttemplateinterface.cpp:61 #, kde-format msgid "Could not find template file %1" msgstr "Die Vorlagendatei „%1“ kann nicht gefunden werden." #: timecalcpart.cpp:82 #, kde-format msgid "Minutes" msgstr "Minuten" #: timecalcpart.cpp:84 #, kde-format msgid "Hours" msgstr "Stunden" #: timecalcpart.cpp:86 #, kde-format msgid "Seconds" msgstr "Sekunden" #: rc.cpp:9 #, kde-format msgid "Text:" msgstr "Text:" #: rc.cpp:12 #, kde-format msgid "&Store in Chapter" msgstr "In Kategorie s&peichern" #: rc.cpp:15 #, kde-format msgid "&Unit" msgstr "&Einheit" #: rc.cpp:18 #, kde-format msgid "&Count Time for Overalltime" msgstr "Zeiten für &Gesamtzeit zusammenzählen" #: rc.cpp:24 #, kde-format msgid "full" msgstr "Allgemein" #: rc.cpp:27 #, kde-format msgid "half" msgstr "Reduziert" #: rc.cpp:30 #, kde-format msgid "Time Calculation" msgstr "Arbeitszeit" #: rc.cpp:33 rc.cpp:72 rc.cpp:111 #, kde-format msgid "text" msgstr "text" #: rc.cpp:36 #, kde-format msgid "Time measureable effort for this template:" msgstr "In Geldeinheiten umgerechneter Zeitaufwand für diese Vorlage:" #: rc.cpp:39 rc.cpp:81 rc.cpp:117 #, kde-format msgid "Label" msgstr "Bezeichnung" #: rc.cpp:42 #, kde-format msgid "Duration" msgstr "Dauer" #: rc.cpp:45 #, kde-format msgid "Hourly Rate" msgstr "Stundensatz" #: rc.cpp:48 #, kde-format msgid "Glob. Rate" msgstr "Glob. Tarif" #: rc.cpp:51 #, kde-format msgid "Adds a new time calculation part to the template" msgstr "Fügt eine neue Komponente zur Zeitberechnung zur Vorlage hinzu" #: rc.cpp:54 rc.cpp:93 rc.cpp:132 #, kde-format msgid "New…" msgstr "Neu…" #: rc.cpp:57 #, kde-format msgid "Edits the current time calculation part" msgstr "Ändert die aktuelle Komponente zur Zeitberechnung" #: rc.cpp:63 #, kde-format msgid "Deletes the current time calculation part" msgstr "Löscht die aktuelle Komponente zur Zeitberechnung" #: rc.cpp:66 rc.cpp:105 rc.cpp:144 #, kde-format msgid "delete" msgstr "Entfernen" #: rc.cpp:69 #, kde-format msgid "Fix Costs" msgstr "Fixkosten" #: rc.cpp:75 #, kde-format msgid "Fix costs for this template per one unit:" msgstr "Fixkosten für diese Vorlage für eine Einheit:" #: rc.cpp:84 #, kde-format msgid "Single Price" msgstr "Einzelpreis" #: rc.cpp:87 #, kde-format msgid "Overall Price" msgstr "Gesamtpreis" #: rc.cpp:90 #, kde-format msgid "adds a new fix calculation part" msgstr "Fügt eine neue Festpreis-Kalkulationskomponente hinzu" #: rc.cpp:96 #, kde-format msgid "edits the current fix calculation part" msgstr "Festpreis-Kalkulationskomponente bearbeiten" #: rc.cpp:102 #, kde-format msgid "deletes the current fix calculation part" msgstr "Festpreis-Kalkulationskomponente entfernen" #: rc.cpp:114 #, kde-format msgid "Needed materials for one unit of this template:" msgstr "Benötigte Materialien für eine Einheit dieser Vorlage:" #: rc.cpp:129 #, kde-format msgid "adds a new material calculation part" msgstr "Fügt eine neue Material-Kalkulationskomponente hinzu" #: rc.cpp:135 #, kde-format msgid "edits the current material part" msgstr "Material-Kalkulationskomponente bearbeiten" #: rc.cpp:141 #, kde-format msgid "deletes the current material calculation part" msgstr "Material-Kalkulationskomponente entfernen" #: rc.cpp:147 #, kde-format msgid "Overall Price per Unit" msgstr "Gesamtpreis pro Einheit" #: rc.cpp:150 #, kde-format msgid "&Manual Price" msgstr "&Manueller Preis" #: rc.cpp:153 #, kde-format msgid "Calculated Price" msgstr "Kalkulierter Preis" #: rc.cpp:156 #, kde-format msgid "Fixed costs part:" msgstr "Fixkostenanteil:" #: rc.cpp:159 #, kde-format msgid "Material part:" msgstr "Material-Anteil:" #: rc.cpp:162 #, kde-format msgid "Profit:" msgstr "Gewinn:" #: rc.cpp:166 #, no-c-format, kde-format msgid " %" msgstr " %" #: rc.cpp:169 #, kde-format msgid "Time calculation part:" msgstr "Arbeitszeit:" #: rc.cpp:172 #, kde-format msgid "Calculated price:" msgstr "Kalkulierter Preis:" #: rc.cpp:175 #, kde-format msgid "88.888,88 €" msgstr "88.888,88 €" #: rc.cpp:178 #, kde-format msgid "Database creation and initial schema setup:" msgstr "Einrichtung der Datenbank und Setup des Anfangsschemas:" #: rc.cpp:185 rc.cpp:198 rc.cpp:903 #, kde-format msgid "0 / 129" msgstr "0 / 129" #: rc.cpp:188 rc.cpp:201 rc.cpp:906 #, kde-format msgid "X" msgstr "X" #: rc.cpp:191 #, kde-format msgid "Filling the database with initial values:" msgstr "Füllen der Datenbank mit Anfangswerten:" #: rc.cpp:204 rc.cpp:909 #, kde-format msgid "Status: " msgstr "Status: " #: rc.cpp:207 #, kde-format msgid "Database setup status…" msgstr "Status der Datenbank-Einrichtung…" #: rc.cpp:210 #, kde-format msgid "Bruns data file:" msgstr "Bruns-Daten-Datei:" #: rc.cpp:213 #, kde-format msgid "Bruns key file:" msgstr "Bruns-Schlüsseldatei:" #: rc.cpp:216 #, kde-format msgid "Qt database driver:" msgstr "Qt-Datenbank-Treiber:" #: rc.cpp:219 #, kde-format msgid "Database server:" msgstr "Datenbank-Server:" #: rc.cpp:222 #, kde-format msgid "Server port:" msgstr "Server Port:" #: rc.cpp:225 #, kde-format msgid "Database Name" msgstr "Datenbankname" #: rc.cpp:228 rc.cpp:752 #, kde-format msgid "Database user:" msgstr "Datenbank-Benutzer:" #: rc.cpp:231 #, kde-format msgid "Database password:" msgstr "Datenbank-Passwort:" #: rc.cpp:234 #, kde-format msgid "The default database name when creating new databases" msgstr "Standard-Datenbankname bei neu erstellter Datenbank" #: rc.cpp:237 #, kde-format msgid "File Name" msgstr "Dateiname" #: rc.cpp:240 #, kde-format msgid "The path where database file are stored. Leave empty!" msgstr "Pfad zu den Datenbankdateien. Leer lassen!" #: rc.cpp:243 #, kde-format msgid "Database update:" msgstr "Datenbank-Aktualisierung:" #: rc.cpp:246 #, kde-format msgid "Overall progress:" msgstr "Gesamtfortschritt:" #: rc.cpp:253 #, kde-format msgid "Detailed progress:" msgstr "Fortschrittsanzeige:" #: rc.cpp:260 #, kde-format msgid "Status:" msgstr "Status:" #: rc.cpp:263 #, kde-format msgid "" "

        Kraft uses a database backend to store values. By " "default it uses a file based database with easy setup targeted to single " "user mode.


        " msgstr "" "

        Kraft nutzt ein Datenbank-Backend, um Werte zu " "speichern. Standardmäßig wird eine dateibasierte Datenbank mit einfacher " "Einrichtung verwendet, die auf Einbenutzerbetrieb ausgelegt ist. " "


        Bitte wählen Sie das Datenbank-Backend, das " "Sie verwenden möchten:" #: rc.cpp:266 #, kde-format msgid "SQLite 3 - file based database (default)" msgstr "SQLite 3 – Datei-basierte Datenbank (Voreinstellung)" #: rc.cpp:269 #, kde-format msgid "MySQL Serverbased Database for advanced Setups" msgstr "MySQL – Server-basierte Datenbank für fortgeschrittene Einrichtungen" #: rc.cpp:272 #, kde-format msgid "Footer Texts" msgstr "Fußzeilentexte" #: rc.cpp:275 #, kde-format msgid "&Summary text on last page:" msgstr "&Abschlußtext auf letzter Seite:" #: rc.cpp:278 #, kde-format msgid "&Greeting:" msgstr "&Anrede:" #: rc.cpp:284 #, kde-format msgid "Document &tax:" msgstr "&Steuersatz:" #: rc.cpp:287 #, kde-format msgid "TextLabel" msgstr "Textlabel" #: rc.cpp:290 #, kde-format msgid "&Project:" msgstr "&Projekt:" #: rc.cpp:293 #, kde-format msgid "&Whiteboard:" msgstr "&Notizen:" #: rc.cpp:296 #, kde-format msgid "" "Enter a label that describes the project. This may appear on the customer " "document." msgstr "" "Geben Sie eine Beschriftung an, die das Projekt beschreibt. Diese kann auf " "dem Kundendokument erscheinen." #: rc.cpp:299 #, kde-format msgid "Postal &address:" msgstr "&Anschrift:" #: rc.cpp:302 #, kde-format msgid "not selected" msgstr "nicht ausgewählt" #: rc.cpp:305 #, kde-format msgid "Select an addressee from the address books." msgstr "Wählt eine Adresse aus den Adressbüchern." #: rc.cpp:311 #, kde-format msgid "&Salutatory address:" msgstr "&Grußformel:" #: rc.cpp:314 #, kde-format msgid "Customer:" msgstr "Kunde:" #: rc.cpp:317 #, kde-format msgid "&Entry text on first page:" msgstr "&Einleitender Text auf der ersten Seite:" #: rc.cpp:320 rc.cpp:785 #, kde-format msgid "Click to add a new document type to the list." msgstr "Klicken Sie, um der Liste einen neuen Dokumenttyp hinzuzufügen." #: rc.cpp:326 #, kde-format msgid "click to edit the selected document type name" msgstr "" "Klicken Sie hier, um den Namen des ausgewählten Dokumenttyps zu bearbeiten." #: rc.cpp:332 rc.cpp:791 #, kde-format msgid "click to remove the current document type" msgstr "Klicken Sie hier, um den aktuellen Dokumenttyp zu entfernen." #: rc.cpp:338 #, kde-format msgid "Unique Document Number" msgstr "Eindeutige Dokumentennummer" #: rc.cpp:341 #, kde-format msgid "Number &cycle:" msgstr "Nummern&kreis:" #: rc.cpp:344 rc.cpp:353 rc.cpp:356 rc.cpp:776 #, kde-format msgid "example" msgstr "Beispiel" #: rc.cpp:347 #, kde-format msgid "Ident template:" msgstr "Nummern-Vorlage:" #: rc.cpp:350 #, kde-format msgid "Example ID:" msgstr "Beispielnummer:" #: rc.cpp:359 #, kde-format msgid "Counter:" msgstr "Anfangswert:" #: rc.cpp:362 #, kde-format msgid "&Edit Number Cycles…" msgstr "Nummernkreise bearbeiten…" #: rc.cpp:365 #, kde-format msgid "Document Type Options" msgstr "Dokumenttyp Einstellungen" #: rc.cpp:368 #, kde-format msgid "Enable XRechung Support " msgstr "XRechnung Unterstützung" #: rc.cpp:371 #, kde-format msgid "PDF Creation and Postprocessing" msgstr "PDF Generieren und Nachbearbeiten" #: rc.cpp:374 #, kde-format msgid "&Template file:" msgstr "Vorlagen Da&tei:" #: rc.cpp:377 rc.cpp:401 rc.cpp:407 #, kde-format msgid "select" msgstr "auswählen" #: rc.cpp:380 #, kde-format msgid "W&atermark:" msgstr "W&asserzeichen:" #: rc.cpp:383 #, kde-format msgid "no watermark" msgstr "Kein Wasserzeichen" #: rc.cpp:386 #, kde-format msgid "on first page" msgstr "Auf erster Seite" #: rc.cpp:389 #, kde-format msgid "on all pages" msgstr "Auf allen Seiten" #: rc.cpp:392 #, kde-format msgid "alternating (3 pages)" msgstr "abwechselnd (3 Seiten)" #: rc.cpp:395 #, kde-format msgid "different first and last page (3 pages)" msgstr "unterschiedliche erste und letzte Seite (3 Seiten)" #: rc.cpp:398 #, kde-format msgid "Watermark fi&le:" msgstr "Wasserzeichen Datei:" #: rc.cpp:404 #, kde-format msgid "Append &PDF:" msgstr "&PDF anhängen:" #: rc.cpp:410 #, kde-format msgid "Calculation Parts Fix" msgstr "Fixkostenanteil der Kalkulation" #: rc.cpp:413 #, kde-format msgid "

        Fix Cost Parts

        " msgstr "

        Fixkostenanteil

        " #: rc.cpp:416 #, kde-format msgid "Add a fix cost for one unit of the template:" msgstr "Fixkosten für eine Einheit der Vorlage hinzufügen" #: rc.cpp:419 rc.cpp:860 #, kde-format msgid "&Label:" msgstr "&Bezeichnung" #: rc.cpp:422 #, kde-format msgid "describing text" msgstr "Beschreibungstext" #: rc.cpp:425 #, kde-format msgid "amortisation" msgstr "Amortisation" #: rc.cpp:428 rc.cpp:732 #, kde-format msgid "&Amount:" msgstr "&Menge:" #: rc.cpp:431 #, kde-format msgid "amount multiplier" msgstr "Betrags-Multiplikator" #: rc.cpp:434 #, kde-format msgid "at &Price:" msgstr "zum &Preis von:" #: rc.cpp:437 rc.cpp:735 #, kde-format msgid "Price for one piece" msgstr "Stückpreis" #: rc.cpp:440 #, kde-format msgid "€" msgstr "€" #: rc.cpp:443 #, kde-format msgid "Form" msgstr "Formular" #: rc.cpp:449 #, kde-format msgid "Organization:" msgstr "Organisation:" #: rc.cpp:452 #, kde-format msgid "Street:" msgstr "Straße" #: rc.cpp:455 #, kde-format msgid "Post code:" msgstr "Postleitzahl:" #: rc.cpp:458 #, kde-format msgid "City:" msgstr "Ort:" #: rc.cpp:461 #, kde-format msgid "Phone:" msgstr "Telefon (Arbeit)" #: rc.cpp:464 #, kde-format msgid "Fax:" msgstr "Fax:" #: rc.cpp:467 #, kde-format msgid "Mobile phone:" msgstr "Mobil:" #: rc.cpp:470 #, kde-format msgid "Email:" msgstr "Email:" #: rc.cpp:473 #, kde-format msgid "Website:" msgstr "Webseite:" #: rc.cpp:476 #, kde-format msgid "Import Document Items" msgstr "Dokumentposten importieren" #: rc.cpp:479 #, kde-format msgid "Import information" msgstr "Informationen importieren" #: rc.cpp:482 #, kde-format msgid "Select a &File to import from:" msgstr "Bitte wählen Sie die zu importierende &Datei:" #: rc.cpp:485 #, kde-format msgid "FixMe!" msgstr "FixMe!" #: rc.cpp:488 #, kde-format msgid "Import &Schema:" msgstr "&Schema importieren:" #: rc.cpp:491 #, kde-format msgid "this is interesting information about the selected schema" msgstr "Dies sind nützliche Informationen über das ausgewählte Schema." #: rc.cpp:494 #, kde-format msgid "Insert all Items &after" msgstr "Alle Posten einfügen &nach" #: rc.cpp:497 rc.cpp:521 #, kde-format msgid "Tags" msgstr "Stichwörter" #: rc.cpp:503 #, kde-format msgid "New Item Text" msgstr "Neuer Posten" #: rc.cpp:506 #, kde-format msgid "&insert" msgstr "Einfügen" #: rc.cpp:509 #, kde-format msgid "à" msgstr "à" #: rc.cpp:512 #, kde-format msgid "&after item" msgstr "&nach" #: rc.cpp:515 #, kde-format msgid "Keep this item as template for future documents" msgstr "Diesen Posten als Vorlage für zukünftige Dokumente speichern" #: rc.cpp:518 #, kde-format msgid "save in &chapter" msgstr "in &Kapitel" #: rc.cpp:530 #, kde-format msgid "Do Database Initialisation" msgstr "Datenbank initialisieren" #: rc.cpp:533 #, kde-format msgid "Do XML archiving of documents they're printed?" msgstr "XML-Dokumente archivieren, sobald sie gedruckt sind?" #: rc.cpp:536 #, kde-format msgid "" "Where Kraft stores the XML archive documents. If empty, KDEHOME/share/apps " "is used." msgstr "" "Speicherort für die XML-Archiv-Dokumente. Falls leer, wird " "$KDEHOME/share/apps verwendet." #: rc.cpp:539 #, kde-format msgid "The local xml document storage path" msgstr "Der lokale Speicherpfad für XML-Dokumente" #: rc.cpp:542 #, kde-format msgid "Default mail user agent. Set xdg for xdg-email" msgstr "Standard Email-Versende-Tool. Setze xdg für xdg-email" #: rc.cpp:545 rc.cpp:548 #, kde-format msgid "The default geometry of the document view dialog" msgstr "Standardgröße der Dokumentansicht" #: rc.cpp:551 #, kde-format msgid "The current state of the portal" msgstr "Der momentane Status des Portals" #: rc.cpp:554 #, kde-format msgid "The current geometry of the portal" msgstr "Die aktuelle Geometry des Portals" #: rc.cpp:557 #, kde-format msgid "The current geometry of the new doc assistant" msgstr "Aktuelle Geometry des Dokument-Neu Assistenten" #: rc.cpp:560 #, kde-format msgid "The splitter position of the document view dialog" msgstr "Teilungsstelle des Dokumentansicht-Dialogs" #: rc.cpp:563 #, kde-format msgid "The default size of the material catalog view" msgstr "Standardgröße der Material-Katalogs-Ansicht" #: rc.cpp:566 #, kde-format msgid "The splitter setting for the doc assistant" msgstr "Splitter-Einstellung für den Dokument-Assistenten" #: rc.cpp:569 #, kde-format msgid "The window size of the template to document dialog for plants" msgstr "Die Fenstergröße des Dialogs „Vorlage zu Dokument für Pflanzen“." #: rc.cpp:572 #, kde-format msgid "The window size of the template to document dialog" msgstr "Die Fenstergröße des Dialogs „Vorlage zu Dokument“" #: rc.cpp:575 #, kde-format msgid "The digest list column arrangement for the Latest-list" msgstr "" "Die Anordnung der Übersicht der Listenspalte für die Liste der letzten " "Einträge" #: rc.cpp:578 #, kde-format msgid "The digest list column arrangement for the all-list" msgstr "" "Die Anordnung der Übersicht der Listenspalte für die Liste aller Einträge" #: rc.cpp:581 #, kde-format msgid "The digest list column arrangement for timeline" msgstr "Die Anordnung der Übersicht der Listenspalte für die Zeitleiste" #: rc.cpp:584 #, kde-format msgid "The sizes of the slider in the address picker Widget" msgstr "Die Größe der Schieberegler im Adress-Auswahlfenster" #: rc.cpp:587 #, kde-format msgid "The state of the treeview inside the address selector widget" msgstr "Der Status der Baumansicht im Address-Auswahlwidget" #: rc.cpp:590 #, kde-format msgid "Size of the address select dialog" msgstr "Größe des Adressauswahldialoges" #: rc.cpp:593 #, kde-format msgid "State of the window of the material catalog" msgstr "Status des Materialkatalogfensters" #: rc.cpp:596 #, kde-format msgid "Geometry of the material catalog" msgstr "Geometrie des Materialkatalogfensters" #: rc.cpp:599 #, kde-format msgid "State of the header of the material catalog" msgstr "Standardgröße der Material-Katalogs-Ansicht" #: rc.cpp:602 #, kde-format msgid "State of the window of the template catalog" msgstr "Status des Katalog-Fensters" #: rc.cpp:605 #, kde-format msgid "Geometry the template catalog" msgstr "Geometrie des Katalog-Fensters" #: rc.cpp:608 #, kde-format msgid "State of the header of the template catalog" msgstr "Status der Kopfzeile des Vorlagenkatalogs" #: rc.cpp:611 #, kde-format msgid "" "Default percentage the sale price for a material should be higher than its " "purchase price" msgstr "" "Der prozentuale Aufschlag für den VK-Preis eines Materials sollte höher als " "sein EK-Preis sein." #: rc.cpp:614 #, kde-format msgid "The name of the last selected chapter in the catalog" msgstr "Der Name der zuletzt ausgewählten Kategorie im Katalog." #: rc.cpp:617 #, kde-format msgid "The complete filename of the trml2pdf binary" msgstr "Vollständiger Pfad zu trml2pdf" #: rc.cpp:620 #, kde-format msgid "The path to the output directory for document pdfs" msgstr "Pfad zum Ausgabe-Ordner für die Dokument-PDFs" #: rc.cpp:623 #, kde-format msgid "The last created doc type." msgstr "Typ des zuletzt erstellten Dokuments" #: rc.cpp:626 #, kde-format msgid "The date format for print." msgstr "Datumsformat für den Ausdruck." #: rc.cpp:629 #, kde-format msgid "The greeting below on the document footer." msgstr "Der Abschlussgruß im Dokumentfuß." #: rc.cpp:632 #, kde-format msgid "The salut message on the document header." msgstr "Die Anrede im Kopfbereich des Dokuments." #: rc.cpp:635 #, kde-format msgid "" "The name of the catalog chapter where to store new templates in by default" msgstr "" "Der Name des Katalogkapitels, in dem neue Vorlagen standardmäßig gespeichert" " werden" #: rc.cpp:638 #, kde-format msgid "The name of the last used import schema for items." msgstr "Der Name des letzten Eingabeschemas für Posten." #: rc.cpp:641 #, kde-format msgid "The name of the last used input file for items." msgstr "Der Name der letzten Eingabedatei für Posten." #: rc.cpp:644 #, kde-format msgid "" "User name as reference to the KAddressbook to identify 'my' address " "(DEPRECATED)." msgstr "" "Benutzername als Verknüpfung zu KAddressbook, um „Meine Adresse“ festzulegen" " (veraltet)." #: rc.cpp:647 #, kde-format msgid "" "UID of the user as reference to the KAddressbook to identify 'my' address." msgstr "" "Kennung des Benutzers als Verknüpfung zu KAddressbook, um „Meine Adresse“ " "festzulegen." #: rc.cpp:650 #, kde-format msgid "Bank account name." msgstr "Bankkonto Inhaber" #: rc.cpp:653 #, kde-format msgid "Business Identifier Code\" (BIC) of the bank." msgstr "BIC der Bank." #: rc.cpp:656 #, kde-format msgid "IBAN of the bank account." msgstr "IBAN des Bankkontos." #: rc.cpp:659 #, kde-format msgid "The doc id template" msgstr "Dokumentennummer-Vorlage" #: rc.cpp:662 #, kde-format msgid "Localization on document level" msgstr "Lokalisierung auf Dokumentebene" #: rc.cpp:665 #, kde-format msgid "The tax default for new documents." msgstr "Der standardmäßige Steuersatz für neue Dokumente." #: rc.cpp:668 #, kde-format msgid "The label for alternative positions" msgstr "Bezeichnung für Alternativposten" #: rc.cpp:671 rc.cpp:674 #, kde-format msgid "The label for demand positions" msgstr "Bezeichnung für Bedarfsposten" #: rc.cpp:677 #, kde-format msgid "Display the EPC Code as long as the doc sum is below this value." msgstr "" "Anzeige des EPC Code solang die Netto Summe kleiner ist als dieser Wert." #: rc.cpp:683 #, kde-format msgid "Settings" msgstr "Einstellungen" #: rc.cpp:689 #, kde-format msgid "Edit Material" msgstr "Material bearbeiten" #: rc.cpp:692 #, kde-format msgid "Store in C&hapter" msgstr "In &Kategorie speichern" #: rc.cpp:698 #, kde-format msgid "Pac&kaged:" msgstr "Ge&binde:" #: rc.cpp:701 #, kde-format msgid "per P&ackage" msgstr "pro Ge&binde" #: rc.cpp:704 #, kde-format msgid "Prices" msgstr "Preise" #: rc.cpp:707 #, kde-format msgid "= Price of &sale:" msgstr "= &Verkaufspreis:" #: rc.cpp:710 #, kde-format msgid "pl&us" msgstr "&zzgl." #: rc.cpp:714 rc.cpp:807 #, no-c-format, kde-format msgid "%" msgstr " %" #: rc.cpp:717 #, kde-format msgid "&Purchase price:" msgstr "&Einkaufspreis:" #: rc.cpp:720 #, kde-format msgid "Calculation Item Material" msgstr "Materialkostenanteil" #: rc.cpp:723 #, kde-format msgid "

        Calculation Part 'Material'

        " msgstr "

        Kalkulationsanteil „Material“

        " #: rc.cpp:726 #, kde-format msgid "Add Material to the template calculation." msgstr "Material zur Kalkulation der Vorlage hinzufügen" #: rc.cpp:729 #, kde-format msgid "material" msgstr "Material" #: rc.cpp:738 #, kde-format msgid "unit" msgstr "Einheit" #: rc.cpp:741 #, kde-format msgid "" "Please enter the MySQL Database server settings. \n" "\n" "For detailed setup instructions for the MySQL to use with Kraft please check the Kraft website." msgstr "" "Bitte bestätigen Sie die Einstellungen der MySQL-Datenbank. \n" "\n" "Für ausführliche Setup Anweisungen, um MySQL mit Kraft zu nutzen besuchen Sie bitte die Kraft Homepage. " #: rc.cpp:746 #, kde-format msgid "Database host:" msgstr "Datenbank-Rechner:" #: rc.cpp:749 #, kde-format msgid "Database name:" msgstr "Datenbankname:" #: rc.cpp:755 #, kde-format msgid "Password:" msgstr "Passwort:" #: rc.cpp:758 #, kde-format msgid "

        Edit Number Cycles

        " msgstr "

        Nummernbestimmung bearbeiten

        " #: rc.cpp:761 #, kde-format msgid "Number Cycle Details" msgstr "Nummernbestimmung" #: rc.cpp:764 #, kde-format msgid "&Number cycle:" msgstr "&Nummernkreis" #: rc.cpp:767 #, kde-format msgid "&Counter:" msgstr "&Anfangswert:" #: rc.cpp:770 #, kde-format msgid "Example Id:" msgstr "Beispielnummer:" #: rc.cpp:773 #, kde-format msgid "ident &Template:" msgstr "Identifizierungs&vorlage:" #: rc.cpp:779 #, kde-format msgid "&Select a number cycle and edit the details on the right:" msgstr "" "&Wählen Sie eine Nummernbestimmung aus der Liste und bearbeiten Sie diese " "auf der rechten Seite:" #: rc.cpp:782 #, kde-format msgid "New Item" msgstr "Neuer Posten" #: rc.cpp:788 #, kde-format msgid "add" msgstr "Hinzufügen" #: rc.cpp:794 #, kde-format msgid "remove" msgstr "Entfernen" #: rc.cpp:797 #, kde-format msgid "1." msgstr "1." #: rc.cpp:800 rc.cpp:803 #, kde-format msgid "D" msgstr "D" #: rc.cpp:810 #, kde-format msgid "of the sum of" msgstr "der Summe von" #: rc.cpp:813 #, kde-format msgid "" "Please enter the settings for the SQLite database.\n" "\n" "Pick a filename to name the SQLite database file or leave the default setting." msgstr "" "Bitte bestätigen Sie die SQLite-Datenbank-Einstellungen.\n" "\n" "Wählen Sie einen Dateinamen, um die SQLite-Datenbank-Datei zu benennen, oder übernehmen Sie die Voreinstellung. " #: rc.cpp:818 #, kde-format msgid "store the database file at default place." msgstr "Speichern der Datenbank-Datei am voreingestellten Ort." #: rc.cpp:821 #, kde-format msgid "select a file name:" msgstr "Dateinamen auswählen:" #: rc.cpp:824 #, kde-format msgid "

        Add a Tax Rate

        " msgstr "

        Steuersatz hinzufügen

        " #: rc.cpp:827 #, kde-format msgid "Start-Date:" msgstr "Anfangsdatum:" #: rc.cpp:830 #, kde-format msgid "&Reduced tax rate:" msgstr "&Reduzierter Steuersatz:" #: rc.cpp:833 #, kde-format msgid "&Full Tax Rate:" msgstr "&Allgemeiner Steuersatz:" #: rc.cpp:836 #, kde-format msgid "Edit Document Text Template" msgstr "Dokumenten-Textvorlage bearbeiten" #: rc.cpp:839 #, kde-format msgid "&Name:" msgstr "&Name:" #: rc.cpp:842 #, kde-format msgid "displayed as" msgstr "angezeigt als" #: rc.cpp:845 #, kde-format msgid "in doc type" msgstr "im Dokumenttyp" #: rc.cpp:848 #, kde-format msgid "&Text:" msgstr "&Text:" #: rc.cpp:851 #, kde-format msgid "Calculation Item Time" msgstr "Zeitkostenanteil" #: rc.cpp:854 #, kde-format msgid "

        Calculation Part 'Time'

        " msgstr "

        Arbeitszeitverrechnung

        " #: rc.cpp:857 #, kde-format msgid "" "Calculate time efforts here for one unit of the template.
        Note that the" " costs may depend on a global hourly rate." msgstr "" "Hier den zeitlichen Aufwand für eine Einheit der Vorlage berechnen. " "
        Beachten Sie dabei, dass die Kosten auf einem globalen Stundensatz " "beruhen können." #: rc.cpp:863 #, kde-format msgid "Work" msgstr "Arbeitsaufwand" #: rc.cpp:866 #, kde-format msgid "&Time effort:" msgstr "&Zeitaufwand:" #: rc.cpp:869 #, kde-format msgid "&Hourly rate:" msgstr "&Stundensatz:" #: rc.cpp:872 #, kde-format msgid "Apply the &global hourly rate" msgstr "Globalen Stundensatz anwenden" #: rc.cpp:875 #, kde-format msgid "

        Add a unit

        " msgstr "

        Einheit hinzufügen

        " #: rc.cpp:878 #, kde-format msgid "Unit short" msgstr "Einheit (kurz)" #: rc.cpp:881 #, kde-format msgid "Unit long" msgstr "Einheit (ausführlich)" #: rc.cpp:884 #, kde-format msgid "Unit plural short" msgstr "Einheiten-Mehrzahl (kurz)" #: rc.cpp:887 #, kde-format msgid "Unit plural long" msgstr "Einheiten-Mehrzahl (ausführlich)" #: rc.cpp:890 #, kde-format msgid "Unit ECE20" msgstr "Einheit ECE20" #: rc.cpp:893 #, kde-format msgid "" "This step checks if the database schema version is sufficient for this version of Kraft. \n" "\n" "In case it is not, the schema is updated automatically.\n" msgstr "" "Dieser Schritt überprüft, ob die Datenbankschema-Version für diese Version von Kraft ausreicht.\n" "\n" "Wenn sie nicht ausreicht, wird das Schema automatisch aktualisiert.\n" #: rc.cpp:912 #, kde-format msgid "Upgrade not yet started" msgstr "Die Aktualisierung wurde noch nicht eingeleitet." #: rc.cpp:915 #, kde-format msgid "

        Add a Wage group

        " msgstr "

        Lohngruppe hinzufügen

        " #: rc.cpp:918 #, kde-format msgid "Group name" msgstr "Gruppenname" #: rc.cpp:921 #, kde-format msgid "Wage" msgstr "Arbeitslohn" #: rc.cpp:924 #, kde-format msgid "Dialog" msgstr "Dialog" #: rc.cpp:927 #, kde-format msgid "" "

        XRechnung Additional Data

        " msgstr "" "

        XRechnung: Zusätzliche Daten

        " #: rc.cpp:930 #, kde-format msgid "Due date:" msgstr "Zahlungsziel-Datum:" #: rc.cpp:933 #, kde-format msgid "Buyer reference:" msgstr "Käufer-Referenz:" kraft-1.2.2/po/kraft.pot000066400000000000000000002162041467704360200151120ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-04 22:35+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: addeditchapterdialog.cpp:35 #, kde-format msgid "Add/Edit Catalog Chapter" msgstr "" #: addeditchapterdialog.cpp:41 #, kde-format msgid "Create a new Catalog Chapter" msgstr "" #: addeditchapterdialog.cpp:45 #, kde-format msgid "Chapter name:" msgstr "" #: addeditchapterdialog.cpp:49 #, kde-format msgid "Chapter description:" msgstr "" #: addeditchapterdialog.cpp:76 #, kde-format msgid "Create new Catalog Chapter below chapter %1" msgstr "" #: addeditchapterdialog.cpp:83 #, kde-format msgid "Edit name and description of chapter %1" msgstr "" #: addressselectorwidget.cpp:219 #, kde-format msgid "Name" msgstr "" #: addressselectorwidget.cpp:221 #, kde-format msgid "Address" msgstr "" #: addressselectorwidget.cpp:288 filterheader.cpp:40 #, kde-format msgid "&Search:" msgstr "" #: addressselectorwidget.cpp:325 #, kde-format msgid "Edit Contact…" msgstr "" #: addressselectorwidget.cpp:326 #, kde-format msgid "Edit the currently selected contact" msgstr "" #: addressselectorwidget.cpp:329 #, kde-format msgid "New Contact…" msgstr "" #: addressselectorwidget.cpp:330 #, kde-format msgid "Create a new Contact" msgstr "" #: alldocsview.cpp:64 #, kde-format msgid "All documents" msgstr "" #: alldocsview.cpp:65 #, kde-format msgid "Documents of last week" msgstr "" #: alldocsview.cpp:66 #, kde-format msgid "Documents of last month" msgstr "" #: alldocsview.cpp:72 #, kde-format msgid "&Show: " msgstr "" #: alldocsview.cpp:79 #, kde-format msgid "&Search: " msgstr "" #: alldocsview.cpp:134 portal.cpp:303 portal.cpp:304 rc.cpp:686 #, kde-format msgid "Document Actions" msgstr "" #: archdoc.cpp:65 #, kde-format msgid "%1 for %2 (ID %3)" msgstr "" #: calcpart.cpp:98 #, kde-format msgid "Base" msgstr "" #: catalogselection.cpp:50 #, kde-format msgid "Selected &catalog: " msgstr "" #: catalogselection.cpp:159 #, kde-format msgid "Append to Document" msgstr "" #: catalogtemplate.cpp:52 #, kde-format msgid "Manual Price" msgstr "" #: catalogtemplate.cpp:54 #, kde-format msgid "Calculated" msgstr "" #: catalogtemplate.cpp:56 #, kde-format msgid "AutoCalc" msgstr "" #: catalogtemplate.cpp:57 #, kde-format msgid "Err: Unknown type %d" msgstr "" #: defaultprovider.cpp:63 doctext.cpp:80 positionviewwidget.cpp:418 #, kde-format msgid "Unknown" msgstr "" #: docassistant.cpp:52 #, kde-format msgid "Show &Templates" msgstr "" #: docassistant.cpp:57 #, kde-format msgid "Show mask to create or select templates to be used in the document" msgstr "" #: docassistant.cpp:121 #, kde-format msgid "Add a template to the document" msgstr "" #: docassistant.cpp:128 #, kde-format msgid "Insert the template to the document" msgstr "" #: docassistant.cpp:136 #, kde-format msgid "Create a new template" msgstr "" #: docassistant.cpp:143 #, kde-format msgid "Edit the current template" msgstr "" #: docassistant.cpp:150 #, kde-format msgid "Delete the current template" msgstr "" #: docassistant.cpp:319 #, kde-format msgid "" "Do you really want to delete the template permanently?\n" "It cannot be recovered." msgstr "" #: docdigestdetailview.cpp:229 rc.cpp:78 rc.cpp:120 #, kde-format msgid "Amount" msgstr "" #: docdigestdetailview.cpp:230 #, kde-format msgid "Type" msgstr "" #: docdigestdetailview.cpp:231 #, kde-format msgid "Sum" msgstr "" #: docdigestdetailview.cpp:260 #, kde-format msgid "Results in %1 %2" msgstr "" #: docdigestdetailview.cpp:261 docdigestdetailview.cpp:294 #, kde-format msgid "Year" msgstr "" #: docdigestdetailview.cpp:263 #, kde-format msgid "Month" msgstr "" #: docdigestdetailview.cpp:296 #, kde-format msgid "Results in Year %1" msgstr "" #: docdigestdetailview.cpp:315 docdigestdetailview.cpp:324 #, kde-format msgid "Customer" msgstr "" #: docdigestdetailview.cpp:319 #, kde-format msgid "not set" msgstr "" #: docdigestdetailview.cpp:335 #, kde-format msgid "The address is not listed in an address book." msgstr "" #: docdigestdetailview.cpp:337 #, kde-format msgid "" "The client has the address book id %1 but cannot found in our address books." msgstr "" #: docdigestdetailview.cpp:340 #, kde-format msgid "The client can be found in our address books." msgstr "" #: docdigestdetailview.cpp:351 prefsdialog.cpp:744 #, kde-format msgid "preferred address" msgstr "" #: docdigestdetailview.cpp:355 prefsdialog.cpp:748 #, kde-format msgid "home address" msgstr "" #: docdigestdetailview.cpp:359 prefsdialog.cpp:752 #, kde-format msgid "work address" msgstr "" #: docdigestdetailview.cpp:363 prefsdialog.cpp:756 #, kde-format msgid "postal address" msgstr "" #: docdigestdetailview.cpp:367 prefsdialog.cpp:760 #, kde-format msgid "international address" msgstr "" #: docdigestdetailview.cpp:371 prefsdialog.cpp:764 #, kde-format msgid "domestic address" msgstr "" #: docdigestdetailview.cpp:375 prefsdialog.cpp:768 #, kde-format msgid "unknown" msgstr "" #: docdigestdetailview.cpp:412 models/docbasemodel.cpp:32 #, kde-format msgid "Date" msgstr "" #: docdigestdetailview.cpp:417 models/docbasemodel.cpp:35 #, kde-format msgid "Whiteboard" msgstr "" #: docdigestdetailview.cpp:422 models/docbasemodel.cpp:39 #, kde-format msgid "Project" msgstr "" #: docdigestdetailview.cpp:432 #, kde-format msgid "This document was never printed." msgstr "" #: docdigestdetailview.cpp:439 #, kde-format msgid "Last printed" msgstr "" #: docdigestdetailview.cpp:440 #, kde-format msgid "Opens last created PDF document" msgstr "" #: docdigestdetailview.cpp:441 #, kde-format msgid "open" msgstr "" #: docdigestdetailview.cpp:446 #, kde-format msgid "One older print" msgstr "" #: docdigestdetailview.cpp:448 #, kde-format msgid "%1 older prints" msgstr "" #: docdigestdetailview.cpp:452 #, kde-format msgid "Archived documents cannot be found. Check PDF Output dir." msgstr "" #: docdigestdetailview.cpp:457 #, kde-format msgid "Export the invoice in XRechnung file format" msgstr "" #: docdigestdetailview.cpp:458 #, kde-format msgid "XRechnung" msgstr "" #: docpostcard.cpp:33 #, kde-format msgid "Document Overview" msgstr "" #: docpostcard.cpp:125 #, kde-format msgid "Netto:" msgstr "" #: docpostcard.cpp:136 docpostcard.cpp:143 #, kde-format msgid "+ %1% Tax:" msgstr "" #: docpostcard.cpp:149 #, kde-format msgid "Sum Tax:" msgstr "" #: docpostcard.cpp:154 #, kde-format msgid "Total:" msgstr "" #: docpostcard.cpp:246 #, kde-format msgid "%1 Items" msgstr "" #: docpostcard.cpp:248 #, kde-format msgid "%1 Items, netto %2" msgstr "" #: doctext.cpp:61 #, kde-format msgid "Standard" msgstr "" #: doctext.cpp:76 #, kde-format msgid "Header Text" msgstr "" #: doctext.cpp:77 #, kde-format msgid "Footer Text" msgstr "" #: doctext.cpp:78 #, kde-format msgid "Items" msgstr "" #: doctypeedit.cpp:49 #, kde-format msgid "" msgstr "" #: doctypeedit.cpp:50 #, kde-format msgid "
        " msgstr "" #: doctypeedit.cpp:85 #, kde-format msgid "Select template file from harddisk" msgstr "" #: doctypeedit.cpp:86 #, kde-format msgid "Select watermark file from harddisk" msgstr "" #: doctypeedit.cpp:87 #, kde-format msgid "Select PDF file to append to documents from harddisk" msgstr "" #: doctypeedit.cpp:91 prefsdialog.cpp:409 #, kde-format msgid "Find Template File" msgstr "" #: doctypeedit.cpp:92 #, kde-format msgid "Kraft Templates (*.trml *.gtmpl)" msgstr "" #: doctypeedit.cpp:100 #, kde-format msgid "Find Watermark File" msgstr "" #: doctypeedit.cpp:101 doctypeedit.cpp:111 #, kde-format msgid "PDF file (*.pdf)" msgstr "" #: doctypeedit.cpp:110 #, kde-format msgid "Find Append PDF File" msgstr "" #: doctypeedit.cpp:176 doctypeedit.cpp:214 #, kde-format msgid "Add Document Type" msgstr "" #: doctypeedit.cpp:177 #, kde-format msgid "Enter the name of a new document type" msgstr "" #: doctypeedit.cpp:215 #, kde-format msgid "Edit the name of a document type" msgstr "" #: documentman.cpp:93 #, kde-format msgctxt "" "Text to be inserted into a doc, if the sum of another doc needs to be " "substracted ie. in a final invoice if there was a partial invoice before%1 " "is substited by the doc type, %2 by the id of the predecessor doc." msgid "Substract sum from %1 %2" msgstr "" #: documenttemplate.cpp:113 #, kde-format msgctxt "Sequence number printed on the document" msgid "No." msgstr "" #: documenttemplate.cpp:114 #, kde-format msgctxt "Document item printed on the document" msgid "Item" msgstr "" #: documenttemplate.cpp:115 #, kde-format msgctxt "Abbrev. of Quantity printed on the document" msgid "Qty." msgstr "" #: documenttemplate.cpp:116 #, kde-format msgctxt "Unit printed on the document" msgid "Unit" msgstr "" #: documenttemplate.cpp:117 #, kde-format msgctxt "Price of an item printed on the document" msgid "Price" msgstr "" #: documenttemplate.cpp:118 #, kde-format msgctxt "Printed on the document" msgid "Sum" msgstr "" #: documenttemplate.cpp:119 #, kde-format msgctxt "printed on the document" msgid "Net" msgstr "" #: documenttemplate.cpp:120 #, kde-format msgctxt "Printed on the document" msgid "VAT" msgstr "" #: documenttemplate.cpp:121 #, kde-format msgctxt "Document type, printed on the document" msgid "Type" msgstr "" #: documenttemplate.cpp:123 #, kde-format msgctxt "Printed on the document" msgid "Phone" msgstr "" #: documenttemplate.cpp:124 #, kde-format msgctxt "Printed on the document" msgid "Fax" msgstr "" #: documenttemplate.cpp:125 #, kde-format msgctxt "Printed on the document" msgid "Mobile" msgstr "" #: documenttemplate.cpp:126 #, kde-format msgctxt "Printed on the document" msgid "Email" msgstr "" #: documenttemplate.cpp:127 #, kde-format msgctxt "Printed on the document" msgid "Website" msgstr "" #: documenttemplate.cpp:129 #, kde-format msgctxt "Printed on the document" msgid "Page" msgstr "" #: documenttemplate.cpp:130 #, kde-format msgctxt "Label of Predecessor document number" msgid "Predecessor-Doc" msgstr "" #: documenttemplate.cpp:131 #, kde-format msgctxt "the 'of' in page X of Y" msgid "of" msgstr "" #: documenttemplate.cpp:132 #, kde-format msgctxt "Document number on document" msgid "Document No." msgstr "" #: documenttemplate.cpp:133 #, kde-format msgctxt "Date on document" msgid "Date" msgstr "" #: documenttemplate.cpp:134 #, kde-format msgctxt "Project label" msgid "Project" msgstr "" #: documenttemplate.cpp:135 #, kde-format msgctxt "Customer ID on document" msgid "Customer ID" msgstr "" #: documenttemplate.cpp:200 #, kde-format msgctxt "" "Credit Transfer reason string, 1=DocType, 2=DocIdent, 3=Date, ie. Invoice " "2022-183 dated 2022-03-22" msgid "%1 %2 dated %3" msgstr "" #: documenttemplate.cpp:321 #, kde-format msgid "" "Please note: This offer contains %1 alternative or demand positions, printed " "in italic font. These do not add to the overall sum." msgstr "" #: documenttemplate.cpp:332 #, kde-format msgid "tax free items (%1 pcs.)" msgstr "" #: documenttemplate.cpp:338 #, kde-format msgid "items with reduced tax of %1% (%2 pcs.)" msgstr "" #: documenttemplate.cpp:347 #, kde-format msgid "No label: items with full tax of %1% (%2 pcs.)" msgstr "" #: documenttemplate.cpp:377 kraftview_ro.cpp:225 #, kde-format msgid "reduced VAT" msgstr "" #: documenttemplate.cpp:385 kraftview_ro.cpp:197 kraftview_ro.cpp:234 rc.cpp:21 #, kde-format msgid "VAT" msgstr "" #: documenttemplate.cpp:439 #, kde-format msgid "Template to convert is not existing!" msgstr "" #: documenttemplate.cpp:442 #, kde-format msgid "Can not read template file!" msgstr "" #: fixcalcdialog.cpp:36 #, kde-format msgid "Calculation Fix Item" msgstr "" #: flostempldialog.cpp:71 #, kde-format msgid "Create or Edit Template Items" msgstr "" #: flostempldialog.cpp:213 flostempldialog.cpp:604 #, kde-format msgid "No" msgstr "" #: flostempldialog.cpp:214 flostempldialog.cpp:604 #, kde-format msgid "Yes" msgstr "" #: flostempldialog.cpp:251 #, kde-format msgid "Calculated price: " msgstr "" #: flostempldialog.cpp:255 #, kde-format msgid "Manual price: " msgstr "" #: flostempldialog.cpp:260 #, kde-format msgid "(+%1%)" msgstr "" #: flostempldialog.cpp:264 #, kde-format msgid "%1%" msgstr "" #: flostempldialog.cpp:266 #, kde-format msgid ": " msgstr "" #: flostempldialog.cpp:388 #, kde-format msgid "Template Error" msgstr "" #: flostempldialog.cpp:388 #, kde-format msgid "Saving of this template failed, sorry" msgstr "" #: flostempldialog.cpp:416 #, kde-format msgid "The template has been modified." msgstr "" #: flostempldialog.cpp:417 #, kde-format msgid "Do you want to discard your changes?" msgstr "" #: flostempldialog.cpp:446 #, kde-format msgid "" "The catalog chapter was changed for this template.\n" "Do you really want to move the template to the new chapter?" msgstr "" #: flostempldialog.cpp:448 #, kde-format msgid "Chapter Change" msgstr "" #: flostempldialog.h:104 #, kde-format msgid "Calculated material" msgstr "" #: importfilter.cpp:50 #, kde-format msgid "Unable to find filter called %1" msgstr "" #: importfilter.cpp:58 #, kde-format msgid "Could not open the definition file!" msgstr "" #: importfilter.cpp:143 #, kde-format msgid "Unknown tags: " msgstr "" #: importfilter.cpp:184 #, kde-format msgid "Could not recode input file!" msgstr "" #: importfilter.cpp:192 #, kde-format msgid "Unable to open temp file " msgstr "" #: importfilter.cpp:198 #, kde-format msgid "Could not open the import source file!" msgstr "" #: importitemdialog.cpp:47 #, kde-format msgid "Import Items From File" msgstr "" #: importitemdialog.cpp:116 #, kde-format msgid "the Header of the Document" msgstr "" #: importitemdialog.cpp:125 templtopositiondialogbase.cpp:58 #, kde-format msgid "…" msgstr "" #: inserttempldialog.cpp:103 #, kde-format msgid "Create a New Item" msgstr "" #: inserttempldialog.cpp:105 #, kde-format msgid "Create a New Item from Template" msgstr "" #: itemtagdialog.cpp:82 #, kde-format msgid "Edit Item Tags" msgstr "" #: itemtagdialog.cpp:89 #, kde-format msgid "Item Tags" msgstr "" #: itemtagdialog.cpp:90 #, kde-format msgid "Select all tags for the item should be tagged with." msgstr "" #: itemtagdialog.cpp:105 tagtemplatesdialog.cpp:150 #, kde-format msgid "Tag" msgstr "" #: itemtagdialog.cpp:106 tagtemplatesdialog.cpp:151 #, kde-format msgid "Color" msgstr "" #: itemtagdialog.cpp:107 tagtemplatesdialog.cpp:152 #, kde-format msgid "Description" msgstr "" #: katalog.cpp:137 #, kde-format msgid "not found" msgstr "" #: kataloglistview.cpp:355 #, kde-format msgid "A catalog chapter cannot be deleted as long it has children." msgstr "" #: kataloglistview.cpp:356 #, kde-format msgid "Chapter cannot be deleted" msgstr "" #: katalogview.cpp:119 rc.cpp:182 rc.cpp:195 rc.cpp:250 rc.cpp:257 rc.cpp:900 #, no-c-format, kde-format msgid "%p%" msgstr "" #: katalogview.cpp:167 #, kde-format msgid "Edit Sub chapter" msgstr "" #: katalogview.cpp:169 #, kde-format msgid "Edit a catalog sub chapter" msgstr "" #: katalogview.cpp:173 #, kde-format msgid "Add a sub chapter" msgstr "" #: katalogview.cpp:175 #, kde-format msgid "Add a sub chapter below the selected one" msgstr "" #: katalogview.cpp:179 katalogview.cpp:181 #, kde-format msgid "Remove a sub chapter" msgstr "" #: katalogview.cpp:185 rc.cpp:3 #, kde-format msgid "Edit Template" msgstr "" #: katalogview.cpp:187 #, kde-format msgid "Opens the editor window for templates to edit the selected one" msgstr "" #: katalogview.cpp:192 #, kde-format msgid "New template" msgstr "" #: katalogview.cpp:194 #, kde-format msgid "Opens the editor window for templates to enter a new template" msgstr "" #: katalogview.cpp:199 #, kde-format msgid "Delete template" msgstr "" #: katalogview.cpp:201 #, kde-format msgid "Deletes the template" msgstr "" #: katalogview.cpp:206 #, kde-format msgid "Export catalog" msgstr "" #: katalogview.cpp:208 #, kde-format msgid "Export the whole catalog as XML encoded file" msgstr "" #: katalogview.cpp:213 #, kde-format msgid "Import catalog" msgstr "" #: katalogview.cpp:215 #, kde-format msgid "Import a catalog from a XML file" msgstr "" #: katalogview.cpp:219 rc.cpp:527 #, kde-format msgid "&Catalog" msgstr "" #: katalogview.cpp:237 #, kde-format msgid "Opening file…" msgstr "" #: katalogview.cpp:239 katalogview.cpp:305 katalogview.cpp:319 #: katalogview.cpp:328 katalogview.cpp:337 portal.cpp:750 portal.cpp:773 #: portal.cpp:1098 #, kde-format msgid "Ready." msgstr "" #: katalogview.cpp:244 portal.cpp:1042 #, kde-format msgid "Exiting…" msgstr "" #: katalogview.cpp:301 #, kde-format msgid "Exporting file…" msgstr "" #: katalogview.cpp:310 #, kde-format msgid "Importing file… (not yet implemented)" msgstr "" #: katalogview.cpp:315 #, kde-format msgid "Creating a new sub chapter…" msgstr "" #: katalogview.cpp:324 #, kde-format msgid "Editing a sub chapter…" msgstr "" #: katalogview.cpp:333 #, kde-format msgid "Removing a sub chapter…" msgstr "" #: katalogview.cpp:366 #, kde-format msgid "Created at %1 " msgstr "" #: katalogview.cpp:370 #, kde-format msgid ", last modified at %1" msgstr "" #: katalogview.cpp:376 #, kde-format msgid "%1 times used, last at %2" msgstr "" #: kraftdoc.cpp:160 #, kde-format msgctxt "First argument is the doctype, like Invoice, followed by the ID" msgid "%1 (ID %2)" msgstr "" #: kraftdoc.cpp:308 #, kde-format msgctxt "Document part header" msgid "Header" msgstr "" #: kraftdoc.cpp:310 #, kde-format msgctxt "Document part footer" msgid "Footer" msgstr "" #: kraftdoc.cpp:312 #, kde-format msgctxt "Document part containing the items" msgid "Items" msgstr "" #: kraftdoc.cpp:314 #, kde-format msgid "Unknown document part" msgstr "" #: kraftdocfooteredit.cpp:52 #, kde-format msgid "Document Footer" msgstr "" #: kraftdocheaderedit.cpp:57 #, kde-format msgid "Document Header" msgstr "" #: kraftdocheaderedit.cpp:65 #, kde-format msgid "Manually set in address field." msgstr "" #: kraftdocpositionsedit.cpp:94 #, kde-format msgid "Add Item…" msgstr "" #: kraftdocpositionsedit.cpp:96 #, kde-format msgid "Add a normal item to the document manually." msgstr "" #: kraftdocpositionsedit.cpp:100 #, kde-format msgid "Add Discount Item" msgstr "" #: kraftdocpositionsedit.cpp:103 #, kde-format msgid "" "Adds an item to the document that allows discounts on other items in the " "document" msgstr "" #: kraftdocpositionsedit.cpp:106 #, kde-format msgid "Import Items…" msgstr "" #: kraftdocpositionsedit.cpp:109 #, kde-format msgid "Opens a dialog where multiple items can be imported from a text file." msgstr "" #: kraftdocpositionsedit.cpp:118 #, kde-format msgid "Document Items" msgstr "" #: kraftview.cpp:89 kraftview_ro.cpp:60 #, kde-format msgid "Document" msgstr "" #: kraftview.cpp:257 #, kde-format msgid "Successor of %1" msgstr "" #: kraftview.cpp:395 kraftview.cpp:847 #, kde-format msgid "" "The address label is not empty and different from the selected one.
        Do " "you really want to replace it with the text shown below?
        %1
        " msgstr "" #: kraftview.cpp:442 #, kde-format msgid "" "

        The Document Items List is still empty, but Items can be added now.To add items to the document either
        • Press the 'Add item' button " "above.
        • Open the template catalog by clicking on the 'show Template' " "button on the right and pick one of the available templates.
        " msgstr "" #: kraftview.cpp:634 prefsdialog.cpp:329 #, kde-format msgid "Display no tax at all" msgstr "" #: kraftview.cpp:635 prefsdialog.cpp:330 #, kde-format msgid "Calculate reduced tax for all items" msgstr "" #: kraftview.cpp:636 prefsdialog.cpp:331 #, kde-format msgid "Calculate full tax for all items" msgstr "" #: kraftview.cpp:637 #, kde-format msgid "Calculate individual tax for each item" msgstr "" #: kraftview.cpp:694 #, kde-format msgid "Tax Settings Overwrite" msgstr "" #: kraftview.cpp:695 #, kde-format msgid "Really overwrite all individual tax settings of the items?" msgstr "" #: kraftview.cpp:846 #, kde-format msgid "Address Overwrite" msgstr "" #: kraftview.cpp:1111 #, kde-format msgid "Discount" msgstr "" #: kraftview.cpp:1351 #, kde-format msgid "The document has been modified." msgstr "" #: kraftview.cpp:1352 #, kde-format msgid "Do you want to save your changes?" msgstr "" #: kraftview_ro.cpp:198 #, kde-format msgid "Reduced TAX" msgstr "" #: main.cpp:58 #, kde-format msgid "Open document with arch doc number " msgstr "" #: main.cpp:59 #, kde-format msgid "Open Kraft in read only mode - document changes prohibited" msgstr "" #: materialkataloglistview.cpp:40 rc.cpp:108 rc.cpp:695 #, kde-format msgid "Material" msgstr "" #: materialkataloglistview.cpp:41 #, kde-format msgid "Pack" msgstr "" #: materialkataloglistview.cpp:42 rc.cpp:123 #, kde-format msgid "Unit" msgstr "" #: materialkataloglistview.cpp:43 #, kde-format msgid "Purchase" msgstr "" #: materialkataloglistview.cpp:44 #, kde-format msgid "Sale" msgstr "" #: materialkataloglistview.cpp:45 models/docbasemodel.cpp:37 #, kde-format msgid "Last Modified" msgstr "" #: materialkataloglistview.cpp:51 #, kde-format msgid "Material Catalog" msgstr "" #: materialkatalogview.cpp:106 #, kde-format msgid "" msgstr "" #: materialkatalogview.cpp:136 templkatalogview.cpp:139 #, kde-format msgid "Do you really want to delete the template from the catalog?" msgstr "" #: materialselectdialog.cpp:39 #, kde-format msgid "Add Material to Calculation" msgstr "" #: materialselectdialog.cpp:44 #, kde-format msgid "

        Add Material to Calculation

        " msgstr "" #: models/docbasemodel.cpp:33 #, kde-format msgid "Doc. Number" msgstr "" #: models/docbasemodel.cpp:34 #, kde-format msgid "Doc. Type" msgstr "" #: models/docbasemodel.cpp:36 #, kde-format msgid "Client ID" msgstr "" #: models/docbasemodel.cpp:38 #, kde-format msgid "Creation Date" msgstr "" #: models/docbasemodel.cpp:40 #, kde-format msgid "Client Address" msgstr "" #: models/docbasemodel.cpp:41 #, kde-format msgid "Client" msgstr "" #: models/docbasemodel.cpp:109 #, kde-format msgid "Looking up address…" msgstr "" #: models/docbasemodel.cpp:111 #, kde-format msgid "Lookup started…" msgstr "" #: newdocassistant.cpp:52 newdocassistant.cpp:96 #, kde-format msgid "New Document Settings" msgstr "" #: newdocassistant.cpp:55 #, kde-format msgid "" "Please select a customer as addressee for the document. If there is no entry " "for the customer in the addressbook yet, it can be opened by clicking on the " "button below." msgstr "" #: newdocassistant.cpp:100 #, kde-format msgid "" "Select a document type and a date. A comment on the whiteboard helps to " "classify the document." msgstr "" #: newdocassistant.cpp:107 #, kde-format msgid "Customer: Not yet selected!" msgstr "" #: newdocassistant.cpp:116 #, kde-format msgid "Document &type:" msgstr "" #: newdocassistant.cpp:120 #, kde-format msgid "Document date: " msgstr "" #: newdocassistant.cpp:123 #, kde-format msgid "Whiteboard content:" msgstr "" #: newdocassistant.cpp:127 #, kde-format msgid "Copy document items from predecessor document" msgstr "" #: newdocassistant.cpp:175 #, kde-format msgid "Create a new Kraft Document" msgstr "" #: newdocassistant.cpp:265 #, kde-format msgid "Followup Document for %1" msgstr "" #: numbercycledialog.cpp:52 #, kde-format msgid "Edit Number Cycles" msgstr "" #: numbercycledialog.cpp:67 #, kde-format msgid "" "The template may contain the following tags:
        • %y or %yyyy - the year " "of the documents date.
        • %yy - the year of the document (two digits).
        • %w - the week number of the documents date.
        • %ww - the week " "number of the documents date with leading zero.
        • %d - the day number " "of the documents date.
        • %dd - the day number of the documents date " "with leading zero.
        • %m or %M - the month number of the documents date." "
        • %MM - the month number with leading zero.
        • %c - the customer " "id from kaddressbook
        • %i - the unique counter
        • %ii .. %iiiiii " "- the counter padded with leading 0, ie. 012
        • %n - a day based " "counter, resets every day. Combined with date, it makes the number unique.
        • %nn .. %nnnnnn - the day based counter padded with leading 0.
        • %type - the localised doc type (offer, invoice etc.)
        • %uid - " "the contact id of the client.
        %i or %n need to be part of the " "template." msgstr "" #: numbercycledialog.cpp:141 #, kde-format msgid "Doc-Type" msgstr "" #: numbercycledialog.cpp:154 #, kde-format msgctxt "do not translate %i, it is a template variable." msgid "(%i added)" msgstr "" #: numbercycledialog.cpp:227 #, kde-format msgid "Add Number Cycle" msgstr "" #: numbercycledialog.cpp:228 #, kde-format msgid "Enter the name of a new number cycle." msgstr "" #: numbercycledialog.cpp:286 #, kde-format msgid "The numbercycle %1 is still assigned to a document type." msgstr "" #: numbercycledialog.cpp:287 #, kde-format msgid "" "The number cycle cannot be deleted as long as it is assigned to a document " "type." msgstr "" #: numbercycledialog.cpp:346 #, kde-format msgid "Dangerous Counter Change" msgstr "" #: numbercycledialog.cpp:347 #, kde-format msgid "The new counter is lower than the old one. " msgstr "" #: numbercycledialog.cpp:348 #, kde-format msgid "" "That has potential to create duplicate document numbers. Do you really want " "to decrease it?" msgstr "" #: portal.cpp:105 #, kde-format msgid "&Quit" msgstr "" #: portal.cpp:110 #, kde-format msgid "&Cut" msgstr "" #: portal.cpp:115 #, kde-format msgid "C&opy" msgstr "" #: portal.cpp:120 #, kde-format msgid "&Paste" msgstr "" #: portal.cpp:125 #, kde-format msgid "&Settings" msgstr "" #: portal.cpp:130 #, kde-format msgid "&Create Document" msgstr "" #: portal.cpp:135 #, kde-format msgid "&Copy Document" msgstr "" #: portal.cpp:140 #, kde-format msgid "Create &Followup Document" msgstr "" #: portal.cpp:145 #, kde-format msgid "Print Document" msgstr "" #: portal.cpp:150 #, kde-format msgid "Show Document" msgstr "" #: portal.cpp:155 #, kde-format msgid "Edit Document" msgstr "" #: portal.cpp:160 #, kde-format msgid "Open Archived Document" msgstr "" #: portal.cpp:165 #, kde-format msgid "Mail Document" msgstr "" #: portal.cpp:170 #, kde-format msgid "Export XRechnung" msgstr "" #: portal.cpp:175 tagtemplatesdialog.cpp:135 tagtemplatesdialog.cpp:140 #, kde-format msgid "Edit Tag Templates" msgstr "" #: portal.cpp:180 #, kde-format msgid "Redo Initial Setup…" msgstr "" #: portal.cpp:185 #, kde-format msgid "Kraft Handbook…" msgstr "" #: portal.cpp:190 #, kde-format msgid "About Qt…" msgstr "" #: portal.cpp:195 #, kde-format msgid "About Kraft…" msgstr "" #: portal.cpp:199 #, kde-format msgid "Quits the application" msgstr "" #: portal.cpp:201 #, kde-format msgid "Cuts the selected section and puts it to the clipboard" msgstr "" #: portal.cpp:202 #, kde-format msgid "Copies the selected section to the clipboard" msgstr "" #: portal.cpp:203 #, kde-format msgid "Pastes the clipboard contents to current position" msgstr "" #: portal.cpp:205 #, kde-format msgid "Creates a new Document" msgstr "" #: portal.cpp:206 #, kde-format msgid "Print and archive this Document" msgstr "" #: portal.cpp:207 #, kde-format msgid "Creates a new document which is a copy of the selected document" msgstr "" #: portal.cpp:208 #, kde-format msgid "Create a followup document for the current document" msgstr "" #: portal.cpp:209 #, kde-format msgid "Opens the document for editing" msgstr "" #: portal.cpp:210 #, kde-format msgid "Opens a read only view on the document." msgstr "" #: portal.cpp:211 #, kde-format msgid "Send document per mail" msgstr "" #: portal.cpp:212 #, kde-format msgid "Export invoice in XRechnung XML format." msgstr "" #: portal.cpp:213 #, kde-format msgid "" "Edit the available tag templates which can be assigned to document items." msgstr "" #: portal.cpp:214 #, kde-format msgid "Configure the Database Kraft is working on." msgstr "" #: portal.cpp:215 #, kde-format msgid "Open a viewer on an archived document" msgstr "" #: portal.cpp:227 rc.cpp:524 #, kde-format msgid "&File" msgstr "" #: portal.cpp:231 #, kde-format msgid "&Edit" msgstr "" #: portal.cpp:236 rc.cpp:680 #, kde-format msgid "&Document" msgstr "" #: portal.cpp:251 #, kde-format msgid "Kraft" msgstr "" #: portal.cpp:254 #, kde-format msgid "&Preferences" msgstr "" #: portal.cpp:258 #, kde-format msgid "Toolbars" msgstr "" #: portal.cpp:264 #, kde-format msgid "&Help" msgstr "" #: portal.cpp:352 #, kde-format msgid "Database not running" msgstr "" #: portal.cpp:353 #, kde-format msgid "" "Kraft was started in readonly mode, but the configured database cannot be " "connected.\n" "\n" "Kraft will abort." msgstr "" #: portal.cpp:369 #, kde-format msgid "" "Kraft cannot connect to the specified MySQL server. Please check the Kraft " "database settings, check if the server is running and verify if a database " "with the name %1 exits!" msgstr "" #: portal.cpp:373 #, kde-format msgid "" "The database with the name %1 does not exist on the database server. Please " "make sure the database exists and is accessible by the user running Kraft." msgstr "" #: portal.cpp:377 #, kde-format msgid "" "The Qt database driver could not be loaded. That probably means, that they " "are not installed. Please make sure the Qt database packages are installed " "and try again." msgstr "" #: portal.cpp:381 #, kde-format msgid "There is a database problem: %1" msgstr "" #: portal.cpp:399 #, kde-format msgid "Database Problem." msgstr "" #: portal.cpp:411 #, kde-format msgid "Check commandline actions" msgstr "" #: portal.cpp:501 #, kde-format msgid "Welcome to Kraft, %1" msgstr "" #: portal.cpp:530 #, kde-format msgid "Creating new document…" msgstr "" #: portal.cpp:556 #, kde-format msgctxt "" "Dialog title of the followup doc dialog, followed by the id of the source " "doc" msgid "Create follow up document for %1" msgstr "" #: portal.cpp:601 #, kde-format msgctxt "Title of the new doc dialog, %1 is the source doc id" msgid "Create new Document as Copy of %1" msgstr "" #: portal.cpp:636 #, kde-format msgid "Opening document to view…" msgstr "" #: portal.cpp:663 #, kde-format msgid "XRechnung Template file not set. Please check the application settings!" msgstr "" #: portal.cpp:667 #, kde-format msgid "The XRechnung template file cannot be read!" msgstr "" #: portal.cpp:672 #, kde-format msgid "XRechnung Export" msgstr "" #: portal.cpp:692 #, kde-format msgid "Save XRechnung" msgstr "" #: portal.cpp:702 #, kde-format msgid "Saved XRechnung to %1" msgstr "" #: portal.cpp:736 #, kde-format msgid "Generating PDF…" msgstr "" #: portal.cpp:759 #, kde-format msgid "Generating PDF to email" msgstr "" #: portal.cpp:778 #, kde-format msgid "Doc Generation Error" msgstr "" #: portal.cpp:834 #, kde-format msgid "Printing archived document…" msgstr "" #: portal.cpp:886 #, kde-format msgid "Opening document %1" msgstr "" #: portal.cpp:1069 #, kde-format msgid "Cutting selection…" msgstr "" #: portal.cpp:1076 #, kde-format msgid "Copying selection to clipboard…" msgstr "" #: portal.cpp:1083 #, kde-format msgid "Inserting clipboard contents…" msgstr "" #: portal.cpp:1096 #, kde-format msgid "" "Ready. Kraft is running in read only mode. Document editing is prohibited." msgstr "" #: portalview.cpp:68 #, kde-format msgid "About Kraft" msgstr "" #: portalview.cpp:98 #, kde-format msgid "Documents" msgstr "" #: portalview.cpp:105 #, kde-format msgid "Timeline" msgstr "" #: portalview.cpp:113 #, kde-format msgid "Catalogs" msgstr "" #: portalview.cpp:152 #, kde-format msgid "Kraft Document Overview" msgstr "" #: portalview.cpp:159 portalview.cpp:178 #, kde-format msgid "Available Catalogs" msgstr "" #: portalview.cpp:161 #, kde-format msgid "No catalogs available." msgstr "" #: portalview.cpp:210 #, kde-format msgid "Open" msgstr "" #: portalview.cpp:221 #, kde-format msgid "No templates yet." msgstr "" #: portalview.cpp:225 #, kde-format msgid "%1 templates in %2 chapters
        last modified at %3" msgstr "" #: portalview.cpp:276 #, kde-format msgid "Kraft Website" msgstr "" #: portalview.cpp:279 #, kde-format msgctxt "The string is followed by a link to the GPL2 text" msgid "Kraft is free software licensed under the" msgstr "" #: portalview.cpp:280 #, kde-format msgctxt "The string is followed by the link to github" msgid "Kraft is maintained on " msgstr "" #: portalview.cpp:281 #, kde-format msgid "Authors" msgstr "" #: portalview.cpp:282 #, kde-format msgid "Developer and Maintainer" msgstr "" #: portalview.cpp:283 #, kde-format msgid "Developer" msgstr "" #: portalview.cpp:284 #, kde-format msgctxt "The person who provided the logo graphics" msgid "Logo design" msgstr "" #: portalview.cpp:285 #, kde-format msgctxt "The person who provided the user manual" msgid "User Manual" msgstr "" #: portalview.cpp:287 #, kde-format msgid "" "Kraft helps you to handle documents like quotes and invoices in your small " "business." msgstr "" #: portalview.cpp:288 #, kde-format msgid "Welcome to Kraft" msgstr "" #: portalview.cpp:289 #, kde-format msgid "Kraft version" msgstr "" #: portalview.cpp:291 #, kde-format msgid "Codename" msgstr "" #: portalview.cpp:293 #, kde-format msgid "" "# How do you like Kraft overall?\n" "\n" "# What kind of business do you run?\n" "\n" "# In which country are you working?\n" "\n" "# Are you planning to continue with Kraft?\n" "\n" "# What else do you want to tell us?\n" "\n" msgstr "" #: portalview.cpp:299 #, kde-format msgid "Send Feedback to the Kraft Authors" msgstr "" #: portalview.cpp:307 #, kde-format msgid "Git information" msgstr "" #: portalview.cpp:315 #, kde-format msgid "Country setting" msgstr "" #: portalview.cpp:318 #, kde-format msgid "Language setting" msgstr "" #: portalview.cpp:322 #, kde-format msgid "Kraft Initialisation Problem" msgstr "" #: portalview.cpp:323 #, kde-format msgid "" "There is a initialisation error on your system. Kraft will not work that way." msgstr "" #: portalview.cpp:330 #, kde-format msgid "Database Information" msgstr "" #: portalview.cpp:331 #, kde-format msgid "Kraft database name" msgstr "" #: portalview.cpp:336 #, kde-format msgid "Required Version" msgstr "" #: portalview.cpp:339 #, kde-format msgid "Database schema version" msgstr "" #: portalview.cpp:341 #, kde-format msgid "Qt database driver" msgstr "" #: portalview.cpp:345 #, kde-format msgid "established" msgstr "" #: portalview.cpp:345 #, kde-format msgid "NOT AVAILABLE!" msgstr "" #: portalview.cpp:346 #, kde-format msgid "Database connection" msgstr "" #: portalview.cpp:355 #, kde-format msgid "Database Version" msgstr "" #: portalview.cpp:363 #, kde-format msgid "Addressbook Backend" msgstr "" #: portalview.cpp:364 #, kde-format msgid "Backend type" msgstr "" #: portalview.cpp:366 #, kde-format msgid "running" msgstr "" #: portalview.cpp:366 #, kde-format msgid "not running" msgstr "" #: portalview.cpp:370 #, kde-format msgid "External Tools" msgstr "" #: portalview.cpp:372 #, kde-format msgid "RML to PDF conversion tool" msgstr "" #: portalview.cpp:374 #, kde-format msgid "not found!" msgstr "" #: portalview.cpp:377 #, kde-format msgid "iconv tool for text import" msgstr "" #: portalview.cpp:380 #, kde-format msgid "weasyprint for PDF generation" msgstr "" #: portalview.cpp:384 #, kde-format msgid "not available" msgstr "" #: portalview.cpp:389 #, kde-format msgid "Some Icons are made by" msgstr "" #: portalview.cpp:390 #, kde-format msgid "Acknowledgements" msgstr "" #: positionviewwidget.cpp:90 #, kde-format msgid "Item Actions" msgstr "" #: positionviewwidget.cpp:93 #, kde-format msgid "Item Kind" msgstr "" #: positionviewwidget.cpp:94 positionviewwidget.cpp:687 #, kde-format msgid "Normal" msgstr "" #: positionviewwidget.cpp:96 positionviewwidget.cpp:695 #, kde-format msgid "Alternative" msgstr "" #: positionviewwidget.cpp:98 #, kde-format msgid "On Demand" msgstr "" #: positionviewwidget.cpp:103 rc.cpp:281 #, kde-format msgid "Tax" msgstr "" #: positionviewwidget.cpp:106 #, kde-format msgid "Taxfree Item" msgstr "" #: positionviewwidget.cpp:112 #, kde-format msgid "Reduced Tax" msgstr "" #: positionviewwidget.cpp:118 #, kde-format msgid "Full Tax" msgstr "" #: positionviewwidget.cpp:127 #, kde-format msgid "Move Up" msgstr "" #: positionviewwidget.cpp:129 #, kde-format msgid "Move Down" msgstr "" #: positionviewwidget.cpp:131 #, kde-format msgid "Lock Item" msgstr "" #: positionviewwidget.cpp:133 #, kde-format msgid "Unlock Item" msgstr "" #: positionviewwidget.cpp:135 #, kde-format msgid "Delete Item" msgstr "" #: positionviewwidget.cpp:226 #, kde-format msgid "All items" msgstr "" #: positionviewwidget.cpp:236 #, kde-format msgid "%1-tagged items" msgstr "" #: positionviewwidget.cpp:268 #, kde-format msgid "Tag: %1" msgstr "" #: positionviewwidget.cpp:270 #, kde-format msgid "Tags:
          " msgstr "" #: positionviewwidget.cpp:281 #, kde-format msgid "No tags assigned yet." msgstr "" #: positionviewwidget.cpp:410 #, kde-format msgid "Active" msgstr "" #: positionviewwidget.cpp:412 #, kde-format msgid "New" msgstr "" #: positionviewwidget.cpp:414 #, kde-format msgid "Deleted" msgstr "" #: positionviewwidget.cpp:416 #, kde-format msgid "Locked" msgstr "" #: positionviewwidget.cpp:613 #, kde-format msgid "" "This item is either completely optional or its amount varies depending on " "the needs.

          Use the item toolbox to change the item type." msgstr "" #: positionviewwidget.cpp:619 #, kde-format msgid "" "This is an alternative item.

          Use the position toolbox to change " "the item type." msgstr "" #: positionviewwidget.cpp:691 #, kde-format msgid "Demand" msgstr "" #: prefsdialog.cpp:64 #, kde-format msgid "Configure Kraft" msgstr "" #: prefsdialog.cpp:98 #, kde-format msgid "Document Defaults" msgstr "" #: prefsdialog.cpp:99 #, kde-format msgid "Taxes" msgstr "" #: prefsdialog.cpp:100 #, kde-format msgid "Document Types" msgstr "" #: prefsdialog.cpp:102 #, kde-format msgid "Wages" msgstr "" #: prefsdialog.cpp:104 #, kde-format msgid "Units" msgstr "" #: prefsdialog.cpp:105 #, kde-format msgid "Own Identity" msgstr "" #: prefsdialog.cpp:152 #, kde-format msgid "Tax rates beginning at date:" msgstr "" #: prefsdialog.cpp:160 prefsunits.cpp:53 prefswages.cpp:51 #, kde-format msgid "ID" msgstr "" #: prefsdialog.cpp:161 #, kde-format msgid "Full Tax [%]" msgstr "" #: prefsdialog.cpp:162 #, kde-format msgid "Reduced Tax [%]" msgstr "" #: prefsdialog.cpp:163 #, kde-format msgid "Start Date" msgstr "" #: prefsdialog.cpp:182 prefsunits.cpp:80 prefswages.cpp:90 rc.cpp:323 #, kde-format msgid "Add" msgstr "" #: prefsdialog.cpp:186 prefsunits.cpp:89 prefswages.cpp:99 rc.cpp:335 #, kde-format msgid "Remove" msgstr "" #: prefsdialog.cpp:203 #, kde-format msgid "" "Select the identity of the sending entity of documents. That's your " "companies address." msgstr "" #: prefsdialog.cpp:219 #, kde-format msgid "Select Identity…" msgstr "" #: prefsdialog.cpp:225 #, kde-format msgid "From Address Book" msgstr "" #: prefsdialog.cpp:230 setupassistant.cpp:342 #, kde-format msgid "Manual Entry" msgstr "" #: prefsdialog.cpp:242 #, kde-format msgid "Manual Address" msgstr "" #: prefsdialog.cpp:245 #, kde-format msgid "Bank Account Information" msgstr "" #: prefsdialog.cpp:309 #, kde-format msgid "&Default document type on creation:" msgstr "" #: prefsdialog.cpp:314 #, kde-format msgid "New documents default to the selected type." msgstr "" #: prefsdialog.cpp:323 #, kde-format msgid "Default &Tax for Documents:" msgstr "" #: prefsdialog.cpp:328 #, kde-format msgid "The default tax setting for all documents." msgstr "" #: prefsdialog.cpp:340 #, kde-format msgid "Document Date Format:" msgstr "" #: prefsdialog.cpp:346 #, kde-format msgid "The default date format for documents." msgstr "" #: prefsdialog.cpp:348 #, kde-format msgid "ISO-Format: %1" msgstr "" #: prefsdialog.cpp:350 #, kde-format msgid "Short-Date: %1" msgstr "" #: prefsdialog.cpp:352 #, kde-format msgid "Long-Date: %1" msgstr "" #: prefsdialog.cpp:354 #, kde-format msgid "RFC 2822-Format: %1" msgstr "" #: prefsdialog.cpp:356 #, kde-format msgid "\"German Format\": %1" msgstr "" #: prefsdialog.cpp:357 #, kde-format msgid "Custom Setting in Settingsfile" msgstr "" #: prefsdialog.cpp:366 #, kde-format msgid "Prefix text for Demand items:" msgstr "" #: prefsdialog.cpp:371 #, kde-format msgid "This text is automatically prepended to new 'on demand' items." msgstr "" #: prefsdialog.cpp:375 #, kde-format msgid "Prefix text for Alternative items:" msgstr "" #: prefsdialog.cpp:380 #, kde-format msgid "This text is automatically prepended to new 'alternative' items." msgstr "" #: prefsdialog.cpp:391 #, kde-format msgid "XRechnung template file:" msgstr "" #: prefsdialog.cpp:397 rc.cpp:308 #, kde-format msgid "Select…" msgstr "" #: prefsdialog.cpp:405 #, kde-format msgid "Select template file for XRechnung" msgstr "" #: prefsdialog.cpp:410 #, kde-format msgid "XRechnung Templates (*.xrtmpl)" msgstr "" #: prefsdialog.cpp:450 #, kde-format msgid "" "The old default doc type for new documents was just deleted.Please check the " "setting in the Document Defaults in the Kraft preferences Dialog." msgstr "" #: prefsdialog.cpp:453 #, kde-format msgid "Document Default Change" msgstr "" #: prefsdialog.cpp:701 #, kde-format msgid "The identity cannot be found." msgstr "" #: prefsdialog.cpp:703 #, kde-format msgid "" "

          Kraft Addressbook Integration down.

          The address book backend " "is not up and running.

          Please check your addressbook integration setup." "

          " msgstr "" #: prefsdialog.cpp:709 #, kde-format msgid "The identity is not listed in an address book." msgstr "" #: prefsdialog.cpp:711 #, kde-format msgid "" "

          Kraft does not know your identity.

          Please pick one from the " "address books by clicking on the Button below.

          Not having an identity " "selected can make your documents look incomplete.

          " msgstr "" #: prefsdialog.cpp:728 #, kde-format msgid "Your identity can be found in the address books." msgstr "" #: prefsdialog.cpp:739 #, kde-format msgid "Work Phone" msgstr "" #: prefsdialog.cpp:740 #, kde-format msgid "Fax" msgstr "" #: prefsdialog.cpp:741 #, kde-format msgid "Cell Phone" msgstr "" #: prefsunits.cpp:54 #, kde-format msgid "Short" msgstr "" #: prefsunits.cpp:55 #, kde-format msgid "Long" msgstr "" #: prefsunits.cpp:56 #, kde-format msgid "Short plural" msgstr "" #: prefsunits.cpp:57 #, kde-format msgid "Long plural" msgstr "" #: prefsunits.cpp:58 #, kde-format msgid "ECE20" msgstr "" #: prefsunits.cpp:84 prefswages.cpp:94 rc.cpp:329 #, kde-format msgid "Edit" msgstr "" #: prefsunits.cpp:148 #, kde-format msgid "Edit a unit" msgstr "" #: prefsunits.cpp:192 #, kde-format msgid "

          Edit unit

          " msgstr "" #: prefswages.cpp:52 #, kde-format msgid "Code" msgstr "" #: prefswages.cpp:53 templkataloglistview.cpp:46 rc.cpp:126 #, kde-format msgid "Price" msgstr "" #: prefswages.cpp:54 #, kde-format msgid "Sortkey" msgstr "" #: prefswages.cpp:80 #, kde-format msgid "Up" msgstr "" #: prefswages.cpp:85 #, kde-format msgid "Down" msgstr "" #: prefswages.cpp:201 #, kde-format msgid "Edit a wage group" msgstr "" #: prefswages.cpp:241 #, kde-format msgid "

          Edit wage group

          " msgstr "" #: reportgenerator.cpp:113 #, kde-format msgid "The document generation process is still running." msgstr "" #: reportgenerator.cpp:168 #, kde-format msgid "The temporary file %1 is not accessible." msgstr "" #: reportgenerator.cpp:193 #, kde-format msgid "The template conversion failed." msgstr "" #: reportgenerator.cpp:201 #, kde-format msgid "Saving to temporary file failed." msgstr "" #: reportgenerator.cpp:332 #, kde-format msgid "No converter error." msgstr "" #: reportgenerator.cpp:335 #, kde-format msgid "The ReportLab based converter script cannot be executed." msgstr "" #: reportgenerator.cpp:338 #, kde-format msgid "An unknown error happened." msgstr "" #: reportgenerator.cpp:341 #, kde-format msgid "The ReportLab python module is not installed." msgstr "" #: reportgenerator.cpp:344 #, kde-format msgid "The PyPDF2 python module is not installed." msgstr "" #: reportgenerator.cpp:347 #, kde-format msgid "The source file cannot be read." msgstr "" #: reportgenerator.cpp:350 #, kde-format msgid "The target cannot be opened to write." msgstr "" #: reportgenerator.cpp:353 #, kde-format msgid "The target file does not exist." msgstr "" #: reportgenerator.cpp:356 #, kde-format msgid "The WeasyPrint tool is not installed." msgstr "" #: reportgenerator.cpp:359 #, kde-format msgid "The PDF merger utility failed." msgstr "" #: reportgenerator.cpp:378 #, kde-format msgid "There is not template defined for %1." msgstr "" #: reportgenerator.cpp:379 #, kde-format msgid "Make sure to define a template file in the settings dialog." msgstr "" #: reportgenerator.cpp:384 #, kde-format msgid "The template file %1 for document type %2 is not a file." msgstr "" #: reportgenerator.cpp:385 #, kde-format msgid "Make sure to pick a readable template file in the settings dialog" msgstr "" #: reportgenerator.cpp:389 #, kde-format msgid "The template file %1 for document type %2 can not be read." msgstr "" #: reportgenerator.cpp:390 #, kde-format msgid "Make sure the template file has proper file permissions." msgstr "" #: setupassistant.cpp:36 #, kde-format msgid "Welcome to the Kraft Setup Assistant" msgstr "" #: setupassistant.cpp:55 #, kde-format msgid "Select the Database Backend" msgstr "" #: setupassistant.cpp:92 #, kde-format msgid "Sqlite File Name" msgstr "" #: setupassistant.cpp:146 #, kde-format msgid "MySql Detail Information" msgstr "" #: setupassistant.cpp:188 #, kde-format msgid "Create Database" msgstr "" #: setupassistant.cpp:210 setupassistant.cpp:223 #, kde-format msgid "0/%1" msgstr "" #: setupassistant.cpp:242 setupassistant.cpp:252 setupassistant.cpp:290 #, kde-format msgid "%1/%2" msgstr "" #: setupassistant.cpp:265 #, kde-format msgid "Upgrade the Database" msgstr "" #: setupassistant.cpp:314 #, kde-format msgid "Your Company Address" msgstr "" #: setupassistant.cpp:319 #, kde-format msgid "" "Select your companies address either from the address book or enter it " "manually. It is set as a consigner on the documents." msgstr "" #: setupassistant.cpp:328 #, kde-format msgid "Select from Addressbook" msgstr "" #: setupassistant.cpp:418 #, kde-format msgid "Final Status" msgstr "" #: setupassistant.cpp:512 #, kde-format msgid "" "

          Can't connect to your database. Are you sure your credentials are correct " "and the database exists?

          " msgstr "" #: setupassistant.cpp:523 #, kde-format msgid "

          Can't open your database file, check the permissions and such." msgstr "" #: setupassistant.cpp:532 #, kde-format msgid "" "

          The database is already existing, no action needs to be taken here.

          Please hit next to proceed.

          " msgstr "" #: setupassistant.cpp:581 #, kde-format msgid "

          The database setup was successfully completed.

          " msgstr "" #: setupassistant.cpp:582 #, kde-format msgid "

          You can start to work with Kraft now. Please do not forget to

          " msgstr "" #: setupassistant.cpp:584 #, kde-format msgid "
        • adjust various settings in the Kraft Preferences dialog.
        • " msgstr "" #: setupassistant.cpp:585 #, kde-format msgid "
        • Check the Catalog chapter list.
        • " msgstr "" #: setupassistant.cpp:586 #, kde-format msgid "
        • Make your business and have fun.
        • " msgstr "" #: setupassistant.cpp:588 #, kde-format msgid "" "

          If you press Finish now, the new database configuration is stored " "in Krafts configuration.

          " msgstr "" #: setupassistant.cpp:604 #, kde-format msgid "Database cannot be connected. Please check the database credentials." msgstr "" #: setupassistant.cpp:610 #, kde-format msgid "Database core tables do not exist. Please check the initial setup." msgstr "" #: setupassistant.cpp:617 #, kde-format msgid "Database is up-to-date. No upgrade is required." msgstr "" #: setupassistant.cpp:622 #, kde-format msgid "Parsing update commands…" msgstr "" #: setupassistant.cpp:665 #, kde-format msgid "Upgrade failed!" msgstr "" #: setupassistant.cpp:667 #, kde-format msgid "Upgrade succeeded, the current schema version is %1!" msgstr "" #: setupassistant.cpp:680 #, kde-format msgid "Cannot connect to the database. Please check the database credentials!" msgstr "" #: setupassistant.cpp:686 #, kde-format msgid "Parsing creation commands…" msgstr "" #: setupassistant.cpp:694 #, kde-format msgid "Parsing database fill-up commands…" msgstr "" #: setupassistant.cpp:707 #, kde-format msgid "Processing database creation commands…" msgstr "" #: setupassistant.cpp:724 #, kde-format msgid "Process database fill-up commands…" msgstr "" #: setupassistant.cpp:734 #, kde-format msgid "Commands finished successfully." msgstr "" #: setupassistant.cpp:736 #, kde-format msgid "Failed to perform all commands." msgstr "" #: setupassistant.cpp:780 #, kde-format msgid "" "This assistant guides you through the basic settings of your Kraft " "installation." msgstr "" #: setupassistant.cpp:790 #, kde-format msgid "No database configuration found." msgstr "" #: setupassistant.cpp:792 #, kde-format msgid "A valid current database configuration file was found." msgstr "" #: setupassistant.cpp:814 #, kde-format msgid "The database schema version is too old. It will be updated." msgstr "" #: setupassistant.cpp:817 #, kde-format msgid "The current database schema version is too new. Leaving untouched! " msgstr "" #: setupassistant.cpp:824 #, kde-format msgid "" "

          The database can be opened, but does not contain valid content.

          A " "new database can be created automatically from scratch.

          " msgstr "" #: setupassistant.cpp:831 #, kde-format msgid "

          Kraft failed to connect to the configured database.

          " msgstr "" #: setupassistant.cpp:833 #, kde-format msgid "

          Please check the database server setup and restart Kraft to connect." msgstr "" #: setupassistant.cpp:835 #, kde-format msgid "

          Please check the database file." msgstr "" #: setupassistant.cpp:837 #, kde-format msgid "Or create a new database by pressing Next.

          " msgstr "" #: setupassistant.cpp:845 #, kde-format msgid "

          Please hit Next, and follow the instructions.

          " msgstr "" #: tagtemplatesdialog.cpp:47 #, kde-format msgid "Edit Tag Template" msgstr "" #: tagtemplatesdialog.cpp:54 #, kde-format msgid "Edit a Tag Template" msgstr "" #: tagtemplatesdialog.cpp:55 #, kde-format msgid "Adjust settings for name, color and description." msgstr "" #: tagtemplatesdialog.cpp:58 rc.cpp:446 #, kde-format msgid "Name:" msgstr "" #: tagtemplatesdialog.cpp:63 #, kde-format msgid "Description:" msgstr "" #: tagtemplatesdialog.cpp:69 #, kde-format msgid "Associated color:" msgstr "" #: tagtemplatesdialog.cpp:141 #, kde-format msgid "Add, edit and remove tag templates for use in the documents." msgstr "" #: tagtemplatesdialog.cpp:165 #, kde-format msgid "Add…" msgstr "" #: tagtemplatesdialog.cpp:167 rc.cpp:60 rc.cpp:99 rc.cpp:138 #, kde-format msgid "Edit…" msgstr "" #: tagtemplatesdialog.cpp:170 #, kde-format msgid "Delete…" msgstr "" #: tagtemplatesdialog.cpp:223 #, kde-format msgid "Do you really want to delete the template?" msgstr "" #: taxeditdialog.cpp:36 #, kde-format msgid "Edit Tax Rates" msgstr "" #: templkataloglistview.cpp:45 texteditdialog.cpp:76 rc.cpp:6 #, kde-format msgid "Template" msgstr "" #: templkataloglistview.cpp:47 #, kde-format msgid "Calc. Type" msgstr "" #: templkataloglistview.cpp:54 #, kde-format msgid "Template Catalog" msgstr "" #: templkatalogview.cpp:101 #, kde-format msgid "" msgstr "" #: templtopositiondialogbase.cpp:35 rc.cpp:500 #, kde-format msgid "Create Item from Template" msgstr "" #: templtopositiondialogbase.cpp:51 #, kde-format msgid "the Header of the Document as first item" msgstr "" #: texteditdialog.cpp:42 #, kde-format msgid "Edit Text Templates" msgstr "" #: texteditdialog.cpp:62 #, kde-format msgid "Edit %1 Template" msgstr "" #: textselection.cpp:42 #, kde-format msgid "Template Collection" msgstr "" #: textselection.cpp:100 #, kde-format msgid "Template Actions" msgstr "" #: textselection.cpp:129 #, kde-format msgid "This is the standard text used in new documents." msgstr "" #: textselection.cpp:138 #, kde-format msgid "%1 Templates for %2" msgstr "" #: textselection.cpp:146 #, kde-format msgid "" "There is no %1 template text available for document type %2.
          Click the " "add-button below to create one." msgstr "" #: textselection.cpp:201 #, kde-format msgid "&Use in Document" msgstr "" #: texttemplate.cpp:103 #, kde-format msgid "Failed to open template source" msgstr "" #: texttemplateinterface.cpp:53 #, kde-format msgid "No file name given for template" msgstr "" #: texttemplateinterface.cpp:61 #, kde-format msgid "Could not find template file %1" msgstr "" #: timecalcpart.cpp:82 #, kde-format msgid "Minutes" msgstr "" #: timecalcpart.cpp:84 #, kde-format msgid "Hours" msgstr "" #: timecalcpart.cpp:86 #, kde-format msgid "Seconds" msgstr "" #: rc.cpp:9 #, kde-format msgid "Text:" msgstr "" #: rc.cpp:12 #, kde-format msgid "&Store in Chapter" msgstr "" #: rc.cpp:15 #, kde-format msgid "&Unit" msgstr "" #: rc.cpp:18 #, kde-format msgid "&Count Time for Overalltime" msgstr "" #: rc.cpp:24 #, kde-format msgid "full" msgstr "" #: rc.cpp:27 #, kde-format msgid "half" msgstr "" #: rc.cpp:30 #, kde-format msgid "Time Calculation" msgstr "" #: rc.cpp:33 rc.cpp:72 rc.cpp:111 #, kde-format msgid "text" msgstr "" #: rc.cpp:36 #, kde-format msgid "Time measureable effort for this template:" msgstr "" #: rc.cpp:39 rc.cpp:81 rc.cpp:117 #, kde-format msgid "Label" msgstr "" #: rc.cpp:42 #, kde-format msgid "Duration" msgstr "" #: rc.cpp:45 #, kde-format msgid "Hourly Rate" msgstr "" #: rc.cpp:48 #, kde-format msgid "Glob. Rate" msgstr "" #: rc.cpp:51 #, kde-format msgid "Adds a new time calculation part to the template" msgstr "" #: rc.cpp:54 rc.cpp:93 rc.cpp:132 #, kde-format msgid "New…" msgstr "" #: rc.cpp:57 #, kde-format msgid "Edits the current time calculation part" msgstr "" #: rc.cpp:63 #, kde-format msgid "Deletes the current time calculation part" msgstr "" #: rc.cpp:66 rc.cpp:105 rc.cpp:144 #, kde-format msgid "delete" msgstr "" #: rc.cpp:69 #, kde-format msgid "Fix Costs" msgstr "" #: rc.cpp:75 #, kde-format msgid "Fix costs for this template per one unit:" msgstr "" #: rc.cpp:84 #, kde-format msgid "Single Price" msgstr "" #: rc.cpp:87 #, kde-format msgid "Overall Price" msgstr "" #: rc.cpp:90 #, kde-format msgid "adds a new fix calculation part" msgstr "" #: rc.cpp:96 #, kde-format msgid "edits the current fix calculation part" msgstr "" #: rc.cpp:102 #, kde-format msgid "deletes the current fix calculation part" msgstr "" #: rc.cpp:114 #, kde-format msgid "Needed materials for one unit of this template:" msgstr "" #: rc.cpp:129 #, kde-format msgid "adds a new material calculation part" msgstr "" #: rc.cpp:135 #, kde-format msgid "edits the current material part" msgstr "" #: rc.cpp:141 #, kde-format msgid "deletes the current material calculation part" msgstr "" #: rc.cpp:147 #, kde-format msgid "Overall Price per Unit" msgstr "" #: rc.cpp:150 #, kde-format msgid "&Manual Price" msgstr "" #: rc.cpp:153 #, kde-format msgid "Calculated Price" msgstr "" #: rc.cpp:156 #, kde-format msgid "Fixed costs part:" msgstr "" #: rc.cpp:159 #, kde-format msgid "Material part:" msgstr "" #: rc.cpp:162 #, kde-format msgid "Profit:" msgstr "" #: rc.cpp:166 #, no-c-format, kde-format msgid " %" msgstr "" #: rc.cpp:169 #, kde-format msgid "Time calculation part:" msgstr "" #: rc.cpp:172 #, kde-format msgid "Calculated price:" msgstr "" #: rc.cpp:175 #, kde-format msgid "88.888,88 €" msgstr "" #: rc.cpp:178 #, kde-format msgid "Database creation and initial schema setup:" msgstr "" #: rc.cpp:185 rc.cpp:198 rc.cpp:903 #, kde-format msgid "0 / 129" msgstr "" #: rc.cpp:188 rc.cpp:201 rc.cpp:906 #, kde-format msgid "X" msgstr "" #: rc.cpp:191 #, kde-format msgid "Filling the database with initial values:" msgstr "" #: rc.cpp:204 rc.cpp:909 #, kde-format msgid "Status: " msgstr "" #: rc.cpp:207 #, kde-format msgid "Database setup status…" msgstr "" #: rc.cpp:210 #, kde-format msgid "Bruns data file:" msgstr "" #: rc.cpp:213 #, kde-format msgid "Bruns key file:" msgstr "" #: rc.cpp:216 #, kde-format msgid "Qt database driver:" msgstr "" #: rc.cpp:219 #, kde-format msgid "Database server:" msgstr "" #: rc.cpp:222 #, kde-format msgid "Server port:" msgstr "" #: rc.cpp:225 #, kde-format msgid "Database Name" msgstr "" #: rc.cpp:228 rc.cpp:752 #, kde-format msgid "Database user:" msgstr "" #: rc.cpp:231 #, kde-format msgid "Database password:" msgstr "" #: rc.cpp:234 #, kde-format msgid "The default database name when creating new databases" msgstr "" #: rc.cpp:237 #, kde-format msgid "File Name" msgstr "" #: rc.cpp:240 #, kde-format msgid "The path where database file are stored. Leave empty!" msgstr "" #: rc.cpp:243 #, kde-format msgid "Database update:" msgstr "" #: rc.cpp:246 #, kde-format msgid "Overall progress:" msgstr "" #: rc.cpp:253 #, kde-format msgid "Detailed progress:" msgstr "" #: rc.cpp:260 #, kde-format msgid "Status:" msgstr "" #: rc.cpp:263 #, kde-format msgid "" "

          Kraft uses a database backend to store values. By " "default it uses a file based database with easy setup targeted to single " "user mode.


          " msgstr "" #: rc.cpp:266 #, kde-format msgid "SQLite 3 - file based database (default)" msgstr "" #: rc.cpp:269 #, kde-format msgid "MySQL Serverbased Database for advanced Setups" msgstr "" #: rc.cpp:272 #, kde-format msgid "Footer Texts" msgstr "" #: rc.cpp:275 #, kde-format msgid "&Summary text on last page:" msgstr "" #: rc.cpp:278 #, kde-format msgid "&Greeting:" msgstr "" #: rc.cpp:284 #, kde-format msgid "Document &tax:" msgstr "" #: rc.cpp:287 #, kde-format msgid "TextLabel" msgstr "" #: rc.cpp:290 #, kde-format msgid "&Project:" msgstr "" #: rc.cpp:293 #, kde-format msgid "&Whiteboard:" msgstr "" #: rc.cpp:296 #, kde-format msgid "" "Enter a label that describes the project. This may appear on the customer " "document." msgstr "" #: rc.cpp:299 #, kde-format msgid "Postal &address:" msgstr "" #: rc.cpp:302 #, kde-format msgid "not selected" msgstr "" #: rc.cpp:305 #, kde-format msgid "Select an addressee from the address books." msgstr "" #: rc.cpp:311 #, kde-format msgid "&Salutatory address:" msgstr "" #: rc.cpp:314 #, kde-format msgid "Customer:" msgstr "" #: rc.cpp:317 #, kde-format msgid "&Entry text on first page:" msgstr "" #: rc.cpp:320 rc.cpp:785 #, kde-format msgid "Click to add a new document type to the list." msgstr "" #: rc.cpp:326 #, kde-format msgid "click to edit the selected document type name" msgstr "" #: rc.cpp:332 rc.cpp:791 #, kde-format msgid "click to remove the current document type" msgstr "" #: rc.cpp:338 #, kde-format msgid "Unique Document Number" msgstr "" #: rc.cpp:341 #, kde-format msgid "Number &cycle:" msgstr "" #: rc.cpp:344 rc.cpp:353 rc.cpp:356 rc.cpp:776 #, kde-format msgid "example" msgstr "" #: rc.cpp:347 #, kde-format msgid "Ident template:" msgstr "" #: rc.cpp:350 #, kde-format msgid "Example ID:" msgstr "" #: rc.cpp:359 #, kde-format msgid "Counter:" msgstr "" #: rc.cpp:362 #, kde-format msgid "&Edit Number Cycles…" msgstr "" #: rc.cpp:365 #, kde-format msgid "Document Type Options" msgstr "" #: rc.cpp:368 #, kde-format msgid "Enable XRechung Support " msgstr "" #: rc.cpp:371 #, kde-format msgid "PDF Creation and Postprocessing" msgstr "" #: rc.cpp:374 #, kde-format msgid "&Template file:" msgstr "" #: rc.cpp:377 rc.cpp:401 rc.cpp:407 #, kde-format msgid "select" msgstr "" #: rc.cpp:380 #, kde-format msgid "W&atermark:" msgstr "" #: rc.cpp:383 #, kde-format msgid "no watermark" msgstr "" #: rc.cpp:386 #, kde-format msgid "on first page" msgstr "" #: rc.cpp:389 #, kde-format msgid "on all pages" msgstr "" #: rc.cpp:392 #, kde-format msgid "alternating (3 pages)" msgstr "" #: rc.cpp:395 #, kde-format msgid "different first and last page (3 pages)" msgstr "" #: rc.cpp:398 #, kde-format msgid "Watermark fi&le:" msgstr "" #: rc.cpp:404 #, kde-format msgid "Append &PDF:" msgstr "" #: rc.cpp:410 #, kde-format msgid "Calculation Parts Fix" msgstr "" #: rc.cpp:413 #, kde-format msgid "

          Fix Cost Parts

          " msgstr "" #: rc.cpp:416 #, kde-format msgid "Add a fix cost for one unit of the template:" msgstr "" #: rc.cpp:419 rc.cpp:860 #, kde-format msgid "&Label:" msgstr "" #: rc.cpp:422 #, kde-format msgid "describing text" msgstr "" #: rc.cpp:425 #, kde-format msgid "amortisation" msgstr "" #: rc.cpp:428 rc.cpp:732 #, kde-format msgid "&Amount:" msgstr "" #: rc.cpp:431 #, kde-format msgid "amount multiplier" msgstr "" #: rc.cpp:434 #, kde-format msgid "at &Price:" msgstr "" #: rc.cpp:437 rc.cpp:735 #, kde-format msgid "Price for one piece" msgstr "" #: rc.cpp:440 #, kde-format msgid "€" msgstr "" #: rc.cpp:443 #, kde-format msgid "Form" msgstr "" #: rc.cpp:449 #, kde-format msgid "Organization:" msgstr "" #: rc.cpp:452 #, kde-format msgid "Street:" msgstr "" #: rc.cpp:455 #, kde-format msgid "Post code:" msgstr "" #: rc.cpp:458 #, kde-format msgid "City:" msgstr "" #: rc.cpp:461 #, kde-format msgid "Phone:" msgstr "" #: rc.cpp:464 #, kde-format msgid "Fax:" msgstr "" #: rc.cpp:467 #, kde-format msgid "Mobile phone:" msgstr "" #: rc.cpp:470 #, kde-format msgid "Email:" msgstr "" #: rc.cpp:473 #, kde-format msgid "Website:" msgstr "" #: rc.cpp:476 #, kde-format msgid "Import Document Items" msgstr "" #: rc.cpp:479 #, kde-format msgid "Import information" msgstr "" #: rc.cpp:482 #, kde-format msgid "Select a &File to import from:" msgstr "" #: rc.cpp:485 #, kde-format msgid "FixMe!" msgstr "" #: rc.cpp:488 #, kde-format msgid "Import &Schema:" msgstr "" #: rc.cpp:491 #, kde-format msgid "this is interesting information about the selected schema" msgstr "" #: rc.cpp:494 #, kde-format msgid "Insert all Items &after" msgstr "" #: rc.cpp:497 rc.cpp:521 #, kde-format msgid "Tags" msgstr "" #: rc.cpp:503 #, kde-format msgid "New Item Text" msgstr "" #: rc.cpp:506 #, kde-format msgid "&insert" msgstr "" #: rc.cpp:509 #, kde-format msgid "à" msgstr "" #: rc.cpp:512 #, kde-format msgid "&after item" msgstr "" #: rc.cpp:515 #, kde-format msgid "Keep this item as template for future documents" msgstr "" #: rc.cpp:518 #, kde-format msgid "save in &chapter" msgstr "" #: rc.cpp:530 #, kde-format msgid "Do Database Initialisation" msgstr "" #: rc.cpp:533 #, kde-format msgid "Do XML archiving of documents they're printed?" msgstr "" #: rc.cpp:536 #, kde-format msgid "" "Where Kraft stores the XML archive documents. If empty, KDEHOME/share/apps " "is used." msgstr "" #: rc.cpp:539 #, kde-format msgid "The local xml document storage path" msgstr "" #: rc.cpp:542 #, kde-format msgid "Default mail user agent. Set xdg for xdg-email" msgstr "" #: rc.cpp:545 rc.cpp:548 #, kde-format msgid "The default geometry of the document view dialog" msgstr "" #: rc.cpp:551 #, kde-format msgid "The current state of the portal" msgstr "" #: rc.cpp:554 #, kde-format msgid "The current geometry of the portal" msgstr "" #: rc.cpp:557 #, kde-format msgid "The current geometry of the new doc assistant" msgstr "" #: rc.cpp:560 #, kde-format msgid "The splitter position of the document view dialog" msgstr "" #: rc.cpp:563 #, kde-format msgid "The default size of the material catalog view" msgstr "" #: rc.cpp:566 #, kde-format msgid "The splitter setting for the doc assistant" msgstr "" #: rc.cpp:569 #, kde-format msgid "The window size of the template to document dialog for plants" msgstr "" #: rc.cpp:572 #, kde-format msgid "The window size of the template to document dialog" msgstr "" #: rc.cpp:575 #, kde-format msgid "The digest list column arrangement for the Latest-list" msgstr "" #: rc.cpp:578 #, kde-format msgid "The digest list column arrangement for the all-list" msgstr "" #: rc.cpp:581 #, kde-format msgid "The digest list column arrangement for timeline" msgstr "" #: rc.cpp:584 #, kde-format msgid "The sizes of the slider in the address picker Widget" msgstr "" #: rc.cpp:587 #, kde-format msgid "The state of the treeview inside the address selector widget" msgstr "" #: rc.cpp:590 #, kde-format msgid "Size of the address select dialog" msgstr "" #: rc.cpp:593 #, kde-format msgid "State of the window of the material catalog" msgstr "" #: rc.cpp:596 #, kde-format msgid "Geometry of the material catalog" msgstr "" #: rc.cpp:599 #, kde-format msgid "State of the header of the material catalog" msgstr "" #: rc.cpp:602 #, kde-format msgid "State of the window of the template catalog" msgstr "" #: rc.cpp:605 #, kde-format msgid "Geometry the template catalog" msgstr "" #: rc.cpp:608 #, kde-format msgid "State of the header of the template catalog" msgstr "" #: rc.cpp:611 #, kde-format msgid "" "Default percentage the sale price for a material should be higher than its " "purchase price" msgstr "" #: rc.cpp:614 #, kde-format msgid "The name of the last selected chapter in the catalog" msgstr "" #: rc.cpp:617 #, kde-format msgid "The complete filename of the trml2pdf binary" msgstr "" #: rc.cpp:620 #, kde-format msgid "The path to the output directory for document pdfs" msgstr "" #: rc.cpp:623 #, kde-format msgid "The last created doc type." msgstr "" #: rc.cpp:626 #, kde-format msgid "The date format for print." msgstr "" #: rc.cpp:629 #, kde-format msgid "The greeting below on the document footer." msgstr "" #: rc.cpp:632 #, kde-format msgid "The salut message on the document header." msgstr "" #: rc.cpp:635 #, kde-format msgid "" "The name of the catalog chapter where to store new templates in by default" msgstr "" #: rc.cpp:638 #, kde-format msgid "The name of the last used import schema for items." msgstr "" #: rc.cpp:641 #, kde-format msgid "The name of the last used input file for items." msgstr "" #: rc.cpp:644 #, kde-format msgid "" "User name as reference to the KAddressbook to identify 'my' address " "(DEPRECATED)." msgstr "" #: rc.cpp:647 #, kde-format msgid "" "UID of the user as reference to the KAddressbook to identify 'my' address." msgstr "" #: rc.cpp:650 #, kde-format msgid "Bank account name." msgstr "" #: rc.cpp:653 #, kde-format msgid "Business Identifier Code\" (BIC) of the bank." msgstr "" #: rc.cpp:656 #, kde-format msgid "IBAN of the bank account." msgstr "" #: rc.cpp:659 #, kde-format msgid "The doc id template" msgstr "" #: rc.cpp:662 #, kde-format msgid "Localization on document level" msgstr "" #: rc.cpp:665 #, kde-format msgid "The tax default for new documents." msgstr "" #: rc.cpp:668 #, kde-format msgid "The label for alternative positions" msgstr "" #: rc.cpp:671 rc.cpp:674 #, kde-format msgid "The label for demand positions" msgstr "" #: rc.cpp:677 #, kde-format msgid "Display the EPC Code as long as the doc sum is below this value." msgstr "" #: rc.cpp:683 #, kde-format msgid "Settings" msgstr "" #: rc.cpp:689 #, kde-format msgid "Edit Material" msgstr "" #: rc.cpp:692 #, kde-format msgid "Store in C&hapter" msgstr "" #: rc.cpp:698 #, kde-format msgid "Pac&kaged:" msgstr "" #: rc.cpp:701 #, kde-format msgid "per P&ackage" msgstr "" #: rc.cpp:704 #, kde-format msgid "Prices" msgstr "" #: rc.cpp:707 #, kde-format msgid "= Price of &sale:" msgstr "" #: rc.cpp:710 #, kde-format msgid "pl&us" msgstr "" #: rc.cpp:714 rc.cpp:807 #, no-c-format, kde-format msgid "%" msgstr "" #: rc.cpp:717 #, kde-format msgid "&Purchase price:" msgstr "" #: rc.cpp:720 #, kde-format msgid "Calculation Item Material" msgstr "" #: rc.cpp:723 #, kde-format msgid "

          Calculation Part 'Material'

          " msgstr "" #: rc.cpp:726 #, kde-format msgid "Add Material to the template calculation." msgstr "" #: rc.cpp:729 #, kde-format msgid "material" msgstr "" #: rc.cpp:738 #, kde-format msgid "unit" msgstr "" #: rc.cpp:741 #, kde-format msgid "" "Please enter the MySQL Database server settings. \n" "\n" "For detailed setup instructions for the MySQL to use with Kraft please check " "the Kraft website." msgstr "" #: rc.cpp:746 #, kde-format msgid "Database host:" msgstr "" #: rc.cpp:749 #, kde-format msgid "Database name:" msgstr "" #: rc.cpp:755 #, kde-format msgid "Password:" msgstr "" #: rc.cpp:758 #, kde-format msgid "

          Edit Number Cycles

          " msgstr "" #: rc.cpp:761 #, kde-format msgid "Number Cycle Details" msgstr "" #: rc.cpp:764 #, kde-format msgid "&Number cycle:" msgstr "" #: rc.cpp:767 #, kde-format msgid "&Counter:" msgstr "" #: rc.cpp:770 #, kde-format msgid "Example Id:" msgstr "" #: rc.cpp:773 #, kde-format msgid "ident &Template:" msgstr "" #: rc.cpp:779 #, kde-format msgid "&Select a number cycle and edit the details on the right:" msgstr "" #: rc.cpp:782 #, kde-format msgid "New Item" msgstr "" #: rc.cpp:788 #, kde-format msgid "add" msgstr "" #: rc.cpp:794 #, kde-format msgid "remove" msgstr "" #: rc.cpp:797 #, kde-format msgid "1." msgstr "" #: rc.cpp:800 rc.cpp:803 #, kde-format msgid "D" msgstr "" #: rc.cpp:810 #, kde-format msgid "of the sum of" msgstr "" #: rc.cpp:813 #, kde-format msgid "" "Please enter the settings for the SQLite database.\n" "\n" "Pick a filename to name the SQLite database file or leave the default " "setting." msgstr "" #: rc.cpp:818 #, kde-format msgid "store the database file at default place." msgstr "" #: rc.cpp:821 #, kde-format msgid "select a file name:" msgstr "" #: rc.cpp:824 #, kde-format msgid "

          Add a Tax Rate

          " msgstr "" #: rc.cpp:827 #, kde-format msgid "Start-Date:" msgstr "" #: rc.cpp:830 #, kde-format msgid "&Reduced tax rate:" msgstr "" #: rc.cpp:833 #, kde-format msgid "&Full Tax Rate:" msgstr "" #: rc.cpp:836 #, kde-format msgid "Edit Document Text Template" msgstr "" #: rc.cpp:839 #, kde-format msgid "&Name:" msgstr "" #: rc.cpp:842 #, kde-format msgid "displayed as" msgstr "" #: rc.cpp:845 #, kde-format msgid "in doc type" msgstr "" #: rc.cpp:848 #, kde-format msgid "&Text:" msgstr "" #: rc.cpp:851 #, kde-format msgid "Calculation Item Time" msgstr "" #: rc.cpp:854 #, kde-format msgid "

          Calculation Part 'Time'

          " msgstr "" #: rc.cpp:857 #, kde-format msgid "" "Calculate time efforts here for one unit of the template.
          Note that the " "costs may depend on a global hourly rate." msgstr "" #: rc.cpp:863 #, kde-format msgid "Work" msgstr "" #: rc.cpp:866 #, kde-format msgid "&Time effort:" msgstr "" #: rc.cpp:869 #, kde-format msgid "&Hourly rate:" msgstr "" #: rc.cpp:872 #, kde-format msgid "Apply the &global hourly rate" msgstr "" #: rc.cpp:875 #, kde-format msgid "

          Add a unit

          " msgstr "" #: rc.cpp:878 #, kde-format msgid "Unit short" msgstr "" #: rc.cpp:881 #, kde-format msgid "Unit long" msgstr "" #: rc.cpp:884 #, kde-format msgid "Unit plural short" msgstr "" #: rc.cpp:887 #, kde-format msgid "Unit plural long" msgstr "" #: rc.cpp:890 #, kde-format msgid "Unit ECE20" msgstr "" #: rc.cpp:893 #, kde-format msgid "" "This step checks if the database schema version is sufficient for this " "version of Kraft. \n" "\n" "In case it is not, the schema is updated automatically.\n" msgstr "" #: rc.cpp:912 #, kde-format msgid "Upgrade not yet started" msgstr "" #: rc.cpp:915 #, kde-format msgid "

          Add a Wage group

          " msgstr "" #: rc.cpp:918 #, kde-format msgid "Group name" msgstr "" #: rc.cpp:921 #, kde-format msgid "Wage" msgstr "" #: rc.cpp:924 #, kde-format msgid "Dialog" msgstr "" #: rc.cpp:927 #, kde-format msgid "" "

          XRechnung Additional Data

          " msgstr "" #: rc.cpp:930 #, kde-format msgid "Due date:" msgstr "" #: rc.cpp:933 #, kde-format msgid "Buyer reference:" msgstr "" kraft-1.2.2/po/nl/000077500000000000000000000000001467704360200136635ustar00rootroot00000000000000kraft-1.2.2/po/nl/kraft.po000066400000000000000000003021041467704360200153320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Ronald Stroethoff , 2023 # Klaas Freitag , 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-04 22:35+0200\n" "PO-Revision-Date: 2018-10-31 21:56+0000\n" "Last-Translator: Klaas Freitag , 2024\n" "Language-Team: Dutch (Netherlands) (https://app.transifex.com/kraftproject/teams/93132/nl_NL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl_NL\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: addeditchapterdialog.cpp:35 #, kde-format msgid "Add/Edit Catalog Chapter" msgstr "Map in catalogus toevoegen/bewerken" #: addeditchapterdialog.cpp:41 #, kde-format msgid "Create a new Catalog Chapter" msgstr "Nieuwe map in de catalogus aanmaken" #: addeditchapterdialog.cpp:45 #, kde-format msgid "Chapter name:" msgstr "Map-naam:" #: addeditchapterdialog.cpp:49 #, kde-format msgid "Chapter description:" msgstr "Omschrijving van map:" #: addeditchapterdialog.cpp:76 #, kde-format msgid "Create new Catalog Chapter below chapter %1" msgstr "Een nieuwe catalogus-map in map %1 aanmaken" #: addeditchapterdialog.cpp:83 #, kde-format msgid "Edit name and description of chapter %1" msgstr "Naam en beschrijving van map %1 bewerken" #: addressselectorwidget.cpp:219 #, kde-format msgid "Name" msgstr "Naam" #: addressselectorwidget.cpp:221 #, kde-format msgid "Address" msgstr "Adres" #: addressselectorwidget.cpp:288 filterheader.cpp:40 #, kde-format msgid "&Search:" msgstr "&Zoeken:" #: addressselectorwidget.cpp:325 #, kde-format msgid "Edit Contact…" msgstr "Contactpersoon bewerken…" #: addressselectorwidget.cpp:326 #, kde-format msgid "Edit the currently selected contact" msgstr "Deze contactpersoon bewerken" #: addressselectorwidget.cpp:329 #, kde-format msgid "New Contact…" msgstr "Nieuw contactpersoon…" #: addressselectorwidget.cpp:330 #, kde-format msgid "Create a new Contact" msgstr "Nieuw contactpersoon aanmaken" #: alldocsview.cpp:64 #, kde-format msgid "All documents" msgstr "Alle documenten" #: alldocsview.cpp:65 #, kde-format msgid "Documents of last week" msgstr "Documenten van laatste week" #: alldocsview.cpp:66 #, kde-format msgid "Documents of last month" msgstr "Documenten van laatste maand" #: alldocsview.cpp:72 #, kde-format msgid "&Show: " msgstr "T&onen: " #: alldocsview.cpp:79 #, kde-format msgid "&Search: " msgstr "&Zoeken: " #: alldocsview.cpp:134 portal.cpp:303 portal.cpp:304 rc.cpp:686 #, kde-format msgid "Document Actions" msgstr "Document acties" #: archdoc.cpp:65 #, kde-format msgid "%1 for %2 (ID %3)" msgstr "%1 voor %2 (ID %3)" #: calcpart.cpp:98 #, kde-format msgid "Base" msgstr "Basis" #: catalogselection.cpp:50 #, kde-format msgid "Selected &catalog: " msgstr "Geselecteerde &Catalogus: " #: catalogselection.cpp:159 #, kde-format msgid "Append to Document" msgstr "Achter document voegen" #: catalogtemplate.cpp:52 #, kde-format msgid "Manual Price" msgstr "Handmatige prijs" #: catalogtemplate.cpp:54 #, kde-format msgid "Calculated" msgstr "Berekend" #: catalogtemplate.cpp:56 #, kde-format msgid "AutoCalc" msgstr "AutoCalc" #: catalogtemplate.cpp:57 #, kde-format msgid "Err: Unknown type %d" msgstr "Fout: onbekend type %d" #: defaultprovider.cpp:63 doctext.cpp:80 positionviewwidget.cpp:418 #, kde-format msgid "Unknown" msgstr "Onbekend" #: docassistant.cpp:52 #, kde-format msgid "Show &Templates" msgstr "Sjablonen tonen" #: docassistant.cpp:57 #, kde-format msgid "Show mask to create or select templates to be used in the document" msgstr "" "Filter tonen voor het creëren of selecteren van in dit document gebruikte \n" "sjablonen" #: docassistant.cpp:121 #, kde-format msgid "Add a template to the document" msgstr "Voeg een sjabloon toe aan het document" #: docassistant.cpp:128 #, kde-format msgid "Insert the template to the document" msgstr "Vervang tekst in document door sjabloon" #: docassistant.cpp:136 #, kde-format msgid "Create a new template" msgstr "Nieuw sjabloon aanmaken" #: docassistant.cpp:143 #, kde-format msgid "Edit the current template" msgstr "Dit sjabloon bewerken" #: docassistant.cpp:150 #, kde-format msgid "Delete the current template" msgstr "Dit sjabloon verwijderen" #: docassistant.cpp:319 #, kde-format msgid "" "Do you really want to delete the template permanently?\n" "It cannot be recovered." msgstr "" "Wilt u het sjabloon permanent verwijderen? Er is geen methode om het " "sjabloon terug te halen!" #: docdigestdetailview.cpp:229 rc.cpp:78 rc.cpp:120 #, kde-format msgid "Amount" msgstr "Bedrag" #: docdigestdetailview.cpp:230 #, kde-format msgid "Type" msgstr "Type" #: docdigestdetailview.cpp:231 #, kde-format msgid "Sum" msgstr "Totaal" #: docdigestdetailview.cpp:260 #, kde-format msgid "Results in %1 %2" msgstr "Resultaten in %1 %2" #: docdigestdetailview.cpp:261 docdigestdetailview.cpp:294 #, kde-format msgid "Year" msgstr "Jaar" #: docdigestdetailview.cpp:263 #, kde-format msgid "Month" msgstr "Maand" #: docdigestdetailview.cpp:296 #, kde-format msgid "Results in Year %1" msgstr "Resultaten in jaar %1" #: docdigestdetailview.cpp:315 docdigestdetailview.cpp:324 #, kde-format msgid "Customer" msgstr "Klant" #: docdigestdetailview.cpp:319 #, kde-format msgid "not set" msgstr "niet ingesteld" #: docdigestdetailview.cpp:335 #, kde-format msgid "The address is not listed in an address book." msgstr "Het adres komt niet voor in de adresboeken." #: docdigestdetailview.cpp:337 #, kde-format msgid "" "The client has the address book id %1 but cannot found in our address books." msgstr "" "De klant heeft het adresboek-ID %1 maar kan niet gevonden worden in onze " "adresboeken." #: docdigestdetailview.cpp:340 #, kde-format msgid "The client can be found in our address books." msgstr "De klant is gevonden in onze adresboeken." #: docdigestdetailview.cpp:351 prefsdialog.cpp:744 #, kde-format msgid "preferred address" msgstr "Voorkeur-adres" #: docdigestdetailview.cpp:355 prefsdialog.cpp:748 #, kde-format msgid "home address" msgstr "Privé-adres" #: docdigestdetailview.cpp:359 prefsdialog.cpp:752 #, kde-format msgid "work address" msgstr "Werk-adres" #: docdigestdetailview.cpp:363 prefsdialog.cpp:756 #, kde-format msgid "postal address" msgstr "Post-adres" #: docdigestdetailview.cpp:367 prefsdialog.cpp:760 #, kde-format msgid "international address" msgstr "internationaal adres" #: docdigestdetailview.cpp:371 prefsdialog.cpp:764 #, kde-format msgid "domestic address" msgstr "Adres in eigen land" #: docdigestdetailview.cpp:375 prefsdialog.cpp:768 #, kde-format msgid "unknown" msgstr "onbekend" #: docdigestdetailview.cpp:412 models/docbasemodel.cpp:32 #, kde-format msgid "Date" msgstr "Datum" #: docdigestdetailview.cpp:417 models/docbasemodel.cpp:35 #, kde-format msgid "Whiteboard" msgstr "Whiteboard" #: docdigestdetailview.cpp:422 models/docbasemodel.cpp:39 #, kde-format msgid "Project" msgstr "Project" #: docdigestdetailview.cpp:432 #, kde-format msgid "This document was never printed." msgstr "Dit document is nog nooit afgedrukt." #: docdigestdetailview.cpp:439 #, kde-format msgid "Last printed" msgstr "Laatst afgedrukt" #: docdigestdetailview.cpp:440 #, kde-format msgid "Opens last created PDF document" msgstr "Opent het laatst gemaakte PDF document" #: docdigestdetailview.cpp:441 #, kde-format msgid "open" msgstr "Openen" #: docdigestdetailview.cpp:446 #, kde-format msgid "One older print" msgstr "Een oudere afdruk" #: docdigestdetailview.cpp:448 #, kde-format msgid "%1 older prints" msgstr "%1 oudere afdrukken" #: docdigestdetailview.cpp:452 #, kde-format msgid "Archived documents cannot be found. Check PDF Output dir." msgstr "" "De documenten zijn niet in het archief te vinden. Controleer de PDF uitvoer " "map." #: docdigestdetailview.cpp:457 #, kde-format msgid "Export the invoice in XRechnung file format" msgstr "Exporteert de rekening in het XRechnung bestandsformaat" #: docdigestdetailview.cpp:458 #, kde-format msgid "XRechnung" msgstr "XRechnung" #: docpostcard.cpp:33 #, kde-format msgid "Document Overview" msgstr "Overzicht documenten" #: docpostcard.cpp:125 #, kde-format msgid "Netto:" msgstr "Netto:" #: docpostcard.cpp:136 docpostcard.cpp:143 #, kde-format msgid "+ %1% Tax:" msgstr "+ %1% belasting:" #: docpostcard.cpp:149 #, kde-format msgid "Sum Tax:" msgstr "Totaal belasting:" #: docpostcard.cpp:154 #, kde-format msgid "Total:" msgstr "Totaal:" #: docpostcard.cpp:246 #, kde-format msgid "%1 Items" msgstr "%1 items" #: docpostcard.cpp:248 #, kde-format msgid "%1 Items, netto %2" msgstr "%1 Items, netto %2" #: doctext.cpp:61 #, kde-format msgid "Standard" msgstr "Standaard" #: doctext.cpp:76 #, kde-format msgid "Header Text" msgstr "Tekst in briefhoofd" #: doctext.cpp:77 #, kde-format msgid "Footer Text" msgstr "Voettekst" #: doctext.cpp:78 #, kde-format msgid "Items" msgstr "Items" #: doctypeedit.cpp:49 #, kde-format msgid "" msgstr "" #: doctypeedit.cpp:50 #, kde-format msgid "
          " msgstr "
          " #: doctypeedit.cpp:85 #, kde-format msgid "Select template file from harddisk" msgstr "Selecteer het sjabloonbestand op harde schijf" #: doctypeedit.cpp:86 #, kde-format msgid "Select watermark file from harddisk" msgstr "Selecteer het watermerk-bestand op harde schijf" #: doctypeedit.cpp:87 #, kde-format msgid "Select PDF file to append to documents from harddisk" msgstr "Selecteer PDF-bestand op harde schijf om bij te sluiten" #: doctypeedit.cpp:91 prefsdialog.cpp:409 #, kde-format msgid "Find Template File" msgstr "Zoek sjabloonbestand" #: doctypeedit.cpp:92 #, kde-format msgid "Kraft Templates (*.trml *.gtmpl)" msgstr "Kraft sjablonen (*.trml *.gtmpl)" #: doctypeedit.cpp:100 #, kde-format msgid "Find Watermark File" msgstr "Zoek watermerk-bestand" #: doctypeedit.cpp:101 doctypeedit.cpp:111 #, kde-format msgid "PDF file (*.pdf)" msgstr "PDF bestand (*.pdf)" #: doctypeedit.cpp:110 #, kde-format msgid "Find Append PDF File" msgstr "Zoek PDF-bestand om bij te sluiten" #: doctypeedit.cpp:176 doctypeedit.cpp:214 #, kde-format msgid "Add Document Type" msgstr "Documenttype toevoegen" #: doctypeedit.cpp:177 #, kde-format msgid "Enter the name of a new document type" msgstr "Voer de naam in van een nieuw documenttype" #: doctypeedit.cpp:215 #, kde-format msgid "Edit the name of a document type" msgstr "Bewerk de naam van een documenttype" #: documentman.cpp:93 #, kde-format msgctxt "" "Text to be inserted into a doc, if the sum of another doc needs to be " "substracted ie. in a final invoice if there was a partial invoice before%1 " "is substited by the doc type, %2 by the id of the predecessor doc." msgid "Substract sum from %1 %2" msgstr "Bedrag te verminderen op %1 %2" #: documenttemplate.cpp:113 #, kde-format msgctxt "Sequence number printed on the document" msgid "No." msgstr "Nr." #: documenttemplate.cpp:114 #, kde-format msgctxt "Document item printed on the document" msgid "Item" msgstr "Item" #: documenttemplate.cpp:115 #, kde-format msgctxt "Abbrev. of Quantity printed on the document" msgid "Qty." msgstr "Aantal" #: documenttemplate.cpp:116 #, kde-format msgctxt "Unit printed on the document" msgid "Unit" msgstr "Eenheid" #: documenttemplate.cpp:117 #, kde-format msgctxt "Price of an item printed on the document" msgid "Price" msgstr "Prijs" #: documenttemplate.cpp:118 #, kde-format msgctxt "Printed on the document" msgid "Sum" msgstr "Totaal" #: documenttemplate.cpp:119 #, kde-format msgctxt "printed on the document" msgid "Net" msgstr "Netto" #: documenttemplate.cpp:120 #, kde-format msgctxt "Printed on the document" msgid "VAT" msgstr "BTW" #: documenttemplate.cpp:121 #, kde-format msgctxt "Document type, printed on the document" msgid "Type" msgstr "Type" #: documenttemplate.cpp:123 #, kde-format msgctxt "Printed on the document" msgid "Phone" msgstr "Tel." #: documenttemplate.cpp:124 #, kde-format msgctxt "Printed on the document" msgid "Fax" msgstr "Fax" #: documenttemplate.cpp:125 #, kde-format msgctxt "Printed on the document" msgid "Mobile" msgstr "GSM" #: documenttemplate.cpp:126 #, kde-format msgctxt "Printed on the document" msgid "Email" msgstr "Email" #: documenttemplate.cpp:127 #, kde-format msgctxt "Printed on the document" msgid "Website" msgstr "Website" #: documenttemplate.cpp:129 #, kde-format msgctxt "Printed on the document" msgid "Page" msgstr "Pagina" #: documenttemplate.cpp:130 #, kde-format msgctxt "Label of Predecessor document number" msgid "Predecessor-Doc" msgstr "Predecessor-Doc" #: documenttemplate.cpp:131 #, kde-format msgctxt "the 'of' in page X of Y" msgid "of" msgstr "van" #: documenttemplate.cpp:132 #, kde-format msgctxt "Document number on document" msgid "Document No." msgstr "Document Nr." #: documenttemplate.cpp:133 #, kde-format msgctxt "Date on document" msgid "Date" msgstr "Datum" #: documenttemplate.cpp:134 #, kde-format msgctxt "Project label" msgid "Project" msgstr "Project" #: documenttemplate.cpp:135 #, kde-format msgctxt "Customer ID on document" msgid "Customer ID" msgstr "Klant nummer" #: documenttemplate.cpp:200 #, kde-format msgctxt "" "Credit Transfer reason string, 1=DocType, 2=DocIdent, 3=Date, ie. Invoice " "2022-183 dated 2022-03-22" msgid "%1 %2 dated %3" msgstr "%1 %2 gedateerd %3" #: documenttemplate.cpp:321 #, kde-format msgid "" "Please note: This offer contains %1 alternative or demand positions, printed" " in italic font. These do not add to the overall sum." msgstr "" "Opmerking: in deze offerte komen %1 alternatieven of meerwerk-posten voor, " "deze zijn cursief gedrukt. Deze zijn niet bij het totaal bedrag opgeteld." #: documenttemplate.cpp:332 #, kde-format msgid "tax free items (%1 pcs.)" msgstr "belastingvrije items (%1 stuks.)" #: documenttemplate.cpp:338 #, kde-format msgid "items with reduced tax of %1% (%2 pcs.)" msgstr "items met het lage BTW van %1% (%2 stuks.)" #: documenttemplate.cpp:347 #, kde-format msgid "No label: items with full tax of %1% (%2 pcs.)" msgstr "Geen label: items met de hoge BTW van %1% (%2 stuks.)" #: documenttemplate.cpp:377 kraftview_ro.cpp:225 #, kde-format msgid "reduced VAT" msgstr "Laag BTW" #: documenttemplate.cpp:385 kraftview_ro.cpp:197 kraftview_ro.cpp:234 #: rc.cpp:21 #, kde-format msgid "VAT" msgstr "BTW" #: documenttemplate.cpp:439 #, kde-format msgid "Template to convert is not existing!" msgstr "Het te converteren sjabloon bestaat niet!" #: documenttemplate.cpp:442 #, kde-format msgid "Can not read template file!" msgstr "Kan het sjabloon niet openen!" #: fixcalcdialog.cpp:36 #, kde-format msgid "Calculation Fix Item" msgstr "Vaste kosten berekenen" #: flostempldialog.cpp:71 #, kde-format msgid "Create or Edit Template Items" msgstr "Wijzig of maak sjablonen aan" #: flostempldialog.cpp:213 flostempldialog.cpp:604 #, kde-format msgid "No" msgstr "Nee" #: flostempldialog.cpp:214 flostempldialog.cpp:604 #, kde-format msgid "Yes" msgstr "Ja" #: flostempldialog.cpp:251 #, kde-format msgid "Calculated price: " msgstr "Berekende prijs: " #: flostempldialog.cpp:255 #, kde-format msgid "Manual price: " msgstr "Handmatige prijs: " #: flostempldialog.cpp:260 #, kde-format msgid "(+%1%)" msgstr "(+%1%)" #: flostempldialog.cpp:264 #, kde-format msgid "%1%" msgstr "%1%" #: flostempldialog.cpp:266 #, kde-format msgid ": " msgstr ": " #: flostempldialog.cpp:388 #, kde-format msgid "Template Error" msgstr "Fout in sjabloon" #: flostempldialog.cpp:388 #, kde-format msgid "Saving of this template failed, sorry" msgstr "Opslaan van dit sjabloon is mislukt." #: flostempldialog.cpp:416 #, kde-format msgid "The template has been modified." msgstr "Sjabloon is gewijzigd" #: flostempldialog.cpp:417 #, kde-format msgid "Do you want to discard your changes?" msgstr "Wilt u echt uw wijzigingen annuleren?" #: flostempldialog.cpp:446 #, kde-format msgid "" "The catalog chapter was changed for this template.\n" "Do you really want to move the template to the new chapter?" msgstr "" "Voor deze sjabloon is de map in de catalogus gewijzigd.\n" "Wilt u de sjabloon naar de nieuwe map verplaatsen?" #: flostempldialog.cpp:448 #, kde-format msgid "Chapter Change" msgstr "Gewijzigde map" #: flostempldialog.h:104 #, kde-format msgid "Calculated material" msgstr "Berekende materialen" #: importfilter.cpp:50 #, kde-format msgid "Unable to find filter called %1" msgstr "Kon filter genaamd %1 niet vinden" #: importfilter.cpp:58 #, kde-format msgid "Could not open the definition file!" msgstr "Kon het definitiebestand niet openen!" #: importfilter.cpp:143 #, kde-format msgid "Unknown tags: " msgstr "Onbekende tags: " #: importfilter.cpp:184 #, kde-format msgid "Could not recode input file!" msgstr "Kon invoerbestand niet opnieuw indelen!" #: importfilter.cpp:192 #, kde-format msgid "Unable to open temp file " msgstr "Kon tijdelijk bestand niet openen " #: importfilter.cpp:198 #, kde-format msgid "Could not open the import source file!" msgstr "Kon het importbestand niet openen!" #: importitemdialog.cpp:47 #, kde-format msgid "Import Items From File" msgstr "Items vanuit bestand importeren" #: importitemdialog.cpp:116 #, kde-format msgid "the Header of the Document" msgstr "het briefhoofd van het document" #: importitemdialog.cpp:125 templtopositiondialogbase.cpp:58 #, kde-format msgid "…" msgstr "…" #: inserttempldialog.cpp:103 #, kde-format msgid "Create a New Item" msgstr "Nieuw item aanmaken" #: inserttempldialog.cpp:105 #, kde-format msgid "Create a New Item from Template" msgstr "Van sjabloon nieuw item aanmaken" #: itemtagdialog.cpp:82 #, kde-format msgid "Edit Item Tags" msgstr "Item Tags bewerken" #: itemtagdialog.cpp:89 #, kde-format msgid "Item Tags" msgstr "Item Tags" #: itemtagdialog.cpp:90 #, kde-format msgid "Select all tags for the item should be tagged with." msgstr "Selecteer alle tags waarmee u het item wilt markeren." #: itemtagdialog.cpp:105 tagtemplatesdialog.cpp:150 #, kde-format msgid "Tag" msgstr "Tag" #: itemtagdialog.cpp:106 tagtemplatesdialog.cpp:151 #, kde-format msgid "Color" msgstr "Kleur" #: itemtagdialog.cpp:107 tagtemplatesdialog.cpp:152 #, kde-format msgid "Description" msgstr "Beschrijving" #: katalog.cpp:137 #, kde-format msgid "not found" msgstr "niet gevonden" #: kataloglistview.cpp:355 #, kde-format msgid "A catalog chapter cannot be deleted as long it has children." msgstr "Kan map niet uit catalogus verwijderen zolang het niet leeg is." #: kataloglistview.cpp:356 #, kde-format msgid "Chapter cannot be deleted" msgstr "Kan map niet verwijderen" #: katalogview.cpp:119 rc.cpp:182 rc.cpp:195 rc.cpp:250 rc.cpp:257 rc.cpp:900 #, no-c-format, kde-format msgid "%p%" msgstr "%p%" #: katalogview.cpp:167 #, kde-format msgid "Edit Sub chapter" msgstr "Submap wijzigen" #: katalogview.cpp:169 #, kde-format msgid "Edit a catalog sub chapter" msgstr "Submap in catalogus wijzigen" #: katalogview.cpp:173 #, kde-format msgid "Add a sub chapter" msgstr "Submap toevoegen" #: katalogview.cpp:175 #, kde-format msgid "Add a sub chapter below the selected one" msgstr "In deze map een submap toevoegen" #: katalogview.cpp:179 katalogview.cpp:181 #, kde-format msgid "Remove a sub chapter" msgstr "Submap verwijderen" #: katalogview.cpp:185 rc.cpp:3 #, kde-format msgid "Edit Template" msgstr "Sjabloon bewerken" #: katalogview.cpp:187 #, kde-format msgid "Opens the editor window for templates to edit the selected one" msgstr "Opent het bewerkingsvenster om het geselecteerde sjabloon te bewerken" #: katalogview.cpp:192 #, kde-format msgid "New template" msgstr "Nieuw sjabloon" #: katalogview.cpp:194 #, kde-format msgid "Opens the editor window for templates to enter a new template" msgstr "" "Opent het bewerkingsvenster voor sjablonen om een nieuw sjabloon in te " "voeren" #: katalogview.cpp:199 #, kde-format msgid "Delete template" msgstr "Sjabloon verwijderen" #: katalogview.cpp:201 #, kde-format msgid "Deletes the template" msgstr "Verwijdert het sjabloon " #: katalogview.cpp:206 #, kde-format msgid "Export catalog" msgstr "Catalogus exporteren" #: katalogview.cpp:208 #, kde-format msgid "Export the whole catalog as XML encoded file" msgstr "De hele catalogus als XML-gecodeerd bestand exporteren" #: katalogview.cpp:213 #, kde-format msgid "Import catalog" msgstr "Catalogus importeren" #: katalogview.cpp:215 #, kde-format msgid "Import a catalog from a XML file" msgstr "Catalogus uit een XML-bestand importeren" #: katalogview.cpp:219 rc.cpp:527 #, kde-format msgid "&Catalog" msgstr "&Catalogus" #: katalogview.cpp:237 #, kde-format msgid "Opening file…" msgstr "Bestand wordt geopend…" #: katalogview.cpp:239 katalogview.cpp:305 katalogview.cpp:319 #: katalogview.cpp:328 katalogview.cpp:337 portal.cpp:750 portal.cpp:773 #: portal.cpp:1098 #, kde-format msgid "Ready." msgstr "Gereed." #: katalogview.cpp:244 portal.cpp:1042 #, kde-format msgid "Exiting…" msgstr "Bezig met afsluiten…" #: katalogview.cpp:301 #, kde-format msgid "Exporting file…" msgstr "Exporteren van bestand…" #: katalogview.cpp:310 #, kde-format msgid "Importing file… (not yet implemented)" msgstr "Bezig met importeren van bestand...(is nog niet geïmplementeerd)" #: katalogview.cpp:315 #, kde-format msgid "Creating a new sub chapter…" msgstr "Bezig met het aanmaken van een submap…" #: katalogview.cpp:324 #, kde-format msgid "Editing a sub chapter…" msgstr "Bezig met het bewerken van een submap…" #: katalogview.cpp:333 #, kde-format msgid "Removing a sub chapter…" msgstr "Bezig met het verwijderen van een submap…" #: katalogview.cpp:366 #, kde-format msgid "Created at %1 " msgstr "Aangemaakt op %1 " #: katalogview.cpp:370 #, kde-format msgid ", last modified at %1" msgstr ", laatste keer gewijzigd op %1" #: katalogview.cpp:376 #, kde-format msgid "%1 times used, last at %2" msgstr "%1 keer gebruikt, laatste keer op %2" #: kraftdoc.cpp:160 #, kde-format msgctxt "First argument is the doctype, like Invoice, followed by the ID" msgid "%1 (ID %2)" msgstr "%1 (Id %2)" #: kraftdoc.cpp:308 #, kde-format msgctxt "Document part header" msgid "Header" msgstr "Briefhoofd" #: kraftdoc.cpp:310 #, kde-format msgctxt "Document part footer" msgid "Footer" msgstr "Voettekst" #: kraftdoc.cpp:312 #, kde-format msgctxt "Document part containing the items" msgid "Items" msgstr "Items" #: kraftdoc.cpp:314 #, kde-format msgid "Unknown document part" msgstr "Onbekend documentgedeelte" #: kraftdocfooteredit.cpp:52 #, kde-format msgid "Document Footer" msgstr "Voettekst van document" #: kraftdocheaderedit.cpp:57 #, kde-format msgid "Document Header" msgstr "Briefhoofd van document" #: kraftdocheaderedit.cpp:65 #, kde-format msgid "Manually set in address field." msgstr "Handmatig het adresveld instellen." #: kraftdocpositionsedit.cpp:94 #, kde-format msgid "Add Item…" msgstr "Item toevoegen…" #: kraftdocpositionsedit.cpp:96 #, kde-format msgid "Add a normal item to the document manually." msgstr "Een normaal item handmatig aan het document toevoegen." #: kraftdocpositionsedit.cpp:100 #, kde-format msgid "Add Discount Item" msgstr "Een item met korting toevoegen" #: kraftdocpositionsedit.cpp:103 #, kde-format msgid "" "Adds an item to the document that allows discounts on other items in the " "document" msgstr "" "Voegt een item aan het document toe dat kortingen op andere items in het " "document toestaat" #: kraftdocpositionsedit.cpp:106 #, kde-format msgid "Import Items…" msgstr "Items importeren…" #: kraftdocpositionsedit.cpp:109 #, kde-format msgid "Opens a dialog where multiple items can be imported from a text file." msgstr "" "Opent een dialoog waar meerdere items geïmporteerd kunnen worden uit een " "tekstbestand." #: kraftdocpositionsedit.cpp:118 #, kde-format msgid "Document Items" msgstr "Document-items" #: kraftview.cpp:89 kraftview_ro.cpp:60 #, kde-format msgid "Document" msgstr "Document" #: kraftview.cpp:257 #, kde-format msgid "Successor of %1" msgstr "Vervolg van %1" #: kraftview.cpp:395 kraftview.cpp:847 #, kde-format msgid "" "The address label is not empty and different from the selected one.
          Do " "you really want to replace it with the text shown below?
          %1
          " msgstr "" "Het adreslabel is niet leeg en verschilt van de geselecteerde.
          Wilt u " "het vervangen door de onderstaande tekst?
          %1
          " #: kraftview.cpp:442 #, kde-format msgid "" "

          The Document Items List is still empty, but Items can be added " "now.

          To add items to the document either
          • Press the 'Add item' " "button above.
          • Open the template catalog by clicking on the 'show " "Template' button on the right and pick one of the available " "templates.
          " msgstr "" "

          De lijst met items in het documenten is nog leeg, maar u kunt vanaf nu items toevoegen.

          om items aan het document toe te voegen, kunt u naar keuze
          • op de \n" "knop \"toevoegen\" erboven drukken.
          • het dialoog met de catalogus met \n" "sjablonen openen door op de 'Sjabloon weergeven' knop rechts te klikken en een van de \n" "beschikbare sjablonen te selecteren.
          " #: kraftview.cpp:634 prefsdialog.cpp:329 #, kde-format msgid "Display no tax at all" msgstr "Helemaal geen belasting tonen" #: kraftview.cpp:635 prefsdialog.cpp:330 #, kde-format msgid "Calculate reduced tax for all items" msgstr "Bereken lage BTW voor alle items" #: kraftview.cpp:636 prefsdialog.cpp:331 #, kde-format msgid "Calculate full tax for all items" msgstr "Bereken hoge BTW voor alle items" #: kraftview.cpp:637 #, kde-format msgid "Calculate individual tax for each item" msgstr "Bereken voor elk item de belasting apart" #: kraftview.cpp:694 #, kde-format msgid "Tax Settings Overwrite" msgstr "belastinginstellingen overschrijven" #: kraftview.cpp:695 #, kde-format msgid "Really overwrite all individual tax settings of the items?" msgstr "" "Wilt u alle individuele belastinginstellingen van de items overschrijven? " #: kraftview.cpp:846 #, kde-format msgid "Address Overwrite" msgstr "Overschrijven van adres" #: kraftview.cpp:1111 #, kde-format msgid "Discount" msgstr "Korting" #: kraftview.cpp:1351 #, kde-format msgid "The document has been modified." msgstr "Het document is gewijzigd." #: kraftview.cpp:1352 #, kde-format msgid "Do you want to save your changes?" msgstr "Wilt u de wijzigingen opslaan?" #: kraftview_ro.cpp:198 #, kde-format msgid "Reduced TAX" msgstr "Lage BTW" #: main.cpp:58 #, kde-format msgid "Open document with arch doc number " msgstr "Open document met arch doc nummer " #: main.cpp:59 #, kde-format msgid "Open Kraft in read only mode - document changes prohibited" msgstr "" "Open Kraft in alleen lezen modus - document wijzigen is niet toegestaan." #: materialkataloglistview.cpp:40 rc.cpp:108 rc.cpp:695 #, kde-format msgid "Material" msgstr "Materiaal" #: materialkataloglistview.cpp:41 #, kde-format msgid "Pack" msgstr "Verpakt per" #: materialkataloglistview.cpp:42 rc.cpp:123 #, kde-format msgid "Unit" msgstr "Eenheid" #: materialkataloglistview.cpp:43 #, kde-format msgid "Purchase" msgstr "Inkoop" #: materialkataloglistview.cpp:44 #, kde-format msgid "Sale" msgstr "Verkoop" #: materialkataloglistview.cpp:45 models/docbasemodel.cpp:37 #, kde-format msgid "Last Modified" msgstr "Laatst gewijzigd" #: materialkataloglistview.cpp:51 #, kde-format msgid "Material Catalog" msgstr "Materiaalcatalogus" #: materialkatalogview.cpp:106 #, kde-format msgid "" msgstr "" #: materialkatalogview.cpp:136 templkatalogview.cpp:139 #, kde-format msgid "Do you really want to delete the template from the catalog?" msgstr "Wilt u het sjabloon uit de catalogus verwijderen?" #: materialselectdialog.cpp:39 #, kde-format msgid "Add Material to Calculation" msgstr "Materiaal toevoegen aan de berekening" #: materialselectdialog.cpp:44 #, kde-format msgid "

          Add Material to Calculation

          " msgstr "

          Materiaal toevoegen aan de berekening

          " #: models/docbasemodel.cpp:33 #, kde-format msgid "Doc. Number" msgstr "Doc.nummer" #: models/docbasemodel.cpp:34 #, kde-format msgid "Doc. Type" msgstr "Doc.type" #: models/docbasemodel.cpp:36 #, kde-format msgid "Client ID" msgstr "Klant ID" #: models/docbasemodel.cpp:38 #, kde-format msgid "Creation Date" msgstr "Aanmaakdatum" #: models/docbasemodel.cpp:40 #, kde-format msgid "Client Address" msgstr "Adres cliënt" #: models/docbasemodel.cpp:41 #, kde-format msgid "Client" msgstr "Cliënt" #: models/docbasemodel.cpp:109 #, kde-format msgid "Looking up address…" msgstr "Bezig met het opzoeken van het adres…" #: models/docbasemodel.cpp:111 #, kde-format msgid "Lookup started…" msgstr "Opzoeken gestart…" #: newdocassistant.cpp:52 newdocassistant.cpp:96 #, kde-format msgid "New Document Settings" msgstr "Instellingen voor nieuwe documenten" #: newdocassistant.cpp:55 #, kde-format msgid "" "Please select a customer as addressee for the document. If there is no entry" " for the customer in the addressbook yet, it can be opened by clicking on " "the button below." msgstr "" "Selecteer een klant als geadresseerde voor het document. Als er voor de " "klant nog geen item in het adresboek is, dan kunt u deze openen door op de " "knop eronder te klikken." #: newdocassistant.cpp:100 #, kde-format msgid "" "Select a document type and a date. A comment on the whiteboard helps to " "classify the document." msgstr "" "Selecteer een documenttype en een datum. Een omschrijving op het whiteboard " "helpt bij het classificeren van het document." #: newdocassistant.cpp:107 #, kde-format msgid "Customer: Not yet selected!" msgstr "Klant: Nog niet geselecteerd!" #: newdocassistant.cpp:116 #, kde-format msgid "Document &type:" msgstr "Document &type:" #: newdocassistant.cpp:120 #, kde-format msgid "Document date: " msgstr "Datum document:" #: newdocassistant.cpp:123 #, kde-format msgid "Whiteboard content:" msgstr "Inhoud Whiteboard:" #: newdocassistant.cpp:127 #, kde-format msgid "Copy document items from predecessor document" msgstr "Kopieer items uit voorgaande document" #: newdocassistant.cpp:175 #, kde-format msgid "Create a new Kraft Document" msgstr "Nieuw Kraft document aanmaken" #: newdocassistant.cpp:265 #, kde-format msgid "Followup Document for %1" msgstr "Opvolg document voor %1" #: numbercycledialog.cpp:52 #, kde-format msgid "Edit Number Cycles" msgstr "Volgnummersysteem bewerken" #: numbercycledialog.cpp:67 #, kde-format msgid "" "The template may contain the following tags:
          • %y or %yyyy - the year " "of the documents date.
          • %yy - the year of the document (two " "digits).
          • %w - the week number of the documents date.
          • %ww - " "the week number of the documents date with leading zero.
          • %d - the " "day number of the documents date.
          • %dd - the day number of the " "documents date with leading zero.
          • %m or %M - the month number of the" " documents date.
          • %MM - the month number with leading " "zero.
          • %c - the customer id from kaddressbook
          • %i - the unique" " counter
          • %ii .. %iiiiii - the counter padded with leading 0, ie. " "012
          • %n - a day based counter, resets every day. Combined with date, " "it makes the number unique.
          • %nn .. %nnnnnn - the day based counter " "padded with leading 0.
          • %type - the localised doc type (offer, " "invoice etc.)
          • %uid - the contact id of the client.
          %i or %n" " need to be part of the template." msgstr "" "In het sjabloon mogen de volgende tags voorkomen:
          • %y of %yyyy - het " "jaar van het document datum.
          • %yy - het jaar van het document (twee " "cijfers).
          • %w - het weeknummer van het document datum.
          • %ww - " "het week nummer van het document datum (twee cijfers).
          • %d - het " "dagnummer van het document.
          • %dd - het dagnummer van het document " "(twee cijfers).
          • %m of %M - de maand als nummer van het " "document.
          • %MM - de maand als nummer met twee cijfers.
          • %c - " "de klanten ID van kaddressbook
          • %i - het volgnummer
          • %ii .. " "%iiiiii - het volgnummer met het cijfer 0 er voor, b.v.. 012
          • %n - " "een volgnummer dat iedere dag gereset wordt. Gecombineerd met de datum, zorg" " dit dat het nummer uniek is.
          • %nn .. %nnnnnn - een volgnummer dat " "iedere dag gereset wordt met het cijfer 0 er voor.
          • %type - het " "gelokaliseerde doc type (offerte, rekening enz.)
          • %uid - het contact " "ID van de klant.
          %i of %n moet onderdeel zijn van het sjabloon." #: numbercycledialog.cpp:141 #, kde-format msgid "Doc-Type" msgstr "Doc-type" #: numbercycledialog.cpp:154 #, kde-format msgctxt "do not translate %i, it is a template variable." msgid "(%i added)" msgstr "(%i added)" #: numbercycledialog.cpp:227 #, kde-format msgid "Add Number Cycle" msgstr "Volgnummersysteem toevoegen" #: numbercycledialog.cpp:228 #, kde-format msgid "Enter the name of a new number cycle." msgstr "Voer de naam in van een nieuw volgnummersysteem." #: numbercycledialog.cpp:286 #, kde-format msgid "The numbercycle %1 is still assigned to a document type." msgstr "Het Volgnummersysteem %1 wordt nog in een documenttype gebruikt." #: numbercycledialog.cpp:287 #, kde-format msgid "" "The number cycle cannot be deleted as long as it is assigned to a document " "type." msgstr "" "Het volgnummersysteem kan niet worden verwijdert zolang het nog in een " "documenttype wordt gebruikt." #: numbercycledialog.cpp:346 #, kde-format msgid "Dangerous Counter Change" msgstr "Gevaarlijke wijziging teller" #: numbercycledialog.cpp:347 #, kde-format msgid "The new counter is lower than the old one. " msgstr "De nieuwe stappen zijn kleiner dan de oude." #: numbercycledialog.cpp:348 #, kde-format msgid "" "That has potential to create duplicate document numbers. Do you really want " "to decrease it?" msgstr "" "Hierdoor kunnen documentnummers meerdere keren voorkomen. Wilt u het echt " "verkleinen?" #: portal.cpp:105 #, kde-format msgid "&Quit" msgstr "A&fsluiten" #: portal.cpp:110 #, kde-format msgid "&Cut" msgstr "K&nippen" #: portal.cpp:115 #, kde-format msgid "C&opy" msgstr "&Kopiëren" #: portal.cpp:120 #, kde-format msgid "&Paste" msgstr "P&lakken" #: portal.cpp:125 #, kde-format msgid "&Settings" msgstr "&Instellingen" #: portal.cpp:130 #, kde-format msgid "&Create Document" msgstr "&Nieuw document" #: portal.cpp:135 #, kde-format msgid "&Copy Document" msgstr "&Kopieer document" #: portal.cpp:140 #, kde-format msgid "Create &Followup Document" msgstr "Creëer &opvolg document" #: portal.cpp:145 #, kde-format msgid "Print Document" msgstr "Document afdrukken" #: portal.cpp:150 #, kde-format msgid "Show Document" msgstr "Document tonen" #: portal.cpp:155 #, kde-format msgid "Edit Document" msgstr "Document bewerken" #: portal.cpp:160 #, kde-format msgid "Open Archived Document" msgstr "Open gearchiveerd document" #: portal.cpp:165 #, kde-format msgid "Mail Document" msgstr "Verzend document" #: portal.cpp:170 #, kde-format msgid "Export XRechnung" msgstr "XRechnung exporteren" #: portal.cpp:175 tagtemplatesdialog.cpp:135 tagtemplatesdialog.cpp:140 #, kde-format msgid "Edit Tag Templates" msgstr "Tag sjabloon bewerken" #: portal.cpp:180 #, kde-format msgid "Redo Initial Setup…" msgstr "De initiële aanmaak opnieuw uitvoeren…" #: portal.cpp:185 #, kde-format msgid "Kraft Handbook…" msgstr "Kraft Handboek.." #: portal.cpp:190 #, kde-format msgid "About Qt…" msgstr "Over Qt…" #: portal.cpp:195 #, kde-format msgid "About Kraft…" msgstr "Info over Kraft…" #: portal.cpp:199 #, kde-format msgid "Quits the application" msgstr "Sluit het programma af" #: portal.cpp:201 #, kde-format msgid "Cuts the selected section and puts it to the clipboard" msgstr "Knipt de geselecteerde sectie uit en plaatst deze op het klembord" #: portal.cpp:202 #, kde-format msgid "Copies the selected section to the clipboard" msgstr "Kopieert de geselecteerde sectie naar het klembord" #: portal.cpp:203 #, kde-format msgid "Pastes the clipboard contents to current position" msgstr "Plakt de inhoud van het klembord op de huidige positie" #: portal.cpp:205 #, kde-format msgid "Creates a new Document" msgstr "Maakt een nieuw document aan" #: portal.cpp:206 #, kde-format msgid "Print and archive this Document" msgstr "Dit document afdrukken en archiveren" #: portal.cpp:207 #, kde-format msgid "Creates a new document which is a copy of the selected document" msgstr "Een nieuw document creëren als kopie van het geselecteerde document " #: portal.cpp:208 #, kde-format msgid "Create a followup document for the current document" msgstr "Creëert een opvolg document voor het huidige document" #: portal.cpp:209 #, kde-format msgid "Opens the document for editing" msgstr "Opent het document voor bewerken" #: portal.cpp:210 #, kde-format msgid "Opens a read only view on the document." msgstr "Opent het document alleen-lezen." #: portal.cpp:211 #, kde-format msgid "Send document per mail" msgstr "Document per email verzenden" #: portal.cpp:212 #, kde-format msgid "Export invoice in XRechnung XML format." msgstr "Exporteert rekening in XRechnung XML formaat." #: portal.cpp:213 #, kde-format msgid "" "Edit the available tag templates which can be assigned to document items." msgstr "De aan de documenten te koppelen beschikbare tags bewerken." #: portal.cpp:214 #, kde-format msgid "Configure the Database Kraft is working on." msgstr "Stel de database in waarmee Kraft werkt." #: portal.cpp:215 #, kde-format msgid "Open a viewer on an archived document" msgstr "Gearchiveerd document weergeven" #: portal.cpp:227 rc.cpp:524 #, kde-format msgid "&File" msgstr "&Bestand" #: portal.cpp:231 #, kde-format msgid "&Edit" msgstr "Be&werken" #: portal.cpp:236 rc.cpp:680 #, kde-format msgid "&Document" msgstr "&Document" #: portal.cpp:251 #, kde-format msgid "Kraft" msgstr "Kraft" #: portal.cpp:254 #, kde-format msgid "&Preferences" msgstr "&Voorkeuren" #: portal.cpp:258 #, kde-format msgid "Toolbars" msgstr "Werkbalken" #: portal.cpp:264 #, kde-format msgid "&Help" msgstr "&Help" #: portal.cpp:352 #, kde-format msgid "Database not running" msgstr "Database is niet gestart." #: portal.cpp:353 #, kde-format msgid "" "Kraft was started in readonly mode, but the configured database cannot be connected.\n" "\n" "Kraft will abort." msgstr "" "Kraft is gestart in alleen lezen modus, maar een verbinding met de gekozen database is niet mogelijk.\n" "\n" "Kraft zal stoppen." #: portal.cpp:369 #, kde-format msgid "" "Kraft cannot connect to the specified MySQL server. Please check the Kraft " "database settings, check if the server is running and verify if a database " "with the name %1 exits!" msgstr "" "Kraft kon geen verbinding met de opgegeven MySQL-server maken. Controleer de" " database-instellingen van Kraft, controleer of de server is gestart en of " "een database met de naam %1 bestaat!" #: portal.cpp:373 #, kde-format msgid "" "The database with the name %1 does not exist on the database server. Please " "make sure the database exists and is accessible by the user running Kraft." msgstr "" "De database met de naam %1 is bij deze database server niet te vinden.\n" "Controleer of deze database bestaat en door de gebruiker die Kraft gebruikt, geopend kan worden." #: portal.cpp:377 #, kde-format msgid "" "The Qt database driver could not be loaded. That probably means, that they " "are not installed. Please make sure the Qt database packages are installed " "and try again." msgstr "" "De Qt database driver kon niet worden geladen. Dit houd waarschijnlijk in dat het niet is geïnstalleerd. Controleer of de Qt database pakketten zijn \n" "geïnstalleerd en probeer het daarna opnieuw." #: portal.cpp:381 #, kde-format msgid "There is a database problem: %1" msgstr "Er is een probleem met de database: %1" #: portal.cpp:399 #, kde-format msgid "Database Problem." msgstr "Probleem met de database." #: portal.cpp:411 #, kde-format msgid "Check commandline actions" msgstr "Opdrachten op de commando controleren" #: portal.cpp:501 #, kde-format msgid "Welcome to Kraft, %1" msgstr "Welkom bij Kraft, %1" #: portal.cpp:530 #, kde-format msgid "Creating new document…" msgstr "Bezig met het aanmaken van een nieuw document…" #: portal.cpp:556 #, kde-format msgctxt "" "Dialog title of the followup doc dialog, followed by the id of the source " "doc" msgid "Create follow up document for %1" msgstr "Creëer &opvolg document voor %1" #: portal.cpp:601 #, kde-format msgctxt "Title of the new doc dialog, %1 is the source doc id" msgid "Create new Document as Copy of %1" msgstr "Kopie van %1 als nieuw document creëren" #: portal.cpp:636 #, kde-format msgid "Opening document to view…" msgstr "Bezig met het openen van document om deze weer te geven…" #: portal.cpp:663 #, kde-format msgid "" "XRechnung Template file not set. Please check the application settings!" msgstr "" "XRechnung sjabloonbestand niet ingesteld. Controleer de instellingen van het" " programma!" #: portal.cpp:667 #, kde-format msgid "The XRechnung template file cannot be read!" msgstr "Kan het XRechnung sjabloonbestand niet openen!" #: portal.cpp:672 #, kde-format msgid "XRechnung Export" msgstr "XRechnung exporteren" #: portal.cpp:692 #, kde-format msgid "Save XRechnung" msgstr "XRechnung opslaan" #: portal.cpp:702 #, kde-format msgid "Saved XRechnung to %1" msgstr "Xrechnung opgeslagen naar %1" #: portal.cpp:736 #, kde-format msgid "Generating PDF…" msgstr "Bezig met generen van PDF…" #: portal.cpp:759 #, kde-format msgid "Generating PDF to email" msgstr "Bezig met generen van PDF voor de email" #: portal.cpp:778 #, kde-format msgid "Doc Generation Error" msgstr "Fout bij generen van document" #: portal.cpp:834 #, kde-format msgid "Printing archived document…" msgstr "Bezig met afdrukken gearchiveerd document…" #: portal.cpp:886 #, kde-format msgid "Opening document %1" msgstr "Bezig met het openen van document %1" #: portal.cpp:1069 #, kde-format msgid "Cutting selection…" msgstr "Bezig met het knippen van de selectie…" #: portal.cpp:1076 #, kde-format msgid "Copying selection to clipboard…" msgstr "Bezig met het kopiëren van de selectie naar het klembord…" #: portal.cpp:1083 #, kde-format msgid "Inserting clipboard contents…" msgstr "Bezig met plakken van de inhoud van het klembord…" #: portal.cpp:1096 #, kde-format msgid "" "Ready. Kraft is running in read only mode. Document editing is prohibited." msgstr "" "Gereed, Kraft is in alleen lezen modus - document wijzigen is niet " "toegestaan." #: portalview.cpp:68 #, kde-format msgid "About Kraft" msgstr "Info of Kraft" #: portalview.cpp:98 #, kde-format msgid "Documents" msgstr "Documenten" #: portalview.cpp:105 #, kde-format msgid "Timeline" msgstr "Tijdlijn" #: portalview.cpp:113 #, kde-format msgid "Catalogs" msgstr "Catalogi" #: portalview.cpp:152 #, kde-format msgid "Kraft Document Overview" msgstr "Overzicht documenten in Kraft" #: portalview.cpp:159 portalview.cpp:178 #, kde-format msgid "Available Catalogs" msgstr "Beschikbare catalogi" #: portalview.cpp:161 #, kde-format msgid "No catalogs available." msgstr "Geen catalogi beschikbaar." #: portalview.cpp:210 #, kde-format msgid "Open" msgstr "Openen" #: portalview.cpp:221 #, kde-format msgid "No templates yet." msgstr "Nog geen sjablonen." #: portalview.cpp:225 #, kde-format msgid "%1 templates in %2 chapters
          last modified at %3" msgstr "%1 sjablonen in %2 mappen
          gewijzigd op %3" #: portalview.cpp:276 #, kde-format msgid "Kraft Website" msgstr "Kraft Website" #: portalview.cpp:279 #, kde-format msgctxt "The string is followed by a link to the GPL2 text" msgid "Kraft is free software licensed under the" msgstr "Kraft is vrije software met een licentie onder de" #: portalview.cpp:280 #, kde-format msgctxt "The string is followed by the link to github" msgid "Kraft is maintained on " msgstr "Kraft wordt onderhouden op" #: portalview.cpp:281 #, kde-format msgid "Authors" msgstr "Auteurs" #: portalview.cpp:282 #, kde-format msgid "Developer and Maintainer" msgstr "Ontwikkelaar en onderhouder" #: portalview.cpp:283 #, kde-format msgid "Developer" msgstr "Ontwikkelaar" #: portalview.cpp:284 #, kde-format msgctxt "The person who provided the logo graphics" msgid "Logo design" msgstr "Logo ontwerp" #: portalview.cpp:285 #, kde-format msgctxt "The person who provided the user manual" msgid "User Manual" msgstr "Gebruikershandleiding" #: portalview.cpp:287 #, kde-format msgid "" "Kraft helps you to handle documents like quotes and invoices in your small " "business." msgstr "" "Kraft is bedoelt voor hulp bij het beheer van documenten zoals offertes en " "rekeningen in kleine bedrijven." #: portalview.cpp:288 #, kde-format msgid "Welcome to Kraft" msgstr "Welkom bij Kraft" #: portalview.cpp:289 #, kde-format msgid "Kraft version" msgstr "Kraft versie" #: portalview.cpp:291 #, kde-format msgid "Codename" msgstr "Codenaam" #: portalview.cpp:293 #, kde-format msgid "" "# How do you like Kraft overall?\n" "\n" "# What kind of business do you run?\n" "\n" "# In which country are you working?\n" "\n" "# Are you planning to continue with Kraft?\n" "\n" "# What else do you want to tell us?\n" "\n" msgstr "" #: portalview.cpp:299 #, kde-format msgid "Send Feedback to the Kraft Authors" msgstr "" #: portalview.cpp:307 #, kde-format msgid "Git information" msgstr "Git informatie" #: portalview.cpp:315 #, kde-format msgid "Country setting" msgstr "Ingesteld land:" #: portalview.cpp:318 #, kde-format msgid "Language setting" msgstr "Ingestelde taal:" #: portalview.cpp:322 #, kde-format msgid "Kraft Initialisation Problem" msgstr "Kraft Initialisatie probleem" #: portalview.cpp:323 #, kde-format msgid "" "There is a initialisation error on your system. Kraft will not work that " "way." msgstr "" "Er is een initialisatie fout op uw systeem. Kraft zal op die manier niet " "werken." #: portalview.cpp:330 #, kde-format msgid "Database Information" msgstr "Database-informatie" #: portalview.cpp:331 #, kde-format msgid "Kraft database name" msgstr "Kraft database naam:" #: portalview.cpp:336 #, kde-format msgid "Required Version" msgstr "Vereiste versie" #: portalview.cpp:339 #, kde-format msgid "Database schema version" msgstr "Database-schemaversie:" #: portalview.cpp:341 #, kde-format msgid "Qt database driver" msgstr "Databasestuurprogramma voor Qt:" #: portalview.cpp:345 #, kde-format msgid "established" msgstr "verbinding tot stand gebracht" #: portalview.cpp:345 #, kde-format msgid "NOT AVAILABLE!" msgstr "NIET BESCHIKBAAR!" #: portalview.cpp:346 #, kde-format msgid "Database connection" msgstr "Databaseverbinding" #: portalview.cpp:355 #, kde-format msgid "Database Version" msgstr "Databaseversie" #: portalview.cpp:363 #, kde-format msgid "Addressbook Backend" msgstr "Addressbook Backend" #: portalview.cpp:364 #, kde-format msgid "Backend type" msgstr "Backend type" #: portalview.cpp:366 #, kde-format msgid "running" msgstr "Gestart" #: portalview.cpp:366 #, kde-format msgid "not running" msgstr "Niet gestart" #: portalview.cpp:370 #, kde-format msgid "External Tools" msgstr "Externe hulpprogramma's" #: portalview.cpp:372 #, kde-format msgid "RML to PDF conversion tool" msgstr "Hulpprogramma voor conversie van RML naar PDF:" #: portalview.cpp:374 #, kde-format msgid "not found!" msgstr "niet gevonden!" #: portalview.cpp:377 #, kde-format msgid "iconv tool for text import" msgstr "iconv hulpmiddel voor importeren van tekst" #: portalview.cpp:380 #, kde-format msgid "weasyprint for PDF generation" msgstr "weasyprint voor creatie van PDF" #: portalview.cpp:384 #, kde-format msgid "not available" msgstr "niet beschikbaar" #: portalview.cpp:389 #, kde-format msgid "Some Icons are made by" msgstr "Enkele pictogrammen zijn gemaakt door" #: portalview.cpp:390 #, kde-format msgid "Acknowledgements" msgstr "Met dank aan" #: positionviewwidget.cpp:90 #, kde-format msgid "Item Actions" msgstr "Item Acties" #: positionviewwidget.cpp:93 #, kde-format msgid "Item Kind" msgstr "Soort item:" #: positionviewwidget.cpp:94 positionviewwidget.cpp:687 #, kde-format msgid "Normal" msgstr "Normaal" #: positionviewwidget.cpp:96 positionviewwidget.cpp:695 #, kde-format msgid "Alternative" msgstr "Alternatief" #: positionviewwidget.cpp:98 #, kde-format msgid "On Demand" msgstr "Op verzoek" #: positionviewwidget.cpp:103 rc.cpp:281 #, kde-format msgid "Tax" msgstr "Belasting" #: positionviewwidget.cpp:106 #, kde-format msgid "Taxfree Item" msgstr "Belastingvrije item" #: positionviewwidget.cpp:112 #, kde-format msgid "Reduced Tax" msgstr "Laag tarief BTW" #: positionviewwidget.cpp:118 #, kde-format msgid "Full Tax" msgstr "Hoog tarief BTW" #: positionviewwidget.cpp:127 #, kde-format msgid "Move Up" msgstr "Omhoog" #: positionviewwidget.cpp:129 #, kde-format msgid "Move Down" msgstr "Omlaag" #: positionviewwidget.cpp:131 #, kde-format msgid "Lock Item" msgstr "Item vastzetten" #: positionviewwidget.cpp:133 #, kde-format msgid "Unlock Item" msgstr "Item ontgrendelen" #: positionviewwidget.cpp:135 #, kde-format msgid "Delete Item" msgstr "Item verwijderen" #: positionviewwidget.cpp:226 #, kde-format msgid "All items" msgstr "Alle items" #: positionviewwidget.cpp:236 #, kde-format msgid "%1-tagged items" msgstr "%1-gemarkeerde items" #: positionviewwidget.cpp:268 #, kde-format msgid "Tag: %1" msgstr "Tag: %1" #: positionviewwidget.cpp:270 #, kde-format msgid "Tags:
            " msgstr "Tags:
              " #: positionviewwidget.cpp:281 #, kde-format msgid "No tags assigned yet." msgstr "Nog geen tags toegewezen." #: positionviewwidget.cpp:410 #, kde-format msgid "Active" msgstr "Actief" #: positionviewwidget.cpp:412 #, kde-format msgid "New" msgstr "Nieuw" #: positionviewwidget.cpp:414 #, kde-format msgid "Deleted" msgstr "Verwijderd" #: positionviewwidget.cpp:416 #, kde-format msgid "Locked" msgstr "Vergrendeld" #: positionviewwidget.cpp:613 #, kde-format msgid "" "This item is either completely optional or its amount varies depending on " "the needs.

              Use the item toolbox to change the item type." msgstr "" "Dit item is compleet optioneel of de hoeveelheid is afhankelijk van het " "gebruik.

              Bij de knoppen voor positie is een knop waar u het type " "item kunt wijzigen." #: positionviewwidget.cpp:619 #, kde-format msgid "" "This is an alternative item.

              Use the position toolbox to change " "the item type." msgstr "" "Dit item is een alternatief.

              Bij de knoppen voor positie is een " "knop waar u het type item kunt wijzigen." #: positionviewwidget.cpp:691 #, kde-format msgid "Demand" msgstr "Op verzoek" #: prefsdialog.cpp:64 #, kde-format msgid "Configure Kraft" msgstr "Kraft instellen" #: prefsdialog.cpp:98 #, kde-format msgid "Document Defaults" msgstr "Standaarddocument" #: prefsdialog.cpp:99 #, kde-format msgid "Taxes" msgstr "Belastingen" #: prefsdialog.cpp:100 #, kde-format msgid "Document Types" msgstr "Documenttypes" #: prefsdialog.cpp:102 #, kde-format msgid "Wages" msgstr "Salarissen" #: prefsdialog.cpp:104 #, kde-format msgid "Units" msgstr "Eenheden" #: prefsdialog.cpp:105 #, kde-format msgid "Own Identity" msgstr "Uw eigen identiteit" #: prefsdialog.cpp:152 #, kde-format msgid "Tax rates beginning at date:" msgstr "Belastingtarieven beginnend op de datum:" #: prefsdialog.cpp:160 prefsunits.cpp:53 prefswages.cpp:51 #, kde-format msgid "ID" msgstr "ID" #: prefsdialog.cpp:161 #, kde-format msgid "Full Tax [%]" msgstr "Hoog BTW [%]" #: prefsdialog.cpp:162 #, kde-format msgid "Reduced Tax [%]" msgstr "Laag BTW [%]" #: prefsdialog.cpp:163 #, kde-format msgid "Start Date" msgstr "Startdatum" #: prefsdialog.cpp:182 prefsunits.cpp:80 prefswages.cpp:90 rc.cpp:323 #, kde-format msgid "Add" msgstr "Toevoegen" #: prefsdialog.cpp:186 prefsunits.cpp:89 prefswages.cpp:99 rc.cpp:335 #, kde-format msgid "Remove" msgstr "Verwijderen" #: prefsdialog.cpp:203 #, kde-format msgid "" "Select the identity of the sending entity of documents. That's your " "companies address." msgstr "" "Selecteer de identiteit van de document-verzender. Dat is het adres van " "uw bedrijf." #: prefsdialog.cpp:219 #, kde-format msgid "Select Identity…" msgstr "Identiteit selecteren…" #: prefsdialog.cpp:225 #, kde-format msgid "From Address Book" msgstr "Uit het adresboek" #: prefsdialog.cpp:230 setupassistant.cpp:342 #, kde-format msgid "Manual Entry" msgstr "Handmatig toevoegen" #: prefsdialog.cpp:242 #, kde-format msgid "Manual Address" msgstr "Handmatige adres" #: prefsdialog.cpp:245 #, kde-format msgid "Bank Account Information" msgstr "Informatie bankrekening" #: prefsdialog.cpp:309 #, kde-format msgid "&Default document type on creation:" msgstr "Stan&daard documenttype bij aanmaken:" #: prefsdialog.cpp:314 #, kde-format msgid "New documents default to the selected type." msgstr "Nieuwe documenten hebben standaard het geselecteerde type." #: prefsdialog.cpp:323 #, kde-format msgid "Default &Tax for Documents:" msgstr "Standaard &belastingtarief voor documenten:" #: prefsdialog.cpp:328 #, kde-format msgid "The default tax setting for all documents." msgstr "" "De standaard instelling voor het belastingtarief te gebruiken in alle " "documenten." #: prefsdialog.cpp:340 #, kde-format msgid "Document Date Format:" msgstr "Datum instelling van document:" #: prefsdialog.cpp:346 #, kde-format msgid "The default date format for documents." msgstr "De standaard datum-instelling voor documenten." #: prefsdialog.cpp:348 #, kde-format msgid "ISO-Format: %1" msgstr "ISO-opmaak: %1" #: prefsdialog.cpp:350 #, kde-format msgid "Short-Date: %1" msgstr "Korte-datum: %1" #: prefsdialog.cpp:352 #, kde-format msgid "Long-Date: %1" msgstr "Lange-datum: %1" #: prefsdialog.cpp:354 #, kde-format msgid "RFC 2822-Format: %1" msgstr "RFC 2822-Opmaak: %1" #: prefsdialog.cpp:356 #, kde-format msgid "\"German Format\": %1" msgstr "\"Duitse Opmaak\": %1" #: prefsdialog.cpp:357 #, kde-format msgid "Custom Setting in Settingsfile" msgstr "Aangepaste instelling in het instellingenbestand" #: prefsdialog.cpp:366 #, kde-format msgid "Prefix text for Demand items:" msgstr "Voorvoegsel voor posten op verzoek" #: prefsdialog.cpp:371 #, kde-format msgid "This text is automatically prepended to new 'on demand' items." msgstr "Deze tekst is automatisch geplaatst voor nieuwe posten 'op verzoek'." #: prefsdialog.cpp:375 #, kde-format msgid "Prefix text for Alternative items:" msgstr "Voorvoegsel voor alternatieve posten" #: prefsdialog.cpp:380 #, kde-format msgid "This text is automatically prepended to new 'alternative' items." msgstr "Deze tekst is automatisch geplaatst voor nieuwe posten 'alternatief'." #: prefsdialog.cpp:391 #, kde-format msgid "XRechnung template file:" msgstr "XRechnung sjabloonbestand:" #: prefsdialog.cpp:397 rc.cpp:308 #, kde-format msgid "Select…" msgstr "Selecteren…" #: prefsdialog.cpp:405 #, kde-format msgid "Select template file for XRechnung" msgstr "Selecteer sjabloonbestand voor XRechnung" #: prefsdialog.cpp:410 #, kde-format msgid "XRechnung Templates (*.xrtmpl)" msgstr "XRechnung Sjablonen (*.xrtmpl)" #: prefsdialog.cpp:450 #, kde-format msgid "" "The old default doc type for new documents was just deleted.Please check the" " setting in the Document Defaults in the Kraft preferences Dialog." msgstr "" "Het oude standaarddocument type voor nieuwe documenten is zojuist " "verwijderd. Controleer de instellingen voor document types in het " "configuratiedialoog van Kraft." #: prefsdialog.cpp:453 #, kde-format msgid "Document Default Change" msgstr "Wijzigen standaarddocument" #: prefsdialog.cpp:701 #, kde-format msgid "The identity cannot be found." msgstr "De identiteit is niet te vinden." #: prefsdialog.cpp:703 #, kde-format msgid "" "

              Kraft Addressbook Integration down.

              The address book backend" " is not up and running.

              Please check your addressbook integration " "setup.

              " msgstr "" "

              Kraft adresboek Integratie werkt niet.

              De backend van het " "adresboek is niet opgestart.

              Controleer de instellingen voor de " "integratie van uw adresboek.

              " #: prefsdialog.cpp:709 #, kde-format msgid "The identity is not listed in an address book." msgstr "Deze identiteit komt niet in een adresboek voor." #: prefsdialog.cpp:711 #, kde-format msgid "" "

              Kraft does not know your identity.

              Please pick one from the " "address books by clicking on the Button below.

              Not having an identity " "selected can make your documents look incomplete.

              " msgstr "" "

              Kraft weet uw identiteit niet.

              Selecteer een uit het adres " "boek door te klikken op de knop eronder.

              Uw documenten kunnen " "incompleet er uit zien als u geen identiteit heeft geselecteerd.

              " #: prefsdialog.cpp:728 #, kde-format msgid "Your identity can be found in the address books." msgstr "Uw identiteit is te vinden in de adresboeken." #: prefsdialog.cpp:739 #, kde-format msgid "Work Phone" msgstr "Telefoon werk" #: prefsdialog.cpp:740 #, kde-format msgid "Fax" msgstr "Fax" #: prefsdialog.cpp:741 #, kde-format msgid "Cell Phone" msgstr "Mobiele telefoon" #: prefsunits.cpp:54 #, kde-format msgid "Short" msgstr "Kort" #: prefsunits.cpp:55 #, kde-format msgid "Long" msgstr "Compleet" #: prefsunits.cpp:56 #, kde-format msgid "Short plural" msgstr "Kort meervoud" #: prefsunits.cpp:57 #, kde-format msgid "Long plural" msgstr "Compleet meervoud" #: prefsunits.cpp:58 #, kde-format msgid "ECE20" msgstr "ECE20" #: prefsunits.cpp:84 prefswages.cpp:94 rc.cpp:329 #, kde-format msgid "Edit" msgstr "Bewerken" #: prefsunits.cpp:148 #, kde-format msgid "Edit a unit" msgstr "Bewerk eenheid" #: prefsunits.cpp:192 #, kde-format msgid "

              Edit unit

              " msgstr "

              Bewerk eenheid

              " #: prefswages.cpp:52 #, kde-format msgid "Code" msgstr "Code" #: prefswages.cpp:53 templkataloglistview.cpp:46 rc.cpp:126 #, kde-format msgid "Price" msgstr "Prijs" #: prefswages.cpp:54 #, kde-format msgid "Sortkey" msgstr "Sneltoets" #: prefswages.cpp:80 #, kde-format msgid "Up" msgstr "Omhoog" #: prefswages.cpp:85 #, kde-format msgid "Down" msgstr "Omlaag" #: prefswages.cpp:201 #, kde-format msgid "Edit a wage group" msgstr "Salarisgroep bewerken" #: prefswages.cpp:241 #, kde-format msgid "

              Edit wage group

              " msgstr "

              Salarisgroep bewerken

              " #: reportgenerator.cpp:113 #, kde-format msgid "The document generation process is still running." msgstr "Ben nog bezig met het generen van documenten." #: reportgenerator.cpp:168 #, kde-format msgid "The temporary file %1 is not accessible." msgstr "Het sjabloonbestand %1 kan niet geopend worden." #: reportgenerator.cpp:193 #, kde-format msgid "The template conversion failed." msgstr "De conversie van het sjabloon is mislukt." #: reportgenerator.cpp:201 #, kde-format msgid "Saving to temporary file failed." msgstr "Opslaan naar tijdelijk bestand is mislukt." #: reportgenerator.cpp:332 #, kde-format msgid "No converter error." msgstr "Geen problemen bij de conversie." #: reportgenerator.cpp:335 #, kde-format msgid "The ReportLab based converter script cannot be executed." msgstr "" "Het op ReportLab gebaseerde conversie script kon niet worden uitgevoerd." #: reportgenerator.cpp:338 #, kde-format msgid "An unknown error happened." msgstr "Een onbekend probleem trad op." #: reportgenerator.cpp:341 #, kde-format msgid "The ReportLab python module is not installed." msgstr "De ReportLab python module is niet geïnstalleerd." #: reportgenerator.cpp:344 #, kde-format msgid "The PyPDF2 python module is not installed." msgstr "De PyPDF2 python module is niet geïnstalleerd." #: reportgenerator.cpp:347 #, kde-format msgid "The source file cannot be read." msgstr "Kan het bronbestand niet openen." #: reportgenerator.cpp:350 #, kde-format msgid "The target cannot be opened to write." msgstr "Het doelbestand kon niet worden geopend." #: reportgenerator.cpp:353 #, kde-format msgid "The target file does not exist." msgstr "Het doelbestand is niet te vinden." #: reportgenerator.cpp:356 #, kde-format msgid "The WeasyPrint tool is not installed." msgstr "Het WeasyPrint onderdeel is niet geïnstalleerd." #: reportgenerator.cpp:359 #, kde-format msgid "The PDF merger utility failed." msgstr "Het samenvoegen van PDF mislukte." #: reportgenerator.cpp:378 #, kde-format msgid "There is not template defined for %1." msgstr "Er is geen sjabloon gedefinieerd voor %1." #: reportgenerator.cpp:379 #, kde-format msgid "Make sure to define a template file in the settings dialog." msgstr "" "Zorg ervoor dat in het dialoogvenster voor instellingen een sjabloonbestand " "is ingesteld." #: reportgenerator.cpp:384 #, kde-format msgid "The template file %1 for document type %2 is not a file." msgstr "Het sjabloonbestand %1 voor documenttype %2 is geen bestand." #: reportgenerator.cpp:385 #, kde-format msgid "Make sure to pick a readable template file in the settings dialog" msgstr "" "Zorg ervoor dat in het dialoogvenster voor instellingen een leesbaar " "sjabloonbestand is geselecteerd" #: reportgenerator.cpp:389 #, kde-format msgid "The template file %1 for document type %2 can not be read." msgstr "Kan het sjabloonbestand %1 voor documenttype %2 niet openen." #: reportgenerator.cpp:390 #, kde-format msgid "Make sure the template file has proper file permissions." msgstr "Zorg ervoor dat het sjabloonbestand de juiste permissies heeft." #: setupassistant.cpp:36 #, kde-format msgid "Welcome to the Kraft Setup Assistant" msgstr "Welkom bij de Kraft setup assistent" #: setupassistant.cpp:55 #, kde-format msgid "Select the Database Backend" msgstr "Selecteer de Database Backend" #: setupassistant.cpp:92 #, kde-format msgid "Sqlite File Name" msgstr "SQLite bestandsnaam" #: setupassistant.cpp:146 #, kde-format msgid "MySql Detail Information" msgstr "Gedetailleerde MySql-informatie" #: setupassistant.cpp:188 #, kde-format msgid "Create Database" msgstr "Database creëren" #: setupassistant.cpp:210 setupassistant.cpp:223 #, kde-format msgid "0/%1" msgstr "0/%1" #: setupassistant.cpp:242 setupassistant.cpp:252 setupassistant.cpp:290 #, kde-format msgid "%1/%2" msgstr "%1/%2" #: setupassistant.cpp:265 #, kde-format msgid "Upgrade the Database" msgstr "Database opwaarderen" #: setupassistant.cpp:314 #, kde-format msgid "Your Company Address" msgstr "Uw bedrijfsadres" #: setupassistant.cpp:319 #, kde-format msgid "" "Select your companies address either from the address book or enter it " "manually. It is set as a consigner on the documents." msgstr "" "Selecteer in het adresboek uw eigen adres of voer het handmatig in. Deze " "wordt gebruikt als afzender in de documenten." #: setupassistant.cpp:328 #, kde-format msgid "Select from Addressbook" msgstr "Selecteer in adresboek" #: setupassistant.cpp:418 #, kde-format msgid "Final Status" msgstr "Final Status" #: setupassistant.cpp:512 #, kde-format msgid "" "

              Can't connect to your database. Are you sure your credentials are correct" " and the database exists?

              " msgstr "" "

              Kan geen verbinding maken met de database. Weet u zeker dat uw " "instellingen correct zijn en dat de database bestaat?

              " #: setupassistant.cpp:523 #, kde-format msgid "

              Can't open your database file, check the permissions and such." msgstr "" "Kan het databasebestand niet openen, controleer de permissies en " "dergelijke.

              " #: setupassistant.cpp:532 #, kde-format msgid "" "

              The database is already existing, no action needs to be taken " "here.

              Please hit next to proceed.

              " msgstr "" "

              De database bestaat al, verdere acties zijn niet nodig.

              Druk op " "volgende om verder te gaan.

              " #: setupassistant.cpp:581 #, kde-format msgid "

              The database setup was successfully completed.

              " msgstr "

              De database is succesvol gecreëerd.

              " #: setupassistant.cpp:582 #, kde-format msgid "

              You can start to work with Kraft now. Please do not forget to

              " msgstr "

              U kunt nu met Kraft gaan werken. Vergeet niet om

              " #: setupassistant.cpp:584 #, kde-format msgid "
            • adjust various settings in the Kraft Preferences dialog.
            • " msgstr "" "
            • in het dialoogvenster van Kraft voor de voorkeursinstellingen diverse " "instellingen aan te passen.
            • " #: setupassistant.cpp:585 #, kde-format msgid "
            • Check the Catalog chapter list.
            • " msgstr "
            • Bekijk de lijst met catalogus-mappen.
            • " #: setupassistant.cpp:586 #, kde-format msgid "
            • Make your business and have fun.
            • " msgstr "
            • Zet uw eigen bedrijf op en heb veel plezier ermee.
            • " #: setupassistant.cpp:588 #, kde-format msgid "" "

              If you press Finish now, the new database configuration is stored " "in Krafts configuration.

              " msgstr "" "

              Als u nu op Voltooien drukt, dan wordt de nieuwe database " "configuratie in de configuratie van Kraft opgeslagen.

              " #: setupassistant.cpp:604 #, kde-format msgid "Database cannot be connected. Please check the database credentials." msgstr "" "Verbinding met de database is niet mogelijk. Controleer de gegevens van " "dedatabase." #: setupassistant.cpp:610 #, kde-format msgid "Database core tables do not exist. Please check the initial setup." msgstr "" "De basistabellen in de database zijn onvindbaar. voer de initiële aanmaak " "opnieuw uit." #: setupassistant.cpp:617 #, kde-format msgid "Database is up-to-date. No upgrade is required." msgstr "De database is up-to-date. Bijwerken is niet nodig." #: setupassistant.cpp:622 #, kde-format msgid "Parsing update commands…" msgstr "Bezig met het bijwerken…" #: setupassistant.cpp:665 #, kde-format msgid "Upgrade failed!" msgstr "Het bijwerken is mislukt!" #: setupassistant.cpp:667 #, kde-format msgid "Upgrade succeeded, the current schema version is %1!" msgstr "Het bijwerken is gelukt, de versie van het huidige schema is %1!" #: setupassistant.cpp:680 #, kde-format msgid "Cannot connect to the database. Please check the database credentials!" msgstr "" "Verbinding met de database is niet mogelijk Controleer de gegevens van " "database!" #: setupassistant.cpp:686 #, kde-format msgid "Parsing creation commands…" msgstr "Bezig met het aanmaken van de database…" #: setupassistant.cpp:694 #, kde-format msgid "Parsing database fill-up commands…" msgstr "Bezig met het vullen van de database…" #: setupassistant.cpp:707 #, kde-format msgid "Processing database creation commands…" msgstr "Bezig met het aanmaken van de database…" #: setupassistant.cpp:724 #, kde-format msgid "Process database fill-up commands…" msgstr "Bezig met het vullen van de database…" #: setupassistant.cpp:734 #, kde-format msgid "Commands finished successfully." msgstr "Opdrachten zijn succesvol uitgevoerd." #: setupassistant.cpp:736 #, kde-format msgid "Failed to perform all commands." msgstr "Niet alle commando's konden worden uitgevoerd." #: setupassistant.cpp:780 #, kde-format msgid "" "This assistant guides you through the basic settings of your Kraft " "installation." msgstr "" "Deze assistent leidt u door de basisinstellingen van uw Kraft installatie." #: setupassistant.cpp:790 #, kde-format msgid "No database configuration found." msgstr "Er is geen database configuratie gevonden." #: setupassistant.cpp:792 #, kde-format msgid "A valid current database configuration file was found." msgstr "Er is een geldige database configuratie gevonden." #: setupassistant.cpp:814 #, kde-format msgid "The database schema version is too old. It will be updated." msgstr "De database-indeling is te oud, Het zal worden bijgewerkt" #: setupassistant.cpp:817 #, kde-format msgid "The current database schema version is too new. Leaving untouched! " msgstr "Het huidige database-schemaversie is te hoog Laat het ongewijzigd!" #: setupassistant.cpp:824 #, kde-format msgid "" "

              The database can be opened, but does not contain valid content.

              A " "new database can be created automatically from scratch.

              " msgstr "" "

              De database kan worden geopend, maar heeft geen geldige inhoud.

              >

              U " "kunt een nieuwe database vanaf nul aanmaken.

              " #: setupassistant.cpp:831 #, kde-format msgid "

              Kraft failed to connect to the configured database.

              " msgstr "

              Kraft kon geen verbinding maken met de ingestelde database.

              " #: setupassistant.cpp:833 #, kde-format msgid "" "

              Please check the database server setup and restart Kraft to connect." msgstr "" "

              Controleer de instellingen van de database server en herstart Kraft om " "verbinding te maken." #: setupassistant.cpp:835 #, kde-format msgid "

              Please check the database file." msgstr "

              Controleer het databasebestand." #: setupassistant.cpp:837 #, kde-format msgid "Or create a new database by pressing Next.

              " msgstr "" "of maak een nieuwe database aan door te klikken op volgende.

              " #: setupassistant.cpp:845 #, kde-format msgid "

              Please hit Next, and follow the instructions.

              " msgstr "

              Klik op volgende en volg de instructies.

              " #: tagtemplatesdialog.cpp:47 #, kde-format msgid "Edit Tag Template" msgstr "Tag sjabloon bewerken" #: tagtemplatesdialog.cpp:54 #, kde-format msgid "Edit a Tag Template" msgstr "Tag sjabloon bewerken" #: tagtemplatesdialog.cpp:55 #, kde-format msgid "Adjust settings for name, color and description." msgstr "Instellingen wijzigen voor naam, kleur en beschrijving." #: tagtemplatesdialog.cpp:58 rc.cpp:446 #, kde-format msgid "Name:" msgstr "Naam:" #: tagtemplatesdialog.cpp:63 #, kde-format msgid "Description:" msgstr "Beschrijving:" #: tagtemplatesdialog.cpp:69 #, kde-format msgid "Associated color:" msgstr "Gekozen kleur" #: tagtemplatesdialog.cpp:141 #, kde-format msgid "Add, edit and remove tag templates for use in the documents." msgstr "" "Hier voegt u toe, bewerkt en verwijdert u tag sjablonen die in documenten " "worden gebruikt." #: tagtemplatesdialog.cpp:165 #, kde-format msgid "Add…" msgstr "Toevoegen…" #: tagtemplatesdialog.cpp:167 rc.cpp:60 rc.cpp:99 rc.cpp:138 #, kde-format msgid "Edit…" msgstr "Bewerken…" #: tagtemplatesdialog.cpp:170 #, kde-format msgid "Delete…" msgstr "Verwijderen…" #: tagtemplatesdialog.cpp:223 #, kde-format msgid "Do you really want to delete the template?" msgstr "Wilt u het sjabloon verwijderen? " #: taxeditdialog.cpp:36 #, kde-format msgid "Edit Tax Rates" msgstr "Belastingtarieven bewerken" #: templkataloglistview.cpp:45 texteditdialog.cpp:76 rc.cpp:6 #, kde-format msgid "Template" msgstr "Sjabloon" #: templkataloglistview.cpp:47 #, kde-format msgid "Calc. Type" msgstr "Berekeningsmethode" #: templkataloglistview.cpp:54 #, kde-format msgid "Template Catalog" msgstr "Sjabloon catalogus" #: templkatalogview.cpp:101 #, kde-format msgid "" msgstr "" #: templtopositiondialogbase.cpp:35 rc.cpp:500 #, kde-format msgid "Create Item from Template" msgstr "Item van sjabloon creëren" #: templtopositiondialogbase.cpp:51 #, kde-format msgid "the Header of the Document as first item" msgstr "Het briefhoofd van het document als eerste item" #: texteditdialog.cpp:42 #, kde-format msgid "Edit Text Templates" msgstr "Tekst sjablonen bewerken" #: texteditdialog.cpp:62 #, kde-format msgid "Edit %1 Template" msgstr "%1 sjabloon bewerken" #: textselection.cpp:42 #, kde-format msgid "Template Collection" msgstr "Verzameling sjablonen" #: textselection.cpp:100 #, kde-format msgid "Template Actions" msgstr "Template Actions" #: textselection.cpp:129 #, kde-format msgid "This is the standard text used in new documents." msgstr "Dit is de standaard tekst voor nieuwe documenten." #: textselection.cpp:138 #, kde-format msgid "%1 Templates for %2" msgstr "%1 sjablonen voor %2" #: textselection.cpp:146 #, kde-format msgid "" "There is no %1 template text available for document type %2.
              Click the " "add-button below to create one." msgstr "" "Er is geen %1 tekstsjabloon beschikbaar voor document type %2.
              Klik op " "de knop voor toevoegen hieronder om een te creëren." #: textselection.cpp:201 #, kde-format msgid "&Use in Document" msgstr "Gebr&uikt in document" #: texttemplate.cpp:103 #, kde-format msgid "Failed to open template source" msgstr "Openen van sjablonen is mislukt" #: texttemplateinterface.cpp:53 #, kde-format msgid "No file name given for template" msgstr "Geen bestandsnaam opgegeven voor sjabloon" #: texttemplateinterface.cpp:61 #, kde-format msgid "Could not find template file %1" msgstr "Kan sjabloonbestand %1 niet vinden" #: timecalcpart.cpp:82 #, kde-format msgid "Minutes" msgstr "Minuten" #: timecalcpart.cpp:84 #, kde-format msgid "Hours" msgstr "Uren" #: timecalcpart.cpp:86 #, kde-format msgid "Seconds" msgstr "Seconden" #: rc.cpp:9 #, kde-format msgid "Text:" msgstr "Tekst:" #: rc.cpp:12 #, kde-format msgid "&Store in Chapter" msgstr "Op&slaan in map" #: rc.cpp:15 #, kde-format msgid "&Unit" msgstr "&Eenheid" #: rc.cpp:18 #, kde-format msgid "&Count Time for Overalltime" msgstr "Totale tijd &bijhouden" #: rc.cpp:24 #, kde-format msgid "full" msgstr "volledig" #: rc.cpp:27 #, kde-format msgid "half" msgstr "half" #: rc.cpp:30 #, kde-format msgid "Time Calculation" msgstr "Post arbeid" #: rc.cpp:33 rc.cpp:72 rc.cpp:111 #, kde-format msgid "text" msgstr "Tekst" #: rc.cpp:36 #, kde-format msgid "Time measureable effort for this template:" msgstr "Nodige tijd voor dit sjabloon" #: rc.cpp:39 rc.cpp:81 rc.cpp:117 #, kde-format msgid "Label" msgstr "Label" #: rc.cpp:42 #, kde-format msgid "Duration" msgstr "Tijdsduur" #: rc.cpp:45 #, kde-format msgid "Hourly Rate" msgstr "Uurtarief" #: rc.cpp:48 #, kde-format msgid "Glob. Rate" msgstr "Project-tarief" #: rc.cpp:51 #, kde-format msgid "Adds a new time calculation part to the template" msgstr "Voeg nieuwe post tijd aan het sjabloon toe" #: rc.cpp:54 rc.cpp:93 rc.cpp:132 #, kde-format msgid "New…" msgstr "Nieuw…" #: rc.cpp:57 #, kde-format msgid "Edits the current time calculation part" msgstr "Bewerk de geselecteerde post tijd" #: rc.cpp:63 #, kde-format msgid "Deletes the current time calculation part" msgstr "Verwijder de geselecteerde post tijd" #: rc.cpp:66 rc.cpp:105 rc.cpp:144 #, kde-format msgid "delete" msgstr "verwijderen" #: rc.cpp:69 #, kde-format msgid "Fix Costs" msgstr "Vaste kosten" #: rc.cpp:75 #, kde-format msgid "Fix costs for this template per one unit:" msgstr "Vaste kosten in dit sjabloon per eenheid:" #: rc.cpp:84 #, kde-format msgid "Single Price" msgstr "Stuksprijs" #: rc.cpp:87 #, kde-format msgid "Overall Price" msgstr "Totale prijs" #: rc.cpp:90 #, kde-format msgid "adds a new fix calculation part" msgstr "Voeg nieuwe post vaste kosten toe" #: rc.cpp:96 #, kde-format msgid "edits the current fix calculation part" msgstr "Bewerk de geselecteerde post vaste kosten" #: rc.cpp:102 #, kde-format msgid "deletes the current fix calculation part" msgstr "Verwijder de geselecteerde post vaste kosten" #: rc.cpp:114 #, kde-format msgid "Needed materials for one unit of this template:" msgstr "Benodigde materiaal voor één exemplaar van dit sjabloon:" #: rc.cpp:129 #, kde-format msgid "adds a new material calculation part" msgstr "Voeg nieuwe post materiaal toe" #: rc.cpp:135 #, kde-format msgid "edits the current material part" msgstr "Bewerk de geselecteerde post materiaal" #: rc.cpp:141 #, kde-format msgid "deletes the current material calculation part" msgstr "Verwijdert de geselecteerde post materiaal" #: rc.cpp:147 #, kde-format msgid "Overall Price per Unit" msgstr "Totale prijs per eenheid" #: rc.cpp:150 #, kde-format msgid "&Manual Price" msgstr "Hand&matige prijs" #: rc.cpp:153 #, kde-format msgid "Calculated Price" msgstr "Berekende prijs" #: rc.cpp:156 #, kde-format msgid "Fixed costs part:" msgstr "Post vaste kosten:" #: rc.cpp:159 #, kde-format msgid "Material part:" msgstr "Post materiaal:" #: rc.cpp:162 #, kde-format msgid "Profit:" msgstr "Winst:" #: rc.cpp:166 #, no-c-format, kde-format msgid " %" msgstr " %" #: rc.cpp:169 #, kde-format msgid "Time calculation part:" msgstr "Post arbeid:" #: rc.cpp:172 #, kde-format msgid "Calculated price:" msgstr "Berekende prijs:" #: rc.cpp:175 #, kde-format msgid "88.888,88 €" msgstr "88.888,88 €" #: rc.cpp:178 #, kde-format msgid "Database creation and initial schema setup:" msgstr "Aanmaken van database en initiële setup van schema:" #: rc.cpp:185 rc.cpp:198 rc.cpp:903 #, kde-format msgid "0 / 129" msgstr "0 / 129" #: rc.cpp:188 rc.cpp:201 rc.cpp:906 #, kde-format msgid "X" msgstr "X" #: rc.cpp:191 #, kde-format msgid "Filling the database with initial values:" msgstr "Bezig met het vullen van de database met beginwaarden:" #: rc.cpp:204 rc.cpp:909 #, kde-format msgid "Status: " msgstr "Status: " #: rc.cpp:207 #, kde-format msgid "Database setup status…" msgstr "Status van het instellen van de database…" #: rc.cpp:210 #, kde-format msgid "Bruns data file:" msgstr "Bruns gegevensbestand:" #: rc.cpp:213 #, kde-format msgid "Bruns key file:" msgstr "Bruns indexbestand:" #: rc.cpp:216 #, kde-format msgid "Qt database driver:" msgstr "Databasestuurprogramma voor Qt:" #: rc.cpp:219 #, kde-format msgid "Database server:" msgstr "Database Server:" #: rc.cpp:222 #, kde-format msgid "Server port:" msgstr "Serverpoort:" #: rc.cpp:225 #, kde-format msgid "Database Name" msgstr "Databasenaam" #: rc.cpp:228 rc.cpp:752 #, kde-format msgid "Database user:" msgstr "Database gebruiker:" #: rc.cpp:231 #, kde-format msgid "Database password:" msgstr "Wachtwoord van database:" #: rc.cpp:234 #, kde-format msgid "The default database name when creating new databases" msgstr "De standaard databasenaam bij het creëren van nieuwe databases" #: rc.cpp:237 #, kde-format msgid "File Name" msgstr "Bestandsnaam" #: rc.cpp:240 #, kde-format msgid "The path where database file are stored. Leave empty!" msgstr "Het pad waar het databasebestand is opgeslagen, laat dit leeg!" #: rc.cpp:243 #, kde-format msgid "Database update:" msgstr "Bijwerken database:" #: rc.cpp:246 #, kde-format msgid "Overall progress:" msgstr "Totale voortgang:" #: rc.cpp:253 #, kde-format msgid "Detailed progress:" msgstr "Details van de voortgang:" #: rc.cpp:260 #, kde-format msgid "Status:" msgstr "Status:" #: rc.cpp:263 #, kde-format msgid "" "

              Kraft uses a database backend to store values. By " "default it uses a file based database with easy setup targeted to single " "user mode.


              " msgstr "" "

              Kraft gebruikt als backend een database om waarden in " "op te slaan. Standaard gebruikt het een makkelijk op te zetten database " "bedoeld voor gebruik door een enkele " "gebruiker.


              " #: rc.cpp:266 #, kde-format msgid "SQLite 3 - file based database (default)" msgstr "SQLite 3 - bestand gebaseerde database (standaard)" #: rc.cpp:269 #, kde-format msgid "MySQL Serverbased Database for advanced Setups" msgstr "MySQL Servergebaseerde Database voor een geavanceerde opzet" #: rc.cpp:272 #, kde-format msgid "Footer Texts" msgstr "Voettekst" #: rc.cpp:275 #, kde-format msgid "&Summary text on last page:" msgstr "&Samenvatting op laatste pagina:" #: rc.cpp:278 #, kde-format msgid "&Greeting:" msgstr "Be&groeting:" #: rc.cpp:284 #, kde-format msgid "Document &tax:" msgstr "Belas&ting per document:" #: rc.cpp:287 #, kde-format msgid "TextLabel" msgstr "TekstLabel" #: rc.cpp:290 #, kde-format msgid "&Project:" msgstr "&Project:" #: rc.cpp:293 #, kde-format msgid "&Whiteboard:" msgstr "&Whiteboard:" #: rc.cpp:296 #, kde-format msgid "" "Enter a label that describes the project. This may appear on the customer " "document." msgstr "" "Geef een label op dat het project beschrijft. Dit kan ook op het document " "voor de klant verschijnen." #: rc.cpp:299 #, kde-format msgid "Postal &address:" msgstr "Post &Adres:" #: rc.cpp:302 #, kde-format msgid "not selected" msgstr "niet ingesteld" #: rc.cpp:305 #, kde-format msgid "Select an addressee from the address books." msgstr "Selecteer een adres in het adresboek." #: rc.cpp:311 #, kde-format msgid "&Salutatory address:" msgstr "Aanhef:" #: rc.cpp:314 #, kde-format msgid "Customer:" msgstr "Klant:" #: rc.cpp:317 #, kde-format msgid "&Entry text on first page:" msgstr "&Inleidende tekst op eerste pagina:" #: rc.cpp:320 rc.cpp:785 #, kde-format msgid "Click to add a new document type to the list." msgstr "Klik om een nieuw documenttype aan de lijst toe te voegen." #: rc.cpp:326 #, kde-format msgid "click to edit the selected document type name" msgstr "Klik om de naam van het geselecteerde documenttype te bewerken." #: rc.cpp:332 rc.cpp:791 #, kde-format msgid "click to remove the current document type" msgstr "Klik om het geselecteerde documenttype te verwijderen." #: rc.cpp:338 #, kde-format msgid "Unique Document Number" msgstr "Uniek documentnummer" #: rc.cpp:341 #, kde-format msgid "Number &cycle:" msgstr "Volg&nummer:" #: rc.cpp:344 rc.cpp:353 rc.cpp:356 rc.cpp:776 #, kde-format msgid "example" msgstr "voorbeeld" #: rc.cpp:347 #, kde-format msgid "Ident template:" msgstr "Ident template:" #: rc.cpp:350 #, kde-format msgid "Example ID:" msgstr "Voorbeeld volgnummer:" #: rc.cpp:359 #, kde-format msgid "Counter:" msgstr "Teller:" #: rc.cpp:362 #, kde-format msgid "&Edit Number Cycles…" msgstr "Volgnummersysteem inst&ellen…" #: rc.cpp:365 #, kde-format msgid "Document Type Options" msgstr "" #: rc.cpp:368 #, kde-format msgid "Enable XRechung Support " msgstr "" #: rc.cpp:371 #, kde-format msgid "PDF Creation and Postprocessing" msgstr "Creatie en nabewerking van PDF" #: rc.cpp:374 #, kde-format msgid "&Template file:" msgstr "Sjabloon-bes&tand:" #: rc.cpp:377 rc.cpp:401 rc.cpp:407 #, kde-format msgid "select" msgstr "Selecteren" #: rc.cpp:380 #, kde-format msgid "W&atermark:" msgstr "W&atermerk:" #: rc.cpp:383 #, kde-format msgid "no watermark" msgstr "geen watermerk" #: rc.cpp:386 #, kde-format msgid "on first page" msgstr "op eerste pagina" #: rc.cpp:389 #, kde-format msgid "on all pages" msgstr "op alle pagina´s" #: rc.cpp:392 #, kde-format msgid "alternating (3 pages)" msgstr "Afwisselend (3 pagina's)" #: rc.cpp:395 #, kde-format msgid "different first and last page (3 pages)" msgstr "Afwijkende eerste en laatste pagina (3 pagina's)" #: rc.cpp:398 #, kde-format msgid "Watermark fi&le:" msgstr "" #: rc.cpp:404 #, kde-format msgid "Append &PDF:" msgstr "" #: rc.cpp:410 #, kde-format msgid "Calculation Parts Fix" msgstr "Post vaste kosten" #: rc.cpp:413 #, kde-format msgid "

              Fix Cost Parts

              " msgstr "

              Post vaste kosten

              " #: rc.cpp:416 #, kde-format msgid "Add a fix cost for one unit of the template:" msgstr "Voert één post vaste kosten toe aan dit sjabloon:" #: rc.cpp:419 rc.cpp:860 #, kde-format msgid "&Label:" msgstr "&Label:" #: rc.cpp:422 #, kde-format msgid "describing text" msgstr "Omschrijving" #: rc.cpp:425 #, kde-format msgid "amortisation" msgstr "korting" #: rc.cpp:428 rc.cpp:732 #, kde-format msgid "&Amount:" msgstr "&Aantal:" #: rc.cpp:431 #, kde-format msgid "amount multiplier" msgstr "amount multiplier" #: rc.cpp:434 #, kde-format msgid "at &Price:" msgstr "voor de prijs van:" #: rc.cpp:437 rc.cpp:735 #, kde-format msgid "Price for one piece" msgstr "Prijs per stuk" #: rc.cpp:440 #, kde-format msgid "€" msgstr "€" #: rc.cpp:443 #, kde-format msgid "Form" msgstr "Formulier" #: rc.cpp:449 #, kde-format msgid "Organization:" msgstr "Organisatie:" #: rc.cpp:452 #, kde-format msgid "Street:" msgstr "Straat:" #: rc.cpp:455 #, kde-format msgid "Post code:" msgstr "Postcode:" #: rc.cpp:458 #, kde-format msgid "City:" msgstr "Stad:" #: rc.cpp:461 #, kde-format msgid "Phone:" msgstr "Telefoon:" #: rc.cpp:464 #, kde-format msgid "Fax:" msgstr "Fax:" #: rc.cpp:467 #, kde-format msgid "Mobile phone:" msgstr "GSM:" #: rc.cpp:470 #, kde-format msgid "Email:" msgstr "E-mail:" #: rc.cpp:473 #, kde-format msgid "Website:" msgstr "Website:" #: rc.cpp:476 #, kde-format msgid "Import Document Items" msgstr "Document-items importeren" #: rc.cpp:479 #, kde-format msgid "Import information" msgstr "Informatie importeren" #: rc.cpp:482 #, kde-format msgid "Select a &File to import from:" msgstr "Selecteer een bestand voor de import:" #: rc.cpp:485 #, kde-format msgid "FixMe!" msgstr "FixMe!" #: rc.cpp:488 #, kde-format msgid "Import &Schema:" msgstr "&Schema importeren" #: rc.cpp:491 #, kde-format msgid "this is interesting information about the selected schema" msgstr "Dit is interessante informatie over het gekozen schema" #: rc.cpp:494 #, kde-format msgid "Insert all Items &after" msgstr "Alle items invoegen n&a" #: rc.cpp:497 rc.cpp:521 #, kde-format msgid "Tags" msgstr "Tags" #: rc.cpp:503 #, kde-format msgid "New Item Text" msgstr "Nieuw item-tekst" #: rc.cpp:506 #, kde-format msgid "&insert" msgstr "&Invoegen" #: rc.cpp:509 #, kde-format msgid "à" msgstr "per" #: rc.cpp:512 #, kde-format msgid "&after item" msgstr "n&a item" #: rc.cpp:515 #, kde-format msgid "Keep this item as template for future documents" msgstr "Dit item als sjabloon bewaren voor latere documenten" #: rc.cpp:518 #, kde-format msgid "save in &chapter" msgstr "Ops&laan in map" #: rc.cpp:530 #, kde-format msgid "Do Database Initialisation" msgstr "Database opnieuw opstarten" #: rc.cpp:533 #, kde-format msgid "Do XML archiving of documents they're printed?" msgstr "Documenten bij het afdrukken als XML archiveren?" #: rc.cpp:536 #, kde-format msgid "" "Where Kraft stores the XML archive documents. If empty, KDEHOME/share/apps " "is used." msgstr "" "Waar Kraft de XML archieven opslaat. Als dit leeg is dan wordt " "KDEHOME/share/apps gebruikt." #: rc.cpp:539 #, kde-format msgid "The local xml document storage path" msgstr "De locatie voor de lokaal opgeslagen XML documenten" #: rc.cpp:542 #, kde-format msgid "Default mail user agent. Set xdg for xdg-email" msgstr "" "Standaard email programma. Stel in op xdg voor het programma xdg-email." #: rc.cpp:545 rc.cpp:548 #, kde-format msgid "The default geometry of the document view dialog" msgstr "" "De standaard grootte van het dialoogvenster voor het weergeven van het " "document." #: rc.cpp:551 #, kde-format msgid "The current state of the portal" msgstr "De huidige status van de portal" #: rc.cpp:554 #, kde-format msgid "The current geometry of the portal" msgstr "De huidige opbouw van de portal" #: rc.cpp:557 #, kde-format msgid "The current geometry of the new doc assistant" msgstr "De huidige opbouw van de nieuwe document assistent" #: rc.cpp:560 #, kde-format msgid "The splitter position of the document view dialog" msgstr "De schuifpijl-positie van de document weergave" #: rc.cpp:563 #, kde-format msgid "The default size of the material catalog view" msgstr "" "De standaard grootte van het dialoog voor het weergeven van de " "materiaalcatalogus." #: rc.cpp:566 #, kde-format msgid "The splitter setting for the doc assistant" msgstr "De schuifpijl-instelling voor de document assistent" #: rc.cpp:569 #, kde-format msgid "The window size of the template to document dialog for plants" msgstr "" "Het venstergrootte voor het sjabloon van het documentendialoog voor planten" #: rc.cpp:572 #, kde-format msgid "The window size of the template to document dialog" msgstr "De venstergrootte van het sjabloon voor het documentendialoog" #: rc.cpp:575 #, kde-format msgid "The digest list column arrangement for the Latest-list" msgstr "De indeling van de lijst met de meest recente documenten" #: rc.cpp:578 #, kde-format msgid "The digest list column arrangement for the all-list" msgstr "De indeling van de lijst met alle documenten" #: rc.cpp:581 #, kde-format msgid "The digest list column arrangement for timeline" msgstr "De indeling van de lijst met de tijdbalk" #: rc.cpp:584 #, kde-format msgid "The sizes of the slider in the address picker Widget" msgstr "De grootte van de schuif in het dialoog voor adresselectie" #: rc.cpp:587 #, kde-format msgid "The state of the treeview inside the address selector widget" msgstr "The state of the treeview inside the address selector widget" #: rc.cpp:590 #, kde-format msgid "Size of the address select dialog" msgstr "Grootte van adres zoekvenster" #: rc.cpp:593 #, kde-format msgid "State of the window of the material catalog" msgstr "State of the window of the material catalog" #: rc.cpp:596 #, kde-format msgid "Geometry of the material catalog" msgstr "Opbouw van de materiaal catalogus" #: rc.cpp:599 #, kde-format msgid "State of the header of the material catalog" msgstr "State of the header of the material catalog" #: rc.cpp:602 #, kde-format msgid "State of the window of the template catalog" msgstr "State of the window of the template catalog" #: rc.cpp:605 #, kde-format msgid "Geometry the template catalog" msgstr "Geometry the template catalog" #: rc.cpp:608 #, kde-format msgid "State of the header of the template catalog" msgstr "State of the header of the template catalog" #: rc.cpp:611 #, kde-format msgid "" "Default percentage the sale price for a material should be higher than its " "purchase price" msgstr "" "Standaard moet voor materiaal de verkoopprijs hoger zijn dan de inkoopprijs" #: rc.cpp:614 #, kde-format msgid "The name of the last selected chapter in the catalog" msgstr "The name of the last selected chapter in the catalog" #: rc.cpp:617 #, kde-format msgid "The complete filename of the trml2pdf binary" msgstr "Het complete bestandsnaam van het programma trml2pdf" #: rc.cpp:620 #, kde-format msgid "The path to the output directory for document pdfs" msgstr "De uitvoermap voor de PDF van het document" #: rc.cpp:623 #, kde-format msgid "The last created doc type." msgstr "Laatst aangemaakte documenttype." #: rc.cpp:626 #, kde-format msgid "The date format for print." msgstr "De datum-instelling voor uitgeprinte documenten." #: rc.cpp:629 #, kde-format msgid "The greeting below on the document footer." msgstr "Afsluitingstekst in voettekst." #: rc.cpp:632 #, kde-format msgid "The salut message on the document header." msgstr "De begroetingstekst in het briefhoofd." #: rc.cpp:635 #, kde-format msgid "" "The name of the catalog chapter where to store new templates in by default" msgstr "" "De naam van de map in de catalogus waar standaard nieuwe sjablonen worden " "opgeslagen" #: rc.cpp:638 #, kde-format msgid "The name of the last used import schema for items." msgstr "De naam van de laatst gebruikte schema voor het importeren van items." #: rc.cpp:641 #, kde-format msgid "The name of the last used input file for items." msgstr "De naam van de laatst gebruikte importbestand voor items." #: rc.cpp:644 #, kde-format msgid "" "User name as reference to the KAddressbook to identify 'my' address " "(DEPRECATED)." msgstr "" "Gebruikersnaam als referentie naar het KAddressbook om \"mijn\" adres te " "identificeren (Verouderd)." #: rc.cpp:647 #, kde-format msgid "" "UID of the user as reference to the KAddressbook to identify 'my' address." msgstr "" "UID van de gebruiker als referentie naar het KAddressbook om \"mijn\" adres " "te identificeren." #: rc.cpp:650 #, kde-format msgid "Bank account name." msgstr "Naam voor bankrekening." #: rc.cpp:653 #, kde-format msgid "Business Identifier Code\" (BIC) of the bank." msgstr "Business Identifier Code\" (BIC) van de bank." #: rc.cpp:656 #, kde-format msgid "IBAN of the bank account." msgstr "IBAN van de bankrekening" #: rc.cpp:659 #, kde-format msgid "The doc id template" msgstr "The doc id template" #: rc.cpp:662 #, kde-format msgid "Localization on document level" msgstr "Per document taal instellen" #: rc.cpp:665 #, kde-format msgid "The tax default for new documents." msgstr "De standaard belastingtarief voor nieuwe documenten." #: rc.cpp:668 #, kde-format msgid "The label for alternative positions" msgstr "Het label voor alternatieve posities" #: rc.cpp:671 rc.cpp:674 #, kde-format msgid "The label for demand positions" msgstr "Het label voor meerwerk-posten" #: rc.cpp:677 #, kde-format msgid "Display the EPC Code as long as the doc sum is below this value." msgstr "Toon de EPC-code zolang de totale waarde onder dit getal is." #: rc.cpp:683 #, kde-format msgid "Settings" msgstr "Instellingen" #: rc.cpp:689 #, kde-format msgid "Edit Material" msgstr "Materiaal bewerken" #: rc.cpp:692 #, kde-format msgid "Store in C&hapter" msgstr "Op&slaan in map" #: rc.cpp:698 #, kde-format msgid "Pac&kaged:" msgstr "Verpa&kt per:" #: rc.cpp:701 #, kde-format msgid "per P&ackage" msgstr "per verp&akking" #: rc.cpp:704 #, kde-format msgid "Prices" msgstr "Prijzen" #: rc.cpp:707 #, kde-format msgid "= Price of &sale:" msgstr "=Verkoopprij&s:" #: rc.cpp:710 #, kde-format msgid "pl&us" msgstr "pl&us" #: rc.cpp:714 rc.cpp:807 #, no-c-format, kde-format msgid "%" msgstr "%" #: rc.cpp:717 #, kde-format msgid "&Purchase price:" msgstr "Inkoo&pprijs:" #: rc.cpp:720 #, kde-format msgid "Calculation Item Material" msgstr "Het item materiaal berekenen" #: rc.cpp:723 #, kde-format msgid "

              Calculation Part 'Material'

              " msgstr "

              Onderdeel \"Materiaal\" berekenen

              " #: rc.cpp:726 #, kde-format msgid "Add Material to the template calculation." msgstr "Materiaal toevoegen aan de berekening in het sjabloon." #: rc.cpp:729 #, kde-format msgid "material" msgstr "materiaal" #: rc.cpp:738 #, kde-format msgid "unit" msgstr "eenheid" #: rc.cpp:741 #, kde-format msgid "" "Please enter the MySQL Database server settings. \n" "\n" "For detailed setup instructions for the MySQL to use with Kraft please check the Kraft website." msgstr "" "Voer de instellingen in voor de MySQL Database server. \n" "\n" "Ga voor gedetailleerde instructies voor hoe MySQL samen met Kraft te gebruiken naar de website van Kraft." #: rc.cpp:746 #, kde-format msgid "Database host:" msgstr "Database Host:" #: rc.cpp:749 #, kde-format msgid "Database name:" msgstr "Databasenaam:" #: rc.cpp:755 #, kde-format msgid "Password:" msgstr "Wachtwoord:" #: rc.cpp:758 #, kde-format msgid "

              Edit Number Cycles

              " msgstr "

              Volgnummersysteem bewerken

              " #: rc.cpp:761 #, kde-format msgid "Number Cycle Details" msgstr "Details volgnummers" #: rc.cpp:764 #, kde-format msgid "&Number cycle:" msgstr "&Volg&nummer:" #: rc.cpp:767 #, kde-format msgid "&Counter:" msgstr "&Teller:" #: rc.cpp:770 #, kde-format msgid "Example Id:" msgstr "Voorbeeld volgnummer:" #: rc.cpp:773 #, kde-format msgid "ident &Template:" msgstr "id van &Sjabloon:" #: rc.cpp:779 #, kde-format msgid "&Select a number cycle and edit the details on the right:" msgstr "&Selecteer een volgnummersysteem en wijzig de details rechts:" #: rc.cpp:782 #, kde-format msgid "New Item" msgstr "Nieuw item" #: rc.cpp:788 #, kde-format msgid "add" msgstr "toevoegen" #: rc.cpp:794 #, kde-format msgid "remove" msgstr "verwijderen" #: rc.cpp:797 #, kde-format msgid "1." msgstr "1." #: rc.cpp:800 rc.cpp:803 #, kde-format msgid "D" msgstr "D" #: rc.cpp:810 #, kde-format msgid "of the sum of" msgstr "voor de som van" #: rc.cpp:813 #, kde-format msgid "" "Please enter the settings for the SQLite database.\n" "\n" "Pick a filename to name the SQLite database file or leave the default setting." msgstr "" "Voer de instellingen in voor de SQLite Database\n" "\n" "Geef een bestandsnaam op voor het SQLite databasebestand of gebruik de standaardwaarde." #: rc.cpp:818 #, kde-format msgid "store the database file at default place." msgstr "Sla het databasebestand op de standaard locatie op." #: rc.cpp:821 #, kde-format msgid "select a file name:" msgstr "Bestandsnaam selecteren:" #: rc.cpp:824 #, kde-format msgid "

              Add a Tax Rate

              " msgstr "

              BTW-tarief toevoegen

              " #: rc.cpp:827 #, kde-format msgid "Start-Date:" msgstr "Startdatum:" #: rc.cpp:830 #, kde-format msgid "&Reduced tax rate:" msgstr "&Laag BTW-tarief:" #: rc.cpp:833 #, kde-format msgid "&Full Tax Rate:" msgstr "&Hoog BTW-tarief:" #: rc.cpp:836 #, kde-format msgid "Edit Document Text Template" msgstr "Het tekstsjabloon van het document bewerken" #: rc.cpp:839 #, kde-format msgid "&Name:" msgstr "&Naam:" #: rc.cpp:842 #, kde-format msgid "displayed as" msgstr "getoond als" #: rc.cpp:845 #, kde-format msgid "in doc type" msgstr "In documenttype" #: rc.cpp:848 #, kde-format msgid "&Text:" msgstr "&Tekst:" #: rc.cpp:851 #, kde-format msgid "Calculation Item Time" msgstr "Arbeid berekenen" #: rc.cpp:854 #, kde-format msgid "

              Calculation Part 'Time'

              " msgstr "

              Post arbeid

              " #: rc.cpp:857 #, kde-format msgid "" "Calculate time efforts here for one unit of the template.
              Note that the" " costs may depend on a global hourly rate." msgstr "" "Bereken hier de nodige tijd voor één item van het sjabloon.
              Vergeet " "niet dat de kosten afhankelijk zijn van de salarissen." #: rc.cpp:863 #, kde-format msgid "Work" msgstr "Werk" #: rc.cpp:866 #, kde-format msgid "&Time effort:" msgstr "&Tijdsinspanning:" #: rc.cpp:869 #, kde-format msgid "&Hourly rate:" msgstr "&Uurtarief:" #: rc.cpp:872 #, kde-format msgid "Apply the &global hourly rate" msgstr "Pas het &globale uurtarief toe" #: rc.cpp:875 #, kde-format msgid "

              Add a unit

              " msgstr "

              Eenheid toevoegen

              " #: rc.cpp:878 #, kde-format msgid "Unit short" msgstr "Eenheid afgekort" #: rc.cpp:881 #, kde-format msgid "Unit long" msgstr "Eenheid voluit" #: rc.cpp:884 #, kde-format msgid "Unit plural short" msgstr "Eenheid meervoud afgekort" #: rc.cpp:887 #, kde-format msgid "Unit plural long" msgstr "Eenheid meervoud voluit" #: rc.cpp:890 #, kde-format msgid "Unit ECE20" msgstr "Eenheid ECE20" #: rc.cpp:893 #, kde-format msgid "" "This step checks if the database schema version is sufficient for this version of Kraft. \n" "\n" "In case it is not, the schema is updated automatically.\n" msgstr "" "Deze stap controleert of de versie van het databaseschema modern genoeg is voor deze versie van Kraft. \n" "\n" "Zo niet, dan wordt het schema automatisch bijgewerkt.\n" #: rc.cpp:912 #, kde-format msgid "Upgrade not yet started" msgstr "Opwaarderen nog niet gestart" #: rc.cpp:915 #, kde-format msgid "

              Add a Wage group

              " msgstr "

              Functiegroep toevoegen

              " #: rc.cpp:918 #, kde-format msgid "Group name" msgstr "Groepsnaam" #: rc.cpp:921 #, kde-format msgid "Wage" msgstr "Salaris" #: rc.cpp:924 #, kde-format msgid "Dialog" msgstr "Dialoog" #: rc.cpp:927 #, kde-format msgid "" "

              XRechnung Additional Data

              " msgstr "" "

              Extra informatie voor XRechnung

              " #: rc.cpp:930 #, kde-format msgid "Due date:" msgstr "Verval datum:" #: rc.cpp:933 #, kde-format msgid "Buyer reference:" msgstr "Inkoop referentie" kraft-1.2.2/reports/000077500000000000000000000000001467704360200143325ustar00rootroot00000000000000kraft-1.2.2/reports/CMakeLists.txt000066400000000000000000000003411467704360200170700ustar00rootroot00000000000000add_subdirectory(pics) ########### install files ############### install(FILES delivery_receipt.trml invoice.trml kraft.css invoice.gtmpl xrechnung.xrtmpl DESTINATION ${DATA_INSTALL_DIR}/kraft/reports) kraft-1.2.2/reports/README.md000066400000000000000000000060711467704360200156150ustar00rootroot00000000000000# Report Templates From the templates in this directory, Kraft is generating the final documents in PDF format. ## Customizing ReportLab Templates Please refer to http://volle-kraft-voraus.de/Main/Documenttemplate about customizing the output document with the old ReportLab based system. ## Weasyprint WeasyPrint is a modern, HTML and CSS based way of creating PDF documents. The project homepage is [Weasyprint Project](https://weasyprint.org/). WeasyPrint will replace the so far used ReportLab based system after a deprecation period. ### Try it! WeasyPrint can be tested from Kraft Version 0.95 on. Just create a template and give it the file extension .gtmpl and Kraft will automatically use the Grantlee templating and WeasyPrint. The appearance of the printed page is mostly influenced by the CSS (Cascading Style Sheet) in file `invoice.css`. ## Internationalization All "human readable" strings in the doc templates are translated to the target language in the code, similar to the normal user interface. Instead of changing the template to the word in a non English language, one of the following template variables could be used: | Template Var. | Meaning | English Default| |---------------|----------------------------------------|----------------| |LAB_NO_SHORT |Sequence number printed on the document |No. | |LAB_ITEM |Document item printed on the document |Item| |LAB_QUANTITY_SHORT|Abbrev. of Quantity printed on the document|Qty.| |LAB_UNIT |Unit printed on the document|Unit| |LAB_PRICE |Price of an item printed on the document|Price| |LAB_SUM |Printed on the document |Sum | |LAB_NET |printed on the document |Net | |LAB_VAT |Printed on the document |VAT | |LAB_PHONE |Printed on the document |Phone| |LAB_FAX |Printed on the document |FAX | |LAB_MOBILE |Printed on the document |Mobile| |LAB_EMAIL |Printed on the document |Email| |LAB_WEBSITE |Printed on the document |Website| |LAB_SPECIAL_ITEMS|Text underneath the list of items to sign out special items like Demand or Alternative items|Please note: This offer contains %1 alternative or demand positions, printed in italic font..| |LAB_TAX_FREE_ITEMS|Label for the amount of tax free items|tax free items (%1 pcs.)| |LAB_TAX_REDUCED_ITEMS|Label for the amount of tax reduced items|items with reduced tax of %1% (%2 pcs.)| |LAB_TAX_FULL_ITEMS|Label for the amount of full tax items|No label: items with full tax of %1% (%2 pcs.)| |LAB_PAGE |Printed on the document |Page| |LAB_PAGE_OF |Printed on the document |of| |LAB_DOC_NO |Printed on the document |Document No.| |LAB_DATE |Printed on the document |Date| |LAB_PROJECT |Printed on the document |Project| |LAB_CUST_ID |Printed on the document |Customer Id| |LAB_CURRENCY_SIGN |Printed on the document |the currency symbol| kraft-1.2.2/reports/contrib/000077500000000000000000000000001467704360200157725ustar00rootroot00000000000000kraft-1.2.2/reports/contrib/README.md000066400000000000000000000003661467704360200172560ustar00rootroot00000000000000# Examples This directories contains examples of templates for document generation in Kraft. The purpose is to understand how to create templates for own usage in the perfect way. Feel free to contribute your own template to be included here. kraft-1.2.2/reports/contrib/bnc-ng/000077500000000000000000000000001467704360200171365ustar00rootroot00000000000000kraft-1.2.2/reports/contrib/bnc-ng/bnc-document-ng.gtmpl000066400000000000000000000232741467704360200231730ustar00rootroot00000000000000{% comment %} To test this file, get an intermediate HTML output of Kraft, copy the referenced CSS into the block and paste it into https://printcss.live/ to be able modify it with an immediate preview {% endcomment %} {% if kraft.VERSION %} {% endif %} {% if doc.buyerReference %} {% endif %} {% if doc.predecessor %} {% endif %} {% if doc.projectLabel %} {% endif %} {% comment %} If there is a need for style definitions containing variables or other template language elements they have to be put here. If they are necassary for multiple template definitions consider moving them to an include file. {% endcomment %} {{ doc.docType }} {{ doc.ident }} {% autoescape off %}
              {{ doc.address }}
              Rechnungsanschrift

              Lerchenweg 7
              53359 Rheinbach

              Ihr Ansprechpartner
              Telefon
              E-Mail
              Lieferanschrift

              Lerchenweg 7
              53359 Rheinbach

              {{ me.NAME }}
              {{ me.PHONE }}
              {{ me.EMAIL }}
              {{ doc.dateStr }}
              {{ doc.docType }}
              {{ doc.ident }} {% if doc.predecessor %}     ({{ label.PREDECESSOR }}: {{ doc.predecessor }}) {% endif %}
              {% if doc.doc.buyerReference %}
              {{ label.BUYERREFERENCE }}
              {{ doc.buyerReference }}
              {% endif %} {% if doc.projectLabel %}
              {{ label.PROJECT }}: {{ doc.projectLabel }}
              {% endif %}
              {% if doc.salut %}

              {{ doc.salut }}

              {% endif %} {% if doc.preText %}

              {{ doc.preText }}

              {% endif %} {% if doc.items|length > 0 %} {% for item in doc.items %}
              {% comment %} This empty row is needed to define the width of the columns. In tables with fixed width defined in CSS the first row is the defining one. As it is also generating an empty line as separator it has been kept inside the for-loop instead of putting it in front of the loop. {% endcomment %}
              {% endfor %}
              {{ label.NO_SHORT }} {{ label.QUANTITY_SHORT }} {{ label.UNIT }} {{ label.PRICE }} {{ label.SUM }}
              {{ item.itemNumber }} {% if item.kind == 'Alternative' %} {% elif item.kind == 'Comment' %} {% elif item.kind == 'Demand' %} {% else %} {% endif %} {{ item.htmlText }}
              {{ item.amount }}  {{ item.unit }} {{ item.unitPrice }} {{ item.nettoPrice }} {% if doc.hasIndividualTaxation %} {{ item.taxMarker }}   {% endif %}
              {% if doc.hasIndividualTaxation %} {% else %} {% endif %}
              {{ label.NET }} {{ doc.nettoSumStr }}
              {{ doc.taxMarkerReduced }}  +{{ doc.reducedTaxPercentStr }}% {{ label.VAT }} {{ doc.reducedTaxSumStr }}
              {{ doc.taxMarkerFull }}  +{{ doc.fullTaxPercentStr }}% {{ label.VAT }} {{ doc.fullTaxSumStr }}
              +{{ doc.taxPercentStr }}% {{ label.VAT }} {{ doc.taxSumStr }}
              {{ label.SUM }} {{ doc.bruttoSumStr }}
              {% endif %} {% if doc.postText %}

              {{ doc.postText }}

              {% endif %}

              {{ doc.goodbye }}

              {% endautoescape %} kraft-1.2.2/reports/contrib/bnc-ng/bnc-global.css000066400000000000000000000272451467704360200216620ustar00rootroot00000000000000/* Zeichensatz: */ @charset "UTF-8"; /* Fonts: */ /* as this document will always be rendered on the same small set of * machines using web fonts off the web may be overkill and create * unnecessary traffic and extended rendering times. It is far better to * download the woff-files from their source and store them besides this * file (or use a specified path for them). You can yúse OTF and TTF * files just as well. */ /* @import url("https://fonts.googleapis.com/css?family=Calibri|Oxygen|Pacifico|Open+Sans+Pro:400,700,400italic,700italic,400bold"); @import url("https://fonts.googleapis.com/css?family=Consolas|Inconsolata:400,700,400italic,700italic"); @import url("https://fonts.googleapis.com/css?family=Roboto"); @import url("https://fonts.googleapis.com/css?family=Raleway"); @import url("https://fonts.googleapis.com/css?family=Calibri:400"); @import url("https://fonts.googleapis.com/css?family=Calibri:700"); @import url("https://fonts.googleapis.com/css?family=Calibri:400italic"); @import url("https://fonts.googleapis.com/css?family=Calibri:700italic"); @import url("https://fonts.googleapis.com/css?family=Calibri:400bold"); */ /* @import url("https://fonts.googleapis.com/css?family=Consolas:400"); @import url("https://fonts.googleapis.com/css?family=Consolas:700"); @import url("https://fonts.googleapis.com/css?family=Consolas:400italic"); @import url("https://fonts.googleapis.com/css?family=Consolas:700italic"); */ @font-face { font-family: "Arial Narrow"; src: url("../Fonts/Arial Narrow.ttf") format(truetype); font-style: normal; font-weight: 400; } @font-face { font-family: "Barmeno"; src: url("../Fonts/Barmeno-Regular.otf") format(opentype); font-style: normal; font-weight: normal; } @font-face { font-family: "Calibri"; src: url("../Fonts/Calibri.ttf") format(truetype), url("../Fonts/Calibri.woff2") format(woff2); font-style: normal; font-weight: normal; } @font-face { font-family: "Calibri"; src: url("../Fonts/Calibri-Bold.ttf") format(truetype), url("../Fonts/Calibri-Bold.woff2") format(woff2); font-style: normal; font-weight: bold; } @font-face { font-family: "Calibri"; src: url("../Fonts/Calibri-Italic.ttf") format(truetype), url("../Fonts/Calibri-Italic.woff2") format(woff2); font-style: italic; font-weight: normal; } @font-face { font-family: "Calibri"; src: url("../Fonts/Calibri-BoldItalic.ttf") format(truetype), url("../Fonts/Calibri-BoldItalic.woff2") format(woff2); font-style: italic; font-weight: bold; } @font-face { font-family: "Consolas"; src: url("../Fonts/consola.ttf") format(truetype); font-style: normal; font-weight: normal; } /* General page settings for printouts */ @page { size: A4 portrait; margin-left: 0; margin-top: 0; margin-right: 0; margin-bottom: 0; } /* if you set page margins the position: absolute; items will not be absolute anymore... */ @page :first { margin-left: 25mm; margin-top: 0; margin-right: 20mm; margin-bottom: 40mm; } @page :left { margin-left: 20mm; margin-top: 20mm; margin-right: 25mm; margin-bottom: 15mm; } @page :right { margin-left: 25mm; margin-top: 20mm; margin-right: 20mm; margin-bottom: 15mm; } @page :blank { } /* Everything in here should only be relevant for printing BUT if you want * to test your design in a browser it might be a good idea to remove the * @media print {} block */ /* @media print { */ /* Watermark: Nike. DON'T DO IT. */ /* takes long, opacity is not working as expected in 2022 body :before { content: ''; position: absolute; top: 0; bottom: 0; left: 0; right: 0; background: url(BNC-watermark.png); background-position: center; background-size: 100%; background-repeat: no-repeat; background-attachment: fixed; z-index: -1; opacity: 0.05; } */ /* Page Breaks */ /* The following settings are possible: page-break-after : auto | always | avoid | left | right page-break-before : auto | always | avoid | left | right page-break-inside : auto | avoid */ h1 { page-break-before: always; } h1, h2, h3, h4, h5, h6, h7 { page-break-after: avoid; } table, tr, figure { page-break-inside: avoid; page-break-after: auto; } /* page break class; use as
              to insert */ .pagebreak { page-break-before: always; } /* DIN 5008 address field */ /* height 45mm. Address starts 17.7mm from top, 6 linex max. Additional * remarks go upwards into the upper 17.7mm, 5 lines max. * see https://www.workingoffice.de/din-5008/adresse-nach-din-5008/ */ .ISO-address-window { font-family: Calibri; font-size: 8pt; font-style: normal; line-height: 1.1; position: absolute; display: block; white-space: pre-line; top: 45mm; /* top: 62.7mm; */ left: 20mm; width: 90mm; height: 45mm; } .address-field { position: absolute; display: block; white-space: pre-line; font-size: 10pt; font-style: normal; line-height: 1.2; top: 55mm; left: 0mm; width: 80mm; height: 36.3mm; } .buyer-reference { position: absolute; font-family: Calibri; font-size: 10pt; line-height: 1.25; top: 93mm; left: 98mm; width: 400mm; height: 20pt; } .date { position: absolute; font-family: Calibri; font-size: 12pt; font-weight: bold; line-height: 1; top: 93mm; left: 144mm; width: 30mm; height: 12pt; } .document-type-and-number { position: absolute; font-family: Barmeno; font-size: 12pt; font-weight: bold; line-height: 1.2; top: 110mm; left: 0mm; width: 165mm; height: 36pt; } .header-block-1 { position: absolute; font-family: Barmeno; font-size: 10pt; line-height: 1.25; top: 45mm; left: 98mm; width: 40mm; height: 40mm; } .header-block-2 { position: absolute; font-family: Barmeno; font-size: 10pt; line-height: 1.25; top: 45mm; left: 144mm; width: 40mm; height: 40mm; } .project { position: absolute; font-family: Calibri; font-size: 10pt; font-weight: bold; line-height: 1; top: 125mm; left: 0mm; width: 165mm; } /* report area; item styling */ .doc-items { border-collapse: collapse; width: 165mm; table-layout: fixed; page-break-inside:avoid; margin-right: 0px; margin-left: 0px; } .doc-items-header { /* meaning all th (table header) cells in a table of class doc-item */ vertical-align: top; line-height: 1.1; box-sizing: border-box; border-collapse: padding-top: 2mm; padding-left: 2mm; padding-right: 2mm; border: solid; border-spacing: 1px; border-top: 1px solid black; border-bottom: 1px solid black; border-left: 0; border-right: 0; } table.doc-items td { /* meaning all td cells in a table of class doc-item -- remember, every item might be in its own table */ vertical-align: top; line-height: 1.1; box-sizing: border-box; padding-top: 2mm; padding-left: 2mm; padding-right: 2mm; } .doc-item-style-individualTaxation { vertical-align: super; font-size: 60%; } .col-item-no { vertical-align: top; width: 6%; } .col-item-text { width: 75%; } .col-item-alternative { width: 75%; } .col-item-comment { width: 75%; } .col-item-ondemand { width: 75%; } .col-item-standard { width: 75%; } .col-item-amount { width: 52%; } .col-item-unit { width: 12%; } .col-item-unitprice { width: 15%; } .col-item-total { width: 15%; color: #000000; font-weight: bold; } /* totals, taxes and bottom text */ .totals { width: 165mm; /* table-layout: fixed; /* this somehow adds 2mm horizontal spacing and messes everyting up */ vertical-align: top; line-height: 1.25; box-sizing: border-box; text-align: right; bottom: 0; /* The following margins pull the whole box to the right */ margin-right: 0; margin-left: 0; margin-top: 8mm; /*separation between items and sums */ margin-bottom: 12mm; /* separation between sums and footer text */ } table.totals td { box-sizing: border-box; padding-top: 2mm; padding-left: 2mm; padding-right: 2mm; } .totals-col-spacer { padding-top: 1mm; width: 60%; } .totals-col-label { padding-top: 1mm; width: 20%; } .totals-col-value { padding-top: 1mm; width: 20%; } .totals-first-line { border-top: solid black 1px; } .totals-final-line { border-top: solid black 1px; border-bottom: solid black 2px; } .entrytext { } .entrytext-unprocessed { white-space: pre-line; } .bottomtext { } .bottomtext-unprocessed { white-space: pre-line; } .goodbye { } /* This will be the style for the first element of the "report area" of the printout. * Due to absolute positioning of blocks above it it is impossible to adjust the * start of that zone using a top margin. It will be used on an otherwise * empty div. */ .generate-first-page-margin { font-family: Calibri; font-size: 10pt; line-height: 1.2; left: 0mm; width: 165mm; padding-top: 135mm; } /* Tables with units konsiting of multiple rows might be getting a page break * inserted where it hurts. This will avoid them. */ .no-page-break-inside { page-break-inside: auto; } /* these classes can be used for debugging whenever you don't understand * what is happening to your positioning just add one of these classes * to your HTML
              s */ .DEBUG-box-black { border: 0.1mm solid black; } .DEBUG-box-red { border: 0.1mm solid red; } .DEBUG-box-green { border: 0.1mm solid green; } .DEBUG-box-blue { border: 0.1mm solid blue; } /* bad style to do things not based on semantic grouping, but... */ /* text alignment within an element */ .align-center { text-align: center; } .align-left { text-align: left; } .align-right { text-align: right; } .align-justify { text-align: right; } .superscript { vertical-align: super; font-size: 60%; } .subscript { vertical-align: sub; font-size: 60%; } .weight-bold { font-weight: bold; } .weight-normal { font-weight: normal; } /* explicit font settings */ .main-font-regular-6 { font-family: 'Calibri'; font-size: 6pt; } .main-font-regular-8 { font-family: 'Calibri'; font-size: 8pt; } .main-font-regular-10 { font-family: 'Calibri'; font-size: 10pt; } .main-font-regular-12 { font-family: 'Calibri'; font-size: 12pt; } /* classless settings for the entire document */ html { font-family: 'Calibri'; font-size: 10pt; line-height: 1.2; margin: 0px; } /* A perverse invention by Google: There is a browser built-in CSS style * sheet defining certain settings "to make the web look like it should". * The worst part are implicit margin settigs that affect any element * without "position: absolute;". While this might be a good idea for a web * browser it makes print layout an educated guess. */ body{ margin: 0px; } table { border-collapse: collapse; vertical-align: top; box-sizing: border-box; } th { border-bottom: .2mm solid #555; color: #555; font-size: 10pt; font-weight: 400; /* padding-bottom: .25cm; */ } td { vertical-align: top; } /* } /* @media print} */ /* The following style definitions are intended to be used in multi-line * text entries as poor man's easy-to-use HTML building blocks. Use them * inside s for text effects. */ .font-barmeno { font-family: Bameno; } .font-consolas { font-family: Consolas; } kraft-1.2.2/reports/contrib/bnc/000077500000000000000000000000001467704360200165345ustar00rootroot00000000000000kraft-1.2.2/reports/contrib/bnc/README.md000066400000000000000000000005731467704360200200200ustar00rootroot00000000000000 These templates were contributed by Achim Patzner The difference between the unsafe-variant the the "safe" variant is that the unsafe variant does render html tags in post-, pre- and item texts. HTML Tags in texts are not enabled in Kraft by default. bnc-letter.gtmpl is a template to write a letter with Kraft. It skips the items and uses pre- and post-text. kraft-1.2.2/reports/contrib/bnc/bnc-document-with-prices-unsafe.gtmpl000066400000000000000000000210171467704360200256730ustar00rootroot00000000000000{% comment %} To test this file, get an intermediate HTML output of Kraft, copy the referenced CSS into the block and paste it into https://printcss.live/ to be able modify it with an immediate preview {% endcomment %} {% if doc.projectLabel %} {% endif %} {% if doc.predecessor %} {% endif %} {% if doc.projectLabel %} {% endif %} {% comment %} If there is a need for style definitions containing variables or other template language elements they have to be put here. If they are necassary for multiple template definitions consider moving them to an include file. {% endcomment %} {{ doc.docType }} {{ doc.ident }} {% autoescape off %}
              {{ doc.address }}
              Rechnungsanschrift

              Lerchenweg 7
              53359 Rheinbach

              Ihr Ansprechpartner
              Telefon
              E-Mail
              Lieferanschrift

              Lerchenweg 7
              53359 Rheinbach

              {{ me.NAME }}
              {{ me.PHONE }}
              {{ me.EMAIL }}
              {{ doc.dateStr }}
              {{ doc.docType }}
              {{ doc.ident }} {% if doc.predecessor %}     ({{ label.PREDECESSOR }}: {{ doc.predecessor }}) {% endif %}
              {% if doc.doc.buyerReference %}
              {{ label.BUYERREFERENCE }}
              {{ doc.buyerReference }}
              {% endif %} {% if doc.projectLabel %}
              {{ label.PROJECT }}: {{ doc.projectLabel }}
              {% endif %}
              {% if doc.salut %}

              {{ doc.salut }}

              {% endif %} {% if doc.preText %}

              {{ doc.preText }}

              {% endif %} {% for item in doc.items %}
              {{ item.itemNumber }} {% if item.kind == 'Alternative' %} {% elif item.kind == 'Comment' %} {% elif item.kind == 'Demand' %} {% else %} {% endif %} {{ item.htmlText }}
              {{ item.amount }}  {{ item.unit }} {{ item.unitPrice }} {{ item.nettoPrice }} {% if doc.hasIndividualTaxation %} {{ item.taxMarker }}   {% endif %}
              {% endfor %} {% if doc.hasIndividualTaxation %} {% else %} {% endif %}
              {{ label.NET }} {{ doc.nettoSumStr }}
              {{ doc.taxMarkerReduced }}  +{{ doc.reducedTaxPercentStr }}% {{ label.VAT }} {{ doc.reducedTaxSumStr }}
              {{ doc.taxMarkerFull }}  +{{ doc.fullTaxPercentStr }}% {{ label.VAT }} {{ doc.fullTaxSumStr }}
              +{{ doc.taxPercentStr }}% {{ label.VAT }} {{ doc.taxSumStr }}
              {{ label.SUM }} {{ doc.bruttoSumStr }}
              {% if doc.postText %}

              {{ doc.postText }}

              {% endif %}

              {{ doc.goodbye }}

              {% endautoescape %} kraft-1.2.2/reports/contrib/bnc/bnc-document-with-prices.gtmpl000066400000000000000000000210501467704360200244110ustar00rootroot00000000000000{% comment %} To test this file, get an intermediate HTML output of Kraft, copy the referenced CSS into the block and paste it into https://printcss.live/ to be able modify it with an immediate preview {% endcomment %} {% if doc.projectLabel %} {% endif %} {% if doc.predecessor %} {% endif %} {% if doc.projectLabel %} {% endif %} {% comment %} If there is a need for style definitions containing variables or other template language elements they have to be put here. If they are necassary for multiple template definitions consider moving them to an include file. {% endcomment %} {{ doc.docType }} {{ doc.ident }} {% autoescape off %}
              {{ doc.address }}
              Rechnungsanschrift

              Lerchenweg 7
              53359 Rheinbach

              Ihr Ansprechpartner
              Telefon
              E-Mail
              Lieferanschrift

              Lerchenweg 7
              53359 Rheinbach

              {{ me.NAME }}
              {{ me.PHONE }}
              {{ me.EMAIL }}
              {{ doc.dateStr }}
              {{ doc.docType }}
              {{ doc.ident }} {% if doc.predecessor %}     ({{ label.PREDECESSOR }}: {{ doc.predecessor }}) {% endif %}
              {% if doc.doc.buyerReference %}
              {{ label.BUYERREFERENCE }}
              {{ doc.buyerReference }}
              {% endif %} {% if doc.projectLabel %}
              {{ label.PROJECT }}: {{ doc.projectLabel }}
              {% endif %}
              {% if doc.salut %}

              {{ doc.salut }}

              {% endif %} {% if doc.preTextHtml %}

              {{ doc.preTextHtml|safe }}

              {% endif %} {% for item in doc.items %}
              {{ item.itemNumber }} {% if item.kind == 'Alternative' %} {% elif item.kind == 'Comment' %} {% elif item.kind == 'Demand' %} {% else %} {% endif %} {{ item.htmlText }}
              {{ item.amount }}  {{ item.unit }} {{ item.unitPrice }} {{ item.nettoPrice }} {% if doc.hasIndividualTaxation %} {{ item.taxMarker }}   {% endif %}
              {% endfor %} {% if doc.hasIndividualTaxation %} {% else %} {% endif %}
              {{ label.NET }} {{ doc.nettoSumStr }}
              {{ doc.taxMarkerReduced }}  +{{ doc.reducedTaxPercentStr }}% {{ label.VAT }} {{ doc.reducedTaxSumStr }}
              {{ doc.taxMarkerFull }}  +{{ doc.fullTaxPercentStr }}% {{ label.VAT }} {{ doc.fullTaxSumStr }}
              +{{ doc.taxPercentStr }}% {{ label.VAT }} {{ doc.taxSumStr }}
              {{ label.SUM }} {{ doc.bruttoSumStr }}
              {% if doc.postTextHtml %}

              {{ doc.postTextHtml|safe }}

              {% endif %}

              {{ doc.goodbye }}

              {% endautoescape %} kraft-1.2.2/reports/contrib/bnc/bnc-document-without-prices-unsafe.gtmpl000066400000000000000000000151601467704360200264250ustar00rootroot00000000000000{% comment %} To test this file, get an intermediate HTML output of Kraft, copy the referenced CSS into the block and paste it into https://printcss.live/ to be able modify it with an immediate preview {% endcomment %} {% if doc.projectLabel %} {% endif %} {% if doc.predecessor %} {% endif %} {% if doc.projectLabel %} {% endif %} {% comment %} If there is a need for style definitions containing variables or other template language elements they have to be put here. If they are necassary for multiple template definitions consider moving them to an include file. {% endcomment %} {{ doc.docType }} {{ doc.ident }} {% autoescape off %}
              {{ doc.address }}
              Rechnungsanschrift

              Lerchenweg 7
              53359 Rheinbach

              Ihr Ansprechpartner
              Telefon
              E-Mail
              Lieferanschrift

              Lerchenweg 7
              53359 Rheinbach

              {{ me.NAME }}
              {{ me.PHONE }}
              {{ me.EMAIL }}
              {{ doc.dateStr }}
              {{ doc.docType }}
              {{ doc.ident }} {% if doc.predecessor %}     ({{ label.PREDECESSOR }}: {{ doc.predecessor }}) {% endif %}
              {% if doc.doc.buyerReference %}
              {{ label.BUYERREFERENCE }}
              {{ doc.buyerReference }}
              {% endif %} {% if doc.projectLabel %}
              {{ label.PROJECT }}: {{ doc.projectLabel }}
              {% endif %}
              {% if doc.salut %}

              {{ doc.salut }}

              {% endif %} {% if doc.preText %}

              {{ doc.preText }}

              {% endif %} {% for item in doc.items %}
              {{ item.itemNumber }} {% if item.kind == 'Alternative' %} {% elif item.kind == 'Comment' %} {% elif item.kind == 'Demand' %} {% else %} {% endif %} {{ item.htmlText }}
              {{ item.amount }}  {{ item.unit }}
              {% endfor %} {% if doc.postText %}

              {{ doc.postText }}

              {% endif %}

              {{ doc.goodbye }}

              {% endautoescape %} kraft-1.2.2/reports/contrib/bnc/bnc-document-without-prices.gtmpl000066400000000000000000000152061467704360200251470ustar00rootroot00000000000000{% comment %} To test this file, get an intermediate HTML output of Kraft, copy the referenced CSS into the block and paste it into https://printcss.live/ to be able modify it with an immediate preview {% endcomment %} {% if doc.projectLabel %} {% endif %} {% if doc.predecessor %} {% endif %} {% if doc.projectLabel %} {% endif %} {% comment %} If there is a need for style definitions containing variables or other template language elements they have to be put here. If they are necassary for multiple template definitions consider moving them to an include file. {% endcomment %} {{ doc.docType }} {{ doc.ident }} {% autoescape off %}
              {{ doc.address }}
              Rechnungsanschrift

              Lerchenweg 7
              53359 Rheinbach

              Ihr Ansprechpartner
              Telefon
              E-Mail
              Lieferanschrift

              Lerchenweg 7
              53359 Rheinbach

              {{ me.NAME }}
              {{ me.PHONE }}
              {{ me.EMAIL }}
              {{ doc.dateStr }}
              {{ doc.docType }}
              {{ doc.ident }} {% if doc.predecessor %}     ({{ label.PREDECESSOR }}: {{ doc.predecessor }}) {% endif %}
              {% if doc.doc.buyerReference %}
              {{ label.BUYERREFERENCE }}
              {{ doc.buyerReference }}
              {% endif %} {% if doc.projectLabel %}
              {{ label.PROJECT }}: {{ doc.projectLabel }}
              {% endif %}
              {% if doc.salut %}

              {{ doc.salut }}

              {% endif %} {% if doc.preTextHtml %}

              {{ doc.preTextHtml|safe }}

              {% endif %} {% for item in doc.items %}
              {{ item.itemNumber }} {% if item.kind == 'Alternative' %} {% elif item.kind == 'Comment' %} {% elif item.kind == 'Demand' %} {% else %} {% endif %} {{ item.htmlText }}
              {{ item.amount }}  {{ item.unit }}
              {% endfor %} {% if doc.postTextHtml %}

              {{ doc.postTextHtml }}

              {% endif %}

              {{ doc.goodbye }}

              {% endautoescape %} kraft-1.2.2/reports/contrib/bnc/bnc-global.css000066400000000000000000000251751467704360200212600ustar00rootroot00000000000000/* Zeichensatz: */ @charset "UTF-8"; /* Fonts: */ /* as this document will always be rendered on the same small set of * machines using web fonts off the web may be overkill and create * unnecessary traffic and extended rendering times. It is far better to * download the woff-files from their source and store them besides this * file (or use a specified path for them). You can yúse OTF and TTF * files just as well. */ /* @import url("https://fonts.googleapis.com/css?family=Calibri|Oxygen|Pacifico|Open+Sans+Pro:400,700,400italic,700italic,400bold"); @import url("https://fonts.googleapis.com/css?family=Consolas|Inconsolata:400,700,400italic,700italic"); @import url("https://fonts.googleapis.com/css?family=Roboto"); @import url("https://fonts.googleapis.com/css?family=Raleway"); @import url("https://fonts.googleapis.com/css?family=Calibri:400"); @import url("https://fonts.googleapis.com/css?family=Calibri:700"); @import url("https://fonts.googleapis.com/css?family=Calibri:400italic"); @import url("https://fonts.googleapis.com/css?family=Calibri:700italic"); @import url("https://fonts.googleapis.com/css?family=Calibri:400bold"); @import url("https://fonts.googleapis.com/css?family=Consolas:400"); @import url("https://fonts.googleapis.com/css?family=Consolas:700"); @import url("https://fonts.googleapis.com/css?family=Consolas:400italic"); @import url("https://fonts.googleapis.com/css?family=Consolas:700italic"); */ @font-face { font-family: "Arial Narrow"; src: url("../Fonts/Arial Narrow.ttf") format(truetype); font-style: normal; font-weight: 400; } @font-face { font-family: "Barmeno"; src: url("../Fonts/Barmeno-Regular.otf") format(opentype); font-style: normal; font-weight: normal; } @font-face { font-family: "Calibri"; src: url("../Fonts/Calibri.ttf") format(truetype), url("../Fonts/Calibri.woff2") format(woff2); font-style: normal; font-weight: normal; } @font-face { font-family: "Calibri"; src: url("../Fonts/Calibri-Bold.ttf") format(truetype), url("../Fonts/Calibri-Bold.woff2") format(woff2); font-style: normal; font-weight: bold; } @font-face { font-family: "Calibri"; src: url("../Fonts/Calibri-Italic.ttf") format(truetype), url("../Fonts/Calibri-Italic.woff2") format(woff2); font-style: italic, oblique; font-weight: normal; } @font-face { font-family: "Calibri"; src: url("../Fonts/Calibri-BoldItalic.ttf") format(truetype), url("../Fonts/Calibri-BoldItalic.woff2") format(woff2); font-style: italic, oblique; font-weight: bold; } @font-face { font-family: "Consolas"; src: url("../Fonts/consola.ttf") format(opentype); font-style: normal; font-weight: normal; } /* General page settings for printouts */ @page { size: A4 portrait; margin-left: 0; margin-top: 0; margin-right: 0; margin-bottom: 0; } /* if you set page margins the position: absolute; items will not be absolute anymore... */ @page :first { margin-left: 25mm; margin-top: 0; margin-right: 20mm; margin-bottom: 40mm; } @page :left { margin-left: 20mm; margin-top: 20mm; margin-right: 25mm; margin-bottom: 15mm; } @page :right { margin-left: 25mm; margin-top: 20mm; margin-right: 20mm; margin-bottom: 15mm; } @page :blank { } /* Everything in here should only be relevant for printing BUT if you want * to test your design in a browser it might be a good idea to remove the * @media print {} block */ /* @media print { */ /* Watermark: Nike. DON'T DO IT. */ /* takes long, opacity is not working as expected in 2022 body :before { content: ''; position: absolute; top: 0; bottom: 0; left: 0; right: 0; background: url(BNC-watermark.png); background-position: center; background-size: 100%; background-repeat: no-repeat; background-attachment: fixed; z-index: -1; opacity: 0.05; } */ /* Page Breaks */ /* The following settings are possible: page-break-after : auto | always | avoid | left | right page-break-before : auto | always | avoid | left | right page-break-inside : auto | avoid */ h1 { page-break-before: always; } h1, h2, h3, h4, h5, h6, h7 { page-break-after: avoid; } table, tr, figure { page-break-inside: avoid; page-break-after: auto; } /* page break class; use as
              to insert */ .pagebreak { page-break-before: always; } /* DIN 5008 address field */ /* height 45mm. Address starts 17.7mm from top, 6 linex max. Additional * remarks go upwards into the upper 17.7mm, 5 lines max. * see https://www.workingoffice.de/din-5008/adresse-nach-din-5008/ */ .ISO-address-window { font-family: Calibri; font-size: 8pt; font-style: normal; line-height: 1.1; position: absolute; display: block; white-space: pre-line; top: 45mm; /* top: 62.7mm; */ left: 20mm; width: 90mm; height: 45mm; } .address-field { position: absolute; display: block; white-space: pre-line; font-size: 10pt; font-style: normal; line-height: 1.2; top: 55mm; left: 0mm; width: 80mm; height: 36.3mm; } .buyer-reference { position: absolute; font-family: Calibri; font-size: 10pt; line-height: 1.25; top: 93mm; left: 98mm; width: 400mm; height: 20pt; } .date { position: absolute; font-family: Calibri; font-size: 12pt; font-weight: bold; line-height: 1; top: 93mm; left: 144mm; width: 30mm; height: 12pt; } .document-type-and-number { position: absolute; font-family: Barmeno; font-size: 12pt; font-weight: bold; line-height: 1.2; top: 110mm; left: 0mm; width: 165mm; height: 36pt; } .header-block-1 { position: absolute; font-family: Barmeno; font-size: 10pt; line-height: 1.25; top: 45mm; left: 98mm; width: 40mm; height: 40mm; } .header-block-2 { position: absolute; font-family: Barmeno; font-size: 10pt; line-height: 1.25; top: 45mm; left: 144mm; width: 40mm; height: 40mm; } .project { position: absolute; font-family: Calibri; font-size: 10pt; font-weight: bold; line-height: 1; top: 125mm; left: 0mm; width: 165mm; } /* report area; item styling */ .doc-items { border-collapse: collapse; width: 165mm; table-layout: fixed; page-break-inside:avoid; margin-right: 0px; margin-left: 0px; } table.doc-items td { /* meaning all td cells in a table of class doc-item -- remember, every item is in its own table */ vertical-align: top; line-height: 1.1; box-sizing: border-box; padding-top: 2mm; padding-left: 2mm; padding-right: 2mm; } .doc-item-style-individualTaxation { vertical-align: super; font-size: 60%; } .col-item-no { vertical-align: top; width: 6%; } .col-item-text { width: 75%; } .col-item-alternative { width: 75%; } .col-item-comment { width: 75%; } .col-item-ondemand { width: 75%; } .col-item-standard { width: 75%; } .col-item-amount { width: 52%; } .col-item-unit { width: 12%; } .col-item-unitprice { width: 15%; } .col-item-total { width: 15%; color: #000000; font-weight: bold; } /* totals, taxes and bottom text */ .totals { width: 165mm; /* table-layout: fixed; /* this somehow adds 2mm horizontal spacing and messes everyting up */ vertical-align: top; line-height: 1.25; box-sizing: border-box; text-align: right; bottom: 0; /* The following margins pull the whole box to the right */ margin-right: 0; margin-left: 0; margin-top: 8mm; /*separation between items and sums */ margin-bottom: 12mm; /* separation between sums and footer text */ } table.totals td { box-sizing: border-box; padding-top: 2mm; padding-left: 2mm; padding-right: 2mm; } .totals-col-spacer { padding-top: 1mm; width: 60%; } .totals-col-label { padding-top: 1mm; width: 20%; } .totals-col-value { padding-top: 1mm; width: 20%; } .totals-first-line { border-top: solid black 1px; } .totals-final-line { border-top: solid black 1px; border-bottom: solid black 2px; } .bottomtext { } .goodbye { } /* This will be the style for the first element of the "report area" of the printout. * Due to absolute positioning of blocks above it it is impossible to adjust the * start of that zone using a top margin. It will be used on an otherwise * empty div. */ .generate-first-page-margin { font-family: Calibri; font-size: 10pt; line-height: 1.2; left: 0mm; width: 165mm; padding-top: 135mm; } /* these classes can be used for debugging whenever you don't understand * what is happening to your positioning just add one of these classes * to your HTML
              s */ .DEBUG-box-black { border: 0.1mm solid black; } .DEBUG-box-red { border: 0.1mm solid red; } .DEBUG-box-green { border: 0.1mm solid green; } .DEBUG-box-blue { border: 0.1mm solid blue; } /* bad style to do things not based on semantic grouping, but... */ /* text alignment within an element */ .align-center { text-align: center; } .align-left { text-align: left; } .align-right { text-align: right; } .superscript { vertical-align: super; font-size: 60%; } .subscript { vertical-align: sub; font-size: 60%; } .weight-bold { font-weight: bold; } .weight-normal { font-weight: normal; } /* explicit font settings */ .main-font-regular-6 { font-family: 'Calibri'; font-size: 6pt; } .main-font-regular-8 { font-family: 'Calibri'; font-size: 8pt; } .main-font-regular-10 { font-family: 'Calibri'; font-size: 10pt; } .main-font-regular-12 { font-family: 'Calibri'; font-size: 12pt; } /* classless settings for the entire document */ html { font-family: 'Calibri'; font-size: 10pt; line-height: 1.2; margin: 0px; } /* A perverse invention by Google: There is a browser built-in CSS style * sheet defining certain settings "to make the web look like it should". * The worst part are implicit margin settigs that affect any element * without "position: absolute;". While this might be a good idea for a web * browser it makes print layout an educated guess. */ body{ margin: 0px; } table { border-collapse: collapse; vertical-align: top; box-sizing: border-box; } th { border-bottom: .2mm solid #555; color: #555; font-size: 10pt; font-weight: 400; /* padding-bottom: .25cm; */ } td { vertical-align: top; } /* } /* @media print} */ kraft-1.2.2/reports/contrib/bnc/bnc-letter.gtmpl000066400000000000000000000115001467704360200216350ustar00rootroot00000000000000{% comment %} To test this file, get an intermediate HTML output of Kraft, copy the referenced CSS into the block and paste it into https://printcss.live/ to be able modify it with an immediate preview {% endcomment %} {% if doc.projectLabel %} {% endif %} {% if doc.predecessor %} {% endif %} {% if doc.projectLabel %} {% endif %} {% comment %} If there is a need for style definitions containing variables or other template language elements they have to be put here. If they are necassary for multiple template definitions consider moving them to an include file. {% endcomment %} {{ doc.docType }} {{ doc.ident }} {% autoescape off %}
              {{ doc.address }}
              Rechnungsanschrift

              Lerchenweg 7
              53359 Rheinbach

              Ihr Ansprechpartner
              Telefon
              E-Mail
              Lieferanschrift

              Lerchenweg 7
              53359 Rheinbach

              {{ me.NAME }}
              {{ me.PHONE }}
              {{ me.EMAIL }}
              {{ doc.dateStr }}
              {{ doc.docType }}
              {{ doc.ident }} {% if doc.predecessor %}     ({{ label.PREDECESSOR }}: {{ doc.predecessor }}) {% endif %}
              {% if doc.doc.buyerReference %}
              {{ label.BUYERREFERENCE }}
              {{ doc.buyerReference }}
              {% endif %} {% if doc.projectLabel %}
              {{ label.PROJECT }}: {{ doc.projectLabel }}
              {% endif %}
              {% if doc.salut %}

              {{ doc.salut }}

              {% endif %} {% if doc.preText %}

              {{ doc.preText }}

              {% endif %} {% if doc.postText %}

              {{ doc.postText }}

              {% endif %}

              {{ doc.goodbye }}

              {% endautoescape %} kraft-1.2.2/reports/contrib/debug/000077500000000000000000000000001467704360200170605ustar00rootroot00000000000000kraft-1.2.2/reports/contrib/debug/README.md000066400000000000000000000003221467704360200203340ustar00rootroot00000000000000This debug template displays all available template variables including their value of the current docuemnt. Very useful to understand which variables are available. Contributed by Achim Patzner kraft-1.2.2/reports/contrib/debug/debug.css000066400000000000000000000221631467704360200206640ustar00rootroot00000000000000/* Zeichensatz: */ @charset "UTF-8"; /* Fonts: */ /* as this document will always be rendered on the same small set of * machines using web fonts off the web may be overkill and create * unnecessary traffic and extended rendering times. It is far better to * download the woff-files from their source and store them besides this * file (or use a specified path for them). You can yúse OTF and TTF * files just as well. */ @import url("https://fonts.googleapis.com/css?family=Calibri|Oxygen|Pacifico|Open+Sans+Pro:400,700,400italic,700italic,400bold"); @import url("https://fonts.googleapis.com/css?family=Consolas|Inconsolata:400,700,400italic,700italic"); @import url("https://fonts.googleapis.com/css?family=Roboto"); @import url("https://fonts.googleapis.com/css?family=Raleway"); @import url("https://fonts.googleapis.com/css?family=Calibri:400"); @import url("https://fonts.googleapis.com/css?family=Calibri:700"); @import url("https://fonts.googleapis.com/css?family=Calibri:400italic"); @import url("https://fonts.googleapis.com/css?family=Calibri:700italic"); @import url("https://fonts.googleapis.com/css?family=Calibri:400bold"); @import url("https://fonts.googleapis.com/css?family=Consolas:400"); @import url("https://fonts.googleapis.com/css?family=Consolas:700"); @import url("https://fonts.googleapis.com/css?family=Consolas:400italic"); @import url("https://fonts.googleapis.com/css?family=Consolas:700italic"); /* General page settings for printouts */ @page { size: A4 portrait; margin-left: 10mm; margin-top: 10mm; margin-right: 10mm; margin-bottom: 10mm; } h1 { page-break-before: always; } h1, h2, h3, h4, h5, h6, h7 { /* page-break-after: avoid; */ } table, tr, figure { page-break-inside: avoid; page-break-after: auto; } /* page break class; use as
              to insert */ .pagebreak { page-break-before: always; } /* DIN 5008 address field */ /* height 45mm. Address starts 17.7mm from top, 6 linex max. Additional * remarks go upwards into the upper 17.7mm, 5 lines max. * see https://www.workingoffice.de/din-5008/adresse-nach-din-5008/ */ .ISO-address-window { font-family: Calibri; font-size: 8pt; font-style: normal; line-height: 1.1; position: absolute; display: block; white-space: pre-line; top: 45mm; /* top: 62.7mm; */ left: 20mm; width: 90mm; height: 45mm; } .address-field { display: block; white-space: pre-line; line-height: 1.2; } .buyer-reference { position: absolute; font-family: Calibri; font-size: 10pt; line-height: 1.25; top: 93mm; left: 98mm; width: 400mm; height: 20pt; } .date { position: absolute; font-family: Calibri; font-size: 12pt; font-weight: bold; line-height: 1; top: 93mm; left: 144mm; width: 30mm; height: 12pt; } .document-type-and-number { position: absolute; font-family: Barmeno; font-size: 12pt; font-weight: bold; line-height: 1.2; top: 110mm; left: 0mm; width: 165mm; height: 36pt; } .header-block-1 { position: absolute; font-family: Barmeno; font-size: 10pt; line-height: 1.25; top: 45mm; left: 98mm; width: 40mm; height: 40mm; } .header-block-2 { position: absolute; font-family: Barmeno; font-size: 10pt; line-height: 1.25; top: 45mm; left: 144mm; width: 40mm; height: 40mm; } .project { position: absolute; font-family: Calibri; font-size: 10pt; font-weight: bold; line-height: 1; top: 125mm; left: 0mm; width: 165mm; } /* report area; item styling */ .doc-items { border-collapse: collapse; width: 165mm; table-layout: fixed; page-break-inside:avoid; margin-right: 0px; margin-left: 0px; } .doc-items-header { /* meaning all th (table header) cells in a table of class doc-item */ vertical-align: top; line-height: 1.1; box-sizing: border-box; border-collapse: padding-top: 2mm; padding-left: 2mm; padding-right: 2mm; border: solid; border-spacing: 1px; border-top: 1px solid black; border-bottom: 1px solid black; border-left: 0; border-right: 0; } table.doc-items td { /* meaning all td cells in a table of class doc-item -- remember, every item might be in its own table */ vertical-align: top; line-height: 1.1; box-sizing: border-box; padding-top: 2mm; padding-left: 2mm; padding-right: 2mm; } .doc-item-style-individualTaxation { vertical-align: super; font-size: 60%; } .col-item-no { vertical-align: top; width: 6%; } .col-item-text { width: 75%; } .col-item-alternative { width: 75%; } .col-item-comment { width: 75%; } .col-item-ondemand { width: 75%; } .col-item-standard { width: 75%; } .col-item-amount { width: 52%; } .col-item-unit { width: 12%; } .col-item-unitprice { width: 15%; } .col-item-total { width: 15%; color: #000000; font-weight: bold; } /* totals, taxes and bottom text */ .totals { width: 165mm; /* table-layout: fixed; /* this somehow adds 2mm horizontal spacing and messes everyting up */ vertical-align: top; line-height: 1.25; box-sizing: border-box; text-align: right; bottom: 0; /* The following margins pull the whole box to the right */ margin-right: 0; margin-left: 0; margin-top: 8mm; /*separation between items and sums */ margin-bottom: 12mm; /* separation between sums and footer text */ } table.totals td { box-sizing: border-box; padding-top: 2mm; padding-left: 2mm; padding-right: 2mm; } .totals-col-spacer { padding-top: 1mm; width: 60%; } .totals-col-label { padding-top: 1mm; width: 20%; } .totals-col-value { padding-top: 1mm; width: 20%; } .totals-first-line { border-top: solid black 1px; } .totals-final-line { border-top: solid black 1px; border-bottom: solid black 2px; } .entrytext { } .entrytext-unprocessed { white-space: pre-line; } .bottomtext { } .bottomtext-unprocessed { white-space: pre-line; } .goodbye { } /* This will be the style for the first element of the "report area" of the printout. * Due to absolute positioning of blocks above it it is impossible to adjust the * start of that zone using a top margin. It will be used on an otherwise * empty div. */ .generate-first-page-margin { font-family: Calibri; font-size: 10pt; line-height: 1.2; left: 0mm; width: 165mm; padding-top: 135mm; } /* Tables with units konsiting of multiple rows might be getting a page break * inserted where it hurts. This will avoid them. */ .no-page-break-inside { page-break-inside: avoid; } /* these classes can be used for debugging whenever you don't understand * what is happening to your positioning just add one of these classes * to your HTML
              s */ .DEBUG-box-black { border: 0.1mm solid black; } .DEBUG-box-red { border: 0.1mm solid red; } .DEBUG-box-green { border: 0.1mm solid green; } .DEBUG-box-blue { border: 0.1mm solid blue; } /* bad style to do things not based on semantic grouping, but... */ /* text alignment within an element */ .align-center { text-align: center; } .align-left { text-align: left; } .align-right { text-align: right; } .align-justify { text-align: right; } .superscript { vertical-align: super; font-size: 60%; } .subscript { vertical-align: sub; font-size: 60%; } .weight-bold { font-weight: bold; } .weight-normal { font-weight: normal; } /* explicit font settings */ .main-font-regular-6 { font-family: 'Calibri'; font-size: 6pt; } .main-font-regular-8 { font-family: 'Calibri'; font-size: 8pt; } .main-font-regular-10 { font-family: 'Calibri'; font-size: 10pt; } .main-font-regular-12 { font-family: 'Calibri'; font-size: 12pt; } /* classless settings for the entire document */ html { font-family: 'Calibri'; font-size: 10pt; line-height: 1.2; margin: 0px; } /* A perverse invention by Google: There is a browser built-in CSS style * sheet defining certain settings "to make the web look like it should". * The worst part are implicit margin settigs that affect any element * without "position: absolute;". While this might be a good idea for a web * browser it makes print layout an educated guess. */ body{ margin: 0px; } table { border-collapse: collapse; vertical-align: top; box-sizing: border-box; } th { border-bottom: .2mm solid #555; color: #555; font-size: 10pt; font-weight: 400; /* padding-bottom: .25cm; */ } td { vertical-align: top; } /* } /* @media print} */ /* The following style definitions are intended to be used in multi-line * text entries as poor man's easy-to-use HTML building blocks. Use them * inside s for text effects. */ .font-barmeno { font-family: Bameno; } .font-consolas { font-family: Consolas; } kraft-1.2.2/reports/contrib/debug/debug.gtmpl000066400000000000000000000270221467704360200212160ustar00rootroot00000000000000 Document Information Sheet {% autoescape off %}

              Document Information Sheet

              About Kraft ("kraft.*")

              kraft. Content
              VERSION {{ kraft.VERSION }}
              DB_SCHEME {{ kraft.DBSCHEME }}
              SYS_USER {{ kraft.SYS_USER }}
              HOSTNAME {{ kraft.HOSTNAME }}

              Django % debug %

              {% debug %}

              Recipient's address

              {{ doc.address }}

              About "me."

              Field "label." "me."
              ORGANIZATION {{ label.ORGANISATION }} {{ me.ORGANISATION }}
              STREET{{ me.STREET }}
              POSTCODE{{ me.POSTCODE }}
              POSTBOX{{ me.POSTBOX }}
              EXTENDED{{ me.EXTENDED }}
              LOCALITY{{ me.LOCALITY }}
              REGION{{ me.REGION }}
              COUNTRY{{ me.COUNTRY }}
              LABEL{{ me.LABEL }}
              URL{{ label.WEBSITE }}{{ me.URL }}
              EMAIL{{ me.URL }}
              PHONE{{ me.PHONE }}
              FAX{{ me.FAX }}
              CELL{{ me.CELL }}

              "customer.*"

              customer.* "label." Content
              ORGANIZATION {{ label.ORGANISATION }} {{ customer.ORGANISATION }}
              STREET{{ customer.STREET }}
              POSTCODE{{ customer.POSTCODE }}
              POSTBOX{{ customer.POSTBOX }}
              EXTENDED{{ customer.EXTENDED }}
              LOCALITY{{ customer.LOCALITY }}
              REGION{{ customer.REGION }}
              COUNTRY{{ customer.COUNTRY }}
              LABEL{{ customer.LABEL }}
              URL{{ label.WEBSITE }}{{ customer.URL }}
              EMAIL{{ customer.URL }}
              PHONE{{ customer.PHONE }}
              FAX{{ customer.FAX }}
              CELL{{ customer.CELL }}

              Labels ("label.*")

              "label." Content
              NO_SHORT{{ label.NO_SHORT }}
              ITEM{{ label.ITEM }}
              QUANTITY_SHORT{{ label.QUANTITY_SHORT }}
              UNIT{{ label.UNIT }}
              PRICE{{ label.PRICE }}
              SUM{{ label.SUM }}
              NET{{ label.NET }}
              VAT{{ label.VAT }}
              TYPE{{ label.TYPE }}
              PHONE{{ label.PHONE }}
              FAX{{ label.FAX }}
              MOBILE{{ label.MOBILE }}
              EMAIL{{ label.EMAIL }}
              WEBSITE{{ label.WEBSITE }}
              PREDECESSOR{{ label.PREDECESSOR }}
              PAGE{{ label.PAGE }}
              PAGE_OF{{ label.PAGE_OF }}
              DOC_NO{{ label.DOC_NO }}
              DATE{{ label.DATE }}
              PROJECT{{ label.PROJECT }}
              CUST_ID{{ label.CUST_ID }}
              CURRENCY_SIGN{{ label.CURRENCY_SIGN }}
              NO_SHORT{{ label.NO_SHORT }}
              ITEM{{ label.ITEM }}
              QUANTITY_SHORT{{ label.QUANTITY_SHORT }}
              UNIT{{ label.UNIT }}
              PRICE{{ label.PRICE }}
              SUM{{ label.SUM }}

              Document ("doc.")

              Field "label." "doc."
              dateStr{{ doc.dateStr }}
              dateStrISO{{ doc.dateStrISO }}
              docType (TYPE){{ label.TYPE }}{{ doc.docType }}
              clientUid{{ doc.clientUid }}
              goodbye{{ doc.goodbye }}
              docIDStr{{ doc.docIDStr }}
              docIdentifier{{ doc.docIdentifier }}
              ident (DOC_NO){{ label.DOC_NO }}{{ doc.ident|safe }}
              buyerReference{{ doc.buyerReference }}
              dateStr (DATE){{ label.DATE }}{{ doc.dateStr }}
              dueDateStrISO{{ doc.dueDateStrISO }}
              projectLabel (PROJECT){{ label.PROJECT }}{{ doc.projectLabel }}
              predecessor (PREDECESSOR){{ label.PREDECESSOR }}{{ doc.predecessor }}
              salut{{ doc.salut }}
              preText{{ doc.preText }}
              preTextHtml{{ doc.preTextHtml|safe }}
              postText{{ doc.postText }}
              postTextHtml{{ doc.postTextHtml|safe }}

              Items ("doc.items.*")

              {% for item in doc.items %} {% if doc.hasIndividualTaxation %} {% endif %} {% endfor %}
              {{ label.NO_SHORT }} {{ label.ITEM }} {{ label.QUANTITY_SHORT }} {{ label.UNIT }} {{ label.PRICE }} {{ label.SUM }}
              {{ item.itemNumber }}. {% if item.kind == 'Alternative' %} item.kind == 'Alternative' {% elif item.kind == 'Comment' %} item.kind == 'Comment' {% elif item.kind == 'Demand' %} item.kind == 'Demand' {% else %} item.kind == 'Standard' {% endif %} taxMarker: {{ item.taxMarker }}
              {{ item.text }}
              {{ label.QUANTITY_SHORT }} {{ label.UNIT }} {{ label.PRICE }} {{ label.SUM }}
              {{ item.amount }} {{ item.unit }} {{ item.unitPrice }} {{ item.nettoPrice }}



              Footer data ("doc.*")

              "doc.*" Content
              nettoSumStr{{ doc.nettoSumStr }}
              nettoSumNum{{ doc.nettoSumNum }}
              bruttoSumStr{{ doc.bruttoSumStr }}
              bruttoSumNum{{ doc.bruttoSumNum }}
              taxSumStr{{ doc.taxSumStr }}
              taxSumNum{{ doc.taxSumNum }}
              fullTaxSumStr{{ doc.fullTaxSumStr }}
              fullTaxSumNum{{ doc.fullTaxSumNum }}
              reducedTaxSumStr{{ doc.reducedTaxSumStr }}
              reducedTaxSumNum{{ doc.reducedTaxSumNum }}
              dueDate{{ doc.dueDate }}
              dueDateStrISO{{ doc.dueDateStrISO }}
              buyerReference{{ doc.buyerReference }}
              fullTaxPercentNum{{ doc.fullTaxPercentNum }}
              fullTaxPercentStr{{ doc.fullTaxPercentStr }}
              reducedTaxPercentNum{{ doc.reducedTaxPercentNum }}
              reducedTaxPercentStr{{ doc.reducedTaxPercentStr }}
              taxPercentStr{{ doc.taxPercentStr }}
              taxPercentNum{{ doc.taxPercentNum }}
              taxMarkerFull{{ doc.taxMarkerFull }}
              taxMarkerReduced{{ doc.taxMarkerReduced }}
              {% endautoescape %} kraft-1.2.2/reports/contrib/kfg/000077500000000000000000000000001467704360200165415ustar00rootroot00000000000000kraft-1.2.2/reports/contrib/kfg/README000066400000000000000000000001671467704360200174250ustar00rootroot00000000000000A very plain output document with position texts over the whole line and prices below. To be printed on company paper. kraft-1.2.2/reports/contrib/kfg/invoice.trml000066400000000000000000000133771467704360200211100ustar00rootroot00000000000000 blockAlignment start="0,0" stop="3,0" value="RIGHT" />

              {{ADDRESS}}
              {{DOCTYPE}} Nr. {{DOCID}} {{SALUT}} {{PRETEXT}} {{#POSITIONS}} {{POS_NUMBER}}. {{POS_TEXT}} {{POS_AMOUNT}} {{POS_UNIT}} je {{POS_UNITPRICE}} {{POS_TOTAL}} {{/POSITIONS}} Netto {{NETTOSUM}} {{#SECTION_REDUCED_TAX}} +{{REDUCED_TAX}}% MwSt. {{REDUCED_TAX_SUM}} {{/SECTION_REDUCED_TAX}} {{#SECTION_FULL_TAX}} +{{FULL_TAX}}% MwSt. {{FULL_TAX_SUM}} {{/SECTION_FULL_TAX}} Gesamt {{BRUTTOSUM}} {{#SPECIAL_POS}} Bitte beachten Sie: Dieses Angebot enthält {{COUNT}} in Schrägschrift gedruckte Alternativ- oder Bedarfsposten. Diese sind in der Endsumme nicht enthalten. {{/SPECIAL_POS}} {{POSTTEXT}} {{GOODBYE}}
              kraft-1.2.2/reports/delivery_receipt.trml000066400000000000000000000142451467704360200205760ustar00rootroot00000000000000

              {{ADDRESS}}
              {{DATE}}

              {{DOCTYPE}} {{LAB_NO_SHORT}} {{DOCID}}

              {{SALUT}} {{PRETEXT}} {{LAB_NO_SHORT}} {{LAB_ITEM}} {{LAB_QUANTITY_SHORT}} {{LAB_UNIT}} {{#POSITIONS}} {{POS_NUMBER}}. {{POS_TEXT}} {{POS_AMOUNT}} {{POS_UNIT}} {{/POSITIONS}} {{POSTTEXT}} {{GOODBYE}}
              kraft-1.2.2/reports/invoice.gtmpl000066400000000000000000000152751467704360200170450ustar00rootroot00000000000000 {% if doc.projectLabel %} {% endif %} {% if doc.predecessor %} {% endif %} {% if doc.projectLabel %} {% endif %} {# Include the stylesheet file. It will have to reside in the same dir as the template file #} {# "Set to 1 to enable html in the texts - experimental! #} {% with 0 as enableHtmlInTexts %} {{ doc.docType }} {{ doc.ident }} {% autoescape off %}

              {{ me.ORGANISATION }} - {{ me.STREET }} - {{ me.POSTCODE }} {{ me.LOCALITY }}

              {{ doc.address }}
              {{ label.TYPE }}
              {{ doc.docType }}
              {{ label.DOC_NO }}
              {{ doc.ident }}
              {{ label.DATE }}
              {{ doc.dateStr }}
              {% if doc.projectLabel %}
              {{ label.PROJECT }}
              {{ doc.projectLabel }}
              {% endif %} {% if doc.predecessor > 0 %}
              {{ label.PREDECESSOR }}
              {{ doc.predecessor }}
              {% endif %}

              {{ doc.docType }} {{ doc.ident }}

              {{ doc.salut }}

              {% if enableHtmlInTexts %} {{ doc.preText|safe|linebreaks }} {% else %} {{ doc.preTextHtml|safe }} {% endif %}

              {% for item in doc.items %} {% endfor %}
              {{ label.NO_SHORT }} {{ label.ITEM }} {{ label.QUANTITY_SHORT }} {{ label.UNIT }} {{ label.PRICE }} {{ label.SUM }}
              {{ item.itemNumber }}. {% if item.kind == 'Alternative' or item.kind == 'Demand' %} {% endif %} {% if enableHtmlInTexts %} {{ item.text|linebreaks }} {% else %} {{ item.htmlText|safe }} {% endif %} {% if item.kind == 'Alternative' or item.kind == 'Demand' %} {% endif %} {{ item.amount }} {{ item.unit }} {{ item.unitPrice }} {{ item.nettoPrice }} {{ item.taxMarker }}
              {% if doc.hasIndividualTaxation %} {# This section is shown for documents with individual tax rates #} {% else %} {# This section is shown for documents with one consistent tax rate #} {# Note: taxPercentStr can either be reduced or full, depending on #} {# the tax settings of the document #} {% endif %}
              {{ label.NET }} {{ doc.nettoSumStr }}
              {{ doc.taxMarkerReduced }}  +{{ doc.reducedTaxPercentStr }}% {{ label.VAT }} {{ doc.reducedTaxSumStr }}
              {{ doc.taxMarkerFull }}  +{{ doc.fullTaxPercentStr }}% {{ label.VAT }} {{ doc.fullTaxSumStr }}
              +{{ doc.taxPercentStr }}% {{ label.VAT }} {{ doc.taxSumStr }}
              {{ label.SUM }} {{ doc.bruttoSumStr }}

              {% if enableHtmlInTexts %} {{ doc.postText|linebreaks }} {% else %} {{ doc.postTextHtml|safe }} {% endif %}

              {{ doc.goodbye }}

              {%if doc.isInvoice and epcqrcode.valid and epcqrcode.show %}

              EPC QR Code Dieser QR Code ermöglicht einfaches, sicheres und schnelles Begleichen dieser Rechnung via GiroPay: Diesen Code mit dem Smartphone scannen und Überweisung per Banking App aufgeben.

              {% endif %} {% endautoescape %} {% endwith %} kraft-1.2.2/reports/invoice.trml000066400000000000000000000200601467704360200166640ustar00rootroot00000000000000

              {{ADDRESS}}
              {{DATE}}

              {{DOCTYPE}} {{LAB_NR_SHORT}} {{DOCID}}

              {{SALUT}} {{PRETEXT}} {{LAB_NO_SHORT}} {{LAB_ITEM}} {{LAB_QUANTITY_SHORT}} {{LAB_UNIT}} {{LAB_PRICE}} {{LAB_SUM}} {{#POSITIONS}} {{POS_NUMBER}}. {{POS_TEXT}} {{POS_AMOUNT}} {{POS_UNIT}} {{POS_UNITPRICE}} {{POS_TOTAL}} {{#TAX_FREE}} a) {{/TAX_FREE}} {{#REDUCED_TAX}} b) {{/REDUCED_TAX}} {{#FULL_TAX}} {{/FULL_TAX}} {{/POSITIONS}} {{LAB_NET}} {{NETTOSUM}} {{#SECTION_REDUCED_TAX}} +{{REDUCED_TAX}}% {{LAB_VAT}} {{REDUCED_TAX_SUM}} {{/SECTION_REDUCED_TAX}} {{#SECTION_FULL_TAX}} +{{FULL_TAX}}% {{LAB_VAT}} {{FULL_TAX_SUM}} {{/SECTION_FULL_TAX}} {{LAB_SUM}} {{BRUTTOSUM}} {{#TAX_FREE_ITEMS}} a)  {{LAB_TAX_FREE_ITEMS}} {{/TAX_FREE_ITEMS}} {{#REDUCED_TAX_ITEMS}} b)  {{LAB_TAX_REDUCED_ITEMS}} {{/REDUCED_TAX_ITEMS}} {{#FULL_TAX_ITEMS}} {{LAB_TAX_FULL_ITEMS}} {{/FULL_TAX_ITEMS}} {{#SPECIAL_POS}} {{LAB_SPECIAL_ITEMS}} {{/SPECIAL_POS}} {{POSTTEXT}} {{GOODBYE}}
              kraft-1.2.2/reports/invoice_kfg.gtmpl000066400000000000000000000143201467704360200176620ustar00rootroot00000000000000 Kraft Document {% autoescape off %}

              {{ me.ORGANISATION }} - {{ me.STREET }} - {{ me.POSTCODE }} {{ me.LOCALITY }}

              {{ doc.address }}
              {{ label.DOC_NO }}
              {{ doc.ident }}
              {{ label.DATE }}
              {{ doc.dateStr }}
              {% if doc.projectLabel %}
              {{ label.PROJECT }}
              {{ doc.projectLabel }}
              {% endif %}

              {{ doc.docType }} {{ doc.ident }}

              {{ doc.salut }}

              {{ doc.preTextHtml|safe }}

              {% for item in doc.items %}
              {{ item.itemNumber }}. {% if item.kind == 'Alternative' or item.kind == 'Demand' %} {% endif %} {{ item.htmlText }} {% if item.kind == 'Alternative' or item.kind == 'Demand' %} {% endif %}
              {{ item.amount }}  {{ item.unit }} {{ item.unitPrice }} {{ item.nettoPrice }} {% if doc.hasIndividualTaxation %} {{ item.taxMarker }}  {% endif %}
              {% endfor %} {% if doc.hasIndividualTaxation %} {% else %} {% endif %}
              {{ label.NET }} {{ doc.nettoSumStr }}
              {{ doc.taxMarkerReduced }}  +{{ doc.reducedTaxPercentStr }}% {{ label.VAT }} {{ doc.reducedTaxSumStr }}
              {{ doc.taxMarkerFull }}  +{{ doc.fullTaxPercentStr }}% {{ label.VAT }} {{ doc.fullTaxSumStr }}
              +{{ doc.taxPercentStr }}% {{ label.VAT }} {{ doc.taxSumStr }}
              {{ label.SUM }} {{ doc.bruttoSumStr }}

              {{ doc.postTextHtml|safe }}

              {{ doc.goodbye }}

              {% endautoescape %} kraft-1.2.2/reports/kraft.css000066400000000000000000000063051467704360200161570ustar00rootroot00000000000000 html { color: #14213d; font-family: Oxygen; font-size: 10pt; line-height: 1.6; } html body { margin: 0; padding-top: 2mm; } html h1 { color: #2f590a; font-family: Roboto; font-size: 14pt; margin: 0; } html address { font-style: normal; white-space: pre-line; margin-bottom: 9mm; height: 40mm; border: solid 0px; } html aside { display: flex; margin: 2em 0 4em; } html aside address { font-style: normal; white-space: pre-line; } html aside address#to { color: #a9a; flex: 1; } html aside address#from { text-align: right; } /* * A absolute positioned block to display document extra info * on the right top of the document. */ html dl { text-align: right; position: absolute; right: 0; top: 8mm; } html dl dt, html dl dd { display: inline; margin: 0; } html dl dt { color: #a9a; } html dl dt::before { content: ''; display: block; } html dl dt::after { content: ':'; } sup { position: relative; vertical-align: baseline; top: -0.4em; } /* */ html p#letterheader { font-size: 8pt; text-decoration: underline; } html p.entrytext { } html p.bottomtext { } html p.goodbye { } html p.epcqrcode { margin-top: 2cm; border-top: 0.5px solid #888; padding-top: 1em; vertical-align: top; font-size: 8pt; } html img.epc { border: 1px solid #ddd; border-radius: 4px; padding: 5px; width: 120px; float: right; } /* * Item-Table * formats the item list. Each item is a line. */ html table#items { border-collapse: collapse; width: 100%; table-layout: fixed; /* The following margins pull the whole box to the right */ margin-right: 0px; margin-left: auto; } /* * Table header. It is repeated on every page. */ html table th { border-bottom: .2mm solid #555; color: #555; font-size: 10pt; font-weight: 400; padding-bottom: .25cm; text-transform: uppercase; } html table td { vertical-align: top; padding-top: 6mm; } .col-center { text-align: center; } .col-right { text-align: right; } .col-left { text-align: left; } .col-No { width: 5%; } .col-Text { width: 45%; } .col-Amount { width: 8%; padding-right:0.8em; } .col-Unit { width: 10%; } .col-SPrice { width: 11%; } .col-Sum { width: 14%; color: #2f590a; font-weight: bold; } .col-Taxmarker { width: 1%; } /* * The table to display the document sum */ html table#total { border-collapse: collapse; width: 40%; table-layout: fixed; text-align: right; bottom: 0; font-size: 10pt; /* The following margins pull the whole box to the right */ margin-right: 22px; margin-left: auto; margin-bottom: 12mm; } html table#total td { padding-top: 1mm; text-align: right; } .col-TotalSum { color: #2f590a; font-weight: bold; } /* the lines above the sums */ html table#total tr:nth-of-type(1) { border-top: solid 1px; } html table#total tr:last-of-type { border-top: solid 2px; } kraft-1.2.2/reports/kraft_kfg.css000066400000000000000000000073161467704360200170110ustar00rootroot00000000000000 @charset "UTF-8"; /* Use google web fonts */ @import url("https://fonts.googleapis.com/css?family=Pacifico|Open+Sans+Pro:400,700"); @import url("https://fonts.googleapis.com/css?family=Roboto"); @import url("https://fonts.googleapis.com/css?family=Oxygen"); @import url("https://fonts.googleapis.com/css2?family=Raleway"); @import url("https://fonts.googleapis.com/css2?family=Inconsolata:wght@700"); /* General page settings for print */ @page { size: A4; margin-left: 2.4cm; margin-top:27mm; margin-right: 1.6cm; margin-bottom: 2cm; color: #2f590a; } html { font-family: 'Oxygen'; font-size: 10pt; line-height: 1.6; } html body { margin: 0; padding-top: 2mm; } html h1 { color: #2f590a; font-family: Roboto; font-size: 14pt; margin: 0; } html address { font-style: normal; white-space: pre-line; margin-bottom: 9mm; height: 40mm; border: solid 0px; } html aside { display: flex; margin: 2em 0 4em; } html aside address { font-style: normal; white-space: pre-line; } html aside address#to { color: #a9a; flex: 1; } html aside address#from { text-align: right; } /* * A absolute positioned block to display document extra info * on the right top of the document. */ html dl { text-align: right; position: absolute; right: 0; top: 8mm; } html dl dt, html dl dd { display: inline; margin: 0; } html dl dt { color: #a9a; } html dl dt::before { content: ''; display: block; } html dl dt::after { content: ':'; } sup { position: relative; vertical-align: baseline; top: -0.4em; } img#logo { position: absolute; right: 0px; top: -150px; width: 178px; height: 191px; z-index: -1; } html p.letterheader { font-size: 8pt; text-decoration: underline; } html p.entrytext { } html p.bottomtext { } html p.goodbye { } /* * Item-Table * formats the item list. Each item is a line. */ html table.items { border-collapse: collapse; width: 16.8cm; table-layout: fixed; page-break-inside:avoid; margin-right: 0px; margin-left: 0px; } html table tr { page-break-inside:avoid; page-break-after:auto; } /* * Table header. It is repeated on every page. */ html table th { border-bottom: .2mm solid #555; color: #555; font-size: 10pt; font-weight: 400; padding-bottom: .25cm; text-transform: uppercase; } html table td { vertical-align: top; padding: 0px; padding-top: 3mm; } html table tr.secondline td { padding-top: 1mm; } .col-center { text-align: center; } .col-right { text-align: right; } .col-left { text-align: left; } /* The columns of the items table */ .col-No { width: 6%; } .col-Text { width: 75%; } .col-Amount { width: 52%; } .col-Unit { width: 12%; } .col-SPrice { width: 15%; } .col-Sum { width: 15%; color: #2f590a; font-weight: bold; } .col-total-first { width: 60%; } .col-total-mid { width: 20%; } .col-total-last { width: 20%; } /* * The table to display the document sum */ html table#total { border-collapse: collapse; width: 16.8cm; table-layout: fixed; text-align: right; bottom: 0; font-size: 10pt; /* The following margins pull the whole box to the right */ margin-right: 0px; margin-left: 0px; margin-bottom: 12mm; margin-top: 8mm; } html table#total td { padding-top: 1mm; text-align: right; } .col-total-line1 { border-top: solid black 1px; } .col-total-line2 { border-top: solid black 2px; } kraft-1.2.2/reports/offer_no_prices.trml000066400000000000000000000155451467704360200204060ustar00rootroot00000000000000 {{ADDRESS}} {{DATE}}

              {{DOCTYPE}} {{LAB_NO_SHORT}} {{DOCID}}

              {{SALUT}} {{PRETEXT}} {{LAB_NO_SHORT}} {{LAB_ITEM}} {{LAB_QUANTITY_SHORT}} {{#POSITIONS}} {{POS_NUMBER}}. {{POS_TEXT}} {{POS_AMOUNT}} {{POS_UNIT}} {{/POSITIONS}} {{#SPECIAL_POS}} {{LAB_SPECIAL_ITEMS}} {{/SPECIAL_POS}} {{POSTTEXT}} {{GOODBYE}}
              kraft-1.2.2/reports/pdfwatermark_3pages.odt000066400000000000000000000236031467704360200207770ustar00rootroot00000000000000PKdU^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKdUConfigurations2/accelerator/PKdUConfigurations2/images/Bitmaps/PKdUConfigurations2/toolpanel/PKdUConfigurations2/progressbar/PKdUConfigurations2/statusbar/PKdUConfigurations2/toolbar/PKdUConfigurations2/floater/PKdUConfigurations2/popupmenu/PKdUConfigurations2/menubar/PKdU manifest.rdf͓n0=wE8FP=|d-D/G;PKq't PKdU settings.xml[[W"9~_AuV:PfAg-t5I"~Ҡ/4O@_JU}_UD=uᧃRKߥHFPM%kWI|!jE꣪IA/^|W祉i\N?;.ţƘIv>pਜ~z:z aϥӿ8%ؗ2);/ᐫOV+{w~5 b`⎟xG=.]We_nF~brd'kW*b¿Ov3ANcpK(tmh5S&MGBwOD/u kw}&oKCuJ269se{b7J`kN>V݇v# ɮM!l޿I(j&B -f& D/\z˥׍YTڥ)"o솱oi냂Cܴxa?Ҟ0.cuc5! )9k,\|7ݞ x?/dVCt15.EWa0sbX4;*aAB`a A@`0Fq'Et?&׸K+yNvbƇ\$P0 c]LaLv3 1I4%LA>am"=$a! +vRQ$"%YZX ; ^-li$$QG Ĉ &q-$RDCS$NT戇ո Wuj_=+hȆ^[!B2|W3\Hd#LAir`J!H8fkL^}{N.#A/eR "ʪkƹp|@i.P抣]Srщޤn [5aHw\Uȑj)3r~4$[,?_ۋ(^n4_MZp~"FU ̡:WAյ!eEBH%x=6Xsw-ݖo_N0m{;|ɠ5X,qݖ̛]:O4ԋos`-Mz-A9?aEܥ1G`.BgBqq7hsۚL~[:P`\(;d)CPo<%BE⪰F=,V!!Rڳ +xVX/#WV?DP-DIyNALGDnâfEdH1%֑䚬TZj y}dP0uv`Wn(8ZIі9GfL` c:9aaJI!9s@hy)M۹PKln3PKdUyp/Thumbnails/thumbnail.pngPNG  IHDRjpPLTE,0.-LKeϽ;6V1Xzˑ孕a}zp@ͺ=A-xt8|kÇ,<|"Sg> [6/_s]{ęaS)NQKvx$B.'N&x'C2kܷn>qFjԨ~+/B(9ՏIENDB`PKdU styles.xmln8}`e'd;b}ms#Iv~EdVl1-sbϳ3!fфHyygrwb ["rVh!cjąZ&J-Cպ\Njr3aDF{#4ÞffRM3g<~^~j5x =cD4dTq,hR'KQ[ Gve-d>qCڜMwӏ4}mJs !jqH`1wwcXI{ K* ݝ\3Y:pZZIqM$4Kj jY ɔe W* 䦮 e+?/![8~35:/9֍>guGXO12)tO R:Rh*xERf*Y)@%$[*G soG3M#nHXeQ+&GXs׫$WЙD -;Glk&,;Gd ljRn`)ef!SKkG3 [yb0Nwd-i[(҃MYK/[qjxO P' 5B 5_&ZeLs':Y!! m3=ܲd4M!4FQg2ڶTVE+>_iBHʡ(7qڵX6sIoa1-9)YNyApye] :%bdp';!hnÂ-URhd,Lt;@)H- >!3pX'Jņ-N<& R>2[&+c~`4  ;XI*63,1OsM9"ijܜuu|p MK{E)9$D=srי1ŷM_N#84#xxPkS&yͨp46ih\Sg"`#/3zjf_S/.B[he|*{m^b~!5H[3Ι?Q3a:$:kжׅfTm78n'Spj1'gCgʛq xôɴ{i/}{R):*7ƍIּqO1ǓK=5X4:U$n<ai'9i}u9vt]* Me_,|o '?K8NX&*moRO :{fCвߪc Sxpr] g3h`0l?8fq ر ׫@!m,.i;␶Cn.i;䇋C8퐻C8s0y T``,|S+@ܤy,v}L,`="͹|3 iUא鐂_A=h'fpZדfcx!ck`Hy!;} pk-COKF7$z_1maO4_~7۠R*nu{Ff2)>4WY.W _ncD@Ji"$.{;xRaKCΣ![$U~Cv<7>摜#UOSY|׈(Ȋ_ >ijMBJӯ"%2^_)V%.ԯ)Mxkʟ.D\Ճ+[N>ZxE3Z([+R5]帍8@NU͢[DN'?~)6븥MϓSHGmu,c6ZAmsʎꟁ}:/PKazX 4PKdU content.xmlWMo6W*C;nd/A Pl@DRJR;$%v,[Df烤nklLt~3K*rY0Q=ߟ]{Y,Y! \ ` Z/C60[HUoڐ[]зW ݯc6I|\bg PF\?/o1 9ݳˬ.{.d=n sdD&f::3y&*g1:sEoll51W0ח[bjxR`vf8*᲋yvXWyfU|yǓx^ҋV5~PK_2PKdUMETA-INF/manifest.xmln }˄0iO=KLD S5o?5MR#ߖ.-qXWe`mž_;7NIN"x +JUQR-l\:@tm\&nh.a(W_!!tZ0*7܂6\ـN֖^ѩb⮯yURb{kѐ8ce뜲 &xtMˆoA혐y2^։Ow<4\EWj01(m|:xJ*c=wDLZC~}-<|1N_PKK -%PKdU^2 ''mimetypePKdUMConfigurations2/accelerator/PKdUConfigurations2/images/Bitmaps/PKdUConfigurations2/toolpanel/PKdUConfigurations2/progressbar/PKdU6Configurations2/statusbar/PKdUnConfigurations2/toolbar/PKdUConfigurations2/floater/PKdUConfigurations2/popupmenu/PKdUConfigurations2/menubar/PKdUh Hmanifest.rdfPKdUq't meta.xmlPKdUln3 settings.xmlPKdUyp/( Thumbnails/thumbnail.pngPKdUazX 4 styles.xmlPKdU_2 content.xmlPKdUK -%!META-INF/manifest.xmlPKe#kraft-1.2.2/reports/pdfwatermark_3pages.pdf000066400000000000000000000232251467704360200207620ustar00rootroot00000000000000%PDF-1.6 %äüöß 2 0 obj <> stream xm A }­Inw/!S,X`!xg%f z{zdG] %̓;$w7de>CRdmS&$kbg(V7T^÷_v g7hoc0 endstream endobj 3 0 obj 157 endobj 5 0 obj <> stream xm1 @ IzwM!p nZA${COv/@@,蹋 $Nxr qq($=+lĐ"YClQ2uѤdMRŊΚ3`+د`|tcvό6f(ke0 endstream endobj 6 0 obj 156 endobj 8 0 obj <> stream xm1 @ IzwM!p nZA${COv/@@,蹋 $Nxr qq($=+lGbY!EV:hRH&)vƊbqgM0|PK>Cvό6f(ke0 endstream endobj 9 0 obj 156 endobj 11 0 obj <> stream xzmtSו˶l}`ɖֵo ,۲Be  $X%[JlIdSᦐPSd|MBHJ3@3$+8Ӥ}]6/yg& k92vͬsM&5!Z2Cx %7qt:#l3ݎ!ƒO՝W Q#D}n|X֟eF IH(,GHP#CdW{Ga"1z3WOlUx9/".C=0W)J'LY$dmH?Di?"8+*H[\#]cD$?C,IB?gwQhrr#dHL!ey=E29fϐq:ϼ|, ^|d܏|G* 1hȗ[hc,S\ >8>y;Js $pNNO$>y[[>Li٥ߓY=@V2Lux/ 0o03TwwspܵG:;8ws2!R | ),.LtsMWH!Z-,Ê͊1+&Q,KlXSV4!{];z{ovv{۶lt ׵468uk׬MZT:A`oHCݎ:<AI bw7#!I jBAɍc7Is%I &Btyسˏ1 H )F 5XT4ZSNGg;#BG+,B!i[΍sS8PXwvXmRXT풚b4trTy= ڵa1/!ԝ;gg vVjgĎNN/$e^fKp:odF[BAk_E/s=;lp6t~qfDV;tM_|U~- QV뗸 !UU% i8zMFfvs@F/ 9!ʙsԃ"ֶg?+)jNѐ43u7-J>VF 0Y r5& +`PY=CJ> `(h;h90\# %w\ι'jXX+RY. 36g*T.ਬ%9;ٺ:g-qUZ\kg]:lu?<&ق01op@G0C V+g9StdF[sf%MFsV>z$^D&|J zL8l`%yi C:#o0ޝ(iVrC ;F Mjw24؟݌DsYN^1 Fӹ,`9k5x,Y&RHzgí3'‘]sn82 _kzs!rJ(B-#aW݄0>zi4 Ms9r9ǝV M0MPָ Z%=Y-u<9p"<2tY-VDGzaGxt a(_ Dg؈K@q I܂RHE(-GWQ[̀3X{pI ?/JpSEjH9wPgUX T@AAFpuÁb 8X pV~Y*9F髀6F_dqm]`9͗Acc;u/^2x6v;qV46@j;\M딆2SUzÚ*P=O27;~ϝÇW];լbU<[ђҜ,~œ2v*KIqiq4(Set8Wz#@,pI Ј1tNrb|zR%̮&#ĀHȂTʾ';HXdϜ9Ý T~ Toe=/(reEWFc@*-- a*(ceÁT p@aoNùZ_.w]wlf^hVj !8koml\d+l[Cn_B[Е*Kf),R]R|IQ߹DVD"lf0Ae_}3 /q31 ̰ >12ߚU3[(k{C^ b%5df(֢SzWd0t _@m"&_gppok4:e=F[l]F%V`-ͫj-@]Rp;O}}*]ͶO- _yhxhyac_ ݿW<91[PKrK?/3r),)QrH[+%İ+@ϕTm,U\Z*.}zuAlie 7 @8c>xV~k~.˿ELd%9cܢ5&iU`-6 &bfZ宀<_ R%0S JVH%l] T09wM_JiɈի \*SUjPl>8w^X_nnH]W_&V[]іOX&3xr,VpܮBQM5x{N;VxʁNVtv DzCCƆY[^{6 ?b<:Xu͒o\a3(-MZ#z TWX֠;ibY VfUrzk֋+VA0i=y$5]l1讶7v[p}ƴb)Q+& X֚%fxR/S if #; GނGY~]Ɂ?81͒+,ğ)fg݋uNgYb˪ dmq1Y-**J z_n/TZW / 74_j6X-ڰno-7qC ˆrꩫ%!ZU+irv:RU1H7JJqq/Z+~=diϒx%!gOGTS'[qe@I>Qn%ėbڽn戚02@#2$ Vy^>6k;^ H xd"_-빿bkdTi ז32 DP2̑(h*D(V&L&ܿ}H.(V-;/s 둢V&'zqZ)V_:mB_YNwfc}KfD}"5#xgDHx!4J$I"U kZci x ȟ@}#B- 1 ''5!/GʹچhFܮ@%,'SG)[I"(fql)n8MW#-В2a$%PC@^9Uj{%iLd8 }q GY%6툜Q9wcS,0-ognO3<\Y \H(C,aM{,.k` ԏ ęi9JS'{=o},\o-_ay4$8H' #rN}3-27iM&Xe,s٦R܌'~tR}X2f15" OJGn=9sKB, Y/v$[QցI_,g}|Ռk^֣q%YR,cKnjWb^_$ʙn@W{f#3oEcgX襏@hee哗UAK ͗a/%٥KK3KK7||r~fyN|o;mms}g僧Awv=|; 螱=|zۓ]o<ƶ9 Nj סzfγ&؁ӆ>xyP܆z?G(+zu}>g~qBkۓgۼ 6]v/>R wsw{k^ʻ:dv һtC`]dȩ[q:ݰp3fPy8178`W/H^ H5޵GRО9? >vxVHM~)*#pS`93錝]`#> endobj 14 0 obj <> stream x]j0y,o .Cm@j 1.|&P9gHNk:)LWփ\öaD1備[ Z$x胞.|/ru+ HCCRUd< yX @׹v,q?XG(l尩 Êm[,ʼe砭40rϹ9FM9z}?s7kϸANpgz.(۵#aV.%!ժ o F endstream endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 1 0 obj <> endobj 4 0 obj <> endobj 7 0 obj <> endobj 10 0 obj <> endobj 18 0 obj <> endobj 19 0 obj < /Producer /CreationDate(D:20221203133755+01'00')>> endobj xref 0 20 0000000000 65535 f 0000008488 00000 n 0000000019 00000 n 0000000247 00000 n 0000008613 00000 n 0000000267 00000 n 0000000494 00000 n 0000008738 00000 n 0000000514 00000 n 0000000741 00000 n 0000008863 00000 n 0000000761 00000 n 0000007606 00000 n 0000007628 00000 n 0000007820 00000 n 0000008179 00000 n 0000008400 00000 n 0000008433 00000 n 0000009001 00000 n 0000009099 00000 n trailer < <600627D27A4A6E02BF6BC0FE03F7CBA9> ] /DocChecksum /5A4F44497702D75A7B96DF30B92BC8A1 >> startxref 9274 %%EOF kraft-1.2.2/reports/pics/000077500000000000000000000000001467704360200152705ustar00rootroot00000000000000kraft-1.2.2/reports/pics/CMakeLists.txt000066400000000000000000000005021467704360200200250ustar00rootroot00000000000000########### install files ############### install(FILES lurchie.png DESTINATION ${DATA_INSTALL_DIR}/kraft/reports/images) install(FILES postit.png kraft_customer.png DESTINATION ${DATA_INSTALL_DIR}/kraft/reports/images/docdigestdetailview) install(FILES identity.png DESTINATION ${DATA_INSTALL_DIR}/kraft/reports/images) kraft-1.2.2/reports/pics/identity.png000066400000000000000000000110411467704360200176240ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs^tIME"eIDATx[ p\y}hw%$Kö0D2҄Li!S:f̄$t<BhIII@ cclecY-[kjuN9f%M̶>w 1~0_ ?{h|{ڎesQjO,OϑuF$lb!''z$Rbo w"[(~1JM0%ib$JB$g mƇW]|$=zE0Up )!['^Ň~z:[b&vaAM* bA4(eP ZqM-\#k8(դ0_vRJ:>>qz xV(h,"X|džnÇg[^0nMUq0 u-XrH'w 0H13~J_|JxX b)UQ,L<K Q_ROH!dMڏ 3sgy'=9)[~!2?&3ԈX}j̛T­{VOgQ$ !t=ӆ$RgE^F2Y榙 )#e㡄׭ Rhݺ Ľ\׹CJѱ #~-F[ rcYg3r$۶n~޿}-p~: 0g(5tD2:=Ncg5!}v^QeO^J$ (/WLOx' %b,^4Ԍy6ο:ԃ uIZŪqDטqUA):y$]t.|aX=+}{a7^~[i?ȻTpB0K#f^r^|;_r⭊bA,tw5 JGAE.ahvxqO[b̸*nѺS+S 0ˡw8Y _Iϼ HUUe --QE-g1w08E`qUEG>f4y4Gdr๶O ^(򺚫!@[ۜSNBJEc`zL_1];5`?$O Sng}ϬZ=?8m枿Κ=wAi"JES b3SهsPP?s|)jƯT+Fw 2BUH 4V9(a/0@ab C}֕B᪄D:]Ega}/\0a'=B44PJ3' D}KLUilH)!Q>If:M TwRHsdw-Xk;/1-$rl֭u9PJn`0J,53H/Fˎgx5 -mHgϚ=($(oU!{T+;<>utϥShmmCSKJ!vEUԀIdƽcc[(@gg'hpgh 뼦1Y@F6q R!<*T*dAa$T)t^3+HlLrX~ "jܵ~Ѯ7;R㑅DшSRU\O{('* U%?q9-[=ɲGFrouۡwv7}?`+~gtsc 甀sFS m^84>=60{#ǎV{3{kkҍ :g=!^ n) , -]sut #Z񈉈8ΌlTp+H._r pK/~L ;G. ^~f.oL.O^AQAze;qBd Ѱ" _nC\MP"BC= 5xE*4T{ws 5~$$ z05`U\^Bh.2R袤019*Be4˵@QEWf]p*\c2ܞ R攑kvA*&}BJBI-cZA@V0'y8 Q l0*&{bѹ“R? *-S⫰3 zy WLgn`۲tx;:C_ 7U24(S ۏ ޕma|oC vEquO摈GBHVNN!Y)(Q&{{Y[TT/Fy1jwWxkZΨK6V'"~gHc1Ţ"DX<}{ѓ1ʭ R&MX>wl(s(6Z43~[hUFXi'b"qV*$̩E#O¤S! J#,uLH +|+tKN'! [v'o{ R319Cx$s %UB /%%bBH FBA$vQ  PcSJr ,Y.i3{`شi-~lQn"qgpgq 5IENDB`kraft-1.2.2/reports/pics/kraft_customer.png000066400000000000000000000114401467704360200210260ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxZi]Y~wx;;N8iRph46 TЖPAS "AT@-E~T]( ޔiK8x6sG 1f sMpw<ව ꋏc~]` ю8QSuyh=R[=3`;6LY< W3 }<<_4d, ~?e^!]hi;2Fɑ4Lv729/֔,{a<'{;l+dz}:sdǂ0XVV+ô_mdO XӴˤ]-)3U`Q?+eOM^4%@7ip9<ݹGN{_ ĽKjٖ-"K;ô]:!ycFXyGEᑇnŁr o=VTݿ^z= ɛb$ftc?:d7l?sMC?KLDy׆\HBE(v:]ty;?{|6[q YSs]سK.Y• j6i92ꦇ=b lu+*dLF-TDwA:9TVѢ#ׁ{M bdD8_ysWuA\^lm9T6T6^=҉/:4OV{Ư i Aԏ&2@u XFͶD9 sþad6q~zuJIE# dFرs|R Kg:_AU& l07%Kz}|\]vhP0 oFʏ"td_;KK l7>V*-,5 窛ݡ8Jwt ˎ򐉁9Cm:)^zfBρ/kvM`6,ǁC5<ze(+ aY$2ܨ t]3:EL2K}epw+z>1NAo9t V]?ҷ/4;v abba26p@ NEq8y-7XD1Z (3AR ڍv>|^$F$6L]3{ʥ܁ geF th"y!f*X}w '=YXvqۑ]8zx'cn`!ɖn (-~$>U7K*hWMJmt5 e rb)9X 'jBR*#v,^qxiEJؐfK8VEx,J l.r Ik$mIB֙UmCϹkdߊ$8 y4  :B ZBu ( NT7XW]U 0`|8b0 U3f4 J[v|C{K)0(ӑ׽M1q1o,/1384sIKx)Y&>9<p| ftזt |Hō(1.,n/ [~tjT^^ax8԰uOWuF'عmxj~gq2;i:mvhA&>c<с\.3e0dK5 WdND,k}F?YF[N%CFet#)5|?jy5U 3K8 4:8h1CN_Bg=U<9d{x<5F,t{L6sbe"u`3ņsnFWc"vSp9#) n–ϠRbtg|Wkx1ߦ,a{"e%ք\L=V*f9Q9hӡ@#e gbqE|6-ߏ*f)|I+'!f$Rwގѹ#_{fm]3BkVkr54dRgFulx!x<[^_|_Bg #Mv-d9 RpJ4 =q\=C]{|-1G cR0Xkx2W~X Y\xMЉ<(a,[}oib03zTC”c2"wrɏ@E+D(g#2?s;8kP퀑v8#C>!Cٗ x A~/$9fh}YKae*2c *i! ~< \3~K}yTIĖ7?73ͫ/)l qLOa3į+QŽq%(Ρ,Xܨh$Xo'oY:y`M7+w,Nݍ0nB7Iﻟ`xI5'$^{9ŻIB/TqH&MsIL|s0 34ʵDqWQaYCXrz_1>gkfQL$0_G'7XFpMXWq.t}{OlYC1ìW;ǵlN89JaR* &GʸkrÅTrTƔSrHt,,.+Qcj$*a/=S.h=p>8)n,CF ohቸĕ_۞$ ö09>ZRer$\2+MsjVP6Ռ"QGQB |ȽX;x/^\_?}_C @/lp\/:fH9Rh4=>Dof⻭\QJ>5YYp]qF1iI Ѧ9 LyeҒ I$~Ze<<6!$NHH7T$F"L% <`&'$S7r-5ic;K"QP+xK[mjI$,xRݓj2x D}A&b]b qh<hG A3DyME?z],bHL !wv$-(Lx=Q-aj֦:{Gл6>RCD9q3fRž4yD Wg{&۝q$5~7WE^V7HG_Qճ-beOo,t,JZKk-it=xtSuA4g c {O_Z+FD;ݒ+YMo]][mf;.SE|@E[2HhEH"wVd$ GIK1իu]{ĺT&x#Qa-U/peYyB^ȴ;pzSW>0D`;@0cYdSR#&ힰMJ->SoE| 0ۉ%mϏ~/G|2S7L-+EO32ENm2$-HcV%V4A8J]Cz?s?|pZ3:arxI/$p#K P·3 F8`&-!eDUE%tk><}/3o` V7nIENDB`kraft-1.2.2/reports/pics/lurchie-trans.png000066400000000000000000000732461467704360200205720ustar00rootroot00000000000000PNG  IHDRZ IDATx^]xTGݸw/ŵXxBq-݊{I?MHP|Iv̛9s̹wUO5Ԁ#xOT E |Gь^?aࣨO@(K|' |5 E3~zO@>hO/ ȟ0Q+4xSe֩j:rTEzyn~9Ec})KGߢA bϝ;_|s;uVu%/7mؗ R m-Z4")))ݻw .]lS[juFLLLnmvONx\ڵh| G`:a =o޼7={fѰ;?9viGӃ S\l؆x,α.V؝;h4h^}M)CKo'}+̢ˍkYh}&@fޅʅDž˓ da=ӮtBĢN0`" \]韾7=[d8|#!&Ṇ]Fbg{pbƟ8"!EJOI=\~IjYf1ͬy<efl6]Wx8u>/ (ʭ,xg3#N7I>һ JB!]V^ŋAR>`H{{5|oW &̆`*N) yfڴi7nX3=e̷~;xr9رcyAj3JNNN-Ydti)9'{Y=zt'N؆Sjժ3|_ =fx6spȑ?6LIIQϟ?QF駱r+رcf7ԛSWDH޽{322z( Əue:KO6l4{n2f|ݱcǥ?.cC]oΜ9@Cj:u 07olx)8o5M)WժUL2'OK.}{y톨!!!F I#6l8-LJ҄=onݺ_ b˗SIPQsqFǠ5 5JUVme|>}C/~:ׯ_s#""%k.: 41;O׮]dStƖF=zJ*!Cg-`z;Z|xn8Z6ꍔOC:tҥN>2 2߽{7ߕG#n%+VE(__#ʜ4v0( *:2ԩS5>e4MeF| u?NlS]xx~ƌ7 G8tYYZ2~0}:p/Zu7,ԩS':?dȐ%r"RO,,w*7tH*+y($/qԨQx>~WkAcRS%:Nnߪq6h&Æ [EUocX}qw5Yfq )qV(]T ,uC3f؊-˭hT=ʚ!84HEw2B,X<￟ Ès333{'Y.CCC?WjPoXoO`=KkX X7 r|֛unĨH'.b @9]\\`wcd0XreGP6)$Aq F@???SX+eJm #-^zwd.\8:ӧOy@6E&H^˖-oa+dfTI5^+ O vx, MrDł-ύaق(NR,}Xs,w<%y6<Ν; 0#r!X!VX7tuĽ|X] lХx8\ׯS  2Σ% ,X:( @I?'$l۶j6m|zCd?ddD{ȑ{@Ea ~[ |t)hQ*W wແa3^wrrBƋVw1zx^%hrȴȶ,'E/̴lG|hX } , Zp}.X(;bp.7N xDz: j`h2uQ5T=s NN8bgΜ=&k11oDv.7Xˢ'Tۗ7\{Ⱦ7ҭ@ܯ0()E25;&M_oŶ-uڵ\F7~X^v\hW\I(kг+:5qϞ=M-ቊtQ(/U-pIڵO?޺uk /vv$3=&XR*"i5hhrxN(0)1 s5>goaϷ(S7,4A5"L80W.l{l#gJ@I9sfߚ5k CfF7z `al`ɺ k?Yfk[C5}ȃ0E}QoIMEGRO7g?|<2`8NWu GƐV1o3oƌsHn6$.2[@~&[WY.-\PcDo:a@ CiXV1   R:Q!2Wsr7 >7ltOِlEjT#2kP[Xg>tQ#g2AU8ewtH{Hbuzka>7 ӧOI-RVgEz3@=E텥MY?q}Yތ@A@. FS00[ck1ы( @}w $Q '1ɍ_Ƃ-ڍ#,GHX.| +t)3r5z}19iҤP"V Q&07''r)>I y"'2-rf'L@Z(&'t_,z(灕{ S  TRܰ(k0 ]v?Vؾ}(`=a0`SǾgsxUXa%,* $A()-# !q%?M$,-E2+M.QM(7s%ȗPr Y>|~&@$E->ׂ*.LXNW$)a֏VC>_*#[A8(eB<-rsd gXfTVO[>#'O0.Fz[Pc-2p #u(impN\䉎˰W=nD3dϮ[ljЏ\p̆ch*PoPo&/qhȼPFx^('ICN w9)Wtmk!}mrz@TZ!!6A)CH wePG.HkY.HѱDee) D]և<Ď\)c|"m,N>sNGL {D{?NP(y~UQr oAKE'Gq,A|+W|… y/PПoЩ')flpAo<~XfM~ЏxQ#dI:N# NpV|z#P?q;A_޴W"Piv."Hׂ%&,ߙg2 [ʊ`Qx &C0*F"{dTX7`/ M1KO$2`b\{E 7ta)&OEc+,pxo P,(ah@>WXv H[mpxŨ1D`{;Xݻwos"0WEgPC9%C-[,j߾+h// ,UFfGHĄ3W`sLΏ_A#Bd'P#] @ Wf$=v)Q'R2g*TH8֢\?Ԥuؔ%S0Q2SEцgT6xI`ּud 2_֭h?vc|7GR O3_aX(>\?ua{``ut3cFm. $BH w~S1Ä*~x\gFɓ'gaR. ai!yV8Fp+Ќ^p}KTxX]Аaaț10$99 TAďGEǁa"Nu.#]UCae@Q0C}B/ޢɛ9*IV7#* nxtx?ɐbDBzШ7op,˙X*m ҳxKIbrݒi[<*X$-CRQ*UD2BKL^4Mဪ 4@}w!, |hC\ ZBD P dG%Cjnd=42W,[znk%*#t5:r*AGބrOEtZx`/@P(~UuhQWYd~OjTĬ#8R*I}+-,Èg+9"ɚ Ȭ<|1P)ɗpӺADE%'\GtN3|0<_tf=9|^[֭k=,4ĀhUtVd[CU! T ^n~P*$~Ve2LPܐET)v ~٪W;U%ArR{CK6' +GA1$w؊R'8? i>3 I&$gctXSE'ZA֜Z jm*L󋒻$hT6**@b 5Ee2~2-!EVjfFҥL yͨgc}2V`GZ8oN7L$u***R:zLD bSh!6]Qe0zz"muA!a9rP?QPNM/ͩ P[;#Fت}{f픬rBؿoۯ.ۜ ]@m5v,Wmp9C%=({Hxtر)?%0>4*^>VY Zj$`[/_ FD}n^I6'Ez0kҖgT@fp޷{?T7HQY,KOao^\r7eOUNN[?&r:fU)l+~ū2V[Kq;}Tp?B"De4Fgw0@E)HZD%HP!!4'_(f7dv(r@sO!okf/\=>04@ ޶iÆԊqԨ;KVY٫_ރz۽wޓ09O Qt [ }B@ Rݍ%VvR%"6wViaIyfՍ-nFTFp{ Xp:vUtoss]vUf. ĻY 8`׶[j~f U󪧴>֮oU4dArcE-X>~qu;3 w=ā:eqJATt|GsBZ*K:8[0<ݓ@Y o(au6Dei25^KRY܈`(*cN%iOߖwV5L=xqN9˕ Je_zLqKMHS7tD5i577ARGd},Хc)qa1j 禞q [+PU|w#ٻo̞@:2XI <ZgðCb2/O$1mOI%He&qd  |U4Iw t%K9ӧS-s ,.{*W+ 0k֭Y 4CVYr5ǚ"v0>j,TÎmmQ7yUINFjibw7گ :E X+LC͞vN6& lun մllS fk ,,r[IXiE;W24]|AsXzc{0uFqP4Jdhy5tVJ3^6U?65ɿNDeHBq߶EVO6yvE6l::'h ^+۷nv 㤋`>۶mSgf|fHUzɒEc֬XQ88)X١JQa$a^x'*jNw|: kLTw4q#x$ʓ;5$B~['iQ"I0%Me$7GAC>㹌(i3Ȫ*ŏt}f9=dk-8 lף[ǎɇJE]il"("?v2lض:@6޶iӂ? LHSW5u\~UW߶nN""&_>{UNZc N|ZN/qjXʤ{ Џd dOR:EH 7L$S%K`'CpH`QR:ld@&^e8F3hm tU֙ 0 Q a t˵UdKq205`*>¸g9ȤJٮUp|Crq|-/ǟ\tQYCuX=XVZ[`2grھ460i|GZ$*xb R\ZlvNEɂD|4qߎKBT ,-j@HؽCõR;ZOINo:ߊzg񀒡.'C|2:9GY0=v>Qe|f5ՓPI=f*w ;!ׄrrRBZN-*9(y,r* 辶F'sy0*ٽ(If "TB܋X4ᤏ $u1ű%0ýiiְʃCHfd['Kj5c 6}шCFfnpjի1w4Slp}MDac)'egB~;) i#N7#pLGUQKVr v8DT!+b; *Zܓtݾyӱhv+Be?ʓjA,*|?OJ` :DߤT#XN4 \hع{)+v|/5߃GOpg,/*8 Ulٴ;OM14('CζAqpjm_|C5#YNX>zg3BvtrReY҉a J laiYiQK[L(cKZH[ K ɭ]=-V1FS|Ff"㼽|a_K˪*6__B/U*I*FL) ̙up)50VQp\m [&XɭscO.;3satɂu-Yɐ말l Xɳ8 "ca5[ϦcX?2~!h*xZ/i4೨t݉Dt4"1ЋIT>VEthPI JN (;yt|$ir"Z-ejDWSōpUg޼+#u7ϟ==d᥉_s=pdw44 /] rKxC}B[A|ݪiI DR2)i%.y%8ja%$F-ROv Ԑ) W~(̲YʬE"ߋEU1dh Zd3ww-4Z@6Ç.XB>sD,F2+[ضvrc>1f٫cLGC)ѵ˥O'%ِic"̒"x 9N\ fLB KMp9!֖u`:H8A.j1(P,(0" N:(=߳#h⒥$1;W[]Vulɶ={ewe0#=ݨ-'[髝W{>˓cgbs 6,_}1M:bJۨz,R<V9n;7i*_,O6Pj1P8sF5! '∕V֖Cx *C|-8%hE9HكsyRu9 fRNG TFұlv'Ξ/aYQa]cZOTf*ۣ`k7n-]iFnFO: {R zޛLxU2a^W?M5iÛfA :e:wR\2+ ~ErgfA73ܩ*a .oY*XXƵFV(~0 @6D~D%t[WFN={fw oW8&AXg=&+<-`TtOP ؆VKcD0z4c9&l* rU CAV,,5am=+WfDQȗXQ Z^$s-zԬy-:mC2+߿\ N?3 jKKxܺSK˕k/^hڕ+qC##mJC~K`4B2DMl dIڒsU$+ v"Nz-fZrJggfwДASRBͤ3@̧]@?~o.g u2lڷ?cqֻvW'JA^yA'IPúpiL+ $iB3t] I$xsI\ $'5̔xNtk b"I^NԈ1n3"tUsGjd G"c x'EQ>+9b{+Ȯ<9`+ϝ5T..ݻ 'l`iu ƥ*$ĂO&Sa0hdhEɐ)tVpޏ3TP &ϥ,%?σT8JT5D0@(=Yg>[NJ%>u{Ա̒#UZy,-ŵPLR:|St4lѣ[Gǎuw7xyE:3!>@6ߧ]HuЄU/k۬Y2oӢٟ'=fJMK !-"ׄQ"!胈4;K7̨KuJH5QF-ew 4WPHq[v$WPT)jΗWg7}i1)\-C Nt&H5CiAZP+5Rg𾑇Se16Hb"Rȹ3DJuDL=)rUIf֎GtϢd!}'XDeܶU[y0^ЇYhs^=Z3.{%7^⒕E4ȴX RT"G [y/^!RGؿwzvf,X-)Ô:eI+;(0ЫSh%/j5 j:Ķx=5;7c35W.]ٶuP,T,r|Z6oma 7yz=uuZ|@֭ *GmR/l `g d6ӏ߄4uw3Fj~Ys8W^(14rǗz*^ 9e RIc0*-m,t4p?B$)p94C&QDLĤdr8rg* \gHw{ZcPVᵌ_FwZXp*\+&rpD؁qL&$=>rP,4uuN_nA [^ EЃ^>> $T56>EPk7ɪ"[չKi2fm0Æ}I u>3jN)8NRYf$N+y ~%$` ܕTZ>%A1tⳣNksEgtȼ 8PC@Ifq9T|:CgEQwbm׾=-5|K>ճZP7@6yf7Uya8>+ n9h IDATT5 6e 1%yHAO^AJT5K9@%f2'q"X Đ@PRLOA'x&;Gz - LjBniAҷz`'-iQ~ӯ~nKd}|j~4T$2-wz2f,ǧz  uR*e(Z>)æBpKR';7BI+ʐcDޕnjZJ1`&G9 NkciOp|Zt@~'<d$菲ź@%2e92N26 !-"R";jQx3 !e*m#Gjzծ\pD:k,jA BKY.VnX)-^_`q*u[ɁjQ)jrYvYEd, ĀzJy(֝((1 ⸆,IRѤ"JT SՃ5 :w<#>U }{ݫBPinsfȼukT|2 [9: 1"G86+KI)2bNp"lp&DFMuI 2z2pʕ l'7h5xoY5@CX]5 Ut2dbBI8ĖibCCD")ٱ]Kg_3=a:s!;`?T3Lܡ"tdu /_if (H=@*8`ܡ ڪ=2_kߦnZ3gbR@!y>3 X}* ȅ~D9YRNu1ѻw\@۰|ٞcG7L4AװjݭP.:ead)h*+sw~;Z}Պ x-[۱'OK#w@L"6U TgOw/R?ؿ={Mp36 ת}N cQxs0]{˗) F[&5 NY9KHIf\ ;akPEd/dž.k֬9$-dEWY'UL""8%#.[N`ϼ˿ f- QY\ O#puծ];Ejl0ͦ2cpk}[VFCrpwqqa)i+WTlu3؛NΌy+B|o6YMM˳z\͛m:aY;gVN-m׀G1bfG8'yU_dU+Uh9U&9qV~=}C6K] &U"(LSGx'+VL uú]pHr4L6c,*S!SG 1rW:vlTEVh<>cFˬR}|ݚLhHH.ב`ᝋilTbú|@ gϞl].[ڙp=]Zta\*^>p~2.:sy=6f Qr{#O?/Vž=XwMlmYg=_c6uiiio2Fjx] J͞{: {ax W|V..Uy~0(^~ry%ݳǑ7پ0铁5sv<}`֛6 a:$e+.Y a|+*':%޽{gKk Xetuڶ[ WרSxa5<# !<5owunNT^l)e|߁jK!8jqmߠkH} ;pČm K*g x NvV<7|HBRSHR{HzŻ%Yuқy~lr]qRlz?YizWPPPeKA4h'[] gV>uGq\byقd>[ϾUƍ-e7Qdll&:n 6Om m;W}/9<qt}:|h&H6 [zf֧BRl.xiN6=r ʕ*%^m@F/PipvlF[^v23Yz7>E}9mKhRr]} VꝠO-\p2LKd^89WWW*5C]"3h1NqYyM䞥o8$,dLڵGą])gfW'nr>}ڻaZs-)_Ю\Kzf',wt #ל:}7M|j _>hCje;伳gϺ4{F:]yEZh>xJv**YX~}z^ܿwo^ǸFa7LӤ~(5#`_ɺŏ/vqҥ?X9Z4 ֘{;m?Se#Y5]cجVYg[lƍNN%xAHKvM/_(2/α'{X;;ɺok,͏}WP@T7_9w*'_ǫ?.rQEFg Sƹrzmλ|7Y7waCNȻ.7k$$حgܲeP20t_w鮯n95v,s}P)*ZiF-e01 "suyz}mcG}dNg޹tƣbsE(qʇ\6=SY7n1\rBXl֫scc%li2(aqaB͉_͚3[,K㨅l٢7ƇS.Gv&p)Q7A~3iG]/?c e2^Le4'{('Omբ OZӋ_b֭a9,6:6Wqp`k U]L<* ԾMkdp6TZdI]T;?W&{%֋.#ϟ=fjI|Oe lZRN;{ֆ!Gör+We /KS-\=?qc GyTt¸1W.[j,rP[܌;4oqc<ɯ }^ f}l}ub!-LSڳ@8Hm,8MqX ,Mu0F;xdk\zÚUǎk- Hژ2|k׮":~>=zPB~%AE6k7lQD1˿.% V "37!9}2?;s:wqq[0ŀ^o:=F dA1;ɓ͟7;_de{ګitEҮ[{g7`26uZُ@V:DdNr}Kqa8ۮv}[ߌҟY܍቏YwW#Y3s=:#9蘋y-n.;#Gd/oJr!EJ*RWB^vuJh`GĔ̅V T|ø/;m57:)md > i/db EQ*~r`ہziCq˗.۳{XOHal6i%l2_7繨zyጐVyM߿ȊkbKXiUvvk7m HKL,eB('6<0gs]ZxFՉ0l RT$Y^t[.:'⏊#gbI/kלbDln+%bEBmgS1~ڼYAh0JBx:칪ը6;txg2#%Eq޼YK̞ec·..[9YȬBbe6ѷ-ev@">iZbLzu:tvo@F-o٠ 4=鷩{E"( `ʈCz;vTÝIH> [QY[~ /c2=b>x\R⿆`fJnlüU(0 燼aV d$qMTkû;cm B+^xqQCݿH/,ߍLKQ=3s?MS1Az\uTe i0NXdC%4\sg 0W3qfs7v3D~]dM)"e>`[}C iŽ?:';T:!!q_ǭY-84b̲tWi]_|\Od'K)x+D@= B9Mԝ>}q d /vM fM-c=Gp<0NA>@f/SgD4[SBaI/fvV9M17&&^`մk֊05Ħ෱24Ha0) z`_!X}v(R0K)l2^>9y\P55rA}lO%ZxD\w末ju̠.-Gi3 F>;ܝ+՞wkW+&qAhK㱪itv| s1!_jʣmߺRfI6*AAˡk:y[iBfϐi\'\sgH Gof ÑDú -w)ԇG d /i5 ݪ;yٲ%|y1-r#%iPUg1;{^ANNNdO#Pg9fH^X'1.#m<LGɜ鉿(ybӂU2t$ޟ}*~>>wǖuΈm֣^2BMW3;dm~`׶m+bGd%Q޽`{{yy4vh,lgSJ@ @sp={{2e$|٨i@:"ԃ@XGv )7vK 7ZTjXfG+|3%UW[;t ߿w($$XMǖB0쵺3mмuˑ3f̽oy.? h+W.TPu|ICyzIdWB{pךݎL"ZWTIJeD._!g)%Ϟ>mM> ba:%ѭ*g"aMJ#Vh^yM9;_ARF-_~6CR[`OYhC VXxY۷n։OΕ&4vLR $ҋϱ5[\=-}wƒdUQ:nUN!lcg~/R,@Fw*TGTp[|',FF)s]'O7kfVloWR|iat^64rx:7~Yk7K:lc1iըY{]}UT)`QY f7/w6;xZḷgϞ 9č7,ݑE2Ͻ놆p/;pXk}@M)E}N\3NJ~ X{nnG?+[FӚ5vHM>%9~䟀u)Ç^<}ۅ )_ްYrU#fU4z׻sA:JclCJ/TgccD-ݝ6=C{=?9kxgk,GuQ{ײ)M y߱S#I';l)(;$S}!!!OJrf E… Z²eZd WZ5; Mw7oJ0#9Y`lߤ.^l dT%K+/+tzuҶjjOZv "Cmmm#_yxoe˖ڷo_@K.B9w5s.\!C3F}kek dzr:͛~r$%g&IIDAT~s'/6@V^H|oZHQWy 1upƖӯ!ބ{0Vg{ @CX`G<93S+ȼ{b<(gL6`ѢE}~KgΜo|o{d34A`_ə.{ό4\m(̑)qI{ɥ.ml l_Մ%$x&md4 2t2o@d?M{z@VZdoȯ]1i !qIi-[qzaxDsjWBյk6Fի-7o^u- @ R4R0W^sw2,X G+Ǐ?ڷoz^ .۷o+IƑ`zox:iR$J_|5HXjU/\4Jf{0~ԝ;v&j+C$gQb@$hƍȾ+V\gh{Ǝ;oĉ7֭[ÇOc`g͚5-{7;{d߾}g&^րO+Ȗ "Oڀ;weMG*Ml͚5ٳnvK$B,0a]ٳC*.Ɵ"H\OJh$.[gWXI!]W&ܕp':e8o׀\~wyΫEoPᒔy<ϴg| <><{"Aڦ%>! >QGRռysIRA3|u>|+$(,%S }^N)ȵxQBwHHcͺ+ȉx~o˻E׀@-,, G h+>...w{$+/[- l|:%%e֭[xy%$zj^hvuE0q,͡H/b=WAAA+k]2{ucNpH\P#mXO4gfN1Fz,N}v^e铒VAgB.ӼT޷!H/K@N0@AeCGUkA(;=˘i*#7=>@ { &:u40^ ~,%>>~? ``ļ{ H,mS/Gc%v1I`upK\1ĵrER6˯E+V{s$Yf T $Cl)K@d:tYȒf[ކ Fk~bF4 ItͩS7i']pHaK$( %|9+Ksi,54e9ED 233۱H=¢US<ŷ{']e jYr"Q@GȒr@M#᜽/3&LxЈhDVǶ.`VO2u#.\͠Tٙ}1h'rY#+e]&,>Z}K ٧E… (_q+jrcW65(Qđ@/m\B.y- /2&SD,]Q{x=Š|5wПA;݃ U3gN:0B^Oitn:BNI 8G:Qgm۶m; e:?S=H+%$$띦Zj قu1c@qD٤*<ϯ :ov/:^{EU*ҕ"%w}/Џ뱦sN@dۑτkP qHd (n7TvҴ 5gpS$GUhǐ6mxwooڴ6xR d3 z8gaWӶWkv VmQI[o6I'lXzO@;aɚ7WC~"H,Ӭ6hlZCضF>Gjqaۉv PL(|g)OtiD,2 ES}J55UЭ^j:0?q uQI҆X,Nsrr@+؉!%-_"e˖/##Y|NGG"MCz9. []tɝ0bDTcМh._L9_Bjp Bkc>U[<`k g˷Y~CK~,u7(k+`:JG: 'x)1Cڵk}\c֋R~=Ɗ`2Y%qX/7-4KZʫҥK`xW`O` ^L L尤n)~X'`#38mwxK:ǣ IC_:a7M$m j(@6Se/"SfkjXSi[pcyۅT6ySʵiU8nnkvb3KbϦߪ9aS[9npcR )u֨c:@ j \BTh =׶;= uK`ť2~D~vz@] d9V =۪D}ũnB{!8hChsL, (C@`` {+40܅Ap>)IFOƋ؂Rf7{@6-}$eElL(x-Nf X~m)LL>0˵X?kwL6>}z5ǜEOY~&,Z[Su~jm?wZ{FT( '/;Mc#>mq"d׺r˹?—c~Ͼ$k uݧ~4ř5BuA813w@?r}w+xd Mz/,X-F4SW?H4E@{8"r>GF"L~'1y]y @߆CN/e/$zrj(= p^ڃĄCZr.P-D>#dgvcPOPGQ*zp4spQ;RAqO vEEİ *,kB"{VWgq䅋T%<M}j!Cl3bP'U 9av1 q= ]!mjSZ'zxkgwh\&b?9=fC_n”w#dzi | oҤx`Bn馅:$!9A׷6#,-u(Q$~X]k) s"Q%1H5\8 %j?>|5eۭx= rܒ%KGΝ{PTT]5.El ʾn˸},RuvyW)F׆|/9ql~~,9AA^Y)`@V?F(Rc6OѦ0'5vkr:?U\a\| ³%7rd#> ^g "(D-nm$|@^5ю̀tXw<N[UV_eHk\z rwL[^lܩ4^mTkŕ;ldx HЈ 8;q#_~YD#/FAKW}3@NdǜY#HL霏N,NO#GGR7"F{g6l:UvFl?KYxE' f?i@^'uG,Vrn0{{EFxQ&ƙI$C_ک;wA$ C+ROK4!_4h9JŮ@f9_?{ 5eKaO`ތ ^LȊt/X~IWcuκ_i*[q/tuO?w9ݯt=t:[u/QyEP/pyi4E x@.=d< nrE7z@ha\0K1|IENDB`kraft-1.2.2/reports/pics/lurchie.png000066400000000000000000000533771467704360200174500ustar00rootroot00000000000000PNG  IHDRZbKGD pHYs  tIME  1$FtEXtCommentCreated with The GIMPd%n IDATxwT?Sԝ3ۗ, (bc%%`K$}_[$FE~ĈѨ(T:R3Svꙙ9K3}]s̩﹟!9I.$$$$䀜䀜䀜䀜ss菴RPPpԓ|ᇜ~߉꫑e ,ȡdje$ >3{9u۴i830L;3 XD"A}}=q'h'{۷x<`b;b#L&24 N3sNr@INr@INr@I)F`ɒ%\}՜r)X,t:L0'|H$u޽{̔)S9r$ݻwjy߿?iƋ/H:>}k?Պhd̝;Y;vp饗xjqeyf|#:{oL&$Iw̘1mv3uTFM=Z!7o#Fd2a63f ;o_nW\q%%%t:+زeK}7nM7Ĵi3f ={$//O=/z ƍ2Y*++ ,bK.v]?s-O?8WVV&M6~"u@TWWUZZ*ʲ_q"NwT*%zuSO=U\~bРA3f{>ݴi%%%?>|B O?0 BՊkV̟?_̛7OL2EfիW_oQL:5k\f͚bĉB@\~BNo~^z?OW_zjB׋_|1똹sf]x>px@O`ObΜ9B V{;yda0ľ}:$/)gϞ-joOź~m&Y`z^_B @s= v*^oֶ{NM+WT㢹YرCXVګVF`t',ѥKN7663fLה>ϔ)S (1mڴN1}b6Eiii?N3<ۧ^opbQ)I76nguVzؿ}gw:Õ @1r)>ߟvg@Lq%%%nO5sxg;ݧS^^-[@s="t{}f}_B=M:3qDu_[gB,]TTϘ":NN=co~ Q[[e͞=[444@^vX|y6|ņ :w2vUUUJ{ /Pݶw^;v&&MR[V1~xqw tzL :ՈDB|bժUYۿq>f? ΀I$ÇW}x/ϒ|@?~{Y/.1f~jcy iB<TE_QQqge_ :T,[,$ѳgϯqK$L&};^c{GO?| G.?]2i$6mԩSYh>X%LƯׯ۷oGe„ X,6lsᣏ>T*u\uV=ش'Cuڕ;vs-Æ 9oL#կB͛;,< .T{F4֭[;e 7ܐeu2%6QF߽9|Xg?Z'v2$IF~…\saF|8{ݺu; ˖-SP@BuL0TnA#SQYu]'h:PQ/tYNeĉ(?5О&6mz㳨*/f̘!裏~HVUYZ*ʢ_:lG?Qy=oȑHD̞=[<4ԤIc=&?ٳg{LL>] 0e?ϸqu]'LK.gyfVcر_uuubҥ*19s戚 B1gu$/_.0s=WgĈ+C)",GH̚5K,\P,\PL>] 1bƵ5Dyyݻ$IꫯV3nJ@΀o߾+FҸd~8t"~.L/,&)Ht^xq鵾V 755r_|5"??_Y~M7ݤTWWc N'<ˏx;C!wq֬Y =sbȑd2 ^/ $̙#tփ|?k4V#A zׯ5آE\ <h4jcNJ_~ôUǭfԾpB1x`bƍ .<3JĂ ɓT&Ə/^yh 8,~TUUg4Μ$}nO8/&.B P`f:엑t:M2Dբ)U}41J3%g#"%T*LJ*dHL a40GmF/ضmW]u Gys=CYYY-ٻw/wz{o`0,'$v.xӷݻUе;=O;ߝuxeڵvi;E)䣀7T*[vj֮[GϲH9%\0H6)jc6FSh)t~ǜ>wٌ1}*U` !HR4{Xr)䎒Uz VN 䃕+X8o;o󪠕LD+$|^!Ҝ>MK (RCLa1L9mX, ߏ5uX8X| hhDD aЂBIG"h)4rM:{xV:6KBvI:$R6=h4hi 1L˜1DUP_4mM 8X|EE_J9׬e |jvVA v )mۆΞ8{~[zx}^f?$s_z YN&4EʦGqaEӾGSOEqTA<gMk,~m|>/IhBIk}6v{'q,T˖Ss7r33 | 9[_UWܟ¶U{:pcXŵcm>9jC_Xb$:ݱjs!yߩX쉓#vOBWpۭF phĺ=YK.d^nbE``ϝwߍh"1vpbY=~y4D[+ eXXos^fse|!6P٧_8sw}}ƿoğའk.؏6ƕW_SV3Ͼ,g,$RiǟE+ټn=;gW/]Bc_#w-?R.(%QbF.2 %1p?'R|j06|SN}lƴ/LIDhA =4 oq߃R4^cI3q=|ޔ֮QMeORYײF5z`³$D E]eu v}a۷u"FBF س'ﯪ=>g!ڂB!5Qǀ6BN!rO*Lʥ%J\ҐُzDtZn& =I[ h+3[xO0 s@>exGN-#mQsu)NxPZ!?V=yOW$@ Zh#u!eй\EjN>/SFðÙuf3V}e|!V~*K`p߽%^jҮhc) ֐3qǝQE$ xIZa?`h(Jwx EjI3|r D`׊Fє2pfl4c T%N %ߎo]5)˫"3m,or JT3[7nwg %!K=~fN(ZAl )nycTAKަ %BÕH ^w9ԸPߜPs"vۃ:&" U^58M̌1rJh) uJ[Ң#mҶ FVv@RbZyʫQؙulz/JTJqۭټiSN#HR;dNjr/1cqE4s]s){jzpCѾtw@T&Y#U`J`C}LI\rpRNh]Ƈ6\ 6ģd'q.)p1M̛2iIExâ~rUƿֽ{~/6^\Vn>ݑ"5ujkf Zw(ZHT]$E޶I(J2myo]8eO+8 0փ`G^=/?Ӂ@J6+y~v;ڕx/(Ÿ?BZҲ+T[|ͧAC_JgAZx= Kəphº=)3S0=,s_x^MI5hcMyi>H Z͓VW֭~RN J%80rJXB$*Cj+c^Ciя>vm%ߣ!F`\vc=oBHS`֪ZVb%pҿf\y͏;h?~yr'= Ι^XyWE{8e5RÕKl5nbV0`݊`MZ4ohtim"yO+>v;ĺX*S"ǎ::tyZwdi$y2 L(BO`TݭI: M:dD!a ѵ:b?LjnFȤ:ϿI@bn.b-_[6p~.~o_oPY;Nծ=8t$)^ (#)6[8yS"0ʍcD9RbgىwJ  P58/rJ$~%>4U$rI=ߌn宻gu>۶kL79՜ڵzRe6r2wgmҮ$Ձi_]4MH_;ff~EB5U P)RUOM$]jp(T+.VZH ĺYI%,;Chci~Ӿ8Isep;?WW^~w~>[kja2(҅R6SMm>iKRZa]O2߈yoc$^fT&NH_;@F-)}(IxS.(SZ Z MhI u1Z)&<ȉ/'4iSIC`yh4=V|JxԧZi m7^տL4g!Y]N? $"\3'u܎5J8e|!7N^[nLBV DO&Z&22-Vm] AKh;uHM1~2#¼+vIED10m!VPEYX7V@ŕ}kź(ǴIuH;]&푇or9KZ +mGyG5N/f݃PQ)5x,o:sRs7nR6=ee;MݷnIDR6#qMU*I6UA5BgGI))4c=6SyR2dcܒ]!5h>p?yZp~H'*][ osU} eg…N+'0փ&k}mhX#Rii݊{֯GVc$ΆkM'^Q]!aΙ<3aX<3~ES&ynbBԦt8W4&|cZBI[[͇^(p?;vh<{eZO$4ds3 E"#ԗ@ѐtе&I;u7'p~Hт}mh;ڛztI \+L?x^xŌ9tlZq$-:?s@W祵tv{{;8(eἼ}1od^"R"kx cC} `؂S#|ߡjH-2JΩC"TFfS a5z IDAT1bJʬ^_ݝOShM-rbc\wXJd4܇$p-k$ejn.[ |# 瑴s`Vx-e;JPc2Dt qXEH# Z Bӟ~!."vA8kרBIZ:1CH,B4[L=T0U1*=)&1>vlZn "mlk%QKt(94ĥ`2/6Z"iN-Cj~C²+ȾC8}ɓy70D sagrA ȋ_bh,'H~zSm\s|$(;mg"f֭~(6pJҦw}M: C]cm c}KFߜjƇqoXu$J7!KUۆ ʺUqh*+^j"^f&Q`$QbVhU^[Ļ[I.:HhJAJbӊcerS3G"i%0.e+m"nKpޅgz̿Æ13y qbW2ᬉ'V>ix[6租"S N߈%8nNg5_[AGr *)zc$݊&)CC La o}kxF dX4S  *'B!V: 4$,XĻX0414Fy8iT0@ANRσDOtp2r0$ yb1nVZ1b+{ʂhP%E?Ya#FvnFCAaBh([pWsퟋ,' q)Z:ѣ;cE&e@l+Z>0ƣ +- qahT8]TԞu{@RB̌ugP1[{}=~xɔ#?hA4 RiC,}kuH$់/5(2a٩^ye}}%[T(6#5({sC$4 uxnsVi0c *y c<!Ri#Kڛza )6~W&KZ5#$xެXw^HO[QY/J%oSE1vN^y ?ޕX xiWqS@JcWbV +P4oi}KEO26`rJ9Awj|2ژֶ#\i7Π% #) TDe ok^ +X Q&~kа */AvnG+v]_7dgUM\cwwt:~>v.XubƻXWcOOt*)DhDwv_De2ӸgQj$ͪgӚrhci}80W rcݪ# I:5>BmEiBI?ka؂ZQ̤F~گC|Ht}/;XuaxFt$ +A6mnr9Jv:"yI:ڷw/>PpiN{MjVLecǼ38glYp~e}Kxw+MrfK4oNd1h4 -&x8HU݉jEM/6a"iK㴲IދwJ !574O/cƎ=2y6C]X7[zM 9 7QWsǃ^s_{9nlu80 *SvRN֡m!e{ZGUjKFCڨp)_FW7yGMXل==oAJkW5b66/3YTC oV^FeRvŔ LG_ֈmcX5/38x iG aF I1mKM], Ox 3>TF?h.wY1r] 06Ui>.Ac>Z:el[Їdm 4uZ&abR#uJCB$唈TڱSZU\`RmЈ|a5ýXYmcyR !H: /6cǺOD G{8@[8ŻXr3B\n@+h I n yU k^Č-1r% .y1k+H:$a݊6D*$4"RS aЪ= S^S5pF_&oIDz۰ ;Du@Y#oC JTAj t4I: xcbR5CEr"v&i>dR _Ϸ0㦟2l`>YV6.(fAlIwM:$gY짟"K^/@v:Ƣ6Fó2˻Cѥ{wv?ΣjnJu6 n%ցN{Zȇm6B.0aGF-Vz\g'4D-UyaMq/ýX XۺI[tSVE㶙0)gVf_&^bRAbU"ݭ9@ѼJ3y\?pu:ހd@ZRAk(D~~~# TuZ.R6m_W3y w0 *Uy*핧:tx >%p2I8C.4oI(v(2aݮDۿ%-:"m)|5M~Nn$eӣ % YTj:%lܲǨfEH:#ĻXõ`XC7`JiI 6hU ̦i}PeBRR,4^'Ϯj̊-2"부9wZ9N Mq#QعyZrnFV(i8?hT/S>[YOߜ@.2OI˺!$ڢDՀF0(]39eӀqoX˝y9{$Ǐ,<X85̱ZD[0mѫ:q~PrRPZź#>UPوw$ۀmh/6r$cW-BIjIk^mTCRCLu-p~BBf?8D[ ;&VUJiײ&%5' D+ ZV~18#&YuP3`kG>^rStdP_Ϧv]!Cj2˺a&N]^7A#f t:إ0mZUjQ6h7IAm|hPs3^֭~ui Oi"0ڍ\dR uöwROYT6u-ؗ_}\TPR_C# X$EG>nq#zP2܌1JWhjrN{GS7K]P&Jm$mrE>|vv\+1WFevrvW2Kԩ 5rZ5Kڤt^1U,yb#$x{J:}; (֭~L(6#)VC_vnE7 5'FSӕ 8"kUHژ޶[ض)M^..ǵ1Ιi&z#dP^Wqh$\iCIei~tfx`[߂u{f♿v6R.0푗(@T`.gg钷:r2Is!EIST>mR{:>j"P|]M~$C_E2A47PWsXJJK XViWRtlK-h4ȅ&l[-2^yJ -E&cIE*R4?GI^XJzgg믪q1 #5UdBI@D=ŴcOaEz==VϯGRTT@UH }@d9z\EmSuANSScS}qip{0HfzOY @De8^cПauĺZh>DKM*'I1W)]}q7wuzȝw͌ne!\+U@BI/:.rhT463#q$q}ՊXlR_.'"'{1W%-_b0EU$Bq9!۶mPW7+{"K0훊E|^Bj We^jz_8v.JeeiEkB2:M# >/s_xEG"Su+H`Xr@:G]$Κ՟b'gc_mBܹ|^u·$OhrEE9\ۃY&~z5EGϡKe1;[@0jp?]!1.2O lT@j5̸.?KIDATXSGRYE)I' !xϳG'͸'68ɤgϞ=c\㏜ F{!zmgPWr-op'.N: !8m^tmW.&^z6mpBoe)8.Zw_DmcmoNIiiߤd<~ n.d9o @ oɞ/ i2P)XcaO 2@*}$,1|V!6oчm!\<0|^IJ#YO ZVE~x9cN?ۆ̻BFp^[۔'N@vOBaVQnf6nӟBYy9'%&NƛL{&ǟjbH8JJ) lk{hZ?mE !sKD+Uʌ8L\T\#e֓6)/R\smmپÐ6b1S+Zw^ P$-k9x͘j8Vy{b|>/ϸo3ICi_~mN'*W?***Nj |'jy睜=qu>D+xPs7\o g}@P]iTSW~BF@@d*QVq©ũVZVZ.mjֶW+ZjUB TpVrϾs} ;Y3ܫ<&ٕ>ޜs6> _oFސR|9qgX+yb"D\\.GsM >л !=^IF9ƌ{/_QJKf{{|m;BvKPqe4pҥͰT.{kuޚ:!wBXmMdpJ󇽐v\즛Ph1cTu33[{-,zۣ Sh4/fM_h}ᜢRė_C,7 %K`ڹaF3;*Oer,W=O)~?_xKꊒDz^j.JfY# HO)?7o DºlD"neyP2=*}v[fYh%|̖5@E 'fL( ١bH21|H|͑&M |}}'  4e, A+2>ðe4TXas? (UJ|j&M|BZC7x:xx'ڼ1'l6IdQzRgglf͎S!Pn;JE>[1 O-ؗ$W2qPӧL@·[i/F雾 B|.Z}_2ލ]bCb7Jq(vh¯IR)qw*8QAzJ >_C`ER?~ 5-|v&|Yh4ph27|s08pQ1]Y\BQ 7nCai"@EE*\Ƽsޫ._sI=f6zX`т ~̩Ψ>qJ:q nS^JRF K+ƈ#F5`/#GO|TWWc˖؞*dyp+%<4p>dRʻ7NWGͽUZ"h58{￷Uv( odFV 1 .h46~ݏwĵ|NPB&_QsI 11y mnDrssбc'؍<|=yq7)ԁ. W*a#d27!!c0xh0[ΎÐDQR?[ z#)ɞ 8/QIxϓљx.: {w! DRA\ΆJdX\`\pɒf3K'`@z~<.F x\h;K[qvė*|ݺwG=л7|<qkr40sBZhυL b.+Cu)4V{ϗDx5o28ˍUwuB 3z?+٢KJJ !uqkZm-~?r[7YYжZ.Am{GUp^` zT!QjjV aZ.O w2@.d/`1Ȏ)S6@tJۯ'zzH(b-`M&*~×^h.Ny@|8z@Q J kj@Vu>PskYy'2 nj,7o>3cZ~5yڛ4-1[k^2f F"m`ȏ[ґ|Μ=BTJF)zW @zK ƿՁԁ6 3Agk|]vmzX,F||`z =ΰ)22 \C.בٱcEFFRhh(#s_۷of-b @!!!ԡC@u߰a 3gO;w1cH$tF]QQˋc֬Yd2sSSS),,BBB5L&-_PǎiƍO?ѼyΎx<}w͎-TWW7JdkiӦZ-ݹs\BbIII!֜nݺ|nZh4>}D~D7oӗ@ ۷o3myyyO ,YȞ?޵FϞ=~6oXJJJ=z<֜{=WAѣG3n64h49:`ܹ礤$#w^$3dȐ[W=CH$5 JKK)))ҥKx6Oe˖푉+h!!!lϽdãPM>7O6mv?=-~: ??I si"t:={|Vhj `$7yڨa4o֤+KgǏ23P(tNb_j 52^&ATBVC.PA6 V5ZvfS)((qȑF媫'~P^^&&&2!,AdddlȖ ^ "B\\C~Axw˗/odYPn̙O?Q#G`֬Y͊/m۶G5*wQdd>iIQEE͟?ݩUV̅ #&+uWwޥ Zn#c4??&kg} k7U{c޽{I"o555O_|EDDYb9r$ѦM(>>(::uVoز fAff&I$Ņr9 H$R* sδtRtT\\LJHHB*--%|hܸquC~~~ hlD***"Z\HDǎtTZZJNbdݻQ-_(/z6mh4uTҥ cRMM KEYYYq ˫wׯSxx8ye2M6rrr-X^ӧOcǎ5_aa5/Bcǎ%777p8$im6FS>EѢE(Z\Ҡf޵kL&cb@iǎM<Xxd,Y`̂Kd,X"`̂K&L@UU{#X"ظr O@!-- l͛7DGGCoUbAmgo'm JeeтCұcǘ k׮}7Rtt4JY\\l%r3ZG;wjDD{PQ^(77u=,[ aaa1cV\3rssѿp8_Æ ֮] G̞=qqq{.͛ŋcoKkgO^W6٦h'OAAAfMPHtiZbE999LdLL L&pq8R*4g裏ƍ@f͢d""hԨQMF?*bd<-??ʕ+̙CiеkW9sPjjj@ubsrrH*2M&]t\\\D #2N>>>BqqqԶm& `%##kZ^Ĕ)S(k1w.kZf /\xjkky\>}PXX;wCm8\nY GTTRM9$$6mddBLL gVB&APd2!!! .l!,,PFn ر#Y&NHWf[PTT/"" hٲe"##)//ƎKr DB>|84i$JOOo>&Ov[j 2e ͟?iϞ=9j#"RT4}tI&Jֳ`M ,X"` ,X"` ,XDf ,X<#?:bdIENDB`kraft-1.2.2/reports/pics/postit.png000066400000000000000000001217631467704360200173320ustar00rootroot00000000000000PNG  IHDR/f?sRGBbKGDC pHYs  tIME 9iTXtCommentCreated with GIMPd.e IDATx̽[k~U+UmmEK$`"`Po x^;/ x€7QB!\*BP/$[tөꪽy;~?ךk4ijac<9TPUW@U=?wիFڟU".F.?KKKUo zqPHAo C 0IPM}@ϵ>I]~-5#|υxS_5_APw;|G"3R\%jWaD (@#>?>g6}m ڧ)B?;ECH:|χ=O?߱U㧺3J1S}GN C5CMO=8oxՋKun ׵z)I?ҳ:_/~U8,\Sy=?[kLx9lk(E|ޕHZwk?ߴ he#^BÓ{5͟LoQ{ͮ`L @ &O'SZ1,@'@9w$]CP3kVIҟp#[ZťҬ @^<=_\`@^&wR^^ji+ɺKsѫ36^|0=^wx$p'=~w._?2H*$u]9 =ɋa(~-]恂~BR4?+ Tw=t}:A4ta0"P^UW]#xў\Ao xB.6Is=SZבjV iΆ9gpT碽 (X "NX+"Rc% cWzqo'h+( K,Nqvi+Hϵjd/ڡD􂼃T&TﵝӾ^5PR&H(P|o_>$ /Q;oG{_a pͨ:_u fW6 ϲuQB ɡba3.I0Nj-lfhtew/0I|FQ=L-4Lva`( /Ң`KӋgrLXkχt w`zLgX`!;q٥3+Ʈ#^ _Lwsm@`" a0]pWtߓA6ZP~<=<СS+UֱJ=htlfAˌN۔i HTg{mDU7;B ȩ{'ݣbA{;T{;}y+P?OF]TI=oO9{_<5OFY7[dU{]|vD|1O *W25PDZCPGNN Щh37Pk`޶;6DGE#J/eSO] yWP}X!mῈ6y^ٰ^Ǒ Prǹj}aVfP'᝵:9gN CvLi `޵V )N [sIPG5N`?.CEŤPMMps?@ĄfA$8m _8vVQp;{lIj.g( H9q*:l6qd "$>h˧xKO Hexܲ`s4rI %c|X TuI@U;PdLN_'2gTImOnL9q=Xt@jFԀ;G ;w+&`ߝGC'Fk5}e?/0[oB}&v #M?5ſ_!M`j$(F7? ~ǁ}- ŏٺ6"#}u*=Z-kc ׿3/n}s F EBK^>)SĹW9C^UୡFDW9 ڟء eZ]8VE n-81{Z~D;5q ׸}};eq|UB51,mQpzs Yw.ͯǏH}5/ \e63dؙ*Xf%7Z.m+`46FcvဍO@`:l`a3A'hOfU:xY~؇)8f9rDUjLɒXCL CtT,! hŎz08hJwc^״1D " I!W%%s*1d6H$1@:8 `  .P.Dlggg_(1ϴwJ0͟' fq,8Ƽ~]j6dlbϘ8vt(Pt%^5w-N_ɾ\و٦7Ta#KWJpCYû_bQ+Dd' k{-wOjKqsF5Ru.k]8> Lf?(ZD bq L ʂOF<#17m U` ^Ȃ4\l, SjEw`M̊R~F/U&P}` z_\'NΉ]v9"IDoX+m`T4tڠ`^0ӱ ~cI!dOR76T=9#& oɢ(a%bxSGo](RE!ٺ))cԺ^)l׍y4,!Y E7=a]#c?i|9?{k䍯c~305aJ,#O{!\FNe(* `ݠٟ%$|`h2Tf :A!Y15lkQ Pt>dz Ĵ " I/i Df3(:E9FJ!^L:KrΉ9ϘsdNc)-P]_zJ8pu@kʈ% dkI<- nGHNM :i'S ]hDlRI*jh E)ᇟտ}u-pz ]ϗ?IO<~i|Sg?x^mD~*~ccPT;Tx+AH HyGA~ J"g83蛢20.{î/bZpuCNjhumAftئ/}F>'쭷S"wcγqߍE D;j5(a*X N5Vsx dE7r^PPChL2rm_/IrmZ Z/Nk8fa¤J"b9%jd`cزY76`<>e~ W )>xɷ㯃V)/_w[-PbH1 Ħ(^Llj+OԷFf":As )k$?' O ޟM?@\n},_k%ܟϵ;WL *Ftޮm2''_J%Wv_2}pܪ 6^L!t+~TLkxDI)HZ Z8'pNZPpH"ې odP,N];qVmX-h7sǛN ٺ}ǁ _nZ2u+@&^&>z4 PLGrY( \);SP:m`gA}e(+\,RAPP,&h(rM,bmHg ?#1Wwή~Ɗ'~!pfZ9w}e ]vT"3b2"3Uw#G,%\bl;ZGд/𕕜.[#XDap8%Ic*DCƯyp܊7='!7S-} %8y3~om k`u?3G??^r(jf1_fe |xfǶ1fss ؕJ0ilVDsD8c l}+[,&:/E:cblw _cGmۖ$]t?H_+;C3_dhw:Ƚ Ve[f」-5I]ݺiM['n(KS!piP^^)r`xbrL!:[ HDJ zf{qH L cR(7BN7xS(XȋO4cEv]- ^ç^?xo~TWm!;0v m\ <V4VPԋT|['N l.ٲm;Cdk 0κ: $ԓ+lC)  02|„Tݯ7J[q2S^b;G1H㟮-iM$>5k:EGju$/!EVTǃWsm\H0$ ͸`w6̔< ;#J 6xQLҴ"p\vKuG2L;/R<趺:ެs4R$Yu`4 ~Lrj 'v /0:~$eIq1={W/θ۷xP0ϧt/#Dg|0^k/#| ^]}g'ܜ0( r Nb63?-M.m5B o6ObiO)c#<xtHswASZ"" "n O?“nNضf2FYM[1y~` z7f# Éeϩ 6n@v IDATpx1ߠ4]H;2V|<jna]V>[Snۼ1Jj%^`q_K>zD;`G`Ǫ`(qQ+DiJ+fNіs` @ZPGblaZ8]'l/qƪ6CcCֳ:ܐ9Y0N`tt!+n q6V!鄧O(pssGgy}7=@x 't(̔(IC`5+rsd aT@t $pmTXzkJA ݯ 6]mʉç³޼ٱ8/m'=zOn[<}r>zǏo no7nnp6cNKR{h+BK6r.>gdHk[weKDoseӽ3t5rG ?)(%RjfF"}Pr٢luYW^wBҶJ/t̍!yؤBW[n&u Og.Mo63l;4rujk̤ eX\!Q NXiՂwd7*Fz: <|s{'7k+</_g{Уoiͣ O'On-<9#>N÷+18=HB!|`JDEw\Vdis$bQjVl(%٧+@J  Q:~xIs1%4kܓ"pC\aaf6mQ!sfRC#n n}zƍeY_ݞ2OQYK:!Дl(^0=3}bN6bO><=ѭa٪񆛛 7N c`ia^Vߛ.|R5E=jB6mteJ4SsBl(@lYl',6 0ВdY*f9) C9JYWAS˜IZk(?ut/Yea0 軆qo"8RC;1C*-m"ch/.3(jA(l=5Ls4-k2 ˆJl79?L"%*ڞΥ-쵎6oj/dlct"f1p6nxwOvwg}ƤA86ܞN8N8n8nm03͋ċ8(ׯ9Q#F$C\G!!gR` yccQjǘ7Ž^~,)QN_^")ǻq'Q1p̱^oC)0|^hy~/h0) 5ʺRƾ!u;gSZǃV4 H@^ĉdx߷kjJH'] J+sBq3QPkQעUtvXZ]Bԩ<ƁYyױM($aF-7Ցvo\/=O%-nӎ-o6Pژ䠑3ѱNiSh*eшwrG&@LȌWj`"UĶeXp sVNX]r@c-ͽ-MNDȸA58֚k9/֧]Ӏg49msRn$=z^ S2?03cU*aRZTQ I3.SHn[ X,H2S:.uhb4Դ$/K/2i89nh_Qc{ڨT+nnD0▗"DQ,*m6{D߀Nt"Pku$j[Mr/iA٥,mF ;:WFO /u+v2\3Y(О|($u&C^b׭(2.^rlhuҋ $D8 |xAcIuW߶(L1%;*UqY{~D\@Lg]g=KeN^&Dݡ(\ [ohnr.ڗh7a VC[∜8~P3MqVb(A4=xiFsP)QI~_F4qyY^ْ;9t8x88/'ߦOpcJSgS3O]dԈh6p;dDU`YS(5B}YgȝYMM /+&AJ'dy|~oZhg-Ӭ_$pJə7Wt+|h*a[˪FKOc7Ed&}~s:M2= ^Ogrm8C !&r&nlȻ:3vfi~WSi4͐3?̩g2@ -Drzp^ w!`)`nV(L6ᖈrR86h#41_pxQc!r mOԚSWb%nLn` BE+M*xS@ёtV0Jem yE*NK!ʋSsY6>h+ͫ0"AH25:|Ѿ{^EEG3+9MwN@ q%9nsb)DNT*J( z0ŚO-= S _y4]սaTx `m[F.XaT ٫`UL\0,MгD JB}-aFUv٠bs.W~bRY]Ai Mg+gZ:| b6+aIۏ4aX$B. xmŖԔ mTZW.xP NLXXIe;y"8= կRE5&},7yZ`!Ip% ́)m4*m%xj#Iqsa }&3 t-:[ϴc4ޥPےd5k70\xu>T2fnA/^dD ǵ]+(#%k@7>p.IbӒdR}?mQB[R5+:9<=w9SY FvG1mW^KRvtӢjwfY%H^#R[N<\rH7OI0tw׮qpD XHy-x,Wb'N}'^:Vp8xx+L`&Z&F0Dq&WAk/#ܥ99N=0n5}psmtw8^6G0EG{k<ѥOxp$}!',e("vܥ% _`P4%ie WD1(5BDыYhTx.?<.7 צS{ɸG]T?kq̆#ڐ` 3'򘭲-'gӪ/" 86^fXI@9,#S Sދbqpu6|7 n7.hSj uIB+PBbA8٬М(I>,$ =m7X2-SE MJWWڀoZb&RLR@o\)m hM;fgUkeDx4LK ke.Ѧhyж+lT#b~`486PƠgaR)3m`&5ceK2zxrLqqt+-o)Fb64kH w.ad*%@,3#7JNBL 9 1yV-}_Y+SbTn_ETN4 $4R"5cv56HZٳYNuz _rXۜ 6o廿Kvn.L(Ki$XqMШQe4,Eӈ"G&]9LuGCۧi mS\שk5'ZmLatY14?^wZBm %1#+7 *? s$"!)'[3 A0#Otbt3U/+Ԇ/S]5}I$S/r]Mܞ7tZ \(QxudD*^gçZcEyQ!75M`蚎vƄ]&ާ`{JgjHZ?9k1\3l$eNRAI}iKۼWbe[e4TbTl#l(:+-ʤ"r0yUd%$W8!)| v!~p qiat(u-p#ğ):V=AniÊ0͓}nB\ToyuF&i \x-Bݛy#XRaauHm[Sgxv:b*4GʺeBo֢aQ^}bSXvϩGJYxvzjXp f6r!F(dCKlhTs Ni*Y`'Lar^Lv!(+"ʦ1hJڰ5P #?;)%uHSm@Ճ_ʽ!j.@(紨IfFb ,%nb2U@bռ<#1m5BZ+IԋteKs}ےj-% ے]F^.ޠWE]Bdjs4v-f Z]ї!!VO顪\]]0qwQ+z&D` GY:1鄩'}-Cvbopy)7 6lGn: 2#gZ: FX;لlZ"ъӀMrbA*KJf$e(U_k@dCb+ʼn0:h-C["|[4Ee +Õsp\#F.~ pwg,F=W:H3@͂Qjlx3Wĝ ]A8BimG0yFgK#fYDA A5G4.FFO)TIpgo:mvwzBT AD \UjcZ2W(f](CHǯ:Ry[isVk< S8]Zp3]Az`u.rmt";@kN2?(Azurh  +V`-^t RTW)E0i{y%7J@8՚C/\O0^xP\m[r:6'e2Ӱe%}\cĠu,Vz u1Ճg7%)AkLv0t7*$J6cF[xv'`+3Zwg#Jqv_vwAO)$~_g%lBZPRc+=Ƕpv*3ʼn{LkZȑ NKlum$Yz Z,HdETlá=ٳ,KJDK˪*`yܠ 8jo#l(mUj!֖Ttm^ psl6+YY< KQ00#pwtXci#K!>Pn:-PD,!֪̊uKmz n;k1QZ+woKph$msYՆʇ`d6)qU{k$uߍTpn8|UNmǼN`.: -\b֒z w^t= x/v`*;*t)_$"ֽ3-U0h"X]/[y4V@,[DșuiloO_C:ߪ{}GeN>3zm{K.a{BN΄Ǯ>tn ^cf,FkwۍFlZH=MPiN4fV&E" 6gdsqIJ"\f!.}UyX+3Cà+ՇѺ=֦V9 t F˓i]`5䐵 FU{jrjޖWudU'5*r&3ft2EZO%ƈ*&߳.ܺ ;wf $ڥ̱BH>8āV%/Xͦ:2ֶ*J|  T*SW6 Irt% I4K0M/Yi4 sf+Lɘ9/I/uK1`yTgk( %0=b>+8y5{w__f\ճVs~L˩LoXhCHNj D$k{<7kHH(M}+bR\^ 0DixR-2v0]A3H`L'>>2kq9DloM}$@ŸO10a S-< aCz"B[SgɁ[3Zꓫ `7bD QMXsCH#lzɴՠ =z+?s3 [!wBK)ɂ|q5b!((Y-Z%L#?5"S8ҟVVvzjmQ]XԼX(5k]1Z,'qRDt0iEf0ݼgC)ڹ#~a! kEHܰVy^S&Fsvn*Y"Wf 'N3lm3`FjSjosP%R] l +SSiC'P8-mCmo}RF/;k\?qi49- QwM:Y^PW)N8]GMÞk|a9JN )JGTt2jܧgA0| >AGhFOy(=i(s ?i4X֑]˞E[:IJcgصGG}*$=dpY:)IbEےv~;668TH1ӣ:+ _ej;JJ\s;v@[_{y$}1GtJeBW5g+]o a\պ4S`Q _/pk ^WP*-\̻eճHY,VNJl=^pb`d1 V"Zb;N e*]t m6cQXطh 5ϫj01=xEKTMOI( q|Jh:ծ?O%HWԢ MQ&9ኂ\MS3z@/_td‰ UPsOWz|u?I=\%ݏJ0mm M5PiE)2]wX5Q5zxK/a$r5|T@Xp'mnD'cֺ!N a[RT :YYdgfς_nUZ`yFݯe$CBX4ذq?Ysf4[̊0th4NTM ߨ~M~#lI #q Y`jqFl@#sBը5_Gb)j-Rg gլA J3ks<5%Es фQ)ۋ26dAT#"\ - ٌ{50|;Ch+F˨QM 1J'9jg^Wz+s4 |"2Pđ!S9\՚xzYjpc8i"ލ8s,銽[u [AuZv}%k?Rrx L/Тa,"|9٬ڮHczδ3GK=w98`/z$t RnKǰ|;^iq1?N5alA:+vncFR|zDƍft5 (EP\s4niX 36S=<7ɘS [I5do%KLU|*U/JtK/ "",Hfb1cC䨦eH]9 i埊˴v&ɮ b&:ON ./!sᕆOH:[EΝ>-A{>sh-Q Eb2ӖOO9 &73D(2v˫`6͐ܣe‹$.!PcB$Un3t{aԨ=p4&JMcR.9Xpط;aG)u؜m-ncʔ6i8H9M6$=7mÁcō>[1m39/TA^OFuo5=yWt*V.Tg^ 8MЋvOvjr^ Ej3+U훭pbnQHOE0F`OIs"*¼{݈7=Dl;yLl1YZ=I| 8 ^Qx)0</Ӗ2X6cۼΥ6D?Rl,ܮüej[W`Y e* >]up=#uRZ,ҩa447wE1$O mp[qV0iNiO4_< m /\5U0RO.V%so3 M3Ŕ¨8l7 9g.0d1P gEH% t[sQM6evlH1ExEb4 .`ʰ^B{Xk:땯׽*3贈kHbM-m}Ig8[hLG{H-e_WJg7Rp; &/97,E?32[q.NEHXV2Z!׿#lZ2Pl 0n6Tt9s},jv;7vX}lQml'i4b,ީF?i$mSU >&'hZB ;^@]1C)nܗ.s]vnnZET>Sx۶RkZ W\nRaEڄy)OḴ NZXÖeIh1eOtam//h92ړ|[.Z[mujfŸ'r]Ѷl 5r쓔>M%H!XsԎ QFm^,Zz Dc/$!e~I1x6<\ MIg2Z(u":an[`Pӡ['Y1)*) L5]EkCzQd&rijZ&x,,fi 5]ǬC˗`R=tӉAՅ$ef_d"XC&M 6qL34swtST˘>w}隓ڨ`@=p$ 3$[NjaBƻc^䶗TR4}q! 4uZJ)=0zXHwە[VmT6@Q\ NF zw(&ѹaPA e>4y;z;e E[bzޣKG۴5萞MKT!3UC JS*͝5[3]Rp2Qi/DVjBT/d >0*"(S"6geGCgÇFbTN]ee"bCDgjt+0o$@d-]̞WO `?7lXs$l2\Gsu'uVl[Y _2/) =NC!-JCӭAînbG'nZ[1RP"0_EŸe &)gݲ7zgQVp*n o~c1ʳs-{. by"4٩ ÏJ9{s֕G{ 㹝n٩4itJ<a+c`r˚*wp nA)kK#8Vk1J,+u6g )H$Ȁmejtk'<c!25TB ;TMDg0ܢDerc<,'yZgDo:kU 3Ha甌uw*.+ NlPȹ£6o.DsA$!nmɈf;0قjD2ܶŒF2>My!G?XCzdAI=T{"d70k84J?7_RՃYH3O U^٬tv% \S.2Ag6vX3l/@{oDz6ӫ6b)te, dfիa4J,O7y_-Sǐ)U\EgXi 癛A:N#EmNXl&Zg-Hv] rmٻqUe5Cv{7L^3(q]X"P;Wo_\%;̜E aѥْlm<(tQXo_>h^7Cf:iMy20Wt=*ՍOIg _܌$[ 6|/+Eny(yuZUJlJK%"RUEO/Zfմ7?]NW-XmKzme1Nn# 83U]k_;r@3l/|ӨkD˷gؼ@.J㻨H^YR59vn (yS$oN6pI6„{a6If^NOx)lLl v w0E Ve7ɥfU8g 9X@4rw;ٌy\'P`D<!%irP*ؽ{=+,FBͬVys1b5Dmw;Oj] tk`H(TiQ=zŷok w$?fOil  :HAx r%xLm?l, r7of11̔ :o2$]{GdB37)I-eSjI1][dq:Q|StӘL Ȓ"{*SYl^D{sM9[$r}uO$ o#ey&vd7F O?aW|Vcsy0#NIM>}JF]bzvDb+F3IBNIRQ m 7fd'>փ.a'ZxR+Xo/Qjeoriabxy iF z{/,\vuR^5$i󔞷 R_ƁULdsI B-`63ޔv`AmrK=0:jtks^@gЬd땯Eܾ\~q8&9eNjn(Q2- xfx#Hڍᩥ=͐rR@Lj3Sv:U 7b#2&G穲DZčMreEźNQeK]TV.chBk mɸm8~ ib5cE$_'77{/g x޼ 7QjdҏLZm䔶]Ľp;8rBʿ5Y;24@?:uS%PHW=ani^khHWNv4^V@j+6%ޒ4j.2׈su kLy "^0]@f~w;Y)]ޠf"c;Cs(o4mJ$`!7cѹc :|3C!O삈:lBx9exR;`4j v~iaHL"ś+i?m(/ɸH1J3oH+DЍ31 Lpr+˹8^Tze [HEMqFB6$ ϲy)`G$bP,Fܜ(a|LjXCFL )u}0ٶ )MأI!<Ŭ4$"1^s o^!ZƩi%`صP(:@jmjhdTٳGc7}5zdoLbP h# &#^(NY _܁ASGi8H*WDu e@ӛ[; ͢%š%%<% v"sDr4 P;wqkt0,/MƓple`Dt _Z!Q7ar RY_OLÄ*mׯ}/P4].i73S:uvtaEFۃ;t9 3Gzf?ŖLQ# qފE\հ)`Vʂ:~'aQu,["kTorU>y[#7#;=,ICH|)ɓafH,Ui*j9s!Ztc6"9Dr;Be*G&aK؆НR/wznj_Z+}q$[ Fń͏5B%4l—ivT:s׵w38^Ȋxz8S+Ok|6'9ٯC+bwo:zVwN\i>EeyO8\Jȍl%X&"%WjIa U0, Jkj Y)9ROg5URDLfDJlfSfJJ=L8%+F/P֎TajZelpX׈a)цsΥɉC3,A|zkH+Պ^-典"/Z}\A;0O7ƒ `$FMzY P)Hl[nEiK\#k0F?Il:/!ǽ;њR~u=l9X8 ;SNs.z,\o?mwN"8R--fqs+;J?hIm|HkFOkbњ8R7_!r ͊ظ)7 &'tE+m[1/ܢG܌⮎WD ]1Z~O:?[T=Z3C|6n꺈ٹ vEy d7} ],"U}:6G%4δowKM؞;EgmFZ")I8+& 6%['i.%IUoo.Dꯊ5h=-Nᦉ]bá8zQlcq`cD'pܔH ͪ0142SAȂiAJ*_ִ 8Uim&w6aq]W?4F\*lފwlk/^0 %G oJS׿ Vֆ<ᆘ 3NhI- 6=H)["q0Oo30Ȉd3zlt~*ffn.\>.ѕL ݝ3: B$'Xi-@k$y;cDFNJZ 6jrV dO)`PX޷E K'{53UL*;y+=6S|"_5M .~MxY4/?BKCpDw{kŽꄎ/&͢vGdCł,4YlJxn=Cw9B!Cxr5=wQ{Eì)#'h{1DXO;i[.qH.#Oϔ`YY(u_aVzx$+9n)ԭo k'an'$:s;I zzڶw h[[mVoMs2'+Ek ƳغJKX ߢ\ >r\oa.u Ӟq]74oqKȀڐ8nrk7wv_֘ÙfQZ8$%5(9#c,ZI4[[q8iUzUֳp] B6ͅ$J$KaZ>I'O(]ɱ;>-/t 0m.WuUM+\ؘݑKײ/eĔƷku?iTpq$#iYKI Ej4p،sB3LY5z+:^*uX$]D|+oq ;dKz+q&W-$f'1p2{!]֠ܤ:r|bk?uh_ @ i-lYRKٌЙ' 5{\Tbjc kI?P,97j wP>iN 07V2?ܬ^ Z=lBͧðs "a(^xM<\Ջ >)3K=ɋmM#>iX8/Q9geP$dxI6T}~&'ߢ_ P|2|w ĭjs_?:˱FAHԱv˔icdgQ"EN̹o Hy+!ev+̐丨`Dn`r6#$ퟱ&)GF|\JF}bh͈=ʂb8W]f^`_Rl,_S¥)hhrTqw dqVVeB7{|a٪zpC˖Nz^,.rigNRs^syr{vqO&fW 7uͥρ{e彞b:res+2U}FBm`} & c3.S؉|JuyD$.g(cg֪mbMWڀmO#Y℄ #z<(6vv2Dk͉+3;qT\붹wKt/GF0Xz:$KӶEl؆[:FI!ݶ w2|x=gȼ/korϺfZI*iNN;+K~V76. BeH'R "Yp;fXW Rr.r!nd'$t9kef3#T$}u$ M<8(7\kaFJ& )݈v&zu񘙾v:SWXy- 4^muU<ҰG}D'Z'w8ZV:|F+#(jA%TSp__!@&-:3+>i冻$|;Cjk7'"ZP9/y3XY V[9똑WUm) nI=ev f'Ǒy=Q6٣cXqzRy{9Zm<-odz_޷bq:HV$-@$/3p@V>Bȋф/$1]9q= Gc6}4򂗖I,,o&Bu 6FاOӢL _WX\l~ovR*_>~=iN7φUiWPzhgҹIqٌQvq|=׬ق)U0vc痌M*LWT.RqpRE;}93~!6E8v7t8g W>2X_PPV j%br%D[5sdә4""Ĉb߮%+I \4,)*ܒQ"ba=Q6mFr59txMVxݍ@ 8j IDAT1?cH7-{|!.1eq:DK?kQF#PJE+*yPn`^~B4@F-{NEiAR:KK7>B-W=pi3ܒJuO~9H>4VzM-]b*O{ZqNēWSi3AI-׾̛|_l1E\l{jѩr'M)0`F7ڷ+$C#1E|69(ʹϰ51]7x8ڀ,Vo>'+/m2mJMHwo>̦/LQ [PXD/y* 8o@ߒ<$aT ZsA, zqT!8' sȵ'k'1ŐCv 63i)8\%G.g(nSV" jA Ө[/(yޚbOdN,+QQ!s;EJ3zU6W@mI]q\Ȣ>y(CJWi ,$V?2,/ɘ Wƫ`29Kki 5P1z-jR1 ZSSؤҚ,::`y49ZAJ6ªFK==m LiAKG"عE0ݛcV9IPu4.27mKs7Qפ ПgtPPDAwӭx0Î $ļX|Ϙ/8Qewc Y,ߎH,M=ev)z@d6C9U&ITס0EԧMM;_jK=`ʔԯ4--Q$:i3U e9‚2wC38yJyH%dX;8wzIܳ4&"!sZ70L\`_Ǟ;1.\0.uy ,GʩtTϺpvYj`yGz(<ݧYuo[7vYu"fZTn3ؙf#tQjUM۶^@9#ÚisY\;VQRY'gJN~AI~,lN~w0sN`֤XdAEfynQ^\%$}smyvM㜙I)2OJfk=>w\IĻHN&)+#<~?TxkǑMxx|q<@Ԛ:U|&tq`Ea-`iA-h|$I':Yւ9Rcqghy1A3tk?!kU,Yo<;l<5zHa[C- ^pN4k=9BalB KE ^l"^By{ VJMcF"ؕ fɦ 1*hekMs)hZ$Ii?ÙMH 5/-QnZr!eU:.\1~e.aӿ%: myͧN]\ÅʏȌ//v"ԑ O1ZH F(dK%\m/wVTidXmG͹@e>jyRqS`Qٵլ(ͻuwDK8B|A,MnNIyq A-o8u<|| E␁~3sGs7!/!5d)^2J+qt47"׵‹_Tpbxl>+G!OLѡ<Xm͆‹䞖ͷrfWeSztui.nv a"/wn}4­|IJSYby_n[+<ĸ(ͅc ;\?<>/b p]5Ĭ3Ik )bLL&AJc,4ř,NnWQ@u=nË %.U5g'-\K(ce5`mЬє@ݦeUZ3ؓR u7ѐ)FqLpREm(jCv[&SYoxW[SxZ̹S0Lkmp9\f?V9 KR4+Ӻ&DKٽ :e m0oJLOX.^N5 a:u?;?{E#V\x|oW<kPgn;腥dHu(g41p/jwE!Jl?ݞb-&7-2ԘBbū5͛=N5-TI N!L' SqlX&"Raga~@/&٧Mrb=n6} v^׼{y|n-d,PZaR{,[)F{X[;t_S9CT) b I3ՙfswA5wuv; eD0_Aʺ&6pKGJR[%V*./_yHaW@M'wMQuY-yr扡i($:I. # /cL#z@6/D䚞_{.fcb`%>pkjۅ =x=!j٭s=AukT1Ù-WEY_. ͋TB? p:d܉ЦNGVz'qJrԴ U8ސ.xxx P~o<$5'+S:ф|jު4NY9/7j2M2Zl]o{ |?VAW(o}s9Q{7! `z|gȓ7Q/-<;c%trH;DNWe`Iݰ*5ByvHv\b1W2vuSI!4?¾]n]cq*"Q@ImyJ7A_ _bnmLw2y\aPRilW$Ӿ7$qB1_h~ 0瓳9a+³Sr<Ʀ c^ob8 *)–}B]=l'%3Gl['{z =A>79@Sx)u0;RWo݅q8lw̰qyIhm/k(rѽ|XRrZ7b!MH)ZSZS8 Nj6@ X3h+%ѺҾ})+,;(z +EFۜd)=ٵg'mo|L%gq`nciuiȑ$ؠ$WuT=Ż`8~k )fߒiwWI :4g #~)n_7-ߑ ܾgIU|kry\>}O*<7IT4'\De6 lt8lamĞt[B8D:/:ͬu#}B!2Ȇ/6 =ӵ-\`gf2(+SZ« 8lw"U ݢ5MR”S7SaIu]j-˳d]unncэ @8f[  #Bv L8 ~gk "Yn,=#V l^ËL\ވ\p(0 ߭vGH;q4(mgIt֊OsRHxfjv\ kZ1/̝C();;/ڽ/C<ҶKh÷2 x wHhA!j{,V39:#.)hڼ @!"I+[eoԼסc[Bu{EX7䶖Jo~-6l5aTYpn:5m:g]П (??Og8n~xG[7 Lh5$iIRwь;4vQDmʜ:uRI⓺,mQSEEй{c Л.WzV(#3ľEmT;÷kҡH'8+JSzAtz:Yv'3.abM{yq4{*2r=y=EsƼ1e(Ma?Dm[[m_0/<'=c[ϮFDjT8Z4»w1>i(tLy?u` F-k Yy$Z)ݵRD-̪rd{=BjtaȵIWE|Xh`޶SSul4- t>[x4߽זxL߂Sipgp <'›BC{vXt+1c<= 3(>NkMW Y`b9:eV4yuLpWL?<2>8 2!:¬xY-0|H71wOL!0||ŗ/Jwf̉SI8T 3Vo,)٫ZYhlPԵ4$^kROb`= 6IE N. -6D G&MCeYԒl{gxi)[ȸbvƊxDu9 8gelXn 3)'qm>WNL[Zؒg2Ns'˓,M-ƒXic@e< ވJIXLU4vՁfP)~76cFƷVDY+U_uVX[nsRԧ,ll9~2b%RkljۛCL4QB-IE+|V<:PEȈ|݀?Ȼ38zVocTY^x)2 VuU:员T!P7DVrئ0lm%XB1Av](ʙn. nԫÃwDg<. I ĢX1K\&|}: x&x*X~XZP=b7X,T*@Dka({+ڕ .<\ 2.?p5J8-\p[[Pc#6PA؋#ti"M.btnҩI Qzv B@qtJTLvP(Zfd#VWvD%t$5Ba2.SNu=kYk{HPeT CGt!c\0. f<,LXCDZpſHIϏO  _ A6`y yRJ)@I VB_Jx`{ٔ@Z)7RB ju`JGz jM ӓo3'>/]J $ػB29gyQw -z^i_wU ѐ|*CuW:ԡqt1VW%4&< ITV\=kVqy=޽'\&f_6IJf8 lZ.q tVk|1 Zqx8mP:Fl&W"!v mDCH\^{GV5F-֚$e4ZѬ&=,7˶CR_?}>:[5Kl*9HU>}iD[dדO~4P#ʞ>6}e[Mx vs\a^uj$Nmy*S0m,Dt=%}QnsluۭG+UN '5mŸ&˨']DV֩ݜBn*5Gtݠ/u5r#=V'g'CPe`+Ȗg$9h_@t&r*kP~*/vgr> fd\[;!0|UڰxcD߻"Zezl1wqնZ!nLo*mFt\8 *B`ĄGr MIDAT?ӯ-?^H|x)\b.c.O)jg)]&J$ľR3kk^CZ=?=N@)K¾ڐ!ާs6hl#u9ƕ[{s2Z!;="l]z疮Nɉ{-n# N#{~dd[%db`>}TrQyBHYQ1%~oQR[MCu811~ p%ݵaо 嵻+FG߼;U A]N8Mзo| /mD8O<8eD;/`:?hʛA\Qg۱Neރ{-"rs.3-"7)Pn:M{|+S a?i*#|1OIbeBS l s1b~[NV՛m@)B){J;!϶m31^~'^O;HY^eAm<9w'wos|#6l~>3O7nU^CmNJ[&w>#Z045ǸǮ6`bi3;uS \|3n7wV=uԹ9I7]_-^9#p98ķQEvY F_\s_W!\}$6~>;5{൯? LIENDB`kraft-1.2.2/reports/weasyprint/000077500000000000000000000000001467704360200165375ustar00rootroot00000000000000kraft-1.2.2/reports/weasyprint/Readme.md000066400000000000000000000013151467704360200202560ustar00rootroot00000000000000## Weasyprint This is a kind of case study if the [Weasyprint Project](https://weasyprint.org/) gives a viable way to use it for Kraft and lets us go away from the cumbersome and weakly maintained self knitted script based on Reportlab. ### Try it! The example here can easily be built: 1. Install weasyprint preferably using packages from your distro, see this [Install Instructions](https://weasyprint.readthedocs.io/en/stable/install.html). 2. Go into the directory and call the command with input- and output file as parameters: `weasyprint invoice.html invoice.pdf` 3. Check the output file. The appearance of the printed page is mostly influenced by the CSS (Cascading Style Sheet) in file `invoice.css`. kraft-1.2.2/reports/weasyprint/invoice.html000066400000000000000000000141731467704360200210670ustar00rootroot00000000000000 Invoice

              Kraft Enterprises - Seestraße 23 - 21843 Bad Beldorf

              Bernd Bolzen Bevenser Weg 4 91221 Bad Bildburg
              Dokumentnummer
              7-2019
              Leistungszeitraum
              12.04.-28.04.2010
              Datum
              31. März 2018

              Schlussrechnung 7-2019

              Sehr geehrter Herr Bolzen,

              wir erlauben uns hiermit, die auf Ihrem Anwesen erbrachten Leistungen im Bereich Garten- und Landschaftsbau in Rechnung zu stellen.

              Wir hoffen, alles wurde zu Ihrer vollsten Zufriedenheit durchgeführt.

              Nr. Posten Menge E.-Preis Summe
              1. Website design 10.0 Std. €134.20 €3,420.00
              2. Website development 100 pausch. € 2.345,50 € 4,550.00
              3. Website integration. Items are evenly distributed in the line with equal space around them. Note that visually the spaces aren't equal, since all the items have equal space on both sides. The first item will have one unit of space against the container edge, but two units of space between the next item because that next item has its own spacing that applies. 1 Stück €2.225,75 €2,575.00
              4. More Website design 1465 Std. €34.20 €3,420.00
              5. More Website development 13.20 Std. €45.50 €4,550.00
              6. More Website integration. items are evenly distributed in the line with equal space around them. Note that visually the spaces aren't equal, since all the items have equal space on both sides. The first item will have one unit of space against the container edge, but two units of space between the next item because that next item has its own spacing that applies. 102 Std. €25.75 €2,575.00
              7. More Website integration. items are evenly distributed in the line with equal space around them. Note that visually the spaces aren't equal, since all the items have equal space on both sides. The first item will have one unit of space against the container edge, but two units of space between the next item because that next item has its own spacing that applies. 100 Std. €25.75 €2,575.00
              8. More Website integration. items are evenly distributed in the line with equal space around them. Note that visually the spaces aren't equal, since all the items have equal space on both sides. The first item will have one unit of space against the container edge, but two units of space between the next item because that next item has its own spacing that applies. 100 Std. €25.75 €2,575.00
              9. More Website integration. items are evenly distributed in the line with equal space around them. Note that visually the spaces aren't equal, since all the items have equal space on both sides. The first item will have one unit of space against the container edge, but two units of space between the next item because that next item has its own spacing that applies. 100 Std. €25.75 €2,575.00
              10. If you mean that Caption and Enter here are not vertically aligned, despite using the suggested 'vertical-align: middle;' you may have to look into giving the columns a specific or minimum width. I am suspecting that the elements may not be perfectly positioned visually next to each other on the 'reading' level, due to the columns adjusting with top/bottom padding in order to maintain vertical alignment. Therefore being strict about the width of your columns may help. 100 Std. €25.75 €2,575.00
              Footer!
              Netto € 10.545,00
              +19% MwSt. € 2.003,55
              Gesamt € 12.548,55

              Bitte überweisen Sie den ausstehenden Betrag ohne Abzug bis zum 21.01.2020 auf eines unserer angegebenen Konten.

              Mit freundlichem Gruß,

              kraft-1.2.2/reports/weasyprint/invoice.pdf000066400000000000000000002711771467704360200207050ustar00rootroot00000000000000%PDF-1.5 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xY[sܶ~ǯ`J";ɌG8Qܤ[[xqdK+9֮li==/Ej!A\sU!Vp*^{x/|H LӚ0i]!}quZ(6B6~xp,)um.\imtIkhn&X$7VYh~>+ 4[7Q,nM];Д|Vhn&X$54Y]ęYsq&qfERAȶFY`S*G^+H@TR[ˑ2>qѮZXGk`UZ8Z˿U-*ꧣ o*.*J򠪍/7U\/O+z}\y]YZ+*JLL MJ@1mXK Dip=וLPK;y*hTu; pUW^­ *Jn4poW|?8Y<)Wn!G( ژ|8,}  FH (o~Z_nNXچ7Q]Rat5[Nƴ+d|$@ە/36. DAD j%/=d?5 m,_UmlKTDvЮkzǨ] wU%]{{M-rw׀0J5mPg֕-j&Y /mPy[|hZf8 |Qs_Y.wde[>8g{FB 4nc*U5*/M%j 9auD=Lgi`[񳀁 Ce#g* 3 ({b憈mYJ粊 zq?9*a/W99["DkDia== I|KO٘sx^頝Ɇ2W|XE"|e"P,/YwǛׯ㋣_j%_f*|PxMl%v #A&w"Gx2r"ba[`˺d"2B~\2h G?ԮڎHYM@Ž4qbk+Cw0wϹu7nY"[t?'N!"(KD*+OA$lo`R\fk5)CJ ~F4MٕNbWV=tjQi=OR:!/?%BAQIE%Y\X[,H<~@3?3 endstream endobj 5 0 obj 2699 endobj 3 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Font << /f-0-0 6 0 R /f-0-1 7 0 R /f-1-0 8 0 R /f-2-0 9 0 R /f-2-1 10 0 R /f-3-0 11 0 R /f-4-1 12 0 R /f-3-1 13 0 R >> >> endobj 2 0 obj << /Type /Page % 1 /Parent 1 0 R /MediaBox [ 0 0 595 841 ] /Contents 4 0 R /Group << /Type /Group /S /Transparency /I true /CS /DeviceRGB >> /Resources 3 0 R >> endobj 16 0 obj << /Length 17 0 R /Filter /FlateDecode >> stream xZ[E~_1>9m`51<>,썄sݳ ު]5āpUUWYd+w/#پ6.l\{jǽmεWgv.ڇ'.adr)Pl• f"W4V6rbo/DB` 7J(JjJb5:䧄ٶFh A%]IPmWIl^; *aUJʮ,B {&W*ʂ*Jb5*읺dZk9]INmW lϢ/1zRߠT 1f<C;8UZN&-$7\n@PɂŏQIk(t712##b)s&s%=ԎÝR$:6I'nsIGR Y 7${F%oMv|N `2RsZ]jl98KH݌H5!ѻII>9$fq<8V %zv&YDgf7s6hmz)n9`FȺ$tO :D-ږxLZc+03NG-WKRT)Ybd}^@sJ+2qͲv:J O!_$5$aj!o@[1'kC ;9ZoGzJ>@#ylÑ( )!pShY3^rhW\z|yK& }--xq9𠼄K?۪C9?[f~u~Xu~XuۼCT}ތ`U©z!YG#:Bi.{3BX2NąuXG?BuXGuXGb.>B:r-v|*ƥ|P?=3xçN[/HD\Ah⯼F%U9s aL/Gǥ\<ԅb'kLǷf?ħH1 )Cax1ǐd*II̠GY%[ cqdôu? endstream endobj 17 0 obj 1439 endobj 15 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Font << /f-0-0 6 0 R /f-2-0 9 0 R /f-3-0 11 0 R /f-4-1 12 0 R /f-3-1 13 0 R >> >> endobj 14 0 obj << /Type /Page % 2 /Parent 1 0 R /MediaBox [ 0 0 595 841 ] /Contents 16 0 R /Group << /Type /Group /S /Transparency /I true /CS /DeviceRGB >> /Resources 15 0 R >> endobj 20 0 obj << /Length 21 0 R /Filter /FlateDecode >> stream xX[sݶ~ǯ`:%ҐƕLfi3MZ<}%)Α#  Ē=C v߷эGt؋bJ6}04W7A׬ͳs\?j0r}msS.mXySR ?x8=zgŽ*[AZގcS7N~/W1 T6< PLuzh%(6UM*y7<PLah%(6UM*<Ndx7T/W1 T5eP\cu0Mpz`3t Y`ViDlhPP ʡbڳ\3rnΡC!ՊfKH5*[j/ػ1CcB*ݐu/UNz"ZO~\5!Z˭0MU oJgn9m(q71юH^Y9tD!}p=b{/&4GS#g{T=Ffo#8IW(M@ؚ[Xy;I x n&CW|==Jtuř+&zEkN ;2ԑ8ڂ:3~PJd+J(mOd!yOYE/hTI+jw)|ڈ)@W&Bwf(IQ%3\\Hx\r"8h4{,gyz\8$AI3a%lzOi q${N:Mй QሌdL:PEMĘ>

              }rWl%7Bu'iÂ1EE;~C9@PPb%#,Xfy>tLq]$^wj OO.t=z~0ISR2v;d'>]+w3C [=%)5?Mlg|g>mt><ʼn.R \إw^B δԧQs RdPC4ʦ1!{#%"tj>%IF)\iVʶOjY7*l6q>Z畆댎Ǒ"rO{uwv ڝzmt#Sc DIGV,#S١@OXlVfOnh7 a|:~~#@ԭ1ygNF|m 3GOx:|TMŋE*ozѿQc%G Wr)?ĐI,y"fOe:Lg:ED_a`:o^N5:*ǧ7}BpO.wvϩ q-:en^LPV&"T_*8\mU1pP}h[ISQL;ij/x 7]EZ Ot^O:TCX֑~z(yTgzj\DLAidʻiSO;5P69 >|㦈WaWP~]@jL Wѕ8yyt(.e>;|)96`8uO.9='4瀝=%xOr.0,9\2m2~C!(|z`>HPc `CoiF E9 [mͮx8+co賤oYOBD endstream endobj 21 0 obj 2023 endobj 19 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Font << /f-0-0 6 0 R /f-2-0 9 0 R /f-2-1 10 0 R /f-5-0 22 0 R /f-3-0 11 0 R /f-4-1 12 0 R /f-3-1 13 0 R >> >> endobj 18 0 obj << /Type /Page % 3 /Parent 1 0 R /MediaBox [ 0 0 595 841 ] /Contents 20 0 R /Group << /Type /Group /S /Transparency /I true /CS /DeviceRGB >> /Resources 19 0 R >> endobj 24 0 obj << /Length 25 0 R /Filter /FlateDecode /Subtype /Type1C >> stream x|w\620Vd]{(FA:".VP" *EcA&E"5j,1{!߼gy>|~ٝ3w:E,җbKd|̊ %1CVŇLj"HL& H *&Z牕AʼnDCjQ&8Ա/9f g$r0( xrБ}zu_\vY"2&*2?.(P:B^ZwG#Eƨ#'1q1bΈZzUpzCtุÆ%&&6tEdWbbm"#ԋÃ}C*:c"R􈵼D?rDDENbSx8\-N[zEEm;Wפת\J%xdjId$S')8+C7ׯoֿL5N-b3#zNot'\*JRT#* Kk҇ҿ (.> b NT4<21fp: ; 3bƒ82 Le3Lf" BF(G=D/F&FFVFj1FSe00j2btg#Ӎ6~ (,sˢekdked1cgx}}zMLLLL6Yhmhnl/+7oJ }}gjhjae`ZnZmz{?LErc|GM&?OoPa /~N;ׯ߽~O}_ bb_8RQ~}y&O_l_ן? 7NYMQ짶0naTcK(AR2+v6F;ePZʧJ;)i#4J<* ` NpxHLcéx#{< ʎ啗准ŇK(B Ab!NP@m@W<< c8#;w&uöMl?g(O~>8CM`݂WtzS &13+ñzvLãx?AyGjgoTZS:DXZ/\Zb;~y犟?onIޞD x^ 2l: I@5W!E>CXnnY2N 8$4)ne7?Rl,ZIMt Ntݬ 5m(A.RTFx qC /$v,LlEBIPzu @?D:Km4z ymu[թlaW ri[gy)BPi|$HCmg;8B Qӛ  4g'%?YДڂ5gFVT\'>>k4)xn_#}-~꫆$,uvv&I̔Δ)4z81eZ]sm,>ć,~-!ЅuI8[\:=$́ޥ R{()Hy2?&SۉJ+ONݥ N g=k&|Z;,?{gϔ*,orbL|cEjXnfUZN"d L.WŬ<\VLb$lx:STZls>;g銘ժb(f9| w\m~oΔٖFp͜ .REy ~6Ҟr*vך}GsPm>KM更BPa pL!hc$$8-0rH?i[O]o⽛( xyxe)n^a>᪊`,D9[[d"lrXWUTT80#}+b_-YSğܷnJwP>[}n'躝 :!Itݢ;_M''ț>;]=tSyսtqmaU1k´sݒ_V{4'mQћ@xcH\N^ yC#_{%_* 5OeÉx1f.Wh<&0d3vQͧ%NXɻ79}zd]p^ ׵q:+NX r rh# 8]}+_hVU3EѰ/dVs$ 2Zau-9В{-%H`K^F2$)bĭ ZJ!m]9qLgەt pMU 8]ܒvu,W|4=Y:t,cJBo Df'\$.LN\hKht̺< [0 n5j?8?$b#1cx h.ˏ޾/nIJd--E[genhPaSJ9'  .11:&7GU*+N$!I~͆-*$ vgP؁IQ!ܐ KarN/h=+T23ӰGgzz aPF>+Hܽ_M$\ɜӅkmj97 TvϤѺB$v2|J %%~s2t: >JќyWp0u0:OA>%f/xHy9,:oѐ#?cG74v0S>jMAĊu%#a0f; o?BRdtQ{#rsLg$ڪ#q.ő(;L.2` s`o +=rĚ#qkcb&e<9q#@5=k* Vx0]׊tI\J8)UkD$MeU{7FSY4]j:;k_R?s f9x4Rx{E{}/+)_+/_yp߷qʐuёݵuW¼9|A u8>;h#\P6C#`43FGRKo9Gq); rb4<%E)G)NyM.*fI\&3 ƕI";=GEnc8ۖC8gU/gͳŢ;_2ŵ='O^`,% Ѵqu##յ`pFWxQ͠3Ou>_̤d8*Ώ2F+1dZdS8pWޑ4‰PHbg8W[~)<=`.iL/BN$R]򟺱۞S55 59p_^yiJ_Ny˔l{ Q䑰?FK-qW` !7=dсpZPφR|׎[x½u`keFPY58MɎp2@0oDqfO 39 $L?5}ZʓFDTġjx',nZ\uI$ ypHA `(J۬n%lI)ߎ0OOGRlR; ݒw}G L C{v݆;M ϵ*]plF -8H^"y?A|2V{b d,mm6KY"mH Q0 +{`A*y^.<t?R~t K^^FUTr|9>˰@W7O= )Uu7V RxO1W0ӏf&ԉ3Գ/'65kHCa[b/<o\@*kAnNaAbNttRRtTN)G)z&#GcSlk% ؉ZUUJބf&r˧n~\}!'t +iiޯKڃw)`|W(AsO„%Ec 0h4 *iP@UA0 X Ã)¬hP<A7d4roθu}f z= %]HW+`>]0B0~t'N0ܒջ\\v酪kRiWUK+W]OG:y,xؤ(2|AC8?bjŠ#s~$Au3$88bѰD(#|"&sh!Qs뷥o9P;vl8_ѓh6- hkecKyy_̥##W.UBnD399+H8Ӡ AUq5E3~ K4:˟_8$NJDB*SHE6G*(0i*< dHuRʤC0 LsdOiwfaR5^买D- P )> m"8KabKGocYmiCS=~}9 Q'fJ#UA˕K=IKaP`\1n]#+G UT ('b<YiTi֑c$C*eő׺A "(e >aw=^?|dk_t=)xݐup˫ok3o7Aڵir6%Etc:J@չ*. Ra3/ k|~顨=atŋ<ި:QY;FN7HnUwqhRතNw] xcchA=pN*{!7iNIX g†C.k}V9*?w#J ,g6Dz OB &M Gn-!K'*I2ZTCmԮߊN! =Ԭw(慤A_<䀹 W )kOZ>733Lն5q+ d%(tC]`ġfhA$Gރ'G S|,WQ-RL*?<|$tN} nph-Eunh!'[afD< @3lVۮJx3H"ϢҒƱGN/d.74LV=nR$itO(ĐL$@q""]rƪ(MaXDy q SCR5nOjOK6MY&fLSfPgv{Vm!89D` Y8s͠eF8(:uk u p'2tf`$00|U 10j-$H@~#A<(W/lNvRG aEgܚ 5)OM.q'EElݴ>EKjWפ:+S NQھhs@Yt"NզJz˒H'OIT:75Q/TGۼC)uB ?`-R|8}#H]M0 +f0 "xثs.$4?}% lيUoNP{Cƣd#Z =eo{[}Y[yُ,z##@SoOWMo-M+<f(Z<( %Tlwt npOwtAmlH`@?ɶ! {?T+d |i5bga ~,!BfbdVAӍ[s$6vMr\>6d7u#´hF" 9X~ $KnCz;LW!wss   fH񶭔{;(bMsĠ 8J L+J_JVԍ4I9IhUCbS)Ġ"y0G ZEgE=}ȏ~P@rBxO_AeaaKIҿ8niK:^ΨE }9bcol܇q- `ccP__-ՠ,@$}S5g(Z OCP){ R 'rvglÓ>{"vמ}?ZN?qhx.)A R,"BQnƶBem!e;r$< hE<WFGK 06p!O۠m ebXFhٷX\NsIXlO?U"8M 5CՓb8*9d}LaAkOփW칳Ia:cSܡ'Dp+ojvE KzܪtJ ̪I-?ukF*+`7 eeeQ"bD G9 ظGQ!QC 捠m0'o0 ¸vhZI>A H<2=swO|JN#܇w"f;LdDk'|[ىͦܤ`v{p? KQ Ym"ck&$]Odt)-kn8r߁0)AtH`zz0·OaQ'PPi)Z؂p_ko aLkɩ)¯Pq1?z؉mq/utoUTDUXR5Ca9B]={ a)v.[q[sB;|R6I`{ZH{C8sôpY$b,6r-!uadN^[Rw'tZh5kF9GA=?lFXpօY/%3¸D:/ ,&dj"= LY[z6~݅aPl1oH4=5Q~sܷ)5(%>v?fK88*c {ImnwI,˃Hݷf$Aܜ R9ܲbnHTӓ /ףDƯZYXms ǿZKp 6ɀ%6k jN$7r=ƿ> "NyȚyad?~r$M\v<{M , o`nυDCSE6>}.?w{ͧV˫)1 nJaAo?qr_ƾ`=Mȥ;/E|}UbV^͇ #;k2RS ZՒ4J~ʯU{5Xnʆܷq# ( OΖʻ ߯ Ս$+/7TFQ2E!GO8NLcN18Eh;J$R!3<4f1 g_ ɓ#a7/N=uWӦ'; &VX&MRnֈԊFr*P2; 4 ģ%O$hurE-&Mw-XZS"gY 7;ܯߙ~(Cc݊|EmLi6d6lD9fffkͮ3vc'{6/0/605jieBbd Wh8rj/-Yj)44k9reZˍ-wZ|eW/iJg_R+)7(7+)w+**Re^yU٢lW>P>U`e#XO6nc36a+M}>g߱JcxiVVVV.Y]zh{OVXqjΎ̍&r,n>\q\.W'% Tz*T5D5MX UE֨RU[U;T{U٪<e Uꑪ['/弒ct~`>O7,~_6oT-SkCc3Knj/ u:B^NSTSg&um=cuԽYg`=zRk_hMiֻZ[nlbn}6z6}m6JFc3flE666a6166Z46{m)9ms%k6wmۼ^[Va`;v$i m=lllmm7`m Slo޷Wۿ4bhkkFhj&ifk\4PMFi5UF MO;;3;Nmgg7nLvRRe˳+;iwήή]]=.gv?#{Sg;{ڇ''ۯh~>4Ȣ8}i A)8wl8C?J֚CpA8j+6T<-w8&r,ַ'QGn]@: uZ68ͮZ{!&LRD*ɆFqF6a&WA8p[`no0IIT}Ӧ+2'G'Uwu7+6Ϣ\X(a%T-lq}UI3۞o/<$?me>̿+#rQ( T5RS#*^H%^xZ1?aԫ%҉kʇPm]J]N/\]|VnYyq,4ilZ/|[p7h;D Z\ID**}.Γ-%\`1 (4r ͩT֞)X~JUu*r*88qߊ.$IPz^ZpWLN|6ŽNAN Q=ÒisԲ|7ܻq!6蜪ukVjP-u s̞[^p\yEל^J 6wTKF9,Q  my>ATkڴheԿL'p꾋ľ3U=uE+cbU"dN!3bCs+ ^#\Pm[D=5K޲Lhk:VxDŭ \MFXͱ5|~񔻭m;nC#=Amn;Ln2V?wU){mk=I炓?p*1bAf׹9#|xybnsVCEInsO07kFAc <}|X8yt~0jve#Y/C^|%jcw28Q8p`Y{}xtÄΙB'7xo7LjMjvD;Z >ucu37)6C Hh3:UiPSh$l7/?Tl(bngҠei0|oLf/bis`ǜ-Ү8K4S~7W]0Yyt0R@bjcCeKu; bTW~I1eIcՊƓO'({OW02ũ z[sc)l3vnﱉB4hC,JwarVfr ly$?+S9yyO4u9GqT?G.9=X,.̾H O_t{uJ6+iJ:ߜNe*+aѾ=g%'pOྀ' MM]T׍.\\wy3 z:>e2NmN+i'Fm-Ӯ&T3Mm|Wʥ9m?b9gW Rj֥lџFkOy[[;:Bj|| \UѤ26WmJ` 1=bJʉnMw[Ք(SKKX<)1ќ>LN+ܺi]"sW(Ɩ'XSCsc=BTnͩAA#p@r2Lgnn]c%P*Tg=8S ^H{b. ã!Cd[n^|&.&B.poq})yUܹq66]jSh3(AHN|ʁ;Le/I5֤`0ɕ}[!řyjc0G4o{Ӗޓ WG}އwo72OR|+fMFW=-]r/63#$#88A *̀8z$nGn0HeE;I߶;:5U%xy0!'F9s/dw&ܸFHT9始~$ld|o=O]~ͩfЍ#Ug[e?. fv$(}"nPe˅xt vQǖ;[Htb6^|LohT9f uncP&f@FqdCs/ÈfGOP_ȅKj&Ĵ O%OVE Z*!rl1l'#+),HʉNLM*eqTI{( )y mO1pk^e3wP\FG%Fk}7?SE2(,C0V8h4LܚUfN'Wb?Xi=u Oy"ORciLohP`P#iݾ.Z&6ŏMf{AWq J7ܺy/TgNVr s @ %pɤCCC*&Xhi~Q'N5bRVtt:zDOO j c¤o{iCC H;}(!K3=@j iiWr9~.UИgN/+;2(&6-/Qt=8gi€'u&趜 /[t'w9d3DؗۄGuYutN|lF^?s{*`n[5UEa8 8q(F[~ Ņǯ)/M!*O?Nht⺨̈́'qB?]?unl.z #q Ɠ,:joJt+U؟FGzſ{*{068 \[: Co¬ڽ&vg;`kRhܧw4~l ǜ}xHP#[/ocg #ePL:ړoávmn5q߶>3m}y Fx)'W ftHJ~lh˷SbOu*5  9(l6UMin;n4:& n4*& *"D]Ѩр .@UH1FcbLn1s|d%3;Cs8U_\DEPv fH_!/RMv I"mFl.}r:N'y(E|{47};MT( ۅaP:~JoO)o1w5l~[ J=ͻ6'2A{WnNUdT 4ORs] 8'cjFXg,d枺n}g`Sdt,]Y X!b>wSڏ.Ѱ6*5]זfg@~5ɽLmչey?q[=@>ڶiN9ZV[Cѷ-:=$(s)ꮸ653|Qgғ(F \f5^VL|#NyXж.k>]A/^0%0,8@u]*8SFʹKjJܕ-鄿AFKۏj*a?8~"ƻ>/< y䂓BO:]$i䵅2@'գPC*op] qwEz(s͌dRɻIcL5n(Hs4fq ] dhϋ8u 7Ѐ߀ pBî2ڬŐ_Ш4}:҆L'_ġnuG$|V7іWcQH̄vW]5֘IdnRJ+ff}4#k,ۉ?W}u1{e$i,YCzLVrԺSWE1k֭?wX6"`Q&6|>D䙍,t"a쩚bWkz$hJGF:kZ;J~(ꘪ0rUKsW:%=FTYK8O%@0Nc;ꧪU&.NS87@ jđe^c#H"k7)~{I{'Kv;X6]_8'Ë" xT:+kۋ7/]gX!=ҡ~C7'>Iyا*4W";! 0-3RrゲJ jkI3p*: *(8΄EEj哜0,Y *W]ݲK>%Hv~iwHhƩrm+b#QڅVO lǾOB ID|y;%hFdFFg `ytG ꅂ0X["v' |]Fo nY(B}h<,U^"*.Jn_bv'b1iaTj鲢raE%YsB=\$5=WP}.L'jkC4X`M|m@@枨γ 2Y~(^ ;M襯Zo GROHy7ai+O.1$&0r,Ցi2#N%:rѲ3Lx gbEBw!H2S<3f6);w~ N%Eh b6Eg rh'?yųW.bpR3 e> ~Z0j)ӣ #{\I+>㗏^ŇV艏l>4ތM\>ԩ}zaU/= "55㛏^xHa$]5v&rQ6qH0%3T$:*TP.*B aNђ?Yi@2g5"~&% WMo&KTq5<8&oFq\LDOl Bl^R/"JvGߏ gk &ӯIrmjdHlŒ9WowPGG%]pg3iga`ݼϝ*'&SQ7d2G,u[k*ߓ_dQsqc`ʦe䎒3Ԇ j~2Q`$~9'+ōEqErpLj`=u$ۭ`o :?&L_ʶZ'H%vq!e2;x@&>f ˝Z%,f]rrj4l GE-VrAIks63mFvlG* LSA- $Pr"LcL,U!շx "\\]B{B8`|Ϲr:)u">aW5dXAD+`TYآ"?M=v:mcJ̐V#65]sYKYXĕAV*q,8}<3/R (bE 2:$Y+ٶh*L(Pˢ}R@#i|(Fk1FOeW|)ةu*&֑Wzy 35{s{:K;I14q?ChTZF:.Uln$d$=v}q?9G;QUMT,̪ǚG x9޵c}t0#LPU4-@ۓjN')tM]3yq endstream endobj 25 0 obj 21794 endobj 26 0 obj << /Length 27 0 R /Filter /FlateDecode >> stream x]T0,/A2 .<' KO@, \9\6Gr8~swʛƩ_m]|'sIk$-_0V>tO_O '_C)]l+M~>=K?Ưǒ%usoK嵝.4u}0Lޥ){kWsuYLⲘ&4V\p29qr"8 ąqA~P\ 9P@#Quv0+F-u'C>qzx7bĞ$uFQĚI?QӻȞDijG:uq<; q`x{ѫ~3uz=G +]ݢ#:'t6+Q^%*rn#V?HpF< = > endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UCDDZJ+SourceSansPro-Regular /FirstChar 32 /LastChar 252 /FontDescriptor 28 0 R /Encoding /WinAnsiEncoding /Widths [ 200 0 0 0 0 824 0 249 0 0 0 497 249 311 249 350 497 497 497 497 497 497 497 497 497 497 249 249 0 0 0 0 0 544 588 571 615 527 0 617 652 263 0 579 486 727 647 664 566 0 569 534 536 645 0 786 0 0 539 0 0 0 0 0 0 504 553 456 555 496 292 504 544 246 247 495 255 829 547 542 555 555 347 419 338 544 467 718 446 467 425 0 0 0 0 0 497 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 576 0 0 0 0 504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 544 ] /ToUnicode 26 0 R >> endobj 29 0 obj << /Length 30 0 R /Filter /FlateDecode /Subtype /CIDFontType0C >> stream xP J[ E, *lؐ *,.b7 k111b$FAShovMf̛77ϗ杙sgGTqIC1Q1h֏Ϝo xY5X|i9x?mwUYUTvR>zִiU5vu3?dHG&L)РА֥du&c|>58Qg{橋0S3tico'RtdnHZ}cmiI`[1 i&c>#!=ۘ2>٤ i < dJoow J47iJ1%z[!ͤ5 :[!e'p@# pꨁpԆ'. :C}4?#MB0BhVh6C[C{t@GtBgtAWtC8z"胾( D#1 #2`B& SLC.%afbfcbcbKPXX(*kQ ؈RlflVl.>!x587&-x'pN=Y.Œ>%|˸ >u|rM|/%-|opp-;|#~P`+*+7PE5YNt 5FWVg ֤Ewz6=YuEoЗ~Աؘِl¦l d eKbka۲۳;; ٝ=ؓތde?F?p 11!aXHha2 LdLf 'p"'1i40idMfq*its ˸+\"s5p-q=KYM-m]=}/[=UVw=nRԑV*kw.wK檔TkMQܔ\R|xmT[SVfs2;tyt-M8k\E"M5K_>C1 Q1X#H0HL$" I۱;K/^,[|O$Sy*ե ah#q2I+*!bb7OerwZj99^1Y)OS~^dQϴzҮ۟$u @? endstream endobj 30 0 obj 1879 endobj 31 0 obj << /Length 32 0 R /Filter /FlateDecode >> stream x]j0 ~ CFw ]r6[N m琷&A_.L`7KXI#89Ϛ_*2a[νu\mpx1a#N ߗa/ k?8O `qWԌ+|M2"B[f%*9$t6dͿ~S7EUdOVyL2WަZ+bt? endstream endobj 32 0 obj 237 endobj 33 0 obj << /Type /FontDescriptor /FontName /HKBHAD+SourceSansPro-Regular /FontFamily (Source Sans Pro) /Flags 4 /FontBBox [ -454 -293 2159 968 ] /ItalicAngle 0 /Ascent 984 /Descent -273 /CapHeight 968 /StemV 80 /StemH 80 /FontFile3 29 0 R >> endobj 34 0 obj << /Type /Font /Subtype /CIDFontType0 /BaseFont /HKBHAD+SourceSansPro-Regular /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 33 0 R /W [0 [ 653 594 577 ]] >> endobj 7 0 obj << /Type /Font /Subtype /Type0 /BaseFont /HKBHAD+SourceSansPro-Regular /Encoding /Identity-H /DescendantFonts [ 34 0 R] /ToUnicode 31 0 R >> endobj 35 0 obj << /Length 36 0 R /Filter /FlateDecode /Length1 2336 >> stream xV{LgvECVä" w">X,h+(m1mC 5A[5ڦ+TH|=45iw3~3n0LI_mϿn:x@s-xD)3߳;p۬#:e@wpQc\(&X;\crįCN @&j@- =%Pѣ 5ɕ;[EϛL ,UNK5:V$T X́% 4D4HIk1`J>А00V~'ao+,.,F^5}u]n_>Ɇr蘴cǿv\o`H\c&$-`V;4+UMM@1.70RP@HAhgCM͢ov}9,Ho]}ݺ z-FpgoIb[0&e+ =,$0le#o_*82eQ(m3E)Ní6UIeӫy[r dԜ,x8j99kwDL۾ uE%k#bx̎Ȑnkp`KgPQ4JPB*FO,T'v8aj_$+dw6摍XM3Bѓ¬nbS;07c_rVVJyn/]]-b=Wv3}I9KgLt@:Ij_N~Nl{Zv=-KX"1VzTTVU)ҨHz5Lc HײM}qYΝ_XALtRU &'Fɕw}G9-;_9.#k^%+25|2G_j`~__kY(_ "[@k#HA\v,Mԟ-gwL2 jL4oҏ"/$N*y. Eψ܉)ݨ.>7|K^ 3$^`*n-8mԩ+R:AgϹrU~RW]!Z (xجkz O\g`.rfcI^҈jCtO$XFD<$*"rU Q NDؤQ[`Dc ] endstream endobj 36 0 obj 1533 endobj 37 0 obj << /Length 38 0 R /Filter /FlateDecode >> stream x]j0 ~ CMZ0]r1{OJ;YKXRv^:kd~Q='cEQ6*_VDF;;.BJ>)Y/|{ v]͹EۂƑʽm4MBI-W7(P> endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PSSRRH+Roboto-Bold /FirstChar 32 /LastChar 117 /FontDescriptor 39 0 R /Encoding /WinAnsiEncoding /Widths [ 249 0 0 0 0 0 0 0 0 0 0 0 0 388 0 0 573 573 573 0 0 0 0 573 0 573 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 614 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 521 0 540 0 571 560 0 0 0 265 0 560 0 0 0 365 514 0 560 ] /ToUnicode 37 0 R >> endobj 40 0 obj << /Length 41 0 R /Filter /FlateDecode /Subtype /Type1C >> stream x|XW7 ,́Kaf{Ʈ+D:RwUDłbJE,Xb,ŮIT,1;>ogLy9.wsn\T*9Isg&PZ( %.q U) 5θZ.v5C E [yl'oKV1lMsxk(ksTRWzүW>C ֥$/N/ҍ LN _ OJO N ER"u9)$y<.w|.\I҅Ƨƥ$E'קo]Og˽"SR+XWh]{ңR"uÓÓmRtӃw럮OM7k3# Rd(N**)@QnV()ߘu1lhʬԬ옹 ̟Yt`kok¢bEP3Lj Jڨz>K_,U*wd *C]U:g9r,˹!-ZZ<`lnayG_h+JdLVVY]z`'ƜL`Tfe0!`AHO*kWZn>m}Fo3f4Y66q6y6%666m9cs͏6լUWUQOROU4ju`նmmmmEkwl;ͳ󳫰k`~X)AY+ߴ`!a֍ճ]14֏co_XŢG^]w%K\]6tY4.A/4h6kkji^h@/G+G{GgGqli&U9ON􅓷SS -N85;pqx3@~8?%[SU.ſ'A/ F Sق"D BLX)|#lꄋ-EHEEC 'bXL3ĥ6J<*7[Ft>񺅺P].Mۤ+Ujtq9e]m[[[jnwkp;ven޺;nŽ`Gǻܿv}{A#߹?p[w<==\=<=yL1###cGG]u=z\7yx.FϾCZOgM -}6w['7zI6  F& CaаPf62N.n~5|0ed88mnmo 6.2, 7-=rcaxxx8/`q^3y%xezzk1iε] gq|6N s~T;|k$- MwyC妳Mo!>@;5eqppz뵇 X8AQzƁ5t(8(]`؍GH>{IFD-[y^_\ #Pvw [[sasE?3H}ۅ􎯊lI ݋A`zSn9|ڤ{| Ca(|쁇` 1GwzsgȋIJzXĽ c@EK^o UQ?G?Z6(is>%Ra9I~ܲuKE9?JQ黝G`G4gH?rWB^L-/3 %ljl P2ٛKE논V6S;B\c/:_B(DŽ.^ ?#tAo0CLJ  -[HӇx/{7mb4j1\_w;0"DW~e x/SxSLᅊsa%iP}u)]"#_6)F_b|p6<}O~Q# ިm{DcF /kXğ#3 9!ڰͨli4m$֠센-8]麔Z/Ѡ{rx S< &=E \ٸ{je{N.?jgWa˩^ 6E<޾$Z.@Mߊ!XtQ&(e5\|zQгTpGAOlJ`R))`:_c]Cx6v$AP֚1G~-M͍3K?suЂ@xd@=[/d]LKZ%c*pXFݗ/5vӊIou0;i*BFH7oM׮4-xM`R1QR).♚ߞwب8SjxiSyشt=UQBf=ao)́syhھc.}^m0ˏ:l ^˹synD^%T[m <{ɇak7}}ţ|RLPOyX@TI* ;)1WB^Fgaj瞝q51 Q;j)騯YȫDz-1"NM/*۵pV1oo(<4wxr1t o9C7m ҆Ýa}Qx2kfd䲽nGFⲻCwD]a'w(ܗ ,^$Df-?lFkz'%_O@c <|njm\z >L(EWر5AEN>r$Fp.:v_۰aITMi9ɡ˅m7Eski$3A?fG헦oy֔KYZ-E7N X28HY4A2ʭR,>g[+*jGoѸI>t䜸H"%9UJ~tƃh[(G)gonA6wN{tQ-6[/̐qjy6kLBOwRق1^-i[d$e&4v*-ԄUv8t*qa":(=Jai i:*| 5tӠSiFL:~4vcTHtbia4#1[+tYYֲs?+MbܥV4J  &:s՟9it7Q0 |!`!`~#qZ0;;Kٗo+i+G`ZPڰ9~!QW6l^{x^ˍzљRxgDfps5tEmXM IPÓ$jѪELʕwzFй%_Bw%=]ߘq7)+0cmRiaCE>$pPx53Oo'.iZJPCkU I & ?yŵL]Ɂ"*߂nZi#g"B36*oSa %p$C2g{i!8Y&,\E:1E( B6plõ6NK1n⯿-S\E嵽<ת\Em޷U&kN>9P_ &0-|B;w2-"yfH]xBGhH:q xsߏ/jYG`ֵ#Ծ$}v0 ^aebZdq+  Dg⛗҃{67pGM5y^@e}݋mSW0_G$jLDj׏wOCGv<~4b`#B+r|f Oy)W <[ K{Q _Q,B &[i7kA߰4ĶTI݁woq;Ɣ OpVffҡ3"L'-_@w FU+Q ~s$G} 0X!Mc􇁷!N< )<՚3OjPO1T}Ci *wLUI>O>UkYI]ŎB(”`s>Cb4D\@*D2|Rr`/)g_HǍ70  G I2eߋ?ր }同X`(u5Պk\qܢВ4qD*񻈟8c"+ X]! <=D"5{EuhĉaÈ{Dn&a/N B! i<:H4 syhׇI`{{>x}DiŹƈDF_x<XL 9|$B=2SH O)pgqm*o⸙"Z$ y;`lГ,dA'iؽm$aB C[';|M*o9(:넰OT>!G^d1?,W%VD" &25/Sڐ5A(*!aVZ {"9P$ 'p`V3*G=A{Et5I< erCG(rp;Uquz!"vINp$%_G *`?\04;P3["q3LS0A!MŨ3W|0Mo*ٗ>H¨&&$siK $R+w̯$6'2i}QKt]#" ґo&A]^{6C:x\T'4a8e23 ,f@%w%b`+Υaty) D<+ե#wY^, nI1+ k7[~HyĮM Ƞoxl8&0ӵii}4(܍2`Tx`n!0Cx`!Sϳc~[ގ$~? &w{I,HoKriE"Z~ q?/83 &mrY-1 Q#z"iHͩ[B8ns2 S`/57g.?+w*o ;o.HK0{I"09p z13?Tļ PU]U}?w"h<ɯxbdFVR $, MzM]bff(_-\|ǖOZj4OHC?aw1(tï0شpА&Q]˼A0 C⿇RowlOFniL}" qF ͑|&q%rk +p¤@0AO$͉}o%p( ]!hzJlj*-^bO^A$bSP24I{"SccKSE5ћ7#%m.0@ 0ۉM<)y>] W21 ֔^^A_+)sm:wnm)kn+F%raZ_#A ʝF-N) r3D߷[&. 1%슈6gpJ) L#RNHځaDWoߘc?Di$mjfdrFƬ'a6RF(2FZR_YpadL@@}L qQ?U"I J w8+ )8K!gYso[?Dj[EJgsL峧Oa@*;),O&p&;|C(:Sb1$-8nZwb4GuP!R euVJrx[OM՞;&ME&gssa-o.)A s5 _cY|a" BP lv>F,\ Oh)ڋPq'.cDq/[bX/6m)xs={,t:ӹ&|u!EX]nnk]Pw@wXwZwWSfp6mt7n%nݎu/n޹}t/w wKwkw7w{wc}Ccܳݗt}vr&6ܟtGO_zL#cGGG#czlCxQd°ACxvAH,^?x5EyH^ը9䝮obj qn1=i[dC_rnq4aiŒxmbFF<} ~x/*ԃ?q( T5+-57rsPJ®t%(䩎JB cҾh q>!'5i[4 } _1.!|pRl:;U(/ΰ Eyveֽ2*(,.5{M؈ϫ]˗ YY߽Ei#/keQM⑶r]?jcЦҵin 8C g %%Yvd%,R&Z~TAw) wĺO&C$ȏo?M*Ukߏ-13hVL:m̈Y?R8 N䠙\XvBVSzXU_ؤ8\k5>,GJH&?*n a+DR yuKCD. vɧ6-9#ײA JH$dL/R%7oNTqQu;#u4 {wUU$dd-Ob2ԉF&݌n#bT[5UE{Cgs E3IT3Y)nv7u`'L}iI,᮪8&_LMѭGL5Tzӆ-ڢ s6O L'Zhw o'gB1&$7zEc2 Wk~mmǦY~7녙g,Ќݍ׸ƪͅ$JN Fz̙k e&PC׌oV&Fp>/ЪyPSF%sI [4& =Gl.o]mg}ΠVM kk\CcZ^pb[^7؊XCGJ-ԐK V4ysI2'–tʨÃJx6v͓޸{dnGY$g댔x_ewzy<9%Pu&ͩ;<  _InD rGk¦؛Ո/% j.\B i„Bk܂؉$ֈ BFoeGx9labRtVÐ _ly=3$~J͠Lq\ⲂP+:A|փz/W.Q<GbKpcAKΊ=* "4NDFE`TsʌpgjC*.C09w)gX!V1A.Z">t7+ q1^̙$[f RsZ+zk)Ar$ia8 }U~bE\i0;5Лf_Ouн#';[\6:7+Y8͔B@P;\A Octg㇜~*A[Ξ h0 `Y UU{KKe')`XOJw`qw;q鶊Q  V=65I#o |'2PhëWTJrj;Kӝ$wt?%1tȗoڳWSRgN- $3ÝN7@"{119!_Kn?ϳWL}^h(%#BR*PM yVBջ+h9jz҄d0y<$d܉d%וv5O+4ީeVb+*DZ4{%jC7(utr)C)ry2E?Q'&N.#|2͎@d(JjG8b$͔}b7vZalf7À=yao]H ]C3nyƒTEEŞ"5d6.ƼlBuvH?sӻ[=6,m.ŸbdPNȼ?2@kN`${bN?!k4qkoU?:q2>$O@)U$’\q pzI!LM IAOY#S90l>;v2ōEP#0V[W<jm~_ Ok]rg .*&bi#SKW&sAѻV0.MnA7'BiSiq5׸}q \SA/۷%G5}:Xy h1žTd\x]Bk2dǏ8m!Av-c$/J= tcxmXr`IBH^? R^@sA<91D`Tl\rGI w= j#,I6Ͽ!\؋'! :X|.FfvyLSѺ\+"$٭dr ̧\Eͦ`fr8ȼG%S $|Cx޸=Сwl8J暃ջKK KDQ?,w߶A_e& ]5*Ed>^˶;;&e}{K.o窲.O{h>9QUU 1u 6;tAchOʣj-,%tעµ;d.m"86Y.R!(_\SW)a/LMH%`<3-7JJk^>\,k.4rͅ皋/Qe\O>y^@\sGyǩ}׾ūW.SeAG";n2 ԋoCS,=ڤ}ݿ 8B.Ѽ:jۓxqz8 k@A5ޔ^'B<>g{'aN~̸sPK!V,TiUlADE"HfB iA !,=})bT.QR'}3}~>3s{ιپ9$Ȏnc#}3A8평Y:S pyl?iٶMBQk";POV6-p8.fC!#swЄK'lI[Y %ZTfVɧI)yv̞)(n0YЎB;T!к.Gʼn[MM2]{iL A`0B@.E JUw!  hܟr^CΘ]"zu߬~4(yYl 7dz4 偋Cf#慇YB-Z 예pr_t5Q~~f`Ô($=qEqyPW'D*(DO/bVoũ0A8tQv}7'C4&@!K"Bmk~»#_ >/Gݽs{FykmF&EXq!a-T]MO= o\j| ir -\ .,TeovWimJYm!f< tFXם7{ڶ߼ dׅ5:nRokȜHmzl]~o-5s ^IxfK-#|ZmH,~^5 d6$YPc™(Pfmc8@/H0؟"6տ[3%+x&Fqn8`G͘G#7j*PUfqNŃG ~X8zIX)^Xx-8_*QVk0‰4C3$IJxZI16YMhX\,fb7a"q6=Xyə;~mQ?N/NMff]S#fi}+`N 50M;*-"d^ВVoR Ȟ;TZB:[T@:1xxoe[dtXЗ/qfOtrd0HQZ0^s1*=|:n.߼'y%`EXI,Q^Kl%QYW]r'B 􃍲5iBzjB+5#m26|q%3a x]8XTˍ΍șJa n `On=(FQ 6HddsY5h-ڜվ eFkK=Ұ;./pjB#PdBlff>nCJGr9pO_[E0| E1*-G+dNj=?Ɔ3ĎW1iԿ8/`鹁G4_cHLqy$j['٣JZ0?lIpE^}LhddLR5FȨy鎿noQ&z^hO>_o(U@u`(_vڱWXuϋX[-|[t8XC>D;#F㍸?7wMud"4 ֩ };˹;v,c1<^PC`;ys-Z*:q\0^tK[KQ~W1ɂ;֯hh"AsMfBrɤe\F؄cn3BDyD((3w' P! UBdS/eKUpN4xף|ӝzI/|>(+;uEJ$bk`ŖRvs 7Xk֑ Rd4+Ջ| _DBrr}YaGxqVz,?#LHמQgsB ,E]"؅/⩚t#0BgN+n̋N;F< 1zV&s[%a >|!xb%6UjW.P{=JJ{7e?;c$ ks^xKzWrAK5&Qk9c҂E1[#AJZy˷s5ZB1Ov+Pe7Xʺ: _DQW ?)%oTWPP!7iBghJOsu%ZOل:"Մȏ` ҉"D|+ǘ3*fVbmx(Q@Ri(:q\k'sYDrv= =$ZVM t|ޑw "𹮃`:D!PC1JqFP΃SjOGc*eN TQ3DVtSHAUX rUeQn̗ndtg;N\.돊.QL@ 72̊qc`.2eHz]ҷ/c`0?lb>gapN Fw]xNc__NV~'F> stream x]Mn b"2&YҍQqj; ߾ Ra=\֏+q0E\kg^ h*v(ۖ0q'7Q@_qhp8$>BŻ֥qvI%_[0R6`ݿ=uGaԪdoaRIe3\^+fE,%##\?kf3IzȜ&a4kY[VYR%ɼ'ؿ"t{j#푵-󞿽ƘϏ3G"́T{e endstream endobj 43 0 obj 326 endobj 44 0 obj << /Type /FontDescriptor /FontName /WGAUVT+SourceSansPro-Bold /FontFamily (Source Sans Pro) /Flags 4 /FontBBox [ -457 -316 2157 1008 ] /ItalicAngle 0 /Ascent 984 /Descent -273 /CapHeight 1008 /StemV 80 /StemH 80 /FontFile3 40 0 R >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WGAUVT+SourceSansPro-Bold /FirstChar 32 /LastChar 128 /FontDescriptor 44 0 R /Encoding /WinAnsiEncoding /Widths [ 0 340 0 0 0 0 0 0 0 0 0 0 300 0 300 0 528 528 528 528 528 528 0 528 528 0 0 0 0 0 0 0 0 0 0 0 0 0 524 638 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 527 0 0 0 518 0 0 0 0 0 0 0 857 0 555 0 0 398 443 383 0 0 0 0 0 0 0 0 0 0 0 528 ] /ToUnicode 42 0 R >> endobj 45 0 obj << /Length 46 0 R /Filter /FlateDecode /Subtype /CIDFontType0C >> stream xwl9n^ L5棚SL1/ x׬齙f{キ$T$$@ @B.C<齿דH>ܫs盙+|?$'ٓ-Ifkfw-mL ]cp;n'yW <[lT7Uu^n+`BKIPGRl- )#͑FZa6vs%lmFfIٙKz`M3lvÒbY GmMg5%f7llgu,1ml#>vu SƱYYY1foZL-=FH5zZ2-6H4[ȿxhx O/B   #EP(0D)FE9<"P** "Q5Ph qxA]C}4@C4Bc4AS4Cs@KBkA[C{t@G$: "=I胾3#)`F"itXaCŽL80㑅 DLdLTLtLl\|,B`c br+NZzlFlflVlvNn^~AaQqIiYy\E\e\ x/*^5W^x;x}|q7q c'O>]|/=7xOS~/pgyoxY}G`X!,¢,Pg $K4˰,1 4XXUX(F3cmƳ [[ ۲۳;2ؙ]ؕLb/fe? 09L#8L(J38vfq,N`6'r's rsgrgsrs2K˘\\tr rs7r7s rswrwsrOO // _|W2:η6|~[6?~9 ~ɯ5>>||=ȟ3n>c>s.|+?+@ ˤ QU1J(L%UJUFeUN*UʪHUW T-E)Z1Uj+^uTWT_ PXMT\-RZmV^Q ꢮJT7uWTzhihɬJV,JUFi(]Vٔ+Sxei5Q4YS4U4]34S4[s4W4_ P9ZZZ\- *SkV^QY[U۴];S[{W_tPtXGtTt\'tRtZgtVt^ .Pbž]9cc'>Kw=9zر[':QXsa,x皙5,+/$?$俀g:yLPh4{ss?3艝v^vzltg+ a[5昂]M&WdpOOGtYWo?K endstream endobj 46 0 obj 1623 endobj 47 0 obj << /Length 48 0 R /Filter /FlateDecode >> stream x]Mj0 >`g!P,C0,r*0 l̳)܀B$ϸˆS$\GWnYim)8j[П".78=49p k7 u1s6AW{c΂9p}s%[liB )$O?1݈kG(2Kd )T=BTp endstream endobj 48 0 obj 223 endobj 49 0 obj << /Type /FontDescriptor /FontName /SPALKP+SourceSansPro-Bold /FontFamily (Source Sans Pro) /Flags 4 /FontBBox [ -457 -316 2157 1008 ] /ItalicAngle 0 /Ascent 984 /Descent -273 /CapHeight 1008 /StemV 80 /StemH 80 /FontFile3 45 0 R >> endobj 50 0 obj << /Type /Font /Subtype /CIDFontType0 /BaseFont /SPALKP+SourceSansPro-Bold /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 49 0 R /W [0 [ 690 200 ]] >> endobj 10 0 obj << /Type /Font /Subtype /Type0 /BaseFont /SPALKP+SourceSansPro-Bold /Encoding /Identity-H /DescendantFonts [ 50 0 R] /ToUnicode 47 0 R >> endobj 51 0 obj << /Length 52 0 R /Filter /FlateDecode /Length1 12272 >> stream xzy[y߽o `{6f}0`̐CDRBmٕ:*N妉oȒ6v]u||Ҵur׵[Z3{fҜ?;{wB!CF|Sy!cg9 }*gch!+kɉG`uS8s~;#R}3С-07v̹G.8}C sb-\xԅcO|ah;Q/K4]Xa?3az]Fr<7r<{h(FP "buqk4yף #FuD ?NR=VA5tjv`hg8,Q6 ;vP4b *ڗez.3ӛ硋td!a8Fa\.y?՘0{N,;5nߢ?Ey4\0csl4x1]Eb8y(77cr <Ţh"zNneR^B9|[Ql>חr?vFZ+MF;ӔmR<:?>,>7udt"_g.m6yKHWF!:}zV괘a<5WU;AQMm: y-O'hXa xj޼hs^y7U X XO;EbLE{_jkxҎb7Qdܾ}Of1[.m0Ͷ`ޔ]k#Y6'#:/֞wf&Sɷ+Uu~pV}zX GՋF5KCj0ƧT4ǃ0,V [ꂜSX< DX(Tc*nDe.'q\dESƶɁ/kÊm^ݫ5{4V}YaE}Nt+N'~ z ǾvxowuEOӅ2HiDc,d8լ4S0ÀG~Yjaak}Ij!6PQ3MoQ?Pf1`zl6g'*tH M$bCCN|;_[t-lH )l?%?9{m+۷ehVZzDiy#4ܬl@T _<  1Ϭhń:۹ a#׮6a[Z!4? wFQz?T5R#ʺCx{̄]X%#@pqlkJC>):&4HGyzFF{e =bN'e#}_k߾(:D'^oEǢ}Շ>X~l׵]fACrrEPo(ρN0V~y"0FֽD9#Ȍomͯ?2xz|pr1dR`QfhaWˏOʫX?+J?DC@TZCaDǸB&Ff6`װu(a:aͲk-kY a Wkkwpc .W,FCd"Ll\+HDwo`|>1ZLnyo[i:5TOQJeqG:iZ6{eBճNunsؓuV2$hh ;Pۿo!F !R6LcP9zh J<e4^?CVX?ZAh<2AtIĒq-T"3ᛍ؂qRw#E@F&;'Od Gy}:tᘳM49i.kGQ:/?t\t<슔g>=04鈿s=:Da0_nͻo?mNz< xM#~y(T1;rCZ>̜;ct,Zbœ'8VI0xp)%I= Yz_:(P]!aOulKFǫ)v0Fa wAH`05p훈F](`O Bmn!.;u/Iџ~G.qS2ңNwӐpPQi^ Y!C'{6 k.S- K;#lrfe[fͥ`X=LcƻsG_)x抒,{ f;aFQrXT@ u|ɨ7v֎x p71koY۷h^B#h0چ9" G0%69ēXnPey^)P2#b8bdMvZ"9AzY,>qKǮvࡳCc^:SɸW`ء#Ns=\=mD78prO釆<44vكpjzkVGSXKdn} ]pBGYP"vr"GV*R`s&̈QoȞ=v鿺utt›X ٞX;9${f.f!1 Ϡ>rȻ 6]*@nF0ؔSPˤoc^vd{ş,;'x\. /܀(4vt63}@0z`t| tħ}3y% Q^r)f!o,]ZG⒩#GBTCp*Bh3 bh')[wNhTL8EE-u|l5=-nǮOzG'N_``J& L͖ X OwS{ /dq_柾8ћ?$P'^b[I9@KD6 prVG3 #*&AE XkO!NQTnިXuDhrirq 9щHLQ) {Wdhjݚ?y}kgk~xgivEzqwj?_6딭/ck˿q|`,Uݷ~9W_LŧE E == I1xR hW Ϊ4+Q1 V2n?- muv{-];6cuѦl}aos`˾ČRWo?G;]#iqkF+0`!Vy\ 'cTaT`=y{wjiQ H]IGyNM[JʷIrcǣF`+>0zqL@Uo vwŒV7~|AW{6O- 'zBEEoDzxoL*RK咉tp1# 0-% bp9m]7!, ~CFo^Q{.1kֺwӑ@t$`ob,.B}j?s Jp$U9Rm+sXbdq}$g<O?QOGgz ;U Yz+ضxa;% ?&uR{by$ z?EkA`$Ct( tQ"޼'jD~A#HS;H/y7Lt)OG#M[>T +3OD#"M/>596w|'5NSH>l+O_MV ci5 il {y8t}Vւ>_~Ū`ƙ[5h`:a;\-hX$Ƒk y.) ͖tV`3Pm٠/{[@Ԙ ]BbV❱ edȝ ܎b lM)9¥yLbXAY-8pqѐrY!GwjTs^!oxvaj46:wk\m}Kl/Ù{A<5X{>OQ8&d~PB4"xCG1g6>2?A} !*t 6-}/?@k`!BZв(j,R*Yn+Մ5And4{ɜe)rJI+NOmJ]DҡʦZq(%Iȁk7_2v-Re-^ k-ӚG'S IO$OA^cÄP[DWIF7+rHhQ*l3rvloPlX,Ma#0i$$=!Лu$SK'OIgɐGd+mr6yK HZLJb2WBZIҮAgk:5m > { Ld}C[ 'B y yA>|3g#N< y%aX. ^^ ZI-Dc8o$w%.)f"!6mi& dG"efzœ>e}Sw GSĨؿ"k}5Ү9#BZ"T;s8ɤ/~v $16jDa4/%O]O0|&d-5\ +7<7(Q--*3ɚ̕nI{jybJBuaT]#)9uql,&Iҕzwy&Wñw +MD&hnԝw# 7u!@/mB5d2>)N+THQ5-0 )}5L!sh1 kv4W En#M8)J%Wav=˞=Ż}%IL '$y(yF| '+4-wÌ"2Ϩ: *:qP' ?)m4#]zH!U`)HɦV5 4i`TP` D-- ݣvzN1OXu PZC@.J7b L , )ONwwNINBi NB"LкJGy &V}\i)3.$qE% NI$ O$axxG[]UZ 3*I7Tf6ޯ*I>c)-Y$RIa`xN% u$ n+s EiZLʚS2^,)Rb_7O!n7bw?b}8<ֵ5߷`gSw1mԁzw/,~/+9Ŀs_o?'zϢD^K5)S(Miψ/P u.h$Ro2PPSm3qo'8w࿪j^ֆu辨ɀ e6f: &bAnTCCߗM^!8@s8@\D| 4, tA7hD3FGU:ŷ- -dzŷQ!=_ 71a?\!q~KfaՃ_W2\u)޾&3虸ɞ?8MM endstream endobj 52 0 obj 7357 endobj 53 0 obj << /Length 54 0 R /Filter /FlateDecode >> stream x]Rn0 +rl+XA+EH¡ 1[j+$3Nvn[?m2{`]uF rűnmvPsE#<\ˇ' ([t'_玷k?0d.F:1K^dć1>H#[5b/ L7Ҍc#gʼn%h(L9 51S cFƀX3)S".1S c@~0kkj״1 .9OX[˞ ؏"?(ʣ.؃"%{(C͵TgS-S͵4ժ8g?zd7e|5FmzTi4݅%*} endstream endobj 54 0 obj 363 endobj 55 0 obj << /Type /FontDescriptor /FontName /ZRHPJE+Pacifico-Regular /FontFamily (Pacifico) /Flags 32 /FontBBox [ -593 -457 1660 1478 ] /ItalicAngle 0 /Ascent 1303 /Descent -453 /CapHeight 1478 /StemV 80 /StemH 80 /FontFile2 51 0 R >> endobj 11 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ZRHPJE+Pacifico-Regular /FirstChar 32 /LastChar 124 /FontDescriptor 55 0 R /Encoding /WinAnsiEncoding /Widths [ 265 0 0 0 0 0 0 0 0 0 0 700 0 0 257 0 0 0 560 520 577 0 0 0 0 541 0 0 0 0 0 0 1014 0 0 0 0 686 0 0 0 0 0 937 0 0 0 0 0 0 0 693 0 0 0 1217 0 0 0 0 0 0 0 0 0 470 0 0 515 393 371 0 0 246 0 525 0 0 496 451 481 0 455 427 413 462 449 0 0 479 412 0 326 ] /ToUnicode 53 0 R >> endobj 56 0 obj << /Length 57 0 R /Filter /FlateDecode /Length1 5328 >> stream xX[l%I$%,R+R2im%%;JS2%NlGy;o5SAS(6?-QȬN P Eڟ()QEa4깻,'v Ι;gf=J3ƎRSc5Mxv&áKQIm >>6:z@!iJ(511>jCy/>[ۛ<=g16F|?X=mJ q&]Rv יc|,2/2  L^%t,vk,73y\ζaAgG2 &|WZBĊ%$ H!JW=iR};m#9v:Ba5:4dzNޓNi]@^Y,mp0i:yFTv|3Ώ()s)Ξ$Ԑ1 #lO"<$kfGE4ؑ7_ z$e2^5~o#xLp@q3j#;#^_`jxFl:v#hE,%b@vˎ dHrҺ^EV(͊e7;=bqZ)E\43BV;oܻ}ǺZNCw{  x%T55M3=O(Mu:iڕ+ln$Zfmk>_kK=/Jsh9#@Q_vF."6~b\א5,;+߶yU!msfo=ʫ˘`*RWoa^((.WVɒbwj5m) VߨRBkQ-._!3DV*9S 93&B2N\PE`Txa 2"%/s*+Va.Y:t!'E(~"l BD]V{E߱1یB B)*XyȑzI"LYrY5m6<S鮊 1+TQ[,U`QiKhD%R)%Z`%E^㊓-ղrAY]F`K* 2Q*y[1KD EZUx.XE-Ե*%E(!BɦHV[d,I> r[+ %E _7% 蠪ȐPov,DQA ;v+hl)ѡϟ(|yPhRS_((읖=8Y2;: 9ў#ʙ~ K0r!NJ%C:2miMi N2Yʈdz}nB:2;w+[!L*(-צPAX*ݜNH t't #P2%tS ݡ2=6Nj{uSvnM76kD55-tlRB6|Lmo >h:X߲c@E|*@|jAGm QG|!>j GmZWgݭcۏW +8i*ތ.v'n=8sMҪU4῔G6}JJOIN*p;RgLW-DZ)|qOBv~z<hSQTJL鮙OTTx H Դ:Gw=\isLJxţiP %]9p,rHӚԱ45m'[\ թF.;Ξr\/no͚Vb|VڳO 'vpϩ5<YX.Xh#N bEr"FNn\B!4PauZh3i֐ZmJY<%!c+-؉RZoU ;%N⍪-JmtUM!7S&gEQ*FpUgi3Ã8]p0t/eu171uS*(X!S}mxS١Sj8>i<{YӜ?)&f4\U%Zn9 x_!QK#- C}Zޙ8>xSL^4GIVgnuLGo7(p ,8qNI8_]henmwxx*,tYО'%ړ@8C`8VCW3_"t_Y~:oE~h<5' $ˡ 6$#78bUz֌ 6ېO`I)iplճڐ6$0AxΆDxކDx[ֻh,6$mHK dC"mHW( $r.)+B,^h>So?}SLuj>M*O9 $sv}6=7?e#5埰ktߔ| =~9CU+ 7_.G}̕{} tqkm ^%uZܻus3kş{e?dy;9/-ֹTr7 /~^gܑT;OkHJtWEx/e9, endstream endobj 57 0 obj 3058 endobj 58 0 obj << /Length 59 0 R /Filter /FlateDecode >> stream x]n <ݡ"I!U%}hɐ@9GYg/~{g#wj:Mˆun@[o5xqiE7HMp5!.Bń&{U> endobj 61 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /PMLOMO+Pacifico-Regular /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 60 0 R /W [0 [ 265 393 394 495 411 484 ]] >> endobj 13 0 obj << /Type /Font /Subtype /Type0 /BaseFont /PMLOMO+Pacifico-Regular /Encoding /Identity-H /DescendantFonts [ 61 0 R] /ToUnicode 58 0 R >> endobj 62 0 obj << /Length 63 0 R /Filter /FlateDecode /Length1 3616 >> stream xV}p{'Y6DQȝ8dL$G`P_,!W ՞L0 v+4 9 L:%@2|t$N'$-N64dM$4;w{{}< @GVK};Ͼ2F@z o*LP2bkĘ[NI'p$"U1 Y~z#Fvc8[A8RsN`P`3'-U> L8q2l!ӛ>XǴCxGL.Yak#Zs'_ZٻyVr5-͋o&בZHn񦡻[:'mX 7"oq#wok{z5|StC,[~Ykz(|5;p7o=vfZ !L _x ^ xvi/|Ss! CpZѝ4q;e"0a X]pan#~od#RTC؅u} ?}g$mk"^ b^؞s?+GP9Cxq dvqYIhh{|#^UBuw׬^kqyg-8:춺5*IM!IM R8t)@ IEԹ>TLn\O=KUObh$7C'=1 !)!K|! e>*n7F3)I ULJ2|nAh4#!plX{T?4%rMZ'  JZRƦĜoZߟC_[/(XWt RW>@}RH^xugCj%Q sT/ULI=/f$.Z}D CTè|'\Tݟd-/V76ib:^mv$*>3&Ӂ9ueCfcZI5 ߛ\Y+EqfV,WÓfKө/)})zζBӺ]nI_' _gѿML F]Bt}\z\r 0ER & {K[߭Q9*[LjTh[>FB~i)ۺ4#F)$_ EEOJS`\RL;-řmL sb]5(?HOڠTN'$m 3bs#R.حEHGk-Od`t&rJ4Xr걊hG@TQSNJnTF\Pi2*1}S0\ab*.w]jM>by`+&ރo81 K'yQXz,a似Wski7+ K&UkKU5|buT&yVre~v%5Oq,fV:uK yԵ"$×Y{N"{c9ߊ[L'rЦ[aC)i#*VuNV<V0[\ W01S 5%gsoEgDZO&XC=f/B#VKFjgxJx-X4vvEl2>vG[2Qy&Ydʏ~gnuz69u`q2M ><8a?~wɯ z F2qR ?!‡jWR]l–Xa`7 zOl=^xwF\)LuFu bw񋄏[[ɿr?#LF_mH4?|qZ.4TTSSg'$o$zLۙ>KRiz 47}iwE2}Is|l6^7=s|=N׎cG -WqCdd,;#cƸ[翣o?Jʹ \C]-H/8>^kNm M=a74/1'f>>sX1ɱխ4(PE!PErY7/;-no(NͶŶfN۰mvVY+a zb&yr0F"~l-M쥞.˱ZBg#@mhrI"BQE$W^HIQ7aad3$͠2TF73J2QȌ"!(g2 ;-#"v%L3qb F+ endstream endobj 63 0 obj 2438 endobj 64 0 obj << /Length 65 0 R /Filter /FlateDecode >> stream x]j0 ~ CqXO!0KƲ=c˙aS6HAs=fTU 6]dqG4?D3pxvq9kKJ?8!e8^{5f&]SDy= \B]Fs2Ј9KxV!N ~.JT|O>BمYM [@XVi9qpr endstream endobj 65 0 obj 226 endobj 66 0 obj << /Type /FontDescriptor /FontName /ITGVDT+LiberationSans /FontFamily (Liberation Sans) /Flags 4 /FontBBox [ -203 -303 1050 910 ] /ItalicAngle 0 /Ascent 905 /Descent -211 /CapHeight 910 /StemV 80 /StemH 80 /FontFile2 62 0 R >> endobj 67 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /ITGVDT+LiberationSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 66 0 R /W [0 [ 365 593 ]] >> endobj 12 0 obj << /Type /Font /Subtype /Type0 /BaseFont /ITGVDT+LiberationSans /Encoding /Identity-H /DescendantFonts [ 67 0 R] /ToUnicode 64 0 R >> endobj 68 0 obj << /Length 69 0 R /Filter /FlateDecode /Subtype /Type1C >> stream xzX`,à8;Xbc(Dzo{_l.U."{FSMg|gͽ{=ϥeL&@d%M2EOE?މŌxxx8@%Θ;a]'P5V2Q2M2WT$IH:$=>ɰdLB1_cFFu4j`)NP:@߀JF͢L( j'@RY=1=wM&h*5hjjjZVWkq\m m]mF{vv1CWj?~ACZ6}ct]LMt'}!uS.pv A/Cau:Bg·:sux׹.ԝ|kttfVѽToRXQ$HSiңVi_z_Jg7Koz6K;wB^^%o~i7ߨE[O?X?^Au?N g0`AAAAAA9^! dL&ddVLe2,RW_vT#˓*enٰG /eF(Bf)cX0$2t3%L%S˴3km yƨ ņ!c8P0 2\opanÃ' Ol-h}np6T%ܵ:A"o#:csz*N?{Bh? )Md\_3i؏@FAzIWO-U-gZM !XW"@[O2<`n!t:Xm}gXR%xKA#\5jb SݹH {+G@GUgBKK#Ks)JT!}+4_~@2LJ?!Wշ#B0怋s?w2P7h}ȐކK(90yƸ|m>"X{+Vᠸ6*ףiH ~Z T Kٯj$^x HH]GpDysՊe3n^u^TM ߵfX35q_ke.l)e7Z5ߺ>V/wZ|B(sySXW]!uW^'T׃~܌Ys9-nR?%?g%hx)S>TS(ueYe\}QW|! 9KyU#aqM!'SN):5[._uG c[d֡fa;pMQBO#hv7 fVeW# jeoH6"eHaaOQW^jcW*BV<^hvr*u`Ju~kMɃnݟeR/rt|N`o/E7(=[_5yݰ/txg4N\ȡ^z+*‘%1zJǹւh=yU2f<}4WQkS}-WDI Ar4ai3*F Ч xp{ Z mFj]K .UvS'v#gsӊR[AFbzRf-YTq_O,q-dGl4Ԡ=s̭=>ڵa x0G~,]&[t+fչ%F kp/ℾ4Б#Hj)Bd%E<Ǜ,ƿcW t}5SJV 0֗}d,7cU;Hhۨl>`cb>-aqw` ӿ\[Y(wrVHCbp`d=<㴋gjЍWX>07\ Q6 ,V4T P@’Tu uKN [Y:m -RHxL0k~k;x -)(.)ω@ EP?pE4a [BVQnph" R05ԝ:].D  nkI9V\*0b3aNu7q-wy'LNKKU,=HI= 4^hrse 0_K LY6j2 "g}U5P7?؛-8CHQ&)j\߃B-l{֣74{}*b;wʝ΅*Q;)r/Mc1Og x*1wtʺ "A#Lai[xu7%UD n$O,Dх˲M&Ib\yzoi˼#f6qFϮ3?E!چrlXb l5FRa{,pTP!0;3Ryъ-<.,dZ @KO =!^}@9y>` gvgow+696s.棓Bh&F&?|>Dpr97GÁn5͍; ^2?фC iLzNF i8 Cx6/H_bCs?p=O;bmu퇄)`]j,㡬'uIG]QdzWe]#_ɿ5dukTw7pWܭښ0eKy[[w`~o8)(`d->BP{D#^%Kk[3)9B)ngxkUWҫsNW@(SN#ZVR W$s+#w3|nFF=BRZ|@`GC`E*2ע;u;dq"iwJ07pr;ۈ>Z iD)8df|+T4ǘV#8i)|׭ں1M8\UV krf?ܥV41OF~;Yh~Vs9v[<ȪLicIIRd7.$ԅ <]LB;ջ(v?jvQQEI&Z_AUb5qxWH!&)dhQ t…?>TwƊ]ܽ*8#itd 9LSqypTU8BGԹva$ӡTE8kb ɠ-+=ߚӆ1x LB8 ?RD:,P|!.U 刘]娪e 28\`}8%@?!I^ެPxzЗV8X+6/ҰC^哗e$/F;dO~JIհiWr6;bcfW+4ke*g)dRJa% ) P/}Vv<%V)K>-l|+RӃHKe sm}KC蹼JbUD 2ߑTx3x0WhiA̋wHxi+/x3䕄J'@yA3^̳x*dɖ='#Nj_=1k+èְ7g:p,KG,]iI'^)8[X S&|9j ɒ3](9%i|1CcFn"'/4^lA&ȣ)_*:K]RQ47iZkzjjfkh^ռ7M5_kZvZ>Z!Z{ ~UC;P;Avo A'5PNp Ctlq щIѹLw"]J]kO=ݗ]R tDj#͔6KJH_Xo^^^^E7z}ͅ]=C#goѿPGd9K 0Xo`fj`mAA[ 2zlLf- )eYlDv[OFe ɌάdV353qIcҙM>yihhlÕ m C c G OV7l32e++eX~e+-%zldY)-gaa_oYl4HHjdh4Ha4h2#S#s#;#O@0hFe6*4*327j643l4btC#<Lԛ8y"?qę(Z^+.kA{'xs/brt:YW/.cOKltw TLEmOg@ xB d&0Ɵ?bqPߢr|IB ҉u~#|x_Օ!A7q{RrxjB#7*;WJwQ_4›@Dg=e!m- t=+5~֍+ SHw˖:ؗ{v{[{oW+@Ɔ-huE_# j|ͶKm.`E]9{n=PP9ڄ;NNRiD%Lq1>`~T)nRsn--|7Vg0/^D`'݃<㰋ghF8km Y{BFk:iw X%*i냁vU-k\] kk[B*΃^;Kr X,1#q-;8ZA?\wl+hB;ܳyY\SYν(p䥦3) Hp4pbcצTCo FtfJb}C*[Nrr BܗL2ZJ`9s˙deO>{oOl: ^P/Yo ;գE^unB<+rySoTsFN6J9S%/<]pbo|i?yKNź5&!AGXIp|f5`~öy[;6 3mFȍ|=A٪E~񺌗a- % į Yg@z+*/ϵ6JqKւĐJ ʊrydf">'0UgנB4m+&Ԥ;C o)4ez PtXPxh n$SV=(3Z3/D<]r>KIHD'h:O:OP|:vWbCaC!6k7AAQ°]'eƒ|%{s`]t:7t}p#A|ɎkHrF@,uw%A|Vo 'pc&bKD4%X&r.o݋'bczUQ6: LMZ ۷q(ų?_$!!-Nw+wy8{98Սݗ{ʷ5i dԲ eUUAA~G{˃h {s=AoŽ53E;m40S jZnCEPw   $JVd5ЖgjvFȁDwh>vk[Kb>;ZF^Nrs rR!8ZzX=+eiEp!4g%j%u䟯)60ΫR+LKN;s䑃38B}@[n(ھt-K#Y3ΑI8m 5t~Ղa42;.(o8XW>}m-+*)+N=)ќc\CYO яQ^~[^g~C9I)B{-*yXHwsWBRwiQd0F!NYS$ՃĤyhO&NEY9(h5_> hC~>[uʌ$Z&lH1I٬OCSh&; E `E!1)ʉd-5, ;7g&z!Y6Ӌha?T ji/)QTON!spTl5M 1>\7p\2({Ӓ;W\@p``l SstbeE%3m"1,ҽ1%A!4-xWRVN" Ae,v_-U0.!q$L^0X-)ے";R]#7ߡ B0:œ d7 _UGBL=]щ~EϼFkhˇHkge}cߘL5{߱8o *jmf;rc1s_XX4^}I%M*gTK$wۃJ#ۗAy_"áHN[ yFU,VZ_P>~GhF.e tH@KmZp-iFf]CiiIջtҮEWPZ3*F_ߓ/ s4˟(Å K}B@acqVwyUhjv O$hj"PP}.@ CSܼEteE!/}z_##|:weHOTFF&Ղ }mSE8^Zu\9N'y|}.$'h,Q `=wPΉ{\$Gޤ :9QU >J(ÂH2_]vg|Lv g#-O =_١!+nU"Mj|'@QM"ag޺wn& xb{c+#ɒsڑ 4|rDNS:'agϢKn 0RS)WYİn5 B!0Bgzv"G^KL…dPn{Q~QSqf#Q6.]B7l{I}wrޝAg` eJ(7XYi#KSc- ٽ#E *k۹ܔB)]ppdǑB}_7^y' %ǒ SR!DKI9< %JY鹒i)[N!֗hzXH%_o-n $!zחrA)Hxbw  eC|kuЇĩԿZ4&y l$ GEEnH|xEtm.޹C< tʹ)Kf=} (ntӹkR~x,ȥB[E<<4Ь.Zr]ȅ?{Z5>?D'}4zJɵ7]K_) NAyuS,rXܸ􃇎("I(s4 ~8+Ub쭪`ﷴT5wZu*KfB"Dc TqWY&ngyG`W/Pp<b<<,9 pwZ"2!Bf }C&H6P-hnV?${QhF34m8-:rW;.6!=cI%2Mf#2KeaJͦ&yO8)*@C!jՖOW O|uI~HtJp).1c&/'r xX4iZP]TFAp1ZDr^P9?J2__9$ꩊQMo)sHϜT:4iɣO_M_8EKqAUx2( u˺Ab])S޺ ڠd!zyHOXAU4x @Cէ49/uzj`$F,?]PS8L%{n ӒR!5sa- .5/5R&hLM=I)8~촐Rw+% Ȑ9dh)prb/hʋ!Jeˑx]ޝJ+ZlqRm,4:Ux([[ޅFܰpb<6҄p4O~$3~.fDrfξ>L+ m7(T>!]v Bƒhs=3M_4d)m_fac.^by;Ð &m7(H"hK߉PrŚ=LV *aH4-o ؓ1a1ytgOtq$l75V$H҂uBpha=2 <ވ&wg(E9穫gB?ZV.7݄r7LHJOQYQH6S0F`0?; N<-(&:.2P(xCt)Ted խ- ZS#Õ{j2(Smk\NcT% T*{)#gbn4 X(8>`=hv RۜKs(i1Vޥe?dPGuPY$Qq}yWhJe0@!vܹ2XyYDa``DDP`!?(=BMϩyװKdy$4BmEĭ(j}$oW\#YEN>E]³[xoACؙ+(ve# @ P'hT͓ ̬={T!XwYlCDʡ.L$1Re@K+s!Rj$wZ9rO]s;o+5Rw>mQ1dlF ͂C&Cb_$A* HoZF endstream endobj 69 0 obj 11788 endobj 70 0 obj << /Length 71 0 R /Filter /FlateDecode >> stream x]n wu8D Qd50)R!o_3>dCuk"T#hcUmA"L8].³F\:>ưI ToAa0vu,G.h#pPu/¿㠨n~$۟sMҒt W/$agd=tZ WyLZ~&)//0&>>7<3=֙)))ohحbzr M?'W^' endstream endobj 71 0 obj 270 endobj 72 0 obj << /Type /FontDescriptor /FontName /GDKIPY+SourceSansPro-It /FontFamily (Source Sans Pro) /Flags 4 /FontBBox [ -323 -291 2077 969 ] /ItalicAngle 0 /Ascent 984 /Descent -273 /CapHeight 969 /StemV 80 /StemH 80 /FontFile3 68 0 R >> endobj 22 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GDKIPY+SourceSansPro-It /FirstChar 32 /LastChar 122 /FontDescriptor 72 0 R /Encoding /WinAnsiEncoding /Widths [ 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 510 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 536 0 0 481 0 531 523 0 0 0 0 0 525 515 0 0 0 0 0 528 0 0 0 0 410 ] /ToUnicode 70 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 2 0 R 14 0 R 18 0 R ] /Count 3 >> endobj 73 0 obj << /Type /Outlines /First 23 0 R /Last 23 0 R /Count -1 >> endobj 23 0 obj << /Title (Schlussrechnung 7-2019) /Parent 73 0 R /F 0 /Dest [2 0 R /XYZ 68 591 0] >> endobj 74 0 obj << /Names [ (information) [2 0 R /XYZ 380 731 0] (items) [2 0 R /XYZ 68 451 0] (letterheader) [2 0 R /XYZ 68 751 0] (to) [2 0 R /XYZ 68 730 0] (total) [18 0 R /XYZ 380 529 0] ] >> endobj 75 0 obj << /Dests 74 0 R >> endobj 76 0 obj << /Producer (cairo 1.16.0 (https://cairographics.org)) /Title (Invoice) /Author (Klaas Freitag) /Subject (Kraft Invoice document) /Keywords () /CreationDate (D:20200315114801+01'00) >> endobj 77 0 obj << /Type /Catalog /Pages 1 0 R /Outlines 73 0 R /Names 75 0 R >> endobj xref 0 78 0000000000 65535 f 0000092370 00000 n 0000003060 00000 n 0000002814 00000 n 0000000015 00000 n 0000002791 00000 n 0000030656 00000 n 0000034341 00000 n 0000036834 00000 n 0000059686 00000 n 0000062744 00000 n 0000071131 00000 n 0000079223 00000 n 0000075655 00000 n 0000005009 00000 n 0000004820 00000 n 0000003278 00000 n 0000004796 00000 n 0000007585 00000 n 0000007356 00000 n 0000005230 00000 n 0000007332 00000 n 0000091950 00000 n 0000092533 00000 n 0000007806 00000 n 0000029699 00000 n 0000029724 00000 n 0000030350 00000 n 0000030373 00000 n 0000031460 00000 n 0000033445 00000 n 0000033469 00000 n 0000033785 00000 n 0000033808 00000 n 0000034091 00000 n 0000034512 00000 n 0000036141 00000 n 0000036165 00000 n 0000036544 00000 n 0000036567 00000 n 0000037255 00000 n 0000058951 00000 n 0000058976 00000 n 0000059381 00000 n 0000059404 00000 n 0000060141 00000 n 0000061870 00000 n 0000061894 00000 n 0000062196 00000 n 0000062219 00000 n 0000062501 00000 n 0000062913 00000 n 0000070367 00000 n 0000070391 00000 n 0000070833 00000 n 0000070856 00000 n 0000071598 00000 n 0000074752 00000 n 0000074776 00000 n 0000075101 00000 n 0000075124 00000 n 0000075398 00000 n 0000075822 00000 n 0000078356 00000 n 0000078380 00000 n 0000078685 00000 n 0000078708 00000 n 0000078984 00000 n 0000079388 00000 n 0000091275 00000 n 0000091300 00000 n 0000091649 00000 n 0000091672 00000 n 0000092449 00000 n 0000092644 00000 n 0000092857 00000 n 0000092893 00000 n 0000093110 00000 n trailer << /Size 78 /Root 77 0 R /Info 76 0 R >> startxref 93200 %%EOF kraft-1.2.2/reports/xrechnung.xrtmpl000066400000000000000000000144001467704360200176020ustar00rootroot00000000000000 urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0 urn:fdc:peppol.eu:2017:poacc:billing:01:1.0 {{ doc.ident }} {{ doc.dateStrISO }} 380 #ADU#Es gelten unsere Allgem. Geschäftsbedingungen, die Sie unter […] finden. EUR {{ doc.buyerReference }} {{ doc.projectLabel|default:"not set" }} seller@email.de [Seller trading name] [Seller address line 1] [Seller city] 12345 DE DE 123456789 VAT [Seller name] [HRA-Eintrag] 123/456/7890, HRA-Eintrag in […] nicht vorhanden +49 1234-5678 seller@email.de {% if customer.EMAIL %} {{ customer.EMAIL }} {% endif %} {{ customer.NAME|default:"not set" }} {{ customer.STREET|default:"not set" }} {{ customer.LOCALITY|default:"not set" }} {{ customer.POSTCODE|default:"not set" }} DE {{ customer.ORGANISATION|default:"not set" }} {{ customer.NAME|default:"not set" }} {% if costumer.EMAIL %} {{ customer.EMAIL }} {% endif %} {% if customer.PHONE %} {{ customer.PHONE }} {% endif %} 58 DE75512108001245126199 Zahlbar sofort ohne Abzug. {{ doc.taxSumNum }} {{ doc.nettoSumNum }} {{ doc.taxSumNum }} S {{ doc.fullTaxPercentNum }} VAT {{ doc.nettoSumNum }} {{ doc.nettoSumNum }} {{ doc.bruttoSumNum }} {{ doc.bruttoSumNum }} {% for item in doc.items %} {{ item.itemNumber }} {{ item.amountNum }} {{ item.nettoPriceNum }} {{ item.htmlText }} {{ item.htmlText }} {{ item.itemNumber }} S {{ doc.fullTaxPercentNum }} VAT {{ item.unitPriceNum }} {% endfor %} kraft-1.2.2/src/000077500000000000000000000000001467704360200134235ustar00rootroot00000000000000kraft-1.2.2/src/3rdparty/000077500000000000000000000000001467704360200151735ustar00rootroot00000000000000kraft-1.2.2/src/3rdparty/qrcodegen.cpp000066400000000000000000000652721467704360200176620ustar00rootroot00000000000000/* * QR Code generator library (C++) * * Copyright (c) Project Nayuki. (MIT License) * https://www.nayuki.io/page/qr-code-generator-library * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * - The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - The Software is provided "as is", without warranty of any kind, express or * implied, including but not limited to the warranties of merchantability, * fitness for a particular purpose and noninfringement. In no event shall the * authors or copyright holders be liable for any claim, damages or other * liability, whether in an action of contract, tort or otherwise, arising from, * out of or in connection with the Software or the use or other dealings in the * Software. */ #include #include #include #include #include #include #include #include #include "qrcodegen.hpp" using std::int8_t; using std::uint8_t; using std::size_t; using std::vector; namespace qrcodegen { /*---- Class QrSegment ----*/ QrSegment::Mode::Mode(int mode, int cc0, int cc1, int cc2) : modeBits(mode) { numBitsCharCount[0] = cc0; numBitsCharCount[1] = cc1; numBitsCharCount[2] = cc2; } int QrSegment::Mode::getModeBits() const { return modeBits; } int QrSegment::Mode::numCharCountBits(int ver) const { return numBitsCharCount[(ver + 7) / 17]; } const QrSegment::Mode QrSegment::Mode::NUMERIC (0x1, 10, 12, 14); const QrSegment::Mode QrSegment::Mode::ALPHANUMERIC(0x2, 9, 11, 13); const QrSegment::Mode QrSegment::Mode::BYTE (0x4, 8, 16, 16); const QrSegment::Mode QrSegment::Mode::KANJI (0x8, 8, 10, 12); const QrSegment::Mode QrSegment::Mode::ECI (0x7, 0, 0, 0); QrSegment QrSegment::makeBytes(const vector &data) { if (data.size() > static_cast(INT_MAX)) throw std::length_error("Data too long"); BitBuffer bb; for (uint8_t b : data) bb.appendBits(b, 8); return QrSegment(Mode::BYTE, static_cast(data.size()), std::move(bb)); } QrSegment QrSegment::makeNumeric(const char *digits) { BitBuffer bb; int accumData = 0; int accumCount = 0; int charCount = 0; for (; *digits != '\0'; digits++, charCount++) { char c = *digits; if (c < '0' || c > '9') throw std::domain_error("String contains non-numeric characters"); accumData = accumData * 10 + (c - '0'); accumCount++; if (accumCount == 3) { bb.appendBits(static_cast(accumData), 10); accumData = 0; accumCount = 0; } } if (accumCount > 0) // 1 or 2 digits remaining bb.appendBits(static_cast(accumData), accumCount * 3 + 1); return QrSegment(Mode::NUMERIC, charCount, std::move(bb)); } QrSegment QrSegment::makeAlphanumeric(const char *text) { BitBuffer bb; int accumData = 0; int accumCount = 0; int charCount = 0; for (; *text != '\0'; text++, charCount++) { const char *temp = std::strchr(ALPHANUMERIC_CHARSET, *text); if (temp == nullptr) throw std::domain_error("String contains unencodable characters in alphanumeric mode"); accumData = accumData * 45 + static_cast(temp - ALPHANUMERIC_CHARSET); accumCount++; if (accumCount == 2) { bb.appendBits(static_cast(accumData), 11); accumData = 0; accumCount = 0; } } if (accumCount > 0) // 1 character remaining bb.appendBits(static_cast(accumData), 6); return QrSegment(Mode::ALPHANUMERIC, charCount, std::move(bb)); } vector QrSegment::makeSegments(const char *text) { // Select the most efficient segment encoding automatically vector result; if (*text == '\0'); // Leave result empty else if (isNumeric(text)) result.push_back(makeNumeric(text)); else if (isAlphanumeric(text)) result.push_back(makeAlphanumeric(text)); else { vector bytes; for (; *text != '\0'; text++) bytes.push_back(static_cast(*text)); result.push_back(makeBytes(bytes)); } return result; } QrSegment QrSegment::makeEci(long assignVal) { BitBuffer bb; if (assignVal < 0) throw std::domain_error("ECI assignment value out of range"); else if (assignVal < (1 << 7)) bb.appendBits(static_cast(assignVal), 8); else if (assignVal < (1 << 14)) { bb.appendBits(2, 2); bb.appendBits(static_cast(assignVal), 14); } else if (assignVal < 1000000L) { bb.appendBits(6, 3); bb.appendBits(static_cast(assignVal), 21); } else throw std::domain_error("ECI assignment value out of range"); return QrSegment(Mode::ECI, 0, std::move(bb)); } QrSegment::QrSegment(const Mode &md, int numCh, const std::vector &dt) : mode(&md), numChars(numCh), data(dt) { if (numCh < 0) throw std::domain_error("Invalid value"); } QrSegment::QrSegment(const Mode &md, int numCh, std::vector &&dt) : mode(&md), numChars(numCh), data(std::move(dt)) { if (numCh < 0) throw std::domain_error("Invalid value"); } int QrSegment::getTotalBits(const vector &segs, int version) { int result = 0; for (const QrSegment &seg : segs) { int ccbits = seg.mode->numCharCountBits(version); if (seg.numChars >= (1L << ccbits)) return -1; // The segment's length doesn't fit the field's bit width if (4 + ccbits > INT_MAX - result) return -1; // The sum will overflow an int type result += 4 + ccbits; if (seg.data.size() > static_cast(INT_MAX - result)) return -1; // The sum will overflow an int type result += static_cast(seg.data.size()); } return result; } bool QrSegment::isNumeric(const char *text) { for (; *text != '\0'; text++) { char c = *text; if (c < '0' || c > '9') return false; } return true; } bool QrSegment::isAlphanumeric(const char *text) { for (; *text != '\0'; text++) { if (std::strchr(ALPHANUMERIC_CHARSET, *text) == nullptr) return false; } return true; } const QrSegment::Mode &QrSegment::getMode() const { return *mode; } int QrSegment::getNumChars() const { return numChars; } const std::vector &QrSegment::getData() const { return data; } const char *QrSegment::ALPHANUMERIC_CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"; /*---- Class QrCode ----*/ int QrCode::getFormatBits(Ecc ecl) { switch (ecl) { case Ecc::LOW : return 1; case Ecc::MEDIUM : return 0; case Ecc::QUARTILE: return 3; case Ecc::HIGH : return 2; default: throw std::logic_error("Unreachable"); } } QrCode QrCode::encodeText(const char *text, Ecc ecl) { vector segs = QrSegment::makeSegments(text); return encodeSegments(segs, ecl); } QrCode QrCode::encodeBinary(const vector &data, Ecc ecl) { vector segs{QrSegment::makeBytes(data)}; return encodeSegments(segs, ecl); } QrCode QrCode::encodeSegments(const vector &segs, Ecc ecl, int minVersion, int maxVersion, int mask, bool boostEcl) { if (!(MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= MAX_VERSION) || mask < -1 || mask > 7) throw std::invalid_argument("Invalid value"); // Find the minimal version number to use int version, dataUsedBits; for (version = minVersion; ; version++) { int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; // Number of data bits available dataUsedBits = QrSegment::getTotalBits(segs, version); if (dataUsedBits != -1 && dataUsedBits <= dataCapacityBits) break; // This version number is found to be suitable if (version >= maxVersion) { // All versions in the range could not fit the given data std::ostringstream sb; if (dataUsedBits == -1) sb << "Segment too long"; else { sb << "Data length = " << dataUsedBits << " bits, "; sb << "Max capacity = " << dataCapacityBits << " bits"; } throw data_too_long(sb.str()); } } assert(dataUsedBits != -1); // Increase the error correction level while the data still fits in the current version number for (Ecc newEcl : {Ecc::MEDIUM, Ecc::QUARTILE, Ecc::HIGH}) { // From low to high if (boostEcl && dataUsedBits <= getNumDataCodewords(version, newEcl) * 8) ecl = newEcl; } // Concatenate all segments to create the data bit string BitBuffer bb; for (const QrSegment &seg : segs) { bb.appendBits(static_cast(seg.getMode().getModeBits()), 4); bb.appendBits(static_cast(seg.getNumChars()), seg.getMode().numCharCountBits(version)); bb.insert(bb.end(), seg.getData().begin(), seg.getData().end()); } assert(bb.size() == static_cast(dataUsedBits)); // Add terminator and pad up to a byte if applicable size_t dataCapacityBits = static_cast(getNumDataCodewords(version, ecl)) * 8; assert(bb.size() <= dataCapacityBits); bb.appendBits(0, std::min(4, static_cast(dataCapacityBits - bb.size()))); bb.appendBits(0, (8 - static_cast(bb.size() % 8)) % 8); assert(bb.size() % 8 == 0); // Pad with alternating bytes until data capacity is reached for (uint8_t padByte = 0xEC; bb.size() < dataCapacityBits; padByte ^= 0xEC ^ 0x11) bb.appendBits(padByte, 8); // Pack bits into bytes in big endian vector dataCodewords(bb.size() / 8); for (size_t i = 0; i < bb.size(); i++) dataCodewords.at(i >> 3) |= (bb.at(i) ? 1 : 0) << (7 - (i & 7)); // Create the QR Code object return QrCode(version, ecl, dataCodewords, mask); } QrCode::QrCode(int ver, Ecc ecl, const vector &dataCodewords, int msk) : // Initialize fields and check arguments version(ver), errorCorrectionLevel(ecl) { if (ver < MIN_VERSION || ver > MAX_VERSION) throw std::domain_error("Version value out of range"); if (msk < -1 || msk > 7) throw std::domain_error("Mask value out of range"); size = ver * 4 + 17; size_t sz = static_cast(size); modules = vector >(sz, vector(sz)); // Initially all light isFunction = vector >(sz, vector(sz)); // Compute ECC, draw modules drawFunctionPatterns(); const vector allCodewords = addEccAndInterleave(dataCodewords); drawCodewords(allCodewords); // Do masking if (msk == -1) { // Automatically choose best mask long minPenalty = LONG_MAX; for (int i = 0; i < 8; i++) { applyMask(i); drawFormatBits(i); long penalty = getPenaltyScore(); if (penalty < minPenalty) { msk = i; minPenalty = penalty; } applyMask(i); // Undoes the mask due to XOR } } assert(0 <= msk && msk <= 7); mask = msk; applyMask(msk); // Apply the final choice of mask drawFormatBits(msk); // Overwrite old format bits isFunction.clear(); isFunction.shrink_to_fit(); } int QrCode::getVersion() const { return version; } int QrCode::getSize() const { return size; } QrCode::Ecc QrCode::getErrorCorrectionLevel() const { return errorCorrectionLevel; } int QrCode::getMask() const { return mask; } bool QrCode::getModule(int x, int y) const { return 0 <= x && x < size && 0 <= y && y < size && module(x, y); } void QrCode::drawFunctionPatterns() { // Draw horizontal and vertical timing patterns for (int i = 0; i < size; i++) { setFunctionModule(6, i, i % 2 == 0); setFunctionModule(i, 6, i % 2 == 0); } // Draw 3 finder patterns (all corners except bottom right; overwrites some timing modules) drawFinderPattern(3, 3); drawFinderPattern(size - 4, 3); drawFinderPattern(3, size - 4); // Draw numerous alignment patterns const vector alignPatPos = getAlignmentPatternPositions(); size_t numAlign = alignPatPos.size(); for (size_t i = 0; i < numAlign; i++) { for (size_t j = 0; j < numAlign; j++) { // Don't draw on the three finder corners if (!((i == 0 && j == 0) || (i == 0 && j == numAlign - 1) || (i == numAlign - 1 && j == 0))) drawAlignmentPattern(alignPatPos.at(i), alignPatPos.at(j)); } } // Draw configuration data drawFormatBits(0); // Dummy mask value; overwritten later in the constructor drawVersion(); } void QrCode::drawFormatBits(int msk) { // Calculate error correction code and pack bits int data = getFormatBits(errorCorrectionLevel) << 3 | msk; // errCorrLvl is uint2, msk is uint3 int rem = data; for (int i = 0; i < 10; i++) rem = (rem << 1) ^ ((rem >> 9) * 0x537); int bits = (data << 10 | rem) ^ 0x5412; // uint15 assert(bits >> 15 == 0); // Draw first copy for (int i = 0; i <= 5; i++) setFunctionModule(8, i, getBit(bits, i)); setFunctionModule(8, 7, getBit(bits, 6)); setFunctionModule(8, 8, getBit(bits, 7)); setFunctionModule(7, 8, getBit(bits, 8)); for (int i = 9; i < 15; i++) setFunctionModule(14 - i, 8, getBit(bits, i)); // Draw second copy for (int i = 0; i < 8; i++) setFunctionModule(size - 1 - i, 8, getBit(bits, i)); for (int i = 8; i < 15; i++) setFunctionModule(8, size - 15 + i, getBit(bits, i)); setFunctionModule(8, size - 8, true); // Always dark } void QrCode::drawVersion() { if (version < 7) return; // Calculate error correction code and pack bits int rem = version; // version is uint6, in the range [7, 40] for (int i = 0; i < 12; i++) rem = (rem << 1) ^ ((rem >> 11) * 0x1F25); long bits = static_cast(version) << 12 | rem; // uint18 assert(bits >> 18 == 0); // Draw two copies for (int i = 0; i < 18; i++) { bool bit = getBit(bits, i); int a = size - 11 + i % 3; int b = i / 3; setFunctionModule(a, b, bit); setFunctionModule(b, a, bit); } } void QrCode::drawFinderPattern(int x, int y) { for (int dy = -4; dy <= 4; dy++) { for (int dx = -4; dx <= 4; dx++) { int dist = std::max(std::abs(dx), std::abs(dy)); // Chebyshev/infinity norm int xx = x + dx, yy = y + dy; if (0 <= xx && xx < size && 0 <= yy && yy < size) setFunctionModule(xx, yy, dist != 2 && dist != 4); } } } void QrCode::drawAlignmentPattern(int x, int y) { for (int dy = -2; dy <= 2; dy++) { for (int dx = -2; dx <= 2; dx++) setFunctionModule(x + dx, y + dy, std::max(std::abs(dx), std::abs(dy)) != 1); } } void QrCode::setFunctionModule(int x, int y, bool isDark) { size_t ux = static_cast(x); size_t uy = static_cast(y); modules .at(uy).at(ux) = isDark; isFunction.at(uy).at(ux) = true; } bool QrCode::module(int x, int y) const { return modules.at(static_cast(y)).at(static_cast(x)); } vector QrCode::addEccAndInterleave(const vector &data) const { if (data.size() != static_cast(getNumDataCodewords(version, errorCorrectionLevel))) throw std::invalid_argument("Invalid argument"); // Calculate parameter numbers int numBlocks = NUM_ERROR_CORRECTION_BLOCKS[static_cast(errorCorrectionLevel)][version]; int blockEccLen = ECC_CODEWORDS_PER_BLOCK [static_cast(errorCorrectionLevel)][version]; int rawCodewords = getNumRawDataModules(version) / 8; int numShortBlocks = numBlocks - rawCodewords % numBlocks; int shortBlockLen = rawCodewords / numBlocks; // Split data into blocks and append ECC to each block vector > blocks; const vector rsDiv = reedSolomonComputeDivisor(blockEccLen); for (int i = 0, k = 0; i < numBlocks; i++) { vector dat(data.cbegin() + k, data.cbegin() + (k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1))); k += static_cast(dat.size()); const vector ecc = reedSolomonComputeRemainder(dat, rsDiv); if (i < numShortBlocks) dat.push_back(0); dat.insert(dat.end(), ecc.cbegin(), ecc.cend()); blocks.push_back(std::move(dat)); } // Interleave (not concatenate) the bytes from every block into a single sequence vector result; for (size_t i = 0; i < blocks.at(0).size(); i++) { for (size_t j = 0; j < blocks.size(); j++) { // Skip the padding byte in short blocks if (i != static_cast(shortBlockLen - blockEccLen) || j >= static_cast(numShortBlocks)) result.push_back(blocks.at(j).at(i)); } } assert(result.size() == static_cast(rawCodewords)); return result; } void QrCode::drawCodewords(const vector &data) { if (data.size() != static_cast(getNumRawDataModules(version) / 8)) throw std::invalid_argument("Invalid argument"); size_t i = 0; // Bit index into the data // Do the funny zigzag scan for (int right = size - 1; right >= 1; right -= 2) { // Index of right column in each column pair if (right == 6) right = 5; for (int vert = 0; vert < size; vert++) { // Vertical counter for (int j = 0; j < 2; j++) { size_t x = static_cast(right - j); // Actual x coordinate bool upward = ((right + 1) & 2) == 0; size_t y = static_cast(upward ? size - 1 - vert : vert); // Actual y coordinate if (!isFunction.at(y).at(x) && i < data.size() * 8) { modules.at(y).at(x) = getBit(data.at(i >> 3), 7 - static_cast(i & 7)); i++; } // If this QR Code has any remainder bits (0 to 7), they were assigned as // 0/false/light by the constructor and are left unchanged by this method } } } assert(i == data.size() * 8); } void QrCode::applyMask(int msk) { if (msk < 0 || msk > 7) throw std::domain_error("Mask value out of range"); size_t sz = static_cast(size); for (size_t y = 0; y < sz; y++) { for (size_t x = 0; x < sz; x++) { bool invert; switch (msk) { case 0: invert = (x + y) % 2 == 0; break; case 1: invert = y % 2 == 0; break; case 2: invert = x % 3 == 0; break; case 3: invert = (x + y) % 3 == 0; break; case 4: invert = (x / 3 + y / 2) % 2 == 0; break; case 5: invert = x * y % 2 + x * y % 3 == 0; break; case 6: invert = (x * y % 2 + x * y % 3) % 2 == 0; break; case 7: invert = ((x + y) % 2 + x * y % 3) % 2 == 0; break; default: throw std::logic_error("Unreachable"); } modules.at(y).at(x) = modules.at(y).at(x) ^ (invert & !isFunction.at(y).at(x)); } } } long QrCode::getPenaltyScore() const { long result = 0; // Adjacent modules in row having same color, and finder-like patterns for (int y = 0; y < size; y++) { bool runColor = false; int runX = 0; std::array runHistory = {}; for (int x = 0; x < size; x++) { if (module(x, y) == runColor) { runX++; if (runX == 5) result += PENALTY_N1; else if (runX > 5) result++; } else { finderPenaltyAddHistory(runX, runHistory); if (!runColor) result += finderPenaltyCountPatterns(runHistory) * PENALTY_N3; runColor = module(x, y); runX = 1; } } result += finderPenaltyTerminateAndCount(runColor, runX, runHistory) * PENALTY_N3; } // Adjacent modules in column having same color, and finder-like patterns for (int x = 0; x < size; x++) { bool runColor = false; int runY = 0; std::array runHistory = {}; for (int y = 0; y < size; y++) { if (module(x, y) == runColor) { runY++; if (runY == 5) result += PENALTY_N1; else if (runY > 5) result++; } else { finderPenaltyAddHistory(runY, runHistory); if (!runColor) result += finderPenaltyCountPatterns(runHistory) * PENALTY_N3; runColor = module(x, y); runY = 1; } } result += finderPenaltyTerminateAndCount(runColor, runY, runHistory) * PENALTY_N3; } // 2*2 blocks of modules having same color for (int y = 0; y < size - 1; y++) { for (int x = 0; x < size - 1; x++) { bool color = module(x, y); if ( color == module(x + 1, y) && color == module(x, y + 1) && color == module(x + 1, y + 1)) result += PENALTY_N2; } } // Balance of dark and light modules int dark = 0; for (const vector &row : modules) { for (bool color : row) { if (color) dark++; } } int total = size * size; // Note that size is odd, so dark/total != 1/2 // Compute the smallest integer k >= 0 such that (45-5k)% <= dark/total <= (55+5k)% int k = static_cast((std::abs(dark * 20L - total * 10L) + total - 1) / total) - 1; assert(0 <= k && k <= 9); result += k * PENALTY_N4; assert(0 <= result && result <= 2568888L); // Non-tight upper bound based on default values of PENALTY_N1, ..., N4 return result; } vector QrCode::getAlignmentPatternPositions() const { if (version == 1) return vector(); else { int numAlign = version / 7 + 2; int step = (version == 32) ? 26 : (version * 4 + numAlign * 2 + 1) / (numAlign * 2 - 2) * 2; vector result; for (int i = 0, pos = size - 7; i < numAlign - 1; i++, pos -= step) result.insert(result.begin(), pos); result.insert(result.begin(), 6); return result; } } int QrCode::getNumRawDataModules(int ver) { if (ver < MIN_VERSION || ver > MAX_VERSION) throw std::domain_error("Version number out of range"); int result = (16 * ver + 128) * ver + 64; if (ver >= 2) { int numAlign = ver / 7 + 2; result -= (25 * numAlign - 10) * numAlign - 55; if (ver >= 7) result -= 36; } assert(208 <= result && result <= 29648); return result; } int QrCode::getNumDataCodewords(int ver, Ecc ecl) { return getNumRawDataModules(ver) / 8 - ECC_CODEWORDS_PER_BLOCK [static_cast(ecl)][ver] * NUM_ERROR_CORRECTION_BLOCKS[static_cast(ecl)][ver]; } vector QrCode::reedSolomonComputeDivisor(int degree) { if (degree < 1 || degree > 255) throw std::domain_error("Degree out of range"); // Polynomial coefficients are stored from highest to lowest power, excluding the leading term which is always 1. // For example the polynomial x^3 + 255x^2 + 8x + 93 is stored as the uint8 array {255, 8, 93}. vector result(static_cast(degree)); result.at(result.size() - 1) = 1; // Start off with the monomial x^0 // Compute the product polynomial (x - r^0) * (x - r^1) * (x - r^2) * ... * (x - r^{degree-1}), // and drop the highest monomial term which is always 1x^degree. // Note that r = 0x02, which is a generator element of this field GF(2^8/0x11D). uint8_t root = 1; for (int i = 0; i < degree; i++) { // Multiply the current product by (x - r^i) for (size_t j = 0; j < result.size(); j++) { result.at(j) = reedSolomonMultiply(result.at(j), root); if (j + 1 < result.size()) result.at(j) ^= result.at(j + 1); } root = reedSolomonMultiply(root, 0x02); } return result; } vector QrCode::reedSolomonComputeRemainder(const vector &data, const vector &divisor) { vector result(divisor.size()); for (uint8_t b : data) { // Polynomial division uint8_t factor = b ^ result.at(0); result.erase(result.begin()); result.push_back(0); for (size_t i = 0; i < result.size(); i++) result.at(i) ^= reedSolomonMultiply(divisor.at(i), factor); } return result; } uint8_t QrCode::reedSolomonMultiply(uint8_t x, uint8_t y) { // Russian peasant multiplication int z = 0; for (int i = 7; i >= 0; i--) { z = (z << 1) ^ ((z >> 7) * 0x11D); z ^= ((y >> i) & 1) * x; } assert(z >> 8 == 0); return static_cast(z); } int QrCode::finderPenaltyCountPatterns(const std::array &runHistory) const { int n = runHistory.at(1); assert(n <= size * 3); bool core = n > 0 && runHistory.at(2) == n && runHistory.at(3) == n * 3 && runHistory.at(4) == n && runHistory.at(5) == n; return (core && runHistory.at(0) >= n * 4 && runHistory.at(6) >= n ? 1 : 0) + (core && runHistory.at(6) >= n * 4 && runHistory.at(0) >= n ? 1 : 0); } int QrCode::finderPenaltyTerminateAndCount(bool currentRunColor, int currentRunLength, std::array &runHistory) const { if (currentRunColor) { // Terminate dark run finderPenaltyAddHistory(currentRunLength, runHistory); currentRunLength = 0; } currentRunLength += size; // Add light border to final run finderPenaltyAddHistory(currentRunLength, runHistory); return finderPenaltyCountPatterns(runHistory); } void QrCode::finderPenaltyAddHistory(int currentRunLength, std::array &runHistory) const { if (runHistory.at(0) == 0) currentRunLength += size; // Add light border to initial run std::copy_backward(runHistory.cbegin(), runHistory.cend() - 1, runHistory.end()); runHistory.at(0) = currentRunLength; } bool QrCode::getBit(long x, int i) { return ((x >> i) & 1) != 0; } /*---- Tables of constants ----*/ const int QrCode::PENALTY_N1 = 3; const int QrCode::PENALTY_N2 = 3; const int QrCode::PENALTY_N3 = 40; const int QrCode::PENALTY_N4 = 10; const int8_t QrCode::ECC_CODEWORDS_PER_BLOCK[4][41] = { // Version: (note that index 0 is for padding, and is set to an illegal value) //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level {-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Low {-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, // Medium {-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Quartile {-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // High }; const int8_t QrCode::NUM_ERROR_CORRECTION_BLOCKS[4][41] = { // Version: (note that index 0 is for padding, and is set to an illegal value) //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level {-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25}, // Low {-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49}, // Medium {-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68}, // Quartile {-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81}, // High }; data_too_long::data_too_long(const std::string &msg) : std::length_error(msg) {} /*---- Class BitBuffer ----*/ BitBuffer::BitBuffer() : std::vector() {} void BitBuffer::appendBits(std::uint32_t val, int len) { if (len < 0 || len > 31 || val >> len != 0) throw std::domain_error("Value out of range"); for (int i = len - 1; i >= 0; i--) // Append bit by bit this->push_back(((val >> i) & 1) != 0); } } kraft-1.2.2/src/3rdparty/qrcodegen.hpp000066400000000000000000000477171467704360200176730ustar00rootroot00000000000000/* * QR Code generator library (C++) * * Copyright (c) Project Nayuki. (MIT License) * https://www.nayuki.io/page/qr-code-generator-library * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * - The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - The Software is provided "as is", without warranty of any kind, express or * implied, including but not limited to the warranties of merchantability, * fitness for a particular purpose and noninfringement. In no event shall the * authors or copyright holders be liable for any claim, damages or other * liability, whether in an action of contract, tort or otherwise, arising from, * out of or in connection with the Software or the use or other dealings in the * Software. */ #pragma once #include #include #include #include #include namespace qrcodegen { /* * A segment of character/binary/control data in a QR Code symbol. * Instances of this class are immutable. * The mid-level way to create a segment is to take the payload data * and call a static factory function such as QrSegment::makeNumeric(). * The low-level way to create a segment is to custom-make the bit buffer * and call the QrSegment() constructor with appropriate values. * This segment class imposes no length restrictions, but QR Codes have restrictions. * Even in the most favorable conditions, a QR Code can only hold 7089 characters of data. * Any segment longer than this is meaningless for the purpose of generating QR Codes. */ class QrSegment final { /*---- Public helper enumeration ----*/ /* * Describes how a segment's data bits are interpreted. Immutable. */ public: class Mode final { /*-- Constants --*/ public: static const Mode NUMERIC; public: static const Mode ALPHANUMERIC; public: static const Mode BYTE; public: static const Mode KANJI; public: static const Mode ECI; /*-- Fields --*/ // The mode indicator bits, which is a uint4 value (range 0 to 15). private: int modeBits; // Number of character count bits for three different version ranges. private: int numBitsCharCount[3]; /*-- Constructor --*/ private: Mode(int mode, int cc0, int cc1, int cc2); /*-- Methods --*/ /* * (Package-private) Returns the mode indicator bits, which is an unsigned 4-bit value (range 0 to 15). */ public: int getModeBits() const; /* * (Package-private) Returns the bit width of the character count field for a segment in * this mode in a QR Code at the given version number. The result is in the range [0, 16]. */ public: int numCharCountBits(int ver) const; }; /*---- Static factory functions (mid level) ----*/ /* * Returns a segment representing the given binary data encoded in * byte mode. All input byte vectors are acceptable. Any text string * can be converted to UTF-8 bytes and encoded as a byte mode segment. */ public: static QrSegment makeBytes(const std::vector &data); /* * Returns a segment representing the given string of decimal digits encoded in numeric mode. */ public: static QrSegment makeNumeric(const char *digits); /* * Returns a segment representing the given text string encoded in alphanumeric mode. * The characters allowed are: 0 to 9, A to Z (uppercase only), space, * dollar, percent, asterisk, plus, hyphen, period, slash, colon. */ public: static QrSegment makeAlphanumeric(const char *text); /* * Returns a list of zero or more segments to represent the given text string. The result * may use various segment modes and switch modes to optimize the length of the bit stream. */ public: static std::vector makeSegments(const char *text); /* * Returns a segment representing an Extended Channel Interpretation * (ECI) designator with the given assignment value. */ public: static QrSegment makeEci(long assignVal); /*---- Public static helper functions ----*/ /* * Tests whether the given string can be encoded as a segment in numeric mode. * A string is encodable iff each character is in the range 0 to 9. */ public: static bool isNumeric(const char *text); /* * Tests whether the given string can be encoded as a segment in alphanumeric mode. * A string is encodable iff each character is in the following set: 0 to 9, A to Z * (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon. */ public: static bool isAlphanumeric(const char *text); /*---- Instance fields ----*/ /* The mode indicator of this segment. Accessed through getMode(). */ private: const Mode *mode; /* The length of this segment's unencoded data. Measured in characters for * numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode. * Always zero or positive. Not the same as the data's bit length. * Accessed through getNumChars(). */ private: int numChars; /* The data bits of this segment. Accessed through getData(). */ private: std::vector data; /*---- Constructors (low level) ----*/ /* * Creates a new QR Code segment with the given attributes and data. * The character count (numCh) must agree with the mode and the bit buffer length, * but the constraint isn't checked. The given bit buffer is copied and stored. */ public: QrSegment(const Mode &md, int numCh, const std::vector &dt); /* * Creates a new QR Code segment with the given parameters and data. * The character count (numCh) must agree with the mode and the bit buffer length, * but the constraint isn't checked. The given bit buffer is moved and stored. */ public: QrSegment(const Mode &md, int numCh, std::vector &&dt); /*---- Methods ----*/ /* * Returns the mode field of this segment. */ public: const Mode &getMode() const; /* * Returns the character count field of this segment. */ public: int getNumChars() const; /* * Returns the data bits of this segment. */ public: const std::vector &getData() const; // (Package-private) Calculates the number of bits needed to encode the given segments at // the given version. Returns a non-negative number if successful. Otherwise returns -1 if a // segment has too many characters to fit its length field, or the total bits exceeds INT_MAX. public: static int getTotalBits(const std::vector &segs, int version); /*---- Private constant ----*/ /* The set of all legal characters in alphanumeric mode, where * each character value maps to the index in the string. */ private: static const char *ALPHANUMERIC_CHARSET; }; /* * A QR Code symbol, which is a type of two-dimension barcode. * Invented by Denso Wave and described in the ISO/IEC 18004 standard. * Instances of this class represent an immutable square grid of dark and light cells. * The class provides static factory functions to create a QR Code from text or binary data. * The class covers the QR Code Model 2 specification, supporting all versions (sizes) * from 1 to 40, all 4 error correction levels, and 4 character encoding modes. * * Ways to create a QR Code object: * - High level: Take the payload data and call QrCode::encodeText() or QrCode::encodeBinary(). * - Mid level: Custom-make the list of segments and call QrCode::encodeSegments(). * - Low level: Custom-make the array of data codeword bytes (including * segment headers and final padding, excluding error correction codewords), * supply the appropriate version number, and call the QrCode() constructor. * (Note that all ways require supplying the desired error correction level.) */ class QrCode final { /*---- Public helper enumeration ----*/ /* * The error correction level in a QR Code symbol. */ public: enum class Ecc { LOW = 0 , // The QR Code can tolerate about 7% erroneous codewords MEDIUM , // The QR Code can tolerate about 15% erroneous codewords QUARTILE, // The QR Code can tolerate about 25% erroneous codewords HIGH , // The QR Code can tolerate about 30% erroneous codewords }; // Returns a value in the range 0 to 3 (unsigned 2-bit integer). private: static int getFormatBits(Ecc ecl); /*---- Static factory functions (high level) ----*/ /* * Returns a QR Code representing the given Unicode text string at the given error correction level. * As a conservative upper bound, this function is guaranteed to succeed for strings that have 2953 or fewer * UTF-8 code units (not Unicode code points) if the low error correction level is used. The smallest possible * QR Code version is automatically chosen for the output. The ECC level of the result may be higher than * the ecl argument if it can be done without increasing the version. */ public: static QrCode encodeText(const char *text, Ecc ecl); /* * Returns a QR Code representing the given binary data at the given error correction level. * This function always encodes using the binary segment mode, not any text mode. The maximum number of * bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output. * The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version. */ public: static QrCode encodeBinary(const std::vector &data, Ecc ecl); /*---- Static factory functions (mid level) ----*/ /* * Returns a QR Code representing the given segments with the given encoding parameters. * The smallest possible QR Code version within the given range is automatically * chosen for the output. Iff boostEcl is true, then the ECC level of the result * may be higher than the ecl argument if it can be done without increasing the * version. The mask number is either between 0 to 7 (inclusive) to force that * mask, or -1 to automatically choose an appropriate mask (which may be slow). * This function allows the user to create a custom sequence of segments that switches * between modes (such as alphanumeric and byte) to encode text in less space. * This is a mid-level API; the high-level API is encodeText() and encodeBinary(). */ public: static QrCode encodeSegments(const std::vector &segs, Ecc ecl, int minVersion=1, int maxVersion=40, int mask=-1, bool boostEcl=true); // All optional parameters /*---- Instance fields ----*/ // Immutable scalar parameters: /* The version number of this QR Code, which is between 1 and 40 (inclusive). * This determines the size of this barcode. */ private: int version; /* The width and height of this QR Code, measured in modules, between * 21 and 177 (inclusive). This is equal to version * 4 + 17. */ private: int size; /* The error correction level used in this QR Code. */ private: Ecc errorCorrectionLevel; /* The index of the mask pattern used in this QR Code, which is between 0 and 7 (inclusive). * Even if a QR Code is created with automatic masking requested (mask = -1), * the resulting object still has a mask value between 0 and 7. */ private: int mask; // Private grids of modules/pixels, with dimensions of size*size: // The modules of this QR Code (false = light, true = dark). // Immutable after constructor finishes. Accessed through getModule(). private: std::vector > modules; // Indicates function modules that are not subjected to masking. Discarded when constructor finishes. private: std::vector > isFunction; /*---- Constructor (low level) ----*/ /* * Creates a new QR Code with the given version number, * error correction level, data codeword bytes, and mask number. * This is a low-level API that most users should not use directly. * A mid-level API is the encodeSegments() function. */ public: QrCode(int ver, Ecc ecl, const std::vector &dataCodewords, int msk); /*---- Public instance methods ----*/ /* * Returns this QR Code's version, in the range [1, 40]. */ public: int getVersion() const; /* * Returns this QR Code's size, in the range [21, 177]. */ public: int getSize() const; /* * Returns this QR Code's error correction level. */ public: Ecc getErrorCorrectionLevel() const; /* * Returns this QR Code's mask, in the range [0, 7]. */ public: int getMask() const; /* * Returns the color of the module (pixel) at the given coordinates, which is false * for light or true for dark. The top left corner has the coordinates (x=0, y=0). * If the given coordinates are out of bounds, then false (light) is returned. */ public: bool getModule(int x, int y) const; /*---- Private helper methods for constructor: Drawing function modules ----*/ // Reads this object's version field, and draws and marks all function modules. private: void drawFunctionPatterns(); // Draws two copies of the format bits (with its own error correction code) // based on the given mask and this object's error correction level field. private: void drawFormatBits(int msk); // Draws two copies of the version bits (with its own error correction code), // based on this object's version field, iff 7 <= version <= 40. private: void drawVersion(); // Draws a 9*9 finder pattern including the border separator, // with the center module at (x, y). Modules can be out of bounds. private: void drawFinderPattern(int x, int y); // Draws a 5*5 alignment pattern, with the center module // at (x, y). All modules must be in bounds. private: void drawAlignmentPattern(int x, int y); // Sets the color of a module and marks it as a function module. // Only used by the constructor. Coordinates must be in bounds. private: void setFunctionModule(int x, int y, bool isDark); // Returns the color of the module at the given coordinates, which must be in range. private: bool module(int x, int y) const; /*---- Private helper methods for constructor: Codewords and masking ----*/ // Returns a new byte string representing the given data with the appropriate error correction // codewords appended to it, based on this object's version and error correction level. private: std::vector addEccAndInterleave(const std::vector &data) const; // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire // data area of this QR Code. Function modules need to be marked off before this is called. private: void drawCodewords(const std::vector &data); // XORs the codeword modules in this QR Code with the given mask pattern. // The function modules must be marked and the codeword bits must be drawn // before masking. Due to the arithmetic of XOR, calling applyMask() with // the same mask value a second time will undo the mask. A final well-formed // QR Code needs exactly one (not zero, two, etc.) mask applied. private: void applyMask(int msk); // Calculates and returns the penalty score based on state of this QR Code's current modules. // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score. private: long getPenaltyScore() const; /*---- Private helper functions ----*/ // Returns an ascending list of positions of alignment patterns for this version number. // Each position is in the range [0,177), and are used on both the x and y axes. // This could be implemented as lookup table of 40 variable-length lists of unsigned bytes. private: std::vector getAlignmentPatternPositions() const; // Returns the number of data bits that can be stored in a QR Code of the given version number, after // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8. // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table. private: static int getNumRawDataModules(int ver); // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any // QR Code of the given version number and error correction level, with remainder bits discarded. // This stateless pure function could be implemented as a (40*4)-cell lookup table. private: static int getNumDataCodewords(int ver, Ecc ecl); // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be // implemented as a lookup table over all possible parameter values, instead of as an algorithm. private: static std::vector reedSolomonComputeDivisor(int degree); // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials. private: static std::vector reedSolomonComputeRemainder(const std::vector &data, const std::vector &divisor); // Returns the product of the two given field elements modulo GF(2^8/0x11D). // All inputs are valid. This could be implemented as a 256*256 lookup table. private: static std::uint8_t reedSolomonMultiply(std::uint8_t x, std::uint8_t y); // Can only be called immediately after a light run is added, and // returns either 0, 1, or 2. A helper function for getPenaltyScore(). private: int finderPenaltyCountPatterns(const std::array &runHistory) const; // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore(). private: int finderPenaltyTerminateAndCount(bool currentRunColor, int currentRunLength, std::array &runHistory) const; // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore(). private: void finderPenaltyAddHistory(int currentRunLength, std::array &runHistory) const; // Returns true iff the i'th bit of x is set to 1. private: static bool getBit(long x, int i); /*---- Constants and tables ----*/ // The minimum version number supported in the QR Code Model 2 standard. public: static constexpr int MIN_VERSION = 1; // The maximum version number supported in the QR Code Model 2 standard. public: static constexpr int MAX_VERSION = 40; // For use in getPenaltyScore(), when evaluating which mask is best. private: static const int PENALTY_N1; private: static const int PENALTY_N2; private: static const int PENALTY_N3; private: static const int PENALTY_N4; private: static const std::int8_t ECC_CODEWORDS_PER_BLOCK[4][41]; private: static const std::int8_t NUM_ERROR_CORRECTION_BLOCKS[4][41]; }; /*---- Public exception class ----*/ /* * Thrown when the supplied data does not fit any QR Code version. Ways to handle this exception include: * - Decrease the error correction level if it was greater than Ecc::LOW. * - If the encodeSegments() function was called with a maxVersion argument, then increase * it if it was less than QrCode::MAX_VERSION. (This advice does not apply to the other * factory functions because they search all versions up to QrCode::MAX_VERSION.) * - Split the text data into better or optimal segments in order to reduce the number of bits required. * - Change the text or binary data to be shorter. * - Change the text to fit the character set of a particular segment mode (e.g. alphanumeric). * - Propagate the error upward to the caller/user. */ class data_too_long : public std::length_error { public: explicit data_too_long(const std::string &msg); }; /* * An appendable sequence of bits (0s and 1s). Mainly used by QrSegment. */ class BitBuffer final : public std::vector { /*---- Constructor ----*/ // Creates an empty bit buffer (length 0). public: BitBuffer(); /*---- Method ----*/ // Appends the given number of low-order bits of the given value // to this buffer. Requires 0 <= len <= 31 and val < 2^len. public: void appendBits(std::uint32_t val, int len); }; } kraft-1.2.2/src/CMakeLists.txt000066400000000000000000000106511467704360200161660ustar00rootroot00000000000000 include_directories(${QT_INCLUDES} src) add_subdirectory(pics) configure_file(${CMAKE_CURRENT_LIST_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h @ONLY) ########### next target ############### qt5_add_resources(KRAFT_RC_SRC pics/kraft.qrc) set(kraft_SRCS attribute.cpp einheit.cpp doctype.cpp numbercycle.cpp katalogman.cpp stdsatzman.cpp katalog.cpp templkatalog.cpp docposition.cpp matkatalog.cpp calcdialogbase.cpp timecalcpart.cpp fixcalcpart.cpp floskeltemplate.cpp floskel.cpp calcpart.cpp kraftview.cpp kraftdoc.cpp catalogchapter.cpp addeditchapterdialog.cpp unitmanager.cpp stockmaterial.cpp materialcalcpart.cpp flostempldialog.cpp stdsatzman.cpp materialtempldialog.cpp timecalcdialog.cpp fixcalcdialog.cpp matcalcdialog.h matcalcdialog.cpp templatesaverbase.cpp templatesaverdb.cpp materialsaverbase.cpp materialsaverdb.cpp prefsdialog.cpp prefswages.cpp prefsunits.cpp katalogview.cpp filterheader.cpp kataloglistview.cpp templkatalogview.cpp templkataloglistview.cpp positionviewwidget.cpp documentsaverbase.cpp documentsaverdb.cpp exportxrechnung.cpp documentman.cpp docdigest.cpp alldocsview.cpp doctypeedit.cpp doctext.cpp portal.cpp portalview.cpp archiveman.cpp reportgenerator.cpp htmlview.cpp docpostcard.cpp catalogtemplate.cpp catalogselection.cpp kraftdocheaderedit.cpp kraftdocfooteredit.cpp inserttempldialog.cpp archdocposition.cpp archdoc.cpp materialkataloglistview.cpp materialkatalogview.cpp materialselectdialog.cpp kraftdocedit.cpp kraftdocpositionsedit.cpp portalhtmlview.cpp templtopositiondialogbase.cpp textselection.cpp newdocassistant.cpp docassistant.cpp texteditdialog.cpp templateprovider.cpp headertemplateprovider.cpp footertemplateprovider.cpp catalogtemplateprovider.cpp texttemplate.cpp grantleetemplate.cpp tagman.cpp itemtagdialog.cpp tagtemplatesdialog.cpp importitemdialog.cpp importfilter.cpp kraftview_ro.cpp taxeditdialog.cpp numbercycledialog.cpp impviewwidgets.cpp setupassistant.cpp models/documentmodel.cpp models/documentproxymodels.cpp models/datemodel.cpp models/docbasemodel.cpp docdigestdetailview.cpp addressprovider.cpp addressselectorwidget.cpp addressprovider_akonadi.cpp addressselectordialog.cpp kraftdb.cpp geld.cpp defaultprovider.cpp metaxmlparser.cpp texttemplateinterface.cpp documenttemplate.cpp pdfconverter.cpp format.cpp stringutil.cpp epcqrcode.cpp 3rdparty/qrcodegen.cpp ) kconfig_add_kcfg_files(kraft_SRCS databasesettings.kcfgc kraftsettings.kcfgc ) ki18n_wrap_ui(kraft_SRCS calctemplate.ui dbinit.ui createdb.ui dbselect.ui mysqldetails.ui sqlitedetails.ui identity.ui statuspage.ui upgradedb.ui timepart.ui fixpartui.ui matpartui.ui inserttmplbase.ui materialdialog.ui docheader.ui positionwidget.ui docfooter.ui texteditbase.ui positionwidget.ui doctypeeditbase.ui taxeditbase.ui wageseditbase.ui unitseditbase.ui importtodocbase.ui numbercycleseditbase.ui xrechnung.ui ) set(KRAFT_LINK_LIBS Qt5::Core Qt5::Widgets Qt5::Sql Qt5::Xml KF5::I18n KF5::Contacts KF5::ConfigCore KF5::ConfigGui ${CTEMPLATE_LIBRARIES} pthread Grantlee5::Templates ) if(${AKO_PREFIX}Akonadi_FOUND) list(APPEND KRAFT_LINK_LIBS ${AKO_PREFIX}::AkonadiCore ${AKO_PREFIX}::AkonadiContact ${AKO_PREFIX}::ContactEditor ${AKO_PREFIX}::AkonadiAgentBase ${AKO_PREFIX}::AkonadiWidgets ${AKO_PREFIX}::AkonadiXml ) endif() add_library(kraftlib STATIC ${KRAFT_RC_SRC} ${kraft_SRCS}) target_compile_options(kraftlib PRIVATE -Wall -Wno-suggest-override) add_executable(kraft main.cpp) set_target_properties(kraft PROPERTIES OUTPUT_NAME kraft) target_link_libraries(kraftlib PUBLIC ${KRAFT_LINK_LIBS} ) target_link_libraries(kraft PUBLIC kraftlib ) install(TARGETS kraft ${INSTALL_TARGETS_DEFAULT_ARGS}) ########### install files ############### install(FILES kraftsettings.kcfg databasesettings.kcfg DESTINATION ${KCFG_INSTALL_DIR}) install(FILES kraftui.rc katalogview.rc DESTINATION ${KXMLGUI_INSTALL_DIR}/kraft) kraft-1.2.2/src/Kraft2.config000066400000000000000000000000371467704360200157430ustar00rootroot00000000000000// ADD PREDEFINED MACROS HERE! kraft-1.2.2/src/Kraft2.creator000066400000000000000000000000501467704360200161300ustar00rootroot00000000000000[General] [General] [General] [General] kraft-1.2.2/src/Kraft2.files000066400000000000000000000073561467704360200156130ustar00rootroot00000000000000addressselection.cpp addressselection.h addresstemplateprovider.cpp addresstemplateprovider.h archdoc.cpp archdoc.h archdocposition.cpp archdocposition.h archiveman.cpp archiveman.h attribute.cpp attribute.h brunskatalog.cpp brunskatalog.h brunskataloglistview.cpp brunskataloglistview.h brunskatalogview.cpp brunskatalogview.h brunsrecord.cpp brunsrecord.h brunsviewer.cpp brunsviewer.h brunsviewmain.cpp calcpart.cpp calcpart.h catalogchapteredit.cpp catalogchapteredit.h catalogselection.cpp catalogselection.h catalogtemplate.cpp catalogtemplate.h catalogtemplateprovider.cpp catalogtemplateprovider.h CMakeLists.txt dbids.h defaultprovider.cpp defaultprovider.h docassistant.cpp docassistant.h docdigest.cpp docdigest.h docdigestview.cpp docdigestview.h docfooter.ui docguardedptr.h docheader.ui doclocaledialog.cpp doclocaledialog.h docposition.cpp docposition.h docpostcard.cpp docpostcard.h doctext.cpp doctext.h doctextsview.ui doctype.cpp doctype.h doctypedetailseditbase.ui doctypeedit.cpp doctypeedit.h doctypeeditbase.ui documentman.cpp documentman.h documentsaverbase.cpp documentsaverbase.h documentsaverdb.cpp documentsaverdb.h einheit.cpp einheit.h extendedcombo.cpp extendedcombo.h filterheader.cpp filterheader.h fixcalcdialog.cpp fixcalcdialog.h fixcalcpart.cpp fixcalcpart.h fixpartui.ui floskel.cpp floskel.h floskeltemplate.cpp floskeltemplate.h flostab.ui flostempldialog.cpp flostempldialog.h footertemplateprovider.cpp footertemplateprovider.h geld.cpp geld.h headerselection.cpp headerselection.h headertemplateprovider.cpp headertemplateprovider.h htmlview.cpp htmlview.h imporst.cpp importfilter.cpp importfilter.h importitemdialog.cpp importitemdialog.h importtodocbase.ui insertplantbase.ui insertplantdialog.cpp insertplantdialog.h inserttempldialog.cpp inserttempldialog.h inserttmplbase.ui katalog.cpp katalog.h kataloglistview.cpp kataloglistview.h katalogman.cpp katalogman.h katalogview.cpp katalogview.h kraftdb.cpp kraftdb.h kraftdoc.cpp kraftdoc.h kraftdocedit.cpp kraftdocedit.h kraftdocfooteredit.cpp kraftdocfooteredit.h kraftdocheaderedit.cpp kraftdocheaderedit.h kraftdocpositionsedit.cpp kraftdocpositionsedit.h kraftglobals.h kraftview.cpp kraftview.h kraftview_ro.cpp kraftview_ro.h main.cpp matcalcdialog.cpp matcalcdialog.h materialcalcpart.cpp materialcalcpart.h materialdialog.ui materialkataloglistview.cpp materialkataloglistview.h materialkatalogview.cpp materialkatalogview.h materialsaverbase.cpp materialsaverbase.h materialsaverdb.cpp materialsaverdb.h materialselectdialog.cpp materialselectdialog.h materialtempldialog.cpp materialtempldialog.h matkatalog.cpp matkatalog.h matpartui.ui matpartui.ui.h newdocassistant.cpp newdocassistant.h numbercycle.cpp numbercycle.h numbercycledialog.cpp numbercycledialog.h numbercycleseditbase.ui pics/CMakeLists.txt portal.cpp portal.h portalhtmlview.cpp portalhtmlview.h portalview.cpp portalview.h portinglog.txt positiontagdialog.cpp positiontagdialog.h positionviewwidget.cpp positionviewwidget.h positionwidget.ui prefsdialog.cpp prefsdialog.h reportgenerator.cpp reportgenerator.h stdsatzman.cpp stdsatzman.h stockmaterial.cpp stockmaterial.h stockmaterialman.cpp stockmaterialman.h tagman.cpp tagman.h tagtemplatesdialog.cpp tagtemplatesdialog.h templateprovider.cpp templateprovider.h templatesaverbase.cpp templatesaverbase.h templatesaverdb.cpp templatesaverdb.h templkatalog.cpp templkatalog.h templkataloglistview.cpp templkataloglistview.h templkatalogview.cpp templkatalogview.h templtopositiondialogbase.cpp templtopositiondialogbase.h texteditbase.ui texteditdialog.cpp texteditdialog.h textselection.cpp textselection.h texttemplate.cpp texttemplate.h timecalcpart.cpp timecalcpart.h unitmanager.cpp unitmanager.h version.h zeitcalcdialog.cpp zeitcalcdialog.h zeitcalcpart.cpp zeitcalcpart.h zeitpartui.uikraft-1.2.2/src/Kraft2.includes000066400000000000000000000000001467704360200162720ustar00rootroot00000000000000kraft-1.2.2/src/Messages.sh000066400000000000000000000006241467704360200155300ustar00rootroot00000000000000#!bin/sh EXTRACTRC=$KRAFT_HOME/src/extractrc XGETTEXT=xgettext if [ -z "$KRAFT_HOME" ]; then echo "Need to set KRAFT_HOME" exit 1 fi podir=$KRAFT_HOME/po echo "PODir: " $podir pushd $KRAFT_HOME/src $EXTRACTRC `find . -name \*.rc -o -name \*.ui -o -name \*.kcfg` >> rc.cpp $XGETTEXT --kde --language=C++ --from-code=UTF-8 `find . -name \*.cc -o -name \*.cpp -o -name \*.h` -o $podir/kraft.pot kraft-1.2.2/src/addeditchapterdialog.cpp000066400000000000000000000055251467704360200202630ustar00rootroot00000000000000/*************************************************************************** addeditchapter - add and edit catalog chapters ------------------- begin : Sat Nov 6 2010 copyright : (C) 2010 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include "addeditchapterdialog.h" #include "catalogchapter.h" AddEditChapterDialog::AddEditChapterDialog( QWidget *parent ) :QDialog( parent ) { setObjectName( "CHAPTER_EDIT_DIALOG" ); setModal( true ); setWindowTitle( i18n( "Add/Edit Catalog Chapter" ) ); QVBoxLayout *vbox = new QVBoxLayout; this->setLayout( vbox ); mTopLabel = new QLabel(); mTopLabel->setText( i18n("Create a new Catalog Chapter")); vbox->addWidget( mTopLabel ); vbox->addWidget( new QLabel( i18n("Chapter name:"))); mNameEdit = new QLineEdit; vbox->addWidget( mNameEdit ); vbox->addWidget( new QLabel( i18n("Chapter description:"))); mDescEdit = new QLineEdit; vbox->addWidget( mDescEdit ); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); vbox->addWidget(buttonBox); } QString AddEditChapterDialog::name() const { return mNameEdit->text(); } QString AddEditChapterDialog::description() const { return mDescEdit->text(); } void AddEditChapterDialog::setParentChapter( const CatalogChapter& chapter ) { mParentChapter = chapter; mTopLabel->setText( i18n("Create new Catalog Chapter below chapter %1", chapter.name() )); } void AddEditChapterDialog::setEditChapter( const CatalogChapter& chapter ) { mChapter = chapter; mTopLabel->setText( i18n("Edit name and description of chapter %1", chapter.name() )); mNameEdit->setText( chapter.name() ); mDescEdit->setText( chapter.description() ); } kraft-1.2.2/src/addeditchapterdialog.h000066400000000000000000000031511467704360200177210ustar00rootroot00000000000000/*************************************************************************** addeditchapter - add and edit catalog chapters ------------------- begin : Sat Nov 6 2010 copyright : (C) 2010 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef ADDEDITCHAPTERDIALOG_H #define ADDEDITCHAPTERDIALOG_H #include #include #include #include "catalogchapter.h" class AddEditChapterDialog : public QDialog { Q_OBJECT public: AddEditChapterDialog(QWidget *parent = 0); void setEditChapter( const CatalogChapter& ); void setParentChapter( const CatalogChapter& ); QString name() const; QString description() const; private: CatalogChapter mChapter; CatalogChapter mParentChapter; QLineEdit *mNameEdit; QLineEdit *mDescEdit; QLabel *mTopLabel; }; #endif // ADDEDITCHAPTERDIALOG_H kraft-1.2.2/src/addressprovider.cpp000066400000000000000000000116341467704360200173340ustar00rootroot00000000000000/*************************************************************************** addressprovider.cpp - ------------------- begin : Fri Mar 4 2011 copyright : (C) 2011 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include "addressprovider.h" #include // FIXME this needs to change once there are more address book providers, ie. // on Mac. #include "addressprovider_akonadi.h" /* ==================================================================================== */ AddressProvider::AddressProvider( QObject *parent ) :QObject( parent ), _d( new AddressProviderPrivate(parent) ) { connect(_d, SIGNAL(addresseeFound(QString, KContacts::Addressee)), this, SLOT(slotAddresseeFound(QString, KContacts::Addressee))); connect(_d, SIGNAL(lookupError( QString, QString)), this, SLOT(slotErrorMsg(QString, QString))); connect(_d, SIGNAL(addresseeNotFound(QString)), SLOT(slotAddresseeNotFound(QString))); } bool AddressProvider::backendUp() { return _d->backendUp(); } QString AddressProvider::backendName() const { return _d->backendName(); } void AddressProvider::slotAddresseeFound( const QString& uid, const KContacts::Addressee contact) { // remove a potential error message in case an error happened before if( !( uid.isEmpty() || contact.isEmpty()) ) { _errMessages.remove(uid); } _addressCache[uid] = contact; _addressCache[uid].insertCustom(CUSTOM_ADDRESS_MARKER, "addressbook"); emit lookupResult(uid, _addressCache[uid]); } void AddressProvider::slotAddresseeNotFound( const QString& uid ) { KContacts::Addressee contact; // Empty for not found. _notFoundUids.insert(uid); emit lookupResult(uid, contact); } void AddressProvider::slotResetNotFoundCache() { _notFoundUids.clear(); } void AddressProvider::slotErrorMsg(const QString& uid, const QString& msg) { if( !uid.isEmpty() ) { _errMessages[uid] = msg; } } QString AddressProvider::errorMsg( const QString& uid ) { if( !_d->backendUp() ) { return "Backend down"; } if( _errMessages.contains(uid) ) { return _errMessages[uid]; } return QString(); } KContacts::Addressee AddressProvider::getAddresseeFromCache(const QString& uid) { KContacts::Addressee adr; if( _addressCache.contains(uid)) { adr = _addressCache[uid]; } return adr; } AddressProvider::LookupState AddressProvider::lookupAddressee( const QString& uid ) { // FIXME: Check for the size of the err messages. If it is big, // maybe do not bother the backend more if( !_d->backendUp() ) { return BackendError; } if( _notFoundUids.contains(uid)) { // qDebug() << uid << "was not found before"; return LookupNotFound; } if( _addressCache.contains(uid)) { return LookupFromCache; } if( _d->isSearchOngoing(uid) ) { return LookupOngoing; } if( _d->lookupAddressee(uid) ) { return LookupStarted; } return ItemError; } KContacts::Addressee AddressProvider::getAddressee(const QModelIndex& indx) { return _d->getAddressee(indx); } KContacts::Addressee AddressProvider::getAddressee( int row, const QModelIndex &parent) { return _d->getAddressee(row, parent); } QAbstractItemModel *AddressProvider::model() { return _d->model(); } QString AddressProvider::formattedAddress( const KContacts::Addressee& contact ) const { QString re; KContacts::Address address; address = contact.address( KContacts::Address::Pref ); if( address.isEmpty() ) address = contact.address(KContacts::Address::Work ); if( address.isEmpty() ) address = contact.address(KContacts::Address::Home ); if( address.isEmpty() ) address = contact.address(KContacts::Address::Postal ); if( address.isEmpty() ) { re = contact.realName(); } else { #if KContacts_VERSION >= QT_VERSION_CHECK(5, 92, 0) re = address.formatted( KContacts::AddressFormatStyle::MultiLineDomestic, contact.realName(), contact.organization() ); #else re = address.formattedAddress( contact.realName(), contact.organization() ); #endif } return re; } kraft-1.2.2/src/addressprovider.h000066400000000000000000000101661467704360200170000ustar00rootroot00000000000000/*************************************************************************** addressprovider.h ------------------- begin : Fri Mar 4 2011 copyright : (C) 2011 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef ADDRESSPROVIDER_H #define ADDRESSPROVIDER_H #include #include #include // use define CUSTOM_ADDRESS_MARKER to mark the origin of addresses with .insertCustom #define CUSTOM_ADDRESS_MARKER "kraft", "identity_source" class AddressProviderPrivate; class AddressProvider : public QObject { Q_OBJECT public: AddressProvider( QObject* parent = 0 ); enum LookupState { LookupOngoing, LookupStarted, LookupFromCache, LookupNotFound, ItemError, BackendError }; bool backendUp(); QString backendName() const; /** * @brief lookupAddressee - look up an addressee by it's uid. * @param uid - A unique string identifying the contact * * This is asynchron an asynchronous method that returns immediately. * Connect to the signal lookupResult() for the result. * * Make sure to always use a non empty uid. */ LookupState lookupAddressee( const QString& uid ); QString formattedAddress( const KContacts::Addressee& ) const; /** * @brief return an address from cache * @param uid - the unique address uid * * Use this method to get the address if the lookupAddressee method * returned LookupFromCache. In this case, the address is already * known and can be fetched synchronously */ KContacts::Addressee getAddresseeFromCache(const QString& uid); /** * @brief model - returns an Qt model for a tree view. * @return a QAbstractItemModel */ QAbstractItemModel *model(); /** * @brief getAddressee - get the contact from an index * @param indx * * Depending on the underlying model in the private implementation * advantage can be taken from this functions. * Used by the addressselectorwidget * @return the found addressee */ KContacts::Addressee getAddressee(const QModelIndex& indx); KContacts::Addressee getAddressee( int row, const QModelIndex &parent = QModelIndex()); /** * @brief errorMsg - returns the error string for retrieval by uid * @param uid - the UID of the lookup job * * If the lookup job failed for whatever reason, this returns an error * message why, if that was available from the private implementation. * @return QString error message */ QString errorMsg( const QString& uid ); public slots: void slotResetNotFoundCache(); protected slots: void slotErrorMsg(const QString& uid, const QString& msg); void slotAddresseeFound( const QString& uid, const KContacts::Addressee contact); void slotAddresseeNotFound( const QString& uid ); signals: /** * @brief lookupResult - deliver lookup result * @param uid - the uid of the lookup, and the contact * * If the contact is empty, it was simply not found. It can be checked * if there was an error using the errorMsg method for the uid. If there * was no error (errorMsg returns empty string) the addressbook just * did not contain the address. */ void lookupResult( const QString&, const KContacts::Addressee& ); private: QHash _addressCache; AddressProviderPrivate *_d; QHash _errMessages; QSet _notFoundUids; }; #endif // ADDRESSPROVIDER_H kraft-1.2.2/src/addressprovider_akonadi.cpp000066400000000000000000000177721467704360200210330ustar00rootroot00000000000000/*************************************************************************** addressprovider.cpp - ------------------- begin : Fri Mar 4 2011 copyright : (C) 2011 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "addressprovider_akonadi.h" #include #include #ifdef HAVE_AKONADI #include #if AKONADI_VERSION >= QT_VERSION_CHECK(5,20,0) #include #else #define AKONADICONTACT_VERSION AKONADI_VERSION #endif #if AKONADICONTACT_VERSION >= QT_VERSION_CHECK(5, 20, 0) #include #else #include #endif #if AKONADI_VERSION >= QT_VERSION_CHECK(5, 18, 41) #include #include #include #include #include #include #include #include #else #include #include #include #include #include #include #include #include #endif using namespace Akonadi; #endif AddressProviderPrivate::AddressProviderPrivate( QObject *parent ) :QObject( parent ), _akonadiUp(false), mSession(0), mMonitor(0), _model(0) { init(); } bool AddressProviderPrivate::init() { _akonadiUp = false; #ifdef HAVE_AKONADI if ( Akonadi::ServerManager::state() == Akonadi::ServerManager::Broken ) { // should be handled in Akonadi::Control::start(). // See https://invent.kde.org/pim/akonadi/-/merge_requests/189 qDebug() << "Akonadi broken: " << Akonadi::ServerManager::brokenReason(); } else if ( !Akonadi::Control::start( ) ) { qDebug() << "Failed to start Akonadi!"; } else { mSession = new Akonadi::Session( "KraftSession" ); _akonadiUp = true; } #endif return _akonadiUp; } QString AddressProviderPrivate::backendName() const { #ifdef HAVE_AKONADI return QStringLiteral("Akonadi"); #else return QStringLiteral("Akonadi disabled by compile option!"); #endif } bool AddressProviderPrivate::backendUp() { return _akonadiUp; } bool AddressProviderPrivate::isSearchOngoing(const QString& uid) { return mUidSearches.contains(uid); } bool AddressProviderPrivate::lookupAddressee( const QString& uid ) { if( uid.isEmpty() ) { qDebug() << "Invalid: UID to lookup is empty."; return false; } if( mUidSearches.contains( uid ) ) { // search is already running // qDebug () << "Search already underways!";^ return false; } #ifdef HAVE_AKONADI Akonadi::ContactSearchJob *csjob = new Akonadi::ContactSearchJob( this ); csjob->setLimit( 1 ); csjob->setQuery(ContactSearchJob::ContactUid , uid, ContactSearchJob::ExactMatch); csjob->setProperty("UID", uid); connect( csjob, SIGNAL( result( KJob* ) ), this, SLOT( searchResult( KJob* ) ) ); csjob->start(); mUidSearches.insert( uid ); model(); return true; #endif return false; } #ifdef HAVE_AKONADI void AddressProviderPrivate::searchResult( KJob* job ) { if( !job ) return; QString uid; KContacts::Addressee contact; uid = job->property("UID").toString(); if( job->error() ) { // both uid and err message can be empty const QString errMsg = job->errorString(); emit lookupError(uid, errMsg ); // qDebug () << "Address Search job failed: " << job->errorString(); } else { Akonadi::ContactSearchJob *searchJob = qobject_cast( job ); const KContacts::Addressee::List contacts = searchJob->contacts(); KContacts::Addressee::List(); // qDebug () << "Found list of " << contacts.size() << " addresses as search result"; if( contacts.size() > 0 ) { contact = contacts[0]; // qDebug() << "Found uid search job for UID " << uid << " = " << contact.realName(); emit addresseeFound(uid, contact); } else { // qDebug() << "No search result for UID" << uid; emit addresseeNotFound(uid); } } // cleanup if(!uid.isEmpty()) { mUidSearches.remove( uid ); } job->deleteLater(); } #endif QAbstractItemModel* AddressProviderPrivate::model() { if( !_akonadiUp ) { return 0; } #ifdef HAVE_AKONADI Akonadi::ItemFetchScope scope; // fetch all content of the contacts, including images scope.fetchFullPayload( true ); // fetch the EntityDisplayAttribute, which contains custom names and icons scope.fetchAttribute(); if( ! mMonitor ) { mMonitor = new Akonadi::ChangeRecorder; mMonitor->setSession( mSession ); // include fetching the collection tree mMonitor->fetchCollection( true ); // set the fetch scope that shall be used mMonitor->setItemFetchScope( scope ); // monitor all collections below the root collection for changes mMonitor->setCollectionMonitored( Akonadi::Collection::root() ); // list only contacts and contact groups mMonitor->setMimeTypeMonitored( KContacts::Addressee::mimeType(), true ); mMonitor->setMimeTypeMonitored( KContacts::ContactGroup::mimeType(), true ); } if( !_model ) { _model = new Akonadi::ContactsTreeModel( mMonitor ); Akonadi::ContactsTreeModel::Columns columns; columns << Akonadi::ContactsTreeModel::FullName; columns << Akonadi::ContactsTreeModel::HomeAddress; // columns << Akonadi::ContactsTreeModel::FamilyName; // columns << Akonadi::ContactsTreeModel::GivenName; _model->setColumns( columns ); } return _model; #endif return 0; } KContacts::Addressee AddressProviderPrivate::getAddressee(const QModelIndex& indx) { KContacts::Addressee contact; #ifdef HAVE_AKONADI if( indx.isValid() ) { const Akonadi::Item item = indx.data(Akonadi::EntityTreeModel::ItemRole).value(); if (item.hasPayload()) { contact = item.payload(); } } #endif return contact; } KContacts::Addressee AddressProviderPrivate::getAddressee(int row, const QModelIndex &parent) { #ifdef HAVE_AKONADI const QModelIndex index = _model->index(row, 0, parent); return getAddressee(index); #endif return KContacts::Addressee(); } QString AddressProviderPrivate::formattedAddress( const KContacts::Addressee& contact ) const { QString re; KContacts::Address address; address = contact.address( KContacts::Address::Pref ); if( address.isEmpty() ) address = contact.address(KContacts::Address::Work ); if( address.isEmpty() ) address = contact.address(KContacts::Address::Home ); if( address.isEmpty() ) address = contact.address(KContacts::Address::Postal ); if( address.isEmpty() ) { re = contact.realName(); } else { re = address.formattedAddress( contact.realName(), contact.organization() ); } return re; } kraft-1.2.2/src/addressprovider_akonadi.h000066400000000000000000000063011467704360200204620ustar00rootroot00000000000000/*************************************************************************** addressprovider.h ------------------- begin : Fri Mar 4 2011 copyright : (C) 2011 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef ADDRESSPROVIDER_AKONADI_H #define ADDRESSPROVIDER_AKONADI_H #include #include #include #ifdef HAVE_AKONADI #include #include #if AKONADI_VERSION >= QT_VERSION_CHECK(5,20,0) #include #else #define AKONADICONTACT_VERSION AKONADI_VERSION #endif #if AKONADICONTACT_VERSION >= QT_VERSION_CHECK(5, 20, 0) #include #else #include #endif #if AKONADI_VERSION >= QT_VERSION_CHECK(5, 18, 41) #include #include #else #include #include #endif #endif class QAbstractItemModel; class AddressItemModel; // An akonadi based provider. class AddressProviderPrivate : public QObject { Q_OBJECT public: AddressProviderPrivate( QObject* parent = 0 ); // initialize the backend and return true if that worked. bool init(); // returns the result of the init process later on bool backendUp(); QString backendName() const; bool lookupAddressee( const QString& uid ); QString formattedAddress( const KContacts::Addressee& ) const; QAbstractItemModel *model(); KContacts::Addressee getAddressee(int row, const QModelIndex &parent); KContacts::Addressee getAddressee(const QModelIndex& indx); bool isSearchOngoing(const QString& uid); #ifdef HAVE_AKONADI public slots: void searchResult( KJob* ); #endif signals: // void addresseeFound( const QString&, const KContacts::Addressee& ); void addresseeNotFound( const QString& ); // error message when looking up the address for a UID void lookupError( const QString&, const QString&); // emitted when the search is finished, even if there was no result. void finished( int ); private: QSet mUidSearches; bool _akonadiUp; #ifdef HAVE_AKONADI Akonadi::Session *mSession; Akonadi::ChangeRecorder* mMonitor; // FIXME: Must static somehow Akonadi::ContactsTreeModel *_model; #else void *mSession; void *mMonitor; void *_model; #endif }; #endif // ADDRESSPROVIDER_AKONADI_H kraft-1.2.2/src/addressselectordialog.cpp000066400000000000000000000052751467704360200205060ustar00rootroot00000000000000/*************************************************************************** addressselectordialog.cpp - select addressee from address book. ------------------- begin : Sept. 2016 copyright : (C) 2016 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include "kraftsettings.h" #include "addressselectorwidget.h" #include "addressselectordialog.h" AddressSelectorDialog::AddressSelectorDialog( QWidget *parent ) :QDialog(parent) { setModal( true ); const QByteArray geo = QByteArray::fromBase64( KraftSettings::self()->addressSelectDialogSize().toLatin1() ); restoreGeometry(geo); _addressSelectorWidget = new AddressSelectorWidget(this, false); connect(_addressSelectorWidget, SIGNAL(addressSelected(KContacts::Addressee)), SLOT(slotAddresseeSelected(KContacts::Addressee))); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel, this); QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); mainLayout->addWidget(_addressSelectorWidget); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); } void AddressSelectorDialog::slotAddresseeSelected( const KContacts::Addressee& addressee ) { _addressee = addressee; _addressee.insertCustom(CUSTOM_ADDRESS_MARKER, "addressbook"); } KContacts::Addressee AddressSelectorDialog::addressee() { return _addressee; } void AddressSelectorDialog::done(int r) { const QByteArray geo = saveGeometry().toBase64(); KraftSettings::self()->setAddressSelectDialogSize(geo); _addressSelectorWidget->saveState(); QDialog::done(r); } kraft-1.2.2/src/addressselectordialog.h000066400000000000000000000030601467704360200201410ustar00rootroot00000000000000/*************************************************************************** addressselectordialog.h - select addressee from address book. ------------------- begin : Sept. 2012 copyright : (C) 2012 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef ADDRESSSELECTORDIALOG_H #define ADDRESSSELECTORDIALOG_H #include #include class AddressSelectorWidget; using namespace KContacts; class AddressSelectorDialog : public QDialog { Q_OBJECT public: AddressSelectorDialog( QWidget *parent = 0 ); KContacts::Addressee addressee(); void done(int r); private slots: void slotAddresseeSelected(const KContacts::Addressee&); private: AddressSelectorWidget *_addressSelectorWidget; Addressee _addressee; }; #endif // ADDRESSSELECTORDIALOG_H kraft-1.2.2/src/addressselectorwidget.cpp000066400000000000000000000310331467704360200205210ustar00rootroot00000000000000/*************************************************************************** AddressSelectorWidget - Address Selection Widget based on Akonadi ------------------- begin : Jul 2011 copyright : (C) 2011 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "kraftsettings.h" #include "addressselectorwidget.h" #include "addressprovider.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_AKONADI #include #if AKONADI_VERSION >= QT_VERSION_CHECK(5, 18, 41) #include #include #else #include #include #endif #endif /* ==================================================================== */ AddressSortProxyModel::AddressSortProxyModel(AddressProvider *provider, QObject *parent) : QSortFilterProxyModel(parent), _provider(provider) { // setFilterRole(ActivityItemDelegate::ActionTextRole); setFilterKeyColumn(0); } static bool addressMatchesFilter(const KContacts::Address &address, const QString &filterString) { if (address.street().contains(filterString, Qt::CaseInsensitive)) { return true; } if (address.locality().contains(filterString, Qt::CaseInsensitive)) { return true; } if (address.region().contains(filterString, Qt::CaseInsensitive)) { return true; } if (address.postalCode().contains(filterString, Qt::CaseInsensitive)) { return true; } if (address.country().contains(filterString, Qt::CaseInsensitive)) { return true; } if (address.label().contains(filterString, Qt::CaseInsensitive)) { return true; } if (address.postOfficeBox().contains(filterString, Qt::CaseInsensitive)) { return true; } return false; } static bool contactMatchesFilter(const KContacts::Addressee &contact, const QString &filterString) { if (contact.assembledName().contains(filterString, Qt::CaseInsensitive)) { return true; } if (contact.formattedName().contains(filterString, Qt::CaseInsensitive)) { return true; } if (contact.nickName().contains(filterString, Qt::CaseInsensitive)) { return true; } if (contact.birthday().toString().contains(filterString, Qt::CaseInsensitive)) { return true; } const KContacts::Address::List addresses = contact.addresses(); int count = addresses.count(); for (int i = 0; i < count; ++i) { if (addressMatchesFilter(addresses.at(i), filterString)) { return true; } } const KContacts::PhoneNumber::List phoneNumbers = contact.phoneNumbers(); count = phoneNumbers.count(); for (int i = 0; i < count; ++i) { if (phoneNumbers.at(i).number().contains(filterString, Qt::CaseInsensitive)) { return true; } } const QStringList emails = contact.emails(); count = emails.count(); for (int i = 0; i < count; ++i) { if (emails.at(i).contains(filterString, Qt::CaseInsensitive)) { return true; } } const QStringList categories = contact.categories(); count = categories.count(); for (int i = 0; i < count; ++i) { if (categories.at(i).contains(filterString, Qt::CaseInsensitive)) { return true; } } if (contact.mailer().contains(filterString, Qt::CaseInsensitive)) { return true; } if (contact.title().contains(filterString, Qt::CaseInsensitive)) { return true; } if (contact.role().contains(filterString, Qt::CaseInsensitive)) { return true; } if (contact.organization().contains(filterString, Qt::CaseInsensitive)) { return true; } if (contact.department().contains(filterString, Qt::CaseInsensitive)) { return true; } if (contact.note().contains(filterString, Qt::CaseInsensitive)) { return true; } if (contact.url().url().url().contains(filterString, Qt::CaseInsensitive)) { return true; } const QStringList customs = contact.customs(); count = customs.count(); for (int i = 0; i < count; ++i) { if (customs.at(i).contains(filterString, Qt::CaseInsensitive)) { return true; } } return false; } bool contactGroupMatchesFilter(const KContacts::ContactGroup &group, const QString &filterString) { if (group.name().contains(filterString, Qt::CaseInsensitive)) { return true; } const uint count = group.dataCount(); for (uint i = 0; i < count; ++i) { if (group.data(i).name().contains(filterString, Qt::CaseInsensitive)) { return true; } if (group.data(i).email().contains(filterString, Qt::CaseInsensitive)) { return true; } } return false; } bool AddressSortProxyModel::filterAcceptsRow(int row, const QModelIndex &parent) const { KContacts::Addressee contact = _provider->getAddressee(row, parent); if( contact.isEmpty() ) { return true; } else { const QString p = filterRegExp().pattern(); return contactMatchesFilter(contact, p ); } return true; } QVariant AddressSortProxyModel::headerData(int section, Qt::Orientation orientation, int role) const { if ( orientation == Qt::Horizontal && role == Qt::DisplayRole) { if( section == 0 ) { return i18n("Name"); } else if ( section == 1 ) { return i18n("Address"); } } return QVariant(); } /* ------------------------------------------------------------------------------ */ KraftContactViewer::KraftContactViewer(QWidget *parent) :QWidget(parent) #ifdef HAVE_AKONADI , _contactViewer(0) #endif { QVBoxLayout *lay = new QVBoxLayout; lay->setMargin(0); setLayout(lay); #ifdef HAVE_AKONADI #if AKONADICONTACT_VERSION >= QT_VERSION_CHECK(5, 24, 0) _contactViewer = new ContactEditor::ContactViewer; #else _contactViewer = new Akonadi::ContactViewer; #endif _contactViewer->setShowQRCode(false); lay->addWidget(_contactViewer); #endif } void KraftContactViewer::setContact( const KContacts::Addressee& contact) { #ifdef HAVE_AKONADI _contactViewer->setRawContact(contact); #else Q_UNUSED(contact); #endif } /* ------------------------------------------------------------------------------ */ AddressSelectorWidget::AddressSelectorWidget(QWidget *parent, bool /* showText */) : QSplitter(parent), _provider(0) { setupUi(); restoreState(); } AddressSelectorWidget::~AddressSelectorWidget() { } void AddressSelectorWidget::setupUi() { _provider = new AddressProvider(this); setChildrenCollapsible(false); // Left page of the splitter QWidget *leftW = new QWidget; QVBoxLayout *leftLay = new QVBoxLayout; leftW->setLayout(leftLay); this->addWidget(leftW); QHBoxLayout *searchLay = new QHBoxLayout; leftLay->addLayout(searchLay); QLabel *searchLabel = new QLabel(i18n("&Search:")); searchLay->addWidget( searchLabel ); QLineEdit *edit = new QLineEdit; searchLabel->setBuddy(edit); edit->setClearButtonEnabled(true); searchLay->addWidget( edit ); connect(edit, SIGNAL(textChanged(QString)), SLOT(slotFilterTextChanged(QString))); #ifdef HAVE_AKONADI _addressTreeView = new Akonadi::EntityTreeView( this ); #else _addressTreeView = new QTreeView; #endif _addressTreeView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); leftLay->addWidget(_addressTreeView); mProxyModel = new AddressSortProxyModel(_provider, this); mProxyModel->setSourceModel(_provider->model()); _addressTreeView->setModel(mProxyModel); connect(_addressTreeView, SIGNAL(activated(QModelIndex)), this, SLOT(slotAddresseeSelected(QModelIndex))); mProxyModel->sort(0); // the right side QWidget *rightW = new QWidget; QVBoxLayout *rightLay = new QVBoxLayout; rightW->setLayout(rightLay); this->addWidget(rightW); _contactViewer = new KraftContactViewer; _contactViewer->setMinimumWidth(200); rightLay->addWidget(_contactViewer); // Buttons to create and edit QHBoxLayout *hboxBot = new QHBoxLayout; hboxBot->addStretch(4); rightLay->addLayout( hboxBot ); mButEditContact = new QPushButton(i18n("Edit Contact…")); mButEditContact->setToolTip( i18n("Edit the currently selected contact" )); mButEditContact->setEnabled( false ); hboxBot->addWidget( mButEditContact ); QPushButton *butCreateContact = new QPushButton(i18n("New Contact…")); butCreateContact->setToolTip( i18n("Create a new Contact" ) ); hboxBot->addWidget( butCreateContact ); connect(butCreateContact,SIGNAL(clicked()),SLOT(slotCreateNewContact())); connect(mButEditContact, SIGNAL(clicked()),SLOT(slotEditContact())); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } void AddressSelectorWidget::slotFilterTextChanged( const QString& filter) { // qDebug() << "Filter: " << filter; mProxyModel->setFilterRegExp(QRegExp(filter, Qt::CaseInsensitive, QRegExp::RegExp)); // mProxyModel.setFilterFixedString(filter); } void AddressSelectorWidget::restoreState() { const QList sizes = KraftSettings::self()->addressPickerSplitterSize(); setSizes(sizes); const QByteArray state = QByteArray::fromBase64( KraftSettings::self()->addressPickerTreeviewState().toLatin1() ); _addressTreeView->header()->restoreState(state); } void AddressSelectorWidget::saveState() { const QList s = sizes(); KraftSettings::self()->setAddressPickerSplitterSize(s); const QByteArray state = _addressTreeView->header()->saveState().toBase64(); KraftSettings::self()->setAddressPickerTreeviewState(state); } bool AddressSelectorWidget::backendUp() const { bool re = false; if( _provider ) { re = _provider->backendUp(); } return re; } void AddressSelectorWidget::slotCreateNewContact() { #ifdef HAVE_AKONADI #if AKONADICONTACT_VERSION >= QT_VERSION_CHECK(5, 24, 0) _addressEditor = new ContactEditor::ContactEditorDialog(ContactEditor::ContactEditorDialog::EditMode, this ); #else _addressEditor = new Akonadi::ContactEditorDialog(Akonadi::ContactEditorDialog::CreateMode, this ); #endif _addressEditor->show(); #endif } void AddressSelectorWidget::slotAddresseeSelected(QModelIndex index) { if ( index.isValid() ) { QModelIndex sourceIdx = mProxyModel->mapToSource(index); KContacts::Addressee contact = _provider->getAddressee( sourceIdx ); qDebug() << "----------- " << contact.formattedName() << contact.uid(); _contactViewer->setContact(contact); emit addressSelected(contact); mButEditContact->setEnabled( true ); } else { // qDebug () << "No address was selected!"; mButEditContact->setEnabled( false ); } } void AddressSelectorWidget::slotEditContact() { #ifdef HAVE_AKONADI if( _addressTreeView->selectionModel()->hasSelection() ) { QModelIndex index = _addressTreeView->selectionModel()->currentIndex(); if ( index.isValid() ) { const Akonadi::Item item = index.data( Akonadi::EntityTreeModel::ItemRole ).value(); if ( item.isValid() && item.hasPayload() ) { #if AKONADICONTACT_VERSION >= QT_VERSION_CHECK(5, 24, 0) _addressEditor = new ContactEditor::ContactEditorDialog(ContactEditor::ContactEditorDialog::EditMode, this ); #else _addressEditor = new Akonadi::ContactEditorDialog(Akonadi::ContactEditorDialog::CreateMode, this ); #endif _addressEditor->setContact( item ); _addressEditor->show(); } } } #endif } kraft-1.2.2/src/addressselectorwidget.h000066400000000000000000000076331467704360200201770ustar00rootroot00000000000000/*************************************************************************** addressselectorwidget - Address Selection Widget ------------------- begin : Jul 2011 copyright : (C) 2011- by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef ADDRESSSELECTORWIDGET_H #define ADDRESSSELECTORWIDGET_H #include #include #include #ifdef HAVE_AKONADI #include #if AKONADI_VERSION >= QT_VERSION_CHECK(5,20,0) #include #else #define AKONADICONTACT_VERSION AKONADI_VERSION #endif #if AKONADICONTACT_VERSION >= QT_VERSION_CHECK(5, 24, 0) #include #include #elif AKONADICONTACT_VERSION >= QT_VERSION_CHECK(5, 20, 0) #include #include #else #include #include #endif #endif #include #include "addressprovider.h" using namespace KContacts; class QLabel; class QTreeView; class QuickSearchWidget; class QItemSelectionModel; class QuickSearchWidget; class QPushButton; /* =============================================================== */ class KraftContactViewer : public QWidget { Q_OBJECT public: explicit KraftContactViewer(QWidget *parent = 0); void setContact( const KContacts::Addressee& contact); private: #ifdef HAVE_AKONADI #if AKONADICONTACT_VERSION >= QT_VERSION_CHECK(5, 24, 0) ContactEditor::ContactViewer *_contactViewer; #else Akonadi::ContactViewer *_contactViewer; #endif #endif }; class AddressSortProxyModel : public QSortFilterProxyModel { Q_OBJECT public: AddressSortProxyModel(AddressProvider *provider, QObject *parent = 0); QVariant headerData(int section, Qt::Orientation orientation, int role) const; protected: bool filterAcceptsRow(int row, const QModelIndex &parent) const; // bool lessThan(const QModelIndex &left, const QModelIndex &right) const Q_DECL_OVERRIDE; public: QString mFilter; AddressProvider *_provider; }; /* =============================================================== */ class AddressSelectorWidget : public QSplitter { Q_OBJECT public: explicit AddressSelectorWidget(QWidget *parent = 0, bool showText = true ); ~AddressSelectorWidget(); bool backendUp() const; signals: void addressSelected(KContacts::Addressee); public slots: void saveState(); protected slots: void slotCreateNewContact(); void slotEditContact(); void restoreState(); void slotFilterTextChanged( const QString& filter); private slots: void slotAddresseeSelected(QModelIndex index); private: void setupUi(); QPushButton *mButEditContact; AddressProvider *_provider; AddressSortProxyModel *mProxyModel; QTreeView *_addressTreeView; KraftContactViewer *_contactViewer; #ifdef HAVE_AKONADI #if AKONADICONTACT_VERSION >= QT_VERSION_CHECK(5, 24, 0) ContactEditor::ContactEditorDialog *_addressEditor; #else Akonadi::ContactEditorDialog *_addressEditor; #endif #endif }; #endif // AKONADIADDRESSSELECTOR_H kraft-1.2.2/src/addresstemplateprovider.cpp000066400000000000000000000050621467704360200210660ustar00rootroot00000000000000/*************************************************************************** addresstemplateprovider - template provider class for addresses ------------------- begin : Jun 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include "addresstemplateprovider.h" #include "texteditdialog.h" #include "doctext.h" #include "defaultprovider.h" AddressTemplateProvider::AddressTemplateProvider( QWidget *parent ) :TemplateProvider( parent ), mParent( parent ) { } void AddressTemplateProvider::slotNewTemplate() { // qDebug () << "SlotNewTemplate for addresses called!"; KRun::runCommand( QString::fromLatin1( "kaddressbook --new-contact" ), QString::fromLatin1("kaddressbook" ), "address", mParent, "" ); } void AddressTemplateProvider::slotEditTemplate() { // qDebug () << "SlotEditTemplate called!"; KRun::runCommand( QString::fromLatin1( "kaddressbook --uid %1" ).arg( mCurrentAddress.uid() ), QString::fromLatin1("kaddressbook" ), "address", mParent, "" ); } void AddressTemplateProvider::slotDeleteTemplate() { } void AddressTemplateProvider::slotSetCurrentAddress( const Addressee& adr ) { // qDebug () << "Current Address was set to " << adr.realName(); mCurrentAddress = adr; } void AddressTemplateProvider::slotTemplateToDocument() { if( mCurrentAddress.isEmpty() ) { // qDebug () << "Current address is empty, that should not happen"; return; } // qDebug () << "Moving address of " << mCurrentAddress.realName() << " to document"; emit addressToDocument( mCurrentAddress ); } void AddressTemplateProvider::slotInsertTemplateToDocument() { // It does not really make sense to insert an address text while not replacing it completely. } kraft-1.2.2/src/addresstemplateprovider.h000066400000000000000000000033531467704360200205340ustar00rootroot00000000000000/*************************************************************************** addresstemplateprovider - template provider class for address data ------------------- begin : Jun 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef ADDRESSTEMPLATEPROVIDER_H #define ADDRESSTEMPLATEPROVIDER_H #include #include "templateprovider.h" #include "doctext.h" #include using namespace KContacts; class AddressTemplateProvider : public TemplateProvider { Q_OBJECT public: AddressTemplateProvider( QWidget* ); signals: void newAddress( Addressee ); void addressToDocument( const Addressee& ); public slots: void slotNewTemplate() override; void slotEditTemplate() override; void slotDeleteTemplate() override; void slotTemplateToDocument() override; void slotInsertTemplateToDocument() override; void slotSetCurrentAddress( const Addressee& ); private: Addressee mCurrentAddress; QWidget *mParent; }; #endif kraft-1.2.2/src/alldocsview.cpp000066400000000000000000000345351467704360200164550ustar00rootroot00000000000000/*************************************************************************** alldocsview.cpp ------------------- begin : Wed Mar 15 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "models/documentmodel.h" #include "models/documentproxymodels.h" #include "filterheader.h" #include "alldocsview.h" #include "documentman.h" #include "docguardedptr.h" #include "kraftdoc.h" #include "kraftdb.h" #include "defaultprovider.h" #include "docdigestdetailview.h" #include "kraftsettings.h" AllDocsView::AllDocsView( QWidget *parent ) : QWidget( parent ), mTableModel(0), mDateModel(0) { QVBoxLayout *box = new QVBoxLayout; setLayout( box ); box->setMargin( 0 ); box->setSpacing( 0 ); _searchLine = new QLineEdit(this); _searchLine->setClearButtonEnabled(true); _searchLine->setMinimumWidth(200); connect( _searchLine, SIGNAL(textChanged(QString)), this, SLOT(slotSearchTextChanged(QString)) ); QComboBox *filterCombo = new QComboBox; filterCombo->addItem(i18n("All documents")); filterCombo->addItem(i18n("Documents of last week")); filterCombo->addItem(i18n("Documents of last month")); // filterCombo->addItem("Document Type"); connect( filterCombo, SIGNAL(activated(int)), this, SLOT(slotAmountFilterChanged(int))); QHBoxLayout *hbox = new QHBoxLayout; QLabel *l1 = new QLabel(i18n("&Show: ")); l1->setBuddy(filterCombo); hbox->addWidget(l1); hbox->addWidget(filterCombo); hbox->addStretch( 2 ); QLabel *lab = new QLabel; lab->setText( i18n("&Search: ") ); lab->setBuddy( _searchLine); hbox->addWidget( lab ); hbox->addWidget( _searchLine); box->addLayout( hbox ); QFrame *f = new QFrame; f->setLineWidth( 2 ); f->setMidLineWidth( 3 ); f->setFrameStyle( QFrame::HLine | QFrame::Raised ); f->setFixedHeight( 10 ); box->addWidget( f ); box->addWidget(initializeTreeWidget()); } AllDocsView::~AllDocsView() { const QByteArray state = _tableView->horizontalHeader()->saveState().toBase64(); KraftSettings::self()->setDigestListColumnsAll( state ); const QByteArray state1 = _dateView->header()->saveState().toBase64(); KraftSettings::self()->setDigestListColumnsTime(state1); KraftSettings::self()->save(); } void AllDocsView::slotAmountFilterChanged(int entryNo) { int num = -1; if( entryNo == 1 ) { num = 7; } else if( entryNo == 2 ) { num = 31; } mTableModel->setMaxRows(num); mDateModel->setMaxRows(num); } void AllDocsView::slotSearchTextChanged(const QString& newStr ) { mTableModel->setFilterRegExp(newStr); mDateModel->setFilterRegExp(newStr); } QWidget* AllDocsView::initializeTreeWidget() { //Note: Currently building the views is done in slotBuildView() that is called from the portal // because otherwise we'd access the database before it is initialized _tableView = new QTableView; _dateView = new QTreeView; //Initialise mAllMenu = new QMenu( _tableView ); mAllMenu->setTitle( i18n("Document Actions")); //Add treewidgets to the toolbox: All docs view QVBoxLayout *vb1 = new QVBoxLayout; vb1->setMargin(0); _stack = new QStackedWidget(this); _stack->addWidget(_tableView); _stack->addWidget(_dateView); vb1->addWidget( _stack ); mAllViewDetails = new DocDigestDetailView; connect( mAllViewDetails, &DocDigestDetailView::showLastPrint, this, &AllDocsView::slotOpenLastPrinted); connect( mAllViewDetails, &DocDigestDetailView::exportXRechnung , this, &AllDocsView::slotExportXRechnung); vb1->addWidget( mAllViewDetails ); QWidget *w = new QWidget; w->setLayout(vb1); // return w; } void AllDocsView::setView( ViewType type ) { // change the document listing widget QModelIndex current; if( type == FlatList) { _stack->setCurrentIndex(0); current = _tableView->currentIndex(); } else { _stack->setCurrentIndex(1); current = _dateView->currentIndex(); } // clear the details view mAllViewDetails->slotClearView(); if( current.isValid() > 0 ) { slotCurrentChanged(current, QModelIndex()); } else { // workaround, not cool. mCurrentlySelected = QModelIndex(); } } void AllDocsView::slotBuildView() { const QByteArray headerStateTable = QByteArray::fromBase64( KraftSettings::self()->digestListColumnsAll().toLatin1() ); const QByteArray headerStateDate = QByteArray::fromBase64( KraftSettings::self()->digestListColumnsTime().toLatin1() ); mDateModel = new DocumentFilterModel(-1, this); mDateModel->setEnableTreeview(true); mTableModel = new DocumentFilterModel(-1, this); mTableModel->setEnableTreeview(false); _tableView->setModel(mTableModel); _dateView->setModel(mDateModel); _tableView->sortByColumn(DocumentModel::Document_CreationDateRaw, Qt::DescendingOrder); _tableView->verticalHeader()->hide(); _tableView->setSortingEnabled(true); _tableView->horizontalHeader()->setSectionsMovable( true ); _tableView->horizontalHeader()->setSortIndicatorShown( true ); _tableView->horizontalHeader()->restoreState( headerStateTable ); _tableView->setSelectionBehavior( QAbstractItemView::SelectRows ); _tableView->setShowGrid( false ); _tableView->hideColumn( DocumentModel::Document_Id ); _tableView->hideColumn( DocumentModel::Document_ClientId ); _tableView->hideColumn( DocumentModel::Document_ClientAddress ); _tableView->showColumn( DocumentModel::Document_ClientName ); _tableView->showColumn( DocumentModel::Document_CreationDateRaw); _tableView->hideColumn( DocumentModel::Document_CreationDate); _tableView->hideColumn( DocumentModel::Document_Id_Raw); _tableView->hideColumn( DocumentModel::Treestruct_Type); _tableView->hideColumn( DocumentModel::Treestruct_Month); _tableView->hideColumn( DocumentModel::Treestruct_Year); _dateView->header()->restoreState( headerStateDate ); _dateView->hideColumn( DocumentModel::Document_ClientId ); _dateView->hideColumn( DocumentModel::Document_ClientAddress ); _dateView->showColumn( DocumentModel::Document_ClientName ); _dateView->showColumn( DocumentModel::Document_CreationDateRaw); _dateView->hideColumn( DocumentModel::Document_CreationDate); _dateView->hideColumn( DocumentModel::Document_Id_Raw); _dateView->hideColumn( DocumentModel::Treestruct_Type); _dateView->hideColumn( DocumentModel::Treestruct_Month); _dateView->hideColumn( DocumentModel::Treestruct_Year); _dateView->setSelectionBehavior( QAbstractItemView::SelectRows ); //Initialize common style options connect( _tableView->selectionModel(), SIGNAL( currentRowChanged(QModelIndex,QModelIndex) ), this, SLOT(slotCurrentChanged(QModelIndex,QModelIndex))); connect( _dateView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(slotCurrentChanged(QModelIndex,QModelIndex))); connect( _tableView, SIGNAL( doubleClicked(QModelIndex) ), this, SLOT( slotDocOpenRequest(QModelIndex) ) ); connect( _dateView, SIGNAL( doubleClicked(QModelIndex) ), this, SLOT( slotDocOpenRequest(QModelIndex) ) ); _tableView->setAlternatingRowColors( true ); _dateView->setAlternatingRowColors(false); _tableView->setSelectionMode( QAbstractItemView::SingleSelection ); _tableView->setEditTriggers( QAbstractItemView::NoEditTriggers ); _dateView->setEditTriggers( QAbstractItemView::NoEditTriggers ); _dateView->setExpandsOnDoubleClick( false ); // expand the current year and month QModelIndex startIdx = mDateModel->index(0,DocBaseModel::Treestruct_Year, QModelIndex()); QModelIndexList yearIndexes = mDateModel->match(startIdx, Qt::DisplayRole, QVariant(QDate::currentDate().year()) ); if( yearIndexes.size() > 0 ) { QModelIndex yearIndx = mDateModel->index(yearIndexes.first().row(), 0, yearIndexes.first().parent()); _dateView->setExpanded(yearIndx,true); QModelIndex startIdxM = mDateModel->index(0, DocBaseModel::Treestruct_Month, yearIndx); QModelIndexList monthIndexes = mDateModel->match(startIdxM, Qt::DisplayRole, QVariant(QDate::currentDate().month()) ); if( monthIndexes.size() > 0 ) { QModelIndex mIdx = monthIndexes.first(); QModelIndex rIdx = mDateModel->index(mIdx.row(), 0, mIdx.parent()); _dateView->setExpanded(rIdx, true); } } connect(KraftDB::self(), &KraftDB::docDatabaseChanged, this, &AllDocsView::slotUpdateView); } void AllDocsView::slotUpdateView() { QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) ); static_cast(mDateModel->sourceModel())->resetData(); static_cast(mTableModel->sourceModel())->resetData(); mCurrentlySelected = QModelIndex(); QApplication::restoreOverrideCursor(); } void AllDocsView::contextMenuEvent( QContextMenuEvent * event ) { mAllMenu->popup( event->globalPos() ); } void AllDocsView::slotExportXRechnung() { // qDebug () << "slotOpenLastPrinted hit! "; emit exportXRechnungArchivedDocument( mLatestArchivedDigest ); } void AllDocsView::slotOpenLastPrinted( ) { // qDebug () << "slotOpenLastPrinted hit! "; emit openArchivedDocument( mLatestArchivedDigest ); } ArchDocDigest AllDocsView::currentLatestArchivedDoc() const { return mLatestArchivedDigest; } void AllDocsView::slotDocOpenRequest( QModelIndex index ) { Q_UNUSED(index) const QString id = currentDocumentId(); emit openDocument( id ); } int AllDocsView::currentDocumentRow() const { return mCurrentlySelected.row(); } QString AllDocsView::currentDocumentId( ) const { bool isDoc = true; DocBaseModel *model; if( _stack->currentIndex() == 0 ) { model = static_cast( mTableModel->sourceModel() ); } else { model = static_cast( mDateModel->sourceModel() ); isDoc = model->isDocument(mCurrentlySelected); } QString id; if( isDoc ) { QModelIndex idIndx = model->index(mCurrentlySelected.row(), DocumentModel::Document_Id_Raw, mCurrentlySelected.parent()); id = idIndx.data( Qt::DisplayRole ).toString(); } return id; } void AllDocsView::slotCurrentChanged( QModelIndex index, QModelIndex previous ) { Q_UNUSED(previous); if(index.isValid()) { DocBaseModel *model; bool isDoc = true; bool isDateModel= false; if( _stack->currentIndex() == 0 ) { mCurrentlySelected = mTableModel->mapToSource(index); model = static_cast( mTableModel->sourceModel() ); } else { isDateModel = true; mCurrentlySelected = mDateModel->mapToSource(index); model = static_cast( mDateModel->sourceModel() ); isDoc = model->isDocument(mCurrentlySelected); } /* get the corresponding document id */ if( isDoc ) { DocDigest digest; QModelIndex idIndx = model->index(mCurrentlySelected.row(), DocumentModel::Document_Ident, mCurrentlySelected.parent()); digest = model->digest( mCurrentlySelected ); emit docSelected(digest); mAllViewDetails->slotShowDocDetails( digest ); if( digest.archDocDigestList().size() > 0 ) { mLatestArchivedDigest = digest.archDocDigestList()[0]; } else { mLatestArchivedDigest = ArchDocDigest(); } } else { const QModelIndex idIndx = model->index(mCurrentlySelected.row(), DocumentModel::Treestruct_Type, mCurrentlySelected.parent()); int type = idIndx.data( Qt::DisplayRole ).toInt(); if( isDateModel) { const QModelIndex yIndx = model->index(mCurrentlySelected.row(), DocumentModel::Treestruct_Year, mCurrentlySelected.parent()); int year = yIndx.data( Qt::DisplayRole ).toInt(); if( type == AbstractIndx::MonthType ) { const QModelIndex mIndx = model->index(mCurrentlySelected.row(), DocumentModel::Treestruct_Month, mCurrentlySelected.parent()); int month = mIndx.data( Qt::DisplayRole ).toInt(); mAllViewDetails->slotShowMonthDetails(year, month); } else if( type == AbstractIndx::YearType ) { mAllViewDetails->slotShowYearDetails(year); } } } } else { // qDebug () << "Got invalid index, clearing digest view."; emit docSelected( DocDigest() ); mAllViewDetails->slotClearView(); } //// qDebug () << "Supposed row: " << sourceIndex.row() << " Supposed ID: " << DocumentModel::self()->data(sourceIndex, Qt::DisplayRole); } QVector AllDocsView::contextMenus() { QVector menus; menus.append( mAllMenu); return menus; } kraft-1.2.2/src/alldocsview.h000066400000000000000000000056751467704360200161250ustar00rootroot00000000000000/*************************************************************************** alldocsview.h - digest view of all docs with filter ------------------- begin : Sat Mar 11 2017 copyright : (C) 2017 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef ALLDOCSVIEW_H #define ALLDOCSVIEW_H #include #include #include #include #include #include #include "models/datemodel.h" #include "docdigest.h" #include "docguardedptr.h" #include "models/documentproxymodels.h" class QPushButton; class dbID; class ArchDocDigest; class QContextMenuEvent; class QToolBox; class DocDigestDetailView; class AllDocsView : public QWidget { Q_OBJECT public: typedef enum {FlatList, TreeView} ViewType; AllDocsView( QWidget *parent = 0 ); ~AllDocsView(); int currentDocumentRow() const; QString currentDocumentId( ) const; ArchDocDigest currentLatestArchivedDoc() const; QVector contextMenus(); public slots: void slotBuildView(); void slotUpdateView(); void setView(ViewType type); protected: void contextMenuEvent( QContextMenuEvent* ); QWidget *initializeTreeWidget(); protected slots: void slotDocOpenRequest( QModelIndex ); void slotCurrentChanged( QModelIndex, QModelIndex ); void slotOpenLastPrinted(); void slotExportXRechnung(); void slotSearchTextChanged(const QString& newStr ); void slotAmountFilterChanged(int entryNo); signals: void createDocument(); void openDocument( const QString& ); void viewDocument( const QString& ); void copyDocument( const QString& ); void docSelected( const DocDigest& ); void openArchivedDocument( const ArchDocDigest& ); void exportXRechnungArchivedDocument(const ArchDocDigest&); private: QTableView *_tableView; QTreeView *_dateView; QStackedWidget *_stack; DocDigestDetailView *mAllViewDetails; QModelIndex mCurrentlySelected; DocumentFilterModel *mTableModel; DocumentFilterModel *mDateModel; QMenu *mAllMenu; QPushButton *mNewDocButton; ArchDocDigest mLatestArchivedDigest; QLineEdit *_searchLine; }; #endif kraft-1.2.2/src/archdoc.cpp000066400000000000000000000206411467704360200155350ustar00rootroot00000000000000/*************************************************************************** ArchDoc.cpp - an archived document. ------------------- begin : Mit Dez 31 19:24:05 CET 2003 copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include // application specific includes #include "archiveman.h" #include "archdoc.h" #include "documentman.h" #include "kraftdb.h" #include "defaultprovider.h" #include "kraftsettings.h" #include "format.h" namespace { QString multilineHtml( const QString& str ) { QString re {str.toHtmlEscaped()}; re.replace( '\n', "
              "); return re; } } // end namespace ArchDoc::ArchDoc() : mAttributes( QLatin1String("ArchDoc")) { } ArchDoc::ArchDoc( const dbID& id ) : mAttributes( QLatin1String("ArchDoc")) { /* load archive from database */ loadFromDb( id ); } QString ArchDoc::docIdentifier() const { QString re = docTypeStr(); return i18n("%1 for %2 (ID %3)", re, ident() ); } QString ArchDoc::dateStr() const { return Format::toDateString(mDate, KraftSettings::self()->dateFormat()); } QString ArchDoc::dateStrISO() const { return mDate.toString("yyyy-MM-dd"); } QString ArchDoc::preText() const { return mPreText; } QString ArchDoc::preTextHtml() const { return multilineHtml(mPreText); } QString ArchDoc::postText() const { return mPostText; } QString ArchDoc::postTextHtml() const { return multilineHtml(mPostText); } Geld ArchDoc::nettoSum() const { const Geld g = positions().sumPrice(); return g; } Geld ArchDoc::bruttoSum() const { Geld g = nettoSum(); const Geld ts = taxSum(); g += ts; return g; } Geld ArchDoc::taxSum() const { const Geld g = positions().taxSum(); return g; } Geld ArchDoc::fullTaxSum() const { return positions().fullTaxSum(); } Geld ArchDoc::reducedTaxSum() const { return positions().reducedTaxSum(); } QString ArchDoc::fullTaxPercentStr() const { return Format::localeDoubleToString(mTax, *DefaultProvider::self()->locale()); } QString ArchDoc::reducedTaxPercentStr() const { return Format::localeDoubleToString(mReducedTax, *DefaultProvider::self()->locale()); } QString ArchDoc::taxPercentStr() const { DocPositionBase::TaxType tt = mPositions.listTaxation(); if (tt == DocPositionBase::TaxType::TaxFull) { return fullTaxPercentStr(); } else if (tt == DocPositionBase::TaxType::TaxReduced) { return reducedTaxPercentStr(); } return QString(); } QString ArchDoc::taxPercentNum() const { DocPositionBase::TaxType tt = mPositions.listTaxation(); if (tt == DocPositionBase::TaxType::TaxFull) { return fullTaxPercentNum(); } else if (tt == DocPositionBase::TaxType::TaxReduced) { return reducedTaxPercentNum(); } return QString(); } QString ArchDoc::fullTaxPercentNum() const { double t = tax(); return QString::number(t, 'f', 2); } QString ArchDoc::reducedTaxPercentNum() const { double t = reducedTax(); return QString::number(t, 'f', 2); } double ArchDoc::tax() const { return mTax; } double ArchDoc::reducedTax() const { return mReducedTax; } void ArchDoc::loadFromDb( dbID id ) { mArchDocID = id; QSqlQuery q; q.prepare("SELECT archDocID, ident, docType, clientAddress, clientUid, " // pos 0..4 "salut, goodbye, printDate, date, pretext, posttext, country, language, " // pos 5..12 "projectLabel, predecessor, tax, reducedTax, state from archdoc WHERE archDocID=:id" ); // pos 13..17 q.bindValue(":id", id.toInt()); q.exec(); // qDebug () << "Loading document id " << id.toString(); if( q.next()) { QString docID; QString country; QString lang; docID = q.value( 0 ).toString(); mIdent = q.value( 1 ).toString(); mDocTypeStr = q.value( 2 ).toString(); mAddress = q.value( 3 ).toString(); mClientUid = q.value( 4 ).toString(); mSalut = q.value( 5 ).toString(); mGoodbye = q.value( 6 ).toString(); QVariant v = q.value( 7 ); mPrintDate = v.toDateTime(); mDate = q.value( 8 ).toDate(); mPreText = KraftDB::self()->mysqlEuroDecode( q.value( 9 ).toString() ); mPostText = KraftDB::self()->mysqlEuroDecode( q.value( 10 ).toString() ); country = q.value( 11 ).toString(); lang = q.value( 12 ).toString(); mProjectLabel = q.value( 13 ).toString(); mPredecessor = q.value( 14 ).toString(); mTax = q.value( 15 ).toDouble(); mReducedTax = q.value( 16 ).toDouble(); mState = q.value( 17 ).toInt(); loadItems( docID ); mAttributes.load(id); } else { // qDebug () << "ERR: Could not load archived doc with id " << id.toString(); } } void ArchDoc::loadItems( const QString& archDocId ) { mPositions.clear(); if ( archDocId.isEmpty() /* || ! archDocId.isNum() */ ) { // qDebug () << "ArchDocId is not crappy: " << archDocId; return; } QSqlQuery q; q.prepare("SELECT archPosID, archDocID, ordNumber, kind, postype, text, amount, " // pos 0..6 "unit, price, overallPrice, taxType FROM archdocpos WHERE archDocID=:id ORDER BY ordNumber"); // pos 7..10 q.bindValue(":id", archDocId); if( !q.exec() ) { qDebug() << "Error: " << q.lastError().nativeErrorCode(); } mPositions.setTaxes(mTax, mReducedTax); while( q.next() ) { ArchDocPosition pos; pos.mPosNo = q.value( 2 ).toString(); pos.mKind = q.value( 3 ).toString(); pos.mText = q.value( 5 ).toString(); pos.mAmount = q.value( 6 ).toDouble(); pos.mUnit = q.value( 7 ).toString(); pos.mUnitPrice = Geld( q.value( 8 ).toDouble() ); pos.mOverallPrice = q.value( 9 ).toDouble(); int tt = q.value( 10 ).toInt(); if ( tt == 1 ) pos.mTaxType = DocPositionBase::TaxNone; else if ( tt == 2 ) pos.mTaxType = DocPositionBase::TaxReduced; else if ( tt == 3 ) pos.mTaxType = DocPositionBase::TaxFull; mPositions.append( pos ); } } QList ArchDoc::itemslist() const { return mPositions; } QDateTime ArchDoc::sentOutDate() { QDateTime re; if ( mAttributes.hasAttribute( SentOutDateC ) ) { re = mAttributes["sentOutDate"].value().toDateTime(); } return re; } void ArchDoc::setSentOutDate( const QDateTime& dt ) { QString attName(SentOutDateC); if( dt.isValid() ) { Attribute att(attName); att.setPersistant(true); att.setValue(dt); mAttributes[attName] = att; } else { mAttributes.markDelete(attName); } mAttributes.save(mArchDocID); } ArchDocDigest ArchDoc::toDigest() const { return ArchDocDigest(mPrintDate, mState, mIdent, mDocTypeStr, mArchDocID); } bool ArchDoc::isInvoice() { bool re{false}; re = true; return re; } /* ###################################################################### */ ArchDocDigest::ArchDocDigest() { } ArchDocDigest::ArchDocDigest(QDateTime dt, int s, const QString& ident, const QString & docType, dbID id ) : mPrintDate( dt ), mState( s ), mArchDocId( id ), mIdent( ident ), mDocTypeStr(docType) { } ArchDocDigest::~ArchDocDigest() { } QString ArchDocDigest::pdfArchiveFileName() const { const QString outputDir = ArchiveMan::self()->pdfBaseDir(); const QString filename = ArchiveMan::self()->archiveFileName(archDocIdent(), archDocId().toString(), "pdf" ); const QString file = QString( "%1/%2" ).arg( outputDir ).arg( filename ); return file; } /* ###################################################################### */ kraft-1.2.2/src/archdoc.h000066400000000000000000000170101467704360200151760ustar00rootroot00000000000000/*************************************************************************** archdoc.h - ------------------- begin : Sep 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef ARCHDOC_H #define ARCHDOC_H // include files for QT #include #include #include #include #include "archdocposition.h" #include "geld.h" #include "dbids.h" class QLocale; class AttributeMap; class ArchDocDigest { public: /** Constructor for the fileclass of the application */ ArchDocDigest(); ArchDocDigest( QDateTime, int, const QString&, const QString&, dbID ); /** Destructor for the fileclass of the application */ virtual ~ArchDocDigest(); QDateTime printDate() const { return mPrintDate; } int archDocState() const { return mState; } dbID archDocId() const { return mArchDocId; } QString archDocIdent() const { return mIdent; } QString docTypeStr() const { return mDocTypeStr; } QString pdfArchiveFileName() const; protected: QDateTime mPrintDate; int mState; dbID mArchDocId; QString mIdent; QString mDocTypeStr; }; class ArchDoc: public QObject, public ArchDocDigest { Q_OBJECT Q_PROPERTY(QString docType READ docTypeStr) Q_PROPERTY(QString address READ address) Q_PROPERTY(QString clientUid READ clientUid) Q_PROPERTY(QString ident READ ident) Q_PROPERTY(QString salut READ salut) Q_PROPERTY(QString goodbye READ goodbye) Q_PROPERTY(QString preText READ preText) Q_PROPERTY(QString preTextHtml READ preTextHtml) Q_PROPERTY(QString postText READ postText) Q_PROPERTY(QString postTextHtml READ postTextHtml) Q_PROPERTY(QString projectLabel READ projectLabel) Q_PROPERTY(QString predecessor READ predecessor) Q_PROPERTY(QString docIDStr READ archDocIdStr) Q_PROPERTY(QString docIdentifier READ docIdentifier) Q_PROPERTY(QString dateStr READ dateStr) Q_PROPERTY(QString dateStrISO READ dateStrISO) Q_PROPERTY(QString nettoSumStr READ nettoSumStr) Q_PROPERTY(QString nettoSumNum READ nettoSumNum) Q_PROPERTY(QString bruttoSumStr READ bruttoSumStr) Q_PROPERTY(QString bruttoSumNum READ bruttoSumNum) Q_PROPERTY(QString taxSumStr READ taxSumStr) Q_PROPERTY(QString taxSumNum READ taxSumNum) Q_PROPERTY(QString fullTaxSumStr READ fullTaxSumStr) Q_PROPERTY(QString fullTaxSumNum READ fullTaxSumNum) Q_PROPERTY(QString reducedTaxSumStr READ reducedTaxSumStr) Q_PROPERTY(QString reducedTaxSumNum READ reducedTaxSumNum) Q_PROPERTY(QString dueDateStrISO READ dueDate) Q_PROPERTY(QString buyerReference READ buyerRef) Q_PROPERTY(QString fullTaxPercentNum READ fullTaxPercentNum) Q_PROPERTY(QString fullTaxPercentStr READ fullTaxPercentStr) Q_PROPERTY(QString reducedTaxPercentNum READ reducedTaxPercentNum) Q_PROPERTY(QString reducedTaxPercentStr READ reducedTaxPercentStr) Q_PROPERTY(QString taxPercentStr READ taxPercentStr) Q_PROPERTY(QString taxPercentNum READ taxPercentNum) Q_PROPERTY(QString taxMarkerFull READ taxMarkerFull) Q_PROPERTY(QString taxMarkerReduced READ taxMarkerReduced) Q_PROPERTY(QList items READ itemslist) Q_PROPERTY(bool hasIndividualTaxation READ hasIndividualTaxation) Q_PROPERTY(bool isInvoice READ isInvoice) public: /** Constructor for the fileclass of the application */ ArchDoc(); ArchDoc( const dbID& ); /** Destructor for the fileclass of the application */ virtual ~ArchDoc() {}; ArchDocPositionList positions() const { return mPositions; } QList itemslist() const; QDate date() const { return mDate; } QString dateStr() const; QString dateStrISO() const; QString address() const { return mAddress; } QString clientUid() const { return mClientUid; } QString ident() const { return mIdent; } QString salut() const { return mSalut; } QString goodbye() const { return mGoodbye; } QString preText() const; QString preTextHtml() const; QString postText() const; QString postTextHtml() const; QString projectLabel() const { return mProjectLabel; } QString predecessor() const { return mPredecessor; } QString archDocIdStr() const { return archDocId().toString(); } QString docIdentifier() const; Geld nettoSum() const; QString nettoSumStr() const { return nettoSum().toLocaleString(); } QString nettoSumNum() const { return nettoSum().toNumberString(); } Geld bruttoSum() const; QString bruttoSumStr() const { return bruttoSum().toLocaleString(); } QString bruttoSumNum() const { return bruttoSum().toNumberString(); } Geld taxSum() const; QString taxSumStr() const { return taxSum().toLocaleString(); } QString taxSumNum() const { return taxSum().toNumberString(); } Geld fullTaxSum() const; QString fullTaxSumStr() const { return fullTaxSum().toLocaleString(); } QString fullTaxSumNum() const { return fullTaxSum().toNumberString(); } Geld reducedTaxSum() const; QString reducedTaxSumStr() const { return reducedTaxSum().toLocaleString(); } QString reducedTaxSumNum() const { return reducedTaxSum().toNumberString(); } QString fullTaxPercentNum() const; QString fullTaxPercentStr() const; QString reducedTaxPercentNum() const; QString reducedTaxPercentStr() const; QString taxPercentStr() const; QString taxPercentNum() const; QString dueDate() const { return _dueDate.toString("yyyy-MM-dd"); } QString buyerRef() const { return _buyerRef; } void setDueDate(const QDate& d) { _dueDate = d; } void setBuyerRef(const QString& br) { _buyerRef = br; } static QString taxMarkerNoTax() { return QStringLiteral("1"); } static QString taxMarkerReduced() { return QStringLiteral("2"); } static QString taxMarkerFull() { return QString(); } bool hasIndividualTaxation() const { return mPositions.hasIndividualTaxes(); } double tax() const; double reducedTax() const; ArchDocDigest toDigest() const; // when the document was sent to the customer. QDateTime sentOutDate(); void setSentOutDate( const QDateTime& dt ); void loadFromDb( dbID ); bool isInvoice(); const QString SentOutDateC {"SentOutDate"}; protected: void loadItems( const QString& ); dbID mArchDocID; QString mAddress; QString mClientUid; QString mPreText; QString mPostText; QString mSalut; QString mGoodbye; QString mIdent; QString mProjectLabel; QString mPredecessor; AttributeMap mAttributes; QString _buyerRef; QDate _dueDate; double mTax; double mReducedTax; QDate mDate; ArchDocPositionList mPositions; }; #endif // ARCHDOC_H kraft-1.2.2/src/archdocposition.cpp000066400000000000000000000121531467704360200173210ustar00rootroot00000000000000/*************************************************************************** archdocposition.cpp - a position in an archived document ------------------- begin : Sep. 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include // application specific includes #include "einheit.h" #include "geld.h" #include "archdocposition.h" #include "archdoc.h" #include "unitmanager.h" /** @author Klaas Freitag */ ArchDocPosition::ArchDocPosition() : mAmount( 0 ) { } Geld ArchDocPosition::nettoPrice() const { return mOverallPrice; } Geld ArchDocPosition::fullTax( double fullTax ) const { Geld tax; if ( mTaxType == DocPositionBase::TaxFull ) { tax = mOverallPrice * fullTax; } return tax / 100.0; } Geld ArchDocPosition::reducedTax( double reducedTax ) const { Geld tax; if ( mTaxType == DocPositionBase::TaxReduced ) { tax = mOverallPrice * reducedTax; } return tax / 100.0; } Geld ArchDocPosition::tax( double fullTax, double reducedTax ) const { Geld tax; if ( mTaxType == DocPositionBase::TaxFull ) { tax = mOverallPrice * fullTax; } else if ( mTaxType == DocPositionBase::TaxReduced ) { tax = mOverallPrice * reducedTax; } return tax / 100.0; } QString ArchDocPosition::taxMarkerHelper() const { QString re; if ( mTaxType == DocPositionBase::TaxReduced ) { re = ArchDoc::taxMarkerReduced(); } else if ( mTaxType == DocPositionBase::TaxNone) { re = ArchDoc::taxMarkerNoTax(); } else if ( mTaxType == DocPositionBase::TaxFull) { re = ArchDoc::taxMarkerFull(); } return re; } QString ArchDocPosition::htmlText(const QString& paraStyle) const { QString re; QString style( paraStyle ); if ( style.isEmpty() ) style = QStringLiteral("text"); // Keep empty parts allows multiple newlines here const QStringList li = mText.toHtmlEscaped().split( "\n", QString::KeepEmptyParts ); re = li.join("
              "); return re; } QString ArchDocPosition::unitEC20() const { const QString ece20 = UnitManager::self()->getECE20(mUnit); return ece20; } // ================================================================== ArchDocPositionList::ArchDocPositionList() : QList() { } Geld ArchDocPositionList::sumPrice() const { Geld g; const_iterator it; for ( it = begin(); it != end(); ++it ) { g += ( *it ).nettoPrice(); } return g; } Geld ArchDocPositionList::taxSum() const { Geld allTaxSum = fullTaxSum(); allTaxSum += reducedTaxSum(); return allTaxSum; } Geld ArchDocPositionList::fullTaxSum() const { Geld g; const_iterator it; for ( it = begin(); it != end(); ++it ) { if( (*it).taxType() == DocPositionBase::TaxFull) { g += (*it).nettoPrice(); } } const Geld ftSum(g.percent(_fullTax).toLong()); return ftSum; } Geld ArchDocPositionList::reducedTaxSum() const { Geld g; const_iterator it; for ( it = begin(); it != end(); ++it ) { if( (*it).taxType() == DocPositionBase::TaxReduced) { g += (*it).nettoPrice(); } } const Geld rtSum(g.percent(_reducedTax).toLong()); return rtSum; } DocPositionBase::TaxType ArchDocPositionList::listTaxation() const { int fullTax = 0; int noTax = 0; int redTax = 0; DocPositionBase::TaxType ret = DocPositionBase::TaxType::TaxNone; const_iterator it; for ( it = begin(); it != end(); ++it ) { if( (*it).taxType() == DocPositionBase::TaxFull) { fullTax++; } else if( (*it).taxType() == DocPositionBase::TaxReduced ) { redTax++; } else if( (*it).taxType() == DocPositionBase::TaxNone ) { noTax++; } } int cnt = count(); if (noTax == cnt) { ret = DocPositionBase::TaxType::TaxNone; } else if (redTax == cnt) { ret = DocPositionBase::TaxType::TaxReduced; } else if (fullTax == cnt) { ret = DocPositionBase::TaxType::TaxFull; } else ret = DocPositionBase::TaxType::TaxIndividual; return ret; } bool ArchDocPositionList::hasIndividualTaxes() const { bool re = listTaxation() == DocPositionBase::TaxType::TaxIndividual; return re; } void ArchDocPositionList::setTaxes(double fullTax, double reducedTax) { _fullTax = fullTax; _reducedTax = reducedTax; } kraft-1.2.2/src/archdocposition.h000066400000000000000000000121201467704360200167600ustar00rootroot00000000000000/*************************************************************************** archdocposition.h - a position in an archived document ------------------- begin : Sep 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef ARCHDOCPOSITION_H #define ARCHDOCPOSITION_H // include files for Qt #include #include #include // include files for KDE // application specific includes #include "einheit.h" #include "geld.h" #include "dbids.h" #include "docposition.h" #include "defaultprovider.h" class ArchDoc; /** @author Klaas Freitag */ class ArchDocPosition { friend class ArchDoc; public: ArchDocPosition(); ~ArchDocPosition(){}; QString posNumber() const { return mPosNo; } QString text() const { return mText; } QString htmlText(const QString ¶Style = QString()) const; QString unit() const { return mUnit; } QString unitEC20() const; Geld unitPrice() const { return mUnitPrice; } Geld nettoPrice() const; double amount() const { return mAmount; } DocPositionBase::TaxType taxType() const { return mTaxType; } Geld tax( double fullTax, double reducedTax ) const; Geld fullTax( double fullTax ) const; Geld reducedTax( double reducedTax ) const; QString kind() const { return mKind; } QString taxMarkerHelper() const; private: QString mText; QString mPosNo; QString mUnit; QString mKind; Geld mUnitPrice; Geld mOverallPrice; double mAmount; DocPositionBase::TaxType mTaxType; // No calculation yet }; class ArchDocPositionList : public QList { public: ArchDocPositionList(); Geld sumPrice() const; Geld taxSum() const; Geld fullTaxSum() const; Geld reducedTaxSum() const; DocPositionBase::TaxType listTaxation() const; bool hasIndividualTaxes() const; void setTaxes(double fullTax, double reducedTax); private: double _fullTax; double _reducedTax; }; Q_DECLARE_METATYPE(ArchDocPosition) Q_DECLARE_METATYPE(ArchDocPositionList) // Read-only introspection of Person object. GRANTLEE_BEGIN_LOOKUP(ArchDocPosition) if ( property == "itemNumber" ) return object.posNumber(); else if ( property == "text" ) return object.text(); else if ( property == "htmlText" ) return object.htmlText(); else if ( property == "kind" ) return object.kind(); else if ( property == "unit" ) return object.unit(); else if ( property == "unitCode" ) return object.unitEC20(); else if ( property == "unitPrice" ) { return object.unitPrice().toLocaleString(); } else if ( property == "unitPriceNum") { return QString::number(object.unitPrice().toDouble(), 'f', 2); } else if ( property == "nettoPrice" ) { return object.nettoPrice().toLocaleString(); } else if ( property == "nettoPriceNum" ) { return QString::number(object.nettoPrice().toDouble(), 'f', 2); } else if ( property == "amount" ) { QLocale *loc = DefaultProvider::self()->locale(); return loc->toString(object.amount()); } else if ( property == "amountNum") { return QString::number(object.amount(), 'f', 2) ; } else if ( property == "taxType" ) { if (object.taxType() == DocPositionBase::TaxType::TaxFull) { return QStringLiteral("fullTax"); } else if (object.taxType() == DocPositionBase::TaxType::TaxReduced) { return QStringLiteral("reducedTax"); } else if (object.taxType() == DocPositionBase::TaxType::TaxNone) { return QStringLiteral("noTax"); } return QStringLiteral("Invalid"); } else if ( property == "itemType" ) { return object.kind(); } else if ( property == "taxMarker") { return object.taxMarkerHelper(); } else { return QStringLiteral("undefined"); } GRANTLEE_END_LOOKUP GRANTLEE_BEGIN_LOOKUP(ArchDocPositionList) if (property == "sumPrice") return object.sumPrice().toLocaleString(); else if (property == "taxSum") return object.taxSum().toLocaleString(); else if (property == "fullTaxSum") return object.fullTaxSum().toLocaleString(); else if (property == "reducedTaxSum") return object.reducedTaxSum().toLocaleString(); else if (property == "reducedTaxSum") return object.reducedTaxSum().toLocaleString(); else if (property == "hasIndividualTaxes") return object.hasIndividualTaxes(); else return QStringLiteral("Undefined"); GRANTLEE_END_LOOKUP #endif kraft-1.2.2/src/archiveman.cpp000066400000000000000000000313761467704360200162560ustar00rootroot00000000000000/*************************************************************************** archiveman.cpp - Archive Manager ------------------- begin : July 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include "archiveman.h" #include "kraftdoc.h" #include "kraftdb.h" #include "unitmanager.h" #include "dbids.h" #include "documentman.h" #include "defaultprovider.h" #include "format.h" #include "version.h" Q_GLOBAL_STATIC(ArchiveMan, mSelf) ArchiveMan *ArchiveMan::self() { return mSelf; } ArchiveMan::ArchiveMan() { } ArchiveMan::~ArchiveMan() { } dbID ArchiveMan::archiveDocument( KraftDoc *doc ) { if( ! doc ) return dbID(); dbID archId = archiveDocumentDb( doc ); if ( DefaultProvider::self()->writeXmlArchive() ) { archiveDocumentXml( doc, archId.toString()); } return archId; } QString ArchiveMan::documentID( dbID archID ) const { QString re; QSqlQuery q; q.prepare("SELECT ident FROM archdoc WHERE archDocID=:id"); q.bindValue(":id", archID.toInt()); q.exec(); if ( q.next() ) { re = q.value( 0 ).toString(); } return re; } QDomElement ArchiveMan::xmlTextElement( QDomDocument doc, const QString& name, const QString& value ) { QDomElement elem = doc.createElement( name ); QDomText t = doc.createTextNode( value ); elem.appendChild( t ); return elem; } QDomElement ArchiveMan::positionsDomElement( DocPositionList *positions, QDomDocument& doc ) { QDomElement topElem = doc.createElement( "positions" ); QDomElement posElem; int num = 1; DocPositionListIterator it(*positions); while( it.hasNext() ) { DocPosition *dpb = static_cast( it.next() ); if( dpb->type() == DocPositionBase::Position ) { DocPosition *dp = static_cast(dpb); posElem = doc.createElement( "position" ); posElem.setAttribute( "number", num++ ); topElem.appendChild( posElem ); posElem.appendChild( xmlTextElement( doc, "text", dp->text() ) ); double am = dp->amount(); QString h = QString::number(am, 'f', 2 ); posElem.appendChild( xmlTextElement( doc, "amount", h )); Einheit e = dp->unit(); posElem.appendChild( xmlTextElement( doc, "unit", e.einheit( am ) ) ); Geld g = dp->unitPrice(); posElem.appendChild( xmlTextElement( doc, "unitprice", QString::number(g.toDouble(), 'f', 2 ))); Geld sum(g * am); posElem.appendChild( xmlTextElement( doc, "sumprice", QString::number(sum.toDouble(), 'f', 2 ) ) ); } } return topElem; } QDomDocument ArchiveMan::archiveDocumentXml( KraftDoc *doc, const QString& archId ) { QDomDocument xmldoc( "kraftdocument" ); QDomElement root = xmldoc.createElement( "kraftdocument" ); root.setAttribute(QStringLiteral("kraft_version"), Kraft::Version::number()); xmldoc.appendChild( root ); QDomElement cust = xmldoc.createElement( "client" ); root.appendChild( cust ); cust.appendChild( xmlTextElement( xmldoc, "address", doc->address() ) ); cust.appendChild( xmlTextElement( xmldoc, "clientId", doc->addressUid() ) ); QDomElement docElem = xmldoc.createElement( "docframe" ); root.appendChild( docElem ); docElem.appendChild( xmlTextElement( xmldoc, "docType", doc->docType() ) ); docElem.appendChild( xmlTextElement( xmldoc, "docDesc", doc->whiteboard() ) ); docElem.appendChild( xmlTextElement( xmldoc, "ident", doc->ident() ) ); docElem.appendChild( xmlTextElement( xmldoc, "predecessor", doc->predecessor() ) ); docElem.appendChild( xmlTextElement( xmldoc, "preText", doc->preText() ) ); docElem.appendChild( xmlTextElement( xmldoc, "postText", doc->postText() ) ); docElem.appendChild( xmlTextElement( xmldoc, "projectLabel", doc->projectLabel() ) ); docElem.appendChild( xmlTextElement( xmldoc, "salut", doc->salut() ) ); docElem.appendChild( xmlTextElement( xmldoc, "goodbye", doc->goodbye() ) ); docElem.appendChild( xmlTextElement( xmldoc, "date", Format::toDateString(doc->date(), Format::DateFormatIso))); DocPositionList dpList = doc->positions(); root.appendChild( positionsDomElement(&dpList, xmldoc) ); QString xml = xmldoc.toString(); // qDebug() << "Resulting XML: " << xml; const QString outputDir = xmlBaseDir(); const QString filename = archiveFileName( doc->ident(), archId, "xml" ); const QString xmlFile = QString( "%1/%2" ).arg( outputDir ).arg( filename ); // qDebug () << "Storing XML to " << xmlFile; QFile file( xmlFile ); if ( file.open( QIODevice::WriteOnly ) ) { QTextStream stream( &file ); stream << xml << "\n"; file.close(); } else { // qDebug () << "Saving failed"; } return xmldoc ; } dbID ArchiveMan::archiveDocumentDb( KraftDoc *doc ) { /* mysql> describe archdoc; +---------------+--------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+-------------------+----------------+ | archDocID | int(11) | NO | PRI | NULL | auto_increment | | ident | varchar(32) | YES | MUL | NULL | | | docType | varchar(255) | YES | | NULL | | | clientAddress | text | YES | | NULL | | | clientUid | varchar(32) | YES | | NULL | | | salut | varchar(255) | YES | | NULL | | | goodbye | varchar(128) | YES | | NULL | | | printDate | timestamp | NO | | CURRENT_TIMESTAMP | | | date | date | YES | | NULL | | | pretext | text | YES | | NULL | | | posttext | text | YES | | NULL | | | country | varchar(32) | YES | | NULL | | | language | varchar(32) | YES | | NULL | | | projectLabel | varchar(255) | YES | | NULL | | | state | int(11) | YES | | NULL | | +---------------+--------------+------+-----+-------------------+----------------+ */ if( ! doc ) return dbID(); QSqlTableModel model; model.setTable("archdoc"); QSqlRecord record = model.record(); if( doc->isNew() ) { // qDebug () << "Strange: Document in archiving is new!"; } record.setValue( "ident", doc->ident() ); record.setValue( "docType", doc->docType() ); record.setValue( "docDescription", KraftDB::self()->mysqlEuroEncode( doc->whiteboard() ) ); record.setValue( "clientAddress", doc->address() ); record.setValue( "clientUid", doc->addressUid() ); record.setValue( "salut", doc->salut() ); record.setValue( "goodbye", doc->goodbye() ); record.setValue( "printDate", KraftDB::self()->currentTimeStamp() ); record.setValue( "date", doc->date() ); record.setValue( "pretext", KraftDB::self()->mysqlEuroEncode(doc->preText() ) ); record.setValue( "posttext", KraftDB::self()->mysqlEuroEncode(doc->postText() ) ); record.setValue( "projectLabel", KraftDB::self()->mysqlEuroEncode(doc->projectLabel() ) ); record.setValue( "predecessor", doc->predecessor() ); QLocale *loc = DefaultProvider::self()->locale(); record.setValue( "country", loc->name() ); record.setValue( "language", QLocale::languageToString(DefaultProvider::self()->locale()->language())); record.setValue( "tax", DocumentMan::self()->tax( doc->date() ) ); record.setValue( "reducedTax", DocumentMan::self()->reducedTax( doc->date() ) ); if(!model.insertRecord(-1, record)) { // qDebug () << model.lastError(); } dbID id = KraftDB::self()->getLastInsertID(); archivePos( id.toInt(), doc ); return id; } int ArchiveMan::archivePos( int archDocId, KraftDoc *doc ) { /* mysql> describe archdocpos; +-----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+----------------+ | archPosID | int(11) | NO | PRI | NULL | auto_increment | | archDocID | int(11) | NO | MUL | | | | ordNumber | int(11) | NO | | | | | text | text | YES | | NULL | | | amount | decimal(6,2) | YES | | NULL | | | unit | varchar(64) | YES | | NULL | | | price | decimal(6,2) | YES | | NULL | | | vat | decimal(3,1) | YES | | 0.0 | | +-----------+--------------+------+-----+---------+----------------+ */ if( ! doc ) return -1; QSqlTableModel model; model.setTable("archdocpos"); QSqlRecord record = model.record(); int cnt = 0; DocPositionList posList = doc->positions(); DocPositionListIterator it( posList ); // qDebug () << "Archiving pos for " << archDocId; while ( it.hasNext() ) { DocPosition *dp = static_cast( it.next() ); record.setValue( "archDocID", archDocId ); record.setValue( "ordNumber", 1+cnt /* dp->position() */ ); record.setValue( "kind", dp->attribute( DocPosition::Kind ) ); record.setValue( "text", dp->text() ); // expandItemText( dp ) ); record.setValue( "amount", dp->amount() ); record.setValue( "unit", dp->unit().einheit( dp->amount() ) ); record.setValue( "price", dp->unitPrice().toDouble() ); record.setValue( "overallPrice", dp->overallPrice().toDouble() ); record.setValue( "taxType", dp->taxTypeNumeric() ); if(!model.insertRecord(-1, record)) { // qDebug () << model.lastError(); } dbID id = KraftDB::self()->getLastInsertID(); // qDebug() << "Inserted for id " << id.toString(); cnt++; // save the attributes of the positions in the attributes // table but with a new host type which reflects the arch state AttributeMap attribs = dp->attributes(); attribs.setHost( "ArchPosition" ); attribs.save( id ); } return cnt; } void ArchiveMan::ensureDirIsExisting( const QString& dir ) const { if( ! QFile::exists(dir)) { qDebug() << "pdfBaseDir does not exist! Trying to create" << dir; QDir d; if( d.mkpath(dir) ) { qDebug() << "Successfully created" << dir; } else { qDebug() << "Failed to create" << dir; } } } QString ArchiveMan::xmlBaseDir() const { QString outputDir = DefaultProvider::self()->xmlArchivePath(); if ( outputDir.isEmpty() ) { // stay bug compatible: Before issue #80, this was the pdfOutputDir outputDir = DefaultProvider::self()->pdfOutputDir(); } if (outputDir.isEmpty()) { outputDir = QStandardPaths::writableLocation( QStandardPaths::AppDataLocation ); } if ( ! outputDir.endsWith('/') ) outputDir += QChar('/'); ensureDirIsExisting(outputDir); return outputDir; } QString ArchiveMan::pdfBaseDir() const { QString outputDir = DefaultProvider::self()->pdfOutputDir(); if ( outputDir.isEmpty() ) { outputDir = QStandardPaths::writableLocation( QStandardPaths::AppDataLocation ); } if ( ! outputDir.endsWith('/') ) outputDir += QChar('/'); ensureDirIsExisting(outputDir); return outputDir; } QString ArchiveMan::archiveFileName( const QString& docId, const QString& archId, const QString& ext ) const { QString re = QString( "%1_%2.%3" ).arg( docId ).arg( archId ).arg( ext ); re.replace(QLatin1Char('/'), QLatin1Char('_')); return re; } kraft-1.2.2/src/archiveman.h000066400000000000000000000042011467704360200157060ustar00rootroot00000000000000/*************************************************************************** archiveman.h - Archive Manager ------------------- begin : July 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef ARCHIVEMAN_H #define ARCHIVEMAN_H #include #include "dbids.h" class KraftDoc; class dbID; class QDomDocument; class DocPositionList; class ArchiveMan { friend class KraftDB; public: virtual ~ArchiveMan(); static ArchiveMan *self(); /** * query the document identifier id for a given database archive id */ QString documentID( dbID archID ) const; QString xmlBaseDir() const; QString pdfBaseDir() const; QString archiveFileName( const QString&, const QString&, const QString& ) const; ArchiveMan(); protected: /* do not use the archive function directly, but always via KraftDB, to let the DB * class update the counters of documents. */ dbID archiveDocument( KraftDoc* ); virtual QDomDocument archiveDocumentXml( KraftDoc*, const QString& ); virtual dbID archiveDocumentDb( KraftDoc* ); private: QDomElement xmlTextElement( QDomDocument, const QString&, const QString& ); QDomElement positionsDomElement( DocPositionList *positions, QDomDocument& doc ); int archivePos( int, KraftDoc* ); void ensureDirIsExisting( const QString& dir ) const; }; #endif kraft-1.2.2/src/attribute.cpp000066400000000000000000000276071467704360200161460ustar00rootroot00000000000000/*************************************************************************** attribute.cpp - generic attribute object ------------------- begin : Aug. 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include "attribute.h" #include "kraftdb.h" #include "dbids.h" Attribute::Attribute() :mPersist( true ), mListValue( false ), mDelete( false ) { } Attribute::Attribute( const QString& name ) :mName( name ), mPersist( true ), mListValue( false ), mDelete( false ) { } void Attribute::setRawValue( const QVariant& var ) { mValue = var; } void Attribute::setValue( const QVariant& var ) { mValue = var; } QVariant Attribute::value() const { return mValue; } QString Attribute::name() const { return mName; } bool Attribute::persistant() { return mPersist; } void Attribute::setPersistant( bool p ) { mPersist = p; } void Attribute::setListValue( bool p ) { mListValue = p; } bool Attribute::listValue() const { return mListValue; } QString Attribute::toString() const { QString re; re = "+ Attribute name: " + mName + '\n'; if ( mListValue ) { re += "+ Attribute Value (List): " + mValue.toStringList().join( ", " )+ '\n'; } else { re += "+ Attribute Value (String): " + mValue.toString() + '\n'; } re += "+ List: " + ( mListValue ? QString( "yes" ) : QString( "no" ) ) + '\n'; return re; } /* * Attribute Map ============================================================ */ AttributeMap::AttributeMap( const QString& host) :QMap(), mHost( host ) { } void AttributeMap::setHost( const QString& host ) { mHost = host; } bool AttributeMap::hasAttribute( const QString& name ) const { ConstIterator it = find( name ); if ( it != end() ) { // it is there, check the delete flag. if ( ! ( *it ).mDelete ) return true; } return false; } /* * this method saves the attribute together with the host string that * defines the type of object that this attribute is associated to (like * position or document) and the hosts database id. */ void AttributeMap::save( dbID id ) { checkHost(); if (size() == 0) return; QSqlQuery attribQuery; attribQuery.prepare( "SELECT id, valueIsList FROM attributes WHERE hostObject=:host AND hostId=:hostId AND name=:name" ); attribQuery.bindValue( ":host", mHost ); attribQuery.bindValue( ":hostId", id.toString() ); Iterator it; for ( it = begin(); it != end(); ++it ) { Attribute att = it.value(); // qDebug () << ">> oo- saving attribute with name " << it.key() << " for " << id.toString() << " att-name: " << att.name(); attribQuery.bindValue( ":name", att.name() ); attribQuery.exec(); QString attribId; if ( attribQuery.next() ) { // the attrib exists. Check the values attribId = attribQuery.value(0).toString(); // the id if ( att.value().isNull() || att.mDelete ) { // the value is empty. the existing entry needs to be dropped dbDeleteAttribute( attribId ); return; } } else { // the attrib does not yet exist. Create if att value is not null. if ( att.value().isNull() ) { // qDebug () << "oo- skip writing of attribute, value is empty"; } else { // qDebug () << "oo- writing of attribute name " << att.name(); QSqlQuery insQuery; insQuery.prepare( "INSERT INTO attributes (hostObject, hostId, name, valueIsList) " "VALUES (:host, :hostId, :name, :valueIsList)" ); insQuery.bindValue( ":host", mHost ); insQuery.bindValue( ":hostId", id.toString() ); insQuery.bindValue( ":name", att.name() ); insQuery.bindValue( ":valueIsList", att.listValue() ); insQuery.exec(); dbID attId = KraftDB::self()->getLastInsertID(); attribId = attId.toString(); } } // store the id to be able to drop not longer existent values // qDebug () << "adding attribute id " << attribId << " for attribute " << att.name(); // now there is a valid entry in the attribute table. Check the values. QSqlQuery valueQuery( "SELECT id, value FROM attributeValues WHERE attributeId=" + attribId ); typedef QMap ValueMap; ValueMap valueMap; while ( valueQuery.next() ) { QString idStr = valueQuery.value( 0 ).toString(); // id QString valStr = valueQuery.value( 1 ).toString(); // value valueMap[valStr] = idStr; } // create a stringlist with the current values of the attribute if ( att.listValue() ) { QStringList newValues; newValues = att.mValue.toStringList(); // qDebug () << "new values are: " << newValues.join( ", " ); if ( newValues.empty() ) { // delete the entire attribute. dbDeleteValue( attribId ); // deletes all values dbDeleteAttribute( attribId ); valueMap.clear(); } else { // we really have new values QSqlQuery insValue; insValue.prepare( "INSERT INTO attributeValues (attributeId, value) VALUES (:attribId, :val)" ); insValue.bindValue( ":attribId", attribId ); // loop over all existing new values of the attribute. for ( QStringList::Iterator valIt = newValues.begin(); valIt != newValues.end(); ++valIt ) { QString curValue = *valIt; if ( valueMap.contains( curValue ) ) { // the valueMap is already saved. remove it from the valueMap string // qDebug () << "Value " << curValue << " is already present with id " << valueMap[curValue]; valueMap.remove( curValue ); } else { // the value is not yet there, insert it. insValue.bindValue( ":val", curValue ); insValue.exec(); } } } } else { // only a single entry for the attribte, update if needed. QString newValue = att.mValue.toString(); // access the attribute object directly to get the numeric // qDebug () << "NEW value String: " << newValue; // value in case the attribute is bound to a relation table if ( newValue.isEmpty() ) { // delete the entire attribute dbDeleteValue( attribId ); // deletes all values dbDeleteAttribute( attribId ); valueMap.clear(); } else { if ( valueMap.empty() ) { // there is no entry yet that could be updated. QSqlQuery insertQuery; insertQuery.prepare( "INSERT INTO attributeValues (attributeId, value ) VALUES (:id, :val)" ); insertQuery.bindValue( ":id", attribId ); insertQuery.bindValue( ":val", newValue ); insertQuery.exec(); // qDebug () << "insert new attrib value for non list: " << newValue; } else { QString oldValue = valueMap.begin().key(); QString id = valueMap.begin().value(); if ( newValue != oldValue ) { // qDebug () << "Updating " << id << " from " << oldValue << " to " << newValue; QSqlQuery updateQuery; updateQuery.prepare( "UPDATE attributeValues SET value=:val WHERE id=:id" ); updateQuery.bindValue( ":val", newValue ); updateQuery.bindValue( ":id", id ); // qDebug () << "do the update!"; updateQuery.exec(); } valueMap.remove( oldValue ); } } } // remove all still existing entries in the valueMap because they point to values which are // in the db but were deleted from the attribute if ( ! valueMap.isEmpty() ) { ValueMap::Iterator mapIt; for ( mapIt = valueMap.begin(); mapIt != valueMap.end(); ++mapIt ) { QString valId = mapIt.value(); dbDeleteValue( attribId, valId ); } } } } bool AttributeMap::containsUndeleted(const QString &name) const { if ( name.isEmpty() || ! contains( name ) ) return false; ConstIterator it = find( name ); if ( it != end() ) { if (!(*it).mDelete) return true; // qDebug () << "Marking attrib " << name << " to delete!"; } return false; } void AttributeMap::markDelete( const QString& name ) { if ( name.isEmpty() || ! contains( name ) )return; Iterator it = find( name ); if ( it != end() ) { ( *it ).mDelete = true; // qDebug () << "Marking attrib " << name << " to delete!"; } } /* remove all Attributes from the database for the given host id * this method clears the entire map and should only be called if * the whole host is to delete anyway. */ void AttributeMap::dbDeleteAll( dbID id ) { // qDebug () << "This is the id for to delete: " << id.toString(); if ( !id.isOk() ) return; QSqlQuery listQuery; listQuery.prepare( "SELECT id FROM attributes WHERE hostObject=:hostObject AND hostId=:hostId" ); listQuery.bindValue( ":hostObject", mHost ); listQuery.bindValue( ":hostId", id.toString() ); listQuery.exec(); // qDebug () << "4-XXXXXXXXXXX " << listQuery.lastError().text(); while ( listQuery.next() ) { dbDeleteAttribute( listQuery.value( 0 ).toString() ); } clear(); } void AttributeMap::dbDeleteAttribute( const QString& attribId ) { if ( attribId.isEmpty() ) return; QSqlQuery delQuery; // qDebug () << "Deleting attribute id " << attribId; delQuery.prepare( "DELETE FROM attributes WHERE id=:id" ); delQuery.bindValue( ":id", attribId ); delQuery.exec(); // qDebug () << "5-XXXXXXXXXXX " << delQuery.lastError().text(); dbDeleteValue( attribId ); // delete all values } void AttributeMap::dbDeleteValue( const QString& attribId, const QString& id ) { QSqlQuery delQuery; if ( id.isEmpty() && ! attribId.isEmpty() ) { delQuery.prepare( "DELETE FROM attributeValues WHERE attributeId=" + attribId ); } else if ( !id.isEmpty() ) { delQuery.prepare( "DELETE FROM attributeValues WHERE id="+id ); } delQuery.exec(); // qDebug () << "6-XXXXXXXXXXX " << delQuery.lastError().text(); } void AttributeMap::load( dbID id ) { QSqlQuery q1; q1.prepare("SELECT id, name, valueIsList FROM attributes WHERE hostObject=:hostObject AND hostId=:hostId"); q1.bindValue(":hostObject", mHost); q1.bindValue(":hostId", id.toInt()); q1.exec(); checkHost(); while ( q1.next() ) { QString h = q1.value( 1 ).toString(); bool isList = q1.value( 2 ).toBool(); Attribute attr( h ); attr.setListValue( isList ); QSqlQuery q2; q2.prepare("SELECT value FROM attributeValues WHERE attributeId=:id"); q2.bindValue(":id", q1.value(0).toInt()); q2.exec(); QStringList values; QString str; while ( q2.next() ) { if ( isList ) { values << q2.value( 0 ).toString(); } else { str = q2.value( 0 ).toString(); // qDebug() << " attribute string " << h <<": " << str; } } // qDebug() << " attribute list " << h <<": " << values; if ( isList ) { attr.setRawValue( QVariant( values ) ); } else { attr.setRawValue( QVariant( str ) ); } attr.setPersistant( true ); insert( h, attr ); } } void AttributeMap::checkHost() { if ( mHost.isEmpty() ) { // qDebug () << "Host for attributes unset, assuming unknown"; mHost = "unknown"; } } kraft-1.2.2/src/attribute.h000066400000000000000000000050321467704360200155770ustar00rootroot00000000000000/*************************************************************************** attribute.h - generic attribute object ------------------- begin : Aug. 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef ATTRIBUTE_H #define ATTRIBUTE_H // include files for Qt #include // include files for KDE // application specific includes #include "kraftcat_export.h" /** @author Klaas Freitag */ class QString; class dbID; class KRAFTCAT_EXPORT Attribute { friend class AttributeMap; public: Attribute(); Attribute( const QString& name ); void setValue( const QVariant& var ); QVariant value() const; QString name() const; bool persistant(); bool listValue() const; void setListValue( bool ); void setPersistant( bool ); // TODO: Remove this unneeded method QString toString() const; bool isMarkedDeleted() const { return mDelete; } private: void setRawValue( const QVariant& var ); // sets the value without checking for relations QString mName; QVariant mValue; bool mPersist; bool mListValue; bool mDelete; // Delete the attribute on save. Written and read by the attributemap }; /* * Attribute Map */ class KRAFTCAT_EXPORT AttributeMap: public QMap { public: AttributeMap( const QString& ); bool hasAttribute( const QString& ) const; void setHost( const QString& ); void load( dbID ); void save( dbID ); void markDelete( const QString& ); void dbDeleteAll( dbID ); bool containsUndeleted(const QString &name) const; protected: void dbDeleteAttribute( const QString& ); void dbDeleteValue( const QString&, const QString& = QString() ); private: void checkHost(); QString mHost; }; #endif kraft-1.2.2/src/calcdialogbase.cpp000066400000000000000000000035201467704360200170440ustar00rootroot00000000000000/*************************************************************************** CalcDialogBase - base class for calculation detail dialogs ------------------- begin : 2017-01-31 copyright : (C) 2017 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include #include "calcdialogbase.h" CalcDialogBase::CalcDialogBase(QWidget *parent) : QDialog( parent ) { _centralWidget = new QWidget(this); setModal( true ); QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); mainLayout->addWidget(_centralWidget); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); } /* END */ kraft-1.2.2/src/calcdialogbase.h000066400000000000000000000024161467704360200165140ustar00rootroot00000000000000/*************************************************************************** CalcDialogBase - base class for calculation detail dialogs ------------------- begin : 2017-01-31 copyright : (C) 2017 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef _CALCDIALOGBASE_H #define _CALCDIALOGBASE_H #include #include /** * */ class CalcDialogBase: public QDialog { Q_OBJECT public: CalcDialogBase(QWidget *parent); protected: QWidget *_centralWidget; }; #endif /* END */ kraft-1.2.2/src/calcpart.cpp000066400000000000000000000102351467704360200157210ustar00rootroot00000000000000/*************************************************************************** calcpart.cpp - ------------------- begin : Mit Dez 31 2003 copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include "calcpart.h" #include "fixcalcpart.h" #include "materialcalcpart.h" #include "timecalcpart.h" CalcPart::CalcPart( ): m_prozentPlus(0), m_dbId(-1), m_templId(-1), m_dirty(false), m_toDelete(false) { } CalcPart::CalcPart( int prozent ): m_prozentPlus( prozent ), m_dbId(-1), m_templId(-1), m_dirty(false), m_toDelete(false) { } CalcPart::CalcPart(const QString& name, int prozent ) : m_prozentPlus( prozent ), m_name( name ), m_dbId(-1), m_templId(-1), m_dirty(false), m_toDelete(false) { } CalcPart::~CalcPart() { } /** Read property of int m_prozentPlus. */ const double& CalcPart::getProzentPlus() { return m_prozentPlus; } /** Write property of int m_prozentPlus. */ void CalcPart::setProzentPlus( const double& _newVal) { if( _newVal != m_prozentPlus ) { m_prozentPlus = _newVal; setDirty(true); } } void CalcPart::setName( const QString& newName ) { if( newName != m_name ) { m_name = newName; setDirty(true); } } /** Wird immer reimplementiert */ Geld CalcPart::basisKosten() { Geld g; return g; } QString CalcPart::getType() const { return i18n("Base"); } void CalcPart::setToDelete(bool val) { m_toDelete = val; } bool CalcPart::isToDelete() { return m_toDelete; } /* * =========================================================================== */ CalcPartList::CalcPartList() :QList() { } Geld CalcPartList::calcPrice() { return costPerCalcPart( ALL_KALKPARTS ); } Geld CalcPartList::costPerCalcPart( const QString& calcPart ) { CalcPart *cp; Geld g; /* suche nach einer speziellen Kalkulationsart */ QListIterator i( *this ); while( i.hasNext()) { cp = i.next(); if( ( calcPart == ALL_KALKPARTS || calcPart == cp->getType() ) && ! cp->isToDelete() ) { g += cp->basisKosten(); } } return g; } /* * Attention: returning non deep copy here ! */ CalcPartList CalcPartList::getCalcPartsList( const QString& calcPart ) { CalcPartList parts; if( calcPart == ALL_KALKPARTS ) return *this; else { CalcPart *cp; /* suche nach einer speziellen Kalkulationsart */ QListIterator i( *this ); while( i.hasNext()) { cp = i.next(); if( calcPart == cp->getType() && ! cp->isToDelete() ) { parts.append(cp); } } } return( parts ); } /* * Attention: returning non deep copy here ! */ CalcPartList CalcPartList::decoupledCalcPartsList() { CalcPartList parts; CalcPart *newcp = 0; CalcPart *cp; QListIterator i( *this ); while( i.hasNext()) { cp = i.next(); if ( cp->getType() == KALKPART_FIX ) { newcp = new FixCalcPart( ); *newcp = *( static_cast( cp ) ); } else if ( cp->getType ()== KALKPART_TIME ) { newcp = new TimeCalcPart( ); *newcp = *( static_cast( cp ) ); } else if ( cp->getType() == KALKPART_MATERIAL ) { newcp = new MaterialCalcPart( ); *newcp = *( static_cast( cp ) ); } if ( newcp ) newcp->setDbID( -1 ); parts.append( newcp ); } return( parts ); } kraft-1.2.2/src/calcpart.h000066400000000000000000000050111467704360200153620ustar00rootroot00000000000000/*************************************************************************** calcpart.h - ------------------- begin : Mit Dez 31 2003 copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef CALCPART_H #define CALCPART_H #include #include #include "dbids.h" #include "kraftglobals.h" /**This file contains a part of a calculation. *@author Klaas Freitag */ class CalcPart { public: CalcPart(); CalcPart( int prozent ); CalcPart( const QString& name, int prozent = 0 ); virtual ~CalcPart(); /** Write property of int m_prozentPlus. */ virtual void setProzentPlus( const double& _newVal); /** Read property of int m_prozentPlus. */ virtual const double& getProzentPlus(); /** base costs for one unit */ virtual Geld basisKosten(); void setName( const QString& name ); QString getName() const { return m_name; } virtual QString getType() const; virtual bool isDirty() { return m_dirty; } virtual void setDirty( bool b ) { m_dirty = b; } virtual dbID getDbID() { return m_dbId; } virtual void setDbID( dbID id ) { m_dbId = id; } virtual dbID getTemplID() { return m_templId; } virtual void setTemplID( dbID id ) { m_templId = id; } virtual void setToDelete(bool ); virtual bool isToDelete(); private: double m_prozentPlus; QString m_name; dbID m_dbId; dbID m_templId; bool m_dirty; bool m_toDelete; }; class CalcPartList : public QList { public: CalcPartList(); Geld calcPrice(); Geld costPerCalcPart( const QString& ); CalcPartList getCalcPartsList( const QString& ); CalcPartList decoupledCalcPartsList(); }; typedef QListIterator CalcPartListIterator; #endif kraft-1.2.2/src/calctemplate.ui000066400000000000000000000634171467704360200164330ustar00rootroot00000000000000 d_calcTempl 0 0 657 801 Edit Template true 1 Template Text: Qt::Orientation::Horizontal QSizePolicy::Policy::Expanding 118 20 &Store in Chapter false cbChapter false 0 160 false &Unit false m_unit Qt::Orientation::Horizontal 40 20 &Count Time for Overalltime Qt::Orientation::Horizontal 40 20 0 0 VAT false full half Time Calculation text true Time measureable effort for this template: false false false 4 true Label Duration Hourly Rate Glob. Rate Adds a new time calculation part to the template New… Edits the current time calculation part Edit… Deletes the current time calculation part delete Qt::Orientation::Vertical QSizePolicy::Policy::Expanding 20 191 Fix Costs text true Fix costs for this template per one unit: false false false 4 true Amount Label Single Price Overall Price adds a new fix calculation part New… edits the current fix calculation part Edit… deletes the current fix calculation part delete Qt::Orientation::Vertical QSizePolicy::Policy::Expanding 20 170 Material text true Needed materials for one unit of this template: false false false 4 true Label Amount Unit Price adds a new material calculation part New… edits the current material part Edit… deletes the current material calculation part delete Qt::Orientation::Vertical QSizePolicy::Policy::Expanding 20 160 Overall Price per Unit Manua&l Price &Calculated Price -99999.000000000000000 99999.000000000000000 0.000000000000000 0 99999 Qt::Orientation::Horizontal 40 20 textLabel2 Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter false Fixed costs part: false textLabel2 Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter false Material part: false textLabel2 Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter false 0 0 &Profit: false spBenefit QAbstractSpinBox::ButtonSymbols::UpDownArrows % -1000 1000 Time calculation part: false Qt::Orientation::Vertical 20 40 QFrame::Shape::HLine QFrame::Shadow::Raised true Calculated price: Qt::TextFormat::PlainText false true 88.888,88 € Qt::TextFormat::PlainText Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter tabWidget cbChapter m_text m_unit m_addTime cbMwst m_rbManual m_rbCalculation m_timeParts m_butAddTime m_butEditTime m_butRemoveTime m_fixParts m_butAddFix m_butEditFix m_butRemoveFix m_matParts m_butAddMat m_butEditMat m_butRemoveMat kraft-1.2.2/src/catalogchapter.cpp000066400000000000000000000074211467704360200171140ustar00rootroot00000000000000/*************************************************************************** catalogchapter.h - a simle catalog chapter object ------------------- begin : Thu Nov 4 2010 copyright : (C) 2010 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include "catalogchapter.h" #include "kraftdb.h" CatalogChapter::CatalogChapter() : mSortKey(0) { } CatalogChapter::CatalogChapter( int id, int csId, const QString& name, int parent, const QString& desc ) :mName( name ), mId( dbID(id) ), mCatalogSetId( dbID(csId) ), mDescription( desc ), mParentId( parent ), mSortKey(0) { } QString CatalogChapter::name() const { return mName; } void CatalogChapter::setName( const QString& name ) { mName = name; } QString CatalogChapter::description() const { return mDescription; } void CatalogChapter::setDescription( const QString& d ) { mDescription = d; } dbID CatalogChapter::id() const { return mId; } dbID CatalogChapter::catalogSetId() const { return mCatalogSetId; } void CatalogChapter::setCatalogSetId( const dbID& id ) { mCatalogSetId = id; } dbID CatalogChapter::parentId() const { return mParentId; } void CatalogChapter::setParentId( const dbID &id ) { mParentId = id; } int CatalogChapter::sortKey() const { return mSortKey; } void CatalogChapter::setSortKey( int key ) { mSortKey = key; } void CatalogChapter::save() { // qDebug () << "Inserting new chapter " << name() << mCatalogSetId.toString(); QSqlQuery q; q.prepare("INSERT INTO CatalogChapters (catalogSetID, chapter, description, sortKey, parentChapter)" "VALUES(:catalogSetID, :chapter, :desc, :sortKey, :parentChapter)"); q.bindValue( ":catalogSetID", mCatalogSetId.toString() ); q.bindValue( ":chapter", this->name() ); q.bindValue( ":desc", this->description() ); q.bindValue( ":sortKey", this->sortKey() ); q.bindValue( ":parentChapter", this->parentId().toInt() ); q.exec(); mId = KraftDB::self()->getLastInsertID(); } bool CatalogChapter::removeFromDB() { // qDebug () << "Removing chapter " << name() << " with id " << mId.toInt(); QSqlQuery q; q.prepare("DELETE FROM CatalogChapters WHERE chapterID=:chapId"); q.bindValue( ":chapId", mId.toInt() ); return q.exec(); } void CatalogChapter::saveNameAndDesc() { QSqlQuery q; q.prepare("UPDATE CatalogChapters SET chapter = :newchapter, description = :desc WHERE chapterID = :id"); q.bindValue(":id", mId.toInt() ); q.bindValue(":desc", this->description() ); q.bindValue(":newchapter", this->name() ); q.exec(); } void CatalogChapter::reparent( const dbID& pId ) { dbID parentId( pId ); setParentId( pId ); QSqlQuery q; q.prepare("UPDATE CatalogChapters SET parentChapter= :p WHERE chapterID = :id"); q.bindValue(":id", mId.toInt() ); q.bindValue(":p", parentId.toInt() ); q.exec(); // qDebug () << "Reparenting chapter " << mId.toInt() << ", reuslt: " << q.lastError().text(); } kraft-1.2.2/src/catalogchapter.h000066400000000000000000000035371467704360200165650ustar00rootroot00000000000000/*************************************************************************** catalogchapter.h - a simle catalog chapter object ------------------- begin : Thu Nov 4 2010 copyright : (C) 2010 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef CATALOGCHAPTER_H #define CATALOGCHAPTER_H #include #include "kraftcat_export.h" #include class KRAFTCAT_EXPORT CatalogChapter { public: CatalogChapter(); CatalogChapter( int, int, const QString&, int, const QString& = QString() ); QString name() const; void setName( const QString& ); QString description() const; void setDescription( const QString& ); dbID id() const; dbID parentId() const; void setParentId( const dbID& ); dbID catalogSetId() const; void setCatalogSetId( const dbID& ); bool removeFromDB(); int sortKey() const; void setSortKey( int ); void save( ); void saveNameAndDesc(); void reparent( const dbID& ); private: QString mName; dbID mId; dbID mCatalogSetId; QString mDescription; dbID mParentId; int mSortKey; }; #endif // CATALOGCHAPTER_H kraft-1.2.2/src/catalogselection.cpp000066400000000000000000000141271467704360200174540ustar00rootroot00000000000000/*************************************************************************** katalogselection - widget to select catalog entries from ------------------- begin : 2006-08-30 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "catalogselection.h" #include "catalogtemplate.h" #include "katalogman.h" #include "templkatalog.h" #include "templkataloglistview.h" #include "materialkataloglistview.h" #include "matkatalog.h" #include "docposition.h" #include "filterheader.h" #include #include #include #include #include #include #include #include #include #include #include #include CatalogSelection::CatalogSelection( QWidget *parent ) :QWidget( parent ), mCatalogSelector(nullptr), mWidgets(nullptr) { QVBoxLayout *layout = new QVBoxLayout; layout->setMargin(0); QHBoxLayout *hb = new QHBoxLayout; layout->addLayout(hb); QLabel *l = new QLabel( i18n( "Selected &catalog: " ) ); hb->addWidget(l); mCatalogSelector = new QComboBox; hb->addWidget(mCatalogSelector); connect( mCatalogSelector, SIGNAL( activated( const QString& ) ), this, SLOT( slotSelectCatalog( const QString& ) ) ); l->setBuddy( mCatalogSelector ); hb->addStretch(); mListSearchLine = new FilterHeader; hb->addWidget(mListSearchLine); mWidgets = new QStackedWidget; mWidgets->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); layout->addWidget(mWidgets); this->setLayout(layout); setupCatalogList(); } void CatalogSelection::setupCatalogList() { QStringList katalogNames = KatalogMan::self()->allKatalogNames(); mCatalogSelector->insertItems(-1, katalogNames ); slotSelectCatalog( katalogNames[0] ); } void CatalogSelection::slotCatalogDoubleClicked( QModelIndex ) { emit actionAppendPosition(); } CatalogTemplateList CatalogSelection::currentSelectedPositions() { CatalogTemplateList re; const QString currentCat = mCatalogSelector->currentText(); if( mWidgetMap.contains( currentCat ) ) { KatalogListView *lv = mWidgetMap[currentCat]; re = lv->selectedTemplates(); } return re; } Katalog* CatalogSelection::currentSelectedKat() { const QString currentCat = mCatalogSelector->currentText(); Katalog *kat = KatalogMan::self()->getKatalog( currentCat ); if ( ! kat ) { qCritical() << "Could not find catalog " << currentCat; } return kat; } QString CatalogSelection::currentSelectedKatChapter() { QString chap; const QString currentCat = mCatalogSelector->currentText(); if( mWidgetMap.contains( currentCat ) ) { KatalogListView *lv = mWidgetMap[currentCat]; chap = lv->selectedCatalogChapter(); } return chap; } void CatalogSelection::slotSelectCatalog( const QString& katName ) { Katalog *kat = KatalogMan::self()->getKatalog( katName ); if ( !kat ) { const QString type = KatalogMan::self()->catalogTypeString( katName ); // qDebug () << "Catalog type for cat " << katName << " is " << type; if ( type == QStringLiteral("TemplCatalog") ) { kat = new TemplKatalog( katName ); } else if ( type == QStringLiteral("MaterialCatalog") ) { kat = new MatKatalog( katName ); } if ( kat ) { KatalogMan::self()->registerKatalog( kat ); } else { qCritical() << "Could not find a valid catalog type for catalog named " << katName; } } if ( kat ) { KatalogListView *katListView = nullptr; if ( ! mWidgetMap.contains( katName ) ) { if ( kat->type() == TemplateCatalog ) { TemplKatalogListView *tmpllistview = new TemplKatalogListView( this ); katListView = tmpllistview; tmpllistview->setShowCalcParts( false ); // qDebug () << "Creating a selection list for catalog " << katName; } else if ( kat->type() == MaterialCatalog ) { MaterialKatalogListView *matListView = new MaterialKatalogListView( this ); katListView = matListView; } if ( katListView ) { katListView->setSelectFromMode(); // mode to only select from mWidgets->addWidget(katListView); mWidgetMap.insert( katName, katListView ); katListView->contextMenu()->addAction( i18n("Append to Document"), this, &CatalogSelection::actionAppendPosition); katListView->addCatalogDisplay( katName ); connect(katListView, &KatalogListView::doubleClicked, this, &CatalogSelection::slotCatalogDoubleClicked); connect(katListView, &KatalogListView::currentItemChanged, this, &CatalogSelection::selectionChanged); KatalogMan::self()->registerKatalogListView( katName, katListView ); } } else { katListView = mWidgetMap[katName]; } // Select the widget if ( katListView ) { mWidgets->setCurrentWidget(katListView); mListSearchLine->setListView(katListView); emit selectionChanged(katListView->currentItem(), nullptr); } } } kraft-1.2.2/src/catalogselection.h000066400000000000000000000046301467704360200171170ustar00rootroot00000000000000/*************************************************************************** katalogselection - widget to select catalog entries from ------------------- begin : 2006-08-30 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef CATALOGSELECTION_H #define CATALOGSELECTION_H #include #include "kataloglistview.h" class QComboBox; class QStackedWidget; class QActionCollection; class QAction; class DocPosition; class FilterHeader; class CalcPartList; class Katalog; class CatalogSelection : public QWidget { Q_OBJECT public: CatalogSelection( QWidget *parent=0 ); ~CatalogSelection() { }; Katalog* currentSelectedKat(); QString currentSelectedKatChapter(); CatalogTemplateList currentSelectedPositions(); protected: void setupCatalogList(); signals: /* * a template was selected to be inserted into the document. This * transports a ptr to the katalog and the item in it. Since the * template type is dependent on the katalog type it is not known * what type of template is coming. It is up to the receiver to * decide (and cast) to the correct template on the katalog type. * * FIXME: Better approach: all catalog items inherit from a base * type. */ void selectionChanged(QTreeWidgetItem * current,QTreeWidgetItem * previous); void actionAppendPosition(); protected slots: void slotSelectCatalog( const QString& ); // void slotAppendToDoc( QListViewItem *item = 0 ); void slotCatalogDoubleClicked( QModelIndex ); private: QComboBox *mCatalogSelector; QStackedWidget *mWidgets; QMap mWidgetMap; FilterHeader *mListSearchLine; }; #endif kraft-1.2.2/src/catalogtemplate.cpp000066400000000000000000000072721467704360200173050ustar00rootroot00000000000000/*************************************************************************** catalogtemplate - template base class for catalog data ------------------- begin : Oct 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include "catalogtemplate.h" #include "unitmanager.h" CatalogTemplate::CatalogTemplate() : m_calcType( Calculation ), mUseCounter(0), mEntered( QDateTime::currentDateTime() ), mLastModified( QDateTime::currentDateTime() ), mUnitId(0) { } CatalogTemplate::~CatalogTemplate() { } CatalogTemplate::CalculationType CatalogTemplate::calcKind() { return m_calcType; } void CatalogTemplate::setCalculationType( CalculationType t ) { m_calcType = t; } QString CatalogTemplate::calcKindString() const { if( m_calcType == ManualPrice ) return i18n("Manual Price"); else if( m_calcType == Calculation ) return i18n("Calculated"); else if( m_calcType == AutoCalc ) return i18n("AutoCalc"); else return i18n( "Err: Unknown type %d", m_calcType); } void CatalogTemplate::setEnterDate( const QDateTime& d ) { mEntered = d; } QDateTime CatalogTemplate::enterDate() { return mEntered; } void CatalogTemplate::setModifyDate( const QDateTime& d ) { mLastModified = d; } QDateTime CatalogTemplate::modifyDate() { return mLastModified; } void CatalogTemplate::setLastUsedDate( const QDateTime &d ) { mLastUsed = d; } QDateTime CatalogTemplate::lastUsedDate() { return mLastUsed; } void CatalogTemplate::setUseCounter( int cnt ) { mUseCounter = cnt; } int CatalogTemplate::useCounter() { return mUseCounter; } QString CatalogTemplate::getText() const { return mText; } void CatalogTemplate::setText( const QString& str ) { mText = str; } void CatalogTemplate::setUnitId(int id) { mUnitId = id; } Einheit CatalogTemplate::unit() const { return UnitManager::self()->getUnit(mUnitId); } void CatalogTemplate::setChapterId( const dbID& id, bool persist ) { // qDebug () << "set chapterId to " << id.toString(); mChapterId = id; if( persist ) { saveChapterId(); } } void CatalogTemplate::saveChapterId() { // qDebug () << "WRN: Chapter ID saving for template not implemented!"; } dbID CatalogTemplate::chapterId() { return mChapterId; } // ================================================================================ CatalogTemplateList::CatalogTemplateList() :QList() { } CatalogTemplateList::~CatalogTemplateList() { } int CatalogTemplateList::compareItems( CatalogTemplate *ct1, CatalogTemplate *ct2 ) { // CatalogTemplate* ct1 = static_cast( i1 ); // CatalogTemplate* ct2 = static_cast( i2 ); // qDebug () << "********************************* In Sort!"; if ( !( ct1 && ct2 ) ) return 0; int sortKey1 = ct1->sortKey(); int sortKey2 = ct2->sortKey(); if ( sortKey1 == sortKey2 ) return 0; if ( sortKey1 < sortKey2 ) return -1; return 1; } kraft-1.2.2/src/catalogtemplate.h000066400000000000000000000054151467704360200167470ustar00rootroot00000000000000/*************************************************************************** catalogtemplate - template base class for catalog data ------------------- begin : Oct 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef CATALOGTEMPLATE_H #define CATALOGTEMPLATE_H /** * base class that is the base for all templates in kraft catalogs. */ #include #include "kraftcat_export.h" #include "dbids.h" class QWidget; class CatalogSelection; class Katalog; class Geld; class Einheit; class KRAFTCAT_EXPORT CatalogTemplate { public: typedef enum { Unknown, ManualPrice, Calculation, AutoCalc } CalculationType; CatalogTemplate(); virtual ~CatalogTemplate(); virtual bool save() = 0; virtual Geld unitPrice() = 0; CalculationType calcKind(); void setCalculationType( CalculationType t ); QString calcKindString() const ; int sortKey() { return mSortKey; } void setSortKey( int k ) { mSortKey = k; } void setEnterDate( const QDateTime& ); QDateTime enterDate(); void setModifyDate( const QDateTime& ); QDateTime modifyDate(); void setLastUsedDate( const QDateTime& ); QDateTime lastUsedDate(); void setUseCounter( int ); int useCounter(); QString getText() const; void setText( const QString& ); void setChapterId( const dbID&, bool ); dbID chapterId(); Einheit unit() const; void setUnitId(int id); protected: virtual void saveChapterId(); CalculationType m_calcType; int mSortKey; int mUseCounter; dbID mChapterId; // the chapter (==parent) of the item QDateTime mEntered; QDateTime mLastModified; QDateTime mLastUsed; QString mText; private: int mUnitId; }; class KRAFTCAT_EXPORT CatalogTemplateList : public QList { public: CatalogTemplateList(); virtual ~CatalogTemplateList(); protected: // int compareItems( QPtrCollection::Item, QPtrCollection::Item ); virtual int compareItems( CatalogTemplate*, CatalogTemplate* ); }; typedef QListIterator CatalogTemplateListIterator; #endif kraft-1.2.2/src/catalogtemplateprovider.cpp000066400000000000000000000053201467704360200210500ustar00rootroot00000000000000/*************************************************************************** catalogtemplateprovider - template provider class for catalog data ------------------- begin : 2007-05-23 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include "catalogtemplateprovider.h" #include "texteditdialog.h" #include "doctext.h" #include "defaultprovider.h" #include "katalog.h" #include "catalogselection.h" CatalogTemplateProvider::CatalogTemplateProvider( QWidget *parent ) :TemplateProvider( parent ), mCatalogSelection(nullptr) { } Katalog *CatalogTemplateProvider::currentCatalog() { Katalog *kat {nullptr}; if (mCatalogSelection) { kat = mCatalogSelection->currentSelectedKat(); } return kat; } void CatalogTemplateProvider::setCatalogSelection( CatalogSelection *cs ) { mCatalogSelection = cs; connect( mCatalogSelection, SIGNAL( actionAppendPosition() ), this, SLOT( slotTemplateToDocument() ) ); } void CatalogTemplateProvider::slotNewTemplate() { qDebug () << "SlotNewTemplate for Catalog called!"; if ( mCatalogSelection ) { Katalog *catalog = mCatalogSelection->currentSelectedKat(); CatalogTemplateList list; const QString currKat = mCatalogSelection->currentSelectedKatChapter(); emit templatesToDocument(catalog, list, currKat); } } void CatalogTemplateProvider::slotEditTemplate() { // qDebug () << "SlotEditTemplate for Catalog called!"; // mCatalogSelection->currentSelectedPositions } void CatalogTemplateProvider::slotDeleteTemplate() { } void CatalogTemplateProvider::slotTemplateToDocument() { // qDebug () << "Moving catalog entry to document"; if ( mCatalogSelection ) { Katalog *catalog = mCatalogSelection->currentSelectedKat(); emit templatesToDocument(catalog, mCatalogSelection->currentSelectedPositions(), QString()); } } void CatalogTemplateProvider::slotInsertTemplateToDocument() { } kraft-1.2.2/src/catalogtemplateprovider.h000066400000000000000000000034541467704360200205230ustar00rootroot00000000000000/*************************************************************************** catalogtemplateprovider - template provider classes for catalog data ------------------- begin : 2007-05-24 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef CATALOGTEMPLATEPROVIDER_H #define CATALOGTEMPLATEPROVIDER_H #include "templateprovider.h" #include "doctext.h" #include "catalogtemplate.h" #include "katalog.h" class QWidget; class CatalogSelection; class CatalogTemplateProvider : public TemplateProvider { Q_OBJECT public: CatalogTemplateProvider( QWidget* ); void setCatalogSelection( CatalogSelection * ); Katalog *currentCatalog(); signals: void templatesToDocument( Katalog*, CatalogTemplateList, const QString& ); void catalogSelected(Katalog*); public slots: void slotNewTemplate() override; void slotEditTemplate() override; void slotDeleteTemplate() override; void slotTemplateToDocument() override; void slotInsertTemplateToDocument() override; private: CatalogSelection *mCatalogSelection; }; #endif kraft-1.2.2/src/createdb.ui000066400000000000000000000077241467704360200155450ustar00rootroot00000000000000 createDbForm 0 0 395 232 Database creation and initial schema setup: true 0 %p% 0 / 129 30 0 X Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Filling the database with initial values: true 0 %p% 0 / 129 30 0 X Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 Status: QFrame::NoFrame Database setup status… true Qt::Vertical 20 149 kraft-1.2.2/src/databasesettings.kcfg000066400000000000000000000030121467704360200176000ustar00rootroot00000000000000 localhost -1 root kraft-1.2.2/src/databasesettings.kcfgc000066400000000000000000000001241467704360200177440ustar00rootroot00000000000000File=databasesettings.kcfg ClassName=DatabaseSettings Singleton=true Mutators=true kraft-1.2.2/src/dbids.h000066400000000000000000000043001467704360200146560ustar00rootroot00000000000000/*************************************************************************** dbids.h - database id class ------------------- begin : ? copyright : (C) 2006- by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef DBIDS_H #define DBIDS_H #include #include #include #include /** * utility class that provides a simple database id object. * It's useful to work with dicts which do not work on base * types like int */ class dbID { public: dbID(int id):m_id(id){} dbID():m_id(-1){} int intID() const { return m_id; } bool operator==( const int& _u ) const { return m_id == _u; } bool operator==( const long& _u ) const { return m_id == _u; } bool operator==( const dbID& _u ) const { return m_id == _u.m_id; } bool operator!=( const dbID& _u ) const { return m_id != _u.m_id; } dbID& operator=( const QString& _u ) { bool ok; int id = _u.toInt( &ok ); if( ok ) { m_id = id; } return *this; } bool operator<( dbID _id ) { if( m_id < _id.toInt() ) return true; return false; } dbID& operator=( const int _u ) { m_id = _u; return *this; } bool isOk() const { return m_id > -1; } int toInt() { return m_id; } QString toString() const { return QString::number(m_id); } private: int m_id; }; typedef QList DBIdList; #endif kraft-1.2.2/src/dbinit.ui000066400000000000000000000054541467704360200152430ustar00rootroot00000000000000 dbInitWidget 0 0 556 244 Database update: true Overall progress: 0 %p% TextLabel Detailed progress: 0 %p% TextLabel Status: TextLabel kraft-1.2.2/src/dbselect.ui000066400000000000000000000036361467704360200155570ustar00rootroot00000000000000 dbSelectForm 0 0 419 255 <html><head/><body><p>Kraft uses a database backend to store values. By default it uses a file based database with easy setup targeted to single user mode.</p><p><br/></p></body></html> true SQLite 3 - file based database (default) true buttonGroup MySQL Serverbased Database for advanced Setups buttonGroup Qt::Vertical 20 94 kraft-1.2.2/src/defaultprovider.cpp000066400000000000000000000222211467704360200173250ustar00rootroot00000000000000/*************************************************************************** defaultprovider.cpp - Default Providing Class ------------------- begin : November 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include "defaultprovider.h" #include "kraftdb.h" #include "doctext.h" #include "kraftsettings.h" #include "doctype.h" #include "kraftdoc.h" #include "dbids.h" #include Q_GLOBAL_STATIC(DefaultProvider, mSelf) DefaultProvider *DefaultProvider::self() { return mSelf; } DefaultProvider::DefaultProvider() { } QIcon DefaultProvider::icon(const QString& name) { const QString fullIconName = QString(":kraft/custom-icons/%1.svg").arg(name); const QIcon icon { fullIconName }; return icon; } QString DefaultProvider::docType() { QString type = KraftSettings::self()->doctype(); if ( type.isEmpty() ) { QStringList allTypes = DocType::allLocalised(); if( ! allTypes.isEmpty() ) { type = DocType::allLocalised()[0]; } else { type = i18n( "Unknown" ); } } return type; } DocTextList DefaultProvider::documentTexts( const QString& docType, KraftDoc::Part tt ) { DocTextList re; QString typeStr = DocText::textTypeToString( tt ); QString sql = QString( "SELECT texts.docTextID, texts.name, texts.text, texts.description, " "texts.textType, types.name as docTypeName FROM DocTexts texts, " "DocTypes types WHERE texts.docTypeId=types.docTypeID AND " "types.name=\'%1\' AND textType = \'%2\'").arg( docType ).arg( typeStr ); // qDebug() << "Reading texts from DB with: " << sql; QSqlQuery query( sql ); if ( query.isActive() ) { while ( query.next() ) { DocText dt; dt.setDbId( query.value( 0 ) /* docTextID */ .toInt() ); dt.setName( query.value( 1 ) /* name */ .toString() ); dt.setText( KraftDB::self()->mysqlEuroDecode( query.value( 2 ) /* text */ .toString() ) ); dt.setDescription( query.value( 3 ) /* description */ .toString() ); dt.setTextType( DocText::stringToTextType( query.value( 4 ) /* textType */ .toString() ) ); dt.setDocType( query.value( 5 ) /* docType */ .toString() ); re.append( dt ); } } return re; } QString DefaultProvider::defaultText( const QString& docType, KraftDoc::Part p, DocGuardedPtr ) { QString re; DocTextList list = documentTexts( docType, p ); DocTextList::iterator it; for ( it = list.begin(); it != list.end(); ++it ) { if( (*it).isStandardText() ) { re = ( *it ).text(); break; } } return re; } dbID DefaultProvider::saveDocumentText( const DocText& t ) { dbID retVal; QSqlTableModel model; model.setTable( "DocTexts" ); if ( t.dbId().isOk() ) { // qDebug () << "Doing update!"; model.setFilter( "docTextID=" + t.dbId().toString() ); model.select(); if( model.rowCount() > 0 ) { QSqlRecord record = model.record(0); record.setValue( "docTextID", t.dbId().toString() ); record.setValue( "name", t.name() ); record.setValue( "description", t.description() ); record.setValue( "text", KraftDB::self()->mysqlEuroEncode( t.text() ) ); record.setValue( "docType", t.docType() ); record.setValue( "docTypeId", DocType::docTypeId( t.docType() ).toString() ); record.setValue( "textType", t.textTypeString() ); model.setRecord(0, record); model.submitAll(); } } else { // qDebug () << "Doing insert!"; QSqlRecord record = model.record(); record.setValue( "name", t.name() ); record.setValue( "description", t.description() ); record.setValue( "text", KraftDB::self()->mysqlEuroEncode( t.text() ) ); record.setValue( "docType", t.docType() ); record.setValue( "docTypeId", DocType::docTypeId( t.docType() ).toString() ); record.setValue( "textType", t.textTypeString() ); model.insertRecord(-1, record); model.submitAll(); } retVal = KraftDB::self()->getLastInsertID(); return retVal; } QLocale* DefaultProvider::locale() { return &_locale; } void DefaultProvider::deleteDocumentText( const DocText& dt ) { if ( dt.dbId().isOk() ) { QSqlQuery q; q.prepare("DELETE FROM DocTexts WHERE docTextID=" + dt.dbId().toString() ) ; q.exec(); } else { // qDebug () << "Delete document text not ok: " << dt.text(); } } QString DefaultProvider::currencySymbol() const { return self()->locale()->currencySymbol(); } QString DefaultProvider::iconvTool() const { return locateBinary( "iconv" ); } QString DefaultProvider::getStyleSheet( const QString& styleName ) const { QString style; if( styleName.isEmpty() ) return style; const QString findFile = QString("styles/%1.style").arg(styleName); const QString tmplFile = locateFile(findFile); QFile data( tmplFile ); if (data.open( QFile::ReadOnly )) { QTextStream readIn( &data ); style = readIn.readAll(); data.close(); } return style; } // this method first checks if KRAFT_HOME is set. If it is it tries to read the files from there. // If KRAFT_HOME is not set, it uses QStandardPath::locate from the AppDataLocation to find // files. // // For AppImage, this method should actually look relative to the application directory. // QString DefaultProvider::locateFile(const QString& findFile) const { QString re; const QString kraftHome = QString::fromUtf8(qgetenv( "KRAFT_HOME" )); if (!kraftHome.isEmpty()){ // KRAFT_HOME is set QString fifi {kraftHome}; if (!fifi.endsWith('/') && !findFile.startsWith('/')) fifi.append('/'); fifi.append(findFile); if (QFile::exists(fifi)) { re = fifi; } } if (re.isEmpty()) { // it was not found in the system location or in KRAFT_HOME // If so, check relative to the binary for AppImage. QString fifi = QString("%1/../share/kraft/%2").arg(QCoreApplication::applicationDirPath()).arg(findFile); if (QFile::exists(fifi)) { QFileInfo fi(fifi); re = fi.absoluteFilePath(); } } // check the system paths if (re.isEmpty()) { // prepend the kraft path segment and look in the system resources QString fifi {findFile}; re = QStandardPaths::locate( QStandardPaths::AppDataLocation, fifi); } if (re.isEmpty()) { qDebug() << "locateFile could not find file " << findFile; } return re; } QStringList DefaultProvider::locatePythonTool(const QString& toolName) const { QString fullPath; // first use the standard locateFile to consider KRAFT_HOME and relative... fullPath = locateFile("tools/" + toolName); // if that is empty, go for the system executables if (fullPath.isEmpty()) { fullPath = QStandardPaths::findExecutable(toolName); } QFileInfo fi(fullPath); if (!fi.exists()) { fullPath.clear(); } // -- check for python. // Default is python3 // If Kraft is running from an AppImage, we rather use the python from conda which is // installed in a relative path. QString python {"python3"}; const QString pypath = QCoreApplication::applicationDirPath() + QStringLiteral("/../conda/bin/python"); QFileInfo fip(pypath); if (fip.exists() && fip.isExecutable()) { python = fip.canonicalFilePath(); } QStringList rep {python, fullPath}; qDebug() << "Returning tool path" << rep; return rep; } QString DefaultProvider::locateBinary(const QString& name) const { // check the current app path and check if the binary is in there. (AppImage) const QString path = QCoreApplication::applicationDirPath(); const QString localPrg = QString("%1/%2").arg(path).arg(name); QFileInfo fi{localPrg}; if (fi.exists() && fi.isExecutable()) { qDebug() << "Returning tool path" << fi.absoluteFilePath() << "for" << name; return fi.absoluteFilePath(); } const QString bin = QStandardPaths::findExecutable( name ); return bin; } bool DefaultProvider::writeXmlArchive() { return KraftSettings::self()->doXmlArchive(); } QString DefaultProvider::xmlArchivePath() { return KraftSettings::self()->xmlArchivePath(); } QString DefaultProvider::pdfOutputDir() { return KraftSettings::self()->pdfOutputDir(); } DefaultProvider::~DefaultProvider() { } kraft-1.2.2/src/defaultprovider.h000066400000000000000000000043171467704360200170000ustar00rootroot00000000000000/*************************************************************************** defaultprovider.h - Defaults for this and that ------------------- begin : November 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef DEFAULTPROVIDER_H #define DEFAULTPROVIDER_H #include #include "kraftcat_export.h" #include "kraftdoc.h" #include "doctext.h" class QSqlRecord; class QStringList; class dbID; /** * encapsulates all relevant for default values for documents such as * texts etc. */ class KRAFTCAT_EXPORT DefaultProvider { public: ~DefaultProvider(); static DefaultProvider *self(); QIcon icon(const QString& name); QString defaultText( const QString&, KraftDoc::Part, DocGuardedPtr = 0 ); dbID saveDocumentText( const DocText& ); void deleteDocumentText( const DocText& ); QString docType(); // the default document type for new docs DocTextList documentTexts( const QString&, KraftDoc::Part ); QString currencySymbol() const; QLocale* locale(); QString iconvTool() const; QStringList locatePythonTool(const QString& toolName) const; QString locateBinary(const QString& name) const; QString locateFile(const QString& findFile) const; QString getStyleSheet( const QString& ) const; DefaultProvider(); bool writeXmlArchive(); QString pdfOutputDir(); QString xmlArchivePath(); private: // static DefaultProvider *mSelf; QLocale _locale; const QString EuroTag; }; #endif kraft-1.2.2/src/docassistant.cpp000066400000000000000000000365601467704360200166400ustar00rootroot00000000000000/*************************************************************************** docassistant.cpp - Assistant widget ------------------- begin : April 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include "docassistant.h" #include "docpostcard.h" #include "catalogselection.h" #include "textselection.h" #include "kraftsettings.h" #include "kataloglistview.h" #include "doctext.h" #include "defaultprovider.h" #include "headertemplateprovider.h" #include "footertemplateprovider.h" #include "catalogtemplateprovider.h" #include "addresstemplateprovider.h" DocAssistant::DocAssistant( QWidget *parent ): QSplitter( parent ), mFullPreview( true ), mActivePage( KraftDoc::Header ) { setOrientation( Qt::Vertical ); QWidget *topWidget = new QWidget; QVBoxLayout *topVBox = new QVBoxLayout; topVBox->setMargin(0); topWidget->setLayout( topVBox ); QHBoxLayout *buttonLayout = new QHBoxLayout; topVBox->addLayout( buttonLayout ); QPushButton *pb = new QPushButton( i18n( "Show &Templates" ) ); buttonLayout->addWidget( pb ); connect( pb, SIGNAL( toggled( bool ) ), this, SLOT( slotToggleShowTemplates( bool ) ) ); pb->setCheckable( true ); pb->setToolTip( i18n( "Show mask to create or select templates to be used in the document" ) ); buttonLayout->addStretch(); topVBox->addLayout(buttonLayout); mPostCard = new DocPostCard; mPostCard->slotSetMode( DocPostCard::Full, KraftDoc::Header ); // setResizeMode( vb /* mPostCard->view() */, KeepSize ); topVBox->addWidget(mPostCard); addWidget(topWidget); mTemplatePane = new QWidget; QVBoxLayout *bottomVBox = new QVBoxLayout; bottomVBox->setMargin(0); mTemplatePane->setLayout( bottomVBox ); addWidget( mTemplatePane ); setStretchFactor(0, 0); setStretchFactor(1, 0); mWidgetStack = new QStackedWidget; bottomVBox->addWidget( mWidgetStack ); mWidgetStack->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); /* Selections are the gui reprenentations of the template providing catalogs * like header- and footer texts and catalogs. */ mCatalogSelection = new CatalogSelection; mWidgetStack->addWidget( mCatalogSelection ); connect( mCatalogSelection, SIGNAL( selectionChanged(QTreeWidgetItem*,QTreeWidgetItem*) ), this, SLOT( slotCatalogSelectionChanged(QTreeWidgetItem*,QTreeWidgetItem*) ) ); mHeaderSelector = new TextSelection( 0, KraftDoc::Header ); mWidgetStack->addWidget( mHeaderSelector ); connect( mHeaderSelector, SIGNAL(validTemplateSelected() ), this, SLOT( slotTemplateSelectionChanged() ) ); connect( mHeaderSelector, SIGNAL(editCurrentTemplate()), this, SLOT(slotEditTemplate())); mFooterSelection = new TextSelection( 0, KraftDoc::Footer ); mWidgetStack->addWidget( mFooterSelection ); connect( mFooterSelection, SIGNAL(validTemplateSelected()), this, SLOT(slotTemplateSelectionChanged())); connect( mFooterSelection, SIGNAL(editCurrentTemplate()), this, SLOT(slotEditTemplate())); connect( mFooterSelection, SIGNAL( actionCurrentTextToDoc() ), this, SLOT( slotAddToDocument() ) ); connect( mPostCard, SIGNAL( selectPage( int ) ), this, SLOT( slotSelectDocPart( int ) ) ); QHBoxLayout *butHBox2 = new QHBoxLayout; bottomVBox->addLayout( butHBox2 ); QIcon icons = DefaultProvider::self()->icon( "arrow-narrow-left" ); mPbAdd = new QPushButton( icons, QString() ); mPbAdd->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ); connect( mPbAdd, SIGNAL( clicked() ), this, SLOT( slotAddToDocument() ) ); butHBox2->addWidget( mPbAdd ); mPbAdd->setToolTip( i18n( "Add a template to the document" ) ); icons = DefaultProvider::self()->icon( "arrow-bar-to-left" ); mPbInsert = new QPushButton( icons, QString() ); mPbInsert->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ); connect( mPbInsert, SIGNAL( clicked() ), this, SLOT( slotInsertIntoDocument() ) ); butHBox2->addWidget( mPbInsert); mPbInsert->setToolTip( i18n( "Insert the template to the document" ) ); butHBox2->insertSpacing(2, 40); icons = DefaultProvider::self()->icon( "plus" ); mPbNew = new QPushButton( icons, QString() ); // KDE 4 icon name: document-new mPbNew->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ); connect( mPbNew, SIGNAL( clicked() ), this, SLOT( slotNewTemplate() ) ); mPbNew->setToolTip( i18n( "Create a new template" ) ); butHBox2->addWidget( mPbNew ); icons = DefaultProvider::self()->icon( "edit" ); mPbEdit = new QPushButton( icons, QString() ); // KDE 4 icon name: document-properties mPbEdit->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ); connect( mPbEdit, SIGNAL( clicked() ), this, SLOT( slotEditTemplate() ) ); mPbEdit->setToolTip( i18n( "Edit the current template" ) ); butHBox2->addWidget( mPbEdit ); icons = DefaultProvider::self()->icon( "x" ); mPbDel = new QPushButton( icons, QString() ); // KDE 4 icon name: edit-delete mPbDel->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ); connect( mPbDel, SIGNAL( clicked() ), this, SLOT( slotDeleteTemplate() ) ); mPbDel->setToolTip( i18n( "Delete the current template" ) ); butHBox2->addWidget( mPbDel ); butHBox2->addStretch(); mPbAdd->setEnabled( false ); mPbNew->setEnabled( false ); mPbEdit->setEnabled( false ); mPbDel->setEnabled( false ); mPbInsert->setEnabled(false); /* Template Provider initialisations */ mHeaderTemplateProvider = new HeaderTemplateProvider( parent ); /* get a new header text from the default provider */ connect( mHeaderTemplateProvider, SIGNAL( newHeaderText( const DocText& ) ), this, SLOT( slotNewHeaderDocText( const DocText& ) ) ); connect( mHeaderTemplateProvider, SIGNAL( updateHeaderText( const DocText& ) ), this, SLOT( slotUpdateHeaderDocText( const DocText& ) ) ); connect( mHeaderTemplateProvider, &HeaderTemplateProvider::headerTextToDocument, this, &DocAssistant::headerTextTemplate); connect( mHeaderTemplateProvider, SIGNAL( headerTextToDocument( const DocText& ) ), this, SLOT( slotHeaderTextToDocument( const DocText& ) ) ); connect( mHeaderTemplateProvider, SIGNAL( deleteHeaderText( const DocText& ) ), this, SLOT( slotHeaderTextDeleted( const DocText& ) ) ); mHeaderTemplateProvider->setSelection( mHeaderSelector ); mFooterTemplateProvider = new FooterTemplateProvider( parent ); /* get a new Footer text from the default provider */ connect( mFooterTemplateProvider, SIGNAL( newFooterText( const DocText& ) ), this, SLOT( slotNewFooterDocText( const DocText& ) ) ); connect( mFooterTemplateProvider, SIGNAL( updateFooterText( const DocText& ) ), this, SLOT( slotUpdateFooterDocText( const DocText& ) ) ); connect( mFooterTemplateProvider, &FooterTemplateProvider::footerTextToDocument, this, &DocAssistant::footerTextTemplate); connect( mFooterTemplateProvider, SIGNAL( deleteFooterText( const DocText& ) ), this, SLOT( slotFooterTextDeleted( const DocText& ) ) ); mFooterTemplateProvider->setSelection( mFooterSelection ); /* Catalog Template Provider */ mCatalogTemplateProvider = new CatalogTemplateProvider( parent ); mCatalogTemplateProvider->setCatalogSelection( mCatalogSelection ); connect(mCatalogTemplateProvider, &CatalogTemplateProvider::templatesToDocument, this, &DocAssistant::templatesToDocument); mCurrTemplateProvider = mHeaderTemplateProvider; const QList sizes = KraftSettings::self()->assistantSplitterSetting(); if( sizes.count() > 0 ) { setSizes( sizes ); } mTemplatePane->hide(); } void DocAssistant::slotInsertIntoDocument() { // qDebug () << "SlotInsertIntoDocument called!"; if ( mCurrTemplateProvider ) { mCurrTemplateProvider->slotInsertTemplateToDocument(); } } void DocAssistant::slotAddToDocument() { // qDebug () << "SlotAddToDocument called!"; if ( mCurrTemplateProvider ) { mCurrTemplateProvider->slotTemplateToDocument(); } } void DocAssistant::slotTemplateSelectionChanged( ) { if (!mCurrTemplateProvider) { mPbNew->setEnabled(false); mPbEdit->setEnabled(false); mPbDel->setEnabled(false); mPbInsert->setEnabled(false); return; } if( mActivePage == KraftDoc::Positions ) { // no editing on the catalogs bool enableNew {false}; auto kat = static_cast(mCurrTemplateProvider)->currentCatalog(); if (kat->type() == KatalogType::TemplateCatalog) { enableNew = true; } mPbNew->setEnabled(enableNew); mPbEdit->setEnabled( false ); mPbDel->setEnabled( false ); mPbInsert->setEnabled(false); } else { bool mv {false}; if( mActivePage == KraftDoc::Header ) { mv = mHeaderSelector->validSelection(); } else if( mActivePage == KraftDoc::Footer ) { mv = mFooterSelection->validSelection(); } mPbAdd->setEnabled( mv ); mPbNew->setEnabled( true ); mPbEdit->setEnabled( mv ); mPbDel->setEnabled( mv ); mPbInsert->setEnabled(mv); } } void DocAssistant::slotCatalogSelectionChanged(QTreeWidgetItem *current ,QTreeWidgetItem *) { // enable the move-to-document button. // qDebug () << "catalog position selection changed!"; if ( current ) { mPbAdd->setEnabled( true ); } else { mPbAdd->setEnabled( false ); } mPbInsert->setEnabled(false); slotTemplateSelectionChanged(); } void DocAssistant::slotNewTemplate() { /* always set the doc type in case the provider benefits from that */ mCurrTemplateProvider->slotSetDocType( mDocType ); mCurrTemplateProvider->slotNewTemplate(); } /* a new header doc text was created and should go to the document */ void DocAssistant::slotNewHeaderDocText( const DocText& dt ) { /* show in list of texts in the GUI */ mHeaderSelector->addNewDocText( dt ); } /* called with a changed text that needs to be updated in the view */ void DocAssistant::slotUpdateHeaderDocText( const DocText& dt ) { mHeaderSelector->updateDocText( dt ); } /* a new header doc text was created and should go to the document */ void DocAssistant::slotNewFooterDocText( const DocText& dt ) { /* show in list of texts in the GUI */ mFooterSelection->addNewDocText( dt ); } /* called with a changed text that needs to be updated in the view */ void DocAssistant::slotUpdateFooterDocText( const DocText& dt ) { mFooterSelection->updateDocText( dt ); } /* Slot that initiates an edit */ void DocAssistant::slotEditTemplate() { // qDebug () << "Editing a template using the currentTemplProvider"; if ( mCurrTemplateProvider ) { mCurrTemplateProvider->slotSetDocType( mDocType ); mCurrTemplateProvider->slotEditTemplate(); } } /* slot that initialises a delete, called from the delete button */ void DocAssistant::slotDeleteTemplate() { QMessageBox msgBox; msgBox.setText(i18n( "Do you really want to delete the template permanently?\n" "It cannot be recovered.")); msgBox.setStandardButtons(QMessageBox::Yes| QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if ( ret == QMessageBox::No ) { return; } if ( mCurrTemplateProvider ) { mCurrTemplateProvider->slotDeleteTemplate(); } } void DocAssistant::slotHeaderTextDeleted( const DocText& /* dt */) { mHeaderSelector->deleteCurrentText(); slotTemplateSelectionChanged( ); // disable the edit buttons etc. } void DocAssistant::slotFooterTextDeleted( const DocText& /* dt */) { mFooterSelection->deleteCurrentText(); slotTemplateSelectionChanged( ); // disable the edit buttons etc. } /* slot that opens the template details in case on == true */ void DocAssistant::slotToggleShowTemplates( bool on ) { if ( on ) { // setFullPreview is set in the subslots called from here, that // makes mFullPreview truly reflecting the state of the toggle button if ( mActivePage == KraftDoc::Header ) { slotShowHeaderTemplates(); } else if ( mActivePage == KraftDoc::Positions ) { slotShowCatalog(); } else if ( mActivePage == KraftDoc::Footer ) { slotShowFooterTemplates(); } } else { // hide the details setFullPreview( true, mActivePage ); } emit toggleShowTemplates( on ); } DocPostCard *DocAssistant::postCard() { return mPostCard; } CatalogSelection* DocAssistant::catalogSelection() { return mCatalogSelection; } /* sets the Part of the doc, eg. Header, Footer */ void DocAssistant::slotSelectDocPart( int p ) { mActivePage = p; if( mActivePage == KraftDoc::Header ) { mCurrTemplateProvider = mHeaderTemplateProvider; } else if( mActivePage == KraftDoc::Positions ) { mCurrTemplateProvider = mCatalogTemplateProvider; } else if( mActivePage == KraftDoc::Footer ) { mCurrTemplateProvider = mFooterTemplateProvider; } else { // qDebug () << "Alert: Unknown document part id: " << p; } emit selectPage( p ); slotToggleShowTemplates( !mFullPreview ); slotTemplateSelectionChanged( ); // hide the add, edit- and del buttons } /* Doc Type like offer, invoice etc. */ void DocAssistant::slotSetDocType( const QString& type ) { mDocType = type; mHeaderSelector->slotSelectDocType( type ); mFooterSelection->slotSelectDocType( type ); } void DocAssistant::slotShowCatalog( ) { setFullPreview( false, KraftDoc::Positions ); mWidgetStack->setCurrentWidget( mCatalogSelection ); } void DocAssistant::slotShowHeaderTemplates() { setFullPreview( false, KraftDoc::Header ); mWidgetStack->setCurrentWidget( mHeaderSelector ); } void DocAssistant::slotShowFooterTemplates() { setFullPreview( false, KraftDoc::Footer ); mWidgetStack->setCurrentWidget( mFooterSelection ); } void DocAssistant::setFullPreview( bool setFull, int id ) { if ( setFull ) { /* remember the sizes used before */ saveSplitterSizes(); mTemplatePane->hide(); mPostCard->slotSetMode( DocPostCard::Full, id ); mFullPreview = true; } else { mTemplatePane->show(); mPostCard->slotSetMode( DocPostCard::Mini, id ); if ( KraftSettings::self()->assistantSplitterSetting().size() == 2 ) { QList sizes = KraftSettings::self()->assistantSplitterSetting(); if( sizes.contains(0)) { sizes[0] = 50; sizes[1] = 50; } setSizes( sizes ); } mFullPreview = false; } } void DocAssistant::saveSplitterSizes() { if( mTemplatePane->isVisible() ) { const QList s = sizes(); KraftSettings::self()->setAssistantSplitterSetting( s ); } } kraft-1.2.2/src/docassistant.h000066400000000000000000000070771467704360200163060ustar00rootroot00000000000000/*************************************************************************** docassistant.h - Assistant widget ------------------- begin : April 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef DOCASSISTANT_H #define DOCASSISTANT_H #include #include #include #include #include #include "kraftdoc.h" #include "catalogtemplate.h" #include "docpostcard.h" #include "catalogselection.h" class TextSelection; class QWidget; class QPushButton; class Katalog; class TemplateProvider; class HeaderTemplateProvider; class CatalogTemplateProvider; class FooterTemplateProvider; class AddressTemplateProvider; class DocText; class QSplitter; using namespace KContacts; class DocAssistant : public QSplitter { Q_OBJECT public: DocAssistant( QWidget* ); DocPostCard *postCard(); CatalogSelection *catalogSelection(); void saveSplitterSizes(); public slots: void slotShowCatalog(); void slotShowHeaderTemplates(); void slotShowFooterTemplates(); void setFullPreview( bool, int ); void slotSelectDocPart( int ); void slotToggleShowTemplates( bool ); void slotAddToDocument(); void slotInsertIntoDocument(); void slotNewTemplate(); void slotEditTemplate(); void slotDeleteTemplate(); void slotSetDocType( const QString& ); protected slots: void slotTemplateSelectionChanged(); void slotFooterTextDeleted( const DocText& ); void slotHeaderTextDeleted( const DocText& ); void slotNewHeaderDocText( const DocText& ); void slotUpdateHeaderDocText( const DocText& ); void slotCatalogSelectionChanged( QTreeWidgetItem*,QTreeWidgetItem* ); void slotNewFooterDocText( const DocText& ); void slotUpdateFooterDocText( const DocText& ); signals: void selectPage( int ); void templatesToDocument( Katalog*, CatalogTemplateList, const QString&); void toggleShowTemplates( bool ); void addressTemplate( const Addressee& ); void headerTextTemplate( const DocText&, bool replace ); void footerTextTemplate( const DocText&, bool replace ); private: DocPostCard *mPostCard; CatalogSelection *mCatalogSelection; QStackedWidget *mWidgetStack; TextSelection *mFooterSelection; TextSelection *mHeaderSelector; bool mFullPreview; int mActivePage; QPushButton *mPbAdd; QPushButton *mPbInsert; QPushButton *mPbNew; QPushButton *mPbEdit; QPushButton *mPbDel; QWidget *mTemplatePane; QString mDocType; // QSplitter *mMainSplit; TemplateProvider *mCurrTemplateProvider; HeaderTemplateProvider *mHeaderTemplateProvider; AddressTemplateProvider *mAddressTemplateProvider; CatalogTemplateProvider *mCatalogTemplateProvider; FooterTemplateProvider *mFooterTemplateProvider; }; #endif kraft-1.2.2/src/docdigest.cpp000066400000000000000000000063361467704360200161040ustar00rootroot00000000000000/*************************************************************************** docdigest.cpp ------------------- begin : Wed Mar 15 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include "docdigest.h" #include "defaultprovider.h" #include "format.h" #include "kraftsettings.h" #include "doctype.h" DocDigest::DocDigest( dbID id, const QString& type, const QString& clientID ) :mID(id), mType( type ), mClientId( clientID ), mLocale( "kraft" ) { } DocDigest::DocDigest() :mLocale( "kraft" ) { } QString DocDigest::date() const { return Format::toDateString(mDate, KraftSettings::self()->dateFormat()); } QDate DocDigest::rawDate() const { return mDate; } QString DocDigest::lastModified() const { const QString re = QString( "%1 %2").arg( Format::toDateString(mLastModified.date(), KraftSettings::self()->dateFormat())) .arg(mLastModified.time().toString("hh:mm")); return re; } ArchDocDigestList DocDigest::archDocDigestList() const { const QString id(ident()); qDebug() << "Querying archdocs for document ident " << id; QSqlQuery query; query.prepare("SELECT archDocID, ident, docType, printDate, state FROM archdoc WHERE" " ident=:id ORDER BY printDate DESC" ); query.bindValue(":id", id); query.exec(); ArchDocDigestList archDocs; while(query.next()) { int archDocID = query.value(0).toInt(); const QString dbIdent = query.value(1).toString(); const QString docType = query.value(2).toString(); QDateTime printDateTime = query.value(3).toDateTime(); int state = query.value(4).toInt(); archDocs.append( ArchDocDigest( printDateTime, state, dbIdent, docType, dbID(archDocID) ) ); } return archDocs; } KContacts::Addressee DocDigest::addressee() const { return mContact; } void DocDigest::setAddressee( const KContacts::Addressee& contact ) { mContact = contact; } bool DocDigest::isXRechnungEnabled() const { const DocType dt(mType); return dt.isXRechnungEnabled(); } /* *************************************************************************** */ DocDigestsTimeline::DocDigestsTimeline() :mMonth( 0 ), mYear( 0 ) { } DocDigestsTimeline::DocDigestsTimeline( int m, int y ) :mMonth( m ), mYear( y ) { } void DocDigestsTimeline::setDigestList( const DocDigestList& list ) { mDigests = list; } kraft-1.2.2/src/docdigest.h000066400000000000000000000065241467704360200155500ustar00rootroot00000000000000/*************************************************************************** docdigest.h - ------------------- begin : Wed Mar 15 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef DOCDIGEST_H #define DOCDIGEST_H #include #include #include #include "dbids.h" #include "archdoc.h" class QString; class QDate; typedef QList ArchDocDigestList; class DocDigest { public: DocDigest( dbID id, const QString& type, const QString& clientID ); DocDigest(); QString clientId() const { return mClientId; } void setClientId( const QString& id ) { mClientId = id; } QString clientAddress() const { return mClientAddress; } void setClientAddress( const QString& address ) { mClientAddress = address; } KContacts::Addressee addressee() const; void setAddressee( const KContacts::Addressee& ); QString type() const { return mType; } bool isXRechnungEnabled() const; void setType( const QString& t ) { mType = t; } QString date() const; void setDate( const QDate& date ) { mDate = date; } QDate rawDate() const; QString lastModified() const; void setLastModified( const QDateTime& date ) { mLastModified = date; } QString id() const { return mID.toString(); } void setId( dbID id ) { mID = id; } QString ident() const { return mIdent; } void setIdent( const QString& ident ) { mIdent = ident; } QString whiteboard() const { return mWhiteboard; } void setWhiteboard( const QString& white ) { mWhiteboard = white; } void setProjectLabel( const QString& prjLabel ) { mProjectLabel = prjLabel; } QString projectLabel() const { return mProjectLabel; } ArchDocDigestList archDocDigestList() const; protected: dbID mID; QString mType; QString mClientId; QString mIdent; QString mWhiteboard; QString mProjectLabel; QString mClientAddress ; QDateTime mLastModified; QDate mDate; QLocale mLocale; private: KContacts::Addressee mContact; }; typedef QList DocDigestList; typedef QList DocDigestListIterator; class DocDigestsTimeline { public: DocDigestsTimeline(); DocDigestsTimeline( int, int ); int month() { return mMonth; } void setMonth( int m ) { mMonth = m; } int year() { return mYear; } void setYear( int y ) { mYear = y; } DocDigestList digests() { return mDigests; } void setDigestList( const DocDigestList& ); void clearDigestList() { mDigests.clear (); } private: int mMonth, mYear; DocDigestList mDigests; }; typedef QList DocDigestsTimelineList; #endif kraft-1.2.2/src/docdigestdetailview.cpp000066400000000000000000000441301467704360200201540ustar00rootroot00000000000000/*************************************************************************** docdigestdetailview.cpp - Details of a doc digest ------------------- begin : februry 2011 copyright : (C) 2011 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include "docdigest.h" #include "docdigestdetailview.h" #include "defaultprovider.h" #include "htmlview.h" #include "texttemplate.h" #include "archdoc.h" #include "format.h" DocDigestHtmlView::DocDigestHtmlView( QWidget *parent ) : HtmlView( parent ) { connect(this, SIGNAL(openUrl(QUrl)), this, SLOT(slotLinkClicked(QUrl))); } void DocDigestHtmlView::slotLinkClicked(const QUrl& url) { const QUrlQuery q(url); // Url is like "http://localhost/show_last_print?id=5" const QString idStr = q.queryItemValue(QLatin1String("id")); const QString path = url.path(); bool ok; if( path.endsWith("show_last_print")) { emit( showLastPrint( dbID(idStr.toInt(&ok)))); } else if (path.endsWith("export_xrechnung")) { emit( exportXRechnung(dbID(idStr.toInt(&ok)))); } } // ######################################################################################################### DocDigestDetailView::DocDigestDetailView(QWidget *parent) : QFrame(parent) { setFrameStyle(QFrame::StyledPanel+QFrame::Raised); QHBoxLayout *hbox = new QHBoxLayout; hbox->setSpacing(0); const int detailMinWidth = 260; setFixedHeight(200); // --- The left details box _leftDetails = new QLabel; hbox->addWidget(_leftDetails); _leftDetails->setTextFormat(Qt::RichText); _leftDetails->setMinimumWidth(detailMinWidth); _leftDetails->setFrameStyle(0); _leftDetails->setTextInteractionFlags(Qt::TextSelectableByMouse); // --- The middle HTML based view hbox->setMargin(0); setLayout( hbox ); mHtmlCanvas = new DocDigestHtmlView( this ); mHtmlCanvas->setFrameStyle(0); mHtmlCanvas->setStylesheetFile("docdigestview.css"); connect( mHtmlCanvas, SIGNAL(showLastPrint( const dbID& )), this, SIGNAL( showLastPrint( const dbID& ) ) ); connect( mHtmlCanvas, SIGNAL(exportXRechnung( const dbID& )), this, SIGNAL( exportXRechnung( const dbID& ) ) ); hbox->addWidget( mHtmlCanvas); const QString bgColor = mHtmlCanvas->palette().base().color().name(); const QString style = QStringLiteral("QLabel { " "background-color: %1; " "background-image: url(:/kraft/kraft_customer.png); background-repeat: repeat-none;" "background-position: top left; " "}").arg(bgColor); _leftDetails->setStyleSheet(style); _leftDetails->setWordWrap(true); // --- The right details Box const QString styleR = QStringLiteral("QLabel { " "background-color: %1;" "background-image: url(:/kraft/postit.png); background-repeat: repeat-none;" "background-position: top center;" "padding: 0px; " "padding-left: 10px; " "}").arg(bgColor); _rightDetails = new QLabel; _rightDetails->setTextFormat(Qt::RichText); _rightDetails->setStyleSheet(styleR); _rightDetails->setMinimumWidth(detailMinWidth); _rightDetails->setWordWrap(true); _rightDetails->setTextInteractionFlags(Qt::TextSelectableByMouse); hbox->addWidget(_rightDetails); } void DocDigestDetailView::slotClearView() { const QString details; mHtmlCanvas->displayContent( details ); } QString DocDigestDetailView::widgetStylesheet( Location loc, Detail det ) { const QString bgColor = mHtmlCanvas->palette().base().color().name(); QString style = QString("QLabel { background-color: %1; ").arg(bgColor); QString image; QString bgPos; if( loc == Left ) { if( det == Year ) { image = "Calendar_page.png"; bgPos = "center top"; style += QLatin1String("padding-top: 95px; "); } else if( det == Month ) { image = "Calendar_page.png"; bgPos = "center top"; style += QLatin1String("padding-top: 75px; "); } else { // Document image = "kraft_customer.png"; bgPos = "top left"; style += QLatin1String( "padding-top: 50px; padding-left:15px;"); } } else if(loc == Middle ) { if( det == Year ) { } else if( det == Month ) { } else { // Document } } else if(loc == Right ) { if( det == Year ) { } else if( det == Month ) { } else { // Document image = "postit.png"; bgPos = "top center"; style += QLatin1String("padding: 0px; padding-left: 30px; "); } } else { // undef. } if( !image.isEmpty() ) { style += QString("background-image: url(:/kraft/%1); background-repeat: repeat-none;" "background-position: %2;").arg(image).arg(bgPos); } style += QLatin1String("}"); return style; } #define DOCDIGEST_TAG void DocDigestDetailView::documentListing( TextTemplate *tmpl, int year, int month ) { QString minDate; QString maxDate; if( month > -1 ) { QDate theDate(year, month, 1); // not a year minDate = theDate.toString("yyyy-MM-dd"); int lastDay = theDate.daysInMonth(); theDate.setDate(year, month, lastDay); maxDate = theDate.toString("yyyy-MM-dd"); } else { // is is a year minDate = QString::number(year)+"-01-01"; maxDate = QString::number(year)+"-12-31"; } // read data in the given timeframe from database QSqlQuery q; const QString query = QString("SELECT archDocID, ident, MAX(printDate) FROM archdoc WHERE " "date BETWEEN date('%1') AND date('%2') " "GROUP BY ident").arg(minDate, maxDate); // qDebug() << "***" << query; QMap > docMatrix; q.prepare(query); q.exec(); while( q.next() ) { dbID archDocId(q.value(0).toInt()); const ArchDoc doc(archDocId); const QString docType = doc.docTypeStr(); Geld g; int n = 0; if( docMatrix.contains(docType)) { g = docMatrix[docType].second; n = docMatrix[docType].first; } Geld g1 = doc.nettoSum(); g += g1; docMatrix[docType].first = n+1; docMatrix[docType].second = g; } // now create the template tmpl->setValue("I18N_AMOUNT", i18n("Amount")); tmpl->setValue("I18N_TYPE", i18n("Type")); tmpl->setValue("I18N_SUM", i18n("Sum")); QStringList doctypes = docMatrix.keys(); doctypes.sort(); foreach( const QString dtype, doctypes ) { qDebug() << "creating doc list for "<createDictionary( "DOCUMENTS" ); tmpl->setValue("DOCUMENTS", "DOCTYPE", dtype); const QString am = QString::number(docMatrix[dtype].first); tmpl->setValue("DOCUMENTS", "AMOUNT", am); const QString sm = docMatrix[dtype].second.toLocaleString(); tmpl->setValue("DOCUMENTS", "SUM", sm); } } void DocDigestDetailView::slotShowMonthDetails( int year, int month ) { if( _monthTemplFileName.isEmpty() ) { _monthTemplFileName = DefaultProvider::self()->locateFile( "views/monthdigest.thtml" ); } TextTemplate tmpl; tmpl.setTemplateFileName(_monthTemplFileName); if( !tmpl.isOk() ) { return; } const QString monthStr = DefaultProvider::self()->locale()->monthName(month); const QString yearStr = QString::number(year); tmpl.setValue( DOCDIGEST_TAG("HEADLINE"), i18n("Results in %1 %2", monthStr, yearStr) ); tmpl.setValue( DOCDIGEST_TAG("YEAR_LABEL"), i18n("Year")); tmpl.setValue( DOCDIGEST_TAG("YEAR_NUMBER"), yearStr); tmpl.setValue( DOCDIGEST_TAG("MONTH_LABEL"), i18n("Month")); tmpl.setValue( DOCDIGEST_TAG("MONTH_NAME"), monthStr); // Document listing documentListing(&tmpl, year, month); // left and right information blocks _leftDetails->setStyleSheet(widgetStylesheet(Left, Month)); _leftDetails->setText( "

              "+monthStr + "
              " + yearStr + "

              "); _leftDetails->setAlignment(Qt::AlignHCenter); _rightDetails->setStyleSheet(widgetStylesheet(Right, Month)); _rightDetails->clear(); const QString details = tmpl.expand(); mHtmlCanvas->displayContent(details); } void DocDigestDetailView::slotShowYearDetails( int year ) { if( _yearTemplFileName.isEmpty() ) { _yearTemplFileName = DefaultProvider::self()->locateFile( "views/yeardigest.thtml" ); } TextTemplate tmpl; tmpl.setTemplateFileName(_yearTemplFileName); if( !tmpl.isOk() ) { return; } const QString yearStr = QString::number(year); tmpl.setValue( DOCDIGEST_TAG("YEAR_LABEL"), i18n("Year")); tmpl.setValue( DOCDIGEST_TAG("YEAR_NUMBER"), yearStr); tmpl.setValue( DOCDIGEST_TAG("HEADLINE"), i18n("Results in Year %1", yearStr) ); documentListing(&tmpl, year, -1); const QString details = tmpl.expand(); _leftDetails->setStyleSheet(widgetStylesheet(Left, Year)); _leftDetails->setText("

              "+ yearStr +"

              "); _leftDetails->setAlignment(Qt::AlignHCenter); _rightDetails->setStyleSheet(widgetStylesheet(Right, Year)); _rightDetails->clear(); mHtmlCanvas->displayContent( details ); } void DocDigestDetailView::showAddress( const KContacts::Addressee& addressee, const QString& manAddress ) { Q_UNUSED(addressee) QString content = "

              " + i18n("Customer") +"

              "; if( !manAddress.isEmpty() ) { content += "
              " + manAddress +"
              "; } else { content += QLatin1String("

              ")+i18n("not set")+QLatin1String("

              "); } _leftDetails->setText( content ); #if 0 // tmpl.setValue( "URL", mHtmlCanvas->baseURL().prettyUrl()); tmpl.setValue( DOCDIGEST_TAG( "CUSTOMER_LABEL" ), i18n("Customer")); KContacts::Addressee addressee = digest.addressee(); QString adr = digest.clientAddress(); adr.replace('\n', "
              " ); tmpl.setValue( DOCDIGEST_TAG("CUSTOMER_ADDRESS_FIELD"),adr ); QString addressBookInfo; if( addressee.isEmpty() ) { if( digest.clientId().isEmpty() ) { addressBookInfo = i18n("The address is not listed in an address book."); } else { addressBookInfo = i18n("The client has the address book id %1 but cannot found in our address books.", digest.clientId()); } } else { addressBookInfo = i18n("The client can be found in our address books."); tmpl.createDictionary( "CLIENT_ADDRESS_SECTION"); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENTID" ), digest.clientId() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_ADDRESS" ), digest.clientAddress() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_NAME"), addressee.realName() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_ORGANISATION"), addressee.organization() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_URL"), addressee.url().toString() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_EMAIL"), addressee.preferredEmail() ); KContacts::Address clientAddress; clientAddress = addressee.address( KContacts::Address::Pref ); QString addressType = i18n("preferred address"); if( clientAddress.isEmpty() ) { clientAddress = addressee.address( KContacts::Address::Home ); addressType = i18n("home address"); } if( clientAddress.isEmpty() ) { clientAddress = addressee.address( KContacts::Address::Work ); addressType = i18n("work address"); } if( clientAddress.isEmpty() ) { clientAddress = addressee.address( KContacts::Address::Postal ); addressType = i18n("postal address"); } if( clientAddress.isEmpty() ) { clientAddress = addressee.address( KContacts::Address::Intl ); addressType = i18n("international address"); } if( clientAddress.isEmpty() ) { clientAddress = addressee.address( KContacts::Address::Dom ); addressType = i18n("domestic address"); } if( clientAddress.isEmpty() ) { addressType = i18n("unknown"); // qDebug () << "WRN: Address is still empty!"; } tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_POSTBOX" ), clientAddress.postOfficeBox() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_EXTENDED" ), clientAddress.extended() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_STREET" ), clientAddress.street() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_LOCALITY" ), clientAddress.locality() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_REGION" ), clientAddress.region() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_POSTCODE" ), clientAddress.postalCode() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_COUNTRY" ), clientAddress.country() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_REGION" ), clientAddress.region() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_LABEL" ), clientAddress.label() ); tmpl.setValue( "CLIENT_ADDRESS_SECTION", DOCDIGEST_TAG( "CLIENT_ADDRESS_TYPE" ), addressType ); } tmpl.setValue( DOCDIGEST_TAG("CUSTOMER_ADDRESSBOOK_INFO"), addressBookInfo ); #endif } void DocDigestDetailView::slotShowDocDetails( DocDigest digest ) { // qDebug () << "Showing details about this doc: " << digest.id(); if( _docTemplFileName.isEmpty() ) { // QString templFileName = QString( "kraftdoc_%1_ro.trml" ).arg( doc->docType() ); _docTemplFileName = DefaultProvider::self()->locateFile( "views/docdigest.thtml" ); } TextTemplate tmpl; // template file with name docdigest.trml tmpl.setTemplateFileName(_docTemplFileName); if( !tmpl.isOk() ) { return; } tmpl.setValue( DOCDIGEST_TAG( "HEADLINE" ), digest.type() + " " + digest.ident() ); tmpl.setValue( DOCDIGEST_TAG( "DATE" ), digest.date() ); tmpl.setValue( DOCDIGEST_TAG( "DATE_LABEL" ), i18n("Date") ); tmpl.setValue( DOCDIGEST_TAG( "WHITEBOARD"), digest.whiteboard() ); tmpl.setValue( DOCDIGEST_TAG( "WHITEBOARD_LABEL"), i18n("Whiteboard")); if( !digest.projectLabel().isEmpty() ) { tmpl.createDictionary( "PROJECT_INFO" ); tmpl.setValue( "PROJECT_INFO", DOCDIGEST_TAG( "PROJECT"), digest.projectLabel() ); tmpl.setValue( "PROJECT_INFO", DOCDIGEST_TAG( "PROJECT_LABEL"), i18n("Project")); } showAddress( digest.addressee(), digest.clientAddress() ); // Information about archived documents. ArchDocDigestList archDocs = digest.archDocDigestList(); if( archDocs.isEmpty() ) { // qDebug () << "No archived docs for this document!"; tmpl.createDictionary( DOCDIGEST_TAG( "NEVER_PRINTED" )); tmpl.setValue( "NEVER_PRINTED", DOCDIGEST_TAG("NEVER_PRINTED_LABEL"), i18n("This document was never printed.")); } else { ArchDocDigest archdigest = archDocs[0]; QFileInfo fi(archdigest.pdfArchiveFileName()); if (fi.exists()) { tmpl.createDictionary( DOCDIGEST_TAG( "PRINTED" )); tmpl.setValue( "PRINTED", DOCDIGEST_TAG("LAST_PRINT_LABEL"), i18n( "Last printed" ) ); tmpl.setValue( "PRINTED", DOCDIGEST_TAG("LAST_PRINT_TITLE"), i18n( "Opens last created PDF document" ) ); tmpl.setValue( "PRINTED", DOCDIGEST_TAG("LAST_PRINT_LINK_TEXT"), i18n( "open" ) ); tmpl.setValue( "PRINTED", DOCDIGEST_TAG("LAST_PRINT_DATE"), Format::toDateTimeString(archdigest.printDate(), Format::DateFormatLong)); tmpl.setValue( "PRINTED", DOCDIGEST_TAG("LAST_PRINTED_ID"), archdigest.archDocId().toString() ); if( archDocs.size() == 1 ) { tmpl.setValue( "PRINTED", DOCDIGEST_TAG("ARCHIVED_COUNT"), i18n("One older print")); } else { tmpl.setValue( "PRINTED", DOCDIGEST_TAG("ARCHIVED_COUNT"), i18n("%1 older prints", archDocs.count())); } } else { tmpl.createDictionary( DOCDIGEST_TAG( "NEVER_PRINTED" )); tmpl.setValue( "NEVER_PRINTED", DOCDIGEST_TAG("NEVER_PRINTED_LABEL"), i18n("Archived documents cannot be found. Check PDF Output dir.")); } } if (digest.isXRechnungEnabled()) { tmpl.createDictionary( DOCDIGEST_TAG( "EXPORT_XRECHNUNG" )); tmpl.setValue( "EXPORT_XRECHNUNG", DOCDIGEST_TAG("EXPORT_XRECHNUNG_TITLE"), i18n("Export the invoice in XRechnung file format")); tmpl.setValue( "EXPORT_XRECHNUNG", DOCDIGEST_TAG("EXPORT_XRECHNUNG_LABEL"), i18n("XRechnung")); } const QString details = tmpl.expand(); mHtmlCanvas->displayContent( details ); _rightDetails->setText(digest.whiteboard()); _leftDetails->setStyleSheet(widgetStylesheet(Left, Document)); _leftDetails->setAlignment(Qt::AlignLeft); _rightDetails->setStyleSheet(widgetStylesheet(Right, Document)); // qDebug () << "BASE-URL of htmlview is " << mHtmlCanvas->baseURL(); } kraft-1.2.2/src/docdigestdetailview.h000066400000000000000000000044701467704360200176240ustar00rootroot00000000000000/*************************************************************************** docdigestdetailview.cpp - Details of a doc digest ------------------- begin : februry 2011 copyright : (C) 2011 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef DOCDIGESTDETAILVIEW_H #define DOCDIGESTDETAILVIEW_H #include #include #include "docdigest.h" #include "htmlview.h" class dbID; class TextTemplate; class DocDigestHtmlView : public HtmlView { Q_OBJECT public: DocDigestHtmlView( QWidget *parent ); signals: void showLastPrint( const dbID& ); void exportXRechnung(const dbID&); protected slots: void slotLinkClicked(const QUrl& url); }; class DocDigestDetailView : public QFrame { Q_OBJECT public: explicit DocDigestDetailView(QWidget *parent = 0); signals: void showLastPrint(const dbID&); void exportXRechnung(const dbID&); public slots: void slotShowDocDetails( DocDigest ); void slotClearView(); void slotShowMonthDetails( int year, int month ); void slotShowYearDetails( int year); private: void showAddress( const KContacts::Addressee& addressee, const QString& manAddress ); void documentListing( TextTemplate *tmpl, int year, int month ); enum Location { Left, Middle, Right }; enum Detail { Month, Year, Document }; QString widgetStylesheet( Location loc, Detail det ); DocDigestHtmlView *mHtmlCanvas; QLabel *_leftDetails; QLabel *_rightDetails; QString _docTemplFileName; QString _monthTemplFileName; QString _yearTemplFileName; }; #endif // DOCDIGESTDETAILVIEW_H kraft-1.2.2/src/docfooter.ui000066400000000000000000000071601467704360200157520ustar00rootroot00000000000000 DocFooterEdit 0 0 560 282 3 Qt::Vertical QSizePolicy::Expanding 20 16 Footer Texts &Summary text on last page: false m_teSummary 0 0 &Greeting: false m_cbGreeting true false Tax Document &tax: false mTaxCombo Qt::Horizontal QSizePolicy::Expanding 361 20 kraft-1.2.2/src/docguardedptr.h000066400000000000000000000002061467704360200164210ustar00rootroot00000000000000#ifndef DOCGUARDEDPTR #define DOCGUARDEDPTR #include class KraftDoc; typedef QPointer DocGuardedPtr; #endif kraft-1.2.2/src/docheader.ui000066400000000000000000000203611467704360200157020ustar00rootroot00000000000000 DocHeaderEdit 0 0 614 451 0 30 30 16777215 TextLabel Qt::Horizontal QSizePolicy::Expanding 0 0 true &Project: Qt::AlignTop false mProjectLabelEdit &Whiteboard: Qt::AlignTop false m_whiteboardEdit 0 0 Enter a label that describes the project. This may appear on the customer document. 255 Qt::Vertical 20 40 0 0 16777215 80 true Postal &address: Qt::AlignTop false m_postAddressEdit not selected false Qt::Horizontal QSizePolicy::Fixed 10 20 Select an addressee from the address books. Select… Qt::Horizontal QSizePolicy::Expanding 41 20 &Salutatory address: false m_letterHead Customer: false 0 0 16777215 100 &Entry text on first page: false m_teEntry mButtLang m_cbType m_letterHead kraft-1.2.2/src/docposition.cpp000066400000000000000000000260501467704360200164640ustar00rootroot00000000000000/*************************************************************************** docposition.cpp - a position in a document ------------------- begin : Fri Jan 20 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include // application specific includes #include "einheit.h" #include "geld.h" #include "docposition.h" #include "ui_positionwidget.h" #include "positionviewwidget.h" #include "defaultprovider.h" #include "tagman.h" /** @author Klaas Freitag */ DocPositionBase::DocPositionBase() : QObject(), m_dbId( -1 ), mToDelete( false ), mTaxType( TaxFull ), mType( Position ), mAttribs( QString::fromLatin1( "Position" ) ) { } DocPositionBase::DocPositionBase( const PositionType& t ) : QObject(), m_dbId( -1 ), mToDelete( false ), mTaxType( TaxFull ), mType( t ), mAttribs( QString::fromLatin1( "Position" ) ) { } DocPositionBase::DocPositionBase(const DocPositionBase& b ) : QObject(), m_dbId( b.m_dbId ), m_position( b.m_position ), m_text( b.m_text ), mToDelete( b.mToDelete ), mTaxType( TaxFull ), mType( b.mType ), mAttribs( b.mAttribs ) { } DocPositionBase& DocPositionBase::operator=( const DocPositionBase& dp ) { if ( this == &dp ) return *this; m_dbId = dp.m_dbId; m_position = dp.m_position; m_text = dp.m_text; mToDelete = dp.mToDelete; mType = dp.mType; mAttribs = dp.mAttribs; mTaxType = dp.mTaxType; return *this; } void DocPositionBase::setAttribute( const Attribute& attrib ) { if( ! attrib.name().isEmpty() ) { mAttribs[ attrib.name() ] = attrib; } } AttributeMap DocPositionBase::attributes() { return mAttribs; } void DocPositionBase::setAttributeMap( AttributeMap attmap ) { mAttribs = attmap; } void DocPositionBase::loadAttributes() { if ( m_dbId == -1 ) { // qDebug () << "Can not load attributes, no valid database id!"; return; } mAttribs.load( m_dbId ); } void DocPositionBase::removeAttribute( const QString& name ) { if ( !name.isEmpty() ) mAttribs.markDelete( name ); } QString DocPositionBase::attribute( const QString& attName ) const { Attribute att = mAttribs[ attName ]; return att.value().toString(); } // The attribs tag contains a list of TagIDs separated by commas void DocPositionBase::setTag( const QString& tag ) { if ( tag.isEmpty() ) return; Attribute att; att.setPersistant(true); if ( mAttribs.contains( DocPosition::Tags ) ) { if ( hasTag( tag ) ) { return; } att = mAttribs[DocPosition::Tags]; } else { att = Attribute(DocPosition::Tags); } att.setListValue(true); // here: the attribute does not have the new tag. QStringList li = att.value().toStringList(); li.append(TagTemplateMan::self()->getTagTemplate(tag).dbId().toString()); att.setValue( QVariant(li) ); setAttribute( att ); } void DocPositionBase::replaceTags(const QStringList& newTags) { if (newTags.isEmpty()) { if (mAttribs.contains(DocPosition::Tags)) { removeAttribute(DocPosition::Tags); } return; } Attribute att = Attribute(DocPosition::Tags); att.setPersistant(true); att.setListValue(true); QStringList li; for( const QString& tag : newTags ) { li.append(TagTemplateMan::self()->getTagTemplate(tag).dbId().toString()); } att.setValue( QVariant(li) ); setAttribute( att ); } void DocPositionBase::removeTag( const QString& tag ) { if ( !hasTag( tag ) ) { return; } const QString tagId = TagTemplateMan::self()->getTagTemplate(tag).dbId().toString(); Attribute att = mAttribs[DocPosition::Tags]; QStringList li = att.value().toStringList(); li.removeAll( tagId ); att.setValue( QVariant( li ) ); setAttribute( att ); } bool DocPositionBase::hasTag( const QString& tag ) { const QString tagId = TagTemplateMan::self()->getTagTemplate(tag).dbId().toString(); if ( ! mAttribs.contains( DocPosition::Tags ) ) { return false; } Attribute att = mAttribs[DocPosition::Tags]; QStringList li = att.value().toStringList(); if( li.contains( tagId, Qt::CaseInsensitive ) && // ignore case !att.isMarkedDeleted() ) { return true; } return false; } QStringList DocPositionBase::tags() { QStringList tags, tagIDs; if ( mAttribs.hasAttribute(DocPosition::Tags) ) { // qDebug () << mAttribs[DocPosition::Tags].toString(); tagIDs = mAttribs[DocPosition::Tags].value().toStringList(); } for( const auto &tagId : tagIDs) { tags.append(TagTemplateMan::self()->getTagTemplateFromId(tagId).name()); } return tags; } DocPositionBase::TaxType DocPositionBase::taxType() { return mTaxType; } void DocPositionBase::setTaxType( TaxType tt ) { mTaxType = tt; } void DocPositionBase::setTaxType( int tt ) { mTaxType = (TaxType) tt; } int DocPositionBase::taxTypeNumeric() { if ( mTaxType == TaxNone ) return 1; else if ( mTaxType == TaxReduced ) return 2; else if ( mTaxType == TaxFull ) return 3; // qDebug () << "ERR: Vat-type ambigous!"; return 0; // Invalid } // ############################################################## const QString DocPosition::Kind( QString::fromLatin1( "kind" ) ); const QString DocPosition::Discount( QString::fromLatin1( "discount" ) ); const QString DocPosition::Tags( QString::fromLatin1( "tags" ) ); const QString DocPosition::ExtraDiscountTagRequired( QString::fromLatin1( "discountTagRequired" ) ); DocPosition::DocPosition(): DocPositionBase() ,m_amount( 1.0 ), mWidget( 0 ) { m_text = QString(); } DocPosition::DocPosition( const PositionType& t ) : DocPositionBase( t ), mWidget( 0 ) { } Geld DocPosition::overallPrice() { Geld g; AttributeMap atts = attributes(); // all kinds beside from no kind (which means Normal) mean that the position is not // counted for the overall price. // Once there are kinds different from Normal which need a counted price, this needs // to be fixed here. if (!atts.containsUndeleted(DocPosition::Kind) ) { g = unitPrice() * amount(); } return g; } // ############################################################## DocPositionList::DocPositionList() : QList() { // setAutoDelete( true ); } Geld DocPositionList::bruttoPrice(double fullTax, double reducedTax ) { Geld g = nettoPrice(); g += taxSum( fullTax, reducedTax ); return g; } Geld DocPositionList::nettoPrice() { Geld g; DocPositionListIterator it( *this ); while( it.hasNext() ) { DocPosition *dp = static_cast(it.next()); if (!dp->toDelete()) g += dp->overallPrice(); } return g; } Geld DocPositionList::fullTaxSum( double fullTax ) { Geld sum; if ( fullTax < 0 ) { qCritical() << "Full Tax is not loaded!"; } DocPositionListIterator it( *this ); while( it.hasNext() ) { DocPosition *dp = static_cast( it.next() ); if( !dp->toDelete() && dp->taxTypeNumeric() == DocPositionBase::TaxFull ) { sum += dp->overallPrice(); } } Geld tax; if( sum.toLong() > 0 ) { tax = sum.percent(fullTax); } return tax; } Geld DocPositionList::reducedTaxSum( double reducedTax ) { Geld sum; if ( reducedTax < 0 ) { qCritical() << "Reduced Tax is not loaded!"; } DocPositionListIterator it( *this ); while( it.hasNext() ) { DocPosition *dp = static_cast( it.next() ); if( !dp->toDelete() && dp->taxTypeNumeric() == DocPositionBase::TaxReduced ) { sum += dp->overallPrice(); } } Geld tax; if(sum.toLong() > 0 ) { tax = sum.percent(reducedTax); } return tax; } Geld DocPositionList::taxSum( double fullTax, double redTax ) { Geld sum; Geld fulltax = fullTaxSum(fullTax); Geld reducedtax = reducedTaxSum(redTax); sum += fulltax; sum += reducedtax; return sum; } QString DocPositionList::posNumber( DocPositionBase* pos ) { return QString::number( 1+indexOf( pos ) ); } #if 0 QDomElement DocPositionList::domElement( QDomDocument& doc ) { QDomElement topElem = doc.createElement( "positions" ); QDomElement posElem; int num = 1; DocPositionListIterator it( *this ); while( it.hasNext() ) { DocPosition *dpb = static_cast( it.next() ); if( dpb->type() == DocPositionBase::Position ) { DocPosition *dp = static_cast(dpb); posElem = doc.createElement( "position" ); posElem.setAttribute( "number", num++ ); topElem.appendChild( posElem ); posElem.appendChild( xmlTextElement( doc, "text", dp->text() ) ); double am = dp->amount(); QString h = QString::number(am, 'f', 2 ); posElem.appendChild( xmlTextElement( doc, "amount", h )); Einheit e = dp->unit(); posElem.appendChild( xmlTextElement( doc, "unit", e.einheit( am ) ) ); Geld g = dp->unitPrice(); posElem.appendChild( xmlTextElement( doc, "unitprice", QString::number(g.toDouble(), 'f', 2 ))); Geld sum(g * am); posElem.appendChild( xmlTextElement( doc, "sumprice", QString::number(sum.toDouble(), 'f', 2 ) ) ); } } return topElem; } #endif int DocPositionList::compareItems ( DocPosition *dp1, DocPosition *dp2 ) { //DocPositionBase *dpb1 = static_cast( item1 ); //DocPositionBase *dpb2 = static_cast( item2 ); int sortkey1 = dp1->positionNumber(); int sortkey2 = dp2->positionNumber(); int res = 0; if( sortkey1 > sortkey2 ) res = 1; if( sortkey2 < sortkey1 ) res = -1; // qDebug()<< "In sort: comparing " << p1 << " with " << p2 << " = " << res; return res; } QDomElement DocPositionList::xmlTextElement( QDomDocument& doc, const QString& name, const QString& value ) { QDomElement elem = doc.createElement( name ); QDomText t = doc.createTextNode( value ); elem.appendChild( t ); return elem; } DocPositionBase *DocPositionList::positionFromId( int id ) { DocPosition *dp = 0; DocPositionListIterator it( *this ); while( it.hasNext() ) { dp = static_cast( it.next() ); if( dp->dbId() == id ) { break; } } return dp; } kraft-1.2.2/src/docposition.h000066400000000000000000000111161467704360200161260ustar00rootroot00000000000000/*************************************************************************** docposition.h - a position in a document ------------------- begin : Fri Jan 20 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef DOCPOSITION_H #define DOCPOSITION_H // include files for Qt #include #include #include // application specific includes #include "dbids.h" #include "calcpart.h" #include "attribute.h" #include "einheit.h" /** @author Klaas Freitag */ class QString; class QDomElement; class QDomDocument; class Geld; class dbID; class QLocale; class PositionViewWidget; class DocPositionBase : public QObject { public: enum PositionType { Position, ExtraDiscount }; enum TaxType { TaxInvalid = 0, TaxNone = 1, TaxReduced = 2, TaxFull = 3, TaxIndividual = 4 }; DocPositionBase(); DocPositionBase( const PositionType& ); ~DocPositionBase() {} DocPositionBase(const DocPositionBase&); void setDbId( int id ) { m_dbId = id; } dbID dbId() { return dbID( m_dbId ); } void setAttribute( const Attribute& ); void removeAttribute( const QString& ); void loadAttributes(); QString attribute(const QString& ) const; AttributeMap attributes(); void setAttributeMap( AttributeMap ); void setText( const QString& string ) { m_text = string; } QString text() const { return m_text; } void replaceTags(const QStringList& newTags); void setTag( const QString& ); void removeTag( const QString& ); bool hasTag( const QString& ); QStringList tags(); int taxTypeNumeric(); TaxType taxType(); void setTaxType( DocPositionBase::TaxType ); void setTaxType( int ); /** * Position means the number in the document */ int positionNumber() { return m_position; } void setPositionNumber( const int& pos ) { m_position = pos; } void setToDelete( bool doit ) { mToDelete = doit; } bool toDelete() { return mToDelete; } PositionType type() { return mType; } DocPositionBase& operator=( const DocPositionBase& ); protected: int m_dbId; int m_position; QString m_text; bool mToDelete; TaxType mTaxType; PositionType mType; AttributeMap mAttribs; }; class DocPosition : public DocPositionBase { public: DocPosition(); DocPosition( const PositionType& ); void setUnit( const Einheit& unit ) { m_unit = unit; } Einheit unit() const { return m_unit; } void setUnitPrice( const Geld& g ) { m_unitPrice = g; } Geld unitPrice() const { return m_unitPrice; } Geld overallPrice(); void setAmount( double amount ) { m_amount = amount; } double amount() { return m_amount; } PositionViewWidget* associatedWidget() { return mWidget; } void setAssociatedWidget( PositionViewWidget *w ) { mWidget = w; } static const QString Kind; static const QString Discount; static const QString Tags; static const QString ExtraDiscountTagRequired; private: Einheit m_unit; Geld m_unitPrice; double m_amount; PositionViewWidget *mWidget; // No calculation yet }; class DocPositionList : public QList { public: DocPositionList(); // QDomElement domElement( QDomDocument& ); DocPositionBase *positionFromId( int id ); QString posNumber( DocPositionBase* ); Geld nettoPrice(); Geld bruttoPrice( double fullTax, double reducedTax ); Geld taxSum(double fullTax, double redTax ); Geld fullTaxSum( double fullTax ); Geld reducedTaxSum( double reducedTax ); protected: int compareItems ( DocPosition *dp1, DocPosition *dp2 ); private: QDomElement xmlTextElement( QDomDocument&, const QString& , const QString& ); }; typedef QListIterator DocPositionListIterator; typedef QPointer DocPositionGuardedPtr; #endif kraft-1.2.2/src/docpostcard.cpp000066400000000000000000000266411467704360200164450ustar00rootroot00000000000000/*************************************************************************** DocPostCard - a postcard version of the document ------------------- begin : Aug 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "docpostcard.h" #include "kraftdoc.h" #include #include #include #include #include #define QL1(X) QLatin1String(X) DocPostCard::DocPostCard( QWidget *parent ) :HtmlView( parent ), mMode( Full ), mShowPrices(true) { setStylesheetFile( "docoverview.css" ); setTitle( i18n( "Document Overview" ) ); connect( this, SIGNAL(openUrl(QUrl)), this, SLOT(slotUrlSelected(QUrl)) ); } void DocPostCard::setHeaderData( const QString& type, const QString& date, const QString& address, const QString& id, const QString& pretext ) { mType = type; mDate = date; mAddress = address; mPreText = htmlify( pretext ); mId = id; } QString DocPostCard::htmlify( const QString& str ) const { QStringList li = str.toHtmlEscaped().split( "\n" ); return QL1("

              ") + li.join( "

              " ) + QL1("

              "); } #define REDUCED_TAX_MARK "²" #define NO_TAX_MARK "¹" void DocPostCard::setPositions( DocPositionList posList, DocPositionBase::TaxType taxType, double tax, double reducedTax ) { mPositions = "
              "; DocPositionListIterator it(posList); while( it.hasNext() ) { DocPositionBase *dpb = it.next(); DocPosition *dp = static_cast(dpb); mPositions += ""; mPositions += ""; if( mShowPrices ) { mPositions += ""; mPositions += ""; } mPositions += ""; } mPositions += "
              "; if ( dp->toDelete() ) mPositions += ""; mPositions += posList.posNumber( dpb ) + ". "; if ( dp->toDelete() ) mPositions += ""; mPositions += ""; if ( dp->toDelete() ) mPositions += ""; // set to italic if the item kind is not Normal bool italic = dp->attributes().containsUndeleted(DocPosition::Kind); if (italic) mPositions += ""; mPositions += htmlify(dp->text()); if (italic) mPositions += ""; if ( dp->toDelete() ) mPositions += ""; mPositions += ""; if (italic) mPositions += ""; if ( dp->toDelete() ) mPositions += ""; mPositions += dp->overallPrice().toHtmlString(); if ( dp->toDelete() ) mPositions += ""; mPositions += ""; if( taxType == DocPositionBase::TaxIndividual && (dp->taxType() == DocPositionBase::TaxReduced) ) { if ( dp->toDelete() ) mPositions += ""; mPositions += QString(REDUCED_TAX_MARK); if ( dp->toDelete() ) mPositions += ""; } if( taxType == DocPositionBase::TaxIndividual && (dp->taxType() == DocPositionBase::TaxNone) ) { if ( dp->toDelete() ) mPositions += ""; mPositions += QString(NO_TAX_MARK); if ( dp->toDelete() ) mPositions += ""; } if (italic) mPositions += ""; mPositions += "
              "; // Create the sum table mPositionCount = posList.count(); if( mShowPrices ) { mPositions += "
              "; mPositionCount = posList.count(); mTotal = posList.nettoPrice().toHtmlString(); QString brutto = posList.bruttoPrice( tax, reducedTax ).toHtmlString(); mPositions += QString( "" ); if ( taxType != DocPositionBase::TaxInvalid && taxType != DocPositionBase::TaxNone ) { mPositions += QString( "" ).arg( mTotal ); QString curTax; curTax.setNum( tax, 'f', 1 ); QString taxStr; if( taxType == DocPositionBase::TaxReduced || taxType == DocPositionBase::TaxIndividual ) { curTax.setNum( reducedTax, 'f', 1 ); taxStr = posList.reducedTaxSum( reducedTax ).toHtmlString(); mPositions += QString( "" ).arg( taxStr ).arg(REDUCED_TAX_MARK); } if( taxType == DocPositionBase::TaxFull || taxType == DocPositionBase::TaxIndividual ) { curTax.setNum( tax, 'f', 1 ); taxStr = posList.fullTaxSum( tax ).toHtmlString(); mPositions += QString( "" ).arg( taxStr ); } if( taxType == DocPositionBase::TaxIndividual ) { taxStr = posList.taxSum( tax, reducedTax ).toHtmlString(); mPositions += QString( "" ).arg( taxStr ); } } mPositions += QString( "" ).arg( brutto ); } // showPrices mPositions += "
              ______________________________
              " ) + i18n( "Netto:" )+ QString( "%1
              " ); mPositions += i18n( "+ %1% Tax:", curTax ) + QString( "%1%2
              " ) + i18n( "+ %1% Tax:", curTax ) + QString( "%1
              " ) + i18n( "Sum Tax:" ) + QString( "%1
              " ) + i18n( "Total:" )+ QString( "%1
              "; // qDebug() << "Positions-HTML: " << mPositions; } void DocPostCard::setFooterData( const QString& postText, const QString& goodbye ) { mPostText = htmlify( postText ); mGoodbye = goodbye; } void DocPostCard::renderDoc( int id ) { QString t; // qDebug() << "rendering postcard for active id " << id << //( mMode == Full ? " (full) " : " (mini) " ); if ( mMode == Full ) { t = renderDocFull( id ); } else if ( mMode == Mini ) { t = renderDocMini( id ); } else { // qDebug () << "Unknown postcard mode"; } // qDebug() << t; displayContent( t ); } #define SEL_STRING(X) ( id == X ? QL1("_selected"): QL1("")) QString DocPostCard::renderDocFull( int id ) { QString rethtml; QString t; rethtml = QL1( "" ); t += QL1(""); t += QString( "
              \n" ).arg( SEL_STRING(KraftDoc::Header) ); t += header( id == KraftDoc::Header, "headerlink", KraftDoc::partToString(KraftDoc::Header), "kraftdoc://header" ); QString h = mAddress; h.replace( '\n', "
              " ); t += ""; t += "
              "; t += QString( "%1\n" ).arg( h ); t += ""; t += QString( "%1
              %2\n" ).arg( mType ).arg( mDate ); t += "
              "; t += "

              " + mPreText + "

              \n"; t += "
              \n"; rethtml += t; // the Body section showing the positions t = QL1(""); t += QString( "
              \n" ).arg( SEL_STRING(KraftDoc::Positions ) ); t += header( id == KraftDoc::Positions, "bodylink", KraftDoc::partToString(KraftDoc::Positions), "kraftdoc://positions" ); t += mPositions; t += "\n
              \n"; rethtml += t; t = QL1(""); t += QString( "
              \n" ).arg( SEL_STRING(KraftDoc::Footer) ); t += header( id == KraftDoc::Footer, "footerlink", KraftDoc::partToString(KraftDoc::Footer), "kraftdoc://footer" ); t += "

              " + mPostText + "

              \n"; if ( ! mGoodbye.isEmpty() ) t += "

              " + mGoodbye + "

              \n"; t += "
              \n"; rethtml += t + ""; return rethtml; } QString DocPostCard::renderDocMini( int id ) const { QString t; QString rethtml = QL1( "" ); t = QString( "
              \n" ).arg( SEL_STRING(KraftDoc::Header) ); t += header( id == KraftDoc::Header, "headerlink", KraftDoc::partToString(KraftDoc::Header), "kraftdoc://header", QString( "%1, %2" ).arg( mType ).arg( mDate ) ); t += QL1("
              "); rethtml += t; t = QString( "
              \n" ).arg( SEL_STRING(KraftDoc::Positions)); QString d = i18n("%1 Items", mPositionCount); if( mShowPrices ) d = i18n("%1 Items, netto %2", mPositionCount, mTotal); // do not add another "Items" string to the header to not bloat t += header( id == KraftDoc::Positions, "bodylink", QString(), "kraftdoc://positions", d ); t += QL1("
              "); rethtml += t; t = QString( "
              \n" ).arg(SEL_STRING(KraftDoc::Footer)); t += header( id == KraftDoc::Footer, "footerlink", KraftDoc::partToString(KraftDoc::Footer), "kraftdoc://footer" ); t += QL1("
              "); rethtml += t; rethtml += QL1(""); return rethtml; } QString DocPostCard::header( bool selected, const QString& styleName, const QString& displayName, const QString& protocol, const QString& addons ) const { const QString content = QString("

              %2  %3

              ") .arg( styleName + (selected ? QL1("_selected") : QL1(""))) .arg(displayName).arg(addons); // These colors do the frame around the header boxes QString bgCol("#aaaaaa"); if( !selected ) bgCol = QL1("#cccccc"); return QString( "" "" "
              < a href=\"%2\">%3
              ").arg(bgCol).arg(protocol).arg(content); } void DocPostCard::slotUrlSelected( const QUrl& kurl) { KraftDoc::Part id = KraftDoc::Header; if ( kurl.scheme() == "kraftdoc" ) { if ( kurl.host() == "header" ) { // qDebug () << "Header selected!"; id = KraftDoc::Header; } else if ( kurl.host() == "positions" ) { // qDebug () << "Positions selected!"; id = KraftDoc::Positions; } else if ( kurl.host() == "footer" ) { // qDebug () << "Footer selected!"; id = KraftDoc::Footer; } emit selectPage( id ); } } void DocPostCard::slotSetMode( DisplayMode mode, int id ) { mMode = mode; renderDoc( id ); } void DocPostCard::slotShowPrices( bool showIt ) { mShowPrices = showIt; } kraft-1.2.2/src/docpostcard.h000066400000000000000000000043541467704360200161070ustar00rootroot00000000000000/*************************************************************************** DocPostCard - a postcard version of the document ------------------- begin : Aug 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef DOCPOSTCARD_H #define DOCPOSTCARD_H #include #include "htmlview.h" #include "kraftdoc.h" class QUrl; class DocPostCard : public HtmlView { Q_OBJECT public: enum DisplayMode { Full, Mini }; DocPostCard( QWidget *parent = 0 ); signals: void selectPage( int ); public slots: void setHeaderData( const QString&, const QString&, const QString&, const QString&, const QString& ); void setPositions( DocPositionList, DocPositionBase::TaxType, double, double ); void setFooterData( const QString&, const QString& ); void renderDoc( int id = -1 ); void slotSetMode( DisplayMode, int id = -1 ); void slotShowPrices( bool showIt ); protected: QString renderDocMini( int ) const; QString renderDocFull( int ); QString header(bool, const QString&, const QString&, const QString& protocol, const QString& = QString() ) const; private slots: void slotUrlSelected( const QUrl& kurl); private: QString htmlify( const QString& ) const; DocGuardedPtr mDoc; QString mType; QString mId; QString mPreText; QString mPostText; QString mDate; QString mAddress; QString mPositions; QString mGoodbye; QString mTotal; int mPositionCount; DisplayMode mMode; bool mShowPrices; }; #endif kraft-1.2.2/src/doctext.cpp000066400000000000000000000051601467704360200156030ustar00rootroot00000000000000/*************************************************************************** doctext.cpp - texts like header or footer for documents ------------------- begin : March 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include "doctext.h" DocText::DocText() : mTextType( KraftDoc::Unknown ), mCurrentItem( 0 ) { } void DocText::setName( const QString& t ) { mName = t; } void DocText::setText( const QString& t ) { mText = t; } void DocText::setDescription( const QString& t ) { mDescription = t; } void DocText::setDocType( const QString& t ) { mDocType = t; } void DocText::setTextType( KraftDoc::Part t ) { mTextType = t; } bool DocText::isStandardText() const { return QString::compare(mName, i18n( "Standard" ), Qt::CaseInsensitive) == 0; // can surely be improved... } KraftDoc::Part DocText::stringToTextType( const QString& str ) { KraftDoc::Part tt = KraftDoc::Unknown; if ( str == textTypeToString( KraftDoc::Header ) ) tt = KraftDoc::Header; if ( str == textTypeToString( KraftDoc::Footer ) ) tt = KraftDoc::Footer; if ( str == textTypeToString( KraftDoc::Positions ) ) tt = KraftDoc::Positions; return tt; } QString DocText::textTypeToString( KraftDoc::Part tt ) { if ( tt == KraftDoc::Header ) return i18n( "Header Text" ); if ( tt == KraftDoc::Footer ) return i18n( "Footer Text" ); if ( tt == KraftDoc::Positions ) return i18n( "Items" ); return i18n( "Unknown" ); } bool DocText::operator==( const DocText& _dt ) const { return ( ( mName == _dt.mName ) && ( mDocType == _dt.mDocType ) && ( mTextType == _dt.mTextType ) ); } void DocText::setDbId( long id ) { mDbId = id ; } void DocText::setDbId( const dbID& id ) { mDbId = id ; } dbID DocText::dbId() const { return mDbId; } kraft-1.2.2/src/doctext.h000066400000000000000000000046101467704360200152470ustar00rootroot00000000000000/*************************************************************************** doctext.h - texts like header or footer for documents ------------------- begin : March 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef DOCTEXT_H #define DOCTEXT_H #include #include "kraftcat_export.h" #include "kraftdoc.h" #include "dbids.h" class QTreeWidgetItem; class QPixmap; class KRAFTCAT_EXPORT DocText { public: DocText(); QString name() const { return mName; } void setName( const QString& ); QString text() const { return mText; } void setText( const QString& ); QString description() const { return mDescription; } void setDescription( const QString& ); KraftDoc::Part type() { return mTextType; } QString textTypeString() const { return textTypeToString( mTextType ); } bool isStandardText() const; void setTextType( KraftDoc::Part ); KraftDoc::Part textType() const { return mTextType; } QString docType() const { return mDocType; } void setDocType( const QString& ); QTreeWidgetItem *listViewItem() const { return mCurrentItem; } void setListViewItem( QTreeWidgetItem *item ) { mCurrentItem = item; } void setDbId( long ); void setDbId( const dbID& ); dbID dbId() const; static KraftDoc::Part stringToTextType( const QString& ); static QString textTypeToString( KraftDoc::Part ); bool operator==( const DocText& ) const; private: QString mName; QString mText; QString mDescription; QString mDocType; KraftDoc::Part mTextType; QTreeWidgetItem *mCurrentItem; dbID mDbId; }; typedef QList DocTextList; #endif kraft-1.2.2/src/doctype.cpp000066400000000000000000000461711467704360200156070ustar00rootroot00000000000000/*************************************************************************** doctype.cpp - doc type class ------------------- begin : Oct. 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include // application specific includes #include "doctype.h" #include "kraftdb.h" #include "numbercycle.h" #include "attribute.h" #include "defaultprovider.h" #include "stringutil.h" /** @author Klaas Freitag */ namespace { const QString XRechnungTmplStr {"XRechnungTmpl"}; const QString WatermarkFileStr {"watermarkFile"}; const QString DocTemplateFileStr {"docTemplateFile"}; const QString IdentNumberCycleStr{"identNumberCycle"}; const QString DocMergeIdentStr {"docMergeIdent"}; const QString DayCounterDateStr {"dayCounterDate"}; const QString DayCounterStr {"dayCounter"}; const QString AppendPDFStr {"AppendPDFFile"}; const QString DefaultTmplFileName {"invoice.trml"}; const QString XRechnungEnabled {"XRechnungEnabled"}; } idMap DocType::mNameMap = idMap(); DocType::DocType() : mAttributes( QStringLiteral( "DocType" ) ), mDirty( false ) { init(); } DocType::DocType( const QString& name, bool dirty ) : mAttributes( QStringLiteral( "DocType" ) ), mName( name ), mDirty( dirty ) { init(); if ( mNameMap.contains( name ) ) { dbID id = mNameMap[ name ]; mAttributes.load( id ); } readFollowerList(); readIdentTemplate(); } void DocType::init() { // === Start to fill static content if ( ! mNameMap.empty() ) return; QSqlQuery q; q.prepare( "SELECT docTypeID, name FROM DocTypes ORDER BY name" ); q.exec(); while ( q.next() ) { dbID id( q.value(0).toInt() ); QString name = q.value(1).toString(); mNameMap[ name ] = id; // QString h = DefaultProvider::self()->locale()->translate( cur.value( "name" ).toString() ); } } void DocType::clearMap() { mNameMap.clear(); } QStringList DocType::all() { init(); QStringList re; QSqlQuery q; q.prepare( "SELECT docTypeID, name FROM DocTypes ORDER BY name" ); q.exec(); while ( q.next() ) { re << q.value(1).toString(); } return re; } QStringList DocType::allLocalised() { return all(); } // static function to retrieve id of a certain doctype dbID DocType::docTypeId( const QString& docType ) { dbID id; init(); if ( mNameMap.contains( docType ) ) { id = mNameMap[ docType ]; return id; } else { qCritical()<< "Can not find id for doctype named " << docType; } return id; } bool DocType::allowDemand() { bool re = false; if ( mAttributes.contains( "AllowDemand" ) ) { re = true; } return re; } bool DocType::allowAlternative() { bool re = false; if ( mAttributes.contains( "AllowAlternative" ) ) { re = true; } return re; } bool DocType::pricesVisible() { bool re = true; if( mAttributes.contains("HidePrices")) { re = false; } return re; } bool DocType::substractPartialInvoice() { bool re = false; if( mAttributes.contains("SubstractPartialInvoice")) { re = true; } return re; } bool DocType::partialInvoice() { bool re = false; if( mAttributes.contains("PartialInvoice")) { re = true; } return re; } // returns the amount of followers added int DocType::setAllFollowers( const QStringList& followers) { QSqlQuery q; q.prepare("INSERT INTO DocTypeRelations (typeId, followerId, sequence) VALUES (:typeId, :followerId, 0)"); QSqlQuery qu; qu.prepare("UPDATE DocTypeRelations SET sequence=:seq WHERE typeId=:typeId AND followerId=:followerId"); // get "my" doc type Id int typeId = mNameMap[mName].toInt(); q.bindValue(":typeId", typeId); qu.bindValue(":typeId", typeId); // get the max sequence for me int seq = 0; { QSqlQuery cq; cq.prepare("SELECT MAX(sequence) FROM DocTypeRelations WHERE typeId=:tdId"); cq.bindValue(":tdId", typeId); cq.exec(); if( cq.next() ) { seq = cq.value(0).toInt(); } } const QStringList existingFollowers = follower(); int cnt = 0; // simple counter to return. for( const QString& f : followers ) { if( mNameMap.contains(f) ) { int followerId = mNameMap[f].toInt(); if( !existingFollowers.contains(f) ) { q.bindValue(":followerId", followerId ); q.exec(); cnt++; } // use the updater qu.bindValue(":seq", ++seq); qu.bindValue(":followerId", followerId); qu.exec(); } } return cnt; } QStringList DocType::follower() { return mFollowerList; } void DocType::readFollowerList() { QSqlQuery q; q.prepare( "SELECT typeId, followerId, sequence FROM DocTypeRelations WHERE typeId=:type ORDER BY sequence"); q.bindValue( ":type", mNameMap[mName].toInt() ); q.exec(); while ( q.next() ) { dbID followerId( q.value(1).toInt() ); idMap::Iterator it; for ( it = mNameMap.begin(); it != mNameMap.end(); ++it ) { if ( it.value() == followerId ) { mFollowerList << it.key(); } } } } QString DocType::numberCycleName() { QString re = NumberCycle::defaultName(); if ( mAttributes.hasAttribute(IdentNumberCycleStr) ) { re = mAttributes[IdentNumberCycleStr].value().toString(); } return re; } void DocType::setNumberCycleName( const QString& name ) { if ( name.isEmpty() ) return; if ( name != NumberCycle::defaultName() ) { Attribute att(IdentNumberCycleStr); att.setPersistant( true ); att.setValue( name ); mAttributes[IdentNumberCycleStr] = att; } else { // remove default value from map mAttributes.markDelete(IdentNumberCycleStr); // qDebug () << "Removing identNumberCycle Attribute"; } mDirty = true; readIdentTemplate(); } /* This method looks for the template file for the doctype. The rule is: * 1. Set the filename to look for to the name of the doc type, lowercase * and with spaces replaced * 2. Check for an attribute for this doc type. * - if that is an absolute path, return it. * - if not absolute, set the filename to look for to that value * 3. Look for the name in KRAFT_HOME * 4. Look for the name in rel. system Path * 5. Look for the name in QStandardPaths * 6. If still empty, fall back to default invoice.trml - which also * sets ReportLab as default */ QString DocType::templateFile() { QString tmplFile; const auto dfp = DefaultProvider::self(); QString searchStr; QString reportFileName = QString( "%1.trml").arg( name().toLower() ); reportFileName.replace(QChar(' '), QChar('_')); if ( mAttributes.hasAttribute(DocTemplateFileStr) ) { tmplFile = mAttributes[DocTemplateFileStr].value().toString(); qDebug() << "Template File:" << tmplFile; if( !tmplFile.isEmpty() ) { QFileInfo fi(tmplFile); if( fi.isAbsolute() ) { return tmplFile; } else { // it is not an absolute file name, try to find it reportFileName = tmplFile; } tmplFile.clear(); } } // check for reportlab template if (tmplFile.isEmpty()) { searchStr = QString("reports/%1.trml").arg(reportFileName); tmplFile = dfp->locateFile(searchStr); } // check for weasyprint template if (tmplFile.isEmpty()) { searchStr = QString("reports/%1.gtmpl").arg(reportFileName); tmplFile = dfp->locateFile(searchStr); } // not found - check invoice.trml if (tmplFile.isEmpty()) { searchStr = QString("reports/%1").arg(DefaultTmplFileName); tmplFile = dfp->locateFile(searchStr); } if( tmplFile.isEmpty() ) { qDebug () << "unable to find a template file for " << name(); } else { qDebug () << "Found template file " << tmplFile; } return tmplFile; } void DocType::setTemplateFile( const QString& name ) { if ( name.isEmpty() || name == DefaultTmplFileName) { // the default is returned anyway. // remove default value from map mAttributes.markDelete(DocTemplateFileStr); // qDebug () << "Removing docTemplateFile Attribute"; } else { Attribute att(DocTemplateFileStr); att.setPersistant( true ); att.setValue( name ); mAttributes[DocTemplateFileStr] = att; } mDirty = true; } QString DocType::mergeIdent() { QString re = "0"; if ( mAttributes.hasAttribute(DocMergeIdentStr) ) { re = mAttributes[DocMergeIdentStr].value().toString(); } return re; } void DocType::setMergeIdent( const QString& ident ) { if ( !ident.isEmpty() ) { Attribute att(DocMergeIdentStr); att.setPersistant( true ); att.setValue( ident ); mAttributes[DocMergeIdentStr] = att; } else { // remove default value from map mAttributes.markDelete(DocMergeIdentStr); // qDebug () << "Removing docMergeIdent Attribute"; } mDirty = true; } QString DocType::xRechnungTemplate() { return attributeValueString(XRechnungTmplStr); } void DocType::setXRechnungTemplate(const QString& tmpl) { setAttribute(XRechnungTmplStr, tmpl); } QString DocType::attributeValueString(const QString& attribName) const { QString re; if (attribName.isEmpty()) { return re; } if (mAttributes.hasAttribute(attribName)) { const auto att = mAttributes.value(attribName); re = att.value().toString(); } return re; } void DocType::setAttribute( const QString& attribute, const QString& val) { if ( !(attribute.isEmpty() || val.isEmpty()) ) { Attribute att( attribute ); att.setPersistant( true ); att.setValue( val); mAttributes[attribute] = att; mDirty = true; } // remove empty attribute if (!attribute.isEmpty() && val.isEmpty()) { mAttributes.markDelete(attribute); mDirty = true; } } QString DocType::watermarkFile() { QString re; if ( mAttributes.hasAttribute( WatermarkFileStr ) ) { re = mAttributes[WatermarkFileStr].value().toString(); } return re; } void DocType::setWatermarkFile( const QString& file ) { if ( !file.isEmpty() ) { Attribute att( WatermarkFileStr ); att.setPersistant( true ); att.setValue( file ); mAttributes[WatermarkFileStr] = att; } else { // remove default value from map mAttributes.markDelete( WatermarkFileStr ); // qDebug () << "Removing docMergeFile Attribute"; } mDirty = true; } QString DocType::appendPDF() const { return attributeValueString(AppendPDFStr); } void DocType::setAppendPDFFile(const QString& file) { setAttribute(AppendPDFStr, file); } /** * @brief DocType::generateDocumentIdent * @param docDate * @param addressUid * @param id: Current Id to be used. * @param dayCnt: Current day counter to be used. * @return */ QString DocType::generateDocumentIdent(const QDate& docDate, const QString& addressUid, int id, int dayCnt) { /* * The pattern may contain the following tags: * %y - the year of the documents date. * %w - the week number of the documents date * %d - the day number of the documents date * %m - the month number of the documents date * %M - the month number of the documents date * %c - the customer id from kaddressbook * %i - the uniq identifier from db. * %n - the uniq identifier that resets every day and starts from 1 * %type - the localised doc type (offer, invoice etc.) * %uid - the customer uid */ // Load the template and check if there is a uniq id included. QString pattern = identTemplate(); if ( pattern.indexOf( "%i" ) == -1 && pattern.indexOf("%n") == -1) { qWarning() << "No %i found in identTemplate, appending it to meet law needs!"; if (!pattern.endsWith('-')) pattern += QStringLiteral("-"); pattern += QStringLiteral("%i"); } QMap m; m[ "%yyyy" ] = docDate.toString( "yyyy" ); m[ "%yy" ] = docDate.toString( "yy" ); m[ "%y" ] = docDate.toString( "yyyy" ); QString h; h = QString("%1").arg( docDate.weekNumber(), 2, 10, QChar('0') ); m[ "%ww" ] = h; m[ "%w" ] = QString::number( docDate.weekNumber( ) ); m[ "%dd" ] = docDate.toString( "dd" ); m[ "%d" ] = docDate.toString( "d" ); m[ "%m" ] = QString::number( docDate.month() ); m[ "%MM" ] = docDate.toString( "MM" ); m[ "%M" ] = docDate.toString( "M" ); h = QString("%1").arg(id, 6, 10, QChar('0') ); m[ "%iiiiii" ] = h; h = QString("%1").arg(id, 5, 10, QChar('0') ); m[ "%iiiii" ] = h; h = QString("%1").arg(id, 4, 10, QChar('0') ); m[ "%iiii" ] = h; h = QString("%1").arg(id, 3, 10, QChar('0') ); m[ "%iii" ] = h; h = QString("%1").arg(id, 2, 10, QChar('0') ); m[ "%ii" ] = h; m[ "%i" ] = QString::number( id ); h = QString("%1").arg(dayCnt, 6, 10, QChar('0') ); m[ "%nnnnnn" ] = h; h = QString("%1").arg(dayCnt, 5, 10, QChar('0') ); m[ "%nnnnn" ] = h; h = QString("%1").arg(dayCnt, 4, 10, QChar('0') ); m[ "%nnnn" ] = h; h = QString("%1").arg(dayCnt, 3, 10, QChar('0') ); m[ "%nnn" ] = h; h = QString("%1").arg(dayCnt, 2, 10, QChar('0') ); m[ "%nn" ] = h; m[ "%n" ] = QString::number(dayCnt); m[ "%c" ] = addressUid; m[ "%type" ] = name(); m[ "%uid" ] = addressUid; QString re = StringUtil::replaceTagsInString( pattern, m ); // qDebug () << "Generated document ident: " << re; return re; } // if hot, the id is updated in the database, otherwise not. int DocType::nextIdentId( bool hot ) { QString numberCycle = numberCycleName(); if ( numberCycle.isEmpty() ) { qCritical() << "NumberCycle name is empty"; return -1; } QSqlQuery qLock; if ( hot ) { qLock.exec( "LOCK TABLES numberCycles WRITE" ); } QSqlQuery q; q.prepare( "SELECT lastIdentNumber FROM numberCycles WHERE name=:name" ); int num = -1; q.bindValue( ":name", numberCycle ); q.exec(); if ( q.next() ) { num = 1+( q.value( 0 ).toInt() ); // qDebug () << "Got current number: " << num; if ( hot ) { QSqlQuery setQuery; setQuery.prepare( "UPDATE numberCycles SET lastIdentNumber=:newNumber WHERE name=:name" ); setQuery.bindValue( ":name", numberCycle ); setQuery.bindValue( ":newNumber", num ); setQuery.exec(); if ( setQuery.isActive() ) { // qDebug () << "Successfully created new id number for numbercycle " << numberCycle << ": " << num; } } } if ( hot ) { qLock.exec( "UNLOCK TABLES" ); } return num; } int DocType::nextDayCounter(const QDate& docDate) { int dayCnt {0}; // Check the attribute for the day counter. QDate storedDate = mAttributes[DayCounterDateStr].value().toDate(); // increment the day counter by one dayCnt = 1+mAttributes[DayCounterStr].value().toInt(); if (storedDate != docDate) { // the daycounter is outdated. Reset the counter and update the date. setAttribute(DayCounterDateStr, docDate.toString(Qt::ISODate)); dayCnt = 1; } setAttribute(DayCounterStr, QString::number(dayCnt)); save(); return dayCnt; } QString DocType::identTemplate() { return mIdentTemplate; } void DocType::setIdentTemplate( const QString& t ) { mIdentTemplate = t; } void DocType::readIdentTemplate() { QSqlQuery q; QString tmpl; const QString defaultTempl = QString::fromLatin1( "%y%ww-%i" ); QString numberCycle = numberCycleName(); if ( numberCycle.isEmpty() ) { qCritical() << "Numbercycle for doctype is empty, returning default"; mIdentTemplate = defaultTempl; } // qDebug () << "Picking ident Template for numberCycle " << numberCycle; q.prepare( "SELECT identTemplate FROM numberCycles WHERE name=:name" ); q.bindValue( ":name", numberCycle ); q.exec(); if ( q.next() ) { tmpl = q.value( 0 ).toString(); // qDebug () << "Read ident template from database: " << tmpl; } // FIXME: Check again. if ( tmpl.isEmpty() ) { // qDebug () << "Writing ident template to database: " << pattern; QSqlQuery insQuery; insQuery.prepare( "UPDATE numberCycles SET identTemplate=:pattern WHERE name=:name" ); insQuery.bindValue( ":name", numberCycle ); insQuery.bindValue( ":pattern", defaultTempl); insQuery.exec(); tmpl = defaultTempl; } mIdentTemplate = tmpl; } QString DocType::name() const { return mName; } void DocType::setName( const QString& name ) { QString oldName = mName; dbID id = mNameMap[ oldName ]; // The old id. mNameMap[ name ] = id; mNameMap.remove( oldName ); mName = name; mDirty = true; } void DocType::setXRechnungEnabled(bool state) { if (state == isXRechnungEnabled()) return; if (state) setAttribute(XRechnungEnabled, QStringLiteral("Yes")); else mAttributes.markDelete(XRechnungEnabled); mDirty = true; } bool DocType::isXRechnungEnabled() const { bool re{false}; if (mAttributes.contains(XRechnungEnabled)) { auto xre = mAttributes[XRechnungEnabled].value().toString(); re = (xre == QStringLiteral("Yes")); } return re; } /* * Saves the name and the attriutes (numbercycle, demand, etc.) */ void DocType::save() { if ( !mDirty ) { // qDebug () << "Saving: not DIRTY!"; return; } if ( !mNameMap.contains( mName ) ) { qCritical() << "nameMap does not contain id for " << mName; return; } dbID id = mNameMap[ mName ]; QSqlQuery q; bool doInsert = false; if ( id.isOk() ) { q.prepare( "UPDATE DocTypes SET name=:name WHERE docTypeId=:id" ); q.bindValue( ":id", id.toInt() ); } else { q.prepare( "INSERT INTO DocTypes (name) VALUES (:name)" ); doInsert = true; } q.bindValue( ":name", mName ); q.exec(); if ( doInsert ) { mNameMap[mName] = KraftDB::self()->getLastInsertID(); } mAttributes.save( mNameMap[mName] ); } kraft-1.2.2/src/doctype.h000066400000000000000000000062741467704360200152540ustar00rootroot00000000000000/*************************************************************************** doctype.h - doc type class ------------------- begin : Oct. 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef DOCTYPE_H #define DOCTYPE_H // include files for Qt #include #include #include "kraftcat_export.h" #include "dbids.h" #include "attribute.h" /** @author Klaas Freitag */ typedef QMap idMap; class KRAFTCAT_EXPORT DocType { public: DocType(); /** * create a doctype from its localised or tech name */ DocType( const QString&, bool dirty = false ); static QStringList all(); static QStringList allLocalised(); static dbID docTypeId( const QString& ); QString name() const; void setName( const QString& ); bool allowDemand(); bool allowAlternative(); bool pricesVisible(); bool partialInvoice(); bool substractPartialInvoice(); QStringList follower(); int setAllFollowers( const QStringList& followers); QString generateDocumentIdent(const QDate& docDate, const QString& addressUid, int id, int dayCnt); QString identTemplate(); void setIdentTemplate( const QString& ); QString numberCycleName(); void setNumberCycleName( const QString& ); QString templateFile(); void setTemplateFile( const QString& ); QString watermarkFile(); void setWatermarkFile( const QString& ); QString mergeIdent(); void setMergeIdent( const QString& ); QString xRechnungTemplate(); void setXRechnungTemplate(const QString&); QString appendPDF() const; void setAppendPDFFile(const QString& file); void setAttribute( const QString& attribute, const QString& val); QString attributeValueString(const QString& attribName) const; static void clearMap(); int nextIdentId( bool hot = true ); int nextDayCounter(const QDate& docDate); void save(); void readIdentTemplate(); bool isXRechnungEnabled() const; void setXRechnungEnabled(bool); protected: void readFollowerList(); private: static void init(); private: AttributeMap mAttributes; QStringList mFollowerList; QString mName; QString mIdentTemplate; bool mDirty; QString mMergeIdent; static idMap mNameMap; }; #endif kraft-1.2.2/src/doctypeedit.cpp000066400000000000000000000444521467704360200164550ustar00rootroot00000000000000/*************************************************************************** doctypeedit.h - the document type editor ------------------- begin : Fri Jan 2 2009 copyright : (C) 2009 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "prefsdialog.h" #include "kraftsettings.h" #include "kraftdb.h" #include "kraftdoc.h" #include "defaultprovider.h" #include "doctype.h" #include "doctypeedit.h" #include "numbercycledialog.h" // -------------------------------------------------------------------------------- DocTypeEdit::DocTypeEdit( QWidget *parent ) : QWidget(parent), Ui::DocTypeEditBase( ), mExampleDocType(i18n("")), mExampleAddressUid(i18n("
              ")) { setupUi( this ); connect(mTypeListBox, &QListWidget::currentTextChanged, this, &DocTypeEdit::slotDocTypeSelected); QStringList types = DocType::allLocalised(); mTypeListBox->clear(); mTypeListBox->addItems( types ); for ( QStringList::Iterator it = types.begin(); it != types.end(); ++it ) { DocType dt( *it ); mOrigDocTypes[*it] = dt; } mTypeListBox->setCurrentRow( 0, QItemSelectionModel::Select ); QString dtype; if(mTypeListBox->currentRow() != -1) dtype = mTypeListBox->currentItem()->text(); mPbAdd->setIcon( DefaultProvider::self()->icon( "plus" ) ); mPbEdit->setIcon( DefaultProvider::self()->icon( "pencil" ) ); mPbRemove->setIcon( DefaultProvider::self()->icon( "minus" ) ); const QIcon& icon = DefaultProvider::self()->icon("device-floppy"); if (!icon.isNull() ) { tmplFileSelectButton->setIcon(icon); tmplFileSelectButton->setText(""); watermarkSelectButton->setIcon(icon); watermarkSelectButton->setText(""); appendSelectButton->setIcon(icon); appendSelectButton->setText(""); } tmplFileSelectButton->setToolTip(i18n("Select template file from harddisk")); watermarkSelectButton->setToolTip(i18n("Select watermark file from harddisk")); appendSelectButton->setToolTip(i18n("Select PDF file to append to documents from harddisk")); connect(tmplFileSelectButton, &QPushButton::clicked, this, [this]() { QString file = QFileDialog::getOpenFileName(this, i18n("Find Template File"), QDir::homePath(), i18n("Kraft Templates (*.trml *.gtmpl)")); if (!file.isEmpty()) { mTemplateUrl->setText(file); } }); connect(watermarkSelectButton, &QPushButton::clicked, this, [this]() { QString file = QFileDialog::getOpenFileName(this, i18n("Find Watermark File"), QDir::homePath(), i18n("PDF file (*.pdf)")); if (!file.isEmpty()) { mWatermarkUrl->setText(file); } }); connect(appendSelectButton, &QPushButton::clicked, this, [this]() { QString file = QFileDialog::getOpenFileName(this, i18n("Find Append PDF File"), QDir::homePath(), i18n("PDF file (*.pdf)")); if (!file.isEmpty()) { mAppendUrl->setText(file); } }); connect( mCbXRechnung, &QCheckBox::toggled, this, &DocTypeEdit::slotXRechnungToggled); connect( mPbAdd, SIGNAL( clicked() ), SLOT( slotAddDocType() ) ); connect( mPbEdit, SIGNAL( clicked() ), SLOT( slotEditDocType() ) ); connect( mPbRemove, SIGNAL( clicked() ), SLOT( slotRemoveDocType() ) ); connect( mNumberCycleCombo, SIGNAL( activated( const QString& ) ), SLOT( slotNumberCycleChanged( const QString& ) ) ); connect( mPbEditCycles, SIGNAL( clicked() ), SLOT( slotEditNumberCycles() ) ); connect( mWatermarkCombo, SIGNAL( activated( int ) ), SLOT( slotWatermarkModeChanged( int ) ) ); connect( mWatermarkUrl, SIGNAL( textChanged( const QString& ) ), SLOT( slotWatermarkUrlChanged( const QString& ) ) ); connect( mTemplateUrl, SIGNAL( textChanged( const QString& ) ), SLOT( slotTemplateUrlChanged( const QString& ) ) ); connect( mAppendUrl, &QLineEdit::textChanged, this, &DocTypeEdit::slotAppendPDFUrlChanged ); fillNumberCycleCombo(); DocType dt( dtype ); mNumberCycleCombo->setCurrentIndex(mNumberCycleCombo->findText( dt.numberCycleName() )); int newMode = dt.mergeIdent().toInt(); mWatermarkCombo->setCurrentIndex( newMode ); bool state = true; if ( newMode == 0 ) state = false; mWatermarkUrl->setEnabled( state ); bool xrechnungEnabled = dt.isXRechnungEnabled(); mCbXRechnung->setCheckState(xrechnungEnabled ? Qt::Checked : Qt::Unchecked); } void DocTypeEdit::fillNumberCycleCombo() { QSqlQuery q; q.prepare( "SELECT name FROM numberCycles ORDER BY name" ); q.exec(); QStringList cycles; while ( q.next() ) { cycles << q.value( 0 ).toString(); } mNumberCycleCombo->clear(); mNumberCycleCombo->insertItems(-1, cycles ); } void DocTypeEdit::slotAddDocType() { // qDebug () << "Adding a doctype!"; QString newName = QInputDialog::getText( this, i18n( "Add Document Type" ), i18n( "Enter the name of a new document type" ) ); if ( newName.isEmpty() ) return; // qDebug () << "New Name to add: " << newName; if ( mTypeListBox->findItems(newName, Qt::MatchExactly).count() > 0 ) { // qDebug () << "New Name already exists"; } else { mTypeListBox->addItem( newName ); DocType newDt( newName, true ); mOrigDocTypes[newName] = newDt; mChangedDocTypes[newName] = newDt; // Check again! mAddedTypes.append( newName ); } } void DocTypeEdit::slotXRechnungToggled(bool newState) { qDebug() << "set XREchnung state:" << newState; DocType dt = currentDocType(); if ( newState != dt.isXRechnungEnabled() ) { dt.setXRechnungEnabled(newState); mChangedDocTypes[dt.name()] = dt; } } void DocTypeEdit::slotEditDocType() { // qDebug () << "Editing a doctype!"; QString currName = mTypeListBox->currentItem()->text(); if ( currName.isEmpty() ) return; QString newName = QInputDialog::getText( this, i18n( "Add Document Type" ), i18n( "Edit the name of a document type" ), QLineEdit::Normal, currName ); if ( newName.isEmpty() ) return; // qDebug () << "edit: " << currName << " became " << newName; if ( newName != currName ) { mTypeListBox->currentItem()->setText(newName); /* check if the word that was changed now was already changed before. */ bool prechanged = false; bool skipEntry = false; QMap::Iterator it; for ( it = mTypeNameChanges.begin(); !prechanged && it != mTypeNameChanges.end(); ++it ) { if (it.key() == currName ) { // it was changed back to an original name. mTypeNameChanges.erase( it ); skipEntry = true; } if ( !skipEntry && it.value() == currName ) { // qDebug () << "Was changed before, key is " << it.key(); currName = it.key(); prechanged = true; } } if ( ! skipEntry ) { mTypeNameChanges[currName] = newName; DocType dt( currName ); if ( mChangedDocTypes.contains( currName ) ) { dt = mChangedDocTypes[currName]; } dt.setName( newName ); mChangedDocTypes[newName] = dt; } } } void DocTypeEdit::slotRemoveDocType() { // qDebug () << "Removing a doctype!"; QListWidgetItem *currItem = mTypeListBox->currentItem(); if ( !currItem || currItem->text().isEmpty() ) { // qDebug () << "No current Item, return"; return; } QString currName = currItem->text(); if ( mAddedTypes.indexOf( currName ) != -1 ) { // remove item from recently added list. mChangedDocTypes.remove( currName ); mAddedTypes.removeAll( currName ); mOrigDocTypes.remove( currName ); } else { QString toRemove = currName; QMap::Iterator it; for ( it = mTypeNameChanges.begin(); it != mTypeNameChanges.end(); ++it ) { if ( currName == it.value() ) { // remove the original name toRemove = it.key(); // the original name } } mRemovedTypes.append( toRemove ); } delete currItem; // qDebug () << "removed type: " << mRemovedTypes; emit removedType( currName ); } void DocTypeEdit::slotDocTypeSelected( const QString& newValue ) { // qDebug () << "docTypeSelected: " << newValue << " and previous: " << mPreviousType; DocType dt( newValue ); if ( mChangedDocTypes.contains( newValue ) ) { dt = mChangedDocTypes[newValue]; // qDebug () << "new docType taken from ChangedDocTypes: "; } // store the previous type DocType prevType = mOrigDocTypes[mPreviousType]; if ( mChangedDocTypes.contains( mPreviousType ) ) { prevType = mChangedDocTypes[mPreviousType]; // qDebug () << "previous docType taken from ChangedDocTypes: "; } prevType.setNumberCycleName( mNumberCycleCombo->currentText() ); prevType.setTemplateFile( mTemplateUrl->text() ); prevType.setWatermarkFile( mWatermarkUrl->text() ); prevType.setAppendPDFFile(mAppendUrl->text()); prevType.setMergeIdent( QString::number( mWatermarkCombo->currentIndex() ) ); prevType.setXRechnungEnabled(mCbXRechnung->checkState() == Qt::Checked); mChangedDocTypes[mPreviousType] = prevType; // dt.setNumberCycleName( dt.numberCycleName() ); // qDebug () << "Selected doc type " << newValue; mIdent->setText( dt.identTemplate() ); int nextNum = dt.nextIdentId( false )-1; mCounter->setText( QString::number( nextNum ) ); mNumberCycleCombo->setCurrentIndex(mNumberCycleCombo->findText( dt.numberCycleName() )); // mHeader->setText( i18n( "Details for %1:", dt.name() ) ); mExampleId->setText( dt.generateDocumentIdent( QDate::currentDate(), mExampleAddressUid, nextNum, 2 /* phantasie date counter */) ); mTemplateUrl->setText( dt.templateFile() ); mWatermarkUrl->setText( dt.watermarkFile() ); int mergeIdent = dt.mergeIdent().toInt(); mWatermarkCombo->setCurrentIndex( mergeIdent ); mWatermarkUrl->setEnabled( mergeIdent > 0 ); mAppendUrl->setText(dt.appendPDF()); bool xrechnungEnabled = dt.isXRechnungEnabled(); mCbXRechnung->setCheckState(xrechnungEnabled ? Qt::Checked : Qt::Unchecked); mPreviousType = newValue; } void DocTypeEdit::slotEditNumberCycles() { saveDocTypes(); QString currNumbercycle = mNumberCycleCombo->currentText(); NumberCycleDialog dia( this, currNumbercycle ); if ( dia.exec() == QDialog::Accepted ) { fillNumberCycleCombo(); mNumberCycleCombo->setCurrentIndex(mNumberCycleCombo->findText( currNumbercycle )); DocType dt = currentDocType(); dt.readIdentTemplate(); // only the numbercycle has changed - refresh the display mIdent->setText( dt.identTemplate() ); int nextNum = dt.nextIdentId( false )-1; mCounter->setText( QString::number( nextNum ) ); mExampleId->setText( dt.generateDocumentIdent( QDate::currentDate(), mExampleAddressUid, nextNum, 2 ) ); } } DocType DocTypeEdit::currentDocType() { QString docType = mTypeListBox->currentItem()->text(); DocType dt = mOrigDocTypes[docType]; if ( mChangedDocTypes.contains( docType ) ) { dt = mChangedDocTypes[docType]; } return dt; } void DocTypeEdit::slotWatermarkModeChanged( int newMode ) { DocType dt = currentDocType(); QString newMergeIdent = QString::number( newMode ); if ( newMergeIdent != dt.mergeIdent() ) { dt.setMergeIdent( newMergeIdent ); if ( !mTypeListBox->currentItem()->text().isEmpty() ) { mChangedDocTypes[ mTypeListBox->currentItem()->text() ] = dt; } } bool state = true; if ( newMode == 0 ) state = false; mWatermarkUrl->setEnabled( state ); } void DocTypeEdit::slotAppendPDFUrlChanged(const QString& newUrl) { QString docType; if(mTypeListBox->currentRow() != -1) docType = mTypeListBox->currentItem()->text(); if( docType.isEmpty() || ! mOrigDocTypes.contains(docType) ) return; DocType dt = mOrigDocTypes[docType]; if ( mChangedDocTypes.contains( docType ) ) { dt = mChangedDocTypes[docType]; } if ( newUrl != dt.appendPDF() ) { dt.setAppendPDFFile(newUrl); mChangedDocTypes[docType] = dt; } } void DocTypeEdit::slotTemplateUrlChanged( const QString& newUrl ) { QString docType; if(mTypeListBox->currentRow() != -1) docType = mTypeListBox->currentItem()->text(); if( docType.isEmpty() || ! mOrigDocTypes.contains(docType) ) return; DocType dt = mOrigDocTypes[docType]; if ( mChangedDocTypes.contains( docType ) ) { dt = mChangedDocTypes[docType]; } if ( newUrl != dt.templateFile() ) { dt.setTemplateFile( newUrl ); mChangedDocTypes[docType] = dt; } } void DocTypeEdit::slotWatermarkUrlChanged( const QString& newUrl ) { QString docType = mTypeListBox->currentItem()->text(); DocType dt = mOrigDocTypes[docType]; if ( mChangedDocTypes.contains( docType ) ) { dt = mChangedDocTypes[docType]; } if ( newUrl != dt.watermarkFile() ) { dt.setWatermarkFile( newUrl ); mChangedDocTypes[docType] = dt; } } void DocTypeEdit::slotNumberCycleChanged( const QString& newCycle ) { QString docTypeName = mTypeListBox->currentItem()->text(); DocType dt = currentDocType(); dt.setNumberCycleName( newCycle ); mChangedDocTypes[docTypeName] = dt; // qDebug () << "Changing the cycle name of " << docTypeName << " to " << newCycle; mIdent->setText( dt.identTemplate() ); int nextNum = dt.nextIdentId( false )-1; mCounter->setText( QString::number( nextNum ) ); mExampleId->setText( dt.generateDocumentIdent( QDate::currentDate(), mExampleAddressUid, nextNum, 2 ) ); } QStringList DocTypeEdit::allNumberCycles() { QStringList re; re << NumberCycle::defaultName(); QSqlQuery q( "SELECT av.value FROM attributes a, attributeValues av " "WHERE a.id=av.attributeId AND a.hostObject='DocType' " "AND a.name='identNumberCycle'" ); while ( q.next() ) { QString cycleName = q.value(0).toString(); re << cycleName; } return re; } void DocTypeEdit::saveDocTypes() { // removed doctypes // FIXME: Remove unreferenced number cycles for ( QStringList::Iterator it = mRemovedTypes.begin(); it != mRemovedTypes.end(); ++it ) { if ( mOrigDocTypes.contains( *it ) ) { DocType dt = mOrigDocTypes[*it]; removeTypeFromDb( *it ); mOrigDocTypes.remove( *it ); mChangedDocTypes.remove( *it ); emit removedType( *it ); } } // added doctypes for ( QStringList::Iterator it = mAddedTypes.begin(); it != mAddedTypes.end(); ++it ) { QString name = *it; if ( mOrigDocTypes.contains( name ) ) { // just to check DocType dt = mChangedDocTypes[name]; dt.save(); } } // edited doctypes QMap::Iterator it; for ( it = mTypeNameChanges.begin(); it != mTypeNameChanges.end(); ++it ) { QString oldName( it.key() ); if ( mOrigDocTypes.contains( oldName ) ) { QString newName = it.value(); DocType dt = mOrigDocTypes[oldName]; if ( mChangedDocTypes.contains( newName ) ) { dt = mChangedDocTypes[newName]; } else { dt.setName( newName ); } mOrigDocTypes.remove( oldName ); mOrigDocTypes[newName] = dt; dt.save(); } else { qCritical() << "Can not find doctype to change named " << oldName; } } // check if numberCycles have changed. QMap::Iterator mapit; for ( mapit = mChangedDocTypes.begin(); mapit != mChangedDocTypes.end(); ++mapit ) { DocType dt = mapit.value(); dt.save(); } // now the list of document types should be up to date and reflected into // the database. DocType::clearMap(); } void DocTypeEdit::removeTypeFromDb( const QString& name ) { QSqlQuery delQuery; dbID id = DocType::docTypeId( name ); if ( !id.isOk() ) { // qDebug () << "Can not find doctype " << name << " to remove!"; return; } // delete in DocTypeRelations delQuery.prepare( "DELETE FROM DocTypeRelations WHERE followerId=:id or typeId=:id" ); delQuery.bindValue( ":id", id.toString() ); delQuery.exec(); // delete in DocTexts delQuery.prepare( "DELETE FROM DocTexts WHERE DocTypeId=:id" ); delQuery.bindValue( ":id", id.toString() ); delQuery.exec(); // delete in the DocTypes table delQuery.prepare( "DELETE FROM DocTypes WHERE docTypeId=:id" ); delQuery.bindValue( ":id", id.toString() ); delQuery.exec(); AttributeMap attMap( "DocType" ); attMap.dbDeleteAll( id ); } void DocTypeEdit::renameTypeInDb( const QString& oldName, const QString& newName ) { QSqlQuery q; q.prepare( "UPDATE DocTypes SET name=:newName WHERE docTypeID=:oldId" ); dbID id = DocType::docTypeId( oldName ); if ( id.isOk() ) { q.bindValue( ":newName", newName ); q.bindValue( ":oldId", id.toInt() ); q.exec(); if ( q.numRowsAffected() == 0 ) { qCritical() << "Database update failed for renaming " << oldName << " to " << newName; } else { // qDebug () << "Renamed doctype " << oldName << " to " << newName; } } else { qCritical() << "Could not find the id for doctype named " << oldName; } } kraft-1.2.2/src/doctypeedit.h000066400000000000000000000051731467704360200161170ustar00rootroot00000000000000/*************************************************************************** doctypeedit.h - the document type editor ------------------- begin : Fri Jan 2 2009 copyright : (C) 2009 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef DOCTYPEEDIT_H #define DOCTYPEEDIT_H #include #include #include #include "doctype.h" #include "ui_doctypeeditbase.h" class QLineEdit; class QLabel; class QPushButton; class QComboBox; class QCheckBox; /** * @author Klaas Freitag */ // ################################################################################ class DocTypeEdit : public QWidget, protected Ui::DocTypeEditBase { Q_OBJECT public: DocTypeEdit( QWidget *parent = 0 ); void saveDocTypes(); public slots: void slotDocTypeSelected( const QString& = QString() ); void slotAddDocType(); void slotEditDocType(); void slotRemoveDocType(); protected slots: void fillNumberCycleCombo(); void slotNumberCycleChanged( const QString& ); void slotEditNumberCycles(); void slotWatermarkModeChanged( int ); void slotWatermarkUrlChanged( const QString& ); void slotTemplateUrlChanged( const QString& ); void slotAppendPDFUrlChanged( const QString& ); void slotXRechnungToggled(bool); signals: /** * emitted for every doctype which is deleted */ void removedType( const QString& ); private: DocType currentDocType(); DocType mOrigDocType; QStringList allNumberCycles(); QStringList removedTypes() { return mRemovedTypes; } void removeTypeFromDb( const QString& ); void renameTypeInDb( const QString&, const QString& ); QMap mTypeNameChanges; QMap mChangedDocTypes; QMap mOrigDocTypes; QStringList mAddedTypes; QStringList mRemovedTypes; QString mPreviousType; QString mExampleDocType; QString mExampleAddressUid; }; #endif kraft-1.2.2/src/doctypeeditbase.ui000066400000000000000000000303651467704360200171410ustar00rootroot00000000000000 DocTypeEditBase 0 0 826 605 0 0 0 0 Qt::Horizontal QSizePolicy::Expanding 37 20 Click to add a new document type to the list. Add click to edit the selected document type name Edit click to remove the current document type Remove Unique Document Number Number &cycle: false mNumberCycleCombo example Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Ident template: false Example ID: false example Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false example Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Counter: false Qt::Horizontal QSizePolicy::Expanding 71 20 &Edit Number Cycles… Document Type Options Enable XRechung Support Qt::Vertical QSizePolicy::Expanding 17 51 PDF Creation and Postprocessing &Template file: false mTemplateUrl 0 0 select W&atermark: false mWatermarkCombo no watermark on first page on all pages alternating (3 pages) different first and last page (3 pages) Watermark fi&le: false mWatermarkUrl 0 0 0 0 select Append &PDF: false mWatermarkUrl 0 0 0 0 select kraft-1.2.2/src/documentman.cpp000066400000000000000000000147621467704360200164530ustar00rootroot00000000000000/*************************************************************************** documentman.cpp - Document Manager ------------------- begin : 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include "documentman.h" #include "defaultprovider.h" #include "docdigest.h" #include "kraftdb.h" #include "doctype.h" #include "kraftsettings.h" Q_GLOBAL_STATIC(DocumentMan, mSelf) DocumentMan *DocumentMan::self() { return mSelf; } DocumentMan::DocumentMan() : mFullTax( -1 ), mReducedTax( -1 ) { } DocGuardedPtr DocumentMan::copyDocument( const QString& copyFromId ) { DocGuardedPtr doc = new KraftDoc( ); if ( ! copyFromId.isEmpty() ) { // copy the content from the source document to the new doc. DocGuardedPtr sourceDoc = openDocument( copyFromId ); if ( sourceDoc ) { *doc = *sourceDoc; // copies all data from the previous doc doc->setPredecessor(QString()); // clear the predecessor } doc->setLastModified( QDateTime::currentDateTime()); } return doc; } DocGuardedPtr DocumentMan::createDocument( const QString& docType, const QString& copyFromId, const DocPositionList& listToCopy) { DocGuardedPtr doc = new KraftDoc(); // qDebug () << "new document ID: " << doc->docID().toString(); if ( ! copyFromId.isEmpty() ) { // copy the content from the source document to the new doc. DocGuardedPtr sourceDoc = openDocument( copyFromId ); if ( sourceDoc ) { *doc = *sourceDoc; // copies all data from the previous doc doc->setIdent(QString()); doc->setDocType(docType); // sets the defaults for the new doc type doc->deleteItems(); // remove all items that exist so far doc->setPositionList(listToCopy, true); // check for relations between old and new doc DocType sourceDocType( sourceDoc->docType() ); // for new docs check if it should substract the sum of the predecessor doc DocType newDocType(docType); if( newDocType.substractPartialInvoice() ) { if( sourceDocType.partialInvoice() ) { Geld g = sourceDoc->nettoSum(); DocPosition *pos = doc->createPosition(DocPositionBase::Position); if(pos) { Einheit e; pos->setUnit(e); pos->setAmount(1.0); Geld ng(-1 * g.toLong()); pos->setUnitPrice(ng); pos->setText(i18nc("Text to be inserted into a doc, if the sum of another doc needs to be substracted " "ie. in a final invoice if there was a partial invoice before" "%1 is substited by the doc type, %2 by the id of the predecessor doc.", "Substract sum from %1 %2", sourceDocType.name(), sourceDoc->ident())); } } } doc->setPredecessor(sourceDoc->ident()); // Take the default pre- and posttext for the new docType, or, if that is empty, the texts of the old doc QString newText = DefaultProvider::self()->defaultText( docType, KraftDoc::Header ); if (newText.isEmpty() ) { newText = sourceDoc->preTextRaw(); } doc->setPreTextRaw(newText); newText = DefaultProvider::self()->defaultText( docType, KraftDoc::Footer ); if (newText.isEmpty() ) { newText = sourceDoc->postTextRaw(); } doc->setPostTextRaw(newText); delete sourceDoc; } } else { // Absolute new document doc->setDocType(docType); doc->setPreTextRaw(DefaultProvider::self()->defaultText(docType, KraftDoc::Header)); doc->setPostTextRaw(DefaultProvider::self()->defaultText(docType, KraftDoc::Footer)); doc->setGoodbye( KraftSettings::greeting() ); } // set the proper texts and other data doc->setLastModified( QDateTime::currentDateTime()); return doc; } DocGuardedPtr DocumentMan::openDocumentbyIdent( const QString& ident ) { QSqlQuery q; q.prepare("SELECT docID FROM document WHERE ident=:ident"); q.bindValue(":ident", ident); q.exec(); if( q.next() ) { const QString id = q.value(0).toString(); return openDocument(id); } return nullptr; } DocGuardedPtr DocumentMan::openDocument( const QString& id ) { // qDebug () << "Opening Document with id " << id; DocGuardedPtr doc = new KraftDoc(); doc->openDocument( id ); return doc; } void DocumentMan::clearTaxCache() { mFullTax = -1; mReducedTax = -1; } double DocumentMan::tax( const QDate& date ) { if ( mFullTax < 0 || date != mTaxDate ) readTaxes( date ); return mFullTax; } double DocumentMan::reducedTax( const QDate& date ) { if ( mReducedTax < 0 || date != mTaxDate ) readTaxes( date ); return mReducedTax; } bool DocumentMan::readTaxes( const QDate& date ) { QString sql; QSqlQuery q; sql = "SELECT fullTax, reducedTax, startDate FROM taxes "; sql += "WHERE startDate <= :date ORDER BY startDate DESC LIMIT 1"; q.prepare( sql ); QString dateStr = date.toString( "yyyy-MM-dd" ); // qDebug () << "** Datestring: " << dateStr; q.bindValue( ":date", dateStr ); q.exec(); if ( q.next() ) { mFullTax = q.value( 0 ).toDouble(); mReducedTax = q.value( 1 ).toDouble(); mTaxDate = date; // qDebug () << "* Taxes: " << mFullTax << "/" << mReducedTax << " from " << q.value( 2 ).toDate(); } return ( mFullTax > 0 && mReducedTax > 0 ); } DocumentMan::~DocumentMan() { } kraft-1.2.2/src/documentman.h000066400000000000000000000034761467704360200161200ustar00rootroot00000000000000/*************************************************************************** documentman.h - Document Manager ------------------- begin : 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef DOCUMENTMAN_H #define DOCUMENTMAN_H #include "kraftdoc.h" class DocPosition; class QSqlQuery; typedef QMap DocumentMap; class DocumentMan { public: ~DocumentMan(); static DocumentMan *self(); DocGuardedPtr createDocument(const QString& docType, const QString& copyFromId = QString(), const DocPositionList &listToCopy = DocPositionList() ); DocGuardedPtr copyDocument( const QString& copyFromId ); DocGuardedPtr openDocument( const QString& ); DocGuardedPtr openDocumentbyIdent( const QString& ident ); double tax( const QDate& ); double reducedTax( const QDate& ); void clearTaxCache(); DocumentMan(); private: bool readTaxes( const QDate& ); double mFullTax; double mReducedTax; QDate mTaxDate; }; #endif kraft-1.2.2/src/documentsaverbase.cpp000066400000000000000000000023151467704360200176420ustar00rootroot00000000000000/*************************************************************************** documentsaverbase - saver for documents ------------------- begin : 2006-20-01 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt // include files for KDE #include #include "documentsaverbase.h" DocumentSaverBase::DocumentSaverBase( ) : QObject() { } DocumentSaverBase::~DocumentSaverBase( ) { } /* END */ kraft-1.2.2/src/documentsaverbase.h000066400000000000000000000026001467704360200173040ustar00rootroot00000000000000/*************************************************************************** documentsaverbase - Base class of a document save class ------------------- begin : 2006-02-21 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _DOCUMENTSAVERBASE_H #define _DOCUMENTSAVERBASE_H // include files #include /** * */ class KraftDoc; class dbID; class DocumentSaverBase : public QObject { Q_OBJECT public: DocumentSaverBase(); virtual ~DocumentSaverBase(); virtual bool saveDocument( KraftDoc* ) = 0; virtual void load( const QString&, KraftDoc * ) = 0; }; #endif /* END */ kraft-1.2.2/src/documentsaverdb.cpp000066400000000000000000000377411467704360200173300ustar00rootroot00000000000000/*************************************************************************** templatesaverbase - ------------------- begin : 2005-20-01 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include // include files for KDE #include #include "documentsaverdb.h" #include "docposition.h" #include "kraftdoc.h" #include "kraftdb.h" #include "unitmanager.h" #include "dbids.h" #include "kraftsettings.h" #include "doctype.h" #include "defaultprovider.h" /* Table document: * +----------------+--------------+------+-----+-------------------+----------------+ * | Field | Type | Null | Key | Default | Extra | * +----------------+--------------+------+-----+-------------------+----------------+ * | docID | int(11) | NO | PRI | NULL | auto_increment | * | ident | varchar(32) | YES | MUL | NULL | | * | docType | varchar(255) | YES | | NULL | | * | docDescription | text | YES | | NULL | | * | clientID | varchar(32) | YES | MUL | NULL | | * | clientAddress | text | YES | | NULL | | * | salut | varchar(255) | YES | | NULL | | * | goodbye | varchar(128) | YES | | NULL | | * | lastModified | timestamp | NO | | CURRENT_TIMESTAMP | | * | date | date | YES | | NULL | | * | pretext | text | YES | | NULL | | * | posttext | text | YES | | NULL | | * | country | varchar(32) | YES | | NULL | | * | language | varchar(32) | YES | | NULL | | * | projectLabel | varchar(255) | YES | | NULL | | * | predecessor | varchar(32) | YES | | NULL | | * +----------------+--------------+------+-----+-------------------+----------------+ * 14 rows in set (0.00 sec) * */ namespace { void checkAndSet(bool& changes, QSqlRecord& record, const QString& name, const QVariant& setValue) { Q_ASSERT(record.contains(name)); // the record must have the column if( record.value(name) != setValue) { record.setValue(name, setValue); changes = true; } } bool fillDocumentBuffer(QSqlRecord &buf, KraftDoc *doc) { bool changes {false}; if( doc ) { checkAndSet(changes, buf, "ident", doc->ident()); checkAndSet(changes, buf, "docType", doc->docType()); checkAndSet(changes, buf, "docDescription", KraftDB::self()->mysqlEuroEncode(doc->whiteboard())); checkAndSet(changes, buf, "clientID", doc->addressUid()); checkAndSet(changes, buf, "clientAddress", doc->address()); checkAndSet(changes, buf, "salut", doc->salut()); checkAndSet(changes, buf, "goodbye", doc->goodbye()); checkAndSet(changes, buf, "date", doc->date()); checkAndSet(changes, buf, "pretext", KraftDB::self()->mysqlEuroEncode( doc->preTextRaw())); checkAndSet(changes, buf, "posttext", KraftDB::self()->mysqlEuroEncode( doc->postTextRaw())); // The locale can be reconstructed from the name of the locale. checkAndSet(changes, buf, "country", DefaultProvider::self()->locale()->name()); // ...while the language setting is not really needed, but for beauty written to db. checkAndSet(changes, buf, "language", QLocale::languageToString(DefaultProvider::self()->locale()->language())); checkAndSet(changes, buf, "projectLabel", doc->projectLabel()); checkAndSet(changes, buf, "predecessor", doc->predecessor()); } return changes; } } DocumentSaverDB::DocumentSaverDB( ) : DocumentSaverBase(), PosTypePosition( QString::fromLatin1( "Position" ) ), PosTypeExtraDiscount( QString::fromLatin1( "ExtraDiscount" ) ), PosTypeHeader( QString::fromLatin1( "Header" ) ) { } bool DocumentSaverDB::saveDocument(KraftDoc *doc ) { if( ! doc ) return false; QSqlTableModel model; model.setTable("document"); QSqlRecord record; // qDebug () << "############### Document Save ################"; if( doc->isNew() ) { record = model.record(); } else { model.setFilter("docID=" + doc->docID().toString()); model.select(); if ( model.rowCount() > 0 ) { record = model.record(0); } else { qCritical() << "Could not select document record"; return false; } // The document was already saved. } QString ident; if( doc->isNew() || doc->docTypeChanged() ) { // an existing doc has a new document type. Fix the doc number cycle and pick a new ident DocType dt( doc->docType() ); int id = dt.nextIdentId(true); int dayCnt = dt.nextDayCounter(QDate::currentDate()); ident = dt.generateDocumentIdent(doc->date(), doc->addressUid(), id, dayCnt); doc->setIdent( ident ); } bool hasChanges = fillDocumentBuffer( record, doc ); if( doc->isNew() ) { // qDebug () << "Doc is new, inserting"; if( !model.insertRecord(-1, record)) { QSqlError err = model.lastError(); // qDebug () << "################# SQL Error: " << err.text(); } model.submitAll(); dbID id = KraftDB::self()->getLastInsertID(); doc->setDocID( id ); model.setFilter("docID=" + id.toString()); model.select(); if ( model.rowCount() > 0 ) { model.setData(model.index(0, 1), ident); model.submitAll(); } } else { // qDebug () << "Doc is not new, updating #" << doc->docID().intID(); checkAndSet(hasChanges, record, "docID", doc->docID().toString()); if (!hasChanges) { // if there haven't been changes in the document record, we update the changes // timestamp manually, otherwise it is not updated at all. const QString dt = QDateTime::currentDateTime().toString("yyyy-MM-ddThh:mm:ss"); checkAndSet(hasChanges, record, "lastModified", QVariant(dt)); } } model.setRecord(0, record); model.submitAll(); saveDocumentPositions( doc ); // qDebug () << "Saved document no " << doc->docID().toString(); return true; } void DocumentSaverDB::saveDocumentPositions( KraftDoc *doc ) { DocPositionList posList = doc->positions(); // invert all pos numbers to avoid a unique violation // FIXME: We need non-numeric ids QSqlQuery upq; QString queryStr = "UPDATE docposition SET ordNumber = -1 * ordNumber WHERE docID="; queryStr += doc->docID().toString(); queryStr += " AND ordNumber > 0"; upq.prepare( queryStr ); upq.exec(); int ordNumber = 1; QSqlTableModel model; model.setTable("docposition"); model.setEditStrategy(QSqlTableModel::OnManualSubmit); QVector deleteIds; DocPositionListIterator it( posList ); while( it.hasNext() ) { DocPositionBase *dpb = it.next(); DocPosition *dp = static_cast(dpb); int posDbID = dp->dbId().toInt(); if( dp->toDelete() ) { qDebug () << "Delete doc item id" << posDbID; // delete all existing attributes dp->attributes().dbDeleteAll( dp->dbId() ); deleteIds.append(posDbID); continue; } QSqlRecord record ; bool doInsert = true; if( posDbID > -1 ) { const QString selStr = QString("docID=%1 AND positionID=%2").arg( doc->docID().toInt() ).arg( posDbID ); // qDebug() << "Selecting with " << selStr; model.setFilter(selStr); model.select(); if ( model.rowCount() > 0 ) { record = model.record(0); doInsert = false; } else { qCritical() << "ERR: Could not select document position record"; return; } } else { // The record is new record = model.record(); } // qDebug() << "Updating position " << dp->position() << " is " << dp->text(); QString typeStr = PosTypePosition; double price = dp->unitPrice().toDouble(); if ( dp->type() == DocPositionBase::ExtraDiscount ) { typeStr = PosTypeExtraDiscount; } record.setValue( "docID", QVariant(doc->docID().toInt())); record.setValue( "ordNumber", QVariant(ordNumber)); record.setValue( "text", QVariant(dp->text())); record.setValue( "postype", QVariant(typeStr)); record.setValue( "amount", QVariant(dp->amount())); int unitId = dp->unit().id(); record.setValue( "unit", QVariant(unitId)); record.setValue( "price", QVariant(price)); record.setValue( "taxType", QVariant(dp->taxType())); ordNumber++; // FIXME if( doInsert ) { // qDebug () << "Inserting!"; model.insertRecord(-1, record); model.submitAll(); dp->setDbId( KraftDB::self()->getLastInsertID().toInt() ); } else { // qDebug () << "Updating!"; model.setRecord(0, record); model.submitAll(); } QSqlError err = model.lastError(); if( err.type() != QSqlError::NoError ) { qDebug () << "SQL-ERR: " << err.text() << " in " << model.tableName(); } dp->attributes().save( dp->dbId() ); } model.submitAll(); /* remove the docpositions that were marked to be deleted */ if( deleteIds.count() ) { QSqlQuery delQuery; delQuery.prepare( "DELETE FROM docposition WHERE positionID=:id and docID=:docId" ); int docId = doc->docID().toInt(); for( int id : deleteIds ) { // kDebug() << "Deleting attribute id " << id; delQuery.bindValue(":id", id ); delQuery.bindValue(":docId", docId); delQuery.exec(); } } } void DocumentSaverDB::load( const QString& id, KraftDoc *doc ) { if( !id.isEmpty() ) { QSqlQuery q; q.prepare("SELECT ident, docType, clientID, clientAddress, salut, goodbye, date, lastModified, language, country, " "pretext, posttext, docDescription, projectlabel, predecessor FROM document WHERE docID=:docID"); q.bindValue(":docID", id); q.exec(); // qDebug () << "Loading document id " << id; if( q.next()) { // qDebug () << "loading document with id " << id; dbID dbid; dbid = id; doc->setDocID(dbid); doc->setIdent( q.value( 0 ).toString() ); doc->setDocType( q.value( 1 ).toString() ); doc->setAddressUid( q.value( 2 ).toString() ); doc->setAddress( q.value( 3 ).toString() ); QString salut = q.value(4).toString(); doc->setSalut( salut ); doc->setGoodbye( q.value( 5 ).toString() ); doc->setDate ( q.value( 6 ).toDate() ); QDateTime dt = q.value(7).toDateTime(); // Sqlite stores the timestamp as UTC in the database. Mysql does not. if (KraftDB::self()->isSqlite()) { dt.setTimeSpec(Qt::UTC); doc->setLastModified(dt.toLocalTime()); } else { doc->setLastModified(dt); } // Removed, as with Kraft 0.80 there is no locale management on doc level any more // Later, the locale can be read from here again. // doc->setCountryLanguage( q.value( 8 ).toString(), // q.value( 9 ).toString()); doc->setPreTextRaw( KraftDB::self()->mysqlEuroDecode( q.value( 10 ).toString() ) ); doc->setPostTextRaw( KraftDB::self()->mysqlEuroDecode( q.value( 11 ).toString() ) ); doc->setWhiteboard( KraftDB::self()->mysqlEuroDecode( q.value( 12 ).toString() ) ); doc->setProjectLabel( q.value(13).toString() ); doc->setPredecessor( q.value(14).toString() ); } } // load the dbID of the predecessor document from the database. const QString pIdent = doc->predecessor(); if( ! pIdent.isEmpty() ) { QSqlQuery q1; q1.prepare("SELECT docID FROM document WHERE ident=:docID"); q1.bindValue(":docID", pIdent); q1.exec(); if( q1.next() ) { const QString pDbId = q1.value(0).toString(); doc->setPredecessorDbId(pDbId); } } // finally load the item data. loadPositions( id, doc ); } /* docposition: +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | positionID | int(11) | | PRI | NULL | auto_increment | | docID | int(11) | | MUL | 0 | | | ordNumber | int(11) | | | 0 | | | text | mediumtext | YES | | NULL | | | amount | decimal(6,2) | YES | | NULL | | | unit | varchar(64) | YES | | NULL | | | price | decimal(6,2) | YES | | NULL | | +------------+--------------+------+-----+---------+----------------+ */ void DocumentSaverDB::loadPositions( const QString& id, KraftDoc *doc ) { QSqlQuery q; q.prepare("SELECT positionID, postype, text, amount, unit, price, taxType FROM docposition WHERE docID=:docID ORDER BY ordNumber"); q.bindValue(":docID", id); q.exec(); // qDebug () << "* loading document positions for document id " << id; while( q.next() ) { // qDebug () << " loading position id " << q.value( 0 ).toInt(); DocPositionBase::PositionType type = DocPositionBase::Position; QString typeStr = q.value( 1 ).toString(); if ( typeStr == PosTypeExtraDiscount ) { type = DocPositionBase::ExtraDiscount; } else if ( typeStr == PosTypePosition ) { // nice, default position type. type = DocPositionBase::Position; } else { // qDebug () << "ERROR: Strange type string loaded from db: " << typeStr; } DocPosition *dp = doc->createPosition( type ); dp->setDbId( q.value(0).toInt() ); dp->setText( q.value(2).toString() ); // Note: empty fields are treated as Positions which is intended because // the type col was added later and thus might be empty for older entries dp->setAmount( q.value(3).toDouble() ); dp->setUnit( UnitManager::self()->getUnit( q.value(4).toInt() ) ); dp->setUnitPrice( q.value(5).toDouble() ); dp->setTaxType( q.value(6).toInt() ); dp->loadAttributes(); } } DocumentSaverDB::~DocumentSaverDB( ) { } /* END */ kraft-1.2.2/src/documentsaverdb.h000066400000000000000000000031741467704360200167660ustar00rootroot00000000000000/*************************************************************************** documentsaverdb - save documents to the database ------------------- begin : 2006-02-21 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _DOCUMENTSAVERDB_H #define _DOCUMENTSAVERDB_H #include "documentsaverbase.h" class KraftDoc; class QSqlRecord; class dbID; class QString; class DocumentSaverDB : public DocumentSaverBase { Q_OBJECT public: DocumentSaverDB(); virtual ~DocumentSaverDB(); virtual bool saveDocument( KraftDoc* ); virtual void load( const QString& , KraftDoc * ); protected: virtual void loadPositions( const QString&, KraftDoc* ); virtual void saveDocumentPositions( KraftDoc* ); private: const QString PosTypePosition; const QString PosTypeExtraDiscount; const QString PosTypeHeader; }; #endif /* END */ kraft-1.2.2/src/documenttemplate.cpp000066400000000000000000000477461467704360200175230ustar00rootroot00000000000000/*************************************************************************** Template for Kraft Documents - Grantlee and ctemplate ------------------- begin : March 2020 copyright : (C) 2020 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "documenttemplate.h" #include "epcqrcode.h" #include "texttemplate.h" #include "grantleetemplate.h" #include "format.h" #include "kraftsettings.h" #include "version.h" #include #define TAG( THE_TAG ) QStringLiteral( THE_TAG ) #define DICT( THE_DICT ) QStringLiteral( THE_DICT ) // ================================================================================== namespace { QString escapeTrml2pdfXML( const QString& str ) { return( str.toHtmlEscaped() ); } QString rmlString( const QString& str, const QString& paraStyle = QString() ) { QString rml; QString style( paraStyle ); if ( style.isEmpty() ) style = QStringLiteral("text"); // QStringList li = QStringList::split( "\n", escapeTrml2pdfXML( str ) ); QStringList li = escapeTrml2pdfXML( str ).split( "\n" ); rml = QString( "" ).arg( style ); rml += li.join( QString( "" ).arg( style ) ) + ""; // qDebug () << "Returning " << rml; return rml; } QVariantHash contactToVariantHash(const KContacts::Addressee& contact ) { QVariantHash hash; QString n = contact.realName(); if (n.isEmpty()) n = QStringLiteral("Not set!"); hash.insert( QStringLiteral( "NAME" ), escapeTrml2pdfXML(n) ); if( contact.isEmpty() ) return hash; QString co = contact.organization(); if( co.isEmpty() ) { co = contact.realName(); } hash.insert( QStringLiteral( "ORGANISATION" ), escapeTrml2pdfXML( co ) ); const QUrl url = contact.url().url(); hash.insert( QStringLiteral( "URL" ), escapeTrml2pdfXML( url.url() ) ); hash.insert( QStringLiteral( "EMAIL" ), escapeTrml2pdfXML( contact.preferredEmail() ) ); hash.insert( QStringLiteral( "PHONE" ), escapeTrml2pdfXML( contact.phoneNumber( KContacts::PhoneNumber::Work ).number() ) ); hash.insert( QStringLiteral( "FAX" ), escapeTrml2pdfXML( contact.phoneNumber( KContacts::PhoneNumber::Fax ).number() ) ); hash.insert( QStringLiteral( "CELL" ), escapeTrml2pdfXML( contact.phoneNumber( KContacts::PhoneNumber::Cell ).number() ) ); KContacts::Address address; address = contact.address( KContacts::Address::Pref ); if( address.isEmpty() ) address = contact.address(KContacts::Address::Work ); if( address.isEmpty() ) address = contact.address(KContacts::Address::Home ); if( address.isEmpty() ) address = contact.address(KContacts::Address::Postal ); hash.insert( QStringLiteral( "POSTBOX" ), escapeTrml2pdfXML( address.postOfficeBox() ) ); hash.insert( QStringLiteral( "EXTENDED" ), escapeTrml2pdfXML( address.extended() ) ); hash.insert( QStringLiteral( "STREET" ), escapeTrml2pdfXML( address.street() ) ); hash.insert( QStringLiteral( "LOCALITY" ), escapeTrml2pdfXML( address.locality() ) ); hash.insert( QStringLiteral( "REGION" ), escapeTrml2pdfXML( address.region() ) ); hash.insert( QStringLiteral( "POSTCODE" ), escapeTrml2pdfXML( address.postalCode() ) ); hash.insert( QStringLiteral( "COUNTRY" ), escapeTrml2pdfXML( address.country() ) ); hash.insert( QStringLiteral( "REGION" ), escapeTrml2pdfXML( address.region() ) ); hash.insert( QStringLiteral("LABEL" ), escapeTrml2pdfXML( address.label() ) ); return hash; } QVariantHash labelVariantHash() { QVariantHash hash; hash.insert( TAG( "NO_SHORT"), i18nc("Sequence number printed on the document", "No.") ); hash.insert( TAG( "ITEM"), i18nc("Document item printed on the document", "Item") ); hash.insert( TAG( "QUANTITY_SHORT"), i18nc("Abbrev. of Quantity printed on the document", "Qty.") ); hash.insert( TAG( "UNIT"), i18nc("Unit printed on the document", "Unit") ); hash.insert( TAG( "PRICE"), i18nc("Price of an item printed on the document", "Price") ); hash.insert( TAG( "SUM"), i18nc("Printed on the document", "Sum") ); hash.insert( TAG( "NET"), i18nc("printed on the document", "Net") ); hash.insert( TAG( "VAT"), i18nc("Printed on the document", "VAT") ); hash.insert( TAG( "TYPE"), i18nc("Document type, printed on the document", "Type") ); hash.insert( TAG( "PHONE"), i18nc("Printed on the document", "Phone")); hash.insert( TAG( "FAX"), i18nc("Printed on the document", "Fax")); hash.insert( TAG( "MOBILE"), i18nc("Printed on the document", "Mobile")); hash.insert( TAG( "EMAIL"), i18nc("Printed on the document", "Email")); hash.insert( TAG( "WEBSITE"), i18nc("Printed on the document", "Website")); hash.insert( TAG( "PAGE"), i18nc("Printed on the document", "Page")); hash.insert( TAG( "PREDECESSOR"), i18nc("Label of Predecessor document number", "Predecessor-Doc")); hash.insert( TAG( "PAGE_OF"), i18nc("the 'of' in page X of Y", "of")); hash.insert( TAG( "DOC_NO"), i18nc("Document number on document", "Document No.")); hash.insert( TAG( "DATE"), i18nc("Date on document", "Date")); hash.insert( TAG( "PROJECT"), i18nc("Project label", "Project")); hash.insert( TAG( "CUST_ID"), i18nc("Customer ID on document", "Customer ID")); hash.insert( TAG( "CURRENCY_SIGN"), DefaultProvider::self()->currencySymbol()); return hash; } QVariantHash kraftVariantHash() { QVariantHash hash; QString h = QString("Kraft %1 %2").arg(Kraft::Version::number()). arg(Kraft::Version::codeName()); hash.insert(TAG("VERSION"), h); h = QString("DB-Scheme %1").arg(Kraft::Version::dbSchemaVersion()); hash.insert(TAG("DB_SCHEME"), h); h = qgetenv("USER"); if (h.isEmpty()) h = qgetenv("USERNAME"); hash.insert(TAG("SYS_USER"), h); h = qgetenv("HOSTNAME"); if (h.isEmpty()) h = qgetenv("HOST"); if (!h.isEmpty()) hash.insert(TAG("HOSTNAME"), h); return hash; } void variantHashToTemplate( TextTemplate& tmpl, const QString& prefix, const QVariantHash& hash) { QVariantHash::const_iterator i; for (i = hash.constBegin(); i != hash.constEnd(); ++i) { QString key = i.key(); if (!prefix.isEmpty()) { key = QString("%1_%2").arg(prefix).arg(i.key()); } tmpl.setValue(key, i.value().toString()); } } void contactToTemplate( TextTemplate& tmpl, const QString& prefix, const KContacts::Addressee& contact ) { const QVariantHash hash = contactToVariantHash(contact); variantHashToTemplate(tmpl, prefix, hash); } void addLabelsToTemplate(TextTemplate& tmpl) { const QVariantHash hash = labelVariantHash(); variantHashToTemplate(tmpl, QStringLiteral("LAB"), hash); } QString generateEPCQRCodeFile(ArchDoc *archDoc) { QString tempFile; if (!archDoc) return tempFile; const QString bacName = KraftSettings::self()->bankAccountName(); const QString bacIBAN = KraftSettings::self()->bankAccountIBAN(); const QString bacBIC = KraftSettings::self()->bankAccountBIC(); EPCQRCode qrCode; const QString reason = i18nc("Credit Transfer reason string, 1=DocType, 2=DocIdent, 3=Date, ie. Invoice 2022-183 dated 2022-03-22", "%1 %2 dated %3",archDoc->docTypeStr(), archDoc->ident(), archDoc->dateStr()); const QString svgText = qrCode.asSvg(archDoc->bruttoSum(), bacName, bacBIC, bacIBAN, reason); // -- save the EPC QR Code to a temp file if (svgText.isEmpty()) { qWarning() << "Failed to generate SVG text"; } else { QTemporaryFile tFile(QString("%1/XXXXXX.svg").arg(QDir::tempPath())); tFile.setAutoRemove(false); if (tFile.open()) { tempFile = tFile.fileName(); QTextStream stream(&tFile); stream << svgText; tFile.close(); } } return tempFile; } } // ================================================================================== DocumentTemplate::DocumentTemplate( const QString& tmplFile ) :_tmplFile(tmplFile) { } // ================================================================================== CTemplateDocumentTemplate::CTemplateDocumentTemplate(const QString& tmplFile) :DocumentTemplate(tmplFile) { } const QString CTemplateDocumentTemplate::expand(ArchDoc *archDoc, const KContacts::Addressee& myContact, const KContacts::Addressee& customerContact) { if (archDoc == nullptr) { return QString(); } // create a text template TextTemplate tmpl; tmpl.setTemplateFileName(_tmplFile); /* replace the placeholders */ /* A placeholder has the format */ const ArchDocPositionList posList = archDoc->positions(); QString h; ArchDocPositionList::const_iterator it; int specialPosCnt = 0; int taxFreeCnt = 0; int reducedTaxCnt = 0; int fullTaxCnt = 0; bool individualTax = false; /* Check for the tax settings: If the taxType is not the same for all items, * we have individual Tax setting and show the tax marker etc. */ DocPositionBase::TaxType ttype = DocPositionBase::TaxInvalid; for ( it = posList.begin(); it != posList.end(); ++it ) { ArchDocPosition pos (*it); if( ttype == DocPositionBase::TaxInvalid ) { ttype = pos.taxType(); } else { if( ttype != pos.taxType() ) { // different from previous one? individualTax = true; break; } } } /* now loop over the items to fill the template structures */ for ( it = posList.begin(); it != posList.end(); ++it ) { ArchDocPosition pos (*it); tmpl.createDictionary( "POSITIONS" ); tmpl.setValue( DICT("POSITIONS"), TAG( "POS_NUMBER" ) , pos.posNumber() ); tmpl.setValue( DICT("POSITIONS"), TAG("POS_TEXT"), rmlString( pos.text(), QString( "%1text" ).arg( pos.kind().toLower() ) ) ); // format the amount value of the item, do not show the precision if there is no fraction double amount = pos.amount(); h = Format::localeDoubleToString(amount, *DefaultProvider::self()->locale()); tmpl.setValue( DICT("POSITIONS"), TAG("POS_AMOUNT"), h ); tmpl.setValue( DICT("POSITIONS"), TAG("POS_UNIT"), escapeTrml2pdfXML( pos.unit() ) ); tmpl.setValue( DICT("POSITIONS"), TAG("POS_UNITPRICE"), pos.unitPrice().toLocaleString() ); tmpl.setValue( DICT("POSITIONS"), TAG("POS_TOTAL"), pos.nettoPrice().toLocaleString() ); tmpl.setValue( DICT("POSITIONS"), TAG("POS_KIND"), pos.kind().toLower() ); QString taxType; if( individualTax ) { if( pos.taxType() == 1 ) { taxFreeCnt++; taxType = "TAX_FREE"; } else if( pos.taxType() == 2 ) { reducedTaxCnt++; taxType = "REDUCED_TAX"; } else { // ATTENTION: Default for all non known tax types is full tax. fullTaxCnt++; taxType = "FULL_TAX"; } tmpl.createSubDictionary( "POSITIONS", taxType ); } /* item kind: Normal, alternative or demand item. For normal items, the kind is empty. */ if ( !pos.kind().isEmpty() ) { specialPosCnt++; } } if ( specialPosCnt ) { tmpl.createDictionary( "SPECIAL_POS" ); tmpl.setValue( DICT("SPECIAL_POS"), TAG("COUNT"), QString::number( specialPosCnt ) ); tmpl.setValue( DICT("SPECIAL_POS"), TAG("LAB_SPECIAL_ITEMS"), i18n("Please note: This offer contains %1 alternative or demand positions, printed in italic font. These do not add to the overall sum.", QString::number( specialPosCnt ) ) ); } /* * Just show the tax index if we have multiple tax settings */ if( individualTax ) { tmpl.createDictionary( "TAX_FREE_ITEMS" ); tmpl.setValue( DICT("TAX_FREE_ITEMS"), TAG("COUNT"), QString::number( taxFreeCnt )); tmpl.setValue( DICT("TAX_FREE_ITEMS"), TAG( "LAB_TAX_FREE_ITEMS"), i18n("tax free items (%1 pcs.)", QString::number( taxFreeCnt )) ); tmpl.createDictionary( "REDUCED_TAX_ITEMS" ); tmpl.setValue( DICT("REDUCED_TAX_ITEMS"), TAG("COUNT"), QString::number( reducedTaxCnt )); tmpl.setValue( DICT("REDUCED_TAX_ITEMS"), TAG("TAX"), DefaultProvider::self()->locale()->toString( archDoc->reducedTax()) ); tmpl.setValue( DICT("REDUCED_TAX_ITEMS"), TAG("LAB_TAX_REDUCED_ITEMS"), i18n("items with reduced tax of %1% (%2 pcs.)", DefaultProvider::self()->locale()->toString( archDoc->reducedTax()), QString::number( reducedTaxCnt )) ); tmpl.createDictionary( "FULL_TAX_ITEMS" ); tmpl.setValue( DICT("FULL_TAX_ITEMS"), TAG("COUNT"), QString::number( fullTaxCnt )); tmpl.setValue( DICT("FULL_TAX_ITEMS"), TAG("TAX"), DefaultProvider::self()->locale()->toString( archDoc->tax()) ); tmpl.setValue( DICT("FULL_TAX_ITEMS"), TAG("LAB_TAX_FULL_ITEMS"), i18n("No label: items with full tax of %1% (%2 pcs.)", DefaultProvider::self()->locale()->toString( archDoc->tax()), QString::number( fullTaxCnt )) ); } /* now replace stuff in the whole document */ tmpl.setValue( TAG( "DATE" ), Format::toDateString(archDoc->date(), KraftSettings::self()->dateFormat())); tmpl.setValue( TAG( "DOCTYPE" ), escapeTrml2pdfXML( archDoc->docTypeStr() ) ); tmpl.setValue( TAG( "ADDRESS" ), escapeTrml2pdfXML( archDoc->address() ) ); contactToTemplate( tmpl, "CLIENT", customerContact ); contactToTemplate( tmpl, "MY", myContact ); tmpl.setValue( TAG( "DOCID" ), escapeTrml2pdfXML( archDoc->ident() ) ); tmpl.setValue( TAG( "PROJECTLABEL" ), escapeTrml2pdfXML( archDoc->projectLabel() ) ); tmpl.setValue( TAG( "SALUT" ), escapeTrml2pdfXML( archDoc->salut() ) ); tmpl.setValue( TAG( "GOODBYE" ), escapeTrml2pdfXML( archDoc->goodbye() ) ); tmpl.setValue( TAG( "PRETEXT" ), rmlString( archDoc->preText() ) ); tmpl.setValue( TAG( "POSTTEXT" ), rmlString( archDoc->postText() ) ); tmpl.setValue( TAG( "BRUTTOSUM" ), archDoc->bruttoSum().toLocaleString() ); tmpl.setValue( TAG( "NETTOSUM" ), archDoc->nettoSum().toLocaleString() ); h = DefaultProvider::self()->locale()->toString( archDoc->tax() ); // qDebug () << "Tax in archive document: " << h; if ( archDoc->reducedTaxSum().toLong() != 0 ) { tmpl.createDictionary( DICT( "SECTION_REDUCED_TAX" ) ); tmpl.setValue( DICT("SECTION_REDUCED_TAX"), TAG( "REDUCED_TAX_SUM" ), archDoc->reducedTaxSum().toLocaleString() ); h = DefaultProvider::self()->locale()->toString( archDoc->reducedTax() ); tmpl.setValue( DICT("SECTION_REDUCED_TAX"), TAG( "REDUCED_TAX" ), h ); tmpl.setValue( DICT("SECTION_REDUCED_TAX"), TAG( "REDUCED_TAX_LABEL" ), i18n( "reduced VAT" ) ); } if ( archDoc->fullTaxSum().toLong() != 0 ) { tmpl.createDictionary( DICT( "SECTION_FULL_TAX" ) ); tmpl.setValue( DICT("SECTION_FULL_TAX"), TAG( "FULL_TAX_SUM" ), archDoc->fullTaxSum().toLocaleString() ); h = DefaultProvider::self()->locale()->toString( archDoc->tax() ); tmpl.setValue( DICT("SECTION_FULL_TAX"), TAG( "FULL_TAX" ), h ); tmpl.setValue( DICT("SECTION_FULL_TAX"), TAG( "FULL_TAX_LABEL" ), i18n( "VAT" ) ); } h = DefaultProvider::self()->locale()->toString( archDoc->tax() ); tmpl.setValue( TAG( "VAT" ), h ); tmpl.setValue( TAG( "VATSUM" ), archDoc->taxSum().toLocaleString() ); addLabelsToTemplate(tmpl); #if 0 /* this is still disabled as reportlab cannot read SVG files * When it can or the EPC QR Code can be generated as PNG, this needs to be added * to the template: * * {{#EPC_QR_CODE}} *
              * * * * {{/EPC_QR_CODE}} */ QString qrcodefile; if (archDoc->isInvoice()) { qrcodefile = generateEPCQRCodeFile(archDoc); _tmpFiles.append(qrcodefile); tmpl.createDictionary( DICT( "EPC_QR_CODE" ) ); tmpl.setValue( DICT("EPC_QR_CODE"), TAG( "SVG_FILE_NAME" ), qrcodefile); } #endif // finalize the template const QString output = tmpl.expand(); return output; } // ================================================================================== GrantleeDocumentTemplate::GrantleeDocumentTemplate(const QString& tmplFile) : DocumentTemplate(tmplFile) { } const QString GrantleeDocumentTemplate::expand( ArchDoc *archDoc, const KContacts::Addressee &myContact, const KContacts::Addressee &customerContact) { Grantlee::registerMetaType(); Grantlee::registerMetaType(); QFileInfo fi(_tmplFile); if (!fi.exists()) { _errorStr = i18n("Template to convert is not existing!"); } if (!fi.isReadable()) { _errorStr = i18n("Can not read template file!"); } QString rendered; if (_errorStr.isEmpty()) { GrantleeFileTemplate gtmpl(_tmplFile); gtmpl.addToObjMapping("doc", archDoc); const auto mtt = contactToVariantHash(myContact); gtmpl.addToMappingHash(QStringLiteral("me"), mtt); const auto cct = contactToVariantHash(customerContact); gtmpl.addToMappingHash(QStringLiteral("customer"), cct); const QVariantHash labelHash = labelVariantHash(); gtmpl.addToMappingHash(QStringLiteral("label"), labelHash); // -- save the EPC QR Code which is written into a temp file QVariantHash epcHash; auto qrcodefile = generateEPCQRCodeFile(archDoc); epcHash.insert("valid", false); epcHash.insert("show", false); if (qrcodefile.isEmpty()) { qDebug() << "No Giro Code file available."; } else { _tmpFiles.append(qrcodefile); // remember file to delete later. qDebug() << "Generated Giro Code file" << qrcodefile; epcHash.insert("svgfilename", QVariant(qrcodefile)); epcHash["valid"] = true; epcHash["show"] = true; // there is a setting value of the maximum sum the EPC Code should // be printed on the document. The idea is that for very big sums, // the QR code should not be displayed. double maxEPCSum = KraftSettings::self()->displayEPCCodeMaxSum(); if (archDoc->bruttoSum().toDouble() > maxEPCSum) { epcHash["show"] = false; } gtmpl.addToMappingHash(QStringLiteral("epcqrcode"), epcHash); } const QVariantHash kraftHash = kraftVariantHash(); gtmpl.addToMappingHash(QStringLiteral("kraft"), kraftHash); bool ok; rendered = gtmpl.render(ok); if (!ok) { _errorStr = rendered; rendered.clear(); } } return rendered; } kraft-1.2.2/src/documenttemplate.h000066400000000000000000000051401467704360200171460ustar00rootroot00000000000000/*************************************************************************** Template for Kraft Documents - Grantlee and ctemplate ------------------- begin : March 2020 copyright : (C) 2020 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef DOCUMENTTEMPLATE_H #define DOCUMENTTEMPLATE_H #include #include "archdoc.h" class DocumentTemplate { public: DocumentTemplate( const QString& tmplFile ); virtual ~DocumentTemplate(){ }; virtual const QString expand(ArchDoc *archDoc, const KContacts::Addressee &myContact, const KContacts::Addressee &customerContact) = 0; QString error() const { return _errorStr; } // The collection of temp files this process created, to be able to delete // them later when the PDF was created. // Example: The EPC QR Code SVG image. QStringList tempFilesCreated() { return _tmpFiles; } protected: QString _tmplFile; QString _errorStr; QStringList _tmpFiles; }; // ================================================================================== class CTemplateDocumentTemplate : public DocumentTemplate { public: CTemplateDocumentTemplate(const QString& tmplFile); const QString expand(ArchDoc *archDoc, const KContacts::Addressee &myContact, const KContacts::Addressee &customerContact) override; }; // ================================================================================== class GrantleeDocumentTemplate : public DocumentTemplate { public: GrantleeDocumentTemplate(const QString& tmplFile); const QString expand(ArchDoc *archDoc, const KContacts::Addressee &myContact, const KContacts::Addressee &customerContact) override; }; #endif // DOCUMENTTEMPLATE_H kraft-1.2.2/src/einheit.cpp000066400000000000000000000037111467704360200155560ustar00rootroot00000000000000/*************************************************************************** einheit.cpp - ------------------- begin : Don Jan 1 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "einheit.h" Einheit::Einheit() :m_dbId(-1) { } Einheit::Einheit(int id, const QString& einh, const QString& einhLong, const QString& einhPlu, const QString& einhPluLong, const QString &ec20) : m_dbId(id) { m_einheitSingular = einh; m_einheitPlural = einhPlu; m_einheitSingularLong = einhLong; m_einheitPluralLong = einhPluLong; m_ec20 = ec20; } Einheit::Einheit( int id ) : m_dbId(id) { // Ask the Unitmanager here. } Einheit::Einheit( const QString& einhText ) { m_einheitSingular = einhText; m_einheitPlural = einhText; m_einheitSingularLong = einhText; m_einheitPluralLong = einhText; } Einheit::~Einheit(){ } QString Einheit::einheit( int anz ) const { if( anz == 1 ) return einheitSingular(); else return einheitPlural(); } QString Einheit::einheit( double anz ) const { if( anz == 1.0 ) return einheitSingular(); else return einheitPlural(); } kraft-1.2.2/src/einheit.h000066400000000000000000000037351467704360200152310ustar00rootroot00000000000000/*************************************************************************** einheit.h - ------------------- begin : Don Jan 1 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef EINHEIT_H #define EINHEIT_H #include #include #include "kraftcat_export.h" /** *@author Klaas Freitag */ class KRAFTCAT_EXPORT Einheit { public: typedef QList List; Einheit(); Einheit( int id ); Einheit( const QString& ); // Einheit with arbitrary text. Einheit( int id, const QString&, const QString&, const QString&, const QString&, const QString& ); ~Einheit(); QString einheitSingular() const { return m_einheitSingular; } QString einheitSingularLong() const { return m_einheitSingularLong; } QString einheitPlural() const { return m_einheitPlural; } QString einheitPluralLong() const { return m_einheitPluralLong; } QString ec20() const { return m_ec20; } QString einheit( int anz ) const; QString einheit( double anz ) const; int id() { return m_dbId; } private: int m_dbId; QString m_einheitSingular; QString m_einheitPlural; QString m_einheitSingularLong; QString m_einheitPluralLong; QString m_ec20; }; #endif kraft-1.2.2/src/epcqrcode.cpp000066400000000000000000000077211467704360200161030ustar00rootroot00000000000000/*************************************************************************** EPC QR Code generator --------------------- begin : August 2022 copyright : (C) 2022 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include #include #include #include "epcqrcode.h" #include "geld.h" #include <3rdparty/qrcodegen.hpp> #include #include using namespace qrcodegen; /* * Based on this code: https://www.nayuki.io/page/qr-code-generator-library */ namespace { // Returns a string of SVG code for an image depicting the given QR Code, with the given number // of border modules. The string always uses Unix newlines (\n), regardless of the platform. std::string toSvgString(const QrCode &qr, int border) { if (border < 0) throw std::domain_error("Border must be non-negative"); if (border > INT_MAX / 2 || border * 2 > INT_MAX - qr.getSize()) throw std::overflow_error("Border too large"); std::ostringstream sb; sb << "\n"; sb << "\n"; sb << "\n"; sb << "\t\n"; sb << "\t\n"; sb << "\n"; return sb.str(); } } EPCQRCode::EPCQRCode() { } QByteArray EPCQRCode::asText(const Geld& g, const QString& bacName, const QString& bacBIC, const QString& bacIBAN, const QString& reason) { QByteArray re; double sum = g.toDouble(); if ( bacName.isEmpty() || bacIBAN.isEmpty() || sum < 0.1) { qDebug() << "Unable to generate EPC Code - insufficient bank account data."; return re; } re.append("BCD\n" "001\n" "1\n" "SCT\n"); re.append(bacBIC.toLocal8Bit()); re.append("\n"); re.append(bacName.toLocal8Bit()); re.append("\n"); re.append(bacIBAN.toLocal8Bit()); re.append("\n"); const QString money = QString("EUR%1").arg(QString::number(sum, 'f', 2)); re.append(money.toLocal8Bit()); re.append("\n\n\n"); re.append(reason.toLocal8Bit()); return re; } QString EPCQRCode::asSvg(const Geld& g, const QString &bacName, const QString &bacBIC, const QString &bacIBAN, const QString &reason) { int border = 2; QString svg; QByteArray arr = asText(g, bacName, bacBIC, bacIBAN, reason); if (!arr.isEmpty()) { QrCode qr0 = QrCode::encodeText(arr.data(), QrCode::Ecc::MEDIUM); svg = QString::fromStdString(toSvgString(qr0, border)); } return svg; } kraft-1.2.2/src/epcqrcode.h000066400000000000000000000033501467704360200155420ustar00rootroot00000000000000/*************************************************************************** EPC QR Code generator --------------------- begin : August 2022 copyright : (C) 2022 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef EPCQRCODE_H #define EPCQRCODE_H #include "kcontacts/addressee.h" #include #include class Geld; class EPCQRCode { public: EPCQRCode(); QByteArray asText(const Geld& g, const QString &bacName, const QString &bacBIC, const QString &bacIBAN, const QString &reason); QString asSvg(const Geld& g, const QString &bacName, const QString &bacBIC, const QString &bacIBAN, const QString &reason); // QPixmap asPng(const Geld& g, const QString &bacName, const QString &bacBIC, const QString &bacIBAN, const QString &reason, const QSize& s); private: KContacts::Addressee _contact; const QString _App {"KAddressbook"}; const QString _IBAN {"IBAN"}; const QString _BIC {"BIC"}; }; #endif // EPCQRCODE_H kraft-1.2.2/src/exportxrechnung.cpp000066400000000000000000000122451467704360200173760ustar00rootroot00000000000000/*************************************************************************** exporterXRechnung - Save Documents as XRechnung ------------------- begin : Feb. 2022 copyright : (C) 2022 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ // include files for Qt #include #include #include "exportxrechnung.h" #include "archdoc.h" #include "documentman.h" #include "docposition.h" #include "kraftdoc.h" #include "kraftdb.h" #include "unitmanager.h" #include "dbids.h" #include "kraftsettings.h" #include "doctype.h" #include "defaultprovider.h" #include "format.h" #include "addressprovider.h" #include "grantleetemplate.h" #include "documenttemplate.h" namespace { QString xRechnungTemplate() { DocType dt("Rechnung"); // FIXME hardcoded const QString re = dt.xRechnungTemplate(); return re; } } ExporterXRechnung::ExporterXRechnung(QObject *parent) : QObject(parent), _validateWithSchema {false} { mAddressProvider = new AddressProvider(this); connect(mAddressProvider, &AddressProvider::lookupResult, this, &ExporterXRechnung::slotAddresseeFound); } void ExporterXRechnung::setDueDate(const QDate& d) { _dueDate = d; } void ExporterXRechnung::setBuyerRef(const QString& br) { _buyerRef = br; } QString ExporterXRechnung::templateFile() const { return xRechnungTemplate(); } bool ExporterXRechnung::exportDocument(const ArchDocDigest& digest) { _archDoc.loadFromDb(digest.archDocId()); _archDoc.setDueDate(_dueDate); _archDoc.setBuyerRef(_buyerRef); if (xRechnungTemplate().isEmpty()) { qDebug () << "tmplFile is empty, exit reportgenerator!"; return false; } lookupCustomerAddress(); return true; } void ExporterXRechnung::lookupCustomerAddress() { const QString clientUid = _archDoc.clientUid(); _customerContact = KContacts::Addressee(); if( ! clientUid.isEmpty() ) { AddressProvider::LookupState state = mAddressProvider->lookupAddressee( clientUid ); switch( state ) { case AddressProvider::LookupFromCache: _customerContact = mAddressProvider->getAddresseeFromCache(clientUid); break; case AddressProvider::LookupNotFound: case AddressProvider::ItemError: case AddressProvider::BackendError: // set an empty contact break; case AddressProvider::LookupOngoing: case AddressProvider::LookupStarted: // Not much to do, just wait and let the addressprovider // hit the slotAddresseFound return; } } QTimer::singleShot(0, this, &ExporterXRechnung::slotSkipLookup); } void ExporterXRechnung::slotSkipLookup() { slotAddresseeFound(QString(), _customerContact); } void ExporterXRechnung::slotAddresseeFound(const QString& uid, const KContacts::Addressee& contact) { KContacts::Addressee myContact; // leave empty for now // now the three pillars archDoc, myContact and mCustomerContact are defined. QScopedPointer templateEngine; const QString tmplFile = xRechnungTemplate(); if (tmplFile.isEmpty()) { qDebug() << "Empty template file -> exit!"; } else { qDebug() << "Using this XRechnung Template:" << tmplFile; } templateEngine.reset(new GrantleeDocumentTemplate(tmplFile)); // expand the template... const QString expanded = templateEngine->expand(&_archDoc, myContact, contact); if (expanded.isEmpty()) { // emit failure(i18n("The template expansion failed.")); qDebug() << "Expansion failed, empty result"; return; } QTemporaryFile tempFile("/tmp/xrech_XXXXXX"); tempFile.setAutoRemove(false); if (tempFile.open()) { const QString fName = tempFile.fileName(); qDebug() << "########## XRechnung written to" << fName; QTextStream outStream(&tempFile); outStream << expanded; tempFile.close(); emit xRechnungTmpFile(fName); #if 0 if (_validateWithSchema && _schema.isValid()) { QFile file(fName); file.open(QIODevice::ReadOnly); QXmlSchemaValidator validator(_schema); if (validator.validate(&file, QUrl::fromLocalFile(file.fileName()))) qDebug() << "instance document is valid"; else qDebug() << "instance document is invalid"; } #endif } } ExporterXRechnung::~ExporterXRechnung( ) { } /* END */ kraft-1.2.2/src/exportxrechnung.h000066400000000000000000000043071467704360200170430ustar00rootroot00000000000000/*************************************************************************** exporterXRechnung - Save Documents as XRechnung ------------------- begin : Feb. 2022 copyright : (C) 2022 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef _EXPORTERXRECHNUNG_H #define _EXPORTERXRECHNUNG_H #include #include #include #include "addressprovider.h" #include "archdoc.h" class QSqlRecord; class dbID; class QString; class ArchDoc; class ExporterXRechnung : public QObject { Q_OBJECT signals: /** * @brief xRechnungTmpFile * emits the file name of a temporary file that is the XRechnung result file. * Needs to be deleted after copied to the right target file. */ void xRechnungTmpFile(const QString&); public: ExporterXRechnung(QObject *parent = nullptr); virtual ~ExporterXRechnung(); virtual bool exportDocument(const ArchDocDigest& digest); QString templateFile() const; void setDueDate(const QDate&); void setBuyerRef(const QString&); protected: void lookupCustomerAddress(); protected slots: void slotAddresseeFound(const QString &uid = QString(), const KContacts::Addressee &contact = KContacts::Addressee()); void slotSkipLookup(); private: ArchDoc _archDoc; bool _validateWithSchema; AddressProvider *mAddressProvider; KContacts::Addressee _customerContact; QString _buyerRef; QDate _dueDate; }; #endif /* END */ kraft-1.2.2/src/extractrc000077500000000000000000000347661467704360200153700ustar00rootroot00000000000000#! /usr/bin/env perl ### TODO: other copyrights, license? # Copyright (c) 2004 Richard Evans sub usage { warn <<"EOF"; extractrc [flags] filenames This script extracts messages from designer (.ui) and XMLGUI (.rc) files and writes on standard output (usually redirected to rc.cpp) the equivalent i18n() calls so that xgettext can parse them. --tag=name : Also extract the tag name(s). Repeat the flag to specify multiple names: --tag=tag_one --tag=tag_two --tag-group=group : Use a group of tags - uses 'default' if omitted. Valid groups are: @{[TAG_GROUPS()]} --context=name : Give i18n calls a context name: i18nc("name", …) --lines : Include source line numbers in comments (deprecated, it is switched on by default now) --cstart=chars : Start of to-EOL style comments in output, defaults to // --language=lang : Create i18n calls appropriate for KDE bindings in the given language. Currently known languages: C++ (default), Python --ignore-no-input : Do not warn if there were no filenames specified --help|? : Display this summary --no-unescape-xml : Don't do xml unescaping EOF exit; } ########################################################################################### use strict; use warnings; use Getopt::Long; use Data::Dumper; use constant TAG_GROUP => { default => "[tT][eE][xX][tT]|title|string|whatsthis|tooltip|label", koffice => "Example|GroupName|Text|Comment|Syntax|TypeName", none => "", }; use constant TAG_GROUPS => join ", ", map "'$_'", sort keys %{&TAG_GROUP}; # Specification to extract nice element-context for strings. use constant ECTX_SPEC => { # Data structure: extension => {tag => [ctxlevel, [attribute, ...]], ...} # Order of attributes determines their order in the extracted comment. "ui" => { "widget" => [10, ["class", "name"]], "item" => [15, []], "property" => [20, ["name"]], "attribute" => [20, ["name"]], }, "rc" => { "Menu" => [10, ["name"]], "ToolBar" => [10, ["name"]], }, "kcfg" => { "group" => [10, ["name"]], "entry" => [20, ["name"]], "whatsthis" => [30, []], "tooltip" => [30, []], "label" => [30, []], }, }; # Specification to exclude strings by trailing section of element-context. use constant ECTX_EXCLUDE => [ # Data structure: [[tag, attribute, attrvalue], [...]] # Empty ("") attribute means all elements with given tag, # empty attrvalue means element with given tag and attribute of any value. [["widget", "class", "KFontComboBox"], ["item", "", ""], ["property", "", ""]], [["widget", "class", "KPushButton"], ["attribute", "name", "buttonGroup"]], [["widget", "class", "QRadioButton"], ["attribute", "name", "buttonGroup"]], [["widget", "class", "QToolButton"], ["attribute", "name", "buttonGroup"]], [["widget", "class", "QCheckBox"], ["attribute", "name", "buttonGroup"]], [["widget", "class", "QPushButton"], ["attribute", "name", "buttonGroup"]], [["widget", "class", "KTimeZoneWidget"], ["property", "name", "text"]], ]; # The parts between the tags of the extensions will be copied verbatim # Same data structure as in ECTX_EXCLUDE, but per extension. my %EXTENSION_VERBATIM_TAGS = ( "kcfg" => [["code", "", ""], ["default", "code", "true"], ["min", "code", "true"], ["max", "code", "true"]], ); # Add attribute lists as hashes, for membership checks. for my $ext ( keys %{&ECTX_SPEC} ) { for my $tag ( keys %{ECTX_SPEC->{$ext}} ) { my $arr = ECTX_SPEC->{$ext}{$tag}[1]; ECTX_SPEC->{$ext}{$tag}[2] = {map {$_ => 1} @{$arr}}; } } ########################################################################################### # Add options here as necessary - perldoc Getopt::Long for details on GetOptions GetOptions ( "tag=s" => \my @opt_extra_tags, "tag-group=s" => \my $opt_tag_group, "context=s" => \my $opt_context, # I18N context "lines" => \my $opt_lines, "cstart=s" => \my $opt_cstart, "language=s" => \my $opt_language, "ignore-no-input" => \my $opt_ignore_no_input, "no-unescape-xml" => \my $opt_no_unescape_xml, "help|?" => \&usage ); unless( @ARGV ) { warn "No filename specified" unless $opt_ignore_no_input; exit; } $opt_tag_group ||= "default"; die "Unknown tag group: '$opt_tag_group', should be one of " . TAG_GROUPS unless exists TAG_GROUP->{$opt_tag_group}; my $tags = TAG_GROUP->{$opt_tag_group}; my $extra_tags = join "", map "|" . quotemeta, @opt_extra_tags; my $text_string = qr/($tags$extra_tags)( [^>]*)?>/; # Precompile regexp my $cstart = $opt_cstart; # no default, selected by language if not given my $language = $opt_language || "C++"; my $ectx_known_exts = join "|", keys %{&ECTX_SPEC}; ########################################################################################### # Unescape basic XML entities. sub unescape_xml ($) { my $text = shift; if (not $opt_no_unescape_xml) { $text =~ s/<//g; $text =~ s/&/&/g; $text =~ s/"/"/g; } return $text; } # Convert uic to C escaping. sub escape_uic_to_c ($) { my $text = shift; $text = unescape_xml($text); $text =~ s/\\/\\\\/g; # escape \ $text =~ s/\"/\\\"/g; # escape " $text =~ s/\r//g; # remove CR (Carriage Return) $text =~ s/\n/\\n\"\n\"/g; # escape LF (Line Feed). uic also change the code line at a LF, we do not do that. return $text; } ########################################################################################### sub dummy_call_infix { my ($cstart, $stend, $ctxt, $text, @cmnts) = @_; for my $cmnt (@cmnts) { print qq|$cstart $cmnt\n|; } if (defined $text) { $text = escape_uic_to_c($text); if (defined $ctxt) { $ctxt = escape_uic_to_c($ctxt); print qq|i18nc("$ctxt", "$text")$stend\n|; } else { print qq|i18n("$text")$stend\n|; } } } my %dummy_calls = ( "C++" => sub { dummy_call_infix($cstart || "//", ";", @_); }, "Python" => sub { dummy_call_infix($cstart || "#", "", @_); }, ); die "unknown language '$language'" if not defined $dummy_calls{$language}; my $dummy_call = $dummy_calls{$language}; # Program start proper - NB $. is the current line number for my $file_name ( @ARGV ) { my $fh; unless ( open $fh, "<", $file_name ) { # warn "Failed to open: '$file_name': $!"; next; } # Ready element-context extraction. my $ectx_ext; my $ectx_string; if ( $file_name =~ /\.($ectx_known_exts)(\.(in|cmake))?$/ ) { $ectx_ext = $1; my $ectx_tag_gr = join "|", keys %{ECTX_SPEC->{$ectx_ext}}; $ectx_string = qr/($ectx_tag_gr)( [^>]*)?>/; # precompile regexp } my $string = ""; my $origstring = ""; my $in_text = 0; my $start_line_no = 0; my $in_skipped_prop = 0; my $tag = ""; my $attr = ""; my $context = ""; my $notr = ""; # Element-context data: [[level, tag, [[attribute, value], ...]], ...] # such that subarrays are ordered increasing by level. my @ectx = (); # All comments to pending dummy call. my @comments = (); while ( <$fh> ) { if ( $. == 1 and $_ !~ /^(?:{$ectx_ext}{$tag} ) { my @atts; for my $ectx_att ( @{ECTX_SPEC->{$ectx_ext}{$tag}[1]} ) { if ( $attr and $attr =~ /\b$ectx_att\s*=\s*(["'])([^"']*?)\1/ ) { my $aval = $2; push @atts, [$ectx_att, $aval]; } } # Kill all tags in element-context with level higer or equal to this, # and add it to the end. my $clevel = ECTX_SPEC->{$ectx_ext}{$tag}[0]; for ( my $i = 0; $i < @ectx; ++$i ) { if ( $clevel <= $ectx[$i][0] ) { @ectx = @ectx[0 .. ($i - 1)]; last; } } push @ectx, [$clevel, $tag, [@atts]]; } if ( ($tag, $attr) = $string =~ /<$text_string/o ) { my ($attr_comment) = $attr =~ /\bcomment=\"([^\"]*)\"/ if $attr; $context = $attr_comment if $attr_comment; my ($attr_context) = $attr =~ /\bcontext=\"([^\"]*)\"/ if $attr; $context = $attr_context if $attr_context; # It is unlikely that both attributes 'context' and 'comment' # will be present, but if so happens, 'context' has priority. my ($attr_extracomment) = $attr =~ /\bextracomment=\"([^\"]*)\"/ if $attr; push @comments, "i18n: $attr_extracomment" if $attr_extracomment; my ($attr_notr) = $attr =~ /\bnotr=\"([^\"]*)\"/ if $attr; $notr = $attr_notr if $attr_notr; my $nongreedystring = $string; $string =~ s/^.*<$text_string//so; $nongreedystring =~ s/^.*?<$text_string//so; if ($string cmp $nongreedystring) { print STDERR "Warning: Line $origstring in file $file_name has more than one tag to extract on the same line, that is not supported by extractrc\n"; } if ( not $attr or $attr !~ /\/ *$/ ) { $in_text = 1; $start_line_no = $.; } } else { @comments = (); $string = ""; } } next unless $in_text; next unless $string =~ /<\/$text_string/o; my $text = $string; $text =~ s/<\/$text_string.*$//o; if ( $text cmp "" ) { # See if the string should be excluded by trailing element-context. my $exclude_by_ectx = 0; my @rev_ectx = reverse @ectx; for my $ectx_tail (@{&ECTX_EXCLUDE}) { my @rev_ectx_tail = reverse @{$ectx_tail}; my $i = 0; $exclude_by_ectx = (@rev_ectx > 0 and @rev_ectx_tail > 0); while ($i < @rev_ectx and $i < @rev_ectx_tail) { my ($tag, $attr, $aval) = @{$rev_ectx_tail[$i]}; $exclude_by_ectx = (not $tag or ($tag eq $rev_ectx[$i][1])); if ($exclude_by_ectx and $attr) { $exclude_by_ectx = 0; for my $ectx_attr_aval (@{$rev_ectx[$i][2]}) { if ($attr eq $ectx_attr_aval->[0]) { $exclude_by_ectx = $aval ? $aval eq $ectx_attr_aval->[1] : 1; last; } } } last if not $exclude_by_ectx; ++$i; } last if $exclude_by_ectx; } if (($context and $context eq "KDE::DoNotExtract") or ($notr eq "true")) { push @comments, "Manually excluded message at $file_name line $."; } elsif ( $exclude_by_ectx ) { push @comments, "Automatically excluded message at $file_name line $."; } else { (my $norm_fname = $file_name) =~ s/^\.\///; push @comments, "i18n: file: $norm_fname:$."; if ( @ectx ) { # Format element-context. my @tag_gr; for my $tgr (reverse @ectx) { my @attr_gr; for my $agr ( @{$tgr->[2]} ) { #push @attr_gr, "$agr->[0]=$agr->[1]"; push @attr_gr, "$agr->[1]"; # no real nead for attribute name } my $attr = join(", ", @attr_gr); push @tag_gr, "$tgr->[1] ($attr)" if $attr; push @tag_gr, "$tgr->[1]" if not $attr; } my $ectx_str = join ", ", @tag_gr; push @comments, "i18n: ectx: $ectx_str"; } push @comments, "xgettext: no-c-format" if $text =~ /%/o; $dummy_call->($context, $text, @comments); @comments = (); } } else { push @comments, "Skipped empty message at $file_name line $."; } $string =~ s/^.*<\/$text_string//o; $in_text = 0; # Text can be multiline in .ui files (possibly), but we warn about it in XMLGUI .rc files. warn "there is floating in: '$file_name'" if $. != $start_line_no and $file_name =~ /\.rc$/i; } close $fh or warn "Failed to close: '$file_name': $!"; die "parsing error in $file_name" if $in_text; if ($ectx_ext && exists $EXTENSION_VERBATIM_TAGS{$ectx_ext}) { unless ( open $fh, "<", $file_name ) { # warn "Failed to open: '$file_name': $!"; next; } while ( <$fh> ) { chomp; $string .= "\n" . $_; for my $elspec (@{ $EXTENSION_VERBATIM_TAGS{$ectx_ext} }) { my ($tag, $attr, $aval) = @{$elspec}; my $rx; if ($attr and $aval) { $rx = qr/<$tag[^<]*$attr=["']$aval["'][^<]*>(.*)<\/$tag>/s } elsif ($attr) { $rx = qr/<$tag[^<]*$attr=[^<]*>(.*)<\/$tag>/s } else { $rx = qr/<$tag>(.*)<\/$tag>/s } if ($string =~ $rx) { # Add comment before any line that has an i18n substring in it. my @matched = split /\n/, $1; my $mlno = $.; (my $norm_fname = $file_name) =~ s/^\.\///; for my $mline (@matched) { # Assume verbatim code is in language given by --language. # Therefore format only comment, and write code line as-is. if ($mline =~ /i18n/) { $dummy_call->(undef, undef, ("i18n: file: $norm_fname:$mlno")); } $mline = unescape_xml($mline); print "$mline\n"; ++$mlno; } $string = ""; } } } close $fh or warn "Failed to close: '$file_name': $!"; } } kraft-1.2.2/src/filelicense.txt000066400000000000000000000017401467704360200164500ustar00rootroot00000000000000/*************************************************************************** - ------------------- begin : Son Nov 11 2010 copyright : (C) 2010 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ kraft-1.2.2/src/filterheader.cpp000066400000000000000000000064451467704360200165760ustar00rootroot00000000000000/*************************************************************************** filterheader.cpp ------------------- copyright : (C) 2005 by Cornelius Schumacher (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "filterheader.h" #include #include #include #include #include #include #include #include #include #include #include FilterHeader::FilterHeader(QWidget *parent , QTreeWidget *listView) : QWidget( parent ), _treeWidget(listView) { QBoxLayout *filterLayout = new QHBoxLayout; setLayout(filterLayout); QLabel *label = new QLabel( i18n("&Search:")); filterLayout->addWidget( label ); mSearchLine = new QLineEdit( this ); mSearchLine->setClearButtonEnabled(true); label->setBuddy(mSearchLine); connect( mSearchLine, SIGNAL(textChanged(QString) ), SLOT( slotTextChanged(QString) ) ); filterLayout->addWidget( mSearchLine ); } void FilterHeader::slotTextChanged( const QString& filter ) { if( ! _treeWidget ) { return; } QTreeWidgetItemIterator it(_treeWidget); while (*it) { // items without parent are root items. Never hide. QTreeWidgetItem *item = (*it); if( item->parent() ) { bool showIt = false; for(int i = 0; !showIt && i < item->columnCount(); i++) { if( item->text(i).contains(filter, Qt::CaseInsensitive)) { showIt = true; } } item->setHidden(!showIt); if( showIt && ! filter.isEmpty() ) { // Make sure that all the parent items are visible too QTreeWidgetItem *parent = nullptr, *child = item; while((parent = child->parent()) != nullptr) { parent->setHidden(false); if( !parent->isExpanded() ) { parent->setExpanded(true); _openedItems[parent] = 1; } child = parent; } } if (filter.isEmpty()) { for( auto item : _openedItems.uniqueKeys()) { item->setExpanded(false); } _openedItems.clear(); } } ++it; } } void FilterHeader::setListView( QTreeWidget* view ) { _treeWidget = view; } void FilterHeader::clear() { mSearchLine->clear(); } kraft-1.2.2/src/filterheader.h000066400000000000000000000031711467704360200162340ustar00rootroot00000000000000/*************************************************************************** filterheader.h ------------------- copyright : (C) 2005 by Cornelius Schumacher (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef FILTERHEADER_H #define FILTERHEADER_H #include #include #include #include "kraftcat_export.h" class QTreeWidget; class QLabel; class QString; class KRAFTCAT_EXPORT FilterHeader : public QWidget { Q_OBJECT public: FilterHeader(QWidget *parent = 0, QTreeWidget *tree = 0); public slots: void clear(); void setListView( QTreeWidget* ); private slots: void slotTextChanged( const QString& filter ); private: QLineEdit *mSearchLine; QLabel *mTitleLabel; QTreeWidget *_treeWidget; QHash _openedItems; }; #endif kraft-1.2.2/src/fixcalcdialog.cpp000066400000000000000000000045251467704360200167260ustar00rootroot00000000000000/*************************************************************************** zeitcalcdialog - ------------------- begin : 2004-23-09 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include // include files for KDE #include #include "fixcalcdialog.h" #include "fixcalcpart.h" #include "stdsatzman.h" #include "defaultprovider.h" FixCalcDialog::FixCalcDialog(QWidget *parent) :CalcDialogBase(parent), _fixWidget(new Ui_calcdetailFix), m_part(0) { setWindowTitle( i18n("Calculation Fix Item")); _fixWidget->setupUi(_centralWidget); _fixWidget->m_inpPreis->setSuffix( DefaultProvider::self()->currencySymbol() ); } void FixCalcDialog::setCalcPart( FixCalcPart *cp ) { if( ! cp ) return; m_part = cp; _fixWidget->m_nameEdit->setText( cp->getName()); _fixWidget->m_inpMenge->setValue( cp->getMenge()); _fixWidget->m_inpPreis->setValue(cp->unitPreis().toDouble()); } void FixCalcDialog::accept() { if( m_part ) { m_part->setMenge( _fixWidget->m_inpMenge->value() ); m_part->setName( _fixWidget->m_nameEdit->text()); m_part->setUnitPreis(Geld(_fixWidget->m_inpPreis->value())); } if( m_part && m_part->isDirty() ) { emit fixCalcPartChanged(m_part); } CalcDialogBase::accept(); } QString FixCalcDialog::getName() { return _fixWidget->m_nameEdit->text(); } double FixCalcDialog::getMenge() { return _fixWidget->m_inpMenge->value(); } double FixCalcDialog::getPreis() { return _fixWidget->m_inpPreis->value(); } /* END */ kraft-1.2.2/src/fixcalcdialog.h000066400000000000000000000030561467704360200163710ustar00rootroot00000000000000/*************************************************************************** fixcalcdialog - ------------------- begin : 2004-23-09 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _FIXCALCDIALOG_H #define _FIXCALCDIALOG_H #include #include "calcdialogbase.h" #include "ui_fixpartui.h" // designer file zeitpartui.ui /** * */ class FixCalcPart; class FixCalcDialog : public CalcDialogBase { Q_OBJECT public: FixCalcDialog(QWidget *parent=0); QString getName(); double getMenge(); double getPreis(); void setCalcPart( FixCalcPart* ); signals: void fixCalcPartChanged(FixCalcPart*); protected slots: void accept(); private: Ui_calcdetailFix *_fixWidget; FixCalcPart *m_part; }; #endif /* END */ kraft-1.2.2/src/fixcalcpart.cpp000066400000000000000000000034051467704360200164310ustar00rootroot00000000000000/*************************************************************************** fixcalcpart.cpp - ------------------- begin : Don Jan 1 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "fixcalcpart.h" FixCalcPart::FixCalcPart() :CalcPart(), m_amount( 0 ) { } FixCalcPart::FixCalcPart(QString name, Geld preis, int prozent ) : CalcPart(name, prozent), m_fixPreis(preis), m_amount(1.0) { // setProzentPlus(prozent); } void FixCalcPart::setMenge( double val ) { if( val != m_amount ) { m_amount = val; setDirty(true); } } QString FixCalcPart::getType() const { return KALKPART_FIX; } Geld FixCalcPart::unitPreis() { return m_fixPreis; } void FixCalcPart::setUnitPreis( Geld g ) { if( g != m_fixPreis ) { m_fixPreis = g; setDirty(true); } } FixCalcPart::~FixCalcPart() { } Geld FixCalcPart::basisKosten() { Geld g = m_fixPreis; g = (Geld) m_fixPreis*m_amount; return g; } kraft-1.2.2/src/fixcalcpart.h000066400000000000000000000031521467704360200160750ustar00rootroot00000000000000/*************************************************************************** fixcalcpart.h - ------------------- begin : Don Jan 1 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef FIXCALCPART_H #define FIXCALCPART_H #include "calcpart.h" /**Implementiert einen fixen Betrag pro kalkulierter Einheit. *@author Klaas Freitag */ class FixCalcPart : public CalcPart { public: FixCalcPart(); FixCalcPart( QString name, Geld preis, int prozent = 0); ~FixCalcPart(); virtual Geld basisKosten(); /* der Preis fr eine Einheit */ Geld unitPreis(); void setUnitPreis( Geld ); void setMenge(double); double getMenge() const { return m_amount; } QString getType() const; private: // Private attributes /** */ Geld m_fixPreis; double m_amount; }; #endif kraft-1.2.2/src/fixpartui.ui000066400000000000000000000075011467704360200160000ustar00rootroot00000000000000 calcdetailFix 0 0 321 137 Calculation Parts Fix <h1>Fix Cost Parts</h1> false Add a fix cost for one unit of the template: Qt::AlignVCenter false &Label: false m_nameEdit describing text amortisation &Amount: false m_inpMenge amount multiplier 99999.000000000000000 1.000000000000000 at &Price: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false m_inpPreis Price for one piece 99999.000000000000000 10.000000000000000 999999 m_nameEdit m_inpMenge m_inpPreis kraft-1.2.2/src/floskel.cpp000066400000000000000000000020601467704360200155640ustar00rootroot00000000000000/*************************************************************************** floskel.cpp - ------------------- begin : Mit Dez 31 2003 copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "floskel.h" Floskel::Floskel(){ } Floskel::~Floskel(){ } kraft-1.2.2/src/floskel.h000066400000000000000000000023611467704360200152350ustar00rootroot00000000000000/*************************************************************************** floskel.h - ------------------- begin : Mit Dez 31 2003 copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef FLOSKEL_H #define FLOSKEL_H #include #include "kraftglobals.h" #include "einheit.h" /** *@author Klaas Freitag */ class Floskel { public: Floskel(); ~Floskel(); private: QString text; Einheit einheit; }; #endif kraft-1.2.2/src/floskeltemplate.cpp000066400000000000000000000274771467704360200173430ustar00rootroot00000000000000/*************************************************************************** floskeltemplate.cpp - ------------------- begin : Don Jan 1 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include "kraftdb.h" #include "templatesaverbase.h" #include "templatesaverdb.h" #include "floskeltemplate.h" #include "unitmanager.h" #include "calcpart.h" #include "materialcalcpart.h" #include "fixcalcpart.h" #include "timecalcpart.h" #include "stockmaterial.h" FloskelTemplate::FloskelTemplate() : CatalogTemplate(), mTemplId(-1), m_chapter(0), mTimeAdd(true), m_listViewItem(0), m_saver(0) { m_calcType = Calculation; } FloskelTemplate::FloskelTemplate( int tID, const QString& text, int einheit, int chapter, int calcKind ) : CatalogTemplate(), mTemplId(tID), m_chapter(chapter), mTimeAdd(true), m_preis(long(0)), m_listViewItem(0), m_saver(0) { if( calcKind == 1 ) { setCalculationType( ManualPrice ); } else if( calcKind == 2 ) { setCalculationType( Calculation ); } else if ( calcKind == 3 ) { setCalculationType( AutoCalc ); } setText( text ); this->setUnitId(einheit); setChapterId( dbID(chapter), false ); } FloskelTemplate::FloskelTemplate( FloskelTemplate& templ ) : CatalogTemplate( templ ), mTemplId( templ.mTemplId ), m_preis( templ.m_preis ), m_listViewItem(templ.m_listViewItem ), m_saver( 0 ) { deepCopyCalcParts( templ ); setModifyDate( templ.modifyDate() ); setEnterDate( templ.enterDate() ); setText( templ.getText() ); setUnitId(templ.unit().id()); // m_calcParts.setAutoDelete(true); } FloskelTemplate& FloskelTemplate::operator= ( FloskelTemplate& src ) { if ( this == &src ) return *this; mText = src.mText; setUnitId(src.unit().id()); mTemplId = src.mTemplId; mChapterId = src.mChapterId; m_preis = src.m_preis; m_listViewItem = src.m_listViewItem; m_saver = 0; // src.m_saver; deepCopyCalcParts( src ); return *this; } FloskelTemplate::~FloskelTemplate() { delete m_saver; } void FloskelTemplate::deepCopyCalcParts( FloskelTemplate& templ ) { CalcPart *cp = 0; m_calcParts.clear(); QListIterator i( templ.m_calcParts ); while( i.hasNext()) { cp = i.next(); CalcPart *ncp = 0; if( cp->getType() == KALKPART_TIME ) { ncp = new TimeCalcPart( *( static_cast(cp) ) ); } else if( cp->getType() == KALKPART_FIX ) { ncp = new FixCalcPart( *( static_cast(cp) ) ); } else if( cp->getType() == KALKPART_MATERIAL ) { ncp = new MaterialCalcPart( *( static_cast(cp) ) ); } else { // qDebug () << "ERROR: Unknown Calculation-Type!"; } m_calcParts.append( ncp ); } } void FloskelTemplate::setBenefit( double g ) { /* Every calc part has an value for benefit. Set the benefit value for each calc part, later on each can have its own value */ for( auto *cp: m_calcParts) { cp->setProzentPlus(g); } } double FloskelTemplate::getBenefit( ) { bool first = true; double b = 0.0; for( auto *cp: m_calcParts) { if( first ) { b = cp->getProzentPlus(); first = false; } // all benefits are the same atm, thus this ASSERT. Q_ASSERT( fabs(b - cp->getProzentPlus()) < std::numeric_limits::epsilon()); } return b; } void FloskelTemplate::setTemplID( int newID ) { mTemplId = newID; } Geld FloskelTemplate::unitPrice() { return calcPreis(); } Geld FloskelTemplate::calcPreis() { Geld g; if( calcKind() == ManualPrice ) { g = m_preis; } else { g = m_calcParts.calcPrice(); double b = getBenefit(); g += g.percent(b); } return g; } CalcPartList FloskelTemplate::getCalcPartsList() { return getCalcPartsList(ALL_KALKPARTS); } // Returns a calcpartlist where all calcparts have lost their connection // to the database from the dbID POV. That's needed for the transition // from template -> document calculations. CalcPartList FloskelTemplate::decoupledCalcPartsList() { return m_calcParts.decoupledCalcPartsList(); } CalcPartList FloskelTemplate::getCalcPartsList( const QString& calcPart ) { return m_calcParts.getCalcPartsList( calcPart ); } void FloskelTemplate::addCalcPart( CalcPart* cpart ) { m_calcParts.append(cpart); } void FloskelTemplate::removeCalcPart( CalcPart *cpart ) { if( cpart) { cpart->setToDelete(true); cpart->setDirty(true); } } void FloskelTemplate::clearCalcParts() { for(int i=0; isaveTemplate( this ); } else { // qDebug () << "ERR: No saver available!"; return false; } } void FloskelTemplate::saveChapterId() { TemplateSaverBase *saver = getSaver(); if( saver ) { saver->saveTemplateChapter( this ); } } #if 0 QDomElement FloskelTemplate::toXML( QDomDocument& doc) { QDomElement templ = doc.createElement("template"); templ.appendChild( createDomNode(doc, "unit", getUnit().einheitSingular())); templ.appendChild( createDomNode(doc, "text", getText())); templ.appendChild( createDomNode(doc, "id", QString::number(getTemplID()))); templ.appendChild( createDomNode(doc, "benefit", QString::number(getBenefit()))); templ.appendChild( createDomNode(doc, "timecount", hasTimeslice() ? "yes": "no" )); QDomElement calcParts = doc.createElement( "calcParts" ); templ.appendChild(calcParts); fixPartsToXML(doc, calcParts); timePartsToXML(doc, calcParts); materialPartsToXML(doc, calcParts); /* Material Calculation Parts */ materialPartsToXML(doc); CalcPartList tpList = getCalcPartsList(KALKPART_MATERIAL); MaterialCalcPart *mc = 0; mc = static_cast(tpList.first()); for( ; mc; mc = static_cast(tpList.next()) ) { QDomElement calcPart = doc.createElement( "MaterialCalcpart" ); calcParts.appendChild(calcPart); calcPart.appendChild(createDomNode(doc, "name", mc->getName())); calcPart.appendChild(createDomNode(doc, "dbid", mc->getDbID().toString())); StockMaterialList materials = mc->getCalcMaterialList(); StockMaterialListIterator it( materials ); StockMaterial *mat=0; while ( (mat = it.current()) != 0 ) { ++it; QDomElement matElem = doc.createElement("Material"); matElem.appendChild(createDomNode(doc, "MatName", mat->getName())); QString h; h = h.setNum(mc->getCalcAmount(mat)); matElem.appendChild(createDomNode(doc, "Amount", h)); matElem.appendChild(createDomNode(doc, "PriceSum", mc->getPriceForMaterial(mat).toString())); matElem.appendChild(createDomNode(doc, "CostSum", mc->getCostsForMaterial(mat).toString())); matElem.appendChild(createDomNode(doc, "Price", mat->salesPrice().toString())); matElem.appendChild(createDomNode(doc, "Cost", mat->purchPrice().toString())); Einheit e = mat->getUnit(); h = e.einheitSingular(); matElem.appendChild(createDomNode(doc, "Unit", h)); calcPart.appendChild(matElem); } } return templ; } void FloskelTemplate::fixPartsToXML( QDomDocument& doc, QDomElement& calcParts ) { CalcPartList tpList = getCalcPartsList(KALKPART_FIX); FixCalcPart *fc = 0; fc = static_cast(tpList.first()); for( ; fc; fc = static_cast(tpList.next()) ) { QDomElement calcPart = doc.createElement("FixCalcPart"); calcParts.appendChild(calcPart); calcPart.appendChild(createDomNode(doc, "name", fc->getName())); calcPart.appendChild(createDomNode(doc, "dbid", fc->getDbID().toString())); QString h; h.setNum(fc->getMenge()); calcPart.appendChild(createDomNode(doc, "amount", h)); Geld g = fc->unitPreis(); calcPart.appendChild(createDomNode(doc, "price", g.toString( mLocale ))); } } void FloskelTemplate::timePartsToXML( QDomDocument& doc, QDomElement& calcParts ) { CalcPartList tpList = getCalcPartsList(KALKPART_TIME); TimeCalcPart *tc = 0; tc = static_cast(tpList.first()); for( ; tc; tc = static_cast(tpList.next()) ) { QDomElement calcPart = doc.createElement("TimeCalcPart"); calcParts.appendChild(calcPart); calcPart.appendChild(createDomNode(doc, "name", tc->getName())); calcPart.appendChild(createDomNode(doc, "dbid", tc->getDbID().toString())); QString h; h.setNum( tc->getMinuten()); calcPart.appendChild(createDomNode(doc, "minutes", h)); StdSatz ss = tc->getStundensatz(); calcPart.appendChild(createDomNode(doc, "stundensatz", ss.getName())); calcPart.appendChild(createDomNode(doc, "globalHourSetup", tc->globalStdSetAllowed() ? "yes" : "no")); } } void FloskelTemplate::materialPartsToXML( QDomDocument& doc, QDomElement& calcParts ) { /* Material Calculation Parts */ CalcPartList tpList = getCalcPartsList(KALKPART_MATERIAL); MaterialCalcPart *mc = 0; mc = static_cast(tpList.first()); for( ; mc; mc = static_cast(tpList.next()) ) { QDomElement calcPart = doc.createElement( "MaterialCalcpart" ); calcParts.appendChild(calcPart); calcPart.appendChild(createDomNode(doc, "name", mc->getName())); calcPart.appendChild(createDomNode(doc, "dbid", mc->getDbID().toString())); StockMaterialList materials = mc->getCalcMaterialList(); StockMaterialListIterator it( materials ); StockMaterial *mat=0; while ( (mat = it.current()) != 0 ) { ++it; QDomElement matElem = doc.createElement("Material"); matElem.appendChild(createDomNode(doc, "MaterialName", mat->name())); QString h; h = h.setNum(mc->getCalcAmount(mat)); matElem.appendChild(createDomNode(doc, "Amount", h)); matElem.appendChild(createDomNode(doc, "Price", mc->getCostsForMaterial(mat).toString())); Einheit e = mat->getUnit(); h = e.einheitSingular(); matElem.appendChild(createDomNode(doc, "Unit", h)); calcPart.appendChild(matElem); } } } QDomElement FloskelTemplate::createDomNode( QDomDocument doc, const QString& name, const QString& value) { QDomElement elem = doc.createElement(name); QDomText text = doc.createTextNode(value); elem.appendChild(text); return elem; } #endif kraft-1.2.2/src/floskeltemplate.h000066400000000000000000000066511467704360200167770ustar00rootroot00000000000000/*************************************************************************** floskeltemplate.h - ------------------- begin : Don Jan 1 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef FLOSKELTEMPLATE_H #define FLOSKELTEMPLATE_H #include #include #include #include #include "kraftglobals.h" #include "einheit.h" #include "calcpart.h" #include "catalogtemplate.h" /** *@author Klaas Freitag */ class QTreeWidgetItem; class TemplateSaverBase; class QDomDocument; class QDomElement; class FloskelTemplate: public CatalogTemplate { public: FloskelTemplate(); FloskelTemplate(int tID, const QString& text, int einheit, int chapter, int calcKind ); FloskelTemplate( FloskelTemplate& ); virtual ~FloskelTemplate(); /** No descriptions */ void setManualPrice( Geld p ) { m_preis = p; } Geld manualPrice() { return m_preis; } Geld unitPrice(); Geld costsByCalcPart( const QString& part); void addCalcPart( CalcPart* cpart ); void removeCalcPart( CalcPart *cpart ); void clearCalcParts(); CalcPartList getCalcPartsList(); CalcPartList getCalcPartsList(const QString& ); CalcPartList decoupledCalcPartsList(); void setBenefit( double ); double getBenefit(); int getTemplID() { return mTemplId; } void setTemplID( int ); bool hasTimeslice() { return mTimeAdd; } void setHasTimeslice(bool ts) { mTimeAdd = ts; } void setListViewItem( QTreeWidgetItem *it ) { m_listViewItem = it; } QTreeWidgetItem* getListViewItem() { return m_listViewItem; } virtual bool save(); // virtual QDomElement toXML( QDomDocument&); FloskelTemplate& operator= ( FloskelTemplate& ); protected: virtual TemplateSaverBase* getSaver(); virtual void deepCopyCalcParts( FloskelTemplate& ); void saveChapterId(); private: // Private methods #if 0 QDomElement createDomNode( QDomDocument, const QString&, const QString&); void materialPartsToXML( QDomDocument&, QDomElement& ); void fixPartsToXML( QDomDocument&, QDomElement& ); void timePartsToXML( QDomDocument&, QDomElement& ); #endif virtual Geld calcPreis(); int mTemplId; // Database ID int m_chapter; CalcPartList m_calcParts; bool mTimeAdd; Geld m_preis; // preis only valid for manual calculation. QTreeWidgetItem *m_listViewItem; TemplateSaverBase *m_saver; /** */ }; class FloskelTemplateList :public QList { public: FloskelTemplateList() { } }; typedef QListIterator FloskelTemplateListIterator; #endif kraft-1.2.2/src/flostempldialog.cpp000066400000000000000000000600751467704360200173240ustar00rootroot00000000000000/*************************************************************************** flostempldialog - dialog to edit templates ------------------- begin : 2004-15-08 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include #include #include #include #include #include #include #include #include // include files for KDE #include #include #include #include #include "floskeltemplate.h" #include "catalogtemplate.h" #include "flostempldialog.h" #include "unitmanager.h" #include "timecalcpart.h" #include "fixcalcpart.h" #include "portal.h" #include "materialcalcpart.h" #include "matcalcdialog.h" #include "stockmaterial.h" #include "timecalcdialog.h" #include "fixcalcdialog.h" #include "stdsatzman.h" #include "katalogman.h" #include "katalog.h" #include "materialselectdialog.h" #include "defaultprovider.h" FlosTemplDialog::FlosTemplDialog( QWidget *parent, bool modal ) : QDialog( parent ), m_template(0), m_katalog(0), m_fixCalcDia(0), m_timePartDialog(0), m_matPartDialog(0) { QWidget *w = new QWidget( this ); QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); mainLayout->addWidget(w); setupUi( w ); setWindowTitle( i18n("Create or Edit Template Items") ); setModal( modal ); _buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QPushButton *okButton = _buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(_buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(_buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(_buttonBox); okButton->setDefault(true); //Initialise the buttongroup to switch between manual and calculated price m_gbPriceSrc = new QButtonGroup(this); m_gbPriceSrc->addButton(m_rbManual, 0); m_gbPriceSrc->addButton(m_rbCalculation, 1); m_timeParts->header()->setSectionResizeMode(QHeaderView::ResizeToContents); m_fixParts->header()->setSectionResizeMode(QHeaderView::ResizeToContents); m_matParts->header()->setSectionResizeMode(QHeaderView::ResizeToContents); // disable for now, not used cbMwst->setVisible(false); m_mwstLabel->setVisible(false); setupConnections(); setButtonIcons(); } void FlosTemplDialog::setupConnections() { connect(m_gbPriceSrc, SIGNAL(buttonClicked(int)), this, SLOT(slCalcOrFix(int))); /* connect a value Changed signal of the manual price field */ connect( m_manualPriceVal, SIGNAL( valueChanged(double)), this, SLOT( slManualPriceChanged(double))); connect( m_text, SIGNAL(textChanged()),this, SLOT(slSetNewText())); connect( spBenefit, SIGNAL(valueChanged(int)), this, SLOT(slBenefitChange(int))); //Time calculation connect(m_butAddTime, SIGNAL(clicked()), this, SLOT(slAddTimePart())); connect(m_butEditTime, SIGNAL(clicked()), this, SLOT(slEditTimePart())); connect(m_butRemoveTime, SIGNAL(clicked()), this, SLOT(slRemoveTimePart())); //Fix costs connect(m_butAddFix, SIGNAL(clicked()), this, SLOT(slAddFixPart())); connect(m_butEditFix, SIGNAL(clicked()), this, SLOT(slEditFixPart())); connect(m_butRemoveFix, SIGNAL(clicked()), this, SLOT(slRemoveFixPart())); //Material connect(m_butAddMat, SIGNAL(clicked()), this, SLOT(slAddMatPart())); connect(m_butEditMat, SIGNAL(clicked()), this, SLOT(slEditMatPart())); connect(m_butRemoveMat, SIGNAL(clicked()), this, SLOT(slRemoveMatPart())); } void FlosTemplDialog::setButtonIcons() { m_butAddTime->setIcon(DefaultProvider::self()->icon("plus")); m_butEditTime->setIcon(DefaultProvider::self()->icon("edit")); m_butRemoveTime->setIcon(DefaultProvider::self()->icon("minus")); m_butAddFix->setIcon(DefaultProvider::self()->icon("plus")); m_butEditFix->setIcon(DefaultProvider::self()->icon("edit")); m_butRemoveFix->setIcon(DefaultProvider::self()->icon("minus")); m_butAddMat->setIcon(DefaultProvider::self()->icon("plus")); m_butEditMat->setIcon(DefaultProvider::self()->icon("edit")); m_butRemoveMat->setIcon(DefaultProvider::self()->icon("minus")); } void FlosTemplDialog::setTemplate( FloskelTemplate *t, const QString& katalogname, bool newTempl ) { if( ! t ) return; m_template = t; m_templateIsNew = newTempl; m_katalog = KatalogMan::self()->getKatalog(katalogname); if( m_katalog == 0 ) { // qDebug () << "ERR: Floskel Dialog called without valid Katalog!"; return; } QList chapters = m_katalog->getKatalogChapters( ); QStringList chapNames; foreach( CatalogChapter chap, chapters ) { chapNames.append( chap.name() ); } cbChapter->insertItems(-1, chapNames ); int chapID = t->chapterId().toInt(); QString chap = m_katalog->chapterName(dbID(chapID)); cbChapter->setCurrentIndex(cbChapter->findText( chap )); m_manualPriceVal->setSuffix(m_katalog->locale()->currencySymbol()); /* Text of the template */ m_text->setText( t->getText()); /* Unit */ m_unit->clear(); m_unit->insertItems(-1, UnitManager::self()->allUnits()); m_unit->setCurrentIndex(m_unit->findText( m_template->unit().einheitSingular() )); m_manualPriceVal->setValue( t->unitPrice().toDouble()); /* Kind of Calculation: Manual or calculated? */ _origCalcType = m_template->calcKind(); if( t->calcKind() == CatalogTemplate::ManualPrice ) { slCalcOrFix(0); m_rbManual->setChecked(true); m_rbCalculation->setChecked(false); } else { slCalcOrFix(1); m_rbManual->setChecked(false); m_rbCalculation->setChecked(true); } /* set up the different calculation parts */ setCalcparts(); _calcPartsModified = false; /* set text */ slSetNewText(); m_addTime->setChecked( m_template->hasTimeslice() ); m_text->setFocus(); m_text->selectAll(); } void FlosTemplDialog::setCalcparts( ) { /* time calculation in widget m_timeParts */ CalcPartList tpList = m_template->getCalcPartsList( KALKPART_TIME ); m_timeParts->clear(); QListIterator it( tpList ); while( it.hasNext() ) { TimeCalcPart *cp = static_cast(it.next()); QString stdStd = i18n("No"); if( cp->globalStdSetAllowed() ) stdStd = i18n("Yes"); QTreeWidgetItem *lvItem = new QTreeWidgetItem( m_timeParts ); drawTimeListEntry( lvItem, cp ); mCalcPartDict.insert(lvItem, cp ); } /* Fix calculation parts */ m_fixParts->clear(); tpList = m_template->getCalcPartsList( KALKPART_FIX ); QListIterator fixIt( tpList ); while( fixIt.hasNext() ) { FixCalcPart *fc = static_cast(fixIt.next()); QTreeWidgetItem *lvItem = new QTreeWidgetItem( m_fixParts ); drawFixListEntry( lvItem, fc ); mCalcPartDict.insert( lvItem, fc ); } /* Material calculation */ m_matParts->clear(); tpList = m_template->getCalcPartsList( KALKPART_MATERIAL ); QListIterator matIt( tpList ); while( matIt.hasNext() ) { MaterialCalcPart *mc = static_cast(matIt.next()); QTreeWidgetItem *lvItem = new QTreeWidgetItem( m_matParts ); mCalcPartDict.insert( lvItem, mc ); drawMatListEntry( lvItem, mc ); } } void FlosTemplDialog::refreshPrices() { if( ! m_template ) return; /* assemble the pricing label */ QString t; t = i18n("Calculated price: "); if( m_template->calcKind() == CatalogTemplate::ManualPrice ) { t = i18n("Manual price: "); } else if( m_template->calcKind() == CatalogTemplate::Calculation ) { int benefit = spBenefit->value(); QString benefitStr = i18n("(+%1%)", benefit); if( benefit < 0 ) { benefitStr = QLatin1String("")+i18n("%1%", benefit)+QLatin1String(""); } benefitStr += i18n(": "); t += benefitStr; } else { // qDebug () << "ERR: unknown calculation type!"; } m_resPreisName->setText(t); m_resPreisName->setTextFormat(Qt::RichText); /* set Price */ t = m_template->unitPrice().toLocaleString(); m_resultPrice->setText( t ); m_manualPriceVal->setValue( m_template->unitPrice().toDouble() ); /* Price parts per calculation part */ Geld g( m_template->costsByCalcPart( KALKPART_TIME )); m_textTimePart->setText( g.toLocaleString()); g = m_template->costsByCalcPart( KALKPART_FIX ); m_textFixPart->setText( g.toLocaleString()); g = m_template->costsByCalcPart( KALKPART_MATERIAL ); m_textMaterialPart->setText(g.toLocaleString()); // Benefit double b = m_template->getBenefit(); spBenefit->setValue( qRound(b)); } FlosTemplDialog::~FlosTemplDialog( ) { delete m_fixCalcDia; delete m_timePartDialog; delete m_matPartDialog; } // Check if the template was modified in the dialog bool FlosTemplDialog::templModified() { bool modified = false; QString str = m_text->toPlainText(); modified = str != m_template->getText(); modified = modified || (m_unit->currentText() != m_template->unit().einheitSingular()); modified = modified || (m_addTime->isChecked() != m_template->hasTimeslice()); str = spBenefit->cleanText(); bool b; int new_val = str.toInt(&b); modified = modified || ( b && new_val != qRound(m_template->getBenefit())); // calculation kind CatalogTemplate::CalculationType currCalcType = m_template->calcKind(); modified = modified || (currCalcType != _origCalcType); modified = modified || _calcPartsModified; return modified; } void FlosTemplDialog::accept() { if( m_template ) { // qDebug () << "Saving template ID " << m_template->getTemplID(); QString h; h = m_text->toPlainText(); if( h != m_template->getText() ) { // qDebug () << "Template Text dirty -> update"; m_template->setText( h ); } h = m_unit->currentText(); if( h != m_template->unit().einheitSingular()) { // qDebug () << "Template Einheit dirty -> update to " << h; m_template->setUnitId( UnitManager::self()->getUnitIDSingular(h)); } /* count time */ bool c = m_addTime->isChecked(); if( c != m_template->hasTimeslice() ) { m_template->setHasTimeslice(c); } /* benefit */ h = spBenefit->cleanText(); bool b; int new_val = h.toInt(&b); if( b && new_val != qRound(m_template->getBenefit())) { m_template->setBenefit(new_val); // qDebug () << "benefit dirty ->update to " << g; } // Calculationtype int selId = m_gbPriceSrc->checkedId(); CatalogTemplate::CalculationType calcType = CatalogTemplate::Unknown; if( selId == 0 ) { calcType = CatalogTemplate::ManualPrice; } else if( selId == 1 ) { calcType = CatalogTemplate::Calculation; } else { // qDebug () << "ERROR: Calculation type not selected, id is " << selId; } m_template->setCalculationType( calcType ); // reread the manual price double dd = m_manualPriceVal->value(); m_template->setManualPrice( Geld( dd ) ); h = cbChapter->currentText(); // qDebug () << "catalog chapter is " << h; _calcPartsModified = false; if( m_template->save() ) { emit( editAccepted( m_template ) ); KatalogMan::self()->notifyKatalogChange( m_katalog, m_template->getTemplID() ); } else { QMessageBox::warning(0, i18n("Template Error"), i18n("Saving of this template failed, sorry")); } } // qDebug () << "*** Saving finished "; QDialog::accept(); } void FlosTemplDialog::reject() { if(confirmClose() == true) { // let QDialog clean away the dialog. QDialog::reject(); } } void FlosTemplDialog::closeEvent ( QCloseEvent * event ) { if(confirmClose() == false) event->ignore(); else event->accept(); } bool FlosTemplDialog::confirmClose() { if( templModified() ) { QMessageBox msgBox; msgBox.setText(i18n("The template has been modified.")); msgBox.setInformativeText(i18n("Do you want to discard your changes?")); msgBox.setStandardButtons(QMessageBox::Discard | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); int ret = msgBox.exec(); if( ret == QMessageBox::Cancel ) { return false; } } mCalcPartDict.clear(); m_timeParts->clear (); m_fixParts->clear (); m_matParts->clear (); m_katalog->reload(m_template->getTemplID()); if ( m_templateIsNew ) { // remove the listview item if it was created newly emit editRejected(); } return true; } bool FlosTemplDialog::askChapterChange( FloskelTemplate*, int ) { QMessageBox msgBox; msgBox.setText(i18n( "The catalog chapter was changed for this template.\n" "Do you really want to move the template to the new chapter?")); msgBox.setInformativeText(i18n("Chapter Change")); msgBox.setStandardButtons(QMessageBox::Yes| QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); return( ret == QMessageBox::Yes); } void FlosTemplDialog::slManualPriceChanged(double dd) { qDebug () << "Changing manual price:" << dd; if( ! m_template ) return; // qDebug () << "Updating manual price!"; m_template->setManualPrice( Geld( dd )); refreshPrices(); } double FlosTemplDialog::benefitValue() { double val = 0; CalcPartList cparts = m_template->getCalcPartsList(); // Currently still all calcparts have the same value of benefit. // once this changes, this needs to be fixed accordingly. if( cparts.size() > 0 ) { val = cparts.at(0)->getProzentPlus(); } return val; } void FlosTemplDialog::slBenefitChange( int newBen ) { int oldBen = qRound(m_template->getBenefit()); if( oldBen != newBen ) { m_template->setBenefit(newBen); refreshPrices(); _calcPartsModified = true; } } void FlosTemplDialog::slAddFixPart() { if( ! m_template ) return; FixCalcDialog dia(this); if( dia.exec() == QDialog::Accepted ) { FixCalcPart *cp = new FixCalcPart( dia.getName(), dia.getPreis()); cp->setMenge( dia.getMenge()); cp->setProzentPlus(benefitValue()); cp->setDirty(true); QTreeWidgetItem *lvItem = new QTreeWidgetItem( m_fixParts); drawFixListEntry( lvItem, cp ); mCalcPartDict.insert( lvItem, cp ); m_template->addCalcPart( cp ); refreshPrices(); _calcPartsModified = true; } } void FlosTemplDialog::slRemoveFixPart() { if( ! m_template || ! m_fixParts ) return; QTreeWidgetItem *item = m_fixParts->currentItem(); if( item ) { CalcPart *cp = mCalcPartDict[item]; if( cp ) { m_template->removeCalcPart(cp); } delete item; refreshPrices(); _calcPartsModified = true; } } void FlosTemplDialog::slEditFixPart() { if( ! m_template || !m_fixParts ) return; // qDebug () << "Edit fix part!"; QTreeWidgetItem *item = m_fixParts->currentItem(); if( item ) { FixCalcPart *cp = static_cast(mCalcPartDict[item]); if( cp ) { m_fixCalcDia = new FixCalcDialog(this); m_fixCalcDia->setCalcPart(cp); connect( m_fixCalcDia, SIGNAL(fixCalcPartChanged(FixCalcPart*)), this, SLOT(slFixCalcPartChanged(FixCalcPart*))); m_fixCalcDia->show(); } } } void FlosTemplDialog::slFixCalcPartChanged(FixCalcPart *cp) { refreshPrices(); _calcPartsModified = true; drawFixListEntry(m_fixParts->currentItem(), cp); } void FlosTemplDialog::slTimeCalcPartChanged(TimeCalcPart *cp) { refreshPrices(); _calcPartsModified = true; drawTimeListEntry(m_timeParts->currentItem(), cp); } void FlosTemplDialog::slAddTimePart() { if( ! m_template ) return; TimeCalcDialog dia(this); if( dia.exec() == QDialog::Accepted ) { TimeCalcPart *cp = new TimeCalcPart( dia.getName(), dia.getDauer(), TimeCalcPart::timeUnitFromString(dia.unitStr()), 0 ); cp->setGlobalStdSetAllowed( dia.allowGlobal()); StdSatz std = StdSatzMan::self()->getStdSatz( dia.getStundensatzName()); cp->setStundensatz( std ); cp->setProzentPlus(benefitValue()); QTreeWidgetItem *lvItem = new QTreeWidgetItem( m_timeParts); drawTimeListEntry( lvItem, cp ); mCalcPartDict.insert( lvItem, cp ); m_template->addCalcPart( cp ); refreshPrices(); _calcPartsModified = true; } } /* * stellt einen TimeCalcPart als ListViewItem dar. Wird gebraucht, wenn das * item neu ist, aber auch beim Editieren */ void FlosTemplDialog::drawTimeListEntry( QTreeWidgetItem *it, TimeCalcPart *cp ) { if( !( it && cp) ) return; it->setText( 0, cp->getName()); it->setText( 1, QString::number(cp->duration()) + QLatin1Char(' ') + TimeCalcPart::timeUnitString(cp->timeUnit())); it->setText( 2, cp->getStundensatz().getName()); it->setText( 3, cp->globalStdSetAllowed() ? i18n("Yes") : i18n("No")); } void FlosTemplDialog::drawFixListEntry( QTreeWidgetItem* it, FixCalcPart *cp ) { if( !( it && cp) ) return; it->setText( 0, DefaultProvider::self()->locale()->toString(cp->getMenge())); it->setText( 1, cp->getName()); it->setText( 2, cp->unitPreis().toLocaleString()); it->setText( 3, cp->basisKosten().toLocaleString()); } void FlosTemplDialog::drawMatListEntry( QTreeWidgetItem *it, MaterialCalcPart *mc ) { it->setText( 0, mc->getName()); it->setText( 1, QString::number(mc->getCalcAmount(), 'f',2)); it->setText( 2, mc->getMaterial()->unit().einheitSingular()); it->setText( 3, mc->basisKosten().toLocaleString()); it->setText( 4, QString::number(mc->getMaterial()->getAmountPerPack(), 'f',2)); it->setText( 5, mc->getMaterial()->salesPrice().toLocaleString()); } void FlosTemplDialog::slRemoveTimePart() { if( ! m_template || !m_timeParts ) return; QTreeWidgetItem *item = m_timeParts->currentItem(); if( item ) { CalcPart *cp = mCalcPartDict[item]; if( cp ) { m_template->removeCalcPart(cp); } delete item; refreshPrices(); _calcPartsModified = true; } } void FlosTemplDialog::slEditTimePart() { if( ! m_template || !m_timeParts ) return; // qDebug () << "Edit time part!"; QTreeWidgetItem *item = m_timeParts->currentItem(); if( item ) { TimeCalcPart *cp = static_cast(mCalcPartDict[item]); if( cp ) { m_timePartDialog = new TimeCalcDialog(this); m_timePartDialog->setTimeCalcPart(cp); connect( m_timePartDialog, SIGNAL(timeCalcPartChanged(TimeCalcPart*)), this, SLOT(slTimeCalcPartChanged(TimeCalcPart*)) ); m_timePartDialog->show(); } else { // qDebug () << "No time calc part found for this item"; } } else { // qDebug () << "No current Item!"; } refreshPrices(); _calcPartsModified = true; } /* * Achtung: slAddMatPart fgt keinen neuen kompletten Materialpart * hinzu, sondern nur ein neues Material zu dem einen, bestehenden * Materialpart. */ void FlosTemplDialog::slAddMatPart() { if( ! m_template ) return; MaterialSelectDialog dia( this ); connect( &dia, SIGNAL( materialSelected( int, double ) ), this, SLOT( slNewMaterial( int, double ) ) ); dia.exec(); } /* * Slot, der aufgerufen wird, wenn im Materialeditor ein Material zur Kalkulation * geschickt wird. */ void FlosTemplDialog::slNewMaterial( int matID, double amount ) { // qDebug () << "Material ID: " << matID; // TODO: Checken, ob der richtige Tab aktiv ist. // TODO: Check if the material is already in the calcpart (is this really needed??) MaterialCalcPart *mc = new MaterialCalcPart(matID, 0, amount); if( mc && ! mc->getMaterial() ) { // the material is still unknown to the catalog because it was just entered // in the material catalog qDebug() << "ERR: MaterialCalcPart without Material!"; return; } if( mc ) { mc->setProzentPlus(benefitValue()); m_template->addCalcPart( mc ); QTreeWidgetItem *lvItem = new QTreeWidgetItem(m_matParts); drawMatListEntry( lvItem, mc ); mCalcPartDict.insert( lvItem, mc ); refreshPrices(); _calcPartsModified = true; } } void FlosTemplDialog::slEditMatPart() { if( ! m_template || !m_matParts ) return; // qDebug () << "Edit Material part!"; QTreeWidgetItem *item = m_matParts->currentItem(); MaterialCalcPart *mc = static_cast( mCalcPartDict[item] ); if( mc ) { m_matPartDialog = new MatCalcDialog( mc, this); connect( m_matPartDialog, SIGNAL(matCalcPartChanged(MaterialCalcPart*)), this, SLOT(slMatCalcPartChanged(MaterialCalcPart*))); m_matPartDialog->setModal(true); m_matPartDialog->show(); } else { // qDebug () << "No such MaterialCalcPart!"; } } void FlosTemplDialog::slMatCalcPartChanged(MaterialCalcPart *mc) { drawMatListEntry(m_matParts->currentItem(), mc); refreshPrices(); _calcPartsModified = true; } void FlosTemplDialog::slRemoveMatPart() { if( ! m_template || ! m_matParts ) return; QTreeWidgetItem *item = m_matParts->currentItem(); if( item ) { CalcPart *cp = mCalcPartDict[item]; if( cp ) { m_template->removeCalcPart(cp); } delete item; refreshPrices(); _calcPartsModified = true; } } /* * Slot for managing the switch from manual to calculated price * and vice versa */ void FlosTemplDialog::slCalcOrFix(int button) { bool ok = true; bool manualEnabled = true; if( button == 0 ) { /* switched to manual price */ if( m_template ) { m_template->setCalculationType( CatalogTemplate::ManualPrice ); } } else if( button == 1 ) { /* switched to calculated */ if( m_template ) { m_template->setCalculationType( CatalogTemplate::Calculation ); } manualEnabled = false; } else { /* unknown knob*/ ok = false; } if( ok ) { m_manualPriceVal->setEnabled( manualEnabled ); m_textTimePart->setEnabled(!manualEnabled); m_textFixPart->setEnabled(!manualEnabled); m_textMaterialPart->setEnabled(!manualEnabled); m_tLabelMat->setEnabled(!manualEnabled); m_tLabelFix->setEnabled(!manualEnabled); m_tLabelTime->setEnabled(!manualEnabled); m_tLabelProfit->setEnabled(!manualEnabled); spBenefit->setEnabled(!manualEnabled); refreshPrices(); } } void FlosTemplDialog::slSetNewText() { QPushButton *okButton = _buttonBox->button(QDialogButtonBox::Ok); if( ! m_text || m_text->toPlainText().isEmpty() ) { okButton->setEnabled(false); } else { okButton->setEnabled(true); } if( m_text ) { const QString t = Portal::textWrap( m_text->toPlainText(), 80, 5 ); const QStringList li = t.split(QLatin1Char('\n')); QString longest; for( const QString& p : li ) { if( p.length() > longest.length() ) longest = p; } QFontMetrics fm(m_textDispFix->font()); int w = 10+fm.width(longest); if( m_textDispTime) { m_textDispTime->setText(t); m_textDispTime->setMinimumWidth(w); } if( m_textDispFix) { m_textDispFix->setText(t); m_textDispFix->setMinimumWidth(w); } if( m_textDispMat) { m_textDispMat->setText(t); m_textDispMat->setMinimumWidth(w); } } } /* END */ kraft-1.2.2/src/flostempldialog.h000066400000000000000000000072551467704360200167720ustar00rootroot00000000000000/*************************************************************************** flostempldialog - ------------------- begin : 2004-15-08 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _FLOSTEMPLDIALOG_H #define _FLOSTEMPLDIALOG_H // include files #include #include "kraftglobals.h" #include "ui_calctemplate.h" #include "calcpart.h" #include "stockmaterial.h" class FloskelTemplate; class TimeCalcPart; class MaterialCalcPart; class FixCalcPart; class FixCalcDialog; class MatCalcDialog; class TimeCalcDialog; class Katalog; class QDialogButtonBox; class FlosTemplDialog : public QDialog, protected Ui::d_calcTempl { Q_OBJECT public: FlosTemplDialog(QWidget *parent=0, bool modal=false ); virtual ~FlosTemplDialog(); void setTemplate( FloskelTemplate* t, const QString&, bool ); bool templateIsNew() { return m_templateIsNew; }; signals: void takeMaterialAnswer(const QString&); void editAccepted( FloskelTemplate* ); void editRejected(); void chapterChanged(int); public slots: virtual void slAddFixPart(); virtual void slEditFixPart(); virtual void slRemoveFixPart(); virtual void slEditTimePart(); virtual void slAddTimePart(); virtual void slRemoveTimePart(); virtual void slAddMatPart(); virtual void slEditMatPart(); virtual void slRemoveMatPart(); virtual void slCalcOrFix(int); virtual void slBenefitChange(int newBen ); /* slot for adding a new material to the material calculation */ void slNewMaterial( int, double ); void refreshPrices(); void slManualPriceChanged(double ); void slSetNewText(); void setCalcparts(); void slFixCalcPartChanged(FixCalcPart*); void slTimeCalcPartChanged(TimeCalcPart*); void slMatCalcPartChanged(MaterialCalcPart*); virtual void accept(); virtual void reject(); virtual void closeEvent ( QCloseEvent * event ); bool confirmClose(); private: void setupConnections(); void setButtonIcons(); double benefitValue(); bool templModified(); virtual void drawTimeListEntry( QTreeWidgetItem *, TimeCalcPart * ); virtual void drawFixListEntry( QTreeWidgetItem*, FixCalcPart* ); virtual void drawMatListEntry( QTreeWidgetItem*, MaterialCalcPart* ); bool askChapterChange( FloskelTemplate*, int); virtual QString stdMaterialKalcPartName() { return i18n("Calculated material"); } FloskelTemplate *m_template; Katalog *m_katalog; /* dict das qlistviewitems auf calcparts abbildet */ QHash mCalcPartDict; QButtonGroup *m_gbPriceSrc; QDialogButtonBox *_buttonBox; FixCalcDialog *m_fixCalcDia; TimeCalcDialog *m_timePartDialog; MatCalcDialog *m_matPartDialog; bool m_templateIsNew; bool _calcPartsModified; CatalogTemplate::CalculationType _origCalcType; }; #endif /* END */ kraft-1.2.2/src/footertemplateprovider.cpp000066400000000000000000000060051467704360200207350ustar00rootroot00000000000000/*************************************************************************** footertemplateprovider - template provider classes for footer data like addresses or texts ------------------- begin : 2007-05-02 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include "footertemplateprovider.h" #include "texteditdialog.h" #include "doctext.h" #include "defaultprovider.h" FooterTemplateProvider::FooterTemplateProvider( QWidget *parent ) :TemplateProvider( parent ) { } void FooterTemplateProvider::slotNewTemplate() { // qDebug () << "SlotNewTemplate called!"; TextEditDialog dia( mParent, KraftDoc::Footer ); DocText dt; dt.setTextType( KraftDoc::Footer ); dt.setDocType( mDocType ); dia.setDocText( dt ); if ( dia.exec() ) { // qDebug () << "Successfully edited new text"; DocText dt = dia.docText(); /* save to database */ dbID newId = DefaultProvider::self()->saveDocumentText( dt ); dt.setDbId( newId ); emit newFooterText( dt ); } } void FooterTemplateProvider::slotEditTemplate() { // qDebug () << "SlotEditTemplate called!"; TextEditDialog dia( mParent, KraftDoc::Footer ); /* mCurrentText is set through the slot slotSetCurrentDocText */ DocText dt = currentText(); if ( dt.type() == KraftDoc::Unknown ) { dt.setTextType( KraftDoc::Footer ); dt.setDocType( mDocType ); } dia.setDocText( dt ); if ( dia.exec() ) { // qDebug () << "Successfully edited texts"; DocText dt = dia.docText(); /* write back the listview item stored in the input text */ dt.setListViewItem( currentText().listViewItem() ); /* save to database */ DefaultProvider::self()->saveDocumentText( dt ); // this ends up in the footerselection, slot updateDocText emit updateFooterText( dt ); } } void FooterTemplateProvider::slotDeleteTemplate() { DocText dt = currentText(); emit deleteFooterText( dt ); DefaultProvider::self()->deleteDocumentText( dt ); } void FooterTemplateProvider::slotTemplateToDocument() { // qDebug () << "Moving template to document"; emit footerTextToDocument(currentText(), true); } void FooterTemplateProvider::slotInsertTemplateToDocument() { emit footerTextToDocument(currentText(), false); } kraft-1.2.2/src/footertemplateprovider.h000066400000000000000000000033551467704360200204070ustar00rootroot00000000000000/*************************************************************************** footertemplateprovider - template provider classes for footer data like addresses or texts ------------------- begin : 2007-05-02 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef FOOTERTEMPLATEPROVIDER_H #define FOOTERTEMPLATEPROVIDER_H #include "templateprovider.h" class QWidget; class DocText; class FooterTemplateProvider : public TemplateProvider { Q_OBJECT public: FooterTemplateProvider( QWidget* ); public slots: void slotNewTemplate() override; void slotEditTemplate() override; void slotDeleteTemplate() override; void slotTemplateToDocument() override; void slotInsertTemplateToDocument() override; signals: void newFooterText( const DocText& ); void updateFooterText( const DocText& ); void footerTextToDocument(const DocText&, bool replace); void deleteFooterText( const DocText& ); }; #endif kraft-1.2.2/src/format.cpp000066400000000000000000000046431467704360200154260ustar00rootroot00000000000000/*************************************************************************** Simple format functions for double, date etc. ------------------- begin : March 2020 copyright : (C) 2020 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include #include #include #include "format.h" namespace Format { QString localeDoubleToString(double val, const QLocale& loc) { int prec = 0; const QString num = QString::number(val); if( num.contains( QChar('.') ) ) { // there is a decimal point // calculate the precision prec = num.length() - (1+num.lastIndexOf( QChar('.') ) ); if (prec > 3 ) prec = 3; // lets dont go wild } const QString re = loc.toString(val, 'f', prec); return re; } QString toDateString( const QDate& date, const QString& format ) { if (format == Format::DateFormatIso) { return date.toString(Qt::ISODate); } if (format == DateFormatShort || format.isEmpty()) { return date.toString(Qt::DefaultLocaleShortDate); } if (format == DateFormatLong) { return date.toString(Qt::DefaultLocaleLongDate); } if (format == DateFormatRFC) { return date.toString(Qt::RFC2822Date); } if (format == DateFormatGerman) { return date.toString("dd.MM.yyyy"); } return date.toString(format); // good luck! } QString toDateTimeString(const QDateTime& dt, const QString &format) { const QString dateStr = QString("%1, %2:%3").arg(toDateString(dt.date(), format)) .arg(dt.time().hour(), 2, 10, QLatin1Char('0')) .arg(dt.time().minute(), 2, 10, QLatin1Char('0')); return dateStr; } } kraft-1.2.2/src/format.h000066400000000000000000000043451467704360200150720ustar00rootroot00000000000000/*************************************************************************** Simple format functions for double, date etc. ------------------- begin : March 2020 copyright : (C) 2020 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef FORMAT_H #define FORMAT_H #include class QString; namespace Format { /** * @brief localeDoubleToString - convert a double into a string locale aware. * @param val - the value * @param loc - a locale, if skipped, the default locale is used. * @return the string * * The additional cleverness is that the returned string has the right * precision, ie. it returns "2" for val = 2.00 but "2.23" if val is 2.23. */ QString localeDoubleToString(double val, const QLocale& loc = QLocale()); const QString DateFormatIso = QStringLiteral("ISO"); const QString DateFormatShort = QStringLiteral("Short"); const QString DateFormatLong = QStringLiteral("Long"); const QString DateFormatRFC = QStringLiteral("RFC"); const QString DateFormatGerman = QStringLiteral("German"); /** * @brief toDateString - format date to a given format * @param date - the QDate * @param format - A name of a format (read from settings) or format string * @return the string containing the date. */ QString toDateString(const QDate& date, const QString &format); QString toDateTimeString(const QDateTime& dt, const QString &format); } #endif // FORMAT_H kraft-1.2.2/src/geld.cpp000066400000000000000000000050741467704360200150500ustar00rootroot00000000000000/*************************************************************************** geld - A class that represents money and supports calculation ------------------- begin : 2004-16-08 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt // include files for KDE #include #include "geld.h" #include "defaultprovider.h" Geld::Geld( ) { m_cent = 0; } Geld::Geld( long l ) { m_cent = l; } Geld::Geld( double g ) { m_cent = qRound(100*g); } Geld& Geld::operator=(const long l) { m_cent = l; return *this; } Geld& Geld::operator=(const double d) { m_cent = qRound( 100.0 * d ); return *this; } Geld& Geld::operator+=(const Geld& g) { m_cent += g.m_cent; return *this; } Geld Geld::operator/(const double divisor) const { // FIXME Geld g( this->m_cent / divisor / 100 ); return g; } Geld Geld::percent( double p ) { Geld g( this->m_cent * p / 100 /100 ); return g; } Geld Geld::operator*(const long mult) const { // FIXME Geld g( this->m_cent * mult / 100); return g; } Geld Geld::operator*(const double mult) const { Geld g(double(this->m_cent) * mult / 100); return g; } bool Geld::operator!=(Geld g) { return g.m_cent != m_cent; } QString Geld::toNumberString() const { double g = m_cent/100.0; return QString::number(g, 'f', 2); } QString Geld::toLocaleString() const { return DefaultProvider::self()->locale()->toCurrencyString(m_cent/100.0); } QString Geld::toHtmlString() const { QString re = toLocaleString(); re.replace( " ", " " ); if ( m_cent < 0 ) { re = QString( "%1" ).arg( re ); } return re; } double Geld::toDouble() const { return m_cent/100.0; } long Geld::toLong() { return m_cent; } Geld::~Geld( ) { } /* END */ kraft-1.2.2/src/geld.h000066400000000000000000000032651467704360200145150ustar00rootroot00000000000000 /*************************************************************************** geld - ------------------- begin : 2004-16-08 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _GELD_H #define _GELD_H #include "kraftcat_export.h" #include #include class KRAFTCAT_EXPORT Geld { public: Geld(); Geld(long); Geld(double); ~Geld(); Geld& operator=(const long); Geld& operator=(const double); Geld operator/(const double) const; Geld operator*(const long) const; Geld operator*(const double) const; Geld& operator+=(const Geld&); bool operator!=(Geld); Geld percent( double ); QString toLocaleString() const; QString toNumberString() const; QString toHtmlString() const; double toDouble() const; // toLong returns the amount in cents! long toLong(); private: long m_cent; }; #endif /* END */ kraft-1.2.2/src/grantleetemplate.cpp000066400000000000000000000066331467704360200174740ustar00rootroot00000000000000/*************************************************************************** GrantleeTemplate.cpp - fill a template with text tags ------------------- begin : March 2020 copyright : (C) 2020 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "grantleetemplate.h" #include #include #include #include #include #include #include #include // make this class a QObject to parent the created QObjects in addToMappingHash() // to it. That way, the allocated objects are automatically freed by the Qt mechanism GrantleeFileTemplate::GrantleeFileTemplate( const QString& file) : QObject(), _tmplFileName(file) { } void GrantleeFileTemplate::addToMappingHash( const QString& prefix, const QVariantHash& hash) { QObject *obj; if (prefix.isNull()) { return; } if (_objs.contains(prefix)) { obj = _objs[prefix]; } else { // make the created objects a child of the _p QObject obj = new QObject(this); _objs[prefix] = obj; } QHash::const_iterator i = hash.constBegin(); while (i != hash.constEnd()) { const auto key = i.key(); const auto val = i.value(); obj->setProperty(key.toLocal8Bit().data(), val); i++; } } void GrantleeFileTemplate::addToObjMapping(const QString& key, QObject *obj) { _objs.insert(key, obj); } QString GrantleeFileTemplate::render(bool &ok) const { QScopedPointer engine(new Grantlee::Engine()); QFileInfo fi(_tmplFileName); ok = true; // assume all goes well. auto loader = QSharedPointer::create(); loader->setTemplateDirs( {fi.absolutePath()} ); engine->addTemplateLoader( loader ); QString output; auto t = engine->loadByName(fi.fileName()); if (t->error() != Grantlee::Error::NoError) { ok = false; output = t->errorString(); qDebug() << "Grantlee template load failed:" << output; } if (ok) { Grantlee::Context c; QHash::const_iterator i = _objs.constBegin(); while (i != _objs.constEnd()) { const QString k = i.key(); QObject *obj = i.value(); c.insert(k, obj); ++i; } output = t->render(&c); if (t->error() != Grantlee::Error::NoError) { ok = false; // Rendering error. output = t->errorString(); qDebug() << "Grantlee template err:" << output; } } return output; } kraft-1.2.2/src/grantleetemplate.h000066400000000000000000000031221467704360200171270ustar00rootroot00000000000000/*************************************************************************** GrantleeTemplate.cpp - fill a template with text tags ------------------- begin : March 2020 copyright : (C) 2020 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef GRANTLEETEMPLATE_H #define GRANTLEETEMPLATE_H #include #include #include #include "texttemplateinterface.h" #include #include class GrantleeFileTemplate : public QObject { Q_OBJECT public: GrantleeFileTemplate( const QString& file); void addToObjMapping(const QString& key, QObject *obj); void addToMappingHash( const QString& prefix, const QVariantHash& hash); QString render(bool &ok) const; private: const QString& _tmplFileName; QHash _objs; }; #endif kraft-1.2.2/src/headertemplateprovider.cpp000066400000000000000000000056761467704360200207040ustar00rootroot00000000000000/*************************************************************************** headertemplateprovider - template provider classes for header data like addresses or texts ------------------- begin : 2007-05-02 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include "headertemplateprovider.h" #include "texteditdialog.h" #include "doctext.h" #include "defaultprovider.h" HeaderTemplateProvider::HeaderTemplateProvider( QWidget *parent ) :TemplateProvider( parent ) { } void HeaderTemplateProvider::slotNewTemplate() { // qDebug () << "SlotNewTemplate called!"; TextEditDialog dia( mParent, KraftDoc::Header ); DocText dt; dt.setTextType( KraftDoc::Header ); dt.setDocType( mDocType ); dia.setDocText( dt ); if ( dia.exec() ) { // qDebug () << "Successfully edited texts"; DocText dt = dia.docText(); /* save to database */ dbID newId = DefaultProvider::self()->saveDocumentText( dt ); dt.setDbId( newId ); emit newHeaderText( dt ); } } void HeaderTemplateProvider::slotEditTemplate() { // qDebug () << "SlotEditTemplate called!"; TextEditDialog dia( mParent, KraftDoc::Header ); /* mCurrentText is set through the slot slotSetCurrentDocText */ DocText dt = currentText(); if ( dt.type() == KraftDoc::Unknown ) { dt.setTextType( KraftDoc::Header ); dt.setDocType( mDocType ); } dia.setDocText( dt ); if ( dia.exec() ) { // qDebug () << "Successfully edited texts"; DocText dt = dia.docText(); /* write back the listview item stored in the input text */ dt.setListViewItem( currentText().listViewItem() ); /* save to database */ DefaultProvider::self()->saveDocumentText( dt ); emit updateHeaderText( dt ); } } void HeaderTemplateProvider::slotDeleteTemplate() { DefaultProvider::self()->deleteDocumentText( currentText() ); emit deleteHeaderText( currentText() ); } void HeaderTemplateProvider::slotTemplateToDocument() { // qDebug () << "Moving template to document"; emit headerTextToDocument(currentText(), true); } void HeaderTemplateProvider::slotInsertTemplateToDocument() { emit headerTextToDocument(currentText(), false); } kraft-1.2.2/src/headertemplateprovider.h000066400000000000000000000033471467704360200203420ustar00rootroot00000000000000/*************************************************************************** headertemplateprovider - template provider classes for header data like addresses or texts ------------------- begin : 2007-05-02 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef HEADERTEMPLATEPROVIDER_H #define HEADERTEMPLATEPROVIDER_H #include "templateprovider.h" #include "doctext.h" class QWidget; class HeaderTemplateProvider : public TemplateProvider { Q_OBJECT public: HeaderTemplateProvider( QWidget* ); public slots: void slotNewTemplate() override; void slotEditTemplate() override; void slotDeleteTemplate() override; void slotTemplateToDocument() override; void slotInsertTemplateToDocument() override; signals: void newHeaderText( const DocText& ); void updateHeaderText( const DocText& ); void headerTextToDocument(const DocText&, bool replace); void deleteHeaderText( const DocText& ); private: }; #endif kraft-1.2.2/src/htmlview.cpp000066400000000000000000000113101467704360200157620ustar00rootroot00000000000000/*************************************************************************** htmlview.cpp - show a html page ------------------- begin : Aug 2006 copyright : (C) 2006 Klaas Freitag (C) 2006 Cornelius Schumacher ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "htmlview.h" #include #include #include #include #include "defaultprovider.h" HtmlView::HtmlView( QWidget *parent ) : QTextBrowser( parent ), mZoomStep( 10 ) { this->setReadOnly(true); this->setOpenLinks(false); // get only the signal below this->setTextInteractionFlags(Qt::NoTextInteraction | Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard); connect (this, SIGNAL(anchorClicked(QUrl)), this, SIGNAL(openUrl(QUrl))); } void HtmlView::setTitle( const QString &title ) { mTitle = title; } void HtmlView::setStylesheetFile( const QString &style ) { const QString file = QString("styles/%1").arg(style); const QString stylesheetFile = DefaultProvider::self()->locateFile(file); if( QFile::exists(stylesheetFile) ) { qDebug () << "Found this stylefile: " << stylesheetFile; mStyles = readStyles(stylesheetFile); } else { qDebug() << "Unable to find stylesheet file "<< style; mStyles.clear(); } } void HtmlView::zoomIn() { // setZoomFactor( zoomFactor() + mZoomStep ); updateZoomActions(); } void HtmlView::zoomOut() { // setZoomFactor( zoomFactor() - mZoomStep ); updateZoomActions(); } void HtmlView::updateZoomActions() { // mZoomInAction->setEnabled( zoomFactor() + mZoomStep <= 300 ); // mZoomOutAction->setEnabled( zoomFactor() - mZoomStep > 100 ); // Prefs::self()->setZoomFactor( zoomFactor() ); } QString HtmlView::topFrame( ) const { QStringList stringList; stringList << QLatin1String(""); stringList << QLatin1String(""); if(!mTitle.isEmpty()) { stringList << QString("%1").arg( mTitle ); } stringList << QLatin1String(""); return stringList.join(QChar('\n')); } QString HtmlView::readStyles(const QString& styleFile) const { QFile file(styleFile); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QString styles; QFileInfo fi(styleFile); const QString base = fi.path()+"/"; QTextStream textStream(&file); while( !textStream.atEnd() ) { QString line = textStream.readLine().trimmed(); if( line.startsWith("background-image:url(") ) { QString relative = line.remove(0, 21); // remove background... relative.prepend(base); line = QString( "background-image:url(%1").arg(relative); } line.append('\n'); styles.append(line); } // qDebug() << "+++++++++++++++++++++++++++++++++++++++++++++" << styles; return styles; } return QString(); } QString HtmlView::bottomFrame() const { const QString t("\n" ""); return t; } void HtmlView::displayContent( const QString& content ) { // on empty content just clear and leave. if( content.isEmpty() ) { this->clear(); return; } const QString out = topFrame() + content + bottomFrame(); const QString s = mStyles; #ifdef QT_DEBUG // this file gets written and removed immediately, so if it should be kept, // set the autoDelete to false QTemporaryFile tempFile("/tmp/kraft_XXXXXX"); // tempFile.setAutoRemove(false); if (tempFile.open()) { const QString fName = tempFile.fileName(); qDebug() << "########## HtmlView output written to" << fName; QTextStream outStream(&tempFile); outStream << s; outStream << "##############"; outStream << out; tempFile.close(); } #endif this->document()->setDefaultStyleSheet(s); setHtml(out); } kraft-1.2.2/src/htmlview.h000066400000000000000000000035201467704360200154330ustar00rootroot00000000000000 /*************************************************************************** htmlview.h - show a html page ------------------- begin : Aug 2006 copyright : (C) 2006 Klaas Freitag (C) 2006 Cornelius Schumacher ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef HTMLVIEW_H #define HTMLVIEW_H #include #include class QUrl; class HtmlView : public QTextBrowser { Q_OBJECT public: HtmlView( QWidget *parent = 0); QString title() const { return mTitle; } public slots: void setTitle( const QString & ); void setStylesheetFile( const QString & ); void displayContent( const QString& ); void zoomIn(); void zoomOut(); protected: void updateZoomActions(); signals: void openUrl( const QUrl& ); private: QString topFrame() const; QString bottomFrame() const; QString readStyles(const QString &styleFile) const; QString mTitle; QString mInternalUrl; QString mStyles; QAction *mZoomInAction; QAction *mZoomOutAction; int mZoomStep; }; #endif kraft-1.2.2/src/identity.ui000066400000000000000000000067001467704360200156160ustar00rootroot00000000000000 manualOwnIdentity 0 0 586 428 Form Name: Organization: Street: Post code: City: Phone: Fax: Mobile phone: Email: Website: kraft-1.2.2/src/importfilter.cpp000066400000000000000000000211011467704360200166420ustar00rootroot00000000000000/*************************************************************************** importfilter.cpp - Import positions into Kraft documents ------------------- begin : Oct 2008 copyright : (C) 2008 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for QT #include #include #include #include #include #include #include #include #include "importfilter.h" #include "unitmanager.h" #include "defaultprovider.h" ImportFilter::ImportFilter() : mStrict( true ) { } bool ImportFilter::readDefinition( const QString& name ) { QString defFile = name; if ( ! name.startsWith( "/" ) ) { QString defFileName = QString( name ).toLower(); QString findFile = kdeStdDirPath() + defFileName; // qDebug () << "KDE StdDir Path: " << findFile; defFile = QStandardPaths::locate(QStandardPaths::GenericDataLocation, findFile); if ( defFile.isEmpty() ) { mError = i18n( "Unable to find filter called %1", name ); return false; } } // qDebug () << "Reading definition file " << defFile; QFile f( defFile ); if ( !f.open( QIODevice::ReadOnly ) ) { mError = i18n( "Could not open the definition file!" ); return false; } QTextStream t( &f ); t.setCodec("UTF-8"); while ( !t.atEnd() ) { mDefinition << t.readLine(); } f.close(); return true; } bool ImportFilter::parse() { return true; } bool ImportFilter::recode( const QString& file, const QString& outfile ) { if ( mEncoding.isEmpty() ) return true; QString cmd = DefaultProvider::self()->iconvTool(); if ( QFile::exists( cmd ) ) { QStringList args = QStringList() << "-f" << mEncoding << "-t" << "utf-8" << "-o" << outfile << file; int result = QProcess::execute( cmd, args ); Q_UNUSED(result); // qDebug () << "Recode finished with exit code " << result; return true; } else { // qDebug () << "Recode-tool does not exist!"; } return false; } // ########################################################################### DocPositionImportFilter::DocPositionImportFilter() :ImportFilter( ) { } QString DocPositionImportFilter::kdeStdDirPath() const { QString re = QString::fromLatin1( "kraft/importfilter/positions/" ); return re; } #define FILTER_TAG( x, y ) x bool DocPositionImportFilter::parseDefinition() { bool ret = true; for ( QStringList::Iterator it = mDefinition.begin(); it != mDefinition.end(); ++it ) { QString l = ( *it ).trimmed(); if ( l.isEmpty() || l.startsWith( "#" ) ) { // continue - whitespace.... } else if ( l.startsWith( FILTER_TAG( "amount:", "amount of the item" ), Qt::CaseInsensitive ) ) { mAmount = ( l.right( l.length()-7 ) ).trimmed(); } else if ( l.startsWith( FILTER_TAG( "text:", "The item text" ), Qt::CaseInsensitive ) ) { mText = ( l.right( l.length()-5 ) ).trimmed(); mText.replace( "
              ", QChar( 0x0A ) ); } else if ( l.startsWith( FILTER_TAG( "unit:", "The item unit" ), Qt::CaseInsensitive ) ) { mUnit = ( l.right( l.length()-5 ) ).trimmed(); } else if ( l.startsWith( FILTER_TAG( "unit_price:", "unit price" ), Qt::CaseInsensitive ) ) { mUnitPrice = ( l.right( l.length()-11 ) ).trimmed(); } else if ( l.startsWith( FILTER_TAG( "name:", "The name of the filter" ), Qt::CaseInsensitive ) ) { mName = ( l.right( l.length()-5 ) ).trimmed(); } else if ( l.startsWith( FILTER_TAG( "description:", "The filter description" ), Qt::CaseInsensitive ) ) { mDescription = ( l.right( l.length()-12 ) ).trimmed(); } else if ( l.startsWith( FILTER_TAG("encoding:", "The encoding of the source file" ), Qt::CaseInsensitive ) ) { mEncoding = ( l.right( l.length()-9 ) ).trimmed(); } else if ( l.startsWith( FILTER_TAG( "separator:", "The separator used in the source file" ), Qt::CaseInsensitive ) ) { // qDebug () << "Separator found: " << l.right( l.length()-10 ); mSeparator = ( l.right( l.length()-10 ) ).trimmed(); } else if ( l.startsWith( FILTER_TAG( "tags:", "Comma separated list of tags for one item" ), Qt::CaseInsensitive ) ) { mTags = ( l.right( l.length()-5 ) ).trimmed(); } else { // qDebug () << "WRN: Unknown filter tag found: " << l; if ( mError.isEmpty() ) mError = i18n( "Unknown tags: " ); mError.append( l ); ret = false; } } if ( mSeparator.isEmpty() ) { mSeparator = QString::fromLatin1( ";" ); } return ret; } void DocPositionImportFilter::debugDefinition() { // qDebug () << "Amount: " << mAmount; // qDebug () << "Unit: " << mUnit; // qDebug () << "UnitPrice: " << mUnitPrice; // qDebug () << "Text: " << mText; // qDebug () << "Separator: <" << mSeparator << ">"; } DocPositionList DocPositionImportFilter::import( const QUrl &inFile ) { DocPositionList list; bool copied = false; if( !inFile.isLocalFile() ) return list; QString file( inFile.toLocalFile() ); // in case we have to recode, the source file needs to be copied. bool ok = true; if ( !mEncoding.isEmpty() ) { file += ".tmp"; copied = true; // qDebug () << "Encoding file to " << file; ok = recode( inFile.toLocalFile(), file ); if ( !ok ) { // qDebug () << "Recoding failed!"; mError = i18n( "Could not recode input file!" ); } } QFile f( file ); if ( ! f.exists() ) { // qDebug () << "File " << file << " could not be found!"; mError = i18n( "Unable to open temp file " ) + file; ok = false; } if ( ok ) { if ( !f.open( QIODevice::ReadOnly ) ) { mError = i18n( "Could not open the import source file!" ); ok = false; } } if ( ok ) { QTextStream t( &f ); t.setCodec("UTF-8"); int cnt = 0; while ( !t.atEnd() ) { cnt++; QString l = t.readLine().trimmed(); // qDebug () << "Importing line " << l; if ( !( l.isEmpty() || l.startsWith( "#" ) ) ) { bool ok; DocPosition dp = importDocPosition( l, ok ); if ( ok ) list.append( new DocPosition( dp ) ); } } f.close(); } if ( copied ) { QFile::remove( file ); } return list; } // creates a DocPosition from one line of the imported file DocPosition DocPositionImportFilter::importDocPosition( const QString& l, bool& ok ) { QStringList parts = l.split( mSeparator, QString::KeepEmptyParts ); // qDebug () << "Importing raw line " << l; QString h; ok = true; DocPosition pos; // the text (mandatory) QString t = replaceCOL( parts, mText ); pos.setText( t ); QString unit = replaceCOL( parts, mUnit ); int unitId = UnitManager::self()->getUnitIDSingular( unit ); if ( unitId > -1 ) { pos.setUnit( UnitManager::self()->getUnit( unitId ) ); } else { pos.setUnit(Einheit( unit )); } // Amount. h = replaceCOL( parts, mAmount ); bool convOk = true; double a = h.toDouble( &convOk ); if ( convOk ) { pos.setAmount( a ); } else { // qDebug () << "WRN: Unable to convert amount to double: " << h; if ( mStrict ) ok = false; } // Unit Price h = replaceCOL( parts, mUnitPrice ); a = h.toDouble( &convOk ); if ( convOk ) { pos.setUnitPrice( Geld( a ) ); } else { // qDebug () << "WRN: Unable to convert unit price to double: " << h; if ( mStrict ) ok = false; } if ( !mTags.isEmpty() ) { QStringList tags = mTags.split(QRegExp( "\\s*,\\s*" )); for ( QStringList::Iterator it = tags.begin(); it != tags.end(); ++it ) { QString t = ( *it ).trimmed(); pos.setTag( t ); } } return pos; } QString DocPositionImportFilter::replaceCOL( const QStringList& cols, const QString& in ) { QString re( in ); for ( int i = 0; i < cols.size(); i++ ) { QString replacer = QString( "COL(%1)" ).arg( i+1 ); QString col = cols[i].trimmed(); re.replace( replacer, col, Qt::CaseInsensitive ); } // qDebug() << "replaced line: " << re; return re; } kraft-1.2.2/src/importfilter.h000066400000000000000000000043771467704360200163270ustar00rootroot00000000000000/*************************************************************************** importfilter.cpp - Import positions into Kraft documents ------------------- begin : Oct 2008 copyright : (C) 2008 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for QT #ifndef _IMPORTFILTER_H #define _IMPORTFILTER_H #include #include #include "docposition.h" class ImportFilter { public: ImportFilter(); virtual ~ImportFilter() { } virtual bool parse(); virtual QString kdeStdDirPath() const = 0; bool readDefinition( const QString& ); QString error() { return mError; } void setStrict( bool _strict ) { mStrict = _strict; } bool strict() { return mStrict; } QString name() { return mName; } QString description() { return mDescription; } protected: bool recode( const QString&, const QString& ); QString mName; QString mDescription; QString mEncoding; QString mError; QString mFilename; QString mSeparator; QString mTags; QStringList mDefinition; bool mStrict; }; class DocPositionImportFilter : public ImportFilter { public: DocPositionImportFilter( ); virtual ~DocPositionImportFilter( ) {} virtual QString kdeStdDirPath() const; bool parseDefinition(); DocPositionList import( const QUrl& ); void debugDefinition(); private: DocPosition importDocPosition( const QString&, bool& ); QString replaceCOL( const QStringList&, const QString& ); QString mAmount; QString mText; QString mUnit; QString mUnitPrice; }; #endif kraft-1.2.2/src/importitemdialog.cpp000066400000000000000000000141101467704360200174750ustar00rootroot00000000000000/*************************************************************************** importitemdialog.h - small dialog to import items into the document ------------------- begin : Nov 2008 copyright : (C) 2008 Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "importitemdialog.h" // include files for Qt #include #include #include #include #include #include #include #include #include #include #include #include "importfilter.h" #include "defaultprovider.h" #include "kraftsettings.h" #include "tagman.h" ImportItemDialog::ImportItemDialog( QWidget *parent ) : QDialog( parent ) { QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); setObjectName( "IMPORTITEMDIALOG" ); setModal( true ); setWindowTitle( i18n( "Import Items From File" ) ); QWidget *w = new QWidget(this); mBaseWidget = new Ui::importToDocBase; mBaseWidget->setupUi(w); mainLayout->addWidget(w); // Fill the tags list group = new QButtonGroup(this); group->setExclusive(false); QStringList tags = TagTemplateMan::self()->allTagTemplates(); int c = 0; QVBoxLayout *checkboxLayout = new QVBoxLayout; for ( QStringList::Iterator it = tags.begin(); it != tags.end(); ++it ) { QCheckBox *cb = new QCheckBox( *it ); group->addButton(cb, c); checkboxLayout->addWidget(cb); QString desc = TagTemplateMan::self()->getTagTemplate( *it ).description(); cb->setToolTip( desc ); mTagMap[c] = *it; c++; } checkboxLayout->addStretch(2); mBaseWidget->mTagGroup->setLayout(checkboxLayout); connect( mBaseWidget->mSchemaCombo, SIGNAL( activated( const QString& ) ), SLOT( slotSchemaChanged( const QString& ) ) ); QString selectName = readFilterSpecs(); if ( ! KraftSettings::self()->importItemsSchemaName().isEmpty() ) { selectName = KraftSettings::self()->importItemsSchemaName(); } mBaseWidget->mSchemaCombo->setCurrentIndex(mBaseWidget->mSchemaCombo->findText( selectName )); slotSchemaChanged( selectName ); if ( ! KraftSettings::self()->importItemsFileName().isEmpty() ) { mBaseWidget->mFileNameEdit->setText( KraftSettings::self()->importItemsFileName() ); } QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); } ImportItemDialog::~ImportItemDialog() { } QComboBox *ImportItemDialog::getPositionCombo() { return mBaseWidget->dmPositionCombo; } void ImportItemDialog::setPositionList( DocPositionList list, int intendedPos ) { if ( ! getPositionCombo() ) { qCritical() << "Can not get a ptr to the position combo"; return; } QStringList strList; strList << i18n( "the Header of the Document" ); DocPositionListIterator it( list ); while( it.hasNext() ) { DocPositionBase *dpb = it.next(); DocPosition *dp = static_cast( dpb ); QString h = QString( "%1. %2" ).arg( list.posNumber( dp ) ).arg( dp->text() ); if ( h.length() > 50 ) { h = h.left( 50 ); h += i18n( "…" ); } strList.append( h ); } getPositionCombo()->insertItems(-1, strList ); getPositionCombo()->setCurrentIndex( intendedPos ); } QString ImportItemDialog::readFilterSpecs() { QString filter = QString::fromLatin1( "kraft/importfilter/positions/*.ftr" ); QStringList filters = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, filter); QStringList combo; QString firstFilter; for ( QStringList::Iterator it = filters.begin(); it != filters.end(); ++it ) { // qDebug () << " -> Import filter file " << *it; DocPositionImportFilter filter; filter.readDefinition( *it ); filter.parseDefinition(); combo << filter.name(); if( firstFilter.isEmpty() ) firstFilter = filter.name(); mFilterMap[filter.name()] = filter; } mBaseWidget->mSchemaCombo->insertItems(-1, combo ); return firstFilter; } void ImportItemDialog::slotSchemaChanged( const QString& name ) { QString desc = mFilterMap[name].description(); mBaseWidget->mSchemaInfo->setText( desc ); } DocPositionList ImportItemDialog::positionList() { DocPositionList list; QUrl url = QUrl::fromLocalFile(mBaseWidget->mFileNameEdit->text()); if ( ! url.isEmpty() ) { DocPositionImportFilter filter = mFilterMap[mBaseWidget->mSchemaCombo->currentText()]; list = filter.import( url ); // get the tags QStringList tags; QMap::Iterator it; for ( it = mTagMap.begin(); it != mTagMap.end(); ++it ) { QCheckBox *b = static_cast( group->button( it.key() ) ); if ( b->isChecked() ) tags.append( it.value() ); } if ( tags.size() > 0 ) { DocPositionListIterator posIt( list ); while( posIt.hasNext() ) { DocPositionBase *dp = posIt.next(); for ( QStringList::Iterator it = tags.begin(); it != tags.end(); ++it ) { dp->setTag( *it ); } } } } return list; } /* END */ kraft-1.2.2/src/importitemdialog.h000066400000000000000000000035301467704360200171460ustar00rootroot00000000000000/*************************************************************************** importitemdialog.h - small dialog to import items into the document ------------------- begin : Nov 2008 copyright : (C) 2008 Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef IMPORTITEMDIALOG_H #define IMPORTITEMDIALOG_H #include #include #include #include #include "ui_importtodocbase.h" #include "templtopositiondialogbase.h" #include "docposition.h" #include "importfilter.h" class importToDocBase; class DocPositionList; class ImportItemDialog: public QDialog { Q_OBJECT public: ImportItemDialog( QWidget* ); ~ImportItemDialog(); void setPositionList( DocPositionList, int ); DocPositionList positionList(); QComboBox *getPositionCombo(); signals: void positionImported( const DocPosition& ); protected slots: void slotSchemaChanged( const QString& ); protected: QString readFilterSpecs(); private: Ui::importToDocBase *mBaseWidget; QButtonGroup *group; QMap mFilterMap; QMap mTagMap; }; #endif kraft-1.2.2/src/importtodocbase.ui000066400000000000000000000113501467704360200171600ustar00rootroot00000000000000 importToDocBase 0 0 524 309 0 0 18 75 true Import Document Items Qt::PlainText false Import information Select a &File to import from: false FixMe! Import &Schema: false mSchemaCombo 0 66 this is interesting information about the selected schema Qt::RichText Qt::AlignTop true 5 Insert all Items &after false dmPositionCombo Tags kraft-1.2.2/src/impviewwidgets.cpp000066400000000000000000000037471467704360200172110ustar00rootroot00000000000000/*************************************************************************** impviewwidgets.cpp - Improved view widgets ------------------- begin : Sun Nov 29 2009 copyright : (C) 2009 by Klaas Freitag and Thomas Richard email : freitag@kde.org, thomas.richard@proan.be ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include #include #include #include #include #include #include "impviewwidgets.h" ImpTreeView::ImpTreeView(QWidget *parent ) : QTreeView(parent) {} void ImpTreeView::setModel ( QAbstractItemModel * model ) { connect(model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), this, SLOT(headerDataChanged(Qt::Orientation,int,int))); QTreeView::setModel(model); } void ImpTreeView::headerDataChanged(Qt::Orientation orientation, int first, int last) { if(orientation == Qt::Vertical) { for(int i = first; i <= last; ++i) { QVariant sign = model()->headerData(i, orientation); if (sign == QString ("!")) setRowHidden(i, QModelIndex(), true); else setRowHidden(i, QModelIndex(), false); } } } void ImpTreeView::unhideRows() { for(int i = 0; i < model()->rowCount(); ++i) setRowHidden(i, QModelIndex(), false); } kraft-1.2.2/src/impviewwidgets.h000066400000000000000000000026521467704360200166500ustar00rootroot00000000000000/*************************************************************************** impviewwidgets.h - Improved view widgets ------------------- begin : Sun Nov 29 2009 copyright : (C) 2009 by Klaas Freitag and Thomas Richard email : freitag@kde.org, thomas.richard@proan.be ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef IMPVIEWWIDGETS_H #define IMPVIEWWIDGETS_H #include class QWidget; class QAbstractItemModel; class ImpTreeView : public QTreeView { Q_OBJECT public: ImpTreeView(QWidget *parent = 0); void setModel ( QAbstractItemModel * model ); void unhideRows(); private slots: void headerDataChanged(Qt::Orientation orientation, int first, int last); }; #endif kraft-1.2.2/src/inserttempldialog.cpp000066400000000000000000000150601467704360200176570ustar00rootroot00000000000000/*************************************************************************** inserttemplatedialog.cpp - small dialog to insert templates into documents ------------------- begin : Sep 2006 copyright : (C) 2006 Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "inserttempldialog.h" // include files for Qt #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ui_inserttmplbase.h" #include "templtopositiondialogbase.h" #include "katalog.h" #include "einheit.h" #include "unitmanager.h" #include "defaultprovider.h" #include "kraftsettings.h" #include "tagman.h" InsertTemplDialog::InsertTemplDialog( QWidget *parent ) : TemplToPositionDialogBase( parent ) { QWidget *w = new QWidget( this ); mBaseWidget = new Ui::insertTmplBase; mBaseWidget->setupUi( w ); mBaseWidget->dmUnitCombo->insertItems( -1, UnitManager::self()->allUnits() ); mBaseWidget->mPriceVal->setSuffix( DefaultProvider::self()->currencySymbol() ); mBaseWidget->dmAmount->setDecimals( 2 ); mBaseWidget->dmAmount->setRange( 0, 100000 ); mBaseWidget->dmAmount->setSingleStep( 1 ); // mBaseWidget->dmAmount->setSteps( 1, 10 ); // hide the chapter combo by default mBaseWidget->mKeepGroup->hide(); // Fill the tags list QGroupBox *group = mBaseWidget->mTagGroup; QVBoxLayout *groupLay = new QVBoxLayout; group->setLayout( groupLay ); QStringList tags = TagTemplateMan::self()->allTagTemplates(); int cnt = 0; for ( QStringList::Iterator it = tags.begin(); it != tags.end(); ++it ) { QCheckBox *cb = new QCheckBox( *it ); groupLay->insertWidget( cnt++, cb ); mTagMap[cb] = *it; } groupLay->addStretch(); QVBoxLayout *lay = new QVBoxLayout(this); lay->setMargin(0); lay->addWidget(w); setLayout(lay); connect(mBaseWidget->mButtonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(mBaseWidget->mButtonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); } void InsertTemplDialog::setDocPosition(DocPosition *dp, bool isNew , bool showPrices) { if ( dp ) { mParkPosition = *dp; mBaseWidget->dmTextEdit->setPlainText( prepareText(mParkPosition.text()) ); mBaseWidget->dmAmount->setValue( mParkPosition.amount() ); mBaseWidget->dmUnitCombo->setCurrentIndex(mBaseWidget->dmUnitCombo->findText( mParkPosition.unit().einheit( 1.0 ))); mBaseWidget->mPriceVal->setValue( mParkPosition.unitPrice().toDouble() ); if ( mParkPosition.text().isEmpty() ) { mBaseWidget->dmHeaderText->setText( i18n( "Create a New Item" ) ); } else { mBaseWidget->dmHeaderText->setText( i18n( "Create a New Item from Template" ) ); } if ( isNew ) { mBaseWidget->dmTextEdit->setFocus(); } else { mBaseWidget->dmAmount->setFocus(); } mBaseWidget->mPriceVal->setVisible(showPrices); mBaseWidget->priceBoxTextLabel->setVisible(showPrices); } } #define QL1(x) QLatin1String(x) QString InsertTemplDialog::prepareText( const QString& input ) { QString in(input); QLocale *locale = DefaultProvider::self()->locale(); QString dateStr = locale->toString( QDate::currentDate() ); in.replace(QL1("{{DATE}}"), dateStr, Qt::CaseInsensitive); QString timeStr = locale->toString(QTime::currentTime()); in.replace(QL1("{{TIME}}"), timeStr, Qt::CaseInsensitive); if( in.contains(QL1("{{USERNAME}}"))) { struct passwd *pw; uid_t uid; uid = geteuid (); pw = getpwuid (uid); if (pw) { in.replace(QL1("{{USERNAME}}"), QString::fromUtf8(pw->pw_gecos), Qt::CaseInsensitive); } } return in; } QComboBox *InsertTemplDialog::getPositionCombo() { return mBaseWidget->dmPositionCombo; } DocPosition InsertTemplDialog::docPosition() { mParkPosition.setText( mBaseWidget->dmTextEdit->toPlainText() ); mParkPosition.setAmount( mBaseWidget->dmAmount->value() ); mParkPosition.setUnitPrice( Geld( mBaseWidget->mPriceVal->value() ) ); int uid = UnitManager::self()->getUnitIDSingular( mBaseWidget->dmUnitCombo->currentText() ); mParkPosition.setUnit( UnitManager::self()->getUnit( uid ) ); // mParkPosition.setPosition( itemPos ); QMapIterator i(mTagMap); while (i.hasNext()) { i.next(); if( i.key()->isChecked() ) { mParkPosition.setTag( i.value() ); } } // qDebug () << "in the dialog: " << mParkPosition.tags(); return mParkPosition; } InsertTemplDialog::~InsertTemplDialog() { QString c = mBaseWidget->mComboChapter->currentText(); if ( ! c.isEmpty() ) { KraftSettings::self()->setInsertTemplChapterName( c ); KraftSettings::self()->save(); } } void InsertTemplDialog::setCatalogChapters( const QList& chapters, const QString& selectedChap) { if ( chapters.count() > 0 ) { QStringList chapterNames; for( CatalogChapter chapter: chapters ) { if (!chapter.name().isEmpty()) chapterNames.append( chapter.name() ); } mBaseWidget->mKeepGroup->show(); mBaseWidget->mComboChapter->insertItems( -1, chapterNames ); QString selChap { selectedChap }; if (!selectedChap.isEmpty()) { mBaseWidget->mKeepGroup->setChecked(true); } else { selChap = KraftSettings::self()->insertTemplChapterName(); } if (!selChap.isEmpty() && chapterNames.contains(selChap)) mBaseWidget->mComboChapter->setCurrentIndex(mBaseWidget->mComboChapter->findText(selChap)); } } // return only a chapter if the checkbox is checked. QString InsertTemplDialog::chapter() const { QString re; if ( mBaseWidget->mKeepGroup->isChecked() ) re = mBaseWidget->mComboChapter->currentText(); return re; } /* END */ kraft-1.2.2/src/inserttempldialog.h000066400000000000000000000034431467704360200173260ustar00rootroot00000000000000/*************************************************************************** inserttemplatedialog.h - small dialog to insert templates into documents ------------------- begin : Sep 2006 copyright : (C) 2006 Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef INSERTTEMPLDIALOG_H #define INSERTTEMPLDIALOG_H #include #include #include "docposition.h" #include "templtopositiondialogbase.h" #include "ui_inserttmplbase.h" class QCheckBox; class InsertTemplDialog: public TemplToPositionDialogBase { Q_OBJECT public: InsertTemplDialog( QWidget* ); ~InsertTemplDialog(); void setDocPosition( DocPosition*, bool, bool ) override; DocPosition docPosition() override; void setCatalogChapters( const QList&, const QString& selectedChap) override; QString chapter() const override; protected: QComboBox *getPositionCombo() override; private: QString prepareText( const QString& input ); Ui::insertTmplBase *mBaseWidget; DocPosition mParkPosition; QMap mTagMap; }; #endif kraft-1.2.2/src/inserttmplbase.ui000066400000000000000000000155721467704360200170300ustar00rootroot00000000000000 insertTmplBase 0 0 584 492 0 0 18 true Create Item from Template Qt::TextFormat::PlainText false New Item Text &insert false dmAmount 999999.989999999990687 à false -999999.989999999990687 999999.989999999990687 Qt::Orientation::Horizontal QSizePolicy::Policy::Expanding 70 20 &after item false dmPositionCombo Qt::Orientation::Horizontal QSizePolicy::Policy::Preferred 21 20 Keep &this item as template for future documents true false 0 0 save in &chapter false mComboChapter Qt::Orientation::Horizontal QSizePolicy::Policy::Preferred 159 20 Tags QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok kraft-1.2.2/src/itemtagdialog.cpp000066400000000000000000000115471467704360200167510ustar00rootroot00000000000000/*************************************************************************** postiontagdialog.h - Edit tags of positions ------------------- begin : Aug 2008 copyright : (C) 2008 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "itemtagdialog.h" #include "defaultprovider.h" #include "tagman.h" class TagDelegate : public QItemDelegate { public: TagDelegate( QObject *parent = 0 ); void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const; }; TagDelegate::TagDelegate( QObject *parent ) :QItemDelegate( parent ) { } void TagDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const { //If we're in the color column if(index.column() == 1) { QColor c( index.model()->data(index, Qt::DisplayRole).toString() ); QBrush b( c ); int x = option.rect.left(); int y = option.rect.top(); int height = option.rect.height(); int width = option.rect.width(); qDrawShadeRect( painter, x+5, y+4, width-10, height-8, c, false, 1, 0, &b ); } else { QItemDelegate::paint(painter, option, index); } } // ################################################################################ ItemTagDialog::ItemTagDialog( QWidget *parent ) : QDialog( parent ) { setObjectName( "ITEM_TAG_DIALOG" ); setModal( true ); setWindowTitle( i18n("Edit Item Tags" ) ); QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); setMinimumWidth ( 375 ); mainLayout->addWidget( new QLabel( QString::fromLatin1( "

              " ) + i18n( "Item Tags" ) + QString::fromLatin1( "

              " ), this ) ); mainLayout->addWidget( new QLabel( i18n( "Select all tags for the item should be tagged with." ), this) ); mListView = new QTreeWidget( this ); mListView->setAlternatingRowColors( true ); mListView->setItemDelegate(new TagDelegate()); mListView->setContentsMargins ( 3, 3, 3, 3 ); QPalette palette; palette.setColor(QPalette::AlternateBase, QColor( "#dffdd0" )); mListView->setPalette(palette); mListView->setHeaderHidden(true); mListView->setRootIsDecorated( false ); mListView->setColumnCount( 3 ); QStringList headers; headers << i18n( "Tag" ); headers << i18n( "Color" ); headers << i18n( "Description" ); mListView->setHeaderLabels( headers ); mListView->setSelectionMode( QAbstractItemView::NoSelection ); mListView->setColumnWidth(1, 50); mainLayout->addWidget(mListView); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); } ItemTagDialog::~ItemTagDialog() { } void ItemTagDialog::setPositionTags( const QStringList& checkedTags ) { QStringList allTags = TagTemplateMan::self()->allTagTemplates(); foreach( QString string, allTags ) { TagTemplate templ = TagTemplateMan::self()->getTagTemplate( string ); QStringList contents; contents << templ.name(); contents << templ.color().name(); contents << templ.description(); QTreeWidgetItem *item = new QTreeWidgetItem( mListView, contents ); if(checkedTags.contains(templ.name())) item->setCheckState( 0, Qt::Checked ); else item->setCheckState( 0, Qt::Unchecked ); } } QStringList ItemTagDialog::getSelectedTags() { QStringList re; QTreeWidgetItem *item = mListView->topLevelItem( 0 ); while ( item ) { if( item->checkState( 0 ) == Qt::Checked ) { re << item->text( 0 ); } item = mListView->itemBelow( item ); } return re; } kraft-1.2.2/src/itemtagdialog.h000066400000000000000000000025751467704360200164170ustar00rootroot00000000000000/*************************************************************************** postiontagdialog.h - Edit tags of positions ------------------- begin : Aug 2008 copyright : (C) 2008 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef ITEMTAGDIALOG_H #define ITEMTAGDIALOG_H #include #include class QWidget; class QStringList; class QTreeWidget; class QTreeWidgetItem; class ItemTagDialog: public QDialog { Q_OBJECT public: ItemTagDialog( QWidget* ); virtual ~ItemTagDialog( ); void setPositionTags( const QStringList& checkedTags); QStringList getSelectedTags(); private: QTreeWidget* mListView; QMap mItemMap; }; #endif kraft-1.2.2/src/katalog.cpp000066400000000000000000000154171467704360200155610ustar00rootroot00000000000000/*************************************************************************** katalog.cpp - Abstrakte Katalogklasse ------------------- begin : Son Feb 8 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include "floskeltemplate.h" #include "dbids.h" #include "katalog.h" #include "kraftdb.h" #include "unitmanager.h" #include "timecalcpart.h" #include "fixcalcpart.h" #include "materialcalcpart.h" #include "defaultprovider.h" #include /** * constructor of a katalog, which is only a list of Floskel templates. * A name must be given, which is displayed for the root element in the * */ Katalog::Katalog(const QString& name): m_name(name), m_setID(-1), m_readOnly( false ), mChapterListNeedsRefresh( true ) { init(); } Katalog::Katalog(): m_setID(-1), m_readOnly( false ), mChapterListNeedsRefresh( true ) { init(); } void Katalog::init() { // FIXME: Catalogs could have their own locale in the future mLocale = DefaultProvider::self()->locale(); } Katalog::~Katalog() { } /** * virtuell load method for catalogs. */ int Katalog::load() { // CREATE TABLE CatalogSet( // catalogSetID INTEGER PRIMARY KEY ASC autoincrement, // name VARCHAR(255), // description VARCHAR(255), // catalogType VARCHAR(64), // sortKey INT NOT NULL // ); // QSqlQuery q; q.prepare("SELECT catalogSetID, description FROM CatalogSet WHERE name = :name"); q.bindValue(":name", m_name); q.exec(); if( q.next() ) { m_setID = q.value(0).toInt(); m_description = q.value(1).toString(); // qDebug () << "Setting catalogSetID=" << m_setID << " from name " << m_name; } return 0; } QList Katalog::getKatalogChapters( bool freshup ) { if( mChapters.empty() || freshup || mChapterListNeedsRefresh ) { mChapters.clear(); // CREATE TABLE CatalogChapters( // chapterID INTEGER PRIMARY KEY ASC autoincrement, // catalogSetID INT NOT NULL, // chapter VARCHAR(255), // sortKey INT NOT NULL // ); QSqlQuery q; q.prepare("SELECT chapterID, chapter, parentChapter, description FROM CatalogChapters WHERE " "catalogSetId = :catalogSetId ORDER BY parentChapter, sortKey"); q.bindValue(":catalogSetId", m_setID); q.exec(); // qDebug () << "Selecting chapters for catalog no " << QString::number( m_setID ); while ( q.next() ) { int chapID = q.value(0).toInt(); QString chapterName = q.value(1).toString(); int parentChapter = q.value(2).toInt(); QString desc = q.value(3).toString(); // qDebug () << "Adding catalog chapter " << chapterName << " with ID " << chapID; CatalogChapter c( chapID, m_setID, chapterName, parentChapter, desc ); mChapters.append( c ); } mChapterListNeedsRefresh = false; } return mChapters; } QString Katalog::chapterName(const dbID& id) { foreach( CatalogChapter chapter, mChapters ) { if( chapter.id() == id ) { return chapter.name(); } } return i18n("not found"); } dbID Katalog::chapterID( const QString& name ) { foreach( CatalogChapter chapter, mChapters ) { if( chapter.name() == name ) { return chapter.id(); } } return dbID(); } QString Katalog::getName() const { return m_name; } void Katalog::setName( const QString& n ) { m_name = n; } // Needs reimplementation in the inherited catalogs KatalogType Katalog::type() { return UnspecCatalog; } void Katalog::refreshChapterList() { mChapterListNeedsRefresh = true; } void Katalog::setChapterSortKey( const QString& chap, int key ) { // qDebug () << "Set chapter sortKey for " << chap << " to " << key; QSqlQuery q; q.prepare("UPDATE CatalogChapters SET sortKey = :sortKey WHERE catalogSetID = :catalogSetID AND chapter = :chapter"); q.bindValue(":catalogSetID", m_setID); q.bindValue(":chapter", chap); q.bindValue(":sortKey", key); q.exec(); } int Katalog::chapterSortKey( const QString& chap ) { int key = -1; QSqlQuery q; q.prepare("SELECT sortKey FROM CatalogChapters WHERE chapter = :chapter"); q.bindValue(":chapter", chap); q.exec(); if(q.next()) { key = q.value(0).toInt(); } return key; } QPair Katalog::usageCount(int id) { QSqlQuery q; q.prepare("SELECT usageCount, lastUsed FROM catItemUsage WHERE catId=:catId AND itemId=:itemId"); q.bindValue(":catId", this->id().toInt()); q.bindValue(":itemId", id); q.exec(); int cnt {0}; QDateTime lu; if (q.next()) { cnt = q.value(0).toInt(); lu = q.value(1).toDateTime(); } return QPair (cnt, lu) ; } QPair Katalog::recordUsage(int id) { QSqlQuery q; const QDateTime dt { QDateTime::currentDateTime() }; const QString ts { dt.toString("yyyy-MM-ddThh:mm:ss") }; int catId = this->id().toInt(); int usage = usageCount(id).first; if (usage == 0) { q.prepare("INSERT INTO catItemUsage (catId, itemId, usageCount, lastUsed) VALUES (:catId, :itemId, :usage, :timeStamp)"); } else { q.prepare("UPDATE catItemUsage SET usageCount=:usage, lastUsed=:timeStamp WHERE catId=:catId AND itemId=:itemId"); } usage += 1; q.bindValue(":usage", usage); q.bindValue(":catId", catId); q.bindValue(":itemId", id); q.bindValue(":timeStamp", ts); if (!q.exec()) qDebug() << q.executedQuery() << q.lastError(); return QPair(usage, dt); } void Katalog::deleteUsageRecord(int id) { QSqlQuery q; q.prepare("DELETE FROM catItemUsage WHERE catId=:catId AND itemId=:itemId"); q.bindValue(":catId", this->id().toInt()); q.bindValue(":itemId", id); q.exec(); if (!q.exec()) qDebug() << q.executedQuery() << q.lastError(); } QDomDocument Katalog::toXML() { return QDomDocument(); } void Katalog::writeXMLFile() { } dbID Katalog::id() { return dbID( m_setID ); } kraft-1.2.2/src/katalog.h000066400000000000000000000061721467704360200152240ustar00rootroot00000000000000/*************************************************************************** katalog.h - ------------------- begin : Son Feb 8 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef KATALOG_H #define KATALOG_H #include #include #include "floskeltemplate.h" #include "catalogchapter.h" #include "dbids.h" /** *@author Klaas Freitag */ typedef enum {UnspecCatalog, MaterialCatalog, TemplateCatalog, PlantCatalog } KatalogType; class QDomDocument; class KRAFTCAT_EXPORT Katalog { public: Katalog(); Katalog(const QString& ); virtual ~Katalog(); virtual int load(); /** * reload the item with the given id or the entire catalog in case * the id is not valid. */ virtual void reload( dbID ) = 0; virtual void setName( const QString& ); virtual QString getName( ) const; /** find the ID for the corresponding chapter */ virtual dbID chapterID(const QString&); /** get a list of all existing chapters of this catalog */ virtual QList getKatalogChapters( bool freshup = false ); /** get the chapter name for the given ID */ virtual QString chapterName(const dbID&); /** set the sortkey for a chapter. Note: The organisation of the sortkeys * between the different chapters is up to the caller of this method. */ virtual void setChapterSortKey( const QString&, int ); virtual int chapterSortKey( const QString& ); /** * returns the KatalogType. */ virtual KatalogType type(); /** get the amount of entries in a chapter or the entire catalog */ virtual int getEntriesPerChapter( const CatalogChapter& ) = 0; bool isReadOnly() { return m_readOnly; } void setReadOnly( bool state ) { m_readOnly = state; } void refreshChapterList(); virtual QDomDocument toXML(); virtual void writeXMLFile(); virtual QPair usageCount(int id); virtual QPair recordUsage(int id); dbID id(); QLocale *locale() { return mLocale; } protected: void deleteUsageRecord(int id); QList mChapters; QString m_name; QString m_description; int m_setID; bool m_readOnly; bool mChapterListNeedsRefresh; QLocale *mLocale; private: void init(); }; #endif kraft-1.2.2/src/kataloglistview.cpp000066400000000000000000000475731467704360200173600ustar00rootroot00000000000000/*************************************************************************** kataloglistview.cpp - ------------------- begin : Son Feb 8 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include "kraftglobals.h" #include "katalog.h" #include "katalogman.h" #include "kataloglistview.h" #include "defaultprovider.h" #include "materialcalcpart.h" #include "stockmaterial.h" #include "templkatalog.h" #include "timecalcpart.h" #include "dbids.h" #include "catalogchapter.h" #include "addeditchapterdialog.h" KatalogListView::KatalogListView( QWidget *parent ) : QTreeWidget(parent), mCheckboxes( false ), m_root(0), mMenu(0), _query(nullptr) { setSelectionMode(QAbstractItemView::SingleSelection ); setAlternatingRowColors( true ); //Initialize common style options QPalette palette; palette.setColor( QPalette::AlternateBase, QColor("#e0fdd1") ); setPalette( palette ); setRootIsDecorated(false); setAnimated(true); // header()->setResizeMode(QHeaderView::ResizeToContents); // custom style const QString style = DefaultProvider::self()->getStyleSheet( "templcatalog"); setStyleSheet( style ); // Drag and Drop for normal mode, is changed in setSelectFromMode setSelectionMode( QAbstractItemView::SingleSelection ); setDragDropMode( QAbstractItemView::InternalMove ); setDragEnabled( true ); setAcceptDrops( true ); // currently only internal moves setDropIndicatorShown( true ); // setSorting(-1); mMenu = new QMenu( this ); mChapterFont = font(); mChapterFont.setBold( true ); connect( this, SIGNAL(itemActivated( QTreeWidgetItem*,int )), this, SLOT( slotItemEntered( QTreeWidgetItem*, int ))); } KatalogListView::~KatalogListView() { } QMenu *KatalogListView::contextMenu() { return mMenu; } void KatalogListView::addCatalogDisplay( const QString& name) { m_catalogName = name; } void KatalogListView::contextMenuEvent( QContextMenuEvent * event ) { mMenu->popup( event->globalPos() ); } Katalog* KatalogListView::catalog() { return KatalogMan::self()->getKatalog( m_catalogName ); } void KatalogListView::setSelectFromMode() { setSelectionMode( QAbstractItemView::SingleSelection /* NoSelection */ ); // FIXME: Allow multiple selections later setDragDropMode( QAbstractItemView::NoDragDrop ); setDragEnabled( false ); setAcceptDrops( false ); // currently only internal moves setDropIndicatorShown( false ); setCheckboxes( true ); } void KatalogListView::setupChapters() { Katalog *cat = catalog(); if( ! cat ) return; if( m_root ) { delete m_root; mChapterDict.clear(); } // qDebug () << "Creating root item!"; QStringList list; list << cat->getName(); m_root = new QTreeWidgetItem( this, list ); Qt::ItemFlags flags = m_root->flags(); flags = flags & ~Qt::ItemIsDragEnabled; m_root->setFlags(flags); m_root->setIcon( 0, DefaultProvider::self()->icon("kraft-simple")); m_root->setExpanded(true); m_root->setFont( 0, mChapterFont ); m_root->setToolTip( 0, QString() ); repaint(); const QList chapters = cat->getKatalogChapters( true ); // qDebug () << "Have count of chapters: " << chapters.size(); QList strayCats; foreach( CatalogChapter chapter, chapters ) { QTreeWidgetItem *item = tryAddingCatalogChapter( chapter ); if( ! item ) { strayCats.append( chapter ); } else { // qDebug () << "Creating katalog chapter item for " << chapter.name(); } } int oldStrayCatCount = strayCats.count() + 1; // to survive the first while condition while( strayCats.count() && strayCats.count() < oldStrayCatCount ) { QList newStrayCats; oldStrayCatCount = strayCats.count(); // loop as long as the overall number of straycats goes down in every round foreach( CatalogChapter chapter, strayCats ) { QTreeWidgetItem *katItem = tryAddingCatalogChapter( chapter ); if( katItem ) { // qDebug () << "Successfully added catalog chapter from strayCats"; } else { newStrayCats.append( chapter ); // qDebug () << "Failed to add a catalog chapter from stryCats"; } } strayCats = newStrayCats; } } QTreeWidgetItem *KatalogListView::tryAddingCatalogChapter( const CatalogChapter& chapter ) { int parentChapter = chapter.parentId().toInt(); int id = chapter.id().toInt(); QTreeWidgetItem *katItem = 0; if( parentChapter == 0 ) { katItem = new QTreeWidgetItem( m_root, QStringList( chapter.name() ) ); } else { if( mChapterDict.contains( parentChapter ) ) { katItem = new QTreeWidgetItem( mChapterDict[parentChapter], QStringList( chapter.name() ) ); katItem->setToolTip( 0, chapter.description() ); } } if( katItem ) { mChapterDict.insert( id, katItem ); katItem->setToolTip( 0, chapter.description() ); // katItem->setIcon( 0, chapter.icon() ); katItem->setFont( 0, mChapterFont ); // Store the parent-ID in the item data m_dataDict[katItem] = new CatalogChapter( chapter ); if ( mOpenChapters.contains( chapter.name() ) ) { katItem->setExpanded( true ); } } return katItem; } CatalogTemplateList KatalogListView::selectedTemplates() { CatalogTemplateList templates; if( mCheckboxes ) { // checkbox mode // add the checkboxed items. QTreeWidgetItemIterator it( this, QTreeWidgetItemIterator::Checked ); while (*it) { QTreeWidgetItem *item = *it; if( ! (isChapter( item ) || isRoot(item )) ) { // a template, not a chapter. void *data = itemData( item ); if( data ) templates.append( static_cast( data )); } item->setCheckState( 0, Qt::Unchecked ); ++it; } } // if no items were added yet, lets go for the selected ones. if( ! mCheckboxes || templates.isEmpty() ) { QList items = selectedItems(); foreach( QTreeWidgetItem* item, items ) { if( isChapter(item) && !isRoot(item) ) { // for chapters, the children are lined up. int kidCnt = item->childCount(); for( int i=0; i < kidCnt; i++ ) { QTreeWidgetItem *kid = item->child(i); if( kid && !isChapter(kid) ) { // only add normal templates. void *data = itemData(kid); if( data ) templates.append( static_cast(data)); } } } if( !(isChapter(item) || isRoot(item))) { void *data = itemData( item ); if( data ) templates.append( static_cast(data) ); } } } return templates; } QString KatalogListView::selectedCatalogChapter() { QList items = selectedItems(); QString chap; if (items.size() == 1) { QTreeWidgetItem *item = items.first(); if (!isChapter(item) && !isRoot(item)) { item = item->parent(); } if (isChapter(item)) { chap = static_cast(itemData(item))->name(); } } return chap; } void* KatalogListView::itemData( QTreeWidgetItem *item ) { if ( item && m_dataDict.contains( item ) ) { return m_dataDict[item]; } return 0; } void* KatalogListView::currentItemData() { return itemData( currentItem() ); } void KatalogListView::removeTemplateItem( QTreeWidgetItem *item ) { if (isChapter(item)) { QHashIterator it( mChapterDict ); while( it.hasNext() ) { it.next(); if ( it.value() == item ) { mChapterDict.remove(it.key()); break; } } } else { m_dataDict.remove( item ); } QTreeWidgetItem* parent = item->parent(); delete item; updateSort(parent); } bool KatalogListView::isChapter( QTreeWidgetItem *item ) { QHashIterator it( mChapterDict ); while( it.hasNext() ) { it.next(); if ( it.value() == item ) return true; } return false; } bool KatalogListView::isRoot( QTreeWidgetItem *item ) { return (item == m_root ); } void KatalogListView::setCheckboxes( bool cb ) { mCheckboxes = cb; } void KatalogListView::slotFreshupItem( QTreeWidgetItem*, void *, bool ) { } void KatalogListView::slotEditCurrentChapter() { QTreeWidgetItem *item = currentItem(); if( ! isChapter( item )) { // qDebug () << "Can only edit chapters!"; return; } CatalogChapter *chap = static_cast( itemData( item ) ); AddEditChapterDialog dia( this ); dia.setEditChapter( *chap ); if( dia.exec() ) { QString name = dia.name(); QString desc = dia.description(); if( name != chap->name() || desc != chap->description() ) { chap->setName( name ); chap->setDescription( desc ); chap->saveNameAndDesc(); item->setText( 0, name); item->setToolTip( 0, desc ); catalog()->refreshChapterList(); } } } void KatalogListView::slotRemoveCurrentChapter() { QTreeWidgetItem *item = currentItem(); if( ! isChapter( item )) { // qDebug () << "Can only remove chapters here!"; } if( item->childCount() > 0 ) { QMessageBox msgBox; msgBox.setText(i18n( "A catalog chapter cannot be deleted as long it has children." )); msgBox.setInformativeText(i18n("Chapter cannot be deleted")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return; } else { CatalogChapter *chap = static_cast( itemData( item ) ); if( chap ) { int id = chap->id().toInt(); if( chap->removeFromDB() ) { delete item; mChapterDict.remove(id); delete chap; } } } } void KatalogListView::slotCreateNewChapter() { QTreeWidgetItem *parentItem = currentItem(); if( ! (isChapter( parentItem ) || isRoot( parentItem ) ) ) { // qDebug () << "Not an chapter item selected, returning"; return; } AddEditChapterDialog dia( this ); dbID parentId = 0; if( ! isRoot( parentItem ) ) { CatalogChapter *parentChapter = static_cast(currentItemData()); dia.setParentChapter( *parentChapter ); parentId = parentChapter->id(); } if( dia.exec() ) { QString name = dia.name(); QString desc = dia.description(); CatalogChapter c; c.setName( name ); c.setDescription( desc ); c.setCatalogSetId( catalog()->id() ); c.setParentId( parentId ); c.save(); catalog()->refreshChapterList(); QTreeWidgetItem *newItem = tryAddingCatalogChapter( c ); if( newItem ) { this->scrollToItem( newItem ); this->setCurrentItem( newItem ); } updateSort(parentItem); } } void KatalogListView::dropEvent( QDropEvent *event ) { if (event->source() == this && (event->dropAction() == Qt::MoveAction || dragDropMode() == QAbstractItemView::InternalMove)) { QModelIndex dropParentIndex; int col = -1; int row = -1; QModelIndex dropIndx = indexAt( event->pos() ); QTreeWidgetItem *droppedOnItem = itemFromIndex( dropIndx ); if( ! droppedOnItem ) { event->ignore(); return; } row = dropIndx.row(); col = dropIndx.column(); dropParentIndex = dropIndx.parent(); DropIndicatorPosition dropIndiPos = this->dropIndicatorPosition(); QList indexes; { QList idxs = selectedIndexes(); // selectedIndexes() contains ALL indexes, also for columns. This is only about rows, // thus the indexes are filtered for row changes. int r {-1}; for (auto indx : idxs) { if (r != indx.row()) { indexes.append(QPersistentModelIndex(indx)); r = indx.row(); } } } // FIXME: Why is this? if (row == -1 || indexes.contains(dropParentIndex)) return; // When removing items the drop location could shift QPersistentModelIndex dropRow = model()->index(row, col, dropParentIndex); // Remove the items QList taken; for (int i = indexes.count() - 1; i >= 0; --i) { QTreeWidgetItem *movedItem = itemFromIndex(indexes.at(i)); if (!movedItem || !movedItem->parent()) { // would be root -> should never happen FIXME taken.append(takeTopLevelItem(indexes.at(i).row())); } else { int r0 = indexes.at(i).row(); taken.append(movedItem->parent()->takeChild(r0)); } } // insert them back in at their new positions for (int i = 0; i < indexes.count(); ++i) { // Either at a specific point or appended int r = 0; bool droppedInto {false}; if (dropIndiPos == QAbstractItemView::AboveItem) { r = dropRow.row(); if (r < 0) r = 0; } else if (dropIndiPos == QAbstractItemView::BelowItem) { r = dropRow.row()+1; } else { droppedInto = true; } dbID newParentId; QTreeWidgetItem *parent {nullptr}; // The item was dropped on a chapter item or root. That causes a change of the // parent chapter. if( isChapter( droppedOnItem )|| isRoot( droppedOnItem )) { if (droppedInto) { parent = droppedOnItem; } else { // The item was just "resorted", that just changes the sortIndicator. if (isRoot(droppedOnItem)) { parent = m_root; } else { parent = droppedOnItem->parent(); } } // the parent id has to be updated for all inserted items CatalogChapter *parentChap = static_cast(itemData(parent)); if( parentChap ) { newParentId = parentChap->id(); } else { newParentId = 0; } } else { // the item was dropped on another item. Still the parent might have changed. CatalogTemplate *tmpl = static_cast(itemData(droppedOnItem)); newParentId = tmpl->chapterId(); parent = droppedOnItem->parent(); } if( parent ) { QTreeWidgetItem *movedItem = taken.takeFirst(); if( newParentId.isOk() ) { if( isChapter( movedItem ) ) { if (movedItem->parent() != droppedOnItem->parent()) { CatalogChapter* chapDrop = static_cast(itemData(movedItem)); chapDrop->reparent( newParentId ); } } else if( isRoot( movedItem )) { // it must not happen that root is moved. Q_ASSERT(false); if (movedItem->parent() != droppedOnItem->parent()) { CatalogChapter* chapDrop = static_cast(itemData(movedItem)); chapDrop->reparent( 0 ); } } else { // ordinary template, set a new parent chapter CatalogTemplate *tmpl = static_cast(itemData(movedItem)); if( tmpl && tmpl->chapterId() != newParentId ) { tmpl->setChapterId( newParentId, true ); } } } parent->insertChild( qMin(r, parent->childCount()), movedItem ); updateSort(parent); } event->accept(); // Don't want QAbstractItemView to delete it because it was "moved" we already did it event->setDropAction(Qt::IgnoreAction); } } QTreeView::dropEvent(event); } void KatalogListView::endUpdateItemSequence() { _query->finish(); delete _query; _query = nullptr; } void KatalogListView::updateChapterSort(int catChapterId) { if (mChapterDict.contains(catChapterId)) { QTreeWidgetItem *item = mChapterDict[catChapterId]; updateSort(item); } } void KatalogListView::updateSort(QTreeWidgetItem *chapter) { int chapCnt{0}; int itemCnt{0}; if (chapter == nullptr) chapter = m_root; int childrenCnt = chapter->childCount(); emit sequenceUpdateMaximum(childrenCnt); QSqlQuery chapQuery; chapQuery.prepare("UPDATE CatalogChapters SET sortKey = :sk WHERE chapterID = :id"); startUpdateItemSequence(); for (int indx = 0; indx < childrenCnt; indx++) { QTreeWidgetItem *item = chapter->child(indx); emit sequenceUpdateProgress(indx); if (isChapter(item)) { CatalogChapter *chapter = static_cast(itemData(item)); if (chapter) { chapQuery.bindValue(":id", chapter->id().toInt()); chapQuery.bindValue(":sk", chapCnt++); chapQuery.exec(); } } else { updateItemSequence(item, itemCnt++); } } endUpdateItemSequence(); emit sequenceUpdateProgress(childrenCnt); } void KatalogListView::slotItemEntered( QTreeWidgetItem *item, int ) { if( !item ) return; if( isRoot( item )) { // qDebug () << "Is a root item "; } else if( isChapter(item )) { // qDebug () << "Is a chapter item "; } else { CatalogTemplate *tmpl = static_cast(itemData(item)); // qDebug () << "hoovering this template: " << tmpl; emit templateHoovered( tmpl ); } } void KatalogListView::slotRedraw() { // remember all currently open chapters QHashIterator it( mChapterDict ); while( it.hasNext() ) { it.next(); if ( it.value()->isExpanded() ) { // qDebug () << "Adding open Chapter " << it.value()->text( 0 ); mOpenChapters << it.value()->text( 0 ); } } clear(); m_root = 0; m_dataDict.clear(); mChapterDict.clear(); addCatalogDisplay( m_catalogName ); mOpenChapters.clear(); } kraft-1.2.2/src/kataloglistview.h000066400000000000000000000064311467704360200170110ustar00rootroot00000000000000/*************************************************************************** floskellistview.h - ------------------- begin : Son Feb 8 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef KATALOGLISTVIEW_H #define KATALOGLISTVIEW_H #include #include #include #include #include #include "kraftcat_export.h" #include "catalogtemplate.h" /** *@author Klaas Freitag */ class TemplKatalog; class QPixmap; class DocPosition; class Katalog; class CatalogChapter; class KRAFTCAT_EXPORT KatalogListView : public QTreeWidget { Q_OBJECT public: KatalogListView( QWidget *parent = 0 ); ~KatalogListView(); virtual void addCatalogDisplay( const QString& ); virtual void* currentItemData(); virtual void* itemData( QTreeWidgetItem* ); CatalogTemplateList selectedTemplates(); bool isChapter(QTreeWidgetItem*); bool isRoot(QTreeWidgetItem*); QString selectedCatalogChapter(); virtual void setupChapters(); QMenu *contextMenu(); // virtual DocPosition itemToDocPosition( QListViewItem *it = 0 ) = 0; // Save the header state of the tree view virtual void saveState() = 0; void updateChapterSort(int catChapterId); signals: void templateHoovered( CatalogTemplate* ); void sequenceUpdateProgress( int ); void sequenceUpdateMaximum( int ); public slots: virtual void setCheckboxes( bool ); virtual void slotFreshupItem( QTreeWidgetItem*, void*, bool remChildren = false ); virtual void slotCreateNewChapter(); virtual void slotEditCurrentChapter(); virtual void slotRemoveCurrentChapter(); virtual void contextMenuEvent( QContextMenuEvent* ); virtual void slotRedraw(); virtual void setSelectFromMode(); virtual void removeTemplateItem( QTreeWidgetItem* ); protected slots: virtual void slotItemEntered( QTreeWidgetItem*, int); // run an update of the sort key in a chapter. void updateSort(QTreeWidgetItem *chapter); protected: virtual void startUpdateItemSequence() = 0; virtual void updateItemSequence(QTreeWidgetItem *item, int seqNo) = 0; virtual void endUpdateItemSequence(); virtual Katalog* catalog(); void dropEvent( QDropEvent* ); bool mCheckboxes; QTreeWidgetItem* tryAddingCatalogChapter( const CatalogChapter& ); QTreeWidgetItem *m_root; QHash m_dataDict; QHash mChapterDict; QString m_catalogName; QStringList mOpenChapters; QMenu *mMenu; QFont mChapterFont; QSqlQuery *_query; }; #endif kraft-1.2.2/src/katalogman.cpp000066400000000000000000000113401467704360200162440ustar00rootroot00000000000000/*************************************************************************** katalogman - Catalog manager ------------------- begin : 2004-12-09 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include "kraftdb.h" #include "katalogman.h" #include "katalog.h" #include "templkatalog.h" #include "materialkatalogview.h" Q_GLOBAL_STATIC(KatalogMan, mSelf) KatalogMan *KatalogMan::self() { return mSelf; } KatalogMan::KatalogMan( ) { } KatalogMan::~KatalogMan( ) { } QStringList KatalogMan::allKatalogNames() { QStringList list; QSqlQuery q( "SELECT name FROM CatalogSet ORDER BY sortKey, name" ); while( q.next() ) { list << q.value( 0 ).toString(); } return list; } QString KatalogMan::catalogTypeString( const QString& catName ) { QString res; if ( !catName.isEmpty() ) { QSqlQuery q; q.prepare( "SELECT catalogType FROM CatalogSet where name=:name" ); q.bindValue( ":name", catName ); if ( q.exec() && q.next() ) { res = q.value( 0 ).toString(); } } return res; } void KatalogMan::registerKatalog( Katalog *k ) { Katalog* kat = m_katalogDict[k->getName()]; if( kat ) { qWarning() << "Katalog with same name already here -> deleting!"; delete kat; } else { // not found, try to open it // qDebug () << "Katalog " << k->getName() << " registered and loading..."; m_katalogDict.insert( k->getName(), k ); k->load (); } } Katalog *KatalogMan::getKatalog(const QString& name) { Katalog* kat = m_katalogDict[name]; if( !kat ) { // qDebug () << "No katalog " << name << " found"; } else { // qDebug() << "Returning existing katalog " << name; } return kat; } // this is called after an template has been changed in the database. void KatalogMan::notifyKatalogChange( Katalog* k, dbID ) { // FIXME: More efficient catalog reloading. if ( k ) { const QString name = k->getName(); k->reload( dbID() ); QList< QPointer > views = mKatalogListViews.values(name); KatalogListView *view; QListIterator< QPointer > i( views ); while ( i.hasNext() ) { view = i.next(); if( view ) { view->slotRedraw(); } } } } void KatalogMan::registerKatalogListView( const QString& name, KatalogListView *view ) { QList< QPointer > views = mKatalogListViews.values(name); if ( ! views.contains( view ) ) { mKatalogListViews.insert(name, QPointer(view)); } } /* * currently, there is only one catalog of type Template by design, see * for example in templatesaverdb.cpp or the database design where only * one template catalog is in use. */ Katalog* KatalogMan::defaultTemplateCatalog() { QHashIterator it( m_katalogDict ); // See QDictIterator while ( it.hasNext() ) { it.next(); Katalog *k = it.value(); if ( k->type() == TemplateCatalog ) { // qDebug () << "Found default template catalog: " << k->getName(); return k; } } return 0; } KatalogMan::CatalogDetails KatalogMan::catalogDetails( const QString& catName ) { KatalogMan::CatalogDetails details; QString sql; QString catTypeString = KatalogMan::catalogTypeString( catName ); if( catTypeString == QLatin1String("MaterialCatalog") ) { sql = "SELECT count(matID), COUNT(distinct chapterID), MAX(modifyDate) FROM stockMaterial"; } else if( catTypeString == QLatin1String("TemplCatalog") ) { sql = "SELECT count(TemplID), COUNT(distinct chapterID), MAX(modifyDatum) FROM Catalog"; } QSqlQuery q; q.prepare( sql ); if ( !sql.isEmpty() && q.exec() && q.next() ) { details.countEntries = q.value( 0 ).toInt(); details.countChapters = q.value( 1 ).toInt(); details.maxModDate = q.value( 2 ).toDateTime(); } return details; } /* END */ kraft-1.2.2/src/katalogman.h000066400000000000000000000040321467704360200157110ustar00rootroot00000000000000/*************************************************************************** katalogman - ------------------- begin : 2004-12-09 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _KATALOGMAN_H #define _KATALOGMAN_H #include #include "katalog.h" #include "kataloglistview.h" #include "kraftcat_export.h" // include files /** * */ class QStringList; class KRAFTCAT_EXPORT KatalogMan : public QObject { public: ~KatalogMan(); static KatalogMan *self(); struct CatalogDetails { int countEntries; int countChapters; QDateTime maxModDate; }; QStringList allKatalogNames(); Katalog* getKatalog(const QString&); Katalog* defaultTemplateCatalog(); void registerKatalog( Katalog* ); QString catalogTypeString( const QString& catName ); void notifyKatalogChange( Katalog*, dbID ); CatalogDetails catalogDetails( const QString& catName ); // register a view for a catalog identified by its name. void registerKatalogListView( const QString&, KatalogListView* ); // static KatalogMan *mSelf; KatalogMan(); private: QHash m_katalogDict; QMultiMap< QString, QPointer > mKatalogListViews; }; #endif /* END */ kraft-1.2.2/src/katalogview.cpp000066400000000000000000000312131467704360200164440ustar00rootroot00000000000000/*************************************************************************** katalogview.cpp ------------------- begin : 2005 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include // include files for QT #include #include #include #include #include #include #include // application specific includes #include "katalogview.h" #include "katalog.h" #include "floskeltemplate.h" #include "kataloglistview.h" #include "flostempldialog.h" #include "templkatalog.h" #include "filterheader.h" #include "docposition.h" #include "katalogman.h" #include "defaultprovider.h" #include "format.h" #include "kraftsettings.h" #define ID_STATUS_MSG 1 KatalogView::KatalogView( QWidget* parent, const char* ) : QMainWindow(parent), m_acEditChapter(nullptr), m_acEditItem(nullptr), m_acNewItem(nullptr), m_acDeleteItem(nullptr), m_acExport(nullptr), m_filterHead(nullptr), m_editListViewItem(nullptr), mTemplateText(nullptr), mTemplateStats(nullptr) { setObjectName( "catalogeview" ); //We don't want to delete this view when we close it! setAttribute(Qt::WA_DeleteOnClose, false); } void KatalogView::init(const QString& katName ) { m_katalogName = katName; initActions(); /////////////////////////////////////////////////////////////////// // set up a vertical layout box QWidget *w = new QWidget(this); QBoxLayout *box = new QVBoxLayout(w); // start to set up the listview createCentralWidget(box, w); KatalogListView *listview = getListView(); if( ! listview ) { // qDebug () << "ERROR: No listview created !!!"; } else { QHBoxLayout *horizLay = new QHBoxLayout; m_filterHead = new FilterHeader(w, listview); horizLay->insertWidget(0, m_filterHead, 2); horizLay->addStretch(1); box->insertLayout(0, horizLay); connect( listview, SIGNAL(currentItemChanged ( QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(slTreeviewItemChanged( QTreeWidgetItem*, QTreeWidgetItem*)) ); connect( listview, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(slEditTemplate())); connect( listview, SIGNAL(templateHoovered(CatalogTemplate*)), this, SLOT(slotShowTemplateDetails( CatalogTemplate*))); // Populate the context Menu (listview->contextMenu())->addAction( m_acEditItem ); (listview->contextMenu())->addAction( m_acNewItem ); (listview->contextMenu())->addAction( m_acDeleteItem ); (listview->contextMenu())->addSeparator(); (listview->contextMenu())->addAction( m_acAddChapter ); (listview->contextMenu())->addAction( m_acEditChapter ); (listview->contextMenu())->addAction( m_acRemChapter ); getKatalog( katName ); listview->addCatalogDisplay( katName ); } setCentralWidget(w); m_editListViewItem = nullptr; // qDebug () << "Getting katalog!" << katName; // setAutoSaveSettings( QString::fromLatin1( "CatalogWindow" ), true ); } void KatalogView::createCentralWidget(QBoxLayout *box, QWidget* ) { mTemplateText = new QLabel( "Nothing selected."); box->addWidget( mTemplateText ); QHBoxLayout *hb = new QHBoxLayout; box->addLayout( hb ); mTemplateStats = new QLabel( ); mProgress = new QProgressBar; mProgress->setFormat(i18n("%p%")); mProgress->setVisible(false); hb->addWidget( mTemplateStats ); hb->addStretch(); hb->addWidget( mProgress ); connect( getListView(), &KatalogListView::sequenceUpdateMaximum, [=](int max) { this->mProgress->setVisible(max > 0); this->mProgress->setMaximum(max); }); connect( getListView(), &KatalogListView::sequenceUpdateProgress, this, &KatalogView::setProgressValue ); const QByteArray state = windowState(); restoreState(state); const QByteArray geo = windowGeo(); restoreGeometry(geo); } void KatalogView::setProgressValue( int val ) { if( val == mProgress->maximum() ) { QTimer::singleShot(3000, this, [this] () { this->mProgress->reset(); this->mProgress->setVisible(false); }); } if( ! mProgress || mProgress->maximum() < 10) return; mProgress->setValue( val ); } KatalogView::~KatalogView() { } Katalog* KatalogView::getKatalog( const QString& name ) { KatalogMan::self()->registerKatalogListView( name, getListView() ); return nullptr; } void KatalogView::initActions() { QIcon newIcon = DefaultProvider::self()->icon( "edit"); m_acEditChapter = new QAction(newIcon, i18n("Edit Sub chapter"), this); m_acEditChapter->setShortcut( Qt::CTRL + Qt::Key_S); m_acEditChapter->setStatusTip(i18n("Edit a catalog sub chapter")); connect(m_acEditChapter, &QAction::triggered, this, &KatalogView::slEditSubChapter); newIcon = DefaultProvider::self()->icon( "edit"); m_acAddChapter = new QAction(newIcon, i18n("Add a sub chapter"), this); m_acAddChapter->setShortcut( Qt::CTRL + Qt::Key_A); m_acAddChapter->setStatusTip(i18n("Add a sub chapter below the selected one")); connect(m_acAddChapter, &QAction::triggered, this, &KatalogView::slAddSubChapter); newIcon = DefaultProvider::self()->icon( "minus"); m_acRemChapter = new QAction(newIcon, i18n("Remove a sub chapter"), this); m_acRemChapter->setShortcut( Qt::CTRL + Qt::Key_R); m_acRemChapter->setStatusTip(i18n("Remove a sub chapter")); connect(m_acRemChapter, &QAction::triggered, this, &KatalogView::slRemoveSubChapter); newIcon = DefaultProvider::self()->icon( "edit"); m_acEditItem = new QAction(newIcon, i18n("Edit Template"), this); m_acEditItem->setShortcut( Qt::CTRL + Qt::Key_T); m_acEditItem->setStatusTip(i18n("Opens the editor window for templates to edit the selected one")); m_acEditItem->setEnabled(false); connect(m_acEditItem, &QAction::triggered, this, &KatalogView::slEditTemplate); newIcon = DefaultProvider::self()->icon( "file-plus"); m_acNewItem = new QAction(newIcon, i18n("New template"), this); m_acNewItem->setShortcut( Qt::CTRL + Qt::Key_N); m_acNewItem->setStatusTip(i18n("Opens the editor window for templates to enter a new template")); connect(m_acNewItem, &QAction::triggered, this, &KatalogView::slNewTemplate); m_acNewItem->setEnabled(true); newIcon = DefaultProvider::self()->icon( "file-export"); m_acDeleteItem = new QAction(newIcon, i18n("Delete template"), this); m_acDeleteItem->setShortcut( QKeySequence::Delete); m_acDeleteItem->setStatusTip(i18n("Deletes the template")); connect(m_acDeleteItem, &QAction::triggered, this, &KatalogView::slDeleteTemplate); m_acDeleteItem->setEnabled(true); newIcon = DefaultProvider::self()->icon( "file-export"); m_acExport = new QAction(newIcon, i18n("Export catalog"), this); m_acExport->setShortcut( Qt::Key_E); m_acExport->setStatusTip(i18n("Export the whole catalog as XML encoded file")); connect(m_acExport, &QAction::triggered, this, &KatalogView::slExport); m_acExport->setEnabled(false); newIcon = DefaultProvider::self()->icon( "transfer-in"); m_acImport = new QAction(newIcon, i18n("Import catalog"), this); m_acExport->setShortcut( Qt::Key_I); m_acExport->setStatusTip(i18n("Import a catalog from a XML file")); connect(m_acExport, &QAction::triggered, this, &KatalogView::slImport); m_acExport->setEnabled(false); QMenu *catalogMenu = menuBar()->addMenu(i18n("&Catalog")); catalogMenu->addAction(m_acAddChapter); catalogMenu->addAction(m_acEditChapter); catalogMenu->addAction(m_acRemChapter); catalogMenu->addSeparator(); catalogMenu->addAction(m_acNewItem); catalogMenu->addAction(m_acEditItem); catalogMenu->addAction(m_acDeleteItem); #ifdef HAVE_EXPORT catalogMenu->addSeparator(); catalogMenu->addAction(m_acExport); catalogMenu->addAction(m_acImport); #endif } void KatalogView::openDocumentFile(const QUrl& ) { slotStatusMsg(i18n("Opening file…")); slotStatusMsg(i18n("Ready.")); } void KatalogView::closeEvent( QCloseEvent *event ) { slotStatusMsg(i18n("Exiting…")); if( event ) event->accept(); } void KatalogView::slotSaveState() { getListView()->saveState(); // saves the header state const QByteArray state = saveState().toBase64(); saveWindowState(state); const QByteArray geo = saveGeometry().toBase64(); saveWindowGeo(geo); } void KatalogView::slotStatusMsg(const QString &text) { if( text.isEmpty() ) { statusBar()->clearMessage(); } else { statusBar()->showMessage(text, 30*1000 /* milliseconds timeout */ ); } } void KatalogView::slTreeviewItemChanged( QTreeWidgetItem *newItem, QTreeWidgetItem * /* prevItem */ ) { KatalogListView *listview = getListView(); if( !listview ) return; if( ! newItem ) return; bool itemEdit = true; bool itemNew = true; bool chapterNew = false; bool chapterEdit = false; if( listview->isRoot(newItem) ) { // we have the root item, not editable itemEdit = false; itemNew = false; chapterNew = true; } else if( listview->isChapter(newItem) ) { itemEdit = false; chapterNew = true; chapterEdit = true; } m_acEditItem->setEnabled(itemEdit); m_acDeleteItem->setEnabled(itemEdit); m_acNewItem->setEnabled( itemNew ); m_acAddChapter->setEnabled( chapterNew ); m_acEditChapter->setEnabled( chapterEdit ); m_acRemChapter->setEnabled( chapterEdit ); } void KatalogView::slExport() { slotStatusMsg(i18n("Exporting file…")); Katalog *k = getKatalog(m_katalogName); if(k) k->writeXMLFile(); slotStatusMsg(i18n("Ready.")); } void KatalogView::slImport() { slotStatusMsg(i18n("Importing file… (not yet implemented)")); } void KatalogView::slAddSubChapter() { slotStatusMsg( i18n("Creating a new sub chapter…")); KatalogListView *listview = getListView(); if( listview ) listview->slotCreateNewChapter(); slotStatusMsg( i18n("Ready.")); } void KatalogView::slEditSubChapter() { slotStatusMsg( i18n("Editing a sub chapter…")); KatalogListView *listview = getListView(); if( listview ) listview->slotEditCurrentChapter(); slotStatusMsg( i18n("Ready.")); } void KatalogView::slRemoveSubChapter() { slotStatusMsg( i18n("Removing a sub chapter…")); KatalogListView *listview = getListView(); if( listview ) listview->slotRemoveCurrentChapter(); slotStatusMsg( i18n("Ready.")); } void KatalogView::slotShowTemplateDetails( CatalogTemplate *tmpl ) { if( ! (mTemplateText && mTemplateStats) ) { // qDebug () << "Hoover-Text: No label ready."; return; } if( ! tmpl ) { mTemplateText->setText( QString() ); mTemplateStats->setText( QString() ); return; } QString t; QString flos = tmpl->getText(); QFontMetrics fm( mTemplateText->font() ); int w = mTemplateText->width() - 30; t = QString( "%1").arg( fm.elidedText(flos, Qt::ElideMiddle, w ) ); mTemplateText->setText( t ); int useCount = tmpl->useCounter(); QDateTime ed = tmpl->enterDate(); const QString enterDateStr = Format::toDateString(ed.date(), KraftSettings::self()-> dateFormat()); t = QStringLiteral("

              ") + i18n("Created at %1 ", enterDateStr); const QDateTime dt = tmpl->modifyDate(); if (dt.isValid() && ed != dt) { const QString modDateStr = Format::toDateTimeString( dt, KraftSettings::self()-> dateFormat()); t += i18n(", last modified at %1", modDateStr); } t += QStringLiteral("
              "); if (useCount > 0) { const QString useCntStr = Format::toDateTimeString(tmpl->lastUsedDate(), KraftSettings::self()-> dateFormat()); t += i18n("%1 times used, last at %2", useCount, useCntStr ); } else { // Not used yet, do not print anything. } t += QStringLiteral("

              "); // qDebug() << "Hoover-String: " << t; mTemplateStats->setText( t ); } kraft-1.2.2/src/katalogview.h000066400000000000000000000112241467704360200161110ustar00rootroot00000000000000/*************************************************************************** katalogview.h ------------------- begin : 2005 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef KATALOGVIEW_H #define KATALOGVIEW_H #include #include #include #include "kraftcat_export.h" class KatalogListView; class Katalog; class FilterHeader; class CatalogWidget; class QBoxLayout; class QActionMenu; class DocPosition; class CalcPartList; class QTreeWidgetItem; class QLabel; class QProgressBar; class CatalogTemplate; /** * The base class for Kraft katalog view. * * @author Klaas Freitag * @version $Id$ */ class KRAFTCAT_EXPORT KatalogView : public QMainWindow { Q_OBJECT public: /** construtor of a catalog view. * Note: init must be called immediately after instanciating a inherited * class of KatalogView */ KatalogView(QWidget* parent=0, const char* name=0); virtual ~KatalogView(); /** * create a special listview for the kind of catalog. This method must * be overwritten in inherited catalog view classes. */ virtual void createCentralWidget(QBoxLayout*, QWidget*); virtual KatalogListView* getListView(){return 0;}; virtual void init( const QString& ); protected: virtual Katalog* getKatalog( const QString& ); public slots: /** clears the document in the current view to reuse it as the new document */ void openDocumentFile(const QUrl &url); /** changes the statusbar contents for the standard label permanently, used to indicate current actions. * @param text the text that is displayed in the statusbar */ void slotStatusMsg(const QString &text); virtual void slTreeviewItemChanged( QTreeWidgetItem *, QTreeWidgetItem *); void slExport(); void slImport(); // virtual void slEditChapters(); virtual void slAddSubChapter(); virtual void slEditSubChapter(); virtual void slRemoveSubChapter(); virtual void slNewTemplate() = 0; virtual void slEditTemplate() = 0; virtual void slDeleteTemplate() = 0; void slotShowTemplateDetails( CatalogTemplate*); void setProgressValue( int ); void closeEvent( QCloseEvent *event ); protected slots: void slotSaveState(); protected: /** the configuration object of the application */ QAction* m_acEditChapter; QAction* m_acAddChapter; QAction* m_acRemChapter; QAction* m_acEditItem; QAction* m_acNewItem; QAction* m_acDeleteItem; QAction* m_acExport; QAction* m_acImport; // KToggleAction* viewToolBar; // KToggleAction* viewStatusBar; QString m_katalogName; FilterHeader *m_filterHead; QTreeWidgetItem *m_editListViewItem; QLabel *mTemplateText; QLabel *mTemplateStats; QProgressBar *mProgress; // Fills the DocPosition with the data from the currently selected item in the view virtual bool currentItemToDocPosition( DocPosition& ){ return false; } /** initializes the QActions of the application */ void initActions(); /** sets up the statusbar for the main window by initialzing a statuslabel. */ /** initializes the document object of the main window that is connected to the view in initView(). * @see initView(); */ void initView(); /** Save the state of the window to the right settings value. Needs to be reimplemented in the special window implementation, * thus virtual here. */ virtual void saveWindowState( const QByteArray& arr ) = 0; virtual QByteArray windowState() = 0; /** Save the geomentry of the window to the right settings value. Needs to be reimplemented in the special window implementation, * thus virtual here. */ virtual void saveWindowGeo( const QByteArray& arr ) = 0; virtual QByteArray windowGeo() = 0; }; #endif // KATALOGVIEW_H kraft-1.2.2/src/katalogview.rc000066400000000000000000000013341467704360200162670ustar00rootroot00000000000000 &File &Catalog kraft-1.2.2/src/kraftcat_export.h000066400000000000000000000017251467704360200170010ustar00rootroot00000000000000/* This file is part of the kraft catalog library. Copyright (C) 2009 Klaas Freitag This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KRAFTCAT_EXPORT_H #define KRAFTCAT_EXPORT_H #define KRAFTCAT_EXPORT #endif kraft-1.2.2/src/kraftdb.cpp000066400000000000000000000464171467704360200155600ustar00rootroot00000000000000/*************************************************************************** KraftDB.cpp - ------------------- begin : Die Feb 3 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include "version.h" #include "kraftdb.h" #include "doctype.h" #include "dbids.h" #include "defaultprovider.h" #include "archiveman.h" #include "documentsaverdb.h" #include "databasesettings.h" #include "stringutil.h" Q_GLOBAL_STATIC(KraftDB, mSelf) SqlCommand::SqlCommand() { } SqlCommand::SqlCommand(const QString& cmd, const QString& msg, bool mayfail) : mSql(cmd), mMessage(msg), mMayFail(mayfail) { if( !mMessage.isEmpty() && !mMessage.endsWith(';') ) { mMessage.append(';'); } if( !mSql.isEmpty() && !mSql.endsWith(';') ) { mSql.append(';'); } } QString SqlCommand::message() { return mMessage; } QString SqlCommand::command() { return mSql; } bool SqlCommand::mayfail() { return mMayFail; } // ============================ SqlCommandList::SqlCommandList() :QList(), _number(0) { } void SqlCommandList::setNumber(int no) { _number = no; } int SqlCommandList::number() { return _number; } void SqlCommandList::setMetaAddDocTypeList( QList list ) { _docTypeMetaList = list; } QList SqlCommandList::metaAddDocTypeList() const { return _docTypeMetaList; } // ========================================================================== KraftDB::KraftDB() :QObject (), mParent(nullptr), mSuccess( true ), EuroTag( QString::fromLatin1( "%EURO" ) ), mInitDialog(nullptr), _amountOfDocs(-1), _amountOfArchs(-1), _emitDBChangeSignal(true) { // Attention: Before setup assistant rewrite, dbConnect() was called here. // Keep that in mind, maybe the auto connect to the DB now misses somewhere. // dbConnect(); connect( &_timer, &QTimer::timeout, this, &KraftDB::slotCheckDocDatabaseChanged); } bool KraftDB::dbConnect( const QString& driver, const QString& dbName, const QString& dbUser, const QString& dbHost, const QString& dbPasswd ) { mSuccess = true; mDatabaseDriver = driver; mDatabaseName = dbName; if( mDatabaseDriver.isEmpty() ) { // qDebug () << "Database Driver is not specified, check katalog settings"; mSuccess = false; return false; } else { // qDebug () << "Using database Driver " << mDatabaseDriver; } QStringList list = QSqlDatabase::drivers(); if( list.size() == 0 ) { // qDebug () << "Database Drivers could not be loaded."; mSuccess = false ; } else { if( list.indexOf( mDatabaseDriver ) == -1 ) { // qDebug () << "Database Driver " << mDatabaseDriver << " could not be loaded!"; mSuccess = false; } } if( mSuccess && m_db.isValid() ) { m_db.close(); } if( mSuccess ) { m_db = QSqlDatabase::addDatabase( mDatabaseDriver ); if ( ! m_db.isValid() || m_db.isOpenError() ) { qDebug() << "Failed to connect to the database driver: " << m_db.lastError().text(); mSuccess = false; } } if ( mSuccess ) { int re = 0; if(mDatabaseDriver == "QMYSQL") { int port = DatabaseSettings::self()->dbServerPort(); // use the default port so far // FIXME: get port from user interface // qDebug () << "Try to open MySQL database " << name; re = checkConnect( dbHost, dbName , dbUser, dbPasswd, port); } else if(mDatabaseDriver == "QSQLITE") { // SqlLite only requires a valid file name which comes in as Database Name // qDebug () << "Try to open SqLite database " << name; re = checkConnect( QString(), dbName, QString(), QString(), -1); } if ( re == 0 ) { // Database successfully opened; we can now issue SQL commands. // qDebug () << "** Database opened successfully"; } else { // qDebug () << "## Could not open database"; mSuccess = false; } } return mSuccess; } void KraftDB::enableTimerRefresh(bool runTimer) { if (mSuccess && runTimer) { _timer.start(10*1000); } else { _timer.stop(); } } KraftDB *KraftDB::self() { return mSelf; } void KraftDB::close() { m_db.close(); } bool KraftDB::isSqlite() { const QString dbDriver = qtDriver().toUpper(); return (dbDriver.startsWith("QSQLITE")); } int KraftDB::checkConnect( const QString& host, const QString& dbName, const QString& user, const QString& pwd, int port ) { mDatabaseName = dbName; // works for both mysql and sqlite if the filename for sqlite comes in // as parameter two if ( dbName.isEmpty() || !(m_db.isValid()) ) return false; m_db.setHostName( host ); m_db.setDatabaseName( dbName ); m_db.setUserName( user ); m_db.setPassword( pwd ); if( port > -1 ) { m_db.setPort(port); } int re = 0; m_db.setConnectOptions("MYSQL_OPT_RECONNECT=1"); m_db.open(); if ( m_db.isOpenError() ) { qDebug () << "ERR opening the db: " << m_db.lastError().text() << ", type is " << m_db.lastError().type(); re = m_db.lastError().type(); } return re; } QSqlError KraftDB::lastError() { return m_db.lastError(); } dbID KraftDB::getLastInsertID() { if(! ( m_db.isValid()) ) return 0; QSqlQuery query; if( mDatabaseDriver.toLower() == "qmysql" ) { query.prepare("SELECT LAST_INSERT_ID()"); query.exec(); } else if( mDatabaseDriver.toLower() == "qsqlite") { query.prepare( "SELECT last_insert_rowid()"); query.exec(); } else { // qDebug () << "############# FATAL ERROR: Unknown database driver " << mDatabaseDriver; } int id = -1; if( query.next() ) { id = query.value(0).toInt(); } else { // qDebug () << "############# FATAL ERROR: Query for last insert id is invalid!"; } // qDebug () << "Last Insert ID: " << id; return dbID(id); } QString KraftDB::databaseName() const { return mDatabaseName; } bool KraftDB::databaseExists() { bool re = false; if(!m_db.isOpen()) { m_db.open(); } if(m_db.isOpen()) { const QStringList t = m_db.tables(); re = t.contains( "kraftsystem"); } return re; } void KraftDB::setSchemaVersion( const QString& versionStr ) { QSqlQuery q; q.prepare( "UPDATE kraftsystem SET dbSchemaVersion=:id" ); q.bindValue(":id", versionStr ); q.exec(); } SqlCommandList KraftDB::parseCommandFile( int currentVersion ) { SqlCommandList list; const QString& file = QString("%1_dbmigrate.sql").arg(currentVersion); list = parseCommandFile(file); list.setMetaAddDocTypeList( parseMetaFile(currentVersion) ); list.setNumber(currentVersion); return list; } SqlCommandList KraftDB::parseCommandFile( const QString& file ) { QString sqlFile; QString driverPrefix{"mysql"}; // Default on mysql if( mDatabaseDriver.toLower() == "qsqlite") { driverPrefix = "sqlite3"; } // qDebug() << "XXXXXXXXXX: " << stdDirs.resourceDirs("data"); // Package or AppImage const QString fragment = QString("dbmigrate/%1/%2").arg(driverPrefix).arg(file ); sqlFile = DefaultProvider::self()->locateFile(fragment); // dbinit files: if (sqlFile.isEmpty()) { const QString envPath = QString( "dbinit/%1/%2").arg(driverPrefix).arg(file); sqlFile = DefaultProvider::self()->locateFile(envPath); } // KRAFT_HOME files: if (sqlFile.isEmpty()) { const QString envPath = QString( "database/%1/%2").arg(driverPrefix).arg(file); sqlFile = DefaultProvider::self()->locateFile(envPath); } // still KRAFT_HOME files: if (sqlFile.isEmpty()) { const QString envPath = QString( "database/%1/migration/%2").arg(driverPrefix).arg(file); sqlFile = DefaultProvider::self()->locateFile(envPath); } SqlCommandList retList; if ( ! sqlFile.isEmpty() ) { // qDebug () << "Opening migration file " << sqlFile; QFile f( sqlFile ); if ( !f.exists() ) { qDebug() << "FATAL: File" << sqlFile << "does not exist!"; } if ( !f.open( QIODevice::ReadOnly ) ) { qDebug () << "FATAL: Could not open " << sqlFile; } else { QTextStream ts( &f ); ts.setCodec("UTF-8"); QString allSql = ts.readAll(); //Not sure of this one! QStringList sqlList = allSql.split(";"); QRegExp reg( "\\s*(#|--)\\s*message:? ?(.*)\\s*\\n" ); QRegExp failreg( "\\s*(#|--)\\s*mayfail\\s*\\n" ); reg.setMinimal( true ); QListIterator it(sqlList); while( it.hasNext() ) { QString msg, command; QString sqlFragment = it.next().trimmed(); int pos = reg.indexIn( sqlFragment.toLower(), 0 ); if ( pos > -1 ) { msg = reg.cap( 2 ); // qDebug() << "SQL-Commands-Parser: Msg: >" << msg << "<"; } bool mayfail = false; pos = failreg.indexIn( sqlFragment.toLower(), 0 ); if( pos > -1 ) { mayfail = true; } bool clean = false; while( ! clean ) { if( sqlFragment.startsWith("#") || sqlFragment.startsWith("--") ) { // remove the comment line. int newLinePos = sqlFragment.indexOf('\n'); // qDebug() << "Found newline in <" << sqlFragment << ">:" << newLinePos; if(newLinePos > 0) { sqlFragment = sqlFragment.remove( 0, 1+sqlFragment.indexOf('\n') ); } else { sqlFragment = QString(); } // qDebug() << "Left over SQL Fragment:" << sqlFragment; } else { clean = true; } } if( !sqlFragment.isEmpty() ) { if( sqlFragment.startsWith( "CREATE TRIGGER", Qt::CaseInsensitive )) { // Triggers contain a ; which scares the parser. In case of triggers we pull // the next item in the list which should be the END; keyword. command = sqlFragment + ";"; if( it.hasNext()) command += it.next(); } else { // ordinary command, we take it as it is. command = sqlFragment; } if( !command.isEmpty() ) { retList.append( SqlCommand( command, msg, mayfail ) ); } } } } } else { qDebug () << "ERR: Can not find sql file " << file; } return retList; } QList KraftDB::parseMetaFile( int currentVersion ) { QString lookup= QString( "meta/%1_meta.xml").arg(currentVersion); // if KRAFT_HOME is set, the lookup path must be prepended with database const QByteArray env = qgetenv("KRAFT_HOME"); if( !env.isEmpty()) { lookup.prepend("database/"); } const QString xmlFile = DefaultProvider::self()->locateFile(lookup); if (xmlFile.isEmpty()) { // it is fine to not find the XML file return QList(); } QFile f( xmlFile ); MetaXMLParser parser; if( f.exists() ) { if ( !f.open( QIODevice::ReadOnly ) ) { qWarning() << "FATAL: Could not open " << xmlFile; } else { QTextStream ts( &f ); ts.setCodec("UTF-8"); parser.parse( &f ); } } else { qWarning() << "XML Metafile" << xmlFile << "does not exist!"; } return parser.metaDocTypeAddList(); } int KraftDB::processSqlCommands( const SqlCommandList& commands ) { int cnt = 0; // first do the doctype definitions QList newDocTypes = commands.metaAddDocTypeList(); // loop over all doctypes first, later loop again to create the followers. // The followers might reference each other and thus must exist. for( auto newDocType : newDocTypes ) { const QString name = newDocType.name(); DocType type(name, true); for( QString attr : newDocType._attribs.keys() ) { type.setAttribute(attr, newDocType._attribs[attr]); } type.save(); } // now loop again to process the followers for( auto newDocType : newDocTypes ) { const QString name = newDocType.name(); if( newDocType._follower.count() > 0 ) { DocType type(name, true); type.setAllFollowers(newDocType._follower); type.save(); } } foreach( SqlCommand cmd, commands ) { if( !cmd.message().isEmpty() ) { emit statusMessage( cmd.message() ); } if( !cmd.command().isEmpty() ) { bool res = true; QSqlQuery q; q.clear(); res = q.exec(cmd.command()) || cmd.mayfail(); if ( res ) { // qDebug () << "Successful SQL Command: " << cmd.command(); cnt ++; } else { QSqlError err = q.lastError(); res = false; qDebug () << "###### Failed SQL Command " << cmd.command() << ": " << err.text(); } q.clear(); emit processedSqlCommand( res ); } } return cnt; } int KraftDB::requiredSchemaVersion() { return Kraft::Version::dbSchemaVersion(); } int KraftDB::currentSchemaVersion() { QSqlQuery query; query.exec("SELECT dbschemaversion FROM kraftsystem"); //We'll retrieve every record int re = -1; if ( query.next() ) { re = query.value(0).toInt(); } return re; } QString KraftDB::qtDriver() { return mDatabaseDriver; } QString KraftDB::currentTimeStamp( const QDateTime& dt ) { QString dateStr; if( dt.isValid() ) { dateStr = dt.toString(Qt::ISODate); } else { dateStr = QDateTime::currentDateTime().toString(Qt::ISODate); } return dateStr; } QString KraftDB::mysqlEuroEncode( const QString& str ) const { QChar euro( 0x20ac ); QString restr( str ); return restr.replace( euro, EuroTag ); } QString KraftDB::mysqlEuroDecode( const QString& str ) const { QChar euro( 0x20ac ); QString restr( str ); return restr.replace( EuroTag, euro ); } QStringList KraftDB::wordList(const QString& selector, QMap replaceMap ) { QStringList re; QSqlQuery query; query.prepare("SELECT category, word FROM wordLists WHERE category=:cat"); query.bindValue(":cat", selector); query.exec(); while ( query.next() ) { re << StringUtil::replaceTagsInString(query.value(1).toString(), replaceMap); } re.sort(); return re; } void KraftDB::writeWordList( const QString& listName, const QStringList& list ) { // qDebug () << "Saving " << list[0] << " into list " << listName; QSqlQuery qd; qd.prepare( "DELETE FROM wordLists WHERE category=:catName" ); qd.bindValue( ":catName", listName ); qd.exec(); QSqlQuery qi; qi.prepare( "INSERT INTO wordLists (category, word) VALUES( :category, :entry )" ); qi.bindValue( ":category", listName ); for ( QStringList::ConstIterator it = list.begin(); it != list.end(); ++it ) { qi.bindValue( ":entry", *it ); qi.exec(); } } bool KraftDB::checkTableExistsSqlite(const QString& name, const QStringList& lookupCols) { const QString query = QString("PRAGMA table_info(%1)").arg(name); QSqlQuery q(query); QStringList cols = lookupCols; q.exec(); QSqlError err = q.lastError(); if( err.isValid() ) { qDebug() << "Error: " << err.text(); } while( q.next() ) { const QString colName = q.value(1).toString(); qDebug() << "checking colum" << colName; cols.removeAll(colName); } return cols.isEmpty(); } KraftDB::~KraftDB() { } void KraftDB::slotCheckDocDatabaseChanged() { bool changed{false}; { QSqlQuery q("SELECT count(*) FROM document"); q.exec(); QSqlError err = q.lastError(); if( err.isValid() ) { qDebug() << "Error: " << err.text(); return; } if ( q.next() ) { bool ok; int cnt = q.value(0).toInt(&ok); if (_amountOfDocs != -1 && cnt != _amountOfDocs ) { qDebug() << "Docs from" << _amountOfDocs << "to" << cnt; changed = true; } _amountOfDocs = cnt; } } { QSqlQuery qArch("SELECT count(*) FROM archdoc"); qArch.exec(); QSqlError err = qArch.lastError(); if( err.isValid() ) { qDebug() << "Error: " << err.text(); return; } if ( qArch.next() ) { bool ok; int cnt = qArch.value(0).toInt(&ok); if (_amountOfArchs != -1 && cnt != _amountOfArchs) { qDebug() << "Arched docs from" << _amountOfArchs << "to" << cnt; changed = true; } _amountOfArchs = cnt; } } if (changed && _emitDBChangeSignal) emit docDatabaseChanged(); } dbID KraftDB::archiveDocument( KraftDoc *docPtr ) { dbID archID = ArchiveMan::self()->archiveDocument( docPtr ); if (archID.isOk()) { _emitDBChangeSignal = false; // block sending of the signal slotCheckDocDatabaseChanged(); _emitDBChangeSignal = true; } return archID; } void KraftDB::loadDocument(const QString& id, KraftDoc *docPtr) { DocumentSaverDB loader; loader.load(id, docPtr); } bool KraftDB::saveDocument(KraftDoc *docPtr) { bool res {false}; DocumentSaverDB saver; if (docPtr) { res = saver.saveDocument(docPtr); if (res) { _emitDBChangeSignal = false; // block sending of the signal slotCheckDocDatabaseChanged(); _emitDBChangeSignal = true; } } return res; } kraft-1.2.2/src/kraftdb.h000066400000000000000000000111331467704360200152100ustar00rootroot00000000000000/*************************************************************************** kraftdb.h - ------------------- begin : Die Feb 3 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef KRAFTDB_H #define KRAFTDB_H #include #include #include #include #include #include "metaxmlparser.h" class dbID; class DbInitDialog; class SetupAssistant; class KraftDoc; /** *@author Klaas Freitag */ class SqlCommand { public: SqlCommand(); SqlCommand( const QString&, const QString&, bool ); QString message(); QString command(); bool mayfail(); private: QString mSql; QString mMessage; bool mMayFail; }; class SqlCommandList: public QList { public: SqlCommandList(); QList metaAddDocTypeList() const; void setMetaAddDocTypeList( QList list ); void setNumber(int no); int number(); private: QList _docTypeMetaList; int _number; }; class KraftDB : public QObject { Q_OBJECT public: ~KraftDB(); static KraftDB *self(); dbID getLastInsertID(); QSqlDatabase *getDB(){ return &m_db; } QString qtDriver(); QStringList wordList( const QString&, QMap replaceMap = QMap() ); void writeWordList( const QString&, const QStringList& ); QString databaseName() const; QSqlError lastError(); bool isSqlite(); bool isOk() { return mSuccess; } bool dbConnect( const QString& driver, const QString& dbName, const QString& dbUser, const QString& dbHost, const QString& dbPasswd ); /** * check if the database is open and contains the table kraftsystem. Still * the Schema version can be invalid, check currentSchemaVersion(). */ bool databaseExists(); /* * required and current schema versions. Must be equal for a healty * Kraft database. If currentSchemaVersion is smaller than requiredSchemaVersion, * the db needs an update. */ int currentSchemaVersion(); int requiredSchemaVersion(); void setSchemaVersion( const QString& ); // database aware current time stamp QString currentTimeStamp( const QDateTime& dt = QDateTime() ); /** * Euro sign encoding to work around a problem with mysql */ QString mysqlEuroEncode( const QString& ) const; QString mysqlEuroDecode( const QString& ) const; QString replaceTagsInWord( const QString& w, QMap replaceMap ) const; // void checkDatabaseSetup( QWidget* ); SqlCommandList parseCommandFile( int currentVersion ); SqlCommandList parseCommandFile( const QString& file ); QList parseMetaFile( int currentVersion ); int processSqlCommands( const SqlCommandList& ); bool checkTableExistsSqlite(const QString& name, const QStringList& lookupCols); KraftDB(); dbID archiveDocument( KraftDoc *docPtr ); void loadDocument(const QString& id, KraftDoc *docPtr); bool saveDocument(KraftDoc *docPtr); void enableTimerRefresh(bool runTimer); private slots: void slotCheckDocDatabaseChanged(); signals: void statusMessage( const QString& ); void processedSqlCommand( bool ); void docDatabaseChanged(); private: // Private attributes void close(); int checkConnect(const QString&, const QString&, const QString&, const QString& , int port); /** The default database */ QSqlDatabase m_db; QWidget *mParent; bool mSuccess; const QString EuroTag; QString mDatabaseDriver; QString mDatabaseName; DbInitDialog *mInitDialog; SetupAssistant *mSetupAssistant; QTimer _timer; int _amountOfDocs, _amountOfArchs; // if this is set to false, the slotCheckDatabaseChanged() can be called // to update the members that hold the amount of docs, but the update signal // is not sent out. bool _emitDBChangeSignal; }; #endif kraft-1.2.2/src/kraftdoc.cpp000066400000000000000000000331551467704360200157330ustar00rootroot00000000000000/*************************************************************************** KraftDoc.cpp - Kraft document class ------------------- begin : Mit Dez 31 19:24:05 CET 2003 copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include // application specific includes #include "kraftsettings.h" #include "kraftdoc.h" #include "portal.h" #include "kraftview.h" #include "docposition.h" #include "documentsaverdb.h" #include "defaultprovider.h" #include "documentman.h" #include "doctype.h" #include "documentman.h" #include "kraftdb.h" #include "format.h" // FIXME: Make KraftDoc inheriting DocDigest! KraftDoc::KraftDoc(QWidget *parent) : QObject(parent), _modified(false), mIsNew(true), mDocTypeChanged(false) { } KraftDoc::~KraftDoc() { } KraftDoc& KraftDoc::operator=( KraftDoc& origDoc ) { if ( this == &origDoc ) return *this; DocPositionListIterator it( origDoc.mPositions ); while ( it.hasNext() ) { DocPosition *dp = static_cast( it.next() ); DocPosition *newPos = new DocPosition(); *newPos = *dp; newPos->setDbId( -1 ); mPositions.append( newPos ); // qDebug () << "Appending position " << dp->dbId().toString(); } _modified = origDoc._modified; mIsNew = true; mAddressUid = origDoc.mAddressUid; mProjectLabel = origDoc.mProjectLabel; mPredecessor = origDoc.mPredecessor; mPredecessorDbId = origDoc.mPredecessorDbId; mAddress = origDoc.mAddress; mPreText = origDoc.mPreText; mPostText = origDoc.mPostText; mDocType = origDoc.mDocType; mDocTypeChanged = false; mSalut = origDoc.mSalut; mGoodbye = origDoc.mGoodbye; mIdent = origDoc.mIdent; mWhiteboard = origDoc.mWhiteboard; // Two qualifiers for the locale settings. mCountry = origDoc.mCountry; mLanguage = origDoc.mLanguage; mDate = origDoc.mDate; mLastModified = origDoc.mLastModified; // setPositionList( origDoc.mPositions ); mRemovePositions = origDoc.mRemovePositions; // mDocID = origDoc.mDocID; return *this; } void KraftDoc::closeDocument() { deleteItems(); } void KraftDoc::setPredecessor( const QString& w ) { mPredecessor = w; } bool KraftDoc::openDocument(const QString& id ) { KraftDB::self()->loadDocument(id, this); mDocTypeChanged = false; _modified=false; mIsNew = false; return true; } bool KraftDoc::reloadDocument() { mPositions.clear(); mRemovePositions.clear(); return openDocument( mDocID.toString() ); } bool KraftDoc::saveDocument( ) { bool result = false; result = KraftDB::self()->saveDocument(this); if(result) { if ( isNew() ) { setLastModified( QDateTime::currentDateTime() ); } // Go through the whole document and remove the positions // that are to delete because they now were deleted in the // database. DocPositionListIterator it( mPositions ); while( it.hasNext() ) { DocPositionBase *dp = it.next(); if( dp->toDelete() ) { // qDebug () << "Removing pos " << dp->dbId().toString() << " from document object"; mPositions.removeAll( dp ); } } _modified = false; } return result; } QString KraftDoc::docIdentifier() const { const QString id = ident(); if( id.isEmpty() ) { return docType(); } return i18nc("First argument is the doctype, like Invoice, followed by the ID", "%1 (ID %2)", docType(), id ); } void KraftDoc::deleteItems() { qDeleteAll(mPositions); mPositions.clear(); } void KraftDoc::setDocType( const QString& s ) { if( s != mDocType ) { mDocType = s; mDocTypeChanged = true; } } void KraftDoc::setPositionList( DocPositionList newList, bool isNew) { mPositions.clear(); DocPositionListIterator it( newList ); while ( it.hasNext() ) { DocPositionBase *dpb = it.next(); DocPosition *dp = static_cast( dpb ); DocPosition *newDp = createPosition( dp->type() ); *newDp = *dp; if(isNew) { newDp->setDbId(-1); } } } DocPosition* KraftDoc::createPosition( DocPositionBase::PositionType t ) { DocPosition *dp = new DocPosition( t ); mPositions.append( dp ); return dp; } void KraftDoc::slotRemovePosition( int pos ) { // qDebug () << "Removing position " << pos; foreach( DocPositionBase *dp, mPositions ) { // qDebug () << "Comparing " << pos << " with " << dp->dbId().toString(); if( dp->dbId() == pos ) { if( ! mPositions.removeAll( dp ) ) { // qDebug () << "Could not remove!"; } else { // qDebug () << "Successfully removed the position " << dp; mRemovePositions.append( dp->dbId() ); // remember to delete } } } } void KraftDoc::slotMoveUpPosition( int dbid ) { // qDebug () << "Moving position " << dbid << " up"; if( mPositions.count() < 1 ) return; int curPos = -1; // Search the one to move up for( int i = 0; curPos == -1 && i < mPositions.size(); i++ ) { if( (mPositions.at(i))->dbId() == dbid ) { curPos = i; // get out of the loop } } // qDebug () << "Found: "<< curPos << ", count: " << mPositions.count(); if( curPos < mPositions.size()-1 ) { mPositions.swap( curPos, curPos+1 ); } } void KraftDoc::slotMoveDownPosition( int dbid ) { // qDebug () << "Moving position " << dbid << " down"; if( mPositions.count() < 1 ) return; int curPos = -1; // Search the one to move up for( int i = 0; curPos == -1 && i < mPositions.size(); i++ ) { if( (mPositions.at(i))->dbId() == dbid ) { curPos = i; // get out of the loop } } // qDebug () << "Found: "<< curPos << ", count: " << mPositions.count(); if( curPos > 0 ) { mPositions.swap( curPos, curPos-1 ); } } int KraftDoc::slotAppendPosition( const DocPosition& pos ) { DocPosition *dp = createPosition(); *dp = pos; // FIXME: Proper assignment operator return mPositions.count(); } Geld KraftDoc::nettoSum() const { return positions().nettoPrice(); } Geld KraftDoc::bruttoSum() const { Geld g = nettoSum(); g += vatSum(); return g; } Geld KraftDoc::fullTaxSum() const { return positions().fullTaxSum(DocumentMan::self()->tax(date())); } Geld KraftDoc::reducedTaxSum() const { return positions().reducedTaxSum(DocumentMan::self()->reducedTax(date())); } Geld KraftDoc::vatSum() const { return positions().taxSum( DocumentMan::self()->tax( date() ), DocumentMan::self()->reducedTax( date() ) ); // return Geld( nettoSum() * DocumentMan::self()->vat()/100.0 ); } QString KraftDoc::country() const { QLocale *loc = DefaultProvider::self()->locale(); return loc->countryToString(loc->country()); } QString KraftDoc::language() const { QLocale *loc = DefaultProvider::self()->locale(); return loc->languageToString(loc->language()); } QString KraftDoc::partToString( Part p ) { if ( p == Header ) return i18nc( "Document part header", "Header" ); else if ( p == Footer ) return i18nc( "Document part footer", "Footer" ); else if ( p == Positions ) return i18nc( "Document part containing the items", "Items" ); return i18n( "Unknown document part" ); } QString KraftDoc::preTextRaw() const { return mPreText; } QString KraftDoc::postTextRaw() const { return mPostText; } /** * @brief KraftDoc::resolveMacros * @param txtWithMacros - the string that might contain any macros * @param dposList - the list of document items * @return - the text with resolved macros * * The following macros are supported: * 1. SUM_PER_TAG(tag): The netto sum of all items that are tagged with the named tag * 2. IF_ANY_HAS_TAG(tag) .. END_HAS_TAG: The text between the macros only appears if * at least one of all items is tagged with the named tag * 3. ITEM_COUNT_WITH_TAG(tag): This macro is replaced with the amount of items that * are tagged with this tag * * 4. DATE_ADD_DAYS(days): Adds the amount of days to the date delivered in the call parameters */ QString KraftDoc::resolveMacros(const QString& txtWithMacros, const DocPositionList dposList, const QDate& date, double fullTax, double redTax) const { QString myStr{txtWithMacros}; QMap seenTags; QRegExp rxIf("\\s{1}IF_ANY_HAS_TAG\\(\\s*(\\w+)\\s*\\)"); QRegExp rxEndif("\\s{1}END_HAS_TAG"); QRegExp rxAmount("ITEM_COUNT_WITH_TAG\\(\\s*(\\w+)\\s*\\)"); QRegExp rxAddDate("DATE_ADD_DAYS\\(\\s*(\\-{0,1}\\d+)\\s*\\)"); // look for tag SUM_PER_TAG( HNDL ) QRegExp rx("NETTO_SUM_PER_TAG\\(\\s*(\\w+)\\s*\\)"); QRegExp rxBrutto("BRUTTO_SUM_PER_TAG\\(\\s*(\\w+)\\s*\\)"); QRegExp rxVat("VAT_SUM_PER_TAG\\(\\s*(\\w+)\\s*\\)"); int pos{0}; QMap bruttoSums; QMap vatSums; Geld nettoSum; while ((pos = rx.indexIn(myStr, pos)) != -1) { const QString lookupTag = rx.cap(1); bruttoSums[lookupTag] = Geld(); vatSums[lookupTag] = Geld(); for (DocPositionBase *pb : dposList) { DocPosition *p = static_cast(pb); if (!p->toDelete() && p->hasTag(lookupTag)) { Geld netto = p->overallPrice(); Geld tax; if (p->taxType() == DocPositionBase::TaxType::TaxFull) tax = netto.percent(fullTax); else if (p->taxType() == DocPositionBase::TaxType::TaxReduced) tax = netto.percent(redTax); bruttoSums[lookupTag] += netto; bruttoSums[lookupTag] += tax; vatSums[lookupTag] += tax; nettoSum += netto; } } myStr.replace(pos, rx.matchedLength(), nettoSum.toLocaleString()); } // replace the Brutto- and vat tags if exist pos = 0; while ((pos = rxBrutto.indexIn(myStr, pos)) != -1) { const QString lookupTag = rxBrutto.cap(1); if (bruttoSums.contains(lookupTag)) { myStr.replace(pos, rxBrutto.matchedLength(), bruttoSums[lookupTag].toLocaleString()); } else { qDebug() << "No Brutto sums computed for" << lookupTag; } } // vat tags pos = 0; while ((pos = rxVat.indexIn(myStr, pos)) != -1) { const QString lookupTag = rxVat.cap(1); if (vatSums.contains(lookupTag)) { myStr.replace(pos, rxVat.matchedLength(), vatSums[lookupTag].toLocaleString()); } } // generate a list of all tags in any position for (DocPositionBase *pb : dposList) { DocPosition *p = static_cast(pb); if (!p->toDelete()) { const auto tags = p->tags(); for (const QString& lookupTag : tags) { if (seenTags.contains(lookupTag)) { seenTags[lookupTag] = 1+seenTags[lookupTag]; } else { seenTags[lookupTag] = 1; } } } } pos = 0; while ((pos = rxAmount.indexIn(myStr, pos)) != -1) { const QString lookupTag = rxAmount.cap(1); int amount{0}; if (seenTags.contains(lookupTag)) { amount = seenTags[lookupTag]; } myStr.replace(pos, rxAmount.matchedLength(), QString::number(amount)); } pos = 0; while ((pos = rxAddDate.indexIn(myStr, pos)) != -1) { const QString addDaysStr = rxAddDate.cap(1); qint64 addDays = addDaysStr.toInt(); QDate newDate = date.addDays(addDays); const QString newDateStr = Format::toDateString(newDate, KraftSettings::self()->dateFormat()); myStr.replace(pos, rxAddDate.matchedLength(), newDateStr); } // IF_ANY_HAS_TAG(tag) ..... END_HAS_TAG // check the IF_HAS_TAG(tag) ... END_HAS_TAG macro pos = 0; while ((pos = rxIf.indexIn(myStr, pos)) != -1) { const QString lookupTag = rxIf.cap(1); int endpos = myStr.lastIndexOf(rxEndif); if (endpos == -1) endpos = myStr.length(); if (seenTags.contains(lookupTag)) { myStr.remove(endpos, 12 /* length of END_HAS_TAG */); myStr.remove(pos, rxIf.matchedLength()); } else { // the tag was not seen, so this needs to be deleted. int len = endpos-pos+12; myStr.remove(pos, len); } } return myStr; } QString KraftDoc::preText() const { double fullTax = DocumentMan::self()->tax(date()); double redTax = DocumentMan::self()->reducedTax(date()); const QString myStr = resolveMacros(mPreText, positions(), date(), fullTax, redTax); return myStr; } QString KraftDoc::postText() const { double fullTax = DocumentMan::self()->tax(date()); double redTax = DocumentMan::self()->reducedTax(date()); const QString myStr = resolveMacros(mPostText, positions(), date(), fullTax, redTax); return myStr; } kraft-1.2.2/src/kraftdoc.h000066400000000000000000000170401467704360200153730ustar00rootroot00000000000000/*************************************************************************** kraftdoc.h - Kraft document class ------------------- begin : Mit Dez 31 19:24:05 CET 2003 copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef KRAFTDOC_H #define KRAFTDOC_H // include files for QT #include #include #include #include "docposition.h" #include "dbids.h" #include "docguardedptr.h" // forward declaration of the Kraft classes class DocumentSaverBase; class Geld; class KraftView; class KraftDoc : public QObject { Q_OBJECT Q_PROPERTY(QString docType READ docType) Q_PROPERTY(QString address READ address) Q_PROPERTY(QString clientUid READ addressUid) Q_PROPERTY(QString ident READ ident) Q_PROPERTY(QString salut READ salut) Q_PROPERTY(QString goodbye READ goodbye) Q_PROPERTY(QString preText READ preText) Q_PROPERTY(QString postText READ postText) Q_PROPERTY(QString projectLabel READ projectLabel) Q_PROPERTY(QString docIDStr READ docIdStr) Q_PROPERTY(QString docIdentifier READ docIdentifier) Q_PROPERTY(QString nettoSumStr READ nettoSumStr) Q_PROPERTY(QString bruttoSumStr READ bruttoSumStr) Q_PROPERTY(QString taxSumStr READ vatSumStr) Q_PROPERTY(QString fullTaxSumStr READ fullTaxSumStr) Q_PROPERTY(QString reducedTaxSumStr READ reducedTaxSumStr) public: enum Part { Header, Positions, Footer, Unknown }; static QString partToString( Part ); /** Constructor for the fileclass of the application */ KraftDoc(QWidget *parent = nullptr); /** Destructor for the fileclass of the application */ ~KraftDoc(); KraftDoc& operator=( KraftDoc& ); /** sets the modified flag for the document after a modifying action * on the view connected to the document.*/ void setModified(bool _m=true){ _modified=_m; } /** returns if the document is modified or not. Use this to determine * if your document needs saving by the user on closing.*/ bool isModified(){ return _modified; } /** deletes the document's contents */ void deleteItems(); /** closes the current document */ void closeDocument(); /** loads the document by filename and format and emits the updateViews() signal */ bool openDocument(const QString& ); /** fetch the document from database back */ bool reloadDocument(); /** saves the document under filename and format.*/ bool saveDocument( ); QLocale* locale(); DocPosition* createPosition( DocPositionBase::PositionType t = DocPositionBase::Position ); DocPositionList positions() const { return mPositions; } void setPositionList(DocPositionList , bool isNew = false); QDate date() const { return mDate; } void setDate( QDate d ) { mDate = d; } QDateTime lastModified() const { return mLastModified; } void setLastModified( QDateTime d ) { mLastModified = d; } QString docType() const { return mDocType; } void setDocType( const QString& s ); bool docTypeChanged() { return mDocTypeChanged; } QString addressUid() const { return mAddressUid; } void setAddressUid( const QString& id ) { mAddressUid = id; } QString address() const { return mAddress; } void setAddress( const QString& adr ) { mAddress = adr; } bool isNew() const { return mIsNew; } QString ident() const { return mIdent; } void setIdent( const QString& str ) { mIdent = str; } QString salut() const { return mSalut; } void setSalut( const QString& str ) { mSalut = str; } QString goodbye() const { return mGoodbye; } void setGoodbye( const QString& str ) { mGoodbye = str; } // take a string with macros and generate the text replacements for the macros // with the help of the position list QString resolveMacros(const QString& txtWithMacros, const DocPositionList dposList, const QDate &date, double fullTax, double redTax) const; // preText is the variant with expanded macros QString preText() const; // preTextRaw is the variant with macros not expanded QString preTextRaw() const; void setPreTextRaw( const QString& str ) { mPreText = str; } QString postText() const; // postTextRaw is the variant with macros not expanded QString postTextRaw() const; void setPostTextRaw( const QString& str ) { mPostText = str; } QString whiteboard() const { return mWhiteboard; } void setWhiteboard( const QString& w ) { mWhiteboard = w; } QString projectLabel() const { return mProjectLabel; } void setProjectLabel( const QString& w ) { mProjectLabel = w; } QString predecessor() const { return mPredecessor; } void setPredecessor( const QString& w ); QString predecessorDbId() const { return mPredecessorDbId; } void setPredecessorDbId( const QString& pId ) { mPredecessorDbId = pId; } void setDocID( dbID id ) { mDocID = id; } dbID docID() const { return mDocID; } QString docIdStr() const { return docID().toString(); } QString docIdentifier() const; DBIdList removePositionList() { return mRemovePositions; } Geld nettoSum() const; QString nettoSumStr() const { return nettoSum().toLocaleString(); } Geld bruttoSum() const; QString bruttoSumStr() const { return bruttoSum().toLocaleString(); } Geld fullTaxSum() const; QString fullTaxSumStr() const { return fullTaxSum().toLocaleString(); } Geld reducedTaxSum() const; QString reducedTaxSumStr() const { return reducedTaxSum().toLocaleString(); } Geld vatSum() const; QString vatSumStr() const { return vatSum().toLocaleString(); } QString country() const; QString language() const; public slots: /** calls redrawDocument() on all views connected to the document object and is * called by the view by which the document has been changed. * As this view normally repaints itself, it is excluded from the paintEvent. */ int slotAppendPosition( const DocPosition& ); // The following slots take get the db id as argument void slotRemovePosition( int ); void slotMoveUpPosition( int ); void slotMoveDownPosition( int ); private: /** the modified flag of the current document */ bool _modified; bool mIsNew; QString mAddressUid; QString mProjectLabel; QString mAddress; // mPreText and postText always have the raw variant without expanded macros QString mPreText; QString mPostText; QString mDocType; bool mDocTypeChanged; QString mSalut; QString mGoodbye; QString mIdent; QString mWhiteboard; QString mPredecessor; QString mPredecessorDbId; // Two qualifiers for the locale settings. QString mCountry; QString mLanguage; QDate mDate; QDateTime mLastModified; DocPositionList mPositions; DBIdList mRemovePositions; dbID mDocID; }; #endif // KraftDoc_H kraft-1.2.2/src/kraftdocedit.cpp000066400000000000000000000006711467704360200165760ustar00rootroot00000000000000#include "kraftdocedit.h" #include KraftDocEdit::KraftDocEdit( QWidget *parent ) : QWidget( parent ) { } void KraftDocEdit::setTitle( const QString &title ) { mTitle = title; } QString KraftDocEdit::title() const { return mTitle; } void KraftDocEdit::setColor( const QColor &color ) { mColor = color; } QColor KraftDocEdit::color() const { return mColor; } void KraftDocEdit::slotModified() { emit modified(); } kraft-1.2.2/src/kraftdocedit.h000066400000000000000000000006371467704360200162450ustar00rootroot00000000000000#ifndef KRAFTDOCEDIT_H #define KRAFTDOCEDIT_H #include "ui_docheader.h" class KraftDocEdit : public QWidget { Q_OBJECT public: KraftDocEdit( QWidget *parent ); void setTitle( const QString & ); QString title() const; void setColor( const QColor & ); QColor color() const; signals: void modified(); public slots: void slotModified(); private: QString mTitle; QColor mColor; }; #endif kraft-1.2.2/src/kraftdocfooteredit.cpp000066400000000000000000000063461467704360200200220ustar00rootroot00000000000000/*************************************************************************** kraftdocfooteredit.cpp - inherited class from designer generated class ------------------- begin : Sept. 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "kraftdocfooteredit.h" #include "kraftdb.h" #include #include #include #include #include KraftDocFooterEdit::KraftDocFooterEdit( QWidget *parent ) : KraftDocEdit( parent ), mDocFooterEdit( 0 ), mCustomGreetingIndex(-1) { QVBoxLayout *topLayout = new QVBoxLayout; Q_ASSERT( parent ); setLayout( topLayout ); mDocFooterEdit = new Ui::DocFooterEdit; QWidget *w = new QWidget; mDocFooterEdit->setupUi(w); topLayout->addWidget(w); mDocFooterEdit->m_cbGreeting->insertItems(-1, KraftDB::self()->wordList( "greeting" ) ); connect( mDocFooterEdit->m_cbGreeting, SIGNAL( activated( int ) ), SLOT( slotModified() ) ); connect( mDocFooterEdit->m_cbGreeting, SIGNAL(currentIndexChanged(int)), this, SLOT(slotGreeterIndexChanged(int))); connect( mDocFooterEdit->m_cbGreeting, SIGNAL(editTextChanged(QString)), this, SLOT(slotGreeterEditTextChanged(QString))); connect( mDocFooterEdit->m_teSummary, SIGNAL( textChanged() ), SLOT( slotModified() ) ); setTitle( i18n( "Document Footer" ) ); setColor( "#f0ff9a" ); } void KraftDocFooterEdit::slotSetGreeting( const QString& newText ) { slotGreeterEditTextChanged(newText); } QString KraftDocFooterEdit::greeting() { return mGreeting; } void KraftDocFooterEdit::slotGreeterIndexChanged(int newIndex) { mGreeting = mDocFooterEdit->m_cbGreeting->itemText(newIndex); slotModified(); } void KraftDocFooterEdit::slotGreeterEditTextChanged(const QString& newText) { QComboBox *greeterCombo = qobject_cast(mDocFooterEdit->m_cbGreeting); if( !greeterCombo ) return; // qDebug () << "II Combo box text changed to" << newText << "in" << greeterCombo; const QStringList texts = KraftDB::self()->wordList("greeting"); int indx = greeterCombo->currentIndex(); if( !texts.contains(newText)) { if( mCustomGreetingIndex == -1 ) { // no custom Entry yet greeterCombo->insertItem(0, newText); mCustomGreetingIndex = 0; } indx = mCustomGreetingIndex; } greeterCombo->setItemText(indx, newText); greeterCombo->setCurrentIndex(indx); mGreeting = newText; slotModified(); } kraft-1.2.2/src/kraftdocfooteredit.h000066400000000000000000000032201467704360200174530ustar00rootroot00000000000000/*************************************************************************** kraftdocfooteredit.h - inherited class from designer generated class ------------------- begin : Sept. 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef KRAFTDOCFOOTEREDIT_H #define KRAFTDOCFOOTEREDIT_H #include "ui_docfooter.h" #include "kraftdocedit.h" class KraftDocFooterEdit : public KraftDocEdit { Q_OBJECT public: KraftDocFooterEdit( QWidget *parent=0 ); // FIXME: Remove access to internal widgets Ui::DocFooterEdit *ui() { return mDocFooterEdit; } QString greeting(); public slots: void slotGreeterIndexChanged(int newIndex); void slotGreeterEditTextChanged(const QString& newText); void slotSetGreeting( const QString& newText ); private: Ui::DocFooterEdit *mDocFooterEdit; QString mGreeting; int mCustomGreetingIndex; }; #endif kraft-1.2.2/src/kraftdocheaderedit.cpp000066400000000000000000000054401467704360200177460ustar00rootroot00000000000000/*************************************************************************** kraftdocheaderview.cpp - inherited class from designer generated class ------------------- begin : Sept. 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "kraftdocheaderedit.h" #include #include #include #include #include #include "addressprovider.h" #include "defaultprovider.h" KraftDocHeaderEdit::KraftDocHeaderEdit( QWidget *parent ) : KraftDocEdit( parent ) { QVBoxLayout *topLayout = new QVBoxLayout; setLayout( topLayout ); mDocHeaderEdit = new Ui::DocHeaderEdit; QWidget *w = new QWidget; mDocHeaderEdit->setupUi( w ); topLayout->addWidget( w ); mDocHeaderEdit->mButtLang->setIcon(DefaultProvider::self()->icon("language")); connect( mDocHeaderEdit->m_cbType, SIGNAL( currentIndexChanged(int)), SLOT( slotModified() ) ); connect( mDocHeaderEdit->m_dateEdit, SIGNAL( dateChanged( QDate ) ), SLOT( slotModified() ) ); connect( mDocHeaderEdit->m_postAddressEdit, SIGNAL( textChanged() ), SLOT( slotModified() ) ); connect( mDocHeaderEdit->m_letterHead, SIGNAL( currentTextChanged(QString)), SLOT(slotModified() ) ); connect( mDocHeaderEdit->m_teEntry, SIGNAL( textChanged() ), SLOT( slotModified() ) ); connect( mDocHeaderEdit->m_whiteboardEdit, SIGNAL( textChanged() ), SLOT( slotModified() ) ); connect( mDocHeaderEdit->mProjectLabelEdit, SIGNAL( textChanged(QString) ), SLOT(slotModified() ) ); connect( mDocHeaderEdit->pb_pickAddressee, SIGNAL(clicked()), SIGNAL(pickAddressee())); setTitle( i18n( "Document Header" ) ); setColor( "#9af0ff" ); // if the Akonadi-Backend is down, just show a text QScopedPointer addressProvider; addressProvider.reset(new AddressProvider); if( !addressProvider->backendUp() ) { mDocHeaderEdit->pb_pickAddressee->hide(); mDocHeaderEdit->m_labName->setText( i18n("Manually set in address field.")); } } kraft-1.2.2/src/kraftdocheaderedit.h000066400000000000000000000026501467704360200174130ustar00rootroot00000000000000/*************************************************************************** kraftdocheaderview.h - inherited class from designer generated class ------------------- begin : Sept. 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef KRAFTDOCHEADEREDIT_H #define KRAFTDOCHEADEREDIT_H #include "ui_docheader.h" #include "kraftdocedit.h" class KraftDocHeaderEdit : public KraftDocEdit { Q_OBJECT public: KraftDocHeaderEdit( QWidget* ); // FIXME: Remove access to internal widgets Ui::DocHeaderEdit *docHeaderEdit() { return mDocHeaderEdit; } signals: void pickAddressee(); private: Ui::DocHeaderEdit *mDocHeaderEdit; }; #endif kraft-1.2.2/src/kraftdocpositionsedit.cpp000066400000000000000000000105021467704360200205400ustar00rootroot00000000000000/*************************************************************************** kraftdocpositionsedit.cpp - Doc item editor widget ------------------- begin : copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "kraftdocpositionsedit.h" #include #include #include #include #include #include #include #include #include #include "kraftview.h" KraftViewScroll::KraftViewScroll( QWidget *parent ): QScrollArea( parent ) { myWidget = new QWidget; myWidget->setAutoFillBackground(false); layout = new QVBoxLayout; layout->setAlignment(Qt::AlignTop); layout->setSizeConstraint( QLayout::SetMinAndMaxSize ); layout->setContentsMargins( 0,0,0,0 ); layout->setSpacing(0); myWidget->setLayout(layout); setWidget(myWidget); setWidgetResizable(true); myWidget->resize(0,0); myWidget->setMinimumHeight(0); myWidget->setMaximumHeight(0); myWidget->setContentsMargins(0, 0, 0, 0); } void KraftViewScroll::addChild( QWidget *child, int index ) { int y1 = myWidget->height(); layout->insertWidget(index, child); int y2 = y1+child->height(); myWidget->resize( child->width(), y2); myWidget->setMinimumHeight(y2); myWidget->setMaximumHeight(y2); } void KraftViewScroll::removeChild( PositionViewWidget *child ) { layout->removeWidget( child ); // from the scrollview } void KraftViewScroll::moveChild( PositionViewWidget *child, int index) { layout->removeWidget(child); layout->insertWidget(index, child); } int KraftViewScroll::indexOf(PositionViewWidget *child) { return layout->indexOf(child); } // ######################################################### KraftDocPositionsEdit::KraftDocPositionsEdit( QWidget *parent ) : KraftDocEdit( parent ) { QBoxLayout *topLayout = new QVBoxLayout(); topLayout->setMargin( 0 ); //TODO PORT QT5 topLayout->setSpacing( 0 ); // QDialog::spacingHint() ); QHBoxLayout *upperHBoxLayout = new QHBoxLayout; //upperHBoxLayout->setFrameStyle( QFrame::Box + QFrame::Sunken ); //TODO PORT QT5 upperHBoxLayout->setMargin( QDialog::marginHint()/2 ); topLayout->addLayout( upperHBoxLayout ); QPushButton *button = new QPushButton( i18n("Add Item…") ); connect( button, SIGNAL( clicked() ), SIGNAL( addPositionClicked() ) ); button->setToolTip( i18n( "Add a normal item to the document manually." ) ); upperHBoxLayout->addWidget(button); upperHBoxLayout->setSpacing( 3 ); m_discountBtn = new QPushButton( i18n("Add Discount Item") ); connect( m_discountBtn, SIGNAL( clicked() ), SIGNAL( addExtraClicked() ) ); upperHBoxLayout->addWidget(m_discountBtn); m_discountBtn->setToolTip( i18n( "Adds an item to the document that allows discounts on other items in the document" ) ); #if 0 // commented, rarely used feature. button = new QPushButton( i18n("Import Items…") ); connect( button, SIGNAL( clicked() ), SIGNAL( importItemsClicked() ) ); upperHBoxLayout->addWidget(button); button->setToolTip( i18n( "Opens a dialog where multiple items can be imported from a text file." ) ); #endif QWidget *spaceEater = new QWidget( ); spaceEater->setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Minimum ) ); upperHBoxLayout->addWidget(spaceEater); m_positionScroll = new KraftViewScroll( this ); topLayout->addWidget( m_positionScroll ); setTitle( i18n( "Document Items" ) ); setColor( "#9affa9" ); setLayout(topLayout); } void KraftDocPositionsEdit::setDiscountButtonVisible( bool visible ) { m_discountBtn->setVisible( visible ); } kraft-1.2.2/src/kraftdocpositionsedit.h000066400000000000000000000040721467704360200202120ustar00rootroot00000000000000/*************************************************************************** kraftdocpositionsedit.h - Doc item editor widget ------------------- begin : copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef KRAFTDOCPOSITIONSEDIT_H #define KRAFTDOCPOSITIONSEDIT_H #include "ui_docheader.h" #include "kraftdocedit.h" #include class KraftViewScroll; class PositionViewWidget; class KraftViewScroll : public QScrollArea { Q_OBJECT public: KraftViewScroll( QWidget* ); ~KraftViewScroll() { } void addChild( QWidget *child, int index ); void removeChild( PositionViewWidget *child ); void moveChild( PositionViewWidget *child, int index); int indexOf( PositionViewWidget *child); private: QWidget *myWidget; QVBoxLayout *layout; }; // ########################################################################### class KraftDocPositionsEdit : public KraftDocEdit { Q_OBJECT public: KraftDocPositionsEdit( QWidget* ); // FIXME: Remove access to internal widgets KraftViewScroll *positionScroll() { return m_positionScroll; } void setDiscountButtonVisible( bool visible ); signals: void addPositionClicked(); void addExtraClicked(); void importItemsClicked(); private: KraftViewScroll *m_positionScroll; QPushButton *m_discountBtn; }; #endif kraft-1.2.2/src/kraftglobals.h000066400000000000000000000026121467704360200162500ustar00rootroot00000000000000/*************************************************************************** kraftglobals.h - some global defines ------------------- begin : Don Jan 1 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef KRAFT_GLOBALS #define KRAFT_GLOBALS #include #include "geld.h" // schluessel um alle kalk-typen kostenPerKalcPart zurueckzugeben. #define ALL_KALKPARTS QLatin1String("all_calculation_parts") #define KALKPART_TIME QLatin1String("Time") #define KALKPART_FIX QLatin1String("Fix") #define KALKPART_MATERIAL QLatin1String("Material") // typedef long Geld; #endif kraft-1.2.2/src/kraftsettings.kcfg000066400000000000000000000160261467704360200171540ustar00rootroot00000000000000 true true thunderbird 10.0 trml2pdf %y%w-%i false 3 0 kraft-1.2.2/src/kraftsettings.kcfgc000066400000000000000000000001161467704360200173100ustar00rootroot00000000000000File=kraftsettings.kcfg ClassName=KraftSettings Singleton=true Mutators=true kraft-1.2.2/src/krafttemplate.cpp000066400000000000000000000001001467704360200167610ustar00rootroot00000000000000#include "krafttemplate.h" KraftTemplate::KraftTemplate() { } kraft-1.2.2/src/krafttemplate.h000066400000000000000000000002031467704360200164320ustar00rootroot00000000000000#ifndef KRAFTTEMPLATE_H #define KRAFTTEMPLATE_H class KraftTemplate { public: KraftTemplate(); }; #endif // KRAFTTEMPLATE_H kraft-1.2.2/src/kraftui.rc000066400000000000000000000015441467704360200154220ustar00rootroot00000000000000 &Document Settings Document Actions kraft-1.2.2/src/kraftview.cpp000066400000000000000000001403531467704360200161370ustar00rootroot00000000000000/*************************************************************************** kraftview.cpp - Interactive document view ------------------- begin : Mit Dez 31 19:24:05 CET 2003 copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // application specific includes #include "kraftdb.h" #include "kraftsettings.h" #include "kraftview.h" #include "kraftdoc.h" #include "tagman.h" #include "ui_docheader.h" #include "documentman.h" #include "docassistant.h" #include "positionviewwidget.h" #include "ui_docfooter.h" #include "docposition.h" #include "unitmanager.h" #include "docpostcard.h" #include "kataloglistview.h" #include "katalogman.h" #include "templkatalog.h" #include "templkataloglistview.h" #include "catalogselection.h" #include "kraftdocheaderedit.h" #include "kraftdocpositionsedit.h" #include "kraftdocfooteredit.h" #include "inserttempldialog.h" #include "defaultprovider.h" #include "stockmaterial.h" #include "templtopositiondialogbase.h" #include "doctype.h" #include "catalogtemplate.h" #include "importitemdialog.h" #include "addressprovider.h" #include "addressselectordialog.h" #include "format.h" #include "stringutil.h" #define NO_TAX 0 #define RED_TAX 1 #define FULL_TAX 2 #define INDI_TAX 3 KraftView::KraftView(QWidget *parent) : KraftViewBase( parent ), mHelpLabel(nullptr), mRememberAmount( -1 ), mModified( false ), mTaxBefore( -1 ), mDocPosEditorIndx( -1 ) { setWindowTitle( i18n("Document" ) ); setModal( false ); QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); mDetailHeader = new QLabel; mDetailHeader->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Fixed ) ); mDetailHeader->setFrameStyle( QFrame::Box + QFrame::Plain ); mDetailHeader->setLineWidth( 1 ); mDetailHeader->setAutoFillBackground(true); mAddressProvider = new AddressProvider( this ); connect( mAddressProvider, SIGNAL(lookupResult(QString,KContacts::Addressee)), this, SLOT( slotAddresseeFound(QString,KContacts::Addressee))); QPalette palette; palette.setColor(mDetailHeader->backgroundRole(), QColor( "darkBlue" )); palette.setColor(mDetailHeader->foregroundRole(), QColor( "white ")); mDetailHeader->setPalette( palette ); mDetailHeader->setTextFormat( Qt::PlainText ); mDetailHeader->setFixedHeight( 40 ); // FIXME QFont f = mDetailHeader->font(); f.setPointSize( qRound( 1.4 * f.pointSize() ) ); f.setBold( true ); mDetailHeader->setFont( f ); mainLayout->addWidget( mDetailHeader ); mCSplit = new QSplitter(this); mainLayout->addWidget( mCSplit ); mViewStack = new QStackedWidget; mCSplit->addWidget( mViewStack ); // qDebug () << "mViewSTack height is " << mViewStack->height(); mAssistant = new DocAssistant( mCSplit ); mCSplit->addWidget( mAssistant ); /* catalog template selection signal */ connect(mAssistant, &DocAssistant::templatesToDocument, this, &KraftView::slotAddItems); /* signal to toggle the visibility of the template section in the assistant */ connect(mAssistant, &DocAssistant::toggleShowTemplates, this, &KraftView::slotShowTemplates); /* signal that brings a new address to the document */ connect(mAssistant, &DocAssistant::headerTextTemplate, this, &KraftView::slotNewHeaderText); connect(mAssistant, &DocAssistant::footerTextTemplate, this, &KraftView::slotNewFooterText); connect(mAssistant, &DocAssistant::selectPage, this, &KraftView::slotSwitchToPage); mAssistant->slotSelectDocPart( KraftDoc::Header ); setupMappers(); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); } KraftView::~KraftView() { // qDebug () << "KRAFTVIEW going away."; } void KraftView::setupMappers() { mDeleteMapper = new QSignalMapper( this ); connect( mDeleteMapper, SIGNAL( mapped(int)), this, SLOT( slotDeletePosition( int ) ) ); mMoveUpMapper = new QSignalMapper( this ); connect( mMoveUpMapper, SIGNAL( mapped(int)), this, SLOT( slotMovePositionUp( int ) ) ); mMoveDownMapper = new QSignalMapper( this ); connect( mMoveDownMapper, SIGNAL( mapped(int)), this, SLOT( slotMovePositionDown( int ) ) ); mLockPositionMapper = new QSignalMapper( this ); connect( mLockPositionMapper, SIGNAL( mapped( int )), this, SLOT( slotLockPosition( int ) ) ); mUnlockPositionMapper = new QSignalMapper( this ); connect( mUnlockPositionMapper, SIGNAL( mapped( int )), this, SLOT( slotUnlockPosition( int ) ) ); mModifiedMapper = new QSignalMapper( this ); connect( mModifiedMapper, SIGNAL( mapped( int ) ), this, SLOT( slotPositionModified( int ) ) ); // block signals as long as the widget is built up. // unblocking happens in redrawDocument() mModifiedMapper->blockSignals(true); } void KraftView::setup( DocGuardedPtr doc ) { KraftViewBase::setup(doc); if ( KraftSettings::self()->docViewSplitter().count() == 2 ) { mCSplit->setSizes( KraftSettings::self()->docViewSplitter() ); } setupDocHeaderView(); setupItems(); setupFooter(); setWindowTitle( m_doc->docIdentifier() ); slotSwitchToPage( KraftDoc::Header ); if( doc->isNew() ) { mModified = true; } } void KraftView::slotSwitchToPage( int id ) { // check if the wanted part is already visible if ( mViewStack->currentWidget() == mViewStack->widget( id ) ) return; mViewStack->setCurrentIndex( id ); KraftDocEdit *edit = static_cast( mViewStack->currentWidget() ); mDetailHeader->setText( edit->title() ); QPalette palette; palette.setColor(mDetailHeader->backgroundRole(), edit->color()); // FIXME: color palette.setColor(mDetailHeader->foregroundRole(), QColor( "#00008b" )); mDetailHeader->setPalette( palette ); mAssistant->slotSelectDocPart( mViewStack->currentIndex() ); } void KraftView::slotShowTemplates( bool ) { } void KraftView::setupDocHeaderView() { KraftDocHeaderEdit *edit = new KraftDocHeaderEdit(this); mHeaderId = mViewStack->addWidget( edit ); // , KraftDoc::Header ); m_headerEdit = edit->docHeaderEdit(); m_headerEdit->m_cbType->clear(); // m_headerEdit->m_cbType->insertStringList( DefaultProvider::self()->docTypes() ); m_headerEdit->m_cbType->insertItems(-1, DocType::allLocalised() ); m_headerEdit->mButtLang->hide(); const QString predecessorDbId = m_doc->predecessorDbId(); bool predecIsVisible = false; if( !predecessorDbId.isEmpty() ) { DocGuardedPtr predecDoc = DocumentMan::self()->openDocument(predecessorDbId); if( predecDoc ) { const QString id = predecDoc->docIdentifier(); const QString link = QString("%2").arg(predecessorDbId).arg(id); m_headerEdit->_labFollowup->setText( i18n("Successor of %1", link)); predecIsVisible = true; connect( m_headerEdit->_labFollowup, SIGNAL(linkActivated(QString)), this, SLOT(slotLinkClicked(QString))); delete predecDoc; } } m_headerEdit->_labFollowup->setVisible(predecIsVisible); connect( m_headerEdit->m_cbType, SIGNAL( activated( const QString& ) ), this, SLOT( slotDocTypeChanged( const QString& ) ) ); connect( m_headerEdit->mButtLang, SIGNAL( clicked() ), this, SLOT( slotLanguageSettings() ) ); connect( edit, SIGNAL( modified() ), this, SLOT( slotModifiedHeader() ) ); connect( edit, SIGNAL(pickAddressee()), this, SLOT(slotPickAddressee()) ); } void KraftView::slotLinkClicked(const QString& link) { QUrl u(link); if( u.scheme() == "doc" && u.host() == "show" ) { QUrlQuery uq(link); const QString ident = uq.queryItemValue("id"); qDebug() << "Link clicked to open document " << ident; emit openROView( ident ); } } void KraftView::setupItems() { KraftDocPositionsEdit *edit = new KraftDocPositionsEdit(this); mDocPosEditorIndx = mViewStack->addWidget( edit ); // , KraftDoc::Positions ); m_positionScroll = edit->positionScroll(); connect( edit, SIGNAL( addPositionClicked() ), SLOT( slotAddNewItem() ) ); connect( edit, SIGNAL( addExtraClicked() ), SLOT( slotAddExtraPosition() ) ); connect( edit, SIGNAL( importItemsClicked() ), SLOT( slotImportItems() ) ); } void KraftView::redrawDocument( ) { KraftDoc *doc = getDocument(); if( !doc ) { // qDebug () << "ERR: No document available in view, return!"; } else { // qDebug () << "** Starting redraw of document " << doc; } /* header: date and document type */ QDate date = doc->date(); m_headerEdit->m_dateEdit->setDate( date ); m_headerEdit->m_cbType->setCurrentIndex(m_headerEdit->m_cbType->findText( doc->docType() )); /* header: address */ mContactUid = doc->addressUid(); QString address = doc->address(); // qDebug () << "Loaded address uid from database " << mContactUid; if( ! mContactUid.isEmpty() ) { mAddressProvider->lookupAddressee( mContactUid ); } if( !address.isEmpty() ) { // custom address stored in the document. // qDebug() << "custom address came in: " << address; m_headerEdit->m_postAddressEdit->setText( address ); } if( !doc->salut().isEmpty() ) { m_headerEdit->m_letterHead->insertItem(-1, doc->salut() ); m_headerEdit->m_letterHead->setCurrentIndex(m_headerEdit->m_letterHead->findText( doc->salut() )); } /* pre- and post text */ m_headerEdit->m_teEntry->setPlainText( doc->preTextRaw() ); m_headerEdit->m_whiteboardEdit->setPlainText( doc->whiteboard() ); m_headerEdit->mProjectLabelEdit->setText( doc->projectLabel() ); m_footerEdit->ui()->m_teSummary->setPlainText( doc->postTextRaw() ); const QString goodbye = doc->goodbye(); m_footerEdit->slotSetGreeting(goodbye); mAssistant->slotSetDocType( doc->docType() ); redrawDocPositions( ); slotDocTypeChanged( doc->docType() ); refreshPostCard(); mModifiedMapper->blockSignals(false); // mModified = false; } void KraftView::slotPickAddressee() { AddressSelectorDialog dialog(this); if( dialog.exec() ) { const KContacts::Addressee contact = dialog.addressee(); slotNewAddress( contact ); } } void KraftView::slotAddresseeFound( const QString& uid, const KContacts::Addressee& contact ) { if( contact.isEmpty() ) { const QString err = mAddressProvider->errorMsg(uid); if( !err.isEmpty() ) { qDebug () << "Error while looking up address for uid" << uid << ":" << err; } } else { slotNewAddress( contact, false ); qDebug () << "No contact found for uid " << uid; } } void KraftView::slotNewAddress( const KContacts::Addressee& contact, bool interactive ) { Addressee adr( contact ); if( contact.isEmpty() ) { return; } QString newAddress = mAddressProvider->formattedAddress( contact ); const QString currAddress = m_headerEdit->m_postAddressEdit->toPlainText(); bool replace = true; m_headerEdit->m_labName->setText( contact.realName() ); if( currAddress.isEmpty() ) { replace = true; } else if( currAddress != newAddress ) { // non empty and current different from new address // need to ask first if we overwrite if( interactive ) { QMessageBox msgBox; msgBox.setText(i18n( "The address label is not empty and different from the selected one.
              " "Do you really want to replace it with the text shown below?
              %1
              ", newAddress)); msgBox.setStandardButtons(QMessageBox::Yes| QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if ( ret != QMessageBox::Yes) { replace = false; } } else { // this happens when the document is loaded and the address arrives from addressbook replace = false; } } else if( currAddress == newAddress ) { // both are equal, no action needed replace = false; } if( replace ) { mContactUid = contact.uid(); m_headerEdit->m_postAddressEdit->setText( newAddress ); // Generate the welcome m_headerEdit->m_letterHead->clear(); QStringList li = generateLetterHead(adr.familyName(), adr.givenName()); m_headerEdit->m_letterHead->insertItems(-1, li ); m_headerEdit->m_letterHead->setCurrentIndex( KraftSettings::self()->salut() ); } } void KraftView::redrawDocPositions( ) { // If there is no position yet, come up with a help message. KraftDoc *doc = getDocument(); if ( ! doc ) return; DocPositionList list = doc->positions(); if ( list.count() == 0 ) { // the doc has no positions yet. Let's show a help page if ( ! mHelpLabel ) { mHelpLabel = new QLabel(this); mHelpLabel->setTextFormat(Qt::RichText); // mHelpLabel->setMinimumHeight(400); //TODO PORT QT5 mHelpLabel->setMargin( QDialog::marginHint() ); mHelpLabel->setText( i18n( "

              The Document Items List is still empty, but Items " "can be added now.

              " "To add items to the document either " "
                " "
              • Press the 'Add item' button above.
              • " "
              • Open the template catalog by clicking on the 'show Template' " "button on the right and pick one of the available templates.
              • " "
              " ) ); mHelpLabel->setWordWrap(true); mHelpLabel->setMinimumHeight(200); m_positionScroll->addChild( mHelpLabel, 0); } return; } else { if ( mHelpLabel ) { delete mHelpLabel; mHelpLabel = nullptr; } } // qDebug () << "starting to redraw " << list.count() << " positions!"; int cnt = 0; DocPositionListIterator it( list ); while( it.hasNext() ) { DocPositionBase *dp = it.next(); PositionViewWidget *w = mPositionWidgetList.widgetFromPosition( dp ); if( !w ) { w = createPositionViewWidget( dp, cnt); w->slotAllowIndividualTax( currentTaxSetting() == DocPositionBase::TaxIndividual ); } cnt++; // qDebug () << "now position " << dp->positionNumber(); } // now go through the positionWidgetMap and check if it contains elements // that are not any longer in the list of positions QMutableListIterator it2( mPositionWidgetList ); while( it2.hasNext() ) { PositionViewWidget *w = it2.next(); if( w && (list.contains( w->position() ) == 0) ) { // qDebug () << "Removing this one: " << w; m_positionScroll->removeChild( w ); it2.remove(); // mPositionWidgetList.erase( it2 ); break; } } } void KraftView::setMappingId( QWidget *widget, int pos ) { mDeleteMapper->setMapping( widget, pos ); mMoveUpMapper->setMapping( widget, pos ); mMoveDownMapper->setMapping( widget, pos ); mLockPositionMapper->setMapping( widget, pos ); mUnlockPositionMapper->setMapping( widget, pos ); mModifiedMapper->setMapping( widget, pos ); } // // create a new position widget. // The position parameter comes in as list counter, starting at 0 PositionViewWidget *KraftView::createPositionViewWidget( DocPositionBase *dp, int pos ) { PositionViewWidget *w = new PositionViewWidget( ); int cw = m_positionScroll->width(); if ( cw < 400 ) cw = 400; w->resize( cw, w->height() ); connect( w, SIGNAL( deletePosition() ), mDeleteMapper, SLOT( map() ) ); connect( w, SIGNAL( moveUp() ), mMoveUpMapper, SLOT( map() ) ); connect( w, SIGNAL( moveDown() ), mMoveDownMapper, SLOT( map() ) ); connect( w, SIGNAL( lockPosition() ), mLockPositionMapper, SLOT( map() ) ); connect( w, SIGNAL( unlockPosition() ), mUnlockPositionMapper, SLOT( map() ) ); connect( w, SIGNAL( positionModified()), mModifiedMapper, SLOT( map() ) ); setMappingId( w, pos ); QStringList units = UnitManager::self()->allUnits(); units.sort(); w->m_cbUnit->addItems(units); if( dp->dbId().toInt() < 0 ) { w->slotSetState( PositionViewWidget::New ); } /* do resizing and add the widget to the scrollview and move it to the final place */ if ( mHelpLabel ) { mHelpLabel->hide(); } mPositionWidgetList.insert( pos, w ); m_positionScroll->addChild( w, pos ); //Set the correct indexes when the widget is not appended if(pos < mPositionWidgetList.count()) { for(int i = pos+1; i < mPositionWidgetList.count(); ++i) { mPositionWidgetList.at(i)->setOrdNumber(i+1); setMappingId(mPositionWidgetList.at(i), i); } } w->setDocPosition(dp); w->setOrdNumber( pos+1 ); w->slotSetTax( dp->taxType() ); return w; } DocPositionBase::TaxType KraftView::currentTaxSetting() { // add 1 to the currentItem since that starts with zero. int taxKind = 1+( m_footerEdit->ui()->mTaxCombo->currentIndex() ); DocPositionBase::TaxType tt = DocPositionBase::TaxInvalid; if ( taxKind == 1 ) { // No Tax at all tt = DocPositionBase::TaxNone; } else if ( taxKind == 2 ) { // Reduced tax for all items tt = DocPositionBase::TaxReduced; } else if ( taxKind == 3 ) { // Full tax for all items tt = DocPositionBase::TaxFull; } else { // individual level tt = DocPositionBase::TaxIndividual; } return tt; } void KraftView::refreshPostCard() { DocPositionList positions = currentPositionList(); KraftDoc *kraftDoc = getDocument(); if( !kraftDoc) return; if ( mAssistant->postCard() ) { QDate d = m_headerEdit->m_dateEdit->date(); const QString dStr = Format::toDateString( d, KraftSettings::self()->dateFormat() ); double fullTax = DocumentMan::self()->tax(d); double redTax = DocumentMan::self()->reducedTax(d); const QString preText = kraftDoc->resolveMacros(m_headerEdit->m_teEntry->toPlainText(), positions, d, fullTax, redTax); const QString postText = kraftDoc->resolveMacros(m_footerEdit->ui()->m_teSummary->toPlainText(), positions, d, fullTax, redTax); mAssistant->postCard()->setHeaderData( m_headerEdit->m_cbType->currentText(), dStr, m_headerEdit->m_postAddressEdit->toPlainText(), getDocument()->ident(), preText ); mAssistant->postCard()->setPositions( positions, currentTaxSetting(), DocumentMan::self()->tax( d ), DocumentMan::self()->reducedTax( d ) ); mAssistant->postCard()->setFooterData( postText, m_footerEdit->greeting() ); mAssistant->postCard()->renderDoc( mViewStack->currentIndex() ); // id( mViewStack->visibleWidget() ) ); } DocPositionListIterator it( positions ); DocPositionBase *dp; while( it.hasNext()) { dp = it.next(); if ( dp->type() == DocPositionBase::ExtraDiscount ) { PositionViewWidget *w = ( static_cast( dp ) )->associatedWidget(); if( w ) { w->slotSetOverallPrice( ( static_cast( dp ) )->overallPrice() ); } else { // qDebug () << "Warning: Position object has no associated widget!"; } } } } void KraftView::setupFooter() { m_footerEdit = new KraftDocFooterEdit(this); mViewStack->addWidget( m_footerEdit ); // KraftDoc::Footer ); // ATTENTION: If you change the following inserts, make sure to check the code // in method currentPositionList! m_footerEdit->ui()->mTaxCombo->insertItem( NO_TAX, DefaultProvider::self()->icon("circle-0"), i18n( "Display no tax at all" )); m_footerEdit->ui()->mTaxCombo->insertItem( RED_TAX, DefaultProvider::self()->icon("circle-half-2"), i18n( "Calculate reduced tax for all items" )); m_footerEdit->ui()->mTaxCombo->insertItem( FULL_TAX, DefaultProvider::self()->icon("coin"), i18n( "Calculate full tax for all items" )); m_footerEdit->ui()->mTaxCombo->insertItem( INDI_TAX, i18n( "Calculate individual tax for each item")); // set the tax type combo correctly: If all items have the same tax type, take it. // If items have different, its the individual thing. DocPositionList list = m_doc->positions(); int tt = -1; DocPositionBase *dp = nullptr; DocPositionListIterator it( list ); int taxIndex = 0; while( it.hasNext()) { dp = it.next(); if ( tt == -1 ) tt = dp->taxTypeNumeric(); // store the first entry. else { if ( tt != dp->taxTypeNumeric() ) { taxIndex = INDI_TAX; } else { // old and new taxtype are the same. } } } if ( tt == -1 ) { // means that there is no item yet, the default tax type needs to be used. int deflt = KraftSettings::self()->defaultTaxType(); if ( deflt > 0 ) { deflt -= 1; } taxIndex = deflt; } else { if ( taxIndex == 0 ) { taxIndex = tt-1; } } connect( m_footerEdit->ui()->mTaxCombo,SIGNAL(currentIndexChanged(int)),this,SLOT(slotTaxComboChanged(int))); m_footerEdit->ui()->mTaxCombo->setCurrentIndex( taxIndex ); slotTaxComboChanged( taxIndex ); mTaxBefore = taxIndex; connect(m_footerEdit,SIGNAL(modified()),this,SLOT(slotModifiedFooter())); } void KraftView::slotTaxComboChanged(int newId) { bool allowTaxSetting = false; if( mTaxBefore == newId ) return; if( mTaxBefore == INDI_TAX ) { // we're changing away from individual settings. WARNING needed. // qDebug () << "You switch away from item individual tax settings."; if( QMessageBox::question( this, i18n("Tax Settings Overwrite"), i18n("Really overwrite all individual tax settings of the items?") ) == QMessageBox::No ) { m_footerEdit->ui()->mTaxCombo->setCurrentIndex( INDI_TAX ); return; } } DocPositionBase::TaxType tax = DocPositionBase::TaxFull; if( newId == INDI_TAX ) { allowTaxSetting = true; } else if( newId == RED_TAX ) { tax = DocPositionBase::TaxReduced; } else if( newId == NO_TAX ) { tax = DocPositionBase::TaxNone; } PositionViewWidgetListIterator it( mPositionWidgetList ); while( it.hasNext() ) { PositionViewWidget *w = it.next(); w->slotAllowIndividualTax( allowTaxSetting ); w->slotSetTax( tax ); } mTaxBefore = newId; slotModifiedFooter(); } /* This is the flow in the move up method: 0 Bla1 0 Bla1 0 Bla1 1 Bla2 <- w2 1 Bla2 -> insert at pos-1 => 1 Bla3 pos -> 2 Bla3 <- w1 2 Bla4 2 Bla2 3 Bla4 3 Bla4 */ void KraftView::slotMovePositionUp( int pos ) { PositionViewWidget *w1 = nullptr; PositionViewWidget *w2 = nullptr; // qDebug () << "Moving position up: " << pos; if( pos < 1 || pos > mPositionWidgetList.count() ) { // qDebug () << "ERR: position out of range: " << pos; return; } mPositionWidgetList.swap( pos, pos-1 ); w1 = mPositionWidgetList.at( pos-1 ); w2 = mPositionWidgetList.at( pos ); // Porting ATTENTION: check assignment of w1, w1 // qDebug () << "Found at pos " << pos << " the widgets " << w1 << " and " << w2; if( w1 && w2 ) { // qDebug () << "Setting ord number: " << pos; w1->setOrdNumber( pos ); // note: ordnumbers start with 1, thus add one w2->setOrdNumber( pos+1 ); setMappingId( w1, pos-1 ); setMappingId( w2, pos ); m_positionScroll->moveChild( w2, m_positionScroll->indexOf(w1) ); mModified = true; QTimer::singleShot( 0, this, SLOT(refreshPostCard() ) ); } else { // qDebug () << "ERR: Did not find the two corresponding widgets!"; } } /* 0 Bla1 0 Bla1 0 Bla1 pos -> 1 Bla2 <- w1 1 Bla3 1 Bla3 2 Bla3 <- w2 2 Bla4 -> insert at pos+1 => 2 Bla2 3 Bla4 3 Bla4 */ void KraftView::slotMovePositionDown( int pos ) { PositionViewWidget *w1 = nullptr; PositionViewWidget *w2 = nullptr; // qDebug () << "Moving position down: " << pos; if( pos < 0 || pos >= mPositionWidgetList.count() -1 ) { // qDebug () << "ERR: position out of range: " << pos; return; } mPositionWidgetList.swap( pos, pos+1); w1 = mPositionWidgetList.at( pos+1 ); w2 = mPositionWidgetList.at( pos ); // Porting ATTENTION: check assignment of w1, w1 if( w1 && w2 ) { w1->setOrdNumber( pos+2 ); w2->setOrdNumber( pos+1 ); setMappingId( w1, pos+1 ); setMappingId( w2, pos ); m_positionScroll->moveChild( w1, m_positionScroll->indexOf( w2 ) ); mModified = true; QTimer::singleShot( 0, this, SLOT( refreshPostCard() ) ); } else { // qDebug () << "ERR: Did not find the two corresponding widgets!"; } } void KraftView::slotDeletePosition( int pos ) { PositionViewWidget *w1 = mPositionWidgetList.at( pos ); if( w1 ) { w1->slotSetState( PositionViewWidget::Deleted ); w1->slotModified(); } } void KraftView::slotLockPosition( int pos ) { // qDebug () << "Locking Position " << pos; PositionViewWidget *w1 = mPositionWidgetList.at( pos ); if( w1 ) { w1->slotSetState( PositionViewWidget::Locked ); refreshPostCard(); } } void KraftView::slotUnlockPosition( int pos ) { // qDebug () << "Unlocking Position " << pos; PositionViewWidget *w1 = mPositionWidgetList.at( pos ); if( w1 ) { w1->slotSetState( PositionViewWidget::Active ); refreshPostCard(); } } void KraftView::slotPositionModified( int ) { // qDebug () << "Modified Position " << pos; mModified = true; QTimer::singleShot( 0, this, SLOT( refreshPostCard() ) ); } void KraftView::slotAddressFound(const QString& uid, const KContacts::Addressee& contact) { const QString currAddress = m_headerEdit->m_postAddressEdit->toPlainText(); const QString newAddress = mAddressProvider->formattedAddress(contact); bool replace = true; if( currAddress.isEmpty() ) { replace = true; } else if(currAddress != newAddress) { // non empty and current different from new address // need to ask first if we overwrite if( QMessageBox::question( this, i18n("Address Overwrite"), i18n("The address label is not empty and different from the selected one.
              " "Do you really want to replace it with the text shown below?
              %1
              ", newAddress) ) == QMessageBox::No ) { replace = false; } } else if( currAddress == newAddress ) { // both are equal, no action needed return; } if( replace ) { mContactUid = uid; m_headerEdit->m_labName->setText( contact.realName() ); m_headerEdit->m_postAddressEdit->setText( newAddress ); // Generate the welcome m_headerEdit->m_letterHead->clear(); QStringList li = generateLetterHead( contact.familyName(), contact.givenName() ); m_headerEdit->m_letterHead->insertItems(-1, li ); KraftDoc *doc = getDocument(); if( doc->isNew() ) { m_headerEdit->m_letterHead->setCurrentIndex( KraftSettings::self()->salut() ); } else { if(!doc->salut().isEmpty()) { m_headerEdit->m_letterHead->setCurrentText( doc->salut() ); } } } } void KraftView::slotDocTypeChanged( const QString& newType ) { // qDebug () << "Doc Type changed to " << newType; mAssistant->slotSetDocType( newType ); DocType docType( newType ); PositionViewWidgetListIterator it( mPositionWidgetList ); bool allow = docType.allowAlternative() || docType.allowDemand(); while( it.hasNext() ) { PositionViewWidget *w = it.next(); w->slotEnableKindMenu(allow); w->slotShowPrice(docType.pricesVisible()); } mAssistant->postCard()->slotShowPrices( docType.pricesVisible() ); m_footerEdit->ui()->_taxGroup->setVisible( docType.pricesVisible() ); if( mDocPosEditorIndx > -1 ) { KraftDocPositionsEdit *w = dynamic_cast(mViewStack->widget(mDocPosEditorIndx)); if(w) { w->setDiscountButtonVisible(docType.pricesVisible()); } } } void KraftView::slotLanguageSettings() { // qDebug () << "Language Settings"; // FIXME } void KraftView::slotNewHeaderText( const DocText& dt, bool replace ) { if (replace) { m_headerEdit->m_teEntry->setPlainText( dt.text()); } else { m_headerEdit->m_teEntry->insertPlainText(dt.text()); } slotModifiedHeader(); } void KraftView::slotNewFooterText( const DocText& dt, bool replace ) { if (replace) { m_footerEdit->ui()->m_teSummary->setPlainText(dt.text()); } else { m_footerEdit->ui()->m_teSummary->insertPlainText(dt.text()); } slotModifiedFooter(); } // Add a new item. A katalog is required if user wants to store it in a // catalog immediately. FIXME - now the current active catalog in the // catalog selection is used. void KraftView::slotAddNewItem() { Katalog* kat = mAssistant->catalogSelection()->currentSelectedKat(); slotAddItem( kat, nullptr, QString() ); } void KraftView::slotAddItems( Katalog *kat, CatalogTemplateList templates, const QString& selectedChapter) { if(templates.count() == 0) { slotAddItem(kat, nullptr, selectedChapter); } else { for(CatalogTemplate *templ : templates ) { slotAddItem( kat, templ, selectedChapter ); } } } void KraftView::slotAddItem( Katalog *kat, CatalogTemplate *tmpl, const QString& selectedChapter ) { // newpos is a list position, starts counting at zero! int newpos = mPositionWidgetList.count(); // qDebug () << "Adding Position at list position " << newpos; QScopedPointer dia; DocPosition *dp = new DocPosition(); dp->setPositionNumber( newpos +1 ); bool newTemplate = false; if ( !tmpl ) { newTemplate = true; } dia.reset(new InsertTemplDialog( this )); dia->setCatalogChapters( kat->getKatalogChapters(), selectedChapter); int tmplId = 0; if ( !newTemplate ) { // it's not a new template dp->setText(tmpl->getText()); dp->setUnit(tmpl->unit()); dp->setUnitPrice(tmpl->unitPrice()); } if ( mRememberAmount > 0 ) { dp->setAmount( mRememberAmount ); } KraftDoc *doc = getDocument(); if(doc) { DocType docType = doc->docType(); dia->setDocPosition( dp, newTemplate, docType.pricesVisible() ); } DocPositionList list = currentPositionList(); dia->setPositionList( list, newpos ); QSize s = KraftSettings::self()->templateToPosDialogSize(); dia->resize( s ); int execResult = dia->exec(); if ( execResult == QDialog::Accepted ) { DocPosition diaPos = dia->docPosition(); *dp = diaPos; // set the tax settings if( currentTaxSetting() == DocPositionBase::TaxIndividual ) { // FIXME: In case a new item is added, add the default tax type. // otherwise add the tax of the template dp->setTaxType( DocPositionBase::TaxFull ); } else { dp->setTaxType( currentTaxSetting() ); } // store the initial size of the template-to-doc-pos dialogs s = dia->size(); KraftSettings::self()->setTemplateToPosDialogSize( s ); if ( kat->type() == TemplateCatalog ) { // save the template if it is has a valid chapter. // the method chapter() considers the checkbox. If it is not checked to keep the template, // an empty chapter is returned. const QString chapter = dia->chapter(); if (!chapter.isEmpty()) { int chapterId = KatalogMan::self()->defaultTemplateCatalog()->chapterID(chapter).toInt(); FloskelTemplate *flos = new FloskelTemplate( -1, dp->text(), dp->unit().id(), chapterId, 1 /* CalcKind = Manual */ ); flos->setManualPrice( dp->unitPrice() ); flos->save(); tmplId = flos->getTemplID(); // reload the entire katalog Katalog *defaultKat = KatalogMan::self()->defaultTemplateCatalog(); if( defaultKat ) { defaultKat->load(); KatalogMan::self()->notifyKatalogChange( defaultKat , dbID() ); } } else if (!newTemplate && tmpl){ tmplId = static_cast(tmpl)->getTemplID(); } } else if ( kat->type() == MaterialCatalog ) { if ( !newTemplate ) { tmplId = static_cast(tmpl)->getID(); } } } if (execResult == QDialog::Accepted) { newpos = dia->insertAfterPosition(); mRememberAmount = dp->amount(); if (tmplId > 0 && tmpl) { QPair newUsage = kat->recordUsage(tmplId); tmpl->setUseCounter(newUsage.first); tmpl->setLastUsedDate(newUsage.second); } PositionViewWidget *widget = createPositionViewWidget( dp, newpos ); widget->slotModified(); widget->slotAllowIndividualTax( currentTaxSetting() == DocPositionBase::TaxIndividual ); // Check if the new widget is supposed to display prices, based on the doc type // FIXME: Shouldn't this be done by the positionViewWidget rather than here? const QString dt = getDocument()->docType(); if( !dt.isEmpty() ) { DocType docType(dt); widget->slotShowPrice(docType.pricesVisible()); } slotFocusItem( widget, newpos ); refreshPostCard(); } } void KraftView::slotImportItems() { ImportItemDialog dia( this ); DocPositionList list = currentPositionList(); int newpos = list.count(); dia.setPositionList( list, newpos ); if ( dia.exec() ) { DocPositionList list = dia.positionList(); if ( list.count() > 0 ) { // qDebug () << "Importlist amount of entries: " << list.count(); int cnt = 0; int newpos = dia.getPositionCombo()->currentIndex(); // qDebug () << "Newpos is " << newpos; DocPositionListIterator posIt( list ); while( posIt.hasNext() ) { DocPosition *dp_old = static_cast(posIt.next()); DocPosition *dp = new DocPosition( *(dp_old) ); dp->setTaxType( currentTaxSetting() ); PositionViewWidget *widget = createPositionViewWidget( dp, newpos + cnt++ ); widget->slotSetTax( DocPositionBase::TaxFull ); // FIXME: Value from Import? widget->slotModified(); } refreshPostCard(); } } } void KraftView::slotAddExtraPosition() { // newpos is a list position, starts counting at 0 int newpos = mPositionWidgetList.count(); // qDebug () << "Adding EXTRA Position at position " << newpos; DocPosition *dp = new DocPosition( DocPosition::ExtraDiscount ); dp->setPositionNumber( newpos+1 ); dp->setText( i18n( "Discount" ) ); Einheit e = UnitManager::self()->getPauschUnit(); dp->setUnit(e); if( currentTaxSetting() == DocPositionBase::TaxIndividual ) { dp->setTaxType( DocPositionBase::TaxFull ); } else { dp->setTaxType( currentTaxSetting() ); } // qDebug () << "New Extra position is " << dp; PositionViewWidget *widget = createPositionViewWidget( dp, newpos ); // qDebug () << "PositionViewWiget doc position is: " << widget->position(); widget->slotModified(); slotFocusItem( widget, newpos ); refreshPostCard(); } DocPositionList KraftView::currentPositionList() { DocPositionList list; PositionViewWidget *widget = nullptr; int cnt = 1; PositionViewWidgetListIterator outerIt( mPositionWidgetList ); bool progress = true; while ( progress && ( list.count() != mPositionWidgetList.count() ) ) { // the loop runs until all positions have a valid price. int preListCnt = list.count(); // qDebug() << "# Pre List Count: " << preListCnt; while ( outerIt.hasNext() ) { widget = outerIt.next(); DocPositionBase *dpb = widget->position(); QMap replaceMap; if ( dpb ) { DocPosition *newDp = new DocPosition( dpb->type() ); newDp->setPositionNumber( cnt++ ); newDp->setAttributeMap( dpb->attributes() ); newDp->setDbId( dpb->dbId().toInt() ); newDp->setAssociatedWidget( widget ); bool calculatable = true; if ( dpb->type() == DocPosition::ExtraDiscount ) { double discount = widget->mDiscountPercent->value(); /* set Attributes with the discount percentage */ Attribute a( DocPosition::Discount ); a.setPersistant( true ); a.setValue( discount ); newDp->setAttribute(a); // get the required tag as String. const QString tagRequiredStr = widget->extraDiscountTagRestriction(); if ( !tagRequiredStr.isEmpty() ) { Attribute tr(DocPosition::ExtraDiscountTagRequired); tr.setPersistant( true ); // Convert the string to int and save to database const TagTemplate ttRequired = TagTemplateMan::self()->getTagTemplate(tagRequiredStr); int trId = TagTemplateMan::self()->getTagTemplate(tagRequiredStr).dbId().toInt(); tr.setValue( QVariant( trId ) ); newDp->setAttribute( tr ); } /* Calculate the current sum over all widgets */ PositionViewWidgetListIterator it( mPositionWidgetList ); PositionViewWidget *w1; Geld sum; // qDebug () << "Starting to loop over the items "; while ( calculatable && it.hasNext() ) { w1 = it.next(); if ( widget != w1 ) { // ATTENTION Porting: do not take the own value into account if ( tagRequiredStr.isEmpty() // means that all positions are to calculate || w1->tagList().contains( tagRequiredStr ) ) { // tagList() returns strings, not Ids. if ( w1->priceValid() ) { sum += w1->currentPrice(); // qDebug () << "Summing up pos with text " << w1->ordNumber() << " and price " // << w1->currentPrice().toLong(); } else { calculatable = false; // give up, we continue in outerIt // qDebug () << "We skip pos " << w1->ordNumber(); } } } else { // we cannot calculate ourselves. // qDebug () << "Skipping pos " << w1->ordNumber() << " in summing up, thats me!"; } } // qDebug () << "Finished loop over items with calculatable=" << calculatable; if ( calculatable ) { sum = sum.percent( discount ); newDp->setUnitPrice( sum ); newDp->setAmount( 1.0 ); widget->setCurrentPrice( sum ); } // replace some tags in the text replaceMap["%DISCOUNT"] = DefaultProvider().self()->locale()->toString( discount ); replaceMap["%ABS_DISCOUNT"] = DefaultProvider().self()->locale()->toString( qAbs( discount ) ); } else { /* Type is ordinary position */ newDp->setUnitPrice( widget->unitPrice() ); double v = widget->m_sbAmount->value(); newDp->setAmount( v ); widget->setCurrentPrice( newDp->overallPrice() ); } if ( calculatable ) { // copy information from the widget bool deleted = widget->deleted(); newDp->setToDelete(deleted); QString t = widget->m_teFloskel->toPlainText(); if ( !replaceMap.empty() ) { t = StringUtil::replaceTagsInString(t, replaceMap); } newDp->setText( t ); QString h = widget->m_cbUnit->currentText(); int eId = UnitManager::self()->getUnitIDSingular( h ); Einheit e = UnitManager::self()->getUnit( eId ); newDp->setUnit( e ); PositionViewWidget::Kind k = widget->kind(); if ( k != PositionViewWidget::Normal ) { Attribute a( DocPosition::Kind ); a.setPersistant( true ); a.setValue( PositionViewWidget::techKindString(k) ); newDp->setAttribute( a ); } else { newDp->removeAttribute( DocPosition::Kind ); } /* set Attribute with the tags */ const QStringList tagStrings = widget->tagList(); newDp->replaceTags(tagStrings); // qDebug() << "============ " << tags.toString(); // tax settings if( currentTaxSetting() == DocPositionBase::TaxIndividual ) { newDp->setTaxType( widget->taxType() ); } else { newDp->setTaxType( currentTaxSetting() ); } list.append( newDp ); } } else { qCritical() << "Fatal: Widget without position found!"; } } // qDebug() << " Post List Count: " << list.count(); if ( preListCnt == list.count() ) { qCritical() << "No progress in widget list processing - abort!"; progress = false; } } return list; } void KraftView::slotShowCatalog( bool on ) { if ( on ) { mAssistant->slotShowCatalog(); } else { mAssistant->setFullPreview( true, KraftDoc::Positions ); } } void KraftView::slotModifiedPositions() { // As long as the modified mapper is blocked, ignore this. if( mModifiedMapper->signalsBlocked() ) { return; } qDebug () << "Position Modified"; mModified = true; } void KraftView::slotModifiedHeader() { // qDebug () << "Modified the header!"; // As long as the modified mapper is blocked, ignore this. if( mModifiedMapper->signalsBlocked() ) { return; } mModified = true; QTimer::singleShot( 0, this, SLOT( refreshPostCard() ) ); } void KraftView::slotModifiedFooter() { // qDebug () << "Modified the footer!"; // As long as the modified mapper is blocked, ignore this. if( mModifiedMapper->signalsBlocked() ) { return; } mModified = true; QTimer::singleShot( 0, this, SLOT( refreshPostCard() ) ); } QStringList KraftView::generateLetterHead( const QString& familyName, const QString& givenName ) { QStringList s; QMap m; m[ "%NAME"] = familyName; m[ "%GIVEN_NAME"] = givenName; return KraftDB::self()->wordList( "salut", m ); } void KraftView::done( int r ) { //Closed using the cancel button .. Check if we can close bool doSave = false; if (mModified) { doSave = true; if(r == 0) { QMessageBox msgBox; msgBox.setText(i18n("The document has been modified.")); msgBox.setInformativeText(i18n("Do you want to save your changes?")); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Save); msgBox.exec(); auto res = msgBox.result(); if (res == QMessageBox::Cancel) return; if (res == QMessageBox::Discard) doSave = false; } //Closed using the OK button .. it can be closed, but data needs saved if( doSave) saveChanges(); emit viewClosed( r == 1, m_doc ); } // remember the sizes of the docassistant splitter if visible. mAssistant->saveSplitterSizes(); KraftSettings::self()->setDocViewSplitter(mCSplit->sizes()); const QByteArray geo = saveGeometry().toBase64(); KraftSettings::self()->setDocEditGeometry(geo); QDialog::done( r ); } void KraftView::saveChanges() { // qDebug () << "Saving changes!"; KraftDoc *doc = getDocument(); if( !doc ) { // qDebug () << "ERR: No document available in view, return!"; return; } // transfer all values to the document doc->setDate( m_headerEdit->m_dateEdit->date() ); doc->setAddressUid( mContactUid ); doc->setAddress( m_headerEdit->m_postAddressEdit->toPlainText() ); doc->setDocType( m_headerEdit->m_cbType->currentText() ); doc->setPreTextRaw( m_headerEdit->m_teEntry->toPlainText() ); doc->setWhiteboard( m_headerEdit->m_whiteboardEdit->toPlainText() ); doc->setProjectLabel( m_headerEdit->mProjectLabelEdit->text() ); doc->setSalut( m_headerEdit->m_letterHead->currentText() ); doc->setPostTextRaw( m_footerEdit->ui()->m_teSummary->toPlainText() ); doc->setGoodbye( m_footerEdit->greeting() ); DocPositionList list = currentPositionList(); doc->setPositionList( list ); doc->saveDocument( ); if ( doc->isNew() ) { // For new documents the user had to select a greeting and we make this // default for the future KraftSettings::self()->setGreeting( m_footerEdit->greeting() ); KraftSettings::self()->setSalut( m_headerEdit->m_letterHead->currentIndex() ); } } void KraftView::slotFocusItem( PositionViewWidget *posWidget, int pos ) { if( posWidget && pos > 0) { int y = (1+pos)*posWidget->height(); m_positionScroll->ensureVisible(0, y); } else { m_positionScroll->ensureVisible( 0, 0 ); } // setting Focus within the item. if( posWidget ) { if( posWidget->m_teFloskel->toPlainText().isEmpty() ) { posWidget->m_teFloskel->setFocus(); } else { posWidget->m_sbAmount->setFocus(); } } } void KraftView::discardChanges() { // We need to reread the document KraftDoc *doc = getDocument(); if( doc && doc->isModified() ) { // qDebug () << "Document refetch from database"; doc->reloadDocument(); } } kraft-1.2.2/src/kraftview.h000066400000000000000000000143371467704360200156060ustar00rootroot00000000000000/*************************************************************************** kraftview.h - view of kraft documents ------------------- begin : Mit Dez 31 19:24:05 CET 2003 copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef KRAFTVIEW_H #define KRAFTVIEW_H /** The KraftView class provides the view widget for the KraftApp instance. * The View instance inherits QWidget as a base class and represents * the view object of a KTMainWindow. As KraftView is part of the * docuement-view model, it needs a reference to the document object * connected with it by the KraftApp class to manipulate and display * the document structure provided by the KraftDoc class. * * @author Source Framework Automatically Generated by KDevelop, (c) The KDevelop Team. * @version KDevelop version 0.4 code generation */ // include files for Qt #include #include #include #include #include #include "kraftdoc.h" #include "positionviewwidget.h" #include "catalogtemplate.h" #include "ui_docheader.h" #include "ui_docfooter.h" class PositionViewWidget; class DocPosition; class DocText; class QLabel; class QWidget; class QResizeEvent; class QSignalMapper; class QStackedWidget; class QSplitter; class DocPostCard; class QTimer; class DocAssistant; class CalcPartList; class AddressProvider; class KraftDocFooterEdit; class Katalog; class KraftViewScroll; class KraftViewBase: public QDialog { Q_OBJECT public: enum Type { ReadWrite, ReadOnly }; KraftViewBase(QWidget *parent) : QDialog(parent), m_type(ReadWrite) { } virtual ~KraftViewBase() { } Type type() { return m_type; } protected: KraftDoc *getDocument() const { return m_doc; } virtual void setup( DocGuardedPtr doc ) { m_doc = doc; } DocGuardedPtr m_doc; Type m_type; protected slots: virtual void slotLinkClicked(const QString& link) = 0; signals: void viewClosed( bool, DocGuardedPtr ); void openROView( QString docId ); private: }; class KraftView : public KraftViewBase { Q_OBJECT public: /** Constructor for the main view */ KraftView(QWidget *parent); /** Destructor for the main view */ virtual ~KraftView(); /** returns a pointer to the document connected to the view instance. Mind that this method requires a KraftApp instance as a parent * widget to get to the window document pointer by calling the KraftApp::getDocument() method. * * @see KraftApp#getDocument */ typedef QMap PositionMap; DocPositionList currentPositionList(); DocPositionBase::TaxType currentTaxSetting(); void setup( DocGuardedPtr doc ); public slots: void slotAddressFound(const QString& uid, const KContacts::Addressee &contact); void slotAddresseeFound( const QString& uid, const KContacts::Addressee& contact); void redrawDocument( ); void slotModifiedPositions(); void slotModifiedHeader(); void slotModifiedFooter(); void slotAddItem( Katalog*, CatalogTemplate*, const QString& selectedChapter); void slotAddNewItem(); void slotAddItems(Katalog*, CatalogTemplateList , const QString &selectedChapter); void slotAddExtraPosition(); void slotImportItems(); void slotFocusItem( PositionViewWidget*, int ); void slotNewHeaderText(const DocText& dt , bool replace); void slotNewFooterText(const DocText& dt , bool replace); void slotSwitchToPage( int ); protected slots: // void closeEvent(QCloseEvent *event); void redrawDocPositions( ); void done( int ); void slotMovePositionUp( int ); void slotMovePositionDown( int ); void slotDeletePosition( int ); void slotUnlockPosition( int ); void slotLockPosition( int ); void slotPositionModified( int ); void refreshPostCard( ); void slotShowCatalog( bool ); void slotShowTemplates( bool ); void slotDocTypeChanged( const QString& ); void slotLanguageSettings(); void slotPickAddressee(); void slotTaxComboChanged( int ); void slotNewAddress( const KContacts::Addressee& contact, bool interactive = true ); void slotLinkClicked(const QString& link); signals: void selectPage( int ); void positionSelected( Katalog*, void* ); private: void setupDocHeaderView(); void setupItems(); void setupFooter(); void setupTextsView(); void setMappingId( QWidget *, int ); void setupMappers(); void saveChanges(); void discardChanges(); PositionViewWidget *createPositionViewWidget( DocPositionBase*, int ); QStringList generateLetterHead(const QString &familyName , const QString &givenName); KraftViewScroll *m_positionScroll; Ui::DocHeaderEdit *m_headerEdit; // Ui::DocFooterEdit *m_footerEdit; KraftDocFooterEdit *m_footerEdit; PositionViewWidgetList mPositionWidgetList; QString mContactUid; QSignalMapper *mDeleteMapper; QSignalMapper *mMoveUpMapper; QSignalMapper *mMoveDownMapper; QSignalMapper *mUnlockPositionMapper; QSignalMapper *mLockPositionMapper; QSignalMapper *mModifiedMapper; AddressProvider *mAddressProvider; QLabel *mDetailHeader; QSplitter *mCSplit; QPushButton *mCatalogToggle; QLabel *mHelpLabel; QWidget *mSumSpacer; QStackedWidget *mViewStack; int mHeaderId; DocAssistant *mAssistant; double mRememberAmount; QMap mCalculationsMap; bool mModified; int mTaxBefore; int mDocPosEditorIndx; }; #endif // KRAFTVIEW_H kraft-1.2.2/src/kraftview_ro.cpp000066400000000000000000000230401467704360200166300ustar00rootroot00000000000000/*************************************************************************** kraftview.cpp - ------------------- begin : Mit Dez 31 19:24:05 CET 2003 copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include #include #include #include #include #include #include #include #include // application specific includes #include "kraftsettings.h" #include "kraftview_ro.h" #include "kraftdoc.h" #include "ui_docheader.h" #include "positionviewwidget.h" #include "ui_docfooter.h" #include "docposition.h" #include "defaultprovider.h" #include "doctype.h" #include "format.h" #include "htmlview.h" #include "texttemplate.h" #include "documentman.h" #include #include #include // ######################################################### KraftViewRO::KraftViewRO(QWidget *parent, const char *name) : KraftViewBase( parent ) { setObjectName( name ); setModal( false ); setWindowTitle( i18n("Document" ) ); QWidget *mainWidget = new QWidget(this); QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); mainLayout->addWidget(mainWidget); m_type = ReadOnly; mHtmlView = new HtmlView( this ); mainLayout->addWidget(mHtmlView); mHtmlView->setStylesheetFile( "docoverview_ro.css" ); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); } KraftViewRO::~KraftViewRO() { } #define QL1(X) QStringLiteral(X) QString KraftViewRO::htmlify( const QString& str ) const { const QStringList li = str.toHtmlEscaped().split( "\n" ); return QL1("

              ") + li.join( "

              " ) + QL1("

              "); } #define DOC_RO_TAG(X) QLatin1String(X) void KraftViewRO::setup( DocGuardedPtr doc ) { KraftViewBase::setup( doc ); if ( !doc ) return; QLocale *locale = DefaultProvider::self()->locale(); // do stuff like open a template and render values into it. QString tmplFile = DefaultProvider::self()->locateFile( "views/kraftdoc_ro.thtml" ); if( tmplFile.isEmpty() ) { // qDebug () << "Could not find template to render ro view of document."; return; } else { qDebug() << "Template file: " << tmplFile; } TextTemplate tmpl; tmpl.setTemplateFileName(tmplFile); if( !tmpl.isOk() ) { return; } tmpl.setValue( DOC_RO_TAG( "HEADLINE" ), doc->docType() + " " + doc->ident() ); tmpl.setValue( DOC_RO_TAG( "DATE" ), Format::toDateString(doc->date(), KraftSettings::self()->dateFormat())); tmpl.setValue( DOC_RO_TAG( "DOC_TYPE" ), doc->docType() ); QString address = doc->address(); address.replace( '\n', "
              " ); tmpl.setValue( DOC_RO_TAG( "ADDRESS" ), address ); tmpl.setValue( DOC_RO_TAG( "DOCNO" ), doc->ident() ); tmpl.setValue( DOC_RO_TAG( "PRETEXT" ), htmlify(doc->preText()) ); tmpl.setValue( DOC_RO_TAG( "POSTTEXT" ), htmlify(doc->postText()) ); tmpl.setValue( DOC_RO_TAG( "SALUT" ), doc->salut() ); tmpl.setValue( DOC_RO_TAG( "GOODBYE" ), doc->goodbye() ); DocPositionList positions = doc->positions(); // check the tax settings: If all items have the same settings, its not individual. bool individualTax = false; int ttype = -1; foreach( DocPositionBase *dp, positions ) { if( ttype == -1 ) { ttype = dp->taxType(); } else { if( ttype != dp->taxType() ) { // different from previous one? individualTax = true; break; } } } int pos = 1; int taxFreeCnt = 0; int reducedTaxCnt = 0; int fullTaxCnt = 0; QString docType = doc->docType(); DocType dt(docType); foreach( DocPositionBase *dpb, positions ) { DocPosition *dp = static_cast(dpb); tmpl.createDictionary( "ITEMS" ); tmpl.setValue( "ITEMS", "NUMBER", QString::number( pos++ ) ); tmpl.setValue( "ITEMS", "TEXT", htmlify(dp->text() )); tmpl.setValue( "ITEMS", "AMOUNT", locale->toString( dp->amount() ) ); tmpl.setValue( "ITEMS", "UNIT", dp->unit().einheit( dp->amount() ) ); double singlePrice = dp->unitPrice().toDouble(); if( dt.pricesVisible() ) { tmpl.createSubDictionary("ITEMS", "PRICE_DISPLAY"); tmpl.setValue( "PRICE_DISPLAY", "SINGLE_PRICE", locale->toCurrencyString( singlePrice ) ); QString style( "positive" ); if ( singlePrice < 0 ) { style = "negative"; } tmpl.setValue( "PRICE_DISPLAY", "PRICE_STYLE", style ); tmpl.setValue( "PRICE_DISPLAY", "PRICE", locale->toCurrencyString( dp->overallPrice().toDouble() ) ); QString taxType; if( individualTax ) { if( dp->taxType() == 1 ) { taxFreeCnt++; taxType = "TAX_FREE"; } else if( dp->taxType() == 2 ) { taxType = "REDUCED_TAX"; reducedTaxCnt++; } else { // ATTENTION: Default for all non known tax types is full tax. fullTaxCnt++; taxType = "FULL_TAX"; } } tmpl.createSubDictionary("PRICE_DISPLAY", taxType); } } if( dt.pricesVisible()) { tmpl.createDictionary("DISPLAY_SUM_BLOCK"); tmpl.setValue( "DISPLAY_SUM_BLOCK", DOC_RO_TAG( "TAXLABEL" ), i18n( "VAT" ) ); tmpl.setValue( "DISPLAY_SUM_BLOCK", DOC_RO_TAG( "REDUCED_TAXLABEL" ), i18n( "Reduced TAX" ) ); tmpl.setValue( "DISPLAY_SUM_BLOCK", DOC_RO_TAG( "NETTOSUM" ), locale->toCurrencyString( doc->nettoSum().toDouble() ) ); tmpl.setValue( "DISPLAY_SUM_BLOCK", DOC_RO_TAG( "BRUTTOSUM" ), locale->toCurrencyString( doc->bruttoSum().toDouble() ) ); if( individualTax ) { tmpl.createSubDictionary( "DISPLAY_SUM_BLOCK", "TAX_FREE_ITEMS" ); tmpl.setValue( "TAX_FREE_ITEMS", "COUNT", QString::number( taxFreeCnt )); tmpl.createSubDictionary( "DISPLAY_SUM_BLOCK", "REDUCED_TAX_ITEMS" ); tmpl.setValue( "REDUCED_TAX_ITEMS", "COUNT", QString::number( reducedTaxCnt )); tmpl.setValue( "REDUCED_TAX_ITEMS", "TAX", locale->toString( DocumentMan::self()->reducedTax( doc->date() ))); tmpl.createSubDictionary( "DISPLAY_SUM_BLOCK", "FULL_TAX_ITEMS" ); tmpl.setValue( "FULL_TAX_ITEMS", "COUNT", QString::number( fullTaxCnt )); tmpl.setValue( "FULL_TAX_ITEMS", "TAX", locale->toString( DocumentMan::self()->tax( doc->date() )) ); } double redTax = DocumentMan::self()->reducedTax( doc->date() ); double fullTax = DocumentMan::self()->tax( doc->date() ); QString h; if ( positions.reducedTaxSum( redTax ).toLong() > 0 ) { tmpl.createSubDictionary( "DISPLAY_SUM_BLOCK", "SECTION_REDUCED_TAX" ); tmpl.setValue( "SECTION_REDUCED_TAX", DOC_RO_TAG( "REDUCED_TAX_SUM" ), positions.reducedTaxSum( redTax ).toLocaleString() ); h.setNum( redTax, 'f', 1 ); tmpl.setValue( "SECTION_REDUCED_TAX", DOC_RO_TAG( "REDUCED_TAX" ), h ); tmpl.setValue( "SECTION_REDUCED_TAX", DOC_RO_TAG( "REDUCED_TAX_LABEL" ), i18n( "reduced VAT" ) ); } if ( positions.fullTaxSum( fullTax ).toLong() > 0 ) { tmpl.createSubDictionary( "DISPLAY_SUM_BLOCK", "SECTION_FULL_TAX" ); tmpl.setValue( "SECTION_FULL_TAX", DOC_RO_TAG( "FULL_TAX_SUM" ), positions.fullTaxSum( fullTax ).toLocaleString() ); h.setNum( fullTax, 'f', 1 ); tmpl.setValue( "SECTION_FULL_TAX", DOC_RO_TAG( "FULL_TAX" ), h ); tmpl.setValue( "SECTION_FULL_TAX", DOC_RO_TAG( "FULL_TAX_LABEL" ), i18n( "VAT" ) ); } tmpl.setValue( "DISPLAY_SUM_BLOCK", DOC_RO_TAG( "TAXSUM" ), locale->toCurrencyString( doc->vatSum().toDouble() ) ); } // Visible sum block setWindowTitle( m_doc->docIdentifier() ); mHtmlView->setTitle( doc->docIdentifier() ); const QString html = tmpl.expand(); mHtmlView->displayContent(html); } void KraftViewRO::slotLinkClicked(const QString& link) { Q_UNUSED(link) // nothing we do here yet } void KraftViewRO::done( int r ) { // qDebug () << "View closed with ret value " << r; KraftDoc *doc = getDocument(); if( !doc ) { // qDebug () << "ERR: No document available in view, return!"; return; } emit viewClosed( true, m_doc ); KraftViewBase::done(r); } kraft-1.2.2/src/kraftview_ro.h000066400000000000000000000046211467704360200163010ustar00rootroot00000000000000/*************************************************************************** kraftview.h - view of kraft documents ------------------- begin : Mit Dez 31 19:24:05 CET 2003 copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef KRAFTVIEW_RO_H #define KRAFTVIEW_RO_H // include files for Qt #include #include #include #include #include #include #include "kraftdoc.h" /** The KraftViewRO class provides the read only view widget for Kraft documents. * The View instance inherits QWidget as a base class and represents * the view object of a KTMainWindow. As KraftView is part of the * docuement-view model, it needs a reference to the document object * connected with it by the KraftApp class to manipulate and display * the document structure provided by the KraftDoc class. * * @author Source Framework Automatically Generated by KDevelop, (c) The KDevelop Team. * @version KDevelop version 0.4 code generation */ #include "positionviewwidget.h" #include "catalogtemplate.h" #include "kraftview.h" class Katalog; class HtmlView; class KraftViewRO : public KraftViewBase { public: /** Constructor for the main view */ KraftViewRO(QWidget *parent, const char *name=0); /** Destructor for the main view */ virtual ~KraftViewRO(); void setup( DocGuardedPtr doc ); QString htmlify( const QString& str ) const; protected slots: void done( int ); void slotLinkClicked(const QString& link); signals: void positionSelected( Katalog*, void* ); private: HtmlView *mHtmlView; }; #endif // KRAFTVIEW_RO_H kraft-1.2.2/src/main.cpp000066400000000000000000000053141467704360200150560ustar00rootroot00000000000000/*************************************************************************** main.cpp - ------------------- begin : Mit Dez 31 19:24:05 CET 2003 copyright : (C) 2003 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "version.h" #include "portal.h" #include "defaultprovider.h" #include "archdocposition.h" int main(int argc, char *argv[]) { Q_INIT_RESOURCE(kraft); const QByteArray domain {"kraft"}; qRegisterMetaType("ArchDocPositionList"); QApplication app(argc, argv); app.setWindowIcon(QIcon(":/kraft/custom-icons/kraft-simple.svg")); app.setApplicationName("kraft"); app.setApplicationDisplayName("Kraft"); app.setApplicationVersion(QString("version %1").arg(Kraft::Version::number())); const QString path = QCoreApplication::applicationDirPath()+ QStringLiteral("/../share/locale"); qDebug() << "Setting additional Locale path:" << path; KLocalizedString::setApplicationDomain(domain.data()); KLocalizedString::addDomainLocaleDir(domain, path); QCommandLineParser parser; parser.addVersionOption(); parser.addHelpOption(); parser.addOption(QCommandLineOption(QStringList() << QLatin1String("d"), i18n("Open document with arch doc number "), QLatin1String("number"))); parser.addOption(QCommandLineOption(QStringList() << QLatin1String("r"), i18n("Open Kraft in read only mode - document changes prohibited") )); parser.process(app); // Register the supported options QScopedPointer kraftPortal; kraftPortal.reset( new Portal( nullptr, &parser, "kraft main window" )); kraftPortal->show(); return app.exec(); } kraft-1.2.2/src/matcalcdialog.cpp000066400000000000000000000035601467704360200167170ustar00rootroot00000000000000/*************************************************************************** matcalcdialog - ------------------- begin : 2005-03-00 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include "matcalcdialog.h" #include "materialcalcpart.h" #include "stockmaterial.h" MatCalcDialog::MatCalcDialog( MaterialCalcPart *mc, QWidget *parent ) : CalcDialogBase( parent ), _matWidget(new Ui::calcdetailMat), m_mc(mc) { _matWidget->setupUi(_centralWidget); _matWidget->m_inpMenge->setValue(mc->getCalcAmount()); init(mc->getCalcAmount()); } void MatCalcDialog::init(double amount) { Einheit e = m_mc->getMaterial()->unit(); _matWidget->matLabel->setText( m_mc->getMaterial()->getText()); _matWidget->einheitLabel->setText( e.einheit(amount) ); } void MatCalcDialog::accept() { double val = _matWidget->m_inpMenge->value(); m_mc->setCalcAmount(val); emit( matCalcPartChanged(m_mc)); CalcDialogBase::accept(); } MatCalcDialog::~MatCalcDialog( ) { } /* END */ kraft-1.2.2/src/matcalcdialog.h000066400000000000000000000030401467704360200163550ustar00rootroot00000000000000/*************************************************************************** matcalcdialog - ------------------- begin : 2005-03-00 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _MATCALCDIALOG_H #define _MATCALCDIALOG_H // include files #include #include "ui_matpartui.h" #include "calcdialogbase.h" class StockMaterial; class MaterialCalcPart; /** * */ class MatCalcDialog : public CalcDialogBase { Q_OBJECT public: MatCalcDialog(MaterialCalcPart *mc, QWidget *parent=0); virtual ~MatCalcDialog(); protected slots: void accept(); signals: void matCalcPartChanged(MaterialCalcPart *mc); private: void init(double); Ui::calcdetailMat *_matWidget; MaterialCalcPart *m_mc; }; #endif /* END */ kraft-1.2.2/src/materialcalcpart.cpp000066400000000000000000000055171467704360200174470ustar00rootroot00000000000000/*************************************************************************** materialcalcpart - ------------------- begin : 2004-09-05 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include // include files for KDE #include #include "materialcalcpart.h" #include "materialkatalogview.h" #include "katalogman.h" #include "stockmaterial.h" #include "unitmanager.h" #include "matkatalog.h" MaterialCalcPart::MaterialCalcPart() : CalcPart(), m_calcID( 0 ) { } MaterialCalcPart::MaterialCalcPart( long mCalcID, long matID, int percent, double amount ) : CalcPart( percent), m_calcID( mCalcID ), m_calcAmount(amount), m_mat(nullptr) { getMatFromID(matID); // overwrites m_mat if( m_mat ) { setName(m_mat->getText()); } } MaterialCalcPart::MaterialCalcPart(long matID, int percent, double amount) : CalcPart( percent), m_calcID(0), m_calcAmount(amount) { getMatFromID(matID); if( m_mat ) { setName(m_mat->getText()); } } MaterialCalcPart::~MaterialCalcPart( ) { // do not delete m_mat because it comes straight from stockmaterialman } void MaterialCalcPart::getMatFromID(long matID) { MatKatalog *k = static_cast(KatalogMan::self()->getKatalog( MaterialKatalogView::MaterialCatalogName )); if( !k ) { k = new MatKatalog( MaterialKatalogView::MaterialCatalogName ); if( k ) { KatalogMan::self()->registerKatalog(k); } } if( k ) { m_mat = k->materialFromId(matID); } } QString MaterialCalcPart::getType() const { return KALKPART_MATERIAL; } Geld MaterialCalcPart::basisKosten() { Geld g; if( m_mat ) { g = m_mat->unitPrice() * m_calcAmount; } return g; } StockMaterial * MaterialCalcPart::getMaterial() { return m_mat; } bool MaterialCalcPart::setCalcAmount( double newAmount ) { // Check for a change first if( qAbs(newAmount - m_calcAmount) > 0.00001 ) { m_calcAmount = newAmount; setDirty(true); } return isDirty(); } /* END */ kraft-1.2.2/src/materialcalcpart.h000066400000000000000000000033621467704360200171100ustar00rootroot00000000000000/*************************************************************************** materialcalcpart - ------------------- begin : 2004-09-05 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _MATERIALCALCPART_H #define _MATERIALCALCPART_H // include files #include #include "calcpart.h" /** * */ class StockMaterial; class StockMaterialList; class QString; class QVariant; class MaterialCalcPart : public CalcPart { public: MaterialCalcPart(); MaterialCalcPart( long mCalcID, long matID, int procent, double amount ); MaterialCalcPart( long matID, int procent, double amount ); ~MaterialCalcPart(); virtual Geld basisKosten(); QString getType() const; StockMaterial* getMaterial(); bool setCalcAmount( double newAmount ); double getCalcAmount(){return m_calcAmount;}; protected: void getMatFromID(long matID); private: long m_calcID; double m_calcAmount; StockMaterial *m_mat; }; #endif /* END */ kraft-1.2.2/src/materialdialog.ui000066400000000000000000000173201467704360200167430ustar00rootroot00000000000000 MaterialDialogBase 0 0 562 313 Edit Material true Qt::Horizontal QSizePolicy::Expanding 65 16 0 0 Store in C&hapter Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false mCbChapter Material Qt::Horizontal QSizePolicy::Expanding 50 16 Pac&kaged: false mDiPerPack 99999.000000000000000 1.000000000000000 1.000000000000000 3 per P&ackage false mCbUnit Prices Qt::Horizontal QSizePolicy::Expanding 240 11 = Price of &sale: false mInSalePrice 999999.000000000000000 1.000000000000000 0 999999.000000000000000 1.000000000000000 0 pl&us false mInSaleAdd % 999.000000000000000 1 &Purchase price: false mInPurchasePrice mEditMaterial mDiPerPack mCbUnit mInPurchasePrice mInSaleAdd mInSalePrice mCbChapter kraft-1.2.2/src/materialkataloglistview.cpp000066400000000000000000000123211467704360200210560ustar00rootroot00000000000000/*************************************************************************** materialkataloglistview - template katalog listview. ------------------- begin : 2005-07-26 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include "matkatalog.h" #include "stockmaterial.h" #include "materialkataloglistview.h" #include "katalogman.h" #include "docposition.h" #include "kataloglistview.h" #include "kraftsettings.h" #include "format.h" MaterialKatalogListView::MaterialKatalogListView(QWidget *parent ) : KatalogListView( parent ) { setColumnCount( 6 ); QStringList headers; headers << i18n("Material"); headers << i18n("Pack"); headers << i18n("Unit"); headers << i18n("Purchase"); headers << i18n("Sale"); headers << i18n("Last Modified"); setHeaderLabels( headers ); QByteArray headerState = QByteArray::fromBase64( KraftSettings::self()->materialCatViewHeader().toLatin1() ); header()->restoreState(headerState); contextMenu()->setTitle(i18n("Material Catalog")); } MaterialKatalogListView::~MaterialKatalogListView() { } void MaterialKatalogListView::addCatalogDisplay( const QString& katName ) { KatalogListView::addCatalogDisplay(katName); Katalog *k = KatalogMan::self()->getKatalog( katName ); MatKatalog *catalog = static_cast( k ); if( ! catalog ) { // qDebug () << "No catalog in listview available!"; return; } // qDebug () << "setting up meterial chapters --------*********************************+++!"; setupChapters(); // lambda expression to be DRY auto insertRecords = [&]( int chapterId) { StockMaterialList records = catalog->getRecordList(chapterId); QTreeWidgetItem *chapterItem = m_root; if (mChapterDict.contains(chapterId)) chapterItem = mChapterDict[chapterId]; for( StockMaterial *mat: records) { addMaterialToView( chapterItem, mat ); } }; for( int chapterId : mChapterDict.keys()) { insertRecords(chapterId); } // append the stray cats insertRecords(0); } QTreeWidgetItem* MaterialKatalogListView::addMaterialToView( QTreeWidgetItem *parent, StockMaterial *mat ) { if ( !mat ) return 0; if ( !parent ) parent = m_root; QTreeWidgetItem *recItem = new QTreeWidgetItem( parent ); if ( mCheckboxes ) { recItem->setCheckState(0, Qt::Unchecked); } //recItem->setFlags( flags ); recItem->setText( 0, mat->getText() ); // recItem->setMultiLinesEnabled( true ); FIXME slFreshupItem( recItem, mat, catalog()->locale() ); m_dataDict.insert( recItem, mat ); return recItem; } void MaterialKatalogListView::slFreshupItem(QTreeWidgetItem *item, void* templ, QLocale *loc) { Q_UNUSED(loc) StockMaterial *mat = static_cast( templ ); if ( item && mat ) { Einheit e = mat->unit(); // qDebug () << "Setting material name " << e.einheitSingular(); item->setText( 0, mat->getText() ); item->setText( 1, QString::number( mat->getAmountPerPack() ) ); item->setText( 2, e.einheit( mat->getAmountPerPack() ) ); item->setText( 3, mat->purchPrice().toLocaleString() ); item->setText( 4, mat->salesPrice().toLocaleString() ); item->setText( 5, Format::toDateTimeString( mat->modifyDate(), KraftSettings::self()->dateFormat())); } else { // qDebug () << "Unable to freshup item - data invalid"; } } DocPosition MaterialKatalogListView::itemToDocPosition( QTreeWidgetItem *item ) { DocPosition pos; if ( ! item ) { item = currentItem(); } if ( ! item ) return pos; // FIXME StockMaterial *mat = static_cast( m_dataDict[item] ); if ( mat ) { pos.setText( mat->getText() ); pos.setUnit( mat->unit() ); pos.setUnitPrice( mat->salesPrice() ); } return pos; } void MaterialKatalogListView::saveState() { QByteArray state = this->header()->saveState(); KraftSettings::self()->setMaterialCatViewHeader(state.toBase64()); } void MaterialKatalogListView::startUpdateItemSequence() { _query = new QSqlQuery; _query->prepare("UPDATE stockMaterial SET sortKey = :sk WHERE matID=:id"); } void MaterialKatalogListView::updateItemSequence(QTreeWidgetItem *item, int seqNo) { StockMaterial *mat = static_cast( m_dataDict[item] ); if ( mat ) { int id = mat->getID(); _query->bindValue(":id", id); _query->bindValue(":sk", seqNo); _query->exec(); } } kraft-1.2.2/src/materialkataloglistview.h000066400000000000000000000034601467704360200205270ustar00rootroot00000000000000/*************************************************************************** materialkataloglistview - material katalog listview. ------------------- begin : 2006-11-30 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef MATERIALKATALOGLISTVIEW_H #define MATERIALKATALOGLISTVIEW_H #include #include class QTreeWidgetItem; class StockMaterial; class QLocale; /** A listview that presents the contents of the Bruns Catalog @author Klaas Freitag */ class MaterialKatalogListView : public KatalogListView { public: MaterialKatalogListView(QWidget *parent=0 ); ~MaterialKatalogListView(); void addCatalogDisplay( const QString& katName ); DocPosition itemToDocPosition( QTreeWidgetItem *it = 0 ); QTreeWidgetItem* addMaterialToView( QTreeWidgetItem*, StockMaterial* ); void saveState(); public slots: void slFreshupItem( QTreeWidgetItem *, void*, QLocale* = 0 ); protected: void startUpdateItemSequence(); void updateItemSequence(QTreeWidgetItem *item, int seqNo); }; #endif kraft-1.2.2/src/materialkatalogview.cpp000066400000000000000000000167631467704360200202000ustar00rootroot00000000000000/*************************************************************************** materialkatalogview.cpp ------------------- begin : 2005-07-26 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include "katalogman.h" #include "materialkatalogview.h" #include "materialkataloglistview.h" #include "stockmaterial.h" #include "matkatalog.h" #include "materialtempldialog.h" #include "kraftsettings.h" const QString MaterialKatalogView::MaterialCatalogName( "Material" ); MaterialKatalogView::MaterialKatalogView() : KatalogView(), m_materialListView(nullptr), m_details(nullptr) { } MaterialKatalogView::~MaterialKatalogView() { slotSaveState(); } void MaterialKatalogView::createCentralWidget( QBoxLayout *box, QWidget *w ) { m_materialListView = new MaterialKatalogListView( w ); box->addWidget( m_materialListView ); KatalogView::createCentralWidget( box, w ); } Katalog* MaterialKatalogView::getKatalog( const QString& name ) { // qDebug () << "GetKatalog of material!"; Katalog *k = KatalogMan::self()->getKatalog( name ); if( ! k ) { k = new MatKatalog( name ); KatalogMan::self()->registerKatalog( k ); } return k; } void MaterialKatalogView::slEditTemplate() { MaterialKatalogListView *listview = static_cast(getListView()); if( listview ) { QTreeWidgetItem *item = listview->currentItem(); if( listview->isChapter(item) ) { // check if the chapter is empty. If so, switch to slNewTempalte() // if there others, open the chapter. if( !listview->isRoot( item ) && item->childCount() == 0 ) { slNewTemplate(); } else { // do nothing. } } else { // qDebug () << "Editing the material"; if( listview ) { StockMaterial *currTempl = static_cast ( listview->currentItemData() ); if( currTempl ) { QTreeWidgetItem *item = static_cast(listview->currentItem()); openDialog( item, currTempl, false ); } } } } } void MaterialKatalogView::slNewTemplate() { KatalogListView *listview = getListView(); if( !listview ) return; MaterialKatalogListView *matListView = static_cast(listview); StockMaterial *newMat = new StockMaterial(); newMat->setText( i18n( "" ) ); QTreeWidgetItem *parentItem = static_cast( listview->currentItem() ); if ( parentItem ) { if ( ! ( matListView->isRoot( parentItem ) || matListView->isChapter( parentItem ) ) ) { parentItem = static_cast(parentItem->parent()); } } if( parentItem && listview->isChapter( parentItem )) { // try to find out which catalog is open/current CatalogChapter *chap = static_cast(listview->itemData( parentItem )); newMat->setChapter( chap->id().toInt() ); } mNewItem = matListView->addMaterialToView( parentItem, newMat ); openDialog( mNewItem, newMat, true ); } void MaterialKatalogView::slDeleteTemplate() { // qDebug () << "delete template hit"; MaterialKatalogListView* listview = static_cast(getListView()); if( listview ) { StockMaterial *currTempl = static_cast (listview->currentItemData()); if( currTempl ) { int id = currTempl->getID(); QMessageBox msgBox; msgBox.setText(i18n( "Do you really want to delete the template from the catalog?")); msgBox.setStandardButtons(QMessageBox::Yes| QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if ( ret == QMessageBox::Yes) { // qDebug () << "Delete item with id " << id; MatKatalog *k = static_cast( getKatalog( m_katalogName ) ); if( k ) { k->deleteMaterial( id ); listview->removeTemplateItem( listview->currentItem()); } } } } } void MaterialKatalogView::openDialog( QTreeWidgetItem *listitem, StockMaterial *tmpl, bool isNew ) { mDialog = new MaterialTemplDialog( this ); mNewItem = listitem; KatalogListView *listview = getListView(); if( !listview ) return; if (listview->currentItem()) listview->currentItem()->setSelected(false); listitem->setSelected( true ); // listitem->ensureItemVisible( true ); connect( mDialog, SIGNAL( editAccepted( StockMaterial* ) ), this, SLOT( slotEditOk( StockMaterial* ) ) ); connect( mDialog, SIGNAL( editRejected( ) ), this, SLOT( slotEditRejected() ) ); mDialog->setMaterial( tmpl, MaterialCatalogName, isNew ); mDialog->show(); } void MaterialKatalogView::slotEditRejected() { if ( mNewItem ) { delete mNewItem; mNewItem = nullptr; } } void MaterialKatalogView::slotEditOk( StockMaterial *mat ) { KatalogListView *listview = getListView(); if( !listview ) return; MaterialKatalogListView *templListView = static_cast(listview); // qDebug () << "****** slotEditOk for Material"; if( mDialog ) { MatKatalog *k = static_cast( getKatalog( MaterialCatalogName ) ); if ( mDialog->templateIsNew() ) { QLocale *locale = nullptr; if ( k ) { k->addNewMaterial( mat ); locale = k->locale(); } if( mNewItem ) { mNewItem->setSelected( true ); templListView->slFreshupItem( mNewItem, mat, locale ); // templListView->ensureItemVisible( mNewItem ); } listview->updateChapterSort(mat->chapter()); } } mNewItem = nullptr; } void MaterialKatalogView::saveWindowState( const QByteArray& arr ) { KraftSettings::self()->setMaterialCatViewState(arr); KraftSettings::self()->save(); } QByteArray MaterialKatalogView::windowState() { const QByteArray re = QByteArray::fromBase64( KraftSettings::self()->materialCatViewState().toLatin1() ); return re; } void MaterialKatalogView::saveWindowGeo( const QByteArray& arr ) { KraftSettings::self()->setMaterialCatViewGeo(arr); KraftSettings::self()->save(); } QByteArray MaterialKatalogView::windowGeo() { const QByteArray re = QByteArray::fromBase64( KraftSettings::self()->materialCatViewGeo().toLatin1() ); return re; } kraft-1.2.2/src/materialkatalogview.h000066400000000000000000000041771467704360200176410ustar00rootroot00000000000000/*************************************************************************** materialkatalogview.h ------------------- begin : 2006-11-30 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef MATERIALKATALOGVIEW_H #define MATERIALKATALOGVIEW_H #include #include "materialkataloglistview.h" class QBoxLayout; class QTreeWidgetItem; class BrunsKatalogListView; class QLabel; class MaterialTemplDialog; /** @author Klaas Freitag */ class MaterialKatalogView : public KatalogView { Q_OBJECT public: MaterialKatalogView(); ~MaterialKatalogView(); void createCentralWidget(QBoxLayout*, QWidget *w); KatalogListView* getListView() { return m_materialListView; } static const QString MaterialCatalogName; protected slots: void slNewTemplate(); void slEditTemplate(); void slDeleteTemplate(); void openDialog( QTreeWidgetItem *, StockMaterial *, bool ); void slotEditRejected(); void slotEditOk( StockMaterial * ); protected: Katalog* getKatalog( const QString& ); void saveWindowState( const QByteArray& arr ); QByteArray windowState(); void saveWindowGeo( const QByteArray& arr ); QByteArray windowGeo(); MaterialKatalogListView *m_materialListView; QLabel *m_detailLabel; QTreeWidget *m_details; MaterialTemplDialog *mDialog; QTreeWidgetItem *mNewItem; }; #endif kraft-1.2.2/src/materialsaverbase.cpp000066400000000000000000000022471467704360200176260ustar00rootroot00000000000000/*************************************************************************** templatesaverbase - ------------------- begin : 2005-20-01 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt // include files for KDE #include "materialsaverbase.h" MaterialSaverBase::MaterialSaverBase( ) :QObject() { } MaterialSaverBase::~MaterialSaverBase( ) { } /* END */ kraft-1.2.2/src/materialsaverbase.h000066400000000000000000000025761467704360200173000ustar00rootroot00000000000000/*************************************************************************** materialsaverbase - Base class of a material saver ------------------- begin : 2006-12-07 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _MATERIALSAVERBASE_H #define _MATERIALSAVERBASE_H // include files #include /** * */ class StockMaterial; class MaterialSaverBase : public QObject { Q_OBJECT public: MaterialSaverBase(); ~MaterialSaverBase(); virtual bool saveTemplate( StockMaterial* ) = 0; virtual void saveTemplateChapter( StockMaterial* ) = 0; }; #endif /* END */ kraft-1.2.2/src/materialsaverdb.cpp000066400000000000000000000077711467704360200173100ustar00rootroot00000000000000/*************************************************************************** materialsaverdb - ------------------- begin : 2006-12-07 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include #include #include "kraftdb.h" #include "kraftglobals.h" #include "dbids.h" #include "materialsaverdb.h" #include "stockmaterial.h" MaterialSaverDB::MaterialSaverDB( ) : MaterialSaverBase() { } Q_GLOBAL_STATIC(MaterialSaverDB, mSelf) MaterialSaverBase *MaterialSaverDB::self() { return mSelf; } bool MaterialSaverDB::saveTemplate( StockMaterial *mat ) { bool res = true; // Transaktion ? QSqlTableModel model; model.setTable("stockMaterial"); QString templID = QString::number( mat->getID() ); model.setFilter( "matID=" + templID ); model.select(); QSqlRecord buffer = model.record(); if( model.rowCount() > 0) { // qDebug () << "Updating material " << mat->getID(); // mach update buffer = model.record(0); fillMaterialBuffer( buffer, mat, false ); model.setRecord(0, buffer); model.submitAll(); } else { // insert // qDebug () << "Creating new material database entry"; fillMaterialBuffer( buffer, mat, true ); model.insertRecord(-1, buffer); model.submitAll(); /* Jetzt die neue Template-ID selecten */ dbID id = KraftDB::self()->getLastInsertID(); // qDebug () << "New Database ID=" << id.toInt(); if( id.isOk() ) { mat->setID( id.toInt() ); templID = id.toString(); } else { // qDebug () << "ERROR: Kann AUTOINC nicht ermitteln"; res = false; } } return res; } void MaterialSaverDB::fillMaterialBuffer( QSqlRecord &rec, StockMaterial *mat, bool isNew ) { Q_ASSERT(mat->chapter() != 0); if( ! ( mat ) ) return; rec.setValue( "chapterID", mat->chapter() ); rec.setValue( "material", mat->getText() ); rec.setValue( "unitID", mat->unit().id() ); rec.setValue( "perPack", mat->getAmountPerPack() ); rec.setValue( "priceIn", mat->purchPrice().toDouble() ); rec.setValue( "priceOut", mat->salesPrice().toDouble() ); QString dtString = KraftDB::self()->currentTimeStamp(); if( isNew ) { rec.setValue( "enterDate", dtString); } rec.setValue("modifyDate", dtString ); } void MaterialSaverDB::saveTemplateChapter( StockMaterial* tmpl ) { if( ! tmpl ) { // qDebug () << "Parameter error, zero material!"; return; } dbID id = tmpl->getID(); dbID chapId = tmpl->chapterId(); QSqlTableModel model; model.setTable("stockMaterial"); QString templID = id.toString(); model.setFilter( "matID=" + templID ); model.select(); QSqlRecord buffer = model.record(); if( model.rowCount() > 0) { // qDebug () << "Updating material chapter " << templID; buffer = model.record(0); buffer.setValue( "chapterID", chapId.toString() ); model.setRecord(0, buffer); model.submitAll(); } else { // qDebug () << "Could not update material chapter, not found with id " << templID; } } kraft-1.2.2/src/materialsaverdb.h000066400000000000000000000027071467704360200167470ustar00rootroot00000000000000/*************************************************************************** materialsaverdb - ------------------- begin : 2006-12-07 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _MATERIALSAVERDB_H #define _MATERIALSAVERDB_H // include files #include "materialsaverbase.h" /** * */ class QSqlRecord; class StockMaterial; class MaterialSaverDB : public MaterialSaverBase { public: static MaterialSaverBase* self(); MaterialSaverDB(); private: virtual bool saveTemplate( StockMaterial* ); virtual void fillMaterialBuffer( QSqlRecord &, StockMaterial* , bool ); virtual void saveTemplateChapter( StockMaterial* ); }; #endif /* END */ kraft-1.2.2/src/materialselectdialog.cpp000066400000000000000000000055461467704360200203170ustar00rootroot00000000000000/*************************************************************************** materialselectdialog - select material for inserting into template ------------------- begin : 2006-12-17 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include "materialkatalogview.h" #include "materialselectdialog.h" #include "materialkataloglistview.h" #include "katalogman.h" #include "matkatalog.h" #include "katalog.h" #include "filterheader.h" MaterialSelectDialog::MaterialSelectDialog( QWidget *parent) : CalcDialogBase( parent ) { setWindowTitle( i18n("Add Material to Calculation" ) ); QVBoxLayout *mainLayout = new QVBoxLayout; _centralWidget->setLayout(mainLayout); QLabel *label = new QLabel( i18n( "

              Add Material to Calculation

              " )); mainLayout->addWidget(label); mKatalogListView = new MaterialKatalogListView; FilterHeader *filter = new FilterHeader(this, mKatalogListView); mainLayout->addWidget(filter); mainLayout->addWidget(mKatalogListView); mKatalogListView->setCheckboxes( true ); Katalog *kat = KatalogMan::self()->getKatalog( MaterialKatalogView::MaterialCatalogName ); if ( ! kat ) { kat = new MatKatalog( MaterialKatalogView::MaterialCatalogName ); KatalogMan::self()->registerKatalog( kat ); } mKatalogListView->addCatalogDisplay( MaterialKatalogView::MaterialCatalogName ); } MaterialSelectDialog::~MaterialSelectDialog() { } void MaterialSelectDialog::accept() { // qDebug () << "++ Material selected!"; QTreeWidgetItemIterator it( mKatalogListView, QTreeWidgetItemIterator::Checked ); while (*it) { // qDebug () << "T: " << (*it)->text( 0 ); QTreeWidgetItem *item = *it; if( !( mKatalogListView->isChapter( item ) || mKatalogListView->isRoot( item ))) { StockMaterial *mat = static_cast( mKatalogListView->itemData( item ) ); if ( mat ) { emit materialSelected( mat->getID(), 1 ); } } ++it; } QDialog::accept(); } kraft-1.2.2/src/materialselectdialog.h000066400000000000000000000032421467704360200177530ustar00rootroot00000000000000/*************************************************************************** materialselectdialog - select material for inserting into template ------------------- begin : 2006-12-17 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _MATERIALSELECTDIALOG_H #define _MATERIALSELECTDIALOG_H #include "calcdialogbase.h" class MaterialKatalogListView; /* ******************************************************************************** * Editor that shows the MaterialKatalogListView * ********************************************************************************/ class MaterialSelectDialog : public CalcDialogBase { Q_OBJECT public: MaterialSelectDialog(QWidget * parent = 0); ~MaterialSelectDialog(); public slots: protected slots: void accept(); signals: void materialSelected( int, double ); private: MaterialKatalogListView *mKatalogListView; }; #endif /* END */ kraft-1.2.2/src/materialtempldialog.cpp000066400000000000000000000162521467704360200201550ustar00rootroot00000000000000/*************************************************************************** materialtempldialog - dialog to edit material templates ------------------- begin : 2006-12-03 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include // include files for KDE #include #include #include #include #include #include "materialtempldialog.h" #include "katalogman.h" #include "unitmanager.h" #include "geld.h" #include "kraftsettings.h" #include "defaultprovider.h" MaterialTemplDialog::MaterialTemplDialog( QWidget *parent, bool modal ) : QDialog( parent ), Ui::MaterialDialogBase(), Eta( 0.00000000001 ) { /* connect a value Changed signal of the manual price field */ QWidget *w = new QWidget(this); QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); mainLayout->addWidget(w); setupUi( w ); setModal( modal ); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); const QString currSymbol = DefaultProvider::self()->locale()->currencySymbol(); mInPurchasePrice->setPrefix( currSymbol + " " ); mInPurchasePrice->setMinimum( -999999.99 ); mInPurchasePrice->setMaximum( 999999.99 ); mInPurchasePrice->setDecimals( 2 ); mInSalePrice->setPrefix( currSymbol + " " ); mInSalePrice->setMinimum( -999999.99 ); mInSalePrice->setMaximum( 999999.99 ); mInSalePrice->setDecimals( 2 ); double m = KraftSettings::self()->materialAddOnPercent(); mInSaleAdd->setValue(m); mInSaleAdd->setMinimum(-99.0); mInSaleAdd->setMaximum(999.0); connect( mInSalePrice, SIGNAL( valueChanged( double ) ), SLOT( slSalePriceChanged( double ) ) ); connect( mInPurchasePrice, SIGNAL( valueChanged( double ) ), SLOT( slPurchPriceChanged( double ) ) ); connect( mInSaleAdd, SIGNAL( valueChanged( double ) ), SLOT( slSaleAddChanged( double ) ) ); } void MaterialTemplDialog::slSalePriceChanged( double sale ) { // change the percent val double purch = mInPurchasePrice->value(); double m = mInSaleAdd->value(); if ( m > Eta && purch < Eta ) { // recalc the purchase price purch = sale/( 1+ m / 100.0 ); } else if ( purch > Eta ) { // recalc the add-percentage m = 100 * ( ( sale-purch ) / purch ); } setPriceCalc( purch, m, sale ); } void MaterialTemplDialog::slPurchPriceChanged( double purch ) { // change the percent val double sale = mInSalePrice->value(); double m = mInSaleAdd->value(); if ( m > Eta ) { sale = ( 1+m/100 )*purch; } setPriceCalc( purch, m, sale ); } void MaterialTemplDialog::slSaleAddChanged( double m ) { // change the Sales Price double sale = mInSalePrice->value(); double purch = mInPurchasePrice->value(); if (purch < Eta && sale > Eta ) { // calc the purchase price purch = sale/( 1+ m/100 ); } else { sale = ( 1+ m/100.0 ) * purch; } setPriceCalc( purch, m, sale ); } void MaterialTemplDialog::setPriceCalc( double purch, double addPercent, double sale ) { mInPurchasePrice->blockSignals(true); mInSalePrice->blockSignals(true); mInSaleAdd->blockSignals(true); mInPurchasePrice->setValue( purch ); mInSalePrice->setValue( sale ); mInSaleAdd->setValue( addPercent ); mInPurchasePrice->blockSignals(false); mInSalePrice->blockSignals(false); mInSaleAdd->blockSignals(false); } void MaterialTemplDialog::setMaterial( StockMaterial *t, const QString& katalogname, bool newTempl ) { if( ! t ) return; mSaveMaterial = t; m_templateIsNew = newTempl; m_katalog = KatalogMan::self()->getKatalog(katalogname); if( m_katalog == 0 ) { // qDebug () << "ERR: Floskel Dialog called without valid Katalog!"; return; } // chapter settings QStringList chapterNames; foreach( CatalogChapter chap, m_katalog->getKatalogChapters() ) { chapterNames.append( chap.name() ); } mCbChapter->insertItems(-1, chapterNames ); mChapId = t->chapter(); QString chap = m_katalog->chapterName(dbID( mChapId )); mCbChapter->setCurrentIndex(mCbChapter->findText( chap )); mCbChapter->setEnabled( false ); // unit settings mCbUnit->insertItems(-1, UnitManager::self()->allUnits() ); Einheit e = t->unit(); mCbUnit->setCurrentIndex(mCbUnit->findText( e.einheitSingular() )); // text mEditMaterial->setPlainText( t->getText() ); double priceIn = t->purchPrice().toDouble(); double priceOut = t->salesPrice().toDouble(); mInPurchasePrice->setValue( priceIn ); mInSalePrice->setValue( priceOut ); mDiPerPack->setValue( t->getAmountPerPack() ); // user experience mEditMaterial->setFocus(); mEditMaterial->selectAll(); // percent add on sale price double percent = 10.0; if( priceIn > Eta ) { double diff = priceOut - priceIn; percent = diff / priceIn * 100.0; } mInSaleAdd->setValue( percent ); } MaterialTemplDialog::~MaterialTemplDialog( ) { } void MaterialTemplDialog::accept() { // qDebug () << "*** Saving finished "; const QString newMat = mEditMaterial->toPlainText(); if ( newMat.isEmpty() ) { // qDebug () << "We do not want to store empty materials"; } else { mSaveMaterial->setText( mEditMaterial->toPlainText() ); mSaveMaterial->setAmountPerPack( mDiPerPack->value() ); const QString str = mCbUnit->currentText(); int u = UnitManager::self()->getUnitIDSingular( str ); // qDebug () << "Setting unit id " << u; mSaveMaterial->setUnitId( u ); // chapId = 0; // FIXME: get a chapter catalog Id of hirarchical mSaveMaterial->setChapter( mChapId ); double db = mInPurchasePrice->value(); mSaveMaterial->setPurchPrice( Geld( db ) ); db = mInSalePrice->value(); mSaveMaterial->setSalesPrice( Geld( db ) ); mSaveMaterial->save(); emit editAccepted( mSaveMaterial ); KatalogMan::self()->notifyKatalogChange( m_katalog, mSaveMaterial->getID() ); } QDialog::accept(); } void MaterialTemplDialog::reject() { if ( m_templateIsNew ) { // remove the listview item if it was created newly emit editRejected(); } QDialog::reject(); } kraft-1.2.2/src/materialtempldialog.h000066400000000000000000000037201467704360200176160ustar00rootroot00000000000000/*************************************************************************** materialtempldialog - ------------------- begin : 2006-12-04 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _MATERIALTEMPLDIALOG_H #define _MATERIALTEMPLDIALOG_H // include files #include "kraftglobals.h" #include "ui_materialdialog.h" #include "stockmaterial.h" /** * */ class Katalog; class MaterialTemplDialog : public QDialog, protected Ui::MaterialDialogBase { Q_OBJECT public: MaterialTemplDialog( QWidget *parent=0, bool modal=false ); ~MaterialTemplDialog(); void setMaterial( StockMaterial* t, const QString&, bool ); bool templateIsNew() { return m_templateIsNew; }; signals: void editAccepted( StockMaterial* ); void editRejected(); void chapterChanged(int); public slots: protected slots: virtual void accept(); virtual void reject(); void slSalePriceChanged( double ); void slPurchPriceChanged( double ); void slSaleAddChanged( double ); private: void setPriceCalc( double, double, double ); StockMaterial *mSaveMaterial; bool m_templateIsNew; Katalog *m_katalog; const double Eta; int mChapId; }; #endif /* END */ kraft-1.2.2/src/matkatalog.cpp000066400000000000000000000072051467704360200162570ustar00rootroot00000000000000/*************************************************************************** matkatalog - the material catalog ------------------- begin : 2004-19-10 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include // include files for KDE #include #include "matkatalog.h" #include "kraftdb.h" MatKatalog::MatKatalog( const QString& name) : Katalog(name) { } MatKatalog::MatKatalog() : Katalog( QLatin1String( "Material" )) { } void MatKatalog::reload( dbID ) { mAllMaterial.clear(); load(); } int MatKatalog::load() { Katalog::load(); int cnt = 0; QSqlQuery q(QLatin1String("SELECT matID, chapterID, material, unitID, perPack, priceIn, " "priceOut, modifyDate, enterDate FROM stockMaterial ORDER BY chapterID, sortKey")); q.exec(); while ( q.next() ) { cnt++; int id = q.value( 0 ).toInt(); int chapterID = q.value( 1 ).toInt(); const QString material = q.value( 2 ).toString(); int unitID = q.value( 3 ).toInt(); double pPack = q.value( 4 ).toDouble(); double priceIn = q.value( 5 ).toDouble(); double priceOut = q.value(6 ).toDouble(); QDateTime lastMod = q.value( 7 ).toDateTime(); QDateTime entered = q.value( 8 ).toDateTime(); StockMaterial *mat = new StockMaterial( id, chapterID, material, unitID, pPack, Geld( priceIn ), Geld( priceOut ) ); mat->setEnterDate(entered); mat->setModifyDate(lastMod); auto usage = usageCount(id); mat->setLastUsedDate(usage.second); mat->setUseCounter(usage.first); mAllMaterial.append( mat ); } return cnt; } void MatKatalog::deleteMaterial( int id ) { StockMaterialListIterator it( mAllMaterial ); int cnt = 0; // qDebug () << "Deleting material id=" << id; while( it.hasNext() ) { StockMaterial *mat = it.next(); if( mat->getID() == id ) { break; } cnt++; } if( cnt < mAllMaterial.count() ) { mAllMaterial.removeAt( cnt ); } // remove from database. QSqlQuery q; q.prepare( QLatin1String("DELETE FROM stockMaterial WHERE matID=:Id")); q.bindValue( ":Id", id ); q.exec(); deleteUsageRecord(id); // qDebug () << "SQL Delete Success: " << q.lastError().text(); } StockMaterialList MatKatalog::getRecordList( int chapterId ) { StockMaterialList list; for (StockMaterial *mat: mAllMaterial) { if ( mat->chapter() == chapterId ) { list.append( mat ); } } return list; } StockMaterial* MatKatalog::materialFromId( long id ) { StockMaterialListIterator it( mAllMaterial ); while( it.hasNext() ) { StockMaterial *mat = it.next(); if ( mat->getID() == id ) { return mat; } } return nullptr; } void MatKatalog::addNewMaterial( StockMaterial *mat ) { mAllMaterial.append( mat ); } MatKatalog::~MatKatalog( ) { } /* END */ kraft-1.2.2/src/matkatalog.h000066400000000000000000000032361467704360200157240ustar00rootroot00000000000000/*************************************************************************** matkatalog - Materialkatalogklasse ------------------- begin : 2004-19-10 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _MATKATALOG_H #define _MATKATALOG_H // include files #include #include "stockmaterial.h" #include "katalog.h" /** * */ class MatKatalog : public Katalog { public: MatKatalog( const QString& name ); MatKatalog(); ~MatKatalog(); int getEntriesPerChapter( const CatalogChapter& ) override { return 0; } // FIXME int load() override; void reload( dbID ) override; void deleteMaterial( int ); StockMaterial *materialFromId(long id); KatalogType type() override { return MaterialCatalog; } StockMaterialList getRecordList(int chapterId); void addNewMaterial( StockMaterial* ); private: StockMaterialList mAllMaterial; }; #endif /* END */ kraft-1.2.2/src/matpartui.ui000066400000000000000000000076571467704360200160070ustar00rootroot00000000000000 calcdetailMat 0 0 435 228 Calculation Item Material <h1>Calculation Part 'Material'</h1> false Add Material to the template calculation. Qt::AlignVCenter true QFrame::StyledPanel QFrame::Raised 0 0 material Qt::AlignVCenter true &Amount: false m_inpMenge Price for one piece 1.000000000000000 99999.000000000000000 unit false Qt::Horizontal QSizePolicy::Expanding 61 20 QDoubleSpinBox QWidget kraft-1.2.2/src/matpartui.ui.h000066400000000000000000000011161467704360200162150ustar00rootroot00000000000000/**************************************************************************** ** ui.h extension file, included from the uic-generated form implementation. ** ** If you want to add, delete, or rename functions or slots, use ** Qt Designer to update this file, preserving your code. ** ** You should not define a constructor or destructor in this file. ** Instead, write your code in functions called init() and destroy(). ** These will automatically be called by the form's constructor and ** destructor. *****************************************************************************/ kraft-1.2.2/src/metaxmlparser.cpp000066400000000000000000000064241467704360200170210ustar00rootroot00000000000000/*************************************************************************** metaxmlparser.cpp - Parser for Meta XML files ------------------- begin : Dec 29 2018 copyright : (C) 2018 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include "metaxmlparser.h" MetaXMLParser::MetaXMLParser() { } bool MetaXMLParser::parse( QIODevice *device ) { _docTypeAddList.clear(); if (!_domDocument.setContent(device, true, &_errorString, &_errorLine, &_errorColumn)) { qDebug() << "Not able to parse XML: " << _errorString << "Line"<< _errorLine << ", Colum" << _errorColumn; return false; } QDomElement root = _domDocument.documentElement(); if( root.tagName() != "kraftmeta" ) { qDebug() << "XML file parse error: Not a kraftmeta root"; } QDomElement migrateElem = root.firstChildElement("migrate"); QDomElement addDtXml = migrateElem.firstChildElement("doctype"); while( ! addDtXml.isNull() ) { MetaDocTypeAdd docTypeAdd; QDomElement elem = addDtXml.firstChildElement("name"); if( !elem.isNull() ) { docTypeAdd.setName(elem.text()); } elem = addDtXml.firstChildElement("numbercycle"); if( !elem.isNull() ) { docTypeAdd.setNumbercycle(elem.text()); } elem = addDtXml.firstChildElement("lang"); if( !elem.isNull() ) { docTypeAdd.setLang(elem.text()); } elem = addDtXml.firstChildElement("attrib"); while( !elem.isNull() ) { const QString key = elem.firstChildElement("key").text(); const QString val = elem.firstChildElement("value").text(); if( !key.isEmpty() ) docTypeAdd._attribs.insert(key, val); elem = elem.nextSiblingElement("attrib"); } elem = addDtXml.firstChildElement("follower"); while( !elem.isNull() ) { const QString fo = elem.text(); if( !fo.isEmpty() ) docTypeAdd._follower.append(fo); elem = elem.nextSiblingElement("follower"); } // save and move on to next element. if( !docTypeAdd.name().isNull() ) { _docTypeAddList.append(docTypeAdd); } addDtXml = addDtXml.nextSiblingElement("doctype"); } return true; } QList MetaXMLParser::metaDocTypeAddList() { return _docTypeAddList; } kraft-1.2.2/src/metaxmlparser.h000066400000000000000000000036271467704360200164700ustar00rootroot00000000000000/*************************************************************************** metaxmlparser.cpp - Parser for Meta XML files ------------------- begin : Dec 29 2018 copyright : (C) 2018 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef METAXMLPARSER_H #define METAXMLPARSER_H #include #include #include class MetaDocTypeAdd { public: void setName( const QString& name ) { _name = name; } QString name() const { return _name; } void setNumbercycle( const QString& name ) { _numbercycle = name; } QString numbercycle() const { return _numbercycle; } void setLang( const QString& name ) { _lang = name; } QString lang() const { return _lang; } QMap _attribs; QStringList _follower; private: QString _name; QString _lang; QString _numbercycle; }; class MetaXMLParser { public: MetaXMLParser(); bool parse( QIODevice *device ); QList metaDocTypeAddList(); private: QDomDocument _domDocument; QString _errorString; int _errorLine, _errorColumn; QList _docTypeAddList; }; #endif // METAXMLPARSER_H kraft-1.2.2/src/models/000077500000000000000000000000001467704360200147065ustar00rootroot00000000000000kraft-1.2.2/src/models/datemodel.cpp000066400000000000000000000261341467704360200173560ustar00rootroot00000000000000/*************************************************************************** datemodel.cpp ------------------- copyright : (C) 2017 by Klaas Freitag email : klaas@volle-kraft-voraus.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "datemodel.h" #include "docdigest.h" #include #include #include #include class TreeItem { public: TreeItem(AbstractIndx *indx, TreeItem *parent = 0); ~TreeItem(); void appendChild(TreeItem *child); TreeItem *child(int row); int childCount() const; QVariant data(int column) const; int row() const; TreeItem *parent(); QList children() { return childItems; } AbstractIndx *payload() { return dataPtr; } private: QList childItems; AbstractIndx *dataPtr; TreeItem *parentItem; }; TreeItem::TreeItem(AbstractIndx *indx, TreeItem *parent) :dataPtr(indx), parentItem(parent) { // make sure the parents have the children registered if( parent ) { parent->appendChild(this); } } TreeItem::~TreeItem() { foreach( TreeItem *i, childItems ) { delete i; } } TreeItem* TreeItem::child(int row) { return childItems.value(row); } TreeItem* TreeItem::parent() { return parentItem; } int TreeItem::row() const { if (parentItem) return parentItem->childItems.indexOf(const_cast(this)); return 0; } int TreeItem::childCount() const { return childItems.count(); } void TreeItem::appendChild(TreeItem *child) { childItems.append(child); } /* ================================================================== */ AbstractIndx::AbstractIndx() :_type(Invalid) { } AbstractIndx::AbstractIndx(IndxType t) :_type(t) { } AbstractIndx::AbstractIndx(IndxType t, DocDigest(digest)) :_docDigest(digest), _type(t) { } AbstractIndx::IndxType AbstractIndx::type() { return _type; } DocDigest AbstractIndx::digest() const { return _docDigest; } int AbstractIndx::year() { return _docDigest.rawDate().year(); } int AbstractIndx::month() { return _docDigest.rawDate().month(); } /* ================================================================== */ class YearIndx : public AbstractIndx { public: explicit YearIndx(int year) :AbstractIndx(IndxType::YearType) { QDate d (year, 1, 1); _docDigest.setDate(d); } }; /* ================================================================== */ class MonthIndx : public AbstractIndx { public: explicit MonthIndx(int year, int month) :AbstractIndx(IndxType::MonthType) { QDate d(year, month, 1); _docDigest.setDate(d); } }; /* ================================================================== */ DateModel::DateModel(QObject *parent) :DocBaseModel(parent) { rootItem = new TreeItem(0); } QVariant DateModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); TreeItem *item = static_cast(index.internalPointer()); AbstractIndx *indx = item->payload(); #if 0 if( role == Qt::BackgroundColorRole ) { if( indx->type() == AbstractIndx::YearType ) { return QColor(0x80, 0xC8, 0xFE); } else if( indx->type() == AbstractIndx::MonthType ) { return QColor(0xBF, 0xE3, 0xFE); } return QVariant(); } #endif if( role == Qt::FontRole ) { QFont f; if( indx->type() == AbstractIndx::YearType ) { f.setPointSize(22); return f; } else if( indx->type() == AbstractIndx::MonthType ) { f.setPointSize(16); return f; } } if (role != Qt::DisplayRole) return QVariant(); int col = index.column(); if( indx->type() == AbstractIndx::YearType ) { if( col == 0 ) { return item->payload()->year(); } else if(col == Treestruct_Year) { return item->payload()->year(); } else if(col == Treestruct_Type) { return AbstractIndx::YearType; } #if 0 QList monthItems = item->children(); if( _yearExtra[col] == Sum ) { float sum = 0.0; foreach( TreeItem *month, monthItems) { foreach( TreeItem *docItem, month->children()) { sum += docItem->payload()->data(col).toFloat(); } } return sum; } else if( _monthExtra[col] == Count ) { int cnt = 0; foreach( TreeItem *month, monthItems) { cnt += month->children().count(); } return cnt; } else { return item->payload()->data(col); } #endif } if( indx->type() == AbstractIndx::MonthType ) { // there might be a special column type if( col == 0 ) { return QDate::shortMonthName(item->payload()->month()); } else if(col == Treestruct_Month) { return item->payload()->month(); } else if(col == Treestruct_Year) { return item->payload()->year(); } else if(col == Treestruct_Type) { return AbstractIndx::MonthType; } #if 0 QList childitems = item->children(); if( _monthExtra[col] == Sum ) { float sum = 0.0; foreach( TreeItem *child, childitems) { sum += child->payload()->data(col).toFloat(); } return sum; } else if( _monthExtra[col] == Count ) { return childitems.count(); } else { } #endif } if( indx->type() == AbstractIndx::DocumentType ) { DocDigest digest = item->payload()->digest(); if( index.column() == Document_Id ) { // In column zero the day has to be displayed here const QDate date = digest.rawDate(); return date.day(); } else { return columnValueFromDigest( digest, index.column() ); } } return QVariant(); } Qt::ItemFlags DateModel::flags(const QModelIndex &index) const { if (!index.isValid()) return {}; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } QModelIndex DateModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); TreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); TreeItem *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); else return QModelIndex(); } QModelIndex DateModel::parent(const QModelIndex &index) const { if (!index.isValid()) return QModelIndex(); TreeItem *childItem = static_cast(index.internalPointer()); TreeItem *parentItem = childItem->parent(); if (parentItem == rootItem) return QModelIndex(); return createIndex(parentItem->row(), 0, parentItem); } int DateModel::rowCount(const QModelIndex &parent) const { TreeItem *parentItem; if (parent.column() > 0) return 0; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); return parentItem->childCount(); } void DateModel::setMonthSumColumn( int column ) { if(column < columnCount( QModelIndex() )) { _monthExtra[column] = Sum; } } void DateModel::setMonthCountColumn( int column ) { if( column < columnCount(QModelIndex()) ) { _monthExtra[column] = Count; } } void DateModel::setYearSumColumn( int column ) { if(column < columnCount(QModelIndex())) { _yearExtra[column] = Sum; } } void DateModel::setYearCountColumn( int column ) { if( column < columnCount(QModelIndex()) ) { _yearExtra[column] = Count; } } TreeItem *DateModel::findYearItem(int year) { TreeItem *yearItem = NULL; QList yearitems = rootItem->children(); foreach( TreeItem *item, yearitems ) { AbstractIndx *indx = item->payload(); if( indx->year() == year ) { yearItem = item; break; } } return yearItem; } TreeItem *DateModel::findMonthItem(int year, int month) { TreeItem *monthItem = NULL; TreeItem *yearItem = findYearItem( year ); if( yearItem ) { QList monthItems = yearItem->children(); foreach( TreeItem *item, monthItems ) { AbstractIndx *indx = static_cast(item->payload()); if( indx->month() == month ) { monthItem = item; break; } } } return monthItem; } bool DateModel::isDocument(const QModelIndex& indx) const { bool re = false; if( indx.isValid() ) { TreeItem *item = static_cast(indx.internalPointer()); if( item ) { AbstractIndx *abstractindx = item->payload(); re = !(abstractindx->type() == AbstractIndx::YearType || abstractindx->type() == AbstractIndx::MonthType ); } } return re; } DocDigest DateModel::digest(const QModelIndex& indx) const { DocDigest dig; TreeItem *item = static_cast(indx.internalPointer()); AbstractIndx *abstractindx = item->payload(); if( abstractindx->type() == AbstractIndx::YearType || abstractindx->type() == AbstractIndx::MonthType ) { // there is no digest } else { dig = abstractindx->digest(); } return dig; } void DateModel::removeAllData() { // the destructor of the TreeItem removes the entire tree recursivly delete rootItem; rootItem = new TreeItem(0); } void DateModel::addData( const DocDigest& digest ) // DocumentIndx doc ) { int month = digest.rawDate().month(); int year = digest.rawDate().year(); TreeItem *yearItem = NULL; TreeItem *monthItem = NULL; yearItem = findYearItem( year ); if( !yearItem ) { AbstractIndx *newIndx = new YearIndx(year); yearItem = new TreeItem( newIndx, rootItem ); } // ==== monthItem = findMonthItem( year, month ); if( !monthItem ) { AbstractIndx *newIndx = new MonthIndx(year, month); monthItem = new TreeItem( newIndx, yearItem); } DocumentIndx *itemIndx = new DocumentIndx(digest); TreeItem *newItem = new TreeItem( itemIndx, monthItem ); Q_UNUSED(newItem); } kraft-1.2.2/src/models/datemodel.h000066400000000000000000000057061467704360200170250ustar00rootroot00000000000000/*************************************************************************** datemodel.h ------------------- copyright : (C) 2017 by Klaas Freitag email : klaas@volle-kraft-voraus.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef DATEMODEL_H #define DATEMODEL_H #include #include #include #include #include #include #include "docbasemodel.h" #include "docdigest.h" class TreeItem; class AbstractIndx { public: enum IndxType { Invalid = 0, DocumentType, YearType, MonthType }; explicit AbstractIndx(); virtual ~AbstractIndx() { } explicit AbstractIndx(IndxType t); explicit AbstractIndx(IndxType t, DocDigest(digest)); virtual IndxType type(); DocDigest digest() const; int year(); int month(); protected: DocDigest _docDigest; private: IndxType _type; }; /* ================================================================== */ class DocumentIndx : public AbstractIndx { public: DocumentIndx(const DocDigest& digest) :AbstractIndx(IndxType::DocumentType, digest) { } }; /* ================================================================== */ class DateModel : public DocBaseModel { public: DateModel(QObject *parent = 0); enum CalcType { Zero = 0, Sum, Count }; TreeItem* findYearItem(int year); TreeItem* findMonthItem(int year, int month); void setMonthSumColumn( int column ); void setMonthCountColumn( int column ); void setYearSumColumn( int column ); void setYearCountColumn( int column ); QVariant data(const QModelIndex &index, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; QModelIndex index(int row, int column, const QModelIndex &parent) const; QModelIndex parent(const QModelIndex &index) const; DocDigest digest(const QModelIndex& indx) const; int rowCount(const QModelIndex &parent) const; void removeAllData(); void addData(const DocDigest& digest); bool isDocument(const QModelIndex& indx) const; private: TreeItem *rootItem; QVector _monthExtra; QVector _yearExtra; }; #endif // DATEMODEL_H kraft-1.2.2/src/models/docbasemodel.cpp000066400000000000000000000160531467704360200200400ustar00rootroot00000000000000/*************************************************************************** datemodel.cpp ------------------- copyright : (C) 2017 by Klaas Freitag email : klaas@volle-kraft-voraus.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "docbasemodel.h" #include "kraftdb.h" #include #include #include #include DocBaseModel::DocBaseModel(QObject *parent) :QAbstractItemModel(parent) { _headers.resize(12); _headers[ Document_Id ] = i18n("Date"); // this is only displayed by the date model _headers[ Document_Ident ] = i18n("Doc. Number"); _headers[ Document_Type ] = i18n( "Doc. Type"); _headers[ Document_Whiteboard ] = i18n( "Whiteboard" ); _headers[ Document_ClientId ] = i18n( "Client ID" ); _headers[ Document_LastModified] = i18n( "Last Modified" ); _headers[ Document_CreationDateRaw] = i18n( "Creation Date" ); _headers[ Document_ProjectLabel] = i18n( "Project" ); _headers[ Document_ClientAddress ] = i18n( "Client Address" ); _headers[ Document_ClientName ] = i18n( "Client" ); mAddressProvider = new AddressProvider( this ); connect( mAddressProvider, SIGNAL(lookupResult(QString,KContacts::Addressee)), this, SLOT(slotAddresseeFound(QString, KContacts::Addressee))); } QString DocBaseModel::firstLineOf( const QString& str) const { QString var; if( !str.isEmpty() ) { QStringList li = str.split(QChar('\n')); var = QString( "> %1").arg(li[0]); } return var; } QVariant DocBaseModel::columnValueFromDigest( const DocDigest& digest, int col ) const { if( col < 0 || col >= Max_Column_Marker ) return QVariant(); QVariant var; QStringList li; QString help; switch(col) { case Document_Id: case Document_Id_Raw: var = digest.id(); break; case Document_Ident: var = digest.ident(); break; case Document_Type: var = digest.type(); break; case Document_Whiteboard: help = digest.whiteboard(); li = help.split(QChar('\n')); var = li[0]; break; case Document_ClientId: var = digest.clientId(); break; case Document_LastModified: var = digest.lastModified(); break; case Document_CreationDate: var = digest.date(); break; case Document_CreationDateRaw: var = digest.rawDate(); break; case Document_ProjectLabel: var = digest.projectLabel(); break; case Document_ClientAddress: { help = firstLineOf( digest.clientAddress()); break; } case Document_ClientName: { help = digest.clientId(); AddressProvider::LookupState state = mAddressProvider->lookupAddressee(help); if( state == AddressProvider::LookupFromCache ) { KContacts::Addressee addressee = mAddressProvider->getAddresseeFromCache(help); var = addressee.assembledName(); // qDebug() << "Address from Cache: " << var.toString(); } else if( state == AddressProvider::LookupOngoing ) { var = i18n("Looking up address…"); } else if( state == AddressProvider::LookupStarted ) { var = i18n("Lookup started…"); } else if( state == AddressProvider::LookupNotFound || state == AddressProvider::BackendError || state == AddressProvider::ItemError ) { var = firstLineOf(digest.clientAddress()); } break; } default: break; } return var; } int DocBaseModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); return Max_Column_Marker; } QVariant DocBaseModel::headerData(int section, Qt::Orientation orientation, int role) const { if( role == Qt::DisplayRole && orientation == Qt::Horizontal && section < _headers.count() ) { return _headers.at(section); } return QVariant(); } Qt::ItemFlags DocBaseModel::flags(const QModelIndex &index) const { if (!index.isValid()) return {}; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } void DocBaseModel::resetData() { beginResetModel(); removeAllData(); loadFromTable(); endResetModel(); } void DocBaseModel::slotAddresseeFound( const QString& uid, const KContacts::Addressee& contact) { // FIXME: Update the data in the model and update the view accordingly. // Given that the view is updated so often, it does not seem to be neccessary // to do at all. Maybe later... Q_UNUSED(uid); Q_UNUSED(contact); } int DocBaseModel::loadFromTable() { int cnt = 0; QSqlQuery query; query.prepare("SELECT docID, ident, docType, docDescription, clientID, lastModified," "date, projectLabel, clientAddress " "FROM document ORDER BY date DESC"); query.exec(); /* enum Columns { Document_Id = 0, Document_Ident = 1, Document_Type = 2, Document_Whiteboard = 3, Document_ClientId = 4, Document_LastModified = 5, Document_CreationDate = 6, Document_ProjectLabel = 7, Document_ClientAddress = 8, Document_ClientName = 9, }; */ while (query.next()) { DocDigest digest(query.value(Document_Id).toInt(), query.value(Document_Type).toString(), query.value(Document_ClientId).toString()); digest.setDate( query.value( Document_CreationDate ).toDate() ); QDateTime dt = query.value(Document_LastModified).toDateTime(); if (KraftDB::self()->isSqlite()) { // The timestamps in Sqlite are in UTC dt.setTimeSpec(Qt::UTC); digest.setLastModified(dt.toLocalTime()); } else { digest.setLastModified(dt); } const QString clientAdr = query.value(Document_ClientAddress).toString(); digest.setClientAddress( clientAdr ); QString ident = query.value(Document_Ident).toString(); digest.setIdent( ident ); digest.setWhiteboard( query.value(Document_Whiteboard).toString() ); digest.setProjectLabel( query.value(Document_ProjectLabel).toString() ); const QString clientId = query.value(Document_ClientId).toString(); digest.setClientId( clientId ); this->addData( digest ); } return cnt; } kraft-1.2.2/src/models/docbasemodel.h000066400000000000000000000055171467704360200175100ustar00rootroot00000000000000/*************************************************************************** datemodel.h ------------------- copyright : (C) 2017 by Klaas Freitag email : klaas@volle-kraft-voraus.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef DOCBASEMODEL_H #define DOCBASEMODEL_H #include #include "addressprovider.h" #include "docdigest.h" #include #include #include #include #include #include class DocBaseModel : public QAbstractItemModel { Q_OBJECT public: DocBaseModel(QObject *parent = 0); virtual ~DocBaseModel() {} enum Columns { Document_Id = 0, Document_Ident = 1, Document_Type = 2, Document_Whiteboard = 3, Document_ClientId = 4, Document_LastModified = 5, Document_CreationDate = 6, Document_ProjectLabel = 7, Document_ClientAddress = 8, Document_ClientName = 9, Document_Id_Raw = 10, Document_CreationDateRaw = 11, Treestruct_Year = 12, Treestruct_Month = 13, Treestruct_Type = 14, Max_Column_Marker = 15 // leave this as last enum }; int columnCount(const QModelIndex &parent) const; virtual QVariant data(const QModelIndex &index, int role) const = 0; Qt::ItemFlags flags(const QModelIndex &index) const; virtual int rowCount(const QModelIndex &parent) const = 0; virtual void removeAllData() = 0; virtual void addData(const DocDigest& digest) = 0; virtual DocDigest digest(const QModelIndex& indx) const = 0; virtual bool isDocument(const QModelIndex& indx) const = 0; int loadFromTable(); void resetData(); protected: QVariant columnValueFromDigest( const DocDigest& digest, int col ) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; protected slots: void slotAddresseeFound(const QString &uid, const KContacts::Addressee &contact); private: QString firstLineOf( const QString& str) const; QVector _headers; AddressProvider *mAddressProvider; }; #endif // DATEMODEL_H kraft-1.2.2/src/models/documentmodel.cpp000066400000000000000000000056771467704360200202700ustar00rootroot00000000000000/*************************************************************************** documentmodel - the database model for documents ------------------- begin : 2010-01-11 copyright : (C) 2010 by Thomas Richard, 2011 by Klaas Freitag email : thomas.richard@proan.be ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ //QT includes #include #include #include #include #include #include //KDE includes #include //Kraft includes #include "documentmodel.h" #include "docdigest.h" #include "docbasemodel.h" #include "defaultprovider.h" DocumentModel::DocumentModel(QObject *parent) : DocBaseModel(parent) { } DocumentModel::~DocumentModel() { } int DocumentModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent); return _digests.count(); } void DocumentModel::removeAllData() { _digests.clear(); } void DocumentModel::addData( const DocDigest& digest ) { _digests.append(digest); } QModelIndex DocumentModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); return createIndex(row, column); } QModelIndex DocumentModel::parent(const QModelIndex &index) const { Q_UNUSED(index); return QModelIndex(); } bool DocumentModel::isDocument(const QModelIndex& indx) const { Q_UNUSED(indx); return indx.isValid(); } QVariant DocumentModel::data(const QModelIndex &idx, int role) const { if( !idx.isValid() ) return QVariant(); int row = idx.row(); if( row < 0 || row >= _digests.count() ) { return QVariant(); } const DocDigest digest = _digests.at(row); if(role == Qt::DisplayRole) { return columnValueFromDigest( digest, idx.column() ); } else if( role == Qt::SizeHintRole ) { QFont f = data(idx, Qt::FontRole).value(); QFontMetrics fm(f); int h = fm.height(); return QSize( 0, h + 4 ); } return QVariant(); } DocDigest DocumentModel::digest( const QModelIndex& index ) const { int row = index.row(); DocDigest digest; if( row > -1 && row < _digests.count() ) { digest = _digests.at(index.row()); } return digest; } kraft-1.2.2/src/models/documentmodel.h000066400000000000000000000040621467704360200177200ustar00rootroot00000000000000/*************************************************************************** documentmodel - the database model for documents ------------------- begin : 2010-01-11 copyright : Copyright 2010 by Thomas Richard, 2011 by Klaas Freitag email : thomas.richard@proan.be ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef DOCUMENTMODEL_H #define DOCUMENTMODEL_H #include "docbasemodel.h" #include class DocDigest; class AddressProvider; class DocumentModel : public DocBaseModel { Q_OBJECT public: DocumentModel(QObject *parent = 0); ~DocumentModel(); QVariant data(const QModelIndex &idx, int role) const; // QVariant headerData( int, Qt::Orientation, int role = Qt::DisplayRole ) const; QModelIndex index(int row, int column, const QModelIndex &parent) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent) const; // int columnCount(const QModelIndex &parent = QModelIndex()) const; DocDigest digest( const QModelIndex& ) const; void setQueryAgain(); void removeAllData(); void addData( const DocDigest& ); bool isDocument(const QModelIndex& indx) const; // protected slots: // void slotAddresseeFound( const QString&, const KContacts::Addressee& ); protected: private: DocDigestList _digests; }; #endif kraft-1.2.2/src/models/documentproxymodels.cpp000066400000000000000000000124301467704360200215360ustar00rootroot00000000000000/*************************************************************************** latestdocmodel - the latest documents model ------------------- begin : 2010-01-11 copyright : (C) 2010 by Thomas Richard email : thomas.richard@proan.be ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ //QT includes #include #include #include #include #include #include #include #include #include #include //Kraft includes #include "datemodel.h" #include "documentmodel.h" #include "defaultprovider.h" #include "docdigest.h" #include "documentproxymodels.h" DocumentFilterModel::DocumentFilterModel(int maxRows, QObject *parent) : QSortFilterProxyModel(parent), _enableTreeView(false), _treeModel(0), _tableModel(0) { m_MaxRows = maxRows; this->setFilterCaseSensitivity(Qt::CaseInsensitive); } void DocumentFilterModel::setMaxRows( int max ) { m_MaxRows = max; invalidateFilter(); // refreshes the model } void DocumentFilterModel::setEnableTreeview( bool treeview ) { _enableTreeView = treeview; DocBaseModel *model; if(_enableTreeView) { if( _treeModel.isNull() ) { _treeModel.reset(new DateModel); _treeModel->loadFromTable(); } model = _treeModel.data(); } else { if( _tableModel.isNull()) { _tableModel.reset(new DocumentModel); _tableModel->loadFromTable(); } model = _tableModel.data(); } setSourceModel(model); } bool DocumentFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); if( !index.isValid()) { return false; } bool accepted = false; // filter works on the document ID, the client name and the document type. const QRegExp filter = filterRegExp(); if( filter.pattern().isEmpty() ) { accepted = true; } else { const QModelIndex index0 = sourceModel()->index(sourceRow, DocumentModel::Document_Ident, sourceParent); const QString idStr = sourceModel()->data(index0).toString(); const QModelIndex index1 = sourceModel()->index(sourceRow, DocumentModel::Document_Type, sourceParent); const QString typeStr = sourceModel()->data(index1).toString(); const QModelIndex index2 = sourceModel()->index(sourceRow, DocumentModel::Document_ClientName, sourceParent); const QString clientNameStr = sourceModel()->data(index2).toString(); const QModelIndex index3 = sourceModel()->index(sourceRow, DocumentModel::Document_Whiteboard, sourceParent); const QString whiteboardStr = sourceModel()->data(index3).toString(); const QModelIndex index4 = sourceModel()->index(sourceRow, DocumentModel::Document_ProjectLabel, sourceParent); const QString projectStr = sourceModel()->data(index4).toString(); if( idStr.contains(filter) || typeStr.contains(filter) || clientNameStr.contains(filter) || whiteboardStr.contains(filter) || projectStr.contains(filter)) { accepted = true; } } // for the treeview, check all the children if( _enableTreeView ) { int rows = sourceModel()->rowCount(index); for (int row = 0; row < rows; row++) { if (filterAcceptsRow(row, index)) { accepted = true; } } } // if the entry is accepted so far, check if it is within the time limit if( accepted && m_MaxRows > -1 ) { const QModelIndex index = sourceModel()->index(sourceRow, DocumentModel::Document_CreationDateRaw, sourceParent); const QDate docDate = sourceModel()->data(index).toDate(); int dateDiff = docDate.daysTo(QDate::currentDate()); if( dateDiff > m_MaxRows ) { accepted = false; } } return accepted; } bool DocumentFilterModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const { QVariant leftData = sourceModel()->data(source_left); QVariant rightData = sourceModel()->data(source_right); if (leftData.type() == QVariant::DateTime) { return leftData.toDateTime() < rightData.toDateTime(); } if(leftData.type() == QVariant::Date ) { return leftData.toDate() < rightData.toDate(); } else { const QString leftString = leftData.toString(); const QString rightString = rightData.toString(); return QString::localeAwareCompare(leftString, rightString) < 0; } } kraft-1.2.2/src/models/documentproxymodels.h000066400000000000000000000036341467704360200212110ustar00rootroot00000000000000/*************************************************************************** documentproxymodels - contains proxymodels to show the documentmodel in different views ------------------- begin : 2010-01-11 copyright : Copyright 2010 by Thomas Richard email : thomas.richard@proan.be ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef DOCUMENTPROXYMODELS_H #define DOCUMENTPROXYMODELS_H #include #include class QModelIndex; class QVariant; class QObject; class DateModel; class DocumentModel; //Filters out the last 10 items of the DocumentModel class DocumentFilterModel : public QSortFilterProxyModel { public: DocumentFilterModel(int maxRows = -1, QObject *parent = 0); void setMaxRows( int ); void setEnableTreeview( bool treeview ); protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const; private: int m_MaxRows; bool _enableTreeView; QScopedPointer _treeModel; QScopedPointer _tableModel; }; #endif kraft-1.2.2/src/models/globalcontactmodel.h000066400000000000000000000033041467704360200207140ustar00rootroot00000000000000/* This file is part of KAddressBook. Copyright (c) 2009 Tobias Koenig 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 GLOBALCONTACTMODEL_H #define GLOBALCONTACTMODEL_H namespace Akonadi { class ChangeRecorder; class ContactsTreeModel; class Monitor; class Session; } /** * @short Provides the global model for all contacts * * This model provides the EntityTreeModel for all contacts. * The model is accessable via the static instance() method. */ class GlobalContactModel { public: /** * Destroys the global contact model. */ ~GlobalContactModel(); /** * Returns the global contact model instance. */ static GlobalContactModel* instance(); /** * Returns the item model of the global instance. */ Akonadi::ContactsTreeModel* model() const; private: GlobalContactModel(); static GlobalContactModel *mInstance; Akonadi::Session *mSession; Akonadi::ChangeRecorder *mMonitor; Akonadi::ContactsTreeModel *mModel; }; #endif kraft-1.2.2/src/mysqldetails.ui000066400000000000000000000045701467704360200165030ustar00rootroot00000000000000 mySqlDetailsForm 0 0 401 213 Please enter the MySQL Database server settings. For detailed setup instructions for the MySQL to use with Kraft please check the Kraft website. true Database host: Database name: Database user: Password: Qt::Vertical 20 12 kraft-1.2.2/src/newdocassistant.cpp000066400000000000000000000202161467704360200173410ustar00rootroot00000000000000/*************************************************************************** newdocassistant - widget to select header data for the doc ------------------- begin : 2008-02-12 copyright : (C) 2008 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "newdocassistant.h" #include "defaultprovider.h" #include "filterheader.h" #include "doctype.h" #include "kraftsettings.h" #include "addressselectorwidget.h" #include "documentman.h" CustomerSelectPage::CustomerSelectPage( QWidget *parent ) :QWizardPage ( parent ) { QVBoxLayout *vbox = new QVBoxLayout; setLayout( vbox ); setTitle(i18n( "New Document Settings" )); QLabel *help = new QLabel; help->setText( i18n( "Please select a customer as addressee for the document. " "If there is no entry for the customer in the addressbook yet, it can be opened " "by clicking on the button below." ) ); // help->setTextFormat( Qt::RichText ); help->setWordWrap( true ); help->setSizePolicy( QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed )); vbox->addWidget( help ); mAddresses = new AddressSelectorWidget(this); connect( mAddresses, SIGNAL( addressSelected( const KContacts::Addressee& ) ), SIGNAL( addresseeSelected( const KContacts::Addressee& ) ) ); vbox->addWidget( mAddresses ); } void CustomerSelectPage::saveState() { mAddresses->saveState(); } void CustomerSelectPage::setupAddresses() { } CustomerSelectPage:: ~CustomerSelectPage() { } // ########################################################################### DocDetailsPage::DocDetailsPage( QWidget *parent ) : QWizardPage(parent), _haveAddressSelect(true), mCustomerLabel( nullptr ) { QVBoxLayout *vbox = new QVBoxLayout; setLayout( vbox ); setTitle(i18n( "New Document Settings" )); QLabel *help = new QLabel; help->setTextFormat( Qt::RichText ); help->setText( i18n( "Select a document type and a date. A comment on the whiteboard " "helps to classify the document." ) ); vbox->addWidget( help ); mCustomerLabel = new QLabel; mCustomerLabel->setFrameStyle( QFrame::Box + QFrame::Sunken ); mCustomerLabel->setTextFormat( Qt::RichText ); mCustomerLabel->setText( i18n( "Customer: Not yet selected!" ) ); vbox->addWidget( mCustomerLabel ); QFormLayout *grid = new QFormLayout; vbox->addLayout( grid ); mTypeCombo = new QComboBox; mTypeCombo->insertItems( 0, DocType::allLocalised() ); mTypeCombo->setCurrentIndex( mTypeCombo->findText( DefaultProvider::self()->docType() )); grid->addRow( i18n("Document &type:"), mTypeCombo ); mDateEdit = new QDateEdit; mDateEdit->setDate( QDate::currentDate() ); grid->addRow( i18n( "Document date: " ), mDateEdit ); mWhiteboardEdit = new QTextEdit; grid->addRow( i18n( "Whiteboard content:" ), mWhiteboardEdit ); QHBoxLayout *hbox = new QHBoxLayout; vbox->addLayout(hbox); mKeepItemsCB = new QCheckBox( i18n("Copy document items from predecessor document")); hbox->addWidget( mKeepItemsCB ); mSourceDocIdentsCombo = new QComboBox; hbox->addWidget(mSourceDocIdentsCombo); mSourceDocIdentsCombo->setVisible(false); mKeepItemsCB->setChecked(true); mKeepItemsCB->setVisible(false); vbox->addStretch( 1 ); } DocDetailsPage::~DocDetailsPage() { } void DocDetailsPage::setNoAddresses() { _haveAddressSelect = false; } // ########################################################################### KraftWizard::KraftWizard(QWidget *parent, const char* name, bool modal ) :QWizard( parent ), mCustomerPage( nullptr ), mCustomerBox( nullptr ), mParent( parent ) { setObjectName( name ); setModal( modal ); const QByteArray geo = QByteArray::fromBase64( KraftSettings::self()->newDocWizardGeometry().toLatin1() ); restoreGeometry(geo); } KraftWizard::~KraftWizard() { } void KraftWizard::init( bool haveAddressSelect, const QString& followUpDoc ) { QScopedPointer addressProvider; addressProvider.reset(new AddressProvider); if( followUpDoc.isEmpty() ) { setWindowTitle( i18n( "Create a new Kraft Document" ) ); } else { setWindowTitle(followUpDoc); } mDetailsPage = new DocDetailsPage(); addPage(mDetailsPage); // w1, QLatin1String("

              ") + + QLatin1String("

              ") ); // only pick an addressee if the document is really new if( addressProvider->backendUp() && haveAddressSelect ) { mCustomerPage = new CustomerSelectPage( ); addPage( mCustomerPage); // w, QLatin1String("

              ") + i18n( "Select an Addressee" ) + QLatin1String("

              ") ); mCustomerPage->setupAddresses(); connect( mCustomerPage, SIGNAL( addresseeSelected(KContacts::Addressee)), this, SLOT( slotAddressee(KContacts::Addressee))); } } void KraftWizard::done( int r ) { if( mCustomerPage ) { mCustomerPage->saveState(); } const QByteArray geo = saveGeometry().toBase64(); KraftSettings::self()->setNewDocWizardGeometry(geo); QWizard::done(r); } void KraftWizard::slotAddressee(const KContacts::Addressee& addressee) { // qDebug () << "Addressee Changed!"; mAddressee = addressee; } QDate KraftWizard::date() const { return mDetailsPage->mDateEdit->date(); } QString KraftWizard::addressUid() const { return mAddressee.uid(); } QString KraftWizard::docType() const { return mDetailsPage->mTypeCombo->currentText(); } QString KraftWizard::whiteboard() const { return mDetailsPage->mWhiteboardEdit->toPlainText(); } void KraftWizard::setDocToFollow( DocGuardedPtr sourceDoc) { if( !sourceDoc ) { return; } DocGuardedPtr dPtr = sourceDoc; QString id = sourceDoc->docID().toString(); while( ! id.isEmpty() ) { // store the id of the follower and clear id const QString idT = dPtr->docIdentifier(); mDetailsPage->mSourceDocIdentsCombo->addItem(idT, id); id = QString(); // remember the current dptr to be able to delete it soon DocGuardedPtr oldDptr = dPtr; dPtr = DocumentMan::self()->openDocumentbyIdent( dPtr->predecessor() ); if( dPtr ) { id = dPtr->docID().toString(); } if( oldDptr != sourceDoc ) { delete oldDptr; } } if( mDetailsPage->mSourceDocIdentsCombo->count() > 0 ) { mDetailsPage->mKeepItemsCB->setVisible(true); mDetailsPage->mSourceDocIdentsCombo->setVisible(true); } // we already know the customer, disable the customer select page. mDetailsPage->setNoAddresses(); if ( mDetailsPage->mCustomerLabel ) { const QString followText = i18n("Followup Document for %1", sourceDoc->docIdentifier() ); mDetailsPage->mCustomerLabel->setText( followText ); } } QString KraftWizard::copyItemsFromPredecessor() { QString re; if( mDetailsPage->mKeepItemsCB->checkState() == Qt::Checked ) { re = mDetailsPage->mSourceDocIdentsCombo->currentData().toString(); } return re; } void KraftWizard::setAvailDocTypes( const QStringList& list ) { mDetailsPage->mTypeCombo->clear(); mDetailsPage->mTypeCombo->insertItems( -1, list ); } kraft-1.2.2/src/newdocassistant.h000066400000000000000000000061511467704360200170100ustar00rootroot00000000000000/*************************************************************************** new doc assistant - widget to select Addresses ------------------- begin : 2008-02-12 copyright : (C) 2008 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef NEWDOCASSISTANT_H #define NEWDOCASSISTANT_H #include #include #include #include #include "kraftdoc.h" #include "docguardedptr.h" class DocText; class TextSelection; class KraftWizard; class AddressSelectorWidget; class QDateEdit; class QComboBox; class QHBox; class QTextEdit; class QCheckBox; using namespace KContacts; // --------------------------------------------------------------------------- class CustomerSelectPage: public QWizardPage { Q_OBJECT friend class KraftWizard; public: CustomerSelectPage( QWidget *parent = 0 ); ~CustomerSelectPage(); void setupAddresses(); public slots: void saveState(); signals: void addresseeSelected( const KContacts::Addressee& ); private: AddressSelectorWidget *mAddresses; }; // --------------------------------------------------------------------------- class DocDetailsPage : public QWizardPage { Q_OBJECT friend class KraftWizard; public: DocDetailsPage( QWidget *parent = 0 ); ~DocDetailsPage(); void setNoAddresses(); private: bool _haveAddressSelect; QLabel *mCustomerLabel; QDateEdit *mDateEdit; QComboBox *mTypeCombo; QTextEdit *mWhiteboardEdit; QCheckBox *mKeepItemsCB; QComboBox *mSourceDocIdentsCombo; }; // --------------------------------------------------------------------------- class KraftWizard: public QWizard { Q_OBJECT public: KraftWizard(QWidget *parent = 0, const char* name = 0, bool modal = false ); void init(bool haveAddressSelect, const QString& followUpDoc = QString()); ~KraftWizard(); QDate date() const ; QString addressUid() const; QString docType() const; QString whiteboard() const; void setCustomer( const QString& ); void setDocToFollow( DocGuardedPtr sourceDoc); void setAvailDocTypes( const QStringList& ); void done(int r); QString copyItemsFromPredecessor(); protected slots: void slotAddressee( const KContacts::Addressee& ); private: CustomerSelectPage *mCustomerPage; DocDetailsPage *mDetailsPage; QHBox *mCustomerBox; QWidget *mParent; KContacts::Addressee mAddressee; }; #endif kraft-1.2.2/src/numbercycle.cpp000066400000000000000000000030251467704360200164370ustar00rootroot00000000000000/*************************************************************************** numbercycle.h - document number cycles ------------------- begin : Jan 15 2009 copyright : (C) 2009 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "numbercycle.h" NumberCycle::NumberCycle() { } NumberCycle::NumberCycle( dbID _id ) :id( _id ) { } void NumberCycle::setName( const QString& n ) { mName = n; } QString NumberCycle::name() { return mName; } void NumberCycle::setTemplate( const QString& t ) { mTemplate = t; } QString NumberCycle::getTemplate() { return mTemplate; } void NumberCycle::setCounter( int c ) { mCounter = c; } int NumberCycle::counter() { return mCounter; } QString NumberCycle::defaultName() { return QString( "default" ); } kraft-1.2.2/src/numbercycle.h000066400000000000000000000027361467704360200161140ustar00rootroot00000000000000/*************************************************************************** numbercycle.h - document number cycles ------------------- begin : Jan 15 2009 copyright : (C) 2009 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef NUMBERCYCLE_H #define NUMBERCYCLE_H #include #include "dbids.h" #include "kraftcat_export.h" class KRAFTCAT_EXPORT NumberCycle { public: NumberCycle(); NumberCycle( dbID ); void setName( const QString& ); QString name(); void setTemplate( const QString& ); QString getTemplate(); void setCounter( int ); int counter(); static QString defaultName(); private: dbID id; QString mName; QString mTemplate; int mCounter; }; #endif kraft-1.2.2/src/numbercycledialog.cpp000066400000000000000000000335331467704360200176260ustar00rootroot00000000000000/*************************************************************************** doctypeedit.h - the document type editor ------------------- begin : Fri Jan 2 2009 copyright : (C) 2009 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "prefsdialog.h" #include "kraftsettings.h" #include "kraftdb.h" #include "kraftdoc.h" #include "defaultprovider.h" #include "doctype.h" #include "doctypeedit.h" #include "numbercycledialog.h" NumberCycleDialog::NumberCycleDialog( QWidget *parent, const QString& initType ) :QDialog( parent ) // "NUMBER_CYCLES_EDIT", true, i18n( "Edit Number Cycles" ), Ok|Cancel ) { setObjectName( "NUMBER_CYCLES_EDIT" ); setModal( true ); setWindowTitle( i18n( "Edit Number Cycles" ) ); QVBoxLayout *layout = new QVBoxLayout; setLayout(layout); QWidget *w = new QWidget; layout->addWidget(w); mBaseWidget = new Ui::NumberCycleEditBase( ); mBaseWidget->setupUi( w ); mBaseWidget->mPbAdd->setIcon( DefaultProvider::self()->icon( "list-add" ) ); mBaseWidget->mPbRemove->setIcon( DefaultProvider::self()->icon( "list-remove" ) ); mBaseWidget->mCounterEdit->setMaximum( 1000000 ); mBaseWidget->mCounterEdit->setSingleStep( 1 ); const QString tip = i18n( "The template may contain the following tags:" "
              • %y or %yyyy - the year of the documents date.
              • " "
              • %yy - the year of the document (two digits).
              • " "
              • %w - the week number of the documents date.
              • " "
              • %ww - the week number of the documents date with leading zero.
              • " "
              • %d - the day number of the documents date.
              • " "
              • %dd - the day number of the documents date with leading zero.
              • " "
              • %m or %M - the month number of the documents date.
              • " "
              • %MM - the month number with leading zero.
              • " "
              • %c - the customer id from kaddressbook
              • " "
              • %i - the unique counter
              • " "
              • %ii .. %iiiiii - the counter padded with leading 0, ie. 012
              • " "
              • %n - a day based counter, resets every day. Combined with date, it makes the number unique.
              • " "
              • %nn .. %nnnnnn - the day based counter padded with leading 0.
              • " "
              • %type - the localised doc type (offer, invoice etc.)
              • " "
              • %uid - the contact id of the client.
              • " "
              %i or %n need to be part of the template." ); mBaseWidget->mIdTemplEdit->setToolTip( tip ); connect( mBaseWidget->mPbAdd, SIGNAL( clicked() ), SLOT( slotAddCycle() ) ); connect( mBaseWidget->mPbRemove, SIGNAL( clicked() ), SLOT( slotRemoveCycle() ) ); loadCycles(); connect( mBaseWidget->mCycleListBox, SIGNAL( currentRowChanged( int ) ), SLOT( slotNumberCycleSelected( int ) ) ); QListWidgetItem *initItem = mBaseWidget->mCycleListBox->findItems( initType, Qt::MatchExactly ).first(); if ( initItem ) { mBaseWidget->mCycleListBox->setCurrentItem( initItem, QItemSelectionModel::Select ); } QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); _okButton = buttonBox->button(QDialogButtonBox::Ok); _okButton->setDefault(true); _okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); layout->addWidget(buttonBox); slotUpdateExample(); connect( mBaseWidget->mIdTemplEdit, SIGNAL( textChanged( const QString& ) ), SLOT( slotTemplTextChanged( const QString& ) ) ); connect( mBaseWidget->mCounterEdit, SIGNAL( valueChanged( int ) ), SLOT( slotUpdateExample() ) ); } void NumberCycleDialog::loadCycles() { QSqlQuery q( "SELECT id, name, lastIdentNumber, identTemplate FROM numberCycles ORDER BY name" ); mBaseWidget->mCycleListBox->clear(); while ( q.next() ) { dbID id( q.value( 0 ).toInt() ); NumberCycle nc( id ); nc.setName( q.value( 1 ).toString() ); nc.setCounter( q.value( 2 ).toInt() ); nc.setTemplate( q.value( 3 ).toString() ); mNumberCycles[nc.name()] = nc; mBaseWidget->mCycleListBox->addItem( nc.name() ); } } void NumberCycleDialog::slotUpdateExample() { DocType dt; dt.setName( i18n( "Doc-Type" ) ); int id = mBaseWidget->mCounterEdit->value(); const QString tmpl = mBaseWidget->mIdTemplEdit->text(); dt.setIdentTemplate( tmpl ); QString idText = dt.generateDocumentIdent( QDate::currentDate(), QLatin1String(""), id, 2 ); // generateDocumentIdent automatically adds a %i to the pattern, if it has neither // %i nor %n. A note is added here to the dialog text if ( !(tmpl.contains("%i") || tmpl.contains("%n"))) { idText.append(" "); idText.append(i18nc("do not translate %i, it is a template variable.", "(%i added)")); } mBaseWidget->mExampleId->setText( idText ); } void NumberCycleDialog::slotTemplTextChanged( const QString& str ) { bool state = false; if ( !str.isEmpty() && (str.contains( "%i" ) || str.contains("%n") )) { state = true; } if( _okButton ) { _okButton->setEnabled( state ); } slotUpdateExample(); } void NumberCycleDialog::updateCycleDataFromGUI() { // Store the updated values if ( !mSelectedCycle.isEmpty() ) { // qDebug () << "Updating the cycle: " << mSelectedCycle; if ( mNumberCycles.contains( mSelectedCycle ) ) { QString h = mBaseWidget->mIdTemplEdit->text(); mNumberCycles[mSelectedCycle].setTemplate( h ); // qDebug () << "Number Cycle Template: " << h; int num = mBaseWidget->mCounterEdit->value(); // qDebug () << "Number Edit: " << num; mNumberCycles[mSelectedCycle].setCounter( num ); } else { // qDebug () << "WRN: NumberCycle " << mSelectedCycle << " is not known"; } } else { // qDebug () << "The selected cycle name is Empty!"; } } void NumberCycleDialog::slotNumberCycleSelected( int num ) { updateCycleDataFromGUI(); // set the new data of the selected cycle QString name = mBaseWidget->mCycleListBox->item( num )->text(); if ( ! mNumberCycles.contains( name ) ) { // qDebug () << "No numbercycle found at pos " << num; } NumberCycle nc = mNumberCycles[name]; // qDebug () << "Selected number cycle number " << num; mBaseWidget->mIdTemplEdit->setText( nc.getTemplate() ); mBaseWidget->mCounterEdit->setMinimum( 0 ); // nc.counter() ); mBaseWidget->mCounterEdit->setValue( nc.counter() ); mBaseWidget->mNameEdit->setText( nc.name() ); mBaseWidget->mNameEdit->setReadOnly( true ); // remember the cycle name mSelectedCycle = name; bool state = true; if ( name == NumberCycle::defaultName() ) { state = false; } mBaseWidget->mPbRemove->setEnabled( state ); } void NumberCycleDialog::slotAddCycle() { QString newName = QInputDialog::getText( this, i18n( "Add Number Cycle" ), i18n( "Enter the name of a new number cycle." ) ); if ( newName.isEmpty() ) return; bool uniq = true; if ( mNumberCycles.contains( newName ) ) { uniq = false; } if ( uniq ) { NumberCycle numCycle; numCycle.setName( newName ); numCycle.setTemplate( QString::fromLatin1( "%y%w-%i" ) ); QSqlQuery q( "SELECT 1+MAX(lastIdentNumber) FROM numberCycles" ); if ( q.next() ) { numCycle.setCounter( q.value( 0 ).toInt() ); } mNumberCycles[newName] = numCycle; mBaseWidget->mCycleListBox->addItem( numCycle.name() ); } else { // qDebug () << "The name is not unique!"; } QListWidgetItem *item = mBaseWidget->mCycleListBox->findItems( newName, Qt::MatchExactly ).first(); if ( item ) { mBaseWidget->mCycleListBox->setCurrentItem( item ); } } void NumberCycleDialog::slotRemoveCycle() { QString entry = mBaseWidget->mCycleListBox->currentItem()->text(); QListWidgetItem *item = mBaseWidget->mCycleListBox->currentItem(); if ( entry.isEmpty() || !item ) return; mRemovedCycles << entry; if ( item ) { mNumberCycles.remove( entry ); delete item; } } bool NumberCycleDialog::dropOfNumberCycleOk( const QString& name ) { QSqlQuery q; q.prepare( "SELECT count(att.id) FROM attributes att, attributeValues attVal WHERE att.id=attVal.attributeId AND att.hostObject=:dtype AND att.name=:attName AND attVal.value=:val" ); q.bindValue( ":dtype", "DocType" ); q.bindValue( ":attName", "identNumberCycle" ); q.bindValue( ":val", name ); q.exec(); if ( q.next() ) { int cnt = q.value( 0 ).toInt(); if ( cnt > 0 ) { QMessageBox msgBox; msgBox.setText(i18n( "The numbercycle %1 is still assigned to a document type.")); msgBox.setInformativeText(i18n("The number cycle cannot be deleted as long as it " "is assigned to a document type." ).arg( name )); msgBox.setStandardButtons(QMessageBox::Ok); } return cnt == 0; } return true; } void NumberCycleDialog::accept() { // qDebug () << "Slot Ok hit"; // get the changed stuff from the gui elements updateCycleDataFromGUI(); // First remove the dropped cycles if ( mRemovedCycles.count() > 0 ) { QSqlQuery qDel; qDel.prepare( "DELETE FROM numberCycles WHERE name=:name" ); for ( QStringList::Iterator it = mRemovedCycles.begin(); it != mRemovedCycles.end(); ++it ) { // qDebug () << "about to drop the number cycle " << *it; if ( dropOfNumberCycleOk( *it ) ) { qDel.bindValue( ":name", *it ); qDel.exec(); } } } // update existing entries and insert new ones // CREATE TABLE numberCycles ( // id INTEGER PRIMARY KEY ASC autoincrement, // name VARCHAR(64) NOT NULL, // lastIdentNumber INT NOT NULL, // identTemplate VARCHAR(64) NOT NULL // ); QSqlQuery q; q.prepare( "SELECT id, name, lastIdentNumber, identTemplate FROM numberCycles WHERE name=:name" ); QMap::Iterator it; for ( it = mNumberCycles.begin(); it != mNumberCycles.end(); ++it ) { QString cycleName = it.key(); NumberCycle cycle = it.value(); q.bindValue( ":name", cycleName ); // name changes cannot happen by design q.exec(); if ( q.next() ) { // qDebug () << "Checking existing number cycle " << cycleName << " for update"; // there is an entry if ( q.value( 2 ).toInt() != cycle.counter() ) { bool doUpdate = true; if ( q.value( 2 ).toInt() > cycle.counter() ) { if ( q.value( 3 ).toString() == cycle.getTemplate() ) { // The number has become smaller but the template remains the same. // That has high potential to end up with duplicate doc numbers. QMessageBox msgBox; msgBox.setWindowTitle(i18n("Dangerous Counter Change")); msgBox.setText(i18n("The new counter is lower than the old one. " )); msgBox.setInformativeText(i18n("That has potential to create duplicate document numbers. Do you really want to decrease it?" )); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton( QMessageBox::Yes ); int re = msgBox.exec(); if( re != QMessageBox::Yes ) { doUpdate = false; } } } if ( doUpdate ) { updateField( q.value( 0 ).toInt(), "lastIdentNumber", QString::number( cycle.counter() ) ); } } if ( q.value( 3 ).toString() != cycle.getTemplate() ) { updateField( q.value( 0 ).toInt(), "identTemplate", cycle.getTemplate() ); } } else { // qDebug () << "This number cycle is new: " << cycleName; QSqlQuery qIns; qIns.prepare( "INSERT INTO numberCycles (name, lastIdentNumber, identTemplate) " "VALUES (:name, :number, :templ)" ); qIns.bindValue( ":name", cycleName ); qIns.bindValue( ":number", cycle.counter() ); qIns.bindValue( ":templ", cycle.getTemplate() ); qIns.exec(); } } QDialog::accept(); } void NumberCycleDialog::updateField( int id, const QString& field, const QString& value ) { QSqlQuery qUpdate; QString sql = "UPDATE numberCycles SET " + field + "=:value WHERE id=:id"; qUpdate.prepare( sql ); // qUpdate.bindValue( ":field", field ); qUpdate.bindValue( ":value", value ); qUpdate.bindValue( ":id", id ); qUpdate.exec(); } kraft-1.2.2/src/numbercycledialog.h000066400000000000000000000041141467704360200172640ustar00rootroot00000000000000/*************************************************************************** numbercycledialog.h - edit number cycles ------------------- begin : Jan 15 2009 copyright : (C) 2009 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef NUMBERCYCLEDIALOG_H #define NUMBERCYCLEDIALOG_H #include #include #include #include "dbids.h" #include "numbercycle.h" #include "ui_numbercycleseditbase.h" class QLineEdit; class QLabel; class QPushButton; class QComboBox; class QCheckBox; /** * @author Klaas Freitag */ // ################################################################################ class NumberCycleDialog: public QDialog { Q_OBJECT public: NumberCycleDialog( QWidget *parent, const QString& initType = QString() ); public slots: protected slots: void slotAddCycle(); void slotRemoveCycle(); void slotNumberCycleSelected( int ); void slotTemplTextChanged( const QString& ); void accept(); void slotUpdateExample(); private: void updateField( int, const QString&, const QString& ); void loadCycles(); void updateCycleDataFromGUI(); bool dropOfNumberCycleOk( const QString& ); Ui::NumberCycleEditBase *mBaseWidget; QStringList mRemovedCycles; QMap mNumberCycles; QString mSelectedCycle; QPushButton *_okButton; }; #endif kraft-1.2.2/src/numbercycleseditbase.ui000066400000000000000000000126351467704360200201650ustar00rootroot00000000000000 NumberCycleEditBase 0 0 503 279 <h3>Edit Number Cycles</h3> false Number Cycle Details &Number cycle: false mNameEdit &Counter: false mCounterEdit false Example Id: false ident &Template: false mIdTemplEdit false false example false &Select a number cycle and edit the details on the right: Qt::AlignVCenter true mCycleListBox New Item Qt::Horizontal QSizePolicy::Expanding 37 20 Click to add a new document type to the list. add click to remove the current document type remove kraft-1.2.2/src/pdfconverter.cpp000066400000000000000000000167161467704360200166430ustar00rootroot00000000000000/*************************************************************************** pdfconverter.cpp - convert documents to pdf ------------------- begin : March 2020 copyright : (C) 2020 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "pdfconverter.h" #include "defaultprovider.h" #include #include #include #include #include #include #include void PDFConverter::slotReceivedStderr( ) { QByteArray arr = mProcess->readAllStandardError(); mErrors.append( arr ); } // ==================================================================== ReportLabPDFConverter::ReportLabPDFConverter() :PDFConverter() { } void ReportLabPDFConverter::convert(const QString& sourceFile, const QString &outputFile) { // qDebug() << "Report BASE:\n" << templ; if ( sourceFile.isEmpty() ) { return; } // findTrml2Pdf returns a list of command line parts for the converter, such as // /usr/bin/pyhton3 /usr/local/share/erml2pdf.py QStringList rmlbin = DefaultProvider::self()->locatePythonTool("erml2pdf.py"); if ( ! rmlbin.size() ) { emit converterError(ConvError::TrmlToolFail); } QApplication::setOverrideCursor( QCursor( Qt::BusyCursor ) ); QStringList args; QString prg = rmlbin.at(0); if( rmlbin.size() > 1 ) { // something like "python3 erml2pdf.py args.append(rmlbin.at(1)); } args.append(sourceFile); mFile.setFileName(outputFile); mOutputSize = 0; if ( mFile.open( QIODevice::WriteOnly ) ) { qDebug() << "Converting " << mFile.fileName() << "using" << prg << args.join(QChar(' ')); mProcess = new QProcess(); connect(mProcess, &QProcess::readyReadStandardOutput, this, &ReportLabPDFConverter::slotReceivedStdout); connect(mProcess, &QProcess::readyReadStandardError, this, &ReportLabPDFConverter::slotReceivedStderr); connect(mProcess, QOverload::of(&QProcess::finished), this, &ReportLabPDFConverter::trml2pdfFinished); mProcess->setProgram( prg ); mProcess->setArguments(args); mTargetStream.setDevice( &mFile ); mProcess->start( ); if (!mProcess->waitForStarted(1000)) { emit converterError(ConvError::TrmlToolFail); } } } void ReportLabPDFConverter::slotReceivedStdout( ) { QByteArray arr = mProcess->readAllStandardOutput(); mOutputSize += arr.size(); mTargetStream.writeRawData( arr.data(), arr.size()); } void ReportLabPDFConverter::trml2pdfFinished( int exitCode, QProcess::ExitStatus stat) { if( mFile.isOpen() ) { mFile.close(); } Q_UNUSED(stat) QApplication::restoreOverrideCursor(); // qDebug () << "PDF Creation Process finished with status " << exitStatus; // qDebug () << "Wrote bytes to the output file: " << mOutputSize; if ( exitCode == 0 ) { QFileInfo fi(mFile.fileName()); if( fi.exists() ) { emit docAvailable( mFile.fileName() ); if( mProcess) { const QString rmlFile = mProcess->arguments().last(); // the file name of the temp rmlfile QFile::remove(rmlFile); // remove the rmlFile } } else { emit converterError(ConvError::TargetFileMissing); } } else { if( mErrors.contains(QLatin1String("No module named 'reportlab"))) { emit converterError(ConvError::NoReportLabMod); } else if (mErrors.contains("No module named 'PyPDF2")){ emit converterError(ConvError::NoPyPDFMod); } else { qDebug() << "Trml2Pdf Error:" << mErrors; emit converterError(ConvError::UnknownError); } } mProcess->deleteLater(); mProcess = nullptr; mFile.setFileName( QString() ); } // ==================================================================== WeasyPrintPDFConverter::WeasyPrintPDFConverter() :PDFConverter() { // Version string of version 55: WeasyPrint version 55.0 // WeasyPrint version 56.1 } void WeasyPrintPDFConverter::convert(const QString& sourceFile, const QString& outputFile) { mErrors.clear(); const QString prg = DefaultProvider::self()->locateBinary("weasyprint"); const QString styleSheet = DefaultProvider::self()->locateFile("reports/kraft.css"); QFileInfo prgInfo(prg); if ( ! prgInfo.exists() || ! prgInfo.isExecutable() ) { emit converterError(ConvError::WeasyPrintNotFound); return; } mFile.setFileName(outputFile); QApplication::setOverrideCursor( QCursor( Qt::BusyCursor ) ); mProcess = new QProcess; connect(mProcess, &QProcess::readyReadStandardOutput, this, &WeasyPrintPDFConverter::slotReceivedStdout); connect(mProcess, &QProcess::readyReadStandardError, this, &WeasyPrintPDFConverter::slotReceivedStderr); connect(mProcess, QOverload::of(&QProcess::finished), this, &WeasyPrintPDFConverter::weasyPrintFinished); QStringList args; QFileInfo styleFI(styleSheet); const QString styleSheetDir = styleFI.canonicalPath(); args << "-p"; args << "-u"; args << styleSheetDir; if (!_templatePath.isEmpty() && _templatePath != styleSheetDir) { args << "-u"; args << _templatePath; } args << sourceFile; args << mFile.fileName(); qDebug() << "Calling converter:" << prg << args; mProcess->setProgram( prg ); mProcess->setArguments(args); mOutput.clear(); mProcess->start( ); } void WeasyPrintPDFConverter::slotReceivedStdout( ) { QByteArray arr = mProcess->readAllStandardOutput(); mOutput.append(arr); } void WeasyPrintPDFConverter::weasyPrintFinished( int exitCode, QProcess::ExitStatus stat) { if( mFile.isOpen() ) { mFile.close(); } Q_UNUSED(stat) QApplication::restoreOverrideCursor(); // qDebug () << "PDF Creation Process finished with status " << exitStatus; // qDebug () << "Wrote bytes to the output file: " << mOutputSize; if ( exitCode == 0 ) { QFileInfo fi(mFile.fileName()); if( fi.exists() ) { emit docAvailable( mFile.fileName() ); if(mProcess) { const QString htmlFile = mProcess->arguments().first(); // the file name of the temp rmlfile QFile::remove(htmlFile); // remove the rmlFile } } else { emit converterError(ConvError::TargetFileMissing); } } else { qDebug() << "Weasyprint failed: " << mProcess->arguments(); emit converterError(ConvError::UnknownError); } mProcess->deleteLater(); mProcess = nullptr; mFile.setFileName( QString() ); } kraft-1.2.2/src/pdfconverter.h000066400000000000000000000061611467704360200163010ustar00rootroot00000000000000/*************************************************************************** pdfconverter.cpp - convert documents to pdf ------------------- begin : March 2020 copyright : (C) 2020 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef PDFCONVERTER_H #define PDFCONVERTER_H #include #include #include #include #include class PDFConverter : public QObject { Q_OBJECT public: PDFConverter() {} enum class ConvError { NoError, SourceFileFail, TrmlToolFail, TargetFileError, NoReportLabMod, NoPyPDFMod, TargetFileMissing, UnknownError, WeasyPrintNotFound, PDFMergerError }; virtual void convert(const QString& sourceFile, const QString& outputFile) = 0; QString getErrors() { return mErrors; } /* * Sets the path of the template which can be used as base path to find * stylesheets and images and such. */ void setTemplatePath(const QString& path) { _templatePath = path; } signals: void docAvailable(const QString& fileName); void converterError( ConvError ); protected slots: void slotReceivedStderr(); protected: QString mErrors; QProcess *mProcess; QFile mFile; QString _templatePath; }; // ==================================================================== class ReportLabPDFConverter: public PDFConverter { Q_OBJECT public: ReportLabPDFConverter(); void convert(const QString& sourceFile, const QString& outputFile) override; private slots: void trml2pdfFinished( int exitCode, QProcess::ExitStatus stat); void slotReceivedStdout(); private: QFile mFile; QDataStream mTargetStream; int mOutputSize; }; // ==================================================================== class WeasyPrintPDFConverter : public PDFConverter { Q_OBJECT public: WeasyPrintPDFConverter(); void convert(const QString& sourceFile, const QString& outputFile) override; private slots: void slotReceivedStdout(); void weasyPrintFinished(int exitCode, QProcess::ExitStatus stat); private: QByteArray mOutput; }; #endif // PDFCONVERTER_H kraft-1.2.2/src/pics/000077500000000000000000000000001467704360200143615ustar00rootroot00000000000000kraft-1.2.2/src/pics/CMakeLists.txt000066400000000000000000000003111467704360200171140ustar00rootroot00000000000000 ########### install files ############### install(FILES kraftapp_logo.png DESTINATION ${DATA_INSTALL_DIR}/kraft/pics) ecm_install_icons( ICONS sc-apps-kraft.svg DESTINATION ${KDE_INSTALL_ICONDIR}) kraft-1.2.2/src/pics/Calendar_page.png000066400000000000000000000051161467704360200175770ustar00rootroot00000000000000PNG  IHDR|/YbKGD pHYs B(xtIME &8J5 IDATxil\;2 ;P4vҬ%$JReQ"Q[Z?B !PC)*QQR(MR'Gib; Όcgc$KHw|sB!B!B!"-0ee:\Y_}GKz{ {+ɓ' Z88YNek|{a=c:6nLvuuUo/?ld>^42ۮau`]3{]2$մ6'W$;4=Jh@L[k!61,XSn]V"9:TGi!n7zNjŲ Ԏ ̬p6#Ѳ0BiRgXf;V(!͙eN AQ &tuڊ._)N-Ә,6kJwŻha+I5 eN7gkIKp!B… .$\Hp1nS0`j<l\oFɒo]JJ GȈ>_qґ6)v9x }3J3r#_\ _2԰im4 0CCc*!+˺ քaM9sQwM&/$ k\aJHsvv{Np\9篜!' _n[O~]S-<;71:,rۇcK\+N3NBX '`\27WFi$rJwbۇ&,0μ‡W g@c/<OX)Vu,xoyc-&5hm3(K`\e# ]+%w@AI}~STuu,&DL c,e>Nr__:MH\v gpF̝KQ&x[Ȝ@7@A+ _❏TVP9%'Z!v3ps(DS ӧIVv6PJd^^:Orr9IF,FM_I:3!7wo>u| e$Y\CME_vXy颭\d7ɉ3 >F~5t RPx:u o)K3`syPT^R;2aMH]!o/lpíUR6w$)N­zБ."-pC.=v6DT)x a4pUxpUi$ܦ O) עMh&RlJWkJ-Ӕ^mѦm" ׶Lrv>P6Aot܋ .$\Hp!B… .$\Hp .$\Hp!B… .$\Hp W $\Hp!B… .$\Hp!B%\Hp!B… .$\Hp!B…Kp!B… .$\Hp!si* eYmhhhPH-G,R6ҀH$ kooW6Ҁ`0c bJGjF[gg?y3JIjkmm}:fΝH$ܬ(Pf j|o޼3&5yz[ZZ^'m'ݭX[] Z[n̞=#G,AfDʕ+}V aÆnK=ZWW}e˖>7.mp8|2MsҥKi7=zџ}ٳmmm3N͋-P ՉZ]]ݻ>x/=z^:0 e3yW6mz=wU~5TTTܽv㝝Z%)pzO͚5gS5x*?|饗zLT۷,Xp0??vʧ-^m۶i8LӴvYjՑ'ǻy0=V[[{݊+YYZ_K(04662IQXZZ.[_TTz2 CoNp8 Ѿ`WWWkǩSNODlAIENDB`kraft-1.2.2/src/pics/README.icons000066400000000000000000000001211467704360200163450ustar00rootroot00000000000000Tabler icons MIT licensed icons from https://iconify.design/icon-sets/tabler/ kraft-1.2.2/src/pics/custom-icons/000077500000000000000000000000001467704360200170045ustar00rootroot00000000000000kraft-1.2.2/src/pics/custom-icons/archive.svg000066400000000000000000000006741467704360200211550ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/arrow-bar-to-left.svg000066400000000000000000000003541467704360200227730ustar00rootroot00000000000000kraft-1.2.2/src/pics/custom-icons/arrow-down.svg000066400000000000000000000006441467704360200216300ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/arrow-move-right.svg000066400000000000000000000006251467704360200227410ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/arrow-narrow-left.svg000066400000000000000000000006471467704360200231240ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/arrow-ramp-right.svg000066400000000000000000000007021467704360200227260ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/arrow-up.svg000066400000000000000000000006401467704360200213010ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/arrows-up-down.svg000066400000000000000000000006741467704360200224400ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/atom.svg000066400000000000000000000010721467704360200204650ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/book.svg000066400000000000000000000007741467704360200204670ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/calculator.svg000066400000000000000000000012351467704360200216570ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/cash-banknote.svg000066400000000000000000000007321467704360200222440ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/check.svg000066400000000000000000000005001467704360200205750ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/circle-0.svg000066400000000000000000000005771467704360200211340ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/circle-half-2.svg000066400000000000000000000006731467704360200220430ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/coin.svg000066400000000000000000000006711467704360200204610ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/copy.svg000066400000000000000000000006401467704360200204770ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/cut.svg000066400000000000000000000007011467704360200203160ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/device-floppy.svg000066400000000000000000000007111467704360200222720ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/dice.svg000066400000000000000000000011001467704360200204210ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/edit.svg000066400000000000000000000007301467704360200204520ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/extract.pl000077500000000000000000000011531467704360200210160ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; use LWP::Simple; # extract icons foreach my $line ( ) { chomp( $line ); # ![arrow-down](https://tabler-icons.io/static/tabler-icons/icons/arrow-down.svg) arrow-down| Down | prefswages.cpp | if ( $line =~ /\((.*)\)/ ) { my $url = $1; my @parts = split('/', $url); my $file = $parts[-1]; if ( $file =~ /.svg$/ ) { # print "$file -> $url\n"; print "custom-icons/$file\n"; } } # to download all files, remove comment from next line: # getstore($url, $file); } kraft-1.2.2/src/pics/custom-icons/eye.svg000066400000000000000000000006551467704360200203150ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/file-chart.svg000066400000000000000000000007371467704360200215520ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/file-description.svg000066400000000000000000000007261467704360200227720ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/file-export.svg000066400000000000000000000006531467704360200217670ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/file-plus.svg000066400000000000000000000007661467704360200214360ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/file-x.svg000066400000000000000000000007021467704360200207100ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/files.svg000066400000000000000000000007521467704360200206330ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/flag.svg000066400000000000000000000007221467704360200204370ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/help.svg000066400000000000000000000006611467704360200204600ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/id-badge-2.svg000066400000000000000000000010071467704360200213160ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/kraft-simple.svg000066400000000000000000005246021467704360200221340ustar00rootroot00000000000000 image/svg+xml kraft-1.2.2/src/pics/custom-icons/language.svg000066400000000000000000000007231467704360200213120ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/list.md000066400000000000000000000137531467704360200203120ustar00rootroot00000000000000| ![plus](https://tabler-icons.io/static/tabler-icons/icons/plus.svg) plus | Add | prefsdialog.cpp, prefsunits.cpp, prefswages.cpp | | ![arrow-down](https://tabler-icons.io/static/tabler-icons/icons/arrow-down.svg) arrow-down| Down | prefswages.cpp | | ![pencil](https://tabler-icons.io/static/tabler-icons/icons/pencil.svg) pencil| Edit | prefsunits.cpp, prefswages.cpp | | ![X](https://tabler-icons.io/static/tabler-icons/icons/x.svg) X| Remove | prefsdialog.cpp, prefsunits.cpp, prefswages.cpp | | ![receipt-tax](https://tabler-icons.io/static/tabler-icons/icons/receipt-tax.svg) receipt-tax| Taxes | prefsdialog.cpp | | ![atom](https://tabler-icons.io/static/tabler-icons/icons/atom.svg) atom| Units | prefsdialog.cpp | | ![arrow-up](https://tabler-icons.io/static/tabler-icons/icons/arrow-up.svg) arrow-up| Up | prefswages.cpp | | ![cash-banknote](https://tabler-icons.io/static/tabler-icons/icons/cash-banknote.svg) cash-banknote | Wages | prefsdialog.cpp | | ![calculator](https://tabler-icons.io/static/tabler-icons/icons/calculator.svg) calculator | accessories-calculator | templkataloglistview.cpp | | ![logout](https://tabler-icons.io/static/tabler-icons/icons/logout.svg) logout | application-exit | portal.cpp | | ![arrow-down](https://tabler-icons.io/static/tabler-icons/icons/arrow-down.svg) arrow-down| arrow-down | positionviewwidget.cpp | | ![arrow-up](https://tabler-icons.io/static/tabler-icons/icons/arrow-up.svg) arrow-up| arrow-up | positionviewwidget.cpp | | ![check](https://tabler-icons.io/static/tabler-icons/icons/check.svg) check | checkmark | prefsdialog.cpp | | ![arrows-up-down](https://tabler-icons.io/static/tabler-icons/icons/arrows-up-down.svg) arrows-up-down| configure | positionviewwidget.cpp | | ![file-x](https://tabler-icons.io/static/tabler-icons/icons/file-x.svg) file-x| document-delete | katalogview.cpp | | ![edit](https://tabler-icons.io/static/tabler-icons/icons/edit.svg) edit| document-edit | doctypeedit.cpp, flostempldialog.cpp, katalogview.cpp, portal.cpp | | ![file-export](https://tabler-icons.io/static/tabler-icons/icons/file-export.svg) file-export| document-export | portal.cpp | | ![file-plus](https://tabler-icons.io/static/tabler-icons/icons/file-plus.svg) file-plus| document-new | docassistant.cpp, katalogview.cpp, portal.cpp | | ![template](https://tabler-icons.io/static/tabler-icons/icons/template.svg) template| document-new-from-template | portal.cpp | | ![eye](https://tabler-icons.io/static/tabler-icons/icons/eye.svg) eye| document-preview | portal.cpp | | ![printer](https://tabler-icons.io/static/tabler-icons/icons/printer.svg) printer| document-print | portal.cpp | | ![edit](https://tabler-icons.io/static/tabler-icons/icons/edit.svg) edit| document-properties | docassistant.cpp | | ![copy](https://tabler-icons.io/static/tabler-icons/icons/copy.svg) copy | edit-copy | portal.cpp, prefsdialog.cpp | | ![cut](https://tabler-icons.io/static/tabler-icons/icons/cut.svg) cut| edit-cut | portal.cpp | | ![minus](https://tabler-icons.io/static/tabler-icons/icons/minus.svg)| edit-delete | docassistant.cpp, positionviewwidget.cpp | | ![transfer-in](https://tabler-icons.io/static/tabler-icons/icons/transfer-in.svg)transfer-in| edit-paste | portal.cpp | | use lock| encrypted | positionviewwidget.cpp | | ![archive](https://tabler-icons.io/static/tabler-icons/icons/archive.svg) archive| file-library-symbolic | portal.cpp | | ![file-plus](https://tabler-icons.io/static/tabler-icons/icons/file-plus.svg) file-plus| filenew | positionviewwidget.cpp | | ![flag](https://tabler-icons.io/static/tabler-icons/icons/flag.svg) flag| flag | positionviewwidget.cpp | | ![edit](https://tabler-icons.io/static/tabler-icons/icons/edit.svg) edit| folder-documents | katalogview.cpp, prefsdialog.cpp | | ![arrow-narrow-left](https://tabler-icons.io/static/tabler-icons/icons/arrow-narrow-left.svg) arrow-narrow-left| go-previous | docassistant.cpp, textselection.cpp | | ![help](https://tabler-icons.io/static/tabler-icons/icons/help.svg) help | help-about | portal.cpp | | ![arrow-ramp-right](https://tabler-icons.io/static/tabler-icons/icons/arrow-ramp-right.svg) arrow-ramp-right| kraft_alternative | positionviewwidget.cpp | | ![arrow-move-right](https://tabler-icons.io/static/tabler-icons/icons/arrow-move-right.svg) arrow-move-right| kraft_demand | positionviewwidget.cpp | | ![coin](https://tabler-icons.io/static/tabler-icons/icons/coin.svg) coin| kraft_fulltax | kraftview.cpp, positionviewwidget.cpp | | ![circle-0](https://tabler-icons.io/static/tabler-icons/icons/circle-0.svg) circle-0| kraft_notax | kraftview.cpp, positionviewwidget.cpp | | ![circle-half-2](https://tabler-icons.io/static/tabler-icons/icons/circle-half-2.svg) circle-half-2| kraft_redtax | kraftview.cpp, positionviewwidget.cpp | | ![dice](https://tabler-icons.io/static/tabler-icons/icons/dice.svg) dice | kraftdice | templkataloglistview.cpp | | plus (see add)| list-add | doctypeedit.cpp, flostempldialog.cpp, numbercycledialog.cpp | | minus (see remove)| list-remove | doctypeedit.cpp, flostempldialog.cpp, numbercycledialog.cpp | | ![mail-forward](https://tabler-icons.io/static/tabler-icons/icons/mail-forward.svg) mail-forward| mail-forward | portal.cpp | | ![lock](https://tabler-icons.io/static/tabler-icons/icons/lock.svg) locked| object-locked | positionviewwidget.cpp | | ![lock-open](https://tabler-icons.io/static/tabler-icons/icons/lock-open.svg) lock-open| object-unlocked | positionviewwidget.cpp | | ![language](https://tabler-icons.io/static/tabler-icons/icons/language.svg) language| preferences-desktop-locale | kraftdocheaderedit.cpp | | ![device-floppy](https://tabler-icons.io/static/tabler-icons/icons/device-floppy.svg) device-floppy| quickopen-file | doctypeedit.cpp, prefsdialog.cpp | | ![minus](https://tabler-icons.io/static/tabler-icons/icons/minus.svg) minus| remove | positionviewwidget.cpp | |![settings](https://tabler-icons.io/static/tabler-icons/icons/settings.svg) settings| settings-configure | portal.cpp | |![user-identiy](https://tabler-icons.io/static/tabler-icons/icons/id-badge-2.svg) id-badge-2 | user-identity | prefsdialog.cpp | kraft-1.2.2/src/pics/custom-icons/lock-open.svg000066400000000000000000000006431467704360200214170ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/lock.svg000066400000000000000000000006401467704360200204550ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/logout.svg000066400000000000000000000006471467704360200210450ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/mail-forward.svg000066400000000000000000000007141467704360200221130ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/minus.svg000066400000000000000000000005121467704360200206560ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/pencil.svg000066400000000000000000000006261467704360200210030ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/plus.svg000066400000000000000000000005631467704360200205140ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/printer.svg000066400000000000000000000007621467704360200212150ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/receipt-tax.svg000066400000000000000000000010421467704360200217470ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/settings.svg000066400000000000000000000015411467704360200213660ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/template.svg000066400000000000000000000010141467704360200213340ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/tool.svg000066400000000000000000000006021467704360200205000ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/transfer-in.svg000066400000000000000000000006071467704360200217600ustar00rootroot00000000000000 kraft-1.2.2/src/pics/custom-icons/x.svg000066400000000000000000000005561467704360200200020ustar00rootroot00000000000000 kraft-1.2.2/src/pics/kraft.qrc000066400000000000000000000046371467704360200162110ustar00rootroot00000000000000 Calendar_page.png postit.png kraft_customer.png custom-icons/plus.svg custom-icons/arrow-down.svg custom-icons/arrow-bar-to-left.svg custom-icons/pencil.svg custom-icons/x.svg custom-icons/receipt-tax.svg custom-icons/atom.svg custom-icons/arrow-up.svg custom-icons/cash-banknote.svg custom-icons/calculator.svg custom-icons/logout.svg custom-icons/arrow-down.svg custom-icons/arrow-up.svg custom-icons/check.svg custom-icons/arrows-up-down.svg custom-icons/file-x.svg custom-icons/edit.svg custom-icons/file-export.svg custom-icons/file-plus.svg custom-icons/template.svg custom-icons/eye.svg custom-icons/printer.svg custom-icons/edit.svg custom-icons/copy.svg custom-icons/cut.svg custom-icons/minus.svg custom-icons/transfer-in.svg custom-icons/archive.svg custom-icons/file-plus.svg custom-icons/flag.svg custom-icons/edit.svg custom-icons/arrow-narrow-left.svg custom-icons/help.svg custom-icons/arrow-ramp-right.svg custom-icons/arrow-move-right.svg custom-icons/coin.svg custom-icons/circle-0.svg custom-icons/circle-half-2.svg custom-icons/dice.svg custom-icons/mail-forward.svg custom-icons/lock.svg custom-icons/lock-open.svg custom-icons/language.svg custom-icons/device-floppy.svg custom-icons/minus.svg custom-icons/settings.svg custom-icons/id-badge-2.svg custom-icons/book.svg custom-icons/files.svg custom-icons/kraft-simple.svg custom-icons/file-description.svg custom-icons/file-chart.svg custom-icons/tool.svg kraft-1.2.2/src/pics/kraft_customer.png000066400000000000000000000114401467704360200201170ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxZi]Y~wx;;N8iRph46 TЖPAS "AT@-E~T]( ޔiK8x6sG 1f sMpw<ව ꋏc~]` ю8QSuyh=R[=3`;6LY< W3 }<<_4d, ~?e^!]hi;2Fɑ4Lv729/֔,{a<'{;l+dz}:sdǂ0XVV+ô_mdO XӴˤ]-)3U`Q?+eOM^4%@7ip9<ݹGN{_ ĽKjٖ-"K;ô]:!ycFXyGEᑇnŁr o=VTݿ^z= ɛb$ftc?:d7l?sMC?KLDy׆\HBE(v:]ty;?{|6[q YSs]سK.Y• j6i92ꦇ=b lu+*dLF-TDwA:9TVѢ#ׁ{M bdD8_ysWuA\^lm9T6T6^=҉/:4OV{Ư i Aԏ&2@u XFͶD9 sþad6q~zuJIE# dFرs|R Kg:_AU& l07%Kz}|\]vhP0 oFʏ"td_;KK l7>V*-,5 窛ݡ8Jwt ˎ򐉁9Cm:)^zfBρ/kvM`6,ǁC5<ze(+ aY$2ܨ t]3:EL2K}epw+z>1NAo9t V]?ҷ/4;v abba26p@ NEq8y-7XD1Z (3AR ڍv>|^$F$6L]3{ʥ܁ geF th"y!f*X}w '=YXvqۑ]8zx'cn`!ɖn (-~$>U7K*hWMJmt5 e rb)9X 'jBR*#v,^qxiEJؐfK8VEx,J l.r Ik$mIB֙UmCϹkdߊ$8 y4  :B ZBu ( NT7XW]U 0`|8b0 U3f4 J[v|C{K)0(ӑ׽M1q1o,/1384sIKx)Y&>9<p| ftזt |Hō(1.,n/ [~tjT^^ax8԰uOWuF'عmxj~gq2;i:mvhA&>c<с\.3e0dK5 WdND,k}F?YF[N%CFet#)5|?jy5U 3K8 4:8h1CN_Bg=U<9d{x<5F,t{L6sbe"u`3ņsnFWc"vSp9#) n–ϠRbtg|Wkx1ߦ,a{"e%ք\L=V*f9Q9hӡ@#e gbqE|6-ߏ*f)|I+'!f$Rwގѹ#_{fm]3BkVkr54dRgFulx!x<[^_|_Bg #Mv-d9 RpJ4 =q\=C]{|-1G cR0Xkx2W~X Y\xMЉ<(a,[}oib03zTC”c2"wrɏ@E+D(g#2?s;8kP퀑v8#C>!Cٗ x A~/$9fh}YKae*2c *i! ~< \3~K}yTIĖ7?73ͫ/)l qLOa3į+QŽq%(Ρ,Xܨh$Xo'oY:y`M7+w,Nݍ0nB7Iﻟ`xI5'$^{9ŻIB/TqH&MsIL|s0 34ʵDqWQaYCXrz_1>gkfQL$0_G'7XFpMXWq.t}{OlYC1ìW;ǵlN89JaR* &GʸkrÅTrTƔSrHt,,.+Qcj$*a/=S.h=p>8)n,CF ohቸĕ_۞$ ö09>ZRer$\2+MsjVP6Ռ"QGQB |ȽX;x/^\_?}_C @/lp\/:fH9Rh4=>Dof⻭\QJ>5YYp]qF1iI Ѧ9 LyeҒ I$~Ze<<6!$NHH7T$F"L% <`&'$S7r-5ic;K"QP+xK[mjI$,xRݓj2x D}A&b]b qh<hG A3DyME?z],bHL !wv$-(Lx=Q-aj֦:{Gл6>RCD9q3fRž4yD Wg{&۝q$5~7WE^V7HG_Qճ-beOo,t,JZKk-it=xtSuA4g c {O_Z+FD;ݒ+YMo]][mf;.SE|@E[2HhEH"wVd$ GIK1իu]{ĺT&x#Qa-U/peYyB^ȴ;pzSW>0D`;@0cYdSR#&ힰMJ->SoE| 0ۉ%mϏ~/G|2S7L-+EO32ENm2$-HcV%V4A8J]Cz?s?|pZ3:arxI/$p#K P·3 F8`&-!eDUE%tk><}/3o` V7nIENDB`kraft-1.2.2/src/pics/kraftapp_logo.png000066400000000000000000000062041467704360200177210ustar00rootroot00000000000000PNG  IHDR@@iqsRGBbKGD pHYs  tIME^H?tEXtCommentCreated with GIMPW IDATxkpuww |ShZX(Hd\MH6VWL>H'mY~LM'i&Nfq?$r+GIc%N슖&)E@I{o>HHb]Clr`yPqOJ9|M5Kh[;ZVr=P[W77R&&xz˗bסEiDb<l@<g@ >W(\J$C5lyr+^16=ѦS4>R}Cog^dڵ77 e&V5t|oU`ddN s^?:a}'GċPr9}H)o>xNNb&uTL;s؝_H*d&p@:n &I~ =84c Mry&3'lwWU(< Hǁ2+@~7dFl}76oE }6O4pEo!xEui-۶{}!c9ܳr R(nS{o%\G/( lJ}} q߶󶓡c%hqiB'Xĺu|rNP^^N(9x9۲ _NJN~r?ՑBm-[f鲥({~IS+¬ctttqv8~SW%oҵ4fymΝ=GyE_qֶSYYoAeDЃ򋟒,r%E_W4~?b}!;h Ho>;!>vno9S_rPB(Er|mo*(Z!/\=d D+[Zu#_~s^hR +c01m `vJ?mp ]{_!ɿ{,]zmo^&Q(4]DZmc9bT4|*- 5՗Lww7={8\䁝s^楃.HGbgljLM!XI\tcG5qe5uFk[[n~kw羚)[4 ߏmYdLgܕҹȂ奎M/J2XS8 pر<,>z8Jxk#lfӖb1zg0:?ৱ7o!HP@DzBJLMʲ.F}Сe˖ " jjjĽ?=X aMsKneuR*$40<$JMrYJ'@@ȥl݃W_0. e)A:B*oV^@扡0ժkaq>+C8qD:uV:mD%Ɉn@*ہ*ځҒR7 g `0Hee(D:ҽLxvM)1SO aRTn\^QN"=t]婒 xɒw'#lF}?s.&^)GV$rr9_So/N^Tmo@09C+p0@'%~q+oO,[`yPB|6SǞxu5WJRU9zJjcZB8[)++ˍ=pL&lG;;m@X: χǀ?0TG"˲XR (˲{׆%qF.^$JJ'p*!%H۶IML*XabXNk޾d"LMM ,]lln"$9ũHH? TUWں:oں:}N06y`y>G˔IENDB`kraft-1.2.2/src/pics/postit.png000066400000000000000000001746521467704360200164300ustar00rootroot00000000000000PNG  IHDRwzTXtRaw profile type exifxڥk$7r:O3@Y8,$p?}_=\^s7| χ"o%V|/wؾ7F)|nw(޹f\sZ~~d,5GoV;?賱o[MF~~.)kLYF wb o#dLwoKn7?, a _ϿbY?h~[t{w|V7re%p c?t4e헟YHoa b9h|qW׈E+)YFwj~Ļ^Kx~En`߹WKB>=PˈHM-oo`!,o ~~%[:q]'ǂ5PޅɄD| h![L9N"JIƜR%6$v|»6y$%U)5 VXn`hTr)+2jّaZKX5fFK-jZoǞ`IzcpȣwfiYf6s,*.[m5viǻnm=N8@SܩN; n[v?Q/R~Ew> (fD,@MQ1-9HV$bR>!~jq7rNF͝EԶzd'ߟ6Ιwƺ]<~4L?nlOW dD;9sm[(+po W\✽^k_ i'4kjU9r+)1vet[ŵ*߉Jl᱀>uI6W v5ѹC0ۿ@kr$")Ov,FZH˚=rĻ@.rjִ xH^.S 4]|om۝=ȪcX㦱Н_A[ֽ(m_g2qޜU*Iqn n/βv ] Rmtݛ?a1v5S㚿0k5J|,Y iG'Ci@ |-  iV'XjsL$h6k,b$|kc&i6zT$Mnzs"4!zvy<(@4أ2 ;V]Y0Xly)Xx3KA>P&ea!3/ lf{-A>;S ^MlT7֟Ǔ&P$ku|Xz*-[pւ8VG63TW̨e;W{`Wwu@=یLzuU22g`cT 4С T׋r MԈvW:AX5y9Jm}2#ѱEy@F+ Vר-%e˩iHQȠy甎ʽRި2%)sڏ#76GQ-?QXZcF& [G9h5  ua)A7:oy8v2mD>v ʟb v qha&J*a` ۃaVe dZۜ?edaƒJbSw# 5N&BVlٛ?6]*Y+mHbIj-Po ۡ)%Ejl6-BsȌvXҦ\9)+RH6Q^H9TBZ[ JP0vAkb<3) / EұsU GTy"*T6?2]#vd@%r ᅶZ5^ą (6JG ʼ=A_^%vjN juL@a!#y=ɴZKL%RaX#qxH2%]d}E {o(ý*k?5coɞTE> ؙAGi(.T"tN_LD6.'xYp2؄kb'Mìƻ ^Ml.5}gK-Ӻ8  R+B/Qcd~%rE`weEvGX옋z%%:d I 㛑⺈ %x_Bx4sRTvP#)AEzQ@H d8ZSU)S+j6)Q̅;A}¡R3L`=b맬w}Hz"4P1ddjMƅJ[EzDg C9"0p+gq2xxcj na!(#ےJvn;V ?ڔHl T* _""gXԡ'B%8xP(ViH+ad0kPaz`X'Al9P Q"͍3 $P" 8ROwdQ@VȎԇp$5.BI4>@2"}RBmc̽QF>rfrBhf *{PГj&RHadO%~ M$ 858^S)UI yT/G3mL87V׌M, <)J0aH+x}i} lp )tGVPN-˛Uj`qS2TŶ,J`)f|xzFWt)Yi#PU=ETk[$ #aZ':/R6,\ant$EY?8= l2&jp{ n햺9צ.Ύ*cA2#oE!V*~(K-2~CEׁ*Ձ#仡:jtиPLU%ߺvj.M h(5nEC1cLu[y6 ,~SGF FdM4`Fʛ$ ˬQ,p.pa&;]`P{jBZpm)CYE(1ɹ'<0꧲͊:1Zd5*Bd L#N9 &\EDƄif|4jaVaح-mqU ‡ww:;/7Pũ;D)܃xua(NZ 9+i2`&!PPW @&Fы.Ң$"p,듗ڛԳj~#:6$7a隝Eo,?jH@A=(a똅O8lfA\қd7Cc^sRWW>{0$cSAYY?gLNǪRѧ棗|`aк+|YAB.-h1i\tv&:mG<"wEߒwz@Bi po23݊yFwKa E|p̝R=p;E37(eؓ𴴅 dK :( wȀo@.!sw pLoұOc8>%{tG1"PpKk7 VF- cuȣ<jPdO"$Mm2&!RZlTQdWt ^W)IB>U *<@}0hsª Vَ\ʲtN@٭;qPLPdyED(i"8*sوuAV=KU9ԥtQjvz%'PeH:עAlw :ȑԬXa 8Sׄ‚E~w;lܖ,l8 `<')׮D5G2"Hyc7 j!DRI#:}_t[{j<VDL=:Gpnz"JXǹPºfp}pC9~^Uq? %KMcxK3*zʸt{n(dR U^qR>^Ǟr7EߢD`n Ǫ݉mtsuٮ8HYA8rI9mSpԀm PDOb,đCuqt^JO,cK!t$FUp<.*M+c2O?wHz"R,l6AV,u)t)q \Йzv' ]H#8ʥb ׊w,?MXJ \A^I&ZJ4{8._;|6HsQ=)RMz>}[K_* aAOǂH)?BKXo0%VT[0\6l[Mu0P;Z,c0_~ZBg8aA^\m Mpu czԤx$ң088܅([7bl/Nd! PƔE :2}7:n #%u<:nz]ב L+ BQr66w/=6"6Ÿ$5O5)𾂚:" @oQbId+КK'Oc6tACԙBrWL:15v|YbĨf Q3Hyw +OCՊB_DJ밖0j8HlL8<_}^ͦmwݫ^Eg%FMUVcĎcX0XC=KFǘM@1Z1KPS@d{,nL[ЖAz>`@-悉fܞ!ϕ&tPl7@҅ ;F>CwoVK@R Xs~Be7H^ujrzy>:{*Zuu{xȱ-g"{B$)&)jufSHIO:UNY Q'cݺmVԝD\:-BW츍 *1`iPy6$ ﭸT$nTd ĤHM]tyP`(JdI%Eg]#l1EL@n2 ߯4JQHG׹+ѰluW"JG iEVR!mԋ#GCXk#9׉TvF,G.^.z0ϳHr%zf([i Xi@=xʛbYO|N߳@r̦g(H?x;r}}N'9M+i+@/5o3Ȍ43nzStp]3 Fx$v NQ|PvL}[k?17 .y>z"ğ'B NtNԑ=co'Iɀ"U{Uz4Xx[%%8٦fFTNaL٫Cŵ_] 68sӂNӳ\w/^L!!$;:dc$P \> jj,٨tt_捍Ev=Qӈo=^2鑥к\V#ANPS`xĀřq _ ĕw*DXuDPJV*ǜFð؛[zj Xu%W86Qx* w66|YMAJ{StO~8!/Ek%1EI(-x+W=osԎC@1]=J`ꑲWqHa|9g5BVP.Z/*BQfJgiCCPICC profilex}=H@_S* ␡:YMP Vh/hҐ8 ?.κ: "ƃ~{2Ӭ1@m3c,cN_.Ƴ9ԜŀH< & ڴ VUsQ.Hu71өyXhcYԈ'SXY+WYuCH`K BA%a#FN}_"B9Pnĸ/1 t|;N>Wz_ӟZZo-M.w'C6eW y) k^o}>i*y#^yww{oiHr_sbKGD pHYs  tIME ;+ tEXtCommentCreated with GIMPW IDATx]%Wv[kWѷoM45hFZDz1a@@V;8yJd#J?x`'?DrxF 5 )rfvqN+{]lΌ"sԩSZl{=۞m϶g۳l{=۞m϶g۳l{=۞m϶g۳l{=۞m϶g۳l{=۞m϶g۳l7cwQ/k_W^E^x^OWyuI_?-wxw 㾿H_^^}^Ç^/w. /LO_|i}yon͍.Ƚ_n|y`۾ 6(pmpm0^ o߆v{r7/aGG9"px Vpq=w:_b;ȷ'o?p?"2;ֻlWw<>k58>xq͗+ ^{{ا_ ݹܻGux}~"&{~g1Ly Wi^8>F~=k/Ge_ϣ+j!}Rcw}' מo䧁7\Bo>~sK糐mv#;}!vx=L{y .b9pvɊK{7/#p,_ǍQ;)R,^&+.hؕ=d;F9=ؿԒV~嘏+ ia22?VN?mkpxE>n"'.Kqmv>uxw [iۏ{]G؍F̎Az6[)ބ2ͽ/x^}5r.k_Ww13^qO4կb7ncd˖7dX$k_xBlZ7O f~8:7>X~'|]p"12g| gf(I+x+̐<<7G}x|m~zr{ ·ߛ/ޱ[=ӹDp݃}dO<^üW.s-OG_ǮAre9\SO\.rt4 N0@帇G٥޴>Vs>%=^vwyyߏܨء_"@!rr {G;•|s͑ iz3CZMdyDC8ҽ ж.p6 *2WDSWd&6yх^ * B;#HBB#hRT#FH6B@ѐ4A$' !A ̾&&?Y{o{Klo;<_'2Qy N ] =^.T@Ӈ0'kA7!-;ʖ gcyy+rEvΑهq=0 {d(,wk/ .WOgA={w ]{[#]{?spi;"]`ݩٲL~O`}ζf!b'7a9Cmrg+xzz9C?+ B\}ЦGn@XZ aih\m& -BD\U XbI(Y=O(44 !!.VB Y~%#Z5?u}ئD5UH xف>r%_!۶o~nvOOclwv/z#ǕU({$[i9|-z_z+[A+niv춴ݙ fF[ҮlYwfA%X F@"j |&HL; gFЄE HJhHpJ $!BZeK-kTG[+T1!tkJKL12'F?ANjv6d^z݂W%KcSa7hZ}Rk-}L8n"Ӎ?)|!;d'+н]і/ݒX"g]-НeEP\!=r1qAkUo<ky}!Ƶkn۝ʭ[hzPCΐkW}@9CCU9AcUU""mඃ~ܾGAZEdc(Hb- =$$ &ɟ F א? ۰}O"s(W1g̉"kbY^-$E-+q~Q\IĕD,[yLѹdb?+6=Jъu`U`(_[qͺciE)c6$YBQaiDs5#}'7oYYm`рs6zǎ'pm>sgaڟ38;> &cZ ǀ,d܊}! V;_cE/=4ѹ9\6 C5M|("!ҴYD](ٝLh -[Jrܬ1$%̄ !qxz k\ 㡋Uڭ!A1 <7N)y`؟kK?sAz)#w;Yb%HK4AHA$!?%40KVaI=\,P)G +VkbmL@rbQI* EYj8n*$qQ>y% ,y3G}]"=;+|4|׮KDvN jiWY\.6=7n̮oh+2 ZF#2AH(]FS: J-M!d!j ӆ f*"HRU4B(h#H %4A/XU, 0R0 )V#Ը E^酪RW:h}!HTg9k[?9`yx;:&.'o+g(|6tfQĕqQ[P'v^mq'.|OES){'b% c* FE7Cc6R HX.wr~\=w/c7b2`]iJ =\g;!?\G_D>'/('${ aU8 >H |;/^ҋT)hi*;fjHE~]`*N`T@ɉkFc8BCyHfXF3/P |ېZs/2Rm1RlpF7}I!YTrXBJ@yÚIcpOMC?_F Ld1\|w_\޽{p1 oE, #t]jn&x RP^ X4&iD]$=fٺ&$h4@JeFj\I业-d'GnC$D_Q3QGmH]  b!G@_?C>vߡ=[s9>`S`$GT+n՟y8ԐC^E+>Y. D|dhk&01L*bNiB=񧲮bf[$xk:gxJ8f2ω &==`]S.y,c,~kir^r.ȓp !.>DV+t w~! >Qu$ih ěrJ^?V*UX\5B瞆 d/ylo<|JiTsPt!b!fPӌ Ϩ#yi:'Sp. 7?fG,4WmAyT>P{+8`5W5E+=#eP,q;.E3W߶#*H+$+S <9TJRe av&|_ue=O5 ~xqQ #i}#FDAzQÔGiMErI[@jh\0ј~~=ʻӰt1,yEih ԩS-Z~k1@6[cmrZW"FҘO _#H̠Ydysk`oC!BȨ4?sK gk" -/!I3$bӞ43=[?;(6VrE$;^i4,8ԥ65XhwdIeX5}[.l^@eT0lϿk`";ַwsmםݻ+._p*MOMxs,ȕ@P+BmR#TY-\3e&+SRtҘ-T]خ,6`[RTKYaLy3!HXc]p@#J6y$)DA[%x(Kf[GkD~O Ox~8/0~OϊҮ8sgܘ}כD"jiJTFe `q45nx%ÍMJʖ!FɎ h֛k3Ye(X*ףl9e|G‡?RB$:5$]Hi͏]Oѐ4jv'{ /@?yw` .&z%x-N旾~jUT\!`oxh2~=HJ9~>1DkjZAuQULs+{dSaCW$3\ '6aJUKQe KG>gfmܷN>\$%˃p=E'Gz6HEܹf9ҐhWipHkXzLUh^`BW~ɕA,^2 (MqKŸ kA gȒ[u BB'^)r1X.R<2ԝPe$2[\0*g+B3GΫ4@3t'㷡;z{̮say= ~Ra~_oCT!|g9#gDJ`ŀgSs I BYCvBWGpЈY:z-c@y*+ErF*3!Y!f&'D??S/ g-"ߏt{~Md{e8N"J h6ĉF6T(LT;N+UڷS'.LjEvX)~MdJ14+ +4pZZuwB Z Xj:pE3X֦ B* }l 7)+fm8pAw2395c'4p~G>ƎyO \'d]Ufl5G+_f_6 IDATWwxf٦V_4xL) aHIkJ J˶70].>-E*g/dcjţ-,~ iٷ^]slE׹; '34~-ȩ@)PI`Rf\kw N0Ju;`ע .Ua9%$\UrU9dXh"Ҍ!)9*#:~%(Ʉ T bu Vkf ZN~}?b ,B?lށ>=N %!%X"M3Ǿ?3t!Ƶ(k(U;x9бg(*в\܃+>m2edhu32dK=)5HS/ũ),`ֵR41ſ9'O]߄4~nQLe“Һ qfcX 2_Фi&TBK1YMDJ#UgIfdpQoFŕR&yR%*)hUZ?aдj@fu I")Bj31Mpֲ(H3Ag2U% zGwEy1x~Ye'~Gen|cXrq WYaĕ M1rIkVm;ރ8ƙʣz(4'BaDs+\3XEbHh3k3KNlX{Eu^hn $&5X+C$ #"_e%in8#Eԡre\aI,6rަ壏th[2%Ɋ3l[ת]2#%&ٚzKOK'F#WJO@urӬN+8Rv6c!z<^"uW/ƢN?YP^?fy;?zkw~iY>GpNcA @FRϭO󣭽{{߻~u=9'<^NG8Һ 0qL^aXo-@)GKM>3ZmSHP5W?g^"DŽ8TQ}c))R4{궪Ҫu7{1 =3ˈk ǯF$R;ݼ +^œ5Idr)$F,MG:y%5Z=긒9p^MM1w.1-> G<]2gQZhtZƁ)^i< E. Yi_9@yDT zm *8Gɮ4#b7H4F(*amצ\*u%~1&1]҅k?nhr6ÅdSm68IbĤtn~!SDa!ce4^%x0UEoC:9qoS4Ю#WhKڛ~W89e 4](@|>_%Ip)t]٭[4慰%(c'1kV͡ȳ0C˅d=a%roy|@a7iig!%9R1CQx3|a < VgJC+ 1aeb 0]E=7O >Q)(tȬjYoH RDZr3R%Ĺ$ҞM_En-SRRM̍tFRNj:I<ax̜WgqNxgGZkVI`-@r˫9'cMĊ Ib'Q;_ww'0nʒ4١Sh{t={D{!9m,LMc bN_ҔZ*' l&5=UTrŬ2N`Ć693cR?(д8cO_W9V0^WUsȎJwn}%i{7"/_E%]#Q{P rC\]NLږ"W)rU\R$dM u(vb;ٖ^-"d`Ӧ*VҐ4Ś\6rms3.&NR#4'LBin[bVa7q8H͜8MCJ54yZӇ[r9 iMnXI2bvwn_{~luNX5Mѭ=.%^CkYzI Z7-rƑPY-:+;H, %W66BnU]Bd{(I(O[)s :6WR*p#cɄ?sus#X^Cөf!2,kd9r|ucRgfڈ^:W ب-8BvShPG5ƊVU-[:[r!o^F%aÈܠTtԢdLju+efy`QWqos2{nIۂ jПv;9ϳs>sx>hB5a{KH`!m;XX\1T`Zaj^# U#%8:p7JvKb_tD#,cF!Qz] KO0z,@s6)C,]3|$I9GȬcSEB17g'%Za$A!7`0nqepw^H^|LF*fM}8jː'`SؚqN5{E2-t&DR vJ-re0(/b@ OP٦M2Ѕk`_ݧ?z}kf]OX).~2ߥJأm[J7$mF)dL| j)}Z:]*屹&Q22'n:,VewLOx{@qz7UrU VBU?CH>P cYN'=;c'wN+r["){U'h[BIjD*dǸR:YF YRR]F'+ u_Ћ QB:tb)3霏eo+2 sR=025$d=)c*<5Sّ!֧qz1kP9GV+,b O'ӨC @7mzBC_HsuL4y+%В < VBt Zɾm̼G$fYBÀ]gziٳk_%xE;ڑ:t˿(qJ7i@9 } d)lU^ 9Śo'rl&9H+'u@ϒ,.YprwXl06nZBW, Ah˲kX-g%222<,+.tHE8ZђtcV0a8FuB.rᔔR/K"rVk+caB\ic`U.$B BVռe5kY-|N auPP]l+22MHRW&lPl>qsb^B=|B'/I0F T&͞zaX*u4YmI ¯*`BhX,N{}sk[T1:&,^)qZJQdݨ%] %Jk1rB wRndW6 x>6ӐKo>+ 8F"tǨ*hԊx^;\øw82!͙AlE,5з-e6%c ԏMC z>c|gj>cX9mB\R%mׇU+B%౯U@;k[-CEwi@Eʡ҄4hwFrJ12G1u5g 0)ڔYn/pTl54${6g!w,Iy,N:o2U"Ѻ`=QK[keܠ\VP<G!JJUaTc6 W ѻu/hي DdViF`[= Esy$ZX0T0I qAܥpZo[cV3'ksf>+J!dBV;s9.9gق4˝٬mr9 I dc /d{18 (GlyJ٨̅KÇl7إcfxLc S|):Z#  c2%y$VV`q} M`Xq=庨@<|G kԑz{pk .G{||gw41qx#UvA;[Kֻ;Β|˜ !nD>zzZS )#$%0VeޞRJ(Ira.)NN&!$.buasÛ -TΆbiь=%&a p3:fK4H8C|x'y{qԨG|SxBHr1 k zRF'uK $<"ыi\*wU+nyuNsZnۑȊH쒷6lfX|&wOpvG{]u4JX2T 8k9rzd}enoz~w$.Ħ#l w͖hZ;g(\rٚ+ީL|TM1B('kٶL\B-VHY$z->Flt_{Skϣ޹MΪI./#3+ >3Bu3TOnI&\L;Q咂4#I7hD4HkQLJΰ:4`4Tvb !2Z7'*tbܤ[2y֮uZJơ(PW LK's%um۱wrv$hIq[МhV+5!h4TRŜ4_/; eKGܥח3|Fl[bNZ \N=Sӵuo %{kfគCBSSP;'cg-d~lmr~!2aZrF̤%ӒnIbXM Gy \s 9&dy9y߸|#1r͌sVFҭ sR_(]miجoxFemњ}92봔shZ5=֡pmB[qXlc^8\*[וBY)x]b;9AFYDZX'<@NL[9#f9i1?]syGքGq6Cf\a,|͡I*n &SdեY_sqר\q,*iBϘ!jhƾSzi3;kJ%u ;'X3UnC0$Hf 2ZHvwX` ހ/@]*v{r ,44Ly=!l?FpL)ZeOEޙekNC.BUB /ZbmF.k^8PoP},*3EC-u3 [4y! PCJa푚^;͍m3)̿´q,Wiqo^t g][n,~0&DZfE߆\6kHZ ]-ʽQa4y(otwV#'%xȖ9&3]"~UuGlz-UmGvEJBzhڱZBi@/ݐ;<ʵ4]󙏅s\GV~^)id}ڒ=aOŋyotR_g2j)ֹ eTo[[WQGNO)Qׇ6j,fTC9lΰqCqb71 )f6])dz+Xs!)^qI|<$lvS\ϭkr ֏MxF04^r/cٲT*7=>ϙTt)y-lMj:RI+̄)Yu|6r]̤&3͸%ZKe @1F> Uo&xُ.s+6^&&>m}3QJEh͑M|]CŔ̩buIF*G6E ldbY'GCEې2`>Oƙ6cKWsKc S$6њ5 _A#;y sjqj9tc[BE4Si^Ixw/d Bⱆϱ5GOw sw JfH^sc뵇%<v?(O 7nJ4#Vcq7ʐ9RpCz4L ѻFp„{VNRVKP=ymqh,c$o@[\$d&NRXSSKEQC0 X] $\e1tx:|*K&[ҜX`=Lf2Ve(9IXC!@e# bx"d {1S$+}6#~'B yߐ; xo?ܻrls0!}iǪpi!٘Bݤ8#4NC{h91V,topƧd >!U A CJX jJE>̖UGQ IS+vAX5;4z kWy|[%nF8yvYoEy4H7mbEF3"`uc=jcv IDAT_΄񢧘3Zt6ħܑr {E6mn$DH{r9z ϭ2{}^ 24U\=9 #6J̧%)FɌd3JJr е A:kx)=BK%1’o0 b 4PԂ+ 3z$mRWWS6 b!Sxc)=E?Cڜe UI0xXNwyaoOfV0_S;fWx>}s+eD\ԀXc 0NCib4gb_kZ#Fj{{ۓtz 5b6g(YefأG9$>X##^;i Uu3xETz?f&* j*.L)+ x6:7P#Sn|UX*]j!py6h5ePɭKq"6">#CD4Lzc7moX(툘B< S!iՂeH qئ8xc?Jb Sij+iVjHQ fm7r Fea X0TNp m4-q}iq^~cwƶȀ #^Un?)1nTF&c{er].& *͜R Eᇱ".a64}KOs }x~E&c&H eGږz p-VѸǻl͆%+33J&_}Bf#AaK]i^84ڊongU%lۯTu=./ O)+=N..fmd=&!AQO\6rqQ vyb` zY'OX#vVSvTӑFt2綗q7)bD+e/b9*i}b&n;͋F`xf G.`BJicaqB~ */d=$*W,PP< ;zF"fb Z^FO@7KFVVy%4@v1ǒX)%B+*rw҃UtN$̀ưx;McuxxB,}Dfd9ʯ,ZyvBXbnChC)^ aWn =}>"TYL;;؇]$c'%;#\+„Vԁ46)%QȆlݡea2M/Edelj5ze*Mlu+dh Ei:uϳ.PvAZ{;]^ ӔmBB mP*Ѡљ'{ CL"`i qM"CQpupqVOyM8>_MإkUf!CaL rznXN fn4L8,unq|o4qixU2:ܿOO՝A4,x &! ^f y=p keih^Ͻ,xMQT cjC4W Q=ґ<2 7-1m\hn˼ ODc 8hIÐvf$=,Ef#NW%-ac}M,UcJJ𞋬pJ`=\- %AUɮʏk^7<>8>& 뛘a~Ryxs`wcoDCǔ6ˎIo`Fpv6D mf"{ÌAu-q/w9 r<Ź2j{),dFJ1<ϴ]Naݺt;sy `4xOe߮z@T^(?T T,E'Q_*\va)30ߐS!K m(КQ\ti6<3 Y5 {n}joM߰u8Lf\{MSG3/%cI`L!!2 B[AQӍ7Uر' Ɠ BbIY9\'$X}9A,~R%,clBY@1v 4X"(y8Gi*g&)s=A/ E~w{f5)@Ng`}ޞ0IĻc2_D+cUnۙg|HrHϢ[k'.A9Os˵.ZD[f%TJ5Ќ=&= N/lqjΤ}v ԩ`:H1Ř]*WJ2ٲSr32{q21ajnM8ѣ^$ OMd(*es ܳwRP4qj4fP005='OqoܭkӟOqR)+V s􎖡R& 0:*֬Н)R8,#tZ|ήv#.уZ?M0ELvf5-1 뚨qtt;SmBQe&9+KSa)9) pu{_ | Q НxrLbp'J}e?p1yx茆e^IX>$Bؕؒr-C>; (ee:;v`(]5`q oȔAprϾ_ܨDWrnƵB-z`PX%ܶ ަ`iDq p^F:9bV5 p!N ߰4vO1Glyi7,HȩA-u9T~VYajՕ~5xߩ3^*MG|%E@qZn4b`Y-}2 alHJHC8Q0@ &\C=fN~ ߓot:BWd.@zBNK6Ej3g3E4 UPUI!:\e̽8ƽH0i#,)`ary(Zg漮nV6j(#e썰ĕC F+UɶDS19(,:q /М, $P5[Ur]SȘ @B =+ީQ=j@q>MgY1@,`)AH&*)s?M8+ ށ @o _A_*#N! ]1wG݃jqZf9pqgQݺ{8@.Ln:*՝}A|2\ YU͂wid8mXR~`4IMzg δXd^ޕbVS.c[ttt%o_G /t4Ij@q p>Stx\X:t6Kq@P݆`|8(a[fD  pkmT X!o'uu7DMz6_p7asUH\w]DC NބptƢX-Ƨ;L,"zK9fӰƚUV%,Ǚ8"@&gF 35t9Ļ|,~J0'go>9 Wo/^@5諯>~"z :ܷr\ w'䅡2G+{@3jp!/ ;d.7xc2eWH>"#CS^ (Sopƒ`=tY/{+lD(:M#Ύ7h12{K(Hy,H&SMzb.M<`Tٍq.3+ds,e>,E0(e ]ddo.>o|^.B-p0Av"\QͣQQNl, *3D Y{cqsl.Hv5Ȃg Zj]ha$M/"}ѴOgP.=\N)$}ޭ[V荑*N-QK,>:tJuO@.4'1C;H0z䷪M]$z.{N9ZM}0s֖ -؝P3OlYkr5lu>h_7\EKV9([#Ytu&4є{ ǤuG}ɹ:@Xo09 nӔ@344ՑvJD9;eT Li ՀϥC>Hb`񛪴4>˽X(omRW;@ {i #K^J@732$PؙN%VKPf\2(K&Ƕ6_ْɤY .n5Y-SMkiMЉz;7 x_V\\icTjLDq+jBj|]xGܷNF,e LIǨ {%Dn<|MZM90)tfDL/So: E~~ًb|!/\w[E# ? ,-9@]$-,(gxP"3ųOvT}Hwᅡzg߇UZtPuZJLe *i0\U%`9{1k,LY:~I>/j@-%z!p*{ I,=_ST>" E#ZV-FƔE97 P*ڮQ 6Z)NIиCVo]P4NCJqFj!Ujg#ɠF6YNN ; Ь Vlq &Ti0+]ExׯxF:]G߽%% v- tMz_R֓iK*$Y)X\jWZ@S|TꚚõ\5`}EU^E p,I”㺛0a -=X6ΖycE# j 4!jgR/=uii%jlj=jt3NQQoؒC %M\z!B ΂3)L:%tځ1#:x!ɨUM&?Ky]>S2{Sa x>ܺK.v tskx#]η;v_.+-,\cҜ:cy< /zmNv}מ5ŁCKAMsaOUa6xsvxsVɶ.ŚPB4t8ZO]g.ob#|- zC7n?=FzSw #uylAD ?{\#׿zUU~YogdE 8zW|41r<ʍi>A+܀Κ>"mocl#*p`5Hj^(:jX]pxu/`ocM RC&vrɲ5Pk'Q'*3tcۨ) B5(Za 'H6x2u(s]ŌՓV<WI9:f,N-˥ӅXv=: O0*m-R)1g`1i͋ȄTAԥO!wZ|Z™+h/LtOv;yTvGлW g_) 5ɬ(tiMsMjLs.O'vn]PN{W,NNf`)HC70*>J5m DVUö y Jjv5J }VJԥdʨJCCVL6@HPswn\d+KH(4=tR~8|t-OV>_'e񡀗9C:YFzqu(آ\;%]"-|A>]Ue)8\ն7N׮g_ Nf#s!nEMt&:5P!:1N$wA sFݷi7Y IDATwJ +Yf V K9;iDRuW+#9#!L~L%Q(jz ?B$7j>cf;])7kYI@Q I8x;Xbn:kL|E؂͔2r㒋U^8p)b yzB[JkE#њ%i&EQ,&zCgPKO 9RSG|nF9.}E/ಕl쀉tF+]SX:'E^Vp(쓠b%ɖa\aO,5u׃: 5g~:pe&;/맍kj́U+VX]N";DVqc@ xڃ*pl\WRvVGGXƓm{%ATpś~I˚{h|\,?[E2~-#["6m g89`.XA殏<8o{ښ=]"gg8G yahLL<5FO8؄N@i**?y;f#t+|3WVwwЇۂ/3Ep <=7GKz.)AqoYNgN`-qUc ^VmD@0B#ҏt)P ̓oZt)3`F"ƔX!"V/T0Xc3a| /@Or<қ=љ#t.Q{*b~Zμz9ܣ&;".qzxQ+)Ujkrp)s_Pr )cR|f~V#P;Eł`śs#[:pw?iG-O \ez|^BF,.XVnb7t5Ց;442hQ#,J#G"e{ F"0WZAK+~Vsool)s (8 ?[\iV9y\s\) < K+_}}ϵl^UXp}w=JBd.ʲPCj]pM4i73%JC?5Ui~Lh?%ƔT'l:fHbΕ,7֤gP7Hqv\n.l[؜Uɗxhǂ~"tyT;ɿ.KƂ<>7K׽HL?^In{6SR3b %KyJaLo!U7o^ʛ|%E7ӱs]tEGJƨWC }%=8 dXl4F"ϫٻ48p PoZuDwl-e# EcO- mmeE.fc|w`Gn%nD)Y>*I(TMEgX Jl]!p+!b{j.9^I'S7H|-Qt*]Ѡ&оWa`ż(}7|3\/ =BqUtTt i*n"a]*\bPo\;9Vsq/ELsr )?l&+"Zx2& keIA| F:vkEd ч~SKHkuma* y&KU0“};s;FA`n*%lWǒn+IܶWL<x׳KqN`g@@W %2n97%~0+ Zl"FbA":wPa? DCb^FӇ׸{n8A< dNj'1 K7Ʈ:P#ٓ TV#9]P|ی?/Պt iisDA 1?]fog,QW+avukIdCpڗftmn[߫>D6"C ȍpOeU>jDBjNÊ?eBu=6Fm1@9GQc^-MFحT&k jQu'5N4J) j\|2O90Kczҩ=w[AlIo.0!U3Pqd|{h'@w{\eoX+k\-"`}`dz`У‹m.!v!Ξrn@aofcKVjG-hG*2P"v߅_?Y ~T4!xmQHIdxëqIE7 g;Xْ\ 1s(Dk "4Cgj]FGրי8C~pߣ~vS]y Y,ܞGÒtK{}PUx+JZ3MhaNfBdPi^2U6eR20F+}1WL9\/iB:avşyC NFS9\hbҲyWchHHֶbq+gO؈/ z=La΂iϘ1M  &ULg9O)6&i1!U=L TSxr55פ5*;uKXl3pɱj0hnɏАcߢjY7V< CyXr8'ҩȟ _*3'bi5jac-cJG&mYl WPX 6I Fh)>j14O% v09Q%`%ɮdSxڟKcNHR|J (-!Ri :v-@9{[?_A+K_F/ ZRLZ6r]NҲ좒[ٟ>AwإXyp#j0mkA3g)AOE/gwt,(Yf\|ۀԑ$0%p2-.їbLRF I\s_},) %LMk":Sji1tf[sG/wjlAsOIWb~%t(e˴y}ņPnԢ%8V mҖ̰$Ediɂ5,2k=1xvgHNWȫh=e=d7AdҞk9zw. $zo~Ou,/U xֳLS>!ct}Py#OxW9?-V2E"Z|l~9.Z+"?Mc#9G*b}dƺ [Ȏp, 薹$-M(rrrcQG Jz.Lzlȇ6XB XC#tBOD:5$A&gV}1"$l2V ̸Td1-+¯I)D$ Cu+O1()K1*k2v{9$EL'$K{F4 /dj Vn#+VJAxNbω  K9 ID\x"Zr~QJa4D,Ao\q$[WeqqZlӵR"R˪%cO: HUgUƒ7}U>t -F'Hΐtem6S!(MWǵ[f6~Rڅ0Ԭ(ܤuIUZ< -y!U|2H;=)p*>v)'I#Xcp4NTgNgZTc@ uG#7H]h8FLut~iL ͨs-R@6 3cE(NZ`DUxqi{PeKEMHt]tU#igg_AP6e= n`dzgV8uV[rZThWw|_xRȲadN ,'zI41u5*1} ]t }pOus"UP@f81vA?=C C&ILv1kZ4M\_1%}[iR5=CLBM;n۫uG9<]H7`L|i{%ɮ%NsR:a/nܴ**բ>h5!YH͓q]qݜXZ23L]#j? )̍'6"׸#?'/o/|yyWD`iYBno)&Cԥ ύp_~$%ĊPKZƧv2ԍ6H%٠*SRgX}%X4@=CzXK2tW#ЦfY@;h w7V™Wukn7-QxRx}!,ْPvtT,Ţ  kn e$[k@8Esn|̈MK5;GCWKb[Ur^9ab&6=,=o 43Y'Y@\vVWoq_7m 5t.PP?G: oWdJ(!z)wțh~H LIcia̴{g/ K<Tk˞.e@%WK>n4pG_Tsz5c C\bW.FViN!(ukhࠀhN<&BY.CH"A8FWtRY)R-^1fn;|TP0p1Ю4!=4+Իs.@1@ r Ul ʩV3(z;Ay ޝhfܽcGwq`9+_E!x~W,|ͳ2Sxb9`YM6앸F?ЧN.`C gNLՌ#z]ҫ^4rۙm>x3Pm,B7awlͳ%^x9t.YBxE=WU1<bMd> ǺA<>*w `|0f<=\\0oom(5S(<[֬mUv&= 7UKn^TixB!ycHdK0v[EnjCbFl=A@Auex U};$gU1Zrxf{eMҪ4w%.܊Ϛ\U g9hE (:2h.]\nlfWox1j"};㒺^bd խ yuEe8 MډLKSMK+ n~D^=kuyׯ_v;ng }& ۇMp[9&t2+e<uM}΍Xz}dП3mGJdY#_#=Y)6 Kj#6]:r1h(b9 3 4A&)a-EUlG2vArCNvOPqz7T/bOyaDV',9# xYZ!w]+A)a} ?_Z30$0%4`KrXt mL⻡&%#fմ pZdz҉1x26fG C{FK.El4IRa@UXMY[$*Ì?FzA/+榼֗_XאY1rK2"nEҰ'U1G!Q܊N]%j"ZYKl>S6qĬVѫ8,\vc7Fa,bq&zUi%'%̳Klc6v$<%42'헐ӫp+\G-b*H^י_ t<8\md`U`9~(t|^}M,#%9?ݒK<XN y$x;H\N<3e\MjZxv {ms2ޣ l2]l] gu-V,h,Ә27"Z [w,o4+ywa %ֆvo:Ϊ`HU\NGSԙ8c [;x9B!lho9(kU>(S.E΀H=$ 8W8SDnλ>(5x7T%_LLEhYÌYx>#jCI۩RDlGc)1Rsn5LbY7ǨԂߐbW:j7SS}zwe.T`n9V]KN穃>@٨,ֽyW9  tdZ_4 lQyC%@|8 1ϴ) t`dLN85ؙ$~4͕: '8r,V5~/ _ tl+gSNJZ [ȳu6$ؔs2HLt 0-Lyw#: !$7d:LUY2e$RT2*<ͨs3p$m*AMݠ}HGb\u7H.zت RvԢA[Ǻbanxrl] p}L 4@/J$g]698zs (:8 [JWHeCE#UF4邎6fuzw\a)q1`%λ" .e+t|yW'0p~#P G1"0i kvC_d#$LvMTʺ402)ok|EƔl.Q LI4Fc$k:O/toJnVא#pxsVr*w%`^ sBesKi \A٩$kw54;q۫.MS<.r۾ڭaԣ/wBMZmfTd+ܝ&#ȋSKXB.UQG "0NS3s}Xl " +9, ll.\ 77s>Կz*Y&IBW:NoOZmM*@08Pu][?5QszA T<`HhdN3ϰ za[Kw卭0EͫbR͈ L1JF䇼归l&Jg&wBP4ؓ>IosBqJl&ܰ8AC9ӳnk©Lo}Mmu`s\d" - nob~/nn~-ps tBqURŴ*KYPLubε ?db&XfٗR'Aqݥ& V˾Ҋl'&5_>1cZn^v5ܻe  vhw -9;pw]F]ITg%Bв s'qKFb.WTu++[!WX2/*qKx߳$@V׆ xx..Žx&`̀)?j{,@T_߫Ujؒ}T+3JA!?iXFZukQzVWssgOp x݃ LA*׿ ߃eP6b).%~^!=uLXY|1)$`pR RHUB08h/Å#R䱏2TïngZI$T1bp`E27(grAZ4U ?Xnb5v2VT.HmN .T#vo:?{ρ'so1c諗@v\o_c& ^a$ɝul.敜 @tkdRBHsrx#Rأl"߿ K.'7KXy6Y8ss(PoDI?|tZLx wIbFHA8V/gE.Xw35b#( 4[$D.m(UjGR 3 91gyK(tP$Rj7fveiI\OWB&N"S'LnL {癹Mn^L_(+jk{MrGurL=Dh t-q,Q=+TQjWPEarZ؏?H 6ChHv`Y;˗|<>y⋷G_, Q,]ײ "O)W#[VϊU#dPMNԨQ +ќۺ"%{U-΁+%+.Y#oǬAAG9e)\gX̅+ǀ#ZlSQhp^RHrwI5ns2aĤ h.j*}Ъ%>q^*PJ""ǮF{󽒦* DHuC^OsON0hb(-v1z]q[ _CZ3ow|"KB R,O$WE)LՓܷp8|\o:G FB.`[bOhF>1(O&׾(Ώ| /ucK'X)3Hؤ|?z쳸or|_ϒ8p BEQU?wn&`l$:N2٩$@Sr .uO5l)2ytqn&' oOm|Ѭ`Y+#2!=[Rp ϿhOºSԍ@/O}_ z\ aƤZ,D Id w0D`Rq phP3^0[L^dV~6cוx25/hMƈ 07 JZ:Ywe X6/o 92bHs}RĠey)g,S,#P-#z C&e.~N.ٞԒ HfCsh|_igL UE KtW3`&dtK-QmErsyЬ쎶]2Tv,!5T4JQ\ZigBMUSXkahƠک2$ZBoNo@w\l]Og@܈c."vۦ{d OӐbm\eجvn30C=raREipk< =i~xzuapoKLr~mU3 LD}?>/glgB4 ZNl^މ˔eTPvJh R6sӑ41(MjW(:1˾6>a`_1'z495.O,BŻ#n~n$7?,4ˁL-;XBPfsQĮ$KGQl$95:%Ԩ"R Ԯvi{i= rGu~Qg8ڭvR|b``rEM$T=xQ z8O~c~`k7Coo_)9oo͖ iU߹S-IڑǞ y؛gh]FK.vbq"gK$d݇2VK{s>*ԽX{ie0~U *Y& yIk ?)aA+h}A񖽿"=䙹6'*!ά/{!HiT} wxtW5;ZI&YKP*Ql mG.'D\U}Ķ\U}%CLg^%/0ڋG\W7l5ҵGUeD;)X@g&x &樔7)w,E, V\Xqj]^Ϯ Y"9$NȶT켚tdmZ@ @g•辰q=s?s97/w%urnCvZ,R_8q mE?Q)?1Qۑ/܂}dIlkR{ .\܎USl"і)r8u}5WDz Ë^!&G#dtKh~}.slf%6g6+yvs1UlhW }{K[yNmEs0FQ]{AٱuxPSh:5G  6 qoB7')׸4~3 A(Wl/n?Dzв;/^K.f` eOoxg]{ 7r3b>#ܕd%1rp+5ppAL}G1*գL=L*=Oni[&s ˕6O׭{`}ޕ2mDiceUmYP+^!cTTئn,^9 Fu:ilOpȒvkLh0-"s<_58qhF=<_?Ϊ-F jIWPjHnwwC(qEqs5.بzwv`h[7f[@&Pڕ'v ;:"m` ],SB!̹kB́MnAr@LKe@^t!Ӡ"ʲE&xS|4Rmf;&CYo>֐#.hqeyOyv`4DME\Iҋ8$2"ETDbF~wX  Ph` Ei+D/Rcv@Zjvp5_4y6wz@3<_}vdA_w焫=*TV|iX Djmxч{kzyw" hJP kkϖ5Nkks֯,XKEV3\qQFVV56EdH? @:.7ߙ#a.>]|?GFڒ$5:ӛطgJbN9 GXA0{7O<)H @/i[…uu<|< i7m̱}%Vya@?WI-xAupGؔG襀bEm>~\iTwNkW9k?xKL `b\OJq.oU3o߿L0R. L\UI0f' z1&wԪv8kDֆc{$ZwguU,ɋ4 1z;{*!׭XA1Q]-OJkC"3gqN(!aK.fS:xVI<8jaҤK7K$)ª&k'jQ<1H+-"VMu np{!''^qx 01$ZڊMW'3F$6hpf8Mx6? {T엥D&\* >Nh2! ھK[ .g1HN?rcD<9QU V IDATħ{) 1/)n^`d{AB}slhFj5q[Vb4%؄P dhKXl'{ʡ #%׉Vf>6zp)jA Π;Ґ#u%>܌A~.PHE6q+'U7e?BT ^5 {蕧bZc?GULO,AP273(@}oϣ OL PaRly 0/Q(9 E.q6-#xr ŰJϑ.*LJ$.e4 -Vw ThF %G#.DIE 8[Pȝc_()@{Ǡa0Ge@r⊚G:HĻ`h) woJ0,jW@liЀj@uѮVpu ?PVpڜ- !SPnn^@2{z}3y9pr\Mum\_k{8E'gme7p3?ӰiļP4bؒ(3#NΨ:{_dq\w^Q#)J`#$xaZhv\ba֡Z0M!1tw"3C^e==++Fy־Ȯ^vz'I)-bQ Uj(}h>aAaZ1 #^ܽTc k@6􂮄6:F[x.VZŔS8JOEIojr"VD'݇մYQ[$jD6p6{(VU,dǃȠ]k1>A2%%@yP/c1]I wgl><6n)uy&޾1'l`jBIe+ylbX-BLH %s+\SNZ917v-7D+.ic1 W o]W+5bg jFfRٖ<2:!J73(@SlĎ$y`M,VC;`bF*`v\6{?Ttp1ɜ񥻂{8H`iCT>abW<+(8yST.9vM\ooﺯP.́Kp|?r؝kIqĄΦc朗7Dz 7k5%t7" ^L{*TCھ; IdX.0*Xǿga$<|q_ǻ(?BAboS>3D="A"6U12Ax9?ĝ>^]ܦ]OR-H2[4>@3Zkgy"Š rh4aw,_h[> Z$x@`vdk\Nn&s"3-kcC vzԝ@sO"v Vݫ*EޖW❂}ɲJ NF}R=޳Ϭ1 +iPysjx VzD_K # G pA&IJc*; AŦkpY@mU >cnN_ 0d\?Y_DWo`OBtB!U!DN 볯><7g /} ekSEcY:!sDjM'@NGO]xcps^P W # ^bb*M '%aM!BбJUoKiRK_+j=FsǏIdG͎w~U[;ZSHBPktq ttX<6_R"Hi+1pj%7&‚n4MJgJ-VӔ mȺQYФvA Gp( tyh|Aqtr +4\؅>(-Vҝ*X]<왼".bx/aTG7R}<t%Nϴa Q+ӯF4.m\L"Rq[2u뤄Ώ$>My:4%:69eWdS5IaQx6MXARw\x..7Ao@b},nͤ;)$ 5›G&Ǥ[{QDMMan]^}<>\&<Ak{D8 x4op|HC#+m䄚hUW^L@rd{SkfJ20/(UZ J,qVl;q?F[ҝ|fdm1ɻVV+IXv}i=w/$ZM+"^FU+U.Gvp危l4ޫTQ1mK)#"P(6Y3RhԎiM;p, rFR7%s5LJ48;5ԋC3.>遆.mۦZܢ%έ J=RFG;f6#?ޠp|PyXe!X_cGI*$3wUΛ"6f`AlJed輞8ܽ:(EH\b v'j%iL>0f 7 遃؞:Z2HkֆK빗ÓOꁕ^G0RQbO'%[WTZ:R7 鑭LociP#uZnxIvg O'4yJy18umQI~q [P֒ zn;V0*V=Ċ\Vڏn+ӫ=-N7$^k0zz$yBZ;yaBw.cMJ1?4ZWBW8ײ-Lxo:^l#6=YVy1ry*LPxj$zK1wo:c,脼A \.k1n@ջJ8ECo,҄*ܡ*$]_!.S^X8 ._~=/;ՕNͭ1[ES;i] yNKZӘx!/+NƊk#COE Fէ r1jKũ/TN)$-IKmh%!CC"DF΂1+9*CF{=wJh<ڂJ7-r{u7@B|Guj l0!a&?'FJYu-±fT%XDBzf5%*֖J,8EQ-sy{g5"-#U Q Mu-,H/?8u`z `> ,>)@.)_}*,s YVPennp GFQA8Z]qnc-Ӷhm%ȃ*aC>{r},DI۞_c91MW?8h-mkHE!\F3E.>g8^/d.\QWeX9)-P[wg3L99nR雮$a#Yۀ o"ħeiE{^߳#_PxIaO.SXpje:J1b5"Ut:'U:rE#֯11mctR>b?+O ꠰lJ7Cr4FFMv.=c>} }btx( xx[ĖW}17PYUP.aGHԥZrv|.컆q&&I'DIAS$csP5-Ohڗfk{VNEwif%h ~AM\ՔqElJ6BSU3zUyc1h>_@OndS$8%Q720> WÑ2NBGozWYnV,|ߕXzlldc4Ny^'F: )MgFtug{ZP$xQ)h/OR*7?9Yol VZ{ T١/˙[/)%;"^^ScDa- }>@k_a> fRH!ks:Zt/?ǎع&yx 5եљk.F$zH 1ĭ(ukPU}.݌ze֟]Og(hImg׆FP][a}_JrH59pU'qdYq@#!9(%= .&/f}[AwEq5Vzה bwDDYMYq֧ؾc ulMB Ji+mR`}1U\ѪJ?C;b+ n1u?֌<m+L@@NyuW@rzCGG00=#a*TuX.82>{8[1:7lwRy 9p& dePk+;AVu6;Ϲ9`Xlu4;p9OlM 鮵XG?ڤDyOp׋Jo' >5h.te$-vh)zpJ/1$;ZiDL߅g}᭦&w|6Bn1x OfZ^#ɺ!5ՑlK%a#QōJ/laiƑi kF3P쯥*&HͫPC`<ғ{rTtAGl!{@>]Gq I7!e#vÓwd0Kn[!k%$CnX$"#oYrۻKXuk<7MG9`?9dZC809AkSɔd"Q$xZ$]M-aqcSS4hpbD>D1N(V5jŢ:n.tL#!kZ{y5`hF5ԁTq3/Lo(J^gC?эBp, Yn$$\byF5ôD2iä$IY"?E&nu%9vmdEh5M[5gG ~zpj7G%hUk.+w=H4gOy(s5^&%5ў\.hC=09NG7q<,b t0Jŷ(LHĐa3))A;jr`RQЧ**+ǭ60-Sv^EP:SI\2c:9Q&}`K؍4M^5`o=cT0 S2nB-寰<lĠҬ@Lݚ]V'q V|iXRxBH$u$ c} rJQNKJOה؂zunrJqme=@..Gkx[Ȥ6>rJ^''ޒLF`@l]hƫJҦwثϵudy04jXlBR'd۩ϿhwcVNJT)QW?k\ 1 Sr;r@jNʦ3CQ`ԉ "?ciV#HIna}Mc-?{\˄9+e_GKWot%ro.ep)BtwHa!wPF$ ;L鏾NC155Iѳkݏf1JASմXggp|WܫBHn_m]ʚO?)Z@ 4ޱ{^.Sx\S_& |[\Hk9+gvuG mHeSn`)ũL@8g0uL@KXbjҹ%2 ٸ.7^HE 3:?O",.P y V ֟Φ +v?j4}V5)?T 7,%y#YqME8 I}Ma.Lb9R?t{aPhre}SOp S6O;m,e6ܽaERQ̭r>89aara ɾu) J $Ad`T߾AVB0GSbƦD֧ܘ7ě5aޭL 4<AZ3MoBב&t媏6{|%q)tɠG\eiihh(-|bDMX\ĹuWRWe}7?h:YW`Fβ-a3BfJb6"WeX׺Juo%3sm$ц`$D2T{@nO3J>@rvhuŨj1`s>K@I5>yʣaQ9).\Y^ 4 *9xg!ITq4;1dhm G]_Cɘ&,B(vH[|י%rXS ,`6,a%TS1ujy  9ZHN}W0wGkR ȓ ^`^."IuVKd\!4mYl6^yH%ߙ.q|V]jbWzi 5mB]#l`AJ[OޫUfl-ع@[Ҁњ̈R7DRsr0s.Uw:_"L#fRYP9X+\LHyl8g-"'Ӻ[c6SڣNj~uaFZM$ 㖺8rhhcfctWM&]D~L\2p(q!Te$\BP3{h#&E=~wX%ţEc(ֺnm珱 UY¤ԈHQuT&(s"m`p6Bպ bZںY 涪m:U&Z]ܪP !ga(0c10Al⭯ǏxiZpwJ:!_ 3Y$whE'\ORi &ۇ{KX^;gTwӒXACLX{gduiv}]]9=v6nIDAT1U 0Y6 /m[&9*{H9iC2L$HJSMos w5ME"u9pВ_}uS`^OVn_ E JJw@vPֲ]bڸjjU- ШY D#$.(HN7R%-W_Ao~'п3Jf!&(JV$%ϿS=kDuk7]gaf7~FcCUwrcd4*#􂢡uCOԎ'uǥ+FS r`Jj{8UVI, e*WؼFP0R͈6)<*a 64[xU0jYݵkc/ECi2[4AUVn-T0q?!"G#TPh3 xGP8ko>V 6pTÍ\͸FV}"/u~=1 |1-a5mqR0iĴmF;$0ٔսr1D@%IsbHD-8RQ@hQ`@ CW,YlQn =.i8B'I76 c6Քxw-[DxGwj&}/I ,%BhRT!X &5Xf ?() #a)S1G,0b9P>'g~} ,?xs&L0dL y%hܿLu %?(^m,-%2v;,@hf\t(G]ѳ '#V{?&íBxd41d',3>BOźIf<?+.pYl<)a i9t+G0M(mLCҺցZm'T;Qh#m3S '5`=s9ި ^f$',s'L,$`Q@X,_Ϙ+LS?C;#c#yfI&)׆F|S/D% G 1šVP2;?sZe..bot/XIjA-2[hqEmVzżH] $&Zԧlz"T|I5 *=UkF&X됑jz*`ٰnn:eوVĪV2=Od=cR1A! lG!EPJ¢&RH`ļ'QPŒ<%3_OAM;ݓ'P |xˉ0pŀQ@ uR4*;=i' $f2RneKe畜fڇq/5>FmٰFRT2ZpFʡXTWn*jUgC+cq^[k:_c!E ,&oVEnV] @g{JHb[LW?Ww{M@x?'Xqr&\'QZkg6V8"C).LݺE3f}s2*;nc!Pb ӳ 0ȣjUctƉ jOͩ%)(LPPfFQ} QD0PeH( r R A~cOj7o}}[X */ժ7/ v>ȋFPegU>ᮠ\k>j;ec\Aiw G> oy^m hfv2i[ׯ(>Nk< ;nݽguK2b(9-d .lc P zZ lDŽtدaw+[^wP"wr픨i[h= d@6З C0m 5Q$ cņ,@|O9[46wx}=gwͿ; M,wg/3d̐Ai"'\A Rf  = -sGA?z  78R x5&qfd0NQ}}ߍ>NM@,Gcݎ) TUg_goX RyU዆+;Kۙ{>CgߥZ{ kj@Nj'`X(df[E3 ם.V vzn9P'V8,Nbj, uQw6i̹\}Q >`ݻu^ZCDSiqsz-d݁Mow75Y8AvTUݙ,~}AJ 3dLt .h31Kdfhyr 2Л?>#pt~ Џ?~cB/Dg@oq\9;p2͊z99<*' /`C_8!H9`w~oA: OP"l@_1񡁀 Hm F1ҾڱrD;$(OhӃ߆u* 4sL<|hx GdZR9za di;sE޳}bCf7Gis|`$L)lI&䓂~/_X2Cx٘x5^ ;Nq`}/egEy}YQA#r`p'-G-+AX˶S!{ >]0v>%ξU=K[@ʎ1AI}ȵm ;&\3o!dez`8X {BdɎDJnoO6CbJp8_4Cюza^HvVP,p {@N)@VG`b-d7@wA{|rMO#.AO] E8(}d7ɞx0^@ #gA{|:T]J6X\\@u$XQsU/oaXKqj茄iߋB<ޮb 3k osp6foiWveJ"oՊ j'Lt;cuvCrl&JMBy73t܁x$β8+{w{0tۿF:LR@CɊ++﻾|s2\Al!#'$, e&]-;:e;G#\.};%F5g~1 TAcXh^UQc@ jԇ ۺ%]z7iGR W,g_̛dJ/ :'˨fd3d d;N'C[ prcBkGM7\_'oxH7v|o P|-̇ ts _?<nFhz.FO&_<<7eې?SgϠгgkv3+W ~|v>˟B_g>_?8ߵPIѸ불3xSC?>qŰ@*| AWWVT+iPjQ:<)h5op$o{fDbsЯXX-ưn*م-6m޾Z۫,s,u=0 %C0φ hHa8@ϐ}/'9?|!}}o?{* l_ۢ?|%|q~Z?bQ':z*; $-{tw ϠO8R2r FkۇG;f@ӌs/< Ubkst2d[[F"VZ|w4K'ꓟ })F yjN<! TYbа@/rU,BMZ}pz}2ɀC̐]a+;o\ի~o_%/k wSyUVLV_5>9pŅEǠs㩭קo S}Q>YO/x+eiwIENDB`kraft-1.2.2/src/pics/sc-apps-kraft.svg000066400000000000000000005246021467704360200175660ustar00rootroot00000000000000 image/svg+xml kraft-1.2.2/src/portal.cpp000066400000000000000000001260211467704360200154320ustar00rootroot00000000000000/*************************************************************************** portal.cpp - The Kraft portal page ------------------- begin : Mar 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for QT #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // include files for KDE #include #include #include // application specific includes #include "kraftview.h" #include "portal.h" #include "portalview.h" #include "kraftdb.h" #include "katalog.h" #include "katalogman.h" #include "kraftdoc.h" #include "templkatalogview.h" #include "materialkatalogview.h" #include "prefsdialog.h" #include "documentman.h" #include "reportgenerator.h" #include "kraftsettings.h" #include "defaultprovider.h" #include "archdoc.h" #include "newdocassistant.h" #include "doctype.h" #include "tagtemplatesdialog.h" #include "kraftview_ro.h" #include "databasesettings.h" #include "setupassistant.h" #include "addressprovider.h" #include "alldocsview.h" #include "exportxrechnung.h" #include "ui_xrechnung.h" Portal::Portal(QWidget *parent, QCommandLineParser *commandLineParser, const char* name) : QMainWindow( parent ), mCmdLineArgs( commandLineParser ), _readOnlyMode {false} { setObjectName( name ); _readOnlyMode = mCmdLineArgs->isSet("r"); const QStringList iconPaths {":kraft/custom-icons"}; QIcon::setFallbackSearchPaths(iconPaths); /////////////////////////////////////////////////////////////////// // call inits to invoke all other construction parts initActions(); initView(); setAttribute( Qt::WA_QuitOnClose ); /////////////////////////////////////////////////////////////////// mAddressProvider = new AddressProvider( this ); const QByteArray state = QByteArray::fromBase64( KraftSettings::self()->portalState().toLatin1() ); restoreState(state); const QByteArray geo = QByteArray::fromBase64( KraftSettings::self()->portalGeometry().toLatin1() ); restoreGeometry(geo); // setAutoSaveSettings(); QTimer::singleShot( 0, this, SLOT( slotStartupChecks() ) ); } void Portal::initActions() { QIcon newIcon; newIcon = DefaultProvider::self()->icon( "logout"); _actFileQuit = new QAction(newIcon, i18n("&Quit"), this); _actFileQuit->setShortcuts(QKeySequence::Quit); connect(_actFileQuit, &QAction::triggered, this, &QWidget::close); newIcon = DefaultProvider::self()->icon( "cut"); _actEditCut = new QAction(newIcon, i18n("&Cut"), this); _actEditCut->setShortcuts(QKeySequence::Cut); connect(_actEditCut, &QAction::triggered, this, &Portal::slotEditCut); newIcon = DefaultProvider::self()->icon( "copy"); _actEditCopy = new QAction(newIcon, i18n("C&opy"), this); _actEditCopy->setShortcuts(QKeySequence::Copy); connect(_actFileQuit, &QAction::triggered, this, &Portal::slotEditCopy); newIcon = DefaultProvider::self()->icon( "transfer-in"); _actEditPaste = new QAction(newIcon, i18n("&Paste"), this); _actEditPaste->setShortcuts(QKeySequence::Paste); connect(_actEditPaste, &QAction::triggered, this, &Portal::slotEditPaste); newIcon = DefaultProvider::self()->icon( "settings"); _actPreferences = new QAction(newIcon, i18n("&Settings"), this); _actPreferences->setShortcuts(QKeySequence::Preferences); connect(_actPreferences, &QAction::triggered, this, &Portal::preferences); newIcon = DefaultProvider::self()->icon( "file-plus"); _actNewDocument = new QAction(newIcon, i18n("&Create Document"), this); _actNewDocument->setShortcuts(QKeySequence::New); connect(_actNewDocument, &QAction::triggered, this, &Portal::slotNewDocument); newIcon = DefaultProvider::self()->icon( "template"); _actCopyDocument = new QAction(newIcon, i18n("&Copy Document"), this); // _actCopyDocument->setShortcuts(); connect(_actCopyDocument, &QAction::triggered, this, &Portal::slotCopyCurrentDocument); newIcon = DefaultProvider::self()->icon( "file-export"); _actFollowDocument = new QAction(newIcon, i18n("Create &Followup Document"), this); _actFollowDocument->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_F )); connect(_actFollowDocument, &QAction::triggered, this, &Portal::slotFollowUpDocument); newIcon = DefaultProvider::self()->icon( "printer"); _actPrintDocument = new QAction(newIcon, i18n("Print Document"), this); _actPrintDocument->setShortcut( QKeySequence::Print); connect(_actPrintDocument, &QAction::triggered, this, &Portal::slotPrintCurrentDocument); newIcon = DefaultProvider::self()->icon( "eye"); _actViewDocument = new QAction(newIcon, i18n("Show Document"), this); _actViewDocument->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_R )); connect(_actViewDocument, &QAction::triggered, this, &Portal::slotViewCurrentDocument); newIcon = DefaultProvider::self()->icon( "edit"); _actOpenDocument = new QAction(newIcon, i18n("Edit Document"), this); _actOpenDocument->setShortcut( QKeySequence::Open ); connect(_actOpenDocument, &QAction::triggered, this, &Portal::slotOpenCurrentDocument); newIcon = DefaultProvider::self()->icon( "archive"); _actOpenArchivedDocument = new QAction(newIcon, i18n("Open Archived Document"), this); _actOpenArchivedDocument->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_A )); connect(_actOpenArchivedDocument, &QAction::triggered, this, &Portal::slotArchivedDocExecuted); newIcon = DefaultProvider::self()->icon("mail-forward"); _actMailDocument = new QAction(newIcon, i18n("Mail Document"), this); _actMailDocument->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_M )); connect(_actMailDocument, &QAction::triggered, this, &Portal::slotMailDocument); newIcon = DefaultProvider::self()->icon( "mail-forward"); _actXRechnung = new QAction(newIcon, i18n("Export XRechnung"), this); _actXRechnung->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_R )); connect(_actXRechnung, &QAction::triggered, this, &Portal::slotXRechnungCurrentDocument); newIcon = DefaultProvider::self()->icon( "settings"); _actEditTemplates= new QAction(newIcon, i18n("Edit Tag Templates"), this); _actEditTemplates->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_E )); connect(_actEditTemplates, &QAction::triggered, this, &Portal::slotEditTagTemplates); newIcon = DefaultProvider::self()->icon( "settings"); _actReconfDb = new QAction(newIcon, i18n("Redo Initial Setup…"), this); _actReconfDb->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_R )); connect(_actReconfDb, &QAction::triggered, this, &Portal::slotReconfigureDatabase); newIcon = DefaultProvider::self()->icon( "book"); _actHandbook = new QAction(newIcon, i18n("Kraft Handbook…"), this); _actHandbook->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_H )); connect(_actHandbook, &QAction::triggered, this, &Portal::slotHandbook); newIcon = DefaultProvider::self()->icon( "help"); _actAboutQt = new QAction(newIcon, i18n("About Qt…"), this); _actAboutQt->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_Q )); connect(_actAboutQt, &QAction::triggered, this, &Portal::slotAboutQt); newIcon = DefaultProvider::self()->icon( "kraft-simple"); _actAboutKraft = new QAction(newIcon, i18n("About Kraft…"), this); _actAboutKraft->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_K )); connect(_actAboutKraft, &QAction::triggered, this, &Portal::slotAboutKraft); _actFileQuit->setStatusTip(i18n("Quits the application")); _actEditCut->setStatusTip(i18n("Cuts the selected section and puts it to the clipboard")); _actEditCopy->setStatusTip(i18n("Copies the selected section to the clipboard")); _actEditPaste->setStatusTip(i18n("Pastes the clipboard contents to current position")); _actNewDocument->setStatusTip( i18n( "Creates a new Document" ) ); _actPrintDocument->setStatusTip( i18n( "Print and archive this Document" ) ); _actCopyDocument->setStatusTip( i18n( "Creates a new document which is a copy of the selected document" ) ); _actFollowDocument->setStatusTip( i18n( "Create a followup document for the current document" ) ); _actOpenDocument->setStatusTip( i18n( "Opens the document for editing" ) ); _actViewDocument->setStatusTip( i18n( "Opens a read only view on the document." ) ); _actMailDocument->setStatusTip( i18n( "Send document per mail" ) ); _actXRechnung->setStatusTip( i18n("Export invoice in XRechnung XML format.")); _actEditTemplates->setStatusTip( i18n("Edit the available tag templates which can be assigned to document items.") ); _actReconfDb->setStatusTip( i18n( "Configure the Database Kraft is working on." ) ); _actOpenArchivedDocument->setStatusTip( i18n( "Open a viewer on an archived document" ) ); _actOpenDocument->setEnabled( false ); _actViewDocument->setEnabled( false ); _actPrintDocument->setEnabled( false ); _actCopyDocument->setEnabled( false ); _actFollowDocument->setEnabled( false ); _actMailDocument->setEnabled( false ); _actOpenArchivedDocument->setEnabled( false ); _actXRechnung->setEnabled( false ); QMenu *fileMenu = menuBar()->addMenu(i18n("&File")); fileMenu->addAction(_actFileQuit); #if 0 QMenu *editMenu = menuBar()->addMenu(i18n("&Edit")); editMenu->addAction(_actEditCopy); editMenu->addAction(_actEditCut); editMenu->addAction(_actEditPaste); #endif QMenu *docMenu = menuBar()->addMenu(i18n("&Document")); docMenu->addAction(_actViewDocument); if (!_readOnlyMode) docMenu->addAction(_actOpenDocument); docMenu->addAction(_actOpenArchivedDocument); docMenu->addAction(_actXRechnung); if (!_readOnlyMode) { docMenu->addSeparator(); docMenu->addAction(_actNewDocument); docMenu->addAction(_actCopyDocument); docMenu->addAction(_actFollowDocument); docMenu->addSeparator(); docMenu->addAction(_actPrintDocument); docMenu->addAction(_actMailDocument); } QToolBar *toolBar = addToolBar(i18n("Kraft")); if (!_readOnlyMode) { QMenu *prefsMenu = menuBar()->addMenu(i18n("&Preferences")); prefsMenu->addAction(_actEditTemplates); prefsMenu->addAction(_actReconfDb); prefsMenu->addSeparator(); QMenu *submen = prefsMenu->addMenu(i18n("Toolbars")); submen->addAction(toolBar->toggleViewAction()); prefsMenu->addSeparator(); prefsMenu->addAction(_actPreferences); } QMenu *helpMenu = menuBar()->addMenu(i18n("&Help")); helpMenu->addAction(_actHandbook); helpMenu->addSeparator(); helpMenu->addAction(_actAboutKraft); helpMenu->addAction(_actAboutQt); // Toolbar toolBar->setObjectName("PortalToolbar"); if (!_readOnlyMode) { toolBar->addAction(_actNewDocument); toolBar->addAction(_actCopyDocument); toolBar->addAction(_actFollowDocument); toolBar->addAction(_actPrintDocument); toolBar->addAction(_actMailDocument); } else { toolBar->addAction(_actOpenArchivedDocument); toolBar->addAction(_actXRechnung); toolBar->addAction(_actViewDocument); } // initial enablements _actEditCut->setEnabled(false); _actEditCopy->setEnabled(false); _actEditPaste->setEnabled(false); } void Portal::initView() { /* Since we do the database version check in the slotStartupChecks, we cannot do database interaction here in initView. */ //////////////////////////////////////////////////////////////////// // create the main widget here that is managed by KTMainWindow's view-region and // connect the widget to your document to display document contents. m_portalView.reset(new PortalView( this, "PortalMainView" )); QVector menus = m_portalView->docDigestView()->contextMenus(); foreach( QMenu *menu, menus ) { menu->setTitle( i18n("Document Actions")); menu->addSection(i18n("Document Actions")); menu->addAction( _actViewDocument ); if (!_readOnlyMode) menu->addAction( _actOpenDocument ); menu->addAction( _actOpenArchivedDocument ); menu->addAction( _actXRechnung); if (!_readOnlyMode) { menu->addSeparator(); menu->addAction( _actNewDocument ); menu->addAction( _actCopyDocument ); menu->addAction( _actFollowDocument ); menu->addSeparator(); menu->addAction( _actPrintDocument ); menu->addAction( _actMailDocument ); } } connect( m_portalView.data(), SIGNAL(openKatalog( const QString&)), this, SLOT(slotOpenKatalog(const QString&))); connect( m_portalView.data(), SIGNAL(katalogToXML(const QString& )), this, SLOT(slotKatalogToXML(const QString&))); // document related connections connect( m_portalView.data(), SIGNAL( createDocument() ), this, SLOT( slotNewDocument() ) ); connect( m_portalView.data(), SIGNAL( copyDocument( const QString& ) ), this, SLOT( slotCopyDocument( const QString& ) ) ); connect( m_portalView.data(), SIGNAL( openDocument( const QString& ) ), this, SLOT( slotOpenDocument( const QString& ) ) ); connect( m_portalView.data(), SIGNAL( viewDocument( const QString& ) ), this, SLOT( slotViewDocument( const QString& ) ) ); connect( m_portalView.data(), SIGNAL( openArchivedDocument( const ArchDocDigest& ) ), this, SLOT( slotOpenArchivedDoc( const ArchDocDigest& ) ) ); connect( m_portalView.data(), &PortalView::exportXRechnungArchivedDocument, this, &Portal::slotExportXRechnungArchivedDoc); connect( m_portalView.data(), &PortalView::documentSelected, this, &Portal::slotDocumentSelected); connect( m_portalView.data(), SIGNAL( archivedDocSelected( const ArchDocDigest& ) ), this, SLOT( slotArchivedDocSelected( const ArchDocDigest& ) ) ); setCentralWidget(m_portalView.data()); } void Portal::slotStartupChecks() { const QString dbName = DatabaseSettings::self()->dbDatabaseName(); SetupAssistant assi(this); if( assi.init( SetupAssistant::Update) ) { if (_readOnlyMode) { // Update not under our control here. QMessageBox::warning(this, i18n("Database not running"), i18n("Kraft was started in readonly mode, but the configured " "database cannot be connected.\n\nKraft will abort.")); QTimer::singleShot(500, this, [this] { close(); }); return; } else { assi.exec(); } } if( ! KraftDB::self()->isOk() ) { QSqlError err = KraftDB::self()->lastError(); // qDebug () << "The last sql error id: " << err.type(); QString text; if ( err.text().contains( "Can't connect to local MySQL server through socket" ) ) { text = i18n( "Kraft cannot connect to the specified MySQL server. " "Please check the Kraft database settings, check if the server is " "running and verify if a database with the name %1 exits!" , dbName ); } else if ( err.text().contains( "Unknown database '" + dbName + "' QMYSQL3: Unable to connect" ) ) { text = i18n( "The database with the name %1 does not exist on the database server. " "Please make sure the database exists and is accessible by the user " "running Kraft.", dbName ); } else if ( err.text().contains( "Driver not loaded" ) ) { text = i18n( "The Qt database driver could not be loaded. That probably means, that " "they are not installed. Please make sure the Qt database packages are " "installed and try again." ); } else { text = i18n( "There is a database problem: %1", err.text() ); } m_portalView->systemInitError( m_portalView->ptag( text, "problem" ) ); // disable harmfull actions if( !_readOnlyMode) { _actNewDocument->setEnabled( false ); _actCopyDocument->setEnabled( false ); _actFollowDocument->setEnabled(false); _actOpenDocument->setEnabled( false ); } _actViewDocument->setEnabled( false ); _actPrintDocument->setEnabled( false ); _actOpenArchivedDocument->setEnabled( false ); _actXRechnung->setEnabled(false); _actMailDocument->setEnabled( false ); slotStatusMsg( i18n( "Database Problem." ) ); } else { // if readonly, enable the change polling on the db if (_readOnlyMode) { KraftDB::self()->enableTimerRefresh(true); } // Database interaction is ok after this point. m_portalView->slotBuildView(); m_portalView->fillCatalogDetails(); m_portalView->fillSystemDetails(); slotStatusMsg( i18n( "Check commandline actions" ) ); if ( mCmdLineArgs ) { const QString docId = mCmdLineArgs->value("d"); if ( ! docId.isEmpty() ) { // qDebug () << "open a archived document: " << docId; slotPrintDocument( QString(), dbID( docId.toInt() ) ); } } // Fetch my address const QString myUid = KraftSettings::self()->userUid(); bool useManual = false; if( ! myUid.isEmpty() ) { KContacts::Addressee contact; // qDebug () << "Got My UID: " << myUid; connect( mAddressProvider, SIGNAL( lookupResult(QString,KContacts::Addressee)), this, SLOT( slotReceivedMyAddress(QString, KContacts::Addressee)) ); AddressProvider::LookupState state = mAddressProvider->lookupAddressee( myUid ); switch( state ) { case AddressProvider::LookupFromCache: contact = mAddressProvider->getAddresseeFromCache(myUid); slotReceivedMyAddress(myUid, contact); break; case AddressProvider::LookupNotFound: case AddressProvider::ItemError: case AddressProvider::BackendError: // Try to read from stored vcard. useManual = true; break; case AddressProvider::LookupOngoing: case AddressProvider::LookupStarted: // Not much to do, just wait break; } } else { // in case there is no uid in the settings file, try to use the manual address. useManual = true; } if( useManual ) { // check if the vcard can be read QString file = QStandardPaths::writableLocation( QStandardPaths::AppDataLocation ); file += "/myidentity.vcd"; QFile f(file); if( f.exists() ) { if( f.open( QIODevice::ReadOnly )) { const QByteArray data = f.readAll(); VCardConverter converter; Addressee::List list = converter.parseVCards( data ); if( list.count() > 0 ) { KContacts::Addressee c = list.at(0); c.insertCustom(CUSTOM_ADDRESS_MARKER, "manual"); slotReceivedMyAddress(QString(), c); } } } } connect( &_reportGenerator, &ReportGenerator::docAvailable, this, &Portal::slotDocConverted); connect( &_reportGenerator, &ReportGenerator::failure, this, &Portal::slotDocConvertionFail); } } void Portal::slotReceivedMyAddress( const QString& uid, const KContacts::Addressee& contact ) { disconnect( mAddressProvider, SIGNAL(lookupResult(QString,KContacts::Addressee)), this, SLOT(slotReceivedMyAddress(QString, KContacts::Addressee))); if( contact.isEmpty() ) { if( !uid.isEmpty() ) { // FIXME: Read the stored Address and compare the uid const QString err = mAddressProvider->errorMsg(uid); qDebug () << "My-Contact could not be found:" << err; } return; } myContact = contact; // qDebug () << "Received my address: " << contact.realName() << "(" << uid << ")"; _reportGenerator.setMyContact( myContact ); QString name = myContact.formattedName(); if( !name.isEmpty() ) { name = i18n("Welcome to Kraft, %1", name); statusBar()->showMessage(name, 30*1000); } } bool Portal::queryClose() { return true; } bool Portal::queryExit() { return true; } ///////////////////////////////////////////////////////////////////// // SLOT IMPLEMENTATION ///////////////////////////////////////////////////////////////////// void Portal::busyCursor( bool on ) { if ( on ) { QApplication::setOverrideCursor( QCursor( Qt::BusyCursor ) ); } else { QApplication::restoreOverrideCursor(); } } void Portal::slotNewDocument() { slotStatusMsg(i18n("Creating new document…")); KraftWizard wiz; wiz.init(true); if ( wiz.exec() ) { DocumentMan *docman = DocumentMan::self(); DocGuardedPtr doc = docman->createDocument( wiz.docType() ); doc->setDate( wiz.date() ); doc->setAddressUid( wiz.addressUid() ); doc->setWhiteboard( wiz.whiteboard() ); createView( doc ); } slotStatusMsg(); } void Portal::slotFollowUpDocument() { const QString locId = m_portalView->docDigestView()->currentDocumentId(); DocGuardedPtr sourceDoc = DocumentMan::self()->openDocument( locId ); DocType dt( sourceDoc->docType() ); KraftWizard wiz; wiz.init( false, i18nc("Dialog title of the followup doc dialog, followed by the id of the source doc", "Create follow up document for %1", sourceDoc->ident())); QStringList followers = dt.follower(); if ( followers.count() > 0 ) { // only if there are currently followers defined, if not the default wiht // all doc types works. wiz.setAvailDocTypes( dt.follower() ); } // qDebug () << "doc identifier: "<< doc->docIdentifier(); wiz.setDocToFollow( sourceDoc ); DocPositionList posToCopy; delete sourceDoc; if ( wiz.exec() ) { QString selectedId = wiz.copyItemsFromPredecessor(); if(!selectedId.isEmpty()) { DocGuardedPtr copyDoc = DocumentMan::self()->openDocument( selectedId ); posToCopy = copyDoc->positions(); delete copyDoc; } // Check if the new document type allows demand- or alternative items. If not, remove the // attributes of the items, otherwise it can not be edited any more // see https://github.com/dragotin/kraft/issues/242 DocType newDocType = wiz.docType(); bool allowKind = newDocType.allowAlternative() || newDocType.allowDemand(); if (!allowKind) { for(DocPositionBase *dp:posToCopy) { AttributeMap attribs = dp->attributes(); if (attribs.hasAttribute("kind")) { attribs.remove("kind"); dp->setAttributeMap(attribs); } } } DocGuardedPtr doc = DocumentMan::self()->createDocument(newDocType.name(), locId, posToCopy); doc->setDate( wiz.date() ); doc->setWhiteboard( wiz.whiteboard() ); createView( doc ); } } void Portal::slotCopyCurrentDocument() { const QString locId = m_portalView->docDigestView()->currentDocumentId(); slotCopyDocument( locId ); } void Portal::slotCopyDocument( const QString& id ) { if ( id.isEmpty() ) { return; } QString oldDocIdent; DocGuardedPtr oldDoc = DocumentMan::self()->openDocument( id ); if(oldDoc) { const DocType dt = oldDoc->docType(); oldDocIdent = i18nc("Title of the new doc dialog, %1 is the source doc id", "Create new Document as Copy of %1", oldDoc->ident()); delete oldDoc; } KraftWizard wiz; wiz.init(true, oldDocIdent); if ( wiz.exec() ) { DocGuardedPtr doc = DocumentMan::self()->copyDocument(id); doc->setDate( wiz.date() ); doc->setDocType( wiz.docType() ); doc->setWhiteboard( wiz.whiteboard() ); if(doc->addressUid() != wiz.addressUid() ) { doc->setAddress(QString()); } doc->setAddressUid( wiz.addressUid() ); doc->saveDocument(); m_portalView->docDigestView()->slotUpdateView(); // qDebug () << "Document created from id " << id << ", saved with id " << doc->docID().toString(); } } void Portal::slotOpenCurrentDocument() { QString locId = m_portalView->docDigestView()->currentDocumentId(); slotOpenDocument( locId ); } void Portal::slotViewCurrentDocument() { QString locId = m_portalView->docDigestView()->currentDocumentId(); slotViewDocument( locId ); } void Portal::slotViewDocument( const QString& id ) { slotStatusMsg(i18n("Opening document to view…")); if( !id.isEmpty() ) { DocumentMan *docman = DocumentMan::self(); DocGuardedPtr doc = docman->openDocument( id ); createROView( doc ); } slotStatusMsg(); } void Portal::slotXRechnungCurrentDocument() { // qDebug () << "printing document " << locId; ArchDocDigest dig = m_portalView->docDigestView()->currentLatestArchivedDoc(); slotExportXRechnungArchivedDoc(dig); } void Portal::slotExportXRechnungArchivedDoc(const ArchDocDigest& d) { ExporterXRechnung *exporter = new ExporterXRechnung; const QString tmplFile = exporter->templateFile(); QString err; if (tmplFile.isEmpty()) { err = i18n("XRechnung Template file not set. Please check the application settings!"); } else { QFileInfo fi(tmplFile); if (!fi.isFile()) { err = i18n("The XRechnung template file cannot be read!"); } } if (!err.isEmpty()) { QMessageBox::warning(this, i18n("XRechnung Export"), err); delete exporter; return; } auto dia = new QDialog(this); Ui::XRechnungDialog ui; ui.setupUi(dia); QDate today = QDate::currentDate(); ui._dueDateEdit->setDate(today.addDays(21)); ui._buyerRefEdit->setText("unknown"); if (dia->exec() == QDialog::Accepted) { exporter->setDueDate(ui._dueDateEdit->date()); exporter->setBuyerRef(ui._buyerRefEdit->text()); connect(exporter, &ExporterXRechnung::xRechnungTmpFile, this, [=](const QString& fName) { qDebug() << "This is the xrechnung file name." << fName; const QString proposeName = QString("%1/xrechnung_%2.xml").arg(QDir::homePath()).arg(d.archDocIdent()); const QString f = QFileDialog::getSaveFileName(this, i18n("Save XRechnung"), proposeName); if( f.isEmpty()) { qDebug() << "XRechnung Save file name is empty!"; return; } if (QFile::exists(f)) // copy does not overwrite the target file QFile::remove(f); QFile::copy(fName, f); this->slotStatusMsg(i18n("Saved XRechnung to %1").arg(f)); exporter->deleteLater(); }); exporter->exportDocument(d); } } void Portal::slotOpenArchivedDoc( const ArchDocDigest& d ) { busyCursor( true ); ArchDocDigest digest( d ); const QString file = d.pdfArchiveFileName(); // qDebug () << "archived doc selected: " << file; slotOpenPdf( file ); busyCursor( false ); } QDebug operator<<(QDebug debug, const dbID &id) { QDebugStateSaver saver(debug); debug.nospace().noquote() << id.toString(); return debug; } void Portal::slotPrintCurrentDocument() { QString locId = m_portalView->docDigestView()->currentDocumentId(); // qDebug () << "printing document " << locId; busyCursor( true ); slotStatusMsg( i18n( "Generating PDF…" ) ); DocumentMan *docman = DocumentMan::self(); _currentDoc = docman->openDocument( locId ); QString ident; if ( _currentDoc ) { ident = _currentDoc->ident(); dbID archID = KraftDB::self()->archiveDocument(_currentDoc); Q_ASSERT(archID.isOk()); slotPrintDocument( ident, archID ); // m_portalView->docDigestView()->addArchivedItem(docPtr->docID(), archID); } busyCursor( false ); slotStatusMsg( i18n( "Ready." ) ); } void Portal::slotMailDocument() { const QString locId = m_portalView->docDigestView()->currentDocumentId(); // qDebug () << "Mailing document " << locId; slotStatusMsg( i18n( "Generating PDF to email" ) ); DocumentMan *docman = DocumentMan::self(); DocGuardedPtr docPtr = docman->openDocument( locId ); QString ident; if ( docPtr ) { ident = docPtr->ident(); dbID archID = KraftDB::self()->archiveDocument( docPtr ); busyCursor( true ); _reportGenerator.createDocument(ReportFormat::PDFMail, ident, archID ); busyCursor( false ); } slotStatusMsg( i18n( "Ready." ) ); } void Portal::slotDocConvertionFail(const QString& failString, const QString& details) { QMessageBox::warning(this, i18n("Doc Generation Error"), failString + "\n\n"+details); } void Portal::slotDocConverted(ReportFormat format, const QString& file, const KContacts::Addressee& customerContact) { if (format == ReportFormat::PDF) { slotOpenPdf(file); } else if (format == ReportFormat::PDFMail) { openInMailer(file, customerContact); } } void Portal::openInMailer(const QString& fileName, const KContacts::Addressee& contact) { QString mailReceiver; if( !contact.isEmpty() ) { mailReceiver = contact.fullEmail(); // the prefered email } QStringList args; QString prog; // Use from system, we will not deliver them in an AppImage if( KraftSettings::self()->mailUA().startsWith("xdg") ) { args.append( "--utf8"); args.append( "--attach"); args.append(fileName); if( !mailReceiver.isEmpty() ) { args.append( mailReceiver); } prog = QLatin1String("/usr/bin/xdg-email"); } else { // Fallback to thunderbird prog = QLatin1String("/usr/bin/thunderbird"); args.append("-compose"); QString tmp; if( !mailReceiver.isEmpty() ) { tmp = QString("to=%1,").arg(mailReceiver); } tmp += QString("attachment='file://%1'").arg(fileName); args.append(tmp); } qDebug () << "Starting mailer: " << prog << args; if (!QProcess::startDetached(prog, args)) { qDebug () << "Failed to start thunderbird composer!"; } } /* * id : document ID * archID: database ID of archived document */ void Portal::slotPrintDocument( const QString& id, const dbID& archID ) { if ( archID.isOk() ) { slotStatusMsg(i18n("Printing archived document…") ); _reportGenerator.createDocument(ReportFormat::PDF, id, archID ); // work on document identifier. } } void Portal::slotOpenPdf( const QString& fileName ) { QUrl url( fileName ); QDesktopServices::openUrl(url); } /* * A special document tree is built up here. */ void Portal::savePdfInCustomerStructure(const QString& fileName) { // save pdf into a / structure if( _currentDoc ) { QString uid = _currentDoc->addressUid(); QString docType = _currentDoc->docType(); if( !uid.isEmpty() ) { QString outputDir = KraftSettings::self()->pdfOutputDir(); if ( outputDir.isEmpty() ) { outputDir = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation); } if ( ! outputDir.endsWith( "/" ) ) outputDir += QLatin1String("/"); QDir customerDir(outputDir + QString("%1/%2").arg(uid).arg(docType)); if( !customerDir.exists() ) { customerDir.mkpath( customerDir.absolutePath()); } if( customerDir.exists() ) { QFileInfo fi(fileName); QString target = customerDir.canonicalPath() + QLatin1Char('/') + fi.fileName(); QFileInfo tfi(target); if( tfi.exists() ) { QFile::remove(target); } QFile::copy( fileName, target ); } } } } void Portal::slotOpenDocument( const QString& id ) { if (_readOnlyMode) { slotViewDocument(id); return; } slotStatusMsg( i18n("Opening document %1", id ) ); // qDebug () << "Opening document " << id; if( !id.isEmpty() ) { DocumentMan *docman = DocumentMan::self(); DocGuardedPtr doc = docman->openDocument( id ); createView( doc ); } slotStatusMsg(); } void Portal::slotDocumentSelected( const DocDigest& doc ) { // qDebug() << "a doc was selected: " << doc; bool enable = !doc.id().isEmpty(); _actViewDocument->setEnabled( enable ); _actOpenDocument->setEnabled( (!_readOnlyMode) && enable ); _actPrintDocument->setEnabled( (!_readOnlyMode) && enable ); _actCopyDocument->setEnabled( (!_readOnlyMode) && enable ); _actMailDocument->setEnabled( (!_readOnlyMode) && enable ); _actFollowDocument->setEnabled( (!_readOnlyMode) && enable ); auto archDocs = doc.archDocDigestList(); if (archDocs.isEmpty()) { _actOpenArchivedDocument->setEnabled(false); } else { _actOpenArchivedDocument->setEnabled( enable ); } bool en = doc.isXRechnungEnabled() && enable; _actXRechnung->setEnabled(en); } void Portal::slotArchivedDocExecuted() { ArchDocDigest dig = m_portalView->docDigestView()->currentLatestArchivedDoc(); slotOpenArchivedDoc( dig ); } void Portal::slotArchivedDocSelected( const ArchDocDigest& ) { // slotDocumentSelected( QString() ); _actOpenArchivedDocument->setEnabled( true ); _actXRechnung->setEnabled(true); _actViewDocument->setEnabled( false ); _actOpenDocument->setEnabled( false ); _actPrintDocument->setEnabled( false ); _actMailDocument->setEnabled( false ); } void Portal::slotEditTagTemplates() { TagTemplatesDialog dia( this ); if ( dia.exec() ) { // qDebug () << "Editing of tag templates succeeded!"; } } void Portal::slotReconfigureDatabase() { // qDebug () << "Reconfiguring the Database"; SetupAssistant assi(this); if( assi.init( SetupAssistant::Reinit ) ) { assi.exec(); } } void Portal::createView( DocGuardedPtr doc ) { // FIXME: We allow only one view for the first time. // Later allow one write view and other read onlys. if ( !doc ) return; // if there is a read only view already, close it and open a // editor if( mViewMap.contains(doc)) { if( (mViewMap[doc])->type() == KraftViewBase::ReadOnly ) { KraftViewBase *view = mViewMap[doc]; mViewMap.remove(doc); delete view; } } if( !mViewMap.contains(doc) ){ KraftView *view = new KraftView( this ); const QByteArray geo = QByteArray::fromBase64( KraftSettings::self()->docEditGeometry().toLatin1() ); view->restoreGeometry(geo); view->setup( doc ); view->redrawDocument(); view->slotSwitchToPage( KraftDoc::Positions ); view->show(); connect( view, SIGNAL( viewClosed( bool, DocGuardedPtr ) ), this, SLOT( slotViewClosed( bool, DocGuardedPtr ) ) ); connect( view, &KraftViewBase::openROView, this, &Portal::slotViewDocument ); mViewMap[doc] = view; } else { mViewMap[doc]->raise(); // pop first view to front // qDebug () << "There is already a view for this doc!"; } } void Portal::createROView( DocGuardedPtr doc ) { if ( !doc ) return; if( !mViewMap.contains(doc)) { KraftViewRO *view = new KraftViewRO( this ); view->setup( doc ); // view->redrawDocument(); const QByteArray geo = QByteArray::fromBase64( KraftSettings::self()->docViewROGeometry().toLatin1() ); view->restoreGeometry(geo); view->show(); mViewMap[doc] = view; connect( view, SIGNAL( viewClosed( bool, DocGuardedPtr ) ), this, SLOT( slotViewClosed( bool, DocGuardedPtr ) ) ); } else { mViewMap[doc]->raise(); } } void Portal::slotViewClosed( bool success, DocGuardedPtr doc ) { // doc is only valid on success! if ( doc ) { KraftViewBase *view = mViewMap[doc]; const QByteArray geo = view->saveGeometry().toBase64(); if( success ) { if( view->type() == KraftViewBase::ReadWrite ) { AllDocsView *dv = m_portalView->docDigestView(); dv->slotUpdateView(); KraftSettings::self()->setDocEditGeometry(geo); } else { KraftSettings::self()->setDocViewROGeometry(geo); } } if( mViewMap.contains(doc)) { mViewMap.remove(doc); view->deleteLater(); } // qDebug () << "A view was closed saving and doc is new: " << doc->isNew(); delete doc; } else { // qDebug () << "A view was closed canceled"; } } void Portal::closeEvent( QCloseEvent *event ) { slotStatusMsg(i18n("Exiting…")); // close the first window, the list makes the next one the first again. // This ensures that queryClose() is called on each window to ask for closing //We have to delete katalogviews ourself otherwise the application keeps running in the background QMap::iterator i; for (i = mKatalogViews.begin(); i != mKatalogViews.end(); ++i) { // KatalogView *view = i.value(); // qDebug () << "Windowstate" << view->windowState(); i.value()->deleteLater(); } // FIXME: Close the document windows. const QByteArray state = saveState().toBase64(); KraftSettings::self()->setPortalState(state); const QByteArray geo = saveGeometry().toBase64(); KraftSettings::self()->setPortalGeometry(geo); KraftSettings::self()->save(); if( event ) event->accept(); } void Portal::slotEditCut() { slotStatusMsg(i18n("Cutting selection…")); slotStatusMsg(); } void Portal::slotEditCopy() { slotStatusMsg(i18n("Copying selection to clipboard…")); slotStatusMsg(); } void Portal::slotEditPaste() { slotStatusMsg(i18n("Inserting clipboard contents…")); slotStatusMsg(); } void Portal::slotStatusMsg(const QString &text) { /////////////////////////////////////////////////////////////////// // change status message permanently statusBar()->clearMessage(); if (text.isEmpty()) { if (_readOnlyMode) statusBar()->showMessage(i18n("Ready. Kraft is running in read only mode. Document editing is prohibited.")); else statusBar()->showMessage(i18n("Ready.")); } else { statusBar()->showMessage(text); } } /** Show the window with floskeltemplates */ void Portal::slotShowTemplates(){ } void Portal::slotOpenKatalog(const QString& kat) { // qDebug () << "opening Katalog " << kat; if ( mKatalogViews.contains( kat ) ) { // bring up the katalog view window. // qDebug () << "Katalog " << kat << " already open in a view"; mKatalogViews.value(kat)->show(); mKatalogViews.value(kat)->raise(); } else { QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) ); KatalogView *katView = nullptr; if( kat == MaterialKatalogView::MaterialCatalogName ) { /* Materialkatalog */ katView = new MaterialKatalogView(); } else { /* normaler Vorlagenkatalog */ katView = new TemplKatalogView(); } if ( katView ) { // qDebug () << katView; katView->init(kat); katView->show(); mKatalogViews.insert(kat, katView); KatalogMan::self()->registerKatalogListView( kat, katView->getListView() ); } QApplication::restoreOverrideCursor(); } } void Portal::slotOpenKatalog() { // qDebug () << "opening katalog!"; KatalogView *katView = new TemplKatalogView(); //this); katView->show(); } void Portal::slotKatalogToXML(const QString& katName) { // qDebug () << "Generating XML for catalog " << katName; Katalog *kat = KatalogMan::self()->getKatalog(katName); if(kat) { kat->writeXMLFile(); } } QString Portal::textWrap( const QString& t, int width, int maxLines ) { QString re; int lines = 0; if( t.length() <= width ) { re = t; } else { int start = 0; int pos = width; while( pos < t.length() && (lines < maxLines || maxLines < 0) ) { pos = t.indexOf( QLatin1Char('\n'), start ); if( pos > -1 && (pos-start) < width ) { re += t.mid(start, pos-start)+QLatin1Char('\n'); start = pos+1; } else { pos = t.indexOf( QLatin1Char(' '), start+width ); if( pos > -1 ) { re += t.mid( start, pos-start)+QLatin1Char('\n'); start = pos+1; } else { re += t.mid( start ); pos = t.length(); } } lines++; } if( lines == maxLines && pos != t.length() ) { re += QStringLiteral("…"); } } return re; } void Portal::preferences() { _prefsDialog = new PrefsDialog(this); connect( _prefsDialog, SIGNAL(finished(int)), SLOT(slotPrefsDialogFinished(int)) ); connect( _prefsDialog, SIGNAL(newOwnIdentity(const QString&, KContacts::Addressee)), SLOT(slotReceivedMyAddress(QString,KContacts::Addressee))); _prefsDialog->setMyIdentity( myContact, mAddressProvider->backendUp() ); _prefsDialog->open(); } void Portal::slotPrefsDialogFinished( int result ) { if( result == QDialog::Accepted) { } _prefsDialog->deleteLater(); } void Portal::slotHandbook() { QUrl url; QLocale *loc = DefaultProvider::self()->locale(); QString hbLocale; if (loc) { hbLocale = loc->bcp47Name(); } // find the localized version QString hbFile = DefaultProvider::self()->locateFile(QString("manual/kraft-%1.html").arg(hbLocale)); // if not found, fall back to the english manual QFileInfo fi(hbFile); if (hbFile.isEmpty() || !fi.exists()) { hbFile = DefaultProvider::self()->locateFile(QStringLiteral("manual/kraft-en.html")); } if( !hbFile.isEmpty() ) { url = QUrl::fromLocalFile(hbFile); qDebug() << "opening manual url" << url.toString(); } if (!url.isEmpty()) { QDesktopServices::openUrl(url); } } void Portal::slotAboutQt() { QApplication::aboutQt(); } void Portal::slotAboutKraft() { m_portalView->displaySystemsTab(); } QWidget* Portal::mainWidget() { return m_portalView.data(); } kraft-1.2.2/src/portal.h000066400000000000000000000142021467704360200150740ustar00rootroot00000000000000/*************************************************************************** portal.h - Portal view for Kraft ------------------- begin : Mar 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef PORTAL_H #define PORTAL_H // include files for Qt #include #include #include #include #include #include "docguardedptr.h" #include "katalogview.h" #include "dbids.h" #include "portalview.h" #include "reportgenerator.h" class KraftViewBase; class ArchDocDigest; class AddressProvider; class PrefsDialog; /** */ class Portal : public QMainWindow { Q_OBJECT friend class KraftView; public: /** construtor of Portal, calls all init functions to create the application. */ Portal( QWidget* parent = 0, QCommandLineParser *commandLineParser = 0, const char* name = 0); static QString textWrap(const QString& t, int width=40, int maxLines = -1 ); QWidget* mainWidget(); protected: /** initializes the QActions of the application */ void initActions(); /** creates the centerwidget of the KTMainWindow instance and sets it as the view */ void initView(); /** queryClose is called by KTMainWindow on each closeEvent of a window. Against the * default implementation (only returns true), this calles saveModified() on the document object to ask if the document shall * be saved if Modified; on cancel the closeEvent is rejected. * @see KTMainWindow#queryClose * @see KTMainWindow#closeEvent */ virtual bool queryClose(); /** queryExit is called by KTMainWindow when the last window of the application is going to be closed during the closeEvent(). * Against the default implementation that just returns true, this calls saveOptions() to save the settings of the last window's * properties. * @see KTMainWindow#queryExit * @see KTMainWindow#closeEvent */ virtual bool queryExit(); protected slots: void slotStartupChecks(); void slotOpenArchivedDoc( const ArchDocDigest& ); void slotExportXRechnungArchivedDoc(const ArchDocDigest&); void slotXRechnungCurrentDocument(); void slotPrefsDialogFinished( int ); void slotDocConverted(ReportFormat format, const QString& file, const KContacts::Addressee& customerContact); void slotDocConvertionFail(const QString& failString, const QString &details); void openInMailer(const QString& fileName, const KContacts::Addressee& contact); public slots: /** closes all open windows, then quits the application. */ void closeEvent( QCloseEvent * event ); /** put the marked text/object into the clipboard and remove * it from the document */ void slotEditCut(); /** put the marked text/object into the clipboard */ void slotEditCopy(); /** paste the clipboard into the document */ void slotEditPaste(); /** changes the statusbar contents for the standard label permanently, used to indicate current actions. * @param text the text that is displayed in the statusbar */ void slotStatusMsg(const QString &text = QString()); /** Show the window with floskeltemplates */ void slotShowTemplates(); void slotOpenKatalog(const QString& ); void slotOpenKatalog(); void slotKatalogToXML(const QString&); void preferences(); void slotNewDocument(); void slotCopyCurrentDocument(); void slotCopyDocument( const QString& ); void slotOpenDocument( const QString& ); void slotOpenCurrentDocument(); void slotViewCurrentDocument(); void slotViewDocument( const QString& ); void slotFollowUpDocument(); void slotDocumentSelected( const DocDigest& ); void slotArchivedDocExecuted(); void slotArchivedDocSelected( const ArchDocDigest& ); void slotPrintCurrentDocument(); void slotPrintDocument( const QString&, const dbID& ); void slotViewClosed( bool, DocGuardedPtr ); void slotEditTagTemplates(); void slotReconfigureDatabase(); void slotAboutQt(); void slotAboutKraft(); void slotHandbook(); void busyCursor( bool ); void slotMailDocument(); void slotOpenPdf( const QString& ); void slotReceivedMyAddress( const QString&, const KContacts::Addressee& ); private: void createView( DocGuardedPtr ); void createROView( DocGuardedPtr ); void savePdfInCustomerStructure(const QString& fileName); QScopedPointer m_portalView; // QAction pointers to enable/disable actions QAction* _actFileQuit; QAction* _actEditCut; QAction* _actEditCopy; QAction* _actEditPaste; QAction* _actAboutQt; QAction* _actAboutKraft; QAction* _actHandbook; QAction* _actPreferences; QAction* _actReconfDb; QAction* _actNewDocument; QAction* _actCopyDocument; QAction* _actOpenDocument; QAction* _actViewDocument; QAction* _actFollowDocument; QAction* _actPrintDocument; QAction* _actMailDocument; QAction* _actXRechnung; QAction* _actEditTemplates; QAction* _actOpenArchivedDocument; QAction* _actViewFlosTemplates; QCommandLineParser *mCmdLineArgs; QMap mKatalogViews; QMap mViewMap; AddressProvider *mAddressProvider; KContacts::Addressee myContact; PrefsDialog *_prefsDialog; DocGuardedPtr _currentDoc; ReportGenerator _reportGenerator; bool _readOnlyMode; }; #endif kraft-1.2.2/src/portalhtmlview.cpp000066400000000000000000000032271467704360200172140ustar00rootroot00000000000000/*************************************************************************** portalhtmlview.cpp - show a html page in the portal ------------------- begin : Jan 2007 copyright : (C) 2007 Klaas Freitag ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "portalhtmlview.h" #include #include PortalHtmlView::PortalHtmlView( QWidget *parent ) : HtmlView( parent ) { connect( this, SIGNAL(openUrl(QUrl)), this, SLOT(slotLinkClicked(QUrl))); } void PortalHtmlView::slotLinkClicked(const QUrl& url) { QUrlQuery q(url); const QString katName = q.queryItemValue(QLatin1String("kat")); const QString action = q.queryItemValue(QLatin1String("action")); if ( action == QLatin1String("open") ) { // qDebug () << "open catalog " << katName; emit( openCatalog( katName ) ); } else { if( url.isValid() ) { QDesktopServices::openUrl(url); } } } kraft-1.2.2/src/portalhtmlview.h000066400000000000000000000024121467704360200166540ustar00rootroot00000000000000 /*************************************************************************** portalhtmlview.h - show a html page in the portal ------------------- begin : Jan 2007 copyright : (C) 2007 Klaas Freitag ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef PORTALHTMLVIEW_H #define PORTALHTMLVIEW_H #include "htmlview.h" class PortalHtmlView : public HtmlView { Q_OBJECT public: PortalHtmlView( QWidget *parent ); signals: void openCatalog( const QString& ); protected slots: void slotLinkClicked(const QUrl& url); }; #endif kraft-1.2.2/src/portalview.cpp000066400000000000000000000414421467704360200163300ustar00rootroot00000000000000/*************************************************************************** portalview.cpp - the main portal class ------------------- begin : 2004-05-09 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include #include #include #include #include "version.h" #include "kraftdb.h" #include "portalview.h" #include "portalhtmlview.h" #include "katalogman.h" #include "alldocsview.h" #include "documentman.h" #include "defaultprovider.h" #include "reportgenerator.h" #include "texttemplate.h" #include "format.h" PortalView::PortalView(QWidget *parent, const char*) : QWidget( parent ), _allDocsView(nullptr), mCatalogBrowser(nullptr), mSystemBrowser(nullptr) { const QSize iSize{64,64}; _contentsWidget = new QListWidget(this); _contentsWidget->setViewMode(QListView::IconMode); _contentsWidget->setIconSize(iSize); _contentsWidget->setMovement(QListView::Static); _contentsWidget->setMaximumWidth(132); _contentsWidget->setSpacing(0); _pagesWidget = new QStackedWidget(this); _pagesWidget->addWidget(documentDigests()); _pagesWidget->addWidget(new QWidget()); // doc timeline _pagesWidget->addWidget(katalogDetails()); // catalogs _sysPageIndx = _pagesWidget->addWidget(systemDetails()); // system createIcons(iSize); _contentsWidget->setCurrentRow(0); QHBoxLayout *horizontalLayout = new QHBoxLayout; QVBoxLayout *vbox = new QVBoxLayout; vbox->addWidget(_contentsWidget); QPushButton *pb = new QPushButton(i18n("About Kraft")); pb->setIcon(DefaultProvider::self()->icon("kraft-simple")); vbox->addWidget(pb); connect(pb, &QPushButton::clicked, this, &PortalView::displaySystemsTab); horizontalLayout->addLayout(vbox); horizontalLayout->addWidget(_pagesWidget, 1); setLayout(horizontalLayout); } PortalView::~PortalView( ) { } void PortalView::createIcons(const QSize& iconSize) { QSize sHint{128, 100}; // Scale the icon via a pixmap, as in AppImages, for some reasons the icons are small // stackoverflow reports that svg icons cannot be scaled up. auto icon = [iconSize](const QIcon& i) { const QPixmap pix = i.pixmap(iconSize); QIcon icon(pix); QList sizes = icon.availableSizes(); qDebug() << "III" << sizes; return icon; }; QListWidgetItem *documentsButton = new QListWidgetItem(_contentsWidget); documentsButton->setIcon(icon(DefaultProvider::self()->icon("file-description"))); documentsButton->setText(i18n("Documents")); documentsButton->setTextAlignment(Qt::AlignHCenter); documentsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); documentsButton->setSizeHint(sHint); QListWidgetItem *timeLineButton = new QListWidgetItem(_contentsWidget); timeLineButton->setIcon(icon(DefaultProvider::self()->icon("file-chart"))); timeLineButton->setText(i18n("Timeline")); timeLineButton->setTextAlignment(Qt::AlignHCenter); timeLineButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); timeLineButton->setSizeHint(sHint); QListWidgetItem *catButton = new QListWidgetItem(_contentsWidget); catButton->setIcon(icon(DefaultProvider::self()->icon("book"))); catButton->setText(i18n("Catalogs")); catButton->setTextAlignment(Qt::AlignHCenter); catButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); catButton->setSizeHint(sHint); connect( _contentsWidget, &QListWidget::itemClicked, this, &PortalView::changePage); } void PortalView::changePage(QListWidgetItem *current) { if (!current) return; int indx = _contentsWidget->row(current); if( indx == 0 ) { // the flat documents list _allDocsView->setView( AllDocsView::FlatList ); } else if( indx == 1 ) { // the timeline _allDocsView->setView( AllDocsView::TreeView ); indx = 0; } _pagesWidget->setCurrentIndex(indx); } void PortalView::displaySystemsTab() { _pagesWidget->setCurrentIndex(_sysPageIndx); } QWidget* PortalView::katalogDetails() { QWidget *w = new QWidget; QBoxLayout *b = new QHBoxLayout; w->setLayout( b ); mCatalogBrowser = new PortalHtmlView( w ); mCatalogBrowser->setTitle( i18n( "Kraft Document Overview" ) ); mCatalogBrowser->setStylesheetFile( "catalogview.css" ); b->addWidget( mCatalogBrowser ); QString html; html = "

              " + i18n("Available Catalogs") + "

              "; html += "
              \n"; html += i18n( "No catalogs available." ); html += "
              "; mCatalogBrowser->displayContent( html ); connect( mCatalogBrowser, SIGNAL( openCatalog( const QString& ) ), SIGNAL( openKatalog( const QString& ) ) ); return w; } void PortalView::fillCatalogDetails() { if ( ! mCatalogBrowser ) return; const QStringList katalogNamen = KatalogMan::self()->allKatalogNames(); QString html; html = QStringLiteral("

              ") + i18n("Available Catalogs") + QStringLiteral("

              "); html += QStringLiteral("
              \n"); int cnt = 0; for(QStringList::ConstIterator namesIt = katalogNamen.begin(); namesIt != katalogNamen.end(); ++namesIt ) { QString katName = *namesIt; html += printKatLine( katName, cnt++ ); } html += QStringLiteral("
              \n"); mCatalogBrowser->displayContent( html ); } QString PortalView::printKatLine( const QString& name, int cnt ) const { QString urlName = name.toHtmlEscaped(); // qDebug () << "Converted Katalog name: " << urlName; QString html; html += "
              "+urlName+"
              "; html += ""; html += i18n("Open"); html += ""; KatalogMan::CatalogDetails details = KatalogMan::self()->catalogDetails(name); html += "%1").arg(i18n("No templates yet.")); } else { const QString dateStr = Format::toDateString(details.maxModDate.date(), Format::DateFormatGerman); html += QString("") + i18n("%1 templates in %2 chapters
              last modified at %3", details.countEntries, details.countChapters, dateStr) + QLatin1String(""); } html += "\n"; return html; } QString PortalView::ptag( const QString& content, const QString& c ) const { QString html( "setLayout( b ); mSystemBrowser = new PortalHtmlView( w ); b->addWidget( mSystemBrowser ); mSystemBrowser->setStylesheetFile( "systemview.css" ); return w; } QString PortalView::systemView( const QString& htmlMsg ) const { if ( ! mSystemBrowser ) return QString (""); const QString templateName = ( htmlMsg.isNull() ? QString( "views/systemviewdetails.thtml" ) : QString ( "views/systemviewerror.thtml" ) ); const QString tmplFile = DefaultProvider::self()->locateFile( templateName ); // Note: This code is stolen from DocDigestDetailView::slotShowDocDetails // It should be refactored. TextTemplate tmpl; tmpl.setTemplateFileName(tmplFile); if( !tmpl.isOk() ) { return QString (""); } const QString logoFile = DefaultProvider::self()->locateFile("styles/pics/kraftapp_logo_trans.png" ); tmpl.setValue( "KRAFT_LOGO_FILE", logoFile ); tmpl.setValue( "KRAFT_WEBSITE", i18n( "Kraft Website" ) ); QDate d = QDate::currentDate(); tmpl.setValue( "KRAFT_COPYRIGHT_YEAR", QString::number(d.year()) ); tmpl.setValue( "KRAFT_LICENSE_TEXT", i18nc("The string is followed by a link to the GPL2 text", "Kraft is free software licensed under the")); tmpl.setValue( "KRAFT_GITHUB", i18nc("The string is followed by the link to github", "Kraft is maintained on ")); tmpl.setValue( "KRAFT_AUTHORS", i18n("Authors")); tmpl.setValue( "KRAFT_MAINTAINER", i18n("Developer and Maintainer")); tmpl.setValue( "KRAFT_DEVELOPER", i18n("Developer")); tmpl.setValue( "KRAFT_GRAPHICS", i18nc("The person who provided the logo graphics", "Logo design")); tmpl.setValue( "KRAFT_MANUAL", i18nc("The person who provided the user manual", "User Manual")); // kraft infos tmpl.setValue("KRAFT_INTRO_DESC", i18n("Kraft helps you to handle documents like quotes and invoices in your small business.")); tmpl.setValue( "KRAFT_WELCOME_LABEL", i18n( "Welcome to Kraft" ) ); tmpl.setValue( "KRAFT_VERSION_LABEL", i18n( "Kraft version" ) ); tmpl.setValue( "KRAFT_VERSION", Kraft::Version::number()); tmpl.setValue( "KRAFT_CODENAME_LABEL", i18n( "Codename" ) ); tmpl.setValue( "KRAFT_CODENAME", Kraft::Version::codeName() ); const QString feedbackTmpl{i18n("# How do you like Kraft overall?\n\n" "# What kind of business do you run?\n\n" "# In which country are you working?\n\n" "# Are you planning to continue with Kraft?\n\n" "# What else do you want to tell us?\n\n")}; tmpl.setValue( "KRAFT_FEEDBACK_TEMPLATE", feedbackTmpl); tmpl.setValue( "KRAFT_FEEDBACK", i18n("Send Feedback to the Kraft Authors") ); // string like // git sha on branch built on () tmpl.setValue( "GIT_BRANCH", Kraft::Version::gitBranch()); tmpl.setValue( "GIT_SHA1", Kraft::Version::gitSha()); tmpl.setValue( "BUILD_HOST", Kraft::Version::buildHost()); tmpl.setValue( "BUILD_HOST_DISTRO", Kraft::Version::buildHostDistro()); tmpl.setValue( "GIT_BUILD_LABEL", i18n("Git information")); tmpl.setValue( "GIT_BUILD_STRING", QString("git sha %1 on branch %2 built on %3 (%4)") .arg(Kraft::Version::gitSha()) .arg(Kraft::Version::gitBranch()) .arg(Kraft::Version::buildHost()) .arg(Kraft::Version::buildHostDistro())); const QString countryName = DefaultProvider::self()->locale()->nativeCountryName(); tmpl.setValue( "COUNTRY_SETTING_LABEL", i18n( "Country setting" ) ); tmpl.setValue( "COUNTRY_SETTING", QString( "%1 (%2)" ).arg( countryName ).arg( DefaultProvider::self()->locale()->country() )); const QString languageName = DefaultProvider::self()->locale()->nativeLanguageName(); tmpl.setValue( "LANGUAGE_SETTING_LABEL", i18n( "Language setting" ) ); tmpl.setValue( "LANGUAGE_SETTING", QString( "%1 (%2)" ).arg( languageName ).arg( DefaultProvider::self()->locale()->language() )); if ( !htmlMsg.isNull() ) { tmpl.setValue( "ERROR_TITLE_LABEL", i18n( "Kraft Initialisation Problem" ) ); QString errorMessage = i18n( "There is a initialisation error on your system. Kraft will not work that way." ); errorMessage += htmlMsg; tmpl.setValue( "ERROR_TEXT", errorMessage ); return tmpl.expand(); } // database infos tmpl.setValue( "DATABASE_TITLE_LABEL", i18n( "Database Information" ) ); tmpl.setValue( "DATABASE_NAME_LABEL", i18n( "Kraft database name" ) ); tmpl.setValue( "DATABASE_NAME", KraftDB::self()->databaseName() ); QString schemaVersion = QString::number( KraftDB::self()->currentSchemaVersion() ); if ( KraftDB::self()->currentSchemaVersion() != Kraft::Version::dbSchemaVersion() ) { schemaVersion += " - " + QString( "%1: %2" ).arg( i18n ( "Required Version" )) .arg( Kraft::Version::dbSchemaVersion() ); } tmpl.setValue( "DATABASE_SCHEMA_VERSION_LABEL", i18n( "Database schema version" ) ); tmpl.setValue( "DATABASE_SCHEMA_VERSION", schemaVersion ); tmpl.setValue( "DATABASE_DRIVER_LABEL", i18n( "Qt database driver" ) ); tmpl.setValue( "DATABASE_DRIVER", KraftDB::self()->qtDriver() ); bool dbOk = KraftDB::self()->getDB()->isOpen(); const QString databaseConnection = ( dbOk ? i18n("established") : QString( "%1" ).arg( i18n( "NOT AVAILABLE!" ) ) ); tmpl.setValue( "DATABASE_CONNECTION_LABEL", i18n( "Database connection" ) ); tmpl.setValue( "DATABASE_CONNECTION", databaseConnection ); if( dbOk ) { QSqlQuery q("SHOW VARIABLES like 'version';"); if( q.isActive() ) { q.next(); const QString version = q.value(1).toString(); tmpl.createDictionary("DATABASE_VERSION_SECTION"); tmpl.setValue( "DATABASE_VERSION_SECTION", "DATABASE_VERSION_LABEL", i18n( "Database Version" ) ); tmpl.setValue( "DATABASE_VERSION_SECTION", "DATABASE_VERSION", version ); } } // Akonadi and friends QScopedPointer aprov; aprov.reset( new AddressProvider); tmpl.setValue( "ADDRESSBOOK_BACKEND_LABEL", i18n( "Addressbook Backend" ) ); tmpl.setValue( "ADDRESSBOOK_BACKEND_TYPE_LABEL", i18n( "Backend type" ) ); const QString backendTypeValue = QString( "%1 (%2)").arg( aprov->backendName()) .arg(aprov->backendUp() ? i18n("running") : i18n("not running") ); tmpl.setValue( "ADDRESSBOOK_BACKEND_TYPE", backendTypeValue ); // external tools tmpl.setValue( "EXTERNAL_TOOLS_LABEL", i18n( "External Tools" ) ); tmpl.setValue( "RML2PDF_TOOL_LABEL", i18n( "RML to PDF conversion tool" ) ); const QStringList trml2pdf = DefaultProvider::self()->locatePythonTool("erml2pdf.py"); QString trml2pdfValue = (trml2pdf.count() ? trml2pdf.join(" ") : i18n("not found!") ); tmpl.setValue( "RML2PDF_TOOL", trml2pdfValue ); tmpl.setValue( "ICONV_TOOL_LABEL", i18n( "iconv tool for text import" ) ); tmpl.setValue( "ICONV_TOOL", DefaultProvider::self()->iconvTool() ); tmpl.setValue( "WEASYPRINT_TOOL_LABEL", i18n( "weasyprint for PDF generation" ) ); QString wp = DefaultProvider::self()->locateBinary("weasyprint"); if (wp.isEmpty()) { wp = i18n("not available"); } tmpl.setValue( "WEASYPRINT_TOOL", wp); // aknowledgement tmpl.setValue( "ICON_ACKNOWLEDGEMENT_LABEL", i18n("Some Icons are made by") ); tmpl.setValue( "ACKNOWLEGEMENT_LABEL", i18n( "Acknowledgements" ) ); return tmpl.expand(); } void PortalView::fillSystemDetails() { const QString html = systemView( QString() ); mSystemBrowser->displayContent( html ); } void PortalView::systemInitError( const QString& htmlMsg ) { const QString html = systemView( htmlMsg ); mSystemBrowser->displayContent( html ); } QWidget* PortalView::documentDigests() { QWidget *w = new QWidget; QBoxLayout *b = new QHBoxLayout; b->setContentsMargins( 0, 0, 0, 0 ); w->setLayout( b ); _allDocsView = new AllDocsView( w ); b->addWidget( _allDocsView ); connect( _allDocsView, &AllDocsView::createDocument, this, &PortalView::slotCreateDocument); connect( _allDocsView, &AllDocsView::openDocument, this, &PortalView::openDocument); connect( _allDocsView, &AllDocsView::viewDocument, this, &PortalView::viewDocument); connect( _allDocsView, &AllDocsView::copyDocument, this, &PortalView::copyDocument); connect( _allDocsView, &AllDocsView::openArchivedDocument, this, &PortalView::openArchivedDocument); connect( _allDocsView, &AllDocsView::exportXRechnungArchivedDocument, this, &PortalView::exportXRechnungArchivedDocument); connect( _allDocsView, &AllDocsView::docSelected , this, &PortalView::documentSelected ); connect( _allDocsView, &AllDocsView::openArchivedDocument, this, &PortalView::archivedDocSelected ); return w; } void PortalView::slotCreateDocument() { // this slot is called if the user wants to initiate the creation of a new doc // It is routed to higher layers. emit createDocument(); } void PortalView::slotBuildView() { // QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) ); _allDocsView->slotBuildView(); // QApplication::restoreOverrideCursor(); } /* END */ kraft-1.2.2/src/portalview.h000066400000000000000000000052151467704360200157730ustar00rootroot00000000000000/*************************************************************************** portalview.h ------------------- begin : 2004-05-09 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _PORTALVIEW_H #define _PORTALVIEW_H #include #include #include // include files #include "docguardedptr.h" /** * */ class QWidget; class AllDocsView; class dbID; class PortalHtmlView; class ArchDocDigest; class DocDigest; class PortalView : public QWidget { Q_OBJECT public: PortalView (QWidget *parent=0, const char *name=0 ); ~PortalView(); AllDocsView* docDigestView() { return _allDocsView; } void systemInitError( const QString& ); QString ptag( const QString&, const QString& c = QString() ) const; public slots: void slotBuildView(); void fillCatalogDetails(); void fillSystemDetails(); void displaySystemsTab(); protected slots: void slotCreateDocument(); private slots: void changePage(QListWidgetItem *current); signals: void openKatalog( const QString& ); void katalogToXML( const QString& ); void createDocument(); void openDocument( const QString& ); void copyDocument( const QString& ); void viewDocument( const QString& ); void openArchivedDocument( const ArchDocDigest& ); void exportXRechnungArchivedDocument( const ArchDocDigest&); void documentSelected( const DocDigest& ); void archivedDocSelected( const ArchDocDigest& ); private: QString printKatLine( const QString&, int ) const; void createIcons(const QSize &iconSize); QWidget *katalogDetails(); QWidget *systemDetails(); QWidget *documentDigests(); QString systemView( const QString& ) const; AllDocsView *_allDocsView; PortalHtmlView *mCatalogBrowser; PortalHtmlView *mSystemBrowser; QListWidget *_contentsWidget; QStackedWidget *_pagesWidget; int _sysPageIndx; }; #endif /* END */ kraft-1.2.2/src/positionviewwidget.cpp000066400000000000000000000533071467704360200201020ustar00rootroot00000000000000/*************************************************************************** positionviewwidget - inherited class for doc position views. ------------------- begin : 2006-02-20 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include "positionviewwidget.h" #include "geld.h" #include "kraftsettings.h" #include "defaultprovider.h" #include "itemtagdialog.h" #include "tagman.h" PositionViewWidget::PositionViewWidget() :QWidget(), Ui_positionWidget(), mModified( false ), m_skipModifiedSignal( false ), mToDelete(false), mOrdNumber(0), mPositionPtr( 0 ), mExecPopup( new QMenu( this ) ) , mStateSubmenu( 0 ), mState( Active ), mKind( Normal ), mPositionPriceValid( false ), mLocale( 0 ) { setupUi( this ); m_sbUnitPrice->setMinimum( -999999.99 ); m_sbUnitPrice->setMaximum( 999999.99 ); m_sbUnitPrice->setDecimals( 2 ); const QString currSymbol = DefaultProvider::self()->locale()->currencySymbol(); m_sbUnitPrice->setSuffix(" " + currSymbol); m_sbAmount->setMinimum( -999999.99 ); m_sbAmount->setMaximum( 999999.99 ); m_sbAmount->setDecimals( 2 ); mDiscountPercent->setMinimum( -100.0 ); mDiscountPercent->setMaximum( 9999.99 ); mDiscountPercent->setDecimals( 2 ); pbExec->setCheckable( false ); pbExec->setIcon( DefaultProvider::self()->icon( "tool") ); pbTagging->setCheckable( false ); pbTagging->setIcon( DefaultProvider::self()->icon( "flag" ) ); connect( m_sbAmount, SIGNAL( valueChanged( double )), this, SLOT( slotRefreshPrice( ) ) ); connect( m_sbUnitPrice, SIGNAL( valueChanged( double )), this, SLOT( slotRefreshPrice( ) ) ); connect( mDiscountPercent, SIGNAL( valueChanged( double ) ), this, SLOT( slotRefreshPrice() ) ); connect( pbExec, SIGNAL( pressed() ), this, SLOT( slotExecButtonPressed() ) ); connect( pbTagging, SIGNAL( pressed() ), this, SLOT( slotTaggingButtonPressed() ) ); /* modified signals */ connect( m_cbUnit, SIGNAL( activated(int) ), this, SLOT( slotModified() ) ); connect( m_teFloskel, SIGNAL( textChanged() ), this, SLOT( slotModified() ) ); connect( m_sbAmount, SIGNAL( valueChanged(double)), this, SLOT( slotModified() ) ); connect( m_sbUnitPrice, SIGNAL( valueChanged(double)), this, SLOT( slotModified() ) ); connect( mDiscountPercent, SIGNAL( valueChanged( double ) ), this, SLOT( slotModified() ) ); connect( mDiscountTag, SIGNAL( activated( int ) ), this, SLOT( slotModified() ) ); mExecPopup->setTitle(i18n("Item Actions") ); // state submenu: mStateSubmenu = mExecPopup->addMenu(i18n( "Item Kind" )); mStateSubmenu->addAction( i18n( "Normal" ), this, SIGNAL( positionStateNormal() ) ); mStateSubmenu->addAction( DefaultProvider::self()->icon( "arrow-ramp-right" ), i18n( "Alternative" ), this, SIGNAL( positionStateAlternative() ) ); mStateSubmenu->addAction( DefaultProvider::self()->icon( "arrow-move-right" ), i18n( "On Demand" ), this, SIGNAL( positionStateDemand() ) ); // mExecPopup->addSeparator(); // mTaxSubMenu mTaxSubmenu = mExecPopup->addMenu(i18n( "Tax" )); QActionGroup *agroup = new QActionGroup( this ); agroup->setExclusive ( true ); mNilTaxAction = new QAction( DefaultProvider::self()->icon("circle-0"), i18n("Taxfree Item"), this ); connect( mNilTaxAction, SIGNAL(triggered()), this, SLOT(slotSetNilTax()) ); mNilTaxAction->setCheckable( true ); agroup->addAction( mNilTaxAction ); mTaxSubmenu->addAction( mNilTaxAction ); mRedTaxAction = new QAction( DefaultProvider::self()->icon("circle-half-2"), i18n("Reduced Tax"), this ); connect( mRedTaxAction, SIGNAL(triggered()), this, SLOT(slotSetReducedTax())); mRedTaxAction->setCheckable( true ); agroup->addAction( mRedTaxAction ); mTaxSubmenu->addAction( mRedTaxAction ); mFullTaxAction = new QAction( DefaultProvider::self()->icon("coin"), i18n("Full Tax"), this ); connect( mFullTaxAction, SIGNAL(triggered()), this, SLOT(slotSetFullTax())); mFullTaxAction->setCheckable( true ); agroup->addAction( mFullTaxAction ); mTaxSubmenu->addAction( mFullTaxAction ); mExecPopup->addSeparator(); mExecPopup->addAction( DefaultProvider::self()->icon("arrow-up"), i18n("Move Up"), this, SIGNAL( moveUp() ) ); mExecPopup->addAction( DefaultProvider::self()->icon("arrow-down"), i18n("Move Down"), this, SIGNAL( moveDown() ) ); mLockId = mExecPopup->addAction( DefaultProvider::self()->icon("lock"), i18n("Lock Item"), this, SIGNAL( lockPosition() ) ); mUnlockId = mExecPopup->addAction( DefaultProvider::self()->icon("lock-open"), i18n("Unlock Item"), this, SIGNAL( unlockPosition() ) ); mDeleteId = mExecPopup->addAction( DefaultProvider::self()->icon("minus"), i18n("Delete Item"), this, SIGNAL( deletePosition() ) ); connect(this, &PositionViewWidget::positionStateNormal, this, [this]() { slotSetPositionKind(Normal, true); slotRefreshPrice(); emit positionModified(); } ); connect(this, &PositionViewWidget::positionStateAlternative, this, [this]() { slotSetPositionKind(Alternative, true); slotRefreshPrice(); emit positionModified(); } ); connect(this, &PositionViewWidget::positionStateDemand, this, [this]() { slotSetPositionKind(Demand, true); slotRefreshPrice(); emit positionModified(); } ); connect(this, &PositionViewWidget::lockPosition, this, &PositionViewWidget::slotLockPosition); connect(this, &PositionViewWidget::unlockPosition, this, &PositionViewWidget::slotUnlockPosition); connect( mExecPopup, &QMenu::aboutToShow, this, &PositionViewWidget::slotMenuAboutToShow); connect( mExecPopup, &QMenu::aboutToHide, this, &PositionViewWidget::slotMenuAboutToHide); mUnlockId->setEnabled(false); lStatus->setPixmap( QPixmap() ); lKind->setPixmap( QPixmap() ); this->setAutoFillBackground(true); this->setBaseSize(this->width(), 100); this->layout()->setMargin( 6 ); } void PositionViewWidget::setDocPosition( DocPositionBase *dp) { if( ! dp ) { qCritical() << "setDocPosition got empty position!"; return; } DocPosition *pos = static_cast(dp); // FIXME: Do not keep this pointer ... mPositionPtr = pos; m_skipModifiedSignal = true; m_teFloskel->setPlainText( pos->text() ); lStatus->hide(); lKind->hide(); AttributeMap amap = dp->attributes(); QString unit = pos->unit().einheitSingular(); m_cbUnit->setCurrentIndex(m_cbUnit->findText( unit )); if( dp->type() == DocPositionBase::Position ) { positionDetailStack->setCurrentWidget( positionPage ); m_sbAmount->blockSignals( true ); m_sbAmount->setValue( pos->amount() ); m_sbAmount->blockSignals( false ); m_sbUnitPrice->blockSignals( true ); m_sbUnitPrice->setValue( pos->unitPrice().toDouble() ); m_sbUnitPrice->blockSignals( false ); if ( amap.containsUndeleted( DocPosition::Kind ) ) { Attribute kindAttr = amap[DocPosition::Kind]; const QString kindStr = kindAttr.value().toString(); Kind kind = techStringToKind(kindStr); slotSetPositionKind(kind, false); } else { slotSetPositionKind(Kind::Normal, false); } // qDebug () << "Setting position ptr. in viewwidget: " << pos; } else if ( dp->type() == DocPositionBase::ExtraDiscount ) { positionDetailStack->setCurrentWidget( discountPage ); // qDebug() << " " << dp->type(); Attribute discount = amap[DocPosition::Discount]; mDiscountPercent->setValue( discount.value().toDouble() ); QString selTag; if ( amap.contains( DocPosition::ExtraDiscountTagRequired ) ) { Attribute tagSelector = amap[DocPosition::ExtraDiscountTagRequired]; const TagTemplate tt = TagTemplateMan::self()->getTagTemplateFromId(tagSelector.value().toString()); selTag = tt.name(); } /* Fill and set the extra discount selection combo */ const QString allPos = i18n( "All items" ); mDiscountTag->addItem( allPos ); // , i18n( "Overall Position Discount" ) ); QStringList taglist = TagTemplateMan::self()->allTagTemplates(); QString currentEntry = allPos; for ( QStringList::Iterator tagIt = taglist.begin(); tagIt != taglist.end(); ++tagIt ) { QString tagger; TagTemplate tmpl = TagTemplateMan::self()->getTagTemplate( *tagIt ); QPixmap pix( 16, 12 ); pix.fill( tmpl.color() ); tagger = i18n( "%1-tagged items", *tagIt ); mDiscountTag->addItem(pix, tagger); if ( selTag == *tagIt ) { currentEntry = tagger; } } mDiscountTag->setCurrentIndex(mDiscountTag->findText( currentEntry )); } else { // qDebug () << "unknown doc position type " << dp->type(); } slotSetOverallPrice( currentPrice() ); // set tags marked mTags = dp->tags(); slotUpdateTagToolTip(); slotSetTax( dp->taxType() ); m_skipModifiedSignal = false; } void PositionViewWidget::slotShowPrice( bool show ) { m_sumLabel->setVisible(show); m_sbUnitPrice->setVisible(show); } void PositionViewWidget::slotUpdateTagToolTip() { QString tip; bool first = true; if ( mTags.count() == 1 ) { tip = i18n( "Tag: %1", mTags.first() ); } else if ( mTags.count() > 1 ) { tip = i18n( "Tags:
                " ); for ( QStringList::Iterator it = mTags.begin(); it != mTags.end(); ++it ) { if ( first ) { tip += QString( "
              • %1
              • " ).arg( *it ); first = false; } else { tip += QString( "
              • %1
              • " ).arg( *it ); } } tip += "
              "; } else { tip = i18n( "No tags assigned yet." ); } pbTagging->setToolTip( tip ); } QString PositionViewWidget::extraDiscountTagRestriction() { QStringList taglist = TagTemplateMan::self()->allTagTemplates(); int currentItem = mDiscountTag->currentIndex(); if ( currentItem > 0 && currentItem <= taglist.count() ) { // subtract one for the "all items" entry in the combo box at first position currentItem -= 1; return taglist[currentItem]; } else { // qDebug () << "taglist index possibly out of range!"; } return QString(); } void PositionViewWidget::slotTaggingButtonPressed() { // qDebug () << "opening tagging dialog"; ItemTagDialog dia( 0 ); dia.setPositionTags( mTags ); if ( dia.exec() ) { mTags = dia.getSelectedTags(); slotUpdateTagToolTip(); slotModified(); update(); // qDebug () << "Selected tags: " << mTags.join( ", " ); } } void PositionViewWidget::slotSetNilTax() { slotSetTax( DocPositionBase::TaxNone ); } void PositionViewWidget::slotSetReducedTax() { slotSetTax( DocPositionBase::TaxReduced ); } void PositionViewWidget::slotSetFullTax() { slotSetTax( DocPositionBase::TaxFull ); } void PositionViewWidget::slotSetTax( DocPosition::TaxType tt ) { mTax = tt; QString icon; if( tt == DocPositionBase::TaxFull ) { icon = QString::fromLatin1("coin"); mFullTaxAction->setChecked( true ); } else if( tt == DocPositionBase::TaxReduced ) { icon = QString::fromLatin1("circle-half-2"); mRedTaxAction->setChecked( true ); } else if( tt == DocPositionBase::TaxNone ) { icon = QString::fromLatin1("circle-0"); mNilTaxAction->setChecked( true ); } mTaxSubmenu->setIcon( DefaultProvider::self()->icon( icon )); emit positionModified(); } void PositionViewWidget::slotAllowIndividualTax( bool allow ) { mFullTaxAction->setEnabled(allow); mRedTaxAction->setEnabled(allow); mNilTaxAction->setEnabled(allow); mTaxSubmenu->setEnabled( allow ); } DocPositionBase::TaxType PositionViewWidget::taxType() const { return mTax; } void PositionViewWidget::slotExecButtonPressed() { // qDebug () << "Opening Context Menu over exec button"; // set bg-color mExecPopup->popup( QWidget::mapToGlobal( pbExec->pos() ) ); } void PositionViewWidget::slotMenuAboutToShow() { QPalette palette; palette.setColor(this->backgroundRole(), QColor("#757476")); this->setPalette(palette); } void PositionViewWidget::slotMenuAboutToHide() { // qDebug () << "Set normal again"; QPalette palette; setPalette( palette ); pbExec->setChecked(false); } void PositionViewWidget::slotLockPosition( ) { slotSetState( Locked ); } void PositionViewWidget::slotUnlockPosition( ) { slotSetState( Active ); } void PositionViewWidget::slotEnableKindMenu( bool s ) { mStateSubmenu->setEnabled( s ); } QString PositionViewWidget::stateString( const State& state ) const { QString str; if( state == Active ) { str = i18n( "Active" ); } else if( state == New ) { str = i18n( "New" ); } else if( state == Deleted ) { str = i18n( "Deleted" ); } else if( state == Locked ) { str = i18n( "Locked" ); } else { str = i18n( "Unknown" ); } return str; } void PositionViewWidget::slotSetState( State state ) { mState = state; // qDebug () << "Setting new widget state " << stateString( state ); if( state == Active ) { mLockId->setEnabled( true ); mUnlockId->setEnabled( false ); lStatus->hide(); lStatus->setPixmap( QPixmap() ); mToDelete = false; slotSetEnabled( true ); } else if( state == New ) { lStatus->setPixmap( DefaultProvider::self()->icon("file-plus").pixmap(QSize(20,20))); lStatus->show(); } else if( state == Deleted ) { lStatus->setPixmap( DefaultProvider::self()->icon( "minus" ).pixmap(QSize(20,20)) ); lStatus->show(); mToDelete = true; slotSetEnabled( false ); } else if( state == Locked ) { mLockId->setEnabled( false ); mUnlockId->setEnabled( true ); slotSetEnabled( false ); lStatus->setPixmap( DefaultProvider::self()->icon( "lock" ).pixmap(QSize(20,20))); lStatus->show(); } } void PositionViewWidget::setOrdNumber(int o) { mOrdNumber = o; if( mModified ) { QColor c( "darkred" ); QPalette palette = m_labelPosition->palette(); palette.setColor(m_labelPosition->foregroundRole(), c); m_labelPosition->setPalette(palette); } m_labelPosition->setText( QString("%1.").arg( mOrdNumber ) ); } void PositionViewWidget::slotSetEnabled( bool doit ) { if( !doit ) { m_sbAmount->setEnabled( false ); m_sbUnitPrice->setEnabled( false ); m_labelPosition->setEnabled( false ); m_teFloskel->setEnabled( false ); m_sumLabel->setEnabled( false ); m_cbUnit->setEnabled( false ); } else { m_sbAmount->setEnabled( true ); m_sbUnitPrice->setEnabled( true ); m_labelPosition->setEnabled( true ); m_teFloskel->setEnabled( true ); m_sumLabel->setEnabled( true ); m_cbUnit->setEnabled( true ); } } bool PositionViewWidget::priceValid() { bool isValid = true; if ( position()->type() == DocPosition::ExtraDiscount ) { isValid = mPositionPriceValid; } return isValid; } void PositionViewWidget::setCurrentPrice( Geld g ) { // do nothing for normal positions if ( position()->type() == DocPosition::ExtraDiscount ) { mPositionPrice = g; mPositionPriceValid = true; } } Geld PositionViewWidget::currentPrice() { Geld sum; if ( mKind == Normal ) { if ( position()->type() == DocPosition::ExtraDiscount ) { sum = mPositionPrice; if ( ! mPositionPriceValid ) { qWarning() << "Asking for price of Discount item, but invalid!"; } } else { double amount = m_sbAmount->value(); Geld g( m_sbUnitPrice->value() ); sum = g * amount; } } return sum; } Geld PositionViewWidget::unitPrice() { Geld p( m_sbUnitPrice->value() ); return p; } void PositionViewWidget::slotRefreshPrice() { const Geld sum = currentPrice(); slotSetOverallPrice( sum ); emit priceChanged( sum ); } void PositionViewWidget::slotSetOverallPrice( Geld g ) { // if ( mPositionPtr->type() == DocPosition::ExtraDiscount ) { // m_sumLabel->setText( "--" ); // } else { m_sumLabel->setText( g.toLocaleString() ); // } } void PositionViewWidget::slotModified( bool emitSignal ) { Q_UNUSED(emitSignal) if(m_skipModifiedSignal) return; // qDebug () << "Modified Position!"; mModified = true; m_labelPosition->setStyleSheet("font-weight: bold; color: red"); emit positionModified(); } PositionViewWidget::~PositionViewWidget() { } PositionViewWidgetList::PositionViewWidgetList() : QList() { // setAutoDelete( true ); } PositionViewWidget* PositionViewWidgetList::widgetFromPosition( DocPositionGuardedPtr ptr) { PositionViewWidgetListIterator it( *this ); while( it.hasNext() ) { PositionViewWidget *pvw = it.next(); if( pvw ->position() == ptr ) { return pvw; } } return 0; } Geld PositionViewWidgetList::nettoPrice() { Geld res; PositionViewWidgetListIterator it( *this ); while( it.hasNext() ) { PositionViewWidget *pvw = it.next(); res += pvw->currentPrice(); } return res; } QString PositionViewWidget::cleanKindString(const QString& src) { QString current {src}; if ( current.startsWith( kindLabel( Alternative ) ) ) { current.remove( 0, kindLabel(Alternative).length() ); } else if ( current.startsWith( kindLabel( Demand ) ) ) { current.remove( 0, kindLabel(Demand).length()); } return current; } void PositionViewWidget::slotSetPositionKind(Kind kind, bool alterText) { QString tt; QIcon icon; bool showLabel {false}; Kind oldKind = mKind; mKind = kind; if (kind == Kind::Normal) { } else if (kind == Kind::Demand) { tt = i18n( "This item is either completely optional or its " "amount varies depending on the needs.

              " "Use the item toolbox to change the item type." ); showLabel = true; icon = DefaultProvider::self()->icon("arrow-move-right"); } else if (kind == Kind::Alternative) { tt = i18n( "This is an alternative item.

              " " Use the position toolbox to change the item type." ); showLabel = true; icon = DefaultProvider::self()->icon("arrow-ramp-right"); } showLabel ? lKind->show() : lKind->hide(); lKind->setToolTip(tt); lKind->setPixmap(icon.pixmap(QSize(20,20))); if (alterText) { QString text = m_teFloskel->toPlainText(); if (oldKind == Kind::Normal) { QString pre; if (kind == Kind::Alternative) { pre = kindLabel(Kind::Alternative); } else if (kind == Kind::Demand) { pre = kindLabel(Kind::Demand); } if (!pre.isEmpty()) { m_teFloskel->setPlainText(pre + text); } } else { // from demand to normal or alternative for example if (kind == Kind::Normal) { text = cleanKindString(text); } else { text = kindLabel(kind) + cleanKindString(text); } m_teFloskel->setPlainText(text); } } } // The technical label // Do not QString PositionViewWidget::techKindString( Kind kind) { if ( kind == Invalid ) { qDebug() << "Invalid Kind set"; } if ( kind == Normal ) return QStringLiteral( "Normal" ); if ( kind == Demand ) return QStringLiteral( "Demand" ); if ( kind == Alternative ) return QStringLiteral( "Alternative" ); return QStringLiteral( "Invalid" ); } PositionViewWidget::Kind PositionViewWidget::techStringToKind( const QString& kindStr ) { if (kindStr == techKindString(Normal)) { return Kind::Normal; } else if (kindStr == techKindString(Demand)) { return Kind::Demand; } else if (kindStr == techKindString(Alternative)) { return Kind::Alternative; } return Kind::Invalid; } // The label that is prepended to a positions text QString PositionViewWidget::kindLabel( Kind k ) { Kind kind = k; QString re; if ( kind == Normal ) { re = KraftSettings::self()->normalLabel(); if ( re.isEmpty() ) re = i18n( "Normal" ); } if ( kind == Demand ) { re = KraftSettings::self()->demandLabel(); if ( re.isEmpty() ) re = i18n( "Demand" ); } if ( kind == Alternative ) { re = KraftSettings::self()->alternativeLabel(); if ( re.isEmpty() ) re = i18n( "Alternative" ); } if ( ! re.endsWith( ": " ) ) { re += QStringLiteral( ": " ); } return re; } void PositionViewWidget::paintEvent ( QPaintEvent*) { QScopedPointer painter(new QPainter( this )); // visualize the tags const QStringList taglist = tagList(); if ( taglist.count() ) { int share = ( height() - 24 ) / taglist.count(); int cnt = 0; for ( QStringList::ConstIterator it = taglist.begin(); it != taglist.end(); ++it ) { const QString tag(*it); TagTemplate tagTemplate = TagTemplateMan::self()->getTagTemplate( tag ); const QColor c = tagTemplate.color(); // qDebug() << "color: " << c.red() << ", " << c.green() << ", " << c.blue(); painter->setBrush( c ); int starty = 6+cnt*share; qDrawShadeLine( painter.data(), QPoint(3, starty), QPoint(3, starty+share-1), tagTemplate.palette(), false, 1, 4 ); cnt++; } } } kraft-1.2.2/src/positionviewwidget.h000066400000000000000000000106461467704360200175460ustar00rootroot00000000000000/*************************************************************************** postionviewwidget - inherited class for doc position views. ------------------- begin : 2006-02-20 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef POSITIONVIEWWIDGET_H #define POSITIONVIEWWIDGET_H #include #include #include #include #include #include "geld.h" #include "ui_positionwidget.h" #include "docposition.h" /** @author Klaas Freitag */ class KMenu; class QAction; class Geld; class QLocale; class DosPositionGuardedPtr; class PositionViewWidget : public QWidget, public Ui_positionWidget { Q_OBJECT public: enum State { Active, New, Deleted, Locked }; enum Kind { Normal, Demand, Alternative, Invalid }; PositionViewWidget( ); PositionViewWidget( int ); void setDocPosition(DocPositionBase*); virtual ~PositionViewWidget(); bool modified() { return mModified; } int ordNumber() { return mOrdNumber; } void setOrdNumber( int ); bool deleted() { return mToDelete; } DocPositionGuardedPtr position(){ return mPositionPtr; } State state() { return mState; } Kind kind() { return mKind; } static QString techKindString(Kind kind); static Kind techStringToKind( const QString& kindStr ); static QString kindLabel( Kind ); QString stateString( const State& state ) const; QString cleanKindString(const QString &src); Geld currentPrice(); bool priceValid(); void setCurrentPrice( Geld ); Geld unitPrice(); QStringList tagList() { return mTags; } QString extraDiscountTagRestriction(); DocPositionBase::TaxType taxType() const; public slots: void slotSetOverallPrice( Geld ); void slotRefreshPrice(); void slotModified( bool emitSignal = true ); void slotExecButtonPressed(); void slotTaggingButtonPressed(); void slotMenuAboutToHide(); void slotMenuAboutToShow(); void slotSetState( State ); void slotSetEnabled( bool ); void slotEnableKindMenu( bool ); void slotAllowIndividualTax( bool ); void slotSetTax( DocPosition::TaxType ); void slotShowPrice( bool show ); // hide the price entries for certain doc types. protected slots: void slotLockPosition(); void slotUnlockPosition(); void slotSetPositionKind(Kind kind, bool alterText); void slotUpdateTagToolTip(); void paintEvent ( QPaintEvent* ); void slotSetNilTax(); void slotSetReducedTax(); void slotSetFullTax(); signals: void positionModified(); void deletePosition(); void moveUp(); void moveDown(); void lockPosition(); void unlockPosition(); void priceChanged( const Geld& ); void positionStateNormal(); void positionStateAlternative(); void positionStateDemand(); private: bool mModified; bool m_skipModifiedSignal; bool mToDelete; int mOrdNumber; DocPositionGuardedPtr mPositionPtr; QMenu *mExecPopup; QMenu *mStateSubmenu; QMenu *mTaxSubmenu; QStringList mTags; QAction * mDeleteId; QAction * mLockId; QAction * mUnlockId; QAction * mNilTaxAction; QAction * mRedTaxAction; QAction * mFullTaxAction; Geld mPositionPrice; // only used for Discount items to store the result State mState; Kind mKind; bool mPositionPriceValid; QLocale *mLocale; DocPosition::TaxType mTax; }; class PositionViewWidgetList : public QList { public: PositionViewWidgetList(); PositionViewWidget* widgetFromPosition( DocPositionGuardedPtr ); Geld nettoPrice(); }; typedef QListIterator PositionViewWidgetListIterator; #endif kraft-1.2.2/src/positionwidget.ui000066400000000000000000000205521467704360200170360ustar00rootroot00000000000000 positionWidget 0 0 520 157 0 1 400 0 2 2 4 0 0 1. false true 0 0 25 16777215 false 0 0 25 16777215 false D Qt::AlignCenter false Qt::Vertical QSizePolicy::Expanding 22 5 D Qt::AlignCenter false 0 1 150 110 true 0 9999900.000000000000000 0.000000000000000 1 0.010000000000000 2 99999.000000000000000 0.000000000000000 0.100000000000000 -0.100000000000000 0.010000000000000 2 0 % of the sum of false Qt::Horizontal QSizePolicy::Expanding 28 21 75 true textLabel7 false Qt::Horizontal kraft-1.2.2/src/prefsdialog.cpp000066400000000000000000000726231467704360200164400ustar00rootroot00000000000000/*************************************************************************** prefsdialog.cpp - the preferences Dialog ------------------- begin : Sun Jul 3 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "prefsdialog.h" #include "prefswages.h" #include "prefsunits.h" #include "kraftsettings.h" #include "defaultprovider.h" #include "doctype.h" #include "doctypeedit.h" #include "taxeditdialog.h" #include "impviewwidgets.h" #include "texttemplate.h" #include "htmlview.h" #include "addressselectordialog.h" #include "addressprovider.h" #include "format.h" #include "positionviewwidget.h" #include "kcontacts/vcardconverter.h" // ################################################################################ PrefsDialog::PrefsDialog( QWidget *parent) :QDialog( parent ) { setModal( true ); setWindowTitle( i18n( "Configure Kraft" ) ); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QHBoxLayout *mainLayout = new QHBoxLayout; _navigationBar = new QListWidget(this); _navigationBar->setViewMode(QListView::IconMode); _navigationBar->setIconSize(QSize(96, 64)); _navigationBar->setMovement(QListView::Static); //_navigationBar->setSpacing(6); _navigationBar->setCurrentRow(0); _navigationBar->setFixedWidth(195); setLayout(mainLayout); QVBoxLayout *vbox = new QVBoxLayout; _pagesWidget = new QStackedWidget(this); vbox->addWidget( _pagesWidget ); vbox->addWidget( buttonBox ); mainLayout->addWidget(_navigationBar); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addLayout(vbox); okButton->setDefault(true); setMinimumWidth(700); _maxNavBarTextWidth = 0; addDialogPage( docTab(), DefaultProvider::self()->icon( "copy"), i18n( "Document Defaults" )); addDialogPage( taxTab(), DefaultProvider::self()->icon( "receipt-tax" ), i18n("Taxes")); addDialogPage( doctypeTab(), DefaultProvider::self()->icon( "files"), i18n( "Document Types" )); mPrefsWages = new PrefsWages(this); addDialogPage(mPrefsWages, DefaultProvider::self()->icon( "cash-banknote" ), i18n( "Wages" )); mPrefsUnits = new PrefsUnits(this); addDialogPage(mPrefsUnits, DefaultProvider::self()->icon( "atom" ), i18n("Units")); addDialogPage( whoIsMeTab(), DefaultProvider::self()->icon( "id-badge-2" ), i18n( "Own Identity" )); readConfig(); connect( _navigationBar, &QListWidget::itemClicked, this, &PrefsDialog::changePage); } void PrefsDialog::changePage(QListWidgetItem *current) { if (!current) return; int indx = _navigationBar->row(current); _pagesWidget->setCurrentIndex(indx); } int PrefsDialog::addDialogPage( QWidget *w, const QIcon& icon, const QString& title) { QListWidgetItem *listWidgetItem = new QListWidgetItem(_navigationBar); listWidgetItem->setIcon(icon); listWidgetItem->setText(title); listWidgetItem->setTextAlignment(Qt::AlignCenter); listWidgetItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); listWidgetItem->setSizeHint( QSize(170, 100)); _navigationBar->addItem(listWidgetItem); QWidget *w_with_title = new QWidget; QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(new QLabel(QStringLiteral("

              ")+title+QStringLiteral("

              "))); w_with_title->setLayout(layout); layout->addWidget(w); int indx = _pagesWidget->addWidget(w_with_title); return indx; } QWidget* PrefsDialog::taxTab() { QWidget *topWidget = new QWidget; QVBoxLayout *vboxLay = new QVBoxLayout; // vboxLay->setSpacing( spacingHint() ); QLabel *label; label = new QLabel(i18n("Tax rates beginning at date:")); vboxLay->addWidget( label ); mTaxModel = new QSqlTableModel(this); mTaxModel->setTable("taxes"); mTaxModel->setSort(3, Qt::DescendingOrder); mTaxModel->setEditStrategy(QSqlTableModel::OnManualSubmit); mTaxModel->select(); mTaxModel->setHeaderData(0, Qt::Horizontal, i18n("ID")); mTaxModel->setHeaderData(1, Qt::Horizontal, i18n("Full Tax [%]")); mTaxModel->setHeaderData(2, Qt::Horizontal, i18n("Reduced Tax [%]")); mTaxModel->setHeaderData(3, Qt::Horizontal, i18n("Start Date")); mTaxTreeView = new ImpTreeView; vboxLay->addWidget( mTaxTreeView ); mTaxTreeView->setModel(mTaxModel); mTaxTreeView->setItemDelegate(new TaxItemDelegate()); mTaxTreeView->hideColumn(0); mTaxTreeView->header()->moveSection(3, 1); mTaxTreeView->header()->stretchLastSection(); mTaxTreeView->setColumnWidth(3, 200); mTaxTreeView->resizeColumnToContents(2); mTaxTreeView->resizeColumnToContents(1); connect( mTaxTreeView, SIGNAL(clicked(QModelIndex)), SLOT( slotTaxSelected(QModelIndex) ) ); QHBoxLayout *butLay = new QHBoxLayout; butLay->addStretch( 1 ); QPushButton *but = new QPushButton( DefaultProvider::self()->icon("plus"), i18n( "Add" )); connect( but, SIGNAL( clicked() ), SLOT( slotAddTax() ) ); butLay->addWidget( but ); mDelTax = new QPushButton( DefaultProvider::self()->icon("minus"), i18n( "Remove" ) ); connect( mDelTax, SIGNAL( clicked() ), SLOT( slotDeleteTax() ) ); butLay->addWidget( mDelTax ); mDelTax->setEnabled( false ); vboxLay->addLayout( butLay ); topWidget->setLayout( vboxLay ); return topWidget; } QWidget* PrefsDialog::whoIsMeTab() { QWidget *topWidget = new QWidget; QVBoxLayout *vboxLay = new QVBoxLayout; QLabel *label = new QLabel(i18n("Select the identity of the sending entity of documents. That's your companies address.")); label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); vboxLay->addWidget( label ); _tabWidget = new QTabWidget; vboxLay->addWidget(_tabWidget); // == Tab that displays the Addressbook widget QWidget *w = new QWidget; QVBoxLayout *t1Lay = new QVBoxLayout; mIdentityView = new HtmlView; mIdentityView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding); t1Lay->addWidget(mIdentityView); QHBoxLayout *butLay = new QHBoxLayout; butLay->addStretch( 1 ); _pbChangeIdentity = new QPushButton(i18n("Select Identity…")); connect( _pbChangeIdentity, SIGNAL(clicked()), SLOT(slotChangeIdentity()) ); butLay->addWidget(_pbChangeIdentity); t1Lay->addLayout( butLay ); w->setLayout(t1Lay); _tabWidget->insertTab(0, w, i18n("From Address Book")); // == Tab that displays the manual widget QWidget *w1 = new QWidget; ui.setupUi(w1); _tabWidget->insertTab(1, w1, QIcon(), i18n("Manual Entry")); ui.nameLabel->setText( KContacts::Addressee::formattedNameLabel() ); ui.orgLabel->setText( KContacts::Addressee::organizationLabel()); ui.streetLabel->setText(KContacts::Addressee::businessAddressStreetLabel()); ui.postCodeLabel->setText(KContacts::Addressee::businessAddressPostalCodeLabel()); ui.cityLabel->setText(KContacts::Addressee::businessAddressLocalityLabel()); ui.phoneLabel->setText(KContacts::Addressee::businessPhoneLabel()); ui.faxLabel->setText(KContacts::Addressee::businessFaxLabel()); ui.mobileLabel->setText(KContacts::Addressee::mobilePhoneLabel()); ui.emailLabel->setText(KContacts::Addressee::emailLabel()); ui.websiteLabel->setText(KContacts::Addressee::urlLabel()); _tabWidget->insertTab(1, w1, i18n("Manual Address")); // == Bank Account information QGroupBox *gbox = new QGroupBox(i18n("Bank Account Information"), this); QFormLayout *formLayout = new QFormLayout; _bacName = new QLineEdit(this); formLayout->addRow(tr("&Bank Account Holder:"), _bacName); _bacIBAN = new QLineEdit(this); formLayout->addRow(tr("&IBAN:"), _bacIBAN); _bacBIC = new QLineEdit(this); formLayout->addRow(tr("&BIC:"), _bacBIC); gbox->setLayout(formLayout); vboxLay->addWidget(gbox); topWidget->setLayout( vboxLay ); return topWidget; } void PrefsDialog::slotChangeIdentity() { AddressSelectorDialog dialog(this); if( dialog.exec() ) { _newIdentity = dialog.addressee(); if( ! _newIdentity.isEmpty() ) { setMyIdentity(_newIdentity, true); } } } void PrefsDialog::slotAddTax() { TaxEditDialog *dialog = new TaxEditDialog(mTaxModel, this); dialog->show(); } void PrefsDialog::slotDeleteTax() { if ( mTaxTreeView->currentIndex().isValid() ) { int row = mTaxTreeView->currentIndex().row(); //mTaxTreeView->setRowHidden( row, mTaxTreeView->rootIndex(), true ); mTaxModel->removeRows(row, 1); } } void PrefsDialog::slotTaxSelected(QModelIndex) { bool state = false; if ( mTaxTreeView->currentIndex().isValid() ) { state = true; } mDelTax->setEnabled( state ); } QWidget* PrefsDialog::docTab() { QLabel *label; QWidget *topWidget = new QWidget; QVBoxLayout *vboxLay = new QVBoxLayout; topWidget->setLayout( vboxLay ); QGridLayout *topLayout = new QGridLayout; vboxLay->addLayout( topLayout ); label = new QLabel(i18n("&Default document type on creation:"), this ); topLayout->addWidget(label, 0,0); mCbDocTypes = new QComboBox; label->setBuddy( mCbDocTypes ); mCbDocTypes->setToolTip( i18n( "New documents default to the selected type." ) ); topLayout->addWidget( mCbDocTypes, 0, 1 ); mCbDocTypes->insertItems(-1, DocType::allLocalised() ); QLabel *f = new QLabel(this); f->setFrameStyle( QFrame::HLine | QFrame::Sunken ); vboxLay->addWidget( f ); QHBoxLayout *butLay = new QHBoxLayout; QLabel *l = new QLabel( i18n( "Default &Tax for Documents:" ), this ); butLay->addWidget( l ); mCbDefaultTaxType = new QComboBox(this); butLay->addWidget( mCbDefaultTaxType ); l->setBuddy( mCbDefaultTaxType ); mCbDefaultTaxType->setToolTip( i18n( "The default tax setting for all documents." ) ); mCbDefaultTaxType->insertItem( 0, i18n("Display no tax at all")); mCbDefaultTaxType->insertItem( 1, i18n("Calculate reduced tax for all items" )); mCbDefaultTaxType->insertItem( 2, i18n("Calculate full tax for all items" ) ); // mCbDefaultTaxType->insertItem( 3, i18n("Calculate on individual item tax rate" )); vboxLay->addLayout( butLay ); f = new QLabel(this); f->setFrameStyle( QFrame::HLine | QFrame::Sunken ); vboxLay->addWidget( f ); butLay = new QHBoxLayout; l = new QLabel( i18n( "Document Date Format:" ), this ); butLay->addWidget( l ); mCbDateFormats = new QComboBox(this); butLay->addWidget( mCbDateFormats ); l->setBuddy( mCbDateFormats); const QDate d = QDate::currentDate(); mCbDateFormats->setToolTip( i18n( "The default date format for documents." ) ); QString formattedDate = d.toString(Qt::ISODate); mCbDateFormats->insertItem( 0, i18n("ISO-Format: %1", formattedDate)); formattedDate = d.toString(Qt::DefaultLocaleShortDate); mCbDateFormats->insertItem( 1, i18n("Short-Date: %1", formattedDate)); formattedDate = d.toString(Qt::DefaultLocaleLongDate); mCbDateFormats->insertItem( 2, i18n("Long-Date: %1", formattedDate)); formattedDate = d.toString(Qt::RFC2822Date); mCbDateFormats->insertItem( 3, i18n("RFC 2822-Format: %1", formattedDate)); formattedDate = d.toString("dd.MM.yyyy"); mCbDateFormats->insertItem( 4, i18n("\"German Format\": %1", formattedDate)); mCbDateFormats->insertItem( 5, i18n("Custom Setting in Settingsfile")); vboxLay->addLayout( butLay ); // ---- Alternative- and Demand Text f = new QLabel(this); f->setFrameStyle( QFrame::HLine | QFrame::Sunken ); vboxLay->addWidget( f ); auto gridLay = new QGridLayout; l = new QLabel(i18n("Prefix text for Demand items:"), this ); gridLay->addWidget(l, 0, 0); _lineEditDemandText = new QLineEdit(this); _lineEditDemandText->setText(PositionViewWidget::kindLabel(PositionViewWidget::Demand)); _lineEditDemandText->setToolTip(i18n("This text is automatically prepended to new 'on demand' items.")); gridLay->addWidget(_lineEditDemandText, 0, 1); l = new QLabel(i18n("Prefix text for Alternative items:"), this ); gridLay->addWidget(l, 1, 0); _lineEditAlternativeText = new QLineEdit(this); _lineEditAlternativeText->setText(PositionViewWidget::kindLabel(PositionViewWidget::Alternative)); _lineEditAlternativeText->setToolTip(i18n("This text is automatically prepended to new 'alternative' items.")); gridLay->addWidget(_lineEditAlternativeText, 1, 1); vboxLay->addLayout( gridLay ); // ---- XRechnung Template f = new QLabel(this); f->setFrameStyle( QFrame::HLine | QFrame::Sunken ); vboxLay->addWidget( f ); butLay = new QHBoxLayout; l = new QLabel(i18n("XRechnung template file:"), this ); butLay->addWidget(l); _lineEditXRechnung = new QLineEdit(this); butLay->addWidget(_lineEditXRechnung); QPushButton *pbXRechTmpl = new QPushButton(i18n("Select…"), this); butLay->addWidget(pbXRechTmpl); const QIcon& icon = DefaultProvider::self()->icon("device-floppy"); if (!icon.isNull() ) { pbXRechTmpl->setIcon(icon); pbXRechTmpl->setText(""); } pbXRechTmpl->setToolTip(i18n("Select template file for XRechnung")); connect(pbXRechTmpl, &QPushButton::clicked, this, [this]() { const QString file = QFileDialog::getOpenFileName(this, i18n("Find Template File"), QDir::homePath(), i18n("XRechnung Templates (*.xrtmpl)")); if (!file.isEmpty()) { _lineEditXRechnung->setText(file); } }); vboxLay->addLayout( butLay ); // space eater QWidget *spaceEater = new QWidget; spaceEater->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); vboxLay->addWidget( spaceEater ); return topWidget; } QWidget* PrefsDialog::doctypeTab() { QWidget *topWidget = new QWidget; QVBoxLayout *vboxLay = new QVBoxLayout; topWidget->setLayout(vboxLay); vboxLay->setSpacing( 0 ); // spacingHint() ); mDocTypeEdit = new DocTypeEdit; vboxLay->addWidget( mDocTypeEdit ); connect( mDocTypeEdit, SIGNAL( removedType( const QString& ) ), SLOT( slotDocTypeRemoved( const QString& ) ) ); return topWidget; } void PrefsDialog::slotDocTypeRemoved( const QString& type ) { // check if the default document type is still there QString currDefault = mCbDocTypes->currentText(); if ( currDefault == type ) { QMessageBox msgBox; msgBox.setText(i18n( "The old default doc type for new documents was just deleted." "Please check the setting in the Document Defaults in the " "Kraft preferences Dialog." )); msgBox.setInformativeText(i18n("Document Default Change")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } for ( int i=0; i < mCbDocTypes->count(); i++ ) { if ( mCbDocTypes->itemText( i ) == type ) { mCbDocTypes->removeItem( i ); continue; } } } void PrefsDialog::readConfig() { QString t = KraftSettings::self()->doctype(); if ( t.isEmpty() ) t = DefaultProvider::self()->docType(); mCbDocTypes->setCurrentIndex( mCbDocTypes->findText( t )); mCbDefaultTaxType->setCurrentIndex( KraftSettings::self()->defaultTaxType()-1 ); DocType dt(QStringLiteral("Rechnung")); // FIXME const auto tmpl = dt.xRechnungTemplate(); _lineEditXRechnung->setText(tmpl); // == Date format int index {5}; const QString dFormat = KraftSettings::self()->dateFormat(); if (dFormat == Format::DateFormatIso) { // iso index = 0; } else if (dFormat == Format::DateFormatShort) { // short index = 1; } else if (dFormat == Format::DateFormatLong) { // long index = 2; } else if (dFormat == Format::DateFormatRFC) { // RFC index = 3; } else if (dFormat == Format::DateFormatGerman) { // German index = 4; } if (index == 5 && dFormat.isEmpty()) { // default case - no entry // HACK: If it is german, choose the "german" format const QString ln = DefaultProvider::self()->locale()->name(); if( ln == QStringLiteral("de_DE")) { index = 4; } else { index = 1; // Short locale aware. } } mCbDateFormats->setCurrentIndex(index); // == Bank Account Information QString h = KraftSettings::self()->bankAccountName(); _bacName->setText(h); h = KraftSettings::self()->bankAccountBIC(); _bacBIC->setText(h); h = KraftSettings::self()->bankAccountIBAN(); _bacIBAN->setText(h); } void PrefsDialog::writeIdentity() { /* * Save either the manually added address, or the Addressbook-ID * If the user fills in the manual form, the addressbook ID is removed. * FIXME: The handling of the ownIdentity should be refactored to its * own class. */ if(_tabWidget->currentIndex() == 1 /* manually entered */ ) { KContacts::Addressee add; add.setFormattedName(ui.leName->text()); add.setOrganization(ui.leOrganization->text()); KContacts::Address workAddress; workAddress.setStreet(ui.leStreet->text()); workAddress.setPostalCode(ui.lePostcode->text()); workAddress.setLocality(ui.leCity->text()); workAddress.setType(KContacts::Address::Work); add.insertAddress(workAddress); add.insertPhoneNumber(PhoneNumber(ui.lePhone->text(), KContacts::PhoneNumber::Work)); add.insertPhoneNumber(PhoneNumber(ui.leFax->text(), KContacts::PhoneNumber::Fax)); add.insertPhoneNumber(PhoneNumber(ui.leMobile->text(), KContacts::PhoneNumber::Cell)); ResourceLocatorUrl resUrl; resUrl.setUrl(QUrl(ui.leWebsite->text())); add.setUrl(resUrl); add.insertEmail(ui.leEmail->text(), true /* prefered */ ); VCardConverter vcc; QByteArray vcard = vcc.createVCard(add); QString file = QStandardPaths::writableLocation( QStandardPaths::AppDataLocation ); file += "/myidentity.vcd"; QFile f ( file ); if (f.open(QIODevice::WriteOnly | QIODevice::Text)) { f.write(vcard); f.close(); qDebug() << "Saved own identity to " << file; KraftSettings::self()->setUserName( QString() ); KraftSettings::self()->setUserUid( QString() ); KraftSettings::self()->save(); } } else { /* AddressBook */ KraftSettings::self()->setUserName( _newIdentity.name() ); KraftSettings::self()->setUserUid( _newIdentity.uid() ); KraftSettings::self()->save(); } emit newOwnIdentity(_newIdentity.uid(), _newIdentity); } void PrefsDialog::writeConfig() { KraftSettings::self()->setDoctype( mCbDocTypes->currentText() ); KraftSettings::self()->setDefaultTaxType( 1+mCbDefaultTaxType->currentIndex() ); DocType dt(QStringLiteral("Rechnung")); // FIXME const auto newTmpl = _lineEditXRechnung->text(); if (newTmpl != dt.xRechnungTemplate()) { dt.setXRechnungTemplate(newTmpl); dt.save(); } const QString demandText = _lineEditDemandText->text(); KraftSettings::self()->setDemandLabel(demandText); const QString alterText = _lineEditAlternativeText->text(); KraftSettings::self()->setAlternativeLabel(alterText); int dateFormat = mCbDateFormats->currentIndex(); QString dateFormatString; if (dateFormat == 0) { // iso dateFormatString = Format::DateFormatIso; } else if (dateFormat == 1) { // short dateFormatString = Format::DateFormatShort; } else if (dateFormat == 2) { // long dateFormatString = Format::DateFormatLong; } else if (dateFormat == 3) { // RFC dateFormatString = Format::DateFormatRFC; } else if (dateFormat == 4) { // German dateFormatString = Format::DateFormatGerman; } if (dateFormatString.isEmpty()) { // do not touch! } else { KraftSettings::self()->setDateFormat(dateFormatString); } QString h = _bacName->text(); if (h != KraftSettings::self()->bankAccountName()) { KraftSettings::self()->setBankAccountName(h); } h = _bacBIC->text(); if (h != KraftSettings::self()->bankAccountBIC()) { KraftSettings::self()->setBankAccountBIC(h); } h = _bacIBAN->text(); if (h != KraftSettings::self()->bankAccountIBAN()) { KraftSettings::self()->setBankAccountIBAN(h); } KraftSettings::self()->save(); } void PrefsDialog::writeTaxes() { mTaxModel->submitAll(); } PrefsDialog::~PrefsDialog() { } void PrefsDialog::accept() { mDocTypeEdit->saveDocTypes(); mPrefsWages->save(); mPrefsUnits->save(); writeTaxes(); writeConfig(); writeIdentity(); QDialog::accept(); } #define IDENTITY_TAG(X) QLatin1String(X) #define QL1(X) QStringLiteral(X) void PrefsDialog::fillManualIdentityForm(const KContacts::Addressee& addressee) { ui.leName->setText(addressee.formattedName()); ui.leStreet->setText(addressee.address(Address::Work).street()); ui.leCity->setText(addressee.address(Address::Work).locality()); ui.lePostcode->setText(addressee.address(Address::Work).postalCode()); ui.leEmail->setText(addressee.preferredEmail()); ui.leFax->setText(addressee.phoneNumber(PhoneNumber::Fax).number()); ui.leOrganization->setText(addressee.organization()); ui.lePhone->setText(addressee.phoneNumber(PhoneNumber::Work).number()); ui.leMobile->setText(addressee.phoneNumber(PhoneNumber::Cell).number()); ui.leWebsite->setText(addressee.url().url().toDisplayString()); } void PrefsDialog::setMyIdentity( const KContacts::Addressee& addressee, bool backendUp ) { // Note: This code is stolen from DocDigestDetailView::slotShowDocDetails // It should be refactored. const QString tmplFile = DefaultProvider::self()->locateFile( "views/identity.thtml" ); TextTemplate tmpl; tmpl.setTemplateFileName(tmplFile); if( !tmpl.isOk() ) { return; } if( ! tmpl.errorString().isEmpty() ) { mIdentityView->displayContent( QString("

              Unable to find template identity.trml

              %1

              ") .arg(tmpl.errorString())); return; } QString addressBookInfo; _pbChangeIdentity->setEnabled(backendUp); QPalette p; QColor c = p.color(QPalette::Normal, QPalette::ToolTipBase); tmpl.setValue(IDENTITY_TAG("CSS_WARN_BACKGROUND_COLOR"), c.name()); c = p.color(QPalette::Normal, QPalette::QPalette::Base); tmpl.setValue(IDENTITY_TAG("CSS_IDENTITY_IMAGE_BACKGROUND"), "#ea4e1d"); // c.name()); if( !backendUp ) { addressBookInfo = i18n("The identity cannot be found."); tmpl.createDictionary(QL1("NO_IDENTITY")); tmpl.setValue(QL1("NO_IDENTITY_WRN"), i18n("

              Kraft Addressbook Integration down.

              " "

              The address book backend is not up and running.

              " "

              Please check your addressbook integration setup.

              ")); } if( addressee.isEmpty() ) { addressBookInfo = i18n("The identity is not listed in an address book."); tmpl.createDictionary(QL1("NO_IDENTITY")); tmpl.setValue(QL1("NO_IDENTITY_WRN"), i18n("

              Kraft does not know your identity.

              " "

              Please pick one from the address books by clicking on the Button below.

              " "

              Not having an identity selected can make your documents look incomplete.

              ")); } else { const QString origin = addressee.custom( CUSTOM_ADDRESS_MARKER ); if( origin.isEmpty() || origin == "manual") { // it is an manually added address. fillManualIdentityForm(addressee); _tabWidget->setTabIcon(1, DefaultProvider::self()->icon("check")); _tabWidget->setTabIcon(0, QIcon()); _tabWidget->setCurrentIndex(1); } else { _tabWidget->setTabIcon(0, DefaultProvider::self()->icon("check")); _tabWidget->setTabIcon(1, QIcon()); _tabWidget->setCurrentIndex(0); // it is an address from the address book addressBookInfo = i18n("Your identity can be found in the address books."); tmpl.createDictionary(QL1("IDENTITY")); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG("IDENTITY_NAME"), addressee.realName() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG("IDENTITY_ORGANISATION"), addressee.organization() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG("IDENTITY_URL"), addressee.url().toString() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG("IDENTITY_EMAIL"), addressee.preferredEmail() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG("IDENTITY_WORK_PHONE"), addressee.phoneNumber(PhoneNumber::Work).number()); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG("IDENTITY_MOBILE_PHONE"), addressee.phoneNumber(PhoneNumber::Cell).number()); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG("IDENTITY_FAX"), addressee.phoneNumber(PhoneNumber::Fax).number()); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG("WORK_PHONE_LABEL"), i18n("Work Phone") ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG("FAX_LABEL"), i18n("Fax") ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG("MOBILE_PHONE_LABEL"), i18n("Cell Phone") ); KContacts::Address myAddress; myAddress = addressee.address( KContacts::Address::Pref ); QString addressType = i18n("preferred address"); if( myAddress.isEmpty() ) { myAddress = addressee.address( KContacts::Address::Home ); addressType = i18n("home address"); } if( myAddress.isEmpty() ) { myAddress = addressee.address( KContacts::Address::Work ); addressType = i18n("work address"); } if( myAddress.isEmpty() ) { myAddress = addressee.address( KContacts::Address::Postal ); addressType = i18n("postal address"); } if( myAddress.isEmpty() ) { myAddress = addressee.address( KContacts::Address::Intl ); addressType = i18n("international address"); } if( myAddress.isEmpty() ) { myAddress = addressee.address( KContacts::Address::Dom ); addressType = i18n("domestic address"); } if( myAddress.isEmpty() ) { addressType = i18n("unknown"); // qDebug () << "WRN: Address is still empty!"; } tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG( "IDENTITY_POSTBOX" ), myAddress.postOfficeBox() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG( "IDENTITY_EXTENDED" ), myAddress.extended() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG( "IDENTITY_STREET" ), myAddress.street() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG( "IDENTITY_LOCALITY" ), myAddress.locality() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG( "IDENTITY_REGION" ), myAddress.region() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG( "IDENTITY_POSTCODE" ), myAddress.postalCode() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG( "IDENTITY_COUNTRY" ), myAddress.country() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG( "IDENTITY_REGION" ), myAddress.region() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG( "IDENTITY_LABEL" ), myAddress.label() ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG( "IDENTITY_ADDRESS_TYPE" ), QL1("(")+addressType+QL1(")") ); tmpl.setValue( QL1("IDENTITY"), IDENTITY_TAG("ADDRESSBOOK_INFO"), addressBookInfo ); } } const QString ex = tmpl.expand(); mIdentityView->displayContent(ex); } TaxItemDelegate::TaxItemDelegate(QObject * parent) : QItemDelegate(parent) {} void TaxItemDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const { if(index.column() == 1 || index.column() == 2) { double percentage = index.data(Qt::DisplayRole).toDouble(); // QString string = DefaultProvider::self()->locale()->formatNumber(QString::number(percentage), true, 1); QString string = DefaultProvider::self()->locale()->toString(percentage); drawDisplay(painter, option, option.rect, string); } else if(index.column() == 3) { QDate date = index.data(Qt::DisplayRole).toDate(); // QString string = DefaultProvider::self()->locale()->formatDate(date); QString string = DefaultProvider::self()->locale()->toString(date); drawDisplay(painter, option, option.rect, string); } else { QItemDelegate::paint(painter, option, index); } } kraft-1.2.2/src/prefsdialog.h000066400000000000000000000071561467704360200161040ustar00rootroot00000000000000/*************************************************************************** prefsdialog.h - the preferences Dialog ------------------- begin : Sun Jul 3 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef PREFSDIALOG_H #define PREFSDIALOG_H #include #include #include "ui_identity.h" #include "doctypeedit.h" #include "doctype.h" #include "taxeditdialog.h" class QLineEdit; class QLabel; class QPushButton; class QComboBox; class QCheckBox; class QSqlTableModel; class QTreeView; class QPainter; class QStyleOptionViewItem; class QStackedWidget; class QModelIndex; class ImpTreeView; class PrefsWages; class PrefsUnits; class HtmlView; // ################################################################################ class PrefsDialog : public QDialog { Q_OBJECT public: PrefsDialog(QWidget *parent); ~PrefsDialog(); void setMyIdentity(const KContacts::Addressee& , bool backendUp); int addPage( QWidget *w, const QIcon& icon, const QString& title); protected: void readConfig(); void writeConfig(); protected slots: void accept(); void slotAddTax(); void slotDeleteTax(); void slotTaxSelected(QModelIndex); void slotDocTypeRemoved( const QString& ); void slotChangeIdentity(); void changePage(QListWidgetItem *current); signals: void newOwnIdentity(const QString&, KContacts::Addressee); private: int addDialogPage( QWidget *w, const QIcon& icon, const QString& title); QWidget *docTab(); QWidget* doctypeTab(); QWidget *taxTab(); void writeTaxes(); void writeIdentity(); QWidget *whoIsMeTab(); void fillManualIdentityForm(const KContacts::Addressee& addressee); QComboBox *m_databaseDriver; QLineEdit *m_leHost; QLineEdit *m_leUser; QLineEdit *m_leName; QLineEdit *m_lePasswd; QLineEdit *_lineEditXRechnung; QLineEdit *_lineEditDemandText; QLineEdit *_lineEditAlternativeText; QLabel *m_statusLabel; QWidget *m_mysqlpart; QWidget *m_sqlitepart; QStackedWidget *m_databaseconfigparts; QComboBox *mCbDocTypes; QComboBox *mCbDefaultTaxType; QComboBox *mCbDateFormats; QPushButton *_pbChangeIdentity; DocTypeEdit *mDocTypeEdit; PrefsWages *mPrefsWages; PrefsUnits *mPrefsUnits; KContacts::Addressee _newIdentity; QPushButton *mDelTax; ImpTreeView *mTaxTreeView; QSqlTableModel *mTaxModel; HtmlView *mIdentityView; QListWidget *_navigationBar; QStackedWidget *_pagesWidget; QTabWidget *_tabWidget; Ui::manualOwnIdentity ui; QLineEdit *_bacName; QLineEdit *_bacIBAN; QLineEdit *_bacBIC; int _maxNavBarTextWidth; }; class TaxItemDelegate : public QItemDelegate { Q_OBJECT public: TaxItemDelegate(QObject * parent = 0); virtual void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const; }; #endif kraft-1.2.2/src/prefsunits.cpp000066400000000000000000000145301467704360200163340ustar00rootroot00000000000000/*************************************************************************** prefsunits.cpp - the units tab in the prefs dialog ------------------- begin : Feb 26 2010 copyright : (C) 2010 by Thomas Richard email : thomas.richard@proan.be ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "defaultprovider.h" #include "impviewwidgets.h" #include "geld.h" #include "unitmanager.h" #include "prefsunits.h" PrefsUnits::PrefsUnits(QWidget* parent) : QWidget(parent) { QVBoxLayout *vboxLay = new QVBoxLayout; mUnitsModel = new QSqlTableModel(this); mUnitsModel->setTable("units"); mUnitsModel->setEditStrategy(QSqlTableModel::OnManualSubmit); mUnitsModel->select(); mUnitsModel->setHeaderData(0, Qt::Horizontal, i18n("ID")); mUnitsModel->setHeaderData(1, Qt::Horizontal, i18n("Short")); mUnitsModel->setHeaderData(2, Qt::Horizontal, i18n("Long")); mUnitsModel->setHeaderData(3, Qt::Horizontal, i18n("Short plural")); mUnitsModel->setHeaderData(4, Qt::Horizontal, i18n("Long plural")); mUnitsModel->setHeaderData(5, Qt::Horizontal, i18n("ECE20")); mProxyModel = new QSortFilterProxyModel(this); mProxyModel->setSourceModel(mUnitsModel); mUnitsTreeView = new ImpTreeView; vboxLay->addWidget( mUnitsTreeView ); mUnitsTreeView->setModel(mProxyModel); mUnitsTreeView->hideColumn(0); mUnitsTreeView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); mUnitsTreeView->setEditTriggers(ImpTreeView::NoEditTriggers); connect( mUnitsTreeView, SIGNAL(clicked(QModelIndex)), SLOT( slotUnitSelected(QModelIndex) ) ); connect( mUnitsTreeView, SIGNAL(doubleClicked(QModelIndex)), SLOT(slotEditUnit(QModelIndex))); QHBoxLayout *butLay = new QHBoxLayout; butLay->addStretch( 1 ); QPushButton *but = new QPushButton( DefaultProvider::self()->icon("plus"), i18n( "Add" )); connect( but, SIGNAL( clicked() ), SLOT( slotAddUnit() ) ); butLay->addWidget( but ); mEditUnit = new QPushButton( DefaultProvider::self()->icon("pencil"), i18n( "Edit" )); connect( mEditUnit, SIGNAL( clicked() ), SLOT( slotEditUnit() ) ); butLay->addWidget( mEditUnit ); mEditUnit->setEnabled(false); mDelUnit = new QPushButton( DefaultProvider::self()->icon("minus"), i18n( "Remove" ) ); connect( mDelUnit, SIGNAL( clicked() ), SLOT( slotDeleteUnit() ) ); butLay->addWidget( mDelUnit ); mDelUnit->setEnabled( false ); vboxLay->addLayout( butLay ); this->setLayout( vboxLay ); } PrefsUnits::~PrefsUnits() { } void PrefsUnits::save() { mUnitsModel->submitAll(); } void PrefsUnits::slotAddUnit() { UnitsEditDialog *dialog = new UnitsEditDialog(mUnitsModel, -1, this); dialog->show(); } void PrefsUnits::slotEditUnit(QModelIndex /* index */ ) { if ( mUnitsTreeView->currentIndex().isValid() ) { int row = mUnitsTreeView->currentIndex().row(); UnitsEditDialog *dialog = new UnitsEditDialog(mUnitsModel, row, this); dialog->show(); } } void PrefsUnits::slotDeleteUnit() { if ( mUnitsTreeView->currentIndex().isValid() ) { int row = mUnitsTreeView->currentIndex().row(); mUnitsModel->removeRows(row, 1); } } void PrefsUnits::slotUnitSelected(QModelIndex) { bool state = false; if ( mUnitsTreeView->currentIndex().isValid() ) { state = true; } mEditUnit->setEnabled( state ); mDelUnit->setEnabled( state ); } UnitsEditDialog::UnitsEditDialog( QAbstractItemModel *model, int row, QWidget *parent ) : QDialog( parent ) { setObjectName( "UNITS_EDIT_DIALOG" ); setModal( true ); setWindowTitle( i18n( "Edit a unit" ) ); QWidget *mainWidget = new QWidget(this); QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); mainLayout->addWidget(mainWidget); QWidget *w = new QWidget( this ); mainLayout->addWidget(w); mBaseWidget = new Ui::UnitsEditBase( ); mBaseWidget->setupUi( w ); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); mModel = model; mapper = new QDataWidgetMapper(this); mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit); mapper->setModel(model); mapper->addMapping(mBaseWidget->mUnitShort, 1); mapper->addMapping(mBaseWidget->mUnitLong, 2); mapper->addMapping(mBaseWidget->mUnitPluShort, 3); mapper->addMapping(mBaseWidget->mUnitPluLong, 4); mapper->addMapping(mBaseWidget->mUnitECE20, 5); if(row == -1) { //Insert a new row at the end int row = model->rowCount(); if( model->insertRow(row) ) { int indx = UnitManager::self()->nextFreeId(); model->setData( model->index(row, 0), indx ); mapper->toLast(); } } else { mBaseWidget->mLabel->setText(i18n("

              Edit unit

              ")); mapper->setCurrentIndex(row); } mRow = row; } void UnitsEditDialog::accept() { bool ok = mapper->submit(); if(!ok) { qDebug () << "UnitsEditDialog Mapper submit result: " << ok; } QDialog::accept(); deleteLater(); } void UnitsEditDialog::reject() { if(mRow == -1) mModel->removeRow(mModel->rowCount()-1); QDialog::reject(); deleteLater(); } kraft-1.2.2/src/prefsunits.h000066400000000000000000000041341467704360200160000ustar00rootroot00000000000000/*************************************************************************** prefsunits.h - the units tab in the prefs dialog ------------------- begin : Feb 28 2010 copyright : (C) 2010 by Thomas Richard email : thomas.richard@proan.be ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef PREFSUNITS_H #define PREFSUNITS_H #include #include #include #include "ui_unitseditbase.h" class QModelIndex; class QPushButton; class ImpTreeView; class QAbstractItemModel; class QDataWidgetMapper; class QSqlTableModel; class QSortFilterProxyModel; class PrefsUnits : public QWidget { Q_OBJECT public: PrefsUnits(QWidget* parent); ~PrefsUnits(); void save(); public slots: void slotAddUnit(); void slotEditUnit(QModelIndex index = QModelIndex()); void slotDeleteUnit(); void slotUnitSelected(QModelIndex); private: QPushButton *mDelUnit; QPushButton *mEditUnit; ImpTreeView *mUnitsTreeView; QSqlTableModel *mUnitsModel; QSortFilterProxyModel *mProxyModel; }; class UnitsEditDialog: public QDialog, protected Ui::UnitsEditBase { Q_OBJECT public: UnitsEditDialog( QAbstractItemModel *model, int row, QWidget *parent ); public slots: void accept(); void reject(); private: Ui::UnitsEditBase *mBaseWidget; QDataWidgetMapper *mapper; QAbstractItemModel *mModel; int mRow; }; #endif kraft-1.2.2/src/prefswages.cpp000066400000000000000000000206651467704360200163060ustar00rootroot00000000000000/*************************************************************************** prefswages.cpp - the wages tab in the prefs dialog ------------------- begin : Feb 26 2010 copyright : (C) 2010 by Thomas Richard email : thomas.richard@proan.be ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include "defaultprovider.h" #include "impviewwidgets.h" #include "geld.h" #include "defaultprovider.h" #include "prefswages.h" PrefsWages::PrefsWages(QWidget* parent) : QWidget(parent) { QVBoxLayout *vboxLay = new QVBoxLayout; mWagesModel = new QSqlTableModel(this); mWagesModel->setTable("stdSaetze"); mWagesModel->setSort(3, Qt::AscendingOrder); mWagesModel->setEditStrategy(QSqlTableModel::OnManualSubmit); mWagesModel->select(); mWagesModel->setHeaderData(0, Qt::Horizontal, i18n("ID")); mWagesModel->setHeaderData(1, Qt::Horizontal, i18n("Code")); mWagesModel->setHeaderData(2, Qt::Horizontal, i18n("Price")); mWagesModel->setHeaderData(3, Qt::Horizontal, i18n("Sortkey")); mProxyModel = new QSortFilterProxyModel(this); mProxyModel->setSourceModel(mWagesModel); mWagesTreeView = new ImpTreeView; vboxLay->addWidget( mWagesTreeView ); mWagesTreeView->setModel(mProxyModel); mWagesTreeView->setItemDelegate(new WagesItemDelegate()); mWagesTreeView->hideColumn(0); mWagesTreeView->hideColumn(3); mWagesTreeView->header()->stretchLastSection(); mWagesTreeView->setColumnWidth(1, 200); mWagesTreeView->resizeColumnToContents(2); mWagesTreeView->resizeColumnToContents(1); mWagesTreeView->setEditTriggers(ImpTreeView::NoEditTriggers); connect( mWagesTreeView, SIGNAL(clicked(QModelIndex)), SLOT( slotWageSelected(QModelIndex) ) ); connect( mWagesTreeView, SIGNAL(doubleClicked(QModelIndex)), SLOT(slotEditWage(QModelIndex))); QHBoxLayout *butLay = new QHBoxLayout; butLay->addStretch( 1 ); mUp = new QPushButton( DefaultProvider::self()->icon("arrow-up"), i18n( "Up" )); connect( mUp, SIGNAL( clicked() ), SLOT( slotUp() ) ); butLay->addWidget( mUp ); mUp->setEnabled(false); mDown = new QPushButton( DefaultProvider::self()->icon("arrow-down"), i18n( "Down" )); connect( mDown, SIGNAL( clicked() ), SLOT( slotDown() ) ); butLay->addWidget( mDown ); mDown->setEnabled(false); QPushButton *but = new QPushButton( DefaultProvider::self()->icon("plus"), i18n( "Add" )); connect( but, SIGNAL( clicked() ), SLOT( slotAddWage() ) ); butLay->addWidget( but ); mEditWage = new QPushButton( DefaultProvider::self()->icon("pencil"), i18n( "Edit" )); connect( mEditWage, SIGNAL( clicked() ), SLOT( slotEditWage() ) ); butLay->addWidget( mEditWage ); mEditWage->setEnabled(false); mDelWage = new QPushButton( DefaultProvider::self()->icon("minus"), i18n( "Remove" ) ); connect( mDelWage, SIGNAL( clicked() ), SLOT( slotDeleteWage() ) ); butLay->addWidget( mDelWage ); mDelWage->setEnabled( false ); vboxLay->addLayout( butLay ); this->setLayout( vboxLay ); } PrefsWages::~PrefsWages() { } void PrefsWages::save() { mWagesModel->submitAll(); } void PrefsWages::slotAddWage() { WagesEditDialog *dialog = new WagesEditDialog(mWagesModel, -1, this); dialog->show(); } void PrefsWages::slotEditWage(QModelIndex /* index */ ) { if ( mWagesTreeView->currentIndex().isValid() ) { int row = mWagesTreeView->currentIndex().row(); WagesEditDialog *dialog = new WagesEditDialog(mWagesModel, row, this); dialog->show(); } } void PrefsWages::slotDeleteWage() { if ( mWagesTreeView->currentIndex().isValid() ) { int row = mWagesTreeView->currentIndex().row(); mWagesModel->removeRows(row, 1); } } void PrefsWages::slotWageSelected(QModelIndex) { bool state = false; if ( mWagesTreeView->currentIndex().isValid() ) { state = true; } mEditWage->setEnabled( state ); mDelWage->setEnabled( state ); mUp->setEnabled( state ); mDown->setEnabled( state ); if(mWagesTreeView->currentIndex().row() == 0) mUp->setEnabled(false); if(mWagesTreeView->currentIndex().row() == (mProxyModel->rowCount() - 1)) mDown->setEnabled(false); } void PrefsWages::slotUp() { if ( mWagesTreeView->currentIndex().isValid() ) { int row = mWagesTreeView->currentIndex().row(); if(row != 0) { mProxyModel->setData(mProxyModel->index(row, 3), row, Qt::DisplayRole); mProxyModel->setData(mProxyModel->index(row, 3), row, Qt::EditRole); mProxyModel->setData(mProxyModel->index(row-1, 3), row + 1, Qt::DisplayRole); mProxyModel->setData(mProxyModel->index(row-1, 3), row + 1, Qt::EditRole); mProxyModel->sort(3, Qt::AscendingOrder); slotWageSelected(mWagesTreeView->currentIndex()); } } } void PrefsWages::slotDown() { if ( mWagesTreeView->currentIndex().isValid() ) { int row = mWagesTreeView->currentIndex().row(); if(row != (mProxyModel->rowCount() - 1)) { mProxyModel->setData(mProxyModel->index(row, 3), row + 2, Qt::DisplayRole); mProxyModel->setData(mProxyModel->index(row, 3), row + 2, Qt::EditRole); mProxyModel->setData(mProxyModel->index(row+1, 3), row + 1, Qt::DisplayRole); mProxyModel->setData(mProxyModel->index(row+1, 3), row + 1, Qt::EditRole); mProxyModel->sort(3, Qt::AscendingOrder); slotWageSelected(mWagesTreeView->currentIndex()); } } } WagesEditDialog::WagesEditDialog( QAbstractItemModel *model, int row, QWidget *parent ) : QDialog( parent ) { setObjectName( "WAGES_EDIT_DIALOG" ); setModal( true ); setWindowTitle( i18n( "Edit a wage group" ) ); QWidget *mainWidget = new QWidget; QVBoxLayout *mainLayout = new QVBoxLayout; QWidget *w = new QWidget; mainLayout->addWidget(w); mBaseWidget = new Ui::WagesEditBase( ); mBaseWidget->setupUi( w ); mBaseWidget->mWage->setSuffix( DefaultProvider::self()->currencySymbol() ); mBaseWidget->mWage->setMinimum( 0 ); mBaseWidget->mWage->setMaximum( 100000 ); mBaseWidget->mWage->setDecimals( 2 ); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); setLayout(mainLayout); mainLayout->addWidget(mainWidget); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); mModel = model; mapper = new QDataWidgetMapper(this); mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit); mapper->setModel(model); mapper->addMapping(mBaseWidget->mGroupName, 1); mapper->addMapping(mBaseWidget->mWage, 2); if(row == -1) { //Insert a new row at the end model->insertRow(model->rowCount()); mapper->toLast(); } else { mBaseWidget->mLabel->setText(i18n("

              Edit wage group

              ")); mapper->setCurrentIndex(row); } mRow = row; } void WagesEditDialog::accept() { mapper->submit(); QDialog::accept(); } void WagesEditDialog::reject() { if(mRow == -1) mModel->removeRow(mModel->rowCount()-1); QDialog::reject(); } WagesItemDelegate::WagesItemDelegate(QObject * parent) : QItemDelegate(parent) {} void WagesItemDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const { if(index.column() == 2) { Geld wage = index.data(Qt::DisplayRole).toDouble(); QString string = wage.toLocaleString(); drawDisplay(painter, option, option.rect, string); } else { QItemDelegate::paint(painter, option, index); } } kraft-1.2.2/src/prefswages.h000066400000000000000000000046321467704360200157470ustar00rootroot00000000000000/*************************************************************************** prefswages.h - the wages tab in the prefs dialog ------------------- begin : Feb 26 2010 copyright : (C) 2010 by Thomas Richard email : thomas.richard@proan.be ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef PREFSWAGES_H #define PREFSWAGES_H #include #include #include #include "ui_wageseditbase.h" class QModelIndex; class QPushButton; class ImpTreeView; class QAbstractItemModel; class QDataWidgetMapper; class QSqlTableModel; class QSortFilterProxyModel; class PrefsWages : public QWidget { Q_OBJECT public: PrefsWages(QWidget* parent); ~PrefsWages(); void save(); public slots: void slotAddWage(); void slotEditWage(QModelIndex index = QModelIndex()); void slotDeleteWage(); void slotWageSelected(QModelIndex); void slotUp(); void slotDown(); private: QPushButton *mDelWage; QPushButton *mEditWage; QPushButton *mUp; QPushButton *mDown; ImpTreeView *mWagesTreeView; QSqlTableModel *mWagesModel; QSortFilterProxyModel *mProxyModel; }; class WagesEditDialog: public QDialog, protected Ui::WagesEditBase { Q_OBJECT public: WagesEditDialog( QAbstractItemModel *model, int row, QWidget *parent ); public slots: void accept(); void reject(); private: Ui::WagesEditBase *mBaseWidget; QDataWidgetMapper *mapper; QAbstractItemModel *mModel; int mRow; }; class WagesItemDelegate : public QItemDelegate { Q_OBJECT public: WagesItemDelegate(QObject * parent = 0); virtual void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const; }; #endif kraft-1.2.2/src/reportgenerator.cpp000066400000000000000000000322501467704360200173530ustar00rootroot00000000000000/*************************************************************************** Report Generator based on Reportlab ------------------- begin : July 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "reportgenerator.h" #include "kraftdoc.h" #include "kraftdb.h" #include "unitmanager.h" #include "dbids.h" #include "kraftsettings.h" #include "docposition.h" #include "einheit.h" #include "archiveman.h" #include "archdoc.h" #include "documentman.h" #include "texttemplate.h" #include "defaultprovider.h" #include "doctype.h" #include "addressprovider.h" #include "grantleetemplate.h" #include "documenttemplate.h" #include "pdfconverter.h" namespace { QString saveToTempFile( const QString& doc ) { if ( ! doc.isEmpty() ) { QTemporaryFile temp; temp.setAutoRemove( false ); if ( temp.open() ) { QTextStream s(&temp); // The following explicit coding settings were needed for Qt 4.7.3, former Qt versions // seemed to default on UTF-8. Try to comment the following two lines for older Qt versions // if needed and see if the trml file on the disk still is UTF-8 encoded. QTextCodec *codec = QTextCodec::codecForName("UTF-8"); s.setCodec( codec ); s << doc; temp.close(); } else { // qDebug () << "ERROR: Could not open temporar file"; } qDebug () << "Wrote rml to " << temp.fileName(); return temp.fileName(); } return QString(); } } ReportGenerator::ReportGenerator() : _useGrantlee(true), mProcess(nullptr) { mAddressProvider = new AddressProvider(this); connect(mAddressProvider, &AddressProvider::lookupResult, this, &ReportGenerator::slotAddresseeFound); } ReportGenerator::~ReportGenerator() { // qDebug () << "ReportGen is destroyed!"; } /* * docID: document ID * dbId: database ID of the archived doc. * * This is the starting point of a report creation. */ void ReportGenerator::createDocument( ReportFormat format, const QString& docID, dbID archId ) { mDocId = docID; mArchId = archId; _requestedFormat = format; if( mProcess && mProcess->state() != QProcess::NotRunning ) { qDebug() << "===> WRN: Process still running, try again later."; emit failure(i18n("The document generation process is still running."), QString()); return; } // now the addressee search through the address provider is finished. // Rendering can be started. _archDoc.loadFromDb(archId); // the next call also sets the watermark options const QString dt = _archDoc.docTypeStr(); _tmplFile = findTemplateFile( dt ); if ( _tmplFile.isEmpty() ) { qDebug () << "tmplFile is empty, exit reportgenerator!"; return; } else { qDebug () << "Using this template: " << _tmplFile; } lookupCustomerAddress(); } void ReportGenerator::lookupCustomerAddress() { const QString clientUid = _archDoc.clientUid(); KContacts::Addressee contact; if( ! clientUid.isEmpty() ) { AddressProvider::LookupState state = mAddressProvider->lookupAddressee( clientUid ); switch( state ) { case AddressProvider::LookupFromCache: contact = mAddressProvider->getAddresseeFromCache(clientUid); break; case AddressProvider::LookupNotFound: case AddressProvider::ItemError: case AddressProvider::BackendError: // set an empty contact break; case AddressProvider::LookupOngoing: case AddressProvider::LookupStarted: // Not much to do, just wait and let the addressprovider // hit the slotAddresseFound return; } } slotAddresseeFound(clientUid, contact); } void ReportGenerator::slotAddresseeFound( const QString&, const KContacts::Addressee& contact ) { mCustomerContact = contact; // now the three pillars archDoc, myContact and mCustomerContact are defined. QFileInfo fi(_tmplFile); if (!fi.exists()) { emit failure(i18n("The temporary file %1 is not accessible.", _tmplFile), QString()); return; } const QString ext = fi.completeSuffix(); QScopedPointer templateEngine; QPointer converter; if (QString::compare(ext, QStringLiteral("trml"), Qt::CaseInsensitive) == 0) { // use the old ctemplate engine with reportlab. templateEngine.reset(new CTemplateDocumentTemplate(_tmplFile)); converter = new ReportLabPDFConverter; } else { // use Grantlee. templateEngine.reset(new GrantleeDocumentTemplate(_tmplFile)); converter = new WeasyPrintPDFConverter; } converter->setTemplatePath(fi.path()); // expand the template... const QString expanded = templateEngine->expand(&_archDoc, myContact, mCustomerContact); _cleanupFiles = templateEngine->tempFilesCreated(); if (expanded.isEmpty()) { emit failure(i18n("The template conversion failed."), templateEngine->error()); delete converter; return; } // ... and save to a tempoarary file const QString tempFile = saveToTempFile(expanded); if (tempFile.isEmpty()) { emit failure(i18n("Saving to temporary file failed."), QString()); delete converter; return; } _cleanupFiles.append(tempFile); QString fullOutputFilePath = targetFileName(); if (mMergeIdent >= 0 && mMergeIdent < 5 ) { // check if the watermark file exists QFileInfo fi(mWatermarkFile); if (!mWatermarkFile.isEmpty() && fi.isReadable()) { QTemporaryFile tmpFile; tmpFile.open(); tmpFile.close(); // PDF merge is required. Write to temp file fullOutputFilePath = tmpFile.fileName() + QStringLiteral(".pdf"); } else { mMergeIdent = 0; qDebug() << "Can not read watermark file, generating without" << mWatermarkFile; } } // Now there is the completed, expanded document source. connect( converter, &PDFConverter::docAvailable, this, &ReportGenerator::slotPdfDocAvailable); connect( converter, &PDFConverter::converterError, this, &ReportGenerator::slotConverterError); converter->convert(tempFile, fullOutputFilePath); } void ReportGenerator::slotPdfDocAvailable(const QString& file) { QObject *s = sender(); qDebug() << "The document is finished!:" << file; s->deleteLater(); // Remove tmp files that might have been created during the template expansion, // ie. the EPC QR Code SVG file. #ifndef QT_DEBUG for (const auto &file : _cleanupFiles) { QFile::remove(file); } #endif _cleanupFiles.clear(); // check for the watermark requirements if (mMergeIdent > 0 && mMergeIdent < 5) { // check if the watermark file exists mergePdfWatermark(file); } else { emit docAvailable(_requestedFormat, file, mCustomerContact); } } void ReportGenerator::mergePdfWatermark(const QString& file) { mProcess = new QProcess(); connect(mProcess, QOverload::of(&QProcess::finished), this, &ReportGenerator::pdfMergeFinished); QStringList args; if (mMergeIdent > 0) { const QStringList prg = DefaultProvider::self()->locatePythonTool(QStringLiteral("watermarkpdf.py")); if (!prg.isEmpty() && !mWatermarkFile.isEmpty()) { mProcess->setProgram(prg.at(0)); args << prg.at(1); args << QStringLiteral("-m") << QString::number(mMergeIdent); args << QStringLiteral("-o") << targetFileName(); if (!mPdfAppendFile.isEmpty()) { args << QStringLiteral("-a") << mPdfAppendFile; } args << mWatermarkFile; args << file; qDebug() << "Merge PDF Watermark args:" << args; mProcess->setArguments(args); mProcess->start( ); } else { qDebug() << "Watermark err:" << (prg.isEmpty() ? "Program" : "watermark file") << "is empty"; } } else { // no watermark is wanted, copy the converted file over. args << file; mProcess->setArguments(args); const QString target = targetFileName(); if (QFile::copy(file, target)) { pdfMergeFinished(0, QProcess::ExitStatus::NormalExit); } else { qDebug() << "ERR: Failed to copy temporary file"; } } } void ReportGenerator::pdfMergeFinished(int exitCode, QProcess::ExitStatus exitStatus) { mWatermarkFile.clear(); mPdfAppendFile.clear(); mMergeIdent = 0; if (exitStatus == QProcess::ExitStatus::NormalExit && exitCode == 0) { const QString fileName = targetFileName(); // remove the temp file which comes as arg in any case, even if the watermark // tool was not called. if (mProcess->arguments().size() > 0) { const QString tmpFile = mProcess->arguments().last(); QFile::remove(tmpFile); } mProcess->deleteLater(); mProcess = nullptr; emit docAvailable(_requestedFormat, fileName, mCustomerContact); } else { slotConverterError(PDFConverter::ConvError::PDFMergerError); } } void ReportGenerator::slotConverterError(PDFConverter::ConvError err) { auto *converter = qobject_cast(sender()); const QString errors = converter->getErrors(); QString errMsg; switch(err) { case PDFConverter::ConvError::NoError: errMsg = i18n("No converter error."); break; case PDFConverter::ConvError::TrmlToolFail: errMsg = i18n("The ReportLab based converter script cannot be executed."); break; case PDFConverter::ConvError::UnknownError: errMsg = i18n("An unknown error happened."); break; case PDFConverter::ConvError::NoReportLabMod: errMsg = i18n("The ReportLab python module is not installed."); break; case PDFConverter::ConvError::NoPyPDFMod: errMsg = i18n("The PyPDF2 python module is not installed."); break; case PDFConverter::ConvError::SourceFileFail: errMsg = i18n("The source file cannot be read."); break; case PDFConverter::ConvError::TargetFileError: errMsg = i18n("The target cannot be opened to write."); break; case PDFConverter::ConvError::TargetFileMissing: errMsg = i18n("The target file does not exist."); break; case PDFConverter::ConvError::WeasyPrintNotFound: errMsg = i18n("The WeasyPrint tool is not installed."); break; case PDFConverter::ConvError::PDFMergerError: errMsg = i18n("The PDF merger utility failed."); break; } emit failure(errMsg, errors); converter->deleteLater(); } QString ReportGenerator::targetFileName() const { ArchDocDigest dig = _archDoc.toDigest(); return dig.pdfArchiveFileName(); } QString ReportGenerator::findTemplateFile( const QString& type ) { DocType dType( type ); const QString tmplFile = dType.templateFile(); if ( tmplFile.isEmpty() ) { emit failure(i18n("There is not template defined for %1.", dType.name()), i18n("Make sure to define a template file in the settings dialog.")); } else { // a few file checks QFileInfo fi(tmplFile); if (!fi.isFile()) { emit failure(i18n("The template file %1 for document type %2 is not a file.", tmplFile, dType.name()), i18n("Make sure to pick a readable template file in the settings dialog")); return QString(); } if (!fi.isReadable()) { emit failure(i18n("The template file %1 for document type %2 can not be read.", tmplFile, dType.name()), i18n("Make sure the template file has proper file permissions.")); return QString(); } } mMergeIdent = dType.mergeIdent().toInt(); mWatermarkFile = dType.watermarkFile(); mPdfAppendFile = dType.appendPDF(); return tmplFile; } void ReportGenerator::setMyContact( const KContacts::Addressee& contact ) { myContact = contact; } kraft-1.2.2/src/reportgenerator.h000066400000000000000000000065331467704360200170250ustar00rootroot00000000000000/*************************************************************************** reportgenerator.h - report generation ------------------- begin : July 2006 copyright : (C) 2006 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef REPORTGENERATOR_H #define REPORTGENERATOR_H #include #include #include #include #include #include "kraftdoc.h" #include "archdoc.h" #include "pdfconverter.h" class dbID; class KJob; class QFile; class AddressProvider; class TextTemplate; enum class ReportFormat { PDF, PDFMail, HTML }; class ReportGenerator : public QObject { Q_OBJECT public: ReportGenerator(); ~ReportGenerator(); signals: void docAvailable( ReportFormat, const QString& file, const KContacts::Addressee& customerContact); void failure(const QString&, const QString&); public slots: void createDocument(ReportFormat, const QString&, dbID ); void setMyContact( const KContacts::Addressee& ); private slots: void slotPdfDocAvailable(const QString& file); void slotConverterError(PDFConverter::ConvError err); void mergePdfWatermark(const QString &file); void pdfMergeFinished(int exitCode, QProcess::ExitStatus exitStatus); private: QString findTemplateFile( const QString& ); void lookupCustomerAddress(); QString _tmplFile; ArchDoc _archDoc; protected: QStringList _cleanupFiles; protected slots: void slotAddresseeFound( const QString&, const KContacts::Addressee& ); private: void convertTemplate( const QString& ); void fillupTemplateFromArchive( const dbID& ); void contactToTemplate( TextTemplate*, const QString&, const KContacts::Addressee& ); QString registerDictionary( const QString&, const QString& ) const; QString registerTag( const QString&, const QString& ) const; QString registerDictTag( const QString&, const QString&, const QString& ) const; QString targetFileName() const; QString escapeTrml2pdfXML( const QString& str ) const; QString rmlString( const QString& str, const QString& paraStyle = QString() ) const; bool _useGrantlee; QString mErrors; int mMergeIdent; bool mHavePdfMerge; QString mWatermarkFile; QString mPdfAppendFile; QString mDocId; dbID mArchId; long mOutputSize; KContacts::Addressee mCustomerContact; KContacts::Addressee myContact; QPointer mProcess; QFile mFile; QDataStream mTargetStream; AddressProvider *mAddressProvider; ReportFormat _requestedFormat; }; #endif kraft-1.2.2/src/setupassistant.cpp000066400000000000000000000730631467704360200172320ustar00rootroot00000000000000/*************************************************************************** setupassistant - assistant to setup kraft from scratch ------------------- begin : 2009-12-26 copyright : (C) 2009 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include "setupassistant.h" #include "databasesettings.h" #include "defaultprovider.h" #include "kraftdb.h" #include "addressselectorwidget.h" #include "kraftsettings.h" WelcomePage::WelcomePage(QWidget *parent) :QWizardPage(parent) { setTitle( i18n("Welcome to the Kraft Setup Assistant")); QVBoxLayout *vbox = new QVBoxLayout; setLayout( vbox ); QWidget *w = new QWidget; vbox->addWidget( w ); ui.setupUi(w); } void WelcomePage::setWelcomeText( const QString& txt ) { ui.mStatusText->setText( txt ); } // --------------------------------------------------------------------------- DbSelectPage::DbSelectPage(QWidget *parent) :QWizardPage(parent) { setTitle(i18n("Select the Database Backend")); QVBoxLayout *vbox = new QVBoxLayout; setLayout( vbox ); QWidget *w = new QWidget; vbox->addWidget( w ); ui.setupUi(w); registerField("SelectedDbDriverSqlite", ui.mRbSqlite3); registerField("SelectedDbDriverMySql", ui.mRbMySQL); } int DbSelectPage::nextId() const { if( ui.mRbSqlite3->isChecked() ) { return SetupAssistant::sqlitePageNo; } else { return SetupAssistant::mySqlPageNo; } } QString DbSelectPage::selectedDriver() const { QString re = "QSQLITE"; if( field("SelectedDbDriverMySql").toBool() ) { re = "QMYSQL"; } return re; } // --------------------------------------------------------------------------- SqLiteDetailsPage::SqLiteDetailsPage(QWidget *parent) :QWizardPage(parent) { setTitle(i18n("Sqlite File Name")); QVBoxLayout *vbox = new QVBoxLayout; setLayout(vbox); QWidget *w = new QWidget; vbox->addWidget( w ); ui.setupUi(w); // ui.mFileUrl->setText(DatabaseSettings::self()->dbFile()); registerField("DefaultSqliteStorage", ui.mRbDefault ); registerField("SqliteStorageFile", ui._fileName); // Preset the sqlite storage const QString fileName = DatabaseSettings::self()->dbFile(); if( ! fileName.isEmpty()) { ui.mRbCustom->setChecked(true); setField("SqliteStorageFile", fileName); } } QUrl SqLiteDetailsPage::url() { QString fileName; if( ui.mRbDefault->isChecked() ) { fileName = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); } else { fileName = ui._fileName->text(); } if( ! fileName.endsWith("/")) fileName += QLatin1String("/"); fileName += QLatin1String("kraft.db"); return QUrl::fromLocalFile(fileName); } bool SqLiteDetailsPage::validatePage() { return qobject_cast(wizard())->handleSqLiteDetails(); } int SqLiteDetailsPage::nextId() const { if( KraftDB::self()->databaseExists() ) { return SetupAssistant::upgradeDbPageNo; } else { return SetupAssistant::createDbPageNo; } } // --------------------------------------------------------------------------- MysqlDetailsPage::MysqlDetailsPage(QWidget *parent) :QWizardPage(parent) { setTitle(i18n("MySql Detail Information")); QVBoxLayout *vbox = new QVBoxLayout; setLayout( vbox ); QWidget *w = new QWidget; vbox->addWidget( w ); ui.setupUi(w); registerField("MySqlHost", ui.mMysqlHost); registerField("MySqlUser", ui.mMysqUser ); registerField("MySqlDbName", ui.mMysqlDbName); registerField("MySqlPwd", ui.mMysqlPwd ); reloadSettings(); } void MysqlDetailsPage::reloadSettings() { setField("MySqlHost", DatabaseSettings::self()->dbServerName()); setField("MySqlUser", DatabaseSettings::self()->dbUser()); setField("MySqlDbName", DatabaseSettings::self()->dbDatabaseName()); setField("MySqlPwd", DatabaseSettings::self()->dbPassword()); } int MysqlDetailsPage::nextId() const { if( KraftDB::self()->databaseExists() ) { return SetupAssistant::upgradeDbPageNo; } else { return SetupAssistant::createDbPageNo; } } bool MysqlDetailsPage::validatePage() { bool re = qobject_cast(wizard())->handleMysqlDetails(); return re; } // --------------------------------------------------------------------------- CreateDbPage::CreateDbPage(QWidget *parent) :QWizardPage(parent) { setTitle(i18n("Create Database")); QVBoxLayout *vbox = new QVBoxLayout; setLayout( vbox ); QWidget *w = new QWidget; vbox->addWidget( w ); ui.setupUi(w); registerField("CreateDbStatusText", ui.mCreateStatus); } void CreateDbPage::setStatusText( const QString& t ) { ui.mCreateStatus->setText( t ); } void CreateDbPage::setFillCmdsCount( int cnt ) { mFills = 0; ui.mFillProgress->setMaximum( cnt ); ui.mFillProgress->setValue( 0 ); ui.mFillCounter->setText( i18n("0/%1", cnt) ); } void CreateDbPage::setFillCmdsCurrent( int cnt ) { ui.mFillProgress->setValue( cnt ); } void CreateDbPage::setCreateCmdsCount( int cnt ) { mCreates = 0; ui.mCreateProgress->setMaximum( cnt ); ui.mCreateProgress->setValue( 0 ); ui.mCreateCounter->setText( i18n("0/%1", cnt)); } void CreateDbPage::setCreateCmdsCurrent( int cnt ) { ui.mCreateProgress->setValue( cnt ); } void CreateDbPage::slotStatusMessage( const QString& msg ) { // qDebug () << "############### success: " << msg; ui.mCreateStatus->setText( msg ); } void CreateDbPage::slotCountCreateProgress( bool res ) { if( res ) { mCreates++; ui.mCreateProgress->setValue( mCreates ); ui.mCreateCounter->setText( i18n("%1/%2", mCreates, ui.mCreateProgress->maximum() ) ); } } void CreateDbPage::slotCountFillProgress( bool res ) { if( res ) { mFills++; ui.mFillProgress->setValue( mFills ); ui.mFillCounter->setText( i18n("%1/%2", mFills, ui.mFillProgress->maximum() ) ); } } int CreateDbPage::nextId() const { return SetupAssistant::upgradeDbPageNo; } // --------------------------------------------------------------------------- UpgradeDbPage::UpgradeDbPage(QWidget *parent) :QWizardPage(parent) { setTitle(i18n("Upgrade the Database")); QVBoxLayout *vbox = new QVBoxLayout; setLayout( vbox ); QWidget *w = new QWidget; vbox->addWidget( w ); ui.setupUi(w); } void UpgradeDbPage::slotSetStatusText( const QString& txt ) { ui.mUpgradeStatus->setText( txt ); } void UpgradeDbPage::slotSetOverallCount( int cnt ) { mUpgrades = 0; ui.mUpgradeProgress->setMaximum( cnt ); ui.mUpgradeProgress->setValue( 0 ); updateCounter(); } void UpgradeDbPage::updateCounter() { ui.mUpgradeCounter->setText( i18n("%1/%2", mUpgrades, ui.mUpgradeProgress->maximum() )); } void UpgradeDbPage::slotCountFillProgress( bool res ) { if( res ) { mUpgrades++; ui.mUpgradeProgress->setValue( mUpgrades ); updateCounter(); } } int UpgradeDbPage::nextId() const { return SetupAssistant::ownAddressPageNo; } // --------------------------------------------------------------------------- OwnAddressPage::OwnAddressPage(QWidget *parent) :QWizardPage(parent), mAddresses(nullptr) { setTitle(i18n("Your Company Address")); QVBoxLayout *vbox = new QVBoxLayout; QTabWidget *tabWidget = new QTabWidget; QLabel *l = new QLabel; l->setText( i18n("Select your companies address either from the address book or enter it manually. It is set as a consigner on the documents.") ); vbox->addWidget( l ); vbox->addWidget(tabWidget); setLayout(vbox); // == The AddressSelector page #ifdef HAVE_AKONADI QWidget *w = new QWidget; tabWidget->addTab(w, i18n("Select from Addressbook")); QVBoxLayout *vbox1 = new QVBoxLayout; mAddresses = new AddressSelectorWidget(this); vbox1->addWidget( mAddresses ); w->setLayout( vbox1 ); connect( mAddresses, SIGNAL( addressSelected(KContacts::Addressee)), SLOT( gotMyAddress( KContacts::Addressee ) ) ); #endif // == The manual page QWidget *w1 = new QWidget; ui.setupUi(w1); int id = tabWidget->addTab(w1, i18n("Manual Entry")); ui.nameLabel->setText( KContacts::Addressee::formattedNameLabel() ); ui.orgLabel->setText( KContacts::Addressee::organizationLabel()); ui.streetLabel->setText(KContacts::Addressee::businessAddressStreetLabel()); ui.postCodeLabel->setText(KContacts::Addressee::businessAddressPostalCodeLabel()); ui.cityLabel->setText(KContacts::Addressee::businessAddressLocalityLabel()); ui.phoneLabel->setText(KContacts::Addressee::businessPhoneLabel()); ui.faxLabel->setText(KContacts::Addressee::businessFaxLabel()); ui.mobileLabel->setText(KContacts::Addressee::mobilePhoneLabel()); ui.emailLabel->setText(KContacts::Addressee::emailLabel()); ui.websiteLabel->setText(KContacts::Addressee::urlLabel()); if( mAddresses && !mAddresses->backendUp() ) { tabWidget->setCurrentIndex(id); } } OwnAddressPage::~OwnAddressPage() { } void OwnAddressPage::gotMyAddress(const KContacts::Addressee& addressee) { mMe = addressee; } void OwnAddressPage::saveOwnName() { if( ! mMe.isEmpty() ) { KraftSettings::self()->setUserName( mMe.name() ); KraftSettings::self()->setUserUid( mMe.uid() ); KraftSettings::self()->save(); } else { // check for the manual. KContacts::Addressee add; add.setFormattedName(ui.leName->text()); add.setOrganization(ui.leOrganization->text()); KContacts::Address workAddress; workAddress.setStreet(ui.leStreet->text()); workAddress.setPostalCode(ui.lePostcode->text()); workAddress.setLocality(ui.leCity->text()); workAddress.setType(KContacts::Address::Work); add.insertAddress(workAddress); add.insertPhoneNumber(PhoneNumber(ui.lePhone->text(), KContacts::PhoneNumber::Work)); add.insertPhoneNumber(PhoneNumber(ui.leFax->text(), KContacts::PhoneNumber::Fax)); add.insertPhoneNumber(PhoneNumber(ui.leMobile->text(), KContacts::PhoneNumber::Cell)); ResourceLocatorUrl resUrl; resUrl.setUrl(QUrl(ui.leWebsite->text())); add.setUrl(resUrl); add.insertEmail(ui.leEmail->text(), true /* prefered */ ); VCardConverter vcc; QByteArray vcard = vcc.createVCard(add); QString file = QStandardPaths::writableLocation( QStandardPaths::AppDataLocation ); file += "/myidentity.vcd"; QFile f ( file ); if (f.open(QIODevice::WriteOnly | QIODevice::Text)) { f.write(vcard); f.close(); qDebug() << "Saved own identity to " << file; } } } int OwnAddressPage::nextId() const { return SetupAssistant::finalStatusPageNo; } // --------------------------------------------------------------------------- FinalStatusPage::FinalStatusPage(QWidget *parent) :QWizardPage(parent) { setTitle(i18n("Final Status")); QVBoxLayout *vbox = new QVBoxLayout; setLayout( vbox ); //TODO PORT QT5 vbox->setSpacing( QDialog::spacingHint() ); //TODO PORT QT5 vbox->setMargin( QDialog::marginHint() ); QWidget *w = new QWidget; vbox->addWidget( w ); ui.setupUi(w); ui.mStatusText->setTextFormat( Qt::RichText ); } void FinalStatusPage::slotSetStatusText( const QString& txt ) { ui.mStatusText->setText( txt ); } int FinalStatusPage::nextId() const { return -1; // final page } // --------------------------------------------------------------------------- SetupAssistant::SetupAssistant( QWidget *parent ) :QWizard( parent ), mMode( Reinit ) { setPage( welcomePageNo, new WelcomePage); setPage( dbSelectPageNo, new DbSelectPage); setPage( mySqlPageNo, new MysqlDetailsPage); setPage( sqlitePageNo, new SqLiteDetailsPage); setPage( createDbPageNo, new CreateDbPage); setPage( upgradeDbPageNo, new UpgradeDbPage); setPage( ownAddressPageNo, new OwnAddressPage); setPage( finalStatusPageNo, new FinalStatusPage); connect( this, SIGNAL( currentIdChanged( int) ), this, SLOT( slotCurrentPageChanged( int) ) ); resize( QSize( 450, 260 ) ); } /* * Current Database Setup Wizard +----------------+ check if db already exists ----------------------------- > | MySQL Page ----------------------------------+ -/ +--------+-------+ v +------------+ +--------------/ | +----------------+ +---------------+ | Welcome --->| DB Select | +--->+---------> | create DB Page +--->| upgrade DB | +------------+ +--------------\ | +----------------+ +-----------+---+ -\ +---+------------+ ^ | > | SQLite Page ----------------------------------+ | +----------------+ | | +---------------+ +-----------v---+ | Final Status |<---+ Own Address | +---------------+ +---------------+ */ QString SetupAssistant::defaultSqliteFilename() const { const QString path = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation); QFileInfo fi(path, "kraft.db"); if( !fi.dir().exists() ) { if (! fi.dir().mkpath(path) ) { qDebug() << "Failed to create directory "<< path << "for sqlite db"; return QString(); } } return fi.filePath(); } void SetupAssistant::slotCurrentPageChanged( int currId ) { qDebug() << "Page changed to " << currId; if( currId == dbSelectPageNo ) { } else if( currId == mySqlPageNo ) { // TODO: set the mysql datails } else if( currId == sqlitePageNo) { // TODO set the sqlite filename } else if( currId == createDbPageNo ) { if( mSqlBackendDriver == QLatin1String("QMYSQL") ) { const QString dbName = field("MySqlDbName").toString(); if(!KraftDB::self()->dbConnect( QLatin1String("QMYSQL"), dbName, field("MySqlUser").toString(), field("MySqlHost").toString(), field("MySqlPwd").toString() ) ) { setField("CreateDbStatusText", i18n( "

              Can't connect to your database. Are you sure your credentials are correct and the database exists?

              ") ); return; } } else { QString filename = field("SqliteStorageFile").toString(); if(filename.isEmpty()) { filename = defaultSqliteFilename(); setField("SqliteStorageFile", filename); } if( !KraftDB::self()->dbConnect( QLatin1String("QSQLITE"), filename, QString(), QString(), QString()) ) { setField("CreateDbStatusText", i18n("

              Can't open your database file, check the permissions and such.")); } } if( !KraftDB::self()->databaseExists() ) { // qDebug () << "Start to create the database"; startDatabaseCreation(); } else { // qDebug () << "CreateDB-Page: Database already existing"; setField("CreateDbStatusText", i18n( "

              The database is already existing, no action needs to be taken here.

              " "

              Please hit next to proceed.

              " ) ); } } if( currId == upgradeDbPageNo ) { if( KraftDB::self()->databaseExists() ) { // qDebug () << "start to update the database"; startDatabaseUpdate(); } else { // qDebug () << "Strange problem at dbupdate: DB does not exist"; } } if( currId == finalStatusPageNo ) { finalizePage(); } } void SetupAssistant::done( int result ) { if( result > 0 ) { // store the stakeholders own name for picking the sender address qobject_cast(page(ownAddressPageNo))->saveOwnName(); const QString selectedDriver = qobject_cast(page(dbSelectPageNo))->selectedDriver(); DatabaseSettings::self()->setDbDriver( selectedDriver ); if( selectedDriver == QLatin1String("QSQLITE") ) { const QString file = field("SqliteStorageFile").toString(); DatabaseSettings::self()->setDbFile(file); } if( selectedDriver == "QMYSQL" ) { DatabaseSettings::self()->setDbDatabaseName( field("MySqlDbName").toString() ); DatabaseSettings::self()->setDbUser( field("MySqlUser").toString() ); const QString host = field("MySqlHost").toString(); DatabaseSettings::self()->setDbServerName( host ); DatabaseSettings::self()->setDbPassword( field("MySqlPwd").toString() ); } DatabaseSettings::self()->save(); qDebug () << "Database backend config written"; } QWizard::done(result); } void SetupAssistant::finalizePage() { QString txt; if( mErrors.isEmpty() ) { txt = i18n( "

              The database setup was successfully completed.

              " ); txt += i18n("

              You can start to work with Kraft now. Please do not forget to

              "); txt += "
                "; txt += i18n("
              • adjust various settings in the Kraft Preferences dialog.
              • " ); txt += i18n("
              • Check the Catalog chapter list.
              • " ); txt += i18n("
              • Make your business and have fun.
              • " ); txt += "
              "; txt += i18n("

              If you press Finish now, the new database configuration is stored in Krafts configuration.

              "); } else { foreach( QString err, mErrors ) { txt += "

              " + err + "

              "; } } // qDebug() << "this is the status text: " << txt; qobject_cast(page(finalStatusPageNo))->slotSetStatusText( txt ); } void SetupAssistant::startDatabaseUpdate() { CreateDbPage *mCreateDbPage = qobject_cast(page(createDbPageNo)); UpgradeDbPage *mUpgradeDbPage = qobject_cast(page(upgradeDbPageNo)); if( ! KraftDB::self()->isOk() ) { mCreateDbPage->setStatusText( i18n("Database cannot be connected. Please check the database credentials.")); button(NextButton)->setEnabled(false); return; } if( !KraftDB::self()->databaseExists() ) { mCreateDbPage->setStatusText( i18n("Database core tables do not exist. Please check the initial setup.")); button(NextButton)->setEnabled(false); return; } button(NextButton)->setEnabled(true); if( KraftDB::self()->currentSchemaVersion() == KraftDB::self()->requiredSchemaVersion() ) { mUpgradeDbPage->slotSetStatusText( i18n("Database is up-to-date. No upgrade is required.")); return; } // Database really needs update mUpgradeDbPage->slotSetStatusText( i18n("Parsing update commands…")); int overallCmdCount = 0; QList commandLists; int currentVer = KraftDB::self()->currentSchemaVersion(); if( currentVer == -1 ) currentVer = 1; // set to initial version while ( currentVer < KraftDB::self()->requiredSchemaVersion() ) { ++currentVer; // qDebug () << "######### Reading " << migrateFilename; const SqlCommandList cmds = KraftDB::self()->parseCommandFile( currentVer ); commandLists.append(cmds); overallCmdCount += cmds.count(); qDebug() << "Appending" << cmds.count() << "commands for version" << currentVer; } mUpgradeDbPage->slotSetOverallCount( overallCmdCount ); // qDebug () << "4."; connect( KraftDB::self(), SIGNAL( statusMessage( const QString& ) ), mUpgradeDbPage, SLOT( slotSetStatusText( const QString& ) ) ); connect( KraftDB::self(), SIGNAL( processedSqlCommand( bool ) ), mUpgradeDbPage, SLOT( slotCountFillProgress( bool ) ) ); int doneOverallCmds = 0; bool errors = false; currentVer = KraftDB::self()->currentSchemaVersion(); for( SqlCommandList cmdList : commandLists ) { currentVer++; int goodCmds = KraftDB::self()->processSqlCommands( cmdList ); doneOverallCmds += goodCmds; if( goodCmds != cmdList.count() ) { qDebug () << "Only performned " << goodCmds << " out of " << cmdList.count(); errors = true; break; } else { qDebug () << goodCmds << " commands performed well, version is " << currentVer << ", listversion:" << cmdList.number(); KraftDB::self()->setSchemaVersion( QString::number( currentVer )); } } if( errors ) { mUpgradeDbPage->slotSetStatusText( i18n("Upgrade failed!") );; } else { mUpgradeDbPage->slotSetStatusText( i18n("Upgrade succeeded, the current schema version is %1!", KraftDB::self()->requiredSchemaVersion() ) );; } disconnect( mUpgradeDbPage, SLOT( slotSetStatusText( const QString& ))); } void SetupAssistant::startDatabaseCreation() { CreateDbPage *mCreateDbPage = qobject_cast(page(createDbPageNo)); if( ! KraftDB::self()->isOk() ) { mCreateDbPage->setStatusText( i18n("Cannot connect to the database. Please check the database credentials!")); button(NextButton)->setEnabled(false); return; } button(NextButton)->setEnabled(true); mCreateDbPage->setStatusText( i18n("Parsing creation commands…") ); SqlCommandList createCommands = KraftDB::self()->parseCommandFile( "create_schema.sql"); QString dbFill( "fill_schema_en.sql" ); if ( DefaultProvider::self()->locale()->country() == QLocale::Germany ) { dbFill = "fill_schema_de.sql"; } mCreateDbPage->setStatusText( i18n( "Parsing database fill-up commands…" ) ); SqlCommandList fillCommands = KraftDB::self()->parseCommandFile( dbFill ); mCreateDbPage->setCreateCmdsCount( createCommands.count() ); mCreateDbPage->setCreateCmdsCurrent( 0 ); mCreateDbPage->setFillCmdsCount( fillCommands.count() ); mCreateDbPage->setFillCmdsCurrent( 0 ); connect( KraftDB::self(), SIGNAL( statusMessage( const QString& ) ), mCreateDbPage, SLOT( slotStatusMessage( const QString& ) ) ); connect( KraftDB::self(), SIGNAL( processedSqlCommand( bool ) ), mCreateDbPage, SLOT( slotCountCreateProgress( bool ) ) ); mCreateDbPage->setStatusText( i18n( "Processing database creation commands…") ); int creates = KraftDB::self()->processSqlCommands( createCommands ); bool res = true; if( creates != createCommands.count() ) { // qDebug () << "NOT all create commands succeeded!"; res = false; } else { // qDebug () << creates << "(=All) create commands succeeded!"; // lets do the fillup disconnect( KraftDB::self(), SIGNAL(processedSqlCommand(bool)),0,0 ); connect( KraftDB::self(), SIGNAL( processedSqlCommand( bool ) ), mCreateDbPage, SLOT( slotCountFillProgress( bool ) ) ); mCreateDbPage->setStatusText( i18n( "Process database fill-up commands…" ) ); creates = KraftDB::self()->processSqlCommands( fillCommands ); if( creates != fillCommands.count() ) { qDebug() << "Could not execute all fill commands"; res = false; } } if( res ) { mCreateDbPage->setStatusText( i18n( "Commands finished successfully." ) ); } else { mCreateDbPage->setStatusText( i18n( "Failed to perform all commands." ) ); // FIXME: Disable next button } disconnect( KraftDB::self(), SIGNAL(statusMessage( const QString&)),0 ,0 ); disconnect( KraftDB::self(), SIGNAL(processedSqlCommand(bool)),0 ,0 ); } bool SetupAssistant::handleSqLiteDetails() { DbSelectPage *mDbSelectPage = qobject_cast(page(dbSelectPageNo)); QString file = field("SqliteStorageFile").toString(); qDebug () << "The SqlLite database file is " << file; mSqlBackendDriver = mDbSelectPage->selectedDriver(); // qDebug () << "The database driver is " << mSqlBackendDriver; bool re = KraftDB::self()->dbConnect( mSqlBackendDriver, file, QString(), QString(), QString() ); return re; } bool SetupAssistant::handleMysqlDetails() { DbSelectPage *mDbSelectPage = qobject_cast(page(dbSelectPageNo)); mSqlBackendDriver = mDbSelectPage->selectedDriver(); QString hostName = field("MySqlHost").toString(); QString databaseName = field("MySqlDbName").toString(); QString userName = field("MySqlUser").toString(); QString password = field("MySqlPwd").toString(); return KraftDB::self()->dbConnect( mSqlBackendDriver, databaseName, userName, hostName, password ); } bool SetupAssistant::init( Mode mode ) { bool startDialog = false; QString text; QString configOrigin; mMode = mode; text = QLatin1String("

              ") + i18n("This assistant guides you through the basic settings of your Kraft installation.") + QLatin1String("

              "); bool hitNextClosing = true; if( mMode == Reinit ) { startDialog = true; } else if( mode == Update ) { if( QStandardPaths::locate(QStandardPaths::GenericConfigLocation, "kraftdatabaserc" ).isEmpty() ) { // migration failed and we do not have a config file. All from scratch configOrigin = i18n("No database configuration found."); } else { configOrigin = i18n("A valid current database configuration file was found."); // qDebug () << "A standard KDE Platform 4.x database config file is there."; } const QString dbDriver = DatabaseSettings::self()->dbDriver().toUpper(); QString dbName = DatabaseSettings::self()->dbDatabaseName(); if( dbDriver == QLatin1String("QSQLITE")) { dbName = DatabaseSettings::self()->dbFile(); } if( KraftDB::self()->dbConnect( dbDriver, dbName, DatabaseSettings::self()->dbUser(), DatabaseSettings::self()->dbServerName(), DatabaseSettings::self()->dbPassword()) ) { // try to connect with default values // qDebug () << "The database can be opened!"; if( KraftDB::self()->databaseExists() ) { // qDebug () << "The database exists."; if( KraftDB::self()->currentSchemaVersion() < KraftDB::self()->requiredSchemaVersion() ) { // qDebug () << "Need a database schema update."; startDialog = true; configOrigin += QLatin1String(" ") + i18n("The database schema version is too old. " "It will be updated."); } else if( KraftDB::self()->currentSchemaVersion() > KraftDB::self()->requiredSchemaVersion() ) { configOrigin += QLatin1Char(' ') + i18n("The current database schema version is too new. Leaving untouched! "); // qDebug () << "Database Schema is OK. Nothing to do for StartupAssistant"; } } else { // qDebug () << "The database is not existing. It needs to be recreated."; startDialog = true; text = i18n( "

              The database can be opened, but does not contain valid content.

              " "

              A new database can be created automatically from scratch.

              "); } } else { // unable to connect to the database at all startDialog = true; hitNextClosing = false; text = i18n( "

              Kraft failed to connect to the configured database.

              " ); if( KraftDB::self()->qtDriver().toUpper() == "QMYSQL" ) { text += i18n( "

              Please check the database server setup and restart Kraft to connect." ); } else { text += i18n("

              Please check the database file."); } text += " " + i18n( "Or create a new database by pressing Next.

              " ); } } if( startDialog ) { WelcomePage *welcomePage = qobject_cast(page(welcomePageNo)); if( hitNextClosing ) text += i18n("

              Please hit Next, and follow the instructions.

              "); welcomePage->setWelcomeText( configOrigin + text ); } return startDialog ; } SetupAssistant::~SetupAssistant() { } kraft-1.2.2/src/setupassistant.h000066400000000000000000000120441467704360200166670ustar00rootroot00000000000000/*************************************************************************** setupassistant - assistant to setup kraft from scratch ------------------- begin : 2009-12-26 copyright : (C) 2009 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef SETUPASSISTANT_H #define SETUPASSISTANT_H #include #include #include #include "ui_statuspage.h" #include "ui_dbselect.h" #include "ui_mysqldetails.h" #include "ui_createdb.h" #include "ui_upgradedb.h" #include "ui_sqlitedetails.h" #include "ui_identity.h" #include "kraftcat_export.h" class QUrl; class AddressSelectorWidget; using namespace KContacts; class WelcomePage:public QWizardPage { Q_OBJECT public: WelcomePage( QWidget *parent = 0 ); void setWelcomeText( const QString& ); private: Ui::statusPage ui; }; // --------------------------------------------------------------------------- class DbSelectPage:public QWizardPage { Q_OBJECT public: DbSelectPage( QWidget *parent = 0 ); QString selectedDriver() const; int nextId() const; private: Ui::dbSelectForm ui; }; // --------------------------------------------------------------------------- class SqLiteDetailsPage:public QWizardPage { Q_OBJECT public: SqLiteDetailsPage( QWidget *parent = 0 ); QUrl url(); int nextId() const; bool validatePage(); private: Ui::sqLiteDetailsForm ui; }; // --------------------------------------------------------------------------- class MysqlDetailsPage:public QWizardPage { Q_OBJECT public: MysqlDetailsPage( QWidget *parent = 0 ); void reloadSettings(); int nextId() const; bool validatePage(); private: Ui::mySqlDetailsForm ui; }; // --------------------------------------------------------------------------- class CreateDbPage:public QWizardPage { Q_OBJECT public: CreateDbPage( QWidget *parent = 0 ); void setStatusText( const QString& ); void setCreateCmdsCount( int ); void setFillCmdsCount( int ); void setCreateCmdsCurrent( int ); void setFillCmdsCurrent( int ); int nextId() const; public slots: void slotStatusMessage( const QString& ); void slotCountCreateProgress( bool ); void slotCountFillProgress( bool ); private: Ui::createDbForm ui; int mCreates; int mFills; }; // --------------------------------------------------------------------------- class UpgradeDbPage:public QWizardPage { Q_OBJECT public: UpgradeDbPage( QWidget *parent = 0 ); int nextId() const; public slots: void slotSetStatusText( const QString& ); void slotSetOverallCount( int ); void slotCountFillProgress( bool ); private: void updateCounter(); Ui::upgradeDbForm ui; int mUpgrades; }; // --------------------------------------------------------------------------- class OwnAddressPage:public QWizardPage { Q_OBJECT public: OwnAddressPage( QWidget *parent=0 ); ~OwnAddressPage(); void saveOwnName(); int nextId() const; private: AddressSelectorWidget *mAddresses; KContacts::Addressee mMe; Ui::manualOwnIdentity ui; private slots: void gotMyAddress( const KContacts::Addressee& addressee); }; // --------------------------------------------------------------------------- class FinalStatusPage:public QWizardPage { Q_OBJECT public: FinalStatusPage( QWidget *parent = 0 ); int nextId() const; public slots: void slotSetStatusText( const QString& ); private: Ui::statusPage ui; }; // --------------------------------------------------------------------------- class SetupAssistant: public QWizard { Q_OBJECT public: enum { welcomePageNo, dbSelectPageNo, mySqlPageNo, sqlitePageNo, createDbPageNo, upgradeDbPageNo, finalStatusPageNo, ownAddressPageNo }; enum Mode{ Reinit, Update }; SetupAssistant( QWidget *parent = 0 ); bool init( Mode ); ~SetupAssistant(); bool handleSqLiteDetails(); bool handleMysqlDetails(); public slots: void done( int ); private slots: void slotCurrentPageChanged(int currId); private: void startDatabaseCreation(); void startDatabaseUpdate(); void finalizePage(); QString defaultSqliteFilename() const; Mode mMode; QStringList mErrors; QString mSqlBackendDriver; }; #endif // SETUPASSISTANT_H kraft-1.2.2/src/sqlitedetails.ui000066400000000000000000000041351467704360200166340ustar00rootroot00000000000000 sqLiteDetailsForm 0 0 421 245 Please enter the settings for the SQLite database. Pick a filename to name the SQLite database file or leave the default setting. true store the database file at default place. true buttonGroup select a file name: buttonGroup Qt::Vertical 20 107 kraft-1.2.2/src/statuspage.ui000066400000000000000000000015211467704360200161410ustar00rootroot00000000000000 statusPage 0 0 404 185 TextLabel Qt::RichText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true kraft-1.2.2/src/stdsatzman.cpp000066400000000000000000000063751467704360200163320ustar00rootroot00000000000000/*************************************************************************** stdsatzman - ------------------- begin : 2004-13-09 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include #include // include files for KDE #include "stdsatzman.h" #include "kraftdb.h" Q_GLOBAL_STATIC(StdSatzMan, mSelf) StdSatz::StdSatz(): m_dbId(0) { } StdSatz::StdSatz( int id ): m_dbId(id) { } StdSatz::StdSatz( int id, const QString& name, Geld g ): m_dbId(id), m_name(name), m_value(g) { } /* * ********** Stundensatz Duration ********** */ StdSatzDuration::StdSatzDuration() :mDuration( -1 ) { } StdSatzDuration::StdSatzDuration( const StdSatz& std, int dur ) :StdSatz( std ), mDuration( dur ) { } /* * ********** Stundensatz Manager ********** */ StdSatzMan *StdSatzMan::self() { return mSelf; } StdSatzMan::StdSatzMan( ) { load(); } QStringList StdSatzMan::allStdSaetze() { QStringList list; load(); StdSatzVector::iterator it; for( it = mStdSaetze.begin(); it != mStdSaetze.end(); ++it ) { QString n = (*it).getName(); if( !n.isEmpty()) list << n; } return list; } StdSatz StdSatzMan::getStdSatz( const QString& name ) { load(); StdSatzVector::iterator it; for( it = mStdSaetze.begin(); it != mStdSaetze.end(); ++it ) { if( (*it).getName() == name ) return (*it); } return StdSatz(); } StdSatz StdSatzMan::getStdSatz( dbID id ) { load(); StdSatzVector::iterator it; for( it = mStdSaetze.begin(); it != mStdSaetze.end(); ++it ) { dbID dbid = (*it).getId(); if( dbid == id ) return (*it); } return StdSatz(); } StdSatzMan::~StdSatzMan( ) { } void StdSatzMan::load() { /* noetige Groesse rausfinden */ int max = -1; QSqlQuery q("SELECT count(*) from stdSaetze;"); if( q.isActive()) { q.next(); max = q.value(0).toInt(); } // qDebug () << "Groesse fuer Stundensatzliste: " << max; mStdSaetze.resize( max ); /* Daten laden */ q.prepare("SELECT stdSaetzeID, name, price FROM stdSaetze ORDER BY sortKey"); q.exec(); while( q.next() ) { int satzID = q.value(0).toInt(); // qDebug () << "Neue StdSatz ID " << satzID; // resize if index is to big. StdSatz ss( satzID, q.value(1).toString(), Geld( q.value(2).toDouble())); mStdSaetze.append(ss); } } /* END */ kraft-1.2.2/src/stdsatzman.h000066400000000000000000000045371467704360200157750ustar00rootroot00000000000000/*************************************************************************** stdsatzman - ------------------- begin : 2004-13-09 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _STDSATZMAN_H #define _STDSATZMAN_H /* * Hour rate management: There are different named hour rates such as Master * or helper with a different amount of euros. The cost per hour can be adjusted * document globally. */ // include files #include #include "geld.h" #include "dbids.h" class QString; /** * das Stundensatzobjekt: definiert durch id und namen */ class StdSatz { public: StdSatz(); /** * Konstruktur basierend auf der Datenbank id */ StdSatz(int id); StdSatz( int id, const QString& name, Geld g ); dbID getId() { return m_dbId; } QString getName() { return m_name; } Geld getPreis() { return m_value; } private: dbID m_dbId; QString m_name; Geld m_value; }; class StdSatzDuration : public StdSatz { public: StdSatzDuration(); StdSatzDuration( const StdSatz&, int ); int duration() { return mDuration; } void setDuration( int d ) { mDuration = d; } private: int mDuration; }; typedef QVector StdSatzVector; /** * der Stundensatzmanager */ class StdSatzMan { public: virtual ~StdSatzMan(); static StdSatzMan *self(); QStringList allStdSaetze(); StdSatz getStdSatz( const QString& name ); StdSatz getStdSatz( dbID id ); // static StdSatzMan *mSelf; StdSatzMan(); private: void load(); StdSatzVector mStdSaetze; }; #endif /* END */ kraft-1.2.2/src/stockmaterial.cpp000066400000000000000000000060501467704360200167720ustar00rootroot00000000000000/*************************************************************************** material - ------------------- begin : 2004-05-05 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include // include files for KDE #include #include #include "stockmaterial.h" #include "unitmanager.h" #include "materialsaverbase.h" #include "materialsaverdb.h" #include "defaultprovider.h" #include "format.h" #include "kraftsettings.h" StockMaterial::StockMaterial( ): CatalogTemplate(), m_amount( 0 ), m_dbid( -1 ) { } StockMaterial::StockMaterial( int dbid, int matChap, QString mat, int unitID, double perPack, Geld pIn, Geld pOut ): CatalogTemplate(), m_chapter(matChap), m_amount(perPack), m_dbid(dbid), m_ePrice(pIn), m_vPrice(pOut) { this->setUnitId(unitID); this->setText(mat); } StockMaterial::~StockMaterial( ) { } MaterialSaverBase* StockMaterial::getSaver() { return MaterialSaverDB::self(); } bool StockMaterial::save() { MaterialSaverBase *saver = getSaver(); if ( saver ) { saver->saveTemplate( this ); return true; } return false; } #if 0 QString StockMaterial::description() const { return m_descr; } void StockMaterial::setDescription( const QString& str ) { m_descr = str; } #endif double StockMaterial::getAmountPerPack() { return m_amount; } void StockMaterial::setAmountPerPack( double am ) { m_amount = am; } int StockMaterial::getID() { return m_dbid; } void StockMaterial::setID( int id ) { m_dbid = id; } KContacts::Addressee StockMaterial::getSupplier() { KContacts::Addressee a; return a; } void StockMaterial::setSupplier( KContacts::Addressee *a ) { if( a ) m_delivererUID = a->uid(); } Geld StockMaterial::purchPrice() { return m_ePrice; } Geld StockMaterial::salesPrice() { return m_vPrice; } Geld StockMaterial::unitPrice() { return salesPrice() / m_amount; } void StockMaterial::setPurchPrice( Geld g ) { m_ePrice = g; } void StockMaterial::setSalesPrice( Geld g ) { m_vPrice = g; } void StockMaterial::saveChapterId() { MaterialSaverBase *saver = getSaver(); if( saver ) { saver->saveTemplateChapter( this ); } } /* END */ kraft-1.2.2/src/stockmaterial.h000066400000000000000000000050761467704360200164460ustar00rootroot00000000000000/*************************************************************************** material - Material for calculations ------------------- begin : 2004-05-05 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _MATERIAL_H #define _MATERIAL_H // include files #include #include #include "kraftglobals.h" #include "einheit.h" #include "catalogtemplate.h" /** * */ class Einheit; class MaterialSaverBase; class QDate; class QDateTime; class StockMaterial : public CatalogTemplate { public: StockMaterial(); StockMaterial( int dbid, int matChap, QString mat, int unitID, double perPack, Geld pIn, Geld pOut ); ~StockMaterial(); #if 0 // currently not used. QString description() const; void setDescription( const QString& ); #endif double getAmountPerPack(); void setAmountPerPack( double am ); int getID(); void setID( int ); int chapter() { return m_chapter; } void setChapter( int c ) { m_chapter = c; } KContacts::Addressee getSupplier(); void setSupplier( KContacts::Addressee *supp ); Geld purchPrice(); Geld salesPrice(); Geld unitPrice(); void setPurchPrice( Geld ); void setSalesPrice( Geld ); bool save(); protected: MaterialSaverBase* getSaver(); void saveChapterId(); private: // QString m_descr; int m_chapter; // per package: double m_amount; int m_unit; int m_dbid; // FIXME: introduce supplier list QString m_delivererUID; Geld m_ePrice; // price for bying Geld m_vPrice; // price for selling QDate mLastModified; QDate mEnteredDate; }; class StockMaterialList : public QList { public: StockMaterialList() : QList() { } }; typedef QListIterator StockMaterialListIterator; #endif /* END */ kraft-1.2.2/src/stringutil.cpp000066400000000000000000000032331467704360200163340ustar00rootroot00000000000000/*************************************************************************** String helper functions ------------------- begin : July 2023 copyright : (C) 2023 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include #include #include #include "format.h" namespace StringUtil { QString replaceTagsInString( const QString& w, QMap& replaceMap ) { QString re{ w }; QMultiMap reMap; for(const QString& key : replaceMap.keys()) { reMap.insert(key.length(), key); } QList lens = reMap.keys(); std::sort(lens.begin(), lens.end(), [](const int& i1, const int& i2) -> bool { return i1 > i2; }); for (int len : lens) { const QStringList keys = reMap.values(len); for (const QString& k : keys) { re.replace(k, replaceMap[k]); } } return re; } } kraft-1.2.2/src/stringutil.h000066400000000000000000000026371467704360200160100ustar00rootroot00000000000000/*************************************************************************** String helper functions ------------------- begin : July 2023 copyright : (C) 2023 by Klaas Freitag email : kraft@freisturz.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef STRINGUTIL_H #define STRINGUTIL_H class QString; namespace StringUtil { /** * @brief replaceTagsInString. * @param w - the string that includes the %-prepended tags * @param replaceMap - a map containing key/values that replace the tags. * @return the string with tags replaced * */ QString replaceTagsInString( const QString& w, QMap& replaceMap ); } #endif // FORMAT_H kraft-1.2.2/src/tagman.cpp000066400000000000000000000113161467704360200154000ustar00rootroot00000000000000/*************************************************************************** TagTemplateManager - Manage the tag templates ------------------- begin : June 2008 copyright : (C) 2008 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include #include #include "tagman.h" #include "kraftdb.h" /* * ********** Tag Template ********** */ TagTemplate::TagTemplate() { } TagTemplate::TagTemplate( const dbID& id, const QString& name, const QString& desc, const QString& col ) : mId( id ), mName( name ), mDesc( desc ), mColor( col ) { } QPalette TagTemplate::palette() const { QPalette palette; palette.setColor( QPalette::Light, mColor.light() ); palette.setColor( QPalette::Dark, mColor.dark() ); palette.setColor( QPalette::Mid, mColor ); return palette; } bool TagTemplate::operator!= ( const TagTemplate& tt ) const { return !( mName == tt.mName && mDesc == tt.mDesc && mColor == tt.mColor ); } /* * ********** Tag Template Manager ********** */ Q_GLOBAL_STATIC(TagTemplateMan, mSelf) TagTemplateMan *TagTemplateMan::self() { return mSelf; } TagTemplateMan::TagTemplateMan( ) { load(); } QStringList TagTemplateMan::allTagTemplates() { QStringList list; TagTemplateValueVector::iterator it; for( it = mTagTmpl.begin(); it != mTagTmpl.end(); ++it ) { QString n = (*it).name(); if( !n.isEmpty()) list << n; } return list; } TagTemplate TagTemplateMan::getTagTemplate( const QString& name ) { TagTemplateValueVector::iterator it; for( it = mTagTmpl.begin(); it != mTagTmpl.end(); ++it ) { // FIXME: Case insensitive here !!! if( (*it).name() == name ) return (*it); } return TagTemplate(); } TagTemplate TagTemplateMan::getTagTemplateFromId( const QString& id ) { TagTemplateValueVector::iterator it; for( it = mTagTmpl.begin(); it != mTagTmpl.end(); ++it ) { if( (*it).dbId().toString() == id ) return (*it); } return TagTemplate(); } TagTemplateMan::~TagTemplateMan( ) { } bool TagTemplateMan::writeTemplate( const TagTemplate& tt ) { bool ret = true; int cnt = 0; if ( tt.dbId().isOk() ) { QSqlQuery q; q.prepare( "UPDATE tagTemplates SET name=:name, description=:desc, color=:col " "WHERE tagTmplID=:id" ); q.bindValue( ":name", tt.name() ); q.bindValue( ":desc", tt.description() ); q.bindValue( ":col", tt.color().name() ); q.bindValue( ":id", tt.dbId().toString() ); q.exec(); cnt = q.numRowsAffected(); } if ( cnt == -1 ) { qCritical() << "DB does not know the number of affected rows, poor!"; ret = false; } else if ( cnt == 0 ) { // qDebug () << "need to insert the tag template into db"; QSqlQuery qi; qi.prepare( "INSERT INTO tagTemplates (name, sortKey, description, color) VALUES " "( :name, :sortKey, :desc, :col )" ); qi.bindValue( ":sortKey", 0 ); qi.bindValue( ":name", tt.name() ); qi.bindValue( ":desc", tt.description() ); qi.bindValue( ":col", tt.color().name() ); qi.exec(); } if ( ret ) { load(); } return ret; } void TagTemplateMan::deleteTemplate( const dbID& id ) { if ( id.isOk() ) { QSqlQuery q; q.prepare( "DELETE FROM tagTemplates WHERE tagTmplID=:id" ); q.bindValue( ":id", id.toString() ); q.exec(); load(); } } void TagTemplateMan::load() { mTagTmpl.clear(); /* read tag templates from db */ /* FIXME: The sortKey sort is not working because the sortKey is not correctly set on write */ /* With the initial db setup come useful sortKeys, thats why we still sort for it. */ QSqlQuery q1( "SELECT tagTmplID, name, description, color FROM tagTemplates ORDER BY sortKey, name" ); while( q1.next()) { dbID id( q1.value(0).toInt() ); TagTemplate tt ( id, q1.value(1).toString(), q1.value(2).toString(), q1.value(3).toString() ); mTagTmpl.append( tt ); } } /* END */ kraft-1.2.2/src/tagman.h000066400000000000000000000044701467704360200150500ustar00rootroot00000000000000/*************************************************************************** tag manager - create, edit and remove tags. ------------------- begin : June 2008 copyright : (C) 2008 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _TAGMAN_H #define _TAGMAN_H // include files #include #include "geld.h" #include "dbids.h" class QString; class QColor; class QPalette; /** * das Stundensatzobjekt: definiert durch id und namen */ class TagTemplate { public: TagTemplate(); TagTemplate( const dbID&, const QString&, const QString&, const QString& ); QString name() const { return mName; } QColor color() const { return mColor; } QPalette palette() const; dbID dbId() const { return mId; } QString description() const { return mDesc; } void setName( const QString& n ) { mName = n; } void setDescription( const QString& d ) { mDesc = d; } void setColor( const QColor& c ) { mColor = c; } bool operator!= ( const TagTemplate& tt ) const; private: dbID mId; QString mName; QString mDesc; QColor mColor; }; typedef QVector TagTemplateValueVector; /** * Tag Template Manager */ class TagTemplateMan { public: ~TagTemplateMan(); static TagTemplateMan *self(); QStringList allTagTemplates(); TagTemplate getTagTemplate( const QString& ); TagTemplate getTagTemplateFromId( const QString& ); bool writeTemplate( const TagTemplate& ); void deleteTemplate( const dbID& ); TagTemplateMan(); private: void load(); TagTemplateValueVector mTagTmpl; }; #endif /* END */ kraft-1.2.2/src/tagtemplatesdialog.cpp000066400000000000000000000202271467704360200200040ustar00rootroot00000000000000/*************************************************************************** tagtemplatesdialog.h - Edit tag templates ------------------- begin : Sep 2008 copyright : (C) 2008 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tagtemplatesdialog.h" #include "defaultprovider.h" #include "tagman.h" TagTemplateEditor::TagTemplateEditor( QWidget *parent ) : QDialog( parent ) { setObjectName("TAG_TEMPLATES_EDITOR"); setModal( true ); setWindowTitle( i18n("Edit Tag Template" )); QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); QVBoxLayout *w = new QVBoxLayout( this ); w->addWidget(new QLabel( QString::fromLatin1( "

              " ) + i18n( "Edit a Tag Template" ) + QString::fromLatin1( "

              " ))); w->addWidget( new QLabel( i18n( "Adjust settings for name, color and description." ))); QHBoxLayout *h1 = new QHBoxLayout; h1->addWidget( new QLabel( i18n( "Name:" ) )); mNameEdit = new QLineEdit; h1->addWidget(mNameEdit); w->addLayout(h1); // QHBox *h2 = new QHBox( w ); w->addWidget(new QLabel( i18n( "Description:" ))); mDescriptionEdit = new QTextEdit; w->addWidget(mDescriptionEdit); QHBoxLayout *h2 = new QHBoxLayout; h2->addStretch(1); h2->addWidget(new QLabel( i18n( "Associated color:" ))); mColorButton = new QPushButton; h2->addWidget(mColorButton); connect( mColorButton, SIGNAL(clicked(bool)), SLOT(slotColorSelect(bool))); w->addLayout(h2); mainLayout->addLayout(w); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); mOkButton = buttonBox->button(QDialogButtonBox::Ok); mOkButton->setDefault(true); mOkButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); } TagTemplateEditor::~TagTemplateEditor() { } void TagTemplateEditor::slotColorSelect(bool) { mColor = QColorDialog::getColor(mOrigTemplate.color(), this); setColorButton(); mOkButton->setFocus(); } void TagTemplateEditor::setColorButton() { QPixmap pix(32, 32); QPainter painter(&pix); painter.setBrush(QBrush(mColor)); painter.drawRect( QRect(0 ,0 , 32, 32)); mColorButton->setIcon(QIcon(pix)); } void TagTemplateEditor::setTemplate( const TagTemplate& tt ) { mOrigTemplate = tt; mNameEdit->setText( tt.name() ); mDescriptionEdit->setText( tt.description() ); mColor = tt.color(); setColorButton(); } TagTemplate TagTemplateEditor::currentTemplate() { TagTemplate tt = mOrigTemplate; tt.setName( mNameEdit->text() ); tt.setDescription( mDescriptionEdit->toPlainText() ); tt.setColor(mColor); return tt; } // ################################################################################ TagTemplatesDialog::TagTemplatesDialog( QWidget *parent ) : QDialog( parent ) { setObjectName( "TAG_TEMPLATES_DIALOG" ); setModal( true ); setWindowTitle( i18n("Edit Tag Templates" ) ); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(new QLabel( QString::fromLatin1( "

              " ) + i18n( "Edit Tag Templates" ) + QString::fromLatin1( "

              " ))); mainLayout->addWidget(new QLabel( i18n( "Add, edit and remove tag templates for use in the documents." ))); mListView = new QTreeWidget; // mListView->setItemMargin( 3 ); // mListView->setAlternateBackground( QColor( "#dffdd0" ) ); // mListView->headerItem()->hide(); mListView->setRootIsDecorated( false ); mListView->setSelectionMode( QAbstractItemView::SingleSelection ); QStringList headers; headers << i18n( "Tag" ); headers << i18n( "Color" ); headers << i18n( "Description" ); mListView->setHeaderLabels( headers ); mListView->setAllColumnsShowFocus( true ); mListView->setSelectionMode( QAbstractItemView::SingleSelection ); connect( mListView, SIGNAL( itemSelectionChanged() ), this, SLOT( slotSelectionChanged() ) ); mainLayout->addWidget(mListView); setTags(); QHBoxLayout *buttBox = new QHBoxLayout; mAddButton = new QPushButton( i18n( "Add…" )); buttBox->addWidget(mAddButton); mEditButton = new QPushButton( i18n( "Edit…" )); buttBox->addWidget(mEditButton); mEditButton->setEnabled( false ); mDeleteButton = new QPushButton( i18n( "Delete…" )); buttBox->addWidget(mDeleteButton); mDeleteButton->setEnabled( false ); mainLayout->addLayout(buttBox); connect( mAddButton, SIGNAL( clicked() ), SLOT( slotAddTemplate() ) ); connect( mEditButton, SIGNAL( clicked() ), SLOT( slotEditTemplate() ) ); connect( mDeleteButton, SIGNAL( clicked() ), SLOT( slotDeleteTemplate() ) ); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); setLayout(mainLayout); slotSelectionChanged(); } TagTemplatesDialog::~TagTemplatesDialog() { } void TagTemplatesDialog::slotAddTemplate() { TagTemplateEditor dia( this ); if ( dia.exec() ) { TagTemplateMan::self()->writeTemplate( dia.currentTemplate() ); setTags(); } } void TagTemplatesDialog::slotEditTemplate() { TagTemplateEditor dia( this ); TagTemplate curr = currentTemplate(); dia.setTemplate( curr ); if ( dia.exec() ) { TagTemplate tt = dia.currentTemplate(); if ( tt != curr ) { TagTemplateMan::self()->writeTemplate( tt ); setTags(); } } } void TagTemplatesDialog::slotDeleteTemplate() { QMessageBox msgBox; msgBox.setText(i18n( "Do you really want to delete the template?")); msgBox.setStandardButtons(QMessageBox::Yes| QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if ( ret == QMessageBox::Yes) { TagTemplateMan::self()->deleteTemplate( currentTemplate().dbId() ); setTags(); } } void TagTemplatesDialog::slotSelectionChanged() { bool state = false; if ( mListView->selectedItems().size() ) { state = true; } mEditButton->setEnabled( state ); mDeleteButton->setEnabled( state ); } TagTemplate TagTemplatesDialog::currentTemplate() { QTreeWidgetItem *item = mListView->currentItem(); if ( item ) { QString templName = mItemMap[item]; return TagTemplateMan::self()->getTagTemplate( templName ); } return TagTemplate(); } void TagTemplatesDialog::setTags() { mListView->clear(); QStringList tags = TagTemplateMan::self()->allTagTemplates(); foreach( const QString t, tags ) { TagTemplate templ = TagTemplateMan::self()->getTagTemplate( t ); // TagItem *item = new QListViewItem( mListView, templ.name(), QCheckListItem::CheckBox ); QTreeWidgetItem *item = new QTreeWidgetItem( mListView ); item->setText( 1, templ.name() ); QPixmap pix( 16, 12 ); pix.fill( templ.color() ); item->setIcon( 0, pix ); // item->setColorGroup( templ.colorGroup() ); item->setText( 2, templ.description() ); mItemMap[item] = t; } } kraft-1.2.2/src/tagtemplatesdialog.h000066400000000000000000000041251467704360200174500ustar00rootroot00000000000000/*************************************************************************** tagtemplatedit.h - Edit tag templates ------------------- begin : Sep 2008 copyright : (C) 2008 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef TAGTEMPLATESDIALOG_H #define TAGTEMPLATESDIALOG_H #include #include #include "tagman.h" class QWidget; class QTreeWidget; class QTreeWidgetItem; class QStringList; class QPushButton; class QLineEdit; class QTextEdit; class TagTemplateEditor: public QDialog { Q_OBJECT public: TagTemplateEditor( QWidget* ); ~TagTemplateEditor(); void setTemplate( const TagTemplate& ); TagTemplate currentTemplate(); private slots: void slotColorSelect(bool); void setColorButton(); private: TagTemplate mOrigTemplate; QLineEdit *mNameEdit; QTextEdit *mDescriptionEdit; QPushButton *mColorButton; QPushButton *mOkButton; QColor mColor; }; class TagTemplatesDialog: public QDialog { Q_OBJECT public: TagTemplatesDialog( QWidget* ); ~TagTemplatesDialog( ); TagTemplate currentTemplate(); protected slots: void slotSelectionChanged(); void slotAddTemplate(); void slotEditTemplate(); void slotDeleteTemplate(); protected: void setTags( ); private: QTreeWidget *mListView; QMap mItemMap; QPushButton *mAddButton; QPushButton *mEditButton; QPushButton *mDeleteButton; }; #endif kraft-1.2.2/src/taxeditbase.ui000066400000000000000000000050651467704360200162650ustar00rootroot00000000000000 TaxEditBase 0 0 348 158 <h2>Add a Tax Rate</h2> false Start-Date: false Qt::Horizontal QSizePolicy::Expanding 71 20 &Reduced tax rate: false mReducedTax &Full Tax Rate: false mFullTax kraft-1.2.2/src/taxeditdialog.cpp000066400000000000000000000070471467704360200167610ustar00rootroot00000000000000/*************************************************************************** taxeditdialog.h - edit tax rates ------------------- begin : Apr 9 2009 copyright : (C) 2009 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include "taxeditdialog.h" TaxEditDialog::TaxEditDialog( QSqlTableModel *taxModel, QWidget *parent ) : QDialog( parent ) { setObjectName( "TAX_EDIT_DIALOG" ); setModal( true ); setWindowTitle( i18n( "Edit Tax Rates" ) ); QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); QWidget *w = new QWidget; mainLayout->addWidget(w); mBaseWidget = new Ui::TaxEditBase( ); mBaseWidget->setupUi( w ); mBaseWidget->mDateWidget->setDate( QDate::currentDate() ); mBaseWidget->mFullTax->setSuffix( "%" ); mBaseWidget->mReducedTax->setSuffix( "%" ); mBaseWidget->mFullTax->setRange( 0,100.0 ); mBaseWidget->mFullTax->setDecimals( 1 ); mBaseWidget->mReducedTax->setRange( 0, 100.0 ); mBaseWidget->mReducedTax->setDecimals( 1 ); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); this->model = taxModel; mapper = new QDataWidgetMapper(this); mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit); mapper->setModel(taxModel); mapper->addMapping(mBaseWidget->mFullTax, 1); mapper->addMapping(mBaseWidget->mReducedTax, 2); mapper->addMapping(mBaseWidget->mDateWidget, 3); model->insertRow(model->rowCount()); mapper->toLast(); } void TaxEditDialog::accept() { mapper->submit(); //Check if the inserted date already exists, if so update the existing record and delete this record for(int i = 0; i < model->rowCount() - 1; ++i) { if (model->index(i, 3).data(Qt::DisplayRole).toDate() == mBaseWidget->mDateWidget->date() ) { //Check if the row isn't removed QString headerdata = model->headerData(i, Qt::Vertical, Qt::DisplayRole).toString(); if(headerdata != "!") { model->setData(model->index(i, 1, QModelIndex()), mBaseWidget->mFullTax->value(), Qt::EditRole); model->setData(model->index(i, 2, QModelIndex()), mBaseWidget->mReducedTax->value(), Qt::EditRole); model->removeRow(model->rowCount()-1); } } } QDialog::accept(); } void TaxEditDialog::reject() { model->removeRow(model->rowCount()-1); QDialog::reject(); } kraft-1.2.2/src/taxeditdialog.h000066400000000000000000000031061467704360200164160ustar00rootroot00000000000000/*************************************************************************** taxeditdialog.h - edit tax rates ------------------- begin : Apr 9 2009 copyright : (C) 2009 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef TAXEDITDIALOG_H #define TAXEDITDIALOG_H #include #include #include #include #include "ui_taxeditbase.h" /** * @author Klaas Freitag */ // ################################################################################ class TaxEditDialog: public QDialog, protected Ui::TaxEditBase { Q_OBJECT public: TaxEditDialog( QSqlTableModel *taxModel, QWidget *parent ); public slots: void accept(); void reject(); private: Ui::TaxEditBase *mBaseWidget; QDataWidgetMapper *mapper; QSqlTableModel *model; }; #endif kraft-1.2.2/src/templateprovider.cpp000066400000000000000000000030621467704360200175160ustar00rootroot00000000000000/*************************************************************************** templateprovider - base class for the template provider classes. ------------------- begin : 2007-05-02 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "templateprovider.h" #include "doctext.h" #include "textselection.h" TemplateProvider::TemplateProvider( QWidget *parent ) : QObject(), mParent( parent ), mTextSelection(nullptr) { } TemplateProvider::~TemplateProvider() { } void TemplateProvider::slotSetDocType( const QString& str ) { mDocType = str; } void TemplateProvider::setSelection( TextSelection *sel ) { mTextSelection = sel; } DocText TemplateProvider::currentText() { DocText dt; if ( mTextSelection ) { return mTextSelection->currentDocText(); } return dt; } kraft-1.2.2/src/templateprovider.h000066400000000000000000000032721467704360200171660ustar00rootroot00000000000000/*************************************************************************** templateprovider - base class for the template provider classes. ------------------- begin : 2007-05-02 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef TEMPLATEPROVIDER_H #define TEMPLATEPROVIDER_H #include class QWidget; class TextSelection; class DocText; class TemplateProvider : public QObject { Q_OBJECT public: TemplateProvider( QWidget* ); ~TemplateProvider(); virtual void setSelection( TextSelection* ); virtual DocText currentText(); public slots: virtual void slotNewTemplate() = 0; virtual void slotEditTemplate() = 0; virtual void slotDeleteTemplate() = 0; virtual void slotTemplateToDocument() = 0; virtual void slotInsertTemplateToDocument() = 0; void slotSetDocType( const QString& ); protected: QWidget *mParent; QString mDocType; TextSelection *mTextSelection; }; #endif kraft-1.2.2/src/templates/000077500000000000000000000000001467704360200154215ustar00rootroot00000000000000kraft-1.2.2/src/templates/cpp_template000066400000000000000000000024441467704360200200250ustar00rootroot00000000000000/*************************************************************************** |FILENAME| - ------------------- begin : |DATE| copyright : (C) |YEAR| by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef |HEADER_DEF| #define |HEADER_DEF| #ifdef HAVE_CONFIG_H #include #endif // include files for Qt // include files for KDE #include #include class |CLASSNAME| : public _what_ { Q_OBJECT public: |CLASSNAME|(); ~|CLASSNAME|(); private: } #endif /* END */ kraft-1.2.2/src/templates/header_template000066400000000000000000000017271467704360200204760ustar00rootroot00000000000000/*************************************************************************** |FILENAME| - ------------------- begin : |DATE| copyright : (C) |YEAR| by |AUTHOR| email : |EMAIL| ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ kraft-1.2.2/src/templatesaverbase.cpp000066400000000000000000000027101467704360200176360ustar00rootroot00000000000000/*************************************************************************** templatesaverbase - ------------------- begin : 2005-20-01 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt // include files for KDE #include #include "templatesaverbase.h" TemplateSaverBase::TemplateSaverBase( ) { } bool TemplateSaverBase::saveTemplate(FloskelTemplate*) { return false; } void TemplateSaverBase::saveTemplateChapter( FloskelTemplate* ) { // do nothing } TemplateSaverBase::~TemplateSaverBase( ) { } CalculationsSaverBase::CalculationsSaverBase() { } CalculationsSaverBase::CalculationsSaverBase( TargetType ) { } /* END */ kraft-1.2.2/src/templatesaverbase.h000066400000000000000000000032161467704360200173050ustar00rootroot00000000000000/*************************************************************************** templatesaverbase - Base class of a template save class ------------------- begin : 2005-20-00 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _TEMPLATESAVERBASE_H #define _TEMPLATESAVERBASE_H // include files #include /** * */ class FloskelTemplate; class dbID; class CalcPartList; class TemplateSaverBase { public: TemplateSaverBase(); virtual ~TemplateSaverBase(); virtual bool saveTemplate( FloskelTemplate* ); virtual void saveTemplateChapter( FloskelTemplate* ); private: }; class CalculationsSaverBase { public: enum TargetType { Template, Document }; CalculationsSaverBase(); virtual ~CalculationsSaverBase() { } CalculationsSaverBase( TargetType ); virtual bool saveCalculations( CalcPartList, dbID ) = 0; }; #endif /* END */ kraft-1.2.2/src/templatesaverdb.cpp000066400000000000000000000301151467704360200173110ustar00rootroot00000000000000/*************************************************************************** templatesaverdb - ------------------- begin : 2005-20-00 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include // include files for KDE #include #include "kraftdb.h" #include "kraftglobals.h" #include "dbids.h" #include "templatesaverdb.h" #include "calcpart.h" #include "floskeltemplate.h" #include "timecalcpart.h" #include "fixcalcpart.h" #include "materialcalcpart.h" #include "stockmaterial.h" bool CalculationsSaverDB::saveFixCalcPart( FixCalcPart *cp, dbID parentID ) { bool result = true; QSqlTableModel model; model.setTable(mTableFixCalc); int cpId = cp->getDbID().toInt(); model.setFilter("FCalcID=" + QString::number( cpId )); model.select(); // qDebug () << "CalcFix calcpart-ID is " << cpId; if( cpId < 0 ) { // no db entry yet => INSERT if( !cp->isToDelete() ) { QSqlRecord buffer = model.record(); fillFixCalcBuffer( &buffer, cp ); buffer.setValue( "TemplID", parentID.toInt() ); model.insertRecord(-1, buffer); model.submitAll(); dbID id = KraftDB::self()->getLastInsertID(); // qDebug () << "Setting db-ID " << id.toString(); cp->setDbID(id); } else { // qDebug () << "new element, but set to delete"; } } else { if( cp->isToDelete() ) { // qDebug () << "deleting fix calc part " << cpId; // delete this calcpart. if ( model.rowCount() > 0 ) { int cnt = model.rowCount(); model.removeRows(0, cnt); model.submitAll(); // qDebug () << "Amount of deleted entries: " << cnt; } } else { // der Datensatz ist bereits in der Datenbank => UPDATE if( model.rowCount() > 0 ) { QSqlRecord buffer = model.record(0); buffer.setValue( "modDate", KraftDB::self()->currentTimeStamp() ); fillFixCalcBuffer(& buffer, cp ); model.setRecord(0, buffer); model.submitAll(); } else { qCritical() << "Can not select FCalcID, corrupt data!"; } } } return result; } void CalculationsSaverDB::fillFixCalcBuffer( QSqlRecord *buffer, FixCalcPart *cp ) { if( ! (buffer && cp )) return; buffer->setValue( "name", cp->getName() ); buffer->setValue( "amount", cp->getMenge() ); buffer->setValue( "price", cp->unitPreis().toDouble() ); buffer->setValue( "percent", cp->getProzentPlus() ); buffer->setValue( "modDate", KraftDB::self()->currentTimeStamp() ); } bool CalculationsSaverDB::saveMaterialCalcPart( MaterialCalcPart *cp, dbID parentID ) { bool result = true; if( !cp ) return result; QSqlTableModel model; model.setTable( mTableMatCalc ); model.setEditStrategy(QSqlTableModel::OnManualSubmit); int cpId = cp->getDbID().toInt(); model.setFilter("MCalcID=" + QString::number( cpId )); model.select(); // qDebug () << "Saving material calcpart id=" << cpId; if( cpId < 0 ) { // no entry in database yet, need to insert QSqlRecord buffer = model.record(); fillMatCalcBuffer( &buffer, cp ); buffer.setValue( "TemplID", parentID.toInt() ); model.insertRecord(-1, buffer); model.submitAll(); dbID id = KraftDB::self()->getLastInsertID(); cp->setDbID(id); } else { // there is an db entry, update needed if(cp->isToDelete()) { // This calcpart must be deleted if( model.rowCount() > 0) { model.removeRow(0); model.submitAll(); } } else { // don't delete, update! if( model.rowCount() > 0) { QSqlRecord buffer = model.record(0); buffer.setValue( "modDate", KraftDB::self()->currentTimeStamp() ); fillMatCalcBuffer( &buffer, cp ); model.setRecord(0, buffer); model.submitAll(); } else { qCritical() << "Can not select MCalcID, corrupt data!"; } } } return result; } void CalculationsSaverDB::fillMatCalcBuffer( QSqlRecord *buffer, MaterialCalcPart *cp ) { if( !(buffer && cp)) return; buffer->setValue("materialID", cp->getMaterial()->getID()); buffer->setValue("amount", cp->getCalcAmount()); buffer->setValue("TemplID", cp->getTemplID().toInt()); buffer->setValue("percent", cp->getProzentPlus() ); } CalculationsSaverDB::CalculationsSaverDB( ) : CalculationsSaverBase(), mTableTimeCalc( "CalcTime" ), mTableFixCalc( "CalcFixed" ), mTableMatCalc( "CalcMaterials" ), mTableMatDetailCalc( "CalcMaterialDetails" ) { } CalculationsSaverDB::CalculationsSaverDB( TargetType tt ) : CalculationsSaverBase( tt ), mTableTimeCalc( "CalcTime" ), mTableFixCalc( "CalcFixed" ), mTableMatCalc( "CalcMaterials" ), mTableMatDetailCalc( "CalcMaterialDetails" ) { if ( tt == Document ) { mTableTimeCalc = "DocCalcTime"; mTableFixCalc = "DocCalcFixed"; mTableMatCalc = "DocCalcMaterials"; mTableMatDetailCalc = "DocCalcMaterialDetails"; } } bool CalculationsSaverDB::saveCalculations( CalcPartList parts, dbID parentID ) { bool res = true; CalcPartListIterator it( parts ); while( it.hasNext()) { CalcPart *cp = it.next(); if( cp->isDirty() ) { if( cp->getType() == KALKPART_TIME ) { res = saveTimeCalcPart( static_cast(cp), parentID ); Q_ASSERT( res ); } else if( cp->getType() == KALKPART_FIX ) { res = saveFixCalcPart( static_cast(cp), parentID ); Q_ASSERT( res ); } else if( cp->getType() == KALKPART_MATERIAL ) { res = saveMaterialCalcPart( static_cast(cp), parentID ); Q_ASSERT( res ); } else { // qDebug () << "ERROR: Unbekannter Kalkulations-Anteil-Typ!"; } } } return res; } bool CalculationsSaverDB::saveTimeCalcPart( TimeCalcPart *cp, dbID parentId ) { bool result = true; if( !cp ) return result; int cpId = cp->getDbID().toInt(); QSqlTableModel model; model.setTable( mTableTimeCalc ); model.setFilter( "TCalcID="+QString::number(cpId) ); model.select(); // qDebug () << "Models last error: " << model.lastError() << model.rowCount(); if( cpId < 0 ) { // no entry in db yet => INSERT if( ! cp->isToDelete() ) { QSqlRecord buffer = model.record(); fillTimeCalcBuffer( &buffer, cp ); buffer.setValue( "TemplID", parentId.toInt() ); model.insertRecord(-1, buffer); dbID id = KraftDB::self()->getLastInsertID(); cp->setDbID(id); } else { // qDebug () << "delete flag is set -> skip saving."; } } else { if( cp->isToDelete() ) { // delete this calcpart. if ( model.rowCount() > 0 ) { model.removeRow(0); model.submitAll(); } } else { // Update needed, record is already in the database if( model.rowCount() > 0 ) { QSqlRecord buffer = model.record(0); buffer.setValue( "modDate", KraftDB::self()->currentTimeStamp() ); fillTimeCalcBuffer( &buffer, cp ); model.setRecord(0, buffer); model.submitAll(); } else { qCritical() << "Unable to select TCalcID, corrupt data!"; } } } return result; } void CalculationsSaverDB::fillTimeCalcBuffer( QSqlRecord *buffer, TimeCalcPart *cp ) { if( ! (buffer && cp )) return; buffer->setValue( "name", cp->getName() ); buffer->setValue( "minutes", cp->duration() ); buffer->setValue( "timeUnit", cp->timeUnitIndex()); buffer->setValue( "percent", cp->getProzentPlus() ); StdSatz std = cp->getStundensatz(); buffer->setValue( "stdHourSet", std.getId().toInt() ); buffer->setValue( "allowGlobal", cp->globalStdSetAllowed() ? 1 : 0 ); } /* =========================================================================== */ TemplateSaverDB::TemplateSaverDB( ) : TemplateSaverBase() { } TemplateSaverDB::~TemplateSaverDB( ) { } bool TemplateSaverDB::saveTemplate( FloskelTemplate *tmpl ) { bool res = true; // Transaktion ? QSqlTableModel model; model.setEditStrategy(QSqlTableModel::OnManualSubmit); model.setTable("Catalog"); QString templID = QString::number(tmpl->getTemplID()); model.setFilter("TemplID=" + templID); model.select(); QSqlRecord buffer; if( model.rowCount() > 0) { // qDebug () << "Updating template " << tmpl->getTemplID(); // mach update buffer = model.record(0); fillTemplateBuffer( &buffer, tmpl, false ); buffer.setValue( "modifyDatum", KraftDB::self()->currentTimeStamp() ); model.setRecord(0, buffer); model.submitAll(); } else { // insert // qDebug () << "Creating new database entry"; buffer = model.record(); fillTemplateBuffer( &buffer, tmpl, true ); model.insertRecord(-1, buffer); model.submitAll(); /* Jetzt die neue Template-ID selecten */ dbID id = KraftDB::self()->getLastInsertID(); // qDebug () << "New Database ID=" << id.toInt(); if( id.isOk() ) { tmpl->setTemplID(id.toInt() ); templID = id.toString(); } else { // qDebug () << "ERROR: Kann AUTOINC nicht ermitteln"; res = false; } } if( res ) { /* Nun die einzelnen Calcparts speichern */ CalcPartList parts = tmpl->getCalcPartsList(); CalculationsSaverDB calculationSaver; res = calculationSaver.saveCalculations( parts, tmpl->getTemplID() ); } return res; } void TemplateSaverDB::fillTemplateBuffer( QSqlRecord *buffer, FloskelTemplate *tmpl, bool isNew ) { buffer->setValue( "chapterID", tmpl->chapterId().toInt() ); buffer->setValue( "unitID", tmpl->unit().id()); buffer->setValue( "Floskel", tmpl->getText() ); buffer->setValue( "Gewinn", tmpl->getBenefit() ); buffer->setValue( "zeitbeitrag", tmpl->hasTimeslice() ); QDateTime dt = QDateTime::currentDateTime(); QString dtString = KraftDB::self()->currentTimeStamp(dt); if( isNew ) { buffer->setValue( "enterDatum", dtString); tmpl->setEnterDate( dt ); } buffer->setValue("modifyDatum", dtString ); tmpl->setModifyDate( dt ); int ctype = 2; // Calculation type Calculation if( tmpl->calcKind() == CatalogTemplate::ManualPrice ) { ctype = 1; } buffer->setValue( "Preisart", ctype ); buffer->setValue( "EPreis", tmpl->manualPrice().toDouble() ); } void TemplateSaverDB::saveTemplateChapter( FloskelTemplate* tmpl ) { if( tmpl ) { dbID id = tmpl->getTemplID(); dbID chapId = tmpl->chapterId(); QSqlQuery qUpdate; // qDebug () << "Updating Chapter to chapter id " << chapId.toInt() << " of id " << id.toString(); QString sql = "UPDATE Catalog SET chapterID=:chap WHERE TemplID=:id"; qUpdate.prepare( sql ); qUpdate.bindValue( ":chap", chapId.toInt() ); qUpdate.bindValue( ":id", id.toInt() ); qUpdate.exec(); // qDebug () << "setting template chapter sql: " << qUpdate.lastError().text(); } } /* END */ kraft-1.2.2/src/templatesaverdb.h000066400000000000000000000043611467704360200167620ustar00rootroot00000000000000/*************************************************************************** templatesaverdb - ------------------- begin : 2005-20-00 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _TEMPLATESAVERDB_H #define _TEMPLATESAVERDB_H #include "templatesaverbase.h" /** * */ class FloskelTemplate; class QSqlRecord; class QString; class TimeCalcPart; class FixCalcPart; class MaterialCalcPart; class StockMaterial; class TemplateSaverDB : public TemplateSaverBase { public: TemplateSaverDB(); virtual ~TemplateSaverDB(); virtual bool saveTemplate( FloskelTemplate* ); virtual void saveTemplateChapter( FloskelTemplate* ); private: void fillTemplateBuffer( QSqlRecord*, FloskelTemplate*, bool ); QString sqlWhereFromRecord( QSqlRecord * ) const; }; class CalculationsSaverDB:public CalculationsSaverBase { public: CalculationsSaverDB(); CalculationsSaverDB( TargetType tt ); virtual ~CalculationsSaverDB() { } bool saveCalculations( CalcPartList, dbID ); private: bool saveFixCalcPart( FixCalcPart *cp, dbID ); bool saveMaterialCalcPart( MaterialCalcPart *cp, dbID ); bool saveTimeCalcPart( TimeCalcPart*, dbID ); void fillFixCalcBuffer( QSqlRecord *buffer, FixCalcPart *cp ); void fillMatCalcBuffer( QSqlRecord *buffer, MaterialCalcPart *cp ); void fillTimeCalcBuffer( QSqlRecord*, TimeCalcPart* ); QString mTableTimeCalc; QString mTableFixCalc; QString mTableMatCalc; QString mTableMatDetailCalc; }; #endif /* END */ kraft-1.2.2/src/templkatalog.cpp000066400000000000000000000264211467704360200166200ustar00rootroot00000000000000/*************************************************************************** flostempllist.cpp - ------------------- begin : Son Feb 8 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "floskeltemplate.h" #include "dbids.h" #include "templkatalog.h" #include "kraftdb.h" #include "unitmanager.h" #include "timecalcpart.h" #include "fixcalcpart.h" #include "materialcalcpart.h" #include "geld.h" #include "katalog.h" /** constructor of a katalog, which is only a list of Floskel templates. * A name must be given, which is displayed for the root element in the * */ TemplKatalog::TemplKatalog( const QString& name ) : Katalog( name ) { } TemplKatalog::~TemplKatalog() { } void TemplKatalog::reload( dbID id) { FloskelTemplate *templ=0; //Find the template we want to reload in the templatelist for(int i=0; i < m_flosList.count(); ++i) { templ = m_flosList[i]; if(templ->getTemplID() == id.toInt()) break; } if(templ) { QSqlQuery q("SELECT unitID, TemplID, chapterID, Preisart, EPreis, modifyDatum, enterDatum, Floskel, Gewinn, zeitbeitrag FROM Catalog WHERE TemplID=:TemplID"); q.bindValue(":TemplID", id.toInt()); q.exec(); if(q.next()) { //templ->setEinheitId(q.value(0).toInt()); // qDebug() << "Reloading template number " << q.value(1); templ->setChapterId(dbID( q.value(2).toInt()), false ); //templ->setCalculationType(q.value(3).toInt()); templ->setManualPrice(q.value(4).toDouble()); templ->setText( q.value(7).toString() ); templ->setBenefit( q.value(8).toDouble()); templ->setHasTimeslice( q.value(9).toBool() ); templ->clearCalcParts(); loadCalcParts( templ ); } } } int TemplKatalog::load() { Katalog::load(); int cnt = 0; if (mChapters.isEmpty()) getKatalogChapters(true); QString chapIdList {"0"}; for( const CatalogChapter& chap : mChapters ) { chapIdList.append(","); chapIdList.append(chap.id().toString()); } // qDebug () << "The chapterIdList: " << chapIdList; QSqlQuery q("SELECT unitID, TemplID, chapterID, Preisart, EPreis, modifyDatum, enterDatum, " "Floskel, Gewinn, zeitbeitrag FROM Catalog WHERE chapterID IN( " + chapIdList + ") " "ORDER BY chapterID, sortKey" ); q.exec(); m_flosList.clear(); while ( q.next() ) { cnt++; int einheit = q.value(0).toInt(); int templID = q.value(1).toInt(); // qDebug () << "Loading template number " << templID; int chapID = q.value(2).toInt(); // int sortID = cur.value( "sortKey" ).toInt(); int calcKind = q.value(3).toInt(); double g = q.value(4).toDouble(); Geld preis(g); /* Only for debugging: */ if( templID == 272 ) { // qDebug () << "Geld ist " << preis.toString( *( &mLocale ) ) << " from g-value " << g; } QDateTime modDt = q.value(5).toDateTime(); QDateTime enterDt = q.value(6).toDateTime(); // qDebug() << "Chapter ID is " << chapID; FloskelTemplate *flos = new FloskelTemplate( templID, q.value(7).toString(), einheit, chapID, calcKind ); flos->setEnterDate( enterDt ); flos->setModifyDate( modDt ); // flos->setSortKey( sortID ); flos->setBenefit( q.value(8).toDouble()); flos->setManualPrice( preis ); bool tslice = q.value(9).toInt() > 0; flos->setHasTimeslice( tslice ); auto usage = usageCount(templID); flos->setLastUsedDate(usage.second); flos->setUseCounter(usage.first); loadCalcParts( flos ); m_flosList.append(flos); } return cnt; } int TemplKatalog::addNewTemplate( FloskelTemplate *tmpl ) { int re = -1; if ( tmpl ) { m_flosList.append( tmpl ); re = m_flosList.count(); } return re; } void TemplKatalog::deleteTemplate( int id ) { // Remove entry from the m_flosList FloskelTemplateListIterator it(m_flosList); FloskelTemplate *tmpl; int cnt = 0; while( it.hasNext() ) { tmpl = it.next(); if( tmpl->getTemplID() == id ) { break; } cnt++; } if( cnt < m_flosList.size()) { m_flosList.removeAt( cnt ); } QStringList tables; tables << "Catalog" << "CalcFixed" << "CalcMaterials" << "CalcTime"; for(const QString& table : tables ) { QSqlQuery q; q.prepare( "DELETE FROM " + table + " WHERE TemplID=:Id"); q.bindValue( ":Id", id ); q.exec(); // qDebug () << "SQL Delete Success: " << q.lastError().text(); } deleteUsageRecord(id); } int TemplKatalog::loadCalcParts( FloskelTemplate *flos ) { int cnt = 0; cnt = loadTimeCalcParts( flos ); cnt += loadFixCalcParts( flos ); cnt += loadMaterialCalcParts(flos); return cnt; } int TemplKatalog::loadTimeCalcParts( FloskelTemplate *flos ) { if( ! flos ) return(0); int cnt = 0; QSqlQuery q; q.prepare("SELECT TCalcID, TemplID, name, minutes, percent, stdHourSet, allowGlobal, timeUnit" " FROM CalcTime WHERE TemplID=:TemplID"); q.bindValue(":TemplID", QString::number( flos->getTemplID())); q.exec(); while( q.next() ) { cnt++; int tcalcid = q.value(0).toInt(); int templid = q.value(1).toInt(); const QString name = q.value(2).toString(); int minutes = q.value(3).toInt(); int prozent = q.value(4).toInt(); int hourSet = q.value(5).toInt(); bool globAllowed = q.value(6).toInt() > 0; int timeUnit = q.value(7).toInt(); TimeCalcPart::TimeUnit unit = TimeCalcPart::timeUnitFromInt(timeUnit); TimeCalcPart *zcp = new TimeCalcPart( name, minutes, unit, prozent ); zcp->setGlobalStdSetAllowed( globAllowed ); zcp->setStundensatz( StdSatzMan::self()->getStdSatz(hourSet) ); zcp->setDbID( dbID(tcalcid)); zcp->setTemplID( dbID(templid)); zcp->setDirty( false ); flos->addCalcPart( zcp ); } return cnt; } int TemplKatalog::loadMaterialCalcParts( FloskelTemplate *flos ) { if( ! flos ) return(0); int cnt = 0; QSqlQuery q; q.prepare("SELECT MCalcID, TemplID, materialID, percent, amount FROM CalcMaterials WHERE TemplID=:TemplID"); q.bindValue(":TemplID", QString::number( flos->getTemplID())); q.exec(); while( q.next() ) { cnt++; long mcalcID = q.value(0).toLongLong(); int templid = q.value(1).toInt(); long matID = q.value(2).toLongLong(); int procent = q.value(3).toInt(); double amount = q.value(4).toDouble(); MaterialCalcPart *mPart = new MaterialCalcPart( mcalcID, matID, procent, amount ); mPart->setDbID( dbID(mcalcID)); mPart->setTemplID( dbID(templid)); mPart->setDirty( false ); flos->addCalcPart( mPart ); } return cnt; } int TemplKatalog::loadFixCalcParts( FloskelTemplate *flos ) { if( ! flos ) return(0); int cnt = 0; QSqlQuery q; q.prepare("SELECT name, amount, percent, FCalcID, TemplID, price FROM CalcFixed WHERE TemplID=:TemplID"); q.bindValue(":TemplID", QString::number( flos->getTemplID())); q.exec(); while( q.next() ) { cnt++; QString name = q.value(0).toString(); double amount = q.value(1).toDouble(); int percent = q.value(2).toInt(); int tcalcid = q.value(3).toInt(); int templid = q.value(4).toInt(); double g = q.value(5).toDouble(); Geld price(g); // = (int) g; // FIXME: proper handling of money here. FixCalcPart *fcp = new FixCalcPart( name, price, percent ); fcp->setMenge( amount ); fcp->setDbID( dbID(tcalcid)); fcp->setTemplID( dbID(templid)); fcp->setDirty( false ); flos->addCalcPart( fcp ); } return cnt; } FloskelTemplateList TemplKatalog::getFlosTemplates(int chapId) { FloskelTemplateList resultList; if( m_flosList.count() == 0 ) { // qDebug () << "Empty katalog list - loading!"; load(); } FloskelTemplateListIterator it(m_flosList); FloskelTemplate *tmpl; while( it.hasNext() ) { tmpl = it.next(); int haveChap = tmpl->chapterId().toInt(); // qDebug() << "Searching for chapter " << chapter << " with ID " << chap << " and have " << haveChap; if( haveChap == chapId ) { resultList.append( tmpl ); } } return resultList; } int TemplKatalog::load( const QString& /* chapter */ ) { return 0; } void TemplKatalog::writeXMLFile() { QString filename = QFileDialog::getSaveFileName(0, QString(), QDir::homePath(), QString()); // "*.xml", 0, i18n("Export XML Katalog")); if(filename.isEmpty()) return; QDomDocument doc = toXML(); QFile file( filename ); if( file.open( QIODevice::WriteOnly ) ) { QTextStream ts( &file ); ts << doc.toString(); file.close(); } } QDomDocument TemplKatalog::toXML() { QDomDocument doc("catalog"); QDomElement root = doc.createElement("catalog"); doc.appendChild(root); QDomElement elem = doc.createElement("catalogname"); QDomText text = doc.createTextNode(m_name); elem.appendChild(text); root.appendChild(elem); QStringList allSets = StdSatzMan::self()->allStdSaetze(); for ( QStringList::Iterator it = allSets.begin(); it != allSets.end(); ++it ) { QDomElement set = doc.createElement("hourset"); QDomElement elem = doc.createElement("name"); QDomText tname = doc.createTextNode(*it); elem.appendChild(tname); set.appendChild(elem); QDomElement rateelem = doc.createElement("rate"); StdSatz satz = StdSatzMan::self()->getStdSatz(*it); Geld g = satz.getPreis(); QDomText rname = doc.createTextNode(g.toLocaleString()); rateelem.appendChild(rname); set.appendChild(rateelem); root.appendChild(set); } QList chaps = getKatalogChapters(); foreach( CatalogChapter theChapter, chaps ) { QString chapter = theChapter.name(); QDomElement chapElem = doc.createElement("chapter"); QDomElement chapName = doc.createElement("chaptername"); text = doc.createTextNode(chapter); chapName.appendChild(text); chapElem.appendChild(chapName); root.appendChild(chapElem); FloskelTemplateList templs = getFlosTemplates(theChapter.id().toInt()); FloskelTemplateListIterator it(templs); // FIXME: XML export! } return doc; } int TemplKatalog::getEntriesPerChapter( const CatalogChapter& chapter) { int cnt = 0; QString q( QString("SELECT count(*) FROM katalog WHERE chapterID=%1" ).arg( chapter.id().toInt() ) ); QSqlQuery query( q ); while ( query.next() ) { cnt = query.value(0).toInt(); } return cnt; } kraft-1.2.2/src/templkatalog.h000066400000000000000000000040671467704360200162670ustar00rootroot00000000000000/*************************************************************************** katalog.h - ------------------- begin : Son Feb 8 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef TEMPLKATALOG_H #define TEMPLKATALOG_H #include #include "floskeltemplate.h" #include "katalog.h" #include "dbids.h" /** *@author Klaas Freitag */ class MaterialCalcPart; class QDomDocument; class TemplKatalog : public Katalog { public: TemplKatalog(const QString& name); ~TemplKatalog(); int load(const QString&); int load() override; void reload( dbID ) override; /** No descriptions */ FloskelTemplateList getFlosTemplates( int ); KatalogType type() override { return TemplateCatalog; } QDomDocument toXML() override; /** get the amount of entries in a chapter or the entire catalog */ int getEntriesPerChapter( const CatalogChapter& ) override; int addNewTemplate( FloskelTemplate *tmpl ); public slots: void writeXMLFile() override; void deleteTemplate( int ); private: int loadCalcParts( FloskelTemplate* ); int loadTimeCalcParts( FloskelTemplate* ); int loadFixCalcParts( FloskelTemplate* ); int loadMaterialCalcParts( FloskelTemplate * ); FloskelTemplateList m_flosList; }; #endif kraft-1.2.2/src/templkataloglistview.cpp000066400000000000000000000206411467704360200204050ustar00rootroot00000000000000 /*************************************************************************** templkataloglistview - template katalog listview. ------------------- begin : 2005-07-09 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include "templkataloglistview.h" #include "portal.h" #include "kraftglobals.h" #include "katalog.h" #include "katalogman.h" #include "kataloglistview.h" #include "materialcalcpart.h" #include "stockmaterial.h" #include "templkatalog.h" #include "timecalcpart.h" #include "docposition.h" #include "defaultprovider.h" #include "kraftsettings.h" TemplKatalogListView::TemplKatalogListView(QWidget *w) : KatalogListView(w), mShowCalcParts( true ) { QStringList labels; labels << i18n("Template"); labels << i18n("Price"); labels << i18n("Calc. Type"); setHeaderLabels(labels); QByteArray headerState = QByteArray::fromBase64( KraftSettings::self()->templateCatViewHeader().toLatin1() ); header()->restoreState(headerState); contextMenu()->setTitle( i18n("Template Catalog")); } /* * This class adds a complete catalog and fills the view. It gets the * catalog from KatalogMan, iterates over the catalog chapters and * fills in the templates. */ void TemplKatalogListView::addCatalogDisplay( const QString& katName ) { KatalogListView::addCatalogDisplay(katName); TemplKatalog* catalog = static_cast(KatalogMan::self()->getKatalog(katName)); if ( !catalog ) { qCritical() << "Could not load catalog " << katName; return; } setupChapters(); const QList chapters = catalog->getKatalogChapters(); foreach( CatalogChapter chap, chapters ) { if( mChapterDict.contains( chap.id().toInt() ) ) { int chapId = chap.id().toInt(); QTreeWidgetItem *katItem = mChapterDict[chapId]; FloskelTemplateList katList = catalog->getFlosTemplates(chapId); FloskelTemplateListIterator flosIt( katList ); while( flosIt.hasNext() ) { FloskelTemplate *tmpl = flosIt.next(); /* create a ew item as the child of katalog entry */ addFlosTemplate( katItem, tmpl ); if ( mShowCalcParts ) addCalcParts( tmpl ); } } } // ... and all what is zero is going to the top level FloskelTemplateList katList = catalog->getFlosTemplates(0); for( FloskelTemplate *tmpl : katList) { addFlosTemplate(nullptr, tmpl); if ( mShowCalcParts ) addCalcParts( tmpl ); } } /* * add a single template to the view with setting icon etc. */ QTreeWidgetItem* TemplKatalogListView::addFlosTemplate( QTreeWidgetItem *parentItem, FloskelTemplate *tmpl ) { if( ! parentItem ) parentItem = m_root; QTreeWidgetItem *listItem = new QTreeWidgetItem( parentItem ); slFreshupItem( listItem, tmpl); tmpl->setListViewItem( listItem ); if( tmpl->calcKind() == CatalogTemplate::ManualPrice ) { listItem->setIcon(0, DefaultProvider::self()->icon( "dice" ) ); } else { listItem->setIcon(0, DefaultProvider::self()->icon("calculator")); } if ( mCheckboxes ) { listItem->setCheckState(0, Qt::Unchecked); } // store the connection between the listviewitem and the template in a dict. m_dataDict.insert( listItem, tmpl ); return listItem; } void TemplKatalogListView::slFreshupItem( QTreeWidgetItem *item, FloskelTemplate *tmpl, bool remChildren ) { if( !(item && tmpl) ) return; Geld g = tmpl->unitPrice(); const QString ck = tmpl->calcKindString(); const QString t = Portal::textWrap(tmpl->getText(), 72, 4); item->setText( 0, t ); if( t.endsWith(QStringLiteral("…"))) { item->setToolTip(0, Portal::textWrap(tmpl->getText(), 72, 22)); } QString h; h = QString( "%1 / %2" ).arg( g.toLocaleString() ) .arg( tmpl->unit().einheitSingular() ); item->setText( 1, h ); item->setText( 2, ck ); // item->setText( 4, QString::number(tmpl->getTemplID())); if( remChildren ) { /* remove all children and insert them again afterwards. * That updates the view */ for( int i = 0; i < item->childCount(); i++ ) { QTreeWidgetItem *it = item->child(i); if( it ) { item->removeChild( it ); delete it; } } addCalcParts(tmpl); // Insert to update the view again. } } void TemplKatalogListView::addCalcParts( FloskelTemplate *tmpl ) { QTreeWidgetItem *item = tmpl->getListViewItem(); if( ! item ) return; CalcPartList parts = tmpl->getCalcPartsList(); CalcPartListIterator it(parts); while( it.hasNext() ) { CalcPart *cp = it.next(); QString title = cp->getName(); QString type = cp->getType(); // qDebug () << "Type is " << type; if( type == KALKPART_TIME ) { TimeCalcPart *zcp = static_cast(cp); StdSatz stdsatz = zcp->getStundensatz(); title = QString( "%1, %2 %3 %4" ) .arg( cp->getName() ) .arg( QString::number(zcp->duration())) .arg( TimeCalcPart::timeUnitString(zcp->timeUnit())) .arg( stdsatz.getName() ); } QStringList list; list << title; list << cp->basisKosten().toLocaleString(); list << cp->getType(); QTreeWidgetItem *cpItem = new QTreeWidgetItem( item, list ); cpItem->setDisabled(true); } } void TemplKatalogListView::setShowCalcParts( bool on ) { mShowCalcParts = on; } bool TemplKatalogListView::showCalcParts() { return mShowCalcParts; } TemplKatalogListView::~TemplKatalogListView() { } DocPosition TemplKatalogListView::itemToDocPosition( QTreeWidgetItem *it ) { DocPosition pos; if ( ! it ) { it = currentItem(); } if ( ! it ) return pos; FloskelTemplate *flos = static_cast( m_dataDict[ it ] ); if ( flos ) { pos.setText( flos->getText() ); pos.setUnit( flos->unit() ); pos.setUnitPrice( flos->unitPrice() ); } else { // qDebug () << "Can not find a template for the item"; } return pos; } CalcPartList TemplKatalogListView::itemsCalcParts( QTreeWidgetItem* it ) { CalcPartList cpList; if ( ! it ) { it = currentItem(); } if ( ! it ) return cpList; FloskelTemplate *flos = static_cast( m_dataDict[ it ] ); if ( flos ) { // qDebug () << "We have calc parts: " << flos->getCalcPartsList().count(); cpList = flos->getCalcPartsList(); } return cpList; } // Updates the sequence of items below a parent item stored in the inherited // variable mSortChapterItem void TemplKatalogListView::startUpdateItemSequence() { Q_ASSERT(_query == nullptr); _query = new QSqlQuery; _query->prepare("UPDATE Catalog SET sortKey=? WHERE TemplID=?"); } void TemplKatalogListView::updateItemSequence(QTreeWidgetItem *item, int seqNo) { FloskelTemplate *flos = static_cast( itemData(item) ); // qDebug () << "Updating item " << flos->getTemplID() << " to sort key " << sequenceCnt; if( _query && flos ) { _query->bindValue( 0, seqNo ); _query->bindValue( 1, flos->getTemplID() ); _query->exec(); } } void TemplKatalogListView::saveState() { const QByteArray state = this->header()->saveState(); KraftSettings::self()->setTemplateCatViewHeader(state.toBase64()); KraftSettings::self()->save(); } kraft-1.2.2/src/templkataloglistview.h000066400000000000000000000040301467704360200200440ustar00rootroot00000000000000/*************************************************************************** templkataloglistview - template katalog listview. ------------------- begin : 2005-07-09 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef TEMPLKATALOGLISTVIEW_H #define TEMPLKATALOGLISTVIEW_H #include #include #include "floskeltemplate.h" /** @author Klaas Freitag */ class DocPosition; class TemplKatalogListView : public KatalogListView { Q_OBJECT public: TemplKatalogListView(QWidget*); ~TemplKatalogListView(); FloskelTemplate *currentTemplate(); /* create a listview entry for a floskel template */ QTreeWidgetItem *addFlosTemplate( QTreeWidgetItem*, FloskelTemplate* ); void addCatalogDisplay( const QString&); void setShowCalcParts( bool ); bool showCalcParts(); DocPosition itemToDocPosition( QTreeWidgetItem* it = 0 ); CalcPartList itemsCalcParts( QTreeWidgetItem* it = 0 ); public slots: void slFreshupItem( QTreeWidgetItem*, FloskelTemplate*, bool remChildren = false ); void saveState(); protected: virtual void startUpdateItemSequence(); virtual void updateItemSequence(QTreeWidgetItem *item, int seqNo); private: bool mShowCalcParts; void addCalcParts( FloskelTemplate* ); }; #endif kraft-1.2.2/src/templkatalogview.cpp000066400000000000000000000205101467704360200175040ustar00rootroot00000000000000/*************************************************************************** templkatalogview.cpp ------------------- begin : 2005-07-09 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for QT #include #include #include #include #include // application specific includes #include "katalogview.h" #include "templkatalogview.h" #include "floskeltemplate.h" #include "kataloglistview.h" #include "flostempldialog.h" #include "templkatalog.h" #include "templkataloglistview.h" #include "katalogman.h" #include "documentman.h" #include "kraftsettings.h" #define ID_STATUS_MSG 1 TemplKatalogView::TemplKatalogView(QWidget* parent, const char* name) : KatalogView(parent, name), m_flosDialog(nullptr), m_listview(nullptr) { } TemplKatalogView::~TemplKatalogView() { slotSaveState(); delete m_flosDialog; } Katalog* TemplKatalogView::getKatalog( const QString& name ) { Katalog *k = KatalogMan::self()->getKatalog( name ); if( ! k ) { k = new TemplKatalog( name ); KatalogMan::self()->registerKatalog( k ); } return k; } ///////////////////////////////////////////////////////////////////// // SLOT IMPLEMENTATION ///////////////////////////////////////////////////////////////////// void TemplKatalogView::slEditTemplate() { TemplKatalogListView* listview = static_cast(getListView()); if( listview ) { QTreeWidgetItem *item = listview->currentItem(); if( listview->isChapter(item) ) { // check if the chapter is empty. If so, switch to slNewTempalte() // if there others, open the chapter. if( !listview->isRoot( item ) && item->childCount() == 0 ) { slNewTemplate(); } else { // do nothing. } } else { // the clicked item is not a chapter FloskelTemplate *currTempl = static_cast (listview->currentItemData()); if( currTempl ) { QTreeWidgetItem *item = (QTreeWidgetItem*) listview->currentItem(); openDialog( item, currTempl, false ); } } } } void TemplKatalogView::slNewTemplate() { KatalogListView *listView = getListView(); if( !listView ) return; // create new template object FloskelTemplate *flosTempl = new FloskelTemplate(); flosTempl->setText( i18n( "" ) ); // find the corresponding parent (==chapter) item QTreeWidgetItem *parentItem = static_cast(listView->currentItem()); if( parentItem ) { // if it is not a chapter nor root, take the parent if( ! (listView->isRoot(parentItem) || listView->isChapter(parentItem)) ) { parentItem = (QTreeWidgetItem*) parentItem->parent(); } } if( parentItem ) { // try to find out which catalog is open/current CatalogChapter *chap = static_cast( listView->itemData( parentItem ) ); if( chap ) { flosTempl->setChapterId( chap->id().toInt(), true ); } } TemplKatalogListView *templListView = static_cast(listView); QTreeWidgetItem *item = templListView->addFlosTemplate(parentItem, flosTempl); listView->scrollToItem( item ); listView->setCurrentItem( item ); openDialog( item, flosTempl, true ); } void TemplKatalogView::slDeleteTemplate() { // qDebug () << "delete template hit"; TemplKatalogListView* listview = static_cast(getListView()); if( listview ) { FloskelTemplate *currTempl = static_cast (listview->currentItemData()); if( currTempl ) { int id = currTempl->getTemplID(); QMessageBox msgBox; msgBox.setText(i18n( "Do you really want to delete the template from the catalog?" )); msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Ok); int result = msgBox.exec(); if( result == QMessageBox::Ok) { // qDebug () << "Delete item with id " << id; TemplKatalog *k = static_cast( getKatalog( m_katalogName ) ); if( k ) { k->deleteTemplate( id ); listview->removeTemplateItem( listview->currentItem()); } } } } } bool TemplKatalogView::currentItemToDocPosition( DocPosition& pos ) { TemplKatalogListView* listview = static_cast(getListView()); bool res = false; if( listview ) { FloskelTemplate *currTempl = static_cast (listview->currentItemData()); if( currTempl ) { // create a new position and offer it to the document manager pos.setText( currTempl->getText() ); pos.setUnit( currTempl->unit() ); pos.setUnitPrice( currTempl->unitPrice() ); pos.setAmount( 1.0 ); res = true; } } return res; } CalcPartList TemplKatalogView::currentItemsCalcParts() { TemplKatalogListView* listview = static_cast(getListView()); CalcPartList cpList; if( listview ) { FloskelTemplate *currTempl = static_cast (listview->currentItemData()); if ( currTempl ) { cpList = currTempl->getCalcPartsList(); } } return cpList; } void TemplKatalogView::openDialog( QTreeWidgetItem *listitem, FloskelTemplate *tmpl, bool isNew ) { if( ! m_flosDialog ) { m_flosDialog = new FlosTemplDialog(this, false); connect( m_flosDialog, SIGNAL(editAccepted( FloskelTemplate* )), this, SLOT( slEditOk(FloskelTemplate*))); connect( m_flosDialog, SIGNAL(editRejected( )), this, SLOT( slEditRejected())); } m_flosDialog->setTemplate( tmpl, m_katalogName, isNew ); m_editListViewItem = listitem; m_flosDialog->refreshPrices(); m_flosDialog->show(); } void TemplKatalogView::slEditOk(FloskelTemplate* templ) { // the dialog saves the template in its accept-slot. KatalogListView *listview = getListView(); if( !listview ) return; TemplKatalogListView *templListView = static_cast(listview); if(m_flosDialog ){ if ( m_flosDialog->templateIsNew() ) { TemplKatalog *k = static_cast( getKatalog( m_katalogName ) ); if ( k ) k->addNewTemplate( templ ); } } if( templListView && m_editListViewItem ) { // qDebug () << "Edit was ok, refreshing item in list " << m_editListViewItem; templListView->setCurrentItem( m_editListViewItem ); templListView->slFreshupItem( m_editListViewItem, templ, true ); templListView->scrollToItem( m_editListViewItem ); } m_editListViewItem = nullptr; } void TemplKatalogView::slEditRejected() { // qDebug () << "Rejecting Edit!"; if ( m_editListViewItem ) { delete m_editListViewItem; m_editListViewItem = nullptr; } } void TemplKatalogView::createCentralWidget(QBoxLayout*box, QWidget *w) { // qDebug () << "Creating new Listview"; m_listview = new TemplKatalogListView( w ); box->addWidget(m_listview); KatalogView::createCentralWidget( box, w ); } void TemplKatalogView::saveWindowState( const QByteArray& arr ) { KraftSettings::self()->setTemplateCatViewState(arr); } QByteArray TemplKatalogView::windowState() { const QByteArray re = QByteArray::fromBase64( KraftSettings::self()->templateCatViewState().toLatin1() ); return re; } void TemplKatalogView::saveWindowGeo( const QByteArray& arr ) { KraftSettings::self()->setTemplateCatViewGeo( QString::fromLatin1(arr) ); } QByteArray TemplKatalogView::windowGeo() { const QByteArray re = QByteArray::fromBase64( KraftSettings::self()->templateCatViewGeo().toLatin1() ); return re; } kraft-1.2.2/src/templkatalogview.h000066400000000000000000000052141467704360200171550ustar00rootroot00000000000000/*************************************************************************** templkatalogview.h ------------------- begin : 2005-07-09 copyright : (C) 2005 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef TEMPLKATALOGVIEW_H #define TEMPLKATALOGVIEW_H // include files for Qt #include #include "katalogview.h" #include "templkataloglistview.h" class TemplKatalog; class KatalogListView; class FloskelTemplate; class FlosTemplDialog; class QBoxLayout; /** * The base class for Kraft katalog view. * @author Klaas Freitag * @version $Id$ */ class TemplKatalogView: public KatalogView { Q_OBJECT public: /** construtor of KraftApp, calls all init functions to create the application. */ TemplKatalogView(QWidget* parent=0, const char* name=0); TemplKatalogView(const QString& katToShow, QWidget* parent=0, const char* name=0); ~TemplKatalogView(); // virtual KatalogListView *createListView(QWidget*); /** opens a file specified by commandline option */ void createCentralWidget(QBoxLayout*, QWidget*); KatalogListView* getListView(){return m_listview;} protected: Katalog* getKatalog( const QString& ); bool currentItemToDocPosition( DocPosition& ); CalcPartList currentItemsCalcParts(); void saveWindowState( const QByteArray& arr ); QByteArray windowState(); void saveWindowGeo( const QByteArray& arr ); QByteArray windowGeo(); public slots: /* Editing of templates -> open edit dialog */ void slEditTemplate(); void slNewTemplate(); void slDeleteTemplate(); /* selected Ok in the template editor */ void slEditOk(FloskelTemplate*); void slEditRejected(); private: // opens the edit dialog. void openDialog( QTreeWidgetItem*, FloskelTemplate *, bool ); // editing dialog for templates FlosTemplDialog *m_flosDialog; TemplKatalogListView *m_listview; }; #endif // TEMPLKATALOGVIEW_H kraft-1.2.2/src/templtopositiondialogbase.cpp000066400000000000000000000045611467704360200214210ustar00rootroot00000000000000/*************************************************************************** templtopositiondialogbase.cpp - base dialog template to doc ------------------- begin : Mar 2007 copyright : (C) 2007 Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include "templtopositiondialogbase.h" #include "docposition.h" TemplToPositionDialogBase::TemplToPositionDialogBase( QWidget *w ) : QDialog( w ) { setObjectName( "TEMPL_DIALOG" ); setWindowTitle( i18n("Create Item from Template" ) ); setModal( true ); } TemplToPositionDialogBase::~TemplToPositionDialogBase() { } void TemplToPositionDialogBase::setPositionList( DocPositionList list, int intendedPos ) { if ( ! getPositionCombo() ) { qCritical() << "Can not get a ptr to the position combo"; return; } QStringList strList; strList << i18n( "the Header of the Document as first item" ); DocPositionListIterator it( list ); while( it.hasNext() ) { DocPosition *dp = static_cast( it.next() ); QString h = QString( "%1. %2" ).arg( list.posNumber( dp ) ).arg( dp->text() ); if ( h.length() > 50 ) { h = h.left( 50 ); h += i18n( "…" ); } strList.append( h ); } getPositionCombo()->insertItems( -1, strList ); getPositionCombo()->setCurrentIndex( intendedPos ); } int TemplToPositionDialogBase::insertAfterPosition() { int itemPos = getPositionCombo()->currentIndex(); // qDebug () << "Current item selected: " << itemPos; return itemPos; } kraft-1.2.2/src/templtopositiondialogbase.h000066400000000000000000000036171467704360200210670ustar00rootroot00000000000000/*************************************************************************** templtopositiondialogbase.h - base dialog template to doc ------------------- begin : Mar 2007 copyright : (C) 2007 Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef TEMPLTOPOSITIONDIALOGBASE #define TEMPLTOPOSITIONDIALOGBASE #include #include class QWidget; class DocPosition; class DocPositionList; class QComboBox; class TemplToPositionDialogBase: public QDialog { Q_OBJECT public: TemplToPositionDialogBase( QWidget* ); ~TemplToPositionDialogBase( ); virtual void setDocPosition( DocPosition*, bool, bool ) = 0; virtual void setCatalogChapters( const QList&, const QString& ) = 0; virtual QString chapter() const = 0; void setPositionList( DocPositionList, int ); int insertAfterPosition(); virtual DocPosition docPosition() = 0; protected: /** * Needs to be reimplemented to return a pointer to a * combobox which can be filled with the current list * of positions to let the user select where the new * pos should go to. */ virtual QComboBox* getPositionCombo() = 0; }; #endif kraft-1.2.2/src/texteditbase.ui000066400000000000000000000154211467704360200164520ustar00rootroot00000000000000 TextEditBase 0 0 481 286 0 0 11 75 true Edit Document Text Template Qt::PlainText false QFrame::HLine QFrame::Sunken &Name: false mEditName Qt::AlignTop false 0 0 displayed as false 0 0 75 true textLabel2 false 0 0 in doc type false 0 0 75 true textLabel3 false Qt::Horizontal QSizePolicy::Expanding 65 16 &Text: Qt::AlignTop false mEditText true Qt::Horizontal QSizePolicy::Expanding 212 16 mEditName mEditText kraft-1.2.2/src/texteditdialog.cpp000066400000000000000000000067011467704360200171450ustar00rootroot00000000000000/*************************************************************************** texteditdialog.cpp - Edit document text templates ------------------- begin : Apr 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include "templtopositiondialogbase.h" #include "texteditdialog.h" #include "doctext.h" #include "defaultprovider.h" TextEditDialog::TextEditDialog( QWidget *parent, KraftDoc::Part docPart ) : QDialog( parent ) { setObjectName( "TEMPL_DIALOG" ); setModal( true ); setWindowTitle( i18n("Edit Text Templates" )); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); QWidget *mainWidget = new QWidget(this); QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); mainLayout->addWidget(mainWidget); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); //PORTING: Verify that widget was added to mainLayout: //PORTING: Verify that widget was added to mainLayout: setMainWidget( mainWidget ); // Add mainLayout->addWidget(mainWidget); if necessary // Add mainLayout->addWidget(mainWidget); if necessary mBaseWidget = new Ui::TextEditBase; mBaseWidget->setupUi( mainWidget ); mBaseWidget->mDocTypeLabel->setText( DocText::textTypeToString( docPart ) ); QString h = i18n( "Edit %1 Template", DocText::textTypeToString( docPart ) ); mBaseWidget->dmHeaderText->setText( h ); mainLayout->addWidget(buttonBox); } TextEditDialog::~TextEditDialog() { } void TextEditDialog::setDocText( DocText dt ) { QString name = i18n( "Template" ); if ( ! dt.name().isEmpty() ) { name = dt.name(); } mBaseWidget->mEditName->setText( name ); // mBaseWidget->mEditDescription->setText( dt.description() ); mBaseWidget->mEditText->setText( dt.text() ); mBaseWidget->mDocPartLabel->setText( dt.textTypeString() ); mBaseWidget->mDocTypeLabel->setText( dt.docType() ); mOriginalText = dt; } DocText TextEditDialog::docText() { DocText dt; dt = mOriginalText; dt.setName( mBaseWidget->mEditName->text() ); dt.setDescription( QString() ); // mBaseWidget->mEditDescription->text() ); dt.setText( mBaseWidget->mEditText->toPlainText() ); // dt.setDocType( mBaseWidget->mCbDocType->currentText() ); // dt.setTextType( DocText::stringToTextType( mBaseWidget->mCbTextType->currentText() ) ); return dt; } kraft-1.2.2/src/texteditdialog.h000066400000000000000000000026311467704360200166100ustar00rootroot00000000000000/*************************************************************************** texteditdialog.h - Edit document text templates ------------------- begin : Apr 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef TEXTEDITDIALOG_H #define TEXTEDITDIALOG_H #include #include "ui_texteditbase.h" #include "doctext.h" #include "kraftdoc.h" class QWidget; class QComboBox; class DocText; class TextEditBase; class TextEditDialog: public QDialog { Q_OBJECT public: TextEditDialog( QWidget*, KraftDoc::Part ); ~TextEditDialog( ); virtual void setDocText( DocText ); DocText docText(); private: Ui::TextEditBase *mBaseWidget; DocText mOriginalText; }; #endif kraft-1.2.2/src/textselection.cpp000066400000000000000000000172341467704360200170300ustar00rootroot00000000000000/*************************************************************************** textselection - widget to select header- and footer text data for the doc ------------------- begin : 2007-06-01 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "textselection.h" #include "filterheader.h" #include "defaultprovider.h" #include "kraftdoc.h" #include "doctype.h" #include "doctext.h" #include #include #include #include #include #include #include #include #include #include #include #include TextSelection::TextSelection( QWidget *parent, KraftDoc::Part part ) :QWidget( parent ), mPart( part ) { mGroupBox = new QGroupBox(i18n("Template Collection")); QVBoxLayout *layout = new QVBoxLayout; setLayout(layout); layout->addWidget( mGroupBox ); /* a view for the entry text repository */ QVBoxLayout *vbox = new QVBoxLayout; vbox->setMargin(0); mTextNameView = new QListView; vbox->addWidget(mTextNameView); mTextNameView->setSelectionMode( QAbstractItemView::SingleSelection ); mTextNameView->setMaximumHeight(120 ); mTextNameView->setEditTriggers( QAbstractItemView::NoEditTriggers ); connect( mTextNameView, SIGNAL(doubleClicked(QModelIndex)), this, SIGNAL(editCurrentTemplate())); mTextDisplay = new QTextEdit; mTextDisplay->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); mTextDisplay->setLineWidth( 1 ); mTextDisplay->setReadOnly(true); QPalette p = mTextDisplay->palette(); p.setColor( QPalette::Active, QPalette::Base, p.color(QPalette::Window)); p.setColor( QPalette::Inactive, QPalette::Base, p.color(QPalette::Window)); mTextDisplay->setPalette(p); vbox->addWidget( mTextDisplay, 3 ); mHelpDisplay = new QLabel; mHelpDisplay->setStyleSheet("background-color: #ffcbcb;"); mHelpDisplay->setAutoFillBackground(true); mHelpDisplay->setWordWrap( true ); QFontMetrics fm( mHelpDisplay->font() ); int minHeight = 1.5 * fm.height(); mHelpDisplay->setMinimumHeight( minHeight ); mHelpDisplay->setAlignment( Qt::AlignCenter | Qt::AlignVCenter ); mHelpDisplay->hide(); vbox->addWidget( mHelpDisplay ); mGroupBox->setLayout( vbox ); mTemplNamesModel = new QStringListModel; mTextNameView->setModel( mTemplNamesModel ); connect( mTextNameView->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( slotTemplateNameSelected( const QModelIndex&, const QModelIndex& ) ) ); #if 0 connect( mTextsView, SIGNAL( currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*) ), this, SLOT( slotSelectionChanged( QTreeWidgetItem* ) ) ); connect( mTextsView, SIGNAL(doubleClicked(QModelIndex) ), this, SLOT( slotSelectionChanged( QTreeWidgetItem* ) ) ); #endif // Context Menu mMenu = new QMenu( this ); mMenu->setTitle( i18n("Template Actions") ); #if 0 mTextsView->setContextMenuPolicy(Qt::CustomContextMenu); connect( mTextsView, SIGNAL(customContextMenuRequested(QPoint) ), this, SLOT( slotRMB( QPoint ) ) ); #endif initActions(); } /* selected the name of a template in the listview of template names */ void TextSelection::slotTemplateNameSelected( const QModelIndex& current, const QModelIndex& ) { if( current.isValid() ) { mCurrTemplateName = mTemplNamesModel->data( current, Qt::DisplayRole ).toString(); // qDebug () << "New selected template name: " << mCurrTemplateName; showHelp(); DocText dt = currentDocText(); showDocText( dt ); } else { mCurrTemplateName.clear(); } emit validTemplateSelected( ); } void TextSelection::showDocText( DocText dt ) { if( dt.type() != KraftDoc::Unknown && dt.isStandardText() ) { showHelp(i18n("This is the standard text used in new documents.")); } mTextDisplay->setText( dt.text() ); } void TextSelection::slotSelectDocType( const QString& doctype ) { QString partStr = KraftDoc::partToString( mPart ); QString t = QString( i18n( "%1 Templates for %2", partStr, doctype) ); mGroupBox->setTitle( t ); mDocType = doctype; DocTextList dtList = DefaultProvider::self()->documentTexts( doctype, mPart ); QStringList templNames; if( dtList.count() == 0 ) { showHelp( i18n("There is no %1 template text available for document type %2.
              " "Click the add-button below to create one.", partStr, doctype ) ); } else { foreach( DocText dt, dtList ) { templNames << dt.name(); } showHelp(); } mTemplNamesModel->setStringList( templNames ); mTextDisplay->clear(); } void TextSelection::addNewDocText( const DocText& dt ) { slotSelectDocType( mDocType ); // update the list of available texts QModelIndexList newItems = mTemplNamesModel->match( mTemplNamesModel->index(0), Qt::DisplayRole, dt.name() ); if( newItems.size() > 0 ) { QModelIndex selected = newItems[0]; mTextNameView->selectionModel()->setCurrentIndex( selected, QItemSelectionModel::Select); } else { // qDebug () << "Unable to find the new item named " << dt.name(); } emit validTemplateSelected(); } /* requires the QListViewItem set as a member in the doctext */ void TextSelection::updateDocText( const DocText& ) { QModelIndex selected = mTextNameView->selectionModel()->currentIndex(); if( selected.isValid() ) { slotSelectDocType( mDocType ); mTextNameView->selectionModel()->setCurrentIndex( selected, QItemSelectionModel::Select ); } } bool TextSelection::validSelection() const { return mTextNameView->selectionModel()->currentIndex().isValid(); } void TextSelection::deleteCurrentText() { slotSelectDocType( mDocType ); } TextSelection::~TextSelection() { } void TextSelection::initActions() { mAcMoveToDoc = new QAction(DefaultProvider::self()->icon( "arrow-narrow-left" ), i18n("&Use in Document"), this); connect(mAcMoveToDoc, SIGNAL(triggered()), this, SIGNAL(actionCurrentTextToDoc())); mMenu->addAction( mAcMoveToDoc ); } /* if the help string is empty, the help widget disappears. */ void TextSelection::showHelp( const QString& help ) { mHelpDisplay->setText( help ); if( help.isEmpty() ) { mHelpDisplay->hide(); } else { mHelpDisplay->show(); #if 0 // qDebug () << "Displaying help text: " << help; QPropertyAnimation *ani = new QPropertyAnimation( mHelpDisplay, "geometry" ); QRect r2 = r1; r2.setHeight( 200 ); ani->setDuration( 2000 ); ani->setStartValue( r1 ); ani->setEndValue( r2 ); ani->start(); #endif } } DocText TextSelection::currentDocText() const { DocTextList dtList = DefaultProvider::self()->documentTexts( mDocType, mPart ); foreach( DocText dt, dtList ) { if( dt.name() == mCurrTemplateName ) { return dt; } } DocText dt; return dt; } QString TextSelection::currentText() const { return currentDocText().text(); } void TextSelection::slotRMB(QPoint ) { // mMenu->popup( mTextsView->mapToGlobal(point) ); } kraft-1.2.2/src/textselection.h000066400000000000000000000055001467704360200164660ustar00rootroot00000000000000/*************************************************************************** textselection - widget to select header- and footer text data for the doc ------------------- begin : 2007-06-01 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef FOOTERSELECTION_H #define FOOTERSELECTION_H #include #include #include #include "kraftdoc.h" class QTreeWidget; class QTreeWidgetItem; class QString; class QPoint; class QMenu; class DocText; class QAction; class QListView; class QStringListModel; class QTextEdit; class QLabel; class QModelIndex; class QGroupBox; class TextSelection : public QWidget { Q_OBJECT public: TextSelection( QWidget*, KraftDoc::Part ); ~TextSelection(); QString currentText() const; DocText currentDocText() const; bool validSelection() const; signals: void actionCurrentTextToDoc(); void currentTextChanged( const QString& ); void validTemplateSelected(); void editCurrentTemplate(); public slots: void addNewDocText( const DocText& ); void deleteCurrentText(); void updateDocText( const DocText& ); void slotSelectDocType( const QString& ); void slotRMB( QPoint ); protected: void initActions(); void buildTextList( KraftDoc::Part ); void showDocText( DocText ); protected slots: // void slotSelectionChanged( QTreeWidgetItem* ); void slotTemplateNameSelected( const QModelIndex&, const QModelIndex& ); void showHelp( const QString& help = QString() ); private: QListView *mTextNameView; QStringListModel *mTemplNamesModel; QTextEdit *mTextDisplay; QLabel *mHelpDisplay; KraftDoc::Part mPart; QString mDocType; QString mCurrTemplateName; QMap mTextMap; QMap mDocTypeItemMap; QMap mStandardItemMap; QMenu *mMenu; QGroupBox *mGroupBox; QAction *mAcMoveToDoc; }; #endif kraft-1.2.2/src/texttemplate.cpp000066400000000000000000000072271467704360200166570ustar00rootroot00000000000000/*************************************************************************** texttemplate.cpp - fill a template with text tags ------------------- begin : Sep 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include "texttemplate.h" #include "ctemplate/template.h" #include "klocalizedstring.h" #include #include TextTemplate::TextTemplate() :TextTemplateInterface(), mStandardDict( nullptr ) { } TextTemplate::~TextTemplate() { if (mStandardDict) delete mStandardDict; } bool TextTemplate::createSubDictionary( const QString& parent, const QString& name ) { Dictionary ttd; bool re = false; if ( mDictionaries.contains( parent ) ) { ttd.mDict = mDictionaries[parent]->AddSectionDictionary( name.toLatin1().data() ); ttd.mParent = parent; ttd.mName = name; mDictionaries[name] = ttd.mDict; re = true; } return re; } void TextTemplate::createDictionary( const QString& dictName ) { if ( mStandardDict ) { mDictionaries[dictName] = mStandardDict->AddSectionDictionary( dictName.toLatin1().data() ); mStandardDict->ShowSection( dictName.toLatin1().data() ); } } void TextTemplate::setValue( const QString& dictName, const QString& key, const QString& val ) { TemplateDictionary *dict = nullptr; if ( mDictionaries.contains( dictName ) ) { dict = mDictionaries[dictName]; } else { if( mStandardDict ) { dict = mStandardDict->AddSectionDictionary( dictName.toLatin1().data() ); mDictionaries[dictName] = dict; mStandardDict->ShowSection( dictName.toLatin1().data() ); } } if ( dict ) dict->SetValue( key.toLatin1().data(), val.toStdString() ); // std::string( val.toUtf8() ) ); } void TextTemplate::setValue( const QString& key, const QString& val ) { if ( mStandardDict ) { mStandardDict->SetValue( key.toLatin1().data(), val.toStdString() ); } } void TextTemplate::setValue( Dictionary ttd, const QString& key, const QString& val ) { if ( ttd.mDict ) { ( ttd.mDict )->SetValue( key.toLatin1().data(), val.toStdString() ); } } bool TextTemplate::initialize() { Template *tmpl = Template::GetTemplate(fileName().toStdString(), ctemplate::DO_NOT_STRIP ); if ( !tmpl || tmpl->state() != ctemplate::TS_READY ) { setError( i18n( "Failed to open template source" ) ); return false; } tmpl->ReloadAllIfChanged(); if (mStandardDict) delete mStandardDict; mStandardDict = new TemplateDictionary( "TopLevel" ); return true; } QString TextTemplate::expand() { std::string output; if ( mStandardDict) { bool errorFree = ExpandTemplate( fileName().toStdString(), ctemplate::DO_NOT_STRIP ,mStandardDict, &output ); QString qout = QString::fromStdString(output); qout.remove(QChar(0)); if ( errorFree ) { return qout; } } return QStringLiteral("Unable to expand template"); } kraft-1.2.2/src/texttemplate.h000066400000000000000000000051341467704360200163170ustar00rootroot00000000000000/*************************************************************************** texttemplate.h - fill a template with text tags ------------------- begin : Sep 2007 copyright : (C) 2007 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef TEXTTEMPLATE_H #define TEXTTEMPLATE_H #include #include #include "texttemplateinterface.h" #include #include using ctemplate::Template; using ctemplate::TemplateDictionary; class TextTemplate : public TextTemplateInterface { private: struct Dictionary { QString mParent; QString mName; TemplateDictionary *mDict; }; public: TextTemplate(); ~TextTemplate() override; /** * set a value in the default dictionary */ void setValue( const QString&, const QString& ) override; /** * set a value in the named dictionary * Parameters: * the parameter group name * the key name * the value */ void setValue( const QString&, const QString&, const QString& ); void setValue( Dictionary, const QString& , const QString& ); void createDictionary( const QString& ); /** * creates a sub dictionary to a given dictionary. * Parameter 1 is the parent dict, Param 2 the sub dictionary name. */ bool createSubDictionary( const QString& , const QString& ); /** * creates a dictionary with the name given in parameter two nested * in the parent dictionary given in the first parameter. * * The dictionary struck is given back to use with setValue. */ // Dictionary createSubDictionary( Dictionary, const QString& ); /** * get the expanded output */ QString expand() override; protected: virtual bool initialize() override; private: TemplateDictionary *mStandardDict; QMap mDictionaries; }; #endif kraft-1.2.2/src/texttemplateinterface.cpp000066400000000000000000000025701467704360200205340ustar00rootroot00000000000000#include "texttemplateinterface.h" #include "defaultprovider.h" #include #include #include namespace { QString findTemplateFile(const QString &filename) { QString tmplFile; if( ! filename.isEmpty() ) { const QString templFileName = QStringLiteral("kraft/")+filename; tmplFile = DefaultProvider::self()->locateFile(templFileName); } return tmplFile; } } // end of anonym namespace TextTemplateInterface::TextTemplateInterface() { } TextTemplateInterface::~TextTemplateInterface() { } QString TextTemplateInterface::fileName() const { return _fileName; } bool TextTemplateInterface::setTemplateFileName( const QString& name ) { _errorString.clear(); _fileName = name; QFileInfo info( _fileName ); if ( info.isAbsolute() ) { // assume it is a absolute path } else { _fileName = findTemplateFile(_fileName); if ( _fileName.isEmpty() ) { _errorString = i18n( "No file name given for template" ); return false; } info.setFile( _fileName ); } if ( ! ( info.isFile() && info.isReadable() ) ) { _errorString = i18n( "Could not find template file %1", info.absoluteFilePath() ); return false; } qDebug () << "Loading template source file: " << _fileName; return initialize(); } bool TextTemplateInterface::isOk() { return _errorString.isEmpty(); } kraft-1.2.2/src/texttemplateinterface.h000066400000000000000000000027661467704360200202100ustar00rootroot00000000000000#ifndef TextTemplateInterface_H #define TextTemplateInterface_H #include class TextTemplateInterface { public: TextTemplateInterface(); virtual ~TextTemplateInterface(); /** * take the template absolute filename of the template source and * load it immediately. * returns true if successful. Otherwise check errorString() for * error messages */ bool setTemplateFileName(const QString& file); QString fileName() const; /** * @brief isOk - returns true if the TextTemplate is ok and can be used. * @return true if the text template can be used. */ virtual bool isOk(); /** * return a describing string if something went wrong when opening * the template. */ QString errorString() const { return _errorString; } /** * set a value in the default dictionary */ virtual void setValue( const QString&, const QString& ) = 0; /** * get the expanded output */ virtual QString expand() = 0; protected: /** * @brief initialize - use for basic initialization * @return true if successful * * This method can assume that the filename member var points to * a valid file. */ virtual bool initialize() = 0; /** * @brief overwrites the error message * @param the error string */ void setError(const QString& msg) { _errorString = msg; } private: QString _fileName; QString _errorString; }; #endif // TextTemplateInterface_H kraft-1.2.2/src/timecalcdialog.cpp000066400000000000000000000057201467704360200170740ustar00rootroot00000000000000/*************************************************************************** Timecalcdialog - ------------------- begin : 2004-23-09 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ // include files for Qt #include #include #include #include #include "timecalcdialog.h" #include "timecalcpart.h" #include "stdsatzman.h" TimeCalcDialog::TimeCalcDialog(QWidget *parent) : CalcDialogBase( parent ), _timeWidget(new Ui::calcdetailTime), _part(0) { _timeWidget->setupUi(_centralWidget); _timeWidget->m_hourSets->insertItems(-1, StdSatzMan::self()->allStdSaetze()); _timeWidget->_cbTimeUnit->addItems(TimeCalcPart::timeUnitStrings()); } void TimeCalcDialog::setTimeCalcPart(TimeCalcPart *cp) { _part = cp; if( ! cp ) return; _timeWidget->m_nameEdit->setText( cp->getName()); _timeWidget->m_dauer->setValue( cp->duration()); _timeWidget->_cbTimeUnit->setCurrentText( TimeCalcPart::timeUnitString(cp->timeUnit())); _timeWidget->m_stdGlobal->setChecked(cp->globalStdSetAllowed()); StdSatz std = cp->getStundensatz(); _timeWidget->m_hourSets->setCurrentIndex(_timeWidget->m_hourSets->findText( std.getName() )); } void TimeCalcDialog::accept() { if( _part ) { _part->setGlobalStdSetAllowed(_timeWidget->m_stdGlobal->isChecked()); _part->setDuration(_timeWidget->m_dauer->value(), _timeWidget->_cbTimeUnit->currentText()); _part->setName(_timeWidget->m_nameEdit->text()); QString selHourSet = _timeWidget->m_hourSets->currentText(); StdSatz stdsatz = StdSatzMan::self()->getStdSatz(selHourSet); _part->setStundensatz(stdsatz); } if( _part && _part->isDirty() ) { emit timeCalcPartChanged(_part); } CalcDialogBase::accept(); } QString TimeCalcDialog::getName() { return _timeWidget->m_nameEdit->text(); } int TimeCalcDialog::getDauer() { return _timeWidget->m_dauer->value(); } bool TimeCalcDialog::allowGlobal() { return _timeWidget->m_stdGlobal->isChecked(); } QString TimeCalcDialog::getStundensatzName() { return _timeWidget->m_hourSets->currentText(); } QString TimeCalcDialog::unitStr() const { return _timeWidget->_cbTimeUnit->currentText(); } /* END */ kraft-1.2.2/src/timecalcdialog.h000066400000000000000000000031321467704360200165340ustar00rootroot00000000000000/*************************************************************************** Timecalcdialog - ------------------- begin : 2004-23-09 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _TimeCALCDIALOG_H #define _TimeCALCDIALOG_H // include files #include "calcdialogbase.h" #include "ui_timepart.h" /** * */ class TimeCalcPart; class TimeCalcDialog : public CalcDialogBase { Q_OBJECT public: TimeCalcDialog(QWidget *parent=0); void setTimeCalcPart(TimeCalcPart *cp); QString getName(); QString getStundensatzName(); int getDauer(); bool allowGlobal(); QString unitStr() const; signals: void timeCalcPartChanged(TimeCalcPart*); protected slots: void accept(); private: Ui_calcdetailTime *_timeWidget; TimeCalcPart *_part; }; #endif /* END */ kraft-1.2.2/src/timecalcpart.cpp000066400000000000000000000101341467704360200165760ustar00rootroot00000000000000/*************************************************************************** timecalcpart.cpp - ------------------- begin : Don Jan 1 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include #include "klocalizedstring.h" #include "timecalcpart.h" TimeCalcPart::TimeCalcPart() :CalcPart(), _duration( 0 ), m_allowGlobalStundensatz(false), _timeUnit(Minutes) { } TimeCalcPart::TimeCalcPart(const QString& name, int minutes, TimeUnit unit, int prozent) :CalcPart( name, prozent ), _duration( minutes ), m_allowGlobalStundensatz(true), _timeUnit( unit ) { } TimeCalcPart::~TimeCalcPart() { } StdSatz& TimeCalcPart::getStundensatz() { return m_stundensatz; } /** Write property of Geld m_stundensatz. */ void TimeCalcPart::setStundensatz( const StdSatz& _newVal) { // qDebug() << "stundensatz gesetzt: " << _newVal.toString(); m_stundensatz = _newVal; setDirty(true); } void TimeCalcPart::setGlobalStdSetAllowed( bool s ) { if( m_allowGlobalStundensatz != s ) { m_allowGlobalStundensatz = s; setDirty(true); } } void TimeCalcPart::setDuration( int duration, const QString& unitStr ) { if( _duration != duration || timeUnitString(_timeUnit) != unitStr ) { _duration = duration; _timeUnit = timeUnitFromString(unitStr); setDirty(true); } } QString TimeCalcPart::timeUnitString( const TimeUnit& unit ) { if( unit == Minutes ) { return i18n("Minutes"); } else if( unit == Hours) { return i18n("Hours"); } return i18n("Seconds"); } QStringList TimeCalcPart::timeUnitStrings() { // When adding something here make sure to adjust other places in the file return QStringList() << timeUnitString(Minutes) << timeUnitString(Seconds) << timeUnitString(Hours); } TimeCalcPart::TimeUnit TimeCalcPart::timeUnitFromString( const QString& unit) { const QStringList li = timeUnitStrings(); int pos = li.indexOf(unit); return timeUnitFromInt(pos); } TimeCalcPart::TimeUnit TimeCalcPart::timeUnitFromInt( int index ) { // the static_cast here need to be updated if new enums are added if( index > -1 && index <= static_cast(Hours)) { switch (index) { case static_cast(Minutes): case static_cast(Seconds): case static_cast(Hours): return static_cast(index); default: // this is actually an error case, forgot to add a pot. new enum... return Minutes; } } return Minutes; } int TimeCalcPart::timeUnitIndex() const { // Make sure to adopt this if a new unit is added! if( _timeUnit == Hours ) return 2; else if( _timeUnit == Seconds ) return 1; else return 0; } qint32 TimeCalcPart::durationToSeconds() const { if( _timeUnit == Minutes ) { return _duration * 60; } else if( _timeUnit == Hours ) { return 60*60*_duration; } // seconds is default return _duration; } Geld TimeCalcPart::basisKosten() { StdSatz stdSatz = getStundensatz(); const Geld g( (stdSatz.getPreis().toLong() * durationToSeconds()) / 360000.0); return g; } QString TimeCalcPart::getType() const { return KALKPART_TIME; } kraft-1.2.2/src/timecalcpart.h000066400000000000000000000044551467704360200162540ustar00rootroot00000000000000/*************************************************************************** Timecalcpart.h - ------------------- begin : Don Jan 1 2004 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef TIMECALCPART_H #define TIMECALCPART_H #include #include "stdsatzman.h" /** *@author Klaas Freitag */ class TimeCalcPart : public CalcPart { public: enum TimeUnit {Minutes, Seconds, Hours}; TimeCalcPart( const QString& name, int minutes, TimeUnit unit, int prozent = 0); TimeCalcPart(); ~TimeCalcPart(); bool globalStdSetAllowed() { return m_allowGlobalStundensatz; } void setGlobalStdSetAllowed( bool s ); void setDuration(int duration, const QString &unitStr ); static QStringList timeUnitStrings(); static QString timeUnitString( const TimeUnit& unit ); static TimeCalcPart::TimeUnit timeUnitFromString( const QString& unit); static TimeCalcPart::TimeUnit timeUnitFromInt(int index); qint32 durationToSeconds() const; qint32 duration() const { return _duration; } TimeUnit timeUnit() const { return _timeUnit; } int timeUnitIndex() const; virtual Geld basisKosten(); /** Write property of Geld m_stundensatz. */ virtual void setStundensatz( const StdSatz& _newVal); /** Read property of Geld m_stundensatz. */ virtual StdSatz& getStundensatz(); virtual QString getType() const; private: qint32 _duration; /** */ StdSatz m_stundensatz; bool m_allowGlobalStundensatz; TimeUnit _timeUnit; }; #endif kraft-1.2.2/src/timepart.ui000066400000000000000000000076321467704360200156170ustar00rootroot00000000000000 calcdetailTime 0 0 432 275 Calculation Item Time <h1>Calculation Part 'Time'</h1> false Calculate time efforts here for one unit of the template. <br/>Note that the costs may depend on a global hourly rate. Qt::RichText Qt::AlignVCenter false &Label: false m_nameEdit Work &Time effort: false m_dauer 5 0 10000 &Hourly rate: false m_hourSets 0 0 Apply the &global hourly rate m_nameEdit m_dauer m_hourSets m_stdGlobal kraft-1.2.2/src/unitmanager.cpp000066400000000000000000000062701467704360200164460ustar00rootroot00000000000000/*************************************************************************** unitmanager - ------------------- begin : 2004-05-05 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #include // include files for KDE #include #include #include "unitmanager.h" #include "einheit.h" Q_GLOBAL_STATIC(UnitManager, mSelf) UnitManager* UnitManager::self() { return mSelf; } UnitManager::UnitManager( ) { } void UnitManager::load() { QSqlQuery q( "SELECT unitID, unitShort, unitLong, unitPluShort, unitPluLong, ec20 FROM units"); while( q.next()) { int unitID = q.value(0).toInt(); Einheit e( unitID, q.value(1).toString(), q.value(2).toString(), q.value(3).toString(), q.value(4).toString(), q.value(5).toString()); mUnits.append(e); } } int UnitManager::nextFreeId() { int id = 0; if( mUnits.size() == 0 ) { load(); } foreach( Einheit u, mUnits ) { if( u.id() > id ) { id = u.id(); } } return id+1; } QStringList UnitManager::allUnits() { QStringList list; if(mUnits.size() == 0 ) load(); foreach( Einheit e, mUnits ) { QString uSing = e.einheitSingular(); if( !uSing.isEmpty()) list << uSing; } return list; } Einheit UnitManager::getPauschUnit() { int id = getUnitIDSingular(QStringLiteral("pausch.")); if (id > -1) return getUnit(id); return Einheit(); } Einheit UnitManager::getUnit( int id ) { if( mUnits.size() == 0 ) load(); // qDebug() << "Searching unit ID " << id; foreach( Einheit e, mUnits ) { if( e.id() == id ) return e; } return Einheit(); } int UnitManager::getUnitIDSingular( const QString& einheitStr ) { if( mUnits.size() == 0 ) load(); foreach( Einheit tmp, mUnits ) { if( tmp.einheitSingular() == einheitStr || tmp.einheitPlural() == einheitStr ) { // qDebug() << "Thats it, returning " << tmp.id(); return tmp.id(); } } return -1; } QString UnitManager::getECE20(const QString& einheitStr) { if( mUnits.size() == 0 ) load(); for( Einheit tmp: mUnits ) { if( tmp.einheitSingular() == einheitStr || tmp.einheitPlural() == einheitStr ) { // qDebug() << "Thats it, returning " << tmp.id(); return tmp.ec20(); } } return QString(); } UnitManager::~UnitManager( ) { } /* END */ kraft-1.2.2/src/unitmanager.h000066400000000000000000000032371467704360200161130ustar00rootroot00000000000000/*************************************************************************** unitmanager - ------------------- begin : 2004-05-05 copyright : (C) 2004 by Klaas Freitag email : freitag@kde.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. * * * ***************************************************************************/ #ifndef _UNITMANAGER_H #define _UNITMANAGER_H #include "einheit.h" /** * */ // FIXME: How to identify the unit for piece? #define PIECE_UNIT_ID 6 class UnitManager { public: UnitManager(); virtual ~UnitManager(); static UnitManager* self(); Einheit getUnit( int id ); Einheit getPauschUnit(); QStringList allUnits(); int getUnitIDSingular( const QString& einheit ); QString getECE20(const QString& einheitStr); // Workaround: since the unit table does not have an auto update id coloum, // this function calculates the next free unit id to save a new one. int nextFreeId(); private: Einheit::List mUnits; void load(); }; #endif /* END */ kraft-1.2.2/src/unitseditbase.ui000066400000000000000000000052731467704360200166340ustar00rootroot00000000000000 UnitsEditBase 0 0 319 241 <h1>Add a unit</h1> false Unit short mUnitShort Unit long mUnitLong Unit plural short mUnitPluShort Unit plural long mUnitPluLong Unit ECE20 mUnitPluLong kraft-1.2.2/src/upgradedb.ui000066400000000000000000000060421467704360200157210ustar00rootroot00000000000000 upgradeDbForm 0 0 601 256 This step checks if the database schema version is sufficient for this version of Kraft. In case it is not, the schema is updated automatically. true 0 %p% 0 / 129 30 0 X Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 Status: Upgrade not yet started true Qt::Vertical 20 101 kraft-1.2.2/src/version.h.in000066400000000000000000000012741467704360200156720ustar00rootroot00000000000000#pragma once namespace Kraft { namespace Version { // Static content. Maintain values here. inline QString number() { return QStringLiteral("1.2.2"); } inline QString codeName() { return QStringLiteral("Lynoel"); } inline int dbSchemaVersion() { return 24; } // dynamic content. These values get defined at build time in the top CMakeLists.txt inline QString gitSha() { return QStringLiteral("@GIT_SHA1@"); } inline QString gitBranch() { return QStringLiteral("@GIT_BRANCH@"); } inline QString buildHost() { return QStringLiteral("@BUILD_HOST_NAME@"); } inline QString buildHostDistro() { return QStringLiteral("@BUILD_HOST_DISTRI@"); } } } kraft-1.2.2/src/wageseditbase.ui000066400000000000000000000025551467704360200166000ustar00rootroot00000000000000 WagesEditBase 0 0 348 123 <h1>Add a Wage group</h1> false Group name Wage kraft-1.2.2/src/xrechnung.ui000066400000000000000000000050741467704360200157710ustar00rootroot00000000000000 XRechnungDialog 0 0 343 169 Dialog <html><head/><body><p><span style=" font-size:14pt; font-weight:600;">XRechnung Additional Data</span></p></body></html> false Due date: Buyer reference: Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() XRechnungDialog accept() 248 254 157 274 buttonBox rejected() XRechnungDialog reject() 316 260 286 274 kraft-1.2.2/styles/000077500000000000000000000000001467704360200141575ustar00rootroot00000000000000kraft-1.2.2/styles/CMakeLists.txt000066400000000000000000000004421467704360200167170ustar00rootroot00000000000000########### install files ############### add_subdirectory(pics) install(FILES templcatalog.style DESTINATION ${DATA_INSTALL_DIR}/kraft/styles) install(FILES docdigestview.css docoverview.css docoverview_ro.css catalogview.css systemview.css DESTINATION ${DATA_INSTALL_DIR}/kraft/styles) kraft-1.2.2/styles/catalogview.css000066400000000000000000000005751467704360200172050ustar00rootroot00000000000000 * { font-family: sans-serif; margin-left: 10px; margin-top: 10px; } h2 { padding-top: 20px; margin-left: 20px; margin-bottom: 10px; } tr { } td.bigfont { font-size: x-large; color: #323432; font-weight: bold; background: #dffdd0; padding-right: 20px; } td.sub { margin-bottom: 20px; padding-left: 20px; padding-bottom: 30px; font-size: small; } kraft-1.2.2/styles/docdigestview.css000066400000000000000000000000351467704360200175270ustar00rootroot00000000000000 h2 { color: #64ad24; } kraft-1.2.2/styles/docoverview.css000066400000000000000000000016171467704360200172320ustar00rootroot00000000000000 body { background-image:url(pics/docoverviewbg.png); font-family: 'Source Sans Pro', sans-serif; } td { vertical-align:top; } div { padding: 1px; color: #898989; } a:link { text-decoration: none; color: #00008b; } a:visited { text-decoration: none; color: #00008b; } a:hover { color: #00008b; text-decoration: none; } a:active { color: #00008b; text-decoration: underline; } .headerlink { background: #8ddbe9; } .headerlink_selected { background: #9af0ff; font-weight: bold; } .bodylink { background: #8de99a; } .bodylink_selected { background: #9affaa; font-weight: bold; } .footerlink { background: #dbe98d; } .footerlink_selected { background: #f0ff9a; font-weight: bold; } .negative { color: #800040; } .head_selected { } .body_selected { } .foot_selected { } td.baseline { } td.itemnums { } td.itemtexts { } td.prices { } kraft-1.2.2/styles/docoverview_ro.css000066400000000000000000000007101467704360200177230ustar00rootroot00000000000000body { margin:20px; background-image:url(pics/docoverviewbg.png); color: #4e4e4e; font-size:x-small; font-family: 'Source Sans Pro', sans-serif; } td { vertical-align:top; } div { border-style:none; border-width:0px; border-color:#00008B; margin: 1px 0px 1px 0px; padding: 1px; } .negative { color: #800040; } .positive { } div.header { margin-top: 120; margin-bottom: 20px; vertical-align:bottom; } kraft-1.2.2/styles/pics/000077500000000000000000000000001467704360200151155ustar00rootroot00000000000000kraft-1.2.2/styles/pics/Blank_Calendar_page_icon.svg000066400000000000000000000203621467704360200224650ustar00rootroot00000000000000 image/svg+xml blank calendar 20071204 Jackaranga GFDL kraft-1.2.2/styles/pics/CMakeLists.txt000066400000000000000000000002651467704360200176600ustar00rootroot00000000000000########### install files ############### install(FILES docoverviewbg.png kraftapp_logo_trans.png kraft_customer.png postit.png DESTINATION ${DATA_INSTALL_DIR}/kraft/styles/pics) kraft-1.2.2/styles/pics/Calendar_page.png000066400000000000000000000050701467704360200203320ustar00rootroot00000000000000PNG  IHDR|ZbKGD pHYs B(xtIME 3qx IDATxkl[c؉\΅6IeҎ)C ! e~ V VƘШ[XۥTHEcem^HMԎ9ѬMb[ct~|w,M}>'н^2ޯ{>w)q9ssX@?80f5'EFɿm۶M̈́jEW EǞmڔ)‡+ l;g,VJ㨦Wl3!ɴ p'W4A;Xu}sBx͙n+… DpA "\D .pA 2[Ͱ%(PoVQ_8zh^YO)tgR6<'Ex8$EL(r78 ǽ(M%F4-mrHj"R d~l&?e /&3KƵ':%&5gR40( 2jLDrUOP53<7iSx(,Li/w9iu8ŋTZ!\`' FAYYv7XCWaF"_pӟBYj=TXFFdA뫪R]2߃+[MUwRUC3??%gw]M|ԁ-_\U`^g8 G5[R]>-BZ-C!Px=J K^Ӷ62pL v#_{n2%v)#/N*M&ye^Y <FAx?5 N]g:OB$<[T8~ !qX-^LYS'y[ɟB7@i,_ҝxjȉp_Ql$Qn膝^>V+'U{ApdhIa!IUE4IqN8wGcσޢcx$.%J:a^C=~ VAD́FNn 8Z\ïǂqx<|2rF~Z/-ȗ(*yjnvXjɇMu#'jBR Ň`nTxvS}iGRo"wnM.K[%9 ,;7bܿsFbOµG,&@.;\.nn ϭ).6AmB`pҥeJu[&Szn!k6ٖ=\fH˶L 6| [^\D .pA "\D ..pA "\D .pA "\K D .pA "\D .pApA "\D .pA "\DD .pA "\D …/i&i t]LD"& xDK6rh45b===  ~#fhh)w9/)n]]]o[[[$ٷo/6|KVp8LWWW;7xw&;y:;;_+'m:'2$v BG MMMx2v5~ ,\'N$u!+Bz]]݁D뽱XLlݺfq xGejܹ>oD"tMV^.{HSSSsGGdz_3 Z穪z+$sDm]P͟@ [qEQ$Ϋھ}[^򫡺S@@VAJ$~ ,L Omm/Ri bϞ=e˖xrOv=([74M߻wotÆ 'jjj`&NƬTTTSYYX}} u֭3M8G՚Ϸ2i᪨vr:EEE%eee6iq8VEQ)D  A0{ٷsSĤDIENDB`kraft-1.2.2/styles/pics/docoverviewbg.png000066400000000000000000000003171467704360200204710ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME  !%*dtEXtCommentCreated with The GIMPd%n3IDAT8c !?+8A&dEh^^^3d4 ̀MBTIENDB`kraft-1.2.2/styles/pics/kraft_customer.png000066400000000000000000000114401467704360200206530ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxZi]Y~wx;;N8iRph46 TЖPAS "AT@-E~T]( ޔiK8x6sG 1f sMpw<ව ꋏc~]` ю8QSuyh=R[=3`;6LY< W3 }<<_4d, ~?e^!]hi;2Fɑ4Lv729/֔,{a<'{;l+dz}:sdǂ0XVV+ô_mdO XӴˤ]-)3U`Q?+eOM^4%@7ip9<ݹGN{_ ĽKjٖ-"K;ô]:!ycFXyGEᑇnŁr o=VTݿ^z= ɛb$ftc?:d7l?sMC?KLDy׆\HBE(v:]ty;?{|6[q YSs]سK.Y• j6i92ꦇ=b lu+*dLF-TDwA:9TVѢ#ׁ{M bdD8_ysWuA\^lm9T6T6^=҉/:4OV{Ư i Aԏ&2@u XFͶD9 sþad6q~zuJIE# dFرs|R Kg:_AU& l07%Kz}|\]vhP0 oFʏ"td_;KK l7>V*-,5 窛ݡ8Jwt ˎ򐉁9Cm:)^zfBρ/kvM`6,ǁC5<ze(+ aY$2ܨ t]3:EL2K}epw+z>1NAo9t V]?ҷ/4;v abba26p@ NEq8y-7XD1Z (3AR ڍv>|^$F$6L]3{ʥ܁ geF th"y!f*X}w '=YXvqۑ]8zx'cn`!ɖn (-~$>U7K*hWMJmt5 e rb)9X 'jBR*#v,^qxiEJؐfK8VEx,J l.r Ik$mIB֙UmCϹkdߊ$8 y4  :B ZBu ( NT7XW]U 0`|8b0 U3f4 J[v|C{K)0(ӑ׽M1q1o,/1384sIKx)Y&>9<p| ftזt |Hō(1.,n/ [~tjT^^ax8԰uOWuF'عmxj~gq2;i:mvhA&>c<с\.3e0dK5 WdND,k}F?YF[N%CFet#)5|?jy5U 3K8 4:8h1CN_Bg=U<9d{x<5F,t{L6sbe"u`3ņsnFWc"vSp9#) n–ϠRbtg|Wkx1ߦ,a{"e%ք\L=V*f9Q9hӡ@#e gbqE|6-ߏ*f)|I+'!f$Rwގѹ#_{fm]3BkVkr54dRgFulx!x<[^_|_Bg #Mv-d9 RpJ4 =q\=C]{|-1G cR0Xkx2W~X Y\xMЉ<(a,[}oib03zTC”c2"wrɏ@E+D(g#2?s;8kP퀑v8#C>!Cٗ x A~/$9fh}YKae*2c *i! ~< \3~K}yTIĖ7?73ͫ/)l qLOa3į+QŽq%(Ρ,Xܨh$Xo'oY:y`M7+w,Nݍ0nB7Iﻟ`xI5'$^{9ŻIB/TqH&MsIL|s0 34ʵDqWQaYCXrz_1>gkfQL$0_G'7XFpMXWq.t}{OlYC1ìW;ǵlN89JaR* &GʸkrÅTrTƔSrHt,,.+Qcj$*a/=S.h=p>8)n,CF ohቸĕ_۞$ ö09>ZRer$\2+MsjVP6Ռ"QGQB |ȽX;x/^\_?}_C @/lp\/:fH9Rh4=>Dof⻭\QJ>5YYp]qF1iI Ѧ9 LyeҒ I$~Ze<<6!$NHH7T$F"L% <`&'$S7r-5ic;K"QP+xK[mjI$,xRݓj2x D}A&b]b qh<hG A3DyME?z],bHL !wv$-(Lx=Q-aj֦:{Gл6>RCD9q3fRž4yD Wg{&۝q$5~7WE^V7HG_Qճ-beOo,t,JZKk-it=xtSuA4g c {O_Z+FD;ݒ+YMo]][mf;.SE|@E[2HhEH"wVd$ GIK1իu]{ĺT&x#Qa-U/peYyB^ȴ;pzSW>0D`;@0cYdSR#&ힰMJ->SoE| 0ۉ%mϏ~/G|2S7L-+EO32ENm2$-HcV%V4A8J]Cz?s?|pZ3:arxI/$p#K P·3 F8`&-!eDUE%tk><}/3o` V7nIENDB`kraft-1.2.2/styles/pics/kraftapp_logo_trans.png000066400000000000000000000054341467704360200216700ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs  tIME  1IiTXtCommentCreated with GIMPd.e IDATxk]UϹ{Ə9)*RA"HP_A%ቃ82䬛GGǂ%yI5:iwzKHaI Lp# " hD S۾HGWL- i72;XΫ&rZyw1ҷ~I -W 'k:)>E0ZEIn$}-u/˱;V#?زWI ,`F4M%37\3ܱxp)ͷs;KˍCĹX40'"|Ͻ)dد'\B"`>;%(F˽sM\ ;( ǀHg2Žg!=V{C3n 9$G`tߟ|"^eHTs?w^$qDʅ@:^3/ ~Ս`&À$!9җW~׬StPw$ p}(WP =q?yI4[wY!Fd^y$,|l8̽!sn8l/H~8y$GADNG281թooGO7sߐ xGK'l#JTW'j58%> {Z_=kΕfuC)~$ˤ {IO?^Fb y*+85! 'ϐwf_IjFq MtS\ C3&[5Yb^ d ң% Ucպ O PgNKF(G?h5,oXK궾3K,TS88^TYYoH1c$97 GK_sAvwY]AI!Pt87z.[rIy wHU=y'#Rœp7Adie79ʦ4*1kh&8MX%K'}c8;/J%'=瑒Tk+Ϊ$K^I+b)etY<@F[V!,| =SrPIl39w  Iu{0#pxȫHYr1w>Ǯ|{d=6-`C@D੺W}[$oN,' ,+Kѵ:3Pǹ?ew\=,䃼6{p{oH`/IV׉]SI>*՜ՙ%'@H) j?qb0" * \X{5 @:$id@9?W ww37FY(۫'EZf֓NlVqR*{)/+ƭ|֔$ 9H.uO㌯pзw<_m"#ymB( ^\M|U- u8 }{Ȝaٯfa01rw!UI]~-5#|υxS_5_APw;|G"3R\%jWaD (@#>?>g6}m ڧ)B?;ECH:|χ=O?߱U㧺3J1S}GN C5CMO=8oxՋKun ׵z)I?ҳ:_/~U8,\Sy=?[kLx9lk(E|ޕHZwk?ߴ he#^BÓ{5͟LoQ{ͮ`L @ &O'SZ1,@'@9w$]CP3kVIҟp#[ZťҬ @^<=_\`@^&wR^^ji+ɺKsѫ36^|0=^wx$p'=~w._?2H*$u]9 =ɋa(~-]恂~BR4?+ Tw=t}:A4ta0"P^UW]#xў\Ao xB.6Is=SZבjV iΆ9gpT碽 (X "NX+"Rc% cWzqo'h+( K,Nqvi+Hϵjd/ڡD􂼃T&TﵝӾ^5PR&H(P|o_>$ /Q;oG{_a pͨ:_u fW6 ϲuQB ɡba3.I0Nj-lfhtew/0I|FQ=L-4Lva`( /Ң`KӋgrLXkχt w`zLgX`!;q٥3+Ʈ#^ _Lwsm@`" a0]pWtߓA6ZP~<=<СS+UֱJ=htlfAˌN۔i HTg{mDU7;B ȩ{'ݣbA{;T{;}y+P?OF]TI=oO9{_<5OFY7[dU{]|vD|1O *W25PDZCPGNN Щh37Pk`޶;6DGE#J/eSO] yWP}X!mῈ6y^ٰ^Ǒ Prǹj}aVfP'᝵:9gN CvLi `޵V )N [sIPG5N`?.CEŤPMMps?@ĄfA$8m _8vVQp;{lIj.g( H9q*:l6qd "$>h˧xKO Hexܲ`s4rI %c|X TuI@U;PdLN_'2gTImOnL9q=Xt@jFԀ;G ;w+&`ߝGC'Fk5}e?/0[oB}&v #M?5ſ_!M`j$(F7? ~ǁ}- ŏٺ6"#}u*=Z-kc ׿3/n}s F EBK^>)SĹW9C^UୡFDW9 ڟء eZ]8VE n-81{Z~D;5q ׸}};eq|UB51,mQpzs Yw.ͯǏH}5/ \e63dؙ*Xf%7Z.m+`46FcvဍO@`:l`a3A'hOfU:xY~؇)8f9rDUjLɒXCL CtT,! hŎz08hJwc^״1D " I!W%%s*1d6H$1@:8 `  .P.Dlggg_(1ϴwJ0͟' fq,8Ƽ~]j6dlbϘ8vt(Pt%^5w-N_ɾ\و٦7Ta#KWJpCYû_bQ+Dd' k{-wOjKqsF5Ru.k]8> Lf?(ZD bq L ʂOF<#17m U` ^Ȃ4\l, SjEw`M̊R~F/U&P}` z_\'NΉ]v9"IDoX+m`T4tڠ`^0ӱ ~cI!dOR76T=9#& oɢ(a%bxSGo](RE!ٺ))cԺ^)l׍y4,!Y E7=a]#c?i|9?{k䍯c~305aJ,#O{!\FNe(* `ݠٟ%$|`h2Tf :A!Y15lkQ Pt>dz Ĵ " I/i Df3(:E9FJ!^L:KrΉ9ϘsdNc)-P]_zJ8pu@kʈ% dkI<- nGHNM :i'S ]hDlRI*jh E)ᇟտ}u-pz ]ϗ?IO<~i|Sg?x^mD~*~ccPT;Tx+AH HyGA~ J"g83蛢20.{î/bZpuCNjhumAftئ/}F>'쭷S"wcγqߍE D;j5(a*X N5Vsx dE7r^PPChL2rm_/IrmZ Z/Nk8fa¤J"b9%jd`cزY76`<>e~ W )>xɷ㯃V)/_w[-PbH1 Ħ(^Llj+OԷFf":As )k$?' O ޟM?@\n},_k%ܟϵ;WL *Ftޮm2''_J%Wv_2}pܪ 6^L!t+~TLkxDI)HZ Z8'pNZPpH"ې odP,N];qVmX-h7sǛN ٺ}ǁ _nZ2u+@&^&>z4 PLGrY( \);SP:m`gA}e(+\,RAPP,&h(rM,bmHg ?#1Wwή~Ɗ'~!pfZ9w}e ]vT"3b2"3Uw#G,%\bl;ZGд/𕕜.[#XDap8%Ic*DCƯyp܊7='!7S-} %8y3~om k`u?3G??^r(jf1_fe |xfǶ1fss ؕJ0ilVDsD8c l}+[,&:/E:cblw _cGmۖ$]t?H_+;C3_dhw:Ƚ Ve[f」-5I]ݺiM['n(KS!piP^^)r`xbrL!:[ HDJ zf{qH L cR(7BN7xS(XȋO4cEv]- ^ç^?xo~TWm!;0v m\ <V4VPԋT|['N l.ٲm;Cdk 0κ: $ԓ+lC)  02|„Tݯ7J[q2S^b;G1H㟮-iM$>5k:EGju$/!EVTǃWsm\H0$ ͸`w6̔< ;#J 6xQLҴ"p\vKuG2L;/R<趺:ެs4R$Yu`4 ~Lrj 'v /0:~$eIq1={W/θ۷xP0ϧt/#Dg|0^k/#| ^]}g'ܜ0( r Nb63?-M.m5B o6ObiO)c#<xtHswASZ"" "n O?“nNضf2FYM[1y~` z7f# Éeϩ 6n@v IDATpx1ߠ4]H;2V|<jna]V>[Snۼ1Jj%^`q_K>zD;`G`Ǫ`(qQ+DiJ+fNіs` @ZPGblaZ8]'l/qƪ6CcCֳ:ܐ9Y0N`tt!+n q6V!鄧O(pssGgy}7=@x 't(̔(IC`5+rsd aT@t $pmTXzkJA ݯ 6]mʉç³޼ٱ8/m'=zOn[<}r>zǏo no7nnp6cNKR{h+BK6r.>gdHk[weKDoseӽ3t5rG ?)(%RjfF"}Pr٢luYW^wBҶJ/t̍!yؤBW[n&u Og.Mo63l;4rujk̤ eX\!Q NXiՂwd7*Fz: <|s{'7k+</_g{Уoiͣ O'On-<9#>N÷+18=HB!|`JDEw\Vdis$bQjVl(%٧+@J  Q:~xIs1%4kܓ"pC\aaf6mQ!sfRC#n n}zƍeY_ݞ2OQYK:!Дl(^0=3}bN6bO><=ѭa٪񆛛 7N c`ia^Vߛ.|R5E=jB6mteJ4SsBl(@lYl',6 0ВdY*f9) C9JYWAS˜IZk(?ut/Yea0 軆qo"8RC;1C*-m"ch/.3(jA(l=5Ls4-k2 ˆJl79?L"%*ڞΥ-쵎6oj/dlct"f1p6nxwOvwg}ƤA86ܞN8N8n8nm03͋ċ8(ׯ9Q#F$C\G!!gR` yccQjǘ7Ž^~,)QN_^")ǻq'Q1p̱^oC)0|^hy~/h0) 5ʺRƾ!u;gSZǃV4 H@^ĉdx߷kjJH'] J+sBq3QPkQעUtvXZ]Bԩ<ƁYyױM($aF-7Ցvo\/=O%-nӎ-o6Pژ䠑3ѱNiSh*eшwrG&@LȌWj`"UĶeXp sVNX]r@c-ͽ-MNDȸA58֚k9/֧]Ӏg49msRn$=z^ S2?03cU*aRZTQ I3.SHn[ X,H2S:.uhb4Դ$/K/2i89nh_Qc{ڨT+nnD0▗"DQ,*m6{D߀Nt"Pku$j[Mr/iA٥,mF ;:WFO /u+v2\3Y(О|($u&C^b׭(2.^rlhuҋ $D8 |xAcIuW߶(L1%;*UqY{~D\@Lg]g=KeN^&Dݡ(\ [ohnr.ڗh7a VC[∜8~P3MqVb(A4=xiFsP)QI~_F4qyY^ْ;9t8x88/'ߦOpcJSgS3O]dԈh6p;dDU`YS(5B}YgȝYMM /+&AJ'dy|~oZhg-Ӭ_$pJə7Wt+|h*a[˪FKOc7Ed&}~s:M2= ^Ogrm8C !&r&nlȻ:3vfi~WSi4͐3?̩g2@ -Drzp^ w!`)`nV(L6ᖈrR86h#41_pxQc!r mOԚSWb%nLn` BE+M*xS@ёtV0Jem yE*NK!ʋSsY6>h+ͫ0"AH25:|Ѿ{^EEG3+9MwN@ q%9nsb)DNT*J( z0ŚO-= S _y4]սaTx `m[F.XaT ٫`UL\0,MгD JB}-aFUv٠bs.W~bRY]Ai Mg+gZ:| b6+aIۏ4aX$B. xmŖԔ mTZW.xP NLXXIe;y"8= կRE5&},7yZ`!Ip% ́)m4*m%xj#Iqsa }&3 t-:[ϴc4ޥPےd5k70\xu>T2fnA/^dD ǵ]+(#%k@7>p.IbӒdR}?mQB[R5+:9<=w9SY FvG1mW^KRvtӢjwfY%H^#R[N<\rH7OI0tw׮qpD XHy-x,Wb'N}'^:Vp8xx+L`&Z&F0Dq&WAk/#ܥ99N=0n5}psmtw8^6G0EG{k<ѥOxp$}!',e("vܥ% _`P4%ie WD1(5BDыYhTx.?<.7 צS{ɸG]T?kq̆#ڐ` 3'򘭲-'gӪ/" 86^fXI@9,#S Sދbqpu6|7 n7.hSj uIB+PBbA8٬М(I>,$ =m7X2-SE MJWWڀoZb&RLR@o\)m hM;fgUkeDx4LK ke.Ѧhyж+lT#b~`486PƠgaR)3m`&5ceK2zxrLqqt+-o)Fb64kH w.ad*%@,3#7JNBL 9 1yV-}_Y+SbTn_ETN4 $4R"5cv56HZٳYNuz _rXۜ 6o廿Kvn.L(Ki$XqMШQe4,Eӈ"G&]9LuGCۧi mS\שk5'ZmLatY14?^wZBm %1#+7 *? s$"!)'[3 A0#Otbt3U/+Ԇ/S]5}I$S/r]Mܞ7tZ \(QxudD*^gçZcEyQ!75M`蚎vƄ]&ާ`{JgjHZ?9k1\3l$eNRAI}iKۼWbe[e4TbTl#l(:+-ʤ"r0yUd%$W8!)| v!~p qiat(u-p#ğ):V=AniÊ0͓}nB\ToyuF&i \x-Bݛy#XRaauHm[Sgxv:b*4GʺeBo֢aQ^}bSXvϩGJYxvzjXp f6r!F(dCKlhTs Ni*Y`'Lar^Lv!(+"ʦ1hJڰ5P #?;)%uHSm@Ճ_ʽ!j.@(紨IfFb ,%nb2U@bռ<#1m5BZ+IԋteKs}ےj-% ے]F^.ޠWE]Bdjs4v-f Z]ї!!VO顪\]]0qwQ+z&D` GY:1鄩'}-Cvbopy)7 6lGn: 2#gZ: FX;لlZ"ъӀMrbA*KJf$e(U_k@dCb+ʼn0:h-C["|[4Ee +Õsp\#F.~ pwg,F=W:H3@͂Qjlx3Wĝ ]A8BimG0yFgK#fYDA A5G4.FFO)TIpgo:mvwzBT AD \UjcZ2W(f](CHǯ:Ry[isVk< S8]Zp3]Az`u.rmt";@kN2?(Azurh  +V`-^t RTW)E0i{y%7J@8՚C/\O0^xP\m[r:6'e2Ӱe%}\cĠu,Vz u1Ճg7%)AkLv0t7*$J6cF[xv'`+3Zwg#Jqv_vwAO)$~_g%lBZPRc+=Ƕpv*3ʼn{LkZȑ NKlum$Yz Z,HdETlá=ٳ,KJDK˪*`yܠ 8jo#l(mUj!֖Ttm^ psl6+YY< KQ00#pwtXci#K!>Pn:-PD,!֪̊uKmz n;k1QZ+woKph$msYՆʇ`d6)qU{k$uߍTpn8|UNmǼN`.: -\b֒z w^t= x/v`*;*t)_$"ֽ3-U0h"X]/[y4V@,[DșuiloO_C:ߪ{}GeN>3zm{K.a{BN΄Ǯ>tn ^cf,FkwۍFlZH=MPiN4fV&E" 6gdsqIJ"\f!.}UyX+3Cà+ՇѺ=֦V9 t F˓i]`5䐵 FU{jrjޖWudU'5*r&3ft2EZO%ƈ*&߳.ܺ ;wf $ڥ̱BH>8āV%/Xͦ:2ֶ*J|  T*SW6 Irt% I4K0M/Yi4 sf+Lɘ9/I/uK1`yTgk( %0=b>+8y5{w__f\ճVs~L˩LoXhCHNj D$k{<7kHH(M}+bR\^ 0DixR-2v0]A3H`L'>>2kq9DloM}$@ŸO10a S-< aCz"B[SgɁ[3Zꓫ `7bD QMXsCH#lzɴՠ =z+?s3 [!wBK)ɂ|q5b!((Y-Z%L#?5"S8ҟVVvzjmQ]XԼX(5k]1Z,'qRDt0iEf0ݼgC)ڹ#~a! kEHܰVy^S&Fsvn*Y"Wf 'N3lm3`FjSjosP%R] l +SSiC'P8-mCmo}RF/;k\?qi49- QwM:Y^PW)N8]GMÞk|a9JN )JGTt2jܧgA0| >AGhFOy(=i(s ?i4X֑]˞E[:IJcgصGG}*$=dpY:)IbEےv~;668TH1ӣ:+ _ej;JJ\s;v@[_{y$}1GtJeBW5g+]o a\պ4S`Q _/pk ^WP*-\̻eճHY,VNJl=^pb`d1 V"Zb;N e*]t m6cQXطh 5ϫj01=xEKTMOI( q|Jh:ծ?O%HWԢ MQ&9ኂ\MS3z@/_td‰ UPsOWz|u?I=\%ݏJ0mm M5PiE)2]wX5Q5zxK/a$r5|T@Xp'mnD'cֺ!N a[RT :YYdgfς_nUZ`yFݯe$CBX4ذq?Ysf4[̊0th4NTM ߨ~M~#lI #q Y`jqFl@#sBը5_Gb)j-Rg gլA J3ks<5%Es фQ)ۋ26dAT#"\ - ٌ{50|;Ch+F˨QM 1J'9jg^Wz+s4 |"2Pđ!S9\՚xzYjpc8i"ލ8s,銽[u [AuZv}%k?Rrx L/Тa,"|9٬ڮHczδ3GK=w98`/z$t RnKǰ|;^iq1?N5alA:+vncFR|zDƍft5 (EP\s4niX 36S=<7ɘS [I5do%KLU|*U/JtK/ "",Hfb1cC䨦eH]9 i埊˴v&ɮ b&:ON ./!sᕆOH:[EΝ>-A{>sh-Q Eb2ӖOO9 &73D(2v˫`6͐ܣe‹$.!PcB$Un3t{aԨ=p4&JMcR.9Xpط;aG)u؜m-ncʔ6i8H9M6$=7mÁcō>[1m39/TA^OFuo5=yWt*V.Tg^ 8MЋvOvjr^ Ej3+U훭pbnQHOE0F`OIs"*¼{݈7=Dl;yLl1YZ=I| 8 ^Qx)0</Ӗ2X6cۼΥ6D?Rl,ܮüej[W`Y e* >]up=#uRZ,ҩa447wE1$O mp[qV0iNiO4_< m /\5U0RO.V%so3 M3Ŕ¨8l7 9g.0d1P gEH% t[sQM6evlH1ExEb4 .`ʰ^B{Xk:땯׽*3贈kHbM-m}Ig8[hLG{H-e_WJg7Rp; &/97,E?32[q.NEHXV2Z!׿#lZ2Pl 0n6Tt9s},jv;7vX}lQml'i4b,ީF?i$mSU >&'hZB ;^@]1C)nܗ.s]vnnZET>Sx۶RkZ W\nRaEڄy)OḴ NZXÖeIh1eOtam//h92ړ|[.Z[mujfŸ'r]Ѷl 5r쓔>M%H!XsԎ QFm^,Zz Dc/$!e~I1x6<\ MIg2Z(u":an[`Pӡ['Y1)*) L5]EkCzQd&rijZ&x,,fi 5]ǬC˗`R=tӉAՅ$ef_d"XC&M 6qL34swtST˘>w}隓ڨ`@=p$ 3$[NjaBƻc^䶗TR4}q! 4uZJ)=0zXHwە[VmT6@Q\ NF zw(&ѹaPA e>4y;z;e E[bzޣKG۴5萞MKT!3UC JS*͝5[3]Rp2Qi/DVjBT/d >0*"(S"6geGCgÇFbTN]ee"bCDgjt+0o$@d-]̞WO `?7lXs$l2\Gsu'uVl[Y _2/) =NC!-JCӭAînbG'nZ[1RP"0_EŸe &)gݲ7zgQVp*n o~c1ʳs-{. by"4٩ ÏJ9{s֕G{ 㹝n٩4itJ<a+c`r˚*wp nA)kK#8Vk1J,+u6g )H$Ȁmejtk'<c!25TB ;TMDg0ܢDerc<,'yZgDo:kU 3Ha甌uw*.+ NlPȹ£6o.DsA$!nmɈf;0قjD2ܶŒF2>My!G?XCzdAI=T{"d70k84J?7_RՃYH3O U^٬tv% \S.2Ag6vX3l/@{oDz6ӫ6b)te, dfիa4J,O7y_-Sǐ)U\EgXi 癛A:N#EmNXl&Zg-Hv] rmٻqUe5Cv{7L^3(q]X"P;Wo_\%;̜E aѥْlm<(tQXo_>h^7Cf:iMy20Wt=*ՍOIg _܌$[ 6|/+Eny(yuZUJlJK%"RUEO/Zfմ7?]NW-XmKzme1Nn# 83U]k_;r@3l/|ӨkD˷gؼ@.J㻨H^YR59vn (yS$oN6pI6„{a6If^NOx)lLl v w0E Ve7ɥfU8g 9X@4rw;ٌy\'P`D<!%irP*ؽ{=+,FBͬVys1b5Dmw;Oj] tk`H(TiQ=zŷok w$?fOil  :HAx r%xLm?l, r7of11̔ :o2$]{GdB37)I-eSjI1][dq:Q|StӘL Ȓ"{*SYl^D{sM9[$r}uO$ o#ey&vd7F O?aW|Vcsy0#NIM>}JF]bzvDb+F3IBNIRQ m 7fd'>փ.a'ZxR+Xo/Qjeoriabxy iF z{/,\vuR^5$i󔞷 R_ƁULdsI B-`63ޔv`AmrK=0:jtks^@gЬd땯Eܾ\~q8&9eNjn(Q2- xfx#Hڍᩥ=͐rR@Lj3Sv:U 7b#2&G穲DZčMreEźNQeK]TV.chBk mɸm8~ ib5cE$_'77{/g x޼ 7QjdҏLZm䔶]Ľp;8rBʿ5Y;24@?:uS%PHW=ani^khHWNv4^V@j+6%ޒ4j.2׈su kLy "^0]@f~w;Y)]ޠf"c;Cs(o4mJ$`!7cѹc :|3C!O삈:lBx9exR;`4j v~iaHL"ś+i?m(/ɸH1J3oH+DЍ31 Lpr+˹8^Tze [HEMqFB6$ ϲy)`G$bP,Fܜ(a|LjXCFL )u}0ٶ )MأI!<Ŭ4$"1^s o^!ZƩi%`صP(:@jmjhdTٳGc7}5zdoLbP h# &#^(NY _܁ASGi8H*WDu e@ӛ[; ͢%š%%<% v"sDr4 P;wqkt0,/MƓple`Dt _Z!Q7ar RY_OLÄ*mׯ}/P4].i73S:uvtaEFۃ;t9 3Gzf?ŖLQ# qފE\հ)`Vʂ:~'aQu,["kTorU>y[#7#;=,ICH|)ɓafH,Ui*j9s!Ztc6"9Dr;Be*G&aK؆НR/wznj_Z+}q$[ Fń͏5B%4l—ivT:s׵w38^Ȋxz8S+Ok|6'9ٯC+bwo:zVwN\i>EeyO8\Jȍl%X&"%WjIa U0, Jkj Y)9ROg5URDLfDJlfSfJJ=L8%+F/P֎TajZelpX׈a)цsΥɉC3,A|zkH+Պ^-典"/Z}\A;0O7ƒ `$FMzY P)Hl[nEiK\#k0F?Il:/!ǽ;њR~u=l9X8 ;SNs.z,\o?mwN"8R--fqs+;J?hIm|HkFOkbњ8R7_!r ͊ظ)7 &'tE+m[1/ܢG܌⮎WD ]1Z~O:?[T=Z3C|6n꺈ٹ vEy d7} ],"U}:6G%4δowKM؞;EgmFZ")I8+& 6%['i.%IUoo.Dꯊ5h=-Nᦉ]bá8zQlcq`cD'pܔH ͪ0142SAȂiAJ*_ִ 8Uim&w6aq]W?4F\*lފwlk/^0 %G oJS׿ Vֆ<ᆘ 3NhI- 6=H)["q0Oo30Ȉd3zlt~*ffn.\>.ѕL ݝ3: B$'Xi-@k$y;cDFNJZ 6jrV dO)`PX޷E K'{53UL*;y+=6S|"_5M .~MxY4/?BKCpDw{kŽꄎ/&͢vGdCł,4YlJxn=Cw9B!Cxr5=wQ{Eì)#'h{1DXO;i[.qH.#Oϔ`YY(u_aVzx$+9n)ԭo k'an'$:s;I zzڶw h[[mVoMs2'+Ek ƳغJKX ߢ\ >r\oa.u Ӟq]74oqKȀڐ8nrk7wv_֘ÙfQZ8$%5(9#c,ZI4[[q8iUzUֳp] B6ͅ$J$KaZ>I'O(]ɱ;>-/t 0m.WuUM+\ؘݑKײ/eĔƷku?iTpq$#iYKI Ej4p،sB3LY5z+:^*uX$]D|+oq ;dKz+q&W-$f'1p2{!]֠ܤ:r|bk?uh_ @ i-lYRKٌЙ' 5{\Tbjc kI?P,97j wP>iN 07V2?ܬ^ Z=lBͧðs "a(^xM<\Ջ >)3K=ɋmM#>iX8/Q9geP$dxI6T}~&'ߢ_ P|2|w ĭjs_?:˱FAHԱv˔icdgQ"EN̹o Hy+!ev+̐丨`Dn`r6#$ퟱ&)GF|\JF}bh͈=ʂb8W]f^`_Rl,_S¥)hhrTqw dqVVeB7{|a٪zpC˖Nz^,.rigNRs^syr{vqO&fW 7uͥρ{e彞b:res+2U}FBm`} & c3.S؉|JuyD$.g(cg֪mbMWڀmO#Y℄ #z<(6vv2Dk͉+3;qT\붹wKt/GF0Xz:$KӶEl؆[:FI!ݶ w2|x=gȼ/korϺfZI*iNN;+K~V76. BeH'R "Yp;fXW Rr.r!nd'$t9kef3#T$}u$ M<8(7\kaFJ& )݈v&zu񘙾v:SWXy- 4^muU<ҰG}D'Z'w8ZV:|F+#(jA%TSp__!@&-:3+>i冻$|;Cjk7'"ZP9/y3XY V[9똑WUm) nI=ev f'Ǒy=Q6٣cXqzRy{9Zm<-odz_޷bq:HV$-@$/3p@V>Bȋф/$1]9q= Gc6}4򂗖I,,o&Bu 6FاOӢL _WX\l~ovR*_>~=iN7φUiWPzhgҹIqٌQvq|=׬ق)U0vc痌M*LWT.RqpRE;}93~!6E8v7t8g W>2X_PPV j%br%D[5sdә4""Ĉb߮%+I \4,)*ܒQ"ba=Q6mFr59txMVxݍ@ 8j IDAT1?cH7-{|!.1eq:DK?kQF#PJE+*yPn`^~B4@F-{NEiAR:KK7>B-W=pi3ܒJuO~9H>4VzM-]b*O{ZqNēWSi3AI-׾̛|_l1E\l{jѩr'M)0`F7ڷ+$C#1E|69(ʹϰ51]7x8ڀ,Vo>'+/m2mJMHwo>̦/LQ [PXD/y* 8o@ߒ<$aT ZsA, zqT!8' sȵ'k'1ŐCv 63i)8\%G.g(nSV" jA Ө[/(yޚbOdN,+QQ!s;EJ3zU6W@mI]q\Ȣ>y(CJWi ,$V?2,/ɘ Wƫ`29Kki 5P1z-jR1 ZSSؤҚ,::`y49ZAJ6ªFK==m LiAKG"عE0ݛcV9IPu4.27mKs7Qפ ПgtPPDAwӭx0Î $ļX|Ϙ/8Qewc Y,ߎH,M=ev)z@d6C9U&ITס0EԧMM;_jK=`ʔԯ4--Q$:i3U e9‚2wC38yJyH%dX;8wzIܳ4&"!sZ70L\`_Ǟ;1.\0.uy ,GʩtTϺpvYj`yGz(<ݧYuo[7vYu"fZTn3ؙf#tQjUM۶^@9#ÚisY\;VQRY'gJN~AI~,lN~w0sN`֤XdAEfynQ^\%$}smyvM㜙I)2OJfk=>w\IĻHN&)+#<~?TxkǑMxx|q<@Ԛ:U|&tq`Ea-`iA-h|$I':Yւ9Rcqghy1A3tk?!kU,Yo<;l<5zHa[C- ^pN4k=9BalB KE ^l"^By{ VJMcF"ؕ fɦ 1*hekMs)hZ$Ii?ÙMH 5/-QnZr!eU:.\1~e.aӿ%: myͧN]\ÅʏȌ//v"ԑ O1ZH F(dK%\m/wVTidXmG͹@e>jyRqS`Qٵլ(ͻuwDK8B|A,MnNIyq A-o8u<|| E␁~3sGs7!/!5d)^2J+qt47"׵‹_Tpbxl>+G!OLѡ<Xm͆‹䞖ͷrfWeSztui.nv a"/wn}4­|IJSYby_n[+<ĸ(ͅc ;\?<>/b p]5Ĭ3Ik )bLL&AJc,4ř,NnWQ@u=nË %.U5g'-\K(ce5`mЬє@ݦeUZ3ؓR u7ѐ)FqLpREm(jCv[&SYoxW[SxZ̹S0Lkmp9\f?V9 KR4+Ӻ&DKٽ :e m0oJLOX.^N5 a:u?;?{E#V\x|oW<kPgn;腥dHu(g41p/jwE!Jl?ݞb-&7-2ԘBbū5͛=N5-TI N!L' SqlX&"Raga~@/&٧Mrb=n6} v^׼{y|n-d,PZaR{,[)F{X[;t_S9CT) b I3ՙfswA5wuv; eD0_Aʺ&6pKGJR[%V*./_yHaW@M'wMQuY-yr扡i($:I. # /cL#z@6/D䚞_{.fcb`%>pkjۅ =x=!j٭s=AukT1Ù-WEY_. ͋TB? p:d܉ЦNGVz'qJrԴ U8ސ.xxx P~o<$5'+S:ф|jު4NY9/7j2M2Zl]o{ |?VAW(o}s9Q{7! `z|gȓ7Q/-<;c%trH;DNWe`Iݰ*5ByvHv\b1W2vuSI!4?¾]n]cq*"Q@ImyJ7A_ _bnmLw2y\aPRilW$Ӿ7$qB1_h~ 0瓳9a+³Sr<Ʀ c^ob8 *)–}B]=l'%3Gl['{z =A>79@Sx)u0;RWo݅q8lw̰qyIhm/k(rѽ|XRrZ7b!MH)ZSZS8 Nj6@ X3h+%ѺҾ})+,;(z +EFۜd)=ٵg'mo|L%gq`nciuiȑ$ؠ$WuT=Ż`8~k )fߒiwWI :4g #~)n_7-ߑ ܾgIU|kry\>}O*<7IT4'\De6 lt8lamĞt[B8D:/:ͬu#}B!2Ȇ/6 =ӵ-\`gf2(+SZ« 8lw"U ݢ5MR”S7SaIu]j-˳d]unncэ @8f[  #Bv L8 ~gk "Yn,=#V l^ËL\ވ\p(0 ߭vGH;q4(mgIt֊OsRHxfjv\ kZ1/̝C();;/ڽ/C<ҶKh÷2 x wHhA!j{,V39:#.)hڼ @!"I+[eoԼסc[Bu{EX7䶖Jo~-6l5aTYpn:5m:g]П (??Og8n~xG[7 Lh5$iIRwь;4vQDmʜ:uRI⓺,mQSEEй{c Л.WzV(#3ľEmT;÷kҡH'8+JSzAtz:Yv'3.abM{yq4{*2r=y=EsƼ1e(Ma?Dm[[m_0/<'=c[ϮFDjT8Z4»w1>i(tLy?u` F-k Yy$Z)ݵRD-̪rd{=BjtaȵIWE|Xh`޶SSul4- t>[x4߽זxL߂Sipgp <'›BC{vXt+1c<= 3(>NkMW Y`b9:eV4yuLpWL?<2>8 2!:¬xY-0|H71wOL!0||ŗ/Jwf̉SI8T 3Vo,)٫ZYhlPԵ4$^kROb`= 6IE N. -6D G&MCeYԒl{gxi)[ȸbvƊxDu9 8gelXn 3)'qm>WNL[Zؒg2Ns'˓,M-ƒXic@e< ވJIXLU4vՁfP)~76cFƷVDY+U_uVX[nsRԧ,ll9~2b%RkljۛCL4QB-IE+|V<:PEȈ|݀?Ȼ38zVocTY^x)2 VuU:员T!P7DVrئ0lm%XB1Av](ʙn. nԫÃwDg<. I ĢX1K\&|}: x&x*X~XZP=b7X,T*@Dka({+ڕ .<\ 2.?p5J8-\p[[Pc#6PA؋#ti"M.btnҩI Qzv B@qtJTLvP(Zfd#VWvD%t$5Ba2.SNu=kYk{HPeT CGt!c\0. f<,LXCDZpſHIϏO  _ A6`y yRJ)@I VB_Jx`{ٔ@Z)7RB ju`JGz jM ӓo3'>/]J $ػB29gyQw -z^i_wU ѐ|*CuW:ԡqt1VW%4&< ITV\=kVqy=޽'\&f_6IJf8 lZ.q tVk|1 Zqx8mP:Fl&W"!v mDCH\^{GV5F-֚$e4ZѬ&=,7˶CR_?}>:[5Kl*9HU>}iD[dדO~4P#ʞ>6}e[Mx vs\a^uj$Nmy*S0m,Dt=%}QnsluۭG+UN '5mŸ&˨']DV֩ݜBn*5Gtݠ/u5r#=V'g'CPe`+Ȗg$9h_@t&r*kP~*/vgr> fd\[;!0|UڰxcD߻"Zezl1wqնZ!nLo*mFt\8 *B`ĄGr MIDAT?ӯ-?^H|x)\b.c.O)jg)]&J$ľR3kk^CZ=?=N@)K¾ڐ!ާs6hl#u9ƕ[{s2Z!;="l]z疮Nɉ{-n# N#{~dd[%db`>}TrQyBHYQ1%~oQR[MCu811~ p%ݵaо 嵻+FG߼;U A]N8Mзo| /mD8O<8eD;/`:?hʛA\Qg۱Neރ{-"rs.3-"7)Pn:M{|+S a?i*#|1OIbeBS l s1b~[NV՛m@)B){J;!϶m31^~'^O;HY^eAm<9w'wos|#6l~>3O7nU^CmNJ[&w>#Z045ǸǮ6`bi3;uS \|3n7wV=uԹ9I7]_-^9#p98ķQEvY F_\s_W!\}$6~>;5{൯? LIENDB`kraft-1.2.2/styles/pics/sticky_note.png000066400000000000000000000263671467704360200201740ustar00rootroot00000000000000PNG  IHDR/E!bKGD pHYs  tIME 0xiTXtCommentCreated with GIMPd.e IDATx}yeWY;{PS*y"1B2 Q\Цmn h+6.1`;D"KEW TU*U7ws?>ýJ kzN{M"qUxj@Sf|LBb|cQ{^`F`_ysк h\dKupOps5bFG]nx.Р-<`^5^' 3 ?,8; 'G׀x.<%;"b{pi>{! h=8?`n?pW |{;~0vvęұǿ}߯ ܼOt_bo[a?p ;x7Aݿ$ 7n~T'/|4<||7^|˵xۻz'ᝑu+?/3 oCԋoo8pomxow':N@"?>td1ț!nR >. L@ r v*n5M>v .`ؙwapr1j eCGҗb_c/e7!{G=Z#{w`8Gk+ c'wܚfVkǮ'Kw/pذ v4,im0s[JZg kH=]_E2t9͇=.؍ sO?X{D~ 7,| HY_ȭrsnƋ~Un[o~}ⷿpo?G{ׇÛ-0_|g=g\+G>i\fthiڎ`˺FߙsFDH۲9$)hYdMİ1r-˹aas2l sh?ie*yp~,U"KvFj6 RrJ ڪa+S RîdF:K 9Y U8ZцRR %DD,kPА"b@߇4x$x&D.wV`2=u4U\w͓+.@2 =_5x {Zw|'^kƓ}S7~?7sOmzf .o4^䋭AwllFn4WY&60F7Lmê͝i5ưѝKsMq.wvȇ6KQ'$,ܙsgI1RM& ˓Vj]é1Jդ\r' Ucu̝Ebֺ4W3 QQ5jM9ډU-8%iL  P(#ǩ0 &{<އL;.. (B[- W{x +,37욉5{o~]-wb0=.91V\Y7 [c!΁f^fPI) j,L!i $("ZkBzmK}[`p^_=):-5yssuq>)~ǿSb8VuZ75Dn8>6;\#gz0rFnxVɴavμ_Hf6hKTfgR48c8((j BԿgU_'˦G89ī_<LPJ&aBIN'Ϫ };>sHIrQBۉw|bsFMGbp8'? W`:X6'{I?jyKiTٽh~lޏ@kE/Ns6o}@#}Pyחs _}tI -rg;ե]M RFn N?~<۳6%ӈ/*Q3ג;>rxK%BLK DсH;M2; 4*آ cF=?'\z=sgZ?}HlFr9|omC$eD:$E"KS]Gh{m|6,8>iqj:hVo#1h锨jCD\" +:7rvB`sVD[F_H5{< y3ۧ)hXIRk[HD%D99_5F|{EA+)!99ܒbb@ -Xiv©qlx@lhC%k3<L*۫k\"o94с "xoJ]'Glf0-#v^.q[ĶkQek>- ^.b}>ƿ!dTEfN: |4vhOSdq4"$k_v㒢dHQ9%9eSę-Q$IQ |Bx™M_tΒW@A{=o ^[ V' awxtpԑV 9k!h3M}6h v`}pn 4ՙC|"'y]X3K"D _@Sqk|[;`v}Ոv~?EEfaK :$֙)جDyr~{+Xa|Ja=v_N$pn` emę ܹs ~xT=@1xb d:gto @Ufa Z;7R$O nbtv|pb#kNsWxj9J?q;4 Rю#Ery͋U NV|)G> ]ß 7<Mr"ҧ\ d1Js`.'i*;w.Ca~ r&60v^FzM/aMku9.L鵣]}Ԏ𿩓7w\{^`u9Ω?0-^sE|?>3=m.ד͈۶8(,< D^d?pqX#&C= #Ab\'L' }x3 uH[rhַܰ.C IqHnkZ; ;<%9ߛ{28\CO}}[qV)Y66+Z]Ͱ+aZ冽/g > &y@]ز2Ho@6FQ{πNFn}p0YT>k|r-]Ro^y=k nBŖU|{~\=+|#kF!0t 2A0#/4m""ۃrh>uv0S:f>raDrϐoZhn|޷mA𰫎lΘG.+'r>~B8?}2|j];np8-6K<1lX{jKF&:m\=xB{g_eDWכ`!=6{ G#ێ{S K -"N"D}Z EK/7^ ײ8~LkIc蓐W݄b3{FA%@woSpPĒlgC6H[KtZރs>p#',bO\-2Y\l':Q|qe}V:\rkqtkzD┚yV6p$Xv NؖLav'bG8/g_^ֳڤ\܄˰߉?0:FXnzؽwoYq*ɰuuB$cc^ VpUκ#t92F]5ڿ<$Agqh4wccy?FeSm~5W;|tV2J==<WsPi[إfOfg%]w-vg/,.d.Q*l&hjN]]6@\9O`0C5b@prұ T’_W  bn/z9N=JG&S[cBM#)$!Qό%Eqs0z$\w;*&MZ . sKW{rG<&}~4xm\TU 2DlY:f4/f=dSȆмkQ=0&<.t\h4ˆ]Ñ.a%rM$ "f螜ƤhC{t iB4о^8j~)Ui$4N~Hs87ipQB#Yl47rNB4}},G=""bv|ATA?lApU,+q1YDlt4gl'?SFѫmBto<"b1t6SE!O閩$\wJ)JJ 9ܸf$&M>?5'ŶQGD"rH4IxUma2M,/13h&YJʇw[*Z& ]FDDH:nWlCF(*MLEI Z&IL+m?NpEB&F#"fV*3⋮7=Ɋh GD,RlXI;-|p/ X䱅.>-li2"bLa7C_~~ rTZ`1shQdosE]}H5Yo}YTZ{XI.z#B\ JH(&3ab0/oCb*PBX,GGD($5=\-Ozkಔ; ]4Q{GD̤4l..9TMbE\5V|Q ]b[9s Tɇb5YlƈSs pmj5~2%U4ՋN3h;Z6s3S[QeCMؾ(R1[> M2U3bwVW| AH1]1C"5(f!>5]{V{-n2PUrm1Kp4Mڳ0݌I.ŠUe@bjDLŠr4lrhWe1}[a?hc W(E1s6:rF۳i̛ b$Te+]RVy!esYA2P|GD2gc[nAjK-7V1""b|pi6rJ;3 z-V=jYRvs$X>|tSy@)춈_~p|({5Ƙj%&c.zDlB_pLp{\IP)E|ؘ"5:wU3o/8f,FDDY1Ʊ^.(eO $&DD̤n6ngwڊAusBWP>xDLjp8wF1𒡪wb?DDD̖|n{vL'CcX6['8؞wE9| U#"fưuleWH[×{G9@M#];Y_=9o[T7=ckFD̜dKi \vu[\֋mP-K::)&̤VE$i5=x|F)P4ƀU7l d>s`m}e6gܨ[yDlɱ4eR5dhSm!9\iwwTӅSfL Ӽsc="b&}p]G.YM!{v x=mB)6dʢ*!DM T{,fy"'? Ȋ)2(Dը#"fRgQixrym ?\-w&#A3;"bF);:# v⽿vfa3٪3c R埜r$ֺ ,$xDČ83\oO~ZYݿVD 1{>fJM%J+Ld2D="bn~i qp?2OkkdSDĬ*6. |n3 Pþ"h30[O0 z $&K#"f͹9Wo^G!1Fш51ȓApQ$7<ܬ KHh쎈EzS0wqѹo|;Ա('7)"40ԣ1>xYiX\ʇx4S-K$U1$Wę7>癛 ^Y_mRJ "bF 1n$ 6S NHU+VP!""bаn~;G7\UypAXYI. ⣍1{ yN- +G9ȖcB2< }pT3Fo 59e|r<۬˜ڮ&"RB#"f.P l&xHs)ׂ%Tz&ygecCX&]Mt*" G 쎈Y#=Sy{vp4]P0CAyD̢mEI,Z n O8}5s#鴤c>2Jة^1k&:&U;DgUeE2 }jDDĬ[Quqq>y3~XDXmĆQ\O}[vUE}0OKLrY]2?OTl"Kp3`͇*N~,W3!F7=fuyoLpkl጗I1>xDL6omfK(*PZ4 OIDATTXƒMĥy6d4޷ħy-NSE|SUT9{&[<*O} y 8?$]Wu 'oB@gk=Rǟn@Þz@z9&Oٖ'on}a\4D ~R`40 @(HUВp4HhhHhHw0Z`0Dү_q[7܊ FkhHuQ@u&ydb2Ș [jD fNכ$$k~_e!>H k&Gš[gME_Ô;RZ;ߛ[CJbpKq'<~+Mqoi{-j3R_ "$ HRjTR\P| g(*UP)އvP2\:M0$+c-<9õ˫5 v2P) B <*FQH*EaFUP<DS*l/|x{w܁'48t$)j)I6_HϢ IG A`2rLXon`NC^{ NubDu("# ?0I4}wz!^쥬aPt(waudDp4~N4E\ho\vcP"2q5~LH& RQ-`^L1qFT& re"+JvJ5vVRn]xz[o!nșE=?R 䣲׫{6G bD&"W HD V[\֗}76k O 0d :x1RZR9RK5' H*!0’t"jTVZGCDƺMPE{J⥧!2g־dLޚ`'EAP2Cz"` }C(31ƑÑ6㓾gT }"T@ RH;ƅ:rvoq#` 8]Ndڰ|SºFv" Ԝ˪>JaN5fzRNl}H-[ Ax{x1fJJubdjnZTlP!;юc#h2hfψ9pr*D,f'C&RΨ~s`lƘh-ͤLi/U )h)\ Cx$@@IbUsCxᓀ|j5 9>uVH9&4h*=ͪ<>(B/I-ae-SY}Dotmd2Y5\h_PjKPS 1qRos| 69DBZ~V-ڵY8zxjCN6=Jn:W܍ 1[|^VpX\aOFԷ ;.MOy׸i<ʓAM:+ G$su%v.pLIrCX`f0G:  kvH!ʆT8JTl5k(yk,C*9js):\5Tb\:+cL"T}&"K_ jEK֏ԨR6I=,mV|Lu|yݥI\;N\1s du'I SbT] iւM9Ab$J(OurN)$XaYM *`'U+֕̄Ԧ1|:QIb8'"M@lHEN [Лnh.+h+ʸ5DuŽͳTؠ)Aq_AX͝v_I#\B Mt$Awc&R/dU1,Uy Ԥ.\ǫYV1b(T 1˷ih>j}`t"i56kIq:/@XmDZF !@!uz IbG6A`7S$˝H.b֍1J Ї %fe|- q[#9&L54BcTq/oXK I^uhB`,QP_HM3FoK`m޵Zƈ2? 㢘˄[RLMr7X^rPub꧜ UDYAO%˫+dI9'ȹ;fuD $cV̄rgftyJ]XbdžBJ)2qf" ݵ]?B 5ȼ"I 4KJBS4O2 Nfc.26ZԱ)*)w : GB0B7daV&?Oz7yέԚ  MUK{@訐 [@U1ͧ|T~U94+8u0&RZe $\ZL H iR,殺I x0Md(;N}օ7 #include #include #include #include "testconfig.h" #include "kraftdb.h" #include "attribute.h" #include "dbids.h" void init_test_db() { const QString dbName("__test.db"); QDir sourceDir(TESTS_PATH); sourceDir.cdUp(); const QByteArray ba {sourceDir.absolutePath().toLatin1()}; qputenv("KRAFT_HOME", ba); QFile::remove(dbName); KraftDB::self()->dbConnect("QSQLITE", dbName, QString(), QString(), QString()); SqlCommandList sqls = KraftDB::self()->parseCommandFile("5_dbmigrate.sql"); QVERIFY(sqls.size() > 0); KraftDB::self()->processSqlCommands(sqls); sqls = KraftDB::self()->parseCommandFile("10_dbmigrate.sql"); KraftDB::self()->processSqlCommands(sqls); sqls = KraftDB::self()->parseCommandFile("11_dbmigrate.sql"); KraftDB::self()->processSqlCommands(sqls); } class T_Attributes : public QObject { Q_OBJECT private slots: void initTestCase() { init_test_db(); } void cleanupTestCase() { const QString dbName("__test.db"); QDir sourceDir(TESTS_PATH); sourceDir.cdUp(); Q_ASSERT(QFile::remove(dbName)); } void checkTablesExist() { const QStringList attribCols{"id", "hostObject", "hostId", "name", "valueIsList", "relationTable", "relationIDColumn", "relationStringColumn"}; QVERIFY(KraftDB::self()->checkTableExistsSqlite("attributes", attribCols)); const QStringList colsAttribValues{"id", "attributeId", "value"}; QVERIFY(KraftDB::self()->checkTableExistsSqlite("attributeValues", colsAttribValues)); } void simple1() { Attribute att = makeAtt("Test", "foo"); QVERIFY(att.name() == QStringLiteral("Test")); QVERIFY(att.value().toString() == QStringLiteral("foo")); } void copyAttribute() { Attribute att = makeAtt("Test", "foo"); Attribute att2 = att; QVERIFY(att2.name() == QStringLiteral("Test")); QVERIFY(att2.value().toString() == QStringLiteral("foo")); } void saveAndLoadAttribs() { const QString host {"testhost"}; AttributeMap map(host); Attribute att1 = makeAtt("Test", "foo"); Attribute att2 = makeAtt("Test2", "foobar"); map[att1.name()] = att1; map[att2.name()] = att2; dbID id(342); map.save(id); AttributeMap m2(host); m2.load(id); QVERIFY(m2.contains(att1.name())); QVERIFY(m2.contains(att2.name())); } void listValues() { const QString host {"listtest"}; AttributeMap map(host); { Attribute att1 = makeAtt("Test", "foo"); att1.setListValue(true); const QStringList li1 {"foo", "bar", "baz"}; att1.setValue(QVariant(li1)); map[att1.name()] = att1; } Attribute att2 = makeAtt("Test2", "foobar"); att2.setListValue(true); const QStringList li2 {"foo", "bar", "baz"}; att2.setValue(QVariant(li2)); map[att2.name()] = att2; // --- save dbID id(344); map.save(id); // --- and load again AttributeMap m2(host); m2.load(id); QVERIFY(m2.contains("Test")); QVERIFY(m2.contains(att2.name())); Attribute a3 = m2["Test2"]; const QStringList li = a3.value().toStringList(); QVERIFY(li.contains("foo")); QVERIFY(li.contains("bar")); QVERIFY(li.contains("baz")); } private: Attribute makeAtt(const QString& name, const QString& val) { Attribute att(name); att.setValue(val); att.setPersistant(true); att.setListValue(false); return att; } }; QTEST_MAIN(T_Attributes) #include "t_attributes.moc" kraft-1.2.2/tests/t_defaultprovider.cpp000066400000000000000000000111131467704360200202210ustar00rootroot00000000000000#include #include #include #include #include #include "defaultprovider.h" namespace { void createTestFile( const QString& testFile, const QString& content = QString()) { QString c {content}; if (c.isEmpty() ) { c = QLatin1String("This is a super fancy test file"); } QFile file(testFile); QVERIFY (file.open(QIODevice::WriteOnly)); { QTextStream stream(&file); stream << c << endl; } } } class T_Defaultprovider: public QObject { Q_OBJECT private: QString _systemDir; private slots: void initTestCase() { const QStringList dirs = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation); const QString home = QDir::homePath(); const QString appName = qAppName(); const QString testDir = QString("%1/.local/share/%2").arg(home).arg(appName); int indx = dirs.indexOf(testDir); QVERIFY(indx > -1); _systemDir = dirs.at(indx); QDir td(_systemDir + "/styles"); if (!td.exists()) td.mkpath(td.path()); QVERIFY(td.exists()); } void cleanupTestCase() { QDir td(_systemDir); QVERIFY(td.removeRecursively()); } void testLocateFileSytemPath() { QVERIFY(!_systemDir.isEmpty()); // KRAFT_HOME has to be empty for this check const QString kraftHome = QString::fromUtf8(qgetenv( "KRAFT_HOME" )); QVERIFY(kraftHome.isEmpty()); // first, check if it is installed in the system const QString fullTestFile = QString("%1/styles/docoverview.css").arg(_systemDir); createTestFile(fullTestFile); QVERIFY(QFile::exists(fullTestFile)); const QString foundFile = DefaultProvider::self()->locateFile("styles/docoverview.css"); QCOMPARE(foundFile, fullTestFile); const QString noExistFile = DefaultProvider::self()->locateFile("styles/nothere"); QVERIFY(noExistFile.isEmpty()); const QString noExistFile2 = DefaultProvider::self()->locateFile("nostyles/docoverview.css"); QVERIFY(noExistFile2.isEmpty()); } // This test sets the environment var KRAFT_HOME to a dir under the systemDir, // and checks if the filename is returned correctly. void testLocateWithKraftHome() { QVERIFY(!_systemDir.isEmpty()); const QString fullTestFile = QString("%1/krafthome/mydir/kraftfile").arg(_systemDir); QDir td(QString("%1/krafthome/mydir").arg(_systemDir)); if (!td.exists()) { td.mkpath(td.path()); } QVERIFY(td.exists()); createTestFile(fullTestFile); // KRAFT_HOME should be empty for this check const QString kraftHome = QString::fromUtf8(qgetenv( "KRAFT_HOME" )); QVERIFY(kraftHome.isEmpty()); QByteArray kh {_systemDir.toUtf8()}; kh.append("/krafthome"); qputenv("KRAFT_HOME", kh); const QString foundFile = DefaultProvider::self()->locateFile("mydir/kraftfile"); QCOMPARE(foundFile, fullTestFile); const QString noExistFile = DefaultProvider::self()->locateFile("mydir/nothere"); QVERIFY(noExistFile.isEmpty()); const QString noExistFile2 = DefaultProvider::self()->locateFile("nomydir/kraftfile"); QVERIFY(noExistFile2.isEmpty()); qunsetenv("KRAFT_HOME"); } // test relative to the app dir void testLocateRelative() { QDir::setCurrent(QCoreApplication::applicationDirPath()); // Is it possible to create a kraft-dir ? QFileInfo fi("../share"); if (!fi.exists()) { const QString mydir{"../share/kraft/mydir"}; QDir td(mydir); const QString abso = td.absolutePath(); QVERIFY(td.mkpath(abso)); const QString fullTestFile = QString("%1/kraftfile").arg(abso); createTestFile(fullTestFile); QFileInfo fi(fullTestFile); const QString foundFile = DefaultProvider::self()->locateFile("mydir/kraftfile"); QCOMPARE(foundFile, fi.canonicalFilePath()); const QString noExistFile = DefaultProvider::self()->locateFile("mydir/nothere"); QVERIFY(noExistFile.isEmpty()); const QString noExistFile2 = DefaultProvider::self()->locateFile("nomydir/kraftfile"); QVERIFY(noExistFile2.isEmpty()); QVERIFY(fi.dir().removeRecursively()); } else { qDebug() << "Skipped relative path test, directory share exists."; } } }; QTEST_MAIN(T_Defaultprovider) #include "t_defaultprovider.moc" kraft-1.2.2/tests/t_doctype.cpp000066400000000000000000000143211467704360200164750ustar00rootroot00000000000000#include #include #include #include #include "testconfig.h" #include "doctype.h" #include "kraftdb.h" #include "sql_states.h" void init_test_db() { const QString dbName("__test.db"); QDir sourceDir(TESTS_PATH); sourceDir.cdUp(); const QByteArray ba {sourceDir.absolutePath().toLatin1()}; qputenv("KRAFT_HOME", ba); QFile::remove(dbName); KraftDB::self()->dbConnect("QSQLITE", dbName, QString(), QString(), QString()); SqlCommandList sqls = KraftDB::self()->parseCommandFile("5_dbmigrate.sql"); QVERIFY(sqls.size() > 0); KraftDB::self()->processSqlCommands(sqls); // modify the initial attributes tables sqls = KraftDB::self()->parseCommandFile("10_dbmigrate.sql"); KraftDB::self()->processSqlCommands(sqls); // get the followers into the database sqls = KraftDB::self()->parseCommandFile("8_dbmigrate.sql"); KraftDB::self()->processSqlCommands(sqls); } class T_DocType : public QObject { Q_OBJECT private slots: void initTestCase() { init_test_db(); } void checkTablesExist() { const QStringList attribCols{"id", "hostObject", "hostId", "name", "valueIsList", "relationTable", "relationIDColumn", "relationStringColumn"}; QVERIFY(KraftDB::self()->checkTableExistsSqlite("attributes", attribCols)); const QStringList attribColsDt{"docTypeID", "name"}; QVERIFY(KraftDB::self()->checkTableExistsSqlite("DocTypes", attribColsDt)); const QStringList colsAttribValues{"id", "attributeId", "value"}; QVERIFY(KraftDB::self()->checkTableExistsSqlite("attributeValues", colsAttribValues)); } void checkAll() { QStringList allDts = DocType::allLocalised(); for( const QString& s : allDts ) { qDebug() << "** " << s; } QVERIFY(allDts.count() > 2); _docTypeName = allDts.at(1); } void loadADt() { qDebug() << "Loading doctype" << _docTypeName; DocType dt(_docTypeName); QVERIFY( dt.name() == _docTypeName); QVERIFY( dt.name() == QLatin1String("Angebot")); QVERIFY( dt.allowAlternative()); QVERIFY( dt.allowDemand()); } void checkFollowers() { DocType dt(_docTypeName); QStringList f = dt.follower(); QVERIFY(f.contains("Rechnung")); } void createNewDoctype() { QStringList f; f.append("Angebot"); f.append("Rechnung"); DocType dt( "Test" ); dt.setAttribute("myattrib", "Kraft"); dt.setMergeIdent("2"); dt.save(); int num = dt.setAllFollowers(f); QVERIFY(2 == num ); } void readNewDoctype() { DocType dt("Test"); QVERIFY(dt.mergeIdent() == "2"); QVERIFY(dt.name() == "Test"); QVERIFY(! dt.allowAlternative()); QStringList li = dt.follower(); QVERIFY( li.size() == 2 ); QVERIFY( li.contains("Angebot")); QVERIFY( li.indexOf("Angebot") == 0 ); QVERIFY( li.indexOf("Rechnung") == 1 ); } void addAFollower() { DocType dt("Test"); QStringList li = dt.follower(); QVERIFY(li.size() == 2); li.append("Offer"); int num = dt.setAllFollowers(li); qDebug() << "oo " << num; QVERIFY(1 == num); QVERIFY( li.contains("Angebot")); QVERIFY( li.contains("Rechnung")); QVERIFY( li.contains("Offer")); } void checkVariableReplacement() { DocType dt("Test"); dt.setIdentTemplate("FOO-%y-%w-%d-%i"); QString re = dt.generateDocumentIdent(QDate(2020, 01,23), "addressUID", 122, 0); QCOMPARE(re, QStringLiteral("FOO-2020-4-23-122")); dt.setIdentTemplate("FOO-%y-%ww-%d-%i"); re = dt.generateDocumentIdent(QDate(2020, 01,23), "addressUID", 122, 0); QCOMPARE(re, QStringLiteral("FOO-2020-04-23-122")); // the id can change dt.setIdentTemplate("FOO-%y-%ww-%d-%iiiii"); re = dt.generateDocumentIdent(QDate(2020, 01,23), "addressUID", 122, 0); QCOMPARE(re, QStringLiteral("FOO-2020-04-23-00122")); // the id can change dt.setIdentTemplate("FOO-%y-%ww-%d-%iiii"); re = dt.generateDocumentIdent(QDate(2020, 01,23), "addressUID", 122, 0); QCOMPARE(re, QStringLiteral("FOO-2020-04-23-0122")); // the id can change dt.setIdentTemplate("FOO-%y-%ww-%d-%iii"); re = dt.generateDocumentIdent(QDate(2020, 01,23), "addressUID", 122, 0); QCOMPARE(re, QStringLiteral("FOO-2020-04-23-122")); // the id can change dt.setIdentTemplate("FOO-%y-%ww-%d-%ii"); re = dt.generateDocumentIdent(QDate(2020, 01,23), "addressUID", 122, 0); QCOMPARE(re, QStringLiteral("FOO-2020-04-23-122")); // the id can change } void checkDayCntIncrement() { DocType dt("Test"); const QDate d1(2022, 01, 23); const QDate d2(2022, 01, 25); int cnt = dt.nextDayCounter(d1); QCOMPARE(cnt, 1); cnt = dt.nextDayCounter(d1); QCOMPARE(cnt, 2); cnt = dt.nextDayCounter(d1); QCOMPARE(cnt, 3); // - switch to next date cnt = dt.nextDayCounter(d2); QCOMPARE(cnt, 1); cnt = dt.nextDayCounter(d2); QCOMPARE(cnt, 2); // - back to d1 cnt = dt.nextDayCounter(d1); QCOMPARE(cnt, 1); } void checkDateCounter() { DocType dt("Test"); // Attention: This test assumes that all verifies run on the same day. dt.setIdentTemplate("FOO-%n"); QString re = dt.generateDocumentIdent(QDate(2020, 01,23), "addressUID", 122, 2); QCOMPARE(re, "FOO-2"); // Test the padding functionality dt.setIdentTemplate("FOO-%nn"); re = dt.generateDocumentIdent(QDate(2020, 01,23), "addressUID", 122, 3); QCOMPARE(re, "FOO-03"); dt.setIdentTemplate("FOO-%nnn"); re = dt.generateDocumentIdent(QDate(2020, 01,23), "addressUID", 122, 3); QCOMPARE(re, "FOO-003"); dt.setIdentTemplate("FOO-%nnnn"); re = dt.generateDocumentIdent(QDate(2020, 01,23), "addressUID", 122, 6); QCOMPARE(re, "FOO-0006"); } private: QString _docTypeName; }; QTEST_MAIN(T_DocType) #include "t_doctype.moc" kraft-1.2.2/tests/t_format.cpp000066400000000000000000000017611467704360200163220ustar00rootroot00000000000000#include #include #include "format.h" class T_Format : public QObject { Q_OBJECT private slots: void initTestCase() { } void t1() { double s = 1.0; const QString sstr = Format::localeDoubleToString(s, QLocale::c()); QCOMPARE(sstr, QStringLiteral("1")); double s1 = 1.2; const QString sstr1 = Format::localeDoubleToString(s1, QLocale::c()); QCOMPARE(sstr1, QStringLiteral("1.2")); double s2 = 1.43; const QString sstr2 = Format::localeDoubleToString(s2, QLocale::c()); QCOMPARE(sstr2, QStringLiteral("1.43")); double s3 = 1.334543; const QString sstr3 = Format::localeDoubleToString(s3, QLocale::c()); QCOMPARE(sstr3, QStringLiteral("1.335")); double s4 = 1.50; const QString sstr4 = Format::localeDoubleToString(s4, QLocale::c()); QCOMPARE(sstr4, QStringLiteral("1.5")); } private: }; QTEST_MAIN(T_Format) #include "t_format.moc" kraft-1.2.2/tests/t_kraftdoc.cpp000066400000000000000000000212241467704360200166230ustar00rootroot00000000000000#include #include #include #include #include "testconfig.h" #include "kraftdb.h" #include "kraftdoc.h" #include "attribute.h" #include "docposition.h" #include "dbids.h" #include "format.h" #include "kraftsettings.h" void init_test_db() { const QString dbName("__test.db"); QDir sourceDir(TESTS_PATH); sourceDir.cdUp(); const QByteArray ba {sourceDir.absolutePath().toLatin1()}; qputenv("KRAFT_HOME", ba); QFile::remove(dbName); KraftDB::self()->dbConnect("QSQLITE", dbName, QString(), QString(), QString()); // create the tagTemplate table which is required by DocPositionBase::hasTag SqlCommandList sqls = KraftDB::self()->parseCommandFile("10_dbmigrate.sql"); QVERIFY(sqls.size() > 0); KraftDB::self()->processSqlCommands(sqls); #if 0 sqls = KraftDB::self()->parseCommandFile("10_dbmigrate.sql"); KraftDB::self()->processSqlCommands(sqls); sqls = KraftDB::self()->parseCommandFile("11_dbmigrate.sql"); KraftDB::self()->processSqlCommands(sqls); #endif } namespace { DocPositionList buildPosList() { DocPositionList positions; // Attention: only use tags here that exist in the database, as // defined in the 10_migrate.sql DocPosition *dp1 = new DocPosition; dp1->setAmount(2.0); dp1->setUnitPrice(Geld(6.50)); dp1->setText("Position1"); dp1->setTag("Work"); positions.append(dp1); DocPosition *dp2 = new DocPosition; dp2->setAmount(4.0); dp2->setUnitPrice(Geld(12.50)); dp2->setText("Position2"); dp2->setTag("Work"); positions.append(dp2); DocPosition *dp3 = new DocPosition; dp3->setAmount(4.0); dp3->setUnitPrice(Geld(1.50)); dp3->setText("Position3"); dp3->setTag("Material"); positions.append(dp3); return positions; } } class T_KraftDoc: public QObject { Q_OBJECT private slots: void initTestCase() { QLocale::setDefault(QLocale::German); KraftSettings::self()->setDateFormat(Format::DateFormatGerman); init_test_db(); } void cleanupTestCase() { const QString dbName("__test.db"); QDir sourceDir(TESTS_PATH); sourceDir.cdUp(); Q_ASSERT(QFile::remove(dbName)); } void checkTablesExist() { const QStringList attribCols {"sortkey", "name", "description", "color"}; QVERIFY(KraftDB::self()->checkTableExistsSqlite("tagTemplates", attribCols)); } void sumPerTag() { KraftDoc *kraftdoc = &kDoc; DocPositionList positions = buildPosList(); double fullTax = 19.0; double redTax = 7.0; const QString tmpl{"This is a template test with NETTO_SUM_PER_TAG(Work)"}; const QString expanded = kraftdoc->resolveMacros(tmpl, positions, _date, fullTax, redTax); qDebug() << "Expanded text is" << expanded; QString shouldBe{tmpl}; // 0xA0 is a non splitable space, no idea how to hardcode it. shouldBe.replace("NETTO_SUM_PER_TAG(Work)", "63,00" + QChar(0xA0) + "€"); QCOMPARE(expanded, shouldBe); } void sumPerTagBrutto() { KraftDoc *kraftdoc = &kDoc; DocPositionList positions = buildPosList(); double fullTax = 19.0; double redTax = 7.0; const QString tmpl{"This is a template test with NETTO_SUM_PER_TAG(Work) and BRUTTO_SUM_PER_TAG(Work) and VAT_SUM_PER_TAG(Work)"}; const QString expanded = kraftdoc->resolveMacros(tmpl, positions, _date, fullTax, redTax); qDebug() << "Expanded text is" << expanded; QString shouldBe{tmpl}; // 0xA0 is a non splitable space, no idea how to hardcode it. shouldBe.replace("NETTO_SUM_PER_TAG(Work)", "63,00" + QChar(0xA0) + "€"); shouldBe.replace("BRUTTO_SUM_PER_TAG(Work)", "74,97" + QChar(0xA0) + "€"); shouldBe.replace("VAT_SUM_PER_TAG(Work)", "11,97" + QChar(0xA0) + "€"); QCOMPARE(expanded, shouldBe); } void sumPerTagBruttoNull() { KraftDoc *kraftdoc = &kDoc; DocPositionList positions = buildPosList(); double fullTax = 19.0; double redTax = 7.0; const QString tmpl{"This is a template test with NETTO_SUM_PER_TAG(NoWork) and BRUTTO_SUM_PER_TAG(NoWork) and VAT_SUM_PER_TAG(NoWork)"}; const QString expanded = kraftdoc->resolveMacros(tmpl, positions, _date, fullTax, redTax); qDebug() << "Expanded text is" << expanded; QString shouldBe{tmpl}; // 0xA0 is a non splitable space, no idea how to hardcode it. shouldBe.replace("NETTO_SUM_PER_TAG(NoWork)", "0,00" + QChar(0xA0) + "€"); shouldBe.replace("BRUTTO_SUM_PER_TAG(NoWork)", "0,00" + QChar(0xA0) + "€"); shouldBe.replace("VAT_SUM_PER_TAG(NoWork)", "0,00" + QChar(0xA0) + "€"); QCOMPARE(expanded, shouldBe); } // Verify that the sum is zero for a pos list where no pos has that tag void sumPerTagNoMatch() { KraftDoc *kraftdoc = &kDoc; DocPositionList positions = buildPosList(); double fullTax = 19.0; double redTax = 7.0; const QString tmpl{"This is a template test with NETTO_SUM_PER_TAG(Plants)"}; const QString expanded = kraftdoc->resolveMacros(tmpl, positions, _date, fullTax, redTax); QString shouldBe{tmpl}; // 0xA0 is a non splitable space, no idea how to hardcode it. shouldBe.replace("NETTO_SUM_PER_TAG(Plants)", "0,00" + QChar(0xA0) + "€"); QCOMPARE(expanded, shouldBe); } void ifHasTag() { KraftDoc *kraftdoc = &kDoc; DocPositionList positions = buildPosList(); double fullTax = 19.0; double redTax = 7.0; const QString tmpl{"This template IF_ANY_HAS_TAG(Work) has the tag Work END_HAS_TAG"}; const QString expanded = kraftdoc->resolveMacros(tmpl, positions, _date, fullTax, redTax); QString shouldBe{"This template has the tag Work"}; // 0xA0 is a non splitable space, no idea how to hardcode it. QCOMPARE(expanded, shouldBe); } void ifHasTagNoEnd() { KraftDoc *kraftdoc = &kDoc; DocPositionList positions = buildPosList(); double fullTax = 19.0; double redTax = 7.0; const QString tmpl{"This template IF_ANY_HAS_TAG(Work) has the tag Work without an end"}; const QString expanded = kraftdoc->resolveMacros(tmpl, positions, _date, fullTax, redTax); QString shouldBe{"This template has the tag Work without an end"}; // 0xA0 is a non splitable space, no idea how to hardcode it. QCOMPARE(expanded, shouldBe); } void ifHasTagDoesNotHaveTheTag() { KraftDoc *kraftdoc = &kDoc; DocPositionList positions = buildPosList(); double fullTax = 19.0; double redTax = 7.0; const QString tmpl{"This template IF_ANY_HAS_TAG(Plants) has the tag Work END_HAS_TAG"}; const QString expanded = kraftdoc->resolveMacros(tmpl, positions, _date, fullTax, redTax); QString shouldBe{"This template"}; // 0xA0 is a non splitable space, no idea how to hardcode it. QCOMPARE(expanded, shouldBe); } void amountOfTag() { KraftDoc *kraftdoc = &kDoc; DocPositionList positions = buildPosList(); double fullTax = 19.0; double redTax = 7.0; const QString tmpl{"This template has ITEM_COUNT_WITH_TAG(Work) work items"}; const QString expanded = kraftdoc->resolveMacros(tmpl, positions, _date, fullTax, redTax); QString shouldBe{"This template has 2 work items"}; // 0xA0 is a non splitable space, no idea how to hardcode it. QCOMPARE(expanded, shouldBe); } void dateAddDay() { KraftDoc *kraftdoc = &kDoc; DocPositionList positions = buildPosList(); QDate d{2020, 1, 24}; double fullTax = 19.0; double redTax = 7.0; QString tmpl{"This is 12 days later than 24.01.2020: DATE_ADD_DAYS(12)"}; QString expanded = kraftdoc->resolveMacros(tmpl, positions, d, fullTax, redTax); QString shouldBe{"This is 12 days later than 24.01.2020: 05.02.2020"}; QCOMPARE(expanded, shouldBe); tmpl = "This is 0 days later than 24.01.2020: DATE_ADD_DAYS(0)"; expanded = kraftdoc->resolveMacros(tmpl, positions, d, fullTax, redTax); shouldBe = "This is 0 days later than 24.01.2020: 24.01.2020"; QCOMPARE(expanded, shouldBe); tmpl = "This is -5 days later than 24.01.2020: DATE_ADD_DAYS(-5)"; expanded = kraftdoc->resolveMacros(tmpl, positions, d, fullTax, redTax); shouldBe = "This is -5 days later than 24.01.2020: 19.01.2020"; QCOMPARE(expanded, shouldBe); } private: KraftDoc kDoc; QDate _date; }; QTEST_MAIN(T_KraftDoc) #include "t_kraftdoc.moc" kraft-1.2.2/tests/t_metaparser.cpp000066400000000000000000000032441467704360200171730ustar00rootroot00000000000000#include #include #include "metaxmlparser.h" class T_MetaParser : public QObject { Q_OBJECT private slots: void initTestCase() { } void goodParser() { QByteArray xml = "\ \ \ Progress Payment Invoice\ default\ en\ \ PartialInvoice\ true\ \ \ RedRider\ true\ \ Final Invoice\ Invoice\ \ \ "; QBuffer buf( &xml); MetaXMLParser parser; QVERIFY(parser.parse(&buf)); QList list = parser.metaDocTypeAddList(); QVERIFY(list.size() == 1 ); MetaDocTypeAdd tadd = list.first(); QCOMPARE(tadd.name(), QLatin1String("Progress Payment Invoice") ); QCOMPARE(tadd.numbercycle(), QLatin1String("default")); QCOMPARE(tadd.lang(), QLatin1String("en")); QVERIFY(tadd._attribs.size() == 2); QVariant rr(tadd._attribs.value("RedRider")); QVERIFY(rr.toBool()); QVERIFY(tadd._follower.size() == 2); QCOMPARE(tadd._follower.at(0), QLatin1String("Final Invoice")); QCOMPARE(tadd._follower.at(1), QLatin1String("Invoice")); } private: }; QTEST_MAIN(T_MetaParser) #include "t_metaparser.moc" kraft-1.2.2/tests/t_stringutil.cpp000066400000000000000000000032751467704360200172400ustar00rootroot00000000000000#include #include "testconfig.h" #include "stringutil.h" class T_Stringutil : public QObject { Q_OBJECT private slots: void simple1() { QString tmpl{"Foo %nn baz"}; QMap rep; rep.insert("%nn", "bar"); QString re = StringUtil::replaceTagsInString(tmpl, rep); QCOMPARE(re, QStringLiteral("Foo bar baz")); } void keyLenVariant() { QString tmpl{"Foo %nn %nnn baz"}; QMap rep; rep.insert("%nn", "bar"); rep.insert("%nnn", "bar2"); QString re = StringUtil::replaceTagsInString(tmpl, rep); QCOMPARE(re, QStringLiteral("Foo bar bar2 baz")); } void multipleKey() { QString tmpl{"Foo %nn %nnn %nn baz"}; QMap rep; rep.insert("%nn", "bar"); rep.insert("%nnn", "bar2"); QString re = StringUtil::replaceTagsInString(tmpl, rep); QCOMPARE(re, QStringLiteral("Foo bar bar2 bar baz")); } void multipleKey2() { QString tmpl{"Foo %nn %nnn %nn %dd baz"}; QMap rep; rep.insert("%nn", "bar"); rep.insert("%nnn", "bar2"); rep.insert("%dd", "numbers"); QString re = StringUtil::replaceTagsInString(tmpl, rep); QCOMPARE(re, QStringLiteral("Foo bar bar2 bar numbers baz")); } void percentVal() { QString tmpl{"Foo %nn %nnn"}; QMap rep; rep.insert("%nn", "bar %"); rep.insert("%nnn", "bar2"); QString re = StringUtil::replaceTagsInString(tmpl, rep); QCOMPARE(re, QStringLiteral("Foo bar % bar2")); } }; QTEST_MAIN(T_Stringutil) #include "t_stringutil.moc" kraft-1.2.2/tests/t_unitman.cpp000066400000000000000000000037211467704360200165030ustar00rootroot00000000000000#include #include #include #include #include #include "testconfig.h" #include "kraftdb.h" #include "sql_states.h" #include "unitmanager.h" #include "einheit.h" void init_test_db() { const QString dbName("__test.db"); QFile::remove(dbName); KraftDB::self()->dbConnect("QSQLITE", dbName, QString(), QString(), QString()); QDir sourceDir(TESTS_PATH); sourceDir.cdUp(); const QByteArray ba {sourceDir.absolutePath().toLatin1()}; qputenv("KRAFT_HOME", ba); SqlCommandList sqls = KraftDB::self()->parseCommandFile("create_schema.sql"); KraftDB::self()->processSqlCommands(sqls); sqls = KraftDB::self()->parseCommandFile("fill_schema_de.sql"); KraftDB::self()->processSqlCommands(sqls); // This adds a migration from file 24_dbmigrate.sql to the units table. Unfortunately the // migration file cannot be used directly here, because it is only found in a setup where // KRAFT_HOME is defined or the 24_dbmigrate.sql is installed in the system. // For simplification we do that manually here. sqls.clear(); sqls.append(SqlCommand("ALTER TABLE units ADD COLUMN ec20 VARCHAR(10);", "", false)); sqls.append(SqlCommand("UPDATE units set ec20 = \"MTR\" WHERE unitShort = \"m\";", "", false)); KraftDB::self()->processSqlCommands(sqls); } class T_UnitMan : public QObject { Q_OBJECT private slots: void initTestCase() { init_test_db(); } void checkUnitsLoaded() { QStringList units = UnitManager::self()->allUnits(); QVERIFY(units.count() > 0); qDebug() << "ALL Units:" << units; } void checkPauschUnit() { Einheit e = UnitManager::self()->getPauschUnit(); QCOMPARE(e.einheitSingular(), QStringLiteral("pausch.")); } void checkECE20() { auto u = UnitManager::self()->getECE20("m"); QCOMPARE(u, "MTR"); } }; QTEST_MAIN(T_UnitMan) #include "t_unitman.moc" kraft-1.2.2/tests/testconfig.h.in000066400000000000000000000000451467704360200167200ustar00rootroot00000000000000 #define TESTS_PATH "@TESTS_PATH@" kraft-1.2.2/tools/000077500000000000000000000000001467704360200137745ustar00rootroot00000000000000kraft-1.2.2/tools/CMakeLists.txt000066400000000000000000000014731467704360200165410ustar00rootroot00000000000000 set(findcontact_NAME findcontact) set(FINDCONTACT_SRC findcontact.cpp ../src/addressprovider.cpp ../src/addressprovider_akonadi.cpp) set(AUTOMOC ON) # # For now there is only the Akonadi based address backend, and thus # the findcontact tool is only built if akonadi is there. # If there are other backends, this must be FIXED. if(${AKO_PREFIX}Akonadi_FOUND) add_executable(${findcontact_NAME} ${FINDCONTACT_SRC}) target_link_libraries( ${findcontact_NAME} Qt5::Core Qt5::Widgets KF5::Contacts ${AKO_PREFIX}::AkonadiCore ${AKO_PREFIX}::AkonadiContact ) ########### install files ############### install(TARGETS ${findcontact_NAME} ${INSTALL_TARGETS_DEFAULT_ARGS}) endif() install(FILES erml2pdf.py watermarkpdf.py DESTINATION ${DATA_INSTALL_DIR}/kraft/tools ) kraft-1.2.2/tools/erml2pdf000077500000000000000000000002551467704360200154370ustar00rootroot00000000000000#!/bin/bash # (c) Klaas Freitag , 2010 # Start script for the python erml2pdf # to see error output, remove the 2>... part # python $0.py $* 2>/dev/null #kraft-1.2.2/tools/erml2pdf.py000066400000000000000000001142251467704360200160660ustar00rootroot00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # # erml2pdf - An RML to PDF converter with extended features # Copyright (C) 2003, Fabien Pinckaers, UCL, FSA # Contributors # Richard Waid # Klaas Freitag # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import copy import io import sys import xml.dom.minidom import getopt import re import reportlab from reportlab.pdfgen import canvas from reportlab import platypus from reportlab.lib import colors from reportlab.platypus.flowables import KeepTogether from PyPDF2 import PdfFileWriter, PdfFileReader # # Change this to UTF-8 if you plan tu use Reportlab's UTF-8 support # # encoding = 'latin1' # use utf8 for default encoding = 'UTF-8' # # from previous file util.py, imported for simplicity: class utils(object): @staticmethod def text_get(node): rc = '' for node in node.childNodes: if node.nodeType == node.TEXT_NODE: rc = rc + node.data return rc @staticmethod def unit_get(size): units = [ (re.compile('^(-?[0-9\.]+)\s*in$'), reportlab.lib.units.inch), (re.compile('^(-?[0-9\.]+)\s*cm$'), reportlab.lib.units.cm), (re.compile('^(-?[0-9\.]+)\s*mm$'), reportlab.lib.units.mm), (re.compile('^(-?[0-9\.]+)\s*$'), 1) ] for unit in units: res = unit[0].search(size, 0) if res: return unit[1]*float(res.group(1)) return False @staticmethod def tuple_int_get(node, attr_name, default=None): if not node.hasAttribute(attr_name): return default res = [int(x) for x in node.getAttribute(attr_name).split(',')] return res @staticmethod def bool_get(value): return (str(value)=="1") or (value.lower()=='yes') @staticmethod def attr_get(node, attrs, dict={}): res = {} for name in attrs: if node.hasAttribute(name): res[name] = utils.unit_get(node.getAttribute(name)) for key in dict: if node.hasAttribute(key): if dict[key]=='str': res[key] = str(node.getAttribute(key)) elif dict[key]=='bool': res[key] = utils.bool_get(node.getAttribute(key)) elif dict[key]=='int': res[key] = int(node.getAttribute(key)) return res # from previous file color.py, imported for simplicity: allcols = colors.getAllNamedColors() class color(object): @staticmethod def get(col_str): allcols = colors.getAllNamedColors() regex_t = re.compile('\(([0-9\.]*),([0-9\.]*),([0-9\.]*)\)') regex_h = re.compile('#([0-9a-zA-Z][0-9a-zA-Z])([0-9a-zA-Z][0-9a-zA-Z])([0-9a-zA-Z][0-9a-zA-Z])') if col_str in allcols.keys(): return allcols[col_str] res = regex_t.search(col_str, 0) if res: return (float(res.group(1)),float(res.group(2)),float(res.group(3))) res = regex_h.search(col_str, 0) if res: return tuple([ float(int(res.group(i),16))/255 for i in range(1,4)]) return colors.red # # original trml2pdf starts here: # def _child_get(node, childs): clds = [] for n in node.childNodes: if (n.nodeType == n.ELEMENT_NODE) and (n.localName == childs): clds.append(n) return clds class _rml_styles(object): def __init__(self, nodes): self.styles = {} self.names = {} self.table_styles = {} self.list_styles = {} for node in nodes: for style in node.getElementsByTagName('blockTableStyle'): self.table_styles[ style.getAttribute('id')] = self._table_style_get(style) for style in node.getElementsByTagName('listStyle'): self.list_styles[ style.getAttribute('name')] = self._list_style_get(style) for style in node.getElementsByTagName('paraStyle'): self.styles[ style.getAttribute('name')] = self._para_style_get(style) for variable in node.getElementsByTagName('initialize'): for name in variable.getElementsByTagName('name'): self.names[name.getAttribute('id')] = name.getAttribute( 'value') def _para_style_update(self, style, node): for attr in ['textColor', 'backColor', 'bulletColor']: if node.hasAttribute(attr): style.__dict__[attr] = color.get(node.getAttribute(attr)) for attr in ['fontName', 'bulletFontName', 'bulletText']: if node.hasAttribute(attr): style.__dict__[attr] = node.getAttribute(attr) for attr in ['fontSize', 'leftIndent', 'rightIndent', 'spaceBefore', 'spaceAfter', 'firstLineIndent', 'bulletIndent', 'bulletFontSize', 'leading']: if node.hasAttribute(attr): if attr == 'fontSize' and not node.hasAttribute('leading'): style.__dict__['leading'] = utils.unit_get( node.getAttribute(attr)) * 1.2 style.__dict__[attr] = utils.unit_get(node.getAttribute(attr)) if node.hasAttribute('alignment'): align = { 'right': reportlab.lib.enums.TA_RIGHT, 'center': reportlab.lib.enums.TA_CENTER, 'justify': reportlab.lib.enums.TA_JUSTIFY } style.alignment = align.get( node.getAttribute('alignment').lower(), reportlab.lib.enums.TA_LEFT) return style def _list_style_update(self, style, node): for attr in ['bulletColor']: if node.hasAttribute(attr): style.__dict__[attr] = color.get(node.getAttribute(attr)) for attr in ['bulletType', 'bulletFontName', 'bulletDetent', 'bulletDir', 'bulletFormat', 'start']: if node.hasAttribute(attr): style.__dict__[attr] = node.getAttribute(attr) for attr in ['leftIndent', 'rightIndent', 'bulletFontSize', 'bulletOffsetY']: if node.hasAttribute(attr): style.__dict__[attr] = utils.unit_get(node.getAttribute(attr)) if node.hasAttribute('bulletAlign'): align = { 'right': reportlab.lib.enums.TA_RIGHT, 'center': reportlab.lib.enums.TA_CENTER, 'justify': reportlab.lib.enums.TA_JUSTIFY } style.alignment = align.get( node.getAttribute('alignment').lower(), reportlab.lib.enums.TA_LEFT) return style def _table_style_get(self, style_node): styles = [] for node in style_node.childNodes: if node.nodeType == node.ELEMENT_NODE: start = utils.tuple_int_get(node, 'start', (0, 0)) stop = utils.tuple_int_get(node, 'stop', (-1, -1)) if node.localName == 'blockValign': styles.append( ('VALIGN', start, stop, str(node.getAttribute('value')))) elif node.localName == 'blockFont': styles.append( ('FONT', start, stop, str(node.getAttribute('name')))) elif node.localName == 'blockSpan': styles.append(('SPAN', start, stop)) elif node.localName == 'blockTextColor': styles.append( ('TEXTCOLOR', start, stop, color.get(str(node.getAttribute('colorName'))))) elif node.localName == 'blockLeading': styles.append( ('LEADING', start, stop, utils.unit_get(node.getAttribute('length')))) elif node.localName == 'blockAlignment': styles.append( ('ALIGNMENT', start, stop, str(node.getAttribute('value')))) elif node.localName == 'blockLeftPadding': styles.append( ('LEFTPADDING', start, stop, utils.unit_get(node.getAttribute('length')))) elif node.localName == 'blockRightPadding': styles.append( ('RIGHTPADDING', start, stop, utils.unit_get(node.getAttribute('length')))) elif node.localName == 'blockTopPadding': styles.append( ('TOPPADDING', start, stop, utils.unit_get(node.getAttribute('length')))) elif node.localName == 'blockBottomPadding': styles.append( ('BOTTOMPADDING', start, stop, utils.unit_get(node.getAttribute('length')))) elif node.localName == 'blockBackground': styles.append( ('BACKGROUND', start, stop, color.get(node.getAttribute('colorName')))) if node.hasAttribute('size'): styles.append( ('FONTSIZE', start, stop, utils.unit_get(node.getAttribute('size')))) elif node.localName == 'lineStyle': kind = node.getAttribute('kind') kind_list = ['GRID', 'BOX', 'OUTLINE', 'INNERGRID', 'LINEBELOW', 'LINEABOVE', 'LINEBEFORE', 'LINEAFTER'] assert kind in kind_list thick = 1 if node.hasAttribute('thickness'): thick = float(node.getAttribute('thickness')) styles.append( (kind, start, stop, thick, color.get(node.getAttribute('colorName')))) return platypus.tables.TableStyle(styles) def _list_style_get(self, node): style = reportlab.lib.styles.ListStyle('Default') if node.hasAttribute("parent"): parent = node.getAttribute("parent") parentStyle = self.styles.get(parent) if not parentStyle: raise Exception("parent style = '%s' not found" % parent) style.__dict__.update(parentStyle.__dict__) style.alignment = parentStyle.alignment self._list_style_update(style, node) return style def _para_style_get(self, node): styles = reportlab.lib.styles.getSampleStyleSheet() style = copy.deepcopy(styles["Normal"]) if node.hasAttribute("parent"): parent = node.getAttribute("parent") parentStyle = self.styles.get(parent) if not parentStyle: raise Exception("parent style = '%s' not found" % parent) style.__dict__.update(parentStyle.__dict__) style.alignment = parentStyle.alignment self._para_style_update(style, node) return style def para_style_get(self, node): style = False if node.hasAttribute('style'): if node.getAttribute('style') in self.styles: style = copy.deepcopy(self.styles[node.getAttribute('style')]) else: sys.stderr.write( 'Warning: style not found, %s - setting default!\n' % (node.getAttribute('style'),)) if not style: styles = reportlab.lib.styles.getSampleStyleSheet() style = copy.deepcopy(styles['Normal']) return self._para_style_update(style, node) class _rml_doc(object): def __init__(self, data): self.dom = xml.dom.minidom.parseString(data) self.filename = self.dom.documentElement.getAttribute('filename') def docinit(self, els): from reportlab.lib.fonts import addMapping from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont for node in els: for font in node.getElementsByTagName('registerFont'): name = font.getAttribute('fontName').encode('ascii') fname = font.getAttribute('fontFile').encode('ascii') pdfmetrics.registerFont(TTFont(name, fname)) addMapping(name, 0, 0, name) # normal addMapping(name, 0, 1, name) # italic addMapping(name, 1, 0, name) # bold addMapping(name, 1, 1, name) # italic and bold def render(self, out): el = self.dom.documentElement.getElementsByTagName('docinit') if el: self.docinit(el) el = self.dom.documentElement.getElementsByTagName('stylesheet') self.styles = _rml_styles(el) el = self.dom.documentElement.getElementsByTagName('template') if len(el): pt_obj = _rml_template(out, el[0], self) pt_obj.render( self.dom.documentElement.getElementsByTagName('story')[0]) else: self.canvas = canvas.Canvas(out) pd = self.dom.documentElement.getElementsByTagName( 'pageDrawing')[0] pd_obj = _rml_canvas(self.canvas, None, self) pd_obj.render(pd) self.canvas.showPage() self.canvas.save() class _rml_canvas(object): def __init__(self, canvas, doc_tmpl=None, doc=None): self.canvas = canvas self.styles = doc.styles self.doc_tmpl = doc_tmpl self.doc = doc def _textual(self, node): rc = '' for n in node.childNodes: if n.nodeType == n.ELEMENT_NODE: if n.localName == 'pageNumber': countingFrom = utils.tuple_int_get(n, 'countingFrom', default=[0])[0] rc += str(self.canvas.getPageNumber() + countingFrom) elif (n.nodeType == node.CDATA_SECTION_NODE): rc += n.data elif (n.nodeType == node.TEXT_NODE): rc += n.data return rc.encode(encoding) def _drawString(self, node): self.canvas.drawString( text=self._textual(node), **utils.attr_get(node, ['x', 'y'])) def _drawCenteredString(self, node): self.canvas.drawCentredString( text=self._textual(node), **utils.attr_get(node, ['x', 'y'])) def _drawRightString(self, node): self.canvas.drawRightString( text=self._textual(node), **utils.attr_get(node, ['x', 'y'])) def _rect(self, node): if node.hasAttribute('round'): self.canvas.roundRect(radius=utils.unit_get(node.getAttribute( 'round')), **utils.attr_get(node, ['x', 'y', 'width', 'height'], {'fill': 'bool', 'stroke': 'bool'})) else: self.canvas.rect( **utils.attr_get(node, ['x', 'y', 'width', 'height'], {'fill': 'bool', 'stroke': 'bool'})) def _ellipse(self, node): x1 = utils.unit_get(node.getAttribute('x')) x2 = utils.unit_get(node.getAttribute('width')) y1 = utils.unit_get(node.getAttribute('y')) y2 = utils.unit_get(node.getAttribute('height')) self.canvas.ellipse( x1, y1, x2, y2, **utils.attr_get(node, [], {'fill': 'bool', 'stroke': 'bool'})) def _curves(self, node): line_str = utils.text_get(node).split() while len(line_str) > 7: self.canvas.bezier(*[utils.unit_get(l) for l in line_str[0:8]]) line_str = line_str[8:] def _lines(self, node): line_str = utils.text_get(node).split() lines = [] while len(line_str) > 3: lines.append([utils.unit_get(l) for l in line_str[0:4]]) line_str = line_str[4:] self.canvas.lines(lines) def _grid(self, node): xlist = [utils.unit_get(s) for s in node.getAttribute('xs').split(',')] ylist = [utils.unit_get(s) for s in node.getAttribute('ys').split(',')] self.canvas.grid(xlist, ylist) def _translate(self, node): dx = 0 dy = 0 if node.hasAttribute('dx'): dx = utils.unit_get(node.getAttribute('dx')) if node.hasAttribute('dy'): dy = utils.unit_get(node.getAttribute('dy')) self.canvas.translate(dx, dy) def _circle(self, node): self.canvas.circle(x_cen=utils.unit_get(node.getAttribute('x')), y_cen=utils.unit_get(node.getAttribute( 'y')), r=utils.unit_get(node.getAttribute('radius')), **utils.attr_get(node, [], {'fill': 'bool', 'stroke': 'bool'})) def _place(self, node): flows = _rml_flowable(self.doc).render(node) infos = utils.attr_get(node, ['x', 'y', 'width', 'height']) infos['y'] += infos['height'] for flow in flows: w, h = flow.wrap(infos['width'], infos['height']) if w <= infos['width'] and h <= infos['height']: infos['y'] -= h flow.drawOn(self.canvas, infos['x'], infos['y']) infos['height'] -= h else: raise ValueError("Not enough space") def _line_mode(self, node): ljoin = {'round': 1, 'mitered': 0, 'bevelled': 2} lcap = {'default': 0, 'round': 1, 'square': 2} if node.hasAttribute('width'): self.canvas.setLineWidth( utils.unit_get(node.getAttribute('width'))) if node.hasAttribute('join'): self.canvas.setLineJoin(ljoin[node.getAttribute('join')]) if node.hasAttribute('cap'): self.canvas.setLineCap(lcap[node.getAttribute('cap')]) if node.hasAttribute('miterLimit'): self.canvas.setDash( utils.unit_get(node.getAttribute('miterLimit'))) if node.hasAttribute('dash'): dashes = node.getAttribute('dash').split(',') for x in range(len(dashes)): dashes[x] = utils.unit_get(dashes[x]) self.canvas.setDash(node.getAttribute('dash').split(',')) def _image(self, node): import urllib.request from reportlab.lib.utils import ImageReader u = urllib.request.urlopen("file:" + str(node.getAttribute('file'))) s = io.BytesIO() s.write(u.read()) s.seek(0) img = ImageReader(s) (sx, sy) = img.getSize() args = {} for tag in ('width', 'height', 'x', 'y'): if node.hasAttribute(tag): # if not utils.unit_get(node.getAttribute(tag)): # continue args[tag] = utils.unit_get(node.getAttribute(tag)) if node.hasAttribute("preserveAspectRatio"): args["preserveAspectRatio"] = True if ('width' in args) and ('height' not in args): args['height'] = sy * args['width'] / sx elif ('height' in args) and ('width' not in args): args['width'] = sx * args['height'] / sy elif ('width' in args) and ('height' in args) and (not args.get("preserveAspectRatio", False)): if (float(args['width']) / args['height']) > (float(sx) > sy): args['width'] = sx * args['height'] / sy else: args['height'] = sy * args['width'] / sx args['mask'] = 'auto' self.canvas.drawImage(img, **args) def _barcode(self, node): from reportlab.graphics.barcode import code128, qr createargs = {} drawargs = {} code_type = node.getAttribute('code') for tag in ('x', 'y'): if node.hasAttribute(tag): drawargs[tag] = utils.unit_get(node.getAttribute(tag)) if code_type == 'Code128': for tag in ('barWidth', 'barHeight'): if node.hasAttribute(tag): createargs[tag] = utils.unit_get(node.getAttribute(tag)) barcode = code128.Code128(self._textual(node), **createargs) elif code_type == "QR": for tag in ('width', 'height'): if node.hasAttribute(tag): createargs[tag] = utils.unit_get(node.getAttribute(tag)) barcode = qr.QrCode(node.getAttribute('value'), **createargs) barcode.drawOn(self.canvas, **drawargs) def _path(self, node): self.path = self.canvas.beginPath() self.path.moveTo(**utils.attr_get(node, ['x', 'y'])) for n in node.childNodes: if n.nodeType == node.ELEMENT_NODE: if n.localName == 'moveto': vals = utils.text_get(n).split() self.path.moveTo( utils.unit_get(vals[0]), utils.unit_get(vals[1])) elif n.localName == 'curvesto': vals = utils.text_get(n).split() while len(vals) > 5: pos = [] while len(pos) < 6: pos.append(utils.unit_get(vals.pop(0))) self.path.curveTo(*pos) elif (n.nodeType == node.TEXT_NODE): # Not sure if I must merge all TEXT_NODE ? data = n.data.split() while len(data) > 1: x = utils.unit_get(data.pop(0)) y = utils.unit_get(data.pop(0)) self.path.lineTo(x, y) if (not node.hasAttribute('close')) or utils.bool_get(node.getAttribute('close')): self.path.close() self.canvas.drawPath( self.path, **utils.attr_get(node, [], {'fill': 'bool', 'stroke': 'bool'})) def render(self, node): tags = { 'drawCentredString': self._drawCenteredString, 'drawCenteredString': self._drawCenteredString, 'drawRightString': self._drawRightString, 'drawString': self._drawString, 'rect': self._rect, 'ellipse': self._ellipse, 'lines': self._lines, 'grid': self._grid, 'curves': self._curves, 'fill': lambda node: self.canvas.setFillColor(color.get(node.getAttribute('color'))), 'stroke': lambda node: self.canvas.setStrokeColor(color.get(node.getAttribute('color'))), 'setFont': lambda node: self.canvas.setFont(node.getAttribute('name'), utils.unit_get(node.getAttribute('size'))), 'place': self._place, 'circle': self._circle, 'lineMode': self._line_mode, 'path': self._path, 'rotate': lambda node: self.canvas.rotate(float(node.getAttribute('degrees'))), 'translate': self._translate, 'image': self._image, 'barCode': self._barcode, } for nd in node.childNodes: if nd.nodeType == nd.ELEMENT_NODE: for tag in tags: if nd.localName == tag: tags[tag](nd) break class _rml_draw(object): def __init__(self, node, styles): self.node = node self.styles = styles self.canvas = None def render(self, canvas, doc): canvas.saveState() cnv = _rml_canvas(canvas, doc, self.styles) cnv.render(self.node) canvas.restoreState() class _rml_flowable(object): def __init__(self, doc): self.doc = doc self.styles = doc.styles def _textual(self, node): rc = '' for n in node.childNodes: if n.nodeType == node.ELEMENT_NODE: if n.localName == 'getName': newNode = self.doc.dom.createTextNode( self.styles.names.get(n.getAttribute('id'), 'Unknown name')) node.insertBefore(newNode, n) node.removeChild(n) if n.localName == 'pageNumber': rc += '' # TODO: change this ! else: self._textual(n) rc += n.toxml() elif (n.nodeType == node.CDATA_SECTION_NODE): rc += n.data elif (n.nodeType == node.TEXT_NODE): rc += n.toxml() return str(rc) def _list(self, node): if node.hasAttribute('style'): list_style = self.styles.list_styles[node.getAttribute('style')] else: list_style = platypus.flowables.ListStyle('Default') list_items = [] for li in _child_get(node, 'li'): flow = [] for n in li.childNodes: if n.nodeType == node.ELEMENT_NODE: flow.append(self._flowable(n)) if not flow: if li.hasAttribute('style'): li_style = self.styles.styles[ li.getAttribute('style')] else: li_style = reportlab.lib.styles.getSampleStyleSheet()['Normal'] flow = platypus.paragraph.Paragraph(self._textual(li), li_style) list_item = platypus.ListItem(flow) list_items.append(list_item) return platypus.ListFlowable(list_items, style=list_style, start=list_style.__dict__.get('start')) def _table(self, node): length = 0 colwidths = None rowheights = None data = [] for tr in _child_get(node, 'tr'): data2 = [] for td in _child_get(tr, 'td'): flow = [] for n in td.childNodes: if n.nodeType == node.ELEMENT_NODE: flow.append(self._flowable(n)) if not len(flow): flow = self._textual(td) data2.append(flow) if len(data2) > length: length = len(data2) for ab in data: while len(ab) < length: ab.append('') while len(data2) < length: data2.append('') data.append(data2) if node.hasAttribute('colWidths'): assert length == len(node.getAttribute('colWidths').split(',')) colwidths = [ utils.unit_get(f.strip()) for f in node.getAttribute('colWidths').split(',')] if node.hasAttribute('rowHeights'): rowheights = [ utils.unit_get(f.strip()) for f in node.getAttribute('rowHeights').split(',')] table = platypus.Table(data=data, colWidths=colwidths, rowHeights=rowheights, **( utils.attr_get(node, ['splitByRow'], {'repeatRows': 'int', 'repeatCols': 'int'}))) if node.hasAttribute('style'): table.setStyle( self.styles.table_styles[node.getAttribute('style')]) return table def _illustration(self, node): class Illustration(platypus.flowables.Flowable): def __init__(self, node, styles): self.node = node self.styles = styles self.width = utils.unit_get(node.getAttribute('width')) self.height = utils.unit_get(node.getAttribute('height')) def wrap(self, *args): return (self.width, self.height) def draw(self): canvas = self.canv drw = _rml_draw(self.node, self.styles) drw.render(self.canv, None) return Illustration(node, self.styles) def _flowable(self, node): if node.localName == 'para': style = self.styles.para_style_get(node) return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'name': self.styles.names[ node.getAttribute('id')] = node.getAttribute('value') return None elif node.localName == 'xpre': style = self.styles.para_style_get(node) return platypus.XPreformatted(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str', 'dedent': 'int', 'frags': 'int'}))) elif node.localName == 'pre': style = self.styles.para_style_get(node) return platypus.Preformatted(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str', 'dedent': 'int'}))) elif node.localName == 'illustration': return self._illustration(node) elif node.localName == 'blockTable': return self._table(node) # return KeepTogether(self._table(node)) elif node.localName == 'title': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Title'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'h1': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading1'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'h2': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading2'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'h3': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading3'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'image': return platypus.Image(node.getAttribute('file'), mask=(250, 255, 250, 255, 250, 255), **(utils.attr_get(node, ['width', 'height', 'preserveAspectRatio', 'anchor']))) elif node.localName == 'spacer': if node.hasAttribute('width'): width = utils.unit_get(node.getAttribute('width')) else: width = utils.unit_get('1cm') length = utils.unit_get(node.getAttribute('length')) return platypus.Spacer(width=width, height=length) elif node.localName == 'barCode': return code39.Extended39(self._textual(node)) elif node.localName == 'pageBreak': return platypus.PageBreak() elif node.localName == 'condPageBreak': return platypus.CondPageBreak(**(utils.attr_get(node, ['height']))) elif node.localName == 'setNextTemplate': return platypus.NextPageTemplate(str(node.getAttribute('name'))) elif node.localName == 'nextFrame': return platypus.FrameBreak() # return platypus.CondPageBreak(1000) # TODO: change the 1000 ! elif node.localName == 'ul': return self._list(node) elif node.localName == 'keepInFrame': substory = self.render(node) kwargs = { "maxWidth": 0, "maxHeight": 0, "content": substory, } mode = node.getAttribute("onOverflow") if mode: kwargs["mode"] = mode name = node.getAttribute("id") if name: kwargs["name"] = name kwargs.update( utils.attr_get(node, ['maxWidth','maxHeight', 'mergeSpace'], {'maxWidth': 'int','maxHeight': 'int'})) return platypus.KeepInFrame(**kwargs) else: sys.stderr.write( 'Warning: flowable not yet implemented: %s !\n' % (node.localName,)) return None def render(self, node_story): story = [] node = node_story.firstChild while node: if node.nodeType == node.ELEMENT_NODE: flow = self._flowable(node) if flow: story.append(flow) node = node.nextSibling return story class _rml_template(object): def __init__(self, out, node, doc): if not node.hasAttribute('pageSize'): pageSize = (utils.unit_get('21cm'), utils.unit_get('29.7cm')) else: ps = [x.strip() for x in node.getAttribute('pageSize').replace(')', '').replace( '(', '').split(',')] pageSize = (utils.unit_get(ps[0]), utils.unit_get(ps[1])) cm = reportlab.lib.units.cm self.doc_tmpl = platypus.BaseDocTemplate(out, pagesize=pageSize, **utils.attr_get(node, ['leftMargin', 'rightMargin', 'topMargin', 'bottomMargin'], { 'allowSplitting': 'int', 'showBoundary': 'bool', 'title': 'str', 'author': 'str', 'rotation': 'int'})) self.page_templates = [] self.styles = doc.styles self.doc = doc pts = node.getElementsByTagName('pageTemplate') for pt in pts: frames = [] for frame_el in pt.getElementsByTagName('frame'): frame = platypus.Frame( **(utils.attr_get(frame_el, ['x1', 'y1', 'width', 'height', 'leftPadding', 'rightPadding', 'bottomPadding', 'topPadding'], {'id': 'text', 'showBoundary': 'bool'}))) frames.append(frame) gr = pt.getElementsByTagName('pageGraphics') if len(gr): drw = _rml_draw(gr[0], self.doc) self.page_templates.append(platypus.PageTemplate( frames=frames, onPage=drw.render, **utils.attr_get(pt, [], {'id': 'str'}))) else: self.page_templates.append( platypus.PageTemplate(frames=frames, **utils.attr_get(pt, [], {'id': 'str'}))) self.doc_tmpl.addPageTemplates(self.page_templates) def render(self, node_story): r = _rml_flowable(self.doc) fis = r.render(node_story) self.doc_tmpl.build(fis) class Mark: "Enum Values for the watermark style: No watermark, first page, all pages." NOTHING = "0" FIRST_PAGE = "1" ALL_PAGES = "2" class PdfWatermark: "A class that converts a rml file to pdf" def __init__( self, outFile = None ): self.outputFile = outFile def watermark( self, pdfStr, watermarkFile, spec ): # Read the watermark- and document pdf file watermark = PdfFileReader(watermarkFile) watermark_page = watermark.getPage(0) pdfStr.seek(0) inputPdf = PdfFileReader( pdfStr ) outputPdf = PdfFileWriter() # flag for the first page of the source file firstPage = True # Loop over source document pages and merge with the first page of the watermark # file. for page in range(inputPdf.getNumPages()): pdf_page = inputPdf.getPage(page) if (spec == Mark.FIRST_PAGE and firstPage) or spec == Mark.ALL_PAGES: # deep copy the watermark page here, otherwise the watermark page # gets merged over and over because p would only be a reference pdf_page.mergePage(watermark_page) outputPdf.addPage( pdf_page ) firstPage = False else: outputPdf.addPage(pdf_page) if self.outputFile: with open(self.outputFile, 'wb') as fh: outputPdf.write(fh) return self.outputFile else: bytesIO = io.BytesIO(); outputPdf.write(bytesIO) return bytesIO.getvalue() def parseString(data): r = _rml_doc(data.strip()) fp = io.BytesIO() r.render(fp) return fp.getvalue() def erml2pdf_help(): print( 'Usage: erml2pdf [options] input.rml > output.pdf') print( '') print( 'Tool to render a file of the xml based markup language RML to PDF') print( 'with option to merge another PDF file as watermark.') print( '') print( 'Options:') print( '-o, --output output file, instead of standard out') print( '-m, --watermark-mode set the watermark mode with ') print( ' 0 = no watermark (default)') print( ' 1 = watermark on first page') print( ' 2 = watermark on all pages') print( ' Note: a watermark file must be specified for 1, 2') print( '-w, --watermark-file watermark file, the first page is used.') print( '') sys.exit(0) if __name__=="__main__": try: opts, args = getopt.getopt(sys.argv[1:], "ho:w:m:", ["help", "output=", "watermark-file=", "watermark-mode="]) except getopt.GetoptError as err: # print help information and exit: print( str(err)) # will print something like "option -a not recognized" erml2pdf_help() sys.exit(2) output = None watermarkFile = None watermarkMode = Mark.NOTHING for o, a in opts: if o in ("-h", "--help"): erml2pdf_help() sys.exit() elif o in ("-o", "--output"): output = a elif o in ("-w", "--watermark-file"): watermarkFile = a elif o in ("-m", "--watermark-mode"): watermarkMode = a else: assert False, "unhandled option" # if len(args) == 0: # a input file needs to be there erml2pdf_help() else: # print ("Args:" + args[0]) infile = args[0] # create the PDF with the help of reportlab content = open(infile, 'r').read() pdf = parseString( content ) # apply the watermark if required # print "############ Watermark-Mode: " + watermarkMode if watermarkMode != Mark.NOTHING: wm = PdfWatermark() pdfStringFile = io.BytesIO() pdfStringFile.write( pdf ) pdf = wm.watermark( pdfStringFile, watermarkFile, watermarkMode ) # handle output option, either file or stdout if output: outfile = open(output, 'wb') outfile.write( pdf ) outfile.close() else: if sys.version_info[0] < 3: sys.stdout.write(pdf) else: sys.stdout.buffer.write(pdf) kraft-1.2.2/tools/findcontact.cpp000066400000000000000000000163501467704360200170010ustar00rootroot00000000000000/* * Copyright (C) 2014 by Klaas Freitag * * 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. */ #include #include #include #include #include #include #include #include #include "addressprovider.h" #include class FindContact : public QObject { Q_OBJECT signals: void quitLoop(); public slots: void slotAddresseeFound( const QString&, const KContacts::Addressee& contact ) { dumpContact(contact, _options._outputType); emit quitLoop(); } void run() { if( parseOptions() ) { search(); } else { help(); emit quitLoop(); } } public: typedef enum { VCard, Pretty, Template } OutputType; struct CmdOptions { QString uid; QString outputfile; OutputType _outputType; QString outTemplate; }; // Constructor, called to initialize object FindContact( const QStringList& args ) : QObject(), _args(args) { _addressProvider.reset( new AddressProvider(this) ); connect( _addressProvider.data(), SIGNAL(lookupResult(QString,KContacts::Addressee)), this, SLOT(slotAddresseeFound(QString, KContacts::Addressee))); } void help() { std::cout << std::endl; std::cout << " findcontact - search for contact data." << std::endl; std::cout << " Usage: findcontact [-o filename] uid" << std::endl; std::cout << std::endl; std::cout << " -o : dump output to filename" << std::endl; std::cout << " -c: Output format VCard." << std::endl; std::cout << " -t

  • Acxw[9hPhi2y=@}CC*{U-]5{=FTzʌc99բ^Sl>>YЈ9܃Lh[=c1Ik"g˼е}Y\kUm}Xk"yyKz[z '5uggz0fYO}Zcf ^ӞU֙G-O7voLHFUoU>:L^Ŗ5ceˡZ2-"':W3j{}Ak ZCxdYO6=T1n4it}kdu[9jc1sAd!E@C`!MGY߲5LGy?ϡu5£_y>q/D}F7DzDzc1KU#=d՘i:b{eW;0hQ<<T}j=Þc>=ACj X?ʓLGy9sBz"^{:yZ#9s>{c{=g봧#XDudx9s/ 4hԿZd>g[c]l  1hZGG8{Œ"i@{:2=5icALCN1ӑz2γb7C|tﭾ*BR]8c1w3xiL˗#rγhg{"^[N/Pe~)jPcV zY4gճUb;~fQoQ捨=՜<:C=:"Zfմ5E=ZGZDo1|/GjLWṂcvͬ3̆YD&GPϸ1ΣV?eZF"jY.uwu3zU33cf -_dL{̮oe زc91՚ݲf7 aɖ5Lk}իvc$^G{#lYe!|B [1=Z}c1[=Vo{l]w<ǞLo^?bfc̙̄o돲g=kӂٳVk1U1s=WzG}#kC{sYbvYQc{8fg=kO϶w{g1s${ʞ AgMQz>Gd1wg:jS=k_c1p5|go15Gg8!l\1\)`c1]]=>}3c1'O|P>1mPcy&pe8wd1lOwh1␵km1q2c1c1c1c1c1c1c1c1c1c1sѼ_gIENDB`kraft-1.2.2/manual/images/en/catalog_standard_material.png000066400000000000000000002054151467704360200236450ustar00rootroot00000000000000PNG  IHDRam@ pHYs+ IDATx^w|̦wAX"^***vQ b˫b{E+ (($''3[xw<百0; B!B!B!B!B!B!B!B!B!B!C- ) OΡB]l DhrB"-)0!e.vdW;^!e (iI!P5")SlEAcOcmW!h,U5vng(j;B!DsPRCm'&kaB]M X?[zB,VESuͩ־Fk=I!έ)+ڧh'}z BwMhhs}ˇ>ۨϲB!D4էXϲ6|L4B>Uet滉zBzU|DHUg٘hj|}>]WyYn}4vB4*$"N慣>ϲQTG}UZO~/IBK& >FES(u]NlB!Ds`Opuu].*P벌*n}nqW^Bavl}n}nq,_e1l.ܖV[ۼJG%|2B!.Gڶ]n`yڡDInDb=`Gps &\pqW;qwBSeB4 uw܊"y[ۼ-))$<,7"]wyP;7X᣷mvmYMNjB!D]zNN=Ny[D+G!-.9n429Nm7΋H,pNs+p<^@sBip;=Bn}Nq8;N1N|=-fsn ''b]g]=}zijs;lNyS;uYF!Υ.[1sSԞNS}Nvbg@<"Fρ}rX8P1}^x$!m;Mm 4U9yzM8y-p8KNƦSeո>=G_4mnzގD}B4էЗu+Ze^ﳨ]p볧̫Sn`H` }^_^>.PzcNS=S}ަBuB4??T}~>Nگ\N8W6ۼ`":z"׋p硺^ ܋9`B4O`}\8ԶHTScSLR1yNmzܭM}C`j= DmS}^o}j\å>}jS4Uj !u[[C>{V(9ԗMBq=ǩOڜn`}?Xvd] E/xԗwbL-xev\BNNɁ}HrBF$yp =GovzRag\5ǎJqʢS[<u1vpr[[VXsc\ŔZ_#}^vB!Pv[~{NSh_(}z2՘>oS>ĭ-X `E^}z\/XŗS>UmѹŅB܊PEM/^)TߥRPjAdq(m{l -Sɳ9lv>K`O 8T }Y5nlNy8r*̤s.ČG%x,#>کXcBv9 UYJʂO{KS]ś]Ɏzn`bыrZȘK[L- ̣^IIOeb^~^ƺ5+X6B!LJv׌E/<:醼-e,]hbbΩ)hKM-lN1^09Mmj!4x8 _u%e]b8B!rn'-?*++{ 5nKUc"p+z֧bgǂbBey9|ӡ,oIbdo! !,~K#.S 1;aSS jLm۶z In飢O{Ry(6[eRYGbrN!KحVCT9SvLgP; &]R%[1dӉNO=HNjj+/oX*q]mv[ W$QѐwTNTm1싩cˎ;޾*//!gi3ֹexxr|f Źx8=ɘf"%tJˮx+1{uX.<n~ȟ N=87-[dQPTo_̩=A˚] eyuۼG%A2 =eeU};/r-[G 6r7yuc~8ϵ Ӌ;rx|~,Z;E%zzr-Xw~c2y[oyÙZvx|4~LӤ{.TTV܋ EK~z&!>[oG&xWpC+KWTTK>S=c6;_b0 Dmz՗S̎Uj1VK'=0J>>ޗ dU@z' PYۡ`}-S}٧CݒeKWV/0ZLFz:{;7ld#ٰi-hӦ ;.5ʵ3Mxfή~eeeXr՚:9ZvƜs!`Э{ۍz%|+"u±姅tmnA0k,\43{}JJJΛ3w:`IIl|TV8c煻Lg.$dzzW {V]Я~7y_T e`#aܕLzl -^eYUCO< gILmnEM6xT5TfOV8 /k;]S3թ;SٓY@B _-=ħ0Lg\ $eAVr2,U K#Wճ;tB `;3`֜xєsOPQQeAqq 6l²,:={vƌ ~g_`Csqj|6mQG3rQTX/ qޙqѿo3i g7.< :oǎ\*V:`N:Zf<-~7,K/`ٲۋܟ{o[CRQ^^LNJsN?«gD|rrrnp͕oז&?̶;{k+oWA ΡOWUEᕗ^-קݻu%'')Mc߽3!x<&_|=^{˲1Kaa1>r>k|Cǟ<7U.^¹g b`~uʉ_EKj]{[^0iۦ5u+> Ͷ;9|('Ul޲9yיOUqcy'Yt @p;1+"s~AK1)<uW]#ON*"Y\UTuӟPc6uhgj"L$PrW}z gb&.w̄J5VTh7v3fT^a+HOO}w7+ #*؟|OeEa/ %pu7S\RL9SX~gv2㯾܅ϿVs#GrygkyۋHO _㻹?<~,\=9;Ӌ 9{|Vӷ^tpZ491L e}>f4{tUo:Ī~41M6˯sqz#5wzw5jĻne7Lcֻ'ߵuyxp&]y-mZg}w2Xo `萃ybʳktОn͛3}ӵ%%WfЯO/>_M}Ǎ1i̙77_Cn^j^yOc-wm> ú810J6~>r$7~/ee}{ny{q2]ȼO ?d0_{%tlߎu74M&\sy<5W믹'yV$c,[NJr2=p7>;{7^z7J~YX^G&׺35_nw%nY0zmn,b%;dj>OG㝠FTs:z;ؼ]lw eFpɎEK~Ǟq nβ`s/#'2:9?Mn]n +ؾ#O,],_X>˲@azYo2_ZCXo*++Yw~Ya\_+hgSQ;SxK||ܟw?ܼצCcC7[my?ӯ}eg!|\]3?ٗP^^ z?(-dZbǎRR9|(ɬ߸¢D۱G{ 11j&˖SRZeY?||JڵiSL8}ӿo視}'*{=Rc=nۭ/ibQVxlϫ㶝4;mSDNAqlYO_e_Pr;3k#m/%U%Y'CΉ_x]XeYTTTb&RH~A!-[5lڼFAӪeK>***IKMeǎF:}O|8O kxaj)II(Y~mZe,bӖj٢nƐLw?Ug-2ټ*|Qwav`_xު&dzpپcG/DxP\R\ϲ0=fUUPPXڶ};^նy<N>a 6~N[ggiܔXbBiJVZegs1tAUrRS[} VWu^v<o[qI7o*ߟ>`> =ϿbCrQGѬj]Ǟ8ch:˂vm[a&e aYH)Ε{$zzKݶ{|}a0S}qul7>v:NYJmYx-%}[֧NzEmO 0HJLWٍ-O#ދP'2̤J< >PiVr_/ld|>7]{5K-=ev`>kki?_9yy|<3^V8'␃$'';0cUܠ=SdG^[ЮMk6m?SՉϲyݲ% @Zj*Ӭ~67/ k(wSW(vagkۦ5w0'w MbGN.u3?dh97^]##僙yezWHߵx)fQ=s7G䮛dz|_~uyWo, \d8 w6G&G򊊐բ%sG\u~ 1je7I͇-yMoG'fmz'Q=mK 05fv*iNZz6 mH2_lۃU)[%KzS7nݙ?Op|LuԿo6.^y;+EݼǴi݊W_F=:HvvKZo0'a@= /0 :tdİCeIJ~7s:x0ݺaӋϋ_ǃ'W̉MjJ qqqU@(/ e 2#z_߰V$%%0hۦ5mZS*%Git؁#F UY۰ܼ| `CjЭ_3:vdaCMWkn]o9գ;i@j,6[ѱ};ٸe .{ IDATo "-`bb))|eѶMky7,Z;7y_T 0V-l\Q߼ݳce72s՘=>ujSsԶ(½-tҜ<=f_Pah<@Ŗ$} IȨʥãSag-Nܖۘp]qʉuRR)*./e?w^|eW]r>[~^dz?纫.G&RPXȬϾYw?ɕϰC˯wsI{\px}>gy2eh2^|u]q1YYYlٺ~5E4M;T;ԪK}+3'o z }mwpuŇũ1MlƓϼ԰,uٝ/To;anʩOm/`ScK]OTinArn@8λ[A*yuϗɲf V`^ƞv̩QU=>!6~"'^}1W 1maQũT !;{gqNMʭ-^o y'L?1u>r}R `~]y<̒V. _@ !鋯s1Ǖyu~^@\K2oRn9ŝݖ,œU(z\?1VcjQu Il[LiO| %B8Re@{1|- b][y:ԋԇ4H; >A!w:vyP]`m{^ Wg1)BPO`pb;^vb$i)B7h~;c0'\=pzyvi!B4<1Y>zy:Qէ68=W?N/V+l5&B4.;1^}Lmj-w}X,HvH v:zi=oW}{B!h8X9bݨ5~0>BD=qմ(ԩ 0cڳP8,|^L=,_FBTKͅU1{20,u ˲5.FQ3=it1S|WLնd4d8Nmj\zҦBu~[3B+)pTƠo0Oԁ~%DwSaVc 3em&SJm9nS}I:eV_N_u^?z=_T!B4{Lg5fS_Q9Ś(ԓ6 חw0N} !q|(?qܦUD`''}aOm8^i !q[\v8Dp~"8NB!Dc}攧-`4Xm^mS=σB!Dn.p[S>N;&s`O:U_6_Aͯ%B j"n1mס 1p9P'j-BaSy:XԊ0A^B!hLMo7.œ^p'[NH!'42zc1",wczW_vNgקr낭#*@# vN} rQvXm[Yw !D*-Ӆ/u۷mgXVBf,-§wW^n|.)}L/L&UA쿎T;1`'ܭ)9yR !jai`u`r⑏&i|cNc=!xHr륡E֥ Rmc3W>{c1)B aѸ`x]4ݲ. *ߩsL!  REĒ9]u ZA~Y_N[ DžBpc}MJs*t!mB,z2]-/Tu-Bj\vSյ,lu=pN\`}B!`p1qS墦)a7O!#ܱ:ܼ&)a=.n.ʢh\:szD"llQr˻]m==So>4ߦϙ4a*|u8vѨ*21LW/{GB;ppwj?Qkpb9o/p#v PϏ,6aP>,y:&9}/̥cLZ =z X_0Xnė@F.|Ŝ4 #v,ˇA -v@/Z>$F%*ǯE1t=n>G;ʢO?yKXJOwߗ.8[u|O{ٸ'{O&vF˿cxc1øK9d̠'5~I#QΈ .WB:l'D27MɶuŔj?5 ֚w\NtLLÃ')B1~na|FS}zN(aex 'ٓZ _嬙(~f1xܱwgb6^CI&nǻ8kha<2@hr|]N G4wPxw3<57w3on-/ƚhT՛ߐ=v]SڇtN̹s,<tn[yhfԱ`5~0h=(9~ ݠjfE'Lz-s; ;4ٝ4/\O:_Fw?:._Ŷ$: >KOۏlӢhdnZԝS/ɷ21;~-FVgVoƘ}2OS,,"w/Q@/= }ʈW_|L:ǷeaEO,TԖ>Nz(s^K65hX.<-?M~o67q%tk//ko0 ! њg}h1[ɲ#כعeyykl/,#P.}~3Zcn{9ͮ+dCΧSlI}3 8'_awpA ?2mWĝt oEٲ7KjvUU}jU}n\'deWqkc#RNڳ5I%0)`:KN]͵os4,JԢht#:%Q<5u ?{&uNx<0#xbx}bVq)wx>{9sԼe?y*=5v7Iœ7'p݈}I!"u[ub +z^?`9|zހ> GsZ8 Zf\ϐ&ѷ(G|kzRm9쎡E>}Nx ~|lf̤LxaΞϝCg,*}#o⚇bbRK[|kzyCmo΋h'cNy ߦ~vL_Z%zHhCXk)1c qqtГ|X<$@lZV5ⰽےGR9,\Z&޳]3i߷ rȵ 0L  ÃiEo߳Ԟ c?yyqx_qT=A8W>#$)!ڑgD7R:gv{doxs00Mo<ρ} F'=0UUǞ##>JJX{5W^}5W^sjAfnxܖ9g(QXXBJV& "PFߞ89~3|ɴiȺ_g[{F51=&8,C8|2{^ *Y%q􀤚f6Gx< 8oF?>11(_`v&' !>~'E:Uf..-IOMƒv]la{j]МݬNv]r-_Όۯ@̪(oi3HȨ cxRIceU?mVU4xh2kY!r(/|K7P30+sYWEPͥL@̢ ()Rg$8fc`jH>—[T Ӓ1 w(b13.gKA۷WǟE5塀q+ X (\0"Al_I֞>qhNeAzV&U\Lvy9Wo(`L2<Lq0îgVN+$RRP@%w#?/++,IJ$o%3웹Yz6L͈c8_KՔrap1xt,~?3eI#UyӟoNi]CyA+`b6~;QRbc`)#wr~r^|"'3W{4g@`de<hA)b`jrNM^>h#HO\yȌ ܵFV$-=C}pZϻfߴjTU[O=wls I]{{,s4:361b5\9ӻ7?MBzI\|.rE¢"Og^ IpAI4+qUdPF qGv`( =-O~)v⒳h٢Eg{0oa`Z ѝ}Gn0c ,L33ar,hEJ$00Z3uh6:~{K1]r[[W 戸 |mwJXQ?M׍|<6`%~4fWPLEf]Oiwaz``E`{t'X{{BT3f}¨8 f}m 9kY|Q.(Yms^֨,1[NxzQ>}&2j?/ab//3;HNN$kCٿbj# 2Uyc [E\})I'-ҲHkG}zA_Yu^r$'f>Qm^{&˭ՕϼQ0\+O91,[x//ߛNً'ta5ג̞z/bgЦhq^QČ7W &fC.3Lq%f<)m0z2n<\Zg?ripNG^/>OQCD- =]u,|R n6NrǤS8⡞G9m5|n0 ,u݁m;_91ae%mW#X8,U3F?Z}Ϲ <|xuY>LEW@zչx60ҮSj0,,zM=n}dO8^cr5t_忇: IDAT[eY5 \?ԸViBE0 +Ki{-Mm}pc5wš7ýY|?Lk1@EJ a[u|`uj :,D)zzj^{5C&z;5l<: ZmPfMf`zԻZ0154Lj,7m۱p紼LB!D'wv9_ԃj1B!DÑ"lWU"B'_G !B4)„B!aB!@0!BF EB!D#ߎ!4(,(BQgS\.\v9K.aBvԻEICE o_BgR7쳷),,buRŐa1OB;YTvؑ+EX }m?)BTp4yw:d>x!B"EB!D#"L!H&BB!hR !B4)„B!aB!@0!BF EB!D#"L!H&BB!hR !B4)š!ߺ9 .]B!h&k<>7| sx݋zȻzO#]nB!DHք83;q)п|56Ր-MsO#G2?cY@9s9c&_s:=|8C:XF޿^o1nwɋQQ]9=2}9qpl_=9Ɉ#Gs}WbV~x#Fx/֖GNBLIYa[vh&Yd-Y|H fL5^,0ߓ|g{>:{'h|}7q38^!La71qIon|e&3r), |qOof=3tn뷘ΪJ)ÄB캤k*}2P?y,S`#cnbTI$vkA'10{;_[d>z OC7s#k74ǃ4jýTߏ$˘5{3vK d9UYO3y' !>~'E1wPB!vEqz@4qE9/ V I??K3em1x(fJ|klVT23|S܉t3R6lg'@JeGR\mlfK{/޳.ޟ3rPrֳ?4/G4kaNz&[caq71mx-%m9|C9;YF1! Hjps){ȱˮ0՜725vҶ_&/uno_vvGbׅ ߾5y"-|^ cb`a|"4Sb``zN=0M[˧pFB4eϿ{]Q1im]@%*v[}JhW*m+-Mm}pc53aMazE5:3r[ L1 r诵NZy 01:B]PZ !B("L!H&BB!hR !B4)„B!aB!@0!BF EB!D#"L!H&BB!hR ?+ǎw }X=\+J|/*21LWJݵȟy/ʠ/|Gdru9U)&,"*Ṭ\SFq|koBBْ")hP8RcsƤر|޺[>u^8M̟3[!xvgrl C?{wgSquΝ;1s"ʒd-EYR~IM$ٷ,T,%{e7 a=,ܙ5>s9{W:&}ƂSyI\ZOu-peNwі];C0>c'aBٞ:>e̮ pb\DK aAʶBOXWs c[Xi#vc8O1FԮK|&p>o=9^ṅ۝\)r2|rƙu"߲goKK1z_$繂:1 LYF9!$ պ7SEoͱ Sx)3wiwke#6/GRbTq|=Q&`yc"vnl'm(^x)ێDoƒAP ٷ| /#&7uI>A%od=ocQ}ͺ} -ג~Oeڿ9Rz}cP2s#^8~E[;s#^,*͸+֑HfGJ2 xž-~Bm}ȚGp_w|hfCѾcbD')o~ZwAnpwd̑9a9[&peZߏǍC;04s][{ f0O*^l6|Joӻ5=I\ɬJ]5?c򥶌4g~h[ugۯBh1z.kGmY&,-xGGaw ~MdN6'׽DZc*ӱ`zߒӷQ]sTՀsa'v4 30|,OMjcXzc?EG iŽ#ye3=ߩ:}93=ߊ~={ױ9{Otz=ٟvf|/H$D<;Ŷq癱 >v-=F^gs?qo6=zWL9"QOXlɀYsd "^0_7j,_Ayn8'c[1uȳ|>>9Yc ^q msdʢ;_pgPc'%a6`sQ xu~μrz^~n2;my!sd|2lZ,SXMLg}4~;\xk*c#%X3r+Sn/Cn/19,Y|ct;Gy/>;\^~7*0h|90ᥣpO=ƴ7:Sɤm`~:>gEwy}M׾`{T9M|xzC'`?z5k_ĸ߽؀m) w_-X竰c;ړ̹gF6m,ߙuyi])ےҶfiә>;מc&,]M1s4 Q}{ZMLO{Ywf,4g4- ❧>Yh p]y,)}KOBv+/pwql>$7TR/'(dm灢k92͑fPz6(E; /,9]K[9:I\!*Vv|X$;"ݴ:wHJԿfWf͜]HBnh׌r۾c$^oZӽ^1򄸉%w;۸'7UtbT(:{qszxh=9ƛ`pS$>@l/}OKƤKL zIM`ig3f9:Ρ-Hi9)0NZ=r`a 8:i #ibFzr¶,%&}M:@b9{/veɉ$nJBjhu)E w 㢇DGI#či[羞F&jϱX[ DȊPl{ l'{:{ 73ۜsx`$$MaI6M|Gw-X#ۚݱ7 #7.mpr{c*4I 5"RƿӞB~PS~?OeHlP$>yE.IkH ya,cX?2oV #C0 "}|)#w$$ķϵbl󹢉.H˧&X03;203s{;10pߧ3t .2!73W6r0\)e"dj ̼DG=K"Lwvq̈OW@vJ5cGe 뷮Lv#_L)Ye[asmZݷc3dH|peO1S>~ ܞ>نGN} 8AȀV3A,,oaGgUHڶױyΉ\h3W2݌[vMŻ8 D=ec\UWeUM8rSMY8ˁ2gK0#Kœ(˅-Ǡ`ڔ5V$Ѷ9",ٓ혰 a>ʑSєX^_,74n hod4nr-Գ}Ig9\E(V0~ݓr,6uetx҃+O2 W "Ek{)x9+O!ʕ-˛HrtF^" ޲l;=O|yY3} %Lkq5!>> B\xiʥ[;O*MS?n<iu1, @^lZРqg~S2z(̊hT.uZ/RxvPuz5lNasK˚r#%OC𻻹w]ۖ^u{s0n o[[Rn}w'kg͌i@]MapkؔwUp$ ?[6^c=5+sIf5,IJQ&* }{sHU׍yKOz?<_ㆬ<nJcYΗsp cL5Aye3ڽ2yJ˲U4lچs@'n4"}]5M2xa(o)t<_F!jWKfQAGYs}RqtҴ-^z>>Z(vM# {]iܪ/v8˱U?5.SD Ktٕ?H f :u~CRCAF>C݊q v-\- 8~K0S!e 6No~=2,:ʰN۶-ދ M_ ),3Ro_l ?1\)]).3.L} }4XnY?[ <q,2oe1}fGaw|hOv궒 w|ξ׹Ư] IN]RvZ=e~vמ>o7]OVK],/oovj2t>mLn W3akCdn͟y^k]Yo׹&sfv \g_}y=΢23m|4lEYO,.G8@=a""N }>3\ DDK"rDDDD&"""0(8@!LDDDEEۻg{~]ADr*\EVebY[m#P,IIIADs5`s F aAj=;~kʖ%O<՗x9as>H:y2{s۶qi*WLhhh`uиԼ$mʖ[‚lY.aӥ;'y)bf+RCTT*9P7e./ aAIAʲ˶LD\ñcERRaaBCC2L!LDDD a""""PqBDDDD&"""0bڵ]v8B!JweD u /{tʿtxd*6K!yO_{O3쥡 }ˑ}ُ7>Fllw'2oՙ:`i}"_?HOj37% c๩uB&@2]nh1f?^jQۨݠ9<DŽe6RՇC9E.dݼTBetLX̥:rfp [??aIi[V1uL[ 3X ep]I,]c@8&yG|Yop]>3~""NRi㬝4wiGfi|_E';ЬIW[} IDATN8؟nޔfe d,6qdu6<ڶ k|ˑeհhoB izc|fO6M߸=-v./]ӨIK:?&sw$[<&"{1%ao\}Z7mHVyj--zcװoыѱƲgs|@Z=;?Ӡq{z<]h)?O?70NII: EHHaTԂع{2voF271k;^In]-W>M:>ԝ8@iu@>X}06/4Gs]4oTa$O%#ҩY#4mO~ |GҾs|mO[o/\ɰ2l^ِ@!,1RR }g_ clHedfϞKeqzo=y*a7_l?>rs&}Ì}[g^~h 7Ux4;'?܀\5nvgɀޕ+9Q$;VQHO-EtB8&Eo1 qd;Hlz JT 厢b|d%mMR~ ՠprG+H%}huOMZݺs&xjy!\w[e Ty ud-cSf;ŵz^¼OeN[;(B]nW*{i`\.\楏9i"C]*\m>F Ltp}lӕzuG5}/51 }4ӋW#"<.◅Ұ+$OX^ )I8b.lM@ԋ^OZemc6_evg:]IT:I|HuOWnJӦMUb]VTtukƲb~*wH+M?>WUvP!r;>ό;9fIٞt߉;QQOFX~'N\˨mx/JL zikl5mL%ωY^ʡ&QnirG MzIʇGQ 웫cp6RK3k> !.]vbvd+@i;t@ǘ;6 0 L#%YfQJwg=:d X3ccI:MIoSpmB6Q~ӊ[Rx3޽Ѹ1͔~00|3͙S;̡#6LJӌ+7U#wUC+~>5;rN_\Ar[' ayeTvcHޛ9E\3$0'#)i'mYE&._6щzY8]|i|;X݇JCG#5ٰ'`#&\jX7`Fj`Kwm) 062F$AX,"tE{h$<~ӆu t>\ic\Y0ɶ 19r0Pد/m)`teʬ߳/\.Cy(6GEкR1)(^MN^ 4i&[<[ggarW͍aQX7lH4yXg)DDEpzvzA3٤:dr%c>dyDVs{ ǶX}^/jꜘ 7%;k5?%r.#]w*(vJ$k!7ЬI8K>χ$ocf9fSo:ȋI5)˧LRUbv1QllύNrV2M:u]ԧ]TuOr2?.Ej=ml>}tdy'r!g{d"thBM1,w=,rMQ4dtfY7E{.v aT97Έ-iԴ3{qkA(-NJ.=c=p:q&Eu{&mAWWq)4Ȉivt~3"$Coӽz绂}Atgay~v/GYVjUǏYW<66'Z7D@$g5ˮ,GYcz]eiC^=L:$<>4lO<ԭ/krU3uZM+g;ooAeÔ ) l SZ)mlqf,O ۲һS 3Ғm0{P?eFVRp>g7`&""Akm>}ʕ+X}VWMY&mVlʵVKP4{(˔%,, 0.q uS8'SDX؅uW a""""PqBDDDD&"""0-^O?eY"B\|r :udy_?&M슾˾DD4v;ҥK3/V:֭wBwO5[iV܁{ _trESkժTt#nj͠'䡇G\\պUVҴIKp0kӗ> Ktٹl>'50ɱzAjԬǟ|B7)lA }%^6Ν;A6jt BA uU&+F}& a""s4k֜VZ;wnF~7=3jHƌ+g:ѸM9ʎty4hݍ 1$-yYB:݌ϻy7h ӗT a""rEOyj`^6,==  ?@Y1!,-0.bػ>[+IQpC^o|GW*jnUŬ/GоNW*y",Z…Чσ3g aø's s\G("h[f$'η0w;p)"Dm>*Vxypy0p,_xKsFIX5H82)c31{l4 a""rEhݺMMеݜ:uuR~SfOT>y*~"*1b Ty;}z edIX ~I \J*}lmfC:ukynKc̿NrHUT)͛mYzb޼,Y283Uҋ$=[hIx+\S(5D#miYjfRRVW:k5yb6j:U$_`rAddd` 0 Zaxx{d dˑY0ⓥlw|SzAy㾿sp93N9B8;w;h,3CtҁU)gӯ{Ls3?Xb2t~]4,‰ޠϐa /wxX~+Ɩþ<2sJp^æ_qcR<3'< 0d÷s;W%빳c fp[z5(N"Z;²5'xa4?W+Kv-(}9+ZLqH=a"".]qX|q[ό C$>pa[>wRkm|^%&,}xŞbߊh>'mY^7%ufҔsL/9BH6("q$He8I|VȤ4Z{橙rQLuuP'^kzt\EDDẪ?]Q -L/1nA[uC`OުҢ'feoq$7qp{ ǖm9A!LDD$;;4 ⾱ߖS#1df Cúް-}^_ȮČZyO{+֥n^@Z;ﻞ?^HV}/Kˑ"""glk5N{bY#O_*ۆ,׹)Ӭ?#&M: 9'LDDD a""""PqBDDDD&"""0(Hrx~?#MN% : a"""##ضm^oR`emDFFVIED$h,Y={vZ~ H"4,(Ŋ &""A`H,/Zt 222JB-0xu"rN8ɞ=3">Kh\Uy  ZySX1vB%1aPBIe)Ox~SqBDDDD&"""0(ȿ~9-H*pc}d^X]-r%P%<ԫU5дK?^ >g'&n*7Wj[Y~m.".n\&7va,mwWmWN}>߼"D.[6K 0dœeKF=X{Lb,$|#?^Wou07 a%ޠO Ϫ o1wKrT"r>Dr]0PQ lힼtCMEq^ֿݞzO./-$y|>Gmc'tVԫא&ձLuL{ kѹX2hٴu6 #FtWmq|֣xq?vnI ' GƵqk=!뽀w7~vSQz4mY%o͎ywGsԮK3}Ki-eZwqoэ6p܆Kx6&-,OziT궤98u⍇0߿މf-3dD!L2e\/%qԅWK5:~5YyJL%'ݲ6S1% ܯ ʬi=-I2 SYF1eiU]ү_?#ؿq6⺛+0ex_F| ;L __',bү6 X-f٬7iw$_ϩ60y3_-Ylêi ?[vI^_6qKýes0 t꣔\.=M(n7rQ/7g:/4BD.3 a");('C/1R.Q;l3Zߦu X\V5pۙ|_5,N"ze? vɓ07yQjqM0=Y17^D;6~kRv3yn.fxΒ6o5Q37` sERKȜynЮ]Ub/gkrV[Fc+*ݻPw|Ňk17WKwmݒET#~QxMU1]6uoٷ;TD.+o˔!c!: ' fq qu+/XpY.00g吖Lחޜȍzu qăN\kvjUTzs)EԘaYmd3_LCrXE[,"9Hvq"̂=J_5KW 5hAf͎l^Eӑqc:2etGb2Sg$ 0x\%exY>Oo27=䋈`l_tE]6/Lg`lҝ?;ÇOaC* Wᾯ0OSgFC|ph!,L=H42I.`'"l??D$ȹs7fIع O|)l#_߲ENcuf4ނj;&μg㛨8i(w)U((S (F eɖٲGK'ih ih"ڢq7\~^ V4 ap5.n"*0+pm+YOT& \رh $k ]DZV-re"NDGs2#A[("82~]z%EкAqi/O괬ŭSXI6"/y7E'py=Ix"{Pn. 3k|ߢ4/)nnUIۣ(Kӊ3mpM '3>exT 췏vc[\ӶiB\>d2f}ʇ]q+N%W~LӇ2O3ܵat+HF37cwA6КoR ?@%Ǥ$Mŀ@w>dR|3f2|q)5%ja~T4ō}Xc_1uL !~vkѺˎKjom0ڕvE%yl"lLYoȉ3ǎ;GPj`!D6a=Ԯ#7b5jfbR]9pU.1qkbS5-l%y>l+)R;o,ˎu2. B=() aB!Y@ !jZ!HOB!D&B$ !Bd aB!Y@BB!D&B$ !Bd aB!Y@BB!D&B$ !Bd aB!Y@BB!D&B$ !Bd aB!Y@BB!D&B+DǍ7AٌW\p!=t~ġp5|*U} *`"p!xIt]bHO@JW\\?qooo-IJ<{l:|u67lT2τss>ƈi@ߒd7BKH˦t]ɓS!Mrww͍ riN5Zz!PfM "~s:}-8S`7.Jdkq:ohrPfMlnZ\ov ?4D`o݃4i7’=]z? "j5TN:79SP3eC7nܠ`-65 l(dS0OFʼݻwcU;~†; Br S 53g{j izIlނw3&%ޯ7Pa҉m9gƪgLBE0;6b?3gѯfʣwk#^~nhĆ01BU²;Ν;S`|}}D3:hnL]OZ Kr*Vw׵-͂ӨKLvXO0+ݞ&u܃-1xǰMkѸ{6^B4l֕WFD_STFgjtkM.Ю,g@9;6vYOJxM.6n4n:+/Zщ> c^@pf|M6W Q=mb"y--ayiw7[#ʴ=tPیєQаau{y&p$!,JX/aH?kwE %qbV1B hÈϾc,if݌KJn%qʷl޺cY:kꀎf6h6-夥Y0n/ X;+fC#NI a8VBPtȔo4~͋PΤM]Sxcuj-;6r2+uMX/[ޟȚ z_f 2o[=%iʹX2>k?M[͠K%Wtpk7oef,ɪKoSa2wfɼO8 _xa67Eo6˿ 3Ve5%q7t|k|}&o?F:w6NT[eBvI'=D#!2=Wqأ L^sZv,@4X'j' &u|_6݌ W72v7(=aFV eXsQ?{,:ynYq˦C!EfQ |kR 'רJ0m#&vN&%%5[=SjqDŽBb5;9[99;uԣIa9SaFj57_OBvxm܍S~?3R~ Ycz͌)T hDD ""H8%}-֚`8te> !,ʕ?ʕѮ ߃I*AnU6-Ň{k22]ZB6 :bwUPXIIh1|%N1%0؎3{dsҽ^]N }uypj{ ֺۖclT 4jTɖSNg3tUz}6I%rZ2;eUMdǨ̹a2xK1V5uaNX:ɫXbcӶs:RP Pʅs@gVL/x"qUVcUl6^%_|B@FXp ֈĔŽ0(cn.f)'^K oɶ{JmEZ21 V׍}tظ&wwDaE#EƂwT=r%Ȑ \:Jժ6R`49Ѯˌ_!MbT"l,7C)ؐ%o=\G.WNsjIQs+BB9Q~`#{o[' !نK{7y9~e7((^meP=qs36utcyZ9x;kN ~ $=_Lf= "v|G 64n^JBz~q3_ V4 apB vNq)Ԅ~-ig]Qg}^|R3e㨅87_k9Z!RC\jfP݇>}2@ ;w|Ӄta4_h(yZ.WKkܞ7K*4g`}x-F~Ibb+?_ KL.uJ#~;=zg~I,D:~8NǣF_׾Bn}7x7R:c OSantՇoԢaC hi3&8` T:>ͨS>(n1e`4̈ho(x5ɧ}D y)QH) q7ԈNPxT#t tyMQPfh=OaXE#( x1>Dxkp%9~BASv;QŲw4խw?OFi=ENuGqZkr&F!G4y? &(0#BX|;+gR:g<ΜRGAY 'SǏiQEk?Nbq_r'[ۃcvUDȲQ|pMm|ovgԶ1lC !㢢z``PQPPTCrYUQǙޥc':1k%"m4} IDATNsQN<S^#ھ2=q[=SQ3: Ɩk8#fgu''F'^(@iVOViؠ!{Țc7a4W#5C{U'դnҕY c8`/tjMF flG˧0iMBV.ڕ%m0<6^v[NƤ<8ӻȴdD϶4WF1@c2'F1\@u<SAs5 yu?oޠCZ4`s_ÏWN0min8_riq2Z_ 7,Z7DE_\(P2 .e;RPAqnœnq3RσA;˷__Vw8[+Uym cFA%gT/[M:On}kBqOWRlco#!L(?ljrtb~~6|P?0j&vC˘\u 1lnͦ-arB;v -SPKV2ulߺ3勽<lX<={w篘Գ2Gɉ_`{|mbiWN]1'uNOY35?9v%#cwXi;̠sRDxjʲ<{v\Ϭ,dgɃ4K8g.ay?+J +mfOc 0ٛ"RN̿ьڑ1h jeYd:_[;.oV>Ց;8ful ~Ztm1ն!g=)?~hY+V^J|7r1oGv!DEEEǙ3T(_?ΜtRxzz:Zj`5̇T]waԊ". PzMl緵[04N⮨@N)tpL&*ڈ{'7՛rA)_J6XRh;Z^3R0䣰@%=2Oůr-RJkVi<!Y`*DXc5"]{ kQpE٠t:A449Ŕ<%rTK>+9KR#0Gej7sv:]1H9DϠAL r\SicA|7/=љz$w"uTW\_ FT݆c'a*:qZk+Ј;>_cPU{~iWɳFqub}L桢t/q?K+ C#gĝYxtꋦswflStO0z.Fkc+sGgh̗O'[jtIUw ~2!,[O~L/K/xzzf d^fyd(B`ewVlovG`u|em|t"|G.UUfӓ*U&{Rp3/fʘu3ɋ 1BD vb9?g̭{6(f Nя.߹VM)-60ad VwXq|zүr|rB D~ \С sHVܨߧ>N5f/b|yn?NfpӃOG5#SX>Mo ק]\rlh)*0jBN*Cө~-L՟.?:u΍*EjҤTqV< iUL9PkYhfQ?Nsg(:-/˗߼B38u#&Q1b*JGaT@lk48y%3v{MjqI'tn+_ծl+.*`+S۩F8ṟ##T.z t8|,΅:Qfq<?YZ4R,򾦇!t+upBIɵMsr{U)C!~DV%?2?C.TбJKd߸vL=/:J@cS7&`MYl@CvjfW@rԲ.{ʾX*Ґg-q-Q<eo_~``lXr @ŊDh3 q+aWqZ,6"zFAA!l=[}Kȱ_DB3Jԅ(E`n']FV$&0Da$ጷi {P#΄\FO!"CC㋑%+S>TJ甜ɉB!$/-V<$=CtTnIQ2H>;ry_zC͍s'8pRfӔhF#WT*J}{i<>EEEIB, =a *^@%{RWeP0!I&I áV!IBq"kȜ0!B, !L)2-Old2Z,݅:;Fv huB#!, :. :Ȓ $X<=1=QJR /<aX6n0գz5nOwձ埠`0qUJjVIP>W qgzQmQF=vHH%qct^h\WĤKwFY:jԁnZp╍LߖzPu?>\}J= G5.5i|~#{Ov#WI1-(89%yT|k,MPAQUT84-|+c}/ּ T)J­s~p]9,ۼ>coZnbwxV-`4l²7_[_99vB(m~9ItGD/ܰ^ם|pF(Ƃ^ҾZ(_̩*gq o2yEjywwOe*/6~1:wbrk|d6I]\\]1!TĢ ڭΊ0HIw8X/}0e/3m(Kf,y.eGY{z&S\|i3uÄ k1iN.D[1Gn#[ZWah͸u0{ep{Fip-O5X0&6Wb8p֝z=r {sX{n~>5cPv~qۉpxƌv(߿eziG*)(Pr䉕3.E0_ 'N;Zϲ}g B* ٣|/R.EW1.YWIoŧ^L[ e @6I8OVeJ%'Vҹpz}u^2%al,l^1^z `@Jɑ?eakߧܴdrN| (^ುT4mIǻ[.jEL)kzPn׷] j͑+&/HԆ DX} dPP'yիܾ%O4/„Y}^r2P2u(2f}ak\Wz3OMT/o .Howbn>sU^ohI>7eFmNx,YvxŌB% 4$ !=1_Jp2avYJtR'xJ{wRpq)2v++ՙEԕH4S#̟_1l ڋ4.lԻU|[?|\b|/h]ŐtrU7 %=\xCE%1L^bvxKro0 W`.yt,pɁblbBj -'q5?YB,atͅ7ItnѠcYΞϡ{-CTr-\O_&o -[" ^i?t ߬]ī~{p\Nm3Eo3f_>N_ŋX43dԡT?WٔO,#\+eLD0E\¥?^_Q 9|> Jh\+V_q+PB" P`Ȼ!Ȟ۬hdԈwZt+g'bjx~.o_ˑ's;gn꭛`۴Ua%,ޓJcLӷg˃ɖP=qs6uG#7&~BFJҤ~{Zq.O (j=>k"k@ӒX(Q6{~df߸&hˆŬlAO co9]1姑يBlHLܔQfٛ(kH{]%XSMͨxWKjתO$VkS_˖7Ӱ~0]ǟ;03$]ghЀ+/љ*td@;||0MzqKm3DLztIϾX7-=v^mc^ʵòCANsͼ|cj ۛ_r qudtq ɳSHʄ0sg(:oSׯK?wVs+L4VL8Wc:QQǥ᝞e.um㒺KVݿ]hWN]TdW6,S덀qęcG ꝏ#GV5%q!"7SsOcKHgS:J@cS7&`MYl@CvjfWnWٕuWo,ˎu2. B!Dvg ´oS `⟑TX!Bd+xZ񌓞0!B, !L!" HB!„B!0!B, !L!" HB!„B!0!B, !L!" HB!„q~מXz[0vcBi„,=QZgf:VpjVqMO l9Op\ .UUV#ZM9츖6ì}ͱB<u&=ל5jPaGOU ;w{Ӭ^j5Oq-B╍LߖzPu?>\}= G5.5i|~#{Rv9BDIb4l,~|2ypei;Wzrk@b9P,?Ё=l]1\>I Ӹmv\y|xD1/OӶUN=޴7OK,{fiٸt3^}Frx89ឯ4Agض3R:zV\t~)ˠD'[q$qdZ@Bf/uġus{{IBd ?X3*e.k6b7/=|#mbI/3k.͓گOY3AWAh;sٰm#+qM9Oٌ+_e,9Uie0$.=kX^JU)mRKC:o]^,)w]+;Awݱ^>dkfXU< X"NdQ؏5:vH]yo}DgrK)Vx..EyB}+\]"k)V&rĐRx%]}q(v=bG+0OʷP**/dx IDATj’\1˟_d5ST `k/Q!eXᓥ/7'; c%} K(;{/NCX0b fZq :ح8حR0!>x,YvxŌBIEB"x5lCYpήf_6 g}3%,\BU Iwh+gŽFDX go%Z۠q\bnυL<?|Xogl;UUѢ/c[=hOOX19L=hL 7]0c!ޢC E₫}0TW KuhW+Cшٿ = pb.Rrp]W]/` jf!e&$?S?ޓdi|@-'s \ąj"躎vs+Sߟɶ2xܫ%0u$D_$JѴ';|˙{Z1,GF )f=>k"kHRXwlMРIyL8QEC,=)}_}éM#D !D2mE˼jޖ0Ty~ Ϡ{מ;0WʡKq~>y0r}JV|09? ]nІ7r1>3!,nI񞔡(wMחC` >rQ%~t6_`NKBE;_DPf /ӪNudPt#%ռ[֪>۾þbØBI Y7N.OMh_.M_^M~R/3Šͨՠ+/`xNOz2Z}qI%tn+_ծl+.*`+S۩F8ṟ#NT>rjUQcB!2+}154VzjKzjK 4GrM!@3Fbpū+Dj ֭[+؄Qr;Uvhݮ=wꎾ? v!;x +<}uF m/bgbXΦ/E6mѮUxȒEbԵ}ѳErd?p녏NXFF!+t(ְ #()w~ 㧙0L838(2hyhԲ9R,PyWtj xu/YSLmOby'կae9/7'=iSCicnpW&6tN1%11:؀):2E1ME tnĆlOuFcE`5ѵk7t ;} < ] ܓYSp`ş>XyC6fozc[\sC[TzzeLL|) U-hND:vcƞwr \RC<#1oT,Jo6{ m#Wt3N91~_}-fu*S6Nl~7JB!0'ѳJ oKgZKg_ׯIqPh{R-$ k#6l*Ǿ[z6UDRb< ջ7 PnV}99$ 5֌GU.?Fҭ0&5|lèlQÄ%3=^Վ[HY)vc 7d$d= 33HJAr?*q%6;CiϮƼި-R*}ED1AU`Ǒ^nTCY@+|oz7`a '|+4e#'X.\Z"cۑc(5؄QPsmf3 gxm 4LJ]Sl]>q _Aȓq6z5]w/^C>›3mxYgFhۯo zhrl;y7`kFwp-=`K,ͷFQtyn]ڱ}8_=`Ax^kk^Yغg|;GzPߡ1Ro~w/X!~;V5s5>'jh{_z]w'$ˉPb*Palj{6jqM|O&zaɒP;`ۘ\1 ˁI@\qy' kf k/@kBB˂7!4AΧq%^/O \Q'L.6͞V'](g|Bl::-GH]Kg_#y1#uⷩg= *>X/5gf+'ؓw|ocO66D.Ѣ]<뿚/ק㌫y 1e|[_)ݎ+t9?w#Bu4nlVn؈f6*79;7O 6aƷ ߾0O~{9 \>}6uq8-%9bD߻etWxM' k~ʅDz86ǂ'TѸY<@: NuJrVC_^59k'/kxF҆WwŊ~sVz̅ob3Qx6Fͭ`K75\}>>ۆLCߑ=o]W>K_ÐGZdⳉocEA+:Z Y= w ~ٙ O|WTq)= ߯=Z.Vb=8C#4 w7Vۍ:hvZthP^dEb⿐T> -k&af*~k ; iuu`듰:#r:U.o1^{v~Mهo^{ qˉb1la߀w/ݗ>ƎoǪn/Z};Eag·b:>YuE}S/JDQ웃Vaoށ'T`߀9~ˏMºJit:8G,{J5/`'4szCGǮ}'}݆Gcpɨ1xF֌ƾg?/MX,Y@fؓ7k^ǵu˲՛q V@l|5d<[𹜽à` U\{w"f4@>͑l΅d% )\r؅ HJCfkx3kLV|T@+u&0?첐`!'g,Ɲ? =57܇)".!vN*~L+> :q89n'Yزv."w1~)U/4[Woo~1%>x6wO^`k-pۘ1x1qv;LҺù5;m[drWcÈk.s>q=@ZKHd?WWDkS9r&U“qGy6 X[R|. {{,8Gvd4m^4NYo UR ~|4 uĸ`'0}~ 4crۑ^|yKD\h_K~_hL36S7%=`' wob|P]:x,ށ?yеGY30;W~8PZOX؛.| gANV&o< Ed!S]_zR,z9=r!d mK`] \y)NJ:h%4@ǒ_`q@aʕVŇJ#_ "وUDW If XYs&Ċ^ztn::<[3ŭ]O@e!Xxr+tĥWF 'I ;gҀ5+3o.)Mޭ Ӫu`ƶ_>vvs`/o/Qiqq<;Dw~r{U|?`^BMdTݎ]7;o?m9<<~JBj8R1σS"; {؝_쟇w>Z4W)mWr_T"SpA8l)kӘa%nk=EjMT 펐?Zq JJGz2p_q2礠bZܑذ)كy|q)߁lp)>Ca%GžDwYTU?O R]yg;dժ sp8ӆG>0gCa#gOĦ#׸S}ȅ{s  HġS1n9q!6`2&^{|gq?p:mbzR:ފGޅYFr+2.x?'[6dX ,߂$I., ż_ƒ ](a >z|:p~vş}.@f၍>}]JÇC[Ǜ#Fv|xәxwE:'l{'BQRXf yx{~4 p2| 0;iAk@=V}8NV]7Xoނ=^p=u^L+ČÐy^<ޫ0nP# a}hmѩm|zQx*v`ZCFs<*XiٳJ+kwWտ ii8`>Il r V朅V 6v9)8qz`0dw/yͩX-˃\*?}pbz C[aw K,LyP1e}lTU߀s`#vwFaW8iEx2`#n\uNQ`ggW^diM+e{kd@F ޿WήO)t.~%s[LmL?V~ZIFظ*.!E7g#>f]TNpVឍ](~V/N%_+`oRq+8HHFr{ ~v&~]%ޞu&VjyڞHi~)z_ <ez@Bv[|OÛc9 rmU =j$m{x;Gs؈E]0r%Ug>zj^ 'U+4rL'# t/y]ְ!jY`?vb9]o=!'5ڏ>]o#e9y4ftxwl|fUA֭\\o=4 K^xbp'P\[ټ2="t<2mwQ֏|W48ƶ/ h}eh[0wd<:q9j$ j+' {bj+<].ko>9uQz ^yAX{p7 IDAT gNPaxh'|8M/؞ +yN'fޚ{OF^݌_ZU~^;_C뫟[_ %o:X5j.7gc[ޣ㴹<yc7 (/Fm`R:l~W lJX,8pc} ^/{Ɖ7Km~Nq5Nl x\*X_܏K]&K=6aDѿ_C.V}xgQ=1k`O ZrFM{]Reii-^3q ֭ZTD<3v⶧<+Xmmie5isSѕceS) jj/h1O~/+U^p" F5 7M<^/G0=c=/ m|Q_g6`Dki炈{5X{? :)CEKc}t6~&( '⺷~u2^Jਖ਼0k`Ќ_d96!"""6aDDDDQ&( ؄E0"""(`FDDDlˆMQ #"""6a(3(p+]lJQRR:,DDD1CHNNa ߑvZغu 2ArJLŤCa-]LQ +E?82DDDQe!99 kFŊe"MX)KOOb/ODDttaV@E0 Q}1E 0"""(`FDDDlˆMQ #"""6aDDDDQ&( ؄E0"""(`FDDDlˆXlQtkڄ/1Cr>j ;*_(""cQ@9uvDtl6f+vfpO)x/WO'ւmXa=ރ\Qj4j 9B56aV%Qiĸ-;:r}mv^7KhoXܜ\n 2MbݺXa=4n"ӥ\eҲFPDDűbg&ڜP X1${ѦA ؙ 'ʱg4n܄ X1$$ģqس{Lr#&,RܽHDt:CbW)Dqq!x%$$mH͑:OZEE"{."""HӪJE ԅ+/;R牸XmJ"jE^p8k{KMXI/pLJZGDDDe#Ե9:7%=>b +P/huDDDաŴXhŠ{CyQ [ÁjOG/>3q1nWDDD!q|)>3lXаQCe\nq):]IfV]@9""r?֬F1m׮ƍ_MqlZ'MW_}'=jժCc$p?iHRh+bPn9Z2NDD|dLeiOzsU/}G`ag _0xbZdʎae[ѩS'TZժUCΝ181epcWc0ƋqvqZ{m=v[88Sф{q՛0Lj 77?8c2]s+_|r2>qŵgb#w`oSa&H*'}Faȃb…r+|O?Plpn5.~󾞂^΍CQĿI.X^ ʺ v.W/[ܜl<7t *T]< 7W_y8GpAHO ~Cq[o/fO;w\'gf { }mrm|gѾ];<5|8blĮJ|Bq1L܉n?kKm:EuoKg o@=wݻkϫ1djV F݅zv]F8{n s*Zh6qG$TY6a|aLq91""ƳCGbr2z(xY+h{bGQeoXsPs~_Uo퀊 7ifvmۺ6bMl,2Dz> uRQu_f'➷fbS>h//vS)Kc˜i}1Zǁ9pjK,Pt My"cʇ_ֿ7dg㙡!9": o(yN4êX i~<2)|dsCy8݊[#fY RéTUnƒ:-;񰐀;;V /%'*z&ڦol osg^=:JB%ԭWg{Q2 2l<=H\70 bEx݋6޿H=~3aU10&xhaXj5:wt$7bO vmbU8 ڑ驰݃6PcX6aFwfAU q^_ >2m޽9]=Om:erMsIHre.X^Rnĭ2&_<1ވ' ֬Ĉ!wrժa6` kE&~{MXzVly;QL[YX׷wL4 ]ވ`ƽ5z^PFJ:5N7_/: w_jᦑoai\'SaǮ<OEʉhp̜9fĬݜqS^ky>[\ t(&,T|.|\'DDǜ.Kn Um<vV͞/<8\7{` V~|n}PH`!p X|K׷/ c^klĆ?$.$&&o>N/'_<^;f#^l]߽p\S4X1{ qo& hw.`gcavt^G+"WmB r-nS[jJHnu9\Ld%":&u;jg&'S[h>`4SEn|en<zbF$Kիnk/cC{\K,Їƀ[o5W]MOeyr*{kZh'=oJCگ7{ID1pCaq㐖X'3+/wUH24=O\1{P{-cWb?aWgA#UZ\ 2ťPKs[RB85ry{k15gx5 "AO^7a ೚oܹܹ ElРac- >3vwpNNNrXmalT30Ԕ+4 Oun@sE^(},/y;!˲pa~_?Щ^iq9BZXkBL_d/_`1hKDDDѣd[\e0Ǣ&ZMX!P1+yl5Z_UL߻Ť@9]u&,B[eiX"""@\eXĜH7a|stQMAmM5Vy&ڞJۥ6=nQc}/:sB Y`LO^<{5Vs}g""".Ɖ\!s+5e݄#xb l6"""&6EC˘"QkM邹]\ ?&?/2OD ,+ׇ ,@\|9l6bHExt[22b?۰db SBB*!#LBɁ6ASXS2/eՄC5jsj/errz::ZNt>px^"b"˲p09\^XLBr${-^fJ S_`?2}E1y"dY*RzLQYt:5}VRoK`^P瘰D3a6ֹ]P.Qq޲㏩=CDD=?`\U<4.hBecyM/C_zr*&s\%S,&fX9=Q,+Pv˸c$XJ } Ez(|K-OclX_Gu\i"~Nunqp̔/pPOEhC2 Q#햓Lq}.s14.YhƁbr/x刈(:ش^)r}`Pn1%i Tc]D)%DDD>ٶ69:}ƲF1M1IR&,R]S[M\ʚS䗬뷜CqjS9h1IGUY&A_*ʻ]LE*f#\>ڞʞZ]0]+-&򥢴0kv?.<^&K:~{>3q ʯ`@DDtsw`YEPp|S:DNnB)ܸ Vg1K˽zKT֨G˩&JUΫUcTΫQs ?8~.˲쬬LGSVs);R-*&ju.Xn \Ɓc z 9ǟS1.ΟqbTΩ8@fу|z3rjLq}#"Z(@F*njnTL ;07ן[N)iv\+&́!p+hF^| /Ss=.c>7MV9 שO-gzLɻ^r,c扈kIy^Fn%0雊5b*sȘ?V{97ӹ%VMX8}n9bnk\PL)n~N5W+7ujNAbzר>ẆkW=ϟӟR YO{S$XJ\$=6j- %73HoZn11͔fWc8y^=CSy},*P"07 ?**g*Z~gJ.6 rwyT7`N~GLeSOUULL{9&"F@E2*Uӣ"M>cӌӏSEU^MsY6a'[ZVs}0ԩj.bzAq*fi11kTu0=n˱)oQRyc՚%Qk\od]/=ML"Tsڄ\.z*-.:_?@俰Δzlcu^ 7VP)STK[oLq˸dbDDM1ŀ렚z6ǪqW1SS&9ZL6h*/}2B9D"ՄE͂bU\^4pXezL5jRPp?ce,)K#"dZM럤-935LncARc}s,ټsG+*o2'bQ&AAc.e̓~Zy^oz^xMujoj7woj2=^mbDDuM1ur,njv&j)/`S*M>vMd^<*ʺ s~3_XyUӣ?荖㥚.Uc*AgTc'ᏩPcjS gLDDG:Vk3HyqsjS5*7]8Հ?jS2CQc0@\r .P )66Wjn͏jX_oǟWSןXyKDD;LkN\Q:=&j]sMorr nT^Mشs-QeՄI6*\e `6 ߕcp#Tcd#V=kί({K+*n\*<Ĕ3ň(65 0ـȽq9;8q?7Tzmƀ1V}XLR&A /~|$&J[չqIX=/0:LwԦ^Krns Ei &1C5;XS{S sM d\ 6"ʲ sPxWs=Ǡu(,*հ9͘+j6ܦZP눈:}.s@uPXb"tZy'Mϩoz)\cJ\F>V|(]_ ( ͕#b9X@9z1rӿS̩ &Z"".zF֪7uVT̔39s1rjte*MAFŀBA)U SSwgPʧ@XP8Ʀ>L*.s2z,X\ɱ˽"nb|r{bjPw;.ܜ̫q[N˽+2l.Qi`shcc˘˙\jNy}.3M:Ssbɹ7q7y89S{*`­'"#@֛Yιɜs@5q p(DDT~s9n{SLXƋXyl.PYPY'Tc-/k<%9bSI ylLcŔ{EGƴz~D&dXrPjuEEs̛juXx8"q""*H,n(I46'sr8"&*&r3d ."9[gjhd N61:S(1DDtt)Nc qkbd2n:F^PMBRx((Z: bɽ.9M)ǁ9"":6j r)SL'^gʙbNMs7ԅR\C=wqܚYjL 96M"UCDDGPԸ580M1]:S=`cMRx(Z[F'XCe:Δ7$6WDDDHxbjL1[tNMǺ 6ԺbC5չ5DZmsqJ| %9VI`Ǻ[6ֹոun5zS$: ڰé˜έmp[""*{w5Lnc)P]y0ԇSZC}PY\ әr2&[( sSBmdN's΃ >Ժb+?)i}s̅;71՘b`y7=b_q`Ǚ$kd.y0]\}HX wL@Zp&&0)b)= 0#crcsQ|ɹF0ǂ p+e !zS;֚c%""*oʆ˄M Q3 xnaQrDDtbUl 7:6VDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDTvo*c+YIENDB`kraft-1.2.2/manual/images/en/catalog_standard_template.png000066400000000000000000001074471467704360200236700ustar00rootroot00000000000000PNG  IHDR}M pHYs+ IDATx^w\]a&!lōX ""ZܵUUZ{=^:[ZbuV n&PEH~%sw]{><&%5 0 @ a0B! @ a0B! @DbaS"#ssUKzF1l5kkEVիUV]b3SSaT"#Y[ +[X[[ + jubRRMAT9CF@8*rC@ P ^aXNXAiW􁞕<_ R^8mlO󤾹1g0ZZs;Vvv07߸k8Se.kò,9 ~y\8Ӑ1KjٌQ|~ͳS{whj"""FZuK"Z#j> mw.U"MLٿ?jx{i k*Fʉk|pxgth%,*Ja@İeV$ [_XM&N^䝞ڷ~fƴ)#_͸lÆsbyeX3JOl }BfEhᕗ_穙*&9rⰤ}cNgôKviE^chk>0,#""aaXH' k|ˤԭyLP\n|ogLӀQ#ܪq)zvFϢYü\Iv?w/hPPs.=N ջiuruMMkߴwIw6NX8*秷,535k󫯽k'X~a-sVc M#UL[ҿ~x|ˏ53;~_ie.& ,֎/cg_6|fm? DFV{CcSuf>SovAE}k0VBO^Lur7aOpA_ AGƦet[} ?qONŧN8Y{`o5gQWd ]L\66 je=5mF_o:et(ޓ5'+"xۨ!gDfmܮUwe{M[enj6fE6n0wxՎkr^gܬPVku7>oǟ>OKHtfٶ훗O֪L/=#o6m]=={Υ5~$2i>jϼVo۶omZAFYi9?lٶvT'vH9}u: ȉܿ9̤W^/4T;; I'֯<}憭~Gc8>/(]g߲u˚'׫{V0K.Pnxk'DD3|uM[a楃wSٚSKOi7~+F6ihKLa>^ܒY l= 9tmŤcݹ3:4\MDĘQǀa 9;X:Ș%I>_ݥ{u k~ĥ$y֢B!]vk'y>~#KI^7jѯ٢BVxoro"qۭLG$Wn cP˾>K] [ݴ"-*7e=gN52ˌW]CXF'{=ޕGzoc3&0|ˊeX|>eIO2ˋ]W޲R!Ӗ}}?y!7i$&j(Ǐy'#N?4Nk@^6^DfkS/[^ĩxg[O.]Mט8P")r޼Mo4Q 4II8U..[MD&'Ê҂i q-et)-'i~<yxVJzi.9!9^;WgfTa=4ò,khTpϲ,vyj-QօuC\~aY>#FmRx+K>5o͑ڲ'm 눿z:<"bs I(ȾȬ̜PӀ>vM/d ԤT P nH\-=9J¨.fOAMI;e:)/B,E//P]8ܯfanㆴ^\V+5Sxb2O YIIR;C$2muXSOioD[Ȗ˙Neaj]rg >!dÊ̘R+C>KDE_4P&nQ_ .hiۄ*ORu<׻mégs^[|߂|m[z3!&V."Nt~cyr7*Y36v9r?#r">^z;[~%.'$g䎮CIt폿ttfxb-jIƺ d\I T(QMgn* le:թkC|γ4"ϖػ sRCīnmBF$HS-mPtZ5t7<)c3[&0t>6g~[ ^]Mn1ƮC͝nE|,^zBʼngw6nw3Zˮ߮Pz~9i14sٞ?v/ U1z&թ'.n0iDԣW#kԝ;V-%Ol1; x5J6׏.I>\i zV;֋%""Qν[mW{,Lrqf&ONU4p1w=R?TTx[KGD\n {5ҩk {>5tV|GM)7;|%׳h1]YJ>9"]]0DnY T(֪k|BTS;}7ᘑA͎mY_$""Bvn-v'es:Q_6 aRRӄeoڵ[V ^8`}1)4,Ʀg }l[NaTZMka3xwwY_a)3 a P@NS*EUW^^^JJяsAy37ǶW>Ca! _}A\KX$&$޻wNX7L237= a0B! @ a0*o-1yyy "5ˤ2"! cRM4%òº 07Sdr/@@m dބI9PZ@FڿNmr37vcdoڦÍ@y93?J}y;'>-;))G:2XۻևE㔃?,S&e:VWX:s[ƒ\MC᳦`+9Iԫ]LDĥFܼekY#-NZ4pwŜ=wk2? ?СM=)CD|ng#5N5vBiV Pii5 {a$ϓܜˤKLL òelv:Rg/T}|yS_wך7-يiNIʋ?n5x⚙mJ5S=bHswmm.y'<&(Ʀp Q^RRXL I966z :5%]Ϥ>e2W(F#DTbF;H$X,,d(?N=.8M\L`@^ /Dss@O]'WZt~y_o^ghleەl0 n+54̥M3Erunnn>|9#"^8ܠ^E|Z}=x!+Pfx;ݳz:;wz剸rG}_6­Xʮ];)CDİ)ݯgSv䉈G{WOW'ユED20 ٭C>ןH;o?ݻtGCT,+iJUlё+ 2STR5j2x"S #">/gO:yܥ)z4uGh4iiiūïk4Ai5 Jwsą-r"p7}OhxjiY[e6\iv#وnآ PxQε4ӏ cFޱhst@wЏaaG:'fSגMj#J 7w A,tp'vD4[ӡk{:q7JzkٴK}&͛ vȴ:cHTnȨHeZZreZZdTdݺXAx+ڇuG;L2zuO԰8p҄هLiSi֞V@@Խ݆~!%0|:JKҵgo<戈}q]tS[0"So/+3J=eō>bKKgϔRLQ #w߫!Kk+اa`Ɛ%V֢}S0`kw^]0z_;q)]J>ˈ]le MLZJIIJ(LtFʄ'UD*).Uzms=xVϴv l'"FdZP'^|z3*#Ճ6e3}alCe̓QYDQCIbr㤨ymaFBZnjOD qrlĀxS+E YGϔFfLOܻ֗<"?P~R]C;Ri١?&lZf yԟ&1g͠j 2c!Cwd.R?!^yϥڦ]O4b)ڜs0Gzy~!sek3g =ݜ;X(WLf,-ݵ]GOoy0`ͻ|5,8!w㗃z /1염 fv`Dz'oc7%e=PɊT<u5$75fKSXL'Fײazv<3oܸAAY(,yQ?&5IeˋhZ;rS"S2p6*]H333a)TDZXQ.^rtp}ޓ6.!?ĕNae aH}W?~+rK9FF%| *8L=hMڧc+dKJUٹao`ea!'HDXQ2e I$cccaiEBko- d@a0Bi99975V2-[?k("f,,@DDq o}[4aeeqaiv@%03p?$,o?#@҆kC7N"a9T|nk2ќ4.N:|'kO{|>aTݏV% tiPIFnz&u;\me=H2VLX\j9P%Vi>ȍ_[H`\ݺ>qe.J#mK8j IDAT_fV ki\Pk7~Z!̙u>;'" sL[}/E\Ou3VClB7sj[uPjZY^=+e]JAThpw-t^WOtoD8֕\6 763\ƠkrzΜ&Yw Mi)1 ddpdhIތ0-ȯtVC-RǦ]bGg_m aШ,u/- e""R+U9zzDDDRy(-9ZQu}rO^XND {F<"~j[FVy;sI P5U0};m}M)wv5б3tO_|IyFI\Av0mR Us,cGVVƿ(XH\G UM`~sʹJg#ݍu_Teſ\S#WSj FG_~oӂB2*Ż^C4w3xHa&i/\@WqQ=="Cʉ8gkCz C$ W2!gD ֒+T}dp,CE9! :EФ5wU L֭WESʕ G:T!Js52c^:eNm0K}帇1 Ҵ ҕWڴ⟋\_o-(ĩoկ::ED@+aUF0a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0B! @ a0Bi? X',bccYV$,`baAkټwV,۲Esaiv֎R=M0B! @AES^VTuv He2a@T0zMjŠ...Ndd uoRզ222>$ "KKˬ̬pH墪 y~$>VFZ|{rDD4ra1'ǼUr97J +i-hJr >*˹ݫ;z|E` Z4Gە[+KQgk |ejtx7y Pyy͏p+OxS#,gc{wt6J}A *ӳ=S * [ ,xU7%Q?z%u, #wtKDa[umfz >8 ÈuV 5YAԈ=~AB6kdQeI4.ni[Zvk:Sn WN+NUNjNmN|69"iF}ykrp$iRGO[dңMu ]}^=zʥWRdĭc=wKgDGghn/cY]w4ͻm76_7ɠ>18>mܐDm$锘=8ZVy€W_?/0|wlͣg4b='{^Ϡ""'aV}7{x?Fk|7ܯwY Ut1|CWmn..t)SϬ8,>fu&,ˊD"ea 2fH;ptmмCLŹSI""">-|׌^oPDJvĆ/z+y;_{Ժ|]+4 ç߲#ebN - %z{L^oy]IG U|1nP޳գ<;z`T6w>]]>Ͻ*^yy|<:/ +tJ9xp!7+8Ğ -4 m>bH'[kYj̹GgwWҡ=4w~CB[S͕֘C}m69rU7n(\~ƍV};r~]Be_Vn/I3OW'%`_o~ ?O+"xBȶׂG \;6_ilNHrWVm \lc\: !"N_ͧ #Z#DJk'n %"SlZrImtjLУ;ZkxсSvJyp Sۀ%K7{>ivoeMQǭրK:wZ_ԗIUʫ\~4Vw&*؀yc. Udf ak?lp'sbky>wT691so_3i{71t,;tJXC1|yk6Fpe~%rFiOu{6sMn>KL6ˋN/2Jv1=$(BEŇG4UHbXFcɓ""F\r}=][E{;C6ZJOx^\,`HHyYWm^$b8{CS|Mٹi`͈5)IdniμZ9`];~zװwc"MYjU@"Zju@M wXņ$T44)ybK>XC "1kޡ+5QY""eYXeY4<{wP\q,%WH\ͫ " #5U]#RHj"e{'ܠ[׬+V<]+hTa,Hd]Vrui<+R%=4yQ6hvÀPBlGr^\Lы( C$LwHR>)>Bc;k;fMƮQM{Jf> `̼yhM1&- 99^o)M2#x1D3 2>mNKUr/x'{X%oF0g}-V=$"۵jA.s'OFYX%mSwbe?c[`HP(,z?ٱۍx%1̋ä}.Vj!q~4vzݱ+σڝ&b۳ OUܔVv/[#KbFXv|IGgc{734D:Uj{.{+[79s든)rO9yڎrs2ܺ,kۖ *mل!ek*"Rdž<&bQ\<UcKŧ̓]kO爸ȻϲJ} =*# Sn=y?9GʌF}gAܸB;to/e>ކ!_W+ތJ*6qʘadn6M4{Uk9kdZΦրE 5-tl /3gFRXM8wiڋuȐMؾ[<{ ='撞y# ؼ[ m\?jĄlVfӤCE?koZlݮ,)Qu/yŲ!^O34bmVQhDh9k"WnRE锖VǤ፮\Ԧ 9ޱcGa̙3M4VhNGhV{%^Ax[\ ,}K%_\@y,+b dh*O|]ͳ7Uo9H٩{?@yjaPɍ5KHV@b,ʅ:, 366F_ xUs|頻6Md`gaa!ebJP6U- 6irHaEU'JmmI$a@T0͚gdDwja@x' d@a0B! @ a0B! @ a0B! @ a0B! % P oIIM%FFfef +4hЀeʾ7L @@ H,,x{j:***3+KX@ar(K+Ks33aTĻ6V "B|fm@_0 @ wr=9ybPp6wʑ^XQw9Tr(ۦ˽c[׮!+Z9jئQ/)-Xk1 mn9psQ?utuޮRy>-|׌^o坞5vةܣG~ڽ[wzb% =W8xeخs.ncSLVOg]m #{zg'WϞC-7Vbߦ~\ݺ^3.l0KN|O톒'*Ъ"* 1ӽ[!~GD/&DzRϬ8,>fn-! }qq׮Fqu)*ThF拏i<*"(4ù4)xބߙ7 >?0#"" +ŞƌK>fSגMjj?[t΅-~@VR_[(!ÇI5jKI8xP3sLsgZ=\3o;aq"Ěwjpqbfqk36U4|f˧o^l ظf/f-5-kNcyL޿.lufYkӖ6|MƬ5YkW/i*g`Ywa^?c:dH ށz&l_ԭ$[cRRӄeoիNmZ K*&eN:8mHZKҷi"wb{oKl?va!F0a0B! @ a0B! @g/ju؉1ϟ'$$UND"pQˌTrX"c7f>3 W^ n׶]KjիQ̳EֲE ${= yWש/QdIw<v"/^5ed_ّ]rrs99Z@K=̼nTqYI ̹^OZh *B+Wދп%  U yg{YG#,/3?wZ!IxLC#Ry>;7ZjкM=R"'\$MFz2qZGiW.'r|j.9~5o#5r0Xu_Ksig]]9%:ʊ9[@(iu ;q]۶% yɓŠ|~:s_p1w3!sx=8E䕗NǣҰ87VmvwsqgK<*`X5kFճGQ~=FlT-TrӝC=yjW.N}3n_8Gz#w %^A2'_j 1bKh܃=Qpk`'1kNʼ-q)vNkv< JJmytxOwtu[Y}ĝ_!{zg'WϞCplչs!?_ahABBB{2>!Q*ynٽ')Ս c^ÌQ5OmXѝ`H}yu]Ӷ/uuIn?tu^_<<2Z""˲ۙdl=\𱰿9ᇣɬm%;+j]sСMCDy77O\b!'Wz>_;qSx.I`n:waW_h!*~˷C!qQBM}}fhoaHצ]Z)/Puh*&ν}اѯ ҭخTLavqQG۶mcG6v\{bs1_;ה:ٗgb}5">~#?p+#-=>/}z\ͱ4t}Y\ںtZgI ƒ'ǘҚePcjlVҚǘ +6Nutݽڋykvn=K([_"{}8>]CV#4M7`Ȱ [{X3㚷c[ǡc$c/lnXgGvG1wnzϹeM=K`BGcB? B!0 BB!0@!uyk)EQ3D"C?ŪMx́Я}%Emlsdf~ӕ@bM$)(`]8Pݪ0@w" cUI2*=h/BtimGQGFw/תi"~M{ޓ"R$g3W~zdG߱oD e]6C-e^`ir4jZSoyޛ( U&}&M䋟y/Iu{s/]W@ٸrfmsU &8v-EY=?,]pyϞc!Qi3{_6,zv"A`) )g8=a$KX}xʇM|ȿnɋ?x$ A@K‹; :rd.n{ݜw1l/Mzd7v;1$C97l\1Xd)7q30^^.C]Ld6kPgg;g@iNCޖvW̆.|gО^ۻ2f,0Vn>^=}C+DIo9sn×-$1oG߹ų)o˚G/_x$.,My8Ra9^Sr+ Çw?2J_]w^7JrmME= vqz%ϥV 䴙y2*=M4g]ݾ[th9e剳~υt/8hBЩ@ rB.ҳ&n#r6[\ϣ[;w^s6OZ}!^z EæZ6ЬSBe_3BV5CzvٳǨ+HRBOlbXy\o@vԶ3 Zi6H$RU>9I(his2հѿ_wۣ_NjOHhִ)'$X4j*OAwZj\ hZRR}S$@^}7@ MM5@޾RN e*ֵT!]+ce-H=+=05MxGܺrf;-99#1p'SO`;F puu,mVr:涞G4B X94D}ȣA YeK~Z j?Ͼrɯ^ꗞ46c.eS xN4OEZVtwiWj3}]uHz-5;0!+/|A]YTEFvWd((IP4MS9wwwTֈz%TH%%Iz~ 2{$]G$$I8 )6T3u#H ٿtxJM2ĹMdT")hiq_ѢsiP ?V0$-|‚Fo*eT^]A7g I3J&F=#uȡW,>d;H -[?0[L>6彾`Y}N~Щ坴|CVw[_&oX;]6zus2IxD5;sRI]c6tǑ壃,k!|^X;nReP + >ZɋRT2?WǮ]7c=B㾵 >}jͯ=so.*,>3Buoőm նrp¾\y>;{0zCS]Lͨ1W]+F[-E>}344杇/ Pܔ{7CCnܼeFQ٬uVhS+J2^>w3["rDO'HĤU 4MӼG]zkfރ[v,*T".IKIӟ=(QTicZj #8 ZbyyɏgHhiac 5b]ĜY>2r?O?3En-t?1AДHkjRExF>OQik^i [6T OcTMJRSkao!'̌~!gRC-x2jfoʢEbΧ,u 5QMUUUOG(;4q%3K)z+UQ׺];^6pNٲeV3)o]Ӫ.N~-n֢/VмFʹj(4/~KSzrwQڴ6DžN-d.:;D+kn<:G#leK?3HѷQRS24od RLgZC|ODEedsR$;ѽ@jZ[hָ6A7I0 T8rr ZK}4FZC(#~\XB5,MkUiajl*qRScd-4R"y))"%Z6ie'pm ت}S@sҷrZKy#uhX.-LTjbcDj֢a||4Za.'r OS ߐ@4nՠ))K0h U30H+t˯З^G?VnbcQ1P2hbkr&\El ؟GT**q-U_O<"yI(zj0;X(MϡU Z" "e4iaʠRTJUYƾhbLgYyrN҂b!Y_IȨjEFE"gHZF6LxiѥbGYӨ8-a^[[#xSۯWCj7wmYOuM0lt9 l&Ą)bU5nJU| 0 2,MskMsBIQ@EWCl50[SI߲l1/>IF^~4נ y%*LyP֘~ 55GӕA̋ЬiSL~kQ_jOXc 0@c?ot!ЏaBjйWx?C]XRG+.-e>M_ ;7vQ0}+&ڶ}CN}S/GdI8Zmc߾Y[2IJmjFE]K^Մ=;dTWVvΝ9w6ӡ픋~ܠ4Ύ{p3.!zsumG,,,+ ɭrUwjgf~'խL_c{= H$:6dIJMݱ@^k5; mdk0䴦P{iUhEE}'0npg4''G 1#׼]w~0=4\]'ɉot+?yJkz5}ې$+[/d0;]xq6w[>xu餃ܵHI/=i3mEOsd@c[~:J;p;'ku@†{^H Z\W9m\՝[1uf7R0$ ]p9D{:$ƿf=o7x]ĉ]r:Hm]|Y ߶[Ws\Fz1NXESIBhun_ EŐOzШ54潆Yt9fBfOC+ym2i;y+a9}] "T<FW) )6n$Ltݵw|nWv~Ysf?0lֻn祤 q,̎ؠp|% KZ\,M=V6ROiH1lKU9K4F@eKGo%P\3:B}1͙wgb*7I1hc\>rMt3SDcߑfhȗibV+|p*8\UZ*c /+ R>JLLpA~c!`޸0ɕ*Z c|w7cH%%Iz~ U*˓hX(KϧOՃPzL>aՁEٿ4`srZӪg"{N$CZڤT24T?bwE%kAmf5m[倀/@@p+s<- Op9@*/r95wVG//)Puħrnn:ɖ271LlcTАxP'W Hݧ?q>((/*A- 7v#Xݻ9 ]GRzN}ı5'NFrZ-DL=SJaljZZ/Ijr*CDMrzI]o`Ze]QYWVoHt]xޢf!+<CGH2}7|CL1p캸I~UB$4;7f2^Sl-:rTVU}#ko(^~۰qUP/%W \V4M4%0Yf-;Y*ƥԴ::PBQσuڻ1ed h z4>͓R%.U|-weӎus/Bޞ[6 ۬VWy`nsxuhשt7" m:k;b[,\; nn=ȹ}MI`495oCioLvy0}urUvRcDoݺ=IG0ꐆ}Vo(;[9T 1 _9E7tW]M_OCйW|zM9 {.hbivN&^Pjr+.p[MDd%=cD>[okm+[B Qnk${ٷy8Z+U _N,Ѹ{ MBupm <3@!aB!`  BaB0 BB!0@!!!` TVt=#(+XP,[az4d{+ށ/+?λ4mϫT ]J$[Zv&ݎ'lkƶ}gm .}LCMٹw$5xsnuؒSq%2O>#ҵC.N.Rjmce]Zu}?51_-(_gVSx%VB(pC^dԇ{ʟ~ޚ5ݻ7Bhx. ~Ν36O'=\xJhh&+w%s =qdȈGfX/KKRJa?>z}bKmɞ9C{zulҮ˘(wo$[xx - յc~3w<̡@{GWWo;PK]gՂ!ӼG6oHq}Frwuqub6߾8]aO^]?i8p aUX,z- HmFzXjM4r2?TTiP̢֨!Jh)/P][K`0 _ _mm~v3m1B.ܞPԳ`7 \?\8m0KN'/YAʹ| b7}mኋeû4zի}=ǠEO\έ;N r)Xg/ߞꝗ]|V,6V&*_}f'yu䈀Ha걩={޳O¤ !:{XU.8 G<}!w/9P:x6 4XlˀN\=Nx-Vg hܥɞK!YuojtaBدI=+=05MJyw.q]Zo>)3F|_Y4=hU3ln ^/Ѡ-=P(Ymj%0[L65-rˁ2W/(% ?rw!dg| z;.Ut+V% ʐ]ZG ]&#+*i!O)I8IPyy„;["dZ@*W3:+asrZ*Ld> HK=;l1j7yG^1[ .H^o0}[?#W+w%\aԪNaP9Bѡ{;uqcmz:&$9p*J?dH\"e0nޚ%QͬLRӾs.޾6?7;}@{:e?$Pk٫n߈$ǩ"qtmUsnu:nUH`s7_cMrf4n)^~۰qUP/%MJ*ěW4Mj:{~}4 8I oKkkX痣 zk.}[ e5Ҕķ"i _/V6ijdH",x^Pwar_ @^=u_lԌ4?/##O@CP"  lbJJ_߈N/R -Jೆ(g}"g{,mז*&, w2WYNj1Raî.qc?jO7#V.8[:ìDŽ^OF9U2Vl =FfDÊ:">/ oٸq= !HHH404֖seff'4l,[cQ з(.)tuueK B!0 BB,Ϣɖ$!DG?` ~<[KBEG?[j[0oU Fu BN%AYXYX0o*?~~aз:'vR&e%H`;7پe+[k֭ݺX/"mTۻ^ڬv,'&@9"kV;Mmtt9v ~Y3{.+|z'`)mԳO"=cޡ9~Wxr޾4hD Y,ZG3@x5Hӎ/ٝ*;QYWvX,>sbV3ۮ@r:IiZ7۷U{yʪŎ\ي"LE}])ə4wvq+5t' $ GWwt5^ĬAqi't/^»ƗG r⤃>G5&l)'[Coh6KKL _ LE'| TՁMP{OGX1@ܺ-isq񜳬!ۯݺu}hO8͇]ٿis+=ˏ7 AݰOKv`u-[Yr~M}9:џɑ h74vv0xP !ܧMnMj2g b-+s9r"AMKq ؋!i?6bf<ټlGe>?b66ˈ-.zkz/GgMx5%b=tC dF r-/7eP mXu^l-j' }lh#>kbز icki7 ?-P-H|bTR(0$.,QV- pJ C}JaQqI~)O;iTl~~A@s| & `սR>kTՁ2B#Bݩ3B heq8ըTVU}#Aebm$Bk͍+gϟ=sSK:?0$ʼ!t&lFFR%wAJW}gcǍ[KՑZO϶\U_`hskގnn ޽fe6)*/t-APv;)1ӫ:mv-C˝9}/+&+-JQQvmeKBy8I$%Ͽ\!/]=-Ju!w$A !T`ނjOO0@ʪEOX I!"1P 0@!aB0 BEE,?ZffB/& 4OLs)**6nl![` ~$I6ib)[&B!aB!`  BaB0 B~}G#dB?ޗw}x8BI{s,IRHߜZve7CˏL;vͶCBa-omؿn=Wtb,hJhuKOjy/= ]hbzq 95 Hm'O?kJ==g#c; 7.kIuFmG1Ŕyyш{*cg9m fݶe9}*@ydH{hg%:Cr\6-{mѡ4>-H߸'@Є׆S9l?ky'VRS) L>l.K8e![Oh$w'`hi>9DbR" MРi29S;+|QK߻&~ƒ'LSDp|.ljqÉ9DuG [2wSFnsϏAtn%+F~*/)"⽍:ds|wגaAIBA]ϼ~ Zi€zG˻9t[{+vmLrNGՒkOȷoysƇ sW*-_-MK<4K3z``hȋ+-M n2p`w5ο2+na'Y>l>ENcqΉcvʮI۷<~H HN tiJ u'Gjq#˚Ri6싕6s7"}Մ}; o7 ܻj^S⎭+]1}˱Ŵu EE-Q%/,;pF!OKJiG^(YA[n֜q$]z A',&?9+P$1vT rTjȮP(Pn2b6_^>|']K vka%/'Q:=19/X Z .cOB>?0liS4ӂ7b6AKJ?D~jг4t Xf=saQi&0A\Z"@QT  Rej)۩Gw3.&]:5^uA%C8&,7C| 먉\Ǧ1Qbv~Cl4Y@ESrfWRA|+5.@JPO;HJӑgETzpWZ6VjA澔Hŷu5r936cҨ3gMl^^[_Mǽ{/2:߻ #"-;{4}.ٲpg PnG@[./jsYOΝ3^1! }(H(+MaYyGu]?\q6\\1eLy>bmŠr)K(@<9yƎg yy_@T34yiǢ{k'=g*pEBk_*3 H!,ŲB^[5۲k+ͩ]\PPTPKQӕ_ʧ@*`Z`s)IE}%bK`Z8s(dLj(X;p2a7sG);vѡ8!!qr/,x=CcmN}R.#yŒ#@,I☋giJ|wlΦl8:N~]|.zMwz-)Lmܣ-m{_+#xur>S'+חr8%ӖM WZ0 T[m >QAxVl1 G+'z:rTD\\մb֜d-i.}GJev晍 ʣW_$hiLIBTrRhL]{iED֫OcӤ "1cY^QAV{F"THuOZ_ʎɐВ^~,{q?UdmY {P[ HhX f@ e]rq}j_!@\|׀;y-*IDAT,q<U5o M{/%55hPf3`*nm=[LCE%/͜TsyHR~G8A.Nʫ~I]>1m[qżׯS`TAk 鷎\ΥbSL@./)D'%/qn[W'^9pOPV%%1gvi+4ۥO낦ZJzgh}/O7gvϙh*yyLԫZu4rt)ٝ(0޽SNjF>Soд/+uBLx*umTY. 3e'8}}4jOM{UaC!fzXj Iz(foh\rya{oN!T45>riF 紺5856P}| jFAQkDGQڍBVc{]Ë>E܆A`59KWpʭ$QNǨ0Pc'B#S6mixȇ |: (RM 6 9.l0JWN~OʭWwq3'/kK,6e^Lsx(ikhSuXgP5[-[N:@2kmJțN#spFTZµRn㾫#}Z?*1`0zJbCJ߳c4tt9t2,,yLeiaNJ$GYbF 9,$tC1$ؙ֭j<` KݼIvnk*_dfXqgM{.=\ a֪NskѰQ̬[.ݺu#BK>-B;qq͛5m,Z/1’*..>Сkׯ/_LSSSvz{xԐW:qeN!L$͙;cWOճǟQeU4tߖ~p /jȵT}DӴϢEϞ?0nc[Gu uM M'G[6mtŵ[Х׷٫cNN_s:Q˻s0K֕LqaJ7Cl?5sƈ"E;cvYo@CN5|=_lϜ;N(nܰaODDDE9AƎRԹ*5L u.;|֝kfq2SϾ`ղ:h0OD"s+꧝WvtXַ㳬qnŌ%Y|u+}|- .^1|+2B? 3g͖_$~LTscv29s')sOO0N훓%'lZjy4nluʧ֕=QrhYzl?yWH*DO\WµgX'ot= >gFv_}օ]wfwkW-nlca Ȏ;ޤUS(Θ5KIIy RCTqa!Zu!TTUWT[#yBPgW>i䤊yF5ۃ׼M#59Xv>䔯PqBRժjfz&JڍnaU kA$&Ӱf$ؤgWwiPc#_lk4fzE+jiҟ:|2 QAɑ|o"q)v0"RVp|}v{-6۽CيvW ]֙n}hgNMZlul{vз|nV|rx:v;[ZF|(z=n799>k,ї`ijM}8CFT:.]LD$(7 <Kkyw|ΡȢPy8k։1PF騪WWWWVVJ'jxbɓӿrng (dV2 rcc9j0P?= ՒuaBP`]"ْeJA Z\Vj8_|2%L6@0 ȟfJEff6UX dٳ `4ZYt"cM $d2)Uq5 d@! @ a0"<vZ6IENDB`kraft-1.2.2/manual/images/en/catalog_standard_work.png000066400000000000000000002411271467704360200230310ustar00rootroot00000000000000PNG  IHDRam@ pHYs+ IDATx^w|n* Aҋ`DׂbGvEł`o E.b\HQ=gw?6lvMq9yfϓB!B!B!B!B!B!B!B!B!B!B!0QrBw5Cc(@%[5HQ99FB!DHr Br@iZr=_!9` (ϭ>BEP}ܧjߊz>u]!UaTWۍxP[B!*jk;555~!@SSM?ZQS[SB!*jjאHkIqBc}zjTC#ZOj{{o#]}+"j{"HF灹VCQmTgY!"STgPUw]FB:Ue w滉zBx"U|pCUVgQOuՅP ꨭ!}UHPsC EuUe# ُ,l=Ch9prBNaJne9:βQ CUS[G>~BPTVT?X_.u](TeUYFly>8響HO!E>>8 EU2Q~U]elnF*L8˄+B##\2*Vej?톛os[.SM`}PBpZl ֧suAʄ\V~ 7ܗqsBꪬsj LRۃ~ 7czc:=Gos U !h"]<)=9Vp 7js w[c9+j~yB!DDy6=?ܶ=68ǂ*=T7?ܶJ ))MUBQU8l9~N mWV[v 5ϦV}z^>S6Bin}z^>n2懚We5=prb~ާrsWpە 7B*AmnEۼ.X^eʄNnXjzg:LN6rqwULuBQ3W[[VͫrUn9NN1'AxaɁ9us>zfݖuZΩtxem[\!*bBWֶqCi9~{iwZ֭L慥&P]=Oo %/ :SYqcԩӲj\_s6~=Wo: !S˺-z8S=J;8J_V9D*'dCY_9̫mr~bԦK*>8B V xqƣv:Ŝe)m}jq}jӗlMrB ^p腍:u}6SjMѧ*uNzBԼPTV8Gz/g( >;f_s>e SoSnB=l}mvͫSsl]TW݄U[F!DdUxw|5nχ3u[>+_v֧nNS==U?d/Xͩ8qmuʼM/B3(qgvmveBp[zǜ W>W>{ʼ: &XNDz`}P^zq=4c>mz~! Oe_Y}~>Jگ\N8W6ۼ`ۯ+CY)lj[_s6}=n17 !h qm5O/쩚yqWcnj[[W*Rue Vx8&j[z[S.W՘ ʭB^8T쳧nSL}a58SSm^*TM;rz<ÎA\nz1^vev\BNNBɁ}prBԌp`z޶vzPag\5ǎJqʢS[<u5Ʌm=nq[aaJi^sSj~hwz҆ڧsۺ !?*zܦnWœnEBsׯyڧy'nnVŎާJZ|9ٹN1;oێSl[\!˭ŋ:TjJ[-b,;nmve*y6ގgi6{ii=N1U"C_VSEɼ^9VfllRԅW_7qr h!eD+rb_ﯬ}zw3vRVś]Ɏzn`baыrZȘK[L- ̣KIQLcjFfF-,EɲB!?:_'7yi22vPxvj#Q:>XX"Zٜb6`rBi^}P 00/3 ۴a00JB!,HH{H\L>G ]ˏyȵJv;NU]WC?Nmv)G}hr–zvL!506WO~Sv"I*NߞR̒t.R߆B!jF訨1Z1\m}z洍jη#3AT*`Sa՘g`v W;*3O\fL1i/R7OnkbbńBkYIoLB`?4>J;n>-_^?TmjaաnΎyjAT1WEmD'`1 {b,@0!"Lxl )gzu}z P p+z֧Şy5ώbBqa!Eq[hLb ,_݉Ka$gɷBpXev9@])+aSS Lm7۶|䱃vòKSgbz8<Qkޤ8KLrN!GحVC鳯T9]SvLgP1 &"]Dp999} 1cU-=fsKVVqRpqY-*(ӤkRG[3!:CHl': /dmO~,t?z,aTEx'&ٺm;S;HmL=d~u9lR'4Mx=>t!_7Ժgv2_~²{1Nf]rWk ?/[QssŒGy7Xbir3 SpXOU.bcIiò=d~\)؁(N*[. zWXzwm>Bl &x-Ӧ?o+VaYViȓϰz,^|]ߜ$Vd>msGTma6`>!v[ҥb}z䂳FfoWV87|>a0[iѼw'~wϞ1lg:u3㹗عk7/=8o>FDToȳ/1ٽ\}#ap9g2tDD/ʪ5k݊(m7?捷+?#L4W^2s[z<\; (/Wb3/кU 2}^6o?pލ˯~.]([Ob^=1qL6] Kݸe5qTnMcŪ5L47GgsuWS3K0E:&}Ug,ԘM*FvR](9ͫ>=W 1aft1%5VFp_ڵΒ5Z_Ǐ#11s7~)ߧ_}" 0 ؟ߢ˥Wn\tYqClٺɄfϿfb39#,]v1^=c~'&ryq|sؗ^C@q1~=m7_Ϥ~FL05 z'~gA֭l߹oo¹ҋ \zv??]W.Ss|i.r\z gdjk.kC|0g={ЧW3&5-[qct0. p|On{ D?t?zya b՗ǟ~XW3knDnnmZ$#+Kݍ2M7#==^]uxqa嚵19vБ|"yazyO>8kc}ݟL4tSQTݙtL}lFW˂Qco#veY˖'֛c<U)8lX[\czAHpTWN\o-*WP0(78.ّ|jT XMHJj={Y<+KK#? E?M' ܩ#)Y2Z6o߲e,w_.b~tQv`YuMqq1Wezѥ\Wt{}yof[~ء :r /ow*Z/Ws[hN]uN~{C?6n?὏SPP-ؼe+nUq]zђ=E6շ9jXaQiݲE9T!e|G~7G= 2/Y̦[|4^7.̬, Yl6o%咟G&ۗF||# !..wSH;.DW\MOjZ,58/W|BYDEEs!ÌGpʉ' o޲!=d7KŲefl۱CYBXV*ze (rn]^ҷ{"rmÏeo7&w} e!֧Ni9K-[Ej-@SyNUa{$/ĮrS'ƇÌ.ƓP@Tb<~|PiB׋>>m7]Ϫ5kjZ3?]ZZWZF,X9ys@yaiӦ53H( ZI=UNedЬiJ ͛cg"Np'##Ԕo@BFxLO"}l32KB+u~U.l-7cハfȓt~`9Mk{a%C;znrP8=t>澫w oڼx&vuj{EO;碲a3 ]'_먨(u+/:} e1qJПfL}lFDo/,*Zr5O}0Nw7W+d^-B1)04HrxǬ|[#AT޶ci'&J\tsbVD{S3k%oe7 vډ۱DXTGzt+wcUkx' .潏>yLj:oGll )tl^O-2!t|aMC:8w2 ;啑E0 A0|Dyx<:?ز{l_~-C SAqx|hI1ZRF&/{VcԩMQz^JX<41'5 G;do\4EbF:Mti yX+Ws*R"·k&y5HB|#rrsX7l=VrݕЬiS |3n*yl*Y|Krry\{% =f/~[̽N ?[ؓ([+or+HNNfwFfM?c)**bيUz-]q 㮸wϲxa\ե4o֌~Wr EBB#&\w5Iv_H{O8K_}yGPf1wJZz:۶`_i8M$j[Wآ[Ly*͎v_U<~MͫWXm=*۞[1"B r;oQr--oO͙iu ʆ.4/:_r 6;nUNQceeYQzSr>z\=; Ļ&W8GB?xg(ԇ_SjF룒`S[VY_ scVN`}j[Sz",J {>uy]v b8T\O 0~=6ŐEU0uJejǜTٯ9'A=ÎZQҶQ1 ]ш̚vP zc~Uy<̼oȢY"@ !"B 0̫Ebիd(/SimWE E[Wc6;VjL-".:*=+㉶OBG o7q/<54kEMa9j>d:0(7D:&B}uKce%Smϫۼ{;UY!AI~d8U/@Sc5dR !n*nST_#js쉫S?N=nCsuZF!iLVk{=<_SO68=W?NV+l5&B4.;1^}Lmj-w}[M!쐞tT{#BQ{ 9BmQ%bj 1(?GNM/ Ѱ?? 6s6a/]㳇 fT_gݾ Y SWO=^P_[tM^ Qc 3}vu>zLםrP50' vpVæ1(B!jAZiwuv",TNtyB!Dݰa~m}^NB!NYi8e68jLPv)Gm[e'&ؼ~B!ǐNۼ:Uz\osLJNspO>#Bl\vTWEX$X~bvrBQi=Nb`}P"07NmԸ.!B>q9X9C35Q2Pbzv}RO:BQ{g} wWq ǜ5Q'3X<T!!cة,ޠdr q*Bl۶`S[PVEX8y(1!BX1ݍ[prkLMazX={IW\wJ[YF׷GYLlNH Fꄨؘ͚bg1Yo R+uqds:`}*X?}{zs|_ N79X_rz (.*bᄑ4kL>&oz0U5q*؁;n}Nq α!X5,o$~'`ޏgf!Q891I8RW"֥1dOZO~}ȯ.$Z Q+=^rNUaPWjVeNN'c2 5ì6!D_1~]`PGVWg~q!Bm!x_ҐP8H[>!BԽ`cu.Pq˫B!Dl\vBSU,lU}r !f+!7U].bCV]PBQ7BCͫSV,r+ -orI,W=,z&c[U}+1mLϨsu7sWTz0>Ϫ4W4H͡湩UsCͫq֞ϘzU|{9E^,?~pϏ01mT-"~xp$׾Fs@3IsZx`g[ӟ;ŒҶ']{WX~! ,9?<a'_e׫ʱyiyM:1ۏɉMBh7])$|lfV5c:N/dw0q3g+1}QG{FW#֬fO?67߶d_4f=6m˰+S:kOSvb0pv/_>Ws]pݐqȀf`L|kH'jBQ7seH/ X٬)5ݴ??6yqkbg˛Wrii&3Cpgq45Vos㨅ĵ93eCT#qU7g|f-{e/4S'0't Gf}Q1?hH),ZÏ!xKzo{ W]dբ_:cü^ǰl]9d lz:4/YƤ; (gW.֡\)HP ^"yb"Q[~o|,m}1?ܓ̟xisi~Ų Y2z|;='3iZ{w}Ō逾Oү{^3?/0=\lj]#`| mîb ,zy)nkji#70m`S ּŴ^=3850c`) W#ԻL sUqԇywJi_ϥ̢2w,G2s!?^kf~\ܱ4Hqn|n7cxG5"k><k>ўHȰSWⲗ2I8Y[AOqAޚ;PoM3sʷOcҰ֔c)z6R=>.ϛ170m` <+yx6f"7f[qĝL;9El bpU_Lr~wAÿ%wԓ99vnT2 w7/=k`e}9YWecm`ǏmaO 9趓hEoyc9ک\KL&~n)JQgm{jɱ9Rqu6PU6ۑ5~ ؿ=Dn1ݕex<<~SK|Cc9kўأv`4 L'ԾC蟴i~6~4ネ>m&)Nkx81WOvvID;[?{c9u`+bR{qڈlX8a˯X) L Mkf41=&[Ws7K~؂ߦ|_p8ưce$ѡ!4JGgc9}.ގQc8gÛj| nΛ~`=:E۷}9I0gm0rٗߞ׵BRlF^4}V`g) `A뫺z4̄4IS.g@:sÀ%&#L?%//cӂgyie7.I^e}eMyw8^( @>b3SI?sexr Dzk[|*Pa)9n~L{$d;)(f"IM4{R4Ydg8|3̯xx«X<3'#,{N HJJ{vZص+&)e%c\UF7.&Mo۷o X8d"'?&оk'2sTJ0ILJH#a/Chlަt;|;n~|ϾJ8&6u40\rxjUiGzghA.oƠI-/?wM/ƉIs%%ӈ#)16'ĝ-w0M-*{{.㦉=+nO2FɣkhGb81*nO?^Bӄ´lMW0O| ; =F Lf6) ??-gK'1`Ǧ-e(~Nebdnž 82^{y 1'wWKZf듸h{bI;m'LXٷsGsɸ~i&NMr94/B;^f<˸^d߲;g2CZhWUqS<9^zv^N;z,W}S^HbB MʈKث#"R#mg|1Ɍ:x\)ǘf$7n!ߨfùy &q eCN{=KϵŴbG^#W;"R pYXL4>*ڼW[7H(0r^u(ꉋ7D?b̻x9=+1ͻ+;Mq9}qn~= _t3=RɶE0QDŷיrtateN\F;N?*S G>"$z Ǟ>?{;'Aѷ?-{y >or7mLqŭJ;p׍*nOHqaAbnM=þg:GJ۫I-yvojKDXUSٲ[F-,qFɍߏee8, < nhZ~|Q 1SLp)ɱ0o}_~=p~5Η?ίe8F#׫ZVcx?&˭U).ݟ?% Txnj%k!mizzHԑi3gokK>Hkv_iJŀ}J*ٿfæ>[r+a ^TxSrXB7a)W9l1V CkF % LQ9js0L ;`8_YKs[aOAYK}7ߜSۆ>@u<5kz*3E5k%ȑ^d˭U.>5  BߞB4l=aB!\ ;4::f%U !uIGB!UqB!D"L!H&BQB!R !Bvd 2L=,B1wQNnٿc)Dmu;HK.aO-IJJһEIVspxBgw39v~!!D- =5;;[H!Va%;YaHHhAmڰMR *G<BQ"Q#rk_TT]O^!H&BQB!R !B)„B!aB!u@0!B: EB!D"L!H&BQB!R !B)„B!aB!u@ȿM.>~K! a7aG2ȣ8jȿ9һn|җ t)+~!BTa789|ݷ|=&Jf^V!߆OyvtVYB!Fz0=x^brY'ӫpwՐ]= I~b Y<fp.w0x>, |ǤIz;84F^ Ux,| >Xƻ\ S9 (.y`寏'2|1z|02WBJzϢ }#߿!%O;oH<Aܙ|чX<k!o!ۏ3G1y0Rۍwg.(t~><7e=n<"ԕݸi >^ZAeSNN˧]=W=sX_,eBaV1g13.l<M: 8Sb=^w9>{ٹ_AҠ38[`f``zNO3?*3LڅB|!+`kߘ(/vORe&&o)Ʋ u;>_zcxL1 X4yt/붐U!#EX?B궒)c/‹`ϝ1 .94.KYV/ÜB buCL칎闞̰qy1k|AҠx,<Æ2䋹5dBq r cb`an?"4Jփ3z %[nw:41KeJgT\^!DaY?/~}]1m-u}EEE@1J:o] XJۧ}K>oK*fu*Sw9W\s܉?{w?puJNq: ~l:2`c8  wb$w?4 _>#>OI\uG!:|@5h8-<9SZ=l o%h> WšqhDS"~B<4|2!3&^WON0Clʛ߅*z~ T GfnGv[fq|?{I})3JVlw'/TibĘh[;:dFc[54}U.&*I".o㐮U۽ 9(_B:/8gu=bNhޝ\+C'Gy읟B::`pA Ugû}W2 d'+x"= y9⠳ĜcՌ5}$󬚄GJBL'1s]U)K,D/Ȼ} Vg>JZd$dvvv<[ŏ+_ڞW~a?M{o/kmLO lJaRS"q 5ַU3~K&,gb0B4ݕ\gۖE8ΏRV_pj8fl>σp9 1+Ek|"O%|rQ-}|h 3t<'.{~#hJ+K~k`M;gl|+t+б_/N?y?&2kBUThG9ޜ(!ǘ?iO=B-zѻE"vOaČ<$CmٖJWj/iE90j<`v1:hУ7JF?Cr&f6yA>[L'A:3$y-:%jp!N>{l[+^.gƚ(::޿Qir7/cH \ۢ*^=aZ~? VqTGQ߰n)io+شe#Z98}9g ?=?,֭Y2;r9#I>*YUr@/nZϨnD{vq=f$0p?Ar:\+3\>/h%6]VNos} fz%{5[ ^n i;v8r8Q_Y1Kp1fpqkWL^< @>Cws!YŪ*bI!K݅9뷲m/4/<1^_L6of,`Wvcs>7kG Z$ s .gs Gilxh0ݲ\Y9vm.m3džzd>UkVGq칗H_-‹]8[tK6ne_e8c6<&[%>epLH o%ƦYƱU [K@/gG$a9CeTʀVwq 8Qa\t\sSxjI lq2C4zZD(** BO1̲EG`(3%J %;Y|tۥ%w B8cX0aNI7 >jOTTd.q"DA#)W2>y% />Tl7-7DvB7R<>eM!4)QWѥrUb"$GMA>w" HKHVe삇ZMcAǜq7dKfC2+yMrpmFg҄ԢYL, 㖫>]i OY#:8j(0/T_m*v\;J'H"Qq0MF?% iͿ35u.bV[0YSy~\>.VuF7A'>n 6@nsʦ.x/Nm7n%v}-v+Iۆ oϏ"\#; #ə)i<}MNuʀ%# dt6g4Yi5j80eiqM[О_׶6O"4DS6U &OC:VČ61t]bs,33TwTg2qkZ#!IVaW 0lBsjLMid;O/CM%V;BT>8gbPrIi7 5zQPIcs6>%P6MMOFfȸHfO!DawzAzm0Noh[C|K\q$4_berӶ猜s XVӖ 謦sK3}xm:}ŋ;C|_.MLU0/*FLC_*VgFbl3ݠ8mbDU6*$KHI5.cYT5k;ŨzQ涘6@l=TEEW2Kqٖ$!Kv%ecyVe$Y %.[eT۶]OU2o?>~aoqċiS_Vy'/_3֜uiK]R}4bOCZcA/')Zm{1a֢c`izjh6մjZ5)>WyXXOY$,w(GL2KLm_F5XHd.$ck_,TX.ok ,g%^ީHȖ-/r³#%L@\oVqHb8׺6>n-Hm8m]6Q 3NjO۱˨ ˦_}@[dlMIm!Fϛ8- 3a qH֙a~AO$a  b8RA#I  G 0AA@$a  HAA>  |)x8EwAOF#& ҥGQ]NHpz޶:Ey/RN7r4 1!IX xE9prrqm[,$%♰=ÇoLĮ]NTT~~~V??=o\kP" K>"g8;;V I$)E~~JD*3i4\qi& ޶Jx;;9ԩS ILEgAl9;;&R ^}=٥a/HAA>  |" AAD& $LA#I  G 0Aqmn߾m[,H¾$ ֪!D׈Иz"^VK%l ;P/sl{eEmw*/P ~1G1jA1S>gcf/'[gzLZEU/˦s6nĘ#Ѩ*q=].JTkF]7n+jp "MM)U*ZK{,ցf|;FEy̼GIFkJŨ'Fy̑m^(>Eyw?+dۉKE%ise}`L.JVA:67evGs?!cS.h-"e[Ds|I*y;/aۺvl]z/r;b̵}:Ф.LOߵD;UQ,TE"_ݻkdP( OoL茷c}&ctOSWeV͟M?;~G~>*ȥy>m]Ŭ ` M f" ܨ/8h[5NhS>ɨ%||ӄ5kҠ(\}gvE>Acd Z?w`T_ط%vDG10}i8v+ǖU=LTVVSFMt[Q1X(9ǼhU?yy`_g6Rx2tjL5ٸ# ļӔzɷPZ-t>JpOuV&Qͽג(ZtY#V|Woy]fŲSa r物S+w274@zJ.R1r*|Մ-^ًjQN3:S IDAT6=L[BhaLQYprt3}V*E6G)K2ss_fyȎAmiIغ> $h9zddg(Ѷ}|L}܀J76M{:Ԩ]~ή{1hÁ=[P2fDr]{ЬvujLq i\s"M)Ҷl9~ba}ӴEIFJo:6ls J'>7Sq F{!7JgW'~g#k7G]5[%qIBV%{"1jBC*j$tL=Đ%g [+,^ͦ.qf,U(jHyQעm>UY7xlʰՖDEpon3x:M &&-:NM)ʋCS;/J×9p={~,JBgӒ_K6"J@!nlMK`7ۯftI|I(Q]yh!LyBi8+V ܾ}vCvcǎsI:th[֩cGn޼i܊G?ظ}'kG_YHb8/.1xVvjgss,'*k&n<3>K,6+|>Ȥ+T<ގh5d*UaO)Q^CۡѹYd5;|)'Mږ&iPFWNj$|}uryً% YΗҥ+UBe$$dM-JLWU2RnX&'u['Sf*w;Snj1?}˟-?Զ}Uܰ] _"p%/Cl^P>l+[. w^TJE05+U\Ն 8~SRLAJE3Ӡ,L:> EddYd~e$%l}Bɖ-)e9!P /RɞQ Q5jWm.W 33PF2-pfI^qLb^JPfnSiD:3զ)T杨0+:"~IQFcCUUTUE*SSy$7Ydd*R)`-O5d$4hP}{)@¯8sākݔ|pI:dOQ}yNj+.{.d[Z˶@r=Lx+f+ӗj|c>]zFDkޏ q!<ߏF,Dzw9sfgSFΛ,&IIquAQM_PO }a 8hAѣ8&BqH~w Ӥ|yWu"ɧ]Igȵ0p)Ə냟b:ul5O$aaQ8&JW'nNt(]H2Yo쨡rzE'id~+zh% IȖu1 &'<3MZZ. /O82*AAò$tGYgn OO!A@zp@F~cOq﹃#z?=JJ4>ktdׅ~u<3W{1JL 'YϾac ^>_JϢVg$xg8LNGtص:-Ap%-1x8&6 ws_ V S"}E}s # !FVirMCtQȚ =iͲ`Հ쌧Y[Lanq~*ɚx( %W2F%Wb} ^>EgSJђd$Fpp%\x韑y/1J y{((QOLLLCo4<ip.>8oGsrߜ 3+Wqܣ,shdBlgX0AέzH U5S9:m%wdɞtݹy7[VڂԮ̮?q28{\VsK 4esj \E颩Y?~?CE F N9g>YnCٖi 9;㏦]8:}{իD9Pv%ʒq$uX{ ;HRVZ ?8G^ctg, }*3diR22ZΨtm7^.x+F,;lW& :5hT٨^ЬC~FҊ)h7e K>7Ӧ@ /1:ï`F4˂V>] 3lm!1yFt,Io߄ȾT߆ݥy|%zšlϜyG]_aJoؗ e {Uir7}P9i1v0`Z{eD뚁b02WףO̜?OKur7sI,_D1:+u׆BF[,9+[Mk-YMkz-?f>ۦ8u4%w:<9?A?D 30 .DUU0 aIH ŨWyXXOY$,G5V%65VCZyb cJJNj)~ wdltiY$!K۴oE ?<$yry]dd&PٶRfZ!rP$}$揍]ax{u7%ԏ%k֬_L&l" ӡ`e 9aTxg!)"R 鐳54WMgY>=   |HAA@$a  HAA> )N#&&ƶXH=:]$ " < -K=⒊7o={D26bbbq.UB !,s6 |`[OLx!g=CLtm;O?Sv>]*!IX & _*777$I`[N/F UB !0A!Œ$ 777l'.AAD& $LA#I  G JFէoп gҨ&F/1ez8)&LiTGD"Oߗ_ӣh*oOY;n9rٓAȌ&ɣA]CP_^aï?ӲNeʔ-C-c(*ã ܱʖX_ÕxZ1ǿ@L9 =)WZO,փmF԰Sl{CM`lUScٮ]JSE܋ “R Ur7S^ܾ,~_{¯-_AȻ!#r!q=z3hI~ M UŞ̙ p.J$gPeE|m9JX$=$a OvaT/s%ɃM'y`,@V0{/;a_PZԑNw0%UvMFApט`"2ѷ( ׮_'$8^o[F_MY&WΜȲ8$#Z-Z'Y7 w" -Lka=N2h M^ǿykmL@ت8ZXZ"ϧ ~ի- k)od A=n:kN> \r#G6՜B c1LpJ*U?5 6?,ɭ8ٔ D 398Ub~T$dI%Yʛw`PsZm%fZ&=H͂`Yp_RV;-aӹGҦ\! kU%~"X6#Z `H_񜺔ôik}aSheLb;i܉׵SIGy`Ӫb`Y7,yk aċcv%I7gDEE燝mu&&&F׸zyr維R'Cиfi-'\ ZUQ#F??  n ع{ Kzc<7L9ȝ&&8}1s‡r-WgwsO\E t G34s̤iqLWnsn6nTPAr@瞵B*G-%>T~A'CO݀ճଳ#u&:Ɏb\p5)D:WDGc0Jdlܟog̬3 t_qa)_^'cS ;;w~>z?8 !>jMg4xx ř5//k$Y1%XJh0N:۵iҒZ #^`!(9㐥;z+ 1FNf̏2.Շ6gvshWm![4ɵZu\K|!@uf5@׀Dpq&4Ts1:Cp r; 3 MNTJ1.yQL̪E-G̳{>7YʭTo>KZ_Byrdԛ/6cWx{3$+h_syFH*@7s&\IS2I&8fUO؈(!9 $}Ԑl<zw +=N)UDy-^˞xD%(\ŒO=mZ/<}i8l5J8X IȚEBh@м@txy;uoΒ\iT&l܏åsiumI)ΪjuF1ϣT沾Xù"}6UR+hd Ӹv{?1h' !U2u^ Gn$B,;RJ$t1O" "/˦-EV~X1ci?hmF 춋Iږ/8Iѣ8 Ñ(cSZண8 WId|+Z&F;X;]SRywOKAa#ǣUs$\]u1dLrb<\#D? TsHFûHH%([vq>Uu*,Ɉ(/$dd/Z^U!8DX~3nP1IYæbD,zUu#~/ؚU5m$s+L=S߳K7O7&ίCzUEwljG|qQliX&ľ)^h{?gvOʕlHUU8I"Elދ ݟ4^#7?L[?+VFPVӪo\Maa=m[gܲ8ęO$kx'8qT8i fA"fo "ܦ{Qan*NL" YNd$D5'A5V HBzĭlO*p}Bex~,ʼn_ʹ$!KkWŖƏYRqޫ۷ehժIg.BxWWw8*Aׯ/Ϟ9.X@mę7?!ϙ&'Ŗ]{9?dUh^$={ϞM֬YYߔ,Y3g%;_3Dqhlb?<" IvM BR:_BxyzpYfҿ_?w0СԪY'ot|5pkν|ɞII ޭ˔a.05k&gь3-[q-vF?@&ᑯ"ٜM1j " A>_wܡvի#3g}̘1Yf2~ƎgxJQۆթѠ9R_^`TBm ѱ4}cY0/gFk҇%+mK 0Aደt1cb1nx:wb;{\]V 4߳pv6n||JGg `jLZ'%tˮ'vC>: '88ĞA۷m#MtڍYf2tF÷;rg7%т.me{PWuAM (] %nQ! |TUGϗǏ1v8vf;[Oxu_[0\QD`P#}A6_]/ew _ _>Q&[!223gNSLY9Ӹ{\N=sB!jK^= 1) |4mEYh1[`ǎ 3>9k5d;ɂ? _o"]ZtPFÞVs5\Cgv-f:7qKTTT5 G1j". G{Y q&LAleΜͨ'7)S&4Yh9z$3V2 Ьxr:Qh7`H_5nk1+Fo 0t|SOCp#Ri"MN=S ixhU%0 fѽ[7VX3gYl${y$օmQnVVؓX5-ny;'ܩn]'|Vpgxom{.|xLoހ"QI,Sf(+!A Je9YBÞyǙRbIاB}KQЯWg`L~()8OM)PM o^{=wl@)V.p%Ŋ0! %UvM;s/2DNBCI'F5hZ3Qu G]#\ A{]TR#1Z2TO*_Tx}%?ח}0VIZ>-X,߯}}GQ-nI $E@A靄{QU*ł\D/(HQ赀 %R:$!Ha) 933λNL-hڲ w<37C$}xڊf1m2%I4=yٸ_c`Ox3GG`thT{vXD,\ǂ1eqͼXJT)d򪷒YڋlI.fb`~~c8n菖r+?8^Des<2OZ0e\7z6;r(մ'm*aF{K ,bO'~c?R=+e\S2o!Vn`fb˯ӏOm,2G1w;>ü/ɰyS#YOf-%>'cĭԝ0e,,[U&{UKne͏v"VnltmYqrIJX4}h>O߫|ط<ўECBdfoÄbYd^aT9jE6ϭ%|8$%pv. yTԯ߈f=3ꌘ!9+էY݄ToF#og E_)Y O```rp4y[`D(R`s _.8D;Pd"U۫״$_Qom_Ϊza`pGL0sCǕ6Щ 8?_kkp]n\;ݲ`rp=bkunkGh~$5 dܥlO%0 8G.*i/$mb7@TTwطn=5Q75z3]E *à5%N#0C;Q=Eܤυ<=OaxL8b"{0]%٤7tVv{o|1()*36pڧ7qv+Bo rsC]3@dl>/gp؟J묫Ip: ?ܦ3,WDU@ϡӍo32O2A]HL;3F<$٥M]">x +Ի!'xfc޺' _}E{zg|[=6ϻC'cb6L(M$'3ӱjѶb`>@j5Mֲ퇓)Ҙ+qӲ VG߹iL] %r_0)V:lLE*dgOdt/fH!Gk|}{_5ڹ|.~u@uoÙy3lq, 3${sk[^':RINJ$1lEAў{v5g yHٻGl d̶5 +FKIckӭFz}5ςɇea[lzH\) *co@*;Y{ͯ0cQtB GJn EwKrƂCyk*3 v0(50Ƶ<7sB]i#^[Ӷ ѝٟuV^PTn*ɠ^RmȻujEŬޱCHH1vAJŞWvAHH1*) v n~}QX zҡjΘ}Iֆof򬇩e?g@3RɌ9c) 4{, '4q>4Տ_*-3銄f^/3/&N`B=,_+氰qE78Pt}}V\leh0WvU#VйZ<>ݘ~EvbK'`:?',z>K+g$oHڏƻF0̼+ϾS"wcĤj]#hF4hljs|5P`H9?_? Pʖ)[%ąom2˽{O>|n.Mitni<1x@Y.6Ѡ~=|?w!֮[OLfٖ-.\_x<6ƶ ,0\Fz22<1 `d3;zr3s> kӈma[=i9roO$f{6l3k?{eYY0 sd,gF^]mm^3& 0`[x,W\{e{a`ۑ] QViζ̯+WCzu}m'Or),O~}t(V!!!q^lf ԭSǷ꒘8c־IcKMMMH95yzkړ1^i;,#o] -F=aa) ˼r.dw:aCEȫ2ȱ|;? kf~ے[}new˹s2(0LrV3my(oW<*fU0 BCC )rSK!LDDD a""☋WIJ&""ЏsN!LDDD a""""WTHeYmNB|Ϗ%zu\ "0)~۾gRn]~_ʎmvW[-X \WEʵUHOB!LDD T|kSqB =# +ՆLՁ$c)WzMBw"fϧB_63[9LՉg׹$"W>7M7qÍ{ku1Jg|x.fDž{.wJڵgnIhώ7~mjdgƣރ|!ۮeLޜ]CiR._Y pUG}CGYcO`X =t.[Թkd5Oo{m`a:'Q"9fǬG"reS+Dl~ƺuaz~=HPzth\@[.RsG һ]˦ 3s-KF7#flK b|5މE~&RYbPEkj0`jΟy1Qu_I>+rV2B6~3Sɍm)zf)Ol UDE$BX!cz!4{I$mya:"1=z$f[iӜ-pǘ9l>(K>NL-hֲ w<3\1v'ϫ-|ٝn3,vX|;egbx~_[С\J+;Lְp{|s^~/mbѨ-  lSҜJ]͘}y姳[8Sp`htLIkH<[hӢnY?~x1ۭ ͢c؏Gfo%/cY؜~%?Uǀw:\95ߨ nY3͛7Y<6'؅|Pz4"fӛgrwmsb31-iQ^PFOd +nãlQѢaSw~4wMd'詶rmd a۵r,_|;a9lMYfyh9L㖔yEqHa<&?ZT{}IydRM{ҦrKe9̵q{t(f^UlOcT[ա7w6p|Ё3Y,c# alX6e:bL w|y_a çF$Z5K{|0I+N9Ǵ[;a.qqX2YL/b#ʚD֭D&mڲ:[eٱ)uiR3|)FW*n9o?@#x=ڀ!!v23ag,| ^BI0XC" |>ŒQ^8Jfk/'>v';'X{ghNoG"(*@Viي6VϹ!̟}S/"U[5HI۵v5Lޔ V$dCeH/W2"U۫4Sҳųg}/}F:urcC:tr n#aݏ~5dV4 ;?w 0M\ex,拭չftT}-V,Ԁ2Ts9>*T+|qâ4Ǧ#hެQ[ResOcߺlD`8+֔v)&L ϗ;Db r~dL?O>"3؊yv(Od>@Yתu#DbL]8xdeu~lz;6Dؘ[+:pV-*d\\wKLFq ³!-C 'X9fQdRhylN0c)\vIWeў9V~lo1LG~Mg(.k?D|:&iÔ2DҚ!ͯ9w2y>f~m+^qV$g-~8ɚ"y9-+`}6 ̴ٕ]2(wf5)V:lLE*]$KOǓBpr?@ IDAT!p<ɿ=Ϙ"% j>M `U=f.OX6yfy~Y-bqiF*:"ep,lm{0&DMIl.3xIi_]W5YM,6ѣ{&+^P/bI#602Ĕf7cRC"q&Kc|sT2lN:ę ٷďzє 3K ݛ93n&\2L9B3v-{1j2&5;eɧ:׎mEHOϥ aW G2t*w[xo9xNW3>e_('7ҭKQ~cS1\&~,6]ЫW͛A zu )^Xs@ʖ/ލ?f7ug3o7-B￱/%=@6k\.H>+;{~~zdU_;5xC^Q )jקI%7a޲Y3Zk7sCT3 v0(5}Mk7v.{S "Zvhm.#;?̺/T3"0ӽyc.mW\a_=hݺo̍'qe?}Ș{{Ю]:7$|MDv}:Ц}gs*Bf8ʛ{ѭߟVC=a;WEMx32HNE6&?ݑHঁ/3zd& hS\!hxX&][`(mf;_}-.w}:S'ȷWrSk2zOdd5E&e;-q{m?/Ǔ48)\F|ѯ/"sR}[iap&^2J Q-͌ȿ^:qqgmiNynj'j$GzSxe._cƝu.gN2y篬.+…wm2˽{O>|n.Mitni<1x@Y.6Ѡ~=W`4omY`϶X.X LLU͗^d^Fl,+ 9- k0M̋%ȫܗmyM;s/zw|ϻ3m;s|02<ζgM܀Mߛau.? aI79 AVZEV-}˶m֭@:u|.3f4fظ{Ԍ3-iOt`{M{팲JvLӾu.,""4L\Y湉/{=ҹ-of`ȫ-*eðzw|ϯ! s!>dQ< z| ȱvlϣҜm_;yU\~Ƿ/Nd("5d\$!wsGl<).O<0)sp:/\EY:65<A!LDD$fH!;8zq:}3?<_/LMG̢;^c?yC/WW<*5y>|/)SfڅI.4!.S`%W AV:|,},~I %,O~q >rEPɋ_ }QY7m9ٺ'7e#3\?N-iۓ_ZW!͆1Ҭw;Zemοɯ/]GprEpH>tviO Bje}k3|bgMqMaL4kLT;9Vr%PODDDD&"""0(8@!LDDD a""""PϏ$%%?[G!슒s?oTl,x.5&m3{uԔ#$;v %%շJ#%%;wR̷J }c~!;Y=G!$7QOn+]iY:5 ҕWn/j#󏓖yoEqsl[m0?;?CLQӫ>Uc{t-wCJDR/JsA'jF  ̊#7oa>ԝ Ƀʛ?L/2{_:}ف+sвx9hǬ{. Ůf*T`la)gs? Pʖ)[%%|#i >VGx (#Kae܀AmhׯL{'w&D GmZOXm`&nE9*,ՏҼCq2}b%s)BŨĬ*UQȜɟP'Ũ:/~OM* ߱b[ rVM ΰ7r-lM3Ky~j[nNXIf*_a`y<ՒXbVIVXxыoqKxc4EUD٪`rl'&Gv20=Ux\ڇ؜?s)lyd/&oyC y|ܣ.ㇵe*9°EqƛY:,<:Ow&._[ʧc+L_OU#Ii6_nHA`D5z="/IDT RɩWS~ Cĕ5ߧ nټ0CV:]ywC"9fAhh(U"^y-c%|ϊmԧ>.a20m˃JХ!/ޖqMBB֕@[g5/xHV F\6qԲ!y#bܖ}בP7«xRV{;_cx/hM73eޗ,|KeKp;0X>0 Ob]iތ.w3$xq(Ѫu~E<,=dk=6i{>gΎ\w.7֒lـcwyA4 oc񼗸Niꅹ,jѳّj_^'?e|V/ziz弸*6qɭ1NdMmҖ-5[X6kXR&5b{Xڭ=E a}JE$>݁14n33V#n9ZabnJ׎T6C4sJW }{LJ5lD_ֳ9&嬉=&߭ގ:Άq=BXU4HH4ϑCG 4˅eb yDb N[<<{__ȊKٶ~Oq=b-l_.A i3?-krrU瀖/ƯHeڶ?q"׿00M3}Hf%nnJv:,U2KtV:B%J~lZ )IX>*ռ%U64[O|F bM lW~n0 ~| 7Q&f4AOP٥ن!m̽ΏMoG"\MnFPB8ʑ6wVOiMEwMXƲZtw\_8pcmI&5 ؤ_\ѠZM4l)yw1?L0 Nq-+6ȁfT7\OT~ ܻz3=KQ4#(BmxtoERXBp)TO"wfof%3C2\&XypGq:ϰ?nfWdw1Hf={gN3nT/zWRImm?dMƼXٍݜgb>RuMfJH.E;+ExX6Qq\,>Ob}Jm$tx?cF$q 6IT +_99egF"ӎU; "BX!aFգA),Y@ xiODp/ǁuޏWjП.L;Q#z ن:4K1 &Cão*.K4βnSF׊),ՁiY+Fw~Ca`@|>Aj_"*+ P L,es 3fͪ6D;gy ta;F>+0wX.q+Z 5/l潻n# cM JrqH; gbrt;Ƨa6&]#?6:mLwVυpUG,"kJ(7f>gk#Sq[6`[ܯLea8o;NbccA4ކ3fٶX.fIlSup?;m,YjeHMI5s=*UZгqU ̨Zxq@;7nFtycmBM>B74k B그ûNPI  3=#%nwp?h2of`c̼ -oΦj lųXҦ)P)i^ 7:wF1=c(?wuu3=o{ZDVM sMlw/{ٿQ,q>TGL4j;?q}d M$m^=љQ7X^4 h'VPVq_ג!05_z00#;10>LǘfcZ>K+oHڏK?2Hʳ/5w8[4ANBv%_wy|zJjlj+*"ۅom2˽{O>|n.Mitni<1x@Y.6Ѡ~=a vzb7˹mcZib`[,L\^/ԶǃEΡF۲VܶX؆z3>ٗ>,Y>ζ-vQ%m-<+ߤt!l,˻ w? WwO>ٶ㱳mᱍso[X7&2۲c`gWVyG=r9/ ǶY {;gζ<ƹ792vBX Ka6on:UM3l\jjj xԌ3-iOt`{Mg|+_+A.<}2]hY6'1 L#LW{ W2HVo&nw.܎]*Σ8s|Ufn_ߎ"rEmKDDDD.30(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a"""T˷j&"""0(8@!LDDD a"""oF!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0Cm """?(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD&"""0(8@!LDDD a""""PqBDDDD-#>>޷HD`۶oUG!0 bB϶mݷX䪢H(8@!LDDD a""""Pq>YHy,w]8qEo(L$,,k*U溪2\i aPZZ▓|,% 8H_RYErr2={hۦ5n."NBh? IDATBreu b&o>6oBڵ}gO {^RLD.JDD${-BX!&""R)B+T !A+)"'>0*T-BX!Tsw$&&bYdϲ,}fMYDo !???ڴnŎ;ٵg7{ &+}Ec&ŋQJ .w)RnjժRZU*J#\ a.""" qBX^.uNv ai:+Q +JbHjBСx~;eʔ(P2^_(RsLʔ)Cҥ}D* aX2e()q< 8]EDDL1_DDD a""""PqBDDDD&"""0(8@!LDDD a^DD 3]./(((3g}EDD 3[,~;2*]l2)[-""R 9}}STi*.PvDIb۶oaDR KH!2 I,qB@;EDDD&"""0(8@!LDDD a""""WT\f'NσHL<[%""RYk0t\.ĉ$$RC=u"W>}~E.=σTYSX5C>}?D3t) ynmt؎-;rs>G3jUCmqrP<kNVMiw<ů oh7mE{ds )ӫ]kZ=ǎz~br߻x 3-[gl)+{f>֟[ӺF~'mHzJqDz1k&}=mz/ZѼeWzn'oEְnqV0ỗnSތYzg}"R(RGEZTSW^K~`Vѩk +2u &k4!Gcc1E3gH$G==-l2|b%/¥}, ΫKf̓-_Al<ׯAa6ǖOg8k|!~Jfx~sqsy_=7gs3Im`6.vs_bo;/?6&[`a,+O_o~/>6vylㅲ9!sP*|?WgoS#Cs 4 _-?Ƶ CD 0B>u3)W(ard**RqV?,&.%ݚst<+݋ۖ#pQQ:Dl`̠v;xW JFѪ4W"&iR##/"!Mh݉;.5U;FP4纰 }bfǞ=ҸT 0W m J;)^ꑰbr&¨{W]Ū$'P/[6;o-wE\yXWعƯɏ:J[xɛx#|.]byMj )[?IsO~m+GkPŕ:OgB¥1<[f W2৿!Mq覛xwsٿ̾OT>w`isD:y>K!.0ipSL /:+~ Iar#$tٓ >o2 M:ݼ~;RqA;YR!>& !B &0Y& BO !B  „B!aB!C@0!B! AB! L!bH&B1$B! !B  „B!aB!C@0!B! AB! L!bH&B1$B! !B  „B!%ޮ4J;jT|gk'S4ne"8IyE dgfpy^U\LBBy#F(r ! S 41ߎ]Ké05?-Iv,!iR{7NiZrۍ&;;wf ! r^8]aRfX&/0+l >g>KgKyEN'4')/>e\#X|2~9^rMs翋~z5}䣽BS l]4͊6PFYY_s$aߵs׻a'la9\h`:@?̜=0gѥ\?-˿­K2/>i^ ‹UPP@CC^7(AŝEs6s.w>fÈQ׶R=2[xks2}Sgd\uߜk+s!L>cЪc5!N07^p9/?k~__MXՁ~6 +>|m']Qq5#1+`0 __-ߞ}Ѩ F=V|2jjj䇵 _'[|oU_zEhi8ڗ^4HGFilm AΒD:;̾8/`YJp-_%˗r_uM V{|ƫYv_lin l'+nWǃB 2018|ױ,z7[hDaXGg2˙?HQOaÓO-e 8WOtoϸKY0KT11i-+?5,_v +[fӱSJJJ)<8īm0iҲ|,_^z.g ESn53);uB ÞKy$+Rju X.$_:q6l(H5zK+?Y&XQF-Mjj[NƖ=YQXQțf5 H/j͸e;ذ341,ʹ)q$ ޙf˙ƜQXPȟ&N8 {Y+FmCzϬiDhFOfxǚKxmUs>9&F(\s46l[\DU/+k d1w<|o581a=_HTccMiCV Q__cǎGMԴykn-_w>z/<$GwVb0h0 _ 6}bfgw?rsZ_6F/v爗@K\eGӰu5V%ir&|ߨSEEm'hd$7P+i _`vcdAN|kY2Ԩ܍e6`,u{c~LLmU5bdڢi4zUU> g^-=1agɌs[ r< W2O<](W>/B. † UE4TMfkj,Jp$ cK:r&_>-"7}JX˜qW;o$j]\ٛϯ0?9FW7M7[Y>  Kgf}ױd"V 4(+Cay^[K涇` F#q\$$$PRR^4N1_%aWbyr"_5_~K8W,V6jt.?Wvb9\͛z\{M(1[P/֛Y} | 7'jsٸnm째mI,ivLo 3&L./ٛxvW,>; q7EƷb\gl& U0ojnsb@7X^o~|h:|=w+W I[Bҽ XCҖ)tX}sǍRg;1}JЀM[ r EQ$;SFvܭh=mcЛ61 GEU0Q4gYuՙ躉jf(Aa xWz^#z~g: cHnL4z+U1M 8B`gNII >l4ZS?`Ϥt|o{A$zzHm7zzn^?|oÁENb(kLtuhܔo4P ZH@]U y]"-42RӗT¶!w:(DQP,EQ0~<{ded;#GHHHLq^ l|;MVWx&8;pu\( #HKMEEtuv;1q„StA !ĹGaNU 3B|o썹$ ȑ#ó%A9B-!"A:w?E r3BIv)gB0!ga "B4j B!6 „B!aB!C@0!B! AB!#VT^$׽>EQpNLttxBaLkkPK IDAT+u Idddxx<< B$fT0:$n;H\ ܌ɡ@aBq1aLGG "##/h=ְNl?LU0WϿ6=TK i B|vOJ=Dj"/E 1<]T)`m>"*))rk`sGt2;+Lm xJLUGrf3TH$^v5RV\BYm3A{T2#'O%^e>֊/+S(HuB>^Ub9@+UQ,$Md=EjӴI$C 9 „WS`ԱmNl1!'Ppq1ٶ~q㘴p& V;4,uJI "ILZiO\3lM$r~qO"blQestGZ1~)DXtD_2̨1,jt\GK^v&3& 1 U YՁSkCC0!>EE;yࡇxxࡇ;ߑ@4(HsT-Grp[HItQхI(sɍq#9PQo>Цӏ߯bwHqI8IN8I0j8'^n+@ Pp'IE$%DW:3==CH2Rڮ rm*yH@LZ2003nnGQ8ɚ>ѱ=Q5F[<ɱ >Wƒ Dp=Cؓ139<\Ȟ̎QѸuW X(u9V=]P1mNFS\$$8)#V߿jdoG ) „`A} ybv{GQB) `` =+{KM %xHaNt[GپrjZ|`8SV8qt1Cui)y EouR ʼn3d '>|~lbaS&2{LXx&ƃNE@G5W$'_LSxK Xڷ3#n6QdzO~m|Ō GPOgF'=`L3t԰61?/3k')ôFDM(l89ӆL LQpdN"5},NډQlEG 5]qurf;[B錗S,8c3KφH,hr.$ްFptA~W9u|a󾿞N#~Λ_ꚭl|z\^•_}BdҾjΜęKˏN~'_>AVo Gt:YHN#ph;0݇ك?*IFV¦oԃ;=4x13& ۨ: wT#j\.#صoi3騯#afnu ] e? cԵt4LmG(MM w5zĀ]bHK9U?[Ofv4fh˯k//c_̣]';w~=6\G}?M/Q:xol zm!5|pOp ޝ0ySϖ2{Uo4;QivQ"G0{%eIgDE;1Ҹ{kZXL :P={ݼL+Qy3X4>QZ;kp8l8Ȉ:@%>Mn^MUEe}g4Myo#3gL/B\ 궯1㎏/8mL2%S/>x׾{&;ZBӡFHZIM!i':|d/uyH9E#e,u>[ 2˵|8\y#I9r H8Yݮc"gd.qy>ā?x>]O_W^5B3fzhlu}"ݑEkB evu҉}88 /]&>ux;5[{ 鴱OxSh hϣBqv)ь[2? FWK86.nu^@vrۗGT!H󆕱E>n P:ڃ#4u I@7 †h!-bgi;*"==訨Je, (7izaB1iL",蝭4vhDp:]0%ud&@$2&Aû>E G&ե$CpMT8 l.VVH+ݽc.b ͠iVtf3DMݴr7 wC4'mlyo {1>N%P[̖ E+v9k#[wDtvևB!>V C1X1LQP WnbueK~GqKP0̑'ۡ`qƒ̾6:LTԗp3% ӘD1ٽn79xPȂjө1 kT3)^yOPAy{oU R KfNyK-l&H\b O$*JCTȇ쨥Oޜ è2 71..XNRF zaj2q&Mc!A0uA\8Io=)),:B(Eϛ~`QwY}X8.`̏7yfq5l&arD[0|mxt+YΜe*@M=ydhPEf|1*l&L'n^w =e"񀩷g5rY͢\<5{{f X]Sl_|rL* yneoQ ``ĩ63v<]$(\rt8Ԉ_Նpiq'٣qnrFc!Ab4yJ{.J#.bd:VO!cV>h(>10*v-GZ,sɍQJ`&Lrc2IpF=(`ڇks`ÿ(ST,bSG3 ; dzoHN]LWQ#&깈ХD3uzxR X˻,zz2z M 4 ԡgP,4ֳYBhX YbI& s;' QT,V-,p9ٸ)6l62tu8CTN;?i,CR֕`R0a4ia-njU"_ q:KK9Xbtf/WDDe9Ǥj;E}k 9Ә=2fAStt݄ںhX1E:zHA`Q4,4{-X?!Վ?&,d쪡Kjn, %hH@BYKqo@U59yD_+JWg=tv9zڥqLC8/7SXh!jѨڡ{MZK.ysoW0=%w g11(82qƚ> M'-Srzik7u6n0Qn";! `ikvcSD-Tc}(=x*>}BgvRUTLkLjv;!Pđooԃ;=4x1QCL | 8pAff,Ass'ADG;QMP6]vD?'{L>?jd QvU"m=tnPs;N|ERrȋx{ ӂ^3Mzh &pu+F*43Mm8ihgWpFu+hM'EnV¿S !0`Q fOOĦB ]WĮLOnꥸG0{%e+3h"̼͝ .Oٌ֔U!fvAհD$2zb^E/6i[ؽ5J\#3?6}4;ٛ+Ppe&v'^;5c:'*q"?&ߨYs`n  ͝¸Y3qOvČF ~FtDf:5e,Z^@SnƚW:1,nR̤ nI,`f~;y#.rOl)Ctߎ כ:z C{!iKHwRkH3[˽>{1;1}(#2۾b\;egil-)S‹Ί?B~@gҁ@X:tI= i=$m#ϛLBeN7$B wV79QH&>)B wJ48i B! !B  „B!aB!C@0!B! AB! L!bH&B1$B! !B  „B!aB onO3fxQ87W^"V%K)]wx3bOM1\ENzjF#6w^tlQXlĦf^AfO$GOE'; v4dNGJdWffgsϸi{3 At44-$_ Aۃ1T-4 ͢C'h>pEâ CO0!Qe{?U9VR8Jkh5Cui)Rֿvxt5H]8v DhN\᭣.LE{0);yhb=^_G_8 Y]7utEmfA5~c'a ACLn"WaE!б&]GZH1{|K-lKeiLO)ok DhaG;1|w};Q2wԓlC2,J -NũF8:ĹJc…87`Lloqn;=mx]QPDv6 B֎Ʀ8r[lk${~}-b8!٣qh{SIG&~52(fZZmFw/#52vn#`NWk  ӳAwũ6d6S[MqnjZR _Fqu>@{ii+Ѥgبo:i݃>::|J#3L`!XT4Ыs]rZbI[#i B )56,g9U)9ćuJ|x KX>l M=6RGȎ-zU%yffe1mNݻ7  gL6galo۞Aw(r ri*y5-XdgY^1+s4;YF}]= IlNp?lzc~FtDfFoeMY,D;u ۶N 13)H쾬[ _Ďw^(f\{x9ݷcz·ç}Q]{ͮcpP Co )/!/!! GBK($@HBP 5Cb۸a fK$KZC{;Үve0sfv5+tgײ|#b'f&& kog{ 2`obS8KEDDŊc,@FK[P>/zt([uRa ;Q]ۆuVFE'`+5lƛK0 ëXnoe)Sͮ\W ޓfNn2|ШBPW碼w/A$⠰ (oގr'ة݀WM+VrϜu˱Յh.>.7`kنM D"0e3*++ـu#9-GDH~ >FM/Y܀_GGƣXb>y7|"6{}WѼl>[fLA簢 Us>@do|qި}yp&ȩCPuOq]/ {& *zZ_Ee%Fz|bޅZa05؄Qy7 YA] Wڰ7=XTAa^Y=cٹo^; G¨iSTi#\lMœ8htneqۿeE݊W_(BFPZZؖZ4zڼ+4ME0nTO{#2yPkTa~qhf:8"8()/5h%(߱7v1 ` vb #,ę8|T- e%&㡱(*jsW#y h2Ih"m8C(0>_^ʆ@O0d2|GOA&QsPXTGDsam=SRZ\#--CbqSw|+jb F%D഼_\WPn`FD9p0߈՛܊뷡b hœ7TzWǶKtv4˫h<4~wT.p^GX#@)Fiq#wpjE.X$VUU%K؈u|;rc(&1o-so6q2ۙso:V<,VA3F~A؝9E:a`8$L*.Ռ_zϙuрUO݇A=CatOo,~A2"tidG`aӱO–[O?i}["M/ÿ6}f`ցCPdǶ/`Pӏơ#v]v~激e5 SqQAP ^#= X؀|<7ݿM04{͊׀_!8< R[=0q q 6`Dݹl 8Gwn}[%n~q3bhmš=,u##hn߹|E ?܋Kg⦳~D$މ1 f#3vd<0oM3v_ysV)]qa+/x7$^TOCw`]wஇÛ7no-OD}\/c-KZbs{p٥[GKױt<~BrPWzߎ O]Va݊ ^xuyn Fl]:{yxm5C_{ QxU pï{}OGnµW|Ӽ_Gj ] K3K b[澌W_OAbyŢW__;{p۞wrPd>གྷYGah^=s7 „X.Q~uni66龧wݎ oc6~l7/X3o.C,zx6?8i Ø7=!"T Y^xԣ.[zNyD^A|0y2,2TmBЁ!7b#G95uY} 8g% oC@|[ѧxLj-oJ5xq-(c&,݋"^146”%Ԅ<4![cX]m^~Ԓ| <]lr訣9{ /Ś}p̡ޏ]zj7\?b *QmvàDލᔗi _y.Dҫ[;\^hq*t[N,v8R+h$Wާ7 =k@NNA{.vE 럟M~Gi1DD]C7scX@8gSR<u5;vvԠuP^Y`Gx .v딡=x`@MgX8 e[ƜÉ셣fEGG_dEI} >oi(yyЀF<|aiy-~o6^W؞a J XԭM-O$ :%~SxEx%_N'&"_y?|s 8|BOx6aet\m~'X)pϕҟp 2N>¯f~Θӎ ~RTy"On?UG ObMd$:~~T"oGKS 8T(akq _ c'鏓~q N'W߿O}\v4,&<[s09+gҠh9o㠲x (6e_]T5w]ÈCuz(YpzKg^[≿YJ\|]*>F)"N9;z1yCxpG?@E|/@d7IJ9D[~ii܃{ʛDD { lj "4qb/Åˎč+/Q80q]\H$$yx%:>{˵{)Ss96yWy3Ob%bvzl>7CukoG'mA$†(9HߚnXMvWpP :Ҕ&) #""uSpsu9~x( ؄e0""",`FDDDlˆMQ #"""6aDDDDY&( ؄eP*f$Q:Yl2uu:LDDjP\\ÔF#3hEݻ'|&q/xM>ɧjk1rxdοhaȊPٍXMfIZMX:@syDDĚq%@Aa!λjD^>'{G^p9* QXL<sb?4>Q?q wexc%ݨxNŵ\.ڈ}[3|M\s?yG\v=f#7O9^ !I8fL3;?4n¼׎~p/V4@=?_Y+ބ;Oum-Zms%ՕMX*_~9[\{K~8 4\*c U&_8 ڰkjŏ 0񋳧5`a70|qbĴ^[eq܁eخSOw>=YgފلW? O\1nOmq47 ?;.9 <. ?Qj2\}_q{]ζ>m@p&N&,/>('.DD{ }M_(.+O.hǻbw/qF=<o5W-|NlYt>{<@_]7"'тr].YY~Ư:_Ithsԉ>:lX <;Ew+xcMİ>b Ɣ6aCL|c_lsT;ē0mF_ǽ݋;MV4q2T-ڭNqŸb0pUk|Y=Kg*^={`nÜ9s0ơ3/.k&zmW"lZ9"MXX|.~\DD{#?_=ܳлO?s)7`?_>>].8b;6cՓWᶧ]}I׮QpP98wX^}~$rɈFvF욫O;=z'&EN3w-x6n;>Z66VQCaDepw`x,f(‹cۈO}"L=>uj;xM۱q&tˠd]L*ɷ#=XZՙ *s|lt%"#qI8x(FOHlbo߉oݼ800kR=Pa_5X}}Kfo^KUW^K. ?<|[ĸqc8Zw/g\u&kj2xm;p?ClGc5?8Wނo׽( O9|WŘzu-U>[C~?vop {a?ĕC>Mzn㶹~q-l]B!ށ3ss-*z/bfE|/`堫_8R)}m=.:ro&,\ӧO?[wG #٢TwQSSS3bjl62v6ӌyidۚ62q'ތmDDDzMm똡YkM]\%?:ODhhV 8?/K&b0ZKNrJ60}q\Z@E3q7c7qrƨ()bkt'Um'RlذMM1$azu{h.ޖk^>]&C_4cֵn"܈r*;`md#(FUcڐ\L.AG~qb/Znsu5/Y뷞Cqf39&Y՟ jAyi\˜7C쉈uYZ6?~y$gD0$kv^M%.hbl.ߞn;pE ""yZ;`pDhekL\̺U'ON͍du9b-Q]c3M\TMciL.*ƻ=z(<;f>m'syϔ-ș˸dI&yhA1rA#ș I|K"|˜i9Mg(,FB6c&17c/FDD֙-&r}qmcF57&&粁2sSy[\>|>{3lq︌d [^_4S/I\u,t&g͉=1:齃li6}Ku̶<e\Slm{ɘFoΒif~:y^cfXn-&❖&, 4Mrhm|dZӀɘaVsy\ 35sK13{[L1[hr3{[̬{irlrnGWml1sʼ|~3L6eUW5a 83/dbEKC&jLN7lhhVqc9\>iLIb,s3{3ol,ODD3Mrn֢01 $ysabқ͘1d>c!ǚ~lsdNb U#mlȜ_@}Y~11қfJ,q3,u2gr&Fغ&̏M`bs7q7977qS%ruΔ|..Zr;e< @9&lZtζc""ڽ5ʶz]94E&.91SgیǙb&cr397d뺬ۄٞl{mmro5{J&g+sMIl{h=Y$FJ6`2n뱍-oQ2dI2<}Y1fH7J1Y&6e^7vDzmɽԡsm’1u ⚮31}=~Eš;SrsGyhX;`@ۦ̜*托nL^rl:f)jCf|&/6$f,jF4_1Z#.$>cL/&zc4[rmYXm5:fkƲA2cK7o&cs-5l<68lœ›9Me޼wdSDٻ<QD֐ɘ˽ذň(7uͰuz~ivf-`!3&/crӏ:I̳07c4M!-}4]KL>φ4N򱑈0#ns 1_\RA{afm9[܃1IfjLN6]8Ӏ!1׵f3:f1UM{cz.-Z!Eʌ-K7:/鹖,ODDöI:ofdLͺ&sM6V2綜m07c㚹6sznӪ0C.fcHsm173Z3$殙9P&\&/fl1""MzM1C7 zo2ǺVߑқy4NHdC%k扽wd 9{=5-qhH*iѕM˸A%]\6J&ojd%1f,wL%rF7czlmz/uDD9a]':]ތKK;i2grxcSkbyƤ nŀ1s&Me5&2:79VƐdoI~s"":7O|bz/7[cdbHult\d8671łZ(MX2 -.PZm 7/n lp0uVEisaǘMzV*DD],z s={=5~͏'j r dَ5]'b<# 3<7:ocEsɹi{"&&sT6ir31}|t[raA{?~y8f/nf:͙Y;!r3M{#`%撌뼞kY'9mzc:ob:76!2ZC h^\e^q=ג剈(w$k t^ ٔcHoild-T\119{=I6L 3Oo>, w,1兓oMy\sW +fj1[֘ 8>DDuNρ֘ޛ !|$y2s |<:fȹcFP2фCۆ6G"&dž(Fw}9hm4W`b-sc&3\LLjI˶ѵf.YkfbCj͔A1znjd.&Lоѹd1uDF;a|N,c5SȽ-fm1""^c̛b^@6ױfKܯF7qFŃb\Vd ȱˋ&whyblC35f.<ی2&{3t/麟y""zR͛2ktN+c:[L9=13t̙l7a62Q)7L^˦G)sV`,'cTj(3:$Vt˱t^b~qcd1[ˤkNv_s!IMcȹXxX~LmK6'"=n&:m1\~c}|X IeNE|A<,qyɛm X5؛˜-'(#")h mflɹ՚X鱞뽡~Ibt߀9{RrrzlX,ODDOÁmc:,g˹>&lNe^qMP>(t/A s˸jN:Cק:d阞~q""tk,t\{8霤sΓ [újOq:[\ҹT6[LJ㈈(u1Hv-oi&չsΓt}ʺrNQc6&y2am >չI6 ^S}T1:==1?Q>u_ng똞jtL{,TIâ:RmR:+̋%""GAy[Յ j}dkOqS7K%n Ia눈R iZ[ H=LǥZiٸft1߱1DDDJJwLat؎il€5'9F :/sDDD$Fr~q 8FG1i DGCG:'"".5*9:z\ZJЙљcdIeR*Hd5au<96-r+*IDATZsR팮z""z]88akօљsuش3ϫ3IIyhϓ#ZVgۙc3">Fg3SgVggDwhuɵCDDri瓮Ky2;-z:O:s""[.6(zN:OFu?S7S%"""L5J:ou#;'""d9nwh6k!""!Ɉݭד%""ʖl5@zܴ۝\r9Is=)Ӿ^""fllؔepٰI׈c&+6kHDD{*6YkzQccEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD]+R}IENDB`kraft-1.2.2/manual/images/en/company_adress.png000066400000000000000000002545451467704360200215140ustar00rootroot00000000000000PNG  IHDR7\ pHYs+ IDATx^w|TU9LI&! I(*EZVVwﺸ^VZ"*꺋 {/kCtP!-dD9Ν>:B!B!IĆ'6B!B!m cB!B!mcB!B!mcB!B!mZkYϣYB!BȡlZ]k Ash,%m'B!"///.6kosȀAB!BHkx9zP㢢"[]]rB!B9|A yyy2!']-9Tbq' N EB!Ҫ<O\usvvL6`\PPf̘pN 555qB!BZ;'Bx<?C CD\xƌՋD# 10 #JN!B!ҤAVu .r#SSS cƌT9>Dqb(< 10Xlui$B!}iT.].N8VsrrxEE|0 f&,|>eLdvvB!B9)4׮ f]ץavl8nC%6Z)u]T<,ٶͼ^/ox<&B!Bo-$ NPN ̊Ⱥ:(tBrzz]]]-vjSqbgl^\\\. aplfm3!s\LѬ!B!9o2:Ct~u]B"%%Ŷ,Bvl8n=6Y)6 C*AE4n&wpvG/`B!BHk_g0\:0MS("m۶n m`%X9>Xb*T۶5!S9m\4f6WUI)ais7I9B!Bo14 ~ Ì1iYdIιBB[JiqMEQLV9>X_*Ŧiꊢlu]WMTyb6R2';;Q矸>!B!hc۶cmBQa۶PU`ijihf8h WbƘ[QeY.EQt)SlV8\EaRJ&NUU@xB!B6b˲3ƤBDBJic"$ I)!4/S0>@R(n^t2]@ 9B!B!ǃ9Y6(8Ɂanwc%c hUVVrXLBreRJnݺ >JB!B!$94Q^Q:l߼5EQl)m[)LӔiiiFee%RRRd]].̘1HoEOA*?? x<7 +aR߽ B!_ǮB4UUM(0  X~~>6lVqTjis.T,R5MӤ.ιKJRү!B!o,˲l۶].0MSض-C4M޽;Yո9h+Ɓ@jkka6z, r\J(HGVNǸ}UZ}Qb3!B!*\هٶlfBC+;`X-χX8m\.fYs۶$㬜rqqm!,3@Pt%))i4=qu,;'B! c 1Ç>c`VFb1H8[\UhEEE@+ M0ncRJf̶puePn+%J6K0t ǛwƶE!B!Z0KѿoEܩ#:wꈓUkW`]űm[Qeq)%Se1]oX8l`lY§bLUUf&B])TyM#m[G Nv-ݎKףWA7nB!B}[Cכ}ϼUk'.s!t]giLQBa@>UC"B09SUI)y.m!ȝxȺ6ыc⍐r`퀆[sOLXB!BIF44fƌ:;ul߱ 3faf-ZΝ:4;;R^uuǰ}GʱI)EHS0퍃2VSSBPܛrX0d@MtGŶ.A%hlus;#b/օ RJ DŽrܱnCNf[!%+_'*$>W^;qBM躎ne<]l۾ХsG=$6'La lcˢx0Ly&Vf-tMC^=ګ.Jk1)% a6ssd(k%N8niZ\M@m!< >QQ`g@ݚ,t퐟xr9gsό^3!BȾ1(y} <0\[0ږXM>f,M#FilF;utPfIBJ!t=:fH R@JdvE3cَi(/V-FYOŧſ^Ks̈́B?]py]({]t\}p).@Nv{<|ߝ3O`˓QS[;oru_.|v?p |)𗛫.2~&,Y}z g=>~,9Qpmx?okm۸{޸ѩc)aʢ6")q|\ Q0~31wB뵷p5W"p\ض}&<e G}K?b<]A FL*~w<鉗&tM=\ѐ:(?na>݇cP~v_G'na\ۘ}Ŏ1A9V^I2R$L0m)!Dtǒ(ݽ 2r.!,v[uux񉨮I\YV] ϿoAHuB_ª86%+]bpPL!#ҲF09 0 x{/ 'kp F ;~2~/c;l۾ X&̚)^oz1sَ4Mſ^;Ks4Jiϋay h] ߗxWa].Y}s1>_GuB|x;`Yؗ.Ա\&;nOMEci~@sz\0v*ƌ1B@ BqI8ڑL_Ьo@%zgpa6Lb>PL!-Ygf'g~0ƐVZZ݆eP%~NM.ݥqJK3Fo[MܶmG tl6{5xR 8Q{ PWsW lˎ^h{&zceI_rz@,]^L\ϖ, k!-tx>Mn'~Oxnc]:wJl)Λ4ݕ?"_[rD]_Mһ3(E:Kox8EF%a4 wxmx,{nk6BWz55?/n89Tye%<^w4,fggAJeh&ßvJdfwCKMM,lң ۰mΒgwXo\׫3L kR`&N=7||lB))ROVIp'ٽa&OxnVb`fS qD[NN6!pfW[vHv4 Dg@oK]ǝ7 O>"(IJxl$\{ ֥ ]B nw5ƌvi)^l߱֬evҋnjYsa& y=f D)%~^ݺa葃!D98!#,޶ztt=sG' {.8i̱so/Ͽ{. .= 7lB0F<[Y]n])KЅ.t. > [lE! X򽽬߰Ek6hOY66hOv5w~x'Qfm;!Wњ1f]`RJ 2oS[qWcZEWT-FUI$6G3ns]'}b0-[Qq7>B>J8?kYGZ<6yRs,Zz/w剿t^_^^&NU\w 6o-ƂEK"]%VbxQU]]%~̜=eex)\}Ÿ?ö6mيG'<`0ADcϼ3^cp͕ߝL9'7;mlze!_1 ?(|KNxx5m?A(gU !jA39f0srr͛7˜-?L *IދH[flV6c\jK$*6{ %>!6g#p u;~} }NBȯl@s$.j3mێﺵḦ< m۞$qH؆6(HI!%mA:Uuv.\Md`BڤO?h|iN/B!->;PXj5n7?8N5ZA0NlIkp¯عUEfݬmBi~&B!*޶w=cG!++@4+W942iC>'vk//c}?oY&/Ml P t?(B!BAJ%W`~h8&6 B!BZC<ƄB!BHK`L!B!M`L!B!M`L!B!M;'zW!B!g!͢1!B!6B!B!'ɸCU !B!i !B!i !B!iE0.((`EEEj@ ض<B0R2)%S&B!,bYYY,|TWW3 Ze;(1!B![9PR'=mpXMMMt}˲n6cEB!B7B@49gm3cLVSS|>,**b|Й:ij_S$B!ҦZ=1pS-v~ 7B B!1`|qP( ??_nذ HR99 Mjm0cRJf6 eA [ډKitc\%?D!BN -pA8R ű `b6s\L43n)(ɍ7ߌo0gɯe˖&,%%%%IlgU!|0ƕB!qRJ&h0i0 rd8c'%VmI4X帥qɵbcN Aݬgee؛9]Ӿ ڠPn&r}_m.Ml&B!mXTUem;EH Zb͛ 3fد(;;;nyyy-R8H ıa >@l(B,++,b!̚}#B!B!{UMBrX0dN0 p0.| 12kT[*G]p<"a <7PC|0 f&x<< 1meqW#(iyW_yƞ~zb3!B!Es&`!<)jynnT@bP_i3/cq PPPG~@ gLur˲P].7 !im38bP($ H-:70J(,,DNNdxqS)vqnn.sBpl#7c9gpipB?(-sR\!B!ȄN#EQ(2 A4dn[j&@}ɔJP}'Jg3xKV5'WWW^z1+**s5`pB Ȍ1:\.SE  .TTUU8 %R16B!BH!EQm\J9 \ B4MvCUU ȪJ\_n;zb/))999";;[lذ@8DxeR̝P\\\躮\.WVV**TMƘ*8jmm"T*cLeT۶5gcLu$˲ƘSٸ!B!BpƘ9WEP(.!ռ^K)U)9W9Bk5MS4MSBv++J^Xuu5T;mxb+++Ås̙Fc۶si!vB.tplV,R9O8!B!fs!D4g !4M`&\.B"%)Wc%\.({]M2m۶+BrDee%x<z[r8*vLS)v\a*۶Dffa0[Qf&¡3EQ`Y,V9 IDAT,1ݧU۶uEQt)ehEc"B!R]`0#"C:S5Sa>󧮇T47|o;x{L !B~+Bc`YX޹R(b۶-"UZ%ѐXm.MӌvvǶm 1&86 BL5p=}٫J1sE\Eh7M)pUUUbL C+#ᠭruƘ.0-# u[῟~s`Ֆݨ54:ƀᴳ)9K_+qI<#L? +>}?0 O{ [wBic.)鹫2 `GqtlqX=I NUUmRJ )Ns d˜SN W 1hRsEp_uթ"=YEa!2p)_0>GDoB sf!9\UUM4ݶmw퀴,XR8qם؟{ض ۶!D]]]$-0~.4uۼ&݀p:¥W `ͨTȹ3 #NCVԃZ-|_l v#2C*2)|iyc?R,ų9: ƄBA&##ᔔ0Ơ( E|XOw{GN$\͹iS5 SxUUmK]%cL.~ ɢ"VPPT Q877p9Ղ&9];aBi%[k DL(f<=GNHQMԔlyŖu}'NGC4~8~8ex_s=^zwa|lX<z+7wVB!Ddmi2Mز1,Z9`P͛7s 8`h,f04Mb57Nm_w <)?\=qC:!nXm|u¯͏b e?WzP:2ViJAbլcw q/2;7"P]!?YHJQRGytFm%B*RR w`H Ԙ:2|pBuẼT$z*wV3qDUE-ۇA:8kS4Ԛ5~ؑ]ۡc\h!J^hF މ;"9V-j,7Rw]MBi˂;QmH¡87!rR6:)²9w)bضm].WU@ $ *ljI555ncB"PMTUUlib4煕21{ZNiI6|19XGUڷђ؍9 3 gwaXd~xB<06?wr6־>6{>{#~M\  r/[ϦN[ed`zKŸtǯ5_xޝ6 [-H0pO6y.$+HdRJoN: y#O KpMLqx3mL;|jl 0o0spgcPfd .,xXw66{~7z<:_85}9?//b{0"Jdz$}m )YRͿ]Wևc:xJBiMS's5ќuY&isUQŶm 3MAxd kVhc0  ,++¶mzY01lCB'kK\Df۹s'9m!3fnVyލbgŸxxl~?bvř8fPg.)Q 7vXLҩ[3ZvsC(%Ǥ6C3w }[* iTb˒ҲqSx!H}rJNUb (Aɸg#j,}N(-a^ʙ`Têɨ)P_=Tڟ_bycjcQGGfLT,C@\n;0ۿLÏy|xqB!-9} -Hs!mn^WW9vVVK1_hdò,9mr1!Gxjw>;n-w4 QQQj@2|PU5mB`̙'˷:NC͙ega< ",)pQCГ/Z؂%KK!06PJ+"#rfu.C vEodcO5z= QUSQL[pOPOHlp+P3Ηq&%s؁i¤noa) +|Ybc, s4L|+xrY;Dr$0hhZqeWsCDIy]x<:SAz4r4a H\3{?NC4+q{< C!}s q0B(a UUrx9z9|2r1DOz3s|2td9,c'r~G ?ia![SՏuVzS&} !{n2mÿe娭 mHޮiY2wl\9wrh$2۶eY0  {dF}_gYV4 !LJT( [wm" _z Rӽ-uV%~e=!OT2O#}fD<=!@EY%ÎEv@QdFV10k^i|vf/uj6-Z#pd_Qٿ_uDz%s+ T[wd,|=*~/n>3oNhd,ۏ1+ zq߱=20Wޅ.-*a?lL<=u0gMmޣC7/X˞?Z~@9`["wɭXB%sX0$gݐtBLUh.M\go$^ֈP( Èa5s(eNDR3fMhދ HH ڥ`ɶE9@LEմfch:'pcаApEE2,@٘+_^:J,2\۱xH%A#Y F= Nq:JAyN0Dey\aZѩuq蓘Y;*yXV`U0#PzؾcG'7hML9=TONhBetvɧcI[÷+b*6LN.q݇!BZK.)% DYYyt(Xs){c9)2fYXN2R2 ww۶b3 lT P@Y]SS@VFmbn%4BH\:\3)zO Sept005ԟ `/g8xp?7Æs5˰x]ÆDQ^fpc¢-T@yȩN4C'ޱlrNsXksވ[ia?ݳ7irɤ ZT{{?cyspk5NZc)8s'B!!*uMUk4tRV )Q^^gPX4f}&ΜnN8x"d TWa`ѵ7ו"ˠK/^?R2##/ iޅѕ92#ݰy ͍&V/Y:s8cJ9r99]"0IJW 9ΌnFN1<Y?' [T)~0%KEfaxGLs07v<:OBi ӄ.ͱ !È=c Yp˅̌p2 CNi&?c3m Lӌ]1`\RZH e%UֿzN]:dW  t!i널wn*f[(^Uo*mkO}*=1xu.H/AQnZ딋3qF ތ96bDrT93°Fr(-:P{Sa>Ϟv*|[S cო<Ԍ<M`a8Biyisd*JE'X`0a(+@Vf+*.23ڡ!È ǁ@ }Xn{0 9g]T0mE ǟhCH@[\t@ عsJvĎۣ턐 *HK᧲3pftFm>mmtVa}ÎDGߠJ|Eٯy=h5<}YS;[9 :F|i{gQ t]'L!=u=~|5D$*G`)aCzT̯A7TnN!g&jkk9v6m #+ ʼnBm@}7jj[+%lݺ8`_mCHJ,\3{̞=;wD(BaJ,YHiCd)f=s5~7roDOn/ LhaRQ4&n8e|9ei`%Qӫx(<`;4 uk >xgV1!p㈑C@X-tf:;:ugQ,V_)Yg;zFNcX }Pb>xOC mv>{hQLB!-4MT 烮iui>*צXvoN8@fF8 7em^xh}pRJl޼9]33;a |dСtfΚt[[667H =\ydm b;~b>Jn-y'y-aqw p6.ق{x#ش.CZըI PuL0͔\u~$M`^ =4xCFy{(aQ#1y?ƪ^D/gČ20|T^ (&/FÎr[-':t$*OMC/PY< cDf:Up)B!Wb_j*4M5-sʥfz+fԽxo!E՟ ,!^MWT9c˄NT_~Øb9wI+Cxչ(imagQb ~?ʏ7]&%cWA8:u nfޅO_N ͘9O^DŽ;/׾ΔLEoŕz}N2+q0=OaJazTFc%uo[Waæ (;ux[#ai,a[۟LJ?Vp"L~3pS[]:F(?xZ kMŇ_,B]9Oì7_wE[m:,)>t;ӏ%;cNPOb;!BZLӪI .]GzZ*++a63LHr#3]q@hi ^ϝ,;R=63pWHD+Kb_ F b˳c@7w1kS5#xr8+ P <{+ N{2;e5;Id9cWLn߿Dzex'ˎw>A?u־>XT*-<'tvkxoNXyٽxHcU]g -VcNLt.numƝ]/ĤA^ 9p_&rΛ.}+=Q4Td/'u=JL=g8:#s&mIwqK)/CrكxҼ*Xy# HE?ୢW8ڏO<"IwX76;}б;g葇CyyG֐htޭ&bʋ`ڒX~dN.G}6$t>_1bS!iÿp Z8%fk9!n n4,nI@)xm)[W[|!^x%XpÑM~#0E HH{xYn7&8:qiG $!BZcVkڥe^]Cqd- ܭ:+*tv( cmK{2l44;wڅpAUL;32 6}{O 'cY+`[T7_j =_sz k؛wN1 ߼ Ϩ|i-Nyݎ9a]g=?T('1cE; xPY* =?4{>ϟ|˒lMųˆg0qmW<}}|Dꈣמ}I7z0@4>zqt>b)8rX{Odr|,Z #@ks||q__1,Si5bл9W#9O|3= IDATy22஭A(5;+ ;/}M9btv?*R:DAMr .ܹ3'3aYPgnö2{ӷl@\בQ)x?,3y3{8iDF6ovUhcQ"/S F%rgvk,=C>}O~0j zuHwaVToǿ37e]rET$D'JHw ݡHII ,vݽw]v&s޹sĝwΙ[YkEףÙf 3; `S%OMk]+IF5 I_e_u"P3V-dDfT*艣724|[/J˶6̢5)YFէ0tY;} X.g$9Va9|^ccסw'[Vp90ch>jQBX:`aمޖ*Mj:5X  zi]UU {C {'^ez+/C UU }Hp=b["u:-Nh2H1UI~gqj:Q %.0$/ѕalX0'DiM$;vϨ2$WN9L[rK|8Y#e.ǻX[Raf~dY5|lhg$-XFR^ޖi\ҸW4nɂ Cw`eɣ=3,NGv*NF:n㲖-А7#P !7o=yȘ0AHXX[:əEVz2'̒$!K..~=8ood2ύWZiAc b DE」,1evF&=~2JÇĺV]qvB yDcIVI{12(%HRr"j_>;Iwߨ$A,eJ"W6o_=zq_W2qe =Z3GSE|zRJ<7'׸×'g{ /q.ϟ&۶^H\BW iF*Ypww!`/K?tO)XfMZRV#TiD hX)m[&a#-'ZR1<9_a: U +$궥5D OjFƫv\Ŵm)ǃ_PΞJNZع?~e`&b_䯇wb$;9v+!&P7z5g2/.3ip75O[ǑX(ܶ{rd].^xH $:!yZ |x9n    )rL3ͨAAAU/(Q"W9ֲU}SNu{h9  3PMK#_+ryAAA,*1.Q~cU5qbf DU\̇ReKh5_'vMCf~֩e  rss '9UbH)_j* y}1LL)UU$))2Jt899!IZ8saFY  91I2*Qٹ4Uɢ* nr-br@"##-_IVVVX ) eQ 2$psNաMotaA^y9>|Uą+(\5jT Hzx*<-GF5WxBک?||kvgLuذ٭cO j,ԙF DmHޫy\Q=~9W__z=?ңe6lWRn}ʂC˂/b-q$Kd4a=^-u}ɺ,~9Axc777)66$JIIIUcܾp2yPQfҏʣq㋧q#ヵuz4XϏ|d4z*!d"Bo7H:X|E|/~=hZ7+|9ş&|^Nϸ vܣpӊxȀ&}>')0=2(<:aMYIBNw0=ThB)^^Rܕ֣a!= T =JYQN9DkYP[:/޳._J>4佚=YeSɰ3]af׾*gY$!=k򦿷1{y"_5dOu?7 cXk9N_Oީ3q_͉SQVjb,K}Ϭϋs~,,uWÝQU0]ByEYZ&; gs⸸i RVO6Gn/kO{S* |kϢ҅\P:(ݮ+5lϱv85D@n_F'ZpH%)0v>Zѐó8pZw֥zay+NZ1Nr^΁i^˗s:84n@)wmp9ЈS4[3b5珞b^Ӑ~H#XM?`G)1__֞T(悳X>)SEeӞ8 :=66LJzytἢ5c2h4&NJp-#Z_qJ#MVz͏R9Ak2g)q7cfH&.ʧ7c渦5y.fV=y@f`Җ)Ԇ,7Mw}ԎV>i(A4;BxK Km/0rL\6~82-"CtT>o:Pcf>U;u/gA˄$zcԮkMw=y,Ǧ d܁0b~BYz*[DT_f64xw)?Iü?eH{W? pv r V3Nbv(S&YS/z܏,=vD;_tAf#j˟}%f׬I,u EawNw`8/ZJtCAt>VX{|ŻۘLF]E8 q-АFz7fY!EB٫=!Xl%6MdN/ncp:|.ٶ|Gwq 評-J|=ƞcn߁,r`Sm(&ڔO: Z53){{:"ۖ/$h "I$B~DV)ȼU'iٷԌȶ ڰDtZ#9,6 co1\kxlsx? S뗱6f##QIF.Eh©KY@pNĢ~3\ +jY?wa:Vqd.#ulӔv2vƎ_ɛD'hS=-c~[8 k Xu$ΔM^m<ƌø%'[B|Vc}]W3HX{cYSUU9]j!mG?7Gr3LYv6h4g^1Z?˼pVtyrcXm7[gk&UBw1zgu6a?%Xu==7燷R|6/FnFV&2>YŕW:mvofzh__&/\.-kwfX~{tUD!,ߺ=+?' \coG&Y LEO!Z" NFPyI1%?UoWb߮_]3ir2Ι}&0-G~/Ob}iz1kz6:ɇ\);d>PQ91/ #Jar}Yuٳ-Garo kwoYmcߓ!ZˈRv/灿_v{.[veèܘ9M ӳf^hC&l͞5hh kg62k7$yٻ)MX6~Wgj|ʀUl޸a\tA$ުmıs9DW ??|<%Q6SmaWп3{mn/w|еAH1jB/YE09}R q52~:G8mdŪ@gf}ɏpwoZS$Wg*Qg޹Jse' >\og߶i4oXl.) ѰǏܼ=FR,fy?2t۳ojFW3AO't?l̘8lI,槣~ ZǾ4-bZ^?ϸ=(]ԗNsa˰UU3$Ŗ/BM~ Wf'OxEklzyXzIr{/[*NUЂλ>j9'ߤ~x 'g_h~b1}]j;x. Ծ e5 RvU|q4uN?(G+cIt]J%s3]o#5 Vg-ꔂ{wCrwiA۔euW `8}:&0^dj5 ;ء'ͤ=l9~ܧ׈. }@Qک[iҝvle{JkAo[GܣDt.)m(m[U>,B{D 'r@{zɃxG6ۓSTu /`u zO߁@ꍞQU u]é-4F '%SySUi+ ^5\ڲۖ,,%]QuEqtTze6f}1Fc匯Y>fĂ&_C:FKqzHHYыG`z_Ӆl?p.`r=-˖c(%=7i+.Oe DGa [qvs^JFD8*pefe;ܬ$Y1moEKl9Aq-{[\ W{ ^<,a]d ;5 xYNOANۘ)(g gbaHήO5IBq!ͺo{Oe1@@ro.e>-@r!&0Ή3ns9{ ̱L"C\YBrb'Y~|H2J̣GĺЪ䈳}$amH&ڼ rd'\#5BIeIEMNf$@$͛rdϜ0_Tf-3sWGdˆJ-i6k/cy6{\xrPAOt$O3 d<֢,=B*wvz 4Wtũ[CŅ5#~Ro@rI"Aei\ƣA*XmѲFȁk͖T{{1歼H`z9JP+~j pήi2iӕA],^$P ypE9V7p>ZTb/mff2z_ ܊LBEѷ~& I*}L1Oq?{dL͉`3]u@y Xы-*a yҹ+{̛=~M:*7"*d_vf{)==Z6×,??̘Ա`jtS3y̝%_E.ЖiY 93)GL:^"1=ž-K~n=uV Bv3~<ΚĈvK0f3u2Vm>*ZwtԄ"])Tk t|JԆ x JDz)J_ й槈-Ƥl*-`ĸGP^b,J:-Ȩdɒ@nמ(Q".\L[͉q:dVOբF_a_}'g}: Iw$MIÈH)I?RuNg3c/0.l6?|C„hQ:bg4AC7!,;觢>#Xc >ŤQ]0ʕuzW6Ou"VT/KHL. dN:'CaZAꜼn9fnRy\LޔmS v',G$yݒ@n!jE m|7sErAS{V]٣1CE1yr_ZBKvCg?dᢁ->ǎV0Rs[ZoJ納R7}"Gq2%{0nދ/b»C*ԩoi=_Iz1tXY;SW|UMN35`no܅XN"{1y odĨ)\N-ѝ=A.1(ٽv?O_^{lբU$߰&t^M 'z ]9x;y|q>LEƣTKStkwr'@·;AI)>|t%)$$D ( z^++%%%kYTUuPUեI& ͯe2rsy$cX.[k/,ܿ!`eeڢ8:&JDEEz2dJwOuFNH>TR}o`<=S_R',~)^Mal@?A/֪q4|ԩbVk)l]-N;b88-fxg'ĕp!GFiv?s |k:]R7!{vYS_h2e9uXter L"i17eeYaIX~}I%IV%Ht$Y`Pn޼:88jՑ#Gf+ o^#56 ⴉFA#kRcVNC{OA 6WH_eS>h9| }^KYpo- {! w`Gq. .)Aȉ8VavUĿ|dUB6U?M))ĢV5AH[x,ԭ[ײ([9o72mj YR̲\x$\k`nъq[[Y B ZX7bA@$oN˲/TD _{3[[t h4 uAAAxDb>o2/2b,%’$XAAN$oov+fYeiՖrf    7Lf eC,ƀ@4 .] ePvmˢ\m.  ]<AAAxDbMy"),\r2)2Zjh4bAAAH0i㴭i[kImZHi,3@Ӓ$)=rAAAI׭_$iRUT@}*U9&&&ݰIIIf,pssK7g   ?$m۴AUUL&k9N˲̺?[*Z(Bmee!1~ZuAAAx^Xxvi[d&iWZWWWӕ=KbkY'AlIII\t2eXAA+ٲ@2'ji ¿O>7,C@׏p3COĿ.6o)z AlYrVbnAl1ӁC8pd͵gl8ʣ{C.0ӾÈuKտnK<ԃ?(W PdSxːn2%:8%;3Guwa޷̪N%6uo xلQN!aQHGY%Oec=Y: ՝JH2>Nc]|`ĪT>}LbcټItl9u).]úc4]71 5cJrTO QyQC=IoBgso` ɞwՠ_4=1^CGgD\^3* QA7pEɌ W w(()6Z {{{SV=/ߙ6azE#>#>~5lķQZw ̓8v/Kʛ~n?#S MA4-ne) U u 9P\ Va<5;*S~ :ɕju su1BU۷!*C&_]WqIQO\յAλק}U/tR r.!sa]$%3{W/OVc1{7v;< t.얡B\ӈUKs+GqL3D/?=TxzxG-y?\\\1)NhVA goqV-vQ1B,]\ruٍJe-ƓjՊJtN75C۶%e-Z}x"U@!.luGƮ`k6Hs0zТsZGġMnLJ }4V@?w*;ߨٴwbe(u^<pd(BA^+ 6M[v8Ж:]jU>|봥"Eꚮ̲[*ɧZ$@%SݏJdQ6X=i]qUVAȎ8%Ȳݓ~YFVU2.*gq,z@1̡O%:*ԯqvqBPrxeN"#0$HGۂ!߸ujF|:Эs-m ܼ_B)ԀmO<$ هrZ0%qu\&Gc>LDTD$[t 7Wl#TLX>[; }ԛI&2id<=nԨgNd&.MS^6_Ļ9!H3Õ- XIhx>RqvwKsԢ J,=((w0AN9%x도qxW0mB;F݉B̃gF )@!B'$MC Y,_4(ؼ])ΝĦmJv|26cA#7eBl?mRZJqrٸRP! *dJ2 GggҖt\pNXPKΔsj-5.u4T3w7reH~52<$dG!n&!Im̸2 v~yuڇ_bԉL՛ q*Dn_Rs6Ok(֤E r.C .p>*x!,xǢ{K~g9T/M|oYy{6n̨Q#[R AVv"@*J^e85왌-ll<_{ѓuiIF8G&#̦cz r3p{&_V||qۿjX(?J94&UL١pЄ^|9ϟ_BZ'ж}MSp{A8tA,\v-ÿbbb2g/&&r: Mrj ζyl5G!t(f uϋ x 2Mg1(O>όK:GU5;x8L)/6FHz͛a$*|nhMFSPk~.k# e+ԡL~=Dΰvu׬D#..nTއ?3}m2ol?!\5,bj#MZp11)owr,8뵙>y]:w׉ܲ?YCxw`1}GQmlI6 T IDATB RB)RE E" "&RENBIyH!Y&x͕̞ {93vaVߓa6)?l)mF0җ:P7r%8 Ӏ~Y;ۢIkYxߴ$Akj^% Dr6V~<p*M}HMIcy (Ba&(""r҈quRK\1Ia#ǹzuMy\qv?w<<ٽR8u}DZaYhЂeֻOoruv~#m_sbx) sd<,N!e>3O[36ܐUfx wBsoJi?k4 X6<ً@ϐ<2,y=CqhQ ?cû?֊1dQY_ _wZ=޵hԇЦ_w 8ݺIhhsm ҧBC +IkvTN|ƃ?^~hٴ7dU嬵0NM]<|W>y7ojAuKڮf˷ k͘)pO! OBeQ!Ʀ'!cԠqK͆W S.=Ӆ:.""7 #}f޽{h#..(_mzxx8L˲ܽSRR<O4}lm;0""byƈ_M=JbŰ,cǏS4,,sT0fPmt:2N' ۵ܶ,?_F .# ({jԨA`` x{{:ruEFFzu}$ @XVN>Zs ٳg]TB\KrKMM!..޵,TrrkIoeߺED ;abw>qADDDqs-Hëg3kҳ8/r18aN`xCu1 3Yw(BEo]s?L/wAᦏr ƿӐwF!]Ϙ|v!`nTNtv6_9mnSfo)'ueԸ`u&8*-ylc4-""""z 2Gu,?oߢcP);}{.=Er͹:4-,cu,|2{31ۜND/Xt-ا,jϛ˿`㇃(u<=H?f㦕L0oh$L]+}i{M[btǒEĊUxhC@jW-aL_ lX!9O,H^` ϝ[8ù IVizI?)FpĖcu:?&8>YOeؖZ9[LչoXoDLYҭ3v~沋uKɧ3i#[aoX}iڨ>4'D ׫>}/_lEUDY@־0ԥvtq)9|w{vt/ZƓʾY}h֬M5ID՛j +`F;ohV~̆W~9pݪѮ۝qԫT.0wԻ 8iP(QGO;WѢ/+zcܩ Umf+HAtO>eYiӉeXN rr>Q%32w+k&-ݩ}`[>>gW1ja+d~c~j3w?OL/'CX[n/ۅu,kkN [MlJ9OG rx<}/<ͬ!W$vf'H%x`"ZT͵3gbI+G28ٵ2XcOo9 mG@a?"mux!o8 .&8է~7,=g,m]`G^?$bxt x+E_9M*`'淽p QDDD &cɑ}sfc,^4zf#=s_c}q.M nE _m떴ev>:{QŜOWNo7>:U;߻|4 oF {md]/}n!F^飭&%Z>Hg%<ьv"#OoNmynu,FXkLoX +k= pNCs$ 6mW=z"6=!y`0p nY_,07+Ѩ~}|."""ӿ!}4/លKe@Y+J~> `in&=fA͙*w+094ԗ^VMU=mY72}=ֹ=nm,fWY]_~.un1sۋ VY<cɑڒƸe/eѱx}:r`ҟݿRknn&/xGku LX Bx#hzEW cIހ _6mPixb cڈg,`[%i4y".隍ZDQUkGH`,""""""h """"""R)H`,""ZUDDDUo~<$""k|}}ZkY1c4MWZ@SEDDDDDq9 yxFEDDDDD 0M00L3mu;}0  fژkz6溞+g!O2c( Lp_#QZ˨`SPT0v YkWRH`,""""""h """"""R["""@jj*$>!IDD$xSj̛SAXDD8p %KhhkHbTVյ;s x&uø:kʺ^t`,""'$(H+Z4 ="|K]KjD<^kYDDDDD䆤Mr;t-ܐKJZXDDDDDn| ?Ē"EDDDD䆧k_l?NgվhVvmSZz+4)^D{]% >v- z+uBb"ǏT\-W/ _,r-)c6>{q$7Kiw`d\""7Nlϴ+j19= )_&ѶUxUdP~Nڱ߲jO(L;s(G'HH_DD곉0~#>ǽHW_|´qd$ח\%4UB W9LtgFRT &i_DDD ߲BI*Tٵxb[s- ,ʒv /*Dt~n6:Byۛ>Ցoyl,z` zdݥAk0]hb^ώ1]pPݍj6>}_dp 1)>Tl:1O͹Ory>Սgw*b,S(]>z&b6OcuD;[{q$qXLɔ_|0Ӻh.OKdv,o4e lZ2Q>47?[ctK_;^9ȦPz+\zEn`+Yj%&d@-o_&eX VOo(r;$(%VC$$1;P1׳OXSNeGB$cZ7r|Mˏ"""(_dԨߩwMԨq\?HAeǝ!(L`; sNBU(>^x8~F5?<¨۷gIoej, f۹fON`Wxր;}鿗` AiQޣlM.>掐X҆//g֮=5UO+s+vfL 7hЍ.U11 ѐNp/"""RC)q-+jAZ53y"rUsgmr γ+DakQT3iNR!~?"X~1Ǩ$L%ža`YVο#>e0MٿrsWh8OdE#rYY91C(l"YqsaZ$[9`c"ȵHtr"r sGil'˸8M7鼝3 Y(L9bb $}'1m*̦Q-xb`_ٜTwΓΐG[L䋙tA1]z 3§< ҏ:ɉhdWYDDD (3xChcV ?Ks]ym~:;R҅qx9ߤ̀} gPzq< H:kwR=VLŝϾKx!3$Z_LZW'-?Пor4ʺCʹnUߝr">g&t'd""""WL8@Mg0Cȃ!]Ywpڷ.=#+Y) 6L?ڗA3[w|= ՑVw Iy<_䓧A&Ɍ֌4מrZDDD|FX pX~ϵ"[dkzL\@B-^Q^eqn]۩lk̓60>ﱫO5[MYOήǓYZ}%h8h* ],]AS?k6X"""" /#"fw{~D8Rc=o1N0=@DDD .|FXD.'^~N2 ؀q5L[% Ɯa """"q>۱ָZDDDDDD L^ iBkDDDDDDrq>37̍>DDDDDDq>#gn!"""""||jt!]DDrQe\kY13ysCD$/UR}A&\KժU\r)3V$37KiRz5ײ cgn!"""""󙼸Un}|&/gn}|&/FfsCDDDDD$/(3y?sCDDDDD$/(3y12}F""""""yA8ɋ?Fчd0M41 Ñu1 4q8zN ^m L^դ`E/}.W+>DDRTI6(?@jU])$WٹCrKVUTz(ED$'$(H+Z4xײ\c1g&WR*P\ZI8ɋO,Y%i# IDATݾ7Ժe+PFEDDDDơ`vݨko1%|P?`(3 d,"""""9LgE$؜iZX˵`cyS9Hsݙ}FDDDD|ƶ "}eƝwq]N8:? w2A@ڷ>odҞNfwkۍN8оI]U6=ybη$oWc\ce֣EDDD$߻n>J "JְathtMm'26g\ȨmiԨ)]1sG Weݜ\Zkd;: V>iR`XS6BZ!s/)nӧ')bx\Mwƛ˘9yhB,@ņw?˔Rxm9uLYӥn9tԦDN&^]GS5g}ȚQlNȳKM^C2&OoȎןafLgfM5X8jo·3^{H?W?w/Odz-Ġ 0'MaC|y3DNPI0ik}-3]F=Ѵ>'Nfr'VB<қTit#p Y:! ܋5c}~$RaS7Xʆ}8=C\143C+Yـ1Ҿ^$?%}*yݴ-}Y/ %MEGڋSq[2zO5?܃ճ#$B<ӡ:rΕqKNJޘ/7wjCCz&L)?aٗrXr(Vvb.$ 潉qyZvቩ87^ xT #2$v CMKRpT!M~Wsڵ?mZ/^%1d̴00qsz d9~ gƊy0t[:0pha!( vbS'9 לӛ$ϓ^K2wywdxAOЧN(6]2/[šyiDWOQ-g xlFBҷ쳜B_F`xd &!KQs[2HY; Bڌc̙7F>}Powo9*q|cyxxޮ@ћ2a F"Y(+|O߷gq_uy^dWЗ…%㈋KOYO9RZ}͙~xRLpJ(lx@#1@Wcy (Ba&UW,ה6a-=o 'q0*aϿlC*)b$[61Ut(aaaiKtj֥^SH6Dn[ħӿ ds0X[o3S#/jmLhiR;4E졟l 6&KD'))6V~<p*M}HMqy#4{~Ş?cKv|76.ĉ2U & ƾD~7hM ycYu_p4 I G DDDD.qb_D五~-7R|$>zm ҧBC +I98^b*OLʛ1zE1i<)MV8j]LeKq+9(D!r4C qZGYGEl,MʶlCXkz|G1o3\x:4 K牉0-g[:ж슬07Δ1-2#0~D)= yfWOr3F07/9j?$vt{T57_:0|BxWkƾܛJ&q'Q:hRUmpXkL9ׇ~R IxR-'UIy<_꺾Fѣ{F\\Q|y#::p$$$e{{{xiضgv`DDr۶m+}JeYض͑G)W,N3=WӉeY$\ŚӉeXN rr>1?\/݆ llWĵ,r9y$9_3 0s%&w-ej+{~KZwEnH_E]"""nӖW띻y\`p`&if; ֖nfGe\u%>paˡC)] mK.moi0,J.''&&c%'';CBBÇ~~~vHH]Z5{̘1F""""""R)H`,""""""h """"""R)H`,""""""CddkYDD$WEFFZk͵ ""RUR}A&\KժU\r)iRz5ײJ-""""""h """"""R)H`,""""""hz\5k{Me^|Kxf~ÊhӰ $$,6w&\`|y4w^ ol+<{?N\#"jLyV9c֯]K8tсuou /T8H|BkHZժ&^OOCϱ3ܑW"B=|KsOa[``DZWxf7:qXN/;_ٚBCρ? Q>q^{OcGO8O~SXM$^%^uF2F6C; hʙ/0]D%WGj]6L3# ;8 '{cm 2ڑ28 W}X1'U)_A/Y8x&oqjÔ^_c"r8HR%)$""k"#طիUumkH)7fM#j|sٴ};[Ha [NllcOp2vТ̕ZGqTGfˆPl|ͧ~3֯*Nڀw>x{7oc1is6|g džbwq|r JJj"YCe9ڡ#v-gmVJUAF1Խ|ڿiNS'5%>ĠE bsEZkL:gB<ͩ͟lW6/E0-l-; x>͋)reܪӡG-h}TuP4.fw,pen#śӥͦߓ A`Þt5S'8OY5ϲU[I_Թ;v#;S[pyc,Il^F&TJxe}k) 4cÅ10Bwe҈ƕ?椣9N3*រLJEDDDD`Ј5y<8 Pw4D"i,V{?ǜ.E./j8"3-e& iɔ$܋6_t {r#jO0(>sI<>MLOTίl06NGwk1/7rP̚B3S+G1u2f>w<7e 5<.s~Xh8O<2;2 ׌rkݕ-3]xtmjcI3VJ]Y[wNRqE//ዥL oaւ[ [>s y&.eR|׵W|k dcOdf1fȼ5 q-HwC}"^QVz,aÉ""""""(u,ݯvN|?/?~'z\ds곧i=`Gג'ON|r'y#υwgKiw`]Ss2n("""i*\ܨRvr[2M7O_H}1GfpKW1A9">AJ3v"eu%ˋ"f8w7u "rqnf>/<,]9=K8jIeT,G›X} 5}\ fE`;3 o [.0{r]Ds/ji 8EOG/>N,eva>'pC+&7jL6=`?؜tu/"R}l.OuoC hy(vɜlE`4oܘƭ{3bO{ѸQ#›K+#6|'T6r*i+g sp7iGGY;n Fyx8zbC|wY/+&ү}3GaTK{ukfN& o܂MacAthBxo܆ip8p8X}MϺcKH!\Ϋ:Ҵa>8يZɛ) iQ0wܼPܚ>OD4hڞ/}Ğ?( h&k؜Nast`lsDžݖFu3wGՉHc D})WaL\.nӧ')bx\Mwƛ˘9yhB,@ņw?˔Rxm9uLYӥn9tԦDN^]GS5g}ȚQlNȳKM^C2&OoȎןafLgfM5X8jo·3^{H?W?w/Odz-Ġ 0'MaC|y3DNPI0ik}-3/=|ƾGr8CpRAG?[(8_2jb5^nŬex fH GWi 0b,"A*?yu͝rNWg ʆ%k>* T.~۰yPK/jqÇ*t9}=+W{:{&touÏ^=LʔKٰ/g+xFyh%+"С?]׋d{t4~)^dr_Jj{}#I!oVふA8#o[HoѫY~Xb2 VG, 9#W]ewn3!HFIֶ9bIIpH$-(mXHubZ2y\DDDg~Q ʔ-"8;.M}{,?jU#BBɬԒbU IDATvU2s:;؝]>4~۶L VLI#|mV/m|S)"##]p/ZC]ril28eݯF52Yvېf/{y PcI[:rlޓE&_GӸd2w'?ջHH;dܵߎۘZҾ6f#Y`ϊ7rA[p ,䝍dasjJʙmݖ}sx_I+=8xREDD`1}kG>Ai&?tMqC8r2tMDx0aк WC<cPNer\ϋ)x6)V6=OadfX^\;U頡 ⟨~e@껋Yg[zcbV`P=tnhGnrԿ3+.ܠ&y?1i]L?J՘ynxy_0l:C"%pG޳7F<ʏI6~EWFOk 2x!ou(C؛8RZL$3GJAZufL{p,BXh~a,W 9+ĵN:Tjҋ#ڸF+`3G;͟!ץ16oFe̤S`:>i^=rgP?1lԨQۍD#55ը\h9M˲|+曕1M3 ۶KifmضiYmsA*Umw:X{Slw:3YtX%"W#Gqcoo>]`|`RGY[YQRd~ko9sطooxCXDDDDDz:X_`DDD;33j5k___j֬QxDDDif&fD9P><'O\d>OSQl65<լ'o:_lh$;` y0 I_~Tw\x0 9sg^." zR/[4U3HG ۔S4MH.ӻ']ZѨ~QM[ ˲ѽQy7~TݻuŲ,>Cḟu˷l 3[O2eIy3-pofњ je7ޭgpEʫ>ܗ_Y\5뗽miy그p귙N툈'cKl@nݽZ vW@޺"W'QiY%ÇRHeĽ1ژQ-3m`ߩ5bbm׋'f$Ҹ\- gtˋg2g;GGu3NU71cpOZ69u 6&f:7j9:,jf1T'¦k89Jf'ڪM[t?;NOuf4>IoNtd6 Z Ilæ 48ɞc+Ŷ#/,y㉞"fII O(]ڴYLKn5k:MWoڶSt,A~>TfPցk:,}6}Ǒ#ж=ݟAݘ=)xLW^EDDD<[r.ɔs7g]AX}:ͣ1Ե6i'Qo.닐gnթzo灉s0Ս>7dR3Hi+'#mʞL-ADXqz5+'"osCٔi pM ㍤L_G"l;)AEIf'7u oVeƣaIN?$k;<>z'JJb^lf+YQChM>Q{f@,}!dcr&,ju+Z6SSDDD[5.mSѠACnj>'tER10䇄V2E{սuK@F\?`;kѳ_}t 4Y' ڇL "VHY$FL,s`tlϒe{SO-^:V,aSE/UuV53A&ջ uN(oқakV||ҥj1L3lG_Mx8Z r.F5Q"Nla'[8n\ $%%0ZO1:߆lJ#YH᤯ ʖ-.tr+rpcشnճ"`<ޯ;׷6gL"л= 8@hhѼOGpV^֚ZѢ ]3#&Od\L:Kf#gyΙ,-OHOC&`q,IDf$<>αPJEEnx%<Iu )Y'HL:šhӪ-Zebfq* 8f́ұ}?){)k߾ gv\(iɸ&f_8ߚ5Kץ`ůi׺H=AR |͝?[W`R%KsӏML<=񌼰fH]+Q#p=(Ff\_~ậY&(؇o$Qw KxK|i_`#ϝ}4V40)^o^6)xģy>JjV/ "4U /ٰ}}(u2%,ԊY`T O?CS6C[noWUwh>ۣym;UkjGlqDDDDP0лW/LdghiһW/f+IkX ժPL',[4~۶L VLI#|&i".ߖ7"22u+];g5$E۬.G?{&sY*|oY#5,pf'ًõE>ů/c}?mx6&@`'YY6V.~: eޑAH]b2t9y<=?u;\"`&ض DޅakN""""guDV*w9s~"֣7s)ӕh3Ylv ͣzEDD.֟wn-x/K@@41M3wp`F6Ϻi׉=7>wgaٻ ]GEu4 ae'O2M3+ t[pf͚1c8^|+[3` /2g\y?in?9 DJ8,fl]V:K ח#zͦM).[ 4w^>-"W!' >t]19+c`ժVęQe+ """"礟EDDDDDPS0.DGGŪUV8:ڻ,"""""rI("IIGg%)wYDDDDD1ƅ@nYA4c 00ﲈEO`@wY0")Xٱc';wnhQwY0c4Mjժ]B@SEDDDDDPS0BMXDDDDDD 5c)EDDDDDPS0BMXDDDDDD 5c)| ""RxdggknӽDDD(F50MQ^MED ]vS|9JEDx7%Uw\ABDKKOW(J$--ͻ,Wj """"""R)H`,""""""j """"""R)H`,"(s9`y]efJ)˻EDDDD>Nac3l tD4 {%o'bpiNnXsNOMDHg?ד:>vkߊMci&lOsמolJ)""""`,"AX}:͢C(u-MIԋKXKV77w?_tSϘvqޝ8]NϜ#X]?~oI&mH.haQ=瓶8}76B w뾶b\)oO彉sgX_v|J$R U)B&`%dbJ `XEDDD\NDfn4hА[pω7;+GPT ?̆+!4LQ^n~DuCݒ>`P=O'XbZ׀p-݂.Mm֯aSB1~;q !56&C>Nv?u:!0QY!'Xao7ӻ_}}(Z_/e]Tlt]9a$[7;@rBIX5-wDZDDDD vw""7ì>0LR}Ŵ摓3x;.»3@^MSX;LV<2}=yXKZ:پ G Mɸg1L*V= "p{xMzn%<Ӷ\X)}8z %DޖXm]3>L?Mp9+c ?BҵܻGiiǴS)ϰɉft8Nb!<="*DnF)Q"x`xZnκ8*Fu0?ʾ/2hxNCvTs""""r.gtQ ʔ-"8;.=OoOSj$ٙdm𼘕ZҮVfN_S`~x އoi@)idy5+}m~kG>o.p4-WI$,-QgjV{vq&Re>5#i4 _সt9{:&"< h]es!VOǂ1 (]u ?Jz9L;Fp<ۤX> ؇cyqrT62+pׄz '@*5m3˳Km3/2'q"h篧FEDDD$}gԨQۍD#55ը\h9M˲|+曕1M3 ۶KifmضiYmsA*Umw:X{Slw:3YtX%"W#Gqcoo>]`|`RGY[Ļ|ԏ]ko@{={RȑӖhѢa3 #ղt 7ɓYifXpk߾}vPPn׬Y3f4ZDDDDDD 5>β h/8sjVs{ǁ9 s܎""""""(6FЖ-v|+⿯嫄dwvPAʟy]7  g3[Rl&Fo޴5\׏=3~,FTj8_3wэפ=cv/|8;РUzPsV wD7~9z{N؜}ՆFQ?vz _j !G4 7;dWs]ִk^_l$MlɺƵЊM3am`;8>k22LKlU_Wix6swL~>1?sKױ׸dC,~uu|_7˘ (j # 4M=k"iy"4ְ񸓃n%馆-ZůR=T)74dl_f{_/jI=WO,]DF*tE첃P1=/_I IDAT,Aj\V ?u©ljDJL)+NgͦdnG(%3d  )vҶL҉T I`tI$=Z.g$ hI+f#?oN<А>FhXDDDDD.B*nCn<+Si<2D7+bC"0o_?/޷d AcB!d!') 9q6#,>% 0^^xSFt<4O_K3.-"@`` *$"""@||<e )DM῟I5oo_wOEWNI&-27V IҦOِ`[|zt7O||EvmZ?ߗz~8O`GB1jUm *aQ0c:eSzuvݻDDD Fe + 14[vTkNX\!5bj4OuࠢD6F_jypXTw6!*p{yd*Ȅ?' cJd$?t?E+|p:FhXr1MZjzEDDD BA߻\!Zњ8^5:.A7qK ')Eׯ-J91V#""""""J-͉=TG·l[J%"""""W??yp/8Oc֜_|%"""""E bA0k溊H`,""""""j:XDf׮ݤ{7%P5j`(bv\rnK >>;wQf &3H!P,""r*IZZwY0c)EDDDDDq L._R:XDDDDDJJJ"-=41 4]ޏˆa0M0 L[<9|5e{iRlǗH!B@@ip8\8S!/-(ñgrTj)EDDDDDPS0BMXD 9s9`yHaoȵNac3l E)Q: ;>^u ?ԽAaDm\$8zcGч{V/""""\C|=#f)3rؓLMyw>oți]R|׀ݻ;/KDDDD.}kHCXl`S?H謍jٝi;@{NiKl^<1{'؜X6o?3k_^^gN؜s?ax\bcbh֪qۦ#fb}o%K[Z6Y& u'Y`sxUo^ߖo""""rv1kAX}:ͣ1I_Z^7EJ3J3ѭ:u1CO<0qs9G|yCBW0ߓL*?u6}a>zy)>`Ed$M iLN 7?>S>Uǩt #˨s˸|,N*n,\)))d>&ឥs|^6 i:Ş'>usÙ+>۵sS*2^XXD!lڍUmLJ0ba6,\ITۨYrǁ=սuK>TiuO'\pw֢[Х [ ڇ X]'-js}|;͎=k2mLLFq*װBӠ%9d=7I # Ñs+{yspνwp 9m?{.J*`,Çٹsի@ҥz\l>ô3IӞzGN΀GMSX;LV<2}=%7JGpV^֚WVim\>iL}O@z?;MHypTϑ5e1&Jצ\X> ,ˋ+J44g/ݟc^g.J.)3`qps|6^[Z ~q,m7%\DDDDJXÇsGoU?u|fNg/ K.eЀṯ\\F~C'3 7agqz<ls n2ۻ|f{pzܻܗWr+xOGU/F?kp;̼=˫W6J`'- """"rNJ--D[=w ǐL#rގ8%%%ӫC""""""W3c9  /\_naq9=p,\HnhӪEDDDDD R|K'ʔ)M )@Jqy0\[le˖9ÇӺUKM7Qd""""""W!1)AO<-[skƍѡ}{6iLHHyRRRXa#K-c_t:IHHp]z=-kSѸQCȥfYN,~d6#]|4Mð,Wu*4m pݻHن˜{׺}rR0|~޶مGyg }oז#G0YBN'׬ԩ ƎNJO?Wv,mᰱ1ܱ7%۶=Qc;g’ ƒk֭>}5j /Pj=DFFRTiԯO G׻O Ν;քzDDDDD2s/'66ps&e`bb`` mt>H x|Ϡ`,ݻG;vGQȹ -Jtܙ>{OժU7C5::9EG{,"W`` *$"""@||<+¶2-lLhm`M, L0Mp`ئ  lTkpi m3džTx!8w`ȑ^߯1q$>='6m(R_xbŊ2w|u\Z[D.իcNv$"""@`` 5jT._u ˉ+&i``baamC4`ئimh JW#caIgnӺ#G>|ĠAɨgرc ,0ꙋ?piRVMﲈv[[4θ&`cҵPӉIuVe}[L=>(S4sw}d xqvq\s^:33bŊy8._@@@cnjm^yugW $|5lf'qK0坡Q0.vŷ[Фqc7nzeT~' 6m={<դ\k`NW`{=]|`\͞3'w{lA g7ls-Q߿/q!.7_ߣ[f5羿^gW*q!u8ubUx\70ukul@RQ9BRÇ󞓈\ڵt&QF~+p_5~캷mFt(Rɹˡ-.((<0dgu$1RJw$"Ǯ])W""DDDO`]ԪYûړa]cCdq _hE:~xrΝI?Q'WDZJJJ\i """QRܽۻ|mrɶ/, KA ]NMMǣz+zwN8""""""u.ZT_#Ll |$1ѣJwsHk8gߡ`\HEFF.9rģ IDDDDD!ӫp ƅT.Ï-~!w:$"""""W ڸ3u wO(R7|3czW}Wjk\W\raXb,T4+1[r8D7mݻ9^=.={hCDDDDD.eќ͛Jwqn骧`\]~65bqXW/|+ڕ_e+M{ٹIZ 9t~}5k||O#7fMc/YCX .M/oa:Y˦T)(,N >PlY{5/}xE?e[^R U)rcΊ+30OcYnp9 ϑ|a9W^PfNv垎< 9ԩ >Lz^ob6/*LFF~ڵëHRi_"Nma꒴o[ 3c+;yEY lCj˲UwBGt.W:>mK[I;;{|D>Q2;%髯sChfn4hИ;Z 8>5ث!_YV#ANAhJ1[7;@rBIX5:GDDD`Ý{=êgla sudf+{>3ӽnK7;ѓ=׺ =zVRw1""""i&kV`,lh{aj;wH$1Z}зo_̙Üs6mA<.;ij.tŌ.Ʋlr)o8fnyi;iޜ7ש H723%~z#~;rJqwÅ3o%R+Ux,{X:ΦnzNAuTh""""@6Һ`l09Ӭi^8XXg0 GGN*v+R wP :XDK6t('SĻDDD 3lxs'# qd669[19Q0vX Ў<`/MҚW\ ~v2c B R݉)ta ٵy@v.9d`,"""""ҕ6 6 Z}r/]5cc.(_lD " E3n&_['`,""""""+]I:YyP028NynIͼ=Xd/Tq`,"""""E K!#'Ě0pLX1:c,"҅R)r 55.iee7l9jpuͺ%X5`Q8Ց;'c./0hA7%"""m`֬LK7,al|CBrV$9cqܱsyNsM!""FXDDߏxs2겫њ҂mg}ATvNHXDDDDDDZK4+dv`,"""""-\B:o6M:ضCH(nNXDDDDD+3.Vjؘ-@l6OdױZgʦ`,"""""҅@frZ s}9{Y -T6v8cYI,<xt>8ʄNolpƴpY]lEk YlG;r(J?]6D@hq}򋈈H+XZjs콌,K&֧#.nw7>׍a8̬9څw=fGpova-dmwc3Mawp6\]|܊I}p9q9=>_v[q!"""ӤJVu[^|+3҉owxH,Ko^p3sGsݲÊ6kO1=wq ׳pxuA$0;ˠDv7"&I~qƒ}N9w_8~O~~o%~-""""Y k9fiX ƸPlpXcⱂ,o8lz@aC '1x20/np;еDlpv | 1;s˞3O5x{K,+$"""aܫw.pN(ƽzɴX +&L>Vl8SZK;2L'׳2 dL.۱GϘ}fԒ OWqp~cqռ;zv-[rzegcםݮɓ0k٩RyElءi)f.͆nu}k-=Fk1 qyC`,uwa̹Ai?,FӤ rg$|>I>guS쟘G^GoS&詫շFpu{-v:r̋~׽`9{w"Ƹ箅?^G_ijA;C:I>}Ǔ[KϜ4xSffpg3$u?p忪Urݕ_e+/rv)䉿̢=nW^'o6ee97ܶH6]]ͺP ؠlsvN~`Kڒ^2 Js+~Rn}[4iX0/vۍ7X=,Sw*d |4lM*K3)>z/FF#F&{paQ{*<(֛NbX~3'Ijk~d"W&5Ayu߈-Q9^/߃!ǐ`y=z7x&J@/yo!pv)ģl8ءO?>~1lZ7J ᛗxLIBg>&U<ȿ}g7PsMYĝ0i/?Ƥ Ha|ij`^;EKA;fg *nti?bnC8wp=B<'.ykjEw[8݀A5ۺCx_4Ui ^Nꇿx!Kѯ4\.ݛ,.W^}zaeCr #WKϟ;sM75oQG`+j|uͱ'1oGγw'r}3g䈼(* *fH{Neܑ1bsss=Ch[!ccbOng?NgGE[x>%/s)w8Fn*ŦWޕgO0msxM #yks0cX{Nc~PUK倡[ y,aY*ν+Qٛʲ%Xm Ɵt%o&t:!w~l߳龿._BGf\""""˔6%`\΄`8~\:T'&k*t>~t:\|Zu}[E Xk*he9oT);1_?ZcfYO1&kl6}?d~՗V? Rl5_:y>xe &L#K{ @[9 0F 4ARwSXD:_9}Y6}xUGn1#>p)jytmʷ`vWpw9-OfEg1Zo͆3jDžcs^wW~V{j!s$K/sسY(>y9dUŘ"˚W˞DEkg{NtRUoËdef+@o=xA8:?N'`,"MΌ}6AwA]]<*<" ֺW3X ~#U9e"[ywc.*oa8,Zedelힽ]S`,"""""*B mBƅ8+Sw """"""G$9?ˆ24`,""""""nl; tWh9q-(tae̚5;,"""md֬Yś;F4fmd!3u/.6}:v4j ~8 1L8o_M"?7aC2y|1eJKDDD@yy9Æ 7wj-̕-a8m󌭵c"C} 8޺\0,>|xtQpSpr3|@AdT;MyŸ%[.ECnX5v8cXŷDDDDDDӚ[0u'Vdvi2!9sc`,"""""e2ƆenOGi9Zq EDDDDD "פTyMCL0.e!v˦J CrR0fšn6f pZS S3S[ہH?!8ËkEwiaTݸwc.)L9n V!fgF 0̣G{oeQ5>M~xbHR)r 55.iee7ljkKđkD^k`9Wp\k,X09Ʈ°[qץn;S0:rX).lP)u6t_Qq0zBZe <GWJyɵ9cEDDDD0ܪp&fMp.ۧm{ndvf\Og;[:'gsyf>myu1OΨϴOXEFH7AU7h` <^a߷؂3Ak)K^/l?8>1O kL[#SOXf5"""""ґ"/W0lvKNa-t&6n=LK;ck%A)nZ7M)hYDDDDD:ֲuY՝-%K⹓;ci0as>^[/sŹDDDDDs0DjJnk]pWn>,xw˦@I ̆%ݳ)/^Z}yM_j\4lK{ dH{rÎj ͇4g}Mam]lpem)K3C{d31ҳbޙq"""""ҁbal,Tj|_W1 #Q%ٹ Vx84U!"m.bp=go O.vEDDD:K6/aju;yYdG;^ޫR펜F ƒG}-#zl9ȓ ֔>kq493ñNfR'dIct8[Ǯ抻^cʢ%6fѣWF8oOX8|x|6tcYq1uSr syG`:x?vډeù:y5J>kᑤ׈C9l_ƤGp#陀dFJ[ \5pma,=2i*43uqk (M0< y [(dPXf~1/I_O_,X}"oзo%[\ˣ{J9K,[潞cΫc'S}UQcQY}?2٫=>gq;o㑷fH4p 籨}"+Ջ}sWzg -H,qSB6a֍;V#mĶ`,Xྩa /yMT5-߻8㆗fZIW,W^٩1~5z^z0w\,}&f^H}b3ZUгG1Cl:/`B\oY/A4S罽-\6N:h2^JNcATSkW7e9K1''"""t@Bn5l []ε\83ڸ@[k%voUw&xn$[ -I.ެJ]mFUgHlNGbf]%l'^C-$ƅ| IM{fNUs]m=,ZUVKWXs[F%>5әzkC^:q2Sfk"U~x.pmj{a($9?/1Gľ|Ɔg]Qóŷ֧qqx߰6۰nrޣŵJ7c~Os^cfI<0.;ekM#?f^˄};}eOtrG\|2kN=f)?p6[m3'^?*H+,Hp6w6_.c4_yS=Cg S/$ +jcޮɷ\~5_-ѹҎL ۽zi(aͱsӳc2 漗&Ғ <|τ[`B!cOE9>@uq6]-^kc ޾g^,8[z""""l\~VD Xwelۚ,[9%\8"4w{6|w|V"?M#~)3{v^ >Tyn/:b(oՃxkk0yxȊkB]68̹X%,Qa8ݹ,֦g z f_N;R02iu?.%"""""Zʧ.f ,פyoniŷDDDDD:9,.[r--]5Y7BpKt'7:7ciQq°lJ!C{$3&Χ8aX``g]W-·0eqf67{HQ^^ƬY߿_KDDDY(/+g g3c\l~"VMscE IDATi4i{b~=ynKY4p"dg`h$C{$bGVY6t('SĻDDD 3lxs1A \'f/<gh ǒΜ>-dZڕm"Y,m9| ż:t8a]~$-dd* KB#5Z!g_1|zf"\Q:'ŭ\@v-X| `ѮjpUS6(cAE9,HqZޝۄg}}u!"""""*|˵ a%8YcXlӬEXת ܲ[|ٵiNbZi+·)̮uUnWnٍA """"""̪ NqgsqÐiό^>!hi? ]T+(Oz*qK>_⤷2Ḳ-*SH{dedQtk&LNTmd*f})tQߨ%J;Է06ͩoW1oIoT%""""")@dէMcthM4_Z?ax}ړq4v"F)ܕOj/~IsU4'SՊcDDDDD=R6H9t]+tZz춣`*e['MUOn7U)n.}RM)--ayf͝KiYu{[k4Su2Mp̐4Nt.𡥔wm>ѯ<2mA$e#räZwurTxe:6d nDޚqn1d[C8:s&TMOc ƹ5ȹH VB]!ʏ;=, \Q5wnǢ?@y [wxldp\Յfmih\2`8X?otD0֜.dE&Sٍ|Wo>:۳( { ֹ"""""m.esKkDk7:ز>Onupv`Ex\~hzO~M{.k(YIӢ îk܌L °%6vfڣ> o’)`E 푤=%i>qjGSL_}K Lf%.-6w>qdG?9v|t`E=)˝Qk[/5HLk^:KP%6d*Apao3Uⰺ9` ]z' "=Ǒ-5JݥQBmfLp*7?7[ $c~*:rMCoou)aXcr6fݾa~ dj~JݮK Cw_ƴ)m)fL$0[ do؇1X< Kv<Åm{,7a1bQ7Tj.|C6#ñX)7SXeSې*""""""]PPuc<wTfH>c}7ڸF1pUbnZuvh0vkoH:mJA^X C6fctUa֍i]Vmvx1\ +ݠf6%3\9z/!=b,"""""$]{hͬK/emfs ~:NEDDDDDfQԥ #\Tl r&+=7ᕩ;,Sx3i8sEM˴t]g figZwbWζ/,G6,~c+z~3{lRT]k-}ߵ>~]."""""" 9ׂ1[k}| Zl۞1A k /s-xHy֮3NsBqx-fm>`CLTnP8. 06a䛘 u dZG^}5;Pxiic6ʭ( lN FۙqaoN |mY9cSV[EDDDD:T*Ŕ)SwI+ӭ[xWT*ŧ}Y+^k?\.)>/auUck f0m1BL;;[ ?eSL;$?HaNj_.iYg3o&;4~k V >^0+WccLbr^ъt6a,vZ9㪸.] UOA5^&f:0EfxeQ y.+l?eeY `ؠiLXW .8>//٫v,c6yV6۰7$iSWZVl&k B[w Xg_ovӍ/ ~08^ڵbZ8`׷#.bT2׿oSe˰ɰnF6GӪxl:0o,_Ψt?oHˍr<!Cמ{^{efvkA5g&w괻qqOXw-wf?6͛DZ'c##sasqq1o޼n? rp ,L8h6Uzu{ `L$BbAngL:bbuo'd?g]Hy4d,+I:.%lM5fJ_qQ8C;Fy\r f]S˴v(gj W~6Uq܆lWaho,ȓ+.KٳWd:{kU@Ūѷ J뙵fsި)w,s߮F=8c~HrNEPQ!4(xu:,+ɧFQQmA;?~]Hca%7ͯ>7bvn,oO9xU<.|K2aRhsO>W_ͦFezkrKnFӟrZx'eޝ6-*[-r @f}b 8|X6h7?r .$^2( YH%$$Db]+@eٙp!D"}ͶSd4oCqV&>lT MZ$lTwwc*&>KFYĢ/p)VʮcKr2]P!-7oQ׻/${d9[r 1C*~ɢza{Z}8rOYTSY/-d[uLy'}[ό^E`xFbjllēO!Hp٥wռ{w[v ϼo=}]?O8ߩΛOmp|:R> BrpU-HCc*:l}ݜ~c }4igퟻ38+\{ʯfH7h6eEX .кpj6-Akt'4Җ&ҾGS:oHS*HHLb/%}exW:"r,=Y `μ&~^$,`Kc i"ՒYu<4[a-KxdZ -S>u > &C:>$MYk+=ޛ'O+}1w"QKnT_⹍kV} X Ɉiޛ46R-$Zs5&}Fȣ++ytiK}gafoH0z>o|HAE ,$=ubuㄓN+.d2lL|=ܒ Xw. osN'S72Im,+_ްal&-aÆW_}>؆6ZԔʈ8Ƈx}B\d^ 7΃/Pyԍ<MeD.`i -iޟo޻-{[=+MâF>(*` kh +SGJ(//dݲ F곻S;WBvYv|&} }kжp77s'QQэr)D_>>ՋwI/X粡!398X1fY]17-Uec ш?ΦE#=.Ւ/DcpްxW)am* VkS gH$(<y 2 $ɚ `| )vG~?3[6VfuXCDDDd6ZGW_j9?_H4'Qֽ,}/ZBӝ2ICf.1W*9K[ YɟOi9r$_t!g}69Ys5] ea}R7I7=C?#65cѫ/G>6{зW"%̝WˏcDzرvLNܶ(,e!ܧR)KSdij*H&$%% /G"8/$<E ==yxRŞ-] %}?4{F<魤׿%s =(>3;wݛK.h6~iK0l᛼iCɯu7ary=9ΜOs-J5n={.䬳;ng{按+>uKwo4Sq6ӟ#.;o[/ܛcO9&Ne"Ώ *٣5'\O?ͳO?ͳO?/kX^Lr=#LHB%骿^KbLPvWE͞S%s~33[_iOVӫgVh]ȿM~_?y &綦4p \m67q/۔Q]mlyżz&a(I77 ]x'r*ƍٜvω~t?Xo23gwm/ZBᠡ _x}ɯ`8c-欻nkƕ>MbU5v;~M<?E̘CW\3Lx &lLP n:gܔDP^ϲA:H$0G$JH ' AO$$S o6,5+!c <lZK2/NC)][DDDdXcy?V]6VL9NkM31ގ6*r X Y琋9C9/cRf-%e|?\=w.c~7q'sh5x+\:=*+l4f:bm1#_{]r\ź D.?&@n]_ؓ5=Xu|+&P{x 3!9 AUׅ^$a5 p:D/L$8xD"I2$~qKpej`Oh$}{Z=ffI5XK=xחeٜs>$arCIHrr\Hn)v˂!;R ֌`lqIDATZC׿~%F@Wݥ_.ꂲҾC/_!c\ 3۹hcCwk`DDD4}koV<7?uW 5֟ f8sDhk??ofwUηη=vۋߑF_?z,uG8o~C|t{ow_a:0 jsW]3 r}d QG%O;=[n%ƃq]Rs9\0 }h_q/ÿW^"_qwŻk|w; Y0 }s<]=!2YtGUƼ*$wjuuk}'pjUZqg!Z 緿hzf5"""nӏ_,@[ꅬ>c !U{ݔKi<,9 #zeY\˹*WPjۥo|SV '''qcc!8cN,bE[s #>c~NOD/;|fODDvqxn,U[ȪG;!d,040KV;s6r|὏0b]mR0*x-}op>>IDDDDD׍xn^/^:p,+r;QOZq\6P,-rljƴGDDDD>u7bX,C糰;hY ցx / qiݱZ9qch/~iݹy8&""""ZFu6(zJuZ(k@{@՝6t˯ K+M]ϪWfOڨ(>O"+m͢&^y`-[>뎩A{U'''q+."#ܴ+:T^hKT&""""ZW&sf RkΰwT\ =G㦵8uU_LmЋġ܈>/GOV  <1߿oǏc{{ۖ <~)vwy/vΖ,`,m=&tYu~W `ww5˒kՁe9 Q 3-'|io~sLDDteg?O'v:+r;`+_Of^ul61.Xj,g}%p7?jֻd0~Q|!q|||g|nWq7-""""ݻx/ӧv:UW^yo:_AluT2T X;;;q?>z(J W RP ~\79̷moo8hu7K 6c]9j_Ͼ$.{_c9nB} fC|E]M-]s_ⅰ0sU DDDDDD ~/~dV,t Ӑz 6d ۗFo-Xbmcct>...f.K_jy""""""bװ9[9vӰ `x,~OYmMoZ1Z,~~|mHcn@jéK-9uZn/Q3R}ٶf$57U[cBR^.{}`0kQwwܙ/l>}iiQj疿_,/5=G_{,e􉈈^ !YA7kͱΪߔ&KCyzegggKMm`;̺&Ԁk.RRTn^*jr]癶1u`V难ytΝ;Ȳ1Ocٚ۱mrn1(q1ǥ&{,E}0lBׅOXFDDDDD7/R5Qu ҶuЫѲ:l8٧y*.s:%;zŸk[AYPlh{Xbi6 B& lH򎴛6eC yX]Ͳsqۿ k ƚs!Xust]%˘CK!6(}icK[cL?gq"""""mA͎-vmfC<=v׺̹X:J-GmwXRmdoפc^uu݆?iۚ6mu)4 [czN&W9*%c8b!Ջс/U/H]([6/7yNSm[KהQt͎KvIgCmfqz.fϡپuN}Z:\K0\: +0mMWB^=UV̕?̕{[7Ye.]]*Աs{۶5 |E.87jc^E&mr`콏q&ɬ xratL\9V#uQ%ccfuX}Lj='W}4.cvNkI[o2ێsnqEYmsXO콏eYF@tnyeXőq}l-՗sKYB<:, CSaK߾-UOՈh}RS5ǜ[ ^s8dSa:91MT*sL&r8ͤ!fK.[}`&%Ӌc\nqU6;.+{k:=_h۽kt]jzkOխau-5v[<^/>#DךPCkkp ?F-#61zX4;7ځʾo};fkmnۺ*Ps&59]ugx~~YNfvqWWYimh5 vaǦ˲2s4}^{U:f6vꩶSm'm=),zئust5 p<pqq=ٓs=ۀ2Gx]8U8Ml20-i,5`yz]Nxe!""""e}WmT6P&um.a[7͟n㋋^OY`ܕkC c} cZ@,󤯿,@R#i0ë<}>uI8=Zݸ뾴Ⱦ)~1R;.շm1RRcZ0^/zc1f+V V`{'<^ 빚Ԙ^Et]+@N1tK?}}GDDDDD}oBz-튯׵TWZ:{_e'I !Ģ(씕GŇn0`be{@YEJ6 s^[!Vj #2_Qɸ}\O|;V۷ƉJ m׫2v؎ٺcϭjWUeB(wbYW^`ww7ѣUdY6 ,;Ҷ5`pZ ac\I%Š~rXN5}^"""""wmM͑lv\Xjo躝cm[McmBEYEQeQF9LeY} k`ժ{7{[[[ɓ'BqzRx'@ rQl8s[6jr.cg,Ǭ{=^ \}I]պS㩚uR]k &j/a !#NNNʼn`fq~>&ʲ,b{C(9bSa5UWU<~ײ.wǴH4W=~JQZmsxjsATao۶֥6GnǛ2bYlnnr4;;;%;G?|}'O~Pl<ι,؈1b=E>ʲ!c\x|o{^EnE,:s.N&xK}c,bsn8L&g1^700(^}ގoVb@u8s>0$GQ?˲,K(|a)mBϋNQy \s{_E!?TxǓdEY0O>N裏^Ao6Ǯid(dY拢Y+KzpY] r/g (x2yx< !-bcKߌۋ?TaW~)Ǿ,K繓ko{ ӫL{>#˲@1eYpqaBXeժAG^9>:: BF>s_+•e,A(UB6xqq=2(b<n;+Kw'|"""""nt=ݩxtݺjc"&ʚx*zTt=Ym*ODDDDD`2BUmTtUۯ:@Ձ}QdE:ڞ]]_u":TEn"vFH83^8.:"VdJ;^[/UNd#""""jx 4.PjU L;Ҫ#@{ױZb5Ϊ&Q,곪Yj :ᎯQ^uԚk*uk}"=""""S]ØjMm[6`] &u_aU½HWkV1ᶃ u|㈈(2B fᶭcZ _!U½ʎ-Sm[cUSN [ֳ귪1ej_`=>lUBP p2OOfէԶ`W'"""".u XOO&񡎫hpX@mOf7nYmxbJ*]Gn[ v˪@サ g|8cCk5.Z--[뷫 ̺DDDDDQeTu]ȴ[ٍ[ٍoU8 af uۡʏ $ն vZgկ[Tj=X[Q gj=X[Ej=~lPn];Pdž:., On㬂,uVhI,suYWǪm+CDDDDD*2.8~yh@몬ƪVm;hP8Ru&`۴Z[:B(pYխjuxq\ VePƅ2&lEnB:*YԶ<eYPj}OODM̭nW w<ѩ&@W@U>CZVL=YEMS?*p[R2;nEmPU.Uؕk\%E$@ rMqr 9 7k{ꑖMO5Hu-O/ PF]O^E,~,r-F@\ P|0=w'!- 2NDDDDDU4MY9넓D񒷥px3~(Z vǃBDyHgUc8jL!{*А]q1QԈ|AY#đT#r[T׭j;>H@)r]ud/P9Zx1 =t 4D&bDX)9fn&ҡ;j^v1t]G}ӌsODDDDDu3"ԪA $N98u]y=5Uju'"ƊP*&Ane9}"ue1Aq{}kf& >!8k1%oUR z󷱎 1{Ÿˠ:4MO0EI&;&qerl|::۴Ic34m,]n|DD5MmMY[-_wv ۶Pgޣȭ:E*g.H8c#:B-࿓5m<)[ouë%%H딏dj e r7I,dA1z uS?_q)0)m~hݲ%4]CάXnC^u%ÆCuju(Q!rnܒvNK={tÿyHݸ% SS74@;uڋؔU]͎ j9H>:+'`ZOm v v!P8`],u.XVXUmêsλݩx~8oz8 4=l(8Ç>n~f=}ѳG7zuxw~3IFYXz-xnj\yد6mڂ¢bm]ڹ#ztG\shۦF=gbʽ "~6߃mw% {',[#ǎ!!ѩ{nx8tl{n;vQr$:[!zwz3&|4MC ѱ};u0 {.Bxc싯xٯxQ2|j׷#j;вzVr'(ʟf9:r֬ۀo1i8z8ʿ8{5];cGyyxÏ1d`?$%&4 싯PPPB,mZ6oA0 3b%rXtݱ~{Gaa!9=X9գ* &Ɖ;'ބxVSË9(**} rj:4i@kfdr&"L ⾻']KN= Ͼ*V^g:y;׮/}}݊]k , 1*/Y-mUDH݃v;&кjTzzo.ƫuP(l]=F 8M &14g)Ʀi7k_ ]ٟ|nѩĉW/ נ~}"?v躎\nCGJap\qƖ;껆aYG+]4MArr:=ݳw_rLh|doWG>3wN {0\.Wi^F:^v :k MRq~"4Mf2L"~5wU];u,ݦv:-g{) /z?s$<==ӏ}txs,X],JJ'mm)ֵ-P>hRoKjY}B̭!>. \%<ޯuÑ\bn8b xJxMn-tu1Ox aoY}Nٰi ѿO/,uڍ\$'#>.45jil@ f^=hKN* n\(Q+[?cCn:ٟANqěggwOGÃxE3l5t>QMfLbD/Tr kmcSDz#1\EąRZDX5}r51S^ j;e3p[}؉Pۢέ&OZ&~n;L$4D 9p5\t@(\śZbO)ۯìAӺw;oW^Ǫzz<9Q[6ǀ͚4ưm[B(k.Цuˀ~]͛c3t8p8жu+$$īCgfFݥ2ӰmN ..gnhxlڲ2=k6r3jN8 쳆J] YofCjH٪hpG_E1Qk|eqV5,*r6qQ/`f7,aUe 1}b/~j&}hu!$6=ifM""Y&\= DDTm zno'SZ6!sOmCC@s]]Q('IrMDJFi%tFDDUd`>HL^ xTTu;S}&uhej"""""*G՜lǩjUP>@X띣Uwդ+!c!׈j3cUS3Qmf!LdԚƪˡB9@,IP2Qm?BVn.S!SU:CmvNm;DDDDDD5e&ǩj5JM Sh.MDDDDDDq&A,2WkڮVNeV^P;[e'(lp=nz)ޡNk/ES# )!ֵkբ&ҡ6b5Fm!hYD=#p|O IG4MT'e1ss>'"""atoY>j.Zb*umWS2&dpXNȾS%G9݉:'%'jj@9GEv}[>%#j 4.ؓ"$*tL+ZH%݉bDVGs*P,qU]֎NjRkr]VȴJTk񧞈F9UMچ̪VmjոPjj[>O6jf"eZW@5+}h>AJDDDDDT|`Z-6d7Nᢦ'PP"""""(P.RB\dVk]]기E3Ԇ#h}\FDDDDDTXe9Ɏ:6pFMCm8;n6Z'JSj;5먹'>Aݞ̮ iSZ;n:__}PRR4MФI >7tMSFDDDDP3Vi`cT\M ɬU)D3gɓ 4ay޽{7{=1}tÈNMF!;IeP-`D>Ӈ05yG$иh v*볪mF!zGSOv]Qc&<f͚7CFF:j9](8Z΂qѓ(3lXÆ7 ,.4`"=&Z*%< hrxMl-zDDD5Rf+3R2;춥ηSfΜYVf&V\ksALL:j{_}KWc#wy_4-)ڢ[30ꢋ1{}ԅgcS뻞q> C|q2az8ފDΜ}e˱m4ퟰVG 6 .=~(/˂0`j_\"""*'P W+E/Wѝ:vDݮ,dee sGTO4 #G~4MdeeK.Q},cxM(pm\k\gqHL;<\qwxO%0L*Z:  I@8)>IQ@u(`Dk8eQùϣ:I8[ 3>Jsq؉d$}TUktVӡAA\b8h((BҒk>| 3 'raĥ 5)jE0N}#8p "VZ|:g$(.@CoC `C =|!wA1gr&(r "a&jㅢsP:tuZ"; l`cX-!))Jݩ.K-QA7cUjŢ˄-~4 I ?`g1 Nys? ;nU\){u$0L@ɟ>AU3~GWΟ zAMEq޸ jXaEwf_`  hӠ p͸z!pغo_fp&48sqq9 jvýs 3v(C|ŏXn<&Hl>#.Ƶ^-xO5}ox{qŧe;)Gӣ;w&;g.ql)Y={JP 2 d4p%Yنof`]݋HNDDTX,,¬PBme:BTXpW;=u=m) I=al9xjY> C:S“w~~[bN̓Xރpmo>_= qi{).hex`xrP1 zypf,( )3Eb0:;*ۢi)k{ĥ} \>[cn geБ.aEy.խ7-1m{-. 5Flagxk$f4DZN sm,و¸ {-pMfP[PjRpPQ;v SN̙3q ;dό3 /ڷo&L(|YZ!o"S f!> > Ɩ}n _!M`â6WZk`UyA>}éyV3aI0fz, ݎE{/~95f\2s48SZ#og¶BF.|x-w l8vq8[̛XrNǃτY2W=:΍#6pDk1}{p ǘܧȚo/ol*aa\z#<:Z`%":&ԿldZ#R"-R;[l'ۢ0-Z}Ō3 SɊaeeeaĉ3f 9B8wud֯/^>2t6 υ~R}GM]M.]x1xfJ,Y[;2k ZRO gvt>0gtnz)4\xσ^y4u+YR3w1[{b;\m2Vq]OaL娤`OsK h6gbt;2S&7;|j+4G+Tzn/iԴFh?txRQ?y &4!M¿)}A+ X߶;~Ə<`.~DsA{Q<D\M B$ rۡ -Z /{jqѣr*);5X)p\0#hkz ϶X|wdq9]#+Gi}.3iIphKWu0ru5Pۘ.吨AsdbyC^|af.V.ۄVmbH<:xp1$u> Mؘ F~Wg4iOCkĘE. @sE߾q?^t Aּq#nGw.HӤƪVY㟔رc?~<Ԯ*c&֭[I&UibN$TRk]k!O?tG݌}QxL/YPM/N{5ptRlv扵XwttG3thVOE1?2wĩzctiv@KQGnlYf+/ß.o쯟ak`zpXcߺZZg-.Z>3 *Ikp J ž#-7RbG㉈HfHm'jS"$QL:ﷹL1M| /^vQ5pg"ǃGY(kptzA4 o+Wɘ.lYXT|RGApK8Kph*+:oߦz R5 $%/ z2ӭo_OICի'+ $_mu) ),4Ut = n| ǤţИS2)ѵjg ;::l0Z (** ~k&x UYkػe NY[0=-[~5/}wlڻ|G` I``}=tl^zFokgw Uxՠ&!---l57}IÈwq2-/F k("""WU] "HKрfaΣg!)řh;Wkjޱcig4pb\[],LCʀQ8#C\4)d{ԉ':pZt)jV4 :uR˶gW3{ n"wtCѐ2 6~'.f@Mo($jsp$ūf % h֯'U=47olǦ}ߟkv:cm[a}*$_&=HǠ˹>ƻӌp8b *zĺjwr{j(s8QTQ:ZwNOszMv~fpܵbO%.LKDK|ۄYYn-}E!L_,=ɀT/gǞQz_K9TZ3K]#}G@!]# }xUȵJ Ǧbb[z:'`|Â3Jk 7ra*G={*~}=0GiT yN+C~rz*cٴ#qۍcː6a`1a8wxtm1n8 ±wjN4NL}4c~G3: ;-?NE=HoӚuE\-m?ܦ.sУI<_w?TzZ?MGňYka7LYLƍ.sT8> Ykceؚz=-ҽv>YiL^߶du h;۶e֔ ;MDz#]bw<0q6vnBC^Ņy/ A//\!7s{!&kADDDUC"rdb]/Ct:a&hFT5u,:'YduӒt:Vu40m}_^"y|-~n!8"鰲>oc6/£O݄jӄa1`@lѸ?h8>e">l+a0L&48bc}0Rbw JoKnS6}5aӇ32pWQdz(*4G^0q#-<1HL@ѣ9liG$€nqߒxL@svİ}z576py?{JWg GLH;m^x|p?|w қG3.𮦡\--Ϲo>s ?.^M;X p& ~{EN=Η_Fg㿿F&#i' PZMZϿnb82иmo7ē0` rhuHt9""":wj]MeNЋnpHs]j;t1Re|rM?+dv_fuٸ>:g7GrFKu~]7YqjA4:kd4L#Ӡ;.dGlƙ<PoS]+V0aTZӼ_kt4apܾeoHmE0cL.Ʋ`lLVPk~x/K1tGjC#aܦ$ CSHPImó% @CLqN`'""jDDDaζk-i5DDD %"ZȃVHBS4J6qlx{{#qըp?Z""v}as¦}nW܀AN{&"":B"_ Jŗ:% IDATэcEDDDuC-I&ؽ{_-++ iZ^"rAh! {ÌOG}0kqNH4Z YgYf}K/^zaȑHLLFE[,z2f ռWyJDDDTg0RHnf|~+Hi#(4]댈W_L 8W_}uS=nw@KDDDDTNj)$a۷o`KDDDDDT]j)do1rH["""""j),/oK.j7QⅢ(l1110~xdee!++ %%%_3f̀aDDDDD} T!tK.~GlN'f̘!$"""""Z{"?SKpXkdQQZBDDDDDDuC-ET`0MS-G'"""""x1ETΝѾ}{lٲů~uaҤIԩ(,,Ă H\&"""""Ju}ݘ8q_CCR&Mĉ1'"""">EE ?cرF[BBMgyW>&""""j)j222{aܹ7n6mt'Oƺu0i$Z"""Ec|~D #Z*ÁCwQTTɓXz5x nݚy%X q? xiEF%o &^~8զkf˧aea_) x%~1kU3zLx kfwS0Oh\Mb`{7`#Ph0vۯxy9LA\v'}?٣/'M,#coou}Xø7?_'&x <; dEҊY9q|yHyajSi#ۏȑf'cL+'nJffcpXܘ?l7<] ƵvDt7`L'B8e?G}Vq-pu0bُ#_ǿW>8cs\:S}4JwF1hcV-?as iz ,G_\k YxZ[3r?5#2nֺPn8]nͽG<<[q3WNSxbNõ}su.Y1 ?cDT]2DD0Sq3t?+ljT ?%7h `S9|tM>]t.镂=a8PF]OǙZ!Gr\ѷ48K^n^!IG!jX5 _1RO9te cp'6A48QCkb8gaҡ5H?sҶ/}.vs6G޺Xz Zb^)FEX{Ѝ60bX7ęEn l}z l8eFbs#?3,jؕ7FyӦp6agED0WDZ8?tn_ڂ}\m0耖=* _/coW܍r83L#,]ghҽ~`C84}p fur:>yg'AGrxv?_uv麉ݏMK,+NF7⡻Ǡ9xq?0ʟ"~pOqoxo`^!n9gLq5ofv7! .)[ )hRZ\ =!nDvg?v7l+|̜w=sΜ{Ͻ&H`Ew3&4۲,)9hK^'"E4͗¹?2s3"Swwj|9k,0"nF"t>ش~8}dGoQ{.SWngF%usldÔǹ@ݡ(1+r?^Cy/Bl:˃hEoXj=/N.d\*Rȅt_m?Uϯ۳1_ 'Cڮ((:m+N=!%>l]x _H I U3]f$ mgDĔc1!wahEVlm9P{go$x2z7Vϐ3eKZ[&fه(Ц7.~ ޫ= vdʤdVoyTVyLsBl驘ؒ׉Lc:<,?t'"E:nxoç[eBS|Va8EV'-m> Ì>$߫l[m}>297ze$!S&{V!}Lz@sETAr5iS!l\0| 'm~1)]k~Ѷ5ŦH3$\>_I$bH3xoLZ1jq7ػf9#.6'U_|Ǽ_uaƥdGĔdҖtW%n cc1hDiXU!&&緭d MZ++~˂KZ-Jj* ׶gҜ7Ͽ_ϽT-N=Sdj`CzmD~)r+5T!CQUMr4WLbƖ [#J1>{^ǰG1dzupeRonaƬyc &-"R} YAL\v{z$4;~ƫ~SQQQ Aa5acpħ' mvͣu&>\9o6/}8:n({a4G:3c>oe{ ħ0nf@$g id#WUڽX?c蕿UVƍ"߳*4-sx 1^.޾;=9c*boloXe/W&3Yp<0s0aF6J-aR|m)͚^oqH$װvhI꒡LUb_jFWs8N?3i~F~ê @WOIyb|:{=׍'$YyW#υ,<B¹9 ^N1k ݹJ\e ܷEnQf e|V+~q<wAuF, 䰟)+'laܸX=XM>n}[,g*kn؏{Yl޽#`lBd./ɒ.=kV6I[_aࢬˮdˎ$LXCޭLimpW#.gƵ NFU-[6ex}WIv> hh)Nel1Js7:0=y-ZH#Y^qvw$ZF\نulP:o@!+2ZAz3%^մ@̑\+3;vaXI' m>F MW]i&ۤN,ʾkukJk@zrD"+Ѱl)߰gw7m2w>C ?bclߝ"9뵠s"gAA?SE(<fibn|ĝ7F 9h5v%{w0E̓sXy->ŎCG9mzo@=‘зKKEEN%֡&h4Bu9e,Q^fdL;9zh?7I̹%8,P ~\&őO1( (h2i+bUq]ǟ#cb,ӳ,F/6q?ϜAJ.G8~S{&BODZ|.A X|$n˦=S:Y1'^p67"8xP3̅=Q~LH!y(0-:$s0u$3ߎs+O+ Y-s&Vz;D'i)Srn/xBMKjv!9P6Ce,lʮlNFu*z@A2_ ~k ZG{|/9iIΔBC\lIypJ8NE(duK^Sc{Jxة,똏.SSnrH,5>N W}쇣=RPژowtrfsӢq+Lr9{:[+a{DJP|V#lmQ9U(ExE{'SA">8stF5iSLJ8LO5ށr298PCkJi|&ٴΗu 酇HI;Q8P8%Ҕ|Zt6 )j PGqJ 8A8k_nBI&NR8qf:ǭ1 WqtNKBLbbRz%MJ~8j *W Q&6:ƩOHVNuAM#sȷ9.8: 8MHɷrFWEKV#ȶ#oCVUYx?FGPC""ƃ {H9Mvd onkUd*O$^B $+J)8L`5Lx+>ӝ:x˓Che/@[J95"2 97 }cLYeBׇIAB#)( DYOY"'*ߎ >NƺWakA3>=CGqDc, >И1D*1D%xga{S3DA>,QF"OwsH!7ֽwmMG3u+ÌԛmKU d>$pgJV$y˗iBCM H:ofo0? ]]ЪA{׳g\#@xL"# &'cDSw}|,"j,PRx,#hpsL/= ɯSPp٬A&%9tgggS'9`J"N [@ӥ_k'Q!>%[:p6_˧qw ռI^=o}S':VNA|(֬]ϴf|fu,D$D[˦g1!]O<eϾ 6{ؓ[OXIlwN!]G9!$^ho=E[I80)2[QoD^)JiO(9L=W(l'G2Bicvdu@Ve]r$_,^(Qxh|JҲ4Ӌ~`X-ӘDz Y+ Oi-ϟq=!:(DD, @<&, IDATx`/p3ڻg;,ẗ́LӖqxmZA@ GI8:oϒvJr= YmۗgplgK˪1aLcCI܆..x5m;G1,:Isy ];˱}k.6IԞ9Qz(vv#{X̩5qJq` = -e1ԪP`-\{NAg`wO:HO:EEo;Th;p0$.FBM? NPRg.#])2y}| l)OͤwpL  l)ONϐaq^;heJh>DMKIJм}sJ<4|X'd,qi|COۘHEн(|֒!<˲T|/)״>{sX e& G߇jn"#Еg73ͦ)4= 9㻳e"jd<[_p|D݉NeCIRL]Ĭq]YdGz1rPfvX B ڼ ޷g7B^cx4mKWob.؅n{-;wa٧R BzJ1/{5ZW7kЫD1GCǜvr,i17x.T3Lg`_Hs Bۖ4j uyl[\O; (Y+g~L*_'f~օ9p@՚\V-y_ Xrg)=(P;pAsj+8W/MfB:|+?K`}j=n6aM _tZ+]3"~uQ~9N4Yi|7x=&K|Ѐ?C~-P>û7'5ӯX ĹL%1g@.V~Sזfij)NnD_Ls N`әPҴ^.Վ_%&(ԣ'g>SN剩bE{&{F?Ȭޭzgl66|AyO:ϒ9d }U"Ggg럱:+v?,9ljy۶ dWXl"֘~@3t1zw - 9>opOFߛ'izXDc(Y1-axRd2a#Py!"yetA6}8Ơ /tؤ_@W1(QLsBA@rXˍg@ 9dhw1:٠Pk^oQE6s4ȍF,󰽞dIg0^*:FR!L'sGHznZo(!V.$pblgzgu|i8ر66EocF cSl^wnsKeʟ Ex:KI ; FQA{VBW;$Ƴr~^}u0*bƲ)zbm,6yWh 7NQXv.k8۲>`,)3D#uY3Dzk,+m=3-QL,I7fOo47 @Ͷflm0mb`{mWܶy}V#***=1ۇɵw JQw$(ړeLfyf}D^u&= u>(Zo۔VNs-F\!dIa XeDlMΒ󰽞d buƦuz[ݍrWyXHh.Eߒ|lAz 1cle+hAZ0ȄN6gWnj٦vlh;m^Dެ=;Y.{,yrrG={Ԧ_|6;ٖ^eٔN޶ݲLƶKd!2ɳ*5XGK|,73CdLdʿթUQQQQ@ϕy.%:2|`y\l{UgǙ7|,hW^SBը9b7?o@~=ֹ쐉"R7wRQQQQ@C^ c~zʻGF_TW%vCӈqK,*UTBCɯVqΈ:Xc2NBT} sHJvs PQ_թUQQQQQQQQQQQQyoQZթUQQQQQQQQQQQQyoQZuc*IL\,VCX.''(q TLg wtOOE}cPgDqfPmAT^ѵo~32w&@2IdT$N0b=9Vl1H쏔nѫlUTTTTwTu#d (O0%7/P3{PiE|\e?[cq[Gҵ 9@9I& n`._ǿQdWOL\Ъs)EuhU p:J˗ jӫDujQd9:5^2`p+|t m5 Pf/ObX"#4cցxZ̔~ݹ2|I'+I@:E 9V/_vJ\pҶUTTTT!PABHH:| TY|_s&AV+I3jԨAƝn9CD]\OSR%*i͐ЗSO2^S"4\Ec8,2nLݴ~QzM6C7ϲێ4]J;2l}M2::Rvmj6+/#(zWy|O׫IM4H;e>-쓮w7m&_swO|ֲ>jԢf|FTTT2# ?~":JFuj7A ːp]n3Bǹ=zC˾{lxH f-& F~HMApԫl =r2:K;,b`#l.sq<^F1~,H$~ zy)$h_HNNh5WDpt8ٷE3Hv8H.gu4AEEEEEEEEEΩ}/QH$#?BTD?9!2 ə.ƫRn#픞NEDwbxʞKWL!H闄ːWPH #ѫ4>;ʫ0^l56/" X8hL FA+郗Kmnn#qi,*ڟ)޽?sUgDN 1%DTˤ|0#OUg(A~4ɳO h}KiSX֝o VQQQQQQQQQQyE[GY2/3Wg@8 ">[Q6xL aXE%X#_!l`{_\Ը0%"oJҲEV,:ų$Hͽp /9_Nt=Onң(J#JqϮg^J)ѼDF|uhD8x{CEBL<0%'CJK5:***********թ}H=1ZQr}>r̓~M=†4U:yqL( nI-HYVRoXq=ڏVu/qhJ_ HdxDMjQJ-őY!muYԩ>u:RjfQEe)U >ڇx)CkSz2 UKb.]uc!QYاL Oz¡=iX54&G>}UWdMI\ c<~K}C9sPxq {[7ӵ?} Q-",uڤׂQ˚" (ZcS#,A=/["rxoGWMnL6?Eҥ z#:& 7sX$n`؄+ 9{X JCey+dá54umyݥh5,af>Y]p=/-Jj'lg5vK䈝|~i0mNdB1d*![ թG%$۝oAD'j?`tldt2v# f );n[a'}c衙lY_{*EF*)ST+ CΥSiڱ0%U SMAiBZ~8_~q#fe~#:EVױ'Ea{ ̍? y/sGm>tm******>TVEE@ZtC݆{lڹ =Z_,l:CW9|fQf2]'¡u2ū-qȯrQ!~Ⱦ'պe3K[Y$c܂+R_ϐߋpHMr>&΍qkpGːm|upe2Bn Kz!"e%[>$:U+5;M1 /NgUE|)Sz5gxK"H^yZ(~yE A!*;d0LctG>Puse?|DԏƳ#sq̇.Px!cĈY,o KD}\Ϟ])T8W' ;8ШIkO ?9/J~8џW[LmYaߵ$hmMgmRj>6ʘ𝶒ŵ)lȄԡȁ瘮k tw5atvL:S<("i'Ӝty<wt-Ds3pY‚սfXGIhsӳ9GMbD8YNYLZ~1i.:ͧbթUQQy?)iٻ7tĴ|ta쟴K=6J8N (Nq<9.1gY4~?߭_O*O`TPL:Mt@|OGGX> gZX4"Ԗ}1/| x+_8hOo Ϯ21e1`R%kl 0cKy)םشi7odݺu鎭C+Fb -=TU\Dij;9)Ӄα66xB:S6ѿ|7,Gȯu~*Löbn_MAU}sCz#zd!#Xb"88'SJupLfv_l i<="?ʨ 0<~ї6Y~1c0$C>F ̹+=M0eq=Ĉ!ƶA}&}FO `$>ZA _9ʞq Y0&egg(%RwoBcC|C[&|AQ4kwI:; oOӰe |%$Tm]맸+G`5(VD[RyDrGHw*.8j?PV!t7j߈@!%Ԣyy?% ιӨU;ι0]nD=ڶ5eqvҒx׼jвbN$-P6n'?9osJp &!3'^G.s8f?O<^=ѳ'=`mx:.( l*-kudbo-ZUʉFm41⮮a4ݍ*~w:<88-[ru:uDB|(TTTTTT젎Ԫh fH<#IHD[C^J< 8sAB]\LyxWI-T9.m%x-G%<<d,F$<==ۀ?^&.&G0} }!zr`6&&rK:|X`bVЊ :cUMsjANѕ, FtT\]z)qE3"^8&@ osBXWJA(S [n;wndYfȑCkD@ֲ݈Xu+gםtx0%{bE$D/^ꩥE7-ۑECCRیfF~u"z3/ГG:NKE >9bbP~>@ "8D$JlT/R&LúU l2w^)R&f/@.ފ^{R'9LZEEEEEͨN//ܬ q4#:0orT$ѸS]-7xVb r4nMZzli ..CY IIhW:,7#X+ IDAT掶PmF}[oۅpS+"6gN~l_gjK\:EK jN/EW#Mxjn)mIvpQD+h nROrNaS[L PlYlJu9j|;phM~k^Ep& aSE@oqHŅ 313ڏ0V3i.e]3Xھ!6Y@~Cٙk3W#A fGB}Y"x.:U*/r"_QHW<\Q"#Y4IO+DEZ;zk/Ot[bf[km^mߣpcېnX9j8eC|KҺDZ~S1r_^YZEEEE}B ?VQQy?AY8:Qiqv1"Uo rدPjՂዯ/T]x-Y4OOji(#L#k^rI~(]nR?2U)0~{A2"'S"R ,<u@fp>&Uɝ )-!3r)'ڵṝlj(Qn"S28"CZ5vOJ0޾܍JaX1)o];ۈHZKjݘJV%3GGLѼh%tsbŁ O\FARxw/SMJQ1 Gons+l@  p6T ˮz|+դm<NA6y^Q5)|o|6?-[)maѡ$ ! iD? r=KD%}S8)(ϸu+dD$g CJM[OUTTTTTBUQQ@/ ef~nI#%ҷ[%o8F <:uWC(nv TN\LD=OeZ.cŀ y%"y*Ӽf ѣo 7eКhRq3O5:΅O-v,IBh;\XOAѧ:%$3uس):8 zwBN;6l@Ut :.Ih .Ei׳/e[ FozTe=glJT+_O]?hX EC.r,zH_7|WA~PV_Ҽ'4[Ǭ2D]aLg -kMgcpOtkQ_54J޽M5~-3FNx͜yCi79d-Ҍ?$ o 3A0fJlkiQ)d_Eɐ+2:qmE0 ɶOa}ldyyVV"YӉ"b*8~/PL****&_Fzl[oӶP, ۊi9p%m[gEng529fl7K$irl)e+Ϭqm3Y ˒lvAD fA$#Y,,BD+[qnV+8F  H/"C (U TAAJbH^^;Ml;}gٔROZx`yzVP4ow~!!<^`B!B!3#V!B!KKBB!BZ!B!/- B!B!^ZjB!B$ !B!xiԊ,!!7uV\bT fJʕQUB!8 ?Yz5}躎U*EQ0arbԨQԫWEQ쫉*܋-^SU:sAQBr,EŅ,3i_,0 >|8f&-4k֌3p@ ]Mw/ҥJ!c+Y(!^99w/WH}$Ԋ2vX l/z.t]b0bӧ4Ek!c!ċY9ڧLG_W_0֖i|Fb $88:uP\9n޼i_M!^QQQB+777#_jSOƍYr%BLL d̘1hf?Iׯ̡C=r!!!UB!1 ⩙7o={vJ(1tP]f? p?=z4/]9{MM!B!NBxjmۖJo߾)X ޽{SuH/&Z(!B!kLBxj_ȑ'''n߾f9{m߾=ڵ-B!xIO|N"&&K.:jբH"ɏ@?`2싄B!1 g…dȐ!EP-U3fhLE s>B!B{jSUJ8@~hժ?7oEQ$ !0G߱?^#xt"V|JCB&LDQgΐ!CuEQPk)hHΊ^ 3-ŸcF70&nЃ9Z0X%z0UZnGkt %@qμ35V!^5r@y)r]99?Ǹ>d/Pv_InÇ]cK .o/>c]qlw>4,G(-ײTy|B!ZL$$hH)&ΎIU`|4nnP?E"3{V/O\Xo4~5nۨB- b9:C ΀q9s6^YGJBfEEKt4=f-7փLD_NY3}=S=cB!#zBAN1pppZ+=K'0nNMɯ(>AJpPt"VCA Ⱦ~CxoYz]F(VT Y0n>{.20oqc$SgH \#9i?OxT˨-7 ;щ w"Ƹu![4ևNe}1({v5㿝3jSO]$wZF}7=gnkt hIa7Xٛ~v0(۾/<1~VN1YuB4WNd-P_?h,X8zcnxU?YY}$˺䷒ . BFN5 P4+> fayʽ'̧{#gyI@ mCHYѵ5eL#ܪ88C-褸ꠇP&8¥{Ļ~a̞2|uhF'5=<2B4LEi >C5f\ݘkSg,t[46B0^>['V$?=l;থ4؆c4k,5VYi VNg` ߂Q}h΄+Y=} h=(Q*nd)ވϧ-eæ kʱs+hWȅrv;ks>Yi= >cCYz=]K8ɬh7@lhB< ♑@+2sr MڵY?`m8jO8T-mb[CHOk?;NFP0n:qH*P93F7%t 7pY3d0⑯|p  P c%dG\Md*ۄ l3;~-- oҪ۸ic8m/[^ʔ́w1rͰfJ*p1X*7=)׸.MZ`T 0"\욼t3eCy8QZGG"!l 5/y8|=UՉ~?ze[Հ~ :[\9 %=3ŢRw= B7z׏M+Śltm$+Tb#bR]?c,ӧfi|XoT'UlĞg̟X4a[/:jܾyؿgСּq1P^T4;93apB<& ⩻~:jĉhׯOxx8sI:w?Ð!C$؊ׂՇL2Sq ܼy >(JbKYpȔQFS1|?A1X0&cg/6`HI^nx{9z?os)Ä~%)mC܅pR3d9C<.*6KxNF ȥ_cVʶ->;K&P/co?|}SS߳>竝L7>Fs3yI^p,քgBT-RB!#t .hСCr͓'FM5j;w&{j(]7Y,' f˜]U/ɦnZ qi1&59=0Mi_ D?͕xO+nxy(\:uht]%c`J_Xԍ繇@ع3\QsVB:/jEbɢDPp߆~?u#w?1%,& b4`M}}LzU^KOE3P-\:uHʐ=7m(̚F|-D&umv?{.f̊K?z$ÝxPM( o=8 (^x߷V44 Øy3:`T8a;g,bō  O&ZuLQB&;==|=WbB!CP+Gv׮];w])\0gΜMӘ?~r]!^/ e1/[FPmZ ?L>#\ɦUq.ߖ.bxv!Fig뇅41.z4Xݍm#/hP_W6Ǹ?ͫWRP#>s1: ah7r9ժSdTG"őW(wo+J o}жCGpR ͚5kE͕,duAJ*)ɆYC3kIl B `Hpt5 bӽTװhXf}nRku4MK쁬54:%>(u4Z@QPU:(SPԤEt)qJ\g^vְNjqKҺbXm{RHy,m1֮n.׵OJnWr}w_rHâ) Jr~=e ! LuvM%:<@EX5yow nuRf3lfb3[%u/vؾ,ÎKAOٳgy$ȑsq1rŋӪU+)x(v9{[5I#0$SIcC (5M,m:(j7~ NcUZ۟BKbAeidvHz;·4%B<"~,Uڏz`3f9sxzMŊB!B$Ԋm۶///<==ׯ&MJ7&P[lzL&˔)S:t(/B!!ݏS*_5L~QEj*t]O?zB!BؒP+ EVY!B!Ŀz!B4='[ !x{CBB񄸸8s^h!{H}AHc! ܅}BW@d=_@,Ys"V!xB<=8u QQb+ċNuQB<(}xN$ !O|% FxuHB!0,B<;(ĭXEJ9y}4McСK߾}IHHiܸ1dΜ^zi}5!B!kFBxbBCCر#͛7űvZ-ʵkR4ݻ3l0ܹChh(Ǐ'C ǧ{uYj111ܾ}ԩí[RB!Ey$Ԋ'bʕ,Ysb6:Zjqe~6m%yK1@{-i&J,ɲeAB!B$Ԋ'e˖\t).{>7 IDAT'N 88/ҭ[T֌3ڵ+.]JiV]׹z*-ZHw^B!BW<(J<*u]ĉʕ˾(MӘ>}:ӧO/Jӿ-[!B꒖Z!B!/-iO3ɓ̜93ͮö<==+IC*TAe_,]xx8\(!!RWW~ϟZD2yd (i OK|Xf `N8a_%Yǎ d2QN>cvؑY ƭϛ777b!3 OO[d=Ξ? !V<Q0dtdBQTU%$$]Ӽ?6)ȑEQXv-kN3vЁi׭[ɓ8p`-"魫B<-\%< !xE+gN約S+I (\pq{888Bj48q":tH1>vZ ,\ĉ-$^5Ltڕ{RR/\0+VBg***JZh5fx>V<GGG֭[GHHgΜZji&u6-Fɓ'S|y6mDΜ9ڵ+~~~gͩ^UU[mΝ>Q&mcўl_Ìk\A?b+~B! BnTz?J({ʔVx<Z)~NXz<Ͳspܨ7aosw~;6Ⓥm3g*5EOOǍu 叼=bv%LzZa~7ىi-fْuD=y<P^xA,=F_7ȆOxs„Bqx>QsW~|Vľ߳'B*xtȒu}p NWSŧcʁ=݃*k߂fޢ(_֭kQpܜ5K:ާa4t5;5k\ 0ճ{CQu6o\̰ϜNOW׋I+3f&/f;ڋdl]5׿|%oodp9u s? TpV|y.+Jb8Rn7~X-[~g=|7}Q"t1e] [-1!h~]ˇQT!nYg?]6sL9bشj: 9Yi= >cCYzz'0w<B<)> BȻD⁷:H=KxDB {ni<\pg([ PmC:؄c)&b/aaL:p7pRʅ5\P1sJ2}ԟٍ 8,Ap2Wb>wq[EEU:]|^k8`4yQijUbI챬،f2`0S2%=qړg až[DŚ1JʴlG?'&O 'K\f=]Ϻ ft,Y˥F{jik,ڶ (^c'_VA6m)k5.ͭ۬S%>LL9m~Vm+ZѨDfعS ;Qd)JUigsnRq8>.!Fțf萅yH]AUUT!b➏rp4b)A7MܹalOUb蚋qeumېjjr\Sj}֋(n1BGF!+Mq] ,\oD` ,ws`LJZ(#șɔTL$ZKi_CUu"/Eahv?2ᓜDFMKAAz|.T~Wb\\nAbia O9'Sr#FEKՍqyT9D1|0??MS]ɔ5b0j6t4x{<7}CХDrVW9[Q3STZw"pf#crōl>AXbIpK5Yh֭,yܾ|ڥ㿥yLޕ?MsJ*|xxBU~ O"A5` ;K_y {1e:*D\ҦL *h4][=vYK5cp;Jƌ.<B< BQ}R<$Hۜ97 6YҥI]kIH${D'[g6'g5m_aک.-=H~"r)-ƏeP>w #o1 dˍ[f(8N&|]1EAI^I%q9ɚ]Lys:]Zamáސi#"vO*6Ĩ 8Z:1;3yLrPlG$[8Cc"gm胏-_i'VRՠ .]{ǽܳ>&ۏetK)g5ZҮ,6I+ –v#x:=Gldg3?Ĵzl_r ^p,ք_$iT|<B<)X!^7|4\[3ۥ%.0ML5tl*D@;.tZG`|bK{ *쏋р66K󶣇bȽ3ݿkMKsz`2݃s3K˝}5v-vw-ErY5Wv)p(((WO eGCީYɑ6]&Aٰt'a6!׵L}b1}fpVPpAD-w TsN^J LVAe89/zXzu\<}.n%T8/=Nrm9] ŀWR3;ddo_L{ [ qXXp*NGńE7j4`F%I*+ף;=݀AI ?\y^Bה !kG%SLs ثkNdUO`PJn\)emGFӰfh2s 1w}۰g@*ȅSh\Z5Wo64 ow7G2l@һv4>-~i3_G gc#_e>ٍ@tSLs=cΈR2e VfӋ|)z ~bԯϻk!ܳbd"}݊aq&Oծ|3 ۽nT5G%x* iِz9[˝(8:mkp1҂#ebLnsJ t4 d4Ⓗ_JߕQ#~Wys0 hҥ~߉{▇AɱZPw?z/77pP>踋=[ iX0j j ͘q`D(1# ԧ屮dvB=6iKo\xIIe4^+$ j3lNSͰg:ܷK[R-!Wse(8ڏOIrE%RL,İ~;5:&I=I=R-~(*vJZˀ㢤Uj4~}Ӣ//ǖG\S49I5~B! B!I•-L؟Sb0Fy>ܞ"$BgOBBG]; d}W!YP+qoޖme"WL=*I{B!"V7tYv3(F.gq'TE V!B<Qǡ`tp* :lD?V* N^s9rODz5zU\3 РZeK8sצ.*U|z2%BM!=3 %?M _#+Wݠ|AC%u$Ggl^ƖQZ/ϙ?.獀싅B"#qys"V;v`%LQ˳2a׽be+F2pR^[{ö=_fq' gjm\ϣ>q\⏰hkO)h:I.b/z f۷[V߶XL$І!xMήϨ9}753E[~w  b-1BL@oY/cߥpLi{J{*ˌQ!~: NiՓ>K5kke$gHFOrui?mhĨJt+w`o淌m75OrVl[uhfHKV4)O\r t<5ei!xnH~K]ǁ&2zNG(xǟLPv;{1j"K]#Zs C NUl4s'N)c>mZq6UF?$fF,=GMX__ޡ dw?!({˫S_]oBA'o?]1En}T6#7CI{s=h @UK>(nCO,7gHtm/"uRtʌͧ }(޴_wHΥ9i1k7 ,E%{R0c"|U 52~AȊcU_nD>W˥9tJ.*sG-C f֝0r\v\Ɣ(M{~G0X3XwGeTVhf2fˀze)묢Gwk*frW^ 窀~30|^Y s>~5r `񾳑]2!??N vЯ4dgiVns*Yƺ'(֨Oj-nDA't(\4ȡr}wt_D~Lѐ]ҋ׵X2N=3^NnDM)7h1j!yČ47K±nlO˪Íӷp1o6w圑j (V-Qj!5d8mb?@& ClO< 9ܜ0j>8SF+cYRݟdзd55_ Ƣ/cRhӉ =ӣ8MW0"`Llv |fI*^ =\1 Q"?G 1_\MUu:鳉=cP22&fb|?~ }8Sw:J ?D yw3ง'ͼ]}fkrNؤ5G'z=y$}h|4y5Ms\Z;.PZl sF)g%QEQ睅{^|kCZ!xHcԅQfM FDDi?ҟi̜9+W>r >3&b ]2u{Ż]2Y1 9|NJOn}D&)Aev2W: Yu<:#'j4*sZedę-~./aJc3Yq50zakX}zf õ{4BjmLp-;cкofpKwR!rZѳQxUѫG8<)8|wFXnd՞S/>Cd5r5ƈW@~I:\lcU3wvLɁLesFYC  z3CR6„3=vٚQ8gǭ slF[hY-7 \x^F?"4/r ʷiKɌ]ЬqInn;uu>B72Dm5rjr\Sj}֠@m)Id~+fe&ۉ?thw)X$֫yӤfnO<nQ X(5r tbۃMN\%#-⩊iӦ޽QMhժ Ou]gЇ3nvLJv0|7d p?,c弟G T pHq%ʡb0wQToǿ3)7BA) ^)(⋠"" E@Q!JDФiRH%^vcS6X'{ܙlmsm"2g+f盓H@]1\3d6cWgZ]HZ~nҙR8vD26H%sTjDM÷oVꃯjy7b]ÿQlAJbEqX#k(6gLQJP8f.gޏCEA&T³xO&Maxcn%~(b*ك5,47f_3HьV6^S Q5LԝHͧ_lT|"n|LLT|GT ;UEAUTLTD~ZFST8zxfj8=#ZMvD G猧sZB-J{B'"<߿O$Bu˸aDMx\wǽ$W){w).NaިyˋX"R)X70yF`Y|A'/ ჾ|pfU!oV&NȾ}K@!))={h"ڴi#xdc5ńWFt W Kka5m]%( &8wB/❵doMo%:K{>)/Gc#m1lNp)V~TKr|( z)DR;M팟@LEP?ò?TOo}~^qoY up" b(Ν;oIʺz Q1:l5yG1+VѪǂY%[';hY9Ǯ<2N%5=;9S&~J"=>V [p(*y"vT~jN\ B'DFF2ydsjFPP:tcǎyJRR=z/2wu7w^ǧd %)_Ԕ/Z˙}9}53)1Wسn7#`玻M_E7lgV W>z-~e^& MI%E @Õy]uob֖kr{/_/8I L6pUuK똳.EU*Z?=K j6N}pgGSQ5#>3U oCKje 5xo]*׮M?OK&_:kĨV&%rH/# zlqp1M`xP<7my񳪀Lw>&V٤8P[Z[N A;I( >^~as#QѓM2,!9Rٶ JLF*a?Ǘ?Dg_JWkŘ^sx"&tɄ1yѰbfLH2Ӧ ӄp  >Նw?)MJ@>t+l y cksR}[1nJ}*M`.PϏKaB`W1ċD>T c;c*#еp/\ 8:R1jV_lĥ{fLn;I|rV c$>bLJh8t{H.mUS#r17(8SA%l8D÷+(<\-G2>՘X3*qAkH%l,F:X3+2p;4rBAAmGGGi> lǎQs{ldSLJfe0@P<˖1Jzc1ٲMƺfU3U1 ]GPPԌ bf 9f%V*YcftһJ[1 z¢6*3皕>Svϛd^+ߋ,yϒnX]lǰ'rC!8nihEd^+ ~nOP4,CǬ+hu܏u߻f9m96='nqr.o=?k{ YIBa0 vGl1 ÿj*Yę:| -eRm׭ialZ62m7xe^i<8O{h}|||{r3"/^֭['jܿC}!ZAl&sW^閇s(Um6 jNy'G^:EQQrP7ϢvrY,c!Sߋ,y,e;3Qu2=/vr'l{f$ur;=0d$^.=,GxtY?nuE<,rFyC!DW] E\O^:vvv$%%ѽ{wBCCƼ !0γz+4K rг].=B<ɤV+,Z^xly !< npiwB䓖Z>|^{ҥKS@qttd9 VTEQh߾=-!NiB<Ul,]WX[![$Z\\:|\|THKK5rJBQڶm{G !B?@Zܽ{-Zߓ!""6\|+Wj*RSSy뭷rcHnXpCM!* ;3CԊG:/ѽAloįJ=2 INNW^ƍ :6[!;'b% ?׊l޼9`~J*enݺ1cƌlia`6ݏ7NZ!?" KW.S"0 lIǥ+  j#1 /"G`΀(W&嶚6mjԨQzS:,Bwpw܅ p!}D@@nn_"Ax$ϟ̙39Ξ=:YôW\z0n8el"pw=O!_#Ax$Ν5lڴ)eKSEQr]a(P͛oZm Bϑُ#IMMMmG*ݻw$$$kZB!O6i(9Zsi!B?DB!B[ !B!ȷ$B!BoIP+B!"ߒB(&&7ˆB) 6[K$B!nGPLi\\\lAf"˗$V!xL\Ҹf !xBPxq~?AS+B<&B+\\\dB!B!- jB!B[ !B!ȷ$B!BoIP+B!"ߒV!B!D%A888&aɏMBBmIB3,Jw_mhVӘ+1V]jڛo/J^g?'ӹ40B!xD&!e&q!ݻmcm۶As2e-|Ȉav|s2 Vrjۗz>nܫ<ϛl-)ړ;k1eѻTsT>An7/2嗙u69ZN e\p M^OS(; \isl[ę*4oGݧc'/~5z0Z',@.WbzCWҎ3̻f܅Xe=~)ͶVO )6rΖ'BWԊM6m;vlH6m+#<޻w .M```o… u=[^۶m-zcszCIE9KSуt_e*.;frɺxlB-Io;)ˋFSt|E-@( s̙yȠ[To-kϒ'O3suG|{룤E|[[eExLU>]|h)gmRٷM F!}~!B!D#ATX-[;aa/k.../[ȿUC4T͝miTb1;ЁC:ٹ~&HG27+~Ʌ΅>Y!_[3QSL5[V1(>UxZ U= s7Iu FwY<Ԥ\qZBr4;ja7 DZb"^k fD&8-uٔ{ވ=C*INѩə-)3+)v%_2w)xkNi`u&Lg7I*لߦ-v~5OSv?j֕ Oqt*U\Tߘcq.gx-;UJXȦ3᤺xI 6Iݤ蹼U ;U Pz 9~+ #AudPՙgU fu,טv 2&OYľ+ |o ھeNꅅY2ynzK_ETb&A(_|L-|g&NO +CP5Trkzk)2u1_w"-2W c$t;SN|u%BBw g̛4 ֮x(ŜGG1|FV91[ MeU'GGYugaOtւEM(D4+iPĭ_0pT*~ C3F0v&-E5A:OГ82k ˼wKB¡̺M׉^|.ZD=IY:| DnK%Ob/sf૛3COԛ K;w2njaaoSƔ-K<~NuPU}fe~` 7kkk137} +;v%/7p9i,#鰥 Ī&$ʛc>amib̦t&Y]4EM߷ĝ+ՠ+ z=vaHq F7ޥ_pv-|=!Cqp^oB?B_ɒ%Yt)حꫯf<|.S3{Rn5kקMx4N%MzX^7ٿn;'Sq.E'۵\Tudr㩆(r:ai+Y<Ͽ\GPGgΓz EuXQGصb8RvDXVv<0yԡ][pVu/Ѯ+v&'6NR_ivK$gwK4lwP7W 'KVF/ұvTؒ2w/Lǻh߶z2q O[ͯq1Mx#=ɜ7zW>4NyY*AiS ;>t.Lw7>yTw3t{L\JТo{goTvr:/7 d[6toXKAԞ/؆>q`4>#qq­x0(voF4k7z4|{⛼ͫ5=Q{1{Z6n+ҽ o[Fmau-0e9~B/ Ҡ@tGL͢fJ4[ZQ%gRҩy| 3zR@^/[5ѼQcD}|&st8Nu*WF4:waލW1] .NԝHͧ_5HIPx*.y ï)ٮx6d 3qa'X7C^Z૙p-7OO՝K8}JƔ׶g˸yP?Wz!LNQ*WYd .ѣܽ{v?ޞ2eжm[G@@>2RҍάgLr|aNq9@)ވNN10ՄUoN ߚ({q ~'0HK 0z~e^& MI%EB]ōe2/Y̲%qd;1a=ϾH0)gX|e+PR3{q*{)Esjt~ZuQcN7mTx6gR1-+8Q뭹,|} !GHA(h#꟣i&!]<β,\}& i;vv]JAW+TQ,+sg.88Wރ:SB</|:~ wSU UQ%S?qj2̤WWpp)FתE)=ihъR ֲFKz6ү5twzҺ'@q= i?TunC YA >5>vcK`~’4)pC9_бsĻBK˘(]/\u{`zV:vT~g Z%`Tg6/-CkyZ Vܨ|Qh~ GĐ:].K[q}4I3xh gkupޓ.ӔfEˁBY_~5C"Hri5 h /_/crt4Fw)`r\nLB\)~:acH39TzMJB&証uC)uP]Ť拟{z3B>*%JHzdhV?UerK쬖M/3Mi'Ǿ߿COqGxO(gժUt9#@bb"vvv0(Pii-ZD.]$5[ŊYǎQs|sn A떯e2ljUeKT5O Xc1ٲMƺfet76uU1]AQq ݌X73lu(**vFz~F zV C[63C+*`kV\3ׄk[ۦkNa︶Lʥwθ[gQn~˵ʼWC`)?q`9Gz1C!8g ~o?d?uy32A^B `}Ԩ^6+08VbL9_f f|jٜV˖n@Y?n`laӲZH\]]m6M.x2Y ޏ}ժJAѓ@AVX>ƃnY'Zʔ;Sr|rS% z,Jnփ%_U0r{?PTl-* j;<]G/olk#{M!ȟdx$+W&_~e0 Kt= ͛7AjĄi\rf !xqelĿDZ(mڴuֹ+E| !;.\$>^ZlKRgg'pws jc!BXx˃N>""V!x$PB!92QB!B|KZ!B!B!B!- jB!B[ !B!ȷ$B!BoW!QLL oo%aa& !_( Nn-% !ILL #(W4...",;KGHP+B<&oQl h B j#dLBl, "LC$B!BoIP+B!"ߒV!B!D%AB!B|KZ!B!B!B!- j53JT\Qqgד1lW裬u m]UyU}n Ŀ r0: X̕|jD_9bT9f_YB1}V !k$ -h4䑽l ˯>Ak:wf+Ys9x('=q3G,Gv!wxzuVAZiڥBdRڍ/OSl3%):ۆp8I燡\@7?x0CNM[55kzJ2<4>F] GCZLO9hȈABOt>ssNԑy Պ 69TdrzxoH5r /T5:LwB ӻG,7n-PN31ԫ[z1d\f5;ק^ +wuv،7^ͤ78.5ue߈5t6C0[$[?M+*iTMUQ5}fW꼽̧U3Bk|Izt&4n4~aKe>hږN9 kJԭLxS$3o.\y/>A݃i~iT-JL5)ﶋu1¹X=5>fՈX}7;Wb ͩPH"h,53sUR?.TpΪqpuno; !O< j4bqrS 1hJlܱsyÖ\&0+N푋صg+yqa`mi1t̙OiWֲVe1}ƞ'Kٱc_bƗc+,?7mc˷/|W f =}?nlؾOqa$V])b;ûXoXϲwk (r-(׶-ְvz7ôSlIQH|];YKL2_u\lv0})~;eoXOE0L іF%N,CWZRQ8A}F.hܤ)Mϐd[?Fo,&,̀ߘ5˰hҨ!MCQq9U4m2#~̪`~bLjm)#tY&4jљǬr|ѻְXv*uhBhج#}>rJV{%U4jۋa ϐe䦰 Yuc^Y  $paDunI㦭<`*[Gf޴iޔFM[ӹ$vFvޡkf4nҜ2pMA9ER vlDfٟh6J&3^'N^tֽC1  x̣wq0o][4ft<# bNZQ/:͌}-i'eX $nW"REB jPN^8gDbz@\L(u[ص|^UpvtT >&Khi׽&~& SJFӰ&{oW5n`kN[ߺ;(P)]~:VݬOzht *x̳rOU+4 ըI3p" םmAz*ǬȡY2c$cnǺR]E-p2+SNN`׌!B}('e ESRN|ݫʀU3_!}FЎ~0zu /oFE3ftyLيj&fW_r  ؕY8F7һlh 'nHFۆɱzחR>iVͪ U}RCT'}2FTxg jU +kF-˝nJ{5hrO1rYμ勂M>_ =4͇E?⍹!hއu{⣣I lm?ݖ6G螻UɦOfT5r?d\7#yT@OGj)OM'O_{㜴5gq߱:h\%ޥ8p8F99:ꁧ{z% &_?Nq7E'N8IG WII _u~ei!>A8nr.TIQߎafUuH\ˆ٬gT4iIuk_Srl+YAVm&|M+ٔ2o^n$Aҝ߹xKzܙ+ s-Oډ_aoKږ1Y\#Ǣ0Q2wiPք)2N/s NM9|i_'TƘZTҍك'KkaUݓx{3) &8+]VE^d7N`Y(BCʖ;IS\T5c(> e7;֏";,?ptsq3nnQYq(re#1T?iEɪS]pdi[o9ع{^+ͨKYYcΔy}V.N oX L\VD6_z?W@Z+vsjO\z%|z8?| }^ŋYx1+VN6VuxrϮRv%jUلW̘,cTߖ|4'ʒK#&,Szm4vx=^M4CCRL%5D}k-Q+oNcSHt5wxy\Dv9w[P,+6~42m IDAT֊2`IU<`i7ū4 "A ,s!( LuTP(Z^F2<ȝkp Wp–WZtjþR Z2:)޿scjMWKeU!-Kp4%DshӐoY}.cv:D]<{i(tM%9@}71T G/@jJMEG>?Cd1I$‰Ds\=\I|f*Q&oV <ҟAU hEE(lyMٽj'LSpt#ygkW$짅Ҡ @eWyѫ֤I]sJ;{lǞ懹!!koCKje MI%yn$><BKk/KSEEQkU`*c,ٞT~a,{d5TOX|zzz-(E{þ^ZF\WNKkE#k7jdjP5~M~5y|汌cS ,B`ĐuA,-a޷l@fT^''XnM a~6Rq:o`zB[~ϻysۤV< β,\}& i;vv]JAW+TQ,+}xV8UΔ`x,)Sg2h8@?K;~ʊf?̞ .Ũ=]ZZuoyqʵxsCDVZ-7ZҳP_-zҺ'@q= i?TunC {I=h0ifxt;OJGE?f',IѝR 0ƅ:vxWh~lsx={$HTl+4N'ѯb\f8ץCi 5m넮a;m7$s'*|J_JIeiD_T >g!^y%A6Tgƿkӆ14 o̰P6""" [2].?2z\_e0e{yFau[ȷf/6$a]E> k].^>aK[<-=]y۾c(rŲL/?QyryVZ4kZ(~w>Ͳ,֭@aUXŖۨ[{sLX 5Rܖ]g;]˩pY200my׊,މɋ;`z &L """ˮ46M !""GDDDDDDY """WHaXDD.~ """Wub^,WBBCC9x*T߽ZDD X>Dhh{\% """WHP` ֲ,"kaJ`"r(Ԋ\AA#"RzڂEVDD Ӈ&kB\jEDDDDD䚥P+"""""",Zf)Ԋ5KVDDDDDDYO\h=F\\{Ha~~)S@jJjEDDGGsiU{a\bbb9p mP+""cTR*B' *V?+VDD.K\\zhEDKn Zf)Ԋ5KE9y$/f۶mDGGWEnݺt҅RJWH!P+$!!'2}t,˭U`gfС<5 ???f"""""R(y>}]e{uyWYz5K,xn-EDDDDZkj%_ tڕ͛7_֝d۶mDDD^-"""""8Zĉٲe NӽaY[ne„ yȿ:pS pLf&nJYUDDD俤ǒ'O2}=4i҄` VWDFF?YfY3f੧L2.`EdHLZFTz]ϡA`y"8%mu1s{RJ<$/ p:dM> tr+*fx*mV^kZ2g}+KsoP 9ykTo#_ìְ9 *|矻ٿ~`\!nߎl Q ?~t|m/4qvO΂~LI`I,ޘ؅Op?f^)ۗʎ,:Y+lo2c_2IE`V>~z"""7ZŋIHHV5kW^ ~gZlIbbbfYBB/%wӠzOy)/ʹ <R[ڴ)aP~$2e1aǗ/3f+t2[_#;r̢>J1q}yCI|FR$g F̙-!{5nj"mHlLG~+5bO1rv |&Y8Oi &'gO]o0LgUn~b[?_6| 0&dcgαzLO*Ӑr6g̘S8y[- xVo/A/S|ދd(؊\ ?X0G_.|aEЪe zw6?S?hߺ5`;r>-ݟ2OWZeۮ<0f l6vѨggj%?N/0ڄF뻟Mg2-ڛhѦ [uG>S <إ-Zӹ: muӧ ZCIs]Ê?ᆔ$zivWV `ijݨ[ ul9f Z=kndzX-nSO%}o+-Ξ&T)|Vl>/җ O6v[OӞۉohSU:EBl;4>Mio+xxC"c8emC<'M/Q~ɽοqT(Sry>gCJThE Vz[Q*V"'w~h\m<ҋ?gvNJ藟$.6?͜Ӊa٤5kX t ?fcs[)"}S/׺d)[LߙB[ftbYN"O!9@iq 1HK5_(q+Zwo_|//:&|=^6ű;_cԸVj6uN,#ίǟ6Ʉy>sJd/ [j7>x< (߄ڼRRq:T1"a!eO{SO/+yg<:\˿bR~e֟sYϞF04M2%YDD"VK,#..ν*WNG}DDDeKqM!UZsW9^Svxk fٶ`ڰa#\=nFnx_~mZhbލW?{療a9qziQ6ԟQXFjT;YkXg&$#5;f͊{l&{ai):/мY0uo#fJzErEDD$W2Xu۷o@*!!|[V\8=/WM*hxQ:4w87lKJN3( x%p}eVhE~x$_D*$}V,tL?TDQ#+|dB+:T6q"J/X4;oz4(ڬ=a>o$ 89w_;mtg>N/d-ܒyk^/39n/#>RrxV^ox`/?[ORTiEY33|wwEçG]qŸp$u5k A᭩I=?%MlCZH!eSʅs,D\ɏR 'rp| z][\0!Oחqg vTk܃מJ՘~vlIA(VO+cdq23" :jm1u &άЄ7hЀ 6дivڴi<3)R$[\ v[f^-3Li`زL#>iow&鞖;`F^_+a~z.`.ܷas{o2w\'"""JUrYm?c=O?ו+Wz_ؙ3gh #v6{|]pt_DDDDD ?%۾};$$$b 4ialڴ)GȬ^:aaaZWaaa|޽;[M;_DDDDD ?%{HHHtt:IJJw Gq[I0\ۺn|OV.Yn12Way9_[^ rz!<==3v;?pf 9.8x8p(6Ϸo\5rXjzƍgoذo>nJ EuVݛ#n|qWJ11_-T r à~ݟ}hq6m(RQQQee㏳a|||2]%''p8ЦM_D<|J*`+""[LL,uT\ rY +W!C` \ ɛB?>-Z 111ܲ,wq/Zw>>>̟??G/, ^"""r5Kuuᣏ>Ͻ||| fAVuaХKV\IŊݫT\9;va"""""+%OAXX;v`̘1O,F?LÆ hEDDDD$OV3aQxYr%6mȑ#@mA4h@۶m)R¬B)"##sL|L$00ݻӭ[eܞJ];۱vN"""""rRWnݺE㏹CRil6l6i^@sN6lؐ8s;'vVԥKJ|||fYrr2-[iӦ_z%EFFa{yyѥKy"׺h=F\\M5 IDAT{o""Rp/3Gj%OJbk8DVZҲC?N2ejEhN:M*w|ȵ'&&( ѣGfmۖ-( :u0fM>%/8rժT& JDD 熊 >KXx1ջf{j׮͒%K[_Z뒛DVΫdɒ\!C^]`yyy1h VZERP."""""yc L4zŋm6ݛEnݺt҅ҥKcܛH!P+4Mʔ)C~{]mF)j),HAt""""""",Zf)Ԋ\6˟yN-ךVVDV4_ ȸ IX6DGyw=.Ouɢ)y۸Bq 83󵝚O>_jE:csyw98nGfZmyV |U ]VDDD % ?aڰؽР38~,'1,ښE(┍Ћ{RH%SwWZiK.'H,-JxyK ޼QX4tuVg06=u̻COvHϥ/纏_0nkӆwgR1ٰ{fu; """R0VD_DNǪ,&XN˰] Ùbk3}o%5% H8\Vt&ExyL,̾i6?7fQUCBάdL+;Qu61s^Lsۇgۿ;t ԖK7F=)UvMxy7{:M0cLx}%u_/}H\yL="rIe۽hެ <87?ث4cU>WǐcuEX ol"ToՈX*JχSێwh8]8Yf7))r<>ʕ_(,T\\wʯi׾=:<=)X՘}|8r'9  N3>h s=uu|\]댝0R>o3Iәy)Yo=jWY\^yh&{/*x6OcR7CfǴ8ǙN:0#ޑOjxR=0Wrه?MbܗsxloqO'yQ\scx{Y歲쁑~Ÿ4%b͙gԢgw_/S"""R)Ԋu'Za'r8[#vqwZ˙8!s {[Kt~~4>fp402-(Ax} 4 }O%49w=΁^gب(6:v/^<}(|8luB8~\yf-o}|]Q)(؊H"rs:9B*hxQ:4w87lKz3oI1jRIZ™p#ǒf3H<N9އˡ=9GT+$qMxVrQOlF~//|KAwr .kgD H6!*ķT 6X3m2_}f?|=W=H /48;J\hOyfp9xSkZ_M፿™0>vdïz1bØEDDD [2].?2z\_e0e{yFau[ȷ\-=y_;vP?^Ιz%9g701̌N˂!Ö pK[4ӆ[N6|8}u2Z8-#ܖar:qfVf98 [.\>N fbXNrC6oJfMPDDj,u7Р~{U6ee6֩^użG<9HM8eNeGr*iӉd,;\qbϭ<\2\hY654[zb6 "jOaH-e浭0{1mgas;GNDDDDDDY """"""rRkB\jEDhc_P+""ׇ؋S5-&&??_bJtK,<|J*^-""Rr!BCCݫ*QObccݫEDD 0%44"Eܫ*QHq넮-XjEDx4Q\jY,܂.vl9O_#<8é? {ÎEDDDDDZxFa rtV:s N8H+cO{(V6 \ r LoH?-҉EO]''6iI{ؼˇz nĆk^oA]7'8Cq^Mh^f)i9߽>4#[q`qn' #-Z4IN;r1S2zEDDDD0SKbАFig<ϖu;m܆Nľ9p4 o̽>`يUўX$OK^]=kF l_i2kwd[6v3wz%լ].lHYM&""""r]PKcJ0vlGrl-N)6*^ƨTlʩ 6#g0VnMM[ vbaq4{a)M癩gLt ya]qrZ~sSZߢ|KRJ)<4 uAYrո6 lןϱɯTc7ewX)PI}Laߒx﫭6#cGSheY< *$#A%(jOqt4tnjXG")>wy7ۀ^&+׊g9rqqqUWe2 ϗPݫ*QK_15/esSn`ehޢ4oX,)0H&OxI7W ' "8g"]HN!>k+Jѐt{cfUfbPF'+ 6b ѭ-3$ȿ'::NSJeݫEDD X>`[@(%3Ӹ4fx`b:ҫÀӜHJx,nZ'AxsF|^zR']9Iu{M:ucлѮ4(~=7zqh?Tb^~!O$B"#GQJeܫDDD "EbE~cBmP+,CEz-jqrKyEq6'؞= D`=gӓ;q _:]Q林 :#g+p{43TK^䥯czPfѹ^ZH\\zhED_.)eQ}glᾌoyf|җz૴z"941 >ař"""""Ric,ihJ1m@^6ah8Ń͆͊fyl.Z:e5L3s}͖\]Z."""""zj@H9_oqA 8/z{ɛBE[惲yHnj`0Ll6Bil\jEDeqnٳ7cYog8yT Oz8cRelvEDDDu "RX,ܒa/D~=V$_HB8y54s7Oߌ6 m17hԈӸe{=26a%oH> vqF4,8w!M-hҼ C!ϗH8pZd8vI0j7n}c{B:V2}ޢ17igHA>9 uk ݜ)IMVD %ArIX$ ?|W/9g2[ڴiP˜rT)?5_FWX~ƁuZ81w$vŢvj;N̝i?eР8ڏeU[-SnHݗd/PX?`s87<<ej9I(՟}mW#,}~2_Gea˘%qz˭Ӝݻػ{ I)DDD Z)Tlu_S\֐],=՜65\9FFmhчlTZi+&[vZ?C |S}G[ZNI_G\. ݎW`9ĭ932ѷ{GZ뀩>H?y nwЪU[[D^ؾhv:;w6L%tk@Ӏޞt盯wJ"% x3}m6lyeXCZٿg0j<ڲ"6 h߸8%ղy{7 *֔''2c֠{e3D=5_.ٶ#mYCy'2/1y%߭w!x(F-8LFNMٵCM2,+2c[rV.zb;Iȭy&C8w!;jS-0i3näOYK7=fW?М~ͪc)/L6X|t V̒R/kȳ] 7i1r Dϙ?iU3iӎ~/_yFf/-E^yg45j߄[#+_oDxi׭slxm<[Z|ȺE|LI;ҽeS7nM_i="""r)ԊHeQkpX%k"rJíB6Dy3~]޼gվ;m#&0.u/|{-A6 DtÙ~zuIe۽hެm~~Ơמz U#W#JxYf*(,CFgS*m]aJvx6BwMݖL'oooHL !9ʏ=cF޴1?bey9փ R[z>My*]6n;FܙJAYG^|&> 8e[oWc7xv>5ƵբKD3)z['ޚwE%lԁGCsrb%)n7*oi:,f3{LBam$ƂMssוMeI'iB];7;a`ajP,Ėىh3mtbYN";'e}ݞ3$>~׷H7Ep ;9~MDp,V1/lFqzFP숌` y~mA؈e̽?g< c^Y5ϰh381G)`k'9n6 흱SDi7.=CjզP+"И_g7m#Q43ł16*q'N|+)}(\"Hԕ-t=!u<\&?20(3ڌl #kT,`d.!r[U`p"pڝtٹa*H;8gQ# CE@Ŋ{|8NEb>dRMOԍhCI:ؐNM܂AHN4:x'$ȻP]K*<_+o-H:9Aa[^X|:fbC$4wyKX3םIwPZyxÆH!2C[|2wgS_-Z[5:u wf$/9T6:Akow"'$_W9#}Jrk6k[W d/Y 䑙2s/g_Q$:fG.^Z@="RyܑK|򆝨 x~9 ]^S_`bM0)~joO"[:N盼4>҉#vH&Pz@L҇/,ف1Sr$)V&V&5f9zɾigO7 n &jV<Ih]4+erΛ yYuWMWdlENqq""" ˲X~ ꇹWecY[nn:UWo9>yēHq[v}QtYv/˲eJ/#{] -F="R(%ji#[a`ytfz4!=znrS69}00c""""VDDDDDDa """"""rRkB\4Q\_~~{o> L2TZ֭[e?رc9rDn&WNƍ[WQ޳^Wp(E;qdɒ%8ix[9Im4mڔN:ѭ[7ʖ-qQ-ZҥKY~=ə۱cGON2e2!"__bcw)bbbu/DV.ʉ'hݺ5{fu2Vb >=z0djԨFǫʼy2]/Y}rJBCC]Zȿ!44QBlEDpY(E8p`67A4))ss=Gzr}v^z%/^3Ų,/0M]:.o dIDD0 ??_BCC ,RĽZZ`K!˲,-⫯O>L0ŋpFٳIMMŖetRvMZܫE ۗU""""Z`7n5hvܙ>}PX1 `Νlٲ%K<3Ξ=%K0a `ќ;3&$$tlv\GD(;s0 | %(0нZZ`!!!4k֌UVedzgϲpB\N>}HLLt`С y饗r̄w{G=r… 9{lP۬Y3BBB\Zȿ!**NsS*~%""RrABÏt1G5kV ˗/3i?~V<у7fsvu㾵"r)Њuߟ8bJ_.Jhh(sOQF r|wLJ>,md뮻X`U$$$еkYSSS5jT^=zPlle"""""R(E2dH={0w\>LDDN1铷7 .cǎ9we:t૯Ͻ3gЩS'<Ȝ9s_0\QDDDDD }ꗋv7ӹsl=e1rH\ow|M97SB hVJ jFUQjݪ{JjQԈ-;PU|ז`!B!B30rl4<<'Of xКKo]hQ ˶Ç?zB!./IjիWh0fϞM.]r +_~|EQܹ3s|yzꅗ !BP+?\]]͋6l{6/pB/^Ls V -Dg.V!BH Apssc 0v,l…$$$i… s 2vX6lh^a񸻻KONQ9'6hWһHjd?ifǒsZ%=4-{ӵt1!⿓s" C!RQ\/O߲"^ z4ˋ鏚t_rc ;0ڸt4SN-l}}惷E0oyg|-g|y1z^>m\ڟ&&^ۆxרN՚M"""3fLAt׮]?>=z`ii1maaA=r Ǐg׮]ƌChhyxBWo~<{Yv ,r> b1Ƶ\)V+P(eϮ/S+uCB:kNۻ1Z_I!2֕[Ş#G9p2WfĂsй{l6 \Lx]͛ ȒO׬>O%k84oBpr*D3۷o]R/4yd-{g^Mپ}; ,@uzM͚5s ,`ҤIL?-sg}ܹsت+%VVVX'if=Cuĉxkry֟]b,[2mG nB^=#n0ZoƊ9(to-93A@` C52{Jo&}ώX_C; wfp*Bz iWHQX=cYP>O_obu_aҒ\6RL*IW1y*~޽7:;g}̀3%+|v#P~&s[β+I*+E{L̛8 CWy[3 (NL,XCG^ L4mCWEMۙ˨mUݩ߫(j  ԫʊw0Q5z/S&ն1ϧ5`c/;eqLeR+z&7!:%QaˢPb9vSHE*fx`I2{4GxBe1;ϻÎd"){r)Ǫۥ gO`泄)U] o+I)뮆aݳ9˭w4:z{sMWk4Ȗa©|k1_O!x<;q-ʵ6i 4իWg PfM.\ȢE]vat͚5 4h^͢E_KOhgXz^ˎh~snkb1]R>eٶf,o\˷;0AuVՋ|}PHT*;'b=iZ l*4=S=}S@ьnBwU_:Gjҧ7"SU^Wwp j:]R ) zzRрb2z;?s蒕E9VA)N#2^XB'U ܹslڴ)[p/hԨ 4Y꒒ҥ ԫW/ktڕ,\0VbϞ= 0 Kƍ9{,*T b€|׭XFcE5'gی񪪪p6`hD+v$TU'Za4;;?zd(#;=:vK?Ϩ`FDEE/XX挒mAb)6aIǙH=$y'`fӲ|}. ow-fOOź%,3xy`z(xoC2YLޞ7~3|P+^53%[F;m}f SP$,HXhI̧ϒZc qq9GX^rgY(δ6 9)Ux+)nwpn}47b0&VxwI;tvNf‰]Q'bO[1Ӗ;u52ċ T^iiSYaf'ٗ2jhv-ǚ{TWܜV *h&)A!x$Ԋ6mڴlc[˕+G^b˖-ԯ_,7..???VZElnJN3ɉ@J.Mɒ%;w.OXL6 ؝YՀELE~ ]IKPɧ&Ӧ|;П 5GC/}q I G $\ " I}).qz>@c~'R|i1yÇ N8eȚ4̟6F43 9xoɾY3S{^^ܝxuWǁ\6#u״rɶ|8(}ԅ-/hlZ7GN34b?i0qmZWW+ܼ{ںRu+g7{ݧ\n.:nb z޻_kf,B{DGJ)\[M|װ-GCh 4ВP~'fǴ>UP Pw/Zs롡ݦNtƫa_~3s>ojVL ÚA]*ލ>)K@: M[G .f<Y`)=/A[/ިwl{[SP>dhu =#H-O}.gJ CkԈ Ѱ5)5yC mHsjTCOSy Wy*ebgz֠f|,"78y }r7~?7{ !9/˭,<ߙDo0dW4mi:-N,>8k~ Gmv'%{Dfعsg`wTuVZ녞TUe;UU?~|@`tpo]˗ӻw,-Ⱦ8x4"Xcm^?qjUa9STRjuq5L^IG1v5 -xO igyne5RW PӖ.ƽ6WQH~?O:'-A?t>NĒ}QErB;p/jUY/~JU͔ynN11aR̦3^eN֕:i:ҽ9Hyڼ.]^˲=ċ#**}e NNNo>[йsgСCWMӘ4iǎCQla9-Vl} 6e۷(\\\;E5za#$RP3(mYYyU˲͘yRQQseS(b[ 0B!${"ZQ7omn1MդIlْkܵkWё6mkۢE,eF]v\!B!ABȳg cYs( kfǎ-ZԼ]׳-Ro۳c֭cK… 9.[!B|xpR"͍7̋TR EQx rTXbbb͋BVLL,vv̋Dn#lٲ(%ӹsgz쉋 rI~g@Ӵ\ì3&L@QƌChhhz]1L9rG2l0RJDDDd6lؐm=e˖2-x<<<<'T!B!xJHB!B̒B!(n$66ּJ!xn(]><<^Zu_!xIBlҀ^˯%hw>I~)?gv!^IesZ<1t3>Rh}LnJk.Rcǚ!xIB\ - Z IDAT\[x1_4Mk5qK4{u;5,ҊR~ȦX_Z{fy^jt1*UrJ1/x3yBZ!'8{Qק>;aRB25LߎR|1MS⹰i"}4Ƿ mKӮ-g/Xhh@M4b9E%l.{4^˾|vFKsҕ-LݒzuӤP|m״J-?Jc__|[t'X»/`PAV{4]dI߰,]̠pOo֘=)=}=g={Qۻ^Ma֫5&rahCuZlԁ%k?^IJL=9P5J9f)}pMpe5a@"x-_OzxzףW^Zwu[΍Yzm1P(yz!&mBד;V科Yŋc0]}Ӱ~j!?p:L0b\%bV&4z{VOu+,zroLWYح:o/Q걼ݴkR@}d ʼ} +a}kԤ~1lNMiOٛ5--sçv-jէYI "8<v:M?nZ|hT]Bm9ҟ;❙KP{(*Ϧ%8p\4A.t9|=&1з$V(gҸ7jwP8Pφ=i٪4jl9r0p/M[S&JLx_0*_ X1c!{aЂl> hc3s8h:o&/'kqôQ]_q߯߹#['ya&j[>t5q+5D3r AHF_iոq&3`^$gq>֏.c>dީ3YozsGrb!,!&w0q)ڽy_>De/:A_0dJy?Sk_`DZQ'Wyf3rxf&U:g#Wǁ6 !O+!`܂whҸ =3Iiݏ%h{; XR'%`˙ uѪd>ŎunU˒_5.ED vbhmJcPΏ2?=]XegO\-A{=Q)R&e-Q'#f^W[Ϫ8©ݻ^M]In ,/mj;}d6U 䣴oM^77*H*.;Ζ]^$xMQJ aߚ Je^jQ:-ԚBul5U'|F b›Mmٷ(s.hUK)l;oSԭl8r{#bX+\;;5 +)YHW>c)hU{2}]vPP5J-zi;ArF+|ݒ8eZci{T,p.}! TƱb}^ ٨`pVH z2Jx2.QLIeZ8|Ҷ-bCцi]ڀ$rdv -U;T5?;`hiْ~Z!D6+j[C\>Z,aIG% :u-2-P88;UQ X槀UT4MC K dG4 X!IjP dIgN\u/R¹d*"ÈsޖZࠤn)Iǘڡ13굔$4eƳjsv{o(88:dθF|f|qZ|8=dy]o(uZAn<*%VݭK[8ȐKAhey[2gsF$LǘlB\ @h` Gf54M^L!W#*[7PUXu#Y/'T$|h=o^WdlGp"*g=ݝqg>0<Ēy?0- )z"^JSXY`%-O 9V)sb6^R])6v;3zov8B,P+aa炛i-h Y(( Xz+iHH]]2¤做gG^?r.5@ 4JKO E#&.,Ÿõ=c, hWPH"#jq18dW>__F^Ԫ&5"BI`r \6Cgf v3#)C/2$dC`M&xMWR~[nJ ^AV#y.td("&59nu*'gtfNe'μy:P(p?vJV-:ҏG@,0l[VI&xD9+N2iU/mtd'2AŊ;76g nE|WCɪQW,.V:ާa@Ze :ёљZm)^7_I54)E0'{ ]Z :REWɑ4Kُ!9)":\NObtPe#AXw1F"N,eW4-g mҗ؍sY{:5ɑ\>7ׂxM+s'\v}ްԈƺXY^q4v[15Jե^cw5bڃD]Y-h>'hFܭ?8w>/%?N @<:8R AOg%D2!Yk4[5:gN"XIA'Ÿ&H86hFzD}b4oY6nR(Ң"Zp`2ND@OljDk/w7VxkDyk})wsé;LTQ yܮId +x`@o>=99ՒFvA0jTjnq|VEH Yϕ|DD.[VE]UbI>DZs#lìy~RT : {):.w$|xx$slØxوutF@Oӗs9B<3$Ԋt⃀Youbj3dGrnX {֥K[8yF Š k4iD/[>SԑOh٠{ 5/ 6ۤ 4XH>Ԫ˛j Pw/ZZ#Fm4F6IWFQғӈkxotW^1\Gr'.{7PLt [uYL*ӳ Ӫ*gm]<" =9/S bn iM/x7 .e\97^j?>3YN1[?lGێ]=#Z~rk}u%Z7IfZ,<52oHa iNuhi*A׳ /aPGKߢet 4x`W945-:M(ڰ&vĞųf]j9 w8w ǮĠb4S[1k=j䣝 dއEoOO55gq Yqr/g6k5R{f4PIX>mwz`Y^h5S1џn(=0}>f:*B}q( H}EGGNŰ3Be+BgEll7n\`/ E'"Gkau£#Ia7*9,$[}yHյqr^B!Y%VMHBtѼ٣kزclyB̌ѡ%_M292qcDzv  O&r7LUBP+r~L1ŏk"\=.NKmOCʒTIO/VEf]?qgcϷchT-+!$Os[q1ټ1MkQջ!Gr^v'8Kkطk#] Ќ|oTB~ !K2V*Ut}5KY^y 7.,'>"9u.ZUvzWR,}ߠ]Zl'C.IT"O`58ߡ,:o/@!>ôU `tz&cQԲ8þUqIÉX5d7ؗtnBCUa?K/p'94[Pzƌ_ Q&+_yY3:S4 M YAGsʯVuGKTd/a+udJ̠3N5!|9ԗB*hWFLB^=; a9Zmƣ-SE(8U`@# |Wc5: bXj:w>|టEb+ 1攲y!x̿?EI ={EHfJP#SQqW!AqPu+b SJkF_G eCJDk6&q:v0I4˦yW1=t*}*f`@|ZQlZ?ȴS:Q1lMj#{4,kޜ†{Z:5\QMaXǢov+2qaٿrfoMRMs֠/^ֆD5_MkGʎ`IvKG3g]ԗ0~ڻTH8%}8Kv+}03}BYZ.e ].a|X؏Ewcmo2 ߙ[ٹs=y;"P_8k7' ƍ܈[sٲs'A zu4\%}aΌ}'*TB$ĿN;]<̋ڥ0K B!2$OxyUc8VnCJbW)R\m0R'/NFgK<;M57k ([b!WjUĘ!(8x:C1t0W)hS[B4iU6n/[vc]ު䆭=b;ıߪ (Rb `]zyS 40}7EUQPTv:R6-R8X)O׮+  {]o 44>uK8aogCjTpӎV/ҢV͢ڗ@.ōԹ_K4`\ M dl=bV~)ږ €mẼߵ 6c$}[!ē%ݏZP@z+E)-o k@UI[Fok~~BlH 5"#Pqxݱ 'BB/XzP8\7Ѽ:^M(c۲BLT]׺;YKG2paޛ˖tb{JdP>Z:h? .Dg_7<(sϼ6x ~??1IHVj޺PwtnzB " &DDxEZfOKwBM#};l "*sΜ;f{_>[7i təKh7sS $QQs|wef9)Ͻ(J5'ec5Ǝ9Ȥ]?2ZJ@yݮ^'u qe',6 j?Jus'3mߞt(LZFuBӬ\ROPʨkpϼr\q% :et?aWPj^PPAAAYf'ɃЖH\5LP(ؠ%U/,Hk)Zб ~v7L:z%~ki诠 S4(㇯`Nd|.>K2Nq2=L=r2< zjqi\wҮndj>?|r]wUh؉zURu0?BۦY!5K!ȃ>SNKZ+>,TjBxGozk +4.|ygH}Jv_@͵ZGƒ-ʹљ h3KO86 7t='~H_b4j*?W]_|+_K8hǫuw)>4ۗ"ߤm^ci܊H>#,{j,nJ!P Y7iz=חAQUŻϔ*v啦1|ѫ%- F-КzuO qt˽z#Qp ,D`h>Sٿ&5QcB!?LZPڹ[;2M<{}ǣ] BK|wQ1 !B⡈>]jHq˧WCR)Ro\:Y^f1{duZ!BXV<ZjrC'B!xIP+5;&U#@»TBs1;  < =B-ŷZcnu/G9./B!x|HP+EsO-,GPIkB!B<6$ 8溄B!I~S!B!D%AB!B !"Ge:O45΍x-)B*{vgrzW';g%eFOznaGE릣,cwSbqgMX oY 'eбmVrrd5 y0Gwa8L'o槏~H&B< j=(lyt.MozlES>/SәeӸhW^thӒM-@Ίi1N@Mߤ}_E&:OOfGB_'fRv~]˰gfgJĺOѭUC5͋s9fDN-][P7M:΂{h>cL&MiҾo}wh @ʏ/$@+5ş0e[6f&tci |:ɢ S.WҪ)ˠi< -_Aiؼ}'~d,H-iܬ5]}JUkM9m3߱fp d@vID ~5| fe/ڭ%aa8YA6nЁ-wc91mcGE cGe~6󯠑̙e\oBۗ.2kx=8FQX8aͻ3컓5Eth܀mxfΤY:bCiWq+7>`I&)Փ﮸QQ/WHܹ7>RǑ}Т)uѴX7eYx8kM6આ ƽԕMR')OS=;Oߦg놄֩OnnȞ[! e}r<놇Q`fuB_ WT;LNp*j9E 4_Auy4䡏*״TnZOиNT@_`6/{Zf1k} ߄]a$[- Q|4flpqkq /æAB_bͲߩթ9ZtX{7PLЬL:V7m`%|53]uNϯp/lݱ e1 cۼ߼ߚьr`)[*[>͵:/40J2w9M">#s`m\Ć1=INID噯ֲ-W>{MwsnelX{Վ0aO\i zZɦS՝BjRB!ܳ} C1>YuOz={62cO3XXe˥u9“mc*~veLqwG\&̺՚ػvO'dv&y ǪKg,D}kNOu-A8>ҟzLaYRoq*{.BZA/ \y8sWnd%,_ ɥ>J] kt ZβY;3ۍ@\OZ#///hV3-;=\Lv}<_?O!yt%OQ\|!VP%o3> 4s:G Z JY/'eշ:sf :Nbݾ*Ԉ&U[.@쎩~3ޡelXήdF o[=:7OV'XH/^pX dي[<[-d1@u, M0J_ꟳZ5ϵ/ylLK[rukWvߘn"!'Y!&czSPK]4^'J%͟C VRٷ2Ct- Ty~X(`.@аxfHOSƹy򉞈fr/^/h)߼>%; T6=­;Qk^+eTήY~ȟƞQΤ^@ F@vI?ƭ&,U|T ?}OXX6 CE)Cnu1}_NI@lmynv,7l% '1]uT ?:FQ'_šKQ\|(T?U\ K-<R~m"˓& :xgJ)OPۄ_MTsh4l0VP -TWuH7*nu{ж`_"%ҵ Thрߞ~`[B!\7 -8gʐsEQuq2{|}Jd!_i*$^M¥Gs,5rY+|1MdhWNMY7cf5)=DyqXbSCݘ@L5{ՈA)DݸP+(hb4(h?{{J*[^d׊!a=czkܾOvE-@]-H\!veU) hwu;mzeijj& )Q8 |_E|T揠ꕵ)jD՜=slg~J@3_?OW̬^KdnJeve6!Ա[#&13!ŷ]m˙os#:cڲ-i&4$*'")X=r֪Y82W4{.]zcrdfgۘUZE 7vDFv-Gn Wqe7_T M׸}6i&ru&d\)"O N!=+~eTo(13u]16βL>P(˼?a9>Lcem.o I"ixHrv:7T}UuB=׹A @'uj*)#ur^ee"^7?3Y7zg@ o,o!2Mr!Wmg V zFH'PC;e|O/tUPԠ>,*%J_(?<3bvZ5(VQṬif+F03>y߃r嗁峿ȾS;[ͩ$nۦ1At`9oqGͲ:wCI^cj{a_+/?Bj vOТ7XRbЈ WEhҖp>w3aF}PLlՔ ?jdܧ)8&<B8^W!#B,IreȗG\Z e+]M;'{eU)P &#&3ޙwbۛX{T/DPPu(S }fnТ[tҸu-둸k~9u  ;Qb$UӍ|I*mJ UſH\I:;_ܮqlP[vʴos4Z5榴uwكZjf>k"1q}Ϭ#Z:6#ql~=M\9wʉ&'kw cKn8j*rx& ȡHkK[E=:"m+݄ں3Pb~ {^e̫m[遚(޵^/,߿CIr,=F-גJɶ({x)kSg4^/wz4#~+L5]!hg4o@_?VG-КzbX8M9D=K^zS<+ ٍ& >p3T]hU~ǁ+_'xgK5ʈ-4uUl;$ -iԼ#7K (k&f4mؐmgեzQ'vD)9@ܨdF;Wq~P^wY>ًg_zbЩU:[wӾc9[̦R74͟a̯9yϫ ޜ>yy][|vt)Q}FA3x74S{7Vh8W2:EC%Oy'Cf4m֑fƸ,{<¤Nz4-CYؽ'O:VIJS+܊`'ڣGQC\wB8Y M:Ԭۊ&|B!>r6_NiӎCed\+j7mTm2~<#GO1a>uSͩ:⑶SF-O,mXC:|:5}OEEQM-uMCUC*55,mF,h4͢lMGQ Yw]ɚf˱[^Gf죮-zw{:ݭEUld[Ju؏~v̜͢CYcUl&mYUQѲ;]5w*ŢgOd4n g1`1n ]Úynhmֲe9г|7缓xS!]ٶcg2Aj8f=4S̻6qXl1 a~<#_ئ̀n7mmi@ ӎyrEno !ĿBQ ٟEjӊFYקϠWu+(m_8[Yu߲cuߝe:ٶmެNQTy@l=iَSTT8p wnWAͶُ:8n/9a}NQ>*˒9|pZ!B!yB!B!, jB!BY !B!ȳ$B!BgIP+)/oE càZ͏YOqqB!BIJPPA^,F|NLB:.0ﲙ;B^HA±s>c= (QE%4t59s9y B!BFnj!o0rt4sˢP8;LBΡSwDq>dۄb IDATo7VN--.>|!DϕQ$%%9f !(xyyRHyG#@ljbsyWӋt7R|AK{ag-Q[ÏwMْa ~|Y[-IU蔔xM f631'}LlLUwzUC¡IYӄ8nގvB!D_ L}(FyY{B]9 DF|B:W5lB.ǧDvi7|D /6S'yEDoR])qV*:x05abxvW* E<}'b-xLD\R*9pIМoJd =liRXtl$x4]E%$Btɒ\%a>FTotLN5!Qt|]d7BR,hĨTo-kMBV41q$@pF`xoWy\:-`J3R:ɶ|ەV~fVMҒXs 1V'D %+ y( ̎Z5FZ1`\hd0ᦆ⑒cB^14Pu%!ST|] ZR:GnUH,B­vĨݤh4okwĠ<5Fٞu;|l}go7MxغߜB!"͏'Mfhq#]`P)^Ѓ݈96vLPaBIgw3{ ,΅{W%ĞT:6⧀b}I|lM .t/Jj d܍wϺJwl4_3N HB!B}1}-ff>NtB:;ôH3).1:5\)xya&0SZ BHR)7%2'_ՇoJ)RYw!3ZÉ+x27 lf.f=X7'9vd l's"ӈ-I&<]!B1tf Sne _2ju* Rf?ξ/6ǂ@;p:cʶL|L㓌tXRH<$D&=Gbk,l:8˾{Aݒ(KfB!$ jS ͓֜@Ze-ymfm~'p-{|@'hk-B!xIP+M~+´wb !B!]Q6'Os} /K  yM}jۨE\4.{ڵBZZaiԶ&-iiw] !K8Ko9ElM8=EC]8l6j3&FY{|CpjmAq06>\Xخᄍj]B^J_nd]i #êRj5*UNF~ flb{] s{RFJʲǴk;CfY&NnCVٟ,w~~'jR/LJ;nZ4YP~ov GXμWbʔd7Tcf8)Wx|,~m\к hR=v+ﶭE;dпk ¨U5=,dRrnlW:6"V8c wjۚZ mٛKΒjBHP+[3[t hP[|>8'㣉OQJp[-,诏ٽO,c "[᛺)3vs)nlOv>,7we=/-b蘥Di&.sR8?.XredPKOQlIu, >޷KOv0"U|7pWL=70'bV~@c1rahX7i:'zYR]%Wm= Ҳ,aO':b!;`lrZ5ٰ)/?sq:ߍj-D- hϮ, n?[f,t+`pwHa$Kv|50&ъzM`fb/4XW KP%W_&5sM,ٵ{Яqa\wJ}6lw+p6}&]i^nªGܘB7HP+/H;ݰnT=nKvS4Ԅ+8e-wdbDLMF)WUz; =sΌ{8>D'ˉndVpq _U `P.4+c3 Yځkҥ%q&ekhCʬ+5i%n_~jWY$][Q5Wlk%.*FRp/SWpv7rqcqwPTZR^W ves73m4/s|QI=M-h5fl6o> ו\Sy|u"*]W:cy^`R- ֬>aZ0|MN/_4P<{|kN~+|G`[dہcYs(ul^L* gV %|o\RFvuQsr< p'FPW f.LR !Q"#B%Yd%Qʘ̞pi$  *us,aJ'b@L_hoȲ㙻/.bOeHLr֞LiHKK#d¢zsiD[q{g[4ֆ(T(B QS4'_cg+z Z?ηWcXZ'zvH¶QH8=:eFnhƏM.D Kv'ZG]ƬD,[eK~哧Kz< H}Z61wQoM\~,X-iR>h=FI: c_lT 귧_fuT"}Ţiܜ3CZ4,dh޺ZNB<$B[<Ȉ1YLmx8 :ίLxYJmbmW>k0yP.p0*L)x+3ȴԞ'{+ CQL;7%y.!5Rj5t,ѷa}7ۄ #g1ky.tiʪE{IgjCZ]?L!0wr ڱ%Gܩ5VJHXyEKSxzV(;c@w4bpG\z-%zһCYý f]}c;ڂ2~Nc'K 揢k:TJN#Y3't J@kޙԖ["vC<.SF_(=Gc6,F//i^')[!yGn:/tqi!Wu2ݴn:cPim7gL9OarTVuA'k"M:|:SO ^#Bt]gێ9^L3Cf`35imڌuƴ9L_6d\a`?혗!iYApdP zB!pSB!B!#KZ!B!yB!B!, jB!BY !c! IP+"$111Y![%$$,aJ!y^pp0.]Tx{{;f !]BB".]$881K$BϜ%)IjlBE˓`|s0 jB',B8yV!B!D%AB!B le~XwBEZ!0 |)$-J%s-* UUPPPUnot4J|y\X#P3s_v}3W:=;Pt3֬+KeٳxN`tmTQeXF'bx] { ?ȌM+gH(ǦNfͭ?[2g̳a2b*IV!"/q"ABǓB!>-V) C 8I9c>hy!r5kQOK9?R[UV->IhVTl$O-c͕M,$E`ٶ$6|d?קyUwy])ߴ!ArnSe^ Fv1LoTa%!"0:&!̉ 9ͣ_H~j4+h+1SttY#@&}ݏ\˙e,ތQ7KOzZ3m{5ƃf!]RwM* hsW*~wK@âb[>LiX. 3웦B! n !H!gnŦ@;$RM̟m@T}9Gb:6_Ֆr^kVz-x}5N/_56zL#=Di*>~9ubQ|*yK~QHH|ϾBuB7xq3 7]!:"++ƍ`ΦHL#-)Op!^EM}qke mFꦅQ#B SPu(FAlY3qXpIe*Pj f䗷ݗ7Y0݉dO0g^CR/@Q3O8fh4lɄEpsDw'LidSR0YşFsIu;bβlזՌ@*;?'qB!DA'!d>S `)FVc:K3z>S=dFѲa?³r̋#Mu'F ũ=T/yQx*vә˸z'8KiTW:gjQ([3Ӧ:2tf}؇O/brTfʹ+%GEY3|\(dLA#|?^ȩHz5d<Ύ`b#w /?fڇ2R< })s^! Szl';z$?SvL!#rSl2ɸvFA\즍~<#GO1a>ɥ.SY! |E4K::|:SO P !]ٶcg2Aj8f=4S̻6q6Xti|nb6c!cb72zps2O;emZC !B!yB!B!, jB!BY !B!ȳ$B!BgIP+"ϓ^B[7'AB<˓$d!ocB&88 .{euߩj(ٕ IDATjho*j `e@i4fH E81:`8 b0qJL1*QDi:QgSv={9s M-%v-_,O|Dk3~1%'>Qw}=e&oI|D:I?Cv Yjv:IiXr}Qt,ZȢ,B13110hj#0hj#0hj#0hj#0hj#0VbS[FيqkSXbl{.7 `Kb`D-u@fmzu}jLLډqձ>Icmߦ~c%&&&teU\>Y6=Ԩ6V:u?=zs5F#==~^zÞl۾MS:#zFimڶ}y!1=h#_-?^h,{T?'vaĸxu}=Yva mٲE;ءXҖgzQjjuaGM@ovMhx 5VVaԴz^^_a~)Rè_}c:@ ~]x`<}7Mm/\u05Mz1LMmu0J:urzWv[nSn CSETՔ`5U=T&}}^|k^Zz{r<ETpӍھm$it֭j|_\<[lS,w﴾uۿwSO 7ި$]_]w~Oҧfrꩺm#?ӛ_zny4f)ˍQjj.|. {#c)]~ޙuS 7?q.Wͯ-!W~s_N=}ڸ@=q1_u:=(j|t/viԙ'N%G>Vǽ?XsM2T*K68U| 1``UzY|NnxX{tuOo}>Ů/w^t >`Hp3=_~>}+_odr{kOu tMs7>ۯћ'k2ϤsDWl~ܹb޼\=z٧kĄN;bML%ެ4~^gukƧ'[_oIOvr9Җ3_֏Nv7-o>I?.ҙg/}jVZ7ţ^r:\OYmy1zƤ!}3uOЫ^q})s?.8Nȧto7oj=t7R?W#)Iڥm7Ա8NwO/vm\};t)/Joۮ{$GK/Dg {bѣ_'}}1:gקʶ#_ot/O?׿)?Nܪ/8BۯCxO[v_]]C;W߬:}tB;>s~M%k;RcIǥ\Jڞ,fS[Wً/y ש<u'ڳG;t]yOkѝ=y'>A닇]ڃڽgBEO gV+qAikذQf/&j=Gcޠ_|ziL9ywO[KN:I/|AOy㵏vKUuvZOxs_ ljN̗)+-.Z\sL]j<mx]}PvޣhzO͆Vƴ=ւOvZ}\niQg7G>]u!:ăUц-u1X7^r^p䑺;t;1\OЎT.}k/~G=3{x֘6l<]q. if~m~|h=_x/mM*URq:,Row?.PJ.wos1tWo/[tѻN;o4qvƹ YksԗxZԎ?C5Oy?XҎG^l} LZi~c_jm} j}?B>}櫏3ow/>IyպuEC7sc:`݃Ǿ܉oR7|nfr-#:者3|^./EV]F:k+N9oMm|ti|ySz«Ǐ볗]O}{9=7^$WK=TVKH|=qVt凮J6\|yiZzNܺu^>{'L?C;h#;o}CɌ~!~aڼa\j?n]«c_?{t߷C;ǿL;o;WR1C߹.-{>('ViR;0qW\]PK7 :hSuXZS'_}u߽CW^t^~~j+wE~tṯtPiZ t9SNկuaV5oC#zO.8=jeovgOR?Cީ}'G{1:u/M/ ?k'\/9,kS/;\cѮ1x+~E;zo]_˺ꇻ@m~:i]W3~sR:d{Ro@J7eQ{Y̏XTR5u /vhFYY͝gBS51&uQSmw[%0X;|ukN&&455èijjZ&&bmʾb󞯋R2S[W֯cb6&7fU]gճ';yhz举tOК޻Wrzdu:m߾]7o]5g+Ԕo߮: }RrYO l\ǹg9c5Eͣ_z3:ҮہfJz0^|gvw6nqm=eCL-iSt׾/ܱmhZz=ɛj#_);|klG:XLwe}5vq"Z>_=V0*ԋZ-=wN61>>uircjIZ-\unj||\֭5sBoܤꢘc/A7~.GޔO}i$ZZjarR&'c }j499Ibܬ} h⺎n4gJ]C x.yщ?u3b/e5>(OR4u.q/zʹyl`>'?XͣTl( z>/^ns[#0RZVY3bS6yJUklj0~/_4NvKގF6߱}{)_^..͏1_ՋBs,m{D\_`&޸=O.~sCcwjS#'֕m^c#k`&;/ű*Vw[ V&UI.b| Fٌz[WG>kb]饩헲_]lyh*RljZMKqE>gj QY>w1M|#,3xK5uJĠZ{1Uc/5>ޖ4ޙ[;ΨˮnIRk֢ PGbCVKc?#ݍM51s$69Uu:Xc1wskԭrnz͚5uKxgq( .Ijue1nr WM`*G?d)kIVeB^;nLj޽{wow |?3m,n8ǽT̫NWh~ekOŹ4{AX[R*;q:N~U}Z;5֐{L|sk9},c.`!lL7kX<,Z̯}CjB T?>rc.L* B+7|hV/~KoclFM˅,3JS&:-K=lXj5 =n>5lx;րΟĘՙR1/{6Ȧ {du*Wu[sk{44ZCcs7\Cym-=w/66bJ?Gw1>XvpX1;^#wXxj][RJ7XvR9i>7ikAlwj,otg4lkZctry5X֠ZՉ͸>m3~TQssub9L5뽳fk{z>־ьgwe}׷;B\rRJb~4qO]nS[<6I>^br(Y,/@c}cΩAκvoTZi~kDZDzs&6V{1Q*˙L*&-+l-Uo.QoRMnܣ+\,6umc&竳'jj^EZk35Z)͝78og9#8(T'"ܯS51j@sspZ߰fb 77GEؒYʦ\ef_<_/}pkhYSgcoau,8ܤbrY]];%Q0\XsYm]6rAJLlhsXþi:1ߠ; 7\߹0~85^*6pK`Y8~o|")7YYܞWl@-'7sۑ;k磲\N7{aI5p5FSnl9kca_Sux1eb67Qq{Fo<-o5ao}s;wP.:9m[ϝϛԞ:n06SίcNWŪLkbcms6:cVʧjRz`j(S1iEi5N7r9_cqؘiͥu*T̫fž"Xj4-@:g61xdךXiyU2uqU妪Ɋ6K5|1 e<5F5V!qojb|)Mj+ N=\Uha*1i_Mc#V{\kߵ;yYl40fž!Xxm:1):5|\NjcƯcN3e m,V'__hoͶ4ה4۬!fJk{mO<91g8/ҤXRANj|]RT]fͩ=qmR5^zQ-uSZ\ULZxA[kJ1gwj|ƏX*ʧbJ)|qLŊXjceͫ:Wb_eTnI,US[hzeq{[k\ 7wmysb1jT|IDATL9qh,uS[h~c]LXŜ}zs6ƔǘsyqONY.jR LYbM\Su1X.nRbWSSu|Y s/c*V6z\@obs[Ǹ0W6bRas*qGQYNWZ;싰^P}^cy[Mhs9y*S/+YY_PmKZV88L|Cjڏ}Ms1oX.qscU*TUMXWbjʥ~uܗr);_YΤT,OulL=Ib]\WiZ4MXjb4?xns11q)e5eFUiIӗmeq8ƹb,`u$IR1)xx̧jlǪMQ9_Ӛ<#㘊X_6zsyjݭ~jyRM_.Gx7F9e~QT7 ol&|&>\FJcqS5R>.礅tes\\T̯sc*Gx7ZFuMM1xj&qD/{嬗-ejnR8WMjʞ~69H RM`R:S5e^M0G;G/ߋܺLںu yjr\5Sr\TE4QU{s\^&Uԭ62FJ 1rs/ƛ4$4XMkk@s󨬮j]I}F8uLoʚزX\\p5j1R:f61\uu뺶XT鵾ڋTM*Us6ZURT,5M^5]Wt}c5}~X:%4]W[_@m֙XtkR:Vf]YF5{b,t,5q-cR>ޭ~X݄ΗX\jb,tJ=M6i3ִ^IzUM迪eT.KIՍIx{d۴5b9ee9nQi++ETLjt_-ŝZMۯxnNM&&_:͞-eS+uu+۟Ry|\..f7{bnCsVƯ|Ynƫ^ꞫnԬ8ZFԭ[WG/eo_ keomZӯNiZ_W/e@ ssu#0$ @Ə&PV)?]'KP:H5zڋk#14 O>axnv 44ؑ#IKKkP•_7n$$$ jҲ;HuR[k-xͅ#‘*N7-#ee?zIt^2;@%&6nL&MRv?@F["Ԕ]Tg\?Q_j'`& AUn:99A~ 3~eOY&< K%9[HA Fo;v !!&AGӢN[_5IK$z8G z0`p$>V_#UNȯ&yEF$y%1xZ$ n~)XNWaS;3r 1!Ȓwho=()UA)I;)#[|8'жF$I U8r6\혳:BҞKdhFņa}"K˻ې$$CJ5C X:XlLޠI u5Hxy{c}TZEU'Q˧SّƘ1[{皑pr#CC)yzedsM @c6z<;dnb BelCXR*/v 5O%vB[?ףQ _5BoSVRDip() I`//Us($J1 ?AʎLʚ۽BHST (9_ G/)v" Y:lZÏ?blٮm63v1rD4W[.:zk Rkm*ֵ?vBmpE;S__6k?5ӃkVW- I2h[oШV]hn-75 5<ڼQk>r[4pup+Y].fC 0W>y]Wm5^X J\ՍqBstWwH h\і+mh8YZAi-@ rtk5ݚr3]GFeg5r- tk5}cGNfWD$Z `W~\U+W!Y, ;RYlf"q4/ ͆R2ŭڮ(;deequ7 Y)BZj_-]ʾw '67oaBLndeeDqq1}9W]u%q8h /2?]ˌ3?+V?<.;c"}%QsX 6črNʕ+ ѣ_oRYY ޽{?0x`\Oqqi)!erթX]P R"h>č%eG*FŶEPmH qq$II׏#F0bf̘$HĨXd4WkevtSl^+lZ6ΡPˎr-;jF{!֯d3 9AjjGlNfw^us}qQ;Fc3p, }Tv&*̘$z2`f̞̉}>b|;'Sw]i#O G<#.&}^'9ے7V%n;&$ VFUoA#PcWH2>Q#_b)aؔ D`EAe>LiY 9v'NDQ>l>͡&!I6JzS󶵄7eO{H㨷ݚ>2 N[aۘu "L1ѣHIA>QFVwT9;wδ%@C^ֈ[#@Э tk5n[dotuw8-y$p+7v$+n}kASGIz +<*8[e=qx( Q`3| q}-GvieVq3Q(N@9'y\8(@NΧO7 \׆X:pa%}ęNw|`!Ai ݚNn)?~]zLjڝ ~᱆A2SCy?o^Tc3Ely:.oֆ;̏K&{Twm [3<Ƿ9bؠmw"DvK8&C66ac<7;͝*]ET韌TIa/QtlБ]ЦڝC7- xߟbXXCU1WH|_Il5G~\:b˶fjJ ůn'H52Q'}΋|MG9Xel)hn=,/~=z4$|xan_|K%1qxO(*Tlg cta%e_\fMψ̹\{;&壪Pk-ՓHG+z1&Óq1:7RJ[1䜙 9 ܢ@/ϣb~s-[P++G1GhR_`#wAg8Sj?wBO`պ-x`l " `-B"P)ɦeIsrRr|[c$#!syy[tdP`s(RCT(<}5`4~uK).,GA4B,F‡Ab_"3Ǔ0pfF"p,cL*&DMJO$0[s(s yGΗ),5ث_i'w9lu /b÷2Sߙu=./ai2f'.hJ'wCفb$!.2ꎇc ׏5zPFUUZwלE)?pB~FYNt#!C pBtnu( [f ڀN ܹl>XRj/N0݌EDw޻6axU`zg=Nj*X sxiC$C䆡a91@ S<@N݌NsMrAi; @Э tk5]9‘#GfEtmЖSOEM/,4ESPuu5FkE|w$F7 ^&wPAx'0.~'^_a769]Z7լYJ>r=(=`oLb֍Uncnٟk>H~tw(D_8_VTZrxNapAd-8Kocf?d9SPi"ϮP eӧdε🭹4˂o9L9޸5XLzm.[&޺Zf^xS],agxj|^ML~h-%(d~|3YFΑOrL|sx޳n@ỉJbpWΘypsOV=WeJ 9o$W~?>棕?|q ÈQLLwI>Hr@-"# C j2 _bk%/.Js{xtB]~9%g(+-e<(ҋ!m:*냸, 6!rQ?<,mWǮ09~c/(*TOU3~ 7'Ó˙̺Jji3(ױ`,:Ho Va>[gCHU;obNd~ITÄsMo4Męc_gnW]}5\{JKHNNʫjeȄ^p cd1gKfֿA>2dK}9g0;Wi{9E 9yT/Yq섅ʒ2{Wr#` {A.~ԯ, L-$@"lx$Zr_6?֍I&-`k!e:Ie_֤$&%Չ̘1 >]roʻƑB&]BBw|c&e T{epΌAcK1YHLٌ;=B ,R5rӬZM񉝬z~^` 1Ә{^:jPˏ?K91~6C,Ȗs0F'+IQ^`<_hII;wh&.P|-R5x̞͸8oc?r p%җpDf-NMy篎9pR .9̍)993iO'Ēwqֈ:K9xj(ή`Zm[ףTȆp-AUU>sTUꫯn/bG *]Ad, TŎB}UEQh͒c*fz?b,N^  I\s,$٢lQ$6I"IȒJ2nj=[S@p!@Э tk5npAF8[#@Э tkpnʷ~(\~匏oA>f͚֭[INNfΜ9|h@pB^yV^ͪիyWXp!999/x5BK8@JJ eee\}5XV, W]u> E|o"1l.4*v{SNrּu&2:aW<@9ɦq=PZ ¯x??\EUA&|üs8/, FVr:|n\^^Ν;QUoAܹ3g6pP)+9wq c H7y*+| W48Tqˇב<9?TvΩ|h1{={>/;εgݿֲ f,g.}Tϕ#g>R 7= ?ױ?NȫX̭ rev2̞MJJ olPoyWY\cdQN/穇ǽMb_,Olx{ڗp?d8`'{|p Bb]> iSyuw;۟5K;|H[-'[ Zÿ[tὓqcyfv}((,$7/RPXC`ͮ_ 46 \<(pGe$Kn0<>">sczWlXÄgd{!_*Z7/'2c&2/I#! fH]TPVV@XXVUUyPU[oY -А(pGG!FpzضנBBVR{9ylzKIDATf>I6[%lj/Pٍ$#[ ?I^vV|[Ojj*= v1c0z6!L&8,62HAL\a]@~^s~W.Օ2ғCCYՠR [Imt 'n=22x`ƏyE{H'>kG3)anm '̵<[Ku[r־]o%Sxt) .NgڍɈ[}L~c&\E)ddE߷GIN:̎C*?j¤NyW%1)BUiZ#Uol9&  ~T!+Ӽ8@ #>L~>3ز$T?~qNӦ$eRb{/<܇ tن[;ſ62.|2l0cu8_V W(.@TZzj=%VDrnCUu-N???dYFUU6n܈L4 Y a.@7<M^$dIq5ʊJAZYARMEw$)9JEꅧGWVmCk?.{y>H;-If4w333˯P~ݠI$OzgQ)K GXX_p.BUʱy-{P)QQ^6X@zpޔߎcBt]B˛cg0*#՜FZODFFMLt4j"_wjE^YLV.NxFUuz'0Jk֔bρ|_Au^Fz++Z[zǎoi:0ܠ5Eģ -`h0z{95r +Y מٵ({Md3ᆪ9:? C;\Zp4$フNfgFVTZ0QLL'5+> 8h}' 7_6lcwF_ggmdlJ0+@ԡM nN֯ZE'|ͧ_iF_~ KD+(,'::__c5P39x >(!!jCUUjܪdCZSk>&R]{]h3[mMܾѶQg@kyp:w(K@x睄WwK:Y4L5aY* GA׾ЂAc0p06G tk5npAF8[#@Э tk5D9 7N~%"@G9Z7@q;IeƭG-Haن/LI=s&ctleM\G%&Xq$'o#yr>||.^榻˞65S&͎KŸi޼y8VN{pl7]GnBL{"{7R{=3W?;?KÑys. `=slAI⽗Oa"xa~K&`ړ|XL?|wCg8]KkݣX«~ʆxe_ᶄ0d\>}w|Ċ졣?2׷NJdq^B7ǭȑ#<y~cKH㙞cSuD߿#nݣh9E9>ƺs&'n}|SC{e |bվ!k=1< '(yy/هҤW5."i\Y]v1ъaxf~7Mn-v AJK|e.n=d$̛7 oCZu&n^̟4&oXg9*q)L닗d!$~3c]rI|A"x\$qޤ8"Fs!w"b 9qw>::>hnl=b6=q co6eJÉ=4yɼr ި)Օ( 如v~BMK(SCnj2 o@GHpMF@-X bAAQTp2EJGIJ-r\RX;00r۷eZoÅy{O"($Q? bom<8ʹ)+v[s`g]ͭ8]~cqd kԔl H}dU6/w TU"tl7W(\``ĕ-ac;v<Ӯm2yv<%xGGd$^sK ׿<s.`䋸) =&.93TYbϒwMdYwpe֟"N|,| 2}f:g^BU,*<_ x9G+ uM\Ս+ml5N$ז-TX׮[]dhFUj-QWGӕMwD h z=+ڹf*3MKq3;t[MԖlǜ f8ӌfV`soquNNN5#~FSęs4华w#X vٴ26ҦpzW?WG3LP/^yM?@fRGpoDs@faPR[ y mIja15R"֋Qަ-|ih"5&~t6`rm:V6K5eAbV6K5S׋(vf0kđݔ:6j>A4k4kyjSv4Qp(X\ň%Z*⚈^3QԚc7k폙6 kyr*c;3Aj"Ŭ^<; h8 Gb36EV6Z^øOr#\ R\Y^+8΄HFFq7U6Kyr##c[3QƑ@s&~ԘwͣIAb&J(r]k7CˮPi(:}03Aԕk3z>4u| S/rcjͮXnM ʈ8ٌyc{GYp&BcQfQ6Q!Y{Gwdk*5ښڦ}0Bn*mʦfJKd\Y)qbsT7F56WNi1 5yGF~"8GnMެ 6Tꪞ H$D"H$D"H.}T1J`" cT -OR9)(AT,%sI,Ⱦ+tD܁ԵMi )n;IR\mg_JSPH*?v쯎?-JKpS>I×`g}bAݛ_&T+ ۢn)BfƟ__l沈 RAYe+zzbYR9)ܰyXR\aYf3([ lJfy18o?V6GXVmDYfj 7ԑvDg%ls^fʛ}b_bm^)x6ʢżX6fQTDenŲUތOU}+gz#oF_J|_ܠ[ӌ͒@$ַU@IIIU 6#xSPаyyyS>|5 heXת, '''1Iիm%(GKjZӧOwϞ+q YVg 3ʖbbа5TH I #Ξ;?c6G)a\8ݘ˾į3//>**SE"zd$μ&CaMay%u0@b{j6@ReIeBUń1/ug91*OvRo Gq!flݯ|v"49z ).JԀY3ƍ!~ Qfዩ9 Ѿ _Q";T jӥi,~L](zoefX,x#58yr4Q.XVԏ^@f@[GVvH?j&5c%+x[RDb̈Nq<H$~0kj3+6 ;6`vcG>vw*h'gIIP(Ш/Y_wd.>(2X :g7?cq`֍~|O,{%8` Jg<{\&FqL|K&kkhZU?ERc5BKao1 L .'T3b9 J0q`MlSb(έx[s1EFo+>Gѫqu߇z p٤&'ߐ{x8uohljuk9›;pٶ/n3գ FdVROdq^I| q#%. Dы22!,L$8jΑq%|)F?9_\U]9Ͻx/Qkř-7w ږ0EGϗ){Ǽm91&Ĵkr_C~zo?Q&.\Ì=9j_qt1FL(WqA&~7.B y9 ~m0΍uV#P*DԭOxV:9N-@ׄzՄR]z:DXT44sHMZȆ8(-P/X8FfGsqר]p}X\Q7?˼t̫<{<[%YG?`$ ݟqPꍩgnbɵlv 8ӿfg?׵+~ŏu&iác ?͗?ݔJ`؝rvP;8:rcRa䔳xwSd }2vpSBXhţڍE}4Լv07ɕ7jKe}b}gS) *997ki}3ݛ[|Y ]qh. p:u5 GsEh.šk:::ǩ`j_LK>-p(]=wk 8q ]Em#tf-37u AQQP(VuqJ)P JM}UQ"n;z`w@IY`G[vh"%PjZ+KVbB/*,Ąq4hT1RӴV5\n&ӺKs|-T (RΓr4[ש@@82_7Jl @U֪uXBYYrS(].\R8F%ÖJBYhdTmEv,2$U* I&ln.7w .ue۷dzgDR"62bĈ|ѷlْw9tx|[ɸȗ0l/O}׭eH {|R"hbsR7p˖1T=&MO ܝJy-:c뙻WJ%'R#䇼ҲTiO(DGGӱcG8Sܩɓlݺ:;Xszgh<6?kaq-|C~< aC )Oi$NdhB/nI/\9q>o=휿Yw=>`=ѽ;FĶ9y+}{BCo5;9ȝ"oޏ_eϬ;&2PNy;]'n Sڻ)ҽ{O sp/%'h@Q" t2m4ڵmˆ ٫ӧOuDDD0iҤW?ٰ'؃Vskh͇[x(\gsehߟ {ᙏ7zpNtonZf,gD Y2;XARZf%dե3bBV9}]6+ 3ְ a(zSw|9EcCrt&&c#3&.C7$M}5ǜE*G-9s5j.3fdĉYz5iii]}YgGvQo>iGx#F*JxhY|Av#@#z |zڊ/u"yՠ` korܷy(νvd +.zͼ$_$kEfl-]7J?qT@.+`̘16fyodlY͎}? _{-Ceꭤ :Sku~Mw:z5$$e|{"::3GGFהЬoΝȍU(T\dǍ 1b8{WR/nJ.kʦ9}ܽS.iw` AhIWRGUR@RR} ) KKc=H >Ϳ_ƴ2v\=]O~$;C_b_~1z=vەov3uFz;[ЧJþc1}z1EWSfl~Ey|::ӱ@y=׏N>#oN͛*lW;h^.6c^`64*O%]<*67jҕn<Ω~u\.ݳ?r[/ q:YNQqQ؟tB}f^NQPUcĴ2\3 V3 ggla|J0#GS΢9`W=a^ EU @t` B+ q(ŠsE&-x!1K/&TIY!@R TidH42$U* IFJ#@R TidH42$:9 788CǶ[f/GrVn60bL =s؏HUfvacz]rKBrL1ܶzKLXb.|_(:3y`FBM5)lOZqqdÌ bȬ;nRCmY3RdRM`uSff&ˮ]OZ.zCbb"gyG|4$;zOU; S6y>nx}k(#;l%;SϠֻᓦq5-^4z+2z&q8{{ u׆)h'a˳YΈ8n<151E>=DӽqIrs׳a?ErՀ LJ3&w&#wiO0Iڑ<0!|f٪?>=n9Pprt̜O;ݢ' _ q7Rcj8ɵJKՁ9U_"¬1X>_ qg@vQ7IaR#/jΰDqءyP©KA x#~oF,DIƀ*а99*IQrsr 9[d Q¿IlZvvԷ6^=2Hr$-\fVT В3U+0Ssx$x<¼9֮_7&*<3F"1BCC~Q6[˟ՑT~_~[n=ⶓ/vv,Ⱦ+tDȁԵMy}b)pK'-OR9)Sћ A$G݊ 0Fw*TD"H$D"H$ ?$.tIENDB`kraft-1.2.2/manual/images/en/create_new_doc.png000066400000000000000000001662211467704360200214370ustar00rootroot00000000000000PNG  IHDR.X pHYs+ IDATx^wxn $z[v՟T,r^^{`"";w0@)@ݝ&'3[ |?3y;egRΛـB!B!B!B!B!B!B!B!B!B!B!B!B!B! = o!BËDt9B!" d#!Bq Ha !BCߺ nW!B6<&B!X8cm }^گB!84b`7z j?B!@j?PWqWB!~j:ڮB!P]Fum7{5VۉxLB!b81j;P0cHSӎG!"Vj@OT8XoO!BTN꡶}Y'& 2:ۺ: !B =\mX#Qu+NAr6_q[/SMP}v !B=T^>SS zW$Gh}x1'NyN1%TB!Vz~>Hc%uͯ=Pv:zLosLmp{b=!BXݶczۉS 'uͯ9v_cNhDiB!NH=?ڶ='\cTw~pj~m;/ڶ]~7]O!pSub:='ڶm;ΏځFH=?ڶO gԧB!۠\mp)>=/Tm;H#ͫ,Ghrb~glǣmm>Tn!BQeѮGV e]ppɏ&7*=ȍf:Nlĭ-* !BdU,[׭-nvn9nvn9NN1'AtQlێ4**n:o:tz<\[q !Bmõ{<sZϭ_-;N뺵C47ҼT9mW6ϩЗT)itRzIrB!~ +VyoZ'Ժ:\}٩&yQ΁o$ێ$*z.:|sۅۦ:w{B !BB N1p.bvz}9n1)O_vj$/U7mV6ϩ0s tާS)8NHTf!B u = ղvJ$yzM"RHITs9PO_/E2ӗbF,!Bq b0춍ĝC报"i;<&Hr"VHYpN}i/+nzގFUB!8TeЬ6_+6=vz̩$V97Eɲ4wZ/\0=)}[k}B!gn}nqp;}R6w9m˲Z\ &V9C>H׋))-s=G9m[_vjWV#BQӄG:ҷn 4Ӌ}=`ab8U}N@0f߿>$Dz#n{v-Y(n/۹D[G!`̀;uqmHnNsEߟsjX\Cm/T4wmEJ>5d>Wp*'T_Tb= P}P0З^$CUq=4ce}/+z,\[_!pnk^1ߩ~ޯ)N8Z۲PnDۯ#W/D߆Ss1>vn}B!"2 ڭǡbN1w])\=8SmYUݟ*Vz^/쓊A)nzc/VT<]e/m'@>]4B!5A4P O Sq=Oq}b*מb-GmmlgQԺjsb~p{qrێ[\qe}}sZc\hKwpiCŢާsۺ !B Wm=ղۤK,\:1}Y1}ى[[+ѹŅB!D9@]9bֶ!N1uD ck*NL[S~T-+ԼpzQ]=&ũ8tY/(3115_T'ixO;2Jb+Bg!$wY>Ͽzw_}/m+fѢ UԠsjq}8;Ţ[^@tE.Sn:YW,#t]!B!ۛl7/-7_9,/o[ 5OcQ:>XTb!{Ѡ8p+i>x$E |%{u޸n`ƅB!8 %/wgĤ^'.;s kU;NV9؃tD8'ޯN9I/ZL[:iNZbB!BuzJI=[GWMq}Y >pqzvN}bzWs,O]}hQy&^[Q=jL*“T0-E^v&)lBBbB!`,$'Ap6fo%SqϢhC֯RRw*Bt*nϳ1N=檤x-:;V{S  H"B!ê<(~۲eSWXն}z]jNC5p+D/עUZX'SEPv/8Ii}B!Xcg  tN1pWXqbPd'^o ?-nlZX@R%{M6C3OIAZn/ !K !B!La!aSwD*3wm~H.\Bыն1=_s&~uA#u:P4(j@~}ZlEV]^ +>0W\vyɧ_~e !BCH3.(QϸC4sm)*Oϱo׾ޮ6pQU{[-ۋ{,eSAg_`z0Kڻ-J"16.")1 #&J())ƌc>[.']tW^zib|/B^xU$$3ϐ;n[1 !]űtJ .;P\R.7wA EӃB>v*JB&7&FO z[-1{>^xJ'wMR\Ԏ{KQ8AJb'㷊 {]I4طZmSM $FLJ~QE<+.@qx<\pp4Ƞ7ҫou=N98&Nr}_]ttґ'G@ CʐAQElm7\|ŒYs0hۺ%>Sxt=, mۙ2}&_?b=VNm:uhǬ97x?OzzڷmCCQYty|4H[4 x. a/Wf];xCٳgǰ`tY}0*zLq+fb@.nv='>9T\'0>= jY!~ivSy+};a&/4ð2%+-ay9XB(a0l 5m›}ĊIJJSvl߹KOfMsgvWxUMM^TђHzuYb%>˂ 99 2ٰ1G}7?DDڶm5W\Jy䩑CұG]Zŕ}eMxd=7+U4i܈Uk֖]MpgK"jpw+JܵpԳ{W~A| Fe,]Ͽ̰!/=weؐA5%WhkRB`Qc]]i&ާxLEOV$UmųgȦ7'u7uhA߱ւ4HkSZEr1Ry~:K.,W|շ|7r_Eݹغm;eQg;v²,2e̛2,n{(۶kIw?dQ,I n5ho|27H{q xؕ>I:ukڹ#%|7v<ߍ80ܳ8HNIaOAo1s,DO=cգ;s `Yeӧp_p.ujv^y-jCC;())q ^}ao!&LIJ,:%˖?9#Ҿ]{9 [o`ҕ֙7apѪY j-7boa,>?ztK/ݏ>*eY~ Xh17=1Gӱ,=;ٱs'~3f-?N9 9ؙKBB _wSYANy/ޠ>O><Ǝs"V-͜͸ khڸ1[ذ1xǨcvz54n]9,X︙-[ҥsG:whϞB>~u{4W_q)^=ek 3{2; |~?7 ?N:d x󽏘=ow%v x<&zo$a:";srw+n '?wEEmǞPhT%ﺃϿ̢K+ ^DZ>p`ju ;IRŅӲs)T*^L\>J2qиtZg閃Q/ CﺃڵSl+&ӯϿ/,s}{`doV.n0=+/'F<ώ]9NI?~SӯWO}]r}%7?o˒+IJL'a1G?ymP@wƿ6qmwӠ^M0g ɊUTrs9S񺫙w}XV?0 ko Mjj}-^ʴѭ ^u<,.;oc#ObYڵiͲ+9ڴ/a&:wϿ.?s8GCO`OY4MR~,oE%yq[cˢK4a"L%lY9d.YJ]2u:ݺvkgGz:wл1ѧXa#z^^aŪ4nԐ[hצqqyL4ˊ&ѢYSn~ꦥ2jtԁLJ۷s q핗3ϑZy^{9}&{{AɣO=˪5kٽsctڴjIjڼ7C3VG(_(7O '7e+V?3Nkg_RVemnjnm q,[Fs]3WXxiݺp]3rh\U/}oe,ZF=10bp_~f:Ǯ(QsO"ޯ/SڎcAT~tveU |=8f%J}K"NRٱs.'..~[ػw/b]1u~YK(,K)))!nVZCFz:o@ X4hHo(**bӖ̘5#+ٹ+ i0MWe]7mPn/g.?ҹc{h߶5Jذ/_۴!11۲VZ?M`O!%%%Ui1UwS,˵h1M,n\RS,N>~ ƊU|,X 39c8c4eKRTT ίWlݶ560}6m3c5i ~}͜; Xj5~ 3ٻw/M5*=V_o,qMKV8qqqlڼB 5+(H18,b<ҫ ztRף[}Ͻ* -)oe30ϓUcXl1Ӳ9Xqq{Qۉ ާ6 j/N⎅go 6&c^jka8k, "Wf))a&qqq|7| Dm^ПgW֦ӼY{-x  !>d:kEMX4HgϿ:~6_0g2Qf<}{$z+hWNNb׃a4WcqU_R#%9sG2iݢԓWnh֔2]1'xq xc0 M[Q\8훦Y._&nwѰyw17`݆e۰,mI_zurQܕS|x_7FۿQ8}%kNxK1'0}rrxd=,[5֗;7Y-~}zؿF84Xew+[bV.;mSߎ'?YP[ў| Vws"V$xCz Ni=w[-H EU'}_ϝ*T͝HLH!oͶXc&oÓRD\"Db(K4}49oօ{_!v ._K3Q7-.N9^}ja`@ `>O!p[տrr4^ `Y8(}&G#'''&M3rB>'/~GU|Ϟ=x͕ѯ 2w>fϝO=i(s0 vŞB{i /=4y8,Dz8xh(o}1N@ л(wVq7O5 vޠ~F ْ|`n^> J;Ϗ)iiڀq˪5k2\VZY_+%kfVY_ϰ{3dۏ#S#˧i&[Fy@K='ˇKJ$ 3).)ѻ"{4r+eGyH$V鲽HQ11[NsEoR7OGD*ϝ&{*Z1b˘Z)INOR\ChL\Q3ފ5)Z։P VV[n_jSD{k{Dzt}wΨ11oA& -_kr3f,օdԮMN23̣yӦpܱàE$$ēOJr--_'A}u\MK%uR IDAT-50شy ׬+/%1)eQ^=ǁszilʎd:eɅ@_'?N9,<^/۷0 m8X5w>=wC, K/7/}+/m[W8xjJbYL2ӣ[Am@קQXr5Sg&si&x\=u^LOL)'Wv>e4$%9mw`:/~>lњ>k-5ԓxhӪ% zݻ h٢9^O.Zuٴi3nA*ZM[w SN8.~?MK-ɚB 3cOǤhXv]ȢEYbe?K_;6vh[#,}QW1O>W9wPDz%V"}zIsZ1uAE01"/ NxOɶD~[Os S>-[u /~ can2_y8~}YBrףk)㑧FpUkaCß|> xx9lޒ7^n=Sgf!~n7^{o4ٶ}cxmƎ;ocwA? ؏ڂEyݏhؐ"fΞǪ5oYX3O;9%{+%%%dm&?5gKWϿbؐ MA3|rشy &N8L2UOẫɵW^^z[y|oKxIKK%{6~Eڴi3gޠ>CDil߱Gxg-W~4V-[wܼ|zn'G> ~<壷^ezJLYs/ʨOpY3s<=%5Yya;wp=)BT(XPwuf.ᩑ/D{7~Ea-ZsZV}i^L_D('mj~D$mUuS*+S<MO}4$B!Ur Vaz3!8v cZҹ!|}Wc~N} =τB!a!EF5aU3W- !Bq(0)`~c_EoEw[> {䄢t1ܾ>թB!VBTsEoG¾jQ݅K$^~"Eq/;mK!BHˊSN:s j-\9MP}B!BTxWqxWca\}9v8P:9PI1(1!B!j:p]qN߆>`f)D;] :B!PƮ3=fg9jV'Lz,\-B!8XIQˑ]8x=#l}.B!PcZ} ϣ9Vmb]DrN9zLo+.Le~B!BT9qݖs}Nmp"ɉXM'5 ղvB!Beo>eծV _.B!bP}v*\8.m 7Uߍ!qf[!5X6)8m)vx@ Dr#m tc"=}͚7čcj-!cQh 'G  ߾WTLZFs::NGJ""Q"[1sL]аY; Gu&=A_#b-_ڂtݎ.K_|>y;ȇg !`s^e;(:9Q$7bQ _PqZQ|x[-yl\w{-!33/>Kxg znKJ*`ګ\:֦/k<3 ~^=!xLGS/aCd% i$r|dhB !fǰm$CZu. B/~哷b.?_Fdӂzs{]`>Sod8=p,iwV,]+Wפ!^[7k?|3Y+HIzռUȆ?7/_+0W 0aN}'qGxH~CxxvD\4/~ʒͻ񤶠qq^z'OG/2o~I[Kʎo?yR~-VCl^\=_O O_JDvf"OYludҸx4f4L*b]oGS|o3׼=Dz40r;||_ٹ7k Őkd8x/̆i|9;K52:RÖdnޱe7)-Yߩl-V{~ٷh1;bX]vlwLo?;i!BdzoHC:Hr+ h9Hũ/Ez;,?cy壳{Kw_gO>HɧK:E2_W'yۜ3s&.dyYd[>;61ke VSKT`w4{6]hgGfܺB,o=t*đt2b1|8j9[݅[Oo-,x|eؼd1frK>8'me_YFAKF39g-Yطq,'G^QDۏ-~"eul6>Û״G}U_fP@N9- Wlؓo}̅'I׋eX`9V*G\u+`tΨp+ v;7Z{SIYm?1ɯX'1yr771,ܾ/MoAۼ>i3\rt30R7p~wKjE+t@?kBDkW<ҟd0:si̜IY`q*f`8R}& zΙ-Ɔs$Nm<!*c`/v=_Bp5ps0c*߇o;ǚ__q;,e!בÍ]jl)WY=?DN~& 9Ś3WvliKr,݋&{سok:K\W?kK,/0{^Uppi'CbO2ڣ8c3>v_iG8%RV E%^Jр3>. aqE'?g")G f/߉^{#)fUrZ-H=O[˾@-5Q$+ylR+~WmvWn[-pA;9ݶA߾grg|8\+6ǜ9=0 !e<DnȳGY;R"?k?s|.ׇpDjU'a;c0qu6[6gs|f;%&kЯ}?~Kfa;r󣹱K&k\_f˶ؚf <[{s'xބBacߖz( jPp ubtN[S\os,,A[i<"{u<}&z*~Ι~ ƕ]],+@ԛ?3uo2wXČ [6, Wdn4]Ȣ]~,#^}5*MRRjaPU5sF?qP#/8V?ú\ \ļ%,-N3DHUo!f~xD^Opھ=M<hgbķC85%RsXPX`.d9*)Ck:gѹCOs-O۹LuL9|r,0SpYyÌ`޶\N[͎C~`3m̝eamSLIe>r`VlssXp ~ 현 ^fM),ۢѬ laWs? vnlv,beV4huxx ?Pu Hʼnw0OyG[~ 6Nn lޭrj;-[s())&͂ae4iZlx&w H(?Aw$ o^{@iToa]O\4w?o~_ʎܵpf:c\S؄BQӯʎ НZ8$tSq_]P=c tbr'GrMu`PH=Rm9\&֞v{Q>O~ʾ$:^ ?Kȝ)_&Aeo 32~2Iٛ^ alXt}S`{6[6Q'رmC ?!^M%΀}SA!^] 0iJd2^ɤxjFT`+Rz@9~ζaTwUb!mg.O,-V%)ߎL&|*cϮS4Nzh .B6Um=T-\m'8t!P}HuFE˔Ҷ['j֞|5n%>sP:o+9hBtI4 Gil{^Lf˨O-+`S_ĵsz`ѾgWj9LZ|<~<% ot0?+'OfCIԪU+ŮݶZ.~b Sw:ęolPWnφ"-@ 7 9%zbvn2 O -ޥ&P^`*ٕ͎uQ*T_Ծ&P99eūYZZ;UNj؃sz!'a~vgewj0!j|t0TdF[ǘIݲsi/F=,x.d_YTKֲ:agNMƬ݋~L_D#3GHl3vs-PFrOv'ڳYc%ffT~c1D_z1Ӏ\̙&>/,>XJePǹ΃7oɛ;, <`V7f:oOsY%|/h2J63źum6> }wg\vJ7sN=@4nBVN|)Gx{QO}O-h(:fM仟GЫV?aejz'yW-jyO/W"4Pa:q~%iwvz+=D2_y ϣill's|>x-՛|ߩM$Se.GFMIB!}Ʋnq]yvj *`.JeNDV ;cߜ H-]Ŋ8?YbݖeP`fЫWS<<Ȇfw戾i|e> szԊ'C-², o=\(؇5Lſ] E qOasxm~M禕ea4syﱌ̱. IDATfJ 7Va4Ի2|ϳS/ZA4}bxZpǥ[Z}f6}·<9`({ީxR&| e Xܕ+.?H*o!#/p^,ǍA*X^HEA$T8&i}na[ùMOxag]?%6{QcZqM˞aIeM=3lXFmzsާHڤN3vN?Z5H&OJFG^r|Z%epo2 8]#jǛdOKV\|Cnz/`'ӠMqCp.lSpFxہF^ LЦ)\} x?è{ noߝ^0U / :~-1KmNqM_JO3_u^굤iFq]g玄BQ&my5Z/)- Rm}RbӶwik{Kj&oqZ,xz= 'B|-<0߀()J'նT[MҸ[ֶJcstR˖ˤziX1JHD#`팲 vbc0 ݄sx #]0L_q_P8oR 3 gTx1ѽvk:jH?p7 {BahÇZdb[B0]u xTO:4G/9_͗Lc"ߑB!D,r̫ȁVS %b! $Ӿat:IZ&Bʊ/TY(5p光ն6f㓸yP.&su[s ĥPY'| ^>N!" j;P*\ IkM9p DB!5wXtZᢨ- !jD0!ƲE_EQR!BQa3N>\ !BQݘp,\|e)o+B!+}{؎{%=,/B!8,DZE!BqE!BQI"B!pB!BxR!B!j<)\B!5.B!BO !B!D'B!ƓE!BQI"B!p99\RJ,f-x.~>(\E?@L]umWt?)}f߁iC\tlp- 7  ײo\pa`0wrq9x YEœyx{UeOÓ.}+Z!iPv41dD\m}GQ4J/A) K ^),"*EE HH"+ =THqwɵ (,7^ˬ ߲U2"ueI/d:ѻ Lgq2Ρ%7t/PK=ԗFt|˵`:;cI1 i.}|8 `ȀV< )Ux/"!ӗF}xJ\Ys]1EtK`D'i*ng v2t:U]4MFuX]Hh6~/R)ٗ[槯|ӭ/h)sd&ɩ$#^Т z7( M8NAyz|Q\gX, n؇o)4άsWB`f6Upik.˿q U!q;<7f|OrD>>< g#}BtX]?qŲ8GP8H:Dlгyh>% S|*oqi׏7_nwcv?{jX{L!`P[7gwTembgz& BiU>Nͮ}ێ<1*ۧgg |%R~eSXyi;A7r O2pR.0fNn^ "[~+gZEson⽮)>n6*[˴+v%15Y"ŨѾ l>6#>ӝ M1/1e^fO>(= aYLP|:{c:L!9Zľ1YZ7,`8LU+4m:t dH )`M98椩q w؅dâ}M4d+pAY[,(OcP'~I#k}KÒG=vϥ`N %֐>|l 'uA_:{n: 0vL>g|?mcu# ?6癰t|.U)mUXh1_2Dv?fݏؚ'3K( ֮)=pnXoα`(veƊ_< x-][w"3#oĪJ0TqHmp=87BYSӸv?Z˂K칥ʼnwIޙu4>(:Hy ?g~D 3j`$%3vbLAyۆ{%z|ܛOҤYS^܂Rg 9lٚMuU[/LX̺u y|3*/ͯrJw`<g秕i;5y[,?]f ?Mo{s *sMc5, NuS-x~8Үy BT+X+&ǵuwPT-:|ä:KkYy=Ob7~Έ9^3sfQE'eD~O[Yo>aoN31Jt5k|&&]/S: F-`ͪy_}v(y*a'~Xp`Y KaB_9Ley|:}BpJ1*_9ܒO/gݲ 7.ïwqӤXW :~ҵY1'AG0urٷ'/4]0y1nj栵Sz }a/~#/^.sxl'+5}f=Ey} ֭]ΜOѬUuB%Nu.: 5|ڍa@JNh+-c\$ y}dkwk;bDs?^dWknB%"==[7|Gwu_2 =5|>ӗq"Yk053^vqNcZ4Ymkkylq.:ɻױ/%/5.;a5(;xnV+D{X">(PTUE͹γJ\ZOp#KLre: a*ҡ֋l:WN/դ4ѽ-Mo:JyxW ̷̍[ub;wi((۔窅ap:˺d ٰ5uJ;2i]];9mBP6ktU< ק~E˱qB EUQ EA UCy4~Ic[ؖQ~;Z=G wT~3ՓӅ?BѧjQ! Eɚ)txOF0O *D֤\1m.À{`%:-;GR' ׽T5j S5WUBp?ήgպ!6m\e݆38w]4\":'Q3=S\u< xC EAQo n<]/|Xn:mډ{ԋ-A^+Omoۅ|XksQ%uS(Tf Qwڕ-Jm){fX:0<: 9kr͈p9fֺcpP>vOcwuv6g8vkC 6mI]H=ioe Lv\%A>* v;ZfBOU.5K IS~9uS;k*ж{}z G "VeR$9T;I2F Y Ry/[ZfƚiXs\:=~[NP!- crIޅ(s}M#+p Gg({ C)Iu0$kJ';*L$$k$'$gKa‡`/E_ ]L HHa'9`L=f$V_<7@q\!Mmӝ_&uD%A9q^ar3ń1d\d9NLv8 BBr6EE ¼.2m~ K-Nm~#6 ҹv-N!"?dqdZqZf*WsTu''A'9u]̯'& @BUf* Ϲ*T MhprNxx 7cv9| jAlƵ]~5Mdx*!t'Q%_ 5qGKd` X́HT&}ڇL|@`Ny!($gi$%$@H! }+*wr߻p`NcPQT/?r)(t>Mm,i2RP5x &4(7A-$]r"![)YPn%.=7ڍD`HNΟ BѱhJIFTi FayU% R(3\l[ |ߟ uQc+ឳt-qTvG&N/䳱C~9C>ԛwyYq9C3:c0a# ®nb5YN[s,)+F6-w]|p 鸬;FrCp–ܸL`HP:ym/|$W|׳,}F8J'W_R_#χOL`۞>9'bIJK'=w`8 J*:_v`ey:.Oҧϟ;n(!1p3npq8s6V)P(ی>##FK0ϩ8Fuβn@Bb\ͺ?? G&ϴ?Od؈qV>ߝu%r>6E~dx-8RKݪ?n ?svD)q*_>?7IH̽EjV8q-ލ`oT@nr>PC &73uBr3OX]M0etxk|` iԇs{*iW9u!JR^H/ߤ3`4_Er\-@u&M-ʴnsڔlNΙ\#IF0%qE775n&&c(VǃQm9Zl.d.rֽ WI*qSuo׀ _21Ks.:;VX mH"5i<+w`N%Ϻ(JSs:~qGzLF6c_0td8n6·8pzLCbhbJXn9Z ;EGPvOͺe9t ªSP];IƓ] 7tqZzTvWۂW3g%4Ⱥ )$nc]i|{vʰSğ节ghJ, IDAT$;+ fN[:^ToT[fd2F4ҮC|O-.?Cb6(n(AEI#\H1"7J_64m~v%_VL]\]DqJ{"k;-'_Ke场1 O̾ 9d-fؐfս0D4 !w $Q5Lέ_ϡL|ɳĜ5߱5M)\<"MX_<Թw3*+IBO=ɪ У]SG' x~ #P":j?0csGEy7츜( #E9=FKimE &+])$/OoԬ9m^6TGi7>mѴ@Љ1C&@-֞QcZ&m". OƤoL}xux n *Jo}tp j̬^i{:G6rN*ri ~y={ҫO?>,Qխ\Mtgp;vtێ˦5G)EQHD4UllZT\LGSJY|/ jgcD7Gy⭏]ѳm<#3q} wLObjׇঋ)x&"Qu(qR+(8CrVhCiہ,7tbԀ%)~⧷݌VLZݩ4ō]CkbO1[(zϭ"/OOߒX%iw~)= tYĴ͌y{.קuNx0c^`]i٘Dq|Oz7wf4mђd~4WH;zItKZvjoJ= Aסm$NܪGyl;-jܱ9;hKZ*^cZzitm/D1 k.MZf㕮/?o34*}o?ՠA@7"ӃDGOH J%9 Nj&n]<_N';.R:<]q^^m?N;YWl 6? xgٺ4jH;tE،5-,eܨfBf閇@~rYbȍkh4zB49#6UPMò(/<4͑k~ u-t8h&&Xabsm9w[bUNaڅ0V!?]R.fH !jw۳-G4k]cܱrݿ:a6!0U;?JL9a-qak"rq|u7Vm9y{RGY.)˝,򋓎;Bͮ;nYs<)!mzwnI% ;o^73usc$# >lA=~nsL ~#NiǃyIQ@&/n[~楹u=Z盇ʚu?fix?|ktvvv`L@uuf3mLfd3[i9~v\fUyv:@5|ruPTBWkdjY^̈́Pp^kڿ}lK(<ʙtL(9Zf@(x8mynkgYW0s9)ߥQ헅PPTW k0s"e)}u6vNm +z#ovivy\꟫0N:IZX\9 -zrݿyjޝ9I4"pQ=fqg4y\pwqud6fisZO#|f(s;eS>\ zpUsF:Iʗ#fTq֗$I5ZZ3_LEi4pm;u$=TdEe߳/ A$I<ڂF'm$=CPwtzW!o]r9uDi756;9dīPZDEHC\Cğ3z2L7Mjwr :ۍ+sC,ʳ.I3.@gM9;+9է0U:ed'iY;/nrxm4*~.}|8 `ȀV<-@şaq5jӝۓ>fՅubgyz|1eq6}[NY˱Di]Bx Ob'I$IГD;ȁsh<>:q(QCsrOQޝ)5 5<)A~̻~睤Y0gU}]V0S,>»覄zqoWG,}_?BO~B߯f\fl}|83V&0~ bs^ ]x~oFH(IŧR(G8@>iCXU:t|:){'2$; eH}.?ir΅є콞m7ұa< <ۧ.IJt(F˷j3 o@.}_gbyoYtn23nLx N;-<ʼnwS^X:| |_Y+{Cg&a{҇[QK k[q7TUp;}F\[G;߲Qa k0>edoޞF$I$Iقy@$R"4D`.(5obC\I7XPP@g+饚2`-M^ ߿=aFn<ݪQKSFID٦z3I_>j5?-lB+X{z@n&p&BlSogltIݼ{ $d旞|UcY`>_V Id[ŧqm׻dwz!Js}ҙ#ΔIgsҌHH2TtEo7S e* $[VUF$I$Q$;.^at < By0$U{Q(ی>##FK0'mSB L;F\D k'vӶ`}sHܔ *—j}ަ+j+Yk!8؍q@alnH&0$(֠mlC)'HCJ xc4*7vR?e>!bZ{=,&+"L(b|ެ{f@nsS|s~@۩ѭ)EѲ&m7$I$IzDȡbZz7 3ide"!$'bЕ K#ͯ6^g}$[_]wo+ e([ē,/Џgenp+ѢqY:z%6ZɕgQ'X)ݘ?gײ*ȼl[kۘT_o5݈fKe}3-a<bHґD )N<*Ӻ{aohS?f@szbf}\Ĝ8kzDf]dzSL1#^<ӐXg2Rt:[!͚sB~O0"T=*.$IF5a6N&cD#9.@U:ܧ f=ʞ]7u/maɶ˘,iG8uo^Y$I$rZT¢cf;'0%]c執0)%i?;ӭG^4##d'd֐4kւ6q9tP)%ں_t Ji(Mvia M3aCwAtx$?п}3GEi츜j=,37]t(ap9?h#:Ύ݈nւ剷>wEO8GRT"bZ9J5oB k t5Ա9=a,t*;& }fD@0J@ASczET>|7~ƃʽ2iۆx90ƃB[>Jƴ}}$ݞSyZϛs Jv!58ebű'޲'II$I=mӺZ/ym'g6iʹOl ?0l̤QC(ƃk(BiXBU9ˬY,ciڼ!20Prµ98繹|r;5[r!ּs~@Rq]}b)2!P K9&MGI$I 㾙o ȶ|N~.lMi#Lluy=cgI`r<ۤ=5"oinf.eL*se9ݞE_ӹ~F/:q'<)UnOÃR='"P^$I$%;.(][N/դoijMIAYhwlEI^ň(b:7ѭUB1M{$=ʞ\8u^~tժr$I?#qW1g` Z s5¡nJ"fmˡ*C6XGj]*蚎Fb|7K0م{^K!)EHa<憎3A@P nOa֗ E!Ŕ²ϜҍRh`ݪa -$ ̍xcu3ȓ_]ϲ qv#,";S((߭eN#jܓ A#.= j yA?4 Bh1l>oV󰹳%PT偦Yzxv^ƌi 6LvZ$I*/'rRƼ5+(nOҼy0,hTN&cCUB?I^7CYZ&. ajky[k(֋ً˘PQE6Ip51D/SgIaOu!Mۆa O{tf~gh'Y[S `؎Pxd1 |q=[4 ög)|xO_c_!q+zxɛ53 j?.R0+O:~nQ4jޑ|swq\~} {-:z J)DVtʓh +g][Ф۬W b\ӓ(e'o2q~~dw;.o8Hڟ?+s$Ÿ15s͚PBt”Rt9Fqy]svbS; mFpg̭=FKimE/IPbŹz*w^=www(ZII$龓IzBp&q$/$I$oIzH$I$I I$I$Iz"IwtnH%M"*5@# `{EE 6(QTP"wg?v6Aߠ眜;;3+"""""""""""""""""""""""""""!\`I'O$''aDFFPDI FDDD.* ."Pɓ$OҕW:5Vjv&mV3-4iАftyrwowmӫOcپy߇&`žf[ޭ];H *.Qf%yw{שōu[qdzٞ]^|5;4z8:7Ă?خL~_OۉRvZ~ٻRgkoni1 #{a-/:)))SH"b[+VjTԊB߽}>a[VM~;2rYdlf[3ؔdwbai73V9/軃y{}uX&_pw dgn)Nl`w1pޠOzMWaU,|G>;|a7{כZR?&?lZ5_ F1d`˰QGjp1WYuҋu ҏq/|| W\sþdDXXozvKKCDDD`(\d Ӆ&$0eQOPG_dL?kFmەr%cs[&o،vO`SO8])>A͸6Ivy?]Z7qFI8֝˲ILhc'7gM^iѴ -gX /87c[,ךb;_CNhѬ9~9Ӱ363sڻB[golR9wښf-rK1,۟ x@5g+_a]?@*E s ږ/wR t&_EPR\}EQ2SRd!g-&i!\9+VdgUAt 0&2 ׳9soWhW,g7Z*SL|2FT-WYK3zҗ̝}Jϛ%}5w<כ#pO:eKH-;Bg'3g f/ ]ruR.V|IVNq]H #fwu>e9>}'gm@f,J6W6 BvU 11\SkneQF(ˉ;9orI8i{cibf06ҵWf}.rܗrey/;ٶ 0zIm-'}GMsEDDD)\)Hdx~fɲޕcCqPcO˘> ;7=U:Ј-W0* Ԡ4boaЊ Cp7_٨!(V {1ZnP, ;J jRo 00L.CK0R5 UjV$#!Ӷbrr~R=pe4B qM\s5bl#>Ls*󖹏b_G^10wܔ¢^WcD|p 9|ߖoMn?ߍyRI '<{_Cj +Rv›C*['=$omWiFhdxx&al˵]^|tjעVGޙݮ%"u˿ǒ!J$D! ɮPbdlo" ' Q>`Y]coZ"&ڕ]6M۲8v4@-2SR5#0]V}-,Y16iiiAU'\kɖ¶yl^x'UM l"8,S /f.\]Vf?ɓ'Sm&}| W&ĵ>+#X Jh 3‘'9z̛cXJuKpY=T b&于|JGLe.Lo"ef7JN GY؇`oQ2 N #/̌HLʄ oGۤd\~|)eC}wZ_.3S:q=]uaAŬKmA]^ bqCrȥG6'{v`6-.W}MWĘ+bbRb9RUKM{_B2we*|u{DZn:W_#pZZaaas8qDDDί ag׷So?\ދ{`Ty"|3y =`bnjY䉧ٍ0>̏ V: hĔ=r&yo ^92ۊ1~^Nedg'C168.R y)$Rʔ71lV2Ru),ƶùe<)?`X.w4`^o_m {eԣqzHMI!5e(Sp'%t {KTlmr~Dr3K7U L#=ɿN6M}RMc>ɺŕ zn$-5tDǵ/VC5iV# 35#l\=x+'Og}de. ZKKKCwZ6mEDDrQn{E쥕iuMPP5AȻp$դ=Hny={HIL;zԺ5^1XaJTvX92Kd}IN 0bhAsIృ~ _B{ k;ʢpGi.9agg[VV3a`g6e 71MY/۲o[xmW6w#<3mc֙#gcd,o9}.eRaa v<˶-}:>||L3׺?Hqyc[xz3. |e^(ezӽl 93eo~gۮ'q;۶ + 0믿𵴌x%)[U7`DDDfxyhaY݁[^ݶ_VE _aYε_jqs9oYU~ 3D}00{Z_ysFe01FʹEIޫ{^Y!2ȯymDa3$q<AjUc-/iҨQ ?\ àjؿ?O=4e1gZDDDe\D䢗2gKDDDu\D_A_EDDGED5XDDD;."*Υ}#""rqQp""9}:9:uPxhR1 dR޻ aWub>D+\Fp~)LkX\D.Y=T;1/*M<&[˻0Tt+cL1n-;I .""""")))))Eݩ9p)'Ǚ@]0޿y?G\?架gOo⃾Wzᇌz-v:v3ANvMu&w)/x~bl6=/O{WWFM{Yed;}д{eN+m=7EͶs hGz@HZcМ1s)o-\p]|Ti04_v.ÆS_dyV! $"vc9' hIwGQ8:3=W96W0>ks8!g_?AмqҴcOOHrӜY3,,k#SfoO:gqhDT!E~-٠ȵM<4O)|ƓD) t#-k+>WxSظnUqy֯A0<.ʅM ,VN䝕 #-IZ?>}g=x9,]4o|Chݲ^6׏Z٧8.q-16% V=݌_݈Qg s\ -4v\:=1OۀMҦ<~{kׯGm6x&3mcky_W4v&k${rthфzqh}(waT鎎1!hݐuY~(=׸m<6/P%x61Co&|=hJ=hqEOFiКNThD֓V Rag}#[f?]mQv}Z7o[%pziHz4-O:?p!g<_-1xI߉#ӆңuiy,-3h?Zīͩ^'zY˻uq|z~:T~[Ys͝u6V|0'Ze^ L0GӮU3w%{I6Iǒ1֮M־2oWJo!/ZѴY;z )6Iᅅx[4Ջߒ9Gf4iՙGg~[{6v:CyW*",,RjQR!L'7gM^iѴ -gX /87c[, ˶ILhcU2}@5w;pGɻsWzDF^(,oV=ײ1`v*K2klW!8o bxF^|5=l[i|(_7)K2E ik]̪Yqη(^Af6 -d嬜3IŶ/v&-X%xw@gźů@qncgwZF_Ce63k<U'rg\};,O2J< KW,Ӂټ<22qBJEKrk?6]ϐjk4;T $. 5%K=*^.OjXڜWc$Ewh4V\gWbyw*-PN-_|-(t|!7t>RE3gsl ַr?dCͩ_1,[%]aC&k Fu`и,^Onc+1q?ǝU"g,; >ײt_c^b+]x~س21qB?EKҭo|,?>ZEzyyIv[{ᛮagXѷ? m{ %ۍ`/\WW ױ|ssXf2.cz|3=V&Ʒ-D 3Gͱh VǐkP::}jW Y8k4]JZ3>ct,V.׮'& `K^bc\V}rWN>0т|5w d|Bgp8maW xU20a[~"":ՋneTl;@隍iY*Dƻ{~ȬJ*Vug[07Zf+iR+RMd2m:Ϧ~ɤo">O?{7s>SIίRq̘7O^ņ1yt6Ĩ0h<ϟxk֞U"it&͘/rwy{q߼m/ǗeMxf\exrt~c:Nfx,уGut=.M2ϴ?3uF G~E3yi&۽nA͇'1xQ4_̈'>Uϛ͇gٳ/1BpsŔ믣|?ZƼrMJDL*U0q`&. W-,\L;o¡KQ.P zZUoɛDUԩQP7!Eo8v8ͥe#u m;Y*W$0(V 0cnNєRX͌ڸ ]u"opWcφrYf "i~N k|'kZHwWv&вӹAY# nbԻ.n y]:KՔͲ֤ PՌhuiCBÚ%8| ^;snnTPw(ūw#̚bږ_ܕ X68% i_ 'VdU߼Q!(^ -b׳SASnZZl"HY y/nChҖJ,gA/6.JPk⎠\ݚO0( -/[kc'%Dafg/ :vZ #+פ'8豩뤿͉m6LhXP$v4UOӦ̒LC 3 x+1ĈMI/o,vffQф~[MdTJR-ن=,`SD WQ~ɸǏQy8gcQVҾcMxϛN O*dSmr֤X|ED.E(T~MXUa\ܵ֬;HTQh7t$E> ӕ,s,G޼=Y)xj/1)tf11I:m%p劅Y%c3~,p7Oh L,YK Ϯ[$Pj Lia0c)^8#*(Nr<F$Ecó+KXB;>恎i R ֎`!:e;GSmȪC`6FD^ՒCIK )AB̾0Ÿ603X19c00B/VǩyK~]8G>OX< {2,'~~y咙 ordԡ^f8oG0H-k x 8f%&j.J"%8lТe` NAǨadX)ZG>H˜jچbbl_U_KaS0U;1.he;H E8~8_u) Ec¹|Ll˻U:v@~'9K%͘h^0Ee'H :<%W p?k<#}zF1b4RZ VGu<,)78d̂犻g]+xg-FJ!7!E_L>fsWQ-u},s-JD~? W:#f= qae6+ BE(QA`Y̙5y hxL8x$( FabOrh@JPBED$1ǸҧVęq |kFрv2It2_OՒ{YlǙ{nEκ~ceܠPBdάY̙5͗7:uҤ|j~K3ٵ^8Ʀ |ObH21IٽyT"CQ2xO鳙|jvZ"Sb2D]x-g O{eR/Aد}ҋ*@(!=c4ǎ{)^ %]{Y\]&4ҎLML^r,%Zڴd{LL|)0jkw|K^<q".BWbEҮ^9_lI+I6o-iۅ|LEPAuy{Sד`#<=v$w~NaqX"2"n#mW3mdDQ8`߶_I8"cuYS^iG\ЦU$G31rgs!}]!!32+kd P8 v$accДS_-vqvnٝsМѻ_s(N[\ϲmeSxT:of&mXVȏ^NmJ9θc`@ X<jUSo}x5n*:c g'|#Z^O>2H?++6'Lc֯jR͋)lNu3>d'f7C ScX .C+Y!% qU9p2bo`ގqu7OҧO'kؙBFi)خg]?,?#h"mغ-o4c➝☇\ *s!{?MjsC4}ifynB)[&3K#jkH|l}retzfwӹ{?zM({N yZzfmLa[><<SĨ;RVnu΋At~p)<ށzq F~e:Mvq[ ZP fɶ +.3% &z6%.C" BFR|+kעfNx!>ۺt3X#c-F4=hڰgś3_t/FӢ>5jէu7Xv ۿ?_Qw4.99m Nc̡tiPuT8 (P;\϶v{"=ىիsS gr<llʸmH~^>+cmE ߁Ǿ>mYq oSy)5ʰjک>kK@FEDqzy_jUf  vtg@H@:kp?1b̳4AiWԡG+ ~^"ӞCi'8I}xPLk+y![0ckxc,ؕBT|ܿ! 4=f}&бz3Į#4g 6-Oi``3nf<UQ`_Gˢe@&]y~v ՕY{{ǿY9jGSN7e~7׍NvW;/_~TioT Wo.Ԇ }K~:Yǰ9e:c5$JW>Y2/}"nr撶t\6Es6eanx-,Uh-?M4eMmYW) yN~ʇ"t&00 =MӾ !H0|.h{L,/s^&d[x1=`0< #x \;':7ԅ=%"""iӶiA0zRvgIDDCضmT*4%(30ADQdUJ2V>nډcy-∽g5Cwr׬6cll̦)Aoo//%.A!>7ȴ铻ubum۶a !jM2me8< 2j+]gwqQ[ۜ+'6`ڗĦZ ccX|9laժDZj*,=lM7[W]{h϶}xiAPW6/Iܴ/7-5-Cv[6o%qR^,Y[lE߳Q7>$""~RU2-EB_1VBoц)Lb766^FNu_G4C{-""""vjTo+=wW?q]!ա=opqGݲyIzopulֺzoNڸ* ZGDDDD Y:Z'l\jY>Q'I]^ [MH5L;7.޸$u^6i ΍K3$̤ ޱ~l, Q+?ø).ImR+uEK\hG*MOo?B/czRxC_|o_6swUx:;kބ_/gb/ 2N=l8(uOf1]Z>PM1Ƈ77f:Fp 'c`qi0xarZ2"̚7;8+b vn\Jp֙Ga[׼○a~za 88#~o[k׭MFB7 ʼn\'qd]|(zSi1h? Yb/BY|?~]Gxu6| W~ v{{U۸YXxn&>^}8u`]闸MxeFe9}gq/3ϿKqş+E7E_<;z+Q|,ص7}KnڻpT_箹1oY ^#o׿&PVV~%|yqQ1}V[}Ɖ'(^xf fOQY|4N:mNQ^5FckFZ]}fI>bɱm2a| sqJ)3Wފwn}=.h)7px{,x#qᜥ8k߿jcqW]~_f-t݉眎^>[h >|MoӸ~ye˱7<[0{!\2\񻛯7?XcW>3/)n:|C 8hF<{a-A ' >uϖq-XwQ130J_d qX6ݹ>)$IuIhU2&TvMDDԕ E `vO,pw\c'П/ǒ?Om#@s1Ƙ1^qBO<ӓJ8-}ݍKyFl׾l|w!>aJzy8-o/ #o&N;Ͻڅ+o\;GמG} =w6m[hGkOx/E6cMe潈b1X۴N<{$1ZXv俇S>֮-Or-썋Ο)Jwd7Rx9=y"".TpQamذn-1w8 ,] g2{X]0: ,>H}8zfjO'w_yܸϱ̝u:p-W ѫ| xC&>'5?W.w*|w˱b= 'WPco/~ Q~;x;B0ycsada 㐿:C*Ry t??`21%3' l`bg-3dUɺM#=^]] {\7Ȇޡfv dy{jfl\I7~hi1`[H>bBmcmӮK֛T}6ߨ$]پVc(f%崬u ծKFmen%""""I}m.tn:,?Wccv-d.y]_GDDDDn:\vٸ]~RY7.i7ocv (sYDDDDԭ_~7iÞc׀kVo\^l{FDDDDD!de1amiwB7/۹5UXD\ZeEbVo#?~<#c%M=ahtt =6If󚮳XGi9`ꍶ$.˕C5ܜ Knq1g`X:XOlƚ8~r#o\ի1::fSbttWœٙJ^1>94j]L 4I @2Ik;$o-Wbqƃ۶=RMubsv$8hw<+Z]|,{ᓗ0wp.-ߦ}lҡ75Bv^gY7E6.IbTob㚮Cdd""(044j748SG T6{E ܹ65 (œ9܈T,100v.:h-Eh7ibOd(qCqy S &ODDD@EP3T(088)5qk+c:FaYrN.Bs-tCwT"q{q%&#E սlRcz޼%ڱqʻڹއ)s!""""=$fsz-sˋufn\~h7/4ڹۜqu(6,~ƅ^sF;k̍{7FMk(u2_uO+_}нy/:Bq:团_ίGձ~(m.4]_6^\hfغ̓bvOVdQ7=_۞؎iaI/仉Ӈӿ.&k""""nPd[VXPkz-s[#I=FI9h}Bm^DDDDD-[=]ìyrH*f|[;.1CVR>t3 $Vĵ亥j$""""tڧ-7#$׽'-޸A_n=_ece\RW ?QK?"""""-FB1uC"sy7 Ɉ+sA__o`D\*~\ؼfVZ[yf󲖾N1^PCoFt̮՛{]YwH>Z ժcj#-1m aeT?*szr=L1Q+Be-Oge3F*/$aZsY'/ň~Lئݎ2q;ɇ=kdJLoBteZ}֣͋5];6.17Ro>~X*s' ]W&CrPsS9t܎:o%Bj9/M9^n{L}L@u6' k I;4$yjՍu\Ǡ⚭Ae7)ћ)&'n`\Z}m֎:/sB됬uDDDD"klю2G(OltNzDe^j.^b޺iq0D*&Z6J\oJrFP&)9I^9Wǐ2z1--ZilZ@̎6C? IDATenkfuLٸġZbbI'j%M  \ƨ4ؼ|vc#8ZnD^W2FHPsu$4Pk"""= ٜQᐵ%Z} zms@Hլ`}=z1/tf{Ai:/s;z8!m,i؍xR˵E6.1&j=H^4}>$Vsy Ejd߇>$fsWk"-WǼ:/؜] [sch%Fuo뤘L}9덂51ӵ6'nc29-sBrVZ"""N`{$I:5vlCP\xqii1/2j\Ӯ5l\vcYIs;zQ DDDDmCkF/vnv^<4r@z>U?4E*pڛaߛۧ3Pu\$f^,$)#"""$~I9:/s/׺Ϋټu,-cvnv6ʷMܤ%p5zyys6/X(vsacik+-ODDD4ݥ56nl>-ڞ5:4Ɠ6g6o:vs͋{1 """vN:y1o(lZ6TN>Om.jrN:a󮵤JRNr6f"'""" 56n׀Y76\uYj֪f9[w\޵ǫbZZ>󈈈ZlM޵fsyi][+ܼՈzK[{lMuY눈(Mw:a=&m $ͮIἯϱ1ekc@8^F_hOF;t=/ncvjl̮?&9ykVpxzePDDDDT.)弘ǫ$y[_v5y_7o'BjrZ:""""jyR]Rj?&yy֎'.sDFœrW """"Z;/{4}""""".ާj;BVm=.o4kkqw4z 5""""""gMm'!kPKN"4돻u^"""""DJTMz>xx'}"""""b}z>xx'Z5H!""""Jjk{ZOBSVQmTgY"""""{l.u5XU~Ugpb]ok=DDDDDT5 s'ѪzlBԵTSeUѮ+q@lcCDDDDT_T0e;юv\4,Wu%U~TgYYD#2X^4c#꬧:E]VUU]Nnѱ%RNhUuU]..j;xUeUYFny>:*>"""""xpssQ嫲L\fʶlIJL,cb+8-z4lU Pn7rjN 'vՎh[qTvcj@Hb].V*m:p^Ʈm͎8ODDDDDuC߮Ϯfn\5N:Zj:DźX˨5 T zU{}DDDDDǺx1՚ڶc7FmI:j2źxWkv1#v|㈈(> fюc"Z8_%5bNuږ}؍";rDDDDDNJHTX2/v$ @n'q:>ֶLSDž5-8Չnr lj]m5ASDž듩}#v|,A*2ɜ9zHbTm""""cIUV˨cm N!i^n\v$elLbYc9Pyy;NNu!R8Y>NSS]p N21N21vjv66& :Ѯ;q@pARm rvMM#:.p#nsvueD;6q1IdxvUg4yۍ[F ļ54EZ2}ݮ8ׁ}DDDDDp˩ϮnWã]MxuSM۵D3.11KD(vUg1@qjڶ vu`7NkG*Q.up]MnS18$㢒P:  O].E3TSe" """" Q|TZ4m̮OD3.1QKDfU), 8yj\WקQ!ԯU۱βDDDDDG*uYթ`)7Qu1vuu*SUkvm;xhhnHx:u5u̩ϩ#""""P•SSvW4NSݺ,NżZW\y'Z'EyjWS]XANevVUS#WhlDM,cE2&o_Sڮ}i}݋BmM)]Ui˜NbTm""""*a,eu1ih̊1N=fVU?j5O {v5-OԠmӓ>QS v$'"""":j_ gJjOLz?j/&@ 꼺ZW://RO]V՚TTZ*R?ѱ*RR#N՚o'k]_yy*՝xH뉵_ VЪînr[]u=N5'…p}}my8T'yzzZkNr[ jݩIu#WpNA.myΫmOG`՛<J~_۰ʜ"zԀV@h:O|ԣ-듧]i^Q~\崜)D > 4^ rHGsE]j0նhT%""""b GF1j[W3uuzr51V#j4F~ O,+*z8i=Nu)yuyMͫ5>ЪTiâO] m 40}*~n?&R_պ y#vmz:Աvˋe5u^Ԛ:oǩߩDpN jZWZ6ڍcjn[թ/[FT'""""BU'aPGQqr@#pImUDpեq]M}2/ u݃ dB\7."0Md{}Y9 \-Kb_\G 0QS?>Å-GeaX^(m9yPKjWRR=‚[6,i`Y"""""uZ{x_A2QqovUK^q?Xhn|Uו0aזw/vchuwlK$jDDDDDDuͽ}>iك}ԳY<$npuu^ԮQvZf|1~nVnqu rn.ktJJJ/,2桌S3Vk6:W?w<;[LQkrbhnn̴SJBOA-enHSRňI4eY:_q*.ɧ'}g_~y+~jW+V|-Jqr r͑F.I4b秇0QF|m^ iޒDQ\H e8HyXļ8Q {,_y9;zH!3ÀeߝԆB2NDDDDD5ϲ,Y9ĒDpץXx3~(Z Nۂa(n_&%:IQBۡ%Hof[`a7c"""""@e#đT#r[TBvpbVCm8jm.:/P92Rdu>&4]C (l] w ])ץ*hĥW\]{Q ZXgjjjv b:F^N cE(7Any9}"uy1&i(5U/z`hV*RR3atB2BK^ ^o9t-$WnИX \sualEfGYƘgC0O߽-717Eg7IDTtInh{{(zjlTTVSGeൻHReXÉel\FwS-՚ܖo"mdw9OL5Ѧk`0rz åqBדQZRРT=8]`w7:"к\ǫ.[":vI!hצ 4]={XruKpCѺUKjEቇLj?/2tyq#OP~DdRi3{ ]:233еsG,^ǿ3DD^,_Z驚$7'_ u|76<>z8GFYE.RʹJ!V NA׮p5jZW2y7GmE]!||v)^qcfkIzM$e2pw7hr%KC>bf@ U?Dt,|ҋ1},LZO|>׾4?aM[[Mr+.rb-??Lt:/S(Ԯ U8i=x57`s/ྱas/`Ū5,"ЎݰQ]̉ j9H>:+'ZOm Nr vQP8`_Bw:r]̫TGbe mYQro\&ZQ2cj!%BvM@ ##|n~ߵuzH3g}X=ѱ$+3<0S_CqI ''cn n˟pвy3^^M7 4MsqBXj5> ?⦿\N;`zv݉8{ܜ,\t`b\zP\}%Aݍl74i<0v܅?tx69>ڍ{U9?xc7~B'owCG_v;G߈۶W<~Mp)}[ޏҲR .¿3>wh\qxI+`YZ4kLL}?0 &"ݰ'{1pB[ԗb9Bg+nUbL"q+\S*#5׈P*nLr~uv[Ďpn^=J+|aʋгlG1aT~ٯqٽ+= %%(*:7ft}4(.)KMPMӴ=#{cݘO|fpݱ&%%%8oo<0hYG{<7}2aB^~ (--,e9JJJ,o%7m ZUq3MfȺ˲by%{г{E =޻_²6'#'oŪߏNۭ*;ץtqF9HKvj[eW5:Rӎ ڧ.t880պmwFSJ-\ c˲5zql냮x<އ`K A/\qF(.)#{AudggvWr5p 4ѨawbY˲pP>222_;~oܰ!Zj鯾XQKNJBz?,£9g1o8R,=={z+ rs0K4 3#'",/Wbqݷcs/@Qc9}WսKuQ"~7cc;8@(:*sŢ䬤)}2ѶKvYRiYz̢ J$u[Vv;bjhuX!CJrL=~S Г W$(' z$F9PV]ipk =nS4-wmXnCU߭!":^ii8iR@JrrEkڤ1, ]׫;PA4!AnW[?m¸|>Y[θc x)]cn#O Cg4F.ODT-_{!r*z#+Wϡ\z#1VEą&NRV`^&V#bR"xvSAmSH6C [{N5ujwDk+ iHhTO$9Ԋ;wCeѭ ڷkwOMVt9p\p\Ю-RSSԡA,¤)/s0!jwܜli ˑspppڶi ~%W>@ n6 ko򕕻wtTYW{zt,q/qԛ蓧4uMغ}-Y_” OpQvًy }=>4nu-n˟`lݎRuxxc!?g⦿ Cv 8LuXoiW_ļ?!"fkRU< ,}B( jb^U(m"/H4 7/aUe 1}bu/'E忣E{4Zv͞8%.??DDTfRS֜]OC|ySR<6>D7U9ՅHL09Ъp}r[X7y=q{3Ps8ƕΈ;D/Цu+ 8,|-Q-r:jRk&kU<:~ !T~ @[ڸJNER6C*dy7pQ>+,X:zq(qEV`^ФDMGZA,ĩߩ^m *ymuǪS5@ EU^q//oj | ˹BmˁҼr;-p5j8%>ly^ fwtW qI(-0J(^ J>ROy\son5"ѡ6(S֡|&?v}ƕ۝Lt{DDDDDDq!S9 q@e`E`*b^֝杈DWe ua;N~ɰ#n⨬r-Af%""""ĊynNEͮܟ5j{T:Nj Q}eq#jNtǩZUP>pUwM}WB~Bgv9Ǯf&i*m1]ݮRCbCpm.T>DDDDDDd7TD/q EUGրʺw':KQeAX 3P4.͂aZ҂u\0a&,Mu4ˀi>p Â@w .0`VlϿ֠\pY|>XA]a0< x IDATC:P-?5LX >7z;>%)H{%h :L4]ZV|4.br*/'q}ۿvSqM#ךe. _zOAV ԅu+5j '@ˇu,P9N=瘨\.1/~.we%_s!' x}]!(uh.=3WvhpiXeꘐ0_fYyurט  vT݀Ӫ'"""""o,$rZSsXu>vBT>p;T j\OC&"""""4gHY.C9Me:djfΉ y^~炈>F~:/d8]NkVaꓠM|Q}f 棙5Am*ZH0v4ԝNż70{%CttJqiڍ]U!"""D w|v,IJNmZ;FSƨ5-Dzb7QHۛ}툎 KK&:*m(aںbv|1:30f5S1oJպvxxRwj,OTۭ'j0t+:vtq㺮iBZ"""'\QsSzVGOyNHeDÍ|kURbstqLGDDDDu]Qkԩ 'v\\VubvvzԚ\W5[|iv9'\6 vjM"B#ñMMm N;_'IsZQ}cwLd7/SjfGOqP['H~2Cjo^%2FƩ;\ԶԺJDDDDDTEj[jMpDXP /ғֈl# 5#9QF؄Ite8sZZ D}j?Q}f5D'9Uu{j=X>u96U={/cذa!զi7on@~i|ʈjQ* ?i*\_kߡB>>j?Eiڴi7n `Y,+qm۶7_\s5+a,˂a>}:֬Y?0|)(ikNAZf&2R!=EoԜfM+iv՚]v*6jP ︪rZZ;ߩNQ6mZZeYXt)Z|x<JOG.FZqh[n-n=HYτDDtl6rzUh@ |bY=y}gs=h˲0g[2a P n²7oڜQȓͧ~ rh/?쨒 0`UKh؞@DDt [Ռ_UP[UvS UW^A~~Z1h ]qF A۶, >,F >)ZjP;4v=֌}])?J0{l|zwˈSPeꜣ-=B>`!>|8M`iYz Yy>uat]MʕE-&$-/ӕӌud4OO "" }KK#UugF8Qw'6ltp\ =X4 4Z˲at-ۧDr#Qs4k  -vDe\^h#L,ۊ}޸}<ߖ(HFFR-JANr*,Lni6(?}@GzNyc"[& (/*@A YHY-?b"%+ iA \CFNPrh7KK(Ґ[ϰob]Hhz6FRB)ЮcÐ 8tTY *ڋ]E4C!Q O4w5NFރ8bXR4:X*#(((䨿,?bx])DEBDDNTWE;N&Q׈ BUv](4&\IĿk$P:z+S-߳\ǿeSn$Nk1v:,Шոғ6A9tY#)Zv3\+.8 ?ǃß/^'.^Y}}3gz.~v6灮Ʀiksx>Xn_ KOeMߝ|E0,@sgy1ڿgBÏb%x[l^6,ai<h \8b>-҃V ?/ࢉ0:xS|p ]NF]!a w+UVt&}h=uXMKFN}q%bŽ"ff!6~6%~\qҀKpa(ϯU >+GC_:Ǜx-h8PKaV8.FD;O&Qhf8ƫ0kX(B䈗=&Ll0vor<8eR/M#0, 0PR-M+v +f4 (EL 0aYŋ>ߑxW#0QMF^nXrl~>>i |lZ3<I̱ _ĸGC^甥e,^ʛ9ݏg D+0e0 žyq_cG߱iX<&p[{1o똳-!7ti<]c@xu l+ˇw&y^75Li4˿nDŽO~CaJb]lXo݊gzd*W}2o#{ OaYGcxb|K:`u?aٻ?w&bXcWkHmv\VBmuwhG;⨴yyyصkWiѰ[fѢEuvcǎ<(jv7V* %~Z߅8hw-!CH*XǍnIYz/\Lgl/ a<]ùt[=s(&Lp?І,XʖK>+ |aVӡkV\M}$l{腸B,x47I/>Lsi9jIh ∶xd0x(5߶oժlj){1o {S: ueY "?<n=xv(xAiu- e1^~`ZO{ j̽I|* ,g7E, !̋pv0"ڬ8'byjX] 8`6m t'`ʔ)xj;v]w݅QF%VTC|\\gfvl;hԦ:ݟak ?hN[0✞hšKk/⿋g(m~}B `SŎ@Ց|5 vjغq9_C @Kw婮qcY4u=~0@?&`֚"0p:z\ngtn OF|S6y$_߃ˆGw|t,Z-5λZc/mbo6 Ú, Zrk[&׍K0k3x+ 0ށOa~|pU|9UAw9z\e.4} ?̝<һRI{ܕ偣:;'j_1А<0z$9Ǧ)aU X>e̸L+⥯/wkXtd]rnoM3#߰ 5c8E0rh.8naޏ];~E9ӣj$"":D!ToxǺ(F ,@߾}1e:tU1wJ 6`:t(ۧ.BrP KĖ/>"߆.-rz'`TO>GL2E?/v>