wally-2.4.4/AUTHORS0000644000000000000000000000007011676624760012433 0ustar rootrootAntonio Di Monaco (a.k.a. Sin(x) '76) wally-2.4.4/CMakeLists.txt0000644000000000000000000002400011676624760014122 0ustar rootrootcmake_minimum_required(VERSION 2.6) if( COMMAND cmake_policy ) if( POLICY CMP0017 ) cmake_policy( SET CMP0017 NEW ) endif( POLICY CMP0017 ) endif( COMMAND cmake_policy ) project( wally ) if( STATIC ) if( NOT CMAKE_BUILD_TYPE ) set( CMAKE_BUILD_TYPE Release ) endif( NOT CMAKE_BUILD_TYPE ) add_definitions( -DQT_STATICPLUGIN -DWALLY_STATIC ) endif( STATIC ) set( WALLY_SRCS include/version.h include/idcache.h src/json.cpp include/json.h src/diskinfo.cpp include/diskinfo.h src/exif.cpp include/exif.h include/networkmanager.h include/networkmanager_p.h src/networkmanager.cpp src/gui.cpp include/gui.h src/mapviewer.cpp include/mapviewer.h src/engine.cpp include/engine.h src/xtengine.cpp include/xtengine.h src/httpengine.cpp include/httpengine.h src/files.cpp include/files.h src/folders.cpp include/folders.h src/flickr.cpp include/flickr.h src/yahoo.cpp include/yahoo.h src/panoramio.cpp include/panoramio.h # src/pikeo.cpp # include/pikeo.h src/photobucket.cpp include/photobucket.h src/ipernity.cpp include/ipernity.h src/buzznet.cpp include/buzznet.h src/picasa.cpp include/picasa.h src/smugmug.cpp include/smugmug.h # src/bing.cpp # include/bing.h src/google.cpp include/google.h src/vladstudio.cpp include/vladstudio.h src/deviantart.cpp include/deviantart.h src/utils.cpp include/utils.h src/splash.cpp include/splash.h src/settings.cpp include/settings.h src/history.cpp include/history.h src/viewer.cpp include/viewer.h src/about.cpp include/about.h src/wally.cpp include/wally.h src/main.cpp include/defs.h ) set( WALLY_MOC_HDRS include/exif.h include/networkmanager.h include/networkmanager_p.h include/gui.h include/mapviewer.h include/engine.h include/xtengine.h include/httpengine.h include/files.h include/folders.h include/flickr.h include/yahoo.h include/panoramio.h # include/pikeo.h include/photobucket.h include/ipernity.h include/buzznet.h include/picasa.h include/smugmug.h # include/bing.h include/google.h include/vladstudio.h include/deviantart.h include/splash.h include/settings.h include/history.h include/viewer.h include/about.h include/wally.h ) set( WALLY_UIS ui/files.ui ui/folders.ui ui/http.ui ui/settings.ui ui/viewer.ui ui/about.ui ) set( WALLY_IMAGES_RCS res/images.qrc ) set( WALLY_LANGUAGES_RCS ${CMAKE_CURRENT_BINARY_DIR}/languages.qrc ) set( WALLY_TS res/lang/wally_ca.ts res/lang/wally_cz.ts res/lang/wally_de.ts res/lang/wally_es.ts res/lang/wally_fr.ts res/lang/wally_gr.ts res/lang/wally_it.ts res/lang/wally_kr.ts res/lang/wally_pl.ts res/lang/wally_pt_BR.ts res/lang/wally_ru.ts res/lang/wally_zh_CN.ts res/lang/wally_hu.ts res/lang/wally_dk.ts res/lang/wally_se.ts res/lang/wally_tr.ts ) add_definitions( -Wall -Wextra -fexceptions -frtti -DUNICODE -DQT_THREAD_SUPPORT ) set( QT_USE_QTNETWORK TRUE ) set( QT_USE_QTXML TRUE ) set( QT_USE_QTSVG TRUE ) if ( ( NOT APPLE ) AND ( NOT WIN32 ) ) set( QT_USE_QTDBUS TRUE ) endif( ( NOT APPLE ) AND ( NOT WIN32 ) ) set( QT_USE_QTSQL TRUE ) find_package( PkgConfig REQUIRED ) pkg_check_modules( EXIF libexif ) if( EXIF_FOUND ) add_definitions( -DEXIF ) link_directories( ${EXIF_LIBRARY_DIRS} ) endif( EXIF_FOUND ) find_package( Qt4 REQUIRED ) include( ${QT_USE_FILE} ) configure_file( res/languages.qrc ${CMAKE_CURRENT_BINARY_DIR}/languages.qrc ) qt4_add_translation( WALLY_QMS ${WALLY_TS} ) qt4_add_resources( WALLY_IMAGES_RC_SRCS ${WALLY_IMAGES_RCS} ) qt4_add_resources( WALLY_LANGUAGES_RC_SRCS ${WALLY_LANGUAGES_RCS} ) qt4_wrap_ui( WALLY_UI_HDRS ${WALLY_UIS} ) qt4_wrap_cpp( WALLY_MOC_SRCS ${WALLY_MOC_HDRS} ) link_directories( ${QT_LIBRARY_DIR} ${QT_PLUGINS_DIR}/imageformats ${QT_PLUGINS_DIR}/sqldrivers ) include_directories( include ${EXIF_INCLUDE_DIRS} ${CMAKE_BINARY_DIR} ) if( APPLE ) set( PROGNAME Wally ) set( CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk/" ) set( CMAKE_OSX_ARCHITECTURES "ppc;i386" ) set( CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.4 ) find_library( QT_GIF_PLUGIN qgif PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES imageformats ) find_library( QT_ICO_PLUGIN qico PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES imageformats ) find_library( QT_JPEG_PLUGIN qjpeg PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES imageformats ) find_library( QT_MNG_PLUGIN qmng PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES imageformats ) find_library( QT_SVG_PLUGIN qsvg PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES imageformats ) find_library( QT_TIFF_PLUGIN qtiff PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES imageformats ) find_library( QT_SQLITE_PLUGIN qsqlite PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES sqldrivers ) find_library( SYSTEM_CONFIGURATION_LIBRARY SystemConfiguration ) if( EXIF_FOUND ) find_library( ICONV libiconv ) if( ICONV-NOTFOUND ) message( FATAL_ERROR "libiconv not found" ) endif( ICONV-NOTFOUND ) find_library( INTL libintl ) if( INTL-NOTFOUND ) message( FATAL_ERROR "gettext not found" ) endif( INTL-NOTFOUND ) endif( EXIF_FOUND ) add_executable( ${PROGNAME} MACOSX_BUNDLE ${WALLY_QMS} ${WALLY_SRCS} ${WALLY_MOC_SRCS} ${WALLY_IMAGES_RC_SRCS} ${WALLY_IMAGES_RC_SRCS} ${WALLY_LANGUAGES_RC_SRCS} ${WALLY_UI_HDRS} ${CMAKE_CURRENT_SOURCE_DIR}/mac/wally.icns ) set_source_files_properties ( ${CMAKE_CURRENT_SOURCE_DIR}/mac/wally.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) target_link_libraries( ${PROGNAME} ${QT_GIF_PLUGIN} ${QT_ICO_PLUGIN} ${QT_JPEG_PLUGIN} ${QT_MNG_PLUGIN} ${QT_SVG_PLUGIN} ${QT_TIFF_PLUGIN} ${QT_SQLITE_PLUGIN} ${QT_LIBRARIES} -lz ${EXIF_LIBRARIES} -lqgif -lqico -lqjpeg -lqmng -lqsvg -lqtiff -lqsqlite -liconv -lintl ${SYSTEM_CONFIGURATION_LIBRARY} ) set_target_properties( ${PROGNAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/mac/Info.plist ) if( CMAKE_BUILD_TYPE STREQUAL Release ) get_property( WALLY_PATH TARGET ${PROGNAME} PROPERTY LOCATION ) add_custom_command( TARGET ${PROGNAME} POST_BUILD COMMAND strip ARGS ${WALLY_PATH} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) endif( CMAKE_BUILD_TYPE STREQUAL Release ) if( COMPRESS ) find_program( UPX upx ) if( UPX ) get_property( WALLY_PATH TARGET ${PROGNAME} PROPERTY LOCATION ) add_custom_command( TARGET ${PROGNAME} POST_BUILD COMMAND ${UPX} ARGS ${WALLY_PATH} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) endif( UPX ) endif( COMPRESS ) elseif( WIN32 ) set( PROGNAME Wally ) add_definitions( -DWINVER=0x0500 ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/wally_rc.o COMMAND windres.exe -I. -o ${CMAKE_CURRENT_BINARY_DIR}/wally_rc.o -i res/wally.rc WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) set( WALLY_SRCS ${WALLY_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/wally_rc.o ) set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -enable-auto-import" ) if( STATIC ) set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static" ) find_library( QT_GIF_PLUGIN qgif PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES imageformats ) find_library( QT_ICO_PLUGIN qico PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES imageformats ) find_library( QT_JPEG_PLUGIN qjpeg PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES imageformats ) find_library( QT_MNG_PLUGIN qmng PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES imageformats ) find_library( QT_SVG_PLUGIN qsvg PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES imageformats ) find_library( QT_TIFF_PLUGIN qtiff PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES imageformats ) find_library( QT_SQLITE_PLUGIN qsqlite PATHS ${QT_PLUGINS_DIR} PATH_SUFFIXES sqldrivers ) endif( STATIC ) add_executable( ${PROGNAME} WIN32 ${WALLY_QMS} ${WALLY_SRCS} ${WALLY_MOC_SRCS} ${WALLY_IMAGES_RC_SRCS} ${WALLY_LANGUAGES_RC_SRCS} ${WALLY_UI_HDRS} ) if( STATIC ) target_link_libraries( ${PROGNAME} ${QT_GIF_PLUGIN} ${QT_ICO_PLUGIN} ${QT_JPEG_PLUGIN} ${QT_MNG_PLUGIN} ${QT_SVG_PLUGIN} ${QT_TIFF_PLUGIN} ${QT_SQLITE_PLUGIN} ${QT_LIBRARIES} ${EXIF_LIBRARIES} -lshlwapi -lversion -lshell32 ) else( STATIC ) target_link_libraries( ${PROGNAME} ${QT_LIBRARIES} ${EXIF_LIBRARIES} ) endif( STATIC ) if( COMPRESS ) find_program( UPX upx ) if( UPX ) get_property( WALLY_PATH TARGET ${PROGNAME} PROPERTY LOCATION ) add_custom_command( TARGET ${PROGNAME} POST_BUILD COMMAND ${UPX} ARGS ${WALLY_PATH} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) endif( UPX ) endif( COMPRESS ) else( APPLE ) set( PROGNAME wally ) add_executable( ${PROGNAME} ${WALLY_QMS} ${WALLY_SRCS} ${WALLY_MOC_SRCS} ${WALLY_IMAGES_RC_SRCS} ${WALLY_LANGUAGES_RC_SRCS} ${WALLY_UI_HDRS} ) target_link_libraries( ${PROGNAME} ${QT_LIBRARIES} ${EXIF_LIBRARIES} ) install( TARGETS ${PROGNAME} DESTINATION /usr/bin ) if( CMAKE_BUILD_TYPE STREQUAL Release ) get_property( WALLY_PATH TARGET ${PROGNAME} PROPERTY LOCATION ) add_custom_command( TARGET ${PROGNAME} POST_BUILD COMMAND strip ARGS ${WALLY_PATH} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) endif( CMAKE_BUILD_TYPE STREQUAL Release ) find_package( KDE4 ) if ( KDE4_FOUND ) add_subdirectory( ${CMAKE_SOURCE_DIR}/wallyplugin ) endif( KDE4_FOUND ) endif( APPLE ) wally-2.4.4/COPYING0000644000000000000000000000002311676624760012414 0ustar rootrootSee LICENSE file. wally-2.4.4/ChangeLog0000644000000000000000000001704211676624760013144 0ustar rootrootVersion 2.4.4 - Fixed gconftool-2 arguments bug - Settings window layout is now suitable for netbook screens Version 2.4.3 - Fixed GnomeShell background change issue - Added Swedish language - Added Turkish language Version 2.4.2 - Added GnomeShell support - Added Hungarian language - Added Danish language - Removed Pikeo module, it is no longer active - Removed Bing module, M$ didn't accept Wally's way of using Bing Version 2.4.1 - Deprecated HTTP Qt classes have been replaced - Wally can now terminate after first background change - Splash screen can be disabled - Mac OSX Settings GUI scrollbar issue fixed - WallyPlugin now uses D-Bus - BUG FIXED: CMake build script had an issue in compiling language resources Version 2.4 - Added OS/2 support - Added Snow Leopard support - Added Google module - Added deviantART module - Added Vladstudio module - Added Korean language - Folder module now supports symbolic links - More photo layouts on desktop have been added - BUG FIXED: Panoramio no longer crashes when empty results are returned - BUG FIXED: Disclaimer translation is now properly applied at boot - BUG FIXED: Centered auto-fit was not always applied correctly - BUG FIXED: HTTP engine rarely got stuck Version 2.3.2 - Double-clicking icon in system tray advances on next photo - Improved duplicated photo detection - Added Catalan language - Added Greek language - Added disclaimer to be accepted on first start of Wally - Removed QtScript dependency, JSON parser has been implemented internally (Qt 4.6 compatibility) - Run-time folder change detection has been removed from "Folders" module, its use is too resource consuming - BUG FIXED: search issues occurred when using multiple tags/keywords - BUG FIXED: EXIF information are now showed correctly when non-Latin1 characters in filename path are used - BUG FIXED: KDE 4.4 SC was not properly detected - BUG FIXED: Panoramio was working only with "Original" sized images Version 2.3.1 - Added Chinese language - Added Polish language - Active Desktop is now detected, and error is reported - Photo filename is used when title is not available - XFCE detection improved - BUG FIXED: GUI bug in proxy selection form - BUG FIXED: Panoramio coordinates are checked after input terminates - BUG FIXED: buggy behaviour in MacOSX, Folders module, when too many files are present in specified directories Version 2.3.0 - Added French language - Added Czech language - Wally can now display wallpapers behind toolbars and docks, using full screen space - Time period can now be shortened up to 10 seconds - Automatic border color feature has been added - BUG FIXED: history data is not stored anymore when Cancel is pressed - BUG FIXED: HTTP download does not get stuck anymore if HTTP response is wrong - BUG FIXED: HTTP download in history window does not get stuck anymore at 99%, cause of a QProgressDialog conflict - BUG FIXED: history viewer misbehaviours have been fixed - BUG FIXED: Panoramio items save state correctly now - BUG FIXED: map selection issues in Panoramio items have been fixed - BUG FIXED: MacOSX Info.plist fixed - BUG FIXED: regression bug about free disk space check has been fixed Version 2.2.0 - Added selection on map for Panoramio items configuration - History window has been improved, more informations for each item and filter by tags have been added - Added Bing module - EXIF support improved. Information window has been added, and EXIF is stored in history. - BUG FIXED: wrong GUI behaviour in HTTP items when setting photos path, now fixed - BUG FIXED: wrong GUI behaviour on proxy server selection, now fixed - BUG FIXED: duplicated items are not accepted anymore - BUG FIXED: now asks HTTP server first if download is recoverable - BUG FIXED: segfault no longer happens when GIF/PNG/no-EXIF-compatible photo is downloaded - BUG FIXED: consecutive downloads of the same photo are not allowed anymore - BUG FIXED: X shortcuts for older WMs weren't updated to current features Version 2.1.0 - Added system proxy support - Added History feature - Modules can be disabled/enabled - Added Picasa module - Added Smugmug module - Added Buzznet module - HTTP engine can now recover downloads - More cosmetic changes - Free disk space threshold can be configured - Multiple items in HTTP engines can be selected - BUG FIXED: state in Folders engine is now properly saved - BUG FIXED: playlist is now reset correctly after wrap Version 2.0.3 - BUG FIXED: MacOSX script for wallpaper change now works properly - BUG FIXED: Color button is now showed correctly with all GUI styles - BUG FIXED: "About" dialog now can be closed under MacOSX - BUG FIXED: empty "Remote folder" items are now correctly rejected - BUG FIXED: Wally's single instance in MacOSX is now properly detected - BUG FIXED: annoying issues with KDE4 WallyPlugin have been solved (at the end!!!) - Some cosmetic changes Version 2.0.2 - BUG FIXED: empty items are now discarded - BUG FIXED: single instance in Linux now is checked using file PID, thus avoiding false positives - BUG FIXED: only available free space on desktop is used - BUG FIXED: Pikeo now resets page count search after an empty result - Free disk space (at least 20 megs) is checked for availability before saving photos - EXIF tags are analyzed in every plugin, and corrections are applied where needed - Photobucket has no throttle limit anymore, watermark on photo is applied - More code restyling - Fixed plural form in translations - Added Portuguese (Brazil) translation - Window manager can be forced at command line (Linux only) - WallyPlugin: D-BUS is not used anymore - WallyPlugin: KDE message will appear at end of installation, remembering of KDE4 Plasma restart - Removed QCA dependency - Application data folder is now more S.O. "friendly" under Win32 and MacOSX Version 2.0.1 - WallyPlugin BUG FIXED: plugin is now compiled without debug information - WallyPlugin BUG FIXED: D-BUS access rights are now setup correctly - WallyPlugin BUG FIXED: installation paths are now detected properly Version 2.0.0 - Wally's engine has been totally rewritten, for better stability and better coding structure in plugins' development - UI partial restyling and improvement - KDE4 support - MacOSX support (experimental) - FTP remote folders support - Multilanguage support (English, Italian, Spanish and Russian) - Wally now remembers its last state before termination - Bugs fixed all around Version 1.3.2 - Added configurable GUI style - Flickr search pages are how hard-limited, to avoid repeated results - Pikeo plugin is now enabled - Added "-debug" command line switch for better bugs tracing - BUG FIXED: pictures in folder mode now change correctly - BUG FIXED: multiple erroneous picture validations are no longer generated Version 1.3.1 - BUG FIXED: regression bug about removing rows from configuration has been fixed Version 1.3.0 - Added Pixeo plugin (still disabled, EXPERIMENTAL) - Added Riya plugin (still disabled, EXPERIMENTAL) - About dialog now shows supported images - BUG FIXED: Gnome detection now should work Version 1.2.0 - Added Panoramio plugin - Flickr images are now rotated correctly, if needed - BUG FIXED: sending quit immediately before background change doesn't generate a segfault now - BUG FIXED: HTTP timeouts now if a transfer takes too long - BUG FIXED: internal search is now limited by HTTP result count - VERY IMPORTANT BUG FIXED: Play/Pause now works correctly Version 1.1.0 - Added Fluxbox support - Added Blackbox support - Added FVWM support (unstable) - Added WindowMaker support - BUG FIXED: XFCE4 now works - BUG FIXED: "Cancel" command now works when HTTP download is in progress Version 1.0.0 - First release wally-2.4.4/DISCLAIMER0000644000000000000000000000141111676624760012722 0ustar rootrootWally Disclaimer Just to make my lawyers happy and others unhappy: This software is provided by the owner "AS IS". 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. Moreover, the author takes no responsibility over the content that Wally downloads from photo sharing web sites, the author is in no way responsible for any such content. wally-2.4.4/INSTALL0000644000000000000000000000002111676624760012410 0ustar rootrootSee README file. wally-2.4.4/LICENSE0000644000000000000000000003607511676624760012406 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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 wally-2.4.4/NEWS0000644000000000000000000000000011676624760012053 0ustar rootrootwally-2.4.4/README0000644000000000000000000001155211676624760012252 0ustar rootrootWally 2.4.4 Wally is a Qt4 wallpaper changer, using multiple sources like files, folders, FTP remote folders, Flickr, Yahoo!, Panoramio, Ipernity, Photobucket, Buzznet, Picasa, Smugmug, Google, Vladstudio and deviantART images. It runs under Linux, Win32, MacOSX and OS/2, and it's available in many languages. Some features: - History support - EXIF support - Proxy support - A lot of wallpaper layouts, independent from window manager's capabilities - Save downloaded pictures Requirements: - Qt 4.6.0 or better - Libexif 0.6 or better (optional) - CMake 2.8 or better (in order to build from sources) Installation: - mkdir build - cd build - cmake -DCMAKE_BUILD_TYPE=Release .. ( ^^^^^ please type just like you read ^^^^^^^ ) - make - make install (Linux only) CMake options: -DCMAKE_BUILD_TYPE=Release compile in Release mode -DCMAKE_BUILD_TYPE=Debug compile in Debug mode -DSTATIC=1 link with static libraries (only if Qt4 has been compiled in static mode) -DCOMPRESS=1 compress final executable with UPX (only Win32 and MacOSX) If you have KDE4, your enviroment will be automatically detected, and WallyPlugin will be installed. Remember to restart KDE4 (logoff/logon should be enough) in order to use Wally. Then, select WallyPlugin in Appearance Settings. To be clear, WallyPlugin IS NOT Wally. It's just a "brigde" between Wally and KDE4, and it must be selected to show Wally images, so Wally has to be started. Moreover, if you're upgrading KDE4 to KDE 4.4, and you already have WallyPlugin, Plasma can crash, due to binary incompatibilites with new Qt/KDE libraries. Just reinstall/recompile Wally. When launched, Wally places itself in your system tray. Right-click on icon to show main menu. In Settings window, just select a module, and add items in the list. Wally will download photos according to your search keywords, or use your photos if you're using Files / Folders modules. Supported Window Managers: - Win32 - MacOSX - OS/2 - KDE3 - KDE4 - Gnome - GnomeShell - XFCE4 - Fluxbox - Blackbox - FVWM (unstable) - WindowMaker Please read README.XFCE4 and README.shortcuts for further instructions. Note for Mac OSX Snow Leopard: You must disable "Change Picture" feature, that's in System preferences > Desktop & Screen Saver > Change picture. ------------------------------------------------------------------------------------------------------ UPGRADING NOTES: History database will be upgraded to the new version, in order to save more information. All previous records will be tagged "unknown" in history. - only for Wally 1.x Settings have totally changed, so please uninstall 1.x version removing also settings. Under Linux, remove ~/.config/BeCrux/Wally.conf ------------------------------------------------------------------------------------------------------ TRANSLATORS Let me give special thanks to Wally's translators: - Me :), English and Italian - Татьяна Рубина, Russian - Martino Vedana, Spanish - Márcio Moraes, Portuguese (Brazil) - Klaus-Peter Gores, German - Nicolas Remy, French - Martin Pavlík, Czech - Dominik Szczerba, Polish - 御用软件, Chinese - Miquel Ràmia, Catalan - Θωμάς Τσάβαλος, Greek - 이덕희, Korean - Michael Borries, Danish - Rumán Sándor, Hungarian - Recep Çakan, Turkish - Andreas Klintemyr, Swedish If you want to add your translation to Wally, you just need: - Qt Linguist - 15 minutes of your life :) You don't need to be neither a developer, nor to understand Wally's code. And, if you need help in using Linguist, just write me. ------------------------------------------------------------------------------------------------------ ACKNOWLEDGEMENTS Wally has been deeply inspired by John's Background Switcher (http://www.johnsadventures.com/software/backgroundswitcher), a great software, well designed and much more capable than Wally. Infact, it's still running on one of my PCs :) Anyway, I decided to write Wally for two reasons: - JBS is based on .NET, a framework that is not installed on every PC, cause of its "heaviness" and system resources' usage. - And, mainly, it cannot run on platforms like Linux / MacOSX. So, I'd like to thank John Conners, for giving me the opportunity to re-use its idea in order to fulfill the universe of wallpaper changers not covered by JBS :) First of all, I'd like to thank Tanya, my wife, for all her support before, during Wally's development and after :) I'd also like to thank: - for bugs reporting, new ideas and time spent in testing: Francesco De Marchi Sylvain Gueniot Oliver Schwabedissen Ferhat Dogru Corrado Guarino Lo Bianco Filippo Venturini Klaus-Peter Gores Mike Cooper Mario R. Carro Serge Sander Martino Vedana Mirko Bianco Elbert Pol Alex Roma - Photobucket staff, for support and promoting. Any contribution or suggestion will be appreciated. Write me at tony@becrux.com for help. wally-2.4.4/README.XFCE40000644000000000000000000000035411676624760013060 0ustar rootrootWally XFCE4 In order to activate Wally with XFCE, just enter the file ${HOME}/.config/xfce4/desktop/backdrops.list in your XFCE Desktop configuration. Wally will change this file periodically, and so xfdesktop can load the image file. wally-2.4.4/README.shortcuts0000644000000000000000000000072611676624760014310 0ustar rootrootWally Shortcuts When system tray icon is not available (i.e., with WindowMaker, Blackbox and FVWM), Wally can be controlled via global shortcuts. Here's the map: CTRL + Shift + A -> About window CTRL + Shift + S -> Show settings window CTRL + Shift + N -> Next picture CTRL + Shift + Q -> Quit CTRL + Shift + D -> Save current image CTRL + Shift + P -> Play/Pause CTRL + Shift + I -> Get EXIF Info CTRL + Shift + H -> History CTRL + Shift + W -> Explore image source wally-2.4.4/TODO0000644000000000000000000000017011676624760012054 0ustar rootroot- More conditions on acceptance of images - Key bindings - Timeline - Image filters - Multiple monitors - Any ideas? :) wally-2.4.4/build/0000755000000000000000000000000011676634306012462 5ustar rootrootwally-2.4.4/include/0000755000000000000000000000000011676624761013012 5ustar rootrootwally-2.4.4/include/utils.h0000644000000000000000000000177711676624760014336 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 UTILS_H #define UTILS_H #include QMap getFormats(); QStringList getImageFilters(bool shortView = false); QStringList getSupportedImageFormats(); #endif wally-2.4.4/include/photobucket.h0000644000000000000000000001125211676624760015512 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 PHOTOBUCKET_H #define PHOTOBUCKET_H #include #include #include #include "idcache.h" #include "httpengine.h" #define PHOTOBUCKET_API_KEY "149827768" #define PHOTOBUCKET_SECRET_KEY "0b63a925baaead519308130cbf11028b" #define PHOTOBUCKET_ENGINE_NAME "Photobucket" #define SEARCH_TEXT "text" #define CONDITION "condition" #define LAST_PHOTO_URLS "lastPhotoUrls" namespace Photobucket { enum Condition { And = 0, Or }; class Item : public HttpEngine::Item { Q_OBJECT int pbTimestamp; QUrl _photoUrl; IdCache _lastPhotoUrls; QUrl _sourceUrl; QString photoOwner; QString photoDescription; QString photoTitle; QString _text; Condition _condition; QByteArray hmacSha1(const QByteArray &data, const QByteArray &key); int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); void doProcessInitResult(const QByteArray &response); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; QVariant data() const; bool isValidItem() const { return _text.size(); } public: Item(); Item(Item *item); virtual ~Item() { } void setText(const QString &text) { _text = text; } void setCondition(Condition condition) { _condition = condition; } QString text() const { return _text; } Condition condition() const { return _condition; } QString photoUrl() const { return _photoUrl.toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QLineEdit *leSearchFor; QComboBox *cbCondition; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } QSize sizeHint() const { return QSize(500,height()); } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/photobucket"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } QString name() const { return PHOTOBUCKET_ENGINE_NAME; } QAbstractButton *newButton(QWidget *parent = 0); Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } void applyWatermark(QPainter *painter, const QRect &rect); public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/include/deviantart.h0000644000000000000000000001075511676624760015333 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 DEVIANTART_H #define DEVIANTART_H #include #include #include #include "idcache.h" #include "httpengine.h" #define DEVIANTART_ENGINE_NAME "deviantART" #define TAG "tag" #define LAST_PHOTO_URLS "lastPhotoUrls" #define ADULT_FILTER "adultFilter" namespace DeviantArt { enum TagsCondition { And = 0, Or }; enum AdultFilter { Off = 0, Strict }; class Item : public HttpEngine::Item { Q_OBJECT QUrl _photoUrl; IdCache _lastPhotoUrls; QUrl _sourceUrl; QString photoOwner; QString photoDescription; QString photoTitle; QString _tag; QSize photoSize; AdultFilter _adultFilter; int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; QVariant data() const; bool isValidItem() const { return _tag.size(); } public: Item() : HttpEngine::Item(), _adultFilter(Strict) { } Item(Item *item) : HttpEngine::Item(item) { _tag = item->_tag; _adultFilter = item->adultFilter(); } virtual ~Item() { } void setTag(const QString &tag) { _tag = tag; } void setAdultFilter(AdultFilter filter) { _adultFilter = filter; } AdultFilter adultFilter() const { return _adultFilter; } QString tag() const { return _tag; } QString photoUrl() const { return _photoUrl.toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QLineEdit *leSearchFor; QComboBox *cbAdultFilter; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } QSize sizeHint() const { return QSize(500,height()); } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/deviantart"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT QString name() const { return DEVIANTART_ENGINE_NAME; } Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/include/ipernity.h0000644000000000000000000001140511676624760015026 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 IPERNITY_H #define IPERNITY_H #include #include #include #include "idcache.h" #include "httpengine.h" #define IPERNITY_ENGINE_NAME "Ipernity" #define IPERNITY_API_KEY "e8315d400000273A461d49b1b40377fd" #define SEARCH_TAGS "tags" #define SEARCH_TEXT "text" #define CONDITION "condition" #define LAST_PHOTO_IDS "lastPhotoIds" namespace Ipernity { enum Condition { And = 0, Or }; class Item : public HttpEngine::Item { Q_OBJECT QString _photoId; IdCache _lastPhotoIds; QUrl _photoUrl; QUrl _sourceUrl; QSize photoSize; QString photoOwner; QString photoDescription; QString photoTitle; QString photoLocation; QString _text; QStringList _tags; Condition _condition; int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; QVariant data() const; bool isValidItem() const { return _tags.size() || _text.size(); } public: Item(); Item(Item *item); virtual ~Item() { } void setTags(const QStringList &tags) { _tags = tags; _text.clear(); } void setCondition(Condition condition) { _condition = condition; } void setText(const QString &text) { _text = text; _tags.clear(); } QString text() const { return _text; } QStringList tags() const { return _tags; } Condition condition() const { return _condition; } bool isText() const { return !_text.isEmpty(); } bool areTags() const { return _tags.size(); } QString photoUrl() const { return _photoUrl.toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QLineEdit *leSearchFor; QComboBox *cbCondition; QRadioButton *rbTags; QRadioButton *rbText; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } QSize sizeHint() const { return QSize(500,height()); } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/ipernity"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } QString name() const { return IPERNITY_ENGINE_NAME; } Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/include/defs.h0000644000000000000000000000514711676624760014112 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 DEFS_H #define DEFS_H #include #define TEMP_PATH ".wally" #define MAX_PIXEL_NUMBER 9000000 #define MINUTES_UNIT 0 #define HOURS_UNIT 1 #define SECONDS_UNIT 2 #define MAIN_SECTION "Main" #define DISABLE_SPLASH_SCREEN "disableSplashScreen" #define QUIT_AFTER_BACKGROUND_CHANGE "quitAfterBackgroundChange" #define RANDOM_SEARCH "randomSearch" #define SIZE_CONSTRAINT "sizeConstraint" #define INTERVAL "interval" #define INTERVAL_UNIT "intervalUnit" #define BORDER_COLOR "borderColor" #define AUTO_COLOR "autoColor" #define WALLPAPER_POSITION "wallpaperPosition" #define SWITCH_ON_PLAY "switchOnPlay" #define PLAY_ON_START "playOnStart" #define RUN_ON_SYS_START "runOnSysStart" #define ONLY_LANDSCAPES "onlyLandscapes" #define EXIF_ROTATE_IMAGES "exifRotateImages" #define VIEW_INFO_IN_TOOLTIP "viewInfoInTooltip" #define VIEW_INFO_ON_PHOTO "viewInfoOnPhoto" #define INFO_POSITION_ON_PHOTO "infoPositionOnPhoto" #define USE_FULL_DESKTOP_AREA "useFullDesktopArea" #define LOCALE "locale" #define LAST_USED_ENGINE "lastUsedEngine" #define MIN_FREE_DISK_SPACE "minFreeDiskSpace" #define MIN_FREE_DISK_SPACE_FACTOR "minFreeDiskSpaceFactor" #define HISTORY_TIME_LIMIT "historyTimeLimit" #define HISTORY_TIME_LIMIT_FACTOR "historyTimeLimitFactor" #define VERSION "version" #define NETWORK_SECTION "Network" #define USE_PROXY "useProxy" #define USE_SYSTEM_PROXY "useSystemProxy" #define PROXY_TYPE "proxyType" #define PROXY_SERVER "proxyServer" #define PROXY_PORT "proxyPort" #define PROXY_AUTHENTICATION "proxyAuthentication" #define PROXY_USERNAME "proxyUsername" #define PROXY_PASSWORD "proxyPassword" typedef QMap > WallySettings; struct PhotoInfo { QString owner; QString title; QString description; QString location; QUrl sourceUrl; QString searchString; }; #endif wally-2.4.4/include/networkmanager.h0000644000000000000000000000536211676624760016214 0ustar rootroot#ifndef NETWORKMANAGER_H #define NETWORKMANAGER_H #include #include #include #include #include #include #include #include #include #include #include namespace NetworkPrivate { class HttpReqState; } namespace Network { class Reply; class Manager : public QObject { Q_OBJECT QNetworkProxy _proxy; public: explicit Manager(QObject *parent = 0) : QObject(parent) { } void setProxy(const QNetworkProxy &proxy) { _proxy = proxy; } Reply *get(const QNetworkRequest &req, bool recover = false); Reply *get(const QUrl &url, bool recover = false); Reply *get(const QUrl &url, const QString &fileName); Reply *post(const QNetworkRequest &req, bool recover = false); Reply *post(const QUrl &url, bool recover = false); Reply *post(const QUrl &url, const QString &fileName); QNetworkProxy proxy() const { return _proxy; } }; class Reply : public QObject { Q_OBJECT friend class Manager; friend class NetworkPrivate::HttpReqState; public: static const int MAX_TRIES = 5; static const int TIMEOUT = 30000; static const int BUF_SIZE = 16384; private: QNetworkAccessManager::Operation _operation; bool _isFirstRequest; bool _isRecoverable; int _totalSize; int _currentSize; QNetworkRequest _req; bool _isRecoverActive; bool _usingFile; QNetworkProxy _proxy; QByteArray _buffer; QFile _file; QStateMachine *_stateMachine; QPointer< QNetworkReply > _trackedReply; explicit Reply(QNetworkAccessManager::Operation operation, const QNetworkRequest &req, bool recover, const QNetworkProxy &proxy); explicit Reply(QNetworkAccessManager::Operation operation, const QNetworkRequest &req, const QString &fileName, const QNetworkProxy &proxy); void buildAndStartStateMachine(); void trackReply(QNetworkReply *reply) { _trackedReply = reply; } private slots: void updatePointers(); void updateInfo(int size, bool recoverable); void appendMoreData(const QByteArray &data); void signalOk(); void signalError(); public: bool isRecoverActive() const { return _isRecoverActive; } QNetworkRequest request() const { return _req; } int currentSize() const { return _currentSize; } int totalSize() const { return _totalSize; } QNetworkAccessManager::Operation operation() const { return _operation; } signals: void finished(bool ok, const QByteArray &data); void progress(qint64 bytesReceived, qint64 bytesTotal); public slots: void abort(); }; } #endif // NETWORKMANAGER_H wally-2.4.4/include/idcache.h0000644000000000000000000000574211676624760014552 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 IDCACHE_H #define IDCACHE_H #include #include #include #include template < typename T > class IdCache; template < typename T > QDataStream &operator<<(QDataStream &out, const IdCache< T > &cache); template < typename T > QDataStream &operator>>(QDataStream &in, IdCache< T > &cache); template < typename T > class IdCache { int _length; QMap< T,int > _map; void cleanOldest(); void updateCounters(const T &id); T findLowestId() const; public: IdCache(int length = 50) : _length(length) { } bool contains(const T &id) const; void insert(const T &id); friend QDataStream &operator<< < T >(QDataStream &out, const IdCache< T > &cache); friend QDataStream &operator>> < T >(QDataStream &in, IdCache< T > &cache); }; template < typename T > T IdCache< T >::findLowestId() const { T oldestId; int idValue = _length; QMapIterator< T,int > item(_map); while (item.hasNext()) { item.next(); if (idValue > item.value()) { oldestId = item.key(); idValue = item.value(); } } return oldestId; } template < typename T > void IdCache< T >::cleanOldest() { if (!_map.size() || (_map.size() < _length)) return; T oldestId = findLowestId(); _map.remove(oldestId); qDebug() << "IdCache: removed" << oldestId; } template < typename T > bool IdCache< T >::contains(const T &id) const { bool found = _map.contains(id); qDebug() << "IdCache: contains" << id << "=" << found; return found; } template < typename T > void IdCache< T >::updateCounters(const T &id) { QMutableMapIterator< T,int> item(_map); while (item.hasNext()) { item.next(); if (item.key() != id) item.setValue(item.value() - 1); } } template < typename T > void IdCache< T >::insert(const T &id) { qDebug() << "IdCache: added" << id; _map.insert(id,_length); updateCounters(id); cleanOldest(); } template < typename T > QDataStream &operator<<(QDataStream &out, const IdCache< T > &cache) { out << cache._map; return out; } template < typename T > QDataStream &operator>>(QDataStream &in, IdCache< T > &cache) { in >> cache._map; return in; } #endif wally-2.4.4/include/flickr.h0000644000000000000000000001337511676624760014445 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 FLICKR_H #define FLICKR_H #include #include #include #include "idcache.h" #include "httpengine.h" #define FLICKR_ENGINE_NAME "Flickr" #define FLICKR_API_KEY "99c82d50dc44a9d5bf7e54291f242511" #define FLICKR_PAGES_HARD_LIMIT 4000 #define LAST_PHOTO_IDS "lastPhotoIds" #define SEARCH_TAGS "tags" #define SEARCH_TEXT "text" #define TAGS_CONDITION "tagsCondition" #define SEARCH_ORDER "searchOrder" #define REQUESTED_SIZE "requestedSize" namespace Flickr { enum RequestedSize { Largest = 0, Smallest, Original, Square, Thumbnail, Small, Medium, Large }; enum TagsCondition { And = 0, Or }; enum SearchOrder { DatePostedAsc = 0, DatePostedDesc, DateTakenAsc, DateTakenDesc, InterestingnessAsc, InterestingnessDesc, Relevance }; const QString searchOrderStrings[] = { "date-posted-asc", "date-posted-desc", "date-taken-asc", "date-taken-desc", "interestingness-asc", "interestingness-desc", "relevance" }; class Item : public HttpEngine::Item { Q_OBJECT IdCache _lastPhotoIds; QString _photoId; QUrl _photoUrl; QString _text; QStringList _tags; TagsCondition _tagsCondition; SearchOrder _searchOrder; RequestedSize _requestedSize; int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; QVariant data() const; bool isValidItem() const { return _tags.size() || _text.size(); } public: Item(); Item(Item *item); virtual ~Item() { } void setTags(const QStringList &tags) { _tags = tags; _text.clear(); } void setTagsCondition(TagsCondition tagsCondition) { _tagsCondition = tagsCondition; } void setText(const QString &text) { _text = text; _tags.clear(); } void setRequestedSize(RequestedSize requestedSize) { _requestedSize = requestedSize; } void setSearchOrder(SearchOrder searchOrder) { _searchOrder = searchOrder; } RequestedSize requestedSize() const { return _requestedSize; } TagsCondition tagsCondition() const { return _tagsCondition; } SearchOrder searchOrder() const { return _searchOrder; } QString text() const { return _text; } QStringList tags() const { return _tags; } bool isText() const { return !_text.isEmpty(); } bool areTags() const { return _tags.size(); } QString photoUrl() const { return _photoUrl.toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QLineEdit *leSearchFor; QComboBox *cbTagsCondition; QRadioButton *rbTags; QRadioButton *rbText; QComboBox *cbRequestedSize; QComboBox *cbSearchOrder; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } QSize sizeHint() const { return QSize(500,height()); } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/flickr"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } QString name() const { return FLICKR_ENGINE_NAME; } Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/include/bing.h0000644000000000000000000001123211676624760014100 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 BING_H #define BING_H #include #include #include #include "idcache.h" #include "httpengine.h" #define BING_ENGINE_NAME "Bing" #define BING_API_KEY "define_here_your_api_key" #define TAGS "tags" #define TAGS_CONDITION "tagsCondition" #define ADULT_FILTER "adultFilter" #define LAST_PHOTO_URLS "lastPhotoUrls" namespace Bing { enum TagsCondition { And = 0, Or }; enum AdultFilter { Off = 0, Moderate, Strict }; class Item : public HttpEngine::Item { Q_OBJECT QStringList _tags; TagsCondition _tagsCondition; AdultFilter _adultFilter; QString photoTitle; QString photoDescription; IdCache _lastPhotoUrls; QUrl _photoUrl; QUrl _sourceUrl; QString photoOwner; QSize photoSize; int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; QVariant data() const; bool isValidItem() const { return _tags.size(); } public: Item(); Item(Item *item); virtual ~Item() { } void setTags(const QStringList &tags) { _tags = tags; } void setTagsCondition(TagsCondition tagsCondition) { _tagsCondition = tagsCondition; } void setAdultFilter(AdultFilter filter) { _adultFilter = filter; } AdultFilter adultFilter() const { return _adultFilter; } QStringList tags() const { return _tags; } TagsCondition tagsCondition() const { return _tagsCondition; } QString photoUrl() const { return _photoUrl.toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QLineEdit *leSearchFor; QComboBox *cbTagsCondition; QComboBox *cbAdultFilter; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } QSize sizeHint() const { return QSize(500,height()); } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/bing"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT QString name() const { return BING_ENGINE_NAME; } Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/include/diskinfo.h0000644000000000000000000000172411676624760014774 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 DISKINFO_H #define DISKINFO_H #include class DiskInfo { public: static qint64 freeSpace(const QString &fileName); }; #endif wally-2.4.4/include/google.h0000644000000000000000000001070511676624760014441 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 GOOGLE_H #define GOOGLE_H #include #include #include #include "idcache.h" #include "httpengine.h" #define GOOGLE_ENGINE_NAME "Google" #define GOOGLE_API_KEY "ABQIAAAA6yfCsIkM_Vt-C0mSqmDuOBTc46Xk-AvcM6t7UbUSWuuuyCHvbhQRZwo2dBTvVc7kshkl91dzDrldmQ" #define TEXT "text" #define ADULT_FILTER "adultFilter" #define LAST_PHOTO_IDS "lastPhotoIds" namespace Google { enum AdultFilter { Off = 0, Moderate, Strict }; class Item : public HttpEngine::Item { Q_OBJECT QString _text; AdultFilter _adultFilter; QString _photoId; QString photoTitle; QString photoDescription; IdCache _lastPhotoIds; QUrl _photoUrl; QUrl _sourceUrl; QString photoOwner; QSize photoSize; int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; QVariant data() const; bool isValidItem() const { return _text.size(); } public: Item(); Item(Item *item); virtual ~Item() { } void setText(const QString &text) { _text = text; } void setAdultFilter(AdultFilter filter) { _adultFilter = filter; } AdultFilter adultFilter() const { return _adultFilter; } QString text() const { return _text; } QString photoUrl() const { return _photoUrl.toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QLineEdit *leSearchFor; QComboBox *cbAdultFilter; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } QSize sizeHint() const { return QSize(500,height()); } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/google"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT QString name() const { return GOOGLE_ENGINE_NAME; } Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/include/httpengine.h0000644000000000000000000001250611676624760015333 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 HTTPENGINE_H #define HTTPENGINE_H #include #include #include #include "ui_http.h" #include "networkmanager.h" #include "engine.h" #include "xtengine.h" #define PAGE_INDEX "pageIndex" #define PAGES "pages" namespace HttpEngine { enum Operation { Get, Post }; class Item : public XtEngine::Item { Q_OBJECT bool _savePhotos; QString _photosPath; int _pageIndex; int _pages; int _consecutiveSearchesFailed; void loadState(QSettings &settings, const QString &group); void saveState(QSettings &settings, const QString &engineName, int id) const; void loadSettings(QSettings &settings, const QString &group); void saveSettings(QSettings &settings, const QString &engineName, int id) const; protected: virtual QUrl doPrepareInit(Operation &op) = 0; virtual void doProcessInitResult(const QByteArray & /* response */) { } virtual int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const = 0; virtual QUrl doPrepareSearch(Operation &op) = 0; virtual bool doProcessSearchResult(const QByteArray &response, int &newPagesCount) = 0; virtual QSize doProcessSizeRequestResult(const QByteArray &response) = 0; virtual void doProcessDownloadResult(const QFileInfo & /* fileInfo */) { } virtual PhotoInfo doProcessInfoCollectResult(const QByteArray &response) = 0; virtual void doLoadSettings(QSettings &settings) = 0; virtual void doSaveSettings(QSettings &settings) const = 0; virtual void doLoadState(QSettings & /* settings */) { } virtual void doSaveState(QSettings & /* settings */) const { } int pageIndex() const { return _pageIndex; } public: Item(); Item(Item *item); virtual ~Item() { } void resetPages() { _pageIndex = _pages = 0; } QUrl prepareInit(Operation &op); void processInitResult(const QByteArray &response); QUrl prepareSearch(bool randomMode, Operation &op); bool processSearchResult(const QByteArray &response); virtual QUrl prepareSizeRequest(Operation &op) = 0; QSize processSizeRequestResult(const QByteArray &response); virtual QUrl prepareDownload(Operation &op) = 0; void processDownloadResult(const QFileInfo &fileInfo, bool belowThreshold); virtual QUrl prepareInfoCollect(Operation &op) = 0; PhotoInfo processInfoCollectResult(const QByteArray &response); void setPhotosPath(const QString &photosPath) { _photosPath = photosPath; } void setSavePhotos(bool save) { _savePhotos = save; } QString photosPath() const { return _photosPath; } bool arePhotosSaved() const { return _savePhotos; } virtual QString photoUrl() const = 0; }; class Core : public XtEngine::Core { Q_OBJECT bool canceling; bool cancelSignaled; qint64 _diskSpaceThreshold; Network::Manager *initHttp; Network::Manager *searchHttp; Network::Manager *sizeRequestHttp; Network::Manager *downloadHttp; Network::Manager *infoCollectHttp; QPointer< Network::Reply > currentReply; QFileInfo httpFile; QNetworkProxy httpProxy; QNetworkProxy guessProxy(const QUrl &url); private slots: void httpInitDone(bool ok, const QByteArray &data); void httpSearchDone(bool ok, const QByteArray &data); void httpSizeRequestDone(bool ok, const QByteArray &data); void httpDownloadDone(bool ok, const QByteArray &data); void httpInfoCollectDone(bool ok, const QByteArray &data); public: Core(const QString &tempStorageDir, QObject *parent = 0); virtual ~Core() { } void setProxy(const QNetworkProxy &proxy); void setFreeDiskSpaceThreshold(qint64 diskSpaceThreshold) { _diskSpaceThreshold = diskSpaceThreshold; } QString photoUrl() const { return qobject_cast (list.at(currentItemIndex))->photoUrl(); } public slots: void init(); void search(bool randomMode); void sizeLookup(); void download(); void infoCollect(); void cancel(); }; class SettingsWidget : public XtEngine::SettingsWidget, private Ui::HttpSettingsWidget { Q_OBJECT bool isRefreshing; private slots: void on_tbAdd_clicked(); void on_tbDel_clicked(); void on_lvSets_doubleClicked(const QModelIndex &index); void on_tbPhotosPath_clicked(); void updateWidgets(const QItemSelection &selected, const QItemSelection &deselected); void on_cbSavePhotos_stateChanged(int state); void on_lePhotosPath_textChanged(const QString &text); public: SettingsWidget(Engine::Core *core, QWidget *parent = 0); virtual ~SettingsWidget() { } }; } #endif wally-2.4.4/include/version.h0000644000000000000000000000543711676624760014660 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 VERSION_H #define VERSION_H #include #include class Version { int _majorNumber; int _minorNumber; int _patchLevelNumber; public: Version(int majorNumber, int minorNumber, int patchLevelNumber) : _majorNumber(majorNumber), _minorNumber(minorNumber), _patchLevelNumber(patchLevelNumber) { } Version(const QString &versionStr) { QStringList versionParts = versionStr.split("."); _majorNumber = _minorNumber = _patchLevelNumber = 0; if (versionParts.size() > 0) _majorNumber = versionParts.at(0).toInt(); if (versionParts.size() > 1) _minorNumber = versionParts.at(1).toInt(); if (versionParts.size() > 2) _patchLevelNumber = versionParts.at(2).toInt(); } int majorNumber() const { return _majorNumber; } int minorNumber() const { return _minorNumber; } int patchLevelNumber() const { return _patchLevelNumber; } QString toString() const { return QString("%1.%2.%3").arg(majorNumber()).arg(minorNumber()).arg(patchLevelNumber()); } bool operator<(const Version &version) { return (majorNumber() < version.majorNumber()) || ((majorNumber() == version.majorNumber()) && (minorNumber() < version.minorNumber())) || ((majorNumber() == version.majorNumber()) && (minorNumber() == version.minorNumber()) && (patchLevelNumber() < version.patchLevelNumber())); } bool operator<=(const Version &version) { return (*this < version) || (*this == version); } bool operator>(const Version &version) { return !(*this <= version); } bool operator>=(const Version &version) { return !(*this < version); } bool operator==(const Version &version) { return (majorNumber() == version.majorNumber()) && (minorNumber() == version.minorNumber()) && (patchLevelNumber() == version.patchLevelNumber()); } bool operator!=(const Version &version) { return !(*this == version); } }; #endif wally-2.4.4/include/mapviewer.h0000644000000000000000000001064211676624760015164 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 MAPVIEWER_H #define MAPVIEWER_H #include #include #include "gui.h" #define K 2.30341254338 #define ANCHOR_HALF_LENGTH 4 namespace Map { class AnchorRect : public QObject, public QGraphicsRectItem { Q_OBJECT public: enum Position { noAnchor, topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left }; private: Position _position; protected: void hoverEnterEvent(QGraphicsSceneHoverEvent *event); void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); public: AnchorRect(Position position, QGraphicsItem *parent = 0); virtual ~AnchorRect() { } signals: void selected(AnchorRect::Position anchor); }; class SelectionRect : public QObject, public QGraphicsRectItem { Q_OBJECT QMap rects; QPointF startP; QPointF startMouseP; QRectF startRect; AnchorRect::Position _selectedAnchor; void setupRect(); void updateAnchorsPosition(); private slots: void onAnchorSelected(AnchorRect::Position anchor); protected: void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); public: SelectionRect(QGraphicsItem *parent = 0); SelectionRect(const QRectF &rect, QGraphicsItem *parent = 0); SelectionRect(qreal x, qreal y, qreal width, qreal height, QGraphicsItem *parent = 0); virtual ~SelectionRect() { } void setPos(const QPointF &pos); void setPos(qreal x, qreal y); void setRect(const QRectF &rectangle); void setRect(qreal x, qreal y, qreal width, qreal height); QRectF boundingRect() const; }; class MapItem : public QGraphicsPixmapItem { bool drawingRect; QPointF startP; SelectionRect *rectItem; void setupGrid(); protected: void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); public: MapItem(QGraphicsItem *parent = 0); MapItem(const QPixmap &pixmap, QGraphicsItem *parent = 0); virtual ~MapItem() { } void setLLRect(const QRectF &llRect); QRectF llRect() const; QPainterPath shape() const; }; class Scene : public QGraphicsScene { Q_OBJECT MapItem *mapItem; QPointF rectPos; public: Scene(QObject *parent = 0); virtual ~Scene() { } QSizeF mapSize() const { return mapItem->boundingRect().size(); } void setLLRect(const QRectF &llRect) { mapItem->setLLRect(llRect); } QRectF llRect() const { return mapItem->llRect(); } }; class View : public QGraphicsView { Q_OBJECT QSignalMapper *signalMapper; int currentZoom; QAction *newZoomAction(int zoomFactor); private slots: void zoom(int zoomFactor); public: View(QWidget *parent = 0); View(QGraphicsScene *scene, QWidget *parent = 0); virtual ~View() { } QSize minimumSizeHint() const { return sizeHint(); } QSize sizeHint() const { return qobject_cast (scene())->mapSize().toSize() + QSize(verticalScrollBar()->width() + 2 * ANCHOR_HALF_LENGTH, horizontalScrollBar()->height() + 2 * ANCHOR_HALF_LENGTH); } }; class Viewer : public Gui::Dialog { Q_OBJECT Scene *scene; void setupUI(); public: Viewer(QWidget *parent = 0); Viewer(const QRectF &llRect, QWidget *parent = 0); virtual ~Viewer() { } QRectF llRect() const { return scene->llRect(); } QSize sizeHint() const { return scene->mapSize().toSize(); } }; } #endif wally-2.4.4/include/json.h0000644000000000000000000000565611676624760014147 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 JSON_H #define JSON_H #include #include #include #include #include namespace JSON { class Value; class Array; class Object; class Reader; class Writer; class Element { friend class Value; friend class Array; friend class Object; friend class Reader; friend class Writer; protected: virtual void read(QIODevice *device) = 0; virtual void write(QIODevice *device) = 0; static char readNextChar(QIODevice *device); static char readNext(QIODevice *device); static QString readString(QIODevice *device); static QVariant readNumber(QIODevice *device); public: enum ElementType { ElementValue, ElementArray, ElementObject }; virtual ~Element() { } virtual ElementType elementType() const = 0; }; class Value : public QVariant, public Element { protected: void read(QIODevice *device); void write(QIODevice *device); public: ElementType elementType() const { return ElementValue; } }; class Array : public QVector< Element * >, public Element { protected: void read(QIODevice *device); void write(QIODevice *device); public: virtual ~Array() { qDeleteAll(*this); } ElementType elementType() const { return ElementArray; } }; class Object : public QMap< QString, Element * >, public Element { protected: void read(QIODevice *device); void write(QIODevice *device); public: virtual ~Object() { qDeleteAll(values()); } ElementType elementType() const { return ElementObject; } }; class Reader { QIODevice *_device; Element *_element; void parse(); public: Reader(QIODevice *device) : _device(device), _element(0) { parse(); } virtual ~Reader() { delete _element; } QIODevice *device() const { return _device; } Element *element() const { return _element; } }; class Writer { QIODevice *_device; void write(Element *element); public: Writer(Element *element, QIODevice *device) : _device(device) { write(element); } QIODevice *device() const { return _device; } }; } #endif wally-2.4.4/include/networkmanager_p.h0000644000000000000000000002041711676624760016531 0ustar rootroot#ifndef NETWORKMANAGER_P_H #define NETWORKMANAGER_P_H #include #include #include #include #include #include #include #include #include #include #include #include #ifdef NMDEBUG #include #endif namespace Network { class Reply; } namespace NetworkPrivate { class OKEvent : public QEvent { friend class HttpReqState; friend class NewTryState; friend class CheckDataState; public: static const int Type = QEvent::User + 1; private: explicit OKEvent() : QEvent(QEvent::Type(Type)) { } }; class ErrorEvent : public QEvent { friend class HttpReqState; friend class NewTryState; friend class CheckDataState; public: static const int Type = QEvent::User + 2; private: explicit ErrorEvent() : QEvent(QEvent::Type(Type)) { } }; class ReqWRecEvent : public QEvent { friend class InitialState; public: static const int Type = QEvent::User + 3; private: explicit ReqWRecEvent() : QEvent(QEvent::Type(Type)) { } }; class ReqWORecEvent : public QEvent { friend class InitialState; public: static const int Type = QEvent::User + 4; private: explicit ReqWORecEvent() : QEvent(QEvent::Type(Type)) { } }; class Transition : public QAbstractTransition { Q_OBJECT protected: explicit Transition(QAbstractState *target, QState *sourceState = 0) : QAbstractTransition(sourceState) { setTargetState(target); } #ifdef NMDEBUG void onTransition(QEvent *event) { qDebug() << "entered state " << metaObject()->className() << ", cause of event " << event->type(); } #else void onTransition(QEvent *) { } #endif }; class StartWRecTransition : public Transition { Q_OBJECT friend class Network::Reply; explicit StartWRecTransition(QAbstractState *target, QState *sourceState = 0) : Transition(target,sourceState) { } protected: bool eventTest(QEvent *event) { return (event->type() == ReqWRecEvent::Type); } }; class StartWORecTransition : public Transition { Q_OBJECT friend class Network::Reply; explicit StartWORecTransition(QAbstractState *target, QState *sourceState = 0) : Transition(target,sourceState) { } protected: bool eventTest(QEvent *event) { return (event->type() == ReqWORecEvent::Type); } }; class OKTransition : public Transition { Q_OBJECT friend class Network::Reply; explicit OKTransition(QAbstractState *target, QState *sourceState = 0) : Transition(target,sourceState) { } protected: bool eventTest(QEvent *event) { return (event->type() == OKEvent::Type); } }; class ErrorTransition : public Transition { Q_OBJECT friend class Network::Reply; explicit ErrorTransition(QAbstractState *target, QState *sourceState = 0) : Transition(target,sourceState) { } protected: bool eventTest(QEvent *event) { return (event->type() == ErrorEvent::Type); } }; class OneMoreTryTransition : public Transition { Q_OBJECT friend class Network::Reply; explicit OneMoreTryTransition(QAbstractState *target, QState *sourceState = 0) : Transition(target,sourceState) { } protected: bool eventTest(QEvent *event) { return (event->type() == OKEvent::Type); } }; class State : public QState { Q_OBJECT protected: #ifdef NMDEBUG void onEntry(QEvent *event) { qDebug() << "entered state " << metaObject()->className() << ", cause of event " << event->type(); } void onExit(QEvent *event) { qDebug() << "exited state " << metaObject()->className() << ", cause of event " << event->type(); } #else void onEntry(QEvent *) { } void onExit(QEvent *) { } #endif public: State(QState *parent = 0) : QState(parent) { } State(ChildMode childMode, QState *parent = 0) : QState(childMode,parent) { } }; class FinalState : public QFinalState { Q_OBJECT protected: #ifdef NMDEBUG void onEntry(QEvent *event) { qDebug() << "entered final state " << metaObject()->className() << ", cause of event " << event->type(); } void onExit(QEvent *event) { qDebug() << "exited final state " << metaObject()->className() << ", cause of event " << event->type(); } #else void onEntry(QEvent *) { } void onExit(QEvent *) { } #endif FinalState(QState *parent = 0) : QFinalState(parent) { } }; class OKState : public FinalState { Q_OBJECT friend class Network::Reply; OKState(QState *parent = 0) : FinalState(parent) { } }; class ErrorState : public FinalState { Q_OBJECT friend class Network::Reply; ErrorState(QState *parent = 0) : FinalState(parent) { } }; class InitialState : public State { Q_OBJECT friend class Network::Reply; bool _recover; explicit InitialState(bool recover, QState *parent = 0) : State(parent), _recover(recover) { } protected: void onEntry(QEvent *event); }; class NewTryState : public State { Q_OBJECT friend class Network::Reply; int _currentTry; explicit NewTryState(QState *parent = 0) : State(parent), _currentTry(0) { } protected: void onEntry(QEvent *event); }; class NetworkAccessManager : public QNetworkAccessManager { Q_OBJECT QSignalMapper *_signalMapper; private slots: void abortReply(QObject *object); protected: QNetworkReply *createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData = 0); public: NetworkAccessManager(QObject *parent = 0); }; class HttpReqState : public State { Q_OBJECT Network::Reply *_networkReply; NetworkAccessManager *_manager; QNetworkRequest _request; QNetworkReply *createReply(QNetworkAccessManager *manager, const QNetworkRequest &request); private slots: void processReply(QNetworkReply *reply); void processReplyData(); protected: explicit HttpReqState(Network::Reply *reply, const QNetworkProxy &proxy, const QNetworkRequest &request, QState *parent = 0); virtual QNetworkReply *doCreateReply(QNetworkAccessManager *manager, const QNetworkRequest &request) = 0; void onEntry(QEvent *event); virtual void doProcessReply(QNetworkReply *reply) = 0; virtual void doProcessReplyData(const QByteArray &data) = 0; Network::Reply *networkReply() { return _networkReply; } }; class HeadReqState : public HttpReqState { Q_OBJECT friend class Network::Reply; explicit HeadReqState(Network::Reply *reply, const QNetworkProxy &proxy, const QNetworkRequest &request, QState *parent = 0) : HttpReqState(reply,proxy,request,parent) { } protected: QNetworkReply *doCreateReply(QNetworkAccessManager *manager, const QNetworkRequest &request); void doProcessReply(QNetworkReply *reply); void doProcessReplyData(const QByteArray &) { } signals: void headerInfoAvailable(int size, bool recoverable); }; class GetReqState : public HttpReqState { Q_OBJECT friend class Network::Reply; explicit GetReqState(Network::Reply *reply, const QNetworkProxy &proxy, const QNetworkRequest &request, QState *parent = 0) : HttpReqState(reply,proxy,request,parent) { } protected: QNetworkReply *doCreateReply(QNetworkAccessManager *manager, const QNetworkRequest &request); void doProcessReply(QNetworkReply *) { } void doProcessReplyData(const QByteArray &data); signals: void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); void dataAvailable(const QByteArray &data); void newRequest(); }; class CheckDataState : public State { Q_OBJECT friend class Network::Reply; Network::Reply *_reply; explicit CheckDataState(Network::Reply *reply, QState *parent = 0) : State(parent), _reply(reply) { } protected: void onEntry(QEvent *event); }; } #endif // NETWORKMANAGER_P_H wally-2.4.4/include/smugmug.h0000644000000000000000000001023711676624760014651 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 SMUGMUG_H #define SMUGMUG_H #include #include #include #include "idcache.h" #include "httpengine.h" #define SMUGMUG_ENGINE_NAME "SmugMug" #define SEARCH_TEXT "text" #define LAST_PHOTO_URLS "lastPhotoUrls" namespace SmugMug { class Item : public HttpEngine::Item { Q_OBJECT QUrl _photoUrl; IdCache _lastPhotoUrls; QUrl _sourceUrl; QString photoOwner; QString photoDescription; QString photoTitle; QString _text; QSize photoSize; int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; QVariant data() const; bool isValidItem() const { return _text.size(); } public: Item() : HttpEngine::Item() { } Item(Item *item); virtual ~Item() { } void setText(const QString &text) { _text = text; } QString text() const { return _text; } QString photoUrl() const { return _photoUrl.toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QLineEdit *leSearchFor; QComboBox *cbCondition; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } QSize sizeHint() const { return QSize(500,height()); } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/smugmug"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } QString name() const { return SMUGMUG_ENGINE_NAME; } QAbstractButton *newButton(QWidget *parent = 0); Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/include/yahoo.h0000644000000000000000000001124611676624760014305 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 YAHOO_H #define YAHOO_H #include #include #include #include "idcache.h" #include "httpengine.h" #define YAHOO_ENGINE_NAME "Yahoo!" #define YAHOO_API_KEY "OZuqlYDV34FXeHlNWoxD_g2aJ5TMYkHGImsQOucCJTyvsxwM26msYhVaGGYsx_B0jSM-" #define TAGS "tags" #define TAGS_CONDITION "tagsCondition" #define CONTENT_FILTERED "contentFiltered" #define LAST_PHOTO_URLS "lastPhotoUrls" namespace Yahoo { enum TagsCondition { And = 0, Or }; class Item : public HttpEngine::Item { Q_OBJECT QStringList _tags; TagsCondition _tagsCondition; bool _contentFiltered; QString photoTitle; QString photoDescription; QUrl _photoUrl; IdCache _lastPhotoUrls; QUrl _sourceUrl; QString photoOwner; QSize photoSize; int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; QVariant data() const; bool isValidItem() const { return _tags.size(); } public: Item(); Item(Item *item); virtual ~Item() { } void setTags(const QStringList &tags) { _tags = tags; } void setTagsCondition(TagsCondition tagsCondition) { _tagsCondition = tagsCondition; } void setFilterContent(bool filter) { _contentFiltered = filter; } bool isContentFiltered() const { return _contentFiltered; } QStringList tags() const { return _tags; } TagsCondition tagsCondition() const { return _tagsCondition; } QString photoUrl() const { return _photoUrl.toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QLineEdit *leSearchFor; QComboBox *cbTagsCondition; QCheckBox *cbFilterContent; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } QSize sizeHint() const { return QSize(500,height()); } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/yahoo"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT QString name() const { return YAHOO_ENGINE_NAME; } Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/include/wally.h0000644000000000000000000001640211676624760014315 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 WALLY_H #define WALLY_H #include #include #include #include "defs.h" #include "engine.h" #include "version.h" #define DATABASE_CURRENT_VERSION 1 #define DEFAULT_INTERVAL 2 #define APPLICATION_NAME "Wally" #define APPLICATION_VERSION "2.4.4" #define RUN_PATH "run" #define PID_FILENAME "wally.pid" #define MAX_SIZE_FAILURES 20 #define TIMEOUT 30000 #if defined(Q_WS_WIN) || defined(Q_WS_PM) #include #endif #ifdef Q_WS_WIN #include #endif namespace Wally { class Application : public QApplication { Q_OBJECT public: enum Position { Centered = 0, Tiled = 1, CenterTiled = 2, CenteredMaxpect = 3, TiledMaxpect = 4, Scaled = 5, CenteredAutoFit = 6, ScaleAndCrop = 7, SymmetricalTiled = 8, MirroredTiled = 9, SymmetricalMirroredTiled = 10 }; private: #ifdef Q_WS_X11 enum WindowManager { wmUnknown, wmKDE3, wmKDE4, wmGnome, wmXfce, wmFluxbox, wmBlackbox, wmWindowMaker, wmFVWM, wmGnomeShell }; #endif enum States { sIdle, sSelectNextEngineFirst, sInitEngine, sSearchRequest, sSelectNextEngineNext, sSizeRequest, sDownload, sInfoRequest, sCancel}; enum Events { eOk, eNoEngines, eSearchNoData, eWrongSize, eCancel, ePlayTimeout, eDownloadFailed, eDownloadOkButWrongSize }; bool playTimerWasActive; bool playWasActive; bool singleInstance; bool commandLineHelp; bool captureKeymaps; bool dontSwitchState; #if defined(Q_WS_WIN) || defined(Q_WS_PM) std::ofstream fout; bool adWarningFired; #endif #ifdef Q_WS_X11 WindowManager windowManager; void autoDetectWM(); #endif States currentState; QLocale currentLocale; int sizeFailures; void switchToNextState(Events event); QTimer *timer; QString _tempStorageDir; int markEngineIndex; int currentEngineIndex; QList engines; void selectEngine(int index); QSystemTrayIcon *trayIcon; QAction *savePhotoAction; QAction *playAction; QAction *cancelAction; QAction *nextPhotoAction; QAction *configureAction; QAction *aboutAction; QAction *aboutQtAction; QAction *historyAction; QAction *viewSourceAction; QAction *quitAction; QAction *getExifInfoAction; QAction *italianLanguageAction; QAction *englishLanguageAction; QAction *spanishLanguageAction; QAction *germanLanguageAction; QAction *frenchLanguageAction; QAction *russianLanguageAction; QAction *brazilianPortugueseLanguageAction; QAction *czechLanguageAction; QAction *polishLanguageAction; QAction *chineseLanguageAction; QAction *catalanLanguageAction; QAction *greekLanguageAction; QAction *koreanLanguageAction; QAction *hungarianLanguageAction; QAction *danishLanguageAction; QAction *swedishLanguageAction; QAction *turkishLanguageAction; QWidget *hiddenWidgetForLanguagesActions; QList languagesActions; QSignalMapper *languagesSignalMapper; QMenu *contextMenu; QMenu *cancelContextMenu; QMenu *languagesMenu; QMap translators; QSqlDatabase db; void initializeDB(); void updateDBVersion(); void updateDB(); void cleanHistory(int now, int timeBack, int timeBackFactor); QSize currentPhotoSize; QFileInfo currentFile; PhotoInfo currentPhotoInfo; bool isSizeValid(const QSize &size) const; static bool isCenterStored(const QPoint ¢er, const QList< QPair< QPoint,QPair > > ¢ers); bool isCenterInsideDesktop(const QPoint ¢er, const QSize &pixmapSize, const QSize &desktopSize); void recFillCentersList(const QSize &desktopSize, const QSize &pixmapSize, QList< QPair< QPoint,QPair > > ¢ers, const QPoint ¢er, bool horizontalFlip, bool verticalFlip); void fillCentersList(const QSize &desktopSize, QSize pixmapSize, QList< QPair< QPoint,QPair > > ¢ers); QFileInfo adaptPhoto(const QFileInfo &file, const QString &format, const PhotoInfo &info); void tryCompletePhotoInfo(); WallySettings settings; void saveEnginesState(); void saveSettings(); void applySettings(WallySettings newSettings); void checkPlayEnableable(); bool isPIDBelongingToWally(int pid) const; void checkSingleInstance(); void retranslateMenu(); void drawTextWithShadowOnScene(const QString &text, QGraphicsScene *scene, Qt::AlignmentFlag alignment, int &y, bool isTitle = false); static void printDebugMsg(QtMsgType type, const char *msg); static bool actionCaseSensitiveLessThan(QAction *a1, QAction *a2); private slots: void start(); void setupActions(); void setupTrayIcon(); void setupMenu(); void initCompleted(); void processSearchResult(bool hasData); void processPhotoSize(const QSize &size); void processDownloadedPhoto(bool ok, const QFileInfo &localFile); void processCollectedInfo(const PhotoInfo &info); void switchToIdle(); void execTrayAction(QSystemTrayIcon::ActivationReason reason); void execPlay(); void execPause(); void execAbout(); void execAboutQt(); void execSavePhoto(); void execShowSettings(); void execCancel(); void execNextPhoto(); void execExploreImageSource(); void execShowHistory(); void execGetExifInfo(); void changeLanguage(const QString &newLocaleName); void showPhotoOnScreen(); void showPhotoOnScreen(const QString &engineName); public: Application(int &argc, char **argv); virtual ~Application(); bool isSingleInstance() const { return singleInstance; } bool isCommandLineHelp() const { return commandLineHelp; } QString tempStorageDir() const { return _tempStorageDir; } void initialize(); void loadLanguages(); void addEngine(Engine::Core *e); void setupBeforeLaunch(); void loadSettings(); Version currentVersion() const; #ifdef Q_WS_X11 bool x11EventFilter(XEvent *event); #endif #ifdef Q_WS_WIN bool winEventFilter(MSG *msg, long *result); #endif signals: void init(); void search(bool randomMode); void sizeLookup(); void download(); void infoCollect(); void cancel(); public slots: void deActivate(); void reActivate(); void showTrayMessage(); void clearHistory(); }; } #endif wally-2.4.4/include/about.h0000644000000000000000000000212011676624760014267 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 ABOUT_H #define ABOUT_H #include #include #include "ui_about.h" #include "gui.h" class AboutDialog : public Gui::Dialog, private Ui::AboutDialog { Q_OBJECT public: AboutDialog(QWidget *parent = 0); virtual ~AboutDialog() { } }; #endif wally-2.4.4/include/history.h0000644000000000000000000001136611676624760014672 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 HISTORY_H #define HISTORY_H #include #include #include #include #include "networkmanager.h" #include "defs.h" #include "gui.h" namespace History { class SortModel : public QSortFilterProxyModel { protected: bool lessThan(const QModelIndex &left, const QModelIndex &right) const; public: SortModel(QObject *parent = 0) : QSortFilterProxyModel(parent) { } virtual ~SortModel() { } }; class EngineQueryModel : public QSqlQueryModel { Q_OBJECT public: EngineQueryModel(const QSqlDatabase &db, QObject *parent = 0); virtual ~EngineQueryModel() { } QVariant data(const QModelIndex &item, int role = Qt::DisplayRole) const; }; class TagsQueryModel : public QSqlQueryModel { Q_OBJECT QSqlDatabase _db; public: TagsQueryModel(const QSqlDatabase &db, QObject *parent = 0); virtual ~TagsQueryModel() { } QVariant data(const QModelIndex &item, int role = Qt::DisplayRole) const; void selectEngine(const QString &engineName); }; class PhotosQueryModel : public QSqlQueryModel { Q_OBJECT QSqlQuery currentQuery; QSqlDatabase _db; QTimer sizeHintTimer; mutable QMap sizeHints; QString formatCaption(const QSqlRecord &itemRecord) const; QWidget *createWidget(const QSqlRecord &itemRecord) const; private slots: void calculateSizeHints(); protected: void queryChange(); public: PhotosQueryModel(const QSqlDatabase &db, QObject *parent = 0); virtual ~PhotosQueryModel() { } QVariant data(const QModelIndex &item, int role = Qt::DisplayRole) const; void selectData(const QString &engineName, const QString &tags); signals: void updateViewItem(const QModelIndex &index); }; class PhotoThumbnail : public QItemDelegate { Q_OBJECT QPalette _palette; public: PhotoThumbnail(const QPalette &palette, QObject *parent = 0) : QItemDelegate(parent), _palette(palette) { } virtual ~PhotoThumbnail() { } void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; class Dialog : public Gui::Dialog { Q_OBJECT enum Request { reqWallpaper, reqFile, reqView }; Request request; QSqlDatabase _db; QString _tempStorageDir; QString fileName; Network::Manager *http; QNetworkProxy httpProxy; QProgressDialog *httpProgressDialog; QProgressDialog *newHttpProgressDialog(QWidget *parent = 0); void initHttp(); EngineQueryModel *enginesQueryModel; SortModel *sortedEnginesQueryModel; TagsQueryModel *tagsQueryModel; SortModel *sortedTagsQueryModel; PhotosQueryModel *photosQueryModel; QItemSelectionModel *sortedEnginesSelectionModel; QItemSelectionModel *sortedTagsSelectionModel; QItemSelectionModel *photosSelectionModel; QListView *enginesView; QListView *tagsView; QListView *photosView; QAction *exploreSourceAction; void initializeModelsAndViews(); void initializeActions(); QNetworkProxy guessProxy(const QUrl &url); private slots: void httpDone(bool ok, const QByteArray &data); void httpDownloading(qint64 done, qint64 total); void changeTagsList(const QModelIndex ¤t, const QModelIndex &previous); void changePhotosView(const QModelIndex ¤t, const QModelIndex &previous); void execSavePhoto(); void execSetAsBackground(); void execExploreImageSource(); void execViewPhoto(); void execGetExifInfo(); void updateContextMenuState(const QModelIndex ¤t, const QModelIndex &previous); public: Dialog(const QSqlDatabase &db, const QString &tempStorageDir, QWidget *parent = 0); virtual ~Dialog() { } void setProxy(const QNetworkProxy &proxy); signals: void photoDownloaded(bool ok, const QFileInfo &localFile); void infoCollected(const PhotoInfo &info); void changePhoto(const QString &engineName); }; } Q_DECLARE_METATYPE(QWidget *) #endif wally-2.4.4/include/viewer.h0000644000000000000000000000274411676624760014472 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 VIEWER_H #define VIEWER_H #include #include #include "gui.h" #include "ui_viewer.h" class Viewer : public Gui::Dialog, private Ui::Viewer { Q_OBJECT QPixmap _pixmap; QMatrix _zoomMatrix; QMatrix _rotationMatrix; private slots: void on_actionFitToWindow_triggered(); void on_actionShowFullImage_triggered(); void on_actionZoomIn_triggered(); void on_actionZoomOut_triggered(); void on_actionRotateClockwise_triggered(); void on_actionRotateCClockwise_triggered(); protected: void showEvent(QShowEvent *event); public: Viewer(QWidget *parent); virtual ~Viewer() { } void setPixmap(const QPixmap &pixmap); }; #endif wally-2.4.4/include/settings.h0000644000000000000000000000621411676624760015025 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 SETTINGS_H #define SETTINGS_H #include #include #include #include "ui_settings.h" #include "gui.h" #include "defs.h" #include "engine.h" class PositionModel : public QAbstractTableModel { Q_OBJECT public: PositionModel(QObject *parent = 0) : QAbstractTableModel(parent) { } int columnCount(const QModelIndex & /* parent */ = QModelIndex()) const { return 2; } QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; int rowCount(const QModelIndex & /* parent */ = QModelIndex()) const; }; class PositionDelegate : public QItemDelegate { QPalette _palette; public: PositionDelegate(const QPalette &palette, QObject *parent = 0) : QItemDelegate(parent), _palette(palette) { } void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; }; class PositionLabelDelegate : public QItemDelegate { public: PositionLabelDelegate(QObject *parent = 0) : QItemDelegate(parent) { } void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; class SettingsDialog : public Gui::Dialog, private Ui::SettingsDialog { Q_OBJECT bool firstShowEvent; bool loadingSettings; WallySettings _settings; Gui::EngineButton *settingsButton; QList settingsWidgets; private slots: void on_bbResult_clicked(QAbstractButton *button); void on_sbInterval_valueChanged(int i); void on_rbProxyConnection_toggled(bool checked); void settingsModified(); void listWidgetsSelectionChanged(); void on_tbRemoveAll_clicked(); void on_tbRemove_clicked(); void on_tbAddAll_clicked(); void on_tbAdd_clicked(); void on_pbClearHistory_clicked(); void changeInterval(); void on_pbPosition_clicked(); protected: void showEvent(QShowEvent *event); public: SettingsDialog(QWidget *parent = 0); virtual ~SettingsDialog() { } void addSettingsWidget(Engine::SettingsWidget *settingsWidget); void loadSettings(const WallySettings &mainSettings); WallySettings settings(); QMap activations() const; signals: void clearHistory(); public slots: void done(int r); }; #endif wally-2.4.4/include/pikeo.h0000644000000000000000000001133111676624760014270 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 PIKEO_H #define PIKEO_H #include #include #include #include "idcache.h" #include "httpengine.h" #define PIKEO_ENGINE_NAME "Pikeo" #define PIKEO_API_KEY "insert_here_your_api_key" #define PIKEO_SECRET_KEY "insert_here_your_secret_key" #define TAGS "tags" #define SEARCH_ORDER "searchOrder" #define ASCENDING "ascending" #define LAST_PHOTO_IDS "lastPhotoIds" namespace Pikeo { enum SearchOrder { Default = 0, DateTaken, UploadDate, MostViewed, CommentDate, GroupAddDate }; class Item : public HttpEngine::Item { Q_OBJECT QString _photoId; IdCache _lastPhotoIds; QString urlPrefix; QString urlFile; QString photoTitle; QString photoDescription; QString photoOwner; QSize photoSize; QStringList _tags; SearchOrder _searchOrder; bool _ascending; int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; bool isValidItem() const { return _tags.size(); } QVariant data() const; public: Item(); Item(Item *item); virtual ~Item() { } void setTags(const QStringList &tags) { _tags = tags; } void setSearchOrder(SearchOrder searchOrder) { _searchOrder = searchOrder; } void setAscending(bool ascending) { _ascending = ascending; } SearchOrder searchOrder() const { return _searchOrder; } QStringList tags() const { return _tags; } bool isAscending() const { return _ascending; } QString photoUrl() const { return QUrl(urlPrefix + urlFile).toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QLineEdit *leSearchFor; QComboBox *cbSearchOrder; QCheckBox *cbAscendingOrder; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } QSize sizeHint() const { return QSize(500,height()); } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/pikeo"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } QString name() const { return PIKEO_ENGINE_NAME; } Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/include/gui.h0000644000000000000000000001306211676624760013750 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 GUI_H #define GUI_H #include #include namespace Gui { class EngineButton : public QPushButton { Q_OBJECT int _height; QPixmap _pixmap; bool _isOver; bool _isActive; void setup(); protected: void paintEvent(QPaintEvent *event); void enterEvent(QEvent *event); void leaveEvent(QEvent *event); public: EngineButton(QWidget *parent = 0); EngineButton(const QString &text, QWidget *parent = 0); EngineButton(const QIcon &icon, const QString &text, QWidget *parent = 0); virtual ~EngineButton() { } void setHeight(int height) { _height = height; updateGeometry(); } void setPixmap(const QPixmap &pixmap); QSize sizeHint() const; }; class ColorButton : public QPushButton { Q_OBJECT QColor _color; protected: void paintEvent(QPaintEvent *event); void nextCheckState(); public: ColorButton(QWidget *parent = 0) : QPushButton(parent), _color(Qt::black) { } ColorButton(const QColor &color, QWidget *parent = 0) : QPushButton(parent), _color(color) { } virtual ~ColorButton() { } void setColor(const QColor &color); QColor color() const { return _color; } QSize sizeHint() const { return QSize(90,QPushButton::sizeHint().height()); } signals: void colorChanged(const QColor &color); }; class Dialog : public QDialog { Q_OBJECT public: enum Position { CenterOfScreen, TopOfScreen }; private: bool fired; Position _position; protected: void showEvent(QShowEvent *event); void closeEvent(QCloseEvent *event); public: Dialog(Position position, QWidget *parent = 0, Qt::WindowFlags f = 0) : QDialog(parent,f | Qt::WindowSystemMenuHint), fired(false), _position(position) { setWindowModality(Qt::ApplicationModal); setMaximumWidth(QApplication::desktop()->availableGeometry().width() * 9 / 10); setMaximumHeight(QApplication::desktop()->availableGeometry().height() * 8 / 10); } virtual ~Dialog() { } signals: void executed(); void closed(); }; class ScrollableButtons : public QFrame { Q_OBJECT bool firstShowEvent; QPushButton *buttonUp; QPushButton *buttonDown; QScrollArea *scrollArea; QVBoxLayout *buttonLayout; QButtonGroup *buttonGroup; private slots: void on_buttonUp_clicked(); void on_buttonDown_clicked(); void on_scrollBar_valueChanged(int value); protected: void resizeEvent(QResizeEvent *event); void showEvent(QShowEvent *event); public: ScrollableButtons(QWidget *parent = 0); virtual ~ScrollableButtons() { } void addButton(QAbstractButton *button); void addButton(QAbstractButton *button, int id); QAbstractButton *button(int id) const; QList buttons() const; QAbstractButton *checkedButton() const; int checkedId() const; bool exclusive() const; int id(QAbstractButton *button) const; void insertButton(int index, QAbstractButton *button); void insertButton(int index, QAbstractButton *button, int id); void removeButton(QAbstractButton *button); void setExclusive(bool exclusive); void setId(QAbstractButton *button, int id); signals: void buttonClicked(QAbstractButton *button); void buttonClicked(int id); void buttonPressed(QAbstractButton *button); void buttonPressed(int id); void buttonReleased(QAbstractButton *button); void buttonReleased(int id); public slots: void scrollAllUp() { scrollArea->verticalScrollBar()->setValue(scrollArea->verticalScrollBar()->minimum()); } void scrollAllDown() { scrollArea->verticalScrollBar()->setValue(scrollArea->verticalScrollBar()->maximum()); } void scrollToButton(QAbstractButton *button) { scrollArea->ensureWidgetVisible(button); } void scrollToSelected(); }; class ShadowedLabel : public QLabel { QColor _labelColor; QColor _shadowColor; protected: void paintEvent(QPaintEvent *event); public: ShadowedLabel(QWidget *parent = 0) : QLabel(parent), _labelColor(Qt::white), _shadowColor(Qt::black) { } ShadowedLabel(const QString &text, QWidget *parent = 0) : QLabel(text,parent), _labelColor(Qt::white), _shadowColor(Qt::black) { } virtual ~ShadowedLabel() { } void setLabelColor(const QColor &color); void setShadowColor(const QColor &color); QColor labelColor() const { return _labelColor; } QColor shadowColor() const { return _shadowColor; } QSize sizeHint() const; }; class ShrinkableTableWidget : public QTableWidget { Q_OBJECT public: ShrinkableTableWidget(QWidget *parent = 0); ShrinkableTableWidget(int rows, int columns, QWidget *parent = 0); virtual ~ShrinkableTableWidget() { } QSize sizeHint() const; }; } #endif wally-2.4.4/include/vladstudio.h0000644000000000000000000001140711676624760015343 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 VLADSTUDIO_H #define VLADSTUDIO_H #include #include #include #include "idcache.h" #include "httpengine.h" #define VLADSTUDIO_ENGINE_NAME "Vladstudio" #define CATEGORY "category" #define VIEW_ORDER "viewOrder" #define ORDER_DIRECTION "orderDirection" #define LAST_PHOTO_IDS "lastPhotoIds" namespace Vladstudio { enum Category { All = 0, AbstractArt = 1, Creatures = 2, Illustrations = 3, Photos = 4 }; enum ViewOrder { ById, ByView }; enum OrderDirection { Ascending, Descending }; class Item : public HttpEngine::Item { Q_OBJECT Category _category; ViewOrder _viewOrder; OrderDirection _orderDirection; QString _photoId; QString photoTitle; QString photoDescription; IdCache _lastPhotoIds; QUrl _photoUrl; QUrl _sourceUrl; QString photoOwner; QSize photoSize; int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; QVariant data() const; bool isValidItem() const { return true; } static QString categoryToString(Category category); public: Item(); Item(Item *item); virtual ~Item() { } void setCategory(Category category) { _category = category; } void setViewOrder(ViewOrder viewOrder) { _viewOrder = viewOrder; } void setOrderDirection(OrderDirection orderDirection) { _orderDirection = orderDirection; } Category category() const { return _category; } ViewOrder viewOrder() const { return _viewOrder; } OrderDirection orderDirection() const { return _orderDirection; } QString photoUrl() const { return _photoUrl.toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QComboBox *cbCategory; QComboBox *cbViewOrder; QComboBox *cbOrderDirection; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/vladstudio"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT QString name() const { return VLADSTUDIO_ENGINE_NAME; } Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/include/panoramio.h0000644000000000000000000001347011676624760015154 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 PANORAMIO_H #define PANORAMIO_H #include #include #include #include "idcache.h" #include "gui.h" #include "httpengine.h" #define PANORAMIO_ENGINE_NAME "Panoramio" #define MIN_LONGITUDE "minLongitude" #define MAX_LONGITUDE "maxLongitude" #define MIN_LATITUDE "minLatitude" #define MAX_LATITUDE "maxLatitude" #define SEARCH_ORDER "searchOrder" #define REQUESTED_SIZE "requestedSize" #define LAST_PHOTO_IDS "lastPhotoIds" namespace Panoramio { enum RequestedSize { Original = 0, Medium, Small, Thumbnail, Square, MiniSquare }; enum SearchOrder { Popularity = 0, UploadDate }; const QString searchOrderStrings[] = { "popularity", "upload_date" }; const QString requestedSizeStrings[] = { "original", "medium", "small", "thumbnail", "square", "mini_square" }; class Item : public HttpEngine::Item { Q_OBJECT RequestedSize _requestedSize; SearchOrder _searchOrder; double _minLatitude; double _maxLatitude; double _minLongitude; double _maxLongitude; QString _photoId; IdCache _lastPhotoIds; QString photoOwner; QString photoTitle; QString photoLocation; QUrl _photoUrl; QUrl _sourceUrl; QSize photoSize; int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; QVariant data() const; bool isValidItem() const { return (_minLatitude < _maxLatitude) && (_minLongitude < _maxLongitude); } public: Item(); Item(Item *item); virtual ~Item() { } void setRequestedSize(RequestedSize requestedSize) { _requestedSize = requestedSize; } void setSearchOrder(SearchOrder searchOrder) { _searchOrder = searchOrder; } void setMinLatitude(double minLatitude) { _minLatitude = minLatitude; } void setMaxLatitude(double maxLatitude) { _maxLatitude = maxLatitude; } void setMinLongitude(double minLongitude) { _minLongitude = minLongitude; } void setMaxLongitude(double maxLongitude) { _maxLongitude = maxLongitude; } RequestedSize requestedSize() const { return _requestedSize; } SearchOrder searchOrder() const { return _searchOrder; } double minLatitude() const { return _minLatitude; } double maxLatitude() const { return _maxLatitude; } double minLongitude() const { return _minLongitude; } double maxLongitude() const { return _maxLongitude; } QString photoUrl() const { return _photoUrl.toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT bool checkingValues; QDoubleSpinBox *dsbMinLongitude; QDoubleSpinBox *dsbMaxLongitude; QDoubleSpinBox *dsbMinLatitude; QDoubleSpinBox *dsbMaxLatitude; QComboBox *cbRequestedSize; QComboBox *cbSearchOrder; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); bool validateInput(); private slots: void correctValues(); void launchMapViewer(); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/panoramio"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } QString name() const { return PANORAMIO_ENGINE_NAME; } Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/include/splash.h0000644000000000000000000000202211676624760014450 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 SPLASH_H #define SPLASH_H #include #include class SplashScreen : public QSplashScreen { Q_OBJECT QPixmap *logo; public: SplashScreen(); virtual ~SplashScreen(); }; #endif wally-2.4.4/include/buzznet.h0000644000000000000000000001012711676624760014664 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 BUZZNET_H #define BUZZNET_H #include #include #include #include "idcache.h" #include "httpengine.h" #define BUZZNET_ENGINE_NAME "Buzznet" #define TAG "tag" #define LAST_PHOTO_URLS "lastPhotoUrls" namespace Buzznet { class Item : public HttpEngine::Item { Q_OBJECT QUrl _photoUrl; IdCache _lastPhotoUrls; QUrl _sourceUrl; QString photoOwner; QString photoDescription; QString photoTitle; QString _tag; int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; QVariant data() const; bool isValidItem() const { return _tag.size(); } public: Item() : HttpEngine::Item() { } Item(Item *item) : HttpEngine::Item(item) { _tag = item->_tag; } virtual ~Item() { } void setTag(const QString &tag) { _tag = tag; } QString tag() const { return _tag; } QString photoUrl() const { return _photoUrl.toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QLineEdit *leSearchFor; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } QSize sizeHint() const { return QSize(500,height()); } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/buzznet"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT QString name() const { return BUZZNET_ENGINE_NAME; } Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/include/files.h0000644000000000000000000001022311676624760014262 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 FILES_H #define FILES_H #include #include #include "ui_files.h" #include "engine.h" #define FILES_ENGINE_NAME "Files" #define LAST_INDEX "lastIndex" namespace Files { class Item : public Engine::Item, public QFileInfo { Q_OBJECT QVariant data() const; void loadSettings(QSettings & /* settings */, const QString & /* group */) { } void saveSettings(QSettings & /* settings */, const QString & /* engineName */ , int /* id */) const { } void loadState(QSettings & /* settings */, const QString & /* group */) { } void saveState(QSettings & /* settings */, const QString & /* engineName */, int /* id */) const { } public: Item() { } Item(Item *item) : QFileInfo(*item) { } Item(const QFileInfo &fileInfo) : QFileInfo(fileInfo) { } virtual ~Item() { } bool equalTo(Engine::Item *item) const { return *this == *qobject_cast (item); } }; class LabelPreview : public QLabel { Q_OBJECT public: LabelPreview(QWidget *parent = 0, Qt::WindowFlags f = 0); virtual ~LabelPreview() { } void setPixmap(const QPixmap &pixmap); QSize sizeHint() const { return QSize(250,250); } public slots: void clear(); }; class SettingsWidget : public Engine::SettingsWidget, private Ui::FilesSettingsWidget { Q_OBJECT LabelPreview *lblPreview; bool dontChangePreview; QPixmap buttonPixmap() const { return QPixmap(); } QIcon buttonIcon() const { return QIcon(":/images/files"); } QString buttonText() const { return tr("Files"); } private slots: void on_tbAdd_clicked(bool); void on_tbFolderAdd_clicked(bool); void on_tbDel_clicked(bool); void on_lvPhotos_doubleClicked(const QModelIndex &index); void on_tbMoveUp_clicked(bool); void on_tbMoveDown_clicked(bool); void updateWidgets(const QItemSelection &selected, const QItemSelection &deselected); protected: void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); public: SettingsWidget(Engine::Core *core, QWidget *parent = 0); virtual ~SettingsWidget() { } }; class Core : public Engine::Core { Q_OBJECT int selectedIndex; QList toBeViewed; void buildRandomIndexesList(); void doSubmit(); void doSaveState(QSettings &settings) const; QString name() const { return FILES_ENGINE_NAME; } void loadState(QSettings &settings); void saveState(QSettings &settings) const; void loadSettings(QSettings &settings); void saveSettings(QSettings &settings) const; Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : Engine::Core(tempStorageDir,parent) { } virtual ~Core() { } void swapRows(const int i, const int j); void addFile(const QString &fileName); void addFile(const QFileInfo &fileInfo); void addFiles(const QStringList &fileNameList); void addFiles(const QFileInfoList &fileInfoList); public slots: void init(); void search(bool randomMode); void sizeLookup(); void download(); void infoCollect(); void cancel(); }; } #endif wally-2.4.4/include/xtengine.h0000644000000000000000000000540211676624760015004 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 XTENGINE_H #define XTENGINE_H #include #include #include "engine.h" #include "gui.h" namespace XtEngine { class Item : public Engine::Item { Q_OBJECT public: virtual ~Item() { } virtual bool isValidItem() const = 0; }; class Core : public Engine::Core { Q_OBJECT protected: int currentItemIndex; public: Core(const QString &tempStorageDir, QObject *parent = 0) : Engine::Core(tempStorageDir,parent), currentItemIndex(-1) { } virtual ~Core() { } }; class DialogWidget : public QWidget { Q_OBJECT Core *_core; public: DialogWidget(Core *core, QWidget *parent = 0) : QWidget(parent), _core(core) { } virtual ~DialogWidget() { } Engine::Core *core() const { return _core; } virtual Item *returnItem() = 0; virtual void setupFromItem(Item *item = 0) = 0; virtual bool validateInput() { return true; } }; class Dialog : public Gui::Dialog { Q_OBJECT Core *_core; QDialogButtonBox *dialogButtons; DialogWidget *dialogWidget; virtual DialogWidget *newDialogWidget(Core *core) = 0; private slots: void dialogButtonClicked(QAbstractButton *button); public: Dialog(Core *core, QWidget *parent = 0) : Gui::Dialog(Gui::Dialog::CenterOfScreen,parent,Qt::WindowSystemMenuHint), _core(core) { } virtual ~Dialog() { } Item *execute(Item *item = 0); }; class ItemDelegate : public QItemDelegate { Q_OBJECT QLabel *label; public: ItemDelegate(QObject *parent = 0); virtual ~ItemDelegate(); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; class SettingsWidget : public Engine::SettingsWidget { Q_OBJECT protected: virtual Dialog *newDialog() = 0; public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : Engine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; } #endif wally-2.4.4/include/engine.h0000644000000000000000000001101511676624760014425 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 ENGINE_H #define ENGINE_H #include #include #define ENGINES_SECTION "Engines" #define ENGINE_ACTIVE "Active" #define ITEM_VIEW_MARGIN 3 #include "defs.h" namespace Engine { class SettingsWidget; class Item : public QObject { Q_OBJECT public: virtual ~Item() { } virtual QVariant data() const = 0; virtual void loadSettings(QSettings &settings, const QString &group) = 0; virtual void saveSettings(QSettings &settings, const QString &engineName, int id) const = 0; virtual void loadState(QSettings &settings, const QString &group) = 0; virtual void saveState(QSettings &settings, const QString &engineName, int id) const = 0; virtual bool equalTo(Item *item) const = 0; }; class Core : public QAbstractItemModel { Q_OBJECT bool _active; QItemSelectionModel *_selectionModel; QString _tempStorageDir; protected: QList sourceList; QList list; virtual void doRevert() { } virtual void doSubmit() { } public: Core(const QString &tempStorageDir, QObject *parent = 0); virtual ~Core(); QString tempStorageDir() const { return _tempStorageDir; } QModelIndex parent(const QModelIndex & /* child */) const { return QModelIndex(); } QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; int rowCount(const QModelIndex & /* parent */ = QModelIndex()) const { return list.size(); } int columnCount(const QModelIndex & /* parent */ = QModelIndex()) const { return 1; } QVariant data(const QModelIndex &index, int role) const; bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()); bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); bool removeRows(const QItemSelectionModel *selectionModel); bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); QItemSelectionModel *selectionModel() const { return _selectionModel; } void edit(); void revert(); bool submit(); void setActive(bool active) { _active = active; } bool isActive() const { return _active; } virtual void loadState(QSettings & /* settings */) { } virtual void saveState(QSettings &settings) const; virtual void loadSettings(QSettings &settings); virtual void saveSettings(QSettings &settings) const; virtual QString name() const = 0; virtual QString photoUrl() const { return QString(); } virtual Item *newItem(const QVariant &data = QVariant()) = 0; virtual Item *newItem(Item *item) = 0; virtual SettingsWidget *newSettingsWidget(QWidget *parent = 0) = 0; Core *operator<<(Item *item); virtual void applyWatermark(QPainter * /* painter */, const QRect & /* rect */) { } signals: void initCompleted(); void searchCompleted(bool hasData); void sizeLookupCompleted(const QSize &size); void downloadCompleted(bool ok, const QFileInfo &localFile); void infoCollectCompleted(const PhotoInfo &info); void cancelCompleted(); public slots: virtual void init() = 0; virtual void search(bool randomMode) = 0; virtual void sizeLookup() = 0; virtual void download() = 0; virtual void infoCollect() = 0; virtual void cancel() = 0; }; class SettingsWidget : public QWidget { Q_OBJECT Core *_core; public: SettingsWidget(Core *core, QWidget *parent = 0); virtual ~SettingsWidget() { } Core *core() const { return _core; } virtual QPixmap buttonPixmap() const = 0; virtual QIcon buttonIcon() const = 0; virtual QString buttonText() const = 0; signals: void settingsModified(); }; } Q_DECLARE_METATYPE(Engine::Item *) Q_DECLARE_METATYPE(Engine::Core *) #endif wally-2.4.4/include/folders.h0000644000000000000000000001477711676624760014640 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 FOLDERS_H #define FOLDERS_H #include #include #include #include "ui_folders.h" #include "engine.h" #include "xtengine.h" #define FOLDERS_ENGINE_NAME "Folders" #define FOLDER "folder" #define SUBFOLDERS "subfolders" #define PASSIVE_TRANSFER "passiveTransfer" #define REMOTE "remote" #define LAST_INDEX "lastIndex" namespace Folders { class Item : public XtEngine::Item { Q_OBJECT bool _randomMode; QList toBeViewed; QString _tempStorageDir; void saveState(QSettings &settings, const QString &engineName, int id) const; void loadSettings(QSettings & /* settings */, const QString & /* group */) { } protected: int selectedIndex; void buildRandomIndexesList(); void clearRandomIndexesList() { toBeViewed.clear(); } virtual void buildFileList() = 0; virtual int size() const = 0; virtual void doExtractFileName() = 0; public: Item(const QString &tempStorageDir); virtual ~Item() { } virtual bool isRemote() const = 0; QString tempStorageDir() const { return _tempStorageDir; } void extractFileName(bool randomMode); void loadState(QSettings &settings, const QString &group); signals: void searchCompleted(const QFileInfo &fileName); void fileListBuilt(); public slots: void fileListAvailable(); }; class LocalItem : public Item, public QDir { Q_OBJECT bool _recursion; QFileInfoList fileList; QVariant data() const; void buildFileList(); int size() const { return fileList.size(); } void doExtractFileName(); void saveSettings(QSettings &settings, const QString &engineName, int id) const; static bool fileNameLessThan(const QFileInfo &f1, const QFileInfo &f2); bool isRemote() const { return false; } bool isValidItem() const { return exists(); } public: LocalItem(const QString &tempStorageDir); LocalItem(LocalItem *item); virtual ~LocalItem() { } bool isRecursion() const { return _recursion; } void setRecursion(bool recursion) { _recursion = recursion; } bool equalTo(Engine::Item *item) const { return *this == *qobject_cast (item); } }; class RemoteItem : public Item, public QUrl { Q_OBJECT QFile ftpFile; bool isDownloading; bool isListing; bool _passiveTransfer; QList fileList; QFtp *ftpClient; QVariant data() const; void buildFileList(); int size() const { return fileList.size(); } void saveSettings(QSettings &settings, const QString &engineName, int id) const; void doExtractFileName(); bool isRemote() const { return true; } bool isValidItem() const { return (!isEmpty() && isValid()); } private slots: void ftpDone(bool error); void ftpListInfo(const QUrlInfo &listInfo); public: RemoteItem(const QString &tempStorageDir); RemoteItem(RemoteItem *item); virtual ~RemoteItem() { } void setPassiveTransfer(bool passiveTransfer) { _passiveTransfer = passiveTransfer; } bool isTransferPassive() const { return _passiveTransfer; } bool equalTo(Engine::Item *item) const { return *this == *qobject_cast (item); } }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QRadioButton *rbLocal; QRadioButton *rbRemote; QLineEdit *leLocalPath; QCheckBox *cbIncludeSubfolders; QLineEdit *leServer; QSpinBox *sbPort; QComboBox *cbTransfer; QLineEdit *leUserName; QLineEdit *lePassword; QLineEdit *leRemotePath; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); private slots: void chooseFolder(); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } QSize sizeHint() const { return QSize(500,height()); } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public XtEngine::SettingsWidget, private Ui::FoldersSettingsWidget { Q_OBJECT bool isRefreshing; QPixmap buttonPixmap() const { return QPixmap(); } QIcon buttonIcon() const { return QIcon(":/images/folders"); } QString buttonText() const { return tr("Folders"); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } private slots: void on_tbAdd_clicked(bool); void on_tbDel_clicked(bool); void on_lvFolders_doubleClicked(const QModelIndex &index); void updateWidgets(const QItemSelection &selected, const QItemSelection &deselected); protected: void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); public: SettingsWidget(Engine::Core *core, QWidget *parent = 0); virtual ~SettingsWidget() { } }; class Core : public XtEngine::Core { Q_OBJECT QString currentFileName; QString name() const { return FOLDERS_ENGINE_NAME; } Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } Engine::Item *newItem(const QVariant &data = QVariant()); Engine::Item *newItem(Engine::Item *item); void loadSettings(QSettings &settings); private slots: void fileSearchCompleted(const QFileInfo &fileName); public: Core(const QString &tempStorageDir, QObject *parent = 0) : XtEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } public slots: void init(); void search(bool randomMode); void sizeLookup(); void download(); void infoCollect(); void cancel(); }; } #endif wally-2.4.4/include/exif.h0000644000000000000000000000657311676624760014130 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 EXIF_H #define EXIF_H #include #include #ifdef EXIF #include #include #include #include #include #include Q_DECLARE_METATYPE(ExifRational) Q_DECLARE_METATYPE(ExifSRational) #endif #include "gui.h" namespace Exif { struct Tag { QString title; QString description; Tag() { } Tag(const Tag &tag) : title(tag.title), description(tag.description) { } Tag(const QString &t, const QString &d) : title(t), description(d) { } }; struct Data { QVariant value; QString readableValue; Data() { } Data(const Data &data) : value(data.value), readableValue(data.readableValue) { } Data(const QVariant &v, const QString &rV) : value(v), readableValue(rV) { } }; class Tags : public QMap > { QByteArray _data; QString _fileName; #ifdef EXIF static ExifByteOrder byteOrder; static void readEntry(ExifEntry *entry, void *data); static void readContent(ExifContent *content, void *data); #endif void readExifData(const QByteArray &data); public: Tags(const QFileInfo &fileInfo); Tags(const QByteArray &data); QString fileName() const { return _fileName; } #ifdef EXIF QString owner() const { return (value(EXIF_TAG_XP_AUTHOR).second.readableValue.isEmpty())? value(EXIF_TAG_ARTIST).second.readableValue : value(EXIF_TAG_XP_AUTHOR).second.readableValue; } QString title() const { return (value(EXIF_TAG_XP_AUTHOR).second.readableValue.isEmpty())? value(EXIF_TAG_IMAGE_DESCRIPTION).second.readableValue : value(EXIF_TAG_XP_AUTHOR).second.readableValue; } QString description() const { return (value(EXIF_TAG_XP_COMMENT).second.readableValue.isEmpty())? value(EXIF_TAG_USER_COMMENT).second.readableValue : value(EXIF_TAG_XP_COMMENT).second.readableValue; } #else QString owner() const { return QString(); } QString title() const { return QString(); } QString description() const { return QString(); } #endif QByteArray data() const { return _data; } QImage normalize(const QImage &image); }; class InfoDialog : public Gui::Dialog { Q_OBJECT void setupUi(const Tags &tags); public: InfoDialog(const QFileInfo &fileInfo, QWidget *parent = 0); InfoDialog(const QByteArray &data, QWidget *parent = 0); virtual ~InfoDialog() { } }; } #endif wally-2.4.4/include/picasa.h0000644000000000000000000001026311676624760014424 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 PICASA_H #define PICASA_H #include #include #include #include "idcache.h" #include "httpengine.h" #define PICASA_ENGINE_NAME "Picasa" #define SEARCH_TEXT "text" #define LAST_PHOTO_URLS "lastPhotoUrls" namespace Picasa { class Item : public HttpEngine::Item { Q_OBJECT QUrl _photoUrl; IdCache _lastPhotoUrls; QUrl _sourceUrl; QString photoOwner; QString photoDescription; QString photoTitle; QString photoLocation; QString _text; QSize photoSize; int doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const; QUrl doPrepareInit(HttpEngine::Operation &op); QUrl doPrepareSearch(HttpEngine::Operation &op); bool doProcessSearchResult(const QByteArray &response, int &newPagesCount); QUrl prepareSizeRequest(HttpEngine::Operation &op); QSize doProcessSizeRequestResult(const QByteArray &response); QUrl prepareDownload(HttpEngine::Operation &op); QUrl prepareInfoCollect(HttpEngine::Operation &op); PhotoInfo doProcessInfoCollectResult(const QByteArray &response); void doLoadSettings(QSettings &settings); void doSaveSettings(QSettings &settings) const; void doSaveState(QSettings &settings) const; QVariant data() const; bool isValidItem() const { return _text.size(); } public: Item() : HttpEngine::Item() { } Item(Item *item); virtual ~Item() { } void setText(const QString &text) { _text = text; } QString text() const { return _text; } QString photoUrl() const { return _photoUrl.toString(); } bool equalTo(Engine::Item *item) const; }; class DialogWidget : public XtEngine::DialogWidget { Q_OBJECT QLineEdit *leSearchFor; QComboBox *cbCondition; XtEngine::Item *returnItem(); void setupFromItem(XtEngine::Item *item = 0); public: DialogWidget(XtEngine::Core *core, QWidget *parent = 0); virtual ~DialogWidget() { } QSize sizeHint() const { return QSize(500,height()); } }; class Dialog : public XtEngine::Dialog { Q_OBJECT XtEngine::DialogWidget *newDialogWidget(XtEngine::Core *core) { return new DialogWidget(core,this); } public: Dialog(XtEngine::Core *core, QWidget *parent = 0) : XtEngine::Dialog(core,parent) { } virtual ~Dialog() { } }; class SettingsWidget : public HttpEngine::SettingsWidget { Q_OBJECT QPixmap buttonPixmap() const { return QPixmap(":/images/picasa"); } QIcon buttonIcon() const { return QIcon(); } QString buttonText() const { return QString(); } XtEngine::Dialog *newDialog() { return new Dialog(qobject_cast (core()),this); } public: SettingsWidget(Engine::Core *core, QWidget *parent = 0) : HttpEngine::SettingsWidget(core,parent) { } virtual ~SettingsWidget() { } }; class Core : public HttpEngine::Core { Q_OBJECT Item *newItem(const QVariant & /* data */ = QVariant()) { return new Item; } Item *newItem(Engine::Item *item) { return new Item(qobject_cast (item)); } QString name() const { return PICASA_ENGINE_NAME; } QAbstractButton *newButton(QWidget *parent = 0); Engine::SettingsWidget *newSettingsWidget(QWidget *parent = 0) { return new SettingsWidget(this,parent); } public: Core(const QString &tempStorageDir, QObject *parent = 0) : HttpEngine::Core(tempStorageDir,parent) { } virtual ~Core() { } }; } #endif wally-2.4.4/mac/0000755000000000000000000000000011676633665012132 5ustar rootrootwally-2.4.4/mac/wally.icns0000644000000000000000000000620711676624760014141 0ustar rootrooticns ICN#il32o*;ߍކڅިwdghggea_\YWUQOLJFDA><9;zqu{kifda^\YWTQOMJHD}|˄srpmkiedb_]ZXVL|M}{zwvsqpmiigebU{򱇇}|tfsuqmYzڠknZx`yˮy_tMbiwS`MPsv`QkMR|qwLPmdOvrhzyxwvshfb[WQW^ffUakjfb\XYYWNDBCKCKXYM]ZZXUQLJ;49C58LDL<=>?9/4+%45K02$H!ƸGCD>]׀؀ۀ᦮7>6rX@. *iĀHۘڅު||zxvtronjigdb`Sú~}{xwtrpolkYဗ؝~|zxv`g~ހEji}䳥qx[p|׾bLhwyRdLP~ycQpLRr}KOsgOzjyxpc\Q\jxx_d|{wsnjkkh\ONNZN[jkX`lligc_]IAHTBF_POQRSK?D:3GANEF7K570ƷJGHBfր؀ڀ ᨭ<C[zbH5! *;ߍކڅޮჱuᅸzᆾѧûaǦȾ˩r߂Ǭ٭y^߀ǮˏfJs}ЀαQkKOǑ|܃׀iQyKRϕvπʂňINlOothQgvixfdetezoeeYct[`gTwttuwkZbWLhYSjiYQ\[ WƸڐOJ[րـۀ᤭5>6rX@. l8mk Quuuuuuuuuuuuuuuuuuumunr5 {e  #%'(('%#  wally-2.4.4/mac/Info.plist0000644000000000000000000000163611676624760014104 0ustar rootroot LSUIElement CFBundleDevelopmentRegion English CFBundleInfoDictionaryVersion 6.0 CFBundleExecutable Wally CFBundleGetInfoString Qt4 wallpaper changer CFBundleIconFile wally.icns CFBundleIdentifier com.BeCrux.Wally CFBundlePackageType APPL CFBundleShortVersionString 2.4.4 CFBundleVersion 2.4.4 CFBundleSignature NOTE Author: Antonio Di Monaco NSUIElement 1 wally-2.4.4/res/0000755000000000000000000000000011676624761012160 5ustar rootrootwally-2.4.4/res/languages.qrc0000644000000000000000000000245711676624760014644 0ustar rootroot ${CMAKE_CURRENT_BINARY_DIR}/wally_it.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_ru.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_fr.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_de.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_es.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_pt_BR.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_cz.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_pl.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_zh_CN.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_ca.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_gr.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_kr.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_hu.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_dk.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_se.qm ${CMAKE_CURRENT_BINARY_DIR}/wally_tr.qm wally-2.4.4/res/images.qrc0000644000000000000000000001216711676624760014142 0ustar rootroot images/move_all_left.png images/move_all_right.png images/move_left.png images/move_right.png images/add.png images/configure.png images/delete.png images/edit.png images/active.png images/folder.png images/folders.png images/proxy.png images/idle.png images/off.png images/quit.png images/arrow_down.png images/arrow_up.png images/control_pause.png images/control_play.png images/folder_add.png images/folder_delete.png images/folder_photo.png images/files_add.png images/files_delete.png images/photo_save.png images/photo_background.png images/files.png images/flickr.png images/about.png images/history.png images/qt.png images/cancel.png images/yahoo.png images/logo.png images/panoramio.png images/pikeo.png images/italy.png images/uk.png images/brazil.png images/france.png images/germany.png images/spain.png images/russia.png images/world.png images/photobucket.png images/ipernity.png images/pb_watermark.png images/source_url.png images/buzznet.png images/picasa.png images/smugmug.png images/down.png images/up.png images/view.png images/zoom_in.png images/zoom_out.png images/clockwise.png images/cclockwise.png images/fit_to_window.png images/full_image.png images/exif_info.png images/bing.png images/world_map.png images/czech_republic.png images/china.png images/poland.png images/catalonia.png images/greece.png images/korea.png images/google.png images/vladstudio.png images/centered.png images/center_tiled.png images/centered_autofit.png images/centered_maxpect.png images/mirrored_tiled.png images/scaled.png images/symmetrical_mirrored_tiled.png images/symmetrical_tiled.png images/tiled.png images/tiled_maxpect.png images/scale_crop.png images/deviantart.png images/hungary.png images/denmark.png images/sweden.png images/turkey.png wally-2.4.4/res/lang/0000755000000000000000000000000011676624761013101 5ustar rootrootwally-2.4.4/res/lang/wally_se.ts0000644000000000000000000030273511676624760015301 0ustar rootroot AboutDialog Supported image formats: Fungerande filformat: About Wally Om Wally Details >> Detaljer >> Compiled with: Kompilerat med: EXIF library: EXIF bibliotek: present närvarande not present ej närvarande Polish Polska Catalan Katalanska Greek Grekiska Korean Koreanska Hungarian Ungerska Danish Danska Swedish Svenska Turkish Turkiska Close Stäng Extension Ändelse Description Beskrivning Additional info: Övrig information: Language Språk Translator Översättare <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Qt4 bakgrundsbytare<br />Skapare: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Jag vill tacka Vincent Willem van Gogh för loggotypen :)<br /><br />Hemsida: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Du kan kontakta mig på <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Italian Italienska English Engelska Russian Ryska Spanish Spanska Portuguese (Brazil) Portugisiska Chinese Kinesiska German Tyska French Franska Czech Tjeckiska Translations: Översättare: Bing::DialogWidget All of these words Alla dessa ord Any of these words Vilket som helst av dessa ord Search for: Sök efter: Strict Strikt Moderate Mild Off Av Adult filter: Vuxen filter: Bing item Bing objekt Unfiltered content can show offending or sexual explicit photos Ofiltrerat innehåll kan visa känsliga eller sexuellt anspelande foton Edit Bing item Modifiera Bing objekt Add Bing item Lägg till Bing objekt Bing::Item Tags: Etiketter: and och or eller Adult filter: Vuxen filter: Off Av Moderate Mild Strict Strikt Buzznet::DialogWidget Search for: Sök efter: Edit Buzznet item Modifiera Buzznet objekt Add Buzznet item Lägg till Buzznet objekt Buzznet::Item Tag: Etikett: DeviantArt::DialogWidget Search for: Sök efter: Strict Strikt Off Av Adult filter: Vuxen filter: deviantART item deviantART objekt Unfiltered content can show offending or sexual explicit photos Ofiltrerat innehåll kan visa känsliga eller sexuellt anspelande foton Edit deviantART item Modifiera deviantART objekt Add deviantART item Lägg till ett deviantART objekt DeviantArt::Item Tag: Etikett: Adult filter: Vuxen filter: Off Av Strict Strikt Exif::InfoDialog EXIF information EXIF information Tag Etikett Value Värde No EXIF information available EXIF information inte tillgänglig Files::Core Loading folder... Laddar mapp... Files::LabelPreview No preview available Ingen förhandsvisning tillgänglig Files::SettingsWidget Select a photo Välj ett foto Select a folder Välj en mapp Files Filer FilesSettingsWidget Photos Foton Add a photo Lägg till ett foto Add photos in folder Lägg till foton från mapp Delete photo Ta bort foto Move photo up Flytta upp foto Move photo down Flytta ner foto Flickr::DialogWidget All of these words Alla dessa ord Any of these words Vilket som helst av dessa ord Search for: Sök efter: Full text Full text Tags only Endast etiketter Largest Störst Original Original Large Stor Medium Medel Small Liten Thumbnail Tumnagel Square Ruta Smallest Minst Relevance Relevans Size: Storlek: Order: Ordning: Edit Flickr item Ändra Flickr objekt Add Flickr item Lägg till ett Flickr objekt Interestingness desc Intresse, avtagande Date posted desc Uppläggningsdatum, avtagande Date taken desc c Interestingness asc Intresse, stigande Date posted asc Uppläggningsdatum, stigande Date taken asc Fotograferingsdatum, stigande Flickr::Item Text: Text: Tags: Etiketter: and och or eller Size: Storlek: Largest Störst Original Original Large Stor Medium Medel Small Liten Thumbnail Tumnagel Square Ruta Smallest Minst Order: Ordning: Relevance Relevans Interestingness desc Intresse, avtagande Date posted desc Uppläggningsdatum, avtagande Date taken desc Fotograferingsdatum, avtagande Interestingness asc Intresse, stigande Date posted asc Uppläggningsdatum, stigande Date taken asc Fotograferingsdatum, stigande Folders::DialogWidget Include subfolders Inkludera underkataloger Select a folder Välj en mapp Edit folder Ändra mapp Add folder Skapa ny mapp Local Lokal Remote Avlägsen Folder: Mapp: Passive Passiv Active Aktiv Server: Server: Port: Port: Transfer mode: Överföringsläge: Username: Användarnamn: Password: Lösenord: Path: Adress: Folders::LocalItem (with subfolders) (med undermappar) Folders::RemoteItem Transfer mode: Överföringsläge: passive Passiv active Aktiv Folders::SettingsWidget Folders Mappar FoldersSettingsWidget Folders Mappar Add a folder Lägg till en mapp Delete folder Ta bort mapp Google::DialogWidget Search for: Sök efter: Strict Strikt Moderate Mild Off Av Adult filter: Vuxen filter: Google item Google objekt Unfiltered content can show offending or sexual explicit photos Ofiltrerat innehåll kan visa känsliga eller sexuellt anspelande foton Edit Google item Redigera Google objekt Add Google item Lägg till ett Google objekt Google::Item Text: Text: Adult filter: Vuxen filter: Off Av Moderate Mild Strict Strikt Gui::ColorButton Auto Auto History::Dialog Right-click on items to show options Högerklicka på objekt för att visa alternativ History Historik Please wait... Vänligen vänta.... Downloading photo... Laddar ner foto... Abort Avbryt Save photo Spara foto Images (*.png *.xpm *.jpg) Bilder (*.png *.xpm *.jpg) Photo has been saved Fotot är sparat There was an error during download Ett fel uppstod vid nedladdningen View photo... Titta på foto... Get EXIF info... Hämta EXIF information... Save photo... Spara foto... Set as background Använd som bakgrund Explore image source Undersök bildkälla History::EngineQueryModel All Alla History::PhotosQueryModel Image size: Bildstorlek: Engine: Motor: EXIF: EXIF: No Nej Yes Ja (no title) (ingen titel) by: av: (no author) (ingen författare) Location: Plats: unknown okänd Size: Storlek: Date: Datum: History::TagsQueryModel All Alla HttpEngine::SettingsWidget Select a folder Välj en mapp HttpSettingsWidget Photo sets Foto grupp Options Alternativ Save photos Spara foton Add a photo set Lägg till en fotogrupp Delete photo set Ta bort en fotongrupp Ipernity::DialogWidget All of these words Alla dessa ord Any of these words Vilket som helst av dessa ord Search for: Sök efter: Full text Full text Tags only Endast etiketter Ipernity item Ipernity objekt It can show offending or sexual explicit photos Detta kan visa kränkande eller sexuellt anspelande foton Edit Ipernity item Redigera Ipernity objekt Add Ipernity item Lägg till ett Ipernity objekt Ipernity::Item Text: Text: and och or eller Tags: Etiketter: Main Error Error is already running körs redan Disclaimer Ansvarsfriskrivning <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>Upphovsmannen tar inget ansvar för innehållet som Wally laddar ner från bilddelningssidor.<br>Upphovsmannen är på intet sätt ansvarig för något innehåll.</b><br><br>Om detta är till problem för dig, vänligen använd endastlokala källor såsom "Filer" och lokala "Mappar".<br>Välj annars<b>"Nej"</b> för att avsluta Wally, eller använd det <b>på egen risk</b><br><br>(om du fortsätter kommer detta meddelande bara visas en gång)<br><br>Accepterar du dessa villkor? Another instance of En annan instans av Map::View Drag to select. Right-click to zoom Dra för att markera. Högerklicka för att zooma Zoom %1x Zooma %1x Map::Viewer Map viewer Mapa Kartvy Panoramio::DialogWidget Select on map Välj på karta Longitude (min): Longitud (min): Longitude (max): Longitud (max): Latitude (min): Latitud (min): Latitude (max): Latitud (max): Popularity Popularitet Upload date Uppladdningsdatum Original Original Medium Medel Small Liten Thumbnail Tumnagel Square Ruta Mini square Mini ruta Order: Ordning: Size: Storlek: Edit Panoramio item Redigera Panoramio objekt Add Panoramio item Lägg till ett Panoramio objekt Error Error Coordinates must be different Koordinaterna måste vara annorlunda Panoramio::Item Original Original Medium Medel Small Liten Thumbnail Tumnagel Square Ruta Mini square Mini ruta Popularity Popularitet Upload date Uppladdningsdatum Longitude: Longitud: Latitude: Latitud: Size: Storlek: Order: Ordning: lat: lat: lon: long: Photobucket::DialogWidget Search for: Sök efter: Photobucket item Photobucket objekt It can show offending or sexual explicit photos Detta kan vissa kränkande eller sexuellt anspelande bilder Edit Photobucket item Redigera Photobucket objekt Add Photobucket item Lägg till ett Photobucket objekt All of these words Alla dessa ord Any of these words Vilket som helst av dessa ord Photobucket::Item Text: Text: and och or eller Picasa::DialogWidget Search for: Sök efter: Edit Picasa item Redigera Picasa objekt Add Picasa item Lägg till ett Picasa objekt Picasa::Item Text: Text: Pikeo::DialogWidget Search for: Sök efter: Default Standard Most viewed Mest sedda Upload date Uppladdningsdatum Date taken Fotograferingsdatum Group add date Tilläggningsdatum för grupp Comment date Kommentars datum Ascending Stigande Order: Ordning: Edit Pikeo item Redigera Pikeo objekt Add Pikeo item Lägg till ett Pikeo objekt Pikeo::Item Tags: Etiketter: Order: Ordning: Default Standard Most viewed Mest sedda Upload date subida o carga? Uppladdningsdatum Date taken Fotograferingsdatum Group add date Tilläggningsdatum för grupp Comment date Kommentars datum ascending stigande descending avtagande PositionModel Position Position Picture smaller than screen on the left, greater than screen on the right Bild mindre än skärm till vänster, större än skärm till höger QColorDialog Hu&e: &Ton: &Sat: &Mättnad: &Val: &Värde: &Red: &Röd: &Green: &Grön: Bl&ue: &Blå: Select Color Välj färg &Basic colors &Standard färger &Custom colors &Egna färger &Add to Custom Colors &Lägg till i Egna färger QDialogButtonBox OK OK Cancel Avbryt Reset Reset &Yes &Ja &No &Nej Close Stäng &Close &Stäng QFileDialog Directories Mappar &Open &Öppna &Save &Spara Open Öppna %1 already exists. Do you want to replace it? %1 Existerar redan. Vill du ersätta? %1 File not found. Please verify the correct file name was given. %1 Filen kan inte hittas Vänligen verifiera att rätt filnamn angivits. My Computer Min dator &Rename &Byt namn &Delete &Ta bort Show &hidden files &Visa dolda filer Back Tillbaka Parent Directory Överliggande mapp List View Visa lista Detail View Detaljerad vy Files of type: Filer av typen: Directory: Mapp: %1 Directory not found. Please verify the correct directory name was given. %1 Kunde inte hitta mapp. Vänligen kontrollera att namnet stämmer. '%1' is write protected. Do you want to delete it anyway? '%1' är skrivskyddad. Vill du ta bort ändå? Are sure you want to delete '%1'? Är du säker på att du vill ta bort '%1'? Could not delete directory. Kunde inte ta bort katalog. Recent Places Tidigare platser Save As Spara som Drive Disk File Fil Unknown Okänd Find Directory Sök katalog Show Visa Forward Framåt New Folder Ny mapp &New Folder &Ny mapp &Choose &Välj Remove Ta bort File &name: Mapp &namn: Look in: Titta i: Create New Folder Skapa ny mapp QObject All image files Alla bildfiler files filer Centered Centrerad Tiled Kaklad Center Tiled Centrerat kaklad Centered Maxpect Proportionellt centrerad Tiled Maxpect Proportionellt kaklad Scaled Skalad Centered Auto Fit Centrerad autojusterad Scale & Crop Skala & Beskär Symmetrical Tiled Symmetrisk mosaik Mirrored Tiled Speglad mosaik Symmetrical Mirrored Tiled Symmetrisk speglad mosaik QProgressDialog Cancel Avbryt SettingsDialog kBytes kBytes MBytes MBytes GBytes GBytes day(s) dag dagar month(s) månad månader second(s) sekund sekunder minute(s) minut minuter hour(s) timme timmar Set position Sätt position Clear history Rensa historik Are you sure? Är du säker? Settings Inställningar General options Generella alternativ Interval: Intervall: Border: Kant: Position: Position: Main Huvudmeny Choose in random order Välj slumpartad ordning Switch background on play Byt bakgrund vid körning Play automatically on application start Kör automatiskt vid programstart Disable splash screen Visa startskärm Quit after background change Stäng av efter bakgrundsbyte Start automatically when system starts Starta automatiskt när datorn startar Only use landscape-oriented photos Använd endast landskapsorienterade bilder Rotate images according to EXIF information Rotera bilder enligt EXIF information View info on photo Visa bildinformation View info in system tray tooltip Visa information i menyraden Use full desktop area Använd hela skrivbordet Photo has to be Bilden ska vara independent of oberoende av at least 1/2 of åtminstone 1/2 av at least 3/4 of åtminstone 3/4 av bigger than större än desktop's size skrivbordets storlek Store images in history for Spara bilder i historiken i Clear Rensa Direct connection Direkt anslutning Proxy connection Anslutning via proxy server Don't save locally remote photos if free disk space goes below Spara inte nedladdade bilder lokalt om det fria hårddiskutrymmet understiger Available modules: Tillgängliga moduler: Active modules: Aktiva moduler: Network Nätverk Use system proxy Använd system proxy Use custom proxy Använd en egen proxy konfiguration Port: Port: Authentication Autentisering Username: Användarnamn: Password: Lösenord: Server: Server: Changes won't be applied. Are you sure? Ändringar kommer inte att sparas. Är du säker? Left Vänster Right Höger SmugMug::DialogWidget Search for: Sök efter: Edit SmugMug item Redigera Smugmug objekt Add SmugMug item Lägg till ett Smugmug objekt SmugMug::Item Text: Text: SplashScreen Author: Upphovsman: Loading Files module ... Laddar fil modul ... Loading Folders module ... Laddar biblioteks modul ... Loading Flickr module ... Laddar Flickr modul ... Loading Yahoo! module ... Laddar Yahoo! modul ... Loading Panoramio module ... Laddar Panoramio modul ... Loading Ipernity module ... Laddar Ipernity modul ... Loading Photobucket module ... Laddar Photobucket modul ... Loading Buzznet module ... Laddar Buzznet modul ... Loading Picasa module ... Laddar Picasa modul ... Loading SmugMug module ... Laddar Smugmug modul ... Loading Google module ... Laddar Google modul ... Loading Vladstudio module ... Laddar Vladstudio modul ... Loading deviantART module ... Laddar deviantART modul ... Loading settings ... Laddar inställningar ... Launching Wally ... Startar Wally ... Viewer Right-click on photo to show actions Högerklicka på foto för att se alternativ Fit to window Anpassa till fönster Show full image Visa originalstorlek Zoom in Zooma in Zoom out Zooma ut Rotate clockwise Rotera medurs Rotate c. clockwise Rotera moturs Vladstudio::DialogWidget All Alla Abstract art Abstrakt konst Creatures Varelser Illustrations Illustrationer Photos Foton By ID Från ID By view count Från visningstillfällen Ascending Stigande Descending Avtagande Category: Kategori: Order: Ordning: Direction: Riktning: Edit Vladstudio item Redigera Vladstudio objekt Add Vladstudio item Lägg till ett Vladstudio objekt Vladstudio::Item All categories Alla kategorier Abstract art Abstrakt konst Creatures Varelser Illustrations Illustrationer Photos Foton by Id Från ID by view count Från visningstillfällen ascending stigande descending avtagande Wally::Application Cancel Avbryt Play Kör Pause Paus Next photo Nästa bild Save photo... Spara foto... Get EXIF info... Hämta EXIF information... Settings... Inställningar... Explore source Utforska källa About... Om... History... Historik... About Qt... Om Qt... Quit Avsluta English Engelska Italian Italienska Spanish Spanska German Tyska French Franska Russian Ryska Czech Tjeckiska Polish Polska Chinese Kinesiska Languages Språk Catalan Katalanska Greek Grekiska Korean Koreanska Hungarian Ungerska Danish Danska Swedish Svenska Turkish Turkiska Wally Error Wally fel Active Desktop must be disabled Aktivit skrivbord måste inaktiveras by: av: Location: Plats: Engine: Motor: Save photo Spara foto Images (*.png *.xpm *.jpg) Bilder (*.png *.xpm *.jpg) Right-click to show main menu Högerklicka för att visa huvudmeny Portuguese (Brazil) Portugisiska (Brasilien) Yahoo::DialogWidget All of these words Alla dessa ord Any of these words Vilket som helst av dessa ord Search for: Sök efter: Filter content Filtrera innehåll Yahoo! item Yahoo! objekt Unfiltered content can show offending or sexual explicit photos Ofiltrerat innehåll kan visa känsliga eller sexuellt anspelande foton Edit Yahoo! item Redigera Yahoo! objekt Add Yahoo! item Lägg till ett Yahoo! objekt Yahoo::Item Tags: Etiketter: and och or eller content filtered filtrerat innehåll wally-2.4.4/res/lang/wally_pl.ts0000644000000000000000000030447411676624760015307 0ustar rootroot AboutDialog Compiled with: Opracowany z: EXIF library: Biblioteka EXIF: present obecny not present nieobecny English Angielski Italian Włoski Russian Rosyjski Spanish Hiszpański Portuguese (Brazil) Portugalski (Brazylia) German Niemiecki French Czech Czeski Polish Polski Catalan Kataloński Greek Grecki Korean Koreański Hungarian Węgierski Danish Duński Swedish Szwedzki Turkish Turecki Chinese Chiński About Wally O Wally <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Autor: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Chciałbym podziękować Vincentowi Willem van Gogh za logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Kontakt do mnie<a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Details >> Detale >> Close Zamknij Extension Rozszerzenie Description Opis Supported image formats: Wspierane formaty obrazu: Additional info: Dodatkowe informacje: Language Język Translator Tłumacz Translations: Tłumaczenie: Bing::DialogWidget All of these words Wszystkie słowa Any of these words Którekolwiek słowo Search for: Szukaj: Strict Ścisły Moderate Moderowany Off Wyłączony Adult filter: Filtr treści: Bing item Bing punkt Unfiltered content can show offending or sexual explicit photos Niefiltrowana zawartość może okazać się obrażliwa lub zawierać zdjęcia o treści seksualnej Edit Bing item Edytuj Bing konto Add Bing item Dodaj Bing konto Bing::Item Tags: Tagi: and oraz or lub Adult filter: Filtr treści: Off Wyłączony Moderate Moderowany Strict Ścisły Buzznet::DialogWidget Search for: Szukaj: Edit Buzznet item Edytuj Buzznet konto Add Buzznet item Dodaj Buzznet konto Buzznet::Item Tag: Tag: DeviantArt::DialogWidget Search for: Szukaj: Strict Ścisły Off Wyłączony Adult filter: Filtr treści: deviantART item deviantART konto Unfiltered content can show offending or sexual explicit photos Niefiltrowana zawartość może okazać się obrażliwa lub zawierać zdjęcia o treści seksualnej Edit deviantART item Edytuj deviantART konto Add deviantART item Dodaj deviantART konto DeviantArt::Item Tag: Tag: Adult filter: Filtr treści: Off Wyłączony Strict Ścisły Exif::InfoDialog EXIF information Informacje EXIF Tag Tag Value Wartość No EXIF information available Brak dostępnych informacji EXIF Files::Core Loading folder... Ładuję katalog... Files::LabelPreview No preview available Brak podglądu Files::SettingsWidget Files Pliki Select a photo Wybierz zdjęcie Select a folder Wybierz katalog FilesSettingsWidget Photos Zdjęcia Add a photo Dodaj zdjęcie Add photos in folder Dodaj zdjęcie z folderu Delete photo Usuń zdjęcie Move photo up Przesuń zdjęcie w góre Move photo down Przesuń zdjęcie w dół Flickr::DialogWidget All of these words Wszystkie słowa Any of these words Którekolwiek słowo Search for: Szukaj: Full text Pełny text Tags only Tylko Tagi Largest Najszerszy Original Oryginalny Large Szeroki Medium Średni Small Mały Thumbnail Miniatura Square Prostokąt Smallest Najmniejszy Interestingness desc Interesowalność malejąco Relevance Odniesienie Date posted desc Data wysłania malejąco Date taken desc Data zrobienia malejąco Interestingness asc Interesowalność rosnąco Date posted asc Data wysłania rosnąco Date taken asc Data zrobienia rosnąco Size: Order: Kolejność: Edit Flickr item Edytuj Flickr konto Add Flickr item Dodaj Flickr konto Flickr::Item Text: Tekst: Tags: Tagi: and oraz or lub Size: Rozmiar: Largest Najszerszy Original Oryginalny Large Szeroki Medium Średni Small Mały Thumbnail Miniatura Square Prostokąt Smallest Najmniejszy Order: Kolejność: Interestingness desc Interesowalność malejąco Relevance Odniesienie Date posted desc Data wysłania malejąco Date taken desc Data zrobienia malejąco Interestingness asc Interesowalność rosnąco Date posted asc Data wysłania rosnąco Date taken asc Data zrobienia rosnąco Folders::DialogWidget Local Lokalny Remote Zdalny Include subfolders Zawiera podkatalogi Folder: Katalog: Passive Bierny Active Aktywny Server: Serwer: Port: Port: Transfer mode: Tryb transferu: Username: Nazwa użytkownika: Password: Hasło: Path: Ścieżka: Select a folder Wybierz katalog Edit folder Edytuj katalog Add folder Dodaj katalog Folders::LocalItem (with subfolders) (z podfolderami) Folders::RemoteItem Transfer mode: Tryb transferu: passive bierny active aktywny Folders::SettingsWidget Folders Katalogi FoldersSettingsWidget Folders Katalogi Add a folder Dodaj katalog Delete folder Usuń katalog Google::DialogWidget Search for: Szukaj: Strict Ścisły Moderate Moderowany Off Wyłączony Adult filter: Filtr treści: Google item Google konto Unfiltered content can show offending or sexual explicit photos Niefiltrowana zawartość może okazać się obrażliwa lub zawierać zdjęcia o treści seksualnej Edit Google item Edytuj Google konto Add Google item Dodaj Google konto Google::Item Text: Tekst: Adult filter: Filtr treści: Off Wyłączony Moderate Moderowany Strict Ścisły Gui::ColorButton Auto Auto History::Dialog Right-click on items to show options Prawy przycisk na elemencie żeby pokazać opcje History Historia Please wait... Proszę czekać... Downloading photo... Pobieram zdjęcie... Abort Przerwij Save photo Zapisz zdjęcie Images (*.png *.xpm *.jpg) Obrazy (*.png *.xpm *.jpg) Photo has been saved Zdjęcie zostało zapisane There was an error during download Nastąpił błąd podczas pobierania View photo... Wyświetl zdjęcie... Get EXIF info... Pokaż informacje EXIF... Save photo... Zapisz zdjęcie... Set as background Ustaw jako tło pulpitu Explore image source Eksploruj źródło obrazu History::EngineQueryModel All Wszystko History::PhotosQueryModel (no title) (brak tytułu) by: przez: (no author) (brak autora) Date: Data: Location: Lokalizacja: unknown nieznany Size: Rozmiar: Image size: Rozmiar obrazu: Engine: Silnik: EXIF: EXIF: No Nie Yes Tak History::TagsQueryModel All Wszystko HttpEngine::SettingsWidget Select a folder Wybierz katalog HttpSettingsWidget Photo sets Ustawienia zdjęcia Add a photo set Dodaj ustawienie zdjecia Delete photo set Usuń.ustawienia zdjęcia Options Opcje Save photos Zapisz zdjęcia Ipernity::DialogWidget All of these words Wszystkie słowa Any of these words Którekolwiek słowo Search for: Szukaj: Full text Pełny text Tags only Tylko Tagi Ipernity item Ipernity konto It can show offending or sexual explicit photos Może wyświetlać obraźliweobrazki lub o charakterze seksualnym Edit Ipernity item Edytuj Ipernity konto Add Ipernity item Dodaj Ipernity konto Ipernity::Item Text: Tekst: and oraz or lub Tags: Tagi: Main Error Błąd is already running Już działa Disclaimer Treści <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>Autor nie bierze odpowiedzialmości za zawartość, którą Wally pobiera z albumów internetowych.<br>Autor w żaden sposób nie odpowiada za te treści.</b><br><br>Jeżeli jest to dla ciebie problemem, proszę o używanie tylko lokalnych źródeł jak np:"Pliki" lub "Katalogi".<br>W przeciwnym razie, proszę wybrać <b>"Nie"</b>aby wyjść z programu Wally, lub używać go <b>na własną odpowiedzialność.</b><br><br>(Jeśli kontynuujesz, ta wiadomość pojawi się tylko raz)<br><br>Czy akceptujesz powyższe warunki? Another instance of Inne wystąpienie Map::View Drag to select. Right-click to zoom Przeciągnij aby wybrać. Kliknij prawym przyciskiem myszy aby powiększyć Zoom %1x Powiększenie %1x Map::Viewer Map viewer Przeglądarka map Panoramio::DialogWidget Select on map Wybierz mapę Longitude (min): Długość geograficzna (min): Longitude (max): Długość geograficzna (max): Latitude (min): Szerokość geograficzna (min): Latitude (max): Szerokość geograficzna (max): Popularity Popularność Upload date Data załadowania Original Oryginalny Medium Średni Small Mały Thumbnail Miniatura Square Prostokąt Mini square Mini Prostokąt Order: Kolejność: Size: Rozmiar: Edit Panoramio item Edytuj Panoramio konto Add Panoramio item Dodaj Panoramio konto Error Błąd Coordinates must be different Koordynaty muszą być inne Panoramio::Item lat: szer.geogr.: lon: dł.geogr.: Original Oryginalny Medium Średni Small Mały Thumbnail Miniatura Square Prostokąt Mini square Mini Prostokąt Popularity Popularność Upload date Data załadowania Longitude: Długość geograficzna: Latitude: Szerokość geograficzna: Size: Rozmiar: Order: Kolejność: Photobucket::DialogWidget All of these words Wszystkie słowa Any of these words Którekolwiek słowo Search for: Szukaj: Photobucket item Photobucket konto It can show offending or sexual explicit photos Może wyświetlać obraźliweobrazki lub o charakterze seksualnym Edit Photobucket item Edytuj Photobucket konto Add Photobucket item Dodaj Photobucket konto Photobucket::Item Text: Tekst: and oraz or lub Picasa::DialogWidget Search for: Szukaj: Edit Picasa item Edytuj Picasa konto Add Picasa item Dodaj Picasa konto Picasa::Item Text: Tekst: Pikeo::DialogWidget Search for: Szukaj: Default Domyślny Most viewed Najczęściej oglądane Upload date Data załadowania Date taken Data zrobienia Group add date Dodaj date Grupy Comment date Data komentarza Ascending Rosnąco Order: Kolejność: Edit Pikeo item Edytuj Pikeo konto Add Pikeo item Dodaj Pikeo konto Pikeo::Item Tags: Tagi: Order: Kolejność: Default Domyślny Most viewed Najczęściej oglądane Upload date Data załadowania Date taken Data zrobienia Group add date Dodaj date Grupy Comment date Data komentarza ascending rosnąco descending malejąco PositionModel Position Położenie Picture smaller than screen on the left, greater than screen on the right Obraz mniejszy niż obraz po lewej,większy niż obraz po prawej QColorDialog Hu&e: Od&cień: &Sat: &Nasycenie: &Val: &Wartość: &Red: &Czerwony: &Green: &Zielony: Bl&ue: Ne&ebieski: Select Color Wybierz Kolor &Basic colors &Kolory podstawowe &Custom colors &Kolory niestandardowe &Add to Custom Colors &Dodaj do kolrów niestandardowych QDialogButtonBox OK OK Cancel Przerwij Reset Resetuj &Yes &Tak &No &Nie Close Zamknij &Close &Zamknij QFileDialog Directories Katalogi &Open &Otwórz &Save &Zapisz Open Otwórz %1 already exists. Do you want to replace it? %1 już istnieje. Czy chcesz go zastąpić? %1 File not found. Please verify the correct file name was given. %1 Plik nie znaleziony. Proszę sprawdzić wprowadzoną nazwę pliku. My Computer Mój Komputer &Rename &Zmień nazwę &Delete &Usuń Show &hidden files Pokaż &ukryte pliki Back Wstecz Parent Directory Katalog nadrzędny List View Widok listy Detail View Widok szczegółowy Files of type: Pliki typu: Directory: Katalog: %1 Directory not found. Please verify the correct directory name was given. %1 Katalog nie znaleziony. Proszę sprawdzić wprowadzoną nazwę katalogu. '%1' is write protected. Do you want to delete it anyway? '%1' jest zabezpieczony przed zapisem. Czy pomimo tego usunąć? Are sure you want to delete '%1'? Jesteś pewny, że chcesz usunąć '%1'? Could not delete directory. Nie można usunąć katalogu. Recent Places Ostatnio używane miejsca Save As Zapisz jako Drive Dysk File Plik Unknown Nieznany Find Directory Znajdź Katalog Show Pokaż Forward W przód New Folder Nowy Katalog &New Folder &Nowy Katalog &Choose &Wybierz Remove Usuń File &name: Nazwa &pliku: Look in: Patrz w: Create New Folder Twórz Nowy Katalog QObject All image files Wszystkie pliki obrazów files pliki Centered Wycentrowany Tiled Taflowy Center Tiled Taflowy Wycentrowany Centered Maxpect Rozciągnięcie Wycentrowane Tiled Maxpect Rozciągnięcie Taflowe Scaled Zeskalowany Centered Auto Fit Wycentrowany Auto Dopasowany Scale & Crop Skaluj & Przytnij Symmetrical Tiled Symetrycznie wykafelkowane Mirrored Tiled Odbite lustrem i wykafelkowane Symmetrical Mirrored Tiled Symetrycznie odbite lustrem i wykafelkowane QProgressDialog Cancel Przerwij SettingsDialog Settings Ustawienia Left W lewo Right W prawo kBytes kBytes MBytes MBytes GBytes GBytes day(s) dzień dni dni month(s) miesiąc miesiące miesiące second(s) sekund sekundy sekund minute(s) minut minuty minut hour(s) godzin godziny godzin Set position Ustaw pozycję Changes won't be applied. Are you sure? Zmiany nie będą zastosowane. Jesteś pewien? Clear history Wyczyść historię Are you sure? Jesteś pewny(a)? General options Opcje ogólne Interval: Okres: Border: Obramowanie: Position: Położenie: Main Główny Choose in random order Wybierz przypadkową kolejność Switch background on play Włączyć tło na play Play automatically on application start Uruchom automatycznie przy starcie aplikacji Disable splash screen Wyłącz ekran powitalny Quit after background change Zamknij po zmianie tła Start automatically when system starts Uruchom automatycznie przy starcie systemu Only use landscape-oriented photos Użyj tylko poziomo-zorientowane zdjęcia Rotate images according to EXIF information Obróć obrazy na podstawie informacji EXIF View info on photo Wyświetl informacje na zdjęciu View info in system tray tooltip Wyświetl informację tooltip w pasku systemowym Use full desktop area Użyj całej powierzchni pulpitu Photo has to be Zdjęcie musi być independent of niezależnie od at least 1/2 of co najmniej 1/2 z at least 3/4 of co najmniej 3/4 z bigger than większy niż desktop's size rozmiar pulpitu Don't save locally remote photos if free disk space goes below Nie zapisuj lokalnie zdjec zdalnych, jeżeli pozostalo miejsca poniżej Store images in history for Zachowuj obrazy w historii przez Clear Wyczyść Available modules: Dostępne moduły: Active modules: Aktywne moduły: Network Sieć Direct connection Bezpośrednie połączenie Proxy connection Połączenie proxy Use system proxy Użyj proxy systemowe Use custom proxy Użyj proxy niestandardowe Server: Serwer: Port: Port: Authentication Autentyfikacja Username: Nazwa użytkownika: Password: Hasło: SmugMug::DialogWidget Search for: Szukaj: Edit SmugMug item Edytuj SmugMug konto Add SmugMug item Dodaj SmugMug konto SmugMug::Item Text: Tekst: SplashScreen Loading Files module ... Ładuje moduł Plików ... Loading Folders module ... Ładuje moduł Katalogów ... Loading Flickr module ... Ładuje moduł Flickr ... Loading Yahoo! module ... Ładuje moduł Yahoo! ... Loading Panoramio module ... Ładuje moduł Panoramio ... Loading Ipernity module ... Ładuje moduł Ipernity ... Loading Photobucket module ... Ładuje moduł Photobucket ... Loading Buzznet module ... Ładuje moduł Buzznet ... Loading Picasa module ... Ładuje moduł Picasa ... Loading SmugMug module ... Ładuje moduł SmugMug! ... Loading Google module ... Ładuje moduł Google ... Loading Vladstudio module ... Ładuje moduł Vladstudio ... Loading deviantART module ... Ładuje moduł deviantART ... Loading settings ... Ładuję ustawienia ... Launching Wally ... Uruchamianie Wally ... Author: Autor: Viewer Right-click on photo to show actions Prawy przycisk na elemencie żeby pokazać akcje Fit to window Dopasuj do okna Show full image Pokaż pełne zdjęcie Zoom in Powiększenie Zoom out Pomniejszenie Rotate clockwise Obróć zgodnie ze wskazówkami zegara Rotate c. clockwise Obróć odwrotnie do wskazówek zegara Vladstudio::DialogWidget All Wszystko Abstract art Sztuka abstrakcyjna Creatures Stworzenia Illustrations Ilustracje Photos Zdjęcia By ID Po ID By view count Po ilości wyświetleń Ascending Rosnąco Descending Malejąco Category: Kategoria: Order: Kolejność: Direction: Kierunek: Edit Vladstudio item Edytuj Vladstudio konto Add Vladstudio item Dodaj Vladstudio konto Vladstudio::Item All categories Wszystkie kategorie Abstract art Sztuka abstrakcyjna Creatures Stworzenia Illustrations Ilustracje Photos Zdjęcia by Id Po ID by view count Po ilości wyświetleń ascending rosnąco descending malejąco Wally::Application Cancel Przerwij Play Play Pause Pauza Next photo Następny obraz Save photo... Zapisz obraz... Get EXIF info... Pokaż informacje EXIF... Settings... Ustawienia... Explore source Eksploruj źródło obrazu About... O programie... History... Historia... About Qt... O programie Qt... Quit Wyjdź English Angielski Italian Włoski Spanish Hiszpański German Niemiecki French Francuski Russian Rosyjski Portuguese (Brazil) Portugalski (Brazylia) Czech Czeski Polish Polski Chinese Chiński Languages Języki Catalan Kataloński Greek Grecki Korean Koreański Hungarian Węgierski Danish Duński Swedish Szwedzki Turkish Turecki Wally Error Błąd Wally Active Desktop must be disabled Active desctop musi być wyłączony by: przez: Location: Lokalizacja: Engine: Silnik: Save photo Zapisz zdjęcie Images (*.png *.xpm *.jpg) Obrazy (*.png *.xpm *.jpg) Right-click to show main menu Prawy przycisk żeby wyświetlić menu główne Yahoo::DialogWidget All of these words Wszystkie słowa Any of these words Którekolwiek słowo Search for: Szukaj: Filter content Filtr zawartości Yahoo! item Yahoo! konto Unfiltered content can show offending or sexual explicit photos Niefiltrowana zawartość może okazać się obrażliwa lub zawierać zdjęcia o treści seksualnej Edit Yahoo! item Edytuj Yahoo! konto Add Yahoo! item Dodaj Yahoo! konto Yahoo::Item Tags: Tagi: and oraz or lub content filtered Zawartość przefiltrowana wally-2.4.4/res/lang/wally_ca.ts0000644000000000000000000030557311676624760015260 0ustar rootroot AboutDialog Compiled with: Compilat amb: EXIF library: Llibreria EXIF: present present not present no present English Anglès Italian Italià Russian Rus Spanish Espanyol Portuguese (Brazil) Portuguès (Brazil) German Alemany French Francès Czech Txec Chinese Xinès Polish Polonès Catalan Català Greek Grec Korean Coreà Hungarian Hongarès Danish Danès Swedish Suec Turkish Turc About Wally En quant a Wally <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Qt4 intercambiador de fons d'escriptori<br />Autor: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Voldria agraïr a Vincent Willem van Gogh pel logotip :)<br /><br />Lloc Web: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Em pots contactar a <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Details >> Detalls >> Close Tancar Extension Extensió Description Descripció Supported image formats: Formats d'imatge suportats: Additional info: Informació adicional: Language Idioma Translator Traductor Translations: Traducions: Bing::DialogWidget All of these words Tots aquests termes Any of these words Qualsevol d'aquests termes Search for: Buscar per: Strict Estricte Moderate Moderat Off Apagat Adult filter: Filtre adult: Bing item Element Bing Unfiltered content can show offending or sexual explicit photos El contingut sense filtrar pot mostrar imatges ofensives o amb contingut sexual explícit Edit Bing item Editar element Bing Add Bing item Afegir element Bing Bing::Item Tags: Etiquetes: and i or o Adult filter: Filtre adult: Off Apagat Moderate Moderat Strict Estricte Buzznet::DialogWidget Search for: Cercar per: Edit Buzznet item Editar element Buzznet Add Buzznet item Afegir element Buzznet Buzznet::Item Tag: Etiqueta: DeviantArt::DialogWidget Search for: Buscar per: Strict Estricte Off Apagat Adult filter: Filtre adult: deviantART item Element deviantART Unfiltered content can show offending or sexual explicit photos El contingut sense filtrar pot mostrar imatges ofensives o amb contingut sexual explícit Edit deviantART item Editar element deviantART Add deviantART item Afegir element deviantART DeviantArt::Item Tag: Etiqueta: Adult filter: Filtre adult: Off Apagat Strict Estricte Exif::InfoDialog EXIF information Informació EXIF Tag Etiqueta Value Valor No EXIF information available Informació EXIF no disponible Files::Core Loading folder... Carregant directori... Files::LabelPreview No preview available Previsualització no disponible Files::SettingsWidget Files Arxius Select a photo Escull una imatge Select a folder Escull un directori FilesSettingsWidget Photos A diferència de l'original que a vegades fa servir "image" i a vegades "photo", he fet servir "imatges" a tota la traducció en comptes de fotografies, ja que crec que tots els wallpapers són imatges, però no cal que totes les imatges siguin fotos. Imatges Add a photo Afegir imatge Add photos in folder Afegir imatge a la carpeta Delete photo Eliminar imatge Move photo up Moure imatge amunt Move photo down Moure imatge avall Flickr::DialogWidget All of these words Tots aquests termes Any of these words Alguns d'aquests termes Search for: Cercar per: Full text Text complet Tags only Només etiquetes Largest La més gran Original Original Large Gran Medium Mitjà Small Petit Thumbnail Miniatura Square Quadrat Smallest La més petita Interestingness desc Interès descendent Relevance Rellevancia Date posted desc Data de publicació descendent Date taken desc Data de presa descendent Interestingness asc Interès ascendent Date posted asc Data de publicació ascendent Date taken asc Data de presa ascendent Size: Mida: Order: Ordre: Edit Flickr item Editar element Flickr Add Flickr item Afegir element Flickr Flickr::Item Text: Text: Tags: Etiquetes: and i or o Size: Mida: Largest La més gran Original Original Large Gran Medium Mitjana Small Petita Thumbnail Miniatura Square Quadrat Smallest La més petita Order: Ordre: Interestingness desc Interès descendent Relevance Rellevança Date posted desc Data de publicació descendent Date taken desc Data de presa descendent Interestingness asc Interès ascendent Date posted asc Data de publicació ascendent Date taken asc Data de presa ascendent Folders::DialogWidget Local Local Remote Remot Include subfolders Incloure subdirectoris Folder: Directori: Passive Passiu Active Actiu Server: Servidor: Port: Port: Transfer mode: Mode de transferència: Username: Usuari: Password: Contrasenya: Path: Ruta: Select a folder Escull un directori Edit folder Edita directori Add folder Afegeix directori Folders::LocalItem (with subfolders) (amb sub-directoris) Folders::RemoteItem Transfer mode: Mode de transferència: passive Passiu active Actiu Folders::SettingsWidget Folders Directoris FoldersSettingsWidget Folders Directoris Add a folder Afegeix directori Delete folder Eliminar directori Google::DialogWidget Search for: Buscar per: Strict Estricte Moderate Moderat Off Apagat Adult filter: Filtre adult: Google item Element Google Unfiltered content can show offending or sexual explicit photos El contingut sense filtrar pot mostrar imatges ofensives o amb contingut sexual explícit Edit Google item Editar element Google Add Google item Afegir element Google Google::Item Text: Text: Adult filter: Filtre adult: Off Apagat Moderate Moderat Strict Estricte Gui::ColorButton Auto Auto History::Dialog Right-click on items to show options Fes click amb el botó dret per mostrar opcions History Historial Please wait... Espereu siusplau... Downloading photo... Descarregant imatge... Abort Abortar Save photo Desar imatge Images (*.png *.xpm *.jpg) Imatges (*.png *.xpm *.jpg) Photo has been saved La imatge s'ha desat There was an error during download Ha ocorregut un error durant la descàrrega View photo... Veure imatge... Get EXIF info... Obtenir informació EXIF... Save photo... Desar imatge... Set as background Utilitzar com a fons d'escriptori Explore image source Explorar la font de la imatge History::EngineQueryModel All Tots History::PhotosQueryModel (no title) (sense títol) by: Per: (no author) (sense autor) Date: Data: Location: Localització: unknown desconegut Size: Mida: Image size: Mida de la imatge: Engine: Motor: EXIF: EXIF: No No Yes History::TagsQueryModel All Tots HttpEngine::SettingsWidget Select a folder Escull un directori HttpSettingsWidget Photo sets Sets d'imatges Add a photo set Afegir set d'imatges Delete photo set Eliminar set d'imatges Options Opcions Save photos Desar imatges Ipernity::DialogWidget All of these words Tots aquests termes Any of these words Qualsevol d'aquests termes Search for: Cercar per: Full text Text complet Tags only Només etiquetes Ipernity item Element Ipernity It can show offending or sexual explicit photos Es poden mostrar imatges ofensives o amb contingut sexual explícit Edit Ipernity item Editar element Ipernity Add Ipernity item Afegir element Ipernity Ipernity::Item Text: Text: and i or o Tags: Etiquetes: Main Error Error is already running ja està en funcionament Disclaimer Descàrrec <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>L'autor no pren cap responsabilitat respecte als continguts que Wally descarrega de les webs d'intercanvi d'imatges<br>L'autor no és de cap manera responsable d'aquests continguts</b><br><br>Si això et resulta un problema, si us plau, fes servir només mòduls locals com "Arxius" o "Directoris"<br>En tot cas, tria<b>"No"</b> per tancar Wally, o fes-lo servir<b>sota el teu risc</b><br><br>(Si accedeixes, aquest missatge només es mostrarà una sola vegada)<br><br>Acceptes les condicions descrites? Another instance of Una altra instància de Map::View Drag to select. Right-click to zoom Arrosega per a seleccionar. Fes click amb el botó dret per a fer zoom Zoom %1x Zoom %1x Map::Viewer Map viewer Visor de mapes Panoramio::DialogWidget Select on map Seleccionar al mapa Longitude (min): Longitud (min): Longitude (max): Longitud (max): Latitude (min): Latitud (min): Latitude (max): Latitud (max): Popularity Popularitat Upload date Data de publicació Original Original Medium Mitjana Small Petita Thumbnail Miniatura Square Quadrat Mini square Quadrat petit Order: Ordre: Size: Mida: Edit Panoramio item Editar element Panoramio Add Panoramio item Afegir element Panoramio Error Error Coordinates must be different Les coordenades han de ser diferents Panoramio::Item lat: lat: lon: lon: Original Original Medium Mitjana Small Petita Thumbnail Miniatura Square Quadrat Mini square Quadrat petit Popularity Popularitat Upload date Data de publicació Longitude: Longitud: Latitude: Latitud: Size: Mida: Order: Ordre: Photobucket::DialogWidget All of these words Tots aquests termes Any of these words Qualsevol d'aquests termes Search for: Cercar per: Photobucket item Element Photobucket It can show offending or sexual explicit photos Es poden mostrar imatges ofensives o amb contingut sexual explícit Edit Photobucket item Editar element Photobucket Add Photobucket item Afegir element Photobucket Photobucket::Item Text: Text: and i or o Picasa::DialogWidget Search for: Cercar per: Edit Picasa item Editar element Picasa Add Picasa item Afegir element Picasa Picasa::Item Text: Text: Pikeo::DialogWidget Search for: Buscar per: Default Per defecte Most viewed El més vist Upload date Data de publicació Date taken Data de presa Group add date Afegir data al grup Comment date Data de comentari Ascending Ascendent Order: Ordre: Edit Pikeo item Editar element Pikeo Add Pikeo item Afegir element Pikeo Pikeo::Item Tags: Etiquetes: Order: Ordre: Default Per defecte Most viewed El més vist Upload date Data de publicació Date taken Data de presa Group add date Afegir data de grup Comment date Data de comentari ascending ascendent descending descendent PositionModel Position Posició Picture smaller than screen on the left, greater than screen on the right Imatge més petita que la pantalla a l'esquerra, més gran que la pantalla a la dreta QColorDialog Hu&e: &Tonalitat: &Sat: &Sat: &Val: &Val: &Red: Ver&mell: &Green: Ver&d: Bl&ue: &Blau: Select Color Triar Color &Basic colors &Colors bàsics &Custom colors Colors &personalitzats &Add to Custom Colors &Afegir a colors personalitzats QDialogButtonBox OK D'acord Cancel Cancel·lar Reset Reiniciar &Yes &Sí &No &No Close Tancar &Close &Tancar QFileDialog Directories Directoris &Open &Obrir &Save &Desar Open Obrir %1 already exists. Do you want to replace it? %1 ja existeix. Ho vols reemplaçar? %1 File not found. Please verify the correct file name was given. %1 No s'ha trobat l'arxiu. Siusplau, verifica que el nom d'arxiu és correcte. My Computer El meu ordinador &Rename &Canviar el nom &Delete &Eliminar Show &hidden files Mostra arxius &Ocults Back Enrrere Parent Directory Directory pare List View Llistat Detail View Detalls Files of type: Arxius del tipus: Directory: Directori: %1 Directory not found. Please verify the correct directory name was given. %1 No s'ha trobat el directory. Siusplau, verifica que el nom del directori és correcte. '%1' is write protected. Do you want to delete it anyway? '%1' està protegit contra escriptura. El voleu eliminar igualment? Are sure you want to delete '%1'? N'estàs segur que vols eliminar '%1'? Could not delete directory. No s'ha pogut eliminar el directory. Recent Places Llocs recents Save As Desar Com Drive Unitat de disc File Arxiu Unknown Desconegut Find Directory Buscar directory Show Mostrar Forward Endavant New Folder Nova carpeta &New Folder &Nova Carpeta &Choose &Escollir Remove Borrar File &name: &Nom d'arxiu: Look in: Mirar a: Create New Folder Crear Nova Carpeta QObject All image files Tots els arcius d'imatge files arxius Centered Centrat Tiled En mosaic Center Tiled Centrat en mosaic Centered Maxpect Centrat amb retall/ampliat proporcional Tiled Maxpect Mosaic amb retall/ampliat proporcional Scaled Reescalat Centered Auto Fit Centrat i autoajustat Scale & Crop Reescalat i retallat Symmetrical Tiled Mosaic simètric Mirrored Tiled Mosaic en mirall Symmetrical Mirrored Tiled Mosaic simètric en mirall QProgressDialog Cancel Cancel·lar SettingsDialog Settings també paràmetres Configuració Left esquerra Right dreta kBytes Kilobytes MBytes Megabytes GBytes Gigabytes day(s) dia dies month(s) mes mesos second(s) segon segons minute(s) minut minuts hour(s) hora hores Set position Defineix posició Changes won't be applied. Are you sure? Els canvis no s'aplicaràn. N'estàs segur? Clear history Historial buidat Are you sure? N'estàs segur? General options Opcions generals Interval: Intèrval: Border: Contorn: Position: Posició: Main Principal: Choose in random order Agafar aleatòriament Switch background on play Canviar fons d'escriptori a l'activar Play automatically on application start Iniciar automàticament en obrir l'aplicació Disable splash screen Desactiva la pantalla de presentació Quit after background change Apaga després de canviar el fons d'escriptori Start automatically when system starts Obrir automàticament a l'inici del sistema Only use landscape-oriented photos Utilitzar només imatges apaisades Rotate images according to EXIF information Rotar les imatges d'acord amb la informació EXIF View info on photo Veure la informació a la foto View info in system tray tooltip Veure informació a l'indicador de la safata del sistema Use full desktop area Utilitzar tot l'escriptori Photo has to be La fotografia ha de ser independent of independent de at least 1/2 of com a mínim la meitat de at least 3/4 of com a mínim tres quarts de bigger than més gran que desktop's size la mida de l'escriptori Don't save locally remote photos if free disk space goes below No desis localment les imatges remotes si l'espai lliure al disc està per sota de Store images in history for Desa imatges a l'historial per a Clear Buidar Available modules: Mòduls disponibles: Active modules: Mòduls activats: Network Xarxa Direct connection Connexió directa Proxy connection Connexió amb servidor intermediari Use system proxy Utilitzar el servidor intermediari del sistema Use custom proxy Utilitzar servidor intermediari personalitzat Server: Servidor: Port: Port: Authentication Autentificació Username: Nom d'usuari: Password: Contrasenya: SmugMug::DialogWidget Search for: Cercar per: Edit SmugMug item Editar element SmugMug Add SmugMug item Afegir element SmugMug SmugMug::Item Text: Text: SplashScreen Loading Files module ... Carregant mòdul Arxius ... Loading Folders module ... Carregant mòdul Directoris ... Loading Flickr module ... Carregant mòdul Flickr ... Loading Yahoo! module ... Carregant mòdul Yahoo! ... Loading Panoramio module ... Carregant mòdul Panoramio ... Loading Ipernity module ... Carregant mòdul Ipernity ... Loading Photobucket module ... Carregant mòdul Photobucket ... Loading Buzznet module ... Carregant mòdul Buzznet ... Loading Picasa module ... Carregant mòdul Picasa ... Loading SmugMug module ... Carregant mòdul SmugMug ... Loading Google module ... Carregant mòdul Google ... Loading Vladstudio module ... Carregant mòdul Vladstudio ... Loading deviantART module ... Carregant mòdul deviantART ... Loading settings ... Carregant la configuració ... Launching Wally ... Iniciant Wally ... Author: Autor: Viewer Right-click on photo to show actions Fes click amb el botó dret per mostrar accions Fit to window Ajustar a la finestra Show full image Mostrar imatge completa Zoom in Ampliar Zoom out Reduïr Rotate clockwise Rotar a favor de rellotge Rotate c. clockwise Rotar en contra de rellotge Vladstudio::DialogWidget All Tots Abstract art Art abstracte Creatures Criatures Illustrations Il·lustracions Photos Imatges By ID Per ID By view count Per nombre de vistes Ascending Ascendent Descending Descendent Category: Categoria: Order: Ordre: Direction: Direcció: Edit Vladstudio item Editar element Vladstudio Add Vladstudio item Afegir element Vladstudio Vladstudio::Item All categories Totes les categories Abstract art Art abstracte Creatures Criatures Illustrations Il·lustracions Photos Imatges by Id per Id by view count per nombre de vistes ascending ascendent descending descendent Wally::Application Cancel Cancel·lar Play Iniciar Pause Pausa Next photo Imatge següent Save photo... Desar imatge... Get EXIF info... Obtenir informació EXIF... Settings... Opcions... Explore source Explorar la font About... Quant a... History... Historial... About Qt... Quant a Qt... Quit Sortir Languages Idiomes English Anglès Italian Italià Spanish Espanyol German Alemany French Francès Russian Rus Portuguese (Brazil) Portugès (Brazil) Czech Txec Polish Polonès Chinese Xinès Catalan Català Greek Grec Korean Coreà Hungarian Hongarès Danish Danès Swedish Suec Turkish Turc Wally Error Error de'n Wally Active Desktop must be disabled cal desactivar Active Desktop by: per: Location: Localització: Engine: Motor: Save photo Desar imatge Images (*.png *.xpm *.jpg) Imatges (*.png *.xpm *.jpg) Right-click to show main menu Fer click amb el botó dret per mostrar el menú principal Yahoo::DialogWidget All of these words Tots aquests termes Any of these words Alguns d'aquests termes Search for: Cercar per: Filter content Filtrar contingut Yahoo! item Element Yahoo! Unfiltered content can show offending or sexual explicit photos El contingut sense filtrar pot mostrar imatges ofensives o amb contingut sexual explícit Edit Yahoo! item Editar element Yahoo! Add Yahoo! item Afegir element Yahoo! Yahoo::Item Tags: Etiquetes: and i or o content filtered contingut filtrat wally-2.4.4/res/lang/wally_fr.ts0000644000000000000000000030573411676624760015303 0ustar rootroot AboutDialog Supported image formats: Formats d'image supportés: About Wally A propos de Wally Details >> Détails >> Compiled with: Compilé avec: EXIF library: Librairie EXIF: present présente not present non présente Close Fermer Extension Extension Description Description Additional info: Informations supplémentaires: Language Langue Translator Traducteur <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Changeur de fond d'écran Qt4 <br />Auteur: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Jevoudrais remercier Vincent Willem van Gogh pour le logo :)<br /><br />Site web: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Vous pouvez me contacter à l'adresse <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Italian Italien English Anglais Russian Russe Spanish Espagnol Portuguese (Brazil) Portugais (Brésil) Chinese Chinois Hungarian Hongrois Danish Danois Swedish Suédois Turkish Turc German Allemand French Français Czech Tchèque Translations: Traductions: Polish Polonais Catalan Catalan Greek Grec Korean Coréen Bing::DialogWidget All of these words Tous ces mots Any of these words N'importe lequel de ces mots Search for: Rechercher: Strict Strict Moderate Modéré Off Désactivé Adult filter: Filtre de contenu pour adulte: Bing item Recherche Bing Unfiltered content can show offending or sexual explicit photos Du contenu non filtré peut montrer des photos chocantes ou sexuellement explicites Edit Bing item Editer la recherche Bing Add Bing item Ajouter une recherche Bing Bing::Item Tags: Tags: and et or ou Adult filter: Filtre de contenu pour adulte: Off Désactivé Moderate Modéré Strict Strict Buzznet::DialogWidget Search for: Rechercher: Edit Buzznet item Editer la recherche Buzznet Add Buzznet item Ajouter une recherche Buzznet Buzznet::Item Tag: Tag: DeviantArt::DialogWidget Search for: Rechercher: Strict Strict Off Désactivé Adult filter: Filtre de contenu pour adulte: deviantART item Recherche deviantART Unfiltered content can show offending or sexual explicit photos Du contenu non filtré peut montrer des photos chocantes ou sexuellement explicites Edit deviantART item Editer la recherche deviantART Add deviantART item Ajouter une recherche deviantART DeviantArt::Item Tag: Tag: Adult filter: Filtre de contenu pour adulte: Off Désactivé Strict Strict Exif::InfoDialog EXIF information Informations EXIF Tag Tag Value Valeur No EXIF information available Pas d'informations EXIF disponibles Files::Core Loading folder... Chargement du dossier... Files::LabelPreview No preview available Pas de prévisualisation disponible Files::SettingsWidget Select a photo Choisir une photo Select a folder Choisir un dossier Files Fichiers FilesSettingsWidget Photos Photos Add a photo Ajouter une photo Add photos in folder Ajouter une photo dans le dossier Delete photo Supprimer la photo Move photo up Monter la photo Move photo down Descendre la photo Flickr::DialogWidget All of these words Tous ces mots Any of these words N'importe lequel de ces mots Search for: Rechercher: Full text Plein texte Tags only Seulement les tags Largest La plus grande Original Originale Large Grande Medium Moyenne Small Petite Thumbnail Miniature Square Carré Smallest La plus petite Relevance Pertinence Size: Taille: Order: Ordre: Edit Flickr item Editer la recherche Flickr Add Flickr item Ajouter une recherche Flickr Interestingness desc Intérêt décroissant Date posted desc Date de partage décroissante Date taken desc Date de prise de vue décroissante Interestingness asc Intérêt croissant Date posted asc Date de partage croissante Date taken asc Date de prise de vue croissante Flickr::Item Text: Texte: Tags: Tags: and et or ou Size: Taille: Largest La plus grande Original Originale Large Grande Medium Moyenne Small Petite Thumbnail Miniature Square Carré Smallest La plus petite Order: Ordre: Relevance Pertinence Interestingness desc Intérêt décroissant Date posted desc Date de partage décroissante Date taken desc Date de prise de vue décroissante Interestingness asc Intérêt croissant Date posted asc Date de partage croissante Date taken asc Date de prise de vue croissante Folders::DialogWidget Include subfolders Inclure les sous-dossiers Select a folder Choisir un dossier Edit folder Editer le dossier Add folder Ajouter un dossier Local Local Remote Distant Folder: Dossier: Passive Passif Active Actif Server: Serveur: Port: Port: Transfer mode: Mode de transfert: Username: Nom d'utilisateur: Password: Mot de passe: Path: Chemin: Folders::LocalItem (with subfolders) (avec les sous-dossiers) Folders::RemoteItem Transfer mode: Mode de transfert: passive passif active actif Folders::SettingsWidget Folders Dossiers FoldersSettingsWidget Folders Dossiers Add a folder Ajouter un dossier Delete folder Enlever le dossier Google::DialogWidget Search for: Rechercher: Strict Strict Moderate Modéré Off Désactivé Adult filter: Filtre de contenu pour adulte: Google item Recherche Google Unfiltered content can show offending or sexual explicit photos Du contenu non filtré peut montrer des photos chocantes ou sexuellement explicites Edit Google item Editer la recherche Google Add Google item Ajouter une recherche Google Google::Item Text: Texte: Adult filter: Filtre de contenu pour adulte: Off Désactivé Moderate Modéré Strict Strict Gui::ColorButton Auto Auto History::Dialog Right-click on items to show options Faire un clic droit sur l'objet pour voir les options History Historique Please wait... Veuillez patienter... Downloading photo... Téléchargement de la photo... Abort Annuler Save photo Enregistrer la photo Images (*.png *.xpm *.jpg) Images (*.png *.xpm *.jpg) Photo has been saved La photo a été enregistrée There was an error during download Il y a eu une erreur pendant le téléchargement View photo... Voir la photo... Get EXIF info... Voir les informations EXIF... Save photo... Enregistrer la photo... Set as background Utiliser comme papier-peint Explore image source Explorer la source d'image History::EngineQueryModel All Tout History::PhotosQueryModel Image size: Taille d'image: Engine: Moteur: EXIF: EXIF: No Non Yes Oui (no title) (pas de titre) by: par: (no author) (pas d'auteur) Location: Lieu: unknown inconnu Size: Taille: Date: Date: History::TagsQueryModel All Tout HttpEngine::SettingsWidget Select a folder Choisir un dossier HttpSettingsWidget Photo sets Ensembles de photos Options Options Save photos Enregistrer les photos Add a photo set Ajouter un ensemble de photos Delete photo set Supprimer un ensemble de photos Ipernity::DialogWidget All of these words Tous ces mots Any of these words N'importe lequel de ces mots Search for: Rechercher: Full text Plein texte Tags only Seulement les tags Edit Ipernity item Editer la recherche Ipernity Add Ipernity item Ajouter une recherche Ipernity Ipernity item Recherche Ipernity It can show offending or sexual explicit photos Cela peut afficher des photos chocantes ou sexuellement explicites Ipernity::Item Text: Texte: and et or ou Tags: Tags: Main Error Erreur is already running est déjà en cours d'exécution Disclaimer Avertissement <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>L'Auteur n'a aucune responsabilité sur le contenu que Wally télécharge depuis les sites de partage de photos.<br>L'Auteur n'est en rien responsable d'un tel contenu.</b><br><br>Si cela vous pose problème, s'il vous plait n'utilisez que les moteurs de recherche locaux tels que "Fichiers" ou "Dossiers".<br>Sinon, sélectionnez <b>Non</b> pour quitter Wally, ou utilisez-le <b>à vos risques et périls.</b><br><br>(Si vous continuez ce message n'apparaitra qu'une seule fois)<br><br>Acceptez-vous les conditions ci-dessus ? Another instance of Une autre instance de Map::View Drag to select. Right-click to zoom Glisser pour sélectionner. Clic-droit pour zoomer Zoom %1x Zoom %1x Map::Viewer Map viewer Visualisation de la carte Panoramio::DialogWidget Select on map Sélectionner sur la carte Longitude (min): Longitude (min): Longitude (max): Longitude (max): Latitude (min): Latitude (min): Latitude (max): Latitude (max): Popularity Popularité Upload date Date de partage Original Originale Medium Moyenne Small Petite Thumbnail Miniature Square Carré Mini square Mini-carré Order: Ordre: Size: Taille: Edit Panoramio item Editer la recherche Panoramio Add Panoramio item Ajouter une recherche Panoramio Error Erreur Coordinates must be different Les coordonnées doivent être différentes Panoramio::Item Original Originale Medium Moyenne Small Petite Thumbnail Miniature Square Carré Mini square Mini-carré Popularity Popularité Upload date Date de partage Longitude: Longitude: Latitude: Latitude: Size: Taille: Order: Ordre: lat: lat: lon: lon: Photobucket::DialogWidget Search for: Rechercher: Edit Photobucket item Editer la recherche Photobucket Add Photobucket item Ajouter une recherche Photobucket All of these words Tous ces mots Any of these words N'importe lequel de ces mots Photobucket item Recherche Photobucket It can show offending or sexual explicit photos Cela peut afficher des photos chocantes ou sexuellement explicites Photobucket::Item Text: Texte: and et or ou Picasa::DialogWidget Search for: Rechercher: Edit Picasa item Editer la recherche Picasa Add Picasa item Ajouter une recherche Picasa Picasa::Item Text: Texte: Pikeo::DialogWidget Search for: Rechercher: Default Défaut Most viewed Les plus vues Upload date Date de partage Date taken Date de prise de vue Group add date Date d'ajout du groupe Comment date Date de commentaire Ascending Croissant Order: Ordre: Edit Pikeo item Editer la recherche Pikeo Add Pikeo item Ajouter une recherche Pikeo Pikeo::Item Tags: Tags: Order: Ordre: Default Défaut Most viewed Les plus vues Upload date Date de partage Date taken Date de prise de vue Group add date Date d'ajout du groupe Comment date Date de commentaire ascending croissant descending décroissant PositionModel Position Position Picture smaller than screen on the left, greater than screen on the right Photo plus petite que l'écran à gauche, plus grande que l'écran à droite QColorDialog Hu&e: &Teinte: &Sat: &Saturation: &Val: &Valeur: &Red: &Rouge: &Green: &Vert: Bl&ue: Ble&u: Select Color Choisir les couleurs &Basic colors Couleurs de &base &Custom colors Couleurs &personnalisées &Add to Custom Colors &Ajouter aux couleurs personnalisées QDialogButtonBox OK OK Cancel Annuler Reset Remise à zéro &Yes &Oui &No &Non Close Fermer &Close &Fermer QFileDialog Directories Dossiers &Open &Ouvrir &Save Enregi&strer Open Ouvrir %1 already exists. Do you want to replace it? %1 existe déjà. Voulez-vous le remplacer ? %1 File not found. Please verify the correct file name was given. %1 Fichier non trouvé. Vérifiez que le nom de fichier. My Computer Poste de travail &Rename &Renommer &Delete &Supprimer Show &hidden files Afficher les fichiers cac&hés Back Retour Parent Directory Dossier parent List View Liste Detail View Détails Files of type: Fichiers de type: Directory: Dossier: %1 Directory not found. Please verify the correct directory name was given. %1 Dossier non trouvé. Vérifiez que le bon nom de dossier a été renseigné. '%1' is write protected. Do you want to delete it anyway? '%1' est en lecture seule. Voulez le supprimer quand même ? Are sure you want to delete '%1'? Etes-vous sûr de vouloir supprimer '%1' ? Could not delete directory. Le dossier n'a pas pu être supprimé. Recent Places Documents récents Save As Enregistrer sous Drive Disque File Fichier Unknown Inconnu Find Directory Rechercher un dossier Show Afficher Forward Avance New Folder Nouveau dossier &New Folder &Nouveau dossier &Choose &Choisir Remove Enlever File &name: &Nom du fichier: Look in: Rechercher dans: Create New Folder Créer un nouveau dossier QObject All image files Tous les fichiers images files fichiers Centered Centrée Tiled Mosaïque Center Tiled Mosaïque centrée Centered Maxpect Centrée avec aspect maximal Tiled Maxpect Mosaïque avec aspect maximal Scaled Mise à l'échelle Centered Auto Fit Centrée avec ajustement automatique Scale & Crop Mise à l'échelle et découpée Symmetrical Tiled Mosaïque symétrique Mirrored Tiled Mosaïque mirroir Symmetrical Mirrored Tiled Mosaïque symétrique mirroir QProgressDialog Cancel Annuler SettingsDialog kBytes kOctets MBytes MOctets GBytes GOctets day(s) jour jours month(s) mois mois second(s) seconde secondes minute(s) minute minutes hour(s) heure heures Set position Positionnement Clear history Vider l'historique Are you sure? Etes-vous sur? Settings Paramètres General options Options générales Interval: Intervale: Border: Bordure: Position: Position: Main Principal Choose in random order Choix aléatoire Switch background on play Change le fond d'écran lors du démarrage de la lecture Play automatically on application start Lance automatiquement la lecture au démarrage de l'application Disable splash screen Désactiver l'écran de démarrage Quit after background change Quitter après avoir changé le fond d'écran Start automatically when system starts Démarre automatiquement au démarrage du système Only use landscape-oriented photos Utilise uniquement des photos orientées paysage Rotate images according to EXIF information Retourne l'image suivant les informations EXIF View info on photo Visualise les informations sur la photo View info in system tray tooltip Visualise les informations dans l'infobulle de la barre de tâche Use full desktop area Utilise toute la zone du bureau Photo has to be La photo doit independent of être indépendante de at least 1/2 of avoir une taille d'au moins 1/2 de at least 3/4 of avoir une taille d'au moins 3/4 de bigger than être plus grande que desktop's size la taille du bureau Store images in history for Enregistre les images dans l'historique pendant Clear Vider l'historique Direct connection Connexion directe Proxy connection Connexion par proxy Don't save locally remote photos if free disk space goes below Ne pas enregistrer les photos distantes en local si l'espace libre descend en dessous de Available modules: Modules disponibles: Active modules: Modules actifs: Network Réseau Use system proxy Utilse le proxy du système Use custom proxy Utilise un proxy personnalisé Port: Port: Authentication Autentification Username: Nom d'utilisateur: Password: Mot de passe: Server: Serveur: Changes won't be applied. Are you sure? Les changements ne seront pas appliqués. Etes-vous sur? Left Gauche Right Droite SmugMug::DialogWidget Search for: Rechercher: Edit SmugMug item Editer la recherche SmugMug Add SmugMug item Ajouter une recherche SmugMug SmugMug::Item Text: Texte: SplashScreen Author: Auteur: Loading Files module ... Chargement du module Fichier ... Loading Folders module ... Chargement du module Dossier ... Loading Flickr module ... Chargement du module Flickr ... Loading Yahoo! module ... Chargement du module Yahoo! ... Loading Panoramio module ... Chargement du module Panoramio ... Loading Ipernity module ... Chargement du module Ipernity ... Loading Photobucket module ... Chargement du module Photobucket ... Loading Buzznet module ... Chargement du module Buzznet ... Loading Picasa module ... Chargement du module Picasa ... Loading SmugMug module ... Chargement du module SmugMug ... Loading Vladstudio module ... Chargement du module Vladstudio ... Loading deviantART module ... Chargement du module deviantART ... Loading settings ... Chargement des paramètres ... Launching Wally ... Lancement de Wally ... Loading Google module ... Chargement du module Google ... Viewer Right-click on photo to show actions Faire un clic droit sur la photo pour voir les actions Fit to window Ajuste à la fenêtre Show full image Zoom 1:1 Zoom in Agrandir Zoom out Réduire Rotate clockwise Tourner dans le sens horaire Rotate c. clockwise Tourner dans le sens antihoraire Vladstudio::DialogWidget All Tout Abstract art Art abstrait Creatures Créatures Illustrations Illustrations Photos Photos By ID Par identifiant By view count Par nombre de vues Ascending Croissant Descending Décroissant Category: Catégorie: Order: Ordre: Direction: Sens: Edit Vladstudio item Editer la recherche Vladstudio Add Vladstudio item Ajouter une recherche Vladstudio Vladstudio::Item All categories Toutes les catégories Abstract art Art abstrait Creatures Créatures Illustrations Illustrations Photos Photos by Id par identifiant by view count par nombre de vues ascending croissant descending décroissant Wally::Application Cancel Annuler Play Lecture Pause Pause Next photo Photo suivante Save photo... Enregistrer la photo... Get EXIF info... Voir les informations EXIF... Settings... Paramètres... Explore source Explorer la source About... A propos de... History... Historique... About Qt... A propos de Qt... Quit Quitter English Anglais Italian Italien Spanish Espagnol German Allemand French Français Russian Russe Czech Tchèque Chinese Chinois Languages Langues Hungarian Hongrois Danish Danois Swedish Suédois Turkish Turc by: par: Location: Lieu: Engine: Moteur: Save photo Enregistrer la photo Images (*.png *.xpm *.jpg) Images (*.png *.xpm *.jpg) Right-click to show main menu Faire un clic droit pour voir le menu principal Portuguese (Brazil) Portugais (Brésil) Polish Polonais Wally Error Erreur Wally Active Desktop must be disabled Active Desktop doit être désactivé Catalan Catalan Greek Grec Korean Coréen Yahoo::DialogWidget All of these words Tous ces mots Any of these words N'importe lequel de ces mots Search for: Rechercher: Filter content Filtrer le contenu Yahoo! item Recherche Yahoo! Unfiltered content can show offending or sexual explicit photos Du contenu non filtré peut montrer des photos chocantes ou sexuellement explicites Edit Yahoo! item Editer la recherche Yahoo! Add Yahoo! item Ajouter une recherche Yahoo! Yahoo::Item Tags: Tags: and et or ou content filtered contenu filtré wally-2.4.4/res/lang/wally_cz.ts0000644000000000000000000030553611676624760015310 0ustar rootroot AboutDialog Compiled with: Kompilováno pomocí: EXIF library: EXIF knihovna: present nalezena not present nenealezena English Angličtina Italian Italština Russian Ruština Spanish Španělština Portuguese (Brazil) Portugalština (Brazilská) Polish Polština Catalan Katalánský Greek Řečtina Korean Korejsky Hungarian Maďarština Danish Dánština Swedish Švédština Turkish Turečtina Chinese Čínština German Němčina French Francouzština Czech Čeština About Wally O Wally <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Is Qt4 desktop wallpaper untranslatable? %Done <html><head></head><body><font size="+1">Qt4 měnič pozadí plochy<br />Autor: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Chtěl bych poděkovat Willem van Goghovi za logo :)<br /><br />Web stránka: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Můžete mě kontaktovat na <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Details >> Podrobnosti >> Close Zavřít Extension Rozšíření Description Popis Supported image formats: Podporované formáty obrázků: Additional info: Další informace: Language Jazyk Translator Překladatel Translations: Překlady: Bing::DialogWidget All of these words Všechna tato slova Any of these words Některé z těchto slov Search for: Hledat: Strict Striktně Moderate Mírně Off Vypnuto Adult filter: Filtr obshau pro dospělé: Bing item Položka Bing Unfiltered content can show offending or sexual explicit photos Nefiltrovaný obsah může zahrnovat urážlivé nebo erotické fotografie Edit Bing item Editovat položku Bing Add Bing item Přidat položku Bing Bing::Item Tags: Tagy: and a or nebo Adult filter: Filtr obshau pro dospělé: Off Vypnuto Moderate Mírně Strict Striktně Buzznet::DialogWidget Search for: Hledat: Edit Buzznet item Editovat položku Buzznet Add Buzznet item Přidat položku Buzznet Buzznet::Item Tag: Tag: DeviantArt::DialogWidget Search for: Hledat: Strict Striktně Off Vypnuto Adult filter: Filtr obshau pro dospělé: deviantART item Položka deviantART Unfiltered content can show offending or sexual explicit photos Nefiltrovaný obsah může zahrnovat urážlivé nebo erotické fotografie Edit deviantART item Editovat položku deviantART Add deviantART item Přidat položku deviantART DeviantArt::Item Tag: Tag: Adult filter: Filtr obshau pro dospělé: Off Vypnuto Strict Striktně Exif::InfoDialog EXIF information EXIF informace Tag Tag Value Hodnota No EXIF information available Nejsou dostupné EXIF informace Files::Core Loading folder... Načítání složky... Files::LabelPreview No preview available Náhled není dostupný Files::SettingsWidget Files Soubory Select a photo Vybrat fotku Select a folder Vybrat složku FilesSettingsWidget Photos Fotky Add a photo Přidat fotku Add photos in folder Přidat fotky ve složce Delete photo Odstranit fotku Move photo up Posunout fotku nahoru Move photo down Posunout fotku dolů Flickr::DialogWidget All of these words Všechna tato slova Any of these words Některé z těchto slov Search for: Hledat: Full text Full text Tags only Jen tagy Largest Největší Original Originální Large Velké Medium Střední Small Malé Thumbnail Miniatura Square Čtvercové Smallest Nejmenší Interestingness desc Zajímavost sestupně Relevance Relevantnost Date posted desc Datum poslání sestupně Date taken desc Datum pořízení sestupně Interestingness asc Zajímavost vzestupně Date posted asc Datum poslání vzestupně Date taken asc Datum pořízení vzestupně Size: Velikost: Order: Řazení: Edit Flickr item Editovat položku Flickr Add Flickr item Přidat položku Flickr Flickr::Item Text: Text: Tags: Tagy: and a or nebo Size: Velikost: Largest Největší Original Originální Large Velké Medium Střední Small Malé Thumbnail Miniatura Square Čtvercové Smallest Nejmenší Order: Řazení: Interestingness desc Zajímavost sestupně Relevance Relevantnost Date posted desc Datum poslání sestupně Date taken desc Datum pořízení sestupně Interestingness asc Zajímavost vzestupně Date posted asc Datum poslání vzestupně Date taken asc Datum pořízení vzestupně Folders::DialogWidget Local Místní Remote Vzdálené Include subfolders Včetně podsložek Folder: Složka: Passive Pasivní Active Aktivní Server: Server: Port: Port: Transfer mode: Režim přenosu: Username: Uživatelské jméno: Password: Heslo: Path: Cesta: Select a folder Vybrat složku Edit folder Editovat složku Add folder Přidat složku Folders::LocalItem (with subfolders) (s podsložkami) Folders::RemoteItem Transfer mode: Režim přenosu: passive pasivní active aktivní Folders::SettingsWidget Folders Složky FoldersSettingsWidget Folders Složky Add a folder Přidat složku Delete folder Odstranit složku Google::DialogWidget Search for: Hledat: Strict Striktně Moderate Mírně Off Vypnuto Adult filter: Filtr obshau pro dospělé: Google item Položka Google Unfiltered content can show offending or sexual explicit photos Nefiltrovaný obsah může zahrnovat urážlivé nebo erotické fotografie Edit Google item Editovat položku Google Add Google item Přidat položku Google Google::Item Text: Text: Adult filter: Filtr obshau pro dospělé: Off Vypnuto Moderate Mírně Strict Striktně Gui::ColorButton Auto Auto History::Dialog Right-click on items to show options Pravé kliknutí pro zobrazení možností History Historie Please wait... Čekejte prosím... Downloading photo... Stahování fotky... Abort Zrušit Save photo Uložit fotku Images (*.png *.xpm *.jpg) Obrázky (*.png *.xpm *.jpg) Photo has been saved Fotka byla uložena There was an error during download Při stahování se vyskytla chyba View photo... Zobrazit fotku... Get EXIF info... Získat EXIF informace... Save photo... Uložit fotku... Set as background Nastavit jako pozadí Explore image source Prozkoumat zdroj obrázku History::EngineQueryModel All Vše History::PhotosQueryModel (no title) (bez titulku) by: od: (no author) (bez autora) Date: Datum: Location: Umístnění: unknown neznámé Size: Velikost: Image size: Velikost obrázku: Engine: Engine: EXIF: EXIF: No Ne Yes Ano History::TagsQueryModel All Vše HttpEngine::SettingsWidget Select a folder Vybrat složku HttpSettingsWidget Photo sets Série fotek Add a photo set Přidat sérii fotek Delete photo set Odstranit sérii fotek Options Možnosti Save photos Uložit fotky Ipernity::DialogWidget All of these words Všechna tato slova Any of these words Některé z těchto slov Search for: Hledat: Full text Is it the same in your language? % it is one of those words which are overtaken from English , we do not have a translation for it Full text Tags only Jen tagy Ipernity item Položka Ipernity It can show offending or sexual explicit photos Mohou být zobrazeny urážlivé, nebo sexuálně explicitní fotografie Edit Ipernity item Editovat položku Ipernity Add Ipernity item Přidat položku Ipernity Ipernity::Item Text: Text: and a or nebo Tags: Tagy: Main Error Chyba is already running již běží Disclaimer Odmítnutí <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>Autor nenese žádnou odpovědnost za obsah, který Wally stahuje z webových stránek, kde jsou sdíleny fotografie.<br>Autor není žádným způsobem odpovědný za jakýkoliv takový obsah.</b><br><br>Pokud to je pro vás problém, používejte prosím jako zdroje pouze místní "Soubory" a "Složky".<br>Jinak prosím vyberte <b>"Ne"</b> a Wally bude ukončen, a nebo jej používejte <b>na vlastní nebezpečí.</b><br><br>(Pokud budete pokračovat, tato zprávas se zobrazí pouze jednou)<br><br>Přijímáte výše uvedenou podmínku? Another instance of Jiná instance Map::View Drag to select. Right-click to zoom Pro vybrání táhněte. Pravé kliknutí pro zvětšení Zoom %1x Zoom %1x Map::Viewer Map viewer Prohlížeč mapy Panoramio::DialogWidget Select on map Vybrat na mapě Longitude (min): Délka (min): Longitude (max): Délka (max): Latitude (min): Šířka (min): Latitude (max): Šířka (max): Popularity Oblíbenost Upload date Datum uploadu Original Originální Medium Střední Small Malé Thumbnail Miniatura Square Čtvercové Mini square Mini čtvercové Order: Řazení: Size: Velikost: Edit Panoramio item Editovat položku Panoramio Add Panoramio item Přidat položku Panoramio Error Chyba Coordinates must be different Souřadnice musí být odlišné Panoramio::Item lat: šíř: lon: dél: Original Originální Medium Střední Small Malé Thumbnail Miniatura Square Čtvercové Mini square Mini čtvercové Popularity Oblíbenost Upload date Datum uploadu Longitude: Délka: Latitude: Šířka: Size: Velikost: Order: Řazení: Photobucket::DialogWidget All of these words Všechna tato slova Any of these words Některé z těchto slov Search for: Hledat: Photobucket item Položka Photobucket It can show offending or sexual explicit photos Mohou být zobrazeny urážlivé, nebo sexuálně explicitní fotografie Edit Photobucket item Editovat položku Photobucket Add Photobucket item Přidat položku Photobucket Photobucket::Item Text: Text: and a or nebo Picasa::DialogWidget Search for: Hledat: Edit Picasa item Editovat položku Picasa Add Picasa item Přidat položku Picasa Picasa::Item Text: Text: Pikeo::DialogWidget Search for: Hledat: Default Výchozí Most viewed Nejvíce zobrazované Upload date Datum uploadu Date taken Datum pořízení Group add date Datum přidání skupiny Comment date Datum komentáře Ascending Vzestupně Order: Řazení: Edit Pikeo item Editovat položku Pikeo Add Pikeo item Přidat položku Pikeo Pikeo::Item Tags: Tagy: Order: Řazení: Default Výchozí Most viewed Nejvíce zobrazované Upload date Datum uploadu Date taken Datum pořízení Group add date Datum přidání skupiny Comment date Datum komentáře ascending vzestupně descending sestupně PositionModel Position Pozice Picture smaller than screen on the left, greater than screen on the right Obrázek menší než obrazovka vlevo, větší než obrazovka vpravo QColorDialog Hu&e: &Odstín: &Sat: whole czech word is Saturace &Sat: &Val: &Hod: &Red: Če&rvená: &Green: Z&elená: Bl&ue: &Modrá: Select Color Vybrat barvu &Basic colors &Základní barvy &Custom colors &Vlastní barvy &Add to Custom Colors &Přidat do vlastních barev QDialogButtonBox OK OK Cancel Zrušit Reset Reset &Yes &Ano &No &Ne Close Zavřít &Close &Zavřít QFileDialog Directories Složky &Open &Otevřít &Save &Uložit Open Otevřít %1 already exists. Do you want to replace it? %1 již existuje. Chcete jej nahradit? %1 File not found. Please verify the correct file name was given. %1 Nebyl nalezen. Prosím ověřte, že byl zadán správný název. My Computer Tento počítač &Rename &Přejmenovat &Delete &Smazat Show &hidden files &Zobrazovat skryté soubory Back Zpět Parent Directory Rodičovská složka List View Zobrazení v seznamu Detail View Detailní zobrazení Files of type: Soubry typu: Directory: Složka: %1 Directory not found. Please verify the correct directory name was given. %1 Složka nebyla nalezena. Prosím ověřte, že byl správně zadán název složky. '%1' is write protected. Do you want to delete it anyway? '%1' je chráněn proti zápisu. Opravdu jej chcete smazat? Are sure you want to delete '%1'? Opravdu chcete smazat '%1'? Could not delete directory. Nebylo možné smazat složku. Recent Places ? mabe it will not fit exactly Naposledy navštívené Save As Uložit jako Drive Jednotka File Soubor Unknown Neznámý Find Directory Najít složku Show Zobrazit Forward Vpřed New Folder Nová složka &New Folder &Nová složka &Choose &Vybrat Remove Odstranit File &name: Název &souboru: Look in: Hledat v: Create New Folder Vytvořit novou složku QObject All image files Všechny soubory obrázků files soubory Centered Na střed Tiled Dlaždice Center Tiled Dlaždice na střed Centered Maxpect Vyplnit obrazovku v měřítku Tiled Maxpect Vyplnit obrazovku fotkami Scaled V měřítku Centered Auto Fit Automaticky přizpůsobené na střed Scale & Crop V měřítku s ořezem Symmetrical Tiled Dlaždice symetricky Mirrored Tiled Dlaždice zrcadlově Symmetrical Mirrored Tiled Dlaždice symetricky zrcadlově QProgressDialog Cancel Zrušit SettingsDialog Settings Nastavení Left Levá Right Pravá kBytes kBytů MBytes MBytů GBytes GBytů day(s) den dny dní month(s) měsíc měsíce měsíců second(s) sekunda sekundy sekund minute(s) minuta minuty minut hour(s) hodina hodiny hodin Set position Nastavit pozici Changes won't be applied. Are you sure? Změny nebudou uplatněny. Jste si jist(á)? Clear history Smazat historii Are you sure? Jste si jist(á)? General options Obecná nastavení Interval: Interval: Border: Ohraničení: Position: Pozice: Main Hlavní Choose in random order Vybírat v náhodném pořadí Switch background on play Změnit pozadí při spuštění Play automatically on application start Spustit automaticky při startu aplikace Disable splash screen Nezobrazovat uvodní obrazovku Quit after background change Ukončit po změně pozadí Start automatically when system starts Spustit automaticky při spuštění systému Only use landscape-oriented photos Používat pouze horizontálně orientované fotky Rotate images according to EXIF information Otáčet obrázky dle EXIF informace View info on photo Zobrazit informace na fotce View info in system tray tooltip Zobrazovat informace v tooltipu v oznamovací oblasti systému Use full desktop area Použít celou oblast plochy Photo has to be Fotka musí být independent of nezávislá na at least 1/2 of nejméně 1/2 z at least 3/4 of nejméně 3/4 z bigger than větší než desktop's size velikosti polochy Don't save locally remote photos if free disk space goes below Neukládat vzdálené fotky lokálně pokud je volné místo na disku menší než Store images in history for Ukládat obrázky v historii po Clear Vyprázdnit Available modules: Dostupné moduly: Active modules: Aktivní moduly: Network Síť Direct connection Přímé spojení Proxy connection Proxy spojení Use system proxy Použít systémové proxy Use custom proxy Použít vlastní proxy Server: Server: Port: Port: Authentication Autentizace Username: Uživatelské jméno: Password: Heslo: SmugMug::DialogWidget Search for: Hledat: Edit SmugMug item Editovat položku SmugMug Add SmugMug item Přidat položku SmugMug SmugMug::Item Text: Text: SplashScreen Loading Files module ... Načítání modulu souborů ... Loading Folders module ... Načítání modulu složek ... Loading Flickr module ... Načítání modulu Flickr ... Loading Yahoo! module ... Načítání modulu Yahoo! ... Loading Panoramio module ... Načítání modulu Panoramio ... Loading Ipernity module ... Načítání modulu Ipernity ... Loading Photobucket module ... Načítání modulu Photobucket ... Loading Buzznet module ... Načítání modulu Buzznet ... Loading Picasa module ... Načítání modulu Picasa ... Loading SmugMug module ... Načítání modulu SmugMug ... Loading Google module ... Načítání modulu Google ... Loading Vladstudio module ... Načítání modulu Vladstudio ... Loading deviantART module ... Načítání modulu deviantART ... Loading settings ... Načítání nastavení ... Launching Wally ... Spuštění Wally ... Author: Autor: Viewer Right-click on photo to show actions Pravé kliknutí pro zobrazení akcí Fit to window Přizpůsobit oknu Show full image Zobrazit plný obrázek Zoom in Přiblížit Zoom out Oddálit Rotate clockwise Otočit ve směru hodinových ručiček Rotate c. clockwise Otočit proti směru hodinových ručiček Vladstudio::DialogWidget All Vše Abstract art Abstraktní umění Creatures Tvorové Illustrations Ilustrace Photos Fotky By ID Podle ID By view count Podle počtu zobrazení Ascending Vzestupně Descending Sestupně Category: Kategorie: Order: Řazení: Direction: Směr: Edit Vladstudio item Editovat položku Vladstudio Add Vladstudio item Přidat položku Vladstudio Vladstudio::Item All categories Všechny kategorie Abstract art Abstraktní umění Creatures Tvorové Illustrations Ilustrace Photos Fotky by Id Podle ID by view count Podle počtu zobrazení ascending vzestupně descending sestupně Wally::Application Cancel Zrušit Play Spustit Pause Pozastavit Next photo Další fotka Save photo... Uložit fotku ... Get EXIF info... Získat informace EXIF... Settings... Nastavení... Explore source Prozkoumat zdroj About... O... History... Historie... About Qt... O Qt... Quit Ukončit English Angličtina Italian Italština Spanish Španělština German Němčina French Francouzština Russian Ruština Portuguese (Brazil) Portugalština (Brazilská) Czech Čeština Polish Polština Chinese Čínština Languages Jazyky Catalan Katalánský Greek Řečtina Korean Korejsky Hungarian Maďarština Danish Dánština Swedish Švédština Turkish Turečtina Wally Error Chyba Wally Active Desktop must be disabled Aktivní plocha musí být vypnuta by: od: Location: Umístnění: Engine: Engine: Save photo Uložit fotku Images (*.png *.xpm *.jpg) Obrázky (*.png *.xpm *.jpg) Right-click to show main menu Pravé kliknutí pro zobrazení hlavní nabídky Yahoo::DialogWidget All of these words Všechna tato slova Any of these words Některé z těchto slov Search for: Hledat: Filter content Filtr obsah Yahoo! item Položka Yahoo! Unfiltered content can show offending or sexual explicit photos Nefiltrovaný obsah může zahrnovat urážlivé nebo erotické fotografie Edit Yahoo! item Editovat položku Yahoo! Add Yahoo! item Přidat položku Yahoo! Yahoo::Item Tags: Tagy: and a or nebo content filtered obsah filtrován wally-2.4.4/res/lang/wally_it.ts0000644000000000000000000030272111676624760015301 0ustar rootroot AboutDialog Supported image formats: Formati immagine supportati: About Wally Informazioni su Wally Details >> Dettagli >> Compiled with: Compilata con: EXIF library: Libreria EXIF: present presente not present non presente Polish Polacco Catalan Catalano Greek Greco Korean Coreano Hungarian Ungherese Danish Danese Swedish Svedese Turkish Turco Close Chiudi Extension Estensione Description Descrizione Additional info: Informazioni aggiuntive: Language Lingua Translator Traduttore <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Cambiasfondo Qt4<br />Autore: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Desidero ringraziare Vincent Willem van Gogh per il logo :)<br /><br />Sito web: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Puoi contattarmi scrivendo a <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Italian Italiano English Inglese Russian Russo Spanish Spagnolo Portuguese (Brazil) Portoghese (Brasile) Chinese Cinese German Tedesco French Francese Czech Ceco Translations: Traduzioni: Bing::DialogWidget All of these words Tutte le parole Any of these words Una di queste parole Search for: Cerca: Strict Elevato Moderate Moderato Off Disattivato Adult filter: Filtro adulti: Bing item Oggetto Bing Unfiltered content can show offending or sexual explicit photos Il contenuto non filtrato potrà mostrare immagini offensive o sessualmente esplicite Edit Bing item Edita oggetto Bing Add Bing item Aggiungi oggetto Bing Bing::Item Tags: Tag: and e or o Adult filter: Filtro adulti: Off Disattivato Moderate Moderato Strict Elevato Buzznet::DialogWidget Search for: Cerca: Edit Buzznet item Edita oggetto Buzznet Add Buzznet item Aggiungi oggetto Buzznet Buzznet::Item Tag: Tag: DeviantArt::DialogWidget Search for: Cerca: Strict Elevato Off Disattivato Adult filter: Filtro adulti: deviantART item Oggetto deviantART Unfiltered content can show offending or sexual explicit photos Il contenuto non filtrato potrà mostrare immagini offensive o sessualmente esplicite Edit deviantART item Edita oggetto deviantART Add deviantART item Aggiungi oggetto deviantART DeviantArt::Item Tag: Tag: Adult filter: Filtro adulti: Off Disattivato Strict Elevato Exif::InfoDialog EXIF information Informazioni EXIF Tag Tag Value Valore No EXIF information available Nessuna informazione EXIF disponibile Files::Core Loading folder... Carico cartella... Files::LabelPreview No preview available Anteprima non disponibile Files::SettingsWidget Select a photo Seleziona una foto Select a folder Seleziona una cartella Files File FilesSettingsWidget Photos Foto Add a photo Aggiungi una foto Add photos in folder Aggiungi foto in cartella Delete photo Elimina foto Move photo up Sposta foto su Move photo down Sposta foto giù Flickr::DialogWidget All of these words Tutte le parole Any of these words Una di queste parole Search for: Cerca: Full text Testo Tags only Solo tag Largest La più larga Original Originale Large Larga Medium Media Small Piccola Thumbnail Miniatura Square Quadrata Smallest La piu piccola Relevance Rilevanza Size: Dimensione: Order: Ordine: Edit Flickr item Edita oggetto Flickr Add Flickr item Aggiungi oggetto Flickr Interestingness desc Interesse disc Date posted desc Data pubblicazione disc Date taken desc Data scatto disc Interestingness asc Interesse asc Date posted asc Data pubblicazione asc Date taken asc Data scatto asc Flickr::Item Text: Testo: Tags: Tag: and e or o Size: Dimensione: Largest La più larga Original Originale Large Larga Medium Media Small Piccola Thumbnail Miniatura Square Quadrata Smallest La piu piccola Order: Ordine: Relevance Rilevanza Interestingness desc Interesse disc Date posted desc Data pubblicazione disc Date taken desc Data scatto disc Interestingness asc Interesse asc Date posted asc Data pubblicazione asc Date taken asc Data scatto asc Folders::DialogWidget Include subfolders Includi sottocartelle Select a folder Seleziona una cartella Edit folder Edita cartella Add folder Aggiungi cartella Local Locale Remote Remota Folder: Cartella: Passive Passiva Active Attiva Server: Server: Port: Porta: Transfer mode: Modalità: Username: Nome utente: Password: Password: Path: Percorso: Folders::LocalItem (with subfolders) (con sottocartelle) Folders::RemoteItem Transfer mode: Modalità: passive passiva active attiva Folders::SettingsWidget Folders Cartelle FoldersSettingsWidget Folders Cartelle Add a folder Aggiungi una cartella Delete folder Elimina cartella Google::DialogWidget Search for: Cerca: Strict Elevato Moderate Moderato Off Disattivato Adult filter: Filtro adulti: Google item Oggetto Google Unfiltered content can show offending or sexual explicit photos Edit Google item Edita oggetto Google Add Google item Aggiungi oggetto Google Google::Item Text: Testo: Adult filter: Filtro adulti: Off Disattivato Moderate Moderato Strict Elevato Gui::ColorButton Auto Auto History::Dialog Right-click on items to show options Click con il destro sulle voci per visualizzare le opzioni History Cronologia Please wait... Attendere prego... Downloading photo... Scarica foto... Abort Annulla Save photo Salva foto Images (*.png *.xpm *.jpg) Immagini (*.png *.xpm *.jpg) Photo has been saved La foto é stata salvata There was an error during download Errore durante il download View photo... Visualizza foto... Get EXIF info... Mostra informazioni EXIF... Save photo... Salva foto... Set as background Imposta come sfondo Explore image source Esplora sorgente History::EngineQueryModel All Tutti History::PhotosQueryModel Image size: Dimensioni immagine: Engine: Modulo: EXIF: EXIF: No No Yes (no title) (nessun titolo) by: da: (no author) (nessun autore) Location: Luogo: unknown sconosciuto Size: Dimensione: Date: Data: History::TagsQueryModel All Tutti HttpEngine::SettingsWidget Select a folder Seleziona una cartella HttpSettingsWidget Photo sets Set foto Options Opzioni Save photos Salva foto Add a photo set Aggiungi un set foto Delete photo set Elimina set foto Ipernity::DialogWidget All of these words Tutte le parole Any of these words Una di queste parole Search for: Cerca: Full text Testo Tags only Solo tag Ipernity item Oggetto Ipernity It can show offending or sexual explicit photos Potrà mostrare immagini offensive o sessualmente esplicite Edit Ipernity item Edita oggetto Ipernity Add Ipernity item Aggiungi oggetto Ipernity Ipernity::Item Text: Testo: and e or o Tags: Tag: Main Error Errore is already running è già in esecuzione Disclaimer Esclusione di responsabilità <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>L'Autore non si assume alcuna responsabilità riguardo il contenuto delle foto che Wally scarica dai siti di photo sharing.<br>L'Autore non è in alcun modo responsabile per tali contenuti.</b><br><br>Laddove ciò fosse un problema, si utilizzino soltanto motori locali come "Foto" oppure "Cartelle".<br>Altrimenti, scegliere <b>"No"</b> per terminare Wally, oppure continuare <b>a proprio rischio.</b><br><br>(Se si procede, questo messaggio verrà visualizzato una volta soltanto)<br><br>Si accetta tale condizione? Another instance of Una istanza di Map::View Drag to select. Right-click to zoom Trascina per selezionare. Click con il destro per ingrandire Zoom %1x Zoom %1x Map::Viewer Map viewer Visualizzatore mappa Panoramio::DialogWidget Select on map Seleziona su mappa Longitude (min): Longitudine (min): Longitude (max): Longitudine (max): Latitude (min): Latitudine (min): Latitude (max): Latitudine (max): Popularity Popolarità Upload date Data pubblicazione Original Originale Medium Media Small Piccola Thumbnail Miniatura Square Quadrata Mini square Quadrata mini Order: Ordine: Size: Dimensione: Edit Panoramio item Edita oggetto Panoramio Add Panoramio item Aggiungi oggetto Panoramio Error Errore Coordinates must be different Le coordinate devono essere differenti Panoramio::Item Original Originale Medium Media Small Piccola Thumbnail Miniatura Square Quadrata Mini square Quadrata mini Popularity Popolarità Upload date Data pubblicazione Longitude: Longitudine: Latitude: Latitudine: Size: Dimensione: Order: Ordine: lat: lat: lon: lon: Photobucket::DialogWidget Search for: Cerca: Photobucket item Oggetto Photobucket It can show offending or sexual explicit photos Potrà mostrare immagini offensive o sessualmente esplicite Edit Photobucket item Edita oggetto Photobucket Add Photobucket item Aggiungi oggetto Photobucket All of these words Tutte le parole Any of these words Una di queste parole Photobucket::Item Text: Testo: and e or o Picasa::DialogWidget Search for: Cerca: Edit Picasa item Edita oggetto Picasa Add Picasa item Aggiungi oggetto Picasa Picasa::Item Text: Testo: Pikeo::DialogWidget Search for: Cerca: Default Predefinito Most viewed La più visualizzata Upload date Data pubblicazione Date taken Data scatto Group add date Data aggiunta gruppo Comment date Data commento Ascending Ascendente Order: Ordine: Edit Pikeo item Edita oggetto Pikeo Add Pikeo item Aggiungi oggetto Pikeo Pikeo::Item Tags: Tag: Order: Ordine: Default Predefinito Most viewed La più visualizzata Upload date Data pubblicazione Date taken Data scatto Group add date Data aggiunta gruppo Comment date Data commento ascending ascendente descending discendente PositionModel Position Posizione Picture smaller than screen on the left, greater than screen on the right Immagine più piccola dello schermo a sinistra, più grande a destra QColorDialog Hu&e: &Tonalità: &Sat: &Saturazione: &Val: &Valore: &Red: &Rosso: &Green: V&erde: Bl&ue: Bl&ue: Select Color Colore &Basic colors Colori di &base &Custom colors Colori &personalizzati &Add to Custom Colors &Aggiungi ai colori personalizzati QDialogButtonBox OK OK Cancel Annulla Reset Ripristina &Yes &Sì &No &No Close Chiudi &Close &Chiudi QFileDialog Directories Cartelle &Open &Apri &Save &Salva Open Apri %1 already exists. Do you want to replace it? %1 esiste già. Sostituirlo? %1 File not found. Please verify the correct file name was given. %1 non trovato. Verificare che il nome del file sia corretto. My Computer Risorse del computer &Rename &Rinomina &Delete &Elimina Show &hidden files Mostra &file nascosti Back Indietro Parent Directory Livello superiore List View Elenco Detail View Dettagli Files of type: Tipo file: Directory: Cartella: %1 Directory not found. Please verify the correct directory name was given. %1 non trovata. Verificare che il nome della cartella sia corretto. '%1' is write protected. Do you want to delete it anyway? %1 è protetta da scrittura. Cancellarla ugualmente? Are sure you want to delete '%1'? Sicuro di voler cancellare %1? Could not delete directory. Non è possibile cancellare la cartella. Recent Places Documenti recenti Save As Salva come Drive Disco File File Unknown Sconosciuto Find Directory Trova cartella Show Visualizza Forward Avanti New Folder Nuova cartella &New Folder &Nuova cartella &Choose S&cegli Remove Rimuovi File &name: No&me file: Look in: Cerca in: Create New Folder Crea nuova cartella QObject All image files Tutte le immagini files file Centered Centrata Tiled A mattonella Center Tiled A mattonella centrata Centered Maxpect Centrata e scalata corretta Tiled Maxpect A mattonella e scalata corretta Scaled Scalata Centered Auto Fit Centrata e ridimensionata Scale & Crop Scalata e tagliata Symmetrical Tiled A mattonella simmetrica Mirrored Tiled A mattonella riflessa Symmetrical Mirrored Tiled A mattonella riflessa simmetrica QProgressDialog Cancel Annulla SettingsDialog kBytes kByte MBytes MByte GBytes GByte day(s) giorno giorni month(s) mese mesi second(s) secondo secondi minute(s) minuto minuti hour(s) ora ore Set position Imposta posizione Clear history Cancella cronologia Are you sure? Sei sicuro? Settings Impostazioni General options Opzioni generali Interval: Intervallo: Border: Bordo: Position: Posizione: Main Generali Choose in random order Scegli in ordine casuale Switch background on play Cambia sfondo al play Play automatically on application start Esegui play automaticamente all'avvio Disable splash screen Disabilita splash screen Quit after background change Termina dopo cambio sfondo Start automatically when system starts Avvia all'avvio del sistema Only use landscape-oriented photos Usa solo foto panoramiche Rotate images according to EXIF information Ruota le immagini secondo le informazioni EXIF View info on photo Visualizza informazioni sulla foto View info in system tray tooltip Visualizza informazioni sull'icona Use full desktop area Usa l'intera area del desktop Photo has to be La foto deve essere independent of indipendente rispetto alle at least 1/2 of almeno 1/2 delle at least 3/4 of almeno 3/4 delle bigger than più grande delle desktop's size dimensioni del desktop Store images in history for Memorizza immagini in cronologia per Clear Cancella Direct connection Connessione diretta Proxy connection Connessione tramite proxy Don't save locally remote photos if free disk space goes below Non salvare localmente le foto remote se lo spazio libero é minore di Available modules: Moduli disponibili: Active modules: Moduli attivi: Network Rete Use system proxy Usa proxy di sistema Use custom proxy Usa proxy manuale Port: Porta: Authentication Autenticazione Username: Nome utente: Password: Password: Server: Server: Changes won't be applied. Are you sure? Le modifiche non verranno applicate. Continuare? Left Sinistra Right Destra SmugMug::DialogWidget Search for: Cerca: Edit SmugMug item Edita oggetto Smugmug Add SmugMug item Aggiungi oggetto Smugmug SmugMug::Item Text: Testo: SplashScreen Author: Autore: Loading Files module ... Carico modulo File ... Loading Folders module ... Carico modulo Cartelle ... Loading Flickr module ... Carico modulo Flickr ... Loading Yahoo! module ... Carico modulo Yahoo! ... Loading Panoramio module ... Carico modulo Panoramio ... Loading Ipernity module ... Carico modulo Ipernity ... Loading Photobucket module ... Carico modulo Photobucket ... Loading Buzznet module ... Carico modulo Buzznet ... Loading Picasa module ... Carico modulo Picasa ... Loading SmugMug module ... Carico modulo Smugmug ... Loading Google module ... Carico modulo Google ... Loading Vladstudio module ... Carico modulo Vladstudio ... Loading deviantART module ... Carico modulo deviantART ... Loading settings ... Carico impostazioni ... Launching Wally ... Avvio Wally ... Viewer Right-click on photo to show actions Click con il destro per mostrare le azioni Fit to window Adatta alla finestra Show full image Dimensioni reali Zoom in Ingrandisci Zoom out Riduci Rotate clockwise Ruota in senso orario Rotate c. clockwise Ruota in senso antiorario Vladstudio::DialogWidget All Tutti Abstract art Arte astratta Creatures Creature Illustrations Illustrazioni Photos Foto By ID Per ID By view count Per visualizzazioni Ascending Ascendente Descending Discendente Category: Categoria: Order: Ordine: Direction: Direzione: Edit Vladstudio item Edita oggetto Vladstudio Add Vladstudio item Aggiungi oggetto Vladstudio Vladstudio::Item All categories Tutte le categorie Abstract art Arte astratta Creatures Creature Illustrations Illustrazioni Photos Foto by Id per Id by view count per visualizzazioni ascending ascendente descending discendente Wally::Application Cancel Annulla Play Riproduci Pause Interrompi Next photo Prossima foto Save photo... Salva foto... Get EXIF info... Mostra informazioni EXIF... Settings... Impostazioni... Explore source Esplora sorgente About... Informazioni su... History... Cronologia... About Qt... Informazioni su Qt... Quit Esci English Inglese Italian Italiano Spanish Spagnolo German Tedesco French Francese Russian Russo Czech Ceco Polish Polacco Chinese Cinese Languages Lingue Catalan Catalano Greek Greco Korean Coreano Hungarian Ungherese Danish Danese Swedish Svedese Turkish Turco Wally Error Errore Wally Active Desktop must be disabled Active Desktop deve essere disabilitato by: da: Location: Luogo: Engine: Modulo: Save photo Salva foto Images (*.png *.xpm *.jpg) Immagini (*.png *.xpm *.jpg) Right-click to show main menu Click con il destro per mostrare menù principale Portuguese (Brazil) Portoghese (Brasile) Yahoo::DialogWidget All of these words Tutte le parole Any of these words Una di queste parole Search for: Cerca: Filter content Filtra contenuto Yahoo! item Oggetto Yahoo! Unfiltered content can show offending or sexual explicit photos Il contenuto non filtrato potrà mostrare contenuto offensivo o sessualmente esplicito Edit Yahoo! item Edita oggetto Yahoo! Add Yahoo! item Aggiungi oggetto Yahoo! Yahoo::Item Tags: Tag: and e or o content filtered contenuto filtrato wally-2.4.4/res/lang/wally_tr.ts0000644000000000000000000030450111676624760015310 0ustar rootroot AboutDialog Compiled with: Compilat amb: EXIF library: EXIF kütüphanesi: present present not present no present English İngilizce Italian İtalyanca Russian Rusça Spanish İspanyolca Portuguese (Brazil) Portekizce (Brezilya) German Almanca French Fransızca Czech Çek dili Chinese Çince Polish Lehçe (Polonya) Catalan Katalonya dili Greek Yunanca Korean Korece Hungarian Macar Danish Danimarkalı Swedish İsveç Turkish Türk About Wally Wally Hakkında <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Qt4 duvar kağıdı değiştiricisi<br />Yazar: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Logo için Vincent Willem van Gogh teşekkür etmek istiyorum :)<br /><br />Web sitesi: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Email: <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Details >> Detaylar >> Close Kapat Extension Uzantılar Description Tanımlar Supported image formats: Desteklenen resim biçimleri: Additional info: Ek Bilgi: Language Diller Translator Çevirenler Translations: Çeviriler: Bing::DialogWidget All of these words Bu kelimelerin tümü Any of these words Bu kelimelerin hiçbiri Search for: Ara: Strict Yüksek düzeyli Moderate Orta düzeyli Off Kapat Adult filter: Yetişkin içerik fitresi: Bing item Bing araması Unfiltered content can show offending or sexual explicit photos Fitre uygulanmazsa şiddet veya cinsellik içeren resimler görüntülenebilir Edit Bing item Bing aramasını düzenle Add Bing item Bing araması ekle Bing::Item Tags: Etiketler: and ve or veya Adult filter: Yetişkin içerik fitresi: Off Kapat Moderate Orta düzeyli Strict Yüksek düzeyli Buzznet::DialogWidget Search for: Ara: Edit Buzznet item Buzznet aramasını düzenle Add Buzznet item Buzznet araması ekle Buzznet::Item Tag: Etiket : DeviantArt::DialogWidget Search for: Ara: Strict Yüksek düzeyli Off Kapat Adult filter: Yetişkin içerik fitresi: deviantART item deviantART araması Unfiltered content can show offending or sexual explicit photos Fitre uygulanmazsa şiddet veya cinsellik içeren resimler görüntülenebilir Edit deviantART item deviantART aramasını düzenle Add deviantART item deviantART araması ekle DeviantArt::Item Tag: Etiket : Adult filter: Yetişkin içerik fitresi: Off Kapat Strict Yüksek düzeyli Exif::InfoDialog EXIF information EXIF Bilgilendirmesi Tag Etiket Value Değer No EXIF information available Kullanılabilir EXIF bilgisi yok Files::Core Loading folder... Dizin yükleniyor... Files::LabelPreview No preview available Kullanılabilir önizleme yok Files::SettingsWidget Files Dosyaları Select a photo Resmi seç Select a folder Dizini seç FilesSettingsWidget Photos A diferència de l'original que a vegades fa servir "image" i a vegades "photo", he fet servir "imatges" a tota la traducció en comptes de fotografies, ja que crec que tots els wallpapers són imatges, però no cal que totes les imatges siguin fotos. Resimler Add a photo Resmi ekle Add photos in folder Dizinden resimleri ekle Delete photo Resmi sil Move photo up Resmi yukarı taşı Move photo down Resmi aşağı taşı Flickr::DialogWidget All of these words Bu kelimelerin tümü Any of these words Bu kelimelerin hiçbiri Search for: Ara: Full text Yazının tamamı Tags only Sadece etiketler Largest En büyük Original Kaynak Large Büyük Medium Orta Small Küçük Thumbnail Ufak Square Kare Smallest Çok küçük Interestingness desc Interestingness desc Relevance ilişkili Date posted desc Gönderim tarihine göre (yakınlaşan) Date taken desc Çekim tarihine göre (yakınlaşan) Interestingness asc Interestingness asc Date posted asc Gönderim tarihne göre (uzaklaşan) Date taken asc Çekim tarihine göre (uzaklaşan) Size: Boyut: Order: Sırala: Edit Flickr item Flickr aramasını düzenle Add Flickr item Flickr aramasını ekle Flickr::Item Text: Kelime: Tags: Etiketler: and ve or veya Size: Boyut: Largest En büyük Original Kaynak Large Büyük Medium Orta Small Küçük Thumbnail Ufak Square Kare Smallest Çok küçük Order: Sırala: Interestingness desc Interestingness desc Relevance ilişkili Date posted desc Gönderim tarihine göre (yakınlaşan) Date taken desc Çekim tarihine göre (yakınlaşan) Interestingness asc İlginç çekme oranına göre Date posted asc Gönderim tarihne göre (uzaklaşan) Date taken asc Çekim tarihine göre (uzaklaşan) Folders::DialogWidget Local Yerel Remote Sunucu Include subfolders Alt dizinleri dahil et Folder: Dizin: Passive Kapalı Active Çalışan Server: Server: Port: Port: Transfer mode: Aktarım şekli: Username: Kullanıcı adı: Password: Şifre: Path: Yol: Select a folder Dizini seç Edit folder Dizini düzenle Add folder Dizin ekle Folders::LocalItem (with subfolders) (Alt dizinlerle beraber) Folders::RemoteItem Transfer mode: Aktarım şekli: passive Kapalı active Çalışan Folders::SettingsWidget Folders Dizinler FoldersSettingsWidget Folders Dizinler Add a folder Afegeix directori Delete folder Eliminar directori Google::DialogWidget Search for: Ara: Strict Yüksek düzeyli Moderate Orta düzeyli Off Kapat Adult filter: Yetişkin içerik fitresi: Google item Element Google Unfiltered content can show offending or sexual explicit photos Fitre uygulanmazsa şiddet veya cinsellik içeren resimler görüntülenebilir Edit Google item Google aramasını düzenle Add Google item Google araması ekle Google::Item Text: Kelime: Adult filter: Yetişkin içerik fitresi: Off Kapat Moderate Orta düzeyli Strict Yüksek düzeyli Gui::ColorButton Auto Otomatik History::Dialog Right-click on items to show options Sağ tuş menüsünü göster History Geçmiş Please wait... Lütfen bekleyin... Downloading photo... Resim indiriliyor... Abort İptal Save photo Resmi kaydet Images (*.png *.xpm *.jpg) Resimler (*.png *.xpm *.jpg) Photo has been saved Resim kaydedildi There was an error during download İndirme işlemi sırasında bir hata oluştu View photo... Resmi göster... Get EXIF info... EXIF bilgisini al... Save photo... Resmi kaydet... Set as background Arkaplan olarak ata Explore image source Resim kaynağına git History::EngineQueryModel All Tümü History::PhotosQueryModel (no title) (Başlıksız) by: Tarafından: (no author) (Yazarsız) Date: Tarih: Location: Mevki: unknown bilinmeyen Size: Boyut: Image size: Resim boyutu: Engine: Gösterim araçı: EXIF: EXIF: No Hayır Yes Evet History::TagsQueryModel All Tümü HttpEngine::SettingsWidget Select a folder Dizini seç HttpSettingsWidget Photo sets Resim setleri Add a photo set Resim seti ekle Delete photo set Resim setini sil Options Ayarlar Save photos Resimleri kaydet Ipernity::DialogWidget All of these words Bu kelimelerin tümü Any of these words Bu kelimelerin hiçbiri Search for: Ara: Full text Yazının tamamı Tags only Sadece etiketler Ipernity item Element Ipernity It can show offending or sexual explicit photos Şiddet ve cinsellik içeren resimler gösterilebilir Edit Ipernity item Ipernity aramasını düzenle Add Ipernity item Ipernity araması ekle Ipernity::Item Text: Kelime: and ve or veya Tags: Etiketler: Main Error Hata is already running Zaten çalışıyor Disclaimer Vazgeç <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>mmmmm<br>L'autor no és de cap manera responsable d'aquests continguts</b><br><br>Eğer Bu sizin için bir sorun ise lütfen sadece "Dosyalar" veya "Dizinler" gibi yerel seçenekleri kullanın.<br>Aksi halde lütfen seçin<b>"Hayır"</b> per tancar Wally, o fes-lo servir<b>sota el teu risc</b><br><br>(Si accedeixes, aquest missatge només es mostrarà una sola vegada)<br><br>Acceptes les condicions descrites? Another instance of Başka bir örenği Map::View Drag to select. Right-click to zoom Seçili alana sağ tuş ile büyüt Zoom %1x Zoom %1x Map::Viewer Map viewer Harita gösterici Panoramio::DialogWidget Select on map Harita üzerinden seç Longitude (min): Boylam (min): Longitude (max): Boylam (max): Latitude (min): Enlem (min): Latitude (max): Enlem (max): Popularity Popülerite Upload date Yüklenme tarihi Original Kaynak Medium Orta Small Küçük Thumbnail Ufak Square Kare Mini square Minik kare Order: Sırala: Size: Boyut: Edit Panoramio item Panoramie aramasını düzenle Add Panoramio item Panoramio araması ekle Error Hata Coordinates must be different Koordinatlar farklı olmalı Panoramio::Item lat: lat: lon: lon: Original Kaynak Medium Orta Small Küçük Thumbnail Ufak Square Kare Mini square Minik kare Popularity Popülerite Upload date Yüklenme tarihi Longitude: Boylam: Latitude: Enlem: Size: Boyut: Order: Sırala: Photobucket::DialogWidget All of these words Bu kelimelerin tümü Any of these words Bu kelimelerin hiçbiri Search for: Ara: Photobucket item Element Photobucket It can show offending or sexual explicit photos Şiddet ve cinsellik içeren resimler gösterilebilir Edit Photobucket item Photobucket aramasını düzenle Add Photobucket item Photobucket araması ekle Photobucket::Item Text: Kelime: and ve or veya Picasa::DialogWidget Search for: Ara: Edit Picasa item Picasa aramasını düzenle Add Picasa item Picasa araması ekle Picasa::Item Text: Kelime: Pikeo::DialogWidget Search for: Ara: Default Varsayılan Most viewed En çok görüntülenen Upload date Yüklenme tarihi Date taken Çekim tarihine göre Group add date Grubun ekleme tarihi Comment date Yorum tarihi Ascending Yükselen Order: Ordre: Edit Pikeo item Pikeo aramasını düzenle Add Pikeo item Pikeo araması ekle Pikeo::Item Tags: Etiketler: Order: Sırala: Default Varsayılan Most viewed En çok görüntülenen Upload date Yüklenme tarihi Date taken Çekim tarihine göre Group add date Grubun ekleme tarihi Comment date Yorum tarihi ascending Yükselen descending azalan PositionModel Position Pozisyon Picture smaller than screen on the left, greater than screen on the right Ekrandan küçük resimler | Ekrandan büyük resimler QColorDialog Hu&e: T&on: &Sat: &Doygun: &Val: &Parlak: &Red: &Kırmızı: &Green: &Yeşil: Bl&ue: &Mavi: Select Color Renk Seç &Basic colors &Temel renkler &Custom colors &Seçilen renkler &Add to Custom Colors &Seçilen renklere ekle QDialogButtonBox OK Tamam Cancel İptal Reset Sıfırla &Yes &Evet &No &Hayır Close Kapat &Close &Kapat QFileDialog Directories Dizinler &Open &Aç &Save &Kaydet Open %1 already exists. Do you want to replace it? Zaten %1 isimli mevcut. Üzerine yazılsın mi? %1 File not found. Please verify the correct file name was given. '%1' Dosya bulunamadı. Lütfen dosya ismini tekrar kontrol edin. My Computer Bilgisayarım &Rename &Yeniden isimlendir &Delete &Sil Show &hidden files &Gizli dosyaları göster Back Geri Parent Directory Ana Dizin List View Liste Detail View Detay Files of type: Dosya tipi: Directory: Dizin: %1 Directory not found. Please verify the correct directory name was given. %1 Dosya yada dizin bulunamadı. Lütfen ismi veya yolu kontrol edin. '%1' is write protected. Do you want to delete it anyway? %1 yazma korumalı. Silmek istediğinizden emin misiniz? Are sure you want to delete '%1'? '%1''si silmek istediğinizden emin misiniz? Could not delete directory. Dizin silinemedi. Recent Places Geçmiş Save As Farklı Kaydet Drive Sürücü File Dosya Unknown bilinmeyen Find Directory Dizin Bul Show Görüntüle Forward İlet New Folder Yeni Dizin &New Folder &Yeni Dizin &Choose &Seç Remove Sil File &name: Dosya &ismi: Look in: Göz at: Create New Folder Yeni Dizin Oluştur QObject All image files Tüm resim dosyaları files Dosyaları Centered Ortalanmış Tiled Döşenmiş Center Tiled Merkezcil döşemiş Centered Maxpect Merkezcil Büyütmüş Tiled Maxpect Döşeyerek Büyütülmüş Scaled Ölçeklendirilmiş Centered Auto Fit Merkezcil Otomatik Doldur Scale & Crop Ölçeklendir ve Kes Symmetrical Tiled Simetrik Döşenmiş Mirrored Tiled Aynalayarak Döşemiş Symmetrical Mirrored Tiled Simetrik Aynalayarak Döşemiş QProgressDialog Cancel İptal SettingsDialog Settings Ayarlar Left Sol Right Sağ kBytes Kilobyte MBytes Megabyte GBytes Gigabyte day(s) gün month(s) ay second(s) saniye minute(s) dakika hour(s) saat Set position Pozisyon ata Changes won't be applied. Are you sure? Değişiklikler kaydedilmemiştir. Çıkmak istediğinizden emin misiniz? Clear history Geçmişi temizle Are you sure? Emin misiniz? General options Seçenekler Interval: Süre: Border: Kenar: Position: Pozisyon: Main Ana menü Choose in random order Rastgele sırala Switch background on play Oynat tıklandığında arkaplanı değiştir Play automatically on application start Uygulama başlatıldığında oynat Disable splash screen Başlangıçta logoyu göster Quit after background change Çıkıştan sonra arkaplanı değiştir Start automatically when system starts Bilgisayar açılışında başlat Only use landscape-oriented photos Sadece yatay-odaklı resimleri kullan Rotate images according to EXIF information Resmi Exif bilgisine göre çevir View info on photo Dosya bilgilerini resim üzerinde görüntüle View info in system tray tooltip Dosya bilgilerini sistem tepsisinde görüntüle Use full desktop area Tüm masaüstünü kullan Photo has to be Resim independent of ekrandan bağımsız at least 1/2 of ekranın 1/2'sini kaplamalı at least 3/4 of ekranın 3/4'dünü kaplamalı bigger than ekrandan daha büyük desktop's size Don't save locally remote photos if free disk space goes below Boş disk alanı bu miktardan daha az kaldığında resimleri kaydetme Store images in history for Geçmiş tutulacağı süre Clear Temizle Available modules: Kullanılabilir eklentiler: Active modules: Çalışan eklentiler: Network Direct connection Doğrudan bağlan Proxy connection Proxy kullanarak bağlan Use system proxy Varsayılan proxy'ı kullan Use custom proxy Proxy serverı ayarla Server: Server: Port: Port: Authentication Güvenli bağlantı Username: Kullanıcı adı: Password: Şifre: SmugMug::DialogWidget Search for: Ara: Edit SmugMug item SmugMug aramasını düzenle Add SmugMug item SmugMug araması ekle SmugMug::Item Text: Kelime: SplashScreen Loading Files module ... Dosyalar modülü yükleniyor... Loading Folders module ... Dizinler modülü yükleniyor... Loading Flickr module ... Flicker modülü yükleniyor... Loading Yahoo! module ... Yahoo modülü yükleniyor... Loading Panoramio module ... Panoramio modülü yükleniyor... Loading Pikeo module ... Pikeo modülü yükleniyor... Loading Ipernity module ... Ipernity modülü yükleniyor... Loading Photobucket module ... Photobucket modülü yükleniyor... Loading Buzznet module ... Buzznet modülü yükleniyor... Loading Picasa module ... Picasa modülü yükleniyor... Loading SmugMug module ... SmugMug modülü yükleniyor... Loading Bing module ... Bing modülü yükleniyor... Loading Google module ... Google modülü yükleniyor... Loading Vladstudio module ... Vladstudio modülü yükleniyor... Loading deviantART module ... deviantART modülü yükleniyor... Loading settings ... Ayarlar yükleniyor... Launching Wally ... Wally başlatılıyor ... Author: Yazar: Viewer Right-click on photo to show actions Right-click on photo to show actions Fit to window Pencereyi doldur Show full image Resmin tamamını görüntüle Zoom in Büyüt Zoom out Küçült Rotate clockwise Saat yönünde döndür Rotate c. clockwise Saat yönü tersine döndür Vladstudio::DialogWidget All Tümü Abstract art Soyut sanat Creatures Canlılar Illustrations Çizimler Photos Resimler By ID Kimliğe göre By view count Görüntüleme sayısı Ascending Yükselen Descending azalan Category: Kategori: Order: Sırala: Direction: Yön: Edit Vladstudio item Editar element Vladstudio Add Vladstudio item Afegir element Vladstudio Vladstudio::Item All categories Tüm kategoriler Abstract art Soyut sanat Creatures Canlılar Illustrations Çizimler Photos Resimler by Id Kimliğe göre by view count Görüntüleme sayısı ascending Yükselen descending azalan Wally::Application Cancel İptal Play Oynat Pause Duraklat Next photo Sonraki resim Save photo... Resmi kaydet... Get EXIF info... EXIF bilgisini al... Settings... Ayarlar... Explore source Kaynağa git About... Hakkında... History... Geçmiş... About Qt... Qt Hakkında... Quit Çıkış Languages Diller English İngilizce Italian İtalyanca Spanish İspanyolca German Almanca French Fransızca Russian Rusça Portuguese (Brazil) Portekizce (Brezilya) Czech Çek dili Polish Lehçe (Polonya) Chinese Çince Catalan Katalonya dili Greek Yunanca Korean Korece Hungarian Macar Danish Danimarkalı Swedish İsveç Turkish Türk Wally Error Wally Hata Active Desktop must be disabled cal desactivar Active Desktop by: Tarafından: Location: Mevki: Engine: Gösterim araçı: Save photo Resmi kaydet Images (*.png *.xpm *.jpg) Resimler (*.png *.xpm *.jpg) Right-click to show main menu Sağ tık ile ana menüyü göster Yahoo::DialogWidget All of these words Bu kelimelerin tümü Any of these words Bu kelimelerin hiçbiri Search for: Ara: Filter content Filtrelenmiş içerik Yahoo! item Yahoo! araması Unfiltered content can show offending or sexual explicit photos Fitre uygulanmazsa şiddet veya cinsellik içeren resimler görüntülenebilir Edit Yahoo! item Yahoo! aramasını düzenle Add Yahoo! item Yahoo! araması ekle Yahoo::Item Tags: Etiketler: and ve or veya content filtered Filtrelenmiş içerik wally-2.4.4/res/lang/wally_hu.ts0000644000000000000000000020143411676624760015300 0ustar rootroot AboutDialog About Wally A Wally névjegye <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Qt4 háttérkép cserélő<br />Készítette: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Szeretnék köszönetet mondani Vincent Willem van Goghnak az induló képért :)<br /><br />Honlap: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Kapcsolat <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Details >> Részletek >> Close Bezár Extension Kiterjesztés Description Leírás Supported image formats: Támogatott képformátumok: Additional info: További információ: Language Nyelv Translator Fordító Translations: Fordítások: Compiled with: Szerkesztő program: EXIF library: EXIF könyvtár: present létező not present nem létező English angol Italian olasz Russian orosz Spanish spanyol Portuguese (Brazil) portugál (brazil) German német French francia Czech cseh Chinese kínai Polish lengyel Catalan katalán Greek görög Korean koreai Hungarian Magyar Danish Dán Swedish Svéd Turkish Török Bing::DialogWidget All of these words Minden szó Any of these words Bármely szó Search for: Keresés: Strict Pontos Moderate Moderált Off Kikapcsolva Adult filter: Korhatár szűrő: Bing item Bing cikkely Unfiltered content can show offending or sexual explicit photos A nem szűrt tartalomban megjelennek a sértő és szexuális fotók Edit Bing item Bing szerkesztése Add Bing item Bing hozzáadása Bing::Item Tags: Címkék: and és or vagy Adult filter: Korhatár szűrő: Off Ki Moderate Moderált Strict Pontos Buzznet::DialogWidget Search for: Keresés: Edit Buzznet item Buzznet szerkesztése Add Buzznet item Buzznet hozzáadása Buzznet::Item Tag: Címke: DeviantArt::DialogWidget Search for: Keresés: Strict Pontos Off Ki Adult filter: Korhatár szűrő: deviantART item devianART cikkely Unfiltered content can show offending or sexual explicit photos A nem szűrt tartalomban megjelennek a sértő és szexuális fotók Edit deviantART item devianART szerkesztése Add deviantART item devianART hozzáadása DeviantArt::Item Tag: Címke: Adult filter: Korhatár szűrő: Off Ki Strict Pontos Exif::InfoDialog EXIF information EXIF adatok Tag Címke Value Érték No EXIF information available EXIF adatok nem elérhetők Files::Core Loading folder... Mappa beolvasása... Files::LabelPreview No preview available Előnézet nem elérhető Files::SettingsWidget Files Fájlok Select a photo Kép választása Select a folder Mappa választása FilesSettingsWidget Photos Képek Add a photo Kép hozzáadása Add photos in folder Mappa képeinek hozzáadása Delete photo Kép törlése Move photo up Kép felfelé Move photo down Kép lefelé Flickr::DialogWidget All of these words Minden szó Any of these words Bármely szó Search for: Keresés: Full text Teljes szöveg Tags only Csak címkék Largest Legnagyobb Original Eredeti Large Nagy Medium Közepes Small Kicsi Thumbnail Bélyegkép Square Négyzet alakú Smallest Legkisebb Interestingness desc Legkeresettebb szerint csökkenő Relevance Fontosság Date posted desc Közlés dátuma szerint csökkenő Date taken desc Feltöltés szerinti csökkenő Interestingness asc Legkeresettebb szerint növekvő Date posted asc Közlés dátuma szerint növekvő Date taken asc Feltöltés szerinti növekvő Size: Méret: Order: Sorrend: Edit Flickr item Flickr szerkesztése Add Flickr item Flickr hozzáadása Flickr::Item Text: Szöveg: Tags: Címkék: and és or vagy Size: Méret: Largest Legnagyobb Original Eredeti Large Nagy Medium Közepes Small Kicsi Thumbnail Bélyegkép Square Négyzet Smallest Legkisebb Order: Sorrend: Interestingness desc Legkeresettebb szerint csökkenő Relevance Fontosság Date posted desc Közlés dátuma szerint csökkenő Date taken desc Feltöltés szerinti csökkenő Interestingness asc Legkeresettebb szerint növekvő Date posted asc Közlés dátuma szerint növekvő Date taken asc Feltöltés szerinti növekvő Folders::DialogWidget Local Helyi Remote Távoli Include subfolders Alkönyvtárakkal együtt Folder: Mappa: Passive Passzív Active Aktív Server: Szerver: Port: Port: Transfer mode: Átvitel módja: Username: Felhasználónév: Password: Jelszó: Path: Útvonal: Select a folder Mappa választása Edit folder Mappa szerkesztése Add folder Mappa hozzáadása Folders::LocalItem (with subfolders) (alkönyvtárakkal együtt) Folders::RemoteItem Transfer mode: Átvitel módja: passive Passzív active Aktív Folders::SettingsWidget Folders Mappák FoldersSettingsWidget Folders Mappák Add a folder Mappa hozzáadása Delete folder Mappa törlése Google::DialogWidget Search for: Keresés: Strict Pontos Moderate Moderált Off Ki Adult filter: Korhatár szűrő: Google item Google cikkely Unfiltered content can show offending or sexual explicit photos A nem szűrt tartalomban megjelennek a sértő és szexuális fotók Edit Google item Google szerkesztése Add Google item Google hozzáadása Google::Item Text: Szöveg: Adult filter: Korhatár szűrő: Off Ki Moderate Moderált Strict Pontos Gui::ColorButton Auto Auto History::Dialog Right-click on items to show options Jobb klikk a cikkelyen megmutatja az opciókat History Történet Please wait... Kérem, várjon... Downloading photo... A fotó letöltődik... Abort Megszakítás Save photo Fotó mentése Images (*.png *.xpm *.jpg) Képek (*.png *.xpm *.jpg) Photo has been saved Fotó elmentve There was an error during download Hiba a letöltés közben View photo... Fotó megtekintése... Get EXIF info... EXIF adatok megtekintése... Save photo... Fotó mentése... Set as background Beállítás háttérképként Explore image source Képforrás kutatása History::EngineQueryModel All Mind History::PhotosQueryModel (no title) (nincs felirat) by: készítő: (no author) (nincs alkotó) Date: Dátum: Location: Hely: unknown ismeretlen Size: Méret: Image size: Kép mérete: Engine: Forrás: EXIF: EXIF: No Nem Yes Igen History::TagsQueryModel All Mind HttpEngine::SettingsWidget Select a folder Mappa választása HttpSettingsWidget Photo sets Képgyűjtemények Add a photo set Képgyűjtemény hozzáadása Delete photo set Képgyűjtemény törlése Options Opciók Save photos Fotók mentése Ipernity::DialogWidget All of these words Minden szó Any of these words Bármely szó Search for: Keresés: Full text Teljes szöveg Tags only Csak címkék Ipernity item Ipernity cikkely It can show offending or sexual explicit photos Megjelenhetnek a sértő és szexuális fotók Edit Ipernity item Ipernity szerkesztése Add Ipernity item Ipernity hozzáadás Ipernity::Item Text: Szöveg: and és or vagy Tags: Címkék: Main Error Hiba Another instance of Másik kérelem is already running már folyamatban Disclaimer Visszautasítás <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>Az alkotó nem járult hozzá a tartalom Wallyval történő letöltéséhez<br>Az alkotó nem vállal felelősséget a tartalomért</b><br><br>Ha ez problémát okoz, használja a "Fájlok" vagy "Könyvtárak" helyi lehetőséget!<br>Vagy válassza a <b>Nem-et</b>a Wallyból való kilépésre, vagy használja <b>saját felelősségre!</b><br><br>(Ha elfogadja, akkor ez az üzenet nem jelenik meg többször)<br><br>Elfogadja a fenti feltételeket? Map::View Drag to select. Right-click to zoom Ragadja meg a kiválasztáshoz! Jobb klikk a nagyításhoz Zoom %1x Nagyítás %1x Map::Viewer Map viewer Térkép néző Panoramio::DialogWidget Select on map Választás a térképen Longitude (min): Hosszúsági fok (minimum): Longitude (max): Hosszúsági fok (maximum): Latitude (min): Szélességi fok (minimum): Latitude (max): Szélességi fok (maximum): Popularity Népszerűség Upload date Feltöltés dátuma Original Eredeti Medium Közepes Small Kicsi Thumbnail Bélyegkép Square Négyzet alakú Mini square Kis négyzet alakú Order: Sorrend: Size: Méret: Edit Panoramio item Panoramio szerkesztése Add Panoramio item Panoramio hozzáadása Error Hiba Coordinates must be different A koordinátáknak különbözőeknek kell lenniük Panoramio::Item lat: szélességi: lon: hosszúsági: Original Eredeti Medium Közepes Small Kicsi Thumbnail Bélyegkép Square Négyzet alakú Mini square Kis négyzet alakú Popularity Népszerűség Upload date Feltöltés dátuma Longitude: Hosszúsági fok: Latitude: Szélességi fok: Size: Méret: Order: Sorrend: Photobucket::DialogWidget All of these words Minden szó Any of these words Bármely szó Search for: Keresés: Photobucket item Photobucket cikkely It can show offending or sexual explicit photos Megjelenhetnek a sértő és szexuális fotók Edit Photobucket item Photobucket szerkesztése Add Photobucket item Photobucket hozzáadása Photobucket::Item Text: Szöveg: and és or vagy Picasa::DialogWidget Search for: Keresés: Edit Picasa item Picasa szerkesztése Add Picasa item Picasa hozzáadása Picasa::Item Text: Szöveg: Pikeo::DialogWidget Search for: Keresés: Default Alapértelmezés Most viewed Legnézettebb Upload date Feltöltés dátuma Date taken Feltöltés szerinti Group add date Dátum szerinti csoportosítás Comment date Hozzászólás dátuma Ascending Növekvő Order: Sorrend: Edit Pikeo item Pikeo szerkesztése Add Pikeo item Pikeo hozzáadása Pikeo::Item Tags: Címkék: Order: Sorrend: Default Alapértelmezés Most viewed Legnézettebb Upload date Feltöltés dátuma Date taken Feltöltés szerinti Group add date Dátum szerinti csoportosítás Comment date Hozzászólás dátuma ascending Növekvő descending csökkenő PositionModel Position Pozíció Picture smaller than screen on the left, greater than screen on the right Kép kisebb mint a képernyő bal oldala, nagyobb mint a képernyő jobb oldala QColorDialog Hu&e: Színárn&yalat: &Sat: &Telítettség: &Val: É&rték: &Red: &Piros: &Green: &Zöld: Bl&ue: Ké&k: Select Color Válasszon színt &Basic colors &Alapszínek &Custom colors &Egyéni színek &Add to Custom Colors &Hozzáadás az egyéni színekhez QDialogButtonBox OK Rendben Cancel Mégsem Reset Visszaállítás &Yes &Igen &No &Nem Close Bezár &Close &Bezár QFileDialog Directories Könyvtárak &Open &Megnyitás &Save Menté&s Open Megnyitás %1 already exists. Do you want to replace it? %1 már létezik. Lecseréli? %1 File not found. Please verify the correct file name was given. %1 fájl nem található. Kérem, ellenőrizze a helyes fájlnevet. My Computer Számítógépem &Rename Át&nevezés &Delete &Törlés Show &hidden files Rejtett &fájlok megjelenítése Back Vissza Parent Directory Szülő könyvtár List View Listanézet Detail View Részletes nézet Files of type: Fájltípusok: Directory: Könyvtár: %1 Directory not found. Please verify the correct directory name was given. %1 Könyvtár nem található. Kérem, ellenőrizze a helyes fájlnevet. '%1' is write protected. Do you want to delete it anyway? '%1' írásvédett. Mindeképpen törli? Are sure you want to delete '%1'? Biztosan törölni akarja '%1'? Could not delete directory. A könyvtár nem törölhető. Recent Places Újabb helyek Save As Mentés mint Drive Meghajtó File Fájl Unknown Ismeretlen Find Directory Könyvtár keresése Show Mutasd Forward Előre New Folder Új mappa &New Folder Ú&j mappa &Choose &Válassz Remove Törlés File &name: Fájl &neve: Look in: Betekintés: Create New Folder Új mappa létrehozása QObject Centered Középre Tiled Mozaikszerűen Center Tiled Középre mozaikszerűen Centered Maxpect Középre nyújtva Tiled Maxpect Mozaikszerűen nyújtva Scaled Nagyítva Centered Auto Fit Középre automatikusan Scale & Crop Nagyítva & levágva Symmetrical Tiled Szimmetrikus mozaik Mirrored Tiled Tükrözve mozaikszerűen Symmetrical Mirrored Tiled Szimmetrikusan tükrözött mozaik All image files Minden képfájl files fájlok QProgressDialog Cancel Mégsem SettingsDialog General options Általános opciók Interval: Távköz: Border: Keret: Position: Pozíció: Main Choose in random order Véletlenszerű sorrend Switch background on play Háttérváltás futás közben Play automatically on application start Automatikus cserélés induláskor Disable splash screen Felugró képernyő tiltása Quit after background change Hátérképcsere után kilép Start automatically when system starts Automatikus cserélés rendszerinduláskor Only use landscape-oriented photos Csak fekvő fotók használata Rotate images according to EXIF information EXIF információk szerinti képelfordítás View info on photo Információ mutatása a fotón View info in system tray tooltip Információ mutatása a rendszertálca ikonon Use full desktop area Teljes képernyő használata Photo has to be A fotó legyen independent of független az at least 1/2 of fele az at least 3/4 of háronegyede az bigger than nagyobb mint az desktop's size asztal mérete Don't save locally remote photos if free disk space goes below Ne mentse el a fotókat, ha a lemez mérete kisebb mint Store images in history for Őrizze meg a képeket az archívumban Clear Törlés Available modules: Elérhető modulok: Active modules: Aktív modulok: Network Hálózat Direct connection Közvetlen kapcsolat Proxy connection Proxyn keresztül Use system proxy Rendszer proxy használata Use custom proxy Egyéni proxy használata Server: Kiszolgáló: Port: Port: Authentication Hitelesítés Username: Felhasználónév: Password: Jelszó: Settings Beállítások Left Bal Right Jobb kBytes kilobájt MBytes Megabájt GBytes Gigabájt day(s) nap(ok) month(s) hónap(ok) second(s) másodperc(ek) minute(s) perc(ek) hour(s) óra Set position Pozíció beállítása Changes won't be applied. Are you sure? Változások nincsenek ekfogadva. Biztos benne? Clear history Történet törlése Are you sure? Biztos benne? SmugMug::DialogWidget Search for: Keresés: Edit SmugMug item SmugMug szerkesztése Add SmugMug item SmugMug hozzáadása SmugMug::Item Text: Szöveg: SplashScreen Loading Files module ... Fájl modul betöltése ... Loading Folders module ... Mappa modul betöltése ... Loading Flickr module ... Flickr modul betöltése ... Loading Yahoo! module ... Yahoo! modul betöltése ... Loading Panoramio module ... Panoramio modul betöltése ... Loading Ipernity module ... Ipernity modul betöltése ... Loading Photobucket module ... Photobucket modul betöltése ... Loading Buzznet module ... Buzznet modul betöltése ... Loading Picasa module ... Picasa modul betöltése ... Loading SmugMug module ... SmugMug modul betöltése ... Loading Google module ... Google modul betöltése ... Loading Vladstudio module ... Vladstudio modul betöltése ... Loading deviantART module ... devianART modul betöltése ... Loading settings ... Beállítások betöltése ... Launching Wally ... Wally indítása ... Author: Készítette: Viewer Right-click on photo to show actions Jobb klikk a fotón megmutatja a lehetőségeket Fit to window Ablakhoz igazítás Show full image Teljes kép mutatása Zoom in Nagyítás Zoom out Kicsinyítés Rotate clockwise Jobbra forgatás Rotate c. clockwise Balra forgatás Vladstudio::DialogWidget All Mind Abstract art Absztrakt Creatures Élőlények Illustrations Illusztrációk Photos Fotók By ID ID szerint By view count Látogatottság szerint Ascending Növekvő Descending Csökkenő Category: Kategóriák: Order: Sorrend: Direction: Hely: Edit Vladstudio item Vladstudio szerkesztése Add Vladstudio item Vladstudio hozzáadása Vladstudio::Item All categories Mineden kategória Abstract art Absztrakt Creatures Élőlények Illustrations Illusztrációk Photos Képek by Id ID szerint by view count Látogatottság szerint ascending növekvő descending csökkenő Wally::Application Cancel Mégsem Play Indít Pause Szünet Next photo Következő Save photo... Fotó mentése... Get EXIF info... EXIF adatok megtekintése... Settings... Beállítások... Explore source Forrás kutatása About... Névjegy... History... Történet... About Qt... Qt névjegye... Quit Kilép Languages Nyelvek English angol Italian olasz Spanish spanyol German német French francia Russian orosz Portuguese (Brazil) portugál (brazil) Czech cseh Polish lengyel Chinese kínai Catalan katalán Greek görög Korean koreai Wally Error Wally hiba Active Desktop must be disabled Aktív asztal nem érhető el by: készítő: Location: Hely: Engine: Forrás: Save photo Fotó mentése Images (*.png *.xpm *.jpg) Képek (*.png *.xpm *.jpg) Right-click to show main menu Jobb klikk megmutaja a főmenüt Hungarian Magyar Danish Dán Swedish Svéd Turkish Török Yahoo::DialogWidget All of these words Minden szó Any of these words Bármely szó Search for: Keresés: Filter content Szűrő tartalom Yahoo! item Yahoo! cikkely Unfiltered content can show offending or sexual explicit photos A nem szűrt tartalomban megjelennek a sértő és szexuális fotók Edit Yahoo! item Yahoo! szerkesztése Add Yahoo! item Yahoo! hozzáadása Yahoo::Item Tags: Címkék: and és or vagy content filtered tartalom szűrve wally-2.4.4/res/lang/wally_gr.ts0000644000000000000000000032500711676624760015277 0ustar rootroot AboutDialog Compiled with: Προσαρμογή με: EXIF library: Βιβλιοθήκη EXIF: present υπάρχει not present δεν υπάρχει English Αγγλικά Italian Ιταλικά Russian Ρωσικά Spanish Ισπανικά Portuguese (Brazil) Πορτογαλικά(Βραζιλίας) German Γερμανικά French Γαλλικά Czech Τσέχικα Chinese Κινεζικά Polish Πολωνικά Catalan Καταλανικά Greek Ελληνικά Korean Κορεατικά Hungarian Ουγγρικά Danish Δανέζικα Swedish Σουηδικά Turkish Τουρκικά About Wally Περί Wally <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Qt4 εναλλαγή ταπετσαρίας επιφάνειας εργασίας<br />Δημιουργός: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Ευχαριστίες στον Vincent Willem van Gogh για το logo :)<br /><br />Ιστοσελίδα: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Μπορείτε να επικοινωνήσετε μαζί μου στο<a href="mailto:tony@becrux.com?θέμα=Περί Wally">tony@becrux.com</font></body></html> Details >> Λεπτομέρειες >> Close Κλείσιμο Extension Επέκταση Description Περιγραφή Supported image formats: Υποστηριζόμενοι τύποι εικόνας: Additional info: Πρόσθετες πληροφορίες: Language Γλώσσα Translator Μεταφραστής Translations: Μεταφράσεις: Bing::DialogWidget All of these words 'Ολες οι λέξεις Any of these words Όποια λέξη Search for: Αναζήτηση γιά: Strict Ακριβώς Moderate Μέτρια Off Εκτός Adult filter: Φίλτρο ενηλίκων: Bing item Αντικείμενο Bing Unfiltered content can show offending or sexual explicit photos Αφιλτράριστο περιεχόμενο μπορεί να δείξε προσβλητικό ή σκληρό πορνογραφικό θέαμα Edit Bing item Σύνταξη αντικείμενου Bing Add Bing item Πρόσθεση αντικειμένου Bing Bing::Item Tags: Ετικέτες: and καί or ή Adult filter: Φίλτρο ενηλίκων: Off Εκτός Moderate Μέτρια Strict Ακριβώς Buzznet::DialogWidget Search for: Αναζήτηση γιά: Edit Buzznet item Σύνταξη αντικειμένου Buzznet Add Buzznet item Πρόσθεση αντικειμένου Buzznet Buzznet::Item Tag: Ετικέτα: DeviantArt::DialogWidget Search for: Αναζήτηση γιά: Strict Ακριβώς Off Εκτός Adult filter: Φίλτρο ενηλίκων: deviantART item Πρόσθεση αντικειμένου deviantART Unfiltered content can show offending or sexual explicit photos Αφιλτράριστο περιεχόμενο μπορεί να δείξε προσβλητικό ή σκληρό πορνογραφικό θέαμα Edit deviantART item Επεξεργασία αντικείμενου deviantART Add deviantART item Προσθήκη αντικείμενου deviantART DeviantArt::Item Tag: Ετικέτα: Adult filter: Φίλτρο ενηλίκων: Off Εκτός Strict Ακριβώς Exif::InfoDialog EXIF information Πληροφορίες EXIF Tag Ετικέτα Value Τιμή No EXIF information available Δεν υπάρχουν πληροφορίες EXIF Files::Core Loading folder... Φόρτωση φακέλου... Files::LabelPreview No preview available Δεν διατίθεται προεπισκόπηση Files::SettingsWidget Files Αρχεία Select a photo Επιλέγξτε φωτογραφία Select a folder Επιλέγξτε φάκελο FilesSettingsWidget Photos Φωτογραφίες Add a photo Προσθέστε μία φωτογραφία Add photos in folder Προσθέστε φωτογραφίες στο φάκελο Delete photo Διαγραφή φωτογραφίας Move photo up Μετακίνηση φωτογραφίας πάνω Move photo down Μετακίνηση φωτογραφίας κάτω Flickr::DialogWidget All of these words Όλες οι λέξεις Any of these words Όποια λέξη Search for: Αναζήτηση γιά: Full text Πλήρες κείμενο Tags only Μόνο ετικέτες Largest Μεγαλύτερο Original Πρωτότυπο Large Μεγάλο Medium Μεσαίο Small Μικρό Thumbnail Μικρογραφίες Square Τετράγωνο Smallest Μικρότερο Interestingness desc Κατά ενδιαφέρον φθίν Relevance Αρμοδιότης Date posted desc Ημερομηνία ανάρτησης φθιν Date taken desc Ημερομηνία λήψης φθιν Interestingness asc Κατά ενδιαφέρον αύξ Date posted asc Ημερομηνία ανάρτησης αύξ Date taken asc Ημερομηνία λήψης αύξ Size: Μέγεθος: Order: Κατάταξη: Edit Flickr item Σύνταξη αντικειμένου Flickr Add Flickr item Προσθήκη αντικειμένου Flickr Flickr::Item Text: Κείμενο: Tags: Ετικέτες: and καί or ή Size: Μέγεθος: Largest Μέγιστο Original Αρχικό Large Μεγάλο Medium Μεσαίο Small Μικρό Thumbnail Μικρογραφίες Square Τετράγωνο Smallest Ελάχιστο Order: Κατάταξη: Interestingness desc Κατά ενδιαφέρον φθίν Relevance Σχετικότης Date posted desc Ημερομηνία ανάρτησης φθιν Date taken desc Ημερομηνία λήψης φθιν Interestingness asc Κατά ενδιαφέρον αύξ Date posted asc Ημερομηνία ανάρτησης αύξ Date taken asc Ημερομηνία λήψης αύξ Folders::DialogWidget Local Τοπικό Remote Απομακρυσμένο Include subfolders Συμπεριλαμβάνει υποφακέλους Folder: Φάκελος: Passive Παθητικό Active Ενεργό Server: Διακομιστής: Port: Θύρα: Transfer mode: Λειτουργία μεταφοράς: Username: Όνομα χρήστη: Password: Κωδικός πρόσβασης: Path: Διαδρομή: Select a folder Επιλέγξτε φάκελο Edit folder Σύνταξη φακέλου Add folder Πρόσθεση φακέλου Folders::LocalItem (with subfolders) (με υποφακέλους) Folders::RemoteItem Transfer mode: Λειτουργία μεταφοράς: passive Παθητική active Ενεργή Folders::SettingsWidget Folders Φάκελοι FoldersSettingsWidget Folders Φάκελοι Add a folder Πρόσθεση φακέλου Delete folder Διαγραφή φακέλου Google::DialogWidget Search for: Αναζήτηση γιά: Strict Ακριβώς Moderate Μέτρια Off Εκτός Adult filter: Φίλτρο ενηλίκων: Google item Αντικείμενο Google Unfiltered content can show offending or sexual explicit photos Edit Google item Επεξεργασία αντικείμενου Google Add Google item Προσθέστε αντικείμενο Google Google::Item Text: Κείμενο: Adult filter: Φίλτρο ενηλίκων: Off Εκτός Moderate Μέτρια Strict Ακριβώς Gui::ColorButton Auto Αυτόματα History::Dialog Right-click on items to show options Κάντε δεξί κλικ στα στοιχεία για να δείτε τις επιλογές History Ιστορικό Please wait... Παρακαλώ περιμένετε... Downloading photo... Λήψεις φωτογραφιών... Abort Ματαίωση Save photo Αποθήκευση φωτογραφιών Images (*.png *.xpm *.jpg) Εικόνες (*.png *.xpm *.jpg) Photo has been saved Φωτογραφία εχει αποθηκευτεί There was an error during download Παρουσιάστηκε σφάλμα κατά τη λήψη View photo... Προβολή φωτογραφίας... Get EXIF info... Λάβετε EXIF πληροφορίες ... Save photo... Αποθήκευση φωτογραφιών... Set as background Ορισμός ως φόντο Explore image source Εξερευνήστε την προέλευση εικόνας History::EngineQueryModel All Όλα History::PhotosQueryModel (no title) (χωρίς τίτλο) by: υπό: (no author) (χωρίς δημιουργό) Date: Ημερομηνία: Location: Τοποθεσία: unknown άγνωστο Size: Μέγεθος: Image size: Μέγεθος εικόνας: Engine: Μηχανή: EXIF: EXIF: No Όχι Yes Ναί History::TagsQueryModel All Όλα HttpEngine::SettingsWidget Select a folder Επιλέγξτε ένα φάκελο HttpSettingsWidget Photo sets Συλλογή φωτογραφιών Add a photo set Προσθέστε μία συλλογή φωτογραφιών Delete photo set Διαγράψτε τη συλλογή φωτογραφιών Options Επιλογές Save photos Αποθήκευση φωτογραφιών Ipernity::DialogWidget All of these words Όλες οι λέξεις Any of these words Όποια λέξη Search for: Αναζήτηση γιά: Full text Πλήρες κείμενο Tags only Μόνο ετικέτες Ipernity item Προσθήκη αντικείμενου Ipernity It can show offending or sexual explicit photos Αφιλτράριστο περιεχόμενο μπορεί να δείξει προσβλητικό ή σκληρό πορνογραφικό θέαμα Edit Ipernity item Επεξεργασία αντικείμενου Ipernity Add Ipernity item Προσθήκη αντικείμενου Ipernity Ipernity::Item Text: Κείμενο: and καί or ή Tags: Ετικέτες: Main Error Σφάλμα is already running εκτελείται ήδη Disclaimer Άρνηση ευθύνης <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b> Ο Δημιουργός δεν αναλαμβάνει καμία ευθύνη για το περιεχόμενο που το Wally κατεβάζει από τοποθεσίες κοινής χρήσης φωτογραφιών.<br> ο Δημιουργός δεν φέρει καμία ευθύνη για οποιοδήποτε τέτοιο περιεχόμενο.</b><br><br>Εάν αυτό είναι πρόβλημα για εσάς, παρακαλούμε να χρησιμοποιήσετε μόνο τοπικές μηχανές όπως "Αρχεία" ή τοπικοί "Φάκελοι". <br>Διαφορετικά, παρακαλώ επιλέξτε <b> "Όχι" </b> για να βγείτε απο το Wally, ή να το χρησιμοποιήσετε <b> με δική σας ευθύνη. </b><br><br> (Αν συνεχίσετε, αυτό το μήνυμα θα εμφανιστεί μόνο μία φορά) <br><br>Δέχεστε την παραπάνω κατάσταση; Another instance of Μια άλλη παρουσία αυτού του προγράμματος Map::View Drag to select. Right-click to zoom Σύρετε για να επιλέξετε. Κάντε δεξί κλικ για μεγέθυνση Zoom %1x Μεγένθυση %1x Map::Viewer Map viewer Προβολή χάρτη Panoramio::DialogWidget Select on map Επιλέγξτε στον χάρτη Longitude (min): Γεωγρ.Μήκος(ελαχ): Longitude (max): Γεωγρ.Μήκος(μεγ): Latitude (min): Γεωγρ.Πλάτος(ελαχ): Latitude (max): Γεωγρ.Πλάτος(μεγ): Popularity Δημοτικότητα Upload date Ημερομηνία ανεβάσματος Original Αρχικό Medium Μεσαίο Small Μικρό Thumbnail Μικρογραφίες Square Τετράγωνο Mini square Μίνι τετράγωνο Order: Κατάταξη: Size: Μέγεθος: Edit Panoramio item Επεξεργασία αντικείμενου Panoramio Add Panoramio item Προσθήκη αντικείμενου Panoramio Error Σφάλμα Coordinates must be different Συντεταγμένες πρέπει να είναι διαφορετικές Panoramio::Item lat: πλατ: lon: μήκ: Original Αρχικό Medium Μεσαίο Small Μικρό Thumbnail Μικρογραφίες Square Τετράγωνο Mini square Μίνι τετράγωνο Popularity Δημοτικότητα Upload date Ημερομηνία ανεβάσματος Longitude: Γεωγρ.Μήκος: Latitude: Γεωγρ.Πλάτος: Size: Μέγεθος: Order: Κατάταξη: Photobucket::DialogWidget All of these words 'Ολες οι λέξεις Any of these words Όποια λέξη Search for: Αναζήτηση γιά: Photobucket item Πρόσθεση αντικειμένου Photobucket It can show offending or sexual explicit photos Αφιλτράριστο περιεχόμενο μπορεί να δείξει προσβλητικό ή σκληρό πορνογραφικό θέαμα Edit Photobucket item Επεξεργασία αντικείμενου Photobucket Add Photobucket item Πρόσθεση αντικειμένου Photobucket Photobucket::Item Text: Κείμενο: and καί or ή Picasa::DialogWidget Search for: Αναζήτηση γιά: Edit Picasa item Σύνταξη αντικειμένου Picasa Add Picasa item Πρόσθεση αντικειμένου Picasa Picasa::Item Text: Κείμενο: Pikeo::DialogWidget Search for: Αναζήτηση γιά: Default Προεπιλογή Most viewed Περισσότερες εμφανίσεις Upload date Ημερομηνία ανεβάσματος Date taken Ημερομηνία λήψης Group add date Ημερομηνία προσθήκης ομάδας Comment date Ημερομηνία σχολίου Ascending Αύξουσα Order: Κατάταξη: Edit Pikeo item Σύνταξη αντικειμένου Pikeo Add Pikeo item Προσθήκη αντικειμένου Pikeo Pikeo::Item Tags: Ετικέτες: Order: Κατάταξη: Default Most viewed Περισσότερες εμφανίσεις Upload date Ημερομηνία ανεβάσματος Date taken Ημερομηνία λήψης Group add date Ημερομηνία προσθήκης ομάδας Comment date Ημερομηνία σχολίου ascending Αύξουσα descending φθίνουσα PositionModel Position Θέση Picture smaller than screen on the left, greater than screen on the right Εικόνα μικρότερη της οθόνης στ αριστερά, μεγαλύτερη της οθόνης στα δεξιά QColorDialog Hu&e: Απόχ&ρωση: &Sat: &Κορ: &Val: &Τιμ: &Red: Κόκκ&ινο: &Green: &Πράσινο: Bl&ue: &Μπλέ: Select Color Επιλέγξτε χρώμα &Basic colors &Βασικά χρώματα &Custom colors Προσαρμοσμένα &χρώματα &Add to Custom Colors Προσθήκ&η στα προσαρμοσμένα χρώματα QDialogButtonBox OK ΟΚ Cancel Άκυρο Reset Επαναφορά &Yes &Ναί &No &Όχι Close Κλείσιμο &Close &Κλείσιμο QFileDialog Directories Κατάλογοι &Open &Άνοιγμα &Save &Αποθήκευση Open Άνοιγμα %1 already exists. Do you want to replace it? %1 υπάρχει ήδη. Θέλετε να το αντικαταστήσετε; %1 File not found. Please verify the correct file name was given. %1 Το αρχείο δεν βρέθηκε. Παρακαλώ επαληθεύστε το σωστό όνομα αρχείου που δόθηκε. My Computer Ο Υπολογιστής Μου &Rename &Μετονομασία &Delete &Διαγραφή Show &hidden files Εμφάνιση &κρυφών αρχείων Back Πίσω Parent Directory Επάνω List View Λίστα Detail View Λεπτομέρειες Files of type: Αρχεία τύπου: Directory: Κατάλογος: %1 Directory not found. Please verify the correct directory name was given. %1 Κατάλογος δεν βρέθηκε. Παρακαλώ επαληθεύστε το σωστό όνομα Κατάλογου που δόθηκε. '%1' is write protected. Do you want to delete it anyway? '%1' έχει προστασία εγγραφήςι. Θέλετε να το διαγράψετε ούτως ή άλλως; Are sure you want to delete '%1'? Θέλετε σίγουρα να διαγράψετε '%1'? Could not delete directory. Δεν ήταν δυνατή η διαγραφή καταλόγου. Recent Places Πρόσφατες Θέσεις Save As Αποθήκευση ως Drive Συσκευή File Αρχείο Unknown Άγνωστο Find Directory Εύρεση Κατάλογου Show Δείξε Forward Προώθηση New Folder Νέος Φάκελος &New Folder &Νέος Φάκελος &Choose &Επέλεξε Remove Αφαίρεσε File &name: Όνομα &αρχείου: Look in: Κοίτα στο: Create New Folder Δημιουργία Νέος Φάκελος QObject All image files Όλα τα αρχεία εικόνας files αρχεία Centered Στο κέντρο Tiled Πλακάκια Center Tiled Στο κέντρο πλακάκια Centered Maxpect Στο κέντρο Maxpect Tiled Maxpect Πλακάκια Maxpect Scaled Κλιμακωτά Centered Auto Fit Στο κέντρο Auto Fit Scale & Crop Κλίμακα & Περικοπή Symmetrical Tiled Συμμετρικά πλακάκια Mirrored Tiled Ανεστραμένα Πλακάκια Symmetrical Mirrored Tiled Συμμετρικά Ανεστραμένα Πλακάκια QProgressDialog Cancel Άκυρο SettingsDialog Settings Ρυθμίσεις Left Αριστερά Right Δεξιά kBytes kBytes MBytes MBytes GBytes GBytes day(s) ημέρα(ες) ημέρες month(s) μήνας(ες) μήνες second(s) δευτερόλεπτο(α) δευτερόλεπτα minute(s) λεπτό(α) λεπτά hour(s) ώρα(ες) ώρες Set position Ορίστε θέση Changes won't be applied. Are you sure? Οι αλλαγές δεν θα εφαρμοστούν. Είστε σίγουροι; Clear history Καθαρισμός ιστορικού Are you sure? Είστε σίγουροι; General options Γενικές Επιλογές Interval: Διάστημα: Border: Περιθώριο: Position: Θέση: Main Κύριο Choose in random order Επιλογή με τυχαία σειρά Switch background on play Αλλαγή φόντου στο παίξτε Play automatically on application start Αναπαραγωγή αυτόματα στην έναρξη της εφαρμογής Disable splash screen Απενεργοποίηση οθόνης εμφάνισης Quit after background change Έξοδος μετά την αλλαγή φόντου Start automatically when system starts Εκκίνηση αυτόματα στην έναρξη του συστήματος Only use landscape-oriented photos Χρήση φωτογραφιών μόνο με προσανατολισμό τοπίου Rotate images according to EXIF information Περιστροφή φωτογραφιών σύμφωνα με τις πληροφορίες EXIF View info on photo Προβολή πληροφοριών πάνω στις φωτογραφίες View info in system tray tooltip system tray-γραμμής ειδοποιήσεων Προβολή πληροφοριών στο αναδυόμενο παράθυρο της γραμμής ειδοποιήσεων Use full desktop area Χρήση πλήρους επιφάνειας εργασίας Photo has to be Η φωτογραφία πρέπει να είναι independent of Ανεξάρτητα από at least 1/2 of τουλάχιστον 1/2 at least 3/4 of τουλάχιστον 3/4 bigger than Μεγαλύτερο από desktop's size το μέγεθος της επιφάνειας εργασίας Don't save locally remote photos if free disk space goes below Μην αποθηκεύετε τοπικά απομακρυσμένες φωτογραφίες αν ο ελεύθερος χώρος στο δίσκο είναι λιγότερος από Store images in history for Διατήρηση φωτογραφιών στο ιστορικό για Clear Καθάρισε Available modules: Διαθέσιμες ενότητες: Active modules: Ενεργές ενότητες: Network Δίκτυο Direct connection Απ΄ευθείας σύνδεση Proxy connection Σύνδεση μέσω Proxy Use system proxy Proxy-Διαμεσολαβητης Χρήση Proxy συστήματος Use custom proxy Χρήση προσαρμοσμένου Proxy Server: Server-υπολογιστής εξυπηρέτησης δικτύου υπολογιστής εξυπηρέτησης δικτύου: Port: Θύρα: Authentication Πιστοποίηση Username: 'Ονομα χρήστη: Password: Κωδικός εισόδου: SmugMug::DialogWidget Search for: Αναζήτηση γιά: Edit SmugMug item Επεξεργασία αντικείμενου SmugMug Add SmugMug item Προσθήκη αντικείμενου SmugMug SmugMug::Item Text: Κείμενο: SplashScreen Loading Files module ... Διαδικασία φόρτωσης Αρχείων ... Loading Folders module ... Διαδικασία φόρτωσης Φακέλων ... Loading Flickr module ... Διαδικασία φόρτωσης Flickr ... Loading Yahoo! module ... Διαδικασία φόρτωσης Yahoo! ... Loading Panoramio module ... Διαδικασία φόρτωσης Panoramio ... Loading Ipernity module ... Διαδικασία φόρτωσης Ipernity ... Loading Photobucket module ... Διαδικασία φόρτωσης Photobucket ... Loading Buzznet module ... Διαδικασία φόρτωσης Buzznet ... Loading Picasa module ... Διαδικασία φόρτωσης Picasa ... Loading SmugMug module ... Διαδικασία φόρτωσης SmugMug ... Loading Google module ... Διαδικασία φόρτωσης Google ... Loading Vladstudio module ... Διαδικασία φόρτωσης Vladstudio ... Loading deviantART module ... Διαδικασία φόρτωσης deviantART ... Loading settings ... Φόρτωση ρυθμίσεων ... Launching Wally ... Φόρτωση Wally ... Author: Δημιουργός: Viewer Right-click on photo to show actions Δεξί-κλικ γιά εμφάνιση κύριου μενού Fit to window Προσαρμογή στο παράθυρο Προσαρμογή στο παράθυρο Show full image Εμφάνιση πλήρους εικόνας Εμφάνιση πλήρους εικόνας Zoom in Μεγένθυση Zoom out Σμίκρυνση Rotate clockwise Περιστροφή δεξιόστροφα Rotate c. clockwise Περιστροφή αριστερόστρφα Vladstudio::DialogWidget All Όλα Abstract art Αφηρημένη τέχνη Creatures Πλάσματα Illustrations Εικονογράφηση Photos Φωτογραφίες By ID από ταυτότητα By view count από καταμέτρηση θέασης Ascending Αύξουσα Descending Φθίνουσα Category: Κατηγορία: Order: Κατάταξη: Direction: Κατεύθυνση: Edit Vladstudio item Επεξεργασία αντικείμενου Vladstudio Add Vladstudio item Προσθήκη αντικείμενου Vladstudio Vladstudio::Item All categories Όλες οι κατηγορίες Abstract art Αφηρημένη τέχνη Creatures Πλάσματα Illustrations Εικονογράφησεις Photos Φωτογραφίες by Id από ταυτότητα by view count από καταμέτρηση θέασης ascending aύξουσα descending φθίνουσα Wally::Application Cancel Άκυρο Play Αναπαραγωγή Pause Παύση Next photo Επόμενη φωτογραφία Save photo... Αποθήκευση φωτογραφίας... Get EXIF info... Πάρτε EXIF πληροφορίες... Settings... Ρυθμίσεις... Explore source Εξερεύνηση προέλευσης About... Περί... History... Ιστορικό... About Qt... Περί Qt... Quit Έξοδος Languages Γλώσσες English Αγγλικά Italian Ιταλικά Spanish Ισπανικά German Γερμανικά French Γαλλικά Russian Ρωσικά Portuguese (Brazil) Πορτογαλικά(Βραζιλίας) Czech Τσέχικα Polish Πολωνέζικα Chinese Κινέζικα Catalan Καταλανικά Greek Ελληνικά Korean Κορεατικά Hungarian Ουγγρικά Danish Δανέζικα Swedish Σουηδικά Turkish Τουρκικά Wally Error Σφάλμα Wally Active Desktop must be disabled Active Desktop πρέπει να απενεργοποιηθεί by: από: Location: Θέση: Engine: Μηχανή: Save photo Αποθήκευση φωτογραφίας Images (*.png *.xpm *.jpg) Εικόνες (*.png *.xpm *.jpg) Right-click to show main menu Δεξί κλικ γιά εμφάνιση κύριου μενού Yahoo::DialogWidget All of these words 'Ολες οι λέξεις Any of these words Όποια λέξη Search for: Αναζήτηση γιά: Filter content Φίλτρο περιεχομένου Yahoo! item Yahoo! Αντικείμενο Unfiltered content can show offending or sexual explicit photos Αφιλτράριστο περιεχόμενο μπορεί να δείξει σκληρό πορνογραφικό θέαμα Edit Yahoo! item Επεξεργασία αντικείμενου Yahoo! Add Yahoo! item Προσθέστε αντικείμενο Yahoo! Yahoo::Item Tags: Ετικέτες: and καί or ή content filtered φιλτραρισμένο περιεχόμενο wally-2.4.4/res/lang/wally_pt_BR.ts0000644000000000000000000030416011676624760015672 0ustar rootroot AboutDialog Supported image formats: Arquivos de imagem suportados: About Wally Sobre o Wally Details >> Detalhes >> Compiled with: Compilado com: EXIF library: Biblioteca EXIF: present presente not present não presente Chinese Chinês Close Fechar Extension Extensão Description Descrição Additional info: Informação adicional: Language Idioma Translator Tradutor <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Alternador de papel de parede para desktop Qt4<br />Autor: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Agradecimentos a Vincent Willem van Gogh pelo logotipo :)<br /><br />Site web: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Você pode contactar-me em <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Italian Italiano English Inglês Russian Russo Spanish Espanhol Portuguese (Brazil) Português (Brasil) German Alemão French Francês Czech Checo Polish Polonês Catalan Catalão Greek Grego Korean Coreano Hungarian Húngaro Danish Dinamarquês Swedish Sueco Turkish Turco Translations: Tradução: Bing::DialogWidget All of these words Todas essas palavras Any of these words Qualquer uma dessas palavras Search for: Pesquisar por: Strict Rigoroso Moderate Moderado Off Desligado Adult filter: Filtro adulto: Bing item Item Bing Unfiltered content can show offending or sexual explicit photos Conteúdo não filtrado pode mostrar fotos ofensivas ou de sexo explícito Edit Bing item Editar item Bing Add Bing item Adicionar item Bing Bing::Item Tags: Rótulos: and e or ou Adult filter: Filtro adulto: Off Desligado Moderate Moderado Strict Rigoroso Buzznet::DialogWidget Search for: Pesquisar: Edit Buzznet item Editar item Bezznet Add Buzznet item Adicionar item Buzznet Buzznet::Item Tag: Rótulo: DeviantArt::DialogWidget Search for: Pesquisar por: Strict Rigoroso Off Desligado Adult filter: Filtro adulto: deviantART item Item deviantART Unfiltered content can show offending or sexual explicit photos Conteúdo não filtrado pode mostrar fotos ofensivas ou de sexo explícito Edit deviantART item Editar item deviantART Add deviantART item Adicionar um item deviantART DeviantArt::Item Tag: Rótulo: Adult filter: Filtro adulto: Off Desligado Strict Rigoroso Exif::InfoDialog EXIF information Informação EXIF Tag Rótulo Value Valor No EXIF information available Nenhuma informação EXIF disponível Files::Core Loading folder... Carregando pasta... Files::LabelPreview No preview available Não há visualização disponível Files::SettingsWidget Select a photo Selecionar uma foto Select a folder Selecionar uma pasta Files Arquivos FilesSettingsWidget Photos Fotos Add a photo Adicionar uma foto Add photos in folder Adicionar fotos na pasta Delete photo Excluir foto Move photo up Mover foto para cima Move photo down Mover foto para baixo Flickr::DialogWidget All of these words Todas essas palavras Any of these words Qualquer uma dessas palavras Search for: Pesquisar: Full text Texto Tags only Apenas rótulos Largest Muito grande Original Original Large Grande Medium Médio Small Pequeno Thumbnail Miniatura Square Quadrado Smallest Muito pequeno Relevance Relevância Size: Tamanho: Order: Ordem: Edit Flickr item Editar componente Flickr Add Flickr item Adicionar um componente Flickr Interestingness desc Interessante desc Date posted desc Data de publicação desc Date taken desc Data de obtenção desc Interestingness asc Interessante asc Date posted asc Data de publicação asc Date taken asc Data de obtenção asc Flickr::Item Text: Texto: Tags: Rótulos: and e or ou Size: Tamanho: Largest Muito grande Original Original Large Grande Medium Médio Small Pequeno Thumbnail Miniatura Square Quadrado Smallest Muito pequeno Order: Ordem: Relevance Relevância Interestingness desc Interessante desc Date posted desc Data de publicação desc Date taken desc Data de obtenção desc Interestingness asc Interessante asc Date posted asc Data de publicação asc Date taken asc Data de obtenção asc Folders::DialogWidget Include subfolders Incluir subpastas Select a folder Selecionar uma pasta Edit folder Editar pasta Add folder Adicionar uma pasta Local Local Remote Remota Folder: Pasta: Passive Passiva Active Ativa Server: Servidor: Port: Porta: Transfer mode: Modo de transferência: Username: Usuário: Password: Senha: Path: Caminho: Folders::LocalItem (with subfolders) (com subpastas) Folders::RemoteItem Transfer mode: Modo de transferência: passive passiva active ativa Folders::SettingsWidget Folders Pastas FoldersSettingsWidget Folders Pastas Add a folder Adicionar uma pasta Delete folder Excluir pasta Google::DialogWidget Search for: Pesquisar por: Strict Rigoroso Moderate Moderado Off Desligado Adult filter: Filtro adulto: Google item Item Google Unfiltered content can show offending or sexual explicit photos Conteúdo não filtrado pode mostrar fotos ofensivas ou de sexo explícito Edit Google item Editar item Google Add Google item Adicionar um item Google Google::Item Text: Texto: Adult filter: Filtro adulto: Off Desligado Moderate Moderado Strict Rigoroso Gui::ColorButton Auto Auto History::Dialog Right-click on items to show options Botão direito do mouse nos itens para mostrar as opções History Histórico Please wait... Por favor, aguarde... Downloading photo... Baixando foto... Abort Abortar Save photo Salvar foto Images (*.png *.xpm *.jpg) Imagens (*.png *.xpm *.jpg) Photo has been saved A foto foi salva There was an error during download Houve um erro durante o download View photo... Ver foto... Get EXIF info... Obter informação EXIF... Save photo... Salvar foto... Set as background Definir como plano de fundo Explore image source Explorar fonte da imagem History::EngineQueryModel All Todas History::PhotosQueryModel Image size: Tamanho da imagem: Engine: Mecanismo: EXIF: EXIF: No Não Yes Sim (no title) (sem título) by: Autor: (no author) (sem autor) Location: Localização: unknown desconhecido Size: Tamanho: Date: Data: History::TagsQueryModel All Todas HttpEngine::SettingsWidget Select a folder Selecionar uma pasta HttpSettingsWidget Photo sets Grupos de fotos Options Opções Save photos Salvar fotos Add a photo set Adicionar um grupo de fotos Delete photo set Excluir grupo de fotos Ipernity::DialogWidget All of these words Todas essas palavras Any of these words Qualquer uma dessas palavras Search for: Pesquisar: Full text Texto Tags only Apenas rótulos Ipernity item Item Ipernity It can show offending or sexual explicit photos Pode mostrar fotos de ofensa ou sexuais explícitas Edit Ipernity item Editar item Ipernity Add Ipernity item Adicionar um item Ipernity Ipernity::Item Text: Texto: and e or ou Tags: Rótulos: Main Error Erro is already running já está em execução Disclaimer Renúncia legal <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>O autor não assume nenhuma responsabilidade sobre o conteúdo dos downloads realizados pelo Wally de fotos compartilhadas em sites.<br>O autor não é de forma alguma responsável por tais conteúdos.</b><br><br>Se isso é um problema para você, por favor, use somente os mecanismos locais como "Arquivos" ou "Pastas".<br>Caso contrário, selecione <b>"Não"</b> para sair de Wally, ou use-o <b>por sua própria conta e risco.</b><br><br>(Se você continuar, esta mensagem aparecerá apenas uma vez)<br><br>Você aceita esta condição? Another instance of Outra instância de Map::View Drag to select. Right-click to zoom Arraste para selecionar. Botão direito do mouse para ampliar Zoom %1x Ampliar %1x Map::Viewer Map viewer Visualizar mapa Panoramio::DialogWidget Select on map Selecinar no mapa Longitude (min): Longitude (mín): Longitude (max): Longitude (máx): Latitude (min): Latitude (mín): Latitude (max): Latitude (máx): Popularity Popularidade Upload date Data de subida Original Original Medium Médio Small Pequeno Thumbnail Miniatura Square Quadrado Mini square Mini quadrado Order: Ordem: Size: Tamanho: Edit Panoramio item Editar item Panoramio Add Panoramio item Adicionar um item Panoramio Error Erro Coordinates must be different Coordenadas devem ser diferentes Panoramio::Item Original Original Medium Médio Small Pequeno Thumbnail Miniatura Square Quadrado Mini square Mini quadrado Popularity Popularidade Upload date Data de subida Longitude: Longitude: Latitude: Latitude: Size: Tamanho: Order: Ordem: lat: lat: lon: lon: Photobucket::DialogWidget Search for: Pesquisar: Photobucket item Item Photobucket It can show offending or sexual explicit photos Pode mostrar fotos de ofensa ou sexuais explícitas Edit Photobucket item Editar item Photobucket Add Photobucket item Adicionar um item Photobucket All of these words Todas essas palavras Any of these words Qualquer uma dessas palavras Photobucket::Item Text: Texto: and e or ou Picasa::DialogWidget Search for: Pesquisar: Edit Picasa item Editar item Picasa Add Picasa item Adicionar um item Picasa Picasa::Item Text: Texto: Pikeo::DialogWidget Search for: Pesquisar: Default Padrão Most viewed Mais vistas Upload date Data de subida Date taken Data de obtenção Group add date Data de inclusão no grupo Comment date Data de comentário Ascending Ascendente Order: Ordem: Edit Pikeo item Editar item Pikeo Add Pikeo item Adicionar um item Pikeo Pikeo::Item Tags: Rótulos: Order: Ordem: Default Padrão Most viewed Mais vistas Upload date Data de subida Date taken Data de obtenção Group add date Data de inclusão no grupo Comment date Data de comentário ascending ascendente descending descendente PositionModel Position Posição Picture smaller than screen on the left, greater than screen on the right Imagem menor da tela à esquerda, maior da tela à direita QColorDialog Hu&e: To&nalidade: &Sat: &Saturação: &Val: &Valor: &Red: Ve&rmelho: &Green: V&erde: Bl&ue: Az&ul: Select Color Selecionar cor &Basic colors Cores &básicas &Custom colors &Cores personalizadas &Add to Custom Colors &Adicionar às cores personalizadas QDialogButtonBox OK OK Cancel Cancelar Reset Reiniciar &Yes &Sim &No &Não Close Fechar &Close &Fechar QFileDialog Directories Diretórios &Open &Abrir &Save &Salvar Open Abrir %1 already exists. Do you want to replace it? %1 já existe. Você deseja substituí-lo? %1 File not found. Please verify the correct file name was given. %1 Arquivo não encontrado. Por favor, verifique se o nome do arquivo foi fornecido corretamente. My Computer Meu computador &Rename &Renomear &Delete &Excluir Show &hidden files Mostrar arquivos &ocultos Back Voltar Parent Directory Diretório acima List View Visualizar lista Detail View Visualizar detalhes Files of type: Arquivos de tipo: Directory: Diretório: %1 Directory not found. Please verify the correct directory name was given. %1 Diretório não encontrado. Por favor, verifique se o nome do diretório foi fornecido corretamente. '%1' is write protected. Do you want to delete it anyway? '%1' está protegido contra escrita. Você deseja excluí-lo de qualquer maneira? Are sure you want to delete '%1'? Tem certeza de que deseja excluir '%1'? Could not delete directory. Não foi possível excluir diretório. Recent Places Locais recentes Save As Salvar como Drive Unidade File Arquivo Unknown Desconhecido Find Directory Localizar diretório Show Mostrar Forward Encaminhar New Folder Nova pasta &New Folder &Nova pasta &Choose Es&colher Remove Remover File &name: &Nome do arquivo: Look in: Olhar dentro: Create New Folder Criar nova pasta QObject All image files Todos os arquivos de imagem files Arquivos Centered Centrado Tiled Mosaico Center Tiled Mosaico centrado Centered Maxpect Escalado centrado Tiled Maxpect Mosaico proporcional Scaled Escalado Centered Auto Fit Auto ajuste centrado Scale & Crop Escalado & recortado Symmetrical Tiled Mosaico simétrico Mirrored Tiled Mosaico espelhado Symmetrical Mirrored Tiled Mosaico espelhado simétrico QProgressDialog Cancel Cancelar SettingsDialog kBytes KBytes MBytes MBytes GBytes GBytes day(s) %ndia %ndias month(s) %nmês %nmeses second(s) %nsegundo %nsegundos minute(s) %nminuto %nminutos hour(s) %nhora %nhoras Set position Definir posição Clear history Limpar histórico Are you sure? Você tem certeza? Settings Configurações General options Opções globais Interval: Intervalo: Border: Borda: Position: Posição: Main Principal Choose in random order Escolher ordem aleatória Switch background on play Mudar plano de fundo ao iniciar Play automatically on application start Ativação automática no início da aplicação Disable splash screen Desativar tela inicial Quit after background change Sair depois da mudança do plano de fundo Start automatically when system starts Início automático quando o sistema iniciar Only use landscape-oriented photos Usar apenas fotos em modo paisagem Rotate images according to EXIF information Rotacionar imagens de acordo com a informação EXIF View info on photo Ver informação sobre a foto View info in system tray tooltip Ver informação na bandeija do sistema Use full desktop area Usar toda a área de trabalho Photo has to be A foto tem que ser independent of independente de at least 1/2 of pelo menos 1/2 de at least 3/4 of pelo menos 3/4 de bigger than muito maior que o desktop's size tamanho da área de trabalho Store images in history for Guardar as imagens histórico Clear Limpar Direct connection Conexão direta Proxy connection Conexão com o proxy Don't save locally remote photos if free disk space goes below Não salva localmente fotos remotas, se o espaço livre em disco está baixo Available modules: Módulos disponíveis: Active modules: Módulos ativos: Network Rede Use system proxy Utilizar configuração de proxy do sistema Use custom proxy Utilizar configuração manual de proxy Port: Porta: Authentication Autenticação Username: Usuário: Password: Senha: Server: Servidor: Changes won't be applied. Are you sure? As alterações não serão aplicadas. Deseja prosseguir? Left Para a esquerda Right Para a direita SmugMug::DialogWidget Search for: Pesquisar: Edit SmugMug item Editar item SmugMug Add SmugMug item Adicionar um item SmugMug SmugMug::Item Text: Texto: SplashScreen Author: Autor: Loading Files module ... Carregando módulo Arquivos ... Loading Folders module ... Carregando módulo Pastas ... Loading Flickr module ... Carregando módulo Flickr ... Loading Yahoo! module ... Carregando módulo Yahoo! ... Loading Panoramio module ... Carregando módulo Panoramio ... Loading Ipernity module ... Carregando módulo Ipernity ... Loading Photobucket module ... Carregando módulo Photobucket ... Loading Buzznet module ... Carregando módulo Buzznet ... Loading Picasa module ... Carregando módulo Picasa ... Loading SmugMug module ... Carregando módulo SmugMug ... Loading Google module ... Carregando módulo Google ... Loading Vladstudio module ... Carregando módulo Vladstudio ... Loading deviantART module ... Carregando módulo deviantART ... Loading settings ... Carregando configurações ... Launching Wally ... Iniciando Wally ... Viewer Right-click on photo to show actions Botão direito do mouse para mostrar as ações Fit to window Ajustar à janela Show full image Mostrar imagem em tela inteira Zoom in Aumentar Zoom out Diminuir Rotate clockwise Rotacionar no sentido horário Rotate c. clockwise Rotacionar no sentido anti-horário Vladstudio::DialogWidget All Todas Abstract art Arte abstrata Creatures Criaturas Illustrations Ilustração Photos Fotos By ID Por ID By view count Ao ver contagem Ascending Ascendente Descending Descendente Category: Categoria: Order: Ordem: Direction: Direção: Edit Vladstudio item Editar item Vladstudio Add Vladstudio item Adicionar um item Vladstudio Vladstudio::Item All categories Todas as cotegorias Abstract art Arte abstrata Creatures Criaturas Illustrations Ilustração Photos Fotos by Id por Id by view count ao ver contagem ascending ascendente descending descendente Wally::Application Cancel Cancelar Play Reproduzir Pause Pausar Next photo Próxima foto Save photo... Salvar foto... Get EXIF info... Obter informação EXIF... Settings... Configurações... Explore source Explorar fonte About... Sobre... History... Histórico... About Qt... Sobre o Qt... Quit Sair English Inglês Italian Italiano Spanish Espanhol German Alemão French Francês Russian Russo Czech Checo Polish Polonês Chinese Chinês Languages Idiomas Catalan Catalão Greek Grego Korean Coreano Hungarian Húngaro Danish Dinamarquês Swedish Sueco Turkish Turco Wally Error Erro do Wally Active Desktop must be disabled Desktop ativo deve ser desabilitado by: Autor: Location: Localização: Engine: Módulo: Save photo Salvar foto Images (*.png *.xpm *.jpg) Imagens (*.png *.xpm *.jpg) Right-click to show main menu Botão direito do mouse para mostrar o menu principal Portuguese (Brazil) Português (Brasil) Yahoo::DialogWidget All of these words Todas essas palavras Any of these words Qualquer uma dessas palavras Search for: Localizar: Filter content Filtrar conteúdo Yahoo! item Item Yahoo! Unfiltered content can show offending or sexual explicit photos Conteúdo não filtrado pode mostrar fotos ofensivas ou de sexo explícito Edit Yahoo! item Editar item Yahoo! Add Yahoo! item Adicionar um item Yahoo! Yahoo::Item Tags: Rótulos: and e or ou content filtered Conteúdo filtrado wally-2.4.4/res/lang/wally_de.ts0000644000000000000000000030564611676624760015266 0ustar rootroot AboutDialog Supported image formats: Unterstützte Formate: About Wally Über Wally Details >> Details >> Compiled with: Kompiliert mit: EXIF library: EXIF Bibliothek: present verfügbar not present nicht verfügbar Polish Polnisch Catalan Katalanisch Greek Griechisch Korean Koreanisch Hungarian Ungarisch Danish Danish Swedish Schwedisch Turkish Türkisch Close Schließen Extension Erweiterung Description Beschreibung Additional info: Weitere Angaben: Language Sprache Translator Übersetzung <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Wechselt den Schreibtischhhintergrund<br />Autor: Antonio Di Monaco (alias <i>Sin(x) '76</i>)<br />Mein Dank an Vincent Willem van Gogh für das Logo :)<br /><br />Internet: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Email <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Italian Italienisch English Englisch Russian Russisch Spanish Spanisch Portuguese (Brazil) Portugiesisch (Brasilianisch) Chinese Chinesisch German Deutsch French Französisch Czech Tschechisch Translations: Übersetzungen: Bing::DialogWidget All of these words Alle diese Wörter Any of these words Eines dieser Wörter Search for: Suche nach: Strict Streng Moderate Mittel Off Aus Adult filter: Jugendschutzfilter: Bing item Bing Eintrag Unfiltered content can show offending or sexual explicit photos Ungefilterte Ergebnisse können sexuell explizite oder beleidigende Darstellungen enthalten Edit Bing item Bing-Eintrag bearbeiten Add Bing item Bing-Eintrag hinzufügen Bing::Item Tags: Markierungen: and und or oder Adult filter: Jugendschutzfilter: Off Aus Moderate Mittel Strict Streng Buzznet::DialogWidget Search for: Suche nach: Edit Buzznet item Buzznet-Eintrag bearbeiten Add Buzznet item Buzznet-Eintrag hinzufügen Buzznet::Item Tag: Markierung: DeviantArt::DialogWidget Search for: Suche nach: Strict Streng Off Aus Adult filter: Jugendschutzfilter: deviantART item deviantART Eintrag Unfiltered content can show offending or sexual explicit photos Ungefilterte Ergebnisse können sexuell explizite oder beleidigende Darstellungen enthalten Edit deviantART item deviantART-Eintrag bearbeiten Add deviantART item deviantART-Eintrag hinzufügen DeviantArt::Item Tag: Markierung: Adult filter: Jugendschutzfilter: Off Aus Strict Streng Exif::InfoDialog EXIF information EXIF Information Tag Markierung Value Wert No EXIF information available Keine EXIF Information vorhanden Files::Core Loading folder... Lade Verzeichnis... Files::LabelPreview No preview available Keine Vorschau vorhanden Files::SettingsWidget Select a photo Bitte wählen Sie ein Bild Select a folder Bitte wählen Sie ein Verzeichnis Files Dateien FilesSettingsWidget Photos Bilder Add a photo Bild hinzufügen Add photos in folder Bilder im Verzeichnis hinzufügen Delete photo Bild entfernen Move photo up Bild nach oben verschieben Move photo down Bild nach unten verschieben Flickr::DialogWidget All of these words Alle diese Wörter Any of these words Eines dieser Wörter Search for: Suche nach: Full text Volltext Tags only Nur Markierungen Largest Am größten Original Original Large Groß Medium Mittel Small Klein Thumbnail Vorschau Square Quadratisch Smallest Am kleinsten Interestingness desc Wichtung absteigend Relevance Relevanz Date posted desc Erscheinungsdatum absteigend Date taken desc Aufnahmedatum absteigend Interestingness asc Wichtung aufsteigend Date posted asc Erscheinungsdatum aufsteigend Date taken asc Erstellungsdatum aufsteigend Size: Größe: Order: Sortierung: Edit Flickr item Flickr-Eintrag bearbeiten Add Flickr item Flickr-Eintrag hinzufügen Flickr::Item Text: Text: Tags: Markierungen: and und or oder Size: Größe: Largest Am größten Original Original Large Groß Medium Mittel Small Klein Thumbnail Vorschau Square Quadratisch Smallest Am kleinsten Order: Sortierung: Interestingness desc Wichtung absteigend Relevance Relevanz Date posted desc Erscheinungsdatum absteigend Date taken desc Aufnahmedatum absteigend Interestingness asc Wichtung aufsteigend Date posted asc Erscheinungsdatum aufsteigend Date taken asc Erstellungsdatum aufsteigend Folders::DialogWidget Include subfolders Unterverzeichnisse einschließen Select a folder Verzeichnis auswählen Edit folder Verzeichnis bearbeiten Add folder Verzeichnis hinzufügen Local Lokal Remote Entfernt Folder: Verzeichnis: Passive Passiv Active Aktiv Server: Server: Port: Port: Transfer mode: Übertragungsmodus: Username: Benutzername: Password: Kennwort: Path: Pfad: Folders::LocalItem (with subfolders) (mit Unterverzeichnissen) Folders::RemoteItem Transfer mode: Übertragungsmodus: passive passiv active aktiv Folders::SettingsWidget Folders Verzeichnisse FoldersSettingsWidget Folders Verzeichnisse Add a folder Verzeichnis hinzufügen Delete folder if the folder is just removed from a list, but not from the hard disc it must be "Ordner entfernen" Verzeichnis löschen Google::DialogWidget Search for: Suche nach: Strict Streng Moderate Mittel Off Aus Adult filter: Jugendschutzfilter: Google item Google-Eintrag Unfiltered content can show offending or sexual explicit photos Ungefilterte Ergebnisse können sexuell explizite oder beleidigende Darstellungen enthalten Edit Google item Google-Eintrag bearbeiten Add Google item Google Eintrag hinzufügen Google::Item Text: Text: Adult filter: Jugendschutzfilter: Off Aus Moderate Mittel Strict Streng Gui::ColorButton Auto Auto History::Dialog Right-click on items to show options Rechts-Klick für Optionen History Historie Please wait... Bitte warten... Downloading photo... Bild wird geladen... Abort Abbrechen Save photo Bild speichern Images (*.png *.xpm *.jpg) Bilder (*.png *.xpm *.jpg) Photo has been saved Bild wurde gespeichert There was an error during download Fehler beim herunterladen View photo... Bild anzeigen... Get EXIF info... EXIF Information... Save photo... Bild speichern... Set as background Als Schreibtischhintergrund setzen Explore image source Bildquelle durchsuchen History::EngineQueryModel All Alle History::PhotosQueryModel Image size: Bildgröße: Engine: not sure if this is the appropriate translation for engine here Modul: EXIF: EXIF: No Nein Yes Ja (no title) (ohne Titel) by: von: (no author) (kein Autor) Location: Ort: unknown unbekannt Size: Größe: Date: Datum: History::TagsQueryModel All Alle HttpEngine::SettingsWidget Select a folder Verzeichnis auswählen HttpSettingsWidget Photo sets Bildergruppen Options Optionen Save photos Bilder speichern Add a photo set Bildergruppe hinzufügen Delete photo set Bildergruppe entfernen Ipernity::DialogWidget All of these words Alle diese Wörter Any of these words Eines dieser Wörter Search for: Suche nach: Full text Volltext Tags only Nur Markierungen Ipernity item Ipernity-Eintrag It can show offending or sexual explicit photos Kann beleidigende oder sexuell explizite Bilder zeigen Edit Ipernity item Ipernity-Eintrag bearbeiten Add Ipernity item Ipernity-Eintrag hinzufügen Ipernity::Item Text: Text: and und or oder Tags: Markierungen: Main Error Fehler is already running wird bereits ausgeführt Disclaimer Haftungsauschluss <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>Der Autor übernimmt keine Verantwortung für Dateien, die Wally aus dem Internet herunterlädt.<br> Der Autor ist in keiner Weise verantwortlich für solche Inhalte.</b><br><br>Wenn das für Sie ein Problem darstellt, benutzen Sie bitte nur lokale Bildquellen (Modul "Dateien" oder "Ordner")<br> Andernfalls wählen Sie bitte <b>"Nein"</b>, um Wally zu beenden, oder verwenden Sie es <b>auf eigene Gefahr</b>.<br><br>(Wenn Sie fortfahren, wird diese Meldung nicht noch einmal angezeigt.)<br><br>Akzeptieren Sie diese Vereinbarung? Another instance of Eine weitere Instanz Map::View Drag to select. Right-click to zoom Auswahl durch Ziehen; Vergrößerung mit Rechts-Klick Zoom %1x Vergrößerung %1x Map::Viewer Map viewer Kartenansicht Panoramio::DialogWidget Select on map Auswählen auf Karte Longitude (min): Longitude (min): Longitude (max): Longitude (max): Latitude (min): Latitude (min): Latitude (max): Latitude (max): Popularity Beliebtheit Upload date Erscheinungsdatum Original Original Medium Mittel Small Klein Thumbnail Vorschau Square Quadratisch Mini square Miniquadrat Order: Sortierung: Size: Größe: Edit Panoramio item Panoramio-Eintrag bearbeiten Add Panoramio item Panoramio-Eintrag hinzufügen Error Fehler Coordinates must be different Koordinaten müssen eine Fläche markieren Panoramio::Item Original Original Medium Mittel Small Klein Thumbnail Vorschau Square Quadratisch Mini square Miniquadrat Popularity Beliebtheit Upload date Erscheinungsdatum Longitude: Longitude: Latitude: Latitude: Size: Größe: Order: Sortierung: lat: Lat: lon: Long: Photobucket::DialogWidget Search for: Suche nach: Photobucket item Photobucket Eintrag It can show offending or sexual explicit photos Kann beleidigende oder sexuell explizite Bilder zeigen Edit Photobucket item Photobucket-Eintrag bearbeiten Add Photobucket item Photobucket-Eintrag hinzufügen All of these words Alle diese Wörter Any of these words Eines dieser Wörter Photobucket::Item Text: Text: and und or oder Picasa::DialogWidget Search for: Suche nach: Edit Picasa item Picasa-Eintrag bearbeiten Add Picasa item Picasa-Eintrag hinzufügen Picasa::Item Text: Text: Pikeo::DialogWidget Search for: Suche nach: Default Standard Most viewed Betrachtungshäufigkeit Upload date Erscheinungsdatum Date taken Aufnahmedatum Group add date Gruppierungsdatum Comment date Kommentardatum Ascending Aufsteigend Order: Sortierung: Edit Pikeo item Pikeo-Eintrag bearbeiten Add Pikeo item Pikeo-Eintrag hinzufügen Pikeo::Item Tags: Markierungen: Order: Sortierung: Default Standard Most viewed Betrachtungshäufigkeit Upload date Erscheinungsdatum Date taken Aufnahmedatum Group add date Gruppierungsdatum Comment date Kommentardatum ascending aufsteigend descending absteigend PositionModel Position Position Picture smaller than screen on the left, greater than screen on the right where can i see this tect in Wally's GUI? Bild kleiner als linker Bildschirm, größer als rechter Bildschirm QColorDialog Hu&e: Farb&ton: &Sat: &Sättigung: &Val: &Helligkeit: &Red: &Rot: &Green: &Grün: Bl&ue: Bla&u: Select Color Farbauswahl &Basic colors Grundfar&ben &Custom colors &Benutzerdefinierte Farben &Add to Custom Colors Zu benutzerdefinierten Farben &hinzufügen QDialogButtonBox OK Ok Cancel Abbrechen Reset Zurücksetzen &Yes &Ja &No Shortcut? &Nein Close Schließen &Close Schl&ießen QFileDialog Directories Verzeichnisse &Open &Öffnen &Save S&peichern Open Öffnen %1 already exists. Do you want to replace it? is %1 a file/folder/link....? Die Datei %1 existiert bereits. Soll sie überschrieben werden? %1 File not found. Please verify the correct file name was given. %1 Die Datei konnte nicht gefunden werden. Stellen Sie sicher, dass der Dateiname richtig ist. My Computer Mein Computer &Rename &Umbenennen &Delete &Löschen Show &hidden files &Versteckte Dateien anzeigen Back Zurück Parent Directory Übergeordnetes Verzeichnis List View Liste Detail View Details Files of type: Dateien des Typs: Directory: Verzeichnis: %1 Directory not found. Please verify the correct directory name was given. %1 Das Verzeichnis konnte nicht gefunden werden. Stellen Sie sicher, dass der Verzeichnisname richtig ist. '%1' is write protected. Do you want to delete it anyway? is %1 a file/folder/link....? '%1' ist schreibgeschützt. Möchten Sie die Datei trotzdem löschen? Are sure you want to delete '%1'? Sind Sie sicher, dass Sie '%1' löschen möchten? Could not delete directory. Konnte Verzeichnis nicht löschen. Recent Places Zuletzt besucht Save As Speichern unter Drive Laufwerk File Datei Unknown Unbekannt Find Directory Verzeichnis suchen Show Anzeigen Forward Vorwärts New Folder Neues Verzeichnis &New Folder &Neues Verzeichnis &Choose &Auswählen Remove Löschen File &name: Datei&name: Look in: Suchen in: Create New Folder Neues Verzeichnis erstellen QObject All image files Alle Bilddateien files Dateien Centered Zentriert Tiled Gekachelt Center Tiled Zentriert gekachelt Centered Maxpect Zentriert maximale Größe Tiled Maxpect Gekachelt maximale Größe Scaled Skaliert Centered Auto Fit Zentriert automatisch Scale & Crop Skaliert und beschnitten Symmetrical Tiled Symmetrisch gekachelt Mirrored Tiled Gespiegelt gekachelt Symmetrical Mirrored Tiled Symmetrisch gespiegelt gekachelt QProgressDialog Cancel Abbrechen SettingsDialog kBytes kByte MBytes MByte GBytes GByte day(s) Tag Tage month(s) Monat Monate second(s) Sekunde Sekunden minute(s) Minute Minuten hour(s) Stunde Stunden Set position Position auswählen Clear history Historie löschen Are you sure? Sind sie sicher? Settings Einstellungen General options Allgemeine Optionen Interval: Intervall: Border: Rahmen: Position: Position: Main Einstellungen Choose in random order Auswahl in zufälliger Reihenfolge Switch background on play Automatisches Abspielen wechselt zum nächsten Bild Play automatically on application start Automatisches Abspielen bei Programmstart Disable splash screen Kein Startfenster anzeigen Quit after background change Nach Bildwechsel beenden Start automatically when system starts Zu Startobjekten hinzufügen Only use landscape-oriented photos Nur Bilder im Querformat benutzen Rotate images according to EXIF information Bilder gemäß EXIF-Information drehen View info on photo Bildinformation anzeigen View info in system tray tooltip Information als Tooltip anzeigen Use full desktop area Gesamten Schreibtisch benutzen Photo has to be Bildgröße ist independent of unabhängig von der at least 1/2 of mindestens 1/2 der at least 3/4 of mindestens 3/4 der bigger than größer als desktop's size Schreibtischgröße Store images in history for Bilder in Historie speichern Clear Leeren Direct connection Direkte Verbindung Proxy connection Verbindung über Proxy Don't save locally remote photos if free disk space goes below Bilder nicht lokal speichern falls Restspeicher geringer als Available modules: Verfügbare Module: Active modules: Aktive Module: Network Netzwerk Use system proxy Proxy-Einstellungen des Systems Use custom proxy Eigener Proxy Port: Port: Authentication Kennwort für den Proxy erforderlich: Username: Benutzername: Password: Kennwort: Server: Server: Changes won't be applied. Are you sure? Die Änderungen werden nicht angewendet. Sind Sie sicher? Left Links Right Rechts SmugMug::DialogWidget Search for: Suche nach: Edit SmugMug item SmugMug-Eintrag bearbeiten Add SmugMug item SmugMug-Eintrag hinzufügen SmugMug::Item Text: Text: SplashScreen Author: Autor: Loading Files module ... Lade Dateien Modul ... Loading Folders module ... Lade Verzeichnis Modul ... Loading Flickr module ... Lade Flickr Modul ... Loading Yahoo! module ... Lade Yahoo! Modul ... Loading Panoramio module ... Lade Panoramio Modul ... Loading Ipernity module ... Lade Ipernity Modul ... Loading Photobucket module ... Lade Photobucket Modul ... Loading Buzznet module ... Lade Buzznet Modul ... Loading Picasa module ... Lade Picasa Modul ... Loading SmugMug module ... Lade SmugMug Modul ... Loading Google module ... Lade Google Modul ... Loading Vladstudio module ... Lade Vladstudio Modul ... Loading deviantART module ... Lade deviantART Modul ... Loading settings ... Lade Voreinstellungen ... Launching Wally ... Starte Wally ... Viewer Right-click on photo to show actions Rechts-Klick für Aktionen Fit to window An Fenstergröße anpassen Show full image Vollbild anzeigen Zoom in Vergrößern Zoom out Verkleinern Rotate clockwise Im Uhrzeigersinn drehen Rotate c. clockwise Gegen den Uhrzeigersinn drehen Vladstudio::DialogWidget All Alle Abstract art Abstrakte Kunst Creatures Tiere Illustrations Illustrationen Photos Bilder By ID Nach ID By view count Nach Betrachterzähler Ascending Aufsteigend Descending Absteigend Category: Kategorie: Order: Sortierung: Direction: Richtung: Edit Vladstudio item Vladstudio-Eintrag bearbeiten Add Vladstudio item Vladstudio-Eintrag hinzufügen Vladstudio::Item All categories Alle Kategorien Abstract art Abstrakte Kunst Creatures Tiere Illustrations Illustrationen Photos Bilder by Id nach ID by view count Nach Betrachterzähler ascending aufsteigend descending absteigend Wally::Application Cancel Abbrechen Play Abspielen Pause Pause Next photo Nächstes Bild Save photo... Bild speichern... Get EXIF info... EXIF Information... Settings... Einstellungen... Explore source Quelle durchsuchen About... Über Wally... History... Historie... About Qt... Über Qt... Quit Beenden English Englisch Italian Italienisch Spanish Spanisch German Deutsch French Französisch Russian Russisch Czech Tschechisch Polish Polnisch Chinese Chinesisch Languages IMHO this should be singular in English too Sprache Catalan Katalanisch Greek Griechisch Korean Koreanisch Hungarian Ungarisch Danish Danish Swedish Schwedisch Turkish Türkisch Wally Error Wally Fehler Active Desktop must be disabled Active Desktop muss deaktivert sein by: von: Location: Ort: Engine: Modul: Save photo Bild speichern Images (*.png *.xpm *.jpg) Bilder (*.png *.xpm *.jpg) Right-click to show main menu Rechts-Klick für Hauptmenu Portuguese (Brazil) Portugiesisch (Brasilianisch) Yahoo::DialogWidget All of these words Alle diese Wörter Any of these words Eines dieser Wörter Search for: Suche nach: Filter content Ergebnisse filtern Yahoo! item Yahoo!-Eintrag Unfiltered content can show offending or sexual explicit photos Ungefilterte Ergebnisse können sexuell explizite oder beleidigende Darstellungen enthalten Edit Yahoo! item Yahoo!-Eintrag bearbeiten Add Yahoo! item Yahoo! Eintrag hinzufügen Yahoo::Item Tags: Markierungen: and und or oder content filtered Inhalt gefiltert wally-2.4.4/res/lang/wally_kr.ts0000644000000000000000000030405411676624760015302 0ustar rootroot AboutDialog Compiled with: Qt 버전: EXIF library: EXIF 모듈: present 있음 not present 없음 English Italian Russian Spanish Portuguese (Brazil) German French Czech Chinese Polish Catalan Greek Korean 한국어 Hungarian 헝가리어 Danish 덴마크어 Swedish 스웨덴어 Turkish 터키어 About Wally Wally에 대하여 <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Qt4 바탕 화면 교체기<br />제작자: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />로고에 대하여 Vincent Willem van Gogh에게 감사합니다 :)<br /><br />홈페이지: <a href="http://www.becrux.com">http://www.becrux.com</a><br />연락처: <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Details >> 자세히 >> Close 닫기 Extension 확장자 Description 설명 Supported image formats: 지원되는 이미지 형식: Additional info: 추가 정보: Language 언어 Translator 번역자 Translations: 번역: Bing::DialogWidget All of these words 모든 단어 포함 Any of these words 일부 단어 포함 Search for: 찾기: Strict 엄격 Moderate 적당 Off 끄기 Adult filter: 성인물 필터: Bing item Bing 항목 Unfiltered content can show offending or sexual explicit photos 필터되지 않은 내용은 불쾌하거나 성적으로 노골적인 사진이 보일 수 있습니다. Edit Bing item Bing 항목 편집 Add Bing item Bing 항목 추가 Bing::Item Tags: 태그: and 그리고 or 또는 Adult filter: 성인물 필터: Off 끄기 Moderate 적당 Strict 엄격 Buzznet::DialogWidget Search for: 찾기: Edit Buzznet item Buzznet 항목 편집 Add Buzznet item Buzznet 항목 추가 Buzznet::Item Tag: 태그: DeviantArt::DialogWidget Search for: 찾기: Strict 엄격 Off 끄기 Adult filter: 성인물 필터: deviantART item deviantART 항목 Unfiltered content can show offending or sexual explicit photos 필터되지 않은 내용은 불쾌하거나 성적으로 노골적인 사진이 보일 수 있습니다 Edit deviantART item deviantART 항목 편집 Add deviantART item deviantART 항목 추가 DeviantArt::Item Tag: 태그: Adult filter: 성인물 필터: Off 끄기 Strict 엄격 Exif::InfoDialog EXIF information EXIF 정보 Tag 태그 Value No EXIF information available EXIF 정보 없음 Files::Core Loading folder... 폴더 읽는 중... Files::LabelPreview No preview available 미리보기 없음 Files::SettingsWidget Files 파일 Select a photo 사진 선택 Select a folder 폴더 선택 FilesSettingsWidget Photos 사진 Add a photo 사진 추가 Add photos in folder 폴더에 있는 사진 추가 Delete photo 사진 삭제 Move photo up 위로 이동 Move photo down 아래로 이동 Flickr::DialogWidget All of these words 모든 단어 포함 Any of these words 일부 단어 포함 Search for: 찾기: Full text 전체 텍스트 검색 Tags only 태그에서만 검색 Largest 가장 큰 크기 Original 원래 크기 Large 큰 크기 Medium 중간 크기 Small 작은 크기 Thumbnail 썸내일 Square 정사각형 Smallest 가장 작은 크기 Interestingness desc 관심순 내림차순 Relevance 관련성 Date posted desc 올린 일시순 내림차순 Date taken desc 찍은 일시순 내림차순 Interestingness asc 관심순 올림차순 Date posted asc 올린 일시순 올림차순 Date taken asc 찍은 일시순 올림차순 Size: 크기: Order: 정렬: Edit Flickr item Flickr 항목 편집 Add Flickr item Flickr 항목 추가 Flickr::Item Text: 검색어: Tags: 태그: and 그리고 or 또는 Size: 크기: Largest 가장 큰 크기 Original 원래 크기 Large 큰 크기 Medium 중간 크기 Small 작은 크기 Thumbnail 썸내일 Square 정사각형 Smallest 가장 작은 크기 Order: 정렬: Interestingness desc 관심순 내림차순 Relevance 관련성 Date posted desc 올린 일시순 내림차순 Date taken desc 찍은 일시순 내림차순 Interestingness asc 관심순 올림차순 Date posted asc 올린 일시순 올림차순 Date taken asc 찍은 일시순 올림차순 Folders::DialogWidget Local 로컬 Remote 원격 Include subfolders 하위폴더 포함 Folder: 폴더: Passive Active Server: 서버: Port: 포트: Transfer mode: 전송 방식: Username: 계정: Password: 암호: Path: 경로: Select a folder 폴더 선택 Edit folder 폴더 편집 Add folder 폴더 추가 Folders::LocalItem (with subfolders) (하위폴더 포함) Folders::RemoteItem Transfer mode: 전송 방식: passive active Folders::SettingsWidget Folders 폴더 FoldersSettingsWidget Folders 폴더 Add a folder 폴더 추가 Delete folder 폴더 삭제 Google::DialogWidget Search for: 찾기: Strict 엄격 Moderate 적당 Off 끄기 Adult filter: 성인물 필터: Google item Google 항목 Unfiltered content can show offending or sexual explicit photos 필터되지 않은 내용은 불쾌하거나 성적으로 노골적인 사진이 보일 수 있습니다. Edit Google item Google 항목 편집 Add Google item Google 항목 추가 Google::Item Text: 검색어: Adult filter: 성인물 필터: Off 끄기 Moderate 적당 Strict 엄격 Gui::ColorButton Auto 자동 History::Dialog Right-click on items to show options 옵션을 보려면 항목에 오른클릭을 하세요. History 기록 Please wait... 기다려 주세요... Downloading photo... 사진 받는 중... Abort 그만 두기 Save photo 사진 저장 Images (*.png *.xpm *.jpg) 사진 (*.png *.xpm *.jpg) Photo has been saved 사진이 저장되었습니다. There was an error during download 받아오는 중 오류가 발생하였습니다. View photo... 사진 보기... Get EXIF info... EXIF 정보 보기... Save photo... 사진 저장... Set as background 바탕 화면으로 지정 Explore image source 원본 보기 History::EngineQueryModel All 모두 History::PhotosQueryModel (no title) (제목 없음) by: 올린 이: (no author) (저자 없음) Date: 시각: Location: 위치: unknown 알 수 없음 Size: 크기: Image size: 사진 크기: Engine: 엔진: EXIF: No 없음 Yes 있음 History::TagsQueryModel All 모두 HttpEngine::SettingsWidget Select a folder 폴더 선택 HttpSettingsWidget Photo sets 사진 모음 Add a photo set 사진 모음 추가 Delete photo set 사진 모음 삭제 Options 설정 Save photos 사진 저장 Ipernity::DialogWidget All of these words 모든 단어 포함 Any of these words 일부 단어 포함 Search for: 찾기: Full text 전체 텍스트 검색 Tags only 태그에서만 검색 Ipernity item Ipernity 항목 It can show offending or sexual explicit photos 불쾌하거나 성적으로 노골적인 사진이 보여질 수 있습니다. Edit Ipernity item Ipernity 항목 편집 Add Ipernity item Ipernity 항목 추가 Ipernity::Item Text: 검색어: and 그리고 or 또는 Tags: 태그: Main Error 오류 Another instance of 이미 is already running 가 실행 중입니다. Disclaimer 책임 부인 <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>제작자는 Wally가 인터넷에 공유된 사진을 받아온 내용에 대하여 책임을 지지 않습니다.<br>제작자는 그런 내용에 대하여 책임질 방법이 없습니다.</b><br><br>만약 이것이 문제가 된다면, "파일"이나 "폴더"같은 로컬 엔진을 사용하십시오.<br>아니면, <b>"아니오"</b>를 선택하여 Wally를 종료하거나, <b>사용자 스스로의 책임으로</b> 사용하십시오.<br><br>(계속 진행한다면, 이 메세지는 이번에만 보입니다.)<br><br>위 조건에 동의하십니까? Map::View Drag to select. Right-click to zoom 드래그하여 영역을 선택하세요. 오른클릭하여 확대할 수 있습니다. Zoom %1x %1배 확대 Map::Viewer Map viewer 지도 보기 Panoramio::DialogWidget Select on map 지도 선택 Longitude (min): 경도 (최소): Longitude (max): 경도 (최대): Latitude (min): 위도 (최소): Latitude (max): 위도 (최대): Popularity 인기도 Upload date 올린 일시 Original 원래 크기 Medium 중간 크기 Small 작은 크기 Thumbnail 썸내일 Square 정사각형 Mini square 작은 정사각형 Order: 정렬: Size: 크기: Edit Panoramio item Panoramio 항목 편집 Add Panoramio item Panoramio 항목 추가 Error 오류 Coordinates must be different 좌표가 달라야 합니다. Panoramio::Item lat: 위도: lon: 경도: Original 원래 크기 Medium 중간 크기 Small 작은 크기 Thumbnail 썸내일 Square 정사각형 Mini square 작은 정사각형 Popularity 인기 Upload date 올린 일시 Longitude: 경도: Latitude: 위도: Size: 크기: Order: 정렬: Photobucket::DialogWidget All of these words 모든 단어 포함 Any of these words 일부 단어 포함 Search for: 찾기: Photobucket item Photobucket 항목 It can show offending or sexual explicit photos 불쾌하거나 성적으로 노골적인 사진이 보여질 수 있습니다. Edit Photobucket item Photobucket 항목 편집 Add Photobucket item Photobucket 항목 추가 Photobucket::Item Text: 검색어: and 그리고 or 또는 Picasa::DialogWidget Search for: 찾기: Edit Picasa item Picasa 항목 편집 Add Picasa item Picasa 항목 추가 Picasa::Item Text: 검색어: Pikeo::DialogWidget Search for: 찾기: Default 기본 Most viewed 가장 많이 본 사진 Upload date 올린 일시 Date taken 찍은 일시 Group add date 그룹 추가 일시 Comment date 댓글 일시 Ascending 올림차순 Order: 정렬: Edit Pikeo item Pikeo 항목 편집 Add Pikeo item Pikeo 항목 삭제 Pikeo::Item Tags: 태그: Order: 정렬: Default 기본 Most viewed 가장 많이 본 사진 Upload date 올린 일시 Date taken 찍은 일시 Group add date 그룹 추가 일시 Comment date 댓글 일시 ascending 올림차순 descending 내림차순 PositionModel Position 위치 Picture smaller than screen on the left, greater than screen on the right 왼쪽은 화면보다 작은 사진, 오른쪽은 화면보다 큰 사진 QColorDialog Hu&e: &Sat: &Val: &Red: &Green: Bl&ue: Select Color 색상 선택 &Basic colors 기본 색상(&B) &Custom colors 사용자 색상(&C) &Add to Custom Colors 사용자 색상에 추가(&A) QDialogButtonBox OK 확인 Cancel 취소 Reset 초기화 &Yes 예(&Y) &No 아니오(&N) Close 닫기 &Close 닫기(&C) QFileDialog Directories 디렉터리 &Open 열기(&O) &Save 저장(&S) Open 열기 %1 already exists. Do you want to replace it? %1 파일이 이미 존재합니다. 교체하시겠습니까? %1 File not found. Please verify the correct file name was given. %1 파일을 찾을 수 없습니다. 파일 이름이 정확한 지 확인해 주세요. My Computer 내 컴퓨터 &Rename 이름 바꾸기(&R) &Delete 삭제(&D) Show &hidden files 숨겨진 파일 보이기(&H) Back 뒤로 Parent Directory 상위 디렉터리 List View 목록 보기 Detail View 자세히 보기 Files of type: 파일 형식: Directory: 디렉터리: %1 Directory not found. Please verify the correct directory name was given. %1 디렉터리를 찾을 수 없습니다. 디렉터리 이름이 정확한 지 확인해 주세요. '%1' is write protected. Do you want to delete it anyway? '%1' 파일은 쓰기 보호되어 있습니다. 그래도 삭제하시겠습니까? Are sure you want to delete '%1'? '%1' 파일 또는 디렉터리를 삭제하시겠습니까? Could not delete directory. 디렉터리를 지울 수 없습니다. Recent Places 최근 Save As 다른 이름으로 저장 Drive 드라이브 File 파일 Unknown 알 수 없음 Find Directory 디렉터리 찾기 Show 보이기 Forward 앞으로 New Folder 새 폴더 &New Folder 새 폴더(&N) &Choose 선택(&C) Remove 제거 File &name: 파일 이름(&N): Look in: 탐색: Create New Folder 새 폴더 만들기 QObject All image files 모든 사진 파일 files 파일 Centered 중앙 Tiled 타일 Center Tiled 가운데 중심으로 타일 Centered Maxpect 중앙 최대 Tiled Maxpect 타일 최대 Scaled 화면 크기에 맞추기 Centered Auto Fit 자동으로 맞춰진 중앙 Scale & Crop 확대 & 자르기 Symmetrical Tiled 대칭된 타일 Mirrored Tiled 반사된 타일 Symmetrical Mirrored Tiled 대칭 반사된 타일 QProgressDialog Cancel 취소 SettingsDialog Settings 설정 Left 왼쪽 Right 오른쪽 kBytes MBytes GBytes day(s) month(s) 개월 second(s) minute(s) hour(s) 시간 Set position 위치 설정 Changes won't be applied. Are you sure? 변경 사항이 적용되지 않습니다. 계속 하시겠습니까? Clear history 기록 삭제 Are you sure? 계속 하시겠습니까? General options 일반 설정 Interval: 간격: Border: 테두리: Position: 위치: Main 일반 Choose in random order 무작위 순서로 선택 Switch background on play 재생 시작할 때 배경 화면 바꾸기 Play automatically on application start 프로그램이 시작할 때 자동으로 재생 Disable splash screen 시작 화면 감추기 Quit after background change 배경 화면 바꾼 후 끝내기 Start automatically when system starts 컴퓨터를 켤 때 자동으로 시작 Only use landscape-oriented photos 가로 사진만 사용 Rotate images according to EXIF information EXIF 정보에 대응하여 사진 회전 View info on photo 사진 정보 보기 View info in system tray tooltip 시스템 알림의 툴팁으로 사진 정보 보기 Use full desktop area 전체 바탕화면 영역 사용 Photo has to be 바탕 화면 크기에 대하여 independent of 상관없는 at least 1/2 of 최소 1/2 at least 3/4 of 최소 3/4 bigger than 더 큰 desktop's size 크기의 사진 Don't save locally remote photos if free disk space goes below 다음 크기보다 남은 디스크 용량이 작으면 사진을 저장하지 않음: Store images in history for 사진 기록을 보관할 기간: Clear 삭제 Available modules: 사용 가능한 모듈: Active modules: 사용 중인 모듈: Network 네트웍 Direct connection 직접 연결 Proxy connection 프록시 연결 Use system proxy 시스템 프록시 사용 Use custom proxy 프록시 직접 설정 Server: 서버: Port: 포트: Authentication 인증 Username: 계정: Password: 암호: SmugMug::DialogWidget Search for: 찾기: Edit SmugMug item SmugMug 항목 편집 Add SmugMug item SmugMug 항목 추가 SmugMug::Item Text: 검색어: SplashScreen Loading Files module ... 파일 모듈 불러오는 중... Loading Folders module ... 폴더 모듈 불러오는 중... Loading Flickr module ... Flickr 모듈 불러오는 중... Loading Yahoo! module ... Yahoo! 모듈 불러오는 중... Loading Panoramio module ... Panoramio 모듈 불러오는 중... Loading Ipernity module ... Ipernity 모듈 불러오는 중... Loading Photobucket module ... Photobucket 모듈 불러오는 중... Loading Buzznet module ... Buzznet 모듈 불러오는 중... Loading Picasa module ... Picasa 모듈 불러오는 중... Loading SmugMug module ... SmugMug 모듈 불러오는 중... Loading Google module ... Google 모듈 불러오는 중... Loading Vladstudio module ... Vladstudio 모듈 불러오는 중... Loading deviantART module ... deviantART 모듈 불러오는 중... Loading settings ... 설정 불러오는 중... Launching Wally ... Wally 시작하는 중... Author: 제작자: Viewer Right-click on photo to show actions 옵션을 보려면 항목에 오른클릭을 하세요. Fit to window 창에 맞추기 Show full image 원래 크기로 보기 Zoom in 확대 Zoom out 축소 Rotate clockwise 오른쪽으로 돌리기 Rotate c. clockwise 왼쪽으로 돌리기 Vladstudio::DialogWidget All 모두 Abstract art 추상 미술 Creatures 생물 Illustrations 삽화 Photos 사진 By ID ID 순 By view count 많이 본 순 Ascending 올림차순 Descending 내림차순 Category: 범주: Order: 정렬: Direction: 방향: Edit Vladstudio item Vladstudio 항목 편집 Add Vladstudio item Vladstudio 항목 추가 Vladstudio::Item All categories 모든 범주 Abstract art 추상 미술 Creatures 생물 Illustrations 삽화 Photos 사진 by Id ID 순 by view count 많이 본 순 ascending 올림차순 descending 내림차순 Wally::Application Cancel 취소 Play 재생 Pause 멈춤 Next photo 다음 사진 Save photo... 사진 저장... Get EXIF info... EXIF 정보 보기... Settings... 설정... Explore source 원본 보기 About... 정보... History... 기록... About Qt... Qt에 대하여... Quit 끝내기 Languages 언어 English 영어 Italian 이탈리아어 Spanish 스페인어 German 독일어 French 프랑스어 Russian 러시아어 Portuguese (Brazil) 포르투갈어 Czech 체코어 Polish 폴란드어 Chinese 중국어 Catalan 카탈로니아어 Greek 그리스어 Korean 한국어 Hungarian 헝가리어 Danish 덴마크어 Swedish 스웨덴어 Turkish 터키어 Wally Error Wally 오류 Active Desktop must be disabled 액티브 데스크탑이 비활성화 되어야 합니다. by: 올린 이: Location: 위치: Engine: 엔진: Save photo 사진 저장 Images (*.png *.xpm *.jpg) 사진 (*.png *.xpm *.jpg) Right-click to show main menu 메뉴를 보려면 항목에 오른클릭을 하세요. Yahoo::DialogWidget All of these words 모든 단어 포함 Any of these words 일부 단어 포함 Search for: 찾기: Filter content 성인물 필터 Yahoo! item Yahoo! 항목 Unfiltered content can show offending or sexual explicit photos 필터되지 않은 내용은 불쾌하거나 성적으로 노골적인 사진이 보일 수 있습니다. Edit Yahoo! item Yahoo! 항목 편집 Add Yahoo! item Yahoo! 항목 추가 Yahoo::Item Tags: 태그: and 그리고 or 또는 content filtered 성인물 필터됨 wally-2.4.4/res/lang/wally_zh_CN.ts0000644000000000000000000030104011676624760015657 0ustar rootroot AboutDialog Compiled with: 编译: EXIF library: EXIF 库: present 存在 not present 不存在 English 英语 Italian 意大利语 Russian 俄语 Spanish 西班牙语 Portuguese (Brazil) 葡萄牙语(巴西) Polish 波兰文 Catalan 加泰罗尼亚语 Greek 希腊 Korean 韩语 Hungarian 匈牙利 Danish 丹麦的 Swedish 瑞典语 Turkish 土耳其 Chinese 汉语 German 德语 French 法语 Czech 捷克语 About Wally 关于 Wally <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Is Qt4 desktop wallpaper untranslatable? %Done <html><head></head><body><font size="+1">Qt4 桌面墙纸变换器<br />作者: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />我非常感谢 Vincent Willem van Gogh 制作了Logo:)<br /><br />网站: <a href="http://www.becrux.com">http://www.becrux.com</a><br />与我联系: <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Details >> 详细信息 >> Close 关闭 Extension 扩展名 Description 描述 Supported image formats: 支持的图像格式: Additional info: 其它信息: Language 语言 Translator 译者 Translations: 翻译: Bing::DialogWidget All of these words 全部关键词 Any of these words 任意关键词 Search for: 搜索: Strict 精确 Moderate 中等 Off 关闭 Adult filter: 成人内容过滤: Bing item Bing 项目 Unfiltered content can show offending or sexual explicit photos 未过滤的内容可能会显示冒犯或性相关照片 Edit Bing item 编辑 Bing 项目 Add Bing item 增加 Bing 项目 Bing::Item Tags: 标签: and 并且 or 或者 Adult filter: 成人内容过滤: Off 关闭 Moderate 中等 Strict 精确 Buzznet::DialogWidget Search for: 搜索: Edit Buzznet item 编辑 Buzznet 项目 Add Buzznet item 增加 Buzznet 项目 Buzznet::Item Tag: 标签: DeviantArt::DialogWidget Search for: 搜索: Strict 精确 Off 关闭 Adult filter: 成人内容过滤: deviantART item deviantART 项目 Unfiltered content can show offending or sexual explicit photos 未过滤的内容可能会显示冒犯或性相关照片 Edit deviantART item 编辑 deviantART 项目 Add deviantART item 增加 deviantART 项目 DeviantArt::Item Tag: 标签: Adult filter: 成人内容过滤: Off 关闭 Strict 精确 Exif::InfoDialog EXIF information EXIF 信息 Tag 标签 Value No EXIF information available 没有可用的 EXIF 信息 Files::Core Loading folder... 正在加载文件夹... Files::LabelPreview No preview available 没有可用的预料 Files::SettingsWidget Files 文件 Select a photo 选择图片 Select a folder 选择文件夹 FilesSettingsWidget Photos 图片 Add a photo 添加图片 Add photos in folder 在文件夹中添加图片 Delete photo 删除图片 Move photo up 上移图片 Move photo down 下移图片 Flickr::DialogWidget All of these words 全部关键词 Any of these words 任意关键词 Search for: 搜索: Full text 全文 Tags only 仅标签 Largest 最大的图 Original 原图 Large 大图 Medium 中图 Small 小图 Thumbnail 缩略图 Square 正方形 Smallest 最小的图 Interestingness desc 兴趣度降序 Relevance 相关性 Date posted desc 发布日期降序 Date taken desc 拍摄日期降序 Interestingness asc 兴趣度升序 Date posted asc 发布日期升序 Date taken asc 拍摄日期升序 Size: 大小: Order: 排序: Edit Flickr item 编辑 Flickr 项目 Add Flickr item 添加 Flickr 项目 Flickr::Item Text: 文本: Tags: 标签: and 并且 or 或者 Size: 大小: Largest 最大的图 Original 原图 Large 大图 Medium 中图 Small 小图 Thumbnail 缩略图 Square 正方形 Smallest 最小的图 Order: 排序: Interestingness desc 兴趣度降序 Relevance 相关性 Date posted desc 发布日期降序 Date taken desc 拍摄日期降序 Interestingness asc 兴趣度升序 Date posted asc 发布日期升序 Date taken asc 拍摄日期升序 Folders::DialogWidget Local 本地 Remote 远程 Include subfolders 包含子文件夹 Folder: 文件夹: Passive 被动 Active 主动 Server: 服务器: Port: 端口: Transfer mode: 传输方式: Username: 用户名: Password: 密码: Path: 路径: Select a folder 选择文件夹 Edit folder 编辑文件夹 Add folder 添加文件夹 Folders::LocalItem (with subfolders) (包含子文件夹) Folders::RemoteItem Transfer mode: 传输方式: passive 被动 active 主动 Folders::SettingsWidget Folders 文件夹 FoldersSettingsWidget Folders 文件夹 Add a folder 添加文件夹 Delete folder 删除文件夹 Google::DialogWidget Search for: 搜索: Strict 精确 Moderate 中等 Off 关闭 Adult filter: 成人内容过滤: Google item Google 项目 Unfiltered content can show offending or sexual explicit photos 未过滤的内容可能会显示冒犯或性相关照片 Edit Google item 编辑 Google 项目 Add Google item 添加 Google 项目 Google::Item Text: 文本: Adult filter: 成人内容过滤: Off 关闭 Moderate 中等 Strict 精确 Gui::ColorButton Auto 自动 History::Dialog Right-click on items to show options 右键点击显示选项 History 历史记录 Please wait... 请稍等... Downloading photo... 下载图片中... Abort 中止 Save photo 保存图片 Images (*.png *.xpm *.jpg) 图片格式 (*.png *.xpm *.jpg) Photo has been saved 图片已保存 There was an error during download 下载时出现错误 View photo... 查看图片... Get EXIF info... 获取 EXIF信息... Save photo... 保存图片... Set as background 设置为墙纸 Explore image source 浏览图片原件 History::EngineQueryModel All 全部 History::PhotosQueryModel (no title) (无标题) by: 通过: (no author) (无作者) Date: 日期: Location: 地点: unknown 不知道 Size: 大小: Image size: 图片大小: Engine: 引擎: EXIF: EXIF: No 取消 Yes 确定 History::TagsQueryModel All 全部 HttpEngine::SettingsWidget Select a folder 选择文件夹 HttpSettingsWidget Photo sets 图片设置 Add a photo set 添加图片设置 Delete photo set 删除图片设置 Options 选项 Save photos 保存图片 Ipernity::DialogWidget All of these words 全部关键词 Any of these words 任意关键词 Search for: 搜索: Full text Is it the same in your language? % it is one of those words which are overtaken from English , we do not have a translation for it 全文 Tags only 仅标签 Ipernity item Ipernity 项目 It can show offending or sexual explicit photos 它可能显示明显的触犯或者性的照片 Edit Ipernity item 编辑 Ipernity 项目 Add Ipernity item 增加 Ipernity 项目 Ipernity::Item Text: 文本: and 并且 or 或者 Tags: 标签: Main Error 错误 is already running 已运行 Disclaimer 不承诺 <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>作者不承担Wally从照片分享网站下载的内容的责任。<br>作者绝不负责任何如此内容。</b><br><br>如果您不同意,请使用本地内容,像本地"文件"或"本地文件夹"。<br>否则,请选择 <b>"No"</b> 退出Wally,或者使用它并自己承担责任。</b><br><br>(如果您要继续,此消息将出现一次)<br><br>你是否接受上述条件? Another instance of 另一个实例 Map::View Drag to select. Right-click to zoom 拖拽选择,左键放大 Zoom %1x 放大 %1x Map::Viewer Map viewer 地图浏览 Panoramio::DialogWidget Select on map 在地图上选择 Longitude (min): 经度 (小): Longitude (max): 经度 (大): Latitude (min): 维度 (小): Latitude (max): 维度(大): Popularity 人气 Upload date 上传日期 Original 原图 Medium 中图 Small 小图 Thumbnail 缩略图 Square 正方形 Mini square 小正方形 Order: 排序: Size: 大小: Edit Panoramio item 编辑 Panoramio 项目 Add Panoramio item 增加 Panoramio 项目 Error 错误 Coordinates must be different 必须在不同的坐标 Panoramio::Item lat: 纬度: lon: 经度: Original 原图 Medium 中图 Small 小图 Thumbnail 缩略图 Square 正方形 Mini square 小正方形 Popularity 人气 Upload date 上传日期 Longitude: 经度: Latitude: 纬度: Size: 大小: Order: 排序: Photobucket::DialogWidget All of these words 全部关键词 Any of these words 任意关键词 Search for: 搜索: Photobucket item Photobucket 项目 It can show offending or sexual explicit photos 它可能显示明显的触犯或者性的照片 Edit Photobucket item 编辑 Photobucket 项目 Add Photobucket item 增加 Photobucket 项目 Photobucket::Item Text: 文本: and 并且 or 或者 Picasa::DialogWidget Search for: 搜索: Edit Picasa item Editovat položku Picasa Add Picasa item Přidat položku Picasa Picasa::Item Text: 文本: Pikeo::DialogWidget Search for: 搜索: Default 默认值 Most viewed 浏览之最 Upload date 上传日期 Date taken 拍摄日期 Group add date 组添加日期 Comment date 注释日期 Ascending 升序 Order: 排序: Edit Pikeo item 编辑 Pikeo 项目 Add Pikeo item 添加 Pikeo 项目 Pikeo::Item Tags: 标签: Order: 排序: Default 默认值 Most viewed 浏览之最 Upload date 上传日期 Date taken 拍摄日期 Group add date 组添加日期 Comment date 注释日期 ascending 升序 descending 降序 PositionModel Position 地点 Picture smaller than screen on the left, greater than screen on the right 图片比屏幕左侧小,比屏幕右侧大 QColorDialog Hu&e: 色调(&E): &Sat: 饱和度(&S): &Val: 亮度(&V): &Red: 红(&R): &Green: 绿(&G): Bl&ue: 蓝(&B): Select Color 选择颜色 &Basic colors 基本颜色(&B) &Custom colors 自定义颜色(&C) &Add to Custom Colors 添加到自定义颜色(&A) QDialogButtonBox OK 确定 Cancel 取消 Reset 重置 &Yes 确定(&Y) &No 取消(&N) Close 关闭 &Close 关闭(&C) QFileDialog Directories 目录 &Open 打开(&O) &Save 保存(&S) Open 打开 %1 already exists. Do you want to replace it? %1 已存在。要替换它吗? %1 File not found. Please verify the correct file name was given. %1 找不到文件。 请检查所给的文件名是否正确。 My Computer 我的电脑 &Rename 重命名(&R) &Delete 删除(&D) Show &hidden files 显示隐藏文件(&H) Back 后退 Parent Directory 父目录 List View 列表视图 Detail View 详细信息视图 Files of type: 文件类型: Directory: 目录: %1 Directory not found. Please verify the correct directory name was given. %1 找不到文件夹。 请检查所给的文件夹名是否正确。 '%1' is write protected. Do you want to delete it anyway? '%1' 有写保护。 确定要删除它? Are sure you want to delete '%1'? 确定要删除 '%1'? Could not delete directory. 不能删除文件夹。 Recent Places 最近的位置 Save As 另存为 Drive 驱动器 File 文件 Unknown 未知 Find Directory 查找目录 Show 显示 Forward 向前 New Folder 新建文件夹 &New Folder 新建文件夹(&N) &Choose 选择(&C) Remove 删除 File &name: 文件名(&N): Look in: 查找范围: Create New Folder 新建文件夹 QObject All image files 全部图片文件 files 文件 Centered 居中 Tiled 平铺 Center Tiled 中心平铺 Centered Maxpect 居中拉伸 Tiled Maxpect 平铺拉伸 Scaled 比例 Centered Auto Fit 居中的自动适应 Scale & Crop 比例因子 Symmetrical Tiled 对称平铺 Mirrored Tiled 镜像平铺 Symmetrical Mirrored Tiled 镜像对称平铺 QProgressDialog Cancel 取消 SettingsDialog Settings 设置 Left Right kBytes 千字节 MBytes 兆字节 GBytes 吉字节 day(s) month(s) second(s) minute(s) hour(s) 小时 Set position 设置位置 Changes won't be applied. Are you sure? 更改将不会被应用。你确定吗? Clear history 清空历史记录 Are you sure? 你确定? General options 常规选项 Interval: 区间: Border: 边界: Position: 地点: Main 主要 Choose in random order 选择随机顺序 Switch background on play 播放时切换背景 Play automatically on application start 程序启动时自动播放 Disable splash screen 禁用启动画面 Quit after background change 桌面更换后退出 Start automatically when system starts 跟随系统启动 Only use landscape-oriented photos 只使用景观型的照片 Rotate images according to EXIF information 根据 EXIF 信息旋转图片 View info on photo 查看照片的信息 View info in system tray tooltip 在系统托盘提示查看信息 Use full desktop area 使用全部桌面区域 Photo has to be 图片必须是 independent of 独立于 at least 1/2 of 至少 1/2 于 at least 3/4 of 至少 3/4 于 bigger than 大于 desktop's size 桌面大小 Don't save locally remote photos if free disk space goes below 如果可用磁盘空间不足就不在本地保存远程照片 Store images in history for 保存历史图片 Clear 清空 Available modules: 可用模块: Active modules: 活动模块: Network 网络 Direct connection 直接链接 Proxy connection 代理链接 Use system proxy 使用系统代理 Use custom proxy 使用用户代理 Server: 服务器: Port: 端口: Authentication 认证 Username: 用户名: Password: 密码: SmugMug::DialogWidget Search for: 搜索: Edit SmugMug item 编辑 SmugMug 项目 Add SmugMug item 增加 SmugMug 项目 SmugMug::Item Text: 文本: SplashScreen Loading Files module ... 加载文件模块 ... Loading Folders module ... 加载文件夹模块 ... Loading Flickr module ... 加载 Flickr 模块 ... Loading Yahoo! module ... 加载 Yahoo! 模块 ... Loading Panoramio module ... 加载 Panoramio 模块 ... Loading Ipernity module ... 加载 Ipernity 模块 ... Loading Photobucket module ... 加载 Photobucket 模块 ... Loading Buzznet module ... 加载 Buzznet 模块 ... Loading Picasa module ... 加载 Picasa 模块 ... Loading SmugMug module ... 加载 SmugMug 模块 ... Loading Google module ... 加载 Google 模块 ... Loading Vladstudio module ... 加载 Vladstudio 模块 ... Loading deviantART module ... 加载 deviantART 模块 ... Loading settings ... 加载设置 ... Launching Wally ... 启动 Wally ... Author: 作者: Viewer Right-click on photo to show actions 右键点击显示选项 Fit to window 适合窗口 Show full image 显示完整图片 Zoom in 放大 Zoom out 缩小 Rotate clockwise 顺时针旋转 Rotate c. clockwise 顺时针旋转角度 Vladstudio::DialogWidget All 全部 Abstract art 抽象艺术 Creatures 生物 Illustrations 插图 Photos 图片 By ID 通过ID By view count 通过浏览次数 Ascending 升序 Descending 降序 Category: 分类 Order: 排序: Direction: 方向 Edit Vladstudio item 编辑 Vladstudio 项目 Add Vladstudio item 增加 Vladstudio 项目 Vladstudio::Item All categories 所有分类 Abstract art 抽象艺术 Creatures Illustrations Photos 图片 by Id by view count ascending 升序 descending 降序 Wally::Application Cancel 取消 Play 播放 Pause 暂停 Next photo 下一张图片 Save photo... 保存图片... Get EXIF info... 获取 EXIF信息... Settings... 设置... Explore source 浏览原文件 About... 关于... History... 历史记录... About Qt... 关于 Qt... Quit 退出 English 英语 Italian 意大利语 Spanish 西班牙语 German 德语 French 法语 Russian 俄语 Portuguese (Brazil) 葡萄牙语(巴西) Czech 捷克语 Polish 波兰文 Chinese 汉语 Languages 语言 Catalan 加泰罗尼亚语 Greek 希腊 Korean 韩语 Hungarian 匈牙利 Danish 丹麦的 Swedish 瑞典语 Turkish 土耳其 Wally Error Wally 错误 Active Desktop must be disabled 请禁止使用动态桌面 by: 通过: Location: 地点: Engine: 引擎: Save photo 保存图片 Images (*.png *.xpm *.jpg) 图片格式 (*.png *.xpm *.jpg) Right-click to show main menu 右键单击显示主菜单 Yahoo::DialogWidget All of these words 全部关键词 Any of these words 任意关键词 Search for: 搜索: Filter content 内容过滤 Yahoo! item Yahoo! 项目 Unfiltered content can show offending or sexual explicit photos 未过滤的内容可能会显示冒犯或性相关照片 Edit Yahoo! item 编辑 Yahoo! 项目 Add Yahoo! item 添加 Yahoo! 项目 Yahoo::Item Tags: 标签: and 并且 or 或者 content filtered 内容过滤 wally-2.4.4/res/lang/wally_dk.ts0000644000000000000000000030171011676624760015260 0ustar rootroot AboutDialog About Wally Om Wally <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Qt4 Baggrundsbillede skift <br />Forfatter: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Jeg vil gerne takke Vincent Willem van Gogh for logoet :)<br /><br />Web adresse: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Du kan kontakte mig på <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Details >> Detailer >> Close Luk Extension Udvidelse Description Forklaring Supported image formats: Understøttede billed formater: Additional info: Yderligere information: Language Sprog Translator Oversætter Translations: Oversættelser: Compiled with: Kompileret med: EXIF library: EXIF bibliotek: present fundet not present ikke fundet English Engelsk Italian Italiensk Russian Russisk Spanish Spansk Portuguese (Brazil) Portugisisk (Braziliansk) German Tysk French Fransk Czech Tjekkisk Chinese Kinesisk Polish Polsk Catalan Katalansk Greek Græsk Korean Koreansk Hungarian Ungarsk Danish Dansk Swedish Svensk Turkish Tyrkisk Bing::DialogWidget All of these words Alle disse ord Any of these words Et af disse ord Search for: Søg efter: Strict Hård Moderate Moderat Off Fra Adult filter: Voksenfilter: Bing item Bing post Unfiltered content can show offending or sexual explicit photos Ufiltreret indhold kan vise upassende eller direkte pornografiske billeder Edit Bing item Rediger Bing post Add Bing item Tilføj Bing post Bing::Item Tags: Mærke: and og or eller Adult filter: Voksenfilter: Off Fra Moderate Moderat Strict Hård Buzznet::DialogWidget Search for: Søg efter: Edit Buzznet item Rediger Buzzet post Add Buzznet item Tilføj Buzzet post Buzznet::Item Tag: Mærke: DeviantArt::DialogWidget Search for: Søg efter: Strict Hård Off Fra Adult filter: Voksenfilter: deviantART item deviantART post Unfiltered content can show offending or sexual explicit photos Ufiltreret indhold kan vise upassende eller direkte pornografiske billeder Edit deviantART item Rediger deviantART post Add deviantART item Tilføj deviantART post DeviantArt::Item Tag: Mærke: Adult filter: Voksenfilter: Off Fra Strict Hård Exif::InfoDialog EXIF information EXIF information Tag Tag Value Værdi No EXIF information available Ingen EXIF information tilgængelig Files::Core Loading folder... Læser mappe... Files::LabelPreview No preview available Ingen visning tilgængelig Files::SettingsWidget Files Filer Select a photo Vælg et foto Select a folder Vælg en mappe FilesSettingsWidget Photos Fotos Add a photo Tilføj et foto Add photos in folder Tilføj fotos til en mappe Delete photo Slet foto Move photo up Flyt foto op Move photo down Flyt foto ned Flickr::DialogWidget All of these words Alle disse ord Any of these words Et af disse ord Search for: Søg efter: Full text Fuld tekst Tags only Kun tags Largest Største Original Original Large Stor Medium Medium Small Lille Thumbnail Negl Square Firkant Smallest Mindste Interestingness desc Intresante faldende Relevance Relevans Date posted desc Dato indlagt faldende Date taken desc Dato tager faldende Interestingness asc Intresante faldende Date posted asc Dato indlagt faldende Date taken asc Dato tager faldende Size: Størrelse: Order: Orden: Edit Flickr item Rediger Flickr post Add Flickr item Tilføj Flickr post Flickr::Item Text: Tekst: Tags: Mærker: and og or eller Size: Størrelse: Largest Største Original Original Large Stor Medium Medium Small Lille Thumbnail Negl Square Firkant Smallest Mindste Order: Orden: Interestingness desc Intresante faldende Relevance Relevans Date posted desc Dato indlagt faldende Date taken desc Dato taget faldende Interestingness asc Intresante faldende Date posted asc Dato indlagt stigende Date taken asc Dato taget stigende Folders::DialogWidget Local Lokal Remote Fjern Include subfolders Inkluder undermapper Folder: Mappe: Passive Passiv Active Aktiv Server: Server: Port: Port: Transfer mode: Overførselstype: Username: Brugernavn: Password: Posord: Path: Sti: Select a folder Vælg en mappe Edit folder Rediger mappe Add folder Tilføj mappe Folders::LocalItem (with subfolders) (med undermapper) Folders::RemoteItem Transfer mode: Overførselstype: passive passiv active aktiv Folders::SettingsWidget Folders Mapper FoldersSettingsWidget Folders Mappe Mapper Add a folder Tilføj en mappe Delete folder Slet mappe Google::DialogWidget Search for: Søg efter: Strict Hård Moderate Moderat Off Fra Adult filter: Voksenfilter: Google item Google post Unfiltered content can show offending or sexual explicit photos Ufiltreret indhold kan vise upassende eller direkte pornografiske billeder Edit Google item Rediger Google post Add Google item Tilføj Google post Google::Item Text: Tekst: Adult filter: Voksenfilter: Off Fra Moderate Moderat Strict Hård Gui::ColorButton Auto Auto History::Dialog Right-click on items to show options Højreklik på poster for at vise indstillinger History Historie Please wait... Vent venligst... Downloading photo... Henter foto... Abort Om Save photo Gem foto Images (*.png *.xpm *.jpg) Billedtyper (*.png *.xpm *.jpg) Photo has been saved Foto gemt There was an error during download Der opstod en fejl ved hentning View photo... Se foto... Get EXIF info... Vis EXIF info... Save photo... Gem foto... Set as background Vælg som baggrund Explore image source Undersøg billed kilde History::EngineQueryModel All Alle History::PhotosQueryModel (no title) (ingen titel) by: af: (no author) (ingen forfatter) Date: Dato: Location: Lokation: unknown ukendt Size: Størrelse: Image size: Billed størrelse: Engine: Motor: EXIF: EXIF: No Nej Yes Ja History::TagsQueryModel All Alle HttpEngine::SettingsWidget Select a folder Vælg en mappe HttpSettingsWidget Photo sets Foto sæt Add a photo set Tilføj et foto sæt Delete photo set Slet et foto sæt Options Indstillinger Save photos Gem fotos Ipernity::DialogWidget All of these words Alle disse ord Any of these words Et af disse ord Search for: Søg efter: Full text Fuld tekst Tags only Kun tags Ipernity item Ipernity post It can show offending or sexual explicit photos Kan vise upassende eller direkte pornografiske billeder Edit Ipernity item Rediger Ipernity post Add Ipernity item Tilføj Ipernity post Ipernity::Item Text: Tekst: and og or eller Tags: Mærker: Main Error Fejl Another instance of Endnu et eksempel på is already running Kører allerede Disclaimer Ansvarsfraskrivelse <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>Forfatteren har intet ansvar for indholdet som Wally henter (downloader) fra fotodeling web sites.<br>Forfatteren er under ingen omstændigheder ansvarlig for dette indhold.</b><br><br>Hvis dette er et problem for dig, brug da venligst kun egne som "Filer" eller egne "Mapper".<br>I modsat fald, vælg venligst <b>"Nej"</b> for at forlade Wally, eller brug det <b>på eget ansvar.</b><br><br>(Hvis du fortsætter, vil denne meddelse kun blive vist denne ene gang)<br><br>Accepterer du ovennævnte? Map::View Drag to select. Right-click to zoom Træk for at vælge. Højreklik for zoom Zoom %1x Zoom %1x Map::Viewer Map viewer Kort visning Panoramio::DialogWidget Select on map Vælg op kort Longitude (min): Længdegrad (min): Longitude (max): Længdegrad (max): Latitude (min): Breddegrad (min): Latitude (max): Breddegrad (max): Popularity Popularitet Upload date Overført dato Original Original Medium Medium Small Lille Thumbnail Negl Square Firkant Mini square Mini firmant Order: Orden: Size: Størrelse: Edit Panoramio item Rediger Panoramio post Add Panoramio item Tilføj Panoramio post Error Fejl Coordinates must be different Koordinater skal være forskellige Panoramio::Item lat: læn: lon: brd: Original Original Medium Medium Small Lille Thumbnail Negl Square Firkant Mini square Mini firkant Popularity Popularitet Upload date Overført dato Longitude: Længdegrad: Latitude: Breddegrad: Size: Størrelse: Order: Orden: Photobucket::DialogWidget All of these words Alle disse ord Any of these words Et af disse ord Search for: Søg efter: Photobucket item Photobucket post It can show offending or sexual explicit photos Kan vise upassende eller direkte pornografiske billeder Edit Photobucket item Rediger Photobucket post Add Photobucket item Tilføj Photobucket post Photobucket::Item Text: Tekst: and og or eller Picasa::DialogWidget Search for: Søg efter: Edit Picasa item Rediger Picasa post Add Picasa item Tilføj Picasa post Picasa::Item Text: Tekst: Pikeo::DialogWidget Search for: Søg efter: Default Standard Most viewed Mest sete Upload date Overført dato Date taken Dato taget Group add date Gruppe tilføj dato Comment date Kommantar dato Ascending Stigende Order: Orden: Edit Pikeo item Rediger Pikeo post Add Pikeo item Tilføj Pikeo post Pikeo::Item Tags: Mærker: Order: Orden: Default Standard Most viewed Mest sete Upload date Overført dato Date taken Dato taget Group add date Gruppe tilføj dato Comment date Kommantar dato ascending stigende descending faldende PositionModel Position Position Picture smaller than screen on the left, greater than screen on the right Billede mindre end det viste til venstre, større end det viste til højre QColorDialog Hu&e: Nuanc&e: &Sat: &Mætning: &Val: &Værdi: &Red: &Rød: &Green: &Grøn: Bl&ue: &Blå: Select Color Vælg farve &Basic colors &Standard farver &Custom colors &Egne farver &Add to Custom Colors &Tilføj til egne farver QDialogButtonBox OK OK Cancel Annuller Reset Nulstil &Yes &Ja &No &Nej Close Luk &Close &Luk QFileDialog Directories Mapper &Open &Åben &Save &Gem Open Åben %1 already exists. Do you want to replace it? %1 findes allerede. Ønsker du at overskrive den ? %1 File not found. Please verify the correct file name was given. %1 Fil ikke fundet. Check angivet filnavn. My Computer Min Computer &Rename &Omdøb &Delete &Slet Show &hidden files Vis &skjulte filer Back Tilbage Parent Directory Øvre mappe List View Listevisning Detail View Detailvisning Files of type: Filtyper: Directory: Mappe: %1 Directory not found. Please verify the correct directory name was given. %1 Mappen blev ikke fundet. Check angivet navn. '%1' is write protected. Do you want to delete it anyway? '%1' er skrivebeskyttet. Ønsker du at slette den alligevel ? Are sure you want to delete '%1'? Er du sikker på at du vil slette '%1' ? Could not delete directory. Kunne ikke slete mappe. Recent Places Tidligeremapper Save As Gem som Drive Drev File Fil Unknown Ukendt Find Directory Find mappe Show Vis Forward Frem New Folder Ny mappe &New Folder &Ny mappe &Choose &Vælg Remove Fjern File &name: Fil &navn: Look in: Søg i: Create New Folder Opret Ny Mappe QObject Centered Centreret Tiled Overlagt Center Tiled Cntreret overlagt Centered Maxpect Centreret Maxpect Tiled Maxpect Overlagt Maxpect Scaled Skaleret Centered Auto Fit Centreret autotilpasning Scale & Crop Skaler & Beskær Symmetrical Tiled Symereisk Overlagt Mirrored Tiled Spejlet Overlagt Symmetrical Mirrored Tiled Symereisk Spejlet Overlagt All image files Alle billed filer files Filer QProgressDialog Cancel Annuller SettingsDialog General options Generelle indstillinger Interval: Interval: Border: Ramme: Position: Position: Main Hoved Choose in random order Vælg i vilkårlig orden Switch background on play Skift baggrund ved start Play automatically on application start Start automatisk ved programstart Disable splash screen Fravælg splash screen Quit after background change Afslut efter baggrundsændring Start automatically when system starts Start automatisk ved systemstart Only use landscape-oriented photos Brug kun landskabsorienterede billeder Rotate images according to EXIF information Rotér billeder iflg. EXIF information View info on photo Vis info på foto View info in system tray tooltip Vis info i systembakke værktøjstip Use full desktop area Brug hele skrivebords området Photo has to be Foto skalvære independent of uafhængig af at least 1/2 of mindst ½ af at least 3/4 of mindst ¾ af bigger than større end desktop's size skrivebords størrelse Don't save locally remote photos if free disk space goes below Gem ikke fjern (net) fotos lokalt hvis diskplads kommer under Store images in history for Gem billed historik i Clear Fjern Available modules: Ledige moduler: Active modules: Aktive moduler: Network Netværk Direct connection Direkte forbindelse Proxy connection Proxy forbindelse Use system proxy Brug system proxy Use custom proxy Brug egen proxy opsætning Server: Server: Port: Port: Authentication Autorisation Username: Brugernavn: Password: Pasord: Settings Indstillinger Left Venstre Right Højre kBytes kBytes MBytes MBytes GBytes GBytes day(s) dag dage month(s) måned måneder second(s) sekund sekunder minute(s) minut minutter hour(s) time timer Set position Sæt position Changes won't be applied. Are you sure? Ændringer vil ikke blive tilføjet. Er du sikker ? Clear history Fjern historik Are you sure? Er du sikker ? SmugMug::DialogWidget Search for: Søg efter: Edit SmugMug item Rediger SmugMug post Add SmugMug item Tilføj SmugMug post SmugMug::Item Text: Tekst: SplashScreen Loading Files module ... Indlæser Fil moduler ... Loading Folders module ... Indlæser Mappe moduler ... Loading Flickr module ... Indlæser Flikr modul ... Loading Yahoo! module ... Indlæser Yahoo! modul ... Loading Panoramio module ... Indlæser Panoramio modul ... Loading Ipernity module ... Indlæser Ipernity modul ... Loading Photobucket module ... Indlæser Photobucket modul ... Loading Buzznet module ... Indlæser Buzznet modul ... Loading Picasa module ... Indlæser Picasa modul ... Loading SmugMug module ... Indlæser SmugMug modul ... Loading Google module ... Indlæser Google modul ... Loading Vladstudio module ... Indlæser Vladstudio modul ... Loading deviantART module ... Indlæser divantART modul ... Loading settings ... Indlæser indstillinger ... Launching Wally ... Starter Wally ... Author: Forfatter: Viewer Right-click on photo to show actions Højreklik på foto for at vise muligheder Fit to window Tilpas til vindue Show full image Vis fuldt billede Zoom in Zoom ind Zoom out Zoom ud Rotate clockwise Rotér med uret Rotate c. clockwise Rotér mod uret Vladstudio::DialogWidget All Alle Abstract art Abstrakt kunst Creatures Skabninger Illustrations Illustrationer Photos Fotos By ID Efter ID By view count Efter antal visninger Ascending Stigende Descending Faldende Category: Kategori: Order: Orden: Direction: Retning: Edit Vladstudio item Rediger Vladstudio post Add Vladstudio item Tilføj Vladstudio post Vladstudio::Item All categories Alle kategorier Abstract art Abstrakt kunst Creatures Skabninger Illustrations Illustrationer Photos Fotos by Id Efter ID by view count Efter antal visninger ascending stigende descending faldende Wally::Application Cancel Annuller Play Afspil Pause Pause Next photo Næste foto Save photo... Gem foto... Get EXIF info... Hent EXIF info... Settings... Indstillinger... Explore source Undersøg kilde About... Om... History... Historie... About Qt... Om Qt... Quit Afslut Languages Sprog English Engelsk Italian Italiensk Spanish Spansk German Tysk French Fransk Russian Russisk Portuguese (Brazil) Portugisisk (Braziliansk) Czech Tjekkisk Polish Polsk Chinese Kinesisk Catalan Katalansk Greek Græsk Korean Koreansk Hungarian Ungarsk Danish Dansk Swedish Svensk Turkish Tyrkisk Wally Error Wally fejl Active Desktop must be disabled Det aktive skrivebord skal deaktiveres by: af: Location: Lokation: Engine: Motor: Save photo Gem foto Images (*.png *.xpm *.jpg) Billedtyper (*.png *.xpm *.jpg) Right-click to show main menu Højreklik for at vise hovedmenu Yahoo::DialogWidget All of these words Alle disse ord Any of these words Et af disse ord Search for: Søg efter: Filter content Filtrer indhold Yahoo! item Yahoo! post Unfiltered content can show offending or sexual explicit photos Ufiltreret indhold kan vise upassende eller direkte pornografiske billeder Edit Yahoo! item Rediger Yahoo! post Add Yahoo! item Tilføj Yahoo! post Yahoo::Item Tags: Mærke: and og or eller content filtered filtreret indhold wally-2.4.4/res/lang/wally_ru.ts0000644000000000000000000032423611676624760015320 0ustar rootroot AboutDialog Supported image formats: Поддерживаемые форматы изображений: About Wally О программе Wally Details >> Подробности >> Compiled with: Скомпилирована с использованием: EXIF library: Библиотека EXIF: present присутствует not present отсутствует Polish Польский Catalan Каталанский Greek Греческий Korean Корейский Hungarian Венгерский Danish Датский Swedish Шведский Turkish Турецкий Close Закрыть Extension Расширение Description Описание Additional info: Дополнительная информация: Language Язык Translator Переводчик <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Программа по смене фоновых изрбражений<br />написанная с использованием Qt4<br />Автор: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Я хотел бы поблагодарить Винсента ван Гога за логотип :)<br /><br />Веб сайт: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Вы можете связаться со мной по адресу <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Italian Итальянский English Английский Russian Русский Spanish Испанский Portuguese (Brazil) Португ. (Бразилия) Chinese Китайский German Немецкий French Французский Czech Чешский Translations: Перевод: Bing::DialogWidget All of these words Все эти слова Any of these words Любое из этих слов Search for: Искать: Strict Строгий Moderate Умеренный Off Отсутствует Adult filter: Фильтр для взрослых: Bing item Элемент Bing Unfiltered content can show offending or sexual explicit photos Нефильтрованное содержание может показывать неприличные и сексуально откровенные фото Edit Bing item Изменить элемент Bing Add Bing item Добавить элемент Bing Bing::Item Tags: Теги: and и or или Adult filter: Фильтр для взрослых: Off Отсутствует Moderate Умеренный Strict Строгий Buzznet::DialogWidget Search for: Искать: Edit Buzznet item Изменить элемент Buzznet Add Buzznet item Добавить элемент Buzznet Buzznet::Item Tag: Тег: DeviantArt::DialogWidget Search for: Искать: Strict Строгий Off Отсутствует Adult filter: Фильтр для взрослых: deviantART item Элемент deviantART Unfiltered content can show offending or sexual explicit photos Нефильтрованное содержание может показывать неприличные и сексуально откровенные фото Edit deviantART item Изменить элемент deviantART Add deviantART item Добавить элемент deviantART DeviantArt::Item Tag: Тег: Adult filter: Фильтр для взрослых: Off Отсутствует Strict Строгий Exif::InfoDialog EXIF information Информация EXIF Tag Тег Value Значение No EXIF information available Информация EXIF отсутствует Files::Core Loading folder... Загрузка папки... Files::LabelPreview No preview available Предварительный просмотр не доступен Files::SettingsWidget Select a photo Выбрать фото Select a folder Выбрать папку Files Файлы FilesSettingsWidget Photos Фото Add a photo Добавить фото Add photos in folder Добавить фото из папкм Delete photo Удалить фото Move photo up Переместить фото вверх Move photo down Переместить фото вниз Flickr::DialogWidget All of these words Все эти слова Any of these words Любое из этих слов Search for: Искать: Full text Текст Tags only Только теги Largest Самый большой Original Искомый Large Большой Medium Средний Small Маленький Thumbnail Свёрнутое изображение Square Квадратный Smallest Самый маленький Relevance Релевантность Size: Размеры: Order: Порядок: Edit Flickr item Изменить элемент Flickr Add Flickr item Добавить элемент Flickr Interestingness desc От самой интересной по убывающей Date posted desc Дата публикации по убывающей Date taken desc Дата снимка по убывающей Interestingness asc К самой интересной по возрастающей Date posted asc Дата публикации по возрастающей Date taken asc Дата снимка по возрастающей Flickr::Item Text: Текст: Tags: Теги: and и or или Size: Размеры: Largest Самый большой Original Искомый Large Большой Medium Средний Small Маленький Thumbnail Свёрнутое изображение Square Квадратный Smallest Самый маленький Order: Порядок: Relevance Релевантность Interestingness desc От самой интересной по убывающей Date posted desc Дата публикации по убывающей Date taken desc Дата снимка по убывающей Interestingness asc К самой интересной по возрастающей Date posted asc Дата публикации по возрастающей Date taken asc Дата снимка по возрастающей Folders::DialogWidget Include subfolders Включая папки нижележащих уровней Select a folder Выбрать папку Edit folder Изменить папку Add folder Добавить папку Local Локальная Remote Отдалённая Folder: Папкa: Passive Пассивный Active Активный Server: Сервер: Port: Порт: Transfer mode: Режим передачи: Username: Имя пользователя: Password: Пароль: Path: Путь: Folders::LocalItem (with subfolders) (с папками нижлежащих уровней) Folders::RemoteItem Transfer mode: Режим передачи: passive пассивный active активный Folders::SettingsWidget Folders Папки FoldersSettingsWidget Folders Папки Add a folder Добавить папку Delete folder Удалить папку Google::DialogWidget Search for: Искать: Strict Строгий Moderate Умеренный Off Отсутствует Adult filter: Фильтр для взрослых: Google item Элемент Google Unfiltered content can show offending or sexual explicit photos Нефильтрованное содержание может показывать неприличные и сексуально откровенные фото Edit Google item Изменить элемент Google Add Google item Добавить элемент Google Google::Item Text: Текст: Adult filter: Фильтр для взрослых: Off Отсутствует Moderate Умеренный Strict Строгий Gui::ColorButton Auto Авто History::Dialog Right-click on items to show options Щелкнуть правой клавишей на элементе для визуализации опций History Журнал Please wait... Подождите, пожалуйста... Downloading photo... Загрузка фото... Abort Прервать Save photo Сохранить фото Images (*.png *.xpm *.jpg) Изображения (*.png *.xpm *.jpg) Photo has been saved Фото сохранено There was an error during download Прозошла ошибка во время загрузки View photo... Показать фото... Get EXIF info... Показать информацию EXIF... Save photo... Сохранить фото... Set as background Установить в качестве фонового изображения Explore image source Открыть сайт-источник фото History::EngineQueryModel All Все History::PhotosQueryModel Image size: Размеры фото: Engine: Модуль: EXIF: EXIF: No Нет Yes Да (no title) (без названия) by: Автор фото: (no author) (автор неизвесен) Location: Местоположение: unknown неизвестно Size: Размеры: Date: Дата: History::TagsQueryModel All Все HttpEngine::SettingsWidget Select a folder Выбрать папку HttpSettingsWidget Photo sets Совокупности фото Options Опции Save photos Сохранить фото Add a photo set Добавить совокупность фото Delete photo set Удалить совокупность фото Ipernity::DialogWidget All of these words Все эти слова Any of these words Любое из этих слов Search for: Искать: Full text Текст Tags only Только теги Ipernity item Элемент Ipernity It can show offending or sexual explicit photos Он может показывать неприличные и сексуально откровенные фото Edit Ipernity item Изменить элемент Ipernity Add Ipernity item Добавить элемент Ipernity Ipernity::Item Text: Текст: and и or или Tags: Теги: Main Error Ошибка is already running уже выполняется в нвстоящий момент Disclaimer Отказ от ответственности <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>Автор не несёт никакой ответственности за фото, загружаемые Wally с сайтов для размещения фотографий.<br>Автор никоим образом не ответственен за содержание подобных фото.</b><br><br>Если Вас это не устраивает, пожалуйста, используйте только локальные базы данных, такие как "Файлы" или "Папки".<br>В противном случае, пожалуйста, выберите <b>"Нет"</b> чтобы выйти из программы Wally, либо используйте её <b>на свой страх и риск.</b><br><br>(если Вы решите продолжить, это сообщение появится только один раз)<br><br>Вы принимаете вышеупомянутое условие? Another instance of Одна копия Map::View Drag to select. Right-click to zoom Тащить мышкой для выбора. Щелкнуть правой клавишей для изменения масштаба Zoom %1x Изменить масштаб %1x Map::Viewer Map viewer Просмотр карты Panoramio::DialogWidget Select on map Выбрать на карте Longitude (min): Долгота (мин): Longitude (max): Долгота (макс): Latitude (min): Широта (мин): Latitude (max): Широта (макс): Popularity Популярность Upload date Дата публикации Original Искомый Medium Средний Small Маленький Thumbnail Свёрнутое изображение Square Квадратный Mini square Квадратный мини Order: Порядок: Size: Размеры: Edit Panoramio item Изменить элемент Panoramio Add Panoramio item Добавить элемент Panoramio Error Ошибка Coordinates must be different Координаты должны быть различными Panoramio::Item Original Искомый Medium Средний Small Маленький Thumbnail Свёрнутое изображение Square Квадратный Mini square Квадратный мини Popularity Популярность Upload date Дата публикации Longitude: Долгота: Latitude: Широта: Size: Размеры: Order: Порядок: lat: шир.: lon: долг.: Photobucket::DialogWidget Search for: Искать: Photobucket item Элемент Photobucket It can show offending or sexual explicit photos Он может показывать неприличные и сексуально откровенные фото Edit Photobucket item Изменить элемент Photobucket Add Photobucket item Добавить элемент Photobucket All of these words Все эти слова Any of these words Любое из этих слов Photobucket::Item Text: Текст: and и or или Picasa::DialogWidget Search for: Искать: Edit Picasa item Изменить элемент Picasa Add Picasa item Добавить элемент Picasa Picasa::Item Text: Текст: Pikeo::DialogWidget Search for: Искать: Default По умолчанию Most viewed Самое большое кол-во просмотров Upload date Дата публикации Date taken Дата снимка Group add date Дата добавления к группе Comment date Дата добавления комментария Ascending По возрастающей Order: Порядок: Edit Pikeo item Изменить элемент Pikeo Add Pikeo item Добавить элемент Pikeo Pikeo::Item Tags: Теги: Order: Порядок: Default По умолчанию Most viewed Самое большое кол-во просмотров Upload date Дата публикации Date taken Дата снимка Group add date Дата добавления к группе Comment date Дата добавления комментария ascending по возрастающей descending по убывающей PositionModel Position Позиционирование Picture smaller than screen on the left, greater than screen on the right Изображение, которое меньше экрана - слева, а больше - справа QColorDialog Hu&e: &Тон: &Sat: &Нас: &Val: &Ярк: &Red: &Крас: &Green: &Зел: Bl&ue: С&ин: Select Color Выбрать цвет &Basic colors &Основные цвета &Custom colors &Собственные цвета &Add to Custom Colors &Добавить к собственным цветам QDialogButtonBox OK OK Cancel Отменить Reset Восстановить &Yes &Да &No &Нет Close Закрыть &Close &Закрыть QFileDialog Directories Каталоги &Open &Открыть &Save &Сохранить Open Открыть %1 already exists. Do you want to replace it? %1 уже существует. Хотите заменить его? %1 File not found. Please verify the correct file name was given. %1 Файл не найден. Проверьте правильность указанного имени файла. My Computer Мой компьютер &Rename &Переименовать &Delete &Удалить Show &hidden files Показать &скрытые файлы Back Назад Parent Directory Родительский каталог List View Список Detail View Детальный вид Files of type: Типы файлов: Directory: Каталог: %1 Directory not found. Please verify the correct directory name was given. %1 Каталог не найден. Проверьте правильность указанного имени каталога. '%1' is write protected. Do you want to delete it anyway? '%1' защищён от записи. Всё-равно хотите удалить? Are sure you want to delete '%1'? Вы действительно хотите удалить '%1'? Could not delete directory. Не удалось удалить каталог. Recent Places Недавние документы Save As Сохранить как Drive Диск File Файл Unknown Неизвестно Find Directory Найти каталог Show Показать Forward Вперед New Folder Новый каталог &New Folder &Новый каталог &Choose &Выбрать Remove Удалить File &name: &Имя файла: Look in: Перейти к: Create New Folder Создать новый каталог QObject All image files Все форматы изображений files файлы Centered В центре Tiled Мозаика Center Tiled Центрированная мозаика Centered Maxpect Корректно масштабированное по центру Tiled Maxpect Корректно масштабированная мозаика Scaled Масштабированное Centered Auto Fit Корректно уменьшенное по центру Scale & Crop Масштабированное & кадрированное Symmetrical Tiled Симметричная мозаика Mirrored Tiled Зеркальная мозаика Symmetrical Mirrored Tiled Симметричная зеркальная мозаика QProgressDialog Cancel Отмена SettingsDialog kBytes кб MBytes Мб GBytes Гб day(s) день дня дней month(s) месяц месяца месяцев second(s) секунда секунды секунд minute(s) минута минуты минут hour(s) час часа часов Set position Установить позиционирование Clear history Удалить журнал Are you sure? Вы действительно хотите удалить журнал? Settings Настройки General options Общие опции Interval: Интервал: Border: Границы: Position: Позиционирование: Main Основные Choose in random order Выбирать произвольно Switch background on play Менять фото при воспроизведении Play automatically on application start Автоматическое воспроизведение при пуске программы Disable splash screen Отключить заставку Quit after background change Выйти после смены фото Start automatically when system starts Автоматический старт программы при запуске системы Only use landscape-oriented photos Использовать только панорамные фото Rotate images according to EXIF information Поворачивать изображения согласно информации EXIF View info on photo Показывать информацию на фото View info in system tray tooltip Показывать информацию в строке системного лотка Use full desktop area Использовать всё пространство рабочего стола Photo has to be Фото должно быть independent of независимо от размера at least 1/2 of минимум 1/2 размера at least 3/4 of минимум 3/4 размера bigger than больше чем размер desktop's size Использовать всё пространство рабочего стола Store images in history for Сохраниять изображения в журнале Clear Очистить Direct connection Прямое соединение Proxy connection Соединение через proxy-сервер Don't save locally remote photos if free disk space goes below Не сохраниять фото из Интернета если пространство на диске меньше Available modules: Доступные модули: Active modules: Активные модули: Network Сеть Use system proxy Использовать proxy-сервер оперативной системы Use custom proxy Использовать proxy-сервер пользователя Port: Порт: Authentication Аутентификация Username: Имя пользователя: Password: Пароль: Server: Сервер: Changes won't be applied. Are you sure? Изменения не будут применены. Продолжить? Left Слева Right Справа SmugMug::DialogWidget Search for: Искать: Edit SmugMug item Изменить элемент Smugmug Add SmugMug item Добавить элемент Smugmug SmugMug::Item Text: Текст: SplashScreen Author: Автор: Loading Files module ... Загрузка модуля Файлы ... Loading Folders module ... Загрузка модуля Папки ... Loading Flickr module ... Загрузка модуля Flickr ... Loading Yahoo! module ... Загрузка модуля Yahoo! ... Loading Panoramio module ... Загрузка модуля Panoramio ... Loading Ipernity module ... Загрузка модуля Ipernity ... Loading Photobucket module ... Загрузка модуля Photobucket ... Loading Buzznet module ... Загрузка модуля Buzznet ... Loading Picasa module ... Загрузка модуля Picasa ... Loading SmugMug module ... Загрузка модуля Smugmug ... Loading Google module ... Загрузка модуля Google ... Loading Vladstudio module ... Загрузка модуля Vladstudio ... Loading deviantART module ... Загрузка модуля deviantART ... Loading settings ... Загрузка параметров настройки ... Launching Wally ... Пуск Wally ... Viewer Right-click on photo to show actions Щелкнуть правой клавишей на элементе для визуализации действий Fit to window Подогнать размер Show full image Искомый размер Zoom in Крупнее Zoom out Мельче Rotate clockwise Повернуть по часовой стрелке Rotate c. clockwise Повернуть против часовой стрелки Vladstudio::DialogWidget All Все Abstract art Абстрактное искусство Creatures Существа Illustrations Иллюстрации Photos Фото By ID Упорядочены по ID By view count Упорядочено по количеству просмотров Ascending По возрастающей Descending По убывающей Category: Категория: Order: Порядок: Direction: Упорядочение: Edit Vladstudio item Изменить элемент Vladstudio Add Vladstudio item Добавить элемент Vladstudio Vladstudio::Item All categories Все категории Abstract art Абстрактное искусство Creatures Существа Illustrations Иллюстрации Photos Фото by Id упорядочены по Id by view count упорядочено по количеству просмотров ascending по возрастающей descending по убывающей Wally::Application Cancel Отменить Play Воспроизведение Pause Пауза Next photo Следующее фото Save photo... Сохранить фото... Get EXIF info... Показать информацию EXIF... Settings... настройки... Explore source Открыть сайт-источник фото About... О программе... History... Журнал... About Qt... О программе Qt... Quit Выход English Английский Italian Итальянский Spanish Испанский German Немецкий French Французский Russian Русский Czech Чешский Polish Польский Chinese Китайский Languages Языки Catalan Каталанский Greek Греческий Korean Корейский Hungarian Венгерский Danish Датский Swedish Шведский Turkish Турецкий Wally Error Ошибка Wally Active Desktop must be disabled Active Desktop должен быть отключен by: Автор фото: Location: Местоположение: Engine: Модуль: Save photo Сохранить фото Images (*.png *.xpm *.jpg) Изображения (*.png *.xpm *.jpg) Right-click to show main menu Щелкнуть правой клавишей на элементе для визуализации главного меню Portuguese (Brazil) Португ. (Бразилия) Yahoo::DialogWidget All of these words Все эти слова Any of these words Любое из этих слов Search for: Искать: Filter content Фильтровать содержание Yahoo! item Элемент Yahoo! Unfiltered content can show offending or sexual explicit photos Нефильтрованное содержание может показывать неприличные и сексуально откровенные фото Edit Yahoo! item Изменить элемент Yahoo! Add Yahoo! item Добавить элемент Yahoo! Yahoo::Item Tags: Теги: and и or или content filtered содержание отфильтровано wally-2.4.4/res/lang/wally_es.ts0000644000000000000000000030433411676624760015276 0ustar rootroot AboutDialog Supported image formats: Formatos de imágenes soportadas: About Wally Acerca de Wally Details >> Detalies >> Compiled with: Compilado con: EXIF library: Biblioteca EXIF: present presente not present no presente Polish Polaco Catalan Catalán Greek Griego Korean Koreano Hungarian Húngaro Danish Danés Swedish Sueco Turkish Turco Close Cerrar Extension Extensión Description Descripción Additional info: Informaciónes adicionales: Language Idioma Translator Traductor <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> <html><head></head><body><font size="+1">Conmutador de fondos de escritorio Qt4<br />Autor: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />Agradecimientos a Vincent Willem van Gogh por el logotipo :)<br /><br />Sito web: <a href="http://www.becrux.com">http://www.becrux.com</a><br />Usted puede contactarme escribiendo a <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> Italian Italiano English Inglés Russian Ruso Spanish Español Portuguese (Brazil) Portugués (Brasil) Chinese Chino German Alemán French Francés Czech Checo Translations: Traductores: Bing::DialogWidget All of these words Todas estas palabras Any of these words Cualquiera de estas palabras Search for: Buscar: Strict Elevado Moderate Moderado Off Desactivado Adult filter: Filtro para adultos: Bing item Objeto Bing Unfiltered content can show offending or sexual explicit photos Los contenidos no filtrados pueden mostrar fotos ofencivas o sexualmente explicitas Edit Bing item Modificar objeto Bing Add Bing item Añadir un objeto Bing Bing::Item Tags: Etiquetas: and y or o Adult filter: Filtro para adultos: Off Desactivado Moderate Moderado Strict Elevado Buzznet::DialogWidget Search for: Buscar: Edit Buzznet item Modificar objeto Buzznet Add Buzznet item Añadir un objeto Buzznet Buzznet::Item Tag: Etiqueta: DeviantArt::DialogWidget Search for: Buscar: Strict Elevado Off Desactivado Adult filter: Filtro para adultos: deviantART item Objecto deviantART Unfiltered content can show offending or sexual explicit photos Los contenidos no filtrados pueden mostrar fotos ofencivas o sexualmente explicitas Edit deviantART item Modificar objeto deviantART Add deviantART item Añadir un objeto deviantART DeviantArt::Item Tag: Etiqueta: Adult filter: Filtro para adultos: Off Desactivado Strict Elevado Exif::InfoDialog EXIF information Información EXIF Tag Etiqueta Value Valor No EXIF information available Información EXIF no disponible Files::Core Loading folder... Cargando carpeta... Files::LabelPreview No preview available Vista previa no disponible Files::SettingsWidget Select a photo Seleccionar una foto Select a folder Seleccionar una carpeta Files Archivos FilesSettingsWidget Photos Fotos Add a photo Añadir una foto Add photos in folder Añadir fotos a la carpeta Delete photo Eliminar la foto Move photo up Mover la foto arriba Move photo down Mover la foto abajo Flickr::DialogWidget All of these words Todas estas palabras Any of these words Cualquiera de estas palabras Search for: Buscar: Full text Texto Tags only Soló etiquetas Largest Más grande Original Original Large Grande Medium Medio Small Pequeño Thumbnail Miniatura Square Cuadrado Smallest Más pequeño Relevance Relevancia Size: Tamaño: Order: Orden: Edit Flickr item Modificar objeto Flickr Add Flickr item Añadir un objeto Flickr Interestingness desc Interés desc Date posted desc Fecha de publicación desc Date taken desc Fecha de toma desc Interestingness asc Interés asc Date posted asc Fecha de publicación asc Date taken asc Fecha de toma asc Flickr::Item Text: Texto: Tags: Etiquetas: and y or o Size: Tamaño: Largest Más grande Original Original Large Grande Medium Medio Small Pequeño Thumbnail Miniatura Square Cuadrado Smallest Más pequeño Order: Orden: Relevance Relevancia Interestingness desc Interés desc Date posted desc Fecha de publicación desc Date taken desc Fecha de toma desc Interestingness asc Interés asc Date posted asc Fecha de publicación asc Date taken asc Fecha de toma asc Folders::DialogWidget Include subfolders Incluir subcarpetas Select a folder Seleccionar una carpeta Edit folder Modificar la carpeta Add folder Añadir una carpeta Local Local Remote Remoto Folder: Carpeta: Passive Pasiva Active Activa Server: Servidor: Port: Puerto: Transfer mode: Modo de transefrencia: Username: Nombre de usuario: Password: Contraseña: Path: Ruta: Folders::LocalItem (with subfolders) (con subcarpetas) Folders::RemoteItem Transfer mode: Modo de transefrencia: passive pasiva active activa Folders::SettingsWidget Folders Carpetas FoldersSettingsWidget Folders Carpetas Add a folder Añadir una carpeta Delete folder Eliminar la carpeta Google::DialogWidget Search for: Buscar: Strict Elevado Moderate Moderado Off Desactivado Adult filter: Filtro para adultos: Google item Objeto Google Unfiltered content can show offending or sexual explicit photos Edit Google item Modificar objeto Google Add Google item Añadir un objeto Google Google::Item Text: Texto: Adult filter: Filtro para adultos: Off Desactivado Moderate Moderado Strict Elevado Gui::ColorButton Auto Auto History::Dialog Right-click on items to show options Hacer clic con en botón derecho en el elemento para visualizar las opciones History Historial Please wait... Esperar, por favor... Downloading photo... Descargando la foto... Abort Anular Save photo Guardar foto Images (*.png *.xpm *.jpg) Imágenes (*.png *.xpm *.jpg) Photo has been saved La foto ha sido salvada There was an error during download Ha accorrido un error durante la descarga View photo... Ver la foto... Get EXIF info... Mostrar información EXIF... Save photo... Guardar foto... Set as background Establecer como fondo del escritorio Explore image source Explorar la fuente de la foto History::EngineQueryModel All Todos History::PhotosQueryModel Image size: Tamaño de la foto: Engine: Módulo: EXIF: EXIF: No No Yes (no title) (sin nombre) by: Autor: (no author) (sin autor) Location: Ubicación: unknown desconocido Size: Tamaño: Date: Fecha: History::TagsQueryModel All Todos HttpEngine::SettingsWidget Select a folder Seleccionar una carpeta HttpSettingsWidget Photo sets Grupo de fotos Options Opciones Save photos Guardar fotos Add a photo set Añadir un grupo de fotos Delete photo set Eliminar el grupo de fotos Ipernity::DialogWidget All of these words Todas estas palabras Any of these words Cualquiera de estas palabras Search for: Buscar: Full text Texto Tags only Soló etiquetas Ipernity item Objeto Ipernity It can show offending or sexual explicit photos Puede mostrar fotos con contenido sexual u ofensivo Edit Ipernity item Modificar objeto Ipernity Add Ipernity item Añadir un objeto Ipernity Ipernity::Item Text: Texto: and y or o Tags: Etiquetas: Main Error Error is already running ya está ejecutandose Disclaimer Responsabilidad <b>The Author takes no responsibility over the content that Wally downloads from photo sharing web sites.<br>The Author is in no way responsible for any such content.</b><br><br>If this is a problem for you, please use only local engines like "Files" or local "Folders".<br>Otherwise, please select <b>"No"</b> to exit Wally, or use it <b>at your own risk.</b><br><br>(If you proceed, this message will appear only once)<br><br>Do you accept the above condition? <b>El autor no se hace responsable sobre los contenidos que Wally descarga desde sitios web que comparten imagenes.<br>El autor no se hace responsable por ningun contenido.</b><br><br>Si no estas de acuerdo entonces usa solo modulos locales come "Files" o "local Folders" o selecciona <b>"No"</b> para salir, o usa Wally a tu riesgo.</b><br><br>(si continuas, este mensaje aparecerá una sola vez)<br><br>¿Aceptas la condiciones de uso? Another instance of Otra instancia de Map::View Drag to select. Right-click to zoom Arrastar para seleccionar. Hacer clic con el botón derecho para aumentar el zoom Zoom %1x Zoom %1x Map::Viewer Map viewer Mapa Panoramio::DialogWidget Select on map Seleccionar en el mapa Longitude (min): Longitud (mín): Longitude (max): Longitud (máx): Latitude (min): Latitud (mín): Latitude (max): Latitud (máx): Popularity Popularidad Upload date Fecha de carga Original Original Medium Medio Small Pequeño Thumbnail Miniatura Square Cuadrado Mini square Mini cuadrado Order: Orden: Size: Tamaño: Edit Panoramio item Modificar objeto Panoramio Add Panoramio item Añadir un objeto Panoramio Error Error Coordinates must be different Las coordenadas deben ser diferentes Panoramio::Item Original Original Medium Medio Small Pequeño Thumbnail Miniatura Square Cuadrado Mini square Mini cuadrado Popularity Popularidad Upload date Fecha de carga Longitude: Longitud: Latitude: Latitud: Size: Tamaño: Order: Orden: lat: lat: lon: lon: Photobucket::DialogWidget Search for: Buscar: Photobucket item Objecto Photobucket It can show offending or sexual explicit photos Puede mostrar fotos con contenido sexual u ofensivo Edit Photobucket item Modificar objeto Photobucket Add Photobucket item Añadir un objeto Photobucket All of these words Todas estas palabras Any of these words Cualquiera de estas palabras Photobucket::Item Text: Texto: and y or o Picasa::DialogWidget Search for: Buscar: Edit Picasa item Modificar objeto Picasa Add Picasa item Añadir un objeto Picasa Picasa::Item Text: Texto: Pikeo::DialogWidget Search for: Buscar: Default Predeterminado Most viewed Más vistas Upload date Fecha de carga Date taken Fecha de toma Group add date Fecha de inclusión en grupo Comment date Fecha del comentario Ascending Ascendente Order: Orden: Edit Pikeo item Modificar objeto Pikeo Add Pikeo item Añadir un objeto Pikeo Pikeo::Item Tags: Etiquetas: Order: Orden: Default Predeterminado Most viewed Más vistas Upload date subida o carga? Fecha de carga Date taken Fecha de toma Group add date Fecha de inclusión en grupo Comment date Fecha del comentario ascending ascendente descending discendente PositionModel Position Posición Picture smaller than screen on the left, greater than screen on the right Imagen más pequeña que la pantalla a la izquierda, más grande a la derecha QColorDialog Hu&e: &Tono: &Sat: &Saturación: &Val: &Valor: &Red: &Rojo: &Green: &Verde: Bl&ue: Az&ul: Select Color Seleccionar color &Basic colors Colores &básicos &Custom colors &Colores personalizados &Add to Custom Colors &Añadir a los colores personalizados QDialogButtonBox OK OK Cancel Cancelar Reset Restablecer &Yes &Sí &No &No Close Cerrar &Close &Cerrar QFileDialog Directories Carpetas &Open &Abrir &Save &Guardar Open Abrir %1 already exists. Do you want to replace it? El archivo %1 ya existe. ¿Desea reemplazarlo? %1 File not found. Please verify the correct file name was given. %1 Archivo no encontrado. Verifica que el nombre del archivo sea correcto. My Computer Mi equipo &Rename Cambia&r nombre &Delete &Borrar Show &hidden files Mostrar los fic&heros ocultos Back Anterior (histórico) Parent Directory Directorio padre List View Vista de lista Detail View Vista detallada Files of type: Archivos de tipo: Directory: Carpeta: %1 Directory not found. Please verify the correct directory name was given. %1 Carpeta no encontrada. Verique que el nombre sea correcto. '%1' is write protected. Do you want to delete it anyway? '%1' está protegido contra escritura. ¿Desea borrarlo de todas formas? Are sure you want to delete '%1'? Estas seguro que deseas borrar '%1'? Could not delete directory. No se pudo borrar la carpeta. Recent Places Documentos recientes Save As Guardar como Drive Unidad File Archivo Unknown Desconocido Find Directory Encontrar carpetas Show Mostrar Forward Siguiente (histórico) New Folder Nueva carpeta &New Folder &Nueva carpeta &Choose &Seleccionar Remove Eliminar File &name: &Nombre del archivo: Look in: Ver en: Create New Folder Crear una nueva carpeta QObject All image files Todos los archivos de imagen files archivos Centered Centrado Tiled Mosaico Center Tiled Mosaico centrado Centered Maxpect Escalado proporcional Tiled Maxpect Mosaico proporcional Scaled Escalado Centered Auto Fit Auto ajuste centrado Scale & Crop Escalado & recortado Symmetrical Tiled Mosaico simétrico Mirrored Tiled Mosaico en espejo Symmetrical Mirrored Tiled Mosaico simétrico en espejo QProgressDialog Cancel Cancelar SettingsDialog kBytes kBytes MBytes MBytes GBytes GBytes day(s) día(s) month(s) mes(es) second(s) segundo segundos minute(s) minuto minutos hour(s) hora horas Set position Fijar posición Clear history Eliminar el historial Are you sure? Estas seguro? Settings Configuración General options Opciones globales Interval: Intervalo: Border: Borde: Position: Posición: Main Principal Choose in random order Elegir en orden aleatorio Switch background on play Conmutar fondo al iniciar Play automatically on application start Activación automática al iniciar la aplicación Disable splash screen Imagen de Inicio Quit after background change Salir despues del cambio del fondo de pantalla Start automatically when system starts Activación automática al arrancar el sistema Only use landscape-oriented photos Usar sólo imágenes en modo horizontal Rotate images according to EXIF information Girar las fotos según Información EXIF View info on photo Ver informaciónes sobre la foto View info in system tray tooltip Ver la información en el icono en la barra de applicaciones Use full desktop area Usar todo el espacio del escritorio Photo has to be La foto tiene que ser independent of independiente de at least 1/2 of por lo menos 1/2 de at least 3/4 of por lo menos 3/4 de bigger than más grande que desktop's size tamaño del escritorio Store images in history for Conservar fotos en historial por Clear Eliminar Direct connection Conexión directa Proxy connection Conexión por medio de proxy Don't save locally remote photos if free disk space goes below No guardar las fotos descargadas si el espacio libre en el disco duro es menor de Available modules: Módulos disponibles: Active modules: Módulos activos: Network Red Use system proxy Utilizar proxy de sistema Use custom proxy Utilizar proxy de usuario Port: Puerto: Authentication Autenticación Username: Nombre de usuario: Password: Contraseña: Server: Servidor: Changes won't be applied. Are you sure? Los cambios no serán aplicados. Proceder? Left A la izquierda Right A la derecha SmugMug::DialogWidget Search for: Buscar: Edit SmugMug item Modificar objeto Smugmug Add SmugMug item Añadir un objeto Smugmug SmugMug::Item Text: Texto: SplashScreen Author: Autor: Loading Files module ... Cargando módulo Archivos ... Loading Folders module ... Cargando módulo Carpetas ... Loading Flickr module ... Cargando módulo Flickr ... Loading Yahoo! module ... Cargando módulo Yahoo! ... Loading Panoramio module ... Cargando módulo Panoramio ... Loading Ipernity module ... Cargando módulo Ipernity ... Loading Photobucket module ... Cargando módulo Photobucket ... Loading Buzznet module ... Cargando módulo Buzznet ... Loading Picasa module ... Cargando módulo Picasa ... Loading SmugMug module ... Cargando módulo Smugmug ... Loading Google module ... Cargando módulo Google ... Loading Vladstudio module ... Cargando módulo Vladstudio ... Loading deviantART module ... Cargando módulo deviantART ... Loading settings ... Cargando configuración ... Launching Wally ... Iniciando Wally ... Viewer Right-click on photo to show actions Hacer clic con el botón derecho en la foto para visualizar las opciones Fit to window Tamaño ajustado Show full image Tamaño original Zoom in Acercar Zoom out Alejar Rotate clockwise Girar en el sentido de las agujas del reloj Rotate c. clockwise Girar en el sentido opuesto a las agujas del reloj Vladstudio::DialogWidget All Todos Abstract art Arte abstracto Creatures Criaturas Illustrations Ilustraciónes Photos Fotos By ID Por ID By view count Por número de visualizaciones Ascending Ascendente Descending Discendente Category: Categoria Order: Orden: Direction: Dirección: Edit Vladstudio item Modificar objeto Vladstudio Add Vladstudio item Añadir un objeto Vladstudio Vladstudio::Item All categories Todas las categorias Abstract art Arte abstracto Creatures Criaturas Illustrations Ilustraciónes Photos Fotos by Id Por Id by view count Por número de visualizaciones ascending ascendente descending discendente Wally::Application Cancel Cancelar Play Reproducir Pause Pausa Next photo Foto siguiente Save photo... Guardar foto... Get EXIF info... Mostrar información EXIF... Settings... Configuración... Explore source Explorar la fuente About... Acerca de... History... Historial... About Qt... Acerca de Qt... Quit Salir English Inglés Italian Italiano Spanish Español German Alemán French Francés Russian Ruso Czech Checo Polish Polaco Chinese Chino Languages Idiomas Catalan Catalán Greek Griego Korean Koreano Hungarian Húngaro Danish Danés Swedish Sueco Turkish Turco Wally Error Error de Wally Active Desktop must be disabled Active Desktop debe estar desactivado by: Autor: Location: Ubicación: Engine: Módulo: Save photo Guardar foto Images (*.png *.xpm *.jpg) Imágenes (*.png *.xpm *.jpg) Right-click to show main menu Hacer clic con el botón derecho para visualizar menú principal Portuguese (Brazil) Portugués (Brasil) Yahoo::DialogWidget All of these words Todas estas palabras Any of these words Cualquiera de estas palabras Search for: Buscar: Filter content Filtrar el contenido Yahoo! item Objeto Yahoo! Unfiltered content can show offending or sexual explicit photos El contenido no filtrado puede mostrar fotos ofencivas y sexualmente explicitas Edit Yahoo! item Modificar objeto Yahoo! Add Yahoo! item Añadir un objeto Yahoo! Yahoo::Item Tags: Etiquetas: and y or o content filtered contenido filtrado wally-2.4.4/res/images/0000755000000000000000000000000011676624761013425 5ustar rootrootwally-2.4.4/res/images/control_pause.png0000644000000000000000000000132111676624760017004 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<cIDAT8˥KoaXt;ݰ1qԕhBӦJ&UH[b (S@aPs>/;'yywqsIEUHњqM/%[1O3C!&ݽb'GO6#Y_lf9&@=5Z](Ucͬku0M}S}=45;}&+]؍dBsal쬛R*?Cn8 غr' \w%HR@#4z` 9bpf  ]B[l@‰k$,,@vkmI6\gI:盛]KqꑱPm{AJ/zX?|N2܁;,OU pcdE( fB"4_X2^?OIhڂ('Hm$t-8ќѺ;,sW1z |IM1М.34~Q2P%'8s2/F(s7|UL7mO7G%w afc? sq"IENDB`wally-2.4.4/res/images/turkey.png0000755000000000000000000000075411676624760015466 0ustar rootrootPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<~IDATxbπPX@ $-(ҼN33Ȗ\F8U@'?yT R;R߿d3m `ALMAꔕwtk` @ڨII7lZT @L ' uq1W/$͚ffP M 10kk%=oDIČ`K/ E2@40 hYYAN5Bi`ARl_':8  F$8;\FoIENDB`wally-2.4.4/res/images/zoom_in.png0000644000000000000000000000132511676624760015605 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<gIDAT8˥Kq zäqV(uD).Vۚ:nWS$#aKkz+mmL36v„"=>>}1: /8y>o??#TX|M-Rv,n1O1Eirf&F@lN.`9QXһ pg\{?~+E4  @[ˤ:!9%)ʅx.D F8]ND3deH']\ӍNtqP|PSt jʙЈ2A>"eƍ헮?F>3eh=,RA$!d8 «Y97'@77DQf5Ž֧@x&_mjn-̶/=e,ZbT\y—Gu+{!V%E[&ת+C0o2A Q{`:Nپ:ZpۅHy ;{`dSTyWF CT>;/좓IENDB`wally-2.4.4/res/images/photobucket.png0000644000000000000000000000621711676624760016467 0ustar rootrootPNG  IHDRvK-sRGBbKGD pHYs  tIME !7A IDAThw|TUǿLz!Л4I(, "m,₸`$ HEPQA***Uaޤғɼx&>3Wn3{~ɡ #5vS'N(UwgmxH}q>㓗r%|gyA'U&xcA}}YU '8v'v5wƨ.9S;xBKO'8|IYm(oLY8|Z|fsGŎ8'%tsOV2t:8+8P 8s }x}ԩQ*X3GnFq6meu,uVlTnű' v8{hĘzʌaGl\]iCR&T%#'_ȹ vD-{z  olJ߰5oG4eDYFlǜ*Eu4'PugjX}=3v ?7kZgW6 yVWuzd\sd|g/g{ 5.霿8DRwhJqFf]-z*[]R#@8sIbcErm6߫LA2;2x>jO]T0Й< GV\)0rr\Cߦm ]#V Jѿ40ٲM=-VL63̪Gu95悾G>*t+γ/wT~L/mZl^v! dW]uOch4nsLyx`́~+);V]ON( K`.۝2ES4#XTq J%Eqt!s$e'PLlsJ@O[)$*I~s 'isሀ chiqjkJ]cp70)D/{,N~j#"Wg,d+h ݁8 c@ Kz@kq\IsEq3E&@608,:]t.auUj΄F>)z`)o60WET呗!*ӫ* ec.@5; <'hJv%3Tkio<@[b%Pe:{jOl9*FV} 4`(_xMtb,8] $Z H,vLiY38 (s[]x}?˯\U 4DzFpq@i&z/4J*-PpGXO}1p o6gqO! b`m|4 I(M6"!'#}x@39H/b$bM7~u B+VZsn=-<3BP 2ϑuQ3O  0g4Ksb]h (?奮cI[˹u,JRa&д[uOBP r(k5LT֎LPg|?$q$/m^=lTtG EfZF i5;OX\>,ݤ:6/w6Q,S u8PNK,,/h{dM{x[Ĩ[j2g(%I&4OZRycc%glQH SQ1u촭)$qX)U^ q86^H8Rҿ仛Pڹm*ONv L>I~"[ۆRR>)q^ Yq,+$[tjr<*ZYQT¢0}20NK7;w7FimiAi@3r9)20teJOZǮ6uAn*4h?_\/SKŋrG/=7ni=J K@h1@#" *KHێtjc|#ZԖwds=Ę0L}۽_> )9(')r<=6<&^'񲃶t$K' ^,)7^Z2q?b=Լy F%nJ;  s^sS鍖nNLUڿ#9JszrR" > rKF ',5x koixuS L0Pe1+$UHVc_ϣOP}™OP*.٬9N3u9crNU` Jt 14-N`Ɵ|/ +?y9BuCQ4nMR`BIENDB`wally-2.4.4/res/images/wally.ico0000644000000000000000000001027611676624760015256 0ustar rootroot  ( @  #%'(('%#  {uyvejge rCDC5 u􆉇nuOJGOGCOHDOHDOHDOHDOHDOHDOHDOHDOHDOHDOHDOHDOHDOHDOHDOHDOHDJB>muQKH\5[7![7![7![7![7![7![7![7![7![7![7![7![7![7![7![7![7!W0uSNKjE0iF2iF2iF2iF2iF2iF2iF2iF2iF2iF2iF2iF2iF2iF2iF2iF2iF2Y7$uTOLwQuQ>uQ>uQ>uQ>uQ>uQ>uQ>uQ>uQ>uR>wS?kK9Z?/bD4W:+L3%hG4YA5ue`]lZlZiXgUcQ_L_L_L_L_L_L_L_L_L]JeI;YA4cH9tTC[B5`F8_LgPDuida|k{k{k{k{k{jwfsbn\jXkYkYhWx\NfODdNBeNCtZKeNCz[KjXkYoXMuojhzyyyyyxwvsyhxfpbtc[tc[tc[h\WQQQg\Wj^xfxfv_UuvrqϴʰʰʰɰɰɰɯɮȮȭĨŦ}wIKLNOPsmlgdOOOvĥzru|yvķֿֿ־ԾսԼѷic`QQQypkKLMRRRѵϴ|u}ywּҸҸѸ̺͸ѷѷжϵϴϴγβQRSkd`KLMOPPåǨ~su|yѴͱǵ;˯ˮˮʬɬɪȪ˪yfb_tJLMshbĠwiu}z̬Ǫ˽ƥťģ좠yqkxn^[Zxxxp`u~{Ȥ}|trjfsuqmiYu|Ý}{zwvsqpmiigebgUu}|srpmkiedb~_|]zZxXvV`Luzqu{òkifd~a}^{\xYwWtTrQpOoMlJkHzYDu|wdghggea_|\zYxWvUtQrOoLnJjFiDgAd>b<`9uS;uuQôôôôôôôôôôôôôôôôôôôôôôôôôô ?wally-2.4.4/res/images/symmetrical_mirrored_tiled.png0000644000000000000000000003616311676624760021560 0ustar rootrootPNG  IHDRxUsRGBbKGD pHYs  tIME+) iTXtCommentCreated with GIMPd.e IDATxy\TG4D%bT6Yc&jqKLL^ߛɞ&1y,35j4c*jDED@₈>M7t^h9}zN=, 0Jr+g߿[Bg>y !_v,F18z@Gʳu3qOd{"Ls !X:V 2]p͇ /zo$+^q9I_aǎ%+z$&&vb2 sʵtӧO;))^niiq31`p HBH&ÇW_7oF^?ի6oތI&*"""}7n@j1zg穯Gnnn;^AAΟ?ϤNΟ?{ڵ{,&sΕmOKKsdp_"""d[[[1w\{)lNz%TWW{Ǐw>~8JKK۽_]]|ۗ*|||3rk6wm!??muY1`9s)ξصkd_lLf)S`2yuuuoX1WH"ڪ ŧ? z466"##'Ovm^###C\&+J( t:"33fͲ)vc;v]҂+V 33S|oذaVSRRk.=qqq`ՔCfdffm;wJW8jy+bBo@< `3'_|[W??dOn{e˖?m/]ZM ILG, @yeubb"DVvv6jkk1`Zׄ УGdddΝ;#FX}́bv]׆ PTԶҭ[7j<Ý}ᇡV;8nQQ.]sTxϝ;ÇmVWWcޕW \pў뢔`r ιdBg*8JL.HKKB4 7DP -- &M™3gln#!G\Cy󦸚{ꩧ裏1%?v׏>(z)wEYfJ{(,,Ff͚sZ5!( ̝;f߻~:4 ][qE߆1¥)1^F[v} VB$~.6mڄ=](6mj wT 9I#FxE\\z urrre0[nz8" %իW&h":-BttdOKKիW][ܹ,<G)"+Rp sdvS(",KJ}1ܘ0PJVCΑ+aC06aرx/eggҥK.]|A;aaa0m)((sk׮Ŷm Z-kOoرP۷޶m۰vZs9opppON/5×PK<+z^9kno&ˊ53ܜܞ`ԐsKӧヾ}">>^gΜѣG~3=*| ѷo_ ))IϺp޹{FV9*J,X>c>X`ġjhnL^^.\w^zyHp} iRpX's!y66m4Ob8C?aڴir]CN @88$Ԅ1 #ASSΤgz@Q)8LY^^F#W\ꢅ 鉅 ߻x"4 ˝{ܹQYszxx(8LI) [`o":yp*]Ȭ6j(|WlfXW_}QT^Vt7Fӑ1c$\|_GDD`̘1k&pa۽#inn9 2jڪ%Z!C߿R477;7={V=ˢSR[6w./~K)nox,Q>}qFa>>>ظq##o2XG) V;#QxU(J_~HIIXXX(1__~lj40;Z f9kٸq$w7!JlɓA[7n8.\jw!Iw_ `^&;]QJmrW '+n#)c| J%md0t1 _\ \} Rѣ[ qqqL3AIWk罓 z mn.keeMY:to6|) ̟?_wM[Y۷%}++V:CxV9$7nύ:8$3d))s*zwe%,g0`ҤIx]FpN'8RYC 4v̘1(O^SS#%+ÇKXGh4 &@V۳4TV%EEEh4 YQQ#Gǎ;`c^6}.gtu̇)Cl~-d-fΜKYaK.̙ Cle*T( 7L}d$AGNԯ_?$&&ѣ0 (//GAA d +((l @=.\@NNF-^~޼ybzRܹS|wHMM( G3aٳ5ܹx̚Zꪡ7ok#'Ew`0`^6Oȷh@g$ߍ1Wn3L{R_ŽmCd/n݊[77\z>V} /V=m[  n>L`"((Ȭ9NT"))Ib=j%1_%%%؅ɱӗʕ+8z( P\\SNW$wFzz̟?_}Y̚5KRKI"==wﶸ"*,,DAAN:bѣr仦#11mwȐ!hll z2剼lGey'JЅ}͍{erRM)Og0~P\4@dS"##.PSS +㘶pDFFZ~DD"##EGB Nj)%%%h47ydڝ *WSSFvy7ܚ}kt[Ba)~˷xe|PJUQi8!^~҅<0`0{tM_={]m1[W}___IPŋcv5bϔ&#++K|/88j.Pj9fee!==]\}999b,`4rpByyM^nf\ %穮bIIZ:tގBmm-VZb=sɐ]̹D]\\UVab:+ch7:t{fxWoYYju(PyY~lgfx!h?6TS)s633O; ?~< " eXMfߒʴͯ^)l޼yVw%׳gOjI9"::jpk.1t{|֭v .؜ե+^ 1J@Lr V?&xx<71Qb618 Fi4 3VH[\nnߚBnnnƑ#G$4;ի%Y:͛璐k5k͛'tXzeeeFXg hcttmH@g)h?&%hi;ޝgկ)waaa$ŔU4`36M4 /ŋ%i̙U-'IQ&vEzxx@y4:d ( sBHydw`0՛ H @cY9زe8梲Æu\Rb߿?f̘a> ;WXXL]=<&2=\*.ÿKUϦEE)pڍ< k/4|i pAB߾}$yyyhƪ8b5DFFbȐ!ő#Gpi:س-qEnĔU'OB촔{qqp"(+++ك#Gbٲe:}{rȐ!~te\Re;a^yK5ͨm~,dž= !'4`tC[VrxX@OB[p!|3f 8 >lq<||5fɬe-Lϟǖ-[$ Ν;oR:$<<_XՔ:Yۃ`ĕzlٲgipwLLn_^6s8Q$(8Gw0RB)}R˦k\,MQJ}%5˗iM`%zDkiiW?vQRTƍ,\fT^d&ǯojjwcc#rrrļ^^^:8fse7R/~3[˸)ſ):l=aѓlbcc%X~~>}JҫW/IzDEEI/RK6lppA_^F+^Oe`+>WX._!W8!9r$O.ἼP[[+I p`ѣ/<<,saޏB@}}= J%u:p( Y4aK~T*a0P__aÆ1}qqq븹S2mLd)G'p1 S2SX>:8]rhL=u. N!*w5ܾ}[-Lt\u~V+z/{9wŊxwUz[+zgo/&{Ot1 ~'YYZp.eQ ͔&rgӑ!RٵkA̒b0Jv  `0L1 ud" dbq'K p(o8 B[J{_K_{5I"dKG_bw>f|G0KGEE{= |+W)ׯz-bXr?v׹zx0)?pb BHjQp)|^b`kЖKOƎ;p5@XXFy9W\\3g"11Ѯpرgr% ( zJ;:Q`0 //j^B={VL\SSsvZ`3/es&z`0lǖ=4,%bcc1x<IDAT7nܰX ŚeC!""PpW?s2qM455!'':w(ooo$%%bOOO$%%}:999fKt`@~~V(b>`jɾ܉'@)uZG믿R*YIEDD@Vc 11Q4[655!??CGw_^&VG m/xx`0V`1F!䀅69ڵ ܹs8vxHHUOQQQ i8vΝ;gENNz@@,))) HmۆիW˚]`իm6=zγiNNҿL& U=z4(,,L~Mnnح[7$%%TlSR!)) 6m]x'cǎ… ⱒNRR|/_wZ-*8nct:JC@0?~84 f6k+z*4 ?.gά*.m v/OV\ ??+>g}Vg)^VaF=cLG KpN'cXB)=CFcy5 cC Ω$h3S>ԿRJw 1. 4+4hd߬'N* (**ۍ?aaafQXXSN̜۱v. 0 Xv-o.YB,&,>u|aaa?~߮_Rh42zib`!o(t6Mlc0̲I .,^|-LM-; <<:hlݻ#99&+99YY؈LK%PfM TCpVxtyO㏠ Ü9s,iii”=z 99Y\]rp1bDOс3OZE[Js!3W_0Mwlc0JsR*9(^ Õ)zIaÆٵg-)璟zollDnn4hPdnϜHMMERR^uu54jFTߗ rss-*DwߖD^Fe7?6 !L` 3$J3?kDN(tFfKrRTT$ :3֙3g$GSJKKۙ'MjkkqA߿qqdZ-Czzz?G҂tIp}V_p߿l$44mʕ+0``3̓&LOe o2N[$T^^]8v+gSa"'3aW^ .݃W=zٻΜ+))I\466"++j`0 ;;[̮၄&Я_??5jFhDEEYzv^֭sI-[n:=IMM]Btt4FQF!::ǏoWY{HHH͔555v=<|}}#䞼m:^]?moWrBp\ Xk `jYVyb?WzP `Bŋʕ+1,,!. CQQĮ\kIb 2kT*ݻ7gϞ_[|JP*AAiiHOO3;#G ==ׯuϴi@&SN%$$ ((rѢEnٿUUU0c$N=_u`8G>*$!͓W5aΜ9R6: WJ!غuxYrpP(x8q|5qDW+c73gH2 I'LZPՈ( Fk׮9\H]F#GڊGFFBV[UHZBCC% nۿ/_6VpabsP^gX9 !伍ׯ0 [nʕ+&bʕ+Qn̲%kOg N` OYQ^^|elhlkgFA]]yҔ 2qDgϞ{۷oǺu:`0n:IH@Ϟ=j1&@65Sչm9haPJ%/ϟaH9,*n>t:_#W &}RmW[8Y7pOhh r fO#55Un"}̹s琚jvܚgz/kJ]zьe{ ĉ۴HViiČU^^.1OH7!xGۖ CѠWVVBH*? BͰayY,sƽ 4󫸟 T9s7VL; Wk׮aΜ9å׭[3g=[52k3J ;2kKٗʒTJX /T*$$$[nNа0jIWdٷV^?ޠAVZɥ[nHHH="ݹu:yoBZ3U(N/6]r㥗^b37*^z%1 v*opȹvԌuUbxx$Q?^bիW͚')c/O>$jz}TZ"* jO>O\\Y37Z`EiWrEE !䐃Olg姟~| 5pN%78p))) :#//OABBS&dB1>C~~=鉤$'۷//^,)3SPPUV&=khhhUPPn5n8,^e 7nۿJ 4OU8b啜O~C9h)k5~,p:yٴ GPVV\Z-vލ۲ >br7np{n٠AҎZSoٲ6l 6l Ɋһwojz*ZCll燒'L*H.B5WA'Ӷ? ͛xmz7ϼLڍRg !=X]]>,,L7M딘h. Dbb"~=rd5cyҥKvE8kܹsG,#th4bO 8p`x4[:tMġC"&&Ft FIII-Ǥ`K<+8Q!NMLDV/Fq,^7nt ,^XG] > Ϭhٳg*)m닔z׵[*HII5k(Drrͮ;vǎ,b=yYdddt222pYS!ܹA|7dd|wnٿCʼn'l y{jdWP >>ޡ9-vh 2I 2mO>mwY7___lذAt&ŋwXRqoRZZŋ3}xzbÆ sugφhBԩSКO>JR\(JL<^^[oŴ=| Ih S9(d0ް 7d!+Oh:~'N'OJZ'|*= =ȩSjۻwoL8?:~ɬi "W.ެ3@f| geR' !?̎+-[~!.^F{akEx7[UUool~\{W իQs+{VUUVW\+f0ܓA2L)`z+7p CeC^\Sp { /YCnYv22X8uXO=%s!(ܕ}<{ [1 ao 9n؝8Tfsvc `Bɮ!wRv'öp U!PJUNrS9Sp ÕJce6'.=}%tL1 {PRJv vR yR%qOT{"Lt MN9; !Jfd&y- NCnBd+8Tl9UxN) dwm[ *r[ RnpARJ=ٝr `+'rx)8(% 2'Xb 9|ˀp$@̶.bVo^f  #WqZ3T<҉N\Mf}\=t^M2{F)˔{o+Mpջoc `8CyVz;tcRŋ|_%L1 g)oUf8wXaXϗ_>v[X7qw?[Sc5x} ;<-/Bs,}& ߑ VӕIENDB`wally-2.4.4/res/images/configure.png0000644000000000000000000000114211676624760016111 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˕oQ_[c+W.]хi5  g mJ[Fq#_)qո;,@{;upLTʙH$(Z XMɤni"\nt:}yD 0 \ ږIU4(r HMk̈_4_ziy'"[ n1rM_A`b=$Ik_p-qS~=li~3Bv"qZAԧ̸r[G]<&e!'ڸ67 yq$OX!=_~1Gs~EZQx&qWK3!ޤunkzGrjQnIENDB`wally-2.4.4/res/images/picasa.png0000644000000000000000000000514611676624760015400 0ustar rootrootPNG  IHDRc%2sRGBbKGD pHYs  tIME 4 IDAThPT?e] C$`ѠgB2MjX2dq&:I3'$imGqbQEZU"AI5,*" &vZ컿y{sR2&b݀?w_ܗ0 QI6m%R\&[=g~ͬ6_OD05G,_jApeH$`]E Uþ>k*+a;'z&]'֏'1-ͅg|V`~sIZ:WDsעyRCRW}Tǔ_o)eE<&L˗SZWsapTIjD!뭢GCn*͛Cb6c! +dCS8'1ML,//WX ~!msY<8=웧=C(7?w!dG}%}InXy"M*d{V;is郀gјinZ)/V^?ƎpgX8VkV^c=h)lߐ/=V< Y%–Y*lš+Ί"űLL[%RD:)e"ezJp:b~$Dd?R},붆bMvܹypBDн{ `(wуP<$OTb Khnt{C,,TD ^Esׂ'2}"Q2rdn~ y=XT!2rf+dS1?JAe7f<k۷q{8㣸] OM8 IZpu~)c嶞`ܓP<:ĢvA1B0!=i뱦yToאQ[0m͹̘v=xXF6wIُm*A*^oִ(UHL[p@gv˖p@[v.W𹻙=)c.D*Q5c ,y>ΚSAEz~#Jin\ ÷`6'.ɦS/mUxÉ.TS6yZޅIrMGelmMi3QܾD$Ș%p,$T,Gdg=#G\%Y@!^Wt)SB .7@5}D^ tl9=MoXbpyl7KUCqΗ2J[6xUzHq80 4 pZm?VW-'+JưZ+6²Rv-򊳐 o=OO֨ok69{ZXSxa^W Vf {.1L$Pٹ96(D"EFF]b K0 2% ٓtxK͍}&e#yf7}@M%T( C;5m=ЅI%ְ(S'^W5,x9#]'m݇!> đ\?_@,N~K&_d I'pu٘zJ˿Z\X]29QŔ)N."=`$4C3ĢvDQ^.,r[F AY(ؖ~`pYhgvڀ,;SRNXjD|D62 ( 8`~vPOoCvs 8 ]|aɄ[ z/Nİ*tuXİ*QT.;kDbՀ̱ <ݏy#~=庠q]}fĝZtlT3R%~>#w -;06m7wU\&IENDB`wally-2.4.4/res/images/tiled.png0000644000000000000000000002370111676624760015236 0ustar rootrootPNG  IHDRxUsRGBbKGD pHYs  tIME2JiTXtCommentCreated with GIMPd.e IDATx{TUepSTBYffb%.֠ TS?͌V\̈́7jl rjrQ?gF>X˳{_~><AAAAAAAAAAAAAAAA 2upK@Vc t:HAd  AA# 2pAA  GAd Ž1DѥuJukV>7\2bm;㸓^ &aF;6.d5P/ܭPHzSXXܓ*2pZ?z [>hٳgcڵt\ZE~:NZH% Ih4pssn޼Cd5;QQSC΁]8R TE*"::QQQ;wZ=d2SXzu}",8}۷6mBgݱfDFF ATWWH]ǏOz\o``0ωn%5 Al477ĉ8^t AAANuIs%C^^;&D"իPz,, ѹ H9sϟg˗/tuuR՜K<@zXJJҺX 2u됗'죏>^z.",Nq-DV Z,L6ͤzT*$%%!++CaΜ9׎믿>[oøxT 2I***D7dYFpCBBǏ PYY~cϤz_~~42 O=cؾ}{+0YA^0qk> jR#G G4UשSoq~i̛7z[[[|IT"99ׯ_!!!:^eg3]:0 est:ve1Z ݗNaÆ!<<aaaܗZFvv6ۭRlٲN͘1QzY:) 50?38r.&8QWWs_M2ӦMC@@BB?|vgg'v؁{r||| L"˲ buM6wS82L.\R J2… 񁗗fϞeɓ'-^Ç#99FaR,_ , N<]p-f1hiiCvk,=\ c !BݓVk֭Ñ#G9s}}SPPN&MԩSQ__@?ŋxG}|}}y=Ç[^ֲ2$''h\lW^?~`]Vj&G5z0>>I655u| zd 5+PdTϟǤI[wyǔjW0 #hU !{իؿceeeaҥ2j^J!C@&aƌ h~IjR۷oc߾}F단{ Z5`ΝXem63 [h!(/_'NxEEE4m6hw]K.5{<]))Mzz:Ͻ-굇+(Zos~%!'Nw[GkS*~C🁦&X)--֭[mªUx#ΣM tPiɰa/}+W2/腚$&&p @<0:1-h4Wnnnx7!8Νg}VhZdgg#11O7۷,oM0 cyk{Cűc?STTTy0y>?!!FoΝxF6ǣYL\{~*j̘13/Ltq>SMr^9+Hc ѣG),NDEEa=䧟~Bss}p̙3bvX0L)緸jxחm {q,˛O+VX$Dڇ^s$Nî]Bwu… ﻏ -Z$+wлlذ{[#aZ8Zl.K f͚OOOǒH$ t:3]__d? a0b^+漄}:;wQϹ9qNi9r֭[<Zsâ.j^BCCEoԩ0a7Ν㎩j&4h"""퍳gϚ5 G!v'N\fTaRd;\ғɓ'ӧڿ\Sx˱rJQ+4444ƌh 5p?ӧ >O|| %nP?ݻ6lU_;#$1oڵkj[x0puj!}Зk{7nĆ  (fƒ0v{ͻヒz _GVcҤIzq Dgbܸqd̙3;w.T&OLxyy!)) ֭`\\\ddKCzm: )̨T*AoKRAں憅 bF BaJE۰aàP(,چIaKlڴ7܌H=jI 9խ$c=pE8q"vx _'n 6$$$w۷Mqĉ{ q%{HHs%Gaf= /ÇAAz79sX69sTL/_F~~-fWVɋ^;֫RRLqspm'̓lnXlݺ2rok ޽[TEOMmSpq.T*D"VZFVVa|@LL MfRT*m{衇L!՛[o6?s@&됞.( OddE[K,dvڅ#G6ӧOǗ_~i566"''OOO?~s TVV6~~~3^x L&SO=EzXo~~>o0L+w3nm .Ihh(pohh@ff&}q0#GDjjY^:uO?#F 77RDrr2_mCBBBIeYv&?0 tH\,yyyFwO||\.78''F;rH$&&vqC;wرcm,İ֗M1l0#,,[`SV#;;jk2`˖-8un23fW_5y<^/˲>^mI_3 .{o/-VE ;tZZZL:0zߛ7o}dv#""Ϛzpuuu<Ք)S0m4xxx $$uuuvfYcݻLf鵽^e%dk˸at:v%eIL>>ٳAܚnm0Kra$''C/T˗c kҰVߑٱ7zc'xt]E Ⱥnet:rssqp8ù45 rss-*//Grr2jkkm< VX!h{kzY 2n; èAX aŐJ-LK%%%8sݟUfK7[mV7p\RDHʀ'"""/^0t:o.Hkk+![e?pۆ +W"$$:^e]=XuM^aB27{VѣܔGɓXz~~~عsY7AFAvv6}5{^ aв/7֕+WP\\B_Eaa!J%zǁk g֋Azm@L3yX3"_T* *cmAjkkE\ 3+譽KSyI&aԩܼb\x>(/0|p}=*8GRWWgt =([%8#|嗂]fϞO>aZWF_@@U\\窺JJJ0tPiX jFbbbn۷oeYޢ`"!zcǎ5~4%۷!.ͮ]f,c}- o$6pUUU<՘1cg4\_L2(**z eee}N6P(o+xI ѣG)b@G5b1em7OOO( K3'龚>}:|AŬYMMMuǏeY|XX"!>:Bf@EEViKMyU2( IDAT9?HpNV#;;WY)Xaaa\YN{ HNN a^s^ 8p@Pj2shl2TWW*zj8Ž%PǛ:u*&L***¹scjZh4h"""퍳gϚ5 G!v'N\fTU1 sh9PTؽ{7VZei!<3^XW }/ٳgvoo2M \uu5/H`С 3֟>}ϟyunDСC,ZHtÚj [X~UWWWQk-[0i${&-f___zwɓM>qÍH$477R82 WT"鵽ޚ\tu„ D$̈́7̰cNm۶ }W6#Ѽ{Nd+C~Zv-Z-/7!Ak,ݏ68ғK@zmwƍذaCW_}% X0vp"##QRRb#Gą f"' *sNתUw߉* /@PX|:1$%%aݺu  )) F =cǎŇ~(ݻqacDyQt:N#zj3_>ӆ7pXD[lY M`8F/\ÓUe8 1R隒O-w Y)#',k"e%b= |2PL2pAb Üw` NL^@lJ WI SX.q 4"b˲MX@l1-˜ A Gj{[0o .0P `10I lBkc ("?;=a g Abh% \bO,;Aqs>BAU0̿J(A"z ,`]T/S@$Q&q ˲Ks0zpAJ2 sÉA[, 77Q8aYL"f<)ՙn&0wXl2pAX˔1 S<#+S A #fH1. 0er_/cEA ?Î\ChIENDB`wally-2.4.4/res/images/arrow_down.png0000644000000000000000000000057311676624760016320 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe< IDAT8˥?KQi H*.EA!XX vc!v{;,ӻ\}Ï7Ibc0u2B^h gw`4+@jɥ s5"H hPǁh"H.EBFݜ& 5EɃZn+;l8r9~c$ h>*k>hLLjƳRwUd:<$hݸIENDB`wally-2.4.4/res/images/world.png0000644000000000000000000000163311676624760015264 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<-IDAT8UKk\es3d2I&˜JSڦ15B (`$B6n"4U) BKj)$iRB0iK.fƙɜdΜM+|yxx7bg&GG#@0*0"uӑvc L_3,ۈ _Rȟo~ &G-/^l|)J$pY16}KطoP-h3|k u !t"KoST-J>`G0*'>~gϫƂNz$} ǃZ ;SBKym/Wnļ14z]C4#.@)l=۫D v"~SbTHw[LH9wb\gBIw(,E+Msw&`6]໤vT"YKQ[(o6Ll*4MA;(r_!Z"@WMte뤶FpVC< eP !fJn5IşehM=Kx7!H[47v6 TjUCiȱV$V>&d%ױ4lcym wd]ZN&c KSغdr+@/r(ϙ_.(K湅{ zZs(.qim[XUҍ??%f~3s{~OqLJ^B~ e(w3srFIENDB`wally-2.4.4/res/images/zoom_out.png0000644000000000000000000000130411676624760016003 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<VIDAT8˥kRQ`A nozѨK?!eMmm9%Mٲñ&5d^lxusnSA/ ** խ(6ZDsŵ>9Gׁ 5lcf l"|n^'iṞ![>DQDί'r::;Hjle pg,.\ ZqBx5K$b+M,*$GmiQWI2V&ahQQU8Qt)!?D~s Ht+TZ4 Y h,Y9t)>;#(D{k |sG,â\6o7`֧GKD6,8|w#ûUK3A.߮X  4w6p^8{x}u6xYWí\O"bKe1!ޱc[ 'zf>]"-Sl܃<^ = ɲ 0ۍan2^=D6ܴ`cw)䫠iJ|rRIENDB`wally-2.4.4/res/images/china.png0000644000000000000000000000073011676624760015214 0ustar rootrootPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<jIDATxb@@n", @,@D}5o,Xx? $}m&i,7۪f3˪ u~,@K/k붿fϯ/AJ~I( X@u8M~@Uk q8V7T@@ / : D UM@ @ĉ΀l0X X@$P (7xX_bb<Ȍ?Ha `:s056IENDB`wally-2.4.4/res/images/full_image.png0000644000000000000000000000112211676624760016232 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ݓoORaƟoqM #EDrHQ"uv<}?d1&K3 oI x.0x& /LBeKX;]k ’s|GgqDj~#oъWa-z|2sD>Է?2XhG%ᆪ9_aT Q3Lk}<8íCAh 6%F  05@z#OsЭ\Έچ"ݚ/ h7UFep4=s 6,UDD˓lL&11P㚮eXO肼`pكlYsu͍cN`J{C$k A* n:=zZ'_ݘ._qYx@hμp[+ZDKaHrT_=?!ʄnnY>}M~-7IENDB`wally-2.4.4/res/images/down.png0000644000000000000000000000046511676624760015106 0ustar rootrootPNG  IHDR7sRGBbKGD̿ pHYs  tIME+[QIDAT(cπ01\ Nvnnn.NN_̄1 |H!J-%G7DSP=SAjHTθ^+׸v`gsEfLvnw|ZE0:AP,Dt @@(3\N6}R)&h]9w̿?6\0ZIENDB`wally-2.4.4/res/images/google.png0000644000000000000000000001113711676624760015411 0ustar rootrootPNG  IHDRRIsRGBbKGD pHYs  tIME 8 ;IDAThwyygvfwg{eU$"(c7@$`bVTTRe)[2X|{ϙ;9sAD1CgNmbNe9"$ߴ*_vP(4a2Y$[-&hRj9Rs us3 f^f6sU?LA:CϹ^lhlCC+m\hG[X_q J!3lZ~`Hk#555$>DPkz=/~0mK7/MwC-3Q^qVDiEW>ޮe<++.t HLP4+d4 RBx$u7oUЦC;^14Rbήh4/dF"LF EIVv* ͷl'C BPTQJhK Am ͳ ybDql]dîͯ~j-;d2=R @zXsSVmd{QIO!kJ7HC$@"R9}m2A8,{1LMT[4ٱLiۆKʮZ]K:+7_9~_ΔIf!Hd`Yqdp *5}G8 Nv7 >mFFt~ܠN^iAXx"%pQ&|{njqHv)ͤ. TWF[BR$l50an<3,}=&C2P fѓ@2?M^8liQD@*@Nu+% x 2ܓn|esn;G #Oh\t:g&U]0Ezݵq/;+@<:v ht{8&5fn(ԽoXDr& ״$[Ԥ0ᙿ{V;O(ȫ;c8!RyY`+ܔD e@a ޜs䃔A\v,?U4PY!4nx,['h 2plM\jY M* (-*pF>r$ZX t?l]}|Au8%k\hn:D^'H7SE(a$i I) " +U(/i>z nbP(NV-He+VS-VdY,(//QTs{^*!:CxhpŁ1!_/QXX8a5vÆnUT,ɋ CϯL(cҲ_ɗwO\㗬@,M)eH5ҠTɎ@YЕ==DRBɗV=oi5"JI } ۝%4:]!l 4Ua(E^8 P0L tR]3uKb,dq{΀a?!j4_t֎P4D" ѰLɸn>$dHux#7|n] B\[xjO{[Γ% [4L 9 ~h?2TmhZ HȲ!IKT"aD{܌|NN{!c~ d$~UП8B3l4a%? s ]g%=^p€7h'_vJ6ٛV|B5Dgn\[By tC,cڹr󋋋srrIR_[x^D#7V! 1,&2G4[| +kζk+Y@@'F^&@Ci֍QJ%h䬝d 6DR3&H$ڙ͡X,bοI1:d2ˈ>gGD͠+4-#|=\&exf`U9X2_DIt ͑@P*{ziKʩOzszŴƜ1J XF׬}|ӣcBUF;,7iopҫ\7zګ9Y93;;;?v'Y^P#%0贍Fq;佽X,Bkk3mt g\I3<v%*fhPT\Tgϻ8 BV#Zp%S)(j^Z6S\\lɥDF4QT*;å@Vןev4xt0  BA?Ҝ35͹˾q:6('A:X,wt:mEaY֧P(ڤR?MWd C[IENDB`wally-2.4.4/res/images/move_left.png0000644000000000000000000000060511676624760016113 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8c?%.d~؞: Hy=i'ـw=?k^7I3 jyK;_B7.xܶMk'΀Λ>?uNj/ZxSOgcõSg_ɘcUpE=kkV>6… -%c-?ouKz4y]d}[Ev'+! [nY`俰d'eA ̄ЊOIENDB`wally-2.4.4/res/images/up.png0000644000000000000000000000045111676624760014556 0ustar rootrootPNG  IHDR7sRGBbKGD̿ pHYs  tIME,IIDAT(cπ01\ 2'Ep=~Nm_CAJ`yYyXx, SeAA4qBLzz.? Y0 7drN^^  ʧ30000g``05`*"CIENDB`wally-2.4.4/res/images/buzznet.png0000644000000000000000000000471411676624760015641 0ustar rootrootPNG  IHDRT 7IsRGBbKGD pHYs & cAhtIME0 f LIDATX}yWe?{npA501W&qIL2u qri$q_pTphFmҬ\k4E(D"xus}㜻י>~M<]|?dzG DZEb6s6΅'_DE̳r) # 2T@4_Г 3Ơ$)G>{[;&UlBZض.- /x{}A@PԁF :,Lq-ZЗ켛A#9(° 0X`K##@硲 sڄ(Qx@mtɴcW2?d2P? L;9 ʉ0wIAx ]L;};ZDkϊK~@Q-" K%BQϱi@-y}|Ւw@@EEQԶ!zҺBBNja%,YЛ n,xP!@V6H@ZU><^^Z*Ma$B34C6>sN߻j^4hL^ B\WV7mAߞ XJ\=D8VP^>&rcp$#f"F6|!֎*8m/-T.A腨@Ck&\/à!-l6>zOv\KHeC#r)^B$D5Cg5#9$˜ݸ3@cDe161d$A5"MC`$لL;^8&}#.e'7CDvu˕X{<"8:kg8v|]3ATA)8Fb Loupq%sNhNfgX.qn1"1Y^؅tmĽ,ϱ;<>~ ` "`$0xY(I!" }?uxl 2aeT=nW?T)|0/m\/ǜ^UUpn a)@9yĨoD@six`u YQ ;- ',ؒ"`Pru5KU<" J\C:>C&^$(16O;BH'mͣ,`JgM7-6}|o~qsI2(*%EIwzܰiMZr {ن!bx` w-}X c ҹyI Q. en*MiLV[ASkz5ܴ`:bQbӵ\lЎOL|.0e=-@Osl"]B#f! uʠ!'#f AqT/ )"4i۬zOD$ %9`;Ň:j1fk A"@nkC 8nXDp ꨷lC>m[GK ra1D*'N}@{@ i|Q؎7vbFt{'j0t "c6$;4M"@Zo_kNdo=7, 2)4K^UouDD NS$/;8w0il>@uCZ38嚲#Ӟ(4WPM,4zMꇕp׮O^J~'9W8}Z3t7;)PFՌl0ݫg.yn|nsTlrb1xɵHwg?? -ynos Ha>чJ&b]% K93ԣtP,/My"`gGi#cZR/me GDA8Hݝ)®:Һ-,f.޺Fe-)(>$Vй*8 *&Œ%V; ٞqHO\s/^シyDCM EVygD@mZ qbwvA(Y9s:TD+SM5.n[hh(KhI;D +I+k6!A@ι;FQx- 1IENDB`wally-2.4.4/res/images/off.png0000644000000000000000000000105611676624760014706 0ustar rootrootPNG  IHDRasRGBbKGD pHYs  tIME5IDAT8˥;A~^BFBg+Aj3X}Ɉ8!A#M{Fb{-mE.WUW"[$I蜋c~f_O8HiY{j 8EQ5Ӊ@n7D͆^G^g6!"!i1Yq>ce0i6<[1"R =9,9l)Ƙy^BsrncJ)*J{1Z(njJVC)nJ(.mDrz%ɄNCP@$!sUB m pv;=eєé!f_nN3_z3y^IG;㱛`dv7p\{ Gڗ BȊVssRұ+42TBϟt=Q-ޑч1?c`kAM1R|%Mi 3$4SE[+)k3gd֝>"oM][*$ qYzGq!]ӳ3a1OXLeA v\#<ˎG8b,>&`=7 z'P-mx`*> xKtaBF?9'|w JceUFFgH̍<.<%!y|w٠ y@Sƍy-N`^q+}43p:ΑX`LY XS2lurhT!-ņZ/Y2+vLXz䐵:M `HG !bTPjģ!Źׅ S #iS`=kb+e`F<8Ht(G$R;gQQ@=l)R3:tE/;(V$>Cz(8eEeѿ} 3h-G[ؓOlh]K_gn)~q[9{+[AJGHFdRI!N*ހv)A4eX-iB,)t ]P~$u_^z{ Ќ#^~ { Њ+:*]S#[x*m0ݣ(>5h?D\AO :~F_C}'`ݔ+gg-Map!D/sH#!< W3IENDB`wally-2.4.4/res/images/cancel.png0000644000000000000000000000121711676624760015360 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<!IDAT8˕NQɉϠVȑB[( &^M6M| Dްҙv:官J-%Nd LB>w_3:*WrlNC/-좕B'{ u_a46ҽbߡE%D47;ٻƩ;8ˣ}>6[ӕS@*Z Qk>~͵hB\9uxZvYb J Cيٽ?BYvn&kft$,d9Zap\^ Y7 QJF 9=Q4 ؜Io SBpsI) Fv(@yՎވc\@ %% Z2h'@d(<|áaJuM@O⤁LGjd!X8Af 5J i K->w62ƾWH}:mP]XB0QX=ib_g=!Ftt…clrIENDB`wally-2.4.4/res/images/center_tiled.png0000644000000000000000000003012111676624760016570 0ustar rootrootPNG  IHDRxUsRGBbKGD pHYs  tIME769ΓiTXtCommentCreated with GIMPd.e IDATx{\T?3IRZ (x T$V˷~9vꜯ뫣Rqca0T[%/ܼ(wR.\~f68{~|^{gzBP( BP(aτHؙ4Մ9KR(m"HM*aB~pN^BPgLq00Ro &BH}GZ^xjeƃRMQ| 7?@KK:!!ܹsKؾ曮nnnRZ3gKHHh{UJR9ҮEUYYTըPթ:w„ /vquuZFzz]v5+ R)bcc]N,((h6o1VV6m;p@ۇ~#GtjiiQVVVj5 ԩS[ϟXtzO8Qcǎmmm9`ocId&YW<<,HvZikȑ#i*K! l>Z󂦨d!3ggp\ÇHSk3g O?%%%ptt{t mޘ>}:Da~k!zsss} MKY5 طoqww/k/Zr>k&( ^8xdd$>3t+WZFss3|rcx' ݻXr%**szyy0k54 Lײ[t0)S`ʕ/..N^@pp05pVªU8qduOFp;;;L:0x`RDFF޽kp_wz,L$vF`ggByB FZ^xСCoǎS)k?ZwB?___;=HAA ~App0{10hnn4|tuJEEN:~zH/EhQ( 2zaXbQ \i/\]]'OrEuV\^v,((0vgƍ粲2׊R#99Y544 -- .K1Ӻ'liixK [dI OLLDZZDŽ Y hmmeQV".\E?nRR5pVk+fp$q5<ضmJ%mɒ%2[gĉ,0 Ghwܱڵk@CrXzuB궱:jjj8{:ҥKغu+}FDD`M^^JJJvvvR"rf;~D/gEÇcs-Zt'?dΜ9vK,18/_ڵkRLvjnn0jB|||Q YYYxL8ti:ontL&Ê+hQR@4`+![kɪӧOiv3g4< {E~~>;kr Əop$ ^y}Ǐ0TXtٟ:ƍ#Fq±cnj?$$#GDtt4IJJ޽[zGޟ 2p AԽQE" $$8++Iw$$$gzȬֆLܻwUL<=gw륈L&JesΰM6 FKKK"s7'?9o.Jo-PГ;v,N|2GT"11d8::",, ...xiV^*ţ>ڥKD?8ݤATyVWW?NEH)g훃͛^-ºujڊ={`RZIܺu ќB# 11񁙏,M=y:`ĉP(X7#55dڊ]va&w?OpukYz[ZZf͚1~+ ,Vɓ'qu={6\]]111F8@8ֆXNscqvvL&Ѥ 0'~%^akk0d2rjdggcҥpqqJ2ǰ^Ne7\.Gff&rH*"<1zf{n^1kBkxH$غu+|}}-Z\ʼn'梸.׺RGISg|w?@#?QPۏ?ocu3sLTVVӧOߟ߉ڊVN1ToP(*[[ێnw@ .F?zh7DGG2ZIIIx饗ك j;g|ᇽBY JԤ&JH$P*hkkCFF`s\ V.cݺu`9TeMIIAiiiOg i}):~iH]< 6flڴh5FVVypvvhʱZɫ bg.NGGGcTݼy3gZ .NDr9RSS_*Zצ,X`V!Qvjkkm z,˒̙33fٳټA^^pmv[TTbbbLqz-CoNNtmjBhe9x !CٟL&n*o,wkkk/,D"0UתNWK<  aﴵ!33SPX!c˖-8s= ꫯ>UUUO]7#AAAxnj޿/Gw׿Up\3guת @PP|}}1~xv{nn.V}vٳx.jײ3?;v  J '8ل˷~ aĻ+unફqUvZwwwSLa3]ɑ#GB,"..TUTj[f %%SA̛7OuiՏ`Д& ƍ{vQ D"Ayy9޽> e i* dggՍUXXTTT۞z),]ׂPTΦz-HknLyQ̀Rs=rݽ{WkK,pvv$ͨQ~rrrpuwAzz{7EUUU:XToussñcǪ !ɓ'q < _ciTw֭[om #ggsӦMٿrcS([Lƹ@Ei^^]G & //65E息XhsaF>{ۼryg^֪ 06Fޅ 44ɓ'vJ\QRR^O+ZkݹuTo)bطo_8{{{DFFjWM ڵKPۅ U3~~~9+~~~7V~~>/ǃEBBgAܼy3;z{^Dfb޽c7{J:Y;?V\)qa 1 \и9+ c PT}6n߾F444uDCmmnnnXl'] rssYk}z)̈́ .Hpp0<7o伧v A}РAHNNj b܃...2e np2dX7Vll, ֭[ߠT*q% G6k~@bb"gETTP(qQ֣FKyv>Ѽf(IIIxMNcgee޽{F;h Ɗ/nw-nkk;v`ذaVu튕r(cvQ0vX6DAAnܸV! 8-fhh`r pMv̙3l2ѪW?zK/Ŵ /… j*g)B}}=~ʻθwIDn jj5kfu׮X.CHH ... Ï?Z dggߗG7IR!޽Ddffۼoiw׺RQTHII=2'0ֆT낿sժU… sQͧ~#Gjx~M~uOFp4ٿNaaaRDFF34`v.ɐ>فb| ld kEz)\;aÆaԩf?/&Mw^_688֭ھ#d84IB?___5+&[0#..Ny}***8:___׊RL3 -t&.&/.\spx Am=<>${Wqʨ^+KiI7oontdQ[ uuuXxnvvvHJJ28]$6 [dQ n߿?1at.P?b]]k%z)\RSS!y|}}yT|gV1cQ(EYY׿0qDM%< ` +(D~~Q@m88,Yb֐28qBQR־uFhh( ?Ɣn˖-¬dB:jjj*r%lݺ춈,_\[}PRR™JZ^J;ϟDž ^L|&۷o֭[?]\ǂ]Zt'G3g͒%K>˗vZ444@T"330 覗!f W(buvvvxwxz-S/4C7رcg]N:_P[OOOرCYVox랬\` ػw/YÕ+W:ML~+ެURRq 2FQK/\T^m=3uTdddn]P#ѓTTT$6z_e(ܓjjjx'@l=~8ᬧҥK2]7n81Tu襴sAF?x`̘1ΗqMNN6y|f{*. 2p AԽQqC" $$Ru_*$$$gzȬֆL6 &O,-kyz)Ϣ[[;9sonMKƙ3g}zl*@SBObرf;ɄȉrttDXX\\\pEӬTG}ӿr#sz-Gouu5|||?㎋T<&޳<_|6ƈO4W&6l21e^^B $pݓ.$<==1qDv- HMMJLwڅݻw ө:'' ^҂5k֌s?]af!xZ D@@@wtt4/w^]̯'HOO j۷8auO*J#$lmL\Zl,]...PT׋ M.#33]*JWWWP_~v:8Å L6z ]=ׯcٲe?cqttDrrrw y @?VWˋ|YꊐP֡™K)b-XF,^B7ZUZn0z"ÇǵB;uIDATܹsw?PՐJ A |||:ҫ<<端7k'9w0.of?sO jݻw?%n:Z @B2X899͍پW=Z[[Ubz 蔔|R'ظy{{#11W7s!J{B,닢+**p18Sj9;;C&HdK)0~~se6C]];z iOR ױ/x&B_~ڿ;w. `T*AIFA"V9 vvvM6u&np&r_\]va=}zz)|'B 4΢3g"""ҰcYOrEEExA0wBrrr;v`˖-a SNTb߾}ظq#'Omm-y JKK?\yJ[S.$xb{' v+Xʼn'kb[UGR֭a!sYpGw???^֒f͚n9JvoٲFqOs\_VVӧOmmmEY+ֆe} @Z^\B賹Cou5Վ0w\l۶6O^ZWۭFP+V=iT*?&w3Jmmm@TT>ܹsMέ&˱n:Nߑ#GbڴiTMIIAiiiOg =9h <䓽F\TT/WWWÇcΜ9f=wy>sXbr{UWWsƏggg?~\TTѣG}LOOOxzzt^8<>}:kz7oތC:hK0<ΧMdddʒ1i$ >FIJJ2/w j-[<0K͙3gp530{l6`EE'c}wNv(Ę|P7''NNN65d!4Ѳ7ӛH$x饗xQ]m?!+' ֗.yBCClkkCff}I}E}}=l)>a&z-GoUUS&4ٛ=^eGaRUQV*HIIW%8Dr6a=44-P(mV7Vaa!PQQn{ꩧtRQBU*^ {ڵ6Bh^T0 3 @PPzf!OfqWÇ}G7ЋR D5jϾ7YNN_na0HOoF||(< 'Oz-D;VM)v{ 8bߣŤMKKڵk8p d2YՅ#GggsӦMٿrc]= LmBfΜ)޼\;f̘Mff&JJJxQ(NK/wy^"!f&Pέq_pvvFXX= ZrdggWVRuذa...T*ܰl2N械TeRmaoooUITT=ʫMrr27Nj<޽w3;Mk+c I]A{{{+**F(Jl۶ oD566* pttĠA H0x`e".]Ç!& ׯӔJ%9º ^ЛM-Y;^ #GDbbt\.}ǻbӦMptt4տyfz@2+ a)* 6޹s`$믿0vX[Smذ_wQ477H -)q=z4&x299^MMJNswwå}QoII|Æ o6=7xc`@@Vrƍm;֡Y}uygznæbz;vWVVE83 WpQ2i7ߴ) MoP_}UL4W?/_6!æD--ghr~CB6мTxU'> ߝ&+x ׊Zc G<!i@ef d#O3pf-Ⴑ}&t5i  +B4cuz>͋}PVJY*k3nZ~ֻ.e0tv/DwpLY8 `m00mUu2O&54i̔EnV06^4Jg aRţ6+iƅe 4(ܼC@3$ڭ7SQ֭x0m*j}f%਷y0%amf#5wf "%/kze$C!`$fyr^RS= ` V`.Zz[U0C,d },2zU-@?a@:D'xu MS0BH5'R(+a{pWJB!(Or󚪭al( hz) 5px|w,Mx>z[/BR(@.p.v=N O HL2S?=ʏ[z){͆6 @?7!-h䱝:*i[u'6],( dgc,VYltrÙsӗ.ƙw6XY)zƲglEOd ʺM6g^ Y}}}Z4;yL"9;"JLﭘfk\_B:fՄ`pM@ R }ʖ鱵8bWUqI& o+0:4kp'⊘p&u6)|ѡjK\*AI*"]?];O[iES;؛o={LJTTKDK"u\#&눩Ň#eTf0uL 7'1cILxKK{ Z#L#!qwTSSd-!$6qIP'vj@ =  L yzz֣gEI[ş5>y-w8u0a3r\9j~Mw{ͽIENDB`wally-2.4.4/res/images/yahoo.png0000644000000000000000000000407311676624760015255 0ustar rootrootPNG  IHDRR(ZRsRGBbKGD pHYs  tIME 6tEXtCommentCreated with GIMPWIDATX{l?yABx AEAqѥ-]T " l CĠa[:F Z*]N]YҐCH~ҽw?-?I$ӘUbЭ,HcckyJ{yQ9km83T㧁a}㊮/3n_~e p E}Y_FR!O%Hyƒ2ZOuPVk]-SLnV@*nŠnN#+].tJ`&0pvW؇%?PNuykUe;`=/)-R" oHŻArDٟ(i R_(zܨ%|TVT\mϿ[Wq$שּׂ}[{b9Eȟkpw\S1[ax H8.8,)R˺@ G/Rn0_+S+*y{1'1~?:odsI .ژ?+#*:Ʀ1*ȋ$:8wo82q fp6\$n4)G)B#`rCbqfμOX6g?JŎhəEd(Q йSmj]pZcH`d™20-}Hi|Vgq-)Dwr`VwZ ?  ^J1/"@ Z}SѹI#?5QXG4qGj76,Y4]yzJKt_RIk/pըPYߐYnیR _V ns𺏲lLGzЈv K)SmjIRTDM[ 3KQrtr[>N~@~|k27ӲaTYeגIwuݤu32"S"l>%&yG/$TM&AϪ#0 Apclb (s(:n\v[ѵ=Q2,knPs,h(ofna~G, ,eB;FP#3.֧E'5:0@nf}gg_oP᡹K?ڹKt(3?% 1yKvpĒs~x)+02#-_ܳdh鎴Zuӡ膳]]#e1Ԓ9ނ wHu Ε oI+2oYDSRdu0um|?7[˼k/|-?mwtJhPoD*:˃њkQ`NIUYQoh!c}n[33\7b^Tn 3crUq #Rs 8Wԩj;DAXwvK"MIF^Qc1W5".浍n+^:u5ٞSir0?2|Tʹ\P h~@L,'n׳sLr"ڱ0q@X^w\=ԁ%4O1 tH]ާ> xS5zʼ[TFkܖXvPA4wXL;*sf8fXfkXH_(]wx~zJnnKZ3uxJIW>7e{V g=p߈q$wA9UVb_ZQٯ0L&+KDv#mws0ՇY}eErt!@k~5@],uTDr">t'm-n;: .IENDB`wally-2.4.4/res/images/scaled.png0000644000000000000000000003072411676624760015373 0ustar rootrootPNG  IHDRxUsRGBbKGD pHYs  tIME WiTXtCommentCreated with GIMPd.e IDATxyt[g-־KYxCRZڄ-2LKt &m9mOI irBBC&PJOv,ݒ}DŖsO?׺ѽ~o@ @ @ @ @ @ @ @ )wL03p3L03@ D@ G 8@ @ D@b*Wdj%5nC3u", ƾ *ըDoϯ/HIXr*3!VBYxwwxڵ"8GG} kU0o/UiaݺuOJ-ŒSOᣏ>"A_y~=8@ SHePi|>yF fs]GP{.w,\PTDR^{5lݺL ݻ---U?^}U|_$w5fHؔo<|><\.,k֯#N#J!J!H NP(͞_Bo], \.555 d_@d2ܹ.\('x/2*9K+ H$Fp:zHRJ-p8H$hZjjrxYt:  ͆~g[+-B< :FMMM0LN 9x >ނfC}}=Dx<ݎ/bhhx,kBY(fR؈E!C$ͺr9DQv>}lfN,D"z=R-; OgO>I&0?.! bxx08\nQp8h4|D0 Ell X ~L&@0\.G \.C]]Z-R0p7On7t:L"pt:@ łsŋp\SG-|>& K.Ruk4!N#L"#N;bbE*B6%O!x<{ŦMȄ.p'Hfrattql@v. @hqՂb? MbEꇰ0ömۮod2dBgXp~KRxC6qrI?Sx衇\駟.+G`߾}UW t( v;]v tY2C0_*QrA.r! B(x˅P(D"ڜ0. .t:   3X&a@gg'ZZZx|_L&غu,oߎxL2C^{56?W|>`0HW^89-&RMMMXjdh4"n 'NĉSkkkç?iN<3Smݺ\o,q{Q376,"n7\.< eB:/FKK VXŋCP_K$p\z[yb1XV ?Ʊc`Jǃ`@[[ftttd2z4̰o>8)}3ASS:v۔رLٳ,q x'~J `6. nt" LthllDss3R qx<\QB `ddNB?qy, JD{{;!Ⱦ3ϯb?8JuYHĨ MPkN»ヒ;3pOU}]']Z}$xFlldNB(M'p \@8taZPhllDGG֬Y+WBPɜ=f=z(z{{GYގkNyȴ[w{=lڴ۷kefmaQw@QTt0 0 tjh4P*H$* wq"z{{q ?`1\.J/ʕ+rJ,_FqNV{GF??R3V}s 7| ǎÿۿ|VOƜ9G8NX,"8mzZj5J%J%wLT^@fp8p8D覣 ~Ed`q :tGũSrJ&t BL&tvv˗/NCmm- *Y@ Skll?[8Op12ghh{oYѾ{38'P( N#tő/8. L^R L>O79FLrݪxhjǃRD}}=F#d2|>{*uBK}-P(.b`ppGCp̙I'աAgg',YB . '2lܸQo۽> 3 |>c֯_m۶9˜X,FSMJAU`PT0H$EL&CWJ'W?YHR)\.>}8uΟ??i"X,F}}=ڰzjh4z!\Ѹ|ѸM9ٳOv|_d|̍7h\pH=jah4 t. BHGTcttV>o ƱcpqX,bnIR&a͚5Xz5Kf7~wrH$WUnٲeA)~?0Zk׮9IvvD"5B!d29R.\.BrJr%Ix<l6ZBzP$\.188~ {Dٌ+W˖-CCCr&>O=#wQV3 6Ñ#GԜb1?|.޽{N97ʒr:FP\Z V V \~ٛ͆P(B#-5MєxGT.H$!9rǏǙ3g`J&@RaA{{; @&@2Y(o.rxGo6~_Tżf׿F]]ݜQ}>߄ݣ Uh4"ddXLi1LP(JSMU~e_ r4 JjB.C0ą ۋcǎ̙3zE-gT Ʉ%K tY4"n ;w2 K_nZ[[7|34͔㨨߫Ioo/;si&ٳFl۶ -ۜT*5!}iN͆L&C}}=h CgX^lJm9^d#^/l6N'xEP( L" ##ϸfp8ׇCO>Aoo/G}OV|SBGGj)aaFoO5oVt@ wFcx≫~ͳ2yfwc<^PG{{QvNB徙L&CP0ZXkkka0V PXt\28{W0 B( ǹsp axxNTS Z.].Z MMMU0;P/HSЀ[neZpaFv⥗^*7|sB"p3H"K |Z I@l6CA*hFa` JZ3ӵR(B"bRTŅt ۍ .ЛOF(*yX,FCC]7PTdu_$I߿2wl6^{-F?kѢE馛D/޲e yApl6δD*%*.],fjz:d!b jNCRA*O8NMl߃C6=l6 ߏaLJ~:zǎ~x xW6n|n͆`0XjT*ZNNRH$b$p\..ʬjV/B@9NnMO%,,6 6M;ŢfR8~8=3g _v}, ":š5k<#Hܹdx֭[+뮻+Vr 80oz/~ zޫD|>T*@  [cB-7C@eb1T* ]%%Nx`)W rA$ATܻlĂިB|>Oq/=UԩSӧ@bPnEXtiՄI2s=h~|T*ņ pĉ)ߏ/}Ker9X֢H$B @,nUT*+Rw??3nll޼wu׼^jN; B!%nr9L&]d$IA8@,C$%pBv?R}ƐdN)ccc`p8W,thCCCÇ >i[mm-/^N :$qh^{5)uuu6]l߾}}co>vb1WH$wol6mVR8aWtw_1,dM*Clp8v' Cq~X,zZP(taْ$pkzxS2o2FGGaZׇ'NԩStdDB[n]]]Xd 7e'q^l nV+Soe2mV{/˫:~F.`ロqR<,p>]!Ur`0LƄʡPΝC]]](jB2?d2H&t@6ͦv#LC$!"|>H$HRb.! fF?^oR$ttt@:%,\~1jԄ뮻⟿yfFꫯb.wq;~?cNƭ:UdH$`Zv'ިHpEJ(ZZ hL&P(˅P(TVD%brrxx,5ڦ㢌D"X,G?Ξ= ͆p8\rZ.cѢEDWW.] ^Očp[la4Uf3nfFcV NOTV27pbV_KRӡnڽX,d27z=%9Uy!U]㕴(q,l6KGLid2btt|>b2 juuufӢr[o\D. 8rΞ=K[tUVK.F[0ٿ?l6۔z=>^{?!?N9nO~2'Z nx<Ǭ_?ϧL w*XnnPQ]~TZT8eɅab Vd.(B^/C*|h;ױ1磶rN{D"p\8s p)X Ѣ\.ŋ҂6,]&DK믗-¨ t5\?xWU"9/}n]]]x\s}vax<^L&bOMM j5KP~?]VԀKl6 ۍ~9r'OŋK0 tO˗CVC(Ʉ8|0?>8\o񪻷1JAr,|+b|Nþ}&7PUKN'l6|>_ɽ7>Z \VY.d*t:122R SK̯J99sǏG__,KPj!lcc#-[v\ $PnO9^{U?UVaʕ^_xᅊ|ESQq뮻ʪY__ɳ#WA ðZZ%5E"4 `0*Ex<(J+N', <ϔU'bQ9nW*ܣ8<?Cȑ#8uԤX555hllիO} hnnB'a~cZ馛*q)Zm6L&;wV׿ulݺ"L&sYjzދU)pT~*T~*h4;YIoDWHl-JM=f, 555JP(JDӎ Mp:100łp8\B!F#V\n~ѣGYrwqnjºu`6;<<~j3ěoF^z K,Ybr9nD{JbUD":l6t"  NسY,PU*^z| )Uy:8v`Z'Mg娯GKK zzzf EދdQTػwoY WB&a [o _BU-x衇xL{ 7`,nwɎԂO>z xrtt:M]*XlX @nN*RXpemz9:Z%0;qXfy 9v;h3́088Y=M6հ[>XmGU}>"eBLxGX,F> lK"bJ*_"x!944cǎapp###E;1P/ B:˗/Gww7VXHRef ۍ?hmm{ o3IDATFY֭['a$<JgYR)|>d28p8 MH8RTs[(Jh4tM A?Å JQ<ڊ+WiE SNQ7 L6[(be=쳸ɍX7> qZ\T LpݴTin>+O(P\F-eEѣ@ OBʕ+с,ZhAG`?͆w}Qe%m׮]x:n˖-rV/yeZ'M:D!$9q ^wB~ΝߏaxޒP(܌tvviU= Lł]דO>9~{eyfq\^bF e@MʹʪzMZ+I2f ;Cɓ% [hkKvww!0gl1444c½k.|,o?0BVrtE,Z~ ]݄<~ 89l۶$+ɹj' ҁ3RJ#x8bAoo/p9BX,{uww3N書xB!nF FO>)7S>C{ey6lΝ;WG%Lv\.I۵bD"|T~p266Fw(H$Jqoi~5900ӧOZ-/^LGK.Y*% e{1ttt駟H$ L9뿰k׮C?o1j K~z G-VNsҪrK,lVL&f=BՃrH&tAgE[Hhxb:$ \xN> VJjllDWW Ɉʦ|ggڵU[[[o|x]g___E- ㎲tww_$Eqx<LڱCRaٲehkkdRدc`d2H&B8<]dll lv5IY6 nss8FFF000Ǐ̙3p:%ŭnX҂v,[ Z$r&LbݓPj|+_p8Xv-Z픍C^/x㍊ WUF]VKv+ H$p8Zxstt_}Y^+rUcRTܨJgBKs8]XYh4jz֢0bd2.:wMM x<޴!bn3gpdXH$Xhىz"n_*/X n}&->M_q+Jhnn&whT:U(h$U+-E*ttuj H$0t Bp:BeU3 ~?.\>>|p\%˅NÊ+ݍOB}}VV! A$U] _ݽ{wSqF%{Aww7;@Ź b18voO< & z~҆AMM Q|~t|X . 6mZ0.^HGK9s###E RSr,^VªUl23L&T=ԟ}Y<@U_T* 7/kߌ"G-+ibwA{{;3D&rB6ݤKQ[[[U 3˅\.`VEmmm$Q\.XVx޲:~'In8zy pTnjͦK jUup0L%ԌVf釡P( !NA0dZFL&b3_4σB ЮޥK)$DfÇСCƮZ sorF:z!>f r&?"+f!Ja2R9'n"HN JU-u,sAռߡ\+all T tjܹ\nBI>0'p\_{XhќN>o}[ƆBGXԀy`TddhT*7B!4 L&4 jkkK <@ǃh4:A/[PrEWX.KQũnQ9+jذatiq[4|͒O @pH$ :i3ϧCz=$ɜL@JV \^2!v]<0-bl6^)q[HUo|GpK.er_f?8x AjU8## "s*s\h4 zM(Ήw>DJED"AR)d2X,p8JIRD"B+* M͋@ @mm-jkk~7QWWHDQryd?aʱhvu]W4i@|~QGFH$tnͦk>XL'(t:\8EG ,Y|Ip8`Xf`X rb_J)gBn|sٍJjAWp0<<yhB6@Y3T閖HRd2p\X,zxt8ҥKmUD0LhooB@ ; P t&APL&Ccc#R)mX,xDˢ/|>"mG'l6$ x<d2w (zIRՑ>,8>OO-7+MsKEc4$k@ D@ G ,R=#G0j#A T>Ly~ tHyMld#[s)U1}~H[ 3!SM3sRi {@0 {p@ G 8@ @@ "p@ G 8@ @ @ @ @ @ @ @ @ a~!rj4IENDB`wally-2.4.4/res/images/arrow_up.png0000644000000000000000000000056411676624760015775 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˥?/Qϲhg5j%'F,[ LH 3(vw=fcoN{O~9VM4Q7ܿ)v/WQ=&bpSO ^'&^:\˨6eND!& 9꒣_|?\ srx,g*,(F#d[OaAA*P p1O+C$`)*w`A#0$ *?b&NRIENDB`wally-2.4.4/res/images/brazil.png0000644000000000000000000000112111676624760015410 0ustar rootrootPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdHf@ `/03 @5F7g`￿6ZXl9 ϟ߿UOBY;K^?K_h@5T T5ToUդ $~涐eO; o bL_g~ UszhdČY/D:U6[R?f?OGsA_2ЖҶ0<t{W|x_D˒_.fg y)h)˖bU?}n[/I^r2|d   &go~Ko2,@ `H?$x$A^; 3˿kaܿ(@128"b9F1C/AnIENDB`wally-2.4.4/res/images/add.png0000644000000000000000000000133511676624760014664 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<oIDAT8˥Ka[/Y()%X(olNۖskn.-h;8fEP"jïMGˈ}yພ羹$I.tulu AX:𼂒ZHh1DnZJOJB{Z?`2`S=N$ő=;a &jw qJG#<"N2h8޵`6xցn_+ ~Zto}`x%XЛ͈ hXѿƻ/}BJ_G&|Qr-6Aރ EL⬡\U3:WUh[C6+ 6.f *K͸ܝFq ou4܄?d|XҥMvD` *_[ #A20liR|xq`4w=\uQ m+G|%$5Թ5RO*YGMUO Gqj4ְ(X& s1c˭(LVf RdjQ '-1ATA>U j4,pV"4L$e@.ArBY a~myY])Q8tNLܞt2"I o=CSd)__AF(IENDB`wally-2.4.4/res/images/hungary.png0000644000000000000000000000066011676624760015611 0ustar rootrootPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<BIDATxb<ˀ0B@bp 'VBBء,irN<6'O 2$P)d*+  XfGV  V V @10>}@'AUX#@@123ddw?~ D  UR:[p X~H_~AUH?  t@0b$$0Pf P/H@12X3 g@"m~gIENDB`wally-2.4.4/res/images/photo_background.png0000644000000000000000000000111511676624760017460 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˥kao0bQH СIQUΊ訃( .CmѭAT"X1i:< wy8pι3d_8WɑL`",es3 qw  BfH' 4׾lsX`2nx~5Dvߵ%FN;Lduŭ[Lڨn6d(h# K $ OjLH`TA ,p,_x;ˀbҮyV 9YQhk5gc:S{(PTv7fLQVG>DĘXX$=ȅ#rӱ !ܝj2'ogEN,K%~]@L ű2~1s @ynB8$I 0y|uww_dk0_,OBIENDB`wally-2.4.4/res/images/files.png0000644000000000000000000000130011676624760015226 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<RIDAT8˥=ha%?J"FŸK*A(hc) XlQ‰ xlB/΁y_U ƃ#U;Պ,"% X$~>>ZPSWy;E&#ʞ˓ ߛ_3uE[qzrcS iGkD́0zv(Ja-.[.$ihurz<ʪ*~+*Gw ":l&HW Enf]v\>}ײrz Z #=n*6.eO9GFĕ5 "(Y<)"=mXRlVUVN.UqUX2ZIB&%HAUk(J^L+Cij(l X_b+MDþ;wvԫJ Ak! 8O'D䏅NDQl>sU12ٻcp k/Lcrh&Vbnz)OY!lj?}矪Kc{ZIENDB`wally-2.4.4/res/images/germany.png0000644000000000000000000000024411676624760015574 0ustar rootrootPNG  IHDR  sRGB PLTE"bKGDH pHYs  ~tIME  & IDATc`BXh ~wIENDB`wally-2.4.4/res/images/delete.png0000644000000000000000000000131311676624760015372 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<]IDAT8˥KSa[nQP2wܦγL[,biaA\Cv_2MlZFjסNMjmkʷ`&.#z<ϓ bVPT3%I{GqRivȅ tz#E6EddJ`DR2<]N ;4Ѿ;m>78ɀQe6LIt殷cq!z |v j/Xi@ %1|hl !|! Y#uUNw]˼ H3u t]E>k%IfoRD:0`~ | (r on3oG0!$V *[W0_-+ dW&2ZfMFVJpiF&B > Rg- ~ CmڴER ឫ p5ްy+21Kawh` #aZ񽞆TZoLѓ`"(?'ˎJvKކ|:G9[aw82 Jw f'ymzsӘTsw__ιIrIENDB`wally-2.4.4/res/images/files_delete.png0000644000000000000000000000135011676624760016555 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<zIDAT8ˍ;haӤ&V%iAQ/P(Ut(,N:-jqBBV^CS4i8Dik-p{{Ľni-NVj$eV~]|gp=Z}BKU Jyb Ty/Qe#;a4|O16\:Fi!~C˲Ԭ,xoRIϣ3DxWvhrX$PUjR"M(aa Y1% T XԴDi@1ZXcVN0iT`p " !BKQMضF`LBnc*#dD.$ıĪ8f9]Ϧ.&N#­CO3K͞CiҚ-A}401c$I7'3weM4,-3a] [N_Kogq$c8F^U8 Z <`ϩ^C𲟦Xva:+zl熽 /xoLыKZlvBxhpb_MƬ}Ds3+b PQ6j^w#R 8$kV_y[e)g䍟yovvRb!4Y?Pdc1dÆTR MMC$es=Vr-w;y_"_ƃ?8z;GHH5 3cZT>kB? 'ZS,V`3ncLsطC ZuޏlAUXo/oBjskCrpXR*ި50,`B⫙031]h{|>)$"a Jʹ9A;ƱMG;*Amtm}X #gdCw\7qo<Գ+hޞ@ _<c1DwVWUM- 5OIENDB`wally-2.4.4/res/images/denmark.png0000644000000000000000000000075711676624760015564 0ustar rootrootPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb zAR Q] VxyK}ϟ3I /7m nu 婣VWPP.-{l޼xzzb̙vs-~'B7h{Z!,, /٣V|r lgTWWc bsYDuu5on[J pDd}tfަMp6YYjjYw5dee`G1vSRRX`٭9ɄR˲qY<6}555}~OMZ_FFsAddd3V^15 ޲eee)zD>|_}XelDƾa~jL>]v;w`ƍ,Vp%DGGΝ;y}Q$''ɉ׾}PRR";qЩ/#yjkkR۷V+I0(׾B)8p ނ,X})cРAV8"2͛7Bxxv6a-r$IW_}(oih~f#"7oN?mڴ&DDDUv֯_:3ۻw/);f6q pDd2n:w_|Qv.]x\5n IVFha#"=y'0pfMۈFUUp^s6s<pnD얢8\{ {{}dzМ9spaEyK 0ΉzN쌩S>|'0m4۬7|óg+V ##CQ޷~ƍc2weBdvByy>,vb:fJNe;w"11QQM׃3FJFd"wOرc8x ?*..F||zjT*8GWXX,t{ccƌirOK,CBBO۷o>QQQ\ces5kuׯGǎmXsۼy3V\it'TUUPӹs?Xd_m}5d醛99N ###h"-Xt)yrdh\ɓyU*֬Y___>F0*ݻj~AAΜ9"cޓjjjuV>|{B>|yΟ?~Ij:Tі>ȑ#0C g7nĊ+0a,X`&J3Uك7nܻkPRP__Zdgg#22nnM4ou:/_nq~0j(42a@hرڵ+._,+?RՋ'!7Jv8p 9V83DnnСCѾ}{ٳӧO Z)FwHHHg42)==]vzZ-4~...:uՆhZ(:*DGGy;w V: :dv7n?)j4Eaa!pU{.dmۆ+WN=z(<ڟVUTsA\\͞Z̜9Sn* $o߾vu2yyy;w` 60Pmm-rrrDuu5V^C{'+L9h ?.;ӧR^^(x~[q,^cƌk ͓ B`` |}}1tP8}tܵkbƍ<==`3=r޽[v;e 'v61_ I午oag_5TCBB: ,,0Iii)oٱc K]jaʔ)JJJ,/wޅ$Iصk޽{#!!3Y۷No߾F7| m}۷o#&&.]䄯;LPXXh<9j(tM5SYXaV5BAaMcf^x]t>??m|͝;Wh.-Y!2)T__o<1Л1OKcPΞ=/ Y'''=s2e bcc9$͛ؼyU+"""&| 6lؠ(i!ʁN .'5S8p@%UUUHJJ2=tP$$$=Lffa(irVnΝXxC ~0ePAACR!44ԨyQbI69Eիz*_k׮^7l*$IزeΝ;#>>hչ/t#zsiGW\\ Fh{nݐP1p.ꐓc<ףGTTT)cccѮ];CK.ѣDZcЩS'BRaMέuV$''XDFF$ٔzv|Mĉ-?B5;֤ϔ31qnn.޽++mnkri\ۭF<8;cݺuٳC] p \phL?lcpoܩSfg2vŰxcSĉHJJ…  3\Z{?~<<<<,?ӦMCbbZQ]] OOOşyw͹{"ЀEk~v(((0?l0t֭ !//Z65֭[HNNFNN=$$$\qdz=҄kXpMHOOk3[LSTTYi'vء(oll,38Auuu6ȑ#[e!$$PCGvvZVEJJ. $k.C˃={ȑ#-_M7eff&>cEy|r-8AeeeF͓@]]C|}}1<f'ͅ$IF=ڦL8  ӧOoƏ/4qxQQ>p秨^^^HMMuGlTXXhXp'N0k]sJYǎ3/5۷ocF>ަfeB={֨&ŋ9v֬YJ{xWݘ9"]]]$S[lvZYFMeu&J&\C󤋋 ͛'}o #F0x"~&ٳ$Y8$,f۶mrݻwѣ555"i&{ykVh2P[[Ts?{%Iǝ;wmSSSݦiɒ%(oxxU֣cSNNN ڵc"[1ݽtZZ{VYG͛7㣏>RwHNNnqmʶg%KdAa6/־}{hZL֖\=ȾH f6qeDGG7{ZUV O'EJdwfߺudVWW3gܹs[4iVpDd_75m t:6l`wV 3`ѢE  Z͔֭ի۷/$I2 pDdkY&Z0uWQx7raDm$I]L3m45T[[ ???gk)))[ehm7Xz5ϋ58"jF W vq`.../k]xQQ rc8"jPnݺ駟 Ɨ/_V|8z%0goի9,Fdm* /P~ٟ]vWcǎHKK#<+R{s w>}LZZDr}}=̾R I|}}y2Q &Z ^_yDž2w3k-ZcǎUGD2}ISɓ7gĉ1|^ pDIznYI\K*caժUhH8=By6mڄ۷oYYYXl]tV庐 pD$e* vТAزe;z(fϞGYFrr2ë$) P[cXX?O<b3*mFTT %ѣٳBy'K/yJ5NL6joz[b„ S򤦦wߕwEvv}@FFF.kjj+`ŊEVBx; CrrN+t:<_|eO_Jpܓe\H -:x 5"yVZuj/W^yÇGr˙4͍߽9ckpyʈl$I~ @믿h:RY >9Bϟh417$E'd'"7KA~х&KĥcޜT5CH@&8"-cSG.%{/%8"- h4zG-F@`$IzIP2- EyU1m*F9FI!I'`#"乑-F9@4{xу7^[.}7'IENDB`wally-2.4.4/res/images/deviantart.png0000644000000000000000000000460611676624760016301 0ustar rootrootPNG  IHDRPpJsRGBbKGD pHYs  tIME &4LSl IDATh}]euߺ$ۄېPd46U+b+S8:ZNjN:cH ӌ-HL t'DĄs z`q6:;s9=~>Yk=W;ő[s&G͕^coHvw)E^qT^-=!OԊY񘁩qBl$)k BcA@9n3߃*+ vC3l9^R{gUxb}$la`yK0kk)<K[~Eé\rh>  v#}M2?D|a&%}\)k .׉e_4cu]\|W8h`N$2B:F6OQ?e|Kqq5}Z[7rX/X!sRz'WiKHI܎w{kK3z{UazEcҖ`oq2Wo@rUsvV!zzHL& Te̜U'=xeBk ӆHlնX/xa߄ͲcҽCV&}Cr'ZÉ؁2i5͝'PCWehX"]C?I/+k wȼ]ĽAQp? (bﺬڬһ\W];oÃ2Ckth qyp5.'WqTw_!kbW ~esۡ`&y2 11N-f4rcfSzI8'&RbRd~OءLV-X\,-0R+V )vV8=.f V\&.eטϣ_2J^ "+|Hqסt#,"%OhD MXneك }g*{ #~'\ڥ^դx/Fy\l9m܇iaZW4Zw\XbZDW{tqLx!ΦwdND,~q 拘A1 -U19&6>#y?.M(^Bg(PÅ?_eši+1s/CDܮl&bP2Ƌ5Xd%ĭfx+s*n4 VHS+>c̒G_-;8 &gRrObynW6"Ni!5!sFε[80OFs~@BUiˮ ElnVἊ^/܏{8Nurb\Ӆ 8 gvGd J+< o7ubr^; ھQkgF{k~)w;//K+] Xj}ߪ$97!q٪2[0W]܀=I^GL_$"$?0NiU$m;E-\Ձ=/]vޣjfk`j&;e$ȥҸN|L6 Rټ_F3e^LS/ ͕8RMbZO˰pgq"~[:m*. a5CV[Xd bpm"%$ oT+GZP/UpI@#C=jG[>hmS6NŲJcuu/jcg`eymȷ5ѿ=xw`rL"?=ueQIENDB`wally-2.4.4/res/images/bing.png0000644000000000000000000000254511676624760015057 0ustar rootrootPNG  IHDR@JDsRGBbKGD pHYs  tIME 0IDATX՘_TU?uUS1w6rXM87Q(P*ѣ(, ^J7)z(L"thk؎bm㯇{fe&Yp9swH,f'!:3 ,.H[nv6 m癨R lߏ{X;3I[ ,57X>&HeҖ۫!Ew3nkʝ;hAiBe _2y20 x x>~HCmn*X4$v&? hi<= , 5 'B lv$]΁= q+.uDb?5% /g@ͨN.4U NB@d/5ADt0.>iDhUTk6VCy9!u>J,#2"?kzh9Y]rh.0هcXsrp @a^D`Z,(RXskp- I_5sSDzkOxק"x(h 2f>~ ; ؍5e7!h>-Fʚ̨ P#>5-4S><52u\& H#ɍ .8k]( n^ 9Ȕh+|U@WƟ UF JhrRfU4'Ju:k~s+3t 0m"tAJ$ L9LT,Ŧe(6f(E/\dn9QEQ4<޵l])A؛BYDps6bw5&Ay/ }c|< < =I! ;FW5L3I TvO70ݲ27Aͣ#XBԃ֡Z7t]% 7R1ZoȺD'=lw(&e?H7"/-Dv`$g֘qǭ] T22' "oQkrKJn&LDo#0J*^Ţ|<ՍW˟X37BՖB}fހjGvjq=`bg|GTy|}= 5G@!J/~%v8L't׀)ӣ{D7nmɺA.`m,'IIENDB`wally-2.4.4/res/images/scale_crop.png0000644000000000000000000003453111676624760016252 0ustar rootrootPNG  IHDRxUsRGBbKGD pHYs  tIME:[iTXtCommentCreated with GIMPd.e IDATxytU}_TM#[#"6> #Dz 6gP@"˯ξW}u+I-OIUr_tr<}?~BP( BP( BP( BP( BP( BP( BP( BP( eMߥ@ʪa@  BP R6e^c/Gy Ad L?$?'z`gH/E%ɟsvޏق"  D8D#:P(Ԃ;TtPldj@zC@ @5綞,&Jp0:jQ(-pV@3NA2W` `2l@7p kKC-9c BxyQ%2/\Emy!sEP7G~]A_9Sނ[v eJ~Dw'T( (NY$p3R b-UjZ'(\DhpxQHBP;\k+G1ޛ1o͹j@Ìf4o飺o=ib>6קߊK۷oǍ7޸&dF133={ Uu#f2HRl޼_q1d2APA:t~!݋h4!Nc '۷㏇P(,{w܁z |~ {*X,t:!nΝ8s9?ZJRBx>& Z~||:vA; |rK$pNNpLfMf:T*؈P(f[z144AJ}/<"j& 0͐T6dO>ƫJ.vp  J-;0C6E*B:ό\\}/Ӊ@ X,D&L&00 H$r5g)C2n(Hh Dn SO[Fss35B,^0u#pd]V$W(Z  !! 0 BBs\zD"PTn51 H>X \l6:b)$N#!~],#JaZӃ.R`]K!|`zz,%nBF---dMTqx0>^9Yyi?'@${|U]HR<5XdDzv Ŗbt:455 hjjZ.zrۈq8O>Nge'>^v`ӦMh\uKvW^y%.Š ^yڱ䩧}WU ~;ΪzP(=m+HՊX,T)O G h. 3330&''zKZr6 ]]]hooGcce @/RvmmmUW]}]M7T|u__j:֝;Il6fJO2YvlF ncxxp݈FEg"zmmmE{{;z}Mx_QV?&{.j5=XTlw^˅뮻袋pܵ  jC$A&Ad2d2h4BCTB*uORWt: χ1:tcccp\ wM6ى^BP܀<%h ۷|;\7p^umۆ[o&.HK L&ZV^^NFFJT*]N ٴ]P.S@r^/v;FGG122RχRDCCZ[[ֆfFd2ک7|###mٲw:Og#v}QV+~d2Խax<Z|#3 ÊNcMBVC@AAR-"F @$Y˵&p^ccc kwlfR/{NBSSV/D"U gyv^"n 'PTGJǐ7߿[d!VP(ؗNdFYSIB _X,Y СC[IB@CC:;;ݍ&TOMYyfggoWl80d2wy&aigO>W\Q1]v.袚Qr[ֆ)FÈR YN.rZ"hlx|I]$YgHp\t:K. BhZ455]]]hkkcR6_]SS>/͛iӦǏc޽Ë077>q|K_mVVSfi0< ,٨PT0LCI`J] ^_4IERN\.B -pX :t%C4z{{J7(dwﮘ<\iU.xN_D8Ə~#:t1zj݄_7IE~IJ(z=R邿D@,F2 VZd2N%p8egZFgg'Vk {ʚp?8}}}0ۡRf;vo`?1;fR_/$Cv%3e_tK,B `0@P\.bxb;wrʀr3{nUǜ}O~RwZrؚc]r&DR)NIb<`02b16&&&p8\ R Պ^l6L&(Jjmp꺾uVUl7<d{(¥^y{챸zNH1Md/)8.M nb-H "$@./SwGB[a{011CJ@QCP`0hkkVTꄲ~fK.[e1ՔYOir-x8c2Z j|Ap~ K$~vgy&8%\©ų> dzGE?<=J䂼>pdrP(`4aXhJC2L{DMNgQ r%H$BÈ{fx$0\.WZ6mZi@7կ~*wtX9o TtO+#{`di2 V9 Rzf1x@B!AD"$Uh49vmll vP5rftuu---0 tߍ?SbFU_Ωj*{|rem^/vYJΝ;q}+!a4a4zX,tV_*B8dK¬R)D"AB!DUd2 ˅I b||n0 T*ِ@=&){iΪߟk8yԫ}զ$/n|֭[qW\ơ,BpAl,"KIM9Dr9D"6I8^Ѭ&ĂFÈD"bH&9`vv###TIIp[ ͆^b ߮D"l۶[ ZVq`[KZ[F?8OnI8H$Jb̋bTVф8W:F&Y'R"hvv\.WIah4hll^^9e)X |>۷o̴wުV~{Uレ.nK.HӦRmFS23IٟBX^ da.LVX)+㱟W3&J`ttCCCdؤajX,tvvbӦMhnnI),to&@Ŷ[lAGGDz?g+ ӟ.gw]Պwߍ:k]C]l(P@4 J*',Ċ#OZ-R钥x<Ξ Xi#IDn5 8\ rnn]erpKK )ecv9eŸ t:8 Nݻwjø9M&ַJEnfl¢XlɀK+ *d,l%{dHdAL^0\Ò,=f2fW5Vj2Jnc||###)ZףmmmhkkCCCCY/TcxxNV+_)9;Snk8cmۆ.ɰKCb8ft:deJPқ(! vp-K,RȝNR2 Gf+"rX 333FFFؐrZnMMMl١ղ8)!_WN8NPA zhM7݄ݻwsn҂gyNӬ\.II[%70lVN,DDX \%IR)x<|$ qL&>Xh4 @L&a  ! 0ym~))SnL(ZZZݍLu^LY9^/z)Nm+U/| سgOEݻwfUYS~{)jHR|Ǟ={J0 M6UŸ[ ` uTRp8ؽRVD"`d*Z#qt$P\"T*Á&ޔl@60HRl0{4P(\f٘?T X PX1cjj LŐ6VGpiy> .Z|0::Zb1#a%=|>j ?{cYw .[wL.H cb@B&ͽN **xp> e &n"#8KDj\|>*d2z0k9β3ŦMX덆Pu+WsU*v؁'xbۿ/8S5 ΢K|>R< n 4VwŮ]l\sͺj~.HtI$֛h4BP,{T# $Ys1L&.nsd2 ~G)lK] =>>QLLL`~~$, l6:*S*U˷-NqD"->GkC^GWmӟL%w| qմGHb5y<ނ55=W9#:Z~Lfz^6\\rÓ<$J($|>{BpAm;J HRHRH$9NK$$) [j)Ja6ގ^tvvh4Rqk;wSN9 ^~#QXM8vUhss3~oOP_`8F X"p|>2SҪLۼIaT:Zph>oD"D")yd'P(fY'x< 8"`(0>0Ll0L"&''ZnMZ[[R$eD}_>j|;k+J~_^oG{{kr2˱b|>^/[gq& a %* 24<[VdJ6E<g"VLLM(B,C$N#2ʈ& XgX0 rØ$&&&055ǃJBSSl6hH_9G%֭[X+^x!suSG]8s9gC݃5W 6-&JFzJsj..brjEQH@ ؑd/S[:R,|>044Qvb:Akk+兊e1T {zg񨝋F׾5Nm_|߾{kJu7}X\4as=FѢ_@ JZP`%+B!j5L&S:Rrp ,;mW y:)H6== [|aEDcc#M)ɻヒ N;z.<sgySw/!fÆkZ\.N'`IDPF\6r v1??_PCIfzIDATff]mhhbYrz ;H^M)eRl%vCCCn/+fmmmAoo/ZZZ׿Sۭ[ws٪mۇ*K.]vنk*.!J.$x:/ X R Z FJuTrT*6xuZ? aߋg_2 "/#qZp$&&&0448Βn<jFOO:;;aXh J{Xw`Xorh4i|>#N8|Y5#yI5׋@ D L Bp:l4Jԓx<ۍh4Z29 ! 1q~qr\ ox<˅Iajj sss%N.J:;;K/TvO؄yw188Jկ~>1zohXkL& o@dlbpp\ bAؑ 1@T*YLMM[ehuT*5h4 w#VT4jZEWWF#pڌJ$oSO=uM f2|LJ~X===FE+Ul &EAU544ZJ$JAdYjC"(9Dmr`66E.C,aK&&&vK&P[gg'ڠhe_2<<\sG?jMx=XUr-l\s5:W%鹜NgY'Ҟj̘k0.)nkl6hnnFr:?<~< \>\.c:::p 77jP3qpp%r95Ad?qş0;;:t###peZ-ZZZؐD݌)yk:p}\~8pJ]w>OV.! &岗\ V's~?QmRT KRqY,twwcӦMBss3j5wp?ຽ(z'k\p˰Klh@}2$\VD"9*,~?122 ]ŲjKݻa+ST+}TW2vquUl7;;^z _{wVuW\!ԝёHd],wR)DQ"`Z^\ɩGFF0005D"j5V+zzzp1ǠJ>DkM66L&SM{ GJl޼VM WS"|>T*+`XlylO(B"XŅt:KP(\.dBss3l6ڎJXgر&ӽY,|ӟ洏o>|G8S3y|UsEꫯ7]= \&A8<^oɲ$OjfjVL&[K$r80Ăs)ct\l P'.h4 Ӊ1 `pp333eSqbX,l6twwVuU**S?v\^zi^駟~l;Ӊwy]xW_M7T1't~_Qc*p Ig%~Z8q(H$jhhh@KK  !H،&0SJB,bFA `x \$ZPBG&-;cSq `ll .lRDKK 6mڄvBYsqjetvv|sj(p //^s3>>oN1ZӟV QBM#[ @,CRA`0h4B.XXcr:zr&y<{nfZdz+BS.'SK6E8<4IRqMRquuual>*甍C=Ĺ7񍚿 /sjG}*\.|[rw㏧7[ \abe<χR^^RX-D N+A2&6mW,FGG122iv/L&v߭ ---jk,annS?.>OUOoʢo~lGȚA$=q(Ua8\M[Th4BCPԔ! R`0 (M fff022q&ZAgg'_Hō\|Amkٹd1o.gd޽?^pWup8{wMXLH9ӉH$R l)^_s6i0j!J N"`+ s)9vll A4-o esSq,Q|ǜ677c˖-usm\r ';?p89믿.NlQ-kDL&0ۍH$R L4LlZa( ւ#VJ]gKD"klx^J>8 @*Bd2jqFj+DR^?y8+;*L&ù˩ ɊkbEQ6?#r{Hj|( t:t:6roDHZ2RBG.qIRpݘ199 S h4ZlH~+I9VKRߓ0DZq ꫯr^yرcbq]]e]Ss1I&Bl\X=$@P5)pZ-+ ZT `z ! H.& a``J#FMÕL&W-fH\.X RIKd'|3b^z%D"zoR; $|l`0D"D|>r9jT*k.0H$P* D$.L&h4`0ֈJ%^0v;[r7beYR)6f8ܛNkR:PhjjP(א\.p8ڟ|hmm 7{キb[z;Rpx.v  u0x hxdi0FzJFQv/vC,qrFFF033=9Jajj PSSSeK JC& 'x"  mXC<%j۶mQ 9I8^|E*pT)pd,CRs [-b( VHZb${q ,\.t:xСCp'қd ^p8Kf'^hZlRz& vr*Y%qPLfMHR)qD" J E2D&cc֋G"q,I$0Fuu\.{j֭[: \cc#oI&&&;8zn0+L\*Й2L0PTuBL&PTŠ˥Pl6%&+' N:養߁H$Ν;zgIɪp8\q y5WMHV} K:;{ĸK! سbh4 ۍ@ x<k`Rlބm1P[3< rOR@}yK~H$0;;aLOOK <JUHǃq6l0eY]{V_6E,<<_ׂU-8^yLNNV,P6G]) aJ?FD"^Yy$ e>dp׳1q<;cwH$K3"H|'әD"9$'y֭[[lt c>kS{۷/x&9F/~T-_\.x-@ d)ȟG&x~.ιV~| :r8&-`ώD>B}Uq |#{___BYW)B " jf">@y_gW毗X6'>ߙWK_3P(8^~P ^$pq!v=U""y_wv K`'xLP֣+=ٽ@PֱL(o0?6i0Zu8%8 [@Q  ЕLA%"?,Wk~>/ruhR(:L~O-{^䘂 |x^u \ Z2o/wG{d}6IܫE> C7 R͌y;N0E>7W;o y<[jZmp/zި BP%?p eu`hP( BP( BP( BP( BP( BP( BP( BP( BP( BP( a uIENDB`wally-2.4.4/res/images/vladstudio.png0000644000000000000000000000764511676624760016324 0ustar rootrootPNG  IHDRd\]sRGBbKGD pHYs  tIME )&%IDAThYytTezW=URI=$$&(* s8Ҹ=3:h[mnq?8.h`0."!  T^(9gN?}woLɔLɔ eNy"ݮ@%dn.?y̔|'?Uo1ܕD]KZDs) }{čmvnd "(2ne_e߱Gg8~/KK*H}Cԭlo>6hRwF1߰v'o101׋ 3D􎯨iJuUR , jTC@P3⌱ roBz5Ta-<)#3 dc%ϐ$iƉ&)DiRjŀ u e ~]k.&|,[|3إH xOhCOu69\mrn*8lTdC.VgM4q*}!@vB ղ0hpy\(NW఩<8"ԅ~Ci/-݂&Sݱpg/ T%;\}(67>T\>k[̦?iSc$Isd!E\^ s&bz[!vB_$Nwor+ "\t]"""O>vSag]8;T;T3 զp٪$uHhc$@4RY-~*`IKEwɪ5 9dG? Y2 4o%f~LW5[]}'VXʵRkOEΙw@mh+tDxH$"Tn^e"$"MweKCg5(Yﶻޢa\?ҠR^3P{1zft.Dk-J0_yYNZkVi쾪 |U |՟ڽ-͎`ώ R Ds̮Ğcq {:k3xۚ`IVO6OjBXqF{}=rB)s(˲s ?+V|Wg]]FWb=X] 96R4m涧{78Hl9.^*lHOxmc, #XbDd#"J;woW[:'"=_|w\Ҫ&O1CD^ymKI5pϽK:ַοǞL^{[׃}xɡԶk>p˭;CtE/նo@M6X21b3هS5oe9*mk/B0\!k{37W5]ig&+jJ>)?D9B㑁%ѫ޹x?ִ `Z㙵h2XU^D `z DjG|W <$vNPcyx#R7q@""p?P1/okC`%QDDDe$=,Cݿe`$9*VSgTv{iGxoDQ 8è%Yw3@;\ DmAfXE!ɲ,7 ⎱#2Pl]اݨ!OǬc*oo$ DDDQ aѲ5S<S.AFѤS@D(+-z3N!n0A~) v}sw- WFQ4@G}\Pm[O_ m}u}a3 .D'X "cr#;v*UzADP+| y ޳HEݜt͙Ѷ5X*3W*/lxUN76낁#G%D,[d: CiIYIF̶kfl =,Y3Nn3D-(3"X_럟bႳV8ޗJ 'qsd4F @ϴ<`ud1oOGePN(kR7pJ4ka MiXB:#W 嗮)'" cs1Ɯ81wŌ5>/P:f{v#TwwIe'rHf}'jDX(W%-=j>L?fvWޔ֢eWE0KsŗWVwnؐ=o4IѲֆqRX7 5; ]?o[(n ?}e&WB6qs{ Ί9$[Mon( s1L11&decx"T*5!jXz-5X3ysrCAbK3""㝻ázs>kֻ; R]eD$lxxbFZGlOj,**8LD/DF{<[2o#geCeL~d=&~q嗮i$|4ҹK9TںWZ[H ߋo;HUɹH%fnL4S"B"2t,z#$OOfg]Ft&-K=|f%f{Yy8U##N#j%cѢ]{V[6$GY`O숨=홬,G7Kf7"fyu;h0~ D4ڞ}q$)Xxgu Wċ{"p޾.V쫫! eWޚCTr9TCDP?.6^kg,Z2C#Gz&,[|'D$"*8rb+Didd^k0DSslx؛(/y'-IzơԨ?<]~߯ѻ*€D@"q6€@jEIJ[wכtZV"+ uCq1*t` rE" [dQCD)~-|̍~ ? )Ŭ ֡P& >Q@A'NRS22`錬32( 9P&N`$Dr%{E)~`-HD~I\ ZD̍|ϭpH@DF8` u}Gy{Pٶϛ%h2J fL1AD@f dEa ca""6yc1/QUNjWpKSځ+^|,q0 _[*3 W#29j HVuљlcRd;ca |FD W( y !e"trlO*rƘ0R,WqܔCT3xM5Vq :M j|n EOr\cf~>FɡlAϏQ/ W@BaKQbѡdI`'eq3y?}~5jaNm/3. dNӭ;ƥj|)fbyU1IENDB`wally-2.4.4/res/images/active.png0000644000000000000000000000136611676624760015413 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍkTWsg8ƷAmZ(RqB]UhtJB)?P .ˊ-Q4ąbiLRcHd2{"/Ňs?/WzX!-7=GnJS࿒ sʃ5`J$9u 3Nֻa-zGNtvX70p4:ZuSrQvvIENDB`wally-2.4.4/res/images/fit_to_window.png0000644000000000000000000000113011676624760017000 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ݑNQyy-4@"b*`ŦkK=$:H() &e.]/V^V/UC Cgf ,o^`6`y80#'n4B}!Z "REj1ET a* <x.;kjt˓#bM7VQ T1U 4Y[Kigџf0,-{aPaK!XԠ}iWל&Mmz%ӗ;=`ZUuI$_/.p%IENDB`wally-2.4.4/res/images/centered_autofit.png0000644000000000000000000001416411676624760017464 0ustar rootrootPNG  IHDRxUsRGBbKGD pHYs  tIME}iTXtCommentCreated with GIMPd.eIDATxy\.r!hs D#&FQbR *=hݨ90I9VZ J+, Z(*\B$x q7;,|ޯ~wv73,lb XD]f ,!e110cw Ek~ܷ׻{ಈ2 -űYo*MF3-" cmw!00u9B\~ x]?&8S]?/hMAAAxB. x_|GDD-YQ*FcQF+u}> TjQK/1[ff&.] w]3,nܸq Ș4 ۇ/G݇l466b߾}/]|i娪jgV\ɂc#"2mWngQVVc#"2M(,,lgYLpDD髯?ۑ#Gp-bVDdqv(//ǓO>.ߋ/ˢbcbbĉ(//o[ZZUVuݻפ˶Njua%={@R}駟e/aA"88.\AZZATbc|}}Κ} p ޽{_jȤ%''TbӦMkkkkq} G7o?8D?cƌ1md#"vZ;;;c„ E-++ɓ'{|#%''CV8QngpFRtKVSȤݺu iiic1xV[bK.{KZ̶s.#*((@zz6HRL4])jVQ_7ޔ)S䄆1 ++}R0yd ;w4J@ڽ{7hֶkղ2>|SG#h?M]ZZSNbNjXdeeO>U4Z$7P(G&"lƾ|rL6&7n@VVŖի-*vݺux- ?JJJzyyym kɉ;LСCY[[<<} ((EEEzcJKKq 5bʰo{ׯ jjjtƎ {{{dffq%?LwwwwhuݳCLL y42I999;aKR~/`̟'k֬~.}]WWhQř+VQu: C^*++UMG}}3g""";Lի ^zI<==1rH1ق]Gzz֋4{l\tIΦW/lذ<h qm@~___7L&ݻw*nӦM:C<쳘7oɺt ƌ=Cmr}]sxǎFDҥ/ Y~=|}}-b렪*gy6l( Bԕ1-[k.k...d+1^Søsٖ]||<]r%~_c p9?\\\ m'Ҋ ;vRRDEEaYd>0~6/JեB@UUYݩSlٲ(& @\Od]"( P((((;EFFtY0sL$2 1ѾG?##d'>}:]&*v֭۷o>XE:Ç78Ј#0rHm5eQQCՔnnn:w3f̽Vٳg&Msfds:t(|||NNNx N&k׮g?IWXX詷vѦoyGZ BޖRlR*SwARRd2!C &&"t"t9={`QEI юRsrJck;R,m#{9iwh* YYYzrtt4xm۶iG.Ftt4BBBl|wpp蔙/&O,"3))I ]!33k׮( ԩ6lT* 6LHH|||Fbbvpg^|TThll9G6w[YY3hquxpӧOJo36*((ŋ///E}ꘚN`MM P\\}111=n2o1 :-[&xy@RSS#z --M*3'O~~ۮeeee!22ⓒ}O>>˝CfC`֭q .u߿?y=zTo̹spYm%K\Lcmmk;\ǔ#''h+,,1j(o7oW.dv=3;TD"A \~ݒVX{]p!y`1uLAAΈhjj|8v`+..FBBjjjM8ggըon_D,XKsƍX~7|GTg$J-s|'hhhJL&ìYVS޾}: hVIٹ{.222f}KJJ4tWGQؼy_gSVDdt͢(:u Ŋ+ZM-[ **JoLqqrjTr Q Ƹ䳦AL}Νb*++qMܿ666fLpDdTj۶mРiҥ189ZYL&jh݆ &Cnn.w8Fcc`lddIokt&8" gYf.O6XMILpDd! ̟?Ch"w<YŋJ&-՚r߾}xurG.?c?8"2Bڞ8ŵ!!!fW4ɷ9t`#""GDDLpDDDLpDDDLpDDDen ֭cR,W<L⮲h1@>2Ѳ[/5{`Sa1Zbz35;Df/Y>#""&8"""&8"""&8"""&8"""&8""b#""b#""""""""""""""""""""""""""""""""""""lw~?fIENDB`wally-2.4.4/res/images/photo_save.png0000644000000000000000000000136311676624760016304 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATˋUus_ &# "e]mZie]EnB6J0 6QLeɌ3<.ss}|_ܸs:=j@dA#vAJ&qq ]nQЁU&[Cޚ3GxCڜ@Y7EGY4m>?v3PBFQ$Uumlډi4ۮ !J(RMVS3ԹfȭH"A}FˢӵyF93w7љ;sz\3%DPlgv/x+_>.][s^"(dY7pǻ& [k"y-mڜ=QY%`f.9:LIUUkeDHxy ?|UTS]Kh,Y "fY@v8ɡjRJ"iQiS;,) FtSݚ\ ʞ vok[+Ͼ^znhmlLJ7޶wQIam7@a`\3on~=ȁّ0[`c`L2%)"Sg|#ReNf5*^pWy)"dn; ɜɲ3{@% B"#w6[l&2?cکIENDB`wally-2.4.4/res/images/mirrored_tiled.png0000644000000000000000000003216411676624760017144 0ustar rootrootPNG  IHDRxUsRGBbKGD pHYs  tIME iTXtCommentCreated with GIMPd.e IDATxyTWݬ*"4 f 1hKDEёM&$Y~$q9O$3B Q<4(bTdEDTD4]R@UBseݪ[Tݧs @ @ @ @ @ @ @ @6h08- Qp@ G Qp@ G Qp@ @ @0a`Kd{ =`?_v7wxDZ}& IzFQ/X نG`t!0DxMjK$gp g}FE0:[nEFF%0 N(fffT*P( GHKKninnJeˍbq_SoKK ,,,?n(j&C ?0 CY=bDDD`ټu!/$I9tt4,XݩSpI(J%ϟ??~%R^ oE(8}3|=== dH 555dzٸ~:tfmSTd3/ϑӧOn'¢O]СMvKQ\^^ :my&x氵չ_ 1i2dHciiܜpN 9s677Ғ;kulذN2/dgXJ%Μ9zHV( "22VV},XiӦԯflݺ̶ &p2СC(..fwmyԄT) * J8s """;|k!?I5)dH0}+7HHH (8SUUt淯/lllpٳgQZZ'r>ѣ1zh/2!H3gD"g}FŋQQQ+Vٳ4440&tTUUaԨQBYYYصkWEQ=A`z;j:?qDnf?WSu?g}cLqnBVVQT3"##b D=ŋD"X̶C*"''Ǩג[nd1o<<J4M76$IQa(J޽[c| QpݢRGJP -- Zl߾5cڵ4 2k׮?k߾};jkkr-HKKc̓NNN@`` =BFFALQ4M;xYEQTLTTT|r33,SO=iӦOƟl{[R!..c988@"Zӛ6m$ mC\\SZZMzٞKӴ2<1Mִ)d(K1]vRpvY/((Ehh(U^^\n?~R---#cXhc.ZWf8ZZZ J \rjPAAAڵk0jӤƝ?aoP[[GxJA NT"## &@dddԌUTTTʬWs=5koaa5kcݺu REEEFddd0ٹ՘\d9iګMh&EQ 2 ;1)|B}6>>>o)MٳgYn 4M#%$ %= D777f[JJ hFSSA=1 j񁷷7;33oi kd;=ّ::tXKNN|#F0͌%1q%))eEQFDD(VW|||2::}PDFF"::uObccq.gD999˗/#;;s-׎ɑ#GKb1BCCagg@M֥6qUXB|͓֭kƍa8qBh=Ű{ ά'U'///L:1uT/77%%%2e 3k0l0̘1;rUHR!s111qJꔗqرLaÆ޽{LWRRŠi:u*[#SNcҔ娬euuui}m7R[7}6N:yL0QQQ̚ -/okz-{|< ]ogg2cݺuKK,kHCCbcclsqqD"Df[ZZbccُ`b4I M`~dm* DDD8x2!E7HJJ@]ՃOCdk3yyy& shkp---HMMeLPvvv k/((ommEjjV%9fw$$$$0v P~AQHR킷e yrĈ s aaa1?~TAfJS 7s uH2MľYYYa…GѲe8mlld#;w **JhrR(j5)w->>>hiiÃerAϏejOzz:hfORi3$+"S*GiVL2~~~Zyã ;嬌.}I999hTMHM233y%7o5T$uL ij#J8g7Z\NN ͛8z*着*dffj]jPUU;v6mɐ&իW|2vOOO&U{5fffuz-Nh_񻤤999LA74YK _|roqNbp9tnMЍRv EQ4uwo&rJVveک\W#Gŋ늧z `Lq999zj:ܛ/ 9c3w\\z9W_}UkWf[Xd !+FBrr2\e20a„>#____:u8q\ґٳgɩR﨩67xq *.r~(;O>3+tuu5{4͊Zx1֬Y+!\DXf /^lkhhM8s6YYY788%Əӧ3)אyD AT278}cɒ%cffK:3)+| ~7QuP>T) 1Y5/? iT*i!ېJ(((`( >Ç(VHNEI=zt&Ӄ )q3 MMMHKKB3r^i ?k1qNn8q6l(oܸrppp2P SNxq9\r9fkk+bccqȓLʪK.5 cse^IaUXXȬm9r&M|(+W'ܺ~~~ppp`8rܸqK3ɷ 6}Л(z}9tdҤIxqN_|LSw#BCeerȑJ`PwYGkm2=3gd@MPf~:Y {e兟~ NNNZSZT*+LT"99˖-cN3gʿOOO0mp.زe$'v*MK("Ô񩭭ѣG9+9+8% uuuXlVVV+++`&fR bZT*222P__(my kkkq]x\}%W%8gkcС aw˷FG%>k]dVxKODFF_~/q@5="-BeeR}2qI`Сgpk=fPPPuqq.^fpĉ,_DEERZ xWz`߾}o?>֯_[_ongKnA.<~ceeŘBO`󷴴0ދD8h 5X[[wJd7ߜf =7EQqC2qy{g?f ?< ޸{.R$¥K_?ϔA[[[lݺ6l0gpfffz:@nsKMp:z (_KKK466* zWmX+=Xd ~GNT*$%%G_SSS(AIII3DD79rݻyٳgoիW VZ%jH$MOH@Uƾu.ȴix+--EFFKEE F|_>3DDDD^!C0oV__b^fr+{ܐ7/d7C|MMM/Yno̙lܸѠa~)F|lذ%%%9#')))ضm6_:wwŦMXaׯg%B6Ucx"EQ C.EDDCC8UV hycʕ $&&5g3n޼"n BBBtDqרQHR Lƹ,_]lVT"R HGGG3 +++bŊĕ+WpAfCkuSB[?t>GEEqVpN@Vp?Ɗ+M ̰k.[7n+Ń,‡f.v=6ooo<7oYYYx; ƍ#%x^/[LaÆqٳ@7˳=7oFxxl0giiP&I/---dYL$!88vvvN0|p@ttt˹:Ɔigg`&Jss3d2вj_~ M]666xFѣG8x_/}+8KKKVE. Tgo{vҥx{&0sL2&| ΙXQQg>'9;c֬YSW_} Xd^L b4\NNNغurয়~B\\! 777fYffEE vuu̙3|^裏v%$`8!+$$ ˗cǎ߽{7trϜ8qBL>۶m뵾T7X[[ŋqu淯/+bbbpoTd2-ZW}WT/ r28w\İ^I&חvu\xQaU1 X&_ggg4PuK:///%*++9s 9(AHLLԋ׫I*8 "99MMMhmmEFFVZۓFR!++))5}ԨQH$v>??4Mz߽{4MfRސH$5jk_[[[رcL),̝;wUddd0nVVV a#33666x ֟(^3hjj⴯#z_4݄,;#>>cƌg~~~(--}*VԼSYAQkݷov+)w ;wľ}X/7EQ].̦"\)--O𻺺r|W7'K/ĬK |PcD"efn"((1TVVb߾}{;W\º~~~8qb\׮]c뭭صk&NLȑ#صk+4** +Wĉǔ),,޽{ydZq|ϝ;Yf9Rݻyϰ ѣ1{lp_P 99snذ}NM6FGGC"fpgnnٳP(ضmhvBCC͜c츩IDATakk pUP4ɓ'<'_JJJ@4E>$$Ex8vZ[[QWWM6 x4 T<3k׮@QT1Q'GJJ 1c ,,Z|9gL믿 u݄b\X MMMڛ8L<k׮e*:u ۷ogijjY9vZNN+ 3p5O|'L04M[`r5O.[ 1$/ y|;HLLVԯ^Y}INNffffXf ^z%N===뫷ťOʷm-% NLZ=zWC'5X[[c…$&&+ܽ{˗/T :12F99BCC{n}3e#99bbbPPP>|T'߿W TZ$?>bbb84EXX?z;ӧO^&1ʫi2EQrZLCN2aEEE!..l޼٤f,BiiiAtt4k_u1ZiVwww\|߲eK;bGWPP?//R&LК5X_RefvӠRT*joݺ@|m۶..(ۡ6t4}ZzS}@sΏy=9rѥ[LLf5Z=1cưUssnp⓸3ftU?Cisؿ?z%t@R!..g(2aeI̘1}ExYŮ|ܬqAX @B4I\xXhɷjH+KǏ/dh Ncz,Gjjjd2 aaa]wkѸkf 4M(/~w48wD"\ۯfk?1;w@&uۇV24hx'MIO?4rrrJWs[7{K:u }V.rGF||| 6A?KVVjjjܿ2a3S]2@OAhh(͛JᦍHR;44111Zw̾T*d2Y jjjX&LӚdo'OpfWM@Jss3o.c'5 Kg*ܺuKpm7+++$$$t?*n?G2c]veHAAA'U*>})))FVVRRRp)f]='ND"a _``N^P ߲~4 K!z Fg}n_j(oCccn>=Sd ef)HKK5Rd033Cpp0ck2̘1bcc ܹsm/2(2ܜ!C`omm1vXd2&q{ܹR~z 0RlSphY?F,O[[[ɝɶṁ?3jt7rHk״zW}}}^SNe) T˜•{A*ԩS!H8R劻;t5aj~~><9k,i|)} bㆁ`xy)੧~U|)))OuqqA\\\ήM^iLQXrKnWquu9k,`̶#>>^* 񬐀#&&˘/m899S|J\.g'۷/(*m&W׶I:@w}*??C? مT(76ňT&_nȠf=s ˌ#1.cǎ<<</u@4 DWN< Yy%;SfYf1iii;w̙3\ 'JkC'ǰd2z'6l|!/_ZiӦ95jk@+((`X櫙3g(bym]~Reee: RUgEQ2L> &层YޕfTLȗYmҍ9$֝GuwXdII(8X2cA.2P.3.6hsH$V'N`ΝbD4( ܹ'N`3Ġ9ʫ:ߺ:NcgvS/EQנ^U-@;&o3y8v옠gzt}Z꘧f,LZ+.St^D"aRJ/T`9$ ^x_O``V3emm-{ˋ;_ p|X As q-V]Dn666HJJtiBD"3߇\.GVV]gaaPuֱdggcǎI uuuرcmӧOǺuV@SF'YYYB- pMQmU>1M A/L S0S޽{QQQZc`SLɧO*lÇ35ƌ̶d$&&r PTHLLdRC"S ̺bKK > \3ȗP*5"3!a9tJKK VZ7njbB쌐\=wk61sL櫊 ԯѣGcԩHMMۦ)?۶OT*e ѣG ảǏ̙3ΎiBBB֝-++ϐ~lSu8 `ra}܌{bݺur?>s,zUbc׮]g-ZXX ,,+yf{gΜQ9sŬmr+V?믿y+++P(5vvv׫do˷۶mpá,ڔ/)))}}vAmAӴADŽ`ڴiE`[\ܬJ)>(Ɩ;JT,p.]dԴcgϞwAmg ڿ^^Wp Bnn.|777舛Y N$!((H90| 8z(6K.<0& e+V}vx{{g,XXrb1"""`iɿ|׸qaN4>:qxIJeȘ---1|ķS(,,)ԅQSINN=FFFk sN^cӦMxN|sg{H ɛO;|'wիWcժU{Ʉ0{l|_|ŵQ tttqM۔޽cǎa[o\Am?>Ϥ=׀+ lƐ9 -$i-/SY24I̵UNR}wۍx(l|7']0_ko:\_+\]]y)'N`ƍ\HpP̙;vWߪ2LkTyPǯM}&? sy2[Ύjuu5>>37nf޽8~^䄏?ER*m6BϷ+y>ugp O Y۷o_ '}ݺu p_dǏOWh @`b-&4@БmDgm*7P@y0# c,>|IqFO@J> (8 #}ynA:~L, 4Qd-E "}D];#PB]WIO `EQ%$ @ tCxlv~p{p<lN g(8 \@Q]l Mn<9B(꫁w@ UX³Y}6$cQ,SmC4|<E @ J$̎P݃CyYͳrQQpb!IIE58ȳ+ԅu DSiO!<=J} !J{ y#gVy8 o!4MDR0?Z3'ɪ(8`Z0g =!fJB?@HP%P̳L'lj(8`e7qܞFX G  <\(*w!J|e[Qpn4n EQWUNJ@ /?αvoLaIENDB`wally-2.4.4/res/images/folder_add.png0000644000000000000000000000123411676624760016215 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<.IDAT͋Masu;D&n# 1FI $SJ) NJbAԐw%/yy~)E6|>F0Myu}e c~ɐX .6c@d`ߗ~}t@Th\::y p9$gU'3_&Z0HTLi݉A&`jrH.5|K ?t+whR ,ŎC ENL ұŎD: „s!\leNnz rDm!r!T' #7lVVp#" \HoVpe"6mn;_޳RT@. ȖQ2ed+\{QeuG7.pt/܊3)6Q+vo'|\҆wn%2f;;ZD!'ߜ߱Cj} 1"o"jAn$/cmKfGOIq`PƀΌ s-MIENDB`wally-2.4.4/res/images/wally.xpm0000644000000000000000000002132511676624760015305 0ustar rootroot/* XPM */ static char * wally_xpm[] = { "32 32 418 2", " c None", ". c #D8DBD8", "+ c #DFE0DF", "@ c #DEE0DE", "# c #BBBFBB", "$ c #FCFCFC", "% c #DADADA", "& c #DCDCDC", "* c #DBDBDB", "= c #D9D9D9", "- c #D8D8D8", "; c #D7D7D7", "> c #D6D6D6", ", c #D5D5D5", "' c #D4D4D4", ") c #D2D2D2", "! c #D3D3D3", "~ c #ECECEC", "{ c #DEDEDE", "] c #A8AAAE", "^ c #ABABAD", "/ c #ABACAD", "( c #AAABAC", "_ c #A9A9AB", ": c #A8A8AA", "< c #A6A7A8", "[ c #A5A6A7", "} c #A4A4A6", "| c #A2A3A5", "1 c #A1A1A3", "2 c #9FA0A2", "3 c #9E9EA0", "4 c #9C9D9F", "5 c #9B9C9E", "6 c #999A9C", "7 c #98999B", "8 c #979799", "9 c #959698", "0 c #949497", "a c #8E9093", "b c #CFCFCF", "c c #EDEDED", "d c #E2E1E1", "e c #777C83", "f c #6483B1", "g c #6785B0", "h c #6886B1", "i c #6785AE", "j c #6583AE", "k c #6180AD", "l c #5F7FAC", "m c #5C7CAA", "n c #597AA9", "o c #5778A7", "p c #5576A6", "q c #5174A5", "r c #4F72A4", "s c #4C6FA2", "t c #4A6EA1", "u c #466A9F", "v c #44699E", "w c #41679C", "x c #3E649B", "y c #3C6299", "z c #396098", "A c #3B5375", "B c #CCCCCC", "C c #7A7F85", "D c #718EB8", "E c #758FB7", "F c #7B95B5", "G c #9AAEA8", "H c #B2C3A6", "I c #A7BAA4", "J c #829AA9", "K c #6B87B2", "L c #6985B0", "M c #6683AF", "N c #6481AE", "O c #617EAD", "P c #5E7DAB", "Q c #5C7BA9", "R c #5978A8", "S c #5777A7", "T c #5474A6", "U c #5172A5", "V c #4F70A3", "W c #4D6FA2", "X c #4A6CA1", "Y c #486B9F", "Z c #44597A", "` c #E1E1E1", " . c #7D8086", ".. c #7C97BE", "+. c #8098BC", "@. c #A9BCAB", "#. c #E7EEBA", "$. c #FAFBE2", "%. c #F5F9D1", "&. c #CBD8A7", "*. c #849DAF", "=. c #738EB7", "-. c #728DB5", ";. c #708BB4", ">. c #6D89B3", ",. c #6B87B1", "'. c #6986B1", "). c #6482AE", "!. c #6280AC", "~. c #5F7EAB", "{. c #5D7CAA", "]. c #5A7AA9", "^. c #5878A7", "/. c #5676A7", "(. c #4C607F", "_. c #7C7F85", ":. c #859DC3", "<. c #8CA1BB", "[. c #D0DCAD", "}. c #FDFEF6", "|. c #FFFFFF", "1. c #F0F5C7", "2. c #A7BAA6", "3. c #7D95BB", "4. c #7B94BB", "5. c #7A93B9", "6. c #7792B9", "7. c #7690B7", "8. c #738DB5", "9. c #718CB5", "0. c #708AB4", "a. c #6D89B4", "b. c #6981A6", "c. c #6986B2", "d. c #6783B0", "e. c #6581AE", "f. c #6280AD", "g. c #556783", "h. c #E1E1E0", "i. c #7B7E83", "j. c #8EA4C8", "k. c #94A9BE", "l. c #D4DEAC", "m. c #FEFFFA", "n. c #F2F7CB", "o. c #B1C1A9", "p. c #879EC1", "q. c #879EC0", "r. c #859CBF", "s. c #849BBE", "t. c #8299BD", "u. c #7D96BB", "v. c #7C95BA", "w. c #7486A2", "x. c #666A72", "y. c #7387A9", "z. c #6D88B3", "A. c #596984", "B. c #CBCBCB", "C. c #EDECED", "D. c #E0E0DF", "E. c #7A7D82", "F. c #98ACCC", "G. c #97AAC7", "H. c #BDCBAC", "I. c #EEF4C2", "J. c #FBFDE6", "K. c #F7FAD9", "L. c #DAE4AD", "M. c #A0B3B8", "N. c #91A5C6", "O. c #91A5C5", "P. c #8FA3C4", "Q. c #8DA3C4", "R. c #8CA2C2", "S. c #8AA0C2", "T. c #899FC1", "U. c #889EC1", "V. c #6B7179", "W. c #6E7888", "X. c #5A5B5E", "Y. c #7890B5", "Z. c #7891B8", "`. c #607088", " + c #CACACA", ".+ c #DFDFDF", "++ c #797C80", "@+ c #A1B4D1", "#+ c #9FB1CD", "$+ c #A3B5C7", "%+ c #BECDAE", "&+ c #D2DDA9", "*+ c #CBD7A9", "=+ c #AEBEB8", "-+ c #9EAFCB", ";+ c #9CAECB", ">+ c #9BAECB", ",+ c #9AACCA", "'+ c #99ACC9", ")+ c #97AAC9", "!+ c #97AAC8", "~+ c #97AACB", "{+ c #79818F", "]+ c #5F6266", "^+ c #748298", "/+ c #4D4C4A", "(+ c #626873", "_+ c #89A0C4", ":+ c #879DC0", "<+ c #69778C", "[+ c #DFDFDE", "}+ c #77797D", "|+ c #ACBCD6", "1+ c #A9B8D2", "2+ c #A9B8D1", "3+ c #ABBACC", "4+ c #AAB8CD", "5+ c #A8B7D1", "6+ c #A7B7D1", "7+ c #A6B6D0", "8+ c #A6B5CF", "9+ c #A5B4CF", "0+ c #A4B4CF", "a+ c #A3B3CE", "b+ c #A2B2CE", "c+ c #8E9BB1", "d+ c #535251", "e+ c #60646B", "f+ c #8492A9", "g+ c #4D4C4B", "h+ c #50504F", "i+ c #93A5C3", "j+ c #96A8C7", "k+ c #737E91", "l+ c #CDCDCD", "m+ c #EEEEEE", "n+ c #DEDDDD", "o+ c #76797C", "p+ c #B7C4DC", "q+ c #B4C0D7", "r+ c #B4C1D7", "s+ c #B3C0D7", "t+ c #B3BFD6", "u+ c #B2BFD6", "v+ c #B1BED6", "w+ c #B1BED4", "x+ c #B0BDD5", "y+ c #AFBCD4", "z+ c #606369", "A+ c #515151", "B+ c #6B7079", "C+ c #8993A5", "D+ c #525252", "E+ c #A6B5D1", "F+ c #7C8595", "G+ c #CECECE", "H+ c #DDDDDD", "I+ c #717276", "J+ c #A7B4CF", "K+ c #A4B0CA", "L+ c #A5B0CA", "M+ c #A4B0C9", "N+ c #A3AFC9", "O+ c #A2AEC9", "P+ c #A2AEC8", "Q+ c #A1ADC8", "R+ c #9BA8C4", "S+ c #98A6C5", "T+ c #777D88", "U+ c #4C4B49", "V+ c #504F4E", "W+ c #6D7380", "X+ c #64676C", "Y+ c #4F4F4F", "Z+ c #768095", "`+ c #97A5C4", " @ c #95A3C1", ".@ c #727A8D", "+@ c #EFEEEF", "@@ c #DDDDDC", "#@ c #686A6F", "$@ c #7A8AAC", "%@ c #7989A9", "&@ c #7988A9", "*@ c #7888A9", "=@ c #7787A8", "-@ c #7686A7", ";@ c #7383A5", ">@ c #68799E", ",@ c #66789D", "'@ c #62708E", ")@ c #5B6374", "!@ c #575C68", "~@ c #575C67", "{@ c #5E6A81", "]@ c #66789E", "^@ c #555F76", "/@ c #D0D0D0", "(@ c #EFEFEF", "_@ c #616469", ":@ c #6B7C9F", "<@ c #6B7B9C", "[@ c #6A7B9C", "}@ c #667799", "|@ c #627396", "1@ c #5C6E92", "2@ c #586A90", "3@ c #596B90", "4@ c #57688B", "5@ c #4E5C78", "6@ c #444F66", "7@ c #424E64", "8@ c #434E65", "9@ c #4B5A74", "0@ c #4B5B7A", "a@ c #586A8F", "b@ c #4D586F", "c@ c #D1D1D1", "d@ c #F0EFF0", "e@ c #DCDCDB", "f@ c #5D6065", "g@ c #5A6C8F", "h@ c #5A6C8D", "i@ c #58698B", "j@ c #556789", "k@ c #516386", "l@ c #4C5F83", "m@ c #4A5D80", "n@ c #3B4965", "o@ c #344159", "p@ c #394863", "q@ c #435474", "r@ c #35425B", "s@ c #384660", "t@ c #445067", "u@ c #F0F0F0", "v@ c #BBBFBA", "w@ c #D9D8D8", "x@ c #4C4F54", "y@ c #3C5177", "z@ c #3D5174", "A@ c #3D5175", "B@ c #3E5175", "C@ c #3E5275", "D@ c #3F5377", "E@ c #394B6B", "F@ c #2F3F5A", "G@ c #344462", "H@ c #2B3A57", "I@ c #25334C", "J@ c #344768", "K@ c #354159", "L@ c #B5B8B4", "M@ c #4B4E53", "N@ c #30456A", "O@ c #324669", "P@ c #243759", "Q@ c #BBBDBA", "R@ c #B9BBB9", "S@ c #B5B7B5", "T@ c #B4B6B3", "U@ c #B2B4B1", "V@ c #ADB0AC", "W@ c #AAACA9", "X@ c #484B51", "Y@ c #1F355C", "Z@ c #21375B", "`@ c #193057", " # c #A3A7A9", ".# c #C6C6C6", "+# c #B9B8B9", "@# c #A2A2A2", "## c #9C9D9B", "$# c #474A4F", "%# c #43474F", "&# c #44484F", "*# c #3E424A", "=# c #9A9D9B", "-# c #C0C0C0", ";# c #B1B1B1", "># c #A0A0A0", ",# c #959795", "'# c #D6D6D5", ")# c #D7D7D6", "!# c #D8D7D7", "~# c #D8D8D7", "{# c #D9D9D8", "]# c #DBDBDA", "^# c #DCDBDB", "/# c #DDDCDC", "(# c #DEDEDD", "_# c #A6A8A4", ":# c #AEADAD", "<# c #9C9D9C", "[# c #90928F", "}# c #F8F8F8", "|# c #929691", "1# c #979895", "2# c #898C88", "3# c #AFB4AF", "4# c #A9ADA9", "5# c #A4A8A4", "6# c #9FA39F", "7# c #9B9F9B", "8# c #979B97", "9# c #949794", "0# c #919491", "a# c #8E928E", "b# c #8C908C", "c# c #8A8E8A", "d# c #898C89", "e# c #8A8D8A", "f# c #8C8F8C", "g# c #8E918E", "h# c #909490", "i# c #939793", "j# c #8B8F8A", "k# c #767975", " ", " ", " ", " ", " . + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ + + + + + + + + + @ # ", " $ % & & & & & & & & * * % % = = - - ; ; > , , ' ' ) ! ~ # ", " $ { ] ^ / / / ^ ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c # ", " $ d e f g h g i j k l m n o p q r s t u v w x y z A B c # ", " $ d C D E F G H I J K L M N O P Q R S T U V W X Y Z B c # ", " $ ` ...+.@.#.$.%.&.*.=.-.;.>.,.'.j ).!.~.{.].^./.(.B c # ", " $ ` _.:.<.[.}.|.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.B c # ", " $ h.i.j.k.l.m.|.|.n.o.p.q.r.s.t.+.u.v.w.x.y.E 9.z.A.B.C.# ", " $ D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.Z.`. +c # ", " $ .+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+B c # ", " $ [+}+|+1+1+2+3+4+5+6+7+8+9+0+a+b+c+d+e+f+g+h+i+j+k+l+m+# ", " $ n+o+p+q+r+q+q+s+s+t+u+v+w+x+y+5+z+A+B+C+g+D+E+9+F+G+m+# ", " $ H+I+J+K+L+K+M+M+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@b +@# ", " $ @@#@$@%@%@%@&@&@*@=@-@;@>@,@'@)@)@)@!@A+~@{@]@,@^@/@(@# ", " $ & _@:@<@<@<@<@[@}@|@1@2@3@3@4@5@6@7@8@9@8@0@a@3@b@c@d@# ", " $ e@f@g@h@i@j@k@l@l@l@l@l@l@l@l@l@m@n@o@p@q@r@s@l@t@) u@v@ ", " $ w@x@y@z@z@A@B@B@B@B@B@B@B@B@B@B@C@D@E@F@G@H@I@J@K@' ` L@ ", " $ = M@N@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@O@P@Q@R@S@T@U@V@W@ ", " $ = X@Y@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@Z@`@ #b .#+#@### ", " $ % $#%#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#*#=#-#;#>#,# ", " $ /@'#'#)#)#!#~#~#{#= = % % ]#^#^#& /#@@(#` _#:#<#[# ", " }#|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|#1#2# ", " 3#4#5#6#7#8#9#0#a#b#c#d#d#d#d#e#f#g#h#i#j#k# ", " ", " ", " ", " ", " "}; wally-2.4.4/res/images/greece.png0000644000000000000000000000074711676624760015374 0ustar rootrootPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<yIDATxb?pb4x (" P]L3S@  ?ÃGѣG q02Ttxb(nߟ/$R? @1[v3أ TuhҶ ZPW0@֭G̍7s%CH?'˅Cwŋ7""H"31н@{@,}eI!fT apq0 Xy$˯@_y=$"ڹ&@1޼QTH(… 0:{ 7C#??;0kPl~IENDB`wally-2.4.4/res/images/centered_maxpect.png0000644000000000000000000002464111676624760017453 0ustar rootrootPNG  IHDRxUsRGBbKGD pHYs  tIME:-%GiTXtCommentCreated with GIMPd.e IDATx{tuIM{oڍv]D:6d=xAQDzAPg8݁Du޷6&mK|>'m$]6i_sv+;yAAAAAAAAAAAAAAAAPn jXdhȩbiRA$pAAGA$pAAGA$pA AAADh0MM"ۺx<҈'dz z{*?x9-8ԙ`pu:QN$ݾ};]BĒڊ#G,=~ pz|t}z?x."G?_Xr}Q9r__4GAP(2A9E(fC4|*)BRA,/r+/28 Ls!u])ķv/^wu+7x<$pB4E(Ԝ7χX,X,H$Y Ø$^/8΢wm! J!eFd:x Ξ=V3<G-{tb.W >@.zZvч>|>ׇӧOtfpG4E$AAAP]]:T 8x`ΝѣGLG:ZƉ'0<<<FQ\\ZB!(E`0QFX,Y+pHP%%%x<Ũ Gjw>x$pܹshkk{ I$anjj "(,,\tdB!x<^ \0J%<B]`DxGbhheeeԀ$p׋!ahhs T*`^_F8(~ַ8D#2B??~^ݻw/Q#2h2ͰlI{H###X,TJBp8rYkKz3 {|>mmm0L ۇɏ^ ңnڴ ?Ir ˕!bbbèD~~ǃB@ii)6l(znxt:1=H$HDфCbzը^_O/-ܒ4#GχA9s6  0؈FhZ7b0|~7997xcU hUW]V쥗^^x!guUcܓ###1- a0n:ա2nbtl6cddd@^Foo/ZZZpI8θ8&%WSSQSSo ^gϞEWWpܹeU*i&TVVB&Q-7ɪtwM{N]X;v$αc`6W'OL' 裏BVŐ6VN@T F2BB&g)W. 8vvgx(**BUUad{i95\vJ9ls=\ZO=.Ҝ?L \0NzÁX,RFNFAII JJJDcxxf9g C$D?Յф/Cmm-ih2ɪw]ϵZ-l֭CUUUݻwUIݿ?x≴bo骛cCCCZ3jjVT*Q\\ ^+ MzWM3==ӧO'NٳgY7oFEEd2Y֖!r ׋'ihh`HٽޛV/e5ߏ+Byø뮻V̹Q8!Jݓ* :ŐH$lSH4CbݔcccIhVmmm8y$ 4<Jk׮ECCm;:yR|_+2,ۗC?ןyW\qG؂ͩL%$p1Ij(((`]*B'\166ݞn`0ɄJE" .֭[yfYfB_RYc׾W=-n\s l6[XP~{s.qO6L0nNN7-С!J5n7F#:::`4aZz\.Z شi(QӾ{Rn瓟d\om|NZ{5kV\:bI3Jtj3Bz "MXE7%S%bĉhkkH P(d?oݺ+j8Ȏk7H(O:***P__4_kEZ7pnJܓzZBt())k>MɤE7e bhDgg'0>>'Q]]7bݺut{#24^}դ1J+((Hq $?}si~œO>bU#pp. f3CP@VCѠhxsT.,UUU;;wy>8p -b&qܹq|>O=JJJHr@ 5=)Q^^B1va0\@N3#nJF0GGGrzۋVh4&,K"JQWW[zzoD9w;416͇)_(_~匟Snj;pСb|Il۶m_SB927|^:X,NCii BxϮkj\ܓLdbg0PXX7ɤZ2 a||. 3fp8 Á>?~]]] M%bk֬MuV[RqNPո mu ՚mՅ;i|#iׁ#^/kݳb &{2@ Rdr\9*===0L &a466*D&Liȸ{;wL o[ε^?iU9W*TqDor%%%2ba2XVe)N'qq 8N.BY[lA}}}ҹIX(㜻GYRI͛jٳ'^?%8D_EEEZN=9::a8FPȊL%$RBRatt0κ)E"QZi(p8H$h4H$p8< -6vrpccc &E]]***fp!Lݧ{MS__?osI,رcy9cp%x"=24>>Պ9i!i0?cs&&Qdbݓ=n0P( &7NCooo>ܔP*).K@ O|Aap8*Fww7ZZZֆr96l؀͛7&^z)HO|bַ <h4&Ÿ9Ӂm߾}^塇³>Vwމ|3Zk.I{2//1=9F̳׺x^L&XVTWW'V(E(ǃ~?\.!J!!H$ٌ'Oɓ0L LrTUU6lXdg?Yʘ믿~tЇ>Θ~6m&[T}a}hhhh{8p zA;w\&A|>XVfx9{ba^LRbpppx2f&\"1== ˅LMM,H055@ @?2?|'NFfq8h4444$nĢo߾1555zWէ>)/C+7X,qI\JV|_ӡhZ5f/MgxH$dD"%e,MG8˅P(@ H:F1== V p8qKj*d*!әKYY2OLK.*GGG볪* /c[=ܓ1ւ,P\\ Vbdyx(,,dݔCL&l)y<b1d2  T*QXXBBB8 !ˑ>`6oHxԠׯ^Ic͊Ν;S?#YV<>V}݇]vRo2ܓ:.eYdĺ)gnB]"9|׋.v=nχZf&g#ⷿmcX{Wtd>s|:t?pZ۷owVŚKnw r>0a dwnJfBwONNU:::V  jakQb)N9DaӦM7KgPFss^; Ix'ӊWuU%p3łgLA[a͗_RdDbfdގ'Nd2eor(((@EE6oތz3I,)>jhWꮅсi'? ]TERcc>#˅M،* vV%깎8uTyyy(//gTVVB"]@,---ʩc+,~FFF{eB!}Y*c.{2 rarr5n,d A$A(B(J(p~f/R2zSSSѣGގr9uV$t{'ġC0<[s$V2+fSmhhhޙC7%S.YގG'if455QbYx'r(xy%kO={bwڵ'Hಐ`0VҶlqfved)ĩSֆ^lCشi***BsvqС=?[o{I+`0_`E QAvXV8ߖH$2MR[h(&''a6q cll,.)SWWfSbYJhw^Ph4&`χ7}_rZ* ׿BZ_3qK\.T*H$x"X\.WܐekjjM9== ٌtvvJf#P]] 6U(28p B,7|3e9;v,Gɨ] _L=[~_e]%8ŒpJ&k׮VT*-pvߏVX,9ܔzıcחpCR6m*IJF /e;Fꤽq|3i;qWЅZ.=h"XP[lAYYd2pƆB>N@ `4vDYYYʬ&U:;;aX5 [%K/ҠQ[[e;FH]v7MҸ={,X|AL+nL%U(~?'լ=^" g j 0nJL"hDKK [-уC" .@ss3P^^e 1_~ӟinn^n-FqfXքIX NNNK8j*7e4`0y6cߊy< *++ԄbGOOOʸo1kY&ᢋ.J_"m>ؿZԧp-C:D"an)SS B@@.er͙+ f0 0+++QUUV0 z)Av%a.J> p饗~~i?O+#}3x1I%KX;mL@V/0@bh4(J@f6 nr|8_җ.b&uK:N{dbrdn,KžH$b[,qD"fDV+[;+J%,@>*!5Л"7L:p 7d-$p$8=hR ZNK(>ƺ)c\Lt,jh4J?2|֟UW] ݍ>I2v899Q j&vOΆ*t(**[122ù\.V8+Z, bpp0eW?\(8  p jjT*m RP@VCd2tbzz\.\.Hp\leFy<$ d2 0+~@*Э"㎴"EP)eYl6`0čdTI1Hw7>>Iǣ(B!r9jjj= A^^JJJvZ\.XVx^v2C,cjj B D"l.R~v2.w(..P(D8ϧUW<x';w̉b ߳)p8P*ظq#JJJ1h4 HL*h4H$Ȥ_TT 6@(fajjAT*h4b(..Fcc# k *@(B*b͚5T̀ V šS' V!JQYY 7dyg˃U.cXn~?B{ܱ?y|TUUA.re.H$(..@ A$prH$H$PT9%f* *%8͠&  H   bϞ=ԲĒsj Y2mmShH94KrK@ErN`LjH{pY%V4GAA AAA AAA$pAAGAAAAAAAAAAAAAAAAAA+NC"9IENDB`wally-2.4.4/res/images/czech_republic.png0000644000000000000000000000073411676624760017117 0ustar rootrootPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<nIDATxbd? & 8@+{_EB/^ & g/G+C3b!@s@4纋-Kß?o?ߟ+߾ZI d Q@!/ 6  s~ׯA߿I%??@5؝hwn#T ~1Ik@ X~>[<eP%K,YdwX% `Ym˳~+oOCp,Ydɒ墁m7t6@w->``hb4r {n(gɒ%K,Yn ߂6^~Ϣa=l ŧkRRÚ?1gɒ%K,Yʔeӗ`{}oxgQ_k8Ow3$_#0[_?6^ 0l Z 7dɒ%K,Yv*~.-eunp,YdɒewY./~jcWd%K,Ydwπ0R/ gO]z)uUYdɒ%KC{vO{x9k0̧lWy:-[EYؑo,Ydɒej|z5^ |]y ?vI{*֬J7pYdɒ%K ~6{T{ޔ 6l.Y6i8;V9`7K,YdɲwU>ݵ@o^XlX`⩗&eK+Uqs/K,YשY^q{Y@}5z>% 8gIF-r{6lX\ |ǢoӏY9~,dOfzg~ՠb6"cq\t_|&`6NE֗Հ:K-y3}|'Ƈ6l|>oM?5hq5-~8~~?ғYG<5W3ٽj.[(0O x>JFf<<ظ +|1hge%_1rM\GdgggLTPI2lxٟ mƹGx>fRV0h`}.Y-jFȍ=ΒAK-yTKofzo}T_>1 yA$߿Ay |T,_ oFrH9K ǕWP yh#⏃ 9}Ȋ:K-y-dzW!^7ʖw_ ll-],6e2[|nPs#OŏG<|TNch& eȳR9J&!f7|AKmUIi֫WbKP$̣{ ]\*]dg}|`oà0~5Jl_|-,o-vkze U٘bחt"evr,dr5 892~}8fz Hz8-N w:>[<>sW{5H^flv}s/G>;1(X&+tp_SRJ9UaVmY.zkAk!!Cy#c&=+ϥ+~c~O bSwwM~Oa(4ݶ'ax`.̧)9'JHe.Jn@,>#CAgɒAK-Yl\8ի'>6Q`rtf龦鿫wl}Wvo읛c<413΃ ڧWlv's%lt2mDw*!g{:+׍yV^bR[i +g{   ŋ"B7`R@oäB۝p7U;o6kA gӑc(f cNe9^Q_udhR 6!W~E0fϣZ7g>0[<~̧s5@`>/"-d˵@%YC7D+clx>r~wBAKS:h 0zX_YLJs |wg5>2(O4_CF`D0saS1O#,1ຄvm[}×jY4v3f2gg7 Az).ךjQ>_EDf|>̯Ls3 p М-> Pţ`A6a|&]$pG{0Ӈp ΣMy0YsGQa-^xOˏrF^y ?+/dfbq˥S Ʈa}޳f:imuYNшU~*je*ΔlZUYT_ C6{W<؍32g0KJ|(̧ߊU;X3O0.zzLrV )~1섖F.Z^F fC0d{,WS fezIugj3 ж|'msw[rq2HX3r KO=ߴ}>'AQ_5"&pɄzT,ɥS3hrzUdUҬW 0$oXԪjr2,Aou͇Y2=hWLKQ=<[<O:6XBWKo,Zulct ZlTpy]rY ]FpT)`3˃vq]lV~%AMʵ;0^$X|d/Ӣ컉XX%QJ&WHYj q]ϙ@KHz ظj5׏XAدQKYDAv~^;#Z %`}y%=q}W|;qMAXO #H? Hm/>"98л[Y!t㴍T!)G+x!XːԶl{-l3g:ٗ{m?qh+Ʉ9<Ѿ/vRwZw6`Z~M l|]WrwYWOr ]̱;a@|O}ټ:l6_\;/ֺ'c~ ו2%^]FiHhGㄞjBƯO2|$:5cUD㷽8;cRļuS=mT Cc_`쳾s~Ptg;:ת|b|e1 MgJl]vͧl҈~3f7ދ@p_C:`X4p?抠vC4Ԧ cS)UȎ84F2P2W>Fӎz)7cKe!(/=~#`h"VFQl>tWRd2MаW'38k-Ǖo{50-f0~EttiXos!=|ęC)H,!7t|"%M(MC2Ox cLwq>bzC'n_Y}bǁL[ }}]W&5߆6B9e 97S,v Cկ;4Sh aІ) x׺+Hn }qyвhgҲ:hKb"Y7W="5=4am9B~ ;JKgnSTW?\:u2>6}e6-)98ma1A9mG4gl(!FofWoC*d#{ߔx(eCg`{0;HY^%5i}G1DH/v(i>R?خ;Z*ZPGNd\4?Z3#d* ]+0Ö &aA~^L? O[cG>p^( 8@><7m,/}7*35/Il1`x[TW `p21AnhDUp|Rj}zou)8 ?:%di ^m7%%%+ehZ&(F#-T9c; f* 8*O A>8!3[\,^ y!sZDzOR>OH1Fعm{Ljڅ+4u6D9o}2:ژ-XmR>P+@JGϭu)%oDRT=9ڠF-"Y;+t pתγ,c+%K .@wUWSa>z!Jag~qWQ?R6X] _&]jo1N6$LjX R{UNafjf @)7n<>}/`7鸒N,EaPT.#ww}Ǡ]Jsf2>a[oыVf3]άR6B+R ̣}!+lWaC{BY|_) ?6>;l}*-kO,@(]n|}ǨajR7MQ zz')CCAgkcZnO!PfDڞ x~oy+Cr]1j亖D ˍ^*FX՗ْji܊ʌZz3r6RWTZ7Tm"Wfek++_[Q *4W 8 >:6kX=q"{p^=Ȫ?VhIoW37@)O+{wi+ʼ\(BCSB+}˞=ok{w1bYW2sѯ%v |Zڨ{kX9%tUkQ%"Wa)$ua [2Wo /2ezqvMQj A O0jU[JƈF|>m=p`}!8 v-(eS)wHiW;w9HXc [ ѕK nx glܹ)A 'ILxo$G:"50=SI\6!c7F'_6sn$]4ϓp_ax;&"e@D8pra9|c(Jȣ9ZVьR|n|2-w~eMP,с,^ ]?*z/iJlk!7ֆ3%D/yD?Xѩ;6Dd[]6"~qE,D3*~l>}=SGW0=_ o-ro6:mx7`>պ-Ḥ66]1Y FZ4?5: -~+f 2kkIF_oOSj-c "{Q%[ӧlD Y)u~pR~R"z7&MLH p;vPM$m s[8Jo_/"o ,?+[wZX~yz*1ۜ,'| G6RYټ = |eG$2 QXox]Szm-4 e-a>=U=|oտy=?mz~ @NuS-ԕV*H%#X ;4e |,IHn2#s,+Ůz>Y Wo'֙#A-)Ooyk3pL/-~/8l桁`>FpOhH&4pԣr4426>_>1V}M6a$*;eHO_.LDwҨ [SriF|jyZ;ѧ^h$#(Zɵם?;nsj IDATL g8R7 RƏ^rl.=A"^C(cKNJ6x(G";Mo ZlY "Q̱:tyl*AZIIYfTu@opZ1b7D|Ւ(@+˧3BzwR!hn;]nVJR!_t֬/ؖ)AO*wiOr]ad i8ȠI`[~G(Oßk܀a+ZcOwg zy.s>[G3N_#gFW<ՅJSرog e}-RRs9_76m͐V4\,ǘo b*pهН!o^l3A`)b$jpR܈ݷh$uJ#Y#/Fqw;+@hŠM'NP1Aaxz!T SObz]_t8P 0Erv @͘}VRo"_ Vg"FOŽW (l~JhKEq:fSt ez%.Yr/գF>.FSk= Bѳ!Rj&m7w>*?9g5Z-c̶ ȌA/uDnUb-uœ'hۛV5ve?tDnЈ!>Y(Aw ,+6)-o[w(nWAC{Χ/6%b l+|r/r !OnOCGN=Mfs\Bu,#^kMD4@Al%,vFV3N ###f)vHl@h.`JR5lG[+Ks[@;,axMO U./lƺτs:JZ/ BNI,pU4s97JKx67:.sЪ`FBºv0 ."z/k=qhc;5C#Ɂf{8,p 0q Ϋ٬EH?J94K%2 _2X|I`7,>MX`_~I i9&<(z 8+TuMQۆ'*ǩZ1{"ڦ_"zmt?tSiFǒ"GD/X Cb}\CODS>%Ҹ~ݖg'($p# Lթ)Yxl^ /$LJ|!.)v(hu cw-=vҾ༒+{mKe~Q1&=FV=u[NqҀY#E@RX%lqrסSa-e\!\'Z!6 00\ONlX&R}ڄ\e:bs6~AwޮXݩe(a 1% 4c$EwY*LJ臖á2#m8X( 8eD\j--W<$,>p$C*7INCD`r&}bPQZ)+03/`W ,8Aķ/[7rƩo3*zWTSڏX4fRl&!$c }$_.V] Oz`>fE>'=h<mֳb]> vUA^ tTCqH+.d-?fa!N)\y_= Rh z͢Ǻ;5Bna>}-0 ; 4_-HJs%/77[d+'E)z80k)1)>g{*XD`~+!#/"~u5P1N+1N0#1lVMa~;lxg%7w".2_u"Yb}+Y; m~m`,-WؽR5: M=Oa}|We5}8eZLyY%Nvu m3a|x̧* kC[$ 7%ZR1Wx]}#("ߴcUO0MZ pH_6o4$c+{DӪTZQsטQl`c4OB8aJdq,pbI( 0s ມ} mc(oLkd Hqf4EjZJqό!=H\|o\dT"S]DKJ.']aSV_Rr *o\d㭁x0~K0v]^ Q=r*_<7HbI+|%[2sgJɑj8[n)̯UF;K[V)VZRJ {VI-S $Ȑ:ji}ik@m8k>O؟ Ap{M@>&3HINh/ Lp;*a,XJGr_*LWe0iG`S,a0r ݏhqvhyŦUd E+UIJ/ӸE1D-4kZA(wcKY .;O6-h>->2{m܅, B&NwkCXBic"z7k{1 d~؄V4B)#u[ҀS+H \\ׇ +F`PཱུjAaRdu@\p zħ =⹄KNLY@,T[)d9Vr_͒,Wjk0?ts;)ߴOd R j+jM3:R_ѷ^.(d@Z9iL9{ _-74xp2#ĐNuG F.jC \(SIƳ<m0ͧ$QK_A>2>[\ R0+g|!&;ASnYk8zFR+Y:GEm4@ 1ŭPkߒ$_ 8,p2ĿYjL|?b?.pz~YyEPD6n)*#D&}aHǖ/,õCSɂCw\RrJ\sptn FӀ^XY`~V{9kmb@%ݮp,k*-_rYr2Z@ ~+O\c!&La,dϡs ᑒQ/d yUk-u^T ΄[+p|^,p* 1"ekftq "zV`n@u zgDGQ;[ ŀǭdN}Q,W1[|6 У r 6f,/PK[͟cErnX>hpBL\GZg}y vɈ-|QE>[|#^Z*˃(Œo=զ]1)[Dʦn+{g ">opD=)"|}Χ<Z4dxP&ĝ04;z>mq%0,BedØsUm]9T .}^ُ_cLv!d5LP|~2 |>(d-ϫx/\!Y|ᄵmcpTW@_ښ-̋ㄈP} DzGc38bs. _(gvnz''` qr~a=aNwƘyWK+ rˏ{4f.m%$F{>nFLԝ!5ۖ|'e`K^8⛑Evj.ȅCy!D2[efw([јr1DJ'WPLƸ><~D£}?O'@;0GL1Z|΄=੠GODu_$̧v qaIl0="F@o顣ID?MD/Waj%/W۩40V"Ԭa BTY:Zfs/"J2F8 wۺc Yo0ڇڛԱ(ӷlHZqV;; M5؋?~ 7!ok1(ϳ6"22a%rgH@uQ@$~>a~kE+Q{6j$ i"˄|>[[#YM\?.8wo:[D@sD Nd M 4|Q+ζޚ-2@5l#⇉Ցczd0ۓfу7[(o&wӯNXQȶ)RǦo׭47sDw2eOݶ$>R( v;2殌Og3T8/8x9OwzV9+}/l=vb#:`&ބ)Y.p%M1z͖[р޾@_p0#޸ŵ1f`-x|+0[Z{`gS4rCXF 47fxGDc;u;F̯< )&JY '' 0̠H̍'1}%b~ #6~cyd&<#apex̧m4JJ@MJ;`=?* Ffv "kn[qq:=T]&6ط@=#O@JrjΧ [~mFΧQ!Pbx GZ:o wx]czc RVD _Ȱ}gż? i׺A6~9lobX ' uދ|~ݗZ^68r,rEz7D 2N^;_W$rn}-vq$ <5+8N;W5DƄXAH;,& ~}ȃbڡsv vqh|_ùqME:n@+`x-pHu_Pg36"]CZzU Ӫme2އ+:qPhV [MpWJ2_ PKkJjc5<@]sj5|:0sdx^k+V;64r+UiJ_Cu?Ҟ׺/"'@!+1G CeV~A`eP7D'Xщv1)Gذ\**Q)|k p <-g}rա|.wҘ"u?2Zi`i6Wo՗4ޏCw@6 `>}hSbql='ZkH_Awp}dW*\/%t<`pL_)kdsts5 .=XjN: qM~Ao#p}I!_\W6CJ5vWBqv䋈oGa~o*$jcoPr~]ʳG.8ϰKIDAT;Xߕ$+0ҞA`> O8oւV%T}zM4zHS|, K?N=9>+HKUYAAA=ޏAڜ5`>moM+o~(7*Y|Põs<| [)LD㎔gEԎ?¾*O+k yqUJ}䚍!lnKw=׫8W;D|s=f|cO"۱2.-'|u4Mq-"zٖä<ܠ!RWs$aPx׉w |2WUW f>{C; 1[3-pexW2r0_P)y#hKC Fl>qK z4 6 y%l0cNn+]ԠhG8wJ{6l,Ԗ G#{k]8)5" 2YwD?My[P D 6.[J?Q3]a>}܂bༀM`a6biT3}o/li&pC+yoH' K1 '}Eo'͘1c:=kK7֟TsuZMVSc5_ҋ zS22tAȹ2B7{tJu>?A*2L,JXU-vϡ/f\S &`S!Y$Qؔ~(`>XkX UUI5SzDl ph#l_Ü5uٿNE@Il\z 6ljX9.j mMW6g0&p^絎^ryᕠ\UЮtڵX ܛtW-A z@NJ?sll@ӑz 7#%ϛTzL\walb3~>-်3}Ҁ I6cXXj}c? ~/Mlvz5ةJpW(%6G.{fjƎ~8UN&o(: `k)?m\6os63GbK) 'Ƽ?ڢzSV ;|"8ya(*|'LMۓr Bį3eDl"bASVY rQ.fTPͳ s`0 VtT6V44 geQiF1"rDn1g.*oZ9s.Si> 6+Ы 9y9(,~UoBrmi%fS+f> _53Gmf>\ POc_,-hF9 ]bqXﲍ–69mtjޟe2 2\g͚|5l-zc JV3?wJsɬ[hB.sTƍjEQ+׶d}@;נLo*Mq>_B,2/vqW-ݳ黄z cHNnp?n A p`{FvH4w!_VsLC9d쯌^q,)=}>͕1f;rrW U, (6s ,9Uy$wGUk?1yOqʆ^In^jSE7rX32$X?X#6A+y#eKxWC'`eoV[ (]ו1+!;Qt3Gj%nA{ΐb,#|l֊+1$ߵK VHK3\bȴmyV^ǠmH)W]?oφ8;%Srh KU 92@X%˦1F`>`]}gnA;Q(d 7=6{Y9@@r`,B,,326{B)g(ؕ4$ۥvXv9'cYG! @֘;r)\ J`(*Kr%3L4cH2" >vj~iǼCS8#/+6Fz+f[$A,9 >aģAN8i}@EM2}֜Z7K+* \j}TƢH`ܨs;v /qDiּsĉGfs1,ccr[cPfV:6g2O%ῼ8VU[=  ѐϝlX+I6ZJl2a$xUT AJE*fF4ju@p\ wRfq|]xyއ<T8^])$$\k%b%0 aR鏌{ RYG]h'4ɵ~`K/z zOkԘm_{ Bk*)ovCb](ZU ؓA@h}lyy0A5ÚKk\ 6ԉ>]=ą|]뢊3z v)8t7}i_i2sjY U8i,dZ1䜱[^p'$"*Eh6uUf\ Bc+t z'߱`s.PO5?r`l߆ϠbD5GdlT!Na\+ww&Ҋ~)WsRPRQ[KfJJr`2d%HAqXߥx˓'-KKi.Pkm*'.]?n׉J9tb +yv\t K @,u37|}\>tF֜Ux̯J?Q6@  Cs(|f6dS%-\y3qd}Ąb߲sIOMe~ɱ ;97"l'ֆrlx&婵6Y_=9_yݿ\_;rLS#냋ac%d`rq>vRy_Y c)GPޭw-wz*Јe2h>-0hЃBۥeXN N =1rg@ңg ؼ iܳahjM(\jZƄ X=Dt @\V7*N^(_^Qh0탆2k9HQn^M n'f5|iH ו@Z ~-x[ktM+`PbyWzO &(׏ ׇ6cpԬYG Kzx0[+{)Ze>4mKC2>#h| ~ai\5RڸXrEͧ ~~\+*91+F>oS$lC n_ۙ\{V; S `ެ~v}]*$ψY! [WOVƞj j㥵IǐO\#ҨR:t|?o}āϨ V9?;־56\u%KY p\@XmH˭#Ѫy@$|qup0E/ЁoZ9CrE9X~Ha0rX R_&2MTB!Ld]cφXcW9v,(piKXmq\4LVc+]エh\` Q._cDN|7ЧӀ5 ՐcnY 1,Ukk@#yԝCؘ<х~]Zx|%rY5ڥ|kM]cɃb* .CEA`GCgB)BM]gz ܷ]qcP#TBs+W\`XV gN߮}"n1Ax}`WP$] U-VqU"䄦DG4Ps^3CN[y/,Ez? Dq}lEʔ+!HeZyp^Kk勰|]G>;.䰬ܥvȍRS}B`kN /Xg`o( a*|v.Cp/ o+>8e~*}ɧ)ূ9.dcF?vSprm>s~tgJ)|HleUЂޖʪv3Cб+F]E,?_-5J8~uYX@Ԁ7 x'qXZ_ ?Iy~yF ;g!@;%c(!;/z2ڦCwCW,gr4ZmJzm #u)yy/]P?[R>,J S.U~i[Squ/ )}Øζ v]>}X8ԮEćRXݕt VKm[g6Gчn>6͐-PC"q*)bvŶgc5MK}YuxO|2eF)p17$"VnLղ&P݇rhw'OBnlklhϥ!{ZoeDсsvс6..e{ӝE B;Ԫu%v#eYJ(RhAdOe7?a%Bze}>/`^wL}MO]y\v\9g{СYlCcewlo/V_꡸8lm" ]pnV+%o/^[Gvut/^Q5{ȝAibi_1*X'<|A rm Srfɒ%ܮ,ynd{!ەD߷ݐVnXT4z]@Ўrk zVYdɒ%KK~%OV0\2x F^ҋ2v=DVik2rHVYĪ|o,Ydɒҁ_ r+θwegG+ހ_^g(pڥehdɒ%K,Y2 X¡fiK>6h^^nK8?]Bfɒ%K,Y8O(c}rVm*c]4 e~9>Ydɒ%K+ ~C;]*h.R`"EΒ%K,YdS 8any&ٚr`W[,Ydɒ%˕9ۀ\qB .67&o,Ydɒ%,Yvfh4`?TsU˒%K,Yd%^/W^|[4%K,Yd7ATUBVˌo,Ydɒ# ˁ?YJ lC8ͬo,Ydɒ^yDIENDB`wally-2.4.4/res/images/panoramio.png0000644000000000000000000000523211676624760016121 0ustar rootrootPNG  IHDR\˸sRGBbKGD pHYs  tIME tEXtCommentCreated with GIMPW IDATXy?{1,æ7TP#VY\+m: F[MԖZibL*jVT`HEイ\0Z+(Q\Pa{{o06$/={ν>_6GWi "Dm^5fDDa;țcA]řs,Pz 8̣3·1#2 U$WW*]Hܯ*6L1'&<%\HBV +HfC}4݌HCSR& 0֨V>N, ~x3o!˯I 1F`"[ֿHDtGA }Ff@Gd1%jHD!@Du 7v[שǗIAV[K|w pu$~=bGV\sq'j#fOdpRAxckblRẗ́SYÔ9VXuC,*> @)+R C9o|z?HoYSqkc+ׂ1ƚ)#ŧ `  bƷA1Da1N##H27`L/@VSq.862٫~ GpIs (Vb]<)) b@4^Ǵʹ31{?g㒃6IiQ$s_.ӳl+x"|Kofڈ2u[ |jvA%FnB0]Ys N%Ǘ $~ k@Kʱn!lBx"s2>Ucpv)Ir8h޿87\Ii'Rb c,\+L-xpo_Ixskc jnQIxrRYw"x eL"3n!4$LH<# 4v .YcIF*Ɣs=HU0PUPa"7c]|:>D>}1סz^"xxOz:av \͒:Ϣ2KQ6?TDoD & c&ω"y it>fqf>@ҳvV ET ϒ8/|jZ͂ ^óH]GJ XV]B@oއRFɡ ] Pu&5ﰬ޳n LbhDLb%]B` dZJms͢D^@Ol]+tiL+Eeɡ̛r cLDЖ>WAMDFzwx { R Jw| vtaM߭^JUM]ߧJdZO#|y%U.cC xv`/]+"˂jIK1v 20 x?kv- 4r6Co׌G[;"D%^gZub,h5"( oE;5Ib$! s"7ʀR/Z/(\BU[ XSmaa.*F!?k3Ė,ֶ=228oܧ|<#{eׄs;_(yd.jt ֖XWY*01ytȻcAz&3(3V/!\w v["J-PYC%T} ,"hfI;ZR#\PMr K؄5ws|?RKcP36> w*bn'&uOS=v <10gw;޹jf.k&ƛ1Źɘt*۞u/a/]QAtN{/[sSLb!%PRJؕq!R1EUPqmEC,&G.Y˨zzCzRpbg|Ĵ5܋x)>mqT=;-v;nU1]Tzfo.Ƨ|+%Sqqh}>F &@^>_) ݈%0db>$饈R|ľA n o >rB\5糮hr2E HǓRHKKw0 )4R`)ƭç?OЏ0U%{ "T 㛈"K>%M_BTKlJ?@D@YIl߮30\sX`p6G7z =wpD$Ґ̃$C&l\UYMrI )gIENDB`wally-2.4.4/res/images/proxy.png0000644000000000000000000000123311676624760015312 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<-IDAT8}S;lA}w8؎7RD !ACIDh)kQ  H(4 $I}ٳEP={ovf1 GQt# C<ȋ}Nfs \n!I )X,`i-%.I⿜/ 36,9M8{[^߸gYzg ʊn׷&\_TmASl'0cNz_Q10pƴj5YsfnU3pgw׆gΘ#:[+Lkg֓xX1=S+^13GfƋӧ??'ń3j6|CnWb6W{#Wږ׉1r+HV[r\=ZŝK{1+z@R0yZ0͟PXu")`Ec _b Slngs4o 9?Ww_#()xu\]E#1cg(W @ Q*3P5Hs8ynrܲ` "viBo⇨xY#F'eAn|;);BT<XK,N,x"ib59přTX鿚2lKgJ7 [ad* 4ݔY~/)?RcPxhH[lg+]RR>в>q XmJ(MhSKO|rK[WiT"K,!_MN~Y+XS.]zKeSp#\ӮG”a'֮pކśTehf=*A*J/J(zr>9,}FC4M4ӷQ߃39z6Y&DhQi=2y=Dldq /%%+T+}oMd>mYZ%^G+T[đkrNqT;vK{z1@mҢϓbb,hs&`J3iX+Z VѦAf7*l3+}”/T؋95e#15!z^1ƃqjG*V4dŖ7L]hf6PTKVE8Μ^VAeê K|պUު( SE5Y`4^1녦"`!w*UY`CL[N ly֬ε7jK U2HBŝgPfB@Վ/Y*3PEJ˕Ybt9?-[ZYmMy_&U@s2T3MfUv9(Ԇv"Mhu26fݗ=[<8٧BE_*bb9f:6дM)V*6BnĠbCL[N^@-fKs$Ӗ7*(/ڲL:li&A/O?T[Vd1R+ *ayl 9CY䰤_ˆbIc:WDkG3a>-'xs Kbb-'JPgC*~a[l`Q+#d+si+s֕9POe. Ai m0@DD4ʜ/l/-bс-2h?N?d4ٙvlv~%ibiK`6' f 1;h.lspT@̖2ais|] di-Gx6i-b-ycWϖؤEJM1+S਄2m]̒2aiL` D4YFnYT.goΣiͣ=UP`sV[ɗ|C緽h(V-b-Yك*m[l[l+Ez;$iG?3#'#p4&ŏsgMU#QDW+#M۪UAsHbCL[NՂ!NԄEWa q!oT!GL_ĩg!t&+ J @@!1"E `($H""@5L8퇓ȪJVeV'2mņK>=fOrz H " VZLxS`u![ddzI-+8$!LBpd "3&}˖w,KLiʝX)mNp1 y!|l)2*i,^ҚqU1 M|ʪ%Z>( ]=#ԧ9|_*d2^WQunNSD !PVENG:jk#\n`p駶~$DF$,縷(Hf smʵbs4s"ZCVH6sXZOEJ$sVsYeGPdT&dH]eZ^Ϝb# O3 uPe}50:BmJ3 NX>0 Y0 (isE-~u1 nTU5N+t:9D'̦R)Ɋtw1IIƓ9'C743&2C ABU@@(̊ݚxTMEZ)BE_,}DZn 5,KfKV\0>Xp4I*.IRߴM.Z~#TEdHtrx_T*NG6nkk >15ˡ 1>y}61w<>[VTIBDPBDD(pr^gra0[Y_J-%Y*2TUPBijT` ̹Z}hίJOy ╷*E47>`hJBIRYb[?7e%C*"eKh,S6#ZjEo9{b|bbbvY[d&KRoo/缭]wP(pL&fVlmnnK&.G{{\NOOO<2 %ƺ y5>c4:ˉ%O@s-/8 ֥IXۦ H9 IHþјj_]7>:ɥ.[g3yrbYwohشņKZ0ՙn˄X<Ȳ}--@(uMQp8Xl? I Cda0TFQz=^7pO88O K  (&HYmrz݃gWs8$~7ŚKUzqRfPkz1kyGs +#\b %z͠@$ @$}/;묵--͵Cým"b1YR(._hbb<"CCC $e2|>j& B,kxٴKho޾SNYv;jp(t}<}_>2C", (A\)zl`NqDeY[ށ?>PUUZz_4 {^+8##c#c,p:/8fP8gxsss4:d񲞞'o1MI0ˉ$ D0@@" "й.1tyR C;Z[#֭>4_K(rtv˖K.6! m#2_1 D|,Cfl6ryt=rdYB$IP BҐ FćG~_:6 Idplt8VAI&eYi1 \G*g0h3^@Vsa М#DWYSF;UbN%QUnPIPDsYeYC@6:榘fg]UҥҜ2R Hphn]Mܹ/mu߸ 眽o@QPE5!@QeY kTUu:iӦT*lRMc-JX,I244nh/^::=|sQUtxLߟfB~y}nc|,;cTR3 t cLUeY 4 Yvw [Ig]dAVo.X_5rn\Χzǟ kp(PkiƝN5 k5=+zG;AY=*h+ bΧ@AXP벁\7r@ dk54bګ{;vv:Գwogmf"-^Q[G"y8r:݈ UU۳," !TU5 cbb<B\NMӇ.slmmt:eYv݆a8΍T2 am Nkqn9@(yK/H\p%==w=p%]#hp *?䒳K;nkCwcrg{GbgaDuD,t*SGGFZE@>WUc%O4 4͐e&Ic\$))y\&%㉴JHCEa|^VdCz{w?04i\~hh<_|ܡn7ONYnL 2}SG;P>;A2Œu YvR>bHI2bVUЩe1EE9 )ŮeGp9:$ [[.k6 ct$5>1_u5F#pw{(J6440448UV.[9e۝#H8 T2U[WkHE'|-[vC~`q ښ袋Yb$sǭ[?fMǟ|a˖}+gUmM4~;ٺeO8~MΏ$  Ԅa? B@yA٬`afL&>?3 Dtww"}@oCc>TTgnp-әm{챧D(%t:]^oC0di%o9/3z͚W^ޥ(D3 @`)r -$`(˽8̬B1ƊLFȁ)䬅$ILbކ 3 /뜥|*/bR9Kw.ny=ۤ"|CQQo!f^yR&ծgFUÛ b^IGVBB?FN!4y-$CKv,[8JYt+OYŇGys- .hMg PdYe%Ot* Q__gLf }>O*eLb \.7nuT*Hd5B7D4e61O z#) \.4M#\.3>kkmS{zW7n /'uOsu57t*N:iy$9-<+眽.e|gZ{.sPL5+,ÿ=?($z{벬0,~du`"H,Rx,Ԥ3]n:2tL&v\dY$Fd *raؾ;߾ X+_Dm& )ɏp M]ŽƗ^:p]YDtA4V._9duuA};:@+IlB3h-]+F3 G!1_1HV 3z X>B!ł87@Q*yXAu:7k,bF[Pe׍򹬮sn`8f$QUU,4q3 !LX9$<"IYby/ßj?ZI񘋝,l6v{JW]yCTSS=rEЎ׮ cu^䮾I8 We2t*7[O.? *2{U1 el%#Kh4?, `{>:<8>?>C] b71Ȓ"+ãCRTfX|~B:Ȳqcd+)〘-b- 験@(MVիl{L Q;! ku[lOrXG @"$aK,m^?qk7qPөe)L8]T*EsNĸ,pmADDL@&u(J&ooou=oo #n;0ƒd$~q&asK5"H$KgҙL:LDrzWW߳nN]nw:%GK/^B 1ַ~r뮸"seQ !ApS_|{~5|t2& A(l``d=Xa,6$IBȲeHmP޵3ׇ#5feaq|TKؗ1680g;l* <O2?"+(1 pͽ۶d ;ZB" #۷U.o㗶vkkv|w-n!!O .߹~_6EV(GAFH&%&PPmqt $O r`LƗ҄g JA 6[9gw?WbiYRD!M;\pݘSDȈ_STD*ƈD ae-0;>X-N ɮpҳ!Mw ,+T:%$Bfcv +r,dYʚ[/F<<-K1%KR pr:(70HHe2@ }t:tvlߡ;'岉D\.WMMDEQeYs\F0>gLU)I8LJnlŊK-\lq(\w^q.$@"~\.H].htСC .<0Ƹ(82@&B]˲(gQ k(X4V["B9)CźnKG3(sIBj><< =5$_أO-Y=アEbfh:ȸnEM_V*ǾxO^yY_A@!Dm]8Os8=ݑ4p#L&a&s3I1%Ibi9<\snw2eyttӷmh4v)oֶ=#;wtzcIYBLL$.iǛ666V[TU'(1!(LU (:r.8窪"kw x{+aUdfomq3j_ėT$X(Xm"{ P@"Xi<RO@2xnYu]uEg|n髨Vt 4g_'y߾wx\b'9߉dM4I!ڦs@dA"(8M /<H;;Ym]GsgSSx2B"!!ܪCaؒc20`\bD%vcŲ(@r(7gm~kom,v:\\ '&" fȝPcWq H%@ ɸݎkWd2Wv2 Y e-#+tn)ޱ7g2ޞ-[778g@_yUš p{\M}m-۶Bd9n5_U~5_#/F֏] ko醶d*1FB@\˯h}D6 T(13/a*ʫ1[i[^c囶YEeU 1K_[ ػ|r02P9Pg߷xQЈF%Iinnքv r:@0DGj7::sghh0 zwd2iDj-Mud&566fY3zr< T2ʊ*>|p4:ܴsG޴wo޽Y]^{_Z}钅 $+J[ NRa*kqh4X.bC~`6,F !Li0,^UffrY?~aͧ3ƄYra0|M/\u/YT oY`-[^N&Smn'it*O!oho~t$&dUىp2DKӨ4&URd. JUEsM #`ǻzn} \߼Ɩ?_ܟkT1b$C&pg2踡 !$'>ދ.vǒɬQ$DR pw'=YDR#UlZ_A0@V(HĀHQ0ADo]$/ CN% KIs, -Yұn~]n|9Ҷ]<|죟 Xo0 sjk[C6Vy詫-_T= 1"/է,s[p|yKѱc>wʓu9^&IZ 0!$]FAƫ{nݡ np첳nz[׮_Yࢰ~]gwڞ~?=&EQ kf 9OjSd kK/t}[& :C Dw" H"$@$wX/ *BQ@+\y^v{ P$ \YYQE1 CU*fN5fRK}=EU+/h <~m}vn{ t|+|n:=00~޲yO.Pr:3\ͥО=Ucddʫ.RO>s[/Oݽ>7= H$S$|[ٌQ_|Cl:f5(T7j* 23L:cW8YXPi D 'n5- H 7s9=wu}=~sndRqwF@ ɮ6Ĭ sZIl9i,l``vB44 /<.2,~@Re)H*xB@PÏ~}|K_$&x CHFYu(zuu /jhD%\>{Pu:20t99j,Bҙht✏F5Н?ᇟ$@7Mg>ks2B躡yÉ$+l>80 3$9Vz/ު{ 4Z ?6aR^zHsH&L4M UQ~aq̡89XttllP䲷}LQ%&= 4@ I#(Vr TX\^gdxt~݋7;?ۼynp" EmOm|qÙk:;adA$ĩ9/_/^yEНoӳQ ׁ&Ofi8v\W[,!wu),_Rӵ5u݄Nc}^v N6ذQmrh6$CU F\ЩV~O -eD0\.NUQF~͡^֭OK ?uns][tOKTUUfٳ׮\|C?DADBR]1@Ȓ*HhVWWd$EfYYQ&z%&FdIk޾\"y<~{}3(-nwI3}+^b!c|^e "!ɊPPCQeY1 sjh]ʶzFvMn3=VPX))~M 5k>0&!+_K@%Ay`Opg\uMZvʲ~勛֭Y@;:4oe߯~~ρpD&qJYED1T>կtO={g_;4t,Xofh]{]7?q{׿#IUoY{?wF|wsp?;˦ө<MU}$* p]ga'iv,L'`DYܖUK ,_#2" ƒ粚ٗ_y~`ps*(14F^L[/C)t!rMo<}?KD<^׆3քT;nx[H$)FӴ glko8S9VYQW|h:]{Z[{G"e2͍4Yv0EH^̦%s,H{ omkweӉTJuskvzpρ.n:kKVCaYv~sn" A\&Xlt">:2RWDDg|l<6>#eLZѝ}E4[IT Z[?^jц xd2@*1dS0e2=]GIٜNθ0)\ekϑFNqtڿ 3YV74JzEkNx\/oyɥz֮X}߼&`$a'1R8^K꽑駭:s;F{c7moe ~ںm~|^~Y ?8$$pZ)[ 1!0>Oܵo3D|~_}v!Y# -_~m/^|e kJ Pt :)SF`O{>OwOW_W$<j tEǒ\Vd !0;Ca8>TF0f5:W#d:4=x=eQK\P,)5I/y7Mc"۵}t݇Y2T ;<\tش߾_C}`x,JE1V (,r1"ĸ_m]6>3OGGB>~ׯ|?%{ogr{6~IعKF8׭qsݲe1{n  d, @IyࡧoOub ea#*l+o0$&@'@9nRNI$ȥʚзDsmDg?x}}޸-V`8ަi-"t!$Xf`g/Z4?D繤:Glva.7GN0\"rAf:StB6Tt|3̄sP6"id=#avU#e1YE nLr8Y+iBSBTTE5z@2ɱ N[2LJ~(.X0we%{{z[;VXd-;ec!ၑFOt$zʖщ^ q#A?*ݻvqCєO\R\B<|;?qp$yl6cϩ*dܹ{W2D3>͍GMVwieTCLvbɊ_|/p0L,06^—ӷU†c[32KGM#z]Ywz9!RzJ.Xl&N S<1Y*&jbe=QH ]zIk$ #6^;eihNTfܲ㕳NߐbWv^z[r|?+; -K.44-g04 !Ͽs$5ɔ J}JyEPi/O힤KۘI$( BoF,t4f"KPT]g-p>|i,7>^ov%A<pz(ck;Fڛ١ޫn|mŽK߷-]wUT$&Ă˻lyig&#!PU5-v5ѡ @f2#E^"Mn˱y1@l;1N~c6H2 ̄"% H}+VY# Gh|ְ֑xQjiV 0/t,6dDΠ`Cϥ ;d,[&KP{3urB_;8|N[~u'{xx˶qҵa8v*J~Gw\Wy>u{/ժҪZPPR~$M|I14Slcmɒ.m^[yܙJ6-<{=9>Ԛ 2#5p\*n/|es|*L'=3P :L)'2TL ɉgcpn7U3׮\UP5֯X|g*_}%3g2)1 MTT6TߺOٞ :Nf774sYmm!CH0Y/Cosv^X .Ei_mYi_-Q,n8 2u !x8.k}I:k7rbr|z}#~rnG$\ABmmb L31bC"n e 045>5wPkSuZt6kk|M7demknii ^F!ʋY^LD jjG$⚞u04ӱkoط sa>¹$VCC,K )R &&B#Rm]mN 9yk}n%ʥ2'ꪮt2dٓL6 !, 1W5ԯI454>MSό&Rf& LǪ*uA¸׭Tr{!yh9e\{C}kƦ 6_t` GcL&^vu u]ܛogV73 -H`a\f}WlꬹuM ᩡP(Lݨ7is(22`RJ\dO`Es`1R2>r%",53:JŠ*krwU"A4 ιiiS0|?O?yRQT-k640˲+/C"&6nQم/w}T&eŅĽglKk *6iYCs΅nNKem?;2 $d%]IE$D-CZδ9nH(ehF:F{WEBψKƋ3l H H Ɵ7 mfWF/Cd'bh^E<<׏Knh55;wtm߱ns}/LO.XEa"\SpMbӮ:%'/U1n *۽֥ĺֶUix{ǖޡGzI>7##wNkjTV6=!}nxIr S͍5>9eUN51trNǓ#D{$yӶj`LUSUa陹CN$ fzRc@wln9BU9XNd#Y]cWYW]Sֶn]T4-.1{|g9_W$êLJpYZ[/őBU -Cq623%!0urb?>Glӧnܴf͆?r!"^(ЊcSuܼ'7&ɍu .3g"vG"ɌaTYnl.4|؃=.C׹u?ί<~F$ BVȭAfT2D0syp$V߼Ǐ$-(aASɼh ƂT @b$Yb@ 0&C&Hd)Ƣ~sI+52Ulno4ir\yʤ%qoKW5X,ͦe"~|)_ŋ_mKJwcVQ#ATUVtˣcӕU;Zgs׺D" rY= Aȡ3x덝gzo]vQ]!g[AO6 0N۸ m#+p2kklB|bl~~&aKgܓ>iǏΣ~w6TUVOf'kjS7pH4+r;NMJ{T#'sDpyy|^צ2s1A~L(bֲ3 *xTFP .u[o;laS pxlv;.A\%aAa6{-Kݗ˾2V8Y?7MdI%9iWU&Kn_7>qSs{ӍW\sɷzT\JQCXrSNHFCq9?8]G8 ydb#Qk+:oYmk9r˶̜M%X:Pw9]5 ' tFD#H?XFFF `Cd@B`&e_2d  Yb2"B"yI1k,-d?|R c+\ߗA̢HASAD(3ɲl.T8C U:\[n׾ lݼ<[*, 3L$AS3!Hlhnna-<6]˦eT/̙ ХW5PSM'_?˳g 9! T/D]\;~y_ԻӺDb1gq+z5R]|ЊWZΚo@~f5C]RCDͬ: !g\uUꇇ,Dvվײf$7t(&oپgvy· ^]_}\s7vxW]2C*bו o皛w󺺚׼-uU.ّHf3<;*K2Wb`;wv8=`H\(h~cSOM_売֭k~{s`biqP8ey I38(4Ɯv)MC?z7ӏ=ʲ$66񔧳x6NgmiK)߹}˩L%{JAG~% LIx{>{^<^O,oihp97 P!1 $( ,Ec+Թcu}LV5EZR(bB s.̅.w*GHt&IMmӱH'89kjr{ =}ࠢXr6L!ܱ} 4CY2pث JGGU.z7ٳ#KMlt.]@qg[=ot.i< 윍J-7p^*RefO瞇Oʒ%`M:6VY L3l$dBІm-^Eexx,>X4.1_XU>:8YƹfgYq.xdIQJVÚ )2P_kۼuSer9g㘏UkÑhW.u-\`h힘XuHρ'9330,R!2 ] EcQuBss^[Ӎ{=0 S1Iban (a|:;/.eT5ғ˜L^J$"A].]Uv{A_LfFMuT?7m[?[če[+k^ED@)nhLFT˸Tƍ[״w 8Ĉ,ɖ#$3n,wTWGB+{Z;V98WY %>)si3QTp_.+#+X>+% t9q_!#eȐX~Q$sYlEBHBODCiYuȀ(3fyK2c \N a}$ˈ27 -9Z6G IDAT%6wEn~17݇bz{}..,޻]ihBpBv[}CeY;>>?Y Gڱs"K#vncnMq|k?P^/}BͻM0%I˦ݪlF)z|ܣEt<5rN[/qy U+{‚eWt6b STUP<'3>̽?TW'm`Yy"}oھ=953U]ݴ.^蝷K#sQ``$Ayg'Z04>rޯ~u +.߅SY{M,OkkjeR% VW,R>Yۭp|+/L,Sw|u87}\-#W-D$@NӘ")LpN -k/uYs[GX"N ! xRg ,6Vy;vfs@ ndI0o(E޲+K%tfݺ@{?> r]UO+{HDGι^wC{{ɹ132Zs]!Q+֌/.hj}jS R9=ydHo0nQI'ع9i_/.&#-uZ:Z޽sҙ3'šqoڷ{;B}uwNzLZe\&E<+?e'B_2*i}D))Ds5u&61;=ѩ٤sTߙY:N%)£qK[ZVD(Pvڿ+q9o߽汇 I_дl]]E0yWvԗt*YEyaeʪƦ5mͻ &ilz=t_?{fl9HĈ+4S!:$f*ε%Wlҝwplz\iI:25Pm]ߵc߮]\6[!F }+!㲶U e|)ҴҢ^t dC?Oes13$ۚ5vU]߱9H<չe(W&C084#I̒}/f-[D :헭]ep<ЖL&ό?~~ȸ 2(8qݴJ AĄ"2ۋv5uٵ{A(cI=䦩Y$y_ 'l o'1_X!̫w@j*o]ox(I隦I7t475]oMn$D H@ duUA܅0I@LuG|8Nd"Tc}=iSGl H2Y*|L󸸅B_ lҹgL.ZrtU]YeOÆ)ٴ"ɡŹhtQHl@1q-..:nȫ,`L.8}x$NIarz3BBN*1 t{,Lz[o";40cώ NKdӚV[:cҙÃ}p(˅\^ٻgu.1/Ȫj7tuGál:H$''G׮/ oxpqھ}VV=qfPNKWo HP+6 t U޳c;s-;#XEe lλz򊫮jXPY/ DZQ#a:y `5GLXXzFZb%GkA`p>xUk}/'&6tc!6u*_ ,e $E˽дQ_qFdcO?0Hd磌UgIC'I 2kQw`Oy(KZ<9)igLf(I\|M˨mr:k9eE5wTļ`&'̿};G: nt=FzQڵw55vTPωS7v49,+*k:HӋ Uh1"CW,JqPYr!݃WmmڽsO}FNĸFx!\k x"\'H"I@4—iq%j]\D+iq+_dn\iF$%2DYYʃږC<6 b9l+f;8¹"/F.>8_I1jݟć365©'* @s]ZBK $` T@ ˢ _Ng#@Q%6-P!Y7+#J^/?}$A O?/1!sFzLMx]cYB(x>n)Pр$Ud'"`R9qn44WIlDڮݿs2#( ݸ|okKuXbz:6ýO' ̶5&Fjώ?>?8Ȏݻ&Fbty=彧ɬ dU% $*0&K}E^5o3ʏ4 aGF( XpZu6~|q82NH%E]{MWk26pXæ9r%ʗh$ 8!P,3025U̙39{1+%XH鑨)7|ۿM ys LM}^} |E%TR! $@uWqCq(].1 'NL YN (dIp0*__<HW}ۚj@BxQ X>%ފ7€! 0lRLG,P^nfwtvH=z=sfxzbf!2LR%Lgk$lGΞYxL7 ԃ@0X%ByY짇5nok tʚCNT+Z׌!D$uѧ{ 4I&HfDw$O)au0ZRY[Ǹpqa:HWVsX2++oh=!YRO|" &ΉIw 07~c$u0n,Ϝ9:4ms:zxPd,)m֎툇㉴ Iw mʪ) *·:3pÿ= '6vLř*wҔ p,lfnpjwpƎgz7m)S\m|rg<889SqT[cmy竬*V"潓eétPYpp滰9/_ 4Ky=J֤2oϳI{]n&כkZ7F`Hodj:911q뎆L +=6c$`Ȁ$&IMӋd!UxND&1 X>I)XZ{*͡uy8 $ c۶MֆcIE[߾}Md4\SUMLL=Hkc}m߾Ӯ1_C;sXV_zIrA9w}ºmApa)ij霤b:޵k~v4:,֕=jfmd ss㧀9 Jr<%,oll$Huu5r2elMN-iLtnc3S  ?DėTp9p!)ɡPBb rS1K5Z(Yɸ-kbKkqbI,(ko7LZޡh}oߕ}w&S|1u5_AwWUV  UzT_yC@S{9?0r@.rU Uܞ(dPV3_˵ٙX_ @~f%]X_sdg?7xn~a>78_Sf.>} l;꺚D4a fsW|mggS%GG'F&s$d8sEQ$B0n[CCU7>6$׶645=AKirOo+x33k,ݱA -<~_s! 8e}Ayo@]svVdšK,jqN*6Ne/^Y6`_ʤe?#BAB7I4d*;ljדN&dwpu\X\\ /:zЁ၅Jo}sũc2Ȅ@ t6VkƢd~tw砐B+Eb2JDu zp'.Ţ8!q7ӽu*wKfnrn^TVW+i*/**CT">|'>v|a119=I (dVJJ27<,IA!k ōliK!b.=IWWyMG-ۜnKgs .oh슝&Ow@%InhzF%CLVcLALa*Z# . (sbb|nv\2DBAO$4L b[y,fl3_ć9%mrPф:9B]Eɬ2Sə"3,]ͰVݜ_  1_ Vsu/w6ήlҕg~xkPuDԉ׾vT0lU;yiMP}S{]ekVIT D]ֵ@{;]q*.#qv`?xl`wڮ+.TfSͽ0h(.^VVJ3O|fB7ve ޱ 䌀1Ѿ[:g:cNCw*Ljb@SPƆyM:;6Gñb1wMOx({ Ҋ.WV1p= fgv&3%JR$2+́ɳ) 1"1Ƹ IuU̡l7TݷiUشd]x̲* 'Zw<_4/My,dB1hp$dN &COL S'lPeݿ>|OPxtN*BS8{Ks%yxnbwoPn } M=Ky+b"5W_se57)\YY.' XV7Yͦ6YΙGCSӡH"CIbX쁤 Z/BhtVTkba> $oF~aa58BYB]m6&ɦͤSZyUeSۚ޳gUF&y[Mf:7wxd&bvEAbGv9H*!$n+"'dɊ8ۼMs33|nW IDATC2)`LuC#3 hzeE"!)1W%b׺VO) ޹UY&$6y<ňrTrf.rď*~O# 9~O(C,ȅ4^< OE ZNj;?B䴞tR=虾<,VS qrk?J]i !\n;72"ʚv#Tlx:Vr}cңPsKg4wHB193|tZ/.{. K r5,6bC<@&[8dbyKXʷ1H̩*>䶷lo~uW\[F!Ir>y6+2k I++W˲(/XK̂2 2-,&Bb #2S8wlVe)˨?q`bbO,NIDގQIc32- n/ 'TS< vr>>eC1,3yB6lmv&+lMDS 0t1=3 |‹aS&S:y2 `}ENZס$pd)0@%$K/a)&HI8j}` (簉`?;5yA.!NtfIBa3 &2be̊ցS I2U$Ea s'y8HD3 :yԲQaEB&)D4rv>y(`nT宾':6mo^O$Ef`<ֶuC}?㗏?tgn3@8"$ dȀ)ʐb"?zMRK.A_x.)R. XJ/&>KW(Ue-hWpcOYY1dƼvQKp·*\0Q0$X /0CףId;3!s5TTw]јHL:tUJ|M_]W[>=͞3y~Uن"Zt8Jb(HhVޣνTw˻o}۵ KU/#G?x|=׿gt7ojF<UTɍH|%)e,԰4utxN,!\#d5_{ h\#9NL:l"̇YC+`g]^nw 27hUi+BH[RP>GF&2kgsZ,d4w/xo.~-;=lqAESʈ-M/Kx1e~x%w0iZ8?ekPX^/iܴ`EY$$bT]Wx[޶g۶-nU$3v'q4HDt&wPo,W率آP#BbNrmgZ`y쐧;bX$In;2"*d>T%v޼&\WV[(8dp] L,18]ИD%\q![I- bG9g50Dn|w튢*nWsnG#*H)F0<CIdɴ]ÕJ;15F`sKN'3*ⱐ< nuZMN%I wd-y AY[SwwOόG"J)E$YN&M$)3X ѽ՛1h& aJP0F`eҗtl(uC)>!8[BT%UY>>D X,f~X.Y6byKYem^+?]閠sL EnkE׼ 47a׎NWu,c^ax̃>vD£ѹ&Y# q9\"]e鍝nkgǍw7׸h}]eVU=$7LәN0vvwϜ$W72 E/l%@A)fQ8RKkqbd ЉLMu7k.,[Xh` ɭϮ|ٿEo̊|"RZ(I$1Ɛ!ߖr  Ֆ <ș3gΜ ã}_gWՇ?ǎei9Z<_(_ Ӂ<{nlρi^rkB@$]eRM-ٷqmsC]2T6gpgs'O?~+G9I,IHXCDfq%JÒ)2 ̳THhmHntM^simr$\"j@QUnZϺx{o$usoɵZz_ &Z%!5!ˣ4Cavx<F%DJ#AbzCoU]kf2 @*#|2=[*aǘD^~˝FV=tc@82:FMtJ!))z>#2T2Y T_K;Ym{Oyfj86M'1,YYZ(I芥j*ç*!!RpV "3I %^?D !K!2@7uJMMM~_SƺX Uqn+ݼ,Yz; oN< z7wC ʔ5>~g~쓇ڌ(zڥۿ?`}y#BO)r?逼 `pxyFYuzr޶DЙqҭZ-$2sKpjpđû;nQ'Ib kX39ؽ7뫋;XDF0,$ajxcC/8Is9UZDq+6"4(=kZf:]]]LIf׮^l׉NII1Z]{zD=HDXetŒBk,C`oS'{`ԉ(:2<yh[~@ P ;on1:qopaǽm/tqyKo=m; ޜb?^]w8x;۽v 2.ɇ3@NM]_ڷFgQDK>r:Q>9^][^A4J53amE;w.L┄+zj$BYIEiR"{JLKfN3A{>*ՉbyN>_x/dYg>peaimfxPMtymu\LIKXVUDO[7'TƬek JמOK+ 7agԛC;]%Ķ>165?ş7:ԋ|-Xzo^N~|-Y|#=}M }s]<00ֹ\j7:=Wۿ/=sgRx/EK'Lnps mtt%گ&C=VʕZ-:`o$m?ޜU@?]R΁5%A1e{E,츫ǮW׶7rbϞ2T&'dvcQ,M#vrU;3]ӁWs(傒$YP7̮iN)ёCi5 0o:vn>xh((2FKY:oS&CFW<ͻťfIJEG]aZHκhcJuWv>yxvG~ŗv6յZd'W]0רgqLRpHYbtHf`Y,D+Q`L|nsw{8Ybry;]젖/?9og' ,{XcmS/n+[_YŷAz~`ul!>c,ϧT4JHH ZwzĮ<:5թ6 Thxn.3_-▨[  wXk110Jg\pc>@qﳙvmK_F9{}Vo\F?{lbjŷ8xyfzX޷wksw/ώ۽tkyeezmVD70(d:$²>|J$w>C!2Cf7{_$$@0֥iJ C;jK]R˂WLFղnw8-@5h|gteء;$0R6>6Rhuک6(5qin䁽Z ^{ZO95dH( " DЎ&Ʋxm1i˵ȹ]뽜]yck5JR@ (Pv'dZk4Yt De|:t"V Ŝ.7ÞdvkSm]ޱp1xt3О=Sڭ];qޞ'tTYe:4 7n^W^hJaԊ}gת^?΅2 @׽wKey-\%K~wz,> ;L .?€٭zkŤ72X;܏< ݎ/wZ[r_oP~o#Go̱ãk1w4T1y'͗.]|W$&cDP3 q&V9V92^(}k7Yx{A. q΀9G,\f $Bp! FX{Ijxzo\z=ʕ05;c?Ǟxdvz\Ğ3Wo>K_׭8,oJ=g_9w\,00<͇sLԳApofl";C>Uwlk'ݟF˫[/(#av8m7i+4ھi 6\j6lC/֓~˫K'Nl$T=[-J7t8rS{w/y#VGML +nʎ;rk"8,'v['w㯾٧_p6֑e7PNށ^;":b4Э9!snUÛuu"r?4 F 76 ?8bu3I=S-T {`; { ľϒ IDATұ,a1\ZٕZӘo.Ʃ!,K'rrI8Bڏ~ÍՕek69 qd eI`(,NȀdVf94 %p oCȎs)9Om9GUΨ j0XL6MbX]x[ݦT̓{ڢmF 'gӏ~|8TWʕL r29Da#ANykkwvXv{;MpߪdXڼlM숉StAFqeFF*BHJ: nRmп<텛7lst`]ż{N<9AX;>{`჻Vӡǟxp:DڥFw/kMK(:nM^B*㻛˓{ɴ5K^I禧qj4ڈ< D:͈AJgCֺM?420)GviߌLĩW3&4lnk5[hjnCؙ˾ܞ{|]l!Nt5)N̷e][Y:o2<2?{#Cg=GFΜ_\l{7m:(&룢T0M2r+ rwm\/ @f&N§~+ϝzRy֫Q~UְB~ VAD.f Q 8O#n*tVh85F6Ag`9bFg{c|?$b:y^:ą@ifV|flޙ؏`|ŷe xzrJSbp vfj9QZ[5kk6L߱Z=չۉx?JloۉyϞߒ4Nvxoݾ.icLD)V "Budǎ|+Oq] 4֛~cvrm,,L;;_ֹ3B8g;z`MOFK蚁?K_[ʰ8}hTEGgV_>__G3_??QoUU/בR7z7nf'[WtOc8P]d9'i:~ƴȺnh* HQfv 8].v܉30m9SQB 3Jje(I}~$,'G=oMOP)K|PBN,K6 ,H4şxnQ,pOdž&L8\kl\U+Q`c  yC) [57^͕7Rvnk<EqKs/7֮t ח'|=rfzw`{`R *_sgj U+SS{$P*NML:;,t{ y.͚S㣧O:,9۬s @ynr9aZ2p@drmkׯ^ĵkO3`W_x3֯_H9\f+!!Orweo{ѝ_uM'Tmn"L0!#F<}}'?|N<^3o1IH}>nV0nccCU%L⤙Ih4̈>W&KmUUKYv}6$Z+ѻwepΰ.N$IL;`Yg @Q`$C$,;Il%Xv%+)5;D$$Ku$*GMBdZ։Mv'62hFIm# CRTЫxj(,X$ԙe@ $!Z1"B;β4D0jc@"ְ 1FV-ĸX 1+ZNʎ1V(f:3330`ؘYd~C DSrrNnXSD`HjƆhiog7n[7,9k%QD@|Gu~BL›~Dֽ |%x;߉-o.aLu(%_Dhٲc`)@%acoGwyJՅE_N-"5Z a2fӨ?닷2%EQ~䉽[. ʼn02Z327.ž>ko6}S|AW/y5P^Yyo /Z/zjmR(P(T8_o/GUƇXp:T h_z3rZmʹ׾°/n6++̊{NOVF_z\?=gr J-{نGN=L̄@DUж jG7mgp&~=Ǘ9"ryFZdR.i9O|Յ+瞽zkj[ =G~ ÕxK"B 5N}(m; ݩ`v쐛{ӓv33{O.ϝP{qt]ߦ`nyб  Xir-ZǑ#Ib&{[0$m'3C丷9Ǐ 1!,;fP(!فE 0R:@D뭶c0 3 U*ȴHv m53*@A($9,Kb/2 VttIv0# &$ ˾yJH%HXhh"!I`BV 04X6l0 ١Qrvff'S^^)j8ӎ8ˌsA;K$D>sa̎$%18胝R42t:L̈F'өvZKUa"M?;A.&!퀘Ɛ 8wg|&f|2AXS۽mHM_^ٱyщ͌i Fxhub'fN^^N٥K~eBu <ךt|l<\:u`o={&5PN=0WnZVZq1:%{f W;:$gw{#TE!\Hŋkq:, מ|vəcSs C?CwM 7jKKo7WWSĩO|!4FEfÓt}NN%Y&$a|Jsg/~/[~7nYΞy3xNntmd$';wo.|G#¦9wň{4I cHdC޿?KhXyo/\7ҹk:iQvSzJ攄;77w޵ &#>Q#ŃGNA};໦r ;? D5R![t ))U iZrR'Ԉyָ$^X=#35Qc⨞>x̞jXvCSs78Y 0M8rq;Q>Xj|\ *RpvP"k2iמ~eR>Aׯ]~f'W^='s׉3G_N}q\. %51>|Z2ώ'_Y[ZPL/+3 ɋck.֝{>]mΞ<~⍥ 2=>Rs7n^ZJA&womFo;vq]`U_VR*ƭJ;.Wb ~wnHoyDޖG`<5MGJ2nG9֙˒ݰ>6Vhr_pl%d65gN݌VXǝ#e.9'N,LgdfLjR!dfc˖cc-[fI1Z;$rbFĩs ELRnj I"CN2md)#;$ LFB\=Zq% R(O)kD^;ϓ> ғ"CΜF9VHZ)3FIO;h[TIgqAffK@HI{AxB`$$ ȰG #8J1#$JsO.^ޥ4fodKU[*#Tlt(+]t:v(ܿT]bjZ@cKSr"vL G wع">jm1brr1 { =(y *!} @|]?򾑽,}09ٓ$ !R *adLᥳ CIl#dm衃tj1rhZZ^j꽻Uvc#k~#{Ɔ4eu: %f2? II+)OV-DB*%OQ\B @nX(tOɉ˗^n6k7$@ ^C4:2S?Y0sMrAƝ[ZoǝQo6A %xH+m^k}򣇧FGewT齕B5ӧ{s׮XCFOx?8?feS'Ά8;>\XhjQj?xQ_;{~̙ܹkw `n(ߏPI03%`UJIR $rlf+Z\B79 lU=='DKfũ\.M.Jt'SF)J`Q(gXDŽ@8bfs,@B!Ee$sycf`%"AX6l$ia$K%%䜵6(,IujP MLw | H JI@Ԏ@#J f6:'DO B ͜Y&cHĚNYVJICϛP D_ёv;3kR;EA;l<1%o`\u=`^1;V<(|(J$ql͌Nr\}W-pB,; DNpvnޣ_GO#P@xr99d_q r0Fǽ>Xrkqg:`D#ytx}sk6& {g@Ş'$/Ru0 괳+ZrFQ:M=)HRପdZ-:& ơ|$?ri.ZYɉR^;QT)3Ί k/xѥƙ 9gn]1؇OhӱY6㨁RymgP, NaÇ>Bqn7˞zɣ!XOV<}z~Xc IDAT7SxSV$߭4WɃ6*1޻eTMN?2:wya3RI)ع-ʛm'ްq۾ļݜ' Ce B]LVk.-=+F'BgFKEWڼK Vv&4oN3#텭#ޡ>]yQ *ف=bjj4y~Z"rl\$q7)#{ݷWUJIQqh/,$ hc#J*@jphuB8<4@iZRZ)d}YBt( Y@rA<b(3ƱeVBrg@,2Y45Q'-< YBp|BߓQPB (! H $LGZ4uy@tY)aPB܏ʹ3혀1#xDfVfvdllymَ4I Ntד}^nF Qr^Ѕ%aM C=JN+WXˀ$)]Yovvrfr'5&66uΆa_"1#b/]JM@9#k݇fu֛jMhcTHZB d$0 !z<_IVkZ^0ģ:Nt$9p hԮZJV' $-ʹ)(U.x0@KgiI42mom=9-GBJ3l5ʪ,fÕ2 juR()[h1io qk lGiC7R֘cL~s4fcͤCC$1DVӓG {w~#ZLy/  @ WGj$*xb5N>tbfT݌lVo6>ć>ōfcB f+_7нg{Joc$a'poYLL:,7^pqyyر㷖V8RJo8?݆?Aq:9g@+3;5q5g;siBç/<\X.=1⋙q!=͍ZtRbpa#׮;vj Kw.oe!w3͌RqzfokQl~l bẬ즇1:$ !u:@RJf5AI{w1EC+RqZB0Cg h5q Ce,dGIRg( $q)Bf׊P(HyB!, (5Ӊ:`:0 D8q42H@WB-~0TðRQT}S(14K3JyYQSc3Ù558melYt֥ZB1Eڙvt,6I2G(<puixas3=d׿??yTTM;7-=ް;8D"fnFn`׉ᏏĜWKij^aL7߿lh|w`+:ʘ_4GPYoGr7?lnY]dg"(߻qͯ{#gm|Q>ݣCj/Rr;4t;Ч)|dWb_Š˘9|Ɠf6T"9t|)UU td?%u2%yqY0 qU=mh4k@6o]3VWcChR m3e'KK~s+tڕr{#Gzz @= %`rMLy3@GM!& Q6GXRRB۔F f)J䜔11"XϹ勛D5XסiDmS])nfu+`2:AQ`mEaCLjIPSc*f+zYVX5mB[$\, |9GĒ<763@޹^OPedl.\yoãؐAVK:ڨ+1h1 r%^>̲!9Lg-&6TfT,)N릍i%DyemݪiO&p{h8(ײ{MY:\~qT[NPpn{G`߿x_^;|[Vד퍍zi|S_̫W d^[˲/E$Dl)#gAM%^S7nN>ĥ?wiVnܾӫ+K##">I}ȃԳ7ȀgK/>ҫV =jo}k%kwu_zdsݛXǨ ? ?TJdMk@ Nj+N8 ڻ8l ũO5:dxҮ Ɂrv3 }?(sp{3D4 px"N:_h' -mu-t l`1w _Dwy/qvI{yuKZ]N `Yzy"?OslLn 2ٵ+kO3z_7__*svE̯reX##6(i:hb !VM3K$iBTfxL!=bIPYvލƝ7^2;26|)>7B)wygoq9hh&z3~Ww~w=O6!AUM"??zO`Pb?~7tĴ p3ha{homy[{to+ W,썯Ef,|8 MdhB4[~nwI}~q&ʜ_p\ue[zhQfIǿEqR0{E"2\v?H8kmsJ.\Ƃ9=jp$^~6'ݻh \O06'ŸT*XӶe)aT=iX$,!\XЇo _u߹Ua\ 52yR 1$1~E6- U!JX_G/(* t6ey]F~j$!&4@h# cEj,>%U[$B1% A4&U ( dH(3jTRBLIw660B+Gu]7ZH cH{dۦA1'Ͼ(ش?> %5Fv1&EQ&i3}pdhR@Ltk}]hfΦuS7UdfmT罙أ ۡb*"t5z@Sx"(tqZTIR˨HTSL! !͠ mBhA<D=!$SPĤ*.Ew@4dʲ?xS 6Dtֵ` &<>|5́ͼ1]L?󓣋+-K6uģ|ZPyjDžoA:Zgs!x]ZZ~cX[-$t|g6/s^„n Sɠ@"$ <ۅ ;G0J4螞x*D_Ї>?ڹAґgr'Mj++~n+_xrskBh̍!{~`d6K)Ze:E`*HLx4DRuV>8B""uU&:<;+LϽ| /bk0w?8<~0Iy7*Ro_\?lwGͬ !VM JTx.3x62˫y;{gojv798jz`fK˃KZ-׮㝇{~~ޝ>*|ִ!/{y^[GP=+G3;O;߇0S?_xv[JIiZ3#@I1hj*tx&f!iB;LBjwKGYSgc$0af'O%2dBdIEI59"T1DS3PDR:&$!+\۠QTu% @ "(J UT% #eTҹtZĦmchULف,%:6F&nBB0#E&iD$b"@ B3kchL %C@^*z,t2dRh"yo*fbR@ HX-/x`g /?.Mn{խ;;;0Fgɺ;/Fh eO+e qe)[k{EC s)m=LV6[`\3Lȑڢ{4y+SLۧluiy-lxA9kP+d eER3ΥŌucVDs𬚽 P%" =bDh99p FbUB,h"<U||Jth8wpN]GTѧFd*&LNf_횐QYzRemh$ x8ޥg_=e[km;rʂ ]w“ee,O'x3!#WG =!{˒x6H YBD%8α;kBcJ!J_ ̬4jLi$/r 枘ȐRL)6(2B;vD965_dzs[#h6?QbRFd4I4I"؆CJQ席cJh0q7UQD 2+|PyzlVt6TUM$i[0͜6f'"S4C` x I uwC0B&(U-3"`]5bTVbjjQb]ɤj!fbbj8軵,ϥ?HY^k; _df((),DM +&r@Q"X201Ղ,V4y$3plYfDjJdc[etaX]e+vuIF97\լGCBD"W.ƴBU;OzCNڮ.yF_Wо P;fn~ .وNxVnj{b i6~ɜf1Hܕsޤ,ӺM=c!Ht颫@(/t4*`8w4J̦ڴIC|ƥes^OxNc "ۇ =;VEi;kA@# @xؔ`X@^1淯d'Χ.+gK޿6i?L+k^io8D[4"9K=w?c)K3ЬDA|xjM,ԡͮOpwMs,6Z)A!hd; #֛w?ŗfԑ7d!"4&:3}eeJulՠM? AfJD>{ IDAT2XDDUYN1^—)5?.޻Ͼپ,bʅѯ{`goRŗ/lo}c?_cG+5@0 \W|WaW_w~3 e ϐ}܄q!a3Ң."UF?$Ç{"{j{ӑ|ͻwnܽ#]ތ^^Vwu} ߾t~(iJ$joRD- MJA_GD gt.62FD$e_],Ӻ |uPՕQʬjӷ|QPǏ+JHDI?ylXO ({ɜ&&;a )%@B&S8ϷUzfe'|% b[d2 3`k&wL_}{'.ϭWLexbm7Ƴ':~:LUbnMLo-/ W>_|͇&.ˣI?>߾__{Lff`]a'Pr} n@X?  ~[E)bF!0T(iԀ\r4Kibùp0;:ī[Қ6> W3?^AҶzF2%&t4_Ӿۊ'YL48l՘'NN +Wgx.koh!JHbjȲfbBEmmJ$NCb&CcfQ)%3@2I; ʜ9/ yL'e zY61a= 8A 76Vuu Ml;9Qs E5ZP3" ŀIҐR2MQMYLL EU!8b̄{/Q]թU|žiPxΤWM .I=M RG *YQ mSQYαCj|!#z24*MmY-09"MB QUts@B93Ȭ[iǔe1%3PΛ( V԰8kB$29t&Xl!^LF/]f:] @%˔1 ԳCOD$ zd(R#& ^ƙAhjdut8ɵJȝۓϕkqf%\W#Pֳv:D *%0p`>Y$\UcyjěE o߁N 4L om Tȇ`q/lӬ腿 /;ȹJfz`w?]&KhKG×_z7vH*`)A^OÍ,T%+$χ ;1B~uZ6 :0o_\~iKC)9rg+\4BŀER%6@i5(򌜂4f1)FPpcRM!:$z""%1MZZ1"ZZ W$[TPYJD[33B^P@j4ibyRwߛ<O3Ai6(mM c^ʕg66ן--qϼJc} {òOwnN9ZݦG]P{L.+?q~o>5/+B4f@ ~Hy"6—+ۉ*":{Ϫz<ܯ_ۿKۛq{B4P'^>:7^ҾàOE'i`o<Lڏpjg6\Ir(l\ZYxbV<FtxpZ椮ǽ3rW.\v!ԃ{=PL#803Fky S( :Ae4$#ajv[dI8F2iuj mB]kދWlfVHHf"h(sHuے1ee5Eb4&Y! -ӓ1YTG[_#:"Fb 󙯛JU6v}ԁ G(el֓ˈ ly@E(u &::F( DdXPD܌ ؆ IED1#ƐR5T1)AwW#E$bd.L%Njܦ4h6UՍ,ĐUǐ(% Ԩ@4x$Cj0#Hrms)2CuaLg Ӌ9b$m՘ M<ÞEQ3GBT d6dj e0h*7٬Q&L8jfZ6^=[)/ALѫ3J&jls4S/cf14,ʬWOoʵpiq⃇λ/ڨ/Wo~ƭ ΀;ҿ^UpObi3-y1ZBE,+PEٴѸ&5t[LX;dR^̍Uj~v 4PSDm8߹3LeLe޿}0L&i:azf,Tdabf# ?jCa,iÝfVܥy n3~WΟ[|yu\k,9n>L:O_}K?<܅~7?Y1 ?UӼ|ý!2p̛IBҾ++`'7~7k;RΦkKnpYj6!&!, $"bg*xB s m=o0kƭOCE>?ڻowb˅Hd#CNsPw^>OExI`e\:̀ը)yT,/!t֬/IţuL0a4F !D@QQk!zSh:4>յ7?GtXd‰$>q)wamAY}fj>!b paOsbGC=G%=v\AT ݬGv/ %P-4CIr "ASOe*2y~6IIRwt9ik6M| 6mT )'ΈcJcn<32"L!EIH )x 睨h/b y\mHa]eYq,! nb+3FU"d !ܕyb˶VF,5MRj&b) ja 3f&A04i.iZd *IP͌,AR#B rH,V ^;hjYi\mC^\R*g5"Qٳ&QM{9sӹT) رw}BmSYA2k i 8h, '( wĩmd2^jj` D!VcJ3dChC3&m YuMh%vxy2U Usx!>}%C=G|kMO֠p>W @2J I8?{0iI(gD8T~ֳٙAΓ.dqf}[6(f 3{#p"uPF`sOcΙ1hB$$3#ɱL 5%m/ 94 2Uj檿r<Ǘ/ n&6uHfi-lb}1f(n2>m̋%x6C۫%sؓ3lDzH&m:sL6C} aR1"y O?G,nn>1Zoߘ7?ܥ>Ķ7_6Vxm[aLJLD =zjbc`quɭ=_~q|gX;}ѓ託gKYYWq8M^癄7z_ғ'W_RhQ?ey߻sglơ5$!E” l&-4-ZiCYֳ޵fsλͬ͐.$ YKfFFF}>ڰ"Vڮ25s{pTv,rf: oSwOgiܠJ$sC|~Q~)czL@s3yS*ZD(`*YJY_]}7Ǐ5l)m9?gbf`?Is_F!G706u>.X_}RiʤfE2*\&q*42_E"cqoF,OmK13wnSvsWN,vn]}_*'~qo;K,raVr:ũRz8Y!n9"Vcs]s F1#z@=Jb#3Bf]8TZz}ia0uA <RL0S$Q5]u]r׶RSUV ā iRS&6j)d "3#9 qjpd"t;o80:!DH!"BRWF~3$Gll6)Rp#@E^ySԀh.`7$b `mBhU2XLLDnfU=jHmb$n2G۔Elt5cH&("S"D ߽M`v? \w/vȩ;p>;?{J@1:I֪&~pxMMP9ܺvj΢[G/:،YyzW^y_SؐDLLL.4ސH <DdVg<TS |bJ@́8a.2i (ǰ ;{vj IDATi*ET+LfTHmvaF%+xv쭚ʤ8nWͨbV3HmC=EۆJjR#1@Y=cwݍwR !:;;G|^Mcm͎6N?|~p^\Um;em|q5e`\"j()ųVad;a p)P՚^MxvV/,x`֧}bY iZ~zN?yGgO/cGi̭6]D4U4#ԋ !1^ SC;합"&b񲃓5OQ ҭkڣ{l9qZFFiDZI8p)듳"ur >{U*39xOR~ Di1,rNw| k_/mBH}.^gȨUM12S1w]Ek%僇O֛wo;O\n;O9"G_VBI";9|ݡ;ey 9KZLG'uobs-fjEË6tMVSdj@(KݎTrZāY݈ZM t#mWWca厥F94#]Ky?8^z/\:DtW?Cwo.CٳY4xg0LY=u-; 4%ZDkŊ*[݆sܞ2ݣR);b Vp5/0b-2E&n8N6'Jш; LF2)@!@R D$%NmaדTe Zdm21_\9CDmӄ A@fVjjT6Ô)J#PZq"UD"@b` "892*!6+#'>#3W5$ͻĀ ChqNC@EWsZ=v:UB"b nMI4Tu1&Fp5WZDj兙9jbj1s1*:UJ͊Hj@`&b4M6L" vnrQ׆# cYͻ *8E\j#VK{D$ULc[`B"9[Gi:+&9\reLErT ag_z +?~2:& 93| 6H;&:5{':[G^1+ T$85nU ;$3q%"@`@ J c{s ԨedZ/שiah)qI&"5. {8gQW100Gu%FLm3n q=8:8vS4fRE },Py%$ kw%Wfje%K~T4xɓ\|_o}h-Ľ>wç] @1l77V>}'·:{ >9Zu<9:wde#bL$hW?^_=M[%>Ljsvv/!#-_;\>uR\ѻ˝{f_Nq˗-rzX]#%52fSn//8ѿʹEH,{~J}ot\1 1 rĽUhR^[|~:0v_{^$Dfc$z ]0)3owU4>;ض}/.)u8R}ORO>&İu3kDj1<8v6wJ혛p MFb.4kh vM0āg2]7ы97՗?L;p'D%FG`cuq磓pn-K9zB5$XnY'϶Nq!X1 C$Ƭ{ngW\f}_bEpQ mPjZ7Uj]2=H3Tu+Y簅bS(\lzE\#YJ&q7P[Ts/E-DHrwPbyt}X&%UqC#%s_)D"wSr3SWZEEqȵ 䁐ԍNU9Uݐ25.2s{E]TrHL'cT))\UѮovWfXkeq2"/lY&x I9c)MmuQ)^vԙE2ح`h%QJ6@LV$y6Ӧ3rD'{l3PD@,U |.\II4Lr-jJTelv+Xjp"$tחJ0,~:5Z.TA4(KVV;i{=zv_7^pq)e8t{""\`mkWV_L|=?箭C "#!)%ˆ #2fh%K.Y`9n@5Xr !jӶj*ݎo-%h!i))W3 !PSK82iꛫix6mS:PcKőHKVW3ղTZuj;9*VE.>=?X,DZ.w/w{'[ 9+Nk&&"Yl.6k_߼^^Yx3oqʕG?|Z-?{lbÏ[xhdۜCBp>Ա"oB"bf iS?s9Iy8ڏoqoӠ|HKouGl .mG)W?, a~gW?rxqD~lʢIݮ5)נ``S6]?r9HtΏL}ta`.cza]Ib ~'ǯq,/S˒`g]c >h?Y_XSDqdi1E<8=[#̡??;ƷGg>xwm?)̿[w`-t[J)eo7-mP7`x_2DCflmlTDƪѣY T]9{Md`PS7e~}b1zd\4 )$ܔT*9".cBBUK9"`bjQ % c TL*"H 92yj1P\KiCca O8eo=p89+TsQE=$,Fn*3CČo9NSFpGJ99βLS^_ni^!a@}rv*4A_*?~S)`0n5^nɷޑw~P{OD3m?SbtxlW܇nB04V֟<6fs9=2pDd'> C)mp.]>x_$ήv#18j_UF }kxĊ ֞Omӧf.Ci#Slc  ۯOg=g;(Z̼/0(ȳӳ/|; ~oo~몵L: 4Gr>D n9tӫjYJ_K{u1߉):2X/{v3SU"16)J_;w~|odg;{vѣ<λ?G_)lt׽Ze(LNsٵ3qLV+&4M8=8o^lFt5^As",V's53D;\BcMLG61%`K0!#x),m"Zrx)jrwG&g?ewpn{Ϸ);uX]VkչD}@JǏx~uX9m_^{)웡HF7ї4{`/,(t*;okSṺЩPvUL<8ދr~^ }on"6oB&En8ڼM'ͦfԛԷR E \^c=gkֵfePeߪ:):Otۦ)\/.z^Z.Z3 .~3WQ\6N%/N DRc JEaZjS1Nq`FrjVkEu/`U$ Q+ "\i2UD0hj f,482뜶%2s H2rBZ&a8nrj3;})bJ۴S)"GNEY$2$i֬VkWIWÀjfR[U0wCH<{ѫ82y B 8LDhQ5B,"*S(SU\cԮmUiR 19t$Z-:PEq_lC #P's pkQ 1l9Y4n7TD4 MTaEEt*'O_&whclk<{"Ƈ5 EL#7^ۇ ("S1]nȣe iBL 3E^Su}ۘU$MT1tLq2S:mǾ_V>Nf% :_}'QԒ j%5VM'){4a5-"!Al&Pf*#;H%b5wk924ئýkr9 ɜdoZ.ZնZ$S1sCnH:gO݃ӫeη 5]l<+5&W^M}Xpz:WnJSڲ556'̋!yt@;8Zm\ {YLS.=s`S/CC<9F:[v듏O/cM{_ ';_y`~K{Z`ETip!u4UhۯƋfݝ?{xk2v֞=Q%6[RƽŲ&, ?ۿO?o{d|17?/b?Ve%LYB\G'}O_{zٮqyo/"'i"˿ff|oL; vrjQO]vo>}b^yJT'|ԭ;L5$a L7֢ 8802^Ajm ӶpRԦn2y sAq\ou_U]ݲLw\ q\2~"pS'c 1l-TnѺL넟yk@Ȏj2 0qʒھuT%^FhȼM 2Yb,CIJjۀY}? 5Gj7?o޷}I*wMu>9jZ%G&S' Yr׷^U ;]).bW+nMQO{iZלhAvMb]rY f"}vYqec"Ȝ{!iB$f'c`p0kj "!UsUa2@B4uw2SQC"R بx/$c(Z LPRi#Ed@!rekS"9~?ڥId]qp& ˆ5(ziRTöM_}wS~X4:0mѪJ DNwݔeݴ]KR*s05XBOhPM=Hhʹu:E|ydWw7Ň=n0 bDH׼_r?ǗH7?VeJ̛X1tiEԦ}So[-V;Q:<< yh 0בQ@S ժ li~SM 1tCsU#Br/W{M ϮS B;Wn -驂4f,MjV)-0֪O-! P.'jb 3HMNDИHU9bUUc@Gj*UAo[TIWCU,0FfxhmDpű IDATλ+ ALC*sMhS4UȪ2bDHh2#sBD3?>nvW?xGk@mQݪ.}P8 Z @IMjm#΁}.DG0?k90{H-@3QsDcH`0 \榠s^*Qڴ 2  EM@ ;(dB!R@32C$62#WSGR[s4-1sh8P= v^oڶZTT15%jc f1U+\q" p&PCZ"10@!\wP:O 6L2)G<"`&UBfJD)M*(2ea&8TDE\X"[]h= 4#bB4fZ-jovyIU1 ͔K9Eľ\ڭSY,Tkk\x}ėj(^:| + E#@=b$C8Q-R  z3P5+6}C)fUUI6mPSkQ7Q˥@$#_)b DToRP055!T(*VUz0Ǿ=RD#SZsb$D *B \ EVU"4i,"69XF19cYvȗf( Y),|фOm_ `0ɉv/,$GGvas$a@hLed7HXz;<Ľ]{@wQ:ڡÅa.cTw?pwqŞ<`J1"s&ѸuRm6Ňtc{;|kRHa w15BTUT__0*U\d=$cD<^g˰JMwtg[OgjBn>چu:Ūw[V_?|򹟾ZoMu>p-e/'0Z'+Z'| ?ZۑC"!9? 'H72Ԛ vD0SU D<_>;?_ʷ}7:̡0^U澖o_e <(TpNgL ]w7V+vxzvYJZwb¢&Uū#SRԔ=D0WdN$U+2'$ZkׄQ 9w HJC'Z.:F@#߳E?M0gոϻv*UE!XyʹV=@kL+hG&W3LF3ZuZMKȁYUD+"TSC qa P - Ifx*Ct[L@8Zv_O<}'g<Z5(t6vY6`Ob_ջw_Ej^۷֗g\rSJv6]go47KfRёv-3]û|g_`cx."x}p^fN9ӈg2br 08ڬ1/v$74`ȑnX76ZKck/]Ryc7dWא?獙_Hܛږ}nin{:VU)4e1'CF&nI& L 8$(#QXe*Tռ眽Z&}߫E%q'\ݳ>|Ы"nmLv0W!ow_?쯉C,`q?",ķqv.'$Nl@EBƗ6њ53p9sJͭ.7 q̌Z}XjY0{nOzz|D7{q|6|p7spΉYst$p 03KŎ1I`}&DB:c 0ŒDruDD # Ǧ0O{=l(x xHĜb!;4!FDfջCx7D̹t5Zݺ!26}rODxUgDIF/ITR &\,eFnޗO$-QX=D81#Z ,!ݺ#!$eF)gDnN :Cxah'0_Op ÂݭjADċa5ǿSπ,e)JJRBA !b keU0 Vc(T>5sp$Ks#BHjOa $I͗7WCIE23p"$gIRVe\)HAh4 ;; A4aXijs@|Vwh{Ba| ]DGJ*A{?nyk_l bd:OHvt8w0 ^ZQtQtK@AX.Kb|\|keެoyv$ڷZ|?cui2}h9gQ8\sU 07Bm:$!B1Ckm9){l-ZC^ڛh׮ą% B;2oANYr^FDBA" ` rN3֙! )madDG2E!jK/y& q!B*i(U)J4ZՒ4 ׻ PÀB`aLTu#$ |tzvA"b-יoր:!BĄ9sDH0~88oߕov C. ` -?PAּ}W_/os砊H)vݿs2 <DSuu@GFVupF&kdNaA0Jy.c^.WNމW: R6k˩ܘ(VCR5$"Fa t7U€@bw"-DC1X%FL且1r/6PD N@HLpJW4xXPXP[8A(4 #M!:1 &»NLH kՈn''f- 3A!@I"BH#(i"1ie Z̔dK7z" sĐrǹ|2ͭErE94{ BN ,aQQz^y}s!0 $)BBM;'y?'Ο=_*"/nA!Е,Z*ӣU)v{7?zU?:Ȯ]6n~ ҍϪq/42xl!67W_L$nh's% _]kߵ~:. 4@'BwGfL"՚2DB:C51 }Ywm96Us[jM[US A!q\i,.ng$TH$ؚIe*%!0q,¨CCU"`nͭ$9ZoB`d]{ͮnƍdBFfd`IY"%piw89>b[l2sk0Sؑx_$d $',-:XĐ-AK߉)i`uC U&)Sգ;VgHj3Lz;hh8!99<{nVR_x+0H2UY|n]>y7~7Yۧ''ϯJu^=ZͣiEb[8v";>ouWun?7 㥗2⇇gKpAqֺ\i?y-9 pQ6^qؽ;k{tiZqA<-'_s{B{WwOfNN>M'>O.!5\̍%<)X~hnNRzv;o~S?ܿHqQe@i6SWM9磻w7w7. v|GRU{K1"zyF>n]q}uuMt=_o/! 1_h6ۃd.ue."РqeQM^]/;7w_;|^{% |D  hr"!yt,X}&Ř`|EXζ`nص>Y` 09`RK,\PI5[EM,dQy:r~P]S*9)w7lr}&0>_pji`z>6HZ)2bY yy_[,=ЫP]+r(zՖFڀqaz̭uu7 $D֝ЏqM9hx=_LRxn}än%Yd&m=Bu#Uݘ" % E-p.YDDN9I)yR&R(D4HL= R ~ˮ&FsExT6ѽńP8Kb60_ǡ ٰ{t P΂N @4& !D%fI nv0L9"&j]XZ0L ԭ:7fF*̤B )G00 R.)@4 ~>0!2w0Xu-Qm\a[ 0PhN,X[pdZ}wW0dtE$׶Ht最:;O>h+ģ@iE$\s7xdsB_ǯ6uwJ| rptWӀPv=r+/J{" ! 4RJ2\C%s"J%'DD,i, lTae` e ȩCvi`@ZdI#(n; >)04HșAKⱤԠga2ZPg̙c!.U|*,E<1c A EmgCCC w=U6ak[Xɩ{7ޭ;1D%%yfDh|Ln ar!{kVP ,2)zLn=()< qge@ $-Zj@$ hsaϮ#,>ꐇ\:^|ٵs~|U3?}m "'d@4$4B &aHGw_[;7dDo n6ibD]XoNN. IDAT|}+_==׾'>~KOL1ms< %j;7 (?裿+fyٸg͗""4͵חO>~nyy}/nw/oD_PD^/#zo-nSB H:8/&gms;{lXwmq{9?S/^^YVEx{`/Y{R2Jܟ^\̵o+hFzsG_!Ca -mL`:#1M; W|uj ڙ @݁,<<"_>_?-3CMm^MM!9c`H* btT4,lAFGsb @əUun5((U{5%{mZaj<>\7Ю/f"zUa87m;>߀{SB! LsPRr07nCfn͝, I V#Ӵ 2 D@bV$S{ \!zOͮ^}= DHC5 ݃P!D831$ѮǾX Y1#K^ln\bQ1qyX9shk9uWH"?EaNHFnDd5*jg.cv)"y .ĨjI$#$% vO*{ j^{wœ ,z_*8#6i\t$aAdp3PuI()Dm}b"a7V0]jd”2mba5< z-o]j׫9qLW:ys)|v*2jhiUaCϽ]^5WDTyQBry{%3vTOB@)dfH^mAhn>ajf%sGV2 ͬB7SS0&R1V,(DGU5ԛG[ͭES (Q(09mCPee+Os>KD;'N#Yo!i?yDu^@YQҾ͜71bVn=,)coKbSam;MLDH86b B.yjӦp]ㅲ*,"jsT7lYbfBd`a+7#q%}4pb²!9S8`JPᄑ黵Bof?U{{_Sz)PoW~񯭷y#%?Vix._|! _Ggg_G;7Cߖϗk,CxCE{ ɓa^U3%Pm- ޣ]Sq!&0+ոORK;v}ss<^qq0gA d3#kwG@s0e %% A:[.WZGw[#Ĭ{ñMٓÕ 0{uwgy^ܑWZK7@}ܢ$M)!̜$R@ B`h8yX@1@>~rpkIsqUulP֫!2Íbڻ kGLTJ<@=<"8vk˭`d4`:1ui`$Gw`DR6uNaшYudbvBNLMRv=%Q *I#i5 " C$F$vXT:d^$_93i@8j_| +kX!7Q8Y-i IRDT#qfDGf/3jɌ65WLL(eR)sp;DBLKP-t@{ {)"! 0Ύ䵩X^o! 12MVT$!dqȵH9RBf` $„9K)H90F/. BY ,|I2̛ +<ϭay0%S(R̜691Xo͚2aSgu[&dLj97ފWWvvTRB''xv/w< !ݳTFB^Q5ZSLSk$Wvp 8l"@.7 F(Cޕ )uDLU81gwpT7$vYNwTyM%ddL,j][[޴YS D sNHIFpPEdZ*8s&M*Wt}=g3?'wz[]nڃ8 .RdH kX,hVU]CA,i!31jAYa ">P7sÍ S*R*z0+{8k3[uS@;~_^uN&''%O'U#mS0X`DL$N6@lF99}OV[gjlߑ-;_fUGyj%ۿǟ|W`Fgy:Tp9'VǸm5x$l?/?_?>z[0y|L53k3e}p?Okx{/oW[$[՚^| q;tɱ,~ W7{'̱?f;us7~rʱvEf1e^^2#_{ef3q|vu\21-1z!3"03-c!&f{%9# 7a Z# yy]f2\?/χ立)%;3߹0u۵&7JTx/U&#8rD,KmjĀ `tl6\v H9TLaUT#L2DYxrro!WNH(Ba>Z!aR7wzlafHPεj;.n/Hy!H6j,faĄ,l`j,SwBܝV_0p`j2Ĝ8@K[BDPj˖NӂBnB1 PsJt"!R̒Hl̉E 634Bw D]oD,"e(`R[i"d$a0,|ufP@NŴ1Cnק N̲ ;!oW!SnN k8Dy9x0ydrj!Iٖc hF)ey(Rk0U.$sJ]uF&zX25bAAP7~'d*ejf5ô0~}j֫|;N}}jwc{''IQq!@9Z{ U,]UG":Wau* 8VC c,̈R"t'2d@;'fb{L*ٚ,šw0 w`-gБ:Hf(9,=K!f22D|heq \/f1<1q_9>o~D{?ۯ;Ya㰚u' n)It Ŝ:S8SnכNnE(($p]w)B;Lj7 |5z3US,sAHh!!Yh<}fC.Iɫ 0@f98DxP馀8sUUr}2iPNr~>^\iu}4Vo}|zjbh(!(#8avz-Ȅf$XvZ`)G)IC#c`32 +DxJy:moPMr.HLa[)Ę; {{BZe?y{_ˮok}>.$xiv7V˂9Vdȑ +q~ <:y"9@8# "Ć-!r dM6fXU:}k9%kWZ`Cz*:/s9}W< ԵO~g?ʝ~ݧ7aiR{d<3@HT^zWJ3k챺`, $S9TgpS}4No_ۏSVXxq |F<]/_{o7oބ/@yby?/UUERJ?o>]<g}}t H|i&YtǹEy/in'O>zSƱ_3_jm^_y:tgISk/_kU>'3/(-_$?)BAx4ҋ!5Cbzw A ,j0lYt*$Fk!\_OEzl}yq$  7M[+nrxZ%dK;nFa=B;*F:J  RPt_,O'&1G$BbP Jγ;`1@BK(8 0b/Tk#!Uyz?n Zv9IdjÐ%/07KIQ,D7SĴ^F ݦ.e:)":@ $hb) 21/:e$dcUYցµ{#97Q"I/< ~3JԄiA5s*uQ;b, `EO#<n0Dh~’FDt  J P<~2;7?2e.noH _|F'%&dL+_܌%4+uvlSXn2>Ys@"iLrɳ~ #?dw~{OnܴNH?ؼK6ƛ=>p͵{/y2@  /?xw>z@AGu_Uj@s>;~:NeXÝ{I !kWnݡ^›__n737Gߴ~_'O.B|g!nXvO&ns׹fQ=v;7۽) YȲF,\8+lq鎷 )Z{pZeTw>U)-b*AC?m>#@ec9z5AF0*muL-\qВÀ0›wf\V݁02p'D40(9+,D޽Gf|zyy]ػ]afBmVFf(4i7dsr2yEM dMU7t>5{T5pTg# drp>H`Uʘ a0,xt`dD:ZJ^s[7cNAav$ D$,PS.Z$ e 0 uWNnH=)#%| IDAT:8ib ̠9-{T"ج@ðrDB$ҭA8˂\$ VªuaЪ@02Bh8IDx0՜R93$f $\[J-6u pg_d4L@'HSJnfDAA!|h]L [Wf6ĈBW`z iAV{eΦnƒ C!G(cÍXr뫽KIE2:81fJ (XjQFw uzO'<*1"wnS g Z&*\/Q+!AKI $u{?xv0'::ɪi z5>Y46,VkWK(I^4_vaQsܰMuMz"9!Y3 ͽ$}ͦ JW^@ `H7׳v7*'QvlIYml^ 0[[/C<6ϻz pBL(g&6;|>G][tsC.(VDm̒@'¨d$@Hx5f32pYgU3kF(D,,Daa)!IF޻vM(Z1(R[:ڛxD:C¨ZsDr}3?w11_zབྷUw;ܭ`SdeBc @/}^jv}tWWѳ{|z"Cښ)儥ds&p9ηё},lG>-+AbTX^C@\*| [MW'z7]V뛦N #LE)vؚ.6mw 鹅Ё]'ꌱ/#a&aeE DN$AuyāБP!s_˸^9C7LP #b$r蠳Y%7S  ᐓ0Jnnf8Hn) ##K[giA59QhD /pe4PSL} (Amf;:3G"2 kf aiR;BaWuatpZTptfFp,L{0'1smrbNw2TU {C djnn0\${xP.#Ժ)B{x,nr0ޫ(zޑԝE#"LDЖI 8cn|=768yD..+FaLz_iŌ-(q)n"Yr2#A@V4ߌ![iMc(y2#9E_~キSkI%8{D }  H"e9`=Cg=IP[٪ jmGqFDd>0<~1 <$H0|YXնsb $u=Խ02q\ !=zǷk@H@ 5&"pj5닛y31F u#?tv8\Dl~ۭf>z}gg|n i}H<ͽ{j{3905"@!)8K.%M" =X$C щln3U^ jOOa(d~DzZg8zZʠfa]f:_u=\nNx啗7OVn4Ran3 pu't盾vktNIh-#&[YS2`>P)L@"D͈rXxXp'BDbK-F\#ƕY< VSNy WjcT7=f慢nΈL[.mE?~|xϟk' ~%Xa,_/)ơhV'o$!4Csyӱ~Q;m! #"1'qȐ>GWϦ5'ti'7j@׫ab'zKD-/#qrY4/_?~ށH/v >MDG@x^},5:qR›?W_Kwp_6ƛ'9ɗ=?#IkY 埩V-gb=<-ڞ٧F9Y ң'[ A1Ax%,WD}İ߹W.( Z:;29j2$' =g.I|ړ #lus=\P $wfȢ-TgSDND@Y1@ܘ@M p"¼*/-rshS04\AW"0H)͇I:pDw.I` rA}ԭ٘ g7 cP$Y0D*$3*4*`[75s"R7t% i(`,%n΁sR7  Q@h*fWq0cIDQxRMnG-p"L=PZ,FA5à M=8$qwșd̅Xr4;S+  !'f$'a"J`#@f]uR8"ܢV%,rkKp aBu;! #+d^_$dYԚ+# *3q\Zu=drP(IILDH`):P8F HAЅКmw%Vcɂ-tPu-iy>i*n,0G*R|n)N[y,>6Wb&lj뻃mZxn_bKTS Z5铸8\"qMaSj00 )ch7誽+@8IbwUU&"!]>E$ e.̦K" ?̇a<6"0 T~j=SJ[X[ kwܞ8w-ipt gm8VpZYRx,.`)Qj1t7'0@SfItsǓ]ʂw275JrkZ'Fن9 GX#2 J@\ ÜI̼H`SP%Q~h xb$_0q}_wpg#JfBǷۯg^6'Vgv/zO- ^>l/.p{Ė_ؿՋ˧m\\7O_O;?{v77{߃vgOM?!d"|QƏ01 Ժކa!CWOdžpT(%@_N` z6  !pR_n-ded3()ADB`9#"'S;CrS鹎':*ִ:!88xhw"`B@fLPݧ $ xIJHdBm0-D@nK e\ C> X3K@ aJ $!"asK,HBA|\k$<ծJ$F?{? d A0dg>[%;;3&CBf`ݴ{3@ E_T)]-73R!EI!uSu[E.Kڅ 8u$_V‹ i;.XPjޓ$͍7K4ҡcX :9`` pA;$I(<º!/NE]1׮[WZкiWUBLj)[j}@",FBfzGq(T.,4%DnhwuTs770@R;fbu#%Qrbv [4+H,,՜s롮HPCxϭ1c!@*s;f)2unt52|}>b '"D`0sP+\óK]OOV\LFP,ý?Qɾ>OGG'+|+|9 /^~_KϳRSwo?wb{`dSr@k&ڰR{|o|޷./~_+~~[֭;x[_.n/G 68ϧ@~vsio<ׯVg%!Ԧz8%'S&#q]&ZKolWgS/-ڞ$ Cuietю3,7[Cf"gfb`DFIݨcD.0+ -1? 4(]51pN(3!Ͻ0#G,9eyd"bS[07Z0p_J~'@ a@)8%h1|ྉ|Iz5bȣX頭"Wo8 In0)T:j-!Cܜr@[)q9 E""f Ja~62 ^+$LK9#;.h@ V]JlD,6fhaIyMC #P$v%]a׶'' H:GP0`Ĕܵ9!P8ơ4Ӓv7}A tY4k9&S!5y^-4MƄIC>Z=U[`ާaH<zKoDT{Hr@w"څ1, ֫Z " CXɲD"MGf&37)٭{ myҰCVvn{6izܺծS{tn{xvq?Z]8žCmLLYFdZ C.4M?H-(ĬDqWGxؐkp3$sQ$yEMlwp8|dDI ,s̙ td^Uf$q5zp9&baA|t۵C}vu9Rٓ \z/߯ulwIY|5a¿εÏ;L<~xbtsr) J2FҎϞwA4Tn`p}+'ϾӬDk8|λ|ިY"8Ƌ.%ݟΟۼݱz7O|Z'?yZFL"23Dlo|n9_$BPe^z4ш+/Gδz/u{sqy׾[[wo=zݿ?_\=z۔^:̢>T Au X^K;ll^N~nڜ4جFpb{sBi2L""8XzXaR7N0O>`4魙_wFap8Q@$&daZ"g{,$1qS7Ogy5詰G7"ѻBY;wjڃơqQr#p@L"Qyi=*LXͣ lrT"0Hhɇah .@ ZtIٝ g tC7p777dJ)IaOKo)f\[!gNMuq325!vCAj0$BRUż!qʴpw,Bh- z`FM: ܃L#J)N`_B*b#Rč Q1v#"pbff"j )4L)ܖA7; #YOZoS y8Y$zʩ@srI\uh) y|a<|xGafY8#$P{s,) R@X$V\R N*d=Ev"9z8 tU" a z ,)4`j+C6ĔdH(4a9FuCquuĹϵ6"j}"$IL}$؂  *|A[mfKӼ`sy{r96>,R B;P@8" r;(Ba%j" X"zzjx۵"F4ua嘞p$2j`$`krI,G]usw59NݰbOfp4 BIdZˆL1yjSsm 5WL'p8v(I9 tz!ins.d4χ=6b~va殦Y|Lj}24` vlȗ7l"z0ldDaiA\K.A`Y @ s8ftsO^Ôy31ǭM~%%q1_lߪwG|i@{ד׿1}|]7?e'8BK'M]rQ0nΣ% =֧g\Tk@J)nNv/?:=|_'C gA#|ft1( k9i]6ʫ++iO(lj}Ü6ҟSqHǖq`s&F:h> ]3{W'Ovo~~?ǿ/&wZ網הMp<@ nW+ IDAT>‰fCaì۹+HQK/KF J9.Gec13`" ɈPs23e AoLHe`d9n`)xl|XuyJ`N7.63,V2Gx6snZ IX A@&RPRH 1Ij05 0]WsU p eKL#qthA-I9$^!sosjIx=fW M6u3 PQU{_%bBԦ#BI[*D]5z)x,$$``31A U0!!#H&B”E9>kD2"q F-v84J.}À,K: h`P0"[x@TA< 5wwX+_aq>LT:{[T/ @]['fM%DݕvNLւ) "15@ ( զ90 '3RqX] ʐB 5 )䍶vaZj} y'Xh݈%e4SUKjy?ݬ% Ҭ1KĈa"MՑ$SJic7eJnv4MH!zm= $iHS a33!$Bz#D_pӻ8z3[!˧iwnWrgקy'ge+1-lM^w.fÓ;vv{>l/j>?֗>G@-/}Y`׵O.@cfwكG'i_?Ҍ;|}u<>O3-᫯|[ͣG;oG޼DYџ]BnHm5Xx~,Ca[e8%IX-`3 bnD6݅) wΟ~K@ U-,8ju jiバ$|mg4 ,70_T06]-cUBȸZ0 9eAI:H&0ǘXh}(MC I9QNb%"= ėE)Y#-}) !R먂X1jh`TA'7 s-'M)[vWT̑@hP!h6oXsm›mxEzq]{.H84MJ (`5XM-`+lwyL!bv3ڥ+$kEw}'^|%a^.wsv:ԭh%B$K5 $T`40 $,ySA9[N AH_\^tw`unDdB9+8#K 5u.eV'E%oX<&qyu㔋JhR ]&S?D$QApw?xk޺^jcʔq^[ znƪyڡyZ^ǓQu=P5i]jeSF.hPJƒSRB7n˿[;]ܖS7n B?nOק޽kǿw|z,qQ|ƀ&"`n@V = "r]Z$"bAMRJ"kQ͝~W(68KæSRs2Vث!b۵ E-± 3MV3u/UU#$4i$RZjm۾]w8ZKڷ9<7ٽ9$, \ D-mr6M]k6d|` j`0wwG/n$LwwY01̣T/ۭOl+V>\KAb]fwsy;Rsxyorv뙁$~omwD lR|+6ۦ@i)#p瞧W}QOn,o/6sXdSvගH)SI &:M89KA^ן|)-sB@m0֦IÖ8QDݴF9S?'p7\\-3$>q6/. C `S_0'!QvM~WIX91 N90'q I-vc!zao0Cba&M HIx^vY2!SFKiC.=ph݈  t"!!cu ` rPf:jHK"4"[A`bABH7!'8jHH@(,S-qBIR Y5vGw1[Z Z1 }JBa!c<ՖF`L Cv~qNIRL) 9#9YrbC5)8aJ>k[t&(>%yF2%~qT,J(ޏkURi|Ww* khgujC@t@@B1kg928rcUZiVcj!ġ^m}7CPvr UE\8,nAvԐ%4r˶ayhחyz/EIWu#01ٹOu;M;Cm#;:`6A Mm)m7mvIz$Q5Ƣ˹^TS_>+Oy[_/ngɻM5CVo.7gc.;A82,$9x!23&Q"ꉒA tIj:ijQ,]Yh%AK L9O~f*j8t]ni Gu[6. ܡIA0B RfŅ~Bq4[.kH"IlL< RJf2:QuĜ߇ա$0Xnࠓ77{gtzn'7Ɠ1h>74䴾>qVӟ`g~GgKf !N+D@C w[=9 Qm>X3n>}k?޿>:gx<|XX@?ݦ ^ujr˿+CD"=;д_13 d}[~緿WNșpP|3QgSv.< J'l͟ߗN3=&Ǔ DLjTweJjy6GYp̋y""V#ebH8kAB#*._.ZFH 180#%"$ !BSb{9Ԭy{r":D YGjNI]# !7 0ziۀ<p1c1vmqXfZ L`BU)R>7O}šWH~tTݵ#9[7u>LJŬDnG)9`tȂ{7g޾[>4bmLƜ>O|N?Գ }tO>',"p8: Ʊl?kWz"JdƟ]}^C>P>^1ΜW%:P @`i0!!;8oA$g>"g!f(u Z؏,@ a.DQl= yNH8pNpD1 3 \kL. ]R)Q !&c y\Y=H9P@00։n <"VG0*:O"S'D ՍVWGwЏ)x$ 0@ vM@qfHe$N!Ҷ,ghw֟|'@ƫ/0)q@T7SDZmM`t==?yỷJ)a X䓿ǭ<8 <촘C]֡uoDZ݄q74uc1$\JrDSf,(N7`qpxؤZd@!gI7 /vh x]ە}n\|;Ø'!F?O<;UQ }6?}_|nv6%1nD:~ nh{! 4 IDATg6 R/<,_W[FY_>쀦O3&1vȽܪR7_ s!iΈ7W/<ҿ/ g[p=l`YU#2w+FO] O@x@p9? tps3R+_|G]nÖK?:Xc2Vj)iL ߞD F.~5|we,$5|,۔tL$ě^/ !fJ@ y);~߿+^fSl1C&/K^3A!XA0 ܖĀ} @7R.F5jr~I"IkY3anvRW7Zix1[ǿk_*%8\ O 7ݸ~3>Ҭ>pރ7Ws"j eBc (I DEk)6k֛mnj`q9_̛0|ꓟܽ[~~Pn>Qw(A쐄{4v2&6N?%^|I}I|Ww ;"![>wsxs3~>0o̼4ُ/>=\skҵ|t$n,W ]-~{qw޾v̺x͵hq7eb?};m6w;q㶈 TOZ@xڮ_?I7_h[@NqzO\`}>gKp%j}ps.kp^xbV{w aWc&AڮND9%@bbĨc ߙ J[UV@S%q(H;gZ38MMutqna݌Tu2auE2N$fLΈ `ZGX tCU] "R@.9 Z9 UYXkP֦h8yTH"X ܀0)08ümػj,(-@'agbłP-hSc"aPb nZDp#p!RsN `öJFFG3pYxQF<{`JpUg"=EIʀ{{LH"K,䈵TtDaH )'8< s@jDB{ P-Q0 Zd`ɜhd:G5Є B\XXDd+N ':8jU;՝4iХ& )|eHBc-f-k NHCkRZVfvYcjMҵ X`:(sB`rFd|V-!fe36k L Y<|ک%{oGtÔR|DL8c"P!zo#Q@j9gI!$Llv]Jߟ@`czul)szoC@}1(ΘfyQkZ#2VZfk1$bW@24§?˯{ٗf%ev#2//a׃^y Gk{7^'n?,A\}O!s^Vƌcy6ZU{b.uĠ][N4/r:=>~Νfs|qnIz=ܼ~˘$Vf(Μ s$nX lX`w};KtRm#V! ]5B=@송h w|q%֛"li2:Zn&(l. 丆Xߕ Ĥ^+c8 @qAGH.!f/w.@yؔk7.O+Zmڑf]LчR@ 0>Ӷ lz]ˇG"c?ѯ^]_|?|z]D8([?N=iOq@atq^Uy%ICSlO)D7޴J$0>_L|J?,g$i,{ 䰟jNNTKIp7K;lEtbrGG$R7Mn1)OU!!x$:r6@rǁƐʺkF2G0E,'0$5pe;4x%N8o9 rvNm"JXUɂ,n%H  M(1va@Y!& 2"{8Uȁ-X=@@ r)PK&Ri)(%'fu `D N9UWC U7n^Muuww@ՙ@zY jS({OL$tDb Af(,<-M#1 7 fB^́BZ BF$›&ѲNZL@(fBII:Q_&$6w pH,R&z!Iʌ IZ @dʭaf؈TpZ+vm"w [(H)cA~ƚ%5r¢UMN!|pŬAg &I%%15M 95յ6ivnz9Z1?zg}6VRXiwzB\n HD*CĮE]k@E9&jrT}YW_YFk  ciYJL ;Zz-3<ޘ)cj3$,aFjH $6 Y2s*B<}n\,_z}?ƿ;^ @{޽O~S_˟_}䅗6ٵ#k?w^7Ϸn{OV7γ"@LRFq\c1ȉm4mb C5~@r&Fp3ա㓓&j^c(CѲ\JDe׽hu+9qv҂fm|;7I,lX,t07@ul>G&quK1i0nZUݠjH2$!eB2"u08;Wa`6&ϻJ:~:6H\EOc, igj!^o\>~Z|}놹~`YM٭/f߾sO68L'DB"fD٬Q>}땇,{Y:2KU/ ;W?&g/"_6+vMHK7~wwmB܇Ta!Ց߿#?ebaOl7^M)ǐ|wr|qq|qaa(=$}E@p Bf][@$܋f4vQqP1ܰjl/$`)MZrTvnLu6sU G]22hyr3BeZ8FT#hx j3/itLH \:yLEbC7!An%e`,anF{'玘8#F+"8UU(k13g2 ݡ񦉉1iimsNČR(E=7֓Y;'A0RQnB`͖n@@I-96.fЁE"ԭeBV7j,OѪ 2:{JIUYs!0Y둠 z!aC!DT4 e# 9l` )Rr+ɓpǺaHi:_/|\?<=  x&0J)G!MBĐs̬Zj3λߖw}V;A!/6q<d=xr^\葯vx:^v\ MRP"ja(4:f)7/N,3KfbrLs3OO|죟Y-uZ%עQtBA3w`!xMTuC9@?;jL6tƵYr0 t&soZBlUnHn!Q^Pڣijyp0 jhe!.!gAזjQf R:дtr~PY@pI$^= ƚX*(v0/#.x\[YF점m8G-k}"g T1w|1uBĔz䓳^[8D˲"ܖ*t1"B|ٝŢn tOomxK`>w0J[tA-NNƣSB_hR[70!9aD0ՙ5,rࠜyfό(ق \Ryôl~DlVY8[to9S vR  l!0q "yd!"sJS`8c0a~N@u#{`ioV$C $ŝ ˅5 Нɻ9c>aL' HB`A)% S@Ճ\3ށQTdA@ #@@VA32RY#Z09xaH Q[%aaps dmN B-MpJ,Bf_i0.ZfJdjKNެz!A vV'BebwGf #Ꚙ=XGNB(R^22"GG=a$]3Ц8^UAĘO竩.uK 3唭n%js`Ӥ8xo,v/0o F$88^ϧoS܌4AW?tK8 p25jUw9q?Ix W+w7&)6oGhj_ABC?g[~L46()p@#fk3!yQwfurAsOi-pwM)Ӻt)x: (]ɨ?/|?sg{T5 3׸s??w?_'?oÃß/}ϖNk~՛T_{ƍ'O=xWg>|po6ߺdiU#1oRyֺ\caj7M4P0[TFN9CwޘEuB$3BbDBE6irf4N(>arîϡ.2(MDqRϹs2FDaF  jR&0d!fRx{C2ל~GD4q!1xIH5gӃ pR=֧|Yn킞."^"/~?N IR:\͜YqJ~?lZ\6?=kY-9DTy sKt?aXrW;sI/Zl;_;wyѻ?ٟf=yb{FllKE}oL'-#нWtvn o-`kq'b!g.]<=l`Z鏽g{NqSj5P՛v]Չ0<ь+#;NΧy;f2h5[g{jt=C= #301lQcS8`)uX[DppE_^ H0(z`DI=9.P $&BITs@seA $FF 0Tandm lؔ3I<  sАRWJLl+(t=KB(zDJ0 Vj< jN]' "Ս! s ".0"CJddCnCITi+@dlze׮9 SW+L#~{XZ(CE !H1L:0"nP(i37T ܫWΩ0龅mOfȒYC# i7}k05)`J[#sJմ=,ź)2AkEҐT021{8"Gf @y踫R8/h=nsM߰>]=8xcYf@͍kͽ>WS-n5F| k{ /Z=1eS4F:e?}8ҵݤ{]tdYn=넶{|vu8BJp ~uir`d7ȵ+y>OҐ({ĩmX$1:w`jNy$?GUtN8>?ӷn=^?ʝ7yg;ouyoo /w_/Ͽ}??gyϽX k|̆[{NXrNòEb!+3Iڀi ӐZМIKF'!b bUS5JL]b@s><69jݬ(1G4AfL,}C !OeImIg}'sHI|t3 IDATVsP(ܙ#g33C. 0(l= w Ԣp+^Ŵ;%^pv DL#?x^Ƕ`뒌 EìSNn s&̕^9}ownNK-P0Z$F~K/? zw];IH;6*oxj)1uۓ⏾:- (Z&bq˳!_#O1.=eqA*˷F·`6^W7tWvG䒣z^y㻥nΖа$",V VHYoq@䴑 `iTW}I8ܡI1$XenvjP$y`QaS|\a: DA3gҰ73{DĬnLNPc9 ::3q&ٶz!x%@hD$w]5#.3a0qbfa:q腲д2cPР:41!TKTBJFF<pD0#YtHNN?Uc2l40Pf)aR$Rf DQ8#SM ͝;j[֪fڥTQ1q@ ڲG5Z#4RJ%,R["YX&TjHmB 9gt0wfZU M;D29qj LAź#nHQIj1rB pV@$8WTb$yr2e|P4j)ѥY):g, Uw(m˱ FʸNSG^/zPGj)ihA(IěifoߑA"VɎۖ|C@@{o\87cg@Wq,.5 @&0HtIVt9/x~8( 4'j|@ , |&t?_hHjY"͇ ħ~n7J6Yҷ[+_U+Ǐ}Eg>c/3O?ͫ7?zZњܼy׾1SUZG/ID #n,v c&ZŶP2o&kU DXn&fF()굽.y'8-IyG}/IK iRUu!VCሁE~2O[EǖN;6UƩ<֓?}3@af''gQb&Tc"bH7""IioG]nOի6b Lqt{}.*]D<1n\6 w___o n -^3-0! G@GzPY91]|4["LLfc9φ=@a~'o>y͙)Xqcf©l \)ETEI$^}R^Nc itR, gqjrfMy*0huJe6Zdu rԃuʆD8zг! 1 2m:@4f@ OLUz>K8SU`R 첔F PXڠ7!1Z $ސݠz:P)5(ir_)Y|ՙT4b-\-q3UCb$9{XɴQdJ]*SILnND@BmlPI =Q OFX%֡S46 '0" t0`IfF 62YAGDAfdff",%e"@PUD.xXukfs+MPoJL D^j`-E \9b 9ubm&XHWԘMEW]=U%(UV% d0INZq#@9I8.Ufk[EV7ӚsXyho$r\ͺxx>v6cRrQ:cCG6wR2EAky3N!l8_^^Ƚ( {Aw+ߐh;je:1: ; %^w3ܨ NVDp~6 h; 옘 {'+zeVpwSW c`!.'"Dl3DH''YDT.ubU)MU_◿v~<~<\|?OG(,rԃ9ɛw^ѕO/KX7(hz7{LOg9c=_$)er7Nhj¤fTcA"!-Gt]v  I B$!*T 30J'Ɣ@s;f ~pR"P9ucQ@GZi ߻~0|*Q{RY$9 !1]%a[rm4#zm%(.'8vDdd4UK]ș  T5:{o\;{7N3F[\F 'owNm17ey\R槭X SuХ^[7ӿ/W?u/~@e ^0/.s`7Y\_l`/n0.3]CzF#(u U}瞾uOe,G-1gunD\T 7S룲P.rѺƊ1M &7 12-!/OGw{{\7sT6Ae~LW^P'銅z@'u}4*$R8G3ҶdG$TTjjy0JPKlJhfP:&$rNl ͩbhL})YdBHH` B& 6 w"n H ܢ" u9b 0f$BV@Ts 2v-ެh %(zS&<[)e k FЖpL $ľ af D2sfm^HLn$!CDlzE ;K;,SFdA.Ճ,|+5!,751fHtx Y-LjDFmh!\Qp(p@0Q"Fr$`)̄('mѻE@Wa4bѤܗb:t@3@fu#d& bq:yJbg夥},0m6ْ}couO:\+"to4* PGdjjG;k߈o{dԭNڷ٦n`z5s[J2)v6$D ҅b]ydHOǍY:#|tj'S^d=M@XJ C`P֑7cNi*uA2 l/r~?;];Zr?/^}'_/߿}tt G2.!y}cX< R7|㓓'}7[ _VϺ? 0CuO?\NN(9D} ME="1I$dDU 2T̥* zh\c"gjOrhC)&Q) z[9T$V9 {&--ó986[5ЊÌ,xC \` ʢEVZT(ܣE,7\vR֬DV26f\n/-ݮu@kEJbzq07M7E59ה$g،9Yjij~Priw.Sv"yszcxrH;2¿^yix<4@ bo~𞶔"ǠKe{Rm`?򨌝ꂚGdko1GT4-"|҅$Эl,ucb6GM)DܫQxS GyCF h) kk粼^G&Fz7.Q i#y =u34 'ٌdJ]5׫,WD"A9#zkD;#v J)A`a D`u .˄!MACD@,: #!rqu.% &l)S@r) ZeJ 0as.SL$@rn3HD4Qm@D 0B :0"`oGBI `"HP ̉{ ' XTEBHh-ؑ<3#DmNB@h" -  5)VG$`hD܉(`wǜrܠ "wlB!DF/LȄmQ)#dp|DdDY;2f890CBVSK)QE/DF 9(*+1%f^P!9;2hr-r-v$dAȡn}v,QQ"E{0pXÄ nxjQD&( 8Bx )S&r&$!`CLfvxf'R1mJ !baBaj5D(j5@Ī^O= '@"P0SJ-E2OjD\JSZdCH業 hTrjTFR"OU@xʋK?C)]Q]A1+mj^-":h=\]]f}G ~}<5d2`FTmҍY5ۂ!@l尓lBuFhXFHe<nֈiU+CJ6ժSgM]ۼ#٢e<9|(]F9yفDr4~_|;%'>g5rplZND4MWly&ݾ]`Z~?47o?W{ݽ}XV]'P"QŇ{n"ږyS48@#19+zd>$Q(/|sjf."{xV#)qQbŒJF'i܆mBܳQ#)aHDBLUt<8i -{|0d"b*\? `}顿υ pFwq}6AK,~ttvlq)m?y?C7i`ZpS4vݙէOj1}C(?:=|6 3?@(%Ti9 "0]%qNiqV j"]ʛ.0{p9v~CSp-nNAf„"LBa׉cpYuyx1V "Q*"!=O)!F Q̑K<ъ 92R#b4;[ΖgL[TzfdVr`\aXڹ/EFP9|bq+z}GV֛>dByD D@5Ѵ[_KmV9=c#Ґ09]8A79`% DI}f!iY?~𩧮sr3`f*,׿rXh mz1^wBҴ5s_{p٪NR56WK[gONλ~j5U!reoZxЩM]J <Vp$) 3x #7 Aވi 0ؐ{pIsvlU#x((' ěu V6McՉ74i&MIЂGG <Xӎ` b|iAۑB6=Dyicvp!ZTMՑ*O] !)k#Seoydy~Z9}p?d1,?oiB9g~2Ow~haI踳7eJ7S^6L(B[;'b m6y:؈m̙(OاbFbh;Er bj@: 2:̕5gVq20sg!`AD"pd K&toh !vFF &aGfA*w I0$ ~!7 ,«%haZr ~!\ùS!{6jT6Fg.&^UX}88fkQYv0vp7gGy&r͇&E95T`ӾxE?ČHa4 ~?Oz}j oLp/bW@YA:Ul|}m޼lO%4!,7 rxKv#&څ?򉕜sztb~׫:|8Cv;˲y?N곴{*~O5RdM/^4Gjo _}1l#acj76fW^y7WF@j~[_Wg/՟^}_ Q:w/6I.Nj},ܚ}_ۭwgZ%@p L(,.)k40υI[.ȸa 2Jg6ICn:ZTrf\$,K2x])}WeRa"j8V-%h66yX fhq qt:4~n>N}:tNuݧV 笋QA09#NKfoI0%Pշ/SI)euafji"s&nM~gnq9*ٓt:/^09BLw z~>yߗuOA9.j+~%c 18V6>9@@4Ӷ=Ggz9TEhZqi?ͦd'?^L`K4o6d YIrA/BObv2EHo4B!Έ䐘#j%Fn%@f60F1,1JpN$Ij`#57&k&y5 0K a0AGpTjL̘ aD"1Y "Y˹5e$KkfY! !`>۫ 0{AIߋBbT3YZCK/ bBp3 0kD=P4N}z,́,Gbt$<Cx"1 sq7'p$].R)DR6ٍI}~f)6#M<%SW B2oxfO!@I8 !g)a^]o}Kɭv7^o?zֿΦr샶}ڛ&WK])L;4 o6 އТO%sk}ƾ񊣲|i{w.k8.{ww_ QWN $ aC">H޽F ЦN~9|+`WfÉYH]_+U5|kU~nk1 :xGӽ{i;Y]-ix%~f[vDxBhU="P~_BYZB8Uy&*^#sL9CwޣY@RsXNմgpGlj4Jqk-I!s@8qY;9'Cݘ`Mm B$D/6kέ6kKIzI< 8Aa9%Ih/Kd(%"֋ :1vYРdqPmI18/3YF&HnHERW0@ gdFrDLF<'̼p!Yhn=!;,#gS # rѻ[5wb2ӜT>wԀ\;90!y*dH=Mn3p(g$GeP$dYT /y;AqP.1yvIyhN0JN1-U <[J},ܛ&Nyu0瀅t&f9%B *2e(D UM!K&u8(3bvZWʴ>AOv3K>~s{i+^܀Sb`ltW.uveԎX_eޒQ~àH gI ND""Bc! dZ@i2M^X%5bFB[S!Z3Sso& #nF_B}_L=Q"DS'g;~<* mǗCuq0(KDŽuo)y{UZ3ɴ],rpB2qRUS:wk ni?Ldڞ sOϭUyf* [|& ƴ/řI&ZMmZ477t)* :)x1BBȩa=cB""W"a,nID gaVUm̘rIxPt]s %iͦYԜIi!JpH"d,n"N362"hAF;T7 D`F$ JNa- [AK P5  C2 tPF `nD) F 0 F"YB wepPUaN ]lv#x8Qf1k!ViRD6XHZ%b?U (9`~~v6Չ($1yM|w2 ,R9žZBs.P)Q))E&@HD`!,/rf-~;Lw Rnh[}5lֺg))d-1sϷ؈?׵p5Mq(rø6pdֻz''ؿ틗֟7ZC I|};0biSݻ"QBO4~O??ß|#7VeY߽8f.Z_V^o[UӳEk~X EG KsnĄ8]HKb.wD@Ek ZMkQK+z5rQ|Ġ N)"  H #JGa8y -1gZ C^+)__8qGj\ ٕ o NVJDnNmgsHgwZ}Ihr D-ŵq귟_7LCvL]z9=ꘖf[O?JW:mƷ|7K9_NUܰNs!>!ZM;Po]wq7O~݋;>zoo=z??{~q>թMDD5pK899kcQMVI@6O}W4%jRtI̽)3͕ښar m4sk-lQaQFPxh)WW4ŝS P8`,RE"r=yH-'nM8+g77M[-gEόg DImJDF0K PhLEV@B+2D5#pGIT$=?_4*o-;;Rο{#Xs}?Y:CY|S0 P=/+oygG!;G;?Po{z}9A-UJ}Ւ,VmFoG(LSa$Y8̭n%C̑ Iw63 Wbh!,L[d|6D˞NNhqcC!GfM G{E`ĉ Z/2: BJP8ވ0N+{=87/6n}~RvrWcL( r<̿9xp'@ m[|+# =kXΟC+\aѮ\Ia%eBfnނcrq2 <5C,Ю<_v+ IDATPQ ~iuqRxwTOsSUj }i٧c)Nuugl>|Nw5[G E+B a EkRT\l\G&2; y~慟 S;0kScfiBfJDU`HO5pBd"!;4 Ǧ6$}ub0<r"5%ci0.yu ]t(x=Q#jͦYҁ7ӮBPԭAv(#SU`BDH)i]r:[q1B Xۑ gHHY203)'eoA3FLH$d4f@b# 2wY֔X= $1QVւJ)9u" 1D_UO"I!BM2D#I$ kSf9g! y:Z3̽&ʉ33{Vߕ3uiaSH 4 9Eͦi2Q6rfUwGª™5Sf$ ?NRVDD]* NM,-(W#‰tݮ9?kGȇ57iĸE|ҺE`B) Wu5)^kOR1]~5/q nF 䣒 Nh_Wês@ 9 BPNxewY_ng4s?Ӟ;L??נ^ГN&ޝ^]ܧ5[_{G Z8ۧ_\^nTjM,L(9 !bY<,JN{Dm=0vaѦ!0Uu"$D&df5 I< Cu7m^LTZi,,4ՊDnx} SHaI,c h"73Nd>g/t{YLYLã77˽wO_Cѡ§@ Y>a8v<3/Ѫ"YVͰ$U3f:3V5MLǪO=8Pc%ptēͺNS~)$ЗYJ/ k7gUܑDD?ÄyΟy;.1łyKJuLGd}@'+DPiܓaLDf@9'.Epy3:|rq)a*pq7Vw$Q:d!ȄV-RϻoFP`3,jjEojTY(tRV ɐܪâOԚ]ۍ#1!s"[owg'6sXREeSy"傉I]sGQ:XuQ RN接$"܅dpBH_XJTk&eP Z Jj$SRzHcFPk 3`$ZC=0"#0>g4p An@Jᒨ3"L3]=VHH-IFĀ4:hړK,=!jfd@(va9e|խ s8[m5e٧ܕ@/^oN.Gc^ACoq0PwӶPGgNF"R&x;L0MKD=A8 E/ HmFTd3X__zO9UiS\gcEYi@0N#!OolD!W=d6;$G`2]+L1qq,`„DUU~PEsALIEY='A"57wfgӳh}s f``t%˫TY/9mvCms׮ZNPM]W rjs4䴄ͧQOE%Uݶjs&$sG wD LH``LBH!x6ViςƀeQp0ޚѱݵRq?zGt.4pɼ:ITmեU'A5$ ad6brŎ1KZE_Ԇ UsO;ZkPȉԆiO{sPw@y^p"#AϹaC7̼̽Njfn`$%%΀ɪL OcJ\3uHSr%@_Xǂ^LNNVRbdWI4 X>S*݈4p(݀2oscvmWKәא;z;~~= }nis/:mpXG:6%: f r 2< e ؙI8rݽ_z²Ov{fHsT#y'.!AB}NϺܱ0}Ӥ2C0, `X`93I=G0DvU(! "N_`]S"wD AUg1.c6VNSB[CGlDH@4blG< 1CU! .E;;Uɭ<ҼZ.c_^X$ uw7U5wPUS"9zG8],/6mr J˒T' S 0„I!0#a4:7g_2 J i?mM#|?6>#.wJH,"}r1'0kH2: < (<)"J0<}ߜ%W u$'QHSn)#ngŊQGR<> R,H)$>xѢjXcC<r3t_oljEb 7;#~6CoӇ#o<<?xwzc0H`q-mAj_XƸtp;7i,7ĐU( "P$Bi%3-ԦEKh&m$-ڬI&55TSB5{ ZIMFEMd"#{91G.Y~7w~㛧WxtfJj^jfrR @R"\:2 9!gfc ]E fY8ܙH1v<L{SaKגJ4 y(]TЧR.蜃9JI݌FL nD #rɁ1. D baX9H"]T>z}R"4睹"ŃR^W%PbzWs0U+@]=Dڪ*yF*%6 jUVp.<~;]˟fd:eXb R\zf@xk t2fBު+z(_}?y>l^E})" P?kc͈ h.̿Ӡ}U~(.kkcBGbv\uwÛngGOc,:"bkB<,O9ih՘CTr.H3 Lxlp?SV]8Ԯ` ݽ5b\fXԮj_;Dqz7W1uXfB9XPs$U0~xr5X fpwoI !#5@t\H"%7,jo/>OWw' pPi{'8ZY0fT?WoH{ڭGs9Kr{G0 U+G33a  G nsÈtnmKۧ6;E<IJ.س %dI {G\/n?Z>#7oFُ Q8Nw3 L6*Y5݃@cmO:^xۤ~WY_7|_IS]ՀXa^b g?st80xDtzCo8lKR8H IDATYx #mb#LD!g" fiˬKBv7y6m'<a"dĒҼIsipB/~~ǷeȸS& ̓^iKB"H: $1S$q ')q"t&@ 0D _~hĝ(AxnFajvfN1WɷxTDž-s*,0BGNlv-mY*Ӛ$|d`@@=}!eb@0=66%vuxFY8ub<$~?>f ϽvDz@z?Xj;c%Dyr/G[C"hݣo۩Xv_,O^x:#aZf%3 [a4,iN7չBd  Q)0 PbmY+F~$d 'fdR K9ىmM~TeӘY$[@J0Sd>pRЭLÝ!10!@`O,l%濳w袡u<ϗo[-h]s(޽*;W=G'h%N{bs:3|rW/9O?<"O$!sX1SljYp?ϳv \$E-btk 9 7AX8Kv(C݀HRmh?RB$ّ|^#ĐR.)ВDt,)^ )%vNᡎ"j&W,bb6=(>}Q/ YrZ@1mQiL IÈն6x!Az)PAU&K?1Saș6; =3k'U4; .j $d:^9N'h`{yE:-ʓiU` ]ql>O\$l=m]8 np#9R8vGK7ttξ6mQV;t=ǟ-Ͼ{~Ao)٧S$N$(;B5'f,„QVi*C\2@$!w$A"J2OSNHpPg&AGPnqn6H9暁_iڨ=rJp1b<$rf}}1̳Fn M.CuO"'bNDdcDWc&SC@ F&gJ9 !&LnZlDd@leH)̫B"d!󒳰֥uf 3_5 hzNBkH)gcFaH,93qB5raɼb1<%@S\9H pyl9jteL(*# 44!p,D@QU B{'"Umj," 4yB0 ,9K.I=5n:%Hg@[ l5d:pGR" jD@jOQd`253I!N|> KFsJ8jW1jX%q[.1Q4qA]E% bxg?=Zw=|*G<.:3|%asYQNk>_b-WgϠdr*S> [\`#yd t"(IVz;2:'A~.;*›G1I BռڮU8J*` 'x2)OHְפֿ{ߗ)ټ:>_}ЉͿ/rԑ\dkN}dљ hU;՞Mw{*M<^?2:38*]?n7h7 oolU ]]ͲzWOؗ;dV""mE9'.YSs09jn3#_nf֛I=g/Kߌv3GRvwh6\ <2H֬yvcdj%a@5$,HdO9E@"RKf`޵Bȉ)IfJL,$ $(‰SIba}`DHclMX K̘y˚y[*fMsdeTu;u ժm3 BaqOW݋/G 2@X4j֛8 " t|DA0ncIi8/(}S4RMc((IS!$frGS A`XXn8 9Z`>TwV~:_vCXV:ڿIì` Cq|'F B`lcaDD3J̇ptn_W_b%9z^box._~}Gr8x{4:vKݖk|/~v3?4/ww'HaH` %,sIx\zkOV%jY`dmmQwAK&2HϜ2^oKf*$n7\)Cy\,%gf5H8;dDQGi4H M'Dnu$05Zz=XvH`лB8@ 4Ɲ՛xUeh]9!qr"HFd֝mnf`R.FۏH`9/oݗ,bsˈdn x,H>$@6+@;ݧ?g 0 F$=}A '(6 !(=J uSu{;-} i @*yYJJXF ?SjR69)'oeBfxwWSodqpڕ14d$T M>+½ 1yH9E] \jS(CKoXHZpbIDBHʁH0{4#vgK[m`BpHUJU>xsjZr]!'0C{|lƽ}vE]WlyWE'y^صO?͇/ /^E> [. KċV)C<09x-a$Ss0- Pw Bqgb ,P:;VF$3Wv)1|P(KH{<,VMe@w@6f@37 ""$a(~Ѓ֋0 A[kIA,s 3 4g/|5k q방"߷0 4^ A805f硔?g%';>^O7Oi3[XCq!]O?<+4ej lx=[.Df @NC*|svKF.r?ug$0$E62L-tN3C}0 q?2 CβmjSS[-p:D~Sf ue1s7TbjB@Rl#lwK1yO\<^pc\z^WۥiUSbd,A( Jp ar/5piV$?*$9Ql3'wW%Ab!T&3]y+,@%e $GWt=Hֵ pbfd&<ą, a9i(Rf7n͸nO9%bFa\p3PspwwFvԳҢu ݆"DqKz ˻iߖ2#S] @"4SL>YzG&،EfcڽrX{]ER&wP3cjЗL\=K,v%!nnyw`B`b5wFd!Ȳɼ'Ʌ(<|Sv3G.D9 Zo(Y"7$vŗȥ2KlNo#J҃UHo<Fʮ"krуyde =ȧfs11 d-fy >ajSϡ#?*<͔CXߖLw +׭[WSX\ ~ws8w𵰋}#Wb{97ZCKwG{ywv o71X%/csY:>2}{2 I }ESkխIdDP3Y9e9I !N]LaflFăCLDP~_6ӡX$)Dj Ҙ0Ow)URS5  3[:5{NzwbZPx<- xՠuĈO ! fQZK}rQ Dx~ hL%RLYY5r!bpr07sr7]gO6>>As泔az'?M#qzqa*-s`-,kbtLȥܺu!{wR!2!+ܟݶva0 l&`y/q?0`Yj֡K,)bϱ~<[^ NSi)g(2S'V7G$IV Q/rxs3]߼-V;G̹`q=7Yqrb~RԐ#ĎFHMWBDB\@ A1 )5Ppk?~Njg\ gښ'-U$JBZ4MmbхXO< զf]d C WCp)Dkni.AJvSsofzTN3 5U7]Cʭt)1cVi)O5Ъc 0(ဌ+vNZcD,6#zV01HNA(gh7c܌ a !7o7(#3 !.h3rR4o>F :HOƾS 30n])jЉeʳ smysYAC -'}($HfRE Ei@~A 1PѺ{QUmǍ0NG3c$U%od9N 48bۏE[ QK!o8l^j3+8Ɛ#.uVv8ܚۼRQJݾxOPu8[& X(`5 h2na5D ѻ=%9M4LfJu-R n~ݾ|TnȠM/j%z cJ8ISu躀8Q[)Xq,fmNPX ]/ikcj\tmݕ1L!8D\tE ؀K4V[H t`'Ar@1%+q66öөԏ]Cˆ\r[l!ͧu渻ҋg:C# 7pbb4 RcHf(6^Fpfy! 91pE77\zm"837UbB739jS!jvZkK.N`!SI ņŀo^GpN?XwL8>qGpm*nUmty.[^ͭVtj!C$"&BDbu5uw"*}HuNDLkSJ!5aI^_ ,8"`HB (DFj]tq4۱+ GI¬(@LA]̼1lz h̔U _+pMfH+3")q`xa10)4G$~L=RLK.eQ -@6p>JJ"DBWO@v(6pHBH$< HjRf4tw"t7|8lq6auC"1ի8rKM+ sdr}" Ƽ>J\BshWzC7pDTX{S!3֢ٖ$XKQph.VUZ(\K|Z)Hk,20%wrwCIETfLU""Y^ڷDP9,K!$ gRlݠpk^9b룺5> dgk:@פv;˒8f]zmoe.܎QiZ.p8PKbNa #3As#5eZDS% f DfbZ33\ G>:!`Xp4͹mF fH| "P@qP~{}:.vAQWF1H \K+ F D.jqn<+wcĀjs" 0# إcHڠŸ_%p qSweGDM[ LsTn fH IDMXN89/KYROi،]+Q]+T#s(Kì^TBBc|믶["tiY澋]b%&]u*TJ$=0S`0n]<hF̼n׿ n/-D 9jtx ߤz% @L>x!pck # CiW_CS<<ɏŒ@57W`5U3N aG7'0u: b;fֺu! Pw2dgLUk8$$@rﵚVq;ӫK6gZtȵj8 r?|q]R6ig?˗}^\>6n]]9עh;n`YjPr, ?}pQJ뒗͇|z2^_ir7hK]HprZ( Ԭ)qT-bGllm^ͨ:c@B&XUU]عEYֱ]`n1H'2sprvw]RqpL4a Nf 챓)p7ߎ3ϚSn->p[vKR \\Ɏ(n_}6޿»oG_;(Xxctx c@ jm niv:y>V*)ja7Fp:PQ/" QyMLuًsTG#I3 l5!Pk5_\\~oor*˔ɨN`ٚ5_ryv_~EUCzuM]?F$m1u]5Map`ʵ K5cFPg @z'O RE$nӍSj~MӒR`!BqhڌEZ5.! x``LMW[ xx{sֈAt8:[uT7Z!\ >x'?7~W)Os[iyʥ9(XՊlc?'W纽`rOØաcvLr:|2 O1iGh>eeU\ 2Cm5HT77ӫg_p&wᘆm| ̙JuCSRPUD"BwU%"0΀) {J1`D5bBVk 6o]߃7jڼY)Ŷf_`KyţjeeH߱6M_wʊ56&E_v_ i}"wPV#?{J6k1q?q:}|3Snx}{(4L }ۏÐ^\30Pߍ͎vi t9RM#MEy:O7B& r7sCbBt"pB矪Pjk}Yx<~kym+{#[թL:򮙟CAixO.!`|_}3~py9%?-+~oۻgO>`%gdzzqDBbI sd$v{}{\K\8q ĘA5%X֠#9Ԧ4R7۪U\"5^j:7TpTjBNRZpXK;rS˪ :6Pk"5I͘6dElgph恁%P;"j[#ճ6#AC'a皁XrFf.R0=8J>~W{qx_*GjoOne(J|I~qa_>@C_Ǔį~\ ?qa+>rlpF'*C$JJ~错ny\*PU2`R祴ڄb>rۻֈDb} F!&Bl}̕^iTUK̾IV*Up C4Wp@$f"2SpAHX""50!Ncܦ(` z6Z>O)zdz6} |e=r"W1ρrza}1y7I]5>o:x$:paKYCz"=g_s*ܾ.2nCinn>_ޟ>|iURKI<<&Y&9v;\Oa9abOQm) #@ѳ,pl -%שjC&pr cbbj)= )PJ Lo5 'K1[h8Ħh7A ́M1emd֘iݗt݁M.UPԡfc(`J@݆GWqb@]IB]]VƼD[2ֺeH$w"I`-}{"Dpog o˩u,1H_5ts|I?Gn~9}_}NOwrMA7.N qj l7i*0qrͭBH{o3I]wrfs De=Apܻ:rz/3RuQC(f~ܳ`ljsiڬOq9ۻ<}v) ]JQ.mzȈPFDmgM3mYZg(K6eR Qk$F1vQĄjH,̈Y,K !*f D!f@'"t&& PŘ )K:G7T[ijl$HYE"iw).Cty "XU7!$!j`0IBy]BWqJftT1HC@@nj ;wf)d'b29!}Q܇>>v}8?_A/ۍ.2]v.XX:rLEN̅8B3:1*Znm$C^k24wSG$3oZCC( 0:RWR&%4wMl ш cC l[Y"J1Hl^Y8pM,HF&A5/" Q h A;[)ZБ= D"\X5Ȓw:;(Re9el` M@Ap_QV &Rçqw%(;_Zh{ʏ|ׇO&fxU|o~Go98sӲt+ k]6T-eO&j))g779v_0iZfbhS]j!nfK,HԄEC L.d}@@N1ܚ9 jK@smbb d!mxs $@܁Ih-h 4J4Sn$‚Ӥ0fB 4MjfH"T@)F.M՝YZ! Lu7_ۀ|܌/M9m#7rO9y^|xr jf64[bq*}?ٗ>I#/_;>e>/E [ؗZ̽BV!2)S9(M)2*0R S*=>ZiYU'A0qk-FBiozPnbXs'@V*,2.M MP@ ^%;9fDnADJS6Sa*nmw~LKզ"kJ5 mxVv p9iS*%h nٜx"˗:je\1!!_~hs}Z8OtgQ)ͥ^x),nן,ٗ:lKKTAvOKtZ]JJKOOaW֬X @yr<.AͻcsN+( iʱ?K&($%PN,"q-dbD!F$,UOPM :tbqcA\0HЪB ̑C8j35ՊS攅MLj dƆ`N伍AD';M=rټ mq HDIҶM*6sbW"Q= (=jm9 ) }uSJɒ8%3%>SIBt(\4[+ ZUs0VJ7ӴFf6[<3o~ϓR~pW)}zwrx{:>W߿zՇ|z6׷o4 i|zIN76sM/0OwytХV-Shn4e 0S䜸Cq:O,n5J՚[J11.+JP=790xHyb. viYUȀ.¡CJAb1QB#ǘ5͜jx-LZ#M^tHNShZKmؚ A!gݐ9Eؙ=.Ia˷ǿ{}MԪ GM!Hm޴j),x\ %)y *DN2?5 C4Dr#~ cN-Ϗ9J^׎G3qf?"G[om"xҎӇ E Go?t!i!!2?M͟X ĪؒU5fڤac`6|JґRWץVG2h)1ȸM])bp V^MVܝ9Kq*M {VT uѹn"щ:gD n 4ԩJHN:»Ww`34Lf~_Ci_??,jV%2VHj n*=C^6SwB2Dx׻soNtc,}/ew0XwY]@cۋ' 01wy慁"մɻc"K$ge,"!goܰ6 0ywv[RL.6O ES[k9NfD֤9@7"F5EBR'gn)#s hTLVgz4׵%a}֖ZKYr${l2cmЧy NR )6$%BȐvY `=bF,B}H}+k-bt7bʹUi䭵yյ'M$:1I J 9&F@A.Gte)xw7u@B1IH.+S  'AdSp}OonT*|hK+MsD*p ( YHj47wZ,"PR`"̉|ma돷scf{zLu"w`l)\)I t2 >wG@{}.WǏXw5zbUp|:8iS_(\ާGluMFLOms4SYR `}AR(E/͋%PngrƦVy1CTkR9c5Y;R'CTh`i ("f|ZW:IJ1P 8ӘE<qwUpseV4J9MI ka] 8UDdD`[̬fn9raYUw~p3,%yΔjp>h@SOѕ#hþ>9uww750ȑ̼VN#{{?ƚ}e Ei3|cqk]+ P0s Z>G A.ﶛvώPKa5qǩl6\4%on IDATiR $ #˹n4'sfs-Z3ղ M5HTO PQݑG7i=#0)H{_$N{A'!F3#'M03#:c$"FDfn&wsYXTZ_.~)P̱c&G,u!w1) W I[ jGˑ6'@쾪cIr+H1ʲ,\qMlg TG Zkj&h1Dd CC r&FʩSfZb̄>M}d(6[ o˻ R0>< rylrwp:M{o BvۡGB6ww7/R~!\]w6o7v]"gP&VRJ]׿8[!uC!ǜbؤf{ا|wn_cѪ֊"Q!80prWRjrVSe$0ТZDx9WT3a}@b« Q MTf' $f0F}iK>%spՕ >ϟm6^s|ga8/G6!=L3 -MOJ,毕g~D|;D *uL@!t YK!1awx_J ]Iwnjnb;S 8EkiKž:VyE!txj~8H c&ln@F-NH 3 bLDN},S>~燡/3oFf̀ŁT щ H`ɬ"@ jE53tPn,TCw@`<KU g!^}WC5$@c1ca!ArxJ[w -61XB<{~ C`^E??0^^3'!f0`9y9Nc$.w Rߝ۷GC R/!d&-$`Xm%nǹZwMueK("2̶bH]6=O’|TƩ m.D 5{vu5{uSh2sGD&%nmYkDƦBjZXL,fj)ӰBf$ĂbH^jVר%o pݑ ;C;kR99> mBߖӪւmhU_ yP5߃ oPO'e/`=a-.*c"iZC$?<.r/8^ 1D@U+ˢ. M]J}||{_[[]UBdtCLyzI<8QHc]XݺA%ǰɛ>q飄eZ~H1 ]]7ЧS Oe0$ՂLHX!j.!$&\j$\55麦̘ijn@œRu/Zb)}r_y՛79g_~qe1}w>Bd|_}v>v&QZkΧi|x>;=,eR4mH]"c zB1] Õ#lM-(Ļf?lUumy ?f˹ 2;Rl)-JLQbx€\Z{{}7-mY%Q|qq9yC00Wp2GFC5I KD2vH"4(h)ui6VB+: Q=wo.v]\\:tVj""Zli| q<$ vI,(;ZL|h?ըMx΁I5DdR1fmq'h|se*bv>váv]S#0 ck~ӟ|}wB7fD yYS:/es9Ww9!Eb`L"f^>[EVW$F XӺ883@e33+5\a(jSN]TtTA*uCB b6PG5U3B Mf̮&/Tk4J'GP̀܅[$LCz]Hϖ++#K7t2 !X sηw,.ZLeY>RgkP0FjD !egœ",ꪨ̀˴M]-0lwDq.ڬqئ-ZO|8>4]8OcMf&DkT"Cd$D2Maq{^6.@NhvDɪs 1 6@B͝}kf V5%z~oٚ>!ջf]VQeN)E $<'m-!l>8l"0_9F12nȇU%$uV ϟߝ!pcy6R yfa$nL!H"2#)h3''تR-=H~~E뷷חr?Wo_^w`qRwF6o'/sf,Z(ܟONH|F80J+Cų0|q,Kdn?/rGM!w^>r^vC`A8cy8¦éy_2wwsi-o7(϶W.-!Hff@`j.3ŔԴ! #@L7s V V=& D:+QK6qebqZj2 T!%v ?U\ P}OaZmS!}8EƗz}=s'qׇ&?MjLj/?{\Kiޠ+$jU/4Q qș%=NY_^nY i4>? EA VRh@30sժ 1hw;>Jio.yU0n\iṷĴmf"'"U@ `ui[DsQDT MeZB`l9]C)#2@RR@J1uɠ(; /7ͯ7_w|G3% ߂6cz|X{ e!M#/7/:e5 Ry< T"q dj4& $((Yx^bFћE(ICk:ee@$B)n}i)}ΛС谈9Si H\RjT5pt]HBHDl(L8F?W\\+n`H((xH9Ϻ87MBKQAB:r;=6a.'Uu6fL.^̴U[/>y}XZN١44\r8 >jUMwMN%HVk>s ) V,Z{GD ŨEvr琄ekH*,rPo䷏rvPPe3m7Bl6@^˿xg?Ϯ_Ҭ6=lv]v獾˥p?~H&8bZ. mETƥU#@כݫos8v)-][JҰ]?RϽOsHyiug$)2SN)1 9(' ]bsCUåN4(D! +Vu` #B@fR*" AAQ$w  iMWjU ߾C5h4|ǯ^;&u||w<9vK-9ϻabK33s'pսjC$6^uY+1eie$O!Nd5uLJ Jo>O;LF`޾<} x+% Z) 5n&we6p$r3hRZiΪP̦"5PscBm )w4&&F5<$N}ZFsL5BeQFh ?|ͺl|Ub& Ȝ-@n.M̢_ݤqzSQ/k{-of Eݤp'ru# aH@]J!gQ벂sն̋ m`ڊbBh 8:-'O~Vo7C2ʚ´߅9r`wBM589A$Jĵaf'E֬zq֊4-! "vw,hH|y?U2c-c1,`r*Oaͫud((i ٕvis;ts黫g:fLb_vzww?*3Ŝ2=<>.w)EjF!FRžsGO?{y<a@7>Ű}GR}F$T]jS86y>]w4fP^M,ٙ.B.ݷ=8li}_>o?O4>l T [}[L9|Ȫ;XVYYKϤ 9A!˜b#Bְ]op `sk]鼷2DM?ui_xzYi.w:܅~i,–֠@ `uv/ !c,gO f/?;NG_=yIYd.zq݄Gɛݴ˗nkgd/.;N,e7i]zkfe]X?g&9ғ1L)kOuY11Zg@H.!c 9#`&ms02Ę󎊂ʑ+.vLԊh9$(1$Uue>HʎW*Ur(ASW"q;zܐZ@a4qjvn. M6%X (\ \W7Eq1 KzӺ nr|oU޼x^_ɫ;[/w_޾WH[xvapD!L0żO2I"=@@9G`Kԇ Lnۇ~9eTB޻Tt=umx~vQuY/w-XQ]z눬q W[QAh6Ѐa h-1kT_C@6̄OA2 [+kn9nzBKL"D.$92 J_`7] r GdFWD%1I- r)ƅR Oc" IRfE^MID2{Hݐo@2 $YmwY9E1\n6z Og2ME=x#}مȖ71EvLޚIY8c9$MQ,Ƶ3j L•{EB*yMjg(Zcu݆.m3jc*5f4bLfQm n27VjUoj|@)xXMYrUTNoj"}-xkkegN^_Gnu`5.G|+{ߔbz;7v;qn {S y-םno2{բ77|NTN5!6]GI3.GQW~$C cBd/X֐11r2Zl6*+_~Tztovp(E:^TԐAJY3 ̊P4B~TW$LaE0 \WI?>:eYyӣ]uЎ!0r 4Xh !$q 0/٠dA"TRo. c9ÆbYTQŰ##"#(b]hB $@.ZNn^Ye!Bݎ6KT2n Jw6xy|i^K.ww}[e"t+Qٻ_w1{`an IDAT9*ݨbٜ%E1Zt"&ʐ5$fbTf2IT@ˢص]{oz(!Cw|p@Iu/-HC> QTBNUaemH T5 }L.vu9sL-:Kx6p} ͢@îeQFeeKVP r_ǯ?؟|Fr K2)(b'@Mi=+Y._kkE9xfuY~ⳗ/?r?rxL5_\<;[~dݤ{c҈|4iON>884q]B*zWǜsL|zygrdPIȞ_[\L&Msa45Ϋr,<\LqỮL{$9;뉨a0b)+TW˪tuiu%UcgLۧe]xdl9aJTEmb=t\nWU4evi<6gCDE@RnۜT<*A!QT9b̌L QhGuUXMH_e(Ѧзpَܮ4}2!xh}#栩7Է5~ _G+;&7ܝWѷS*Exv|8GbY'V _ UN7D. ܾ6qg+r;=]޼TݼRo)C2w:IumU:@&Vmޜn?9+TA2 D1=4Ivx|xxvvU;MfRMxRUM9ztCə80q*Z8Or?Y%g%%V`"1Xc8e)J$W (R@J9'4 ,Q$'TjlŬCY 9L]QLa9 f ٪_,Bѽ6*xۭ],kD$1 )&&PW(>x&Q)#-J$("+jCO9%=o h*c?z p +z- *-2'ڊ;˃T"oRt}vA3oV4rLvHCĴK]TM9T"K>AdJ|o^>ⳗ!&(O泫RR [&"4 (*hJ{),fDU 0 {Rbv1 UE%I6e1Ɔ  @W]a aׯ"b\cw؝Vڕ>KB,[ c,b+5 ֘s`Y7_uOOo~+@g?Vfd\8s 0^\v@u0"%]mxV6"[ӌ"󎍉1dx4Ŭ*uf4#ޚ,@b[gxsc>qEG5ᴾ8?wge9k꺬zҞGeZqM$Oɇ>ÓB(j7䬢Q GqU%~|n+jPXfz}i۾cM=MUQ;{<Edfdzţ{Ƶor\VSShɒtތ Bx6AJfC"Ժ*3) gn9ITfڵWN 3%eE>Srhj1-cd 9G9ԇrVcYSWN PH]Nb dIACIJ lPUP録kw˦+2w+{h_'e.)^XZHAKZw\yſĻ(މ"n߅Rx;ez H-o!@-NݿyB_ƟoWT7ś*7}Oxp3w)WFxGUwpZRXL5 4~\!AqPxrB%P|^"c1;4Ldqr>YAILHhIR^HJkqZȒ23$<* !D C>{Zu]ue|Ϋuw  i:,:S q !iJff[C,*U]+s@"$!(93Q֐AFOr/1e=CC3K_֡ 8~Aԫ=Ҟ }Eo4|2ޯ: w^ ]ƾ=#1Y 7>L!tN!IDcPQUSmoZf!ZÕo fY>;^4z6CÐu$b(GeYhlH3s?0$$rΊ4[[ H 1f{I )Y3H-*2|v:X&GĆȐ֥_6|:B]izrv]^~ #ըyt7jP(dd6eS,]Yy N**1ӳ_<|ޮv;Z_B4>:Rv3ŨMx^1bu.q3z1F>xzvѿ/?{>ז6OG'WWKMSҤGlPrOXy@Ě3V TFe~Xv{ue!c w4L Fm Ģgpn\Ow8kfz\NSJYbqL<'u1ݶ7ը.r iSLt`z<~q]dl<. Vgg9 @x~5UQTf'h49Y,2HSت0kDUIQYJ7i _XZIakV0Lv~`- =*2*z!@#~T6Ʋ1|tppڵt^r{^mC|a5u*FT5Ȇ@JCHc=A 45h}RE<8F#W_5CZBFGMڜ&[idپ7x7~N5;Oh}]o&5E';sFU$^/ ߆Znc۩R޿+awo({ww7~@np52*bwj./DHIѸ1e;t+)$UY>1t1}CʈrL9kXZI@[ HRNI"*X%6Bl%iAcZXH YQQ(#.H@!O h{V*w1v}.=.6Yf(yDV gzoq4Յ3!)j!ŜTHTA!e,L!vjiY&38Ov%r9kuhnSFoeG{[cCq;҅O[ͭ f >%o!3DLYHv(}A{ : A*/VEIqp>ij_uS6}Q'^0 }ʢaC @1Eҹ> 1Fي a^\l7A.aI4b!Ȅ.|ዟ&ч|z Y%&Ki614;11K*''?DkZ5[C"I"*`V1jZQ@Km Ad鯞?{L~SP%=!8gǓ>7ˋ_܆-?GX6*Xt>'jY?7op1?,Oꦩ*vчʲh7mYE$R:\q1-|K0rZ_o۟-RN!f^n۾SJe=rb&Nrvs]?g[P,ղ* RI-04Uc *|]Yߵ1b _}s/pYt|p6U5}Q{kD1#SxCW0,0.sL Xۧg#JiYxQy CEBƔmSNdA7?H>.<\mg˫ }UQX֛%FWvm# $WVe!Ddu YDqFsyd ^((L* -띩_މIT8l͢T{]|ע_!L7] '_ۈ z*w|U}@ion=ϯo|5=TT;@[n"7ϯnol4]3Q_^lrNtq8طǸfw0=L,WUlzgt+sQxdٸ0Zk ֺW?X?;û#kzvnmne!dv8WӺY3'50 !.I) 9 BQH@41-X]ȩ4PN beϿܤu N< ðs([X5b=FGքb{sIwXLwÂl;o}_^o͏uBe7-_ۂoSW_]]0\ߪ;1K|#Tomr*Xm[h<=ϷvN|u 1 Ct`~;,:I.]T7) C{|to3/~Tc}9'?Ͼ:[_t`zXb,@vhD2!) %+8rvwΑQUM"HH"sB 29d f*dO֔f!u23ĺ{Pl4gu bDiƮ<0w 5#(["8tTWu.CzU ƺ^-WΘz[$B`ST\y :@3]'j5VώCKH  gA|G~|zVygWGG gϞo^(Y@_?N53?|xt*jV81hGjbyb>E$Nӿ'F^mi#:Գ/6O7|z=ũ/C$Mmj;nd}vmNB/NZc@SzxpXbbTU?'eY~ٓG}|R+,P":(&˕]̛3 !>t24_M՜]_s)K lmw"2O*_ơI~l}'/mh0ބ!}{q,FK&t/\lbIjyUVB*McTȣ(HVjR׎vI^6qlzj@PTBUcW$]vn|Y( $%t㮽vTTo(&{oۂ9"(s"w~w xx' j0w:`uSGt묔]z;MKכiUY!%%*23ܵel1'W>tۮYB32pv8/~#}{q=딳nb΢9(TD!hRR5֨f $YsQUdTυfM Yg۶L $Hc̹Xsh0YC Y(D8Xs؂jOȩ(f gL̨ )!G"Dgm( hK9b=g᏷෡1P1W/Ӳ;J"BB>%ϗn6 ;Ybb/ϟ9~+H17x~/כzWݏ}B@mW.m9m22fTQF„`GeinW c9PEzv9^նU5 %!l/^ڜ((t\vh!A"P! Qק dRѱ~4qSl2q1./T))'D}o駻KZ!beI֛ݶ5ei1CB,Y(d!'ѽ#HN*eSҘPP15Q?nrzqtU8!]l娰v2j*2Ĥ^ _<-/FE2NeRhXn\}j5N,3H] !;0x>ʶ닲xzv>|sjCk d2M]Ufc2\.}LCn2%Cm ]˓Q9Ɣ%t26W|L9H1lʫg$kxm磈pm(ٍWzʛUd$O .!F6W:j;=Gt^CL}WH΢wowܰ [Ā;dłF"TtXmƣ2 d|9BWv_nzrp8q#_wQrSVI )Ų(c.`:rRa6m4t]v{zq˯ 9uńX@3^ )7ETto&~E Y)QJ$yq]Ajm7UqӖPalZs8ks0EZ3Da'uxuyþ, FPTQPDR"ƽ2"/]V4Oa`*RǟliqX_6gMlkG`nۑ!]u;q7UE\9Nb =oCM?xM rȀjP:a׵Y!,A9l}䳯'g˔d\$f"vMS,xvqnꂁ9釸uW.4tjhꝿ?Fӱ3UPuPxW[WߜC(?>9=]啐T4IS1@ؘnN//~=3R}f.gMY^6KBDd`6f_R4_[ 2)2)3hVkm9g:7NnP^:cqwlGO=lxsx|n_pϾB_bN9'՛zQb"3d XOTn.7uw5VƆ~+̷Rۯ峙Ɔ(6Fs)`[ =zzyRxz;F~CH˔@4K)j x=nR\RQ * 6zifLӺ fhwֺ/o~];=NrYֳE1[$L*&T8~pV+!,ISNL(QG!v" %"Ij?"}~\nAɄ"ZDkYUEN"Łr% 88ksvhVD!î_?n@Ee\'/6jM\mB,+BϿX_>iSGMYe]ŬmVU51X8w-ˢjgJ}C46nxu!4`Zxm'wocYfcΩ*UE8 ْ -?@KFR7$-$B*v!"#cMw:i#"bE*s{},].rcܲƄDTB bUG`T֠L#вiMgJ%T'EYL$2`c  Zwzqѭz1ҤTYVeYdjedp!\.ϗ7f֍RG"C,HĽ31&D"ѪoMcX("k/\@v , X)FM"% '0|juYcJH[38Uÿk#Vuk7GvQPoп\G l Bq9 @:VI]>yRdd4tbL4!9!l0ȝ3Z'&=,2=_ty撄[Q5<<>}ztvZ9ֻ7LX9FhR55l!zff!6[} Q+w@" DB@  "mJCaޯ5ۿ":<$qYM4MC;70Ր 0@O> .XEZ9V>+3If YR9;7ήڮݺUZVHpz@: R2cJqDpgjPZ :yvzIpYwy%D{c, rrc31!@xTYJEfu(N%NWug]?8;*K+r^tj xZAklDk`XŢL,c@mhl!lQ>_"?\!: 쭒 ^YBaAam\R3 #^Y~7"Ld!zyK&<߉퀟T9|d`F;-7oz]mt╛AHt =>hC( ,M \B󁐅 >$R)c,˄ 1dyQx !*%"#xFƈf $#Gc awiieUDpp΋Dkt XJ($8yfܤ2#vxIAAKK:BZ)}AP+zo9?gP֍n8 ˜l#K啀(VJ.[Y)" )}`}`H>Vӽ1ϛ:Y% a5˃ۉGvqDVY~ޝ̺Vi^ׂ۽qGz"@l_n0 ! G,]ϓ(Fۺ1!y-@Pฬ[)Oy?=ڊH<|@?i$"#UXg$V ̶ȋ.폎&eXxSJ:g,YN2Dั3*,jwZS$XHYG;;[O͆w3B6Y4Qmk0O0/tpy0˧Dy][`QZ/c&Z ~ga2.NGgGG{w3mON bQh:OzQd2Koϻ֋U &(&y)%p0B맇Ƙgrr`4eiQMΝ-Nެzsx73R WH)!_6r{K-3:o]pLdEQT)=k-m|U1j4>Rq{ӭdzi|X,df; >>0 15!k4SX*a%IL%(Hb=N۳\x/|L]'SE8!h64e?ުHȲqly b7\A?u0b# #WٿQIAњK'ۓ*Iks-].\',Z,D0O7JAL'ljRugʋn{3$Av$ >0"[[o;@;4FQ%)nfg 02#`d9l L"D1֚4FP7{KKD4J-p-ܚ20#ˈԧVf.c>pIы$ LHiR)$3#G"Ԅ&W"d6AbWXALQ"^6_|q}x)> _ ◒z^^O*7x6_=z9t۹iR1\PUBʢ0eίc3W=Hfy]m^OMcQѦ%>{=5nb Ҟ R+Ih`=ϞX# V8$i*\LEx`i)2FC$lYywָ3]o{c\mg)gsO&jsʥ$/銰322]u<=?j9`ptxMm" ՠ:; Blf)Ƀ'yOwSv4eZCK &yK0_͟,vnTϪI32z.z"@b1D&}!TA|>9Gǫޜ7$Ιv}lC$e\" ٻo"<>0ԽiL7(*j~ޮzkˤٹzdEao{{PTMgΛ򢷽>"+:#@@,T IH1F]u b*.f>xXE`蠖E$9/D.|~.%v0fM+UpՉ_U-L'Zu)2\@HR7E`=-Zְ,SZy$RmK=w/u;TlkݴqCPHBƯ֦3Ѝru缝 G8t8gy<םA ETX˺1!J 2+rcD&3A-<7xބ-FkhCC(YGb D]}#T?".)he2BSS2^?z`~O> u#c`mQ"#Nu R#!CE8MK6u&qE€ReKi Ÿ̙/pݒ%˕wElf 8YJݰ( GEq`Vߺsg\U^:ZTJ}s/PBhhZ TбJU魝]5A *M02o|ltm#9$Ǧ,{U{'wIa30?{`qwgؘ.r&: I4W)҉J4&Btz;~O޸j ];k ʘ`]!1bY 2]a^v]W:[6MQ1`|X/֍q]DrϣlSO?Z^۳(ľ m*ѥd[ཻouϞ/CwW` L L#rH2,plh^/M.0|Eo^_ln8`DAM sY"dlr~kRyoMK;KH%4~_N}ٹUͿnzAgdD'SLG2 <=޻?EB(|xttSv0ys΍ٰ WIY!Z]{Ȓj%X9ALY-ZUl+0(e;4[duFB$@Bݵ69KR-4}~\V5(ha0{[A2 ]uW/[qIF!`DB ^:isM,&hEv6,U2R"*\/}tvw}SAn.|mD`ARv IDAT?o}x| RmoI tiw?pYEi 5&$ApB`>,$"0uolԝ}4!\.}i:[''pt>n2+%# ѷ}F{獳9zgm1^I!! jtZ }JB j@c of T,C-'L\um8RqXUK+}~fu]Lϡ{ϗfIPbn_+p-zɔ%uƚ)ݚ: "t>(2ZEBJ$ /vմ] W@,Z:âڟ Fs6$CؚBI#U+"ejeI@52QI#(9o)1 # (%R2FOh%1b 1r ɸlHNіQ"!!"2QYEPM?o7xX F$6Mxo"Ty JR$H:WGAp Fdu:f}.!X[u o%~/̸ce:EJi!hʰYD|- $e12ɽM R4]B1+CxM28UI  {8Bׅe=⍃âpu+_4G-G`Pw=xeO3a3婀Jfy3&c lbhuaiW`()nMU8^+6=r6Zt"L!T%TNm2}pmVPs, D< ~tiĖT ֔ToܟMw$tx~qt<]궯E TB`AJ$@p.DÝ }Y(Zw\zn.%"xMt |mڭn~s8)u|um&/ǟ>JRJ)%P"@"YbZM[ۦu&I(`8rBP"(bdB(20y"3D!QgWfg]t$B(!\V6Fgw0{~xPVjוּ}$EqGMI$2 1!' T9BxW3M Ub)| xɿQ9cի4~Fy=cIR3enOY dXI>Ihw2].晒QJ(l2 ~8|,U^ەuoӜ9Ǜw4:8 kV*؏J7 ?Syp8[+Ȳ$mۖUN jXk2shTpgD+h{5@ r܈I^w 7^&AJs,xөPYwg@j]2b`&"nD eb\ ֻjgre!#5,B&+S@Ϸ+a&b?\;#P@oolOU[eJ+?VHwbDˮ뢇Em p4mי~լ߾ݴ˹u}/ip0_-LeX .Mf{:NӤ[3wA^B,'Bn=<޽[[#>tݜGNooOls E[EnȲLcTJD$TJ "!*$%eݞ_Υy 2g$[hPuDW*OLTJ`)(OŹV! ƈٝ^:al;$&)(HzGmka: 8n6f[׫>0EՀE-EG,!̴RE1Ϧ$ nl7_˧ ^m߱5RQu]KY"<hmgrkYZs@$:as͐$˂d5T WE8(iYnû=-znʲw{/OeHϏhL|zUjٴdVͲjus2;.b&gڛ HHSogḆk[h!P h.ӳe Hy_0{"Kd$rMO޼ykk2"!f{2wp?+>HJ1,WY={: nZ}0M<b~yjr< [B}!Vmh!lXYVUF*K[uWu<~Vz4IVdJd$˾1RU//VkIt/*2<=_OOˣqD(8ºVM7_>'Ou;_# !(x^uoܺ1vCRmp>:Jo^lZc}4JqzcpȑBg*EZi,δkR__^^Fe;]|A=lLm H } sۯ>.mBbkO+2Ak's_E$:۷^"K~yd !CWT&X!v ͝*Ѓ"4?o?#׶,2)%"Y?;9{;jX_oMNOÇONxX x?9;gͺwp^ݛi۾mCTdt v tF !fZ%:8B p ! 1FCc@i!cHM[(rn:EdhI:AJZ92GFF(PR|죔:[_u)2Ӽg"$vMDA0qox[~cw_E3bˀR%ǮINTY9L=&IE/G'qw{JGK~g:[6fјeݠw_>ĶSs]IWLܾoA{ut@(p3ivAWg E{lwkZkF<: vذde]5^7vڼc7H>OvJ|{~/n|fmm>p\i}c{|c{6Vɠfaq>IG~l6{p޻7wsZwB`_4OR"26]{֬긩NIew}~q,^,֝?Nr!oZSwRD6Kr`3hwXNʴ>.$I7R^)MOg8؟`Nɪa"w?|>{pzt.U:@,WI b|5Nn^5ʷ'ZÁ(FJ`ƍݛ$U7wvnh|h{nD}[>=Ϋ[oK"%ۻM8<:t1>xbIL#)i:L8{~~yqd/f1(ד;w 1#eD}$/'jHm|ٓ6 ^ONaBufRu|z~:e.''HH"0%Dф|0Tu"Yw}@&*Ƙ82:1P1Zy28RA_لLZ⅁##p;īn[0᥅}w1wW76pז,*v+.L|q)_k 1-ϭ#Es7mؿ1_\޼y ^fٜ],Sp{{4 mW=>X<-*V" oMWR"$R9O B 9}jJ)JD䳏F|Շ"m"F_;7y5r *_/}g~ޖ .lݙ0~%{鍵Zunj̓V]/eb썃`Ւ,7 )#!% O~e2"+AwkbkM8*)ܽu2?_vnԑ'7wGAVy @b(iqzqurcw8Uv1mwnmoL -`|6ߟno/9E+e@h;J(RD}b(3 2MT_K-Ǔް}?_wcg/=wYΛeQ%;[y8lUY 9 ų.ECC!pdB&(p-2T%"JJ-K5w1x(MHM>+٭RHkZ(ƍmJY#&\Jy..Y32uwQ++~.>\S_Jfؿ4/t }XwwA7 nRCDy)Vqe͓Kawok:fw{TkںI{cvs-O3ٳ#[;nLe^pZ}ztCt֮YYmφ$0ϲ73f@KF0)( yh>: Q`d޸yxؽX`53+& ̑ Y8֊P3H!>HD$JDsdMK?2 o`}LL/uY7G(S|&WR>"ao<%V4]oЪjZUoܾ-9"ھ&yU!> 6 6Q)Rqc̻-*0XSqBz^n2+" }u.H͒w|p{?qS2>:֩FSǰZEq=yx|ޙ6 f|^rxcg;Y~T)ݭ{ߺ{;o{;qzb&#1"1rIC,Isݶm.68SiQI ݚܸUy]_lomE^*<Z4z<BY"Dp}];Kb $|RK‡XRi&IUuVd8G6t\ GJ4 xt$OOY }*hXyIٳdusy[* HJnEvێVK8~~u:o~BZClJDa (T՝oޜL{Z~ȼU"!ER țy^~XJLҪUN-"-s BdR$\,b7Ÿ + ?BxD D+ RPYs.Ҋ_Y-3*Yz?n$*賛)~c^ًϤZ^.VWW%# {M4)0&ht8;_q7v,s_])S,{]P6b^b1pk*KEs8ibZkއTGe\<`P#):Y.@ sE(Pp"r\ȁ!@'>5(04#Ot)}DlIi>;:yzt~r$[n8"XH A @sz H$o:Biq>e6u)f%Hp`"QTzժUY.̖x6u(&3j:zhIcQ(B!H :4/EEib%ډKRA Zט#<(i@ 4(@@DVXk ]av"AȌ'+|!O-^v} Edk>}f3'dջAGNt ,vs;^C4 6 );x綒yLY RNK\׳X?Znt_?~d8No;9[]8S1~"Q=> Ft]e$b{(V4VV~:7Т c+ud {9 . # vY³Yk|ъvjA=}Џvq$"$% IYbi"VK(Yh3(+_[jBT7CK-[*  y^є2Iѡ$(A/>|r2݇l5u461Zxϵq&xFb"m -p֠A'U,x9[U}td˧Fid򃝃ҩ 1p8 ԏ.M8J'|^}޶F xPT+{ DTD,@HB@Hhi'e4TG21EZI{'o=="(˹qx+gGs_MFnѕpwDIF:RQeI%q+8= Jfib[4-3WNnZJz= )OhΎLi+1zƻ$1ߧz0HLH0%.'DMO饚P T`2໑r&8y' n ,<BDP7alX;2٦sv^^ Dj?ŗB_П_ 7:RR=Vd+OHR7rY =ʲD `/Kjgyo1v |N/.NH^uּy~ɧzI%A7v }&&>x R3@cٻhCSۂ ~ PF uBiLBDLBY=uS3 ,K]BJHza> wܪ݅42yxPd (e( u?m0{b-ZYEj6 (O4v ~f xy92F֋ 1k3᧦Z3|:O(]1Īe>~xoT(Ab>Vצ ƥPAI=C`2Ƅ~HłD$T;#qkgV?1QS &ern ;v7z$<50eQ(l1BUGPuv'oeqIV4x1?_>ϿL'"B-)zW+w[(n3[WEEBL`FiWJJ \X;[We[h͋N7̖ |yLmj[]TnE-qc7OíAۥ׈{t 0zTzn/~0HE,Cޯ$(lT(T4AtRL(i:.j_{&T=j8^.xzzfo/eQV;}z~1-qo80NH.hM0 Ց^͟_}s1GY&ID1N,LCljr2Ƴx1dBZQ`#$Q2OB:"s'O"ně6**uݖn0L^~!'J0LILb0?*vE7{m}1t_OR%r[Y 3BY6(v\UQb~qq[U+G;줩<OP%bۯAwZ:;}Wo]/˥ar@ŰNuj H+-TYV^GBH'د#!r@ RsS׶Y۝!@ BFX(xuCcY%Q@R `ZGD,՜H#2,bK&Ab쏟\_$~an4 v7U@ 9@Q̶+u Z|tyVl~jvmb"̝?x l+K5NNMQ/:I/Aexbzv{l5SGӧ+ˌ3Т !iw"6p8,V7~U\{׎Kd D7ȞLiݞ{S(oB0J,NE9-ٙU 9gQy#ɴ, ou -{\NNSbã>>Q<pZ\L,iMȲQ F*Ɲv.X\lZ?-gD@O|J; ?p21&[ڻnw|i PIHtUPJ!EjJ|PtۣɤV{ZVNΝ<6^̦٪)4WPWsvÃ^{vX "68803 A  HzYA'[g<9vuiLx,K"!l !0`V[,|Yýd=-Mg꽏;۱>ywVtV*|ч}G_x_}έ<+|znY(ht_898әh!P7Utzk*ptPď?Kݬ" Y܌t܀>0vgY`㿣us,g R , ەv+:g}Wr|*1e+F@rniEe$J'I&\'V:MvwZɼ탵>%:i^xb'Ȣ=эy; >9}Ez׋1vщ-E 0.P(%"HJJݺ(%H.x"κH++EUiww*JS]4ٓ `QT>tVJ$#, QT"B@FB*VvDvNeQ9&<ϫl9^,ei89tT*Aĝ?d$ !#0b3!f]R{/=Ҡ)C8ό]MǏ^4a/sպ}4ۻG}2_[m߹+bbd| Y$SI^Aȫem,umٸ,DELZ*/hFB3pDγ,I,ζoy;jt"UU:T8Ҥ5Z.>=1$7q7 !ⷾVǏ^-brDZRz2J($rX$NCV}"NW4 wo+DEow]-}U.F'αWN+2o^ϯWOgW,WVM yI4>!u]MƋV:Ս ֳ̪quYι H$3m=[<{BAD#cq0 )eِB @9"E.`2^2"`O(|p)1"1s+O˲H2XOST Cțx=Jݜ|#܄g a LM Mm쀌,P|N zuO3kG^4M E]WMD SϦY;\q&5oobFuCI@&:7 9yAG|/ \wfgWv`yq. h=/w֭<=?EA<}bV j}:vA75C$1)eMcWu脭OMu'Ę80Mҭnl2/N/D*y᝟bRZxriSG7* yE]GIN+wzz0Ƣb1`hI8#uy~G}%Ifr@\\\]\y狪j5y Ete]V:t$s>8$ ,F )dzE<9!WE7;gak"ΏOR֚bʦQ&iec];Kz[n",!X' Q y$F2Χ|fl>S)r{L#F!e e˲Ni- ES8n'B +/O.*o2@kkBD@+u 1bY R 0O'b8{:-iݞ,XE(`ΙFI:v7Um%!ܤgmZúƆHKƗU A(*l0g$/D!<_l8t괿$jCOKq&PFk?~/sf&յ B j&D"qq^/ݲaКI{ZZX'QkN(x.MXJqpT.*o?D*}6/UeS2R 0`$VTmIKRUcQYQi+J)k5N l@\"HX礔ZkAE&c}^K_B[`X sIC]W:R e H=( 0#e NIQ $$I4ȚQYG__g|g5`D묭 TJkBgߔS`nVee ynwwڭvokwy U7^ԍt]N?H^j0ௗ2 $_]9 ꬚{ 76u@ٿW_WvRO/NGW[[NMTE=[&(8i<=8J;'׳;S@$RӋ4N#3po߹0W y|q[; ۹uumM[qs B" $zy9YHRUVU%:<'w;#wkɻZMkR`(֌.'RAWNYU|g0 AUS[rMWˋ <8/<+MBJJn!(VJV&&qIsksl٠ !Dmբ\{\'2oݡzW% :lkubՕOS4GP6+6bIG8_x0i.[˥ A*f@ 2b |ӺQQo\l33)"^ aER 80C<>~.&Ģh]_Pcvz)A/>rK>{c~ޟK:%vEH@ŨlNmއTPS5e|6[kh<}zz:~NQtR]i''W׋֒.(굲jLݴD}X ;ckH"I-WRȀ[ 3!JcC B!74Z뽐ygϞX;Bw}RH\އ5UK چZ_~g{9loH@xzBFʂZPϟь~& ?K͡C Yb]gqipw2U]鼺5ϖg38l tdb Q0B`>l N0_`! 1T˩fɃ^'b>MDU0 g*o87QDlu|âq3?7;,!jFmDԦs@pO/Fv9Igk<_~l:mwS9`@or[,jm\@k +AJj)*jj^:ݺv(U6VFr1JbbKTCHQ㧓O7jDVnA?/'WgęZ-5Nʒ,Ց QxrJ4Qˢz+(x;֠AEQѰ AVh|Y0(R>̒8iUYK)^G=l8"tZ@*ekֺl/]`Mj^eiW{i:= IDATv=XsŢki){t^k-e$#mlcj9NL`hREQM擋Q$VUtY5dQ\VeUJ3lX6Lj;bYUe]4#yY{f_;'WwVnh<ôc&ɵ!vz6 uI+H2 T cVH&/dCFViy@]"ZeE(4r!e, shgk*٠~~zR,sz2/|1סԮvUǑX|4yqZu(v(O[YN"An+vg9{ne;Ymg\$@D@"IJ)zb%1!#~Y5(6c뙴rC\& a/>HfF LȀ 4j}ソ4O ULKhRL__sr6]!5]7uNPՍg:vg;F6-;O&[H0Ӣpvt6˻zb>=Akh})X.ND$Q4['ΣAx\w: ,W#-D_,l 6IKu|~HRݽrUE6gNǕlOtfݭAjXTvZ BJ"{ޝnOBel:n Q,I Ws,3;xQm|OG_y۷038?OYۭxXMmy뵑0Wz+Oc)B]6CH~k{k8J4;`PK-{i4(jieU\7fgӅ5/k"!y:_^N'٢*Rit5'qNՙg&acKbu9Y<>]DJosolU4g .BiH"UES$%˺*mcGW~Uq~Vwu]i>-.K|M]MpƘE\F j1eyNXKi==\,EYyQ]Mf۬k=Mf8o LZPL4ˑkmm_|tg+P*F"nW4\Oo֯ny6_zZӫwv#{{,P0B"E.G?}z=1U<& C΀n-n>stF5tZ(re)#c ^Bhu§@_^X秅۳?O+?n㘂q#<杭Nq{YX ɮ^=v^.*yj}t^Ԅg*WDVmmo׿yp7X:7oyQ[hgK"k%,MƣpQ"ٹHROȅ*}mSױҳ(:d2^ŵi8MteJzWQXY`*szUwp{\wݹycz|e6t:V+S[^wVF^HH,lH((W 2bzeTSݞ5ۭ㫫jf`M]i-y&Ee^{׾;}dd%;v]\LVJK||T=}X2"Cpz0]<:o]$Bk3y'B؄a>Mh`»$u ZA7߉y)l? ,~ւL/A. t# 0&r6)2k:֑iA[~ x?_ηNP==vwvHZo:wO[ifogot^+2~"[ƺ5O;ޠGAH!(teyAPRe53,j缯DUWfUJK@e!&$yk JR!' 4:몥  E2ёJkޱwNJʳs~2O,%!by %ï =;^~{ )Φ8au2OFU>L-F#LP2r7uaJP) ;rB>yu[_fm޾ýv=۾oOX 7Q~Օ_;oOC9QvoyFlK?O^9{[V7en$nx^')ߓDJ;']zE-e\$<3jzYt*~TP哣3t99_qV$p@RM?O|o}Hg~?Us.776'>Q]t( 8gR| 7sh+Ϟ@ZzhMu.P-~>sGR ƿw!$7w>ι>[8[u6 t6wlp:xEp>uc&O,5Df(彩zgssosA 6N(z'S1u~^ԙgO?EB^WnBX/` ]nZ|D Eˉb' u^ʸk›= !L/%&qYp| B5}NVJB9 QIkI_ibvT `tN+;ɝJpH$TòWhAoqkbgP:0".fwws^U׍$bhND Kۚ=|=4DZTiG "2#$F@,IH1 81!(i0M" 1KRZu HJK)Td&*tBml "H"U$mk; ЩCD^bMPLg}>"5 ʚҹg{(udE00~w>i8D8B$2q?0˛9-{Ykw7}"K'x4\6tzy>(ӝ|qq<ٗ޿gr"ZyVJrU_j񵴒? d"!.*αRCd u".+P<."Iӡ3C:O"wk뷿scOՠߓi!ԠJST;kS-@$U2/zIc@bbiT&:S%YE*|ws8WEOG㍍UmLpgdj2M<:ŐHZ9 .Pʅhjڪu-hݏi\10OgcLRӓlV)?|?·Kq(gORry]`H{7BɄڮ  DJŽBLMeεMk-(Aٶ>? Rhj5:U*+vZj4dYr>ξu6 ztvtbt,ڮڛ( j[50B ̂ F!&ք^VF0t{8y~NtX0w2թ )EF¦5EGm~xDt.#6/bb\A;yoct] Y WfRt651d^K@Jm·~ AZz, [5:5o}sB z\|pʗntmhe:{ځ QMnk.X~xG͍b"1x!pD!8采?=.EeFEߺy=?~||!r~˓,S#*Z΅5]IT>DQt $em%1s ҹ։DR DK%ucӵMӂD DcBi44 R$&R !I]6(!S-YBܴ>zz{{7nZ üjE?n߹'|iZ{ۛJ&7 EJjg'oX)}ި׉%͉@17,Cg{[>%BlKC@ϫi/b[m~yd1;"{~ nY&{ezJ #xō^ygo '_~2x2ھssghZ¢i-ui. l\{θݪi?~trnkZl^v.Lͬ힞5YVmUw.ӓI57˪k&b29H$ u<}r8ڹM7m3ּ7ncur{"ۆ4$weeJ`" "qN*$m/qؙ\E/RYU $e1,j^WI]u^/,|ղi>Ejmk\նs< V]ٳ\ ߽},qّvm 2I!Hh iD9"fG'?̵LUJ¨p9pGBRҳDžY+ #!@ݸYoYn2zݦVMo8p0(eW3i9>Qm4Sz\,/xY+2gM'Bk_}_0^#}х /. ̠U׿م0{:ɲdzvho˶@0zyv|Y)GbZ[wTKFۛi?||X0-yr~z; J"Ǹ/+41(U,$6E Q0xfmA"V:+4R !j%i:C Dʒ$IҴmQIAȭG%e='JzuA&ZHum1],2"%\zgޮ ɟ"Xo;ֶ+UeM|UY]_ǣޑ 2ʽ֤&Fp~p?ŤRCΝwgޡs1INbq4Ӊ]67ǣ^)y$ NNᐝs.wӢv7U-679MRR9<c+^$]2ҵS@\^\"rH|0o5ZcYC !"qdpΗuv^7AĈ6z_Ȕ*ٿx䨕J0@ ڶ'g[T?(sӞ ü"W>ݭ1ԬMwgN'rokK''Gg[[.=y e;4noܽ4 cdۭQ'w^́"k~7o!eǣa&޶]Uy@Ee(˪Ra vsi~|R[o'Kk1i<7ۃ7]u'50MccpU!&4T$ۦ:>6ZDIQLp`'/3!VhpX׍m=!q̏NcQIJ E/ӽ"Vi47+p IDATLg$(;9=!em?I*wnCm:%rJ6M]dink5Q\"-R YDt%1UR1j: ȃ@,ǘicDh Vxl)1DXD h4uVK2mbgLO0OQY;:;ZC̕X@/z0},5?3#^5^r&(X/ e9kic4iVZ(Plnnǣ٢bug"KR!'EDƻʴR LH)ŀA.(KJ!@$ Fo(d J) 2-%:1x>ƶmu1q@($02'd#W  +csJ))9$A$QθsQ3smԵǽjQYFZ.:gW:-yj ~P~ k+%A!]&?Ȁ+W~<uc5{m > [eQHy{Կ9ڿ q?||\FR*IL%`sssޭ|Td),_E/Ċ\edˋT慼(e\%=VL&=!!.P@Z!"5~:?V*Jwwzͷ^na^,MA`Dh~.{cB7<"uZYϪE&*%I]gg:˵Nl^]SbQY& ȋ,:/IãO?zzzt:7A)JZ=>><ѩ4URnG^vp[kwv -*g,x7H^ dnM7e.᲍'eUy>=d2RQٲ1{"xiJ) M]z)OND"$ k\H Uk'i+L>Mv6HbQM5=Odd:QۦcklM"Ry,q?>zt^/IRrif3/Y5osl2B"cHX=EI,DU7u.xkے|fKXL]]S 3i,RH>)첉gqvdW?lltsZ- [cp-@?x%&_樼j-5 rA.6's;LO|b0"3`@URe3RLbMVP_11.[. .實>GDb$0cg(8!Hlc{uڻ}-{=MI:/?y|xt?z2('㝝kn'؃P@6za]w?~t1<~G-sqXmi8&geXScm9[,mMaPyM|/ɼȳom{m뷷7,'7w7Ç,5Y.{|a6(j:k7F;JBiO~lr>W~II2e]t(ҭt(ES5!~S 鲌kI"MU A,r$VO'Ͳj `5ιc]wi}tz6[6"՚u/,ӌaZ-?~:;uLop-M0~2?>:ϫz2'21@@$Ȋc`)e&8:C ƥIxd:\\\hi Ë;=?M#gxёDwۻEga>ƫÇtF9L UvXVhYۨ(EAȋ`!__^1>#P^ΟB]^wY\©~cMO'ߟgwv$WRw;{t2?88;;zmo^΅PRERyMӓebo{l6Ӏ!Z,9GGȄ,#2e^*r`yv;1"@Ib1i:h]HY[1`#D$D<Z 0QZ1 zTyyVV(壍 uQ˪5EpM̓֟& 1u^@ƀ.m8Vǟ_k"Ū0 )h>x#o|}o8GGhEӘEo~`֝Ũ TdJ8Y,ۻEyfb`"+Y(΄*TOSyZ%JOfD "0V:hVd@ƅˠ*kVfk3-J/)bd@`WEѾs?/|g N2sBp!tm^_(wD\,ol"l9[6G%ɲjѤ* |^d|ttyS^ lQÍ>XUEWO7YMę|e}A8$qӓ,0kFe)uCs %D  ~hZWn;j9],+T1KҲL'qXՂ"F}dNcO'I7ZFr6YHmN*qr:4/UgM7]4EոEۥy<6mT:oZߺhϫuһevaֶY `= riYCdd&I䃟+fQUM.'O,:RTӚEu3VQjqu4u%bL B`R**IGB*B$ dii0 Eq .# EU.,W)E+?IC2?ř2*48/|gS'2 ѶzB\V 6|sc1/H.6g<|YL,#FB>^o MM{H$D2.Jtlqu@e/M{/C%0J j3Dܿ-P>:9s} WīK3O}Mt5FeW7~{l+͍D;|xZ)dF ›S 0@ ᐋH@2Qm|G܈f1?D#DfL^E-M@рW "FZř)&kEb\=Vȸ=>E ҇p>IBLa MLgW|3y_|t2_~ޠWn G˓^JE\%i^.fcƵޜ.ϭ V4Uì|c>AE@(g*!2@eckR-ڦHF$ D` B2slYIE`J0D(dfUh}m{fo 8 +? XׯYXw hYD\>vvI:SfFUpLS̟'w`y%^Tp{I^2agjMHy&3 O?|4gVR\Ref[vA}hٝ{~{}2DCƘ)DBNQopk{=':1uݛk&Cs%E$ϑpNMW/…xPfkf᝱W2=BcTBn!uuY8W ϲ b5s˽aMqp|:"~Sëߌ]mIp/ Yx]Ϻ;賣_xnO9A #_lvn;ONp0I٢'* |郿?h8^Yvoc:No߾]Hbk} (P %$-ʵjTJHB XߵG%%jsU7A Hm !J!1D p%$@*c;cf O4 2q`u. >w||nZ>37~ڄ\<|2^9])ƚ5?%|gED|g"WHV*Q FA (4 ۈ%Rݺ (ʂOJȧӥ1՚B MP 7"Ot>mr-O2yŲ>D`ˋ~l^]h2;ޝO$i"ޛoݛNQݺ''{m-CYӵ.D~T&6֐'OOPoã7"SBJ,-Eu[ֵi:0vui $aHk Z %UUE4Ks(4vd#`3#P ALiɌvBji8i~?c%W@ :B""P.dxo:cڬޤUBHbCH'؋z^tWr|o:?}| XŸݼѼ)=gE,˶u3 ^)ܐ#h^i\z zE/s}|![x c\}9n¤r^ nx}peHB `Q57Ķ<<|3}KoeyAy-놐]w<2ѠzͭV?b/o얉!*E30 cH u@@ԁ#蜵m.Aֻ,˼ ?(,]t1>".@R(rBf F$ I(z@t!!g'LΞEśr]g„dx3!+3D >mL(~M KE2_x.6_ekF)_ڴdU(a1AK`7=l z{[chzv<-Z:qP7{Rsy LUNuoK>_ۿoTӫ9(?|??_¯o|;B*>ASDH@j3ZZak~7O%k8bc1FD"F,i­aF 6{;g4u6޸s˕^'r8*ol(!yeEA1x4JJ1Q/J}WfcT!D* l lg첵 YJʽx^5ۻ"ev7ny2]{`>mmolonQq?yѠ{{GuP7UcmcG ˨^ NNurRR9יv6{Y ru]gssD/31X/w Xk&YYCP`ue"`U!ڀ(]kQ6lLho9D*89G$d¹C3cLD%*T2K-ts{ (ش{/%)) ޅ!d'Dۮ|m/\IVP1+b rVʢ ;_Qt岹ʯ~x+dW`^|v|c` =@t/\"d ˥iv ++Ȟ̓%;~: /r/\GxM̈~\Ek/\@]NxϋJ_in['Tݹ#Sӣӓhx6ό, 2w~ɝ=$z7= w?7RBeB*R 9ehWIP@k:-(4鬳>x zf6`c}"θ>pdsd1p (]g$Zh-u IDAT[g]ɹ'0=|T̞l2kgJgf0/G뷈׭%Qt Kr"૳">s6u^+z4 ]m}q]q-=^KKLFBZ_ eI+t|{//lcOf ?:8ǃ^ooh{ b,.k)vj)8 1QRLe " 9a}deB`"sU] tQqk7rBF QU׿|;! wooOfL(W{1^Ẅ!"@D@AxqBx^ywl~/h% D㦳QRR1QPB)&)vvD>=. )ˢ$ƭ'&nYΌqgGumLZ|>+l\7U,M5l9caUme mhJ{Q͝ݭfk4![Ų鎏'Z}Y7vwɝb^ _NeJk U=ov;:Ly??V`{B(L9쟜L4C9/$L#s]鸟ad0>YρPX&TD(Ţ:۹6X3kbN:M:cicwߜLGDkm`[Lhcq<(e",ʵBcYRu:WE/E[9$(KFYTMD <3$Oޗ)-a1bya אǚckG{V@]oq2+/Mq &vpePWr/`?|Z4姡r;DnZt7>gm^Xĵ*$%ͯz? 3>V(0IWcr4?}/e/I^^H+p~v˓O_|pt/9NDWDmBdK/V%$ָHA1Lcd$$jB tBQ8|RL0fW\/\D"f>/Wg 3s5p 2Wx*pe-\u\7ډkf^@s튁z~kSw 9wyg&K\b^F\x0\ӿ^mEꠞK{hMt^Y?OR{o~kHTd"2IuSi#ȑb0.i<Ub !J3#2ރG PIDiZyt}ԩǮn?i a ^gȈo~a7D-P DulL?/ݹ韽Dt" D"B5K@Eo ה!5E,ٻ} Iz~? Z BbH c&#! $)ѺU2GkT.'G$Z^6 |VmZG1z@en{{uy7:jyZiOgܩnM]U==t;vm1 KH`  !!$BH!q;$;]rwMg7ZnWq]ﳞU(:㪉V8m77 11:Q.DfXFW4?8gpcзi2Vz?O޿X^|y_d4Yנ(~fwKLt@(Gǃ"x4%mbNNG.zI;"Ni]c,2Zmwn_Pu3*KfԂQxV7>L ۺ[dYhHk]t 68K,ѳEQLd(b`3 hc qm{,,&ƷAx!4~c9ǥogk ,1 Y@6ПYU/ cc+ zhQOj:}T=M. Ӆ1@XܖEKDwnleTmg ,"k`u6r&rQ.ER)"BsVY ⻝}cEha:srYU9Fx~#,~ɤyV.h錢O2?Ջm Z^{qyk_ ѷ<|>>lWviRUۛ(B<}=,~;i~.olYcv'Fz9T>h@(5>xc1Uv2+[b$}1Yn|ঊD*IH!#*cD(:EDTMdAavVG|17\y yuXem'-hN4ZlX >䒛pF8/JWZzOdq8  |gMF/R}> L\Ehx*EϭPpnǥOxP?6D9g6ko\ݽw|(I,@x嗞*$GكUcg(6FŊ,D P`T/bFf-;3HdV()P:ĊHHd  m,"/v6:&8ĦuϽ!#a$"Vq҂0Y%voWO[Og?q2i2J晗>cܥ7Q].6WnÍOM7׈m`53"2R[L4)m\u i5suig]v60d\We ֘^W\YU-]4 zqݾT֍Qltd4$e;:;=64%F$,Ǘ76H@2O4xxXUm`{gݭ+<@Mr$I7S"NTn~Ynb:KG*w7V۷nm dUE7z4i>g>~U]y0YOZMM>qʚYYe:G>$I.ftM%{f/O8YDD$r4p YZkڦкVBA ̝u4<-Dl l?g5:A|o!!-f\SD1Fb+.+E"!b9U j1Zìx/b|ƺ/LF|EXɢ>[0wrZ  Xeϊ '"Xփ,ёTI@WJeyϛg9GV6\@1D]įLW磽HYM\ryY9ku(XxɋUUޤZaV&st]'qf8gȈYD޻׼rS7m; 4_gYRs GãjxđtQf6+/xzTwN/=S;tt43u_ApqCYyЯ{]xkǭy;> Op*~a,$Tż#Ӫ~1ܻd׾{+MkW/u3`vmnI%2TI"B DZ%Z$K(5hmAH "jR*S-!#U,l@D  ' o0w_g4B3@rHh4#A#&*__ ΃7=76q~׎NGM7Mޯ?/楝"UYuٴeuVn;:K&u.$&tRT$mPa:G80$Z"ݍ+/^io۽[]d3O?{ui7olwgٴòw&>x"f:TOgnճɥ㓓[wYStTnʶxt#6GAbQP*ߴ@!~R&NYNƧ\vi;9N}l6m@i5sx>jgNHNgGa0 }BUheZi{砸oHJ[m6z WY9߻\З"IG2uxStgegQ)T\'>$'ɠ :=eDtL3kuc*;N;YǵNu;YʫA+F&V$Jke#P% :Ԋ` -, <) TSԑ*Im89v5S"#1x8ne&" (P!+ˮGq~ĊL4qgs rDVyZ)`w$;< / LLdB\d\/?:,FeVrdDduu*Og+ t(\KHq6WmWg+]*P柙k缭^\+\W3ur ˔s+ "_tq⍸D9*sִtBpm_޾X*T"cӉNtjD'Veown:)E4mٴ'R$RǓ`̿E` &)pC(7>T-,3`$D7~^~y /i:on_^yRHNjbΌZ+Me;FNrK̢RB j4Z"2"CE44^v(,mSm Njj;V·B86$8N[,<8E\:|칛V.Ħ)E}oZs!8εmm,zDG@Ai98 㓣Z̨leFV Dkx:w$чaYuF0;X.m i˛àӫc<9 ye#mHI {M+je;/z ǽWM+ĺ z.t4.' "s^Z,Ko6 ?ZZ#u.(̆$-Ev ";-+ܸWֈBĿ<>&]XYˉVijLwfs?Y9αX+cO`9).+8%mf?nyBi]X@uDѨqf?kʲ<NZ8VeL%!9Ys!/(}pYB$YUGYUGfRE!4U Bs-t{x͎4>L&m B'8YDp[D^yVꙕ[w < XΘ}f%Uz.Q6 ݇\N߯? D0 mW@P |M sRصs)A[5΀@t0H:i ̬J N)Ae0FPr$(^+MB$RD DCrCd=йfkVҺY( &&FA(,ztw/}/|s/W?+Wnl3H P SyZ(M1Hd"VNa6.Ik涿=x'~ _/Όd΅ 8Jlm*j6J:^Q(B齎 >GqlA`'A 5<V5"#kpcQe 긂JG uAnB8x\k;o|^D~з.tTOmh:E?-::1& ؼ Se )Ҧuy´Di}) (p$NZ%ֻ6ʰDhKock!ں4*.N #l}t>YbhV+tr +I HrY]ݮ<6nf,]:U1"3;T!]+^!6N(rQ ҄8u;A8&fPJa6@$B?j`HH;My9YVDu7T#*d\{ZQJjfUQHq u]ъ84@J"J F @v fJ Ei>4ɔ&H@{gm_'[~F}VQyxZ%Zc7E (AGWDDEԈIFhJ+WO筿7o?~@xpgc$1 N~it6O" vO uH'I6m/A:m"fU uyxxt^qu YwzSt8=*kiLJ-֤&07*d IDAT-xT1zӓiolV6 U=M( 㡱Idǡ:Jpe[{-t<BSW*_gigmlh6BSklu=LUjkcq0V#G@ %9c| !rdZPQ!DA">C*<3G$Mh+J+upB Aks~\#jZߕvh%`tN\. D$FvsӻepO5 /`r8cXczqAC"PG9*?ٺd~e9W, "yNm*5Ù#զvNk >Bvmu{7=OF'c|՘] &`2$YF$>=T㌝堦#%N{EY dD#5f\+j`ф?j}xaE4aYgn}H5,^\ "`p-x8SS,9C<@[Doml)N?aFB mm0&pBa5> L&2BP$ ӍdsE f-2#! bp٪$ f6zAAFҌ (>Df&a CHV ARABH@f-dlDeC"Me(ǓQƭ栳QR t[V'PqDmBېjƣqa[I]AMB`אjNRx?7~M_6G{'as_ăw6;'"vi75 ONe5iAģh4֠6ޕ'eVH\jo?޾swm'?Alk?vgBbeA\RD?/<{x E,fIbDH6Ht?z܎WZ~g(㲮ʦ7z | 1F$'Nfd*/]-bbA!/olni"BޥIx\U=`MYvcF‚2*Xc$Rdffk-)riZH 6H@Rb&0irΣRmVօH"| 8dF`HAH+@f[^!Trn'X )F3z?Ѐ:YOzBu G_h叨0JF\^BKRu9J5,pnQyING+bu){K<}ECXYc,<QQ By(=#TtX^ ?o>[t 3{3i"0 7?św@ @1_ռW̜hczDNl rKl!T |Ӊ&yaM$6FٌEFxyfs+ ,⃊5M9DPl^֦ÒpHZ!h- ,,m8qknoI))AD3g W&f"Bd  7RQ&9Yi3ˈд2*տ|e?k+7o=~nǀoyo܆ڃȱn&mXߠD!xks^6Ԥ=ʠPZ"׿y BШ?v6JFXy=YUEEۻ[N<OG'A7J0ڨ:v ‘۶}I8h]8~UGwv}ex/h5W>[ߓ׷.}gBnntꪽTݽ]D(É!Bb"jVBPnf'R׽};ן~C[7ʓi9EQ䢂Pf<j@Gӑ9<=x[yB8M;ui+;[{6IxwTwݻ.,j9;Ǽ듼FsWH*jeB kIa-@!E0"*Y PDu1l*FXԞi[( 6y'f0{hvX-GXe.Eċ_lk1f]j't C=T+x_]T7KۜBDjڷ_(犠DZT,]I,5#ExTL ,n(k ZQ>l:}b+..Y1^"@!9 \CyIDynn>|*x$`1 G@eQ -0 `Kzk/|c}{o~sFbz8$s{'?z|9>wĨYU,#n~.7Dq~cO޴f G^ʍK_ۿ;{S7}9 !>O|i=989lAkpo$K캃6J^t4lJ16Wۻ+kzj/1zqIֿFUU=\J$vRו e7?ټ'_~ӣG״UYOʦ6I>͔UuӢ,ZGU-*JM2!HABa:FQ4IB'N8wJkalpt#FZkψ} =s索o{e`غ#4~Hw(Z[su<W+`D&H:93ى?P$")VOz[\>B>N+zߣ/?w綾~/ݹsppz[+RՉ`*R!D̵lRdq?wV貮ON.mln 򪮍{HD$B"Zzk$D+KKZ*'͝a=q8᧟/,&UM"0:8'ʹyj<⣼C.Xk'aGpX`˓؈rgA69R)?rn4ژf-{?_?K84ڍ+6Nv6@2EL< CԢ!jBܪ4RPxDB:}އ(n˛dvdpFL+h(Mqhd{]&ئ]0,Tw>|^2&*q̂VMtŧHۢVJdH=a |9;A}w{c2IPNozW?ΩKo{xR={s7xq$AJV?jx+QH%@$֊W&2Zq !KW^|o~uu1&_x^۶A!1 h<Ϧwmx4y"a5FTݼ\ȳ~~7N&NNGLVg'jT/88>~[W8+tYUur Z]M# FPĚ) &H026Jkg~+DFc)͔#{ti"dj2a[b;sD1&Z]vKXϳaG<Ǖ/Xcx:5:7}t`FdE?FyB y~}0/Wes x)q48GD'5J%e!8?/y<.c$ G~awP$cO %&Ily7œg<լʲOgY67r(֨Nk"_v -ge9qsZE8eA3$sedL̀Q0 "@h"jEJ E #Ч[.qv \1O,>.jW~2uΈ HMhD(_/kc|w_S55u,tFs+!GBWHe+1 0i42E6żawBIvmKׯ_1tNlV%JbDjZYǥ;NGl4 ߻S?'n^KNHfZBhbgYYz'@rR7\M̺E'A88JZa`1b$ =Tznb PҍO|oݷ|wM'xI|k7~N_&'f6zmmyD ǣ΍OB(`*thV$#($W40Ĥ@@V>b&06G|.$!B\0k}I Bhnߗ_m}&& gr,<Ri9"F"sQ,! ZFiGh MmEЧ#,O_= C=x9Q|[=sxMj4i~ڦKǤQNQ>5Ww:7ON#C5#ajldyk7ȑ[5Jݍ~']{OtgeFY69lW_=pFdK,}p5FLKDqXfyӨ `MZ ^ b92f.ϗz(.^xfOH?2JOb<},xx|rش1"_~-2Fm\8D!u|2R͙7a4Oy(个GmŪȐ*U$&M i3 %B2IAQ;&tM `(>6hKogLȁc%PgN.$;`2}s4:&mKZ[ Eɉ. "j/ƈ`6dD!@5$ (T')"i7DLsϽWr7Iܿ~mO.yUI_Ou,[k|PsOl)-ʒ"RM4h$$6Gy H2~! `Al $lj"͞nUߴpVw*6}'\&(uX >r{pلv j @AE6`(bRGеݻ7 u\L1~/-ۆ!n… uo/:Ib8*rF .n'I¨q8/݃IҸǮ,fբlk˥ն b㜋P3f7~]:yv;{&WvM(=OC[oÑu1rEͤraBD<тx/n#=AyL\z7V 0B$!@6?WD)MyJ=?DJ_u7gWʤ~;2.2F!pR+oW7hM@RDy"@\%'ռiRIeFx'PU-QQ`cfHX%J4,ۺlb4џ|(,AQr‚Т2*"4-8PRUt@P)=aRµk?gbAl\@%c@@@v}K,px8f(DQmh;G~4_3Pf1NI $LgUdh:)=OճDW.\rmc!BrdQեZqe]"36UHOkP3MYimN6LL|P0nqB[8Uͳ$`NsmB by;I}(IUb":q8y9uud!o]sECfƷs6# &`XQ&S|Z[}+ & !·ȜU27 (S5 s B(DV{u#ǯD4p/*CzϽQ&!2zNO[_ރ8|eQDVݹ&m|*OUG-tzGɧm'#P'922,k )bPVBb`o5) poS){.Az>ļx4im8FwqUtC3J 4{_ϻ~aѥ{_ SF$e,g!s_ gYV_di(qMD [CeMrp8\,,HQ5HE)޹{=O>Ba@BLoqp[\}r閕ʿgփ~4ǽSh,M>>R&Y3 ̀Z'GfFLLZ69gFq6̊H]E1wQk-VQb{yGgן 43C5#U$R*ncp⊒Տ'5~u~ L1V~ԧ:@={y!Һy^h *9bZuD% a=t$|LUtcWB ADk| VU3Y&SBY'Syi."X0(K98*K)|YjԄdG=Xb%9l7$ˆKtٴ>ʕ]ng{^=u"ĊR<-$Z ꣣F+lZ6^iQD T m&? Mp"aҌ9jPAL#`DL$;:IB)&JxO]ň#Uڸ4GݾU9WXuyL+-Qp/Y8bRzg,An(O2ԝ[+YV>DE!>jKljrH[QtF*|@}454/ޛ#"DU)<$' gdBkH}HϣAk1gɟokK& (_^;:M}Y"͝ݣejtɼ](T%^Z@.d>/R⥗_y͛eUOL^m/Vzk7p"[>ֹ\qw[KϠ3-i?ׅH<=Nb/H\ȢBstn?V V_҃ m8I=q}@9n9/1ZcG*ruQDJ0zPdPI.۪j]mbTk"ϱ0$)]`@$DY.t曺U6I2*¥k[{$'/O\16&U.lt{EBJyTp5mi&:DaQ۬{L@\4-6Gl5 DT ""Z&rcCܺsvb4NtG2"I˵2 &QTj^!("l,bfc3]N@&H:"{vT6%5)>F}jTfs! 0*GBJnV:=x&J+eX]?d(UZiZ+EVcd(c,E41F2`A5q ĘtY;z,$HĀx"ā)>dMȎJ vA$f" '~C cij8+Squ|lfkQt߳9?&\xY8}>G3|~)+Ro@1<יׯΧ;ߗ2ơ|}=-xbYEFYzk7f>"5Uvx|<لvoww2C,c(1l'e9աc^yY/18MRq%TM1&&c-˦$6֞]ijcSy9P2LGhCr 64O\kEYDcGZCfM7U޵eb눦j=Glm &wLuq^ l~C]-C NUSRzY~'q!&QURjŹȁ4+ߢi"&ARU~ű%Fa)V bQ$΅F+Lz HDpakkFv\ΰD&\G\S7ϣFN`9@x5+N4I{ډw[#QV4T&p?T0W-LIgzYE,FK`Y9dm[uHۧFjT4 Qrˉm * Et nҿy||'L)m.]{fg|y[;E hб,%Aaw47v/ 0}fRQd9"Gg"%63w0bi-#)k-=}McL30F%J"pD{hxYrlw:~ޠSO^9NVA|vq !Dmze[kn/KE^UMIFXQ'LFDml*Od HP5䪳[@w;[/__+ mrlbk[g?U\޼lἽ #0BRD#-bsW-ki<{HeJH/ԍzPi*6>P fu-\&+oR.:9p,5KFAT[Ғ rC8_΍JC`aVM- վfB!h&cy낀Cl(!rIN)%L"V'Ji'^8+8Y4᨟G[ p-F1AM=S-Ɛ-LC!jWo< H_ #Eo0O}~n'ɃQt왽L}'|"ȫHȸ nk]}[?a^z>~VlO\UE-k;20||Hu$6hYt[RBhk,dr1*i=`].^٬{s~3ޅ[Qʦ;\QD ?hevny耴KR;W!UNG64?u1V\z,X ("YentcYՅjmQi*2HٍXWH@1Bm6ZS(!H;"3㙫nӲ6YNeX$ M|6(4 adViMvsS#Q)H[zN q3jV4*]Fj(ӨRFB $,F. HhrR&i}߹xq(ɪ6ď~飃],k7v4u-Yw6mQJL2(6R] K x}OƬ_,;w_'>Go~6jYvc?o~5$mx[x=kP6z~+O=6^10zuit…NJb {8]̄P)tj]],s4r?H)XᘯH IDATQ6BɌmfc8E!jhHzm/mn3aYb a,?#` L`9'HEB TպWo( +[=PJ d01(,^‘2["HIbwF(v{ܸpr0m.rQ5KNؔ:(1i1vA:,=O*Y& L D%P7P6×`ig AoicDWY!2Yg TR,2$Z AsBI{ 7sz[ve,Ѡ6WĂvW~>yгg ~0)j b.nb`͔6i!#trd 91GF/W?ӟO"8ΎBmy+ u'%D(*"ȱn)\c%J^Ƕc 9t孝ʅ*p✯=bymh\{Au(uղH!tVj1^K|g1KMU>JN1/IHd Av&GS?I,X̵m]:r@jEY^$J/  t %)ORckg[[ۑ`- M ,ii+^mB- Rt{@( hc3Rj!CIib^c2#(T{iMָ=T"<ɨ?g(j~0h)"5-7[PHyPφO |눹ļ@\1"$z뭞N B3ρ1Hh@Qy9휹u2F!G >.'Za"iIaV/4M:DBU]G$ՋE BQ0ֵ(iԴm{us<jY)&Lt\.KT*IC 1'EVn 릱yMh^-gU%jTE' A61Q>H5ȍ2V*I!5j-%j$zvK*)V` bxveZw}deDD"Qvȇ~r| !>jg-]tOC5DӚ-@d-9eBqN>fL[Lvս*6aԊщ aUdLS1 ".l$\v6טafadZ6-l9[TKmGn#W·1B6 wXMP @)L..nnt5 + [L'@Hh ,E"D,]lZuc9 9A,+X˭,>5&I4F.Y7:Ag %N+QkNVDbirb2-Y:ʄ NjP!qH O FB+}_QPV5A}<8 jeKj2%%I6663RE&e=_֎ìe_v{F1Llzvv@z[>9ǻD2i':pk:J@1'ѝ͸ۺCoLn@['[Ib+;i^a˚ _r^G>IY埞VVGkŵ|o"ᙇZV亮OޏeY ,•(rn~+2;Rbu*WBrB²%FF"`-W F#"2uun0"A֞8u!YӰ{Z"X\`ߟj؊4 ,Ҝ6!H) (e"UE}Iygb !B`HYnbyHYM!lJRT !*'ӸXXNg_2ąqD̒^gǎ _knMSRtk_,ĘGj(cj@m{Py!ҝSbiX(d2UZ2V6t0 )mmz$Gt{{|p'꽡\v$T#9UulrgexVϚurmbr t6E V1Ƙd6Q"ȑXtR.bhk|) Prz\ͭž f@LT21Jei9j,,칗ʶt~dfooMQeuYn^j;`9B4REfn04iBeϾqΘl6G' IQiyĈ!9 lIu{Yw7;w_G5RV'&(PmWZ[E[6)K V~GA~+!"x(/&t={Cv>~J;mÉJ'WJN>@D 3^֯|Y]C\x񕎌q5#"Z}~#/11xģ-`dV:wø?~}fDwR|t֫%p꺮+ ‰_{-iy1"(2ɲ+qhS[V$Ҋ ?,?[v3ogR%T@VG^ qr)$ )j1[&]Pk(W)(4~Aα 1dq{W Y\D|T " $ʻ_~'i<LBJ/Di6<Upeh8UpͨY>U J aQ}i%&-_,:ZLwʛCK%Km-!l04CA D<Ci:n7ᶰdKTRI5ge;{ofeI#^*֭{ko`X;/$&dl GeIu()*0rUtf&}ѽ7>c@-tvp9o./NT?ٲ.їcWI7>0qgʛ};/ޑ4EKo4a}@]zBfəwjkS$"d r ۔ H{0umꚘPY/4v/xsud V< l t.] mxt)dPsHd6[ cƔq޹^y7kb{Ɂxv\l$ wvjgR V%Mg'IӠpأJN\&*TxE=ЮEs/۹06m F_m-R)7g:D@sv-NfE4ǜ9YϕdX`+_f)>[pEk_{]WuSLIFYG\ /dBg=p<)IHhOXv~ 6E?} %|ѶOgb/PU|i:\ҩ.mUiк)!R(c+~nà\n ףKi&h}m$"*j,xNY:u}mHJwj4m  w IROY_#PJ8 f(HC=Wvr&v' N*'1[ώ2Hy1W(\e:]5, *fװ8 ?{g< A u(Q*'H:*5RnjHۿ7o˟˧g*_ UE!q!^ބJ]r4-f( KE3V5;ʡr!S9D Q}1q M5{/mnw73k!*JEK2*2,'C W=WvQՑ+o\2goIiWͪm/ ٔlќx%sj Cx2}o# bЌh$% k 1t+?)lvn?]zAW3?wWTO|bU%Ah{O1- /W:xeϠ8E<.IG&12)6qu26쎇}EYЬl75 ([2 ˴.ʦLո0|sgk_Vɶ[\Q:S9J*!HCɟE=sB'͊Eݺ3NnDW$aЬ* K峲J;ݻ]uhqpuy'(&n6S< ~+e _7~'?sKfG\ObP,Gp'o邜b& 5T|VE7'IMXz2 C0]D&a p4G*AIUUr,2(@P007+kRa`lэw޻6].\3yH39f[߽IƮy<ۚxrn'5$5Y!g%F9;CLw9;hKA}OďMb<.os"W s'gl~|~~|v~7)jW ]I *.<9/ @A d@4L QfPYbȂ4:E+U uw~Cߝʺ}+x1꨺6sS@R@hE{0`'15whq-xvL F)tI5$iBbv DCL UiFbGppmcx hX HRx>?o}7.zRNƈ"'w/*|dsH) $A_ nل(J[F]x[ŜUpXAE)vm Horpd!l:8Z|5_(-D/m^p KΪBM2T^oA>}E )ġ=qȩ}.3b~Sȟ>XmB^W+ A.+L 0b _4 /㇍.#X~O`sKKJQ$!Q(*mXo yѬzHz4:?sJzՌ_WdYxKH`~Fi*>oHQ4,d`>U1ƻx0ɾw.f}GXLna`XsL"!HS0u 7̭- @(VXԤ@CӪ eҾk@Qow J+QaDH`(H "!0C;Cg ٝb7[U90~8XVdԅ8_1)@E`sbDhZc!].m }OD3&@[mYAUc:=jj@4ުtS k ݣ1v'^/7 y2{}rlNu1:ut̎S"3v4zOSH)HL,0q  E ۇ&,A2ƿs"[L@"ɝtǧ˛w19Vs0Eq<ŠmcbZ5)鬲Y IDAT_ dA7\6eau{ÑeC<w!./Ar=(fF?,=x[nx닷6 3d5XDkjE|hDmߵ]?W)]31p (@UYc !5ƈ7p0V5e ڇCt~Z{֒0ig_{Xtݜ@Oҟ~3kp"FC r[7 We!Ѧ]6T]+)+p>FQ~ZD:Aq=a5T "J}docyr(Yْ"A9JJ`Z%QY;0W}S~0(N$ ^3~TSi8< C}}-qeP/Wݘ AFB'#l΀d3ȩX Ch$Ѱy8=M L$BU\[s9Zr‡X/t~&]u&(~, |~cܚt]x_9xpBCXH˫8~g_EFaBfPL 9ChLF0!°C,{`$C6p6&KPfT %F%U RB 1(Xa Vb!،*:/MK}Uq.gSU=#HI rH[PdkZkdMΙ $dj"dC6\'`2IwƆ6ww@B_~Vh)$6Wu{ܝ~W_{bv1ttvgT<ҪQ]؜:dҜ̰@gTʪeBeH *CV}QTiDr ogn{_~ݯ/0 KHYAxq޾ۮbe+kURVRX;txg!3J%Å .&8anUL*eb.[o5a LEE -bp>;qb>.4m_ 'XVEY9kzrfNWc cb 1)(o|˽*RpL v!`wߴ7/MtSr${YsePTmWB }JDDd]O(YDOgPyfGܘhrVlIX!l<=P&}6 /4|kq@A ap~I #c1>Kq޶BI83-MQb5Il古^(% nS$2)AwE,  Ag^l7nq Y.R&H0g1+eMQ;.;r[EDET34Oqv~nU&3eleaS>嗏/R\eu'z '_ IQ3 P4*a<@ 'k Totg 8;2[β8]!Cwc?#&키KooǾד)!rhHE(Ķ#CR&`LINҟe4!ɭrqzB<=Gwj[tWeoߜܽ؎K/,F#7bIc3lհD@L+0uU2j"D)CâE/h  'ZO>0YCc7w?}~G #ERm&3wwuGÃn}s亶@9A )!]}V/\Qޒ TJr8e/cŐY W_%ā1xu4ޚ9|c<GsEy8)U]KWХƓAkcX4f"s-LYdI7oJA2Fr 0_\Bc_9fJ|)46Lao1mʟBHS ʯ[=zqX ? ŵ ~S~Ϧ}k7 jH1(_~y5խ$|iHhl͐ dP}9ͺe5{!Jhɉ}BiAWpfY PC&B5;6Lq#W2W퓒l8̼V R+^zuFq͡h7[Ity?~hxEڠV У x&JKywuUdsw+MV*RԘ%ِY$rh +k((AbFg$b 6f9]ԓ:۾*e^5Em{SUƘ#+l܎n"@$hctI3ĔD'!݃>U'n_̥ vX"2Ҩp1j*S$MEr3I <j Ar "ԭz2 }:bW]6&퍱YW:_؝-,!M9pnQ %1,cU)GL bМuBR X"&F b̈ @+m۩nb xG'-K5*/F j!h__K6hVoן^Űǘܨmd * !( Ψll #"TL*YB/zIne1g@e[GC% (!J !bR6Vy|ctpCj4p272V+ģZɂ1欩+d"Vcdˋlc1g0b(4]W]hrVӮ)Q@7W/گ}f~ȥ*o- O/zhBZzC 鑔ETĀ}eM+m*͞ݿ8 m2uo^ üdYϿ淾$%Ȗ2n=i6 Bk{>> f @I3ddQR",&9  R YQQQ%Df6}T][dr / s{f!陀eEƨc!@i͐&T?ʔi=j.XSG1]ҏx7+["$VU_<)!?$\'X<ԓWT~@ZR"wv$UFl勌FC$tz:_.vg4J).VpO$DŮ*zޭLTUYZ4>ӷ *#92Dĵx  օX u-KY5[pPBj+\Et/CS'ƨЪW^{qi=k@ \T8%$@L ؃W1aWڍ5-jb¢%370*jݙd j ]}d$b g,ʨܬR=I9ae KA|:*y3 |}RXcݗOb"Y魗w3FDYL i H)kHUԤc }2р=v;)DI&7'o[k@?b9 kfr0λC~nRYVA85Aӵ(Yem bd}=k aΝۜ]MӽqM`K;47~D~hP쌫e/vwgtz| *5 B}s`kɵIbN)IH D ]^12`%fI" //B?YFM&ddPCv{GSh{O( k.3aYnK9.!jX@`ƱOF 1ĔqѰ vOނn^o_mnǶ l\_0* f$0ʟoyqoLvgeF`t;m=2MAΨD Id.Eg3IxWOz8W5~Ć?/M JߡkS;Fqձ4i t1k(" !nHA@DmUWXuTK\;\bBc(IJp!>1+2Y*h1e]tgwR8?;_;:x&ZCT hdPQ,J=fdّf2;yFpB$kdTTtNTo4:jqPibAL$PNS/$) gq&*`rL]З)ww]-*m(읫_\,}Ydd$#%0QV$AFH=̗2]c'9%AשJ flw&wCTIs _?W&ǗgіCk32=xQYQ0i1rjb׆tkw7+k_..y~n]bvoGQ۝G EǓؔGJ皶a" kvvVl )*e5 }ʙrH9T C|qfDrڂDl7.}Cx-̈f]9mrK_&|3KGOGE-9D3{?j&;{ >Dy{yk$BoBZfFWq=)˽=[vT/j"'vbCXMWAs 0ͧ_SȐb1aĜCf0|]C,-92w}e:[L.Fo=o~ư ðe%5 "<{(2fL ,}6[9Q*q6G 1yg ēAD~_t}AhЫZz@<f4F#,jԜSh. Tbt A %iQTbB@@B $]LM Ҭk}hbQ OrܫUP" =#@%`9AAumGo(sۡ$!AHȅ3  =\@,9CԈ*iLhRUCB[t.|ed]Gg3, 7==-f h6b y||S ]ƲVWrQ(1@$R-$"YCڟ7uDGkTBo>A;D?J_: Za,&u-Y »Gg3\7n [UX*\oNG`&"bh흝EU79=2 J$"ƀ`.,Gd(Ã:>ge@ BD<?~;M/cJٮ׷C>]ƮMӇ SWi'ɧo`Ok nk+ o@lWr?aLj?hV}DשmVEwifn1E[ (,C eʚBk.FH Pt҇b"4$"@1D$ 0,sq LNSm]\ĸH*"!f.0G=9۶G R ^I=j!$s]>uھDŽb>AUE \Z0%=S?@_;_|a}6r]6-{ͭ>E+1'JYs#eNZ &a[iG"6=$UDDNNSK*KeɑP )t з99]-aUy$wv6hJAOT)8EX7&NdHHD RAՀ,HxԜ{tvNZ9PaM8׶jh ][f+ +6LWi u4f PrIsMߴ!G'f4 w~΍g~I`'yĴ<9?wNFtNRγ9uC$,!{3FCFM1樱-qQNL_Sqm IDAT{m!\ gᚳojU2ʪrLI]dNg1uZUF@4Tϸʗ}];X.} u ͪb#9mq*EE֑29wߚHJ #00"V5p]Z9n;×,5᠜d~5_S`+= u',>,?%_L|ش“Z^U c?F,xtZ((擮PPLL"rԄuA\'rXv,j (}J,g}e *^61 *&',c|=Q5&1^{.AT FPX E yTIPiCB V^qqG'DH!3Fb-2S5p}U§%|ⱏ:'^?8i\.TNw]h[ Y=Y^v"؞(eX4iޤLTs Ͳl.@0 YI@2yEYX`b`خbl#k0D 1}׵IeYc~Ŗ۟(p  XFbb7.Bk_좹s{T,%) AQ0W*d';D6HbmG@IgB.*es7ľ1)ZݢA᣻gQl(7hsp!p?/|IDzy`rQ_WΧ[7|6@ W%dق1f4Nf nޤ*b'aʐ|Yg8ukK~[daINO#еuC6`dr3xO4n[=|yo~Ak/{C'u~rL רs@xŰb vygp#Q+.=]s17vc,+ۦ BV&v H֬ LSlS`! ZS GnHkw rLϦ$Ipmmf(hjWg8/3q5DIƜO\d6elWw?_6zG;c@ }mn?KRPw]s8D_EAd}Yfbzt>[2_,c6]Nf'%eI2Mg&i\hJX,`"_,ehwMH1ΉAS ssXTUNn/E6];{[**BDhA[I-¥HK@5.w~~EkM ՜tyO]֐;FUF2<C"il-9B&HgKM,A),9A7k,˲;|1fFfeU]]=Z- I -  @O`!^hdB h 3.Uꚲ̌9ek"k_=?w>|+o2&r &_Jbqx A]մ`%a"4:٘ئOo7އZ\}?_'RU!w~csuzf,˳۷<_^Q:뜋(u] 7'1'} oYT>h4:r[V]9ζ1 j,LH\DiYYY9߽7ј T M ¼Mo\,66!)䥮4zE[?kN gKL/ jiOZ^|!вE{ͫ#nKP+[_z1m\6$ڻne] Qp]:2~$^@ ٪xoͅ3p7ݮJ<*B-~{$^6y3[Ͽޗ.CjޢJ" KG\z{h-E8b??0oE)^zZ׸ V(I73X4EI~Xg JAK5AeysD-⛑&sܾ|W{EflFsIˁ|uQ,a75ONB,iwcgn ^:=neVe:W&;oK^/Vo%Љϝe b1ݗ(8goNYz룷`Um䭏[^6pI\ \]JwWxu«R,<4vi Jn%v52|"*Utʽ4W`K/?H^#~֓.\k-ޱZ=W,hRýA^wQ=lTG4JFqMm<3ý>+UCcw bsn·7t*%QJÄ J)nj҅haN誩 bEeI@[Y^V`m3+mX5׽P_ !N/B[u <;l{7)]xggykmHƘlkpG*Kv7-2Ɣ޺}ΦL"YngF9HYD3mfMkg\ `XUe ιkωHe3ֶ>JˌQ @ֆpZO|ϿVsMs2 9'd!2*HR0)oA 1$j]te pxBqb EZx:el+0y 6(>(O` daapuRea cpL:'}WwMIf*+w]m;kq~r}BzFcRB`n 1(v\yezƐ_/d/—ߕ}/ZOQRkRJD`6Ѩ)~;[vy5 qQYX`.}s;uUYu*QHPil{>TBw\61p^Zh :Nz}" Jd2yJ &X4aR /_E'%+1#[u.8'(vJ~}b^jBi \*5mK9ɰQ Jo_~$yѕKeĴa6PVgkX&hm+7 7F\o֠RV{Vl1^#^σmAP~ҷnW\DIm.>n^;Yk`~fG|:&V=.%]/Ph#((P=6іv6]e4VLHeZc*Ρ z|Ku?Ƿ\gvN:]6M ĴL(dayו U Žt;hwdh] +:, A4'0X]\>z%.o>Џx{륣|$˗#-$%Yf>V5}6Ĕ~d'hȲλ:t]N &܀>6%;ؘdpb{ۉt1QIcT0e18Ѕ:rJ^GGÃB&MS@H sBF_48Hb"" /$^Y[¢] EǤkrb2?;Y1&ҺȌBATHmHmԠ%4'㺯sv^,ܸ50t^)7.']5q4Mi|jYiyL92j;.ެ>rYY**$^w~JײcW6I"2AH4hTe),vd0Q~3Mn;G%ȃJR)hEU YhGRm.n5?=ԁ|p$F{EyT=ד"NY]RcRgF\ѲX`ѐ" Bjpr#> ^ Wpo[ojs;i&rҎd3D,FIN@V֑&a?Ŷ?Q`w]zTUcR^ IsL$ptAⓎp~QtLdF#r\%\#6.ZTMF tQʹR)~xtVѾOޟԍĘ;*5pmg:nw||= .k{ ﰋv֖;Ֆoq펺FW/}2=dia+XJXsspTkۼk a'*75i ¯V3\ۄe4f nvT/WG:q+ƛ JB܈T3Scnmy 9'1~yUTXSJQ2qWb)"/ިzebӲPp"{p-._/SL f|(zyG'l> 1_dnx"*lZM n4omjw{Ws?oCj8T4c"kcnZwov:歵37.q,3-v RJ瓳`0J29utN#R0}u6t2U?=zr>*dyr4)/l<8"DBQ fcn0mtVI8SŸ:b7ZMOi=WJy7HRȒ"owutV7*fM9",QTPA{q0yӆvimkA" ,;?}7? w_o}~ {YUo=x2:?yNGkk~oه< m_pDvIޠB"3άs| >B 7Ϋiu!dvJN[z㪨R//`apWO;tvas1Ry幚w5 ֢HC1WtͲlZ׮sQI[UJY&6M4ZLEY y8 Znn(څ 6H1?';5C~}[3j6i*36'C[OV.m}UeEmy\Qʺ;=Y-8\:O*{O?ۦ_)a`3fUgn(JЖǶ虛74c$ >u)H|٦Nl"sa/I<<>i]1ăba {~z&W bQkTh<Rap IQ`?c\=zd2ooQrcBzKl"!&Tyw6&@Ǐ뮹wI$yS!٬qѺ/ ǣ7oa(v6Ŕh]9k-7?|:k}:@u><=-so)7mhvG,@7Oow8qRo|v<?~84o}o?7)-,h!l['DU9p?5^/ST:yN)ΟZeSnV;3o !N[Xg ZbG,dlb޹qœ~Bf<<`OUjg/9$f<;DLSBN^vܒ,:F\@xPgw`~g8w>VqV/ Ɣ%)s IDATAj |z;Ybve4$?vq$o\6 ixmsҿ-p[6%pAN[=V0 nrN7b:S\xή6.o%]pmlygYt 1"h01^LS*+2 EE^@htH2 P"0BJQJ <$ .pf9=r£,veǵ, ! ncT ~iK˜O.I_]=JW8a=d9I3GAdlAihg5lFfT%l:3u6wM؍Be!B}6YMy6n:F 8smL1*S=Uh "R%. DN!<ݼv|rtv63ZS"윍kj 3ټ{MmOʘi7m]7aS9N|:EϦݬݼrx1@4eVw)%NpVwɰ(QϚ*9{7d2OmpE18;`=ȫ3oλ{ I z|>{0oTeJ" Zmvqg^3_Nе5{)/DkenΦߛ=zܭ6B((Hիe hqi-cZUyŕf' Ec8:L'>zD@DeM ck(3Ѡ(3E0qD^qd\6SDKUj6.ϊmll`T/tMpCYBb`$_x#+/RҸXWEKaZY-Hۨ .ӎrb6f2s`,dg (>-W0ܪ-WpZri;,"dYgܾ+g-Fxdv;mvį+u0v.)*KlY5#%jx1Zԓ0# "r~Aܕ|2S>NT {X. K i~V]\$ALK=DV &1޹f]e)1ɲ49E{%cJ)D`욐X泋j^wd6u6 hc Xκm){ EyRهg7neFۺmݤ =MׅSU6N׮ߖ<&bRv4>FLQk8xy=]z.ZFVWɗnQ$OLR M;oƻ$cNQR`LJHQպѨ|PDy3i%*J,8RUVarE!&֮~K ws= ?(GP5vt o$Yz\ǗHkQ!A^2ׄ@w$ 魷s6F>f:kbx2' ]V._ /vJ#02=0b/mj~$(PԉSVh@ah 2SDHLlSF'aP($:ӃF+DYݹmˌEl[,Rj\7.z,:)1X׎PN>oSJ_S.~{E2S=% M\n|ΒX̥\mؘ"㶫@K.L_ҍ(Uς>eQy#|[J<|Y>@xWϓsf|6{Ap Qsv]/~UZ)"H4 i=kULnCdze5@JHJ"@FJog^IAj&!^UpFo5myQDk(z&Rgi{wvbĞaGJ "|!ǓY$Whsl}&9 , 4#եJecUkQ`HBJ/=)(QHFyf 0Rì/켹?:OuA~=UQPk>k1);M_~[̭.s޻0nƥ.gթ1Wd")e?<>Q3ѓ'w7ދ2)yΔ!x]Ln a?WEV$aͪ`ԦD Zn$)YzX:HOzr𤪪~gLug`1o&o;*ϟ|;Խbժg°MK,HBg"L)ZZk Z3KHkҸrCp<*eH6$vն2Vm/h$Q|t.eh߫ [d1fc0f?u]uGu7jЌLLf5 Na?/^X̠)\S$Jy1j켗=4D3w~pˑ: _~bjo!hVG*܊Ild*5'+1x-OP4OcFy9vlVbc|*.(DQ'?8k {Rzo ŋb$Y|76dDgE saaƈ0V"? D q= s̯ZXڎ#zeIqZF..LCC;l=\d{MmX`vj8)ˌtQPy(UbӺV ߐ]樽GoykIKv'@i2ϕMDBT Y{xESo=ee}ud$Yܲ15DA^}/M`\nƅd Yk88y|tti|56m>J#mˬg\% ]ľystsHQif."76o\F%)3_ ŪE%rkoWZ6Lq TJ>WZe_ԗO |Z5}(KլwOy0\o$ T@D*yjf|xF)̲O1ওr+?RԼVSlZx[ST$)#SF! e\VN䮐I@9<'|)þTc><cCJ>6PRhPC.1ZQ!T/+ڨvB XUs/)C: F%Ѭ5ֆb6սiSUlڽ᠍lc0Jpcۧ Nnֺ|6IJi񓹛E\hF ѣquYb`YgUԸ/K!l6:d:O/]A6t:3!x)0%_tͷO?٣:siuɧ]:i<ƠD1`Q!>(UtB8:Ҍ9)k}q>}1'|t< 4!, "L8J q<ܻןN*`l]k//Vzi1H"I-յ~?۶qibdk8giUZF~`m4"mQ|"˨T+]. f]G<ufh&4vM;4ORdZ2)qtڅhNR@2wB9^*5 -!&C*]qgpxd80#s{gbunh-=}Um¥vU^j9ɍ/ۧ[ʦ}w)Z %ZLܲK)O`'kC|[{ pʝ6~7ֽuDީqt{`( $ VDFxfӥ 8.1H<0֟{_ۃ_/ )E``˓pq ",BZkf*GS~??.蕽3.Np/MʫY;o-;ԅ(" D fF-T* 9%B)L1%SYJhmnB{6'Ms[qWv?i!}:yz_൨ UDmj[m5d:{0<f2~܎1>?z]pG&˴QjTֵy==&at<Wܶ>mNm &%k;n:|N4:cdMv/~GO/b\=9?gcK ١pBDԝk2cΣ54úkz^9y'Ju: wNBD@H+eSBƍ_Tu#˼]# ȳ͈ϴ{m)%,LH`@vz:}/> u:!poo5?1\G^<`!3-umsvLjD6E\7U[ 0iL~ǃ!I R&@@4}wKٺ]H׀o2*90K H&WœGՍEgat7G4MKȍ;~u oBK;eFZu%oݏIW=[]^̜C<.\"{_T[ :~M@%lقځvv-<فjM]W T {d3I)xGZ.8"kceεE,X1!)?­ިv_zW5@g3&7޷.Hl?gIH+!nd.\Hp ?!˩_},ij{488~s)J!e%v@ '0xk Lr%PRVdyZ܋~'Hmn44 W60yb,0LdPuu QԳp|ż]; 6㺶RHb#~]|G㧦52f!Y[l2k۝*'ᇏyIH13V~:Z8$kj.pXzK}{|~=r)6m5CG(9dY*I<.M fizY4d]aQjPf} 2?ܓQӂjTk{"ZA"O ;_~/Ͻy#?~4@  ,Lğ }R AtyU)p`xxdǃ~>%FW PA3I +FwpeޱGi"1fA4O5ͣI"Hz:^8NO>x*\NYԟdM 0eҌQc;jEHV_<eQ\<4F^O K܄N[׾IV|$eFZYr%2dvHy/E^>Lˇ־ѯH 4ڥ+|K/AT#w +_`.{/[`^Y5MJ L]5l/& Xa_YeJY64+eoݲowgiӻgy?Ο+|x'׮_RG<ƥ.>DĔY? R H~6RatL4D!6x2ݻie!+ޥ{DdHEf]΍%Yʞ0pBIrcz{d2*8U\7(}8m%73[|`U+f]etSe&&8νn܆Y[!αƉm;o\Q棦  B f2늬 1h41d6x!0 P.si\͉HXzJ)Eы1t]sHH/z&C!$lH:nmB1DmuueƨL9c)XMmB&/A]÷ojnZե67޾?*@ᔄ_o_k?O'7׿xw?ukWvk%-[wam'H%&{de)%f&RdFDC:ۦw~;k&,=yt\Ҙb6$ 1ɩ #ss2f{ytRO(NC암xPdx>C榳 ($={O[NG]vaP+.%ps 1  FAAR =~L",1BBzM=+yg⾍>mBY I}R~3.W yYpQ+Z #>4K}:&\> Xdiۡ>$ 1l^5 R W@@>%6RWZ@_ae19?dZҊV߮'ߕ'&`??՜J7GŠ͠_v|Zh4{v M.TDt2}bttʐITױ뺐(AJV(3\L EID* p EY*qil FMv.Lu SSW~6,0tQ!={дm/hS:&R9+ q<+"ҘHq6;Nj۴Y$%''pk9/)(ґTqGV`3 VDg!H!A:W><}k7)Ͽsp3ֿ7z=7Jn7hQpE 1 k߫^1@1xYFb@@D5=ޯ`F 1'6JT$;yp2$+ BxaülS".0 >FkjKXp t/YuV3Ū:= k4QHiQ6=[I("g"b^TxmN{O~z:{}kl%W^!cY&{X6L_ebVEQ]^?B,sJqJfq)$$F^KoOg|B%ӟ%dL/lۂ`.6+ :C=~ $2jV^f|,^fޫr?w@G)ғCs^˳!%D*'RغV"ʢ8 )um{"GC)0HHbFڦvV<%ɣ(Z몫Hc_ERiM",O lOjIT^u]&2du{&U݅)Uã)1GJMZXc IDAT} ,Fui<ΧK0# LYN'6z4Lk"8΍1?x 68V@2T쓖sƑL=W0y%JKQsJ@i: ܸstgnWO}S4Ko ٣"}C=xơ~ʹ:}3n,0TwC)7MLi.)w/QzP;E~)HbZľN}c̼؎1oɒAZ6/E3 Ƀ=p AX`{^ɒ,M3zDUU-F`$z3 ̎qP̆ AdlZLwUWUfO9\\EȌ2#<_ivw>׼\u-yW-zN*0~&tJpI u뉭$(USm۞"8>trs S[):~]c>j}ԞK>|?-}P&E' Lb=,lkF.hN[o.}-ݎ<Q_v]D6g%6]Ƌ1hHixJzducn#4î`=c3Țz74H0fT1{ 騘FO>s<]ogz1 8c̀M9M=:ѣq=;KYUC> a.F25Bh۶+LLeׅ}Nk&9ԳQYDi3hEQv]TAG],殍9;rz6SpEԤM 1IZ5m94" W12b:v$T"_4ZT9; ee(eU<_55s*Y]L@_^l(&QŪn0MM%Z,X655rK)Elu8WMۘ:ŲVdzP2»Y $d`61RኺkѹQQQ[爊h'fɇlbDVw+]W#gO&Q^b\]T&|06;~arޙjϕVe]@eQ{Qm: /`" }&|ؚO~]AQO>A3hKX͵Y`Fț mX<bz*Y}ԧcɍ |Vg* Mg W7ueQ9%3_mE/!{Ӗ΀LSdoā dGޯzY֡ȆP7T_%=w@&Oe AoC*Wq=;\j{1 |;e"M uT1#@>{ov٥S󬍛պ}n Du,T~*8[6z`q}a{*]Yd:flƛOqw8#R7ò,rIPSI_.&(iu#)}rri.`2C9"C_qRy<B>oϻzzay+}Nw{(&n6lkc`dd^,ٽFLUY!97?>m ޑu"h 9JzWnXXXlx|qQlC_]. D&bY~nm*$2MFӫgdbh]ֲ(6i `Ct|tI=*Ai^ҋ $kV4S\_F3DSe-Bh6 GepλPĖQIֵmѡ:mDME `6Pb̓CΝU~v~?SnT"'6Uq.*fuMhE Y(b_OzU+#IZok p}ŧ^w@jFqFQ+}/I~1/_~5ghu\%(B~Fz| E۷/ǐ/dgTn7'j\cg2يҡjANB45D Vh׶|J@!* #+Xx J0%fZƯZ5 Ruh4;z{J M^E]ډAD;SM8}\k(뽘7a[wrNvBB Rq҆#;̝?}ow=9{P<.S?qr4DKλNә?{86ǟO\6RfYߚޙ2lYs+wOU)铧Wazt|ZE3o}Uױ ;nA}X'! _̸ 0ٿч*EaB}Imt*h| _Qτ\4!ٸVc'h /UXVIQZmS:զ]o!D6]=;*XpUrٮ2x0Ȳ#r2CD tmzs^vڶu]6 Fc*|qx}lBHm6Y7}VIsgVDL#Ĝ69pBp:(*YRj"YB$hft F6TXk`ӻܺn-ʼb\7c\B4-$[=Iquo@:>̈2'?,x_MޮbgXø`냆fmL'lrg|{r/>rj2\9N£O!\5UߋoÒnKmc@4̠{oEtzX[m L-0;-я?\} 3شj}n VU(4}dPs= >0$>W_Ն'>&T薥$`葺ȭVGF*v zwD@6{A1*Em+"&rDhZMsF`ŃjDi%HF0 CB[~K)ww75*9InW_odvZ[>Rud>UeƳ{0yO|Y}n4j_ YnVkIfU[:Krx4@'j: 1< ZP(d*m V}|ui:4 ugwx&aC>;O%%k/|nF 68"JB 5mus 12d$qGEH3:BLYf5殬*919QMYժK2r^MDrD-0\V!)ۓ˫WmԵj f&wؤnW]n[UX]ۉuI63fR$"*ٲBYrV#`P F 10s FdJM:05*`>Fɀ7-P%P]|jgd-ȟ?m{itmVeҶ$6v}>yhSn{-g8v`'qgly@DD#߶'JJrdb.ʊ %V&6y{ܐV@O!2$@~54VMmNj_LAo_#lʾNwקV4.ģ cͲL_Z:!< Ý/%VVc[kI#Z;CTT1{%gEn;@D:p'aDp2}v$qmm ,WA1}Gap7W! oIT~s>~[Nkýe :!!#d6)VK\]wg>RILYw8>="5mlt"J)UΗR36bH`bү%ĔXTtU׫]\򋟬~7!QʊL EE,sj3ECw؞2v9+ƭ7!Nَ- Q$MCJͪu#wܴks(()I,gsl9w9%m]1bA"Rѕl&ӑ!-jD"Džh']ZwwQMdן^=}|ld(vr !v(c9XJ9"NM L҅ȀHU1X GI `9f451w)gɀ e]=@X.cׇ WtMwO+ﻍxR.uӴԱ _DŦܹ?/rS㮟Fh{-M1]b} 5kc)I-+xLWst@hN۲lkCF幹M&i\h#QwU0ޒ=~yC#& ( !F%jd4肶1i2P齮(!/>+Ŵ$ !(5Eڔ;yKHk%NSnm!wKHULM2I" նB޲=}ug{*; k5;.&~^e imyb{7G/@·):ܖ} /P+nMVܭ><6~71uuql]gcf*/8[R tDNug2Wj5#c .6ϖ닦sti\>ytebQ4*x"O$j sMsB aGvz/%~ 3>ܽ=M61PTp<SD2j;sgTeIŇO]ueVTԁC01LdnTU Y4QbLHHQT$xxD@&fHj9*13`j!lƅQ{91,IT0Xr%˂ n7Mۮ/>hFB(i6j="x84E4~H]㧨aTB?5ݠ!Cݖb4b:vs| da74goC$$ݑ $,Rq6.3k./@doG4f44=BHu0DBC%Od|T_͊gg2=b6~\*U@}Yԋ^\z,pƁ(4eCzԇʹ&$н ǩ&Dlcv`o EGl /BⅢ>'mk8_uJ"1ɪN;<ӫE imERVO3vqA nH$j9fۚٵIau+RbAu]>rwWmQ01m&I'||aV!dz=MZZ jlA??UNe(|tҶ*V˺FHf5,l]ơ"?ŇO==_e( dkDD$81N@,YrR D(("# L ؘ @`}C9*nMK/\`RV s@1*`uD7:-ϗU̝$`2 c0M9EAٱqޑ0Ru<}GO Gtt߿(1|__UG#&19|?fh4nrYgmJr׶%-A['Ià@ ݺfώ6>9{-kl_ؘAsK_pwږs17;nfe{[~ϽiB#eH $;)-?zR__*Y/D䜲dEþ?}gT]GmڐF>}n/-j6fy#U.gJ̗EQћ@ֲxfFWKLxٝ O7z@ . IDATWܮi (&Ӣ/=>/[YZG-}{1 `l$jDޯOWOUA)*(KVڮզqv#FU jZ,1&ʒ GMu,s%dH\ Qߟ\<[,(ē c-4F;o/yUCŃW|Io h xMUf dDDLȯMм S r(h&ufrRfG }(/ۏ~?]?TGdHvt<9з:}{./~bմ1MF6) XFiB(LBv-9G"2>=,R6rD}9+3`Vʚ$eϢ@J3P"FIh*`"",H5x4ٸ<KiWb2U:ys߻{9= hJ<ϹʜQzp-GћMKWE65>yN| !ܶ{rOVむw/]w9TEm+ rz NimξE}1!eޛ޻Q7%ZdH2b@DtTAR3qb$]u$+ҋ 띥z@ƓAuKjh!޳A =dzhK`1 /E}-m7x?DTs"vx=諗M]oC {^hq^[[nӴӢgɫj$G^Ҡ\(dR1>#]./?Ij ,;b*rgͳN LQt8ݟr9"G*{&0`Pxn:͆f)2vӤ496*{GݧO/3|.6wKn:+&j-vtOi[P/b-Is&'iQQ9cIT{amL (Sz5"C%F0 LDv4),CNU\UY elJ]Y=ܨҸ('U oǗI"En@jɨ8 7˿㿸{_՝ 0`Jy]IB<%@EF͔#J w8J$8"bFBC442&*HTﶳ`@P/n--Q`s-2͊xW^Clv!޻E vB]Mx=i:wJ(硭fBNJ"# ڬeh5mkuFE1<9**Tz_LSXl-dYLL=MjFMwE`xaM,##46Z/&l&0#D* _ S7Wg?()t@p'C#tq?{ (t>.|lָY yu8Ѽz]>ͥ{xʄ@0z6\(9INAE-άUsFfFʦ!g1SBԌfJA@ PGDD @:SBvh`fh(̌\VFxrg7㜲Q;X^m +BGMfgwfGcNfC'D_|m(ol?G9Zm'S{-.bH2zt2xy f4dɉ}{'m s-g̮fb:m'Qӣi^i5*BERNʮƈlTfl ;DqrLsЙG/ځ!s6SSZ! eEBR:6h>.#|Cm[;e%mzn7ҍ\*~{e&Xw'?(|^_m%9[7lZg nկ-y}=c+3 B} d㥞#_BB.-ʈg<qx^R.q٬YS2P2\♿szUʖ9+kYZ_ f !3 EGPمQ3%]2:D{Fv(S^F: y;Ф`d3l$g~15پ K}KpXl5_V2lG VA3(ʯnL/rد;4 0C05RDa$Up%-לHfVcx&~Ӌ@FλڮmNբ)ӧXut\TwJoF&+>~~f[5i 1j Nb:$@?3!&SMPĈ*n ˊy4`*bɅaU];h -q1߈w+|ضz@sn? |@ "(Cv 5-In{1np"alGamxQGW?GۓXpвai:8/c̅x6V|u[H9F84ۜc'hhjL LTLJ(F)%_CԾp dB.~gZbq GO@*bw&dH t<|WMljh ]Nޡ8HHUUfoG?4?2ڦ|Ӆ5m^SԪ(Kv( vڈ˼ S"@L]ݪ >D~0II: UƜ*蛫CHϡ!A$ݴ!Epz٤e.!Xiکf ٝ;#ʶZ5eMc.W5jbRjM{%(*1{&Ճ٬$Dfд]Ř,DP;F9=T +ȼ '91N+7qV,f1;bn"4 -;T޽eH;zhi 삕`ܲO+>fC |Aܮ"`ʱSir4*eQQJijc]k;v>w".1Bj#{VˮY ;!@]cFPJDI@"*‰+|%(0*bJgqL?寽Ώɽ4IZqVLT7=']*#UM HY/, KO7=zĺ`}G0zsn;!!EMyTg>Vwڒv8b~4`ٟ?;:\NJTg jVyTU<YwUfԿn";LC  li|30s9e,L*ã'&'RiDx/%UhPͺjo]R5]0m0veWC ϖ[C+C+ ` y)/SJl(hov*١@KBAdE_Hи7FݻڸXΡio쁜[D1Hyqvkc!p麞_Nvk|$zxiQ~"?dߜO^^&9NQSLXtRJ4.GۦvT9k20dUqΫuQP:u0Jm6]ȕ!9rΓ&DA ώOO.˫{NOgG^ԩ]Nyű l ˪Y\.ye'Ϟ~|y~<-g?G?;ـ.|`@:!t q_욭! >SSRBw)#kuZaV*8GhsQ#EBF5#@q wmoCiyyl$&S14@bJkl/f:[-_$3 l]#v_| []0kFH;W?#9zy0R>4,ksw2xԖ`u>>B0ݽ١9G$ zt~tZۄ/;kEAz<‹vDӾmF=kN}usn^/>v 9tm*P ^{GDBkzjrUs#hW7Y,ɲo037w)#rBwFhE(!E W RhaP+lx꽗7{Dddd@3{9LĖ]#PSh&in-sqʹդf& m)"8ɄȘ'nvUijEJIAMD(-crΡ@^"B$U"3bP0YmMCly7<㳿)9fwi3γLEpЋ9Ó}ԓAlBBPmw]N`VlfVi{Xu\a?OI2<ئΌy_ kbD5IA(d)'Dԅ2JJ )vL0f9692+sAcmL5p/c~t~'Ϝ@`snT~Xe.r6]^*ʑ HOE//?/w6h]^|Cm̑ eVؒM(jӫw7Y0S8n4Y}p@zqp966j?Z{%_ovP7~wpyj"sfFƥBe_{~մmH" f蚘g`M;Ćn#V{"dBQ8;6gE 7UPtĞa) ޷^0 ;x5(%wUh{2uf;__axZ3l3GƤwC6B*=!ԃ/~80u<ّlxdfX0s>lcwΒ6Ѭ9>k٬8X,fwn{`0vۀ\;:tI\?'?̯?%җM+ryyyU*)4ms,IT1&Sm}  Eh7w!!zD7ϟ=\x1;3mj1e&2EIܥpR횈P(줼xYp _@X~ghw 7oeql_O-UgfcmHz*bnqթ1Xm v:k+1;yqWFU0Ũ*ɒEQUM mL։" RsV%4:("%89`jˈ<5SeOZĊ]dJE^f'<^7uɽ]hONN+OR]!+lTƚG(IΡ(^q<_//*rNF#NWuł6{s6] xQ& c o=-3E=lP(k#&:wj墖SKIju"ɳZov"#Wgb+ybn"QlŴ'AB9 ?7GbkmS3ro!H̥ }_DŽ!w].=idKX%ǣubZub!umpo[7S"(Ĺqs RoA_W 08p=P~D;Ѝ=T9Cp:Xx' !mg10H2::8|{G?xkԠ`>ƃ=~9q+Sћ[j)~nywҭxK3ס먯o[nɐF4~rqTW_kj߁zf{njNK+Y!Fy9aظELׁ6&y4쎱yb+\V;")SvXp xdv=:}0s;z).LfK+{E'$Όa6vҔl[`8X5ЙZ0<Up_6M_k,@rc!+) ]*P;zͪvێٜ>tM[DjW*_|E)` mcmI)6YcS4b"4RDWYpHQCZWնMuTTуӅ12jje ~d>m.lcp_>7eHǑ}y#+68yɦeN) qiԶJLi6= &fڴʮx9v#p@~0kH[2@ Ѩ/rU^:P&80AKmŁ< # u;`(?8ߺ$?GD3@߲`1ߣ-\xxdlHBo8F@H/F:OV:D swJfEk,̑D㨺%^CEdU1FO(T==4nK6[ fA_ &HW΃\{`28YZ3:g욿]|DS礻묷8oۜMc[Q:aYLq{83ݝP U5eg͏Ihe])]r[-V?-^ RjMA'PGBm:&2"m"aBA$z$ 1#"0SWEjZKb)%ϡT0!3wd@FCWbgfjϟ?>=\ܰeoT[KQMƀ6YxTx}8qpuFìuT'l Ĥ7ɣ1 $*1;BQmb424jZAL#fsBg" A}IQ!vg-$PD0SDĐ$HQ1-NBpXYʼܳn鳶,jqUW˲8ɊͶTp[׋҅\gzmls-3n-]֛hӇbPD?hp,1 V7$0h*oRӃ^pEO!æ0 `/݌!9}8ӝ Fئ]ouq措aЬs e e}pV|`:iIG(a<-dmub3O1,s\ۤyN)9Y/-jF [34`l `T^S^ED`hO1+if=㌧.pVZ @( 4XH8'lI{9:u_g$g`tRVLFþF%u/u7P@WOɾ a쪁4ba!-OK c/wR ц`?wiN cV56{ ap] O6CXb`r{v}(hml[;СHSEǽd na wOpn&Yac&vp|J(F9~~>˪CwB7-mJddumvx ;h >l"]ՏW캭?b$ƨ*q$\׉L1 :Rh İ~ ExYmZ sۿ\wa5Ȥp: [x W+ǿ1M }l %d-e`aS@@.0 >'C3<:s & }U:=XWf- Dvu+ $)-py^?d_?O,ґiK ASP@lյQt=(wI2~SVSu x[o, $d:Fen>Cl;sQ;H;<Q7x"ë(~{zOΗ\mz>/>E1bJ)N.| % #B)Q%)AIH$VQi"jwTBzMD;; F&d6v;df!8 {/=~-ڱwyEP @oxc:@dw<_"ULP5ip4rZFT*&3lXyD*J0#H DSiLy^I<("xXjsPsgӆ] Ƣhs?V{z 30,> (H4ps#k Q:A͐T3x'F 9RlO>"ml ^"^_W>zKx eiC4@.PM<^,C&>\j.02jM"nyT -?U{4,fg*_ֱM`)/!?'{U,޻`׵&_TGAdz `2Hsijpe=f3:NCS39h';> sbq-Ӛi:=aNӥo{O4 ޅuֶ>AM.“J8TLG7[~f&0~|j3`CLOG7u_O8P8 v`9JYl5؁?9|֯F+rC!8; OSmoo>[ I+bn#A4%f+? e(\PRR3Ec3m QUPTU F$%t1Կe"N΃rǞ9p =PL f"f R@2&R3$hFF5seps ) MzI;vĢO$߰׬dkX϶=C>ޭ>m$Il^D-KhSBv羓$QT0ꈉI L$AjȪSGy29@5BbKbVf,3Tmg峬jEjծp~»_}ŗXUfiVO71?s+@I=lh8%סwWR fs@eZm}u7vXq l{= T])p 9gXB86T zzk^mڿ!IZJVjSU&T3{Єh<1!bʓ`j|OWte=[n7ju_?wuh(7OKҬ `y)c[@EPEJM3#)3bwNvȁ@4Ns=Ξbz C%ڦy/u͎q'pҁ΢2%j"* D!Q3r%(N}2Ҭ;M|xolWD֓QtȞD$lcv#w|'BH볶67}भ??ڷ]uс ($uL oۆ!bL,@mT@p95V g əq  @@hIQ_e2bF-sԾ԰I-:=⛏+M|ASnpLI;FF$Fc𙨶`HtBJFrD1N\&& =vA.٥ٜ?"M /7߄z["D$'9| e}^$>j2+n[{.uJ~xMK ~rRz=<~N' HQ@5uӡ5 ;R7_6V hwVhйU`v}OH+$nV*%}ҐaXrK@ȝfWv7#CӖfۃ9C L!CkA`UuB@NeV[sCC!;PvSX'C)x/fLHT`4RhS e/"{pM HeU,+REZyύ}z3 F $A nzϾGBso6ffMaΛt9YuZRl&RՂ2LۋR  sw:fffVv4&vEՁםxQ}m2K<ыj|,-ZLJGO&&'R\?@s.)})L07/Wz} /նGLs1U"5i)1qL NU_@SR@d4f@F@`L IԐD$4"DHs$x@kj,牜:fUUcD*mc{C:y/W(OGp |y+wo1oBG4ӁxL DG,2s޵12r)QS#&Cd)ΈPTQd%Jb F KǴ_,,pQx?싕6 R?6)j*˯[SylD+[/rBj6}VmO)9D2fǿu49YO݃r܁͌e{< 8= : (gP@VkER3-2"3 ک?_T, j% %"&h[ScTҤYțt`bCUEx!^'< DlHJ4PgFݡeblh`,u iz|Wٲ^ &BD5|{@[[]¼.zP7U i荵١*fh  At(IlT_:&=`Ć0FjZzayX[l|-;GB[ _v4[xS?!Q0z'T-o6Uc#@R|rvq/[,C]NC_q )OwWH]ZE- ش"ъ2#"Q2WjH,gBTFmrj "`Lh-9DSC 8;/\jܝ=0AX184RLZ3 P֏*_ᶼ\dJ)5^DH{3ơwOۙ Q#-Bᐟ2K@~s}սw Zc G9xz"5Zl >qu͙_|M|O_Ϸ,9OImU=-4dE`VE@:w١cb^bi$ Ę{2MDN^drx԰ۤ$97ԄϞX2D1&lSҁs⤘T ffLZ5$O~R>lo1uϑQ xwr-Vs`d֨ԚZnKXvMEulMm"qmMQ~r3Q=*;g``Ѥ!fR$f.YqlUj_`B@?YW̳˳Ӽp+nRWuIU__mc< d+ 'ovޜƾcn/ &5D ,>iN"H[_D9<Ţ-zi~5SM LM4{gb@5= J(wWӳ]*& _۫ur<ԠT!mbD Z~bw׿a&3Bw-[&Z i|zAƿn+GD";AeĶh ,F]Ud?6P )s`)¡/wj b-2b|S#]J yA`.I@|)eiU]o7ƌlyΖrF* @` E(-U3lr/V`.'}h'VaL䄗oٙ J]+vD^4vXJ`']#vN؛Nࠩإw2&X<7{MmO"!]s_æaǻ#l>~ aXw^ivC;]6v #c9FSѢl?fGſMO]Ϻ0QGs>Fk.@a۪(!9AR`$FS$α)1Dj!p@CpL%iff-A-k}k$MJ@ 9GE"wD[b:CVMU@;A};ƿ[5]zo}8DD򹱏iB`&1"ŤX@&)fYhh9զSׂ}z3 gUP5B&"C!&Υ\MIOa5xј+CPlܣ\X/-{vfQ!_90|qbtrAc57[oIa=^- QQݧqG6ΊX}Mm(wl`MLD l66WۚmMqRZ<"-%IbT,sXNZlqeiBZɖ'ʳ9_=g%AbbόjΪ7PĄ1*Q-q ɪXbSD%b&{ {: un"$ e&BoS brpp?ajj02: ӝ0b;'򏟜:>]u-Mb()5&~CXpR϶<}gl9W` MuUC;BG߾ӕgS-)-&JbTS',&rȰ?}wR@ Lxj8h`mLlW>""wΌcJ/&n㴰/m^@XpJԄ& QI1# E U5v u!c35N35nW/<-2=5%:_8i9FC㩫jQmĊwmh]Š[&0jg'9p` 丌[m&UisYPԈnGG,iyiohykU?|mqI~4pݠCB|z]C}qp\_.O?m_y~eɝ ,kUK`Tfcg^M7=w/Fghs%sNΥmj0sc&J%W&S5o6VI{,&xy;K0˳]E=|Ѽ(HPMWv{X_W'JT##NlIV{#a^^/싳/6!4*jLԤzE{{VW,i$̳u@b3RHasY?U}Bi̸hHOtsas e˰TӶ8ӶF۸~ԪB[T4ar~)Q,CÃO"Z2h[Y.$/J8=Žv^Q@d楓"MERXhJ]eghĎMt NFP4g =oh2$O/8;}3iţL$9u/wX욒h>g|ث޽_߽wQ;;=HGs78/z[e9$P 'Q1 1( _׭)!1!;R" U%AJ`2!"$쐉9GYF;3B2MQ DS2 sjҙ!;D$6ԴJ!ᘝVBv$̂'qVbaCf;m}Nm2MySE0[d9$Ę"G$5E/;_f N>xm~Xm"Orgez\/y 2"-oyx7uӀ@B'|ݧo Fwއڤ}'F3 yڟ|}u"EWmMQ`(a{zmWƛRg&{5)~lz+1ƚ6/'SeAIi{I3`졦 j&, 2^a".ҕX"_A9rB$IJqVMe&XE8X:݃:jp) ``$/#E05Q(q.=$ٙyWQYUU{RDBNkOI@fWu=23^9G sq#Y-en"u77;;4y*ImLᆷlnwۻ)JӮ8I՗I-M?|ن&;}v6ﶋ¡z_0vV=#F{הSiqb @yM$ "麪YKp!q 4 Uv_UɖRuާRʎ$ɬXf*}r6dɪH`@L( $Ȍ%|,f>Rv]7*+BUEDo]qu臤y`:yE/fy^U*:ɩZ av|Y Ѐң߇+8 ꯻[N5Sg/W3AhB9v.j5L *RM1df=!8+(uJ9V5dJI,lG,zhUI|~ʳy*YCٷ}O?U^z6}wh`D/6 OȿupǍĀVԭg<"v;w녁; ` yt010MlecI~k3B4Ő[YZm|Cj R1ynͯe5\9$@@V 8AC?؟k߬dqǘ-#n`n}jg$-8`2DeB2څa3 BIYNg aZ5 Es9%omU{B6SȒ!W rb -0݈M _Sӌ$@ǡ'Ph:7omyqxLo,nfߝ Ӄ~50FɃrW׏"ܼI3Sma} µɍ5>b -=˯ K4sj6 W. )#1+VSfʹݖ<F)e0bՎjj\,4 =(B"^RTr=1*+T,2&bH+r|JqPRN9۬H[@$`q伱C$ C>yv<еIg%FQIL{%^˜7Ҷ~؍1GEwgK)e#G!,XΒ'01Pr4q "y4;Z,(@HL @LËB{@&ીUN*vx}.g9>F s?/.b{;2ԧ#?~+:DV(vdD{~.&>}s$Gs"`xJM>f?];35&C)`?Ja&*Q!oЙM 80Qo˴:¡_z8˾AؤH4$ RBfhlƆů̥hחSpNN㧫U'c|ץ!,:Ĵm(^\ݰ8XB9v qa!!.V9Z_sWo$;s<+ ?{ -c߇3?|C8䇍Ex̓$Es>+浢s4 }$=2)W/_:n{D1 9lhEkf6&38acgǐP8DZDc)D$"LdT͒1 O&"7 E PT lz.-W^4#A+/I !\99$"6 kH95y3#}V-vqfn/S$h7o~w&qQ%+3E0r>u.aZW/!Xͪ'SϐMcK/w̗8M2,BdjeLUX8Omʣ6'ᘰhHf6C Kd?gߴگC6pIi?~#_?wc%"2VZM/G :>,9_X'"7[q@1/?Wh^3Bm[""`UU3I|EDH) t_$*$~E=#aΦ FT<(1ԘT"%LU=XV E̘L$hDDKK(xLU ءBΑǔ (@jhSi*Ϙ49$ǴfL=}}(Q~~B/|pqjH»^ۧ/w m,nM^03B@BO3Ơb$)f}љUWd> r U*< 2+swcR P4W;M ]]1X~rH4"ѐḇc;߾xe\ 3_n~\ryLSBmNڻ}Sһ kR ޝ` aJ+%ͯv27\ϕT3ε'#ǛD&%X+i G`:*oU5ٗ4Wi1Ԯ4+DV1FK/Ӓo:HL\uW_J@H]{e/!)hzyup*v u0١#$3 x  24PaEhsy6~8KהwU%2@ F1t M7y7l'KSwb~@S7r6?}sQk{VK13{?#]'Cן_!ovT෭=S?ſmbONC1`BFɉ J<h j<4$YPițT#Q\‹DLƈ?*H*P^ ͔ȼ`UG BU j} Bc% # Bཨz ^Ü7_T^^d|O_ݓ=z{{xafl8)$:&Ðl@WվCFD<\ ǴWpc҃/Psy2v@חs:oc IDAT&@}hG(i= _<:8+R``c:QӶ pgY@v~0!>{:0 cEv\Kڎf45qp{A &N2Ye]ج7aPMZteg4 ,Cr44`Qq(Pe] ;?[ĝ]e|ʁ;FF ǫ 0Z.௥]_+dyQ0a`ĺj3͞lVEJy1"D7Ͼ20MC!VM~~aTamG峂-rYkYsJ~>V/~[P.Wѥχs]1'#9KI߹Ň:A yW(K!xGLjl&jTY5ESNI%b5Ip!j Ppyr+ZM6]Qe>Zߓ hNE~Ý{|Dl;gLY. "I(Y4,Kv {})c x"GXWHS&|`$ TT1y X}vd0s j3#jOs~}@H -7M=O4FOb"nmЏjKK=9]͚í>M],P"6NZP^~O>ǯ?wyPAL2Dp M_+nn\~YS xTEhl *`rld{ beh#`{Yn-v Gk_"hEdomaugUbs&`6ԡ$}Ty" Õl7MwYzRU՗]&ER\](h|htspGw(^  wf邍9ߟ涿pnngwߩ}a{nץvso|d]gJ}ߥU .'+ι $"PC!cSKwĎNMǩ"uCBGb))9OCVctL`+@c,SjRW -OB-cA\O 9ou{M U/|]S%ABb%FHAe $@K N}DE@f+MHq247@C) bbT|h'@RTch9P*uCrgh1e1k ,wDrz6?}P™*A o12B't́)VǼ>cHFcM}l7 3l4+^#Fy9n\.}&'q}to:~No7aʘ3#Lg?昿x(wqݷPSHMb3|JwV!l*{FS ZW1*? 0S+HU)C3 |qd1E")K֜|Ԓ19uq$bfЙIpgA3fTx1/#9e1"lv~yA =!-_1=Svrc@-RG]2g@̢s_bٳ) @D!wf SU$ O^'v#⠹~$g~UMDU` Li-ytzk^2u7lZ ;+ M`ۧ)#֑j=7-)"Y'`i`e8{}l8ykW_C/翘7AW(1)j,6 HG(q dTHHXfL jdEXDur3Pv28&ġV9MrRJ}ʈn1Wgj 'VUSE'Ɵ}r1Bڙ OauE!9փGBL< ZW@Y^:`żQ<7G}fļ3G ڄ{v{qF|~)E@#<>^<=vۮwM>_Ȯ@CLh:1{*:/4 ȍDea(2<>Ε{:m> `bh%DSBU5$DB*#9dkf@!%hMw %v1Tqe1*2ಙ;bCCu*|q^Հ%r8\g Ӻ aDʗ_~0j`uO\Uz0TG09glJI2DQ&ASD$f$40sDVރG2raJvrx @nrbP&>={|r^?j۶v<$m=hԾ=MT'g7٫nKzFirh0 LlZdDcF0D)Und^mf7&$AZ& @BQPʁro /UP\eSt 2(KPOD[*emY:?>y g/£mE[RYDL%0d0)RgՍc7vP3UX#dRr)pu@ KhތdPrIb`6],SOގ\ns0(ɥQǷ۔=Xv8H^&}A9>(WNR3Ȇr:YUa4G|$bU%BBdGpF 1!9֕1TДT fLdU3|Pr-fXVI)"%5;$_FlθbS@་:+x1^*aQ b~ 6$AVSnS̤Bv\$D蝏*fTT͈ɁK9;v&9bl QE480!d￳#>9z":rg`Hb.U/Zbt X'xYՆF}˟̵#(+1xjoCyK|u6)n_a{9Cb^ͷo_FUSծu1G L 1Li! $%ЌAKzqH9);!UB *E`)F$~2{sʆ48@6/N~/PXcd(& xcVuxVy}!V8po[<GcU0Tz^3AXXF_Q#Nt)jwݙ>TT[xsP.]3@C|4s0n_v3{K;N}bxo#ۜrw'6I _̖_ypvvJM,(9VkGL(FAsl̠e8NQDPtB=TT=b1(Sd/]ct`!:Yt:j9؈*coۡK$Yr`|1!@8"G8<jVZ}:]Cݍ>FĿug.Wa0b}}Uj|mje}fM D1!E@v11:5|$o3Xꀍ ݶ]]^h j6kgLQfe/t-ev&{}}vs_B7Ė##QO>p5 UHd|vq۫O7>?ekz \0ϼU?{;._Ұ~V04 s6 0~ 96#DRK`HsL@\δ2G-d5G!^ݘkܽ ϹZv\St'0g,3Caqbo.q۾}G0o'"o}6v:|i ȓw6! P@4i1TtƈaUihcƈfwR4&,9{.ޡcDCS*,Pav%'l1%}BBUdb&abf1C*&caX0ÓYժrOgg.MMaʏ +zΑv}_}pPɴf"O!Є1 -2@B{o7Ͽ yᆍ\!Q3oA&Y7 MXwCۊSQ>=}Obͣaa`UPSP#4ıqk$)h G},jǨ%D6V7Fg{3r]}d:東=UZRr>4h2¿j"2^[Zձط|Y}Dꋉ|# Z^{nT?9>v@BCYTyfBRDTsH`U.AZTD2S> 葍nbB= T 0 UcΥ24G| 99IbO}H9 su}9^<s3痡J't͵@-GVyyuѥ^>tGB5#o\O<( }} gכApbj.(-2KC"#zUr1dU*mw8ŲĿϿZUkB '.VM4 R뫫.0_\7'}׋q=c΁3l%!30^'cw|߾f Zn}dK;'i]ޡ>NmjҍȄAgr K9EL]fbv =h2Ns]˔SF`?w\޽0lk2W| 4fc. ѮO+*mdIM̷Os:s laԝ2L`s2 )fA횐@, 0vC}ojJ@;! Bb#i) eWHmEDbF3[,~&Is<c%3P3WTaZƄ@Up*!qOONbj>9&#W쓜jeU愚T}5{vC썛Ьs=@ͼ+@Lq]We }ĸx|]ۢݽcȠ76بψ-0HҔ%MHĨCsбw yDY1'53LdjhNdA=#@I"qTAGD 7վbEv!0;_l@6T :0(Mx9[uW.}&eS`S!? ]_p4OfcAj\ܿ( M+@߾/kA2Ъl/G 4=dboQ@SPkΉIP h4E2E!,6!8%ACw! }>jBD$<  4S޸ y[ Jy|l}D2 "@b1(6dMN>mo0wFB2JAPvwJw>Z4yG XMl8wV ⍲ΫQ&cn]r+› oym_ޅ1 F]W{4E_D6XHD AY(4gY+!8d&+Ỳm!:xx+j(Y5YU}TE֛lf)jE;fm #1ct2_ٺm8Ĝ\N`vzV{>_{KuXVu7tNCAW_m!OQeW7:^%lrF2e\fLrdUnr⇜Uӻ0 ӏ!"ld  .KlBFG켸hWpSZ|J`ʆ  2в0Ц1/rJ9`JbP # 4U2w)ES5*H5'}ԳKz¸ʁ1#J9ͫy$l)l{o'h40W2C(~gDFf;iGHqaaymfJ1Fk}c.ƨ(NPW4 '$;G_㓳慛KɢNM"v4ٲyՀZxڻ;TZ%z8![̖3MմN{Uڎ88#!FC"OZ8]*Ӎ:NtB礣$F * (;MoOX4#z=4wP Ju+co ^mb` ,!؛G=ǟ{[Fۈ/杍~:~Ŝ :g۫͌(U_^NL$*j dm3 7,p71fD2IfY`Uפ*Pu5P i Z ZhӐ A[]]]3#c{w8G73w9"I)@$nf|2,(*T(ݢ.UsYcLӥI !(2UeF;ZmQ0lt!!!օj3o흃 zf0 ݆(#%ҨlD~ boܧAiWZSϦئ#cdRL|!"Ar"h(ȌȒYP@,J,$)˔Xca{|p_lznie' D "orӗY8q9Plz(P>E躖"%Ug.\ss-0#ry{S}۹^/Z=O]4t3uaDWql,N܋Qc3"@]=ȣ\Gpv[]}n}|Xf2ˤiQRpqqhq+xl1G*fI6S㈻M4ȾPPܮ;f(f 큮RY "Ф+Gh0Og!!Nm+&?4898n¬ʜCCAS{ \/4Wܓ"o_=GwXbN9I7oy Q^VIQ`4wΧ|io6M* +# 3g2DH2`h EQX Q}Bܤ34mARTPdbK4##RV)1œuS ` {cRJn4[})kkHN9gcسan6FIx[2/@pY? 燫e6l]:ꕗ3tZoA$7bMxw>aRHlk-QBM&9Ԇhu 1)($IA3 y( ,)2u1;cftsz\ƭfU,r7xxd>nmddrYD=uܵ*1% CTjҥ>~_}e4SJ4$7oܯq nz3gڗEN 'S"2/Y(j@(tDưo= >Χtprw h?foL,Sl0 eBحلytLw8М (yȊ?i Dt,Gd4Fm CGޔ cucg h98~\}߬ 2zÐs۵f݂u}ϟؓܪIJmq#\FU0"`&%=9QTҊ{7v`L[ smI {UzP^1>ȍ%{3;ID/iw>=υUs_PGF敢do~Μ^߈9ŕ+)/exg]Ϩx ,9ܴ߿w~]~mr˜oA)KCTT2w%BȄYW"6Qr kfo1XVum4GEWG.DRX9c.6K3=uD P5j LTDN//Ȕָm;:~|4u-qbP|lulX7 <_yo4Etâ®wRſ/l96 е0TRUy WȎ%@\Z *Y%\|;B%[&躮 kݦirΘ,36G݇lcRDsTG.'S_o3 4(ZZ'ܨ?#tGJLxo AJ:aC;z"Ndbe<~N'Bw⑥9жm`Tp$-VL,.#BCƒʢbN  >mѣ47nd Vx6m[ `Lг GҌ0NDݹJ =)<\'" 頍#U3B͂ afԚs}ܫ 3X ]4[thOt ő' (-&ufzj8oĜzR\W Ogw^/pb-#twM>`c t],]ߵeZD6a0@%ۃs趆(!$DV,B YT@<}Шc'l]es2@13_u&6w;bw9E:H=ȒN EHwAAEA*Z}T׋/6@DM7*/住SϖHqΛk Tջs]w=⛐:ICCY.8ǘ UY]eD8tPQ!S;xfM]r@8G>]V4Y )H͊ꬓPDC̢ !ƔDE$b2t1 hi,1gD˹ s\iX 0 HaaȢf*6ɹlbB0 d0Vd B2ON݄DЫLYV퓯fI@{4goudʵoidzQ:3*yn0:Fw>A8F#v!HoWbUgbZL;s]+a}Z?Qܽ;]ݥmM2eb'9ѧY^a: Ori0G v`S{"G0~T +ڧQ]q#C +3cv}1mAKU0a{5"AU%2i0 ݳUމzj'QcRp~lB/o=ZJ@i)4JdEBQPV3Y]<0<88L/P5 HR~w~_9bcr>*ՕIdhxY-Ӯ 6Zm͢UaIH3)DR 1I`urQC)\U("u9U _VABlbHIk&^$dc ̦*gcX爈UФYGXtK]kي!T AEy_)tIP{fbò<Am1[_p NcpVȖ) 6۽p4f U4xOyO}y ËrũI}_)tPRhxa<&ҬW߾BA+jJbSPg"ظt?" c`^ cYX~0.Q +!h,*2[?8y^Ӛ|,ueimrFZ7^j}r1>p^cBGxxy,S%VE.bu`aWzs:kMVMDcަ@  ;5i)FXEzlҙSq:wt#C@3~tTA_@w;'0}ǸpQ!lep1$ʕ  u@cy3"֡ ]%;k!6LqJЙEzqk캌QF-Ȳ=f;Ԭ 7) ^Rϰ5rTFn&0`]aWVn~3F\lbYEkAU$슪üՑ/J=#^Z4g9ufm` -z+yU{C$-uYGf\V#6mh}i; Ekc.M9QQz Qj BaH!o<:gȰw6gn : 4#`l0Qɒ%F$Ĩyr)ZcrKBJI221Z@R!@^]HD-1>9p}7Y½<$/1݂P?ѭ|rRˀO'MYڮ)Yسl kE]Uba"olUXp4HΚB-"$IR$ZizĜrE"3ZMچNQe16-D!"X FwMq6O׿9Ⱥ!r"E*)9KƉPl9*1ANSd:z0ӟ<͙V6^46V>:.=XuY eD$g )wlRZbFēea]]SfB&BXfv;U/æJgxQT% (L\v9׮`4(h;>k/¦r٤K;$m0?ߜy"1=oͪ 刭;{|y]Jݣ؝ewP ^sʜ=nWYScF'SqAC{| zG&Ҡ;^sKΫ9'Z=+7Xc롉#3 z Xᇷ+#1 έJ<ء:.DcLml ,b)KJʀZSGwpy|pLcEu+ ,?Yy]DrQ"kb|/ ȉX1xO>c$sYF5GQܑ=FB'삻F~r̈Iv%s;?t| Uf`,tK; 80y{_]{.pwLB Ű*# AAA<nN=ۖ%uEB :^h+W3B vרŽ\>9J5W_w{q.L1|ާ@A4&w]j8{fHQ[ֿxx^W~몾h.//׷@;UUا3&킱HI<¶ D̝j xkT fQ%d՘R?\9y۶l-Y;Gs-@P S%Pd#n7d !lBs!HXՕjmӳzO0]]tDMScsJx}%l~Ѿ[Y1nϧ8^TXb{Y*(/wv_>~<ĄˢX1לKV0SJ8 ]d"Ef)Ver ,z=^UqU;h#X_, _ ]̕wVzn0xX3(3f )|ڮBdT),~SP-uo\{cmk =X6ۓОkkAE}gttpz DV%bO) qwѷ(Wz~yhgs8i&Buol^\ф`{ 4ۣR(Csw-lsP=o1,!EQ:3Ɛblo?{Tچbְ]lCm]t!搊D2cL4P8%܏Vm$Z[Xd.Ɣp)(if3TT#=s#a@xM'OC=Y L=1"2FIQ5w8^ f(HQgjbR]y7{{ _ͩ*{%㾥rǝUdkc8MC`hrֻ$dTEA4#~+ *ԏ_ɕV䔐,1$ڑ:S̿`1 أ97QʞAB7f CW@Ĉ6C_?wѱh֑+5=й6hW޸w/7 6J >_ˏGG.?|tv|~x`#uXS{>ץۇ3񆃞Fxk410W'?kR?W*Z-E@p^U*2iJo0 ..SSA`۴UiaQՒU4>dwVzzu>[}6E+k$볜r]MhMD(8|;0 oI;$ݛ8S:F]UXDI^na_efn:Xt-1)zκlpn*c6ĽbsPL#3C*G' ߓ%9\R\1ф62`S~OСP,DĆs3ͽ0#N,&D #OZ4ʵo%o%z8hWSoLW ;җ4]:>ˡWx}|:# - 1~}ɷ}1ו; ֗ۻӏ>nbUĤEłeQG7]%u)ˡΛF$%v9ER0cҕXb"),}Uu)BJUSLdɜ7K ET,* kbSlXs`%2s_SnGCinLCƍ98ogU8k>S{fL]μ[˞]w7FҰ~?A|=^6>ʻOO/HbQjH*gUm0>88fQb(PHcU44|˂kKb$Ð%.Sԋ۶`v&ȧI\exAk^}ZPq'(i^0oUl4^q} "1K碘S`m }qo{NϦ؊M |?=eK❃/zVEQr{G RWVS)lzA^l,X~۴G"b]ְA$uSLSIw~l.2X__| ΅.JAEc|v{yڂH]-<3^ @2gt2m}!0a֊WM9FX4`H  )AO$Z0]UѬ(ŀm/\xRȆ, n pw;x1 >S1q) SP{I Sq=Yle$ErYsqef?@TTe׶% *ujW F7hg{3ο^fcG/sLXy`Zkb|kV:WpQ~ϕ3c#p%g)B /Z~poG?sÚ5~Ѳ{ONηm ֠wfwZD԰I);gC12YXAZ*gٶ͢,k[11&JB]V%hpER-';,2FdM",YD6R9,BJ/ԍqëk*3V7̍.ϟ07IdvŻ\b:x} xG ˫g3Ɔr^?x_?.bsTjQ1$UY&v! @"6] !&Afԥ`QT{zۋ Y<"bYo:BŔ݆؉fk f@ vV?~srN ~ 3(Bٜof㦱ΠGfos\] GΦWؾMoJ|. iy6Ȫ{]+vr\Y ^?K dI܁GG~MCHiQ03Z"Qm2R  &c``%pQcD\7˘)`=>^5!|m1HU due'g8n<4!4(*$|9r dT9ϣD_QfɊ}}Sd.rC:9---UUP &>cHq`w<J|7Tm:#iTPMQD " rwd:,Zb<@3!DꍋzBdb^ E=wW:j}}Gv #J%Y{Td2).\vp\R{ֲV9 SܬúiWKж]Ӥmh3ձM9]QWXsSڐlX7Hk"bL" MrR"`l d(I E*[Y:K!sY6-襗༗jr䴆+Ppاz];m[.m=W 2(:k)tec WTEIs霨֋ZnU/9ʘSbtwnB*mZ-*g] ХTC5O=`:f@w*>ۆ =14`NY=n/K3zûz=K(ɫԗ0eK# NSu%魽}D"U 1<(l]፳9[W%;19f"s:Sh !2VBolJi{+6rz(jDd}ٺ!&l BkȰU:_PY^/ a:Ȥ}w|8<¾WIs$qv=CYƀ),Q5SHc_0Sn &:Vu)PQGuDdsOOc3w=,s؟_ODgH:SXƪIk%Bq: "c$ӵ}o Wea}K 3}h{t_<9ٴ6l sYӓo}x_?D?_}t+l֥(m ,5H]L=G94mrlmR HIr:F UIHdEY@ SvL@l]#V[yU'paSu(0I_-@rv# 6%7~):=;7*bӳlTW>w]n[ ɰҹ,6-3ZѢ6D=up6vu^wHR9s\ %c5yBR&~|~vƑ1n06ZVCs]0q7;eT󑩡)çMIŨkBhΗH/zqQp2swq6P;Z聭`]]{\yCB?Ցw8o\? 4 fe ڄ DLHƺTA%a]庋j;˖ݢ,WU  C^r{AI18(Ebܶ]Rh6^ܳJDwfCXBqkRn";iT'`1(d /,1ŋfC<2iXQ`ȉdSWV%3bY*JOQxniA_ q^إ,bQUBȩYJszPq;+mt fG>ԑG&eW#gW_y+ *<vzݦxk년%jO6d,;DDBId5pY؃23ްe#/7ԧ)RV9)i8cbRLBD)'b&Bd!CUQC ]/k[Kv77QgڮwRb^N IDATcs /_r*?b,"4tjad_Oإlms9'hcw𘐻 aUCl_v Ħ DIE6S M7XiHL \)ģvCC\11ݗg\}T,UA_z^K F|LhN855H/;TwĎaªw{HsN$eI*xhՆpaڪ_W]D0`VCPoArJGQX3AN)ٺ]uJ :hj/,d`)h/⅛،AV@UX_oAF\Tkv^?/)ЮmPԬj}1v&;py(* 3QZ~09cEE {ɴu*3^K:c%78}3O9z{W8weK}k|<_4Mn-Cf<<<}T9egOI @fM*BNˢ>Z,G&&91D`7v"D$ ]@6f"Kjg,QdZ"e Ř@vKG<|98Ŵ-+vr mji6˯O˿hY ,hL'Ms$ `VQM)7!`$㘳!4̈LĒl4mhP4^NEr5i}l)JڴnYD6BK壯W_y]lReA먷 GTCw.l286)|uy(g_e͞#K|˽ zVgHjJ2iIz~'ٶBlZHqYzfkǖws2$PBuψxF7|BV' q{o{v|]6j[?z *cIvbEb8BS%4e *Ѥ6R$8 V}5:;;֥a]o`iHض\ܛĪZЛrN|t;M+YsۄiĄIy8aU^4!g^gEQ}=^3־z'dy͛,QZYӵMi0TB3Ԑ6h33CSA@ʯu$F9+3fH 5.M6f .|>wn.8.o6ȶn7}w7U/mdN&p;ty/>淣62HCmZi/RPbjv R2! Yam)RS!2xόT@*U #GZ]p]<ϵLX+%gEu%>|*9WRRK4gMr.ޜ~?3w[q5ߝO|g}`\k ':fZy@C32҄Xłw!2طޟ̖xܯ+ eǬI| #8 i+ܐ0/6TɈZhL;Oft|nk.m6* X[Fg'3on,fm k\ K6 Gݢ!(0?à a7؀a$iډZr5Ftm-zSr9׽4)5ƹ&F&mp\BQ;|0ɆEvmB "wǒgM y$~2aQ;YtmlJŴ:wo/o=jq2䂩:&G#0QEA^.%˙ƛ rrͅfu֐…vS4 hF.Sp?Q02T-vnkF$g9'#y& pgx\ý6#/.?ڠUBQ\o|5{\5r}@mV6d"i|Ϲ~kufŃyvrwCZ r`\u}RբF 93߽3sΏ6V"%l`m;Q5WZ1"H5g^&-TrMOnkɵFf0#~Ęu_!n<~͠*V/9鰕a_/ß%WPl1tU2:;yp`6aZEJ\1ړ3yGjh ӉΌЖݲ|R ε1 AXLgOEmP$;O/>nM6k&5̙%mwz[AmP*9w^ mWf[V"RU^uVXvL߳]vqnfJJ;}-_ah߽jy0wZpX~W_.Ԉ~ӡ1g 'Q\z*HITrчcv#G"8gm,jI!+YcLKJV&-0fɢSՃ|>-tCʵVG:_ys|0']i7Vj?V:=w{<[dbf ;)&U ۙϛKS;M,LRʳ6LpX,Wݘz)OV%'+{;ȞsIJ4 >3xNEj7qi!`ǟLάޫ9k vp]C:Kr\͍^z6m/ߏ*/FA\8C1U4eQ0SnO~Ny.:aG(Iӂ8U lSaAϊ\jٛ4-S HC4 YTs.xP vmЦ9Fv4o<ڝ6!-E`b9T{oi1M ȡ9jhk7q6Wۋ9*vx &a=WҪ߸ɲG8mn;'xn^/{#i\r 6;`dj,t55\|||0^^kwMNc+a]R?Uoɋ'įU ?-CMÏ~;O!b5['(ޡl*!Xղr pk];G׌PI!YSnj3mj2ڏ)8B@|dGJ) KY0L \'24`}3mR| w;wp`g7iW݀䊖E ?c41^׭9hfBWM4n}w/^0Ao ?Et23*(3QQJsU)M Ubƪ60Z ,!n ,EB_D[3]Ӟ8^zcږl%IUzu7K[o< J)//_~L㘆$劘P#U*ZPH <lDDPFv<-d$"*r j@>8Sb0A!TPGrHjHP`_ؓG /s= N+IjSp jmW"|O?xքnJsnNs>ucKs=HDsɵiu>؛m_>ޥ<~9񾪊ʴmU\JJhT>xG1`Q6 F*p$0?.G`>L9%/q҅OADjpw就=~ F nI"3 pc2|13U~w8i jbZdUf~s*DCR'RUa]l1<6j5W\q<V]"*1Pc#g9GbA Oc,bd]54ԅ8 "tkq䆱"O=]ɩx3,Yքx;O*֪pP B=yڢm#D:v֗lid00+q`ιkF; \L\M\j50|70]׍ӶE+os?5ao(;=BR /~5M+ożI2q?+i.Oݼ~3:?s^.ӽ[;O_~9 I4dzXzͤ1)Km/%E@1kd LvR5*BY5es-!zǢQc2UZt7sLTw>9ď^\P:YЖm)g8߽hoeIZL+LRfs+5ofu%vը3W0MwςKЊT{S *tgLE*]ޣd1WGEs/RԺ?iR1!cR8?!t}|5iʎ30mí q:4ȸӈiP<Pժ{OD@͡C541 `]5vl "JeTaV3oR%g=u 6< ~Ǧ{"v!2!j nC\u켘/#"*Ndgt?$5-޿ /ϩ>_~Yn%_bpo`ӟjCUʈR NgSvc)Г rIX`w!9A5EѩL}܉ ƚ KYMBbs:Ŷ35@T}~le4YXs-xJF&M99&TM<,. |_1Rgն+3^؛¹]^y{ߎٷn;(I","LwDRi#0HQPDR k3maܼ2 % &vy @ؗ~P|U LA̘0*WEӆilL1xicc{gČHMhH݈n 8+C ( 0b2SP#"4cLwٖW*ٺi1CD:=J}0+m@@@ 9,n~2" Et 0n۽n͐.9^?~5PLۼ|b^=8:83|x봹AQͿ_:4; ;ס.>L_Zn?؟>?3n(6%x?ܴMNb(`7Tjp|ɋFq#kC^$cU#2(ժ(jNUUP.v OHaZʷ$+׷ Y" >gce7&5kBhGfBp̧DTj!.0Jr"ҏ Zh1hYt v 35i,VUe>!G(~e2w96hdG' vډF"բ<'ak0 i۞&ƨyS.6g(ݸpkMnKg7;n\| H>ƻd)CUuo>ԜH¡O1!Ec.}! Z;C`BOQ) 53V'΀+nv6ݹ d"Zk߸x13R& 4:}I%"nm0)n߅(Jvp&Kqy]pC58 U_=ܝZiJ̚AhK,VeZyl)h '!92"$\({0j4.T)`4!\GDjJU J’Zb4QT5-vwa@aq8\=?yR3֑L:?1_z`[ |@+ǡXjqmn}pY@AhV\!sf"DRG!eT3P޷I^M22Q&Hhr aS&Uuby4ޙN2 s!Į4 ؙ7I*Ttڶ23"lcZOݽ[UumkH{u\B_:s[Lܼ<"L5GĒ[Ѵng)m_kj&g/o2 +b8v}ޟLB?q;kE*M)R%ЪYCJVD> "!uCcQI.b J":)V>OϗrO'P.|U&Lʿ'/c7BC?.Uԗ蘧kBJ6u޻6Z8 6sj0H\ugs. 5q0)h=N(^3}6.MUErX4ϵ@-s"j*VZ=a>솢5H9WbFgB6P*շRƆȳ2aU˩(ۣPD*|ѽJrî泹*X 9HӦ!鴵rĩŋ{svTkN?x]k-/d\6/6v/{ Tn;MmJ6R3\3~^캷v.$"as}ϻ=\$|LY۬{+4[wߣ~2?=of[tN5*EL1CIc-*h&ZA22ۻbe@!R1p·ZjVIC4i^ dĸX'Vٔ4<}~:;OPlU5$fMN #ا*5}XV9 "#7LR K۝6Uu$ًe<]NȘK'lRfLTuL %Y㧭Lܿ'mQ8NC_bp@Zjs5NU2P*Cڪ[fWQ˷?? ?Uosn3:of^g\RVCN?ÝaM󸰍 >BE/ WT5 "qիfj5WYH0h=|ɯ|tJA1FX'FrĔki|̵YEE34sM6 RT) fD~ٸNIbIzZ?}yԣ1i7[B 9 kYu*fU4u]x}^ i9>#ا<&~>ݝyxǏV#bgnCA.ER)'S~RSc&ߙ䒊j54`kbho4t)?{O8F7 ވCLٻ$Y,W?9yFhAیb~e&-۟BMn;U< bI̦}Ì)er!U1.+ 8]:f^v]ql2/ޞF&7%~n@t$v'5}›aBhX +!T9f{]FTܖ^1z׽jҮfFD_~9gD;!UYü&ZZmߢû;?hNC\wOX/>Ϻլo~R@EPQU33" bBDDv}%RSUdB#b"Шɲ"UjŦkYCC?ŋ|NkQu& .FON7FRw{ ~;wϏUl~z3o|U=Աgbm1}O EeUq</OS9\3C" ٙOe;~UMDaQXIBy"/ FzjEqx⯞fi'}qB [L4@`,p6e8>]lo*DW QrRS`@B*g04eKvTLI*vGEiUD+*lD@()'KjK8olތCs{NOVn\tCVUщ*dUsuX^ԖPv)=?:fv6A.\0V~ZL2DP;'֜KT1%G<J򼐨=^v9?W#(ٛg|V 9B"8Qf),\~ҴO3[tRX'/^ر8|qZ?T'꘶o,`Xvnxqxy~-M# o[ ر>i0IcLcwRkrE{ҥD ͔Ik-!R IZ 3B&05nkP̚iRh.]&k;M21_]y3~̣;:>d9] j&j*~$Fv ~(8L;!YRZcѥ!y#I}\lu!2[O6/L<Y=pX_:iE& e9NaVo9ػ3awxNcVa @":RPtDDrQ-bD1IU"踈SgZjib\ +Đju"!V+` I#0Ua Yj ΋L@|]- Z]_t`Vj%Gv i׳$8i&y'8=mn7%Oihxh[>mz0I__ n[zMmm/[w[үM~UhCVBT42WmFb*V4JِRnb"ɛؗZ 9Oi4 M.I͹tޭ1g HUmӓ;b@ӧ/UAT1*D0ʴtS2>?j]Qy/uq G_ hB2*ꦾtUgGvw:vE @$\7d0qNňmmp'cJXO 9 [Q*+Vt}/hq5~sFi8,٫#m+m't3b\dswkJwh* TD$#3jf$u,gtU؄Ytx%7 x # $KDR%@S445m! I8$.b݋W ;39.EchU]{XRvܴǔ}/"$T-|7As٘->%o狾AA9~4 ˆr v2lΞmr{{'2I7ΐTj}7|skGpZJ+c[]VbUn6,LZ)Nt*MF8 `*9LH&rHiH>̄r9A ܸ07ftF{FK︂m4$|ytُh}Lr j *HVӦM)- io>CK$B$zt ȎX"{;vs]{H*ytA[N,+kՃfcBFT ;zzqh ۼC(o GrD8>m2e%ˎȕ*mlLdatO"3O9TlpXErrSTT[#r"5l&d4WjAǓ{Gtܾ8]Z"66C?ܻ{{Տ56e?gׄ~(I; ѐaOWӣUe:j?/GN͓nboR>Gno-,{}wFK2k>/z|~R8K`1h ޿{t9/??&;D͐\45 ͙) 1תƆ=:m&*jfVJ)l<132tˢ16"po~Љn 쫽[ =yz>8hΊBߕwxRju0:ӝaߧ.UƀjiC&(֊JJ)pp ;eXz\~:/Wv꓉ $cT/T@q#õ':CnVfQA~3!lu}o2iwgq*hm؏c[lHZ+4A)$VKŘ1V1y;V}Ff`f.K*j{VUADʔyP RO& @<;,{wǟ|V;E/O^\Y&ffg{,dpIffeUB5Q ZS!h [uOUVF& ow;~v#`2$țNkǖ>ZVOOFP(5&d0f5DYDb{ݭC]ׯG>zЖI "@oBc;e9rhJZ::lx5%\.j)Jvf3t9#߱[H\[鶰f΋޻gFUBز:C AAC.9Ӭy˹"l913e#Ϳ~Դ/|I9_?ӝw,YDh6Vs(TblfnBCDkXR5Ȁ=QYZI,%aM!t (D-cՅYI^\Mqa_ճ?$pԴrUɮ/?ϸ&DWV" bS?@3HdogI&e٤VmR&p Z3aT#[1e뢈zYe&Vv6Bu}~6 9g]a LOEBI2a0[nJa_/o>9Wߠ0ʭt(ބȪ_g,8U,wdEmTv&uQ1)@Eb !V3qX&#:DZ+Ҫiv@p P0l4 ӴAۈ`iEz;;[wv?әyɋg l?{W'qʈ"(MkՄmbkk$ k>hb3)Ӣoe X|$Ǭ)C3ī*qA6nRa3l+׻+x6>us D D18C9Ht7;wG NGc'eN^K NQcl~RnEHV($eDE͋s:i /aPZ+umձ^$Nd5B$70gf;I. Y (" 2ŎF\ 1YyVE IDAT"H&+%sp]{nnnrg75.pb6sҺ3GYRȜ7벸:Y9#]%Wruة]_c^{k5#LI `~ê%^՗_} >v?h$ "4ԘOerlQkm10*VNK XDi֟:3 G!DC[RBZb7ZhJ3"C,0/O𜼤,9F9W63ËR2QF}&7'||a0" >T3(uZ6. Ŋ(L "0OHi#3#;MS?qN0m$c.PgC\X9,Q4)̋2Λ-4³*Fݟ(5yV`ޒ@{Ư07s $1Ivd !v%! x8<:eBO$ZTͻC3:WRMeKf-4_§ؔ{K1uz%\Kp "BYgGs2YNhi~BB`KwϤ%}Ky.}{,sH{:V](w<5.)'v " g}8D[y[DA?_hGBcMF7)ǯyd4.Qc`0~䘁ТJA)5"ˬ1 |4 s X!6Q,)TĘ<4)ED2 Bƪ 1" mDSʥE/vk^qfvL-mŹ^*v*<L㊆.Ek(|ysE&bV&XnWE(sH;sO6tXzw[ "Hmu|ey8OjH$S,=9m*`1-˦jQ1_>O_Y% n#KOTd>`:wiha žj}dLc}evyۼ| /`k S_" Oq2uf.N{V~ ɊOmY!RlJ?(nB(]:jb1DBBDivvv eU5\;mo_=(ՙ,ˋfzjq#&p1x8>ڔ!F]3msH7TfElIXL߹`EҎk=o#J͑e.?*׎Z& Fx\N>q˃1&Swދ*1iȌMccvؖT"mqm%7/`7YgEdvpξ\  ~+>v 0f}$s'-3j.} JsWQyI|ޝǏO~Ǐ~^ itogȲIYG` Lƈ"UV²(ffV !E)V.pYeDa)oT$Bmupc|ʧ,fK'sڦi@N\@|.Pe%27>,14L& K,QtQ5LzF$)LHAY(7A9-iLk@"Z>@CgJTx#5v*κ76',T%xI q (j<?P' {盦-pRzgNR^Bw'_ ?_|Qj,w~4B!~zw{[ȳxX(GR6mfZ)xT`P4~8`ȹI*ڹȠ*ÎJ $ym2hSj%( tpуX͸&OqSeB"U*ɷziHti^TqZ^2V-ߘW]^4?PU C ҕw"|t:[X$UE0F (>oR0eCx ]ToC]N Y!onwŋO՛" O ̙msZ6e"@T삯}q FUӆH>2% 3 >*6VrS6)i@d&6Y%È\MnziB(!h`#=8~#ll$DMX^%@*sd8&UdnjVZ)Mk38H$&$u|<3]jz iU^Pjmp|̕煚pfo LOrID&ڡnePFMioY~lVpr:dv>O޽.z=|bm@x )nݯu 9 (.^;uKwb;[/Yy Pع#?(1(1͓E={Uz4l,Eѫth2F)̤VDDeʿC"DHwzqpyv]y 5Ҭ&7HWǓ+O;c,"F.օe]i"$RYBo֐jCL cɐ|IKg4rV/o@\l|z(8iJ`loQ`\)D1ܸz!a{D}hBn;Ӧ F5"1 5# 1F)ő"Ceۧ/vpwgkp|4A}:5w>: #> O'mUz|c ,mPӗ{w4m*|YeV3LDREAo6kuM?W<xfڳ^ -;{&&[4!x7֛^.E7|c3o>4SG$Mb6/N;L<mj˶¤۽>MM$hD*,(8"DP`z`84>$쵶D(̄&C9~^|}T،LnzT tgvtW:bT(RN\gYg/]߄,\Y"J&1QhpDJΗe];|1"b%X @S6)S_w䆑hٵ;߲+ɷUM "e4KRno;$1q-LJی!("C[XB􂀨 XXuҠHew+p[MDmN_ ~ɇDllrQն>44)#GԣjCtڦESZHlomQ.)ONh%h'0!*8;g7:@']g-uɷn(k͉`lܑז3(Zpֿ\4acT#PYK9O"`] IS<]PU/>_mo%qROxgO>{w4`b"iTUpo葵FfDVU"k˒L+!]t>D'ځA8к&f6""K4V%.Wɋ _qҖ*>m<@F!gVUn~7ˣ}W) TMFh#{Q `Eڲ7Sڀ ,kFicISKF/'mdl.+ ^ 9ogIk8Q 8Ss*,4%otΟP}FǙv_~ޛ 9KSwmt\%VnF.0 㶷 aozowO^]#ǃ2zشMƨh{o| Z1WN2 meI5.VLPs11r$pS((98gSI&UPsF5ù7ysEG/yn>ؽ/“!e9Bպ8.u"m¤ $6uDv5 fYwwj_\UYz1īeoÃߥSv)Nխؔu/W1c$mw)IZҥkP{y*1zPIKlw{;,jaRQ]ʦnٱ=^ѩ>:xp_DZe.{w.[G уsȏGV'&ưVEWUBCӧ/f !6]D)MZc^D)xaRGq.·@\y!цn&;w/ȍ 2=Yk-_ogHS8n_lWN}/G{w3c?Z/O^21IB,/m4:R0Zv)X12ю:&BC/-Ĩ*\j/|+cMd۪94׊9?x$,"'Iu?G[Y9F$;Faٶv IDATurj&iӶ'U n #fco]XkٝCwF̀_ǮJ%яڑT,S-"gƤq\ƪq\dը+TBt2Gc7NҸ5k0&bBu3Q=҂w~bE-4߾!*K`LNX$IXFWHHgJ4KV~WEn&10u ey:7I~6d8p/{HA\p3)2!ytmfsė\,ST+Ro]PͬxFy/S6ӽ.LD^գ7o|d~?i(mp{@ U1kGs֊Q1x",=%W%;[[Q8rVD Mk$TuS9M{$X3O viH?%ʥ3킊PuU3DZܹO.mFUz99a&yZy?USsUED\)եդ"n'}c Q9-K5#0"XM܊X!M"5LvMl]>+MZ&fxBu)xy3dYd 3F$9YLn֝Ɔ+(G%N&unXHd0.+_ҝ]I5ƥY FƇDmOp|ˁ%35+lcN@3Z%>` ^°0 P>QՐxM{5""3_XNyD}'_`G>cXy$T4BVB28Th $m~PhDT̄DRVs9}0fsPdʲ9'\@3|YEk墔/VyGwOU|bO"&m?ڄOr?zkB#78s,70R0\Sفx v|J/ݧ@ \݌ŽA-9WHzs.5BC$"M@,2j7M%!@$( ݿ v[?ԧDrN AU$C -=Iqi@Z^vOHޱW/w M#<T8Ջ'дݠ|anLk^n{SMY#q5N1&^W^WdTC3xEJD4GA$"\12ԑKX4ގk s^=M(QΈjp*fIyA1F|󎲜穩C7^nA2/ڽepZh&"Ԝow:WHspgF<6]uwoޝiJ߭)LI|MKY`{py^SKh@74:㙷 MTJ"0QRj}yuNwxZO$1=<ƈ&E1jeO;=* 1F?xtP zq͜:̦o$[Z3F٩Ԋ=?ZnL4*?HuBI w s14is"",{{{/mSK; ^#rjE88O#'AuYU1HS PVާ%EZDvg{Jj3D^+yhv6n5oֿ8f@朹fj;;<2Nl- {%-+Kf wNG-'YF\ժw& DX'@~aof8:Mlۏ>c- "/6LڷY+Ao>,}1ie\<+P*m1ۣ,ڷ4L~Y7 5=U'_|wmAFtƓiZ],# Z)J"#@1Uu-,O:SwopE4{u)BYD77{8#q+$ )Vm/dUϕO߻Õ"wTzvC2׽OЮ0Ψ] ,n#;9QR)i ل<8η1Hc$HQ`۠%0+Bcm+m08'#Wס^BqT)΋H" ׫.ت ^v>1,Hjʏ 76t ej6a բHk/~pH7&Z";Bp P: <+q-SfMk`=DD jnK$*%magqior W7U7puK锈B`$mc7I͸P 1IYF65ʠlBh5ٷA"DÃ*[$-qEr =9 "KP$ .y;v?P6%wL#ጪ]hw9{'I>=of`f0 ,=wiHi)d tVA":rEi%[% s{X̅+}!ʬ2:"z =O>{|YY L ^|_ۼ}ce49-mv[&,QuLVQcf 5 (?FLN^-d=YAU\@ֻҳ=,lkȤfz1~{~sIwAj +*c 27J#\Vj5W.P圧i۪ H^0O7Y憘Sʀ{$"_|P5>cFc|Vu:zvܮ'vL zihnG1VW7/FWر{>@85:ªݟtF@ O%#D 9'&6d*9QWgb1NEJte\F*E3Fmt,^yr])YZ6]ww*Ǫ4^G:v3D (k)ǥ4vX@ǮfP@.5wLwwYESCT3C<fY%_MB3wQfZPtS !") -)4م"ޠo#ahB$w}g,ulgyגEؽ]t ;n¢j)JHK4+eLUa;* !p{j Fw٭&QZZ0+CĤc_&zAtDt5Pxu099O)lzy];ں,ݻ!TeZx""FDH\!#0DltPoT,ۮ~楏w}.n| o֎*J&uy{r1!hЭxPbOǒ:m-EDM#1fq9$aT{jbGʥ8HDDP(Pl׬*zC"Y޾ vt=m q|Fy,_UWwNom͠Jsn=Sfb\\ tBpv=#-A^Ĝ"Hvn1 ܞi\ P/]jw~tGM7/,NU*lu-A``4jl,n^{펴JY /1"Dny)/i3ICLI=>Q0"tY 7=Pq)'L+G],fJab ;bm!d+&a~Q*1R]ʊmy]V5v+=gf2'V]ɧOf#̏2bƊg϶6[w77wh` P IDAT^owZ9Eb|ϳ"T)"M ^`<_vӐl-Ā&)0p+Oj82Ή O?]yZe\JS% nJfOse7, > nD=aNS&qsW # \. –$$0`MtC vizeڹK֒^PT,X0`;)")7&+felNiof%9\Μ71ú;]ejFw^JVxK+1q* 48%mǮ:6u(YaQ~&@h8͊Pi*:,E̅/Gj&3A}У^Q SœP4 #ByPd1%|O (#/ =@0"W_Fk}E`\{1LV1Q@1 fgS1+!HUIz.*LuBE0zhx ̘丩,R$BFY'Ƴ~etEӪeW퉪jq]iM+unuݍսN/D)ک;mb3hS.&g޽եR"=I δNP;a9d`YbZٷeo2^QV;5Ǹt#iA2ȸN҅n( Īl>5="0eO-ILL2lbLa3aoP|dͶB$4^^\E hik1W$&uglsAaj]d^ZbzAr2}EVtxtf1way0$tDΔv܈YEBRYN=O֗;~o*:~ksEH@թVluWLmgHo=8$YBؒ&"Җ3wmCxN팬By.) vWj5p,inHJdapLmnYr8+@Lsŷ;J*6lXnRgϳi=6 c\L+q 9ىp%q9P2D?o ZX@)mWܻFlR,PO乽۷nj͉@f&&- <Q0%ȱ`/Ӵx3N]$6I1Lw ^4#R[)񻞿remݻfɬ)N#blMVbXTi׶3Il2ŜZPyBm=cHAq̗/.L 7J΁·PG_k[JKUOMDzRlKi(kVcAZwg< s /D93'en<{Eb~3@9S`DG>°bY"-DWZbt¤lfH21d]= AB!__ +{ 7׃k31S)y GBzINB+d|ln C,z4ie;l;FZ:ۨ- n{ϱزI}_DjިJC`ch2+I7| XC"ԚkMviyd %DsRGb2>yjo62V 9I>+1{d+WX!c͵ʮQ=ǣlds=X)цR !O2hM`ScC5 BDuB<D"ϟڧJDI0$ 1"%vv;mܼNñ,AEYC`ن[jv`L&6Da Eɛ]/H1 {x7?- vM]_E1X&5 E9%f 㣠aX@$lU/AێMr7XQp!ZuYYo~s|N^YY]zM-QNOJ6`Ȥ)Gk)ki"CZ|ʢmbr_+$:D>7$/kSBʹn^_?+׮ r=h ջwz1`g<)aAC&9T$N1d'xonQw>O S"y'xaiDVȈVFϡ+Bpw7>߼k~TnQQwoBWLzah 96Dd2z?LOɨ:X(vM AEaQ\0ECrU3_oݼg K$dՊ} JZt;^ rjGN ">(C"?{BdQd2@}%#d%{L@ RMD<m%e'XTٱf}dy칇A"dMe Q솅>pdE>v{;j46Ke#ȑ /DL|N'xyC7k]R+LG$Ê.ejk)90Ԏ짂&<= 0e Wo_~w/w>n`Lrcڝ찲`>ٻyn+"+V&LdPЫnRxHHq2=&L\&MDt/3rI@} ܧzF "'8_>fk~v=Vh#{ʓwA9F/c;>P~!T@@l6V;W:imo,/UVΣʣۯ@:Ǚ_NoDZx4!Waz2>&jD^?l#9?GF3;e`k>~Y̊ѡ6;P`_dʄWq ,;2v,}WϾG붵uXl׫>Lcbowww ~Q~y>b) X07ˆ-X%%ҭIC&C}8#2 J|wCad8J2*)8t'/XLnJ>4 D Аɸ$L1ޏ=OSfq40" 2)`|ޭ*Ǜ~k6|LPJZV^u7{=JFȄPg:\aMaAo2',Iy)G8ЌɨT[,y$2\vwY>q{ǖQӉ$dbjMИu rK)B,Aq/uxc|1=BTSv\S&p^TГG-6{,aI"kRFdӁ<4./צO"#u`=ycY>QЀ8[FlIB+Gt?(K7HCH] #4ˆʃ/ot*<]t+]y{[kCG!ro^V]ѽznĄM$rSHƦ0wxʐQbpDl7PȱR<a.; a &ҁ\0GEm@ڊ'9EN)㈘ 1,--@Y0dm2:'!0`p:hJYU?V=i;a'[Jc_;!"_p+OIƵI8[ K"*Y[wiAת2qH;:ŅV$i(+P%J_O2{1!#?cbJݐWnl@(R~`CH;H <#$GӜ*D}eXS &B$q*EDFL4<1m25}"%03@5)C eB0(/LyQ]j}h(L`4-NF f"!:PDeGm9p rir\R0hҾu[㳪涻ؾ @QjluDt#Cي,f_jQ1 "nLz1dHx lbH.4Au!CI֌ *4ҷHlCGϘo;]#ꘃwKs@/ɏ([Wܳƹw>w/.o8tU]U4juq"G\}|fqgY\5<6B>̖ [Cd=u {ĹUJuU9hA}3yeq@(iCZ"aP}̛1#.-Y)Ɖ1{5ɸDG?0ÇxJhNzH:a PC?x# s;4 ~_#+ H<0 W99v}fU!"Þ-{6D¤m&Fd CA~>-QB 1V4Oņ>(W32j;֨}T6(|(٤K1fx2A2.89J9TKݲq3ʑ}7hH #Wc9y@x7,1UY] &cp-ƤQ=/BA{a*vq QF/`ʰ⚾B23V0|dz "B pa'$zF*?#^dͩ?j/0('\d,1JG7]Zw.]}7?踛WZY]Mi+K׃ V4*GgxVt =0v 19&Q9-9WDN̊2G#p|娞qMT!&v|PPdHknH+e s9H;;S\: !Dz'U`Tw&RQPQKq1^xm_QR_oWr''hPdHR1mbFok+q͋׮>Ɨ~ꓟzZ]%}c NؖB3k&pVk&pwAw[ӃZ o},[] g?'br/E(TLjq~9*yOO{`)#<:ZH1jQ\FIbȸX$l9ioEv}V)X &cGb",\;+#OxTo*wrnV46Wk">1`D PUO=/~Q$_?k>5w֍֫KK @Ʒ,mWPp#o),aܿ@9͍/(\_Lsٕs0ar9o>((ByOO! 2f3QabVď;O8prqV밂 4^Y۞o0&f7G8ɃvyoШ/?Գ?.l\h5ww~}4ww]ka ;=UW6?6d  fh,ލcֶ35bd<(@8!13OL/ ej IDATo7?_lv?'"_! !_ې|$srHa母!Ӧ-C 蝯/zI 9xS#S$fhI{ޅOln>O_{ί}׿[7oRZ_n_o,^Oh'LEH!zJ`1@$H:y|:_9t13L"Z<߯T/qN"(I0cCaN-\aϓ{\^0H"=*+eH8B "n ZS`P+|4$"Ě]4b&z˅3dT:եo?j4v::tkabUq@3Mܐ'UOJvE{b0Ł쮼S.#r6ݘ1%Dk@B}{u!€ L 2z (:`]7S)S+, &$xL25?!ER3Qecr_)u#vڽW>^яlo|+WPA{Ewi 4 q |$̔M".R9FqqCL_OTSX`ApRɄo|'?,GNM )\ )OQnNdvԝ^=_v=铆B2lAf!65z;1br}>ۿn߾YڸVѽG=ƨ#F<ή:Au'mdbcBqh$9xr{:{-~Ȼ4Ԃ%VI Q1=59BIy5˜ds!Pah3aa}j&iDT; 1C 4x-l‚(Rve_=jhdŧത VvDaϜCg JVr\D& Z_xܹ{?^ݟ໷?xv.o4ڝF{n*R] ,QIHC{H CʭP>J_#^SEV(J8_Mb"m@ dc1~x28;|'Qbtj;\(0v #v}` d^IG&Nt-x;&@~ss8Q?«N| Xjؒi@7z#F=NbEĦFYx~^_3_# ` ց0Vm5=v-9V..|_ӻz72D޽-ëdຕs꽦. qCff&5&"t bT`xJqLc,𥲘?fy3cFAf%t1sM &zOj~wW0[?m7;~sꚢ%*jZ9;w. L*"LRágPI8٨TZ<ØO9#J _df_b? LrK.>_#h_&طژ7dy3LV9&"`#(W$䓗Wm+l|"UU?Ǟr^\umr[ t @* 8lMF !#3N_J/F@k cjBFgddrcX#yf6K]]9lP~V Bȑxs4?}/n"˾o]i:l)Vzmyl8CL<Ψ33OaVALVV^ҧ.mt[ (\hvr~%(>0INN+J+*.z8m,Oyr\SЕ.Ԣ2&]K2*X~n[DSe\}Y_f`{Z:N"rev@*Qˉ{ %K;Vk'._x/]?+q@BDlXXHR_n]P lj}f Ri' əyZ(YX< 0$-x /}^xwo}ϼg6v{S{wvwV+:D- "&Rm 2 &so|xޝ7>+|Sؾqd/3XYgmN|t?B y{RzEuJ\ej"8t1O*]̩QTH8 Dg5}G^`~֏_޸x:~oKCxmi ~>?ޏ/1KR&ㄨ ByY3B9 P)=J<̿ '%G/hGB?ޔ׺d5ʚ§ d(D 矰7wwڭG^ޱdiLD4bS4$.#*(4qF&2\:$\RrChljCy3-3Λ"ZH34 }jAX`BJ"!q-V^YpUwnTmYA2ˈ0L8UoS"P!a"FU9g (}CPyy +!;(ҋ ZTD1ֱH "2e"r2cr˶/\保ƙd1K:wWZa!b|gTJsΉZq-ӜLb.RG {e1+&2Ŕ/f!{Pr<\!k0|')Sx.HTΙ.ɎK /S@by\W>!p]-"0U+KmO(OL*,)]̓Tig)PMg>Ӆ^<ɀ |3-𸏔2GԄ[y3gL%ͧP 9#ԳtY>˚E<Rbp6t3s1}<vr8Nubg,+} g $\^~ra$=(EG93^lJg%_y_AD&c4C%O0;ՄnSw~Zi;beLR@=G|$cY8<(:Ѷql-P?BIW~p|m;A!Ly:Il'?Ux74d~3芁O=}Zbe'QszN2:$L>jOPBﶿv`.:-iq1g+!V~9Sxq"c<:iy(͏{ 09C&d7f_qqIh:9@a?$zfKgIG?I:"FF#+wBB^,E$$&qEؘ5Zz2ÑX#Fh49-P$d`ndܕ(QDe2ƍ>\HPv,[EhfxG9H*5B_!C.|ը LXS1ͱŘbh&M,~xgEGtABA dp ЁS\TIQ 2r:}6H;HVsᬪBK"3HŋN tH A$ _q9 @Bu*+|²TY?t6Sw"@ 48 g@LnF LFT~HH9lRу2N~b$C!̈́19 mޒ!Ս4:Bv8R&1Va{sӚ9KΥ{bm̧SUƒ;I"ฟ YJ!ibHQ4pr2 #!LuE H.DfZF!o#@aO (N=":id3P2*PAD7ɟ}Y \zI39P6 3P'*~q0toC.s,b@D"B VXq%d>C&K-OQ6F~mN͙:|kX"ט#D{]̴*0 T8f,os765! i㠌I]HJs攂)k}`HNHuBdMs9.f:I?fyx^6L)$W&ikM:HL ՑqNavT41{t,e? O:xax0K#0430Qȵߢ UKjqjߏgfEDۖ:Z}$rr@a2lƩ#1s18zo,Q0=Q2~nx|ey#=RCaH6J?(0age!aNyL'91YrA6S=xZ0w)0b'QSg߁BwdyBy0@ P^6M^(^f 3-} _aq1?7pEb^lk۔0 Ս##2o8z[Z^9Ϩ^,=`hKa/g0[(9ݳ$ DU(fܩg83K%|@@$Foηo{LCGlun^qRagFlG.%1yx܇Ow5۾d ڂ-Z%~41JIF`Fy@ӟͰزI`l8nb/)YÓㅕzl&l*.eJ; \C`uQJf1L+9c8N| ޻w>v=nDfIey\尮|#:bu"Y8PZ2*p[svjf>*DbL$,$qvJb`Ǐkݶ,'!V+ng;J/ 6$mI K,DɌ\ё\p?k Ěхqj|.E]t{$K!,6 [$P[{YM"#do)^Y]iZ/}S.\޹{37Ah10e Ԛ8)Y~,n/)wO=St/){$Z pM됈^303"Vll,W?ῲ/5ᙍ]*OyL >8::L6x9HD(< @d,$f]["cngl!Qe&^N #"FHy+/]q?$cw[S%[վS*2jElY1PnLLBscw_:!s"pxS$Zzl]to~_:? AR+fW*M^rG} ^ڛ<_1%"Cx#:D u,GfOo ?K^f'DŽPAϴvnijW>a[/?Oo9ӟߨ:50AZ& Bƞ^hCD: sn(MoD %% eWa@C!P|! {GIDr*7淞zjMY߮k"Q[X.,=|ExA0GlX90"͑(BLd2J/!bC !Fh vk@ j>`>o"N0E$E(?~dv1ē,U΄ye@ zb?W_~WOΫzB(:+]V+ВږUVE"$A PbyFpL<FYF@d "Yf FpL"B7wEl68B@H:$OyO?…jͶm毼~~=@- DOYPN y|%b!p輅0lጐ00I58Ñ</8m"fB)jƌXdxRR [Ia]ؗb){83d 'qsOb&2,0%R= < ͯy>8} o|soZq]\=`<~ߵm+o#ix/ ӗy< Ap%@D!lFJc%  m4\&r7z|! tDШu/e{6"cCLp#n*nJx=/]\2 F8_[+N?$SgI]wgC-VT  Jbļzݾ[z лk~ۏȼGM*~m'i{bq8j s;=:p2~|[?p̼k}t|+Zh jD@_Í7ڣ~Kt;g:·DDBXz@iw){k}k1AA_hz*5eo*N=tLcg>Ȳ"+9c4!!emyC߬j}n~?tw^҆=lz O>ϳ~MnW"w_.,t?/|^<'gyrei\$ ګ]`@29^o4z-w-3sz˚^ܰenKnX;6}.l͢IW-MNz ^8 +{tz?$ڰ>W"ͺ.fg{・, SJO=&Ņ'iޟ?=F9.׎bpF4##kIΝ{oqzbՌvok Zd ٕj[kS*9/ll]I9QdY?!qkO:o}Ic&جY ʲ_y !Ά9ڄz#H{6)r}E?myU2i_:0 v  JzF{V8+t=D,N'[<9-/g~4  i(5ޘpqeJ$aw F~i# "j5G1"jr߭7;sv9n<آ=7=' Z[jjWz牀!Yffi댧3ĨX=+KL+WWe/,VcLJ"M@DWWdЏiDTDcL2~>^p9|E8Xtua0Kll5=|tU9:Pz+棽bDF]Gե^{A}j5Gda裏qd =r֔ IO"ܼ#m2m֏Ӈd-Ge,aH@1#TxʲFMݱF荷_\Xγҝ:y;n ȑ?yKmpg_"uo\ny$vv$[=8#$c͑|,?'Ue>xmüo`(J<7Dd{nctnffeuu噝@V۽2nNX}Ƕ옙/>w#8WX>p$N2ϧ3:jVcڕ$gO>xOG~; Xoɑ*λIw[Zk<ڶ'[ۗVڵFJC' #c*vS~t/sy$|8dչ%|sgvpJ:'&Ņ k=}~/ͯ985{/L%qI~xa "cnvzv|hH !­i{g X̑Ѷ&x59lX8) EE76WDȈ[no{w~?^wGL̴Ξ]Hkus1٪.^yrn7QHJh0h$r?/]<!tFC@n~|,~u5PT̔ǿO]K!vl8r|* f&kF6K%ҋbfϼxb̶_[𝷍>K'wTS&d-?."\R;@ ._&GCBG/Ai&v'OrO<>GK+[o;rGܔ6 ,;PJzj"P Zh#O~l^Znl ^Y[_pJld? ^ qC%jﹼ\^]_B/m{4^o?;r@i|QC7o9ιjk=c [;O֮[tx"Yq$9E'kxoGdɧ=s{|y{fjk:{V++m^S٣@!l6N@7'8Ez86WC9|oyf}ٹ5iwF櫟XR&[Imoќd'Zۣ(rBAqJpH )m( H(hTʜS[^ Vco|'MֆJs=0@\P"cՄWd% (6PyXit3{Cy&eB:g`є:`ZXՋQ XxMw(=@00,pA1(볨ZMmZm̌Wi¸8cX{]AzgҪ؋*p^F*;<9w0^5kq% J{~=9W2pEx[p_0BHiZ4i9U*ȟ׃/erj|_'9`rh(:_[(p@kk:kJI| 8p×roH~kK^byyM*[17u]Kh+3cC Ț~7C_w݋˫Oy˛>=k4azy˱Z-3bBDI]*y?o1LZPUYWm̎-;_yrg>-7qۑGO}vZyϻ}Z-u2k̉^=rEƫٙD[[_\yoigǎ{f'|zzۮ}3_nV]_>~IkLHNF[rC?;"0OqO)m`9( 1h~=o}CڅO_{M3nqL[e3<Վ#起V[K !C@$&@杧2sVjϜ`2pB`90iw@yOL溰,t1JB3:'i 5e͝_/NUd (/sc ]pە9@&SK>aD2#٢Ub>^FRqH Xj:y6MU5RZ=QVڽe/iĸi%]\iK^A?|f'qIT8Zcim6wڟ.E@ɩO>pfDCӃ M4 ڀ<4bșlJnC[Bm)dVWQ^;oW-3č#/o[fN#sZxUe7d_xS?񙣇>uCGgE665]kV9 ]4!zgK=+--Y; Q2`@l49^^|yMLqsm j#_O.8AbaČA)EQ/+\w-o~T|]O=xcxrY5fqqads̔w/,UkX+79wLn6w2>7б딂? [n?ַs(]Ad wXOΓw'g1*^/]0jbFB'z o?wqg_gkn!eڥSs3zn_8ax$Gx cs82dH!#K@Ia9D $kO?tT߹` \* AXIF%iT@@-V2Vn[%IB% F\zL4+Jb" x5kjyfHMN&ɱT"āTBQ\X{ui׮%}(s &EPs7o*bn|&]F ]tOߦλulkweKܴ^!'DgOGj9z$/N?זWD.TLk QVLQ:yyŠnR|7jUI^?@ c Z&lWn馽ۍ)-gsw}W xs+cͦ3eIZnY0I%֭nAQITjVI"AObass{=}޴s޽;讹>J'.OOOLmX/tM\ұ+Х.m=٪ !&{nimPyez-u&{˹t53x o!Ds'$@ R?xT'gwr8S/$1!dI $6 D֚({ݞf0e)(;pK%C'stRnm,V,<"zePKKhm+/"Q\iQjdHȬG!OUW,`ic(7xP w0^KD1Yənp2ܗGKFnSjϜ9sa^`i-[f\j}ޝo|4z'}9T!z?h){'2qCD`lS+D>b56RLpA;|Ub"Tto-LAxy8J9R;@a:\wܻ>DvV(@T +;}ooy߮ݓ/,~_yliW-#8Wo/Y0GW%(jgԺ8ahG&E{&5RTUwl:kcnW IDAT/..,w:Yg9ͿcZ$<.-8rQ;ΗY;Ɋl~~u?kK0g{lM˱ZT(o:20fqnvz̺Z3 %Z֞xiǎɉFts7ȁIyn5 '2zF4լ}vБs y^Y&Sh'%C@H0>-̯ ;}CjHdnPdf ^}q"oGo אr{|exb` ᫛.B5| %+*y"!~䉌 $yC]~3PVW+$ՕBN7BuȺ[cf#޾c HYcaR7H(E Z%4 m2tk IGfA0I4XF"Ƹg0H80las .z-˼ڬoϿ̴͇tݷ{z=v-.̟J+΋U&BhwD(nV efYVza NQY8]*"ju Mi@Xm$@"HX U X$ ΄@g}[V( gƙ u嵞y2jUZ2G.Yl6@1dDNAQ1)gRJZV9.1^Oh4'9/(+ۏ?ɵNYM6}.%'ODD9@8pxZJ͹A0iPpǑ(#^D/#"]q,&&э*79eUZ(\K9Qv67<#`p xw=|mK evYȴ)sZQ^!y9DeQO׭l@@~12=~&ƨcC?_SI>8J }9ۀhk[đpΗ#c!pd!? 2=8vo9P]$J@(pd#=z :^/|e.M.,>w~Ƕ֑3O>s5(ԝK/qT8 ".9c WuR4vq$wan4D|y3a~_7ZEGBH4YiM]tċY,G@ιbg~pDQ2y @wWĎ׿~x{&s0^<ݬK+ ǕwmQx\Z q%mȼ` bq DV 䝵Bk&IrZL.b3S8 [X]5c4ch,gTj-BژnQcP Vk(B%IgyLZ+VҬD-;k'Ʋ!y ޹(HwJD!AIuLW|YCNASI[h/uNns*.  C ;( J{lZ[B&T%b%YN=ȁv"Ds}K_[[[kd_|衟5ZgϞWC{ϓzV0fXG'/|] EH|x`b0AK]i;,Wjj,l7p؍An =?+yYsG67˶C g2-C @%!qvmG|hڳ[|ăRS'_D| Tnw&t)@.'ٿrfÛyW$a |O R/M9Xṕ0#@7OҕdC#;Ͷ?g?u-N|ϝwlΡ7^?;'V9ZgOs+u~},ʢ='IΤvnm}mU%G 朡xB!%2ކRx{YiCs%x$Ucͦ. mʵ"Y$OXyY_ZZZ\Z_gekzC^sn;oY "˵38qz2#"QzLك:"Zj{}=nVoVN{3!UxYX!EY9QwL(hS2#@  よqD`J(p$IIWz_5@ƕ5B*3V0`^w}Bz0Xk1y1D.+u$(ucML[ddoΊ8HTTWJ 8U"dx$.\Z D A JJ(2NV_stW۽~_/ri^\暺=]]mTvwaaZS$ C"@IZPJ@qT+`JTv4Z,t3wGuW~wߞ]&[a+7ݷcfv{gtX[cc ҡ*㭩Ͼ8d첾!]bWx +>[-ׂڼq^;(U$N>xybd ,&"vS!L~}oxϽ[1)2(Q~:rhdJg'V.2kEBk#(<Jlŏ|_貃u8L4z,~Ja>v!lЙEC;l\UyPcCyoTxJ N_v}/rOUZZU:yZ?2esT$xϯc{Mve[+LFX[[u΅QpY=j,Mȝ0Yv=]iFvbY$*ѹD"`(%ȼ3AB%+ 9-9zOcteentMWWڂ@ ŢGNiurga>i̷o?Q .^Z- `XD@DDD(xO7vLO2!D*O6a8(BWiEd#@qc-c99gVK*!奋k+ӓiYLY6];j5Zguނ7c|-5=VU{5*++~YC!1Q&Õrͨl?rdwP3 FVaȨy2p޷ʩgwRz/, )M7hȷAN{r`kYD5jmuV**hqi߿8 TĄ8GnSy44y$;x`soz-z#5V(N}/?=bџdI#9YlP ^m'_hh?MQ,hB={gZՎy#=cbp4ژ%w'qo`̡6:7{7wj{٪4=~{{>ͧ|O&[ Ϟq1N"/8c@{< +p|i+`ֲ$ YEeYV}{iUR/x"KKdK=:4D{赹BH#tX<2oqNMM/,3Bp-]GD~)sAs8C8h&^ݛo9t94~ eRzYK/}89G@ r8R#dy>\"y&NxXyͣ/-LL,4zZo1gfngzow׳:zj$0'VddSB$MG%dF (ro %2J6(ˋ hNz5/H)k,y 9Ư?zп{Mtuglzbc< dbqa"I(^eQQT Z2/;]"2 #\jx1[y#x঴J2DRumT2V`L(w^0 y@&1*ޡYk6n#ZT`Rĕ8L0cW'R%8HBUKe 1YyWR1M%V# BƁ\df.Ҭ7ki Kkk"/2%)%AkҚPY=q!tw& ޹sl=ysƙ^~}=x#8囎~G[S$"vo:aiU9uj{e~Cp%%p.7V9BZpN;֬}Ǒc-βjnK?o~M{&߻xij/nkc|م/})/oӟWJ0(C!zy  B%39'tYZy<3^7O(9`HDޕlg:/mQZkc"˵\)!OXJeE3^W,VdszEy̥@Ep06:KHߕA/3ӓ֘3g;;u~Ggq.\i-v$L$Q/c<"\h@!꺔ɰdE Y5ybB K"y :@I4I!y牜a/{( f eYp.qk\0&;&5I(TRp@$+ng]܅g_Cʼnk8JIZ!D 3yĉ ɹ@r 2MA*LYH(NRP$XYJbukcr90F vz(D?<, c"AQhmޛږ]ast}ymuェb"EŒH6%QJbÐ$v,0I|A$H7HbÎeEE%JbcXW=nZs|K&Y2e]܏s{s1c')fY!!$sg6s,wyf'cq9̲\PRHq:fӮ 1C9gHuJU"o IDATڶ|>޻ޮ"m"F`wp+\yM:Y, yQ֞m*KI173C3b ,$VGwyn۔oJ]~}Gm>.o<&.F'k0 (~g#獵Zju4Lc]pw};&Hv6ǟ;wsYvC85xOoݿ+$@-VKH#$g1U@QO-g>@ˆ`aE*gss[ÿۀF---|i[pp?F3h_z?&, '6I*z82/fmz zn;<=Y[X뵋Ih[gI@!0E[֤k}t6^_kݻ7c cS_қ;;矸\{p{k* $hC[l ƶu{<-g}615?O씦9sVq194޾]ӣ/_yVom?+Gv|x@ZSlAle,ܬ_ɜh(yE QI tJBdc)˼zoIs`861`uhoϻ"& ]yX麮*+c-{xVuA8r|YZ9=dkkןa5n8:>0nookqyYѠ|tpf19=Nxak>K)YcGQ~1o 2MbHjD0,)w}HBRPg (2Ec@QM_ BJ]F+`,"JL:2VϘU,S # Wd*eۤR݄м-%$b ! @?Xic̬ ucW(Ad">.tk43QpIrT5\ׅ, URT@UE@9_uÌyw0B[ViR rY2<,HYoqΙ,_ ݽdLHXKZsx2DDD&.zQ׋ljĔT: RJYP5:}f/l6Mo߾6ʰ?3EQk湮 tfvRTGxz~j4 }ݻC;Ba -?v\n o,K,ǧ**Weoݺg\쇟wF1ןy6GLJE6/\ mKサX}ٟfxdy5Z{mb~A}+ʃ\nb UAI3D0X@y"!O}ϓ.] *4)y=QJ]b)ʁ AYo}ݻW.I]VV;;eQW \躮(Ee!iA?>-}G돿ڋ㝭MPV[=~qⅦ8BB^G,&#JY/unʥ5s?#+xgHM95pjA/hZ`eSI{]LOBӴ[I"dlK2y[ʛuR"BIMt>]DBXXU.obd:kwzz{ng?0 ?LJ;;Jy,d"\./Tr Y>_ګ'? '=ãAis䔢~j]DDc(z2-hE 8E3RY]=n/ƳKI n^9W 7/~wﭭ\8ĕ\YI VG_},͢Ugxn@ݦy)+Gkol5A߶\?kLJ3g`fsW p:cFE|߇Kqi;B(˒AYRH 9k ;2S 2KT( ŠImŬY=|J]פc3kHJ)=Р1)ͳ3ɴkgY{#avhHC, 1!0wXxDS zUv6|]7c  bhko܈1VEQF'mTSׯXԣEι7g ] X͍lH+|߇1* !@">駞hƹ.vSE:N)Ķmbpy7׆ѵ߽wp҅KWJjћl|t;wMoG|6-@;[0-@~gȋ0^O]kPQg>|'Q왐{d{S16-u~ztHKQޱ5&I`⼑tUemrhH$U2ȪyniG]3_d7t>[Vffa+eNgd|5.ZGkOd<26&1EWM|E2: J$GYR于Ί֊j])] aXtIƄnm0clGd)&r'sE3ֹ+WdBL Dh8IJ"IpE!2~WY"ܻl9K2y%ExPhfnK,bM1+My7UQlmu簰kW1W_zkp[/1+n8kHm9ۆ:FSK;CXkѪ˝(3!hʽ᦭c" "411FGIH* AY BUDNb,&4FR"5]dRHg"^Qyg"2"_,ȇ@. zŢn^Q.aF94J& ,")yh͝U"ʭAC@[2F̀9"Bj 8g%Uy,sh m(54;dbQ A@"bѪ@bKRGʨ<++kb2ɘ|1LӉ,^ohcfeYW,ʬFszQFaݸq^xWzeua8x2)Zӣ5PY!4fuc",_ןMk?6C?(|76>"M;O}}gGv1Gم߽uڋ/N' ٠˭*ލ[VG@ kP8IfyUVzUQmQK>ofer3(2D,4NWK粋K[_A#$/-q}GGMH Bݿwq~gcg} *I+έûn ;6Ο[Z?+m 3&eY*+c1Dםwi;ve4b1Z2*mRC ]wKY8D6Ʋ28(!:Ysh#cuE(@hImuPդ* !.1.Qk?:6{_U&0Ysνǯ>QEQϕCE>=>'/<ȰssxhW aeuh- DF@y"J4QUEQ4@b%2BdXYEP]B!(,DF1d /69Yc*(!2!%f1J( MHa)STro#r QH )Cg+AL/g>Ks]]='v'O@o-NZs?cԞܻ >b6bMWk{5$'tÚ/_ye_ύ¤A̺D%"ŦUW )1#(DQ%gUR ]Yߜ {{/}q߻~q%jkm~N(1^pa+.m_}t{{2C.]AG 9"2v}cc09wsX|eŨ3$,*>/"s%$cKHqQ]׾ʍ?ՕAJ1$ E$ 6fWmƂF ,*b, 2"p`ڶ6!DT3$z*bKI궓ALr2cH)j4c)Q(+n{{{heew\z^zI7^VUi+"zw[έVA BeՍ:HUiż\hy^GWUŠnݹi1ƠyB$d !@, $ HDFk°\E aE$N)qQYXAN,AE-!"kCȐuI:  )hI%t-mEXthCP%H2د\b{ I{UA,@%wY4NL2Dlc)e{c9rfКصBf"K)%P֩9oCbK5]"d>ZgؽÃm%k'ӉkS6DfumldTDb$1Y138ϳ.tdݢJ"cczQ[檀לn&Ѡqwp:ꕽhhMϭo^?Z>yѓx2WϪohﶿXK>xU~PfL[Z撐e@#YB5K.e29|DKNrς"hb <嗐 PU )Ey}ҹ? k?_kׯyQ^t!nj)(|Ά󞅝9tMv`um:޼yoܗhP|oW2 i\@<ӃR)x&1kk`2UcJ&~[Oc3G.?5hUs[EFw.77׊:߼kaUp2K>Z |ڮO Uͫ! )ȩc?B|QFw ObkgS 1rosczzp?_ydnj //1FUrc&lv~sekl_ܥ,;i-+9߽sk}Х$-dq!dkz~,O'[[82$BqI.Ed5dRA4K2(Hip\,7`QcQ$eE֪@AEXB ;)Yg-ZKs{u!=fh|n,@@1ѠĎrY*IeP`n Y4kÞ1eYC()5)IJ(KeIm- ?QNXTp9N:HsJSJRmqˮd΁jiCWlXV6e|ХE8kqZc@Ae5m 1*,cM)][VүJD̲ZD0)Mu6c*n;Q^{뽲 CvO|n^Tj1խ^++=s^-"Y`QBz i+oξ3}m>XE~F(*)-PfրA%gGpX!(L-A B._r6|#Oo4>dzlҫ>am҃,@B?dԯܽW6m ܽ=v+k+ISWW_{Wߨl6+Kۺmj" IDATbm_}a_peůTsd+ЃvRRDD>3e\D >ɧsG`{I;kɠWYUUyf ~uuMW.{N=zyg~W|hrt:sW>V!H %m;@")U`\oe=b:)?9>%PhJB^g Q|xʣ,"ΘkOh4 J~nPbSztn}my?5i{{_e͕:~EV>9BУI#>˻YY,CE FIВDf֪Wү|νg{<~90 zy1V.Dᘸi:%Ftmۨ&$b7#$D$ %V tm Y(TȩE I06]l‚v(ƘbHe'qd3ix:Gk]9FL1)99{WkrK)ofjmnyk5Bօ7o\~wEt}uxzx MkBE3|]6$P뻮>_,j2 ig $2UATQ) */@E8T XGffU@$D Hd#"$ D2i8m;ڶuy1_4罋1:KZeH*ό$00앎r` AQRMU$*TerzHyf1B;fʬ dldQ."aX~=Dֆ3|fzeN.˜1Y5uS$1Qu'iC(js.'" )%fDl:Ec*ˮT5RRBJkc]۶!2'N ")e< MLȩud뛽a0umxwK^Xܱ?u`pao/݃'`*+7oݹ|~{={Jk)~+T2;: CV|SW|cW=}>WvO>{~jmlwmBzȤ)}"n(<칣*‡sۮgOR$@KgMV^xzY2ac}E릻xiѰ+#a2K8XBUAC諦ޑX6]s?X?oqI?QB@AX"kz?һ7O⫷ǟxrp65ӓKmnK,Y3E`=9>9n̆Ǟ?C~qkEQ)Pl2n4]VדM__Y_WXi>QHh~x+EQ//YQ ivAb НXBam,2c(v],[wA7ywtw_{CO^9:-F"Ƨ~b$ _/|a6ڵWomRLgA")B\6^5jN@fu;\3Gma̹ȈX8pr6u #h ] 1ƺ !&Y4-s."6!'nK)Ť'1U m6Euˑ(.Uj{w|}cVsGUf.8﫢7)f:ѪO(麮Wze)U$LEELDȲ.TԨ$@FE*rJIRIHq9Mʲ\TFX!X 3#Y$2֦V!PgYC0@m]3q>/RxI "$C`_cw$D wPWY̌%Ȝ(wN89cU YΚȼd٭1fVBbNmu]KD]AMIb$D@b(Š,b1|I,.`{ 1Y%BL'hXEL&mۆ.HVcLI Ե  91*&PUDg4 :3{,&EvVWݽ}?/ǟDޫϭ޹ucm}\Uݸqc0_~k_'ux8V2Mwʬx@=?0?:˿ۇ*?Q/ӓyEhBTw޹yrx{82g+wG?@[[koLvH Jg Oaid<1I@ |6˨.y1&.nwog6?;aO|#O>hQajz2\{7oEMzFʨk+5%ZCҵM}4M>r,٫ӏǮ_ ?F)KYڦ*( zҿti>cOoܻ?Gzn? H621X01tI uML&GY^ee .o^ziwsr҆A`;/jk{ەټnfӕsڐUUŝwj2_{B~ᗾ{a9vr_"P'Es-=Q,͝ $"I*H?ĩmȢIʙmE*J!N J"I$R(۔42 Tid2sߜv"'e ؅B ܅SfQ'9/nw3kO=u8N!ON姮?#/ʧ:t~ZByup4><BbXʽ1ڥ?hRhϊRJ1IӶҥHcJ,1FkiB2q:3 bA jTZ+ sg%[uZGF)hH].LfGa~ǞOמּ+WGGc]٣>Ɏh}; "ޙϊox}=}3_3 s6DIqemϾ`l:h64]K^xժ797>>յ4NcC$EQ mbk!t]K-Km Pq9g; _߰}{{) 7O޽W_UXݿ6M&3cs={;wsJXВFhcc7~{Ϝnar)d.Ţ޽pg g%y4&"5͂S1z~O~'͏3~3g4ɴI7f7_-&h D1ȗU\Vx~rE![;Ulb,ܽhBVu`.Ƈ!)qQm{LsL|5u2OP*qeJSHړl^\4Mz''[/<ׯldmozx|}9$!h޻fO>~4CKyoE ˩GNQT 1Kb5R:c9:$-˂S+CY{roĶ.[p˲@bǴIYY PUhT+MYC}ETTEPEL)$ŠDcfQUPm&d] d, D̻̚$rDh<o vXQL, f BB$k3tG܅ !$,ޥ>iR&**" `8CLmWRRX,u! Ryޛh^ygy]ezӳpfkH%dKTZ(ň)v,c'b[@01 QdC2[pr4twV{}ۻ<9V eBӲM׏ꫯ=}yQ $IZ}M6ADB)ŦB<%Ab9An`ͬΛ1ƨ$DI1HJΚ aΜK)Ú{ bD"Մc(rՔb y{eE|͇fEڥGq_{:R '(Ia?9<̳l;r`Nw;o?m|w$z=zMڧ}q<&.K`V7nިj?Y,{;gyZO|?OO|eye]C|׿_ſ?/}Q)c߭$|rU5?̓OOF~Rve?<=Dz-q޲7o.^WAϥ*Oѯo9_FoESl3Kׇ??s'ᄚ4uEhrH|]Kz}X[]MHj3kWWb2+6/Ag68\Ļ++ `=27ke03w0*#m<O,Enǀ;;{oř%AĹ3'gIDqJ8vڰD"#6M`fAI$YC h#!C)EIE40LTTB dY XVU 1).i}JP5-`0H14Mc$RrmgmJ0Y}{w$ƕl+m[my_]/rWw7lz~i2;5I^Z7N/*s<9?Y(s2.-Z1qkkɸ"/!I)UU HDRI["TSD9I1.DD2 c4CQm6s&B2ghJ)ER i3c$̜Q1"$1"&gUu!Kp:%1#;D &PcU}r-*rx•HIbLDծ7u3N%&Ԫ ]Jm,)"PJ@>(iQ׋"D"1ʲc"@NISIǷ k8&a1Hl8d +,}@ДnmgM @Y3[fQ.gDŽ7正NYQ}7O}T%Mˣr<.]#^_ e^ֳímC?(o6+t؄o̤'=Yķ'ih}]W[Vp<~{[ ]Lcs\}3M(6 Fض&cxe4\]Zl(*LjL-W/릺r+_}qsu/iQ6C)k&:NIYS :K6UHܤ$g8""b m[9k-HQ$5M XzyeLv{w/jU5yfk6> hL'pZ]tyie9ͭjz{ͦO?=,I:^8{y\'7nﯯǣcZm-WؾQXYZvpXr)01J)$" ɴmmPFB !áM"ڊW U1dTD"̜TPEbB@GBlST2]qf.ψP R9f\) و!`6 JT3>Tmu0(He XBHl,*LP|9@ރ1+h))E*T!i:oHU7;^;?}~㍉aķ0Hd\뛕*ZQJk#u?GE$$QH N&N´]"'.Υ$tlID<=ΔVW7{Z/Ͽ(zn-f8%k̇l[ey$mn%΃&/*;yϓٿ}hjk]~{?g>~;{ѵ[ i k'lE;ϯ*_s?_O_ٺنXc٧o1]eO ?c߿40h4,rX0 PH{b>#1fyu,b>狘l=i ^ۺyl9?-{m|W(`'C!1aqQ[5$QM)FAEL _Gk+pIeQ r@1WXϧHКJﭜIˮG̐|&CcDo[%b𒢏GXch}m Tc@ ac;V?`$!/ͳUi2FIpKskX _fǃީaozr/7CU^p2gH>$gPUE2wYiY6mk!BT8&d,D"D" $$†CS1t@ I IDAT:G9 P'tB2s2ZMޟW5l0NnW=k7nޚMPuz_-=`jj{$14 Gbۆl]GՔɶt0s0Vmzjj3LJ3(C$UmGbCrjDHD4$&$K@]DLL* @"j{\Bpl|`dh}@Tn/e5Ծ,[I 3a 1DSL2[c9296heak m7| -k74/s=tQ';w3ͳͿY뎱xkFWς5M7Mol3EnD@< RJNz֎@TRV&_0>G5ʒO]lt֞e~'u3=>L֗oʭ7\7o^{yG~Cyյ~ǃ$*@Ya/?Ϗǣ/A1m0D/zqo; OO|?>SB"Ҷm`S-Wז",mnsYk+ۻ7Դ2 Ua^g7O?_ F'̎6tL'=>N: Ŗ?O %AϼY@wR`,̆4Ț"+YTk-lA ŦhܢM38&Bse ޷MJbCJAA")}PM"I")0*yQ( E#噳` IUjn糙s9۰xl{R %ڨdc֗k;ά {nuxzupo%"4ޗѢ?s^Õ[mLm 27_7x8o ז+" .4[CAQ͝I"1`:%D Ib`hÈ6cuILh] 1[bQ!ƹ,ʯՕ}c w^1w~S׆8{8#յo^޾[ {yQ]73,?pW]49:?3$a?Fb9+ʬ˖WVWpEa}}C`ff(TM3-Mg1L11&FBĔTeBIr M(*1% UL:K=vBB2נݻJHaQ-*Xk״7jZT>DԶч622ijw]w7M\C W\98<]s?PC[|A?U8Pz,@*}?wp/|W+Wv/؁$ "ݳwTrRH'pzH7{g7־ů<ׯe^^/sgΞ=s mLz̙ys+t捦^u}ڕȋ=:<EJ!CEVl>;+f{Dž qO<^|'_?lZo},1JAS]IJo{6JڥD@dO6c/4p9HԔmd*&PJJ*)I) B @|dYr^FT6/v (1z"bJHMɫb&)tgu (c7hBȰabecӧ~ouc^|%޺+vY2֘?|tue_CCTgUU\vmuyZ۶!ļ̛E4)KgmÌA|>_$md:(Q36-3c\*҅`&bL :IA1":B[#2BLc @*"$)!bDD ]_JZ.EC ` Hl>vs}q2FkHD3̰֚s(7u.te&0t%FEE!>q(QkZ|hC`UDF@bMy) U坳Z5E$"Llcc !zBXT$$]z0mΟ&7ݣ/~3g<+t?#{յ^x_~k[[9*"om:_~gV{2vZ㛔n }w=΋G0w%'ͥpXxTu6֗ԷWMۊa ClXJ odkv?d(*1 ʢ,pccZՆ+7n=߸yk{ͭKs}s]_[ z3>ȃwqaiPboalN\|hcs3Eτ+DQU.ʠ,~˞{ya;|{~>4^QCVS7ΞYBN;RJ)b6O/F㫲 to++d5{Ѱl7NÃ[n2o(kWOΝcvu,s1``&*~ "T"i@m{ε^RtRL"))muCL^Y"t>KIA TtBآ(:I'$!i:'I` $ F!tQ[eYGh7t1Xak-3gY\Yc " \^H!#.+]WVnޘ.E9Z^uk&3$k2wM0;ժ o?՗?mHȮ߼a*}wxԷu7GSqfmɷQH'(g̟&_~oo;/9sꕭ흃̐ˌOMuV Fr/|G/>@$2DJƓܑYe]N)>3?|;K/>VFs= 1>p=âkScjgY4WGof)Y-[4}-"1tb-{b>dM^Qt{g$+/tIK~]|{WNm ٝ݃ï|Kk๲W~/w=l2̋!S"2E٫W6NɬcAڥ3g7pkdryxu`C&eĖ]FH{qh!Xfg3$ӄ:釞yg~{t:#b[*&>\BO=r4 ,/)D[tj\U)z%6Z4.z1?\U/yQxRej1!kT1()G˜IHK0*BAc2NQjjc(z5ȜsNևeET`PAeT!"!H }Yj4J& 2hŢjv4_4hLXflaͼEeEF BU3kĚh4!J̝abX%Ef4$@P$m7>zD ,%F6-" @b 1%0$ EEmO3EMe1~{TAMbA͆e֍t:\\zz0z/>x{".>p(3@p4 Q_NV):FCy׶Nwp h 1x,=w9,U["w+ɪDVLDRJ"*) X50hZbThEIIJJ& :RJe`"3KQX%c: L$rk yN2fc QW҃lBj!dºˌ4ZI1SJ1>g^ b$uQFInüpd0e'1%QQ`6d}}#*VUkLɚ FUVHY'&12$ɋL9V:/)h7""F6̆}ZcD{b3k5*.d-Ĥ9+\rwqy^~ҕ ˧]} uӆ kOcI?ڍo/{3^jH?"~@HLԥP "=g!H35u=ꩧ.^|xe5+[.]<z{!w}v0.Ϟ;w=>ɏ}; Qb}^ٗUaumã,w*py[WY+Kpa|1IiU[Ϟ~]xi~ͧ|RB+M^S-|[1mMb-_tiey%9K(dilsg,{W1 PGsʋ#Ʀ?;tt"~ʏf*M+Ο9yzkFU`W~__˻{j^U1`v1pҎmx1=o ^h-oڢ'o~`_# 9Vdշ]#uNzz54KǜDPڇ{_>uqw3cݿ?"% >owu[;+/]2V]=*b^H|ĀI!ncc/ClbjV}_=~{9_[c2pٻ=sםˁЦ]糪*h&D7kXDAtٻNQt^ZZc}n]뗅,Sh2LyW/_~}[[Wgu{xa^7>d'(Btrp}}} v1k9A+/{ۨ:^^f6^},2k̵z*|uy˓ã`0&K|gNbZZZgjNWoõ9, JyK_zs\]q.\̎}(*G_?/>|{?ϼ'w׋bk[g67O1iH)zɼBڼxϣw?vy 1zΥa[J\We_ s w;}l>wTC"/VN}_=Έm궩 S]%UUÌxzccooMd^`,E:qj ѷ2B6X8 8LuD*}覂$1՗@"!tvs$$F/3_bHK;Y34 Zːe{>zb&Ȱ5LbafHmIL1&e͜!h)zEG$dkU$%!CǎR(iZ}}'hz1FUUX55&8/9!m#QObJ .3YlZ,,GGG+k<3k R !F)s{~zLh$k11ւ111f$DFB)^Y qT\7幵.% &ղapk{/{7v._~9n=gp+Ͼkx{ 9|:YrG1dqbt2?Iɿ&GSo {$P?7FNoz𶻤'WGP'TaV8P1Io32e{6xӛGr}mŗ/Ob^<˜}lݸbUP UEsC[f"$SdC?ZC͋WS?=I8f6);+?Sq>)G^u_?\t?P%E%{γ6bO|Hlen |Q(ɕ-I\2,=.o76ƣx0%U<5QTڵke[׶vo(_,ȶZk}Δ';ԭ{k.IU%[-M۸#lpn"x i&hنXvӖ* %TRֽ9i߰ad ¼8#8g>gセ4)!7-sU O,Ua~& {kOOpz|k|4޾ssڿ|٢F׿?;w{$ʲx*ݴx4,rc:;nͷlU޾yo!JߠC TPi[(Zw?Q" !!Twk]k|]ιϝ (SY\vU??-oDxT g+ :̋ŲMۗ3P>ժ;7SBb1%kJaNT Z7tCMIRb&똕KYYc;R%(@Ɨ8?}׭u#|U+]9gZck|Q[k9E͙H9FC lD haYSPaŢ}˦`0,TdQ0+u6Ɛqh:FJ&PE9DDR=R%f6cH3hİX2DsI Clૢ: 8^,ϫjP A@Y/ʢ\m֙D+ ߺx4Yo.(P#hl',:l֭oV1s5hHEI.4Mc3lONΞyjUd2:9[nw*4]UEaSV˅wEJ ",E 2JI@%(`"iL@r)!DP%D/ړ٦i'Ur1F4RUeU"HYZ֐5T8KD!%Yo b|]0m5Zc'UY}ᇜr%L)h!d!3hM;f˜b{*|Ҷz#,,\7,1ƺzpTUB"RvV!3DHsVUKh 139hUWyp#dfk-  WX#J8 zӢSDk5S05nF8JZmէ~x{>^<۷o]邵}Q b Ah?hbѻ?_}xNX/@~xYxEEHһ{e"»}Ixf߳,1Rrx<m ]>*ܯ/X gG t;QhT>ן__=W.3WrƔ.Vˢ(si>?}8.t19'T12Mn6i|?稜1qlJpѧMk?_,Ș/?.)Kͺ_g>~g/huŋ?7%r+͛'nU&.2Qz|tseamb:7_[vblЕݭٟO~ٖ]Pj:76OOof7߮&1qi@l[U\ιG22yn:7 0XVA$BdSx7lr筳F awa4bB 6 s9K̢1,!f&*̬)FV @k@[( Ƞ\Yu9ukJR* w~Pe"i0dΗ9g&L89xHAۮ2w#h˦fmϬM.U5е5 jy9]"Jf̶c cɸ YD-ɴfoM 5u=fzӭjy]9c.p[hݦ*<_|Q5V} QD֚9Hn޼5M3D@e* 25l W, @UR3 beAX˪Lڜek k@DBtΎ *jU.ݬ.gcoHG—7)J0 4}ߍF#BP+DpH|*靈QcD5 J)2۶]cbM۰Yf1>1-Wr}7dS eQ,9G>$"n2*@Q(19gg8L@.K(,"*LDHD)Dfa$`BJH3AC,9h\,sHlbfFJ"9_M,WonpC_o~ِM1^^p kwߣ07xq1,;=C|WV//2X=c8TsBʫ~t{X<;=]mgg}~#qw֫U%ɐW j)(#ATգIQ$)>͙L~bjﬡ,fՀsHRcB8G" 3eQPfE VD4(r>PUUAkx{EsƘ3%bnM't6K18[5BXk B4}C38EA,,1&,))!'jY 5EBaEPEQaX&dUE$ @F*jĪ *@hdU5Hb`a)$Bl6&gEBϜuEImpeմ!Cv}f*lͪQ"9_.X6DD56hM,1&_Wd(}Z7 '&V +٬i֛dZ:eUkl;;[A2K5Wh4JQt<YCޕHZCl Ng[)'PU; a`FRh3{4@Hy0 '%+, %PAA sg,1q鼁ҙqǥK_E]Y:o:[T—єRJX5DSB$D#YN!SLHڶmGmׇ̒8rT0sJn@ʪE*K9 Y8յuւ1Է(fCX$e&20Ԃb9Dh2𪉰{Dd*RBr.q裱f0ZŔdLJRL:2s9BF߅lb.!wdd~_~Y~~t T;1Op˃I7{Ϫ xwEzpO&_m}Q~0ޟ|T[_wW)nG'?2~iqARbNtOG,,KۮQ7rs`w\*}O 5W/<;=Y@Qԇͺtҭ*l.%N]gL$Z5/ JY ԇ~kc8''coukg/N $njuqv\޵LF5k@(npLS;\o~~[xnu7nٝUdc]|ŐV428<{GzH,4Fnꦙ^2dA!+ M,l-:mC)ͺmk޺u~z:{GǓYO=̻rpWE|p1lOυi2\Qxc7I+y)O||+oy>/7r2.%\+WxĪR5pΆ7rfaJo$-LH c1;7YL}%[w6; QEU5 kzɒ@CG @Snbt2MH0xZ %C%k%yoD4I+.z3*22כM`7U V"1eI} D @F)Qm%R"DWcI} eYITřl,FAqS:ˈ2 z-Lf2 "u9[Є%yEZ"P\w-{!ޡ"cm8bvO6}׏'kU=8%A( :_UiYBO[L/-Ԣ*6Qᬂ:_XZC}Ն6tgGιlcP1N‡ٞOˢko߸v)b;/vUe }=4]W4!3gde"@'H73!KE/Z3#m,)0'RPU8,IX2 **9*o0^P gT"`+J1dBc "ZS'f@6R̨ȴM̢Bz_0sr|) e&"c<bzELUgg˪ 1,Bx: IX+0Ѣf3L}Unooǜ (v][EmgMΒY'\Ld$%ə!U2xG,:0SN)fU !zm%rN"LTZM]wqwgbBUtKj6gLNK7{r}o1[$;x&^/i]{Fxw^W=Guy*$MJ9~:2YƏG?O/ݟsO|Ogf{l~~<=R _xL'w&4ۚ\׿gѽ}Q!&X&yf|[t:ۖA۪4^RWCӃ+]^Ͷ6Uw(ͪלЅЦ$}]{woe ٲo>t?=C|=smF;{EU+G1$vHXua٬˲zTZ.weU[XھSåK;xIܦm zZ#"}!U=?_eij<0Z׫uQYuJ&dj.'GiΏכiVn>wGY٪,W˥!!lMgzZmgoI!mz+].WCϾϑD,]ԏЍkWo.W+" ܿ9ao|HQ@Q!t15駯?+>s 9Kj|w_x>R 9(HH}USS2~Y3jq)m9Rv 1 ZqE;Фڇ e9օ'PbD,֘)3tAf ?BjlQ2$ }m.u:Xdsv~RxOdOΦ) Ut@]!Bb bEa(Us>glc8sﳱUH2$C(w&E; |)3U)@H q4M;Sg@CLXgpFAUhfDfc( zgch]HS$u#bJ 9WrN>l&,lcC(ˊb̙Y6m[9"%sNCE,֠uSΠiϗdb6e]gq% }G;;}Qxzrz\x!EIC)EsDmrRD:5" *!aZ w AD8(faf2A&* C#X[ Nʲ*A)h̩J/Y[ qfkҧ$k/{CU9edRMX KLZNqxW Zf!cTQA28N J/֠%*j<e1eMQ v]Pxd]P ǀ[9/˪em0 IDAT9`M9!!(v\n6ƖG'!13}ڴ K><9U)%]5'Bk^_ycu9|gh-$fco:ݭ?ko»nzou 0#.h zi:طSC.T @sv:}oIӝm/M;wƣQ>έų|NG5Еq}饗yz#sA8=SWȸĘ˅1\-cti7ηwf[{G۬fUX_xg|9oO{[;HwnrKwf[[fJ)g+N9η_{MfzuP3v|Y*tIɨjUtΎW=:>ƛ&Mn5ve`%oƥՓ(ˢpȳIeՕXRxDP^VmGޙɨ@J"@drNYH*؅>'ombsGxլ8 g. kV'ޕMSbTUOņwϷ_{ͧ|O(g[eӴǯ]N?^yn~\NF/KwdzSƨè /o֡s]Pޗob}H?H$Bhk{);r?L/.]'>إg˗\gEQH]kכfӰrBʣ̕Ӣ3vV]Q֏XFeN%#r6lF;n,A\9!g(+-3TYݷ *cJJ|Xc !SD E E0}!ʄ y0UV|Y DǮt"y\׈nnx2 \ }/CXU]B/ u=96U̢ CL5) 9&$ψ@>ǠI@>( aci5GҖjDr*JT3Kl b a_Ajb"`ȹW[mJ@ ih;V]."S$BΒsYD\UUTUY"(&ghCٞWnڮ.}lZ"MЫH<ug[jZ^|^{ƾG)2Ǫcd^ď!ԅ}N bQE3f*"0:@9gAOVw!JM 3 &NA%3gu.$1Eypuٴ!KuU k,La5zQZ 2w{9'9"d(},Fr,)q$ gbsf2scΙ2 &hUMfn. DsbU%^$ZRȴ 1%WUQež]ۍǣ`L>x_Edf@ !3us66m;Ykvo|:k'S %Ra&TSUGhsh]GEMzw{4!^з-} K/x_t3\+G_v_].ٻ ~ V|g ϼ+*I/aMQσSwѿȈ9Jwt8n /8*F?3+?}~~O[OqjSn7mR^L&7M_um*v[`wM+yͷF^IRh1dߞAJȁtq)QtXc͜f픢J&7(*)gQ ?mVD@9s*,Z.y@YI߬t:Frׯ?2'wn9ʪFbˆrm7nTDU7?:MrqM6fgww:v1W_~?SϽ GqwV|E +=+g~G}xtw݆xY}@򽗌T"%I5 ʃtKBZsCt|3?Gwahhzo9u_Mn/[댵ji@&g&WzuC>ѦQaV֜ -3AG ޔ09I=^ޗdl=✌u!t%C9&g ) } Z8ƒSY591#f9RvƣCQTfc 8c T0X2ZNIU(||zcL.X5` W `}ami2c5mJs̾ a 4@EH3B 9ɀ8 b3'9h\:bIŚ^DUMIsa$ۇbˢʪLUpZ tQy cJ Q]Wef 1Vc}LB avEY/*":" A̷94q UeuA g:FEцPV(Nϯ?tt4˃f}|tlFbqmk8=9{1no휜SW"aŌ*CRP9Ǩy* ,E@DIE"WUXTN%MLY@ 2Ebѐ۞7]pd,YD}I QUԅCPUu/4FYdb4r91F.@w`\,X{oM+Cןo|;>ۯ~G;o /||#g=^/Z~hF[8}H/ߺ:3{ז{ 4_^,pdPs{_/}z>En:ٮrp%YϿۯ]zeXN'[~>xڵx1l&e>9>!έ63ٟ_899&{}?ݤVݽx3ʆVAlV).$@2ޓ]"/N޸>mDUUf51m$ `'Y=>l>ekq5jt1#Oe= !֋}C[Eۇ[UY8C`26l yj'd:6HYu6߬UU7m3kBdaD 9(kDc?9_1""Cm,,z<6!wAˢZ6]zY@,*_yǜA'E$TozyڞW3O.NoxK9yr6*׫Pz:*i^Z s1SY (@ֵ6;?UuU}m~^89]w}::G};'brޒnTss>ٸ^6ABۣQBWU8YȦ sR"+û 1cXT%[B },1"*`@XE@K_dg} !;qdڃpܨ KWI ,b‹@UJc,"9c @VRN}9gYC@* UY/ArEstlZ*!2sLl)5gA"DY|Yoڦ,KeV @N**mQȜTaXE/ 1 N|Q K"mĮ&i^Fz'}1A "c(ЇzfI9UUݬhLb&c7Y 7/H~Q=gd2ͧΕ_z}_]~*{J<ć1N]̢{ɂ`-B"pC~z}|?:Ñ4܇^?ɟxS烖#SOkMo6ѡM&㪪?}]c"2tuvrFֆbo}Ї}⑫7~4Ξ/_TU e9ۻj^ei Zdl=:9ut |xrvXhc䐌!.z9[ жDEU V)Eھ $AD:[,t om>EQH19mY/1,颵.oz_[_4m?.m?ׯ:M_ߙUEǑ3H::=֫oo6IZ+wMץ,gŜ#甓TeAքo"՜sfα{g~cOХ֚ڶ|€w;JX<@w /WnYpl!/C>(ărUyᝫW}秫ӓrO=гϼyK\|GTQ+'$sߤ 37r%Acb3o6-ج'V0‏&6&4Ut\wdEzo} ªrNY)N RJCuND@" eΉ@ϩaY`RL٪,`4"&ϖeY~jvs{kȌ2S:$!TH3d0&1`)3BeY2hh9'vb4N8k;8:x|rZkv桘Ug7S*]qӘGbTZa-zHU9;GHe~ q^Ly 7^m*ӔlK)И/jOCvaSSa݂~wE4v t˵6b]߷hf%MhMg&K?W_{0uDa $`WiUKٓ/Î1ZkeBF\hn[-a/~ᘁps8J){v>!cF0>yεEDT1wn?cuāWvK./ crӔ}Z$Ft ѼK߷ّJ EVBXtg7Ӌ'>frvہ"z0MR8j꙽9/LTS 6a4<=|xg~GykH@H&OUlŽR=G|0!)Is8}|;w_={']؛>z۷V'gbc\uJuGF֌!R<2׀)83d|UjI*DJ>HU pX-0fo<{'G)ecO]| 72sسsfVKF/DDDjCÌP 3P~g&0SUNjmNBh1h44N5x,EU4-;i4baUEİq>:Qhz含5]'d!7}h>) jbڦm#36Mq!ԜA%ԴԒFRKa1F|sib!x*`F8C# mMmb MSD#ƩZ84MxrzԶ Tw4&MۆseHĞՀS-"bEPvώbqժ{~q a164ǟ߻u8O~9?g/f^B#RJ)_6?)fo , hW3fw^η?9[}iwĻ~7_{û曥ز?Z4Y >| w~[r4|mr4-u)t FS T@2?\J)׍ IDAT)gas.vLowMRNIZsc_]]s3;?M_-a8==ibL#RԒkOE >6?!`)3ܶ2B) ôeGi!8'eنl)9]^mϻEbX,{j<vzlgROOQDR}aiRf1NSZvM5ŰH"ik38v\rIo:154KӰsų~wvn/@l(2Mp힘)}m6,Bǫg;w|~g: "BvXf"v> y&QS jk~[TVSr @N"fGDo}׿7}|tq=x܃|34}}?_[2FbqBX_ۏ!tȹhJ`*29ۨU+j@C:4m'2Sı*5"Af X7lH) ًʬvvV:(]$h;E0QjH5 L锳#~~?u>kEu^ ʘRCGTTs}Pt*ڼ9j4-UFbeWj`œJ{gsIjJЁ j$əwiۇ&ۈTUjUZo߽'ؘA.|g!.V5]"MxZqg{$VZ5@Yf"bOxU΋4N^\)\[_h*08GM̐1{PSpdx>J^yP؝hoGݨ4/CL2)A)E&FM?fC+ V!BʂȎ;ds!VIT{ܬRL̲jb-T$c@L!@ג'(:t12);G ),` "UՈUEDh Lg+iqJerhXU־_!#bVUIh6*UnH=31{r.!D"^/}Nm:Kn&S04ڤ|l88ŬIEsdG(*D\rQD$Eq[N7nn?8[v>8CT-|n\/iSWzH3qvB}Y=}oS_oeVM3GR,@oz`$-v}OǛ,iT[TJep?^>LjjxrrZ?옝vS~}&4J.PUTq,GrQ$v>z7V{rqFW4aX_k///,33iaџTv>Z-<3 f\\_RVtJSٴnw), H")8? %YM-Ť " Ӛ| 1Z yյU~Z(ĸz}urr}k퀸Ռ)ƚ!ziOU׵8Zs罊 bJ4e$yjb\@F|-e/Ұ> ӳǏ?b⒑NΏt;ܽw7ZK= ;Gt||~oU  '& t6ג$T(`x:F0$%O9;BY_8HH#!$SG`!Sq^ +fsMӤU4McKim6]tӔ1cQbg&*{^.WfݵK%POvvKj 9'bVBVj W۷֛zX˶@Ni,OW/>{/_?蚮<>&l)Mv[E=3l[`)E1/;4@0ic EyWƬVs)9%{bD*n֥1hBL2*w~*/ Ҝ/Uo{pOqߋ%.F PRAEZ@چ9m߼xY~{%h^_W"F淾ǧWW]aRbZش,bl]rb''u=xj MޗTss5b@ Rq~?0гW'OO)={\tDTER0bl?w>4G|?"i(%MF6Sl.n{;i4m6Wg_Y8`ioZV}RcpfZy]qMd03֒al [>wm=3Sm%xJ(;1W1~OD0a8 ۭst~vL a8쥦mG'Ut:^s>)?_* @9zl_|qu=Le<ÔRa~~; b`w9iن!8a vRaZ&+44w痗9zO.7כ0mS_z(?3߹Ճp8Thto^! s\м-w+r8x ) >z;_{+OKɪ34- ۝c%,ZEۨX^8- UΑw -"a6UDKQVi50&dޟbaq)xwhHZ}히6n]zIZUڮ{לú*{S\ԪD٩&@bFZ> b1Fu> #)7b2_x<\ڶ1zp8u曶oc3DRN''(c90TT -9|jh"jb T%5"ShL(CȌ]`s @P8GքN| {&%aR&cF4CӶ_*;\)M3u]k)3ӮkywM="9KvBv0 Def&jjFDetέV!RU (\Eዋǟܹ}lHۄcL$z::/ L 9b<Rm4'e Zj"1jer"S>vc?o6Q=ɲ\5M.W<3TcƳG36mCR]96"&6F i2ù!q25McZKEJΥip 9t.0RkLTreRZe~i*3V\ z站TPkzUk.v]w}_w]IDs7UIJ ~ެ c4@N9笪{Ds30Cf*hpCw$ufv~݈q1s|8 ʹ\V!Ӵ\-@ʓS?n]wosU_GG*җ7sU᥀u~tl_~dаUBKMُ-V quәKa/ظfr q,EB)g0Y""xџ?{rx7~|qڦ9;|zfZ??{?Fj.>bX L.9/V.RBtLA ijU KHYΥm%J·ϟ>}v1f|mGo<:{**{p}W)tM;t|v{ب~?yᅢfdhϟZHi疋vm#v\swSb&"m9yr\T0S6۶pm{(bˣsh2ۍ)C*/{<ERs]cح۾_nE>W_]]]4m.?gT1n>g[؃M]oOUË~pq;F;liېR5AtE x'5s~!6"U*8V"XwA`JFTԴ)cnbjl0Mnr.eÌ9?y>|v0˥$(̰jEKbKڏhzK֋w"5]H*{Uzv iJnz^{\þ$@5/Vj%4a'*{/4-k@Gtqܮ]ӠJDPUˆA 2I˪ GAH<1Ւ`ƎL E8M#"yGnx-~i@!Z)vߋT)뺦] ̴d5-p7XR#"8zuM\WGG?[g'.=zc`r'&}p|}du~~?LtZkLT9/>k^Ǐ_{pVx篮6"m0LBh@(Q ` \bٌO.z9ӳ4Ô1/;TQjY(3c+<:s3.0"q3R4xƱ(8¾(yD`$7 s8L42;D((Ts(TļsPT 1NCpMZ3|XEr)m T͍9'"!j)m7McӴf[o\pn.R+f]MU%xR-ݦ0o|ou<F/Y˱ mÔS9})f?#/^@hܤC^DԢHob7̔"//9.D@"ps!ɟ;~?{?O/Yַq鷿Ç=[O+u7O{#;nn:ǻQGG'f8 4H5iHl? U;TV&63BR dbHr.EI \>a}7{]$50%jʂD(?Kba 6>?\_5Q,G^j.%UYǾ@$*ݾ8KψqNӘJ"vWkta7Lpu^$4i9wn|TfPαaDj4[g~M07Y20׻CJW.K~'*M)єӇOLn"Ԝqn߹wtv{<^JM&TDH JEe5ZJ4a\sLRT TǬ"*f1ƴFEt7~ME$C*x}'JW>wFfTJaӳ;on>R)9an[htrJἧh/o *TgfY@Uiu_<[NV_E{}{g8naH UԘÔ!QI cۉj*8lDE4:cN܀mjhL,rBl c2Zû4 c|덇494MNib˪ִGLk"C̦5x&>w.O 1Jps깦NT}00V(Z[M)ה *:>b,U~j"Q5)mW]439ب4MaJy3Wє@s&$S$ "fvk2&dyof=#84- /\T<M5a)!3(04 3a1*R|rZ-(Mc״Mӈ\E <'#B%`6m{UޗRt5ǫE8DDѲmw|^!Dnj?Lii}- LUEk);& EwmZgg zE R.TRyIUA*nJ jDp0&Ʈ "ɑY~BUQ@*2uѡHQ5ZDTLUi5ˆ;`,)Qq̪@T,GXgRJ.;44M |h +TZɱ7r/s_S"354pyZ 2 t )n-cYD(`k 9hZkHRE*9ktfyV5M+%9-cZ,왈j.9๤k?ch[g"eSï?)}[}]|{_D"fD9EuυMن n>4bKv#~3DC2P4i""m+KNLzQ8{_c)Mw7;==~~a8>]~wH),bwn1eY.B__|xr6l>xprzNnqv~Z.g΀s)]]]Z,WGf6tq8l"SB" bYR]`pn:p(6JIj=9>ћH.Rߴ q 8¬>UL{fqa8IʞAjsנL&f 3;dUr\5v8N@a*Uo7mj%:Ϝ IDAT"QD a!*DMTEv'חWO/ԫ뫫4aX7a9eܬwחW>x5UϞŶ8Gvt|8::u\8L}l6i#G mpm HT DDj0M":ZVT P4{DgbS?* ϮvASJ܌?\\m.כm.wnXRDCιw{ރŢqH3S6_l;x?o8/T L&E*yukg?^y_|;vոUv<^ӓ#D!vH8 mc !V`?lwnkZR8 f^og[UDb횓s5 yj : O 0"8MMۀ~Q䄘8 x|r^xհ?f1p@`*%)h"䜋ZŐ4 5U"Dd~/x0SEF+c2ZFʎZ%62(TTk)\b ޻3sBeP44%d2Bss>"{dOn&X)%ش̞=-w>3eD34 DsyZiDBDZ&)eJwc$N8v>8bkȼw0:> !6mg)%caVz!B睙٘q`ѕ\E,x߷a6DbfiIPj.}p+^C973FqRN T{HUtFݔzQUS*iJj"ci)QIKNmoK֛]yjڵsؓDQlJV6 ;p "I/r `ن[V,˲-Q!yx}v[׬f6c\MAA~B}X֜ccK3񣇞m_9yӘDeZ*ط h~aΏ?Q%IΙb`<=4v"d\.RU@52yG4mJɹUԦiCιҴl9g6̹ hII՜W/_T~կvO)3p$FQl5Oϟ=}tkpw;??("}38iC!B ն??;? )wem\- k_yG?tg#u TB|(zso%^wgoN+(8O9[uu/!gUԴ)-@@5ZgocpT?>7dDLKrUQ|yݭ/}}!=˗Ӕ9\Eb#rxzosKկxfW;[ۧyv W;*Utd֌d5\EZebǞ p<k. cp).0ԪbPTj1vtbѽqĐ ibNEnW}v[8 dzzw! ׷G"<Mswmdh~ !˫M5M7H>Ik4\Xo/[<VfRɻf)s5;cMfJ>*%x{{!6Fj9ySJL1FfOٱHQ5r'XX/ ՙM_VK60Xќ\j!#E f Z*EZM*"ҘkQe$chVֺ,蜋,~KB*%R)#X%tq!"!yb4\tޅ*/㦉] DK0 Q3wXRE庚2[TKIMDQ+")0T2d{5A.iJVћ"9GUeyji:yvƴ#9͞0,"XrE9eb61DZS <{MۄaJTE\K{G`L xe2ATL@4&IXPɨ(5;u cDHDLAKU5crDȈDP+ͩZj)ő.9zjݓEg K.MRMUa)uz"[u8)W@naG<)Um7)2i6uADK"4qI^2wNTRs$\%Obc1#:DŽZRSM){_r Bt*MD&)!0a)3;oc΂?|>ӗvS=ޟ0FoƯ_yt<nooI]hζDtjlf ͛ۻ0L"s9WGOVdmP϶ ۩⟓؟`uI,e:-3ybt_Wv5.N9>|k6WÇTx/&~ɇO?KEk_m'<}Uѣ7plvJYvaJ)onOSJ3x;sM׷DcCsUޮW}%:تoӜ1"oBפ)Yʙȁ̽knNcCG iػ@inb'1U20>m<L+\rp^U֒a@lTЦ<s,%WS0!!4'f6; TջպGq-CRk`r ] &D jRj 1j3JUD)ܼyJ(ȹz)'Oys0L2g9_8Jֶk{ifysm'O֛ͳg|icJ[Vai8Wgǟ8C@HwMxp}ÐKz|y y>yыժ=߬/{:FJޖ%E,|nQ3@U$sUՀպ]{wG~撿w~aq/^3H1NSnuhW1!iT)%4|y>%UK͢!p !Ʀ[N!4 {xvbsA+֠Jp6tz浤 `i0+Dh&m`D"4&v(;n!4MMlRD984M1ǦQ0"?) ]:?E٥qB"պlnno/q-=O.XPDqXvsv-i`QSz|o˫W߼?}7sYx'φY~Wݻ_8BDdϵV4B `'O~Nip]ڸ;)Mή.]۾x}sws\RrnN>yzr)9Eqٶ{p|kCej:y.:%\ՠVSRDDDԒ#V7}{/s?_og7yݴm.:[MU-ƻM.W\Pү}ғ2͏W/v/4wb<Ův?na9*\j5p,9R7"Y6(Ʀr}wZ) 2O)Xf7y)=~8Pߵ~ӜSzzնu @u߶M8볍)~};4 C/79ƕ}Pnooo^Y>|vJ LS&-c i<5TO=i0*"5!R!VTOcS S*5͌LJ}{:Nm1X-ɷx mf<!x0ES4Br V!`lTdr̄~MeK)&:qs. {);.*}}ٝ_\_$*="4jRsġV@<{ne8zÐ8 |>U ɧV}ZԪR& i&<皽þǩ#l#"2\|5lVI*0qTKn?elP&2Zs̳jx>sO韼}ۿ_.ѿ7mךZk-n6۶<1,414iblfqD >wy_ڝ6?oS{?/_\YDþmV]Ȩf``m'n902EdEey"ʽ!}CxAUIsϜwol֛[hж}t:_..sU{3!œKN3Rdz7g;Qj^ƱnJ;&̥i]]nݜ^ݞ\ʴCyq=9̻MZ l{o$lN3Rͪ:撊e)eL9+2bRfT8Ɛލ 2?ܭ6z<?>ל@9 4ydCiΌȃ]Ŧ}+;cr7R0:Ε͹)V.B!ƅy!Q(9"hVM\}YPkU3b.(ƦTb"R {jeUN%1GV#098^0l9sbdv}Vk| AQD`4P1%>jF,bJ*8ͳM53"jRDpgDfh'1qKzi֮mq8M>͓Rj>gtu~X21IJ;d91bF6s5s45RI" UEs DR+ZD hS91"Hn.x.l7+4Ύ]UDUaʹjubuRԠ jNaΙ ivw냟SR *&"gf5WE=3'#BdXNn* *!pn>}K%B+K DOJl`TSS,qtm7{Gh"fKZU985 "{dUT14Qy+ZsCӄ4w=*DH IDATD<#{o*`& 47뻻 s&ԄonUE̔׬m.c3!9>xt<< x9yBRl]@ԈȦFDΣT=;D3U`GiZLUUGjU@ zVBX*j?ӧO{9VϞ}|8އ>{j2as7??8{to+Z*.4;f# t:)8VЪY3m6/%wssMTK1" s"5OiNp񇟊QeZʒ與q,.Rk-Ryo[_EW >l8SlVV0WD`4 |ݽg>O_>vt:^~K~_|ѣ'f}sxs{4&JH٬{_k*Z@sp:.{fYm2;| R)DLmԷMgCH%jaf2La3I^wfD!14nY6m"-C >K\[G^zuuW_Ʈ'tLŅkW[Z.jMӜmKpbbӔD1CJ뛻!H]7͐ 4:_DbE&0DT%Ja5CTE S0:v "6)"L*"|8Ono4U$?x|uqrx>yΫ}?ٝo$㪰[2*mO!v>c)?}_y|xk8BSE M)|c 'v6bj yucH\p9Z "4n4Ξ~3'qDDԶ h8oC׵an5ADzƛ}uP|}Z3>;ݙ;wy燂1"%sV\%ժ~0LfmQ)'\&)]IHY12p:1h9״}BdsIl1Z-m.9k3ƃ(Q@Wmn}L\F&B di*^JFFu)Hbʜcy?4a䙘S"b&`@oQ"އ,Ywya`αw,]h!>W}bC&U4M8"PU-5-@ZhE*E Pk%f z5l3zw8on9gb)6ڜ "!* #@Ӵ:jR{NQYreLhBܢV5ʄU5Ġ"bC 097ɱAqLivb4n\xLw~o{9[wCpOޜ>w<*>ƮixfSݪu.6WgWu\BwOI>"ˋqClj՛}׭ ͻVs7o?,%k["o49RiC*զa!lf6yIC$ݝoÜmR[f1mH;T]V<\7͇||8Mw|hVF{B-R L'ɥidԒJTt}v&13&́J"9]V߼ nu͵”v9;93);nOh! )<!37yLw@@&i*HKz{PP+EȱTf-:v"r314M$U8DkU~c?2;/"ݜƒ3;Bڶn>SQMiR>Įiv9D $&9%Wk"/Z+,JL9SC0)WGLFAŐwMj8=wUS$r};m J%z!VCg8r-\YrJ!<^i^M.TpĄds\w$:ٶyϮkRW2]{**uqy1͹i"-)RS.4j3̕*mXf 1a.=im,"9!ƖkiNmy[ٙY.2MsrJQ-DHKBx|9p`R횫ˋݱsrLU23ZͩiRR&*͐d5Y68ʁƶSʩH8]&j<)4Mxl!U*jÞ\8?7+-s`v;tfg=HŽU,ZsNh?&."B޷q!zj?rgsҏ?xOy=;G Hab5-9N'Wg:yNsJHիݶ?CTYmK0Q}YwÔBj۔*5ahY0N {>|G/_Yl}z}}(R*!zƶ{ܴpa.3ݝq_>8<})yNV1NԌTӪS.wVEqNwכ7+i:!<eue>it:*umUJyU~ɑ $n}hd$Rci%~ce"XyddhNLm!".'Υ|DTDlD4 hLJrɎ] ='x5%⥀~B8`.شW]۰`RSS9v],ULBV3!kR5w-ZsUi >B,5]=#MKm0KX~L=1hɩ"/UYaYMGAjYfmB4f@İn)]Si$r12@1E3bZx{3Pmw L(UT"S`&")#xs)jVUaH E11 RTUԐ\ٕRs.9OU/#!h&ͪwޫAeab2L9'BdRE%{Yt8B@+EV]+RscQrX "/ֹ3Zzw9iSE=#:"C@ԼE$i$(U_Dz:[9wSfV֬*"&[j v{Fm[0`nۀl~'=%!4)E UEV1L{ﵖMdD{}?q\u . wjyuocX\x'c\obﻦ/_}ex8Q5%E!s Tbl_v?ɗœcދx LyfZ;<9) 4YERz^?UP.f*(r1JR5P3 ٔi.;5H)c 3v8;99+ _sJ::0 <.՛q%%Ɋ aF ;b]Q}λ̌sA :dKMӊRG.acX,Wc?zGwEDoa3n80<2&B -ර&j,V-4eh2sEm!xu|0dG.9ߴsDψ"ͩ0Ӕ͛v}`0N_iևC^oơSA ]qX4M%SJ!6MM\ B@SqyEʔ&ɩ-";NO/6秛6jt1]6N (4b}{ONL./v] - y-N֧}oS.Oi."WE:9hBQ9׷۾?WDE$whY#BRQ@JIKAU01zfPozGxn0?C? 6s~q.a< {|ǿ~i9MM{qY,)he&CP *fO-cmI뛭!fŠ]0I׷Jnn8_~}Mlۻ8ϠjsblBC k061~۟1DF 6\-H~q.izMhcXw5p1>T)4:.Z9w8컓>u^>MHo˅< eR|]< k)} M˧fB yCL)X }Sr642DHXi.e" 0+RJ&Eh{V@QTU4Ҕf&VαÜ8 DD(udžV%N F9=;MR#&4 R8"j'{J*s.*a 0)%S3-9y9S wCQH)!зm}4ۭxj'v4,}:M&0# iNsS5DgrE-^uĢh9'L*ZlTT !;&{Vmr16:I*T;=3|uAe4φ7Ħ>< >)}ښR9"\Yz"03u.xȑ1GgRl:v γd-la_j$z#Urqb#ZTkcf35Ux A$tM[JvDCٱH)Ȉ1ĒSӴ"{cj ڶǞ7'kjՊ< cs}Y!8"bE})EBjt{ukW4 ! KaNaҜ ^]߾|}ӸRNCCO,LYu'OhZTrK;<}C!8ND 0"f0"{2BΗE  >8"bB͋6M P왡y|p1Y/v#wnev?=n? ê'i_t6.OsXpHsC?H7m#s.뻒 1?F@czfHa|>~_?ɻ';0yw8"PS&6ng7~C8;Yta,W7O߹{x$ZYq؜.mTdpuHm'vO>z}|s{؇gg14Z{P]>™(]KNm1D!GFiߛ$]~4"yB\R)!5MS. 2[%Bw4 242PS3P9 f(b.S9J:SU#]9hܟ IDATiralXJ-TSTM5CWۺGb X,؇R&3(9 0 C͎ "ΩTˆ\DKNi94ё#"E*ER_P-5$4c)ErS!Qarme_\U|`S-R@As"~޶ eRaQ!fCEXR"0;R jqЂ9g&3VWv}7ZXݪkKY %10EбcBh jU>ע'FDHD H`!" U ;ׄVV}lB.b23ndQD`bf"fE zi6Ug @$F!{@Lى)!aYU0{R=PE&aQCJLdPJiC4S0;V433$,9;'LHR؇ ! )Tu8XѶmv8ȹ 5n9mLi8)CB jo}㧏_տ/_~l9~tym 6vH&E @X h3<4<H:; ð9Y:6xC54V/" ZKT 4eAr"@1"q4Uca4S[2;+ yD sn~is}_qnI(?ܾכG~M.8T2Ɯ>9b?9.Nq{xPFhn\(`2AEpMpi@fMÇݶsWŠR}lSJ9Ǐ7Ռ9b]&v1xN91£GM_M8zO }GZ=LPJSӄG~~w?_ۛk\WXlju8.MC|\JXhEV6\UjY-Cdy`G4!f? gaGϛ'?ŜO>qiL.wY/ox~Ҳwa/_az%\ӵ<;]lC∋W(fZg/o ?/O>g"r^!G V쪙cV Wmۤ%b* Z5qW<+itQUD(]PD(E/W?o?<]azFT_^2){'h?[2tqW>ZG%릋1bVHd30Pla(R/|~4erq.4vMØEǹL; ol/4g_w:Fvcvo?~tݾnor}?lB?HQw~;_>XsbP$qw2aBLT pѹ cɷ=]\/קaȕ164vWsJGb䭖H'"Cu`fiJ)T]X "(2)*2M%cS4` D93;"3*1Nsic3Uy,l@HXy3hj jbD @x,P{Db"b!GLLj:":Zb7u4PS3f6Q}Z=ŨRh}z$b~C)U$LT(9,"V`&'fVZ`ɛ 7M0U5!1E}ʉLk!):2oި"1``D( "Ptls$$b3)"jHjZ ,|qhzFRնkyW@E2dAQT5lBvEjѐSJmlJ5Z)^2C"cb5Ly6+9]Sf`,e>'PqVQ VUǀjє6b}CtfN`09c6f< fsv'/_\?}rRdZ11Ms !z70llw?Ie&~LԲw~o693ib>=Y/">C$q֗T2sIqmw8 *?;;bQ4{~@rmӄ@1{E$87ͳ:F(E԰J<;7CNiھW6'~_4HݧYIv;4"}gjݣOڮ}ի7sE/..ncZB1|%0"Hz$ݾa1oGџVԽR{{ǎ0zFU#,*uԊYت!9#h&0M#38"f~KHq "ŢFFD^zwjCpm_7x0ևJf"G1/n/~Jy\д,V9 cjڦ(4 k=Ջgo^~1(RNNbSίn9X-Tq'=ܗ0rvqyu}UC?x6v]?1Wo~~}w n]~׾  ӜȎEp?9$2e.b=|k|m\1|yw[=oΉC,\r^\lf3׷/%ey>BV 1H!PR RT!"TV [sNUXQU T UgE fHPrVUL@3QB^ERxQMYM T vY᪤!A|׫jId퉼 FDZ RJ.mZ-b1D3DLi>"jbL<=R&)7mcEw\|བྷ\ر<a@by''4i=̉圦9 çE͘͏.Ow]v{?ayv#w DȈA{0R4M,ü^"#9,90b9}l:$"ߗJH4ȢU,6;d=1A5T @D9ULe>=4g0IdRosΧ)9JI矝iSR4غ( 1UX/r/ysu{Ur\h-_׫U׮z^,B۲ ]L6Knw>8hu-*iNMӜeLK.8^G7M!)<ܴ2CfvdCI ib͢Ej3M("Mw8幔<ɚ;vmw x1&Ͳ)?gϯ3hJ)F!4MH@DHLc`tλȎs̎KQ yǼhsjշ@{1j?*0\ g_*`\❋ C4[.g't-on˜!8\B8O`&9^ Bp|%}.6thBroօsDȈ<9CAn]:Z#&/nS e\S,pE-هhFR31*@ gR PrC "*jdSP[̬Fax:RQVjajVEMfIEQ`nE##DD``ufLQPGJ5ە~%+ Lvpj;8"`%(EAPs#HzTP "2# cp^LV)1: !!Vy0+R5Ҭd) Ms*DȎ"1aɇHO l`I+:\#p,C$ѺUCT0Z/ R͑%)6MW 71z6@=B-RE4]$)W!~D7@ 1]CXmC?t? ׏//p2`&(M, \pӔP FDؗE ٓ^ԤH p8mR@ ɣcE8bΩmCMXlTffjE C1܍_틗/V_[?g/_~zsfhvfXR \V'b=㪳@.0S)"D <ps37nק攽 ֛wޠ6YoSjV?Kn?Y$A+xEhxvjJ9ֱ23 Q%DECsNiN%=<)!TV.RJbv> 樈Em8K3sA%;G*%a;w߼anw7wW7/_z}p0>l49u=T1sRЀ<YAMtܬWz^u18vj~wW1ݾS)E|tvrz& 'lfb*EkD~CX60LP&\Y s\LYaN׎Dbp>8\|ܬN7'&6 }|]AH`z5ȷ]^ѻЄc9'LAs}.׆n?>$^riH{OxjKa-&Ƨ\>x00<aW&Kyݟ,EchZnoO4#!-}mhɬdEk{uumʳ'mbLi>ȲqZVdfx.B\,7Cn;{Bh@ՒUTň8 Ǯ"LZ@՚EI)αcb6E,Ei@(#zH}#UΗ"VaX]4QQe\\g,Jř)"qu#WͰcp<s*,"%<%uWČELlN6S)KH4H4{5cvT  6 QD>zvR B$42f 3;?\-89Sfr>zE_nU]ۿyf^;v˶z~}-:CɊaG p9bQYsRLѴZNH.iNYKr{g`9EϢH.&T?P]γ<4Gˮ]v]YE㶍Y$@**H)ByE4# 0vbǫ)vs-@D&d&Ӕ,6?ճբS-oa=h isl_;Ef~aow|Y0g%yw²s)]`"H!3qs0T$41Ƥn/_SYSɫHM1Fvl'"l"zisA+_E+-ƈ7wwm^^շ1= cw{bc&) 9%~7tm,&z,lg@v{8ԄTbyms.*|^:>eS}suH>ƓǑb){X]_bBbiwZ2C4O%(41e?} cB=95{OXD jj5mFxܙ2stPhfo.Wޛ U U zvf~#UsW "Rm"0YZJQr;cH>0S{;5qvD;N攫5s1Ty7ToȹAy技8f8X_:pgKQ#0)V[G*c IDATp1Hlwؐ"Y٨:f;JRbfIH\-,vEUDG1`aP?\#"(X# \t@8Spny^V#!zrDFQ46iS愪mQ5zH Qx[DG:4L:iNDP @0jy1"]aMm944QӆzLb4M̔RfDcRr&K&R|0hɦ}RDD \Ras8{H9&ŧS?/mKn£GIT5^^(듓O;{bh\mB h!b@R RTDSNDvRLα*C0c)⽛q{S M dYr*9K2啨xy&5cADB4@u13Y]Bev{FDy"cҜixF>a;O&9Ghb;'a ͼyղ#"ЈhəwEDqh3e-ootȎn1Niv7o\OÎQLdhN9iJ)M\.ZS= ̉TKIERxm?Rbhys4qؚHd#MGqҴ0>,&!.}۵ZF9DSr $YJ*&0s6Pa.b>zRRiF,UEi*^mB C @_rFwwn~*ooaq4m/>~{WߊIBbߵ}ӜWCY1rv^y ̡ab"-¶S@&`4419$qX.`\JQˢw=|yR3Fw~l^Dl_ܼz{/)ư,:ȒRV}SJ!76bާ5)"ЬCu|/N "ś"A]D1h?|Ӷa^ݸ%5c~%9ԝ Ӝ &q2xYb(dXp6mîV\͑%8GB_r>Yo!4]̜S+Z ;d  bӡk..WtS?{~{UK1hӷ?ݟ|y_޾z==]"1<lD"!bc PaE P0"8j=9/ @8-J'o@=,rY!iJ)U=$nPȎfLhU"-,tXb d)!P#1kE 0Ճf 0tRL"5'H dhj"ņ :yZ]k-#t?=vymB6fP̑  Iԝ$65x`1/n铧̤嘀9iP7 ̼HqsvoގËψPEܭ*>TMۛW06M"׃8><PTiIm*p범a!0(iiB\.ŜbC .&iI&k"um#qn^M 1J)D\yΑ7U)bH "R04P/>iG!Ra6Eb6v~y"n(!2U52O1BbB$uw0fdZ"E0gusǛ7mbf3}_\^HmY229XjTsFX2(^o[S my|r6|py/.nEެU ]5͋gO.ٷo22L)&B7yjV)!㒧C^JQns^^^_^~? g}n=;=Io~ﳏ>x7|ӽ| ahc)S|f?V}eMeuz@ LfDnNi&,R}34L_'/.nq۔Hv<}%s ٳ,y{w@RwoCt'ĠZdX$\,BD7,clLYD0/ aE r4wDnfխEH`j,h恹kՏiGAk3rv# " G׶Wbt;NJT_'UWuCX;GDUz~cjܬa,U|ʽ{u^uܬb1_^΁Cݐb72#1*Ըb=n/_R$6G8fT?Nn~ cE9UC`Ge)BRDvPBVShZP#@L`ND8"2kQS#Fp#0AŧipĆ)a^0&5K%ޔ?dupaq28nNۃ9ؔ8 *@:*HdVJs!baiYQ&uj{QLcJ(.jحOgEiYq*}Zbi7utG/֫H~߼?yOM?X?9̤:A{c( ı9Bi1Ijj&ܤVUET/%"AL)xyx ^wNVR2HRr !PIԁMUcu&""EjyTM5113O˲,n̊ eYV!0 db~YpV]p1]0E)"Z`{wbF(fyŗ`m#QppQG)愹"Sܘ''˼<췟}rխs>lb '|ӧOoTikocLZ me*j]~:+R7-IQjгm[MĘðZ/Դ2O)\J`,Y&tMPy.Yp^[kdDnc&B}qp}E?o|ɺmr)iZL0Ĉ쀹,6o=|s.,Ԥ6woblwOphr$%p{&Qrj8?{{u76ϊ,DNFvL$&d&V@s )n81zC\rRtf5?;|RyXLPIEf1DǡnmUrsi_<;g/.j9s5wW}VYhBnKSlYdzwu4Mm>D~lvDcp 0aի.i\˻m~V\\1/G.=lOOϺ&MDo^._sE";?~8>|x, @dFtqw,"NVg'ɪoɟWDHL(" H؆t4)>ٜnf۶AH\/˂LCיbCU"&۝ĐԵm6m ! _oƯy{_9nÎ]>yi*Ca0-VEίۻ䕕S=1w%Y\w!2zGtf2FIscO2(b}8)!֭99"£3=ebj1TT j+QC G_T Su C{ ߧď(TDsU _6")"3UDЛ&BD! 5 JFw?(R1$4Ӻh3)HHfYUcX]'fpX@6B 1V QLeKQFwmyAm{m!\rI43YM%9,7Y~D6o|5mvٰ^__]y0Ғ3"ysE<=_|vf")$1޿|>1Oc0'5vGr&ƾma3BZi"6 3zDD,YK^8%KL ]%K?V 22n?%4bZ"Ea;m6mN6'N b40~۶#↥hJ|8.D9>]qw&"7)1RtxaSjb "yYJ`ty`PtEJJ 3",K9=P\jXCBSU18 ,jaR$rpIaeΥnڴl!N4xMݝh0 }; ۇmXH.f&:NvuR"CK)m9a%ϫ3qljH1$wpGvT5sĢj5f&gQC`xr2\pvggo޼]JTAqn հjնv'/}O___o6gz)Ħ!We7o~C~Նv/)5_W_ϟN}ۢrr2=혚&2ts=ջy'M?=??\nwTRbz֫>46!T]NNC|op7W7wgҗ?NOUOVϑW˲q9<02<q˒(-WԷwwz?YCߥ/bǀ3>@u!W|JՂ$rPZ,R9)H$Դ~]ԋ8@ӊ%BiXD~8!Vy:GLWњY:13#1 BxN8<՜a֌{@vUus#@b"iXMUk%[^<,fr?1 \DyQ)%ŘTCE@3bqc= B@"Q)UBlIUbC1E@u*ՈB!:R S˲]V V<|TGCm-y+! IDATC!Q s)f: 漸9ivG@!{& ig^RL@} YUen1KY L@9S1D~y΢F&bɋaUD)D@6"Fxp$H)Bx&wT4ŦM1;QV;b2 qvXJvovXr&nO1zkȜ’u5t15Oڏ}onn˧}oo߼y)D~Tї"QÑP?s7 bMqԘ@V0S$j@WG,@NH"1;@D"c iJ2j.fk-[ \JRvM:ݬ]ж9E/çzeQ{6 /t?'gxjxm!6M2qK9,Rwu0x~gߦO//)%擏>yOn~G?H ϞnVkB8;]py5?<|t>/=vӳ'~.ք4 qapbHyYv7uD'!i*YJi)䌈"n&.RxWA6ffZIGZ5^gwsGr@T"PFXA*kSpfTa[JRbRUC7wcB8{FW =+CO;m52P]K&FnU%qDu($b+'G{LVo@%\Ǹ-3%/<{4LHLPnǀW3Q4CDF$ǪFE0w1wtJEB$Xc̵ ⏓=!T Hi#sp TUB@D4`BNnGK^gKsdV|-juusKQ3i?RD9mzbZ(1/K&Rwׁm00$ !Tt? CەR&D$5ͥOKJSR fHIjb+~ 01 P2?92l6Ӫo aG'N\O4anw8kP ~Ǘ]E_xvy~ݥU/EՀ(sb^jMG\:!GgmݶYEUKG-?@& LL2szrshDD.cUorlژddqo]DD?{O'8c`p7E܀7K9Jpr=l߾yͷo޾{pv0M)Z*uE,&%eQG& XYV! U8O6gD,ھiR\ a9gpf"B`?KWRJh$xfcEh)5˥lVŦe",yY2 W|Z815)RM ]?M3}ݞ,j)5Հ("eͺva"eg3/9:?l+S}i^to޼a h?"ǫlN7N'vqYT}ڶ/0Q&W)C'(0#eU3g@cBĀ"V,y#RLf>NcɋH<9Xa!a5Cus9OSI-HBpDs,bi,y^5̑Fԙ "1Xnb.TDUs$ u]c<Z=/9}۷!tپ}w_wO^=C߶/dG?L߼ۿK?\zfL9#S9/^6W߼3;:)ݰ,'O/{8I___7韹_wqG?{u/osx"s˿NM IDujSj_w>|]~ç!9knxλ?IפWCW1DGiei"VnZI@jb'\{ ̱d9Qf8bu* zNd"Fs(RswYM12wӝT8U+"*Eg1aXq7w/>hYVJ6R4K1nNO_WП7.U j5Rc-0bh44-ٴ,E1rۦIML $L "DZYz'lb`4! $@Фj>[ PH̍!RZ[JE &M)y߷P9"$Ec *RS^ <>vU'.%LiizUl6qijۮp!JUanoOWU$9/'!`s!e11Y$wm+9aw~~y~t |Ý]B"9lNקCR^r߶4y^51dS-sM%2ie)P;79f5pRr`%WV1aڃRqusS169um۶)eiھ_\HE)!! - Dĕ H!Y?t:==ˋ'OeJYJl%z \]ߴ}w{:wmHa%7onrY~߻1Hd]WWo>Wq?JɓdÐN}כ1_~0~ͫ'O/t8ۻi?%msq>[|I,)F hi.[0fyX @(ZyNEM8:y'"thnw Oʐ"N #zb@&ѬN`Jq- n!_C 󲀃W2cml|ݭdB6W32"JT1:+lܘ"7x >b0>MM~:ZW ϫjafS#H`^K$ HEf;jh5R_js;D<Ud!8@EE,ׅ8"q5z#!Jrǘ ݊CLMG@Sr$$)jU9]u}f˽ bMj  ;* HhHXJfbCiq">/ bRemڻ$G0_e)9/\f}/ٷ_}6x{wǷ7wՉ0)C,*82U"8%cZ@07'}PU$qh]DqJA<|M@DPQTyljbkJ5)1b$9ҷ7Ms),bΤ[p0ɋmFM%4MR73+ty>ܭ8<jW8CDbs, B&F⠢牑Cig3ͥ&Տc)Ō=|6MUR !fsfY[oq.M#GxTmӍxvvlgx8j93jpĸ,'~lϲ57sbC5wn7~@d$cɍheaBgOp eܦʪʡ*o޼CZ}|Ȕn*Dk}÷> t:ڮ{8i̼]߷iY)H D9v˲ԍrNݜ&33bLݜae^nsV|~3lӴn=Q)iݸRtyP̙閜yt>xu.E}DnKggg_BknoKNy]6a'dHn:@UGD{vDB4"h40kU潫+S$-X2BdT 丞@rA,RcZkPv9zUu}d9~_v;!7_/?ޓm[?y~_rw?W/޾9?G.ҋoZ 'it62ټ.~߼z{ot?Υ{短ņaWL6掽gt TCtt폞lٶsLN3ɻaWsU'>ezrRn^5-6xMW>Pri%yaF&߼yq?._|rɶ-bϯ//.>v@*ZT~+y73SD=ʣSQON@U$j`" UVt13Rb %0`23 !RLﵞz LL')DKfDFs<{&PDRiK-%X6j0aTRbP;-d$*#VdAE="kOZ LX&P{Aݱ'nPDމ,AugfwͧRc[J)ȄNJ> .0s)7TrE?VI;{_q}?i-"",K7* !yNNTwD2ު#̂sk@r4sY|z=4MJ)Ƹ΋ 4N/^|4ͰTe?yM''yZCtnYi> Vͼû{ V"8/jg7pyz:.K*iZ~}7vh`kZ85]*B&ik)3!b\JC`lڶqNTȎcFF!`Ρ뷷8f]EiCcVD3~M;ǥ ۮ7/||U`hcLp,gCw{wTi|'?dFtW~_f7O~ɏx+:޳sC~@%Skǝ"3Wg-ջM'TSMQf iIV@( &j""PsuC!T5!P!ԌM5շ9fbJ.Gl*@@TR6S:J@QUJ9L"]ZR.4D9+Hbv]f>I(8wbQ@@D.4E]oM>R(R }`b.kz|a u(d4%"[省o.Kʙzv56!,XxVZ n{8<\${z՛Wi MӒe]R0P% {d*m o^=WI%'X׌D9*E,eY|q~6maYr.Dд7<γem?NHw0]wKaWfPJ)i^&`m옛yrΦ95PDE)4=dP.41vkyzz44MRS@Dщ qVD\k9ϮhITa91e>6aU9笪γd' HʒkQ9$}{}>3Wn89vYJe .2^$nywa뛬i]6}Ʒonw󱔥 1zfG7i뷿W_3'4.7i21f̻F4ϟܽ}{v@w>|vswo/^~sydwm.tFFbxztÓ'717fB9w5sEKÖ?-` E Ҳyu1"EœSvH@9'#4C1CP`sezR &E L4MšJv` 5xg <:5BUAY/̙YwEZB`>PG󡂜M"S%:,bh.\UGܜ9Rs&zueb#\F+ LEN2{s:Wmq:k˲2Pmmg Ӳl\aĜӒRiqsE9oie΅&N\8Xj6+Zթ{UCVy_The_3c# w8c, 1R ' "6%gl)8R./.O?Mׇmir }XsOip_o nYК°s.Hi] uӼk9tg.YK999_={z@u&6޹"6Mlbp9-wӴۜ>5aM9bjb &2D>!Mgn0_]nDG IDATa}y}Ӆ8жR$LƟlwZ|-0MK`b+B5)c֕$hk50tm:-D,RrZd)Zn;i(5Mt "PPTT浬EDMHαcF@)"& R@Db$RbfRLޗ,& VRYu-%1CCbMSDL 3JN`[i^)bXJf%2-vyS.a!dc;bJ4ysJ0Xəw2{TJ) ̥ ]'Rλ*ycDfb*>i!}1l7nS"|dH>"PJd*v}JIUMJ- HhLUMC ȧtjSFT,kg%H6="]\ Hv眉)9p£ {D jّ'"C6$cO*E?bGXcwJL(f˲,iOaO]vl&`?/..{Yס )˚/vp$e1^n5+YUiִ0ef@5!@ t>8VD춃mo}k&&Cۄk&nbiڦѢ75eϤRo@LKT+IDE})-yZeN8vH͛D0臨iI9%Q%tjp8cf^ZJ1z(`ZvR1QuLNQ䈈ED*L G E_3TSlJ)33 WX0V}41X *9UTޏ]c*FNzWf1% >?  &1 ~uQuGCmTCB45mc,b]ϙBT8ңhEi),-_S`GO$WY#s0Bz>\"$ **P^Z Q*ROH)1c1\Еb*M.s@`@fE: /RH\"R*ɹx?4.kB܏8λM2#`b4nZj#w.0(zE59_~CD˚y·7np[ ˹~&4g@՞E)%3rdqD*Hxq9va?$u`kZ=NkrMȭ`Mɴ„ʶo=9eͦ,4NOB%!Q'g_\\z`޳THMh- (ZeZV MEx5Cǧ~?ljE) ޳;6*4XS& [UAuoA @br<_V0#E P]/)*RHQ왏P#|w]v!6kumlsݚtZ˚u\VJY9BJ.i]1i?N9I ;F ,xW};ǞC"B\O\iH,uVw*4Ƹf8|}w߿y&w۲FڶycݟNSRˋiwv:\]\ ɦilΝm7g۾mtm3H*7!4P 9`yMjpxG=9=nzSK]c8Ln/"8~g\$nmM8 >0)j>rCs?c.aփc-m`F}dP#ST끸~ۑ^o.fjVAX36L,*VMwKm*!~0":~Dׇ^X&ZiEؔ*j5'ZX3ӏze:^F8ɇ4;9@\WSm+ZBpMEVks^ZW9(%#QIDQNUjjF՞ɑ1ڕ1/Ax ܷmE>/_"Q ]30H祬INv} t;7< @MLLM>T;:ȹHYSFyJi Χy==?7yMw4Mk-9U1raiE2C@O*{OiYhp8 LuQD@3MCh)6 Rn?se)eӸ|\{pw{Q Xg|x9s?{۷7͸&:T "Ŋ* ClW^W 9ߊBe ?E`Tټ!FfUODTm13#Q86B,E "z]+))Q=p"& H}-rs{{{w7M4󤥘AE`2\JZ~x0˚iXRQ&+ "M yǮi:@3&!"̌qهއ:u0ؚJJ%KJn%FӺ.KՔ2 EcuL]Cۄ}[55ni/x:,\ᣎ?4ޏ^UJɄL-wm}&>x^NLNOO ð٤\znYeYl]m{_RFSenxʎ7]G( sp֦iS*D. 2/iί8XV :ð *ޣc3lBto&v$v>dNk!V̠i,aRTщHep`RS4`$c!,,☢miMͦm#Kws))Kn6 v0?˫R?jZz2wb؝6`d/Ӳ84`e ^a]gOm &HQLaM~EO&lj\../~ L|{P3=`\D9uMTe] wnӷ4W/D"M4j6l\d7φK,p}{nonnoW_/>R /w}]VF:"hYTE A RJ;D.EҼT9uZ;t$TXrQ@+ L,`Zdh@(*ʴ,%#A)[}`<'@a>2i౗]ĵlT]`T9U QCU>ׯ//.jҦMIAtغd55sF޹ɰΩĀrzwX*2S*<,#72[ȀD FbQC7 ME9g1py״ 2UlMfZaJ @.ƦGs*j*uYS]*>5s;D}$*hJᰮfK.Y_ǩk"B]loBh0䒛:>XDS㺦ׯn%MSM˳_Ewg?\\ n'EnӺf!r7"d3+RGXr11wfY*k({th1xT0??{yG &1EF7c3Ŧƪ<1Zdw\ϝDʦ *qD\D 1#9B,2pyyMY\0Nsisf1Z%hauA0UKkʥ.q*ŇP)_ۮggCِBrR#ty2ct16m;v9KG<χa9b$c.MӞn ]kB@ͻ0Ckb&IJ ]88 ]'fMkt?J!6x$[r.x.CN۷,۟}E)_}Ϟ]\_6Reiڶaۄ1lICɓaB`vm/kI)+qC Bdm.8N1Bh sN9'^K1^֔rZN SZܸ'RL!PLɉjfv])pswv]l041RæO)`)%,RРF@wVpYלEUs r3P7XJaR^ΆE~Mŧ~_}gϞ]kH?(Z)E œ_|og~|]v]on؂;bn62aߵȌ1=ADP+%uATe;KyGQ]fv.ޤu>U۶Y$=9;|4/߼~;-km>żߜCŋo\^|_o>|}"}c4?Lc mJfUs~?m뽻sLdpUb眙Z-u-ZԠ *@HdreJ%RMvehe;VdTmѣn'I ! Yw.x`#$z\2iS",RNjǜsDDDLV+9>&9@Ka9̜Rރ)tBD͖s?{ |XQz\r{CMwtMۖR6a/SN!6GS P#ڳҽGfv^T ;&gHuPD9=.~Bwa!\JS*zu=363#.TA`ZmKD~W@R\ h rUu]DH֚r(-JDRt8熮y?xs{<{wyzϟ>!i0l~?;1Ik^OO7] }D>xRnɧ'snYfDmODצ7ۓYΉcH|wwq~y~~&Rfat1c"9w~q}`B9gꈖem"Md&5gt!N˜xM@(XٹF2m8168پ6==? uc^/'?ſ?/ovއ理_5٘ DAkHJf@JPU4= N!gYE-IG,eG/ !8Rb`\X3Ӽ$bR9/F# +8>.Z* y|/*9 3V !t*t}F>^\/R.Lu%&iM%x ybluMaYu>Lo\qdfU 弮Ә0M1UA,dazۛ%" LSb"f2e]i9}_k{vt!WoONz("'Cߵ* L,ƹ2xCb px x8ڴrE MbB{D˜JIuY$85]l8OLiln}d=nOWwTad32/YN. ˼n-Wo=_>}۝پz0-!6B@E UFE,gARfz<Yeٲ,u]+]{s;"@KzjD4A^"QPb6UOMҚ|AAw`W\L=mﻒ\ߦcL`ѹ JGj~'g%lVD7hJGW$飳?ִ=sq> BΕUXrqLPU~Hv'vPɕ9nt^ 3))|6#z^a""(>4!j<1!q@̞إRkb9ҚgXWE} Ux5m3Sݛg 4ϓ"AJMӔVS"uL̹b$y]1{!y(gavuY_w "XQJ A)m'gR2n.cl2?chcPw+R'gg`Mӈw"%iee vC7aό4 4MlyIwM.ZsJW4Hu!g۳smpB;9f&8c7MM}ӴaM 5][ڇ_o[3lk&ڦ˨ʎ)sӦm,Ҷcw8UE)!HzL)Ҳ6Ll* ɻ0/ctpzvro}l.bt&#.8<avw|߾|/MppvuDb*v5]#7][@xHE5T #=Fƻk{*@k)#nȡ7u{o"RM零i!)8.뺈)O[~4JJ9vg:pn[Gm}sJt_~sBvmĿ~y/:Lk1ڼSǛTYmVm``(qc:Eɹz4 냝jXC p\q `кX̥jmH@ @#PTkT cp+jn Dku!,ݹW Q` LX~ܤ""13R \᱉b*Ru8(a]s]ޓSbL5O//..v4#05CFBr!撋x:t\weruP) z AeU Z]rVS&KQ=ݚj9πR;Vo6-Պ-1RTRKR\&ET R۶< y\3SbyIoye==I Ȍ>.90c׶M /߼ct.ǩfhK)myvM RrZ/eE Qam[ȅi/K:M/i1iἬ}9^~{CwHT6T$* )K.qqMLi+9%1f "lE;&z"}`=H\ U~>\<|o~D_/_\]\]n.6\__?o_=9NwWOPmܚnxf?)~_]?4wMI@hHT|jX!Z 2f` jZO'fGDUԊj.JWV)%e-8>˴C.KW3aj s0&n}Z{Nsm}/uWB’V`lc aƌ̀# `#LMXeI˲Ud{|bOV(#'q#f{'Zi(NRt5EJQ cJ@5nmI[ %*JI?q)i~9Ü쫪& pZuMZ.U\4MkEQ4/)!uUUW]Sյ!"ev} RM($)ه0:cjg1iO!_:kxbn2 Yʂ]~ou5 "]jrI^.Ji|;0ML-Yt1:ȜqΒ֚욶6U׶Uu]ܜC?imu`!6XՕ5EjmKvBcvV[Ҷ匪+Pq9}1fJ0 HSXfSQR !xQ\áևÁTuEZR1c *e])Yg٦RVgYr!J),3*%@Z!B*fuAfNU݄8 (ty}Y k C nvϞ><{[~k ~_Unoڎr?\_]ʼ~џ?4ng_)mm6'˓zsڜ,~TTbSk곓EGkovET~a ,Tj4,uq1Ν kuquWY9й1T#m]u 4AN }E#/ާ& Y\sm? )M8N4ke>[oY>ɇ?ޏɺՔcvw1@+YHT#pS08K[LY\,JQ{Sp8f : +)syX 'l!&  "#&Q(`$JaiJ2<\*- @DG9WET B8%jR)E8RsNҺ؉ lAѧc ><K]ןY+?ͯ~Ͽ~1FQ ✋n%2>FPF BZ| $ ʧd)k0dPHH5?'=M:)us$^q)"FP^<ˑ[>x.|hS1a "]Q3 3ǘ9g"u85嫺s1I*I$2CAbՌصnGT4}K[ճMqi9KvWM9⋯DĖGYb4*SPb5N>\"CC\R> #uj+2Z!*26Z5Yf)ۮ#k_p]x|u [76g=QJG7;w݋ɼYu槟~ zVMIkP?݆y "T qK Gȗ%ZᘘKH9g) ֿ;y1f#W}Ndg+^/e:c Y D9+J|%f.u!=i aQ"Q Ui]qyŇ9x_019y)GTv\-dZmglJ9Si4c(lVDժryZ9l6rXE&"a8Om۔}U9f i5iϳs<r)z@1$ks~nwy9vZkgMU9[Y1U1"1,:fh${r'RnWuyX8g/.ΜYqC1e6QPe ږIc Z+g0NU嘓"qjk 5Ցa!O0U,bf`O!kmf ,ǑQi`ٺ ҥXbJPbYPU<{cR5iSIB$M͘R)@.&S>c)a 1dg~E[7dbхI"GpdvmUՕrqv!];OWm_hE7o/"h}pΰۿQ6ŝkTjYkô\t1u̷=A6ھaaI)>ЏaH7\4VvUXHdES;(m〳!%"9sme #BR ©no0quۏ DZKN8')O^\b`.Ekjvq}uf0g_mwa@ 0OLOOO4C]33/KrNtIPb%W7Msy~+o)Ŕ JpJo799^ Ӂ "*>R;R9 8gS~Z) +!嘲hkI}"tCA A".u(x4r "‚2б:W~wVVia( $.O^`";d~%Q,eP]X hMD*Ɣb֚҄q\_{xO|];Y@BJHG@DfaQe[ZFc޴R:>Ɛ6Uά@)E,RXrY:'d,̜S!+uxY[R~( ,B,u,~t,Ғ/]k;B81ĒCd}2McGx~3FZL|fai]UV;TW5!hOzYڶfϿ~4Vjh9 c}?+gLTۛrJFYVuvW9y!P4v"Vs}AP (?Ac0`2窪 趩Ѫzg#6jH0MUj"Bp H̪4j2Y d-yV΂2 1}b=Ĕpr^9w([o<:,[0[DZ>Ç_O'w樂emWO f0 Ѥ1:(I1Ȁ P1& RȜ8 *]3ebοCJ9})KJ)șĊRd)| dRD I)}LS9;@e.}U( *Rvs6f1c!~&P@H)WŲzѝOOjy~v!"po~oC?¹vnu,ڦE.f-vQ]]UU"P6BQmkj\5܆! 1K(0)[wRU[ՀۯN6Uc5RbbjŢFWoJkPi3p9T:窪*CDZ#J.8OcJ!d4m,l\q}?~&m<_^]u1&[UF,YRS5DM(A·̜"us"F@ )gʙ(㣄(>ӫZI+?̀87M}?~L9MC1 q~U4Onn>y)|y8CsP>Ɯ30eK-!z_sL)D!lΜy1*/~sv\[q@Dcmƃw{7l|WُE}~7ֵSZ>~Փzu~~[̟?싛` )Hg날9۬)8WՕ^4́\=O<[ qއSHR$@4ͳn'ɢud9?Y-7zdk+$w]=JS3(d0 YBd$6(9'@ƘJP]a0 F!)4j>mɗgժC̜ewAiMS h?rLy{rUea,O֘Xs9HI iM3֘r {Ds@ㅉeB%Y9S8" R|H H#XcF"6!d%&!&Dg"9KHJ?H)BԚP812/(m/VT`"Tr\7(mQ[|DŽeh=6UBB/"v-U.‰OUV9eCUS84HJeNK!eAEF!2wID"%^2RDG( eLʍ>YHIi6.$Y0g@RR)/j"9笵!FkBj<@ ShM4Y8U)%c4 8ih$ r4R0 "\T:YvΤI"ə5Ĕ@aS9&3 v?΁sLUVĐխ);g$R Qu֚m]ْF i*{ ~FBkf;3"D"cfH3]ciߏ {-_J`Z"T*zƁħ#YJRY3R.r㘒1&`dC?"BN)xv5ŝn2I Z'z_^,E8W)s!!1$#Ę|e "1@>nk)Guf@R3R@mU96|?v{bzKf3 ꪩrղk5 ֘Jk$u; O_^?~quC?sBe^]ub\Uu۶]κFV jS|Pai!&yҷ"[&Eз];GHUՀC;f2 nfbqzvQ9bTlVk**>4a9ea8Y.@ jhu,)2`fRL 뺞AV090iC?*EdD+,׻qfR}Tu׶)zt]iS9Ă!rabQ Y!avh=xOdRُ>*RFBWy(eY.,Y&EJ)#1JQӴaiDy0a,Qsv}Fs'?|/~Ϸ7mNZI3 ^xy}-|YYfTMw~~Ͽ|:G` v-R>wvM_gcpl (0ߎ2')هqqep)}jlޑ!}pU 9܏IY9[CC!)Js!,HJ#5Ιy&nO)ӓ6Lgw(~quo'_^!V4e}?!q%產:V>"9A`V RsEfct951HJ0)- MBLS1sF"pbDJ+%`4)NIVVH,!"(`Ă;>`+c(b"iM9 J.q))"(%V-YR"9s9HJuAfT¯2 k]E TʿsU& SN( #)'BUF@RZVZgcLJQDaIBmt.mhy},g>ZyKOCК4H`%SV"B,Uv@Do #}*ô1ǦwZ\giS"7 q;o>ҚqDqL])aTe!" "P s1rNT€PkS7^@HAgj@ Q׵F짔fclc |εNB`gBJyQ)Fpغ2s OԶ >eW#!LBZ1Cm@vVq 9eȈsHsH8cu iˇſ+4?z÷>shØB|{}_>:ۏ6'՛,[<_G[ƛ@0}ʯ~vz?kt>Д$Oș%"e. $r,":F4Yks@"]ub*p'" IDATZm M\ʐΙS2D$ V1zҚH"->eɐ2ȋbq~hX9$9X*!̒rʒpÔIᢩ&MjuEm %"0&/N7O~fBnkW5#jBU]Ji{I x\!E"3B*mmimۖhєSdyHVS;k S8ݬoco9 J!6L I8^)(Ay\vWYeh#gMS sNHkb,!u?NhlypDARSiҤ뺪mNa59< S4BJ=YVc ɯk' rɢ 9n'΢:sdyA)0L1媮iʉ3'M&}LQqu^5ESa> bX!m@mmyYRFQ JkR1QP}L>~A&뫷xcZ[c >{79Oxk/?Z6B=/o=vv\,˗/i\CgN!ى~;?ioo<_mD=q7NSgO_1wڍIekvղ;i I+hYr;MalfQ5o֫YynWqYv41ghdm+gV#"!S2B~iV'%h"MEٜ,an^唬!Sg^Ryr[D[DD*7?{8i)Hd/CY@pLY+U>NLO7۽2JVE^,fsy{b 8_\\\_w0ZWqׇ7~΋r.%0,j6B@wm9~ʑVbM$*mj8WU:Kiiy8!"!icLHY%C̰lghZpJ1E\vp^uViJ)R<3(=q; UXK l ȜS嬰Rhmj"κZl)'q7⇟#Oͷ|㦩5ƶi#2>ݜLZmN>@JnooNN7;ŢwΙ)6)pc2YT`9 9'H&%"Y,lsH'1&SVH)q)RZ!@H DPUMq}TZwFѧgaEjkO3Z&vyzvzq΃ݽ{ŝ{Ϟ짟|Փa8C{l}} k!3dqzyc2srZ/r7G躮?LXQj{ۜlXx'r~~X9;?=r>]o*^m3H_,>Pvm}ݭvݶuE CF՗Ol㔈uʹqfbU0Y[ӻoO^\1sX-V,KgiZ+E_kk9/ _|t1ZAnO0 ղ]UkK"r8 sLh{>*"LT;wvƜwӤ@BN 12hA}ϿwvOȉ)9f}?LD>eaǡQS `cO!%N (b))LSRAxqi9kRٺrΤmն$L0w~sN_fձ'H]ĘQVuu{sc&9E'?䣟v|}jm[o-J)Km+`66!)\͢b):ZNNg`-6tM9Y-?;HwOݿO2Vӳa}^v3v٭q!ʡb򓈲|IZ\'6d+k 5bf2>d$sV !Uey@W}|p?=l{{/nw=~iK1qdWiD44P6م4t A&ERv YZgLE)pɬ%oY*RPA\+]E6VrVg+d$@cRCt3=樄0'])*`!m0I *c,RJtT)Ŝ0S1FAAP>RȐe%T2o5nQyXf2ʺ9JN(Dd}F&L1-&"ZkMxj 'Y+jgM̜0kmONNi)E,4UcDʘڦ?xT8>x~f9c}l]UِEQ~ӵ7t{8$!xs]VY Uޏ{yN1rz!]-JiZu WĜ3mV:p4~vypM{oڍ3f v~OWMbik4˫[4)R7''|<=].]qΥS2dR֘ښlxp|p8iwzW>xr{c0&͛yAhU}O>Ynxz^^w];|56?(w;9E|7~(dq>@9(T,P`¿_7`pfxP+#DEtu(Vĉb eRrdU_ KtZslpȵbuIT.}QA"Q83*B.:ʐB LӬˮSYRI1 ŋnhm(rƘYrI-n5~A&ckJ"d~ 12f=cؤQ7>用r6V1yk*@G(_v˘X-Vk">錘Rv-n;?ϛ"8m}ΐ(BCt}sGhai{ m]]Y4u$aX\i"R> \Wk[?{P 9TdkgVX%[D*cU0iE٭n’84!DRCN9B9%i&S8c`\r1+aάTUJijW\1x|ʙx&36Gj;ktJi֫O'lA^Jp?Cco<|7yusk;|N, aޜγalzcZΡ"W؈a?ƽ'/wN)ct}eՓ~A1RlͲ6R@j]Ӷ۶[Ue@ItF vU}xwr=Mi"BE4 Rrֆak5u,+R){UU&cߟnVadVE˫Uyw{{T#g?)l67j}@E FSb:STڪԨu,‡$'& I(=裌q$g欈 @4KVJ4i+DOJđ4(PY %`Eb$MW+LKP!M() 3[c@aI %Cl3nӯ oY Q zeb'a/|ypؓ0LqͶk<g'0V?z)ĒI!s>=YTCxyA>Y~򓟵&C_?ܻ8 1gdcMfHZSH!()I[C'cYk8P,s'˪\I%IavFs9'24ϱks)s]i@z*qEU6*"ȒTRb~T9{_?iNo=mwg/~m8;C)kEp{~ר__O|og97}o?ỻO~AS;c/ֹi4ea@ĉE2A~'&Bx}.`J!XV2 2iZMJkOaQS901+Ҡй2DZHg52 6Ve5jZk6Zi~{v8\*EP-ҮyfߧL0y򳟓ژjmf\Ɣ)sꇩn~>5&J)zyJ!z߶ *gξ[Rh7$7ZCZQh*mڶbaX:LDR1M ̵Mm8NSݸ}t8NЏW[.:?}4I`\M>1ׇ~g)'>m HӴi9$/.iN9" KUalda '10k90ϫnSۭCSNyS"8j0ֺcA )GRGY.(?{zE_|o틫+ڜLLZ̐S6XK~0c~tuhcJIW?{t=8u|uդ5z4msh7 Q$ֲJ[nNs׿xd0[2IbS*%Uj\ 6m؂ 6 {A)UYB}L2>#2xN^˃}#ŋw޳Z}H1 HBlTR,J7uU)ٝSF۶}QC{ Iujs..Q3XKՅ7h Bݽ`a2sʹr*ݴ}ܶz ?<]LRUrQ;, On߼pEnLlC(()fϺiBJ&Ĕ|MnǓu2b? j ILh1 b YF?BzVHL:g αl!K,&@%PC`9(Hztǣ|$ GUM)@/HGFI@ "xc轇g-4es.Ǻrv>Qy4l*0lI HjQ&  j̠CH-HۋA 0QkjfP<[3$DD{n2b( UNC)&HEEDCs߼B LC#Ř 0lsf/laP vfNuc!MNϯuvO'&BD2ΙtY7zզo~l޸v۷ժ,t2wgweYGzn6Ǘ`7NFSM9W0岮G*ugBCjqr|XrlbT LhB5 B&;g,XʏK~Ry,!ԥB k uMg5Cզ7Ї!DQ\,Qe)$J  "m/]M^B»E,^>W?T~j~||zGnCI.ΖE›מͯkwo޼wtP~4?Ż}[n޸8G_<|O,Uڶou~Yg _f1?f7OS! IM,oad*ĜӠ9fdIs" -21Iy19[L2-7Pq[HdD ikl-C4$Ug}߅~膮L]}׫ oA{ uU'AE8D4SJYPU>AD4u|~ΓmyYEt*?9>F~ef([UO(1geQxkGt_շ/bg2v;wGï~kwvo~k?}U*(|$0aA*(K_L(Qs Qb$ 4%bi6}Aɓ3d!?* }DC|ȳ)D;@̕嫋ѨZZZ;OŪkxEP=?>G[׏- :Dۦux"gOTdz]6zڴ)b:c;5m[kTg^$ !ݔF%*1aZ/E6+גDg420 (oٞ 0O4- $`UM1)HHI?S~ēս[oW^xރmG }i6.ѓ(sƜOvf?yb~ ٸIjxΫu3\}sT뻷?~4o8]ll 9W 2@dREQ=S&%1WĐ铊u` ! AaMj!;hK. a~60mkT1JLmE6{KIef(B@O4)i@;̼C?j~ʛ~>o~+_8~XzSW>w{?cJ_˪r~z ܹwx0Ζxvq?^ߙWI߇e/?G{[7o9@BT|U?~r~o_/q131zɜikX4)>! !Ťm?T $&̜0* "BV&IjHHHdDp !ÐD׫ML!d$cuCC!vmPE/-!&!SrX\-0D$dc}QXD3&sP$|qqZ%m7 QDCJCcD#aa)`SЮQre,39cDX#It3_Z$"WukuۭV:LT`o>gzY7X8m7iTV}J;CӔA5,DCrTWָaU뺌a@ª4qcCJI84ez8_ˋ|Ɠt2j6f2ʄ5vqui yws[Q]yDdtjZ+Bm\\^+l)|U+ٹ+ u@l]=><6FXU!bJGXm6MXwM&铋}?{㍳Oׯ_Owvؿvƍ_{_towz?y~oG>;7ojLvQFDBaT.a_VecRJaCL qXc>8j>)Q-u!h<.lHlmYԮ(\Gue4X\]B߶EYHL~i.OV]q:bҴ\.oږ}d%tviʳ/O>wvQEQbbFԗk]]^Eu>~`;ڬ/N/.Ξj [w>bڲB^nOje :cxgXRDk2LXXERA H]QxgLFx 2;GjB@R!R%\j, $FaTB< Eelk{DŽHDsAGI պ>CrSɜ&*) j㜀dCzf:9w@s?Iڮc1"uHHf[' E5P)A3O1#D'cR@S@%6BN6}2nwI3Yg(l2^D(U$bT5#YLT PIWD$ @$&a&Q܈W<綆AmY") l4; $*2XsX@w1~f`J15mk!U5tZ#2N''ǟj1.׫4;ٺWmdž7z<4m[Zo'gɤ,<Ym*\ _.㺮Z&kl?(`Twb"E"E(*X2"4(mNdk3j$p!C؆1DžgC)FDP5Zb:B)gaD>oeg 18cǕD}$B Qݴ.o|n'?7;kI]oOz8=[,.{'~ǀp|^}wΏz7׿K/}+_?rw}dy w0MiLUkG1W0ܷ~Wq~'uk_BW?wZWNh^,;a葉5 h9C[ H9A*%[N)GX[WcDc2!Dc F$ޚI]8TERhRe5DZkUak6TخכPa10RLk6!hYU`TTfUUe&U6, PTزHp?`Rrցhf$% ÐR=;veU]"%c Ym3d4ڙNr Ldj|g6hUn֫Ozx Bl3`4QR? fiRߵ)((~n?w>%H8:>dkӝkCժ*kOλgx }Q C!DcӳӦi!HTiVٞqۭa0D9"bQ=";jy5Ϙ)ӭ=9S !ZVŨ|Q$ A6}%%b‹/o76tѲ )WͿKks];\?77fRj?;?y{x>}D- PUeѶtw6 >:kF1jY!ݔ04/QK$jêSAL]̧)$,0lڍaOē,1@Lm J׶"ƮU"֩fJ)Ƙb$eӥ$(¯n1ɇ{*?a~~/|2o6/W~/<=?mۮ(=}/msq~lG׎~f yyi:\VzyuuqZ4ݵA=z ];m  KLH ȒR6`1!0E.mb&^PѾqJj ƨleJdE2je&r?D FH[;[SAo-3IM7膠8Ġ}pT02EɫM@U^OtCO*Uޚ'o|6EaONrsყMbmu#~?/#2?O}l^}/}GM ÷n^;Bw_xփ?x0ptɃG)o'[]޻ϟ>-Of;M7¸.W=OUR Lh !@Zg32YCD05 T0[kP@UEQbľR E0 1 $Ų**"F%QJ15H1{Q˲@zbg2HL@(\&IemB)I5./("]ڢ` Ubt}[(84$!Ekm! 9`\צ,wj)+$8Jp%#hCi&ZnBL!Ь6[gbhH<<]-WxcpvѸrְc> !aB5k׮f>C7'tow_rbUwvBuab\LT1mHӳjZ`d:f餎)CcJS B{2$QjnhRⲪD,զu'_z>Q媹Z,>tUQĸ3G?-_j}Ν;MzcPc|hwq8\K^/H?_{?N=Mã}&F ɰ޵}UUգɓÃnXQlQem1|g!8c[\AHc I:I %FU1UY%M5F#Q(z4I9o~|1Yku<ܦY[(%IDG}YN3:D)e=5ec lm<+x9>$Ynl@` Ln(ge9'!( zI4&IX6hf$d2glz4IɲAsWUE!3rR4>!m`@ҙ[\ ɴyf6FIjpVHs/GU3olSa)pC YN" )ʇ*d6@*ʈb{LbB C>6M?% lN Cq4Յ&֣zՆβ!:Fمsvw:\S!īՒ(tvvur7..)| J{oOAȘ[dQ2+ w"g#Jڒ0q ÑBSH9nyaQ#g+BEB5̢ 01"(FDU-"0Q6'P`"YBJ!&KXÌ`Y ,"&J[xVIZb│D;mCJE^E}8?׿'O֫{{~ӇO&G'mס+.ί7׾?޽{_/޿d6֯i:5ojGy_?>8:zw?2<[\7];v'ï׾?Gdzdtss7oiכn>,(s? |4RLm63j9RLD QbDžXgWe ITh0L\œ %7W=ߙ]td 97飇t<$YoڋˣÃ?;;U? *8 '0];ۙT0Ue5";;㋋ P\o6Hz< }]uv46|g2 1رӲ,W吆!H]d\a0u]\ӱvZ9犢1Z5%)6EH^DC—0ǖ !$Ofu]nvwgwZxmlJ욾MF]ӟ\S?xh{=?<ܭ 7`^l2I)]^-{}8M*F]03JݝYYc+r1?M5]CGT00lH2"1*4wCtLeY;w ۃt2 ɤęΖU14mY42qƥw>9:qr|0M7ux7zspt4>yƍ[l7_?zWx Ͽ/ܭ>|ɣGLJ,ƻ}l=zpqyN즣p}vft]?zj=O$]3R*V ٰr&0$$r3QZe.ۧ j; H m#mfdHmK:TWx-$A> !LSlg}6{4x1IPHb7πЕDdrRT,v]g R quQupD 1PeevQ qLٴQ9}hfT)"#(w)RP)j-9+%E"26A15C"@TJ D%@2 >,HYP5J.Ѧ9$$5+1R^p'I $HDIEZ$bʒ> &h$l8x$%5!a]J9S^w!/./NT,= ^s݇;_z?M/?|z֥xPO/.UE@ƦrQ攄 )ES6!̜iT19˙#~ /F R"Q g)S*˲%YYxۇ@ y3$*3&2D@E4&QM[0 o1d%ߍ唤 Bΰ*f1c`kې,Ȱ71&g!/GoZ!xRݺ~bn>}x >xݏ\wwjt7/>zt׿/O~!-fqۿ/ /|Ceyهvʿ&LF|8=^߿N֫=7<|r4.ίB/./^y'p>;{ﱳbwd\l[$inS%I1BDk -2(7m"$ JfJ zR&[mR !m%$}w~XbȌTc2k%seYO/.t)BhQUH *]Caro E"* }Xw|>F]oc+қd* ":"R12ǔMu٬ݩ7VU/.e8TVo:ףk1;9;=K'ړǧ]mOex VE}QfE ݣ3BB4$J >5O&JkLwQ]-ˮMׅf.jzlmK ]w)*8tnBb'1q61 }`C4#ktܺ 弩LI"kM;C$cjm(|UΗ!j+@Zg k{~neO`_?<\.}MF|w_ַ<4ÛokG׎F8ZLãɽwo^?xś$a2]oLvﻔ¸*S{ Ϧ$r s IDATD9l0jPW@җ_oHv4)F!$dHw1 If dqTjoбF6xL0QtMg] S?ϬGKO߸|g2ۦ_o)`U݃ߔ5 Z$޼y5f㣣dr; & Di\~ǎܗO5;w?v7M72Ws8w&ea@ h$h2:!ƈ>Iq6s59LmYRTȅ,AUξEȁg(sIݞQbͳ׭ST381suVUR'<  EH̝ܚOyFiZb 7۹,IJs15:B FH>md)Eac*262|07Aڐ^\e _e %1#B]zh\e9J6/@bAQ|BBkL63!Bf$#Qhe!0##:$"_ÄHl F`"- Rt-1Z}CLƢ!c )b~sJ@! XP*(Ż3*\RR@bUH"YCӮO"%O *"Z:;A"I4D(bw-3#Z]=~zog?ɓ?ٴm1]9f5tÃ;vv ܩEtSua\;/pͦ]j͛oGOw_ҋg"'{]ھ7^?vT{^=w3$Ƀo}';tc>w;=&oU?Ogο^b4idgV,KYD`KG8oͨp(cbFbIJpκeQ0@K_W&44/K@!rծպi۾8d:[*7Dd:t4U)}/vmZqä.ۮ+}7|;&.W`؛cTW[E!\U(I o+;Ov]'#*JشMӌ(IbD>~pzSbPU۩蓋Ew~r61BTq L ٓ\V ;U;RnR7m7.8_FlG2yIݭ'w|#[Txyuӧ?[ozɏ~vn߾^ެI'\;?;qlowKpX޸q3 rM&z#>g Ij&wYfnb2Ȅl1HADD*̔Պ yW*)B B~662 $7.U5DO`wgmu-"Ƙ,oWKYL:%]#c8ل()(Ĵ]Jv3ePe,Oa*@Ӷ}?dccRv},ʲ,K]ٴ6&CZGm?,*&bZ*fӆ!Ɯ)m%T1YP 1 1skD@F*By_ۉ泣=@mӨˢ2)j )!^@qI!gMt>H I@y$ۙ_]hf1  ZOeEEʶM!|64@cĶkx„m"2*q3gM$ˮsǘX T4!lLj3.4,^ZP %fz i26]B *3+3#3fwsEF,_sߟeI!2 Y 5$)F`jP(e0T4i@J"$1^THF3qDBJN] CcJ4k"3.@[M,rcB ʇh5YM ">Fʬ&/K:UJD>VZuYEQenrk%ϴъ!RZ"*6g˪|qGEٳEh|*,j_*@~^Wn\߹k\im Óמ}3O^~W{k/m}&47C('OtpmdZ5ӿyrZ٥ۏ̖vW>:<^U'N]U]㓳f[W_|F0Oy̪ vx>Yy3.=:^,6h>yr,s>RaYՂW63sz6[5fƅv 4.,˼ !aMZMNy@QF(Vx6>w"#Nv f ޽/pЍQVvv<:̝B*rJU>ZVk;cvaV d6fV.HV)-2˲r F(v)n8mjptzVyV] h4UUƢn1VQ Up^V!aU׋UYmeVQdffM #\)Ywvg&`2\T@es>xXiy63 ٌE_<ʕ˃Mlqzv26}F]jcc0<_V^BMlcmeYkBe-(QDܮ&΍vށZyW;oqQfȑE=]LJ/r]zպVUnQVO<7Z;Dc((1gVˎHlǽV++-H蔥sng?3SFɬuΑR֨!1% !`|>d5AHeFijs#>p Y+4Mdj@ibQLZ%@A)iuGDܖy!˪B(固"_|i_qxx[{t;Ԧ]3D\Uŝx4:QǯM~9Wo\Ե7?xl~4X3.oݺuݼF#"TZKtyu=x`a Ut:v l6-˖gW._і&i,U]{wθ<}bjuyBZN/JKKkKHD&EcN,DϓJb*EXKh\(H"V@]7Yk1FT9" P鬲3PBA5=il22de9hm8Y uH$Zmb^rC@{DE :pȳy@e@1*UӤܘTǝ[cHVKL}ƈ @% bARڙ ‚*!R~ /R;*ddRp\%1 D&(lARZ?NG@"$rM<όQ @|L idH, JJ1"A(r4LB1RB$"p`T $ ,)H LJA"k3 J" H5D ɺŠJ% ̍5)$B4$i{[ݸ5Y D 3J딟˴QE@p`1J\FWDRP|[*XW 2xGR93KGȢAA4cd , B\TtACM"eQp䋽;~(,/>ԫ>tv2~ۯ~vVͭdB[_{F$čnٸzd9TfW*7+/lEb2Ɋl6uQPRoo G'YjYsp4Yfze+/J;8tzwmU+/y>w6 -·E^9C,,ojhQ;>Kؕ ySUg"޺q(,!|ɧA RN+&{ncE=cC^;NȯnuZyrYf!jk"xXMۃna}$"0JsMU/2ωnnQWF,3QB "Y Rdލg+ak[ dd lv|^UjªZ1 bVe^ZkIQpAX-!ˌ Ma4uQ>js04{_ RߝOI iVUOKW.j\+kL&H!M%1J@"`tn\l,2^ӓBpN|Y+vhR;"2|)BJq]jPX#,*+8HeZUL"pdfolh Ȍ,@bj&h_y^y1DqKg,+&].bss3b>~BS7US+3w1enVj<:^uƧ7d 4Hn GA]/LY&ɭO,gaUUU ̃ rat60yj+Agyj(4vs(E(y*p(΅ȑ! #Q:-P4(I<)"@1c XHLG"!$ * ږ'IZMt횤+qQO֚B r ":٠sD:WDj\uq((S43ǔ'ti7RkZEFD87)uBc-RUS+2b"?|W.^">Fkl:jXZc*EXMf+ׄ( RJ00s*a7`=)y5$gXri]c6,9B !(X@IRbU㕂,eQPߧjhaNf4wB iyʨ!R" a‚`4?j"JbaBH "B*qA` dR!FHe11־DSRw:SF8B^HYc !FHɅ!j&L$P"V'VD*J.= eND8xڒ05JD I@H'5:'!j%]PZ Eic"`f Zۭin%a4uޞ-_۽Vןxc;_̵Gg|՝Ų:'D: ?_dZ{}aKzᥧ. B"4YTMҪ>NuvCebh_FV<2Ƴ ~fmӶ4^W=6^m{K'}>NU'xgo2+/?'{'?&Rxǟ߹~?>?b_~뗟w>}ĕ߽nݻs+W_dqS"'W\~g. r*<跗SO\{[㫗vvFK{GGeaٳ>Zdm}1\ ~?qHHn^rENƳlt.,Sn Qznn+RU0`|,)UL^UA*$Ӧ۲U]W' (ϲ"/y@eݪ%K1 \U9BVf5q" 6"&VyH+ Ottnl^-ǏfI%²Uvz]R n8ԍgART "djT&USۛ{OK҆C|,/2_5?On-um;30ŋͲ2x|zÓQȍgδ"gbqt63˦s $}xmM\dY`3]fdFStX6Yf.Ju]U # 9}y"J1bvkH p4X )L"Q"Gǂe!!jM|y^Ul6:g3lt+,&hAuU9Nuju^IQ7nYujTgJǩ oB iɼ4$BB+A$(BHe]~DUH,(Ƙ8%+Ƞ]'\TTZD$Y9='R>25Вh'_r"m51Ƥ5i "Ս'Bk3Hx_ԮɭEĺ5dLdR.ȬT TqHm{czWVol8M'ŷͳhZY^2sO8iUEXW9G(3"G<!ik"/N= Q˾uG J$+EZ‘%R6dP"@$IN}:I1KA[D@KB驞'־]A&Rid-3O21{ e8s [@EӷqnSe5? Q@BtzJ(BD X^׎KMj襐qm6BVfk"Ĉ*3Xx2-YIAQ jjXAH\m#i  RB$MJ8$3(HI4: "֘LǸX6,Tljg5` jB]?||4:Ơs†DϢz m/msM.(ϋ_~pr[_Zn\|r9-Ɠq rpx1&),:e"{/_нv7\k\V]UJ֍yp7[yXyk4 [f^>(o΍+{i{a7aŲlG'6kI4Gpk ?gGo|/s +i5͇|v8 IDATGwW_{a|evsc‡1cqUo}|CS+[ӓo}~p|zz?_ff~+^}69xzqksןx|}䃇֬Vg⅝Mmɝg8_}Ƶ+Wo]4h廻[ʿoƻw>+;{{ްݶAgcctڋ6۷n]mvօ~eR@à (AJ+ ,5)7OVJaZK#RbFR"Ƹjxh:|ՄجzvT Y¢ZfFFbu̳2^1l>ƜMS7nO?8 dL Fgcѩ2y1}㏮l*2uǡ&cjlq>Ŋ(T]׊f\df:s$Aͧ&`3֔jgzqXygYm;I9x≕'gӲ]Jd3SYTtҊxFl w4vMISffyf@4*Bɲ])grn4yij27^7In+ڳϋ-1[+5dZ[E7>Bv,9CTZ! X׍!2N*\1nŃǎ햦(WD"18PV#YfXDaVU]sm&lI4A׷y|eYK[曛Q[[͋|~n]jUyۢpٹ|y (maqٴ tԸUQt}S-jGD0V̺f"hr(@ڈB$8@PL@CD2A9&D@A䘊k˝())8$ RpAHHA1R*ͫ&JDRx.h% "1,XUdxֱeSI1G4y4$#sLe KTBGEbԨC `H7/3tщHWVs!T/3ARj2(2ϣx e+J@uIo4G2/'*B^z8IZ)I!D5"Tyӈ"" HBH Vd1YJyRD"AfV(טS=I).Y' @D)Ŝ@N!yL]H1 B t%iOHk9{0ŲY<]'ÒLLJ,̊@krMT("Hk1Y R`Y2 Y!( HI!Hl'Bh`2kDHjZ"ZeEָB0E!p^ʴ&4Y6#EiD&`[h 43J]Q! JLa3(`Va|eJzn "[Q0Hf rfy']˻ݍ*u]͕CѨlo_0[BG/NO>/pY'?E-._ri2[lᣣ矺~r6CŲ^V!8>=xq_<̣|嗞/ڥָ=F/<Π;ڭzVM,'O}?k_{Gիן|~ht~0Nş^rqx|'nolo?ͿO~QuSM˿xc3vwq7o?}{_yُ>|\\zesc.O?׈ 6Տ~<}şu /~oK/K:+ro\UHYn/Cr1n26p`D gI]{o\xݍݍtbb(jZZ[cnڇ[[AO!N&cDqQA)4^Z|~ gE΁Q:88h;vgg޻ۺtqk]mN3ǺnPіVrrVlͧIeK7GY;n[^|RNڭ(X_ꃭa׍OW7._/yBvۄCXkUjoA^裣x#vC붚,2k[0bLgUzeEA":>91޼ruo7u-;V\mӢlШLMvBi*s[j?m* ?}J;ϗMtf"Z.Wڷ+tU(XBx"v>/U 5AQk@±᪪^n M^Em3cŸzl],j"RYJZ ,x~Yݮ*xg]z>G\x!3i|޹؄]tp8_}F,̆ó }B(Z*)B2&tTN,q]\Bscz$ 0$M- ̨44A=*JM̑sY7xﴶJ:aJ3kBQ)9M$4BHλ3a8]E !I~Ă&!FD"AE7>nY#&(D]ժڽ3],4b:'~,Pr!̖(2MHZk%Ȃ- dΎGPJa2$'-1%z^I 1NziF$@u{Ǚ1N0FXbg2$R㔵VE(GEϿ ")")GRaJHCa1I$H~"} """>(( 4F!U+cx?ǎDQF9)~W! ̢v ɴRb1)L'7Zʇɼb$a/_c5$u ֤@b&& ^ 2 1Q)L΋"e!d"s0FgVu m^,8 K^[VAB` U@r]_{?{xᵝ Mv0[oW[^.Vѣ_o{FpeMy?|7׿,yW瓋Wn_ksϜ}^ o/]Y;|_v Yk>s7t:-K*L?/7ܷfg>fZrWJ8paYin3!:DNh<ȂJQflj&ӪidZyfbȌJ@%$T&3̧ptʻjgwveme6ϲ̮ZvEQphVY?8Ovw/Msv6|Kߺ~;W\{NOGۛ㳳Nwpzv56zU]W+EȀJkFߛM'ժq>x||n}),&[7i^EYjcGY(B#>>'R;[6<[t1_խjPZDV,.DY,IITԞZy6Ͷ9!Aъh\U7!j"".L轫U {o|[.U]nJk1e^,G'`1}nt}a0>?jcssէd0_{=Hs@EZ53< 'S)ip+ xFBau97z1(J!)VHֆE"֊07#3,ic85 pRx`nR1tE)%HC]5L'%0 |ʸ3Kz9uH̼mWI& #H L#$`*ĵ iizILN9&x7>_[UhRlҊ>ׇH4Xp즃o9r&|} H908"a BB XVJi^$ MB1Jhud"mnD؟D 1pjR)օP(g ϛGCbvnH0Gal|R BB>Zb͚t1,>s@ҍ}kz6:fwv^MWZjoMj=}s9_d4^KѬ-[LussviwJ#g7ok2+/]6N?lg,k]tr?|׿ >f°Gw7^{nPgŅVǒH,>2s(MB1Ȉ>pM_Gv7>zf,'EMX1$!"-bXy^wҥd< dyH|̳?fYg^w6<~+ Ϳy]|{|E]ߟNgD|{1>=;lEM͔1!uOg<!G[[;;O>r<=;HNs8Ht>޸y#=<8Pp:_6[,YQanLQd1|j+ ;88?|g}n[uU=%ҐQH ;1 R u];&%^D!F@ :viVm(2ܻ@f /(w> O߸\.r^Wkc33LslHb.(R־Ҕi<<>нn|ZkW; MP+ #1:֍GM;Q ,VgQ0 蝃̚*ϔD&e"Α5tuLzIyH]$5GR6S)"P89TD 91AL OEm="i'e5ku2(BCDk-"pdB\ mX"S'+D%6 IF<1r$ԜӌT d!DAM^ *XD +QiA H&<HOnb&Ϛ&Z̖58DRe9|<;WU9Ҵ94RIH-I 4Ξ-a=G#^RYx}Y Szr"0 "Ir{GFs'2KpbaH('QP 1J:a0 M !zO #( UZDa A(cQ||4FL[(I%5x"0cz;c̵&4[ "( J9"jERjj\l3J4* bP.Dm$lm} ,9}!P h&" "RE:<#DND)DGaXVU@uNY''ٔP^yI"bus?-&nT^jQVAwㅇX[vzO̓썿km[oܼviذ.z$)uMhN[Vi{̶C`ytpwx6ϊv.7?~W{.]tOa}G]שC5sRS^tSq">zBk)j${y|ɓoKaXOjW/^Ԫ4,ғG̒~3qj}Y.-?O._OO=> oO~gw۪٩61p8 RZ.)\mAJR"Cs{)C(tv~ۛ/k]N~Wr?|_ZO/җ_[" x=W7)j=WSG9OAGMU)G$W/9 ř4E~3_-0t!Z'/oOoB尜j1{ЕH@"'yL͑/?78ӓrd/2ϥZ<tW@5C"Dh6kfLjpG8J9K6MS.2 Vm6#*6f*""n 9g5UwAp3ZUTՎ7)D M!RJ.u* IDATʜK"!ϙY0UՎeJ jFDf3  ܊p a"(EZ̥u]l]dLTZwK-K!MGGB`m!.k"LGqZE rklb1U'AE [^yy$R=>u?~n n3k+~&^,|?z?{u#ߛAÄy&ojnAؽ!j&ݑpjNIz)n,<g ^;Nd1Z$rimVvoGAыQ1<ԋ"0N5j]՚Z]tK@BLSqXF=LbnU׫ Lj1 1:<`J՝[cTC8!TUF @C(0.Ʃ/ԝlYL}S C>(&\혇$w= O.TzK)^nVB?88Z G'ժYbԢ ńe0NLOB9#eOo7O% o={o~Ͼޏ~{?|;o?v9çW_xٜme8!n71?8ۿa^]߿MI2myO?ot)@Z7q>8ʗY<ܑk~ٽYOhf`4Pn 2R6,ׄx{{é3C")H+xMnU3E1'VΦHi? ^zNp3UƁ]HVf?h u`͏q^EH?PEk NHUR4i MnI5T^3p1g@9+CdeMnD>ȝ+QUvY0BlnjV@0SaR̄6HV0Wޏh>3]ǰfaIk5Z Zvr˔oUr1pT}ys'T!0A8XUuϖ{g-0g'bT/w''7ۊbfs%9g%<޺Iڛ|/tG?G?nww~Ox:;{o}7,?xe>L!;|vwkog?H?:{'[ _??zK_7N'}]L^8OD} ^CvЪخn4wP?6puκ].I"R$>x{Ū D!O/n^U3ۏbHVA Gt~7d2f .lꂆժ;xHZK-՜DPB'qb@C~XpL5: Af1·✐Yقzyz^ L4SZ1 CD̦6Nj{H0漟0n!u^Oo~ڛo/C74?բYͺNR \ a1v0[ 1fR i$#!.6;:k 5ٽUHjR0{7}֋n)OO_8*Hݍ7wD/df?Y˫|~Zv1|xbeN\4o'7bWX³'V˞L-@!D!01 %~w(ük)6Xj൘# ys#0z0S7(:88٦.awZĴtPM@N[(b!:j9] gv;aK5"q2 1O rZUK @k{Wńj#NH̡$R232Hqғ#csC] b$@fi Qhd 9 ֹsKH@7U&8DajΥ H$,J$`Hkբ-OՀ<5 7bf{*Ln%03C"nU> @6aYBSEv4 2C|tGKw%z0ρ7CV4h9Wd T|*j_fҩ;2b5( *<ćgñ)P bF͂ #5; TKլ q;.509mQ$gHx2౏]j-DsN-֥ AQ }!L"JQ#ޓիWusX:EњDH10rX s)Á.0AQ"t&tg0^cF D02\ڢ#wK5>@\X# @3db8ccP p~ȓ窇1-g 1 d"Ҫ10 hua@VUBv<ϥ Sa.uXŐ!Fns <==_՜.] @ AU@aʚͮo9ߍ9۱~JX KO?ydxtGϿO_|z_j@(1׾Ǐ]ow~bHWvݿt^~Oj9lw[ϽYfo?Gmw~7+/~oW/~_~7~x{.V콏_ι\./D]n?mv֢c؀?{zNW\f3 AӜͺSſƳ+\uAtݝ qߍS -X'_˻R:xٮ˳Z~ՊXiR9, OWax\{Y~?>|qw3nH'!}/_o yNЀQ꤇=u˧WzRHsU<<{o)5VD!҆WU= ͡zɼ܌6f2AVaR0TU"5/%y'"'YM]MբsDHƹT!C 8DwLCZ ƹ]\@ 0g#ijqK-%uLXw:84L!.ܴqqiΪ 򚘗)Ȁ"00 VjQmB!ja }j)qE0%~}n'^X0ջ~:.f_ rK!a. v)Y p8zwӬo==M)r_,'G/jFs (U-hj_ߺ\0fWs%<%W&~y~ o>"FaR"4Ղ8Ət^aU'?0xK1~ r:PWg_;_ -a9 f3"dBad A) XŀC d K^$!x)bEKYMyr}e0.9/⺗oTj sa9g0Nd߹#WSW˥4ϐcJ),kBz AK吺WC7}OBLTsLWuzEl<Tc_?{neo7;$6`CwR jߏȁeRc&<;=->~%!v}l)?}r)›E?wũ"}yǯ=>bwLArO'D:)Sۏ/o}LNNewsk q\`8O}ׯ0N-R@n52] jU*Pdʥ:}Q+9O nJE8tu)~$q.A*1q)yw؛rl/" RQ]݆$sVC,uf ]# &WjP0oUs$ Vxԙ*2c;I@FcDBIfw 1ܫ>Ԏ6-)ZrUf2b"a.=aq)DՐ L]璙,HpsȥKNs-S.}JD^ru@aA&|Z4؞U@ݐu+:$>ķۆ=vp#>>jYZY(g<49b7_>Tú}H#g{?E^Vc< poeWX #C"كiJ?0|l#s3"! 6~ p9 mILક4"Ct&bg¶On:Q5+6o;3ڞR7WӢfB,AR g P\alLtYB@o)"B@sEwC:#ѡM-eKѡ Pjulw8yJ}UeQ@""͵QvR0%O]a.xjheHLkb:5 1q̥u188Waʵ"sBdr"g$aZEy6G5 uDZ9]X =w4(Ҁ<vW7_yTJ9[ =:\t+oS`?\-<+Y` :n_byCc4׋3s8=}tX/4 IZQ<Ü>f`VqŢgPJ-[?D] p3,>{l8Н\(:6/顮[z^U#9>px IDATg`6J:ۃ>z?>C+CB=>DJ)I0CHpP@ t$ ! Ֆ_gZ:xRG:&ʎEߎYi..d̪`tci.S."t% uN.zKQ+k ܅C3{U3& $$azYnS83#$4*!yߥRjb-sv !&037_ ]B)*) ZQu"5 kj+u534WO w@"h]\Us>-a74ͫ!ͦHf{X/vL)0!3Z5/hAU]- PK>?;[,r?;=9;Y~f7Yn|y*1=~|^ A$ yr=>_˾ΥfsA<⪓ Vs3fj0NU N)BǾ\h 1jB.Zk[h!&fpRWp`OZ榽׍YoGsFnT[$YvaщAu (!W\jͬv׫~\Ę>BR BN1D \OV'r.^'+5pW$Rt=}^/>vcxty"WW/j}J͔jF(OtvzѴ].֒z.HUurX0mzn8jBJ)ُrR'a$s஗k5jbõ0wȲq$df{!zY?Xa0G@VuYL23#c/zYz(@Ve{˶p)3xc P*RͿ/욈5_T1l;zi^n˅h<˨M tsq!;""E=)Rݲ,czmDZotz͛ʡ\oj:< U]-~T}l}@h! C M ...6 z{+LRjJVX\sns +ĬxUttC\ZA@)T[]ÔTpWc"E aƶ1alU@~yamoumG߯pu=?^7o޾]/uY݀к-uLRk=Br7DZʱ8j]J+rݗp =‡#LmX嶙ڹۧ@m;Dy6s>DM#֥`D>o[J9l! th 3P)ȄiZS]lf&i0uqDTR 1Hʲ,ץV﹓ "U*PDľjZk]Zs"}6Reu//75֖V+A g}wFmmu=/>zʥ<=>Va;:#Pu (R_] دyYPU= ]u>N&c8h8#j-<fd&!rcܬGDʜ|>oV.+1P"cqH j:^.[:CJcuGAdP ܘᎎCjfΜ1s93GzS*RAw L20-edXC0V̔ZwV V\"!AgPQu1bup7|GK?_?OX^^ݭA@1e(\PkU ac*jEIA"0gD@GlL,N'lT&A3pWGbT88)ޕ3 9D=Hd6lA3'Keq-g^vb3}_g|nk)2Hc+[ #@}kg]ՄO|iDϒL6ߧs`vS$P7fӓi5-bn$, R(nٰHk-f'DB (R}}W#A&@gYaSiesÉ=p\(0p"1 j/^p.ՉP͝I00S#h$ݡ|0)eU|o~uYo]åք~ݶ HY>@f$A*cFm6n4\_^>a߼}SdVJ`RJRPܻ Yfj]׬s.Rd~~uV Go|o߼)E_vKڈv^^IV(;>9Ld1>_mWUֺTAp#kr"rmRxԂ0YK7u"bʡHép`Y!*LG HU:WHdݿȝ^@{aC i]B3DN CvvMij|G<)HGuA!(<,R0x6^Dm9ܯ~hR0VVpf/Skfncxc#td @wp@tw("IKR0795ٲْ]&%DV+#3d =O𲮏Ӳ,uD3lmio&e)KkL7p%Kj7Zp۱{BDjiGfzjQF̬c@&HH#~*"Q@mߤ ISͶ c;*XT3P\ !RJ),0Y ,D@C̹T6ܺػxV5@eiMeY3KyyH/!H)̬j~xxк`nX<Ʊ]t "AyrD,$DE8ݣUJf:"X,LO0'=oީ !o޾y| {xxT…Bv}YN\+H[Y8$tޏnCͺ.|ގ5mfO KY9[ ܑ8]t>#| L8JSx0OsfAyl>z@("d6U:T Jy-"HLr^OqnjJӋf$".L)# f ux0/e{Wajh{7$P,`t Gd39Q yO"I*d3) ,С"Hy)$4 >T8Q"0sAc!AHH.DI0@Hu#k&$p3 @/9, (̑6m@3JjGˆЕ0= Wu\`1& r\W eCaBZ-<%&L@,ytpQ8HiNVECO00O0ra 2T -bUC7`cU+ZiRE(KӳoG$Zaj `^]J&!*D,V" SS p{@*RPpYH ܹg-㈱P3鶹)|RLG7anvByz8"€rjuUvweB Ryx s!RץчIR@ҵG), v{mmtRӛZ8zLb6#FMz~|#r6LUo/EwUvY %µz\=G(u_VJM>k#"߰T N_^jĩ!W~F̪aY1{v" a]-9+!;)# 0$"X4w 4 B<RXc>*KkYsg&HB#|2-"ӲV1|:Zn[W5!d`SDEj)SGpʂH?|z2<ߏ#X HǾZ+߮%(2_J-b"dj[twfn`яU-pYv,t""p10H1"Qq1BXI]k gj'i2мf֎A "pBvWZ=.@9=L,ĉڇ1"ss,Ye:'תgen_%@6* އExbqDH] ͔i~v5%zL"G@teP0 1c֥0s\e| DCUHmDaH̜MH#"3;Sc@BGƬ1|G sgD =a6܀%arEq saBTm ӎO rh0D$CD;?,!aQr#{6JeI|ʐp̻!K#(" !PA48" 7rC`w=P+.x`-L~<_n߾橭ye~iW4LJyi އ!* NR~Pw޻bk-9#a3և և98^.[?Fqc0H&P9͘RZƯGu<Χ7<= A(EJ\mwuܮFpk vmGz~iSD.}GxpApϜBHHI>L5{ jw$FQRUf QDd1}k *WSL\:xBXT|[!."6B}n=㱁L}), a^ץ $$&{8R!;.2Ѣ>z# :E/Ìo *"UCP3= , fYk[&6qӾ;Ap5 @_YtU!M)F5_D>† Uf"")LU'qx/n~nCGnUȆ{@%n*j.m#91LUu0Tr>MC-u("ϢDH~`V)jv; 3 3=+ѻYPĤ 2 'p{ٌ@$Q*}zT|#Xç 75w3'_cPZC;-I!LP0{eǧ}fv:-G,"½GdBcT.!%i2#+-kvps+mƌ' 'hnշI__ǃ& D0JdVRL'fDC?+.d%!%0]e| wAdʱ3Nӽ+& M{S# D \'@Ig7&5x*31{jJPԀ0R+V8w,BsWsN S(#@w+.B.琖0H )[ LY<]E 8 cjE0t>HC )K*Q!ka>"ބRW2z&Df^@Sg z OO[10 ;gpy89IXSdm[[RI&B"wQC…1.2Rj-qo?~XKy}Di.ۭC1?ZH\6tvx8?0dSDX>E ]C7S &}t&1ʇampjJQpv"xZ%ַgY-7 >/Ǿi)ImyϷb{ˮ?f{{<>ErZ[ 0Re)U s;55ϷK. Q*k[U '&IE#CEO'ѻ @EHI0399!liHZ3dK[c`kԪ#-@LjCG7+#(ٰ0q#}~tfB\RSKa~C$ic뷗nHjj%@\7b~xmyPԈc8pߝR.=K%sʜb ,8zp@cHC;dS&9;?F!&01IJm9c}'ۋ@=߸ú炜awJMju p2Sm[ xb"[*{c"*D㗝Wxd$!_Dvz㾨G'JTR_Y\\Nus܋4GGg<焙^ "gԶ#҃I!V [e:1b͖gp#  #H_J3ީ92`.(SMpD7uE,Rp+Ս4)URӀCuO xv !@UJ&Bf@~Z$*'JsZ aA(< 0BBphcN3Ww("є-H?)i̝}b2p"=( *_"0-RDX.HlDBT?_۶}tve[xH\{ S&XPwm>/߾C?}fnۏ/]ZbZk-)c(2sRwnc&=m>p^)x_~#(ϙ2gf'xR3` AD C4eY0i)'\KU\];cŴ`#Yd\ė bN|Χ!^a4M ΄ZC!*C 桁n`NPXi(U-n CW #%d!f*irPfbdrKe(L3z0pg83BHYp:",sE̵0aW#8bXR}z|CV)%Ozu "R*-\@@J{w6 >zݏ͏a̰e-UO5MSM+ [v^vݎt~{ZNڈ z ymNkeֻ q!e&y[LuQZ]܉ RC]\8A1=-PDZ"D`PE@WȰHY "IEfJثSdێCu"j!P(_& %f/ڱӭ"iCU# R =iڞH"l IHDL"jn2SU\XvZ*1[0F+~a1f3GߎG7ˆ $pD,\@Fm@wͲ`LCӆ@Ec1Sx,gSZZ* <00F\d}gC޵>ƈ p"_JqcRJ#C1Tݴ!smEv=2Ki 6ԙhDZ5""|Z0,EZLj~>]7>_~w|TUUU`涮HӇv<<<v}m $b1{ d)~ [EȺTf>-ɴHD~o$d Į31ii`\ %Wibl ̔f"}2+t"Đ*K1+'R&Α/MG{},YxuN{g"2YYId > 0[yDbHfvsp ̈a!!Ϣ ̓9M bd|/4,A$xRD^SI )\1B_IG2Ɍp"Y2|P_GyQ~m0\w9\sm[eh :M4QD[IՓEoE)9#b$Q$|D#eAT~cJU"BjMRZ@ig.!f=n624"Fp4jԃW;؎qۻv;/zZiR+;l>L1rZVn{P澔.mFpJ)̌Dt>-߶H2g}?9ͻZ ZOK]„#Ñ2K[[^LD̄DZn:̐0 :Df qMG,6os! ZsHNM?1ϒFMk"E+fmduSc(pSs̜rDbޢ{TSO$j:1ו¥nl_|ZLl莜8OXY9V3Yq@k#l۱Gd92A-̇{b\3+Y1b$*RC4!aDuO阐m/} {) V"n߾{錄۶nGġviy???3X1k 3n}w~uY1 X~UzֺXvY, ЏF>fjftnR _F$@2"f~z&I:̬v)r%2 J<:&O:Ȥi];]s53U}H<+'!XB[(&y{L޴iJDr7:GPgFFvAvΡJMZ*0)ńE$!1 v72&k"v܅& Ɏ`\/A;&Tn@ǥuljC Ky<q9~[ӂ[v<~m~*aW>{۶El8Gvu`ϏD|ִ= x}~5OE{`)'3[:;/W%tgLEQHfg&N񌒯gc"f2F&brr /Tɳ!%ERd a2+:odSkfUmJ`fLDʭ.0wwb@_ BHe/I"srtF_Y's.Y1Z _/NSnJ:!@@ous}L! x,Չ>Z\X S8+g=!m{o glA/z$ UB楐0;sz q;+*= in=z@lR/,!Ǿ7M ;1QOC@PՒo"v{EXr~)]Ik&B7oH{z23ÒUZ![5mM`/JEEdkr{9}ێxyǮ 'ޏ}rËmdi|~{yÂo?E{~%m92Z*4Wffn&'tkMr*ylKPaab.IL],眂-;V8a%a9QJDN"01*y 7CQ5N!i ˶jMHcU(NCw =Q bp|vK\o/۱{NٻYtm߷]8sf1\ f VQq,Tʘ3ԃcwpb bU>'R*^)q/0keКtMAv>ǿݘ RE^D WrPB.*='=o u&QE9Ua/d<rp4،1J)D5}ZnFٷGSrdNfP&,Gh^5D:tʖ^8&MLVCbn ԿprCaJɠ@B*=k'BҪ+xWFZyPRUU1 0t9$=g=,5X2iJaG*rl*1;CXmYUyDyPJlMa.>&YL[-=; Wl>(P 1E\E[5QE YKq+ .X\ fy<ФèHRPlZSUQAg657J4usb .unxſK[Fm[3ݞR(&k_XO6x81M5,(z'u2ti0 EbsA;|pD$v4c2+[B2.} +8$H d`t\W*x‘NL1l3T /L9`V(^|` O[! p9MĮ^eGU^-IIt8 Y-LuCJ"ݒ[$nfc*_.Q$%X 9T8SGM;sHa{a(6d+#-I#1Dh:DD0ŒR?D59"Z1I%v7.S9hq+KVX,h%1f-Ul^3 Oh1u/UvR2R15•JT,NyϿ۾ +fO4D0 \TaxQ@d]><ϓsZT0Z!aMo"8Y5R/(Yuz8Z%'qOǛ>8&~tH{Qumz( +*} H' wyy'xbS]q U@@jsIpjP9ɭSsXk/ cP,, e{,aNObLs}(Չ \oQ"d8TpZZ,sÕY\ke4"O/Q)XpСQq-CY粗X< ˘]KJe]Dc"TG QR2X^=* !LByzfU>S rAG9& NQLD&Fw̒A^ ;r W6"L30T1r_ Xl)&ss;ieSV9UE h)4y,:&Sz$Qq'|ZOV{R}<1#PP3]0*2ɞ9Ia޿@Cḧy-UNȞ8+5_a=O[f2\B ERvGu() Vy L˰+ZkZP T^OSI[AD!S4Gn NgjâhCȦlf‰I( '%౸~@J ك |/LD6 TW)r0 "O;6!7|6N'@!Ձ9 x{@ߣ1a .4~3B(\e4sW@PD6r^1fˬ45Ez͔a͜b߱r5OؘzHJ`1nO2^Fp`xA^~NjPy*hQ#` **( ^)L)[Aasұᙧ%^V!Gaeb!p=Ӡfa8WaMҷs0*aAj,Xx"(kwJ;!_[Q}%R`2ty>A9{y],bRtM^D,/I\ְz 7ٌgzcY`5{,ܘ=NnzdK4v9hiuÓ{ Vw!GM*)3f<&}2Fs SWKPp.1˶u8%$B/`ZQ/ʹ«~=KjtLE?tiK c z 1Oğ:WjlКεuV7FY1 Z[xؙX: dLRd)5Y:Cb1`f=rI e=Ă{%1OWt3$^6SmQgw{ _xC4ƸcN&fa<ƻUr%#'W?y4iO@iO/(?y"vXc"űxy׽}c?cd1m˓B8D8|&6Z.~e3 ).p/ڇ1ff`J;U(( xοW/U>}%Z 䍞!'5I+AJSB#rYp%:kBzfQ9 /bn;^O=RSw_uLsBͼf\f2W`68+Vn3|b qÇKqmF`Vbύ)~a s |^X|LTnH "2RABd#fQf-~O`T_;wAABZf,NpU?cl8Lĕ4%-*:-0sU`Q~zb_Rrpڣ|6 ]FQO($1ѓN6|q]CK\A[ܟ|jFo Šd5VF!r&ŀKSyA׏QO *s+$_V0}W=Y/,_3w|Y^m,R_}nQ6u%8jrqQE-Ȱ"M,t1^R9̗; RUT: hPD#f5 E$5ET>X^+?ɋhi" # &;cOC54Oa=} ~RH-Lx$0 TIENDB`wally-2.4.4/res/images/symmetrical_tiled.png0000644000000000000000000002771411676624760017657 0ustar rootrootPNG  IHDRxUsRGBbKGD pHYs  tIME 0wiTXtCommentCreated with GIMPd.e IDATx{xTd` %b$`"H (H!Xkm=V =#=mY>4ROBU @r3g&3!{$~ϓf^{w]]z_ E#h'| 3x bծYf(g!| ""@L|%~B0׃Pno)vݎ=ЫǤ_, L#{ E&P(L|t2:B\`!X0`g U QfQ E!- j1Q &xwtR3Rp H{?⇁l!]dfo˅gHt{Rp E3gl Pn){@UcB h`bMbBA߶HS NC:oS8vm@Y5]<^(&|^uZJ)Hg@/BEՍ^&6~\q~2S0|}XT?AEgϠ̞9]C{W NO~;.x,~x\P?n짷!sURf? P'IOhڵr ◀M~RJW33D;S38fJ)-4!ķ4TC+PDJ);4ݹ ^/B%glFfUJ)K ?kpeW~Bà FbRW NP:ߔHiZZ*֥n4Lu2d -Zma ZC9Ad 1vzH)3n з{v>*JPUUş'N( ػw{7:W 0ufffj-6MpDkPRRBqqq0VpmFfq7KOOoo>f̘a?0'N8gϞW^!eRz{X*8/Zљ3g-QRʗBjR^^?`̙35kjA2{ J);DsG}7c v;W\10hs9{J### ]tRS~E^=KQmu:KC٫L6-&77P|3U`q:,ZtG38W)fpQ=\|Ν; =o[L$??_r #Fh6eggUpA;WEw;- 8kkǃ>Ȑ!Cy m[i566Ãr֬YܿZjիذagϞ_311ĠK8򖕕g :9Pe1 GU9 A?3:1ۭW^PDnʷIe{){ҥ G + 1,--%77OO<9h/͛7w^1cp1֯_e{yz٨Rʻ_Rks BP-()gH:PPP`[?(42#jNX,ƏRN(Rsyfﱁ<Eqq1.]} }зo_RRR߿)))(y[IIIm=װl>ʢ­69f4Cӯٳg[6~^B&Lhz͝w(ݣ!?'77 N:qƙrM6gT8##xZnСCG7ߠmk.1304鉂l{R&TnQbkǏg*}H}9g0ax^!kTؕ]I=tO^IBVVVۀ6\QpQn4d2׭[G^^.\7nSL1-03_1x૮?dLUյ>|SNmy=K)3ݳ7K mMhK@ fE3eڵ8p@WCrm5{{1 $#/)݀iA***ۿl6:t0N<7;IMM3_y޽kƍ7|=g)eGu~>KLM1)e;#yC||<ݧ۹*ʭ,nνu^k[!l|Qa{QӉ>{}L>ϥ JJJطowgЪU+222Xr%.GR\\L޽z-L.\ 22һi9..Q7<я~Lk2OYԚ&o !J xxKŋuGi1uʕ,"O:Ӏtu1| yyy^q)S>JDD5;ugk;}46m;v}vJJJ(--3(yCd.^Xmb{0֭<..@E,ijl2ݙGMv-g˹* tvkǁnw+8)ZjC=7ǹ*@y:~! 8}>םBl۶"ﱤ$l6ݺu3JJJ t͜`qqqdddx;FqqՕQ_]~a"ott4`V{Rr܆>dӕh>߿_wm2zWvV ;c~"uȐ!۷o.[V!av;^[\\{ukgddxg,Mqqqל #ywu% Zoj-Y?;Ry]i #F08``7ci(Kz,v ><7׸q:ui.;voBZZv)))~fM6y2`2>>$SZZ^VV̙3*k.Yn]k; ˙7o;v.{(y^޽{bٺ9ݞ>>7&+BXzW_~YiW_ySN :Ivv6s[,q)/t M#3q|6ml 80$Ms>cæ'|2 N^^˗/S򆏼/b<oF{vKynߠPoYYY߮7I@U՚mloC|jéSjڱcͣ{lȑJ07224=B+VŋQݻӯ__7u6o@;Rʼ:Rh|F(tK(\}Wk֬񚯬V+=sN^}UΟ?ᠨ)S4htRJIII!P򆇼K.eܹ{yߘў#?lKb{&6Kjj7(>>==d7sN5yyy|imX2223,q =K)Ӄ|BT7P;C[mndhM$YfgzTyoκlذ|F w==CXx1Ngm˗/dɒ+_Zym&_媫Q(X !RB4Rʷ݋@}[@\UUu QQѰE"̠GDEEAAAո\.!..YoJsY(yC+oΨ.Fh:-bMGsh׮  ))y˖-~OJ-ogB38O_,N2@>Pivْlau֠^yy9III$$$;狀tرck? \.dddpT7ӞM`^ qgA]B5ESO=5p&ֹz[w!*Ju Fksaߠe=A埣m<'LlYd_SE5RV^j5#%222$馛twȡFk1ܞ E%BUBP(S( B)8BP((f̘nZҋb!::|A٪ԝB|V{6Zu3 E3QphE}_WZt);w40<6-hJKKY|ߦQF1rHZ|,JƗ gxSu3 EQp}ѧO^{5pKzڵ)#?7xv REEgG/ I+y͕`X۳ T]BѼ\XSQQڵk:?:Djj{-7Zu_.gXxZBN# ԛqV5YCMMm۶A uzCO~z~TT) 3۳Nh.}9RE82{l֭[gl޽yᇛR!xl_˱cZsrryj̙CaawaÂtzj.\ȶmۼcccl ><(aߟVZzj@KrAz5ILL 깔#oYY1zրӞBJ9 GU9(;.\T/SN5*2󆥥{egg3y͛ٻw}ǘ1cq;^۲=<={lӘJ)F3YthѢp8FcFH)C}JΝ͛g<<۷o[oPTTĉE۲u:ѣmvvvlcg)e<,Z o !· /t]gFkvC+sZU8~x׿u F3Sł lA?~|էOKJJ ?%%%<zm%oțԦ1ڳ;ݎ xZd[mVsE8ouCiiiPpI 9vL:qƙrM6g@se >>֭[3tPoGzs)y[ڵn A3Mz<U#X´* R̆o>rss9vv-'? 999p:?;<؛HnS\\|U1%oː722,Lu+7Ojt" YxU[waҥTUU-cPʕ+H)Y֡,99fJd 'Nу4甔?3ن ؿ?Jޖ)o(۳2xABCU+zO,_Y($ 32I 111!x~aÆѱcGo>=y LE]eJՅ*•ooYj6t󓁄@/n:pظq2eJ.*.._u!Cxmx\oz}aN:yG(۳2={󸄺ܤgB^VXXh8pc)8ϋy7bօ+**5FLɓ~T?ݻ6nȁPyo6g)eGu~>KLgUWYxqȮ_PPGmֹ΋3bm 8ݟ/ !u/t:RGyoߞӧtAII 4UffCV`ʕ\.=Jqq1{ϟ׶0]pH常8b%oݙ֞e5MB.TάXg=,X `fΜi #0 D[OVHO><8)S6v;EEE~櫡CqurOةS'?Wlڴv)))'OJ799/V؞=u+8K hKFy򩧞kȑ#~qgmtu^!I))(us=Ǚ3g"sss:QF1}tӲ9|x=z =='4i&87IHH!tЁhu׮](yCގ;rĉKm۶6=#f {u0f̘Ѣ9q_}U4;I&2kL=T x=RYK) OIDAT ::f۶m[nKJJfѭ[7}РA GFF׿p\;v^c?@^^EEEJ07::oB=ڙў3>E+;fFn߾ݻoZB0zhnSXX5qz]"##;cq8zM`)kJ W򆑼v`V{FCq5ږO\'8w?!֥K,XPssF޷{1`˗􅓂 lquʒhg;lQƍԩSCx1?UJJ iiik6mubˀxXf RJo_%ot:)++2=<{<[rՖt"hm_X Z\Fu 0fڵk>7&+: ?fϞ_|a<Ыpx ))) 0 7nd#ܸzRB\Q `g$ߦMl6 C{|+9s?ذ)'uF>@-}"Xd  }gM .]ć~ 9&Mҕ5wOSC}MxOєvZӮqFD?f8%oXl{vy-a֭[/i#"eٲe~ cĉZptyG{~ۇA]*tH9"6ZN]SO.-- cZԩSٱcͣ{lȑJ07224=B+JOfҤI2etڕ:-5WƈxO֥}rܨ=BgJJJt(~N:ՠ_CӇe˖qFa׮] ɴitnw۶m,\{!J330H_ՉoҧO[7zu.ȑ#[ľrJ***+w $PHm:RʑѮxduWwu~$$$0dHxNbzj~DzAўjK@!d>޽^-ɢEDE1a„kĉuYaHlUpy-6pEll,S8۞ߡ0G2eC^zݺuCJ`Y%u;ׯ[l ;vi&o\pQpǀuh MC=  { < /Κ5>ä;xueÆ ~櫴4wnXDnoT:ŋb]|%K]Jl{6% (W)84i'qqq,Z۷:dŊ+O<(ۦVpu:v{q>tlӦ3gV㭮jl 33/nEFFw墸/zxm4, =0g} zxٳgŋ{ߟ@0aV5󳳳udC[8B<iw6w?v1hР;`lmk{Vkf؂1cdd3s'4i:Z3p8вkcڳgOfΝ# =Ln+//'))Z{7K.;ֻcXrAFFOI+yC/o0Qũ0_|ٳ OʬYnzoٶm[ٓK}&MKi3~&z{wd^h<36{cqt7XPUUM'܍i3gg-Cw l,m=aOU>}1bCowW_}vBK/o>555у3g`,;t{hB_ثZuľDFF7t9(yMU2۳i8nm۶޻a[uu'L[o.[;B^{MFXUB x= ^w0fC6+۷oٳ߭[7]SZzx7n_)Z@@/lؕB7_a(G ̸Wp=uRp EW󤔋 wO܈9XvfzrUӕS(fH {DziyWac:ϐR*P(nY -Bz[k5wizR NP4U'=x`-/qj!ġ<^3iS(-V%W !~IKmv(nJRBhdvڦFK5 KhCyEuNfp E Ť1/ !OsR!>O>7k<"9{v/V Ec>^B˘nw/msVBR~Ah`2AsfuO Ecu`R)U:8 Fx.JQ)S(REShN%UMV !\ˀs:RRhފ#v 6sO !L~ƶG@{kB귖#!YBq-ǦSYoV38B-8,RJ BOH̀no{*IRP>)͘@ہvH)'7XU~~:\7eHMS(e `;֡ml)8w'mU NP4 v Sn@KIo}FxV!mKD٣3ktIENDB`wally-2.4.4/res/images/spain.png0000644000000000000000000000165411676624760015252 0ustar rootrootPNG  IHDR A< sRGBPLTEZ2ƶ`~bdVHfNK|,;Z`\v8/ 1jczfkJ* Wyzta#ˈ߇L&}v~VV|fou i/=\I-G8I |com=Z^cfĊIx |g Ş pXj,V:s^^N/d! ,0V5^< $vUU{7M"16stNNRF~bb1A>e{Z& !f~JRR z'̚ * G~:. JJ =:m;vVP^LYHHVr>rpϷ!ʦe w>ZNdTVB9SII1fr" tH~6zn"io=jR2ꪗ1j42^Rӭ"Jvvnt<ʐ" jN9+nKBapfB)žֽ& $j20R~>Zi/݁sVjEzeRR|:!"}—tRFYS{*!Pf,*rR.?YXHd@wpJƱV& inJ2Aʲ$xW*^r2,{h N.@Qwnv 0F\xx|bKGDH pHYs  ~tIME  {(IDATc8 0hg *($@;#R19zoG_J_^.G?"E:wÇɉ /\@ Rl@ 8Pvhh4 Z T;1LB:F1>b'9t7;ַVxկx<. b 1phP> ^BRR<oY+cffSSSzxK=Br B0'7 O AmA)ҢF41Sܹs?3+nz\`5˗|+ \(jE?\H$RJ tek|> gΜl(#"UUUGcc#JeNoX` FPr0[☙X?<9m۶m @dh4~fԩS8~8gyJhpeeeXnBA~!V+D"g \$A(Byy9<R)sv~Z!sal^&'/?1 733ϣ}V+A̐D" pzz())Yv1== ٌb`0iT*x<B, P@-?k9!TUUgn@)1b7/S1Bk⫪k׮ų4p`0vIgF0>> ݎe]2q=tT# ! W-u~^/D" |@X0KZ/{Ń>c9}n.]Ӎ7'?ɊfC]]b" ' , \.kA$V+Q[[e9>@bTVVb1eÕLbjjjAoH&AR"(gwbbb73l,B:) '*J\_z荍|_p:W^y%Ξ=rX,ƾ} V}.ِNP{ b1v;;3gľ\$ 4 jkkQYYa/}iTPBH@O ^~coߎ~[>ݻv"'oG{{{q8pٮT>pxqRuǜ3p1C!Hb9gP333@ afx<TVV.bz`0!?sD"H$F4MJ0 GCC Ê[d2 FGG`A\%r[M^z 뮻XOO[ xƍFAIb4saLNNpfp ̺j4t:H$88 0 vcdd###p:cB+YappgϞndDuu5ZZZNb-S+HjEJh蟌B8"`$co|#o}A\{^~xre=0Fgq{6pa!DZĬiX Yit:aX0:::/DQn'N7)ɵel۶ (((Fiiv q%$(x<~⩧ʥ'~7 o{dd-KI@ l6\y+LNUVaըHdvV>/ŹsՅ.?>a"ZFcc#6n܈Z(M~A @ć~t̮]fyR)ʤ9zhLht'NH9N,ch49v6F1Ex?2nYl@6mA%\.VEUU*++P() ˅N=zpݳJo [lWs@&.,P @'xΜ9y<\wB;wLeHW~c5'_ΩO@mY1?nYj%-yx<~4z`pd/}Xx=8=446+.PZZ NNFJ2 yeڅ^7/.9s8~8Ν;p?شijjjP(VO&7C.i6L&'zطo_1ͨH)g\{I(OsONǍFBn8}aYFiNVCף 2 BJ23\5x .h6 8q hT*V^f466.[Jo$AAADN_:Yo_P(~޽nL85\ÑrlQQ?qRI1ZYhh+O2/.`ll,xctuu%"ɰvZlݺ6mªUf|_Pȧ [m䈚#bo o~3gՕ뮃nO9V,ޛuzIc7pn`qzYO(L\>}=!\vf|t:477cƍL_P%*@qo)ヤ/9iTǃ{/o?>={`ժU,$ߕnxxV5g"ˡfݴb1Z- |>_墚oZqqctttű[nźu8XZCԔXov҇IHH^555hjjJ:㗿%7tn\]+-ܒr~e.<zN'F#uuu⸺@zh4H<8sZp kJ$YDO~|>űܩXU(n0!H-FBD"xQhooGGGv:k֬ l/K@L D'~'mL&~O>}EF#"~8r9/~:lذ `Za02]ߏ+Y;z+Ο?rP(ēO>^`~Fd:`#`Sm hÚH$0 FqBTTT@3^@N3#jJ`r.T󡷷mmmhmmEOOO–#rغu+a08ea~yN5%c0JAsѣI0tx衇R>t+>LKlq]wСC>ؾ}{ίGFcnFx=2 5/|XPP  ݹR)z=*++6e(ϯD"A$?dFM Aɓ)wyJo?9/zH‹/)uR[oqE"V:F3O])OT<_L% ͆E)a /ߙtǎ <Ϭ())Uyf455%ݻN j߬TmŪ)aI/jwߍ}kyV^ ټԏzp9C Qm‚X d꺹07Nh*^f6 I+ " A rrarr~|>| JDnܑH'N'`6֙T*CKK ֯__Bs"P=HR!d2 AGDB(g@)3Bth@<oqɟO} cݍuֱᅬ{=_g{L&롥>h4ZM&vr|>l6X,x+**TeVVVn؄Ø(xb,0==@ ad2 "eN%8uTBaAA֬Y۷cXz5'cff&DxwQSV/d*Ú2ژ4|G)Ջ;v^}{W>116p7qwVc׬YcR xڃzX,Zj B]s#D(//`XPMeQS2JB!D"Q, ON'zzzс>yǃVEss3ZZZP]]i㖍U(z!P=w%+NM_1=޽{S۲eKʽ^{`llJBjbdddNTBVC%=zUcՔ2 " H$1Ba|bDph3330ͱ.cHE$AEQI緰'M{b NM k4#sa4M-(A  ʁdz=o !Ngv.UUUزeK>SP.$"2^k\{`5W^E]!m& _Q3IE"ʠPVV(WV $[|ݞ6%7dd|>())AYYYڹ)>%㭿 /膆455ᢋ.`tLW*bll,`6hD`mJ:a4| 4^0̙3Iǰ> /rRc=Ʃ_xY}sNX`4#&u7s"DT71jnmBV,x5\ g)i",&NzՅ6bddd+ hbɹҸHW,tX/&Q;^MNϽkR*2{`X £>j;}`.^|vWdT¼>Ld`fsڵ)蒋NMMźtvv&  lͯH$ z aԔ֦djHrwfffRVظqc?[ *ضmےNbJPSS?Y-끎ļ aZaXMXUUYtaTTT@T[4Ǒw?P(\Ti.GAooo.۷oGSS*++ګp:APnRRV!23 >ؽ{w1_җ4ɸ{Sٻw ٳW^GFFXw.++þ}8/zN8ڄLJ%%JRhZTVVBV/Xb`DP*di`JX\)u\tx1UHHJ!EN0‚OoV}kÁ]5L۳O=x Vco末T`2$ԱcϬV+FGG8c* )ɎW pgJ)[Vv/[x||8~8f|>EEEM:\'NK/-%kAįqb%”zb>ZoOOOZJgg'~򓟰Ԅd=䃁KՏI|F$Z |>~N^7Wܨd G__:::pU P]]P[[ L3 =kqW(\ vI蘆) immPN>W_}u?gttvbxg9*ÊdH$@ ˅pc),<HPP( bj&~itwwȑ#@UR&lݺ5B+5@jZ^ /9BapCaxx8e?F0/bdz7rR Ênj&qmL،TTgP(4K\PTTUV7:D@dHA'@)sv100cǎqB!lqkϵ?O3ZK` ]9$ƨ)e 0889rIl۶ [l|\_̮M$I?FoU!|I_oo~?3joY4'N˞i_X,̍^TB.C"@ dHjdzz.k^bAww7N<V2Bz_>'pm~1:::Vρk\"PaJ3XT 'z+|9V=z4˨>&7\\wƏc/x8 ՚pJPWN\. vߏ6XքǙnmʹx^裑믿wJiIAmcAM2ph/B_cliiFIULLL7W_׾ƺ wߍkefE \.&oqq1֭[͛7 p8ca8DQQp8b7<.ӉUMNz|'On'hZmK@CCCN¬7ߜgTgVjMOڔUT&iEٮt-K9:\`/rJƺuPUUb(HsNWq{Y{o{-t\ZY5ph~ uL<^&!g܃ Bt|hkkl効ٌl6cdd B!ӃXD@&aڵضmQ]] i~KJJ`|T ڃdN.Wl2rzhڄ ՌrxxUb$Ξ=N>}%b]R\_P,•&)!*@{oB@dE˅?y睜R_|q"\.WZъUo7Rkrg|>, l6[BuT*^^j# 7BMFp8.L'@bb˖-hnnN*6 moq@ 5%-,Q`+)ݝr7̙cV(KR/=}Q۷د|+zw6L&YJ,ZJr^U@ SS\vAv=== 0kkkQWWN0`t6~`3q~i7J{p-'j҅vL&}lT"`jN(DSmwc~O=?|3xsf~zq}=u~?vvjh4YD(++VJBQQ^o,p8`X`vT*M^/ڊN &4EEE1R  199Ɍ'H$DRvKh/n $ >yN,jr#!.3]wJOܹB:~p-,8b9%*I*CV.P(˵鈭RjQZZ ({}\5d2<t:ՅNX=h4Sbtt@ 6>[1L^ZE]v[ϯh L&\5;qP9p ^Mʜk@ J6ƐYD_W)ǔrrIa˖-xӟoykj&>tzȊ 1%PZZ FZ;ʆWRR h48Y^H4b*(H$VԩSLP^OOv;>CDVjIEQD"bÆ (,,L+/Wh4M&T0bdIYdTZ H/bq555w{Rn-v̇z]QYք.X,Z`@IIIVgş ?sՔL MNNnp$0221 K2̈́&!199vE\_PIFM+@:*%wuxYX4^z)JJJ%N'>裼_!+"ƻZ =DK.**Z!Hb";lXDOvWʰ|XWa Yd1O2RKbKhVMSqzFxwF%n&N6~ic=dy<7@F](:N@'|Wg1,oh.W $ =JP)=Ȝk?_r??r\{)ETNB__dy1ņ044͖Y04^yRvߏ>3Zmk *]`1?[ 7W-]Pݿ088r7MVĒzX=P( ۍ A  A @"@AAR B!h`0`6t:133>>H$)\Xe- ɠP( cƏfr|>˵tRRT^Z~c)A1 jUNڃІ/Uwu+QSSR\\-[lksX,TTT̋v+lzXv711)DY(b1J%`0VD]CAA˱zj\.l6xX2C*bzzBňD"ZP% \P~ pUsk .LLڐL{p!g!/! {p@ @ b@ @ b@ @ @ @ @ @ @ @ @ @ @ @ *V <(IENDB`wally-2.4.4/res/images/france.png0000644000000000000000000000024011676624760015364 0ustar rootrootPNG  IHDR  sRGB PLTE`уbKGDH pHYs  ~tIME  gIDATc` [@2;< 20IENDB`wally-2.4.4/res/images/pikeo.png0000644000000000000000000000354311676624760015246 0ustar rootrootPNG  IHDRFZsRGBbKGD pHYs  tIME ,&?IDATh}lVgsyP [ N::FG1-V1l,ibmdɢ2̢b`N LlN!NemĎu c[R(ǹjK}f|h"kF|dH@vDlYw)n' { > ksD!d 8<&\ЅsKx0Ge  N<ǀ/Z&ck{@OhUnT<7h*>*jlg/Ns3 DtO# q42,VWZu`Z :=#&zO eW @?Xġ:JWOInpAZ$сX'`AHn^ɬ݇uٖg<נrDn2D-o(\\ /9D }@,L SshȁQ{O&&l7SoIW Ij# ƁV84]mі#X <讈pxTخ![SM16aU#`3Rm! YAeDٞ5< z>0M^<v1mf7yFs n>(`%1;x ;?v!IM`]쎖(&y @Jܨ$T`<ēYck ؀q`;-g-fydY`Nb'Ǽ %<5? ])EGIqg1W(1V ˤlOBc hՕQC6`p{^?,qۙq{$$ka%|=1nIf 1.ЃKAW|ȠCl8 -Ģh-%.wObA"qfK<,b| ck16 QgGbN DfWPL%M:~n@`4Oa^ҭ-@:w~n[B-I)FOf=ՠ%ł0/vh޴0ǰcZ'uw#J 4=9?0ӡ`AP#4ա+}||9I>4zDJb}@ ukVV} Xa種[ރӧ+#VtKqrxJbZ@2`eHP90VaU`AasjcƁ%^PBBGxDW/|Μu^ !fU$ba-$'"+C)yLdQ`F W ^%w<]leԪo$@eIENDB`wally-2.4.4/res/images/control_play.png0000644000000000000000000000131511676624760016637 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<_IDAT8˥MoQXtî.3qcESW%5Ec a,QL*kZi, Pa``q΅&f<بn,AIYP7ß5Uo )'$j/GMyy `!|([Y J]P.D 8bf'x$NU#DIpDtmH /,3kpUS und؎ L>ez jm"<98! Y40hKEPzsvu%pE]w4h0p8ZK`X*hQ1r%9dq4N | @˲Ұ., _&؁b}Μͤupz &?CJ5 ;>-HZa0V}302fC!R$ȨV;ErlD"ME 3<\qڱ{FWyz7P$V 3yQw,1Sc"o}M=Y\O܂\Gݦ~LxWž%IENDB`wally-2.4.4/res/images/ipernity.png0000644000000000000000000000651111676624760016000 0ustar rootrootPNG  IHDRF>sRGBbKGD pHYs  tIME7u IDATXY{lTվ޳gәf:L)Ej^W&H$V"QAQ Q$jj^JBW-tṃמ~?Xcz=kek @ @6" cr̡9t d#z8aPG1)233YFBH" DQ @WZFc0L8:Ox 5uac0 bں7|sImmQ߉'z/\y2[RI&.\0.8?Ϥ1 Bպݻw/2L={K (Q(̦MJ/GQ`WP؝;w[jս{ E@) Ԅ"IL!"$ݲleQQh4 !eMzS4t4jl*NzFFF;v#2&YPSW'I\QQaApmڴ髟~) t:F,Vt כ B, @Ѱzϗy^T(R$ *D""qBZfEI?x>)))lڴ̙3,!3U$ aO>}`0Gb/6,Zp uwwO9s2^ztҥ}-z̜m 477w9s}e555 QUTm۶}[__rY^7l2wuvSNJ&bɋF{裏555Y[lٳgu6ͅ+VHW(lFFE7o|QET{v}j666T*;sDed߾}NW655ݫT*O>wxx8R늊bɔNAyyyqEE=oY|~~jÆ ?CB`Fd2ikkkKKK{zznnXSSS?p9Rm޼L&@SYYiP8q9>>lGub1ai`ZfϞ=rE&GM@^窫s.0  .A@EY$Ȳd2)%ɓ'p۷ȑ#?͝;7pbX*+ &yӝ>B Ñ;wvnݺKB 5wk{켞9#!x\:}'mmm7[ZZaxiǑƙnG_|ZVa0l6H$*yll,qܹ!VHI$'IYr9Sdee){zzDZ˖-dɒBR44s2;H)7oތ❳,# !Lzzo^,˲EEEjy^*..AmG"믿C(aH1,/0?Qey^:v=\-?|(LJnLLʮ$I%IZ-Bb&!P $ cXֲg}y֚5kjv=hTF.]tkУ>j&aLP;:'.aJ͛7uŊyZ=vp0Z{mAj>hO GQ1 E,;F&---//77Xooo`BɤpڵVuڪU*v/|f_}ծ`0ݰaCef|7W[[[]NsW^zuy /_<011!+W<O;::Ƭ+WNOKKc~n>๝Jx$77W`6.]znGCXz񑑑)**R$Lꫯ8p_?SVU dž,eY2c `P&Ii``Kdggszq L&eYv(999\vvbpp0T*BP,IFQi65~?t:EKKrAƶ`0l|@#G۷۸q>/{ n˖-yyy7x+JʦGh41J#  .tڵ_fvd2ׯ|x<:*#???{ݝp8 N5յ@%IRWWWk.\8;===zEoJeocB /Pf͚۷_se4dhz]]]7=OnlWi5eY8/r4QB$KVBJ*++|rR[o`BVye>Se<@}O:u+˲HS01 V0!0,{{[`{Gm۶rYeq2eJb)8m;v8cIrT 6B5Bv20*(I]PPz׬YS1sLVMh4rJ_|qvS&2 è222ZU* upr0(v߻>ɠcsWq>i.޽C = t,I &'"qIENDB`wally-2.4.4/res/images/qt.png0000644000000000000000000000073311676624760014561 0ustar rootrootPNG  IHDR(-SsRGBPLTE  9# 99(&!%! aq+KU'R](# n.~12478*(!.."h|-01"6:=$t/@G%Ta)24Yg*5]m+EL&7835#NX(q.r/bt,6Zh*33ar+84x0o.{06|1IR'17k-69#,+!'$ 68#Ub)cu,h{bKGDH pHYs  tIME$^NIDATe_ @ĝ=NCAIݺ?QD3;-G')r !Ak9t0`U-*,v&̳:\ucj@`]jd(ۉ7+d7^c^(e: 8xqImW/xMDبIENDB`wally-2.4.4/res/images/files_add.png0000644000000000000000000000135111676624760016044 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<{IDAT8ˍOHTQFFR1-T\Y-څPТrQ.MBEwᢍծEI-(V.$Q38{3B&+8?s>LV~vֶ|5Ki~XeBS OL_6_9GoWX&%*JNh0Q t8WTBZ 5*LOq1;SHQ]Y 0 WI'G6tqHa7-@^ೞɪC+eΟT$~ "D:!*4 b{7"D̽|YX$SPhbĢXضK wSnbn|H!%Wʾv"n g`jR)h܏fy֍(Tn?x^ޝ豴a`'ȤqSAK)bW-CTddYin-6" Ic )r4׷\\[$QhcY3? "pOgC?ܵBxdh%+uT":a">LW/'^򞊪ֆi8#M` \v)^tLHIENDB`wally-2.4.4/res/images/logo.png0000644000000000000000000171454711676624760015115 0ustar rootrootPNG  IHDR8{QsRGBbKGD pHYs  tIME '8 IDATxڼIu}{ws&q^Il DXbRFPJ$$@ b&5F0U #V'}}wnW T9LؓZ[C?M 2ikWaI)a 58~gOp೟1b<~3) |X`&tXo*)&nO=777+1ԜRb͒²<)~ۿoQkOB '<˻<|ޓ™?7y;c_`S`^kxB`Oҝr?Ƿz?<6zc$km@\4#9 4`Z R!P2hɹ‐0 G@ʒ'nv=YrnxF^'>bmU Tf)%B)($ eGVm4|Z"h Yд+.WW\wP D?-3tNs`K<ڝg7V#U$Ϟ<>G8|'i#T.+.6K3>BY]Gi GL"-;yy;+^bOy - )GrI4J* 7RY6-Vҋ%oҳO:4-tqBNC ҀQ;TiR jNp}ss8#mC㗈8²`zH@Lϳ'{`jԒo%C8N#Q(r %N9 DEن &$cH)CVKK) ;,YB /eՁR72M:JH 9 }T*JZ)0Bs9z ƠǀnDGڮJF,蚹hAL:vϟ(\]]ໆבo&UrIbRv}pfh4Z j1VA-`:RHAPSOLS L TD푻]O|S cidϤ9{k4JR*rb yƲX,"D9~ܹ{#J:w"@J)i( 3U) jĐI!xCT2$ \ܹ'|v`Lɱm,͢"!S$@L||wb;5EK*Bp&%V.6[:w;<١Aәց!1n?%pax`㑐F˖e=_W-jEMssr )|?10:],eiB{C1N0Fb*hQ"LB X2S@k81eDw1\lVă~;]λ|ʓ#%'OEᥫtRJeʏK?ݼKv%$a(0ńK5a CD,P!Ƃ@l b1aCXK(xܿwe<1cD\^^ٮ'{8%Yv-Zd)Ĕ(>#Ebd56XΕEkKDBR)qH~c`"}xQjQQ/㋟g^ο{\gzHSpϟrW^ɓN.0RRF-:ƒX-ŒTd /5 Q3RTR(%QJ!uk}nR%T9t)uvkUhcX,8#!D1kjB̕ &C %F $ RT#Jw8q g8L@uڏpeYs0P1<{v~:G\_1oNgZ4k5,tV30f2&ZUJT֠FOgre#GƀR֠żǛN@S1(0%4++W.ׅ o@hQJ`9+ T!8fTrIE#qNtelKb ńM1叿)C\^D5"EY:\E JQXcFSD]p5]eZ{vfCxvTX \ܿO % 8`)Mm CNF:cٴ`@0nw*|! ZiUeJc,'gR \^]^uP3Jܹ{?jV *T !ݞ)Jv͋uSR4ݒ˭aX֍CLHַ!e$׉Ga"L}4,=Ԟ飷S\+6γYiS3ưXreZzx !D)PCnO SE*+͢,:g"q l.քSjEi Z*\^j9Q5X+r1"j3/|s6|hyxr!Er8jtNѵvih;v Dpiz)Oq^^yL΅1@&DΙai%2Aʽ7?y@ )ռGx睏8,3"@]ZD!D"0.h߰=PJjIy1^zG?㕗_՚#} >h$cm*g{w.m0sK,#:0!RA 'ЊH%׀ Ebωci-)~sbw3Ō4 #%B *$B͌I4RٵMRaEC*),8c>^X:t (iO'( iJ<{ \niBbR)XNja|OgEQ(-Nq1,lC+S@OK'i8u;ڦ!f ݲŶ-J OxgYvHM! Lg?}#)Nβ6KŬלBX3Erp9ܑd.ڽ`S*LCk4kG#ȿs;q%,`2Ko5^u9W/0Sݟy+~C& y7-wރyN͉ŊAb\1 (QR[%Y cDxxc jWXvIECMxџ{a'9t? IDATj>vޓT10 5DQLK51M3ShCY hBbyD74RӀkc "Dx4SXib\y..B~aC7O h6+vZRcDUqҸB΂y5ZYA-~bҊ*+9b)$%TeNR%ŌJ VrH0Z釉X c djm:Ptw/ΑQh$اٙPq|1MŖfqp"Bz1 L}Ox.h*]ljZ#_| <)~u=%V+ihQЗ(Z&J]qiw S*4sZ(XQ2%x+B%,L!u-Q޹JbHXkqz ! JJ*zMl%'k$yjM4i;(pN#/\zִՂZ"R[ҕ2VTʱ3*0.&T#mâӧvCDi"L>Bxpbi_EHpLܽ44x6qo,rMsdJTv" Rp۫-x??ѐK4L_ ?}om=uǢxT(Bm/PFPc5cϣxP%D_3:(Q(!]Q`gN}JRFs,'8FJ#Di;ybDJ4D>y%89Xgx' AK!r؝$Y$<]X0̝i$  Nsyb#r"cx;5[8kPr!3/P a ֢Ȃ1fi%3t|uC3[1J2)yv\e,~{,b jNH5 ΧLL gNj٤B8k i:H3 ݳXĜҭ6qquX#^̠jVj Ԅ445s$Ux$CNX+HQF 4VJqfz=*҇H?0ab]!f9TIheq$2"gh#pR"JePPXJP0$hc>0@.O>q #w6[w#=fbuh(bZ/xx+'&ރ"O!x޻jV蚉ӈԜбИ 4FYi[CL0oFT$EBIPG-5VbNHU.-$NόJq^ ,rHH!Q0}Nw}/A D@QA(B,ŊBHEZ䖰Q^l:RFHH؂ 9 Lmv/Unsqa>NJkתZs6#n8z"%vE|i4T\RPR!n(MdݱNL-=RITޛ\K7>zj䊗8LcF%7D4 5qEX UPc4nB咩Iߍs - {xVQ11vHhH`;7cʔP4DOJ}]͑kL13"bn50(!E5b:DX&R),h@HÑMm S8{Rub4.PNhe~~BD8N{k Z{Z|#bq;Mʑùr{I͕5rl Z H ycZLLN;RqBT*(Y!@YBno҂.\Ngb\^!@ Xz4q"o,E(ZMlUB*ԔcRrr:0+~IŒ5U%3w_μu,1gj X0GKdȴ1 M аNA3be(݃SJk:8:jX)P'!5q:OI1"TeM%58=B E+5'ʢͣ'9U鬵Jn7VhW -_w*Q_eES ^6v ~p~x`Y2۽*SG//o9c_ݙ>Cςg7׷Jj^J}?}(Ys,\vF#NB6bÚDj6[G 3%_pV#I=Ri\y5[qD>u1iĹ7o>yt8^9g|: wl7Y % e>bjH㘶TB]Mf'Ӆ{bYw#T_k: D`i,B<K\ִ%a EH+ݽD)Z?C5z"$w;bTcH-aF "(W LJFM*=QO] #q ֘Nť"ܿZ0JA.*=Kd]Z?HCk RҒZ m 86y=_g?˟Oȏ|˕Tb~?_/A -ǏkFr|3a7x/$)B8k;%vۑ._}u?})p&ċG[>l"7x R$nYBw(m4vVYČt>_x26bXcDhh! f֔Ӯs yӄ%1#!~;RTtX k׏GDEL9%_,,oz:z b]E0N#Rɚra;xF!pZ"d_F\$kRLJdDb)!nxsdG@W$2] ǦǿaјqFۿWk;ֿg?v(/s~lneƉ~ɡ\%uP+=vf%%RJZk\z̺V~I_Uħ>4nƓrfYyFk֓J%\ b"83~ѝrF+G&Ɓy^9VBNG3xT&V^B+:\yR}j6h*ȥ!kdM "„\K, BIRNsFʊ۽rIat:5̭@+݇bL9gi8NVp.(ѰbݖeĀݛ3^Ol!%%:/g^]콾z"zGx;f'! Q9/W/4P(6rYfְ6I/zP )s<\| ӆq!,+oc֢eȒ#~v/_b]4M?b)<<вBXUٍf)zD] AH)SܴHsZQ?)$BtpF琑)-Ծ⪰3@ДFjhax 8FQRoitj09lpY/2OZfꌝr{{Cͺ0R1N쀷*U8-l_3ձ۱NuJu El5!r h-05 9Fgc FkӖ]T!p8&Z-cҊKN%RV{Z3зe q@apN3{$SoΛjmGjºfJie? 47DўK\Gk` r  f!ŨɱGPYÊg\3272JUY\RBKpF:oҘ mТ֙k7[b#HK#w~\jv[@1MxC g%W(ʹ!FCGTRDHEcfL P] C^ AQ+W>WpJ(9SbwS mB*p"ц~08Dpߣiazm,!a($pV!ZC(Րx3( Cŏ;g#O?&wK|Xk[.C;5"R@ Dl&nqFӈk&ʆ{̩r8ka3JJK%%a<Ϝ{8La7m9ajrx!}$@50t4B.nﰜ#1>O% ]}k䐈›vweb$l YyРfFtc9֒[*As:ͼKZ}z>,_p^uJP^H+Pjf͑R44u^+59cil'Cк9u K ļ_#9rT1Ī8+95XFaYI 7[ 9 4yQY9_̧$?@1wB-h`?솉2ZXc7.\'vZv4RLHm9;w|* 1LsH%c =KBIhi17T R\PhedLI 5FkyBJ uh%X煒 Buʢ$\izC,p),Jy(p``4fhr)a! KZ"STm?8]Nkc@PTZ{VL~鮚( 1QEh!Zr8~0('Fp/8_!ԀCtupR2g4!vZ%.d[@i JI;-Bfэ~5c9R\g! #"~7OvHM;К,J?I9GG8N)!R[AX#)o6\)t>7N@a\OB* r̔1Zk flF-5r00N[nw#!ۊh&x IDATX2ܶ83QKd9|.Zd-,eR_}m{9>HE0yՑ͸emHSdS~F%%  )T>g/XeX|ZPrp$vJ 鯈 WDO |dY9dA)#E!R؍#)g 8a&AKKܟ wu>]_fֲC͆}\N m-Oo&x}DDMgiہ9#3UAB#{CJEURx)%aMxï  XRVzwҺ[U\[\G77Nӭ.ʫwa,FeeX%+)Ff8 xqC:ZzRKhZIᬧ^FVr}`5 ZfM*FX^W"zԚ>+98c6X#(*A_IYs%ň5{䩈jaڳV̤XQTɠ=^~#o=&ʜAiSUA ji@v )Bq }]dkʆwk,J!bv"Kht^0!k'gu]eʲ$%@? nn$Kf ̨y>{qvu]Xb%Ezփw 9D N-wTuW3o"Уᣦ;5 hl9vh˺vܠe0g4q`r)4m8,g˙j=Oo''h,XAHVJP"$j \d%J2h)%(Qth)IR:]f .IЩ(5SB J:(3+!G6<2ЋDK珕Uqh^{o4z|;v1G7ސcZgzApZ)'bfQ <{ϞNOշ~Oxgd(7!]"%%0hq{^,x}[Z@˚@e-K\Vʱx6>s{4 MnZ i&2 r h;/h FH`0 e3*\x䙗#"􄔚Af|YC'ibwN+ӡ1#$jȊSVRٴ?޾Ck]o|s}g~g?˻;3ZHj1#%|ƺU9P3J66#nh%K߬a4=Stc5=RK@bBF:YMHʁ i`FkIms4RFeуLкRK$׊Q+-RQK2 @JaYRL-ZJZNV1<#@Eal3,*-UB)HyRZRrZW#u8*׮3Vs=%z}Qk\%SC( ZV 4rHhrL\ -G` 2Gr\w5 'oR):-{M%kko͇/n`FiRFi!rZ~3n%Ls*x\,5B*ڕfšHp^c$W [izNՅVꤖa8fѺw br#݄w#O=}xdlYOHtqXcbp/.!G8Zp:ݑ=viB! p/L㈒O}dIՒ#. w c00`z\ #ˊֽ2Ƴݖ;R$ڋ5K%0PK5Ei]IkZe){*ZQZc3Zђya]sNP'2IwȐO!2:=Lc~~yG_m E¢ŋoszqk^{3tf kp@m<`dhkfx^1JJPF1FΨaJIr˂ \;=[X i4BNJ" T?N'6Xk9hgtx?tWx(Mk؍Zvqv؎#+E^3AXf4u*0JSr(،IùaW4 0 ] {#o-id0V&B)2)eG yq B R^n6C@++qnZ"ePkBk\NN&ם.BiXKL}5\Dm}M%:I)K hCnGiMX.\NGNWRp41Fb]i*!fy[,^wo(Rn!Z7ws:5c0F¨n]z 1uյM˴`M'+VȥzWszVr)N'ޙt:l' U鎻wzx+δ@<>DŽ#^xmoy<[g=I/FœG[_bEyK0|7!+{ߤ)!`eV# )_G Bp8vi@Z# Ʋ.E~ۑ%l6je ~>VEhu#{ƍcڱ)ehI)yMH32ln$RI\.5Pīc i8 7~- >a4NG1 *ƒzk;y-Z9f6_Wb= D uFtȩPlǁbMOk5/RRZ+ģ!F*0e44Q[%%uiI+ *(F/F09r6lF7rgm6〒`=5ë Z,ӷpO9r^[kh-xWoË׾ȏ'?lrrxV/~_ח\?ePͭPsIW4w9FmÀ}H9DrbRt8>Õ?-J+swΗD?P+i5T& U).h{쉁ZVRrW/VގR5d7\@&ZhsnR4Jr-Yu,zraƠA(MEq,J#VB9Ek7[#LG]7]J\iΩuS^ce0hqQJKcr+*7c7Y6CPɥ ZhsXN+L5gjWaFnR;tijfr2)$%r<)`JVw єk)֝ZW3l=ι:5<ꊎ0ݢDKNCKEm=9'DC[}3d@%pY1-#f V+\ kLi6~B7F a}* e6X0ZٌL Z4Z%y-͹{Xe\Y Vkm@k3a0:0g.h 7)#%k(z]fb !p<2+˺S*$H*9.^r_o1 V9::=0QdkP2`$gyILJxu7sv 6B%[>_yqDSxQEr:'jnl|WBHif"RrI U؈yfxdu6pIⵯ7rZTWTxiL[4ZR\3BT3Rx~wDG6-)7؍wv3Xܰ)5NDžiמP#0qݣ[|qdI]1}~d 581y\Ml$@'$e\!Wd(و2(mvJw/Mm *-wJCW˺v%н==Lȥ g kPt@̕~|ǧ>"hXӡRHrHV:8_Tv7?GUQ_[~0Q䳟cn0|s _%^"Jw`X*u (JOP]1%87!kn4B+a՜ zvHΉe$\jHR[QrmR"6+W>L3y B^+Fd{}0_~kY^=. $1.ԒIQ]oT8WkӶ#CBΒV&waeZF*ZUh-tg잦Z B;jX]Kt8bCURE٣!ۊא1V!PBuRĒ0WbLKO)Xa!`߁ԄTُ!9;vï슀\ʓBDF[˜-`3v/JmKfY&wPhd+pPt?v )|:]M]!,\!l'iFǫ31hKSIkxRcǙR$!Bg< <ُHٓA %&/DkK.N`pWb}]S*1d  )w3Á7;<3 BpʍC㚩 r%ytC+tR؍]M[ځUbriV}0PJRʃe*w>NJٮH{ep?ZD^QR!kC(ӮNPkC."ZTsȖIKXM㻤Ç'1h%9PCxzt ]Df ^NULROϑ2OG%.L)䶬3B6 [k~{a1\kS*Ƌ4Qɍ )HQ ll-$̅*z ԅ҈4 $mG{wwPU4c|[+]i՞s{y~A͓ 9f%Ywk7 ]ཧLk+Ni>y~[Wyb;Ҝ/h)Y`r #3TnN77P;r&.}wCerw"y!ϳgO(%g<^7|a͙n0_wah(ye 9&휣)~n56WZ4JUJFzb粼dGR|{(`a /x󰱬B)vAQv]W,6uNޣdR9g܊*+kL~8-wO臞~mlPjp UaVtٓVyo`a( >U/ Mc#kYCǖ2mKLHIU:- q'hK VA`rx;0=IJl9q}1Ho;ed,kL\g-IgN]9 T:\4}^cazR\{O VN6_P Ym.u=͡9zk,[%-Y/.pLx%`_ͅz~׾CC~Ho_W~O>]gwœ?he0M3ՍS|SmX+"W#%7w21c^+&,J5mרT˶m4жû 4NI^֍Rʀ5#MAbJDmU4Z=hcR)cÒ FR"Q"%r`@X!X誑 [Et94Z.:#n5G9(Ag9U(I%|;ry+dJF˚hPqKDQPHk;-۶`>Redb`38i-V37XKdqSG`JJ:;;Rm|M2Du-e 麀5(|}y9̗!50$@a \.\IRI@Y-'tp c,󺐣r\DTFrf>|^%YS IDAT˴5Q[PV^KQ4(z"h'\]8ES3: gjcqVU5KT8#wtyxH)SLɔcj U2$ꖠUT YY;V2q"]*ɬZ9B7t}5QFX$+lv[%&X7ũ29W֔٪„6 sR;z%Kk-]HY~G:Y:lTrAiC4\L5+`yԡ&Vsts˗xÈ4LU?ŋ%eь [zH ;O—A_)s&(퓀&I1򀲎 }=8<<<ĸjr7). }ct}& dSL80F{x >=)>>Y2T@Yhs !p{|5j h)q9_*&Ԧ=eS#E덅1V"s1Z9Bja[ 2QTv͕hwfY6AXƴ<968Y֕JJ) 2Q4`(8/4gm8Eg:N@L!*{wbK*9iLK, 1|QkOOѹW9]Io_W({Mȼ?XH+n#sF)%҂*~EJ!f^i+岮IZVVbZ1N y"M%`W"qUscR!HpMt,%S k+ĴҚk)pZ q:t^:ӶjIXa`^8PQQ$h[L*ٷG%08I*ę$<[^'֭ЏG6hZ ՠE}p$X [kq44UqadtGj ľy ndJ #GiX:҇4[AS =a5-QȵpJwԒ6ZY y1, F\#yX'$4Xá ( MZx j&` djM}&Hc,>\S8IF9JU,[aZ6jx{1 k;\ylLw`i*E*<]p>0# *:/1Kxc%q*Z./R3\DZVNѩ zLn62-αxL*_~6TE@ gCggxr&ij#}0i<\ocfof?xy.$nNL3}Ass:0]fZb7ey(,ބr,Ste*Z35 +yRbc0^l|mk戵/^2Mu\~5MkBPJ<%&1T}Vp["JUe4%5!E`ɱ4:ZJ)(5s^#-0RT|e-8S8:T&7is8_ pDlyXסt潣?tp7 %eT3<>Μ }h2t uk? d 9s~W|' ||e[.gAa81J0ZB)J81VVƿB++ځVEV$1}aեSAak5ɘ:գ>Zƕ3ۚ.`9cq&q`h QJ:}ԭElH`D+sdRKCkMݮ\,˼[]HNkxCGkEbٹ/e8k㽌_n+1gRqΣZZUW{Ύ5v7[K9h9GFLY"gJkZr QJP &qdNǑuaV:/?hcDNWiXi;dxw'bnH~+ Sb'~ *tRR#eqŸ)Ia+ZcM4Kً5L#ŕyJg$OhecVVMuCv"9 UX֍il[MNh}Rf^gR$S9Rw?}Γwo%txk0t8+m Mr)hR7%7nQD֕m[@\Rf^zKN+J= j`8 =ދ-ńF:0p< b5Pƣm_/w|8sly3azr\ Ceu8p]VޜτJIm,Cl-W|hXc"m+-Go(>c`&& ;hi&277_x^x(2 +M-&޻ƼL9P㩔Vx!̫wK8o1JnRU[aTd::1д|T*^W4JV,&"afH hU&I%j;ϯ| <#kl&--cwǀցW3Ry|8n eu1%r WTcTowZ|oq|T/ZI}Z?O[~t-GKm5e]*4x%&E0G,5C%o2\6Y VXׅi(87q+8t1*hQTwxчDZ[eq=EbV {Yci2R4~i(ʎʯz b FnOAQF'ZׯbӈsWu8Q,.x䜨{lz׍43jR1WetSw{dM~*Jg ƶ-iJz"/5cΓgAaxZdD)L32a8KOn(%\{j'S9̕V@&r_gRJ"ň;:/a"l ]7y# J3zNmt1˚C)q%2kh(&klIєeA͌n"I$- 8x%23nNtc!%(*n{24R9q}d]C:p* g#_)fȴRiͳnw8Ц" CqEccuAJ.n+p4C 33NG5NѝS5T1 [Q|5N3k1F̱uȹr;Bx^cseݔNcS3|;[Xq, 98׉W/XeJeFPr͵rftKtBjgDmu;#F˨BD~4ide% 9#ieZ AC ]7`UKTx5V*{Fkg[Hb%/IUiT6L-PFp]״0py>4xNc4Tܟpq<Rx=ÅX2̓(СJwJR.EVi/:-Nc5hQkkDi~L+[TMX78{We% CGhJAZFQ {%m%)駷r߆:Qboop]d{90E j3lezr-zo)Iy:R)\̜*Go8统;#biMKilifY"uzmׂPDW#)eLOq ^'r5<|tql){"kaiśGRhx8s9a >Pcb\53}>7^szr˫GrUqڐ֍9+2Ǎj&D89~@״'[QN1%f0aZݧg%oYR|سmCS) ^9CRo#ir D74%)$r\ҚD5gFyr{#kzYqvVS=G\6-ʪ{?3׾?gi _y~~[~?ELমXA~ʇ?Vge446bXpZ*l%TͅeqzdOZ0P \kh Y76CՊ5m( oPڳwBTUC@F&t gD\.ݧFiB4d d)7ERcp8B"rB{9ܷIU,9W y:r]hM։3VYY7AA7L8 b\3] X>֍sm#nMM#$MFhrmۺ3R,C8q%0v %r\8d55fʩFitF˙8/:41x'Gc^*C%b׬XAUVre4>ILy͜wq Lj"SXZT ᆔO0FOZ huc[+U9RmCY@]ðG e O$kJNRɥqN%{jX#VWj\tF}72/|.DkIPEiaFF=6j7|.c8)^.Wu`)e 4!i\&-4"625 %V)SF\f:gV2)mRXE)b9b)-PJ2v.Qΰ;̲jFh]PPz炨0J s4kh:?ڋoԆЏ#nvm X-ב}іlBp{ f:cMC-58'o~_}O炙_U~W~0DԪ[":hqUv$ei𖶘46iXs h\39En6JJ4Eǭ\**H.T){C@0=Ri X-i*M3(,8ge[\%&bi;=5&qׅOZ"1&XmE\in8 Dɕi(rN\.W8)T#Vq۠sVҺ&IiP-W%Yff\!Z$iy&֋z,V0 v]$Qkn[5ΏW rcWyca6y抦ez:/97ΗZN2FCap 9ҮSKh *kM9VȲM_ȈdYW)ޛ؟oGi45`?@pu]#5N\syR;̑gMG ږ*L ZU\U%$Va J8 Mkƛӛ#k #8цT2Ӻ #FF~=VhΖ*}QZ ,ӼӀZγъ8ƤP*.xbȑ\*Bv IDAT6 vZ Fcg48uYٶg^F_S_IUiԴ{+ ]x9ApM վkf煸EhR`ӱg^]=ׅ72u-rr qx4Jcx ^p-?ʇ=8<>N,d,keJ&q ;2xl`f/_\0>8:CJU:x{ׯΌq-1~yzw 4tzs:U[[f>?U=44}qM0R^)iZHۆ(_kҖX !hY˅-7Ri 3hjBi)q] th.PDgt3m %':%VКdc#e͜%b"ݸpBR՜HxkgsY6yڮ ɺnl9͹!82A1?ƕX ntA )Wjm%r!J&F2bǑ {!P{;aw%.g4482l Mky=tk2iY&Ơ0zj#Hv7lpCUZhJk:(I 0*9ck0g=FYn4컩[mzA[ ҲDxx)%SY fE8L1%s/QHgo}'؉ FNYt^ɤ?>57ǎ'ފm+<^.:' 1F}0Jʍ)xueV&eX/Ũ5$qYىӁi^L.,Tepyxs{5u-Lsk= RY.S!FMYƣ#GCrsjme gPqs3]&W׉o~XaƞY;je+hQdb@vtZӌAjf^ ˲˒9L=Oo{RnTE? 6a;W*bItAVJui8yGpNd5)Qmqp{3+Bg4 Z{Y9RSpPVue{ kӢQ*p=OQ2tc.iL[)GOXQhWtc_OG8?o|o6ϟ??+_ ~g~ Eﵷϟ?_W2ܿS@: 7ĴZ:L,"e ъ_fh U>^s:<=2/(o'{ŔZi`݀Vrkl7)ddZ1 hF9|׋\[i#3%˫3%-4 GPRDi-#h%U S[b=l%RDrƺS5fRQZY Ii.R`hKCy*ec(E5Qj6ؚ˜lq6mhv4TtG+M̙rf^dEts8m3{̛3y<9!:I.yF1-, ])bBp:( |ޡ[J3AK,ABZ,6LLiQݷVW{tm\f,0Nӊ~o6p+&ZbҲv;XX@RLӅ7,ӈ6%OjP/yP:G=}Uev+'kkn:iJetg1$4Y9J̑ ozsC+KnaR(C?u.x.АZeY2 RĦ\PMo>X5q3Z<;03/tݖ)c <31.ha?B9&Bcroë7W,]ƈxE4.,`AQcf b //}>o~g7/q>_0nnoo#Ta?,pZEnz9$+)Қu 6cZV0Z Fڲ[%B f6:R)UqTQ5Vd=%86A>#YjeLI3Ul`~O~Fy6r醭fwtsxf/hW겔a{GQ8qPVH9Ba5X9rjJ5&03(aë-ʰ{' qTye 8b`DA%lBsJGGv:x9͚2/x^ф.w{J.:Ѫ;eP9h]v S=뤵8%LJL)e0bQ/$ޱŨ<Jk<9Gyfr0%f=ݓSEkO]S)zz>xeSy)3dlooo _WkƏ~o|gK~_ۿy4㻾TuՄ7-C?xRzI-њۮ؎-ӑus"8 UGxv:Ӂݮj#]$1/p#&X0N|CJO'byE(\!ijuzu<__cbNˢivsӜi&DẂպ(ŭ7FSۛ-[VQRfƀlOJfZp5>X>5H\"b&\nIʫ^f`K{a[cW믿ΣG5Lflߑ|3c|~_?Ɨ/'gf5vJiKs^y e/D 4֖T $Ѫa'Dʑ 58ď#LH@ۆɊytŒS fY'X&kiNԦJYji⇱jVV !M)S_S.(-#cQ(J{Α` ~^Y+ )ќ^zT'$itÆ۫ Q 1sZ@vFlŜ8w^%0oZo&*hfLENI!V ^U9YiŜFͲԆ*\fRoC%Ue!癛آʺ+Qk,NYv-4ѡmO?~{]p2C+a90}`%; ؟476\hg(x-JpAۡr>'rJĥ :+4 *(e9 ]'i=yy˯noiP4>`v'+1Z<#v[%bc9&%)7ז.#B*0.:V8њ@^/SF46\tnbspWW8KJXc1| /yx۳“3ظn\r<)%r\?ܠJd v\"MQ!tXBz9Z*1S-/'qfnq*mMq"ʥ6 k4CSٙJ5eڷ'$dnm)0>[O/Сby ~۷}W 6e?-ia9iճmk翁| Mg?)E>?̬4a_1j͒3)J{ <;i[M οlXfC FNVK>0-d`+>$)3JbJ5]żpAc9g25.TX-jהEN} JN}usa%l@M҅UR+MVa#9Gv4$ڙXknYG"V~`^"w9il8.d*?C?FBURUJYe 4 qr>5Nx/uu<@MbTD2 imeà$Y@b&m4F ;|IGFDIGd!斪PLefȔ&j,S5VQJP2 _(Rqc:cx# ;򒐲Ҟ-=Yy0R&U uV1w֭ʑx!;(ڃ 5TS_UHbNP 8&-\m\bxrvC\3%1iqF(e"g**SL\晾ЦAC6LQm )Ɂ 0XcZU3BωidZ(iYm8USa7C"eeUHvcdlHEVeTX4bMv)15e+kx{-̛(lk- JW?!xePa 煸 cpь<ኘcY癒2N16>RKi~ᰟrĘhB;`ip>q.HB ?|YXG A yP =9^wE-!DdvIh+_v'&ijzRfg𾲜<~c;tTܕM#Tnn.OSbם¹JkNX6-Jjy\kDZP܏X[ >}+ &2NZcLqFA<T8GGz16.%cϽm͕SL\b%3͙P4sak$$Pgcs5:OYFbfj`"5}'ߒ3pa8S w(1CM{S TCwcә"7nx/Zeҭ5G?|_|?l~>Xd`9sV=o[;~͙~oӯ>[OO=fla95ijKImL8gwU)á]='u 5J4Oiv+9GmFKw*I~F_}t+:1*K)bD ڱ&0JF)W]%R뼘SbK$=]x=U)՚V qsuEpzBs5V\s4ϒ0Z JcV?A FuůWb hY7x\yAAhjȬ$el0Fuu}hc$tD}1ka(^3iueHUVLȼDutԶo,KYpIsTJ)u݀7VƉD;Y^jZ+N^)X 0y ՚\^E:W_T taXzp FCb6ni֕(EZke񉕘Z0/w?|뭵E} ZpVRk- Vz6lwjJJqƮB.okmZU`VZ1 Qt1/ަ{v{gzu4y X|КKVCz`PIc6w;tqހr%T9ݎya7|G[ov%΂n,e)Q?TxS^X'%2pu2Ņҙ8gNsR4'R\f7ps1̳_1RՖLʳ _2.1jTNCg5Ȓ Wj6Ե'08|LKcq%([gxK?9\g+8ԧ[IkS|ê:NRl3?s/ſs}='9>o%Z i)\uk SS ]pZp XK+iɤ4sT8GRJ}Y i%Z+-ʈ X+,톖3˼:9jC dj[P_Wm-5 f-0]@V `U#GuRG^QSewsLJ r):TUZk솞y.$Z<kgNY s1^F$+ux霥T0f&Fm:ޚ@٨eY fJn8g:/I2q 6_3VY">lV˪5ή-0cMGΑR.,̙f֎qdt]Zޚ0^Ԟ%UEtsntΠ_€0gIe"ޗT6jjw :gc< M}pRVzh&[qDI37ư]D v-ћf QN@0(+M=2wުF$dȽ04IX">5Ty>- w#%'^}%nnh5s˴U} [kib^Hp+X5c֊qo9BȺS+S`Πa125JZȹ1X)S4{bT`*BM ]ksf2%JE=a@Lgz':.p'Xm;v/qah c\hT1!Ki>< ]wMgAЪbUc}Z`{u[<{~>Q|s\_@⊔r kpyZ+^}})pw:u=۾cZ.Ԗv[E03]6@YUT5%57[<'zt{AaL[\(;{l z9tO }ARB+z7z2bY1'VsmA76^Y4gsčVl:)\>2x6JRx\ !(vC5Ƕ&UFɽD):סZJkvvc Apya mZ{%Sr>3NGS@p^ S@SO+8Տȏ^{__٨6~& {/'> >OKK_~oO?fگ*&v|~R*X49:|@iDiSBPi49].,=?Q C/\ [mCGRZXy5`\m~VhUbJ?7<p+E,\+MiRȗx:lhVH556XPڭ9C#jE(n5/Fi*k-Vck^@æBZ"Tqհΰ,?p1K+b-\8ah#gPҊ3+kŮWJ)%г23XCu8#XJЗCL@+Ҥkfy]$ is֪X& @FZX%Ef!XR.^CTK:fbhzw%A) 04 bdW1RCj32WX Kks *u0TJI91e;I`08Y_Ռ7>ty-]pNR9IAIԔ nwRCQ*6;LI ހ%iYWpbP$\mM__ \z6k0- JdNY>" %CmPT=Tm{!p'<=itw=M`[ryzNĘQ1e黎M8#Ϟcbf҈2l;n]z2M<۟9'9ܴFZ290'OفĜDdKel;8MN#nQ7D;O|W㕛'1qSL,CCBnw k̑ uNKX`=PLe\lP陧w iz0T83 aZ'ҞZ*Tt:,ߍscL Kcy\"<?z㬐2<_EڽT"u5%#)c}OlOP4cYzg2(VJQk~8r7SǯƟVp_&y>(uyhJ<}3 )R$־9ev*f)+ Hg"/sXYp鹌kQ+/0t0hnQ(JC9l8.<|Fj_iRl  |11Kk؇֠Ӛf'V)IR=n^N)3O3Q(|Y՞\v|Tw4WSrHKU6}>O0] ^(70'WT&~ӯW!ōvg蹹nPJ":MT^Zęynv}'a 88.Rvxwf B$-b֠)a(m-ɒ<2\mz h+RdZ$Rc R(@pMPJq<_s>bV\nXXR'`^ikcD?rI  EJZtu;ר/]Fր4YodZU^,)b\^r,JbF-h#2E4JĿao:8Gktqɶ5T)*hT6G5XZf&y^9;4V@X"Z e_V'UΡYX~=nWea(Ua>`t-1UޑsCU%df M5E:YY}QER+YEg/lƅkȹ@K8C#03np>*Yo21gZpxooMmҳWBӐ|yf+9+/| _>ǃ4MiuO)Rϧ?>OY}:xjzט[ӳwZ=c;&jB(NL#W1!B(Q+BTL-2 @@*iej$ Pm<39~Fg4{k繟!rw}{?%Pjӧ8`wFɉ'괂tgepMb%{*echJ^CU)U\I0yǗRl:64so18k7|yϻށQqt_*.G"TI;(e%}<\WV1țԺRLUԺq^ժ߻NǣԦT94dcpE22Xh+h^M w`Y[^گZ(UaELYm,:6t}4rD-NVeMb5r1ϒ2Vh64¨JACVVC{*0Mhq1$ q-:ZgM%qzA#(@IyU38'|[h#!ic v% ƙ\ptU-cx 9(!6kb-+\ {G}NZ͚*i+YuyHޓHTR& Vˁ:o>B2ArgO\\|KJ%-xvq׷lӠ0F,IFZ`aYɭi,ӴPR!L:ќxK A+QROw 5¾1ƓJssrI)⬣BI UNz- B`:F\בTՠ̠N) o)id%׭R I+;% IIVO[] xg6ZϿn%UCHR#R\3qcʕVw,XzpB,pg40 K)$ 0aе-1;\%iM&řh\"HpEk2Ӑje2z2N(lZkVlNFA!KPP9 X Iq +kc'^F%m/>=}'On;Ns|Nsi)YWHf+K_-| "kq2Wp.^yyK9~-_2kO#k:3oY0 IDATil7=)ge"FljۻӴ`4M(k'֜ERV<1 ׷h+_JfP?CBsf;N1dPr+ϐBiJ=n(0*vjQ{nZ *ʉI%cYCk-NK#BZ-b8~#^ I,ӻmnh4ؒQ%c 3!L IK$U+}?g&U|&2\j%*TK%$Ye#bZ|EVq)gRئ41m(ʌ`_Ŭj<]d*SLKAddFM)\%E+碪䶴RFQB iJNԜiZ?qH6̨RikXeJɄ$rA^I&'#)A̍( @Yۅ17.Y i}*,ZjYζղS< k d GJֲs`ZM/S aQ%8^6uz%[3dqZQӲJZh"m,^KY#m<~i$`^ʜWB.`'@XN4q@(niĈEF#Vqj4^Fܜ6oE$m}} VcIXDDE3)a2 LE ` 'yf3h /;lͤ%r8ha.ڶ|j2j~  H6SpQmK2 lpJqdO2rJ4Re[2r:Qrii]r#7jg p~6m"51(t*@M )LfB с8M2tqT <p<v!ڮj08L3eڑr5bsl;YQR-1baheO;<9E^Z8$k<+Njs fa c$,mP+PP ?W'cd> /=*`u'5QZl9?#I+1ʮVѬke@kMJ6fx15bcyV5WJa3[2(Hi!E!EYCZ+ ؝rچgiZfH&D*VWOyԢ,+93%!\ 98 4mV-޿d\ལ(Co}Q RLX2)6m^x=)?9l$Ȫ *e:l`<94MG~IF33)JS(YK$@L0G5_üd zj)1MGo[bög%i95p"ٞqIXoC7h(*zNz(R:a89U y@Dt%#!ig!ER8Ń3wwusrJ{q!#Ͻ.JɼSʜ:jɥmv,Anc"Ǻ;l,H2%{oaJ^TM,\^9p[j,Up#JӵFfcp8q,\^nM$|P08Gq1v&QxHҚ9F!*f`HkR+Czn%aX^+v,wxhXj% ^zļ$uU2M1+b͹LcAe;\ߜ| k-pKj1Hя~'?_w[ZJwh|O_x<ޯg~?Vߪ\ ~G >sO9|i)d@oi^fRɲsEkKtt}K4\\^fZM8Z914,˂Vf!uaYa$O|*#i1澂_WIMGHKn,N3" (-F&-jo"EOk.{Y\0hʍG1QWS.imI) 9ɧ4i٫8[ikZ'S^`Vf͓2r!g%][;b+KSFO̞Mv6ĸP"g+z-1_׺tV1R+COzbA?`c6rň ]2*\!jYFɊܛ\։kXƈ,ZY2Z!''|Y^KF).Z U2zZ֕YI"l;EuʛG\wz <]2&Cz[-OqS XnMʔ35ɃG) 9/\ 4VVpޭkRXVjA#D4 Zg$X_M;d:jAҒTf|H;Ni#ޜZX (9𧾉#ZO}S0?CU7w/Oqks&||?k\E3B̌LӴt]OQqh|G[TeVv]b-՚\Dm"gR֏ōpBd!$▪JSagB^I9qgWZv3ʲU3VIӢD[#ԛߥ^߰ ?9^}zz2>Ɨ=y|/²3W-lū: @ zpQA,*О6,1Ps&Y'!,ԜqunE=4(!!r gj|6 " (}h(JW3sK$Recf3lpNnB'on弬"ŸDӼ~?hڢV"*+2 65o}8^} <×vo_IJ"Vi}Ju8k9OBy*+eܰ;vXHhq0!q}s 9t8cU8#m !U΅6Z`4 xdA刷Lly0txӓd"۾g@nѶ,v`Zhw-WwCZ7V+vRT0+眗e)"Y(P!ׂ.KjGopZc iI<~z 5 )p7NuzZ0)SKB׶ Rs`AĦmx|Ge+_dӴΑWOYZqT6`?P2oz>=?GS,vHHĈPE"м5̚JVEc-m%ӄ2vaٻ HmWi6]A 2Q3e۵cKXC+4MBVe]=PBc=C++!ZxyZJ@[eUJ1mhL,K.`:y=RշehH I^%(Z$Pl˜+q]ӱduE©icĻaIB-Y/mSETJƗ%wV,L !x'ePFJ*+U VJDeDgdgR(`c%3%vVi7QG+lOi%ߏ !Qr`i;Xo5Tr4ʊj&T f:ϋ_@6[ЙD,bQ8sfIf<=<8/ӑ>Qލ<3^z!7Wi,x;pvqSam)Yh)TkT-Jfʅ:G& s[mޒQk }O`y 7R,ٴS[˵4+)+p61^w\\s:()6=%Wn12jleT`ӑ)6g͒;(8cߟp5tNޮfS|hXNBT3+ @R{9Ve7^536qFU MZ5hR-HI2㑒 [r)N'wxiV9b ead{gƣ4qе KLxkCY jFV)׭%xMiYf{b\ӆ=@rVsJ΋}9#&!cz42zu))l#RIYXMɹpC7lZ.e i. lyz7+l[4ht(l IDAT~S4𮷝 Cx-IN3SRa? M6V 6$Ϊ5egxݦ8 mhCU2z׵⁋l#g4}ۓf ¨kAeQe2o:LGSZv!yru{r8M\l7b=MyaH|Uç?O;?_OC?^;~7}|~?\nC{п߷=7 qB!?gQr 7-O[yi^8L3J5y Gj]/VښKmȩʇ7# t|֦^T8J4ᚆ9KĭN=׷yIo 'QwF3(3rô+@Ye$6b֕D.In)iZ$Еdg,^/w QdzkLJ3aWODf*([3)(r0* ;F^MӠz^Ka]CiɒUʦTy^[f3Мsⵊ3oίlwXoWƂpUSN:FݶR))q$+θ%ԂT-$oTqA\ɵZKJ%cZʼC(gWD2fj<ѥPwCm Mɇnodu Bɑe4֣jD׀ʑ HYTDijXPZ|W+ՂF4bXအ]ٷSMc\+7%oiq=U XaebuъR$ju6cIxJ9&zKS.fy yr`Psa"rm~c|Rժ)4~f[# G%qV46qo[Kp<%'yxpжݶu/7nZq M'qE:T UNm:3X5Sbil8=IaqfG dĸ粖T8fżLP+wGy4-춍\Kx 4M',Xe[nhi)"SNwTWlD& 4Z`dL͓#sLҦ19ֈLQK¨UnlZX )a?Gn3 npleJ !Z*Tš 'mϻp8l',3 ?TӕQ(O#B̕8qAyJ{PABV1]3 ?x{abc ];8-x]W8o?3?;̻!ws|?·{⑴P|3lo(|yZg =?|yH_"G-q:qvcw&^mo>z%DVR뵄U'O)Gid`mCcuM87?'7R[*1JF ͥT9)Ċޒ]R泟FppzN9OpE)nV+Ϲ5 m f *Q*"9OY-9ePh&wJ*3chpV ;ɳ(7j15 yiU*9,,CVh$ Z(N.1ͻd'PLt-UW {E6k878Q TͅZ)(O( m#kM|,K*%mеxkQ9{#|.Eb\#ٜ5P+qpӶh|#+v^d02NH%?JEmfM\o~ \ZS2(֬ Em5V[iUE۴%o 9GpZysx&Z@{ZJDkOtjvfL4*F107-M|_g@6JyڡMy}Zu O4(yjVQPr$F}tmGd1Ԝ1FyTPY(*F[Fkv3q\rO:Y=$!0 ̀Nlp*wo|?>l?-`R˷?_CGxeaOJa_׽?~˟'9m0 pr^=N6G9=1Rm<햮RV`hU4haŃ-XUS^ĵb! ryzlkDol"'6um0Y$ ;165qFZ5g c-mJ;`{,5b+R )By&BXYRV dOӈKjZfHՖ*qbU2@72P8vy{d AO$^YBBi8RhE׉GuݠnWBUεOX *) R8bfֵ;2/G$J\ߏR)Y?1%з]kGUb )W)J=gih9Ov֦ЪkYFG]%w@n0E$Zinoo c8/2%-kDeJqӕ1΢Ta<%UÂ7 k &yOr-|G5캎tG>}_Wm1L3e1xh-x[i\8b.nE2^GKcm(2a1nE*V{u֍SJ |EZK@y1֬ L}w>./p6\7KbSސK5Puz%̒d+!.ZBdxR/RR*V\0ĶT9D+1k%V_k^GFc`YNtsN|^x|uU])VVl[}Co'RUXox>zŅiC4W6'q6ti5͚);qw{m[P&f9n'dXֆ%&'B\]؟x~};G)j)xw~X8Ee8۠0zrJK"~5 JUD\ԕ{4OA4#8ReJ!upp(Mg]kvҪ!J\n }9Ӝى/O 1c\GӴ8 <8pž*LNcf 7qQ#e:ض\l5"FkƱ۴x a(- @I 0N3Z2QȤQCZ+4햢,KD*ph.Y1< ĉ&18 [$Op 9v`7*LctN^"~l?xs*__M??dtgjzv{`h=/^`jS?g?w˟}={Z m:C!2NAJq%v7,ea#DJP(;RX9!,wٰKf* #ȩi|O2N3eA+ ^gv3\1l4:J7B֌YVFԴV +81~v㭓j2֪wYg5D|kzb]5ZUޮtJb",дnnB2#q,hVnIdS(f0֚+]9=+Htc#&91M2H,K&E2&A&gr":R$U0vE H-"f%5Nhשւu]#ϜM@ 3!HmV41)K9j~CBjYEiiێMRr*vr3 U$ 9,SPm=&YS".HihF532m<>\je5"ʘqhMnn_#"-Ի h|7"켰R,#1KK|K1 =|z1MKZpF{6Rm[nnnW ɛ{9Aכ-R",Q2⼥K$L:j90&; Gنo0 sD<rxwGgwd'>4FjmBd; uOoU1͋4[qhkOaiGq)+O‹_Vc #7yZ:QO,5Ԫm]aQEx8֮?/,oI<(k(U9wUk񎐄0UϾqc zSꚹ31DTE*%'ub$ZW\@FiVj󼐲>`vk^|X#Yt|eTMLU1ϲ~0b,ƮY *VK~IjwoP#jr2.kCYZ1eӶRCߧ7AAx.m1ZE#ivbXog 5ӎaf(KbX_t*@ oYawiv#e\Xz\7〱[6+iկD,Nk}>*^)cF tmXSYR +TJK2GY-y:%Gks8]' L7*9LjnXۛ 5zˁ`L@6p"@-PkX ]/RR7*IUXˡ˥ M1/iв8ܞF>=zWs,[YK&^ޝpo峧f&慶1%ӒOp͑8%,5hQmrJ´Db4aSVX;,Kv\tVSL*a:62hg4vQ s[9-]ے)zmUaZTam~!{~g9C<k|<{0jovl1Z#Ԃ3陘9)rҟoo~O_>S1yo{ iVIj󀊳?Ke ׈S` 4󕯽>Yʸ+ Wt4[JH΁"ub:|X@ZgWt-BwёS0Xv+4&Hn1f)LLI*:% ʆA&:[ U퍣\yOJ8Tz!{9 + *%OT $S#hir! f5EU*j YA5tĀ['PJL t]$scpI?eJjנ2T&Vq@1sJ'V4S8S,2uzfw:T\ۭHXc(%fI Ud`Ԙb$ DR)K*%fl11em)Jag-UUb^$ FUrҴݞNM23=9kkzɟi>?ۉF*Yj7lv (XW [n[m<ß+O+}O/~_[8ќhF¢hbNɉeN/}l6=ZD cqnuXrf7\Ϋ[QXC'jVFksǕ! ɂV(Sef1;{O7(*v2R3M#YiqQXrIԒ8><,RT+A'Fk5J4z]2O+^C%H^/JƢAm攩DNtaP+ER.PhoRbX"%/W}%+PF:|׉۪JԺzxꚏ|CZ+JTQX4qo;1╦VQ&NZԷBXieŸeY)bXWJrP2k 8T2PMQ4Pr@^b\{ʜxVV`V"8"V #q"&TZ5 od!5-sT-BsD#^;1&ז<<<Ю\%e M)ڰ=o~g2#5M qFN-,SgR(qih\rί.Qc+K(eZvg@n!7wBƢ,?p+~l. 7VrK'MDk:ft~0Q1M#ml01(yd yCMLIZyf=04MCzy!Fi<=5,q VB|RGж-NRVa4kRK"`@Ɓ31. Tp8{8I(J6k,] XyJ۴m mߠSb hC[i&cm Y*c5y`|e&w z:;p~̆Z/^|ڦ{G\1_2[Eyف_n|| 8+,,0g(wr-cLh ZP*SK\WuULYkv|E V Zg(zE<^ÖJo7LG%R͇[ͣ/Y8mmZa˗p%-L4Ej-\\l0fƵ2)Teٞ82#aH Bմě)eaƄ9ik87 OÒND ]9l0Kx@y25FѨ*ShiagR <<;x2N)p}񸰔J"<iIw-*JSQ.o.8=d8cz~y8͔n}Zz2c%GE{>z0 j|Rض{XƉaj$fBT^+;%Mrin#kg:NäiJmu^E]MU#<Š/T1Ltw?vӖvW?G?jZUgsھgwvƫ׼xsd0́[HB9/))S~HxkmVd00S*Gփ<4͆,P ֒RO>%Uj\Mѵf(VL "ϐid ъ*a4pqm7&֌PA%B g-y]ue;#Zp*mKE\i}C.YQJaZs%& SV c Pc@]#w]OVb)"5@ḙ<Q=ޤ1+t]ii)4V&&ɲV[*U$6[}H[yqis(ӛ͆y9 fIx KH69B-,L1a<-KI%ƒRf'&8!,T nrvRZڡd:2Z^x†<%dj3'xқٖv"Âsk@9m1MOq$z:0rn\;'| ='@u\}ݓ35^"w~;4Gl/ 't(  Lq&n8kNk#oyꞣ"~.'NKGm6Uڃδ:U#<*y l97L7X[1*s[i9gYB}jUXxO JL<=?ŅJk 1UV֙}xO۳7~}giLwE-}s_x+v#㑻[TFabZ&mW+~0/ rδO^8qх=)Wjm(a Ek]k@\qy}'/IK<||ofƘPR T[MJ9 )i{^%hZi#Ō!iHo$[W34#1MPw-J;nr8qH|B;¹b65=u0Fˮk.y03vLK L.Uʰى*^a9:Smw;6L<pGn#e6aix䙤5iT}G=Ga`YxYW`, wLv\p81[ZЪv8#R?K?#bKI7gVvKYkU$EⲈ^QZ9 "ImN+,adOqs{MН)㛖ۆaţ˕jXv36Wq@4s^V#!DYRꚛ1x0pS^+2EA cDēeuhJ*"` B,.dPH5SgDZsNg-Xf^ֶT+'&tUeVkZWIoToWfCE 6PDȠ%8ͤ$f#Xl^A)6 W_W~\1̻N-=JЧP+m-+혴٪s,s\ xI1QA Bcu%-Ħ:zנt&ƴN-,/D KX8~OhkM#&eTV)R*FiRMT-%J&lI9‚v5{{i4-8ffle=ffm5}op:iG#=yfA59Qxk4 }HxS{)~xnо<.(m-5<e(醀_* \]n؜QAEgjI/gM_=qr$nq8yBW\]GC+x!aYC V{5g3*|1W-,"LQ`P4]=Vaۦ%-v;y8.lwqj4s8Tεlv[vLꎜ_e~L\_OpZ4iÜ2;?̲樸?Zj0j=~.z>==8η-{/j;_ᛯ&FWi%@Gڽ7TO2|ɞq:0Lx ]ϣd@hK2FKZm1v(J+%qN#!q?Uu4ahGI3gˋ36mCf2r8l kZn^&f'PMpp2hn2a, JU9? x",ۍmKg<~dfǑsd>2qusYjcan3j9 bq͑ap7գN(Bc[FM)G`+WԷnXauSl_257i-eY|oɵX墪²0/ӻr^(u}65i [fHJ\[Jm](lhPHX)8~+kZS% ?ļ$T^&w,@BJ( M`G*e^5;LA^3ֆPn+9 QpTiXlEbL)™1J |#c`BeEE&fjr⁡F1hb"(%0Ɛ9Ѻz^"5U !ݜ:S(vQ&R^j5΋AiVP[ZuZ_bB[[4M4 h$_cyG#10'h-B4ӸnRrl{nw0MAIh2l7;NQ]+2遴pwwpq~m9Ƣ9j>RBĂ9ѠSop]5=rZ5ru,oL=D6 *n o8'x%]; `,ش<5)6|峏9۴nٗIEsjYxEvC1BZ0^0G2Akx~2554Ʊ(OhY|ݶ+I-*[j6M+kũR~\\Q5q{wdn{r h3m{4_ŧ7'|ӳi-Z#{N D6[3zy^p8<%Mp~@L[rZ@Nedyb9;lp6.6-Ӵlwɼ| wC&J n$ڠPXY >dB,Dg:o2 !F6}~!sw d|i~}:8H\]l?LK`nex )v[ l۰9q;*`U BZT@n{p1F:i2L#u4ΣGS}E#ggC0f}ߴv8}J IDAT0%BIĹ3( o!b"! @0B %7\DH DvwuU:Z\9+JUUj2/?o-U\|*DZa7`mX)Ԗe5$Q*.^)!QGKѵ$Ҭ͗Fiqv#:ɑR$di^%lwXȲ:(Å*L>V˺,ѯ0 GȔ1p:#pq`74h!d%.¶2WƌmHZE(A(y̸ k-? *S|J&ERIEA+z 1\%дNt\ L\m+ԪP}IFRHs=\U[/ ƐQ$W5Y*T%m5%:nSޝW)bA"D9h`m=_W\W cj۫o-Qx_Dٓl͆yN8₯A~)@u$"G Bqr&ȲsNfG۴Ҙ-6HilohcL,AXj@7,. O8]/LormSUƶ4vqq>pD︼SW1a٧@QX/ _|ί$B@h UT(q#iD )xO,Zz➫Wܿq'txo?79 \>rSL1$Á6r|}(-iFz ]- -5KA( mPczH?_8t-/ͯb(Mp%8MOӴ$xcDLo>VE*Uwm*xoYR(mm嬍C\)`jҚeqmq>J pvby:WctR4E4Փ"!'rRTNB Rr܍NK;((VN֒MmT/O ƄX Z[5IJL(5ѭ,jSdD^o:bj\ZRGFRҺ R,B Sw1C`7h2YPV+|(RU㶪Y'۶Y'5K͠wޔ39뙖ʠɢ0J׊m+;eAJMckhᰯFPXےh%m-]S;)ڠj }bt S(kH`CWX}k`Bt#wXnuk qdZ|eNxBiA4Cw~w]CÐ #O$- Æ" -!f[vC=Jc Ah%bJj,O,!1Mk[:(31:JLSĹ2)v(rЮ%@%1z42*Ck6yR-d}%:M1 r`OXS#vkN7|'4ǟA'슫=s1R"?_grw^8(8 = m24jk!%2d_AlA`i]?dbXStZ P$!\(PvcM,) Exl;_w w_#?oV@Αݶ'&KJFچft (87+p k-U`YFm,ִ_)5o>|yMTGJd\jKm6ml=(v4d}H*Ojf'taQ S `#(!kdgr\9Cb%Z\v,!:Зr ) 6$'GuUbHt к4sl7}n]NQ$k%E45#EC#ThL=::TR[`qJ5(Ivڂi>),ƪY*E֫Wo T2Qjp_p@ a"4y0!?߼`\N@i 2R2[:n)R1y\(iOW mG yyf#ٯ}?&/!ސ&*Ee!,۷ ae((nˆ!JDk9t !PnA;+kѺ%EUs톻/f+nW,yyM:Fo)7m 8O遫a L#jѰ -,.`8\^r8xt^Qigܱ" RkܐК4QS@4tvܹ<3/\riZs-3JfӢS!8.GN?(޾~KH>]g Bcx.-=m'7F8M ZɓG ~yA E4x0- ZxXV7kLqO wg!9&a%yI O)2(E7]"+Pm gWd. i:C-#ݰEhK' ;O}ϼxs#7ljFS]˫u 'NsmMmB[3Hm;6-aNL. &<զ0&Cb %RRmg׾m~7l晿#{g8τP$]A(.†5[L)HX IRwZ[9n7Ժ9%`{|,˂2ORc&cTUWRoRЪz)2HIs-!hJc +2Um{mcQ@^$ζE)figs/kNdQ( eKл:b/%݌!Ku4ON"LޠrF_ R``VBGDgڶC+HXciƻ(s kz!4:b]CfDUz9.m˔*~@ȵ{y{ϲ8Jl)fB?3")tc}.(4f 2GT[5O>xFa-~wn^m|ݛk%}K_>GHd\q!+Ci2Lȁn7FtGJd `Glh"ǨB6zzKZ0P"9)Đ>ڞawB@U쥨+Kdr)aS#kpof?ŏXi͔eD[y }wVufif%;(n$>ǏwlcpC6@*^KnHNvW_C1~`kL `c304 ^r3NDFt#C<{^|%˒Dže ȡfGZEA\D y;#CɧðX<;IfTvâ,C%t'kQ Ugx>Wam#9Ni[kךZs^~ 4Ta푻%/ofZZ9Gi00ěS)ɡH"ȣGt-wu) цV4ڶwl%>Y2CR2*ۖj]J,Cؖ)3_~@X QdBbZ9蓊2}_0v(%H+筵@e\Es͸$9Mk?/7nyځZ J+wӈώq&qG"9Mw$ 2a7PlKt3aߊm5%0t,5CMbLh%1$R a~(P}֊R$|DW_/kȟU>{jCHIPMղC4Z4MCIq~bSk!T)LwZ,88hciu2t!1>GB /9{cXþ9g(쫃)50kHbI!\06Ab4% CUȡ\p[ `i(E1=Fr-X| 뚣.U`)uDڀgG\P5ShBjM}Wj-Rא1뿟qSVhQ!|,H!)E6-}q< )Ѷm˲R L]V[tB:z)e!:wkIFi ;ma5@#@[BV $Cspws/§:qG4<:Μ'kr4nD4e;qyu [ΜV>T\P"!;ӧ=yϗ OA*$Ai\D.փ׼Li-nAonfZB!sm*M?TZ8$۞%JIsw$xc$4qDY*ʯD2) T#%q Lu:D[f|k5^l bxsܞthb)N\c蚆)RGxyco#2) y´Dk<4_9/^CmSJk;'Gtv₻#\%9tN#O o8'&WuRX/1<Дpux qj4ip{k%\<n eidZ~-e(I)w 1,!JZ' f4 9/PLxZW.)K*dQ r7htF*l6x8_~W̟7>O3P9;]R8j߬sY_婶nXe* K7b̐bD NoY[VhbF{F7E5[(J|X\WD(T'އ5Ww(O$ZNg2}ס|Cݲйw\2Bc$RXEi[sM9(mNw$TtE$j ! &\W>:Ic k\UFR?%8A0YDBa Bc)1uDDȂsVi,5ն =fѢvi͛{N#]4>x\ש]5JfﺍJ0Vr/+GWm+ C `8aƆ#r&z.}jdFL)[efTxBN\p.O䐙OGe78ޠ[-JՀ6 i#M7-' @w3S #o>{'.1"'ZL\'O/&rAn/XFu hSoRZsFgPB1KLE3JU@ޓǔ~z 'S[>n{Pba\ II0 )x*)-]k1FK5FЙD3;1/XB(H9zJc"N UH1vb\m%D pnRZ%P0 -R( i,шXdvNL4suՌqfgNAN0C%Chnq ,erGt($dx`DF䅂1gzLӑba<ނ<sǫS8&鎒2} F5cFi8s-\ERJZkWĶllG;'1%T<03Qw29eJ8wt% (b5va?(bX9oX 8-$82bE$"Ew-S9T{@.~C3}XiQ=95<.KͿ"HI.BJCC` 5 FCJ5!ۨ($B$F?iB:R"?&P,ӻ@uB%yw@mw!۶\ B R: 8Nhk9/|>3Rx +Zfth+(2wKm)KNFt>ѧ{'9naN0DH xOpMY '8zV<^+BHbm 1F˃ dR|`SÁ3f,4w#Qo1|B:=wb9*2gÞ9x|8SJo)lZ5`kn,kHo(LtJ IDATl-,2̳.O3mpkqA:7yb̘?B_J_MQk"^7iZo_mjiaFPś@J ?T-R&N3YH...gWw%!)D ) )29*R3!&|?/3|kYw_i!0N{dTX 9 Ic,>EꗏḦ́5z$ZPʖR\z+EԀ5_0*)`k5\DZ+S^}5sHDVfMQjTe;y5LKQ+߾ Q-V_THG:ȹv)eU Gw(U{(h J+ D\)e+ORMcjhU)]AJJ/<1PWJ%u/,"gb5hG=R~mTͰZszR2 <>\C0RZ5LJL*֚x#@ IèuUض1F2MW׎\ \D6E.[R4J&TWD>nC3`<O$!Z$F_rZZ|,.]P  V_TwU-*f"It_"O>M kݎT4ܓc*"[v^B<, "Gr }]Nc&>Ŵ)3BZHd?QX'NNEׂ6nG>FIDT;yiCWh[IK(BxF$4xc"ۖv1$n^vՎ~Ϙ疋%X@ܲK b䂒ۇS$x|y Rk"gOmj$+ VV I|, H c%'̞U=Y8BSe[cD@1l$W29Q ,0V`vvg~q*Bk4w[]a0FQ/sg3 p3N#NѪKQ~s"Ĉf" eh$1v*X4|2bL(w>33V7% bafMo0RJb3w JJ)i둥B")ޔS!)emP7Ol;acIձɲ8>|EJj:ӧ<ܼFHh!]pHgOBZ!HmRVc͆i"]Vx}|bˣ_A]"1IHmX έd\*,TQ۴MP?[ ~O˜}mIQ+W9ՊAB.!#kxt~jjW\Bu*XTL%#EJ]6yOh1AU|k$g(rc6`#%Jk| TOY),)ueYW,'(t%J5RD(`5y A5J*ܨƶ5$5Jz]nʁej,&R(xfGA!WB'lUZck=2UZpYtM !k-6+ (&d!hkjHі8R޾@D ,/նSιZJ%@QIТDa>xM1M 2q( V92ic4'5u MS[q}Ǖ,V٥֊6d*Y^[G i8UFv(VƠ% 6хWJ D>|jnp0B Rn/л*aw\}[PJ@v$!7Ђ2d6(nF0|?QM36O>Awz1p'ƛ8bK:[/%=%9rD֘ >\ 7ϘߡJ|wrѪAiæoWw42Mc2\%$";\ !FWK黖 ٠ 緄7ߣƺfkwH#$_xOLǙt ۫m3rƹ 7U|\>࣯\4Mm4l{~|Yf ;yJ“{ߢdڦ2"r,.=(Y)RS(HA6tC؊q(%o_x/_OǿoL݂L{J ZwmRkV~}P(d1 mD\xEdiTZB,n$GM f3 fqŧJj]KyK䔪 T#gA++*?Ś]KVY*(JٴȦҝ_bTEAtšBDma \(mH+ƬL\}fB!롔U} v]e\S:RqhUV?X=U2*CȌR7j8fG5 y>3J.{V3M3~yrubK6>T!hSw'9/!p:9 R/6B2 ƲT̐yH;_};-%oP'\:s"a1Уce+MKڌlk1$ia\"m?5m׾<3nqӂ'bIաU.PԄHDiQ$B1 CQܐbG"Q&VH:3s9g?s/3u^k?\(92#Mm* jLSW 2Պma` FsWHK5L{k{C@T 2aDLQKq㥗ιxn&V3c-sخ7C$x;"]7~_^2$uU|Fؐ+ yViJ5u+" b(c[m*.yh# b {w]YTKާ܈b ˉAPj?u5)ӆ$ʡTjAM PFچŤLRFit4-їԊq5qlmi~iKUi~'ۻ-7a?Q%4)lO@fUeԵ-yxb*0.q4Jd^tMeh&Jv$ =| Nlj g=6 Pxn-<ѸiZ$KQ!!`TpnB\\l|nkBT3ڳs+t/#'pwЦ"o9K_23pD*DB[[.n$^#K\BaA E14'(!:r %ˊi1iё(JS7Q#bhۆb :D%ak0 !y&? $VZmHi.ʒP:UKSy#9Azt=﫸׮ȘwWoӥC ;ZB .N*HaI ܿ0&xbTZ]<wQs wGr~,ȴ*aGJz yR;FaΑ)D]awfl͡G-}軞),օ0 FA2uppiʢ,oc=USs~_c3?KwD2B2'V-ȔEBL2"gѳq1&Q4M~WJ3zBqQ0ώ\oR? 0Vnw,BIif&lV'mMrG<|ӚWOrvoaf1%g+2v;uSlWm[CW%U4"Z׌}""$,A T.kU1V#`R6ٗp]-ʔΣT\x$mgW/~C~c~ jܢ Kqb,,n їVAXX!%V&ӟ=*n|׏BM%2UC^-i s,tH)N 3j)a _H\(=DDD4%R%+EYKB5K&Icb#:OTUE]դ(|J0PۢEL?P:eG*S u9XT&FJr:BYQe$Za_oBR~VZ$qyBg*hRer& EۭZ?CuMy"#3FU{Xr5BHڮFɖ$}n+eZSt<3su{͓׼h +78;?g^Sw RJ>ELebxq-)C"roOxdk&4܀G.W^" OD KvkSCy/R )PujMUx?3MUHF\"OS7-u]H<eKuqBdpA>%0^EutPV3ގĘYoϨ-kB*bSg5w_brq'0%a#L{z+{Jj*=[wƂdQZ!<p\Ӓ) 65&nVԫ- mJk6-8Čd{p-7d!YxG/9"Ճ+_z/#y?X4R :< Pp Ǟ4!a L6M/əUfp'5ќԨ杧oj>|[=]#yp128֖\HHP<~"+Dz˧ *qҶX[s*2 S\`\|D2/׶n,U- i"@Jmmגc ",3-#Yj7RQ*͜UUGcģՒV}y~N8Iҽ6ߌIӴ$OzllV*N Ái8ŅDk< Ĕ{ơtev?ssw D|?!dx{PR#bD]Gж10N3Jݲn2 +>P:R%)bT.뫪zxt3{~;wAyB_Vˍ4^UhXrRBXIm7?k>1NOOM~'E^}U?qy3C(Ӣ2(H]2:싕."XF r.'Qb$JE(|JS3aNC S~Δ )"rP)ছ@'a9 EH HM cj%l; \$ JS-2J"BC*eq kb9?;B0\k,!2FH*YJfa3J')M%8ԵFjI m(bvU$XFR*VPyQo59e#C$&=L]g8[<._?yЭ787!%Զf6'[D^8L US%J8N|[qONV"x(%-(#VkveY1m)0(` b x!rME"Dz@-4Y#\: v?"Ј p%CN.kAm-fMxsmWH}e'M~ДPأCOs⨭$.y?ajȆw 8BıR,ikƐUEMy,N7ee]WhXoYHg @ڨKY~t4iH$6 ṄL: k:독ݬqvUS'la'xФlj>yOC?RfԆ~GH*Yu-8ctM 4Bd"LciJdRÓG tKekV䬓kGͪEO Sq`lݔps!G_2#%x`uQIHۏ/Y'{6t'+i+[Ps@w5Tp+*臙$J 睷oYRW B(&lj@i) -x+IcijZPH18H֔brO&ƙuY<ݗPӍeU)_zNϸخ Hbw{{>58hHu%zٜH鰶`qJ0*!Ȕ~C&HS$(8n֤!b"΁u`-C{&nڢHW_%;/6[hgfWFr*J'=^}_|N~qi!9?+eJ(d.;t`!h=GCEq1̻WsznhVFi dn4U QiOJ8U1)#$Ōi XD Qc2pV1kHOg%% Pf0[n7 5]AyJRWp}gk i Mӆw#=U9e Ι I3A@̆F޼R19Gm4gV"b::&OXEq{n%JPUmY9;iYw7ǑiX[Ep1i+C+xV%lk+ρ OkKUH N;ŅQ A{ ij aD!0 5H3YhzY+T~dCLPlD2cѓ;c%ÌMN[jH[KRĜضZ .'|КȽj1"j< Mf3uYih_|'(r]V̇#ŷ؏;_xτ㎋TUGܳ8&1t0M׿TiPy"ӨQT(U}B251f1]ITUQJKGg ?o_>A|ko/ϓѥ\)t$7+!ajIК=2V5Tn?D*RDNV,w4S&ƉJJr!9o9cQJsrz#O0dVmMmzhS_RXmIP7kn#BHek6p{I"BJ󨐩Οč~ _{~#J%~a%$KH|+m: ё2"?iO׬7r+^{U@x?"U(i$-ULjtc8%'i&Prq|N(TmS\*D9%@2hqvW)%&IcD>dnD H$Ů@[1!Q 9=8;Wf <|t'|ͷ 7R4Vj:qar @N -O2M3mUXpJͪVD'0z*ͽL%J _*03g^lʆcfBW FJ.0) fMpa{fP>Q+Ru[2 F ֍Fcn.!h igN,'kKm$2zT,9NhhV `9Rޑ!q)J Vcjo'>Wx.]rsflm9O>֊gv37WOY bVTu[3๾cV%tsa`T:MY COjUnm*D.2˪w1->FUA}ybym[Ϗ- q +ͯgǿ?#'>~?3A4O=>oO~>gG>>O +-r#Zs!KHe fRhР@|oee]Lr]M*'kY !eV-7'i!$ S?0v!zCԋB f0yJ(/YJ+L!3GaB +[x9)-  xP[vٞ0F2iLnӳOH);oq|svvNЫ-dicMoR=a `1Տ(q b]!TM[E*3N3}# P&13~tq57;nwi`N/bJmCS4uG0 NNNA4 дB"kiצЕm.,Ȫ4L[ݞ2HvQۚLcx?(m+۔M"Gilt7Q@E59G5C׏ʡ4]c9q_z%It3yd&KE)? (1gGn VdceJe L rYyϑ2s9=?M=!To5Vŏrb6i xGq솦S GSK]՘9\syWx5?QivS'H3iBqQ&w{lNVX臁ؓ3T.߃sg4F,KqK4F|vL$%McnvaijE{FԋGb+>QeqMEtGdh8 麎J]=uPUƊX-:R)<̌6}?"mgr36tY3Α~r$]L֙}NeZ&Kiö5cD${ԙb-5/p70MeP'"%HIsa -hꢟ1fvey)''r!)XbuW]EZ!a'cO/x(iyrJlٞݱ?ܲi[mdU /fcB )+׷:==%GJMSW9YwXc BI[Ibb{i 6Za`VІXooOU??s?zg򻿛_~ MUR("%cB`P}>8'' Rޒ? >һUʵ.&d{ #yO[[+$|J4bYP+BHeq~ H22٨dfhlE&bTm6%\dT)XՇP. Bq?9 &`9܄0:"DnjwF)o5Ā)RIebB Haf(cdӭ'ŧ ʸкʛ)S3YBbnx9?=e>Ar8oaLM۬8GolH+Χr 'v0s~~$D_(iq+l d"jLLw}w"ooqسsAL23 S!!DOy|MA)L[74θ]ݒdMoSUVS-Ț(,Rԫ-ʮkEܜ [ב;|v qBX)H%Ox=+n2>@u<1i]gsJԶFB{"w-R$U c DZP*7"][V%Kf^`*Xl)}$nZ`1!Ct5Jq IGHEr08Fxd H6uԖ-R@e2׻#!KBմeɐhumQ)a<:`*Pr952U6R1`C3i4 HVU(] J躚UH>0FW )uWZ"cD1ו$GAfp!Efsź)Kㄖ*DrXԲ-t 84uźUUf2\ͺAWcMe;)'SnoFޜrrz<9..Co[o]⧲Ý/_SzPnMᆜ#ۯoE5#>'R%midIe;rRj!2gwWU>,!fSlɪ9-m۲Yo0b ?`wn3mY}g>?ͻ^},>_#!//ouy7§|/|}׿~JןXSq.\žu%  da(m*Db -ZsN&,͠KWԢg#xG,m87<|!]ǻ@Œr; F @l!x# e Xո3c9͡kCbGlSќU$eȪ4[Dv$]Tg!]$PXm TW#*X9H %#)HT nD+SryHEs!iB$!"/Li eE~CjyU"!Z`cFS8a":$?*DJy"K~pbJ.mGfXm:aZqe"-ag 10n)iiW~ (UWB ՖGQlOOp\2F7V|?w_|ȟ?—(-Z"F}}O8?{4 |xy-.~Oԟy57_ ?g^X@s)eeV\JP Pl(be"8G"5Lk 2$g|e !vhY22R\tU1%_űDrD/+%$I?0Pn#@J"Ehw;j[#ŻATˋT2u 1؊Vhc*.rp̒Z(.3H)1JҶ+ [-x)ȋRPXLRH(2 0agtX ڶ]kq{efeֶL JP7J&]$< Z̈́ۨxX5gg3H-d '(jT*lo+AֲR]Sjm8 yd6eBBOՆ| dSH v)2A!|En.Rn%=>)LUVH&ؓL/1 '-)$eSZL IDAT[z}ZmWvŦ( N*GMU۸j*$4ŁʙVFidq"U0RE4 T`\9^gBtdxtu-yfáeJIa#ufi]~2$uj!A$N{$C54nnHp[q]K?εHbSY-%{ޓmCXZWłcĊU`Zqn N,*gEOtfМ5#Xµ جt:ԜM 1[}= dѕb\":<BtNZB `C* YpB͝0֑GHTeu3t1tΰ^,y!smLJW%x)9dUmNSBs *:e|JQ' ES0fBɂ1Xs]Lej.!d Qp#VtBڙYTlfQGN\9j#Jz[:kIɓfBu՝9G6uQ\)&Z$u"6XfG|7V4QbE)3RU Tu own,KV%)ӌ.7!%L*1.`ŸLiW^|6|hdFd nଢ?cFf 177ֺ`\DKS u`P9Rg(!RD'h Z~֨ %h2 ֡H9ͦx" !54eeTP+]tsR \]xjC,d=PC ˉfi5%$kOLcEA0\QRban=}==aMlm Kb, #5nUx;u{ܢ#7˺M\ Y5bb? 3CPhDDI"A<-~, {D !b-7+>жrvѣ{OB ͋/?  *CjiY4 w{'G\>Pr_Q?lzv9oRG~{9C iڲZ5C" Z rvLc_)?RjLj/8k;?F>?G?wܒV/scIJo>Ӷ-ϾY7g(q(r1鯏;y~\gI ȥ@:u-y6ɅƸyVPJX,(%фX&u8#J@hε4z Yɓ6eoɩjs$DB,OG1\!s 1cInCJPBS'S]ΨjRY惡j -'3SfZoS*z6@Lɿhg^BTB߷ϿwL[WѤ}E%1S&`^ZJ34#8iN}~R=ɟ{$ 14 ,e l6kBrP9$͆qJpwz0 t֑EfSB[ueiZGc#nmhBI&Ю=k]8״>ee81blձYjRñr(iS*lj!08U[(r&ɾ#Y<w4z*x"Ȗԉxۘ6܂cs8U:e.a S:cm$mIT 9m@Ejv9W~-8].L-UuQ0a?' D}Wy}c|liF'?ɳ>g?~>5w|??eUPh>m3_{sb-^xE>ܿi\TiY816 AD}=JnfTӷ`F"C3bΩdk,$bLQa%)W|H#)+TKJ6?܅0KĈժq %%o=#Eƕ1 a 5͡b+iXtJ׊2z&և)#dOHyH3sj14  VՐ'Zג 5<4`F k!O0(ӶS4ZHF_sXЭ:8PrzMXW47nK6qF9Sdmj,X5-xҡd FHK 1k5ah]X*zͅZ(D%!TTSO=4M</Ytka䘏t]XE;{dR$i9 g:tZ?QƑ<-*#K: u%l,kyR|3tPRTC̥P9PЦzPfW҅E &8VmYpO& YN{4(@jGYHJ[É)NH0}1u*i:~‡qĒ_dsi1j jSq@ږU2fI*0H-%鄘&L4) fnnHO߹U' F}`>]s{/z3 (G*!f V1:^}Qs#Wi5#I\l4> 4bX H5u 9kG--RBL8Y;\g؆͐(pªkcb4m:)pۆf{H7,[ɺ֊ ^|G#:e"DN>Yc0VSD|5 2),C?quճr~O!D\$>:_Li4Kg\\0!Da(%a ox %5/tE ilOPΡJXB#h& B|?k2ӰY="Eh`"kxjJ8WlH ֓K!҅_ Ln1 <3<׾zy4m|C/4|~o/' ƌжe5|Gϳ}~9>?3s!%cA!TsnJ1d{blen(#*lۆUWC82ӒisFиEM9Kk dgNP̠djd]X0ưlh)IP?%T}HBF~4!` R't.\8JLaBꪯPVtC$ڶRH)U2vTqиl,HdzLF%04Fr 4BXJ Ra%F媖r=t, OHkc\ap A4h-Er<=DAg0GZݖY2j(0Z(rLD e%5(V]G(Ǒ+@R(iĔ3Q(Q-+Q 2g!OrBvKL-V\%>|sg3PhV8i3=yp s,+c8%9e[iJJ(q fL!\+FI<П"`d8 Q/*7'XvrRfjRq/>j"}H~$AT|*O%KA0EnNF[8b v)Hh([VZd:pZ"EbA@q16b*PZԶ(Dc02VU iONcB4Ĕ7W'VA ^nŷ[()Wfi\UfV eQ_}O\˧gv2ۢkJT*A#PX,(i)Lb3v*哺o'۾xSEXmx3~?E'hr[tdRTZ+/bV>Wxo`w~xVDki1uX}sиZ1Ji-) (Z]p]Dfj)R((cBEmKP+̷TWF+B%V4MuBZq/z#TkYhI JRKdX,DUJ<U}*VBvVlD7B8q,E~:Ǒ#!q!T%R-BHSև~d{Z(eqAJEs(%+ HiXjD*A\7lksN+) rx?'^ߘŒBi 77W;r\ )a9V\IU[4)jZsj CuzE:CBc-a;ıL(h $ !"kG/24[ORiӼb&r&HD ẠͣyQu!56 3R [JԐP ñg:@ȮA/bH< kfȏBŚRiXoX_4-i;S=b>+%*<ܻw$q{Ͱo W )cf&eZrNub8L,ֽo7l9$dEϩa)r;Ux۱;ytWM.k SHضcbq<臉0!źH۴'XTAۨJuΒcu @8RZ-:LӄD2q8p*Mgl:~gNsu9/_).Zú1qd&RJ/Z-Pɣgݵ5CHAZVEkR!i̼Кm 12 U{nmk^h:M=J9d)dj4iۚsCqCmZYzP>LAJq,b]Ul4Mdbc PQ<]xVkJ' />7iư\,wrꀵ﷗'L R?d5\T;^F[ps}[-i: DFQAj9̫(AJ84=_'B>'Zk ~dzRʸ ) |؏ُ1_ gˑO}78k G?ϟK%aYTR1M?g??/Ay7z_{Og?Y SR̔:4~#D'+ R'U. V}m#<3̜s{@O@:kdl61JQHRVU2:edՏ%UI9XI~-B35U 7i$:bY"GH7s̜2 2B( )LCfXsaTÍCΦq+BYWUyy)kpfiҼ"|`,L ;ƝӠ%>ER C˜Y3J65~@?M~DKAv6{ɤYV$! UZMGfeZY3=96[_%sì^B7rH 4ʨQE+b~54>ilGdRߣA >(~ĞݣpBmK6[ &`BQOKQeڢ%)eDԒ,UaY kWW_~-.E)-pjLu(\ '8h'xxuS 9mz!ZބLmr%~{"H3ň4У%1d&koyB8FOg2 0@ZQN3Y]`GL#O?u{&в$ 'J)uR |}'>~#|=ͻny{,uW IDAT_+Ï}4@y׸ppcw>~?h?xؙ| f*oD6)XzA Q9-RIĘ)׀m,J'dU^3R[EZr&TGhlTN4B)Ss+JCjx7V Hx&VlVx?՛TX#02B.&$sZca5*BsyxmifI`JϚND?bBIM*j3L 3 2I QTRFTFKh}I4T86u#Z2)$Ӏ~kmLg&Rʜf۱5$r uzJc"O!/Qϋ"L#G3M.nCAG"pePr U18VIcpN^ubw"ٴ(]u)˜:U`7˜ }y!y0c+v8|$vy{S?s~~瞫da shZWjsR[1GJXUB@ij04MC.y$eA,B(0r)xRD*h˲qsxQuݼ~;rb嘦A_{) EojЎS?BZ#.YM9c%4)H@c=4` 1Jޓ'_ͬ6~?3k!qm6IP9KXh>bӕK޻Cc-a:gfbk<0\3k510c"_߁ߡKK&IJ~jd\aK"8Z~GX7[b+jI8kC̎i"TXPBD U+R_S4e_ tLhjiȺ  iҼآ$42Zz&A"G_2s~\lU( BQu%#tB`H'JdF*Q ,ѫ:OX]q1T8,e僗9;kq^\aG 01ozW=gB*>v7~Dh4 q%vG?3t XpNlN>BT~LqVRad \]_"W9R!9Vamc><:AK1 lqW7;tIt)F 푔ag ˆsadG1X0f9$' A(05#;gA2cQl`iIk% gB5-8GO+[6+AIjS2KX]Z'{#+BL1a:R\Xj-pu"id'6s6aE̒UbՎ}GVYfǬQ4@s) N#lu vKLS#)D\k| rau4B#c֜~3dx+=phWK !FٜWȪQ4jX9NMa qOmhE__0O;Ndmc%jB9/ֹZkLUH۸i))}BП(9XqtE!?V;"LV;?}oܯI//K|}Y:㼹./@|7&,5/ojä34Zcyfg9*?)szWs̢J@&Q֮jFkEU[`]C̹NRuE(`k:v(+ՙ\i<ӶUA,y}eA(R!%m;s f|@baYPBҵ.$OM`ej{OSw %"RDjz@~ JA A:Is䕗^!v`wszrL8GV+~w|@=ZVJXYJǁWvRyڮ64݊W^|-5 6h;~$9O q?z l,5.0W~Bu+X#MB'D4Ai$Z!!c@ Irrj`Uzn)#{EЕL"a !-(ma4& l7gpQDAj5(uЖ #>|1>D* ӧ%rM²Y5#YSb;֛q)E2K}-Ml֮|%Cُ(:NXrGTIܽ{4DZrBƵ JfѺB2GO3M@5 CLyn$〴G8̎ZRNC< Cӕb, Y.oVN3 =~њjALdKseCT1E Kǭx_!=JH%@5 k\n{jԒ.'Yuisw?iZY^\e{ODC J"4ᬞIv<;wn4Q2E& 1V {P"w!˛T /b.d\=|w^䥯ڨ'-ַn_|pw8_;OlO픱:q̑(eX.[ M:b؊o;XIOPcBRKhSN1T(Z]5bk>za"EMgW4\ό@ cRHܻw|;'> 嗾[g|3C>_ZV۔Q* "B1[:%+U\!Grs@X0#W-ZWS5c17 @CX6K5mGښR"x40К g7C(aBG6\IyAY+,^~$TiL7釞2 eЪL#(<\ҙ7DbÀѕQ nb Kl Uxm˺--Xb\{vs)PeɅ-cBË )NeN әV)Nc\_nOq{H߳q?slB+e(7eAW-|PEgLI 90/& ֤gllx{x>qw{{{J\h)@wdߡU~^~svB~p8 qIĩL\K(,?xv;1>N@Pˏ|2CI4J+CGrh:Gnw"U9j<ڋL5)-xor c ЉK3;1+Oq8Qڰd^ya9&[#ӄ*ÓnNxkxE祊a9+ ul:k0F J{昹?9嵐[6ޠ<,` fi[YiJ2,Pe#LVoN}nn)K^s tAcTp:Q.cǤxvR}3jF y MM8^j<f-*, uU2^)P28ጡj[7G̦}ial܍0Gx8'n 66\_m< πG>Ї_ON*놢6%7"I*,=cfJ( b6 iy&1f//Xi#V8~>ߜ, u y8) ^ c| < >_{{.޿_>>7GoӤg?\6bZiTIU[R+[Bmz.R?Į-%F,8GivKBVRe uc6xmnooE :56zjݒx]JB6HGK)quN>MMTΉ ðeZ"KL#:A׆nESR"H:vnHl0tk/I)Sryeە8/ * dK c-JY1C Y$_J4MqUJůQ"5יReYNn0)]sR:G3 UO 56g0:vzO'Zi\\l%$7 *m f nl-l𬌳"57&t28%ݳ;Χn;he;Pgm,Ntt؞̩<ǻlCV*||'Ew2Wk^7{ZԔF-{n R%CPkәx32X E@6 9{t90#v6`JZ^zHI9] hTzQ IDAT8q9Z3F8Sr:F~ct: 7'.gLk V\3.tFP2jyl{3Uy=yΔw ]o} T+?=~ۑ.tk 68VZ6lq#\v} Bzǣ{RrOl9M+qP%1vs4.vZ*w)e6-?`)v'hU"gV0xtIx#i-agYz%78R`ub׳ Z% K٩Aᴑe,tZbGW88O' Yq3G7#SR!¤Z[}kk2C:ժ0U 3Ʈ+R1L f.]6ri5Eш){瓿s?-sGpp!~țtǓ 7~O|~3_~~g[~;K?V>՟7o}\N MII;~m|@9f67ɠw;j)߯^ɯPK!aev=a#J }ieB x/\ uҍgUKZIUHwį~5vC#Z^Ͷ2egl:A  e_9IJ iZ>MQ^ (!M+%Ú39'B4$ .[BLm >V  _'E1j=39/ؘ4&~jI {*UY9q{{O)=Qx$֎e4>|΍-]Xg9Nj.xjXyAttƴ4-3h6}`5UcyҺ ei=JC)qYnCHi zy6t<9bHҤ"86aڛy{_ oZ2KCqIQ4 G)jOK&Y W=GbIUiʉy(MֽJ91|?Oc/on ܄m᷼˧%_?Nyο#Yo`_羚?_ͫ*uΓUXJ᭓PPUKϦ爼뿍1x<٭umr!(MЊsdΙf4i"H%ӲRsb,༗X(x.%k3Yf%RK\d4 '7<~ϰz1UZQNsLnP·Kz|5=%ɰM_c&tezobD+!IjB^<ƈZI䌵pJRS*~=4P 5Iqkń:YjqV2ES}@U1 ,%GjkeG3i:VR^(DYQJXP`#wvJX2f"B4N Fqt++%Q&, y<1N9J"c4,Ϟ쓿|:`6\a>¼fx}2G *tjne\Uwy!/bmڃm|x*djڲ?țompRJBa pwgfK x ϔZlZi*Ѵ, Ex>ʍ%`S".c"ZN>݉Tnӯݲo 9q`yp!c]sl;f o&(<,m,x0i~lzhk(~ 3nP⢉Uo-]zǦ8*`XmQ19aI%t#B.$Rchg 4shZ*pՖG> o&pjĠ5R\P?˙UsfʲF-N֞82N3sV=ڲ 8K3pugM|鑛̾+\Obu»/PX@VAY"Qi4h4{NKDȕIZ`KQ'O\6R%q7I*;mzGqCՊ3w҄pYKLXEmx,c,iTSx98t9œGFh%7zrGՅ)|#?};TyἈ/!4IHHhmH9cAyг_pJ;^\eJnR"10%*z}7K?U|_-͜{@*I̷UO>:3[>xZv]|}3gWO\WoЇoRf,U KDr\T!ZmqVi^(kE^qW\0Om7)tf1!fJiF6n! D?t+аI^L(ŨuI(Yb,3~ i1Dg3$x8cwa+8f`syOO'̴F|#"ɡ{GoEsw_o2݂kpEӆg4IEY,hC FUJK”F]fc/P~QGt)8'2h^Yƅ|f0-cK[p|)ccqJ3VCˏjc>03Fjb1r+Zh0 mPkY ޱu3nBp^V8 OMe(Y]X¸,\/VJWԦHNHk\;wp~W^!>rKrm,4x nR9cSR8Nr3WiMP{Z ܫKU`c1~W뫼7|7-Yn֨;!{ xyYw W3Q w?3#wM_a?A^?WoNFmodZ7b4~⨟KZ]G(p N.C.[fS-o bvLoI[F.zui(P5S!(BVOYM-'-WҌ҆ . (S֭B9a;HGe"ev+A8/r.?e=`w)P yT tHnx?Mk qrfa8Ń i<<ƅ~BYP{vpv#oGb. -0Ngaq:g! l{ǻ{=2SZMNq>O}p\ je%ZF8OPʽSkĔ+n:D]0("-&, e,cLLq?KUY"cdh[Ƒt<#xn㹾wFOg1XWGbX1JHvxv+I6#Jvf!taj1Q]!x-g=3R?Qk[-iyD0aufB6Frs$ c#emp$ភɶZU U Lh7E.JMAD"J RӉ}}>*#xlr2)/|v$53j4MQ'P91^|FkƉ$u%Vb*̹7{;I)!Xfh%Ce&Gx{qHYVQrĔa7H'yFߊLl{ܰӟ wa`)Glc.r^6ϴH[ ^jD mQyX#Lۨpg'پt ᄲǏ_ |<1gVgtV#¶#l塓S&. D$qڸ{v6¯'#K k n7:o<掰H]E"Ք+ǩU˒x-wLYK@3( F\4i.2-8F86As1bSko[ϥK6 x0#1C՞Ũr/îp.41W)Q%! E)b.tm˼`ivCJIRQo(p3G)ʂwp图<|>`_Q~e,ZJywL17kQimpγ6 5)&{;!ZGA+/WYS֭7j( RQ'~q^_ۆ|,N;1 y/Mrwg~fK ؎[KK^aZ\ 3[+=DG) sj+6N>&Fy²Ѿk-hޭx^i_<вVtH{$n! 6}pPI:e{6Aɒ1¦ \^N<:g^V#i'mTŜqb. ia14:[o՞Uo?LĄg]!OTOS'XFKnzJ3g21Js|tO0Ҙwlx ͣ@ 7:V^(;V+Z5RT'zB8k)Ħ^3--#+P|(y7n vZ7۽؀S*bo2y9Sz%4#MNkL}8:B- 7mnFIkLR![f?zaei#?mi>#@ x3H]QLj/[D+[Zwn''nK m(_~8hV.H0N^&NIޮ'Lό3؁hqx33!$ ӞTv~'M#A-yL+zc>s{;'wONL/+zG -Qr3hYu+4YV5+%R Ԗv.o#m @fguydY츝8L_znFL*q*5r+jRNrSzT΀7Ngkg4bl';{’*ad-np50[OtѱnGρL9Y=*^mH1jSR1 o4Bς0 <TNema]ObgY##fG)V:3VuJ shia&7g]kpuTXWRL8Ju-Ly?2Y&H֬ֆi2` pVC;f< hv)VB(˩$JqY?kr-vĢj$d u,wL;vǑi9aٳ#[{\n8?Cڭ:G(gkQEX&A+JQ4IHVk`J /w#Bˑ<2xEu8wF'JA)jׂRѭ5aiǿCηo~pq Z'\/nsef h?}+,4k,֌m%BJBtN;ZkL4WVwY pYS cM1; *0QS K1~ϳ;^ĪMr!uX9hژ5ZUF7XIWO;rw/D䃹M^\нqwwOmnڳc#.W޼yn7`"D)!Ĝ7d@DN^=r?P-6rf?82:E _~@ךuP3K) J)kJxg1J&uVm{R>ۺu\;8饑DOOaޏT4Z"ƚpw"qOniy%-7F=hyzozz=NmȊ+n1Q8.AjkEkztZ)];)sHO+֕+B\5M6`0(z`]\ HS&qK?)޽PrF1cӊ7ĵ0EQ |v X2Oi,!cDZW8pMZuv,Q77 J+nJʅ]K*Ă6r%0 V)g+)o3%&wkyDw낢2kx3zm<Gw1E6Xu[jԩ~ 2{GeESYɩ0a(XyP&*!n+5$#vqm ,k0;v XDidi1 ݩ*쉧w;'t08G+|WwX͞/}t#1K Qz/aͻGbL8?c$Ǝ2As#$rg[Qn1Uy+2ʠhA)H@43 yx&CsdZNwwokpF-U bNJ57 ~iwe%7?-Pk&9şQ OO(S9ٌ$4̣F&Jbaxg:LњS"-׎Q5aѸm4aZ)r^[A)a 3}o{֡Ler8##?Oo2'5Pa_/3%ݨ?RvҨMh9nB.yNSq/U)NL*K⽪RVToCv%".QtU8k0NB]t0E G4j^,N*e`\{'79OSF Hj[WCC.ޠT &<~W7.'riX;xb֕bVdDeMNk=ֹ\LQRaa'59:RhÖAX?Ѝxxxmw+c=<0N#www2me Vn! R)i~//qc5r~c׆ U2-n&RBҌǔ gkHŪIb ..fMVEo;!F&AUqVBImUJ %sJnPظ_A1qVS4װZoVϠQ{0ޣrψpu3M;JܮdI[AK&i#vjJ(ㅇU*% 0_[#Rn e%B)x:.O5vJ"u#j^PZiEPkÈ#Ps_VR8?SF待b=~ 7KfYu &3-Ȁ҄38pTP͑kĬ*wV" !w9xjf=J*yJ NZ9-1Η~cn /ܒb Aai-)UCSDÑыgѠQPb#\ri:]=%FZTy❆RPΉƨ7|ˬY[ܖui VDJlGk[\L@cMZ==FpTȚiBkŸ$3ЪYS[}"w~4ؠ0%Rk[[`pq[ rSfG3\n* g|yֳvh K϶2teUk7zJ&0+eݪdrE=ӜrT,XTm*!$k{P/,M]zYy'+-'~or8i??Gm1?πJ{yte|9|$į_FkU Z]~MaZ%TbIӖ^xpJP{˲E9\kQ 0qK3M[qQX ] +EP:8c Î2WE tÑ0rr[+luR*F+<ٛ(7j'@Nx9̳!Ex nkUZ"ȸVVb$BOoXc>;V;5aM n; ɍ}0K֤nVrG# %j˜@}Zǻ}*zrRLǶ3vFm5ѻr OHnS*J[+o}ӣ=Ok^((!8o%90w5PW$78֒wYqMTh!a5-|>{~{2p9 4F*0SRLMG/Ytƒ+Hw(bZ:~[.4+kTʹ ˉz`a!#bZ-F^ZurʬpVӜXgк#S4>VJ }yY@szuݏԤPߘx;w庼)?0^$+Ne)0O3ץPBJ!´1ނwAjLohUiʣDUaoEwnU0!ϖ5Fq? rI 7-5Y` -p-CMׅyo߾g=YRP-OapV95zc<Ӥ9/\v/T 8йFU3ǝَ2z)>}yd5)-XgM{%pN6z{TiP6]tS\Su)<&\~pX+IP-0ŵ |}{O*fRHbܙn2uz7\&x4ٲyˊt>~yN;VH1C<*1.(#|ⓗ3N)|3OO򌠭aqjVsȦZFz&YʀQarIDH2 UR^Hr-I4Vrv`(%}R-z*Y iYΏ<] C.E^.6ԔAM|6l<"$iN.oU[^Nvħ'T:xzW<ߏ즑<~Qq~}x||1&8. Z03XOI4l@ѩ(ih#kr-Z^|7ӕ&qN%+hpYӬ'ƄjMqu%DOp=/Pn⏿kOw;5T Y"n}GnBmd*ES)N0{3%dޖ+ub@] ۵ < dOO\+^k!呻~ݬ骉r>p8akc֍݋V p|xI,lb8o]Є3R}J)Q =4jU&mA\QPfRٍxYyX$bڞje6j<>-d@ȩ4R8/ ׏a̲n?q?v> &g͞ݕT4Ӥ篨r+Nr0V>sִѬ*dSk\D Xm10No7O32uy0w*fVn4[Cb7 8U9 *($+ƿ^(?%?J̇o10>?>}E _oo}F sX#JmdP[Q*H֤.ZC)EÐʇ|f~aYk :PҪAJl8 R*ZY~У4˚^9vn` Fi#93#;ѽS+yPq4#<ܨ$C`=(n@X07:0NTHLifo+2i!X?Syxx&Rd=$WB Nٙ wvg0[F4YRYRh=O m~pgi9Sq%+?>3Ƀ?N&,$R6V$Jn+yt?J"3k&.+d2'R ԞqF^NĸH HV,/sJ\R( g -IJe J*YHZ[Z^v80q*WoLpjZc5 k_Ѹ],3 3 wog?F)r>naQȅq-XUőgLMoq2u7ָ- T6v4zw"S-~ރָFO4RS,W-]]T ˁSYkPziD9QZxHe&QkXFO-܀*Υi2i-/ =4LU`ۈRGb6 Sjĺ #uηgr0`z)Q2j۟R*q[Q5T tި]Q?dJE)ZxJ1ڐo7 b&Q2r|N`@Ke_J#ڎh7㇉}C&c}.ەyH)@I2BXHˊwip}Oidڦ,1o=҇ Z`c*Ya#njIa4/yC i?kv9a*a1Ϗ{flYGa|bke>tYIqx6s8̔ڹ]nx/6-wnkfj Lޝ )0{ϲ,11{_g#~T5`qvE3͞*~7 1L[)B830:>0O;z)3 L183uY3 : FNkbݑIr1@ Q[*JjX/.>Bj֤^8,nر;q9,g`ZeP^;MKfݞu+Jq^VFptwq;_\8X kD+~?BVh !fBnSj ks84:ԨpJZ4qY9sgP˲৙#4g4+1Xn* p.ҸiZ&YTCzKf f]qfJ)#mr8Z(JFVn[ Imy~7眿 hKeF5DBT*ɰ$H Ƞd @<ȨfY2p2 2HSrMU%Yߜf3X%\ /?sZe @VAgZ$ѹۑr+y;0tD Z]mP8*#]Tuqbİf0GҝJRD))0nls_>|nj󹿿Vo~>?1gug&8ߴEGb355v#ƈ?kzФ*ڴj~-/JJoHygQZa/AR1ċZ^ Fa\mC 8˲Zʾ 4D)"Zxf3a'whP5U]aOGjJ;\ױ1iY MhƮk-*~GJN\]mYʴ.t:ϐ fuCJAK3;ϭ5Se%+NK;&jJ69PE;dRUpk6Rk"RIHkY?Owt<~X4n~Z*t] JFU#p}ǺR5fTiy65kكFm [ T!+Br\.V`ІZ[k9`k;գE)_WL_k,obWq@`tǸ.|h_C^fkXSL:푵k[P336:o++EhERH"Vo1ZBj>1p0fkjܼuK]gz8L#8%麞t"3)6YDhk2pWvzQp8RD_]rmb}Z EԜ 4,yͮgZիD/G걪c2WiAeu8|‡יGb(H9bC 0Y|.r8=úYxm2)$h0!W$Yfș<ͼ~8Dkh/'cgDp}AR86EU4{#RFH ũ-!$w<\1JL;XbQ\pD%"qdt逐x>;EWO.ₗZ%SzVMf&gf@Kɲ,mϘ/Ck=֔Jwݱen>lM}ل iج Gs9t"]׵\Iͬ> '.$Jwtʑjip}W[r({5Z ! )S5+З9B5 a >$R wjA CZQ""̬EKيcD؞5FJGBJ>RXg`v=%b̜O׻ >$t> Eߦ \LZ^ZV7^o430m"&haVn+02E,a]mi DYLg0:uGNo~]WISaYI!Pce6yNGUr$ n&!QV+>+dbivj*]EkiC 8rْ$9An܉pkR%,MTӉeܾ.6,)Sj&KjleYR(߳&z$2Tdi﷜ #z[ȩ`(y>PǑ9=j˱߳',%fLM`EP)8JI 5.b^Xd*kzc7ahkf08 UlJrؓc[?ȼT^Sjo"ytC3;8Ux")57Wt2=9fPtz@ B:ڿsEm5E[O^=>fhYk@zҩ0=,h'Š2} Jq"`TBa _/U+lƁ9'fٚJ43Zk|HgڄF4}q_bݡTEP9j[m+)>B v(d1$JCOo +kl:Ӛe^~x+b1LmUїgHQ7f}N%$7̲4 c-lXu x E gV4uuX#qZ4ol6f$H툨./V|GMuA*/^M}~*S~*W^`O3#?m>ZGR̰pdrؤE6T>t:V#@bb (/ÊkF/ Ʀ-9gBXI1R5=hZ%$3936]Йp{]/QV~ybY" o=BVW(ǞfG%clSLTe0R\}Qtz@7f ];\s@ I5YHeݟw{0xъĤ G)!Ts %%%eh~LńsΤ2麎͠Y3Z#0Ze]=˼KX[{3K#RLD(PKP֒Q֤tÇ!#̮I!4P(1_|W~'c8޽f:ɩr>q 6Oб`xp^"8D*5DvEf׳K OXd:/0 b\}vv3}rK)Z(<Ή9Rbf7#O+s!)uS3fe50/g4zM^"`EUBxsNB"m4/ R0^w\xVα0͵LR;,DA0#Wlu*uFÜCVJIuɻAvfrXB*%XCo*BI2`Ma>.(e֨?R16knձw2mm IDAT0զdn&k4fK&X| (!ݹ~(uq K97Cqa\C0Rmʥ if3UD_aVSS?&LmJugOMXO}EWb (UPs!@ɬ!P>]%.!sSJQžiQ,jb ժ&OREjRT# Y`h[){Uyy0^QJCα)!C*;E9xZ*C٢lpR=%kD_(RRR Āuhp`y5)"Ķ' )Ė5I\[FF+ T#:(v%$+XD.MO:)(XYyܮuwdy1,$a%L`]aBsrc\8,s@ %#rf%D͚π<\g)qcOYL8#q"Bk;\B[tMc!pXC" c(EB8#(4Q>YB|46|<%~ĜO|qT/II݆_| nJˋ՘eeM\VTJ "JfFUT!FK:H|hH1DDJ-%À F'"׵ӈPJe3n/6I[sK)3 5g\|*#5GRI "U8=7O{OEK8Ud@Ũ:|q6WW) Sd5Ǻrk<k=CgI:6 J#|=#>Ƈٳ6CiZ\m;MԺR s 95VD^ZBV 4DmBs7/HR`{K <le{|ӌ3/mB8RpNc9«71T9fĥ3)V)WRsH8'bP%fLm6A;ݲ7S;=)TT1SjuΰscaZ#يzy\=S8UecC\m:n Pȵ j@YqZ 6-GjEjlzOizUbdY6"bJEMu>s(se/=kY5g9rX>B\XCl-:fxf9Pk /BG>%Jfl]ύ)"IHKsn g"eSOj~b ՛*1o|Key{ )*) _9Q,UcK!L%B Ĕ(I7MSmMvZ =ڴ5R#utfDʈQ2M٧_HybS*7W,q~|MF7Q#R;nDsjXpk3v v{RJ1/3#ϭEYG7xS,'!Z a][8YHu@ՂXJҪ%ESC)c q9j ?~a}=_~·y늼xΗDot_1O 5Y+۫go96_b6uÊ)|ğGˆW;sv;*ҜWX |z0T.P/t+:䈐uY"(&Sf&gr\)5jtiϼ‰FYwj* (C.e.I!a+BjP tavFBBi&I*Oůگ/_~"RJK~_e}z֒v@ !3{\q:/)L,%Q2F;RiSD o=gYNԚت2_n,' Hj͓g3ۛWpOhZ7qǫ+߼䗾z Һ93miF)ն3'HӜ8vsIFIs}JcbYvY"rǙ}9";=!q8Zg5qDB&#A`m8N"GOpϸ(>baIa ׮g=ͬs[*r)%Xi0i([=sa R9 NKŗ*):"τb0 {l'xXR@iŮܚM_4^AAcTe^"kU) *&!']_#b]C0R"ƕR" u9|[>3NM?m~[oo_@CpqS}uxG)%&+U9\J&ԚtV-ܺ[#PISiG7\]I4PD 5ET40@wPl8͓c䄔\ZR#j"īWG eۛ6b{(إ #F2Զ8fDC"H<Zx1cKehe Niӝ0k-]ᅣ.=-FC@0̈́B ߿r_:Y~m_o n-GAg+'QV_NNtQ8̧DE,f` #DkpF5Ѭ +$>yO;A_ I&r=o7K'̖9'GϖasL^$Bu=ڪ(1F _ֶWBjQ+yePSy.+5~!imܧ* v#ȗ{ f>JDԭT+?ᇜ-TqGvDG!j> rE9aqB\VІ>yٵplhnqV0+& N!eb0˅^%a&Ly Eep=YPnD(G!i%hi$0Ց#~j.*gmu8 ?#ʳc*)SqZPbEE>ו@k.pq͉^7-teim/%fxk#69?'Ұ5Ciٿg !qJe(Zf)6[FsFʄ`%??5o5WtJ78 wY 9'˙n Â5quYUQzTg3}+~C:6C7Nk8>FYR |6v~nu}ͯt޷t͖4A~nbYE 5bAAɒ 9 rޮ \|Rm,QJL3˖aBR53vɍ颛kY=U(rmCYrno" N;ZJ 'jBV}) qƮJ?]-Rs<6:-BvKg8ZKdOM$VK XVJE˲a` ~fYKg-!* 5Zm|N54}W1*a]|_oŏ?]j~7hkyrfcx_Эmcd`T`]yT$/GJlDD&1(͒cd_|{,>ֻo3n ρ* k RI!DM$E9G/AHJ󴂲,˙/_W"c_ C Fen=]Tw$ÙW/ÆSLg׎M`ay řOHY!*BTrqf^+!B(*z8Lȹ2Da 5ĺρl=FN3`qZcTqPٱ҆T9 s#K0A*PEӒz4SiZr\ɡRkd&iФQ6`03[iIJO짅ZPLJN`\ 40!f֢C+ YLkd,%c;s k';{OzN0͎CT~HgvpBDh%A\r }+Zp#RuÊY*h9LgYEcEu)th3R Pc B #+JW3XͶr]{cBF3 ZV|X%l{q=Ӵ :w)Vm5B;r 0ij9h "E1fZr:|TKu# s%fITeP zk1%@<f0O"UNo^1۱gw5a?s~?󷸹8،/WjY0Q<~ĕX#NM+`Yn{ޜI6W#BgBFT-[Lxɇ]vu͜ 'c7=o=qaI lCl r(d"+B6q \uW"Bka%TY/3F b )Ĝaa-Z/Z*&gβ1 gIWH!r ##6 UNpjFhI,9fVcedNPOzj1a4!eb2`T&(3hV0Xc}F|`A9NKe{eP^=r0 p!p{q۴DD-HXo;?/~e %%jhT_+ny vjJQҰۨE^|ϟw~d>ɏط ~Ϯ7ѿG aP[|/@5P +r-ڠ ^FrhRI.MW^TrF(s9J!?tAug.XF "6֧4_g,{QZdDL)|#U:)2'۬I)qj9Rc5R+B0MSNT:E%swf UA)LUﱮ}hv Xt(>|FHI'On6|o𫻧nG>?ݢp>W+}{uW''^EZB[]>Z%>Hq-R ֥6 nU*1 T)LGW*UẔ}b?jvD(ĵ3|  2ōlnz(  DRE||LK BQU@ Kѭ&K;̦ ¿SU4ƒR#T&fp!I8a._mkhQ #oZ*- CfK=ZejԠv #nj)Ê:#PBKAX'2Ɇ7BZB* %/t-Y7ʓkdz'SC}l;,\m51' >Hi IDATϬyw=;U7sCJKv҈$Ahlz UȢm62KzE)ò)䙿$cHPwtwzK 㪮ĠѹZ.\ys89O~p}R<̬ skǓAj,% Zi%ܮZyKBl>}v~ʤ*@W4F{#i^(F~/y R0ag׷+96jHgĒQZP'8]I)EkZJ x5 4x:!G4Mc!dҒi?]uTg WA.;I473yaFknJ-ei5Ƨe\sTEX;EVV I F1 7muV<߯la;lxXfKu TV iiP5eNU9:p5#XBoZŴJ0B7*X8Z~ *FVn%J٩2 sI49F `Xj:0{>#=~w~wPcd Οηbt{ҚLbwY9[VsRAm,Jknp0irOL9aVz>ׂс9u\lib\WOn޽tfBQJf]goYC62u>\\ovt d%:#0#uYYbʴgR! r#x{ϲ)/m<1swhv 4 UXkpLa1u&a퀷\Rj1=JϨ*,zk)VLYfWZy9bJGP)Kn*<r8x~UGY7\yx|5o#r[܆q=EUs_36@,vGmiibYF T")Q1$qef;ye*˖R#JHyVtϿ&4Uju]GbN@b(KDOqdϬTUwض!YIӔLR*Kˇ9icrJTEaFr0S!29 J;((ƱDi]^?bkVo'LX urq~+)dQ3;EHumv70~۴tËW{%w;e&D )ZfՑnSxͳsnq;>w.i5g K鰐U 4* ͽ@%9؝8x23VZWr:)h 9 8y$sR#lcFH8SB6RXhjy['+k ^8^aM^&1&*r0S"iٳgߌlErT g0΁ ]DgsVTJIԪHTr]N:9S*R9bTeӵ ]C-S5㬅%ƣ+oWRoiyyc#J{PPqLKmEf[`Gl)]hU(D´2ÚsIbV[{*JՂ1A7ݦi5Hp4S@R6)< $4窱r^(IֈvW1YoQp10>~AKF;)ҾO&di>UU1L[fh5oIL(k-7%2:u3S TE )֔)Uv儈FIPR l6-qa>#ռ|g~z[OG+%o^~׿M.zW d%͊awF*5`<8B@;h..nzֲgxJѺrh&3+kH|9k\]~fwݛW{ة™,g+.{zn,S|spi27Ek#6IKhœ'O)B$3),Xc%[Śoeۆe۰vjbI0\_R -`šEM^W"N6-t$CMu0Fr`r1KmӚn;`A}K6Xb%FW^\C\ڡU#08wt9S;IU誙8-ލhn:g̸>a\Iʰ=;gze] ÑP1ݖ = Qa;nq ̇#XZ1eLwvyჿ.txףRWmO L! t#q^sg^2)ӁGC;Flm1(qtgtv֢PDž(?+E.J)R5,Ǖq+Y3,-"iD#jm䙞sf"ҭ(J1K`*Z0-lH YAVN]'Ji!ҚUХ`OcC7@T%^SSTZgQ`le)BV% r(U5&FqlOx_ 7߽3-oiéYoj4KQWimCoqZXcyzm%#/yKAhٳ[Q@ D'VGC߳F4̺hjpyޔ:43-~rƉ7oN'>o<:R!i}(;%lђd5{\C͗Nl?x={pDv <=4[#1`NJEEV~ZCAr Yɡ#75Db)8cE6>u PA4/3-ZK7fPXJmZ^'/Ʒ'nnnxo'w~K2o;޶\n$((m?t$@yaKge8 㘉P1ög{ѓ5o]nhFM cf*6,~jw.æ⒚25ˇu$P*E*СMi =S(!5dCm+x"DU2Mۢ#%eLc=UWBJTK)J11Cγ)Z$>A;Ol6}:d1, ]Zk|`?b2](#o,Z)VZB:Dz?X0H,1EQ -)q[fj(.%Δv8*k(Mt4S&ZR0з gWxUxqharYqMȫbo gV3R]ü-|_iRkɋv?mw+ȓ'OH>&Yw_@TZc_"ַ(c`F]*-JUDErP(GXl&+C 31gТ͐8Ҳ ӚTzGu(+QCbHc*j:#dx0ryuͶPD#qZX@ -MӷLxDWvI)@B%^5e)?eg uX`%dPD Z`p\P)(.pMME: >#G?w}7?g<~]|K$#s|OwM{/ۡgs|,L)3eQ7'WxC e-yIN]܎F/!@qYQi^\\^u-wpxǠfG4^;roa~FCFm*ӹ45%J|"kFQdwІ5$rJ$}lģ0OXk4ڦ#,굎R*6SAez `Gr( 7QH72NXpmK߷??7;4.[6%"*+:Q,Ve+o  [ZRJV1\)J6?7G]q.$X]+ ŅeS,H+w=tr@<]`2ĜMC-qP) 0,+ȼ9Vv;ry^hjV6`]&ʣk&J׷$SJ9c`d5gi*%-)+ڜit#B. 4xBja%$;ҧ*ɀk"JڝKf '-uW(GULexgy4ܥ7xœXSbk@ZԿ+2hE:8sDRAًܲ*ʝ6C :C%dƵ-k<܏ РoP???"\ YƀIY:2/q ئsZGTU0~u^*Wİrsss93˳/:Q w2r, Æhem/8Kywi}9#_MsnYNd!_>S'ACΏ_Ost5bX}5buFQp)e(UA,ZzʞXJkԼv[BXWRhm$Sf#WurLV~NZ;x-B.\-`qΡ1-:pbb3AkOZ#*Μo:ֳr-KasAA*ܹk.LΌxG[2Ç?kwڣdk»ˮͯ<篙ɦ3#%%~q:Ogefh1M#t+*kX#DJ96A>+au}%njspVHU4]Oʁ^;3v85<}G[OGGvUPQs0bM 6|+n`ICzrvg,Cx)q4Cê-iB$#˼ǁ愝@1gVfUyeQvkZhNC\@9B8GˌʅPtAՙ~sNWgLrLo*ETcY%VʓS]:h+T VɷTiǒR*S(hum$m-EKLP5k(5DKCfYsɼ8+>GvDɅz)E1ld{a|/BӶ:K6-A9a Z*.ZW_Q}%f e 9E¼0'b,|坧4OϜ+%t^d(buEW,c>k2j|+L{..v\]] ?E14MK @6,Bb4!m[+_|o~e~__C\F_8mZYHCs';-+/3ZocHEPi+-5 J<\4|UѐqFUXS/a>uXd)!PK @BV 8K$E;ildYI姀5]bs&JIʬ*|O^c7gZ}o~|K&pf\]{tx̳]& :[]˕9ˌs$bXNq~qM!FȆf?h'!tM)@4TJ՚uEM5z2!Ue:m@U-nѺUK$FLFJAeڣV)K)Pr!xjPVXWF-y]gr*9pd}س@kK0/<[Z`p)EXB ]悴LgAUJ YCl LZIT-JuTc{j\)9#;|縸a^Poj4MM CQksFqJ qĈ5f[MOe8c,X8%$~kQ$08c7XHY+!"e,Ī8 ^:4X2׊T9Vw]K A|ƒt މݝ{0R"ޥzbBX(%|jRAOPNϩG(UXUeRKY֖9Wicƹg6q5;lxoIs8Ei˅Rhj%-K8y˻_[ǟ@8o[*7w(-C*9r. XUu$N49ED)ųh[MK-ZUˊG6n:/丠\3i!&3w\|ӿcnxk_ m'֣mjPjS]r.?g|gno<~_~˜=)UsBg5ؐ xyL:LL,k pʦ aJU+jINMr0T 5[l $Eo<)El4ZU!Te=C?H:a ʼ=bw8-+ 2V%S )ҘR4BBV)E U=J=E4Zk%T*Y:fR8'Aj9e]KA.S;sԌ7uq'z)ҲZS o Gh9C%. J57xo!1|W. {q?ruy]rEЧ@zğglhdr-;ڣ!<hw펻n'wԴ &m+u?RLaӱVU܈8i#ds=0$,B BboZOLN5*aĜiGEK |RHiiz{jUѣ,37stW{ηEe:_Lޔm?&U®x=.PM&A);e+_ԜyS3O;2͊ e:|R5REDVZYR)95Z=uEYKX)Zo:5 )E߶"H+EralƐS颤S2VNr,"+iYR<\>ǞQ5AL0TzBӑLT 47vFɾ~U*]3khfK mcdM2yka8]2-^K+ ۈ55-^IqLxk%y/k5F_Q3<ۖ3?ŧsuuв.Uv]4'_q4]?@Ӡk1.@i:osuy.7?Hi-)U"MӴ1c4~OiǜS_RQ_Y]},Ӥgf͑R5eҧ$w{#oWiXOQu $PYD6X%anIipJat΢4LPl1kNr;a-FI*5$LLG%b4bC ['"6okZ+pwɅ\2!I;8xeYi(t4#J':ĐCD֟%F PЧ҄ 5PPUSc* lxo}wHJߴ8Gy+'QUӷxxKJşwycsqv'Æp{J^YW1Ε@F u򳯊!a.7JZLI+Ej.6<?mvCGm4$f؍@]G.#8$ivyx8P)b+\dbK2pIq\TIҬ)OͅeYN}/JuBXqJ'Q df,B5g9SbZW9 ,Q5StA8ɣimR9BlfZƓܢˇ7=xC7Q@7ްMW+yyxp`z5ռc6XU(9Kak%rꞮmu[1f߰>S ؉ܝJGF1 .Ah"JM_$pE[B@'-N:v̄X9i*eƢuAðp$EQܭ"+ mZVRbA@̦#ss ³'}(Uk0-T85S( :~j&^ђfK5/o*P(F'2s,Dt 뺢qmX=M2y~? HX-ж,% >}F!D i8PJ!BZfm]@)m{^Q1埩ЦOdx?{P5|4^~gϞ!@*;S5O F:}@Ĕ@ xO4TýdJV Tm{ I@( qR$p1L]%֕끬u47iq$ToaVe eilW9WuD^=6q&. #G+YG{B 7[rwg9LCg;z%N|Lƛ Kx}nB8p0 - ?A)VyvEƙ+>sM(DzQ`Z*tSKZBp...00Yk*Juu;)dRL+?*&`6<&t^1X?!Jbi4ڀ ˈe*T$lWuΈsJ ׉g,ďRI<4m{ҲL&ZylJFdy5)v!c8k $R !#+YjmGn9;>YЭ; Gu;5*Q#Z8X,m0,ӂ:I( !%Hm!dum3)""/IóFlh)иsPAo%0z 0#rk׬oo1WUTAzTFHYWӊͺd8yEL!@b rAXS"$])*[!s88F8  q^J!5RDT9OézĦ'>xys= /< )ҷ)~s`ݜR*EӔP6 `sC1XY6#d4Js.a^s}} sYѸqN@g$ AeD|+C?Xa ]rutβj-̧4[Q䒹XoYedR _Ĺk-..VKhQ079i? 0#id,G~DzݞϽWk>VȼPPًB\5u Y@\:1̑ihsJLu$w>rƞ)NY6C\Yui_w-N1x3׌1-K+"VX!-)G"j!@)}E \T+:1mt*I5PsAhY PoDfİ?<ѧp9gflC'pZp:-i{|6e81G,5Wպa:LSanFahHNÄFҟO#D9~dj:?!ZӚt0++f?ya1ւkH!p:Ԗy8}IoFIB<-k=B\z[/R?^eqfZQgI "4Vˍ(i.jVH_r0y;jΰmL^RBjͻ3Nmc)ڠ )R*se5Fb\=t #w'aķz4/#qA*Y|*$V׵O'Ba$Fb!H)m;V >L,:%'$;+h%XDZjYe P?ߦ47*49U+ljD"*\nW뎫ݎ%%4(!\Iaf;=bT$R(Vq4*V;՛=Rz81?C$2?&XHY_6ȿMV_ӿ7X{w ?nW??:kVE_"ׄH >44!qz>}i`ϔJQdR*i'#FКLgYVW3n\+XgL]R Թ&۸qGDփ8;V21r̙q)WhYɶO) %Y*A*WoO>(U-c^ZwM|$X%"c(UBŘjN%+8l ՊNO3uBxrku]\ 1eVU=1'sڪBΓrxiiMbekP*C}k-Zk^__#Q*R(B.RIXZ n}FR5 ]B*H64qwEЬW (gNKBqb?x1XS=yR~ 4ݎa Ol7U‚֊ T[cMu*hÁ.WUg%BS\fܴn;6WϬ>uP3Հ7 %{[4@ o\KBuk U IDATU]4+iY1De$ M`G% 9$KmK"ĸp: KMK|[, /fp*Ư=<|c&>mW1~dծPgH#NVtbGlW w7/[4Z׷_ٺ^ƊnM¨),¡ ͜"$25\bmk0@ -"!mѦA˪[1 ',3z]\H@\fJr gu%l7uTB۾6R(pws_--/Vk,B%\kRAZd.(l_ A3 Q6EJFUUہhb@jY-ԏ9J9.dPDs j hO5X+۾ e"Q l>G{noIxխ͙F~'+DU9*V= 'ĂNMzԺa0j6[i7wGY1S(W"WywV?n蘉uijz,D*H-j).`ۖ\κzӦfR Y3%*qa<VTµ E@(;!fb.5sa5AluQ{!Ȫ()B'g3Rak6`ddQ8{܊RSZS@낔 cWhӐK4g~JI'r-ΪZ1ϒ"q@ģdž z@!+! JdRN"1Z Heduq(^MCtZ6\ |i 4,R]"D̅U\I#érӆD VR'E9P#^!{R~FYdɌB5B"5iNx﷜NZ9:K)[/a* z@-%S( v\4a:!'ƂZRl$j^rmiQᐓY0<P)$2K9&$NryՓuf3{86ͅ!.<+R)"E#qКZH1:IJQYsN#rT!ŷ1FSә1KB7:+vVH 3#LVPN"yݰR)yQap!ga&ʼnrf>@4R`X4%ʰ2 +Y7lJ3S ?>d*)!D]qu\5AѮj̉I"}!qsRլ da[.Kf hEtYHf#ODQŐ"InCL~3Њ=T] ]P"j/fp?dܿ-ǿ2?[/TBxPF%vy"N B4Pe"WW( 4T"@`wmE;Z  Ŵ+2- # IdP?Bnв?cȚ'TG94sk6q"oJ*ii:$g }r@<5\U"4c-"a`h3M K[uBH qTС 0ˑGZi+[wzhy !в`̱:Y2B),`IL?W0f~J5lzp3.J x8&XᲗ\>H)cYU}Kf }dd= mLP )ޣ5%˒iE6u&'Zi> 5+VjYלKA+EHu:j*-8,y<N'g!1g:g7Z!~o_PD >ݭٶ=0)̱"ZJJ&atי+0UWq)3FAۖhx8dv:pfX5&s5-d,Qhi R1 -VB$%-鬠wqy J8CW+UG %]3D qɦCcM!m$/Y Ķ/6 %Hp!\y-hRkq "i {Dmhې"BHRe"ZrQh+(E0˜ cA(~EP JZUiIH6R`'<Ԕ~XGK$qc— %JmښR m4D}ne šC~o0pOQ 33!Hi5TѦR#aJ5=TRO֖1.p;PBJAL,-n_1|gY=ӬkUGΑz~'Ӊ8t5H).Zp8]G׷Xr0b`nxAt /g4F./]ë"JAhLL3%#Tduh-P+hc}HY(B0cmVV3Mp9U _Gx 48t,F @^e-ZVQɉ:$PWY|\<;Ej 5~xqZn^Ӵ d˕خTA,@j Zj#i %Hv{Vpge-jR4d J`lC8ւL۴J-,@E8EdJFJ%\qiO'8 c]K L0GY|\)#e#kӸ(yV=T JW_qgqd9gW+&>0B(^4hgڲ#l6|)K̼xyǓ]2:Ւik,JԯӂN׋)iH֮(Hn[J,2Z9Z`\,5PyY'ӄӎժ!3'gS",%TĹ7h]= ii%{R]PצA89 \f]^Y.3 J\=_2o$g{x%gop~pZ4 L [Keߦ#j)PkcB=$(}5r{z)l7;ZZvMaN R֚$"'y_:VP6 (|O:1k˿ǻ/_%6Oy,L]KDT<`D %L^fH"XH[3Lv2?1'doTG_JO1N|k{Fs"E6Mn9M|գG<8V%vǗTΓzSJt<Ҫ '{ي^k0zⴠ!DL\bIMHeFbЭPc!gާjU`Ïn<{mq|x}knC q0R!~# oɥ'TPjr믔 F f3,+:SF)z㑛7 Z?~\KZw-H(1vA;A]}Z"mH_͚CkD*(m@ m닞 3Bzb\*vP[?S KGRN:CeGep?"m{0E֫(&B\xqXa0"-BXPjJ LSŋd ^upf\Ychap813)F.v0NG8lW9diW-,jfg8$ZHԨJ'h!TFK8ӷv62ahk$nRw)Q2m9fdj 03'~sfM:7@9=V3˸Vh*rd=@+:$d^Qrfqfts8(>fNLՂMC5 j&EƠ&fp58SK=' |Jz4fڦ+/O˻? ~گ_/~L?y]v63dIlF]3;gZ+ 2OH#QڠF}epOh_>g8 \>~D0 DZ1&и"-Kf95Ȯ8\^(Z__\KLC3L:bNpG˄ (rfTwN2ǤD)҄dbctܼ!mֿOv _&.y#n0!NkeBmO1|)3 'ϣѢp_ߡ\if_3{ Y<~mVz?Ǘܧ{0. IHQ 1E?{c> 0Lczъ9Ԧ6c%g"nOl՞ij.֚bM@ 4/ȋ FWqBLY,heƑ'y),y<~|mtdd%$RkV5K%Zǘ<5L3* pbj?چnZ31(-!hJ/g{9. jV'F"\K4-1`C8ASn,Y S͖%֌V@Q)1">gJZYXNȋ{+ :~泬v5!L60L0ȺiٴL GrFit]Dr{BSa 3ڭp";X (1J5ch+2j|7fD-mk! rxcfAx zTog#+z RsmtPeIYoEZ6֢Ts`G\a$IYo!ܱ^g M> ¼bFنXˉC$ ؊8-q T6G2\ж%IIk懙qF*0,<4d?3^=@)'P4ۍ&ł(YV)"J)E"344fռ,q i i:=ҥC>q I;CJ|nЦqJ2NDf8Vj|2o>٠xX2!#a\2ęZE]cDNZנs˫G=iYr(ئe+ ()9N&uyHAαZFv-! x2S@Vl eAiQ|@Bc$Ș3dN[Z- ̄e$bj(Np|u:LU} ǚj4-߄ J&Bh% R((2BGV.q#HO'vEo-2Ml6Ux:w7W3-u (h瘞nw~_PC4߿/^~_oM]V);7_zK?=ϑy"{?>uՒOJP";5#qXZЭ6H!8I>A긊ñ.sFoKĕLDPXmJ1OiOd΂i92cM}`aH:f2+J.6#'[)arWbF*GNѡ&Sp7?(/"W?>Y={GQ8gkgc0V=5t+|™cR;"H8{L2lxe_WUO $bR29'nIñ IDAT!&X Q0P1" ;_zlw̳;,cKHr*w}B4VZж=1V < il]ƍJK+%[| '@Zr -0tVG1n;bA$R 5nUgl@tȴ%4.$R*!H'+#Yp!j3Y(lGK gL#!PQ9D)Bb u=0W֏x$̉պ#ks4S O~ 2{{H)(TXm[WEӧyrJqJJdHbpXNV*]LT !FH(ι;E樯<1}'aB'fF1H H:.'h06BN%al#x{+朹Ls!uф!3(Ä"Dk51&lאr(U4Q_V<[ {^Ew-'oӧ.l*GֆpJ+hzãUQD5?gu9-@d}%EA "-sC4Jrdݐm Aq3V'LbA.PLC}BΒJ1!bǙ"4Y*Te i!$8qOLvLXj4 LDprB78b ^`U0\yX$1mOc_wW'4Տ)?xo-w?!&? _fߢi&o5JD7서 B"D"кň*4+ɫzZy&-Bku Xo֔"8FQK(1UƈT(kP'ޏ۶ĔQD@hg&͈<2:hD|~2\ ?5ntf(YKY=~"%:BYBcR xhc!Ѭ;G+ Cd 0O_^;[M˳ <1x+,g&Dy//[_"3ά$w m!'Ϟ, MFB \P*L8)Em`Lئc"8)!EןqڪӅ"Ák0509Ծ/pnFKɉqG<69DTΕK;ɀ,36UêՂӓ#O"pc}r(2ݲ,Bz5f+B`y+ kn___9t`1"˸=pJR! %zqfG5yH" TCbf +O Bqy5j-2JmL ‹(@BXlzb&ǜ XA\&Ҵg`m,6G6/!ፍՂ[nϘPx2ӕJDm,"n?h-dsC^ Mk*m9&ʝ%kQƑ֒F+d\U;!!FJ}+ .2 bLcwmQR#TM)) ty$#jBrEKH9~k3;Z%|1>oНLr)*m *;vu,ж-EK#x80_\~(hLK##4E`j2\0JZm)h}dw;`d%RjH4-B$ LΡ_mSՔ+T )jMUe -D5jS3RΎhڞ~ r5gI$TrRe[K׵L.`f-ݞrI40(%CI tVF% rL-mQZ0 FszrLo[Hhcp;Gv2 dQJP(#S!Ziu8z`3Vk/%V%H06ddY:FөzeyꦆKхOhSM͇0@ \ravg?x9ߴ4%MYpje*=#W[,s9n4:  m[kYsh6D |,"%n1 ~2\H|y_YKR&u%d. & !{ȴmCkU>Z[̢myyuMK@! v4ײ@&;,Z BwAz,hcB%',FwU⫊k w}J}m~뙯0M_dwL{vF$*Ld DgdUP2W~Ylxn?s?Gc-oKP  eB&L"ezjQ\@J3L.yst"+mM*LJ.Sl^7MK qEʌs,Hf$ǜçޟ` K _~{ 2 K 9xvC$RG'=o-CMh >!uJ4D^b̔ AkڅP)E`Z\ۡrUj!V.KSHH H %5Pm~/K3 IJ)rf`A|(vl[|xa,Jj֕Fs\")ET A>E6^fNVWaedThkq!quGA'5D*Eu5WQXQ_RK!ru 7@vP؇a"f@Bc4AGkSB) a4-Tɔ˫jb-q6q9=}W9\ IQW H) Hibn%3r"9 H(Zo?%ɺ(-)ła>y2D_?ˇ>;o(Y98 !`JB/Zd#!dIBi*v$7#MX؊z򗹠 ]JJ*%QƐJ=K*7jM9T!;OJt~ c{n>:ìѝH:>/ R5+IvK[kEڪ2޲srri|eT}OW7]]d.:;_O~9\xs!G7OX nOkfg_ 8G^eTx>v s}^~&¹Z,aǴ捣Ko_K=?'ט(޶$إ1PSBRև6TNa[Mc vm];Jm*V`G `[ Q2{RP47mj`ye92PXHALV[5XTS%+&MDcٱn,{9aӎ'RdR`>X-40 iB,+]2_w7TիZ">\/`% IragR( P9ࢨ`;s4f\;xrsGOX 7֒uW67=O$>P[xC&K^ic1"UFHAWTA?& 1|DDjey٢`;ꖔ3DFwD%+Y}"].,}oj{Nr$PU0WF,ԌV)HDF)E%cB \!e L c+j;X ͒bb?DP%[esTZzi8ĀO_Q3RMBf)9aȌ,37OXRU6=2g.8BδRoSRɂ'&(]ɾGjPWB3*M$BHo\H VPdp=}ŀ_=ci;pr=]цa5EB_9d P!%}񔶱qa^mH=F}Er~q-!) 7|.|̸o?oώx麎'Opss,O _È2ar|ݏ͟YBI ,BJJ+dXD '0EՉ[% ԗ %A.Kh)E=ei`FJm:[9i zCj r8` )T0%W/ӄ{yK6'Hcի|?ђ|ضo}ug}i]Iiy>|٪*js]d{ޱY9۬X-KW5"Ju7dxsv,-8iduzRxbB+BX/O KDY.A$>]OZ!Ȕ*~2J!)"\‡@igE͎됱[.$pޑsI%)'UƔRiV B֠nP)A;H%hmi=9ZkGtsAZ&ထՐ=19~eZ;Caa]Lx 4!Z2"@3ik&DJ.\.0q $a LsRlo"VlR0l,d$PET c]o1"FˋmƇ,dq{;/MDvWٗ3V& yAQh- <#.M8Қ $f/> XA۶Lst%4"KFDfƚ3+y )дV\&z3RbBVv(O9hD$%pEFZ܉"K%c$Y1Ξ0cR\]M쪪'yO/II2 iʄ(R͢a*+l*414n8KT'j,[UE\ 9kh؂a-E--5s3E,TacbQm;0,5ƶ5J HiZ&?sp FU@ʹBB\I!3X#٬{|_#d]$%;̨,8L#xK0TYtɱ\C TiNw3.wqtȎoV-&3iQ"s~#*QpMGwe,n_|Ϳ3R wAj:M拟HVwߣ뺺? ?}_5_C{''hZ4s}:)RQ]]PES}B;i'4J] !! BkA 7&C2:"đywKN~`e-;mWl/_G_ci Op}ż"]?'^_ohk^?O>ޟr'ykќlOit<|ŚW}ϯxq0Obŋ ͊s-SHخG#| 7hmF|O}fw6,+EN9:96 "KQ?eqD NOO:dN)"G6-mcF(s3}a)TJ͢v Hi)P"ݶ-bDXSWb, - aemچdT =a?`;m5#S[Apѷ ̬K?80O4DXrp)2M#irQMO."sf8hgRPǛ#|`ڇ*`y}y5-mpCDNN+.#`}'IQf.UQ!TLҳ\${F9iZl:DɩopְX6ضAׁ7m̯[{8[XY!t\!:0\2պ@ AHmwRm.UĜs6 >9lVJ֐C](CFPی6퉥09 j0Jɴ&"XI}@UQMiԝO0#FHI$gVKr)\] HBR!I r'n1q8̩KVCEM HJwrfc1wJWp!!DhS`rsP@ X8ZB)T>6kQF@?b`:AJvzvafBZD0#baq WO=V{"@g, چ~dw$H]2:BhcEO.Z"W7ȩ⸷[,+EbJE܀>2͉[#rODI8 ̀5wH)cnZs$|~HEsOrsyt]LJ~<iGǏcog^=G)-Z62233U`7:c%ɯ/7K ~`&ڮaliSobƁ7M;I GxȻ ǿo|ӉKKϮ;6<˫]@!iT s$@hbPTF*)2ksiW-" 40JRi p,(X/F5۽}+s׸$ 1XSE!e@ ?$2)B1VP+Ac3B<\KE5M8A̰kvɣ%k%#K%ɴ,YIM-sB!"ւS[c9qj ^饠|gJȖI9D0W鱑+p Fs{q!Wmd ]HvDW8R;CsakJ)8(*w}du﹈5_0N>Ɖ2ݎo8:HK 6iՂղe,0\X{RtP>s, Pt#2Hȩt^\ m- E5MK!5ڶGH#|xKx_#MM~|>Rq@iijW])Ƣ?p{r\>c>Cc?|[?ۧ?7;u39lc~3F}1[a݋K5)rC*<V'WXq|zFvnkN[f솙˗8(U\Ebm5NMR4R+nnySi8{-MGniLda{{O"}_z/Wt ? ~.{XoM J1$0s~l2u(qI4l_8^|ٯ*_CH=U1oɋ/nnOl}aس{yA߬y)ZK>)RvoQ폦J4 k/24nYXFU$mӳ^VR)VKVpf"2\o so)s5$BBM."0QTTpϐ,{( tG6 M-ZVQ5Qyk֕hVܜѬ֔$̲_/7k^$n4@iRm"Dm4=nxo?|_ ;˗\_]-VEGi x@g큜3)>_OHM>prVa)(jI;̌rr?`?HmzCw"8DHXA_IZ5@k 'KQ-_W89^S Ĭ\&r8;z " )w%ܰNM|x9?/z}=y (KPAeFZhD ).bfj>vH mOP EX-.1GލҒhe8ڬ&L&H@$%ՊLcபK5T-:6HRݹe$傲5ī"/s Z+iFn"EA'5QKR,Z(x E`BdGxV2ljX+黶ws D0P $Og 1c3-Lx!Brr٠e!b'uma &,f?9 BdDYXIcboFF) +Q 3 v`1|a8XQyc\`2H)Pd&L/Ѱh[8lJbm-)CϪ Zrq&3G#t-8 mݙgDw!aggP+\(T4h]Op|LI`$A.nonQRcZ FiYPRdm")J#Tru\34fi ԇSiGZ\ JY 8זJ '|,0;fW;rplD7+0<9ryL`^bk<H.#B6,1oP իKcpɓKGkH%Rv5|均yWdX)XZ6A5;ްYX&?qxv80 Z#IJs%M˱VVe#18w؅ta;`W ,q ꚹVKKboc-#GZ5] ƑL48ӱ-rl֕4 XRΈ\@EGڮR+.vcHC a$ k`%-r({tW_|C8:>kI80vFsFtDɅvm٣hQ@3Ȕ"Xv-q:@D (k9 DvXS*D4>"7$*4QfM5pZpEϟ~tZAg`srǟ8\ɯ'~ŋV5woi+X7o~]'|_q~oO>yP89|rD*:$k9a\IB.C0dRt}f$!g H!H,(}88S4(i VlKMD* 6HYLT{" C iZe߃<&'r]wfdZ "Ouv?1&۲"i؛,ٶucE֧A,̰ 5Lj9]7,ZVQŭɓծV9K7fB]ND;ךo Zlt\m0 !0b!$ArpCLCE}+1H!Y&2ZUs)b1&bJ%VFp%#NyuaT %_J*Jd%"tCI2p d]svE"6J9?Cl XSp)'i㴰{i*d'r4M<9c`Gde_ssmn;ecp c) " ]8_RUHiXo6`f2Hmp: Uòе ZBֶBZF隺ݲas2ad^C $Ok \Dzmא3w3:?cG0 ˂3X&M0aHG-Ib(pLͼ8N=˼PWkz|ڡgT ,\T>qTU 7(c=D"St)fbg;0A VrG13 \mB9vh1 u/Ft˦ݚoYݗ7#9=WJVK^T7Uu(aޱ`ZCaꋯdDE7_}SnqIrX:[͞R3!x\\qvi*\]\^I]7m<. `8N ~̓{ %J+ָű,a("I\KgHm!OO{4FNljy ,ܺSVM0DD TɜXN=iqt"g_tiUE6أb}~-ѸGFYPZ=s{M~D2-4mYGkCO s he8}&gAπDm,JJRN()PJwRTy ]fc?1΁ՆOO'3%2Iac $&݂ˁSȌ3.'efJG+A]eY5' )n,>+,)O *֍a3]2zHbP˄2G/0G^^9H M%i*")8ж4$Q#AG8"57K -HM)E@f{i8}k!cb*B^Q5+0;t TRCyquƻku.SLm5Zug$x8He'IAEtR{:ږH"Ȳ$>=?%zR=_4ᎳKu%)r7Ox8>x|ܓG?JMɴF2GvnY+rXx8|"8sx`g6u ~:0e47 k3$kZtl$+htʎO<ǻSnHidÎ~3>^sᡮjtք@jfTfyyƦk0F_<*!yqyK%<$ Tư1ך@%6Bk#JYRq nfR,#O=)ex\Qdq7Imθc28㎛|2eЃl$Aմ\}M%d&k7 ER AɃ[VY msQR3mw}?'FCfkRR<fi)k>H ={u4Rx+>OO/;3J Hg_=py+t|8KSk OYK@Jf wQJbzrڮ.mϸ{˩'byBH.&Ҝ_l0*LG"͖,qDx> sB՚vFKȂw8=gތk[(β)2U6J1,iXb JCYMZeضqik5MFg!qFekj(8'qaaD2}A@6dwĐpBr %f7#뭤 ѥn8 , >XFcDWH n4ΐR9X$hj|8GIBu=H39D|$pF$` '8jU+iVd!*fضV$!h6pQ2'"Ukm1\%E11fFt!!evxy)B*nuFjhk[xR 6Ңmb(ӄK,ǩ4ƙ@ΉU !8O6HW5H93,>Ɓ?H)1=L]5)pswcvc$9YF0੔bs2DTxA 7.cflR7-$}`1ljć{/KC$Ff瘟!`s -vdǂ5[w,!|"ˊ`=u1KBv1$FFGSW5zsnjad#mWp_lhSq{BM1X#s8ȡz~[㎳be5*&2( uYN{<#nHZ]8Oȸ%IHL]a51&q .ejzEq\B0O ~.4Y(rL0zv4NL^0 Qۇ2M(JVJI?X]S:9>fn6\^ݜ#i#8<B/_JwgFjGg*iY ,; Y4`m2%xu+Y慔 \ed{y#LE>gs~ǁ?t?!qn7RIEnՙ_NVoOY7[bz;1>y~[(f2&qAAւ7MӞ%gD잎|-Amq]fg s<_S[5MM-)dd*@ɀERiJ'.k09lm01s JuN^TFZI]!JbHAGB]DsCiS)#n,WoP鲊ZYtxNᖉ)-nՕ0pڟxUoDwMȬkm9 LZf"6##gg{; |O.6TJҚ~OnVmiqDYD4ϼ+\\9"zDT2xm(Y, DV5[7LSO82 Ǣ8ny IDAT9;u4/5㢙阒 &iqY n^sѼ:S\-ZD)hn*pm*Ze;\6Ui+e9j4Hi/^\Z Ufs Ćyؑₔ-2~\ AĬ޷^q8LZ‹ͦ^.'5X "f<#u{mNMJӁU#YٜmnM Q[%U&I%쫥F L%jl+.|[ʤ,!E$,<ƴ-&s{gDLcؖ)L1x\0rĤTVy.`jKhjSDbBDON#) 65>%ej4 {M`kʫA+0Q@m$20mKӑͺG?{NK"YS!x)yp,|UJ4J`&ƈs)!gq3)f0f8pnQ26 J"jW5S.[$˲H1T+H6ȪCꊄ^T-Zk5_\Eɒ,=wJQ5ue)#2H!1|*S kN!!&8Bꚤ>oʭ@̙'0A{"`Mf]lAd J`s3RdbíKpȘQh@CX0yB~rACGJ%LU?Ld}Q-AK$ZЩx^bP,@X]"$`a}uY rM=ǧg25Z*wFV3ÑfKc4BGV扺0 1F0FjVD7d@ZtmG56E ![dP4-6lNSO۬yu?sFWX94~_t_iH Dž_7'{D0>Aݧ<G'W"5GQfuu#\Á#g߾3qi9Lӂ̑%*T,w$ƒ" Ucqܒq" º@4y'|=MY0#f9 qVdKq1!dxqrS[{ET-83 #:[r9_t֔pfr1ضԊO]GjJ g&H\p\Toa P1))voxfI֐c$nİ{k,ִma\<(2@݌K*i\bT`G2UBp<,!" / 3`U3Ӊ^YUehזWiIw<:luuPaPYsӴ|xOGFz{8)IWc͋Kr ~[o8k*afGG5Y2q}y0Y #R(!6 xBBX{%h+ba@w }8RH$ air@j-ٮ*4B&46+HmeXD9t0ӼG[ö5,D0@Fp~1%o! K$kj| hQ@e*9 %u9_RV&9ar8z|3)GVMixH\BeδVSiAJ葸3-A+ Ey!dp*֭HI- 89$+8/1h<8z ]w p`dAk[ƳB`L9is#mT rte8,!sZ2PDXX%ں+7iؖOl)%JM(r"2 BH)"BJP~9e29*aLE8١LZDJx}}MBS%Qӌe܌ )vp0 emI^/hJ1H,C`qh ѭVZYi҈,@G=.mk1Z,fZ"j;^2,QB c}~u-Bd"{՚K.)VﱶnRHHI/hWWvSi$P4]kjT &@%V9O_.Yvy;o7ŏް{xkNGkw?S.˿ 7)7o??#~9:y, /̯//nWO8͞;ۯ!;'_sZv=M&&X  2onv>b]Y80t"R|2H<|嶦<0cUYA!dڂVÙc Y<'/JF_lv/~Λ5o^nykkPiw﹕!bI"yEٮb,T.;Vm%dlQZ0ᅠ ڦbᄍ bm,5خ;p~]aЏ fdYqu}ȑ~ Y .LVH R^hkpD&1c'ȑ%0MDe3NM86lALv5cd9ro^'o8_a_|Fͧ Yט*{?clղ?|y@FGNsuuI(Ӟ32cik{>0<ǻnJ\n$نo||549r~ Ql]"rH2a傰!J'-ay:-\(}(b9p -%F`CkKe$UӠ]?q.DNgp X̦FR w~&N)Lj4HZ` w^rۻRO>ךO'^~o jd]MٟWo@WhxyeVѲa&ktʼn+6:CHhsN I5-Rʐ&_HB<-_L?M7LlKDT@e;egd8p:Q5-MH:3CBf7cB TM#xtiϪJO5Ͽ>\뎛bmTֽUӒXH /oy8?yym152'Hkj2' O9"py5UDiZxd(jCY?xsf3#hel[gH6HXCPS_]\)cHS …ٶ% A۶$|`N1b OJOO$$JC,T,*JZt3._n?yǧ;MǦgf?S%('O\m zaŇl1ZQ+1" #\ZPI,H! 9s&/LJ)x84s>Y刑IkǙqaUKuU.' qL!(_2J$>RcI`9&r$*nbȥm[.sb88L% C,a 4#q%A #gzE䌤uLq:슏JCt3tB[6,n b 4EjHYSՉGBQ&Dּ~]Sg/D$SK8bz*"1*j#ɾxڳ۟y|ܳl"LHIΞki[5Taӎ_1~R+~W?j?te#chY~&Za7LbFJtve1fB 6U%IZsuwNOOkİ9[ 並dU<<]Џs?tX׊JNnYu[oZ.gqqV]IغGo~1W/ܾGheCL?@6-(nMJUq&&g2H`ME~&i)x2mZʋ2X,ԪB2FB-GN1'82P^iDjPUs $u+YS(]T j2Lӈšd/P9k/ mc6_dj0kѴ Z>row훗l;ڋ>éw jU%4ԲB I%32#o=Dž?F|o[}_?`]C< ϲX _}g͆K.*m)kD엀g^cЧ=0&DFK09E$"u.8] !fSpq5J$8-aIiRǡgH0Ԙ#@Ikf p Glݐ+ ] uӲZ]n//oij3{Lm<>0rqqFhlki򒷊D-cQ(qAPY4<<0uWm˺k1EHM EHvūfu`Y@?LZcS S[t-QRP)-)2U _p_~g| [TR*YY`YT5UUZu,iwOpbF Wo^2q#V7ܿág=Cj5g|'H֔_"ܓEiD*{t:rfH"pT5QL#ŒȑdmY2ΕR P!#1!E.qc nyssOTWg|Be&GE 9'fƇV'gHi7aBhxdJ1qOPL""S-4}{o&ɲ4M9r'4I񪮙;e[H g BX[aRœpz١nBT32#=yh%0fD؁R!w~hf0bW&%Jg̯0$C04O-t=FEapyY19v4Y]&#c\LŌӡ6ChCb#> )}|:,Gʑ*#[LS dmVd!Mlduk3vNu-8\3f9Ǯg |li|F$ /?<"F-C^MT<>`u ] dL$J)OзUH| UoO=~u !=9\b@HSZ#3Ei aQA(@5[Poxug<]ad\SscβrYI6ilaxottbU %zӡwOdQ܉TuAVM1{jia4!4SS Y]b4x&9<F41Rg1 -)A44(~ݴ $b"zlt6*u(0:#3LI&`T<#oO= n%W,Ai08Ϧd(X-G9!fDk) dBF 2!)hY 2`~j"KG+**ljiQAHe$a #)G'V&E īQN 0JDȬ(ȲS7LO aA /rPh=ݖi$7E}FnWq|, }1Dʲbu( D >+#/7) h`-! 겜BŚ?OWlrħ3%İ#(bRt8gדM@]ΖȳŤW| D ]T}(J fNDlĎŌ{?a[J=wArI-FO/j%kv_Q8/fcg׈qrx|OVtsiľ+?yscXGV9ւz1YsubMYdtG62e=-I7X̄&S*X!U(s F!Di261ys'n_3[̗ xϨ4a'ߖ49nC *~A"@=Ȥ&4woLC0&'W6̖KP4M,|CJ|ɤB #$ѷ{$޾9O7|-"jriptY59YX5ˋ9&7lN咐oQ }D0s_nwN3W5T20JIq{t}BA: dqR p౳\"q0˗ך_z| IDATQ!\f=gghaܣpI͂ fnp 'O_/ 4d ae@R{p)bTHɃDGA~p,B$Uۑh=C]Dap{yػVk2n-(pE448m1x2$tF^BN0 / ErH%ُmoq)aHEEYE̓Aۏw{2B`FP9V^m{:9&}BEK'_]sqA!Ed.Ao0JF%HBP*IDL \0+3԰;.yFQJLc8@8l-:+0:YEOukYۧ=}ҝz6eȲH]pɏG'D 6衜5_>ˋ9uP)d }@K!0GGQ(?d>Cw??=Sb6?hfgG -C{bZʪc.n^͛wܾ{jgs'u 4AHpђB 3S-*LVO ;׍G*Pap?v (c&jDg8 cwo!LTS@ߵ JKL1yw IÏ7:bd:GB@G!p0% )u@4r2MH *ȦTHCTvB!d3y-)Do{F!, mJN'~=B*>yPp:=o޽_ۿflxx:2ڒE/K:+O\Hn38kgs.yxw %?ǎ`u^3-cyvETY0Fxb@D9u,޳k[S흩,UY-!Ʊ:[^?47/*B (sv 'f7ǟH?i4uCS7HPYhM)I!b# ۢat6(eH$Lh!&$*wJJ ne>\,(V5! uQ9u]M)`48 yZ ??cR2r '躁ed*Kr-h,؝NJ@h[~=\)bs}1~d.41Ź4oo RO;~'|X/g<=m)5ECWW 'rH1=\ZUH%RU|Yì:?yý?E_}9/.*Ϊ38@vT/+$*t.AYï|;YՆ&)s\Ki'`-BK߿@U.QŌ"؟QJfUrVbWgHw` t ؒS{L9g M5]׵9uh7򂲉<뎯K>z {w f5uYѝ6%F/{<y` g45݆ԳZHC6(ywEkkOV+>a} ,qsd^^\gqɲGTB%,id y/^ŧ,]<^4/cgvq d̊I/X@S椘8z3X6o3H;BPjKf|6pįG Ei # xx#Hg\(H'6'ʰ,*\1n<=(<ՒF|Q.%WbU+Tfxص#㖻vHxI;NGO->LBàTdL1J2yF=˹{_E|7wljf4%9sEh<0ɣl1l;~ʼn=:|HM(y8x6ݞhs4)Z<2f%/nj۞u#qOe#)'% &x Ԣ|^uq#)Dc Џ^~vˋ%?aՎݱ=8Frв8Ibh-p2,#˜yB`ݲ;&9ltGKUTeF=Jd TeLRjTebBkVv?mɊ_}5%yB^PD$R ϬY4lO? lFrb)(E5ȣIQ79hx쒲vNHsѵRd͂9b8xn'h*BOΡ5RL۟&SzT2T IDIij)9KnPē&+gF"jxct HR13_pޣ2|bqӶ{nՔQAUH$$vXQ("G?+7{t1$Պv% /r*q؍{; 5ƌ\?pVwl'ʊcq8<}Ϸ߾g|pbw_=?lt`^V a?$^QSDHCUר#cD Ag: ID%J$"<:Q92y9J3]HJ\O!E0ܝ,߼fm807l^okƞq%F *G%WϹz0m$S"+q#~"B *}'8u$})&HM_<֍hI$ӡCDE>B4 Ф!B*J,Q)%BiTQ"0UUQDFrj[!̧񨨧piDb>8|j8aX;N̓gl:|Ղ/2R9dthF Rӎ\MSً @L27wJdY)$h]2m?p:ZR Bh\rd:cUC \nĪMFpdu\\\Le4,.8zf^0{u:JrF9E` leA!EhiLsx H(+p{؜z:yFwl9eq<ǎ,(%52x4Tta޼xt\^Y,2yY݉,xxܱyA#˳(1!lBHYvO=I>uF<}"8V"H&`L`wV<Ȳʔl6{dYNߎ]G,9u{hۑrL̚68;j6$̠Tɂ׉(ꜪTiMTf$ǣdKn~JFBGvKLNL)X/^ɟk_޼!hf<0,K.L)RȻewt\/fB0U81L4d#0wCҴ1jϿZ0/g|''P<rx^,LN볒>^ry@rtH=,A݇y$ĄHy^ AHbMUG%I!'ȑ2& |vN{{ב.(^\(.43ԓ z(L09E;H 2/Qe=0RbRo PʌՂj2|@Re8; EDcLO!2(Dut`ᬝ9*Kb5ckLh&(⇕VqQgD$IwN#Ӏu"&A.uS yAVQ|ȈԞ$E sd>k>pO MSS < A*a fQFcԍ, " q&;RIRhX7  Jx9+Y, s_oT)+MKf zdٔ T/j\ͻ#GOdL6YI(x윗ϯ1vߡBFmOp)jr'_g^G*//rď`t3$.-?ER"#!PFmOFU% k..Y%i 4iT2EhI~B#@gDÈmKβ}Wwܿߒ)A95y$_8˩߉aaOǎ<~GVUlKxo  Zg Tp9j12luq(a^2Ȣ`~zľu<5@~!otLQ/%qeA&Ղ_maGdfVR&4$nhN sT73*!9\"'+. ё;cbٰW> A· IDATA l݈#᱋ܝus=ӼXh:&,2:fTjEFF#݉n1ʠh(ji+CъᎃoR&*1PgPLY\HC'YN(+Do<g/$/nZ^>{%Js>c| ,xW^h)xqsMCcص|0,@<\]_Y@!ƍ=-;k;4wdL `|BҝN JhY.b~vjRcmk'v JТFD" ijFpv«K᧩U STĔȲУFn H]qpqj[ܘhۑyrK.) ~tdt;(gN,s^-elYMrA# b9Ï/1f Q(X]=q^V/:=ǡAȉ>175$A%f -'\ @U6!F-;~+~@Ȅj47_}V cȨbb$5 )?v޲ {= ɉ(w -dX_쪄$숳#։f%լ(ƍևv~Df9W}D\1:&H)C)hZLA0=b<@PYMWh3( /h'޿cov_⣏tWDd<}n?]Jf6R>cu9.xJADi=oꂪac_ndj8; e0ʐJn7pB)I)$.Y9 )";ځڀG\?Nk1~$ݑHL=YFO<D֚k{)7k#=wjC ̉;#IdKCI4֪U ttB|Tes׵=1!|f4| o:zS$8w& zyNVwhNh(Ҳh*42A[HrT R[p|ˍl " ֋E??(>g8\+-?4?'0SDւlTLjG,w'&eXʙ,0Plv!e"pZy>6Gg D8*!ЍAA7=>j\.||}3.))F*㐦Ru#DѲ?1MiQYsfY#+G}as}[-Ƒpi|-Lߝfp$Q‡HZEBLwPB̊ZPRY4'wJϞ"c?"`?H7+deHCa/j. s"*E1\$r-YƙqFv;_IJ5 ZDfԻfCw"zrD0ֈ>@=lb$M 3N@";T 8@:Tm'4qw #R6!"9kD,] MH'fNjȋL,IҺL{(p8ESQLsO{z!L8%QF\NQZQ5 ?LÛDD"I92h.KU(劢VfJrJ|!'P0EFIA+$T #237RHU!P$RdA#rFC8lĞjQ&63FCENaҟiu*V}<U(1XS!E-e)!е!ᣤ#Sj񄱣jjQR!=_q~}-aQ$ T3uȦ!jvp?1Qq$`hجZj0B"LJkAJ ԋ1g"~8Zb@RSx_bqG)h,ho&.49QDGƮc&@,..VKВ؍G^zCTFGOX=|Dj{O{|El($,U jxw{n/|,*p"Ɓ2yxk3JV }1+qYk|ȟz Q5HI΂(#3k0`3$YD:kq! hwr*e'DK3ʅ40)e(؞"T{&30- xg"_|id.7/^GIZpϔ *rn]ʑ͊B]7;A҆;1L_Rf >Oܽ;qQk8Ӥ 櫗;l*C[0drJ_\ H99D)E B,NcšBb4=+BIt5MC0u3EDk1q?qLJ 8( \lV(5Z/RݿE!c5:C(3VY3!$ pHn0rN>L8˭'Ȳ/ 6 ͧ ^=ЏX&!_Tx ‘W{Ϧ5|77|vb{ Rj CkM ?٢-ibws2$On.XT5w[S:rq= gYH!ԂB*$J HF8/~ٜL&>8yrqR Fb@DQv $M.8,YF2vnt#2" b1bdT ?|'LݧdX4/>{ GBY $PN(a@g m#pņO>{[t{)CC72M/c=6!\[kɋU{nG3eWɈՂ']P-YT͂ip״EH!&y(in b!nl6OfB3BGam=?H@gk,ZDUH Z`"9Q229aj<}) 8z,ݜq"ޟX,` 8pGCFFF)4ͣ<^!~E+EZ?65SH% pa41yxguJ!z <&T" U EDۊw_zyAm4jZnxOoI!Oshs̰=%9pw  a4!DY|{8D-Q;bzUC7rS>r =`yim4\<\a,b<%*,ږ~LO)KH# HEzr;} ӉW=ʰYhFTKz?SRQ)Ǭ*W G (b ))Ҳ]3,_SlhMc?~-4Ҍe~8c+&'0i)3IC3ŒM">E/gv,K}`=Jj+i*إOψ v7T%65c ªe1oѓK͚nwLo޳j-j0틁J TBpk&ǯ~$5Q%y!8w{,%\\IΖh :?r~?MvE"%}431lV vK 6/ > 'Qk_o21}Gmkljא%]o[;OV_'k,JBJ:%An(gM*,xK4jVv~/_|1Hwn$Mʵ ZS 4Oސh>sP "S]P"3ŀzyL!u8;n[(hd Bjd )$y%$@C8"_(R"ƺ9u)S%`Ҳ$B3:Yjd5ҹ$"%b(-RPc!NGdQ!)0⧀3A~X W,/Z>~_GO8ko|Q z(Åy姌4EQ+\H8mܾUY_^  c Kųjh>U?VjDIt>pE%5:'Bbyf)VgZM@h'^ӈT #hّh~+5>)g!{( ̗y=7Wkӌc]JE=i`wwxv^4]8XjXVD$䓧캙;V8#W=0< s3 eng~J8=#]{$-^)|ɼ3Fx;T `&ӉfsevsV)(,j) JBJP a g՚aLУkś/@$ʰ^b࠴ħHB=@ߟ!Q/H!HF#"OO3Y*ać9E9bm}2BڊigHѶ=9gqHm%M=O %4^lAYm ϔ !2Ƒ) K*ۢADIӜ%e>Ĉ3 Q;킺R)\!D]#LM&r>R|rl=%YB)E ԋ^-a CȊR$;~w`X?/+1VCԄ9 #!R0(iQU0J%˶B)Ek, ]LIO8Q9uFUØBd.1HҔ82%C\qu!$c "sh/~9;g})f{r&a7RNT!Ac5IA AV 3h3rV8yq⫯lB.T(9SdDғ9iWk՚نG) lH>qxIi.?zn*Jq$&FH GNH1Kweʼi\<%D||%_ .{'O@7x!!PR b4 C~(x1ZcDDʑMkjZCf)+R@(*]8mgy@!i\25,-Z 8p I%τY,1ɹ= 6Ō0͢Ÿ0EA Pi+0j)"DDEi^X0DJ 7#؏lVkGZpVc4 ˊ- 1F9J5=8p8Qn;=&`2Cebɧ=wӟQ/VT{sv~9ZKˆnQE0|CJň2f$nnϲ6(eXd51^˖egzݘv̓(TtÈ("d@Ϡ =;[$n6.TeU{4vNc;1w[6/F||a4j`f+xJN<9k؞|a=Қ%DD#a2:W@UG ?-DD|y3DU# NYC]c ޳DYa,"P()*..p3n#_zA D]!Dd'AZ-R=`*\R@Cn)dό)CW(=)*i!1d!h js𶎆bUᇅ )n*PLbWh<"5q$4ͨZ!/ht'(R`jKq&h N3aR*TOu x<2WMI֒ys{Q^A+˿[+?W/x{~o<7JÀ7X5_C9xrs Xq]@HyvQEMF-k[PV%HMb@%8̞j;KH\kHAdH]UBK ,1&n͇e]R%DW}w?}ͯnoIQ*̣$PjERFۏⱑxH ~,LX4X)4AH J)pG6|t͏4|(uÉ9R d~ #ɺRdԌ〔Ԥ9N* g뚦$+ s~!ąD7,eT*!_'ҒmR jݰ&>v97G4tHeA4*4f8mRg\]r!Kl +@HHixwV%gvgv[@ &b DO>ǮDmHB@Cۮ[j8 DL` [(&?ʹm2P pː)`D^n8~2Smk_m*LQ&Wm"MñޮmCϛwPOs)uS@$t|`<GN_0v=J:02 >$٣T tL)׏)Es!ȃP UHJ cd'#]jO' BJ~1HX[`}2"u $ؚX 鼶΁_"]X7'~/?^@7qOz >?=n8ݞ~FU K͖jnw쮞}S"K\h-zKVEAQ5(]m4EUoZ2=aM+l1DKtQFKAS%cB#/(;Oa ҖiTXNCkFQynm%I۬e.eR|.$!ixw |/YcMEiYkiKf|{2y59_|bpSH723ǂwЖ#"UiIÑwG&b QPm)麁iYѱ^ՠ n&)1?}΋';_=V|'n#~P~_rBժ Ԝ'>xXזu¹?ˌa 3mZe?K BSkvqs~O 1!$)k2r;T[R Q2ni"823,Q ^>fSÚ@S+636 M¨,)16%F[ k)AVB|f$Y$K%4$]TQ8B !R7 %lU]nK ]-ݔr/.ۊvSSOǏ|xK?^|<q9t{φ^p< }xF.%RBFQH %< z%PE`."())5ukQ qgSnW@ -(']n6yc2a0p7G4Ybw=@(2Tҍag ¹ED Iɇ͎ti[v>ݰ i՗ ]uKQ- UTئ؜!m:ThS u`"Hq@e5u=F 5QDGުG)L#N=V[6[&T ;r[/=4O=Bu̇:ӔH7(a!LJG_Hfز]54yJjY(8oIc LK~;Gna2܊K]dʫ0DD4e9ժfi؝i*IU$R[sgeYPhXjۖ5ucJ F$57wn:3p)KSRJCc ͺȻ#3ðw+ں)$2A!"L nK4HPqT)ˊ8L7E&sL!FJXRB" AYkĘ\RJbEp"m,]j e?{>v7gnYD ֌~;_,>WELq|qs}RDlKZ~qgc#𳃐PB@&VhS 3P ͆i%ed pAk~|˼$Y0,>Nh '0e $=Q ?ptvWZI^^h#clHЏLSX)Bd/5(#gMEuf ̇4g79 xx蘇˗OY%A$P]8&4|'$Efzs1 4`+\=/X21=S}vf%8~D?lsL B T0({ɜ"ZYM "qIIC»%dJaV#Ej¢ CO#aHOɓ j×?[R4&E?& YoϰezqĤ#m]siyˠ7mOFf;rܬIt߱n [p~yW&AfQH%)ʊBBLBL *扏iaW~Jّ%-18JqQmFɆb܏56a)`:>|Mm TuM;Z^Hx B KlZzM#y3z E~ (gNCق5{'/=\n/(e~H۪@Fy/;HYu]C( QLkcq ud1&< l4Lef&fV4#RY 'NPg7Hvh]L_% 69S€/ѪbG҄Pgc&&~F?8| !EDzhjE',]9>m{9@r~ ǧԂEEmՐGnEkKU~ĺwJ,a7q(d)LW hxJ4 RO01v(F$6MN'[#rÒI* M]Rk 6hEc }IU:fzdf-!Pd Y0zYL΍yO<|F 1#NKG{\"}p~Iɧ뎛n@'ͫW?Hk~՗|?0>w7w'5EmC7(!Dd$.1-l^ߝ8Ӛyv=^"nƹq̀F!y4O㈋Dqr =׼:|tC 齣md MSͮ3{xyfVk-Bv.@iVZkpxJdSqI{°?-Zqٔ5EZH 4mɩy#NWL3ܜFsIj83 Ʋ}JQxrHY|;R@_xVR&*e[:rw{`Q0()R4p8>Dd LQQVAM-_?pl{jW?_(xb`mMR/*YD1"u$@4P{~” ۟%BLzFSg0*D\@p@oԕem9LYvuM O @Q)Ieb7HcxU¼p#2VMM(Kn> fQ 8C psՋWz0&no:g_S+VՆ/DIOf#w7hi5EQ#rSss٧lB8E 46T`n%SwDHY |3s(&47NDliHS *IԘd^fibԴUsswĚڢH&agRTEnK)F FfVry.W5O\?'Q8tUP;j=`9V*iĠBG S ESPIVKR3y2x8 .`ekDhu^W¢@MK q(֖IA`*Mۊgk~q c${YF0Kz\>_|_fTpt=n~?/ ]ab^"ZhUC ey)Q0ʐs₮_hׂT&aX)1ҟNÀ<ݔ4rwbgb$3#e{%zI4PچTEEIZ1 鮹\7٠^K:7{vW9zju[1JLSՅuRö<[y{օ&@X&8RY1='"0xIi+бD2;, G#1ݍpBGґjepm2 ef!nW \mgt>>/~s8[l˯PE&!€XZ!~ 8Bn(浕 eUa |7ṫ=߁]ox,(7 2|>]d ]a˚^("IBwx`r Ͽ|,4):l_2p:|ٓ+ΟISˑ@%f7_"&ƉҴتDjDip3~Ͽ2i^~i$qx64B%k~Hxv[#(0)A|"81gggT$l)FV%BJeF:dH%Hd 4&ǭ0B:#TEqV+vK z/%=J%{=(CR:}h>݁#7p,g/h 7M~˔vFr(>1FɪH!1Q(E(HN1@ e5<^P 0L #с Tvk_PFTMJ?ƙaVW^p{=PךBc~Ƙұ."eA%TGi PG*^UnL$ -m$Xsb.$ w`l-@$"Sj-Z&XIJ@U >`L&?_(8MCd6 袠y+> v^|6O!&~Us}ae|-<~w~WO*9‹J'T"̊1z" 79BDҒ!`)k~qN]G#L>^<-,>{~"ĉ# {JG% *CD=ZND X 9-OglmPպs=AxqZ57ncMEp20ȦqԲD2/42 (sB)&P"2$Y2x@C(Bpx%C">sJ4Ni! ֔Bl+m(GаZ'%'\\pa8mV%-)8 hYmZXm&b.kDOBn Heĝqh[L㌱(ښc;B\FcA!Đ)84uxHJ봿c)   :ml8,0xB?Q$J EƆ|s7?_wWWL)7.v?݁J~ 8.4Mͪe̓)myKbRL=G[Y_3n-o^_H-g?⦅4W/rdW\^u=1%< լDHΣLESh=UYxih+& ֠چ$-<9cvgw9<((0 -r\j"'7 !u:dO >2Ś%*~癢,4 _zC!K?t}4'")yDz<i- .do'2Rij޷5tc`.@ ԕP“Vv >tE(lU)gh׿\])+daKюw?Dc~˟~ol#rzDM"F ls5KSl-X~A1- >sv^S[[]atcւ(gaˉze?jT,xr~o'Xݱi~P]piI_Zf CBHn?[z67N #Z$6D1DˈVk %@ I f'nb`*9hlj~|~pg%#qٳ+~`ݴhip}񂳫g0:Ӊ߃2/YaњVtiH3dp"$B&J-P. IdY)X i \.?؂8N J\~8O.M2J Ug uqFnINWym!jɹ*l"Iҹk ft^ȰD\)"a(QJR#13H4"_Ze~=-uVx72S|YZӑn$ q-KTa9=2="ݟUf8ὠ<&7IBһ Z }v4Ƅ j VEnܝqqy:mxLy4믟眭:~x.WiOp1RǏfYzwg#p髪ˢIvCb8hZ鯓 Hbd l4tUp8-Nh2Wƽ<=C%SߠDJg٩Dt8!"'vN=L%EphOA.b"_/g5iܒ?0z&2\#@Z@̉L|i>x}xؓe5N(N#o6b r' x1Qd}z2 UOx@?`dSfSvIoB p{r>g6_P&;2i嫊2$ckɊUjF4MDGǞ&PEd;dSW5яQ~ Ѵ]K:ň9>=%jA"AVC:clq ?K#ȰoX/KYږi h5!NmFOLA /ػ{ʣ  FOtL ΣB4+M䛯n]o3*ϖs|oyugOOq=;6gH\X"uiz0;l7Q蔳B@-&%/wLV*KBkDul//ɯ~Ұz"/ 3L kw"WF,[GA2I1x T:i^vX +Ce ^qĚv?y'|‹'HIpѥM4:_7Dy^yŧ]P))(EN$x5F^(^fjb<12*V(2Ds)>m M9/i=:1Ƙ~lcoqwˈrNDLɐzFRKYNuC y&v/%"ri r0B{2x<#mNΉ4 aRh䁑0g<0#bpi@%Emy* 10qm\sS( w-͕gw8:=ayvJwg lZX%G#Ǟْ%N^Hd%B%;m:IA]d"- Nǻ)QqTW='k6#a:DH2B@HQ @Y!5RT 1U?='[z&gS3̶37imx)fHB 2c@JӚ8#~pݛWt/mNG58xӎ{l0:gYk 4חÖ~Ϸr?yG.\e| ?qnӋDch:~4A"M "p88/i ;NjI e2,x釞ohR11Y]` tʝ9`i(J.Nf5P-j{h󂣕 A`*DV1:AY(Ը(ioxNNiwdO}z}sL%D84r|7i%N>$TQ#8K*`^)D9ƈRz駟~_Rݤ9xCǀ"U&8"W^0S9z0"RIع0MD y|TЍ=u19r]aiG"BiBP4C)M$A5SJi }zÈǫ%EQҵZL,MKUXnPu{ShA1Q泊=0M#ZK̃H錓# FYYQ<Cix=/_V+7[_1(,pѱoGd:#7Y/VȤD YK ]87dDe8߳9]sh%YBk'2kF3ZGU2ΧSsSoؾ*r}c O{\TŊjU% D$jivנ2T)"EaFf L^#ǀ"džӾոcGi)5){t۞-r*CkJ`7G3|֏`pb="b~@#O#vrI:IU.vdƠBb6qPҀY+M]+w[D*Ewz!oG(@h@N7h L3'M;c$! }4':Klہ2FI>)xb/#b䣏?eF4A 9ɔJԢƨ~@ZL TQ %r ZAaJp0ܡ)E eY=h%G[g^CnǻWo #7 G&' f1ùvoɵ FbnXw$ζ1FIUD*\Jf@HQi q׎lec0^ ];Ǭ7OfslY12G*wyw__. x~G?gtxˊc/\' BvqLj wb2ԋ#U^04TH-ȴ7[@)flji@kSc#J < $/4HGYH]{'02 C_2py'^6=M-7綵:6dُV } YT(2\? i,ڰٶ[<4Y3[%ТB+g<1?}Z8GYYl/;޿~)s0\)gݳ`4d"ׄɒ];1M[BTq:[hvՌZcǐYxEE%. UUqHzR'(QJ1ف0t,Yg:+(sơe#mr#0 -2A圀%<_2ڌ%C6c3৑%t <$`#JzbJ5@"**‡y\K9.(Sr;S7X,<{TUI]Α8E! ^HoۆxI4 Zk0!3ni\r)ʚJtD>C"<*xt}w$F"MEmb my^rݳ f~o#>6gF^ Wܬ1B'~r~q^D%B9d9"AD bP>`owd匨Js||NuIǎ]Tdx={OІ0N -&"xc \?p}y/%RB]DfGHɆ3;@0tf~בيZxtņjqy}~KΙo.ȄA-#\rs'6Mj|yg}!HO#{ƮPQPU5YO83f"]{5G]K;ZcNvQ>gżSV3O_)= G׿ 󳿣\<8@DQnjV@S+޾C?aA~W|њ3Ͽ%h'Op#P*3("UUL;ref)йG wIa\wg9O>3[1yTRݻyuɟ(߶˟ _<;I'OaL+=3Y Zajx}%|t{NVcxeFMC2!PjE0!4R8|*H]8HP󌃥mGg? өs@R!?Y)5S-m%rhL!gð빻ݴ5d_a*$MfFmI:` BĽ "7mO(!+ u޻@1YOZp>lR{C&,}O !b'@ 8Vz<(󚬘*{@fP\>᰻9ܲov,6ǔeAV#Ed&S{fxS8($,dtfB.Gnr8Nrdha="FdaT\ҤzJaJ2K(1J"aڠ 8GS|SyUM74́fe@T4Tz9HmF yFKRTL݁,1*ҡM@=@DBaDiusĬb8n89B貦44b A#2 2@'P"/&#=q2|302ekB5HS] rRtRD^?G6ؠQB#=i֌%FRe{4yj? wTu%q}2*/xbɻK$}ҤhV&$ 2Nw~B#aVoPyEr30 LZIف74o8{򘐝G#i42WTF?5lglGx BLy{칿E o^3bYݞ7r{}CYl6k&;=?`/d9Mwml6kF\iL 'G9Y{O`óGū'81;!eq<4%Ջ/>W|Ѧ&BRA13EV7潝#"-4VTf<2Iq9vPrbէ<}!v1E#v:!:'!. . s{sn;@q0 drYV )P3lfj*EH)M%L2D2i88Od"mM H)rU7NhU,kYIԊiԷ(-]f< wwwMT%%ZmSU.N7eFBL-\ wgJCg%eURT%D\ v;-o۞-GG,61 4txRR!OLKLL<|)ݖM }s׿GN/r|>k={Hg"!Z3 CR U̖Ծh["Cu(0 `(02cͰMޒ)AQ)4I!K;m ǧ8$駆*s((ʴ~:_Lۓm}^R&AEc[ݓ 2l:*fD$@5 A1BD8ر%dP|}|ƍ7w&8 %E )Aj#QJ]J=ҿyOI(b'Y;'~_bʒO!S32R ! (rD73Ï=@!L$WxeUb^b%Hg@!!F ֫5oF Ξ?+(k]eaJpgQN"LFGϟw|{þH h9;72LaXi6`dZ߶7ێhc mmӧ9@ ,wN|#A9g/>s|OhS59;f;+}Zd=OĮcws0p+ ɔ͖):\H$?}O%{Yb sOα6>>%+jF;ryrwN=^-&/99=H4llNv$ mcBth#ÞU12~ȫ7ݎ:1Te4vc}aOw_~˯A`TFirĠHr0a(" >1q98$%Vˊ墦^Dٜ(%9Jxz-6|noy+P Nnhe;MLSd!%踼;kF] F7BEpeUn۱<9;b,Qa:x7 ;YF5}SeX:MC섳GL(`nI Fۏp :!(Kn^PhxNYWv\}Kx)lAs#MEOܼ+*þEKIۋIJЏ̲t3RLt!@$<91Cc@ %Sؘ)׳,S|gg3ETD1H ҤJl^aqC7^s&gZ3t]Ԋ~h眞>X,nd8@L#C7gk 0ew;UC7Zvstt^PV8UZIbψ',ˑR*z1 s}}E]hf軖"!xn)5J\HsRɊh6d&"}6*/Bg޹'!4Bk-id&=|3)b!+k˂ ;BK݀4#mweVh(gBD;)`Di @' \D"FLe]Ճ㐸 a}=2H(7Lɑi;ET&@$I bH-JƘ~hTv]4ykqcOV>#ھoH)(f G~(D'% q"wBIڡ ) ?v)`Ht &' #12q7r@+WZhb&C̈$09@b]8)\]su߰<"9?{D\}M %}Gx( R( a~m{,|xBUi>OCOkO)hǞ Oe( $\ 8hxkwܿb ռzJٜ?ϛwoٷgW[2ru*!ߴ~CZ_|)(5OL*ɋq8t9]x|Aߏ(˔qE=;vOPYPG$|F^T߼#kw6gs>ݟP,]% T$D. AO>?W߾=L⭃.((9 :K( vG(՜6v6򾟈Պg?#+V=Z3w =7oo1Yu;ٜAxv=LE{PYWo߷۳X  ʧz;nlͬ2Y>mo()8\H@)N:88,5o^GR @qM{۳mG2@ЏH@DM?GG?`?=89:=W︿eސ C3i'dӒ JqJYScJ U( A;ɣDL<JQfA0 ll"GȘ*ֲ?c:)ɢiB<ۧs-1CF^VT 3фwl{`LC . lߥ"G ,+X;1ڔU]:NC̄Lږ&(Z'mQ#ae1F$/K6=FJvw{H IDAT7~OPUF1 (-vDh-/a;"K{~bDc Re?AiDHЈ(R#"TfB8 Q1B[O| OJB"eB+y,A?kiR. "6$ڭso$DaXLQC;Ko.9qt +K $e$&%xΑBk0<M >n 8!#RQ0dn)+-a Z2bLvDhEU%F֡@G:?2tM2p:G ]$*&)Dg!eGxg h1 *E(3"9BCAzD&0c-%";y$;nno4e^h9g9}f%c .l+C3i|Ww4-UAU%_YW+.,[~Jb33|Tێi) fsD]l\1v=AL#e/svH.{vbN*1i dóȨ!%BB?w|S,=2x !rsql/8>jq:JiY-+k4P7-7QS7qpэchc21za{}_/G2ɶB@.Ӫ i̋U8*5xh_#o _X??( x3nɄgCj^|Dߏww|_o\,3.VK"# "K\__FAt*VuNp}i8vUAQT웞atXȌF OILt˂Jō;ih ! s]ryn8A۔=6(# -dҢ,L圫ێ7߽!>{?d6߰Ύ%~*J~o|3a{Gwh8 n2Nj0:AMtD;FR<>Xx'M\YA(AbŘWQRkQ\A#6e( I=zƆ+b醳0<7XoxwsK@szt&/_QUs%2t`V\\>>eYQw;@ "rC^UEq ~+f^˚bH04x0, 򲠬 LA4|T룜qp4}OdlVSf%2Di"8:>" <&^ P0EfgɥDkz>U LB%& !%pŻz5ۤDL<,g>[pvA}>._e^,+ {) :z(]C4} % S]Z5j!FH!AMDzf"U-F iqxXxCHPXrt4Gƀ4%>Fd![5i"e$ \j "B ("Q\GN? eIč#pwZy¸KvT,L :6!*09ŬBRŔ!JIs!W(sP٢%h#cO=:Q@zG;:mUG)2'bRYA$@"_„pRDr|\쌾hYIYJV,-aDp|zJQHABHÞ& mp=w vyJ"u0 6q`B6HBLAeRG8'%1f#)+vzDv9 y9ڙdBXȲ)w#HI "Y.8ހL1$c=&jCI:?u.B[4MنT֊ID\PF!F#HK[W ]8MlyrsqRZ dnP8p8p&>98;>aڲQHauG=ܡ&z3 {%ǧ+$t/PI]g`I cIMj CϞ5VYd5c^-iKDYLM.9V cn7e-Ø)9u H!P\P|R)În*w,M2%b.7h% }1TSQ(AtaQqD ٮ0jv92~7o#>yBJFױ=<-;vvט]>B=8NJSbSy\TAӔ߽!Lybif Թ:2Wcٜi狖O근{~hIi5 J99ZGӀ0.ͅdaɌWF9916iUٌro1O.{bA(4 j>R/B\)voY?WAS=c:#WO9==O_;saEh[Vib!\soo(Ur|zJYiB /ZWL6 }-߱Y| "AW3 >3$EΦж!QS@`KKaeŲm%)ȮsX $! Z RDo{*;r|~FYH-|, >FTI2I<54Kh@D(ݖi <~lNa+Cv^ 8;#now 9 2d\6$̝##);\N댽O)C2>JpŔ1d;2zoJIrFeTDV .x$AN^&6)d64*$Q)rsD,aGa. 9dT $%FHDYr arhmRrepO@B% ; 3KJ@Ί(S@sdP5գ%gEѰ.@ɓn Drb=p{? \H4A?L7-wbCc98 "JVHUiB+&'IH<)d|W~1L.`\xρÐ"6u洉|ޏCGYi)o X7浴T:'ΓhKN0Oh8>=0k@8H2kf<>='ϖT ~x񑭛P#nTe=G$3wX˖*3v7^ =N70΅A 91K.@FHPV-$y*HRlvGn-9gO{#\;{ yb" StY_+XCU7HIR*amAYM g'g3R;~)`Ě"_fbL_JXΗf39gg#o|7n>b E4T `39;?GO9;{̫O_qesbym!H$ R`!L>F}׃c,R׿899cDBjPjl,)Ĉ; |–Mv 0y%TmM5k8蘭Vm#D75YP d65F7hU#Qܧ,֖E)4Y#)>ÓWX\guUKτrI~ds{M٣)ġ];Yo6l7MXPޣ|PPjn8=DNIF|" H|JH EJbU#~xw7̬td\Q Dn}iAJczn{PHS\3kSA6V=$a ׎w7o/L Qˉs~#~|ٲ3$Ɂ|A MU҃Va˒lƱۖ|A"g@8z%]w`Ɯ#{}ϣ͜CՊm~\&\h ]R '1_&!5l8~ry՘dp1 M$*6BP(HQ`ux71 Jiv6m Tf-)%wآ4 .ɒ")Ę0J„ZjLQ#܍eV58@њDnD&ɳW1_ǀ? t}OwX\W~3tӐv}81ro~vӳGMI ZѥRt7M0c.v{FX,VUCfKAizXomy]{b(1D$.O|"D%*7>xTH٭Y!"65IER ~艛=7oJ)JtY 0.i**YIQEYX˓i:qL H@IW?ŏ]A )(eKf9?0prQd)"~b2k PU!)D1[bl.2S 6"L'1wa# n|x_t+mD+yr|2r\G~rEMFG 0߫Cdr IY 8%0aTd pwt^|'G+HD H/zg~^(4qwLѲ8yēO~ʟ<{e ͬe V3z$tR E3ƉCߡr09ni3M #oxxN8n Uhʒ  m0R C~K[/pc E|@(-a,j_"ǂ8啅LQ3kZ={۫ .'cNΞ0D7x8?8oyx3gx_wJQZKر8=oƎj٢KeŜбͩ Ce5Qp $4k^=M#lfFc$g/Ѷ»þv"I%FR:'ϦKD`Ƕ[ VYeq$Rl< ,q.qp" q$!F6ǡ Zjv k~8k~?w p~zf9|߽XCGu|5>`fDpk.o6\b$*0eh$vB*CdݍKERח햳#O[F.>'MN0 'sK=BY|F! K?`舑Ns IDATgOy)5>0`D,E&)ʂmif-j""Q 5cCkȻf[<ɗ<~v➏<:~¡蜧P kK"Rfut'ݻt]٬mӕi_sy#Ye 1~sQ(4 b̑Mszr>OSD!#T%TWhkd$H1=F([am #dbJ[Фn>瀽x| ۻ==l)+2+67JW/9]-yS.{6IVGg4-sزEhI!ㅐhFQ f 17=OO =?fٶ,YWm29s7MnBP$!fZ7\ɰ>8փr݌tl00: COHjB(/۽vnLBU & eׯsvsڪP("u09Gh!xz~ r}~|ްpJBiT"*+)雪* eR&D( 9!n9ikl'wǫ[8yC]Jٙ8Z?@Jw''hL@1 =\r:≈,$zAn!sntٔBf5uS3[.qؐ/qN1g*0 Y4K*c(g3E]G2uŢ(dE\Z4W[޽|15EM=/g%eiCq{wb$يFk2w/:iV5!D0E&'!I{Ɣ J:ݚJ1:E7-,-ۛ>ɳ甋9 K?v'K>mWoD/^ٗiD &lY"aK^db >cDQ1V>b"> 2`6oFn/wbi^|9/_m,I$"aj)A@@pS!#xRe. Y2"RʓiSCgHVi-E*N,H\+dߪsJdL#qexQ(ipI"%A 3ynǓDi8iA rxeBA ÔugYX&0u@"f%gsTf=ݾcdr)iGZ8'9ov7£sV 8;1(J7={ɑ&O^G$vƔc-uOEU\V~1J8Gv=C sw6yIa{sz)#=UlLYShrjsTA7ʒf dɰRR3gmK >D2ka> ~G " #$|4e{-;L ' )~sv{0kcّBG=[zB-jʪo#1#ZJ*SZpw?yzӣ9ZJ9,G9 Iw{ypr<d8DI% _l]0L(9qzt^u7Jqyel brXn&DY"䨪= d$5e%ikP(hbhEأ<-YUPj8:gܽ).zO&La4+`] $ꚷ[ϻ}ϼx5W+r1g#ɱ>J㖧+m? \)BYTdߢtͧ`S  +fɓ1JgLU`4 .wF#B)KMS?82LPhMn7}i놲hXNxy/J%S8I f9t~G߱c|Ѳdpp@I B1Ǐ n'&"|o[.>~Y]Zev}Ӝ&(@A@ 'PPi)3= bU?롏 ]_/^l;>~5ec )K^d (i"&PBcJ(*\̠ȱgݠKEszF;tDxiǀ $"WJfNa )e.&d$"o|Fjd=*XU|ψ1":1=BJDb5uLv=.])Tbfk}~o7<S)f=߼f]>?=d6xd~'tzqyuG-Y3;GJASᥡm Cb!4gʲ[YU0_o~+~l,O=Fw_⧉w}߭9{)G,'!GCH9=?aq~YZ\iU誦kJi3J[6sJAHzlsiXBU v>cqtēGas4[T?$<>)zq6 XR6 'Kꟼ=Y|K7E) S(fv`Msqt 1g(w(LyJ5odfl>06'8+żm_$JB ET$$)eTL)2E4uպrQWhb@!b ɐ$I&-7_q6(%wۇ ҚY)r,5\J='/oUǯbs,I?%0e t-] Ee9o jCOّђ.oApww!:-g@ ? Gj4 iK1RJX.//xKN @&O ?uxW H=!IH$G* ƬsYBOc+"D[WXkq R E\iYt0t|b*E3[Q r- f HTԈT?ni-0 FW61#⛆U0SGbaua eQP/-fia?tIBQN;7PR⧁=7L`0t{LaEHA Sߴ;d4,0@L1ew~{LJwo,ON(9nJLӔ EH t!+ 6DS3yAUU HGUI 1nBxGd4"l$B0-%, ! X]I5@[!cmט;5ǫ(~XS#cqfEQ濙L#ZʡΡU`:%3E=og@[\b)%U,3Tamlu "SDOL1Ebخ[n0 9Aw( c|B;_1NRl7}##GWOxsGsCOpSZa=?kV L @;+c^lэ>~%_'?Wc۫=ˉ?G>qr~ѢlD"9='3znltq<sOQ%<}jyLVub@j7な-hk5-O<=?6 +D]0R0ƈzO6̚$'<~\q|rF*+DSuA\_q%v֐tA`LIё!%BB/* lf 1D(BI5iUVMs-Rh_`! S4CX?hܔ dbI(́PI!Pۇs2I#w1»}`i1L-p11H3[-?Oy%|$dْY=C-x3)wVF AhL1ww߳lGSŖ51L aJlaʣpǏϘ-fĈ$ڇ'n'*heZ3Mk4̒$IzQ-> #̜?NRM3I(O 9E+80 a{닏?gZ Eb؛,[yjnɦ2E@ r-'݃oƎpx晃a DDȪʪv`mp*r]sZσ5fH:* c h=xH;Q>rw}Mt[^]QMfO $)웓Z"ÀkFv2_Sf9<'v5Vwz|Z%hbC^3~үҢAʔeDb7OZ6 E8K)&q#Z(ǻ{cMfk7ՆA-(՜,HHU-~WˌÒxwohfϾx|J5HZI9+n LYg%eUp]C$#mb|K1ܾ#Ev`_~EȢ$8O.SyoH2vGn_prEg+<)x໫i4œ(c ZYWg_8LD[mͮfٰ_ݮ>~mͻ7 [}?}Eͷoy;QN3lYVL(b6oG_^!>擟(Ŋ')aQc^f/QFSv]CO0 k }ˡ0g&.|cvuϻ7oi;lzS#@T}Q,V=zD\[~ϧ?\q+;V=LV(queFYAqPZR#ޑaܢb*_CFD+Gzx\f#v/͑q;ܘQ{#>JȂ?$EIzcӇ(N5&8O̢֨Hp%R2cD(es\k԰Ͽ;,Sa!}G;Ɉ*)|Iom_GgO?gOi}?C =<h'JcΣd9_Bc ep#TˊpAbd9|OR$(V% BBx4 7=->%_כĘ!h!oaDNoǔg' Ǐ=Ef6g\\!faKLMF͈g Vh|uyl"&2ѧJ(*|T%#'T&=GDOޢC`8iJ#GO z!. J{'&ML77k>\GG#BM@UMp̓54=o?p\PN V32[2L5%At48V3 SfL!:#̓HMqCVeB;R:zcaRo{L08'*2Lù!5En8tq#MKUfdFƑ0Xy r`>S)Y.EipPb'OyL6lGֻ>{rF^~L=Zw-۷4r'4/}Fa+vf3 Q BІ"+(<ÁwWW xlMz}lIWDkk^[>Xb=S{^xo~RGV+_GX׎iDijD~Kki1F>\G* l0%AjQ'-\ie.eZ<2#m5My# )%ZHkRm~'-c:FO3nOc!JiDLn4*m@Y@85UL'Ofssq\~f拥OBQ>KU(i,30ZeThs|6E ز?ύtsZ1ЅVf.4024RKӏɎ./ÿhS1)+>xQDx-rGb#h U5xxs^?2ĜqHŌvFȬHOT X#0҆#s4l0;]hyxʗIdU}bڈޢUiEQfGHAO? !Zꖺ>2!1TMJ!?Wr%)95Oct! E^m]BHiYW77dyfeRkhh|FUP%a;M4ڡǻ›O0FJLo}<)IIl#R,f(e@h}XuH(ѝZB$&b>f:u 5#$TeJ"BizgS#1JZ JQI K©"lIHc@fH,r,J&L+ɌX(Ndd!)Ʉ?r:#Ͱ9ZiZ#Aj2/(P vTDQ&i]՗X IDATyZkU6&Gz */C!lQd){v 4Gup&:"$Mc2AEtk[=]D~hCG 2؍\!'6h}by|8#QWU D-/_rk|_r$Ջ& ہaX3ʜ"C%$}7ݴ GtnP&е] &MdUf\.rV Χ2JPk./- y &XF5%) m*Gj2VD#_,y#nϯyi3>񟲜XS~X8k~%> T3\H5o1W_c0:#-T(7z޾}G۵,W+yцI8J2Y>憫(=;L1,E&Y@ynL:)!c|9T%EQ1_1? :O c Y+K I=*4I<wkVIKc2хfTHHڵq lkno1C" XfeE*) a8f%Qfx{KgH]98#Ly> "$%U=b3Q~Ɍ,'gERƜF&Ve'r{ҳdY$m80QLRtjvS%Hs>MR&jCjfl`y6D]#kǏ7߱Z=bZ-Yf0fKG<|HdZT2)itZ'6]KxC9`qޱm97",2Iy8 ǣG UCdص#7;}}d @Y6 !mDӵ#!=׽ N;4]CQE22$8 @ĄOGπ2Ɋ<.cHܠeb dJQav#݁j|4 fE4 T[>;b6%Y^06 [o:|;"DKVdhcYn WsTER$m=rqtHi|GƑΏGni'?#3I!C#T J,@ږ{THsi TY"5HJяieKz (B(lF2) 9Ӳ@ D>1CC^߾#65Rm0yҲ霳Ͼ@ {awc<ɣ3DD%J>p~Kf4EY:;KL#Va~YU!!0HS@ h b6q!ۑioX*h"Bd5'УGKizb`W'9R vjiT`ۓ>RK5-C8-cSL%Քlt\Ƿ#Iq\HQRmہm9\_[ 3=CsD E"rw]K6>t$eECEnnk2g1X1,Y1r5w-mD0]̙T4ɇ6:Tfڎw2|DIht2,K|G-O lE a"Mw cQ-ND>Z]#xCM t]X2t-E,g410]Ly/w<~dZTS#Ōۻ CPUEZ= #Г,J`2IiuT9Z7dFbmF?$$thhOPGm(E a$ JJTN@HӶ vG>sAYn209|`ZMe\ .K>)CڗyA9׻mݲ?ETK(-H(45ϙCrWIla`ӤzT6vٶ-մbNJ1F4?&[vl eK[q:laɋ  I(ej])38Z[0lqɴa9[ИGkIs,i%F,rü8Þ8nww%AĀJ& >5sgӡGYs-FBmj։*<6 M30N7z63y9MIJ80=RTA<|􄼘 tN{"-V7Wx"9>zw8_@FеQ{љBo"CS㇑\Z[lW?ɗ_'#tD]Gh6ܽ@j]{GOLxïO|-;c(<(RS!s^\ 3c  =JB5#nch[rPe$3 ШB:eO*҇㖗]-"+sу3tǑBz{61d|M{٢Z(\df}~g&Sew8E ~PTc{హcs;Iq/U9AɈ\ ^#ЍtmG>L1'AoAEuvn<8,f5:2JT!*5 fKASL(axDP- *P=׻;X f눍3q=֚nȁs'~͟ٿG4#FFR,Wg̦t C3dL^ czxw_QM-hGSɓ'Oxw{w Yn+(#Ph2/0yb?C"&AEBHm#BFangP㇑ٴbR jsQ>c2h#Jrl Y a ׂeF6e҂`" 5"L<<+XTquհoJhEE\R=/021GrGIf`$੅e3Q L% qDkq]40]Y,W9CBzQ6jIB$5!\қ0I*dIA߷tC&9dĖJ%!0ָn`x)1F_3/Ζi'=Z4_"-!t؀i<)q}s@#Yɫկ͛k2_%rb&\pI* T6 .:ٴfd=Wz'yDh1*+Vj˜!a5;d`6(ВxB QL0*2)F+VD&gԝdY"ْchc0y2ժ>5HjӹFt!&|nWq %QI\M!oj8кٳe#-p=e!DžHwT'揞 T"߾₾y, FVm:fN5^qE9o_F>3ʳ9V8#˯9|2[c4 {Ta%Nŀ e+:guƏmZQXзn +\4vfl︿b𑳳K('Y-gq 'ʷt4$,.LKnݞĐ&YH$/1ͱEӆyl;`\p\_`997?CLK\ߢD@(CĤ8B DL5tBKqj2u=H&!&݉)np|JN0-Z!e`g]kk2kɳ2vش%/_3JKlU6X coHܯTUrJ`sED^WL9Ϟ~!A9Ƥ\1 (]\EW { F0x)9nt}V <}i.X ip#9jHpVG1dYTcStlq +lvoh )(R+TH2uz^L$L8MJ';iFz(+ji#á s0%Y*0Œ3,:ppB+ɬ,+qdޱXN1a17]7>0 J)Ed )&4MFY,TEq I5I1Šk>&֚eUUFvC}0m3K^"c,Z aag]J+'M@?ܦ@H)Ur. I^Zm3t^0S,}G{h5w5y^#fsj5*Vb = $ΣaGu01EEw=dJ4i B$z:_|s&YU&CH-+QT$k]:Dv[B SjIӍ @)5&+!fB(@ňlOk4EsJhi'/KN9 H^)]x<`GxzH{b_wϘL 7i=+9#߼՛{LijY0Z,0H쫂i,bqû#  Z +Mi5G|}ObfGIA udط(F,yqGݮg>0FEAo{q~1#Vd0* ~ +gf2X(4LS |R@T?xnDTp~ɡ+6ln[ƺckw/_G>3f~y7wɟ(U<˯~9Wn蚁9O?_߰܍?Y?c&eE}<6!'c&HH%k5a‚08u=fVԸ uز\,aLe!BѳL4퐚Zf9ZqC$*F!ǎfȲ#n-:JCDZ4jU@#zb:#HNi o߽,SC2SDAg12 &Hɐ1:Ӻǘ2hQ{oiޏEN!/:cm-IBpk Eaadͫݰ<>x%΁ޯӏ8j,YNawݠ@eS>i[=UU-\M!!f:dyЍXF&)1F(|9?n6(z˃+/Vlw\ZrIUMO񌴖nzn.ΡLonjT|{YAdY#_}1gi{Ʊǖfd٣d~Ӳ;=^GkS? 9[(xoAW9zL;և;#;=ͮ}(xv\OBu5&z \p8{IF6 O4"$rZ!dL1wvh&þN08 Ѷb?:m˿ ƔO+Eb6gu }slQ2m~K:oQBخ?<_yb9t=F' G)?/ǯ]?=~ߴjIrbUJFh!-!P*Qdq2#G޿ض\>^[|B5y㟒)`|`gKlf mbHkL9A0_̸5E9s;q@3i *)OpGSSf D.TV8Чfa¥ĠĄ@f+ aFV&Jh!HLnm˰߲=<+2 *C19Ҍw#eVpvqK7Y bh`6ngvbs{޼zٌf}1 \QMf8ppǑ|VҎ~Ox!RMY:aaݢG$1ie0 B\ᆞɼdvH(l4)E^u5MSVSxX=@)6t`l5=5fPHV ,O8_QJA`y wV ԌCZFihA;Fs@?HtأHf\дH!p“e9K*튇O{X-3tiҍ msgtNg{G)y ;PΥs Jݘ(\#ލ<'K,TyST1fOZ_uH[7h-i"KBtÑvC+ >n `xOQXY أJ|H3-wll6ӷ=ʸ<;"Ӹv`hؼ,"еJ0"l-$/#5r~,GxOXwt ~OA ESX]3b* 3g飑PΧ #k2(r}= P:M\K'_I?H *zt<g쑓 3;blon_IU#sݱrnnRZ`>tZz?Ќ(<|5|Q6c1Y<|8EH6 qw؂rtQM"6(#udJȶ=2F>Xp̩&np c,03\R&k I5TUvjG9z H/AU1ggC8=d*K>mq&\̰*V%ŔK) IDAT\`Gݎ5G-<(3a[;0{ I`[|`[غp8|ėS˿k"IU>'/fɋ7\XNK 2XRuz >z,hcW eYa(<"dTJP0 -j.Y2BDfˏ"{>=0l*&eFUd7 @d>XVLf3bt'=LM A. 8[n$>feC 8wxh3%$BRDF/X*_7|>i!z8L秩ԖwL'KB5{,cwszwd21_Q̗B8O>9X1D"ٜ`1yg^ZCb͛_w W(w-i:O'XYVxל6"Ny!1&S#=DT>MIѢNMN$cHpbq/ɬѣKW%qcrܭKnL龧,eO|E5]R75YVQM.u=ntHxvǏ;ɘ2xα^BaVg3{faz,󺵧o X*!q Rem:*2@O [P_qC ׎TMKHc ECwkt>MKaBrvۖ-d̢MƤ.X,JF@Or>]3k NƎ5O>~yҔ h(Q|^;[&cMGi1x!<|!eU3#aþ:L0eI5=\]p3JP86λݎk99?g׵B:.ϧ,>̧i'592Ffy"ZLeYmlڮC8<]Mߣ%.H*gph:G >bSv4H41M# 7T[T/FB dѳcn;\HFs>c2tw߿OKr؏[!;Ϥ.vUNԻ}CWMsL4I.":82(&evv`ԅ=30w( 00%lnm:e! #U!Z~Z~ 1opdFvZ?츺aX0_LKVsP!W#ݏk n] 6TxEd:Kk!{\_?8<شFĞZ؀ZU/ xGkšEYcW_]8[rq0UhZ^|{'dEF^WLc;CaB|pbj"2{ 14}#c?UlR2sv߽*¨ہFn z54}G7 FCs  dTYaXȼuD2QЉ?@ni]Ss~e6-m?=Z'Ld<<\!UY=gwh;ﯘ\|ӓ .@[nobE>pwstt:cݲ7ہwzO?>C3aKY{ #Az\߀voO9|J;8noɤ4'w9K@t(%]`8xɿ=G%۵ t}dѪ;ݾP0]mvM62w9︽%FQ8~_p೏ޣP%s-(ʂ!Uf[FDVi H9-/Zkth! k(} WGo%SZg(8T*cd66$(fBqgQѡ Q}DZk;aOW'i7_e @` cCᰡHU08Қ"A!%A P c RjT9:+wxk-zKs拯yŷQ1516 ֏b?X/Ȋ4L^*Z35x*@68ے%EU0~nd}A*\"FG1QG~pX׌t O!.V [3DddbNR3t'LD㞔%1v|rlŔq vi-0uZFEƓ >|!Mӡ]qs5_W'3K۱_s[1 {=o^o麑g|8'oG޵ϘLjS&ՔC"|#Kw7Oӏ>+B9lׄ8Phz%/* Bw|%޻*1؞=mUw씓GgOC%&S>+ysMuL!R jμ*Kc fKoGNNNkJS}pgՔutFP&N`A麎  D')n5E1321tY"QQ( g e(ÈGOIDwx32o~-r)FV'uY7_G8;QdJr?X_q.xuuŻ6jR4K"(C?~DxIgOq,x\rmǴ.9;=&kٜe5w96>p]z!b:0UAY|FqĔ9:ukJw/7 .錊QLZ!y{MUSBPq lMb>mwH"}C HRKLdEng"46R \4>Ff$PWB)=2O#5?b%Z#$ $y)QXI%EI ӉI)VqZ=l,B,AoK=|ꈣݎ1Z$ ^u`;]yzFߋmLjeQR%{fCfK%.G=8<{ <لb/Y5G%xءU59n#RJ,K2'JPo=l Fr->Eڻ=e? dJ1[ H]tG ~{H~FDb%)L0 ͚`}FE G [rg:c-BH%&8@}Qiv=2z9劇7=yYQ.Zv VG>fdAQź?`-anKxꄼVstȘdYw`܌qM#@B"[=eQST>SxS)AF2O9G ($" h4{k\{ˋ/~ǬNy!jf}QZuLpc k+g?_TS3dQDd_u7Ȩ_O=}uD|sݱ.բ?5;&`la9eLEF7!/_~B-sC9I\zZҷ AHCS8xvkA\ n8YQcFGY .GHIx])$RG~E!{0& Pn{=//(QH:>x p2K9#PfH62fc%ǀ#bC*%:1jawжsG~X!myAew#֏D;+^9OK_dRa} g!е-CבehSX9P%hT!8rmD(n`p-v裏/N%H-4"D:Zl7O]w/܀)DUUϞ?yfaL9 D IGힰ]>pu{#u=g:;=4v);tRIƾ(3,ϩ'@dX&6T -C6{:^Am\>^g305 8o7$D{5I@.XrQS/&3"S( aDpԂ,g`"{.0r.Wj ՖWo1U\>;M^'o[ڃcRP"/\VZ4{^[N#AD%:)L k:4 c8=/zϟed6q|r,jb,;YNT__ievr)k))-}g5r<Ϟ0U9݁^LEM7@`Fen$?X6Cw=Vwqj9C~4 2|uǛ\8}rcN1%2xƾMncߣAiB\r; w|(j`blJp,Wdٔ2COYkPn4~K׎Z9=૗o~˟ad&+x7CL$CEL(:xJ#a2)ȤF) އ#9#U"@KQhǴ.%y2zfA@0pk04&XoXNSUTB+0QS9:hU,LQOûIHs%J@@I|`򇯿д,''' `1k$4Ɇn@{bH(uAD IR51LyK&)*XQF%(TΉ݁枣cNΞ#*|vDQzCʜHKg0X Ʉ谝0XUHȳy%J DLʒB$ iu=?!Ո o=J@ T##^ ]~X_Gdq̖+L㛆a@(4, L^>[JdJl@eB#"A8h-e=!2a"A # 7ttR1/{NO7߼Nhɉx'" x]gRԹe<.!Z6 e9⃑ IDATtMdޣo[L'O.))w4;xG Ysg3ʬ sa`ۮiSdž{FYUh]p;fK4G^=f~)];`h rKlBTt" ̖@2"$5Bȭ1:<~KHEoń32>~ OO=Uje:#dM~%Mgq9~W/}F5E"HcTStC'rw_~?/锋st^2Dେy|l7TSnMLDU|YOs8SY<7{no>F)Ur@R2Qs۴Œ,q`$Ez ~߰k>9K64(Χ&_덍B H!e 0x}$TE@ulǎQ.8$QPտW/d@ZTrɄEI !Rϝ(MA7]ִ{޾akOYO0Y|>6B2f*pvdynbCa8lT%1  KkϨQɣ|2ؑ~tX%D gOyɊ f <"d`-1($ EŖմDxG7u=]7" (#%7;H&GO(,^$TnC)sfϐ xF MA^y)JMF. j-4|Buq4݁ʑ/(De@Ȭ@d%H)qCӢjR#Q{1"11u"A8.dBkf ?:6ɢHrG;4݁pG^(_^bGCRpn@$'/vm b`*9>>Žɤ`Q%ަ0)fZ6}3=66G38-B mG()=&)f)F ut}zM?<'唙.%f+9Vm w_)]pyv{-U~ Z~0z2O )ݖO~9_[o~ @U<1={IM]6rZ:9e#QD\}nf{WCiJ SgV3H,7o8;( *S8)˚ 2= *<۱i6DǻzNfc6MKY,W('$e| 17՜q{)*ʣc%(C'wBil YvEey#wrwSzBHMaD=m QCKӴ, vH!"ۮbL)Ow[jJYOy)7?kC1ǧ+aHcxr|ɏ~1Ӊ."7o'~ųy}f MCL2Ey~O> v÷w+~9eqcPyI GkQF2_ J[aJ yE°om` GIvٞKgj)~w9ќ'6\~E|ĝ 0dLۚm$%[0Ww5:/F/^Sz/08;yJF6y) %iv2GJzdCht*#x' #dQ 6wS*8j8[%*K (y)!#8NY1u`􂬜PU>X:<'>[w=wŖbs~~tVr2P֊ӳ)nލDo Q2 )l !&xGadj#RSeJj?Gwz;ƶEdRdd:*pHLp3+?RtV&@pFMV<]. ҷ9x|F^L&ND(R`-큦iy 'K_eߑUтLV ]nBeYBu6"UbqL2@%c j<+ΣKC]dE1袆D5HM>4D47~$ 1xb=o_}ջ[10Ɂi?SGf Cnln/p.38:Pn<~a)r#dw2Z}@]ȅ&2:rs߱AܑeoZYѶ7[rgu|Ji,AMϞg9*Q366ьal톗_Ae߽{o_?Z^}):xn8gAK IXN\5=_k>}d2ŹGϡXd:5x\{3TBM;62N/'= nn麖á#a?CZءTFԆ J:Y#F(sCUT ]Rd;L$MS 9 ?4 7wk6yz>0hQN(:H:!l#2xTVYqX ~EHӍb48mR[@Ɣpt^_ŗ_Q!Sőb2="& >$痿/~myS,sV+>x#vh)/./Vl 0LEm醞5_~Bih{~r6h 6 zh4 &z>NxvkzMfw:M'u% l$n{KlƎ1WV\~jv,.8VhQuZ,/8Z1! /Q12 ѧaytE-(3Ť*A7|$Qk겤 YXRCBlnoد,'5 7FFۧ%eIܽ7q)2ey`I*kNY.k]iJ1 Ĉ!lO JIQͦhUo{l"ɤAͶo{Npt|Lwq!&mh}z_fZW5~dU'wlY^8F^Bo|GG1_֌d G',޾c_s|| ~_ҍ-oQMtwNh~-3X,Ų{b2؛XgzlfwcȈ*JVqhA 5h&VdeeedFfL>f;Զk@"n=y$I@h T`c,]XpvpjDD9gﱹ,Ggl6+ڪ"':( ̻Hp0?f>Cr!Uc\q ,'y K1@Aׯ^ t=J|hiua+1֑!Y⁦mhۆ8$ds|~"lٶ{)%N)T8,}`f" qlUzN ,q$i2;lʲ498='ι~E'^)uW m AHInϏ^Y)O>%sƳhDXc(ʚzf(aJ0mCEdq<? -x/p6 l<hAH,!ھa2&鹿f⒓C4"=Ww0Y,ȃ)u!  Ӷ*$G)4%=횣S(ëiy(qGzA'x^AշkG-*OPa~,LZa{ !,+f"[ABilj뗼x 9]l)#c!|w-_oڎ$C)E[/kU EYmc+8`q:pT5ASj 㜑;(-bBZ#FRJ ! LC$'[CK~M e/[=:{u4h^_,<:ТfjBpv4FIxt"s=}$pOO{!!i8<<\KA_UCm_v$qئ,R aRܯt] a*- BMEhqB?{K2~\+T3p  S2KgGl+ֻu ' >S;?+fPO>??& ,Y4u788G :(l7kё-+me!tD$o\PԎC g78ӑOY&*;&Nz B6 y*ȓ6g ِPMqVѵ-q!{gV}fNHݶ@kE= 4]o#MDzuM ۷ٓ=~1b>J! ][S;jc`W\y4i6~|缺\MO/>x*'[<ˆ4 A[f3(?_z#}>dD4qM()ˊ?/ßdGG3@䔣kZ< qж=a⣜ruMӶ\_-I"!UȚ!Kgalޭ"ciiijP՚zǮj2? Mk88:x{uMW,w 1sxrBD9>9Gv]K߂($eģ]Հ Qw(k%QDZ|$96(I۷taIE+vZ TpokT"y0 С{=uϳlG}BWՖ}zeyrs/>Y6o0NȦ IHPªس-֋Rβ\>lOIӔ-w׌mx>Aum[l+w+(W(!99 etxHeɳ_~g~d~8[Cgh%3-}G[UQDhef[FY@@@_Uի q!}Hcl6 R6{v[( 8ȦS[lo僽Qꆷ^. &28T`zK'd%4m!5aOƌSo zHJsahi)G1a ;BHHDe,& %:N$AvE('0&ɓnaLo90[~' C8E8I;|$*zFF8Pve):h )֞X$@D,P}$x]%|kAoX'&m8Lಇ,!?n= x01IlT92hU5vO(D萲pWn0]Ǐ#0p!?#[',D8xJD&O-Y0GZd#fٴlnIh0 cIJ6cs=EЖ-*ryuSlFĜ>xn}ny<|G7= 8CH-tض'(+pzFi{Opy5pd $ zuQMH{=x4tΒ&ODq³\kKԥ,zȗ8q DdYw2?>b-a T}C]${Oo㶃7+='T5 mi$M1X@k?x%|7S:3cG ]Yb׬V+~?壏@gfɔgh-RGfs5#tܼnͶWw\\ް%0 k e$inWf87(|Zl J)orGó<#x{w-vI9?ASr~y}H@(]AEr bv;%bF|6&${j'gnl7TU|y{Ӄ9y6D ж%Q%c||K_qR![^yr8LS804Վ7+R t;O@lڞyA,!8"R z&WmMcs#Rr3Ȕ{!GaE]c:KY(Ec mUAI?ZERd=Hzc"YIUzC uZn̒㳆8g`ŸwƋoW\Yr}y |z! [w7| de alvG}]AF2>_y34mC酠k80RW5WX[!t6` P5lzuL†j#PۗDAՎ4%b6ۚr׃  WbOiT""I$y#A`R4{(% %mvr:8 yc|blaokk~g+RJ@ &y=/U'!ue[kOZq0֌*(R$sK -JqHEXۡ; t2ecݢFF 7[: IDAT{OS$ID) Y:=]GI SMaQ `,gWn!r0yGUl+Iz& * 56ptN!TRzz 9RzW3hwQDs\\]/)|G'LFO1AtLtb6Q=~5|%Y٬,pYEMIc"=5i(h`1I24bBmwUɾl)놶(t$yzfsB4rDm)+-9S5/Z.ߒe9s茶kPc\Oz "7mv$8;}@5l+`<>mIҜ|4(}CI G)(c_[ӳsFJ8wkZ)8 sp%Ļ!Q*ѵ[6[b-QZsL[2N"p_rZv^5ޠcÈ2H#AN[:%o#Z_qӧlhY20"zV=/^|Gك3hDr488&rtci:`׵x=eEg$m%n$Rgt컒YC%hUO$ww4]Kp~ 5M1Sf+fZ2RD<{y,dg10hMC3^yKzg$yISv@&P9Uka4gysx9"xJz@Fwj;ʢ$q kgg,F!I dB0̨vp,É LҐw#P;轧$LɈ 쪖$ȌgH^b D=R}fhh#Xh$R +ؾbۯoY$䓐@MGL9J f%M݀mI(M饔xiVa,ƺA7 b}wdC$|Cwo-M]d1: J뀶Q߮;C#,D#8cCڮ{9A@'4uGWCi$ƚƚ/?zG A)%8Сv]׹2p dh`9) nO B( `'D͞$%,kd]ey{ 1O[Ճq9hrqw ?!L899$o{AFi͟Nޱڮiچ$#'H''_7?!_0?<%"TEI۵H  ј'?7=0`WIprUc@IGDZ'NV՝24萲n9b<>$ S5uo߼&#Z'Ϗ*@a mIG#W7%rK (Jr@(r7K^;9YJ􎃣#,;N(%JhIUv;FI,Bqp|ƓO?Co%W' J6ܳ1# SjIw$Ybk5yqr8avdUT Պ JRV@aZz[&1 _?~߭HGb-~ gN9xi$`g'QLZ,! ]Q%dPWw!KVw%vKԉq ˒^ O}lq10NX7TmK6`ڞvU`U]8еoY֌|ó"/>HƬw%ȈT==y r~_`!#lqssO$Tф( /_bl,舓'3mGe 8a6_'#!tN<9/_k\=.8aSpAX!黁߈cKb4PdxwXuYѲH4O&=?Ղ%MPyzH`+*/=(g0QXquA0x6$*AȐ*=am@.*+&2Q:L d1Z k/!$N GGL/>{~|jۛuK< lJz Q2MiEW-N{t⻞r_3JF|zf& l*dZ蜣{*4vdJb'!,M]:-t24Mvë%70V|0ɓcݮٗ5M`.8q)qʣc945tLЁ(PmSe9XAHhO_r%׷FNx#6nO]H%IbCH@4{1qP$4li \ q"ETm1= h"EDģ+ێ(N=:dO= #Ҟ+jʲ ix1ql#@G!*+zN}E83\ $ Ģ)5mA+1Y!" z( \5|F::88ߕ8zjViAՔaw\\߰Dq׷TuCe>89srr0ϲer$yIE'']vf20# bV5ǯyCdAQWgr~p4HҷY+Kw$a' 5lt uHg{P3JGH:C N2RI Q#{0#w>ijyEQzk% iAi-~^_SU ^ 8F萦i@+"f%q -w-.QR5J 8;*hB4U0D!Hpm0-,{L#KÆjY] mo FW{AKEV&4a%!7zHbs}36%3n7xa=[lgeI5\|FpCD;c;V5]%I|̏wh14՞z7BHGӵ1(Әb 5{UCe#^vh%9H\ݱ\u,M鐾@Ǧ#Xx' SUG .*+Wl-چƻ9;CeH!<~,~d6c2;DI ^95x &)v!I2i$2ӻoDiFEA۲kjH^_Yp.'rW&#ZщgcE[0,Em1(I|)!LS&9EPW}hyz1=FDQbؕw7ptxiONh{↦wec%ޚ&]/K(Pܞ.iK_G4AtSTg䁆8BLǴmZk5W Y$DnxuyMT8<~">L%|(MtH7۱-7d=:6Urgqx1ɔ|yGJ8:=eq4c4gqXLj%G 㜺YT$%R$, nzիY(Ilcn{"-ZB_/ 4$˦(l-[@$՜gWi;KD9)DB3lJ4- /8"_i:Ma:GHb$ea EmD2vٔ'ԅjhdQH;S|r "GD8wKʪAEEScW>1Q 0lwH9y=9LҜs,k<`qJeff<6 qt3_=(DO$8;Lax! 욞+ʪ KcF"a"~ o;F#4< Y&tNu\\?舻%暃z&Ju7;[s{s0OH B %i 9mқcZÀ!7 YC M](,cSlI8Zpi;%]=FQuM_}Y,zC)AVtj匲vX  ˜P;NeKo+?hih6 oxrGȈ#=LUm8ϱMͮy 77i~T-Yb3(YѶ5OU$*F 6e%wۆeśK./_c1ٜ$VzJG u٬7lF i{ 0V!^t-nKGLCجie_}j/x2eY|_߂iy13%*W Mq Xze Xr|x| 4oPv=|lveW_]D)5_?ِæiH7lKK6DjhHssū*4PB$=xCBIr<cʲYFi$PW]"0zgWYF#d2%i ) 7ee,UBZl'kkmWC;""uJ],Fcd4%o ]MY ힻ[{Bفiȴgx )#F?߾CHz}l̛5Uo:VwK<l:yYvnO(™]Ayx;=|75C=$@iHơ$ K-QY^kro%Xt% pH!QRb}ӓ3)5x8+4a(Hce=oz2N5d)'Sd6/yÖ݁O|{qFqxA"uDT5no!PD:d2l֬?p17w;RIAG֌1fcruw%0*=iD9RU-M]H)p~`%ia-,MSO^lpݠ{^xt2qrrB6`4%s,3Tf&gko5O^1/l@T}?g21ȁv޻7EC5`Ztӂ(B!TH۷e Q$Il6d$MytvÆnNtư\rFzbviȫ$HfTJ0y96 yQ4W1NԽr4e-: mCfS ƻQd3ןΏOx|@IGGeöh-l5?ܾџN7knnBqyugOT^QFGdYp/[d GM[cpo-)?3?{B(iJHaP4-zB*Ahb7)%eQ1 #1d$RՒdvSrzzr&ﹸx>/>K^5XoH(ຎꆒ[C536ں%uy+0h8TO2,?4RוXSv@)Bet^RXV-^G@94Q:\ojk8GrAjop0CcJ:8 @&nhm{@^- D 9gqp(tϨ;Ît1;?7@4(BѴ JK03bDR0I>6 !+a$|m\ׁteSr?,W5PaOQ@*|ء#TkR 6Π$-x|zIh峧*BJOvm(#Lcm+,G  PcLJwth5t| -8PZB[, HiOQVDI@ |QsÚn! NB pH ۗ4~` eb8>NI'sV]q80,hs'^ ]p> l7Kyòc4NSeryKv#B8tł(>Ðي6y:My 8~Lg)!! k홌R./ |HWiƫWg8;;.;fŜɢ,蚚QpuH'ؖ|=UۓG|)1G3ڶgPOc黎RXhL$!J-Xk;xW.ښE/& 1e^4.{޿/2WXo늮q͎qbxxvE(? y~o0E*&i*V hA/ aCIv4{JU[%0 Ѓ14e%5f"#0 Tml"Iq0Yu`BKn]Rfx 4x; 1JlZϡ94Iyy2kƳj5lﹼ8gx#džE aٌ$RU i*(yK}G\sDJQ%9NNϙMF J,hU#Qјv~lF[wtMOUtH d|ri2 o-}R%͎& &Ib<="x+b8\]ç~=XH"^^qX?_ v\>~8 1X-:tܭ!ÔQ3M3@u=6 9i:o=mNf xd2e~<[cQ>){}A_싚MհH yw3JOBξٜ;?WgIwcu!妒ll&Oxzg\^^"zstd $K89:&RѴ5&;xpazK6'\aЬښСBA%!,IG$G 4(v<|1='G_g|P a GS偢qRwF:Ȳ}׳슜o9;?tzk%zFQH(H"'DYHtDe,9l ~Ȳk-8u4;-eS%eۇ8 x;>/ a|xϻ7oQ"g:%I&(y~bfTqwo5WgRV5<_?#ctmfMk^|Toyrz~_ۿ%Ɉ(M8x(dAr "Wq:99;=<(oh1QQ@ h$T́(L)(n[.Ϯm #lL|qPoy-mɪ糖f5?)0&V-/'d#z;zg ӄ4펿ypu'/Oi:"Rc i08 .ji)n(ˊ,8>>97To)\e@D(ӣ8B!i6hi;L2Ns1ɔQ:!IGQ :mST塠k  * 74~IVخmcJdEDQ@$$e|qnM|gqJhw9 ( V92g49:+a-1ޣDD[vevR*"!8N8z90JvplSrX7oqUjYss'?@T88Sӷm4Jn]N]6CqRac(&J&dTfxTeȦsVQ Rd%@8zG8Dt5fTWO3>߳|wK-/?/?|9= 'g'Lg8ld@:$M("r+I:"K22:!x ή8Hrh4i IUt=QZ*o-q(Eq#&YL(GQ>64u_Z~6eN6y /'2yI$+5nb8/8:( ZZÆe:y9q[C) _΢#"] (=IQ^olΒD!YZSY`$:Ŷ4IF8BXLC=4a [=I(jb降ugנ(MRt5"Q =>0 Ҏ1IRՃVH GgĈQHE(=L&/>lG[Al<5ØvV %#._37!1)@5m]eHHiF1uQ6w eN+45m!ȋ-Bid~wń !u#ZchRPu$N&H@ I!BRHסm7=]4n1-7 Cw emG8;Tp@{c@OXT(bW<|~k$eۓIa}GDZ"Hxt:h1#3o΀IiY-Mþ,A@g,q8٤q^@qخ.WgSNo R-,Nj9|k-ynW[Ng#iL4l[&)Q`M ` Yὧ`Ǘ\>zDL> c Zh޳ޕiBY8M167 +,Jvkf#MP03dL6MoL&|#^<@Kf d l?r(yz-M+~",NpG\<:"%,F814I] 'J@ccy{-Q m9q%mT5uUQW-eaYFA@*=U#E=ZI6PJ"G:GS,ט%D1m*| +09M 4OSkzd`Gkw WZҶ= pH: IDAT!owgBEKe<;( qŌTһ ӻ*Iyޯ:"86 &yw=,(ֺ۠B6^zYBxb`hAo eP@ D(h2e~|L}Y?G!ftG1fZ/(@F Y" R J%ˇ%I2=:!3ʦg:<i:Cd=NL '(t\jmMY%=JQJx =a߱pg&9 {V7LiAG: BlNdz2^(l7v;l1Na5D@n{`kN@F)C M&D#Ol4hhx:A1i ,{F1GpkikVXsttD a-M]QІh"G1.1u;o4|b GO7]۱ Y% =m'P]o^8Naz&EDV_ Cdi!wk+)$Y,Iq1O1A?W=*ɀ$ٔH ф'W8QԃW{Ps&9X ;15n[Ԁ`43\QTQå\21N'M#Pq]1H$ExL/#{֛ . tc8;& 42zpv Z'NTnl6 (Q5~9Cxwhk2AqW%cRhlOoJh>{Hgg(:z/ XE8/QV.3Tu7$ ҈tݒ2Iz$Hӌfd4B E][DљWJ0׆]ݑ'<=;$P[^|Ixx=_~/8Ac mL!G Mѣ)JXBXr֫{l[UN ꆼw%a'cD + c{ Nec1kf)y *8qsr|~s{&1є8E 8yXk!j @}٭5X( PGt5 gezl[3bBz|StЙz A 2~[cLl1wbmg,izI G, i]*w{T:6AF'Vdӛ:l=L$d13f9z;#hjƁB R -ҁxQB:=|~;O'E$,=I4 vveM5 (o]u)=)Drޑw|w;dD2h55HF1^DHB5}۠uCM9ߏ`K㼡|sKhֳ{ ( 9p}sW qRh ~l;0EF:QZh\-(9'sn H\L7teO=m#'g̱Vawtݶ@qYx_O5aOP-0fOްQ*GL lH&0hڞz-5AXB㻎8Ќ[ev)Zʶf:Ezȉg&#Q: ?Fpv1b6h|YAKB{xo^.@lı/6ݞs#?l軞|JJVLy(¦LS=AS\ۡ^m ")Lyk\GWlCq֒(aMO+ ĘEÖ~x -T|V|^ejS'xD6grK$f_^`?N7ag;6gѷ/*æC6Nb%ñ;R6=lΓO?yǿGVzI^6%DI|͌'W,_щ 5߿CG1,?}rR7쫂w79;駟0NPG9pJ{ OɌ' G1JHZ+d%Un @hG,'ӐS1/!+d{yw~Ǽxz( @ZSH9ZBƁDMF8=syqhlvtW峧,1H:ٖÒf5g4554h:Û}OFapt4 5e]Q6GJv#N$Hfc6 ,쌶nxS~+fzh>%)A99&؛Xizl;CFDLbUI V?XE,2爌Ç;tF-̥m ٽ|>PIsܭoV(88H^ Lb|fAhh-F=Y˂o 8͞2w>`RWAx*89;DY(!EX'Qx, BBqle' đ$0$q^p>U.˲ecug- Hb2Oo~#;n(ћ?0;^F8v-IPFo/۬kNOhD:9$u9?)6T:El:'Xmz<*$KB4 dʾݡ o[ {^Q β^cc/-]%FH&pߠ޼&Zw+(QBllCE_AY3&4A[_iw[=:glYeXP5uL֡g%3 $h%QiNg#s>z IoߒhA%<`#|W~_곏j|`Nztc<%Ɓwo~I y^p#d`W3ZB"G)g\q|z̶9bwh VP%ْ,/9Z~~tFJnq.%z|gai[bL1xߡ&SӚ>X9ZLYT)]2HZLƌ_$ ߐv3Ydie4Ao͖~N/9?;eq$Io]r!gŇHx+!͇[~?PB&Y! %5kZ>\]sy}M1)pm_|W|uɋ?@g C;u0x9Nkf9R+>yx`-Wk jHYV\,KonX6/etZqslNQނZ#ӌz,+=:?߳ YX븻ِEdh G$Bbй4Ie^+ADRdSfG!"ąU!ИHVhTHa:.]'S,L%f"% ,g˵&]qY AzR(2M ɸJ+s`ǵ $TGNCtdvRcQ 2lз CKCYVt w 1 y)y5%/+Dȫ<#c~X=]+ +Zoivp x$8ea#bDJN6Go ߰;zO]OJ<~1[IIBM)ۛ=ܳoxn hGx'Ύ]Q3}|Lna9&ݶGo-bYC9o~l6E#Ύ|#]ӓOj2.KpkZwTEMRx -~gg z3h'O$ܮՂwW,FOeВvMqx0t ƌc1HFbdpO/)˅5p;Bs~4ܽz;s}ar%5g_?N@FxbZ#3LЙy K Rv{ŗÇ4{~{nn>/Bw7W\~hy" {֎pT$##L(t: yY]~D 894kn>ܠy5e0 "ϑY"v?pŶX,_O ! 50XLy)YPiJe!Hq_boRGs~sKfF00TJ'HO?bj ϟd:-CP)GGIͬHi+-QYƴw~ &IJ{Lxo1R^ [QNsL| šɸn .N1_oߐ0Ei?{d~N99NoYַ֬wkv=wk4c0's|TJ51'MrHfp"IpfEIo ]c1{\qvqA0pw%xw#.kd"+,Z^c$7y~?6ܮ\i^,fr^P- dpZ 䤦~rTQM- Rs88v%4C7e]R By:'9!4p0 FvdY ֲF:˓ ZGU++ IA*Y<:ÀF%Apg0/4-^c^|ͻ7׬7c!K$ |N5s83HMP:╂jQaz>DGT%*Nv%_D<{~ww-yd 1Fv-y iYh=~(awEA5ӄ(is~qfsOXt"Itr1%K? msȾBD[n%1bwh҄f˫?',)}Yce,)D#NDT(IJT1G08Oo,tΡLG=5/X3?1-&ʌm& mGQF󂤘JHQ&&<lqswë79=>NCRNiv_~%O.ńv_Eӊ&ѣx6" 2KI1uY[Gi.M6TBI0{n6=~?~Gqr~t>GQY9NH˒DiQ5]o8t.A`Yq4r~, αb VkRQsfUu=YQ~(ʄ~zq~rʴY;LrQ5Mo0]ChH"c3kQl,˔nO}\j{`6) AG.8T6@Qd(}E($1(0PC׀,sqa@EG"(*p脏>˟} &C1*,z,;I;x# P%\h >pOuPe*dc# ]BgZ0%[!c5Qp!-1GO"SRYyM~|, "jӄ` $O"/麎i*Ř5n7x1GrBV4g?5e% L/'[;PAQUIXXo#˛@YTZq|I':ja0S~l`y`v{=3>K s%M-jeɒ J) Z+߾8۫5}xH)"!&z霢>em4Gi~4LcrMHy=!@UOQCdh J*Lo:|L<љY΢$H"ɒ~-Zd7-r4X9uARWL4f !2E"1cˊZn=+^@$QB_:Un0n۷ﹻgax }߭w4;Æ".x&ӊ*)-߽|fc:qzvl1%+R KZL÷_»?oCC Xp{} _ oܭ]qs}G3,C-/߼o`Xq&ak~5o~@٢'W&XVώ 1UtZdpip"땡=Xr%X, Οqb_M"!Z9rIZ6_۞iU ͛8jԤyf}f'O`vp-3Q% wQC *L wwbhְM7 v),O-X,5{4e6r}}_WLQ(m[L0@7t4Gg3YAKjꂾ~J>er򔪚"ET9J(?TT \-yQ_pvvt:e#d0MP֏QkB!asu$Fj JMdy<{m1 #iVe%R3Gc>掛;55Hx(RvO~KQ*ZJLmq.h5toi=~npb>_WMAhYou]0W-^a2r:`;C:lǛ,/Lꊡlv :@%c點vg62ͩOOytv rfG7a@#'d|vxC~9Lguе B%)%Eao~\-=o߾aݱ<9!%zK E~/?f\p1i1E'Ze$I'~ M4e@Ju)¸%)*M) 0l(NQSG |֤Y¤\;(hY|`6[RWSHubX%IV<ܸ:v= #)7?S óGdEE(h=(ɴH#BOtu˫+y8Ze%$ gHD)lȳ1]%Ø& ^x&鬢22{CӶ}naf:]].P ZYZr1x2t5jph9lw4ݮ'bW $1y#ہns(߳@؈!3 8}ēzD~$А($$O={Eb) C-ecN.sa7nǟqtV#jrKfeKdȘw(-"&L)iM!9%>b(.hCvMG %Ӻ)=bc=KմTqt|1uQ0M)/ͦM=b, $YZID* 5BjTo CbɳQ`l`;`zCw8ﹼb/_?~95Enw4͎$ biۛ[8YW)>q,QD,ps:IȒӷ6`rIJ1g9puIGſ 0ft9h$EY"⸂beXR(D3ϘLU }Z>vыXxcKFᰔm)s5r/x@^TXh*9?~~gE*ѷuFW=񚤚qvz 咴Q}'' AU圞 `4GFPx Mf9~ryy>t5EN ?nɓǬV~JHW(='xYBd\Aap8ɋ)%֏C%>>e2Ca\*IUT >gCcJ ȳG[VhUJ@2^˟pGj!:rnGdes VÁDV~x)&%7teGGӄEƲJI8e,pRI X*GZ˔D2y0}1u[J퐉 \`؏?ԎC{lZ7ۆE]!Rd$z|LM/wӄD dP,|i{C:zדUwPD^2 O?`kiv[+ҬhgŤ"SʐeR05q?f n&KMVdZjsneu9m\qv=zڍBc0Bg<]7*~۱^ݑ&!ߍrJq77W2VYFX#-FS=8?[ =1~zg} 7v[~gTU)LJKBl`Kp-ضm x-R 2'MRnZ?z۷\拏 )tvÞT9f#Ng L`o>X:kMZMXID lo9(&2?RPl7֭Ȫι1d*Ef e~~3?|ͳ'Oi-ۦez[Y^gNj0w,<2xi?-ӓ##\ NN8?9Atji~F&:L5M,2'[,+|0 C$Q%/d6D9H` = (*D"R䴦'jQhBDHìJ8_>G%9FfU#޼{G=)9=!qdjb6a1 LKк גAp|`RWTS9V=_-esozVoq sȒ(2,rMQ >\Ls;a=ZQR/2+"V̼'"\)Hv.,e=8 m2I>p"YXӸd)/2 7!28A'Ob;DH@p)NxZ*%M4"1[$Sk6SNRh0'MR\i=:5謣T*HҔUh'wXmޭś-h"V:t#d GhS3=lE&$I1h#Ip/RH JB 6.$ӋbQb̀GO|5ZRzRbn0L LsLn0{ph,]P$ 7 ea۠)p8 (よ7rBb2[Lg)fS&( l=' RSTcD>n3}4 "]9tEk !Ij+<)Gr(ZH]Udi`cO5M8Ms@PzZ}F7\hL (bjT'qI^ox/8=:FL=f?2SEqi쌣 AqٰY^Yp\sbg䜞v1֛'GK3B !횼ș4=ByU*Pgh 3>ssbF$ʴ\^]n G)3\bgQ 5j蹽{C ;^<;gnNg$e#+^P&y1:e4Rj }c{KhaOCHYTyI]L^G5)9~|L6K|5TEIS3tc *f0,OOؾ~qL~"9)!]͆YC4BՒ#!v˟i]aM/5@o3rJ?AȒ%W0ΙLkq(Y"C`ݰ@EL7=^y 캞lqAV?}ms`~<'rTQ/"' Z384dHcߓ%YV;(!N ޡdHgAJQEHߍ "M٬71~w(FHږ,)$QBUJ!՟8e#h4zDD=RJ$ߒjԮHA߷Y XpJH&U ~p\/-HGXD(**+3O+[Ή{7O'(y8Y{2ueM'`n,[Xj]Џ$jf؜0V d1c`=Izem DLs7] **-m]ؓ I+ #'tl%80VRHAP٬piV̻-BHe60ㅩ^ %21h6P8ףjxړcXpa`B4yNHCNJ80|p0ܔቇ8!NIF JlQRKC+4)!Y\Ci= Ha.Gk=nZc"8O JH0N=QVS5]'HFɨE)MMW9v Z 8δ'^X]o aZD|?>c` rJ7)0VלsXXK'JJ*0GjY/R,ГU]/9Tz6in$y||dnĘ/ vO|};+t#)N ˞bj>ͯ‹̛?#o-=1u;XpjK_E"uqr)B.rvhBha,Wk^55LhN6kJr? <|mE,Izl4GNß|5;bʨjs4 E9S%EY6 !9C sM\*CӬBau@ Tj OS5h%$O'J[ަӉ {͙0z !!aAi=Jj*[~GXEF0 u3;ٔ9#wO-vX }і&ibtuQڬ2ㅜ(FڶBk b"tS9N{6 ]̿k D&2f_kA !QPFbsKQHDB|1Zi0S P,JIi2eI79O=Ȣ.Ȳq+3*f~͎0bTIUZEFH_I1SvV81M.AXRgw0LcGN2 I|{#Ni1SnWnn ͯ=~YPV3(.5U= 唔TS"zFP:j6k1 #1.R f  ||{Rg!RS;L1s/lJ~~KB~cb(m1e![澯x.@{1,ZMQVRnćLQT~?? ׋%s(1ڰ^@w%!9{)x5j~r"@]mKN?|8qV܄a١k,.Vi ^"f7 R|bIP/?pcg?cn1,}~ޱ^޾@"&79_Yٟ8>~G?X,eM?lba6-g<8Mˢܰ\8a HE 0@q)˻5J$ۿ#o~~ W릚1e@ryO_Vx=a@QH==( ~$kruysb!U 5_nxbvaw8P5O\M(!..H0M,R` IDATJA|q.P؂aU=g0Fc =M]S%ӅaQ$ҒbdjRk-r!uix~~;DlI! tCOJ7M3<|,K2? t灪j(8_5g?pܒ%8VZ-Y㉧3;)΁㺤P J3>WCӟQtD5o/Rݐ$/ͼ"ESNHPh.R @ZMe59+Kj*+XĔIIE >"@rmfZS@ЏQ2YX,ISuEjDһFA! H>5 (ʢ Jyy|S3I̵T*ԔQes 9m^T%8;es|cٔUE?F]/qچCrrʢ&.HH]Q7 jF~"<* b l7x^yy{~]߱,)mew@^_'GwzZxMS7H)d&GwX 7fmI;3L.DP @dXlU/)d 'wTe͔-B,)N,W5eѶg1{/0 G gU-F݈M OY$C#.Q5e48-UR;8/?ŋ( C W1de ڲFp=S̝0M6H1^ԸB[0YtY"oEA{{EIB%lH1p=n)6[Ȫ(*wԦF/Rwo_rww-'~$Z?i/}4l5"/|7|ͱ?3{>??[3o^5.l<-S3>zq쐋J |ƖmN{>~c\3dɤKjegx(T$> Lٰ^5qx7LQWH}s\T{RJb)DJ)w;7ww"wG8q HҒrn ^~Y"+iv~Ji,eĪ$fڽi$(CDKͪY'.DfMFdȬ)Ffu݅(d`G)%R΄nigR㈛-q5u]B"O5) [!ZIUUG(ZQfu(Hw!/~,C,mj1-.xD||g?@i8tSۂ;L8q8xu?jgW.F)r3BjJrixņM[qpC(D&X%Ps>!% QFZQDQ*肠"J(2F nbe,ѱ?ENÉQ$aYP2{ք0v]?M')Oߥ<>ܣ3yxm!JJ<>|]Ɣt0JBY$\m6h/btd%]1PW3m3ijx~`8r cϔ2Ad 3fI? tc .rC-PR؂z{z$LgR?vhR*0ҝ\Elșy\%uSZ-ZHHʙ3/i @L[VĬ./)'G,hKwkq݅w[޾ +Zv$F[i'I:T׷ʼnVVoo_quuGʒ(KKdnX5uEK/Q|#Tf-P4+]uiЕnDYSF2Q_ L)PV5KV %~wj}QS&4 EYb!GwP"s ):8q}>܈PV|)1Dʲdrk\1Wsy. ǁa7MK)翡Y-0Z1ĩUCO 5M@ sij΂,MӢMi$ܖ_rwqrFH#^m.=Mc@IX5ٿOO9w<΄$(5OI5e}sw ;ƬB$P S z8R2xEe.+H(Ca<=yz NJgRP<>yanDuIJr8O )gJ{ϛmūVXEc cIX&7"H)IiVg @s-KfF^߭h[Kgta{z1G>|˦()Xc8W/a<"d,}ד&GJ;SB]&Ln5u-|8$LYS1|x Ջ-iwL݀Ι( !KMX[nbY1gbLޱBAQԌtP>1 n4R'"VIdRНFEKNS8zL #!43NFج4|fDD2B%E8\f-̕9x|wiae p·g(~p8)uƐ|qd1S]hO1hsjxH]wuiːf5̇ \%swUBt#<~ !Z;)P+"R&SY.Sb=F48!J燌͠B[ԈlE%9Z(9^3[.]2.~iIcryO{4ay'GY꺙J;B'ԍ.$]n "1Z"P E] [ސH)%bW\OR<zy ZJq.94ĺYfٜH~n D[lVwEH3n/s65v51(fy[LCH`Z\.yal*%b/+ˊThr<'͂ן+Ѓm$e=hV]*8cJ)DʈdqaBIQQnDf@k!eIE咲݆ۗ7a<7|x>;vgLj-˺ ū+V0lkOqG3LSe%h^}1Ά hSS؂WK^|fu|t㻯U/_LAF| ƄTW7e/v&ҶKyl/Zj4$T󗱒)3ag#Cshhd'g.B\f|Eۮ;.;fR0\"Wnex:[rachFOR$fQi#cO)?.%eSÎ"MӰ\x=EjE$~ Hҧ|Vmݲk3$ LJw4%K9oH)b (+EyW/Z$wTu1%W[MSZ**r.>D,Q@J'9!e$23|<#".dZꢠ5O!Ǚ.(=ӑDwP ~5j+:w._AA $CK%/Vĉ;;Q/5U2I#oڂ׷=kΜ[|uVkP7_EW۷bus˲jE. {"@/X#ikV[J[ +V:bز;Ö5O 0! p1EQ2u#FHd]AE, 0"Ę9cdJ raЪ@fPVǎrΑmgL Us)\3C?sf\R3. IDAT )0nLHJAJ |$D%ÑK?10 B+ AnW_S?bql dU=~fOojxQ{ŏ6Fvd7_99G?SܐL0!D% -Vb*yO2͚bG~p . Ȼ׏l ̫g%u}dnj WEEY {q~{y{/sy<q=Xm@j0Zp37Ōb\ͭ#r yG&2: |~Y.%릦?rxi Ep:[VϹx l h=WŖY>"#I1aXg%MY1؁az; YR6 H79>XwiES#h(&E YnBds20,Yp`7xE!|F5/?(LOr@;[ӝl{e!xO[7pUBFwXU#erx?+N:϶چ55 WhSqg'H4mE7uIh@DX5h$);ʐ'nD91'v9W~?mMH0 D;2N1wi`2 cJ8r:uxj 0su(4AX(9G)RPyFS5X(ʂn1b qך1fʲ=%\y)\. >0Nءf#6zBL 臉c~oB3؉t8OwwR~b{z>$VYl!'z7tÉǎU/uΌe[ERC(@HBPk˂8v]q3&C`!D&#hɢPoldaGć~)`$R]<9RI!ߡEն|{ʑ0ݰX(O)ui LcZ3[( ALmJedٔHQ|,Zf=EZQԔ&䁲, UUYĢ7 w/mºRƉ})++VİifiR @A(IS63&?>dp<F:ɲ*Ͽ; l܍_I׸k߿_ϟٟﱪٔ_sͶXBlnrp‘;F?$ՆUmQł~I$L)$gW,--x-{ƾq@Q |Һ@>M_Fk9w4~9js̎'G)TBjB2%8vGO'Ñ,Oō \^? 8pyb{RdP(︺~N,!âX.k{jL9Ӊnd5UcJL !2UY^32Lxoѥ%4 9Z+'a)RgaYGYJjM-DKj8xPE&p':YK^l-|32؀OE c.Ns6LX8|5pw{乸س]oy=2fɣoxw?\#{M{Dl] qߓ܄*JT$"ޢe*bƍ=dpbmK 0Xf[0Hs@,0l8T.ش"RDȑjpBϿO!8+3z+>h+FNODD5zDbHh7ֈZpe]hKg-0 BjEi$Rn{d gG{b%h뒶Zb 4Yuiɓ%ٻ"$fA #"f֭. J&2,9#>\???`BR?QZu8{0Yb9_[k{-lきv_h%{gpY=791K>y\52l$#xoUUnz|9zIZHVA*q=ZCϫ'Ubev+W׼z Ea9,x|xeKQJ Abߥ\_?nXk縉/[fƅqn%á1EjѲX(NafH,RL@4HSb:ڪbٮQB!dِSt8+rQL$(tY I8AȊgQ0gB B.*6md&v&A;hu{,j)2l0 `3# B28I3e RaD3&B)DfQ@!(3JQsvv)xkZb5e-6DdqDxY㝡lk ebs0 JZM2D;U 6`]B ,m[d8ృ'j)X-RXcD:khd*vZۉ0ڐ(`C]v1 wwX8;_syadzXoo9Es%Ho#.,oz!}__Ҟ=J ݌qUbdG??x?;~ӿx77LV^FIFßb5v ,Wg?y95l#_}BxFҒ<}i1 MNy ! ) T s H ZsR.0fJ9lPRb0;rH1i8g)&;rsnԼЫw?x 7\\mhaRB?`#6;Z"՗ݻ/h5rfɪYs~8>ޠdQWs8;$pGn83WN02mmW-@7.yאBpt!gJF ^g-ԕSH ȉ)c#3؅߿9QkC7F8#InZr^5Ti$EYNonys/y~"=02pkR 3 Z!rX)ʂn:,q”398yK3>CT{5EECau0ș2:8y(A5!%` 7e2 !! B]dQl$(Ц@(0d(T1ļOT主}KѴ9.HMcHQ%ZKRBMp B5Ȳafc4\_ e8ىwo^%GֱgKv?N2 .pQ\6e?v;>NG"_.ıoz0K><7\A/=RAYBR$DFP!f(YU-Z [Q2#RVl%%Enp B`;%>FzDgZQ`3*@HV͜*КӑK( ԓsƘ9IJ!10:q?Ҭ[%NI޾y8%I$Lh=%>2&A@saQ5(1Wѣd=uř=_M<)jYR%(ǎw4 9 1f'i, OcLY fI#04mM۔v '/?U]bLtt>/dUϾj -fML5w=>GZq)L>04un-ŚvH)CDL%l L`Ugߧi醂FռysQ v)FbB.V, C_.׿w [.mnءC?!#W4sՇ%'Bf??ZEӬ87%3;.ϖGW=}_vxwg U_spY{tvKmɩ&NsyQdx?2 Ţq}`G=+ڔ<(TU`jC!ȴ"15)ũcQd,1Zb"cL` H.r=},9iZ Z-, {q<,Ȕ_~?CFH={Ki(6,`*^^.9k%:Y|v c[?ᅚ-1F|N#|XqA|f F1FPՒT<&զyp#roRr,kEa1ouCYTDr,ُp;yxFH!4r'qLOVB c7):MC_~೯{ ~] ˂UH0͔,2NYoZoiJ b]@dc$J,+Q6`'lmcXj]fazVpuqճ8'NO? on@+zAO? miHoS S\A ~{G~6 -uY%WKOK^;[_> A0qQ13#&4L ̮hw;hP|"&.(Tx!Wg[(MJx?͢rT IQUE]UD!xxǘ+B`ʙ4!r =)fF Ut<>%zG-}7˒>=gh~bsq 'sA$R077TMKZ_v<}nc iB OAcXat@΢BW4-'Ħ{/쌶npΓœ1~`t4 :)R @) bq-DYѿ9b`hi6 uC?tv]_0m ak1x`h0 !RId^ѪbH3pД傦*!ɢjPjY.hfn8uZdR4U1F,vDƀ7eMS<\VLTE(U$&fnb&eݡkV5uZOaםY$Ezy5Ro8f#z($Be@߻M7rt}G5"#5\IoGGՑWS^t IDAT*G~|LҍKN^#yQ`rZU|UKuYpVӑ.Y7 ~⼥T3!8%z稴DLFxtz^mdf)Rb@H%$:fh߽pHLE>dNc<-0{T,ے*FpD-\"ccwGl)na|s2эD)' $Fr^[cO Lz Y.q1g<9*FR$)4ZkJ UAr@"Fd$HpscY9#*e&p@m?K˺d\jDz&BJ C|q.K..R!"A[W$k޳y޶5_p}}4Bi*S&T6POB!tъ8vdf%@UH)'H7SJS5#B HU4s{+e*8 8nvۿ#?9)$Ga$06OCL C L#4٠JŖ#Dt~Q!eQRV%nGK7 Ŏ)GRQר! 9ֳؑ^N{tS>[#lpydoJJM2ӈT(a:a lzٹTPGK D  +*α#bU%S=3VTYlQ6[>>l._|  鹽**bt݉z=Om,Ak#9 Z.7)tKwm˶4ifŕ$+ zb1%̑4EAì!anFS&'jI! >L&T麎9ϓ2)'&;!U=vT,[B7x7;HZPU4ja*l7B$B$BN(=C ԍt)ԒUk\">aWW"nu%(ZЏrde8[.L4fߣ5シBɚO?uӰ\.H9ꖺX"ZfSsvaQ%v=74#ʰ< ̕3}O q7w'o}̏33Dqဟ:V{>{qMqͶ}X ܱ{Ǥ#iBD@Lȉ'?<><0\?'{y<#'˒gVMOOqINlyEȢn gj ÑTWjA۪qjh9% Uu1 F;vB"MD1 =>d.H)d9ctf%G^β?vuA8}KQ5x)C{ͻ^xgG/~]Zٖwp&%%}gO.+rYlj" pylL5_dqRuB*4Y`HЏÁq n$iJ%uŘ+3(QO\E.* Sq1쏜5mQ3 {ra df,m)5 %`pJqhEY45Ȳ4<;"„ Pk'` 0pO//>%GwG#pj6qpfw; x"3]j=SB3Y˱;e9gp3sb@"6rw EǺPRP|zĩ뙦rڈʞŲt=tD%)jKIQV- e8hh z:_϶[T eU` T0M0d1 'Ab{~iZZJ@QW `d+]p9wv.!p RTU( b7&ȤNpx9U$PćB  S,7}O'2Bҏ@h4(ɱsĎϵey\cdg3n}bbUUsd 9u@O%T4uycXh4ZT1REy'|@L~oNLN6pvj < @)1yͶBŒ)ybDP`Y *3kSǁ!$R)$s"e1M^V@TPbGj˙=e)BIMI&LFc& S٫~亜oqp2Mj{ O @YdLfF?jB bxq9gyRl(2g,j+ѷ5 "bm.d9_|RbGɳWӵ-H7w~m"j$߲ͯX-Y ccf9>c%*G78EzF1Pr楸HKHHjQn;iB5Ւ$|.F)`mdt4tKOX0ޑ{vOHL oGnT޿ۍ+ūX1Qo_-&ljEUtcOe$:9q9B+4HotD`:<ş_ fۍC+zQ: yii?b4l6禓\eQ0M=で'onHf/Xh >p>CTg Jԏ{Ʃ#%=*9RL=rt.S>;༰0豅gAU.YՉM8hR'^_lL@ 5yrYA\W顃а*K|SHI'1*6=jb]LN Z%B3O2N|x 4\-`$4R@;BL 3@"2Am #-DZ&Jʹ_DNTᄏgqpO0R)I jmXdt,ͤDE1iQ%qG*MR JOI1"5lj R#ɣbKk=)/NOXݱCfEsY.j>{3*(Shւ [Rh! 4!:D  h1+#qOV Ţ*i[&gu ƒ~ rTF(VgW!Ќ-&:CeD|yE,M6K2+?DB繞OcR}jEG|Dn1|7Q%z8?=j>alPFB>[!$3IO;9UR#EJGQ(ve,Vӯ-@F?;ؔKT:kSgsrMkaپNI<7s}}G?s/jΏI@K3..NJ$r) G9F1Njh(^` *Jo>KanY,t4 츩mCx8+I?0R)qU7?vsۈ-4Jf ꑷ?~7Hi@Ja7 F?˷3F cC}GnhCpQ(5!D(?0;KD#:1Y(*pR9y>ӳSV>LFB$ J|@6%"(|Tt4@<$?%4qװ1M\SgקK6 Ƒ1ڙʰ^hq`xԮco#kBs^;ξS|}G+ضg{?_R ?lO.{p9Rb>zj~5JJ%1D q〛,(<ac@QͿkYR`p7Lv4#,JAUW&zd&C)E!%sP}f\rTZ)p@=ztI%H&1ymm'?aQVB0v;ۛ9>p7o޳?Hhlhqcm܌Yi5D 72Jd7Jb̉)pĩkfh"($|v`)K9 0tG&ȂT_WW~]4 {Y,3IE'|-9<ٷ ?_=*E^\=_KW8oZPTY6c|wΑ(Hʲkn(z9O>Bm22L &⹘fbA(Ѫ#;;8WHzk  ;75EEJeyl7{$6$Kc__ds9a}('(qa)Q/\_خO#nO1ZLAM8FPl覈*D0Ĥ8v)drВdE-,Yď#L&T"+2ؒ#8 .FcJx%yF3ggbɉXHVD{&md%dk^W-ϾoX+L{ѓeXedFpUDu$E6+g3XJh,8=}F6zf!-KO!$6&H.sz'ֳSsfH:QJDdS,WuTsL!IAV 43EY>|^ք -B+L!dDER4Y)c ͜a HU8r]yuϩ7~|kB <5rh,mi)Х&v<˪@Vc{beQ0e'U3c\`exncc`sDJ0E~+nON:Fbgx,m?~8 2נ}?bC|&TsZ`G(ed-5SRg,MDŽ1 Ρ5d'HH ju<P5?|0&F?i6ulYT bLlwmDDKD;Ii h!>y9drnNhÖcA D&'J9lIЏCFRG!eb3&RӍ#'*Gn$pwD9ߔ|GnᦉuE&%4ByF+ S#LRECIIcˡkzbG6 ;t4ds顝1ZSk\G2;E20Jѻ@?XTM$SH}Ig$ޓ| -O )%R 0R"+6,bǑ  0 ']RczvT9)ӳ ch4Å95-2VSٗL(=;f-Es5p, bDdej8Rqf(I]Q᧞/Y״ۏw7. 0mfha;/WX^q*T<90J\RKV ïi/<_RWlH==جK % Yۏ︹cZr_h6Dmio?9ǁKZڋEU% ,fUIRl&ę}G)n&cQUԎyIJv=tpdɊqٷȉ#yfXf0oY9%j #ah\^믘\=l9H01 eyQaRhNNr ɹ[p=Ij÷/$?|;}W\ H9e IDAT5L9 ~x zsx"bP@c?2v#(Hɉb;8pV yN>8Ѭ pQo[\b %ZOxe8{?ى) )5g_Um`NP>ggV ui=v3q}YZ96-4C$8?҅ (xqK Xx`YF;gO i\^]%pK #XDLHӵx7"ZbP%ŚrLG Wd&Τy<;t6?Lj1*  U"'F\醞;m2lNW<dž07 "ĄHOߒ9qzkQ(vsxe㗿IJwaK=Td*(2C]/8v#6b3M^y|vR_|yhYs (]A4SbdlΏzcX5r%%9Z{Bi:?+b(s̀u0yf…y ,CgsA98q!k0e>6Q Dh]9,ڔσMQ@ N,WKO`m2;0ź` hEgșƞxK$󁇩#)OдkE&?kS8O˓%84FȄ"\|O?6X/j^=i۞Z)]iiqSOs՗_>rz"y|Xfu}o[dr6'YI ?wonXFDlV LS'(k>aw욳 }Eb'|(G]!䜉>jP2G@*M7Ϙ%N#qO47$=ra'Z|^VH!PLT@Hf$6,j%AJ2.0YIY%9H="zm('2PF!FLh97 \&p08 eNQ̟EY"^beF ?ުaa2/.)OH:wHftVb<>mݲVxVTaآ#E !YAk-&EdrN5?_>,Ңld'KDQN(3uI.&cqq$/3HdGGGiϞH4qNHh=RD Har ")4Bcd91&noל_&GU461V+퇆f3oYB19)&iHsO9cLHzkhZGʺ";&)g^_P*ޓUŜ3ye9<ᧁ oy|ӓK9g'k9 h)9==3'j!. l͌,Ŕ7MH?LΑ̈́5;8?9)mjcx)95O݀U}GV ^xI5olT^Z19ͤHUfIdz%4d"\(eȋ)̏ drq%FKbpXg)5KFѶ &7eF#QJ 5cϏ?дlk)f6H»04fqvkiSϯ?\)hw?p5~#?/{VSk7Ha<,P)r*9?3Lγ.if8иJ0Ąʹ}ǏįnLGp?4\]cCz1kg )&B1U) 0kq@h ("(F*0$T\ָ|D$On;6B)9vCpt$J)Aq]'g5i~mf`EO 'B+ l ̨LJ\2\s߯آ#tF"o,ì`!Xn4mwq^Fc` v8$N$&D IRk1LY d^ ATBk88a zTJȡ[Z+Ԝqvx?,+prr7|Z\ԖJEt1RK07ߓe9yfnG* s`u 1=~hiQ;!"urgIbp>$rEʹŲ& ?963.ίϹ57w_=rdfuv.VoPRuI yY@8KKqOK#? G*Ep#Nl e4>q4e'%)fd G6yvJ=]7s\^CvT*RRQ.EEӍ|x`yoCB5KzQʪ"x>u{sK?yƛ⳯>nKQThǖ99|ΞF ?N{qӄ tnhZD{> H ]߲XA*4HJZ&Q"!㬓)ʌ(@Go ̋Y- I%hRphxM@k\0 :|ϞSf1+J/M]mɯ~w_3JJ򬀫dtqh}%բB #5:EeBIa8?15,w6H><&d4d$$OM>JiVr io&a2)kt&iH%ΓRD_B+V%9A\cfa4@?%|1e>ƽ%1 d @e]dCf!.Oeņaeԑɍ %,2eFPf=NQx.i;1R~# Yr&+fqΣF)ᑤrDl{B &l`%R00O;c0i3r@%QXIaeT?Ns~q5߷'K(Ab!6`?1aɆ4Y; c#͚"SlwwLQPU }/~z>IX\dpnj0n.)뒲ʸذ}˶Y5a>$A) bH!>>rՊ=SH ;`!FݞJ%NNNYo o~0v\mJN\^oJYbjwC2, 84ݜGz88s HLRrҼ> I ί)d5m4勂L4eAfǏ=cmqRq~qɻ$QF17$9s;Wu 4f8X4IǶ9xaZHI! @OUu9GFY®V7of~Ӓ)gh{ kȌi}li7Sqz٣'|/?o>{AG[tek/':ajVLqDF0E}҂1 He2GGL" i* K,$ 5Þ#]װ(he`MB:;lƘmH,:)pnϿH!h%F[Nk4CiIUa_%w/Ž᧟n:O 5 (Ѝ<v"EVe {:oRF;"EI"y&{>¶l=AER g<GQ#g63~jYG&50F6к,H @2ftZIn& <2 kl#DHNj1RQ, ۣcWCBD݌HqN#PCz@kȼp̬e:k*zYe,U1Q=2>F8[q|hF@"'댜1! O覗!JaQ#A_Cɍyɢx{vJ0( O@g ]YҌCղq,R 0#TR $H(c=(!&hSZA Fב'j2$]ejɋfh}Q舏Ui!\|'_~A Ś's[^ҏar)Zd֑nG7 LE-44=4642EdzU)%)$I¼4$Fy)/_s o ]~I3nFʼbTy*AC^H,,gg l:9bo0zndٜ?xHYF9֧ )ԇ={,a#IjdDifb6 9=kwN~V͞T%h%77HfHdpGS9=9a1s5 ߵYnxɎ;e)g35y`SGL$6#|'?|Lpw T~ Nd6plo_11B^ bRw4}G"$>:F?0 ]Sۆh7 9js*]4Vf8RB"HV|ѺV=v^m)ɇ}`<|W2!#*3[S7_ch:Rrh[zkHRI QkϲX0QSCfh9R:2M˒3on?)\Z_۾*3z?_՗տ$+-cWt5(YBm(2M2 ={4%7vȀ*wE )D+35a}$OKYl`B%)c;0pIʒǺ_?ǎ$O BQEAx@;_J<5#If*- ڞ&ׂ,h;Ԕ>öe" !'=A#ݡC%#ijy| A76}1Dk"3r  vDO,%1?/Y%&E@B D%$Kf[*7;؍ IDAT1h+)7YJRI1P$ %L'#Jւ,71J1LZ!AIZ&p$4+^^20 &HT$5z|YXYQ7lښb6/Fn+G˕!2Bp=.@f"ey-z!T 鋆_qyuE=c;2gjBK{Kb,y*p)4";oǑׯo8[^پ͈pEbiF#M!Ƥ ~[sAV=,>x!`P]r6cUH ;E-YXG,N ukE@0%\J)yNnR4*Ru_s!onn @h5_Hn\]2K2^\?H/ M{WH)Ĵz>x1 xNY,gk$IHf㣤{Y,i֟ ʲnb(k 1t-YQv!!bmn{~j@IEH4cףlF>[8t(7YBi^͗Y/IſO>5F)IF~gGb"k4Ua?srqƓǏ)V'׻=]`:|ZJԑ4M@й{޽iuIDccVxCc- IYJJzykہv4au`^Q%|d:|JKG{_|ÀyV(r|4+/#FqRM9Mxi E#*:t2! tеhh1HvǑsB_<4;Ģ9ٸm2;kQGBȑ} ?'m$I,dD`pwK0%tBDj[Uȓ 8GU` ZR"D1BoApвSdVDFz@$=M8t#}cR8c1,!߷t,@H"IZ$@U4xK CG#!=Wt.0i g-'9g]F-e*HUG_H%J3IV s"_~_9A"rp]Ӱ0t+*$)Z[iBR)o" ,dt`D/9sD e}yͫ H&Kt-/7sȴ!ȶneuN9uOzf bsz&+R|3`p5Ez? C{/_ Z(Rrr=l S?4vZunX-nW!ډR*d0KBvF's1t|6Շ=5y,ONI9w>R` ޵ľo M,IGqZiUX$ޘ7;f]-_bpqNbj,KT(0,c }9I( GXOȋCǑiF\y< ݢEHSq (ay(m=-%Ǻ醀pxgO?7cG']EYhyRQW1NV%2#^nO?`ZWaSbD`j. m%8Nn+#ӹǗh-F xg4]KHw@ۂ]=P~rE)cap3r`ʜ tprz$ / ~1nÞ'&RZZMc4(1NE j }qt!DѤcZFͷYO'o tRHʔk;*oS>9?˻kC>GOH~wn ]LNքƀ,CԨTS.-Ji7TMaphcIC5~،DND*Ձ>L) E JFCp{~!Ӫ=K$'Wk(w='D(Sk6_~_}4a[!Ƒ9(NCKvk9vm̘7AFB C$Ɓ,QX9qiJq)/cI5!:Z#W R+:19$ޝ t$$~ ӵ= 4)MF)w0&5N=ձ (MJ$5x0FA &"JD'g* )2e裧O0#By7&d){33묨"!؂ i={\s$K]ǦQln(Uy$x_`jzZ%Ȅy)msD0 JRF8D' `Y|UƱi:QZQE2MFS$4+ /A6܀@fZl<]ǁ, CmF2K#z֓ Ssn_ݞ2$V{ HIo)$yŚϹx~5gkMO]<_gՊ_~ ɓߡ語$ܽ"Kfdw!IƞiZiu# qhFMnH8%Y_rg^Ҵ=&2kZ\gDD>NR3Fe5=2Yѵ; ~_-y|$%'-<<BZRX,'/sXb*8;;EDKV- ]bMBGדd YAȳ `4A(DC9Gݴs4ep}Of赪8GaY.>\.Y.x71,PtBvqzqAUw[w~s{ >m@y#HT{Ymhcitkձ<~HyF4mMOjc Ղ )/n&IqSjNONɲl :"o/atu35ZZIꦥiݐ(c>r ] Cprѣ ,(2q!D4ݮ:CG̐%oO$gpׯn6m1htW?;_L{x8r'dn 2Zhږ:Ў0*@ kv`, 6%_Hp~i2 RsK^7{ MA 0CoXrAл'4c(>L!*\NFa#֪}c"XmM?dsC$BΣ h%J0S S0B=)&2}}H!JD \20:5\T6Undh g'fMFȵ@sՁ12O{R=BIX)޺HYcRl7]вo327x?;Zhj`#@I=X%QG8QCQswʳ(!+ǎ'28}קs⺆~uMu c$Z8]u,$)HRAiVKBtTmM+ZH(w/if2ȣuAX+vylV:+($c%CN .&5Ë;R4y43.O-;e_ly8lZWs޺3=ds].0&c(jڱdON)qe HX!cň9Y=L~iZ0_6,4Ak_1Li)%}?GV^%_IZV$}%!+r㷘-ڑXlbZ#i:F8&'[d%x:SrwЏa_ l}@41[$rc Y˧ԇVe}ױ\޷?d='87p[|pXc*)3qsa(x;߾fEJU11ᝫG7ǦFZ5h$ [<{qϱ =nxquuQDw ZxXſ7?O8] '.g<<T  E \(qbPq_ઊ,%[?rM "DO7#A Qf)y"C5BZF71kv{pr>Ǐ8#I4)E9G#m>Kpk^⧴7U;m'@jsBp4mb0L$m9V ܪ,0FD#`TjB~no"Y!7p4}MT X"C{nF#Nm'HF|DIk*N;?:Ԡ$mj trb$+%1Og N:(t@L1 RQRGF >"(#!NU&YXMj%D n's]jBd)ۖ=C ͻwiXd㇆]۰j^1Z:"}H$OQ a KT&qz6`;@E1 Q㈘2jϘd`p=RlV ifɵ# 6 ({4y"JVSF ooB1bQXoF/Iij۽fwhrwzw?e1|V$_"ut`4-H˜ "&Ql=djuH_R.f\^9˓+LfsZd#~ǗW,*$&cPaa -F7,,KxkdYJY,'OXӓ~Y45/^Q%VsN_rrFPD~~'oP}U3cEӶbvTGl~xu8pZSsl28I/XX^^qw%d' fbWH1&a"/S^?PK^X|1:@4!4>blo_s?w}]S)I]p@^늾9"nmQ%JK4%y9^ooc =*]9rʳ?93~ ^?7#N feJp9YZ=ML฼|8)$B' ,fY@{8iEu1xW0eh#}=λvG]8{gk>|_q>% nplۑۻ;feNb|7C\saǞJR;?^H 7RjINO#{D

"8-hǖ3(eD "N`aRc"Nf#NB$;M2MPo"+8)lZ2G9*E(%Jlj-]&b?`:xGN)nt|tD(vݫ#f&c:R5 m2=5o]]\-=wz+<3}qqF'ǎnLd>+7b1cNˇTÁׯ}km]3fHs9⺖Lume@JKS#8B =ew,g>!KI1 bIjl!tA,2MHV\W'}?b|B pCORZQ5%Q+Hӌ&ȫQ]Ʉ.xn뛞 %~ 6ݖӓ%>x"zÑrAgD1W[>)wo2rb4/ZOiRH!HH3泂~KD\DK~?[,X;2lw;ŷBTNh~0Mۼwu؟:\D8B.62cؔN4V THyzAr=?zvwْ!zE76e 5J)n#g+<`X T4Z s;C=}Ţ RTh\*l/#֋-/ί'Ϙ9ҍDwsv7Xk!FRI>7#DQvG$`34+'>ʇ(ibp䙢*SΗ > ~Cc>[r>}|Gy?MO;7n?,l%6H9@ ד+? H}+ps‘jIUQqD#RI5c?*$Zp}tܞ,~b툋h DZ2rV%nW gz@8O%rZ #<.^:.dyAo#!F23%Q8 !{48t'R^sy 1whAh]-/Y_= /Zq8޳}QU(Kjuf["-g~b;x`:p: DB ,Ka!@ D4޽c`;5}߳ՓBc^jdƇkvb()fF/l9ѻ٬WoI5 diFU.(Ҍ' +^~O? m+a{LZ|2c)WW:g-e0 ,zFGlǁQRbGWo 8$#,z@!ȓFss{[O_}CU1PמaKhێ7\oy%kN^|MQƑ\H$Q҇tf/ITNA!%NzxdsߑfpvV1a-ER]ZK4DF1 /xPHɼl#`Fn+PcgpV0ZHäjgD#@QI6H&Ȍd-Bj4E#*X԰ZS:O%tz^fBMx1Ѝ->T eJWZϡ $Ér, ͡i r(EJjEL0W܀I^nhۀ9<ɲ6 C9XX,lQ OG"RMb8 Rb%$:rj bQΆЎ( H;xH2Mz9i?~:ñ!U.Ȳ rM$Ai,a8bsǚSӣt|@7w#χS -ʈIҊǗs"-*: TAݱFV .V31ygVٜ25? ż"_N0zHhm <|#f"Ӝ-|]θYnyG&)a1 G[NGA$YDIïCox7T%^HvuCV_\K$9݆^slZkre_{4G~_&0'W$IahM c4i(>gO(*+I )%1z ~d p#YEfX^!d|jʲӁ~lIt$_>?/|/?͉oX?xblHߍ^"'m@6n.֗kDɒ< -_~z`?6MC87)#uӑf9Ah͎b=LJ+rBő?n۷4"܏ xBNh1qF2FW7vH;R枫/8{QR<8orzoɄՒ="F r/HBE "ZoAˉB+ $:3F%\f}K}`Y`"})j27#vh!9[JbUU)Ia|$S2+5IcSQ !C 钢dF*CD=< #@فEQ& zǡTF/p皧 ,bCM]G YOTP*p[]$zI\. )w"dEc QlOC0DHD@Eqt#% %Q@@ L*Lь{6'p `d.2 \( Bˑ ̌'Ua*Ep7:Di ӷ= fy|j~Þo,FD~YNUz^0~alsr>cZq{>ZYՌMC vZw 7 YՊ`xH^)4eET=CŬ{F0Fr^Rd vhx<*zh\S]G#$ˋ_~yz]A`MRU3rN;}y&A8.XT ~4%g{5)CdsxK/ x`6NJ^h$A$dɮ8萐(у xzɢ*(!YJ-$JQ7\!UO%AUd_\ZIi;(p$h9U}H8veE80p~qO#}_**L^u@@~S3O<_{o*_9Ωg+ӑaGju?6hcs Bemrͻx;޿}|EԒm`-EY]+YAݴ `;~ɏ.]ď6;>ѷG""a12KǞ<5,sDdɯ~EUDo.!3$Z)3E{˟/ B5gOY5Åg HQ Bdl;ْ$IZ!(|*T|ĺD HQZIb3N}>#yU׿b[޼oOX^\?-v<}/<&QswlC޿kiN#݈uxJI Lq~rH=>w5s vp4aPGSҚT[d .ɢ#DOZB$1`gj#F  *G"#!DAё*Lj gɌdH4zY-2"zh5m)Ȋ#& BF%,b"T!DŽE'ZHaGB@qBa$%ȉU{M}oYi,uM./_a2\ p4Honyy32FA^(Ϊendg4ƉLz2,lǏ=9HFKAeh{YA쏈qxUBS ٬D'sVrv fI^mgKfqh7$J،V!Ӗn:\TUq9 ;/8{ps\e}e4j$TAj ( Nrj7b2tݍ,./H )S0Da[PĆ#L'^z7|OPVj}F7G=aO%aa)|>݇=nI(2+>pEIVE6} ɜq%}4C+'8_hۍg NL/=cuꐉxaG?v3"#f:D`ABDD7u?BO9ha$WDɳ XQfk'>\o[(^0_.黑\c}^zt9HG Enr,"Ks>|Ewxȋ/kv;~W,H3wRmqlz4+ o߽g^S*qDa(eh=E=/ԧjf cmO9`!09ر`)˂$˰!ja$KR(-H`1RK^zK#|??!+ Omqg(Qu-mۡuiT8F"ijH\)`kj9E G%~Gרh&=Zh Mʕ,&Q1iw{6$RCVYƛ?iS-/{(CYN6 URSXlGggRtf kl)(m km gYs IDATUFlpSu"Ӥ3}G¨iO&tgV@F5Ml l*(u@)=|<DXdbyߑȲ,rM?z).*86vڧJHE2" (M^!d Q0Sa TfVeH#ސkMƳ4]KX-s,(40Y{QOnaJ !.D:yJHKpnhaXJ#][⁛MC3Fy|Vgw7fUHdӌlI)H@Y4`b@L/d'mˡ'$]=LPjڧyg (PR=E\1ptqoFŀLTx&$ABj>Gr-9֎4w̗9La=2*FHmH]xbQ$LkF3łhiQ#ϟ?2v-RTJuR!'mZP;aX &OٹbA#e[; ~lY- IT\|:l 1Ni#LKb>;CHE#eQ0 v)Rg;K:ʴ~Ci5d9c7Csñf,ft{l4IQR"COG1GTG<a$Dk^0&S1Qm;h)KYfaӱBS=9_syB5RXK۷MK3F>~'=2D\߱e =!jRe%<$,a=u唂uExP!2*{O$FL  * Y" ''_JH i$:"h" (N(<(H0Q8RG>FV:PIKi :Jĩ# E@8%4ijM5O1zJ5mϼ4Yi*T#^H%<|88j0]Ɍl.yt ?]p뱟uY"gY*,hdl Q"E@KAi%''STK ZAz7T :'}="[+Mq*wuBu#w'o'G ~d#!$("N:&:1H#E`=Z'5#D0,`QI6t"b/`/"+ С9In'4QUA7F\? LI1rЏ04N2K&ڎO5wu 3D7Jrbl#GT%c۲XEв7T!#P l-%O5Y.ptm1 2% =!N~LÌp96S4U7!QsqqI27|i(9PChE ?0sht(1QcPj|g{v3_ *ä3N 욎DU8Oц9#.X_R?}=\^QTy~NK=A(8)QI ?8PdJ1 RV%sN&%Sj0X RPU%1<|=Mݠey5kDwE{H҂2IhN;>\>X Td\K=!$d5YC?0f7iBnU`nCk絊$UqɁ0$T ?0%Fy{`GP"/R=sI \y iqssC78Vyl72+^#@Zq0Yr$-r=Iy6'*'o7Ȣd$2U7RyIUvG >MÃsTbX9y{NuKdc#z%? ӊj&51N! <1rb|I;cͧk_qkEUEeMXf Ráe7F !.271WŃA (1}9[v]dAjU["ц+n8#H""\W YΓ\Rw>"<НsdA>ݖmz:2K*zH9ɳ)npVX -CYKY{|lT2Q:;DIXDt-6BSTC"$&$tۭ02|!$Ef^s=1 $رw"e.x4$ZmOGʒY57=V$2w:A\K\,~l ' 59G?tTN3n*ǯPy |2ӈ"9WI)RI>᷿{w?S4]KU V ]({OS^OĦقB;|k>o?Lg./X&cY1 $zvIQ%MհkZ%c }S3)YS%mےgV94C#ܰ "K1VvY=-"ci,$`$8D猩/9rJgZWICB>QB@$iJ ܋j$m׬7kd0K\olˊX=y7߿F!l>l^}AońɒP$*EJh,S3fˀM6jKus\qyH+kC~ews=R! tjc##Q cp!p ލ.g %$ 4mIS99߇cMԬK4}K|c"ϱ4 &0BԔ>=D(ۆid~!w V+./\^,x^=k?ݚ5#Ӧy702?~B38xӯ/94Gӄ|m$Af=JŞ6!A גTD|4m;0it "E"c@\x*ъD'% ʪ#<*(ߔ\pr˱m<}$+X.s  N=xxg_a m4iGjO:zţG\^0@qg "7wO/~DV8=& 9OX.OHRqq~A"5MY*;6J\x|yIS氣a-tڦĮCCs2Jڦe9_36=Z%YJ0YQcŸsGs* =s|֒lJ0H-rNmU;]]*CG8ND?yJ N^xONF~z{ /ޒ(;4x̒ڄ~q}A؄*MH MSh{l6* 4Opa="rlc8fvDvj(adYN%=} =d9pwH,hIw(QJ=eqrzַ;p#9RE"0D/q NFØ[̖̗q3l uUSw=_xN۶(ǯd3䴃cP XgUC[(%x!PIȋX^IҔ//pB& !j&R&8JTR0[P Ξ>ݿ?[6=dFa޽LiBrqv‡ۿk/~1fnD,OWc{8GֱwWlw;cEū/qqvʗ_Pj20O"y:*+R10 &9c} 6Բm4H3ȋIL:47{oNږ?|K-Ï׬ٓIsذ߀v(J(]`.1z"/QcҔ7oޠq ߴcX[hڎSRce>Ѵ\x4 |I"/( Y>A-MQ4"# =ָł|U1a:е-΍º,IY,O0yR[0%Hmp( AZV t]5#arA5\ USǮtuzwD&e1g/_py"-6ɩȱ0Xd&R2<{?7WOsN?B8iu=y |tZdEO #Uvsp~}Oj$!x|V3NO(k6;} IDATv wOW7dD/|g'vt]=2qX:| !2<- w Hh,U@+y "1P OGd<++HCO'>"EƬ}DAc5d Fjqz1^PefHTҊJ &rwq<)uSֻ5{׿7wmfSd%?}iQ ݻw׷<}W/z,d(IDcÏ1'|zO&h0:a8%9>eM7L;l7{C '1c , #~P9Oww;͐R ]7`Cs,+MPvB*v%4CI (UG-WWLS&'+TH(ݖE!j Pڦ'x5Bh[1Ι9n>rso}χ-MXzo&c9?/=/g &xCu@$O5AL ΁t|p̳Q8Ky6 ,'M=AD!jR: 8mbj!x" TDxC"D +Z#5RDuLJ*P HI1Udy8Hy`U(f!HGӵpԝnƯT菕#QD+kj/{ *xaID$M g33 : Ԙg8l0[LT$A0H kSڪcs7V)&EF$KenjSϹgwt11k&\\HnJbFgL|Rmov{t VZ2;!1(>4*c](9lmʦX"bAJCD",G*֚iFft}tkf9}68)Jˇ*w[N4"BpFI={P햺9W -oڞ˗_*n9X# 1BhQb<=eyhM1`l$- ڮX7Hi`!'lţG4抡k/)#YXCbE]Cns1.D>&ln{?=4{T?}f}ϻQS>}J,o}n7G]Ks,Y߮!Hq@J;IR 9/Xx7g)yaqC$Iɲ$IP-Mc{Ւ3N(uyQ ,KIMX#IFCu(PŒL'i3 qBqϿXVMGgY3 IQڤĒUSQ%ROlw[A)U͆p`yz|beyÇ<') i>A<<&~n;n{BXX'<${z]Sb~v͏i۞l{r~t<_dJ% ;EH$d*F }T"0HI<6'I䢀 B`G7D!"%=LJm϶taܲt[41$Jْ0j! 7"У H#!Hl Xxz,,uRs27\Y`v) tC *=cOiJ:)@\ Hй<ɳXiʆ4B(L2; 7{6o|qsy9!fT힬S]W8S$ך ~zG9t\[ϾG`e6[XŸnto+^z'Slh3CG0[x9x_rw5>={+?q~vΗϟsz+cyomiJX2YX,WLgK'Vqk<hbP'<{1ڕ0Jk#͎@gy;6;#5yh9Nh;?6\Ï?b  O=u'sɂ-$XaA$ŊL v@a`.DK_S8+,-!(HG"1Tpm@z4}[bdL!Bi] ( @jG/chD3K X98p‘Z8e)SȄ"Qu9;eˡi:OcwI @ =*fJk>r,#U@YD1cڱd<[Dvqt_AP*HS$L6?94c(8ՒB B872:b*BHYr:K~ˑ*hcAd o~`RL,.wwe}uw^ws1_gXW_ӷM݀dyB$,g3ɂfwCN l6CNdu-E 11%AZ.g >t:x':|(2 mQ24 l :cLWd2m99=gVL9,-^-Ae(INDȬ{<iI lB6+(/_bpسM!wY€~}ǾPYۏye#$i=B[ Kd\uç֜sr~FSwn~O״QRRDmxKV-QoBLf3h9O Tڌ V|ݏx/Qd9^}<Ϩ{/^"LvJbda͊a$iXMXWtC݇4I?}[6>swe(-JqdtDߢ"-Z-sttt9a@`!$Hڄ>|<&`Og󑜚,FiZ}$"Qh'ґ# 1=zLdp-C똛\b2FDIд.pNJ.P7=^bX:" NjD6]dH*RD(`-C&Qy8jKd֠79zRbD cAj2k`P7mƭd:2fLR3ۺ#EPueab۷60 ab{? 5,ZiΡJ<4GFFgA1vԒCED[! g>d9e2]7 ?+_`d!bO˳sNO3:BY]xDo0>faVP DjkjB⪎fa:mExPBK bhC ۖsdYJs"/FY(-R@9G)CޏNe)J)At8!RaS)%8z!eBjWau$ő\ v@O C?mH"](8%+-O.Sf!$V|=7ۖ/8T Aի,ϞeS=uჂ">`Gq`hV||xϟ2a\"uBfObzٮɵ c.?TH;-!8TSUIcAB9Gl3@,cxkQ٬8<ޣc<>4O 0F/?cz4Ks+vt u h t=x=0 Lx{MHʂrRR75q,iM :q~l9.QuGv6L?׏Ŝf V%xZy{{GSWy5Y65ŔZÇy6tBc6xox('S!*KbJ .T㍲w\`~:=J)fHk\\\Blk3T1C~ww4mK&y4y|\$+) 뱦G딾7(izzs.i6=2b)S&, 1s6Uϛ[6ѽ<3點Tǣ8"E"lJQDt-Yqc 34Tu==T8IM[vrCD[7_\߷$aX2xr@8w,89*-߱6GX㸹y@i4 IDATwX3[,8:;[n^~9l/ڎ>Qb+gybގ>9.P*%R9i1e{D)z۷WlV+v7aybyiCG9ϙhB .xX'H֒mgh*r)eD]kPX'c8e, Ibxg Imtc,;Xc1Eƣq2MGK'V K~ {1(˛x<M!ǜmȇdIdP웖\4#Gqh;tкXcv=:2h=. Xr8 {!F} t~EJ Rϐn `pa咮kjq$?JF dd1Ø"Xϟ#K;`t:EdΓ?Okֻ !3lvlOtyqtr:[ A045|ƬJ[T}f9 \D☨SL( a|PÀo/VՆdJ=8DNdhhw-dƩ(bHa*9(iŘ*ah`ưn`cV'UTIl0a8*9ܮ[f$˱l$jxY J X֞)&.M7tݸfcM "s?ހ4I¨p3Xu$mOc$Bl0DxOUu`A2oX&B1;!o}C}pN}5=//h;,eY]hvۚMij[9Gz[!DP2}^eF$@ S;5bVH HzH7 g0Hzz N (Bia?@gMol:'͖sޢ"IGI=)c?AmuzCkk9%{c8nw[M%XמIZ˶qB0Mi7x&YI ms,KeHjzÀ HJ2 R z+1x ư?kC{)A6Tp0m H\]mtq4Lb(2QJ#vX.IƃO,%ΎUB+b1&x)I>dP"EȠ x4~qIEe%8:u?vIo#"ԉd^$O5{nvC0|S$Y`h5>8<5LQ1ic4m2;x[&)/{G$\)%=R_]Ͽ} O?!\O-f# oێ++!5Q EcmnGD̏Rp8?כ o]$B߲>0[LlKW7$*&1'cNGL,QųO?BzMmx䛯f'g,dA'2k49g$Iд=C2f8zc07˂l@e9qgJq}t c}sswM5I<&އnAs#,#Sw }l Ns "q(.5޽xGR.kެၿ7Sf}1',q"eDdE2Vٓ KbAYl!ɸ7yA^dIw)AHt0x\o叨XCEo=^$lvg}t!$f[KJ/;v`;tC]s@۶cY6 c6,Ka϶k=oo_gE;?m$MT-J )T-t}o7AJt>9%Y.9^eJg 0>)ZD4ΐÏ,(%#zs $:C U4L+ uJ[q(\9Zٔв=E|Qn;Vr_8;8^Vz Xc36aJæ'9˂dV>=Lit^vW_ ^|!oXVl7xQbqb6/-՞p@_/9 #GkӜ,1zӌ'(~OS3LlnR)m70 XanZc뎪 ֐j1< K0]7P)dNqɳQu Gu]lVrH8u REW5(޲:mtFTxu~c{8=9ZRByA']Ֆ2O$),rÎ;}')S$g29d x3pyzJep;4F2;g iږnDY` qrr zXE1б^>)"0f`hX1mv|y1%FiْrR59iC!cڡ:C'(ss}Brz~y0 i3MA0MɋdBYL˒wްe14g1[9h/^pzzF_2t}Oi:]!{dͳ>9.B≼1c%nPTRfE~w:=CIC WT iR U3G:`R '#*ONxL%EdvH"h:PA%M՞C! Qƫ;^/,g%o^ϴHGi|QS-)2|Hzc{: 80:vdxBчpn itA>K~[)B8kY3(J+vUǗ\7<!p׿x V NYmP#lۑir>HDŽ(%5łlw)~K-áaZSL\>4x3ǩE51QkG~e^kk,]U8:ƃ㺰('(ɡ{F1/~÷[Kd9ikzտ="Sv 4;lqvO/7ܰP dZrd'|g9)Y0q2E RHxJȦ |on(G~ɋSbo;Ώg(!kio2N 1)J3Y q>8򄡩oW, )%*DiEhzN3f^j~~HE8l3-/?h9eǸ`IUWsO8997(q|r+"IGcq,BaY3̘)t *\LKe,Sd8pv !RxoFCm MpAtCEU)tt6A,"o 7=]p:G|u}zqJT KzV︿zb$~)B DNRb''<@dSڪ'8Kte‰UGmc=,g]K:Yq]G;PED<E Kuh?#!xqdLe%`i-E2\L =²bF5Eϻ#gYĔ:P(KVxcL"F2]0fJX1lZi%-YNֻC؇umI#T!$MRn=\E7p2S)fhӣ!- =(~׳89¸Tzuf5t9 :KXRoa~>eqT(QO5҄,+kL߰wb184Z@*%*8RJb%Y|9g9R)Ֆ1o6|/ ?)y6VUE/ N^Lx~ͮnӐsl<{\gA0ϟe3DDo0}MIA,4o7n=_OX,ɣ@RH"S19ތX5G@rz,jQ0}ߠ|?w u1) ӂA :V߿=DD)hz~euOw/9^\8޶Q*TRbY,:44@1S9kz\c7uC%˂OSgx5 S 1-K`0M#T̎Ju]-q* "Ag:Ҭ R{avL'"3CH"mâ,#jZ @y4IXָ0|, lƪo&ޯx%fY]rحh/ʦG抗|IƷvc1fiZj:!.3LIC uΎ*jqB$ kx\X.Bq}nW-df7DqLچݾaV$xޓ-i>߲_G`[L3:($/7k?%M FjͤP*>T5qYBU|)dERX=:%D)?^=`=J&_>ZvmEK"c߀wccRk8FΉ ǰ0s5+1Ȑh 1,"2iD"R۾喓iAY]#8B6yāSiٵpV1P,%YЛtzJ-OkQj\%̴  " R(˒TdUˡ7B`iSHK `IdBy\ϸ6<D›MC,")#ܮ{ʚ]YW18O6DQon}ӣ\zy ΏĦs:˲wAQ yOۍʹQ`ۆ2I,cQ.9eN{q`!I%$ΎB+hǻYaG)~rt:a6TY>!Q93R!B / ''錟i$.p#(&S&S noǁӓ N#з=>t`8t^є}G?<{'(f_5{TiK_l{aCl@zG9Ɉ!Ï~Xa B Pt kT䓂suz5?cdI׭#]^"3#E 1 h H?&_`$ȱLh5UU)B^ő|3=",s>V&sŋ:Y.g\Z~_PKtg ;ĪPUmU"`BQZН:+Pڊñ|rN'1V嚴ZrD4u'PSL|yƄ ".h%5!fLa)%9F? Pi:Ĺܱ^hs%޿;V5 ⧑l)r8Cf?X[Kng۳\/qeΘn/Wh+_}KLU! 'ŋ+^<{tI`nY.$9KlrfmҚCV%]@ԌH%_~9Ն3喧@XcZ3#C?P<ӏf54G?\]netM# 78Χ_|jbmyZ./nלY"bE9v萲x8#u?x?̪g 9 )ĔХAF?:bjN#ZLQj1@? !<hF .+ n=@$G[**RDSIV&sQ*DܬݑQY(ϬSFIgReXXgvc1+IU(HiJá PZOaz)UF%O5G!2'C30;"s<֖?8 'N*,'= ؔ gI#qEU #ә."Ĝ(RsvUhc94lH秞;q )5Tv~֖mM"3) !qZ%6kv]a&8r6;?)%JXDZ[.VK 8F8܌.JW2uoDd]K.ԬJe"fHYBdt#UTbY)*f>ZPRROzx^>/h!y*&ω.+.[%uiiBӈ /Wُ9"݄) !rdŢewwE$n`$$epwb i䪲|Dbro8fm-o?6 )'?ZkʦF |bhxOO<gA%ۻߡ *+F Hb qB*֊(Gmk%_S )"S1&Ӟ̴/^ھ )JU P 4?+VR- ?eB7irge<1(uQx"uA^cRWDi>ӈL`#NXQvIatԅp9#O!"޿;@w>\ǎap puy//_0=<#ԋ%J)DȚbL t$\z 1+HbYr"@~mJCi,99[4$enHgn Y&cvƄ<($˪D3c,ܻD'WVKT:cplZwpJ\$v]s=~m]Qj㙘0 灂BYJ̧>` 0Q[.13ș\YC? H0e͘"9л@c$S ZdW`&I$>$$3|&7G\Ku09p88(@ÄgI`"RHJlHt݄O7WR r5dM<>MUhԄqBMcYI!NdNiw?=?D˒brŲb6ώaJX7^єorF>@x5P+~OOOȉ+]B26GE?okݰ}[ chږ~v5wweK7A6Tػ"QS\}A`qχ,L~fh? L;>K]RHSX c1 Z lvi"b.6&i({ o#zxޓfD[Rm1 gYb}f8,!EPEZ?)J6 J aڠSy0En3Jimf2pR gls www+.5Zj ? 57Ȳp:ReS'tjҚĚxcQlV[N#'RFOZG)P-|Ow:+*BX0g?H!<ς$$TFGD#g"°$9RAba2RhҜ9- FG&##1sR9-$2,KB&4bzpSCc+DA>&nz#j,PFU'Cq ℎ"^ `Ȭ\}8r@I6-n8!*5ϕjqs<'pZ{03 Rg8 S,#IfӠBs&DY7,˙@RCg3j*Pl4]i˒ILY~fV#Bs l"IH p˛>?G^^(^~;D=Ea7&Y098Mj`'%b`?ML.Ֆ矿ں=_ӘEUޠu]P29h,RV8SfX4/^,rmY6)NOEnJb{r) R 륡xX15#j}g7-!vH]J<Ii{7bbU>?#߾_l'\HHʪr8d81 e !giB*ͮg.rFO8#p$RrQO#>~G~wպe5߽?1x|KfDQrGiH__cXpP| -h%G?$dIHتÙ,Z\x7!B^/ٟJ|Jap:{x"9`K'hJY#Bd e|ܓRbNEp:Ǟwl S~+Jk軑2E_aixA Ofx?ErR O#j0(7h)4)%g+~hVKx%?޳? $8&&GsOi D7pVenQ77xy̿ei"#`X DJ I,YJ#!sŮTJ)HeK+}{-q8Lk#L#DrpgɀBbd279s3~ȥ@ىM]1z~E0tĩ*`(x__'; en'=Sb?%!u$~u3/[< bQ[ΡDfUZ  "Q-$iRPhE]t}GPvuM?rc ̐xf0_%OOYы~x?7RD!2uiPJGŜq10iz5J3*  9P'S Ie,e!Z4% !]G/$_=+l ιaa5"1LeRBI9k!b}Q~o}GS)QҔ 0R!DŽ)%U]!ma⮃.K4e~+LOݧLšHQ&-fI](! Ѵ5o^nw\]'? l5!۳Z,CH(?aُR$$Yܰ%o~͏S8bB-Fk_Z?],n8qyϬȮûODn:489W 5"EȾOʒirTu-^0LDݓ7w^jPM 6 (!^`bz'sFH- \ҒJ|,|m*oOh!yq,)aa&2Z59er@͓g#r^a,rn?ӟj/ŏy Dv18B>cY/JxsMS4Up@J0=i^̯ߢap;rެx憛 .W 겠+4Yi ι#99bƤfQ38$^uB];Rk[NG֬V#SߓD[l-VřJY87xjچŢA PRbmp;8;#eUc!$YAf0p8(3H> IDATus+ˊoy%/n^u8(O=QxFʒG&7P2ݨMҟh ) ҐF @M)eck(`0!TA@8I0zFaT"*(4q1bD ?=]8=:G:<lMt:#?Mbd+fLS*A1&q}!꫟f41f$. TY3 =yES0Y ?2i vsZ./.%!7 c+vAQ6˞Zszi?Ro73Jxׯ.쀔T&f~ޱ\5On꯵%n^<'"J{fB lU5e-s$H8GX"Ǝ|fwN'д1ϵˋ uCH.!,/3ǧGx:?=X |AFq<>ݮX>R%IW3A&qO.m f aKOOӔ(%b]+HxA03fv ӄ k fs)%BB΁ͻx" 0N9pDw9w9_o nޑbDHM$ KmpɑC+|FDb ִnc.\\?$ƀgK֫m77ϸXs!ٟza@0n^A"l!IPZ6hB0S?./TE109bOL%.bJL.̤wk O#B)$( rⴟe, <:N{xSDCYyՔĦ5<[Z R'Ļ#"}T1򜃉08D)s`QeՂE?Ef >JӛA(mQZE4` MkiL.QVfBL]Eʒm]c* 4+J9jClS$gb/N>P-hV oN Abhc8O1b M]sR!ŀLѾ8 3iYJYC[/aG4&..±=!8ڦ 8^f8:sXU$" 2傲4Ī>( ĉ6 ͟MEJ3`qncG֫%͖XVeS#t%Y(9wXΎqh*j, L ki~#h%JϮW7yFϲ0(579zm޲ެx}d"$nrDXvXT{zhw9^"Ȁ֖g!mY4<sCXѹolIheX.dxzzs%B0"?i SOH )%6%nbV()nbĥ,jk m a7P$ 2JKyViZ ">)ID14 [j Tk9< Ab4PT0gRGK%9Dw;iDU0 93Oc]uAQZB/qǍH&ZCm RNn4REz΃ԛO?řYzi69”rb:X֊Zي\ n^4d{!_ɣ0L4)f<@sL$(Nȴd-ci75a 7J޼\Jd@kﹺfO d$& pΑGԒwUKJ#>8o">UIXGLt,UD~|Ӯ/y+7\kڥ1F21O2ϋ8#Z i,R Spp%߿H[pPƒoq ,ۊ_-/^,4eKY|[ubMDX6b_t<<|n˗W~xqf@u)2iQJ2ܕ~1JBOwdUN"10vyRJ(i*4ǧ9b4HAŪ<ƑUB Ւa LYOKn?}Vf;H,%nVV# 4j[ k~tt4%IA?Le(e熖V0wwt@)R@I݄ / OG&ցZ 3iY inJQ@fh^,4q0O*)dDY^ ;c3ݘ9[r'K@Ç{x?V9 pY }Ǿm.@!ljV'J+j&~ !H!qw]"qPJiiix2Pfdag[..Q;L=rAHo'z^cd 2}jEi"A{d7*4eI"kr]ش,\ÌO{]2uXdQY:7R+5;rJ4i 1x^\_ǀ\(.FihK4gŬWjnA%62pu<` A<(|8O!۞skJmJ5n"s EUӴ jp2- !'p{MΉi 9#=T`2'VkM`֚zUr:DXLסtqZ CSV2ͼڶ!p>eڡ,ۮť1Kc`aU萙C)C+)`U3YYo[O6VӮ4/ 81 T"VYU?D?FKO@h _@˅ZSĵl6 s,~y$]h3{NCɬbUW$5޳˞b!-gp/|+aNjR#""3+V.|[a<:f(˷)ޑGVQDІ, J)ϹafeZkm ΞvmkP`!rqkuAd2m?L,ӄzBLKiyX~Vlլ+EWI6&QUԅ_3z8zDIs(xt0,''xD{}5JK Nxv&Fo_ݚ+VY * S1dn7+i̿햛:n׷+ 'R̴xHNOtʂ8I3Z%+8̑+j*!BXuve hKR)Q/rsadڨR}GR*z[~R,VG c ݦwWz~Ϸ/i8}{bm443=TtmKe+Lج;v-77;v6݊Ҵt!= ,Sk mcc*ӥ<נ?3 ) X1Ch]$5G1n;lUlR"h Z>}7O׿"%G~O ~傐 !4KϧO?@F6`|CUiԷl!?'=> s XBj)p7Η3ݖX$Bʢy'50xB T-|ʴl !FkfW;nooʁGH.3W+O/JUئy(_+M}Z&l`qc*Mc R\ g0.Yv6+_8'l]00/_}KPhLc CJfjXoDžlb<l-)L5{}UFyU59oHYae1G*[swv\nhR>bmІ$kN}<}BugQFuZRגX >bG}"F vFpS Ar2KZEJjb $ 1C"#9,*Y4'1hKt9S|v LHQ ZVY,g Jc2X1ӻE LHR`DH*qmK%@8RM*M!# JDL?%64FSU {"^dd[*5h* (xqq$3R< GYT1VFR@dH,!2,j[\uZÈD"]ɺ]!^F6ٱ,3'TRLn1Ү!I?|a B 1[9nA HAC"D4RޓS)yx}wRƥi?/??0? tȧg38EŠ+:i?vRtHY-9*V ]O39Ri nwE]mߟM]&! 0#O{nn` ?_YBo^#k"x5Mq5r`jۆm!|M  Z_/0zF(Gw{%2|fg65ub\>H>~~y 1:bh-OmyEޢg꺥[[ww < UU(ܦqek8O5nauGR 4Ȫ@QRVȪxu H #-4 vGJq9L>Q*yd\iC)2׷tFieکdF8]JTH>=`-IYbLx T<u]xCZ4MlX蹻Cd, i*|9z޼5`t$@ur8u Dzʐw,!vwqL!Eo<=?Qc[\{]I'ݖ5>{۪#TC IDAT ",S>rVp|tdv+jՎ3_/y\;B 5,09htF5 "wfVqӊ.#}Rkr9hm%1FfBպfW%*=*jͺ1Ti!ɳRj"sZ_xiSQ՟Oͪ{?jB0%xrilLVEVbLPGn-ݦ6'_&F"nu$1U|4IdeAijI!rWMW#(2L"%Z .EZ)H/UU{@_z2nau%2+(k9i5wqe !Dd(mVDB<8iq\ V+@)IBCDHYM Y*RK+ʐS$Xt-Gi! A]U4FjM J[=8]ef&F2n ; 44c&\nfH^+7am[qp}b{{MVm Mk)c54,L c433]kYZY޶HnŚ"蓢8LEʙb`&[2-31$\#$ebYfm*2n‰m /G6/EjppӅn㑦bUq*ٕm,1~C '2RWNgbLMUHT޴mSM_A4MPrxzzb4}A\߾2IfS PVurer(&DHmd * 42x1a8#y>i5q:fAׯ{n=z>Lpݪb|U"AD\%;yu+37&`+|;: zljNqnhf*X`YKP:E`myNЎJ6ZsKDV\7*:3 yxW"4iA2j!5EUpgΑ''ȮbsdP`XNx`+W7}`44"8*-hlU**ᆉu5qFPѮV.CQɺB*ԄE Nt3 FJ:k%D)h8 9]2}?rU((U&,<`41zDBB{1 x21sZ hT`PB 1n֠RØTu]}!1|)8/Hp] ֕g-3r(92y`4ZޡfY~DzoÅ$Վׯ׌n y"fC]VHn9|{mӕ_KPc] 9s>ܮyժ+4ѶCRD+6׼{H)딈d`TCA'v7f1?N)Qnŗyh ֚"Kt)`5}ߓ1ʡmgNy $0oO|{>?}_c{W*Qiq ؅ҏڮY}@ LEGtkCϏ?5up2+/zK=4,'RZbjTspmy 77/#ޅ5mOil7 lnurP;IPj_WJJ.#;*i52sxu{Ǵ/?3#vU;ږŘ.ba\ƅ}!e1$S7ef?528Nrk4 `qg[sQR*p8p.-!U5|LNOGy"#cǞZi*qzYYucZ)*ax><ϙ4BU 10Lkvױr_ 8D%kY$91H>V"v !Bd aZF 5%J%T8z~x2-iEfjѭ ֖a }&ժaՖ+тq3ad?Kuhk0(%%yX o_5w+i`f$} B]?ÀW[1#_sjiE^Цs*)s%fjcXYem*mb/icF:֒t-%  5sq֔5Z$-G`$ Iop1Tu6va  hzSw(1$#KԦf ,"$T*һR% BKTld%.\T"an,RFZ^"~ N2ΰz1p:O_x:Ev۞J;rqm6 j&p\??/UeVҬZ1RBQ9 .s´QY#B #,pD=Wڦ>3,p12B7-HyR2>j[Crx?gzۧΌQɶQP\=0O'ѕahA4 )31E*e `T  gԤJ08I>8ǹT0ێO|p<9Ն"RFgHAθy¿{+]V{B勸x9~J4HUB?|WoQY˧ϟhՖ@6ZCO&q:^pFֆ4!n_?ۛ;2SLhmQ)T.8hm%DyHk^}GJ[%rJ4aqCd֒IB aS޽CuI1zrT9]Lc+le,½p 0BnF33eKQ+\تB4/<(5(U:(% #)e|LP[,P28!sP]ݢIJ8xaxDjh_<1 #8M#v[8Gڦj.Ӳ~_~Lв#Ɓg.+tMe7,2L|}eONi\H)S{Q7aWf7Z_Q- s8 C?Эl:;.Gv-O|x8a$K2 hBvւ?rt]'iUf=I)6mz$>L¶mö|{͒B.͊!` YeHY9&$QM.D9`ebUEn5Yl=On0ޗx"Lve=88#>?qfVFRɄ k 77X"ehI(|*tјR ֐bVr H# M]v59'| %IK@iôM[#(,BJ0kCU78_zJI*P (Vr.\m {橬kD9V IjՐB&FA"3,B8H]LRWH]brnG03X MU>Q&A~^$󥴌r-Mm^Wn ?~`լv9r}̪(kklc#O'~?`GbO'.'VFLJ $تfLf[O?܌i0?z*h+u+nZ&/tU/䋝hE Gbш9^U S2H%%deKxǥ^"ǙlT.N(2Z5U- 2_|2:rغ89.QDA %hL> P"|[X{<gFQEd 9#*L2>Cƀ 2X!1|_`?$ cFp)D"9T"8%rt*%JRh2&\VcJ(Ro8okRpK`|YP+B*lnZK@EHp [\b`/1&9K./㺶TFȬ7͎Sl'F vZx (t]V;.߾Aq }@T% xv`R*Rҳ Z['j,US\{,.qXHF7be#?{F1-p%tAɌPĕcė?Oavmu2ϜGgHAP*E_hB(rN䐘bBa]ѵ+|veD/( J| ,y^B+Kʅܻ?|3N))޽J&H% !BŜʺRmFHME* ,gG*[s(cXwBBt%4a-s/acڔ,Mh)^^jϓG.yUmW|6z‡a+NCً+lj3##<7b, 4mgJR Jj xX\65R8G~WXn!w ѡ\_]qSDǞ2M/.3 =4Ѵ58OCO4/9| T%BF~FM׮ t|>̞]ѴaącDIV<+YId蘗zX4Ipra&ꪦri)?7&uCe-XBHLBrJ<=D爒 ziX Z- 37Vr$okֲSyl*D2"׮%J釄T p.5.@ʤ+rѼh~$ ɴ$NFv?^zUn}?Èmض!Eƈs").//@03˨%A4+!8aJ"@ڊ$$1)PVtE=%!J͇/'#OT"[ڰ*q40KewئCR) >C9~ !R2Oi$˴p>i4OOMW߾ʼ5?<,3;rˀHRTۦ- T KFTEELKuwu+<ͼ+_Еe|tk|1Ɣ4q^6h#1JScMӌ,Jk\LhcPZ3#/*\X80g1'RȜ1Uy/sLӈnաdYҘ]bygnzҊǧGvB̧8_.WTg.fC/;BB@9[Sؚ*j*XB̲DAW_!0 ђfe,U.&J@N5j1G.^sYwdhW4m)!>/2c7ٱmKƬV(N▙I2)QMb}3qr $dy9Q IDATzTcfk7dysyP65o "|F޶ưKnULON .i<>[BpHȶȕ*XU%ܟ!\(h7.,EӖhSֲb^q{ƻiv .0ِ-# h#E/0J3.K$ZJV5-CҟX\c}fg˯x~;qr4zӄr m[p9xzfQcH Z%|pM%IH ]XGC9~d6/3KȟKJ9ND2' cB`_(.FԋɿT6D.ˊpkWwDz, R?s{sC,uً]Ha&LQd t*x7TMlg;lVB`ʀ J)1/.DJs 1VWgӞg~_cQ-EdH\0/7ʊ^ݲqXgYr9#|s]QϤꂢ("TAΡ4M DrAd.Fj;d 0gZ[ѵ5]!kJu|Y,G2GqS$I|8l`f;mA*w?SׯY7 < Å(p>RbznB-rK0C57oh?[|ȐU!$MGaiH(Kͼ COSH8kQ 6vqK͹e_H~A ,;3Yϸ?ilv(i,T2qhnM'h! 4Rx*h+CUteѬC$F M)])KM6yt%UKg-Vm6mIYhb)&z9CABM 'Pmq2`7zf )-x-9Lq99’QaT(" >r]i>ZIZi)dk Z9Q5(#̊Șg"1ZQK>yfU&9SHUH7aj8]F0P1_l+AY%t$DWu^3EjMs8?>EF_&Bq_ڮ& qO ?/P`gIQ*[ΑuS+#>ؓ%jU#kRv۫BEbYHA`ђ"S:\D˗~ 4%)Be$)F\Rl1Hp2Hi8G9r6⺤N)qQg4vp )ەSb^K8Zcv]q|s 0^msTR+OD9x B%e":O?E#0Ղ1g]Y잞Jps{ŴLgO:Ob. MYm!M  S5>ƜI<[t,VMLIPY'TTg.(KQTU98/O=Bjonyx,qg*u^=(Kj#릦nJ;8{_bv)3ێhNf'PU, Þ8p׷ s:8xU#ZD?NeDM`nP/e4.=㑮8]F>i~ܳY2'E䆜Қ۫[n߳@fi]Ԭ7xڮeuH1.mci", ~xBw}.jt]v+RAWr>N/jD H'L2*epL@_uŶ4R"v G* ω Cd[Iޮ k Z()pHHU`HbD X!+pa H6$ FP+7.J .!$nKRLHXfܮ s)p8Oe27UQrٳ^G + efURӵ W5m:2Z@WiAJp9NXVD&뚶,vƇRk-T$ES!J DiMi [kzEJ)|c{ Lg <.'|cޒ>B%ӄ[îy69?PAj,˒çZ <>@Ǽ5/ "[]CԵۮW_ M[ݜQ ɡ#K>I(GGX"%ڢj[U XΣ%BkJ)1 -sD 11"#6!(Tush 9FlTNbYaa3%ǼRSNi>F)96Ct%lYG'8Ya  c(ۆqXH&qf[&yb,Ù ͛- o_mT.@$'ޭY+Di2B4|DF+ y U( $4Sc6ﰽG)I֜ƙy6g9ZyK-jC5\ OYU?.'RTLLΧMKӔ 2J )"ZxOÈ)s\y2[U&Rm$JDY?| 3+PEFa8SJνpl>Z1X<^8YvΎ0P5 *%s|c'bLWoYݱ4pvg*XG!aծ_&Q;lW\oZڦr93.hEUR8ֆ ~ `ȱưY7Q#0R$D?(8=U.Re@UWTuI$~\m/_}÷9R2֛Pn,Q?Yw&.#!lB)ϞnhJe8g-Mk:b<<Pћ?#ZO =n#MTuGٮtt,6R+n8p9вnu'#FǁyiqOf258s.A)~BɂsE[ =w0A8v€ҜOOݏ> *1eHQWٹf_$ uD̆grIuԊX]-2gwV P*r]H>*ZU .4WuZ.ܙ,umb`}F_h|훷mjt}ztī7|1J0G_ۛ|[λ# )4Z&yN U[ -1ӗ ]mDr6&ŻN)*/3^IPv`AtZ19Ǔ]PLB`C]wRE~qiF@q %qU\>-09!pI+͘XfŖ׬ێyΦU[]%,?.u'QZX(%ϗUQQ5uL ?,EXFPIE4B*%ُX$/K>ńI9w 4A)IqYׂFӖ +gYR=;̻Ocp3u]MŪTZ.# h qASiD(li@Do TP )WWNBXʶb5;hӵf˰2ʐjQ/O|ЃLΎ3u͖+ ˦~u'Ekt)DB)MJiȘULBDʍQ-݉W]E%2yd\<}ӅHJ j}~ H ) Kඬ,39K?T8UKv(tUQB Ey5B $؅~X&ip)$qF Ii ԒDTp9ᇟw|Ĭ ڛ->euué?dr~'B_VH) kb@yAg_o1uAJe鸃((l1fC!jDѢOg+Vڳ{>)ů??Þ߽fU`_, v'qș _TeYv($OU*/G~'n[>}}fBJpD6azh +Χqk13Z+˙,>1_`DN-#3?!uOeW(ʊ݉5eS E I"SĺHI邈ۛU%”%)5sz[Gj0$I}JZYrap0n7-7wo>'/=IeQZ.۫#ꊻ#owD_PEҒ李5j9|LJ#CmB t !f):J:HXFRFaJЂ"2@5d K2:Z j]'530HY'e$0S"JI؄$R WkD˒gOdm${݉~0>!B51O _?ÉVDS5%~06ZBqa2 3 lJE__-K(+E`c6k!IT)~`~ e<{hXT/#J rS"$!QLUs"(b< IDAT/HRtDU-x:M|-xOxǔ/1AW(XǺ) ۶(%HH MoF8ysבYwI{>*!$Uat*htav\x%47SaՔl7k~{3Մp9,}. 8خN0/3U+"9N8wff#OBqwsf1 #1ETQbi>Xϩ`+:"T=.~8ˌ ]10O30D՚ 4#!8UɼDUj1,\z6s#PI*a "^y?V@dՕlu?Cɚf2pn&ǞiZ0EPBUNT a/kMӕ|p]6|HY׼}M4L?>)̖0\{B 6y9G܇/󫒷Gl$sI]+_y>PjnqĐÜD?$/(uI] Bat>d.01kMLaQbi`wKI(bbS*چ-@&" Z8"6 fHVjyfݏ;?7O'_/)^]OͿLB7Sd8yJSQj׏c^_wO'__qW܏HUچkD3-EHRI IJ؇\l򃜕lDFa<9V54Iƅɞx)^ h&BI"(-Ala[C>utJѶMz'OQ:nJLx|HelOOmEX )*P'.@tz\ZO#+AD,lIba]J !!Bbc'V bzQ3%@AD=+ɕQY2/pdGKOy 6 )D,)$ˌy>weAnjHhc{F RZV[zR%M'@~ǫB$8<%u !$}'ˑ=ֱҰޔ|5 Sje#ʚU*ooU]+vdw)+KƒLg|;*M׬!izUcChɹO<]<+f6k%x~Q9yڰd.%eh'C ޱ;,` )xT4 S`<۵&3VBr22*FPpnF邛5.ʼQew8/k/<ov>b.( MS]AߟiF,#ӓ#pwhxlDG3RZ =l9}>/řw>"W[ݺ2^$S%R/P-Fk2AUM t\h~'|k ӈ.(pGUt)JV .DU,x>phUfMNge l/'J7Wf "UUc nFwno^ѻ׼p RCp)uQlPRiMF(Bd_gCV0s8&Ï\Gjڜ~ĦoX|A)jlikLI Um{.xpѮ{OĔ^6GV]U7:mE|޳41He8cG/{osdp{21&RH)e_le]&6-a VWb`ryM2znp( " #T|+Bg:P!e䙗aeRSZ&6D`^`IO.xVs`?姯)ek_k^ݾhnMP{~M%Hr<CW~ >5_/7ǿXӏgKL*3n>YHRCb-LF!i*Mx'+DBќ GI1WxcfϬ1a$)2_+l3$#JᗅuwLXUlV-BFVy= \b]YDX- iGъD`q$%qёTO1z uAcgMֆ2YntķOs='>h0Rez Tf_(|5oa0#}/]B F"fU/W(vh MYNk7?dt|wNJ(D;aax%mb+F {tyi2e{Jb%Pxs\^]<9a6.wi%mkeTiMGUH[ P1qiGNNzq1$ϹbހP.nix4&zfE:cۣe +,YCu<A+AhsyA Պ48b[3wKCHS>#)fd. IHryyh>CHMw(l߳\ꎮ,.bwˋ)of5| t6FZ3M5"#y;39LkҴ=ǦA (4Ls,aKF$ӎ]A(!Do67TZj(đd1%/yH(?~+Ր1qN *u%Ek9Sv0;y`<(7uġlt4aXGS7;P~btuU/O;g=[Q p PY,gT8bdA{F!VYPhHcAMK-tb`iĠ2`u8z7,NOQIB1s~} ϝ廄7?0xo篔mCvU9Y$#C;AJ+M_>~û r /_JHbzk3Uy v-||u$BiEfl=!(5p$cw:ќ,dEF[ f1e9=sv}=]bkCo,H$eZKEdZji$G+G/xM3TJh1=Xj,Vܮ Ug liZlӢӞ, DA4&<ARU0P; ecZ`*wPwjizDJ" MӡE e.H;0fb~vJ weGmtP$ DkqE"kձi^4& цXHbqނ7^cNzR"rՁT-}κp*Pd!6E 4!"GGwl){A'AB;Fi7-8F WWD*",Ȅ8N0C أU J%Qzi1Ӣm|B% zk #usp:#d٦ѶXݣe ٱ}hV&)$P5l5]Y'"Ȓ״,3L!W\_LRo~kM˶pR1;;Jn  \\]$ %I65ݖlT<٭DR(R$bI%8Ӛ$I drg!uD$zL>myzx2M齦:auuxJgH_ʡض&O8C$-(#AXbk-K ̐#`IE>`?>p5\f{G$7;Ñ t<巯R~8i6&"ܵMSc]@khFӶTog_~ONY?XRI7J9i#R;KVa=N% d1mt=2Hb bg`sTr1ĹgRv45.^'~#Pt{CWct/NǂSN\.N\eΟSЃr! ;㺢 +qCZPS~]t.Gl-y,9eJz5-}?d{psxS4aX̸x1e,xFve0!tՆo9lj:cp"KK"04q4"If<설r[B"@[K5פ,@^,S u˱9\," ²in; IbI H<1HE1yc\Orô3xgj=Y<0N!6X2)jH>Wp=o<@ϓ OdYo̓ -KR|ul="Bs`rE_BCItcLT8c,rm YJPXjXxo! c tg>ZP,'Z*$:b,E$HZLD\_bMp@ %qSR$Dq󂾵ˏ<#tA D&ipD k^Pkn q 7 ]ǜ/wW9g }3V<>>R}u_ͻ׼}s淿oo~3'''d'ۑ@>u~ȽTı/I >^zCW|:V#l @kiہsCYG+fjYYcMǺcޱ^=#I)v ~`i6[d<e),Q>;5tږ)垮Ȳlb@  ߖL EZdrT=lMۖgDddc%бkK( lXi}xdخmִuMlB'ضa~yj>q t1z` NrjwPfA C-$oߞ_)*`|`yt3fdL1LF9^sɈb: ._@%1e{d<4̧1Y.rt3Eq`Vh&!=ʃ8lI њu{˺(8bR)ʑ)G"=4"5sTՐcL3Dp:KGm!'=I֍]nRG'BY@KIA%^ z5NE-x4-ZCR͛ߜD~?RZ+A y4g^D 6`B0\FdY1 c :t9X#'({pa01Kgx0r\3(e1N !,}["yD]{6ϟ:}5ЈNdqN$Q-QqdJa<2)bݶ`>V8O"tw宦,%M$:':~aJe;$uYbBRW`@P 8pBID@h}p8! oE9tnŒ7 IDATbEK "!(ɒHk tֲ:&Ж*X,L2 tmn{:+“$N2f}׽`%iYP>7 /5 M TxaYĨ3;Lq4q$cqEUQ*8I4mUiq ÚbdqrQ`^xNRzܣNmˏÅDiƳ4wyda'r<B8Gg?|5DIx'x7xu۲gXݖf7߼AIӊLJ5ZFqL*<#2f!X/(VػX&< mu3N -'QJ[ 9t<M_7towmEiRP9<ŋm{ÚSEJ:8|0]:d7X> (CX 췿f6 ∳sb? DϿ@Nꚯe6J[wTE`q%-Ce N&4I'ȡN PC'w\F6:Ok;d $lP$?֔m>L2Ea{8xF9h-:z.s^La(l4;N#*/O ;~a"yf3k#U4[{0fX/R& N !Z5L7K'LgS<4u}M4AVWޢYnTURS5_o8kh #=mK$t1%Q"U:"c{c-iH# a$xĘQ!{!qr(e54&MRjmch*C]u]KDyF S!UQlC#Ox_˿}ÇKN&נ%9PAۀA$$D1E\IChRћ,+p8ևͺ=t>0I5ET(ieɴeyfJRՓ&T]Oc=8}=^ /2tτcs_~t?^MbzKo$mi2A,jG TO U8j^^dʰ`@|1#Ms4%A0).H|TMf;V$iNt}eHn軎$ ŒdF!Jr͊;FECy`cfyBH{$.b2=m,]]Ro|W<5H, d1Vi$ TU i0R %bhYK{ENL"EQ7 8ujJłi(@TJ&"$QJaT,đ8T=-8Hc?iAPϢm+"%4đFAw1I\3(;j84wt'C,qICS=B4 !DQTfAùG9``āE"e@EFmւ,g I$"h+zZCylhÚ8ݕ8//Nޱ)RŌ1 2麎[;6tN\`;IMY&t fILݎ.۝i $Y.b?|/ytXHpg_:aÇ\^X?:'BG1iw/_&#bB@s,[z+"yMo%iH \\-4I)t}4]Ɉ*pc }$ BKIc\=@$pQ@;vYJPA. "lD1IA8'+[|1 y4 L(;B[t6v-Oox|E9]gPc% "ֻX9'K֑.\-WlWoݚeb9;d B9<@X+%cmOJ) kZ#xGqJϴ2'xǏ$֞(u[ڶ˘pyb)OSDZ3R_=i:;A=H (BU4ϑ*:gz. D(>>WDbklKtds)8`#$}Jc"-ue/IT$BzK)z8tѢ!n:HWt@2|?. t@%QiИ'By3zXu`C0X"&(,qd^@)- t4xF>ljqGzK='Gn1U2$(R5d홎2tCqkM7 HHqBg,V(iۖ9rPB1_"['ŀR"Y݊w? O7{x}5G]Yb|L:=WsNs>ݲ5E{K...Cv,RG^ 1S5J ޾\ -3(]07,3&%{V 뒳b.In. c#lȆ:u@E){J5 N|K7}H$FyWsIQ 8*hPQ$qDz#A1IQ"#Qd:k[ʰz\Q.L&Ȩ}̮6Y5koJaV0Fz(DWfX -!EOc9\/ 9b D}bMIr{YP617&+\> ɗ Nfø8ϸ8w݁wƻAjWH)Bz4Y?Ȳ|@xxxt 8c4)*7Iӂۛ~~2X]{~`!Q5,XqG׵I֚?"6eِ vGwܳۖw?ʆXHcIpb9 _׿x=~ay:f6ZRnw40qǑzs:crx5<% ~ a9?9=ij|)+f]×{fE#\?},tH !%Art=:H0:%|Bz&#_v{nʆO;Q'bc't CG6lQhoMˢϵ)-Qoص?xç{^,G?`6xv|`TdX)a?\_] 2eO%?py^qu1g_%|u>#-%-NaA??ɌgLS8yf[X@w'L^0YQ|}cbU{Z9EFxIg @DzyF>r,~k`-%0XUpEEJ1qt@+9@Zmix=A*0}t9[r%8RNGړf)(wfI:2qF<$[yX|جW'XU'L4(h=ϖ|/púom5<}۷o8Sv9gV+ݑ43<niۑZLQ y-wWՊ2`SaFh(<@jD#D q3YMJ2-9Kh ~jaђ-|jD0zIg'4P'>2y#08.%BFٶaKD̰]:KrsHiD# [*VeI4iQ`x<Gkx~pKcfIWj6iN=O!aSAg(-JiJLjA0 O>Rwmx ^J2ubq3|zb-4_n{5FBY3GsbH9R,SA {&IX=Z)7]|ou ֍$I2At]G%mh.Yn5to?|#`IH*L0ޢF jn tnRqD?LDj9 dJӌiղC%\@ =YL>GR(JϾ@Y~y7O?%+R..ˌ$7[ǖma4"J`%+I:p펛:gmG?YB(!Xё$u}jL͚ͲI%}7PpW;|td*Kb`KGU*&@;cc'0h}%];!' pA;Nh:] 6PHA.<>ZBScґn n42 6-# IDCպUIB$Q `l0 M*tV 1r*H5qW 8WT"K4F_0Y0f4+gh`0ZlL4q1Xy[cH%eI?. IDAT!($C8GZBg<8?GfiH*qOEnyfx8bx8*!~05lK?{Pɣ }@ىӵ:臁^&vUf| $x͍;#Q Coirr/ efGjY=7MRN)ibqtӏPD'|JC=cTX=L@Nxd{0|%sDΠ*&k֫%5%"C*E@|!r?{tdYˋW7}W?Oa>5yTCpkOgFk\^^rv994lTL?(3YMߧ D1{I|@>ꊲZrV?595NxiښbAE ! h`I999C eaȳޓK"'-K&{Kyyp##o_sc8==dvXs!kq( #$FS3@k 1`4&J4jbEfL Z "QIdy4*A 2$jDf%y\ vDX,҂LKFLcM WGaRIrSP/Xqv̱ۡ8'#J,dy=2 MZDV24N<<) *=HaVX#_~pr^gf#T\mRXA;yzx):$oqL,čh%S4,Lˊ=chvFHk| 9YV (MkQ2at| [,Hg'@HHdS -p_Ɋ\1F\*2aYhβ6 E^'a߲^-(DD&gT4u3I=UI^?Ԧ@ck,0"`džAzPh$UIO0̖rVwEqJX_ ȹ[&fm$xQ4k7lsV蒈CH3*36D Wc6 iRÇӀmi R9r )}ףUJ$aq^fY6IZj,'Zٷo'wx7dk %`@-lrAV֋_Ey=Ȁc q0Z"X*+IV`].I }` H4CqbgLm8ZA̼2 &{H e>!DRrUv=.mGq艥)'mvst}D)i)X|1Bp8:zU'6eDܜ'X"T&R/X^-C7bbAGM#{x(bt~I˜m7?gxW/~jN6g?_cί_bҌ)mg/xÞͦd\k[0SN}w79}C?̪,SH1I0y9mp^H~$ zF5-wtMO~r~:->8{^>*g/]pf\Rhq:ͺ"ǻYqs&!00mqNH\pl?Լ,wb-cpS. ~&~fM10 DI!㣚ge!%$"((2@BJ#lR4ͷRiL~BfeAHF/6NVP@fIsH1s.R;~Gs(PHv.gf* Rͅc% m &WjȜ:( B1?Yl"Evɥ9Bi#c;!rVeFP0rK^x.TUbb;ҌrA^nH׵tS02OHBnVmZ,TI8?,%5wTh65e.YUrY,Ryw7ٔFL"|uڭkJ(^v w5Bcϼ4ʊ,)b@rd<9fZHY\^=&-+vnG7S9d23g{L݈n0Jr'9KMZFrIeQƗW`~OD@/ㄊe&IM#1 LQr[N2N0jqD#Xg g~x)iGK5B B&r*(MK#I.FVY6UBqt6$Z4LGH䓍#43Y0;v2ex{xb;QI5mb;_}py~q F ~ha =^ָqI{ysbv8վ?=G))-ՂvHypk\!Ԋѻ;ғ5Ղ9[֛%EZɒq}}=.לm*L\`Gr΂p( `Epq{u"Ǐ/[;R*Eׯ9[B}M- 1O>֒,?y2Wx[Y_\=vmGIБ%Ȋ]v=ISBS޿|ů>dwH hu !7B(J,Y@|}W[:3&(E*\#& (Q)mpBa]P@*A$ w`$PJO.*gg_5RzSAq nh3$1/spOyG$(-D$ PjQ)F!k-J*rR"QmDF8;]qrZU $JJLb#I Ba]h+~PiJ jK7^:fջwG<(ˊv!RXT'W\\PvoHj$Z"IP)yy;D!86-Ma+m ,+BP7`ңFT۴RjrJ iUn{E9]e)LJ$XTtɲ?ݽh RpH@;hl 2pu 7iw5NdA7Z2XMex|b  3vFBvQk'Cg_|_fn{իXg8GIW:5-? 6n[N~͟m7K`8ga>g:kn؜Oٜ_Eh߳,SVrzd57#L&vZ\^pyq .?? ];0.Q vٷqv4!4bËo-Œk\=8Ex "|o͑aD\GOI?Wh1r?rzG?=/r`o[M/R(i i h-) RoJ A4I8Y WG8u+M7g$1FkDIZPs%sZR)ٍ^1Mx8nvWAJ0ȳī6H|,Fֹ"K _Rrm443 d"@uQ{ɲ8ԏD7CeD1чڳ(KIq6bҒ۞oN3xrږCJA0؄˓MR[:"Bh鏖] Ñ W+] -nGMmh[@ %F_3"]kwW|4"bAjhZ "=7擁OyXxMH:Gn'O7zLH&IQxDu`Q^6\k=\ 1*@. md8vu4D0b*H R*W߽b=yX䜟mHDHy 9?r'%cS*rz _=Arй@d j]ݱ\<1brN& α^,ǑLx ޢMOԮ;f@`YhgI&tJsҌ"+>uSӏLڦ$sՇ-Z+wF Ҋ")Pnk\:$& {dȏ/_?w{Ȍ&;~ijƶE&7y5i*aLB(SNd!e k'@DrL催L{+hx~9-$a=v,*Dfm9H$E'ʢ$ g)0F8э.$B=;a?"d&䌯b$]dxh(@Bj~\G2-LtQ*' 0Eяٍ,%wjƑ0:섢yL܏JjDHp$j6 R(޼~fɢn0yY}H/! &+ɮ}|%S}ky}pX!cDIAgÿ8ഝ%vУ$ aDgT "xPcP.$gtuWtӵ2xti:8޽:S9:*D&,"4: u?Xa7ˋD{lat |ELBrl'yy݄6WEA ޽3Uϟ9ܵ%c{:O XM`'! RJ{I)2;lDJbGD( *8FF;=!dR4mkʢ $ADaRpGHU$EyYl$',MY%Ǟdt(rcBdCox{s  Qp\QY!LW0nUuCas^;:L!o^zɱoq;EXKē)&i#K$8 -HXF;Q5usD tFQ$=}@xHY,J0YN86- ʢDEj[@a@wCۢA9"6-2N+ԁeFcowL 2)C lH8 ~qJ+AsF#C|!$PM ȢphgENv`QVMDO$KIԂ)FAs'FsrV\W3٤Ua9`~'4%JΨY4%I"JB)F rAin%y̹ +1~"qkZTx!Z 1JԐYb臉f 9GZϓӄJ^hoٶfH43ok~_W/;h'Od}/[><5(~_WoY}Lֈ,D?$ IhEQZH}OY&0uS;n L'_l.y{z\H|QEaЉہMa8[DRV|KQ.*qhKNΈ>rlLaͻİY?@%/^ !8{b)9Ir~u Rnmw__:󙖬Hk=).ё`py̒t[Η4ERUk(yáX;Bsx90߀eZ7ړ!Lq! /BZS,Z;~bQu;l8! R ]+@ʹ)$(A9IkXZȡޢd|M$u{O{CDZRA0v< IDATRnoi#/e lvĺّS8[Wl܇p8,I *]]^w,uT^[f^| ţ%~p䰇kiwT phZvm,3XijW38ELb* M\ߏ .`tY|c@\% AH&@i&Ǜ [Z)d|j+TS;-8Rji 7KQfuP)1 !DBO3v{C\4MH"{DD;qoR"&aOD8;C˛7QbJ Rm4F'bljiy@qY-8r*3/ $U./>˫38MMGF[czn33Ϲқ'Vr9Mݦt7/77i n@j A[ơm}>;iGbnq[\/iiii1y~3ZCI/~ğ^ 3:~Jh A۝菁eQ T*a~ˢ|䌟|ǏZavKw?"`H3bYd$I>Sۉ#3 iXeMp-Ed5ZUV0NSR2AL$*#3L~.LS$Y{R(L(!qn|\  N!ێOjS->@q{xwoy|/&8qdl[ʢb)F7-|=iV咴 t$dX4qLEFZnogj?$#ŏX-S4r-YZ`O$ES[ᆛCY}rgRR"I%$k@ŕ4`)5iɣ&M3vRJ$8'~2H)'c, nΥxs(r&ӡNrSm#7ޑd)>xC#m)-2Bg-Sқ<cMdpG܍EҔi!pƙʺӳl;onKdƉĩZJK=n"EO;xe*|.^LvL' )"0ԵY,Yʪ$agRg?gOWTU.h~vN-{3ΦIY?B%cy=8uf@ N&O<9GOS))x4w'z2,D(n83BF4IT\ƉfZcCOډ|C'*XH2MeUN3:{nĀD~@d*BtpRd *"48,!jBPLv2E Z8U$d)Q)Y&0^|~zSpٔ<(b]?d9֍HR͗_ͯ RIDӻ[%z޾/x?Cr/o/n{l6y2uwha#<;>,qsw˱x3mסtJլ3b8??fz5EIJX^,=/׬./y ͒www[HJMjYid*f3XY ӁX5,V+zيYl=<0= #݄NrNDjV3FHv_my,|hqR`DdL!$A%PL>e i7r3"(tQ*LH=jaؽ;- gI*F-4m,94S;2 2&jj$āL8 f'3.|rݰ2n:)uЎ 5)AԲgO$nd2(B͹WR#RU !4Mpca2D< h Y1&fjqç>eS }7|vir4YU"es 0qƴ+ܷ×_l=D?|J:@9a QJE*hEQ( n@#.bP}0?Y Vy܋=5‡~0$:Z,%M$MZD)0{4^>nSd$uI:Eh+zPC!/J$!Ԝ'>psbQ@p%f81LNyZ0[7m4K]óg眭7ɲ臉S;%% MRhf8 zO "M 6,6g^K;ңD $ZJ)9Q@N2V2XIlkHjYxoY^Bk L6}FnL`spw<2r~qA⨛11YLGIᎤ,Ik"w{; TyF\5/<0DO,*ŕw-M`>㻗ytH0cE+AIeYP,V cK{%j4PMUu-99nD+"r߱XԤipH&?~5]w2ayض8;" R4G!3N]ǢT2scg?$D?8xg e*h# MbaPyBd\>Z^\-Mo^ DB Bxno"'?G ~Û^`w[-tC`?vaFǙ$eAv?c9uE*HR8!EԚݱ7_~l'KvH  86`]w^da Ż@`:DpzG)l[)0Ōo^܏\c5$R@9eQf2@@"TMNԑ)HʒcgyA+A?:3YͲV 0z\]8ZSOUd+>}~eM8M0Aһz{UsA,4UƢQ zΣ2M48_D~y')u^sGD$CA?`|њ9ŕ(Ҍ"M0Yq7,6kL3'y7FRH⾍I!_#/U#1v9i"L @ O1QFawղAyr$\ee8yD WglKlߎ|Ö/~1MVDMNzcA$h DY; fƐ XV\=z J3NYBX32>Qӑ3sd:T%;n{HFօ࣋gOW|NDRJ@)bPtcB4"I~ O5eb\ח .psBS ;Mm3D^l'dLo<sTX4%:#'.'C~ZaoF"2CDׇ07w1:"8H|꤈ܨEE")fodE([C IDAT8t2;\4-\Ul6 ۞=IPT:䙦NZv\ə~="8MŢ$ir{wow|򖯿_ ug M ?1<>C rQ՟vN($"@tdWyWЎ]7b9<7ړZpJ\Rc0x~.(!@Bp #8*8$GC$xϩ7|zϷ/f&f 6 UxoғL~?Yo\` 96ze^&ؠȶ ܏SIgJVyБEGԛG+]_>rM$YY`zUMLփm=[ZTҤyJQ5`B`'o-2+iTLL@9RΌ%e$9(Dq~H\(x2ag$xLԁRH EٹȰݮe'$n1R9YfU`a"&|<nF$IrT1aBjCIIUXob{;TՂp >JtƇY(TYLm7D1ّL~D9Pڑ:Ht.3ex#._<)9)y''ϟ-8,-)TH^=x$4GgK(q~`R祤3u;y8MY: !P:=o2( :)I>?ϸ^(\?1Gn3V,<^{?GO${ nތ>N! G9GV&$1HɌTUFfQZ^7\m$Up6h$!UJ'2FfR}Zy7ΙUa#/"()QRghp,bBcKf(:`&di0;7xkN=Iq!xH!3*x6J;C60M(9+r4Z r lčE ,E-xF4%';nw$:4l >LFN3rG?ycDX)&gU<,yz& ZJH${=#xJ4լ7%O\=h;T"2MUy֊rDHT`Y45gg5lꌧRP, nܧ33Q)ϧ[wv]` a޹iB6ViH!GPiZRI<1NL$US0~.6MAl"$d!2& Cdn(B 4c5Dx>:GiO,'OHʊoyIUMQtewIgw<?xon*VK{_JM"| 'spn3\s B Zd;{7H9?M(g?G<ږ$,0N#}~f*Y& qh=wGChHR6iRr}bӔ\6MI'[khs=r$yͱ 6RVjRIo16)ͲA$b@f٩8"ca,"TI#\E3g&:rȹ:k,+rg;ί55ێ!O,X ]~;p{q2jF\(u(R&) -e4tL1Mk>iX$,+q2Էd XǒeYzf:j!2#"3KdP@6lFrYN|r K ʣ0 <=|ϯ~%󫿢f{o%KFa>lv~DQHU͟ޓ_ vh YQ,m9?޳ߝplک!M=QI5<}>i-*qYIͷ|OBkuԙҞ_'GquiJ6yf8;1!qc6k8;|?.YƮp8Nj( IPr)>_X3ۏd#"*+.8<|]a)IREf%()ccDkJLx"Y!dVh:R<&ŪՊ|ESO{{dze=({HL1ƠHiԴvm7vY9g\, >}w?|`wPBb͋pM,3dF7;x<9uY`! Ǒum嚲0(QAkAa*23@.N<8QR# KTSTw1Z#AgfڑY@s\/Y8ҏ)N61]kf,f<F1\'/yUɛWKr9pk) ~5 !{~$ňC9SԳ %hnz8 tx믿g?{|(kHr6ÔXkBZN7&B "6DndsvI=vd՞|Mydy>eQ| p_NRࣛZӼΑƀZTdVI2($|‹]y2i{;;rRP.Xaw6 *%&ȫ 4B(=)3!N[1B!EBÈun"&)$BγYH?l%=ö-If%w|["S=yIOq{cO.֏Soq=Il,C-f2'ӊ1Di.1(eQKe $$Y˼)x >=\^XY1w?(Z"'SFDv)F$I0³)zο|qP(=yw(iybO,٬ )'Z(+itN&$Ee&/JMtbr'hQb,q.]`3~a0k6tGί6-F!bt18J3kJpI!$ 4X{ٟJnî((e)8rkqʐ@Ehf*S-rGU  yj{n-!qML a*yv|-9_%.o-zmzVrlQ ڞEL>@HѺ䊪iN83:?<`|N] _B @H nZ!56L+;-i"/uM xR*nR#qQJ1mv!3F v4%g,>$H=ʸdGBJ,'IAFO`tFfr|O7.91DY$2zw#V?eX7k{ּ|=74 U]!HӔSAJHUQN$E9ڲDzSS{bv'8f{k)dq wGr{>[yqE>< ~xv iM Ah!`pCcZܜa{Ď-EyɦQTUIBd"J'V9)LUJSkGHɎ 1##FxrX֚*c>|yAp ndg=^$]D04E s2 Y$ c6 (jXӼM ټf\Cx8”'˵ϞŽ!R%o^ӯ>q?[>>(7,X4#\7UN-<nnz;nnph[R KɢȨR2<:rҘbHђiIQ zMzdm+ nnDҒ#COckzKp”yYxyV~}9-:Rc_%M%HJ0DK>`&3\K6Mj,J~qd ?"I`# O$38/ x~Dxx, !HV>F\{oy2/)BC%IN"WĔw~G{ KD)ySSi(ՆͼAJvvdeA]W% eeӔMT2 L.2J9WsC]2O,88':zRH88:|˜o򲦮 Z˗rvfua~\41 )y93:ɱ `(_<[se=CO&^VT >?4er3EV:Ӈ@TYⓦ>HVpGnFy~5k:Vp{ F8Y[>>RJSI]TlvwB b!$&j ӄqiZI؜OrqB)P #8"PdYN=[=_/xw?>}`]ILß%D/hOGJ\x94ųufʛ/>~d>pJoI=;tˢT*oɠ* -V NЏYUR :h5R%b UeXkD?1Yb>K.E닜:sH(2ȼ!djOX3+3q@=YEeA^c~ Ff|4vqn!bHi0d*bt>(Tp07,f=&u z똕eq,14alwnEƼ)3EYD:one8;[p8|ceDU4S?\\\7kUr~>vo=MՀvO\2>h8_elfBRw#* fJEy(*'ئ@DbV*SdEA}O{q.CDɺGJnnUD*#X7Wf^i$"uSplë N{^sG[K:h"yƳ%W 6gU<>.)E q 🠫2ӈR$ Tjs6RbaݿbIVHcG(02R67o8_7*dp|YE~f?>0*JY1`.sJxb>g9CiJ$cχ&k*gYɼ4Eb Z'*$uo>(H"%UQLo0uJ% Vf:eJX.j6F(HE R0` PJkI!H\rq}6gSg7U)yIȤF@guZcǧ=!*`jx3EQU> 8Q[Rp:'&4UdLj ,~ғbj5'];H`eAi􋝦%E*JH 12kI`&rHjn8 Jpq ܣsDo"e]HUT v!Ȳ"!N,$0\Og7SZ]dOH)NA0xRxڑ㖾ɛ9ϙ9JJ)t`x#s'y:iiOXgm#Cwd8쉃e84ɱFq]J֩X~NR\j8=~H*W 꺦sP9EE.'~ޞÑ}ϫW^/z6gٜ7<{ UCJqaɫ=Th9ց8zNnlQQKuÞ,O\,jBہ$2B!S,cJ?Z/hH,iju'lTub Ȋ &>v{w?>8=tAL6xa1`$ VyⳙYnض=Ae 9+g#>&R:FTLnk|~0itlw'ք8жQ0{櫚5mßH]"'8awoyvT 5>D̔fAպ%ֱ=22or<=9bh|qH<:T20Sl^^/*fYb Ji2z5eQ"&֑L TRd8zQ0:KȘ&xL"K8WcNuq7Yij n.θ|\, 䪑(7lڀ@3*j|J%E@ ,LY8GV/zFUU%J8Ŭmy-VL+-ɲ *//XZ dqu"ɜHU<+(uNdb wDH2NjDQ`mbV-0XK#eβQԹ@gCgpz5g֔{ȼQ,%&K҈4Gʪ"/iy g3يz^eѠ47qPkMLd"*S/zfċg9/\, J)hd)"6s.VMȡhmo=wCGY,f EȋĿt 1V$H%6݀=47y>/6負j*BM +"YcDJzH9Y6EB)|<1ZKUM)MÆ TMdDe65BL MFt`mGhr  ݾ'AV6Da{H7䛻vx Ep &%wFx-O'~U8^._^d|qUs* 35ybg'1&kte$ؤ ANȆp ȔBDH H!/S|@x/ΦI'ڱo)Dg*x>[a@Da턇P9o~i{ZGZQE!'Uka7Xn:} فBKD(KbZ׎6} P$` xOJ0JɼF26q-R&3ŲbR9dyIf8t"YV´Q e?fuD Wݑxush^ɲټ O1zN^)5)%7_YdsS+f-* 7rhժ"+ W11₼((zL7?s=폼xpĆe4ZE2!hbO9"Z#>e̪ՆXRb# l ݐÍ%ٷT%9"LC$!Ƀ ZR!P2Q '#|D$T,c^~c"66ؔ55M0k.DE݈sөZfB \HO-6EmK JiA@ay6̼SESMk֎ܠgb!PP^EFYO70<3é{$FB#bd;NO!, HrztS({Dǀw?}aǫ7/(cG8m@'xw7ve% ۫l$J9!7:Ge<?M`u^9kR0pS0٧@Vf^) \ M.*l"&xo߱*%>"MaPru¡SBj_.YH#OD*kͲ xyZ̐ё%A*PE^?C,?=,+xN$?|c0EUglI/?|=wK=f` kh9 t,MF^<1RF X & sX ~j~ŌH׏\92ld鎖nnj{387Rq{ŀ )RܑC;BjdL&oP&gU,D }?r&?>ގ4xz$ij3^_{*CӞ/s$׼|vrĘ"2pN-wdI`-l#. ,uSjCn11D s2rng$;Q|篮y\gX@tLqhE49sdh~` b 4ijRG&Ls$Ix.Fɐi 8] CR#eQL_8[漼^_=9ϡm9-`W r펴'MO=fh$أncQBL\# C邺4,LwoqCchJ'DF`,P#.&BH͹H\IgtHQPIIK2qR<}ZϘ@~KrcPrBFi9RFkRZ,HEVhm'sar]2ä[0} K\:K9hInL UtځDeFo?"T=O-H$NW$ 4!B!q)!<h >i0yFUJM,%i9,/ɤwqy>cnzN]Ki/8$rk]b0vSFGf`Ք\䒳eCIdȉ01SJS tx=_mO6d&LNUtl2t];N ٜӍ9$r1֓t;ʥ0oO[SM^0)2Q.rЊ!vMzLۿ?wο\q6󌧞33j8kxz" ٛ_ 7oy㎪q-E9o#rdmJ>[1}psKwjuNf{|NQ/IIdhEAIPq=,S. aKjjȄ躖f`Ql{b8!<Ș.nyET?+O~{ٳi~gF_=Nͳ, t9 Rs<5~[r57ޞ8ؑHF.#3y^ێ!D2<ҰvDT\fGN=Jfy,e=q\e|5C˞,m|!ɲw4#DEu#Sv3+Y%ɍY͗@gG2/|Ƽ{éED9˸X4e;2XD5(٧iPIIBT>'A b8qW @ZFuןy& ĉf=_~\O,3Vgc S0rs'lŋ!W8岤ԔftEQrIrd'4&#m)_ן]^/+.|lO;2IrlO{,ۖfuwo6]UV AF'u4x&=P!@479~~ƺd8Dر\s~ٜ͌*xAc|e=!x*z9ֲ=Zp-\6pdm>_#c98޼Ŷ)f%n-ґU CGٜ, n(ݖ,iiǖ@4w>5ggg Uw9aY2h*Rr2G1i{A5rfԂEG֣|1!xyݲ۷dE]; |U#]G, )Vc6xffSeTY&:b`c'8#+q5ed |8?Yaa9cwzVcix;|T'X/؜]#xE&LIQhd6TQ>;\+Āufyq<w,J6_U?73jj:C"o ENw.X.u|xzscG?nqtdUű!>RU%W<ܒO躁t0] IDATq.kPir7ZǏ-hThII>y69fKL5%ET$Qpl#ǧ=M%*eur]!"UUçRcK O ADpnf: Zx~qtO2w?P&'/.krJ-йd,)y)kzzhKEKQ7:w(]9~eeFtchTzJ| &Kp;tۯcq+"E aJ "$D#!zxI8iT0įAMzxϞq"ǣEkRj0t ]62wxO{Pf(dXAO` ãcX rtݱwo c`2#/GL@ -H1dBe 1,Y(?-!I&>nn cq2x„?,J+fanW%}h{ vO; vADlq7p㜠.\.J |)_nU aiH|;7{yC )XGMQ%'|;ykO7w*/iv6 RtwKJfMq#*-_.(?t;E$dK8 =6zaB ѹ4Yɼb/>]HY-CzZhmb;XnT'/ ^\Ib'ɄЎ*ǘ"+!&B\="or7 Ѭ3)Qd"C/i~y?{#??\p><"CS9=?c# OBrqS$e93}J:#Ij9s|:\ yn<ٍX^^|vup2L1:Ce9 AL d^=*t'dYF&!z؍6 ;^~2g{įoI=h۞8Cn߱Z,qrw>p>Tr^@k>3i~Yi?O^Z囯0b^e IP~:gV&Ip`S% Xb=!q@W'%MOQ!c@(I@g U(",*L;('/D5yRdntCOV#J=aPy  % 40]oq?;CJg o-Cn"&HR7a8 Z$d :c=&7&JPju[#T Y6ၛQxʌn]`Q^1Y g Sey|syq|u E.~vzBAJd#MkHo:b.-e]4 'g<>d$e1/ƀ } \jv/"88EV&дG"dhbq=HI d W0s.WADtYSW,NV~6. <' 1Lox,YOp^^獢HLK .P =A _)D=g EВAnL`G{vq)5"M5V)DBe,MIbQRv?`j vǗ_]X1YE-"OI1azM! Goٷ:lސ-2iA0P1ْ7}[Df`9pQfL !4Y^U 3Y97,ovW?{#a!pFdQɡ3EQKdd͒^y7ܾc(ru$K= 4e$"|=.\fdUELPH;\)8`w[bs{1_՜]m)A@@c$Ef a,&yty n/>tĊTMR9cP"yotEnlNi\H$'C94FܡrŊ !91г$W'9e 艍7ZdT<͗ Y`S $Ae)yUc}r]S9"pFRheH!B)T USe$&?Q OУGG"(JNڇu޲^8,ȄvG+Ef2Hh=ݔhDF;H%X, l |$7 &=u"dEIQֈ$#ZVMm!ľPBb$6\fhH]S.@)IrF{w=vqcd޳?yAg-[Y6c@~1Q3֧N%dJH 6'GifEU'{YRQTEIU()tnt0Y#푡r\7}n͞vۑzOaa^"E|ݾϬ<;oXԹ*{DJP%1г? \lEyɺɹXWPEΡ27z2MYiCYYH'8/qYrlG=eŚm n\ nz,b0G#Ո(-e#89x3`s^^`;avG= ((+AUJv=㞳$0N5TJИ NrT -$D5j2]} J׿W_,*'K1gׄ$8hȌd5g}vJT/9:E(a / W(2Gˋ% 6Ռ3>5ן} )h#Cx r|ϸ?ryb5Ӭ.V CKSO$5u^a-=eE °.FR~=9-x=u#8=R??W/  RS5軖&bJR!(''Teg/O4ɷ4FHGdEOU.Ca02/n;w&ѡ ..sCaJ.%E5U@iѤ4qG릭ּ{v,g9B#-{uGƾÎK**rL9]@f$8a #Y R)5?~"]s=]?rúHp`Ɩ'yvy "g8G>M?cs?$vnO)%D4TF{2%jy|hn[#ǮG&,}w[hrz5OG޼wdwyüI%iʊJ)NfƥF i]bN?xlw괠)%>5(YGr/ F?|~͇-1Z-gWZvqt#>ҍ#.&q=.|`Yҵ=̫gSn. ɫWEFA]`!IZ%N碁%?pDꂬ@e G-?{n8\oJV3gd ۷OhaH>quhuC&szt'~ݱ.1 e;E' f󊗟|Ap19RiLT%&W  "(KbS< #D0j;q6F*I;H'fLp;wɲ;>d!U$BD mg9&nUxKBP }`;u6qvb-ǖqQ0y29D"7tۑh9(x%KR8InDVӀGpƪ9*+w#u7 h?I M | ?D؜zuFLkQ(-ɳ`S0S5;c-AXb2vr1GD]ÎY&1Jm7ZI[R6XE+AUgHy4+N_|٫O8?(3 v O e 9U1sW5?g3׊W9_~uS}*R`}?G X,fh1)6(Y9eaiGSҒ\7RE6}9fy",t-*Z$؜qrra 02)4~q#"Bw8r?ps[R(vO{ʜlf@)8>yxGٔ$y<Ijͧ //>{}ɪ`Qk026jE^~ a5w=#W\B%e:qy/Y`ʡTĻw#OO-OێSK׍Cݔ`mD$ݖǔrlc[4}wwGnnEE^F(JoLgZ,5W =@; +>gKd.8t;Z7>zk[ IDATyy8!lᣇ[v۞ I2_*f뒧x$U&ay2,du2`1Hj!yu|?ϯfW|sNdE*kK?T?oo/+h"SI ݀#OyŌ.譧h)s\py,['x8yUdd]P=_j- ayebqGD33G>RL3sShI22)Q[:=yi2TYNU49:%;o[6q@QE&q8+rb9buC5O{Rnw Ed8_`GxpHĔ(IJ#AY+lGR %c V5aQIGg~ױٜe!{z޼"S;-&EE'.R{Q ,oY_,208yi yPBPxr41ٷ.d$k8ZeL;X-k7*QB!Td٬rNOlNvLx杻 8bL(Q0ڈӆ"  GscHOSLCu&9](sRr$ߓW ):0 CUjxD"08?.J~x8[>5SlY\p)}{{a T-˅FD0JQ׆"?%DITA4'lwy0P:_pyҐ➮I m^+M5V1IImCNHc 4QtHf"]*Ư`PdNr&g{ig(Pr:Mq_|9sZӝav$C郪q)RL0JN(YpAN섡*Bincpw[NGI^lHB-U"CαIUF{K5l K * 4f۞Uyθ^$hɋ<3?%O;f󒡷x10$S g3|lo~)SNh=A4k%M#iǁ7Blj$K-sm7"UAӷ<>琢0 >@iRDCU SIv4,VN( |zdbɼTdZ@P& Ue~ۜr$ $:[..79[Ś7o q N<|>r8y-eOΡ´!y {V2n eoj6]J K+۟)zQP尾^\]lHlA$AH7v$YEU@&'O?c09m <G08u{~&A*2tsDKE1Dz/ Z"#3P%⯾>绛^)`EȄ4NV"a }gDZif3Ca2O5 ޲wD;iyLEI,-}MFFIb$NFsv1C-O0_H"ݩS˱ }࢒DЅAI7?n9d,9!zJ5MX7RH%I aa?eݍʱ!YQwC#uۈSORCM:mz>[G##m '>C]Ca$nd D$j1vysxQmB+֫ :IPx!QvHW;$SSͨ8%X4Rʙᛗ/Zbtv8H1K1%[L!dIlV"BVhGŇ;fdBJT&Y3Vo~-OOtc3è 2DRc[bɌ*Yhr )#5#*8h@ uw͞ސfS^bFi~_]ϿGd bI9sr2I d|YVpD;E?Sbt -ø%%'M/$MKq>S|߀3_dz~`yk{ ێ<~?Ka8>8nc2| v ~I-]Ѫd1O~xTni=u}("4G faXNJ$I\G-}hB`#CHS62wdVTda1KJچ`]REBw^-bP1ЖYƳNј閟)xU"9#u;[C;^KiBgt=3_%ONd,9y$Ύ İJg=UU bs]ӳgQKf9YDV`tdr:5M"& #3T,$eYF+>m'-KW?SwڜTD%-+pJ#gڞ{{ŌYUpKJ!H%~2$Ҳ9˙/$"I钦^=Žd8aPq5@sj'IQA2#qy5+YJP0I^n0+SC$L I*FB?qw05<`GbP㎏;Sj6WS ąHW3{S BN t> E4%UCS#5|I:Doy{ిgeaJ'8v2s d{uK~wY 竒yi#˲I#D?et#1&%~i #Y * 5M} ,=b|MĘOY_̐)Əo_H%fa%‚jd5zQ(}Mi4g >?q@$ONuLJ큦<NJ Wl6+36˒kΗsH!蚖ñ2f_q|EzǁvpȉКF6^:춇`0Be~̲d9=c B1W!PAQj3~!Q @&ŜjơggC0XqpxE&VGT"_Nt肝؇qRL Q&Gb̔k `^̲JQoG cq"_]~LBG9>K9[pq=ۆ4L0-Zh4 )+a^3feĹȀ ś92H|v*(;Btu֑9f1_J%vq_ )Rt ɽe4x7#C#.FՒe9ǘ?rG}jHh"7WܼĹTZ]vX3؞+LL:tӄO jMW؋aay#Wl2h=puYbtFv5Y>?X+"JXgYeHhێnp=ہoAC'9gˌH)Kzq0tz ^hBq⒨"É4"8$R)IҎ'c)ɳ=JM$ǧr$"<_H9~:ѤFLf{x:4כL*9Yw ȵs{GQ5RНnTtH7l?032 C~}Ƨ'`9ze^&̊o^_"ikcehT|]anzUP9-bmkΗpQ}C%=^^'b \]EB||izv#!&&`!Z!"iBw}|Cz^_<<5<ϧc6-yR?jOQmgsDIg-֎XkME`%I֚ƞ=8TZ|%+6?=÷ dž8 yŋfŗBQwのSSE-mO|㇇XH2^0!BA C^TQA;-] %F lr8Q3lw¶)dNE$HTY$IFR:|?ҘT!bJ8#B$DIRѵ_&Z;qF ޒ?Y.fk5"@8hG4%fiQ#3n7yxc:ّsTyykGlrE'FXzGYІ,-в?63dq(1'RRUUEA ,Wf]]3tEf H%cMhRl1g'\,JrQE4qkyҊ(4e[BHۗk֫%iӁ%EdCDŽ<펼g\l/?H7_4%!N4AIj5C &DKVt/xݩ?u )4"/3 Y²Ï($&A MNގl~QfE1y-On?%ggsttH fs xL2yhơC ˫_q:6$??//x-|D|pvl1FPhQŊ77xܶ~_~;^\0pGD$Ρ 2 + TOv)J3CfRT*i'V5<<؞I? \q~>缝[cW͂8;DƀR2f3aKTE ģ#[zN ZKn$ F(r.9# u,O C8Z =l=]޺A$/ ##x4D@?tHUP ":ƾeR!0CO5Ԇ ۿpRs4)Td wEnW;Ղ%Brs6E1 dŖ9PVm8[՜2 IDATFϩT󂨠{tTȠזwMn Rm=nFkؽt L03cqvSm'TD-)LM`k-(b6[50:6X\Y$*/)f>#MB[Ӕ>D-JDLb&dD_~~~HD0iKS % a>|z"5stI:e4i2+VG80'=9SRCćiuJLń?[/ι{h#t躎G^v-R"R`F$4)2Nu70WɆME"\GҌQimN"ִլq3  8eRrre3pz:\7-~js%9<4h3d MmdNΣYKvR=3\%̶DIBQfdEJ;tt蚚ho=]|zF)IT9AۏvD#Q>bJKt!>Kt"x7,0aFkǞWg˳zgǁDFJXpli4]϶Bk<ta>K9c1|}QӮ[lZ1:95^sEbBr bM^eGIi6>cPfgZTp0 W+'c8@4ꚗ{_fƏ{w~E\8ߔ\iS;P-*feғ!њ"-Ѫw/͊|ޱ;u}bjS펡bt47gܝ?}1(|y<6ΡCHLK%3= {# E&yrŻO<NzA|`Ѹ4l-èHb$w2g@W(ݲ9[ڶOwd/+4bV2!AbuvIB&<Tʰ γߒʌYa( n;˜EB"nNMĘk֫zx`my~j3Cu=n8BW;TZ0[-R{|>gs~޲{X*k* ͑wO?{ ^UH5gZZ=Q)xEp'& ȧS3Z°Z)]e?-Z*LG3:|ʄW7+Ζ9urDgt62n'B)BquJJ$&I5vKg=0_ (艗$*y}f/HSno9:T8:ɱv^ywiO~o~ŌbsPw)iY5RBӷnGGRUNn@J<7'R! t'E ~rMؑT M 'MEAߎH"%>2㑦$ƀ$!+ l=R(r|fx|ni@Hq:՘EEQ$8{CEUV\]Y3$ pztNؓ-ʊ(B24.L~dB(4*oFMKj$ϵDRflNQty:ڑhZ'!(҄4$4Cp"rړjMRXyꂗK|sO4i5vBĻ&K,Y)iPd<=(Dd)2ݞ)[G8IԖK#:X) K4!0[$\n a '7B3Ҥ`Yn ^^H{t dj#6h'D0&L!`I<ig{~~wb1HS4cv~52SjζHe-ք,%E&4I2 A$2Ơyڷ<=y}3rZjFhV97ˌ<(:QY.J6g~|1_1[s{ YNhί/"%)".72-eCr[Yr<*G\l|xww[泂4Kz B+!phGRbI$L@yJZ288Y0,{>@KdtS:N *Ñ/<ϲL\W\n["E% 7h9#LkZiHs#B RIҔ2:c<)ua%(2CxD,E =JD`J' HVK>Y.J{t1@ha&Rf H&Kaw#`Im:4yFO~%(-BòՊ4;\oP1el=o?*/B!BW,f9CF͢L0уl[~z{G`V9Ijh-Q8/DOg$ME'/J/v7<Mpsy>D>; חK޼yj>'5)d2Imm,6z՜$w0?f=ͫ+ Ӛqm?p8<<^5|f~no֛3޼#'?o9vKy>H+$)cO,v 65A9 `h.iqt||{Ozy%IVПzG#ݩ|dI֔Ղw?7mP[v^x8XT{>p8 V">y+.6x%>>yqW,6 "oٜR&N P I!ufj̗BUNFazP:=O~9B64/)1BMO 2ET6gQyT0a*T4U8n?hOʤl.g9s|>NRrv= H@ =abdN(HJ,QHP׎W/^$5K5>xZ78"HKNnL*Y,%WP =9J7QlVQ yS,1j`O|Nsh-0UJq:u4ʤ˩`ʼn nd`f$:djIIrQ*(]0ҘlVe&kɎ,M\[#BH`uw5ɱ/W/8CaTfV"@\m5% f08{34!e"%tqDLK<>A˵N~lmosdLkAڲVߦI rB*I(D ,!3u7(%\m z#! E ήRJAˈ.P$?%q&d4qF6}GUH$ Ͷk8'L%Z=)h޲2c]Ͷ5NC%%2ƕK|}4xww˦mHLNLfP:C3*,J+ʦmPS7ضZl*a( J'\o[{⪱el* X1YNpVfnM E)BW ~PFijuVXuSab8@i5MŶTVbX#r@a:H)˂BC2+GHm#\8 \!M-ekUվݖ�%4MCTmvs~K\7t}1DP!qr''Ffy>,IuoJyVх2Ȧ-*Hib"B9_7waZ̗/ncin0G" ##1>P+a(.NG·#!_"%*݆;s ǗaJO'euNgf%t-Iq! (mW n%W[ dH)pQ N+tJAZ"8s,<.'AcHFmV_H%0Ƭ >gUCBdX1aO: $CH!DBc$)"Me)ĈUbW(uk ~~d#EQ r@%O#RdB%3$Xe$o EJ-m%) щhnc9G%T88|7>N #_h˂]r- HRcʆ Eۢ#$Sp gB hNSeP6i"]Ip1L~yO/#3_|zxu,Ҳ, !E oj,RD*#J ΑcY13LO,p8K$!bf.#>;xz_9<㉢R86kq7:^f5hKꖄ`&q2NX^_x~z!, 4m&Z\aN*s 9F k(˚qI Kܟhvw=Nijv[ `KGT4T㟿 ̄i+B։n{}y: NDS.eL'anGx:4W[\SٚKTQ~kxaa4 >0Ξy,^tmhϲ\b%.)2.%RhSs`3+g0lv)y3C) J:E[EBYTUFqΰl6RnG=YWk$ ]+<>p\ڒQ 8Ny <rx<7癧'^b컒Mcڊ9pL/, Ӵ|vk*U ۿ9gk`XjZ@Tw9O%t"q߄31R;K۴XH9Q=e0.yb<'TnVϜ.B80#\8^?%$)J0#!&ya1u:sv[Vofc.wBB<)"*v}ǶkiJ s`X eYph-R e!:I'R|,1lIDATf(4SL\eU З'l ? )+1=0H˒x!gǸ#D uaGl1e2zy mP5,D3<%6}[&X!j.s2 ^xo3߾=wWM%FQ8.W+2pu;R!0rTU1c X\(asק5u**LUc놨 C,bÂ%kQ\Ò )+$BH;2y\x:Q% y88{P #0,2Q>|xRT qb3)%ueI} KV9F%qq"Uz8 )_XQ5QL[["/3a1*#$Wd0_@ W׃/e"ckZ'PrM9,h+MS  BJR'8˄N]!y8gtZ16eD0^.tfSJq۔X?ڶ+vۂ랦-HeR/(u}븽"Ei u=n5]kUߕ|fs\?=Z-h׸HB#t^C_~R&Ȃ .iH~C{7‚s `m ʒBa/3ONPH_yB]=maHa&z>dbF¼}DjKQThm֬@-PLp}w£KTJR˵-u :j\GLjR'bg~/ek^Z$cVЕ]]:\F_jZ bh1(8<|yAL4SӰZ匷7wXiïT&gctrz[[QVA ,˄k֡zTL / $I7'Ђ- r</?)P5eYQT5j]?(.'t}G@rx~(\A۔mMv\Ê,p]cO:")3Cb"M,Ȅ҉)mmms|/<ļdWt'C+w7=m(kAxx|"@[k>~(!l$lJmCi g1E*Jʶ[p*QYiepUO@U{nݡdrJ4U~cjI[ZGˈ@ f}6<^02SkrUVq B-Q2z q=dOr .|{wI J|xax/JM}W58tVT=4kD I ΀k.+eMcV?k͖zߣ^a2Z'IYw-zy"F@s@CΊ? w%vCJ !ֆ3q0\aˁ"]s$jpy4UU2#PnX5-lI91GK%!iPRS-9-HB5ݖXRRdF$H1Hbw{=M??#wWgN,@4)cϏg9\2"Bj+p Za׳x^^Z !_p8򛟉A<9G^k 8O>>ĀqƅB)R݇ %"Ւ7 q )1Jaj "%b븻ٴpᄵ-1@ "r>_D< %_<<u3l( i K#|Qb`Bm+diB0uAS;]Ũ=B5o3MKKʉe!S$eδ-5uiۊo@dBhi*AɷZ8]PJp Ӂiy`lZ~]eeHH6+kjچ(]֜/*ӗ5oӬRi"s|ydS\պ-!+a|=-Ƭd-)[_͖~31txŧDO^!۔Hm,4M G d0eG]mSҶmCTPf-8-* Jf)+xnr}{C e- EUPBB \[*s1D9 A+Z$+J)yBfOeFJ|HA!!oyC^G爼nyJ9FBd="K4UtaFdLHHǧ)MMUՔEIHy>1Fl$U+`ףϟibS mջkmOmQ^WRnL 8 (ֵtMMSluݶk77ʡL+V_&Χ aFus/ 5fD*ʪkbJJB m`qFw eQaLBHq*Sp=9QHcۖݦCp'ylur?b ؔ'"3'_jni{ B* 2D"ESS$/ϯ<|~4_軒V. x]Mۯ:!XqӼpGbμ>8FJWѶ/,?M8(L]*R+woX a^!X)3^3BT-3JDR簮@EkDjW싓XW#Q/'^i' 3|yׇʡ FOxd#E4/ǑDځ16sy I$FH9CtADS0D"<>4-_<آ(gY/?ݹ?)I k ơ2G #OĒiJFDԚմݷ=uU0Α[DtڳIlDrW11c)kK_RRDi2mJE:m-JIHN"CWke0NtlR4D%YyFHj+H<@ƒbxOg<&6o%eQsrOO#&Q(i!.K^\oo6(?C cu"%~KL|gD4uƐ8eR2t+޽FJe)HPgT|f.~y_{>et!L|W^~>Წ re+57w-vG1$mEQHRh])#ęj*p)b9~xGJ#)MJpseuT\eMW %$5%-s@f>5W'$ș,$RjDTj5}-"P[KwW3.5$$ߛ+c"~ ey[Wj|zz#ix u$R'+,1͈^ex0<=HBO 3rw۳ٖd3/'H/#ʑ'/g Xc e,3b͇=žu$DYO|FI2]p*'TuKQv4ݞ9[([0|"EpOes"a8=F́tmN(BVfe @̉ϯ||@Ֆ۫}U)՜IT(1lĦhr4NjgG)0~W?%]r:0yx ,:p&[/v@`D0Μ(W)(J%s<9Hya84!ú'T,נq0єJ$"".gKIENDB`wally-2.4.4/res/images/exif_info.png0000644000000000000000000000141211676624760016076 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˥kW?wLdL&1 6Ѩ(hR,M!R;TA.\tm\ >VtZ΢043$BH|=/_>8U}T!su4-WNV8 (wOo^uŕr#ɞF֮`!r pzyeHnVZԜგ[C*³2??\S +K;EСzrc%5*cb]3_槻i4|vQ @hԎdÅ"@IzSlՒ,Ѿ1AֆFޟXq AǏd'bβE.r`o+)ȶ6P)G!wGCqnfG SJy8ux8q8+g~jnBs14({^&xqXxXƘ0 `~Mqrd;;?ln]-G "8:Z &V#_M_G_8T-y/LZOr_wnYf .m[/-q_1rdߪr^LJ&KӼ~-<]0(Œ1n+iU ' 4`)7 r珁s?w ?{Y!IENDB`wally-2.4.4/res/images/folders.png0000644000000000000000000000115511676624760015572 0ustar rootrootPNG  IHDRasRGBbKGD pHYs  tIME  1KIDAT8œ=kA;fU6\EItX6v֢`mZ+-R&*%$P+ٝbon"H*i3=}ar:9;kLrY/7/ʡJ:_51Z1姛UI)T;C2I_0u6$M$ vk d~BnkZ(^xD7Qn='$N/0=~wZ*(:k(pP!yuR U((rC~sƶQ0*T y3ƍ"7|.]{( H/>2֎JTBA_CX=c2D`)'V5)tGވ ($K _#a~d;tcD"/Zrq<] Z1K& tp(oBQJΣm\&`>:65[!ֶӧIENDB`wally-2.4.4/res/images/view.png0000644000000000000000000000126411676624760015107 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<FIDAT8ˍKHA̪-KC= CmfuP)DB"K$A etJZyum0}f~3#sL|!!|g-V9Q鎺c`TC8*5bF'R!DЋ kb^sP!Locgע≣.=^u֘[ 65޶FG ! P %wN5\q=(t@ȀѶ(t2)է"L?B2uXcYV$&a]ct< *Q1}E )hYҁ갎6` DXr<:=UR̞O98*}V&b==hցqف+;˜JT<A!C:̼}nAH~0bM36 +/痗sIĢ̾Ek J {v!=_MyKb]öa{6W03aqoL{l(YJ_ߗ3gO Dl7 'N;g~8Q!1{~(K7.:y"7nZUq{`aaa=íNJ`)GDRn**QDnU|3YSr8y8L g@`cL^18_FDEUD-^-"ۼxb5H`mńFՄ'|Lk"ڝFVFRmmXTpYtc w0M` F?ZOs`(tcO7*%-CGi; 0L)G<>kDC#tQP x>U4 8V1f{ڐflԀRp8MVڟ2{gؙ9ƶ]7^UiCӠ݁,WYܦG3j^وhk4j4bkW=g GFD%s? T6 _><:LÝ};@Q:(Ȗ}l&{I: G~ I3LxO"DC*2aSzW!#ac:H 18s80ULcSfOCZ3sDU 80?Wi+e|5,^owŶ yby#Wn6%lK$"0-i痗PSxL0eeK:>j{|ئ>{uzU@.K$,IPWC?LXY1^o2 _X?yx'I$xX_olF#~7l)cL*1UϔAtu߾os;v;{CdCo:߻/@ @>p,ss.DĊHtcZ+Zo+A45$[Tw/qྷ,bDU jjv) Umr5kqo3 ZIENDB`wally-2.4.4/res/images/move_right.png0000644000000000000000000000061311676624760016275 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8c?%4~nv xf%e@gמx}Ë Sl@ނGWK_%<\dD`Z~'UKX#꺝([m/ػ@J:t6%y]Dr4JDo]x濨d%$1ED*뿀IENDB`wally-2.4.4/res/images/cclockwise.png0000644000000000000000000000100411676624760016253 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˥KacTO(P-(Y/N:(vjJ\Et V,(Z~@v`JJ yO[)Kx=Ïױ>6P23YR{8*D}kUuA*(p[4\ 75WqZ"'9deD4F׿R 5@ (Ab>LJ@0"#OX{cAʆW$ឹ!B!4=xR^܃dg ㌻7ly߽be VyrK12wb5ju5tTZcp1 =q#p r|CU0k55|ʲxê '6 [ut<<(^j. `+0 B`S!ˏrYuL#/8XXևS |論ǃ̧Wc>C_Vl(.V8cP'߁N`MBտY5g뎑:`6 xjM( U$40o-})\*#t8>F L)p;1/Iɷ+> 5 ]Sy([~K52Kָ2A :u=8YNAzl,?Ɂ թk{ԀAz_Qt`s.L[Zg;@NCځטJF oJA [ _9˫m: )&>OV`0Cߟkc 9koy#>Ջ1Sv 1ywWz;V4a>է4v'd:,&I, |w{5n{ }@qV\7;ϜƐWP-IENDB`wally-2.4.4/res/images/sweden.png0000755000000000000000000000103611676624760015422 0ustar rootrootPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdpndu ?_~a Xs=1onߟD@Ml'3{@E07/bPba/_`P3йAF2_@0o&#0oFvO{  0 A!T I AEBHH#A8, ڒ`篲Ifد_@ՠ  0D O)@a`fԿ߲B<_9H FdxD@2B s$@ܹy'IENDB`wally-2.4.4/res/images/idle.png0000644000000000000000000000113611676624760015050 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˥=kTA3޽& a#Q`TFURXH? B,LA@Al6ٹ;s"fnH`kU?)4[57/.dɣ,D$gŎw]>|xNih:c;Io]bFxl"= c"@a퐖~д-wiDa(``.&w(Å6iҶ9#!zDNKYNB^ϙ 1J=L :HvL4NrYBgM~mmS668b{N2ElrE@r>?V#ޓtF5@9Ub"^mhlnz*yR 9䤽GE棤/>rE^}^Ulm<%D{c@/*K+# =@)wWs33q-\woړĿIENDB`wally-2.4.4/res/wally.rc0000644000000000000000000000142611676624760013640 0ustar rootroot#include "winver.h" IDI_ICON1 ICON DISCARDABLE "res/images/wally.ico" VS_VERSION_INFO VERSIONINFO FILEVERSION 2,4,4,0 PRODUCTVERSION 2,4,4,0 FILEOS VOS__WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0 { BLOCK "StringFileInfo" { BLOCK "040904E4" { VALUE "CompanyName", "BeCrux, http://www.becrux.com" VALUE "FileDescription", "Wally - Qt4 Wallpaper Changer" VALUE "FileVersion", "2.4.4" VALUE "InternalName", "Wally" VALUE "LegalCopyright", "GNU GPLv2 BeCrux 2009" VALUE "LegalTrademarks1", "" VALUE "LegalTrademarks2", "" VALUE "OriginalFilename", "wally.exe" VALUE "ProductName", "Wally" VALUE "ProductVersion", "2.4.4" } } BLOCK "VarFileInfo" { VALUE "Translation", 0x409, 1252 } } wally-2.4.4/src/0000755000000000000000000000000011676624761012156 5ustar rootrootwally-2.4.4/src/google.cpp0000644000000000000000000002364411676624760014146 0ustar rootroot/* TRANSLATOR Google::Item */ /* TRANSLATOR Google::Core */ /* TRANSLATOR Google::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "json.h" #include "httpengine.h" #include "google.h" using namespace Google; Item::Item() : HttpEngine::Item(), _lastPhotoIds(5) { _adultFilter = Strict; } Item::Item(Item *item) : HttpEngine::Item(item), _lastPhotoIds(5) { _text = item->_text; _adultFilter = item->_adultFilter; } QVariant Item::data() const { QString str; if (_text.size()) { str = QString("") + tr("Text:") + " " + _text + "" + "
  " + tr("Adult filter:") + " "; switch (_adultFilter) { case Off: str += tr("Off"); break; case Moderate: str += tr("Moderate"); break; case Strict: default: str += tr("Strict"); break; } str += ""; } return str; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const { return (pages)? (currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1) % pages) : 0; } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { _photoId.clear(); photoTitle.clear(); photoDescription.clear(); _photoUrl.clear(); _sourceUrl.clear(); photoOwner.clear(); photoSize = QSize(-1,-1); return QUrl(); } QUrl Item::doPrepareSearch(HttpEngine::Operation & /* op */) { QUrl url("http://ajax.googleapis.com/ajax/services/search/images"); url.addQueryItem("key",GOOGLE_API_KEY); if (_text.size()) url.addQueryItem("q",_text); else return QUrl(); url.addQueryItem("v","1.0"); switch (_adultFilter) { case Off: url.addQueryItem("safe","off"); break; case Moderate: url.addQueryItem("safe","moderate"); break; case Strict: default: url.addQueryItem("safe","active"); break; } url.addQueryItem("rsz","1"); url.addQueryItem("start",QString::number(pageIndex())); url.addQueryItem("imgsz","large|xlarge|xxlarge|huge"); url.addQueryItem("imgtype","photo"); return url; } bool Item::doProcessSearchResult(const QByteArray &response, int &newPagesCount) { QByteArray resp = response; QBuffer buffer(&resp); buffer.open(QIODevice::ReadOnly); try { JSON::Reader reader(&buffer); JSON::Object *rootObject, *object; JSON::Array *array; JSON::Value *value; rootObject = dynamic_cast (reader.element()); if (!rootObject) { qDebug() << metaObject()->className() << ": cannot find root object"; return false; } if (( (value = dynamic_cast (rootObject->value("responseDetails"))) ) && !value->toString().compare("out of range start")) { newPagesCount = 1; return false; } rootObject = dynamic_cast (rootObject->value("responseData")); if (!rootObject) { qDebug() << metaObject()->className() << ": cannot find responseData object"; return false; } array = dynamic_cast (rootObject->value("results")); if (!array || !array->size()) { qDebug() << metaObject()->className() << ": cannot find photos array"; return false; } object = dynamic_cast (array->at(0)); if (!object) { qDebug() << metaObject()->className() << ": cannot find object inside array"; return false; } value = dynamic_cast (object->value("imageId")); if (value) _photoId = value->toString(); else qDebug() << metaObject()->className() << ": cannot find imageId"; value = dynamic_cast (object->value("url")); if (value) _photoUrl = value->toString(); else { value = dynamic_cast (object->value("unescapedUrl")); if (value) _photoUrl = value->toString(); else qDebug() << metaObject()->className() << ": cannot find url/unescapedUrl"; } value = dynamic_cast (object->value("originalContextUrl")); if (value) _sourceUrl = value->toString(); else qDebug() << metaObject()->className() << ": cannot find originalContextUrl"; value = dynamic_cast (object->value("title")); if (value) photoTitle = value->toString(); else { value = dynamic_cast (object->value("titleNoFormatting")); if (value) photoTitle = value->toString(); else qDebug() << metaObject()->className() << ": cannot find title/titleNoFormatting"; } value = dynamic_cast (object->value("width")); if (value) photoSize.setWidth(value->toInt()); else qDebug() << metaObject()->className() << ": cannot find width"; value = dynamic_cast (object->value("height")); if (value) photoSize.setHeight(value->toInt()); else qDebug() << metaObject()->className() << ": cannot find height"; value = dynamic_cast (object->value("content")); if (value) photoDescription = value->toString(); else { value = dynamic_cast (object->value("contentNoFormatting")); if (value) photoDescription = value->toString(); else qDebug() << metaObject()->className() << ": cannot find content/contentNoFormatting"; } object = dynamic_cast (rootObject->value("cursor")); value = dynamic_cast (object->value("estimatedResultCount")); newPagesCount = value->toInt(); } catch (const QString &message) { qDebug() << message; } return (!_photoId.isEmpty() && !_lastPhotoIds.contains(_photoId)); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { return QUrl("/"); } QSize Item::doProcessSizeRequestResult(const QByteArray & /* response */) { return photoSize; } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { return _photoUrl; } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { _lastPhotoIds.insert(_photoId); return QUrl("/"); } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray & /* response */) { PhotoInfo info; info.title = photoTitle; info.description = photoDescription; info.owner = photoOwner; info.sourceUrl = _sourceUrl; info.searchString = _text; return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); _text = settings.value(TEXT,QString()).toString(); setAdultFilter(static_cast (settings.value(ADULT_FILTER,Strict).toInt())); data = qUncompress(settings.value(LAST_PHOTO_IDS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoIds; buf.close(); } void Item::doSaveSettings(QSettings &settings) const { settings.setValue(TEXT,_text); settings.setValue(ADULT_FILTER,static_cast (_adultFilter)); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoIds; buf.close(); settings.setValue(LAST_PHOTO_IDS,qCompress(data)); } bool Item::equalTo(Engine::Item *item) const { Item *googleItem = qobject_cast (item); return googleItem && (text() == googleItem->text()) && (adultFilter() == googleItem->adultFilter()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QVBoxLayout *mainLayout = new QVBoxLayout; QHBoxLayout *topLayout = new QHBoxLayout; QHBoxLayout *bottomLayout = new QHBoxLayout; leSearchFor = new QLineEdit(this); leSearchFor->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); topLayout->addWidget(new QLabel(tr("Search for:"),this)); topLayout->addWidget(leSearchFor); cbAdultFilter = new QComboBox(this); cbAdultFilter->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbAdultFilter->addItem(tr("Strict"),Strict); cbAdultFilter->addItem(tr("Moderate"),Moderate); cbAdultFilter->addItem(tr("Off"),Off); cbAdultFilter->setCurrentIndex(0); bottomLayout->addWidget(new QLabel(tr("Adult filter:"),this)); bottomLayout->addWidget(cbAdultFilter); bottomLayout->addStretch(); mainLayout->addLayout(topLayout); mainLayout->addLayout(bottomLayout); setLayout(mainLayout); leSearchFor->setFocus(); } XtEngine::Item *DialogWidget::returnItem() { Item *item = qobject_cast (core()->newItem()); item->setText(leSearchFor->text()); item->setAdultFilter(static_cast (cbAdultFilter->itemData(cbAdultFilter->currentIndex()).toInt())); if (item->adultFilter() == Off) QMessageBox::warning(this,tr("Google item"), tr("Unfiltered content can show offending or sexual explicit photos")); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *googleItem = qobject_cast (item); setWindowTitle(tr("Edit Google item")); leSearchFor->setText(googleItem->text()); cbAdultFilter->setCurrentIndex(cbAdultFilter->findData(googleItem->adultFilter())); } else setWindowTitle(tr("Add Google item")); } wally-2.4.4/src/json.cpp0000644000000000000000000002015611676624760013636 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include "json.h" using namespace JSON; char Element::readNextChar(QIODevice *device) { char c; if (!device->getChar(&c)) throw QString("Element::readString: unexpected EOF at pos %1").arg(device->pos()); return c; } char Element::readNext(QIODevice *device) { char c; do device->getChar(&c); while (!device->atEnd() && QChar(c).isSpace()); return c; } QString Element::readString(QIODevice *device) { QString res; QByteArray resB; char c; bool falseQuote; if ((c = readNextChar(device)) != '"') throw QString("Element::readString: unexpected char '%1' at pos %2").arg(c).arg(device->pos()); do { falseQuote = false; c = readNextChar(device); if (c == '\\') switch (readNextChar(device)) { case 't': resB += c = 9; break; case '"': falseQuote = true; resB += c = '"'; break; case '/': resB += c = '/'; break; case 'b': resB += c = 8; break; case 'f': resB += c = 12; break; case 'n': resB += c = 10; break; case 'r': resB += c = 13; break; case '\\': resB += c = '\\'; break; case 'u': { res += QString::fromUtf8(resB); resB.clear(); QByteArray uCode; device->getChar(&c); uCode += c; device->getChar(&c); uCode += c; QString hd1 = QString::fromUtf8(uCode); uCode.clear(); device->getChar(&c); uCode += c; device->getChar(&c); uCode += c; QString hd2 = QString::fromUtf8(uCode); ushort uCode1 = hd1.toUShort(0,16); ushort uCode2 = hd2.toUShort(0,16); res += QChar(uCode2,uCode1); } break; } else resB += c; } while (!device->atEnd() && ((c != '"') || ((c == '"') && falseQuote))); res += QString::fromUtf8(resB); res.chop(1); return res; } QVariant Element::readNumber(QIODevice *device) { QVariant res; QString str; char c; bool iOk, rOk; int iN; double rN; do str += c = readNextChar(device); while (!device->atEnd() && ((c != ' ') && (c != ',') && (c != '}') && (c != ']'))); str.chop(1); device->ungetChar(c); iN = str.toInt(&iOk); rN = str.toDouble(&rOk); if ((!iOk) && (!rOk)) throw QString("Element::readNumber: unexpected value at pos %1").arg(device->pos()); if (iOk) res.setValue(iN); else res.setValue(rN); return res; } void Value::read(QIODevice *device) { QVariant var; char c; switch (c = readNext(device)) { case '"': device->ungetChar(c); setValue(readString(device)); break; case 't': if (((c = readNextChar(device)) != 'r') || ((c = readNextChar(device)) != 'u') || ((c = readNextChar(device)) != 'e')) throw QString("Value::read: unexpected char '%1' at pos %2").arg(c).arg(device->pos()); setValue(true); break; case 'f': if (((c = readNextChar(device)) != 'a') || ((c = readNextChar(device)) != 'l') || ((c = readNextChar(device)) != 's') || ((c = readNextChar(device)) != 'e')) throw QString("Value::read: unexpected char '%1' at pos %2").arg(c).arg(device->pos()); setValue(false); break; case 'n': if (((c = readNextChar(device)) != 'u') || ((c = readNextChar(device)) != 'l') || ((c = readNextChar(device)) != 'l')) throw QString("Value::read: unexpected char '%1' at pos %2").arg(c).arg(device->pos()); break; default: device->ungetChar(c); var = readNumber(device); switch (var.type()) { case QVariant::Double: setValue(var.value()); break; case QVariant::Int: setValue(var.value()); break; default: break; } break; } } void Value::write(QIODevice *device) { switch (type()) { case QVariant::Bool: device->write(QByteArray((toBool())? "true" : "false")); break; case QVariant::Double: device->write(QString::number(toDouble()).toAscii()); break; case QVariant::Int: device->write(QString::number(toInt()).toAscii()); break; case QVariant::String: device->write("\""); device->write(toString().toAscii()); device->write("\""); break; default: break; } } void Array::read(QIODevice *device) { char c; Element *element; c = readNext(device); if (c != '[') throw QString("Array::read: unexpected char '%1' at pos %2").arg(c).arg(device->pos()); do { c = readNext(device); if (c == ']') break; device->ungetChar(c); if (c == '{') element = new Object; else if (c == '[') element = new Array; else element = new Value; element->read(device); append(element); if ((c != ',') && (c != ']')) c = readNext(device); } while (!device->atEnd() && ((c == ',') || (c != ']'))); if (c != ']') throw QString("Array::read: unexpected char '%1' at pos %2").arg(c).arg(device->pos()); } void Array::write(QIODevice *device) { QVectorIterator< JSON::Element * > item(*this); device->write("["); while (item.hasNext()) { item.next()->write(device); if (item.hasNext()) device->write(","); } device->write("]"); } void Object::read(QIODevice *device) { char c; QString key; Element *element; c = readNext(device); if (c != '{') throw QString("Object::read: unexpected char '%1' at pos %2").arg(c).arg(device->pos()); do { c = readNext(device); if (c == '}') break; device->ungetChar(c); key = readString(device); c = readNext(device); if (c != ':') throw QString("Object::read: unexpected char '%1' at pos %2").arg(c).arg(device->pos()); c = readNext(device); device->ungetChar(c); if (c == '{') element = new Object; else if (c == '[') element = new Array; else element = new Value; element->read(device); insert(key,element); c = readNext(device); } while (!device->atEnd() && ((c != '}') || (c == ','))); if (c != '}') throw QString("Object::read: unexpected char '%1' at pos %2").arg(c).arg(device->pos()); } void Object::write(QIODevice *device) { QMapIterator< QString,JSON::Element * > item(*this); device->write("{"); while (item.hasNext()) { item.next(); device->write("\""); device->write(item.key().toAscii()); device->write("\":"); item.value()->write(device); if (item.hasNext()) device->write(","); } device->write("}"); } void Reader::parse() { char c; c = Element::readNext(_device); if (!_device->atEnd()) _device->ungetChar(c); if (!_device->atEnd()) { switch (c) { case '{': _element = new Object; break; case '[': _element = new Array; break; default: throw QString("Reader::parse: unexpected char '%1' at pos %2").arg(c).arg(_device->pos()); break; } _element->read(_device); } } void Writer::write(Element *element) { element->write(_device); } wally-2.4.4/src/mapviewer.cpp0000644000000000000000000003152111676624760014662 0ustar rootroot/* TRANSLATOR Map::View */ /* TRANSLATOR Map::Viewer */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include "gui.h" #include "mapviewer.h" using namespace Map; AnchorRect::AnchorRect(AnchorRect::Position position, QGraphicsItem *parent) : QObject(), QGraphicsRectItem(parent) { _position = position; setAcceptHoverEvents(true); setCacheMode(QGraphicsItem::NoCache); setPen(QPen(Qt::white,1)); if (parentItem()) setZValue(parentItem()->zValue() + 0.1); setRect(QRectF(QPointF(-ANCHOR_HALF_LENGTH,-ANCHOR_HALF_LENGTH), QPointF(ANCHOR_HALF_LENGTH,ANCHOR_HALF_LENGTH))); switch (_position) { case topLeft: case bottomRight: setCursor(QCursor(Qt::SizeFDiagCursor)); break; case top: case bottom: setCursor(QCursor(Qt::SizeVerCursor)); break; case left: case right: setCursor(QCursor(Qt::SizeHorCursor)); break; case topRight: case bottomLeft: setCursor(QCursor(Qt::SizeBDiagCursor)); break; default: break; } } void AnchorRect::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { emit selected(_position); QGraphicsRectItem::hoverEnterEvent(event); } void AnchorRect::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { emit selected(noAnchor); QGraphicsRectItem::hoverLeaveEvent(event); } SelectionRect::SelectionRect(QGraphicsItem *parent) : QObject(), QGraphicsRectItem(parent) { setupRect(); } SelectionRect::SelectionRect(const QRectF &rect, QGraphicsItem *parent) : QObject(), QGraphicsRectItem(rect,parent) { setupRect(); } SelectionRect::SelectionRect(qreal x, qreal y, qreal width, qreal height, QGraphicsItem *parent) : QObject(), QGraphicsRectItem(x,y,width,height,parent) { setupRect(); } void SelectionRect::setupRect() { int anchorPosition; _selectedAnchor = AnchorRect::noAnchor; setPen(QPen(Qt::white,1,Qt::DashLine)); setAcceptedMouseButtons(Qt::LeftButton); setCacheMode(QGraphicsItem::NoCache); if (parentItem()) setZValue(parentItem()->zValue() + 0.1); setCursor(QCursor(Qt::SizeAllCursor)); rects[AnchorRect::topLeft] = new AnchorRect(AnchorRect::topLeft,this); rects[AnchorRect::top] = new AnchorRect(AnchorRect::top,this); rects[AnchorRect::topRight] = new AnchorRect(AnchorRect::topRight,this); rects[AnchorRect::right] = new AnchorRect(AnchorRect::right,this); rects[AnchorRect::bottomRight] = new AnchorRect(AnchorRect::bottomRight,this); rects[AnchorRect::bottom] = new AnchorRect(AnchorRect::bottom,this); rects[AnchorRect::bottomLeft] = new AnchorRect(AnchorRect::bottomLeft,this); rects[AnchorRect::left] = new AnchorRect(AnchorRect::left,this); updateAnchorsPosition(); for (anchorPosition = static_cast (AnchorRect::topLeft); anchorPosition <= static_cast (AnchorRect::left); ++anchorPosition) connect(rects.value(static_cast (anchorPosition)), SIGNAL(selected(AnchorRect::Position)), this,SLOT(onAnchorSelected(AnchorRect::Position))); } void SelectionRect::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { switch (_selectedAnchor) { case AnchorRect::topLeft: setRect(startRect.adjusted((mapToParent(event->pos()) - startMouseP).x(), (mapToParent(event->pos()) - startMouseP).y(),0,0)); break; case AnchorRect::bottomRight: setRect(startRect.adjusted(0,0,(mapToParent(event->pos()) - startMouseP).x(), (mapToParent(event->pos()) - startMouseP).y())); break; case AnchorRect::top: setRect(startRect.adjusted(0,(mapToParent(event->pos()) - startMouseP).y(),0,0)); break; case AnchorRect::bottom: setRect(startRect.adjusted(0,0,0,(mapToParent(event->pos()) - startMouseP).y())); break; case AnchorRect::left: setRect(startRect.adjusted((mapToParent(event->pos()) - startMouseP).x(),0,0,0)); break; case AnchorRect::right: setRect(startRect.adjusted(0,0,(mapToParent(event->pos()) - startMouseP).x(),0)); break; case AnchorRect::topRight: setRect(startRect.adjusted(0,(mapToParent(event->pos()) - startMouseP).y(), (mapToParent(event->pos()) - startMouseP).x(),0)); break; case AnchorRect::bottomLeft: setRect(startRect.adjusted((mapToParent(event->pos()) - startMouseP).x(),0, 0,(mapToParent(event->pos()) - startMouseP).y())); break; case AnchorRect::noAnchor: setPos(startP + mapToParent(event->pos()) - startMouseP); break; } updateAnchorsPosition(); } void SelectionRect::mousePressEvent(QGraphicsSceneMouseEvent *event) { QGraphicsRectItem::mousePressEvent(event); startP = pos(); startMouseP = mapToParent(event->pos()); startRect = rect(); event->accept(); } void SelectionRect::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { setRect(rect().normalized()); updateAnchorsPosition(); QGraphicsRectItem::mouseReleaseEvent(event); } void SelectionRect::updateAnchorsPosition() { rects[AnchorRect::topLeft]->setPos(rect().topLeft()); rects[AnchorRect::top]->setPos(QPointF(rect().center().x(),rect().top())); rects[AnchorRect::topRight]->setPos(rect().topRight()); rects[AnchorRect::right]->setPos(QPointF(rect().right(),rect().center().y())); rects[AnchorRect::bottomRight]->setPos(rect().bottomRight()); rects[AnchorRect::bottom]->setPos(QPointF(rect().center().x(),rect().bottom())); rects[AnchorRect::bottomLeft]->setPos(rect().bottomLeft()); rects[AnchorRect::left]->setPos(QPointF(rect().left(),rect().center().y())); } void SelectionRect::onAnchorSelected(AnchorRect::Position anchor) { _selectedAnchor = anchor; } QRectF SelectionRect::boundingRect() const { return QGraphicsRectItem::boundingRect().adjusted(-ANCHOR_HALF_LENGTH,-ANCHOR_HALF_LENGTH, ANCHOR_HALF_LENGTH,ANCHOR_HALF_LENGTH); } void SelectionRect::setPos(const QPointF &pos) { QGraphicsRectItem::setPos(pos); updateAnchorsPosition(); } void SelectionRect::setPos(qreal x, qreal y) { setPos(QPointF(x,y)); } void SelectionRect::setRect(const QRectF &rectangle) { QGraphicsRectItem::setRect(rectangle); updateAnchorsPosition(); } void SelectionRect::setRect(qreal x, qreal y, qreal width, qreal height) { setRect(QRectF(x,y,width,height)); } MapItem::MapItem(QGraphicsItem *parent) : QGraphicsPixmapItem(parent) { rectItem = 0; drawingRect = false; setAcceptedMouseButtons(Qt::LeftButton); setupGrid(); } MapItem::MapItem(const QPixmap &pixmap, QGraphicsItem *parent) : QGraphicsPixmapItem(pixmap,parent) { rectItem = 0; drawingRect = false; setAcceptedMouseButtons(Qt::LeftButton); setupGrid(); } void MapItem::setupGrid() { if (!pixmap().size().isEmpty()) { int i; for (i = -180; i <= 180; i += 30) { QGraphicsLineItem *line; qreal x = static_cast (pixmap().width()) / 360.0 * (static_cast (i) + 180.0); line = new QGraphicsLineItem(QLineF(QPointF(x,0),QPointF(x,pixmap().height())),this); line->setPen(QPen(Qt::darkGray,1,Qt::DotLine)); } for (i = -90; i <= 90; i += 30) { QGraphicsLineItem *line; qreal y = (K - 1.25 * log(tan(0.25 * M_PI + 0.2 * static_cast (i) * M_PI / 90.0))) / (2 * K) * static_cast (pixmap().height()); line = new QGraphicsLineItem(QLineF(QPointF(0,y),QPointF(pixmap().width(),y)),this); line->setPen(QPen(Qt::darkGray,1,Qt::DotLine)); } } } void MapItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (drawingRect) { rectItem->setRect(QRectF(QPointF(0,0),event->pos() - startP)); event->accept(); } else QGraphicsPixmapItem::mouseMoveEvent(event); } void MapItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { startP = event->pos(); drawingRect = true; if (!rectItem) rectItem = new SelectionRect(this); rectItem->setPos(startP); rectItem->setRect(QRectF()); event->accept(); } void MapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { drawingRect = false; rectItem->setRect(rectItem->rect().normalized()); QGraphicsPixmapItem::mouseReleaseEvent(event); } QRectF MapItem::llRect() const { QRectF result, selRect = rectItem->mapRectToParent(rectItem->rect()).intersected(boundingRect()); result.setLeft(360.0 / boundingRect().width() * selRect.topLeft().x() - 180.0); result.setRight(360.0 / boundingRect().width() * selRect.bottomRight().x() - 180.0); result.setTop(450.0 * (atan(exp(0.8 * K - 1.6 * K * selRect.topLeft().y() / boundingRect().height())) / M_PI - 0.25)); result.setBottom(450.0 * (atan(exp(0.8 * K - 1.6 * K * selRect.bottomRight().y() / boundingRect().height())) / M_PI - 0.25)); return result; } void MapItem::setLLRect(const QRectF &llRect) { if (!rectItem) rectItem = new SelectionRect(this); qreal x1 = boundingRect().width() / 360.0 * (llRect.left() + 180.0); qreal x2 = boundingRect().width() / 360.0 * (llRect.right() + 180.0); qreal y1 = (K - 1.25 * log(tan(0.25 * M_PI + 0.2 * llRect.top() * M_PI / 90.0))) / (2 * K) * boundingRect().height(); qreal y2 = (K - 1.25 * log(tan(0.25 * M_PI + 0.2 * llRect.bottom() * M_PI / 90.0))) / (2 * K) * boundingRect().height(); rectItem->setRect(QRectF(QPointF(x1,y1),QPointF(x2,y2))); } QPainterPath MapItem::shape() const { QPainterPath path; path.addRect(boundingRect().adjusted(-1,-1,1,1)); return path; } Scene::Scene(QObject *parent) : QGraphicsScene(parent) { mapItem = new MapItem(QPixmap(":/images/world_map"),0); mapItem->setFlag(QGraphicsItem::ItemClipsChildrenToShape,true); mapItem->setAcceptHoverEvents(false); mapItem->setHandlesChildEvents(false); addItem(mapItem); setSceneRect(mapItem->boundingRect().adjusted(-ANCHOR_HALF_LENGTH,-ANCHOR_HALF_LENGTH, ANCHOR_HALF_LENGTH,ANCHOR_HALF_LENGTH)); } View::View(QGraphicsScene *scene, QWidget *parent) : QGraphicsView(scene,parent) { QPalette myPalette = palette(); QActionGroup *actionGroup = new QActionGroup(this); QAction *defaultAction; myPalette.setColor(QPalette::Base,Qt::black); setPalette(myPalette); currentZoom = 1; signalMapper = new QSignalMapper(this); connect(signalMapper,SIGNAL(mapped(int)),this,SLOT(zoom(int))); actionGroup->setExclusive(true); actionGroup->addAction(defaultAction = newZoomAction(1)); actionGroup->addAction(newZoomAction(2)); actionGroup->addAction(newZoomAction(3)); actionGroup->addAction(newZoomAction(4)); defaultAction->setChecked(true); setContextMenuPolicy(Qt::ActionsContextMenu); setRenderHints(QPainter::HighQualityAntialiasing | QPainter::SmoothPixmapTransform); setToolTip(tr("Drag to select. Right-click to zoom")); setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); setViewportUpdateMode(QGraphicsView::FullViewportUpdate); } QAction *View::newZoomAction(int zoomFactor) { QAction *action = new QAction(tr("Zoom %1x").arg(zoomFactor),this); action->setCheckable(true); signalMapper->setMapping(action,zoomFactor); connect(action,SIGNAL(triggered()),signalMapper,SLOT(map())); addAction(action); return action; } void View::zoom(int zoomFactor) { scale(static_cast (zoomFactor) / static_cast (currentZoom), static_cast (zoomFactor) / static_cast (currentZoom)); currentZoom = zoomFactor; } Viewer::Viewer(QWidget *parent) : Gui::Dialog(Gui::Dialog::CenterOfScreen,parent) { setupUI(); } Viewer::Viewer(const QRectF &llRect, QWidget *parent) : Gui::Dialog(Gui::Dialog::CenterOfScreen,parent) { setupUI(); scene->setLLRect(llRect); } void Viewer::setupUI() { QVBoxLayout *layout = new QVBoxLayout; scene = new Scene(this); View *view = new View(scene,this); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal,this); connect(buttonBox,SIGNAL(accepted()),this,SLOT(accept())); connect(buttonBox,SIGNAL(rejected()),this,SLOT(reject())); setWindowTitle(tr("Map viewer")); layout->addWidget(view); layout->addWidget(buttonBox); setLayout(layout); } wally-2.4.4/src/bing.cpp0000644000000000000000000002377411676624760013615 0ustar rootroot/* TRANSLATOR Bing::Item */ /* TRANSLATOR Bing::Core */ /* TRANSLATOR Bing::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "httpengine.h" #include "bing.h" using namespace Bing; Item::Item() : HttpEngine::Item() { _tagsCondition = And; _adultFilter = Strict; } Item::Item(Item *item) : HttpEngine::Item(item) { _tags = item->_tags; _tagsCondition = item->_tagsCondition; _adultFilter = item->_adultFilter; } QVariant Item::data() const { QString str; if (_tags.size()) { str = QString("") + tr("Tags:") + " " + _tags.join((_tagsCondition == And)? " " + tr("and") + " " : " " + tr("or") + " ") + "" + "
  " + tr("Adult filter:") + " "; switch (_adultFilter) { case Off: str += tr("Off"); break; case Moderate: str += tr("Moderate"); break; case Strict: default: str += tr("Strict"); break; } str += ""; } return str; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const { return (pages)? (currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1) % pages) : 0; } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { photoTitle.clear(); photoDescription.clear(); _photoUrl.clear(); _sourceUrl.clear(); photoOwner.clear(); photoSize = QSize(-1,-1); return QUrl(); } QUrl Item::doPrepareSearch(HttpEngine::Operation & /* op */) { QUrl url("http://api.bing.net/xml.aspx"); url.addQueryItem("AppId",BING_API_KEY); if (_tags.size()) switch (_tagsCondition) { case And: url.addQueryItem("Query",_tags.join("+")); break; case Or: default: url.addQueryItem("Query",_tags.join(" ")); break; } else return QUrl(); url.addQueryItem("Sources","Image"); url.addQueryItem("Version","2.1"); switch (_adultFilter) { case Off: url.addQueryItem("Adult","Off"); break; case Moderate: url.addQueryItem("Adult","Moderate"); break; case Strict: default: url.addQueryItem("Adult","Strict"); break; } url.addQueryItem("Image.Count","1"); url.addQueryItem("Image.Offset",QString::number(pageIndex())); url.addQueryItem("Image.Filters","Size:Large"); url.addQueryItem("Options","DisableLocationDetection"); return url; } bool Item::doProcessSearchResult(const QByteArray &response, int &newPagesCount) { bool respError = false, thumbnail = false; QXmlStreamReader xmlResp(response); while ((!xmlResp.atEnd()) && (!respError)) switch (xmlResp.readNext()) { case QXmlStreamReader::StartElement: if (!xmlResp.prefix().toString().compare("mms",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("Thumbnail",Qt::CaseInsensitive)) thumbnail = true; else if (!xmlResp.prefix().toString().compare("mms",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("Total",Qt::CaseInsensitive)) { xmlResp.readNext(); newPagesCount = xmlResp.text().toString().toInt(); } else if (!xmlResp.prefix().toString().compare("mms",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("Title",Qt::CaseInsensitive)) { xmlResp.readNext(); photoTitle = xmlResp.text().toString(); } else if (!xmlResp.prefix().toString().compare("mms",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("MediaUrl",Qt::CaseInsensitive)) { xmlResp.readNext(); _photoUrl = xmlResp.text().toString(); } else if (!xmlResp.prefix().toString().compare("mms",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("Height",Qt::CaseInsensitive) && !thumbnail) { xmlResp.readNext(); photoSize.setHeight(xmlResp.text().toString().toInt()); } else if (!xmlResp.prefix().toString().compare("mms",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("Width",Qt::CaseInsensitive) && !thumbnail) { xmlResp.readNext(); photoSize.setWidth(xmlResp.text().toString().toInt()); } else if (!xmlResp.prefix().toString().compare("mms",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("Url",Qt::CaseInsensitive) && !thumbnail) { xmlResp.readNext(); _sourceUrl = xmlResp.text().toString(); } break; case QXmlStreamReader::EndElement: if (!xmlResp.prefix().toString().compare("mms",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("Thumbnail",Qt::CaseInsensitive)) thumbnail = false; break; default: break; } return (!respError && _photoUrl.isValid() && !_lastPhotoUrls.contains(_photoUrl)); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { return QUrl("/"); } QSize Item::doProcessSizeRequestResult(const QByteArray & /* response */) { return photoSize; } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { return _photoUrl; } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { _lastPhotoUrls.insert(_photoUrl); return QUrl("/"); } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray & /* response */) { PhotoInfo info; info.title = photoTitle; info.description = photoDescription; info.owner = photoOwner; info.sourceUrl = _sourceUrl; info.searchString = _tags.join(" "); return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); _tags = settings.value(TAGS,QString()).toString().split(" "); _tagsCondition = static_cast (settings.value(TAGS_CONDITION,And).toInt()); setAdultFilter(static_cast (settings.value(ADULT_FILTER,Strict).toInt())); data = qUncompress(settings.value(LAST_PHOTO_URLS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoUrls; buf.close(); } void Item::doSaveSettings(QSettings &settings) const { settings.setValue(TAGS,_tags.join(" ")); settings.setValue(TAGS_CONDITION,_tagsCondition); settings.setValue(ADULT_FILTER,static_cast (_adultFilter)); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoUrls; buf.close(); settings.setValue(LAST_PHOTO_URLS,qCompress(data)); } bool Item::equalTo(Engine::Item *item) const { Item *bingItem = qobject_cast (item); return bingItem && (tags().join(";") == bingItem->tags().join(";")) && (tagsCondition() == bingItem->tagsCondition()) && (adultFilter() == bingItem->adultFilter()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QVBoxLayout *mainLayout = new QVBoxLayout; QHBoxLayout *topLayout = new QHBoxLayout; QHBoxLayout *bottomLayout = new QHBoxLayout; leSearchFor = new QLineEdit(this); leSearchFor->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); cbTagsCondition = new QComboBox(this); cbTagsCondition->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbTagsCondition->addItem(tr("All of these words"),And); cbTagsCondition->addItem(tr("Any of these words"),Or); cbTagsCondition->setCurrentIndex(0); topLayout->addWidget(new QLabel(tr("Search for:"),this)); topLayout->addWidget(leSearchFor); topLayout->addWidget(cbTagsCondition); cbAdultFilter = new QComboBox(this); cbAdultFilter->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbAdultFilter->addItem(tr("Strict"),Strict); cbAdultFilter->addItem(tr("Moderate"),Moderate); cbAdultFilter->addItem(tr("Off"),Off); cbAdultFilter->setCurrentIndex(0); bottomLayout->addWidget(new QLabel(tr("Adult filter:"),this)); bottomLayout->addWidget(cbAdultFilter); bottomLayout->addStretch(); mainLayout->addLayout(topLayout); mainLayout->addLayout(bottomLayout); setLayout(mainLayout); leSearchFor->setFocus(); } XtEngine::Item *DialogWidget::returnItem() { Item *item = qobject_cast (core()->newItem()); item->setTags(leSearchFor->text().split(" ")); item->setTagsCondition(static_cast (cbTagsCondition->itemData(cbTagsCondition->currentIndex()).toInt())); item->setAdultFilter(static_cast (cbAdultFilter->itemData(cbAdultFilter->currentIndex()).toInt())); if (item->adultFilter() == Off) QMessageBox::warning(this,tr("Bing item"), tr("Unfiltered content can show offending or sexual explicit photos")); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *bingItem = qobject_cast (item); setWindowTitle(tr("Edit Bing item")); leSearchFor->setText(bingItem->tags().join(" ")); cbTagsCondition->setCurrentIndex(cbTagsCondition->findData(bingItem->tagsCondition())); cbAdultFilter->setCurrentIndex(cbAdultFilter->findData(bingItem->adultFilter())); } else setWindowTitle(tr("Add Bing item")); } wally-2.4.4/src/utils.cpp0000644000000000000000000000700111676624760014017 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include "utils.h" QMap getFormats() { QMap formats; formats["bw"] = "Black & White"; formats["eps"] = "Encapsulated Postscript"; formats["epsf"] = "Encapsulated PostScript"; formats["epsi"] = "Encapsulated PostScript Interchange"; formats["exr"] = "OpenEXR"; formats["pcx"] = "PC Paintbrush Exchange"; formats["psd"] = "Photoshop Document"; formats["rgb"] = "Raw red, green, and blue samples"; formats["rgba"] = "Raw red, green, blue, and alpha samples"; formats["sgi"] = "Irix RGB"; formats["tga"] = "Truevision Targa"; formats["xcf"] = "eXperimental Computing Facility (GIMP)"; formats["dds"] = "DirectDraw Surface"; formats["xv"] = "Khoros Visualization"; formats["bmp"] = "Windows Bitmap"; formats["gif"] = "Graphic Interchange Format"; formats["jpg"] = "Joint Photographic Experts Group"; formats["jpeg"] = "Joint Photographic Experts Group"; formats["jp2"] = "Joint Photographic Experts Group 2000"; formats["mng"] = "Multiple-image Network Graphics"; formats["png"] = "Portable Network Graphics"; formats["pbm"] = "Portable Bitmap"; formats["pgm"] = "Portable Graymap"; formats["ppm"] = "Portable Pixmap"; formats["tiff"] = "Tagged Image File Format"; formats["tif"] = "Tagged Image File Format"; formats["xbm"] = "X11 Bitmap"; formats["xpm"] = "X11 Pixmap"; formats["ico"] = "Icon Image"; formats["svg"] = "Scalable Vector Graphics"; return formats; } QStringList getImageFilters(bool shortView) { QString global; QStringList list; QMap formats = getFormats(); QStringList supportedFormats = getSupportedImageFormats(); QStringListIterator supportedFormat(supportedFormats); if (shortView) while (supportedFormat.hasNext()) list << "*." + supportedFormat.next(); else { list << QObject::tr("All image files") + " (" + getImageFilters(true).join(" ") + ")"; while (supportedFormat.hasNext()) { list << formats.value(supportedFormat.peekNext()) + " " + QObject::tr("files") + " (*." + supportedFormat.peekNext() + ")"; supportedFormat.next(); } } return list; } QStringList getSupportedImageFormats() { QList supportedFormats = QImageReader::supportedImageFormats(); QStringList result; QListIterator supportedFormat(supportedFormats); QByteArray format; QString debugMsg = "getSupportedImageFormats():"; while (supportedFormat.hasNext()) { format = supportedFormat.next().toLower(); if (!result.contains(format)) { result << format; debugMsg += QString("\t\"") + format.constData() + "\""; } } qDebug() << debugMsg; return result; } wally-2.4.4/src/files.cpp0000644000000000000000000002654411676624760013776 0ustar rootroot/* TRANSLATOR Files::Item */ /* TRANSLATOR Files::Core */ /* TRANSLATOR Files::LabelPreview */ /* TRANSLATOR Files::SettingsWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "exif.h" #include "utils.h" #include "engine.h" #include "files.h" using namespace Files; QVariant Item::data() const { return fileName(); } void Core::doSubmit() { toBeViewed.clear(); } void Core::swapRows(const int i, const int j) { list.swap(i,j); reset(); } void Core::buildRandomIndexesList() { int i; for (i = 0; i < list.size(); toBeViewed << i++) ; for (i = 0; i < 2*list.size(); i++, toBeViewed.swap(qrand() % list.size(),qrand() % list.size())) ; } void Core::init() { emit initCompleted(); } void Core::search(bool randomMode) { qDebug() << name().toAscii().constData() << "::Core::search(" << randomMode << ")"; if (!list.size()) emit searchCompleted(false); else { if (randomMode) { if (!toBeViewed.size()) buildRandomIndexesList(); selectedIndex = toBeViewed.takeFirst(); } else selectedIndex = (selectedIndex + 1) % list.size(); emit searchCompleted(true); } } void Core::sizeLookup() { QSize size = QImageReader(qobject_cast (list.at(selectedIndex))->absoluteFilePath()).size(); qDebug() << name().toAscii().constData() << "::Core::sizeLookup()"; emit sizeLookupCompleted(size); } void Core::download() { qDebug() << name().toAscii().constData() << "::Core::download()"; emit downloadCompleted(true,*qobject_cast (list.at(selectedIndex))); } void Core::infoCollect() { Item *item = qobject_cast (list.at(selectedIndex)); PhotoInfo photoInfo; Exif::Tags tags(item->absoluteFilePath()); qDebug() << name().toAscii().constData() << "::Core::infoCollect()"; photoInfo.owner = tags.owner(); photoInfo.title = tags.title(); photoInfo.description = tags.description(); photoInfo.sourceUrl = QUrl::fromLocalFile(item->absoluteFilePath()); emit infoCollectCompleted(photoInfo); } void Core::cancel() { qDebug() << name().toAscii().constData() << "::Core::cancel()"; emit cancelCompleted(); } void Core::addFile(const QString &fileName) { if (!fileName.isEmpty() && QImageReader(fileName).canRead()) { *this << new Item(QFileInfo(fileName)); reset(); } } void Core::addFiles(const QStringList &fileNameList) { int cnt = 0; QStringListIterator fileName(fileNameList); QProgressDialog dialog(tr("Loading folder..."),QString(),0,fileNameList.size()); while (fileName.hasNext()) { if (!fileName.peekNext().isEmpty() && QImageReader(fileName.peekNext()).canRead()) { *this << new Item(QFileInfo(fileName.peekNext())); ++cnt; } dialog.setValue(dialog.value() + 1); fileName.next(); } if (cnt) reset(); } void Core::addFile(const QFileInfo &fileInfo) { if (QImageReader(fileInfo.absoluteFilePath()).canRead()) { *this << new Item(fileInfo); reset(); } } void Core::addFiles(const QFileInfoList &fileInfoList) { int cnt = 0; QListIterator fileInfo(fileInfoList); while (fileInfo.hasNext()) { if (QImageReader(fileInfo.peekNext().absoluteFilePath()).canRead()) { *this << new Item(fileInfo.peekNext()); ++cnt; } fileInfo.next(); } if (cnt) reset(); } void Core::loadState(QSettings &settings) { selectedIndex = settings.value(LAST_INDEX,-1).toInt(); } void Core::saveState(QSettings &settings) const { if (list.size() && (selectedIndex != -1)) settings.setValue(LAST_INDEX,selectedIndex); } void Core::loadSettings(QSettings &settings) { QStringListIterator key(settings.childKeys()); setActive(settings.value(ENGINE_ACTIVE,true).toBool()); while (key.hasNext()) { if (key.peekNext().compare(LAST_INDEX,Qt::CaseInsensitive) && QFileInfo(settings.value(key.peekNext(),QString()).toString()).isReadable()) list << new Item(QFileInfo(settings.value(key.peekNext(),QString()).toString())); key.next(); } submit(); } void Core::saveSettings(QSettings &settings) const { int i = 0; QListIterator item(list); settings.setValue(ENGINE_ACTIVE,isActive()); while (item.hasNext()) settings.setValue(QString("%1%2").arg(name()).arg(i++), QDir::toNativeSeparators(qobject_cast (item.next())->absoluteFilePath())); } LabelPreview::LabelPreview(QWidget *parent, Qt::WindowFlags f) : QLabel(parent,f) { QFont labelFont(font()); labelFont.setPointSize(19); labelFont.setBold(true); setFixedSize(sizeHint()); setWordWrap(true); setFont(labelFont); setAlignment(Qt::AlignCenter); setStyleSheet("background-color: rgb(0, 0, 0); color: rgb(255, 255, 255);"); clear(); } void LabelPreview::setPixmap(const QPixmap &pixmap) { if (pixmap.isNull()) clear(); else QLabel::setPixmap(pixmap.scaled(size(),Qt::KeepAspectRatio,Qt::SmoothTransformation)); } void LabelPreview::clear() { QLabel::clear(); setText(tr("No preview available")); } SettingsWidget::SettingsWidget(Engine::Core *core, QWidget *parent) : Engine::SettingsWidget(core,parent), dontChangePreview(false) { setupUi(this); vlPreview->insertWidget(0,lblPreview = new LabelPreview(this)); lvPhotos->setModel(this->core()); lvPhotos->setSelectionModel(this->core()->selectionModel()); connect(this->core()->selectionModel(),SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this,SLOT(updateWidgets(QItemSelection,QItemSelection))); } void SettingsWidget::on_tbAdd_clicked(bool) { QFileDialog dialog(this); dialog.setWindowTitle(tr("Select a photo")); #ifdef Q_WS_X11 dialog.setDirectory(QDir::homePath()); #else dialog.setDirectory(QDesktopServices::storageLocation(QDesktopServices::PicturesLocation)); #endif dialog.setNameFilters(getImageFilters()); dialog.setFileMode(QFileDialog::ExistingFiles); dialog.exec(); qobject_cast (core())->addFiles(dialog.selectedFiles()); } void SettingsWidget::on_tbFolderAdd_clicked(bool) { #ifdef Q_WS_X11 QString dirName = QFileDialog::getExistingDirectory(this,tr("Select a folder"),QDir::homePath(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | QFileDialog::DontUseNativeDialog); #else QString dirName = QFileDialog::getExistingDirectory(this,tr("Select a folder"), QDesktopServices::storageLocation(QDesktopServices::PicturesLocation), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | QFileDialog::DontUseNativeDialog); #endif if (!dirName.isEmpty()) { qobject_cast (core())->addFiles(QDir(dirName).entryInfoList(QDir::Files | QDir::Readable)); emit settingsModified(); } } void SettingsWidget::on_tbDel_clicked(bool) { core()->removeRows(lvPhotos->selectionModel()); emit settingsModified(); } void SettingsWidget::on_lvPhotos_doubleClicked(const QModelIndex &index) { Item *item; QString fileName; QFileDialog dialog(this); QVariant var; if (index.isValid()) { item = qobject_cast (core()->data(index,Qt::UserRole).value()); dialog.setWindowTitle(tr("Select a photo")); dialog.setDirectory(item->absolutePath()); dialog.setNameFilters(getImageFilters()); dialog.setFileMode(QFileDialog::ExistingFile); dialog.selectFile(item->absoluteFilePath()); dialog.exec(); fileName = dialog.selectedFiles().at(0); if (!fileName.isEmpty() && (QFileInfo(fileName) != *item) && QImageReader(fileName).canRead()) { Engine::Item *varItem = new Item(QFileInfo(fileName)); var.setValue(varItem); core()->setData(index,var,Qt::UserRole); lblPreview->setPixmap(QPixmap(qobject_cast (varItem)->absoluteFilePath())); emit settingsModified(); } } } void SettingsWidget::on_tbMoveUp_clicked(bool) { int row = 0; if ((lvPhotos->selectionModel()->selectedRows().size() == 1) && ((row = lvPhotos->selectionModel()->selectedRows().at(0).row()))) { dontChangePreview = true; qobject_cast (core())->swapRows(row,row-1); lvPhotos->setCurrentIndex(core()->index(row-1,0)); dontChangePreview = false; emit settingsModified(); } } void SettingsWidget::on_tbMoveDown_clicked(bool) { int row = 0; if ((lvPhotos->selectionModel()->selectedRows().size() == 1) && ((row = lvPhotos->selectionModel()->selectedRows().at(0).row()) < (core()->rowCount() - 1))) { dontChangePreview = true; qobject_cast (core())->swapRows(row,row+1); lvPhotos->setCurrentIndex(core()->index(row+1,0)); dontChangePreview = false; emit settingsModified(); } } void SettingsWidget::updateWidgets(const QItemSelection & /* selected */, const QItemSelection & /* deselected */) { Item *item; if (!dontChangePreview) { if (lvPhotos->selectionModel()->selectedRows().size() == 1) { QModelIndex index = core()->index(lvPhotos->selectionModel()->selectedRows().at(0).row(),0); item = qobject_cast (core()->data(index,Qt::UserRole).value()); lblPreview->setPixmap(QPixmap(item->absoluteFilePath())); } else lblPreview->clear(); } tbDel->setEnabled(lvPhotos->selectionModel()->selectedRows().size()); tbMoveUp->setEnabled((lvPhotos->selectionModel()->selectedRows().size() == 1) && lvPhotos->selectionModel()->selectedRows().at(0).row()); tbMoveDown->setEnabled((lvPhotos->selectionModel()->selectedRows().size() == 1) && (lvPhotos->selectionModel()->selectedRows().at(0).row() < (core()->rowCount() - 1))); } void SettingsWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasUrls()) event->acceptProposedAction(); } void SettingsWidget::dropEvent(QDropEvent *event) { QList urls = event->mimeData()->urls(); QListIterator url(urls); while (url.hasNext()) { if (QFileInfo(url.peekNext().toLocalFile()).isDir()) qobject_cast (core())->addFiles(QDir(url.peekNext().toLocalFile()).entryInfoList(QDir::Files | QDir::Readable)); else qobject_cast (core())->addFile(url.peekNext().toLocalFile()); url.next(); } if (urls.size()) emit settingsModified(); } wally-2.4.4/src/settings.cpp0000644000000000000000000006411011676624760014523 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "gui.h" #include "defs.h" #include "engine.h" #include "settings.h" #include "wally.h" static QString positionToString(Wally::Application::Position position) { switch (position) { case Wally::Application::Centered: return QObject::tr("Centered"); case Wally::Application::Tiled: return QObject::tr("Tiled"); case Wally::Application::CenterTiled: return QObject::tr("Center Tiled"); case Wally::Application::CenteredMaxpect: return QObject::tr("Centered Maxpect"); case Wally::Application::TiledMaxpect: return QObject::tr("Tiled Maxpect"); case Wally::Application::Scaled: return QObject::tr("Scaled"); case Wally::Application::CenteredAutoFit: return QObject::tr("Centered Auto Fit"); case Wally::Application::ScaleAndCrop: return QObject::tr("Scale & Crop"); case Wally::Application::SymmetricalTiled: return QObject::tr("Symmetrical Tiled"); case Wally::Application::MirroredTiled: return QObject::tr("Mirrored Tiled"); case Wally::Application::SymmetricalMirroredTiled: return QObject::tr("Symmetrical Mirrored Tiled"); default: return QString(); } } int PositionModel::rowCount(const QModelIndex & /* parent */) const { return static_cast< int > (Wally::Application::SymmetricalMirroredTiled) + 1; } QVariant PositionModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || (role != Qt::DisplayRole)) return QVariant(); switch (index.column()) { case 0: return positionToString(static_cast (index.row())); break; case 1: switch (static_cast (index.row())) { case Wally::Application::Centered: return ":/images/centered"; case Wally::Application::Tiled: return ":/images/tiled"; case Wally::Application::CenterTiled: return ":/images/center_tiled"; case Wally::Application::CenteredMaxpect: return ":/images/centered_maxpect"; case Wally::Application::TiledMaxpect: return ":/images/tiled_maxpect"; case Wally::Application::Scaled: return ":/images/scaled"; case Wally::Application::CenteredAutoFit: return ":/images/centered_autofit"; case Wally::Application::ScaleAndCrop: return ":/images/scale_crop"; case Wally::Application::SymmetricalTiled: return ":/images/symmetrical_tiled"; case Wally::Application::MirroredTiled: return ":/images/mirrored_tiled"; case Wally::Application::SymmetricalMirroredTiled: return ":/images/symmetrical_mirrored_tiled"; } } return QVariant(); } QVariant PositionModel::headerData(int section, Qt::Orientation orientation, int role) const { if ((orientation == Qt::Vertical) || (role != Qt::DisplayRole)) return QVariant(); switch (section) { case 0: return tr("Position"); case 1: return tr("Picture smaller than screen on the left, greater than screen on the right"); } return QVariant(); } void PositionDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QPixmap pixmap(index.data().toString()); painter->setRenderHint(QPainter::Antialiasing,true); painter->fillRect(option.rect,(option.state & QStyle::State_Selected)? _palette.brush(QPalette::Highlight) : _palette.brush(QPalette::Base)); painter->drawPixmap(option.rect.topLeft() + QPoint(2,2),pixmap); } QSize PositionDelegate::sizeHint(const QStyleOptionViewItem & /* option */, const QModelIndex & /* index */) const { return QImageReader(":/images/centered_maxpect").size() + QSize(5,5); } void PositionLabelDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItem itemOption(option); itemOption.state = itemOption.state & ~QStyle::State_HasFocus; QItemDelegate::paint(painter,itemOption,index); } SettingsDialog::SettingsDialog(QWidget *parent) : Gui::Dialog(Gui::Dialog::CenterOfScreen,parent) { setupUi(this); setWindowTitle(qApp->applicationName() + " " + qApp->applicationVersion() + " - " + tr("Settings") + "[*]"); firstShowEvent = true; loadingSettings = false; settingsButton = new Gui::EngineButton(tr("Settings"),sbToolbar); settingsButton->setChecked(true); QCoreApplication::translate("QDialogButtonBox","OK"); QCoreApplication::translate("QDialogButtonBox","Cancel"); QCoreApplication::translate("QDialogButtonBox","Reset"); QCoreApplication::translate("QDialogButtonBox","&Yes"); QCoreApplication::translate("QDialogButtonBox","&No"); QCoreApplication::translate("QDialogButtonBox","Close"); QCoreApplication::translate("QDialogButtonBox","&Close"); QCoreApplication::translate("QColorDialog","Hu&e:"); QCoreApplication::translate("QColorDialog","&Sat:"); QCoreApplication::translate("QColorDialog","&Val:"); QCoreApplication::translate("QColorDialog","&Red:"); QCoreApplication::translate("QColorDialog","&Green:"); QCoreApplication::translate("QColorDialog","Bl&ue:"); QCoreApplication::translate("QColorDialog","Select Color"); QCoreApplication::translate("QColorDialog","&Basic colors"); QCoreApplication::translate("QColorDialog","&Custom colors"); QCoreApplication::translate("QColorDialog","&Add to Custom Colors"); QCoreApplication::translate("QFileDialog","Directories"); QCoreApplication::translate("QFileDialog","&Open"); QCoreApplication::translate("QFileDialog","&Save"); QCoreApplication::translate("QFileDialog","Open"); QCoreApplication::translate("QFileDialog","%1 already exists.\nDo you want to replace it?"); QCoreApplication::translate("QFileDialog","%1\nFile not found.\nPlease verify the correct file name was given."); QCoreApplication::translate("QFileDialog","My Computer"); QCoreApplication::translate("QFileDialog","&Rename"); QCoreApplication::translate("QFileDialog","&Delete"); QCoreApplication::translate("QFileDialog","Show &hidden files"); QCoreApplication::translate("QFileDialog","Back"); QCoreApplication::translate("QFileDialog","Parent Directory"); QCoreApplication::translate("QFileDialog","List View"); QCoreApplication::translate("QFileDialog","Detail View"); QCoreApplication::translate("QFileDialog","Files of type:"); QCoreApplication::translate("QFileDialog","Directory:"); QCoreApplication::translate("QFileDialog","%1\nDirectory not found.\nPlease verify the correct directory name was given."); QCoreApplication::translate("QFileDialog","'%1' is write protected.\nDo you want to delete it anyway?"); QCoreApplication::translate("QFileDialog","Are sure you want to delete '%1'?"); QCoreApplication::translate("QFileDialog","Could not delete directory."); QCoreApplication::translate("QFileDialog","Recent Places"); QCoreApplication::translate("QFileDialog","Save As"); QCoreApplication::translate("QFileDialog","Drive"); QCoreApplication::translate("QFileDialog","File"); QCoreApplication::translate("QFileDialog","Unknown"); QCoreApplication::translate("QFileDialog","Find Directory"); QCoreApplication::translate("QFileDialog","Show"); QCoreApplication::translate("QFileDialog","Forward"); QCoreApplication::translate("QFileDialog","New Folder"); QCoreApplication::translate("QFileDialog","&New Folder"); QCoreApplication::translate("QFileDialog","&Choose"); QCoreApplication::translate("QFileDialog","Remove"); QCoreApplication::translate("QFileDialog","File &name:"); QCoreApplication::translate("QFileDialog","Look in:"); QCoreApplication::translate("QFileDialog","Create New Folder"); sbToolbar->setExclusive(true); sbToolbar->insertButton(0,settingsButton,0); connect(sbToolbar,SIGNAL(buttonClicked(int)),swMain,SLOT(setCurrentIndex(int))); cbProxyType->addItem("HTTP",QNetworkProxy::HttpProxy); cbProxyType->addItem("SOCKS5",QNetworkProxy::Socks5Proxy); cbProxyType->setCurrentIndex(0); cbInfoPositionOnPhoto->addItem(tr("Left"),Qt::AlignLeft); cbInfoPositionOnPhoto->addItem(tr("Right"),Qt::AlignRight); cbInfoPositionOnPhoto->setCurrentIndex(1); cbFreeDiskSpaceFactor->addItem(tr("kBytes"),1); cbFreeDiskSpaceFactor->addItem(tr("MBytes"),1024); cbFreeDiskSpaceFactor->addItem(tr("GBytes"),1048576); cbFreeDiskSpaceFactor->setCurrentIndex(1); cbHistoryTimeLimitFactor->addItem(tr("day(s)",0,2)); cbHistoryTimeLimitFactor->addItem(tr("month(s)",0,2)); cbHistoryTimeLimitFactor->setCurrentIndex(0); #ifdef Q_WS_WIN cbAutoLaunchOnSysStart->setEnabled(true); cbViewInfoInTooltip->setEnabled(false); cbViewInfoInTooltip->setChecked(false); #endif #ifdef Q_WS_MAC cbAutoLaunchOnSysStart->setEnabled(false); cbAutoLaunchOnSysStart->setChecked(false); cbViewInfoInTooltip->setEnabled(false); cbViewInfoInTooltip->setChecked(false); #endif #ifdef Q_WS_X11 cbAutoLaunchOnSysStart->setEnabled(false); cbAutoLaunchOnSysStart->setChecked(false); #endif connect(cbIntervalUnit,SIGNAL(currentIndexChanged(int)),this,SLOT(settingsModified())); connect(cbIntervalUnit,SIGNAL(currentIndexChanged(int)),this,SLOT(changeInterval())); connect(sbInterval,SIGNAL(valueChanged(int)),this,SLOT(settingsModified())); connect(rbDirectConnection,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); connect(rbProxyConnection,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); connect(leProxyPassword,SIGNAL(textChanged(const QString &)),this,SLOT(settingsModified())); connect(leProxyUsername,SIGNAL(textChanged(const QString &)),this,SLOT(settingsModified())); connect(cbProxyType,SIGNAL(currentIndexChanged(int)),this,SLOT(settingsModified())); connect(leProxyServer,SIGNAL(textChanged(const QString &)),this,SLOT(settingsModified())); connect(sbProxyPort,SIGNAL(valueChanged(int)),this,SLOT(settingsModified())); connect(cbAutoLaunchOnSysStart,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); connect(cbAutoPlay,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); connect(cbOnlyLandscapes,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); connect(cbRandomOrder,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); connect(cbSwitchOnPlay,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); connect(cbDisableSplashScreen,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); connect(cbQuitAfterBackgroundChange,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); connect(cbUseFullDesktop,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); connect(cbViewInfoInTooltip,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); connect(cbViewInfoOnPhoto,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); connect(cbInfoPositionOnPhoto,SIGNAL(currentIndexChanged(int)),this,SLOT(settingsModified())); connect(cbSizeConstraint,SIGNAL(currentIndexChanged(int)),this,SLOT(settingsModified())); connect(pbBorderColor,SIGNAL(colorChanged(const QColor &)),this,SLOT(settingsModified())); connect(sbFreeDiskSpace,SIGNAL(valueChanged(int)),this,SLOT(settingsModified())); connect(cbFreeDiskSpaceFactor,SIGNAL(currentIndexChanged(int)),this,SLOT(settingsModified())); connect(sbHistoryTimeLimit,SIGNAL(valueChanged(int)),this,SLOT(settingsModified())); connect(cbHistoryTimeLimitFactor,SIGNAL(currentIndexChanged(int)),this,SLOT(settingsModified())); connect(cbRotateImages,SIGNAL(toggled(bool)),this,SLOT(settingsModified())); cbIntervalUnit->addItem(tr("second(s)",0,2),SECONDS_UNIT); cbIntervalUnit->addItem(tr("minute(s)",0,2),MINUTES_UNIT); cbIntervalUnit->addItem(tr("hour(s)",0,2),HOURS_UNIT); cbIntervalUnit->setCurrentIndex(1); sbInterval->setRange(1,300); connect(lwAvailableModules,SIGNAL(itemSelectionChanged()),this,SLOT(listWidgetsSelectionChanged())); connect(lwActiveModules,SIGNAL(itemSelectionChanged()),this,SLOT(listWidgetsSelectionChanged())); swMain->setCurrentIndex(0); } void SettingsDialog::settingsModified() { setWindowModified(!loadingSettings); } void SettingsDialog::addSettingsWidget(Engine::SettingsWidget *settingsWidget) { QVariant value; QListWidgetItem *item; QListWidget *lwPtr; Gui::EngineButton *button = new Gui::EngineButton(settingsWidget->buttonIcon(), settingsWidget->buttonText(), sbToolbar); connect(settingsWidget,SIGNAL(settingsModified()), this,SLOT(settingsModified())); button->setPixmap(settingsWidget->buttonPixmap()); sbToolbar->insertButton(0,button,swMain->addWidget(settingsWidget)); settingsWidgets.push_back(settingsWidget); lwPtr = (settingsWidget->core()->isActive())? lwActiveModules : lwAvailableModules; item = new QListWidgetItem(settingsWidget->core()->name(),lwPtr); value.setValue(settingsWidget->core()); item->setData(Qt::UserRole,value); } void SettingsDialog::loadSettings(const WallySettings &mainSettings) { _settings = mainSettings; QColor borderColor = _settings.value(MAIN_SECTION).value(BORDER_COLOR).toString(); borderColor.setAlpha(_settings.value(MAIN_SECTION).value(AUTO_COLOR).toBool()? 0 : 255); loadingSettings = true; sbInterval->setValue(_settings.value(MAIN_SECTION).value(INTERVAL).toInt()); cbIntervalUnit->setCurrentIndex(cbIntervalUnit->findData(_settings.value(MAIN_SECTION).value(INTERVAL_UNIT))); pbBorderColor->setColor(borderColor); pbPosition->setProperty("wallPosition",_settings.value(MAIN_SECTION).value(WALLPAPER_POSITION)); pbPosition->setText(positionToString(static_cast (_settings.value(MAIN_SECTION).value(WALLPAPER_POSITION).toInt())).replace("&","&&")); cbSwitchOnPlay->setChecked(_settings.value(MAIN_SECTION).value(SWITCH_ON_PLAY).toBool()); cbAutoPlay->setChecked(_settings.value(MAIN_SECTION).value(PLAY_ON_START).toBool()); cbAutoLaunchOnSysStart->setChecked(_settings.value(MAIN_SECTION).value(RUN_ON_SYS_START).toBool()); cbOnlyLandscapes->setChecked(_settings.value(MAIN_SECTION).value(ONLY_LANDSCAPES).toBool()); cbRotateImages->setChecked(_settings.value(MAIN_SECTION).value(EXIF_ROTATE_IMAGES).toBool()); cbSizeConstraint->setCurrentIndex(_settings.value(MAIN_SECTION).value(SIZE_CONSTRAINT).toInt()); cbViewInfoInTooltip->setChecked(_settings.value(MAIN_SECTION).value(VIEW_INFO_IN_TOOLTIP).toBool()); cbDisableSplashScreen->setChecked(_settings.value(MAIN_SECTION).value(DISABLE_SPLASH_SCREEN).toBool()); cbQuitAfterBackgroundChange->setChecked(_settings.value(MAIN_SECTION).value(QUIT_AFTER_BACKGROUND_CHANGE).toBool()); cbRandomOrder->setChecked(_settings.value(MAIN_SECTION).value(RANDOM_SEARCH).toBool()); cbUseFullDesktop->setChecked(_settings.value(MAIN_SECTION).value(USE_FULL_DESKTOP_AREA).toBool()); cbViewInfoOnPhoto->setChecked(_settings.value(MAIN_SECTION).value(VIEW_INFO_ON_PHOTO).toBool()); cbInfoPositionOnPhoto->setCurrentIndex( cbInfoPositionOnPhoto->findData(_settings.value(MAIN_SECTION).value(INFO_POSITION_ON_PHOTO).toInt())); sbFreeDiskSpace->setValue(_settings.value(MAIN_SECTION).value(MIN_FREE_DISK_SPACE).toInt()); cbFreeDiskSpaceFactor->setCurrentIndex( cbFreeDiskSpaceFactor->findData(_settings.value(MAIN_SECTION).value(MIN_FREE_DISK_SPACE_FACTOR).toInt())); sbHistoryTimeLimit->setValue(_settings.value(MAIN_SECTION).value(HISTORY_TIME_LIMIT).toInt()); cbHistoryTimeLimitFactor->setCurrentIndex(_settings.value(MAIN_SECTION).value(HISTORY_TIME_LIMIT_FACTOR).toInt()); rbDirectConnection->setChecked(!_settings.value(NETWORK_SECTION).value(USE_PROXY).toBool()); rbProxyConnection->setChecked(_settings.value(NETWORK_SECTION).value(USE_PROXY).toBool()); rbSystemProxy->setChecked(_settings.value(NETWORK_SECTION).value(USE_SYSTEM_PROXY).toBool()); rbCustomProxy->setChecked(!_settings.value(NETWORK_SECTION).value(USE_SYSTEM_PROXY).toBool()); cbProxyType->setCurrentIndex(cbProxyType->findData(_settings.value(NETWORK_SECTION).value(PROXY_TYPE).toInt())); leProxyServer->setText(_settings.value(NETWORK_SECTION).value(PROXY_SERVER).toString()); sbProxyPort->setValue(_settings.value(NETWORK_SECTION).value(PROXY_PORT).toInt()); cbProxyAuthentication->setChecked(_settings.value(NETWORK_SECTION).value(PROXY_AUTHENTICATION).toBool()); leProxyUsername->setText(_settings.value(NETWORK_SECTION).value(PROXY_USERNAME).toString()); leProxyPassword->setText(_settings.value(NETWORK_SECTION).value(PROXY_PASSWORD).toString()); loadingSettings = false; } WallySettings SettingsDialog::settings() { WallySettings newSettings; newSettings[MAIN_SECTION][DISABLE_SPLASH_SCREEN] = cbDisableSplashScreen->isChecked(); newSettings[MAIN_SECTION][QUIT_AFTER_BACKGROUND_CHANGE] = cbQuitAfterBackgroundChange->isChecked(); newSettings[MAIN_SECTION][INTERVAL] = sbInterval->value(); newSettings[MAIN_SECTION][INTERVAL] = sbInterval->value(); newSettings[MAIN_SECTION][INTERVAL_UNIT] = cbIntervalUnit->itemData(cbIntervalUnit->currentIndex()).toInt(); newSettings[MAIN_SECTION][BORDER_COLOR] = pbBorderColor->color().name(); newSettings[MAIN_SECTION][AUTO_COLOR] = !pbBorderColor->color().alpha(); newSettings[MAIN_SECTION][WALLPAPER_POSITION] = static_cast (pbPosition->property("wallPosition").toInt()); newSettings[MAIN_SECTION][SWITCH_ON_PLAY] = cbSwitchOnPlay->isChecked(); newSettings[MAIN_SECTION][PLAY_ON_START] = cbAutoPlay->isChecked(); newSettings[MAIN_SECTION][RUN_ON_SYS_START] = cbAutoLaunchOnSysStart->isChecked(); newSettings[MAIN_SECTION][EXIF_ROTATE_IMAGES] = cbRotateImages->isChecked(); newSettings[MAIN_SECTION][ONLY_LANDSCAPES] = cbOnlyLandscapes->isChecked(); newSettings[MAIN_SECTION][VIEW_INFO_IN_TOOLTIP] = cbViewInfoInTooltip->isChecked(); newSettings[MAIN_SECTION][SIZE_CONSTRAINT] = cbSizeConstraint->currentIndex(); newSettings[MAIN_SECTION][RANDOM_SEARCH] = cbRandomOrder->isChecked(); newSettings[MAIN_SECTION][USE_FULL_DESKTOP_AREA] = cbUseFullDesktop->isChecked(); newSettings[MAIN_SECTION][VIEW_INFO_ON_PHOTO] = cbViewInfoOnPhoto->isChecked(); newSettings[MAIN_SECTION][INFO_POSITION_ON_PHOTO] = static_cast (cbInfoPositionOnPhoto->itemData(cbInfoPositionOnPhoto->currentIndex()).toInt()); newSettings[MAIN_SECTION][MIN_FREE_DISK_SPACE] = sbFreeDiskSpace->value(); newSettings[MAIN_SECTION][MIN_FREE_DISK_SPACE_FACTOR] = cbFreeDiskSpaceFactor->itemData(cbFreeDiskSpaceFactor->currentIndex()).toInt(); newSettings[MAIN_SECTION][HISTORY_TIME_LIMIT] = sbHistoryTimeLimit->value(); newSettings[MAIN_SECTION][HISTORY_TIME_LIMIT_FACTOR] = cbHistoryTimeLimitFactor->currentIndex(); newSettings[NETWORK_SECTION][USE_PROXY] = rbProxyConnection->isChecked(); newSettings[NETWORK_SECTION][USE_SYSTEM_PROXY] = rbSystemProxy->isChecked(); newSettings[NETWORK_SECTION][PROXY_TYPE] = static_cast (cbProxyType->itemData(cbProxyType->currentIndex()).toInt()); newSettings[NETWORK_SECTION][PROXY_SERVER] = leProxyServer->text(); newSettings[NETWORK_SECTION][PROXY_PORT] = sbProxyPort->value(); newSettings[NETWORK_SECTION][PROXY_AUTHENTICATION] = cbProxyAuthentication->isChecked(); newSettings[NETWORK_SECTION][PROXY_USERNAME] = leProxyUsername->text(); newSettings[NETWORK_SECTION][PROXY_PASSWORD] = leProxyPassword->text(); return newSettings; } void SettingsDialog::showEvent(QShowEvent *event) { if (firstShowEvent) { int realHeight = 0; QListIterator button(sbToolbar->buttons()); while (button.hasNext()) realHeight = qMax(realHeight,button.next()->height()); QList buttons = sbToolbar->buttons(); QMutableListIterator mButton(buttons); while (mButton.hasNext()) qobject_cast (mButton.next())->setHeight(realHeight + 10); listWidgetsSelectionChanged(); firstShowEvent = false; } Gui::Dialog::showEvent(event); } void SettingsDialog::on_pbPosition_clicked() { QScopedPointer< Gui::Dialog > dialog(new Gui::Dialog(Gui::Dialog::CenterOfScreen,this)); PositionModel *model = new PositionModel(dialog.data()); QTableView *view = new QTableView(dialog.data()); QItemSelectionModel *selectionModel = new QItemSelectionModel(model,dialog.data()); dialog->setWindowTitle(tr("Set position")); QVBoxLayout *layout = new QVBoxLayout; QDialogButtonBox *dialogButtons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal,dialog.data()); connect(dialogButtons,SIGNAL(accepted()),dialog.data(),SLOT(accept())); connect(dialogButtons,SIGNAL(rejected()),dialog.data(),SLOT(reject())); view->setModel(model); view->setItemDelegateForColumn(0,new PositionLabelDelegate); view->setItemDelegateForColumn(1,new PositionDelegate(QApplication::palette())); view->setSelectionBehavior(QAbstractItemView::SelectRows); view->setSelectionMode(QAbstractItemView::SingleSelection); view->setSelectionModel(selectionModel); view->verticalHeader()->setVisible(false); view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); view->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); view->setEditTriggers(QAbstractItemView::NoEditTriggers); layout->addWidget(view); layout->addWidget(dialogButtons); dialog->setLayout(layout); dialog->resize(700,500); connect(dialog.data(),SIGNAL(executed()),view,SLOT(resizeColumnsToContents())); connect(dialog.data(),SIGNAL(executed()),view,SLOT(resizeRowsToContents())); selectionModel->select(model->index(pbPosition->property("wallPosition").toInt(),0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); view->scrollTo(model->index(pbPosition->property("wallPosition").toInt(),0)); if (dialog->exec() == QDialog::Accepted) { Wally::Application::Position p = static_cast (selectionModel->currentIndex().row()); pbPosition->setProperty("wallPosition",static_cast (p)); pbPosition->setText(positionToString(p).replace("&","&&")); settingsModified(); } } void SettingsDialog::on_rbProxyConnection_toggled(bool checked) { wdgProxy->setEnabled(checked); wdgProxyServer->setEnabled(rbCustomProxy->isChecked()); wdgProxyAuthentication->setEnabled(cbProxyAuthentication->isChecked()); } void SettingsDialog::on_bbResult_clicked(QAbstractButton *button) { QListIterator settingsWidget(settingsWidgets); if (bbResult->buttonRole(button) == QDialogButtonBox::ResetRole) { loadSettings(_settings); while (settingsWidget.hasNext()) settingsWidget.next()->core()->revert(); } } void SettingsDialog::done(int r) { if ((r != QDialog::Rejected) || !isWindowModified() || (QMessageBox::question(this,tr("Settings"),tr("Changes won't be applied. Are you sure?"), QMessageBox::Yes | QMessageBox::No,QMessageBox::No) != QMessageBox::No)) { QDialog::done(r); close(); } } void SettingsDialog::on_sbInterval_valueChanged(int i) { cbIntervalUnit->setItemText(cbIntervalUnit->findData(SECONDS_UNIT),tr("second(s)",0,i)); cbIntervalUnit->setItemText(cbIntervalUnit->findData(MINUTES_UNIT),tr("minute(s)",0,i)); cbIntervalUnit->setItemText(cbIntervalUnit->findData(HOURS_UNIT),tr("hour(s)",0,i)); } void SettingsDialog::listWidgetsSelectionChanged() { tbRemoveAll->setEnabled(lwActiveModules->count()); tbAddAll->setEnabled(lwAvailableModules->count()); tbRemove->setEnabled(lwActiveModules->selectedItems().size()); tbAdd->setEnabled(lwAvailableModules->selectedItems().size()); } QMap SettingsDialog::activations() const { int r; QMap result; for (r = 0; r < lwAvailableModules->count(); ++r) result[lwAvailableModules->item(r)->data(Qt::UserRole).value()] = false; for (r = 0; r < lwActiveModules->count(); ++r) result[lwActiveModules->item(r)->data(Qt::UserRole).value()] = true; return result; } void SettingsDialog::on_tbRemoveAll_clicked() { int r; for (r = lwActiveModules->count() - 1; r >= 0; --r) lwAvailableModules->addItem(lwActiveModules->takeItem(r)); listWidgetsSelectionChanged(); settingsModified(); } void SettingsDialog::on_tbRemove_clicked() { int i; QList items = lwActiveModules->selectedItems(); for (i = 0; i < items.size(); ++i) lwAvailableModules->addItem(lwActiveModules->takeItem(lwActiveModules->row(items.at(i)))); listWidgetsSelectionChanged(); settingsModified(); } void SettingsDialog::on_tbAddAll_clicked() { int r; for (r = lwAvailableModules->count() - 1; r >= 0; --r) lwActiveModules->addItem(lwAvailableModules->takeItem(r)); listWidgetsSelectionChanged(); settingsModified(); } void SettingsDialog::on_tbAdd_clicked() { int i; QList items = lwAvailableModules->selectedItems(); for (i = 0; i < items.size(); ++i) lwActiveModules->addItem(lwAvailableModules->takeItem(lwAvailableModules->row(items.at(i)))); listWidgetsSelectionChanged(); settingsModified(); } void SettingsDialog::on_pbClearHistory_clicked() { if (QMessageBox::question(this,tr("Clear history"),tr("Are you sure?"),QMessageBox::Yes | QMessageBox::No,QMessageBox::No) == QMessageBox::Yes) emit clearHistory(); } void SettingsDialog::changeInterval() { switch (cbIntervalUnit->itemData(cbIntervalUnit->currentIndex()).toInt()) { case SECONDS_UNIT: sbInterval->setRange(10,300); break; case MINUTES_UNIT: case HOURS_UNIT: sbInterval->setRange(1,300); break; } } wally-2.4.4/src/pikeo.cpp0000644000000000000000000002232611676624760013775 0ustar rootroot/* TRANSLATOR Pikeo::Item */ /* TRANSLATOR Pikeo::Core */ /* TRANSLATOR Pikeo::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "httpengine.h" #include "pikeo.h" using namespace Pikeo; Item::Item() : HttpEngine::Item() { _searchOrder = Default; _ascending = false; } Item::Item(Item *item) : HttpEngine::Item(item) { _tags = item->_tags; _searchOrder = item->_searchOrder; _ascending = item->_ascending; } QVariant Item::data() const { QString str; if (_tags.size()) { str = QString("") + tr("Tags:") + " " + _tags.join(" ") + "
  " + tr("Order:") + " "; switch (_searchOrder) { case Default: str += tr("Default"); break; case MostViewed: str += tr("Most viewed"); break; case UploadDate: str += tr("Upload date"); break; case DateTaken: str += tr("Date taken"); break; case GroupAddDate: str += tr("Group add date"); break; case CommentDate: str += tr("Comment date"); break; } str += " (" + ((_ascending)? tr("ascending") : tr("descending")) + ")"; } return str; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int /* pages */) const { return currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1); } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { _photoId.clear(); urlPrefix.clear(); urlFile.clear(); photoTitle.clear(); photoDescription.clear(); photoOwner.clear(); photoSize = QSize(-1,-1); return QUrl(); } QUrl Item::doPrepareSearch(HttpEngine::Operation &op) { QUrl url("http://api.pikeo.com/services/pikeo/v2/rest"); QCryptographicHash hash(QCryptographicHash::Sha1); QByteArray nonce; QByteArray nonceTimestampStr = QDateTime::currentDateTime().toString(Qt::ISODate).toAscii() + "Z"; int nonceLength = (qrand() % 10) + 10; op = HttpEngine::Post; while (--nonceLength) nonce += qrand() % 10 + 0x30; hash.addData(nonce.toBase64() + nonceTimestampStr + QByteArray(PIKEO_SECRET_KEY)); url.addEncodedQueryItem("api_sig",QUrl::toPercentEncoding(hash.result().toBase64())); url.addEncodedQueryItem("nonce",QUrl::toPercentEncoding(nonce.toBase64())); url.addEncodedQueryItem("timestamp",QUrl::toPercentEncoding(nonceTimestampStr)); url.addQueryItem("api_key",PIKEO_API_KEY); url.addQueryItem("method","pikeo.photos.search"); url.addQueryItem("num_items","1"); url.addQueryItem("only_public","true"); url.addQueryItem("offset",QString::number(pageIndex())); if (_tags.size()) url.addQueryItem("text",QUrl::toPercentEncoding(_tags.join(" "))); url.addQueryItem("order_type",QString::number(_searchOrder)); url.addQueryItem("order_asc",QString((_ascending)? "true" : "false")); return url; } bool Item::doProcessSearchResult(const QByteArray &response, int & /* newPagesCount */) { QXmlStreamReader xmlResp(response); while (!xmlResp.atEnd()) if (xmlResp.readNext() == QXmlStreamReader::StartElement) { if (!xmlResp.name().toString().compare("id",Qt::CaseInsensitive)) { xmlResp.readNext(); _photoId = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("url_prefix",Qt::CaseInsensitive)) { xmlResp.readNext(); urlPrefix = xmlResp.text().toString() + "upload/"; } else if (!xmlResp.name().toString().compare("original",Qt::CaseInsensitive)) { xmlResp.readNext(); urlFile = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("title",Qt::CaseInsensitive)) { xmlResp.readNext(); photoTitle = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("owner_username",Qt::CaseInsensitive)) { xmlResp.readNext(); photoOwner = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("description",Qt::CaseInsensitive)) { xmlResp.readNext(); photoDescription = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("width",Qt::CaseInsensitive)) { xmlResp.readNext(); photoSize.setWidth(xmlResp.text().toString().toInt()); } else if (!xmlResp.name().toString().compare("height",Qt::CaseInsensitive)) { xmlResp.readNext(); photoSize.setHeight(xmlResp.text().toString().toInt()); } } if (_photoId.isEmpty()) resetPages(); return !_photoId.isEmpty() && !_lastPhotoIds.contains(_photoId) && !urlPrefix.isEmpty() && !urlFile.isEmpty(); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { return QUrl("/"); } QSize Item::doProcessSizeRequestResult(const QByteArray & /* response */) { return photoSize; } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { return QUrl(urlPrefix + urlFile); } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { _lastPhotoIds.insert(_photoId); return QUrl("/"); } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray & /* response */) { PhotoInfo info; info.title = photoTitle; info.description = photoDescription; info.owner = photoOwner; info.searchString = _tags.join(" "); return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); _tags = settings.value(TAGS,QString()).toString().split(" "); _searchOrder = static_cast (settings.value(SEARCH_ORDER,Default).toInt()); _ascending = settings.value(ASCENDING,false).toBool(); data = qUncompress(settings.value(LAST_PHOTO_IDS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoIds; buf.close(); } void Item::doSaveSettings(QSettings &settings) const { settings.setValue(TAGS,_tags.join(" ")); settings.setValue(SEARCH_ORDER,_searchOrder); settings.setValue(ASCENDING,_ascending); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoIds; buf.close(); settings.setValue(LAST_PHOTO_IDS,qCompress(data)); } bool Item::equalTo(Engine::Item *item) const { Item *pikeoItem = qobject_cast (item); return pikeoItem && (tags().join(";") == pikeoItem->tags().join(";")) && (searchOrder() == pikeoItem->searchOrder()) && (isAscending() == pikeoItem->isAscending()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QVBoxLayout *mainLayout = new QVBoxLayout; QHBoxLayout *topLayout = new QHBoxLayout; QHBoxLayout *bottomLayout = new QHBoxLayout; leSearchFor = new QLineEdit(this); leSearchFor->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); topLayout->addWidget(new QLabel(tr("Search for:"),this)); topLayout->addWidget(leSearchFor); cbSearchOrder = new QComboBox(this); cbSearchOrder->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbSearchOrder->addItem(tr("Default"),Default); cbSearchOrder->addItem(tr("Most viewed"),MostViewed); cbSearchOrder->addItem(tr("Upload date"),UploadDate); cbSearchOrder->addItem(tr("Date taken"),DateTaken); cbSearchOrder->addItem(tr("Group add date"),GroupAddDate); cbSearchOrder->addItem(tr("Comment date"),CommentDate); cbSearchOrder->setCurrentIndex(0); cbAscendingOrder = new QCheckBox(this); cbAscendingOrder->setText(tr("Ascending")); bottomLayout->addWidget(new QLabel(tr("Order:"),this)); bottomLayout->addWidget(cbSearchOrder); bottomLayout->addWidget(cbAscendingOrder); bottomLayout->addStretch(); mainLayout->addLayout(topLayout); mainLayout->addLayout(bottomLayout); setLayout(mainLayout); leSearchFor->setFocus(); } XtEngine::Item *DialogWidget::returnItem() { Item *item = qobject_cast (core()->newItem()); item->setTags(leSearchFor->text().split(" ")); item->setSearchOrder(static_cast (cbSearchOrder->itemData(cbSearchOrder->currentIndex()).toInt())); item->setAscending(cbAscendingOrder->isChecked()); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *pikeoItem = qobject_cast (item); setWindowTitle(tr("Edit Pikeo item")); leSearchFor->setText(pikeoItem->tags().join(" ")); cbSearchOrder->setCurrentIndex(cbSearchOrder->findData(pikeoItem->searchOrder())); cbAscendingOrder->setChecked(pikeoItem->isAscending()); } else setWindowTitle(tr("Add Pikeo item")); } wally-2.4.4/src/panoramio.cpp0000644000000000000000000003531311676624760014653 0ustar rootroot/* TRANSLATOR Panoramio::Item */ /* TRANSLATOR Panoramio::Core */ /* TRANSLATOR Panoramio::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "json.h" #include "gui.h" #include "httpengine.h" #include "panoramio.h" #include "mapviewer.h" using namespace Panoramio; Item::Item() : HttpEngine::Item() { _requestedSize = Original; _searchOrder = Popularity; _minLatitude = _maxLatitude = _minLongitude = _maxLongitude = 0.0; } Item::Item(Item *item) : HttpEngine::Item(item) { _requestedSize = item->_requestedSize; _searchOrder = item->_searchOrder; _minLatitude = item->_minLatitude; _maxLatitude = item->_maxLatitude; _minLongitude = item->_minLongitude; _maxLongitude = item->_maxLongitude; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const { return (pages)? (currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1)) % pages : 1; } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { _photoId.clear(); photoOwner.clear(); photoTitle.clear(); photoLocation.clear(); _photoUrl.clear(); _sourceUrl.clear(); photoSize = QSize(-1,-1); return QUrl(); } QUrl Item::doPrepareSearch(HttpEngine::Operation & /* op */) { QUrl url("http://www.panoramio.com/map/get_panoramas.php"); url.addQueryItem("order",searchOrderStrings[_searchOrder]); url.addQueryItem("set","public"); url.addQueryItem("size",requestedSizeStrings[_requestedSize]); url.addQueryItem("from",QString::number(pageIndex()-1)); url.addQueryItem("to",QString::number(pageIndex())); url.addQueryItem("minx",QString::number(_minLongitude)); url.addQueryItem("miny",QString::number(_minLatitude)); url.addQueryItem("maxx",QString::number(_maxLongitude)); url.addQueryItem("maxy",QString::number(_maxLatitude)); return url; } bool Item::doProcessSearchResult(const QByteArray &response, int &newPagesCount) { QByteArray resp = response; QBuffer buffer(&resp); buffer.open(QIODevice::ReadOnly); try { JSON::Reader reader(&buffer); JSON::Object *object; JSON::Array *array; JSON::Value *value, *latitude, *longitude; object = dynamic_cast (reader.element()); if (!object) { qDebug() << metaObject()->className() << ": cannot find first object"; return false; } value = dynamic_cast (object->value("count")); if (!value) { qDebug() << metaObject()->className() << ": cannot find count value"; return false; } newPagesCount = value->toInt(); array = dynamic_cast (object->value("photos")); if (!array || !array->size()) { qDebug() << metaObject()->className() << ": cannot find photos array"; return false; } object = dynamic_cast (array->at(0)); if (!object) { qDebug() << metaObject()->className() << ": cannot find object inside array"; return false; } value = dynamic_cast (object->value("photo_id")); if (value) _photoId = QString::number(value->toInt()); else qDebug() << metaObject()->className() << ": cannot find photo_id"; value = dynamic_cast (object->value("photo_file_url")); if (value) _photoUrl = value->toString(); else qDebug() << metaObject()->className() << ": cannot find photo_file_url"; value = dynamic_cast (object->value("photo_url")); if (value) _sourceUrl = value->toString(); else qDebug() << metaObject()->className() << ": cannot find photo_url"; value = dynamic_cast (object->value("photo_title")); if (value) photoTitle = value->toString(); else qDebug() << metaObject()->className() << ": cannot find photo_title"; value = dynamic_cast (object->value("owner_name")); if (value) photoOwner = value->toString(); else qDebug() << metaObject()->className() << ": cannot find owner_name"; value = dynamic_cast (object->value("width")); if (value) photoSize.setWidth(value->toInt()); else qDebug() << metaObject()->className() << ": cannot find width"; value = dynamic_cast (object->value("height")); if (value) photoSize.setHeight(value->toInt()); else qDebug() << metaObject()->className() << ": cannot find height"; latitude = dynamic_cast (object->value("latitude")); longitude = dynamic_cast (object->value("longitude")); if (latitude && longitude) photoLocation = tr("lat:") + " " + QString::number(latitude->toDouble()) + ", " + tr("lon:") + " " + QString::number(longitude->toDouble()); else qDebug() << metaObject()->className() << ": cannot find coordinates"; } catch (const QString &message) { qDebug() << message; } return (!_photoId.isEmpty() && !_lastPhotoIds.contains(_photoId)); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { return QUrl("/"); } QSize Item::doProcessSizeRequestResult(const QByteArray & /* response */) { return photoSize; } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { if (_requestedSize == Original) return QUrl("http://static.panoramio.com/photos/original/" + _photoId + ".jpg"); else return _photoUrl; } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { _lastPhotoIds.insert(_photoId); return QUrl("/"); } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray & /* response */) { PhotoInfo info; info.title = photoTitle; info.owner = photoOwner; info.location = photoLocation; info.sourceUrl = _sourceUrl; info.searchString = QString("%1,%2,%3,%4").arg(_minLongitude).arg(_maxLatitude).arg(_maxLongitude).arg(_minLatitude); return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); _minLongitude = settings.value(MIN_LONGITUDE,-180.0).toDouble(); _minLatitude = settings.value(MIN_LATITUDE,-90.0).toDouble(); _maxLongitude = settings.value(MAX_LONGITUDE,180.0).toDouble(); _maxLatitude = settings.value(MAX_LATITUDE,90.0).toDouble(); _searchOrder = static_cast (settings.value(SEARCH_ORDER,Popularity).toInt()); _requestedSize = static_cast (settings.value(REQUESTED_SIZE,Original).toInt()); data = qUncompress(settings.value(LAST_PHOTO_IDS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoIds; buf.close(); } void Item::doSaveSettings(QSettings &settings) const { settings.setValue(MIN_LONGITUDE,_minLongitude); settings.setValue(MIN_LATITUDE,_minLatitude); settings.setValue(MAX_LONGITUDE,_maxLongitude); settings.setValue(MAX_LATITUDE,_maxLatitude); settings.setValue(SEARCH_ORDER,_searchOrder); settings.setValue(REQUESTED_SIZE,_requestedSize); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoIds; buf.close(); settings.setValue(LAST_PHOTO_IDS,qCompress(data)); } QVariant Item::data() const { QString size, order; switch (_requestedSize) { case Original: size = tr("Original"); break; case Medium: size = tr("Medium"); break; case Small: size = tr("Small"); break; case Thumbnail: size = tr("Thumbnail"); break; case Square: size = tr("Square"); break; case MiniSquare: size = tr("Mini square"); break; } switch (_searchOrder) { case Popularity: order = tr("Popularity"); break; case UploadDate: order = tr("Upload date"); break; } return QString("" + "
") + tr("Longitude:") + "" + QString::number(minLongitude(),'f') + "->" + QString::number(maxLongitude(),'f') + "
" + tr("Latitude:") + "" + QString::number(minLatitude(),'f') + "->" + QString::number(maxLatitude(),'f') + "
" + "
  " + tr("Size:") + " " + size + ",  " + tr("Order:") + " " + order + ""; } bool Item::equalTo(Engine::Item *item) const { Item *panoramioItem = qobject_cast (item); return panoramioItem && (minLatitude() == panoramioItem->minLatitude()) && (maxLatitude() == panoramioItem->maxLatitude()) && (minLongitude() == panoramioItem->minLongitude()) && (maxLongitude() == panoramioItem->maxLongitude()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QVBoxLayout *mainLayout = new QVBoxLayout; QFormLayout *formLayout = new QFormLayout; QPushButton *pbMap = new QPushButton(tr("Select on map"),this); checkingValues = false; connect(pbMap,SIGNAL(clicked()),this,SLOT(launchMapViewer())); formLayout->addRow(new QLabel(tr("Longitude (min):"),this), dsbMinLongitude = new QDoubleSpinBox(this)); formLayout->addRow(new QLabel(tr("Longitude (max):"),this), dsbMaxLongitude = new QDoubleSpinBox(this)); formLayout->addRow(new QLabel(tr("Latitude (min):"),this), dsbMinLatitude = new QDoubleSpinBox(this)); formLayout->addRow(new QLabel(tr("Latitude (max):"),this), dsbMaxLatitude = new QDoubleSpinBox(this)); dsbMaxLongitude->setRange(-180.0,180.0); dsbMaxLongitude->setDecimals(6); connect(dsbMaxLongitude,SIGNAL(editingFinished()),this,SLOT(correctValues())); dsbMinLongitude->setRange(-180.0,180.0); dsbMinLongitude->setDecimals(6); connect(dsbMinLongitude,SIGNAL(editingFinished()),this,SLOT(correctValues())); dsbMaxLatitude->setRange(-90.0,90.0); dsbMaxLatitude->setDecimals(6); connect(dsbMaxLatitude,SIGNAL(editingFinished()),this,SLOT(correctValues())); dsbMinLatitude->setRange(-90.0,90.0); dsbMinLatitude->setDecimals(6); connect(dsbMinLatitude,SIGNAL(editingFinished()),this,SLOT(correctValues())); cbSearchOrder = new QComboBox(this); cbSearchOrder->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbSearchOrder->addItem(tr("Popularity"),Popularity); cbSearchOrder->addItem(tr("Upload date"),UploadDate); cbSearchOrder->setCurrentIndex(0); cbRequestedSize = new QComboBox(this); cbRequestedSize->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbRequestedSize->addItem(tr("Original"),Original); cbRequestedSize->addItem(tr("Medium"),Medium); cbRequestedSize->addItem(tr("Small"),Small); cbRequestedSize->addItem(tr("Thumbnail"),Thumbnail); cbRequestedSize->addItem(tr("Square"),Square); cbRequestedSize->addItem(tr("Mini square"),MiniSquare); cbRequestedSize->setCurrentIndex(0); formLayout->addRow(new QLabel(tr("Order:"),this),cbSearchOrder); formLayout->addRow(new QLabel(tr("Size:"),this),cbRequestedSize); mainLayout->addWidget(pbMap); mainLayout->addLayout(formLayout); setLayout(mainLayout); dsbMinLongitude->setFocus(); } void DialogWidget::correctValues() { if (!checkingValues) { checkingValues = true; dsbMaxLongitude->setValue(qMax(dsbMinLongitude->value(),dsbMaxLongitude->value())); dsbMinLongitude->setValue(qMin(dsbMinLongitude->value(),dsbMaxLongitude->value())); dsbMaxLatitude->setValue(qMax(dsbMinLatitude->value(),dsbMaxLatitude->value())); dsbMinLatitude->setValue(qMin(dsbMinLatitude->value(),dsbMaxLatitude->value())); checkingValues = false; } } XtEngine::Item *DialogWidget::returnItem() { Item *item = qobject_cast (core()->newItem()); item->setMinLongitude(dsbMinLongitude->value()); item->setMaxLongitude(dsbMaxLongitude->value()); item->setMinLatitude(dsbMinLatitude->value()); item->setMaxLatitude(dsbMaxLatitude->value()); item->setSearchOrder(static_cast (cbSearchOrder->itemData(cbSearchOrder->currentIndex()).toInt())); item->setRequestedSize(static_cast (cbRequestedSize->itemData(cbRequestedSize->currentIndex()).toInt())); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *panoramioItem = qobject_cast (item); setWindowTitle(tr("Edit Panoramio item")); checkingValues = true; dsbMinLatitude->setValue(panoramioItem->minLatitude()); dsbMaxLatitude->setValue(panoramioItem->maxLatitude()); dsbMinLongitude->setValue(panoramioItem->minLongitude()); dsbMaxLongitude->setValue(panoramioItem->maxLongitude()); checkingValues = false; cbSearchOrder->setCurrentIndex(cbSearchOrder->findData(panoramioItem->searchOrder())); cbRequestedSize->setCurrentIndex(cbRequestedSize->findData(panoramioItem->requestedSize())); } else setWindowTitle(tr("Add Panoramio item")); } bool DialogWidget::validateInput() { if ((dsbMinLatitude->value() == dsbMaxLatitude->value()) || (dsbMinLongitude->value() == dsbMaxLongitude->value())) { QMessageBox::critical(this,tr("Error"),tr("Coordinates must be different")); return false; } else return true; } void DialogWidget::launchMapViewer() { Map::Viewer *viewer; if ((dsbMaxLongitude->value() > dsbMinLongitude->value()) && (dsbMaxLatitude->value() > dsbMinLatitude->value())) viewer = new Map::Viewer(QRectF(QPointF(dsbMinLongitude->value(), dsbMaxLatitude->value()), QPointF(dsbMaxLongitude->value(), dsbMinLatitude->value())),this); else viewer = new Map::Viewer(this); if (viewer->exec() == QDialog::Accepted) { QRectF llRect = viewer->llRect(); checkingValues = true; dsbMaxLongitude->setValue(llRect.right()); dsbMinLongitude->setValue(llRect.left()); dsbMaxLatitude->setValue(llRect.top()); dsbMinLatitude->setValue(llRect.bottom()); checkingValues = false; } delete viewer; } wally-2.4.4/src/picasa.cpp0000644000000000000000000001702711676624760014130 0ustar rootroot/* TRANSLATOR Picasa::Item */ /* TRANSLATOR Picasa::Core */ /* TRANSLATOR Picasa::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "httpengine.h" #include "picasa.h" using namespace Picasa; Item::Item(Item *item) : HttpEngine::Item(item) { _text = item->_text; } QVariant Item::data() const { QString str = _text; if (!str.isEmpty()) str = QString("") + tr("Text:") + " " + _text + ""; return str; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const { return (pages)? (currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1)) % pages : 1; } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { _photoUrl.clear(); _sourceUrl.clear(); photoTitle.clear(); photoDescription.clear(); photoOwner.clear(); photoLocation.clear(); return QUrl(); } QUrl Item::doPrepareSearch(HttpEngine::Operation & /* op */) { QUrl url("http://picasaweb.google.com/data/feed/base/all"); url.addQueryItem("kind","photo"); url.addQueryItem("start-index",QString::number(pageIndex())); url.addQueryItem("max-results","1"); if (_text.isEmpty()) return QUrl(); url.addQueryItem("q",_text); return url; } bool Item::doProcessSearchResult(const QByteArray &response, int &newPagesCount) { bool mediaSection = false, authorSection = false; QXmlStreamReader xmlResp(response); while (!xmlResp.atEnd()) if (xmlResp.readNext() == QXmlStreamReader::StartElement) { if (!xmlResp.prefix().toString().compare("openSearch",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("totalResults",Qt::CaseInsensitive)) { xmlResp.readNext(); newPagesCount = xmlResp.text().toString().toInt(); } else if (!xmlResp.prefix().toString().compare("media",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("group",Qt::CaseInsensitive)) { mediaSection = true; while (!xmlResp.atEnd() && mediaSection) switch (xmlResp.readNext()) { case QXmlStreamReader::StartElement: if (!xmlResp.name().toString().compare("content",Qt::CaseInsensitive)) { _photoUrl = xmlResp.attributes().value("url").toString(); photoSize = QSize(xmlResp.attributes().value("width").toString().toInt(), xmlResp.attributes().value("height").toString().toInt()); } else if (!xmlResp.name().toString().compare("description",Qt::CaseInsensitive)) { xmlResp.readNext(); photoDescription = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("title",Qt::CaseInsensitive)) { xmlResp.readNext(); photoTitle = xmlResp.text().toString(); } break; case QXmlStreamReader::EndElement: mediaSection = xmlResp.name().toString().compare("group",Qt::CaseInsensitive); break; default: break; } } else if (!xmlResp.prefix().toString().compare("gphoto",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("location",Qt::CaseInsensitive)) { xmlResp.readNext(); photoLocation = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("link",Qt::CaseInsensitive)) { if (!xmlResp.attributes().value("rel").toString().compare("alternate",Qt::CaseInsensitive)) _sourceUrl = xmlResp.attributes().value("href").toString(); } else if (!xmlResp.name().toString().compare("author",Qt::CaseInsensitive)) { authorSection = true; while (!xmlResp.atEnd() && authorSection) switch (xmlResp.readNext()) { case QXmlStreamReader::StartElement: if (!xmlResp.name().toString().compare("name",Qt::CaseInsensitive)) { xmlResp.readNext(); photoOwner = xmlResp.text().toString(); } break; case QXmlStreamReader::EndElement: authorSection = xmlResp.name().toString().compare("author",Qt::CaseInsensitive); break; default: break; } } } return (_photoUrl.isValid() && !_lastPhotoUrls.contains(_photoUrl)); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { return QUrl("/"); } QSize Item::doProcessSizeRequestResult(const QByteArray & /* response */) { return photoSize; } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { return _photoUrl; } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { _lastPhotoUrls.insert(_photoUrl); return QUrl("/"); } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray & /* response */) { PhotoInfo info; info.title = photoTitle; info.description = photoDescription; info.owner = photoOwner; info.sourceUrl = _sourceUrl; info.location = photoLocation; info.searchString = _text; return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); _text = settings.value(SEARCH_TEXT,QString()).toString(); data = qUncompress(settings.value(LAST_PHOTO_URLS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoUrls; buf.close(); } void Item::doSaveSettings(QSettings &settings) const { settings.setValue(SEARCH_TEXT,_text); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoUrls; buf.close(); settings.setValue(LAST_PHOTO_URLS,qCompress(data)); } bool Item::equalTo(Engine::Item *item) const { Item *picasaItem = qobject_cast (item); return picasaItem && (text() == picasaItem->text()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QHBoxLayout *mainLayout = new QHBoxLayout; leSearchFor = new QLineEdit(this); leSearchFor->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Maximum); mainLayout->addWidget(new QLabel(tr("Search for:"),this)); mainLayout->addWidget(leSearchFor); setLayout(mainLayout); leSearchFor->setFocus(); } XtEngine::Item *DialogWidget::returnItem() { Item *item = qobject_cast (core()->newItem()); item->setText(leSearchFor->text()); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *picasaItem = qobject_cast (item); setWindowTitle(tr("Edit Picasa item")); leSearchFor->setText(picasaItem->text()); } else setWindowTitle(tr("Add Picasa item")); } wally-2.4.4/src/about.cpp0000644000000000000000000001407011676624760013775 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "utils.h" #include "gui.h" #include "about.h" AboutDialog::AboutDialog(QWidget *parent) : Gui::Dialog(Gui::Dialog::TopOfScreen,parent) { int row = 0; QString format, details; QMap formats = getFormats(); QStringList supportedFormats = getSupportedImageFormats(); QStringListIterator supportedFormat(supportedFormats); setupUi(this); lblTitle->setText(qApp->applicationName() + " " + qApp->applicationVersion()); wdgDetails->setVisible(false); twSupportedImageFormats->setRowCount(supportedFormats.size()); while (supportedFormat.hasNext()) { format = supportedFormat.next(); twSupportedImageFormats->setItem(row,0,new QTableWidgetItem(format.toUpper())); twSupportedImageFormats->setItem(row++,1,new QTableWidgetItem(formats.value(format))); } twAdditionalInfo->setColumnCount(2); twAdditionalInfo->setRowCount(2); twAdditionalInfo->setItem(0,0,new QTableWidgetItem(tr("Compiled with:"))); twAdditionalInfo->setItem(0,1,new QTableWidgetItem(QT_VERSION_STR)); twAdditionalInfo->setItem(1,0,new QTableWidgetItem(tr("EXIF library:"))); #ifdef EXIF twAdditionalInfo->setItem(1,1,new QTableWidgetItem(tr("present"))); #else twAdditionalInfo->setItem(1,1,new QTableWidgetItem(tr("not present"))); #endif twTranslators->setColumnCount(2); twTranslators->setRowCount(17); twTranslators->setItem(0,0,new QTableWidgetItem(QIcon(":/images/uk"),tr("English"))); twTranslators->setItem(0,1,new QTableWidgetItem("Antonio Di Monaco")); twTranslators->setItem(1,0,new QTableWidgetItem(QIcon(":/images/italy"),tr("Italian"))); twTranslators->setItem(1,1,new QTableWidgetItem("Antonio Di Monaco")); twTranslators->setItem(2,0,new QTableWidgetItem(QIcon(":/images/russia"),tr("Russian"))); twTranslators->setItem(2,1,new QTableWidgetItem(QString::fromUtf8("\320\242\320\260\321\202\321\214\321\217\320\275\320\260 \320\240\321\203\320\261\320\270\320\275\320\260"))); twTranslators->setItem(3,0,new QTableWidgetItem(QIcon(":/images/spain"),tr("Spanish"))); twTranslators->setItem(3,1,new QTableWidgetItem("Martino Vedana")); twTranslators->setItem(4,0,new QTableWidgetItem(QIcon(":/images/brazil"),tr("Portuguese (Brazil)"))); twTranslators->setItem(4,1,new QTableWidgetItem(QString::fromUtf8("\115\303\241\162\143\151\157\40\115\157\162\141\145\163"))); twTranslators->setItem(5,0,new QTableWidgetItem(QIcon(":/images/germany"),tr("German"))); twTranslators->setItem(5,1,new QTableWidgetItem("Klaus-Peter Gores")); twTranslators->setItem(6,0,new QTableWidgetItem(QIcon(":/images/france"),tr("French"))); twTranslators->setItem(6,1,new QTableWidgetItem("Nicolas Remy")); twTranslators->setItem(7,0,new QTableWidgetItem(QIcon(":/images/czech_republic"),tr("Czech"))); twTranslators->setItem(7,1,new QTableWidgetItem(QString::fromUtf8("\115\141\162\164\151\156\40\120\141\166\154\303\255\153"))); twTranslators->setItem(8,0,new QTableWidgetItem(QIcon(":/images/china"),tr("Chinese"))); twTranslators->setItem(8,1,new QTableWidgetItem(QString::fromUtf8("\345\276\241\347\224\250\350\275\257\344\273\266"))); twTranslators->setItem(9,0,new QTableWidgetItem(QIcon(":/images/poland"),tr("Polish"))); twTranslators->setItem(9,1,new QTableWidgetItem("Dominik Szczerba")); twTranslators->setItem(10,0,new QTableWidgetItem(QIcon(":/images/catalonia"),tr("Catalan"))); twTranslators->setItem(10,1,new QTableWidgetItem(QString::fromUtf8("\115\151\161\165\145\154\40\122\303\240\155\151\141"))); twTranslators->setItem(11,0,new QTableWidgetItem(QIcon(":/images/greece"),tr("Greek"))); twTranslators->setItem(11,1,new QTableWidgetItem(QString::fromUtf8("\316\230\317\211\316\274\316\254\317\202\40\316\244\317\203\316\254\316\262\316\261\316\273\316\277\317\202"))); twTranslators->setItem(12,0,new QTableWidgetItem(QIcon(":/images/korea"),tr("Korean"))); twTranslators->setItem(12,1,new QTableWidgetItem(QString::fromUtf8("\354\235\264\353\215\225\355\235\254"))); twTranslators->setItem(13,0,new QTableWidgetItem(QIcon(":/images/hungary"),tr("Hungarian"))); twTranslators->setItem(13,1,new QTableWidgetItem(QString::fromUtf8("\122\165\155\303\241\156\40\123\303\241\156\144\157\162"))); twTranslators->setItem(14,0,new QTableWidgetItem(QIcon(":/images/denmark"),tr("Danish"))); twTranslators->setItem(14,1,new QTableWidgetItem("Michael Borries")); twTranslators->setItem(15,0,new QTableWidgetItem(QIcon(":/images/sweden"),tr("Swedish"))); twTranslators->setItem(15,1,new QTableWidgetItem("Andreas Klintemyr")); twTranslators->setItem(16,0,new QTableWidgetItem(QIcon(":/images/turkey"),tr("Turkish"))); twTranslators->setItem(16,1,new QTableWidgetItem(QString::fromUtf8("\122\145\143\145\160\40\303\207\141\153\141\156"))); twTranslators->sortItems(0); twSupportedImageFormats->resizeColumnsToContents(); twSupportedImageFormats->resizeRowsToContents(); twAdditionalInfo->resizeColumnsToContents(); twAdditionalInfo->resizeRowsToContents(); twTranslators->resizeColumnsToContents(); twTranslators->resizeRowsToContents(); connect(pbDetails,SIGNAL(toggled(bool)),wdgDetails,SLOT(setVisible(bool))); lblLogo->setPixmap(QPixmap(":/images/logo").scaled(lblLogo->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); } wally-2.4.4/src/yahoo.cpp0000644000000000000000000002164511676624760014010 0ustar rootroot/* TRANSLATOR Yahoo::Item */ /* TRANSLATOR Yahoo::Core */ /* TRANSLATOR Yahoo::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "httpengine.h" #include "yahoo.h" using namespace Yahoo; Item::Item() : HttpEngine::Item() { _tagsCondition = And; _contentFiltered = true; } Item::Item(Item *item) : HttpEngine::Item(item) { _tags = item->_tags; _tagsCondition = item->_tagsCondition; _contentFiltered = item->_contentFiltered; } QVariant Item::data() const { QString str; if (_tags.size()) { str = QString("") + tr("Tags:") + " " + _tags.join((_tagsCondition == And)? " " + tr("and") + " " : " " + tr("or") + " ") + ""; if (_contentFiltered) str += "
  (" + tr("content filtered") + ")"; } return str; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const { return (pages)? (currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1) % pages) : 1; } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { photoTitle.clear(); photoDescription.clear(); _photoUrl.clear(); _sourceUrl.clear(); photoOwner.clear(); photoSize = QSize(-1,-1); return QUrl(); } QUrl Item::doPrepareSearch(HttpEngine::Operation & /* op */) { QUrl url("http://search.yahooapis.com/ImageSearchService/V1/imageSearch"); url.addQueryItem("appid",YAHOO_API_KEY); if (_tags.size()) { url.addQueryItem("query",_tags.join("+")); url.addQueryItem("type",(_tagsCondition == And)? "all" : "any"); } else return QUrl(); if (!_contentFiltered) url.addQueryItem("adult_ok","1"); url.addQueryItem("results","1"); url.addQueryItem("start",QString::number(pageIndex())); return url; } bool Item::doProcessSearchResult(const QByteArray &response, int &newPagesCount) { bool respError = false, thumbnail = false; QXmlStreamReader xmlResp(response); while ((!xmlResp.atEnd()) && (!respError)) switch (xmlResp.readNext()) { case QXmlStreamReader::StartElement: if (!xmlResp.name().toString().compare("Thumbnail",Qt::CaseInsensitive)) thumbnail = true; else if (!xmlResp.name().toString().compare("ResultSet",Qt::CaseInsensitive)) { respError = (xmlResp.attributes().value("totalResultsReturned").toString() != "1"); newPagesCount = xmlResp.attributes().value("totalResultsAvailable").toString().toInt(); } else if (!xmlResp.name().toString().compare("Title",Qt::CaseInsensitive) && photoTitle.isEmpty()) { xmlResp.readNext(); photoTitle = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("Summary",Qt::CaseInsensitive) && photoDescription.isEmpty()) { xmlResp.readNext(); photoDescription = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("Url",Qt::CaseInsensitive) && _photoUrl.isEmpty()) { xmlResp.readNext(); _photoUrl = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("Publisher",Qt::CaseInsensitive) && photoOwner.isEmpty()) { xmlResp.readNext(); photoOwner = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("Height",Qt::CaseInsensitive) && !thumbnail) { xmlResp.readNext(); photoSize.setHeight(xmlResp.text().toString().toInt()); } else if (!xmlResp.name().toString().compare("Width",Qt::CaseInsensitive) && !thumbnail) { xmlResp.readNext(); photoSize.setWidth(xmlResp.text().toString().toInt()); } else if (!xmlResp.name().toString().compare("RefererUrl",Qt::CaseInsensitive) && !thumbnail) { xmlResp.readNext(); _sourceUrl = xmlResp.text().toString(); } break; case QXmlStreamReader::EndElement: if (!xmlResp.name().toString().compare("Thumbnail",Qt::CaseInsensitive)) thumbnail = false; break; default: break; } return (!respError && _photoUrl.isValid() && !_lastPhotoUrls.contains(_photoUrl)); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { return QUrl("/"); } QSize Item::doProcessSizeRequestResult(const QByteArray & /* response */) { return photoSize; } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { return _photoUrl; } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { _lastPhotoUrls.insert(_photoUrl); return QUrl("/"); } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray & /* response */) { PhotoInfo info; info.title = photoTitle; info.description = photoDescription; info.owner = photoOwner; info.sourceUrl = _sourceUrl; info.searchString = _tags.join(" "); return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); _tags = settings.value(TAGS,QString()).toString().split(" "); _tagsCondition = static_cast (settings.value(TAGS_CONDITION,And).toInt()); setFilterContent(settings.value(CONTENT_FILTERED,true).toBool()); data = qUncompress(settings.value(LAST_PHOTO_URLS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoUrls; buf.close(); } void Item::doSaveSettings(QSettings &settings) const { settings.setValue(TAGS,_tags.join(" ")); settings.setValue(TAGS_CONDITION,_tagsCondition); settings.setValue(CONTENT_FILTERED,_contentFiltered); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoUrls; buf.close(); settings.setValue(LAST_PHOTO_URLS,qCompress(data)); } bool Item::equalTo(Engine::Item *item) const { Item *yahooItem = qobject_cast (item); return yahooItem && (tags().join(";") == yahooItem->tags().join(";")) && (tagsCondition() == yahooItem->tagsCondition()) && (isContentFiltered() == yahooItem->isContentFiltered()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QVBoxLayout *mainLayout = new QVBoxLayout; QHBoxLayout *topLayout = new QHBoxLayout; leSearchFor = new QLineEdit(this); leSearchFor->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); cbTagsCondition = new QComboBox(this); cbTagsCondition->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbTagsCondition->addItem(tr("All of these words"),And); cbTagsCondition->addItem(tr("Any of these words"),Or); cbTagsCondition->setCurrentIndex(0); topLayout->addWidget(new QLabel(tr("Search for:"),this)); topLayout->addWidget(leSearchFor); topLayout->addWidget(cbTagsCondition); cbFilterContent = new QCheckBox(this); cbFilterContent->setText(tr("Filter content")); mainLayout->addLayout(topLayout); mainLayout->addWidget(cbFilterContent); setLayout(mainLayout); leSearchFor->setFocus(); } XtEngine::Item *DialogWidget::returnItem() { Item *item = qobject_cast (core()->newItem()); item->setTags(leSearchFor->text().split(" ")); item->setTagsCondition(static_cast (cbTagsCondition->itemData(cbTagsCondition->currentIndex()).toInt())); item->setFilterContent(cbFilterContent->isChecked()); if (!item->isContentFiltered()) QMessageBox::warning(this,tr("Yahoo! item"), tr("Unfiltered content can show offending or sexual explicit photos")); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *yahooItem = qobject_cast (item); setWindowTitle(tr("Edit Yahoo! item")); leSearchFor->setText(yahooItem->tags().join(" ")); cbTagsCondition->setCurrentIndex(cbTagsCondition->findData(yahooItem->tagsCondition())); cbFilterContent->setChecked(yahooItem->isContentFiltered()); } else { setWindowTitle(tr("Add Yahoo! item")); cbFilterContent->setChecked(true); } } wally-2.4.4/src/gui.cpp0000644000000000000000000002516311676624760013454 0ustar rootroot/* TRANSLATOR Gui::ColorButton */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "gui.h" using namespace Gui; EngineButton::EngineButton(QWidget *parent) : QPushButton(parent) { setup(); } EngineButton::EngineButton(const QString &text, QWidget *parent) : QPushButton(text,parent) { setup(); } EngineButton::EngineButton(const QIcon &icon, const QString &text, QWidget *parent) : QPushButton(icon,text,parent) { setup(); } QSize EngineButton::sizeHint() const { if (_pixmap.isNull()) return QSize(QPushButton::sizeHint().width(),(_height == -1)? QPushButton::sizeHint().height() : _height); else return QSize(_pixmap.width() + 10,(_height == -1)? _pixmap.height() + 10 : _height); } void EngineButton::setPixmap(const QPixmap &pixmap) { _pixmap = pixmap; update(); } void EngineButton::paintEvent(QPaintEvent * /* event */) { QStyleOptionButton optionButton; QStylePainter painter(this); initStyleOption(&optionButton); if (_isOver && !isDown()) { optionButton.features |= QStyleOptionButton::None; optionButton.features &= ~QStyleOptionButton::Flat; optionButton.state |= QStyle::State_Raised; optionButton.state &= ~QStyle::State_Sunken; } else { optionButton.features |= QStyleOptionButton::Flat; optionButton.features &= ~QStyleOptionButton::None; } optionButton.state &= ~QStyle::State_HasFocus; painter.drawControl(QStyle::CE_PushButton,optionButton); if (!_pixmap.isNull()) painter.drawPixmap((width() - _pixmap.width()) / 2, (height() - _pixmap.height()) / 2,_pixmap); } void EngineButton::enterEvent(QEvent * /* event */) { _isOver = true; repaint(); } void EngineButton::leaveEvent(QEvent * /* event */) { _isOver = false; repaint(); } void EngineButton::setup() { QString newText = text().replace(" ","\n"); QFont newFont(font()); _height = -1; _isOver = false; newFont.setPointSize(13); setText(newText); setFlat(true); setCheckable(true); setFont(newFont); } void ColorButton::setColor(const QColor &color) { if (color.isValid()) { _color = color; repaint(); emit colorChanged(_color); } } void ColorButton::paintEvent(QPaintEvent *event) { QPushButton::paintEvent(event); QPainter painter(this); QStyleOptionButton option; option.initFrom(this); option.text = (_color.alpha())? QString() : tr("Auto"); painter.setRenderHint(QPainter::Antialiasing,true); QRect rect = QApplication::style()->subElementRect(QStyle::SE_PushButtonContents,&option,this); if (_color.alpha()) painter.fillRect(rect.adjusted(rect.width() / 8,rect.height() / 3,-rect.width() / 8,-rect.height() / 3),color()); else painter.drawText(rect,Qt::AlignCenter,tr("Auto")); } void ColorButton::nextCheckState() { QPushButton::nextCheckState(); if (color().alpha()) setColor(QColor(color().red(),color().green(),color().blue(),0)); else { QColor newColor = QColorDialog::getColor(color().rgb()); if (newColor.isValid()) setColor(newColor); } } void Dialog::showEvent(QShowEvent *event) { if (!fired) emit executed(); QDialog::showEvent(event); if (!fired) { fired = true; updateGeometry(); move((QApplication::desktop()->availableGeometry().width() - width()) / 2, (_position == CenterOfScreen)? (QApplication::desktop()->availableGeometry().height() - height()) / 2 : QApplication::desktop()->availableGeometry().height() / 10); } } void Dialog::closeEvent(QCloseEvent *event) { emit closed(); QDialog::closeEvent(event); } ScrollableButtons::ScrollableButtons(QWidget *parent) : QFrame(parent) { QPalette appPalette = QApplication::palette(); QWidget *buttonWidget = new QWidget(this); QVBoxLayout *layout = new QVBoxLayout; firstShowEvent = true; setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Expanding); buttonUp = new QPushButton(QIcon(":/images/up"),QString(),this); buttonDown = new QPushButton(QIcon(":/images/down"),QString(),this); appPalette.setColor(QPalette::Window,appPalette.color(QPalette::Base)); setPalette(appPalette); buttonUp->setAutoRepeat(true); buttonDown->setAutoRepeat(true); scrollArea = new QScrollArea(this); scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scrollArea->setFrameShape(QFrame::NoFrame); scrollArea->verticalScrollBar()->setTracking(true); scrollArea->setContentsMargins(0,0,0,0); buttonLayout = new QVBoxLayout; buttonLayout->setSpacing(0); buttonLayout->setContentsMargins(0,0,0,0); buttonWidget->setLayout(buttonLayout); buttonWidget->setContentsMargins(0,0,0,0); scrollArea->setWidget(buttonWidget); scrollArea->setAlignment(Qt::AlignHCenter | Qt::AlignTop); scrollArea->setWidgetResizable(true); layout->addWidget(buttonUp); layout->addWidget(scrollArea); layout->addWidget(buttonDown); layout->setContentsMargins(0,0,0,0); layout->setSpacing(3); setLayout(layout); setFrameShape(QFrame::StyledPanel); setFrameShadow(QFrame::Plain); connect(buttonUp,SIGNAL(clicked()),this,SLOT(on_buttonUp_clicked())); connect(buttonDown,SIGNAL(clicked()),this,SLOT(on_buttonDown_clicked())); connect(scrollArea->verticalScrollBar(),SIGNAL(valueChanged(int)), this,SLOT(on_scrollBar_valueChanged(int))); buttonGroup = new QButtonGroup(this); connect(buttonGroup,SIGNAL(buttonClicked(QAbstractButton *)), this,SIGNAL(buttonClicked(QAbstractButton *))); connect(buttonGroup,SIGNAL(buttonClicked(int)), this,SIGNAL(buttonClicked(int))); connect(buttonGroup,SIGNAL(buttonPressed(QAbstractButton *)), this,SIGNAL(buttonPressed(QAbstractButton *))); connect(buttonGroup,SIGNAL(buttonPressed(int)), this,SIGNAL(buttonPressed(int))); connect(buttonGroup,SIGNAL(buttonReleased(QAbstractButton *)), this,SIGNAL(buttonReleased(QAbstractButton *))); connect(buttonGroup,SIGNAL(buttonReleased(int)), this,SIGNAL(buttonReleased(int))); } void ScrollableButtons::on_buttonUp_clicked() { scrollArea->verticalScrollBar()->setValue(scrollArea->verticalScrollBar()->value() - 10); } void ScrollableButtons::on_buttonDown_clicked() { scrollArea->verticalScrollBar()->setValue(scrollArea->verticalScrollBar()->value() + 10); } void ScrollableButtons::addButton(QAbstractButton *button) { buttonLayout->addWidget(button); buttonGroup->addButton(button); } void ScrollableButtons::addButton(QAbstractButton *button, int id) { buttonLayout->addWidget(button); buttonGroup->addButton(button,id); } QAbstractButton *ScrollableButtons::button(int id) const { return buttonGroup->button(id); } QList ScrollableButtons::buttons() const { return buttonGroup->buttons(); } QAbstractButton *ScrollableButtons::checkedButton() const { return buttonGroup->checkedButton(); } int ScrollableButtons::checkedId() const { return buttonGroup->checkedId(); } bool ScrollableButtons::exclusive() const { return buttonGroup->exclusive(); } int ScrollableButtons::id(QAbstractButton *button) const { return buttonGroup->id(button); } void ScrollableButtons::insertButton(int index, QAbstractButton *button) { buttonLayout->insertWidget(index,button); buttonGroup->addButton(button); } void ScrollableButtons::insertButton(int index, QAbstractButton *button, int id) { buttonLayout->insertWidget(index,button); buttonGroup->addButton(button,id); } void ScrollableButtons::removeButton(QAbstractButton *button) { buttonLayout->removeWidget(button); buttonGroup->removeButton(button); } void ScrollableButtons::setExclusive(bool exclusive) { buttonGroup->setExclusive(exclusive); } void ScrollableButtons::setId(QAbstractButton *button, int id) { buttonGroup->setId(button,id); } void ScrollableButtons::on_scrollBar_valueChanged(int value) { buttonUp->setEnabled(value > scrollArea->verticalScrollBar()->minimum()); buttonDown->setEnabled(value < scrollArea->verticalScrollBar()->maximum()); } void ScrollableButtons::resizeEvent(QResizeEvent *event) { QFrame::resizeEvent(event); QTimer::singleShot(0,this,SLOT(scrollToSelected())); } void ScrollableButtons::showEvent(QShowEvent *event) { qDebug() << "ScrollableButtons::showEvent"; QFrame::showEvent(event); if (firstShowEvent) { firstShowEvent = false; QTimer::singleShot(0,this,SLOT(scrollToSelected())); } } void ScrollableButtons::scrollToSelected() { QAbstractButton *selectedButton = 0; QListIterator button(buttonGroup->buttons()); while (button.hasNext()) { QAbstractButton *buttonItem = button.next(); if (buttonItem->isChecked()) selectedButton = buttonItem; } if (selectedButton) scrollToButton(selectedButton); } void ShadowedLabel::paintEvent(QPaintEvent * /* event */) { int delta = (font().pointSize() > 10)? 2 : 1; QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::TextAntialiasing); painter.setPen(_shadowColor); painter.setBrush(_shadowColor); painter.drawText(rect().adjusted(0,0,-delta,-delta).translated(delta,delta),alignment(),text()); painter.setPen(_labelColor); painter.setBrush(_labelColor); painter.drawText(rect().adjusted(0,0,-delta,-delta),alignment(),text()); } QSize ShadowedLabel::sizeHint() const { return QLabel::sizeHint() + ((font().pointSize() > 10)? QSize(2,2) : QSize(1,1)); } ShrinkableTableWidget::ShrinkableTableWidget(QWidget *parent) : QTableWidget(parent) { setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred); } ShrinkableTableWidget::ShrinkableTableWidget(int rows, int columns, QWidget *parent) : QTableWidget(rows,columns,parent) { setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred); } QSize ShrinkableTableWidget::sizeHint() const { int row, height; for (row = height = 0; row < rowCount(); ++row) height += rowHeight(row); return QSize(QTableWidget::sizeHint().width(),height + 10); } wally-2.4.4/src/splash.cpp0000644000000000000000000000554511676624760014164 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "gui.h" #include "splash.h" #define TITLE_FONT_POINT_SIZE 40 #define VERSION_FONT_POINT_SIZE 5 #define TEXT_MARGIN 10 SplashScreen::SplashScreen() : QSplashScreen(QPixmap(),Qt::WindowStaysOnTopHint) { QFont titleFont = qApp->font(); QFont authorFont = qApp->font(); QFont versionFont = qApp->font(); logo = new QPixmap(":/images/logo"); QWidget *textWidget = new QWidget(this); QVBoxLayout *textLayout = new QVBoxLayout; Gui::ShadowedLabel *titleLabel = new Gui::ShadowedLabel(qApp->applicationName(),this); titleLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); titleFont.setBold(true); titleFont.setPointSize(40); titleLabel->setFont(titleFont); Gui::ShadowedLabel *versionLabel = new Gui::ShadowedLabel(qApp->applicationVersion(),this); versionFont.setPointSize(20); versionLabel->setFont(versionFont); versionLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); Gui::ShadowedLabel *authorLabel = new Gui::ShadowedLabel(tr("Author:") + " Antonio Di Monaco",this); authorFont.setPointSize(10); authorLabel->setFont(authorFont); authorLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); QWidget *spacerWidget = new QWidget(this); spacerWidget->setFixedHeight(15); textLayout->setSpacing(1); textLayout->addStretch(); textLayout->addWidget(titleLabel); textLayout->addWidget(versionLabel); textLayout->addWidget(spacerWidget); textLayout->addWidget(authorLabel); textWidget->setLayout(textLayout); textWidget->setFixedSize(logo->size().width(), logo->height() - QFontMetrics(qApp->font()).height() - 12); QPainter painter(logo); painter.setRenderHint(QPainter::Antialiasing,true); painter.setRenderHint(QPainter::TextAntialiasing,true); painter.fillRect(QRect(8,logo->height() - QFontMetrics(qApp->font()).height() - 12, logo->width(),logo->height()),Qt::black); painter.end(); textWidget->render(logo,QPoint(),QRegion(),0); setMask(QRegion(logo->mask())); setPixmap(*logo); } SplashScreen::~SplashScreen() { delete logo; } wally-2.4.4/src/vladstudio.cpp0000644000000000000000000002256111676624760015045 0ustar rootroot/* TRANSLATOR Vladstudio::Item */ /* TRANSLATOR Vladstudio::Core */ /* TRANSLATOR Vladstudio::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "httpengine.h" #include "vladstudio.h" using namespace Vladstudio; QString Item::categoryToString(Category category) { switch (category) { case All: return tr("All categories"); break; case AbstractArt: return tr("Abstract art"); break; case Creatures: return tr("Creatures"); break; case Illustrations: return tr("Illustrations"); break; case Photos: return tr("Photos"); break; default: return QString(); } } Item::Item() : HttpEngine::Item(), _lastPhotoIds(5) { _category = All; _viewOrder = ById; _orderDirection = Ascending; } Item::Item(Item *item) : HttpEngine::Item(item), _lastPhotoIds(5) { _category = item->category(); _viewOrder = item->viewOrder(); _orderDirection = item->orderDirection(); } QVariant Item::data() const { QString str(""); str += categoryToString(_category) + " - "; switch (_viewOrder) { case ById: str += tr("by Id"); break; case ByView: str += tr("by view count"); break; default: break; } str += ", "; switch (_orderDirection) { case Ascending: str += tr("ascending"); break; case Descending: str += tr("descending"); break; default: break; } str += ""; return str; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const { return (pages)? (currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1) % pages) : 0; } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { _photoId.clear(); photoTitle.clear(); photoDescription.clear(); _photoUrl.clear(); _sourceUrl.clear(); photoOwner.clear(); photoSize = QSize(-1,-1); return QUrl(); } QUrl Item::doPrepareSearch(HttpEngine::Operation & /* op */) { QUrl url("http://vladstudio.com/api/wally/getlistofwallpapers.php"); if (category() != All) url.addQueryItem("categoryID",QString::number(static_cast< int >(category()))); switch (viewOrder()) { case ById: url.addQueryItem("order","id"); break; case ByView: url.addQueryItem("order","viewed"); break; default: break; } switch (orderDirection()) { case Ascending: url.addQueryItem("orderdir","asc"); break; case Descending: url.addQueryItem("orderdir","desc"); break; default: break; } url.addQueryItem("show","1"); url.addQueryItem("start",QString::number(pageIndex())); return url; } bool Item::doProcessSearchResult(const QByteArray &response, int &newPagesCount) { bool respError = false, wallpaperFound = false; QXmlStreamReader xmlResp(response); newPagesCount = 1000000; while ((!xmlResp.atEnd()) && (!respError)) switch (xmlResp.readNext()) { case QXmlStreamReader::StartElement: if (!xmlResp.name().toString().compare("wallpaper",Qt::CaseInsensitive)) wallpaperFound = true; else if (!xmlResp.name().toString().compare("id",Qt::CaseInsensitive) && _photoId.isEmpty()) { xmlResp.readNext(); _photoId = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("name",Qt::CaseInsensitive) && photoTitle.isEmpty()) { xmlResp.readNext(); photoTitle = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("webpage",Qt::CaseInsensitive) && _sourceUrl.isEmpty()) { xmlResp.readNext(); _sourceUrl = xmlResp.text().toString(); } break; default: break; } if (!wallpaperFound) newPagesCount = -1; respError |= !wallpaperFound; return (!respError && !_photoId.isEmpty() && !_lastPhotoIds.contains(_photoId)); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { QUrl url("http://www.vladstudio.com/api/wally/getwallpaper.php"); url.addQueryItem("id",_photoId); return url; } QSize Item::doProcessSizeRequestResult(const QByteArray &response) { QList< QByteArray > data = response.split('\n'); QListIterator< QByteArray > value(data); while (value.hasNext()) { QByteArray v = value.next().trimmed(); if (v.contains("url=")) _photoUrl = v.split('=').at(1).trimmed(); } return QApplication::desktop()->screenGeometry().size(); } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { return _photoUrl; } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { _lastPhotoIds.insert(_photoId); return QUrl("/"); } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray & /* response */) { PhotoInfo info; info.title = photoTitle; info.description = photoDescription; info.owner = photoOwner; info.sourceUrl = _sourceUrl; info.searchString = categoryToString(_category); return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); setCategory(static_cast (settings.value(CATEGORY,All).toInt())); setViewOrder(static_cast (settings.value(VIEW_ORDER,ById).toInt())); setOrderDirection(static_cast (settings.value(ORDER_DIRECTION,Ascending).toInt())); data = qUncompress(settings.value(LAST_PHOTO_IDS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoIds; buf.close(); } void Item::doSaveSettings(QSettings &settings) const { settings.setValue(CATEGORY,static_cast (category())); settings.setValue(VIEW_ORDER,static_cast (viewOrder())); settings.setValue(ORDER_DIRECTION,static_cast (orderDirection())); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoIds; buf.close(); settings.setValue(LAST_PHOTO_IDS,qCompress(data)); } bool Item::equalTo(Engine::Item *item) const { Item *vladstudioItem = qobject_cast (item); return vladstudioItem && (category() == vladstudioItem->category()) && (viewOrder() == vladstudioItem->viewOrder()) && (orderDirection() == vladstudioItem->orderDirection()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QFormLayout *formLayout = new QFormLayout(this); cbCategory = new QComboBox(this); cbCategory->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbCategory->addItem(tr("All"),All); cbCategory->addItem(tr("Abstract art"),AbstractArt); cbCategory->addItem(tr("Creatures"),Creatures); cbCategory->addItem(tr("Illustrations"),Illustrations); cbCategory->addItem(tr("Photos"),Photos); cbCategory->setCurrentIndex(0); cbViewOrder = new QComboBox(this); cbViewOrder->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbViewOrder->addItem(tr("By ID"),ById); cbViewOrder->addItem(tr("By view count"),ByView); cbViewOrder->setCurrentIndex(0); cbOrderDirection = new QComboBox(this); cbOrderDirection->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbOrderDirection->addItem(tr("Ascending"),Ascending); cbOrderDirection->addItem(tr("Descending"),Descending); cbOrderDirection->setCurrentIndex(0); formLayout->addRow(new QLabel(tr("Category:"),this),cbCategory); formLayout->addRow(new QLabel(tr("Order:"),this),cbViewOrder); formLayout->addRow(new QLabel(tr("Direction:"),this),cbOrderDirection); } XtEngine::Item *DialogWidget::returnItem() { Item *item = qobject_cast (core()->newItem()); item->setCategory(static_cast (cbCategory->itemData(cbCategory->currentIndex()).toInt())); item->setViewOrder(static_cast (cbViewOrder->itemData(cbViewOrder->currentIndex()).toInt())); item->setOrderDirection(static_cast (cbOrderDirection->itemData(cbOrderDirection->currentIndex()).toInt())); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *vladstudioItem = qobject_cast (item); setWindowTitle(tr("Edit Vladstudio item")); cbCategory->setCurrentIndex(cbCategory->findData(vladstudioItem->category())); cbViewOrder->setCurrentIndex(cbViewOrder->findData(vladstudioItem->viewOrder())); cbOrderDirection->setCurrentIndex(cbOrderDirection->findData(vladstudioItem->orderDirection())); } else setWindowTitle(tr("Add Vladstudio item")); } wally-2.4.4/src/photobucket.cpp0000644000000000000000000002233111676624760015211 0ustar rootroot/* TRANSLATOR Photobucket::Item */ /* TRANSLATOR Photobucket::Core */ /* TRANSLATOR Photobucket::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "httpengine.h" #include "photobucket.h" using namespace Photobucket; Item::Item() : HttpEngine::Item() { _condition = And; } Item::Item(Item *item) : HttpEngine::Item(item) { _text = item->_text; _condition = item->_condition; } QByteArray Item::hmacSha1(const QByteArray &data, const QByteArray &key) { int i; QByteArray ipad, opad, Ki0, Ko0, K0; ipad.fill(0x36,64); opad.fill(0x5c,64); K0 = key; if (key.size() > 64) K0 = QCryptographicHash::hash(key,QCryptographicHash::Sha1); if (K0.size() < 64) K0.append(QByteArray().fill(0,64-K0.size())); for (i = 0; i < 64; ++i) { Ki0[i] = K0[i] ^ ipad[i]; Ko0[i] = K0[i] ^ opad[i]; } Ki0.append(data); Ki0 = QCryptographicHash::hash(Ki0,QCryptographicHash::Sha1); Ki0.prepend(Ko0); return QCryptographicHash::hash(Ki0,QCryptographicHash::Sha1); } QVariant Item::data() const { QString str = _text; if (!str.isEmpty()) str = QString("") + tr("Text:") + " " + str.replace(" ",(_condition == And)? " " + tr("and") + " " : " " + tr("or") + " ") + ""; return str; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const { return (pages)? (currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1)) % pages : 1; } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { pbTimestamp = 0; _photoUrl.clear(); _sourceUrl.clear(); photoTitle.clear(); photoDescription.clear(); photoOwner.clear(); return QUrl("http://api.photobucket.com/time"); } void Item::doProcessInitResult(const QByteArray &response) { pbTimestamp = response.toInt(); } QUrl Item::doPrepareSearch(HttpEngine::Operation & /* op */) { if (!pbTimestamp) return QUrl(); QByteArray signature; QStringList base, params; QString newText = _text; newText.replace(" ",(_condition == And)? " and " : " or "); QUrl url = QString("http://api.photobucket.com/search/") + newText + "/image"; QByteArray nonce; int nonceLength = (qrand() % 10) + 10; while (--nonceLength) nonce += qrand() % 10 + 0x30; params << (QString("oauth_consumer_key=") + PHOTOBUCKET_API_KEY); params << (QString("oauth_nonce=") + nonce); params << "oauth_signature_method=HMAC-SHA1"; params << (QString("oauth_timestamp=") + QString::number(pbTimestamp)); params << "oauth_version=1.0"; params << (QString("page=") + QString::number(pageIndex())); params << "perpage=1"; params << "secondaryperpage=0"; base << "GET"; base << QUrl::toPercentEncoding(url.toEncoded()); base << QUrl::toPercentEncoding(params.join("&")); signature = hmacSha1(base.join("&").toAscii(),QByteArray(PHOTOBUCKET_SECRET_KEY) + "&"); params.insert(2,QString("oauth_signature=") + QUrl::toPercentEncoding(signature.toBase64())); return QUrl::fromEncoded(QString("%1?%2").arg(url.toString()).arg(params.join("&")).toAscii()); } bool Item::doProcessSearchResult(const QByteArray &response, int &newPagesCount) { bool respError = false; QXmlStreamReader xmlResp(response); while ((!xmlResp.atEnd()) && (!respError)) if (xmlResp.readNext() == QXmlStreamReader::StartElement) { if (!xmlResp.name().toString().compare("status",Qt::CaseInsensitive)) { xmlResp.readNext(); respError = xmlResp.text().toString().compare("ok",Qt::CaseInsensitive); } else if (!xmlResp.name().toString().compare("result",Qt::CaseInsensitive)) newPagesCount = xmlResp.attributes().value("totalpages").toString().toInt(); else if (!xmlResp.name().toString().compare("url",Qt::CaseInsensitive)) { xmlResp.readNext(); _photoUrl = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("albumurl",Qt::CaseInsensitive)) { xmlResp.readNext(); _sourceUrl = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("title",Qt::CaseInsensitive)) { xmlResp.readNext(); photoTitle = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("description",Qt::CaseInsensitive)) { xmlResp.readNext(); photoDescription = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("media",Qt::CaseInsensitive)) photoOwner = xmlResp.attributes().value("username").toString(); } return (!respError && _photoUrl.isValid() && !_lastPhotoUrls.contains(_photoUrl)); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { return QUrl("/"); } QSize Item::doProcessSizeRequestResult(const QByteArray & /* response */) { return QApplication::desktop()->screenGeometry().size(); } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { return _photoUrl; } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { _lastPhotoUrls.insert(_photoUrl); return QUrl("/"); } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray & /* response */) { PhotoInfo info; info.title = photoTitle; info.description = photoDescription; info.owner = photoOwner; info.sourceUrl = _sourceUrl; info.searchString = _text; return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); _text = settings.value(SEARCH_TEXT,QString()).toString(); _condition = static_cast (settings.value(CONDITION,And).toInt()); data = qUncompress(settings.value(LAST_PHOTO_URLS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoUrls; buf.close(); } void Item::doSaveSettings(QSettings &settings) const { settings.setValue(SEARCH_TEXT,_text); settings.setValue(CONDITION,_condition); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoUrls; buf.close(); settings.setValue(LAST_PHOTO_URLS,qCompress(data)); } bool Item::equalTo(Engine::Item *item) const { Item *photobucketItem = qobject_cast (item); return photobucketItem && (text() == photobucketItem->text()) && (condition() == photobucketItem->condition()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QVBoxLayout *mainLayout = new QVBoxLayout; QHBoxLayout *topLayout = new QHBoxLayout; leSearchFor = new QLineEdit(this); leSearchFor->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); cbCondition = new QComboBox(this); cbCondition->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbCondition->addItem(tr("All of these words"),And); cbCondition->addItem(tr("Any of these words"),Or); cbCondition->setCurrentIndex(0); topLayout->addWidget(new QLabel(tr("Search for:"),this)); topLayout->addWidget(leSearchFor); topLayout->addWidget(cbCondition); mainLayout->addLayout(topLayout); mainLayout->addStretch(); setLayout(mainLayout); leSearchFor->setFocus(); } XtEngine::Item *DialogWidget::returnItem() { QMessageBox::warning(this,tr("Photobucket item"), tr("It can show offending or sexual explicit photos")); Item *item = qobject_cast (core()->newItem()); item->setText(leSearchFor->text()); item->setCondition(static_cast (cbCondition->itemData(cbCondition->currentIndex()).toInt())); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *photobucketItem = qobject_cast (item); setWindowTitle(tr("Edit Photobucket item")); leSearchFor->setText(photobucketItem->text()); cbCondition->setCurrentIndex(cbCondition->findData(photobucketItem->condition())); } else setWindowTitle(tr("Add Photobucket item")); } void Core::applyWatermark(QPainter *painter, const QRect &rect) { QPixmap pixmap = QPixmap(":/images/pb_watermark").scaled(QSize(rect.width() / 5, rect.height() / 5), Qt::KeepAspectRatio, Qt::SmoothTransformation); painter->drawPixmap(rect.right() - pixmap.width(), rect.bottom() - pixmap.height(), pixmap); } wally-2.4.4/src/networkmanager.cpp0000644000000000000000000002443611676624760015716 0ustar rootroot#include #include #include #include #include #include "networkmanager.h" #include "networkmanager_p.h" using namespace Network; using namespace NetworkPrivate; Reply *Manager::get(const QNetworkRequest &req, bool recover) { return new Reply(QNetworkAccessManager::GetOperation,req,recover,_proxy); } Reply *Manager::get(const QUrl &url, bool recover) { return new Reply(QNetworkAccessManager::GetOperation,QNetworkRequest(url),recover,_proxy); } Reply *Manager::get(const QUrl &url, const QString &fileName) { return new Reply(QNetworkAccessManager::GetOperation,QNetworkRequest(url),fileName,_proxy); } Reply *Manager::post(const QNetworkRequest &req, bool recover) { return new Reply(QNetworkAccessManager::PostOperation,req,recover,_proxy); } Reply *Manager::post(const QUrl &url, bool recover) { return new Reply(QNetworkAccessManager::PostOperation,QNetworkRequest(url),recover,_proxy); } Reply *Manager::post(const QUrl &url, const QString &fileName) { return new Reply(QNetworkAccessManager::PostOperation,QNetworkRequest(url),fileName,_proxy); } Reply::Reply(QNetworkAccessManager::Operation operation, const QNetworkRequest &req, const QString &fileName, const QNetworkProxy &proxy) : QObject(), _operation(operation), _isFirstRequest(true), _isRecoverable(false), _totalSize(0), _currentSize(0), _req(req), _isRecoverActive(true), _usingFile(true), _proxy(proxy), _file(fileName), _stateMachine(new QStateMachine(this)) { _file.open(QIODevice::WriteOnly); buildAndStartStateMachine(); } Reply::Reply(QNetworkAccessManager::Operation operation, const QNetworkRequest &req, bool recover, const QNetworkProxy &proxy) : QObject(), _operation(operation), _isFirstRequest(true), _isRecoverable(false), _totalSize(0), _currentSize(0), _req(req), _isRecoverActive(recover), _usingFile(false), _proxy(proxy), _stateMachine(new QStateMachine(this)) { buildAndStartStateMachine(); } void Reply::buildAndStartStateMachine() { QState *initialState = new InitialState(_isRecoverActive,_stateMachine); QState *getReqState = new GetReqState(this,_proxy,_req,_stateMachine); QState *headReqState = new HeadReqState(this,_proxy,_req,_stateMachine); QState *headNewTryState = new NewTryState(_stateMachine); QState *getNewTryState = new NewTryState(_stateMachine); QState *checkDataState = new CheckDataState(this,_stateMachine); QFinalState *okState = new OKState(_stateMachine); QFinalState *errorState = new ErrorState(_stateMachine); connect(headReqState,SIGNAL(headerInfoAvailable(int,bool)), this,SLOT(updateInfo(int,bool))); connect(getReqState,SIGNAL(dataAvailable(const QByteArray &)), this,SLOT(appendMoreData(const QByteArray &))); connect(getReqState,SIGNAL(newRequest()), this,SLOT(updatePointers())); connect(okState,SIGNAL(entered()), this,SLOT(signalOk())); connect(errorState,SIGNAL(entered()), this,SLOT(signalError())); initialState->addTransition(new StartWRecTransition(headReqState)); initialState->addTransition(new StartWORecTransition(getReqState)); headReqState->addTransition(new OKTransition(getReqState)); headReqState->addTransition(new ErrorTransition(headNewTryState)); headNewTryState->addTransition(new OneMoreTryTransition(headReqState)); headNewTryState->addTransition(new ErrorTransition(errorState)); getReqState->addTransition(new OKTransition(checkDataState)); getReqState->addTransition(new ErrorTransition(getNewTryState)); getNewTryState->addTransition(new OneMoreTryTransition(getReqState)); getNewTryState->addTransition(new ErrorTransition(errorState)); checkDataState->addTransition(new OKTransition(okState)); checkDataState->addTransition(new ErrorTransition(getNewTryState)); _stateMachine->setInitialState(initialState); _stateMachine->start(); } void Reply::updatePointers() { if (!_isRecoverable && !_isFirstRequest) { _currentSize = 0; if (_usingFile) { _file.close(); _file.open(QIODevice::WriteOnly); } else _buffer.clear(); } _isFirstRequest = false; } void Reply::updateInfo(int size, bool recoverable) { _totalSize = size; _isRecoverable = recoverable; if (!_usingFile) _buffer.reserve(_totalSize); } void Reply::appendMoreData(const QByteArray &data) { if (_usingFile) _file.write(data); else _buffer.append(data); _currentSize += data.size(); emit progress(_currentSize,_totalSize); } void Reply::abort() { _stateMachine->stop(); if (!_trackedReply.isNull()) _trackedReply->abort(); signalError(); } void Reply::signalOk() { if (_usingFile) _file.close(); emit finished(true,_buffer); } void Reply::signalError() { if (_usingFile) { _file.close(); _file.remove(); } emit finished(false,QByteArray()); } NetworkAccessManager::NetworkAccessManager(QObject *parent) : QNetworkAccessManager(parent), _signalMapper(new QSignalMapper(this)) { connect(_signalMapper,SIGNAL(mapped(QObject *)), this,SLOT(abortReply(QObject *))); } void NetworkAccessManager::abortReply(QObject *object) { QNetworkReply *reply = qobject_cast< QNetworkReply * >(object); if (reply) reply->abort(); } QNetworkReply *NetworkAccessManager::createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData) { QNetworkReply *reply = QNetworkAccessManager::createRequest(op,req,outgoingData); QTimer *timer = new QTimer(this); _signalMapper->setMapping(timer,reply); timer->setInterval(Reply::TIMEOUT); timer->setSingleShot(true); connect(timer,SIGNAL(timeout()),_signalMapper,SLOT(map())); reply->setReadBufferSize(Reply::BUF_SIZE); connect(reply,SIGNAL(downloadProgress(qint64,qint64)),timer,SLOT(start())); connect(reply,SIGNAL(metaDataChanged()),timer,SLOT(start())); connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),timer,SLOT(stop())); connect(reply,SIGNAL(aboutToClose()),timer,SLOT(stop())); connect(reply,SIGNAL(finished()),timer,SLOT(stop())); reply->open(QIODevice::ReadOnly); QTimer::singleShot(0,timer,SLOT(start())); return reply; } void InitialState::onEntry(QEvent *event) { State::onEntry(event); if (_recover) machine()->postEvent(new ReqWRecEvent); else machine()->postEvent(new ReqWORecEvent); } HttpReqState::HttpReqState(Network::Reply *reply, const QNetworkProxy &proxy, const QNetworkRequest &request, QState *parent) : State(parent), _networkReply(reply), _manager(new NetworkAccessManager(this)), _request(request) { _manager->setProxy(proxy); connect(_manager,SIGNAL(finished(QNetworkReply *)),this,SLOT(processReply(QNetworkReply *))); } void HttpReqState::onEntry(QEvent *event) { State::onEntry(event); createReply(_manager,_request); } QNetworkReply *HttpReqState::createReply(QNetworkAccessManager *manager, const QNetworkRequest &request) { QNetworkReply *reply = doCreateReply(manager,request); networkReply()->trackReply(reply); connect(reply,SIGNAL(readyRead()),this,SLOT(processReplyData())); return reply; } void HttpReqState::processReplyData() { QNetworkReply *reply = qobject_cast< QNetworkReply * >(sender()); if (reply) doProcessReplyData(reply->readAll()); } void HttpReqState::processReply(QNetworkReply *reply) { reply->deleteLater(); if (reply->error() == QNetworkReply::NoError) { if (!reply->attribute(QNetworkRequest::RedirectionTargetAttribute).isNull()) createReply(reply->manager(), QNetworkRequest(reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl())); else { doProcessReply(reply); machine()->postEvent(new OKEvent); } } else { doProcessReply(reply); if (machine()->isRunning()) machine()->postEvent(new ErrorEvent); } } QNetworkReply *HeadReqState::doCreateReply(QNetworkAccessManager *manager, const QNetworkRequest &request) { QNetworkRequest req(request); req.setRawHeader("Connection","keep-alive"); req.setRawHeader("Accept-Ranges","bytes"); req.setRawHeader("Accept","*/*"); return manager->head(req); } void HeadReqState::doProcessReply(QNetworkReply *reply) { if (reply->error() == QNetworkReply::NoError) { QVariant size(reply->header(QNetworkRequest::ContentLengthHeader)); if (!size.isNull()) emit headerInfoAvailable(size.toInt(), reply->hasRawHeader("Accept-Ranges") && QString(reply->rawHeader("Accept-Ranges")).compare("none",Qt::CaseInsensitive)); } } void NewTryState::onEntry(QEvent *event) { State::onEntry(event); if (++_currentTry == Reply::MAX_TRIES) machine()->postEvent(new ErrorEvent); else machine()->postEvent(new OKEvent); } QNetworkReply *GetReqState::doCreateReply(QNetworkAccessManager *manager, const QNetworkRequest &request) { QNetworkRequest req(request); if (networkReply()->totalSize() && networkReply()->currentSize()) req.setRawHeader("Range",QString("bytes=%1-%2").arg(networkReply()->currentSize()) .arg(networkReply()->totalSize()).toAscii()); emit newRequest(); switch (networkReply()->operation()) { case QNetworkAccessManager::GetOperation: return manager->get(req); case QNetworkAccessManager::PostOperation: { QStringList data; QListIterator< QPair< QByteArray,QByteArray > > item(request.url().encodedQueryItems()); while (item.hasNext()) { QPair< QByteArray,QByteArray > i(item.next()); data << QString("%1=%2").arg(i.first.constData()).arg(i.second.constData()); } req.setUrl(req.url().toString(QUrl::RemoveQuery)); return manager->post(req,data.join("&").toAscii()); } default: return 0; } } void GetReqState::doProcessReplyData(const QByteArray &data) { emit dataAvailable(data); } void CheckDataState::onEntry(QEvent *event) { State::onEntry(event); if ((!_reply->totalSize()) || (_reply->currentSize() == _reply->totalSize())) machine()->postEvent(new OKEvent); else machine()->postEvent(new ErrorEvent); } wally-2.4.4/src/engine.cpp0000644000000000000000000001303311676624760014126 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "engine.h" using namespace Engine; Core::Core(const QString &tempStorageDir, QObject *parent) : QAbstractItemModel(parent) { _active = true; _tempStorageDir = tempStorageDir; _selectionModel = new QItemSelectionModel(this); } Core::~Core() { qDeleteAll(list); } QModelIndex Core::index(int row, int column, const QModelIndex & /* parent */) const { if ((rowCount() > 0) && (columnCount() > 0) && (row >= 0) && (column >= 0) && (row < rowCount()) && (column < columnCount())) return createIndex(row,column); else return QModelIndex(); } QVariant Core::data(const QModelIndex &index, int role) const { Item *item; QVariant var; if (!index.isValid() || !list.at(index.row())) return QVariant(); item = list.at(index.row()); switch (role) { case Qt::UserRole: var.setValue(item); return var; case Qt::DisplayRole: return item->data(); case Qt::TextAlignmentRole: return int(Qt::AlignLeft | Qt::AlignVCenter); case Qt::SizeHintRole: QTextDocument document; document.setHtml(item->data().toString()); return document.size().toSize() + QSize(2*ITEM_VIEW_MARGIN,2*ITEM_VIEW_MARGIN); } return QVariant(); } bool Core::insertRows(int row, int count, const QModelIndex &parent) { int i; if (row == -1) row = rowCount(); qDebug() << name().toAscii().constData() << "::Core::insertRows(" << row << "," << count << ")"; beginInsertRows(parent,row,row + count - 1); for (i = 0; i < count; i++) list.insert(row + i,0); endInsertRows(); return true; } bool Core::removeRows(const QItemSelectionModel *selectionModel) { int i; bool ok = true; for (i = selectionModel->selectedRows().size() - 1; ok && (i >= 0); i--) ok &= removeRows(selectionModel->selectedRows().at(i).row(),1); return ok; } bool Core::removeRows(int row, int count, const QModelIndex &parent) { qDebug() << name().toAscii().constData() << "::Core::removeRows(" << row << "," << count << ")"; beginRemoveRows(parent,row,row + count - 1); while (count--) delete list.takeAt(row + count); endRemoveRows(); return true; } bool Core::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid()) return false; if ((role == Qt::EditRole) || (role == Qt::UserRole)) { qDebug() << name().toAscii().constData() << "::Core::setData(" << index.row() << ")"; Item *item = value.value(); if (list.at(index.row()) != item) delete list.at(index.row()); list[index.row()] = item; emit dataChanged(index,index); return true; } return false; } void Core::edit() { qDebug() << name().toAscii().constData() << "::Core::edit()"; QListIterator item(sourceList); list.clear(); while (item.hasNext()) list << newItem(item.next()); } void Core::revert() { qDebug() << name().toAscii().constData() << "::Core::revert()"; qDeleteAll(list); edit(); doRevert(); QAbstractItemModel::revert(); selectionModel()->clearSelection(); reset(); } bool Core::submit() { qDebug() << name().toAscii().constData() << "::Core::submit()"; qDeleteAll(sourceList); sourceList = list; doSubmit(); QAbstractItemModel::submit(); return true; } Core *Core::operator<<(Item *item) { bool found = false; QVariant var; QListIterator sourceItem(list); while (sourceItem.hasNext() && !found) found = sourceItem.next()->equalTo(item); if (!found) { insertRows(-1,1,QModelIndex()); var.setValue(item); setData(index(rowCount()-1,0),var,Qt::UserRole); } return this; } void Core::saveState(QSettings &settings) const { int i = 0; QListIterator item(list); qDebug() << name().toAscii().constData() << "::Core::saveState(...)"; while (item.hasNext()) item.next()->saveState(settings,name(),i++); } void Core::loadSettings(QSettings &settings) { QStringListIterator group(settings.childGroups()); Item *item; qDebug() << name().toAscii().constData() << "::Core::loadSettings(...)"; _active = settings.value(ENGINE_ACTIVE,true).toBool(); while (group.hasNext()) { item = newItem(); item->loadSettings(settings,group.peekNext()); item->loadState(settings,group.peekNext()); group.next(); list << item; } submit(); } void Core::saveSettings(QSettings &settings) const { int i = 0; QListIterator item(list); qDebug() << name().toAscii().constData() << "::Core::saveSettings(...)"; settings.setValue(ENGINE_ACTIVE,_active); while (item.hasNext()) item.next()->saveSettings(settings,name(),i++); } SettingsWidget::SettingsWidget(Core *core, QWidget *parent) : QWidget(parent), _core(core) { core->selectionModel()->clearSelection(); } wally-2.4.4/src/buzznet.cpp0000644000000000000000000001510111676624760014360 0ustar rootroot/* TRANSLATOR Buzznet::Item */ /* TRANSLATOR Buzznet::Core */ /* TRANSLATOR Buzznet::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "httpengine.h" #include "buzznet.h" using namespace Buzznet; QVariant Item::data() const { QString str; if (_tag.size()) str = QString("") + tr("Tag:") + " " + _tag + ""; return str; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const { return (pages)? (currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1)) % pages : 0; } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { _photoUrl.clear(); _sourceUrl.clear(); photoTitle.clear(); photoDescription.clear(); photoOwner.clear(); return QUrl(); } QUrl Item::doPrepareSearch(HttpEngine::Operation & /* op */) { if (_tag.size()) { QUrl url(QString("http://www.buzznet.com/tags/") + _tag + "/rss/"); url.addQueryItem("pagesize","1"); url.addQueryItem("p",QString::number(pageIndex())); url.addQueryItem("mtype","photo"); return url; } else return QUrl(); } bool Item::doProcessSearchResult(const QByteArray &response, int &newPagesCount) { bool endItem = false; QXmlStreamReader xmlResp(response); while (!xmlResp.atEnd()) if (xmlResp.readNext() == QXmlStreamReader::StartElement) { if (!xmlResp.prefix().toString().compare("buzznet",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("totalrows",Qt::CaseInsensitive)) { xmlResp.readNext(); newPagesCount = xmlResp.text().toString().toInt(); } else if (!xmlResp.name().toString().compare("item",Qt::CaseInsensitive)) { endItem = false; while ((!xmlResp.atEnd()) && (!endItem)) switch (xmlResp.readNext()) { case QXmlStreamReader::StartElement: if (!xmlResp.name().toString().compare("title",Qt::CaseInsensitive)) { xmlResp.readNext(); photoTitle = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("link",Qt::CaseInsensitive)) { xmlResp.readNext(); _sourceUrl = xmlResp.text().toString(); } else if (!xmlResp.prefix().toString().compare("media",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("description",Qt::CaseInsensitive)) { xmlResp.readNext(); photoDescription = xmlResp.text().toString(); } else if (!xmlResp.prefix().toString().compare("buzznet",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("orig",Qt::CaseInsensitive)) { xmlResp.readNext(); _photoUrl = xmlResp.text().toString(); } else if (!xmlResp.prefix().toString().compare("dc",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("creator",Qt::CaseInsensitive)) { xmlResp.readNext(); photoOwner = xmlResp.text().toString(); } break; case QXmlStreamReader::EndElement: endItem = !xmlResp.name().toString().compare("item",Qt::CaseInsensitive); break; default: break; } } } return (_photoUrl.isValid() && !_lastPhotoUrls.contains(_photoUrl)); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { return QUrl("/"); } QSize Item::doProcessSizeRequestResult(const QByteArray & /* response */) { return QApplication::desktop()->screenGeometry().size(); } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { return _photoUrl; } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { _lastPhotoUrls.insert(_photoUrl); return QUrl("/"); } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray & /* response */) { PhotoInfo info; info.title = photoTitle; info.description = photoDescription; info.owner = photoOwner; info.sourceUrl = _sourceUrl; info.searchString = _tag; return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); _tag = settings.value(TAG,QString()).toString(); data = qUncompress(settings.value(LAST_PHOTO_URLS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoUrls; buf.close(); } void Item::doSaveSettings(QSettings &settings) const { settings.setValue(TAG,_tag); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoUrls; buf.close(); settings.setValue(LAST_PHOTO_URLS,qCompress(data)); } bool Item::equalTo(Engine::Item *item) const { Item *buzznetItem = qobject_cast (item); return buzznetItem && (tag() == buzznetItem->tag()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QHBoxLayout *mainLayout = new QHBoxLayout; leSearchFor = new QLineEdit(this); leSearchFor->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Maximum); mainLayout->addWidget(new QLabel(tr("Search for:"),this)); mainLayout->addWidget(leSearchFor); setLayout(mainLayout); leSearchFor->setFocus(); } XtEngine::Item *DialogWidget::returnItem() { Item *item = qobject_cast (core()->newItem()); item->setTag(leSearchFor->text()); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *buzznetItem = qobject_cast (item); setWindowTitle(tr("Edit Buzznet item")); leSearchFor->setText(buzznetItem->tag()); } else setWindowTitle(tr("Add Buzznet item")); } wally-2.4.4/src/xtengine.cpp0000644000000000000000000000622311676624760014505 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "engine.h" #include "xtengine.h" using namespace XtEngine; Item *Dialog::execute(Item *item) { Item *newItem = 0; QVBoxLayout *mainLayout = new QVBoxLayout; dialogButtons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal,this); dialogWidget = newDialogWidget(_core); dialogWidget->setupFromItem(item); dialogWidget->layout()->setContentsMargins(0,0,0,0); mainLayout->addWidget(dialogWidget); mainLayout->addStretch(); mainLayout->addWidget(dialogButtons); mainLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(mainLayout); setWindowTitle(dialogWidget->windowTitle()); connect(dialogButtons,SIGNAL(clicked(QAbstractButton *)), this,SLOT(dialogButtonClicked(QAbstractButton *))); if (exec() == Dialog::Accepted) newItem = dialogWidget->returnItem(); deleteLater(); return newItem; } void Dialog::dialogButtonClicked(QAbstractButton *button) { switch (dialogButtons->buttonRole(button)) { case QDialogButtonBox::AcceptRole: if (dialogWidget->validateInput()) accept(); break; case QDialogButtonBox::RejectRole: reject(); break; default: break; } } ItemDelegate::ItemDelegate(QObject *parent) : QItemDelegate(parent) { label = new QLabel; label->setAutoFillBackground(true); label->setTextFormat(Qt::RichText); label->setMargin(ITEM_VIEW_MARGIN); } ItemDelegate::~ItemDelegate() { delete label; } void ItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.isValid()) { Engine::Item *item = index.model()->data(index,Qt::UserRole).value(); label->setBackgroundRole((option.state & QStyle::State_Selected)? QPalette::Highlight : ((!(index.row() % 2))? QPalette::Base : QPalette::AlternateBase)); label->setForegroundRole((option.state & QStyle::State_Selected)? QPalette::HighlightedText : QPalette::Text); label->setFixedSize(option.rect.width(),option.rect.height()); label->setText(item->data().toString()); painter->setRenderHint(QPainter::Antialiasing,true); painter->drawPixmap(option.rect,QPixmap::grabWidget(label)); } } wally-2.4.4/src/viewer.cpp0000644000000000000000000001071611676624760014167 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "gui.h" #include "viewer.h" Viewer::Viewer(QWidget *parent) : Gui::Dialog(Gui::Dialog::CenterOfScreen,parent) { setupUi(this); scrollAreaWidgetContents->setStyleSheet("background-color: rgb(0,0,0);"); addAction(actionFitToWindow); addAction(actionShowFullImage); addAction(actionZoomIn); addAction(actionZoomOut); addAction(actionRotateClockwise); addAction(actionRotateCClockwise); #ifdef Q_WS_MAC QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok,Qt::Horizontal,this); connect(buttonBox,SIGNAL(accepted()),this,SLOT(close())); layout()->addWidget(buttonBox); #endif resize(qApp->desktop()->availableGeometry().size() - QSize(100,100)); } void Viewer::setPixmap(const QPixmap &pixmap) { _pixmap = pixmap; } void Viewer::showEvent(QShowEvent *event) { QTimer::singleShot(0,actionFitToWindow,SLOT(trigger())); Gui::Dialog::showEvent(event); } void Viewer::on_actionFitToWindow_triggered() { QPixmap _rotatedPixmap = _pixmap.transformed(_rotationMatrix,Qt::SmoothTransformation); _zoomMatrix = QMatrix(); if ((_rotatedPixmap.size().width() > scrollArea->maximumViewportSize().width()) && (_rotatedPixmap.size().height() > scrollArea->maximumViewportSize().height())) { qreal hZoomMatrix = static_cast (scrollArea->maximumViewportSize().width()) / static_cast (_rotatedPixmap.size().width()); qreal vZoomMatrix = static_cast (scrollArea->maximumViewportSize().height()) / static_cast (_rotatedPixmap.size().height()); _zoomMatrix.scale(qMin(hZoomMatrix,vZoomMatrix),qMin(hZoomMatrix,vZoomMatrix)); } else if (_rotatedPixmap.size().width() > scrollArea->maximumViewportSize().width()) _zoomMatrix.scale(static_cast (scrollArea->maximumViewportSize().width()) / static_cast (_rotatedPixmap.size().width()), static_cast (scrollArea->maximumViewportSize().width()) / static_cast (_rotatedPixmap.size().width())); else if (_rotatedPixmap.size().height() > scrollArea->maximumViewportSize().height()) _zoomMatrix.scale(static_cast (scrollArea->maximumViewportSize().height()) / static_cast (_rotatedPixmap.size().height()), static_cast (scrollArea->maximumViewportSize().height()) / static_cast (_rotatedPixmap.size().height())); else { qreal hZoomMatrix = static_cast (scrollArea->maximumViewportSize().width()) / static_cast (_rotatedPixmap.size().width()); qreal vZoomMatrix = static_cast (scrollArea->maximumViewportSize().height()) / static_cast (_rotatedPixmap.size().height()); _zoomMatrix.scale(qMin(hZoomMatrix,vZoomMatrix),qMin(hZoomMatrix,vZoomMatrix)); } label->setPixmap(_rotatedPixmap.transformed(_zoomMatrix,Qt::SmoothTransformation)); } void Viewer::on_actionShowFullImage_triggered() { _zoomMatrix = QMatrix(); label->setPixmap(_pixmap.transformed(_zoomMatrix * _rotationMatrix,Qt::SmoothTransformation)); } void Viewer::on_actionZoomIn_triggered() { _zoomMatrix.scale(1.25,1.25); label->setPixmap(_pixmap.transformed(_zoomMatrix * _rotationMatrix,Qt::SmoothTransformation)); } void Viewer::on_actionZoomOut_triggered() { _zoomMatrix.scale(0.8,0.8); label->setPixmap(_pixmap.transformed(_zoomMatrix * _rotationMatrix,Qt::SmoothTransformation)); } void Viewer::on_actionRotateClockwise_triggered() { _rotationMatrix.rotate(90); label->setPixmap(_pixmap.transformed(_zoomMatrix * _rotationMatrix,Qt::SmoothTransformation)); } void Viewer::on_actionRotateCClockwise_triggered() { _rotationMatrix.rotate(-90); label->setPixmap(_pixmap.transformed(_zoomMatrix * _rotationMatrix,Qt::SmoothTransformation)); } wally-2.4.4/src/ipernity.cpp0000644000000000000000000002342111676624760014526 0ustar rootroot/* TRANSLATOR Ipernity::Item */ /* TRANSLATOR Ipernity::Core */ /* TRANSLATOR Ipernity::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "httpengine.h" #include "ipernity.h" using namespace Ipernity; Item::Item() : HttpEngine::Item() { _condition = And; } Item::Item(Item *item) : HttpEngine::Item(item) { _text = item->_text; _tags = item->_tags; _condition = item->_condition; } QVariant Item::data() const { QString str, newValue; if (!_text.isEmpty()) { newValue = _text; str = QString("") + tr("Text:") + " " + newValue.replace(" ",(_condition == And)? " " + tr("and") + " " : " " + tr("or") + " ") + ""; } else if (_tags.size()) { newValue = _tags.join((_condition == And)? " " + tr("and") + " " : " " + tr("or") + " "); str = QString("") + tr("Tags:") + " " + newValue; } return str; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const { return (pages)? (currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1)) % pages : 1; } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { _photoId.clear(); _photoUrl.clear(); _sourceUrl.clear(); photoSize = QSize(-1,-1); photoOwner.clear(); photoDescription.clear(); photoTitle.clear(); photoLocation.clear(); return QUrl(); } QUrl Item::doPrepareSearch(HttpEngine::Operation & /* op */) { QString searchItem; QUrl url("http://api.ipernity.com/api/doc.search/xml"); url.addQueryItem("api_key",IPERNITY_API_KEY); url.addQueryItem("media","photo"); url.addQueryItem("page",QString::number(pageIndex())); url.addQueryItem("per_page","1"); if (!_tags.isEmpty()) searchItem = _tags.join((_condition == And)? ",+" : ","); else if (!_text.isEmpty()) { searchItem = _text; if (_condition == And) searchItem.replace(" "," +"); } else return QUrl(); if (_condition == And) searchItem = QString("+") + searchItem; if (!_tags.isEmpty()) url.addQueryItem("tags",searchItem); else if (!_text.isEmpty()) url.addQueryItem("text",searchItem); return url; } bool Item::doProcessSearchResult(const QByteArray &response, int &newPagesCount) { QXmlStreamReader xmlResp(response); bool respError = false; while (!xmlResp.atEnd() && !respError) if (xmlResp.readNext() == QXmlStreamReader::StartElement) { if (!xmlResp.name().toString().compare("api",Qt::CaseInsensitive)) respError = xmlResp.attributes().value("status").toString().compare("ok",Qt::CaseInsensitive); else if (!xmlResp.name().toString().compare("docs",Qt::CaseInsensitive)) newPagesCount = xmlResp.attributes().value("total").toString().toInt(); else if (!xmlResp.name().toString().compare("doc",Qt::CaseInsensitive)) _photoId = xmlResp.attributes().value("doc_id").toString(); } return (!_photoId.isEmpty() && !_lastPhotoIds.contains(_photoId)); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { QUrl url("http://api.ipernity.com/api/doc.get/xml"); url.addQueryItem("api_key",IPERNITY_API_KEY); url.addQueryItem("doc_id",_photoId); url.addQueryItem("extra","notes,geo"); return url; } QSize Item::doProcessSizeRequestResult(const QByteArray &response) { QXmlStreamReader xmlResp(response); bool respError = false; while (!xmlResp.atEnd() && !respError) if (xmlResp.readNext() == QXmlStreamReader::StartElement) { if (!xmlResp.name().toString().compare("api",Qt::CaseInsensitive)) respError = xmlResp.attributes().value("status").toString().compare("ok",Qt::CaseInsensitive); else if (!xmlResp.name().toString().compare("thumb",Qt::CaseInsensitive)) { QSize size(xmlResp.attributes().value("w").toString().toInt(), xmlResp.attributes().value("h").toString().toInt()); if ((size.width() >= photoSize.width()) && (size.height() >= photoSize.height())) { photoSize = size; _photoUrl = xmlResp.attributes().value("url").toString(); } } else if (!xmlResp.name().toString().compare("doc",Qt::CaseInsensitive)) { photoTitle = xmlResp.attributes().value("title").toString(); _sourceUrl = xmlResp.attributes().value("link").toString(); } else if (!xmlResp.name().toString().compare("description",Qt::CaseInsensitive)) { xmlResp.readNext(); photoDescription = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("owner",Qt::CaseInsensitive)) photoOwner = xmlResp.attributes().value("username").toString(); else if (!xmlResp.name().toString().compare("geo",Qt::CaseInsensitive)) photoLocation = xmlResp.attributes().value("location").toString(); } return photoSize; } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { return _photoUrl; } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { _lastPhotoIds.insert(_photoId); return QUrl("/"); } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray & /* response */) { PhotoInfo info; info.title = photoTitle; info.description = photoDescription; info.owner = photoOwner; info.location = photoLocation; info.sourceUrl = _sourceUrl; if (!_tags.isEmpty()) info.searchString = _tags.join(" "); else if (!_text.isEmpty()) info.searchString = _text; return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); if (!settings.value(SEARCH_TAGS,QString()).toString().isEmpty()) _tags = settings.value(SEARCH_TAGS,QString()).toString().split(" "); else if (!settings.value(SEARCH_TEXT,QString()).toString().isEmpty()) _text = settings.value(SEARCH_TEXT,QString()).toString(); _condition = static_cast (settings.value(CONDITION,And).toInt()); data = qUncompress(settings.value(LAST_PHOTO_IDS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoIds; buf.close(); } void Item::doSaveSettings(QSettings &settings) const { if (_tags.size()) settings.setValue(SEARCH_TAGS,_tags.join(" ")); else if (!_text.isEmpty()) settings.setValue(SEARCH_TEXT,_text); settings.setValue(CONDITION,_condition); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoIds; buf.close(); settings.setValue(LAST_PHOTO_IDS,qCompress(data)); } bool Item::equalTo(Engine::Item *item) const { Item *ipernityItem = qobject_cast (item); return ipernityItem && (text() == ipernityItem->text()) && (tags().join(";") == ipernityItem->tags().join(";")) && (condition() == ipernityItem->condition()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QVBoxLayout *mainLayout = new QVBoxLayout; QHBoxLayout *topLayout = new QHBoxLayout; QHBoxLayout *radioLayout = new QHBoxLayout; leSearchFor = new QLineEdit(this); leSearchFor->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); cbCondition = new QComboBox(this); cbCondition->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbCondition->addItem(tr("All of these words"),And); cbCondition->addItem(tr("Any of these words"),Or); cbCondition->setCurrentIndex(0); topLayout->addWidget(new QLabel(tr("Search for:"),this)); topLayout->addWidget(leSearchFor); topLayout->addWidget(cbCondition); rbText = new QRadioButton(tr("Full text"),this); rbTags = new QRadioButton(tr("Tags only"),this); radioLayout->addWidget(rbText); radioLayout->addWidget(rbTags); radioLayout->addStretch(); rbText->setChecked(true); mainLayout->addLayout(topLayout); mainLayout->addLayout(radioLayout); setLayout(mainLayout); leSearchFor->setFocus(); } XtEngine::Item *DialogWidget::returnItem() { QMessageBox::warning(this,tr("Ipernity item"), tr("It can show offending or sexual explicit photos")); Item *item = qobject_cast (core()->newItem()); if (rbTags->isChecked()) item->setTags(leSearchFor->text().split(" ")); else item->setText(leSearchFor->text()); item->setCondition(static_cast (cbCondition->itemData(cbCondition->currentIndex()).toInt())); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *ipernityItem = qobject_cast (item); setWindowTitle(tr("Edit Ipernity item")); if (!ipernityItem->text().isEmpty()) { leSearchFor->setText(ipernityItem->text()); rbText->setChecked(true); } else { leSearchFor->setText(ipernityItem->tags().join(" ")); rbTags->setChecked(true); } cbCondition->setCurrentIndex(cbCondition->findData(ipernityItem->condition())); } else setWindowTitle(tr("Add Ipernity item")); } wally-2.4.4/src/flickr.cpp0000644000000000000000000004174011676624760014141 0ustar rootroot/* TRANSLATOR Flickr::Item */ /* TRANSLATOR Flickr::Core */ /* TRANSLATOR Flickr::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "httpengine.h" #include "flickr.h" using namespace Flickr; Item::Item() : HttpEngine::Item() { _tagsCondition = And; _searchOrder = DatePostedAsc; _requestedSize = Largest; } Item::Item(Item *item) : HttpEngine::Item(item) { _text = item->_text; _tags = item->_tags; _tagsCondition = item->_tagsCondition; _searchOrder = item->_searchOrder; _requestedSize = item->_requestedSize; } QVariant Item::data() const { QString str; if (!_text.isEmpty()) str = QString("") + tr("Text:") + " " + _text + ""; else if (_tags.size()) str = QString("") + tr("Tags:") + " " + _tags.join((_tagsCondition == And)? " " + tr("and") + " " : " " + tr("or") + " ") + ""; if (!str.isEmpty()) { str += "
  " + tr("Size:") + " "; switch (_requestedSize) { case Largest: str += tr("Largest"); break; case Original: str += tr("Original"); break; case Large: str += tr("Large"); break; case Medium: str += tr("Medium"); break; case Small: str += tr("Small"); break; case Thumbnail: str += tr("Thumbnail"); break; case Square: str += tr("Square"); break; case Smallest: str += tr("Smallest"); break; } str += ",  " + tr("Order:") + " "; switch (_searchOrder) { case InterestingnessDesc: str += tr("Interestingness desc"); break; case Relevance: str += tr("Relevance"); break; case DatePostedDesc: str += tr("Date posted desc"); break; case DateTakenDesc: str += tr("Date taken desc"); break; case InterestingnessAsc: str += tr("Interestingness asc"); break; case DatePostedAsc: str += tr("Date posted asc"); break; case DateTakenAsc: str += tr("Date taken asc"); break; } str += ""; } return str; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const { return (pages)? (currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1)) % pages : 1; } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { _photoId.clear(); _photoUrl.clear(); return QUrl(); } QUrl Item::doPrepareSearch(HttpEngine::Operation & /* op */) { QUrl url("http://api.flickr.com/services/rest"); url.addQueryItem("method","flickr.photos.search"); url.addQueryItem("api_key",FLICKR_API_KEY); if (!_tags.isEmpty()) { url.addQueryItem("tags",_tags.join(",")); url.addQueryItem("tag_mode",(_tagsCondition == And)? "all" : "any"); } else if (!_text.isEmpty()) { QString newText = _text; newText.replace(" ","+"); url.addQueryItem("text",newText); } else return QUrl(); url.addQueryItem("media","photos"); url.addQueryItem("sort",searchOrderStrings[_searchOrder]); url.addQueryItem("per_page","1"); url.addQueryItem("page",QString::number(pageIndex())); return url; } bool Item::doProcessSearchResult(const QByteArray &response, int &newPagesCount) { bool respError = false; QXmlStreamReader xmlResp(response); while (!xmlResp.atEnd() && !respError) if (xmlResp.readNext() == QXmlStreamReader::StartElement) { if (!xmlResp.name().toString().compare("rsp",Qt::CaseInsensitive)) respError = xmlResp.attributes().value("stat").toString().compare("ok",Qt::CaseInsensitive); else if (!xmlResp.name().toString().compare("photos",Qt::CaseInsensitive)) newPagesCount = qMin(xmlResp.attributes().value("total").toString().toInt(), FLICKR_PAGES_HARD_LIMIT); else if (!xmlResp.name().toString().compare("photo",Qt::CaseInsensitive) && (xmlResp.attributes().value("ispublic").toString() == "1")) _photoId = xmlResp.attributes().value("id").toString(); } return (!respError && !_photoId.isEmpty() && !_lastPhotoIds.contains(_photoId)); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { QUrl url("http://api.flickr.com/services/rest"); url.addQueryItem("method","flickr.photos.getSizes"); url.addQueryItem("api_key",FLICKR_API_KEY); url.addQueryItem("photo_id",_photoId); return url; } QSize Item::doProcessSizeRequestResult(const QByteArray &response) { bool respError = false, found = false; QSize size(0,0); QXmlStreamReader xmlResp(response); while ((!xmlResp.atEnd()) && (!respError) && (!found)) if (xmlResp.readNext() == QXmlStreamReader::StartElement) { if (!xmlResp.name().toString().compare("rsp",Qt::CaseInsensitive)) respError = xmlResp.attributes().value("stat").toString().compare("ok",Qt::CaseInsensitive); else if (!xmlResp.name().toString().compare("size",Qt::CaseInsensitive)) { switch (_requestedSize) { case Large: found = !xmlResp.attributes().value("label").toString().compare("Large",Qt::CaseInsensitive); _photoUrl.setUrl(xmlResp.attributes().value("source").toString()); size.setHeight(xmlResp.attributes().value("height").toString().toInt()); size.setWidth(xmlResp.attributes().value("width").toString().toInt()); break; case Largest: if (_photoUrl.isEmpty() || (xmlResp.attributes().value("width").toString().toInt() * xmlResp.attributes().value("height").toString().toInt() >= size.height() * size.width())) { _photoUrl.setUrl(xmlResp.attributes().value("source").toString()); size.setHeight(xmlResp.attributes().value("height").toString().toInt()); size.setWidth(xmlResp.attributes().value("width").toString().toInt()); } break; case Medium: found = !xmlResp.attributes().value("label").toString().compare("Medium",Qt::CaseInsensitive); _photoUrl.setUrl(xmlResp.attributes().value("source").toString()); size.setHeight(xmlResp.attributes().value("height").toString().toInt()); size.setWidth(xmlResp.attributes().value("width").toString().toInt()); break; case Original: found = !xmlResp.attributes().value("label").toString().compare("Original",Qt::CaseInsensitive); _photoUrl.setUrl(xmlResp.attributes().value("source").toString()); size.setHeight(xmlResp.attributes().value("height").toString().toInt()); size.setWidth(xmlResp.attributes().value("width").toString().toInt()); break; case Small: found = !xmlResp.attributes().value("label").toString().compare("Small",Qt::CaseInsensitive); _photoUrl.setUrl(xmlResp.attributes().value("source").toString()); size.setHeight(xmlResp.attributes().value("height").toString().toInt()); size.setWidth(xmlResp.attributes().value("width").toString().toInt()); break; case Smallest: if (_photoUrl.isEmpty() || (xmlResp.attributes().value("width").toString().toInt() * xmlResp.attributes().value("height").toString().toInt() <= size.height() * size.width())) { _photoUrl.setUrl(xmlResp.attributes().value("source").toString()); size.setHeight(xmlResp.attributes().value("height").toString().toInt()); size.setWidth(xmlResp.attributes().value("width").toString().toInt()); } break; case Square: found = !xmlResp.attributes().value("label").toString().compare("Square",Qt::CaseInsensitive); _photoUrl.setUrl(xmlResp.attributes().value("source").toString()); size.setHeight(xmlResp.attributes().value("height").toString().toInt()); size.setWidth(xmlResp.attributes().value("width").toString().toInt()); break; case Thumbnail: found = !xmlResp.attributes().value("label").toString().compare("Thumbnail",Qt::CaseInsensitive); _photoUrl.setUrl(xmlResp.attributes().value("source").toString()); size.setHeight(xmlResp.attributes().value("height").toString().toInt()); size.setWidth(xmlResp.attributes().value("width").toString().toInt()); break; } } } if (found || (_requestedSize == Largest) || (_requestedSize == Smallest)) return size; return QSize(-1,-1); } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { return _photoUrl; } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { QUrl url("http://api.flickr.com/services/rest"); _lastPhotoIds.insert(_photoId); url.addQueryItem("method","flickr.photos.getInfo"); url.addQueryItem("api_key",FLICKR_API_KEY); url.addQueryItem("photo_id",_photoId); return url; } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray &response) { PhotoInfo info; bool respError = false; QXmlStreamReader xmlResp(response); while ((!xmlResp.atEnd()) && (!respError)) if (xmlResp.readNext() == QXmlStreamReader::StartElement) { if (!xmlResp.name().toString().compare("rsp",Qt::CaseInsensitive)) respError = xmlResp.attributes().value("stat").toString().compare("ok",Qt::CaseInsensitive); else if (!xmlResp.name().toString().compare("title",Qt::CaseInsensitive)) { xmlResp.readNext(); info.title = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("description",Qt::CaseInsensitive)) { xmlResp.readNext(); info.description = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("owner",Qt::CaseInsensitive)) { info.owner = xmlResp.attributes().value("realname").toString(); if (info.owner.isEmpty()) info.owner = xmlResp.attributes().value("username").toString(); info.location = xmlResp.attributes().value("location").toString(); } else if (!xmlResp.name().toString().compare("url",Qt::CaseInsensitive) && !xmlResp.attributes().value("type").toString().compare("photopage",Qt::CaseInsensitive)) { xmlResp.readNext(); info.sourceUrl = xmlResp.text().toString(); } } if (!_tags.isEmpty()) info.searchString = _tags.join(" "); else if (!_text.isEmpty()) info.searchString = _text; return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); if (!settings.value(SEARCH_TAGS,QString()).toString().isEmpty()) { _tags = settings.value(SEARCH_TAGS,QString()).toString().split(" "); _tagsCondition = static_cast (settings.value(TAGS_CONDITION,And).toInt()); } else if (!settings.value(SEARCH_TEXT,QString()).toString().isEmpty()) _text = settings.value(SEARCH_TEXT,QString()).toString(); data = qUncompress(settings.value(LAST_PHOTO_IDS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoIds; buf.close(); setSearchOrder(static_cast (settings.value(SEARCH_ORDER,DatePostedAsc).toInt())); setRequestedSize(static_cast (settings.value(REQUESTED_SIZE,Largest).toInt())); } void Item::doSaveSettings(QSettings &settings) const { if (_tags.size()) settings.setValue(SEARCH_TAGS,_tags.join(" ")); else if (!_text.isEmpty()) settings.setValue(SEARCH_TEXT,_text); settings.setValue(TAGS_CONDITION,_tagsCondition); settings.setValue(SEARCH_ORDER,_searchOrder); settings.setValue(REQUESTED_SIZE,_requestedSize); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoIds; buf.close(); settings.setValue(LAST_PHOTO_IDS,qCompress(data)); } bool Item::equalTo(Engine::Item *item) const { Item *flickrItem = qobject_cast (item); return flickrItem && (requestedSize() == flickrItem->requestedSize()) && (tagsCondition() == flickrItem->tagsCondition()) && (searchOrder() == flickrItem->searchOrder()) && (text() == flickrItem->text()) && (tags() == flickrItem->tags()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QVBoxLayout *mainLayout = new QVBoxLayout; QHBoxLayout *topLayout = new QHBoxLayout; QHBoxLayout *radioLayout = new QHBoxLayout; QHBoxLayout *bottomLayout = new QHBoxLayout; leSearchFor = new QLineEdit(this); leSearchFor->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); cbTagsCondition = new QComboBox(this); cbTagsCondition->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbTagsCondition->addItem(tr("All of these words"),And); cbTagsCondition->addItem(tr("Any of these words"),Or); cbTagsCondition->setCurrentIndex(0); cbTagsCondition->setEnabled(false); topLayout->addWidget(new QLabel(tr("Search for:"),this)); topLayout->addWidget(leSearchFor); topLayout->addWidget(cbTagsCondition); rbText = new QRadioButton(tr("Full text"),this); rbTags = new QRadioButton(tr("Tags only"),this); radioLayout->addWidget(rbText); radioLayout->addWidget(rbTags); radioLayout->addStretch(); rbText->setChecked(true); cbRequestedSize = new QComboBox(this); cbRequestedSize->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbRequestedSize->addItem(tr("Largest"),Largest); cbRequestedSize->addItem(tr("Original"),Original); cbRequestedSize->addItem(tr("Large"),Large); cbRequestedSize->addItem(tr("Medium"),Medium); cbRequestedSize->addItem(tr("Small"),Small); cbRequestedSize->addItem(tr("Thumbnail"),Thumbnail); cbRequestedSize->addItem(tr("Square"),Square); cbRequestedSize->addItem(tr("Smallest"),Smallest); cbRequestedSize->setCurrentIndex(0); cbSearchOrder = new QComboBox(this); cbSearchOrder->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbSearchOrder->addItem(tr("Interestingness desc"),InterestingnessDesc); cbSearchOrder->addItem(tr("Relevance"),Relevance); cbSearchOrder->addItem(tr("Date posted desc"),DatePostedDesc); cbSearchOrder->addItem(tr("Date taken desc"),DateTakenDesc); cbSearchOrder->addItem(tr("Interestingness asc"),InterestingnessAsc); cbSearchOrder->addItem(tr("Date posted asc"),DatePostedAsc); cbSearchOrder->addItem(tr("Date taken asc"),DateTakenAsc); cbSearchOrder->setCurrentIndex(0); bottomLayout->addWidget(new QLabel(tr("Size:"),this)); bottomLayout->addWidget(cbRequestedSize); bottomLayout->addWidget(new QLabel(tr("Order:"),this)); bottomLayout->addWidget(cbSearchOrder); bottomLayout->addStretch(); connect(rbTags,SIGNAL(toggled(bool)),cbTagsCondition,SLOT(setEnabled(bool))); mainLayout->addLayout(topLayout); mainLayout->addLayout(radioLayout); mainLayout->addLayout(bottomLayout); setLayout(mainLayout); leSearchFor->setFocus(); } XtEngine::Item *DialogWidget::returnItem() { Item *item = qobject_cast (core()->newItem()); if (rbTags->isChecked()) { item->setTags(leSearchFor->text().split(" ")); item->setTagsCondition(static_cast (cbTagsCondition->itemData(cbTagsCondition->currentIndex()).toInt())); } else item->setText(leSearchFor->text()); item->setSearchOrder(static_cast (cbSearchOrder->itemData(cbSearchOrder->currentIndex()).toInt())); item->setRequestedSize(static_cast (cbRequestedSize->itemData(cbRequestedSize->currentIndex()).toInt())); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *flickrItem = qobject_cast (item); setWindowTitle(tr("Edit Flickr item")); if (!flickrItem->text().isEmpty()) { leSearchFor->setText(flickrItem->text()); rbText->setChecked(true); } else { leSearchFor->setText(flickrItem->tags().join(" ")); rbTags->setChecked(true); } cbTagsCondition->setCurrentIndex(cbTagsCondition->findData(flickrItem->tagsCondition())); cbSearchOrder->setCurrentIndex(cbSearchOrder->findData(flickrItem->searchOrder())); cbRequestedSize->setCurrentIndex(cbRequestedSize->findData(flickrItem->requestedSize())); } else setWindowTitle(tr("Add Flickr item")); } wally-2.4.4/src/wally.cpp0000644000000000000000000024632111676624760014021 0ustar rootroot/* TRANSLATOR Wally::Application */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include "exif.h" #include "engine.h" #include "httpengine.h" #include "settings.h" #include "about.h" #include "history.h" #include "wally.h" #ifdef Q_WS_X11 #include #include #include #include #endif #ifdef Q_WS_WIN #include #include #include #include #endif #ifdef Q_WS_MAC #include #include #include #endif #ifdef Q_WS_PM #define INCL_WINWORKPLACE #include #include #endif static const char *statesStrs[] = { "sIdle", "sSelectNextEngineFirst", "sInitEngine", "sSearchRequest", "sSelectNextEngineNext", "sSizeRequest", "sDownload", "sInfoRequest", "sCancel", "sAbort" }; static const char *eventsStrs[] = { "eOk", "eNoEngines", "eSearchNoData", "eWrongSize", "eCancel", "ePlayTimeout", "eDownloadFailed", "eDownloadOkButWrongSize" }; static bool debugMode; static bool httpDebugMode; using namespace Wally; Application::Application(int &argc, char **argv) : QApplication(argc,argv) { QStringList args = arguments(); debugMode = args.contains("-debug",Qt::CaseInsensitive); httpDebugMode = args.contains("-debughttp",Qt::CaseInsensitive); languagesMenu = contextMenu = cancelContextMenu = 0; dontSwitchState = singleInstance = commandLineHelp = playWasActive = playTimerWasActive = false; hiddenWidgetForLanguagesActions = 0; playAction = 0; qInstallMsgHandler(printDebugMsg); if (debugMode) { #if defined(Q_WS_WIN) || defined(Q_WS_PM) fout.open("WallyDebug.txt"); std::cout.rdbuf(fout.rdbuf()); #endif qDebug() << "Application::Application()"; } #ifdef Q_WS_WIN adWarningFired = false; #endif #ifdef Q_WS_X11 int forceIdx; windowManager = wmUnknown; if (((forceIdx = args.indexOf("-forcewm",Qt::CaseInsensitive)) != -1) && (forceIdx < (args.size() - 1))) { QString wmStr = args.at(forceIdx+1); if (!wmStr.compare("KDE3",Qt::CaseInsensitive)) windowManager = wmKDE3; else if (!wmStr.compare("KDE4",Qt::CaseInsensitive)) windowManager = wmKDE4; else if (!wmStr.compare("Gnome",Qt::CaseInsensitive)) windowManager = wmGnome; else if (!wmStr.compare("XFCE",Qt::CaseInsensitive)) windowManager = wmXfce; else if (!wmStr.compare("FluxBox",Qt::CaseInsensitive)) windowManager = wmFluxbox; else if (!wmStr.compare("FVWM",Qt::CaseInsensitive)) windowManager = wmFVWM; else if (!wmStr.compare("BlackBox",Qt::CaseInsensitive)) windowManager = wmBlackbox; else if (!wmStr.compare("WindowMaker",Qt::CaseInsensitive)) windowManager = wmWindowMaker; else if (!wmStr.compare("GnomeShell",Qt::CaseInsensitive)) windowManager = wmGnomeShell; } #endif if ((commandLineHelp = (args.indexOf("-help") != -1))) { QByteArray help = QByteArray("Usage:\n\t-debug\t\tShows debug output") + "\n\t-debughttp\tShows verbose HTTP output" + "\n\t-forcewm \t" + "Use specific window manager (Linux only)\n\n\t" + "where can be:\tKDE3, KDE4, Gnome, XFCE, FluxBox,\n" + "\t\t\t\tFVWM, BlackBox, WindowMaker, GnomeShell"; std::cout << APPLICATION_NAME << " " << APPLICATION_VERSION << std::endl << std::endl; std::cout << help.constData() << std::endl; } else { checkSingleInstance(); if (isSingleInstance()) { setApplicationName(APPLICATION_NAME); setApplicationVersion(APPLICATION_VERSION); setOrganizationName("BeCrux"); } } } Application::~Application() { qDebug() << "Application::~Application()"; db.close(); delete languagesMenu; delete contextMenu; delete cancelContextMenu; delete hiddenWidgetForLanguagesActions; if (engines.size()) qDeleteAll(engines); #if !defined(Q_WS_WIN) && !defined(Q_WS_PM) QFile::remove(_tempStorageDir + "/" + RUN_PATH + "/" + PID_FILENAME); #endif #if defined(Q_WS_WIN) || defined(Q_WS_PM) if (debugMode) fout.close(); #endif } void Application::loadLanguages() { QSettings settings; QTranslator *translator; translator = new QTranslator(this); translator->load(":/languages/italian"); translators[QLocale(QLocale::Italian).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/spanish"); translators[QLocale(QLocale::Spanish).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/german"); translators[QLocale(QLocale::German).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/french"); translators[QLocale(QLocale::French).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/russian"); translators[QLocale(QLocale::Russian).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/brazilian_portuguese"); translators[QLocale(QLocale::Portuguese,QLocale::Brazil).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/czech"); translators[QLocale(QLocale::Czech,QLocale::CzechRepublic).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/polish"); translators[QLocale(QLocale::Polish,QLocale::Poland).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/chinese"); translators[QLocale(QLocale::Chinese,QLocale::China).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/catalan"); translators[QLocale(QLocale::Catalan,QLocale::Andorra).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/greek"); translators[QLocale(QLocale::Greek,QLocale::Greece).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/korean"); translators[QLocale(QLocale::Korean,QLocale::RepublicOfKorea).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/hungarian"); translators[QLocale(QLocale::Hungarian,QLocale::Hungary).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/danish"); translators[QLocale(QLocale::Danish,QLocale::Denmark).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/swedish"); translators[QLocale(QLocale::Swedish,QLocale::Sweden).name()] = translator; translator = new QTranslator(this); translator->load(":/languages/turkish"); translators[QLocale(QLocale::Turkish,QLocale::Turkey).name()] = translator; currentLocale = QLocale::English; settings.beginGroup(MAIN_SECTION); changeLanguage(settings.value(LOCALE,QLocale::system().name()).toString()); settings.endGroup(); } void Application::initialize() { setupTrayIcon(); setupActions(); setupMenu(); setQuitOnLastWindowClosed(false); qsrand(QDateTime::currentDateTime().toTime_t()); #ifdef Q_WS_X11 QDir(QDir::homePath()).mkdir(TEMP_PATH); _tempStorageDir = QDir::homePath() + "/" + TEMP_PATH; #else QDir::home().root().mkpath(QDesktopServices::storageLocation(QDesktopServices::DataLocation)); _tempStorageDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation); #endif currentState = sIdle; currentEngineIndex = -1; timer = new QTimer(this); timer->setSingleShot(true); timer->setInterval(DEFAULT_INTERVAL * 60000); connect(timer,SIGNAL(timeout()),this,SLOT(start())); if ((captureKeymaps = !trayIcon->isSystemTrayAvailable())) { #ifdef Q_WS_X11 XGrabKey(QX11Info::display(),AnyKey,AnyModifier,QX11Info::appRootWindow(), true,GrabModeSync,GrabModeSync); #endif } retranslateMenu(); #ifdef Q_WS_X11 autoDetectWM(); #endif initializeDB(); } void Application::printDebugMsg(QtMsgType type, const char *msg) { switch (type) { case QtWarningMsg: if (httpDebugMode) std::cout << msg << std::endl << std::flush; break; default: if (debugMode) std::cout << msg << std::endl << std::flush; break; } } bool Application::isPIDBelongingToWally(int pid) const { #ifdef Q_WS_X11 return QFileInfo(QString("/proc/") + QString::number(pid) + "/exe").symLinkTarget().contains(APPLICATION_NAME,Qt::CaseInsensitive); #endif #ifdef Q_WS_MAC struct kinfo_proc *result, *ptr; int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; size_t length, i; result = NULL; try { length = 0; if (sysctl((int *) name,(sizeof(name) / sizeof(*name)) - 1,NULL,&length,NULL,0) == -1) throw; if ((result = (kinfo_proc *) malloc(length)) == NULL) throw; if (sysctl((int *) name,(sizeof(name) / sizeof(*name)) - 1,result,&length,NULL,0) == -1) throw; for (i = 0, ptr = result; (i < (length / sizeof(kinfo_proc))) && ((ptr->kp_proc.p_pid != pid) || strcasecmp(ptr->kp_proc.p_comm,APPLICATION_NAME)); i++, ptr++) ; free(result); return (i < (length / sizeof(kinfo_proc))); } catch (...) { if (result != NULL) free(result); return true; } #endif #if defined(Q_WS_WIN) || defined(Q_WS_PM) Q_UNUSED(pid) return false; #endif } void Application::checkSingleInstance() { #if defined(Q_WS_WIN) || defined(Q_WS_PM) #ifndef QT_NO_SHAREDMEMORY QSharedMemory *sharedMemory = new QSharedMemory(QString(APPLICATION_NAME) + "SingleApplicationKey",this); singleInstance = sharedMemory->create(1); #else singleInstance = true; #endif #else QString pidStr; QDir(QDir::homePath()).mkdir(TEMP_PATH); QDir(QDir::homePath() + "/" + TEMP_PATH).mkdir(RUN_PATH); QFile pidFile(QDir::homePath() + "/" + TEMP_PATH + "/" + RUN_PATH + "/" + PID_FILENAME); singleInstance = true; if (pidFile.open(QIODevice::ReadOnly | QIODevice::Text)) { pidStr = pidFile.readLine(); pidFile.close(); singleInstance = !isPIDBelongingToWally(pidStr.trimmed().toInt()); } if (singleInstance) { pidFile.open(QIODevice::WriteOnly | QIODevice::Truncate); pidFile.write((QString::number(QCoreApplication::applicationPid()) + "\n").toAscii()); pidFile.close(); } #endif if (!singleInstance) qDebug() << "Application::Application() found another instance running"; } void Application::selectEngine(int index) { qDebug() << "Application::selectEngine(" << engines.at(index)->name().toAscii().constData() << ")"; for (int i = 0; i < engines.size(); ++i) { Engine::Core *e = engines.at(i); disconnect(e,SIGNAL(initCompleted()), this,SLOT(initCompleted())); disconnect(e,SIGNAL(searchCompleted(bool)), this,SLOT(processSearchResult(bool))); disconnect(e,SIGNAL(sizeLookupCompleted(const QSize &)), this,SLOT(processPhotoSize(const QSize &))); disconnect(e,SIGNAL(downloadCompleted(bool,const QFileInfo &)), this,SLOT(processDownloadedPhoto(bool,const QFileInfo &))); disconnect(e,SIGNAL(infoCollectCompleted(const PhotoInfo &)), this,SLOT(processCollectedInfo(const PhotoInfo &))); disconnect(e,SIGNAL(cancelCompleted()), this,SLOT(switchToIdle())); disconnect(this,SIGNAL(init()),e,SLOT(init())); disconnect(this,SIGNAL(search(bool)),e,SLOT(search(bool))); disconnect(this,SIGNAL(sizeLookup()),e,SLOT(sizeLookup())); disconnect(this,SIGNAL(download()),e,SLOT(download())); disconnect(this,SIGNAL(infoCollect()),e,SLOT(infoCollect())); disconnect(this,SIGNAL(cancel()),e,SLOT(cancel())); if (i == index) { connect(e,SIGNAL(initCompleted()), this,SLOT(initCompleted())); connect(e,SIGNAL(searchCompleted(bool)), this,SLOT(processSearchResult(bool))); connect(e,SIGNAL(sizeLookupCompleted(const QSize &)), this,SLOT(processPhotoSize(const QSize &))); connect(e,SIGNAL(downloadCompleted(bool,const QFileInfo &)), this,SLOT(processDownloadedPhoto(bool,const QFileInfo &))); connect(e,SIGNAL(infoCollectCompleted(const PhotoInfo &)), this,SLOT(processCollectedInfo(const PhotoInfo &))); connect(e,SIGNAL(cancelCompleted()), this,SLOT(switchToIdle())); connect(this,SIGNAL(init()),e,SLOT(init())); connect(this,SIGNAL(search(bool)),e,SLOT(search(bool))); connect(this,SIGNAL(sizeLookup()),e,SLOT(sizeLookup())); connect(this,SIGNAL(download()),e,SLOT(download())); connect(this,SIGNAL(infoCollect()),e,SLOT(infoCollect())); connect(this,SIGNAL(cancel()),e,SLOT(cancel())); } } } void Application::setupActions() { qDebug() << "Application::setupActions()"; cancelAction = new QAction(QIcon(":/images/cancel"),QString(),this); connect(cancelAction,SIGNAL(triggered()),this,SLOT(execCancel())); playAction = new QAction(QIcon(":/images/control_play"),QString(),this); playAction->setData(false); connect(playAction,SIGNAL(triggered()),this,SLOT(execPlay())); nextPhotoAction = new QAction(QIcon(":/images/active"),QString(),this); connect(nextPhotoAction,SIGNAL(triggered()),this,SLOT(execNextPhoto())); nextPhotoAction->setEnabled(false); savePhotoAction = new QAction(QIcon(":images/photo_save"),QString(),this); connect(savePhotoAction,SIGNAL(triggered()),this,SLOT(execSavePhoto())); savePhotoAction->setEnabled(false); getExifInfoAction = new QAction(QIcon(":images/exif_info"),QString(),this); connect(getExifInfoAction,SIGNAL(triggered()),this,SLOT(execGetExifInfo())); getExifInfoAction->setEnabled(false); configureAction = new QAction(QIcon(":/images/configure"),QString(),this); connect(configureAction,SIGNAL(triggered()),this,SLOT(execShowSettings())); aboutAction = new QAction(QIcon(":/images/about"),QString(),this); connect(aboutAction,SIGNAL(triggered()),this,SLOT(execAbout())); aboutQtAction = new QAction(QIcon(":/images/qt"),QString(),this); connect(aboutQtAction,SIGNAL(triggered()),this,SLOT(execAboutQt())); historyAction = new QAction(QIcon(":/images/history"),QString(),this); connect(historyAction,SIGNAL(triggered()),qApp,SLOT(execShowHistory())); quitAction = new QAction(QIcon(":/images/quit"),QString(),this); connect(quitAction,SIGNAL(triggered()),qApp,SLOT(quit())); viewSourceAction = new QAction(QIcon(":/images/source_url"),QString(),this); connect(viewSourceAction,SIGNAL(triggered()),this,SLOT(execExploreImageSource())); languagesSignalMapper = new QSignalMapper(this); connect(languagesSignalMapper,SIGNAL(mapped(const QString &)), this,SLOT(changeLanguage(const QString &))); hiddenWidgetForLanguagesActions = new QWidget; hiddenWidgetForLanguagesActions->setVisible(false); englishLanguageAction = new QAction(QIcon(":/images/uk"),QString(),this); languagesActions << englishLanguageAction; languagesSignalMapper->setMapping(englishLanguageAction,QLocale(QLocale::English).name()); connect(englishLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); italianLanguageAction = new QAction(QIcon(":/images/italy"),QString(),this); languagesActions << italianLanguageAction; languagesSignalMapper->setMapping(italianLanguageAction,QLocale(QLocale::Italian).name()); connect(italianLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); spanishLanguageAction = new QAction(QIcon(":/images/spain"),QString(),this); languagesActions << spanishLanguageAction; languagesSignalMapper->setMapping(spanishLanguageAction,QLocale(QLocale::Spanish).name()); connect(spanishLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); germanLanguageAction = new QAction(QIcon(":/images/germany"),QString(),this); languagesActions << germanLanguageAction; languagesSignalMapper->setMapping(germanLanguageAction,QLocale(QLocale::German).name()); connect(germanLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); frenchLanguageAction = new QAction(QIcon(":/images/france"),QString(),this); languagesActions << frenchLanguageAction; languagesSignalMapper->setMapping(frenchLanguageAction,QLocale(QLocale::French).name()); connect(frenchLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); russianLanguageAction = new QAction(QIcon(":/images/russia"),QString(),this); languagesActions << russianLanguageAction; languagesSignalMapper->setMapping(russianLanguageAction,QLocale(QLocale::Russian).name()); connect(russianLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); brazilianPortugueseLanguageAction = new QAction(QIcon(":/images/brazil"),QString(),this); languagesActions << brazilianPortugueseLanguageAction; languagesSignalMapper->setMapping(brazilianPortugueseLanguageAction, QLocale(QLocale::Portuguese,QLocale::Brazil).name()); connect(brazilianPortugueseLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); czechLanguageAction = new QAction(QIcon(":/images/czech_republic"),QString(),this); languagesActions << czechLanguageAction; languagesSignalMapper->setMapping(czechLanguageAction, QLocale(QLocale::Czech,QLocale::CzechRepublic).name()); connect(czechLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); polishLanguageAction = new QAction(QIcon(":/images/poland"),QString(),this); languagesActions << polishLanguageAction; languagesSignalMapper->setMapping(polishLanguageAction, QLocale(QLocale::Polish,QLocale::Poland).name()); connect(polishLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); chineseLanguageAction = new QAction(QIcon(":/images/china"),QString(),this); languagesActions << chineseLanguageAction; languagesSignalMapper->setMapping(chineseLanguageAction, QLocale(QLocale::Chinese,QLocale::China).name()); connect(chineseLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); catalanLanguageAction = new QAction(QIcon(":/images/catalonia"),QString(),this); languagesActions << catalanLanguageAction; languagesSignalMapper->setMapping(catalanLanguageAction, QLocale(QLocale::Catalan,QLocale::Andorra).name()); connect(catalanLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); greekLanguageAction = new QAction(QIcon(":/images/greece"),QString(),this); languagesActions << greekLanguageAction; languagesSignalMapper->setMapping(greekLanguageAction, QLocale(QLocale::Greek,QLocale::Greece).name()); connect(greekLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); koreanLanguageAction = new QAction(QIcon(":/images/korea"),QString(),this); languagesActions << koreanLanguageAction; languagesSignalMapper->setMapping(koreanLanguageAction, QLocale(QLocale::Korean,QLocale::RepublicOfKorea).name()); connect(koreanLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); hungarianLanguageAction = new QAction(QIcon(":/images/hungary"),QString(),this); languagesActions << hungarianLanguageAction; languagesSignalMapper->setMapping(hungarianLanguageAction, QLocale(QLocale::Hungarian,QLocale::Hungary).name()); connect(hungarianLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); danishLanguageAction = new QAction(QIcon(":/images/denmark"),QString(),this); languagesActions << danishLanguageAction; languagesSignalMapper->setMapping(danishLanguageAction, QLocale(QLocale::Danish,QLocale::Denmark).name()); connect(danishLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); swedishLanguageAction = new QAction(QIcon(":/images/sweden"),QString(),this); languagesActions << swedishLanguageAction; languagesSignalMapper->setMapping(swedishLanguageAction, QLocale(QLocale::Swedish,QLocale::Sweden).name()); connect(swedishLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); turkishLanguageAction = new QAction(QIcon(":/images/turkey"),QString(),this); languagesActions << turkishLanguageAction; languagesSignalMapper->setMapping(turkishLanguageAction, QLocale(QLocale::Turkish,QLocale::Turkey).name()); connect(turkishLanguageAction,SIGNAL(triggered()),languagesSignalMapper,SLOT(map())); hiddenWidgetForLanguagesActions->addActions(languagesActions); } void Application::retranslateMenu() { if (!playAction) return; qDebug() << "Application::retranslateMenu()"; cancelAction->setText(tr("Cancel")); if (!playAction->data().toBool()) playAction->setText(tr("Play")); else playAction->setText(tr("Pause")); nextPhotoAction->setText(tr("Next photo")); savePhotoAction->setText(tr("Save photo...")); getExifInfoAction->setText(tr("Get EXIF info...")); configureAction->setText(tr("Settings...")); viewSourceAction->setText(tr("Explore source")); aboutAction->setText(tr("About...")); historyAction->setText(tr("History...")); aboutQtAction->setText(tr("About Qt...")); quitAction->setText(tr("Quit")); languagesMenu->setTitle(tr("Languages")); englishLanguageAction->setText(tr("English")); italianLanguageAction->setText(tr("Italian")); spanishLanguageAction->setText(tr("Spanish")); germanLanguageAction->setText(tr("German")); frenchLanguageAction->setText(tr("French")); russianLanguageAction->setText(tr("Russian")); brazilianPortugueseLanguageAction->setText(tr("Portuguese (Brazil)")); czechLanguageAction->setText(tr("Czech")); polishLanguageAction->setText(tr("Polish")); chineseLanguageAction->setText(tr("Chinese")); catalanLanguageAction->setText(tr("Catalan")); greekLanguageAction->setText(tr("Greek")); koreanLanguageAction->setText(tr("Korean")); hungarianLanguageAction->setText(tr("Hungarian")); danishLanguageAction->setText(tr("Danish")); swedishLanguageAction->setText(tr("Swedish")); turkishLanguageAction->setText(tr("Turkish")); languagesMenu->clear(); qSort(languagesActions.begin(),languagesActions.end(),actionCaseSensitiveLessThan); languagesMenu->addActions(languagesActions); } bool Application::actionCaseSensitiveLessThan(QAction *a1, QAction *a2) { return QString::localeAwareCompare(a1->text(),a2->text()) < 0; } void Application::changeLanguage(const QString &newLocaleName) { QSettings settings; qDebug() << "Application::changeLanguage(" << newLocaleName.toAscii().constData() << ")"; if (translators.contains(currentLocale.name())) qApp->removeTranslator(translators.value(currentLocale.name())); if (translators.contains(newLocaleName)) qApp->installTranslator(translators.value(newLocaleName)); retranslateMenu(); currentLocale = QLocale(newLocaleName); settings.beginGroup(MAIN_SECTION); settings.setValue(LOCALE,newLocaleName); settings.endGroup(); } void Application::setupMenu() { qDebug() << "Application::setupMenu()"; cancelContextMenu = new QMenu; cancelContextMenu->addAction(cancelAction); languagesMenu = new QMenu; languagesMenu->setIcon(QIcon(":/images/world")); languagesMenu->addAction(englishLanguageAction); languagesMenu->addAction(italianLanguageAction); languagesMenu->addAction(spanishLanguageAction); languagesMenu->addAction(germanLanguageAction); languagesMenu->addAction(frenchLanguageAction); languagesMenu->addAction(russianLanguageAction); languagesMenu->addAction(brazilianPortugueseLanguageAction); languagesMenu->addAction(czechLanguageAction); languagesMenu->addAction(polishLanguageAction); languagesMenu->addAction(chineseLanguageAction); languagesMenu->addAction(catalanLanguageAction); languagesMenu->addAction(greekLanguageAction); languagesMenu->addAction(koreanLanguageAction); languagesMenu->addAction(hungarianLanguageAction); languagesMenu->addAction(danishLanguageAction); languagesMenu->addAction(swedishLanguageAction); languagesMenu->addAction(turkishLanguageAction); contextMenu = new QMenu; contextMenu->addAction(playAction); contextMenu->addAction(nextPhotoAction); contextMenu->addAction(savePhotoAction); contextMenu->addAction(getExifInfoAction); contextMenu->addAction(viewSourceAction); contextMenu->addAction(configureAction); contextMenu->addSeparator(); contextMenu->addMenu(languagesMenu); contextMenu->addSeparator(); contextMenu->addAction(historyAction); contextMenu->addSeparator(); contextMenu->addAction(aboutAction); contextMenu->addAction(aboutQtAction); contextMenu->addAction(quitAction); trayIcon->setContextMenu(contextMenu); } void Application::setupTrayIcon() { qDebug() << "Application::setupTrayIcon()"; trayIcon = new QSystemTrayIcon(this); trayIcon->setIcon(QIcon(":/images/off")); trayIcon->setToolTip(QString(APPLICATION_NAME) + " " + QString(APPLICATION_VERSION)); connect(this,SIGNAL(aboutToQuit()),trayIcon,SLOT(hide())); connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this,SLOT(execTrayAction(QSystemTrayIcon::ActivationReason))); trayIcon->show(); } #ifdef Q_WS_X11 void Application::autoDetectWM() { bool ok; QFileInfoList files = QDir("/proc").entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot); QListIterator file(files); QString debugMsg = "Application::autoDetectWM() "; while (file.hasNext() && (windowManager == wmUnknown)) { file.peekNext().fileName().toInt(&ok); if (ok && QFileInfo(file.peekNext().absoluteFilePath() + "/exe").symLinkTarget().contains("xfdesktop")) { windowManager = wmXfce; debugMsg += "detected XFCE"; } file.next(); } file.toFront(); while (file.hasNext() && (windowManager == wmUnknown)) { file.peekNext().fileName().toInt(&ok); if (ok && QFileInfo(file.peekNext().absoluteFilePath() + "/exe").symLinkTarget().contains("gnome-shell")) { windowManager = wmGnomeShell; debugMsg += "detected GnomeShell"; } file.next(); } file.toFront(); while (file.hasNext() && (windowManager == wmUnknown)) { file.peekNext().fileName().toInt(&ok); if (ok) { QString fName = QFileInfo(QFileInfo(file.peekNext().absoluteFilePath() + "/exe").symLinkTarget()).fileName(); if (fName.startsWith("kdeinit") && !fName.startsWith("kdeinit4")) { windowManager = wmKDE3; debugMsg += "detected KDE3"; } else if (fName.startsWith("kdeinit4")) { windowManager = wmKDE4; debugMsg += "detected KDE4"; } else if (fName.contains("gconfd-2")) { windowManager = wmGnome; debugMsg += "detected Gnome"; } else if (fName.contains("xfdesktop")) { windowManager = wmXfce; debugMsg += "detected XFCE"; } else if (fName.contains("fluxbox")) { windowManager = wmFluxbox; debugMsg += "detected FluxBox"; } else if (fName.contains("fvwm")) { windowManager = wmFVWM; debugMsg += "detected FVWM"; } else if (fName.contains("blackbox")) { windowManager = wmBlackbox; debugMsg += "detected BlackBox"; } else if (fName.contains("wmaker")) { windowManager = wmWindowMaker; debugMsg += "detected WindowMaker"; } } file.next(); } if (windowManager == wmUnknown) debugMsg += "no WM detected"; qDebug() << debugMsg; } #endif void Application::switchToNextState(Events event) { if (dontSwitchState) return; qDebug() << "Application::switchToNextState(" << eventsStrs[event] << ")" << statesStrs[currentState]; switch (currentState) { case sIdle: switch (event) { case ePlayTimeout: sizeFailures = 0; currentPhotoInfo = PhotoInfo(); currentFile = QFileInfo(); currentState = sSelectNextEngineFirst; switchToNextState(eOk); break; default: break; } break; case sSelectNextEngineFirst: switch (event) { case eOk: if (!engines.size()) { currentState = sIdle; timer->start(); } else { trayIcon->setIcon(QIcon(":/images/active")); trayIcon->setContextMenu(cancelContextMenu); markEngineIndex = currentEngineIndex = (currentEngineIndex + 1) % engines.size(); if (!engines.at(currentEngineIndex)->isActive()) { currentEngineIndex = (currentEngineIndex + 1) % engines.size(); while (!engines.at(currentEngineIndex)->isActive() && (markEngineIndex != currentEngineIndex)) currentEngineIndex = (currentEngineIndex + 1) % engines.size(); if (currentEngineIndex == markEngineIndex) { trayIcon->setIcon(QIcon((playWasActive)? ":/images/idle" : ":/images/off")); trayIcon->setContextMenu(contextMenu); currentState = sIdle; timer->start(); } else { currentState = sInitEngine; selectEngine(currentEngineIndex); emit init(); } } else { currentState = sInitEngine; selectEngine(currentEngineIndex); emit init(); } } break; default: break; } break; case sInitEngine: switch (event) { case eOk: currentState = sSearchRequest; emit search(settings.value(MAIN_SECTION).value(RANDOM_SEARCH).toBool()); break; case eCancel: currentState = sCancel; emit cancel(); break; default: break; } break; case sSearchRequest: switch (event) { case eOk: currentState = sSizeRequest; emit sizeLookup(); break; case eSearchNoData: currentState = sSelectNextEngineNext; switchToNextState(eOk); break; case eCancel: currentState = sCancel; emit cancel(); break; default: break; } break; case sSelectNextEngineNext: switch (event) { case eOk: currentEngineIndex = (currentEngineIndex + 1) % engines.size(); while (!engines.at(currentEngineIndex)->isActive() && (markEngineIndex != currentEngineIndex)) currentEngineIndex = (currentEngineIndex + 1) % engines.size(); if (currentEngineIndex == markEngineIndex) { trayIcon->setIcon(QIcon((playWasActive)? ":/images/idle" : ":/images/off")); trayIcon->setContextMenu(contextMenu); currentState = sIdle; timer->start(); } else { currentState = sInitEngine; selectEngine(currentEngineIndex); emit init(); } break; default: break; } break; case sSizeRequest: switch (event) { case eOk: currentState = sDownload; emit download(); break; case eWrongSize: if (++sizeFailures == MAX_SIZE_FAILURES) { saveEnginesState(); currentState = sSearchRequest; switchToNextState(eSearchNoData); } else { currentState = sInitEngine; emit init(); } break; case eCancel: currentState = sCancel; emit cancel(); break; default: break; } break; case sDownload: switch (event) { case eOk: currentState = sInfoRequest; emit infoCollect(); break; case eCancel: currentState = sCancel; emit cancel(); break; case eDownloadFailed: saveEnginesState(); trayIcon->setIcon(QIcon((playWasActive)? ":/images/idle" : ":/images/off")); trayIcon->setContextMenu(contextMenu); currentState = sIdle; timer->start(); break; case eDownloadOkButWrongSize: if (++sizeFailures == MAX_SIZE_FAILURES) { saveEnginesState(); currentState = sSearchRequest; switchToNextState(eSearchNoData); } else { currentState = sInitEngine; emit init(); } break; default: break; } break; case sInfoRequest: switch (event) { case eOk: saveEnginesState(); tryCompletePhotoInfo(); updateDB(); showPhotoOnScreen(); savePhotoAction->setEnabled(true); #ifdef EXIF getExifInfoAction->setEnabled(true); #endif trayIcon->setIcon(QIcon((playWasActive)? ":/images/idle" : ":/images/off")); trayIcon->setContextMenu(contextMenu); currentState = sIdle; timer->start(); break; case eCancel: saveEnginesState(); tryCompletePhotoInfo(); updateDB(); showPhotoOnScreen(); savePhotoAction->setEnabled(true); #ifdef EXIF getExifInfoAction->setEnabled(true); #endif currentState = sCancel; emit cancel(); break; default: break; } break; case sCancel: switch (event) { case eOk: trayIcon->setIcon(QIcon((playWasActive)? ":/images/idle" : ":/images/off")); trayIcon->setContextMenu(contextMenu); currentState = sIdle; timer->start(); break; default: break; } break; } } void Application::execTrayAction(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::DoubleClick: if ((currentState == sIdle) && playAction->isEnabled()) nextPhotoAction->trigger(); default: break; } } void Application::start() { switchToNextState(ePlayTimeout); } void Application::initCompleted() { switchToNextState(eOk); } void Application::processSearchResult(bool hasData) { qDebug() << "Application::processSearchResult(" << hasData << ")"; switchToNextState((hasData)? eOk : eSearchNoData); } bool Application::isSizeValid(const QSize &size) const { bool ok; if (size.isValid() && ((size.width() * size.height()) < MAX_PIXEL_NUMBER)) { switch (settings.value(MAIN_SECTION).value(SIZE_CONSTRAINT).toInt()) { case 0: ok = true; break; case 1: ok = (size.width() * size.height()) >= (0.5 * static_cast (QApplication::desktop()->screenGeometry().width()) * static_cast (QApplication::desktop()->screenGeometry().height())); break; case 2: ok = (size.width() * size.height()) >= (0.75 * static_cast (QApplication::desktop()->screenGeometry().width()) * static_cast (QApplication::desktop()->screenGeometry().height())); break; case 3: ok = (size.width() * size.height()) >= (QApplication::desktop()->screenGeometry().width() * QApplication::desktop()->screenGeometry().height()); break; default: ok = false; break; } if (settings.value(MAIN_SECTION).value(ONLY_LANDSCAPES).toBool()) ok &= size.width() >= ((4 * size.height()) / 3); return ok; } else return false; } void Application::processPhotoSize(const QSize &size) { qDebug() << "Application::processPhotoSize(" << size.width() << "x" << size.height() << ")"; switchToNextState((isSizeValid(size))? eOk : eWrongSize); } void Application::processDownloadedPhoto(bool ok, const QFileInfo &localFile) { QList files; qDebug() << "Application::processDownloadedPhoto(" << ok << "," << localFile.absoluteFilePath().toAscii().constData() << ")"; if (ok && QImageReader(localFile.absoluteFilePath()).canRead()) { QSize size = QImageReader(localFile.absoluteFilePath()).size(); if (isSizeValid(size)) { files = QDir(_tempStorageDir).entryInfoList(QDir::Files); QListIterator file(files); while (file.hasNext()) { if ((file.peekNext() != localFile) && file.peekNext().fileName().compare("wallykde4.img",Qt::CaseInsensitive)) { QFile::remove(file.peekNext().absoluteFilePath()); qDebug() << "\tdelete " << file.peekNext().absoluteFilePath().toAscii().constData(); } file.next(); } currentFile = localFile; currentPhotoSize = size; switchToNextState(eOk); } else { qDebug() << "\tsize: " << size.width() << "x" << size.height(); switchToNextState(eDownloadOkButWrongSize); } } else switchToNextState(eDownloadFailed); } void Application::processCollectedInfo(const PhotoInfo &info) { qDebug() << "Application::processCollectedInfo(" << info.owner.toAscii().constData() << "," << info.title.toAscii().constData() << ")"; currentPhotoInfo = info; viewSourceAction->setEnabled(!currentPhotoInfo.sourceUrl.isEmpty() && currentPhotoInfo.sourceUrl.isValid()); switchToNextState(eOk); } void Application::tryCompletePhotoInfo() { #ifdef EXIF Exif::Tags tags(currentFile); if (currentPhotoInfo.owner.isEmpty()) currentPhotoInfo.owner = tags.owner(); if (currentPhotoInfo.title.isEmpty()) currentPhotoInfo.title = tags.title(); if (currentPhotoInfo.description.isEmpty()) currentPhotoInfo.description = tags.description(); #endif if (currentPhotoInfo.title.isEmpty()) currentPhotoInfo.title = currentFile.baseName(); } void Application::switchToIdle() { qDebug() << "Application::switchToIdle()"; switchToNextState(eOk); } void Application::cleanHistory(int now, int timeBack, int timeBackFactor) { QSqlQuery query(db); QDirIterator thumbIterator(_tempStorageDir + "/thumbs",QStringList() << "*.png",QDir::Files); QDateTime dateTime = QDateTime::fromTime_t(now); switch (timeBackFactor) { case 0: dateTime = dateTime.addDays(-timeBack); break; case 1: dateTime = dateTime.addMonths(-timeBack); break; } if (timeBack) { query.prepare(QString("delete from photoHistory where timestamp <= :timestamp")); query.bindValue(":timestamp",dateTime.toTime_t()); query.exec(); } else query.exec("delete from photoHistory"); query.exec("vacuum"); while (thumbIterator.hasNext()) { thumbIterator.next(); if (!timeBack || (thumbIterator.fileInfo().baseName().toUInt() <= dateTime.toTime_t())) QFile::remove(thumbIterator.fileInfo().absoluteFilePath()); } } void Application::updateDBVersion() { QSqlQuery query(db); if (query.exec("pragma user_version")) { query.next(); int user_version = query.value(0).toInt(); while (user_version < DATABASE_CURRENT_VERSION) switch (user_version) { case 0: qDebug() << "Application::updateDBVersion() " << user_version << "==>" << (user_version + 1); if (!query.exec("alter table photoHistory add column tags text") || !query.exec("alter table photoHistory add column width integer") || !query.exec("alter table photoHistory add column height integer") || !query.exec("alter table photoHistory add column exif blob default null") || !query.exec("update photoHistory set tags = 'unknown'")) { qDebug() << "Application::updateDB() error:" << query.lastError().text(); user_version = DATABASE_CURRENT_VERSION; db.close(); } else ++user_version; break; } query.exec(QString("pragma user_version = %1").arg(DATABASE_CURRENT_VERSION)); } } void Application::initializeDB() { qDebug() << "Application::initializeDB()"; db = QSqlDatabase::addDatabase("QSQLITE"); QDir(_tempStorageDir).mkdir("thumbs"); db.setDatabaseName(_tempStorageDir + "/thumbs/wally.db"); if (db.open()) { QSqlQuery query(db); query.exec("PRAGMA journal_mode = OFF"); if (query.exec("select * from sqlite_master where name = 'photoHistory'")) { if (!query.next() && (!query.exec(QString("create table photoHistory (") + " timestamp integer primary key, " + " url text, " + " engine text, " + " tags text default 'unknown', " + " title text, " + " owner text, " + " description text, " + " location text, " + " sourceUrl text, " + " size integer, " + " width integer, " + " height integer, " + " exif blob default null)") || !query.exec(QString("pragma user_version = %1").arg(DATABASE_CURRENT_VERSION)))) { db.close(); qDebug() << "Application::Application() cannot create photoHistory table"; } else updateDBVersion(); } } else qDebug() << "Application::Application() db connection failed"; } void Application::updateDB() { Exif::Tags tags(currentFile); QByteArray cTags; int now = QDateTime::currentDateTime().toTime_t(); qDebug() << "Application::updateDB()"; cleanHistory(now,settings.value(MAIN_SECTION).value(HISTORY_TIME_LIMIT).toInt(), settings.value(MAIN_SECTION).value(HISTORY_TIME_LIMIT_FACTOR).toInt()); if (currentPhotoInfo.searchString.isEmpty()) return; if (db.isOpen() && !engines.at(currentEngineIndex)->photoUrl().isEmpty() && settings.value(MAIN_SECTION).value(HISTORY_TIME_LIMIT).toInt()) { QSqlQuery query(db); if (tags.size()) query.prepare(QString("insert into photoHistory (timestamp, url, engine, tags, title, owner, ") + "description, location, sourceUrl, size, width, height, exif) values (" + ":timestamp, :url, :engine, :tags, :title, :owner, " + ":description, :location, :sourceUrl, :size, :width, :height, :exif)"); else query.prepare(QString("insert into photoHistory (timestamp, url, engine, tags, title, owner, ") + "description, location, sourceUrl, size, width, height, exif) values (" + ":timestamp, :url, :engine, :tags, :title, :owner, " + ":description, :location, :sourceUrl, :size, :width, :height, null)"); query.bindValue(":timestamp",now); query.bindValue(":url",engines.at(currentEngineIndex)->photoUrl()); query.bindValue(":engine",engines.at(currentEngineIndex)->name()); query.bindValue(":tags",currentPhotoInfo.searchString.toLower()); query.bindValue(":title",currentPhotoInfo.title); query.bindValue(":owner",currentPhotoInfo.owner); query.bindValue(":description",currentPhotoInfo.description); query.bindValue(":location",currentPhotoInfo.location); query.bindValue(":sourceUrl",currentPhotoInfo.sourceUrl.toString()); query.bindValue(":size",currentFile.size()); query.bindValue(":width",currentPhotoSize.width()); query.bindValue(":height",currentPhotoSize.height()); if (tags.size()) { cTags = qCompress(tags.data()); query.bindValue(":exif",cTags,QSql::Binary | QSql::In); } if (query.exec()) { QImage thumb(currentFile.absoluteFilePath()); if (thumb.width() > thumb.height()) thumb = thumb.scaledToWidth(100,Qt::SmoothTransformation); else thumb = thumb.scaledToHeight(100,Qt::SmoothTransformation); if (settings.value(MAIN_SECTION).value(EXIF_ROTATE_IMAGES).toBool()) thumb = Exif::Tags(currentFile).normalize(thumb); thumb.save(_tempStorageDir + "/thumbs/" + QString::number(now) + ".png","png"); } else qDebug() << "Application::updateDB() insert error:" << query.lastError().text(); } } void Application::clearHistory() { QSqlQuery query(db); QDirIterator dirIterator(_tempStorageDir + "/thumbs", QStringList() << "*.png", QDir::Files); qDebug() << "Application::clearHistory()"; if (!query.exec("delete from photoHistory") || !query.exec("vacuum")) qDebug() << "Application::clearHistory() delete error:" << query.lastError().text(); while (dirIterator.hasNext()) { dirIterator.next(); QFile::remove(dirIterator.filePath()); } } void Application::showPhotoOnScreen() { QStringList args; QString toolTip; QStringList filters; QList files; QFileInfo newFile; QFile textFile; QTextStream textStream; bool lastWasTitle = false; qDebug() << "Application::showPhotoOnScreen()"; try { #ifdef Q_WS_X11 switch (windowManager) { case wmKDE4: { newFile = adaptPhoto(currentFile.absoluteFilePath(),"PNG",currentPhotoInfo); QDBusMessage message = QDBusMessage::createMethodCall("com.BeCrux.WallyPlugin", "/WallyPlugin", QString(), "setWallpaper"); message.setArguments(QList< QVariant >() << newFile.absoluteFilePath()); QDBusConnection::sessionBus().send(message); } break; case wmKDE3: newFile = adaptPhoto(currentFile.absoluteFilePath(),"PNG",currentPhotoInfo); args << "kdesktop" << "KBackgroundIface" << "setWallpaper" << newFile.absoluteFilePath() << "1"; QProcess::execute("dcop",args); break; case wmGnomeShell: case wmGnome: newFile = adaptPhoto(currentFile.absoluteFilePath(),"PNG",currentPhotoInfo); args << "--type" << "bool" << "--set" << "/desktop/gnome/background/draw_background" << "true"; QProcess::execute("gconftool-2",args); args.clear(); args << "--type" << "string" << "--set" << "/desktop/gnome/background/picture_options" << "centered"; QProcess::execute("gconftool-2",args); args.clear(); args << "--type" << "string" << "--set" << "/desktop/gnome/background/picture_filename" << newFile.absoluteFilePath(); QProcess::execute("gconftool-2",args); args.clear(); newFile = adaptPhoto(currentFile.absoluteFilePath(),"PNG",currentPhotoInfo); args << "set" << "org.gnome.desktop.background" << "draw-background" << "true"; QProcess::execute("gsettings",args); args.clear(); args << "set" << "org.gnome.desktop.background" << "picture-options" << "centered"; QProcess::execute("gsettings",args); args.clear(); args << "set" << "org.gnome.desktop.background" << "picture-uri" << QUrl::fromLocalFile(newFile.absoluteFilePath()).toString(); QProcess::execute("gsettings",args); break; case wmXfce: newFile = adaptPhoto(currentFile.absoluteFilePath(),"PNG",currentPhotoInfo); textFile.setFileName(QDir::homePath() + "/.config/xfce4/desktop/backdrops.list"); textFile.open(QIODevice::WriteOnly); textStream.setDevice(&textFile); textStream << "# xfce backdrop list" << endl; textStream << newFile.absoluteFilePath() << endl; textFile.close(); args << "--reload"; QProcess::execute("xfdesktop",args); break; case wmFluxbox: newFile = adaptPhoto(currentFile.absoluteFilePath(),"PNG",currentPhotoInfo); args << "-c" << newFile.absoluteFilePath(); QProcess::execute("fbsetbg",args); break; case wmFVWM: newFile = adaptPhoto(currentFile.absoluteFilePath(),"XPM",currentPhotoInfo); args << newFile.absoluteFilePath(); QProcess::execute("fvwm-root",args); break; case wmBlackbox: newFile = adaptPhoto(currentFile.absoluteFilePath(),"PNG",currentPhotoInfo); args << "-center" << newFile.absoluteFilePath(); QProcess::execute("bsetbg",args); break; case wmWindowMaker: newFile = adaptPhoto(currentFile.absoluteFilePath(),"PNG",currentPhotoInfo); args << "-e" << newFile.absoluteFilePath(); QProcess::execute("wmsetbg",args); break; default: break; } #endif #ifdef Q_WS_WIN SHELLFLAGSTATE shfs; SHGetSettings(&shfs,SSF_DESKTOPHTML); if (shfs.fDesktopHTML) { if (!adWarningFired) { adWarningFired = true; trayIcon->showMessage(tr("Wally Error"),tr("Active Desktop must be disabled"),QSystemTrayIcon::Critical); } return; } newFile = adaptPhoto(currentFile.absoluteFilePath(),"BMP",currentPhotoInfo); QSettings regSettings("HKEY_CURRENT_USER\\Control Panel\\Desktop",QSettings::NativeFormat); regSettings.setValue("Wallpaper",QDir::toNativeSeparators(newFile.absoluteFilePath())); regSettings.setValue("WallpaperStyle","0"); regSettings.setValue("TileWallpaper","0"); #ifdef UNICODE WCHAR path[1024]; memset(path,0,1024 * sizeof(WCHAR)); QDir::toNativeSeparators(newFile.absoluteFilePath()).toWCharArray(path); SystemParametersInfoW(SPI_SETDESKWALLPAPER,0,reinterpret_cast (path),SPIF_SENDWININICHANGE); #else SystemParametersInfoA(SPI_SETDESKWALLPAPER,0, reinterpret_cast (QDir::toNativeSeparators(newFile.absoluteFilePath()).toAscii().data()), SPIF_SENDWININICHANGE); #endif #endif #ifdef Q_WS_PM newFile = adaptPhoto(currentFile.absoluteFilePath(),"BMP",currentPhotoInfo); HOBJECT hobj; const char *objName = ""; if (hobj = WinQueryObject(reinterpret_cast< const unsigned char * > (objName))) WinSetObjectData(hobj,reinterpret_cast< const unsigned char * > ((QString("BACKGROUND=%1,S,1,I;").arg(QDir::toNativeSeparators(newFile.absoluteFilePath()))).toAscii().constData())); #endif #ifdef Q_WS_MAC newFile = adaptPhoto(currentFile.absoluteFilePath(),"PNG",currentPhotoInfo); QFile scriptFile(_tempStorageDir + "/wally.scpt"); QTextStream scriptText(&scriptFile); scriptFile.open(QIODevice::WriteOnly); if (QSysInfo::MacintoshVersion == QSysInfo::MV_10_6) { scriptText << "tell application \"System Events\"" << endl; scriptText << "set picture of every desktop to POSIX file \"" << newFile.absoluteFilePath() << "\"" << endl; scriptText << "end tell" << endl; } else { scriptText << "tell application \"Finder\"" << endl; scriptText << "set desktop picture to POSIX file \"" << newFile.absoluteFilePath() << "\"" << endl; scriptText << "end tell" << endl; } scriptFile.close(); args << QDir::toNativeSeparators(_tempStorageDir + "/wally.scpt"); QProcess::execute("osascript",args); #endif if (settings.value(MAIN_SECTION).value(VIEW_INFO_IN_TOOLTIP).toBool()) { if (!currentPhotoInfo.owner.isEmpty() || !currentPhotoInfo.title.isEmpty() || !currentPhotoInfo.description.isEmpty() || !currentPhotoInfo.location.isEmpty()) { if (!currentPhotoInfo.title.isEmpty()) toolTip += QString("\"") + currentPhotoInfo.title + "\""; lastWasTitle = true; if (!currentPhotoInfo.description.isEmpty()) { if (!toolTip.isEmpty()) toolTip += QString("

"); if (lastWasTitle) toolTip += QString("
"); toolTip += QString("") + currentPhotoInfo.description + ""; lastWasTitle = false; } if (!currentPhotoInfo.owner.isEmpty()) { if (!toolTip.isEmpty()) toolTip += QString("
"); if (lastWasTitle) toolTip += QString("
"); toolTip += tr("by:") + " " + currentPhotoInfo.owner; lastWasTitle = false; } if (!currentPhotoInfo.location.isEmpty()) { if (!toolTip.isEmpty()) toolTip += QString("
"); if (lastWasTitle) toolTip += QString("
"); toolTip += tr("Location:") + " " + currentPhotoInfo.location; lastWasTitle = false; } } if (!toolTip.isEmpty()) toolTip += QString("
"); if (lastWasTitle) toolTip += QString("
"); toolTip += tr("Engine:") + " " + engines.at(currentEngineIndex)->name(); trayIcon->setToolTip(toolTip); } if (settings.value(MAIN_SECTION).value(QUIT_AFTER_BACKGROUND_CHANGE).toBool()) QTimer::singleShot(10000,quitAction,SLOT(trigger())); } catch (...) { qDebug() << "Application::showPhotoOnScreen() !!photo is not valid!!"; } } void Application::showPhotoOnScreen(const QString &engineName) { int i = 0; qDebug() << "Application::showPhotoOnScreen(" << engineName << ")"; while ((i < engines.size()) && engineName.compare(engines.at(i)->name(),Qt::CaseInsensitive)) ++i; if (i < engines.size()) { int tempEngineIndex = currentEngineIndex; currentEngineIndex = i; showPhotoOnScreen(); currentEngineIndex = tempEngineIndex; } } bool Application::isCenterInsideDesktop(const QPoint ¢er, const QSize &pixmapSize, const QSize &desktopSize) { return (((center.x() + pixmapSize.width() / 2) >= 0) && ((center.y() + pixmapSize.height() / 2) >= 0) && ((center.x() - pixmapSize.width() / 2) <= desktopSize.width()) && ((center.y() - pixmapSize.width() / 2) <= desktopSize.height())); } bool Application::isCenterStored(const QPoint ¢er, const QList< QPair< QPoint,QPair > > ¢ers) { bool found = false; QListIterator< QPair< QPoint,QPair > > c(centers); while (c.hasNext() && !(found = (c.next().first == center))) ; return found; } void Application::recFillCentersList(const QSize &desktopSize, const QSize &pixmapSize, QList< QPair< QPoint,QPair > > ¢ers, const QPoint ¢er, bool horizontalFlip, bool verticalFlip) { if (isCenterInsideDesktop(center,pixmapSize,desktopSize) && !isCenterStored(center,centers)) { centers.push_back(qMakePair(center,qMakePair(horizontalFlip,verticalFlip))); recFillCentersList(desktopSize,pixmapSize,centers, QPoint(center.x(),center.y() - pixmapSize.height()),horizontalFlip,!verticalFlip); recFillCentersList(desktopSize,pixmapSize,centers, QPoint(center.x(),center.y() + pixmapSize.height()),horizontalFlip,!verticalFlip); recFillCentersList(desktopSize,pixmapSize,centers, QPoint(center.x() - pixmapSize.width(),center.y()),!horizontalFlip,verticalFlip); recFillCentersList(desktopSize,pixmapSize,centers, QPoint(center.x() + pixmapSize.width(),center.y()),!horizontalFlip,verticalFlip); } } void Application::fillCentersList(const QSize &desktopSize, QSize pixmapSize, QList< QPair< QPoint,QPair > > ¢ers) { switch (static_cast (settings.value(MAIN_SECTION).value(WALLPAPER_POSITION).toInt())) { case Centered: case CenteredMaxpect: case Scaled: case CenteredAutoFit: case ScaleAndCrop: centers.push_back(qMakePair(QPoint(desktopSize.width() / 2,desktopSize.height() / 2), qMakePair(false,false))); break; case TiledMaxpect: pixmapSize.scale(desktopSize,Qt::KeepAspectRatio); case Tiled: /* or tiled maxpect */ case MirroredTiled: recFillCentersList(desktopSize,pixmapSize,centers, QPoint(pixmapSize.width() / 2,pixmapSize.height() / 2), false,false); break; case CenterTiled: recFillCentersList(desktopSize,pixmapSize,centers, QPoint(desktopSize.width() / 2,desktopSize.height() / 2), false,false); break; case SymmetricalTiled: case SymmetricalMirroredTiled: recFillCentersList(desktopSize,pixmapSize,centers, QPoint(desktopSize.width() / 2,desktopSize.height() / 2) - QPoint(pixmapSize.width() / 2,pixmapSize.height() / 2), false,false); break; default: break; } } void Application::drawTextWithShadowOnScene(const QString &text, QGraphicsScene *scene, Qt::AlignmentFlag alignment, int &y, bool isTitle) { qreal x; QGraphicsTextItem *textItem; QFont font(qApp->font()); font.setPointSize(10); font.setBold(isTitle); textItem = new QGraphicsTextItem; scene->addItem(textItem); textItem->setFont(font); textItem->setDefaultTextColor(Qt::white); if (isTitle) textItem->setHtml("\"" + text + "\""); else textItem->setHtml(text); switch (alignment) { case Qt::AlignRight: default: x = scene->width() - textItem->boundingRect().toRect().width(); break; case Qt::AlignLeft: x = 2; break; } textItem->setZValue(1.0); textItem->setPos(x,y); textItem = new QGraphicsTextItem; scene->addItem(textItem); textItem->setFont(font); textItem->setDefaultTextColor(Qt::black); if (isTitle) textItem->setHtml("\"" + text + "\""); else textItem->setHtml(text); textItem->setPos(x+1,y+1); textItem->setZValue(0.5); y += textItem->boundingRect().toRect().height() + 1; } QFileInfo Application::adaptPhoto(const QFileInfo &file, const QString &format, const PhotoInfo &info) { int prevHeight; QString newFileName; QList< QPair< QPoint,QPair > > centers; QRect userRect = (settings.value(MAIN_SECTION).value(USE_FULL_DESKTOP_AREA).toBool())? QApplication::desktop()->screenGeometry() : QApplication::desktop()->availableGeometry(); QGraphicsScene desktopScene(QApplication::desktop()->screenGeometry()); QImage image; Position position = static_cast (settings.value(MAIN_SECTION).value(WALLPAPER_POSITION).toInt()); qDebug() << "Application::adaptPhoto(" << file.absoluteFilePath().toAscii().constData() << "," << format.toAscii().constData() << "," << info.title.toAscii().constData() << "," << info.owner.toAscii().constData() << ")"; qDebug() << "\tscreen: " << QApplication::desktop()->screenGeometry().left() << "," << QApplication::desktop()->screenGeometry().top() << "," << QApplication::desktop()->screenGeometry().right() << "," << QApplication::desktop()->screenGeometry().bottom() << "," << QApplication::desktop()->screenGeometry().width() << "," << QApplication::desktop()->screenGeometry().height(); qDebug() << "\tavailable: " << userRect.left() << "," << userRect.top() << "," << userRect.right() << "," << userRect.bottom() << "," << userRect.width() << "," << userRect.height(); if (!image.load(file.absoluteFilePath())) throw; if (settings.value(MAIN_SECTION).value(EXIF_ROTATE_IMAGES).toBool()) image = Exif::Tags(file).normalize(image); QImage newImage(QApplication::desktop()->screenGeometry().width(), QApplication::desktop()->screenGeometry().height(),QImage::Format_ARGB32); QPainter painter(&newImage); painter.setRenderHint(QPainter::Antialiasing,true); painter.setRenderHint(QPainter::TextAntialiasing,true); switch (position) { case Centered: case Tiled: case CenterTiled: default: break; case CenteredMaxpect: case TiledMaxpect: image = image.scaled(userRect.size(),Qt::KeepAspectRatio,Qt::SmoothTransformation); break; case Scaled: image = image.scaled(userRect.size(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation); break; case CenteredAutoFit: if ((image.size().width() > userRect.width()) || (image.size().height() > userRect.height())) image = image.scaled(userRect.size(),Qt::KeepAspectRatio,Qt::SmoothTransformation); break; case ScaleAndCrop: image = image.scaled(userRect.size(),Qt::KeepAspectRatioByExpanding,Qt::SmoothTransformation); break; } if (settings.value(MAIN_SECTION).value(AUTO_COLOR).toBool()) { int x, y, r = 0, g = 0, b = 0; for (y = 0; y < image.height(); ++y) for (x = 0; x < image.width(); ++x) { QColor color = image.pixel(x,y); r += color.red(); g += color.green(); b += color.blue(); } desktopScene.setBackgroundBrush(QColor(r / (image.height() * image.width()), g / (image.height() * image.width()), b / (image.height() * image.width()))); } else desktopScene.setBackgroundBrush(QColor(settings.value(MAIN_SECTION).value(BORDER_COLOR).toString())); fillCentersList(userRect.size(),image.size(),centers); QListIterator< QPair< QPoint,QPair > > center(centers); while (center.hasNext()) { QPair< QPoint,QPair > c = center.next(); QPoint p(c.first.x() - image.width() / 2 + userRect.left(), c.first.y() - image.height() / 2 + userRect.top()); desktopScene.addPixmap(QPixmap::fromImage(image.mirrored(((position == MirroredTiled) || (position == SymmetricalMirroredTiled)) && c.second.first, ((position == MirroredTiled) || (position == SymmetricalMirroredTiled)) && c.second.second)))->setPos(p); } if (settings.value(MAIN_SECTION).value(VIEW_INFO_ON_PHOTO).toBool()) { prevHeight = QApplication::desktop()->availableGeometry().top(); if (!info.title.isEmpty()) drawTextWithShadowOnScene(info.title,&desktopScene, static_cast (settings.value(MAIN_SECTION).value(INFO_POSITION_ON_PHOTO).toInt()), prevHeight,true); if (!info.owner.isEmpty()) drawTextWithShadowOnScene(tr("by:") + " " + info.owner,&desktopScene, static_cast (settings.value(MAIN_SECTION).value(INFO_POSITION_ON_PHOTO).toInt()), prevHeight); drawTextWithShadowOnScene(tr("Engine:") + " " + engines.at(currentEngineIndex)->name(), &desktopScene, static_cast (settings.value(MAIN_SECTION).value(INFO_POSITION_ON_PHOTO).toInt()), prevHeight); } desktopScene.render(&painter); engines.at(currentEngineIndex)->applyWatermark(&painter,QApplication::desktop()->availableGeometry()); newFileName = _tempStorageDir + "/" + QString::number(QDateTime::currentDateTime().toTime_t()) + "." + format.toLower(); newImage.save(newFileName,format.toAscii()); return newFileName; } void Application::execPlay() { qDebug() << "Application::execPlay()"; playWasActive = true; trayIcon->setIcon(QIcon(":/images/idle")); playAction->setText(tr("Pause")); playAction->setIcon(QIcon(":/images/control_pause")); playAction->setData(true); disconnect(playAction,SIGNAL(triggered()),this,SLOT(execPlay())); connect(playAction,SIGNAL(triggered()),this,SLOT(execPause())); nextPhotoAction->setEnabled(true); if (settings.value(MAIN_SECTION).value(SWITCH_ON_PLAY).toBool()) switchToNextState(ePlayTimeout); else timer->start(); } void Application::execPause() { qDebug() << "Application::execPause()"; playWasActive = false; trayIcon->setIcon(QIcon(":/images/off")); playAction->setText(tr("Play")); playAction->setIcon(QIcon(":/images/control_play")); playAction->setData(false); disconnect(playAction,SIGNAL(triggered()),this,SLOT(execPause())); connect(playAction,SIGNAL(triggered()),this,SLOT(execPlay())); nextPhotoAction->setEnabled(false); timer->stop(); } void Application::execAbout() { AboutDialog aboutDialog; qDebug() << "Application::execAbout()"; connect(&aboutDialog,SIGNAL(executed()),this,SLOT(deActivate())); connect(&aboutDialog,SIGNAL(closed()),this,SLOT(reActivate())); aboutDialog.exec(); } void Application::execAboutQt() { deActivate(); qApp->aboutQt(); reActivate(); } void Application::execSavePhoto() { QString fileName; qDebug() << "Application::execSavePhoto()"; deActivate(); #ifdef Q_WS_X11 fileName = QFileDialog::getSaveFileName(0,tr("Save photo"),QDir::homePath() + "/" + currentFile.fileName(), tr("Images (*.png *.xpm *.jpg)"),0,QFileDialog::DontUseNativeDialog); #else fileName = QFileDialog::getSaveFileName(0,tr("Save photo"), QDesktopServices::storageLocation(QDesktopServices::PicturesLocation) + "/" + currentFile.fileName(), tr("Images (*.png *.xpm *.jpg)"),0,QFileDialog::DontUseNativeDialog); #endif if (!fileName.isEmpty()) QFile::copy(currentFile.absoluteFilePath(),fileName); reActivate(); } void Application::execCancel() { qDebug() << "Application::execCancel()"; trayIcon->setIcon(QIcon(":/images/off")); trayIcon->setContextMenu(0); switchToNextState(eCancel); } void Application::execShowSettings() { qDebug() << "Application::execShowSettings()"; QMap activations; QListIterator engine(engines); SettingsDialog dialog; connect(&dialog,SIGNAL(executed()),this,SLOT(deActivate())); connect(&dialog,SIGNAL(closed()),this,SLOT(reActivate())); connect(&dialog,SIGNAL(clearHistory()),this,SLOT(clearHistory())); dialog.loadSettings(settings); while (engine.hasNext()) { engine.peekNext()->edit(); dialog.addSettingsWidget(engine.next()->newSettingsWidget(&dialog)); } engine.toFront(); if (dialog.exec() == QDialog::Accepted) { Engine::Core *item; activations = dialog.activations(); applySettings(dialog.settings()); while (engine.hasNext()) { item = engine.next(); item->submit(); item->setActive(activations.value(item)); } saveSettings(); checkPlayEnableable(); } else while (engine.hasNext()) engine.next()->revert(); } void Application::execShowHistory() { QNetworkProxy proxy; History::Dialog history(db,_tempStorageDir); dontSwitchState = true; qDebug() << "Application::execShowHistory()"; connect(&history,SIGNAL(executed()),this,SLOT(deActivate())); connect(&history,SIGNAL(closed()),this,SLOT(reActivate())); connect(&history,SIGNAL(photoDownloaded(bool, const QFileInfo &)), this,SLOT(processDownloadedPhoto(bool, const QFileInfo &))); connect(&history,SIGNAL(infoCollected(const PhotoInfo &)), this,SLOT(processCollectedInfo(const PhotoInfo &))); connect(&history,SIGNAL(changePhoto(const QString &)), this,SLOT(showPhotoOnScreen(const QString &))); if (settings.value(NETWORK_SECTION).value(USE_PROXY).toBool()) { proxy.setType(static_cast (settings.value(NETWORK_SECTION).value(PROXY_TYPE).toInt())); if (!settings.value(NETWORK_SECTION).value(USE_SYSTEM_PROXY).toBool()) { proxy.setHostName(settings.value(NETWORK_SECTION).value(PROXY_SERVER).toString()); proxy.setPort(settings.value(NETWORK_SECTION).value(PROXY_PORT).toInt()); } else proxy.setHostName("0.0.0.0"); if (settings.value(NETWORK_SECTION).value(PROXY_AUTHENTICATION).toBool()) { proxy.setUser(settings.value(NETWORK_SECTION).value(PROXY_USERNAME).toString()); proxy.setPassword(settings.value(NETWORK_SECTION).value(PROXY_PASSWORD).toString()); } history.setProxy(proxy); } history.exec(); dontSwitchState = false; } void Application::execGetExifInfo() { qDebug() << "Application::execGetExifInfo()"; Exif::InfoDialog dialog(currentFile); connect(&dialog,SIGNAL(executed()),this,SLOT(deActivate())); connect(&dialog,SIGNAL(closed()),this,SLOT(reActivate())); dialog.exec(); } void Application::execNextPhoto() { qDebug() << "Application::execNextPhoto()"; timer->stop(); switchToNextState(ePlayTimeout); } void Application::execExploreImageSource() { QDesktopServices::openUrl(currentPhotoInfo.sourceUrl); } Version Application::currentVersion() const { QSettings settings; settings.beginGroup(MAIN_SECTION); Version v(settings.value(VERSION,"0.0.0").toString()); settings.endGroup(); return v; } void Application::loadSettings() { QListIterator engine(engines); QSettings sourceSettings; qDebug() << "Application::loadSettings()"; sourceSettings.beginGroup(MAIN_SECTION); settings[MAIN_SECTION][DISABLE_SPLASH_SCREEN] = sourceSettings.value(DISABLE_SPLASH_SCREEN,false); settings[MAIN_SECTION][QUIT_AFTER_BACKGROUND_CHANGE] = sourceSettings.value(QUIT_AFTER_BACKGROUND_CHANGE,false); settings[MAIN_SECTION][INTERVAL] = sourceSettings.value(INTERVAL,DEFAULT_INTERVAL); settings[MAIN_SECTION][INTERVAL_UNIT] = sourceSettings.value(INTERVAL_UNIT,MINUTES_UNIT); settings[MAIN_SECTION][BORDER_COLOR] = sourceSettings.value(BORDER_COLOR,QColor(Qt::black).name()); settings[MAIN_SECTION][AUTO_COLOR] = sourceSettings.value(AUTO_COLOR,false); settings[MAIN_SECTION][WALLPAPER_POSITION] = sourceSettings.value(WALLPAPER_POSITION,static_cast (Centered)); settings[MAIN_SECTION][SWITCH_ON_PLAY] = sourceSettings.value(SWITCH_ON_PLAY,false); settings[MAIN_SECTION][PLAY_ON_START] = sourceSettings.value(PLAY_ON_START,false); settings[MAIN_SECTION][RUN_ON_SYS_START] = sourceSettings.value(RUN_ON_SYS_START,false); settings[MAIN_SECTION][ONLY_LANDSCAPES] = sourceSettings.value(ONLY_LANDSCAPES,false); settings[MAIN_SECTION][EXIF_ROTATE_IMAGES] = sourceSettings.value(EXIF_ROTATE_IMAGES,false); settings[MAIN_SECTION][SIZE_CONSTRAINT] = sourceSettings.value(SIZE_CONSTRAINT,0); settings[MAIN_SECTION][USE_FULL_DESKTOP_AREA] = sourceSettings.value(USE_FULL_DESKTOP_AREA,false); settings[MAIN_SECTION][VIEW_INFO_IN_TOOLTIP] = sourceSettings.value(VIEW_INFO_IN_TOOLTIP,false); settings[MAIN_SECTION][RANDOM_SEARCH] = sourceSettings.value(RANDOM_SEARCH,false); settings[MAIN_SECTION][VIEW_INFO_ON_PHOTO] = sourceSettings.value(VIEW_INFO_ON_PHOTO,false); settings[MAIN_SECTION][INFO_POSITION_ON_PHOTO] = sourceSettings.value(INFO_POSITION_ON_PHOTO,Qt::AlignRight); settings[MAIN_SECTION][MIN_FREE_DISK_SPACE] = sourceSettings.value(MIN_FREE_DISK_SPACE,200); settings[MAIN_SECTION][MIN_FREE_DISK_SPACE_FACTOR] = sourceSettings.value(MIN_FREE_DISK_SPACE_FACTOR,1024); settings[MAIN_SECTION][HISTORY_TIME_LIMIT] = sourceSettings.value(HISTORY_TIME_LIMIT,20); settings[MAIN_SECTION][HISTORY_TIME_LIMIT_FACTOR] = sourceSettings.value(HISTORY_TIME_LIMIT_FACTOR,0); currentEngineIndex = sourceSettings.value(LAST_USED_ENGINE,-1).toInt(); sourceSettings.endGroup(); sourceSettings.beginGroup(NETWORK_SECTION); settings[NETWORK_SECTION][USE_PROXY] = sourceSettings.value(USE_PROXY,false); settings[NETWORK_SECTION][USE_SYSTEM_PROXY] = sourceSettings.value(USE_SYSTEM_PROXY,true); settings[NETWORK_SECTION][PROXY_TYPE] = sourceSettings.value(PROXY_TYPE,QNetworkProxy::HttpProxy); settings[NETWORK_SECTION][PROXY_SERVER] = sourceSettings.value(PROXY_SERVER,QString()); settings[NETWORK_SECTION][PROXY_PORT] = sourceSettings.value(PROXY_PORT,8080); settings[NETWORK_SECTION][PROXY_AUTHENTICATION] = sourceSettings.value(PROXY_AUTHENTICATION,false); settings[NETWORK_SECTION][PROXY_USERNAME] = sourceSettings.value(PROXY_USERNAME,QString()); settings[NETWORK_SECTION][PROXY_PASSWORD] = QString(QByteArray::fromBase64(sourceSettings.value(PROXY_PASSWORD,QString()).toString().toAscii())); sourceSettings.endGroup(); sourceSettings.beginGroup(ENGINES_SECTION); while (engine.hasNext()) { sourceSettings.beginGroup(engine.peekNext()->name()); engine.peekNext()->loadSettings(sourceSettings); engine.peekNext()->loadState(sourceSettings); sourceSettings.endGroup(); engine.next(); } sourceSettings.endGroup(); applySettings(settings); saveSettings(); } void Application::saveSettings() { QListIterator engine(engines); QSettings destSettings; qDebug() << "Application::saveSettings()"; destSettings.beginGroup(MAIN_SECTION); destSettings.setValue(DISABLE_SPLASH_SCREEN,settings.value(MAIN_SECTION).value(DISABLE_SPLASH_SCREEN)); destSettings.setValue(QUIT_AFTER_BACKGROUND_CHANGE,settings.value(MAIN_SECTION).value(QUIT_AFTER_BACKGROUND_CHANGE)); destSettings.setValue(INTERVAL,settings.value(MAIN_SECTION).value(INTERVAL)); destSettings.setValue(INTERVAL_UNIT,settings.value(MAIN_SECTION).value(INTERVAL_UNIT)); destSettings.setValue(BORDER_COLOR,settings.value(MAIN_SECTION).value(BORDER_COLOR)); destSettings.setValue(AUTO_COLOR,settings.value(MAIN_SECTION).value(AUTO_COLOR)); destSettings.setValue(WALLPAPER_POSITION,settings.value(MAIN_SECTION).value(WALLPAPER_POSITION)); destSettings.setValue(SWITCH_ON_PLAY,settings.value(MAIN_SECTION).value(SWITCH_ON_PLAY)); destSettings.setValue(PLAY_ON_START,settings.value(MAIN_SECTION).value(PLAY_ON_START)); destSettings.setValue(RUN_ON_SYS_START,settings.value(MAIN_SECTION).value(RUN_ON_SYS_START)); destSettings.setValue(ONLY_LANDSCAPES,settings.value(MAIN_SECTION).value(ONLY_LANDSCAPES)); destSettings.setValue(EXIF_ROTATE_IMAGES,settings.value(MAIN_SECTION).value(EXIF_ROTATE_IMAGES)); destSettings.setValue(USE_FULL_DESKTOP_AREA,settings.value(MAIN_SECTION).value(USE_FULL_DESKTOP_AREA)); destSettings.setValue(VIEW_INFO_IN_TOOLTIP,settings.value(MAIN_SECTION).value(VIEW_INFO_IN_TOOLTIP)); destSettings.setValue(SIZE_CONSTRAINT,settings.value(MAIN_SECTION).value(SIZE_CONSTRAINT)); destSettings.setValue(RANDOM_SEARCH,settings.value(MAIN_SECTION).value(RANDOM_SEARCH)); destSettings.setValue(VIEW_INFO_ON_PHOTO,settings.value(MAIN_SECTION).value(VIEW_INFO_ON_PHOTO)); destSettings.setValue(INFO_POSITION_ON_PHOTO,settings.value(MAIN_SECTION).value(INFO_POSITION_ON_PHOTO)); destSettings.setValue(MIN_FREE_DISK_SPACE,settings.value(MAIN_SECTION).value(MIN_FREE_DISK_SPACE)); destSettings.setValue(MIN_FREE_DISK_SPACE_FACTOR,settings.value(MAIN_SECTION).value(MIN_FREE_DISK_SPACE_FACTOR)); destSettings.setValue(HISTORY_TIME_LIMIT,settings.value(MAIN_SECTION).value(HISTORY_TIME_LIMIT)); destSettings.setValue(HISTORY_TIME_LIMIT_FACTOR,settings.value(MAIN_SECTION).value(HISTORY_TIME_LIMIT_FACTOR)); destSettings.endGroup(); destSettings.beginGroup(NETWORK_SECTION); destSettings.setValue(USE_PROXY,settings.value(NETWORK_SECTION).value(USE_PROXY)); destSettings.setValue(USE_SYSTEM_PROXY,settings.value(NETWORK_SECTION).value(USE_SYSTEM_PROXY)); destSettings.setValue(PROXY_TYPE,settings.value(NETWORK_SECTION).value(PROXY_TYPE)); destSettings.setValue(PROXY_SERVER,settings.value(NETWORK_SECTION).value(PROXY_SERVER)); destSettings.setValue(PROXY_PORT,settings.value(NETWORK_SECTION).value(PROXY_PORT)); destSettings.setValue(PROXY_AUTHENTICATION,settings.value(NETWORK_SECTION).value(PROXY_AUTHENTICATION)); destSettings.setValue(PROXY_USERNAME,settings.value(NETWORK_SECTION).value(PROXY_USERNAME)); destSettings.setValue(PROXY_PASSWORD, QString(settings.value(NETWORK_SECTION).value(PROXY_PASSWORD).toString().toAscii().toBase64())); destSettings.endGroup(); destSettings.beginGroup(ENGINES_SECTION); while (engine.hasNext()) { destSettings.beginGroup(engine.peekNext()->name()); destSettings.remove(QString()); engine.peekNext()->saveSettings(destSettings); engine.peekNext()->saveState(destSettings); destSettings.endGroup(); engine.next(); } destSettings.endGroup(); } void Application::saveEnginesState() { QSettings stateSettings; qDebug() << "Application::saveEnginesState()"; stateSettings.beginGroup(MAIN_SECTION); stateSettings.setValue(LAST_USED_ENGINE,currentEngineIndex); stateSettings.endGroup(); stateSettings.beginGroup(ENGINES_SECTION); stateSettings.beginGroup(engines.at(currentEngineIndex)->name()); engines.at(currentEngineIndex)->saveState(stateSettings); stateSettings.endGroup(); stateSettings.endGroup(); } void Application::applySettings(WallySettings newSettings) { QListIterator engine(engines); QNetworkProxy proxy(QNetworkProxy::NoProxy); qDebug() << "Application::applySettings(...)"; settings = newSettings; #ifdef Q_WS_WIN QSettings regSettings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat); if (settings.value(MAIN_SECTION).value(RUN_ON_SYS_START).toBool()) regSettings.setValue(APPLICATION_NAME,QDir::toNativeSeparators(qApp->applicationFilePath())); else regSettings.remove(APPLICATION_NAME); #endif switch (settings.value(MAIN_SECTION).value(INTERVAL_UNIT).toInt()) { case SECONDS_UNIT: timer->setInterval(settings.value(MAIN_SECTION).value(INTERVAL).toInt() * 1000); break; default: case MINUTES_UNIT: timer->setInterval(settings.value(MAIN_SECTION).value(INTERVAL).toInt() * 60000); break; case HOURS_UNIT: timer->setInterval(settings.value(MAIN_SECTION).value(INTERVAL).toInt() * 3600000); break; } if (settings.value(NETWORK_SECTION).value(USE_PROXY).toBool()) { proxy.setType(static_cast (settings.value(NETWORK_SECTION).value(PROXY_TYPE).toInt())); if (!settings.value(NETWORK_SECTION).value(USE_SYSTEM_PROXY).toBool()) { proxy.setHostName(settings.value(NETWORK_SECTION).value(PROXY_SERVER).toString()); proxy.setPort(settings.value(NETWORK_SECTION).value(PROXY_PORT).toInt()); } else proxy.setHostName("0.0.0.0"); if (settings.value(NETWORK_SECTION).value(PROXY_AUTHENTICATION).toBool()) { proxy.setUser(settings.value(NETWORK_SECTION).value(PROXY_USERNAME).toString()); proxy.setPassword(settings.value(NETWORK_SECTION).value(PROXY_PASSWORD).toString()); } qDebug() << "\tnew proxy is" << proxy.user().toAscii().constData() << "@" << proxy.hostName().toAscii().constData() << ":" << QString::number(proxy.port()).toAscii().constData(); } while (engine.hasNext()) { HttpEngine::Core *httpEngine = qobject_cast (engine.next()); if (httpEngine) { httpEngine->setProxy(proxy); httpEngine->setFreeDiskSpaceThreshold(settings.value(MAIN_SECTION).value(MIN_FREE_DISK_SPACE).toInt() * settings.value(MAIN_SECTION).value(MIN_FREE_DISK_SPACE_FACTOR).toInt() * 1024); } } } void Application::addEngine(Engine::Core *e) { qDebug() << "Application::addEngine(" << e->name().toAscii().constData() << ")"; engines << e; } void Application::checkPlayEnableable() { qDebug() << "Application::checkPlayEnableable()"; QListIterator engine(engines); int photosCount = 0; while (engine.hasNext()) photosCount += engine.next()->rowCount(); if (!photosCount) execPause(); playAction->setEnabled(photosCount); } void Application::setupBeforeLaunch() { qDebug() << "Application::setupBeforeLaunch()"; QSettings versionSettings; versionSettings.beginGroup(MAIN_SECTION); versionSettings.setValue(VERSION,Version(QString(APPLICATION_VERSION)).toString()); versionSettings.endGroup(); checkPlayEnableable(); if (playAction->isEnabled() && settings.value(MAIN_SECTION).value(PLAY_ON_START).toBool()) QTimer::singleShot(5000,playAction,SLOT(trigger())); } #ifdef Q_WS_X11 bool Application::x11EventFilter(XEvent *event) { XKeyEvent *ev; if (captureKeymaps && (event->type == KeyPress)) { ev = reinterpret_cast (event); if ((ev->state & ControlMask) && (ev->state & ShiftMask)) switch (XLookupKeysym(ev,0)) { case XK_a: qDebug() << "Application::x11EventFilter(...) captured CTRL+Shift+A"; aboutAction->trigger(); break; case XK_s: qDebug() << "Application::x11EventFilter(...) captured CTRL+Shift+S"; configureAction->trigger(); break; case XK_n: qDebug() << "Application::x11EventFilter(...) captured CTRL+Shift+N"; nextPhotoAction->trigger(); break; case XK_q: qDebug() << "Application::x11EventFilter(...) captured CTRL+Shift+Q"; quitAction->trigger(); break; case XK_d: qDebug() << "Application::x11EventFilter(...) captured CTRL+Shift+D"; savePhotoAction->trigger(); break; case XK_i: qDebug() << "Application::x11EventFilter(...) captured CTRL+Shift+I"; getExifInfoAction->trigger(); break; case XK_h: qDebug() << "Application::x11EventFilter(...) captured CTRL+Shift+H"; historyAction->trigger(); break; case XK_w: qDebug() << "Application::x11EventFilter(...) captured CTRL+Shift+W"; viewSourceAction->trigger(); break; case XK_p: qDebug() << "Application::x11EventFilter(...) captured CTRL+Shift+P"; playAction->trigger(); break; default: break; } } XAllowEvents(QX11Info::display(),ReplayKeyboard,event->xkey.time); XFlush(QX11Info::display()); return false; } #endif #ifdef Q_WS_WIN bool Application::winEventFilter(MSG *msg, long * /* result */) { if ((msg->message == WM_USER) && (msg->wParam == 1234) && (msg->lParam == 5678)) { qDebug() << "Application::winEventFilter(WM_USER,1234,5678)"; cancelAction->trigger(); QTimer::singleShot(250,this,SLOT(quit())); } return false; } #endif void Application::deActivate() { playTimerWasActive = timer->isActive(); trayIcon->setIcon(QIcon(":/images/off")); trayIcon->setContextMenu(0); timer->stop(); } void Application::reActivate() { trayIcon->setContextMenu(contextMenu); if (playTimerWasActive) { trayIcon->setIcon(QIcon(":/images/idle")); timer->start(); } } void Application::showTrayMessage() { trayIcon->showMessage(QString("%1 %2").arg(APPLICATION_NAME).arg(APPLICATION_VERSION), tr("Right-click to show main menu")); } wally-2.4.4/src/httpengine.cpp0000644000000000000000000005137311676624760015037 0ustar rootroot/* TRANSLATOR HttpEngine::Item */ /* TRANSLATOR HttpEngine::Core */ /* TRANSLATOR HttpEngine::SettingsWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "diskinfo.h" #include "engine.h" #include "httpengine.h" using namespace HttpEngine; Item::Item() { _savePhotos = false; _pageIndex = _pages = _consecutiveSearchesFailed = 0; } Item::Item(Item *item) { _pageIndex = item->_pageIndex; _pages = item->_pages; _savePhotos = item->_savePhotos; _photosPath = item->_photosPath; _consecutiveSearchesFailed = item->_consecutiveSearchesFailed; } void Item::loadState(QSettings &settings, const QString &group) { settings.beginGroup(group); _pageIndex = settings.value(PAGE_INDEX,0).toInt(); _pages = settings.value(PAGES,0).toInt(); doLoadState(settings); settings.endGroup(); } void Item::saveState(QSettings &settings, const QString &engineName, int id) const { settings.beginGroup(QString("%1%2").arg(engineName).arg(id)); settings.setValue(QString(PAGE_INDEX),QString::number(_pageIndex)); settings.setValue(QString(PAGES),QString::number(_pages)); doSaveState(settings); settings.endGroup(); } void Item::loadSettings(QSettings &settings, const QString &group) { settings.beginGroup(group); _savePhotos = settings.value("savePhotos",false).toBool(); _photosPath = settings.value("photosPath",QString()).toString(); doLoadSettings(settings); settings.endGroup(); } void Item::saveSettings(QSettings &settings, const QString &engineName, int id) const { settings.beginGroup(QString("%1%2").arg(engineName).arg(id)); settings.setValue("savePhotos",_savePhotos); settings.setValue("photosPath",QDir::toNativeSeparators(_photosPath)); doSaveSettings(settings); settings.endGroup(); } QUrl Item::prepareInit(Operation &op) { qDebug() << metaObject()->className() << "::prepareInit()"; return doPrepareInit(op); } void Item::processInitResult(const QByteArray &response) { QString debugMsg = QString(metaObject()->className()) + "::processInitResult() ->"; if (response.size()) debugMsg += QString("\n") + response.constData(); else debugMsg += " empty"; qDebug() << debugMsg; doProcessInitResult(response); } QUrl Item::prepareSearch(bool randomMode, Operation &op) { QString debugMsg = QString(metaObject()->className()) + "::doCalculateNextIndex(" + ((randomMode)? "true" : "false") + "," + QString::number(_pageIndex) + "," + QString::number(_pages) + ") ->"; qDebug() << metaObject()->className() << "::prepareSearch(" << randomMode << ")"; if (_pages && (_pageIndex >= _pages)) resetPages(); _pageIndex = doCalculateNextIndex(randomMode,_pageIndex,_pages); qDebug() << debugMsg << _pageIndex; return doPrepareSearch(op); } bool Item::processSearchResult(const QByteArray &response) { QString debugMsg = QString(metaObject()->className()) + "::processSearchResult() ->"; if (response.size()) debugMsg += QString("\n") + response.constData(); else debugMsg += " empty"; qDebug() << debugMsg; if (doProcessSearchResult(response,_pages)) { _consecutiveSearchesFailed = 0; return true; } else { ++_consecutiveSearchesFailed; if (_consecutiveSearchesFailed > 20) resetPages(); return false; } } QSize Item::processSizeRequestResult(const QByteArray &response) { QString debugMsg = QString(metaObject()->className()) + "::processSizeRequestResult() ->"; if (response.size()) debugMsg += QString("\n") + response.constData(); else debugMsg += " empty"; qDebug() << debugMsg; return doProcessSizeRequestResult(response); } void Item::processDownloadResult(const QFileInfo &fileInfo, bool belowThreshold) { qDebug() << metaObject()->className() << "::processDownloadResult(" << fileInfo.absoluteFilePath().toAscii().constData() << ")"; if (_savePhotos && !_photosPath.isEmpty()) { if (!belowThreshold) { QFile::copy(fileInfo.absoluteFilePath(),QFileInfo(_photosPath, fileInfo.fileName()).absoluteFilePath()); qDebug() << "\tfile copied in" << _photosPath.toAscii().constData() << "\n\tfree disk space:" << (DiskInfo::freeSpace(fileInfo.absoluteFilePath()) / 1024) << "kbytes"; } else qDebug() << "\tcannot copy file, free disk space:" << (DiskInfo::freeSpace(fileInfo.absoluteFilePath()) / 1024) << "kbytes"; } doProcessDownloadResult(fileInfo); } PhotoInfo Item::processInfoCollectResult(const QByteArray &response) { QString debugMsg = QString(metaObject()->className()) + "::processInfoCollectResult() ->"; if (response.size()) debugMsg += QString("\n") + response.constData(); else debugMsg += " empty"; qDebug() << debugMsg; return doProcessInfoCollectResult(response); } Core::Core(const QString &tempStorageDir, QObject *parent) : XtEngine::Core(tempStorageDir,parent), httpProxy(QNetworkProxy::NoProxy) { canceling = cancelSignaled = false; initHttp = new Network::Manager(this); searchHttp = new Network::Manager(this); sizeRequestHttp = new Network::Manager(this); downloadHttp = new Network::Manager(this); infoCollectHttp = new Network::Manager(this); } void Core::setProxy(const QNetworkProxy &proxy) { qDebug() << name().toAscii().constData() << "::Core::setProxy(...)"; httpProxy = proxy; } QNetworkProxy Core::guessProxy(const QUrl &url) { QList proxies = QNetworkProxyFactory::systemProxyForQuery(QNetworkProxyQuery(url)); if (proxies.size()) { QNetworkProxy localProxy = proxies.at(0); localProxy.setUser(httpProxy.user()); localProxy.setPassword(httpProxy.password()); qDebug() << name().toAscii().constData() << "::guessProxy()\n" << "\tusing proxy " << localProxy.user().toAscii().constData() << "@" << localProxy.hostName().toAscii().constData() << ":" << QString::number(localProxy.port()).toAscii().constData() << "\n" << "\tfor " << url.toString().toAscii().constData(); return localProxy; } else return QNetworkProxy(QNetworkProxy::NoProxy); } void Core::init() { qDebug() << name().toAscii().constData() << "::Core::init()"; canceling = cancelSignaled = false; if (list.size()) { Operation op = Get; currentItemIndex = (currentItemIndex + 1) % list.size(); QUrl url(qobject_cast (list.at(currentItemIndex))->prepareInit(op)); qDebug() << "\tURL: " << (!(url.isEmpty())? url.toString().toAscii().constData() : "empty"); if (url.isEmpty()) emit initCompleted(); else { if (!httpProxy.hostName().compare("0.0.0.0")) initHttp->setProxy(guessProxy(url)); else initHttp->setProxy(httpProxy); switch (op) { case Get: currentReply = initHttp->get(url); break; case Post: currentReply = initHttp->post(url); break; default: emit initCompleted(); return; } connect(currentReply.data(),SIGNAL(finished(bool,const QByteArray &)),this,SLOT(httpInitDone(bool,const QByteArray &))); } } else emit initCompleted(); } void Core::search(bool randomMode) { qDebug() << name().toAscii().constData() << "::Core::search(" << randomMode << ")"; if (list.size()) { Operation op = Get; QUrl url(qobject_cast (list.at(currentItemIndex))->prepareSearch(randomMode,op)); qDebug() << "\tURL:" << (!(url.isEmpty())? url.toString().toAscii().constData() : "empty"); if (url.isEmpty()) emit searchCompleted(false); else if (url.isRelative()) emit searchCompleted(true); else { if (!httpProxy.hostName().compare("0.0.0.0")) searchHttp->setProxy(guessProxy(url)); else searchHttp->setProxy(httpProxy); switch (op) { case Get: currentReply = searchHttp->get(url); break; case Post: currentReply = searchHttp->post(url); break; default: emit searchCompleted(false); return; } connect(currentReply.data(),SIGNAL(finished(bool,const QByteArray &)),this,SLOT(httpSearchDone(bool,const QByteArray &))); } } else emit searchCompleted(false); } void Core::sizeLookup() { Operation op = Get; Item *item = qobject_cast (list.at(currentItemIndex)); QUrl url(item->prepareSizeRequest(op)); qDebug() << name().toAscii().constData() << "::Core::sizeLookup()"; qDebug() << "\tURL: " << (!(url.isEmpty())? url.toString().toAscii().constData() : "empty"); if (url.isEmpty()) emit sizeLookupCompleted(QSize(-1,-1)); else if (!url.isRelative()) { if (!httpProxy.hostName().compare("0.0.0.0")) sizeRequestHttp->setProxy(guessProxy(url)); else sizeRequestHttp->setProxy(httpProxy); switch (op) { case Get: currentReply = sizeRequestHttp->get(url); break; case Post: currentReply = sizeRequestHttp->post(url); break; default: emit sizeLookupCompleted(QSize(-1,-1)); return; } connect(currentReply.data(),SIGNAL(finished(bool,const QByteArray &)),this,SLOT(httpSizeRequestDone(bool,const QByteArray &))); } else emit sizeLookupCompleted(item->processSizeRequestResult(QByteArray())); } void Core::download() { Operation op = Get; QUrl url(qobject_cast (list.at(currentItemIndex))->prepareDownload(op)); httpFile = tempStorageDir() + "/" + QFileInfo(url.path()).fileName(); qDebug() << name().toAscii().constData() << "::Core::download()"; qDebug() << "\tURL: " << (!(url.isEmpty())? url.toString().toAscii().constData() : "empty"); if (url.isEmpty()) emit downloadCompleted(false,QFileInfo()); else { if (!httpProxy.hostName().compare("0.0.0.0")) downloadHttp->setProxy(guessProxy(url)); else downloadHttp->setProxy(httpProxy); currentReply = downloadHttp->get(url,httpFile.absoluteFilePath()); connect(currentReply.data(),SIGNAL(finished(bool,const QByteArray &)),this,SLOT(httpDownloadDone(bool,const QByteArray &))); } } void Core::infoCollect() { Operation op = Get; Item *item = qobject_cast (list.at(currentItemIndex)); QUrl url(item->prepareInfoCollect(op)); qDebug() << name().toAscii().constData() << "::Core::infoCollect()"; qDebug() << "\tURL: " << (!(url.isEmpty())? url.toString().toAscii().constData() : "empty"); if (url.isEmpty()) emit infoCollectCompleted(PhotoInfo()); else if (!url.isRelative()) { if (!httpProxy.hostName().compare("0.0.0.0")) infoCollectHttp->setProxy(guessProxy(url)); else infoCollectHttp->setProxy(httpProxy); switch (op) { case Get: currentReply = infoCollectHttp->get(url); break; case Post: currentReply = infoCollectHttp->post(url); break; default: emit infoCollectCompleted(PhotoInfo()); return; } connect(currentReply.data(),SIGNAL(finished(bool,const QByteArray &)),this,SLOT(httpInfoCollectDone(bool,const QByteArray &))); } else emit infoCollectCompleted(item->processInfoCollectResult(QByteArray())); } void Core::cancel() { qDebug() << name().toAscii().constData() << "::Core::cancel()"; canceling = true; cancelSignaled = false; if (!currentReply.isNull()) currentReply->abort(); } void Core::httpInitDone(bool ok, const QByteArray &data) { qDebug() << name().toAscii().constData() << "::Core::httpInitDone(" << ok << ")"; if (ok && !data.isEmpty()) { Item *item = qobject_cast (list.at(currentItemIndex)); item->processInitResult(data); } if (canceling) { if (!cancelSignaled) { cancelSignaled = true; emit cancelCompleted(); } } else emit initCompleted(); sender()->deleteLater(); } void Core::httpSearchDone(bool ok, const QByteArray &data) { qDebug() << name().toAscii().constData() << "::Core::httpSearchDone(" << ok << ")"; if (canceling) { if (!cancelSignaled) { cancelSignaled = true; emit cancelCompleted(); } } else if (ok) { if (!data.isEmpty()) { Item *item = qobject_cast (list.at(currentItemIndex)); emit searchCompleted(item->processSearchResult(data)); } else emit searchCompleted(false); } else emit searchCompleted(false); sender()->deleteLater(); } void Core::httpSizeRequestDone(bool ok, const QByteArray &data) { qDebug() << name().toAscii().constData() << "::Core::httpSizeRequestDone(" << ok << ")"; if (canceling) { if (!cancelSignaled) { cancelSignaled = true; emit cancelCompleted(); } } else if (ok) { if (!data.isEmpty()) { Item *item = qobject_cast (list.at(currentItemIndex)); emit sizeLookupCompleted(item->processSizeRequestResult(data)); } else emit sizeLookupCompleted(QSize(-1,-1)); } else emit sizeLookupCompleted(QSize(-1,-1)); sender()->deleteLater(); } void Core::httpDownloadDone(bool ok, const QByteArray & /* data */) { qDebug() << name().toAscii().constData() << "::Core::httpDownloadDone(" << ok << ")"; if (canceling) { if (!cancelSignaled) { cancelSignaled = true; emit cancelCompleted(); } } else if (ok) { Item *item = qobject_cast (list.at(currentItemIndex)); item->processDownloadResult(httpFile, DiskInfo::freeSpace(httpFile.absoluteFilePath()) <= (_diskSpaceThreshold + httpFile.size())); emit downloadCompleted(true,httpFile); } else emit downloadCompleted(false,QFileInfo()); sender()->deleteLater(); } void Core::httpInfoCollectDone(bool ok, const QByteArray &data) { qDebug() << name().toAscii().constData() << "::Core::httpInfoCollectDone(" << ok << ")"; if (canceling) { if (!cancelSignaled) { cancelSignaled = true; emit cancelCompleted(); } } else if (ok) { if (!data.isEmpty()) { Item *item = qobject_cast (list.at(currentItemIndex)); emit infoCollectCompleted(item->processInfoCollectResult(data)); } else emit infoCollectCompleted(PhotoInfo()); } else emit infoCollectCompleted(PhotoInfo()); sender()->deleteLater(); } SettingsWidget::SettingsWidget(Engine::Core *core, QWidget *parent) : XtEngine::SettingsWidget(core,parent), isRefreshing(false) { QCompleter *completer = new QCompleter(this); QDirModel *dirModel = new QDirModel(completer); setupUi(this); dirModel->setFilter(QDir::AllDirs | QDir::Drives | QDir::NoDotAndDotDot); completer->setModel(dirModel); lePhotosPath->setCompleter(completer); lvSets->setModel(core); lvSets->setItemDelegate(new XtEngine::ItemDelegate(this)); lvSets->setSelectionModel(core->selectionModel()); connect(core->selectionModel(),SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this,SLOT(updateWidgets(QItemSelection,QItemSelection))); } void SettingsWidget::on_tbAdd_clicked() { XtEngine::Item *item; if ((item = newDialog()->execute()) && item->isValidItem()) { *core() << item; emit settingsModified(); } } void SettingsWidget::on_tbDel_clicked() { core()->removeRows(lvSets->selectionModel()); emit settingsModified(); } void SettingsWidget::on_lvSets_doubleClicked(const QModelIndex &index) { QVariant var; XtEngine::Item *item; Engine::Item *newItem; if (index.isValid()) { item = qobject_cast (core()->data(index,Qt::UserRole).value()); if ((newItem = newDialog()->execute(item)) && qobject_cast (newItem)->isValidItem()) { Item *httpItem = qobject_cast (item); qobject_cast (newItem)->setPhotosPath(httpItem->photosPath()); qobject_cast (newItem)->setSavePhotos(httpItem->arePhotosSaved()); var.setValue(newItem); core()->setData(index,var,Qt::UserRole); emit settingsModified(); } } } void SettingsWidget::on_tbPhotosPath_clicked() { #ifdef Q_WS_X11 QString dirName = QFileDialog::getExistingDirectory(this,tr("Select a folder"),QDir::homePath(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | QFileDialog::DontUseNativeDialog); #else QString dirName = QFileDialog::getExistingDirectory(this,tr("Select a folder"), QDesktopServices::storageLocation(QDesktopServices::PicturesLocation), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | QFileDialog::DontUseNativeDialog); #endif if (!dirName.isEmpty()) { lePhotosPath->setText(QDir::toNativeSeparators(dirName)); emit settingsModified(); } } void SettingsWidget::updateWidgets(const QItemSelection & /* selected */, const QItemSelection & /* deselected */) { gbOptions->setEnabled(lvSets->selectionModel()->selectedRows().size()); if (lvSets->selectionModel()->selectedRows().size() == 1) { QModelIndex index = lvSets->selectionModel()->selectedRows().at(0); Item *item = qobject_cast (core()->data(index,Qt::UserRole).value()); isRefreshing = true; cbSavePhotos->setTristate(false); cbSavePhotos->setChecked(item->arePhotosSaved()); lePhotosPath->setText(QDir::toNativeSeparators(item->photosPath())); lePhotosPath->setEnabled(cbSavePhotos->isChecked()); tbPhotosPath->setEnabled(cbSavePhotos->isChecked()); isRefreshing = false; } else if (lvSets->selectionModel()->selectedRows().size() > 1) { int i; bool changed; QModelIndex firstIndex = lvSets->selectionModel()->selectedRows().at(0); Item *firstItem = qobject_cast (core()->data(firstIndex,Qt::UserRole).value()); for (i = 1, changed = false; (i < lvSets->selectionModel()->selectedRows().size()) && (!changed); ++i) { QModelIndex index = lvSets->selectionModel()->selectedRows().at(i); Item *item = qobject_cast (core()->data(index,Qt::UserRole).value()); changed = (item->arePhotosSaved() != firstItem->arePhotosSaved()) || (QFileInfo(item->photosPath()) != QFileInfo(firstItem->photosPath())); } isRefreshing = true; if (changed) { cbSavePhotos->setTristate(true); cbSavePhotos->setCheckState(Qt::PartiallyChecked); lePhotosPath->clear(); lePhotosPath->setEnabled(false); tbPhotosPath->setEnabled(false); } else { cbSavePhotos->setTristate(false); cbSavePhotos->setChecked(firstItem->arePhotosSaved()); lePhotosPath->setText(QDir::toNativeSeparators(firstItem->photosPath())); lePhotosPath->setEnabled(cbSavePhotos->isChecked()); tbPhotosPath->setEnabled(cbSavePhotos->isChecked()); } isRefreshing = false; } tbDel->setEnabled(lvSets->selectionModel()->selectedRows().size()); } void SettingsWidget::on_cbSavePhotos_stateChanged(int state) { Item *item; if (!isRefreshing) { QListIterator index(lvSets->selectionModel()->selectedRows()); while (index.hasNext()) { item = qobject_cast (core()->data(index.next(),Qt::UserRole).value()); item->setSavePhotos(state == Qt::Checked); } lePhotosPath->setEnabled(state == Qt::Checked); tbPhotosPath->setEnabled(state == Qt::Checked); emit settingsModified(); } } void SettingsWidget::on_lePhotosPath_textChanged(const QString &text) { Item *item; if (!isRefreshing) { QListIterator index(lvSets->selectionModel()->selectedRows()); while (index.hasNext()) { item = qobject_cast (core()->data(index.next(),Qt::UserRole).value()); item->setPhotosPath(text); } emit settingsModified(); } } wally-2.4.4/src/main.cpp0000644000000000000000000002355511676624760013617 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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. */ #ifdef WALLY_STATIC #include Q_IMPORT_PLUGIN(qgif) Q_IMPORT_PLUGIN(qico) Q_IMPORT_PLUGIN(qjpeg) Q_IMPORT_PLUGIN(qmng) Q_IMPORT_PLUGIN(qsvg) Q_IMPORT_PLUGIN(qtiff) Q_IMPORT_PLUGIN(qsqlite) #endif #include #include #include "splash.h" #include "files.h" #include "folders.h" #include "flickr.h" #include "yahoo.h" #include "panoramio.h" #include "pikeo.h" #include "ipernity.h" #include "photobucket.h" #include "buzznet.h" #include "picasa.h" #include "smugmug.h" #include "bing.h" #include "google.h" #include "vladstudio.h" #include "deviantart.h" #include "wally.h" #include "defs.h" int main(int argc, char **argv) { int err = 0; Wally::Application *wally = new Wally::Application(argc,argv); wally->loadLanguages(); if (!wally->isCommandLineHelp()) { if (!wally->isSingleInstance()) { QMessageBox::critical(0,QCoreApplication::translate("Main","Error"), QCoreApplication::translate("Main","Another instance of") + " " + APPLICATION_NAME + " " + QCoreApplication::translate("Main","is already running")); } else { bool upgraded = false; QMessageBox::StandardButton selectedButton = QMessageBox::Yes; if (wally->currentVersion() < Version(APPLICATION_VERSION)) { selectedButton = QMessageBox::warning(0,QCoreApplication::translate("Main","Disclaimer"), QCoreApplication::translate( "Main","The Author takes no responsibility over the content " \ "that Wally downloads from photo sharing web sites.
" \ "The Author is in no way responsible for any such content.


" \ "If this is a problem for you, please use only local engines like " \ "\"Files\" or local \"Folders\".
" \ "Otherwise, please select \"No\" to exit Wally, " \ "or use it at your own risk.

" \ "(If you proceed, this message will appear only once)

" \ "Do you accept the above condition?"), QMessageBox::Yes | QMessageBox::No,QMessageBox::No); upgraded = true; } if (selectedButton == QMessageBox::Yes) { wally->initialize(); QSettings sourceSettings; sourceSettings.beginGroup(MAIN_SECTION); bool splashScreenDisabled = sourceSettings.value(DISABLE_SPLASH_SCREEN,false).toBool(); SplashScreen *splash = 0; if (!splashScreenDisabled) { splash = new SplashScreen; splash->show(); } if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Files module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new Files::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Folders module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new Folders::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Flickr module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new Flickr::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Yahoo! module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new Yahoo::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Panoramio module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new Panoramio::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); // if (!splashScreenDisabled) // splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Pikeo module ..."), // Qt::AlignRight | Qt::AlignBottom,Qt::white); // wally->addEngine(new Pikeo::Core(wally->tempStorageDir())); // if (!splashScreenDisabled) // splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Ipernity module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new Ipernity::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Photobucket module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new Photobucket::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Buzznet module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new Buzznet::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Picasa module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new Picasa::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading SmugMug module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new SmugMug::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); // if (!splashScreenDisabled) // splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Bing module ..."), // Qt::AlignRight | Qt::AlignBottom,Qt::white); // wally->addEngine(new Bing::Core(wally->tempStorageDir())); // if (!splashScreenDisabled) // splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Google module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new Google::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading Vladstudio module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new Vladstudio::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading deviantART module ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->addEngine(new DeviantArt::Core(wally->tempStorageDir())); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Loading settings ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->loadSettings(); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) splash->showMessage(QCoreApplication::translate("SplashScreen","Launching Wally ..."), Qt::AlignRight | Qt::AlignBottom,Qt::white); wally->setupBeforeLaunch(); if (!splashScreenDisabled) splash->repaint(); if (!splashScreenDisabled) QTimer::singleShot(3000,splash,SLOT(deleteLater())); if (upgraded) QTimer::singleShot(6000,wally,SLOT(showTrayMessage())); err = wally->exec(); } } } delete wally; return err; } wally-2.4.4/src/deviantart.cpp0000644000000000000000000002031311676624760015021 0ustar rootroot/* TRANSLATOR DeviantArt::Item */ /* TRANSLATOR DeviantArt::Core */ /* TRANSLATOR DeviantArt::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "httpengine.h" #include "deviantart.h" using namespace DeviantArt; QVariant Item::data() const { QString str; if (_tag.size()) { str = QString("") + tr("Tag:") + " " + _tag + "" + "
  " + tr("Adult filter:") + " "; switch (_adultFilter) { case Off: str += tr("Off"); break; case Strict: default: str += tr("Strict"); break; } str += ""; } return str; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int pages) const { return (pages)? (currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1)) % pages : 0; } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { _photoUrl.clear(); _sourceUrl.clear(); photoTitle.clear(); photoDescription.clear(); photoOwner.clear(); photoSize = QSize(-1,-1); return QUrl(); } QUrl Item::doPrepareSearch(HttpEngine::Operation & /* op */) { if (_tag.size()) { QUrl url("http://backend.deviantart.com/rss.xml"); url.addQueryItem("q",_tag); url.addQueryItem("offset",QString::number(pageIndex())); return url; } else return QUrl(); } bool Item::doProcessSearchResult(const QByteArray &response, int &newPagesCount) { bool endItem = false, found = false, isAdultContent = false; QXmlStreamReader xmlResp(response); while (!xmlResp.atEnd() && !found) if (xmlResp.readNext() == QXmlStreamReader::StartElement) { if (!xmlResp.name().toString().compare("item",Qt::CaseInsensitive)) { endItem = false; while ((!xmlResp.atEnd()) && (!endItem)) switch (xmlResp.readNext()) { case QXmlStreamReader::StartElement: if (!xmlResp.name().toString().compare("title",Qt::CaseInsensitive)) { xmlResp.readNext(); photoTitle = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("link",Qt::CaseInsensitive)) { xmlResp.readNext(); _sourceUrl = xmlResp.text().toString(); } else if (!xmlResp.prefix().toString().compare("media",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("description",Qt::CaseInsensitive)) { xmlResp.readNext(); photoDescription = xmlResp.text().toString(); } else if (!xmlResp.prefix().toString().compare("media",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("content",Qt::CaseInsensitive) && !xmlResp.attributes().value("medium").toString().compare("image",Qt::CaseInsensitive)) { _photoUrl = xmlResp.attributes().value("url").toString(); photoSize.setWidth(xmlResp.attributes().value("width").toString().toInt()); photoSize.setHeight(xmlResp.attributes().value("height").toString().toInt()); } else if (!xmlResp.prefix().toString().compare("media",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("rating",Qt::CaseInsensitive)) { xmlResp.readNext(); isAdultContent = !xmlResp.text().toString().compare("adult",Qt::CaseInsensitive); } break; case QXmlStreamReader::EndElement: endItem = !xmlResp.name().toString().compare("item",Qt::CaseInsensitive); found = true; break; default: break; } } } newPagesCount = (!found)? 1 : newPagesCount + 1; return (found && _photoUrl.isValid() && !_lastPhotoUrls.contains(_photoUrl) && (!isAdultContent || (_adultFilter == Off))); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { return QUrl("/"); } QSize Item::doProcessSizeRequestResult(const QByteArray & /* response */) { return photoSize; } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { return _photoUrl; } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { _lastPhotoUrls.insert(_photoUrl); return QUrl("/"); } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray & /* response */) { PhotoInfo info; info.title = photoTitle; info.description = photoDescription; info.owner = photoOwner; info.sourceUrl = _sourceUrl; info.searchString = _tag; return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); _tag = settings.value(TAG,QString()).toString(); setAdultFilter(static_cast (settings.value(ADULT_FILTER,Strict).toInt())); data = qUncompress(settings.value(LAST_PHOTO_URLS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoUrls; buf.close(); } void Item::doSaveSettings(QSettings &settings) const { settings.setValue(TAG,_tag); settings.setValue(ADULT_FILTER,static_cast (_adultFilter)); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoUrls; buf.close(); settings.setValue(LAST_PHOTO_URLS,qCompress(data)); } bool Item::equalTo(Engine::Item *item) const { Item *deviantArtItem = qobject_cast (item); return deviantArtItem && (tag() == deviantArtItem->tag()) && (adultFilter() == deviantArtItem->adultFilter()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QVBoxLayout *mainLayout = new QVBoxLayout; QHBoxLayout *topLayout = new QHBoxLayout; QHBoxLayout *bottomLayout = new QHBoxLayout; leSearchFor = new QLineEdit(this); leSearchFor->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); topLayout->addWidget(new QLabel(tr("Search for:"),this)); topLayout->addWidget(leSearchFor); cbAdultFilter = new QComboBox(this); cbAdultFilter->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbAdultFilter->addItem(tr("Strict"),Strict); cbAdultFilter->addItem(tr("Off"),Off); cbAdultFilter->setCurrentIndex(0); bottomLayout->addWidget(new QLabel(tr("Adult filter:"),this)); bottomLayout->addWidget(cbAdultFilter); bottomLayout->addStretch(); mainLayout->addLayout(topLayout); mainLayout->addLayout(bottomLayout); setLayout(mainLayout); leSearchFor->setFocus(); } XtEngine::Item *DialogWidget::returnItem() { Item *item = qobject_cast (core()->newItem()); item->setTag(leSearchFor->text()); item->setAdultFilter(static_cast (cbAdultFilter->itemData(cbAdultFilter->currentIndex()).toInt())); if (item->adultFilter() == Off) QMessageBox::warning(this,tr("deviantART item"), tr("Unfiltered content can show offending or sexual explicit photos")); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *deviantArtItem = qobject_cast (item); setWindowTitle(tr("Edit deviantART item")); leSearchFor->setText(deviantArtItem->tag()); cbAdultFilter->setCurrentIndex(cbAdultFilter->findData(deviantArtItem->adultFilter())); } else setWindowTitle(tr("Add deviantART item")); } wally-2.4.4/src/folders.cpp0000644000000000000000000004652711676624760014335 0ustar rootroot/* TRANSLATOR Folders::Item */ /* TRANSLATOR Folders::LocalItem */ /* TRANSLATOR Folders::RemoteItem */ /* TRANSLATOR Folders::Core */ /* TRANSLATOR Folders::DialogWidget */ /* TRANSLATOR Folders::SettingsWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "exif.h" #include "utils.h" #include "engine.h" #include "xtengine.h" #include "folders.h" using namespace Folders; Item::Item(const QString &tempStorageDir) : XtEngine::Item() { selectedIndex = -1; _tempStorageDir = tempStorageDir; connect(this,SIGNAL(fileListBuilt()),this,SLOT(fileListAvailable())); } void Item::buildRandomIndexesList() { int i; toBeViewed.clear(); for (i = 0; i < size(); toBeViewed << i++) ; for (i = 0; i < 2*size(); i++, toBeViewed.swap(qrand() % size(),qrand() % size())) ; } void Item::loadState(QSettings &settings, const QString & /* group */) { selectedIndex = settings.value(LAST_INDEX,-1).toInt(); } void Item::saveState(QSettings &settings, const QString &engineName, int id) const { settings.beginGroup(QString("%1%2").arg(engineName).arg(id)); settings.setValue(LAST_INDEX,selectedIndex); settings.endGroup(); } void Item::extractFileName(bool randomMode) { qDebug() << metaObject()->className() << "::extractFileName(" << randomMode << ")"; _randomMode = randomMode; if (!size()) buildFileList(); else emit fileListBuilt(); } void Item::fileListAvailable() { qDebug() << metaObject()->className() << "::fileListAvailable()"; if (size()) { if (_randomMode) { if (!toBeViewed.size()) buildRandomIndexesList(); selectedIndex = toBeViewed.takeFirst(); } else selectedIndex = (selectedIndex + 1) % size(); doExtractFileName(); } else emit searchCompleted(QFileInfo()); } LocalItem::LocalItem(const QString &tempStorageDir) : Item(tempStorageDir) { } LocalItem::LocalItem(LocalItem *item) : Item(item->tempStorageDir()), QDir(*item) { _recursion = item->isRecursion(); } void LocalItem::buildFileList() { QFileInfo fileInfo; QDirIterator scan(absolutePath(), ((isRecursion())? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags) | QDirIterator::FollowSymlinks); qDebug() << metaObject()->className() << "::buildFileList()"; fileList.clear(); while (scan.hasNext()) if ((fileInfo = scan.next()).isReadable() && fileInfo.isFile()) { fileList << fileInfo.absoluteFilePath(); qDebug() << "\tfound (file):" << fileInfo.absoluteFilePath().toAscii().constData(); } qSort(fileList.begin(),fileList.end(),fileNameLessThan); emit fileListBuilt(); } QVariant LocalItem::data() const { QString str = QString("") + QDir::toNativeSeparators(absolutePath()) + ""; if (isRecursion()) str += "
  " + tr("(with subfolders)") + ""; return str; } void LocalItem::doExtractFileName() { emit searchCompleted(fileList.at(selectedIndex)); } void LocalItem::saveSettings(QSettings &settings, const QString &engineName, int id) const { settings.beginGroup(QString("%1%2").arg(engineName).arg(id)); settings.setValue(FOLDER,QDir::toNativeSeparators(absolutePath())); settings.setValue(SUBFOLDERS,isRecursion()); settings.setValue(REMOTE,false); settings.endGroup(); } bool LocalItem::fileNameLessThan(const QFileInfo &f1, const QFileInfo &f2) { return (f1.absoluteFilePath().compare(f2.absoluteFilePath()) < 0); } RemoteItem::RemoteItem(const QString &tempStorageDir) : Item(tempStorageDir) { isDownloading = isListing = false; _passiveTransfer = true; ftpClient = new QFtp(this); connect(ftpClient,SIGNAL(done(bool)),this,SLOT(ftpDone(bool))); connect(ftpClient,SIGNAL(listInfo(const QUrlInfo &)), this,SLOT(ftpListInfo(const QUrlInfo &))); } RemoteItem::RemoteItem(RemoteItem *item) : Item(item->tempStorageDir()), QUrl(*item) { isDownloading = isListing = false; _passiveTransfer = item->_passiveTransfer; ftpClient = new QFtp(this); connect(ftpClient,SIGNAL(done(bool)),this,SLOT(ftpDone(bool))); connect(ftpClient,SIGNAL(listInfo(const QUrlInfo &)), this,SLOT(ftpListInfo(const QUrlInfo &))); } void RemoteItem::buildFileList() { if (isValidItem()) { qDebug() << metaObject()->className() << "::buildFileList()"; isListing = true; fileList.clear(); ftpClient->connectToHost(host()); ftpClient->login(userName(),password()); ftpClient->list(path()); ftpClient->close(); } } void RemoteItem::ftpDone(bool error) { if (!ftpClient->hasPendingCommands()) { if (isDownloading) { isDownloading = false; ftpFile.close(); if (error) emit searchCompleted(QFileInfo()); else emit searchCompleted(ftpFile.fileName()); } else if (isListing) { qDebug() << "\tlisting completed"; isListing = false; emit fileListBuilt(); } } } void RemoteItem::ftpListInfo(const QUrlInfo &listInfo) { if (listInfo.isFile()) { qDebug() << "\tfound (file): " << listInfo.name().toAscii().constData(); fileList << listInfo; } } QVariant RemoteItem::data() const { QUrl url = *this; url.setPassword("****"); return QString("") + url.toString() + "
" + QString("") + tr("Transfer mode:") + " " + ((_passiveTransfer)? tr("passive") : tr("active")) + ""; } void RemoteItem::doExtractFileName() { QString fileName = fileList.at(selectedIndex).name(); isDownloading = true; ftpFile.setFileName(tempStorageDir() + "/" + fileName); ftpFile.open(QIODevice::WriteOnly); ftpClient->connectToHost(host()); ftpClient->login(userName(),password()); ftpClient->cd(path()); ftpClient->get(fileName,&ftpFile); ftpClient->close(); } void RemoteItem::saveSettings(QSettings &settings, const QString &engineName, int id) const { QUrl url = *this; settings.beginGroup(QString("%1%2").arg(engineName).arg(id)); url.setPassword(QString(url.password().toAscii().toBase64())); settings.setValue(FOLDER,url.toString()); settings.setValue(PASSIVE_TRANSFER,isTransferPassive()); settings.setValue(REMOTE,true); settings.endGroup(); } void Core::init() { currentFileName.clear(); emit initCompleted(); } void Core::search(bool randomMode) { qDebug() << name().toAscii().constData() << "::Core::search(" << randomMode << ")"; if (!list.size()) emit searchCompleted(false); else { currentItemIndex = (currentItemIndex + 1) % list.size(); Item *item = qobject_cast (list.at(currentItemIndex)); item->extractFileName(randomMode); } } void Core::fileSearchCompleted(const QFileInfo &fileName) { qDebug() << name().toAscii().constData() << "::fileSearchCompleted(" << fileName.absoluteFilePath().toAscii().constData() << ")"; if (fileName.isFile()) { currentFileName = fileName.absoluteFilePath(); emit searchCompleted(QImageReader(currentFileName).canRead()); } else emit searchCompleted(false); } void Core::sizeLookup() { QSize size = QImageReader(currentFileName).size(); qDebug() << name().toAscii().constData() << "::Core::sizeLookup()"; emit sizeLookupCompleted(size); } void Core::download() { qDebug() << name().toAscii().constData() << "::Core::download()"; emit downloadCompleted(true,currentFileName); } void Core::infoCollect() { PhotoInfo photoInfo; Exif::Tags tags(currentFileName); Item *item = qobject_cast (list.at(currentItemIndex)); qDebug() << name().toAscii().constData() << "::Core::infoCollect()"; photoInfo.owner = tags.owner(); photoInfo.title = tags.title(); photoInfo.description = tags.description(); if (item->isRemote()) photoInfo.sourceUrl = *dynamic_cast (list.at(currentItemIndex)); else photoInfo.sourceUrl = QUrl::fromLocalFile(dynamic_cast (list.at(currentItemIndex))->absolutePath()); emit infoCollectCompleted(photoInfo); } void Core::cancel() { qDebug() << name().toAscii().constData() << "::Core::cancel()"; emit cancelCompleted(); } void Core::loadSettings(QSettings &settings) { Item *item; QStringListIterator group(settings.childGroups()); qDebug() << name().toAscii().constData() << "::Core::loadSettings(...)"; setActive(settings.value(ENGINE_ACTIVE,true).toBool()); while (group.hasNext()) { settings.beginGroup(group.peekNext()); item = qobject_cast (newItem(settings.value(REMOTE,false))); if (settings.value(REMOTE,false).toBool()) { QUrl url = settings.value(FOLDER,QString()).toString(); url.setPassword(QString(QByteArray::fromBase64(url.password().toAscii()))); qobject_cast (item)->setUrl(url.toString()); qobject_cast (item)->setPassiveTransfer(settings.value(PASSIVE_TRANSFER,true).toBool()); } else { qobject_cast (item)->setPath(settings.value(FOLDER,QString()).toString()); qobject_cast (item)->setRecursion(settings.value(SUBFOLDERS,false).toBool()); } if (item->isRemote() || qobject_cast (item)->isReadable()) { item->loadState(settings,group.peekNext()); list << item; } else delete item; settings.endGroup(); group.next(); } submit(); } Engine::Item *Core::newItem(const QVariant &data) { Item *newItem; if (data.toBool()) newItem = new RemoteItem(tempStorageDir()); else newItem = new LocalItem(tempStorageDir()); connect(newItem,SIGNAL(searchCompleted(const QFileInfo &)), this,SLOT(fileSearchCompleted(const QFileInfo &))); return newItem; } Engine::Item *Core::newItem(Engine::Item *item) { Item *newItem; if (qobject_cast (item)->isRemote()) newItem = new RemoteItem(qobject_cast (item)); else newItem = new LocalItem(qobject_cast (item)); connect(newItem,SIGNAL(searchCompleted(const QFileInfo &)), this,SLOT(fileSearchCompleted(const QFileInfo &))); return newItem; } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QCompleter *completer = new QCompleter(this); QVBoxLayout *mainLayout = new QVBoxLayout; QHBoxLayout *radioLayout = new QHBoxLayout; QDirModel *dirModel = new QDirModel(completer); dirModel->setFilter(QDir::AllDirs | QDir::Drives | QDir::NoDotAndDotDot); rbLocal = new QRadioButton(tr("Local"),this); rbRemote = new QRadioButton(tr("Remote"),this); radioLayout->addWidget(rbLocal); radioLayout->addWidget(rbRemote); QHBoxLayout *topLocalLayout = new QHBoxLayout; QVBoxLayout *mainLocalLayout = new QVBoxLayout; QGroupBox *localGroupBox = new QGroupBox(this); localGroupBox->setTitle(tr("Local")); localGroupBox->setEnabled(false); leLocalPath = new QLineEdit(this); completer->setModel(dirModel); leLocalPath->setCompleter(completer); leLocalPath->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Maximum); cbIncludeSubfolders = new QCheckBox(this); cbIncludeSubfolders->setText(tr("Include subfolders")); QToolButton *tbFolderDialog = new QToolButton(this); tbFolderDialog->setIcon(QIcon(":/images/folder")); connect(tbFolderDialog,SIGNAL(clicked()),this,SLOT(chooseFolder())); topLocalLayout->addWidget(new QLabel(tr("Folder:"),this)); topLocalLayout->addWidget(leLocalPath); topLocalLayout->addWidget(tbFolderDialog); mainLocalLayout->addLayout(topLocalLayout); mainLocalLayout->addWidget(cbIncludeSubfolders); localGroupBox->setLayout(mainLocalLayout); QGroupBox *remoteGroupBox = new QGroupBox(this); remoteGroupBox->setTitle(tr("Remote")); remoteGroupBox->setEnabled(false); leServer = new QLineEdit(this); leServer->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Maximum); sbPort = new QSpinBox(this); sbPort->setMinimum(1); sbPort->setMaximum(65535); sbPort->setValue(21); cbTransfer = new QComboBox(this); cbTransfer->addItem(tr("Passive"),QFtp::Passive); cbTransfer->addItem(tr("Active"),QFtp::Active); cbTransfer->setSizeAdjustPolicy(QComboBox::AdjustToContents); cbTransfer->setCurrentIndex(0); leUserName = new QLineEdit(this); leUserName->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Maximum); lePassword = new QLineEdit(this); lePassword->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Maximum); lePassword->setEchoMode(QLineEdit::Password); leRemotePath = new QLineEdit(this); leRemotePath->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Maximum); QGridLayout *mainRemoteLayout = new QGridLayout; mainRemoteLayout->addWidget(new QLabel(tr("Server:"),this),0,0); mainRemoteLayout->addWidget(leServer,0,1); mainRemoteLayout->addWidget(new QLabel(tr("Port:"),this),0,2); mainRemoteLayout->addWidget(sbPort,0,3); mainRemoteLayout->addWidget(new QLabel(tr("Transfer mode:"),this),0,4); mainRemoteLayout->addWidget(cbTransfer,0,5); mainRemoteLayout->addWidget(new QLabel(tr("Username:"),this),1,0); mainRemoteLayout->addWidget(leUserName,1,1); mainRemoteLayout->addWidget(new QLabel(tr("Password:"),this),1,3); mainRemoteLayout->addWidget(lePassword,1,4,1,2); mainRemoteLayout->addWidget(new QLabel(tr("Path:"),this),2,0); mainRemoteLayout->addWidget(leRemotePath,2,1,1,5); remoteGroupBox->setLayout(mainRemoteLayout); mainLayout->addLayout(radioLayout); mainLayout->addWidget(localGroupBox); mainLayout->addWidget(remoteGroupBox); connect(rbLocal,SIGNAL(toggled(bool)),localGroupBox,SLOT(setEnabled(bool))); connect(rbLocal,SIGNAL(clicked()),leLocalPath,SLOT(setFocus())); connect(rbRemote,SIGNAL(toggled(bool)),remoteGroupBox,SLOT(setEnabled(bool))); connect(rbRemote,SIGNAL(clicked()),leServer,SLOT(setFocus())); setLayout(mainLayout); rbLocal->setChecked(true); leLocalPath->setFocus(); } void DialogWidget::chooseFolder() { #ifdef Q_WS_X11 QString dirName = QFileDialog::getExistingDirectory(this,tr("Select a folder"),QDir::homePath(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | QFileDialog::DontUseNativeDialog); #else QString dirName = QFileDialog::getExistingDirectory(this,tr("Select a folder"), QDesktopServices::storageLocation(QDesktopServices::PicturesLocation), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | QFileDialog::DontUseNativeDialog); #endif if (!dirName.isEmpty()) leLocalPath->setText(QDir::toNativeSeparators(dirName)); } XtEngine::Item *DialogWidget::returnItem() { XtEngine::Item *item = qobject_cast (core()->newItem(!rbLocal->isChecked())); if (rbLocal->isChecked()) { LocalItem *localItem = qobject_cast (item); localItem->setPath(leLocalPath->text()); localItem->setRecursion(cbIncludeSubfolders->isChecked()); } else { RemoteItem *remoteItem = qobject_cast (item); if (!leServer->text().isEmpty()) { remoteItem->setScheme("ftp"); remoteItem->setHost(leServer->text()); remoteItem->setPort(sbPort->value()); remoteItem->setUserName(leUserName->text()); remoteItem->setPassword(lePassword->text()); remoteItem->setPath(leRemotePath->text()); remoteItem->setPassiveTransfer(static_cast (cbTransfer->itemData(cbTransfer->currentIndex()).toInt()) == QFtp::Passive); } } return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *folderItem = qobject_cast (item); setWindowTitle(tr("Edit folder")); rbLocal->setChecked(!folderItem->isRemote()); rbRemote->setChecked(folderItem->isRemote()); if (folderItem->isRemote()) { RemoteItem *remoteItem = qobject_cast (item); leServer->setText(remoteItem->host()); sbPort->setValue(remoteItem->port()); cbTransfer->setCurrentIndex(cbTransfer->findData((remoteItem->isTransferPassive())? QFtp::Passive : QFtp::Active)); leUserName->setText(remoteItem->userName()); lePassword->setText(remoteItem->password()); leRemotePath->setText(remoteItem->path()); } else { LocalItem *localItem = qobject_cast (item); leLocalPath->setText(QDir::toNativeSeparators(localItem->absolutePath())); cbIncludeSubfolders->setChecked(localItem->isRecursion()); } } else setWindowTitle(tr("Add folder")); } SettingsWidget::SettingsWidget(Engine::Core *core, QWidget *parent) : XtEngine::SettingsWidget(core,parent), isRefreshing(false) { setupUi(this); lvFolders->setModel(core); lvFolders->setItemDelegate(new XtEngine::ItemDelegate(this)); lvFolders->setSelectionModel(core->selectionModel()); connect(core->selectionModel(),SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this,SLOT(updateWidgets(QItemSelection,QItemSelection))); } void SettingsWidget::on_tbAdd_clicked(bool) { XtEngine::Item *item; if ((item = newDialog()->execute()) && item->isValidItem()) { *qobject_cast (core()) << item; emit settingsModified(); } } void SettingsWidget::on_tbDel_clicked(bool) { core()->removeRows(lvFolders->selectionModel()); emit settingsModified(); } void SettingsWidget::on_lvFolders_doubleClicked(const QModelIndex &index) { XtEngine::Item *item; Engine::Item *newItem; QVariant var; if (index.isValid()) { item = qobject_cast (core()->data(index,Qt::UserRole).value()); if ((newItem = newDialog()->execute(item)) && qobject_cast (newItem)->isValidItem()) { var.setValue(newItem); core()->setData(index,var,Qt::UserRole); emit settingsModified(); } } } void SettingsWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasUrls()) event->acceptProposedAction(); } void SettingsWidget::dropEvent(QDropEvent *event) { QList urls = event->mimeData()->urls(); QListIterator url(urls); LocalItem *item; while (url.hasNext()) { item = qobject_cast (core()->newItem(QVariant(false))); item->setPath(url.next().toLocalFile()); *qobject_cast (core()) << item; } if (urls.size()) emit settingsModified(); } void SettingsWidget::updateWidgets(const QItemSelection & /* selected */, const QItemSelection & /* deselected */) { tbDel->setEnabled(lvFolders->selectionModel()->selectedRows().size()); } wally-2.4.4/src/diskinfo.cpp0000644000000000000000000000344411676624760014474 0ustar rootroot/* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #ifdef Q_WS_WIN #include #include #else #include #endif #include "diskinfo.h" qint64 DiskInfo::freeSpace(const QString &fileName) { qint64 result; #ifdef Q_WS_WIN ULARGE_INTEGER winResult, temp1, temp2; #ifdef UNICODE WCHAR path[1024]; memset(path,0,1024 * sizeof(WCHAR)); QDir::toNativeSeparators(QFileInfo(fileName).absolutePath()).toWCharArray(path); if (!GetDiskFreeSpaceExW(path,&winResult,&temp1,&temp2)) return -1; #else if (!GetDiskFreeSpaceExA(QDir::toNativeSeparators(QFileInfo(fileName).absolutePath()).toAscii().constData(),&winResult,&temp1,&temp2)) return -1; #endif result = winResult.QuadPart; #else struct statvfs diskData; if (statvfs(QFileInfo(fileName).absoluteDir().rootPath().toAscii().constData(),&diskData) == -1) return -1; result = static_cast (diskData.f_bsize) * static_cast (diskData.f_bavail); #endif return result; } wally-2.4.4/src/history.cpp0000644000000000000000000005725211676624760014375 0ustar rootroot/* TRANSLATOR History::EngineQueryModel */ /* TRANSLATOR History::TagsQueryModel */ /* TRANSLATOR History::PhotosQueryModel */ /* TRANSLATOR History::Dialog */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "networkmanager.h" #include "defs.h" #include "exif.h" #include "engine.h" #include "viewer.h" #include "history.h" using namespace History; bool SortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { if (!sourceModel()->data(left,Qt::UserRole).toString().compare("All",Qt::CaseInsensitive)) return true; else if (!sourceModel()->data(right,Qt::UserRole).toString().compare("All",Qt::CaseInsensitive)) return false; else return (sourceModel()->data(left,Qt::UserRole).toString() < sourceModel()->data(right,Qt::UserRole).toString()); } EngineQueryModel::EngineQueryModel(const QSqlDatabase &db, QObject *parent) : QSqlQueryModel(parent) { setQuery(QString("select 'All' as engine, count(*) as photos from photoHistory") + " union select engine, count(*) as photos from photoHistory group by engine",db); } QVariant EngineQueryModel::data(const QModelIndex &item, int role) const { QString value; if (!item.column()) switch (role) { case Qt::DisplayRole: if (!record(item.row()).value("engine").toString().compare("All",Qt::CaseInsensitive)) value = tr("All"); else value = record(item.row()).value("engine").toString(); value += QString(" (") + record(item.row()).value("photos").toString() + ")"; return value; case Qt::UserRole: return record(item.row()).value("engine").toString(); } return QSqlQueryModel::data(item,role); } TagsQueryModel::TagsQueryModel(const QSqlDatabase &db, QObject *parent) : QSqlQueryModel(parent), _db(db) { selectEngine("All"); } QVariant TagsQueryModel::data(const QModelIndex &item, int role) const { QString value; if (!item.column()) switch (role) { case Qt::DisplayRole: if (!record(item.row()).value("tags").toString().compare("All",Qt::CaseInsensitive)) value = tr("All"); else value = record(item.row()).value("tags").toString(); value += QString(" (") + record(item.row()).value("tagsCount").toString() + ")"; return value; case Qt::UserRole: return record(item.row()).value("tags").toString(); } return QSqlQueryModel::data(item,role); } void TagsQueryModel::selectEngine(const QString &engineName) { if (!engineName.compare("All",Qt::CaseInsensitive)) setQuery(QString("select 'All' as tags, count(*) as tagsCount from photoHistory") + " union select tags, count(*) as tagsCount from photoHistory group by tags",_db); else setQuery(QString("select 'All' as tags, count(*) as tagsCount from photoHistory where engine = '") + engineName + "' " + " union select tags, count(*) as tagsCount from photoHistory where engine = '" + engineName + "' group by tags",_db); } PhotosQueryModel::PhotosQueryModel(const QSqlDatabase &db, QObject *parent) : QSqlQueryModel(parent), _db(db) { connect(&sizeHintTimer,SIGNAL(timeout()),this,SLOT(calculateSizeHints())); } QVariant PhotosQueryModel::data(const QModelIndex &item, int role) const { QVariant var; QWidget *widget; QSize sizeHint; if (item.isValid()) switch (role) { case Qt::DisplayRole: return formatCaption(record(item.row())); case Qt::ToolTipRole: if (!record(item.row()).value("description").toString().isEmpty()) return QString("") + record(item.row()).value("description").toString() + ""; else return QVariant(); case Qt::SizeHintRole: if (sizeHints.contains(record(item.row()).value("timestamp").toInt())) return sizeHints.value(record(item.row()).value("timestamp").toInt()); else return QSize(100,100); case Qt::UserRole: return record(item.row()).value("timestamp").toInt(); case Qt::UserRole+1: if (sizeHints.contains(record(item.row()).value("timestamp").toInt())) var.setValue(createWidget(record(item.row()))); else { widget = createWidget(record(item.row())); sizeHints[record(item.row()).value("timestamp").toInt()] = widget->sizeHint(); delete widget; var.setValue(0); } return var; } return QSqlQueryModel::data(item,role); } void PhotosQueryModel::selectData(const QString &engineName, const QString &tags) { QString dataQuery = "select * from photoHistory "; if (engineName.compare("All",Qt::CaseInsensitive) || tags.compare("All",Qt::CaseInsensitive)) dataQuery += "where "; if (engineName.compare("All",Qt::CaseInsensitive)) dataQuery += "engine = '" + engineName + "' "; if (tags.compare("All",Qt::CaseInsensitive)) { if (engineName.compare("All",Qt::CaseInsensitive)) dataQuery += "and "; dataQuery += "tags = '" + tags + "' "; } dataQuery += "order by timestamp desc"; setQuery(dataQuery,_db); } void PhotosQueryModel::queryChange() { sizeHints.clear(); QSqlQueryModel::queryChange(); } void PhotosQueryModel::calculateSizeHints() { if (currentQuery.next()) { QWidget *widget = createWidget(currentQuery.record()); sizeHints[currentQuery.record().value("timestamp").toInt()] = widget->sizeHint(); delete widget; } else { sizeHintTimer.stop(); reset(); } } QString PhotosQueryModel::formatCaption(const QSqlRecord &itemRecord) const { QString text; int timestampNo, titleNo, ownerNo, sizeNo, engineNo, locationNo, exifNo, widthNo, heightNo, timestamp; timestampNo = itemRecord.indexOf("timestamp"); titleNo = itemRecord.indexOf("title"); ownerNo = itemRecord.indexOf("owner"); sizeNo = itemRecord.indexOf("size"); engineNo = itemRecord.indexOf("engine"); locationNo = itemRecord.indexOf("location"); exifNo = itemRecord.indexOf("exif"); widthNo = itemRecord.indexOf("width"); heightNo = itemRecord.indexOf("height"); timestamp = itemRecord.value(timestampNo).toInt(); text = QString(""); text += ((itemRecord.value(titleNo).toString().isEmpty())? tr("(no title)") : itemRecord.value(titleNo).toString()) + "
"; text += QString(""; text += QString(""; text += QString("
") + tr("by:") + "" + ((itemRecord.value(ownerNo).toString().isEmpty())? tr("(no author)") : itemRecord.value(ownerNo).toString()) + "
") + tr("Date:") + "" + QDateTime::fromTime_t(timestamp).toString(Qt::SystemLocaleLongDate) + "
") + tr("Location:") + "" + ((itemRecord.value(locationNo).toString().isEmpty())? tr("unknown") : itemRecord.value(locationNo).toString()) + "
"; text += QString("
") + tr("Size:") + " " + QString::number(itemRecord.value(sizeNo).toInt() / 1024) + "k" + tr("Image size:") + " " + QString::number(itemRecord.value(widthNo).toInt()) + "x" + QString::number(itemRecord.value(heightNo).toInt()) + "" + tr("Engine:") + " " + itemRecord.value(engineNo).toString() + "" + tr("EXIF:") + " " + ((itemRecord.isNull(exifNo))? tr("No") : tr("Yes")) + "
"; return text; } QWidget *PhotosQueryModel::createWidget(const QSqlRecord &itemRecord) const { QWidget *widget; QHBoxLayout *layout; QLabel *label; QLabel *thumbnail; widget = new QWidget; widget->setAutoFillBackground(true); layout = new QHBoxLayout; thumbnail = new QLabel(widget); thumbnail->setFixedSize(100,100); thumbnail->setAutoFillBackground(true); thumbnail->setAlignment(Qt::AlignCenter); label = new QLabel(widget); label->setTextFormat(Qt::RichText); label->setAutoFillBackground(true); label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); layout->addWidget(thumbnail); layout->addWidget(label); layout->setContentsMargins(3,3,3,3); layout->setSpacing(10); widget->setLayout(layout); label->setText(formatCaption(itemRecord)); thumbnail->setPixmap(QPixmap(QFileInfo(_db.databaseName()).absolutePath() + "/" + QString::number(itemRecord.value("timestamp").toInt()) + ".png")); return widget; } void PhotoThumbnail::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.isValid()) { QWidget *widget = index.data(Qt::UserRole+1).value(); if (widget) { widget->setPalette(_palette); widget->setBackgroundRole((option.state & QStyle::State_Selected)? QPalette::Highlight : ((!(index.row() % 2))? QPalette::Base : QPalette::AlternateBase)); widget->setForegroundRole((option.state & QStyle::State_Selected)? QPalette::HighlightedText : QPalette::Text); painter->save(); painter->setRenderHint(QPainter::Antialiasing,true); painter->drawPixmap(option.rect.left(),option.rect.top(), QPixmap::grabWidget(widget, QRect(0,0,option.rect.width(), option.rect.height()))); painter->restore(); delete widget; } else emit const_cast (this)->sizeHintChanged(index); } else return QItemDelegate::paint(painter,option,index); } Dialog::Dialog(const QSqlDatabase &db, const QString &tempStorageDir, QWidget *parent) : Gui::Dialog(Gui::Dialog::CenterOfScreen,parent), request(reqFile), _db(db), httpProxy(QNetworkProxy::NoProxy) { QList sizes; QPalette palette(QApplication::palette()); QSplitter *splitter = new QSplitter(this); QVBoxLayout *vLayout = new QVBoxLayout; QSplitter *leftSplitter = new QSplitter(Qt::Vertical,this); QWidget *rightWidget = new QWidget(this); QVBoxLayout *vRightLayout = new QVBoxLayout; QLabel *hintLabel = new QLabel(this); _tempStorageDir = tempStorageDir; QCoreApplication::translate("QProgressDialog","Cancel"); vLayout->setMargin(0); splitter->setOrientation(Qt::Horizontal); enginesView = new QListView(this); enginesView->setEditTriggers(QAbstractItemView::NoEditTriggers); enginesView->setDragDropMode(QAbstractItemView::NoDragDrop); enginesView->setAlternatingRowColors(true); tagsView = new QListView(this); tagsView->setEditTriggers(QAbstractItemView::NoEditTriggers); tagsView->setDragDropMode(QAbstractItemView::NoDragDrop); tagsView->setAlternatingRowColors(true); photosView = new QListView(this); photosView->setContextMenuPolicy(Qt::ActionsContextMenu); photosView->setEditTriggers(QAbstractItemView::NoEditTriggers); photosView->setDragDropMode(QAbstractItemView::NoDragDrop); photosView->setAlternatingRowColors(true); photosView->setResizeMode(QListView::Adjust); photosView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); photosView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); hintLabel->setText(tr("Right-click on items to show options")); hintLabel->setAlignment(Qt::AlignCenter | Qt::AlignVCenter); vRightLayout->setContentsMargins(0,0,0,0); vRightLayout->addWidget(photosView); vRightLayout->addWidget(hintLabel); rightWidget->setLayout(vRightLayout); leftSplitter->addWidget(enginesView); leftSplitter->addWidget(tagsView); splitter->addWidget(leftSplitter); splitter->addWidget(rightWidget); vLayout->addWidget(splitter); #ifdef Q_WS_MAC QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok,Qt::Horizontal,this); connect(buttonBox,SIGNAL(accepted()),this,SLOT(close())); vLayout->addWidget(buttonBox); #endif setLayout(vLayout); palette.setColor(QPalette::Highlight,Qt::darkCyan); setPalette(palette); splitter->setStretchFactor(1,4); sizes << (width() / 4); sizes << (3 * width() / 4); splitter->setSizes(sizes); setWindowTitle(tr("History")); setWindowIcon(QIcon(":/images/history")); resize(800,600); initializeModelsAndViews(); initializeActions(); initHttp(); } void Dialog::changeTagsList(const QModelIndex ¤t, const QModelIndex & /* previous */) { if (current.isValid()) { tagsQueryModel->selectEngine(current.model()->data(current,Qt::UserRole).toString()); sortedTagsSelectionModel->setCurrentIndex(sortedTagsSelectionModel->model()->index(0,0),QItemSelectionModel::Select); photosView->scrollToTop(); } } void Dialog::changePhotosView(const QModelIndex ¤t, const QModelIndex & /* previous */) { if (current.isValid()) { photosQueryModel->selectData(sortedEnginesQueryModel->data(sortedEnginesSelectionModel->currentIndex(),Qt::UserRole).toString(), sortedTagsQueryModel->data(sortedTagsSelectionModel->currentIndex(),Qt::UserRole).toString()); photosView->scrollToTop(); } } void Dialog::updateContextMenuState(const QModelIndex ¤t, const QModelIndex & /* previous */) { if (current.isValid()) { QUrl url = photosQueryModel->record(current.row()).value("sourceUrl").toString(); exploreSourceAction->setEnabled(!url.isEmpty() && url.isValid()); } } QProgressDialog *Dialog::newHttpProgressDialog(QWidget *parent) { QProgressDialog *result = new QProgressDialog(parent); result->setWindowTitle(tr("Please wait...")); result->setLabelText(tr("Downloading photo...")); result->setCancelButtonText(tr("Abort")); result->setAutoClose(true); return result; } void Dialog::execSavePhoto() { int row = photosSelectionModel->currentIndex().row(); QUrl url = photosQueryModel->record(row).value("url").toString(); #ifdef Q_WS_X11 fileName = QFileDialog::getSaveFileName(0,tr("Save photo"), QDir::homePath() + "/" + QFileInfo(url.path()).fileName(), tr("Images (*.png *.xpm *.jpg)"),0,QFileDialog::DontUseNativeDialog); #else fileName = QFileDialog::getSaveFileName(0,tr("Save photo"), QDesktopServices::storageLocation(QDesktopServices::PicturesLocation) + "/" + QFileInfo(url.path()).fileName(), tr("Images (*.png *.xpm *.jpg)"),0,QFileDialog::DontUseNativeDialog); #endif if (!fileName.isEmpty()) { httpProgressDialog = newHttpProgressDialog(this); request = reqFile; if (!httpProxy.hostName().compare("0.0.0.0")) http->setProxy(guessProxy(url)); else http->setProxy(httpProxy); Network::Reply *reply = http->get(url,fileName); connect(httpProgressDialog,SIGNAL(canceled()),reply,SLOT(abort())); connect(reply,SIGNAL(finished(bool,const QByteArray &)),httpProgressDialog,SLOT(reset())); connect(reply,SIGNAL(finished(bool,const QByteArray &)),this,SLOT(httpDone(bool,const QByteArray &))); connect(reply,SIGNAL(progress(qint64,qint64)),this,SLOT(httpDownloading(qint64,qint64))); httpProgressDialog->show(); } } void Dialog::execSetAsBackground() { int row = photosSelectionModel->currentIndex().row(); QUrl url = photosQueryModel->record(row).value("url").toString(); httpProgressDialog = newHttpProgressDialog(this); fileName = _tempStorageDir + "/" + QFileInfo(url.path()).fileName(); request = reqWallpaper; if (!httpProxy.hostName().compare("0.0.0.0")) http->setProxy(guessProxy(url)); else http->setProxy(httpProxy); Network::Reply *reply = http->get(url,fileName); connect(httpProgressDialog,SIGNAL(canceled()),reply,SLOT(abort())); connect(reply,SIGNAL(finished(bool,const QByteArray &)),httpProgressDialog,SLOT(reset())); connect(reply,SIGNAL(finished(bool,const QByteArray &)),this,SLOT(httpDone(bool,const QByteArray &))); connect(reply,SIGNAL(progress(qint64,qint64)),this,SLOT(httpDownloading(qint64,qint64))); httpProgressDialog->show(); } void Dialog::execGetExifInfo() { QByteArray tagsData; int row = photosSelectionModel->currentIndex().row(); if (!photosQueryModel->record(row).isNull("exif")) { tagsData = qUncompress(photosQueryModel->record(row).value("exif").toByteArray()); if (tagsData.isEmpty()) tagsData = photosQueryModel->record(row).value("exif").toByteArray(); } Exif::InfoDialog(tagsData).exec(); } void Dialog::execViewPhoto() { int row = photosSelectionModel->currentIndex().row(); QUrl url = photosQueryModel->record(row).value("url").toString(); httpProgressDialog = newHttpProgressDialog(this); fileName = _tempStorageDir + "/" + QFileInfo(url.path()).fileName(); request = reqView; if (!httpProxy.hostName().compare("0.0.0.0")) http->setProxy(guessProxy(url)); else http->setProxy(httpProxy); Network::Reply *reply = http->get(url,fileName); connect(httpProgressDialog,SIGNAL(canceled()),reply,SLOT(abort())); connect(reply,SIGNAL(finished(bool,const QByteArray &)),httpProgressDialog,SLOT(reset())); connect(reply,SIGNAL(finished(bool,const QByteArray &)),this,SLOT(httpDone(bool,const QByteArray &))); connect(reply,SIGNAL(progress(qint64,qint64)),this,SLOT(httpDownloading(qint64,qint64))); httpProgressDialog->show(); } void Dialog::execExploreImageSource() { QModelIndex index = photosSelectionModel->currentIndex(); if (index.isValid()) { QUrl url = photosQueryModel->record(index.row()).value("sourceUrl").toString(); QDesktopServices::openUrl(url); } } void Dialog::httpDownloading(qint64 done, qint64 total) { if (!httpProgressDialog->wasCanceled()) { httpProgressDialog->setRange(0,total); httpProgressDialog->setValue(done); } } void Dialog::httpDone(bool ok, const QByteArray & /* data */) { Viewer *viewer; PhotoInfo info; int row; bool canceled = httpProgressDialog->wasCanceled(); httpProgressDialog->reset(); row = photosSelectionModel->currentIndex().row(); if (ok) { switch (request) { case reqWallpaper: emit photoDownloaded(true,QFileInfo(fileName)); info.owner = photosQueryModel->record(row).value("owner").toString(); info.title = photosQueryModel->record(row).value("title").toString(); info.description = photosQueryModel->record(row).value("description").toString(); info.location = photosQueryModel->record(row).value("location").toString(); emit infoCollected(info); emit changePhoto(photosQueryModel->record(row).value("engine").toString()); break; case reqFile: QMessageBox::information(this,tr("History"),tr("Photo has been saved")); break; case reqView: viewer = new Viewer(this); viewer->setPixmap(QPixmap(fileName)); viewer->setWindowTitle(photosQueryModel->record(row).value("title").toString()); viewer->exec(); delete viewer; break; } } else if (!canceled) QMessageBox::critical(this,tr("History"),tr("There was an error during download")); httpProgressDialog->deleteLater(); httpProgressDialog = 0; sender()->deleteLater(); } void Dialog::initializeModelsAndViews() { PhotoThumbnail *thumbnail = new PhotoThumbnail(palette(),this); enginesQueryModel = new EngineQueryModel(_db,this); sortedEnginesQueryModel = new SortModel(this); sortedEnginesQueryModel->setDynamicSortFilter(true); sortedEnginesQueryModel->setSourceModel(enginesQueryModel); sortedEnginesQueryModel->sort(0); enginesView->setModel(sortedEnginesQueryModel); sortedEnginesSelectionModel = new QItemSelectionModel(sortedEnginesQueryModel,this); enginesView->setSelectionModel(sortedEnginesSelectionModel); connect(sortedEnginesSelectionModel,SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this,SLOT(changePhotosView(const QModelIndex &, const QModelIndex &))); connect(sortedEnginesSelectionModel,SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this,SLOT(changeTagsList(const QModelIndex &, const QModelIndex &))); tagsQueryModel = new TagsQueryModel(_db,this); sortedTagsQueryModel = new SortModel(this); sortedTagsQueryModel->setDynamicSortFilter(true); sortedTagsQueryModel->setSourceModel(tagsQueryModel); sortedTagsQueryModel->sort(0); tagsView->setModel(sortedTagsQueryModel); sortedTagsSelectionModel = new QItemSelectionModel(sortedTagsQueryModel,this); tagsView->setSelectionModel(sortedTagsSelectionModel); connect(sortedTagsSelectionModel,SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this,SLOT(changePhotosView(const QModelIndex &, const QModelIndex &))); photosQueryModel = new PhotosQueryModel(_db,this); photosView->setModel(photosQueryModel); photosView->setItemDelegate(thumbnail); photosSelectionModel = new QItemSelectionModel(photosQueryModel,this); photosView->setSelectionModel(photosSelectionModel); connect(photosSelectionModel,SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this,SLOT(updateContextMenuState(const QModelIndex &, const QModelIndex &))); sortedEnginesSelectionModel->setCurrentIndex(sortedEnginesSelectionModel->model()->index(0,0),QItemSelectionModel::Select); sortedTagsSelectionModel->setCurrentIndex(sortedTagsSelectionModel->model()->index(0,0),QItemSelectionModel::Select); } void Dialog::initializeActions() { QAction *action = new QAction(QIcon(":/images/view_photo"),tr("View photo..."),this); connect(action,SIGNAL(triggered()),this,SLOT(execViewPhoto())); photosView->addAction(action); action = new QAction(QIcon(":images/exif_info"),tr("Get EXIF info..."),this); connect(action,SIGNAL(triggered()),this,SLOT(execGetExifInfo())); photosView->addAction(action); action = new QAction(QIcon(":/images/photo_save"),tr("Save photo..."),this); connect(action,SIGNAL(triggered()),this,SLOT(execSavePhoto())); photosView->addAction(action); action = new QAction(QIcon(":/images/photo_background"),tr("Set as background"),this); connect(action,SIGNAL(triggered()),this,SLOT(execSetAsBackground())); photosView->addAction(action); exploreSourceAction = new QAction(QIcon(":/images/source_url"),tr("Explore image source"),this); connect(exploreSourceAction,SIGNAL(triggered()),this,SLOT(execExploreImageSource())); photosView->addAction(exploreSourceAction); } void Dialog::setProxy(const QNetworkProxy &proxy) { qDebug() << "Dialog::setProxy(...)"; httpProxy = proxy; } QNetworkProxy Dialog::guessProxy(const QUrl &url) { QList proxies = QNetworkProxyFactory::systemProxyForQuery(QNetworkProxyQuery(url)); if (proxies.size()) { QNetworkProxy localProxy = proxies.at(0); localProxy.setUser(httpProxy.user()); localProxy.setPassword(httpProxy.password()); return localProxy; } else return QNetworkProxy(QNetworkProxy::NoProxy); } void Dialog::initHttp() { httpProgressDialog = 0; http = new Network::Manager(this); } wally-2.4.4/src/smugmug.cpp0000644000000000000000000001716111676624760014353 0ustar rootroot/* TRANSLATOR SmugMug::Item */ /* TRANSLATOR SmugMug::Core */ /* TRANSLATOR SmugMug::DialogWidget */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "httpengine.h" #include "smugmug.h" using namespace SmugMug; Item::Item(Item *item) : HttpEngine::Item(item) { _text = item->_text; } QVariant Item::data() const { QString str = _text; if (!str.isEmpty()) str = QString("") + tr("Text:") + " " + _text + ""; return str; } int Item::doCalculateNextIndex(bool randomMode, int currentIndex, int /* pages */) const { return currentIndex + ((randomMode)? (qrand() % 5) + 1 : 1); } QUrl Item::doPrepareInit(HttpEngine::Operation & /* op */) { _photoUrl.clear(); _sourceUrl.clear(); photoTitle.clear(); photoDescription.clear(); photoOwner.clear(); return QUrl(); } QUrl Item::doPrepareSearch(HttpEngine::Operation & /* op */) { QUrl url("http://api.smugmug.com/hack/feed.mg"); url.addQueryItem("Type","keyword"); if (_text.isEmpty()) return QUrl(); url.addQueryItem("Data",_text); url.addQueryItem("format","rss"); url.addQueryItem("Size","Original"); url.addQueryItem("start",QString::number(pageIndex())); url.addQueryItem("ImageCount","1"); return url; } bool Item::doProcessSearchResult(const QByteArray &response, int & /* newPagesCount */) { bool itemSection = false, mediaGroupSection = false; int fileSize = 0; QXmlStreamReader xmlResp(response); while (!xmlResp.atEnd()) if ((xmlResp.readNext() == QXmlStreamReader::StartElement) && !xmlResp.name().toString().compare("item",Qt::CaseInsensitive)) { itemSection = true; while (!xmlResp.atEnd() && itemSection) switch (xmlResp.readNext()) { case QXmlStreamReader::StartElement: if (!xmlResp.name().toString().compare("title",Qt::CaseInsensitive)) { xmlResp.readNext(); photoTitle = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("link",Qt::CaseInsensitive)) { xmlResp.readNext(); _sourceUrl = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("description",Qt::CaseInsensitive)) { xmlResp.readNext(); photoDescription = xmlResp.text().toString(); } else if (!xmlResp.name().toString().compare("author",Qt::CaseInsensitive)) { xmlResp.readNext(); photoOwner = xmlResp.text().toString(); } else if (!xmlResp.prefix().toString().compare("media",Qt::CaseInsensitive) && !xmlResp.name().toString().compare("group",Qt::CaseInsensitive)) { mediaGroupSection = true; while (!xmlResp.atEnd() && mediaGroupSection) switch (xmlResp.readNext()) { case QXmlStreamReader::StartElement: if (!xmlResp.name().toString().compare("content",Qt::CaseInsensitive) && !xmlResp.attributes().value("medium").toString().compare("image",Qt::CaseInsensitive) && (fileSize < xmlResp.attributes().value("fileSize").toString().toInt()) && ((xmlResp.attributes().value("width").toString().toInt() * xmlResp.attributes().value("height").toString().toInt()) < MAX_PIXEL_NUMBER)) { fileSize = xmlResp.attributes().value("fileSize").toString().toInt(); _photoUrl = xmlResp.attributes().value("url").toString(); photoSize = QSize(xmlResp.attributes().value("width").toString().toInt(), xmlResp.attributes().value("height").toString().toInt()); } break; case QXmlStreamReader::EndElement: mediaGroupSection = xmlResp.name().toString().compare("group",Qt::CaseInsensitive); break; default: break; } } break; case QXmlStreamReader::EndElement: itemSection = xmlResp.name().toString().compare("item",Qt::CaseInsensitive); break; default: break; } } if (!_photoUrl.isValid()) resetPages(); return (_photoUrl.isValid() && !_lastPhotoUrls.contains(_photoUrl)); } QUrl Item::prepareSizeRequest(HttpEngine::Operation & /* op */) { return QUrl("/"); } QSize Item::doProcessSizeRequestResult(const QByteArray & /* response */) { return photoSize; } QUrl Item::prepareDownload(HttpEngine::Operation & /* op */) { return _photoUrl; } QUrl Item::prepareInfoCollect(HttpEngine::Operation & /* op */) { _lastPhotoUrls.insert(_photoUrl); return QUrl("/"); } PhotoInfo Item::doProcessInfoCollectResult(const QByteArray & /* response */) { QTextDocument doc; PhotoInfo info; info.title = photoTitle; doc.setHtml(photoDescription); info.description = doc.toPlainText(); info.owner = photoOwner; info.sourceUrl = _sourceUrl; info.searchString = _text; return info; } void Item::doLoadSettings(QSettings &settings) { QByteArray data; QBuffer buf(&data); QDataStream in(&buf); _text = settings.value(SEARCH_TEXT,QString()).toString(); data = qUncompress(settings.value(LAST_PHOTO_URLS,QByteArray()).toByteArray()); buf.open(QIODevice::ReadOnly); in >> _lastPhotoUrls; buf.close(); } void Item::doSaveSettings(QSettings &settings) const { settings.setValue(SEARCH_TEXT,_text); } void Item::doSaveState(QSettings &settings) const { QByteArray data; QBuffer buf(&data); QDataStream out(&buf); buf.open(QIODevice::WriteOnly); out << _lastPhotoUrls; buf.close(); settings.setValue(LAST_PHOTO_URLS,qCompress(data)); } bool Item::equalTo(Engine::Item *item) const { Item *smugmugItem = qobject_cast (item); return smugmugItem && (text() == smugmugItem->text()); } DialogWidget::DialogWidget(XtEngine::Core *core, QWidget *parent) : XtEngine::DialogWidget(core,parent) { QHBoxLayout *mainLayout = new QHBoxLayout; leSearchFor = new QLineEdit(this); leSearchFor->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Maximum); mainLayout->addWidget(new QLabel(tr("Search for:"),this)); mainLayout->addWidget(leSearchFor); setLayout(mainLayout); leSearchFor->setFocus(); } XtEngine::Item *DialogWidget::returnItem() { Item *item = qobject_cast (core()->newItem()); item->setText(leSearchFor->text()); return item; } void DialogWidget::setupFromItem(XtEngine::Item *item) { if (item) { Item *smugMugItem = qobject_cast (item); setWindowTitle(tr("Edit SmugMug item")); leSearchFor->setText(smugMugItem->text()); } else setWindowTitle(tr("Add SmugMug item")); } wally-2.4.4/src/exif.cpp0000644000000000000000000002311711676624760013620 0ustar rootroot/* TRANSLATOR Exif::InfoDialog */ /* * Wally - Qt4 wallpaper/background changer * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #ifdef EXIF #include #include #include #include #include #include #endif #include "exif.h" using namespace Exif; #ifdef EXIF ExifByteOrder Tags::byteOrder; void Tags::readEntry(ExifEntry *entry, void *data) { char *buf = new char[1024]; QVariant value; ExifRational rational; ExifSRational sRational; QMap > *exifValues = reinterpret_cast > *> (data); QString readableValue; QString title = QTextCodec::codecForLocale()->toUnicode(exif_tag_get_title_in_ifd(entry->tag,exif_entry_get_ifd(entry))); QString description = QTextCodec::codecForLocale()->toUnicode(exif_tag_get_description_in_ifd(entry->tag,exif_entry_get_ifd(entry))); memset(buf,0,1024); switch (entry->format) { case EXIF_FORMAT_BYTE: exif_entry_get_value(entry,buf,1024); readableValue = buf; (*exifValues)[entry->tag] = QPair(Tag(title,description), Data(static_cast (*entry->data),readableValue)); break; case EXIF_FORMAT_ASCII: switch (entry->tag) { case EXIF_TAG_XP_TITLE: case EXIF_TAG_XP_COMMENT: case EXIF_TAG_XP_AUTHOR: case EXIF_TAG_XP_KEYWORDS: case EXIF_TAG_XP_SUBJECT: exif_entry_get_value(entry,buf,1024); readableValue = QString::fromUtf8(buf,1024); (*exifValues)[entry->tag] = QPair(Tag(title,description), Data(QString::fromUtf16(reinterpret_cast (entry->data),entry->size).trimmed(), readableValue)); break; default: exif_entry_get_value(entry,buf,1024); readableValue = buf; (*exifValues)[entry->tag] = QPair(Tag(title,description), Data(QString::fromLatin1(reinterpret_cast (entry->data),entry->size).trimmed(), readableValue)); break; } break; case EXIF_FORMAT_SHORT: exif_entry_get_value(entry,buf,1024); readableValue = buf; (*exifValues)[entry->tag] = QPair(Tag(title,description),Data(exif_get_short(entry->data,byteOrder),readableValue)); break; case EXIF_FORMAT_LONG: exif_entry_get_value(entry,buf,1024); readableValue = buf; (*exifValues)[entry->tag] = QPair(Tag(title,description),Data(exif_get_long(entry->data,byteOrder),readableValue)); break; case EXIF_FORMAT_RATIONAL: exif_entry_get_value(entry,buf,1024); readableValue = buf; rational = exif_get_rational(entry->data,byteOrder); value.setValue(rational); (*exifValues)[entry->tag] = QPair(Tag(title,description),Data(value,readableValue)); break; case EXIF_FORMAT_SBYTE: exif_entry_get_value(entry,buf,1024); readableValue = buf; (*exifValues)[entry->tag] = QPair(Tag(title,description),Data(static_cast (*entry->data),readableValue)); break; case EXIF_FORMAT_UNDEFINED: break; case EXIF_FORMAT_SSHORT: exif_entry_get_value(entry,buf,1024); readableValue = buf; (*exifValues)[entry->tag] = QPair(Tag(title,description),Data(exif_get_sshort(entry->data,byteOrder),readableValue)); break; case EXIF_FORMAT_SLONG: exif_entry_get_value(entry,buf,1024); readableValue = buf; (*exifValues)[entry->tag] = QPair(Tag(title,description),Data(exif_get_slong(entry->data,byteOrder),readableValue)); break; case EXIF_FORMAT_SRATIONAL: exif_entry_get_value(entry,buf,1024); readableValue = buf; sRational = exif_get_srational(entry->data,byteOrder); value.setValue(sRational); (*exifValues)[entry->tag] = QPair(Tag(title,description),Data(value,readableValue)); break; case EXIF_FORMAT_FLOAT: exif_entry_get_value(entry,buf,1024); readableValue = buf; (*exifValues)[entry->tag] = QPair(Tag(title,description),Data(*reinterpret_cast (entry->data),readableValue)); break; case EXIF_FORMAT_DOUBLE: exif_entry_get_value(entry,buf,1024); readableValue = buf; (*exifValues)[entry->tag] = QPair(Tag(title,description),Data(*reinterpret_cast (entry->data),readableValue)); break; } delete [] buf; } void Tags::readContent(ExifContent *content, void *data) { exif_content_foreach_entry(content,readEntry,data); } #endif Tags::Tags(const QFileInfo &fileInfo) : _fileName(fileInfo.absoluteFilePath()) { #ifdef EXIF QFile file(fileName()); file.open(QIODevice::ReadOnly); readExifData(file.readAll()); file.close(); #endif } Tags::Tags(const QByteArray &data) { readExifData(data); } void Tags::readExifData(const QByteArray &data) { #ifdef EXIF if (data.size()) { ExifData *exifData = exif_data_new(); unsigned char *buf; unsigned int bufSize; exif_data_load_data(exifData,reinterpret_cast (data.constData()),data.size()); exif_data_save_data(exifData,&buf,&bufSize); _data = QByteArray(reinterpret_cast (buf),bufSize); byteOrder = exif_data_get_byte_order(exifData); exif_data_foreach_content(exifData,readContent,reinterpret_cast (this)); exif_data_free(exifData); free(buf); } #endif } QImage Tags::normalize(const QImage &image) { QImage result = image; #ifdef EXIF switch (value(EXIF_TAG_ORIENTATION).second.value.toInt()) { case 1: break; case 2: result = result.mirrored(true,false); break; case 3: result = result.mirrored(true,true); break; case 4: result = result.mirrored(false,true); break; case 5: result = result.transformed(QTransform().rotate(90),Qt::SmoothTransformation).mirrored(true,false); break; case 6: result = result.transformed(QTransform().rotate(90),Qt::SmoothTransformation); break; case 7: result = result.transformed(QTransform().rotate(270),Qt::SmoothTransformation).mirrored(true,false); break; case 8: result = result.transformed(QTransform().rotate(270),Qt::SmoothTransformation); break; default: break; } #endif return result; } InfoDialog::InfoDialog(const QFileInfo &fileInfo, QWidget *parent) : Gui::Dialog(Gui::Dialog::CenterOfScreen,parent) { setupUi(Tags(fileInfo)); } InfoDialog::InfoDialog(const QByteArray &data, QWidget *parent) : Gui::Dialog(Gui::Dialog::CenterOfScreen,parent) { setupUi(Tags(data)); } void InfoDialog::setupUi(const Tags &tags) { int row = 0; QVBoxLayout *layout = new QVBoxLayout; layout->setContentsMargins(0,0,0,0); setWindowTitle(tr("EXIF information")); if (!tags.fileName().isEmpty()) setWindowTitle(windowTitle() + " - " + QFileInfo(tags.fileName()).fileName()); setWindowIcon(QIcon(":images/exif_info")); if (tags.size()) { QMapIterator > tag(tags); QTableWidget *tableWidget = new QTableWidget(tags.size(),2,this); tableWidget->setAlternatingRowColors(true); tableWidget->verticalHeader()->setVisible(false); tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); tableWidget->setSelectionMode(QAbstractItemView::NoSelection); tableWidget->setHorizontalHeaderItem(0,new QTableWidgetItem(tr("Tag"))); tableWidget->setHorizontalHeaderItem(1,new QTableWidgetItem(tr("Value"))); tableWidget->horizontalHeader()->setStretchLastSection(true); while (tag.hasNext()) { QTableWidgetItem *item; QPair exifValue = tag.next().value(); item = new QTableWidgetItem(exifValue.first.title); item->setToolTip(exifValue.first.description.split(". ",QString::SkipEmptyParts).join("\n")); tableWidget->setItem(row,0,item); item = new QTableWidgetItem(exifValue.second.readableValue); item->setToolTip(exifValue.first.description.split(". ",QString::SkipEmptyParts).join("\n")); tableWidget->setItem(row++,1,item); } tableWidget->resizeColumnsToContents(); tableWidget->resizeRowsToContents(); layout->addWidget(tableWidget); } else { QLabel *label = new QLabel(tr("No EXIF information available"),this); label->setAlignment(Qt::AlignCenter); layout->addWidget(label); } #ifdef Q_WS_MAC QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok,Qt::Horizontal,this); connect(buttonBox,SIGNAL(accepted()),this,SLOT(close())); layout->addWidget(buttonBox); #endif setLayout(layout); resize(600,400); } wally-2.4.4/ui/0000755000000000000000000000000011676624761012004 5ustar rootrootwally-2.4.4/ui/about.ui0000644000000000000000000002215011676624760013454 0ustar rootroot AboutDialog About Wally :/images/about:/images/about true QLayout::SetFixedSize 300 150 300 150 Qt::AlignCenter 10 30 75 true <html><head></head><body><font size="+1">Qt4 desktop wallpaper changer<br />Author: Antonio Di Monaco (a.k.a. <i>Sin(x) '76</i>)<br />I'd like to thank Vincent Willem van Gogh for the logo :)<br /><br />Web site: <a href="http://www.becrux.com">http://www.becrux.com</a><br />You can contact me at <a href="mailto:tony@becrux.com?subject=About Wally">tony@becrux.com</font></body></html> true Qt::Horizontal 40 20 Details >> true Close 0 QAbstractItemView::NoEditTriggers false false true QAbstractItemView::NoSelection QAbstractItemView::SelectRows true false false true Extension Description Supported image formats: Additional info: QAbstractItemView::NoEditTriggers false false QAbstractItemView::NoSelection QAbstractItemView::SelectRows false false false false false QAbstractItemView::NoEditTriggers false false true QAbstractItemView::NoSelection QAbstractItemView::SelectRows true false false true Language Translator Translations: Gui::ShrinkableTableWidget QTableWidget
gui.h
pbClose clicked() AboutDialog close() 698 209 731 170
wally-2.4.4/ui/http.ui0000644000000000000000000001026411676624760013324 0ustar rootroot HttpSettingsWidget 0 Photo sets Add a photo set :/images/add:/images/add 20 20 false Delete photo set :/images/delete:/images/delete 20 20 Qt::Vertical 20 40 true QAbstractItemView::ExtendedSelection false false Options Save photos false false :/images/folder:/images/folder 20 20 updatePath() wally-2.4.4/ui/files.ui0000644000000000000000000001262311676624760013450 0ustar rootroot FilesSettingsWidget true 0 Photos 9 QAbstractItemView::NoEditTriggers true QAbstractItemView::ContiguousSelection Add a photo :/images/files_add:/images/files_add 20 20 Add photos in folder :/images/folder_photo:/images/folder_photo 20 20 false Delete photo :/images/files_delete:/images/files_delete 20 20 Qt::Vertical 20 40 false Move photo up :/images/arrow_up:/images/arrow_up 20 20 false Move photo down :/images/arrow_down:/images/arrow_down 20 20 Qt::Vertical 20 40 wally-2.4.4/ui/folders.ui0000644000000000000000000000604311676624760014003 0ustar rootroot FoldersSettingsWidget true 0 Folders false Add a folder :/images/folder_add:/images/folder_add 20 20 false Delete folder :/images/folder_delete:/images/folder_delete 20 20 Qt::Vertical 20 40 QAbstractItemView::NoEditTriggers true QAbstractItemView::ContiguousSelection addFolder() deleteFolder() wally-2.4.4/ui/viewer.ui0000644000000000000000000000657211676624760013655 0ustar rootroot Viewer Qt::ActionsContextMenu Right-click on photo to show actions 0 0 true Qt::AlignCenter 0 0 194 94 0 0 Qt::AlignCenter :/images/fit_to_window:/images/fit_to_window Fit to window :/images/full_image:/images/full_image Show full image :/images/zoom_in:/images/zoom_in Zoom in :/images/zoom_out:/images/zoom_out Zoom out :/images/clockwise:/images/clockwise Rotate clockwise :/images/cclockwise:/images/cclockwise Rotate c. clockwise wally-2.4.4/ui/settings.ui0000644000000000000000000010121311676624760014200 0ustar rootroot SettingsDialog Qt::ApplicationModal 0 0 709 529 :/images/configure:/images/configure 0 0 General options Interval: 1 300 2 QComboBox::AdjustToContents Border: 0 0 Position: Qt::Horizontal 40 20 Qt::Horizontal 40 20 0 0 Main 3 Choose in random order Switch background on play Play automatically on application start Disable splash screen Quit after background change Start automatically when system starts Only use landscape-oriented photos Rotate images according to EXIF information View info on photo 0 0 20 0 false Position: false QComboBox::AdjustToContents Qt::Horizontal 40 20 View info in system tray tooltip Use full desktop area Photo has to be QComboBox::AdjustToContents independent of at least 1/2 of at least 3/4 of bigger than desktop's size Qt::Horizontal 40 20 Don't save locally remote photos if free disk space goes below 999 QComboBox::AdjustToContents Qt::Horizontal 40 20 Store images in history for QComboBox::AdjustToContents Clear Qt::Horizontal 40 20 Network 0 Direct connection true Proxy connection false 3 3 Use system proxy true Use custom proxy Server: Port: 1 65535 8080 QComboBox::AdjustToContents Qt::Horizontal 40 20 3 Authentication 3 Username: 3 Password: QLineEdit::Password Qt::Horizontal 40 20 Qt::Vertical 20 40 Engines false QAbstractItemView::ExtendedSelection true Qt::Vertical 20 40 false :/images/move_all_left:/images/move_all_left false :/images/move_left:/images/move_left false :/images/move_right:/images/move_right false :/images/move_all_right:/images/move_all_right Qt::Vertical 20 40 false QAbstractItemView::ExtendedSelection true Available modules: Active modules: Qt::Horizontal 40 20 Qt::Horizontal 40 20 true QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset Gui::ColorButton QWidget
gui.h
Gui::ScrollableButtons QFrame
gui.h
1
bbResult accepted() SettingsDialog accept() 455 628 409 563 bbResult rejected() SettingsDialog reject() 336 628 288 563 cbViewInfoOnPhoto toggled(bool) lblInfoPositionOnPhoto setEnabled(bool) 183 277 245 277 cbViewInfoOnPhoto toggled(bool) cbInfoPositionOnPhoto setEnabled(bool) 172 277 332 277 rbCustomProxy toggled(bool) wdgProxyServer setEnabled(bool) 342 254 348 300 cbProxyAuthentication toggled(bool) wdgProxyAuthentication setEnabled(bool) 251 329 258 398 rbProxyConnection toggled(bool) wdgProxy setEnabled(bool) 204 180 205 206 resetSettings(QAbstractButton*)
wally-2.4.4/wallyplugin/0000755000000000000000000000000011676624761013736 5ustar rootrootwally-2.4.4/wallyplugin/wallyplugin.h0000644000000000000000000000275311676624760016464 0ustar rootroot/* * WallyPlugin - KDE4 plugin for Wally * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the 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 WALLYPLUGIN_H #define WALLYPLUGIN_H #include #include #include #include #include #include #include #define LAST_WALLY_WALLPAPER "lastWallyWallpaper" class WallyPlugin : public Plasma::Wallpaper { Q_OBJECT QString _wallpaper; QPixmap _pixmap; void loadWallpaper(); protected: void init(const KConfigGroup &config); public: WallyPlugin(QObject *parent, const QVariantList &args); virtual ~WallyPlugin() { } void save(KConfigGroup &config); void paint(QPainter *painter, const QRectF &exposedRect); public slots: void setWallpaper(const QString &fileName); }; #endif wally-2.4.4/wallyplugin/CMakeLists.txt0000644000000000000000000000311611676624760016476 0ustar rootrootcmake_minimum_required(VERSION 2.6) project(wallyplugin) set(CMAKE_BUILD_TYPE Release) execute_process(COMMAND "kde4-config" "--prefix" OUTPUT_VARIABLE KDE_CUSTOM_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE) set(CMAKE_INSTALL_PREFIX "${KDE_CUSTOM_PREFIX}") set(QT_USE_QTDBUS TRUE) find_package(Qt4 REQUIRED) include(${QT_USE_FILE}) find_package(KDE4 REQUIRED) include(KDE4Defaults) include(MacroLibrary) add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${KDE4_INCLUDES} ../include) set(wallyplugin_SRCS wallyplugin.cpp wallyplugin.h) kde4_add_plugin(plasma_wallpaper_wallyplugin ${wallyplugin_SRCS}) target_link_libraries(plasma_wallpaper_wallyplugin ${QT_LIBRARIES} ${KDE4_PLASMA_LIBS} ${KDE4_KDEUI_LIBS}) if(CMAKE_BUILD_TYPE STREQUAL Release) get_property( WALLY_PLUGIN_PATH TARGET plasma_wallpaper_wallyplugin PROPERTY LOCATION ) add_custom_command( TARGET plasma_wallpaper_wallyplugin POST_BUILD COMMAND strip ARGS ${WALLY_PLUGIN_PATH} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) endif(CMAKE_BUILD_TYPE STREQUAL Release) install(TARGETS plasma_wallpaper_wallyplugin DESTINATION ${PLUGIN_INSTALL_DIR}) install(FILES plasma-wallpaper-wallyplugin.desktop DESTINATION ${SERVICES_INSTALL_DIR}) install(FILES wallyplugin.png DESTINATION ${ICON_INSTALL_DIR}/oxygen/16x16/apps) install(CODE "execute_process(COMMAND kbuildsycoca4 OUTPUT_QUIET ERROR_QUIET)") install(CODE "execute_process(COMMAND kdialog --title \"WallyPlugin\" --msgbox \"WallyPlugin will be loaded next time KDE is started. Please select it in Appearance Settings.\")") wally-2.4.4/wallyplugin/plasma-wallpaper-wallyplugin.desktop0000644000000000000000000000064611676624760023145 0ustar rootroot[Desktop Entry] Name=WallyPlugin Type=Service Icon=wallyplugin ServiceTypes=Plasma/Wallpaper X-KDE-Library=plasma_wallpaper_wallyplugin X-KDE-PluginInfo-Author=Antonio Di Monaco X-KDE-PluginInfo-Email=tony@becrux.com X-KDE-PluginInfo-Name=wallyplugin X-KDE-PluginInfo-Version=1.0 X-KDE-PluginInfo-Website=http://www.becrux.com/ X-KDE-PluginInfo-Depends= X-KDE-PluginInfo-License=GPL X-KDE-PluginInfo-EnabledByDefault=true wally-2.4.4/wallyplugin/wallyplugin.cpp0000644000000000000000000000500111676624760017004 0ustar rootroot/* * WallyPlugin - KDE4 plugin for Wally * Copyright (C) 2009 Antonio Di Monaco * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include "wallyplugin.h" #include "wallypluginexport.h" WallyPlugin::WallyPlugin(QObject *parent, const QVariantList &args) : Plasma::Wallpaper(parent,args) { QDBusConnection::sessionBus().registerService("com.BeCrux.WallyPlugin"); QDBusConnection::sessionBus().registerObject("/WallyPlugin",this,QDBusConnection::ExportAllSlots); } void WallyPlugin::paint(QPainter *painter, const QRectF &exposedRect) { painter->save(); if (painter->worldMatrix() == QMatrix()) painter->resetTransform(); painter->setCompositionMode(QPainter::CompositionMode_Source); if (!_pixmap.isNull()) { if (isPreviewing()) { QPixmap scaledPixmap = _pixmap; scaledPixmap = scaledPixmap.scaled(exposedRect.size().toSize(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation); painter->drawPixmap(exposedRect.toRect(),scaledPixmap); } else painter->drawPixmap(exposedRect,_pixmap,exposedRect); } else painter->fillRect(exposedRect,Qt::black); painter->restore(); } void WallyPlugin::loadWallpaper() { if (!_wallpaper.isEmpty()) { _pixmap.load(_wallpaper); emit update(boundingRect()); emit configNeedsSaving(); } } void WallyPlugin::init(const KConfigGroup &config) { Plasma::Wallpaper::init(config); setWallpaper(config.readEntry("wallpaper",QString())); } void WallyPlugin::save(KConfigGroup &config) { Plasma::Wallpaper::save(config); config.writeEntry("wallpaper",_wallpaper); } void WallyPlugin::setWallpaper(const QString &fileName) { if (!fileName.isEmpty() && QImageReader(fileName).canRead()) { _wallpaper = fileName; loadWallpaper(); } } #include "wallyplugin.moc" wally-2.4.4/wallyplugin/wallyplugin.png0000644000000000000000000000150311676624760017011 0ustar rootrootPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8}Mh\ewL8S!?:h'H DBIYh7]B]*b\v%ݹ]AZP[d4u;ߏ 9=⳯~Y2Fю)ۯ  / !:rovd<=q&)gO a_8NG@4m%Bz# $sJq">-"!V eC<#R ,'!.6bF:k{[u X\"F$^LH"#X!8F$K;xBhf# Ȏ q3OSLbM25ָ