pax_global_header00006660000000000000000000000064147622666270014534gustar00rootroot0000000000000052 comment=c154fc0d72e25e7cecc6343a0796bcd4ae1d842b dtkdeclarative-5.7.12/000077500000000000000000000000001476226662700146165ustar00rootroot00000000000000dtkdeclarative-5.7.12/.github/000077500000000000000000000000001476226662700161565ustar00rootroot00000000000000dtkdeclarative-5.7.12/.github/ISSUE_TEMPLATE/000077500000000000000000000000001476226662700203415ustar00rootroot00000000000000dtkdeclarative-5.7.12/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000023651476226662700223370ustar00rootroot00000000000000blank_issues_enabled: false contact_links: - name: BUG Report | 缺陷报告 url: https://github.com/linuxdeepin/dtk/issues/new?assignees=&labels=&template=bug-report.yml about: Please create bug reports to the issue board in our dtk repo. - name: docs-update | 文档补充 url: https://github.com/linuxdeepin/dtk/issues/new?assignees=&labels=&template=docs-update.yml about: Please create docs-update to the issue board in our dtk repo. - name: unit-test-report | 单元测试报告 url: https://github.com/linuxdeepin/dtk/issues/new?assignees=&labels=&template=unit-test-report.yml about: Please create unit-test-report to the issue board in our dtk repo. - name: Feature Request | 特性请求 url: https://github.com/linuxdeepin/developer-center/discussions/new?category=features-request-ideas-%E7%89%B9%E6%80%A7%E8%AF%B7%E6%B1%82-%E5%A4%B4%E8%84%91%E9%A3%8E%E6%9A%B4 about: Please create feature requests to the discussion board in our developer-center repo. - name: General Discussion & Questions | 常规讨论与问答 url: https://github.com/linuxdeepin/developer-center/discussions/categories/q-a-%E9%97%AE%E7%AD%94%E6%9D%BF%E5%9D%97 about: Please use the discussion board in our developer-center repo. dtkdeclarative-5.7.12/.github/workflows/000077500000000000000000000000001476226662700202135ustar00rootroot00000000000000dtkdeclarative-5.7.12/.github/workflows/backup-to-gitlab.yml000066400000000000000000000005371476226662700240700ustar00rootroot00000000000000name: backup to gitlab on: [push] concurrency: group: ${{ github.workflow }} cancel-in-progress: true jobs: backup-to-gitlabwh: uses: linuxdeepin/.github/.github/workflows/backup-to-gitlabwh.yml@master secrets: inherit backup-to-gitee: uses: linuxdeepin/.github/.github/workflows/backup-to-gitee.yml@master secrets: inherit dtkdeclarative-5.7.12/.github/workflows/call-auto-tag.yml000066400000000000000000000005171476226662700233730ustar00rootroot00000000000000name: auto tag on: pull_request_target: types: [opened, synchronize, closed] paths: - "debian/changelog" concurrency: group: ${{ github.workflow }}-pull/${{ github.event.number }} cancel-in-progress: true jobs: auto_tag: uses: linuxdeepin/.github/.github/workflows/auto-tag.yml@master secrets: inherit dtkdeclarative-5.7.12/.github/workflows/call-build-distribution.yml000066400000000000000000000004321476226662700254620ustar00rootroot00000000000000name: Call build-distribution on: push: paths-ignore: - ".github/workflows/**" pull_request_target: paths-ignore: - ".github/workflows/**" jobs: check_job: uses: linuxdeepin/.github/.github/workflows/build-distribution.yml@master secrets: inherit dtkdeclarative-5.7.12/.github/workflows/call-chatOps.yml000066400000000000000000000002421476226662700232460ustar00rootroot00000000000000name: chatOps on: issue_comment: types: [created] jobs: chatopt: uses: linuxdeepin/.github/.github/workflows/chatOps.yml@master secrets: inherit dtkdeclarative-5.7.12/.github/workflows/call-clacheck.yml000066400000000000000000000005251476226662700234060ustar00rootroot00000000000000name: Call CLA check on: issue_comment: types: [created] pull_request_target: types: [opened, closed, synchronize] concurrency: group: ${{ github.workflow }}-pull/${{ github.event.number }} cancel-in-progress: true jobs: clacheck: uses: linuxdeepin/.github/.github/workflows/cla-check.yml@master secrets: inherit dtkdeclarative-5.7.12/.github/workflows/call-commitlint.yml000066400000000000000000000003641476226662700240310ustar00rootroot00000000000000name: Call commitlint on: pull_request_target: concurrency: group: ${{ github.workflow }}-pull/${{ github.event.number }} cancel-in-progress: true jobs: check_job: uses: linuxdeepin/.github/.github/workflows/commitlint.yml@master dtkdeclarative-5.7.12/.github/workflows/call-deploy-dev-doc.yml000066400000000000000000000007401476226662700244630ustar00rootroot00000000000000name: deploy docs on: push: branches: ["master"] workflow_dispatch: inputs: tag: required: true type: string permissions: contents: read pages: write id-token: write # Allow one concurrent deployment concurrency: group: "pages" cancel-in-progress: true jobs: deploydocs: uses: linuxdeepin/.github/.github/workflows/deploy-dev-doc.yml@master with: ref: ${{ inputs.tag }} secrets: inherit dtkdeclarative-5.7.12/.github/workflows/call-doc-check.yml000066400000000000000000000004671476226662700234760ustar00rootroot00000000000000name: doxygen-check on: pull_request_target: paths-ignore: - ".github/workflows/**" concurrency: group: ${{ github.workflow }}-pull/${{ github.event.number }} cancel-in-progress: true jobs: check_job: uses: linuxdeepin/.github/.github/workflows/doc-check.yml@master secrets: inherit dtkdeclarative-5.7.12/.github/workflows/call-license-check.yml000066400000000000000000000005521476226662700243460ustar00rootroot00000000000000name: Call License and README Check on: pull_request_target: types: [opened, synchronize, reopened] permissions: pull-requests: write contents: read concurrency: group: ${{ github.workflow }}-pull/${{ github.event.number }} cancel-in-progress: true jobs: license-check: uses: linuxdeepin/.github/.github/workflows/license-check.yml@master dtkdeclarative-5.7.12/.github/workflows/call-synchronize-to-dtk6.yml000066400000000000000000000010171476226662700255070ustar00rootroot00000000000000name: Call synchronize to dtk6 on: pull_request_target: paths-ignore: - "debian/**" - "archlinux/**" - ".obs/**" - ".github/**" jobs: call-synchronize: uses: linuxdeepin/dtk/.github/workflows/synchronize-to-dtk6.yml@master secrets: inherit with: dest_repo: linuxdeepin/dtk6declarative source_repo: ${{ github.event.pull_request.head.repo.full_name }} source_ref: ${{ github.event.pull_request.head.ref }} pull_number: ${{ github.event.pull_request.number }} dtkdeclarative-5.7.12/.github/workflows/cppcheck.yml000066400000000000000000000012651476226662700225220ustar00rootroot00000000000000name: cppcheck on: pull_request_target: paths-ignore: - ".github/workflows/**" concurrency: group: ${{ github.workflow }}-pull/${{ github.event.number }} cancel-in-progress: true jobs: cppchceck: name: cppcheck runs-on: ubuntu-latest steps: - run: export - uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.sha }} persist-credentials: false - uses: linuxdeepin/action-cppcheck@main with: github_token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.repository }} pull_request_id: ${{ github.event.pull_request.number }} allow_approve: false dtkdeclarative-5.7.12/.gitignore000066400000000000000000000012271476226662700166100ustar00rootroot00000000000000# C++ objects and libs *.slo *.lo *.o *.a *.la *.lai *.so *.dll *.dylib # Qt-es object_script.*.Release object_script.*.Debug *_plugin_import.cpp /.qmake.cache /.qmake.stash *.user *.pro.user.* *.qbs.user.* *.moc moc_*.cpp moc_*.h qrc_*.cpp ui_*.h *.qmlc *.jsc Makefile* *build-* src/translations/*.qm # Qt unit tests target_wrapper.* # QtCreator *.autosave # QtCreator Qml *.qmlproject.user *.qmlproject.user.* # QtCreator CMake CMakeLists.txt.user* bin cmake src/DtkDeclaratives src/dtkdeclarative_config.h src/qt_lib_dtkdeclarative.pri chameleon/imports/org */.vscode/* build #clangd .cache #vscode .vscode #idea .idea #doxygen-theme /docs/doxygen/ dtkdeclarative-5.7.12/.obs/000077500000000000000000000000001476226662700154575ustar00rootroot00000000000000dtkdeclarative-5.7.12/.obs/workflows.yml000066400000000000000000000023121476226662700202350ustar00rootroot00000000000000test_build: steps: - link_package: source_project: deepin:Develop:dde source_package: %{SCM_REPOSITORY_NAME} target_project: deepin:CI - configure_repositories: project: deepin:CI repositories: - name: deepin_develop paths: - target_project: deepin:CI target_repository: deepin_develop architectures: - x86_64 - aarch64 - name: debian paths: - target_project: deepin:CI target_repository: debian_sid architectures: - x86_64 - name: archlinux paths: - target_project: deepin:CI target_repository: archlinux architectures: - x86_64 filters: event: pull_request tag_build: steps: - branch_package: source_project: deepin:Develop:dde source_package: %{SCM_REPOSITORY_NAME} target_project: deepin:Unstable:dde filters: event: tag_push commit_build: steps: - trigger_services: project: deepin:Develop:dde package: %{SCM_REPOSITORY_NAME} filters: event: push dtkdeclarative-5.7.12/.reuse/000077500000000000000000000000001476226662700160175ustar00rootroot00000000000000dtkdeclarative-5.7.12/.reuse/dep5000066400000000000000000000025771476226662700166120ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: dtkdeclarative Upstream-Contact: UnionTech Software Technology Co., Ltd. <> Source: https://github.com/linuxdeepin/dtkdeclarative # icon files Files: *.dci *.png *.svg *.webp Copyright: UnionTech Software Technology Co., Ltd. License: LGPL-3.0-or-later #interface Files: src/D* Copyright: UnionTech Software Technology Co., Ltd. License: LGPL-3.0-or-later # debian Files: *debian/* Copyright: UnionTech Software Technology Co., Ltd. License: LGPL-3.0-or-later # qt Files: *.pro *qmldir *.qrc *.pri Copyright: None License: CC0-1.0 # Arch Files: archlinux/* Copyright: None License: CC0-1.0 # README Files: *.md Copyright: UnionTech Software Technology Co., Ltd. License: CC-BY-4.0 # ci Files: .github/* *.yml *.yaml .obs/* Copyright: None License: CC0-1.0 # git Files: .gitignore Copyright: None License: CC0-1.0 # freedesktop Files: *.desktop Copyright: None License: CC0-1.0 # conf Files: *.json *.qdocconf *.qdocinc Copyright: None License: CC0-1.0 # cmake Files: *.cmake *CMakeLists.txt *.in Copyright: None License: CC0-1.0 # docs Files: docs/* Copyright: 2022-2023 deepin doc doc go SIG License: CC-BY-4.0 #image Files: *.jpg *.png *.gif Copyright: None License: CC0-1.0 # ts .tx/files Files: *.ts .tx/* Copyright: None License: CC0-1.0 Files: toolGenerate/**/* Copyright: None License: CC0-1.0 dtkdeclarative-5.7.12/.tx/000077500000000000000000000000001476226662700153275ustar00rootroot00000000000000dtkdeclarative-5.7.12/.tx/config000066400000000000000000000003611476226662700165170ustar00rootroot00000000000000[main] host = https://www.transifex.com minimum_perc = 80 mode = developer [deepin-tool-kit.dtkdeclarative] file_filter = src/translations/dtkdeclarative_.ts source_file = src/translations/dtkdeclarative.ts source_lang = en type = QT dtkdeclarative-5.7.12/.tx/deepin.conf000066400000000000000000000000311476226662700174340ustar00rootroot00000000000000[transifex] branch = m23 dtkdeclarative-5.7.12/CMakeLists.txt000066400000000000000000000137651476226662700173720ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.10) set(DTK_VERSION "5.6.23" CACHE STRING "Define project version") project(DtkDeclarative VERSION "${DTK_VERSION}" DESCRIPTION "DTK Declarative module" HOMEPAGE_URL "https://github.com/linuxdeepin/dtkdeclarative" LANGUAGES CXX ) if (${PROJECT_VERSION_MAJOR} STREQUAL "5") set(QT_DEFAULT_MAJOR_VERSION "5") set(QT_VERSION_MAJOR "5") set(EnableQt5 on) set(EnableDtk5 on) set(EnableQt6 off) set(EnableDtk6 off) elseif(${PROJECT_VERSION_MAJOR} STREQUAL "6") set(QT_DEFAULT_MAJOR_VERSION "6") set(QT_VERSION_MAJOR "6") set(DTK_VERSION_MAJOR "6") set(EnableQt5 off) set(EnableDtk5 off) set(EnableQt6 on) set(EnableDtk6 on) else() message(FATAL_ERROR "Only support DTK_VERSION is 5 or 6") endif() set(ENABLE_COV OFF CACHE BOOL "Generate coverage info") set(LIB_NAME dtk${DTK_VERSION_MAJOR}declarative) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX /usr) endif() include(GNUInstallDirs) include(CMakePackageConfigHelpers) include(DtkBuildConfig) set(BUILD_DOCS ON CACHE BOOL "Generate doxygen-based documentation") set(LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}" CACHE STRING "Library install path") set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}/dtk${PROJECT_VERSION_MAJOR}/DDeclarative" CACHE STRING "Headers install path") set(TEMPLATE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/qtcreator/templates/wizards/projects/qml${DTK_VERSION_MAJOR}-app-template" CACHE STRING "Directory to install QtCreator template") set(CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/Dtk${DTK_VERSION_MAJOR}Declarative" CACHE STRING "CMake config file install directory") set(PKGCONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig" CACHE STRING "Directory to install pkg-config file") set(MKSPECS_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/qt${QT_VERSION_MAJOR}/mkspecs/modules" CACHE STRING "Qt pri module install directory") set(QML_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/qt${QT_VERSION_MAJOR}/qml" CACHE STRING "Qml plugin install directory") set(USE_QQuickStylePluginPrivate OFF) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) find_package(Qt${QT_VERSION_MAJOR}QuickControls2) if(EnableQt5) if(TARGET Qt::QuickControls2 AND TARGET Qt::QuickControls2Private) set(USE_QQuickStylePluginPrivate ON) endif() endif() if(EnableQt6) if(TARGET Qt6::QuickControls2 AND TARGET Qt6::QuickControls2Private) set(USE_QQuickStylePluginPrivate ON) endif() endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wextra") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--as-needed") if (CMAKE_BUILD_TYPE STREQUAL "Debug") # 加上 ASAN 检查后可能会导致 DEBUG 应用启动后退出。可以加上 ASAN_OPTIONS 环境变量来防止应用退出 # ASAN_OPTIONS="halt_on_error=0" ASAN_OPTIONS="new_delete_type_mismatch=0" set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g -fno-omit-frame-pointer") set(BUILD_TESTING ON) else () set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Ofast") endif () set(DDECLARATIVE_TRANSLATIONS_DIR "dtk${PROJECT_VERSION_MAJOR}/DDeclarative/translations" CACHE STRING "DDeclarative translations directory") set(DDECLARATIVE_TRANSLATIONS_PATH "share/${DDECLARATIVE_TRANSLATIONS_DIR}") set(TRANSLATIONS_INSTALL_PATH "${DDECLARATIVE_TRANSLATIONS_PATH}") set(URI "org.deepin.dtk") string(REPLACE "." "/" URI_PATH ${URI}) set(PLUGIN_NAME dtkdeclarativeplugin) set(STYLE_PLUGIN_NAME qtquickcontrolschameleonstyleplugin) set(PLUGIN_OUTPUT_DIR ${PROJECT_BINARY_DIR}/plugins) if(EnableQt5) add_subdirectory(src) add_subdirectory(qmlplugin) endif() if(EnableQt6) add_subdirectory(qt6) endif() add_subdirectory(chameleon) add_subdirectory(examples) if(BUILD_DOCS) add_subdirectory(docs) endif() if(BUILD_TESTING) add_subdirectory(tests) add_dependencies(unit-test ${PLUGIN_NAME} ${STYLE_PLUGIN_NAME}) if(EnableQt6) add_dependencies(unit-test dtkdeclarativeprivatesplugin dtkdeclarativesettingsplugin) endif() endif() # Install wizards template set(QML_TEMPLATE_QTVERSION_INDEX 0) if(EnableQt5) set(QML_TEMPLATE_QTVERSION_INDEX 3) endif() configure_package_config_file( "${CMAKE_CURRENT_LIST_DIR}/misc/qml-app-template/wizard.json.in" "${CMAKE_CURRENT_BINARY_DIR}/wizard.json" INSTALL_DESTINATION "${TEMPLATE_INSTALL_DIR}" ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/wizard.json" DESTINATION "${TEMPLATE_INSTALL_DIR}") install(DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/misc/qml-app-template/" DESTINATION "${TEMPLATE_INSTALL_DIR}" FILES_MATCHING PATTERN "*" PATTERN "*.in" EXCLUDE) configure_package_config_file( "${CMAKE_CURRENT_LIST_DIR}/misc/DtkDeclarativeConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/Dtk${DTK_VERSION_MAJOR}DeclarativeConfig.cmake" INSTALL_DESTINATION "${CONFIG_INSTALL_DIR}" ) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/Dtk${DTK_VERSION_MAJOR}DeclarativeConfigVersion.cmake" VERSION ${VERSION} COMPATIBILITY SameMajorVersion ) # Install cmake config file install(FILES "${CMAKE_CURRENT_BINARY_DIR}/Dtk${DTK_VERSION_MAJOR}DeclarativeConfig.cmake" DESTINATION "${CONFIG_INSTALL_DIR}") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/Dtk${DTK_VERSION_MAJOR}DeclarativeConfigVersion.cmake" DESTINATION "${CONFIG_INSTALL_DIR}") # Install pkg-config file configure_file("${PROJECT_SOURCE_DIR}/misc/dtkdeclarative.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/dtk${DTK_VERSION_MAJOR}declarative.pc" @ONLY) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dtk${DTK_VERSION_MAJOR}declarative.pc" DESTINATION "${PKGCONFIG_INSTALL_DIR}") # Install qmake module config file configure_file("${CMAKE_CURRENT_LIST_DIR}/misc/qt_lib_dtkdeclarative.pri.in" "${CMAKE_CURRENT_BINARY_DIR}/qt_lib_dtkdeclarative.pri" @ONLY) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/qt_lib_dtkdeclarative.pri" DESTINATION "${MKSPECS_INSTALL_DIR}") dtkdeclarative-5.7.12/LICENSE000066400000000000000000001221631476226662700156300ustar00rootroot00000000000000GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser 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 Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . dtkdeclarative-5.7.12/LICENSES/000077500000000000000000000000001476226662700160235ustar00rootroot00000000000000dtkdeclarative-5.7.12/LICENSES/CC-BY-4.0.txt000066400000000000000000000411771476226662700176720ustar00rootroot00000000000000Creative Commons Attribution 4.0 International Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. Using Creative Commons Public Licenses Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. Creative Commons Attribution 4.0 International Public License By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. Section 1 – Definitions. a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. Section 2 – Scope. a. License grant. 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: A. reproduce and Share the Licensed Material, in whole or in part; and B. produce, reproduce, and Share Adapted Material. 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 3. Term. The term of this Public License is specified in Section 6(a). 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. 5. Downstream recipients. A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). b. Other rights. 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 2. Patent and trademark rights are not licensed under this Public License. 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. Section 3 – License Conditions. Your exercise of the Licensed Rights is expressly made subject to the following conditions. a. Attribution. 1. If You Share the Licensed Material (including in modified form), You must: A. retain the following if it is supplied by the Licensor with the Licensed Material: i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); ii. a copyright notice; iii. a notice that refers to this Public License; iv. a notice that refers to the disclaimer of warranties; v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. Section 4 – Sui Generis Database Rights. Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. Section 5 – Disclaimer of Warranties and Limitation of Liability. a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. Section 6 – Term and Termination. a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 2. upon express reinstatement by the Licensor. c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. Section 7 – Other Terms and Conditions. a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. Section 8 – Interpretation. a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. Creative Commons may be contacted at creativecommons.org. dtkdeclarative-5.7.12/LICENSES/CC0-1.0.txt000066400000000000000000000156101476226662700174300ustar00rootroot00000000000000Creative Commons Legal Code CC0 1.0 Universal CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. Statement of Purpose The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. 1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; ii. moral rights retained by the original author(s) and/or performer(s); iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; v. rights protecting the extraction, dissemination, use and reuse of data in a Work; vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. 3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. 4. Limitations and Disclaimers. a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. dtkdeclarative-5.7.12/LICENSES/LGPL-3.0-or-later.txt000066400000000000000000001221621476226662700213470ustar00rootroot00000000000000GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser 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 Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . dtkdeclarative-5.7.12/README.md000066400000000000000000000036661476226662700161100ustar00rootroot00000000000000# dtkdeclarative dtkdeclarative is a widget development toolkit based on QtQuick/QtQml, which is a brand new substitute for dtkwidget. dtkdeclarative is developed based on qtdeclarative. It covers all existing QML widgets and adds plenty of DTK friendly visual effects and color schemes. Compared to dtkwidget. It has: 1. **A primitive Qt and Qml code style** 2. **Adapted APIs with traditional Qml** 3. **Simple and quick development interfaces** 4. **Unified widget theme style** 5. **Abundant effects and colors** [中文介绍](README.zh_CN.md) ## Document [dtkdeclarative 中文文档](https://linuxdeepin.github.io/dtkdeclarative/index.html) ## Dependencies + qml-module-qtquick-shapes + qml-module-qtquick-layouts ## Build dependencies + qtdeclarative5-dev + qtbase5-dev-tools, + qtquickcontrols2-5-dev + libdtkgui-dev + libdtkcore-dev + qtdeclarative5-private-dev + qtbase5-private-dev ### Build from source 1. Please make sure that all dependencies are installed 2. Get source and build ```shell $ git clone https://github.com/linuxdeepin/dtkdeclarative.git $ cmake -Bbuild -GNinja $ cmake --build build ``` 3. Install ```shell $ sudo cmake --install build ``` ## Getting help + Please feel free to report issues if you encounter any problem + [Deepin Community](https://bbs.deepin.org/) for generic discussion and help. ## Getting Involved Any usage issues can ask for help via * [Telegram group](https://t.me/deepin) * [Matrix](https://matrix.to/#/#deepin-community:matrix.org) * [IRC (libera.chat)](https://web.libera.chat/#deepin-community) * [Forum](https://bbs.deepin.org) * [WiKi](https://wiki.deepin.org/) If you find a definite bug, you can raise it by way of an issue and we will fix it as soon as possible. If you have some development skills, you are welcome to submit a PR. ## License dtkdeclarative is licensed under the [LGPL-3.0-or-later](LICENSE) ## TODO 1. Add plugins.qmltypes, support code completion 2. Support Vulkan dtkdeclarative-5.7.12/README.zh_CN.md000066400000000000000000000037671476226662700171120ustar00rootroot00000000000000# dtkdeclarative ​dtkdeclarative 是基于 QtQuick/QtQml 实现的控件开发库,它是用于代替已有的 dtkwidget 编程而开发出来的一个全新的 DTK 模块。dtkclarative 代码以 qtdeclarative 为基础进行开发,实现了对QML已有控件的覆盖(包含Qt Quick Controls 2中的所有控件),并增加了大量在 DTK 环境下友好显示的视觉特效和颜色风格。相对于 dtkwidget,它具备以下特点: 1. **原始的 Qt 和 Qml 代码风格** 2. **适配传统 Qml 的所有 API** 3. **简单快速的界面开发接口** 4. **统一的控件主题风格** 5. **丰富的特效和色彩** ![img](./docs/images/introduction.png) ## 文档 + [dtkdeclarative 中文文档](https://linuxdeepin.github.io/dtkdeclarative/index.html) ## 依赖 + qml-module-qtquick-shapes + qml-module-qtquick-layouts ## 编译依赖 + qtdeclarative5-dev + qtbase5-dev-tools, + qtquickcontrols2-5-dev + libdtkgui-dev + libdtkcore-dev + qtdeclarative5-private-dev + qtbase5-private-dev ### 构建过程 1. 确保所有依赖安装完成 2. 执行源码编译指令 ```shell $ git clone https://github.com/linuxdeepin/dtkdeclarative.git $ cmake -Bbuild -GNinja $ cmake --build build ``` 3. 安装 ```shell $ sudo cmake --install build ``` ## 帮助 任何使用问题都可以通过以下方式寻求帮助: * [Telegram 群组](https://t.me/deepin) * [Matrix](https://matrix.to/#/#deepin-community:matrix.org) * [IRC (libera.chat)](https://web.libera.chat/#deepin-community) * [Forum](https://bbs.deepin.org) * [WiKi](https://wiki.deepin.org/) 如果你发现一个确定的bug,可以通过issue的方式提出,我们会尽快修复。如果你有一定的开发能力,欢迎提交PR。 ## 贡献指南 + [开发者代码贡献指南](https://github.com/linuxdeepin/developer-center/wiki/Contribution-Guidelines-for-Developers) ## 许可 dtkdeclarative is licensed under the [LGPL-3.0-or-later](LICENSE) ## TODO 1. 添加 plugins.qmltypes 文件,支持代码补全 2. 支持 Vulkan dtkdeclarative-5.7.12/archlinux/000077500000000000000000000000001476226662700166135ustar00rootroot00000000000000dtkdeclarative-5.7.12/archlinux/PKGBUILD000066400000000000000000000020631476226662700177400ustar00rootroot00000000000000# Maintainer: zccrs pkgname=dtkdeclarative-git pkgver=1.0.0 pkgrel=1 sourcename=dtkdeclarative sourcetars=("$sourcename"_"$pkgver".tar.xz) sourcedir="$sourcename" pkgdesc='Deepin Toolkit, declarative module for DDE look and feel' arch=('x86_64' 'aarch64') url="https://github.com/linuxdeepin/dtkdeclarative" license=('LGPL3') depends=('qt5-declarative' 'qt5-quickcontrols2' 'dtkcommon-git' 'dtkcore-git' 'dtkgui-git') makedepends=('git' 'qt5-tools' 'gtest' 'cmake' 'ninja' 'doxygen') conflicts=('dtkdeclarative') provides=('dtkdeclarative') groups=('deepin-git') source=("${sourcetars[@]}") sha512sums=('SKIP') prepare() { cd $sourcedir } build() { cd $sourcedir cmake -GNinja \ -DMKSPECS_INSTALL_DIR=lib/qt/mkspecs/modules/\ -DQML_INSTALL_DIR=lib/qt/qml \ -DBUILD_DOCS=OFF \ -DBUILD_EXAMPLES=OFF \ -DQCH_INSTALL_DESTINATION=share/doc/qt \ -DCMAKE_INSTALL_LIBDIR=lib \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=Release } package() { cd $sourcedir DESTDIR="$pkgdir" ninja install } dtkdeclarative-5.7.12/chameleon/000077500000000000000000000000001476226662700165515ustar00rootroot00000000000000dtkdeclarative-5.7.12/chameleon/ApplicationWindow.qml000066400000000000000000000002721476226662700227200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.ApplicationWindow { } dtkdeclarative-5.7.12/chameleon/BusyIndicator.qml000066400000000000000000000002661476226662700220470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.BusyIndicator { } dtkdeclarative-5.7.12/chameleon/Button.qml000066400000000000000000000002601476226662700205350ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.Button { } dtkdeclarative-5.7.12/chameleon/CMakeLists.txt000066400000000000000000000066151476226662700213210ustar00rootroot00000000000000set(PLUGIN_NAME ${STYLE_PLUGIN_NAME}) find_package(Dtk${DTK_VERSION_MAJOR}Gui REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Qml Quick QuickControls2 REQUIRED ) if(EnableQt5) find_package(Qt${QT_VERSION_MAJOR}QuickCompiler) endif() set(QML_FILES ApplicationWindow.qml BusyIndicator.qml Button.qml CheckBox.qml CheckDelegate.qml ComboBox.qml Control.qml DelayButton.qml DialogButtonBox.qml Dial.qml Frame.qml GroupBox.qml ItemDelegate.qml ListView.qml MenuItem.qml Menu.qml MenuSeparator.qml PageIndicator.qml Pane.qml Popup.qml ProgressBar.qml RadioButton.qml RoundButton.qml ScrollBar.qml ScrollIndicator.qml Slider.qml SpinBox.qml StackView.qml Switch.qml TextArea.qml TextField.qml ToolTip.qml ) set(SRC_FILES qtquickcontrols2chameleonstyleplugin.h qtquickcontrols2chameleonstyleplugin.cpp ) if(EnableQt5) file(GLOB _qml_files ${QML_FILES}) set(TARGETPATH "QtQuick/Controls.2/Chameleon") set(PLUGIN_INSTALL_DIR "${QML_INSTALL_DIR}/${TARGETPATH}") qtquick_compiler_add_resources(RESOURCES ${CMAKE_CURRENT_LIST_DIR}/qml.qrc) add_library(${PLUGIN_NAME} SHARED ${SRC_FILES} ${RESOURCES} # qml.qrc ) set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${PLUGIN_OUTPUT_DIR}/Chameleon" ) find_program(COMPILER NAMES qmlcachegen REQUIRED ) set(QMLC_FILES) foreach(QML_FILE ${_qml_files}) get_filename_component(EXTENSION ${QML_FILE} EXT) if(EXTENSION STREQUAL ".qml" OR EXTENSION STREQUAL ".js" OR EXTENSION STREQUAL ".ui.qml") set(OUTPUT_FILE "${QML_FILE}c") execute_process(COMMAND ${COMPILER} ${QML_FILE} -o ${OUTPUT_FILE}) list(APPEND QMLC_FILES ${OUTPUT_FILE}) endif() endforeach() set(QML_DIR "${CMAKE_CURRENT_BINARY_DIR}/qmldir") configure_file("${CMAKE_CURRENT_LIST_DIR}/qmldir.in" "${QML_DIR}" @ONLY) # copy qmldir add_custom_command(TARGET ${PLUGIN_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${QML_DIR}" #in-file "${PLUGIN_OUTPUT_DIR}/Chameleon/qmldir" #out-file ) install(TARGETS ${PLUGIN_NAME} DESTINATION ${PLUGIN_INSTALL_DIR}) install(FILES ${QML_DIR} ${_qml_files} ${QMLC_FILES} DESTINATION ${PLUGIN_INSTALL_DIR} ) endif() if(EnableQt6) qt_add_qml_module(${PLUGIN_NAME} URI "Chameleon" VERSION "1.0" CLASS_NAME QtQuickControls2ChameleonStylePlugin PLUGIN_TARGET ${PLUGIN_NAME} OUTPUT_DIRECTORY "${PLUGIN_OUTPUT_DIR}/Chameleon" NO_PLUGIN_OPTIONAL NO_GENERATE_PLUGIN_SOURCE SOURCES ${SRC_FILES} QML_FILES ${QML_FILES} ) install(DIRECTORY "${PLUGIN_OUTPUT_DIR}/Chameleon/" DESTINATION "${QML_INSTALL_DIR}/Chameleon") endif() dtk_extend_target(${PLUGIN_NAME} EnableCov ${ENABLE_COV}) target_link_libraries(${PLUGIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Qml Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::QuickControls2 ) if(USE_QQuickStylePluginPrivate) target_compile_definitions(${PLUGIN_NAME} PRIVATE USE_QQuickStylePlugin) target_link_libraries(${PLUGIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::QuickControls2Private ) endif() dtkdeclarative-5.7.12/chameleon/CheckBox.qml000066400000000000000000000003021476226662700207450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.CheckBox { id: control } dtkdeclarative-5.7.12/chameleon/CheckDelegate.qml000066400000000000000000000002661476226662700217400ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.CheckDelegate { } dtkdeclarative-5.7.12/chameleon/ComboBox.qml000066400000000000000000000002611476226662700207730ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.ComboBox { } dtkdeclarative-5.7.12/chameleon/Control.qml000066400000000000000000000002601476226662700207020ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.Control { } dtkdeclarative-5.7.12/chameleon/DelayButton.qml000066400000000000000000000002641476226662700215200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.DelayButton { } dtkdeclarative-5.7.12/chameleon/Dial.qml000066400000000000000000000002551476226662700201370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.Dial { } dtkdeclarative-5.7.12/chameleon/DialogButtonBox.qml000066400000000000000000000002701476226662700223270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.DialogButtonBox { } dtkdeclarative-5.7.12/chameleon/Frame.qml000066400000000000000000000002561476226662700203210ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.Frame { } dtkdeclarative-5.7.12/chameleon/GroupBox.qml000066400000000000000000000002621476226662700210310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.GroupBox { } dtkdeclarative-5.7.12/chameleon/ItemDelegate.qml000066400000000000000000000002651476226662700216200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.ItemDelegate { } dtkdeclarative-5.7.12/chameleon/ListView.qml000066400000000000000000000002521476226662700210310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.ListView { } dtkdeclarative-5.7.12/chameleon/Menu.qml000066400000000000000000000002551476226662700201720ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.Menu { } dtkdeclarative-5.7.12/chameleon/MenuItem.qml000066400000000000000000000002611476226662700210060ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.MenuItem { } dtkdeclarative-5.7.12/chameleon/MenuSeparator.qml000066400000000000000000000002571476226662700220550ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.MenuSeparator { } dtkdeclarative-5.7.12/chameleon/PageIndicator.qml000066400000000000000000000002661476226662700220010ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.PageIndicator { } dtkdeclarative-5.7.12/chameleon/Pane.qml000066400000000000000000000002461476226662700201510ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.Pane { } dtkdeclarative-5.7.12/chameleon/Popup.qml000066400000000000000000000002471476226662700203720ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.Popup { } dtkdeclarative-5.7.12/chameleon/ProgressBar.qml000066400000000000000000000002641476226662700215170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.ProgressBar { } dtkdeclarative-5.7.12/chameleon/RadioButton.qml000066400000000000000000000002641476226662700215200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.RadioButton { } dtkdeclarative-5.7.12/chameleon/RoundButton.qml000066400000000000000000000002641476226662700215510ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.RoundButton { } dtkdeclarative-5.7.12/chameleon/ScrollBar.qml000066400000000000000000000002631476226662700211500ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.ScrollBar { } dtkdeclarative-5.7.12/chameleon/ScrollIndicator.qml000066400000000000000000000002611476226662700223560ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.ScrollIndicator { } dtkdeclarative-5.7.12/chameleon/Slider.qml000066400000000000000000000002511476226662700205040ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.Slider { } dtkdeclarative-5.7.12/chameleon/SpinBox.qml000066400000000000000000000002601476226662700206440ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.SpinBox { } dtkdeclarative-5.7.12/chameleon/StackView.qml000066400000000000000000000002621476226662700211640ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.StackView { } dtkdeclarative-5.7.12/chameleon/Switch.qml000066400000000000000000000002471476226662700205300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.Switch { }dtkdeclarative-5.7.12/chameleon/TextArea.qml000066400000000000000000000002611476226662700210000ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.TextArea { } dtkdeclarative-5.7.12/chameleon/TextField.qml000066400000000000000000000002621476226662700211540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.TextField { } dtkdeclarative-5.7.12/chameleon/ToolTip.qml000066400000000000000000000002601476226662700206540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.ToolTip { } dtkdeclarative-5.7.12/chameleon/qml.qrc000066400000000000000000000017531476226662700200570ustar00rootroot00000000000000 ApplicationWindow.qml BusyIndicator.qml Button.qml CheckBox.qml CheckDelegate.qml ComboBox.qml Control.qml DelayButton.qml DialogButtonBox.qml Dial.qml Frame.qml GroupBox.qml ItemDelegate.qml MenuItem.qml Menu.qml MenuSeparator.qml PageIndicator.qml Pane.qml Popup.qml ProgressBar.qml RadioButton.qml RoundButton.qml ScrollBar.qml ScrollIndicator.qml Slider.qml SpinBox.qml StackView.qml Switch.qml TextArea.qml TextField.qml ToolTip.qml dtkdeclarative-5.7.12/chameleon/qmldir000066400000000000000000000002101476226662700177550ustar00rootroot00000000000000module Chameleon plugin qtquickcontrols2chameleonstyleplugin classname QtQuickControls2ChameleonStylePlugin depends QtQuick.Controls 2.4dtkdeclarative-5.7.12/chameleon/qmldir.in000066400000000000000000000002031476226662700203640ustar00rootroot00000000000000module QtQuick.Controls.Chameleon plugin @PLUGIN_NAME@ classname QtQuickControls2ChameleonStylePlugin depends QtQuick.Controls 2.4 dtkdeclarative-5.7.12/chameleon/qtquickcontrols2chameleonstyleplugin.cpp000066400000000000000000000015171476226662700267640ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "qtquickcontrols2chameleonstyleplugin.h" //#include "dquickpaletteprovider_p.h" #include //DQUICK_USE_NAMESPACE QtQuickControls2ChameleonStylePlugin::~QtQuickControls2ChameleonStylePlugin() { // 恢复到使用QQuickPaletteProvider // DQuickPaletteProvider::cleanup(); } #ifdef USE_QQuickStylePlugin QString QtQuickControls2ChameleonStylePlugin::name() const { return QStringLiteral("Chameleon"); } #endif void QtQuickControls2ChameleonStylePlugin::registerTypes(const char *uri) { // 为 DPalette/QPalette 类型注册QQmlValueTypeProvider // DQuickPaletteProvider::init(); // Use the QPalette in the dtk style, don't do custom of palette qmlRegisterModule(uri, 2, 0); } dtkdeclarative-5.7.12/chameleon/qtquickcontrols2chameleonstyleplugin.h000066400000000000000000000016111476226662700264240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef QTQUICKCONTROLS2CHAMELEONSTYLEPLUGIN_H #define QTQUICKCONTROLS2CHAMELEONSTYLEPLUGIN_H #ifdef USE_QQuickStylePlugin #include #else #include #endif class QtQuickControls2ChameleonStylePlugin #ifdef USE_QQuickStylePlugin : public QQuickStylePlugin #else : public QQmlExtensionPlugin #endif { Q_OBJECT Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) public: ~QtQuickControls2ChameleonStylePlugin() override; #ifdef USE_QQuickStylePlugin QString name() const override; #endif #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) virtual void initializeTheme(QQuickTheme *) {} #endif void registerTypes(const char *uri) override; }; #endif // QTQUICKCONTROLS2CHAMELEONSTYLEPLUGIN_H dtkdeclarative-5.7.12/cmake/000077500000000000000000000000001476226662700156765ustar00rootroot00000000000000dtkdeclarative-5.7.12/cmake/DtkBuildConfig.cmake000066400000000000000000000071641476226662700215400ustar00rootroot00000000000000# This cmake file is used to deploy files that dconfig's meta and override configure. include(CMakeParseArguments) # generate dtk moudule config header file. # # MODULE_NAME - module name. ${MODULE_NAME}_config.h # DEST_DIR - used to get header file dest path, if it's empty, ${CMAKE_CURRENT_SOURCE_DIR} is used. # HEADERS - header files without .h extension. # EXT_CONTENTS - extra contents strings. # # e.g: # set(VERSION_DEC "#define DTK_VERSION_MAJOR 5" # "#define DTK_VERSION_MINOR 5" # "#define DTK_VERSION_PATCH 23" # "#define DTK_VERSION_BUILD 0" # "#define DTK_VERSION_STR \"5.5.23\"\n") # set(HEADERS ./DConfig ./DConfigFile ./DLog ./DObject) # gen_dtk_config_header(MODULE_NAME dtkcore # DEST_DIR include/global # HEADERS ${HEADERS} # EXT_CONTENTS ${VERSION_DEC}) # # filename: ${CMAKE_CURRENT_SOURCE_DIR}/include/global/dtkcore_config.h # ==== file content begin ==== # // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. # // # // SPDX-License-Identifier: LGPL-3.0-or-later # # #define DTK_VERSION_MAJOR 5 # #define DTK_VERSION_MINOR 5 # #define DTK_VERSION_PATCH 23 # #define DTK_VERSION_BUILD 0 # #define DTK_VERSION_STR "5.5.23" # # #define DTKCORE_CLASS_DConfig # #define DTKCORE_CLASS_DConfigFile # #define DTKCORE_CLASS_DLog # #define DTKCORE_CLASS_DObject # ==== file content end ==== # function(GEN_DTK_CONFIG_HEADER) set(oneValueArgs MODULE_NAME DEST_DIR OUTPUT_VARIABLE) set(multiValueArgs HEADERS EXT_CONTENTS) cmake_parse_arguments(_CONFIG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if (DEFINED _CONFIG_MSG) message("MODULE_NAME: ${_CONFIG_MODULE_NAME}\n" "DEST_DIR: ${_CONFIG_DEST_DIR}\n" "HEADERS: ${_CONFIG_HEADERS}\n") endif() set(config_file_path ${CMAKE_CURRENT_SOURCE_DIR}) if (DEFINED _CONFIG_DEST_DIR) set(config_file_path ${_CONFIG_DEST_DIR}) endif() if (DEFINED _CONFIG_MODULE_NAME) string(APPEND config_file_path /${_CONFIG_MODULE_NAME}_config.h) message("generate file path:" ${config_file_path}) else() message(FATAL_ERROR \"MODULE_NAME needs to be defined when calling gen_dtk_config_header\") endif() set(LICENSE_DEC "// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd.\n" "//\n" "// SPDX-License-Identifier: LGPL-3.0-or-later\n" "\n") file(WRITE ${config_file_path} ${LICENSE_DEC}) foreach(_ext_content ${_CONFIG_EXT_CONTENTS}) file(APPEND ${config_file_path} "${_ext_content}\n") endforeach() foreach(_head_file ${_CONFIG_HEADERS}) get_filename_component(classname ${_head_file} NAME) string(TOUPPER ${_CONFIG_MODULE_NAME} _UP_MODULE_NAME) file(APPEND ${config_file_path} "#define ${_UP_MODULE_NAME}_CLASS_${classname}\n") endforeach() set(${_CONFIG_OUTPUT_VARIABLE} ${config_file_path} PARENT_SCOPE) endfunction() function(dtk_extend_target TARGET) set(args_option) set(args_single EnableCov ) cmake_parse_arguments(PARSE_ARGV 1 arg "${args_option}" "${args_single}" "${args_multi}") if (arg_EnableCov) if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") target_compile_options(${TARGET} PRIVATE -fprofile-instr-generate -ftest-coverage) elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") target_compile_options(${TARGET} PRIVATE -fprofile-arcs -ftest-coverage) endif() target_link_libraries(${TARGET} PRIVATE gcov) endif() endfunction() dtkdeclarative-5.7.12/debian/000077500000000000000000000000001476226662700160405ustar00rootroot00000000000000dtkdeclarative-5.7.12/debian/changelog000066400000000000000000000450241476226662700177170ustar00rootroot00000000000000dtkdeclarative (5.7.12) unstable; urgency=medium * feat: using DConfig in the non-GUI thread * fix: missing FocusBorder for WindowButton in TitleBar * feat: Add files generated by qdbusXML2cpp and DCONG2cpp * fix: Popup background does not follow the theme changes * fix: StyledBehindWindowBlur crash in render thread -- YeShanShan Thu, 06 Mar 2025 17:30:28 +0800 dtkdeclarative (5.7.11) unstable; urgency=medium * fix: double click doesn't work for TitleBar * chore: replacing a way to get listview's item * fix: delayed color updates for MenuItem * fix: incorrect width for Menu * feat: export DSysInfo for QML * fit: Add focus style * fix: MinimizeButton behavior mismatch with qwidget -- YeShanShan Thu, 27 Feb 2025 20:48:40 +0800 dtkdeclarative (5.7.10) unstable; urgency=medium * fix: incorrect height for Menu when height is large -- YeShanShan Thu, 13 Feb 2025 17:19:23 +0800 dtkdeclarative (5.7.9) unstable; urgency=medium [ root ] * UNRELEASED -- Deepin Packages Builder Thu, 23 Jan 2025 09:07:08 +0000 dtkdeclarative (5.7.8) unstable; urgency=medium * fix: Menu's focus not be clean * chore: drop shadow for BoxPanel temporarily -- Deepin Packages Builder Tue, 14 Jan 2025 11:17:32 +0000 dtkdeclarative (5.7.7) unstable; urgency=medium * fix: incorrect registering way for qt6 * fix: incorrect Highlight for Menu * fix: item_checked icon was clipped -- Deepin Packages Builder Thu, 09 Jan 2025 09:28:39 +0000 dtkdeclarative (5.7.6) unstable; urgency=medium * fix: arrowlistview not clip * fix: lineedit rightpadding to small * fix: image cache cleared Thanks to Yixue Wang * chore: remove version of imported uri for qt6 * fix: access nullptr when app exited * fix: itemdelegate icon flashed * fix: incorrect scaling of icons under Treeland * fix: adjust UI for MenuItem * fix: adjust UI for Menu and ComboBox * feat: support to flow system settings for scrollBarPolicy -- Deepin Packages Builder Thu, 02 Jan 2025 06:46:45 +0000 dtkdeclarative (5.7.5) unstable; urgency=medium * chore: typo for QT_VERSION * fix: StyledBehindWindowBlur blur failure * fix: ItemDelegate/Checkdelegate hover background missing * feat: Export the alignment property of Combobox -- Deepin Packages Builder Thu, 12 Dec 2024 03:03:54 +0000 dtkdeclarative (5.7.4) unstable; urgency=medium * fix: memory leak * fix: combobox highlight missing * fix: combobox does not display content * fix: Boxshadow displays abnormally in fractional scaling scenarios * fix(build): chameleon version 1.0 -- Deepin Packages Builder Tue, 03 Dec 2024 02:00:46 +0000 dtkdeclarative (5.7.3) unstable; urgency=medium [ root ] * UNRELEASED -- Deepin Packages Builder Wed, 20 Nov 2024 02:19:06 +0000 dtkdeclarative (5.7.2) unstable; urgency=medium * fix: StyledBehindWindowBlur crash in render thread * fix: Adjust menu styles -- Deepin Packages Builder Wed, 13 Nov 2024 01:53:26 +0000 dtkdeclarative (5.7.1) unstable; urgency=medium * feat: Use normal wrap mode instead of WordWrap for ToolTip.Text(Bug: 271423) * fix: the default icon is displayed incorrectly when zooming(Bug: 277471) * fix: shaders conflicting in qt6 -- Deepin Packages Builder Wed, 16 Oct 2024 03:30:45 +0000 dtkdeclarative (5.0.35) unstable; urgency=medium * release 5.0.35 -- Mike Chen Mon, 23 Sep 2024 11:14:20 +0800 dtkdeclarative (5.6.34) unstable; urgency=medium * feat: support to change window effects(Issue: https://github.com/linuxdeepin/developer-center/issues/10322) * fix: can't move dialog window(Issue: #190) -- Deepin Packages Builder Tue, 20 Aug 2024 05:03:51 +0000 dtkdeclarative (5.6.32) unstable; urgency=medium * fix: DCiicon has aliasing when using base64 data(Issue: https://github.com/linuxdeepin/developer-center/issues/8941) * fix: Menu is not blurry enough, and the arrow position is incorrect(Issue: https://github.com/linuxdeepin/developer-center/issues/8631) * fix: the ItemViewport's corners is not smooth -- Deepin Packages Builder Mon, 08 Jul 2024 02:29:21 +0000 dtkdeclarative (5.6.31) unstable; urgency=medium * fix: modify the SearchEdit style(Issue: https://github.com/linuxdeepin/developer-center/issues/8697) * fix: width of insideboxborder(Issue: https://github.com/linuxdeepin/developer-center/issues/8530) * fix: added blurMultiplier adjustment(Issue: https://github.com/linuxdeepin/developer-center/issues/9374) * chore: invalid icon use application-x-desktop -- Deepin Packages Builder Thu, 27 Jun 2024 09:11:34 +0000 dtkdeclarative (5.6.30) unstable; urgency=medium * fix: assert when radius is 0 in transparent window(Issue: https://github.com/linuxdeepin/developer-center/issues/8668) * fix: incomplete display for menu(Issue: https://github.com/linuxdeepin/developer-center/issues/8472) -- Deepin Packages Builder Thu, 30 May 2024 02:46:31 +0000 dtkdeclarative (5.6.29) unstable; urgency=medium * fix: can't display local file for DciIcon -- Deepin Packages Builder Mon, 13 May 2024 03:02:53 +0000 dtkdeclarative (5.6.28) unstable; urgency=medium * chore: incorrect font for SearchEdit's indicator text(Issue: https://github.com/linuxdeepin/developer-center/issues/8040) * chore: Adjusting the transparency of the scrollbar Thanks to zhangkun(Issue: https://github.com/linuxdeepin/developer-center/issues/8049) * fix: icon blurry when half aligned * chore: add margins for Popup with window's edges * fix: lost user settings when Handler is equal user settings(Issue: https://github.com/linuxdeepin/developer-center/issues/7647) * feat: support to disable shadow for FloatingPanel * fix: crash at DQuickItemViewport::updatePaintNode * fix: set shadowOffset when using DWindow * feat: add "blurEnabled" property to BehindWindowBlur * fix: remove debug code * fix: QSGRenderNode::matrix is error if the item in BackdropBlitter * fix: search icon not visible(Issue: https://github.com/linuxdeepin/developer-center/issues/8306) * fix: mask area exist two line for viewport(Issue: https://github.com/linuxdeepin/developer-center/issues/8313) * feat: add "compositionMode" property in ItemViewport * fix: inconsistent implicit size in dci icon -- Deepin Packages Builder Mon, 29 Apr 2024 08:23:45 +0000 dtkdeclarative (5.6.27) unstable; urgency=medium * chore: settings dialog navigation font size tweak(Issue: https://github.com/linuxdeepin/developer-center/issues/7086) * fix: incorrect color type * fix: incorrect color type(Issue: https://github.com/linuxdeepin/developer-center/issues/6841) * chore: update entry_clear.dci(Influence: ) * fix: incorrect control for ColorSelector * refact: export asynchronous property to user * chore: scrollbar hover color tweak(Issue: https://github.com/linuxdeepin/developer-center/issues/7784) * fix: support qt 6.7 * fix: typo and uninitialized asynchronous property * fix: incorrect text color for MenuItem * fix: adjust style for HighlightPanel * fix: can't set placeholder text color for SearchEdit * fix: incorrect control themetype for ColorSelector(issue: 7952) * fix: build on Qt 6.7 * feat: add BackdropBlitter on Qt6 * feat: use BackdropBlitter for InWindowBlur on Qt6 * chore: change theme type for exhibition * feat: export cache property to user * fix: not initialized for BehindWindowBlur * fix: duplicate updates of palette(Issue: https://github.com/linuxdeepin/developer-center/issues/7826) * fix: dci icon not centered(Issue: https://github.com/linuxdeepin/developer-center/issues/7941) -- Deepin Packages Builder Fri, 19 Apr 2024 08:55:37 +0000 dtkdeclarative (5.6.26) unstable; urgency=medium * feat: add corners for BoxShadow * fix: warning for insideBorderColor is invalid * fix: missing initialization value for ShadowConfig * fix: MenuItem can't be highlight by keyboard * fix: incorrect palette in ColorSelector * chore: keep consistent highlight color in different themes * feat: support to specify theme type for window -- Deepin Packages Builder Tue, 26 Mar 2024 05:47:35 +0000 dtkdeclarative (5.6.25) unstable; urgency=medium * fix: can't disable paste(Issue: https://github.com/linuxdeepin/developer-center/issues/7052) -- Deepin Packages Builder Mon, 11 Mar 2024 01:16:26 +0000 dtkdeclarative (5.6.24) unstable; urgency=medium * fix: icon doesn't change when iconTheme changed * feat: support base64 format for icons * fix: build on qt5 * fix: adjust style for launchpad used * fix: adjust style for launchpad used -- YeShanShan Wed, 31 Jan 2024 18:54:10 +0800 dtkdeclarative (5.6.23) unstable; urgency=medium * feat: support to override for external caller * feat: close popup or menu on window deactivate * feat: Optimize flags of RenderNode * fix: failure passing implicit width * chore: enable blur for DialogTitleBar * fix: Multi options selected for Combobox(Issue: https://github.com/linuxdeepin/developer-center/issues/6187) * Revert "fix: failure passing implicit width" * chore: TypeError warning * chore: TypeError warning -- YeShanShan Fri, 19 Jan 2024 14:18:56 +0800 dtkdeclarative (5.6.22) unstable; urgency=medium * fix: no translations for context menu(Issue: https://github.com/linuxdeepin/developer-center/issues/6712) -- Deepin Packages Builder Wed, 10 Jan 2024 02:30:59 +0000 dtkdeclarative (5.6.21) unstable; urgency=medium * chore: remove dtk-exhibition's desktop in debian * chore: remove dtk-exhibition's dekstop in cmake * fix: DciIcon can't load icon by source * fix: find Qt Core before QuickControls2 * fix: insecure RUNPATH in arch * fix: can't find so * feat: add workflow to sync dtk6 * fix: Wrong highlight color in dark theme(Issue: https://github.com/linuxdeepin/developer-center/issues/6015) * fix: missing DeclarativePropertiesTarget * fix: Wrong highlight color in dark theme (Qt6)(Issue: #6015) * fix: There isn't context menu in TextField(Issue: https://github.com/linuxdeepin/developer-center/issues/6521) * Revert "fix: insecure RUNPATH in arch" * fix: insecure RUNPATH in arch * chore: Modify dependecy version in linglong.yaml * chore: Modify field value (kind) in linglong.yaml * chore: Update extra_args and depends in linglong.yaml * fix: Menu's radius following system(Issue: https://github.com/linuxdeepin/developer-center/issues/6380) * fix: DialogWindow abnormal(Issue: https://github.com/linuxdeepin/developer-center/issues/6654) * refact: modify icon's size to 24(Issue: https://github.com/linuxdeepin/developer-center/issues/6291) * fix: blur abnormal in qt6(Issue: https://github.com/linuxdeepin/developer-center/issues/6722) * fix: Menu's rectangle background(Issue: https://github.com/linuxdeepin/developer-center/issues/6363) * Revert "fix: Menu'popup can only work once" -- Deepin Packages Builder Tue, 09 Jan 2024 01:45:44 +0000 dtkdeclarative (5.6.20) unstable; urgency=medium [ root ] * UNRELEASED -- Deepin Packages Builder Tue, 28 Nov 2023 05:40:52 +0000 dtkdeclarative (5.6.19) unstable; urgency=medium [ root ] * UNRELEASED -- Deepin Packages Builder Mon, 23 Oct 2023 07:33:18 +0000 dtkdeclarative (5.6.18) unstable; urgency=medium * fix: NavigationTitle is partially obscured(Issue: #44) * fix: PlaceholderText out of range(Issue: #42) * chore: Update README * chore: correct typos in docs of Settings.ComboBox Thanks to Felix Yan -- Deepin Packages Builder Wed, 18 Oct 2023 06:01:44 +0000 dtkdeclarative (5.6.17) unstable; urgency=medium * Release 5.6.17 -- Deepin Packages Builder Fri, 08 Sep 2023 15:17:44 +0800 dtkdeclarative (5.6.16) unstable; urgency=medium * feat: Adapt to qt6.4.2 * feat: Support install lib and plugins for qt6 * feat: Support install for example and template in qt6 * fix: dpkg-buildpackage faild in qt6 * fix: PKGBUILD qml_install_dir needs to be override -- Deepin Packages Builder Tue, 22 Aug 2023 06:13:45 +0000 dtkdeclarative (5.6.15) unstable; urgency=medium * feat: add UT for ButtonBox * feat: add UT for ArrowBoxPath * chore: add unit test ut_dquickglow * feat: Add UT for DSoftwareRoundedImageNode * feat: Add UT for DBlitFramebufferNode * chore: add unit test ut-iconlabel * feat: Add toImage function for DBlitFramebufferNode * chore: Can't support alpha for simpleTexture in UT * chore: add unit test ut-iconimage * chore: add unit test ut-dciiconimage * feat: Add UT for MaskEffectNode * chore: add unit test ut_dquickdciicon * fix: Compiling error for missing dependency * feat: Add UT for DSGBlurNode * fix: crash in ut_dquickdciiconimage * feat: Add UT for AppLoader-plugin * fix: PDS is not defined * chore: Remove some file for recoverage * chore: add unit test ut-contextMenuWindow * feat: Add UT for BehindWindowBlur * feat: Add UT for DQuickInWindowBlur * chore: Add unit test ut-dquickcoloroverlay * feat: Add UT for DQuickItemViewport * fix: UT failed sometimes * fix: UT failed in qt6 * chore: Add unit test ut_dquickopacitymask * fix: UT failed in qt6 and Software renderer backend * fix: DQuickItemViewport is error in software renderer * chore: Complementary unit test ut-globalobject * fix: UT failed in qt6 * chore(UT): Wait for blur window exposed * fix: UT failed when unreset palette * feat: Add UT for DQuickBlitFrameBuffer * fix: PageIndicator is invalid * feat: Add UT to determine whether QML can load successfully * fix: UT failde sometimes * chore: Complementary unit test ut-dconfigwrapper * feat: Adapt to switch qt6 and qtf for qml-app-template -- Yixue Wang Fri, 11 Aug 2023 14:06:39 +0800 dtkdeclarative (5.6.14) unstable; urgency=medium * fix: typo Thanks to student-ice * feat: Support switching qt5 and qt6 for cmake(Issue: #87) * fix: Unsupported type for property assignment(Issue: #87) * fix: Crashed while debugging in Qt * feat: Support compiling between Qt5 and Qt6(Issue: #87) * feat: Support QQuickPalette in Qt6(Issue: #87) * feat: Forward ContentMenuEvent in Qt6(Issue: #87) * fix: Qt.color is invalid in qt5(Issue: #87) * fix: Imcompatible of the import syntax of Qt6 with Qt5(Issue: #87) * fix: Templates's incompilable * fix: Final property * fix: GraphicalEffect has been droped * fix: Incompilable syntax * fix: Report Network error in qt6(Issue: #87) * fix: Missing Macro for DColor in qt6(Issue: #87) * Fix: Incompilable syntax for qt6(Issue: #87) * Fix: Adapt to qt6 for dtk-exhibition(Issue: #87) * Chore: Rename EnableDtk to EnableQt(Issue: #87) * Fix: Adapt to qt6 for examples(Issue: #87) * fix: Syntax error in qt6(Issue: #87) * fix: ChameleonStyle invalid in qt6(Issue: #87) * feat: Migrate qt5 to qt6 for QSGTexture(Issue: #87) * feat: Forward shaders in qt6(Issue: #87) * feat: Separating qt5 and qt6 for `src`(Issue: #87) * feat: Add macro registing to Qt Meta system(Issue: #87) * refactor: Adjust project structure for qt6(Issue: #87) * feat: Adapt the syntax of `qml import` in qt6(Issue: #87) * fix: TitleBar can't drag in qt6(Issue: #87) * chore: ignore doxygen-theme folder Thanks to LyYeeeYuwu(Issue: #99) * refactor: Remove PixelMetric.js * fix: Remove AboutAction's assignment * chore: Sync by https://github.com/linuxdeepin/.github/commit/559e91167d4919644f37bbcf123eb0651c1528ea(Influence: none) * fix: Missing dtkdeclarative_config.h in dev package * refactor: Deprecate interfaces about PlatformTheme * chore: commit SytledArrowShapeBlur in example * chore: add a log for example * fix: test-recoverage doesn't work * feat: Add unit-test for DAppLoader * chore: put gen header to CMAKE_CURRENT_BINARY_DIR * fix: examples not use qml plugin in source * chore: add icon resouce to example * feat: Add unit-test for qml * fix: unit-test error for color-selector * fix: Missing files to install * fix: Missing Qml registration info in test project * feat: Add ut for DQuickRectangle * feat: Add ut for DQuickWindow and DColor * fix: QuickWindowAttached's enable maybe wrong * feat: Add running property for WaterProgressBar * feat: Add ut for WaterProgressBar * fix: UT memory leak * typo: typo error * feat: Add UT for KeySequence * feat: Add UT for SettingsContainer * fix: Missing dependency for dtkdeclarative * feat: Add UT for ObjectModelProxy * feat: Add UT for MessageManager * fix: Access null object for Action's object * fix: UT memory leak -- Deepin Packages Builder Thu, 27 Jul 2023 06:56:39 +0000 dtkdeclarative (5.6.12) unstable; urgency=medium * fix: a missing library link Thanks to hillwoodroc * feat: Use find_program to find qhelpgenerator and qmlcachegen Thanks to rewine * fix: Missing plugin.json for qml-app-template * fix: qml-app-template wizard failed * fix: Calculation error in DialogTitleBar's width * fix: RadioButton's text color error(Issue: https://github.com/linuxdeepin/dtk/issues/19) -- Deepin Packages Builder Mon, 15 May 2023 13:51:23 +0800 dtkdeclarative (5.6.10) unstable; urgency=medium * Release 5.6.10 * FIX dtk#43 dtk#47 dtk#48 dtk#49 -- Deepin Packages Builder Mon, 17 Apr 2023 17:01:17 +0800 dtkdeclarative (5.6.9) unstable; urgency=medium * Release 5.6.9 * Fix #85 * Fix Crashed when reset static property * Fix #117 -- Deepin Packages Builder Tue, 04 Apr 2023 17:06:37 +0800 dtkdeclarative (5.6.8) unstable; urgency=medium * Allow custom QML plugin install path * Modify AboutDialog's style * Fix application crashed when WindowButton unload * Change docs from qdoc to doxygen and update docs * Change project manager tool from qmake to cmake -- Deepin Packages Builder Wed, 22 Feb 2023 16:06:59 +0800 dtkdeclarative (5.6.3) unstable; urgency=medium * Release 5.6.3 -- Deepin Packages Builder Tue, 20 Dec 2022 11:36:24 +0800 dtkdeclarative (0.0.1) unstable; urgency=medium * Initial release. -- Deepin Packages Builder Wed, 01 Jul 2020 14:14:35 +0800 dtkdeclarative-5.7.12/debian/control000066400000000000000000000036041476226662700174460ustar00rootroot00000000000000Source: dtkdeclarative Section: libs Priority: optional Maintainer: Deepin Packages Builder Build-Depends: debhelper-compat ( =12), cmake, qtdeclarative5-dev, qtbase5-dev-tools, qtquickcontrols2-5-dev, libdtkgui-dev, libdtkcore-dev, qtdeclarative5-private-dev, qtbase5-private-dev, pkg-kde-tools, libgtest-dev, doxygen, qttools5-dev-tools, qttools5-dev, doxyqml, Standards-Version: 3.9.8 Homepage: http://www.deepin.org Package: qml-module-qtquick-controls2-styles-chameleon Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, qml-module-qtquick-shapes (>= 5.11.3), qml-module-qtgraphicaleffects, libdtkdeclarative5( =${binary:Version}) Description: Deepin Tool Kit Qt Quick Controls 2 QML module Dtkdeclarative is base library of Deepin Qt/QtQuick applications. Package: libdtkdeclarative5 Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, libdtkcore5 (>= 5.6.12) Multi-Arch: same Description: Deepin Tool Kit Gui library Dtkdeclarative is base library of Deepin Qt/QtQuick applications. . This package contains the shared libraries. Package: libdtkdeclarative-dev Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, libdtkdeclarative5( =${binary:Version}) Description: Deepin Tool Kit Gui Devel library Dtkdeclarative is base library of Deepin Qt/QtQuick applications. . This package contains the header files and shared libraries of DtkDeclarative Package: libdtkdeclarative-doc Architecture: any Depends: ${misc:Depends} Description: Deepin Tool Kit Gui Devel library (Document) Dtkdeclarative is base library of Deepin Qt/QtQuick applications. Package: dtk-exhibition Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, libdtkdeclarative5( =${binary:Version}), qml-module-qtquick-controls2-styles-chameleon( =${binary:Version}) Description: Deepin Tool Kit QML Controls example. This package contains a applicatioin. dtkdeclarative-5.7.12/debian/copyright000066400000000000000000000020311476226662700177670ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: dtkdeclarative Source: https://github.com/linuxdeepin/dtkdeclarative Files: * Copyright: 2022-2023 UnionTech Software Technology Co., Ltd. License: LGPL-3.0-or-later This package is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. . This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. . You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . On Debian systems, the complete text of the GNU Lesser General Public License version 3 can be found in "/usr/share/common-licenses/LGPL-3". dtkdeclarative-5.7.12/debian/dtk-exhibition.install000066400000000000000000000000271476226662700223510ustar00rootroot00000000000000usr/bin/dtk-exhibition dtkdeclarative-5.7.12/debian/libdtkdeclarative-dev.install000066400000000000000000000001771476226662700236660ustar00rootroot00000000000000usr/lib/*/lib*.so usr/include usr/lib/*/pkgconfig/*.pc usr/lib/*/cmake/*/*.cmake usr/lib/*/qt5/mkspecs/* usr/share/qtcreator/* dtkdeclarative-5.7.12/debian/libdtkdeclarative-doc.install000066400000000000000000000000241476226662700236440ustar00rootroot00000000000000usr/share/qt5/doc/* dtkdeclarative-5.7.12/debian/libdtkdeclarative5.install000066400000000000000000000001271476226662700231720ustar00rootroot00000000000000usr/lib/*/lib*.so.* usr/lib/*/qt5/qml/org/deepin/dtk/* usr/share/*/*/translations/*.qm dtkdeclarative-5.7.12/debian/qml-module-qtquick-controls2-styles-chameleon.install000066400000000000000000000000611476226662700303550ustar00rootroot00000000000000usr/lib/*/qt5/qml/QtQuick/Controls.2/Chameleon/* dtkdeclarative-5.7.12/debian/rules000077500000000000000000000011451476226662700171210ustar00rootroot00000000000000#!/usr/bin/make -f DPKG_EXPORT_BUILDFLAGS = 1 include /usr/share/dpkg/default.mk export QT_SELECT = qt5 DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) VERSION = $(DEB_VERSION_UPSTREAM) PACK_VER = $(shell echo $(VERSION) | awk -F'[+_~-]' '{print $$1}') # Fix: invalid digit "8" in octal constant. e.g. u008 ==> 008 ==> 8 BUILD_VER = $(shell echo $(VERSION) | awk -F'[+_~-]' '{print $$2}' | sed 's/[^0-9]//g' | awk '{print int($$1)}') %: dh $@ override_dh_auto_configure: dh_auto_configure -- -DBUILD_EXAMPLES=OFF -DBUILD_DOCS=ON -DBUILD_VERSION=$(BUILD_VER) -DDTK_VERSION=$(PACK_VER) dtkdeclarative-5.7.12/debian/source/000077500000000000000000000000001476226662700173405ustar00rootroot00000000000000dtkdeclarative-5.7.12/debian/source/format000066400000000000000000000000151476226662700205470ustar00rootroot000000000000003.0 (native) dtkdeclarative-5.7.12/docs/000077500000000000000000000000001476226662700155465ustar00rootroot00000000000000dtkdeclarative-5.7.12/docs/CMakeLists.txt000066400000000000000000000050341476226662700203100ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.10) find_package (Doxygen REQUIRED) set (QCH_INSTALL_DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/qt${QT_VERSION_MAJOR}/doc CACHE STRING "QCH install location") set (DOXYGEN_GENERATE_HTML "YES" CACHE STRING "Doxygen HTML output") set (DOXYGEN_GENERATE_XML "YES" CACHE STRING "Doxygen XML output") set (DOXYGEN_GENERATE_QHP "YES" CACHE STRING "Doxygen QHP output") set (DOXYGEN_FILTER_PATTERNS *.qml=doxyqml CACHE STRING "Extra filter patterns") set (DOXYGEN_FILE_PATTERNS *.cpp *.h *.zh_CN.md *.zh_CN.dox *.qml CACHE STRING "Doxygen File Patterns") set (DOXYGEN_EXTENSION_MAPPING qml=C++ CACHE STRING "Extra extension mapping") set (DOXYGEN_PROJECT_NUMBER ${CMAKE_PROJECT_VERSION} CACHE STRING "") # Should be the same as this project is using. set (DOXYGEN_EXTRACT_STATIC YES) set (DOXYGEN_OUTPUT_LANGUAGE "Chinese" CACHE STRING "Doxygen Output Language") set (DOXYGEN_IMAGE_PATH ${CMAKE_CURRENT_LIST_DIR}/images/) if (EnableQt5) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Help) else() find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ToolsTools) endif() get_target_property(_qhelpgenerator_location Qt${QT_VERSION_MAJOR}::qhelpgenerator IMPORTED_LOCATION) if("${_qhelpgenerator_location}" STREQUAL "") set(_qhelpgenerator_location "qhelpgenerator") endif() set (DOXYGEN_QHG_LOCATION ${_qhelpgenerator_location} CACHE STRING "Doxygen QHG path") set (DOXYGEN_QHP_NAMESPACE "org.deepin.dtk.declarative") set (DOXYGEN_QCH_FILE "dtkdeclarative.qch") set (DOXYGEN_QHP_VIRTUAL_FOLDER "dtkdeclarative") set (DOXYGEN_HTML_EXTRA_STYLESHEET "" CACHE STRING "Doxygen custom stylesheet for HTML output") set (DOXYGEN_TAGFILES "qtcore.tags=qthelp://org.qt-project.qtcore/qtcore/" CACHE STRING "Doxygen tag files") set (DOXYGEM_ALIASES "signal=@typedef") set (DOXYGEN_EXAMPLE_PATH ${CMAKE_CURRENT_LIST_DIR}/snippets/) set (DOXYGEN_PREDEFINED "D_DECL_DEPRECATED_X(x)=" "DCORE_BEGIN_NAMESPACE=namespace Dtk { namespace Core {" "DCORE_END_NAMESPACE=}}" "DCORE_USE_NAMESPACE=using namespace Dtk::Core;" "DQUICK_BEGIN_NAMESPACE=namespace Dtk { namespace Quick {" "DQUICK_END_NAMESPACE=}}" "DQUICK_USE_NAMESPACE=using namespace Dtk::Quick\;" ) set (DOXYGEN_MACRO_EXPANSION "YES") set (DOXYGEN_EXPAND_ONLY_PREDEF "YES") doxygen_add_docs(doxygen ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/docs ALL WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMENT "Generate documentation via Doxygen" ) install(FILES ${PROJECT_BINARY_DIR}/docs/html/dtkdeclarative.qch DESTINATION ${QCH_INSTALL_DESTINATION}) dtkdeclarative-5.7.12/docs/DevSpecification.zh_CN.md000066400000000000000000001420101476226662700223050ustar00rootroot00000000000000@page DevSpecification 开发规范 # 开发规范 ## 字体绑定 为了能够保持和dtkwidget字体属性保持一致的相关接口,能够更方便的通过QML结构和属性绑定原理进行实现,dtkdeclarative中提供了一种便捷的绑定方式如下代码所示,当字体被修改时,所有使用到此字体的控件都会发生改变。 ```qml import org.deepin.dtk 1.0 Text { font: DTK.fontManager.t6 } ``` 与 dtkwidget不同的是,这种字体绑定属性需要处理的代码量更少,阅读性较高。以下代码是 dtkwidget 进行字体绑定的操作: ```cpp QWidget widget; DFontSizeManager::instance()->bind(&widget, DFontSizeManager::T1); ``` 目前dtkdeclarative中提供的一些标准控件都已经添加了默认的字体属性绑定,如ApplicationWindow控件其字体默认绑定为 t6 号。当需要修改字体大小或者添加自定义控件的字体属性时,则手动绑定指定字号即可。 ## 应用图标 DCI图标是dtkdeclarative设计实现的一种新的图标格式,设计该格式主要为了解决QIcon在显示中的局限性,解决图标模式单一、种类繁多以及拓展性不强的问题。DCI图标相关文档在dtkcore和dtkgui也存在。 DCI图标文件整合了控件的各个状态、缩放比以及图标大小为一体,在控件的对应状态,程序的对应缩放比下自动选择合适的图标进行显示。另外,DCI图标能够跟随控件的调色板信息进行颜色调整,因此当前的DCI图标控件并非仅仅作为图标进行显示,更能够作为控件以及组合控件用于界面。例如,当前实现的控件中,Switch控件中的开关样式,Slider控件中的滑块样式等等。 DCI图标也拥有一些隐藏特性,如某些DCI图标存在一个图标边距值(具体内容需要参见设计文档)的属性,这个间距值隐藏在图标内部外部无需关心,但需要了解的是,当图标存在阴影效果时,该边距值就会体现在图标大小不包含阴影上,换句话说,拥有阴影的图标,其阴影不包含在组件的大小中。 图标控件的图标跟随其状态切换,当控件状态或系统主题发生改变时,图标控件会根据设定参数重新绘制指定的图标,由DCI相关类型进行统一查找、解析、绘制。文件大小、图标种类、缩放比、颜色调整、图标状态及图标叠加等等数据归档到了DCI文件内部。 ![DCI图标介绍](images/DS0.png) ### DCI图标需要手动设置的属性 1. sourceSize 需要手动指定DCI图标控件的大小,该大小等价于最后显示在应用中的大小。当设计给出的图标中不包含相对应的大小时,DCI图标在绘制时会进行自适应缩放,以保证与此大小一致, 2. name 需要指定的图标名称,该名称在图标主题规范下定义,默认优先从系统图标主题中寻找,其次在资源文件中寻找,最后在默认的Fallback路径下寻找。一些系统也有的图标文件放置在“/usr/share/dsg/icons”目录下。应用资源文件的图标主题目录分为两种,带主题的图标文件和内嵌图标文件,区别在于带主题的图标文件在不同的图标主题下图标文件不同,而内嵌图标文件对图标主题不敏感,是最终的搜索路径。更多的图标主题细节可以在**图标主题规范**的相关文档中寻找。 **因此,应用程序的图标目录需要严格遵循图标主题规范进行放置,否则DciIcon控件将无法正确找到图标文件** 3. mode mode对应于控件的当前状态,对于Control控件,其状态包含 “Normal”,"Hovered","Pressed","Disabled"四种,如果图标在多种状态下显示的效果不同,该图标需要指定对应的mode来区分当前需要显示状态。由于颜色选择器(ColorSelector)会记录控件的状态,因此如果该控件有颜色选择器,可以通过将颜色选择器的控件状态指定给DciIcon控件,这是一种简便方式;如果控件无法指定颜色选择器,则只能手动进行控件状态的属性绑定。对于颜色选择器的内容,颜色控制中将详细描述。 4. palette palette为DciIcon的专有调色板,与Qt调色板不同的是该调色板目前仅有四种类型,Foreground(前景色)、Background(背景色)、HighlightForeground(高亮前景色)和Highlight(高亮色)。其分别对应与Qt调色板中的WindowText、Window、HighlightedText以及Highlight。由于其一致性,DTK的专有接口中可以直接将这两种调色板类型进行转换,具体函数为 `DTK.makeIconPalette()`。 调色板的主要用途在于:一些场景中某些图标需要在特定情况下发生颜色变化,例如标题栏中的最大化、最小化、关闭按钮以及列表项视图中的图标跟随选中状态进行颜色变化等等。 一个图标不仅仅只包含一个调色板,可能需要多个调色板数据,当某一调色板数据未获取到时,图标中的某一图层或整个图标(若图标只有一个图层或各个图层调色板颜色一致)将不会发生颜色变化。 对应的调色板具体颜色值与设计师所提供的颜色值保持一致,并非一定和控件调色板一一对应,如果仅需要指定某一调色板颜色也可手动指定,例如:`palette.foreground: "red"` 或 `palette.background: control.palette.window`。 dci图标能够根据不同系统主题(深浅主题)选择不同的图标文件,该属性的设置是可选的,如需手动指定其特殊主题显示,则可进行单独设置。 4.1 例如下 DciIcon 控件示例: ```qml Control { id: control DciIcon { sourceSize.width: 32 //对应大小的图标 sourceSize.height: 32 name: "window_menu" // 图标名称 mode: control.ColorSelector.controlState //对应状态下的图标 palette: DTK.makeIconPalette(control.palette) //调整图标颜色,Qt调色板转为dci调色板 theme: DTK.themeType //对应主题下的主题 } } ```
注解
图标控件主要是对.dci文件进行查找、参数解析和组合绘制,本身没有做过多的特例化。

图标未达到所需的效果,可能是控件属性设置错误,也可能是原始的dci图标本身就达不到所需效果。

绘制的图标为正方形,即宽高相等。

### DciIcon的附加属性 dtkdeclarative中几乎所有的控件都已经适配了dciicon,例如:Button, MenuItem以及各种自定义控件。但某些控件由于被qtquick-controls2定义了QIcon的相关接口,因此对于这类控件,可以使用DciIcon的附加属性来设置除QIcon外包含的信息。例如以下示例,由于Button的默认icon接口是Qicon类别,对于DDciIcon的相关属性可以通过以下方式设置: ```qml Button { icon.name: "window_menu" icon.width: 36 icon.height: 36 DciIcon.mode: DTK.ControlState.HoveredState DciIcon.palette { foreground: "red" background: "green" highlightForeground: "white" highlight: "black" } } ``` ### Dtkdeclarative 中默认的 Dci 图标 下述图标只列列举标准状态,即无调色板时的默认状态。仅提供形状,不代表实际场景效果。 | 图标名称 | 效果 | |:-----------------------:|:------------------------:| | action_add | ![图片](images/DS1.png) | | action_compress | ![图片](images/DS2.png) | | action_copy | ![图片](images/DS3.png) | | action_cut | ![图片](images/DS4.png) | | action_decompress | ![图片](images/DS5.png) | | action_delete | ![图片](images/DS6.png) | | action_edit | ![图片](images/DS7.png) | | action_newfolder | ![图片](images/DS8.png) | | action_open | ![图片](images/DS9.png) | | action_paste | ![图片](images/DS10.png) | | action_power | ![图片](images/DS11.png) | | action_redo | ![图片](images/DS12.png) | | action_reduce | ![图片](images/DS13.png) | | action_reset | ![图片](images/DS14.png) | | action_search | ![图片](images/DS15.png) | | action_selectall | ![图片](images/DS16.png) | | action_setting | ![图片](images/DS17.png) | | action_share | ![图片](images/DS18.png) | | arrow_ordinary_down | ![图片](images/DS19.png) | | arrow_ordinary_left | | | arrow_ordinary_right | | | arrow_ordinary_up | | | entry_clear | ![图片](images/DS20.png) | | entry_loadfile | ![图片](images/DS21.png) | | entry_option_arrow_down | ![图片](images/DS22.png) | | entry_password_hide | ![图片](images/DS23.png) | | entry_voice | ![图片](images/DS24.png) | | list_add | ![图片](images/DS25.png) | | list_delete | ![图片](images/DS26.png) | | menu_arrow | ![图片](images/DS27.png) | | menu_select | ![图片](images/DS28.png) | | window_close | ![图片](images/DS29.png) | | window_maximize | ![图片](images/DS30.png) | | window_menu | ![图片](images/DS31.png) | | window_minimize | ![图片](images/DS32.png) | | window_quit_full | ![图片](images/DS33.png) | | window_restore | ![图片](images/DS34.png) | | window_sidebar | ![图片](images/DS35.png) | ## 颜色控制 ![颜色控制器架构图](images/DS36.png) 颜色控制器(颜色选择器、ColorSelector)是dtkdeclarative项目中专门用于替代QPalette而实现的一套取色系统。该系统能够根据控件状态自由选择颜色,但其又并非完全摒弃QPalette,某些调色板信息仍可以在dtkdeclarative中进行使用,如高亮色以及高亮前景色。dtkdeclarative推荐使用ColorSelector进行颜色绑定,其优点将会在下述描述中列出。 对于QPalette,其缺点在于颜色类型过于单调,调色板颜色数据仅仅只有一套,当出现控件有多个状态时,如果颜色差异较大,只能选择用不同的颜色类型进行替代。这样的编码方式在qml中显得冗杂且局限。为了能够更方便的使用 Qml 的属性绑定特性,创建每个控件独有的颜色调色板,然后根据每个控件的状态选择其调色板数据中对应状态的颜色作用在控件上。颜色控制器的大致实现原理就是如此。 颜色控制系统可以分为三个层次:调色板、控件属性和取色器。取色器作为监听者,能够监听这二者的变化,除此之外,取色器会根据当前绑定的控件状态、控件对象等等信息自动更改颜色。下面给出一个简单的示例代码: ```qml Control { id: control width: 500 height: 50 property Palette backgroundColor: Palette { normal: "black" } property Palette textColor: Palette { normal: "white" } contentItem: Text { text: "Test......." color: control.ColorSelector.textColor horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter } background: Rectangle { width: 250 height: 50 color: control.ColorSelector.backgroundColor } } ```
注解
当控件类型继承于 Control 或者控件存在调色板数据时,该控件的ColorSelector 附加属性才会被创建。

如果当前控件非继承于Control类型,且具备创建ColorSelector的条件,该ColorSelector将寻找其最上层父类的Control控件,并进行调色板和控件状态的更新绑定。

ColorSelector仅会监听当前控件和离它最近的父类Control控件的调色板属性。其中间父类不论是否存在ColorSelector对象,都不会读取和绑定。
### Palette DTK设计实现的调色板数据类,它作为ColorSelector进行颜色选择的载体,通常情况下具有“Normal”,“Hovered”,“Pressed”以及“Disabled”四种类别,与控件的这四种类型一一对应。例如一下代码: ```qml Palette { id: palette normal: "red" hovered: "green" pressed: "blue" disabled: "black" } ``` 如果开发某一控件仅具备某一种或多种状态,不存在的状态颜色值可以不必指定。相反,如果控件具备某种状态,但该种状态的颜色值并未指定,则ColorSelector将使用“Normal”状态下的颜色来替代。 * 暗色主题 调色板类型区分了暗色主题下的情况。相对于一般情况,暗色主题在各个状态中添加了“Dark”关键字,例如 “normalDark”、“hoveredDark”、“pressedDark”以及“diabledDark”等。例如以下代码: ```qml Palette { id: palette normal: "red" normalDark: "black" hovered: "green" hoveredDark: "yellow" } ``` * 是否可用(enabled) 默认情况下,该属性为启用状态,当该属性设置为false时,取色器将忽略该属性再向上进行查找。例如一下代码: ```qml Palette { id: palette normal: "red" enabled: false } ``` * 颜色族(family) 调色板具备颜色族的属性,目前可供使用的颜色族有两种:“Common”和“Crystal”。调色板默认的颜色族为“Common”,即当调色板未指定颜色族时其默认的颜色族就是“Common”,例如上述示例代码。同样的,可以通过指定不同颜色族来指定其独立的颜色属性,例如以下代码: ```qml Palette { normal { common: "#f0f0f0" crystal: Qt.rgba(0.20, 0.2, 0.2, 0.1) } hovered: "#d2d2d2" // common family pressed.crystal: "#cdd6e0" // crystal family } ``` 颜色族的属性可以在ColorSelector中进行切换并在控件颜色变化中进行展示,当一个控件的窗口背景(这里指其所在的窗口而非应用窗口)在如下场景中,且其调色板颜色都为同一颜色时,这个控件才可以只提供 "common" 颜色族,否则这两种颜色族的颜色都应该被正确指定。 1. 窗口背景是纯色背景 2. 窗口背景是一个图片 3. 窗口背景是透明模糊背景 当控件被指定了两种颜色族时,ColorSelector 会根据其所在的 Control 父控件所使用的颜色族,使用适合当前场景的颜色。 如可通过如下代码手动修改控件的当前颜色族: ```qml Button { ColorSelector.family: Palette.CrystalColor text: "Button" } ``` 目前在 dtkclarative 提供的控件中,当控件处于 DialogWindow 中时,自动会使用其 CrystalColor 颜色族,而在 ApplicationWindow 中时,其颜色族为 CommonColor。 * QPalette适配 上述介绍到调色板能够适配高亮色(Highlight)以及高亮文本色(HighlightText)的调色板信息,目前dtkdeclarative适配的只有这两种类型。对于这种类型的使用方式如下示例代码: ```c++ Palette { normal: DTK.makeColor(Color.Highlight) hovered: DTK.makeColor(Color.Highlight).lightness(+10) pressed: DTK.makeColor(Color.Highlight).opacity(-10) } ``` 调色板类型在创建颜色时,能够进行颜色微调。由于目前的使用场景中,仅在亮度(lightness)和不透明度(opacity)的调整居多,因此颜色值中只保留了对这两个颜色属性的调整。该颜色调整取值范围为[-100, +100],每调整10个单位数值就等于调整10%的对应属性。 ### QPalette QPalette 在 QML 中的角色是一系列不同颜色类型的集合,如背景色、前景色、高亮色以及高亮文本色等等。和 QWidget 中的 QPalette 不同的是,它没有 QPalette 表示不同状态时的颜色,其配色方案只有一套,如需修改就必须手动调整该调色板的值。当控件使用的颜色不会跟随控件的状态发生较多的变化,或控件使用的颜色是一种通用情况下的颜色(与具体控件无关)时,可以直接使用 QPalette 对应的颜色角色,下表列出 QPalette 能够使用的颜色角色: | **角色名** | **描述** | | :------------ | :------------------- | | window | 通用的背景色 | | windowText | 通用的前景色 | | highlight | 高亮色 | | highlightText | 高亮背景下的文本颜色 | 除此之外,**其他调色板颜色在 dtkdeclarative 开发中不宜出现**,当自定义控件时需要出现与控件相绑定的特殊颜色时,请使用 ColorSelector 。 ### ColorSelector #### ColorSelector 跟随颜色变化 上述简述简单提及了颜色控制器的简单用法,下面描述一下颜色控制器跟随颜色变化的使用场景和高级用法。 1. 颜色控制器能根据控件状态发生颜色变化 ```qml import org.deepin.dtk 1.0 Control { id: control width: 50 height: 50 hoverEnabled: true // 开启 Hover 属性 property Palette backgroundColor: Palette { normal: "red" hovered: "green" } Rectangle { anchors.fill: parent color: control.ColorSelector.backgroundColor } } ``` 上述代码描述了Control控件在hovered状态下颜色从“red”向“green”自动变化的过程。值得注意的是,对于其子类Rectangle而言,由于没有独立的Palette属性,因此无法直接使用其ColorSelector附加属性,只能获取其Control父类的ColorSelector对象进行使用。如果上述代码成为以下形式,则可以使用自身的ColorSelector对象: ```qml import org.deepin.dtk 1.0 Control { id: control width: 50 height: 50 hoverEnabled: true // 开启 Hover 属性 Rectangle { property Palette backgroundColor: Palette { normal: "red" hovered: "green" } anchors.fill: parent color: ColorSelector.backgroundColor } } ``` 2. 手动调整调色板的颜色值,控件颜色会跟随变化 将上述示例修改为如下形式,可以看出:手动修改调色板颜色值,ColorSelecor能够跟随更新。 ```qml import org.deepin.dtk 1.0 Control { id: control width: 50 height: 50 hoverEnabled: true // 开启 Hover 属性 Rectangle { id: rect property Palette backgroundColor: Palette { normal: "red" hovered: "green" } anchors.fill: parent color: ColorSelector.backgroundColor MouseArea { anchors.fill: parent onClicked: { // 鼠标单击改变颜色 rect.backgroundColor.hovered = "yellow" } } } } ``` ColorSelector能够支持调色板属性在重新赋值时的颜色更新,上述示例修改后的代码如下: ```qml import org.deepin.dtk 1.0 Control { id: control width: 50 height: 50 hoverEnabled: true // 开启 Hover 属性 Rectangle { id: rect property Palette backgroundColor: Palette { normal: "red" hovered: "green" } anchors.fill: parent color: ColorSelector.backgroundColor MouseArea { Palette { id: otherPalette normal: "black" hovered: "gray" } anchors.fill: parent onClicked: { // 鼠标单击改变颜色 rect.backgroundColor = otherPalette } } } } ``` 3. 修改ColorSelector的颜色属性,控件颜色跟随修改 不光针对属性的修改能够生效,当直接修改ColorSelector对应的颜色属性时,同样能够更新所有使用到该颜色属性的控件,上述代码可以修改为如下形式: ```qml import org.deepin.dtk 1.0 Control { id: control width: 50 height: 50 hoverEnabled: true // 开启 Hover 属性 Rectangle { id: rect property Palette backgroundColor: Palette { normal: "red" hovered: "green" } anchors.fill: parent color: ColorSelector.backgroundColor MouseArea { anchors.fill: parent onClicked: { // 鼠标单击改变调色板 Palette { id: otherOPalette normal: "black" hovered: "gray" } rect.ColorSelector.backgroundColor = otherPalette } } } } ``` 使用ColorSelector修改调色板属性时,一般都能进行复原,常规做法是赋值为 “undefined”,例如以下代码: ```qml import org.deepin.dtk 1.0 Control { id: control width: 50 height: 50 hoverEnabled: true // 开启 Hover 属性 Rectangle { id: rect property Palette backgroundColor: Palette { normal: "red" hovered: "green" } anchors.fill: parent color: ColorSelector.backgroundColor MouseArea { anchors.fill: parent onClicked: { // 单击修改调色板 Palette { id: otherPalette normal: "black" hovered: "gray" } rect.ColorSelector.backgroundColor = otherPalette } onDoubleClicked: { // 双击恢复为默认值 rect.ColorSelector.backgroundColor = undefined } } } } ``` 4. 子控件能通过其自身的ColorSelector获取到Control控件的调色板颜色 上述描述中已经提及,ColorSelector属性能够获取其自身对象以及其最近的Control控件的调色板属性,并监听Control控件的状态变化,进行颜色属性的自动更新。以下示例展示了控件获取Control控件的调色板代码: ```qml import org.deepin.dtk 1.0 Control { id: control width: 200 height: 200 hoverEnabled: true // 开启 Hover 属性 property Palette backgroundColor: Palette { normal: "red" hovered: "green" } background: Rectangle { property Palette borderColor: Palette { normal: "blue" hovered: "yellow" } color: ColorSelector.backgroundColor // 继承Control类中的backgroundColor调色板属性 border.width: 2 border.color: ColorSelector.borderColor // 获取自身的borderColor调色板属性 } } ``` 5. 控件父类发生变化后,ColorSelector绑定的颜色属性同样自动发生变化 由于ColorSelector的状态变化根据其父类Control控件,并且能获取到对应控件的Palette调色板数据,因此当Control父类控件发生变化时,控件的Palette属性也会发生。ColorSelector会自动检测这种变化并作用到正在显示的颜色属性中,如果ColorSelector发现改变后的父类仍保存相同名称的颜色调色板,ColorSelector的颜色属性会自动变化成该颜色,当发现改变后的父类没有相同名称的颜色调色板,ColorSelector会将颜色置空(即变成黑色),例如以下示例代码。 ```qml import org.deepin.dtk 1.0 Rectangle { // 父类矩形中包含两个子类Control控件     width: 500     height: 50     Control { // Control控件中包含Rectangle子控件,演示父类转换         id: control1         width: 220         height: 50         anchors.left: parent.left         anchors.top: parent.top // Control控件的背景色调色板属性被应用到矩形子控件的颜色中         property Palette backgroundColor: Palette {             normal: "gray"         }         Rectangle {             property Palette borderColor: Palette {                 normal: "red"             }             id: reparentRect1             width: 50             height: 50             color: ColorSelector.backgroundColor             border.width: 2             border.color: ColorSelector.borderColor             MouseArea {                 anchors.fill: parent                 onClicked: { // 点击切换reparentRect1的父类                     if (reparentRect1.parent == control1)                         reparentRect1.state = "reparent2"                     else                         reparentRect1.state = "reparent1"                 }             } // 父类发生改变时,ColorSelector自动检测到父类Control的变化调整背景色颜色值             states: [ // 使用状态属性添加添加父类转换的两种不同属性                 State {                     name: "reparent1"                     ParentChange {                         target: reparentRect1                         parent: control1                         x: 0                         y: 0                     }                 },                 State {                     name: "reparent2"                     ParentChange {                         target: reparentRect1                         parent: control2                         x: 60                         y: 0                     }                 }             ]         }     }     Control {         id: control2         width: 220         height: 50         anchors.left: control1.right         anchors.leftMargin: 10         anchors.top: parent.top // ColorSelector会在父类Control变化后自动检测backgroundColor的颜色值         property Palette backgroundColor: Palette { // 该颜色和Control1控件不同进行颜色区分             normal: "red"         }         Rectangle { // 自身存在调色板属性其自身才会创建ColorSelector对象,并寻找Control父类的变化             property Palette borderColor: Palette {                 normal: "gray"             }             id: reparentRect2             width: 50             height: 50             color: ColorSelector.backgroundColor             border.width: 2             border.color: ColorSelector.borderColor             MouseArea {                 anchors.fill: parent                 onClicked: { // 点击切换reparentRect2的父类                     if (reparentRect2.parent == control1)                         reparentRect2.state = "reparent2"                     else                         reparentRect2.state = "reparent1"                 }             }             states: [                 State {                     name: "reparent1"                     ParentChange {                         target: reparentRect2                         parent: control1                         x: 60                         y: 0                     }                 },                 State {                     name: "reparent2"                     ParentChange {                         target: reparentRect2                         parent: control2                         x: 0                         y: 0                     }                 }             ]         }     } } ``` 6. 已封装好的控件不推荐创建相同调色板属性,而推荐直接进行颜色覆盖 当使用ColorSelector封装好某一自定义控件时,外部无需创建和控件内封装一致的调色板属性,当需要自定义的颜色替换时可直接进行属性替换。例如以下代码: 创建 TestControl.qml 文件并写入以下代码: ```qml import org.deepin.dtk 1.0 Control { id: control hoverEnabled: true // 开启 Hover 属性 property Palette backgroundColor: Palette { normal: "red" hovered: "green" } background: Rectangle { property Palette borderColor: Palette { normal: "blue" hovered: "yellow" } id: rect color: ColorSelector.backgroundColor border.width: 2 border.color: ColorSelector.borderColor } } ``` 在新的测试文件中使用这个封装好的自定义控件: ```qml Row { width: 200 height: 100 TestControl { width: 50 height: 50 // Correctly backgroundColor: Palette { normal: "cyan" hovered: "magenta" } } TestControl { width: 50 height: 50 // Wrongful 这种方式将无法进行属性替换 property Palette backgroundColor: Palette { normal: "gray" hovered: "black" } } } ``` 上述代码的场景应用于某个控件在不同情况下可能有颜色属性不一致的情况,对于已有的调色板属性可以直接进行属性替换,其内部的ColorSelector对象会检测到该种变化并处理。 #### ColorSelector 状态设置 ColorSelector 可以进行控件单一状态(hovered、pressed、disabled、inactived)的设置。默认情况下,各个状态都是处于未设置的状态,即不针对某一状态进行单独处理而默认接受所有状态的改变。 1. 将控件的某一状态作为标准状态 例如当有将控件的“hovered”作为其显示的标准状态时,可以将代码写成如下形式: ```qml Rectangle { width: 200 height: 300 Button { anchors.centerIn: parent text: "Hovered state" ColorSelector.hovered: true } } ``` 2. 控件禁用某一状态 例如如果需要禁用控件的“hovered”状态时 ```qml Rectangle { width: 200 height: 300 Button { anchors.centerIn: parent text: "Can't Hovered" ColorSelector.hovered: false } } ``` 3. 多种状态的叠加 禁用状态和启用状态可以同时使用,例如如下示例代码: ```qml Rectangle { width: 200 height: 300 Button { anchors.centerIn: parent text: "Only Hovered" ColorSelector.hovered: true ColorSelector.pressed: false ColorSelector.disabled: false } } ``` 上述代码中将“hovered”状态设置为标准状态,且禁用了“pressed”和“disabled”状态,因此示例中的按钮将展示“hovered”状态且不接受按钮的其他状态。
注解
状态控制仅接受真实bool值的设置,不针对属性绑定

推荐某个控件只有一种状态被启用,当多个状态启用的情况下,标准状态修改哪种按照控件的情况而定。
### 标准控件的 Palette 属性对照 dtkclarative 提供的标准控件中,能够通过替换其 Palette 属性来控制控件的自定义颜色。例如一个 Button 控件的文字颜色可用如下方式修改: ```qml import org.deepin.dtk 1.0 Button { textColor: Palette { normal: "red" hovered: "blue" } } // 或 import org.deepin.dtk 1.0 Button { palette.windowText: "green" } ``` 如 HighlightPanel 控件修改背景色的方式如下: ```qml import org.deepin.dtk 1.0 HighlightPanel { backgroundColor: Palette { normal: "red" } } ``` 下表列出基础控件可被替换修改的调色板颜色属性值(按字母顺序排序): | **控件** | **属性** | **描述** | | :------------------ | :---------------------- | :------------------------------------------------------ | | ActionButton | textColor | 按钮的文本和图标的颜色 | | BoxPanel | color1 | Box 或 Button 控件的背景渐变色1 | | | color2 | Box 或 Button 控件的背景渐变色2 | | | insideBorderColor | Box 或 Button 控件的内描边颜色 | | | outsideBorderColor | Box 或 Button 控件的外描边颜色 | | | dropShadowColor | Box 或 Button 控件的外阴影颜色 | | | innerShadowColor1 | Box 或 Button 控件的内阴影渐变颜色1 | | | innerShadowColor2 | Box 或 Button 控件的内阴影颜色2 | | BusyIndicator | fillColor | BusyIndicator 的填充色 | | Button | textColor | 按钮控件中的文本和图标颜色 | | ButtonIndicator | backgroundColor | ButtonIndicator的背景颜色 | | ButtonPanel | 继承于 BoxPanel | 能使用 BoxPanel 中的所有调色板颜色 | | CheckDelegate | backgroundColor | CheckDelegate控件的背景色 | | ComboBox | separatorColor | ComboBox在编辑状态下的分隔符颜色 | | EditPanel | backgroundColor | 所有的编辑框背景色 | | | alertBackgroundColor | 所有编辑框在显示警告信息时的背景颜色 | | EmbeddedProgressBar | backgroundColor | 嵌入式进度条的背景颜色 | | | progressBackgroundColor | 嵌入式进度条的进度背景色 | | FloatingButton | 继承于 Button | 能使用 Button 控件中的所有调色板颜色 | | FloatingPanel | backgroundColor | FloatingPanel控件的背景颜色 | | | dropShadowColor | FloatingPanel的外阴影颜色 | | | borderColor | FloatingPanel的边框颜色 | | HighlightPanel | backgroundColor | HighlightPanel的背景颜色 | | | outerShadowColor | HighlightPanel的外阴影颜色 | | | innerShadowColor | HighlightPanel的内阴影颜色 | | IpV4LineEdit | backgroundColor | IpV4LineEdit的背景框颜色 | | ItemDelegate | checkedTextColor | ItemDelegate在选中时的文本颜色 | | KeySequenceEdit | backgroundColor | KeySequenceEdit控件的背景颜色 | | | placeholderTextColor | KeySequenceEdit的占位文本颜色 | | MenuItem | subMenuBackgroundColor | 子菜单的背景色 | | | itemColor | 文字和图标Hovered状态下的颜色 | | Slider | grooveColor | Slider控件的滑槽背景颜色 | | SliderTipItem | tickColor | Slider控件标签的背景颜色 | | | textColor | Slider控件标签的文本颜色 | | SpinBoxIndicator | inactiveBackgroundColor | SpinBox右侧指示按钮在未激活状态时的背景颜色 | | Switch | backgroundColor | Switch按钮的背景颜色 | | | handleColor | Switch按钮的滑槽颜色 | | TextField | backgroundColor | TextField控件的背景颜色 | | TitleBar | textColor | TitleBar控件的文本和图标颜色 | | ToolButton | textColor | ToolButton控件的文本和图标颜色 | | WarningButton | 继承于 Button | 能使用 Button 控件中的所有调色板颜色 | | WaterProgressBar | backgroundColor1 | WaterProgressBar的背景渐变色1 | | | backgroundColor2 | WaterProgressBar的背景渐变色2 | | | dropShadowColor | WaterProgressBar的外阴影颜色 | | | popBackgroundColor | WaterProgressBar的内置小气泡背景颜色 | | | textColor | WaterProgressBar的文本颜色 | | WindowButton | textColor | WindowButton控件的文本和图标颜色 | | WindowButtonGroup | textColor | WindowButtonGroup内所有WindowButton控件的文本和图标颜色 | ## Settings dtkdeclarative适配了配置策略中所有的内容,为了更方便的对接配置策略,将配置策略和qml语法相结合,dtkdeclarative设计实现了一套全新的Settings框架。 ### Config 配置 关于配置策略相关指南,请参见[配置策略使用说明](\)TODO:(此链接暂时无效,待文档开放后修复) ,dtkdeclarative封装了C++中的配置策略属性实例,通过“Config”项指定,例如以下代码: ```qml Config { name: "example" // 必须指定 property int key1 : 1 property string key2 : "key2 default" } ``` subpath属性用于指定文件查找路径,默认情况可以不指定,将直接从“appid”和“name”获取对应的路径进行查找。 Config 项可以直接通过QML属性的形式指定基础的键值类型,例如上述实例代码,该属性也能直接在控件的槽函数中进行绑定,例如以下代码: ```qml Config { id: config name: "example" // 必须指定 property int key1 : 1 property string key2 : "key2 default" onKey2Changed: { console.info("Config") } } LineEdit { text: config.key2 } ``` 对于外部修改的配置项值,Config能够接受其变化并发出对应属性修改的信号,QML中能够监听该信号,并进行文本的实时绑定,监听的方式有两种,如下代码所示: ```qml Config { id: config name: "example" // 必须指定 property int key1 : 1 property string key2 : "key2 default" onKey2Changed: { console.info("Config Value changed...") } } // 1. 直接进行属性绑定 Label { text: "property binding key3:" + exampleConfig.key3 } // 2. Qt.binding 进行属性绑定 Label { text: "config.key2" Component.onCompleted: { text = Qt.binding(function(){ return config.key2 }) } } ```
注意
Config 中声明的属性,在对应的配置文件中需要有对应的键值,对于Config中新增的属性,不会直接生效到配置文件去;相反对于配置文件中有的键值,Config中没有对应属性时,若该值发生变化,将触发Config中valueChanged的信号,控件可以通过使用Connection 或者 槽函数绑定的形式动态获取,例如以下代码:

```qml Config { id: config name: "example" // 必须指定 property int key1 : 1 property string key2 : "key2 default" // 1. 直接通过信号槽进行连接 onValueChanged: { console.info("Config Key:", key, "Config Value:", config.value(key)) } // 2. 通过Connection进行连接 Connection { target: config // 5.11 的写法 onValueChanged: { console.info("Config Key:", key, "Config Value:", config.value(key)) } // 5.15推荐写法 function onValueChanged(key) { console.info("Config Key:", key, "Config Value:", config.value(key)) } } } ``` ### SettingDialog 相关 dtkdeclarative中的SettingDialog能够更加方便的使用QML语法,更方便的控制布局和样式,同时还能够完成与配置策略的关联。 dtkwidget中的SettingDialog通过解析Json文件,完成布局和控件的添加。这种方式存在一些局限性,例如布局的局限性,导致一些高级组合控件无法正常显示;界面的改动能够导致各个控件都出现相应的影响等等。 为了解决与QML的融合,能够使用树状代码结构的形式创建控件,摒弃Json的繁琐性和不易阅读性,并方便配置的统一管理,SettingDialog有一套统一的控件模板。 以下展示一个简单的SettingDialog示例代码: ```qml import org.deepin.dtk.settings 1.0 as Settings Config { // 创建配置项 用于关联到SettingDialog中 id: config name: "example" property string key : "key default" // 配置文件中需要有同名键 } Settings.SettingsDialog { height: 600 width: 680 config: config groups: [ // 创建配置组,管理配置子组和Options Settings.SettingsGroup { key: "group1" name: "group1" Settings.SettingsOption { key: "key" // Option中的键可以直接绑定到config中同名的属性值 name: "ComboBox" Settings.ComboBox { // Settings封装的基础控件类型 model: ["first", "second", "three"] } } Settings.SettingsOption { key: "key2" name: "LineEdit" Settings.LineEdit {} } Settings.SettingsOption { key: "canExit" name: "CheckBox" Settings.CheckBox {} } } ] } ``` 上述示例简单的展示了一个 SettingDialog 整体树构建过程,对于其中的细节和控件,以下将进行重点介绍: #### SettingsGroup和SettingsOption SettingsDialog的子项通过groups属性管理和维护,在窗口组件添加完毕后,它会获取到所有的groups项目树,并根据其父子关系进行左侧标题栏的生成和右侧内容页的展示。SettingsGroup就是添加进groups属性的数组子项。 **SettingsGroup:** 其内部用于管理Options,也可以添加子Group,当group存在多个子group时,需要指定其为children对象: ```bash Settings.SettingsDialog { height: 600 width: 680 groups: [ // 创建配置组,管理配置子组和Options Settings.SettingsGroup { key: "group1" name: "group1" children: [ Settings.SettingsGroup { key: "group2" name: "group2" Settings.SettingsOption { key: "key" // Option中的键可以直接绑定到config中同名的属性值 name: "ComboBox" Settings.ComboBox { // Settings封装的基础控件类型 model: ["first", "second", "three"] } } }, Settings.SettingsGroup { key: "group2" name: "group2" Settings.SettingsOption { key: "key2" name: "LineEdit" Settings.LineEdit {} } } ] } } ``` **SettingsOption:**SettingsGroup的子项,其内部用于添加控件,进行用户操作。和SettingsGroup一致的是它们都有 key 和、name以及visible 三个属性,但不同的是,SettingsOption中的“key”直接对应与 Config 中对应名称属性,而无需进行手动绑定;SettingsGroup 中的“key”通常用于进行以下过滤操作,例如通过单一的“key”过滤出对应的group并控制它们的显示与隐藏。 **附加属性:**SettingsGroup和SettingsOption都有附加属性,对于SettingsGroup和SettingsOption中子控件想要获取他们属性时,可以通过附加属性进行获取。不论是SettingsGroup还是SettingsOption,他们的附加属性返回的对象为距离其最近的父类SettingsGroup/SettingsOption对象。 #### Settings封装的控件 settings 封装的控件与自定义控件不同,它能够获取对应SettingsOption中的“name”属性并自动添加左右布局的标题描述,同时其属性的改动无需绑定即可自动生效到配置文件中,例如ComboBox效果图如下图所示: ![图片](images/DS37.png) 目前被Settings封装好的控件如下表所示(*默认添加别名*): | 控件名称 | Settings控件名称 | | :------- | :---------------- | | CheckBox | Settings.CheckBox | | ComboBox | Settings.ComboBox | | LineEdit | Settings.LineEdit | 添加到SettingsOption中的自定义控件,也能实现上述封装控件的样子,SettingDialog封装了OptionDelegate控件,对于需要左侧显示名称右侧显示控件的设计需求,可以直接将自定义控件放到OptionDelegate中,如下代码所示: ```qml Settings.SettingsGroup { key: "group2" name: "group2" Settings.SettingsOption { key: "option1" name: "group2.group1.option1" Settings.OptionDelegate { LineEdit { text: Settings.SettingsOption.name // Option中的附加属性获取距离最上层的Option对象的name属性 onEditingFinished: { // 需要手动更新配置项的value属性 Settings.SettingsOption.value = text // Option中的附加属性获取距离最上层的Option对象的value属性 } } } ] } ```
注意
需要注意的是,对于此类自定义控件,其Option中对应的value值需要自定义控件进行手动绑定。
#### 其他属性 下表列出了SettingDialog中的其他属性,并简单介绍: | 属性名 | 子属性 | 描述 | | :------------- | :----------------- | :----------------------------------------------------- | | groups | 无 | 配置项列表,用于添加SettingsGroup/SettingsOption配置项 | | config | 无 | 配置策略 | | container | config | 配置策略 | | | navigationTitle | 导航栏标题,可重载,默认使用Settings.NavigationTitle | | | contentTitle | 内容页标题,可重载,默认使用Settings.ContentTitle | | | contentBackground | 内容页背景,可重载,默认使用Settings.ContentBackground | | | groups | 配置项列表 | | navigationView | ListView中的子属性 | 导航列表 | | contentView | ListView中的子属性 | 内容页列表 | dtkdeclarative-5.7.12/docs/images/000077500000000000000000000000001476226662700170135ustar00rootroot00000000000000dtkdeclarative-5.7.12/docs/images/AboutDialog.png000066400000000000000000000272441476226662700217240ustar00rootroot00000000000000PNG  IHDRQ pHYs+ IDATxy\T? . "* HKYmqiQ+V[ޯni٭~YZ撥f*in60@oݫ"ǜe^Xqq m}(ZH$ǁryl2 `Yghˬ`jnnn3jZ&8R٭[7 9!;;^Ѵ=oy\UUЉ&ܢsιXW3FV*J;۠)55I. Lp S?sIuuuӦMOnzyB:C ϟ]쭁J+Vi܍z!o}kתT^2eT؏1yBfuqq ˍ1777wɷxP=O̺2gΜE)Jk+(ܥS*mneQ^=72O]?-rrtt\bEN;kw}әgzV Htq".yBą2OP (((&&&((v/]9s8ٳ;wwppM$]Acc5k֯_o4~:..NBK۷+^yX޽e2뢌Fu͛T*&CͳX,6ldPwwwD)6fff8qԩSvvvvvvRufѻϯZȑ# CNNs~8l6֭+((hۧO1[~Çھ5..nڴi#FPT㓓[ ֯_߽{#Ft֐GٶM&%%h4lNLL2eO<}jO<ɓ[{.㉉tQ޶ݻwڵݺu{W V__o6gϞ=sL\V\ps<y>///%%㸰0BѳgOt…^xaܸq/^  cHn;j۰z8^X,YSRRrś6m zϟꫯJ$x7K,INNCw6,--*JX8d:t# L6rȡCZ%L&k]FQTONKK뀭!weކeeeegg,[lڵmOrrr8q>|„ NNN׍tk׮]lYAAAvvvVVm(=$?o˷mLJJjm]r_paLLu/^xRz{tzVeggggg|3gl_[999͜9>hx999mnĶPl;zL{˗/={ƍߟ0||dmjbC(󶪾qNNNaaa^^^:nǎ  `0z;;'VUU;v,==.**jԨQ^^^.\ȨyuQmJ{l={^}[=<<&N8{~YǔZjcǎ}g322V\m69O>`GGlj'N8Q{o޽ y[U__o2‚ZvW—3fظqhk׮UVà $''H6GԚ֐^ti``F kimٰ`^z򶓆 uҥۭZ7<cʔ)Æ k;R.+ ͍a(6,""b[lIMM߿VV֯:aooiӦ|ͪuo=j瞛6mD")))IHH3fLHHHjjٳg'Oq6ny1r#G;K,ill4L/Jz n T*pqqj%nk׼yf͚RV^'t%K(J4rHj4ڟmÆ 9rhj& NKHHطoZ/XbȐ!]GDD&"""<<T*2dȊ+^|EӬۗ`=d2iZ8rP=ojQ=j& JGuEDDƶ;fooӧ1š 4hP|||y-<Ųv%KXoq[o͝;._|ɒ%{o̙3oqѽlq!!!faܸqO>u[l1 >>>UpС_~8___e.\P/3<"6]R|'Ͷ^K;v~ԩH{MMM111 ..J.O>u Tw `%$$=ztݺuO`6M&S޽$%%߿@RYSRR6mTRRٳ'O\~sΝ+P_}A|[o|'Nh;z.]l6K_7P(3Xeddddd/Zh̙Tw%tKQ*sY|СC[E6Weee[țt˼T*{/_>g |Cj$I||-[ˈ-trrrҴZ)ԭ3:uĉZ6--c_~͛㩗cu]Yyyybb?xرZkuF:uj||(W KvٛUb3IdL$mH:gt<տo} ޤ?Є?tx{V8WgqOR9I}Ւ?hs=?Snv5lܜ\$swnع+c0!؁߿eSemRN/?]&O>>*j1;iǚ,NJA -Bߘ6־.ѣ-2_IX-}>h򁪖T}rة$ࢷ6g͙`?_:a?_ x|w0̚^]P,I1k,M;z3>=?I9{8q'^=$2/ԾO/12Aah{f!60fltݙ}ǜ{=8=`)HZs=rO|Yh( ǏO(XsQv v1ehn&Lf{T]Iey,DQ~kr+ԃZǀꋗs{ 7If(k4ܨ̌1e`(O,}{5I+:eϕ >·|iڑf`( yZiA테*KO-gҚFAd윝] P\[K*蜣\fTMUeF .[b1Lʾ.o0Z$J1o2a) sƒv hDֶwͼLlgr{d:l0 @jo`u*tC?^j0C"h`J}uPwe6x5-v]@% g!!# ~.w >|~ޠCՅ+B/p|ܝ r,qh*TjqnX9&>\n’;n.m#&6uP(Hաs8l6i k~?+ݡ _~Aw3E;4.-)7^ܗr883o:^ Ll>dd`]OߦV+ekj1򳛷niێT*BbG.%S󖺓麏eNj·SG#=erQ q Әנ_&4^:r¾s;ߞ̕$rFTZQ˃eؑ߯-K:r!5RIsgىgACH2`ѺOl(QB/Z{}|gT Wsg33?]킅pHNxbdlc=Vі7f$^1΋mjHku2Ͼמ9h1%c8OS䷧oxoSVB0'MPM[o|mFൿ*.QίZyOm8&sAq|ӻ.{lD g*qֶ` gf1ocm}cN.sjϞ!O1^s?&S-lfRYKx}}yE&I{񂱡WՊ\Q F]meꬖ&XSScsssT7-L֜'b6 y>`WW50'Im c }Uu\㬺9z*eWf*w{Hb6 LZ0 Ry˧ +2FӼ%|SmM^Vh9LJMۄ2OЏ'!B'D\( eq".yBą2OP E=u+|չ&` ۿZm}ib@5r̝AxF tr:pw6Tf=0夬9ϙv{tԍ}Ç}d@ӹnoXD~| ^_r3|ɦBGI=d;0SK.g a#=@B6y[!ǭ(#(;ʝp/~eo$ʺrk3&4 ^1}Go=kQTvI;o5TKYuAfv>FV75ݢ<YMNy!7ڥԹꬌ พ &Y5555e:=vg4l{T]jOl:lQM"bb+ GjO8:C￸yS.>ܳuk7WdW4,*??'w9TyρAҜ}~:e[urKso02}$r;㸶%Fm&R}%~b?_rdBrP=oK{٭P{oJIDATgޜ//?M"s {ౠ=}=oM;V<2ȹznD9`-g0 ];x^mв~y;0gg(#{3*m o6!i}k KcMMA`},o1{Z/ո?h$e5U\b2Yvy3LA99L>B'D\UFP h2sa5ąʊ?f h]W,_(]0[Ƙkˎ6ۺqA\|^!)[5Dq{ph7`dk#]y62+O 叏ju);qmD]G_˫|ݕxRuX ٯvldA t8rr'>?9m`t|ŭU? %.V5+ 5vz_&,85zd&U3ȥRVR٨7Zy8P3zؗU7ibi6}!ᘟu:L;${]s®}_\UP۞q".yBą2OPmuFms;`Mѧ֒ND|Wvӭ |F'D\( eq".yBą2OP ݔ,;~H;I}F]SP?!_gܕ&Iɇ_Yu@^^j{e7K<%[ZW X왟6{􇎱ǒk3]I`]%C'ٸ5\*nQV7f<~?F˅ǖ7 oF8y>+EM\ж,-bײa4瀞繘NKM\JnNTlGN1kY% -M {8].͈Mؐo~߱kw!38u=-΃`,n.foQoR3]&-ï\fK,]/]fI OWX@a~m@?+ض",HȎp#CڬOC?Lxoh na:Z>D lvl΀Ģ s܄=-)8=nfp^lvniH+-@#q9Lֱcs=t#|>W*1w/);D,Ʀ ~v BȍJleqϞHa-['`@|M;[D7-@P7dn|dZͳň.81BAe1=*G'W(BV1PpӲÂ0ZOr!wb._6f< X^8&_~ <-Qa"m/;JalAbvp)K)‚?ˆ bϣ'`raBn%{ { ^׿XaX~c(0䧱*w@wJ!a셔Lлg®_ /Q=T(W-GJ!"C0Ēa0`dr X)<p/ l_ "C1Q\ZW|ˇ_fm9L#v})@a@fE7y /{"_<&|,,lj+\d$aX=| .4s6L$X'rnIX5Q'i.ڍjKBw{{KMRMәD%%F͚RRRT*c cqhCҕX,={h4k ;k!HoNz}BBD"iM3d2RLHHBnIeeeBBL&ksJ"8;;x{{GGGd*1!LԒgg&UА\[AsF1++NNNUW%%%< ^$||| uǠ7 X,P\\a2>}'LBIENDB`dtkdeclarative-5.7.12/docs/images/ActionButton.png000066400000000000000000000043631476226662700221400ustar00rootroot00000000000000PNG  IHDREu= pHYs+IDATh]h\3svl˫1]9^ 4L 5DA b iJ!уbpߒJ[m QL\v?J@NCDbY+53}w?dvצ9\{ιg3CNMv;uہw)J3332L.* ===O%NMmmDQzz\}zzzjj\.7`aMlO}+e&#g|mR@J)!G!ď]bxܹo82Ϗ5~><Ru1;?W_qNc bhB@)5BB:7/gO ۵eO{/ubKKK-f.\h<jB@|!_Mmۆ^VBM@)ޟv8dN Q vC|?sL+1|>={~`M|]>"Mg{_߸t~xR4~׮]}f-H*J\ܼ{Wj쌫}}}/^M*GGG/]T\.$5ss(5HN_4aBp[.?[4|/zp9 >tlX,NLLFGG&&&Ez\u. jڢn#RFKD0W)?K(PЎ%/IcccQS'vX93o9EAv6w"a MY/T> dRI;"T=FI[\ym)x**wi^W*ChZ4mJȓD !Brp%e޾/+a(&5I)7+kԿ;9[ɲ0*Sښ'Zo}G7qzPkDe2FZ\BQ42LٴL~Um;H!$N=z`wy.F™իWf=~\.o߾o_5Ռ{+?;nv꼵tXe(*l̛ys~R:Jaue=zfc@99!%T6JPm;)'O SNՕ m ^K`8|E> .,>^WG@}lp􌌌)WVVG6y###u{ x>S%10 B00öv8eԘT[4}ȞWܫ$ G2bT p>߬U>SF(A18C`_i8tuhZնa0F4j/zxʹt|Z={]/TcDcQvZ'agMxlbKHAσq8(Q\_Q.#mލ~6R)6iӰ,&t={+p=yN;˳՛RFPDQRUo*4 tTt& XCrC]ṢJE8xe@@ TAtZiJt,iPC(ЖHW|!t].A#xAס,XVͲ䒇=ys[+*"RHHթâES)fY2i2SdoQ >5yS} M0`3sjlgEBrɹ xzl s+#5SsnzpnsYd"-ܾIENDB`dtkdeclarative-5.7.12/docs/images/AlertToolTip.png000066400000000000000000000132471476226662700221120ustar00rootroot00000000000000PNG  IHDRTW* pHYs+YIDATxyEuv݀":Qa`l骮:#$+#;;>/**3WI|WF 1P(P(BPS(*~ uJtX5BYR^tBk%CN$R)9#zsߪ.7TAv%Uؕ#~Qi(RiD[EQ$IρiT'I(2s%Qq:McNk?¹\876l]c1B8.ˁY TSg3gCfP4jƢ(5(~R1'cWw%Q ?Yv$KJFHmذ~ÆmvF8C`I6U,[MReVR$٩1|ܒj(GOP(,`+2٬6>۔մ{ݗ44L|?q[,h'ק1x A^2﵅#GwQΦLq'h$dŃχ6ocQ|)K,K%8)t&3'<5p0Y9d]MuU[;H)53}O>ՒH=HMSR\qXL7-#mtoIY83O<͖-m8mzQj-^ɦNkO)Z4Ʋe>D7OBXr%:͖-o /hhh6R|qR_7PNFub9vc:1qk:qgZ fͪ8;g-q ;A<_u،oKkS cIXjR:ucwuС\|С}W5yPOOX;MR W tBA-}%EvGu<~x>g cvբ-6ǒ X² I6L53O>̓O*eeYEQGQEQ$I=Tǩ7j ڊQ!"p|q,D 8r(I_es%ѫ LOTew8h(e%uu!zU,+[Kgs=IZK*} PtZ(D ڱc(QZhsBP0fcJòlP Vca5fSAL$'"˲{,;XzID?ϸcd2T80' <ڀ6Ӓ\GݰB=fؿfij"UcyMe& b׸Ēj8 voW'"~y~O>%2%# lIeXJ$I铈N@T*Ų,˲j[ߴ*a t+X=I5F0X`I5JFmA.< @4%3VQL|>iNiPŨ:vje|YRE{-]^l6Hdž8eJw4s|>V'x\TMʲm *K,-~WudBx>X_3 kˮeY6J2'dT׭9WJj,TmL&^z=n[Cm`eYzO_G.@@Nӵl;{C+SGfjһĒj(>hO^Pߛ?|\.'n Jj$ 8ռo͒j\䃋$ɨ|h[ɧhVCfu_k^~~)1-6CU TZ^ƭDdzO ?\i/[ۗ?פ8`#u7^>l;t~D}?-{pfJ2,_b<XwX&K/}s.3P3otyŭޫ|0뤝[GIg_@RvIglZ'5sv2} K_彻߳ f_'{8zݽ 7bp.sSY8#x?&akDZ}ƦWxl&ٚ_ 317*[ iG㤦)hf]sUc ǘXg[S hm+oO8PiNiV@o{>4reyddyh#KF&~M/C fV-fu2/% ~˽cB/ ~j&6c"5hY85)5qSskWNlዯKf'1! @8ޣ7:NMNihc^?X:*@OOq[b ].&rlsf&L wzMaiԴC `XqFiVi[E?r[b p_397&=\[G/3b![ Kr 22P q062tjJpf}1x΅'ϽG\WdC \=|bAn#77eV߸w)uw>? &CDk&_:6_s Osʮ}|ǟ?7-{][T+b:fL(({ƳVŦ?N?fԫO6vpƘ GC"w!΃x/`ḂA,0}]c1%fu}< Nϐ_x.fEK}Gz(|/1e, 29&Z]Te=4 A${rj tAΞ#$iݡP椾騾vhs[Ģ-,Nؐ;P%S\zHAx{= h-@q_%SۓNQOq??|>o\ۿ4jZP\~놝x۽{w* S] {|ov qϸ U`Yd2 ۫KdAelگ׍Eq'' |i?($hҽ#` N8l5g䳚3~P:y{\n6Vɥۣ AR>*\{qW ņוQTBmFmW}5(cܨj+i$ҵps] Fl;UViʴt-~*U? 7~t?`/~*xqQ(l6z~5(~7U>įmZV)SS>Z^Ӽ#fVŠFME@eOq &R־Q.yEk#re_J A?23k_h A7ӂz=Ȣo/{J wu8K|) -~(VGݍ)Sy{GY3ԧXiVU1 U1f]}{uT`&=O+JgR_)nP/1Y(EPcUBIENDB`dtkdeclarative-5.7.12/docs/images/AlertToolTip_EditExam.png000066400000000000000000001204641476226662700236720ustar00rootroot00000000000000PNG  IHDR@X pHYs+ IDATxwxϝd7R*D* **kEEAAU" -&w>;3LfgKv7<><3w=37NxAb @$zPà$A#H F 1 Ab00(`aAt{[nwq-Ǐ7ϗo-*++;v쭷ުRKgv:O?tri8nǎ:tx ޽{gdd/^Xzʲh|{o׮0}oHocǎMKKAآNv87ovݧO޽;!dǎ¥>}jr2hРB;iҤqO{o&Y ?~\>uyQ$`?,k׮]vq'lA ,El6,Ezzz>/X ))W_ꪫoׯfѣG]Abh0R͛Z{벳yYfeeeI3\.0 Ckx8nݺݻw t__B;_85jԨQxiD#`ádڵKHHرc!,RRRh&OlR8Z=%'' %9q(`iD#ѣGTB/3k={l &iiioСCoYn- Pʇ~CG7nܘ1cWGQ^^vZ1v>|. {+oXf~idD&`Ѹf͚̜9n8.''ѣ-Z+ٳ/H1cӿT>\DBY={vBBO>>`Ҥ0GqHRRRdNHH8 A A \Ab00(`aPà$A#H F 1 AbࣔyXp/BA:׃R}1RA7Qзeiz޷/l1EFF#O+4YakNg :v̰a7p!*EDFRf6Ox։ՔCжUOLL2eT8ADSQ/}ͩefs}: ALxVDܵX݉FNsB/gy̙J6y#6{]ac͒v#̙Nij(*--./ضzbN;\.(5$3Š n_. L dwȦsE4eڵvڈFB&S/v䘭VOB 0^<ܷOd2-`n&ᆯf~(kr8; t^ٱcTV{*?aٶ-ZlG޹s,˖%%9NeY+%%Eb~ ,3^jQpøѣ^-Ќ{"/MV٢x>hlײj+(hߺF26IEee۵HM2=<-Mzi@ YFN )RYyV}d}ر.^ &Sɴ۴hq.㹺ۍ 07AkZzQQZݾMkSBBqyyyEPt u5Aj"SqYY00> <ߵ}{ESLw7%1QI+)r1`2&8 LP:aWenY~C.SV{V͛m{<9)!Aȏ!4hQPX$K+6[. 85)rR{7APa+($3YJ*M^-)/zGss :]4E c]$&葝o$I^>i6YCtd2XnIONKJ}}RT@qy'Ri3, ]GJKF%M' ui(lv=/ Fw/{ PQih^M׮n/.//.++.+@RL6\qEmqqj*>.bQPTzrr V[\^PHc &KW/w6ð :!uZ-hhn'h8^ VȩSYY͚ u+:t8WRr̙ĄUE sHCm!E<ϓ_.F00 II&lJp!tIEu"Q_MC46A p AVB7 0RJqYA ׺E~aީvPY+9/6DgHfmhJx&UxLHUqCNQv!.[jgY0 iJq=J"sp.!EHiXW>$4_qGO&XA@WBELO7)EHHèm$*`z=0 vl BP [2EɢbOI8+IŌ Z8`YrR4 <{^AF111QT* BE"eqn[шkȜp 1 uYu:ZVV) md-FqCӰZ(l$T,:^fA@8w;Z6 eYd` U!j@R]4j].NW5.<`H3 FZ MBEk4qz`޷ AbZĽ^,rbbsPZ0Q: 'A.N|^&hNuUM(GD#F,a|tL"7sP% beD-tWm[ָciI k]a]\6և4ݯ5xwO%%*eWe1fFb:p@w$JKż585RxjJzy"9ݱi%QiT*|i٭5[Vkc" J7x,FGeŗ՜u{O)w?MŅ?)k &Z."`)ԙ+SMS/ -.~e;7x~`0:uO|C:=S9x%4̩#0LeoMQIo #J7FXg G0'-ps\7a@(ʝ{6Wȩ=TѬ9N |m@Hʇ˄ O4>RO3'MBkϵ.p4"1 t}]ł aE%ݯ=dz-Er:x ߡjRJ7~U@o U*|0NEJvQ-bNSL#Z#~i:XKYk#)ʘ-+68bጄOF%$*2SN_ld-9Ca]@m4WcyG%T iJ~57˧=^Y雞SGi } HT֤HJm8վ+ʘ$$LgqlY-z/ynuv/qMk]P*!0N٢l0[HJev/|9=K7osu\9(EWZl۹OXQav" ,[^ @DgV$?y={{Dsx#uFxuKD|Qk#5 e42|M8R)rGc?Eg9X_3<+⍆JպDۊqC]{tВ%K,\:xUZjjժkF钓f1Ͼk֬8cǎDRi0c_h"==}Ν@b1bN Q7`9Ԅ!iف{w>}Z?+ݻO> fvm±t(:Xxļ!C@P GbVhi-7G\YYy|ۼy󊊊#Gz{뮻nĈ3f̀j%L0pH ;w.q=4Qп9{h$teҤIj²pU4"0 ӧOovضmۉ'駟N>ݩS'`֭^G+++y߹s;ԩSph"ԺukBȌ3v-ܥK)SU*{Fb /8;vhѢ7~wWT޽Fjjj޽V؆?&'' %w%//O,ٳwuWgϞ矏7w_|r->}%K&Nh4yr OT/T*.Q2Mj'$j4'N@^^`]Tx㍽{褋Fb2m6qFeW\y]wM4I{zkܹafϞZ~qdۻu?hѢk׮]vo۶->>t;vƍB9##O>gϞꪫ222IՋ.5z4 ,XT*.\T*O.4[V2eyW^ypR|7o޼~6mڌ1wY,^2eJVV\K:t*W^:u*nݺu999ׯ2dXAD"1|W]v ,ؾ}… U*ܹW^]tݻ7ڵUVB9gϞ㏏=Jh4ϟ5kiZB^~z+33s۶m,O ؄]vUVVZm>}BX&^$ ːhL0r޽#Gر͛sssz!a$''jꫯy>++`0ܹs͚5=!l6L)SqqqjZfƍ_RRR[F"(7ɓ۵kwG}tȐ!b6F#]/7nM7tq!}k׮9r䫯@b?!ʫZ' f94"S;tP;ydfͮ{K.믿6mڴ|5k̜93))Z>Zp+oٳK.g>z(`)kӦM@Ki@" ^7##Q<,VTT3Dl6[III\\XC˲'N M E =(`aPà$A#H F 1 Ab00(`aPà$ >axw:e'< HB(D#z=(`6 onCQM\0%U?!D!)QhX^-T/\`x^ ."|0V?! iy0\~^8x<7l\v AՎ6!-.dTV0Q4-i:[kζZM~bbt!D#HPgߜZf6?dzCk~˼ff֭[v_PYz]3_?e#–V8 "+xr葝oV$I^>i6YCtp (To C)&D/ C)m vkZl <χ0_MMiogvZ۶lɧdc6Y^V3 (Ԁ+3R(T*4| Yn56 @|. ~̰a/&+ V EU]iiZ@_ Ÿ!TfVDHX8 laa>}OlߖFQw&%O m4,H-_i^ܯe,  @Q/i ؤoRQM EzKU7RWsV"b˲,qߐ7>9vߑX4MV -B3p-S Xq@%p2PM 7DQ0-xxKګQ[c9876%jDBQ҃B5D  1dlyY0T7hn~[!Bb:H| +no>4xl6n^bnjXNe E #BA:G9VQ(ai3.ޑ`T( Blnj)M+N(F_bH e].*`00vFcbbRT(²,0nvk4B!˜p aBK<˲NSөT*11EѸnájiXH a6J]IJt.j`p8,^@ꃪZrt{dddp"iV+X!E֓4Rj<00<ϫjYUFP4-]F|R+uz*^.EQ#EV3 #4Js (|7h+YT**ÀJ5z9, 'dZXg<Dž*B,f2Fj4hht!s?##UxcK&s781r[M<_5±r>"Cv[_8LW_Y|-/SJVTٻO\ΙKUVNڹtʃQ~T2&t/I*iR1oj5cͥ!5BBsM+J|U{LOLnYزZӽ?{PԶ+/.\A^]pX(UK<@Ě$:wZuv <ϻvmUnTBn-8y6WYV}q<^sOUwz\b!ͫ"HmN%$R{N_[eMP(T^nzm8oiaҔy_"~)ӗ?x!~Svxyޞ5T7hT/Z*`NC{+W/E*9=a 4*!-?)[w08V_UY>9*ޤKQ ʔl"90.ma֯>6饏.a]Q„ԝ'NH %PU#BnS$j\s=84ŏ.Bse_*d_ݨݪ/N2=eHP6Wěn]7h0&T/M<>9¼9o(4^BQ޳BNMf-)}uk{%:PoamʬCզdp;Z  7͹3?|FtzTUZozbg5wBT+E, 3L*N+iB(8'6e--F{`EJɷJHTwbtBN`ynUe/iOC4%M)IHDIU,x0,PTk?~C'R$~6m?.,TnqcWu &ʔ q7?` y~p^I(U>׹Ջf\{1 PV6]pSPٶ#!UTBb½꯻N(t'g5qY>KȐLev@to}Notk?~űg\V [^b -` bԬUٲb&JD@'j k)9}s,Gw^ tl}`F%2ZUl2gs=Mllb-HLql\2} "Y½<ԺdxrtR?An{Աqa=@#҅ 'yMDNT֤HJm8վ+ʘ$$LgqlY-z/ynuv/qm:j_ 0Fy֫luGVOU-Ͳl˾y.ege;%\豑oxaNf7kVȾ;ZC0EIS(d1>@vPyoR2h(SqFӣD(0^sd[-W$E>JͥBݼs9Tm;)ӝn[dL2d ^lձ8ilIhʋkKzcX♆QdUnօ:uWgt݀}ٙG)@Jae뺡~cRdE"B}N(bv" ,[^ @DgL]{QDQc_$L$VT%cJgZ&f3ZJC芅klfA崭w9D뷳S^]d]^̻\e”m^Õp2 я G#uG}ODC/5Z*|9v ~Stz>"hJ?b-KԆ4ٽTbjMŚK>(h \yeN~@*chHmNś<%oY1]]#ٔ1I?RC_ \R6m"=E7[ fYXff -**2 xrqRp@|[ ԸPBrBdEr)$A>/jLӴf 0A%#uJYE ;veY1$FJ:F1n;=H\r+;Zg$:j<Рh*++C߆f+..h4bKpIZWxGh:6! B՚fj0t:,CBu86eYaQhi󲬝-RHEE_a0"Zq#+S?T*iV*#iבR>$S8N?EܟA6qVeP HcT/dU щMghM_L$"D+-H!ճXeC.$;aQdT25_Vzf(!Lk! F ML ~CDJF"#`nHVc &`)C!P2!f.xCDmBp 'AjA$3nׁ$t th9UDEM#T(`H;_8ԊK,6+)KzL+cX Dvl&+`BC??~QHBh&2&#׿X fˎ75 0h z뷡{NБp@To0%‘CU־%4M% ˎ9X zm?tM={ :t!:.%%o߾]t0_<QK? x`rI*\-,,BB_ ]&jSYHL#< V^ZbŰaÒο #p2 HtPL"㄄^zӧ !|INNiBԚAjRJ*W+l6BHBB!dڵ7o>y̙56/LYzٙ!gXx<۷o_/޽{zzz苊`?OշHcFG@+*~¿< !v< /jܹyΫ3QHՋDJg05kֽ{&a݅E#JI?QF HtzwaXO4W$nzdʕӧOS1J8-&VKL XB||LED9_9Fr9ߠ$A#H F 1 Ab00(`aPà$ >axw:e["HB(D#z=(`,4 onCQM0%U?!D!)QhX^-T/\`xj_3 oՏEDoDzy0YsI?Q/ٟ?tGj4ތcڜLz媥kֈcoaQ>8ΝOz$2|*/o\>#_ÝG/hN_<nW/Zɓbtt4,ZeǎG5{꛷VλC>ɴN^~}CX ~://McN/1#:Xg}2땫ƍ5A_\5yݺm߯e?_Gemw\G6p^w17oiS_GJ@-_Ç-7-VfkW22:k{셷rsж- wݖ{kQ7 ;n(TP!=:z)7.lӲe٪o] ,`J/8O^8!,ͿVl.d.mw+(*rݗwY6N[HZtPoۣܱ]ۊ7n\YRV.˳-.]sKQisO̳0@QԔ>s܃/Lzi;ڵ6p7l8CUQ8(,ީcAn=k߾=+ ia[GokpX O5}GQZX]ϭ23 Vf69qT^ SpBCοd %^Y}8ۣ :p@!9zFӽ{gΜ^~Ꝕ$x;?.Co.׎={6n۶裙ð&s~;ؼ$Uh4^`3-22 dzY-22˒z[T*:jpN?0#-.JqIVn(Z=sƔo0N:[QIHKiON?aGv,%dW5y쎳k>Zӣ[WT( AIB?j~Awu\B7WpiZ+zEN-[۲.Jeگ^a/ Xnl6-[~χ2T*ՠ޽75Sg7m>e$^#CGdI/ZiWp|O+|ZYi6Y7NYl6ӯ!>裙?|͟{0񇬄_|.!~Ӫԃz]cC@uƼrye=CBzoWv\.Ę凟~^|y75f-#` a.f0F\ɾ-eK z]!5HCmjBL Fq>D0rQ!L' |+/|4C8g( !PQD"s@`4R<!<IKTR%DM[_W8s A@e8#ħQH,a +F"A(ZT0z` SzQHh z^0 0vl6[eeBP(bCtSӰLQXFW'RG|BheYJ2 h4&&&*JBA/ ,2 vnF09A„},:NNRĔ62"FvV a!1QH(i3˲C= ЁE#AV , 6WA¡*p\:.KHiZzLs IDAT /VH6JC@0 jMwVBAӴv_XDh4JCk DZ^zzس%!Hjad\n8)"A,*Jea@DKUqF^gk]'<Y-y,C88Xز:镹!ĵwwsLi]<Er:q3Eٺ#Qy,겮|)zP뇏SuJֆ a2eBŮ#$jjLd+xp}w(x(}^#Sjn8R9k9HRt-.UK,}~^zSqK.ֶza„IlMek. D]kqs>vr*f]wJq̹<ۊ/%6e>\ڷۖ5YnyaZ,i!ZC li![r9tV^)lɹvmNk)c 9yHqc9{ar:X;ۭq\bz}J-Y:-xrvy罼U@x^GsEԙ+붕 웖L_B̜N~ }pe}2/޿3~DMte;Ok+k) HTȧr|UUޢ3C{f-:=ØokB]8{%ac[,vܱAѲt'O*+0{^HNS]Uվ(/Q>;hz RMOMWe:wlJ~-W0{tҫA/y6ϱjHZIxZbN[$J,e%/>n@׌W)ð;42 )EaJsl]˻]9yGxpŗp4"A)]4]1>2P8wxG%UJs6+QMLqYRT`ERjۋ@7Y}`~GŢ4En7z Q+5x ďHiu\yL*gu[t(*~!ӓo q28'!hJ$r"\y Pdiw ,s_7>8&E9w˃9*+l+iBV$a$敞jG^7t;M2& Ԛ)RS'N2&='OJKŗq;:쟎E z--:C4Zo)}UˌO*0,Ce:uʳ^֋PT/KVO@aJ4:eNm?.a-81JRwe:x?7naG_ h<({}TJ=[9U}e_L=Gs|[)C&]T,R/Z2"4<ϗN}(O~#tn;T-6{6j݀i\iae±a9J7@JuWvɃU stPq̥og{Ozˊ훖v\O}TBbŒly{p9~jоy+g'g)]˼bݵ#Uunst 8(:#Z/6GpTBB|'{¶yq R]v砚"@cSÐDQUab#MF@4ZL%Y^Cm;CX7*@WO+Jqʖ-Ul7C<hDt,W(([_VwN%Բ,A"1:u6----2N"3T*ĩgE^oQQ`Ɠ HK@#Bp\"Xjׅ'u\.F4Ml0l!phDf ڠ:RU'$4ͲfkXveY1$FJ:F1namjL\rjSxQHtx`AEUVV6YV\\hĖ*!]FA>,cP(ZlZAb?$4<{^aX6/ڙ"uTTT;Iz È)|U`8$"'` VLHT4T*e=FҮ#`}H"@K/T/"q?l޿,ƭ^ +%J)?^N(N|הh:Ck ]e ! Zu*eTb ogE sQHDoa^Ld쟹B`] z`1_4P'`8Dd-)>Vꁉd5`8BQ !cbF"7D/!H^G*pRDAD<ɖMI T AsF,h Q2v*ѿpY"mWR_ W5#ddb MVȅ~ȑT2MdwM# Ga4"oja@" zoC594#r `JF#!<}K8hJVs4 ²lhdçֈ:XiD_ů'|Bh2KDTu* Q:'Dˑ1xMa6׏MHcsu)ulRF"Cd#W^$"B QHՋDJ ~Oj.<.0Z EhENd}€EE؅jh00(`aPà$A#H F 1Lq܊+__ 6GnݺtiJ2Leee/}|Ǐ;(-)K6z/J(X x (*VEPAJo dlߝ2ln {Y+J111b˗/߶mۆ *DtΘ11cdeeiرc/8ye˖͜9s$I_֭[TT EOBv}ĉѣGѽ{wܾ}*yVvΝyyyW^=tlVZEEE@~~ɓ'/_^XX4nܸlٲ .̟??))iʕnعeՕ\rW[xbiР?%$Iō9Rt'}wI =zѣ1/>rHe< u!_]Tj4ƍ@ǎ'OhfΜ)ٹsgڵ4i5k|&L yqi 4h)7w!99yɒ%ׯ(3ŋ#d2,+lܹe˖I6,33AeAA':t@Ӹ]&ɸq@.ѣGҏNڵku&\~'#G5jm0 Ar xҤI$IdIĉ#""HԐ0o>٢E !RQ>n#h7h@:uiӦO]&t>hN4[9? &_3; B$bbˡa60_PE oEi\\9! .WJ X݋ w-`3+ UM9Xze+k0[,SR\4@!n||ĎZ-Y}KBsWAfNgmI7[jjCH֩(`)'yF 8QfO0>:2̔ R"Hy3'Ϛz|FYJ7 At:?XEPܵ\KP4[{H޺r-S<$8KLֹMv߸~HC /^r8-mϡCMڼAK AcJLDGe03gv7ھ]ڍoڹS8"jOIݵkeiݺ?w zxG|Í)TJ6p0%Eh5)/آ9pwޭR*`usqGunv_LBJ05c /*Ǥ6r\.שs],ӪysLR)MfKdDiS4j(DܳdxsޞFQd֭5bc֭ qѝZwnx~P޾ '<;N,Ĕ sjBZb䁔^߯G'!Ir5bjUƴ^W aӎnkJ+ό}<wWA_~.1e(DnB??,i5rnٸ8lܘsCbM%f,hh2Wge}z?#$]NDniN].]z#M˖2p3??y[6o>zC]>1d0A,ˮHJ%yvWq.4ݻ.]&^֪7n䨶ϜI=qZ5oޢIpw+W`$iً^XfT4,^h)Ci\~ׯ?oʵ-A+r<"ё'pY[)ёN~qNPBJTc:|Zʆ&uTA uuig)  {h\RWJo*N3Ax;6KRPH8Bf)0VV:srr˸;+ϟO{4(c$ "!b7JM89]k8#"!0hqP0"" q˲ ( ˏI- }0ʑVcoeaX%"VHnږ 5";TD`V Dz<-: wPþzѼ*ُsF;AE*5є,r aAZeYd"f-R&I'I]CM+#ABat rUTXB+F"Mf! XZ *Ni!>( §at Z,0&(6pUkMQnbᧄ.9OQ -X ɴZ- 6 QQQ2 e].p8JRrs~2)4_˲fST BFP#P*jT*_"keYժh 4BCh* VkZ/i@jí*nWT2oRDž 4RvZ}k^/H#ՃrxW*n)^"hBW*x|a3 _hgƭ, x]k$~XP\.Ni_.7 MJy`]?X~E=cF.y`+tHuDR K[LZ[Hw9y<;o,,$I Ov\jCI'0JtN"sEFe5?!'kߺ4DH67KYF؅ + ߉arʅF:}8>_[Rٮ'X]NFTl-UA~JK&T}HRꎤ5gJFD$sl޴J;p(\><_eK(]$)C}P(MasFƻ=^Mxyn޼^[ྜB $*6+k=unسE>Pyy[! f]a"#iV]=-@ְ}FObdLVr.s]8 6ݠpG%My6Q0;&r9P8S#u)RmZa3e<}%*A\A.T uV78+sMbjP0Bq8H;@i(ɴ_p7cP^gSip!ЁWٛku>oٖd?8jmwDN 'ΰYY\3:N͙4gps& 0]PI%4:ks?(ޅ4(Zen9SF/\>K#Xے5]1R(LsEl^v3{k򭻷5(v@\W/5Bcr$5:6zٛlutuw1,umw:/D邏<ΦDŸ Ab5U!`1d-nKR'f?*`[#f.R=2)ݪkJ+@b$4)c!<ݕz0"_bJ@"ՂN,hu8N5j_~ I~5f? #e"HXpkU*q+:R= rb֓C,%Q+&#_ 5zR.eT/n";+^$qR!ET/; PH DwDJu8 8@PHd~uuTc^ސe'A$TA#HF0 a A01(` cPƠ$A#HF0 a A010q۱cX,'NN޽{O>]fӧO,+^:u WJ"՞v0NSe˖5kJ#ryddNNN߾{N',Zh4J7klСs\ ./?qԩSLҨQ{׮]˗/_nME[ w!ߟ|򉧿q / i֬ټyhÆ 4Mϝ;Whʔ)G8QFBLjj*EQ^oh'8VZ_ҥ>}P6mK/@QQѪU v]&QW_ )3gI;v Zmժի*L0A/^vF1>>~˖-[lƏ3&>>.]tȑcRs7n@zzpZj-`Zݸqc233>>S\.5kR)))Ǐ;uH,7L&ӽ+GDDOj0§K.%o߾6ĉv}GxG{`ABIJlw޽ɓܽ{0 on߾}Ȑ!AVzh fΜ)tVGDD1BR5nxĈbRBBBbi 'OٳGIMM=~!Cd2,&&&..nB>_ݻwUVj er|yyyK.=tj̙3gΜgYYfNRR02/|ر kƲlQQbzcǎ ֫WO,XN:Y`_%\]l6 ˗/N~^naÆ 6,AB xbҠA<>>ҥK6 H9rNt'N^gݻW,qn"Ir'Nzj={BpKh˗ t8z,؉ >ߟz917|;v>}-3< a5dȐK^-_7oݻwРA JJJeƍ믿4rtv7Ctޢŋ޽Wk׮q״iӄbZ)7|CQ\._6lPR #A!Hs;f\iӦiچ Ѽys?OswM&SO=%|t[nݺBؾ}R|z!V+BQԓO>9tg۶m#cyFc%Frt:?XEPܵ,*MvΞsO칚yWė 7sO;džslBRgd$oVY6T=xU?;op߯^k &dMfk=yN똘8C2 2YS?''Mڴ5lI}9~ܷ{6-[>tpge}tiúu5j͚L=&s̲,֯_59pW?V3_?˕z⤘~n.|diOzӪ5s\|YYܻbZmqqJ;}ZȲᴓw|#'g#J=m0oM޺S6x`IC}IlѢhwK +>ҷGw$mv:u܀Qc矟M?>b`\W' Q)zVk گ/A#+{72""h|7O;۱u"-[BXXؿWz/_qоZ4mүGC9lcU2c_ԭ]g~_~BI|K1's@]#t]{>8*3gss_}V͛nb׾}5cc[6kzٽL0Cb"<(4VoNQT:u,KZ=ռM;vܳgk6Sn-(*Z<ȈiǎoVͭr־G‘@=0MS ?ygXiƍF뭚癫Wǽ5/4ȇ{<~̛cnazNx  ,[SOhXN>j g/\zmݢE}7?ZfRv4Zdq>^Fv΋G {^׮]ziΦi]9t:ss3^ޡDtPd6nw1\!3/@SV^zKPZE0MlEy̙%?[bΜR*m"kXnd]4-HIP/gG"!~!1{ GGF>ܫ'ԯSg;y+)Ǐ7kثg{}4w-[fƽ {_MV[pl;mvlh~<>8u3HZoN~HL]QN,Ǝo]zeY@O=>h߰m^#i3?tn^)<MO>a]ڵܶ튤_7m~bȐ5kGܧ,Xaǿf2~o/k)FteYeӦ{;yƂnSիs:ijW6tj&Esʏ=o^2//)pʕQÆ wүgisob_R'&?ZbFE8K=~diᅬzm˗?mڱf~~͛6CY~ %XX :O^eYVhik>3. HԨ[gϿ\3[Be|OHhٴim7_r0Ο_/YYWc!~رSw4v$I=*_IK ևs8S)AG$5yV3*PQ{=C]X,֟7lFD{}k۩u?+ V͛/?"KHjתI_|}V~f-4cfw\&&GWNk6nڮ]BZN?1PF\z h")yr•Nylo2hdb ,g6gn{u,t8Ƃ˜H.*2Ng r8f^^lw8^<[/=5Z9}oE1,{寖0wFXV&{C~AI^+׭[ǂtN37Ѝן;m.'wI MOi Aw ب(\EՊ+pzũkƹ ՜]ο"* >$1%0yj[?&NjS>Fl"@@ ,4ge%mܫS'To!˧O Ɨ?p| ՠ2sjG/wc?Y97=2+LaoFJ"rNzg|\1O?إq괹鴚[lS;m;g}Qis8{Y>) ݌鼑 lGӍEE HRN^05^3Ax;6KRPH8B(0VVy2N7<><Ҡp K#dF˛M9yj׮}5m6(c$ 4rL;p9x~B6x9M(c$ JH~ܪBqt -ae NC,wӶTبa$ߥ%26@Z8d 4A Ed?AEԄFSȭ*yjye].Òu: ؚH'I$v 5yT.^K # AJ<ſ" Qj J,a!P&WϿjL ,{4QHxS 0 t:].X,`6M&EQEmְjO ]rPH5TZ,k@&iZl0d2EQ!2 ,˺\.p8J88d Sht[eYͦR s,FT*jUT4,D0  #Hi7˲VU(J/^t~ZBjV+[<%RmU*JmT*>>㸐U*nWbizP].JB/EQ4M }W!+Jqz`/3 𶭌uEEdaBr:}@b$4)=cA| \恥"ՅjJ5,U/qQ|pV3pu$)?q2F fS$ILH">dZB̛ٜ]NÞ7%)PL|q(u5kL77q(Z6cnNr>fz~}PHB =;OMM[q,&^:̱ۄ\<e?~`'W^C ,lN&ges2YcnhQHXC˥Y,ϔKaslq(Pt3uKۓtal~+.fX$T\m2"Ͼ;lCxY@Q{4ǿRuo#H /'Ã:946zbg AѦ;P.o[6_ݭ?] yz\ \5s̜ [3,˖5ORQq> /󄤈q%0RM)52R+SuxȲa#u (Zխ=\OYLざYE@'EbIE+>LYLbd!dr̝t Bq1U2hΦC$ `><#oڪh.1tQHnY]{lpBsN=B,h&R%di:WpǪ6d Y6p?m?v+*:!2FǩGWvxPhK?E^#Zwo!iԉ҄RM  5OyY@ޢ!"G&`m&/TaPH0>ufF jmq*+G‚ Ev?I.=ՈTWJLӴlT"fkUT3n Y6,4UbCJW*JpTxnFqc _{ߢA:xJevvd-41L999JR^"H8B /0BEQ*h4iZZV 5xgj 5gaShi[?s(?  QXXxKNBr\ ø\.# [ۮ48k ML&iZ&I<|!y^"HhBK/Hf\{޶-<5^)^U*M\!ꈈ%xRT/&]ָ X-I|>n(^UT %f%+ XoR_%ceAD,{ X^ ~jѾJF"N)V p,|b(ui?bF"/c~jΞҭ֯Op $AB2&i3!]l >*+T)R-(60VK#Hn+7{^R?3TJfb}@HRv P?bLe_9FܪBi(}n=o:z H@+۠WzE^%fr$!ھ?bt{F<_*WdT8^WxT-!pǁR׀$L!Xco[sYyGx`(WCm?_&^uרI B.-k=9*R rlB !=Pӭ'RF" iN r\EwK }+RD"Ꮏߡ T>L4_pATӀT?JWWPH5E YvAB01(` cPƠ$A#HF0 a A01(` cPƠ$A#HF0&h ׯs0 8SN97A?سgٳopjժ:##c_u:uܲL4Irvl^paLLLEAJ}-:u8_~S(W\Q(kqdѣG >:y;pK)7A`ӦMM4ٿ?C:.--m׮]O>W^ zjժՔ)S}~ܹsgΜiܸ^ӽ۰abu6`!ܽ{wܾ}r?U!`JO; tZ:ȑ#ӧ(͕wə3g ˗/i.͛'  6lذ ?-7gݸqa\>c aׯ@.]֬YR:v薋۷ |$KQG@fb}׉-[LJJZhFk:ubK.B U1$I$)^b4Tp@|||޽ȑ#&Ih۶m||x)dԩp٩S'4'NtЁS=t:uO?=bXv+F~f͚ۢ4i˗,EQbL\\ܢEロ:rQFU GqܩS۷jժaÆ6lh֬ٯzg}vן3g[o5m4Nw^ZȲeh3f42--qjZQ9 ՝ 01'$A#HF0 a A01(` cPƠ$U{Hr{ (=t,qςS):xOFB /r8.㸊A$) ׭c KXxXPHE (B&4x,˚fee2L&nQ>Xu\.(VYб?|Ao1nJ 0۫*\"BP(xyp8^%eC`о}ryex٤0HЉxG7"B#g4~~XmII>a|tddXҦ K3'Ϛ_"32&Ϛg4u iOU>(`lN Jv:UY˼iX0R6[{H޺-,TԩSNZjntJT.l$m}q*]fxo[}tz靭BBy>ic&N'L7.3i>|Đ!' O݄m+V+W~ݴi'?姟}P#$L9'Μyl dfzFްF?2L+D*;Bz"ӽ UIHh!̵Da_R:ugwذabiӦsέ:[",)O/,mV5E3r9y P#aD\lB# ]ӕO|ZrNuƂOr/XE!F̬lHQh}in|m0%*fߧ;ibNWu6!!EDH7ްA8_| $W9oz`6sΟt@Wr[6tLL\RIg&n,,;zÆ6V:V@{ƗOaaI{LFW{V$%I#+9<|@{PwYfUqEn{wֻ[`KGCwHӡׯ?orߴO͙3ܷ\Kn$r#˃]9}&t^б2CBȏ}q$n\SHHDGFΝ6:" ]K(-`(s[jCsǑؿWJ,%`vi б+LQ0^˽{Ԩj)Zw׮vP)~O3!IeY8O3t88a?KRZJo*N|?HՏ@E1W JSY^k$+ B,Ҵ϶dX<j#8.㸊29{+ |״ P(!#, [%oΓB|C_ u/2R', sWvk׮qW+,|0"n׃pNy$I$}OgA6⹞hXڽp9BGBmxn&fq!J_@rjFQhuˊB eY)=9%-í w)G@,2  'MT]k>Ԑݴ-6j8 -~B(^_TT$˅)Ű/wVxr:z^pHRZRU PjeʺX M7x*ُsFJ (B&45go9 ryDDlv8xx?RUY)W#""2CܪB{jiygYr0,YYxIҫqaWV*F {.z*TԻG#""NZ HIZV.ŀcC?x`7 e&tGU%vyu(r#zrKU1¥4iBnr+6 Ad0f0k oIz]go/A([ far, fDQEQb85F$b,7D_ߤ[Āf<_P|ny^.kZl0`*ap8R)9a? O +U%yeYͦVS+T* JKB }Aѕ~^w i%e-̲jj}B)$I޵B(d2j,GRqx|n бK!BmYj*JB!|&Z!L(黧 nw8jڭV_r~iաEV%ǵKCflꕖ"W nvT*vr*{VqHB9+̡fJ0zxƕR 3mq5@X)H "ŏW]),)۠e D=W\.j+ *RBngBx`_WQX 0]zKX I|SL%e\<DkqRHR:_`XFɶ*g-xvzzA qƱ7>m߷rm0~5e9YHd]9;|wsux6 X[LY/=[ Wٶ;}=m޼7,W An#pR',2Ru_>7IsR15K`rbL׬Rޢmg#'|ȼadeQ){̛VqEϦ{7p'\Lk놏-EYL/L4NYæ-sM}LLUb:w&1&f)Rz+ =!`[I$]z A6'd)<s6*4oO @n@#Urp*I<}.-ݲ/~fY} ll$/P؛7 (l{lYk&7+EB\a~GO^R{@"1-*E566ET4y@ѦoQ qtBUՋߖ+ckQEQAJ6RR%o?M6?t㊌@g^ R>mHK-<\02D9ƾU׮ ^?e "N5UABKduFW ]3A3p{r`g~ٴ'%j`?˲q)Š0+Fn/%{b"cB03^-^P(ق|U]N;Ϧ{lɹn"k廬~gr{1p<xqsV|5[ [ [v&ӱg,f2/|IV!1\g$ii7[* &dre j< $eݾx4ctFֿKc7=H8xy>ץӔ>=9iq=iOmSvT\~䫖kc@t|=RP|`RѢXWhƐrέ-E|.F =TL W3Ch8OYWTt )4zuŲ5 B޼K?˦ '9 ՋlGp/V] ̍-KUӟ]NsSbhkQZ5K$1MXNT,oݾ.o+Gh\U=K?9h>q Hw967˺wG~eo/Tux$drBg=6%oVds?zòumYtO:>?? oa|g;7M T*̆b !@L0@"JuCB b@H  !%RcR_'v| \.wg7s*5r!kͅg\ bW䕱1Ma0|&&GֶX僴ۏWO#R6R5]i[SzxRjˬ2aT77P0rs̹۫Fn6U½5JS+w2'3K+w`:Cð#j4>3׽4joO8coHBFv]SGY\\7aPp-+ZKiN4MQH}qG!-"Q!DNcT* 8`kmv]^'יX|/J:[~ >CYmۅB>B)m*v^Z )e4٬;;;LMMIʼnRaZ%4M)ؽ,3O? \.v#AA3"X)E3o||(XŲ? HqcH!K lE, WW^dRQ} `±7rb!8H/]%u'`3iY&E^N ރ0w8Nfd`XHbz8`{iq`OHWFivXk/RVtܝ[`t ,y+F`,l'ʜ`V`ؖNf7嬪;*^hIDAT3LB R=$uo8!.tbqDi{i<lQqRE0,Y,+82Fg& ,lw,P?#]MY~Ar`i5%'qw[5{cz[=4;^FƘXI4IENDB`dtkdeclarative-5.7.12/docs/images/ApplicationWindowNormal.png000066400000000000000000000122641476226662700243320ustar00rootroot00000000000000PNG  IHDR ye pHYs+fIDATxke9ΙLo5 6BGFRkĦELjքr+ !& !݂A.&Si`bv.نRaʙ\yO΋wsSq],_~Gݻg-oy*gۙ?L }7\~m'fz2ݠ^ 22<<\i3= 36 L` ,0&@Xa 8"ر㗿k׮~p8pDxg̑wy~iaJ)epp.[f˧^i4W^yy睷lٲG`GU;Wкu.-[|-4.h|ɇ4K@wܱjժoۿo{RΝ;?OK7o^jնm&&&zo}[k׮}Gf~.Zb֭[3OիWw_<3޽o\r~vTM6رcz{{i+X@@ݾ꫟} 6}jo^xoG}:s{챍77Yh; s]p{ի;v|/4/jmܸqrrr۶ms= o|K_y啫/^ft~NpD; nz/]nO>wy穧ZJG?nݺ}?ORojnztx^wmvgnڴRuY_;+U=?C͟?noN`믿~ܹze˖>{…o$kٲeK.}'m.ꪸDDVrJiRysL'x1Rʱ[Jȿ/twLLL>N8gWywnӁѓN:]hpp+<3j3`g<+2jj?-2H0p駟tI\sͅ^wޡCa?^z?-o_+XdGy _B)eٲe+WK-^OӇ?+V׬Ys?XjիzM7mܸHSNw-|z>C, ?'x 7w۰aáp#پ}o}]w#<wyR\s5_͛7o;߀ ./~x뮻k׮]{iNO>yΜ94N}_]v]>[t+Xa %B0+Xa L` ,0&@Xa 6>>>s*V@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0&@Xa L` ,0V Lv=RT*v{>|G~~7\^^1߿?>wzzzݳۅkl>~' oZ^^OwwwONNγj<{NϞ=>P cgϞMӳ|>ݽyʢzVVVn޼{VV/2^zu^UW^]]]=::-7n,zƍ{{{l<<<|7<_Z^^<<<_x.zE{xb<==l;@beet~\ׯ_?%x$.]43qG@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@L`@lfpqLd3.`3.Çpq<|pwޢg\gl6߹sgc.;w?::ZWя?>pʕ۷o/zۯ0 0 OtҢGmmmW_}5+ǿG}.[w^z_~_&|ڵեqGft:=::zw}wrrvR}&_Ң8uIENDB`dtkdeclarative-5.7.12/docs/images/ArrowListView.png000066400000000000000000000752451476226662700223170ustar00rootroot00000000000000PNG  IHDR39ҩ pHYs+ IDATxuXSCADBLl zDB0 A;v@fGAPMhR%z@Ɩ@8IkFH) y<AOh,No2qD#ISOMDٵ I\.$KAAX,))U6~jR襂o'I@ˆTCQDO8EʬuvK.d@ Z֎HW޿j[ Dc + POԶL4D $Iܷ5choAh z5ͶeC˰g"{8xʿ|ѬcSN]|p%s +O#_$p e+}?2? SQLs/&Cvzk 67]0s,x$?E$o$jlVx֧C͘/i9F*5) ܱuGp0chH gzUIN ~~RܻLf>7%0ce mTQ)++`4s.oA].*)o4=+zjBvmMsƔ} C:%"jXϥ| P552Gi jR>} Ϥkv2P9\N g%:-ِoEEE[-^Xd6L̚;Xħ>}SbZ^AI\b^KI*8<[i Fr13Tute2TXytqek\.C}4BL^Q],O I504еv6) fQCM;;HKsn$I@Po)HI1;[JgħeH0s/xkA1V,نZA/Gs.g T;=+۶gOIR=F@%h;"VѵOtUH?L@LɁFtir̰^,]P$Ad%T1Ԕ :\VQ^$O7}Clϵ5%+*ӷ} ZA gֺZMfhxWSУ;\T5SQҶ\o#mzE›nxcTLNJ|\B5Ŗ L%acGFDӳ i)VkvE$Na@ |5G)H!t? P3[nc0XpX1@Dj_F;!+Gw_я*!$"g"JbP@mpg{?*6:E |HEB ~wvqfc܇DĶl,<ǥL&rG ZJC!M"R&! e"R&!_ >|: _g$ҏ?GͿH?7$IĔ qh'O>I)))?1FF ^ǷngĔ陚o455%Ika<"P4@H"H$@H"H$@H"H$@H"H$@H"H$@H"H$@H"H$@H"2eY)i9fwrS9\$O^ʩ?LayJ&$kYR.2j߂ ?>=70T(d8q;os*O|z7_eKp۲ÑߌVT&7gQ;~Gٴ39x7Y'/JTkWƀq"oܿxWWBK̿Tf?ѡNS/@U^^1M~ȫ&k5}Ng?-0U@VRvMS4U,Z=ꭵ&];+~5>z.w!p`+fGD21C|iDY6LHn6P'k%O`|R^VH78eB!hy˙`g5ѐNȩeD,ﲼN3=fڞv';jO5Svw2k>~gB/NOi p^֔L;{NJ0)z uI05)O,;-^ K/7sF 23kj7vO'j8|fgQu;R6<;hӝq~ՉXg0i @kB,))Ѓ_m|6V l/{pnN{۪*hvt{wd]זqdn #Q`ߡ.u]Y+.Ź{*֊ӊ&*% =6.j#^Z"TҰ[_ E;^v1[s2&]R`llX%ۮů(byK~ʗS;q,~`?CO Igk[9!@8B@c+o«ϲ=Vjn7'֦y<9-=5z­۩N7B6+*TgJP_RQb7 +.58^PUȗS/meJ?7v@45i[YX6jzI5ٌK)6ȀƔ4Fgkk5pnCۮŎ)ck7̏F6mt3R5Vj!8'gt&jd.WX%smVD\soTֻ #{R@4գY\(md/!!HZ4+QHklB ER&! e"R&! e"R&! e"R&! e"R&! e"R&! e"R&! e"R&! e"ȯL^IFjf gfGnǯ E{"IWLJ<k۸b$;^0zWͼkQ>_sy#H9;׭BVYj0^vȑyd=*k?{T%oVWZv/y[Vvo!(=GמTۜ,\ɵw'MIYuF:1 Y'#w }z)4RȄ jt;9_ߘ-wgWfEH*Ƭ^jFߵvs6Pű0 ðf{|Jo{24&ouI87olЇs1~7g 7RxI>Fy?,V41wYߙ 4鞽M+[E,?Zaju[T휰($Cdج|X*x.NzGpʜz RP夹f}\O>W~ZM[k 6lOF]Nsࡢߊ\ٶKZcQ鏯~4[}[,zm+@U}d@efpab@U4{:]=֙ƝzCy ^g Uhɸ۝dmӝgAMy9eeboM=yeŤJVr?M-+#LgXձ*]G8l7q" "B+Dq=FFibҖȼbҴ? j M\ ̾fwٶiS6>*h8E_Ha'fɡϔ݁ ǓO {win^MI!i##* sb՜}{-ɭye @+%)luY@TVҔ5(*׫O[&`Jݦz; -䔕S MBj%[O^6MXZsU@lXo hSʶאp`adTvTN=?ۥʀMgq8_]dWMJtm:id^߫ǂ=tMavV_k6D+:htJPWןfQ@>b>͌@=-{;aZxDxgź7pifͼo>>X:l(^ϊp:lx,)8!>oJ=\3ܺFis;,?bN7s[8_;r?_abngSSNnvg2__;Vq2ucg-r5wJ1KAƩ6*/Brie5L e 'm?a߇DzTqo[LtQSӜu-[yƾ^t,RH2).AAv|rӉ}k.0ڲˡWl ('oU5U9G? 7sɐJ,1).|mcm6Q/E G1-['c"#1K-pL!~ZiHyU% Qc |(tHL?KL[3 jjs˿iGd X\to^UEuӒ%C:jAM rYS ,q5nAv1)$_x,9eeyd HUSx}U$Ģ^aN1KJijH? 9=t'* 8':u_p㡓~6a$E~>Ew>R/vxP&$%.əZJ,m x[ہ+ϭ91W^Ltن2]Ŀ4g꾗~UNiΔX,qwI;$WT[k*Y;u3xnog$[;`к_*$}koA&8/8X@1Vd?ǣ_]GX.(~~؁MG 5T$~TlI!ڣgKn5o[=M ]] Z}=$W/LN+,u[WO>2gkhU h8 a/6^TG[9btvS sitFiNR~էnQ6lֈ+>8ZOCSrؾ|wOmФN^g}ج鍽0)G(eW;GhNg3C1'gЀN{q䗓i?vUfzCV:vf~;*=?'.Ϋ)ii;IDv,w|ݳR`,0F S Ād05u#,&. -.Emv [qy+% IDAT@ yUO*Gܽ<[L~dO#eJڋt0!s,rw܃w wqH?g RbX(4gį{N3;ٷv!VGҢY@H&H$@H"H$@H"H$@H"H$@H"H$@H"H$@H"H$@H"H$+(yN RBǗK?e)(~S7BS+_OݻNI>: ".c&!]~[bF-?d ˫C&z2KMYy}SXj(K sosߨvAܫaf'L{v`әM\c:X8Ot֭9v!4c= *4HT*) 5KKu:^|[*=7[D+bu'8Ѷݼ˚90f,\hu48Dl Ɋ7f@2k=wJ z)1pǿ9zz^ dzmyuw-ۇp?+qI͓WEw}vi'i"9cC'~4ĴҚts >'񡵆*[Ang;{Nt:p뇁8˴_xG;ydzo^LM}V^BrI Z BU23;gۙ986y_ jf׆4{n!vh|55$و߂s(,.Qș;S˼]ϭ?f+xynיX ê0]z.CivZC5m0 Pr^ݻgӹ1Ծ#~~ki/1ͽi_}2HL}lunėܒ<ֆL߰tqϡtƤEa#5޷F1%֦+nG2֞ "Jb4k 0q;꛾8kii8/ _c/S_6G5;ȩ{5hg֦#L1̍SU*"Rzv]KEtSL7=|1YtAcՁ]h{^ >0l˓]*Nyo Q<0kU%~"3*Ja!HI347yN#?"LB2AD $LBAD $LBAD $LBAD $LBAD $LBAD $LBAD $LBAD $ N|UiGV|ˣ'BX$"G"Zdž y.6+!nc;x?[ʹcӕV-Է1?`ݧ^J%ysPlFkT 1%:\h3y-~e( ÿ.f}w`R$vڶfnS~`1֋f1LnՃq/Nd,.7~UvWe~{39p5WPi F89Hr/g L܎ޥXdPvtN}&|-Ⱥz䍏 IOw2OV%==ghwNv=m~!2!\aJUl;:o ,3 e<ƶeW8uY Хȉ3vYw:# |rϤ{/vc}灕6-l s" z*6j]7eޜ>l //߈5#R_ЮKncvִC'L]8J7~%y ۼeioص/*ʃV}pӺuKw+5Zչ\ut#3M&w/_6uh"]bݨw[ߜ?nCHV"niӆj3 v֊)QXSr֛ҖF@v4TJ.*g^ >2օAD`7 RK4גau 6ଘ4&(2o`$!:mz*3UBИD^ O{wQ4 97Ywbk90?j Mp83m,S ,P2C/+@fp}MEy4mmyluٴ_/}9Vͺs܎Yޞ Ћt\pw)կzD~ Ra)Mzf xIvn[/T= C5ͼɾcL=ȁ.(\7h"3''鄰/f4l')shP~+H|IYZq}P]zTX  w4c H UeC3r4`Q]&)<;g h~v}Et5.z?s)W? fZDȩ1&h;_>5Pe詳yan}1q!`l%%ѰTFUU+֨5TY2. s< MbJ&_NBxt8[1GWJ# ޕj1Vm_!TWRa033- p=8.,n@D|jSTdUEmVUĖT80X~!s%]~"KF.|._Džy޸:15GsdԜ;*5H)(0k8< WhycU[UGtHam+孰baң;&Cö>ԭO5U3/X[ǩ3 F=}jhB0cCyk}^ִ=8`Uk54{ǹ=c~L\P:أIЫ*iH)inP,v[vܦ'[KacW}x/?*.'qYEnEϽ[]:gɭtq(rӤSW^ (Odg7DPq֠,b=pKgV?ws'=ToHc {lӌƣן9Fǔ&L$K>2lӎ ohZ\k܆V(tqw_ v#Lh@m?Y4B^rD³ïgBJM'v̳W] P Lo[Q7.Le 2@_ˠJ6n\y z6&wO]GokK.gAؼ:S67oNt ŀ;.DWS ԥ~I)(zsy~kfڧYލGŠQu0 : <>dGe^heÓW_a+AHW 8v*hlݨ!L:NBrk/zs?tMn]IItJa+e<<|MeR1GͲ_kM5gV-w46s6KohHsaҸzzz-mF y~"#vAsKݚhghf3p)o൳=fNonEgC#'FXHh#XW[[[K[נ]gcy&# /072sns"*׾- 54 ۽n[d0!N9a=I;x^'c(l& YP[[PF0NX k;N7`ftnaQ?4#@iƬw520j7p?+ð//`@o7v^cv^gҭk(֕1tutuFn *R5kq{cghˮ 1Vڜ2] ۃdK%q$t7s8;SҩwRt)1kh8;#,E y|s#iR䔱ؘ&<]b|r[ETf!gR4TW\JQ׸X՟8ltA(Ag&oX+ΐb3lϊQ7رF1:KfSJhPrrbꛪ6[,'i5CڏⅧI٠R4&q[ukh ~h22 *Fe?1[[UuѭA-_Jf`R btTVEg)eIjmd0wpQ]w;@IEaΊ;|?q8m{>_ܸd>}=~XyC<[AɧAibg¯6vO&d;^\fߢQ4@H /R&! e"R&! e"R&! e"R&! e"R&! e"R&! e"R&! e"R&! e"oL~yvjzfnqFjJNŏ^= +KO,巐N }iee SB>p7ٜmʻ1}э/{ I-܏}~EXa ?p݋FAqGݻR XuyuߥMjon}Qa6팬h-J\]i3:Km0(y/=w2V,~5+tc@܎8YuٷX—aXgW#6%. ~sEYVnZ*r߂V3 }l~GZS yI3za}wtϋE1"cΑw5Pw֢aWwr#é3i؊_x¼{vvt- OE'n|Tk5_q`72{ybDN8ImRo{A+nH'OY',|⬍ Dg|dAs/Ȯv)>]^6m:e bLն=/<*olZ"*ѽ:;rXv-Hd<4e% =9goP?'pp] cݝby3* uq6lōр*t ^ȁL}_Oy xYglc:'QH&_w"0s[8ߒQ&'8Y8V> ~5͒篳/mijCKdL2@yx}7kua 7'w:zKn2Qœ!c3]Xaow=Zh?m%WͯdD>XDbR;Zk Q$3=ARl4Vc g]fƒOP~4[g3s$1[7L6w" Tsk&'E7Y$7xK㚳7`|usu0wyu5^Z#y鑅+ܧQKB9Ѕ3:s{Ϛ6q䒗 ƛ^\8g!&(*hMf-q(~ΜvO{n1xVx=c ?<Cr2d.7H" Ky*6rTi\`hR 4N--M upƻ{AM.63N;}_F >]=E@R ܾt"Y@Ki9jX}ˏǦ82zV|Ӏe6]#:hihtyʅ=@gmb7uSuX6h=.2F5iPƽiVZiY&띕i.t[=X(3Z_hx۱Nnj /_.9?x2 ys^j|SX& Ӿp ZVloiN:\:0z:F],̙3g>gs=]v[b?8e1P<кSoL,*Ky>OdmHv76O-9h*O(p"\>..cRwm4ǁy+~^ @u~a r#N:aa#Y7ٸ1/p:Sټ5ˢ >:Jj>ؕC-Z;]8ܧK6@e(BUwB BqgV,6}O=Y޹ hhywO.l&s^-9n]Ou HKߴҡ'nOUwwU_M2;AZ5iVO|w_,s E76gW _Am[KL*߻h z}A7綩3CuH.f8ywM- $%Ihb4n?Ɖpf\.Vv.S?sdgmm2Js۫OXqCJ/o'90Jye-3q^ɛ3zסsVș{oXяvEɩ`*@yGsZ E*y ua ՠR\@KJD*jZ(:SW ]Ək|f9,ZN=,3{9''RGmѳ;ͷ!27f_X^g NYkFb-[49g8'$N -Uky`w5zǔrhg4|Mo،t Gam߮SsY X"yB+k3=hYwoYx. ̛qYl>4Jܟ/ ѸȜ2@IYAS[drHsܲb,6XB{c|ev1䒀S8YŪ BjƋ/5vo.퓂ҼNCOb%E\:}J‡_JP'lZmE Ni{))۽k׮]v9_UIUAb yMl#ʬ#66c|5p ٳo2-{9l^Iг^>z0^dj'HZF}\LfO7;_1Z7cw7`2]\uv>[n=GkWl߂HȷtO{zfnaYWeSoEp$I1U.]R4Sa*<~avHze_+ki@oU1(߶p8ʆZr&Bi21R) 9ww{}%^δ9SbrQ{ uyV-N+.})B+o{&nK_DP}W | Y/1Zw4Vmiמ>p] 38-,x T@ˎچa1Brbgy)2LfxLfq [Y!KK@@X5h27\DC4)$)Z$ 8J:/nFQA( ebR*ճe[ F@1ܸ;?hΒg#a'DR<{f!bK5aڈo/>OY,/ct ؈m| nUQ.zo@z0uc@*p'fd<~@$'_zܞ ĀXbupv9'9̽_$q؍{|l=O,^`Ҟ 6fƪ\kHb..GÁ xUI{USl},kEfn.6WK-f t t2$9T CCMyC)dF:J5&eyl NQVv)E@*Fepksét #E ~fa!dǥڴǺ95yIA!9Ы~SjLi E&YֳgDODSD)E2Y)E2Y)E2Y)E2Y)E2Y)E2Y)E2Y)E2Y)ER2 ]Ykܔƶ)}{azcWCSRِ]SDy{nuNBQ|>{ύ*;\;!J@эM"D_{t1{eh?bׇ* 2Ok}$77.m;_}]y޻MC_k *|`L1O,Yy + e}("yƯӬ__H]jǺ8!dy}N~Ӥ`aIO|y9( N%O׍9_&?cUmc3:}c0 7Ȳ #w'52ɴs+Òv<;<ʄ x*DZxyCtbBMO}Q)w[:.hȡ7.&JL$ b1É?~(?Nѣ35]eوHjȺFш#~~͊Js 8 Fks${ |&m|\=ӧmx$g.݇\ImccPV6_]Z1֩KcjEdA!,"b dqN|.oqs/y7׍sbm%Ίݳp-)=Q0 pfe8y~1osmyzim'y[cK~Moυ?W։vc8n֝{w$2]\]5֩u>^"R*-\g S[x% 3/-ggGDp6Jo #Oqacmg[Y5=;)bO?;nsƗх@6Nŗ<;sc60:YIZfA&V#e=b@^=d0K=8q 'x7(\4w_I3j{a209]VTuN1?Nra}|*{ؼniy@f_6>f/#]0ѓ,C:@:<5{ '|$_T^ς؛z<79߉p”#c}#ݗoY3$6m\v*OQkvmѭکX& O;vhѫ7s7ufd! -n^6ކe*zזn+n{M]0XنƎppuFL\di_Z6uោ츍(hg?r%OږaJH /NxwZ[d;)Ǻ~h0"`eα{?'s#;,;MHa[xϼ6#`5V"+5{.*JU]DYzRhv NjhumQ'D\ӑp:@Kܧß$j+P:νxvb3*0g3Vǎ=ޡ=+6b3c}^Sз]7> i8|0*udWŰ0̖ѷ׹څr rr2"Mwgz+rRYd|y&`Yvoքn7F=>L>KBZu#ة]/(Z1GbݍJ8z;grNSP_ m&reơj DiVݙ`뎹zz DK͘}^쇮^d[#Ppćc<ϟi~f=3Ò0|:} 9>x*H]\^(ሇ&nuPpU`Ӹ@ ]Bc v B*A MG$j0ĥ9A U^cy5D^O}x4M z_Ҡ]4gTI X0S޵w{׹jjeZZH])kkɱ<+E];_e{va\ngi=WuG p ':#5!4u5L }q` ZZU+4WݓN44U0hY%:OCKj%m :Y`S2SzjFSg8tVMOֻzgghd>K 3݃~L,!~ 3#Z%=K6r!T$Q }"2kPWFx$8+ʷˠJLgP#nZѣ6.-WY5ވuN؀[Tw*(֧<'۷|ws2ɧݼ'15 @q:օE2K0 mBn cMoiMN{[)/g:rɵp]ma7ķ_Mc)SXVSVU_Cz֚'+~AǗPi Kc=!z*I.`XRD64Ǝ:jr,QVB!NܰIԻ,q)[{N_Ԍ~מ\Denh*r3IDAT|'\*(dqT,@[X?d҉{ = |rI3u֍7I՝n!{ޜi䲳^ssY=j) Ea}6i@pY m삥)lHQ҄ClBg ;ru ׾4:G&+Ka;`Uly}{~f.zNo. @}"W$FQTr=p|@Xփ$>Ќ۶OimlU3_z߾AQq$ .$Ej䨶YGCV{=-eKf 0JR:sȸ6xO\}&ƦLϯ5# ;5oѼ63lR'8"FS}?@e?gg`Ǭj9SkoWO~Fu#9帪Bex" Ať x[Z0:F*ϱ;=3h`)WSc~iVN*UN+1{M2zyYY%mc}e\T9Z}}W]ȓ1St *>$Rp7B` :ng 0z6+**i+U%8;Ho(Q[YHiW7jpPc-nC*f\ o#U.u F @gTgŠ r}]&RPϢiҪ_*[ "<~MC-[$T fRv愀+GR 2ILJ:.濛t9ӂ\F Rr{mG.X4!_6/-M@$J>t-,tzΏ@>R1?દ;4v%_ fY)E2Y)E2Y)E2Y)E2Y)E2Y)E2Y)E2Y)E2Y7*3'''77Ƿg55? KяȰ,B]LOOwrr7nܷW}wf?N)@|`݉uݞ/pr.LJf_][VM޻}ۮ ʒbj,ȍIbQum=',{y dFC2E/77ӳXGvlХKxu8`郢o^̢[b.^lھuq\8'@ɽ|gϛ7wAZ؁O|<`IJUV{ \.֡ 蝸u+6 [fZdIllĉ Z*\ͦ=,HG-ԱoLm0|ΰҰ_*Q@zl}w2L;b\>hH^W/>9ڔf&{V#A:B©g^84෉ mp>[A‰-I [YpLծ#A{tv\: W*Qپ祿=4kãjiaӝuu֡7b MuŦ˴ǹz<;ð+=Hb)=ٹώfSSuGReBP$"K|'984c8=;委J'dqqq ,ػwR[s|]5Xx5A7LZ@$?|D[6 in:q&_+ ൟw~6)ky*Qq^Jl4 vl}qqbMwH\9x_3S$=|co7 $)~S-k2\tti\k[E;W U(gL&ֶw &Lponnm̬|F:v<=DlpāʍI"MInnVǀ{ko2|U97lMpj'Lh5^{U-ۂ ˂Хg*)3݊EϪ1  p]e#Q'\{Aȳ/_Vz>dɷPbǎ/\i&$BBBm1 ">%FRpe-M /V0(}mh&zxpXRsxsZR@$&ߤ#ݷKS2`aqtqMp#EB (Vز+LW!=G-Ds]ްйǭ}_8V+x]oU4UUzZ"R{e2C1ѣ JJJ7n8p9sy͔ >%@}<6edV]O-V'BJ9g4][7n/lNj՜zRa*Zzdr @ owP5;Fe9t I!W0fԥb9qWOd4Zhikkk:uUVWWWm Omb#Y|; =1-G7+&+Qr{[" tJ̸4ԧU>LMO hm&-yw'^VWj[vEYYqa[\S/P~s+^iU:ёq3'D gDFF5k0ezEZ&0֕Zb0O5vԒNtVu\szK[ST[YYo6_De<.]S:Z0>g Fҍ{ k;R{⽱u T{zVc c0 nܞ$SOx> $FS1/ {#g<Zb9mC#`D YYu} yܰA`FDm+e e\y g eY9c=Z1Ҝn⢫­GN7CrPQ.S R1 NnUW'脀tyj/pu h<k/.XAǯ+ŪaK(.Ϧp3yN6mc?LI|L݌Hob&!@42Y)E2Y)E2Y)E2Y)E2Y)E2Y)E2Y)E2Y)E2YD_ݎ yEB9sP!$(ū2Ɔ @%ܭ>=unMPVwOMDf_7жʕ%܏terƺ *KOJKKKeņ/_$ 5 y9on|'v9EgwdSڞ/^z1Kb'Sk_p.cy}ٻ&dY#EFu;%Dʩ<=rխcmWaOۯd;fKD^sGphɁ!wfuGn+oxN`m+bWpjJVMȒ@΃kqNb6`XGko*<<:*a C]yRDsږJ6.FQwSPr*~:MQ90:)YZDih܌4Ҵi--J>ݵ {_#L5K m=fЦBte'ןJ*8 ocɑ>6Z֢Zxb  .UEErK٧9eXOzsPSWQΗkT5DWRay@(!AMie-߂ȼ8{Q啋®o{(h*rBم,ymM=Lat MƉ7+LL,`$iH_1(*yP fDV2m5DB!Zy0%m-7Y%j%^ X_}"[7 Yb\JԈFcsW0r> b2e\ӳԾ{B1c^ONSwrQX<y b64C\\& IaI3 xsQ9']˩˼>^}"}V{KlPD#H1S0d 3mg(sɧ낃3&Z5(KY=^MmЧz)r^svjk*P擁f.k,&c7{he:*&Nx_$;4xєhtt5">_ '.OT<##mƐhg_ɤ)J4/C2WK 3oYن[ׯtͽ =yNsPrg/j)~+&SN?@XKX$&qTRRB1h,ͮLeMD e"R&! e"2g"2 R&! e6afϞ}Ѻˏ=:{?_/jzв baayIɅ'OhZ!52"M6]8NDDNGDD5v׀[Mg̘iӦt8Ռ3pSRT*((Ϯ(6 44Ю]z#B!IR pTo `!RBCC 88`4vu? I<O Tð4q̤ n@nxBPv D"Qd@HDQ  Hğ$I2A"E8D"@#,Ix a510>@a25ۈXH ꎤt̄*qb@N@du^:fD(l"jYJ7+mk@ ~ bw>OP$Y,a$IV0Bx<$N7!BJIY.9.s\{^- bYV%+Ôf*ģAW. ?AįV+$FakY6 mWDžB@ R GOu+VgϔT#Bt*Z7'sLJ@4;UB>_8AB ϔ*: ]RCF7'bMV{j)JOL1iXb0 DBnP Yo?t`d F*E=0Zuu!RIeJY3ߦ8W&~jRI @UĪ޹LCCa^}~J%ԟJR=X*6vN&B} 7Zhk=5wmW웩? aFؔ\X+dH$V>).DoRڃJ ')YJ-^{dQ \7lJ~^Z9~Ξ6 IENDB`dtkdeclarative-5.7.12/docs/images/BoxInsetShadowExample1.png000066400000000000000000000030721476226662700240210ustar00rootroot00000000000000PNG  IHDROd pHYs+IDATx=oGݽ[Hȇ)@:B衦BTHZj-ؒ)PadɅec{{;): 0B4Ŝggm77\O+KK{e?hT}g_Ȝ R\XpRx})ܾ~}ѣjġ(a}#1|f0MI&_gݺ<+,ٹzrkcZm\.!3 ϰ^6[[[#++W<~cSSST {gD81Y>Ɔwk?8s;wOG=13sZ=}ljpZ-ϣ-| kogW*cQj޿_o4vo+|ydbbV;E"/|kmyQx(j#VV>ǓJ\?a\TqlƅyQT,Vxsė-~% b̸C/ ~Yk}dfol~a]s7( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ( Z- A EaТ0hQ sps-,s.˲9( _97Ɍ i4MȰoι49`Mafʜi7I 3.EoV'Ɉ1}q΍,NV-EvraUjx0 2|ݼ7qjjOf\؅K;fud4+INYk6W; /c|Q8ǏK1f0M8P) y5Z-,ˆiޭ5O77_lm?wn0~Nvv^813s|zzV,aX}}/Izɹ 4fIvvn߸<_8E0,y$9c|%ɛ8~nw:ϝvfKa?[YDZa| (Eѩz 0+<}~uu~I^<+ez ͰY1KEM,zEMYnV[XNuW+7loWWlaSY)aJ9 6 Xa9,Q/#SY4=ZnTZ㸫u[v?׏ww7fΚag8$PziQ:Lny)uQnnoxwb bv6 ³yVB}t\2HF^bYi:po^߻CSn\ǘ^k߁,I[\-vj=hju aҫؤW_E^qBr/%#zz6Q,}Y^ݾz(Y3l6OzEzʼn#ձ֢Zutܭj\0 5 RV"^0ShqܗE3.(\h_ tj!׫7Wkm~a&>Z/ѥ1siZ{G-Nt\aChX9:`^Bī2 sU6n nQU%[Cav6G:=WaV*2*c@4 nZeQyPk5r.ދYC|)ZݐVQ~ߺo8Ncl6Vѕ#3YbJfO+BޜMz ^{qŭ!Bq<νqPJ5[R|܁fz$+ Oxш̘H o7o(E͊Y7dMxӫgoz!N)]/V5^Z dHXz͟DdZ>: \""o]¬ACԘMQA-'[ V˴hd־~Ή"3+"LcAYl1֚NGV2P>DmwUѬɜWglsv*!L|aҋTITED|PwgQLG4/S:z4M9FGN>K@oqn!!V Uz[S%C-~}Bz&Kz߾[H~ 8y`biЋ^mX;(0,@q@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/K/3[n }ZQےo.rK|m;t I4$2P.wgǢ˘;`LitPbaDzų/1;D^fb8}qS]3iJ S}r~Ng] W TAupzSRB9s fa8Nez|qq777NMP5cxףD "U=~H熍M,]^O?k꟯^%5z9\3Z3=Y:F~fO<7o|o/^fY)C)X01Z/=bzMY3G4U/>ӗ_xwws}Nz0"5xQLP{ű̞YȐa|'Ϟ=]YIENDB`dtkdeclarative-5.7.12/docs/images/BoxInsetShadowExample3.png000066400000000000000000000142661476226662700240320ustar00rootroot00000000000000PNG  IHDRkH pHYs+hIDATx흿בƫj( Pzʰa>7'ȁl 7MO@"dWmP]sNK2> g̝T7e~J^_ׯ^Dy}0ϰE|Ɵ2Cq>EK efLcsŤuLSulQ՘Ǣ?xӇ?=^>/ϞjRuS-[h U /%IH6Jڒ!kJ6Uǿ~c~_8L'fHX :֕ Jw+ rȐLUx?;a+^iH5xu6>B(U+cG`ZD|t`$}?<{}_=CSx^̧&~aW9Tuy\9h[FT111JDJ"g#>yy+rZ21њ; (Y|,3S/+ L¥|i.f026ċVէO[N"6SR!ߎ~&^ j0en?Xtkt?&I(6˖nح=cEA\blD'HUc~9^4odlV'fNJwh䰮&QA8)ޑZe+ȞPޣh٤ +h]nirf$l^V[U.2$b3%^]ڲ|top1Uƈ肀O0_D7WiK>oaqD8#ZO) $⟵Wv1TI$ZW4F;acxƽfٌ3 ȶ T%g~ܚELU|u *P5`7:?Wivǫw[% ߪF 1!Ir ks/p(]c וmlj^C8\-4EUDԌmk=$g>vf ٫ء3{^yH`7Q.1{Mj&a /Z{r+5˒D3+X"̡{u4ֱEX<up\kSOuW- G N2 x Iʼ :6OP%ivt\:IcN`TUcLfwpr {yeLDDL/T3Y_4ojO4ݢ3kGt^8ߏӷך*S.}Tqu4v'1atM{Un^{u:,"g,"dL%t+^a`,u!C$?rHMW^Ӯ{yĎCo扞M+xRMDۇʑ!~4AqDMW ˵ 2#b::/E!B~GO*-1Zs7]Bn7f<•]1Qv}"E٘pr"*?mKE-g򣩞բfo8~Ņ$%wC<3UJaΓ74i&tlǓ̬1_} D{WD1 fS"KSۡoue@p܍!(Ƙ%̊dў=dzX6l/ wM6'dڻ?o23ARq5ˋH0֎mő rn1$M7KC]{ q)o;μ.!}U0.Kb6 }!"y|q*y9F%05{qNL>1SFV@0)*i]^Ah dxM^1u`UMW-dK#3Y^&R{^Iʭ}`o[8V@ءe!SU"sdv 47|̀j}{Tw"s7QӘ-:9VE[겶z52MvߗoޱĎk}AgPy\z/4jWWd^еo^]$4JAJWDӺ! rǞ4pmеV Sw^J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t ҁ*J*«t](ffLd03f`@f[bA?)3˙ulfl@*_l^Fs+wMv٧f^2;CJF*{uub/jΔ.֜.uFn;9׭`7WOL _ ~_p7ߘ};V!{&+vp]/ Sowx/DLPn5g}E ?5z“u٫-m9yLk噷Ίfo%>O~8Nb ܽhQCަOt3 r\zK53]`3p3_^n/ KѼ8V&ѾOH쉇מo$=ouV׭03{ljvD'E7 Ht3}/#e%t{MB+&ؙprؓ2{5TD.:͢nb,j+`) '`Q9ęJ"Er[i^7Flu4X Qf/ܕFx} _d\2݋،#5[@˽.ָW?EGt -Bvoܵ;FPf_:;f$B΍u5q/w] !gY'eČ**c7±ܫЯʻ.ׅő:gRf8T^]uJdƖČ*3Gw#"&2$"|T30?LX="Fq2N kKܫc02BbJ"*"w^UV8΂a10?1uT(ƽbɛa9>ubܨHYhP 2ƥziV`k3 ;2W<2鴂e cu1Q+)xm(U" VWL*DbA^DTyچͽұ}g_XF{+.XeϺpj!ss 2/fdqlsme~JդʼV-5`y},tRHuk33[-nöYia,սT瞟``x53.D$`5qe"aL]fz|5x̼DĽh߰KDM%d2Uƽ8fPͽ0CDb63`YYl}uvqg`kO;̖pi,C5~l2%ZE0-|5+g4{ 5..^}c% --Z3,޻Zg<(s U" Q%b`c̬D"fFʽ݋}["u,Ymi(W. =3|500N=DEGvتuwݘ%̭%ko]Jflx-r""ba>j"L񫁹{EUuwMWCVM9vkb7S'?CТ&z_~ky"exniou+ bاÇ_}f7po`Bŵ,ږ@pFhؕrMYg {!U=ѤD]rlQÇx}'2tϖ÷VӊxEU:iaiKC yD>կѣ_<~ӧզ ^IK%zY [\OD i/"&E.m:/?O?߯~IŝDp㍙=]k Q-:s_z[u_ yba?O~+ϟ=cS|On͸gZq^Unh zMǏ?я7\_>ɓx˗_jԶqH@ոZxE\qYѺ֧\ x%Uݿ?{O>#=^tJRgteIENDB`dtkdeclarative-5.7.12/docs/images/BoxInsetShadowExample4.png000066400000000000000000000037561476226662700240350ustar00rootroot00000000000000PNG  IHDRkH pHYs+IDATxMoFRlqZ c{`|A3xo{(4rDT×쁎 )nHc ļr<~r~~:v讗/C'N'9z2y4izRiFדɇy]O&zyn ht׫x<r<枈HkÔ1]M^]/t84J1oZ{o_>qJ9/ַ4QJUoTkk~QDax۰2JkȚ:vA qQ+5e0f4]dYV1%/OVt zNj{}6ڴ(ެVlb>.ZM[yfc>,45 ^4}>=NIREyZkE~|֫ׯMgYn^kj^,{1w8CT^U%ayZ)"m͑A]ץiY_˗^]Yy6/u.+r)LYV+}@ϊbe/gWWz5].7Kj2uYKcN'iB=v[s><*Y&|>].yytyGJk Izq7Gh)a,k$UicL[.:( vwO_Ͼ>/˼*C1apssֹUQ־y}T'Rs:/{t84xJ]/_?RƘ{>#1ƘG]/ htudW]佼F%ɴ֏GmTj\O/.NÛK`NO/..rƘ^vIENDB`dtkdeclarative-5.7.12/docs/images/BoxInsetShadowExample5.png000066400000000000000000000040141476226662700240220ustar00rootroot00000000000000PNG  IHDRR pHYs+IDATxˊWs*,ErwA@"*Yz3k"yd33f!`ںEu?ufQ%T^::%8.xGa'v=C'·=ӿxWb2y2iw=0hLGaŮ'!xxq~d7=v=.c"QJ短 Z_~GN:=%9uSre6*! օۏEJYk-BaZkWku {j0K}Z hM֎M Suu[G_v(WͷV!ylah :`[z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( f2 JUVUUYk-kRf2UUSc0 k76-˜(YyaLEa0&u%EQdذڼ,i:yd;ڲy>OY/4/&慥e9r|f^gz|>Y.gq6+k,_fϧ~8Zg§Wo^V__?N_f8nmXX[&+l”Rڤ(3QJE1~n[-u>YϟO]]={zZ%Ea|6/^VYViz\>w:Q廮8$vO7d|1ϧ*.`Ia1{E0 %k؞װ(ÁY/>h~4 ð%v]7߿ggEeV14MU5fDkKk1<}tY Ykf[á;EaEaEaEaEaEaEa(:A1phnrR?08@Q9JN?-MW"5M4MUǓhSp<ҷn [L&/.v=..DžՑ=x\bcZ맣*}J?t9pO 8zr޾_UGMU\~WUնk o^;6ͪɓ'_޺uMUܹs7Mmb`wlV].\SU%|ݷm[UUkkk~rҥ?4MymALaB`0xm[?m ﵽ^znJ  @ @ @ @ Vgra[@ @ @ @ @ @ @ @ @ @ @ NI @ @ @ @ @ @ @ @ @ @  $@ @ @ @ @ *`΁)8%@ @ @ @ @ X߼pJ@ @ @ @ @ @ @ @ @ @ @vwXvw8%@ @ @ @ @ @ @ @ @ @ @ > |NI @ @ @ @ /e-6`rN:C;Nߙ0NdPXV L&ӧOTUff"a)ϟ?hݻt:}THx>t:}4jjݻܼVU4Mm[M|j1F]|/+Ub4}vڵw666>z@X 'GgU3Uzƍ۶mhw4͛갩~U5UZUܾ}gϞ8 Ο9s9&ãϞ=?}TՋ:݂FIENDB`dtkdeclarative-5.7.12/docs/images/BoxPanelExample2.png000066400000000000000000000232321476226662700226310ustar00rootroot00000000000000PNG  IHDRX pHYs+ IDATxy|չh-۱8N!$$@XJ-[B e)RJ}/RҖޗҍ@@RZ-,aqBxE:93cّlٖ|ό5 @ @ @01!}|LBpB @HiSy' 0neFTi9dRiKg<^wj̧JDITx !>q $9I4 # 0`ĉN:4UkZc2<{(B&3B@r`䥗-}ܕ2ﱲO^qyjD)LJII(UW*40 h\ q00HT.D%$ܒn G'y Mix_o|߽C&'@CZ+kgխ,+ .x݋ "Ubq8 f?HT_@' $wE#Z7o @L< 0^|us˃}eK"JJ}Q|_3<$"]2o2z@mPᮾ^n) ft!2 s9aS*Ouy]+ٽ&K3B9DC8P DZ\y{{ۡG)"S(_xB`F ϴ5ӦsTTVt+=P@JTP)oMēouu{]OS(ZwO+ (h9˧PhFoiQ#rl{h Sc4PJPFTN2}ަ_` E#6(_y.{'΃k@D<+ 60*Wsc0_IL\e6X)/:i4ybStźqwL&Ң0%Puܯ:~}h)I12ݠ_) uǮD#w9~6qJ(*YZ^zb/m0 2]=]US;np=щ|FBoG33PI HlL8&kɷogjv}E<ƾ&ڛ 1"J7e3X9 HL'T4H.B`cɧ,FosឞB (OWLX[A +5%zO|敟xjO#LHх[ itz8܄\K0v8+1+8Ҕ׾gQ]Fvݔݛ>W[]}P'h8T}ֺo`껊ɝO._yީ_%~=kܤ]EcLlWplշHe^|K*Č>|@Bt5]/{k§\0-x$.̯c/-ݻ;a^sRP")$_`iמ^9vCTe:N@̬P => \vQA]_H! \|gʺ>y0dR qL(K9J׽lcgƼڞwںQ@")gγړ:&i%#:&Sb0$hٲsT?{."! > =qé>l;%auN hwDt.]&zwwwD"-\'U`-m8އ&uniCTڸuWw5w73-=뻗F.o$%zY|?y~%\_qQҘf4^G%_E]i=|o{\(A쟎ҏѠtF4"rLbbqZU^lΙϼ11J}ŵ%S˾n)J08G`YżhGw^-0G5Ƅ V~usnICf ՘Δ3>lF9 1V?es_uKCI=PK„9tČDYsF_a}Xı !̰p"0޿Z 8\yi_XDbMK}A\86KHDJfGPQ([0?&̤`mm8oZ}0 T@`p>-S5޷{D$)ٟ\5{ڕ>.' ra9+:33MކGƢ-_~1a^5CJi=&~2%bM}q9z#hZ Q Ndzk)wl:/h>Pٿ>8}nb\؈*Ӱ?2sYKH䙼oбҏ_ {hu:GaɃU%.P`T0 {|)2ߦDCX^̊"L,ݴ|XF>-X}E r H0c,?Wa#g4rsE}O+~yM03[$}Z }a]W^T ĚJ|555vxuayi/  t. 0g_;(/׵_~px$sLF0 %̻51JEفOc(Db.l͑aS߈ف*DFȈ7F`7PhKt;J=aE iJT_ރ^]0ȸEzJgw'#ш!l ͊"@w2@Ulk89&生pa'Q! af@:B,#sͅ(a1&s)gl"bC0.ܼ!vGM= c0ؿFiq't E7J0\;yALf8836׺jUƬ;p@p1iKgl RO"1.44%P _:-vQexa9@DWv#"i7@FLG;Xvźؾ^q #$Jַ!!ofGDMtzH 'I'YϘ|D׮4B2V_0r$ܸ{GVѦG4Q‚8hݼz{$qtr˼'%0H GB ` Rɚ$Rk8"9.P01pʹCx9ēmtWLjWxD5'Uf%u8hHib]e'&Y7x `!H2g %xN(@ģE 1f0GBA`Prbq"݋%4"(:8'`MabpJ' hb sSbb:,A1bs|پ-⢉%(24HI a!]E (|!ȜwdĢq9#;P`1}@8GB@$A!ᜓ$8 A@[ <  z"$ 碫WPB!q2X~bߎq( : z ( dL1I睒"(N8 Q I1:avilb@c-WB:w!A! P޼ *+"@bS#&:5ndYn1DǚȰq&Floay~N- !AALt&֠"u5my0*\z0al?CkO6Œ Gͺ+\筒Dfyؐ@udzJЁn .G @DP$XeY`{\^F0W$BǑI)λ re 8D!Yb*% +@ $Swׇ$B%Y@"PoIBxO}tKN3(9 pQ ݃e24S͕ӒzVC3 drRуM3KR83(Hd*ƕ 7pzwݵ DK=MDACzS Y`CiU ٟ$\@`L1Ȯo<@MS #Iwd95 x+LOCDPHWC%N  ^,{P5OI*@yp1K!2:~%m:(&x^Jpny?`F wmm7^fHk^!Ϸ!,\ATPiwND3KPX+7 @uQ0Ǝ9", QDPу."׮8r0+zg!0ڶl=b7=T"*ab?zPwmz9T:ɥ+[RnXD V)9J2hwh;7\Չ{%ɹORnݳ41埯vHbHwx6r}/ cە݅,?D.W Sk#_t EcJrn^9iQ|a5#>umZσFp+]u έ+2">| Ńwm3PH0<\B# QD08%I97>ռr {BTnimLD~PU}@7RyaւNI]ϪY?.9FG h~fUV%C1^@i羭Od1p(ll7?&sV pKMDt啷B4Գ?{ӬxF5HS 8rGJTB۔W !ui툢4"Yk>rκeLq!_a,GŒߎH#pֲoW.ap V+NDA>c D)lжmhi U>d^KSs={^VT J(Ƿ8o0b w$zu"bt̙>WcMEs C I34<=z3#ݙ,+tZkF31޾}E}Y7o:e 4|p@g >"97Ia#JtAyw|0pF{'Jgٴ)6tXQD0,$Q)ɐ[ڿuzG`xݼ{l(ᄈ׳H^٫%LXa^gPHov 1bq#+V dÁze,H4_翺 @ GF `pƶ3 @ٌ55_DRd1(Z~kwd*D5qc#{6gKP:㉇jtI" r*M;2 E(Sgׯ @i3~Ө(\/ӡW L T/ 8Ojn&F+qrھoYU.+TppN5EN2-m P2='՛{1Pcw8 G ӛ5ŋ>1 D$&A(r*УO9nb/;Ic\CPBJAl@r> 568pHi&18be,X~a|Jn ! 84u߅nk0FhlOPgM$ꡇ6o4Jg8⌙B!A9R1hjsӡO_4"Ld b\\9~MYqc |(O8?r! 9OhСg:1 d~@5)6/N46tO~U[A CTDk %Sp>BX|L"0#P)ʨDbO s|rUŗ ,#H@sh 2Ē. {1\G|XF{s=?B*b &zF@q fhO_xxl׌䲲cNOp-W¡8aO|,ak{{__ ]s͟aF #P°)oxP&e/OŭZ^<]zW'9GU PLr2O2s_{n-p&@v(zq/0k71yڴJ~$T(CuN0M&/;ky7!bRh4z[}{f͔jo1°(,%}^r]w]{ݺ5@띯pʘg=T ܔPF4/{!P`Z C #rQ2b)8s*,cq?oӦ5rMIr0ZwkCQ0oŒ/ %똗"W=r쩧:쏀{\ ! (\2kY\b~`9[8'#ad%N?}4cZZDr$d[,p8[L7\`BtjP6CX$`455$^z#Œ v{lrPb&@l2}Σh"qS#YRٕWֺVCULZZ:]g*(R?[>B !31yq9d(F""BΝ}< S{̚ڂp:u2aa3Y$רrup2fȰ98vL4oyy}^\Οl/-,9";6R?WQj0I#G$*T_}npnכ~[~:m)WǕy|p["5KMGM FPرpȰHn+z=5f3|=F#?M?,o!fSZ-)Gh^Oȳ(SY^ GJMKQ.M&I!WP 4Ud6Icx(q&/S_eFCJyZ-4f'@0 )N^TAD*I8V݂&[F`ߓ_'-xDPʗ i4¿+HRxjb'h*u _U0#BLcPv yR-9js Hz e4ΝA4-~Dɕ$B;4R~2icd Bb;)@Od' )p_F a6`IA3IMhEv4M;nGƬnMqfLS5 }n(b(bH?g{ٖ[na߮ ˭M =RIR yn0DQJ cD7Dj9w s[]irecLlEEFwq. ZG*4Ќi̤Ӻ- \"N36.dgjx `m6"LQ8čHe,QU*,?\.=W)RBcA Bg]Ўupcy[Gttf N(ֿǁ /AQ@x9bÁ}or{m ع??޳ݮc< |g;EGK|ԅSP/(`IS7~Q ^H#@HHIZElo?pKw}p&>/!jR!z{vJv}&|!"=.J{/<䅳MxyDyUHR1^OD0RZD#BDDZTigۃ8:H?_CkPMˑgZNm+/- ?=[gO!y 'Dٮ(i_ᛃ WU2Ѹc2Zz!;<`s%ϜVJ˧O{E!^)v"D&"Dp{s_x-ዻWnr?GBKͦa0"xI7?|z_f⯟M9yQDZ\+)n;z!,""( ^Omg~ȲsqAQt oB5jLS+FDQ>֟uw}xDxמR(/%E)dŃ{k솳_<^]]ߠ:$I1RMiM&{3vPc2ʲ Q?i[::~LX+Řzދ]?۔ED@s |/xls-?`m䄊Wc5&{${ӿtQ5TJDy Q Jq_?ŵo!LDQw̿OJ"'M>JSiդ* єkT#jl'$$cua6y_(/51 Q<޻>q"/!J&T$WJm38f= ɑ$cYE*jb\/L%Լ'kGZ}gr+q FHBh#oӮ=J,WJ]Ci>")H_D_k}}ogW(ҩ&TUrĨ)s}qP- y޿ɹO^^yOYڬl.hm1Ɩ;Qny1ȱVO歏̞<̉oaVjؓH xϽ ?]U^q"ˎ3rJ)>?ovAu5H .{<ΟzvqJUk^T)}>z?ui OR.s,MI^9J"O(<CD=4.{<$CiҺ|ܝ^͗JG#U)xr3*rl%qX4?rK/nna?"?st(n4I^ rDQH4i"+o_Xo_>/a\6{W0;"7JreaL{bm ɫRJkZ_-7O.^@o B {o4g;^:?D`/ !j Z˜C=?uOgHR_8uB0,4Iv+ $Aw-+'0W?pqx,Hse{tF]5" ˑce9_}s&o~Ÿ"&JxGy)ɋ+%I:"IfS%׀$ן SsU}Hjջ߾كvǗ&#㮼}K?SN8pn0*W$>B@z=I5^V5A=*r@'~L}L˿^o k70Ct?Q+h}?Р(ROfnX9_VZY4$y_Ο'2U)q!$(sD{S݋y`xIUʿ W #GRmp6:ڱzO/(zhTBkp⟪vB" Mj_PDeXY1dfmMs8ͿJ`G1Y>!SMff>[?}[/hEGQUx# 8x&·QG2 I'^ٺ~)$Cu8Aݰp8 (ŹI_gyԧ@1J@++VRڠ>Oчݭi6?si9y0U4䥺_|ZM4 $wEx_ /&*$LV%Z $0br߾Y!~$L8&M)~SjzGผ;0ff:zљJ( c- /-Z?:v3֎=;y IFNnLyu)J5Hӿn4=>z귵5|G(VڛK+JE=Gh!M:Jt!׋y*rٞZM;C'$ɻ1?v;mb~|K(mb2;ءS[fjAD?yS*[@'}49;#ExXE zKqJJ}5s%gƔht, *2IW ;VֆԪ)n\y;'PQ|z]R %Z)g֞ ij4&M0j ־T뚾yʘiMyLO\Y5(&"I MouK2)S5j\# 8qEF[ .k/Nw@8ERA=';Nlh)PQL8V*c-6,$]$Y>(^4zcHESS+RpF#*Ř{q`!IPDj4N/]+EP9{wx3 cJ@HDq.Hd"sX^Vt:ܔbƄQ}(t1\&H$ ]A=t{]} N퇐j+Y:8,[ucEs!_JPRj?['7LRzZۮuk&32 '7[haZ$!Z\TS3Z`gLvGU 1>jH0'(cؕ7T{Be *N(F$H5HSBF֣A+4/ lxGXXO?cjx9q4JJLʉ'yB⑊dYhp_A\jOHp.TJZʵCU/5jP@G -b= i^+8cLu?0Wx~)ATK#Ki )1%hibǘ{8[ GT1b1s{'NuGcѤc;ONh,`F?r׌38{=Z݌1(%ӊ;g1CB,ώ#sN']U:E&7Ij̪B-M̕G*-P((k3Z~֭ܓQR=ֆ:ŋ‘#>_er;v`m{wɹK(ErǍ~_e"Trn;ރH1ıٵ仭u43!" C{xӞ% ]WáYNUSzUW"0cp.BcyK+R:F)_6pWSRRcn[f:w a( IbJB5kSj|rM~`#lKj2ԸQ)D,rg'~p aАVG3&H(R Z$[4b|lPI5 eb >?v>I'g҇y< 篚MsSXI뤦Xz^HKQcBi祓Xs> TؠEȨT-.*VVhN!QbE[P:Qj4JNe(  aIR|@ Xhˆ=s j211!1VA20N2CZjT-}H Huh!͊ByQQcBbDJ#uq| m!xN'ECX*t HVϵ}{;QJ#*kJf$ƘzBTF# kap'AULרc(Mɤ!Lx:Č E)Ҵ@ 2ٞWJnO^( RcCbUX`1ևP}8 My dkKQ~?|s0/ae8Q:")Z{@uJe`ZJ)'"33GK Q=`a_2N{?jvPl/o?34Uerd¤Wիj6E`>J E2%^NM]ՠ kշ/FJY DD3(ٳ}A V)d?1 V{ RTqkW&˵~>_B繚2ܢrҘ(DuCv)wz1땢˕:Xs+V#p옊&&x!MO*2O;ЌDQ:RS&I LiԑfUטdٴ{p؃Z~?.zԁBAT 5nXbסhiP"TT&1 ʽƌ`6ѹJyq3셨2j\AcJ5ur=xʽMxSw HM{ JZ:((/4Ry f2v0F\`S$gFSL5j\vz;߁2x~a6D!'3Yc2+X֖4JT+=AFţ. 65MT;F>H5A+ R\E F5AjT-?$F"M'XFP  IDATId(nJDeJ].{54J4HH *+Nҿ U}rU X$jjqA,Ja}ϔ:dMize.u!DNjTR ܎?&)S,£B+5j$(6E)6FfcZ;5 q.98J"lw|yVuM7q,!ws+b@pԏpo%=HTڄ>@ԸPƮR%y(KӠ(e<4r!FyABQU!f}Ñh H!ýZ ΅\L))ZAj,!A TC3YV1jmrGy R&823rK&p1pΗ>d%t#"ޅrTWjq(+wd^|Rƹ/+X$yn0j26'I"x΍F#ryj\[TyZĥ Rƍ% ނ+ NtE|H& ބIo6`\rΣGSh䅋-+YnR^?"!V]Gac/X1n* TsIGd͚E֌".xZ1je8DbyU\{=:%biIڂ@H 7EG0A޶ /P -;FDUuYL6G6AV /-Iujh$h\\Gk](\F#ʘ1( 33U~ "ᇴv8W)ȋ}oePͪK5*^ e7^R $ѸI IG@Q/q<$gZlR|zC~5. !>C^P _DM2aPe9hF#ԁLC)E?7ll-C-5j #bHl-s9D.1A hv#G$رVrΕ"ghێ/%y1[> v!scB'潞2 ^&HbTƾfEfh)CR e}Ov72Jy .PAR8 |qh^Cĉ'5j,P D8g/Ndgj^ҒLѣѣiV á'w?[Glk!R6Gl[B־ؑҭ*VG+=:b-. Y p٘Y" '靎l )[c/AC!m۾7'd(9(ȸh`6F(%6>6Ƅ x-oe=rF}i7"h{yz޲s bGsc4GJmQOIHLzRkq'{PdġtDfո(E{v9{b(eU(ZxU9U!1)MIh;7f4+MWp~zIdnB7QOָ(g(pd8w WPHiQM;BJ^E=*-һfo6| Lfո1(?r$B  ;vUDKʮW^E^!sOqDr*:9Gb>p`ĉ Q_[̄WDƌӺ@dOfZ&QZAj͑,WfߝQ,Q(rEU:afFt26 eUcrN><Lx:!.m 6 7IX+ '6 8>)Fq<&8C쏹SM*eBIG}H``xkGpld=H`zkr0Q2X2;.+WEYh<ۡ1?`RA &RjڇTTsqa3d ` $W^E9pȚ84"Q*RIQyc/!Heԗd|Y ̹\bTG&_C-[7EQQM?.UV*bL Im?A4ea JofiɲN\u9Dfqrf3=R4 *2g*]^XUEfzϐeǧb6dCk?*;6ugN@ ]"AE>C _gkyT21諽I/ލG 5X!^rؑ: GD)K ,W;`ڃ=r*ͪVYa$0o[A롢aHl1cNU1DH2h=TX LƪRUn!UՑ#2^N R -nfTÊQ.}o>w` D ܷ򖷨*u1" ˶ի^` rUd!ƶ.-ǹo26cҠSÉ+ͤed fEE)W3}0C?:ak\/H+yZE~V[cL19Q z7'q)A}sa6ky:/@cgqx,l A{$5^ ݂![+e~SᆌʜcGWagi)^}3;^ijw6㹬0G_`mD@Xyx5om>T:č񆪚$5^K͐oeZ, S# G}`+\IqH:OFNX[u#rzVA59$C%0%Rj [g!BVsM4Ӈ 2$BE+^`mA7eΏw&Hf= `_s~ߑ$8>$h wudssH2ՊZ5Ij\RE8:u<njٜYE=R26Dt8(H9mO2\ Ja2T*rJr{;}3!Elpi47"R=t!`]D6{Nߗc:JIUki2=u5گnCTE } gw+]H҆"QZ5j\ Qx ݻXۏ (I'Aգ&^2З8 1^ϑnmRZ'87R)EB7j}#XƧmTBE)Dո"D@R 0K23nVERO}i>C$x,á^W2AQ7<#/R9e@ Jo#ߗtUY4*&؀#5vA;(0XH4KF'ߤ(ΠT H IEӥ+ i:Tn\ѲyAEe$(ewv~xinw9$YZ1$`8n i9.#Co2YJ~{CEQVML2\T8rd"UE2QTD"Z'x yX֘٬>x<8I$IRZEj\!#g3̺!Y燊L 1D9U9dR˔v'q*R2ϚV$Ƭɠ X{kߌ7reg[]jիZBfV;64McX{IrTC k $dR=Xڝ"ݮ f!a)0~E^\؝ M/R4+4 tL$opT-`AO/2CdžR)QjsQTM[MGX\A WG#6Fr(ڈPMQjKV5~;czvkg(P@KIƄDZPZ_F_DmeV,"$~ -_ȈPޭƢHS? JiW=YD@QDs3h=h$y$T~WG_qxj0j!TkVIވ()aBw,@3 yu}7~cPU_%A>Ū*Z06Uג }UuLQG[CϧgefZ{T:BA) Q& U9:lD^d&D7AE^pc ~1VWf 1&TӷB-/B-`FǤ/ v^W^Kgqv`WS1TU!USBǼwək \+A*Te#G4 /)4:}z@O"u?l]@֞G'w6UÍ]뻀ѥ wO"kϓl]`H{ 2KQ׼2EbRc2-;`gîibH㔢hT gpnvntQtIRڜFWsK{anW[7LU ב͗`yd2_/]Ul"}x@QђV/.3s6xqRd_(CP a$eIhT#GkkeCmp.0n"& Jm$[YX⮎sŻav \ ܴ Ga2eXyY{q B y'wFfZ"hs[DQ-:Gc,ciMue ZH:9Y^VzW8JFmiP*'ꗣiw(qa&ATq0"G?{LlĜ }sؐ_$ϟBPƄ(.z^ A'$LTq*/V( 5Jٍ$OTҋ`kYtV(\( GG"3a,Ue3#˾FQ|T@7zs}ie*AҒ2A\~I13-ّ$4}8ћ5zn w`ko`20\C6r cYi=AfG)GP18$3",Lyuu$R2I?jOv֊8c}r)\±@EqR.u1C`AJpRד5˜eJE"]a텰IY3[$=e)wUJUu˝ : )`\'r_Qt:˞eE (5,>J#&"cY[$k+ ?;Lۇe_ qdq&_GėV>jrb9òC[$kdMOnE} pT>JBLMnpn#ǎkz1tۣ(-{$2 #onHӇ;eh`N܁}4ȼk+k9` `9<^6gɲhT}j*V[ejK*VCGIz\ I -h!. |$,ЦxqT]𝋿l~܂٥P%h-f7jojakC6 HeZEvԢdzL( H!H4c{Cf[eZ}Y% $iQ)$AMGnfEzSH݆T}0I2v-jCM1 p$OwT/i#6] GGZ[9* }V7f0[ѱܞ4FϏm+dTœmʦe$+T" Ρ?U9u#krf18@2]~&}K~)ML. Ĺ"e@$6Q1.O3j%s^}HͭHԹ_J}ΠJza2#| *Qp^eוn i^a:44LtwaQ9 !!| ͡X0 =ajXvlRi'@䊑q}=^3)TCs~JFoB OPU/OQoS+6%t M`Q3_ $ѷ#`0Ba[]I;qMkuAE(aT?JG]YY@ b'\2Y] Ov9I31N6PhOM}+ܒ- %lG5١}[Y/B$+FB9 Fle3RiԜEW@!٥&Q.+٭u4 jH<KX{JL*fwKF/ }J D"1{-%64dMHYՁ$%CGBE L+l!g'Qи$)!Bx/APSaIT68Rt{]N~H{FT.RπX\L˥z=O&(*HUhJDUV̟1}q~swDbb1xDSn'S!zO%,IObL+"WH-DGu+OdjtHI!1+N^BӁsjCf]^TYelv~J,I+M!Q5"'`~ĸ ;%kpKKIJ@nAU0%^)PTS"Hi [ &G\O 84U2TIcjJ0-ܜz,=4dnvd2 Y`.T ]D+aszxmmK;@En ;ATGZh(H%),c(1{iN Tc\ O]!Tp(a`dP>?o7 0S)~A;D9ΛRH)$ORQvPhLq[Dk>[ R=/@0 ~>^nwq( ېJq=CaA9N&qDJ}Aczs`4qb9<\@?.X ~ ii'Y|j}V9}IENDB`dtkdeclarative-5.7.12/docs/images/BoxShadowExample1.png000066400000000000000000000077241476226662700230260ustar00rootroot00000000000000PNG  IHDRX pHYs+IDATxQ\ǿ{g8kn&Bҵ&blP>BZ苶$"Zj  1}\a`-٘ν}̙wݙp9{s79&T:{m92TxU:esc \am؀m/OB+m/{^em169,ޗyCcbKUbʉUK])0V),uK_L}RbXB׎  zk[ږ1 1ZZ>agXֺDT~HfamS6Ğ #MԇP{ pH:WjEVJ}QۇyG!e .qkPAu ܾU.I1rXIǥkHm֐P_\2n 9Hslorٸ2I_A$-yԟ3#tᔻec>%^I^w@Cھ&w}l,XDe! #I;A}KPRj&\-:T!+H##Arԝ| ,#TJ2U+Ϝҿvh ġV('%!1bѠAbUSBXD3FjQ 4֬a٤#$d LCbNݕ:Dqg m^X2HdpSſC"@!4ž?}q-\Y}'"E?n[M=ynn왚ۖ&iJ;I"<شr,+_f|keuŗ^>aiuE).  ՗.}IYDWǸ! 8!wyd3=\K^љ/ӧ.=9J /ub=|A,#4Ϩ/D=;=2LY@f'>B6I0ܻnܳ~gט"!jL7kV}٢!;FjOCuUg?\$ (&.qOҋ%ko{on JC<;&uڵ'?lBog>a9T~rғۚlI41}p'ksfz8{d["" Z%y!hj)ݓw}yf=%$Ҙy077<2{(n&f}1@UL]P(bw6q?}"4y(b۵سdub-M K`$Ş9Vs m"k& {wbQ1E$zeJ=1PF5.b'*7$`(lD[p>%&;?4:  4`HiJd0p+Te pC,66*.C0NXs$梐abT}sHƕe G!\q y7blVc2/w# 8ayb JcjA (@  @AP (@  @AP (@  @AP (@  @AP (@  @AP (@  @AP (@  @AP (@  @AP (@  @AP (@  @AP (@  @APZK1XV)!x(bF1lB`lk`jKX ;11ʞ ],t#F01:p:I.U,0pX9A,B) ehx;s.$`\12vcR Qc ʤ.KLjw~*f `)l[ރ֍!7qD2PZk^(.V_rvYNl{e-2҅>WleP5kA XICM|2";Y>o{k׋Ec6qXWVb h]=m1"POMAD{v.<Ub"11I|ȉbeNݜ<Ko/8$Yլe(s.,,@y K+"3QB/ GԳS(/F<.QZj1އ[,-kbso^kK<*ѴϽyy8$}>b&tk;^z2i`$i'IE^-[ųW:rD:^<{e$Ke "^>9d&EO|o,?;vϏ rb$}Ԉ(YҮ}&!"ZC3ͼ&cHWW^xb3 QY .Ac4r j_&F9@(,׹󋝕ŕwmzc#ݟ5ħ@ 'j?VUOwY.?~{QOjLYO}dt$s[Xs>7ʙR]r3=HHh=0QofvQ(/_gy_giP _nY"feSM+pgwN6õ әvvԥ9%!$A){q7NN'kr4fvN5d6MiGB4IDS?)ؤr,+,ާK/.*N_. MwK"CIlK~ܾuqPЋ6~ְRHrXVPz'E0Bo5Aeebdh"" RRX*<ĭ[$ cLZ 8~6I/?\sҰ d2_Z[ھ}_, \/:sdP(E61D[I3: IeNRD(A .8@bkZ|kAv(;T%/++n!9cM(CpkPAuXFܹ!BR0AUKPֹR7oq$VJ}QCVVM*0r@lCXۤkH}ǚe,/Ki[F% cDJkG"^UP[1}5&е-}aJ(Z]o µfJ( 2s8C,Q&Fp}3aBhvSV)U>je>Q<5"Y^ʠz>3̵`=}(1 9eYIENDB`dtkdeclarative-5.7.12/docs/images/BoxShadowExampleBlur10.png000066400000000000000000000067001476226662700237240ustar00rootroot00000000000000PNG  IHDRX pHYs+ rIDATxo쏬Y+j!JNꨠ\=PPRHzk  R)R+ H%HPc&$Ǝ׻}3_:v~Ivv3Kg3?V`_'u~׾gul;AyhAp#g=ߺI~u6J9i~/6Fm :LU{[m3iغo{lB%,mrO2 IyiG.~%i^| y߈?$(= I:oH^Mg9co=*;ϰ`Zh}:b`%U S0]Q':~b7CۮԺbi)jV?/:{ Ikg";V{] _0/עǮ&ޗ{ ڒZ)S5 }.m(BQ,A\vz<ܡ܊aZU&;**;Q~ѳ+D)n&{#=:rrqH1x* v).[|#ŰݭԢon,n|6[]|JerXfJ ɊXU穫vI{  ;fdWO+9#G \p"S-.N//4פU5')L]00T WB@c"f/vi|_k73WC^3k@|gaNku~2rx5"df_8 Yf0=0 ) 7^T=!!pP sOc{Kgr/qA cF /~C\%\qV][1ۯd }+9kOMV8|='Y84R D?}`e\%ZtWp$tZ V K\9|qdC0W K͌ڄ=17C+3o2v򉝅i rn0uoF_lt'KpU^{UсkK7e wZ sa~7WL/Hq02[{NmQo`4-iQ@r?nP3X%)q,ro@&~߭ař3'C,wx^-3w䥧-APN{@@ZcCi}$,=k(";N 96M8udx\)n?BaF= vLJ;&ЍCp;& O9ȍl|p7GGIG%/&'KeYdeCֆZ} tm_﹏ogHwĜ< ^iN~cYb^yˋH. v&q߳YwE~$~Ltqs79$^g="}b; )ih%2fcҪGISLAft0ї" xд AAꁭgN ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( H4`+Y$swGTl%ZL?$i[ IDβ/Kv;ĊDa@#^rc` t66 V?zdb%#F#4J$oC,{n) E6) DZ} fC5D~}r@OT}.~w,$Zտ]ȰMk7}7;S8D n@B>[]H{@/|6[]p{W6;HMDj]L4tֈ.JPZC-D/t_8ֆVq}ޛ^_N]k /{UessWf%f2lH/f]]J+(Ps JUDV߽tBڃ^xk FUIz+CůLe>бF$S\ZR~'~hW =|uko#Wwjcd RL{`F"̬ S"i|yAIu0M@j9Z;mˇVF/ÛȒ4q_Y,wjc~{`eH/@5Gw>w S=Vd˞ݐiLZ'$ysҪz X} "IUԭՅc{KGG H/檳>/^x{e[^3W ?731V_.7aH>Y97?ޖ֤9#˦UӇ-nƏw1:<&AP0 l[5|Hk " {ޑf q+mDdJg:|d1p,xHsWf㋀UiMýĽI1_ I^0A)ycP~ёϏ}B.R|#z#,բ]lޕ"@ &Һpm*J71Y,;$xل].Z^|L`{ݮdv*a/}Ww 6u{_hQVL쀈a|?!"PZ%Bpi8DP IU i Iپ|e:.+z# nbvsy3{S5pC+* PB(jtu0wN"gg9cowln@̫ݑc"G.~3eK׽ %/gLnH_u8E7߯Bu8Dz Ƅe6+78`_f`IiIcbs%J'lؗagK]'I.jQ]nOlfgӪXmQK e IENDB`dtkdeclarative-5.7.12/docs/images/BoxShadowExampleBlur2.png000066400000000000000000000043651476226662700236520ustar00rootroot00000000000000PNG  IHDRX pHYs+IDATxk[/ۊeG^ęą8H"AB AYF:n.vѫ lFI Fh҄v=OIvOHg-#)A<Ϲxޜ_%rjniI斒>þŸhkCR(jk>!6rѥ$uH")|]yߡ'#Il>"^ =DzImr3-$VI}gFswvlI2d"Iꑔ߀}DfhRz<}P)L?4#VrZH KRNRG{_:';;:IZ/hs0>Qo__wF)X*բSVr蓴w?wdO>pDQT/W~wr]#PZr4iE i6Io2Γ@-D#Rjq/%IEIrGZ&\.IO w{Wx=1ϋM&4𝭩CFfb9ꝮF\HR.';~CԙE|eJ837#$@rU+qlJ4ɦT$IM1DW ]rzա\LL9M'؟P]ep=G IgCo2C;:^ qw%_71 H(G 9[i.@JrS GNs_H=mrD_/R>}钴uZAy|;ɛr]<rOɎ-'dG}p$eiwo`wrPNrf47jTpgQq iI[qL`ݎE+ $#)'=qL`݆ʭE/|ٝ zX[{j@Ғ2DqL`ݚk/6= $?ZRjۼAs<~Cד G Fj@M@ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ |Ijx:rkы8)y*Jj@zYc\{4j6DsU֢>JZFc֭ޒZw gk< Ԧ$zF;w*7%Mɭ=oW9XS()d:?:95u(1̃\$-^-.,iRRYOx.ݝH+y y/.ޣ]x{"@$.g]a6\xM//riW^R|DrZb9L//_Qq馤/$UO- DZ$,Lm|+$:"iqT3VzaVHPRXK swrA&҈TZ\zX?kUǯ*c~n}ۑcE1W>IgtrOvdw>u0p_檍D)}y|^!0Ӵ2II[VI}gFswvlՓ{'GR~SG7ٹj4vJar\!mdEJR\(YFm+UCשU,h5jld +Rrw2z2`yDk^FP_tSᇢVIENDB`dtkdeclarative-5.7.12/docs/images/BoxShadowExampleBlur40.png000066400000000000000000000173151476226662700237330ustar00rootroot00000000000000PNG  IHDRX pHYs+IDATx]͏]ŕ?6m VLh,>B2b$ed,"Y,g`XD "f"e2(bY-YІvwggݪnC[u8 PQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQq͢;@з?)ۜE&9gX;v޺}d,m#H‰-I!lgxp:9Ƣ1>mrZy%%c}N%y%R&ˠ$ 9+Z6Գsԏ"WGI0Qe>;7R@r!n 9%@%^z95&HW,F3(ڢψ?Z/1Iu)4%.! |L{Nz%;E /Y=I_𤭲>}\Ƚ%N!GP/r&QH; H24A F )d(;JԸKHHnEDNzq(>| b9)꓆,$ɵ`)8&yH!E$Ѳ@HZrVYDUc cRk~4MV )4G&YLD&GBxHGym!7o%8z"7Kb>)IZurn#W{bcQU^"Jp{I$YJi@<8U.rÇrkS7(O kX9hQSn0n c.Q hƣ&];6:'޹s;WPd) 7 $&k^zH{1el^HgXD`DZz B $[$] Ѱkt~H/ Ie1$p>MIE#DI="*"7# .(N=T)$0?0ցA\p $neA_ziʰyB(z8/TKJ{]h!,MNm0 (kKb` )JC:Mkmh{cFR"HR.yNAphyR`㠇ܜG:NI\8 bik ZαBO&X~ÏZ+Kܹyh4& Lhq~Y^'?|^:vWSp߀$$kghIڽh]i(B7)4Ə1k` wyN_j's}sƱO^9[Nm3Ee8OHjެWV( (-)P`[!& SYώ}4^ѶW/mwg`(4#FQIˬԃ{{D_JddW?>[c h[xӫ [ՂS.OI)"Y BS& p;ChU !]{=wiP` ܳOuS8w5\ym3<95MK =SD^qJ[&!poy/V(hvY<w]܍o_z  +KwrҦ{B.+l<Ľ]%PNS ώ}M?t# r'[O4> =gjR롿}p?@ " ɉc_;ig :UXĂBbi =c/XXF'+]NOOEF3}t~WύAKwIۦ<tci<ѽ_EHk@#HWnq!W-c5l͵^czkB. H%HDMAH;f\Yz q,k<EYJ%sL Lvh>$ys-5H/Ά: kI &h* G -J(AO#Ie}?6ׂ]'ז"@V}}$nI6#!WonjA&{+Ԓ-&BηXZz+ޤn/<++_2rQ1XvTE@nRTCԧ 1nR1.x䥰IB!ciR)դw"iЇ Vsu"&g"ח$,"IJI4A i*vb7EU5:BT ޟpeJy,bNOUd|Ry@d%@ٝ0KO+NX+xGm {֗"Xl)RUd zl [hC^$ʪC8Wo(cH=(VY%xaU湿I[H'ZEJZI,qNguEoi;}sšakLcw0U577u.a}mUEB Ѫ_~ZbB,jx[ǥ/5tdPz T}o**$,W}R!ahTT&fWT7IJ /+C  ߃ J >xQ[iɵ}DV$!9&HLV荔C"0;!N+ ~X\z뾞z"6 x&wrD%HIʴqZI,$ɔ:DV*ۏ$$WǴIѲJ[8(EI2by&Gڑ*Ai#K]$A"k7&Ǹ³A)DB'm$W^T$>+I2jAOŸ`U[6-߂g=;J^1x䞈i(E|. ZS ^dG]Rl>!HJ;51^T ^b"/0[,KFi}ږV,Jp0b럃 Ҁ2}$>3'b(v/rKKk$‹P1.ry|DCV M>y"M zNBEp`JPNJKua7gͼ!w_Pp}IB׼V iŜ^%&bY=R<2^$k^o O^p=\ v^[ \"L8KkKYVk!Z;p “H_'" \ s RXť?`ŇXI`zyıTd'7ׂ L@y 6$|qC_J{k^Ȇ͵62~m¸Ah+mڰ$Ӊkx* `m|)>UCjE!.irMR}zyƱTdƱO/o\f5|D+ʸzn SnDpd'=]t$2'e'qc/dOJcR-) 'W/mcL=ziߺpP y^} #L9KӞKiҸhi[x7Ӹ*h[xލsJbq5ՠyCs|3ׯ}pu n^?}1eg^=]R'gӜ=$/_{܍޷ ~hW^Z_̵v85cZx%BչLE ApZ 4Wip%jQ9~7tC;ܷtwvt.-{O~fm2l%w!zx$HaJ-W x۴u/)-?xu=w4BPжW/m߅;Ko3<145HwZN ;1to&(OM"Sd>%up':̑݇>4O+}sum'"_bʁՄ~\y`^e4QE _R FU# &D \֟@s`e{?vh+K<4i}݁2x8Gy9{?<% H*"D",SԎSaH'6FrTYt9臆0CbǦ4+/J,޹KĒ]63؊ c"<dä霿{&%C9oqņ-E`9t,y$sx JXv e܀hEwvLJ*TIBuiVy#@nS 8zΣ"J2HϐJǯKĮ"pĐl<CR zJm~ rxTÚn̩$Աq8u;Mi%" Z9FzC"Wٹ_r &!]S>$GwygMSų[Je,-R<@_x<@Qy/6\Z4no*֫$\]mҞzv+7P2X2Yi'JQBDkK7HUڤ\~{Ȑ=kJ^󦹼o")!X+h0 A:q!N%H%A$)d" !^kM}ρ܋讙(!E' g%{A7JOB yȅEIqbxbSPjq#EHݾHK}GCHFJ]J~%B]üJ'>\cW^AW G_)&w,}K GCO+ _JQRTl =1J';+H.KeQAdҲ,%R9rei} >sb3o6{-)g}(=@,8 ȑnѽrS"GNzTz}KbX^1t^os̛AJZ׭RiK.Q-;{*91JRke]^TiI:8c AݺoW&Qɶ+d>okP:TA Rs5k9BYWR^}$eR9jUoD ;*[ u,-do }U(I)I(:ccaa&{xCҬQyewdru)#ae`6tp%-P.-)~:68e阔IIsh9䱁SnX= ~^:r+#lbR:NF3{ZT3ؠnU;h 6GG8<<~^/%mctI1?Tq/>,RC,oB?ݽ%Y~׾c7q}UhMURNZXBUkQiEŽ{pv=|tbDM/:-HI3ֿ[G>ś/OpP`\`\o|KR +k0-Z}L֓ &]3ƠiQܸ |RXXx^GH/{XxBt/ҩkx#:*ŐCouu9(bfyCfI(z.ĶZ(hA4{Ds Kx7Wqq4IT73DzSI*mI Yd_\|'̊a -r_E~=-Mr-PhD!& .%Ge=*,D Ҡn,I.L$ 3I$$Z`xW~=^]CQ"5 zNeY.!'4gOe|+lWkYZqWx\vEQIT) dRޠ\I!RAFKҢK2W]T/h%:r Lȵ:H9t`$ GgE*UdN&jPM \k[53΃ACMܣg!xG8tT9<9"AIv)2 9|]I 6c #:)| |'EѲ@ͧ 9!IG 9!'R-'t,ְB[IҾ%H&IҢjSLsgN|=|?$!zK0w'nj('8xhΪUz!ЂbXكb)s:dHg)J:/iP75E5#I}&_IHDìN6 %٤µ7q~!'eިN+k$d|Qm$]6zcI+{@Խa_ʕ} 9zh\I%C!Ff$G:f=@Nrh}}_c6&K.J) LRKGdP[ߵ* `_*3JIR4Y$w /pP jjj0&wptKo^o,J'5bHڶo1:gLzޡW"2f} ̾&c0]->VpŬۡDm#)xskI>E&LE`reC*NW9ppb~0zɛpG׉&>Ef5Q$֪W.v$!F:KXVnb2f Ɍ{YC ;rPCU!T}m}-k!6 XVPNR)߰Cuk)^ %שӺl3fRUqwꉋנeoNmݛ٩O2ļ$:u'wd]l}rne}{-_F:leQldŶuΣ쌂$9z)\<b 33edo2A7raf^lL%IО ?Xr/wЙCpݾ,22qE/2II\xלkU*Hd{s+c3J!#EkX=?,)dzSEbpk:ҵ6 03Ǟ`@ebX̩ Y$}V+B1<2u#3Mi8yZdbYH A^1ӂLAA PB(! BH!$@A PB(! BH!$@A PB(! BH!$@A PB(! BH!$@A PB(! BH!$@A PB(! BH!$@A PB(! BH!$@A PB(! BH!$@A PB(! BH!$@A PB(! BH!$@A PB(! BH!$ӂ;!}W(;kQ$dĖG] ݈%w B!ȳJ6#AaS9"Âƹ'H tբjԭܷqÔYd'(r[u3GXZ15VNKqsmn݆5ј7ƃTVvXfC2tΧQ#-SӀwfO"uf?8L$IǍ2' :+vs+4l9ekU`sƷ5vAԩPBy| ae1HLX/IS:Jhhbٟ[R[iRArA)f}DGTZ&}AX'Yb!D,"ٙ>yUDZ#qyx -O}@ؙ$XCeu{w"bYq I='Mt$iUK~$E'JI!{Y2;!ܤ 2sםď`$wKg0k`|yO{BRXs9JumMrMS'S12Ơ9{g?c%J95 ЬbS}߰&TCg IdyH "H#mp*6~Eg7r u]a՛Wq8#c0 3ؒGg 9bYnrĚx[lѠnc 1AFF3 ƵD ED)rMң!D$- n~l(&A5Q 7wOSєAt0KI?*OoH(;eYdu,c cmMg`vx_{ g0+Is]RժIei&&V}m`'x[x?|G%cRX´!6G+V9:qI]|*K\t%XP˓Ē%vӾ웮[PCAPN\Х[“*Q$z\zJQԎ''F cwDIz, E +5Ht rY<)<1J$ApVʑ$i ԹDnN՘djOF]D&%2KN W 2%"V=EJR:Q"y: UyH$3ERMW1d6Zk A(te~LqnHv}K>Y#=(bEn쟓%%˷&8 &G+(r'6uQ_Q fݷhh%;$rzNb,Q&Wxi $ tu}T}/79¡Jpm.ss9!)D*UF&M41#I^_rL, u̓TEHOy3 Szk_ɹ@WIYZA܄'CR1A6JE˵ݧOdw((fܱ\DeE־w/dwWX̰bʙCNJAQ0."Kg(crm? $^DlQ2?"G(/=O\=[ůE)}ۘ[ (}M)MyMd*(zIENDB`dtkdeclarative-5.7.12/docs/images/BoxShadowExampleSpread10.png000066400000000000000000000114351476226662700242370ustar00rootroot00000000000000PNG  IHDRX pHYs+IDATxˏuƿ 3CR%ej!Ă. 9^ gҀ,lb-0`/Xh@(+#R(R$H|3=,O瞮6)NuVխ{ogrvT].PyZ}]?bqhPpTSllu>9߉7gS1)-u NB"X㔭gڠS\gN߃9V:/k w"qDjҢB{ - +9/S#aC$k"Neyt Ա0M9S?O^&EaE(bx˜E$ # 0$dkȾ~3d% UrSVDM)A*%9B(mcl{}THؿ3W 37Pݷ"aX譆؟ՃXqɊC=mL d09ߤ ȴJْwO^ҮgbѤ?8PĻD^ě6aHzCNS"!v O%v\VZ$֣xZDgkxӖx"y" Pσ A줠Wt(dJR"|q;QYvIX65":m["!VnC,]lhdaEUx%V$txEQ,L,DR<60 )ObFڋrfҙnAv*2+Ժ,vsmSx|BF9^`rY{$[Qk/:h;wz8{uf_[gΝ^^`$TB3*YrȲSYtTdžRG J+ͬx mof] 9!!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$!$@Dv t j yTvȣ{x Ba%9!ACA­KȼѶ/r(PF < 7;Wt?/I^9e0{$m#RC)}[6!oC;lFѹݲG;Gkݲ=mlM$]ob{O.:o׷Ʌ[+P6ۧ~Ibݍ\hqջ_=Cc>߸yqm4SYXn.KC V8Rφuv]Z//SǍt_}zûEU`gXjS:>P` ,mLφIng`kKO4=8͹~1XP[o^?Ƒ8zCi␺8=*#M!""{!V3GՋ;7?ڸS-P +4zQX5DDa7_ig;\)6yv>?%Y z[o^\۝^S|ٷyf; RXz/+CGH~ɣA${|ZnS!xBRCmi^$IENDB`dtkdeclarative-5.7.12/docs/images/BoxShadowExampleSpread2.png000066400000000000000000000115351476226662700241610ustar00rootroot00000000000000PNG  IHDRX pHYs+IDATx݋畇OUWbfr,[NIQ1V 56!w Zr!W Oe%`l'+EcE-iFjj/oSz5Ӗ~GwU7sNUuBI"'^Ww'#y}%u^kԑ"uLo}@ Ҫ>u,?u\ˍ^o+0o-f\x v/b֒J1SluĐh12YǍ=g$&se%\'تY.KbD.u,U}@UňR'^x{s9t. DuIvj_v+Ǔ12h{h1teպybĸrQ+4<(L\=*dh%d9A<)162)LI`2 ~)z=?'$ G 9Qu#'&ȖFsa{ߣYi5Y#)lPYNI)ȃh%׈K¸E3)TIDϾl&R#`tܻlQ姧|SiB//+οw~T#Ux Y$,bj,M.?_~׿yt҄Yy4O {wG}gwy^Fb_;?@Hd_ʕCN9N>:o?yɃ&!jn7N~xƟݿs$Uw|A'DKuuJ?'o5@vtxڼ;OZ&H"SK)'lMƭ_~ןY;;wJ;K_Ɨ]=s~odKIOé0!;Z%WbQ맧o=Uai7g7u-ߎu8 ϣx;c9G8>w58>kR?ZjH VUp)KſUH9[+K+O2"ja!FV\j1jId!`'nKq\giK4h7 bOeyoǟ9HLV?eĪ{Ŋw.l_f0?zub ^*X9rhHDnoܻ[ ޸G8r|rIf](zlߤ< @5y~?g" YQj4=d̹O7`~p֧D4 =&Rˋ)U7 e1|Ƿs:qN+$tIl^bŔY2mq9xpv.ωpU <r{zݸwdZ%jYUSHLV&ʔ}k.U^ݸwW9n\]|LD}z HYMfDJUlwGϜO.P@Б9'2{z__كQ%{L02.e eɉ(?q{;iCIr0;#y~y;%* ,[p9dkwKT5)$j)̛qS[qmdo> +Otf<: Gs~}sr0>:%R9X$ʉ(!*O\K0ʈizqk|utd5M uv];pomտ{\[b,\-vk<9 DY$ %$a,_[פ`aTT+diH2]dݡ֞7 R1|n㥖|Dyi#+ɼ1y-$U&s9{Gce7v?Cwӽ{l!;$-0b3P~28 FcZ={^<M;heI"?eJac6赞*,[ FsUB7<'NgUVZyXdKY?1tYjlv9WJ1Rff+\1/!dfr-"YVf= cmJ&벭G)yϣ a^ՃRKXi֌ك_bTssdRAd)K.$VvI-9I pAxIuDE)x&j0!srkcoHB@*SǞ$ZӮf] dB+SDEId `y*df [n mY9dư)\>O-IpaE-{_^#"*Kb%2KhLѥUn) 9f\R:]r.| 1묬a[^9q @ʶ#e^)=92K +c̑^V9fS_d5ZC-3'yv:`OY,M !2Ibdr239pɑ8?/pP&lK|cC_cǜo !%cdΫA}n ch[ u,ץ1e 8Xf o[(1[l%G\Nz:ܖRY"]$ul2|f;ˠmb#l֭oH!H1e9&kL74[ |ʩ*&&7 ĺJ^xYAēBnI OLU4׽!_ʡm/ִ̂ 'Qr-pevЄHQ{}NiZ#'&ȖFAS.饮!4 b];˥$+,d)d tc5R.@l 2v>8&) O52J!׃(x{$gJ9RXeI9rƱDVXcaY6VS.*-[É&/,BӁv (e"C zBci$y~hg~~@sKNM+G: ^3:Wd݅wgW;3Yrh/x~}ݕMgЃ@,Ma_ކߐ̉(OhKVFiFYnK_=חoQ|gB)x)/>{[;E >٧ | E 2%IֳVVՉ˿x¿ӅmJs$ I[Ϯݾmznc>ڃk!@Ebv_C\Ͳ7gi楹 CO $ -JgGds7珔pI, 4)ji(3UfqIdo!Ũ_Yhwygo49|IK.ϭamW !=[h?(H37鲼=Axb2/,ֿ;[~Gy/km2 ֥\y_CrEiwϷ:wҫזf&R%Fj@)tho_\yi'(`]~L닏WwHe[u) Hbe`n͞$DsTT}ܟvW>ˈlI&C8M>*iB߻qKǙ#+NRqw݅K&aq}CkM Q5ȃiIJ׻3!ύ$λRJQMGzEU1iTrv&\],O#+3iB[gDJޠ\Ci%7޹ҝ'ׄ cLKݣF=Kqai x]ܚ;D{i􍋝S㒪#&GovU4lzؤ$ZΒJ3Tw4J=k`>%L0*11%\D !'&K yW(67u$r&M&`Ê1' उm85uYbi&&>k\s -@0-Xٴ9 2qsClz^dj{zNl+5mi`"yAx 8@ Ap 8@ Ap 8@ Ap 8@ Ap 8@ Ap 8@ Ap 8@ Ap 8@ Ap 8@ Ap 8@ Ap 8@ Ap 8@ Ap 8@#Ha,0 L$>c)eN1b bX@ 2Sz!`2qsCi`R=HӃXBLL|ylA$=H gm&];vBNlϕ&=6=}_yB~h&Mv@k򠠧G86ثdDTcdʵ7('Ј~^|KF\b\DB^ؤl( RAJ~DZS|I8 ^ 'p" co@֔F^dp`GvŽ԰?(}hgX,:jӞ/xB|z<8XÍx$;n,H; l{*/' `Q_~`{@D}*ǢZ?e"f\H\ާ P&j|rilY+&'OgF`e9=x)1Hq5U-~$URanmo7+;,v'(v߭mQ1Ũ[(aSʦ2=glTޭ;?nWϴi -M/>yA?~ƺ(MK򊆂 Ql!$a[ADϵ-u3$zYϾ}BU ,94Qx\JCF;d0oaY&oED݅wgW;3YrcB)xn|`{n>BnҮdYVNDyg%y*sqΤ;W7/o\,I_og|Y"pL1O= 竟sG;gdtYlQz~+e^.HB NI|S9hokT.SbpzbC6u@225qP_Ƕ[|DQQN|zr\>eM,rNDPyD P CbۀgMpqreL CgшK8%ԒD{Q- ҧ uh /{xey=&RM}K, {CVp> FFJޱQbX2nxYe)ro{W$2q ,o2m6=T_ZiWb ( ZJ-\!R Ve/EF-APQL/ ^)P2IvR i=HbLeIL,KżĒكsb<ۅ 2xՃ\9遮r.6X\<#x&A9x95ur4dĐۭ/`Kiׂ_ʨ?q<9x˼QYag 壔U fr_hZQbl҉hL'_S:LZ :zyNeQU/YBdfrKv']f) f  *F8Kl J"yʘ Xy!Ђ/[YWXy <{De n1Qr^s52#xB$֏ҜǾ- f]nJ$)6~~/eYn@+zl[P|4&9F0D񲌖si@i7|1Υ{ԃpb Vzota dVVѶyvSo{Q<6KĞ/v`zh*zlvX&Qۉ@_tIENDB`dtkdeclarative-5.7.12/docs/images/BoxShadowExampleWithHollow.png000066400000000000000000000076331476226662700247650ustar00rootroot00000000000000PNG  IHDRX pHYs+MIDATxMh3#)mI)9-!lx׻{{;rkrCD|ۃaİHТQԼUh4?hZ߼jɮOl̏䜟{m?ޥsQ<߸N52Ű^ok 1r۽p Xxn{eEbmsRdq\Q!GUI#Cp,9yBCW O=$@1mk ۖv)Q  yWTwQIC=%MOl{.S=F6ZؒSATZ&ÍGUj}K"S-[XuM:*վ;MG .{$IFȑÓ-M;]C?X+UqR IXAr䨺KJOjb^V^*](#g-mǤkK9z1O\Yd$<18}KR Xje I"ؑ$5҂Dd ;T!C(H-:tQG@c9LYFڟzZ_Hdo2WzT ک!4RZI,1r ZAYQJ%E=`$=!7kx6-ȡIAYdyJzP(qP%@ͻ[\P"/AYFN@QvĚ;$"^h e XE( (4Ѳ$&Dܘ5O8V>|:,Vfqeg5 8y~\xk$M7NM<į'd o3=tg( 9z(oK9J<!IM\Z~߼@w7mN"l?FZF˙rߺ3q(G.ZL^V1Rp?Bd=|`;(D#, 2M{#ܘ3?s D>n̢wH$,ғI!VA呥q&qy?"$]D7 DL&Xw]H:Np)6kH @" B7po@x ;] 0 Z]K?r2(1vx`!eueޢԲI 2fFDRGxor3-BhW$q~xHf)ށhPFx2I!>wڱg;-j@wьlj6y(BE;rxXĈ;61ڱ<$5 ]*!<߉=wFW AEb!{‹KIb(.7dh^nbROp2XWS2LQ1 /׵}B'&:K=f2xw]{ ÆD_5: BiTTbص!VqqҐa 9$d{P 2Ĩx#uƌe^B^'˼90de<@0y?NI^?@!Āb@A1 PB (! B!Āb@A1 PB (! B!Āb@A1 PB (! B!Āb@A1 PB (! B!Āb@A1 PB (! B!Āb@A1 PB (! B!Āb@A1 PB (! B!Āb@A1 PB (! B!Āb@A1 PB (! B!Āb@A1 PB (! B!Āb@A1 PB (! BAɥ1XVmdX1.ҍc# +ضᰉ8!vrbTI]&br3alyZ7de2Ss@uF⚄ sjc{8v8^lrd'ZIL.IQ'݉ R Jbuk=g!ccAJ%ͤ C"_cbIq =l/[9EHh^OLB@A&u@Ԧ w]ƱR q2kXDs߃Xض>1!eO*-$5Y.j@ ;An޼3oxxBL=|/᭠z&AR&mNzO+8, h&)IN󛸴LIH8'7qi$?Gwȑ~UQ/w8 |Kk?@ʱy ~|_@NyWBDI9Hg?(z](HViBh-+,{|YijeNc 8M.aXώb)|:[K@-CRxV\H RLRC 0]2fFoC|Xjbv9/pQ?Fq/bmkKNǗ "n$A,DGS+YnA&$Kj[}%RI9R/ڤrq`Ɓkj[!&GЪ`$GiE0Ro-A41

W QR`Pe{bޛRTybRU<IENDB`dtkdeclarative-5.7.12/docs/images/BusyIndicator.gif000066400000000000000000003711051476226662700222700ustar00rootroot00000000000000GIF89ac1llmnnooppqrsstttuuuvvwwxxxyyyyz{{||}}~²³óôĴĵĶŶŷƷƸǸǹǺȺȻɻɼʼʽ˾˿̿! NETSCAPE2.0!,cllmnnooppqrsstttuuuvvwwxxxyyyyz{{||}}~²³óôĴĵĶŶŷƷƸǸǹǺȺȻɻɼʼʽ˾˿̿ H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH]g>Ji$ITiUTÊU-:>RH Kw,xxٱ C0CX%H7p 83uҨCԇ.+GS0``2e ,(o?ϸ?r߼oBy[Ocnouxk7[61|y)[^PANG{WNZI@2k '3W_}ԧ>gaEVmL18HAX $Ba?`>cό1S8:=8s /4 )h`z(`YzC=TIO=sX\*<8SL1H"rd`YAeTViÍ6.j; mX.O=w:n;hv5 .H!.5@xiSLK,B!w%*ܺDm9<&3o5Lsη|B "|x-LJQh *`{E9 'zSAcӨF6vC|LU⡎C|F2G ZآD# C4"vP"Pl!.uyC)ҏv\E "c+rb8c>rƕΉQ3;4yl F^a@/ s.8nP7l_1mH3B8Y/7&8]ޗ툇V7n[ @9!:"$ bp#fv`rG<6݌#x!,*A 3"B,t ;exJ7X}n 3 1 op#gc"h>ulmC r#-G^8I೏H* {T#pB_$#pH$j t!rLIPT4@-Fr @dj퍣2+ G{.{Ђ .pf؀ X\Cp؝h3sGzoHG%Ⱦqw`A$rʋbI 0PA- ~ LW_TI80h@yY䳄>XܟO(;_LC\u0 |7u&" p R#P}0 P` Hp &;  T%j–% pP!&{#r^0DU_ab% w  mw' Lp zw^  wDW-avriـ p`Q` Ɔ*1B XpRvd P029BDd0"1e t&Pp @ ѐ SsxBl wL+m|3@< # 7"3q )Ӹ&6KQDS,>m3AQ<3 gsp UD T s_p'Hh0 ("! ( d L S5h 9@|7g$wp6 TE%J3:ƨi%nؓgRFb>Hyt pP@x_BX906ppQv6Ze u7Q/10IRE*p`X Gՠᐘm9P30 tPIQPrp&b0 AUXPPcR)0 P B\` A PG #ؖpoyp ` P 9 0 9# >Ҁ ~8vҚYqY,2 ƒ p ,pV Ӡ>P@湅;) p p cr*p*La# 95A8'[Y6qp M7M@+,S/ : ¥0Up>S/,)V_b@4~c2.КFmJX3"%w)%ɦ}j!@ʧ:Zzک!,V MNH;wֽ3͞9tjȱDŽCǍ[V}: +c(籦͚ڴaLy 牆 *[ oJo_՜+JҤJ(@(h@${SrThOǎkQ#BOL Lٳ ,p`"r# ݸoL檒Ce&|>—0s77i|¥ EXn, *k7.[jtR!BK 'n,n~ڱ#wZ5ftʐ>0G\i(ך{=ﰓ7 .g -ҏ= SN}L# .4ҝ!hPy&ܲ?\U9M4C#.(2Q hyLϘdYd{q3tLM4@ӌ.rB eq)ƀihϚ6qB_-ܩ hM;J*b-B Q3C&?cĞ(U?$:N8@ 4S+aG [(ZF6cO>?ڤ=:L8M2B-$- tbTBO?+Qy`o80ӯ32-`Z$ a*VPCG3O12IJ x2r h > k3>أ56S1B|:茣743R-r GH0ZYg!p3sYӣ<n:e:-4k;.4RK($҈*tR=@)w:=5ADxF}Qk`h=HF8nv<*P @rjfp_D:!aBHc?`6pLBGg_F6AeYFB`pck"k)/1 I0*q" O8j9+AI]aAМh\88⑸ (PU hX#xIokY.7aeX ^P dkBv~+E#^c:"1ހ!ɠ,P QE dlGB @ H@RR|thp>!Yx"! H"uʅ.1 n`$:'- `A1Le(1D<nukp'M*q e=9Ѝ0 ]l8:oSKE!E SB;IO$\!b`A8,.K hAgl +@P8`8dK=<Ŵ8 HD 0xp8Tװ? (64 ?u2p.  E\FTс4,&X㊑"Rp[؁!2 [(9+FgG\&jPB 0o ~4^M@G5 >D[⣡2mF (C=.!hE0cH: `Fd0=.тg! `$c>GJ\;Hb&hF,q(B haPc"nv!|iR<#ه-`s61:=F25O{zA GV@ ʠeAHBúX4aP`pkWD'2  ԀAttԕD1 ˀ n@-p'0 נ:<9UeU AQw p>#p @ӴFx 6 Q BBB"*/uE9LPLb EY(g$ˉEDs( H46g yCA/N0TbGYh&GF*ʧO Y%['TK*OTRF(\#W^ʡ6D$6!,T ONH_>}ᣧ/~jȱ#~kN9mծUnؽ籦͎ !c7.ܷlЖ%;v.UPje ײiѼIf~"ߵ3k˄V̖G&m#Eyêx YܵkبEXJ)s pBɠiy3㇯޻uԍVt1^rhQ#Ceb8@,ֻTΜq*QS+.^"2: ƭUws^w/Mi҄okӡΐm ,#G;s\5D /kɡaWn-RsA E$O;s93Ms|R!u(sbB3;쬳9#6B 0H %RH.) @Yг@XC_Te6D ]҈ a@B@n"? OSe883{R-< Zm[". ) 5 H$60 4B-@!J$p*zF0 >fףNhYZ61b$D0,EJ%Tk-UAdOrkҥL#2 k(vq ` FVR>\340r+R0L"*b MUZrCt)%<ڡ `8UT3*+Noဳk4hZL.J"CV{tcO<-b 4Bsڦ&|(8Qݘcua -rN9J4. /#Ilr1CC5?kBWu7:yMiP30BHNdn7!>;(%Ǎq蠣l+^wk8qcS1>ߡ}P` >c"P:Ѐhh@İvlPx \ UNx ( lN p:܂@` 7Q [xz|nEӑ}#f.&J$9"ŻЍ^$+zbá=BC"}uc 1Ǫؐn"Aʜp@\g6JN#e(u"ݒxhe'a>:V  $2V$c؇497r}Gw '@^b (>T/Vv P ADGJTh\؍bg7/4x>oy@`Qc b@T)>ށ]]@=R(5nwtZmEO7 6Xji!T{ /z31l|##R ,`-"g=a9:gLF7asCwF ܊WHIL~ғ6)hT6G;e0AՅppT樆4U,yyA3X_b@ ب$p1n@@[n `(Cи81#u'9\HpV.Eߐi>2fĠzdΎZMhǞ|1%/񞕘@9p1 ,C#b {,iF,F KlbE bx8%TWhD@UAx2G"#@"ō泋cp@ I @n Y- z4&+0BD$\Q!\FTҏpbc-9([CHm^0LAC`BQ B. ncه-B! 9$x @0!=Bv+r hhK+0U8.xqkpC5P G$bnBP3СڀD- -5a4Wю  [f;Y`"1XD# 0-~htC9P `0 =LpaA s /2>a+na*8Y{c -:kV8>)r bTiS;PL"1 9Ɉ5Лv6S!_n)p0 p 0J @  @  ]g@ ' Sb$0C6T ; b ԑp r Ȱ86I%g2Π UXJ=C`i'1 p 0f fb 2 p?I@WQa "dXp @ @ 8r W&.7`+W B`BX ېfp p T uP%X I0'4Zb  U CCCQgz"2ϐ "s?hp"__*; z ]A0 3%  x)pTPGQ/a@ ̐ܰ Y" ux8KP`}S x`\!P1-N*>EE;3y` ~6 ` uY䐎~@  R]HZe p l+bY"X)rt VmEZ xP  T^'f9⤔ 0#%O0 y fDYAVV}y"P2<lIVB0'ZOA)QsUD> W %9R nUћ"XgTd`$Д)PLZқtrt7 aۀ b@2`&3`0PZ5ڤIUS-@ y ^$'rrH@Xx6#+W1XG1i3"kH>*FT>3J()%!,T OMH_?~ŋ3j\O>zɋn9sţocʴ=zHcpߺq ۵jн̧)zI':uiv-6lΎ;زi[gO޻N+hjԔE8XabŢu9yow3vF-ڴjӎE-T"=WǶYfڭMnrA9/\xrUIѢF!ejШbc=vF7.\qܤ W.ZMBdѢDy CƌnMM>s3<񰳛IM59-"!t6dP-dsٳ<%NVr3%-R !!Hp@;H/=G څ:E3X#f[F60#0r-"H!8@p.Y@( S 3:DR c,(!g0PqbJ']0YCO>Ē Sy8L3-$hE( ^: KP5O܈U9^B,3B-"!p o).@ĎQwԣ@1D2 `4FnA, jE<I5 H6(`<X`q;E&P%aZA1z\$K1o,Y)n !Pa k -M)c fmyIPb郖!Hò AA5DE4Hh!?*b!>D] uG8">GJ,EHS XESڝ;NsRѦA Xxg)o! d򰰊NH<N&2΀R:lFH]D)p|J~\Ġ*GXX0XkefPhE] V3fa +$`p1TUةvZOx RPU}m$ȃ4"}̣]=Vw$+< vI!Qic;^=*MPH I"QAV8pFjnr ێj`)*a3@bZ"J <|YyrA=}pwP@, n>tHF;^[|EǂwS^f(t= `@0e'5n?.3i"\AHQQ,t n|8OX7g8Ҹ7%rL=QX̧Hv*[Bx ԎUYjF4!q(e).61 ZX! tMG13a{-4v eL25! .:Q `D# qGTŢpA hTcld葍e/|1f8Qs#M{c(౞3[6΃2C2 3~ Q Vp  {!X 5 F_x12 gx -*ː4u `zܐ sg5Ɇ [!E Pp~_$`v&ƇG  g38 c0^CZ8@NF`86 8ͧwހ A7}`hRX9P+6v$Ɂ p `@߀   $jB' x0 b `i p ^1'8 pca΅W 6K:egjP$ CÆe*{qalU^ePܴ$%P$ X'Qcc~H,P6Kd'E" uy%7_3X YTՅ+ZP$ ` װO_#^6?3R3UVpCl}Ps#%TLeP cL d =Y.@C[B^*-Q Ӹ 02P s\Efp[p D9 ϱ p Pn>wՐI p 0K82P$'@ I%rH5ZdePPMbA@ P\TcYVlc 4GiDTEUuf p gtaTIS4߀%R;0ET%OD3 P<d.lD0  PiׄIyA`.),pUzȃM- hP Hp ِr#Z>r' P נvƳDx!,U NOH߿~Aŋ3jO>|͛WϞI{AtˌW=y|׮gwSYіӗޱ9s֩3W8s[x9O;vZ[k״q,=}f?tȨq78n"GΛm4jeRԲ.1fYjӜLd̪ǯs9/^;u괖K5Ҡӕ/_;L:}E}USĥ"*Ж˅ ׮fɊ53o'@ \hMVz0N582W.b$@$L< @*=ӎVȍ70#3rK}2"H#DN (x(BZh,wr36Bs-x)"  L-b/"N{]ÌRK="ȘqFC@CHȑJ6% V?Ne-t9" *8pZ@ YGI7R<Njژ-J!@@0q˒F)4i3Z X!Xa1 z\h"!3`8e A:98B! tEc 0 aP Y E ~ND!Z*A(CA a O|1 T4BL %4B,b(:N9T&-GI H0| V`b#$ [b`xaExGilE)*Di@E,n `H*& 2;>,b3@5̱zKH3<,'$;Qc>-~V [иF9W}#3 ;6%?<"Vgfz7="ijGP؃ܸF4 ^yӴ0!hh#>Q'M{PH ꒲mq1 ]XĜAocYQvXJ:Nle3,9iD>О ը#a>=<1G8;L{kЎь=y:w;܏sPj~5t:(B>qkH9X4r8Xg(mл7#gxeMe684|Ai6*QzK`{#/r ^5TvT'{ǨM&O;FRb|>1 bs }hu_)u#}py 4u&Veb"84Ǝxuqlg3@_{ɱ 7] O= -l@p Cf 0 ՠ` `?q}:.Pvyy gP M* Z& fbݖnPfwVjqqhP#-SC v ! ܰsQ`[he S= Sfx^ck? ِ`-|eSр^ `lWMJ-!g`q "fhogDB1eO" P 0 ydipF 8芯(`y `!0 Av%Bx0p?؈Pnp^p`! l-a]@  N SYO0& ԑ 0eYaJ %Ԑ>0& 0vIK@7Ya@ӓ=  h ! PwpclàsF= 0c" pp ߀Li"@%Uɰ㌂rVZ  $/Bm܀?gВj@$ W"0 &=؊9@$ _SEU S0W?C-0f@$` ɠ& 'pb@ 8Ȝ$M  IY '.WI  0+yp@}I1` OY?tP Ҕ  ] %Pl0 ! :JR c!,U MOH)oJH"Eۧ>| ?(SZTQ#|٫G&=Ǐ_?@U*ג> iΫ)/wPɳɠX WhL|9牍׎:vM޾Yek̰3:t V=}V r#̘Ď]tƑ+'؜PqŹ>ƅ 7oߴm WN=&r|${G3:rgC&mZ׶}㺏*ozԠɷ~]nvǵWWIܒ4pRx:vM4W3$Ì3\S=e6aC$P chM<>r̽VNthL3R8//L6t:Xa 4dIK酥kE40 .#0(sM11l6`N{0KϪ';#7`˷6!v &DAJ7CO/pzߟJ1Mc W;sMB'` 0x#$:4Ӟ^'v@@qd"uԈFd BbAP@<`E(A R4n n (A(t(h" ~H &a~#gA/xp@06P,y(AfhGp @0W(!&0``ЂD<$*PG*z[>@#8'1?. l QpD6 *[yhZg{@oy6ѨXDbpЅ) jC$1C (Ҙ1}`>q7YLBx`Ù0D@0Rpш ctR}/rъI,3"& gT<BZ/d9m)>j cb…-XFL2-|эT X d6Ye@W#؆3zZ\tk0)VX耛iq18Sؕ@n}\1H/f.DWV F5!j^ )hv$!W Gl%7#3,[͈6ʁy4$ |HFҢ<#hG:fe6hyDDq3}4;nTB0{3C%MaQ-y?{pC7#ssQ@"j׍.=ځrp w8̑uN?1,&;cђ{Ɍ0? I4~*^fYA~s=LE_N# _:=c01RAhux䒡=H|i`wΈ xEn;08St_aҎ,E$:>!it03gqrFdCcv])! >qȦn{σ.H/2(oeŽwFI?ùARho9AZt1%?I=kP$O?So`Ә5q$2NH+y r "!Q yqиƲr@G>xzք<#O$l@N>p ` P H6(( %e'gaW.0U[IS-P p p fv!VS!t!@o)r:O +`v h!tAmdptbIIb`A c pHF|!QQ{kPtwUQ 06#fbr ҇g1nAB"aj)↨#i% b  Ӱ~ve7tR7v^ѐƆmH?87(p f iAhp ƢvpX+\3 " @QbB@vX,80r  a(ArSt k0+ YvёHY9 DcBryG29,ia0>I R @ Ԑ Pnk@ *hQhl1@ b rI OB/؃13` ( if$8B`$e ?Rb{&s ;pu{@@ ؋ vW"<0n01 4Hdΐ `  M)ƂS)01 P DŽ 0 >* @ ЖÀ iuP[ pQ ` p pvP SE0y`1`܀Pgq!@Ark*:?!,U OOHSo„#JaÆ2jHGCno'ǗCbXR_rۉo̟ *sF~6qGS{S=s|rLhTJoye婥K+Flj-R(!SCIo2=k6޻v۽_FUC 4XPXFoY֭KNb{B6U sμ#=n:ձk㷐2 (}CzM4mљ#GΜ9t˞moZ ϟ`{2h8C;Ɲz9_;L\Fux@v5;7<$x: :8Fx^;sGTcأ =gɃ,`d6߄N@+z`P@0x(x4^(9N5@c'5T8R? `c!iD8I-ud3v9Mh9dO1<"D"J@e@$C`iå8.~s3p4V 7ިGt#'@ªxg< 650$1L5ׄO4HBRa Ŕh(s9\M40)3rK. 08ECJHA"h,{T:w.f! ,xX-D&Z .r+Be0 im'S:`v4bH')  .Q:ƄD`1y  Xƍ(rLjZjcR q3x14[B_\ !HT61Gl &x h a H?AkTbA o@D#6QPF,a. +rAch5\Trg3(*a K"F=fAl}؀‡N1>܁l\tЅGŸhF4ԡV-AGQht %-2Kk+>UYsIJ?vN/H6 f[k!5ԫÃF.d`F4 dePYj hCu8AM9T x 272=scQ% n=|u_N(G9 :-XF7̡yX@~ k1zsQ7 |k`XG9a@# e 3C?<q@[ X`2~9CYqPb|э'D@I1.Ih؝jQ)]EAVNc }Hs?&FA @8,=H4Ёvt4hib19O: #󀴃 wl;M _Xq)σe8&1kXkftGє)lYbR|q3y1 AT1 q(qTwCfT фCL` DD2IF0p;9GgCD%hJ1VܐL},&0UfIegd19yTN\.K?L&XHBB}ѕ,9}'< ifljR{hi_*GFjw[Kɺock:[*gtT"ezn\0aوB*w1p.y1?:q,7i h0 ?ڮ%g5ﹼ$pHX"Ay,0Tq^{"dqgY;RnL?QcNӣ/]  @ r $V~A#+7}}7` !ge(``4 v Ҡ NR~H&G L f]Rep 1o#]$x6}vgo{;g &rB40 ϥ[ `|r7q, /@lE ų  Ur)~prHr` Wg>(`pE c ,.†g%z2*LE6 dU `j7Pr&`z؃~hN @X$ 5Xo ."t87! H-B0 S \ "n~Fq )j7a # C,8цeMP vip0s6`'/҈Pm yrE0    RȇC_ / $0B4B# F#P@AhjaB&Sc(4)#XDIf+3QB@ C3 0 ZV HdɅL= Ip yB !DFZ /vf'  *`XV qy0-qpR$x Ґ % n=Q1t` L My`2 pjI b  p Ȁ^ /Q%V ۠% hX7F2ogՙ!,U OMHA@_#Jf]}ۛXt {È h AYKyo|?o6YP3*P~z+'g^m{l^5T8(@xiԉDe a=*gyYA} ɂӗNxlAVvzz7^Pgi-g0t']O<\S 3"7*"!t xrt]AY}]x#8Ķ- 38Ps53qEsq5HܸrwQٞ >c^̃:\M50ÌGC ِsEੳ -$20&`7 Rfm%m?3;#`8iԏ=~C4PF.nA@[uD!,`@VA;c>9/QdD:2qcF-hA [؂h > t-AE: hD.xE.|H\ǰ6Q8A9hㇴc I ,]P$װ -#a-G\oQ~@E)Bbfr glX( 1 ѣRG:8[ Y/A L`5Q ZdV`-ͣ; n5Ђ@6ȃ.CJ)g:wȃ 2pb69 @ciF{v!c\udȝ,wKةGdB,{,đz* v$:Y f)#h ( S]yɘ.ñ=Nj& B=ļ}(:](IB^ : _ @b\^#H` x8bVO'!GeRkPwӸ0 @[I۔wAw vj7H;"ܥ=kDD u1 PdieޕL?k|Rjk"8 *Nb"ypA ^FU$ N ̐[;٘bƒR!NH5p~M3`  װ PWb#8i6& &qӦy&v$ 0y`@gh Ɓd@@ CS # ۀ.W~؁748- сGpU p sr3z„iXkZh `GI $ ߀.,x%0l,@:H( uI ΰQ0y%/f7 $&lrgP7 d ĐQP 8h3hu!@{P7 פK Az6[x  C H,8(n0k&00v pL 3r̒ȑ ?&0\"vH93dB5j([O{?|1+V֤{Z G5eLIͯ}fSN0`H%JͅI T@ >#> 2? :ds/"!Z1@ SDb FT? 7,tH (r0 ȏ>/ϓ賏1)gѕhSM5+b!e0+61=3ϤDj>o]S 5},$@i ɰPj뤑"Q?Cߞӈ&-B!tB8^ 1JzԃGN:L#1܂-n!L\ͪlzbpZkkfRO;$\N<8td44#c -870ӌ$-"5j`vQc$Z1P|0G:QD>b:g@1`1rQ s-pykZ:wcpxG x`_qAf./v a,2%n%+G (em MوF =;֑~RK+9G!nc61>!wMA4 7f,,F9)Ј$#$1hӨ6ơv#7h#6-~Cd7ю}te#ñ j45X I#-Ee0 ?zIiÔEtYl"'5Kљz0`ЁH1~D>6 ŮD垮ayH= .k $gв-3vX1ҠF5 v8ЎF:,>aqg[Bʨ61(0T#RQ`9 bDbPx%{Q[GRz3TB[U.xq C!dܵ/R;>qea8E,f6QXF6ر Zb/ςjヲp("G4`- a@CߋRkR ǾPrQFlb2ȑx,|H Y1xaDl2!" ]#t$( NnKs 3D!E6BCp*qj$҅qsӬ\$:$:d-t JB`!=jIػSJ R dQ GhVm g32 I bTp5=,hmd ^z xB@-P76ҿ0I ]8 2` *MFאT@aXDU 5fP TP&doa H6JdÞ3PǤ98'Bэ%~j/*9tQt*>j\V|,~G%bP(@@zX)U3؂=B 8 ktCxcHaHLaP \V 6, F yﰑy̡5u Dzqc+S4 C#ɓyUVlPM &h׻X#׮ܵfɊ$4)(`S H1)]ֻj[cņŊԨ.  @/~ gZ ':9E+{In7i|e QF~`8M[8a [lՊʰ!DV$'1 D z9tzkG[jv !C{`xqp5[Î:G1,gH%Db ,`{IdO櫏>bېNT70 4BK4b* X*c͢W"XO /C:(cp83<\ .jH& H^U2}rC%먼2703B˰bHgqP10lDcv>ˏP8+SM 'ËR8A˂ K=(=Sc7@̞P2 h8cpF(p Z.&}*CwCބ?lנF4qlp툇=}];~Ch&]G7w?Ä+|_Puǻ eS:zࣃbz'wTQЕw1%/i\c ૐĔt}$BogD򘶎vȣ2K;yÈwT<BώLԈ2vpu7VG|<ysc9qC#Tb*Gq}GdГ31=_H¢1jh I SN@UQ!gCZja\c5~ ,Ѐ"1@.6(D8Jۢxp-0ZP7THFmwtTNByD| *tj #C!^:{ 8 ~,Z TՖp el7p+|@V\LxU$S"*f%]/=B/ǪQ  S`x$Qẗ́D+p 87 9aFpU8 17K؅n 13cNGx ?+tS lm@2yl8 ' <">c\"0) юC/Xi, "Pju9]php4BvHB A0&!ވX&qom^8C,^ 'a-x=0rV@ ~XL56`0qj$'`o/6C# n`Hp[Tt$x1ak/&b&hQ8,:2&@{2юrx>"!<3HW_9Ah*< E/k b 6 qG"30 ۰p `ApuAh % -2A.P{g:7z&;g w t]Nnomf* U W_᠂kLS4rekvnP/ d !="(72 HŇ`I;2e4e_ip|p AH 0VR3cIjD$p?k Ԡ ! ~b5P @:w2¸W89S Il~sȱ@l  ` ~2 #5 +cc"0 9~ &dp+ ep p ԓ % %hW|8P FA34 6 4 7Z!y YT;SkF+ t ƐPP YH yS&P ^-#! ow ǀ N+Ň8JF&P Q-R q'Ԡ $09`"Rb ܀B" 0VԴ2 jDp3,WXe0߰0M2SJFbX\p%'/SkS'rr/!Vn[):Q-w!,T ONH?ѫo_?3jqc}cn\hѮqvr-H&G36jˎC6̖+VJje+7xlJُxܑƍ5e~ ;+ԤG6I4G̑ N\:Իnp׮a̗a_$9jx P  &Ë߾{Me5jv+֢C!:#c 8pYf,xЙ3Wigpe !C 1Q{/==NrrPNV,.\H]7D( [o ,̄^Fa59#5TȌ/Ҋ#ɁCw~o T6 "O>;$CN9TS!4r .G!DQ@!o bA3HSN8∳47 c\"ȏtPEɛ͓EZ_UΝ 0|)$YF 9#.hϓDD=Tyg883{B-@(!PT!)Ȃ?.ONL9Z\38MQb#** 4=F>j:z70 4BK-*H!O(fjN?cTNm3B˧jjJ6K O*si8x0 ȡ,!ű֤d<)JD':Q Σ>Ѐ«A+AHg*M[U=т*JPM@ Ll(2׳RCF3ʟ:4C5}*Ю$IQ;Ux @X8a%?axmMc64*ɝމc'O&D` 8,b #ZGreYޜǣa6<mn]DU h m`7>f?}#ە[X׺i~ |' jdX"9ґ˫U dn4, =L?an؈W"3 .3Z0r+lF7qg8  H ̓'\Z:6e$#X Gb(o*7n En`$W7F9ց`c#8"h>`G:اv1oAPG;^%_ !t#0DBK^e;! ]HYXT-% fHcl"qa6Ah@FBQY? _(P (4QkwyG. $:Z,7fG$? *ȕ!]$90=fXͱm@7.Lrb8uA@ }x! 䚃 *6@@7؅/(~ & ъ x>[|"y LpuZ 18C-D"F61H lV$X F7Б~ph!쐆+8 b nPѨ8m#A! ?*!\fGIbx1X! {/! M3p@}H0G p\O_cyQ*F2@P]!1]h$iuH"XE2* qC E.B1v4" Vnqnp  0n{ 0 p 0 )b׀%eKq> H56 0 p `w7= . bkb + p'}AfTG5t5`PX/j!"-@p @  q, NYJt>ZᡅEh q0m u`͐ WzuHW 4B 6xVXp  в5 Ґ 0;  W & u'-O/H`PXV Fp Ő DS!-`A¨_"Zh(A 㠈k0 z+Ѐ8Nd T /)[alE h ڠx#0 Mx)1@` 8(*t[a-V _`- x)UT $HiZX]F_@w wP6\sZ@TcAK #P@ VHY ?%QQZ>)DŸ`P@ 6Ztp G3b'WZ\Y+H0u[` m @)?RS+UkV N0 ="QR/r+̳"9z zT0Л-M/#SQiTQ 6 ׀ZSX@Oř9װL)pO PUV/eH=D74Sp Pq Mt74S1:5~C1. ^95:O7 '5cR!,T OMHo?~‹3j(Q>{ɛ]:tܽϢ0cr$=yڱcnܷo܀rӖ6tTE!D.:sڮ]˶bŎKLZ7rUl6a?}œ9sVma+ WYr-Cǯ_oAܩpԤM뛬׮n %JH nݺș hԔJW,N5ZrI|s㾚{g{]qč67ep5+!Ca$'f7N8.6%r -"H!~@g9 ,0)T''MtcXkQ))%l 3͔z-f (y X0 ul)unʝ Ͱ<Lb BBDVYg.|S 3Xsj2lѪ6Sɹڎz`6:-\jH<1) ,A,ro?)ـ.43l/5S0y1 4ձm*j4 .@"! ;Ү#LVL[{,(kmv$qw[:S7(H/L-B>C2[[5n)N#0UMW ${PZ dLF#>@{)wJ#ťi;tL+D5W3}FS -Ɂ-єla}@>⁎b8gI G,r|$BP T }DB|ЀH?⑍D qSQk4X9A4@%D6b"}XQFԱ k k]bA@Ml"\w`!yIS1 \M|b&N$>Ѐ8Ƒ:0G $0!@ p! YD>hUq.0=j}c14B0i]XCqbGxHG;+NXT@Q  ͌h_()IMꊃXD#љNuFjr<㹐ѳy>~JkH9.'rFQOSP@ oV+hGE+}D=8J$X@'I#h&4mQ 85V$l`L9ƒY iO>$ X)M=.15-qT3ESHH |ȃ"V9Z'?zx̅.j=ux}m6}h!Gr9G1R p;ÄW̧ uw;k0F/1c aF1z,H?FK H07P+$tXkoG=Nf>8?=kǏk,b$& E0j 6 0 aw71Cp |A dkviZN[s cp F|$AB@  h EkV,@n(V`!SL5D0 np!8tu]7`bЀ w]_ m ΐi rb%ueOx RQ50`HF ɠ PffA?{?1g&%0JNo #Oj2"lP rP{Mqd)NZAS4}H SSEC&p6 @7g2LƋ5WH' C9:- P <(Cc'z@ X" }2 W E H\`Xd(-(0 P 6/V#V p ʐ ;5:!NF N fuTcp p +/;q`ۄT`E '9ԓoe P 0X!qX5WBM΀PR5/-P Вm5ST30Li?r>P MFfT4iÇSAbf0 @ vYa@@KP [GnL;U Z&V HoC p UT^SEŤF{I I0Ec P F5p WJ"$3A7BP2P`AD+ @ p 3w!,T ONH말?JHD~i'O^`6r]FڵhɊ!SYw ,ڭ[nre6n5e€l1dɪ'8?7o<Ց 'dhㅋ^nj*jxj{罫8uqڦA.\t꒣H MeJV6~0j֮ߩ/zol1K.l!,H#\rI( P tK<k_8@vp-2!0#{QX* c_>е&N#0vbˊ4# T &?YŃ:X 38 2&-@0`6$Brh)dDfdIC3I!!T C!('V Z=m_}3gB-|"HxqA:3eHͣ~w3k"RF 6,mt7u8S1ޢ"CP ͪ䐫ZoNX 4u"s -)!g@z. ,+GEwqM$3L!<񎻬Jsqp3J"" 80D9)c9 SM2ԓܐY8Kf2-M& ,3(Y C48G3VT9pqS42!{Pg/@3dS=aB 4H!ƙ]1"1}J˾@PO.;|7  Hhc6 !D8أ@ELa aG&5ȇ> F.&XHKZd=C" G (@>elRJ?c(TB(BN0B!.@ !f`pT?,Hw@ ؿ @Bq0@7Lc*>nqQat] dhqGj>x18N$"Q<DZ`#G B-i#ZD5N{ށ~t҂pBf! [ cS@+ǀLF-H 'c/x @Ed#zlVpA @ 8Fk98@/?8pkAcx.~8x>a&`tTC>FRt[=CQ I,^ǃ>u{ ܟѾiȢ&r!}r E! G(k>NSD0s*5^!*ᣚfZ"H=6/>A"`B2Q%JWk1WN0F($!0PI 5!!DZ,]jy,X~d(@ OB֌6B5X" )hE }h+EH<ʃ =%yB|Ђ f!! _#5GGu,ߍ="Cx$q%C~CЀfHb(G"wP?Y:zT 1!U _m(?᎛?6yG<+ғE,*W`-rq ṇYۊ T}|Ny9.pFkpcD^;krF1L1EV:$L { 4s#9>m2ɑѵةqG` W $^[ #0: P O.Xl c  ̀ e1}RA`zV8 KX`C,P P ua.1v#bdMW-&) 1=4Rcn'mX U![ KDXU! ~b pǠ @t(UCBZT0 ;~>0hΰ 1!ZX0 Q= O(0 fUq:H貒,9/@ǀ I#uehyW0 BE)'  P ЀY`eh9~=B8/Q9gp p a"QWvS} )BXQP` YH59L%AR*O%@ P `H5B7 I`@ ^9 ܠWXPZd 0`@B .Dg %8vS1UOЂ-4F ̀&(1 (-` p \IdH0JOE`.@ᙠ*EP-P>`~@@ p~ >/Z]Q!,U MOH Tد JHӗ>ٳ>-\I1>ɋ;ڱknH|F}c;v̙CN:sMG2"ѯnh޼y4ש]wUrevMo̭+XW1^x+7e |!Ɔw<;&merʵk.[b.|cg XCiSr58c._.x"I#@2(CA'ʥSsLÌc-'bH"$)'AQCvT*L9=ɓr938SL-c(сk-@;>r)|`B(Q7 -%7h.[F `|qE 4 HpiR=1LL.@VhFL>AD p-0 >cU38nj/b asW4O߭ 1)P@ Ӡzh 5-1=o93O $0pK=UYS{|60 dJ xCF,a n#CӰǀJҸ\-~ArDDD>{ h-bЄHD.x4/}>ޡX@3Jl)p!@#ǵ(ND8bQhZfp`< !d3$d4D@\@Ȱ7E ,(.p eLa3ɀԂ$0`݆Ќ$8b33` L :=%XE 2-Z5=#A=nu xBa8 @E>pAl,>tXk] J!5P&,"=6& ||C9 AVWK ،CkpEeIt @" NC+ءE*&q3yT%(4Xժ 6^?0a xUAVF G6b$-" &pV1ׇC(ڄCa/( p= 78[ 6͇>JXCHD!3(a DhC4 >R%w05!U(7M D!/#-@v$p$#I`h|l* aBY#Dc[YqrMpA_(!DQ.--G-=҅Zsl#80\ZƗ sCeځ1G:w [v :G'hR4rP_sCTAlvc*G<ⓍK;6䣗v_ǡP/W ա3Z¡jH#Ӑ4 #po Lz#VN )HAaq8]n|#A `{yCvy ;Bn*աn{waǨbE0Q1C{.r-'w| ?OKF@m8 EVkV `lzfpa炪p H5 PBE8af@f `٠d'P8hksv%ɦ r5fJLSy$d 80vRd3Bjg^p5F=[sD *P ! 0 ԰ L 1aP85H!w`0 x y+G"cp<(\P AӈHk^ h8CP;6e5`K0b 0ِƇ1Ł_\U` ?l^ ڡ ڠ  pa \e`[cNaH&  *Z>IZ ,Of4 ِZВpd v `G_q@VU /PGtxc[Kۅ/tX D\sH^)'J ` WrX "0LP jeVo<ǐOcH(4*p @ jiy'0C ֲL 0 {li@)\JE YQLZ@ 0:@+:[? p 𔈕 r08p6hCA,S!,U MOHϟ? JHEo>}Bӷ_?SPƏg͛÷ʟ+sO_L)'/;wཋGogOX Q|IsnݺvP۩Ϟ~YBJhLbkg֬:uЙ3]weףjN]_u‘+7vmE\<1׍ve+_uʅ 7qܾmm=6vֽVGnv8qe6Zj׸qo+}_kp٪Emjش{[W{|"5zwT<켆8]C߅H# 34L4ڐ3?M [@`BC\j8r64s!4 / 08M<ae,3 TY 1<1X94^8L.K. L1@>@IX駕|7h;8#s8Ì3S- /qSL2ռJ< (`U60%xY#: :-T,bJ(r 1ܼ-B,4묩. cLs@á3BKЂJ$$b"@"I(g;r,"ʁK4"!H Ьn;!X. /3c F!(@`$D&2_ 0/i; DEx;>pO`-2QD8cpEC.h,ܠXYn d @!^6 t"VXF2Ͱ ȡP: Qo @xg-F!A 4 @ Ȇ@!b-o(=DvH񈨑d C#+D h0## C@v-G2q #"(lS"ЂAtcL&~faF4n[#`FT h 2}I0V?jCVH$@"*A[#Eh= R)MS$$\C x6 7R`*P W"H:*~p @rcc!n6JR4k##6ZJEE;Py|>U\ ƥ[؆Ak\GjР8_( 4T 6B%᝭՘|c#1 \\4w8#*1l$9x#h<`θ3! n$ ?2ҕD&jo!yaoXBWvF3!Hmq̕|!KBv#3Ӂ9h.o6鈇R@#=!?0Rdݸ4jh!:2II\c1G 휺 : ^ NB"KD#(G`0@1Gڏn7 y`i(3`ʬ 2(;Q^l<%y;0C!kki<聏=;R둇odIG؃xKyILLR}ԃ2eQ*Avqyp},NjnW#1I-rzX{QC,1χhGTh!8 -~G9`h)ID$GMlt<> CA1ePCH1@!Bu\- G(yߘ\Ѐv L" )r pUGv~F:|G V*IU7X ` (Հj{Vj17a~hF1yp^,t#BPX 1 (r 1SW4lka`F3:`$0 R (e7o xkLW` `%huPw8 P ` I„NftTaW&y }8% ,t?ZpW0P er& ,(lfnf &s }H%(B_p h8v9q=%ϦV@(w 3p! 䰎 p8&hx/rpW@. B`mTA1v VR48BZ%0 銜HW4f pP 8g0`[ 1 g@$!*Y%I$MP R 0?ow pIr 1`  orP F@B6  cagB_U%Ւbph$p ؐ @Y) ,vK>@ E ĐXl@'d0 @*Gp3 0 pjI1{pUHK-@ P ə̇)6> 60 i Ő$׀P9Q(2 ZP.y @ dy2iSl  P G@ V| R*J!,U NOH[0Ç#o?1ȑď w:^!fcG< 1_KH64ჃgB}s/ѣ i*% ,JU 3mw4#}`etf?z< p-R6CY̢]ǗoEe%+wӌåAkb~ۗ/ _\t(0@:1S&Ye٫WO6>+ /` h܏|ћG:=zm-;jB- b`y'^';56<MԓM2ǤȐL0pŹECYl;Xi%Wj>_f9x,kSPsEIݔyi%:c:hi:.4ܣ 0/ϓu“ΰ):س!D 4qj PN?}S&?p2K+P`{dq!L  7M#"36.! -A!ķN:8M5D#M4H7伣C5 .!  `%hPs{C] c:_WÌ/t$84pr @ !tdJpC 8y$8#Xu9A*Ɉ#\,XPXm,0l׆ȇ`3  Ѐ& s#sЌ80.VAx(uz>L>粴c hK|VLFQ 8:I_2R饈4b Z.`B D~LL8-D@uiL ATe]h3G; 8 qH6F}"SQ@5?P5G.ay{!Bo'[11xE><=A E`C&x;#`˻rف/Qqw9Lp4 p( ΘS%Pt}v" `-TcJ4 ?ƞp w\Ttd!0 >P h~L p2" ]plp}.'Qn|V 1 "KRx(; "0<A^r 0*V_a#;Ẓ6 끎X i5sM, h2F\S׀ ڠ1PCH#~›Q'@!.9"  c\آI!,U NOHCȰÇ'YrȱG{'פ8LZTh`If>ʜ)_?|3d ,hĐGG)›R*Xڠj Ce)wኑIp d=`+n,GhR( 7+CGw߇왛lWF 4㹏:K 2}9;BX ~:P|vm0[@ۡ1|bԐY|6^O7iÀBHѢ4%^ܘq4>O>ÏzN7$/lbȅW\~wqHlω(泏_Î7LS̄Lra!NH!!d4lx">hB4Ond/"K$;c@NN?E=hψ43:TS1䒋,r @B(cO=3Ϣc>LzďO=L7C 0l *,L'wt %t:HNГcN9HӲL'+9wwZ] T'ϑ/:H'4;ȃϾ3;QSN8մuY"r E,qLJ;Dqg9S2BOvl9ㄓ3< 3ؒ-1 !(U+txdJ0 u# ?q?!z*Ğ8!5scJ)>AÏܐF3Ch<шF5A&=(-sD6 ZaOtC4\60iX##Ң9f+ 8b2g@Cո7xP `=L4jڸ6qI<ؿnTdl4q rM^v9C2* ہL̪6 SԸF8܁qQ+BtoI<=nP-I&#*4I ֎x:92:ՂPE*ȋc1߁>ydY<ר.ZbS21rҊWyУe>Ъ U-ފ ];PY$$KZr>c-^!H<)Za ^L@NJw$C]Ur#tfP†kG2 MZTfM/PPp X2$b!cdcAYΔ&$%IA,: ETxWxMlk#5a Hy(!$ dD6 ()F( '@P@*PDA@"a\#&aNF&h! \*@pCf="@#rN_V0AHLPD4F=fqRF18cĘ +QN4'pЁ Ɓ;۔}X< TTdcM8B!42 `@QЈkT6И j,@ (7h3a݀(-#RpqA PQyX% iУ JH4`x@ƢHN ~k-*kAV >2F qCGHC (K(fNs$A0? 7 z0!2  ~HH eYҵ<6R.r@^e,B|.`y @u0Y`Gl!qkG .q} x|44~jCl Gcpʿ왯;;/CY:Q$ֽ >d);1'RC pB`L0D"L`8l;y47> <V$eė ʂu#ap!` `0Jͳ4~R](#l@q!ryG,0 P C5(I$P xrh60a 6%}i&pV2  00?8XR(Ň"ʧ 0!D*=r oNP+p 3e 2P@IcR(b p!j 9` V wFhpb: : 88T#]= 1ܰ   p Ns8U)  2%U ۣ M4b|bf({0 `P-P cp Ou ̀ 8q_()f&f2@>@#L0 ; <=?&׵~ؑ Xb.5jtL(``n]U_ R>:88 BKL '8yAeb9D3HOjjD&;JQ\ˌ.l;$ ks}SF>$M<:t50cm1b)R 2H5@,V>41:3";-ҢIaRe.R,duc O=fw"CL1‹/'+8@1 bN?mܿ.>T>#ϳ8_3'Q2L1XȱQG0=1 {0_c7uXԁq@Nhט4oNCj\ߨR vHTx +޵׽`9.輻OBgG;4FuGv@M(4`1s= +z`t h<r,;gtd- jGDU- PPFiHKr1ym26xo - w HJ.n[Ĥ6E2vxM!HB{^D':QZb0+fA ;(p6TWh<9"jR|t0$!`->aTh>.X9ImQx8@D V0BL3# P6#N H BGz 1Y;Kv@(ň`$L cC  Hx;$ Em6\ 0Um(``  ~!8q `#$ =28d*0x\%HD dWX c,8F5CsQuEJ;тnC bF2{b͖}!$Ny ! \( E ,qVS5&l Ba14~C,O)^,<3\X: >4&2,/`FbـG%ehydGT"0&..H`sI D\_*\L} 0P;E-r!ilc8W | FbH1GF O@%H"Ѡ!!˫eG!$ ?  t1[ 4{ĥP  C| I 0-783T0+I~F{M0 Pe`Yn *c ]V1 G648)/ujhhp r )C P P `SU 5&: 1 0]hm@a0 b Չ ! 1V}j [ȅhY0v_c׀ ;fpP P g>Ǹ}EH1P^ dC & p 0  ah `-D3 1 ;0 +j '0 pr U5'"S~810 &][0`&p Z a0 蒮1{8 ﲂ I` `  NIZ/>Cr42, @3P#@`D0 M]PPS#2GVƸ;ރ$a&0 f u!?Ԡ 9D6Wс^C;0u ) y;Et ;g"BCQRP1DGs9}WuKaG&PFHю1+(w4DaFSH۴@539Y;RWt쀠H2:=2LOYymJ؃JC8=C8/![53+Ţ&EE!,T OOHKȰÇOE}eǯ_Cd?|ܭSW۵kմq8t)$FzqmcHْT*Uv%V>X;9;s۸q `pH&Idb X˚uJe30_v͒QDZ3/ߞ'[njՎ+I9fCCB X>`~~w̙ep%!Cq;x/h ً]:I6-ڱ\p2u[x(?za;S9\ͅD-4Ru}@`o ,:0HPq:cc8\M1mH!\'x @3묳\8|# b-xB!DIn@3:g8@Ì]堄aF.)^a>#+i8Z2k2k &Z!h`Y> ջi|G,e>vCGGf2` FEGBq<ćZqM;wģW@1 ;) gÀ%$!Gv7 fO|[8zC$,F11 x- cufBw4b-)JĨEЉx=2b} ZS¸Ǎq'h֬5<$U9zAqH`76zG /ZE&8d8e#+@XD 蠉V#tjIphO<{3:ZL v0io,;fh;a+=Jগ- .Qp$ +uV>1г] TX= QQÊBђ6Elq4_Ub<8{@BU$@34lgxO9lDJ48M @699@W?h8̑+t#s ܴUrr P6ʗ|@Bi l9ұuc/Hj׻* +_vp;Տo̠YFK @@rtF6 o|_kU'=2, pm|ga C;T}}#[ӯQlx#h:6a L,, P-=i@ފ*@2h`Fw8)ߨԧmP~B!&``؈3d ch:5±>l`@xoa}"t? C`.1 f0Gad oK@C' ڇ9 ]ldxhT#hǂ0ʌ (SM[C"y4~/L30!iT +!DEXF"kL=0T"P+\ E<j[RPA6XƝ?rH! UEHP~x \@!>! '@ @@F=~#8!>T2.r $g?Ia@ &(rj#=q%$8 iC M(IТGXFM*Є`OH`1 /v@S$B@ @A*tn# F+. Ɂ ^(qC.9P$}@( -݉0}1k0B]'(fg`8C@~gL mm`ZC! \>I4&9PMXd9$A pcV9y4 A2D"PadG; RTbS"& @bF8ȑ#5c"2PCz HAsIBFzd fp } ـ%PXIv783 *~'p p @-} %g`"f+ zV@o@v aP$ '.  Ű:q `4`v],VP0K>Ր)hVl ˀ; À#a +`+I -@OUV  ڀe7# ѡ 040 84+p?/^k8e 0 h   p 8]-0Պ=8_l( p  A [` Ԉ0\`FV@ N"/Q bz"cXEh̐XX3ka _= /^F 2Vl/t/hB`Wuv5^%`Ty %a%ESL/@RX%Z_Qp <"P2!6XY0?ܐ0"XQxP YI8#aVpG\Gek9 70|3$iN9rAM2_r%kE7%RθP_>4D7.\qݦ 32(zɏwW8;ZC6:L0 B^tB06Ш|g834/b +J ziKj&ceN8@Ӭ30j* hmj^|㖰 YiG-sYN_(-!P3@/))쑱7y9L.;H`(@  J*#ܲ“5LR(+M9 "bi."K2|2:z -RHo~[$8 %gkkNm#p )Bz92aJ>kd6j >9㔓5 -  5Dˋك^x?xM-(hUmsM2!3x9 |@QO<^<b']D=N6)4߽/"]FAP, v0)QtLa}C!I)Wd!b, (wm@B1Fl(*P d 2C+쑏?l(b0п|A1IC'V`@x >я8$&X<),6yF"RF,}<Npoбp-$>p%r̞!Y8`  h3xB2(  ؒ [h! ngE"`!8 8>nL-o _@7qOaV ! 0،'ODRJJC:iAe5IP&A}:TadK< `SJ<#C*:HR~p@5tdtB8@:-& N}SDH]k B6h 4taXR<BL`P;L-I;M t<jP5``Q5Қr@ફ `xbj?^.T *.,a4QL<, *XGt 쥞 T8VEM;thR] @ }Uo#Ԟ G-Bl !&a[.PKUB]i '6h! gh:Aq87@GHyC-we*&8@~& QE3axrлA$WPxXP\ 0H")>aB8 ܻ#n"4&6! rCfS"vr|cȆ6'2iBHD aъV.z1PgMs9ԁzc F1hCd: 1Xb;>~cXϡkgLCOV;Q`)T:h,xhiz7r늹̀5!.S9]x# PE.jU&;a0Qig4p@`| ["QcGw\Cs ^FQzy @ UE-~~=R\Eu\c=8xp1| #]2\ `T~4Bk"$ XH+zNx` 06q ѴL9 nxiwAg௴^agP;sCOt!tj  P +G d1 SRgեZZHFl! )C\aj 9 X0 ЉvygC}Xd7, {8@`v{`rcG`Ȋ5g c3b [w]asMЊ)@b Xmސd-ޘf`1vӵ{=$T!@ q ڰ4Z9aTA]Z`U@MŽ y$cc phKaOA[BUd~0UP P ʀ wa4yzReVU S+p YɃ[YUE PBy@ fDp #YrS 6`I͘^3@ H11z5UXY B0a#B۲L Ё4Q5 OG Ɏ"" `LDA )8< YB9TV YIQ}գGҞI{񛨱K go$x鮝Ov×_ŗH]*w>AEg:u̕jN;{ &{p)H${n[UZ5mܸ3n>':2$yٺ]nܸ٭FkԨUfn3R|H8aOS7.\qMmefŎ FXiq q}iNsu\V uiЎ˗waǎ-h):W)x7muhΈ…k\2-D >%d\?%wb=t8u b+L$L2 -˨RP?<9y3 3B3-wK,4b!4$"8Gт0vZb6k@#4R-H!G $r=MIe,s6 0r-HB!GOCPJ5tfBňσ98[sM0 -c" i;P0b)y jPM3S-X`0Pp 8QM#+Y $CTS>LXkю' @( L0)F"E,b/NHBN{A:鈳ux&" 05(2 4͊ @!îHB|`L/Zh'/(M34HO;mM5m ('Wͭ X4Y\  <4>h NNuލ!L@ rbK⃠!+@|$%LaF,!! 6 !PP. -"B~!aQ ZbB0`0?\Ѕ[uI8h5l)0W3`d #( F(8Ǧ\}`@t@H9B61W| bLi,#FP\!R~,@LtH0`8R1",`32Q3~O4 fm< ȅ|9]NGPDπ\&J {i `-pjPu  9D`[bPyQ F+wZ_d0 Fp k F(>qWXd;@V8 H NjLPC >?"J%G5!!>Pdq yX5PA2lqp<܆0Ê/z> H) $ E&b^uQ }P]=G(igPL緁(I 2ZJ)>*CXd P898HXe͂F%i=J "MC&xA v8$h~Dm7s@(dBzU#P1 sRJ MV"F2UDKDX1S%$`/fej|c,6шBw+n gGf4#z# Ch;+BAF9gR13jP`cF5! ^ζ0q!ip/_N>~%Oc!~#Ļ4@En=|* y8~紣KAq\;I:̐1ndAc%I?"4mTݩ5q\eGD:E>Y,@ rf?6pؽ+8yʋ{cydhdC]qKv~#+Ыiw *.n,C/ U٠kvbMK(Pe` X6g qPp{Ec#l6#TH`=:H(9p(b֑ V'cFbp5PÇ~+$r Ќې@v9GVb( z(6N#4@"@& qywVIo$QÆ>VYpe+@gp$p 'J!b*BrרY *0;؇3PR r J0^'`Y P6Nԇ]؏M( ̐ 0((t Ï`<Ԑu#1^#PX@Gr q 9 !~.@ Syrn `} )6hS{$@ P ̠l\ q8I$ TS C0; s  b' j+!c 0 p թ-rnx-KH p)u `,5@p[ x Y! H8#t JGP 09`2L @C#\Ր p 5>!,U MOHPJH"E ۧ>| ǯ_C(S^د%|@ګGMzFSɓ'Ɩ-;go<).<{1I F@Qڵ[ǎwƳogժb _ޱ[Ǘo:t.۷)t5fѯa lr vIگqWcm6'.}ƭ[8smU1闎΋NrᒇN[5iԪI6۝ϼ\2#}uZ9ɹU 4ղqmo+JОFLh@WFSj鴦6E(40 3ic=d2wA}t sL#;~wj QwN` {0G *:8 ؀?$F8BUE.h B"HP<H2P|" 1 PLB|cߘ^B *T ?PTb  ,\p[AZ؎o0hD!Ђ RP; FA~R,iX >qolb1zth p?@@`E# GY 4vҏwHh"X pA1el$ *RH/&E go9fnLt_n"a.-!``"ч4`6 k$p!HP@A#w{+n =q `"x!䠅D *+D"t̎36`Unm"0 C-:AB8{ 2=xS,IEb$0{$K8k7+DWf5O h,B,adCP]=1? mQx'$шC*n nñi!:N!භMe"@C D(\Ţxriq ^(T5pPY.TQkTCl0pBŸF+}hC @VxF!G83 fV8-\^#{ 7NL`WD' w1f"nc8hq )*p `pW\r=p2 a@4-'3FA9bXG[!x] ! G(nx㝠hnH#`X9c:bmD(iz0+?oc9a;+0GIh0F6d\!:^Ը !y mn *9@:܁)# TBj]dx4mpCY;8+7vmF0ʸpp(h"*Ta269СuC UG<P+IJj3q\0YdTkGYsE-q(?街*G#sgW${`\@B1KƟ"~'!sh]8G[>[ W@"vx:Qrg7 Վ#/ YtwCNM 7Wpp⎴46Gݹu|CȆ8؃<68X)oÿbָQ8hr` Z04P4Qd`(B̐F63(Y}A<턏)@ HS I ` b(p Po?tFQ|w*W70@'EW5Ef@ 0f g ft1Z=7z eM"YRSS`:3 +!{a5aRA%@xF*P@ "f @0 f59Q 4Mv> @~`3Z, MʶrSS7Vmu'hM"# p5 [C A Ӏ@{7@qs$7pN2Y!>T~6@fn(lPh;H^H//3 "V ! pi!s!@Ag_L#h#50 IH`akA*A p8QC $0 tT! )qЋ?qhTp e ! oFr&x:{`..Y&0 0 ` 9Y0 uAyy0hX& Q f!UX[بD`.  ` g&^f]Y:#pd ? P ؐ pb,6qIͲ 0 #P Aa Ӄ. 30 ԙ 1Y S#ʢ09P 0!ۀSŝ @pJ0]  ߀!aPi* O&!,U ONH[8_‡#J~3b7ǎC^o(sː Gb,y2M|8ç@?@ۧfLټiO4נi"n#|h6w;/84fI7h7Ol.M.w@@Gf 1y9ZM6H 4TsM6㰃} (VcO2|RRjKfA5&OXCc60s*V 7ܨSG&\f(ӏSe8 3<33&S1Ls7ӑ:Ҁ""El˭ݝPLh75O480Hn-r#D2&2=$#- xB#48 /ӂJ$_,2)|t1~Q$B{MJp @?8DG;؃g\omD"ABBhD#*p 04qW@Blx #zlpx/(GM06ňAюpTȅ'ABgX@٘Dv.n'F+h&H F1x\B(!!`l` H@P$>ܑhT#_ X@@ h<\XTCQ.!#mk$2Y?! LPQC_@qZ5|POn & PE8|#אvWL!1W#t75C '` H)4@ `AAsE,x'fTX-!3$4 eh\c 9*i#\,P1P6ymȢtAAA;бjL#b\-7<[MˆF;Z&u"SUu!B!uT8A1c-;9\" eSbsmh0IpQ9*hP,Ym `Тtҏi!} q$F5:f,CH2kCz9 NILO2rֳˮ35(j|TI.Ajnzgp!n3vT9aR -&`F(_}3gD# :+^14(E'-<S,=lĆ6 Nn""BMxSƁw QE$hNhBO`=IHC`̘ >u@H4":x0Ump+)3 3Xy9Ƒ=HN.?1 h;2ՂG0M `0jꌜt'=pNīzȌtC, ^MlNRvx5?7;Z%P Ѐ0?S3,g9Y Z`S$ߐ>K lD`/4p]>lm?.Rհg#$Qe0">T:LXn>,?'HXHcc'NGҫd'8i5 j Tb<}%ez`cy 2uD'Goz>nr@=<zEu|3R[0)| QA(A vЅG@ K=Z03by'M?8>14@ h@R0KHP78f%sgv4Wݥ9G  ࡇYg5;Xq$)`뤃: >P:˜ |(d( ŤU\ųc9cΕ#e*HDBg-)OIUje:Νs9l;CO6HH"O0P`!"ْd'9pNz7H#LQ@A0b"jsdp6ߌc;:9 $,bE %$s9~4H 4`M8'?TL18H"g|Їg@HicN(8xn3M3Ό;44 :tI: *bH*(j yӔL: 404\6ߨ3YDps 0ƁDq@6b p :#3\O 7߸CsM12$ ͪҝ1 ʌÎ:s'7̵3 Ӌ.L2dC=7gK'B!=~)˨po"h3-܂B 3۰A3ί좋.$B1ª5]LQ @ >oD2BKK( =c$8ڜ|B To1AhDS±%X-tw"m3ђF5ɢ 0,@PLU?")ec\6h Z0+^a]h`An4L.nJ !#Sp'ֱxx0nA H" QC41a ~bÖv0p^ iEdrtpZָ6ilv͇6f>HqA0;>tCp4"+YJ#] BX,B `Hc2A:ohhM4 sXv},=Cx/E+qyBl% d`9Pfxc"uf=#>(yE= }AS5h3 H-*XPjsbC @n搽Ѱ>ޔ8iNc]Xc)$?ew=i<%;`U` >RF;g5w*L@, 4L82Eu##+~Ҽ(XdCe{&M B5hKU1lAh@&? 4z1Ԏ NciC۬.T?,r,d#8FpD`@ANv\Iyl0 ,ԻC,H<ͪQI?!x@:Sqm\B 6 x@-܂dɎ~@(!ܠ/HS~fhӆS S&(-@XcT:!8RT! ?6l`)3'{L*8CwcrH3ze:$=ԯȉЯW㚩P%GecCf"F:ljG=YoD9b\`4=D|° Ԑ ZI"G's' #@q`{j&$`eP . wt4d~|7àwCW&@p x"- l|24X {8. d q5;H'K*1'};fF@0 '  РwBKqw9lqpC |t Ya'Lw!np7vhpcC |T p5 fZ1#wbAQ%6!@e? |D YP02Hp  LjvȌX,C0L YՐ'W28 6(}@ ը 3w谊b1h@ s 5i/RSxw 7sq4p#G@QԠ) nu x26kL n0)e>p 4 `'#~H}`#0kױ%4KQ 3 `%5~g.`f# n0H @ ⲋXYly @4@607t  ,@iP3 #9{bci!ٛ&4 P |0  D?0SG䥙D#A*` @ V x {18qBK̠ ɐ FjPW7wE,IX밡s q0kb.:!,U ONHGϞ#JHA|Z-sG$iYI~ hY~rigcFDž (X휺ӧU@3Á_.e*M5SS߿=CU0 v,dKmNe , `B~ۇD"ib.`/L$y>}4B{ Ӷ{WG}HmsVգFDt~%iy;w|ï<~1\H#{WA9 ~C<ֳ_q3:3,, '0(]m}&4c!>Σ>oY<`s 0!.`_ ,c~%]OS7/,i+W~](O<#(O\xk}@uUlYϗΧ;"IC6˫I 0u.Pȳ=^;c:$c;\SM1+b!nP713{*+E9N[-.T" 2).Tᤛ: αǦ<<#-5ɨ l|0_-%T:Cl38@c:D)9PC 4,L&n{SKC+ج_N:䄣cs*B3q8D3r߯@/!~Xa[ I>-0mNl=9oN<Gd/:# 4#K-mJ"rF 0[m D`Bügm:;MN=A:os s -b+lcB 0tBΡ:U8<`S4T6;={9q:1o^,L! C,"&ab`c(,yM`[ g`9aCb(GڪB^na Y@E,AS H׆9plȢ3BiCH3ih3 _x/| s㉧>-b _ iP@Ǽ bx~3C6 j*3AcXG8H5p8F oPه=tcmІ4ٌ->ÅԸ8f~ԣ~FOY ]0 idGzcg6fu:wnCg [DRE0 pÀGIm#`5t1riP rZ.vQ hlCX=OCS76y43xa-p/|h(r v%bp=^ |pCMhD5Bpv|X*p|g>EVPT7 HlӃBxE1~eI!wC pB >`M"ڨ!P&y)y9dւpE#`d@@4D+QB8+p?ޓBP,chCx4M?A$@I"P P s]o? `  ^wBV~!{ArrI|`N.>a E.z~hqgBӝN83bbqҕDfN #j+Nu{ b-o=lY6-N0lS3<6€f4`ǵaRO=P4AP  ƯM 00`i6CL'Ʃr|@@P%T R؅".T`L: gqNΏwNqC< >`a@C Au8\ /dL9- SG,RЀ\|Q nA f3({ַN.0xTQ'@zы`hY$R`?h,C[.\?/y{Ppc">FϖohA S( r$pgY67l`8KO`c@k?'"X6a;YCC^A_z>\`Y"(nh?(Э/1 mh^^R7B0sU P&ðo qhg 50 J2TjU,#< C0Y# =+ ja-  ˀ:h<@D h4 ߠ#J,\hP ɀ 0 H ?ӜC>C4=rdvaL ͠ @Mp R n6*N8U.bK%" t} ?ׅ9Pc1X#R؊MV"(#WCOX4D0!#B`sI.PdOO;U4@/8 $RHp&I`G:N8{:1)*f*d, P]?O>>Vː>m:߂+M3< /b-E*;/r@/ Vax);00 YkK+yG ({5`C++$7t-=٢:$̍4-;L02(ab5l\Sf +2>hO %=OK7XQ/ķJXTבm@ 2S< M=k#@T#ңDH#XКkaK!dxqC;mPBA.O;{^܌Ű.㩂 &t<1B H@.A7ݞPl.;K{+@L(.CC2,C@Btv@t'y4w A*.+9iԨ5#sP‘ pGp@ZQtǾ[+8aw6Dď}PxwRR9wx(9Dt0 P7DF\;z =#/PG;GJ껣!G7>C@h'lq{>守L* B!vҖGf.TBJX8ʁt1<@ ݴՑ|f \Y˜C/sG7݉%>f#+q 8xr"=&(QB3+#G!Je_(6S3QʺnpB́yro D0 GPG6?S ӸF7ʱ)7pWDA毀 T G: >˛F6at㉶Uh\<Ҹ ?5`X:k|#e>x4Zr*#On>iT}Dl #L7~\5 ec1EcFI*|TcBA*hd:lWeCԀ1x_ X3k#$i,PK:9{y4-;_O51IDE.|;ha re8^s14_x]H6=mK\BC# AmF 0^odAH6Qakb K E9t)~Pn6]xzюK$`s"0Eb)` WPb/F5wA"rEh)o3܍n $jq^hT##=QX6xm`E8M`o̷18P/M)\Wڏkկ~ BP VfJWJ@v!f RG@/yeNf8w0 ð o#` )jH 1  O2bOffoE ˆ o0e0v@.\3 B6TTh `6  60 B P 3UH@Z php&e'  H 5 ڐ0ԁv؄jgr@gQ  @B p Rܐ0L8/ '=oV v@  0 ]"*`f8 20bR @\!* }2:א0J;/ Ra g 0 rVO@(P  𒱱&00i> d ɦ lE0@IɔZ&ŰA`&P@$ |%@ pV Ҁ%l5􍺸+ ԴP  eP 0tX<;ؘ[QB @ $FG(!u|' pK)vS9yD1[qKyAIH7rY H-R%ŴJ;)[Y@A0p'#C9^A )Cɖ:'8 9cmyYR/6]%-z%!C[a!,T OOH KȰÇ맏_>}ᣧ/~FIa}cjתmfZo+ɓdH؍ -eɎ+K*TZµlZ9|;{j=/vqvm0`ŠҤMcT>{޽K6iҦIM :Cvܺ >!zcN9ǗR.V*v l < *ԕ=:ɑSN8LL1wK(b!Q8 Їx >)g;CN8ሳ̈́<-9B  .PA4=6PXf̄| ,Bf!FF" #RgC+Zd340r+R0j P˸)8M?TS(MďNt8F r-$R \H[)W6 jj"sCD5ygC7bcxH32 *833$T͏39E/Nrs5Ԑ; - p9{??|Gv|Ur8":6˼ ^E AW<}/x I[KxhGucH6珍\C@@@8.B1O9YPppNj\{bG6F'`@AnA (Xh]G'xpD=Ç5"G9jUlC{xt?萉/ԤYmHV>&2cI$9xTiXEDN}%=쑏}Ҕ!̈בGc9gv#" ^I@8ud5%,)]fq#G:4o  YՇh-Yv <>tA$Jb–;+^_%@ȭn!phc_*[$ P\ p;({,O0|31l|#kR ,@-$=( l=̱ 9Cd4A5ZPwDM"96)hT6G;e0!ԍpPT樆4U,{y1 X @ V1n@Pn `(Cи81#ȭuH> _Bʴsr1eL(FLjEf{dގZ#AhG|1% /@9p1 ,C#b {gF,F Klb bx&GV -  1X;}XD"z$CDQ}vq TqH?! $xH :0AfsX"#B pŅp f\CWyT?EqKp-!r3x !0! q S! Uh{7̑Ђ U  4юLEAg oXb85] D؄#7d M(@mAyQ0c D@p+G-3 jG=14b?".Chd4 s 9PY0 =TpbA s /2d+na+8Yalb m#kV8>)r bTfw;PL"1D 9ɘ5Л6S!_BgP1 d` @ ` &qf )Ͱ`1eFCzT ; b8 ֑p q 86I&g2Π XW@Pt>]nvq0 0 f fb 2 ?dLXH5$"]_Hf i #p.peSHBKA5 ,DhOP0 `oN x@e^w XhNTK 3Be*F?0  CIag|"2ϐ "?JXp#_`pwܐ_ Q P#\2`BFe+v <U`VI } m%`^XƸ@*T /! 0 /P\9!Ӏ1-PNX<5=3y` ~ b 0eY䐎~E 0R^8Zؕ@ נآ-bYX"J `Vl5Z' xP   W#SNJp #@R1XðFP`d՗G,C1XnsQ s5QH+EpP $N` FQi)*y7L V@M*BmP HQ]A)9P J]ۀ b@2`&3`;YEBNJ@ʼn>֢ ! џa "FtB'ZTc3 GHutC١6II4>jH*Z>W2$#!,T OMHo@}ㇰŋ1o>{ޡ+g:rນKcʼ!ڭ37mӖ)[XjԤaç2 uUmb'TT^?PxMM3ZjъEK=ӢEn1{o\6{n9s&X.]E5ZԨ3IvXq" V]O>zߵC6hЦU[ .^<%2h"9BL4P 6DAv~գUʍ9\mBd)rw,!PdAxD=:#8H3-0ҟ!tBHw$ nA3;W8M}RsdBH!2݁(Ѐu@ <^cAN rR- KA` ,8tc6<񰣎:;4͜܂!p D)% .=8DjM502)  ,j:Pi&By9*:+-''  Ƣn C=,:^ 30 -Bg8q!e7N:@M463 R+!lpЦt>L,OA꫶@J"Rf$\(P8 N8@Ӭ/lB !AͽR,OPSz!*%,\͙-ׇN J|GsafM41- r T'w09\pasU|9)7LCM2%S T:yF\ciCN|x6 $!>H Ā?w^Q ף<9,,]\p |>V@c=ǒ<#?{c@:bw@C2Xn xp GAy~H? L@@] )@FCه!>˜x0^C&C{X%@E!!` X@7>F L9 g !1.p*%0A(8,809>a @hA+d@klcw|PG[\aL*:E[C7 FKhr$i|#Rڂ4s~}*@ѩ@'E>{U~aD#G;T@Yn3$6 ntc0/U/[ )@IAdڐ gDP9HEh@|LaMj Ck?1 6 r@ )_tbnLH-N2 q$ǿaST"4AL} y0$hӔg0qf97uJ E(TE,@E1]l)]#g4zDRP$a=x! 4h1 D"^chc>б `M-Qdc+1^ 50  hK0-tQkcr:ыY-h] x"˨5Ʊvjq&ժVEvj\F)D Bph)`8C:r؄":~o8%к/ n#= E 1= 6Iˠ_lDP1raH,(2[ L(*2| A6Tsp!gp@c:PE(>aWĂ"9rG5@x ` ?ܛh- dlP??aGB#u3C:[$J Ftl$oX A [8'q ΃&Ls xբkc:7QAEe`tp#zd4s .r!hG PT1$XE `zy783-"!hp@4$'(BR1XON:P3-l "b ZH@1LANz^7Д 0hr 'B!b`PF^Y<}z$ڌ3B-H"rPsbz(P|PC62ӌ0J#$!Td Aϟry:MreC˫27 [ '\P5̔yL-J6YA1Tpnc_N8ܐ 2TAN> \J>>+r8=>/!D!g pTC}v.[:L6w /rR@б p{T4vC٢rp^}h58s.!e07% lHd'nG(:37\ES /LrH[г 0” مj W]E53 $P@w91 C>눃={\T;3\t3dbEr ]#X4F8 `81Heɠ"C.F$r` `p9^a0`NVÇ̄XD ^ -=8h@A@B{FDW m ?Ɓ(>h =`\|b 0a? D`*Zn lѣAڱ  b4ME( .p\GH:$IP Ѕ@7±W)[B8l!ax>3^ҖyF51c@8 tP3c) r l1I YRZKp#>]@@h *,d(DaC%oHCWO#n Xh Mȹf  8Nʐ Ne ="ČJD P>g=:uM-(O }\*>2z A^S{?^ !SGT[>-DcmTR:c2@GF V &v`d|1D;l0B`G;yxV PE$ Cpjeq-SGlg;X 2X b;>&wxGa1}{(2BAԘ*:uyHwٱz0(*, 0OюP9%VFlp*&9 aH@E4zs~(vā͖%-$QAA .p>` ~Q$lpLr(8!&dx:83 q _ÅL?qe# cv0EpxG4nAiRU"Ba ]$:Q iDNjΨF6ev`4q K,HC1[xnN_͈X-c)@dzܤf&I14N٘G S!@9av(0v! U֩(^[&ƀF5!OC/x _>" tF%F:i xPs^(Gx8:cv#ه9 CC2 >w TqexE=46ȁwH 4s}^Ƹqau?!YlN$>Z wF5 ]i21ip#`G~8tpCTXB4 IAT@0Se<#r{F6֓No$H?ڱ ;`A>,AR"$^7bk< 5 I-bθȡvc {`C`[P-` kPk  )t1 |A k @j9QH0 iXqHF@ Hm| pv0 7$ р (cXqW5"Jc |@z60 x^?9UIa /m5@ fSPa:Ca렇C'QV]pr " g kA_pxAnӉ^[xXhT6h "q 6[6*>GqUA̐ÌNr "@0 / pa\Uq0 CZ1n Ǡ ZafhY\Edec `[8 pIZ(! p vJ.^2Q 0 R:`1 Ȓ>1U[W Q)TI"  @ F25fiXSD 7EZ9=+ ~ AyI@K޴3 p 22>PMiT& @S@pir@@y)NA?DEKFs D4SO '_fAey])@ݔO p 恀<OgINԝRH ݀)_ 1FTJ` D7Etg ye/4@O  N0 0W *J 0 n}@ !:6RDV!,U NOH)_~4ŋ1kp>̧O~ )f\bʇˇ^=z8ݤ7>~'[ mC~2i9xIO*jMXL3EG6^;vصzvmznZT!~Ii'uաCg:C9e]0ͤiluKgnrͩ}_|k^{{͎άn\p@M۶pѓ k'gy;̣ё}{5iӪi8v7>|Eŷwө~vUr2$$3M<^^u]M}a 303הCx(D #T0DIxMOsVuhL3^8//L6:Xa D)eIbOralQ40 .2$0(sM4#h p0Rduه<СNqل fOc & R8<y)alHB=j3!hHҒD]P~C`ޠOln5#(:@)2)II`tPhG:nu6pyH/r&S}0>Ap3QlPgx-zԋ6F pV&ǯ@G9ȑ8;H:QOINh{2JΜܢ <ShCiq! H?!. Gyę1!6sRy()>ww/Ga٬)@Mq v1 `cF7 _A +0@X\(dVF12AV8(ޞ'$b`p'>p ` P F(&!%7zW8ray^40E e @frpQF@#ho):O R+v @atG:qmhpyLIb`A c F|!kPyqPc2fCb$(!|=n.ymV} /r<c% a  ϶yptWg3hGѐq@x3` B p Afߐ8lGhjP,: ` 5@! p0hI4gpɒc X(P ( n@! 0B`PV  kGpdЈEh`A&y&8!XPei (0 @ @fRo E?&s `&p) aImQ B0%be<r0 j9 Ȁ Y[ pU ` p  SE0y1R`܀PGEx `f%`!,U NOHSo„#J!~ۧo>~ QIrbÆiԗ%>|bױaɛ7OTe ZϞ~"q*N~>ڣ7jxܽOK{[<ND3R-Κ˾ jN] *q(`+@OP:礗32#-,-J*"L1Ѩ0D  l3yd~!4Tɓ:UwM3|&s -r,TH"T'2%M=S)|DF)VÞ4|2 N "b߆,#2N>3%ePP_ LLfM5< ȶb $!$܂NN.8"!L /1暳#8@ǥH}BH!!@)̼LP?T $!CB/pV zR=krK,^'AȰOH8 G4`dR 2{wvR+ỵ]F|mCJf y#sCab%Ǿ}@ L; c[#ᇺRz{7F~%sn[X-X^yz>VJ2K=,H;ft<)Ãu8H>Tnmyķ8qu\"gwHGDm_rx#.T#)0 E?llԢ\|l#w]$&E1AnnLb'H5<nxوDfOro?[G0YMX@OÐ*ΰ_52 "Ʊq0ve@|1'r N`"5 T İ% P,Q~vu r8Db&bYPB , Z pcp\'&=Q@[ V+3!`~PZ )0~nqqw1*ql+8]:hY3%4# 4 i @~&xQ*[(blR`E%`Z 1H 1o>G%aBp~X[CO@=PZM3- ؐg?9!) @ƅk(p>0R K3& ՠǘ w1?D1b9=`/ `h֌q`X~0R;u H#hj 7?0R A=&bQQ/%iXpe}`i6Sd,h8#а H M5`_EW{*I|ԺPWAؿb7Q>Pѣ7bz{2&!@`sZ5^z=|(SN4 H<~xڹ{.=|Ue Ƚ[3`h5cޭ[nՕO+MO (_;w "sXbÎ: ^;ŷ|W,Bt~iX 8C6ǚz 6訳I1dG8v! ”G܊/:$9昃N;NM,L>$o0SZ<$`9DO=cI#Da@b' 8 7\SLϴ bE`cBe r .r . 1hӎm7Ë.!E f0L߽E.GlP.lE @D,P gv0iF1 .3!ăg$G@8 BA`D|GUavD)׈2"(4ᒎ(a158 ` z'x'7 8F1 gT# [HbShѲw`t*Q|(8åeШ6)W#X!PG LQ-@9mTZ4 tĵ@+  xVcaR H$=^BckF8A @d.xvF7!9r4ّ[DQ"8g4CoL ~w12̎x̣Д+=aBN`PEV,5gW1tA 98pG;1ɟ\y(3t%z5GY}H`X^뎅@L8 ?T-|Q@8m|/@3<1ry>Bm,dph`Зy?z81S&*%ހ BIj׸-fu$C p@#FB T#,Ĩ25[b |X.&)g9bSi]є8@v``4  7EꞐ6^&< A$Q(MCɌ`T/7[Ft=bpT\|4\||?8BA=H(3#A-q~{5W^&"h; $i_舎s }B.gDwB_u(`{3a9hO{xڐO>חن5ӡ1" PBgp~~]pqf=l` 0 P /c]g| x0`'!# ~` P0Ґ r21 TR| H8#P ? ʰAGd G  rag$3 t ;0 uaJike27`  .2)32"1nHo=R4pt(!B5b2 0Qqgx`{1R( BxЇBHmFaƨp&v@@P D 00 '8p( &!q>Ft @)"jRkn@"tH@ T A)'R0 9 v :0 \ ҋ&Q`h'Ps@<` 2Ϡ A)`&W_r k؊&:0 HC 08Ta`X1t k!XTݤ ?(d0אX'ft ] aNT`  K P"%ʱ$٘1 L0/p>`rpb,  %0cɚt5 P 0  0? )3ܷ+sPgvĜ  Tԛ X .p `{ynа ː 2^ܧ<1 )VL%u&nf3n(!,U OOHPÇ#Oexa#'ǏG.LfḄb~%Շ (X9ӦSٛ*LhZ(8 .0X?h>.\1V"YYPnWA6D>LՂI/\5_2Ucu Bp _f|}zhOS0 X&X-O~hnn/8hDŽzhQh4վMn.V,WFsH|а.Q͏;FM/_%ZdgupmSтn7(/xr!u5n>b%?C5K.phr]9w#+O>賏N&M2T?ij6T.2$p(Gb,b)Y=D:=؃9L.* !tHB LRj"H:Y2z(BH A *dA@(>jQ?Î:P#4ނ-"`X L3 O% cGmh(\᷂p RЛ:~@ohcH® sq0Rn\Täᇾ5QoW G |#G;Y>jhp\(!vR U@tNn%:qhH2ly:-},sGDiQLtM^vcF1Q b,ȓ5aˁà TDғc`S;эEpv `ո7ƑHVu#`B5Y:9~ .lb3yjp#IceZ cP7ء2Zbf)z谭:.Ӈ:k.x gl^JkJ!>H5*ZBD%& T1Ekվ:k|x>P3xP4lD" A[(m|Qʮ$Q*A䚷TD,xdpQ `%u}:G0tdDH@F5f3~jR[a.qg88KG.e6N>#p pTP@ `<D)Ly .Vl#X2@Ǽ+U@ڸ$'Ap0nyb " 6$x7kD0(-PkjFPph$P 2=`!`8`.pA'"rntKBmDb.DH㷂FP4:5'J fj7QTC1 Ս!Z1>){p2v74+. p P&C%$w ְn c5B/hP$<&  #n4d5r;2 hfe Ŵ!U5u1c `I-l.`'"c96p(Ar| P^P66ks@H8mch E6'6'#D! NNO堇>p0=;2kxBS4Ҋt]OPE"9Q)&Kfr?S X>1]t@eqp0*Ŧ|T:npE( PY |j!͕ ^E70b)+]snCul,Bh>Fp PY0 $O&PX`_Űf@  o*3 ˰0@>7()" j@0y9>` !prge}P^ : IҐ@ T2 \h_N@ n pm+РO1g\ `c  _@4UXΠ G7쐃"(hp eG0aV* :%6 4@+xip 0 @ w% b I ݀Eƒf!@ 2 U ǰ0X ԇ{"OM Z ' EO+)ɨ()ՌgіQ !!wu XTN35\(ǖq'p  6 @Y 3 p ސ@Ї(N)QQp>@ p ǐ А'T:tJ&8;1ߐ +! Yv Mal_q) НUYEٳTj5)$+)ߓHCM5 EqQIg/C[<(&5  d".!,V MOHPÇ#/>~3]=sٓH${3_^G%`.ɟ&)CmZ4dP  H`)_9Kv'I*@ @Aq+Ы=vM;VFٔ(0qq,~|g7h|e q#9.4^)\rxqF̗]%Z$hȂCV0AW Q2}>yeV-o_$2tFf`uҥS/h]ժ=k.Uk^.@|;#N~0 .x@:k 00JtNE9LC4p-2 TbkM6 IO|CO<334D#0pxK#by r,bPNL͝r .@"!A$HzeNh?oR<SNgv -2K%i j zdgd`O>>@*?;`LÌ3<˸"I_2Phz%`$iɏ>Nk?ltAT-=8-wc&c*\5%1"=O>@=֮N`-c0i `\~P4h㋏=-y=m_P?3<9:P5}/L0YbK*,B)zc[04Dx=;$}PEsގ瞛r8?3.$C\uIp HO?9oN=j?<9 w8ജ4w2PF4q#ghB f9B#_Η>(H?Uy`~KZƍlTcF6avc$q8QnGV-Q>xG<1M =zw-Cy 9At&3Jv|wrZYԱvC3ER~x1rXA;y`G;>x|@{卣fI9q["='xƍkd ΘF61N\R(>FS\_>ptSxt@~A581 2֝qpxK|+VҒj@@u\w'i`Gd`lBr(z :q'g,F0 U PDc@* J@+{|8Fz)=@a5QJ `--pC6ȃ8/h6.Z⽷3xLtA_ DAqC?qblHOkp _(chDmF@QPX/-^AV" Po4J  ` Q%qB+Ra !:`&$t/jfb(!BEfB "O/b&O`p:v? Hb<3u Y7;xv6[t/F&2H! f(/M1}L B-pF-lD ,@ @ rx\٠W܀X2uJh%3"rPP"G> X;A.rB@i/D s "xP>]`[nL0s!Hh0"1 _$#'~/q|X3R Ě12 䰈F<x@:.@C4b,PAX5?Hآ>tx)ZT,l]I [cף8^up(D#^ fDFȀqGB%Bxhg>_pVD! &O>qA~'y Oއ.7f HТѨAH|̬kC-#Z B (!c&'ċoUID9G2l20_Ox5W;0 O pOKf ?RwuFEQO0rf~~C" Fp S0.r' p5?а 0 KD*H/ Fq1inqknJP   fehd6 p5 q \L960/xo&i(i/ 3   ǠXϐdOEd#chsfguVyd@ "P : q0Nx0H֔#GPfq8np 0 r r ʰ7 RKD9m/ -`asƌ1>P 7 3 Џ !P @ ڇ?Hdԇ~x9v 0o$0 d ph%y @0yPK(h-0c"c&P P %bM3`R;T2 B`oJ q E  W-x0R & !70\qP v ?@% wU29k0 { P p[a%'4W Q$/RzDo\0R` s0{<;$eݐR+Q0R TF9H#I\ 1)PvLI̔&9MI1982מFCfK@00H՟]MC)K 9Ɏl! 9E7 U/D6XV%|&^ Z!,T ONH۷?o_?3jqB{ޱC7.[h׸mV[wuI#D|ڙ meǎ!f+TP<|5F/;wqvM_Ž 5ѤMs$8(}[.ܵkت!E+I)ޣE0ejw^uɱFخ^xZthQ#Dgd, 0`@ X@"ˬy:sDS#.]lA2d2& ^ v?!ߩCNiъ…)1?ܺ)>"SyEdHc8@#!3ЇK+'w@Zl BSO<38M5BS-r}"Ham冀 p>'4=󈴎:#8HS0H%H z8d!49Г5%9ԉMSKH"He0А 4OD#u3ۨTO>PΔY46L.t*ʟxagzw˒"/so~f:T7v; c!r(`!įҤ`<WOX|c;c889c-:h+ΐb˂1>%/y>k˓;4%~@:|CB *Ѐ0Q <1>FG */~J;Žvģ8PFGta) Q8㻡~LY]Q JhGkBoLZ!GLܧŜ#g-GL<3XH9xG>>0z5[IIzH>>Fkt8#G9zأ w\+5<Β>JWcD#&jj>yCҫ^_rC*A 6E:9*Т@M RVXǚ`+:9F>mw @\l@}5ox,FS: oxq1("?It%0gD膕atjը  nXZ~ܠBgTEN;2g0@_BfVXoPFpW̫Gx2 {xH(9t\#mHF2 ߄287P@a'X0ra=݂Hjtrc$Fp GC41QQ}Ѕ8UNb݂{švJ B4` ȅ:v@C2ũZK̐46D MЀ6b0(B1 TGE.!jT@ޑ )8 @NpA,hkҏoHD~ TBHrazd Vki!D. D#ABO05sD^Hc84YáM70 a"D(v v.0(p a*HB@6\BI D@\@@  "ȅ. w*lu0I"RE1 t &a; Nx0"9E41Co Ȇ Fe+8C ADx"F5RģPL#aB DngH@bG 6\ ì62PS4Ag#b&wz'El(Yd <#C$b1&.L1 S*~)^$CB FTJM pW0oqnp  0q| 0 p 0 )ðb`%pf`K> H& 0 p `g @kvTP%ȔXK Vau!@P|< t"|d 3pRZ ˠQ/ 1:\NO .YeWv Ð3"A2yڠ. W՘ Sp &"".B?%x/ @?`rp \He0D%I*p )7r` p^T/i)SzG}C3 ` ` #KQEMy!I:I„5#/4-=T>M~C3@9`81HWR'!,T OMH>|Sŋ3bz֕+ܸoȩ{>0cj\vȁƳ4eɒ)c6ڴm'iы׎:sܮ]ӖY1`E(ULRM^?N:tҕVc| *F(eIҤX潔+=ޱ3Ǚ\F%GD6h )e2Ir}M5fpI!D2" L327ջșw84gpɿʐhJ 0? v\3Yx=S:8p3{".8rdH@Pp,0AS=8؞{r .xR!BF 8(*Ѐ @h<#5θ -#y $I'*@72@1.%UeTLBK-BHxAJ T:/Q>RNe .ޢʢٟ)RjC2.⦐>p<|K,J,o'Ox8>Wb);#8S3d)!iABȹwT$W? ZBاBS*4Bf*2B["MRZPP?)yY9s͹j&"~J6;۱ Í4TBH!n\ Ki#Ldo2:~zNWa& .!r 1QSXmS1=`ͅ?-0+9q50wkd5zsO=^S%:8_LÌ0""eXߛ(qDot\ow _3߈{;})F(0 };1F2ʊ>a -& p m,dgT4# yc>8VG;r͌o9:b1Trk,Cp ޔvAĎ[AбH~ A1 QW ζ-"c&bCDijwHb/-a$2}"d엙fBe5(ZD`G>XO0G&R@VI7ߌGbumb1sv05AXQs%_<1I('kdW aчfB4/óZNQZuDXp pQ6V8c-A6@;R` (sǛ#sT5:$qf" P-8~#t7mpyyDăOh2RaH;k\aF5 %1"a @#"bAِ{UsMC9J:܁^ `gS"f|d0J HaUCfPJ(]8 =qdXF3op@ޱPL"``X!aD|0,Ihf@-x! e8gQ}D#0 ;@=h/xdQW`F06[ٶE1l#@!_LB58D! _܂D"La\H/n 3"-lCpO5ʱvP+d؇UN*| fP#8nn1 R\kk$H!2Fq2/(F,.@@whhWL1ĐҔOĢLe2@ vC03 U\JN""AWٷ3q s1YG'0`CCTɅ04\ nû4!]0(J Zٵ ##sDǡ  H08;݅,6 fTzCaz͋dPy6y Pv l"'~ble;? e-V ],8ҁy#".fli! $U0`pn _ @ !!j #T$UKw L}Uub+!0Db  iA1  `|U Xceu!L=p,^0qP0 :vf RgB4 8#*X NJ *@)Y`` a_A8nx0qX^}yX"NdxZZA*qo0a~qjEs^ZSɔJ EJF]Hp Ő wz @ ! &6nw>EZt %PQ`V -&j _um߸ 7_!RpA l-wQZV[9BWxG !ZAO _~N|g%`*V+wG` . 7wU/Y p z%V+tP 3NF7$@` °PX U>e@Ua傎C- qN`7[[ȋT N-WYp {b8A>aUeyI LMrW@)ayE 0b-u"`)59!TO;y/'@?P2` 3R 3"'xrINuTl0 [1QCTFDP *PjB pBm/eKC96 Z&8SP p=H?S9_ >r pEJzYy4C9,!,T OMHǯ>ŋ/.ܧ=z͛nu˧_Ɨ03q^wرKW7n|rvm:yX\_zRCg:tݮ]FbŎ%S9y\2]kP!M)qR5gn\jxA+̗/`ńe˯u]=4WpפM6͙/]e $IBB>crH/č-hӘ˕k/[)jѥӕB g/Lͣmup媥iC EȹeNHsI℣5W .GK&ThH"v(aB@ t_A M#ӝ:0^ 8.Dx(R! n@ @@ps@ G-)70 4BK,B!E CYd#BΉ (`=U^ 8Zv{i-"p|`@AEd,0)Xd%h3402A HP5.$劝Y*M4xY -St A0 ,P!N?(v%:Zӥ&ʲC@.6j-5B yθ.XW"F & ,+n"*͠,˘+qY־[S~e5 L";$M)3=:@$[4kh հ]9\RVh0#cS{,~PG#ΣRQ(u#XaQ XGi i`4J )N-*1rhX%U'rJ*zT1G >C|)`!y&b:Aо{"E0šE\F0l^rl/C[(x31\#%Av Ob1Rża>pI'>5CCH0 lk[AjOtfCp` 0BJط.jٮ9q Pр5ڿ 9C{|1 @ `p` {0jP s y #GP~ !kp $^UT6P O NuR@}`` i @h5p f#rp fW` d'ae! ( ? v م_  i$6b'6[*a0#u@Eu^0g . ٠ `7H2wd̃\eG@ P1U~`!0 `%sQd`E-uMp eM3X!`hb ' 0y@xd3'[(p )PL3R8yP!xch_puy-V+B\PI3W{P! ǐ ``$g7L1ZuM0hH!j0 Pk0X%q yeӣ 0<u%)l We)fXE1CD9P p &/PY:!&T0 pL4Er @ MZ=YT9s >AI` Z!7ٙF 3"N A0 CDEC!0Gd NL0 HUJN ID50!@g G3}T|7ΐ.! `e Gz3TY }{@ 1ZRQd =O!,U NOH CJHbň×=z ćO߾~"Z\rbD~})/޻N^TƎ Ƀǎ];wԙ3n:uQU_J`6/LzҾcԩʙ -۵lܺ3n?aykۮK7nrU\jxC=-p]mZ5jЖF3g|Ø?չh|嫺cȖi[5+󰼨WՍK۴ʅKWrٟg [FVZre3C.䒋,L %\2-wRcT-w[sr bJ#"4" '2Έ8`a("9y͋BRF!X"TBI(\C$QF>Nz060 42eBV0qaJ5tVC'UM8 - !(HP6[%0! ?afyY6O;1 H)$B& PPKKԃ0 ">(b17O:H@{>#Ypdpi(CΙ7zm*'͜ʨJ! .1ȑ(E ,@TWp"ߔT`Ʀ-g SPD} `nRSw DF=&9OV38߼ 0yo/<=uQ33)TV,1r!i,0>{tJpP?@ ( $.tM9a 6 *bl p̘ ($ oI$Islz!,n~[Tgavx?F 9ыO" p|*>bт nя"x6h!'0p?`9$=` ih( G,Em5|qra0@ =w 4H|!hሹ.AAa<6|<b%p/QoX<{$c z$ ; D8FG( +A$"ToN'`Z [@G8 6  3GagBF0NA A pOh"HOJH]uL)ڑq56ۃ` 4'Nb4s8K>w=HXG6^ޡ xAr4nqT% y.p7s\eȳnH\}ِ ˓#(G<]7] ;[q @ɡ͍bhJwaG#;hx$>C \`CF<$ I'߱T&p6׹<]-D A(!p? pNp%}d0% s'`Rpnk2^yG,),r !A PrapW'z9]Emgp & C|/`'= L, pAq2`:^cxiH .p<1Q1p.) I, ~6g#kN`c@T2p_P H VU-[a0 p(?y$Kt89P0#e0 <-?c@] P@r1U&`H`?^| 1P՘O2vP_`  00igv eX[ 0:x׈f) 0!0pn{g"^&b'tTK;e' rnpe?Qc(" |ց g\"&ATr.%p gHZ0AYcYa #,r%  df4%$CU &qxI6@=R k0ؓ$Vzpp_AxZ\@ p n5P ,2r 0 @I^W+%pzM1&p P SEz|T 0 0s*p l -p p<Ƀ B : 3*@C ( J(0 Đ ԀQ!,U OOH)`B#JHQCiܸaŏ #^ȑ>}Ocȗ!G:o_7g>0>2j'O{ћZϞBa$窕(RѦSJUK'֬CƆEN`W;4O:6mwܵk.<|L h`=L^ayڱ[zVM>ϗsXٳcN]k֋Ӄ,y6ɢ$@pu t3^KNE8kuʑCǞݻzo'cB@?7eX;93N9昃;ģl\GeX]v53DxS`:&8 2h\;Lh@nŽY#p&N9*&(8| 7㐳<S?0! 8 D -Pr u1-6is|SY-H b`!Qc yG8q q` 0Ä.nQ Bh@8apD&XF6 ]bч.7 H>`&bKh6CFB 0 XAJ8$>!dBgE&ܨAAA ]`IcA19 \ndCJ. p"qT@ǝ6\Ȃr37Xc20na0`+`"=*ed%Ev.Ƅv0c DN` @-1~wF4 [TH(BA T٘d Z89>"x:AiHȅ5ނ;w^PTР8gةf8\ `-ΩG2ႱR/_$Ąa#|jF1aH[䢮ɐ7UCvȀ_T taB(,:R`=cfP2 i\:8V`3S!Yfשj#~ <ƀ1MnCրF3]qM蠇?*+|a9[ţ` =!'r`JJy"n4 qCH\aHG؀Gj&u6"sCFH6``QZ 1 GDq >ThɎp£D(q$E 1(@f>C`1i<#BB#/:Lff` C9O:FK0O;#`4f"9(2 aY}̷DI$w2 &lݘZ3H_e.k!Ox!D "p0LFCzN|~~ظ2 w=!D<S%@s=HF&CC(ŁqMc͖MO?s<R~:`73}1q #%>G :7^%U/F蝛7o(e2 AP9+k7ڹ ,$'JKq5 7WOz0EÀ @ P0c'Of|ms!Gaj@>v\"00 ?+Zaq|s@U&8p K_ǀS7r'X#L< k \aLaKcq 1g7HV'E@  . *RfPJBWHՒ#LSgF ]S  ڠ"!jaGr!1RgP qE z]`\(h'rxp4dF x { ߥ"'̶(! 08&0]KRS @ B÷pn YqpȨnK83 *b%Sxa:)4 8RŠ0fk%f\@  `U)CaSl  m#,-`6 %`_" %y?0 `3 -a!)ef!Tr.@H3` M_ `n) .PX7X,pU 2~2zDI&pAp c b&"m)KJ0#`&@X `= }Rѓ!Zp D|l  @ @,ls p P y ǀ ɰ Ӱ D8Gvw p P Pg!x<7)rw ;dtkdeclarative-5.7.12/docs/images/BusyIndicatorFlat.png000066400000000000000000000033431476226662700231120ustar00rootroot00000000000000PNG  IHDR22? pHYs+IDAThKo#:E$$(EEaŢ[H  PhCQ J8=lNhE#Yn3s3՞Ui= EdEh'@'oOZ,&,#4eV{Tps{>>OE<@JHB("V+}=9G@لeYp]_~p8<ឩ.OxV[g2 8EHxGnǏ<,3>X~{/xȶm<~j5Hݾ}hp]l s@iRuggdBйlq84aZiXX5.fibkk+zj z; `h*JGR,3h;e7z(̪#"=J 2x缓K}~w}@!B!B!B!B!B!B!B!B!B!BqR}].2SI\~,±l6X%iwu1̬{$r1dZb]l6ۀ/v)*6ƣJ|7(gFd>S1X|@dF+l2XѤdͪҨ T$sjHF@CQD2AKb-M,!(%=f!zB6Xj DKWsw˱d_h- rPS hCaPaoynT^8ҳ2/'Z{-lkG$y7Sޒ\Q+%7Ֆvk$klQI&6A ֬>o\y Ora:pqp%D J·J:ۣP:y?oi:e_΁O?@-}{#`b&U|yU/cjzrsĥ<{$<հ`]o) _Ivhoh$p*x d[  % G* &p L'4VAcwPvHkN)I< [-Ka MJV6㧃:jMNR|x0vuhS 2nN&tRWgNF_M9[*[H+l;`+ƹE Zxsdјd7yc*!X1ۂM.OkY ]) ^| ֵuV<-90&v/8P`31̀0q2-P.MSV4Ӄ5w2Kgx(}rؽX6SA^]ΜWy\ϕ6frN7^V~~z;.f~~B@ӧe2Եͽ|-4CLIN^nDaNR,s7_G:`m\[57Ex3a\|v V.)iǶ b$֕P` W~䅆m׃3;xENwG> {ϬAy՛ÖZ`^;2uJqT twÌaSOǒf?oz3Z~{ {*1"Opv9H 7L.&"5SIX;hl\RM^,IIGt9nm xJ1,v Q9`"BK|g ]0G$Q݊W^9!xqʆaP(G';絕g*ƞݍ%xZ֝ѝmf 9j7Zniwohڠ)6VG|LJC<7\j3?(=`L 9  v}8痐^97ڴg_=Ξu(W5չPᆂ^e5éA̹@ 9t|*ǺXjsmIe*KN=_-KީN] CcFhNj+cOZo_` ^,\ܱM=]W1}pUE4s@ c Q/crԒc:Ì{f:Ѿ0Մ H^x+v;~hoO*|vo|J`TO=0p$4JFAP[_Uk kp <;)ԑw@{`vhWy 8 Zyۡ0;z~CZkH fjs_9WνK09;&eMjGs:ﶥzN# 8 db>6S}S15~㒫Gf6e±3zE>ž yR쮙ܵxP4an7T|Q 3T EZF&c'24=y /c%`K]O:%$?\ 00h^'٨㧓.D =d!ۥ}+5_b+i=z/v$qO CI j1#W$Rl#'A _^q.{MtMl##_ERXvte^^\?~^q׵s6^Tw8A--- x0 ƟէN93}<.04yogXlN6[ڹƓtLJ~&ӎ`C#“)++{ŰȻmB7o q1luUVvlfhn8ik0|OJW"Uǯսxi 4lRE\&Vj{*mZ`ARvvU@Y |GHT@W"$|gW^~'m5>*R,u"QZZbˆp:yJ8k!d:ѧpVXزevq?8W\v`6%Nb^woGG^dzlܹs?%Xssޘ*$1qh`ϙ"&xKydb89 u>!1MX>j"rSt)I?jqdP?Z&FLVޛZ$.+*;?31xU7'DwK$ľ ;aA=. SG#D D+B!B!B!B!B!B!B!"1?bOH^IENDB`dtkdeclarative-5.7.12/docs/images/ButtonColorFamily.png000066400000000000000000000067171476226662700231500ustar00rootroot00000000000000PNG  IHDR13 pHYs+ IDATxix3]s(mÚ5  ċ#&DA" Y&AUU 41BIQDIa(I9GQT p'I()b((*sB "4ՑdŨ ˲$5ReRvli!Y5o0XQbAӈK(.]DUU~tS Ҫ!veTUջ9Qeaґ]L QhGJ?iZI}"n"g0f}S֎;}^rZ7> x#&K#ЙeUS^$u& X<}JO iY.׏/̈Z[vYzth |ţSZhևѪ/cTBNPo[3>Юm\ ꩒XsI=t?9_6{ m{u{'_"nlԱŵck__>}\4ZŹ˪B3#x Rػd/ly =7~%H\~s{5_۱:κCg3?~UMzlâ5N;W;f;{`a5˸S;>ry7gwSU6F#VT]z`dF ډV|p``cu VuE`r<]8Uc>|qмއ>5nYON|,KnE>{px᪯K:>ʁ/zSiw&rL[3wbp=nY7/UhgT8}9#oI9[sfrHnv‰O(;6+8zI6gm#[oNx=0S~qRٵeŜy%(}XkzV"Ԝ+(oxcro!Y_UBzw~n4O˧L70kT2WylO6---5ɆO=?#~ܮO^TުfbUUw'%]b+;/ '\Q~o0fzۑ_H}a=y~hw mqg{ NzvqGtcI{'S&B?^LByڇa\Dѳ(iJ鄢e  YkV<-99jˇYg̉PRW/?G]~dOHo?Xa2!#+OCڎVE/Sm{ݹCi~p;9[{xJGKff ;0WtdOxˎU󝺺wČ9//ǫn 0z INJ|3TdvnzRC{wIL5鵢o>zuHowh#κ#sMmz 6-|ʷ- ӇdYv\TUeɸ~3 jX\XUukeooMh Hgo7a_9︑匜6gJ\O qV+C4˪1VUL4IƠT (p+,hi ^]<"!pL~yLz-q?8qP Byl '${Q͆C[ܣKtLàx%9Ɍu!紗&f #UaWsPc#>m^z8 pHlivN1j\W3oM.E[ً00Ip,d{D6#At:dmE}W]6=^Kp;a2YB=X") jq e(G8SqgT4tyi%$$rx]}Q؋l;֌l69?Pmd]Ru.dɚ. 3F6)[bmc$'?Vb,$ČQSDJF%ؑ45M3CE@ЕoG#zYݎ)˭;Mgڌn"6е,bI` 21f/6yeEQZ)1HBB$z p<[V1k"$nj5cpczAyäx3H#&`R*"Ik9MEQTD@a  IQ_F4B!#A2 o 7Z݅7JRr1 Ae)(*ƃ1jZeeGSBIc6AYHCm! QEQ$]3(2ml by6p=V}. HܳZWV]{u=(((JHeL[3P&v ̲rEѶR[勫yMϔj.S)%w:J4,3Ye'x2b3._ V#yRb -9Wi%)}Z[ +d<p`.|8 ן8I뒥 &6Rd)YwS03FH\]fR8TolրYBra v崦-VF;k-f1Ȍp?9}k)?Q^bS E8|\}C\OIIhҊmG1HbgHn<)܌ ɬ#f)InY{oqvț1Gfo[FkW2~R~mUIƌ8QX#⼄PФx`R [l^1T܁/hW{WŸX̪1{"˜EPk.֓(U ,әdnAChCuF 揲Ri3&P-dJd9Tl J89;G`ޣ,I =,`GOg8K ;bƿ2FȎ[pD}6ID;V q (wB~WaVL'"e0hY7L-+ ́[\.u+5ZA 1-U.l a> y p֫Ÿ)*lyvHxy#AB?; !›_ Y( &-9@Xyp BXD pY3M- rHg6X10:)d$pU%qi;P9vj9˅tgp}/|#YSC)ؙ@r= K,*ˎC rq;g&!q,raa.K 0d|նi(& ڙscnHqdf*4-]\ )X;F_g+ad ]9|F!>  ƲAjU٬1!+4M:jmmfh[8l8߫MZkˉ#A)qP{-,ˢ$>k9@)\'weYj8f޼(׬\h$V~e\{/*M9@ۛe^KVEH@yKAIw/0N1蓴QYȲ4˚qR{ѻs9q|ZkJD;0jnڔıc:Ґ)FZ+9嶰rmn.MJ_,l~~yl*@YE1pfp'[ȍ 关8iqbP_.\roAJ_xedW/H.o鷑;u >6.rVܲŐ bٛҰ? v<b4?UpClN dǦ'ʆ OX\FQsi, crg[[U LD;m 2_2zNLųor:TVȹqL!\|0E$.|q8p+\q."p U; ژϭ_Mq"/_"/6̍-%1+!læZw|E"[+C_oyqV"/DpD#OoE}جi^_PtC"Cw"U1A9n6|;6^{d2awMzG_waTBm%T6$&횛=}oU`B<s@<6YOVA۲nlվ~I(u !pŶbڽӛY<8V|K4-)۳{ϼ+Q)kKOt+֎w}?\06F?_\ܿ1q?qiS4ӛ~|Gm+6Oə3w}lRG,:hH>~x gSuѥ?mj enreֻB3_I9ƚUaJ-{2"bBhSƍ۶oڕWqRysٰUOxm9g96K/uo]dѢG;,S|.o /W]|ҷ}4Q&.(h[:g =z׶~?3|ϲk9ׯ~h57?3{˖ty-|ox`;@+~y%׌m]_]vǶ9K w~{\+x^r޶W|K@a>5]ߺѝi-|90ɿ̱s@m~8 =doV7S<644S4߽aa]?<|}ϙ&KP[@Ge"2Q }d'uO;ϼ|~ ώuێ/^|Lp2j3/{`'@+t5xݧnwf%ygg6:on`U_տ 49OՠyOKx{ɮof,ȇvjx֢O3b `xdd[)4Υ;>K.s좠>E-}=|ʼyDX‹>c8o~wPJkys<6m{ld;0\\,ftvJkMYKmkn?9u1g,ܚmYqwuzU\5VLU+ z{ݕ멍n}fk 6O?ug4M5ݽT{oo{ws2ͅxҙ4633 al"DQe#sδ\xޒ,t\fM{goƛ>1@N n*jn] >N| KH M7ڧMkl}: Qo]M5DX[N9W`~2D7c֭`v "`A3M_|6 `ԩ 5cƲ~f֌/|:\?/Nsӏ(D~ JUbNŇ/O]W?Iڦq_;u#߾>oB2xeW\~F@눝vQ*G1n[B)š"mA?[F7+>hJo >O"N{'؍O{~ KBDyNt'q7TOooW׾z}8FIZvqכ#M?os޵7g-2_>ا8N3ș3q}}bG.D(A +"Xû)n_jCPwz5k6)JbUՒؗZ (X] I lyyOcLk=u`5 8>lpL)Z5Vj5fPQaƼWv$v,_ᡛSL0??kVdQ$4tWn z{?ti\8$"J4_X C՝.ib|Q>(-oGd_TNl[]+s>Z+F 6N.̞q5ò*?6̤EGCӇ;;%%Ǘ8 x.yYxv DGGvnKa2J+Z y_<ȃG>l?ŒCBcg gOiaBQ J8h*tb ,`g'lOܩ۵K)M1@k:uJRw`&`7I \BCn!⭴ebaXQXdfY<ϋ[sD-;Sy#Zky`A`RJy#m.>c]?~k7B.Ymq5z/ZWOGE0QZeyׯ]76 yr6YT|7anئ (2r{WkE(4EQdGE7W?j[D%B |D함H[AQ-Q^ܚt)rrq;^}`.]"GqSij8l%Ϛm"&XM?ZWeX.τ`k)qu;gP:$<%ΤZhJVkid㫢(Zὕ s6w`hoʔ9L9IWl$7ůp̉_)0oVS<YZz-d"U>Q"HA3P3PJRtN>&ß7%vʮA-w1\sQdʊ G ii~K 2/*PgxSYRg,o{U}x#r*ͬU\gI? :=T iq3'vR^ފu`WYH-mLVb]f/m"~fDJj/QLnK, Aa.E1bXl2Ml˔ɌyV w.*S(I*!l1?ƲdԕfvD g!ƾ߽%@ɍcrg 7 *el4Ɗ1KQTI6U*bŦ!gwo*u+_*p'g*k0l١ VɍsGJŅ, ;b=u[ H+0;K\Upb 31:j$TU9/ si>&s>le9X_F <1, {eXxř +%WVjӇ=^SɎj\ȥ2qќg]7q'bֆ )ј]Iֱ==>|/9vWή_F3ӯ{^]ݍE8pPn'W(56uWBrVm-xu:LbA#Էni,!1XY׾EZ:fjfsyc,I,ˁ@  /רv leiQظ\+i&!VД] @p1?**3(llDhL$Id.,,, H$z%IZ˾*TUUUP($Ił ۖRJ|"[,)"!K,>EZ$x!EheIZ+d)EQEQSJ}_1` ,B0 ]5Mx<$5T*511#TuB!d~e8A@%T*up8̶"Sd4)8G&)X8DmZ4 `420c|RJy25NӴb< $æVBHXDtzbb"BRA0 #&&&BV]RM7ƧYu#%X!!031 . Z#Xn#Bk c)B"*@Qf)UDBdYVEQQ_icED"x^8ETza$`0.050: AXHyv@-Xۮ$`YҢTUU4Qk ֊ (j*ԫPJST>:"X,|*Jq!*Q!y~!抵4Z`jo9=QEq+ň ^5!A4M[hE4)l6 A(0`6e!v,2&tL8+L] } ;cu!pq-X Kmt>Mqgt5Q^q c1kRShMԕ*Z-AVV5*,׎@ X7>HH'4W6[uQLʼ?ڌXkL 0 Iz'la=CljjJxY^]Q ,j`jeĢK׈:0FYz`hYY${O}))G4l\yk RD υ^p E-$7_}%_!׶Q҉gJk?#3wse`Ulr>_WPX<6 @5sCu@u?Մ!B%޾@^ǥsilMD/e UZ]LWfѦ̧X6%{K&Ny؀; N[8\NyP<$wG?z[cח~rc/LhJ3'uhό1Jwe]D=qG\twv1c{v^?y9)s!cC?~쥋jp>|M$ Gzșٲ~ qQ{[wlNx8 ܹeȎ_۷̋O=Dqz :+_kSZ.:w4̂ԕ5%v?6vAwP"pqmX{ -$x+uޜlIwY#tM.<ؙ%pӑ*Ңח[G03zn2QRxKR̝9 nj3m[`&/Lg&w\}Q'菻ꄴFazTDް*9n2Y"RdK;m _?ş]҅OϚl#>? yy;y#7kRJWN>qφ6Osd%Cz2gC_o O@!u&N\2Үn%Lďqa=\@Hk;qDv_9w?!b|ڑ=V/?.=5K7MP6u=nIagi7͏.Y(&3 E8ubxB 9%/%T j\VnS'ON,:w~,S'^4^-z{v3&Np@_͏ϖJl}'?A l~k %&>89yw(Onyо@Cwowٗysw%B{#`=}Ʀo|>##>1_##o46<͝>ƒ?vB_鋗~@Hn[;.fc.(s|oPay\xበ3: p$ x]>A@@B+{rD~·.]wP1ZNtv!8%nxݐ[uU&rr@{K?rA:! B{n-XNj@=1X=:zqAv/*Ϝ2ڇ xH@PL/K]̹п8xn29kņ(ucS.6-X>~1e@׫:1sl&rM":3gtG`O˕sE`Wy|ͮ_<^A.hjcgCۼwq׷?̹iu?91{C9)umzLNSrRa>ЎʾI5?gPT[+.e1B uCn@2' /޸אaGs t{/`2rrtw*p%95ep_v)yl*ydNgwO\R:bCN>&?}T@ogW[H%T.`+S~ɘ/lQ˥;4c0Q.&Ufv4g*lfV!`jddu3`%UȲao4fPC3I. NwpSFfݷОnj:1B.W+^ ÔC Qf+D#83S7Ə=OvM4sG(2UUn!($7Pm惚 ^X-63>vijru7팉FfE#ص{p p|]9D](1)]U++|#(1 n6@xFL4ͤlNN`kf.]{:WRtG @mK RctK3 )Eݏ??r-9!}߀L)]\<i\ u@#- -Hb r`x}s_zzr}b/<{ HnkIzcbv95ܳ*8\EkNE, pb48)صc_WcI5S 9˯z]nAϺzH . Kymh]A@sFΤ4BKO~{#C! Ћ##ǿTt~035a=^)j$v}wxfV#<9+ΡEыweB=ݩS<qc yt~zZTKbyhoˡ!. )&=rdt'EY@Ϲ&@CLO0˝;ѩyL᳗D-FQ^8sҟRD>}dF@Bnl-1v~`;b@P8;1SJ@%3IY97pgT@h1OaFjDF@hԭΎN5 T]W ֶo~KA~Pw}_|Ρ#2t_kgt͏|?>.y~>y'>gE ~]qnpb!m?Pwv>rkxqh[)һqzޭ~{Ql6}K_[Iδ?S4wݑr!.p^[-@9*ߡSNp1I薹v7Ι[.E e~?sg S vvaG_ s!ױI{0C]@*҅χ )1 S珅7rj.KѰ]'X*&TFBT Z>,rH#T$API]39a]34)|>Y*G;vYMWNDr&3ݡW\m?kMe5 XrA9ob%} ,>g&uzh~6St¦S%A$zS ^# ({ +LK|Q +%Ɇ,۔pZɐeJ ŚްТGﱑ5^MMMQM,"F`N%CU5‰)UĒ,pvCG UaTEd뛪!^n0 Yu3v c}$e /pHEKD@F۽ z^)}YYE6Y]i { kBˁl}75Ҹ B,Àk/B, Lj_* H"nTJc"\k?_¢r֔Kq.EaɅ}]nq4Ʊ|5cUŶ֘+ҽɰ5gLCe-P͛Fo`jXpYΣ5+DȞ|Нho%4-{Ҧi c0pd2a؟R QN 6:ekRQXF{:FC;Ecx=uawv˹$IuTyO*Mp[ Y!0fRD)D^՝fPJ%rlOsh,G0xgY ۑKV7uF$I1+ʲ-({AUUfIeUu2!R6:tTK8֦EȞ.{x) epZ؍.Wkqi2>7&+W(pFEP]aߓ/!D#t#*]vD;.q1$\.g-T ABD"Q*niliq`/P*^o(K#?,=rC`PJ y]TjmTbf,58.-(.+)"I0 ##AQ4=Tc}D&'')D:5Ń(RIQFZmhgR/i</Ji~ yhqH)y^uNK&i'5[|.կEQ||^QQls}>E+& B&&&EaXE _X,[n B`Ū%}xcϗTHJJ`y:h#EC^y+6KaN̹yZ* e]Y.Ғքa,f\.vͤ4MND>|<ϋuFP}>Z7Ų+(ahi<'XxGfa5+ +iP،3`y-c*L=ި*ŽF$IT-v}sH$Z|OhӀ1eYeoY*X*moY=#]^vJ[LFҫ>5O ZrǪqWZL;\ , n%hV BiU2^ kRК$k"Ũ@j}iwF4v얱V[{U}u$L ,X;ڵY3z`'J#,*휶&Y걯rZUKm\a_ɭ)+hˌDBlY4ZuQ{׍[Ǻ8V[ R]jhwWQk(WEhKXIImǔIAxp;;,,6jչhG]DUz-\Դ W&̮PV;ZhD_5viqW]ajzNUZfYa`ThYV/kql8&&IENDB`dtkdeclarative-5.7.12/docs/images/ButtonIndicatorForButton.png000066400000000000000000000074611476226662700245040ustar00rootroot00000000000000PNG  IHDR2$ pHYs+IDATx{TWǿ4мD|FEA+UU7Y53hL"o;8f01͙GIp!D D4AnQ]iP@4>馫֯キЄ?(b(QPop8j=_RR)SsO/ºyAD`1vcT!"xν,/SSSlܸ .aӽV,X@q\=SkSן8nvѣuHg}ErԲ,pƍ:"2eggOjPŬ҈ojeggO,rςܐ!Cf<{ RQqqq&A+N Yx!bD#E{ -*++ùs0i$w:8{&ZnG8(l6cƍfV^}'UQnh b36 `0w+R=UCE(Z#yo;[Os34I6X,vO6kek)|te^Ǜ;S߾߱ms;Yc7y}gQdnwEш/SNN 4%b3g~3<;)Xn ##-zVL 0RT9\brj,ۓz@J2!- z⁨x#uh~Ua41bkEl4mv%H!{#{adffcǎASdd$ƏOgΜaO<@^^v$I)66>"6O!$\P+\o  +1-|oc}Mkx'a3=1b rNXiTe 6ĺuT_j׹dhބ6,2愵^Ǘ`Y: [Y^tCWVV":l=e?~6mbz-[=Չ'k.&IƍGիlWpDn8pZ"TbwЫҿyD@C~|n% {),Bt=gL޽ WqhG%BY/"g~v\.lS5!bY/<*¯oz{#r`{W2,ELnFIou~ZZN:ŶoNmC1^C:))m޼t:áI3^z=EEE!//.] , z-m۶q ɹ.6$'Rѕ-u8/:01.ӷ;"#`gڂVxgz '*^=x`b ܹs۽{7أ> 6l`ׯ^z{-D=}tyXV$''l".|z?Kr}COpB5-[3^#6VI?}f R5LmfryL _p ;;[wƂgAYV`hhhLhh֬Y{"33=#x{e谇ڵkK/Dcǎm!TkjjuVVVV֡mɲ Np8qy1¾ MhΤXB,;v*Iw),8 *v\K`&msKqa)##HFI8,UbJaCCRRRرcCTTz=%%%JL0^ypv65B@-L\'z< %k}I3Z]`S`-HE uo/1]Q:(H&`-O _01+IB#kK៱.#)dpl3 V\d޽aðbŊf-W]Nu| >F dVž}_3bm ɁnAj9)w Y+kin|}~VɅi졑Կ(;@ 懠nad$D[)jQpAg y5TI@;&N~!x@DL9uy0E*w%UVQrr2UV(-:ʺBgY.ɓ',(..fӉSNSNr]F#F+bC j?^hmz1{T:H@`^K!dWsV~J:a%@i{x̸ft joT!4JjN?hէhi&+ :$蜜&y=UWWjn# "Qfٳgb%K>p5( t7W]^nm QxзLGXS2')ϠOiV~:PJqHe#.D^Y aY6DWW0iZ8I`{\!P86I$ <<=z l0(((`vZL}0ќҫsm%؄؝c1iLlHÊ߱1SWߤ>§8G9ԕ2s)bҴ4oyn\:??of4agd:.T^IP਱4sZEyr0}ʾ ;>"gBrG\]]^8Qq[XӯBQ͚?-a` ??P7[ӻ]Nx|&Rv~łfi͓4ʜ o]"p2k% i*`7i?m!͉^ݵ|n)ƽϿA;s ahN A "DQqy>1v;-ZԎd8&N#5d 'N@\)[] ֝ik$@,|KtsTnjwbu~yM@\;4-hZ 411107zhՊ* |K44 IR}pll,ƌCFBtttG.CAArssr3lGEw܀~Grwϲ,x߾}PZ13L4V޺E[| ێ+--͒$f[̒$JJJ^+,,L بڏ _A{YUU{ e1<^ZQCАytX`43ϧb`/_ytiEBqghhNOOߑrQe(Sp Zt)..)V;@#Ct v%vl63gN.\ي-OW|I ՚aGs!+:;Mf>ZT?jkYYI҃o XB>o%j;;T*U*Bh-vHOkfZP.̪?iM3кF5ڪC)Zmec5Cߟ&ZE ك*bBBeӥrgdR.IIENDB`dtkdeclarative-5.7.12/docs/images/ButtonIndicatorForToolButton.png000066400000000000000000000022551476226662700253360ustar00rootroot00000000000000PNG  IHDR<<:r pHYs+_IDAThk#e?InfAd % B^x<7=GO?\)JjIkRMDL;٤fwJc?ɴͺ$y}&o|dr4B!YQY$,^l^ {8g"h$y)˵ Q.ٳPUUh4bt:]>ہ@@Z[[d2; LOO2 Z]]E /.. 奥֡NRA"nnnTp2|mjjJYYYKG4af*i6R.nR<r~ d2\LJA'B\(z|IP0BHK#)" 哔CEQ $I |޴{߅;?}'^,h+nw?"AD@۶7 }|<>Z_߁rm ~~]`s}?\Yq[@Nlu>KOb=m}|OW~ Dw{LqC<]^=`{sa JXDT {|os<>۰?їϳw"c'`QO+Z{t#stJjoD\]nBzQ]:m` 1UD? gݠۢ#_me~}|qw\J?IDrJxs-pÒeY7~UUe˲L ^pznVHh4_WF4 \p6mbi.: b`6mKR{bb"811,F/б1yaaaZ>]^^rqz*2H$H$aJ~4m`aaa0 +NZ CZZvXVラTj$ˊuFHZ}Nu7ďxIs`h ڈ5Y8mQDhIENDB`dtkdeclarative-5.7.12/docs/images/CheckBoxCheckedHovered.png000066400000000000000000000012641476226662700237760ustar00rootroot00000000000000PNG  IHDR22? pHYs+fIDAThOHTQ8YdD`Ejb l‚PBwIZ -( 7Q p j#!5!8m1bti{s,˲,˲,oD3D\Ca5((̷n Ȼ;]7J@7+:@܌ۭ5Z5i7{ClAƇL܌8kYwZ8eAbK֧ |AbtQζߣ5ڀ&ڭ'9:1P$,\ O~_T70{iԊ/-/6rҜM]X:_PVl ZkLo>om`;ͻ/^#Al<}UXu2Ojhd6s٥@i%+>HR $3 |qaY7:wu37mtK[N%Jy*O7u]B%]"/,&js_i9êNY}3p9[R@i$SR盛5 T\Rz% _GWz~m~8|FV ӯ&OVYuz@lG,˲,˲,˲꿱ͿIENDB`dtkdeclarative-5.7.12/docs/images/CheckBoxCheckedNormal.png000066400000000000000000000012521476226662700236270ustar00rootroot00000000000000PNG  IHDR22? pHYs+\IDAThֿKQxk^ 1A !l %4-98R!QFRt9Q ~#->syy (((jʇ[Uݣ;5]vj2/DmbQ<KHdڅO?PaDPfK"2~ ݎfU;:I+ݼ у H]3ƹDXEج`#DA pAڨg|6ABu#eDwO@ ly."2mU:D K "\EYdUϨDˇ'\A_/-y[/5$v77({ƒ{nAe")@G8K ΔMa@5?]3AZU|.nt hX.nC>i)eyO-}־3VF$ Q?XEebv_$ů7MAl(((E?A*0IENDB`dtkdeclarative-5.7.12/docs/images/CheckBoxCheckedPressed.png000066400000000000000000000013271476226662700240070ustar00rootroot00000000000000PNG  IHDR22? pHYs+IDAThOKTQ;3:3ZQMDT‚V| EAwPDh p"EPD%O:qf=-442H]sϽ8887JHz|zen|X{T6]F}Lqy:97C""@^s620)rmcXɥ#ȶX{dW/LQ?P\SŇwӯl[kD$%&JUWc~d#g'鷓ojTST7ضV̼nɆu|/Lʯ/%**Bo^ ԋV’":xk<am9J1_e3t^ʑ:TBD,NSKD0P\v4Cc[4GNi9QRg١⿳6'ygX_3E:..m4g+;Қ-^@*:UAEK,n-YU(/}G7ADQh+Z#چ Vu ;4uÍ82 ("A2n+dB# A\2݇(`%s U#C;B[!S888[?$(HIENDB`dtkdeclarative-5.7.12/docs/images/CheckBoxPartiallyCheckedHovered.png000066400000000000000000000011011476226662700256460ustar00rootroot00000000000000PNG  IHDR22? pHYs+IDATh?kQqkPHc!UmF`!bDT06)l,`I!IDtwATwuv2o޵RD Zb{]X@!B!9lan# ,H協(6_kK+nE6' {a -ic@n{kҲ?ף3t#,`CGO|\g[fQ#i +7W{e|/`ZDs O2Sg@;<v鷥2l_-@]UovA㋌Xk6銈L;:`e4;\"ÊE(Duldqȣ;W?0nY(?>[kd|kmm?~f]S5!B!_qIENDB`dtkdeclarative-5.7.12/docs/images/CheckBoxPartiallyCheckedNormal.png000066400000000000000000000006741476226662700255200ustar00rootroot00000000000000PNG  IHDR22? pHYs+nIDATh=JQsg& XH$E\lA ]@@,!4 B`B"`2V),!?3\ qy1c19,A6n)6I)f 穏ٴ1jZjEx6EB!,bND ^¡V@cj&SDBzdsWqRm^#_PB!sڽmoP*i IQw? AQRՊw-3PX}U"r"GAzw6'V> H^bN |EaBz7W?D|10W+26Fj2HO)9o-'lh1c1Ƽ{~0IENDB`dtkdeclarative-5.7.12/docs/images/CheckBoxPartiallyCheckedPressed.png000066400000000000000000000011031476226662700256610ustar00rootroot00000000000000PNG  IHDR22? pHYs+IDAThjQƿBqM0E&1R]w#n]7,NE 7F;uرtp3s{0 0 0 jnqc׻$d!~$TK[HǍ߿l#Z#/ᗝqqg aaa=CIENDB`dtkdeclarative-5.7.12/docs/images/CheckBoxUnCheckedHovered.png000066400000000000000000000010141476226662700242720ustar00rootroot00000000000000PNG  IHDR22? pHYs+IDATh+qoӮZԖ%I9Jnܤ= 9qpp&'7\Dq`wǬ5{q฻Ss<}gc1c uýM̠ۙV+u?"59qqN94Z8{}!BR]D S%dAγSy"6nqdKսps!ThzTDH&V;NE+.;^sH8M(OWŗu F|L9dA1r <1MMH""؆2 >jH_@2 )ʘFB?RM' fcn_]մ8=r@Ru5-fSXmUbUQS멕-$sZ/FW?sup>NeTɷ'Y~i.c1czTcIENDB`dtkdeclarative-5.7.12/docs/images/CheckBoxUnCheckedNormal.png000066400000000000000000000005351476226662700241350ustar00rootroot00000000000000PNG  IHDR22? pHYs+IDATh1NQRhހHgibG0n %7Z(dK H3FWϾɗy """"""`61wgR 2;tZ]^_ zYN [D8k2C"]7f8~3X݉R>.VgO d(ȮI bKZ[E[㳬i{ĝIS,ndUڅ8ug_OMVghYxi_IENDB`dtkdeclarative-5.7.12/docs/images/CheckBoxUnCheckedPressed.png000066400000000000000000000010451476226662700243070ustar00rootroot00000000000000PNG  IHDR22? pHYs+IDATh1kaw\Hvvb#ITAƟ`c!B"u1\oc'؈M^WS,2̻~AAA;hSЄkj3ӣ_=u]|3+m^{^nFGGjyERYJgUB̊G {Cz8#70,HI ذV\ H)A(0u/}7#~#f$ Fg>\a0u\JAcB41$̖ЈUۆ׷y1%/yߊahxv!9`ft2䜧Ƞ]= 9W2_'c/}Gϋ| 6Ґs^=ܹ3sQq$-۽wwn޺-DҨُ/=K}m^.AAA,_}ZIENDB`dtkdeclarative-5.7.12/docs/images/CheckDelegate.png000066400000000000000000000274601476226662700222020ustar00rootroot00000000000000PNG  IHDR|lR pHYs+ IDATxy\TUϹ ( *idjnkiaV>Y=f)enib ""8 0cRHzKgs=$*7xmNヨ OETHK(` 0 /XX2B`[0Ysbw!`ii7a l78XXaG`Ɋ]a c; 00]}(4r?Q"p@Ĝ 2Ӓ7)k0̣[X6r(Q3+UPZn^8TiژtzqY(y .V)Q# ʧ^1*BtKI o_Q1kW~!B@̠0msǶ4Ȭ́ 22f-_ ┽)я֣ǵ}RBp ?zܤq} QjPLKD0Ig\?q.UA#er{Y?]h0h0T.Mx#Z\\=cL2vN.:-Wz_,TjJñLă{<׍^1SD!%M9t<0AUSkUv0̳q4չW0cEs.?vM ޾>'ia('gfE?vFMU_3BH}_ ?>Xa7n'liEt壙EӗDty6r W(8P'9CK SVD+#YFטڠ;5-p̋ߘ%$04آ]/BL&O&:udWKaEhp$1fhպhF`mebzKGfUW&@)$RWǣy Y6aR8HKK?Sk_h;k&8Usl }8UIoE=hƵ/?SҒ$+wa7s 86-:4.jX3B™jG^;p{ߨX}!޽xeq-?!@Zijn.R\UaTXR24((0;bG !YaނO"IoVGT HKk:fxۓkSgJ'&-~ϽvM^ݙXgH; nJT$Cݸ0 ,N/*DV6.վre2Hy}XxOcV;}7_/a]6jd"BkNy[9dJҦ1 mϮep2y4[[6NW0e'G4wMB㷥^Lp2{pTJQr."~3KХƒLo}cu0BH@p`3fBҒ;ngs=V< p@6&1v$;?ᒤ{!ZvCu*PyI8gPWԡTgeG:Ӧ.l<|փ{}3WShwGČ>0L7"<(23$Jq3< E%rRZQh`3;tmX%"-˽yc =QvsYY-\t℔⻓D|qjLK羅Sz8^"- &*n$(#ϝ*`gsm n=N*iOue)6aw0Ka7#zP(fR(‰&qw5hO[C/@wbf )`EPlo,Skxc棂*J~xJ}:0 0 0 0 0 0 0 0 0 S [TJd` < j$@KYxZbK`[0Ysbw!`ii7a vˀ63LlFvv`ealgwY1 c'Pn^Q"p@Ĝ l{Q?63+UPZn^8·mb"vX+F4("6z=ϛwyS G*Q:~>-rA O'eVE.plmY NNꢒݙUX^?%5iOfZ9 \&33R;.n˚6myԉ#KvCC]ƺ{z{{KzQWN& '\ߵw쬬,aGkq =8{Ս\'V=ExTW7%sL0Io"ۨy&UA#AqGc(x{{K'FEȕs 3I>1*f/AHƐ#mؖU09w#ZFX?kA7?qrz6uo_J(G2n\Z!4R i&I웋w_8'إj2ԩ %S|ǿT^ 3/@ \?>X%7KEc.6E3"kG/ӏ׼ӫ\*>2í \2J9''p:=X|ϲM?'gކ'8O cA^^Z2ɟo\Gߙ^އ_0A/3e3(xP~0ANz+򨇷F6]~ɟL qX| KyΘ{`ıhѡ]wTMT;hƪ՞vЌU;*u܁0msF{ +snQBբN#Wss jĒʕAA!89q$Mκ |NzW5@@>>>򠠐re(DZZӱ6ãݞ\>S:A5iqؘ @l4`uMZ?@FauKP "P?AYeszW!IvX+Fj5úm |r+Ywоv.xOҷV^&!V ][׾7tʻey'P6Y0l{v}X.Ss'qݲtRr);9⠹kB-bҀ޻RsmiEf6].5`~ܜ;(By6$<dq;;'L뱚DM3H6ɗG#qx- $ Qֲ/'seWKj߀ = :/kv>Rإj|-3-Ys7bܜ/%L T)WIrL闒ܜnfgňpZfZzR;B}ib* _>~\9+NeXg4?ѝy:Ȑ#@b./Kn_kѠ+c!*fjj?oZSЬY~;lkWG3 *­VǽJMد׭[5"|2l0\YxDZ/#1EqtzGԯ)ܑHܤ.N wk2 ߗ|:LqSMi-<"uogH\_p橪q…3B[w+$ӕ[6?{~;]]R~޽[~3!:Q]pf v㠹/ 6Og*<Yq'=36uaዷ;؞95B˾;* faD%Q\DyTNh-f(*)$ڈBCKߟءC?%u.n3/(y'nY?^6?)Uz絛*6=oIZ'ߝ$ZSg_=ox'},+,iYP5Uq>|$|w#AyT1 ; ms=uypRI{++M ۿ!_[ѳHB1FNd3t 7xӭ xUF{NzD%z} Xx6 _H/ j.L1lo{6 4*\1p@y޼ͻWF(J8P!W mi g: ,5-rAgoM_XurR|hά)I{2̡_2)quQtqu[ִi#Na]jjB6%u$('f[ҳ0zp2if>9'6ggee >Z$Qāv˨n҈=Im/땥 Կy(dI*~{wFU35b ;(D![>1*BtKI o_Q1kW~!B@̠0msǶ4Ȭ́ 22f-_ ┽)я֣ǵ}RBp ?zܤq} QjPLKD0Ig\?q.UA#er{Y?]h0h0T.Mx#Z\\=cL2vN.:-Wz_,TjJñLă{<׍^1SD!%M9t<0AUSkUh2̓6>A!Mu.U&|ќhB+I@( YQf4sR?;Vm4x؍ [ jZ.hf|%]k͡8J/2ԉgC**DRÔʈ>ocV566jM 07x$r {2 hKPt N](;RyZq*I̼Y*/s.9X8z~潘^}RnUjP98#xiĂe{mr=)=6D?ybTe$ҒO|<>ڄ?5j~)Ay_7jv[G=}5qKOԼd:{u]kXs%%Gv FjA3Vp8gG8fQ9܅)m7*V߻gw ^Y3uˏu(u>WU`'U T )NA#!humt[ᄁ8 +C!Қ IƬs]gS#Wwfo26[R! @hyP7n' **˟˄ M2K"\L6Rq^֥o#^X:px߼רsq? |rX2l!PںSޥ(V=P.k u^RoY0U8u(ՙ~~Y3O|.Ukiɢ(~)9d*`AJJpUd*Mt3;+Fs2Ӓ}ŕKoWYwXvYq*:c i4XDPGs(| ݶ~L]Mu3}^]; W4S[T8~ӚfBx7Ago\:z1P(TQned:Tj2~nݪߗe)`X]5Rl #z}9nj/r';}x}8=~MiC &uqbX[1~HОӹg7fR-nJmK?|#_8CwhE0OUX.ںc_ 'ܲ/ooߖB l<݂w䤦щp…3lmPͭxq\yR>C4MVܞx ?1ϴ _`wy9ZQ1 Ӎ'-Rr%*,3ϦrBk1CQIa$TF?XzoG/sqa4A;itro6HOz;\VAG1xKr728!e$h4_>R'y;c^a!WH優 ##+fw sa\h끧E.[#J@]YiM݇ ~͈F*0p"/'{ /cxnpynM68t#*A PꝘIIDATdz`B /Q(Tsd*H~{vle]RQiqV(Kγ%uZ0U$yqe]VXvv`ee^3eQ<Xf݉aG3߿khE3agA[U aK^J`Rey*7R0 0 0 0 0 0 0 0 0 BJ c kՑ @mNXEjܱaxX3NDK @V0V,=R@"`=,e揔V˞vC~? [alg'8Xg^n0L .+e"ealgwYaDW-vt nZ^SBLɹt:ܩD/0 8lydB;:|KKKu# e"az 4k:E0eiZ^Nv PՒG׫HiлKldsٰkW%RwiYɡO[ݾSW?Ѣ9v|!PEPhZKM|3vKPIӢ4 hoy?x=3Xͯ<{;`dö*(v*o?w盗.tχ yMJ%=q։,ČĖ>~ !ܛ[^WͯUk 9}BDwu{о]ߜJ<;六o~$AzgX?c- J-*ʽ{{ٟ?KLL#Ѡ(R5c;IK3']5q %I=ЗNnٶε˿.ܲiDzx(ZUkE8Qk::;o7}BA=rbƁlq-R(ޯRgqw+ P<)[j}U./^nS,>RB쯪ծaOQ*s+3ӮkIe/ԭ_ǥeg=$Kw\hגJSŹG,6@#/H$?w*55(fJPčAwi^Q 0It*Fa# xÞ;d5I#ߟ+sO$vy-]PQ,JI:7=vDuq!B^z(UW FֹǽG82OLQ8O@8ɝea{hHKk:~m̟ 8$c^tz-Nf4qGӖ. }MzD! @,~jPQlj+EqmzW{-sƑڷVJ{2,5*NaR].cjBwoF;uSZVf!UKRO/7ҲҴN{x4Zhwo[hR͇ YFQƽzT,̧7Ų&1y=m, ON|b̽-0~mߌOunJR|,(ߵFܘeRY`|.[՟+ 2ͨpcğ޹z57{WtA^n2,+3ʸz/'>"H7oU/yzRAYx{2)+3yoβ{U'p#cNUyj`2rn^N&/@CV˜5@QZcsrͩu Wށ>FgOb+/L&orAZ`6HK-ܽssj_'%N3M>uc׺Kw oAJu T(ȿ2=]׺ӧ~l6~MJ: iWvvUVve6d-/,L^x^YRP1O/f=ؠ8ov|δ#FOFk ۳ϝ9W@.W3xĢmmA;_OOj?;hڽ_Zئ]خ.3i:nM& WS.@ u-8yjHik&d,keNAmYMx?;;w(Qiy8u:g%R$jb!upD%IuĿrȹML7]߱}{81XClߐq܌m:HJUK8N+H<t_?\M֨NXn1=$2E=J(1n}dCh"h.FfFS?6 <%ș\mk+=i {"qW^gڜ:Mft4ھ-]/!19ɀ0)~^밷B[(Q`e۲2J 8Wʡ7_v ȿиY22./pRI}iɫ\⌇3+F޺[Y_ "/?xdέ eqbkgg!-fQq[ְ']\uS42d|DsC`|mN6M/Fr q U>(-d?ugƈ1 jr%8gE?j>̮.E`▭;F)VBC/Q+`dJisgcLx6(pʾ|d\'+ͼGu{P(L0QZnξc"y#-=`RԽg.:A+eƋz}iPPpcGGM\&od(4ػ;[+毦P(H4J?|~}vle]RG_=H.WJS^A^n2[R3?]Lbg^ 0pD0L.+#,;3 x<,Y+r5-f0t%dŮHk%j0T+G庰 ns,˕;Č Td! ϼvmfaaaaaaaaaJIENDB`dtkdeclarative-5.7.12/docs/images/ComboBoxAlert.png000066400000000000000000000136211476226662700222240ustar00rootroot00000000000000PNG  IHDRR pHYs+CIDATxy|Ɵsfޛ!BP@PRWT[Q*mնVZkJ]ު[UZTpZDPaQ֐5 ̜9c޹K,|&Y3wΜKB,,hGEnq`i|A`Uv!Yt+~+3]E"$8ْ~f1x<crdݎC!$.!-Zg75K!ZX[t朸 {-6>z,@ Mda~x ) Z1EwM@Qw4J|1ܢEgm8b@nvVqAeǗr:R*%I(p-,H%.+v,Y ϼr7'I1-B1~[ZhWj{'-jP?=/;+jnH=yO>>=gODB0q,cQYgc YQzay?M3Q=VYulY.'[/} /V_S[@.wA++QE7u;Rtt#nMW] k}ç\qw^An6$wq%=<|A)K=G*ޙg kgxgi&iQ[t}|В5n%kM?"L IڬiZM];3O->|@>OzM]iWm6o߸hX>ͷ[u+%fTq0^%)PxSkmVI|oL}uPB#/.ׅm=7G?[~&xiVʠOoU}{l}kۑj?9x`٣^_S?yյw͵歩\mG,iW|IPU0mjoOg>[>vBFL㺒Vql;oG똦Edmz<֊ g\ZjIvt̺ͥXƇ[+Kp<5+6(هPM)%bꇗ_XGwnYؚ.Z|d[Gvjm;ֻ铮qVjy?>[_`rcUa/ʘpL.[ޣkNZMhHؙLo46R~s )n$x?~?aeCK p{3N5[}k .s實 iu7RJwo8R^x@ ?>gD_^Eu.GkRLaД eso]d؅#=zB+fN TEu?VMm`˂g~Ι͞pi fI'&ֽPšځ>P}õ.=tyšZo02^[ v_?Tr)(vTnЉYu5*-Ggw əUD@5m<*+E^_VDw d41PnP^y#'}a`1#'f.wЏl]6g40`^V\:]yv-{"Eg3SX<[=:zӻ?\\{}O=_Ͽ4ɯ/(}卾oeU[w sUe9}G<8w՞:mɆ/|@f1M4E>g΃sg _8aqAރsg̙袇->iT{dSS9K16BR0<Ŧ-MIO 4Љ.o`VVC4QdǗ=u\iI[׳2隗ߐa9['ݲrE}{̾~b= ~kFĜ7%I=/{mgU[u J/=z~`CasocЌF-##?M-ډu.Ş鰏/֭RqE;Z{fUcKߗ {)ט¸_*b뇊hNdQLU ]ȜLoO@s3U%Dd(4o1Y#~olᐸqE;㛫bY9g}j^?^[9+ tح_IIuYQm3_A_Vu!quOo]=+qvEgD~<_AR'u}wTsX΢"ͷբH1]B ?u /|e,ћҎcp=M I~[~j*\%K$[B8#A3'>")c0"錷P N'oήqN3u<\_p vzdeAӌCU9$)+33Rs[eQMhι%4Evk 5/8/7JQ*IHuc+>G7. bn~cc,3@Ru#)RJ)A$A#n?@(RUfl6]֌1QnAZO E˺,ˁ@@P0KnI z|8]ܺc\.>4 }(J0EnId:ol!ϕ G'8{>r\nЄKⓊrk$'i,ҏgZEօ;htZr!F-L%IpX>#v> T9,vM˘AK -ۻuEQl-1b3 ݺ҉#J!zCR60Cw'L߹c닢g3"/E80wzgւ unx!u3 B26W1GcdVCOQW JzVU!I4m]ٽaP-55 %Y-s2*)I{| s9;9ױkh! yNG,)|S_s߯m]$D/Or3%UslmWOp`PڍK&lҎ9Wk/*oTQ{[!.|9fN%'hYIo cE}qp9ٱW)* f"D2-]bSz|{|ܧp' -zS$E^%Ł>r>*٥Ks9ÅSlv̧Ų`Z^!xSogwRPI91*3C9"GְzUn}FzD 8[{ ͛UZs"8[ U"?*[ gʴ\̿5ϓ2ʹk>G~/B&.{,|ZՈ.'[zT%gp?c53mH.dPbL挣%'dhs73 "2Xсx?(YOzPpmQֶbkc)}WK$N9AR-00t_N5Vc8͗4 pZS'\FɿpdH^N%4I.kjsm؍!㉍_6s`V/́ ;<7lv`E׻ϋ? '8߷EiSGb%FzYtrDz%cYcMi6p%{)(JϺFJ+P\ DB}ѿ&fr# IQEc]"!V,''G$wSW1. WrH0@ ###y_D/QDB((|>(rw$lRz G:B~_$c7Wxt]/viGQ}DUU,i?DSI+B!#fKQHZ=q8Pp8A" uT}KqHFQUU]d(ŸIWtnIsE.3Eillԇ3mAd|9XQRBEtFFAcUEKE=d7q8U$(Mi=1,҃H Dcn46 ygBS'Ÿ>3!i FGL=R]]:rO`OPEGq&H6z#gaNbiUn*ޝc*s,Ҁuݍ{*#nWRv`H-ݧŵ<o*)5bw ʍD+'p  `%R(0IkA~ĂDܔFu |~F )`alܔ9a#|qQ؜Ü8("WC`wUYaΑjo5\!({)d{(|s߆G>L ۮu*0EL11'7uO"&u[jq@eywo;Zq(,duVAZXB%dUo$+SZ!Ģ7fN׈ל}]F|$:gEM9¥s*F2{:usɔتVkyVDGSÇ:'=ɷ7T-^O*^rtoh`V"͔`ɫplmW^e+/,(VXPmCcPxֳ-bɰ|n#y\=ɷ7R|˺̃=}`AQ.=`wتZʏ* HE޷Wk'4Ʃ>Yg)^4&T$B^e陖@O"Qy#0JPT1Ѥ@U\WB#SS6BRz/*+J3,*!Tr{+`Xg/}X~,w|<0%Rjo8~5.!b~(V@nj$!JOV˺Pvuwܖ[\1gUͷh`]i^?KMFm鮭. Ȼ+{Z9&td0ĦM?Ŧn Ȝdun QvyJd]-ꁙ]wo{>i\_E[w ]We5 Mji߲da"jSO?FrDUn* ՝!Ϥ.6Uj39~~ he fFOX[yeK3ηmFXk䥥[rCr#\MƚG֘,+ ~gI;BsS@k6o,B~.I2]].}fQ9HIԗn!-*XKoT.O~ƥru ז.2$x8s|>> IξS>epynFh㴅ˑG>dnҪK*j'M8vh׆iSW^%A啽:)AXU/hWb_o S ._u6j>aFJa7N<LuRGC5tMϻs.NQ߸qk@ ,?\&lH{[hG`2>#YgQ3科KdMwǁȱ5kIͮ]-kS(^PBTPVPvA .]xAʼnr0*. :8 |4gZ]};Vr{ 9@Xw\#8.EV`N>unU|$y$ q˾ݗP!@, G Ѩ +ϭK뛥烓x;?:$f4R3s#A>W~H%u@(dAgKNR P*G)#RMr}(&Tى.#Ql%7%|_r/֦_s]_r/N7{ZI)\D9UZ?L3WeǝYiC;}϶) @yyA2|[ˎYSNRvS̅Bp%gLqy5o}Li[R*$s/|O3t\`V!mwp;bJ_r/H:,)} #*9w Šץ r&8 eP]ٚ]񠲛G:fgM!P=~!T N H(|]2Z:%':ﹲsmK ׎,4򮭬^sG>鱄0H @cD셾Ms;26!]ͻo8*CBHRHYO9Z|hce4d#TY4BH/_5^kv4xHAsw9me.ݝ6Uѓ}I dcۛ4:ÃpEuƬY3oS*wm{uk B>#f~=!"42S[FPkW;0!u J f c5z=7dA+,=0ۄ@W2 Vdr' LKI}Jt\A{hg1 !XҧDMJ2 ǎ琌Oa~")ba|zs{#Ì]@[sk aI6մlIENDB`dtkdeclarative-5.7.12/docs/images/ComboBoxNotEdit.png000066400000000000000000000062431476226662700225250ustar00rootroot00000000000000PNG  IHDR( pHYs+ UIDATxYP[Վl*cvD61^qmOK:y3yL;}t&}K2tZ'6q2خ7#n0bAD@#!=J_s%<l95Є6aN"b#Cuuuf{h4t :.u)' <OnWEEE5/i 1`xwx[,C&AD @Z03T-*ow h QѪx |?Z,c IRD# Vu:]-fk:"(z}Gb@ X;k4ݨG5 w$irNP !!B fQBCT^0+Psuq=^4CgO? 7+ ۶US ,Z%!x\QqIAgOC~cdf~E RqfJLO`yя2Dm pRx;]gh*TT~%s7DuSCޓX K 2,Nj7[IQ.$=N}vFF&cgW\P!gK=%7jE`+{2!NdoG6ڷsgO_jEmKC$ChjM-mK>lT^1z_{=hjib"&6j pH6y:{Ҋ8mEmN v}Ps:ٿ33R"uz"P5G\HjDzelVt~5 z^(c'u._km|rY6RL$"TQnye<=mNҦ!(F Wvm[y3LyCHg(ySlKޥtk$(Du-7^wh3c12:qHRP$Bբn7bbK9i[JyI8OTzloIyavM@`Tk 1Frh@cw:ox r n$@Q%cL~/y]JB'@W<*HB>{NT}u`>#-<3a2Rnieˤ(ou$BYi!O=8}8T5a`2`]SC穭c[xu%Kn>m/ )}ϙC=^Dž37G[6ޢnWՑ 5g4aُTGSR˚[=EeA{wٯf҆Dػ}T(*cEmЖ'?!Ϗ~/5S5@02(+-dK:T5: I#(@@ऄS1 F*pک]GD 8B3Wg%N8zx4 A X]^pNfsP>[o8q7/H*@ X;"YUYYw} `II A݌L'O|fl6 z^M X%|>}{jjnvF6%BF ƠGp; o #8l#*:os0W葢xr{FIENDB`dtkdeclarative-5.7.12/docs/images/ComboBoxPopup.png000066400000000000000000000214741476226662700222650ustar00rootroot00000000000000PNG  IHDRb pHYs+ IDATxwEUff#.$QH4q==0ܝ8ԓE "g@|(aY’03~TOOO lo?SUO 9b!jFBr%B*.-x_SU*(.T8urB"=PcW%j'7SW: ZeYmیJKuH$H4ϩĽRJEQUUU@ J\rp(2 Cu%,Ƙ͸mیq p^=Ere''1[I|@ã#{,9Dc UU\) [efzz{UWEux||˲**Bt]#2g7UJ'\p+k TGpD (c˅/mY5gB)u1V^^@9Ç]ZZ9|Ńcn?$($~vtĒTzēiZX ÄLBx8ÚUFƘiڶ̈́?۩1^$y~0M=M|> ιiBS!k0G/`IIKKS^{5Su"ɑsT?ԧP!hwa Sp̶ Oh4mJV.ORGΉӖOɑQ[qfBϧSpӪcR#/Mx ௝HB5/y$sH [t]#6VŲ,Aub3-* ^B#q7$QoZge `eMen&C 3cZ?@u-fmUѠ R VFz/#}9c{R8IhIKm軗Dl%J@8'@$F)Ba E9t]FTxel[֚E09lRBj+'pgi,fWt$ ! SD5M,4MNӏ:c,{űv> .įU]R$ƒ;vTRyr,{e[̶8cLVܩRE4Qڵb0ȸJ{PU}隦SE%B%ҖKjTʨN6k*u:ٺBW$Դ W⊢8~9cP!&8%(Z ~*ꚔqΡBE+k҄%RRE4s(jLlH|&f>EөRh@"9F"*TQMWtߚM`d` ,JBwucTEpq`$d UVֺH$At.BW5աE F, (3W 9,FL!l/ oB$#GH KA ӆ͜@tЂ'DNcu6Dӏ`1mQfp"pI]!zSBhYlb0bsb1yjJwGڀ,EB@%uEH؆ɜhkjC+ 1FȊ4Ri%u #l“BrV7y!ZLFLi0BֱzIaða1–c}Ɖq0a1\I pʴHgCWУX }_Q amM&r pQ)Yz,Ű9)l<^SFXUqJ8Ár¡#z% AtbrmW9O"akTHǔ)˴H+CvxbXglFI㕡<;Ev&^ (EVYͲEW,NwzkK3Z>Z`$R ^`:Xx`)JB S-p[1^mW)c `P?L O$'LH8Md th{솛OxXa]0#~ރ--,K7=ú&?Xsp(3R5ۇ1wnoXO^5{0wrUr!4vs⭟6Ax`qgƜ ;}Pr0}(óС+0 gbv)lsۣK ~ 0B XR`exȏĞ~w![;U|ڇ*pL%띪3Ǐ/ _a 46Tq2qRfbiw28ǻסY^ $Vؼ~+p1s4чgmH/ǵ 8v F[|7Os.hX6 AScXӽ ha{+9VTcj7=+MLX<'e*=FS?lnr, 6g)M8N}cH 31&<Hwv8-~y*$M{ t8й^^Ŧ: +|Ȣgea).9H ]$ǒ8GtŰq"| O`K6WWq Yx#`1l@!9^ 7V,=غ3a!\t|}3noqPVՕtL^`!/`U_0H[1a-d~╴c˩;b9ƭ1*cA[ zVX8sX~79O5BWA}cրyYUxƙUsj5YCO,^@v5Hqst]?}Gte^X\Qh@&Mx2t_uOC-`䥸 0A(gJ[6+A^Mq)U%uIm轥zny C ׼,م*2X =[|r;lF ?GF>>躃.x'}1_]M=x] Ia=>nG[`7NMqNp)^Z`2 ;%@5bBN۷$efda,A _zZOW4T:PZۆ{ϚV~+E0m0Rh@8M) TYh%]aP 0@W`ٰSO`N?*v! ( [6'8cir^עElkܯ§8P((N!.UR,nV'uE ޿i0wmD {G9Kbb Eò qMɫ*+3ƹ9̙Q᤟qV-;$j;2 l6y$߄ *@#7" 'BW,ӶLf[G!V"1b 'mٖ,SW:$U$֊rĔA^߶ ۦl1$c]97 ۖ4e ?N}zDrnwmŇ-*o9 rcd΄ĭp2C2/E @9!1UJNHERl}c)8m P Tr`\$طL[f6CmzT %y!ZI\sJP(kk?kÇʃ6mr"3;K N2m˰-#;7fB ;.D,x\⻩weygxǔ%d]C/<看ݫ?FATHߟrɼ\֣ƧtRcQ'f {.k¸aM{Q/pizȸa9>9|?%`'x"'''iIuɼum4r!{|/4ϛ{{;e}1>ۇ\sof/Ӟ >\~9k>C;.9#O8q^{m~~ɓ_~d%K7nd-=Wlg87~gdiΞS7Gfioު) Ҍ[GgM`G*wھ}1>K^d?l[8 >՟!f/x}~S7* @W3K>͝Eopɤ+BR5vFJ(/QTU9֬}B1N'u6'eGWd٘ژ8qxVýR<ڢ`nƛbvxڭ6$=RҸX%AOEr"U.iHK?Lq I$ 8%K[.iHK?RƏT#U.iHK?RƏT#U.iHK?RƏTS_}xd*$S_T>z/»%//oŊR蒣|ԨQm۶uWWXy`0X!?bM1m}V+.89Sz :3==}3g<5kիNR[FCy ſlr7Ǘ,3:0V瘦Y^^^XVZ5s̊ }q-lF=羙^%(SC@%۶K.F >|xѯʬYf͚_2dر .4hИ1c*;\7 u^Iƻr#-]7KG>κc5.:n}ye5}y<` -s_z_%?~BM;[Ϟs6/y斂yTshH^U:w!7Cb۶mg̘1qŋ8pD]|>kHT@ٷO 7niЇex3+>־Wm]Q?`%-_2AOj;jŸzKFLh dݗ 'a\roŻVo"uw{㔖~9 ]gpKڵko>Ӌ/2dLӧ(\ց{g'$~j^]'Q`y9/~wn&=is{,WySs׾)Cr :30xI\p chKK򵥣$dHw=݁ٓ4qJQBছnVj_tUo}m0۸e@vN*+Dك[Tש}{m9 1d]Uܴv镼v0yX:A:8pĈOKKW'{ b׷/}Y/󏾶v\=15mf \穏A *z\ٱ$ЬU|U [jҲdޔ7o|ȑBaض ҪUog{GO][hmس?yN#?M֧]79Uj??.غUۮC'~aޏ|ߎ;iu9/l6& pw6X|mZ|j`̝s( +ޮӹw>*I-@vQ'9om޳gexYYX{v.SrZn>vyq`z_ iӶơ]EV"'afذ4tEcYm13dOuNflٺOB@ P-I`f0$Dd.#J)c*;H$DJI$ 81G{k .J"Mc{kIKsWB]m[ ]۶퍩8 r)tIFhmgR*͹#$.Bb !$/'!렒 c0 W1r"rI1fYp-GDp8,͹!9w C4bIDAT~J%1~0 4% ƘiL᜻EQBci HeB!EQ *h)`PXtH-B⢟6ΐBToUTsRPȶm'ݽH$Iiqȉoa-2M*;KuRPIh=ꗻp͹[ 躮jS7*9ap}f,1\wRC.U+tЈ`1iкtc$ } Uv;g*I0q]h]@m[ Ivvy5$*)^)zJJ\8ܕu*ޫnDR#ZU^e=\e\r2I^ŋ3>qrG߉4䒣*HT"@Hq㋪Ty'؟T%DM{+1ލQ%iIk҅TBO8['߸Rޣ%GFf)*_.%M3Rߒ$k^##-G$Ww JO*9qZrjzsZZtSNz׫t/%1i%GJ-:ox=w=d!ĚD5ʨh9cG߈IOL$˜7!:cXIENDB`dtkdeclarative-5.7.12/docs/images/DS0.png000066400000000000000000001132261476226662700201140ustar00rootroot00000000000000PNG  IHDR)36~ pHYs+ IDATx^} U^g2}O;=("sCA'\'χ" 懲 {L2[O/Uݓ魺\~IWݺW{*%IA@A@A@A ?I.A@j R|wPa\wj뫢D[o~{ǎ.x]7:W^>ȵ B.u,ׅ^;vW"/nm47cW^9;C~ջ zA@*@;-q7oeﹱ+;o1}ʼ NJY%"Z,5~ଳ~g߆s7\:'}fgk CC@˲I#4i>9*y]-[5 i2QM`r~ʝ߾OcE`g=I&!vKA6&'?$%iBܶ52|; w{Tڑ>Ʌ3UKt4nt(ą%dXWrxU傤 usol#IH ՁnB #rINHLB|&I 7M6 #Х{?gtF{+u'XExBnSu:\m %dYVz)$%tBR\:&+&*y W)@/rd9ij2L3n?ho/$*]@;M{ 7׿1M\JuQ; KgtM}rIK}")tnfHֺeb̩s q-\`J1 dJFg]^HN> 7 ׵\lj**`;~$vDl~8vfV#2 %)>Oz=rК'{M6M[*UdΥ'ãAֺC CjPo>u.۱r:3z3|  PF ?zEYJNWYV4F pXi XSlpSd%v}R$^N>[1Q>,V>s`Žᨸm~ae'FT٪ ҦlAHU@JQF@N;V=Ӫ+E\4 iyTG[[HJFzܶ":2|foiH*o[.sMÌ9ֹp:L فub뜐/<]A@靀/bq$kc.l[g:>Ll+nږ& - #c( |3+"QzM']c7&08ZF[3 =k xAfMe@Ma~8>eaږk_KI# a.d+B-pl%ی&d&L+ {K"3B*%?m=38\Q̾ 6L6,|q9xiF:3GYTI'5WX,}lĉUN\!AR`{M`Bw# IJfuk/5IljݹSٶK;)߃rX0mAD~&up>c`uqlp0@;w|1Ƕ1H _9C@DSc} m2hA@#ڴJr'iA!A5_L(+|вwk95YF!1e*+3A?+cҌ)?qOz`aWT +N(MvcZ1tA&00!;ET#;0c$iկLV,_ha8qhYٸaC6lټYKA XL/|Y=pMRvڥIJ˻jRC%MIPy},ZpEs>GA}QV<;CK:iEu+]|w,3jQbʵMPh+TD:7vDmQHJY"^ NAO7AI$B+ &M"D~8tb⻇)$64p[?`m/X .t9k,ӗ ՀNp2\aȉv5ީ'֕]hIE+I S{{{!ZM1DrBKKnsK2u.ZMPhA!A'pB̐c!L96~L)Zt,E'(s һ[u9>:Ls5T#I:'$-e @1HCYhrohA1, 4b*Hwf0N4XG<aǘq55POhgc9P~NHX+b-Yaà/-$(p,Cʰ}mEk04]4kV ANVǴO|Q2D8N8D{űO:iwv/9˵ I[5]C&+BR2( x+ L \bEEinˌFL _K̘,MKJ2 YFx?"iLC) .ÙT&`E`M pp𛍈\phMAKk:9wv퀥cg8jIrf͞f j-/tO:oluIs=65$0^c XݫJ~2ajt4|:&ʭ@s (#GySZg^\hśBOεi%%/륰:iWo T1aCvg8DR2Yv) J:ɀ4ԹxJ7IYߙlxo<_X7 .Pa>gXC_? \f\F߇lR $}QCcj\b0X *pX`%A&5C~'ZEQtIj} &LDX3b, {ml:tA|-71u!\'G$}PJ 盘/o)=B3avDAauK LAv\ E| JA`h5jN|>qp   jrcgk}E`a1~a)<9 2 HĄ^Fz(+z0b}8&)2걙B9YgW)Ӕ5br?x>ARA*~S:sȽRt9%v,o>eGHJ_qA@F[$q X R<Ƥ? .*ƋK>̦ccn 3&+FI/]o<Dä5a/}-e[c+#cx[c U0gs, J 7RHb*02qJex7cJL1衢d;:6IAKUdsؙ?[&][ٵ[`3GMU``g&g k mX&E3] b,$ewI @Eba>qH~y00UΗS`*7۹{7~wlPXUGi{G$rf\X3*{"؞I*Q{ +\ssk8XO^,]HWVGWLo\_*9ńɮ5f~CVYSEmdVT\pZ }]i_D0c Rhrk,O,uquR,$A@zh`Tȭrt^Qή ۔ + MWĹ0YfOlTSf'CB2G#V,ḇ5)* BWBir_:O\ӜO?MIsUl# ۡ+~8`"XC?i:GRbo{Mg7QN; )_qU,}q!)CEN"d" EX23@0R;xT@B̑Iӻ"+\I{O/)&Zb8hTn" 0)0mI]+f0`!DnoQ{{؁ g [Oll\;Lnf C_l[@ءkTNqࡤ8$ tƹ+P>7J.UL Ax@&pAؔ$EdfItR% %@mB>KcE0/ K3_؈ܸ.d>#OS6uODkI`ItlL+Ja$ngb?MF$7ҪIF]ܪa|\C'8`jk-xmJ]͙f,ett$.n;[ỜV\A;0 *$&IATZvҴ6ckz:Y}( 0y $ zZ:70$e"EKU&խ?\tLUKNA@D@s ,SFﰚFY/u 7}l AG!.|4 q= E&n+I&aVx3SjԚ&ҧ`yф'QJao|4b 7|)w`<ߚp6ˉuƔ ģQ`ߵmG|ӻVs{Q@ ky//Ǹ 0Թö@n>tbpe'@ ZM7y1 6&m(sU֘ {=hC gvR"nO؉RDmg4Q !+C :akG]!b73ǍCb6b*.QvV ax/“JO 3R/E ^1ቃ nX[C$FGM+ʥm|mY=q#~i#M+xw⟼9 `&A%XˮXv"s 9Cq9~3SAn}XRD!>Q1@ # |cG|6_6l4ٿӐL]dA@yu`9c 0DᶣFB,&nopH.;FLcA$&ZB]RsQ}sM[E}X?15(.xPuluZ]g?K~,("22U&*4)S炁&Ru!GN0ы0apv{V;hxtb;؉]{F'lL<|P1'HqPюsCnXR \(DmDQ94n%`.!aA /KՉZ'^WñC,g;KY,(,[”Ԯ>D㉸+bFJٮ!q\/5E)_3+;8KLܢyy8. amP@|f#3 äJ  z\S=@HW4A!}"+ZH qpDNʼn vDzAe} %q֓#>q FĊ(o@Ѡ9oJZ^:5P5;R8j3,]VmYrp} Kԭ܂^섷vFW:ccGm_"v8s|N5({}>A@ zY(7,;!LZ/XQ%J+/\_Z15]F gC0M2y&#Ma 2W?0h6b:)?PbH°"BX-%vHؾB9[sP乮++}r\p$3AsXc/c9  ! 2@'o}1؎vnv]ńW$$m<-(9laٰA︢:'qR<A@l[ZF 8X/ތZ(7eL k+F[p,CLˢ\,`v@ǥ 7e1  pքc1܅MC%AItX{p$AZѶ¢}ˊ"mMrrQ:gF"a$+nbT8A½2(Nnen K[A0U\pN (]Xe8b OnBBX<(Uȅ PwU:>j p/Gq5-HVLAЖ <7E8VY!=_/$|`Y7Y *\bmqc+*n܎5X~ݻ1؍6}QVz!oJV5[^:ľ L+Sݩ:[T::Ն#K@AZbi%EPq%obII?W_vFjdkp C|UT0$,J"ZP]1 !X$]+?X+ ô[6+0՚ 3N &hOt  |8ˋUoKl ӣYD&AIcX@h5%Sdfs>1U#v%B* *cDY ð@Իu:b [l#e>ۦOW,;"(9t@C_p R C@GŴ=EOG" }>3|q3 wM[ۘ ^6EJ< IDAT]uewM^$VjB0ne0p>ģsÉ% ڂͦPHP ]iΞ1O|bMas{pj,S[|/}53Rwa Ĕ9*D +yʠsy TR&@6b T$bC4VD-~8`D Ķ@L̠/1@X"$1ѿ+0DM |'ra^A:|(4 vQ;h@Ob+MRhEY5y}A-C ×Qߨ7]q*K*PBY% ir~4v Q$eD-3lp0aoߌ|07ip9^ac!NDŽ3g$3 duJ .J[4՟ xcd'nQwK _@;C '5sCӵ-[( IK P=>,ifH34rAFZUHVa5!m:M13:|'ɉJn>!&XrWYWQ 8w&9I[O⍑-:& J蒤0A ET&m5roT2:IꂮU1?O2s{[A19,u@/B?0[4a!^fS]v;N|L#7c{8b'INQGKr¨YUFP!pjH 2;R :&&Թ:穇4T(C[˩ _(#MZ2{`;֤IImY:inlޔM)zICA~jH[W\#u$$4)pY."M{U\_{ă).@'\% IIM)Ĥ7g5sVVYy=@)ێCpKQRŲS5J`~% >@hدX\d} trc~¶UZYre\8K|ɟ\mX%> }1uYY ^ s  ;o\DKgR kKDsBBV ԗ|wOb^P|#maw_&W sy*y ~>)1EEò~\Bk&C xyq?ϙP%0m6I{< ~䇗8s .WOǾʳ]ς񒌂  PNmK*@(*zzV(~.P{)YTYQIA@|~jNaza:G=ڱcG;6@3͟9{* X4پ]όn\,^B`W@@=S*Çp}v96/5Y"i3fs(x{{jޏ0(eW!)D_"0vXwzO Keyzսbr8jllT1=sNqIW߲yhӧ+>#|7DdC͘5K5Jkr?29Uv hmmUsK7NY=MS!]xIŏiI'Æaqy/a}С*K(E{et)Z`_HMeƍ7Py&>1%J}'YdTgC,)DSWraIIɷգ?lۺU5z?qzGqO0"gNFH**QE-N ~XO[wWu ?T&>LI=}Y֬^=peij!$m PtE"1f5w:|bu"6vJ4] BkD q.?mY%47IɆO~{4 )ՐG.ՖΎnl9D?/rgOqV!%@q GO9ӵ 2_ćyZrzOc1%8-R!@ zMMKa t(ϕha!Q!g"94Nx6'%.oA@Z8z;8C "g&9%)l2B8fÚix} 0a$mKfM髲 ӝDB;ȦSdn9 Wij!C/j:qڇD©3# _qM:-~'x:vMo 9ˡA""}jR{P Ù>Xg>=ڴav=ΔU}%\-c XD^0J&ˍ0+ዞ&\錳ϖrP=z+u .zO ˕<to 7R > bInyA@*b|t ($AZ/|jwWV uyflOJ(A@AI- PLG/KD@HʀIA@(nmXeI/:,y R,} $%o$ dtݧ"y򹅩gAHJ>`IA@(s9v RGljw{(B^Y^I Egu㺧!ɭZ -6+ 〳:kUmtIz,NgAG M_R:;e2eI#mACfd9+$2K >f\GSO&q7P.Kp>&\dfh\'yVJc eE-_p FN(k+2A ?~;H=*% @%x* AU%)u y Ќ<ˑʣ\" PA蛒Q|)ލOĝe`qA@( Q ^¼~(M ?]湻KS* P @ߋRTZe I)pڧ?]V{j)UAGm^/RT\e I))~R @d]yR7R>En\ɵYjDA@R#o٫#LU*,K*BRefIԏ&]$ޟ-MR @9HKS<>*B$(fqx <'BX?ohA0*3:Oc9)S@)er>Hd8OR4DA@(/GoQȳqH<,@^,@ _w˼JL U@)#cgjFbci @6_bSVy&{Mda`=Xi `kZ${tt=ilCA@!Vȩ_Rw9eL?A@G`/*7@\ROZOB;A@ CmțA'BRrM8|"'1 EBA-RYT"t%D`}D+A@*XU**IA@F!}V:8cpSK^8HA@<\ip?N{H/FwBI g<I@8[:&9yB"IA@$\W>֕Qg2`VtA@A` I!B25CM.ADCZ_Ru#@lCVݨL녤TwUȋNɻ?y˩{f3U  Qй;Z۝)g*카I @!pz Yv ] %  5{'A@A TY{ETR  cÅ 5B4ZvφpN *4]A@(*ǢuTqRh⪫ |i  PJQo!68-U+Ia`6޹ "Bզu^A@"PU+Ia%lT\dB#:|L+ 0 |/(Z$   s9d=A\W^䳐vHR  PKGgpеv+Nhᗑ~ xFIA@Z΅0xO?e˖=:::FG1xo793QߥC.*D!SBA·RZ6mڴ?j;P Of.˹dx,+c55A@<|=}OL8.sHR~vڱut_Ap&BZɘ~a}0$A@#@[<A@#@WA^#[:JY}H1T0 J֘o4-h-yzѰR򊤂 vN8~ZzJYJv4jWkؓ-}Qs%}RDHLS8ϝ;Z]`n>\ &;J>岏~BP< 5Tx3GKۿ$,KQ]-ĎU撤=8yn$(K *:j)tea%pe+*|C|914<TH8΅hqR83R ʏ'#GW4di/*eꕂ˃TgִtSq풡^_Zm&牀3dE#){DkZ|)dFz֠"){9<0ܒK{v ߀ǻ;; 5a+%A@<Iʳ˗/^h+C**۩ )`"IA@<@Ѧ{<7i  T1BRIksx:7qnY;itZo}В_{5Ҋ"RtMU%n(7ک܎~D%6_ &zPuwҔ P7#4L,} Vcr>5y9(T+|'`Yw7(7֩1TOO^5e<.xZ%6.q56d`BZR,Zӵ_k4c.Rw۟_{\E~ Sy)yuO<#\BbbMK[HO^Hy@U##u=`N ,8Y5uݹ2'?X$nHRzRC3f#Fפ$%DvxNR}W} G{Tkٔ*kT,kxMsssQ[(@'{~`I9$trZwyt]iN&|=@>( IpxTٛW¼}wD5z:pݲY"Gى~'}j}wv6"ʝMW0c6Z6:﴿b/K]m9˭+ =RЏJo-RpJT=?q9}C <_N**A. W?Wɂ= ~[{a F SJo@=sJՇt O{qyK2UIIS_]~5_0?QιZ#^WFY+_H ޫ?+Tſ+#n ͆s2 IDATD 0 A}zv@ $5~;Ӷ](Pc.Tm7~!!kxb+gV _6A(ƑSұ&fXC*W^'Q&BいXUM}T~p3, y|=ʔEG\ i-z%(_h$y3ʼnI^|麗t)_>)|;c?K8 . iEM;߿qzꊤ&|a9L\uTݬ"IJLcYoSC{c|ioAN c?tGULX[ehh>zLc~ąmo<발,ʁe)!i?_ *'ƳANd{?:Jh]0W-yHsj3Nkw[?$$y r?}{7m!Sû=H7#|gULG×Ԯ_3Jr!@ٵ%S?w~٧w>#'3O‹W ~]ԛ?z*S]gWH:$ |^'Yn0Ciz +ܾ.C0}PQ&ӌiņd@;i#g&a-H6X Qd\l Q%c\in EQ@&[.(QL\f_2nSrM[| }FMd#ӿSLHpD>Q|/M?L2}Vp+Fu_-)hO>2Wadl`*^fӾrZ\Zcgag\͞,m ހQ^ f$T#>ZoDOe Uh怫xg?™'I!}1agGFӲZ8BYbJeo[W z/w w*lT)1RluɍtN qȷGܐd'.WE>/Oв9j aNNb:X>)"|L0b٫f"|S|i9{:@S?X!I[]#BN^LTҀšCເQsk1mx~_]{~$(\y:O/ sm|ɏvNۻ@iM+41Dhwn]ney֐| P_6.~*+ʈ/giٔwg׶^yTG}=>ւv&*s;THvw5cZ<4NOXoirKW;a.+ۑl/:bE)5GRL2F)UIG\ f뛎*MAeil 0-GWaɫVʹmz{9̲^7aԩ[=ВGD ΰ>@48 :q=HO# ik'_\PԔ6_cUEWeKZ;pfkiūAR:o:)$'$]$.I'AV S8|ӾQ1V " `*j#)iop:@2#J7eQɕ}0_o,˵Ȳp$‡WRSOZbڜq$\1|I }8gMUl#X9MRS*tW/t_Z@+HvJjl{fE[΁k25]v[t";hV2%}ҁr]'NJ@Uto;G}޴ϔ&t^>`[f:5nViScrvl*9WE|c58|SC2+̵ۓs`F=:EݑS\uU˱YfmL$j/,Ӛ2}>_jȳ;)SJ>< iE 's5S/'ΤANkvM|Rތ8~`Ϻ1\c H9[8Щt< . L"8W9$9?cJP:jѯezzKJ3|{mVrʃHRN<*̍N}N2c%d5?4I!Y*ylA'0Va04{M\xށs˸ H]ܦI\5`q_?EoHb^;Yr0†+!ʛSp9-qA3²K 8E \vVĖW*~<[ϸ\/qH>U\>tM76-k̿=?krrAzA|ʕ2:fc"p:к:Nd":FP`P|^VQ<$>cʶSuNHQRm Ps=-\_cy7T+l͑4Q2V6; V:/;I GL>菒!VsDGMHQW4v)^ tk=To7$7?C9~E5,gQBd0V0@ tW&hףvCP4sϠtS5YqRz\(k8+ښ<\gO Ot47I`hlث~j*M6ZiǯR~󨑃: -m$ =w9zvguHMVߕN$3nʣ֬,(Su@$o|J"'/-)CgR0I?oM-4=b`W2?(bw t"-}~9iF>.GzfXqby0D1ө2-W 7}Qs땹L~fo@ū꒡ RBӵEY@K iBJfliM< ^~S-w>+Ӌǹ 2ȱwߞ#I-H[~[ә_jHBojhxڨ{֮];fIvQ*@&C.fi32P~9nŪIFzdͻXRm"QRPX$NsNS8-=5uGH#@BZe.O]Ϸn-HRuֻjfPf{JpPfd?9%/I͟~,~9rm{07ycX|L9u(Mٕw.;A@jdZYF8_OAEvL83đobË7 Η`@"0i$nVok߂@=#PPmݧt`5q0P^2J&A O.oNk䉗dj #)yܴ"IA@{.6QZV$Dz[}TAbF[~$Wu"`䷻huv&I9i]KA ЩBwl5G6>spmνZ3W=>i\A NEh)%o $_U ev-e# J5}P _t)VKz}]-fio$LsKFU4J]Qוw>j4-eMRvXaLh10ѫfJR!eW + %勀ٹsg( 1嗹ԾF/3^(elp79)%e,ucS n2ыUnێ1M}x&pwr|hU$)bhx\x` -Vi&Ul1Fb-cQoE ^j||Í++n1y$W wkZ]\R0U©ǜ; ^8/~ kTu ZcV|IͪsbޭDUFecƃԊ4z (E`swRR8N•_{bO#`gΜjڴiEq|ݩ;^1fj_C»*%@D[ck.7f!?_$_)8ꨣzᇯ.ERfEZ7,}\B y"$EAjʧ RA@R,@j>Hrd$Ð!CHGA@@õ-#/c E0k4f)ds-ZF_- PZ/ڝCrE ފ㴮pe!sw_&WHR644`j[8W^yOyҼ4o!}:놌tc0i*(Z0zR/ Ѝ 1Z8ߙu+X:C@HJp %D  $~&w>NLT*A@O<33LA@"GӦB΄|R@΁BsDR @2+r$A@Ay2rMd_N_?@hy WȨLڻ#A8ANNghѸ,µzz?dHB(JVBR.I:F`ū}אq26Vl}8ǸHR! $ntG#/C\8%nB{#*ȗ.oL8)ӇQ}3A R1E8$YdKwC"Xt8(+2z!3!1uC.8>b*}o- W_%tOJ)_Cӎؿ(RyP)pc]1u ?B,85i =a|'|6 (^HF#R^Sշ$;wF!~)U;q3O?Fz#ʭOe@cH9`/)cgoln=k@ E@`ʸ:oGRЪ,twI,{]|  u# :$'+cG{pH̵e<ȃps.)X-MbL!:W-x2SVKW ݑk*)y}'g è[Rif9`̓!^spF2uB9b:nXx""ȽC,G.8;мx >ƆiN"$^zSE:;ՊUzǻ"ʫa| !!y6A_EozFЁ/hr=ZU2yU6!)U 1Ylى\zUk[n˦-wwRm;[M=bшںm},J-8BTj@ϥ ". W{ V{NJcF)A2Sx^V/)m~J؎=mZxg*T';G|Mec̩#UˮzcN+OQ_}j̨y[ǨWlSOשQϽQ]ΘKeHWzqFvNKǻC^j[mcu3 XĖ)h𹧿Y#!!EF{q8ҖI+HRpgT}Rh7=f5fdP]aZ>޳Ǩ~oK-{:Oܮl?^ZI۸Cc5a Y?{?;3}hH8uP ~iNLDqy//{S(|*R[ڥZ0Q>uaS7WVmVw?V~m]\ XAܱXL>^8|{\NTlr轜bTdHR6l'^\G/ tF'H:A[kj*}MggDmAR0)O:;:@$Le;UgT|l m۱ă>^iGpNc!q;Qv &fko~=uAw;j2 Q2!|5xmnPUEW*ܞV0ԋ=p$t= cWgtx2M&}!0'~r D9}!5|o7_ZlD}'c=rh\ZJE xˆ1&EgNUܼ LUM&㽴Ѷm.4SJ⬄"'~34_~y£HJ1Bdo(B7emE("?OXHF}C[5g6n8›lgŪC 3!k vI!c.mh%;iw3F{uʕ A]513G}ݛ/uIU%K_zKxӡt1'WBjq~Iq)kUD&Gܷ]mmmO655 vgUIr yo \F(G_۝S6>5 ǼT5.\u*mc4C!cVP\Z0]g!!|F6N=֎ TIev.csd76t&0K.`a9ߕ*}[}WTX)U{5Z42àē; 27y;+}ˉVE=w'?ur{ MEF(EPhfq&<&e-[ 馛>_}Z(qȷ!lwE**CA㴟z_!ϥcgyeIREGEpj'ML&C*o^vk^-M ͖KNڶm[!8NȤ !I` B> 9r@D/קgp^[~^Y}I9jB˞{Sha!85d}n!gNBF@Vzqo4N  tk3yNUmkoo$Fo͜9_4զ%Zɰ&ТPOW|PJc,'͝WGᇪ=or7?(215Зbta \ 6!\W\<'b|#F` IDI6x!7zw{/{n|PIlkk=֏<;kp*goyd\|cIt. j*ȇzCwGi„ Ə}ߒA!^<1Bx O$=9>\YėZGGGux`RR'QD_K̋Vḟ͚ Uѯ.(^S0^@-yȎ<,YRzt|nl4WZu+8j̝;JK#уuQwwq+҅|/6c͚//O=yo`Mu`Gz \C%'Sft :)QApɝs¸Pa]p/]kvf- mK/Z _ɻ"$4pEPewiRA@(:Kx\ I)k',GՃ:_J !:_/\~@89wnɘyrpOSA@1<<}S$ ^D jtKʋwR$h0bl/s|GN$Igi Bs71{4% @ 8yeDvڥWoz @Xsj^_Cz4UW'&{ɫ3xߧ?^y%uҥt]Wmڼ}3&UKr|>oHHݦ61:wقRI_ 0gU;S=sF?zT KfN!)@8-[ /Z}%d",>k"-|c\S9S2[i(5PZK K?}mvfAdχ>~_igEj.bbX0Jȑ%$,5ճ\@v喳j&XI^xy64m9BDt/% I|E5F(R ,:y?W1-4O3(,k0Kޡ/6ߘGbƍUA+#|#5I%j F#K#٦[֗j>ƻTƃ۩: gu%SHJ= S8*GP(4g,Ơ0N|c39x1_ʹx*?js5L?|ᅎ{ Z/~M&CpfV~?yeiӤlӍx\C'?11'|f>/ =k;K=iܟ$0(`W'\O'j:A@A>[vZ˴_ K?~olr;G*_zqy/w >-e J'd3he! ςXR:!K+Qk^N'^{:!$&zmfĤ4# ݨX\IYQz!RD`]β[/m:BR\@ӳ $!x+UYh^,Ii/9PEf=;+rrUyY4^r f O۽H1ǧ!{ڸKFBs#\ߎ}^[ 3lծxQoĠ4zY7ن&~sWO;_j5yɾ9nb#]e[|0n? ջxFU=ytI] kiO=w﹵4};t~=\o%- }p`  &]V m']|2Iqz8*P8U>iQTJIZ¸PA)+ʂF 5b{b J&YTv (S!˶#6-},uehW: t4\@Gc*%yJRHe,RrnqG )"=rp\K9e'Ul+JzNԞ3C&x{T%IS&T%T*%T$+P@TnXGHR`za߿v"(du۴ed)cc2y drS=dQS!{AFI' H Tp)%Zz@I[A`I!PV㎯WG[Nɱ\[y;v+2pAN֔ I+`/=y'tE@A֔$u`MrYq$*&aHU.CGdNhr35Q!ppb:КYO2LrR,A-b!vHg#2>ye2Jlj$$,)1- *GAҸ8W[!*=y [z ,0}7|ZP8bGiPTnɅZŞZe+(7s.I TmıRvj)W 2\rbbpt.qx\tHIQVF96,LJ8ND’a(vlDD'5*٫q皼8(۱d>l0ӂRMPAKs|wrHYLFqKkPbZ2r,Q5سc׍ nj8:DiYCm A`E!0j ]dz!yRdz.iYśquM  {m'$( Q * +B#`4q"N (|8V`ڦCphŚV,&Iݠ ^)y,.d0\.wk;iEa6QI4J|hC&!:Iّ'pqnw(aQ)%BJo.= R ,;ZGƔK G ~l9>>^p9 sx2:Ex&Pl6;j J)brcP %SI^`B36Dp@bKR'>Ji(YKP4cMYV̢Gq%(`'><~ ,v(چ8÷R-Ӳh򘥕,BU JjG0EڲBQn yq+n)&*Am*ֽH3FRA@X:ЬodMT>qU:4՘cBQ>9-b`7 2e6I ]EBEeЂB"͘@ێzDT遂j/mX?Д5M3C"]?]R ({^ܛ>lsΫoA}֕&I^#fĎ&֪љ5eIXQ24,Rȁ_Y*#fB0r&u'Bʤ*99{+uzt; !Aa$ief )g48 $+!ΔVB.lwnݟ4&Ƚْ1C,ѬID4zždE khf.$fPcA?-kcV5-!*Ir),(Y]9網IdE֊S^p2J;r߁b_.XoAlf`YlLX6v~bzq_S<XI%f0òeǘKMg8]LӰRߘ yԆXִA= )r ,::2{GAԅ]@L& + -y'ziaKr]wgG 2K7h$g1I4;',({'As,j`!"^DN!\*Ourz$mҾ$v'@5Q B)E 窬ܒ7d##(MQi9-N_hAT!E1Xa:c^XxĜ.{va^B'b|ȔT*< HQ[Ag2P;:lrA٪馪f,2jL:GA`ud<\f=L)p̞չA*ךkuyG4A@X ꅦb5b`K|~xKPGqۋ\cX$+ ,IBj'F1T+8먮ư[Mfda``i# s"X7Ձ Ne`M)²P]./0c]y/}Xa.cdv,4IKeF6[ *}ʊaCA98 3&"'PBAVd<&=br2<@bɳΔW^0ġos .)xw0\DJ(EDv4ti q#kVOh[mS6o{ZP*x@};ߩ{rɠO,0 0%$Jb'D2Y2T!kn=\0/p!SD?$pzK=,ӒcFa"$:  3AN# B.Vµkj,1Nͭ`JA9ILF1`'ތ/#^6T) BR:SL'.b&(pBHst 7u7ܠ~P#|) q)*U Rg(D!AT`A`y|-3XW ŋ8W?c yTȸ4aVnTȇqp$1z:64Ky* |$08H9 A).6]> cP I3,Mt<∡II;Փ (%N& BqRBdhYP}Z244F׬QΣ92^duשÁtq&JrppPm߱C ueu,9﫛+{ PV3כ:Ech;@zF AєGEqذX$&=peVfz\\3}cA`i"@PMb ~wÈ#5+5AOQiC]l=38,'`QOPg5wx@X_C_g0gEOa|_ؔ(qJeua!VfapJ={'Occݧrr`>uubBwZ?zoy}$Ԏ;ծݻ'TqjJO;K]ps1aiTWmm8>0և)C_IQS"i![iɯcOq_ <EXi~,SHeTx,ȣ l'Ng169_ VM"K%?J噾f|XRڕR9O̚246Űapw;XfVa3/1)V^Zl,a& 4s^)33tW3Z$?^r"Hֲ,F5a|/%$(rRƁ(hb1i02cERιlwp9^}UrB I]G#Geiay{:6;7EͰzB M6믿^5Q]$8Q u*YgXb/΃k1*E`mJaÐzK9e&gH!s\V AŘ%$X c|%|7vC*_3QDe<B|081a%EȢXh5$_ T.*M֦+922fbQ I1A@sf),Z χ*`4 R@a`AAXZ2W |YDl /m3 +$|UzH@T0kX-J8B޶(#(O#AKUо7"GhcǦ-)עѹjTW;uFŻ} SUK D3.>Tyd9)qQ! +U0S&C0f IC (3^#dise_ O1%{\IL `,( (7ϱrvBHJ 3GjdC4L&{`ZbD)sUM+6QgF{֩°[p(S`j憘Xuq9Q|'ff,CN} ab QitV;ͪ -=j\c[~ZϱiKI"v@PB'"a PZ!ȟx6KD‡@`"jnU A@NQ"L1]<AYa҆t) bȈ{#X QIKu!Oة m:dE8 bid(Є pjv-),\~3#$uZˡ )" ϟ#(?nIPjd< ];}A5n#~h4˄tT[lYT42ӻ6*h4A&ă\ ҁ1F D߅vJYLyEDrQIaσD%f"x{KcO8#yO&wD_;z|mQg1!2* ,{BHBP dT*ށVŔkG j,lLc0D0 BM܀L\q~~0 UU?u#qSa€"+1hk?h?looÆl@ψZ͹)4͎,a>I[a}}än^oS>GuTd zzzNOOQ+&;[ID&㎏i&}niI `KbH@`wwwffDdY~xxpdrt/.QܤJ&IVBXlyyyyyD"|ލL9 RX,Fsssl֥d29>>Y㥥4y2M39O:S>==MOO_^^5Mhͷz\.OMMA"++++?bqrrZ-..j5p!GuuuUUnuCp]vڿj\f1T# uuuq?)|ŵ-LrP(p8AKKK#|>_>Eb}}},b1((###|> sss0\N$lmm yufkk jHfnnN (ZT*O9;;j5EQ5CCC4Ms|l6 x"4M !E?^ Dz;::k˗/>kwttx^Db@BT*] "rx]$YqNfLT Y H~rࣹT.E6dr/jr{0YADݾ}kS$ Lqggl6Ftkt4E T"õ?Z>`00Bzؖr\i:wTakēǏo߾ݽ{W* ~pL͔>ⶺ*EYV*|ٛx״""zSA4L|QXڗ/_mX<::w "p Z^@GGGݫW~ڐor^#Fh4XL$ Lh|dD\*04sll/r\l6OMM qjj >m:t:OiaJJFFc*)m?"@R<aY0 {=t8??,|V݅/^4Ma˗/]Vh|>$HX,lF łhz}"eY_v3 5TjzzZ;.ɦDz,0nZy0q!_H$&''o4V;99 jmRe۫-ϑ\.߽{GD&8jlHQL&o޼'ij^pQVMY44j p%n4M/,,NBFmk`2%nJe$M[ ^ @hډ5Xn-ͮMLL< Brb@xnZ+PUlF?{ҥKⲖj4j<tH$Ӗ8H$"4qG5}v{5tvǔJrll윎)c͛7{M&s{/5: ,rIENDB`dtkdeclarative-5.7.12/docs/images/DS12.png000066400000000000000000000025071476226662700201760ustar00rootroot00000000000000PNG  IHDR.3g% pHYs+IDATXIHz__I hi pe@DEâM튊 GDeP$UpS0JzR Q9h/}>];w8(ř~?> -ROQQQљ\.0Q?WfX,^__WT___Q)))ʂSde2TTUUVW8{FQ(>@@(:55e4r$''8a{{{ޜrY,DQ0Vj*((`0 ***0 .gl6 8VmmmRiPjjcnzzYqDԪ$RK"XL*fU*EΠ bT";BJ xZ[(DԊB>>??rWjnnqMV"CfaH$vcb6'&&lX]]A @:mmmᨬe}}t:}ddqء<>>T*6559 ?aMT*hEE)6[hs\:bYXXgb@$+++++˫^!ƾݒmVL&nȷj趷ڡ$&&N\K+ 666Z X8d9Gh4?B*%##WWWjPvvv (@ &dxx4R\\ݕ7ߴݦ&hPwP*sll NP DYZZ:;;nYYqPhA ONNBBB>rsseE")G?1FQ^^Ny}} 4T[(R0Lsss:N]~3ő88Ua GGGBaII dX(t:F#ˉ\AWyh Zɔ#܏dX$֡(@KKŅǁ(pyyq=%(EAR)\5h4l6zqPj־hd0 dr8 p/BVlDMLIENDB`dtkdeclarative-5.7.12/docs/images/DS13.png000066400000000000000000000002551476226662700201750ustar00rootroot00000000000000PNG  IHDR(wj pHYs+_IDATHֱ @ CQ)<\\Ҁ8:SO\dH:[TÆ ^JWI@dfJau\zI?WD|CP׸Æ ~:> ȁinn&:wvv|Y̔(+bݎW\WW}>Z#@VC@__Uy{{JphEPp5deev'899 S  a, *5͗~-zlvvf|JKKI; C g8Fcjj*---4EQftzP.k||_gX&)p((%$&@ۂC!H0Y)!N666zzzI3jL&Hs/t:b~,>???___O}E>< }jB< qGt4%]=O63BL&s}}md2֌k}||<<<(l$In ~MSe`0xwwnp2G eH$R.Gd4H$"b8KC|8 In8m$I*Gq<[×L&eq~???I2al6ׯl6+s0Y>#9cpdxt˿Zv||,VwwwqaFEz=JuoP\  .%cYH$z ztX5h4zzzjNFh(kZbfaKpfv- _$IvKvޱᎴ%sn%dᎴ5O vh0c lh%,UNJOFpccJ/^q%dh( Bby:6MKf>ZDC mooo-S( Pp8|>Xn4vz]-#|j&v3T*n.F5NKAjʋb>7ŢX0P(Q`TO#MӺD*b?nKQ8ÈH|*ʼj%Fq*eFjp;͜N$"PxjUu_qT*&Zy ( 四5?ՕrgT-~DW6W)///~*R%-_\ӊϜiD)薱IENDB`dtkdeclarative-5.7.12/docs/images/DS16.png000066400000000000000000000013101476226662700201710ustar00rootroot00000000000000PNG  IHDR(1'E|i pHYs+zIDATX=PK ҍALv5IXAceHFG` s'oi A"/Jp?Miq9 c ߈+`ȲqMӯ]idY650q0Mӂ k57٘孁m)fcL[S\1%?Hn|(Eq0Z-cnZZ`0X].I3Ւ$kC8ڪ<(.(󪪚W  0 zXUՏ77`yz ! 6VPu(-׭T*v\ޛB dz\*ni}eYb7p&-|Bp2<l6FQ| p XV:^,D"N6?NIu6_pѸL&>zF#R]O»u8z<z*B4}F/ zfUUUs% ,^.\.a!N jUQq5ݱ~ `0D^#u/w8]DQ|G%'>8;Ţ3_o=nN>M0IENDB`dtkdeclarative-5.7.12/docs/images/DS17.png000066400000000000000000000041221476226662700201760ustar00rootroot00000000000000PNG  IHDR1.~f pHYs+IDATXXKH_?Ih8ZDL,P[]4!jnF.RN4\HX0*uqQL5mEGш Z839<~sϝ{ν<_3[XXX^^vnRT*MMM˫Ͽs_‚hPx||B$VWWU*GVEӽS5;;[PP$|>_RF9(zV4p8x<x</t:?,z߳gb1d`OcCRDJV;::hbccIt\htccC.gC\.___G.$XF3::PTp|> $ 􍮩)rBMMM >oOF4==j@ /ϟDN(&&ŋU( 9--h42/S[[@OOOzzz8\ZCdOOOsz5.x<^WWt||<]]onskiiLOOE(==ݻw---v}.aieeaL/p ---&''#arrriiiҽ{Bٲ2B3åKRRD=ΫWb7 ^ ϟp6aX|>a[[[JJJAA?}vMp`ll>߾} jd2j Ǐ cccͽ%I||<{I j/ɐP.#g[ 8D½M&l ;wAqMMdb2$KKK+//h4& rN.rG>M&F)//OKK0cHXr099Iw799Fyee@ (&wt`0$Ij͛7a^ I233Ig)77>pC5t`6F>l6NNNNCyyygkKFFlCkkkvaِ5e@ af^G x }0z{{D"P H_"^ a 񚛛P]]Vz~jj o}}}ss3#"{=>X ]?==evQIx<^Ԣ z}TܭB m_i2WQ3f u6u8yR8V(Aӡꠡ< wy fS@AEb6Eq>j\]\.ÃFQө|rB2 6 N3DQVǏ|ͯ\*d]oݜ})IENDB`dtkdeclarative-5.7.12/docs/images/DS19.png000066400000000000000000000123331476226662700202030ustar00rootroot00000000000000PNG  IHDR/T pHYs+IDATx][P}=!RBTuҋ*i`[tVttԙ>>xZ*R`ZhjZkBM$lvg;Gl)T65s`s|߅)H㶄Lln%pGd$RAV+ D"$ɤBj0,6]wB$9~`VVVYY޽{va߆B}fddH-4/ ,uEǕJe4M&<^6 >/rxxiGluuuFFD"Ga0 N<!"IrhhA&q$nhh'￧(JT TRu$˛o9::Fx|Iu:]vvJ?>aB‡,~'N8wqK\#2HLLL~x\ׯwMMMwq!322rrr Bq`DQEij~]]]~vv ^o4-P(:(M&d+|$'N|WDWnX,611A "//z˖-)_0]t 0l6TTTh4e?|%>u{g(...a9^R,l%b``ɓ~a8j0O. "K"pVV|4MAeCaFt:&.\hoo/PܺuO>YPP8 9sfbb"L W{ihhK)3ڐJ&;;["D"O,P%Id2<2==Ͳ 80 K$vF"/, |>XB,ިgϞo}DVnZSSk.FyA[̙3CCCBqT*jjjnwߝ,r HRŢ$ api9LɣbðD"2 q`8gJe^^ 0E)*,,h4Kx<>33Guuu]rH$[233sY>`jjGU*UNNO;;+TU*U~~K/t կZ[[?:% xrrrn[t:]~~Fzsss8Л 2LC<&&&:::y@ dDiӦn߾=x^Qn& 0d2IQܜD"tv?pҥSN477رh424 B'gvv8@n߾2;;Vq ^ j*J$)PaEQFq%a[[[;::xa׃)8.8L&NR"Inn.~^%I "D"lʚD"166v鮮su֊A~M6WTT>T Bqq0q Bq=U|EHR,..rz=0`wg,˂T?L ȵY:Yn*]f\.FBa&jaXP>ӵEԆ`0xa:%IVVVssv\Oտ h6rŋy{b1 Ŋ$I? ET8p wQT###Xl3LZ Kd2UTTW_}uzzZ=zTR|~|rrѣArp<;v0LK4n(xZZZ@npjݺu{[w:uuu4MDbff_bUUU׈,)` Nh @X*J`4!Ar|ƍO=TyyjQN&8̠(*@`w_ϧp媪ڶmk>d2 :U RWWp80 m6q;O,F qJrQ ~LjMӡP($,;77GB0͡P>}WdGihhp8FD H} 5JR|e@Gwwӧ{zzU`M\rali(ݥ ;sэJ ^qN5(J *[$Iff&Hs\8NOO8.GFF>T`455剞 "^ǯ^*o8 *t"rD";;;?^kvϞ=%%%O{~aBZ7nsvhd毿5ʕ+֭3 jzWkZj5}}}XLxpxO?@{guk֬If2 C?(JPhddD&l[]koozW6??_>|ի (//k׮] deeD"9a3˲Hd``fT*0dBEQEy!I2 +B$Ɇ +++sA Àb>eYV{F*ҥKOnoo`p߾}555\q\$8q˗jLPGؘD 5vq_P2tR)x /S+u:f#I2 b&8oPݻwٳrcb$p8,LL&~IƬԑZKA<>Fv;8$>mffF냣~С*89rdrrRеleee>laaJ^_XXzF֣>GV@ U[[[___PPuJjT<808 ˫mXM\pɓgΜz Rlܸi`hܹs@wqڵEEE+9rFfڵ555|JpEryAAC=gϞbj\\˂x0d`0lsL.]x\" ŦM*++Y\a U,''GڱcM BRZ.,,ܵkז-[uYJjѨP(X,UUUuuu?^9t:e2h](,)0B75Gxrss9#6A6d2{i@7URR(l6[jm={Z- Aq:^$imm=?jlltdE@WTT ^{mddD #G/)B _x͛7iT:kЖ:th눢*۷o?tPiiLBHׇL&mcX8T;wA;wb1ʊW뮍4/ nk4A^_VVo>? */nݺUtR7; 1?i0iOEӸ}_?\=.IENDB`dtkdeclarative-5.7.12/docs/images/DS2.png000066400000000000000000000024211476226662700201100ustar00rootroot00000000000000PNG  IHDR45F_ pHYs+IDAThK:M6_LEPQ(JQތDt֩.u+ݬ?"L(y2K`JыՊnk=ODð;ُߙawE"]~H$˷r8T*m6[N+p9sV0b1Nߧ`?}C|rTOs\n3pw8ooov$+777W^^^VV6;;\/HR"oVT*dEHa M@@*[tDfPHj42# 9&,055fUWWo}z\.7̅Z6crޓ3L&z>(4riCI5{xxH Z011AُJyX0==MA^^u93y?fE $j'744DA"&'9\.w8d>4xa lqqbD~\A{ۮc~̸\xVff>O?[4V2|pCCCH"h4RX\P#@DTף(* lǗdF,&###"wLfooNzZz{{ Ύ,Z-ˍF]Lӊ JjooGQfLC zXQRRrvv돏MRisssSSX,`0 CP( aWPPPTT$JKKK a{{{N3e/bႂh( `v |n͝r?hL[b E"Q(( \.@f!p8k4D")e8varz~~,f͙f~  8$0 6b%BP( 鍍nR_shEED"r0 0rqzz BOOOtb H&544(?0Lc44sutRRZZZaS f7DJAQ4wDQѨz}vr߇o[+G_9,BIENDB`dtkdeclarative-5.7.12/docs/images/DS20.png000066400000000000000000000021511476226662700201700ustar00rootroot00000000000000PNG  IHDR41 pHYs+IDATXՙMkLǣX!TB@ݛ}q~.v!mE jb(~B! W lBҖJ)gc&ə̙992MgMEUEQwPަ(\.GQT2$bQB,˺t:c}$pxp^x} I$GGGtzkkkcpVRӴl 5X(L&a*RDea`^iA0 3 #d2Y=*80A IFp8L a7(nk^(F?80xlqgn2k6/EAXɲL"IREaf_jaaEYqALVt,M8˲:N՚NSlRp|,˪뚦-8Miff^zI$4Mcð\.H$g~䃨jx!k4Z~ɇa`0h4^jpE/i$8%$9i/EUU]pn7xiaXZ[qD eme2nk6HKcO${`]yFhy] H H$l6]pJcc[8sgo&\uV~* P(j'˲88βRh* .8vAP48EQEw{EQ.X,F/Bc˲qA\pqEqNEl^0 j[[AJC `AxbzA;ן[pw6&`Lg|򑪪^o6s]?|}}=;;{yy)J^OU/ N\.=Miix<>99 B^z Bx !At\.o]0 t:zjr?U1^3\<ܲ~-X@_^v{Rt||%G[P4Y²IENDB`dtkdeclarative-5.7.12/docs/images/DS21.png000066400000000000000000000023631476226662700201760ustar00rootroot00000000000000PNG  IHDR22] pHYs+IDATXՙk\ǯYDPA8ک"$Y18e.BEVj6}IV$'_s?^/{FE}~;vy2q===F# & EQEPu8VChV-IKI,˶Zl_vC hXl8~}}-x<^ f㧧.kwww XA\]]<%?FhG"899q:pd2(*to((EQ䓡5qGd Bp5nfa^/в`fnwUpf-1ɲX,l9SbM&t0uĢ( Aa EQaqF׾?AhewtJI$&$I$I1Nߣ j,cr:jU9[$r97|.{dJx6$T*?fT* Y,AJm$Z]$v=ye2bYV^Vi$hZh.֙Fqr><<~htnh4yyyQ۴Z ;;;fYfrDoa8ɰ,; z^RI&z^a0~3 ahTz}2T*^o0,d>y#|AQTt:=7ARMjq`P1l-,,azOWn[^R )VmEa~XX]@jZQkd5F)vVmNGa dR/i4M1i4x˲4M$yxoZv(b&rQ0L0 qJ8cY$I LuUUE$jUz.B۶mض= #NGHcYV8fYivo]dn:cY~R9::EQ^vu]7 4M@QqE|4M, ,00MDQ-0c5RTTDQfK0L0{2ITU=::jZPd_"|L>aagggeeEeYĂUE KqկeYb4r (Risss{{WS8{<uF0 F\qM4MT* 8377mll|I$Y\ry Y0TUutIpұ H0mYo1!eYXh$ ò, k~uxxwa0z=A~WneYFq ancX4@FVr|X,R)Y%bq^#*1aa,q, A'e-aAx?|a$m/ 9|SXt:V4Z.=իW 0 sWWpޜf-8F!-L>@`rr2qN߿0̈Ôkd2x|qqT`u 2BP(REQc($IHv>ݡiK;PӝQNPxlZZ˲,I(FE~ecl<D7]K$.fyrrǏ?3FUWW766ڵkΝuuu0 /3x<>33c0n߾ӧh4ZaUUUGt:}y|>t%ׯ?h4Z~/@F,Z*d.L&SRYX,4A9a (8  `0?ft:Z^N`X:.p8***-:.b`J2 Ycj C@ ZavU*ղ|~0Rn7YD<7Lf9HKfDl6Lx͛7ۗoa600qY FKKˉ'vލ Hy1x[ndBD"aΟ?ѣX,ՖR A㵵YǏ\LO8/)t8gJy޾jkkə !BTWWwʕmzz$9d( AL߿߸q644bC T*Yfvv3d2'Oj 8tlV%NsI1S(`nmm}YVA t "bQ(?lp.=_޳g% EH$J_D\>99KN4559.  (i)XrkD)f'C,z*. B_`.--EQtӦMW^D"ӴZ- BPo޼H$I5kրq<;wN(rիWS"fÆ (Fqϵ`۶mo߾%?dh4޺u wرv@.O>50 O?}hJRYYI&A#=29 OLL:ujnn.9"CGGGd2YRp:/AB(>y$fjLf ҰbIY(d(kdfZw$GɴZitzgggL;55uLZiV'rY\ŋ|BQ^ BE4==MX,Y?ȬNy*:iѣXREFQ(E^WT @Qt### Zr\V:ÇÇg]DJut:mddϙ HnWt G'h:͢=?q!(ڛ=Ez\1 ޺K;w,ug޽]]]D1QPt z IENDB`dtkdeclarative-5.7.12/docs/images/DS24.png000066400000000000000000000023711476226662700202000ustar00rootroot00000000000000PNG  IHDR47̎ pHYs+IDAThK:MgM A!C0P{^;t :Bd5"A頰DF6j~O3ossp%n8q~~jz>jj8beqqqnpz=N4=Ea} PD";;;fYk|> Jd )`0Y} v 0LD)1 #JkdR/FL&8nL& 2 drM} uh4A|5&?`0(z Bt:B H9 `½s t:f]REBP(ѨJe0L6MpYTeId$i%81͕Jc&J4-ZZljj NhNR $L&#mw g(L&C'p\jM~jrAZ 3N[=w\r$jʹB4M噖lA8.3=V^?;;{||޾\.4F1% 0&xI$\=Ia`{0>T -ZL.?#>½pI8-h4v3#z߫M&SVn97qIH.lo2#Pu:3 ><<T)rN'F综>ۻY[[;99؟pj!džuRfIs:`fJO8# I,Jap<oz|jbSPbGbD"Rqf3HTjH$ͦXJ2X,rNG=S`9'Y7ʍL֬~=/KKT*H^ Bx|Kdz17!9^idN/IENDB`dtkdeclarative-5.7.12/docs/images/DS25.png000066400000000000000000000056461476226662700202110ustar00rootroot00000000000000PNG  IHDR2@׷, pHYs+ XIDAThŚKl]u}.ߤ(Ң) Q\.l9mJ Z dh'FQ;m'E:(<;nS@.:9M,b(Q_òiK{s>YkYn#CLX$m7\QfN|+MM wjt zw|7ǺjQD^ .u\_ZWHnՀ X=7Y̿%or\fb-/Y{gۿxk;^hՀ ]cis?xpլ>uJ*)dutr/,~ox{-3W֚j7t䡉cGw&@CH`]o5nάz/wguoIs}'c7#O&Vc35ƂTռsw,v?|?6V-?Tέ;c*r} OZ~V'őRd}Pzn?D8/ƻd0!@n 3Շ_xb50Ttⵥvc]T&ntƂSsg/<} EYpQ@H+K|BZ QAx{;?f"'r=/DYq]yռ3Y gČ|f;;@K_+BPX WέZ;\B2s o_tGEXs@B p;5/tչq@$!/ѝx+y6=oGozjv@9 {ѹq? udS D7: ?uN9>nz/g_xc+e%c'ER("#H0upb[ZMOWEI'8yMܽعpV (Q vVňzSc}Ϳ$†|,Dd !p.1x5|||$M,Vb5dϔ4њlޤ C"GH2#{jaa5=3x6$<2њA{~ǘ6f wa8pgJB FdžĎ`{lf N`{'8li8M<6b~fji'|cƺo؞_جv'pfz&;~?:`^.ӮOlRPmŰ 3+ q̗g LbԖ4?K۹A9XЂMzm pCO v&ƪ{QpH3 EFH2 Z2Mlp#̾__ι 4}=l4 t<19Nr'ꌺݬ:Uתhbt8e־|rzPRBJ*$gTYXULLX:SΈ:5ݮrWuVFQwQ"Gkyʋox}FV-\ $ 3Z>17OM;+37ZiḼJLUշ2rV݉:Q͈YV{dzqJJb;/ױȭUqh<4f0Y'Khr1m2ʒ+&cJN$XKr@ JC0 KA=]Y"k;x 8 73It;19,;ݑ4FtA!3G&~[@ejE&3F d[B;3w01909St{cq'D3+̥p"25 CL`PV7Bp3Dd7txa% $.YC!"A$M4֑s9+Qn4of%- K)%2'0V5 $!QR lA\oz%f[<-'Xt3E51մB9!hQ^$bͅx) ,9q2sBI4<&ֲta^+r#fe3i0;OzJD-7[P4 a` ĵe`nf"D' e) e&#j&i喒B0B( eɬ3֢!,@RTl7>e5f͕% WQ feƷBᖠ24LX(`mڶ|IkfLF:J\- &3&[%@@#"Β%2+r˘E#BieTĵX#a,ʠØzFLJNsj-ʯY$I!RPl b $!/ zY9vT>2'CA4Eh2N 9{W4Sp4P2l6.,H2QVLg тBij󽄭^{ti>4 M﷥{D-( VA!"%)dd͎\\&V=%@Pomoy[95>nIENDB`dtkdeclarative-5.7.12/docs/images/DS26.png000066400000000000000000000056451476226662700202110ustar00rootroot00000000000000PNG  IHDREDXo pHYs+ WIDAThŚrG?5 @sX~]?_;oFx}0Ʉ 0T^ԡg0ȘPtOVfVbf~NN|5Uuu|ɬ`L;rwcshan6`i!@ef;yqc[.^-,Q{5=yΜÇ ⳍI \._ݻxVUdǏ;v0}π45XMҁܾ-//#x?彣``OG`fx2LIbÇLp׵ѿiK35<=ݫ.|%/co4+Gn+F|gkZTOEz*O)KK=q] ׮Eg4c;0P6g*~u_|!7oP拋?Af?Nop UqKʏ?qIŸdx:,;.ȵk/e\_w|7G" Sw\X7xk޿_>R:[y9S_?Ǩ- F#ty Fbs "YGdbЩnms}1Aof|kTF|P^qoϯ1Y@phS_Di4$j"`tQkTW<* XLB=vwdo[:Y|>bsAB`de$- T1Se%|,</B$:ēO u$.^YfUX96xk} ߆>y~׻w?GUb- "\ka'Ϊlmfٞ"yUPr~!g'Ho>]9Q,.A`l z}^S"3_(7 ךiCC[`Q?Q9v,@%iz K*yL̺-7A+[Y#iF =X; 7 6_LOc14mDѵU]^~{` ;5F\&?@ӳk43z謎b6[kPOܰ 0c#;tPnRtaIԇDc?P[8^~ӯcj/v)y} Wډ}/6?aJϜsgџ֮Ij7klyEt2aՓr*} ,!4o>b>E.^Ï"A^V|`4 svn/BP,]0_h!e8 @I* D`B{z*w7޻B&6XX$+,DM7pēm.kB10 @ U1?cۯ|5ޜ8kzA'p"\NqG530TL*p8 l픽~Tݔ;w7JPi򲾹fGr88q):QbS2 FRR'pf3w*!ܢz&X3Xgǎt8b84f"1 sS@!x,АTC 3S: @S6z$w1ę[ގ#EC|pU`3qt DuU$Ulq"P%L͌ł]5~1fC͏,B(:c sFAUu}r+`I,Aft < >.FLQʀL~E,ZU'X "}W" 2/TUAzIZU ?ۜoj\\1Z3!oR7U!0S'&SƊF!br@@& [tfyM?"t`㸢+rZ9~Ҫv#4ԴH${P g)>IA;17H1l$fM'[IQxąlf-}nZTM)a,D35 7S̈́+DHB `,LGqQ7ɬV)ARe~Eh*IER38tR A%XCC[m^o isĀb)`&H- @4aMNⰡPTK~U[˓ ٵ?6r;:~tf5.eO!uyvmZ쓯A EvY^Y bݵV=f}ZH|PR -4nަ5gm6']25Os jj `AKY'b e)1TҌ44Ct <Zì˓~IylNIENDB`dtkdeclarative-5.7.12/docs/images/DS27.png000066400000000000000000000024121476226662700201770ustar00rootroot00000000000000PNG  IHDR%5I* pHYs+IDATXK[uqҨMB *^Au-.\qDHplJ[s&syDd2½]3;s>wrX18Bi/O;꺮i, Կ u+U hH$dGRisssiiɶm8a2e=bkv-\<OԵ5B]KL&f'''7:99Y]]][[3 pC{zzggg8E nnn Ãyx&㍻D(b1˭U*La:fM+˥Riyy9Q Rl64Y(lwwwsssooNBltttjjj||X$hha[ZZbq =T*IY]]e"f0yxx Y>EQADI6 www, dA׻\._YY'dJ m6 Y++++---)J>'''===?66f49# 곳3nD>P(DJVb$bbbbggeJ$.J? & bwww||)*))<+ 1@קKp~~ھCijaYYQӡ3~>3!BC<<|B800Ɂ8hL&ņ$aX@j5`mml@ `699H egg#`C@~ss3'h4詆G8}b*iYTTrrrr8{?0LSS2t:z @UT"!ALL&쀈:::~H]]]avyyr8 4amv J͍8Bj&pFTZQQYWW(EO_ 5I/IENDB`dtkdeclarative-5.7.12/docs/images/DS29.png000066400000000000000000000006131476226662700202020ustar00rootroot00000000000000PNG  IHDR?; pHYs+=IDATH10p &Kt]k_p]C@пԩPEܲ:G^=BoQ>?Q4M<].۶]np<`Y_^azkMSJBeY!!4#!D4Ƙiڀ < 8usnv] !,sǶit]8)M}e1"۶뺮}ha]*R( )҇Wa(qΗ!Rʲ,OOC4- cG31N91<(PJ1ƪn>K7z3IENDB`dtkdeclarative-5.7.12/docs/images/DS3.png000066400000000000000000000011001476226662700201020ustar00rootroot00000000000000PNG  IHDR9:f| pHYs+IDATh홡0nDs=dS[gaPÁD ^djz:.~f4]w n _x⪵β1F)=1e5h:( tιR*"zWp85p<>~ H)hlaۥi!E!yem6Ht<?X,& $I^m, ?}<B糍޵뙁ec1]NNq/4A9)H5PH{ $R>4ײ,CIw%t54],Z]86jaI |>\.5=zh(5W’} <ϗe$իZϋĻ\qO4ת@ВZHZ;c >a^ Zk)R,ˇn`8Ѩk| ?Zg!+uIENDB`dtkdeclarative-5.7.12/docs/images/DS30.png000066400000000000000000000003141476226662700201700ustar00rootroot00000000000000PNG  IHDR&(ۙ pHYs+~IDATHc5n8b VѨk׮cdd4o<{ 1\K$%%eee1_~K `mΨwVlzKK .=zzzGKQ8 UeIENDB`dtkdeclarative-5.7.12/docs/images/DS31.png000066400000000000000000000010661476226662700201760ustar00rootroot00000000000000PNG  IHDRKl pHYs+IDAT8Tʲ@>gA` ! Hp!]B[i]@Kp;LlB+N@$[fgy4 qO&88L&q?*Ne^4ujr'3M!EEB4{F(k+E1Mj{3u]adY~EYq]>(E֞Bq~=NNNWFa QSO 2IENDB`dtkdeclarative-5.7.12/docs/images/DS33.png000066400000000000000000000004241476226662700201750ustar00rootroot00000000000000PNG  IHDR7 pHYs+IDAT8ӱ M.MA>CU M0fAC!?y| e߼11Ok4WU>2MS]m۞8I1>xVK)4=<˲`|.0D}ҮLkur08UZq kgYQ;SJ2;oHNIENDB`dtkdeclarative-5.7.12/docs/images/DS34.png000066400000000000000000000004401476226662700201740ustar00rootroot00000000000000PNG  IHDR pHYs+IDATHc5nԸ2tXX؋/LO6 S=#Lv֭߿322200ׯO:uϞ=ĺ.::X[[[qYݸ/_Μ9SOOMɓ'i0o0( +++???Ռ]v-V)a...4ϟ q===XG  A̎7j@Z^qAji)p1.H-׀$(qR$I\ r$|`z\ZVqA/EZ%IT W«k$V\Uji ތ$I!7NHM8T' >NJ.$IN^MYU}$~ eT&$I*Jx5e^RR,NHR=4NH$ij.TJxIj璼U$IpprztO9@8)IpR$IR!)aI)K'$]'$I¬j84NJR=8(NJY',NJR=+}$IR W) ǁqR2_GII$9Wt\4&NHY!8!I$jNԀRq/8$I{«)Z 􋓒@>zI)KMPt6I̕jj^RI)K ԀAqR$s8!I=V$5$IRK^M0I{Kjl%I"8;G!68NH$tyqB կs衇2x`tBnn.7ofŊ|'̝;LJI=V}$5}$IRK^MM8ѳgOn=\ڷo,Z3f0a$ >?-*',1NHR'$I$5-s`o1"Y&y睗qsO뮻.0yH32a $IRWSJz֩S'&OL׮]㒤\ l!NHRs%$IRh8gַٳgf̙̘15kжm[zɰa1bm۶ۥle^$)^Mzv')n~_i:t1c ٶm[\npу=؃BV^ͺu!ĭ cǎٓΝ;SXXҥKٲeKV'{zbŊ,_<.W(((O>lذ?ҸE=V'$IxOIcc…VG}5 /0iq7f3qy&M};6]6nԫwq uYq{1cFK2~ ?Ki*ލz )ŏs0I$IMX/dzܰe˖6viUz(>]׿qkk+;w\}:PZZU;vy+¯Z*4%%%WUTUQ/!eqn!I$ 7v1xaɒ%ᩧ W^yeg}2Α#FJFy睴гgϊ9眓V!g}6xaС'xbя~L6oޜ6k̙3̙3SO>^&L8W^aӦMa_vZ6lX8sp}e -]4{PRR3Qo!eqn!I$ 7v1:t͛rTZZL>s0xഞA-Kя~N:e|'|rFsO|pueƝw^xᅐWPPmB>}¿i+?3n !${}_~y6oZjR6a$IJ'$eM6qoƥJpI'1k,ƍ\rIǧ~v{˖-inFo?rrrׯgʔ)q*n&BHիy'r[SNIUꫯfƍ}ٔ/XhQ?;ecu%I$I$FU4F=Ennn8s/\6'ٸqcѣGƹ§~ֻrЦMi˗~i=6n~?1|Æ >R+{Bx#<:!VÆ B!~6lB3z )ŏs0I$IMXQ0mڴe˖x[G?Q@p9 2$.o=@_V魷 F8~?|&OvʆoV׮l۷gldlBFQ/!eqn!InG#@ۺ'?c?q+#GSlݺ5-w饗oE)>lxJJJR#F0m4jUVq:t2ũJ-[dl}J$I$iɋZ7_;s=7{.j*x .qG9sR:7`ܹirׯ/__5jC a+nC\s5|ߎKz8Eiii{WeqJ$5C{G/_m۶iI$VKY.W^ᣏ>K֭[(,,Sδ!|NN!CR^j<i{'_|1wqGJ'~iխ"_d k׮K.\&Oo)I `ذat֍]Caa!-weٲe!j*n8͸q4iR$If-OŘ:uj()) O?t7n\h׮]F$ ]zux[2zSo[|H7N:e=z~eS#777lݺ5/~BO-?e!O?=רQH$Ij?]Scr۶ma֬Yᡇ }MoߞW C8|pTs0ypGW|/۷rH++>l?΍ZDAAAJ+v$tPcB2z[8$IԄ6{ő> {l11z=Bqqq(...sիcʍ=:qKx~{pCFܨa5F+߫s%d9Cx!IqBRv)..S5op %%%w}q k#/KV<3|g?;u7ӟ۷%ڴi$IY+}K$ITk,wgr)p3wܸ+c~n+Zp!_oMIII\N3w\pYgUzVH꧟~:?<˖- ?9r$>(7ooٳ0avX\$e.]0yd:uؼy3oҗDiӦ {#Fફbƌ!$IZ8!f}3p@K~~>mڴaӦM\{UVŇĉ7n\۷ӷo_-[U3x` ڵ+:u+W2g>ׯ{'xbϟϦMC=|NT6y&L^xw9SYdI\J3|p~_c??q9C֭1b[n石dfΜɆ C*նm[c8ͦM*^ᨣbȐ!t҅իW3k,̙Þ{ !Cxףj8MQQEEE;wLNN۷|}娣wL:ﭾ뮻n-N3n8&Ms>J$IMX uaҥi{d?yhb!5@2il8ܨ&w6mڔ|VO> ]t8ܹsF.5 y䑰yU()) /R83cgk_ /!^{Gǎ;UTTwy'a=\ƅ⯾ 3j$Ix FNNN(((ݻwrHx'1cdgM<(ܨ&.رc3'?IygбcnjGUqƅ?NgXjUſc?hРlٲBk٭C:$I&,hQPP5K/qa4[v<j?΍j⩧B!|G!777q=_mf$qJӦMK;gC,X ;uI$¬Պ+7%Ik |' 3W 5*N0mڴ*/ ^[_׹+4fĉU;QGqwjxV{|+ :4N7rA {N$IQhQJ۷ɓ'gF3 V5[Oo!e%Zn>!y晐_ћ~m!moW;/_N>䐓/~1]6n !d s1qk!|'5ڷovV—ۼys;˜1c¡կ &ݭ+$IJ'$ig @͛7` N)kUl3).N]^q2E)0'Nh'SVI_$'SlI0$NF$н, X'@,VI '#P`i?*kqd{u&PyTOiӦM?SurqDZi.]׿u6o\+--odȑ|)кuk.Bn馴|UB77x"ꫯrst&W'۬[Wٯ5(**詋7/}ٳgw}'I$I(^EcXQ%dhMs Q+qˎ4ǐGtٛvٓ8TtX5çd;ZӜNfoU _$75gGk.WwvUD~~~y睗_;SB[3zcرq{!^{-_2zpǭ!"q/:蠸5}ݗ[YTkcwwsH$)EU$IU[Cڻ*[D$Ve}Hݱ 4]  lc7ĉ2ꏃWlcƉkEq6YOVϫ2N?vٺu+m۶Kt5NTjU2ӦMS][é]7>`P[Uת:$IPKT{=D ,bt@AoEmR/ĉ3u~ψ5v?_Ar렶{ʕ+۷oSuҭ[odX+WS@@NN!|'|غ g}VϘjww$IR}ȍ$I&Q̜93N0frs朜8U*HiX~ }I$I5!Ir q ~1nܸ8]kU]G\SUm͚5Y{qRw$IjK$~ߛI&qcu]nע.]ݞ7o^rFSUuT1VWVu@յ%I$5Ri߾=s _|1?kwgͨQϏ:o!3fL&IM&du]q^z+пaԨQ̘13<3-/.wӾ}8 8T}Նe˖8@Ϟ=Tk$IZ6/*e={r-pVr-bƌL0?.׻޽{sG/_Ό3r'I2ể&?~< K :9sI&1w\֭[GΝg}899r$>`/}Q W^<ЪU+nfN<Ĵ^m۶e1\BO>K.3g`U~I$IRSLj#š5kBmwyj8묳/NG]{뭷˜1c2 # )ŏsqkO%v%dk_ZVaaԩg K.~d]w]BOB>}B&M-> nRǎӎ-**[;35t; I$p;ԩ'Ok׮qI$y8XhQ\e?8wygOc\zl۶-.57p wqqQ4N$INbڴi;_W:tcǎ 'N sNF gY IDATz _°a{SUu[WѫWp!΢ 2$d;v p@1bD2dH޽{3R6FbsO??-e={vBϞ=3ǁ|q4 /N8ᄌ*uَZ ^xaxҥK+f&ߎ&5v}g4$I"JpŒٓ+V_2w=ztƖ7K.ge„ |'i5?׏|V۸q#/N˭_:Ǖ{9蠃R:`\f͚_UW]+jV⮻◿%%%%)GK.kaȐ! rr]wqGrlpYgv}>l )--?d̞=;3M;sϫO> 6nݺѵkWrrr(,,dѢE|!;ǡڵ+yyy]%K0k֬*]s$IԄūh/ cǎmt9L81>u7s,\0nֺuvY+;SԩSt'x"\ѺuOLJy駟+] 8p駟ƭs=3c(l? 0#$I$5aN_ga˖-᷿m8B3Y{|ڝul^!'|*ugf{oZŋǩJu)ŏs0I$¬R3s1z\vKKO5k*>lv.n#G6l/K^~errr8묳ꪫͭ>}:-ft5m[B͛۰aPC7gfРAi[ݔKyr#G;NZ#K,aذa}/nУG|7|3ϧڋCr1p 'PPP/I$I$IU4NCa޼yb*)S>8\@ٳgƅJJJŌޛo9/+XqpJBθ%f\ºu A*ۊ&̕#G[©sG^^^WڶmQ3jR6a$IxѷoZoSTTƍq/8n /BFze˖eu^*t?w܌z~Bi}˖-[­ޚumf!A)SC9$e吲Q87 h$IR %K8#?~<]v{,ZҴmۖ? 0+VTGҕݻ7䓔&;.]4v;~zwNϞ=ӟʷ͟?ד_;餓8餓(..?fܹL>W_}۷A$I$ICx)KccGQGUڵC\p~ݻt$СCtwlqb픔+3u?nݺTv~XdIP\\/KnָD֭4h bر?eҥ?%I$I82e SLۗ]v~{ СCj6V^dSU$NЦM8Unz:wݛz*߹ I$IUDIRظq#98sj{gʆӦMcqJ-SYoʕq }7m|M~{|x{x 0}٧n$I$IMDFRrE+Gť ֭S~nlڴ[n%NXiiiъ;[ 0 -3k֬\NNw^Zng6o3<3~mlI4iREO]]n.Bc^xe˖qҿ7k,fϞͤIxW3gW&@~~>gusL1[laժUi9I$I$I(Q:uj{.|@իWXdI^8B7tSĭ*;.ǽ[qK3fLƹk5'磌*5s8y睌Uf~??di!eb2a ې$IReiU\\j7Ϗ|g3?.GNNNW_Ͷm7Y]]NnJ/wwW~IIITnn.m۶,XqZ;~q){l2$Ij«q_Kgy&r ?s΍{= =،?>#G+dΜ9q9ի8q"^x!2_9y裏(*;|y<,[m۶l2y?xJ Xzub„ +lڴ).Yb&L`ԨQX".kݣlU/I$IRKWRÛ TPU+??ҷo_iӦ 6mbʕ{u+G >nݺѾ}{6oʕ+Yxqܮx衇2.b{]wqUWʵjՊAѣGvJ.]())aڵ,XBSͽ T}\Z ԀII$IM24fGuTF>5<Ȱux+p 'dENx7 hȘ$I i7sI~/3sL|IfΜg}FNNr wiӦMqo&shQPz >IIj@ I!7#8#8"NWj\xn'{auzA8!I l~$Ij0ajQfϞ͗]TW =MW7ST9 IΕjjY;w.z+Gfȑn:naڵ<7wOKґg!. _L}5IOIu(JkS 6 LFiH^ |B2h ,/o)|9lY$_k=HIi7 h$I&oa4TL3`hY-0d?,׆rH YI?rCHԔ$WII=IVt.˵t$ a -e$I5jR?Ц Uj;+[I,w57cM$}v U_aP:?$jj`p%WkJW$5qB$I !fAr})]1[HW{ wCIV@kʏIu66? e[qRqB$I4'ْW\zdsq$ף)X>#_LrHi #~ftz H.(N`$5W$I«i ${4_$M!ٮF򻶲m_ HuGW}ErqTI?gV6_"ٲ)Wg+E_Ք|q[R{X'%Ij-6AIV FrgFc>}I:O-SH.$ ɹTJIjH I$IM[!JM0Ŵ'Y~1 DH6$*$#M]]|XO('9$Hط&ko'w>0ط${kC0 b;F$Ij'|0iٺ[~.ޢ!i$/\/Md;zH3I·/ $+'k[ Iι6#vzY\oD$Ip[IVJR}EZ5o$q/ITVqBjbVl IO$+U3H~Cl=PRXMMq\$InG`8v::'8)Iup=^kB$i«p` ><י\C\Zݪ$IVd5{IƸ 0 IM8)IL^U*$8)PIIII$UhԜ3#$lpտcIIډmqA$Is%RI{  N/Kj>\j$IjՒl&SI˒7Kv mJA߀^$IRC¬jnΈ vg_oIMRoG$մjvBβ9U?$y^-$IFP@E5I$I$iɍ$I$I$~8$I$I$8$I$I$8$I$I$8$I$I$8$I$I$8$I$I$ITve!I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$%EnT$I$I$Ie$I$I$I$I$5$I$I$5$I$I$5$I$I$5$I$I$5$I$I$58!IPKS $I$I$I$I$I$I$I$I$I$I$I$I$I$);$I|`o )\ II$I2$I-wIOŅ],&Ijg,pQGI$I!$Ir9eXv[$I.p/I$X`xnK$I%I$A*r$IvCxI$I %I]^$IRe˹^$I%I$U %I$Ij PyQMl8 j)xϥe}$I$#B$INNн8I$I$Is5Y_$I$I$j <\ /I$Ւ{'K$I-Z(w X0nK$I$IZdqA$IR I$I1$ $I!lОdq^$ÁI$IM*I٠={M$I$IM*I$I$ICxI$I$ICxI$I$ICxI$I$ICxI$I$ICxI$yZQ\$It IjYeԂ$IY쉲$IԄ9 #$I$I$I$I$I !$I$I$I !$IZ灉qR$ICxI$݀qV_ $IT%I Ņ&[F I$ȋ u}؞R$5MGQHx>%` p߱)I8d;rIVw>l.ǔ} Or$GR 5_ $I$IYeዋ:64C78󁕕C@|5aQ$IҮ^$Iaxm_ %poP[ <\:~QSlN#޲q=;ozpV0&I$I^$Iax- je/ G3UpJ`?id^(=TTcCr*}%I$IڦxyE$s}x5goļ7 sgNVgl*ۀ =&i k-q@8/KJ:z\Y!È_6cIiWF\H$I$IBJHhlhq~9csv2();גљm1Kr&>Z+;!$I$I$ r0xe{׻сqp xޢp`O!NgN0m %I$I4(f KGJmZ:$Ifo*I$I$IR^$Iw-.p<$I$Ij^5c$To$޻p`^$Ij!WK +dž$I$I$I$I$!$I$I$Imb/I$I$IRK$I$I&$I$I$!$Iԝp@$I_O2 IDATRȅIBE|,IҮ3&I$^L(`L$z>>,J$I^$IL3X%I`/I$I$IR'$I~+?x]A8 8xPr󁃀{o'7į{ljyi6Eb2$I$Iԕ"x7Tw?֋Áq90 n"ԷḰ8Q`5Pn'ˎfz xT 4V@oσ$I$I$CrkEbZ$*?[\FJ7%N?,Ob,MV%Q Cs^A E%A]$I$%#!%wI:M·"#k\LRB4'Wq8_^ _;:c +v .I$7f4'Zy$I`=LKv`@EM\ zsg[ _"\x lb$Irf9Al9gR? ZJ{ [N!vj6,F?/;ϭrPyP{Bīk4,,{BciAT% %4~O?w'UaS?wC˞}q3T95JZwƶyZ{0鿘+D˓ ^\NB_$IjCxI3faP%7a1ѰJouuX('v`~XL),Fx/4v+]BAj ^qY5a#a_AI=ܭ箟cs,j/+.16JyAT`O*]B^x[Or;*%I$I$I,oZn;QF:ƬO&>oElj_љ/6?xUļ8D_BwKL1kٯ篥z[I$\ /I$M=t[`R{z(_$};WSo#Ψ3~$I$I$I ɕ]:x$b%|\X_j@|#\,X46<%qԾA-$op`8 I$+%I,Nxu{-f]j1U}$I4!$IRCkwbk{#}I$- %I=,hԿ/'n )\WWK$I$I45Z'$I˄I$I$InG#I$uz`L$IRp%$Iԝ~GO$Ie/I$I$IRK$I$I&$I$I$!$I$I$Imb/I$I$IRK$I$I&$I$I$I.,H$I _.$I:!$Iԝ6$Iv4$I$I$!$I$I$Imb/I$I$IRK$I$I&$IRw:X1K$I $IRw: X%I$uCxI$I$I^$I$I61$I$I$M %I$I$IjCxI$I$I^$I$I61$IGuA]$IRɅI$I]R$I\ /I$I$IRK$I$I&nG3qy`NJ ρuxDmlPv"DGy@ zJ-,oN $I$!$IaTߘuX l."W^7_7r&I$J|oV2$IR/S_׀9IET f$IL$IRWm,Θa^/I$iz\L}zBH$II^ 7mJ{Cz]$I0$IҮtLTlG-i;&]O $I$I$I\^Ý+\M}3$I$uWK$iWs~H|ݓ:G*fH$I$$IReN9TEi$I$u&CxI$fSgurR'XGF$I&` KSCxI$24^1k:5X%I$M`p@$I҄<"oz¿89]BWH$I$IJ?%-ou*v7$I$I$u~Ԟ\Ԛ>|2 /6uI$I$I:0p>xP 5M1ڠ&I$I$IR'{x[_$jMɅIxX\@4$I$I$uUk*Fʕ.&ކ %I$I$IF< OX$IRo%^J$I$"Xdɖ}p $IZR$I4uUWv4/n.$I$I$I3A p p0xSŌ6TS1C$IRq;I$)ݯËz`^ŌY `Ymi$I$I$I ^KސT@eC.I${^$I*sǀ3] >@o$I$R,p@$IRs߃x|MЄxgP vP$I7/c[k$Iɻ1Dmڤ +fH$Ij+F?m ADK$IL?~`#/3$I$JxK$I1A/E ~3$I$Tl]$IR3z'~<*+AM$IR{',>JK$Ij7u\X# /}I$Isp%pZPxȏEI$ImWW÷;뀁`L$IR{z"W7h$I$I$I+h^e$IR wOxI$I=A߽%I7x.p`l#,J$IW /I$M7!1͆n xj$I)ң%I鵌83ϖg$ƚv+{Nm$Ii=Z|{K$I*m@oŌ3$I$M+K$I[OK| W1C$I$I]T)4'AJ`8I$IS)ٺI$ifyzMXo$IR=Rv|]Â$Ioċ VgCA_$Ipo$Mk/l$Ij,`14ގfot[З$IҮ# ~+I:2h/ AM$I345.IE  qAIlC~L^t| $I6ɉa0ޭh$If0tkv4MաychkK$4a~~(4 $ID4zIWq!z':$I3Omam=P4'ڲR pY I$uF52T4ݦ2n{5$If4$I5L<&|I͙l >O湒$I3?I$l~o"ϛsҴunת`{"3ğ'I4c$I4v͕4q 5l"ϑ$I  U݀ R 0#IR4o4DuNծ6$w$ILW\Vo$Ixf֛So,xK~4 'ñf$73W$iBe?^>*xINk4[kV=95Nks g$IR ɒ$I~aVKyiiFeΫeϗEZH=Ckͫ7 'E47O$9Vg$IOSonXZ j&;.&5Rk=? yKj:$I.G$IGRo^8ZUe]]Zx]HxZBzcfC{Inx %Iy´P9X؇T~x-}4Ӥ|} `z+s$I!$IRwH Ԛ>4W eeǣ%MFx>Zja?)"If/I4%isZ>נvxnM>ShՒifjK$uZ?I$iެXZ`4SK8>]ǩ fNeOd8,1O4.o9R̓wmّN []wT$I:^Ú$IGRC~73Vo!vϿ7=/WԹ6Xm}yIǴZXZXF$Is`K:x{D_$IQ{qZ|˟xn[Ę.3T(^sơ?\!À<7V 󴹵F$I{9~+;V pD/IɫT굎ǰ>·7q2ъҘ`PvO,QNiy^kq[Iוv7k"ϑ$IR$IS^P ~bՇp$KR- >JFqcZZ_$kdBrD1$IW+@ ¨8_nGx) Z8O֓qO7&I4m?I$=j}À=p=l͑ocvJϑq{x[Hu^Q'kd-_V.I4mG#I+䡰irVk}%K;rѬཁ$M@_?wl5|J mIa-ժK$M+$ILa'êlȜv41zVҔ-9^>NU$IGg&z!|HYÒ$I0X8 xDWazI$ibfd{٫F&93yJ^B/I) ,^~s<`s]S9,I 椅NaPhw}G.I-ba߻fǡ{u)5;cϓ$Ijz!$IZV@L= zɒs(Ie5&W'Z-)pN%:-Oji4.I4 %I^UaVm@Ҙ$zN':4Ɠs+I %IZ+-J%%CzS*|hՓ=at$@oE-%WOxZM$iK$Mf%hR%cE$UO6:vO(8TqJ9$IZ$Iӫ^!VZ3Y~K8үWiisҎk=J$u\X$I҄BiZBZ* KKǒ4%H|*zs_67&IN.N-_8$IAyX9\Ok9NJ6' ɖ2^$M\&ڛkUX>X$[ /I楅DB0*K¬(Jǒ4%(E|*VO[ NDsj$IzDB%DD_$I+La?7#+QDbL.Qw8Hsj=J$ug$ ߂!$IR; ғd %!)!ha`ܴ9$I=%I:O2j&tl/IS"W6 ۊZ}d9%Ds!`h-OP0#CqimjP>K$HB&Iݳ>Yv'O~!gĊE^?b?r ,̿g 1| lj#+)*kʚꩵ">7kϓ$IVBxI$uZzzi}?fC>,E9߇;m@;8<;4i{x$I]^$&az8Kc#2aefk::@2h/50ė$IsŸ=ѿxC/IjBZciZ-aXq{,aMEn}#"8̜=*=de￉m#Q{͞ KSaק@=D#I4YJz!"*[ǒ$IZTz~eF;WCE>S_Ԗ!3wRغ kF9{;m!'ae`D=|*=<FڢDm)l~͚GfB(Yw_9Oa8$I^/I7OjfΔ/;ܾGeFM5[¡Xb_]xP8:*sY}+nZ0CWu4nVy:BI//!3oY8|ϖjI;^XU+\}E8*xzbK\Maӣ W񑊱I=O=lIyNvvU2,;'?GW"hdndΫq?Ytd+d{*[6F_r2}Oy+ s;M]XRɯ+j;6;~ ˞FʋϿMy9ޚ=mʿ73^6^$iK$D>/Ǟw#.ZK>Lv¡Q{{ ~~&}>`9leEBzܾG6 0áQ }y<q")`f=/{yl[͙3pwd84&'8;g.1DQX͚L+IQ˦^ȣwd׮J3ݢY}guH8TSϊ3 Ukj+O!N %I0$I|v+3-@ Kex񇪃B~CϣT}\]eTԛ2E (n'3{ ʪ_pDzz ƿX{W_AaCgeU_ܹWL"zI߉C4s=RPM"`U_X ۯÏNfn24:bdσb}(5/l|[.?|/Ez QlĿ d& ?r~kWa+Gӿ"_z#Cm$3k>d;ǻ5+mz$IR$I4^ޑ|x ,K CbW_fkHv CS#O϶{b(KFw^z{!==)=gәoeΫ1T2 ;b毾5- w#m|ؼ\O?XI=$aWRܺ`0U#y=gř Z yål?U4z;eY'f#Cl++k =ya N<2+i3P(C)l\NnM$iƫHR$I^QʛQ5uS:z⛸&pWqo*j" z}1tFWyv2ĜlWf"ļ{ЧAp#ԡ{v^a|k6gR|R?XdG,?̊>Ⱥ{U;n?=j5zq"~o06eg/??XnZ!Ꮮ]^=sc"=3 [ǝMY;) ,\fU#>'F7\ #amhFM ?x `F_*wI2$I>K!\\]X 5ߑ! [֑=;tabM?%Mn"QDvb/4VK{N-§{j ?G;,E@}-!|4PnK VxMI2$IN]6@g3gѿ5[6^}L bz?=uw^sğeF?t{ f{9)5({}V8ҔӾ'+Ds?u9>t/*}'<,rrX85,A6W:!톻{{s2}'(7]ˌI$ꭄ$IZbwJM8ǜW}0|(nD3nѭ_kCO]vq~Ds;\26d/2][S&C3Y~ 3jF_ß#`K{++#a*g1 kv>#hnlgƞ77\Jʋ*n`s_y_i}Ãl?2؏'م1ĝ኱F`˞F~*jc}趫}ʋ*jѬy~hxu!r%y ;o{^?"N8cϩ&}#Cw^8>RNz9CN"b|_D:%3o/ do}P/$I43\ %I J[Xna?2)r-{1 مѬyD<ŝ[)G8<>L^m9)n]Cº}Ql '3oQKlv[`xX@vѡD( FGa.8 ,m6=V~+3-&E [im|VBs)yo`ѻ[vN_jbq1<5iqZ_$վ迫JxI$F۟GëH{M;2?CRزWYw/# VXഅ#OeI$" /I$I$I&^$I$I61$I$I$M %I$I$IjCxI$I$I^$I$I61$I.ǒ Үa^$IҌf/I$I$IR‚$I:F¢$PR$If.N-_8$I0$IqkXVj$I>&4]H$%'$IRw2ԭ~I]J$Ijn5S,2Edú$KZKNzDB%DD_$I!Jol)ncV"JMV %IҮ9B/&`/I ZA_(=a/i aCyIpOxI!\uJ@a$DX,/6I$$I#-J0X( kN;Gx8%Լ^I$d$I^8UkVm{Ú$Ӷ{ZuV]$K$uVQM;F NOlYCaaI}$IR<Β Ì3PK`TDhAdDAѨ$$7D!(DLȰEvaqL眪u~=zs>Suow[35u'W J|{X'~Ze6Q?K`Q{R*[6Bß}`l̎C\*0p(V0XJy #8Ú#7]WٸXLJǥ|`PN ApX#kZjwXvz}G`Kx!IkS-_+(LL`^M}_n) ck놋;L8_&Uӛc fbTIa,lԝ0prExT˳\e[o)[K<_vIaJm `¢0bE)d~tε_[;9@[ iE{e~r4PlN(VU` Q:";ǎX>UJ\/1hˍIW}s9g(|ث8"<@;H˅ ]o|_~|/ ?[y_c[o' `&JU-%I+֯>wzm>9+ }d4R~.>ũ- IDATm?dL _Xlr-ţO\IWs`hfjرgXv&#Vd+U؊cſO_{Y_~?|L}rͺ"<@oTbhŬpRκ4ks7y~H"rSپNlA*ٸmcXn?:'Z|^s+>X*x6xK͒,vl|?疡[oHj,1cŬw1SL!m5g[w_j am,J\,;%=7_;kIe h;1?]Rt[lOߴ_x_.8mPcK2.C>ܨ֢x"-\.Zώx `4l]_1ϵ[bEΏ./~޼{_0r.I6,{ tJ.b-s"\k^,0Ұ5|?0V}ۦb[˿zMg[iL? >jzH,TKpR'_Ll!øl_^)Gnɴ H$,9qc,X[POS:3>sS_l3Ɍ]9GjZOO߬^a+_gIS8ȴXzv,cR 0 þvU<~}oKIx3/Xo? fOnެhl=hҜ!54|'KEkFFf(\ak^z_5˞x\\E~nuԝ0.(Btmks~(2=?Vأ?XLyDgߣ)yz8Խ.)um+WpG(壘K| ҹ:9l,<`7SbsSsߏ.xU=;/y V.0p(BbRsѩit^>"7/C}.>>oۆslߋbDc߳Usw(q/ؘ۸ QXc+j*ćl]}z(is1+6^hYGn6aƊH?6+lX?yUg0 ŋuvNU)SŞd8>X0^6cXp,CK-|..pls^qB`|j-6X c^U.Wxn#2>Oۆ|_q Lcccmo^a=HyUg?cc95lN帊{~۩za+B6/&=0gcakq+/Cv 0( BµUxSVg&k=͍}?ŎU"X &$U(^ލBͅxcq}eVIyd{ra,T,6Tv q<c/WOt:VU ^{;p1|>Hcc |k׊m±q8H vq+qAq3]"N }W(^q;8b{o/6kU9u~cfl Ǿks\sxbq;'<~_:q@o䎻lc8l̏øԙLu vNnƫXU.6C`줎b\A;~qX8:mb<0TcX;im?64T̋Ťt` nGQ(]lske=^Xb÷(ڏm̏ø5bb8֏or8x9Vn\~GI+$]ОB颳ͅcTn ^18ۘm8|>LԚύ}Nq\0fv 0t`0'WSfQV0*LBxXۓZvrʾog>V`2 XԜT<۪X7"<V֢X?le^,fUm;u}?|\; M׿͇X.RXk^B`j.4b9 s~V=N(TŞ+3㡛׳F,ca.֯v~b1/(Gtn.ϵJgu1ñ&+RXl.1㰍RiUH_t9 c6ǶX*rPczu0U6Wsvsq.SX_b/HTan+ζ ޛ]?hyUiy9\,rV;s&4S`˵StyuN(8^7UQ> B^'۪uRT\vL &BBxL 喝*J^7*xo\6QS7 k{Uyrj9a,;.$w)⡪|I+&_J]nՙXQIt;]O:}^::svLJ\ 0{թ_N8/5Ή-u~Vl3ǫ;/|I+&BL|z"[պНN~ot iBot&5[X*l1ucbc'H:SI&Q}֎nͺEx-[dd!=t`l:;B:dsW"˂>&n^Oڍ^o`2 H0itz:^<Quw0V0:z]O7ߨExXϢNer~{I/tj{Đ Ci+ȟ%WDL?]%m#i/B"IK|C %@j$Y-)4_>.c#>">IGW}i*c:^?hxzܭg6ϒN6[ZT߹lw\{tS9G^Tu[OYj~|E%smf<QvKIIw=@OHo+'\IeUՒ/GJܭk>+ jzmMW}E,*w$+A6]?&@oPIrWbIgurh?ShzIg4v4u<(MlwM `jJ2_ħIz$!iےZ}WT|{ϮRe^[Icٗ\9"?[ O$H r췫 +_"Ũ +%? W]0~T)OJ 19e|qw|]e]C/*"7ֱt/=qrQѫޟ+*tw|M %iܗ_/؋%],ټ}9TraI'{^"wu36]Iݺfܗ(J\a++WJ$(BrPbItx9f/}~"G9rq /OFL-ϐNEr{kg/]rE宬B=9rrN_*'~i{m-tz;Mo(ϒf/f'}빫n; -WܾW%}J{4Z w_oB%+j_.}ϖ+Wҏ䎝26"W"^Kar_R!:r{NoRI*Avk9KR~r9s{mݼ?]=?z/r6o-^L=iC(]U~!r^hXjOJU$M.WXW_º^=F!N~٬;1`j{\6/rE=wzϚ]%m"ٻ}gnr%)!iOID!ig3v" ;Kir`TK>wOxНaI`*I`ğ%nPO_@uܗI"<BEx`Zti/n4 >@p;zc*6+_%i`> "rY/gˉ-.I `\I\~APO~rgYl>6cyl^o 0"<tT?RHl,Ycͼ~lEx`Zh@/^ܐ/Ex~Ffob6{k*o`z"XnjN Xt779rgJ~ W1cƽfmذa< mɒ%5//^Ӧ 0(` mRpNSܐ ޠ@PO'<qW"˂>hUᯑ z'<}Է\~xD` hMҴFq򊢸Mg %O -"&3ϰ .Ss] @PO(' Exd zoҥ7K%ŋiK,yAx$ }AErE6ھ(C$idd"IL܎>JxX O>P.S`@o,`|WA0 ds"d6+Z.* L |1+}w݂"^WH,QJ:0ߓ+)`|(@G8h̐k䍌<<44sI^a0QE 2rSs0}2Lt.S>y IDAT@PO(ŒS Ex`9LCm$M 0h(I[HfSf6A`@`ҥHQurWl0m*iIH+鏒:3Mҫ%&OA\^$i_KzgKzfI xK?*$Wϵe?<ǟ+IKZ4#_Hhn^!i{%H=rZ?YՒ` $.]>C9Φ 0(8TҬF1]r)$)Qw+*\A^r$*e;[ IVH[%\qrEgmܔ7IXu>\Ι)k&~IHz}%U΋NJr]翾7SyRruOr4i}&ӧ^vT _#rErW?Cs.ńv&Ce/bBtI.iW[-tI?^rEsNtw=I:?g5֒^ ;Iz4Z\aI'C_zurW/W[?BQ[!w_VQkoV-o^)iV־B'$XKzmi[RJZߗ9rۺ@҅g~xerVNϕ{9R At/\v4W]q t湒|+74CҖr='MQ1Ih>rI;k$wu].qEeZ}Ab7IG /W_U.:|I?tOWKz\!W#MQaS+$wirWC r rWuwW>֝.wwIzp4 L\"<Gr5_[З-` oOܽ%~Bs@ ]}ϖEw%AKJwK$ 'I]ٞ"I?t%.n@,%J*aI']=mo%陒S>fIJ:V}Ò>"WHza0S ~Q2WB]P%@R?.W*W>BmNPIoc+w-!wlrAhm5٫%/+J^*ݏ6_+_%}En^]rP+zzIƟl0魗t\y[I%W(= wm%m-I%}=TTXݎfKI;o+笖$m/WоK ]o.6s-us%4,WD]%͖=j}~K@%6gIr&4`d80]){.PO(' Exd zoɒ%7Fm< _0s%(?oLE@YEQ,tI2fϞ(.F:I?0S`P\!iy0U}rEk$i\ 5lz^l 0<"&FFF222P.q(Jy6Uu;^'⨧-9$m%#VcT0a>R,9 ƧotI0Ys1 θWhL3Yey睷mh4+8e`*Řߓ` `Pك2gΜOJ:K/={]a(Jaֿ3q/yyRwhx ]t{ܪk׾p\dޜS jX ֲzA\w!HD͍2q^c[{nc}U-cDZxj0֮]iIkm*b+>k]Wz=" O<e/bQW;ܺv_v~ϖ+Vl(_va\P3J;1rrǨVnn.Nqt5|Q_Ї>4W7g֝Y0NJ·&^w6o96^ nݺO$ev^*ԝ=LVVۼ]&5|Q/_9#l*/xLydI/ ޠJ: ?,`Hmovf;z/_l;?orH,<b^,YuXOmw}g<UcnRǍcyNj] &^TӋz/T=׍yTGoUsXnLJCu`s׍yTGTG\ݘ0&Nͺ9nkGv;] 61)ig.y?⽎Yu`sIq;bX,Bln,&؋c1u݂(x˂xd֙adv`ڊͩc5fVU>&{5ٹ>'bm։Yu`jǫ19ubv,تʧtd;zvnab&ٱ;_Ŭ:s־ {Xo`펬JuMEMN<Đzx|Xc/9ݬ;d;?3ʧT~ŽۉY :bǮcRkݱ{Un֝;عF(y9:sQ?hb;Uzm>(rxb6Kť|:=̐=loԍ1jcRs{ϡUA;ϱ:sD)WNnn.Zۈͷ&9{+pNNjٱYu栚=:p=T~$ U0yT+831g1b:9ɍS9ce0F&BRrr9uYՎ8}r-6STKť|a"={+= rX*Jp\7{ϡ;Ic2\lg\;ԼTܫKL&U?ol'nIbq<-by 댥x,TG=îۃTcT,T;l,۷\΋BUycQ_bؼX?6Nż\@ j-5ݸϥt ~^N8'`;Fc6۱yQ_Chx0b\?n*nsa,0uUc9 DZ~,۱yϡ9=͉ۄ<'֏S1/XOB9c1ΜnﵪlcG(_׋UXnت#/q(#PU|l,cV9jwV*~cbUu7b mP5SYI{ڎQhtVq;r<@jmӶyw:o5J&|X,g.W}6xLJǥ|n2;p'ؼ٘ԙ8X¶*f^X;]u> :7LVXO0=v8X;m^X;]PtrlvFE,9w* UP6᭹ %{l)piΫ̙lcsq_g,c^.^uo96K~bb1/rX?ژy\(\\ž{icvZ/x_͂͞393OeFc4+XcE#7 䚵7ݿb gw/\ui-~MTCx.q{auںhj{zK?oYsf?sƴM79Yv͓<+xVuc6׏T@{XqPݘUg ͩ_glUѾS/ތuػ:oߴS6{_h4f9LEQ[au>eVR\^*X;nӷm_;7ojf3sJQ1_n?㗞ywo߾ UzBP6X~lR>7vvUX댭<˽SX?׶;#}Crgϰ:\[orLJñ=}Oq?ś^6shјS0 Ek.<䗗>{cvboiᇇ$'w"xRk>7^±K1;3gٹ9qUnCړzmgv\oZwߗ>ֹ-lF1a)bC+Q/]_ׯK8ipls^*d]Ba.9qS /c?wm> Fc2I(ylؿ~I.Tߎc^*$O ?@H$,9dz8"{Ug ڱ6ڡ~.W;r'{llߎ%1o޼[Ǧ m_1 u^~芕+Wy_avۘXj<\Ƴ/عLdοSPc2)`d3/g/Ӷ91mhhy˿_%(^b<&q_x|Yc02ym ?Ӷ ϧ? 5[k/l3]׊1ϵ9u聱,§7|Xjݡ؝x;K/a~<|bKj^*[rsicX.5تG~l8>[|]ɜYyL1s>gS^_׌\SgWرc= v;Ms?]Y.ty6;=b]xWRyX..JvccG;\7 6֐ԸK{k^P7mNWcV5LMŬX,ubǍvX<6'z,zыx_R O~};T+z9O͉ͩ3@McQOim<3;\.XĊacEbvlx,Ğ[x1ȴΉ{UwFsvvnl^HN9z{ g{ O9zA8:2p^,nԙ1\l=fgt؁O6mG$IӦ C;|V(:x,:{v4,αMm; ^9sƌ];4Fc\FXWHnX?|o/uJs1/cRqgߓkspi?gf\Sߜ9cb ?}!>;X}ݧ~C8_xi¾x&\͛7txƦ9$=ɯc>rsX,y6{j- ?P^S۷qV}bg:'m8sIQAX q}]#O?^PUKʾG{2ۘEOt1< 鱕+=UآL,y6{_x0kkהW{͟r TGOqߣΗ4RLƎsmJj](a3-_9|ʙյ{h̝3kOaр IDAT79EKEǶoPl>zgocae_<Nح*nPNxl6l Brڍ~So0^5''7w_jWB̜1Euٿ_woǾksRsRqTK:ryM_?8-ooS7r^0Ďr砱JkY:'6Ԩ:V4yMK(Fc>g];Χ)v_:hg|%<>̚q GGW~᣻oc?ߏSs{uoٿwkYN= mN msq@Tb1i4`jI#)7֙'٦n@=[ga5 `l\!_W"Y7yObycg,Z4k/nV1Mi} 6owR/7nqIGn9w8PM7y'0;Ƌo}ۆR=w?U`.Ў|( +mb*`a=tOٝ@ظ)?}fsY7 56eEKnYTߩm?5'6wAQMqUo &~7KŢaslCNj4{+w lk&81߷<FO0}9PwV~T9MX t|aPϡ,L۫^2qTgg.0V3L"#Mŭc1jO~|M4na;IW-9=c*pLpqi"e3FIX'|%Q7DF\MS[*j8#>瘛t`@Tk]x~ruu9f8:ow$+Mρ4?jvC?EOzAC}1]Krse&QG`{*蕪~gOs' sqƆEklMz-c19u;w+W~kD#Ojj8N36\-TY$cllU]X wYmKOn95۶nOPW^Υ%.kds黡\EPN_>)ao:^)|$XoJRa UTsvk]0ӷrq2QLsp-`l8=A53c1\qrW}c3]Dvh dԲa -y3ٔS1FF'|% ;r#}xFuqVSgϜguÃAM֡p;7էA> 5]nL(tW"_ RmjWra4f:uIWaK&u*le46e1cv8M'|?񏯺6dyU36\BI4dC_~#40lm"77j16N83㿮g^z_a>k[)43:=R:u~WW' n]C6qߟ`ϰOk-nQqضc;G36\uE/}KM6,BHqʅ.B1V\N)l Z&|nd2e4K&;]4r3Q:V8.8\_hLz;B5˗/ U.RNq_/_^r{v&y'WX1HVzbݲe ;udw^04Yʕ+O !-[S+W^Rʇ.¿]wuyoqˍONK] uuW.Z_wEvW^l:čgqO=ԯ?C?觕rN8c !ZC*0ecڂUA4Exmͯ8ygCu >ozp;`e_MF?jPc[:`/Bu\<5j,:p+vWz&:5޻#5|T*채pD+M͈___5DB|$)ҸOyB+h0 |ARs4XA !kR4=[HRwA}qI]*x7 j~/#Tjly(DBkiPcgf{|@IgoK)?.^w^wxuWns+Dqdwp!TD"q+O<Ї>T!'m<ƆESaTNxS'3l– dǓҘAOxJ?5$3P7Bu'N56|5`)PW@8X:/n:1ɹnj|&ˡ:ԍb%Dm@#U[X>¨[*yX@Jbk_Rꐰ1+—}4a4Bu_6s )B4BHc ܍1' C ϙ{]%ruY)f ŰQ/yVq!뮆]^w_nܭu8pW\qœDnccl =ZrmLe Ҧ9M`lK /vbq k_sPcKÄXsbNMhPöL* u3<5Lo.FMg3W+3uC[rsit[Ӧ<?ەXԟi(+l`BH>Htc1cCoĪU`\? i6m6H'Lm\oS1Ve:@/Zi%m^^x ^>\~ٛ%Lx&QF{9*Sr1cl}:S$N*}bccURKrXP(|p ml'4F#J$2>$@JH? x/L8-퐃=H?[Z̪/h>c1|.=J1yh"na5MjXt^;/I@l+[,L lo)]G\C5p߷~fx{WhNKS_Ċd=D?̘6]1cq_g2VXQN9-B4Low'5&廵t5*-cpvt>ڲ6 g$Iq̦iq#1Xɐ~wh2 ;c1&| N_bŊ'r!S߂)G˕o[j>Ej~JcFakrh2*&pZg@7N2;ٻ~n뷞NT~+ᴴ#ynAvC|`cDmoQIȬyD  Yg4흀p4OASH=vD3c|00na !2Ѳ9v Z 9ԏgEp/62c kiQp &!qn8S۱x,4wpM\_-o;-H.>CжtiP_ʱ;c1X[zq-Lmscꄏ:EWp<48-!|p'e RpmDrѩnx ^fo& lL$ʇ_N)D NTzZ4pg剻- j5l۱La>p\#P7ƅHBfh1'@2H FU/[1c/iw gBDlPm^Ǔw\d&l2=& ٌj'T5U8 նr@"3pePw9aj~A*}CfCEWnn$:ODb C!WooQk=;s ۵|@c6"YQהF8Si W4r vj K۾H ݯgNK;DJvQߌTTPcq/ڐΤi2o/]XsBB ׵Vb4p/^!{7#cbĬ#_DcޭTck&ݱ-DzÀ)G9mWm/2&巆u¿Z _r:˩')@=΀6y%oK8o:3V[a{r ͐ɣDFX߷P';0m1w¢Cvj3A4O8guyݛ!8Yø~tT]+_3PCXY$g,d>Z8ez$VmoyÙ' d6 e*ܩs߁ܙU=0c5iiNϗ={𱟳28ʩXED}s>-3þȾ}nmAC4NFb68-H9-܉w ]hj4i'}Q,ྀ䂓 &A"@}_v$_Ke!\x*/$*ynum B$R@郻N_w<@fÐ>==oW'v,-y-16qU~\So.}{UǻilpxJS7k9[;i:cer&MCU!d7>qHXj5&#A = $\ i ?9T|L?wA#4=ʁssvT%ׄp䳲oo>x YɭL@߅SLS\wYxg\8U5 1߃?[? ȡ\||G ;FݒA4"1x_1c ͶTHE'FfcE.YǢs{9؃g 3H>pH=V]gtgZ @IMdzMOUD]o9xh Qp- dp[rs߾B8lva)Qi2~ Oگ~ɘpZv2lt IoeJ/ g348g|Z9hpk… ˗^wu#sc1cD-~Ћ!/ $H9rZ {B;; mi!ida^uP "Yom~v_AOg\ pfǑUqWPsu:)NVfj'ܳ[ȁ:#!R;z7RP1[9o_wra_|}{my2 :%'Gk"grq pr_~3D WACkPGH߃p֪9s8_9uuud2_c1c#vKN԰Np./}ȁ!)!oI-O;o%}4OXPa^ IDATA U۵A>Dž;u^np|/cK&{ICdyN0| J/6ӝ:!EϦ)T# Xy%MK3+6ig ;I&]Ý,)u(,dfwhLv*X/s "8. ~YmU!$0L/̙3nT*uhZc1ƘF"VcB[nj\xR}!:ݐ "D(nm .f(5̚3?rWݼE7d{chpHv=N;N+5䂀 F~{Ɲ3ˬ} |#䆝%8xfMUFXR'ٴ*'u?K%;j}Ԙ 7_ WOc#t{pn馷744|;c1XީR"4U(-<"QvXTTo$ ت䯂GՇ168]P8H{l,.+H5WNT0 p() ?g:|XDUV@^lٷI wuIA㺡WXQ2ʕ+&8R/_~%qSi\8Ί? _jՇ|5k-[NUV= 7H)nz{{ O·P8m)6 얿&-RM5\9۝o퍍q(ZSY/c1jF:aWX҇~>]o|yݛ}c}nȪf16 _ozc9<$q߷"  _4Dh+Rc=x{6v_̺?:57"lVG~,O9XNKN2bqގ𚢫[|@JRJRG1! !VCc8Ώ z;00POeˍ/(sw*pi{#0MQ?3?6މI|K_ǖO|{׹q<$T* ɬ#C|Y*5}߆?8l񮮮KR%-Yd4T*4fG{RT4dm4qR|!>+4t8q=fJRo@ooƗ,Y2OJi>tE=H’yXl 4G*i< .`# 'q\xᅏ¼1SM%۽3EX"R1'B4v8 Eg8MSXk-V*Q.NzE] b 'ȢE+)>= &اd\2N3yc1V nEb@b7;ϝY~wO@b1ȼbFg=\lZ$柠^SȈ_VQ}{!C4N;sj7fpXi ~ |1U>bW?:7m6N8S Ұ̬IRsK<0zC6Sg,[jO 44,۱&mvpAݱyZfO~r'O|k_rGG':YMm~8]+)t g,u#~p-!Gbα-CPj3y&Nx{6ݣV Pt"9؛!dJ} _/S֥Ƨ\t $8P|+DC+ܶp::yd诧L믿ɓ'Fq^fժU^pᧃԩS%̜93r_5sП?oH^~/]Nc̙1ݻT?Xtw0%x{n_sޣիWmҥߠ8fΜt\v.]z.]Zz HaAޣ?S{|S49y-GG؞{n=ۿtί===i%6/b;73t u:yǫn[ay/ g\$l0|'Gn/%۳Q]gL$ o  H Zv!υ~aQbqn 2ݏ ,) _W Z1a܎cc 6i[OlwN$?NlȾ}HyKcURһ; |pаt~~뭷Nkkk8!f~EџIѷFM1}8@ >3':#@5SπҞȡ~ ;nDf<@87!)13ᴴC oi1@4"Ԣ8u7"Y"PnuGQ> WtE;5V3e'rPU^p97j'{:6nڧ䧎| _8{ҤI:_|~tc1ADYlbEMqnD]{ ۱m/@bN΢Mg%|svUC4W .J]$ |} 7Z_HA$ ^P$:_0u5=$?Nluqmz'oɿW~o72"GkDs27Xc>cЙbU$y x{6Bzi h62l7P"w^xW7 RC\{}hȬ{L ;yFub8̚A8 ׵&HC4`^x]/g%EuU7B۵uKt _ޭH{{TDc+Dj o/[+޽[^~_uU?nx ٍO;UcRSo/2k1v/?Nj4LRR^즿nR2aR^fP!/G'*>η"٢1:LhږҦ tqgXb\JJQ 4M,+S-u\GN!_zM/de"$8sX9c+ܽ1cMDAEo-P$Dpp2o K_l}&8]c#:Ff|f9wC٬;~ZNq1ѷ uƪCo1clh_;Ĺ{\QLfvc5ġa0mܦoLleNfw1 ۺ@q9V]|)kw`?6.yuѐf1c,B'3 A - )eNcl+%JEE<Ͻ~ t:h mq?8|_n:_YlAZcyR_D_'M,cՊ\Mx39,#HA=UZlY.֩cl0V*84SB=R-F@؅Fx!},Qk6}G٬478xOOO}ζ!2,Z9l: Lv--`l8r8 ]yr2Ƙ2wh\._Su:F-6\1Xc.6Veu>FGbB6/]h0iRzI o4liUEX};Q Xua`S{.V c78C>1j\q UPWP4@uΏ;g=-`q)m熶NLzouV1Ve _.ێ tGO|qyiզκ/8A?sۺQj<+'\zÖShgp") ̄z-FGHx@]ߤѝ c.vavcƔujLeUNnM&3E>]n(jOܤIG@!f*cc~&>j Ue?_w)9N1V]ZlP5ob>oK,2'xP3K !+/p''i\ >^ _vVҙ|ڛI~4NbU5QYmAXK_f[/MJU1cLSPWYAB1V@]s\l=5u3(+obc-c#v\g;,~Nop0}?3V16~Ǵ遰Nx6ت܍ntNzAL7ٸu;'6J<;yoHCH54n['LqZ 9T'eQߗ[i!c}+QX 1U}&Ԑ-B 96;Il ԘP1' | !4J[Pp c~Q[ oc[e=$]Lc0vH 넯rvŶ ~|F1&S/,wvY)fSN]fgLK@gJܻ[z!cٽ[]]U@g*1zO1H 5{x@ r fIpe.OyӽYL1ϑj{c zg; ?~#/8+\p-7cFf'|`@wȹg{t_ <O<泯PYgo9MTeh>@?o3_O|+/Ww"d#qi>JaJl0+7Z ̦a7N`t3O;-wXXt!7M+64ҌuO`Z &C6r6lS9]ޔP~Ԛo}KFQ:}":i-ΪYܱg?ؽ{~A({dpԕ]@ݸt?oFqZ1ƪz۰:r埼7>K #yϜt²~isS9`ء:{:Nw@\4R\\uӃvOoJF̻ CЄ}fA2bldkY> >ot>23)>q%Wa"BҌ16΅꨾'< Hת쁺AR>թ/@}qc_1ߐ+}+cmϮ^Mۿ@0~YkY?cc$~l|BӴuon|>fLrldCwߟ8 cϭyi<`le8>T~]|ُJ)h%L$dyc]]'&̴2XԍX)}%E4 !ԍ\oꈯ>WnW1FPOCS O%N<?8caNʇi<ǶޙҶyX1Ve4 2-i\鰘 y7nތﮯK8bj z{+sC;ra)Y)mҖ6nuzg}Ywj0f"o~oP؏M0m)c㉃K2ZHgLEy7elm =nJiڔOe3.}#\=Ƭ|)w|p IDAT}Gn mv1t<,cvp~ tz֡ mtΘ{yΪO&N&ÄNqɠ+Rz' =º-몛_D (ݱi83dn46iSh~}J5zس~D`xu8c<>~ qTb_4Mm`'0x7pKڌI`gWKa뤗Ҧ9M9VaJa1[^Lu([\HӴձMrqcSi.[6aJۙ-FxKKWT_\cy}C?|e47Ń-70c +Mc͢3etMC?{r+k岴MC.XyXZg3•tK4;8s[LN/3:c5czmqL0ʂ>i-NŭǢ>{L?OxOOk2>o~tB+-))c|gopMf_+1sg:sM˗-~LJ~`j1@- v%3i8uc1RպZMjm0Ũ8uB(C@N4FA>*mʘm6m7iNӦ|Q|ƌf;SZ[5c_9qh7bEnN'A41cvm-iiMCu93ڿ .W2[wj[/[v m˘bAhhZg3Ƣɕ@i`W2W|3MuĩԣJ&hsyZwT?* zhf6nTJ9g).RD|bg1c~qygXL.|ex~9wku!=O zٝ V-,ygCwaySd[][Nz'XL&[=[<`mn)j\1=-_ٗޒP~,9E:u(H-c1&۹=4tMyn~:c/zc6=,-{槿yM_tA֏\cz>lNlqXTQ&|,,MyEתL;rc2ׅlm2dqgxdꮛ?)Z8Dރ=_97^B>?XX>l7c1Xm+:ki1yj?~~:sq6yiǞO[~嫧iޔ11[>`3)dt# (Z7鼒tI:(jj*1ݔ8y]X+mݦq6L+.j֖;BKy@O?u\Xg 'ϣb|g1cKoL3(}ƉG~r.6y'GL˕ ]EF@i{ty@Ӳ-;)mM[/v̔6h:N*g屭q%Z-Êsl3$rl|wnު߇rq1brZF:Sg1c]4N2466Ɩeiu_)TJ+g78Þ?؟(-6K[1QhAZ mZZ~8ž(-W+ԩEqv:4N:N*g峭4nW2C+9CSNO%%#f !رI)/gMCvӷw(lqt%@T>`3cG.a1QK/8S&>(8]Ǚ-Bԁ7“Ro;?}/_aGL<*flq0ܦ2qҕ8^6^Ddm47ot<U*g[iܶ rXytE7Sm{7˙bqaiS>`3c!?0M8eMlq lmin) b4Otaeaosi,,7FũSdMl;{[:@c4OE [im #5X n\xTa1۾W{6uae1cl|Ӹ-0M1<*FӦ<`Q qnz /"q榘>8c zg-+1&24F&q [ö5SmyX:N*gJԶG4|؜ic1vOlyScX<UΊE)]-' +crk{n^ `ugj?;i=Fw(z}-3D=Ƈ1*N6zL!FMstpiU~l4M鰘mnlyc16Iix3cc{ `[r{\:2iZG4 +clhaFX_@;Gh`@cZw0zhy\qTh=<*U0Ũ8uXuEAZs)žO(ebQXeq2c16HiJ溰 ⁰ [n" {ؖ|[6uae* M;zS vO1^V߆.83V}mxcT:vea )V c0a aC%Thy7N,n^Vc1 [Z bT:#+yT"Lez,*=M3jPt:P| uuy]Vn*q]:ld-  ҦVn;j鵌TFczޔ6)Fq2c16IoPz)m7i<굌4k&VFay[Ly*1cMo`8itn,â2=NMyE3ƪV;QzqqPeƳ$2autq'-rSfme@&ȋ^:4|9e@i橨rc16H׾1F9׉ ^TNc4Ƣ9Fũc1&.~S9zV2teǡ,h(EL1]T9clN=`f6tV׆>ơ@؋}viS,`z8LU>-g*y ~S1cM|m<*k&-0=F\Yv"{,N1]T9clNxt1픢9ޗ8*YeX퐈fLul1vHlMkD-NJ~ƍ|7Ũ8uc1ءVхSb4ǀz[}8W{f7N@cةc'|tb:E)wgqZW\>n˱#_S (۶8}.Vnb9nĭc1-q8-pf"zm妸)c.ێth mZք/qU1%ؙW1X튳M7Ũ8uJ1r˼)<{oJ8˘b@q]:1ciT+*tCMmlՊai$s<H<&MqS=S,PiIGmvrKKRŎ$g㣪$! .uER[˕$VݼmmjZbR5`kbkD@Q@Hɜ|sd$} ̙%pΝW\[|.uϖ)s~1?RR\PL~ι-|ue۲+1Iys׮]wys$/~Wywqd9];e{e\r:d=-[ՠWmg: e*&-j9:*/\; xq5_򗛟?r- 7~7O0YIZvK±;s=;|By\:t߇t9׏?FGCGrCEXv;=!_>r-3ӫ~ӟ^~ v|ѢE΢EqqBƘܾw."o[oEgPɤ:Hfe[ci:Zk>7Zkjj~4qϞn,++[YSS_nf?A-WG>@w=;k33H@ t~.ٳgvF(h4zԊ9h4zH(h̘1jkkU]}~j^ܙֱcu://9]}.=N{3_xcdrܹs/s[uu5DXI/H*3\?nܸ555U{l_`}ݹ;>.q|1䉾*@.lKnIxƘ3"cI_~s.{gpx%%1kjj?Kߡ?ۢEZ-ZT{]w9}ćht:X}?Y z(o_Nz9s}H$Owypgotw}O}X)>@boЭ`yɫ_Z͛{;u|G͛7o$]s5ԶٞzN+A&b~$=H@i봚BMƞjkk/6|q˖/_^0cIA>$}Y;ʴ`'FxH$.cISǍ1߭ J_H$nT-Ilh4zc,kJxaq;sYuu_켁h'_H:ZҪaÆ/~q$ig2S>{0 Bnۋ.ٞIᖖHR8~29=qSWWwƪyHtg|U3&igDtv qTLRwcIq8&LExTϟ_TXXcLieey[`uuuMל}U`JUAA2I78sYmmd;9qE"ߟ?vfExZMM̺gǩ5Lqyի\7o[#IC1?-,,|v8{``PBJ:BVIWܹs>{T]]e˖͐4OZI{cꞩ0hpOxK:IR8Ebvrw&%cf8}+8AH&N2tܹKyt^,ktC}}D⚖_9ExҜ9s^tGb$}Վ &U[[{h</;͞=Q(IR~jkkO[@qI=cK55517cJ2Te%_ P(tɜ9s^C+v4c+i$G]hI+},,L$S$}[1dx<~W$a,{诸@wWMv$MBruu~8J 5Iy$y,kId*OoG{~tYUU乺nvgf*9Q"< 555CCs7]tQ8;C7"ɱXo(1ǎCݒDQbV /D"b8}c UUUykT$Xx$ W9cx$Mlnn-R+ 1ǒ"x<~a_N; Txm3/buOҧgsƘcDIk1/yIH*-[cpk52ON1pIa$ZUUUgcp~<8y֩lSWWT<?*= ?PWjjj0ƼHUҔ2Rb?&Ƙk.(IO|Ν_dr1Ҫ%vpg7J6q~"itUUkv@_ +++8`\'@^hOjw{,^{=}x̚5+a$p8ei6L&_#H\5o޼v.|ĮPmm ǹF:sdeeMV:տ BJ$8Ηګxb; ._{I=c؂ I&tp*?y䮦ff(YҌT=IUUUOxuS=㫸NIJ"{Hd_ @̝;ʣǩZҨD"Zw M] tcUHd D"ǹ@IY`'kkkszQ;O+xu{ڞ&}>MDRg3ЃbIKR2lOAuuu;sHj1N14I/JZ&=IKJ%t"z8ECR8 pqI d!n0{Fc7D"$E"IXJUUUI?1 KJJvQ JCPRcL8Qq }"<9r7v 1`pJwFkZTUl@O|[X="<λϥ0[ۺu_@MLEŒ.?'^DF@o׫sXnT_j@TıQAԭ.Z:1:ُd*]K-}r)=V~nn<t')r/LJGEN9W.98AEllY-Wyg|5Iyd*OtgE13^;;YnA~lBQB;7k8sȖmޕk^GdZ߲Rn9$LI =%{@__L wTߜ_4?ַLsRɶue>~t%oܹ\ Z]m~k߼ߚi=4@"0cƒL gc_+$hi Leh׽\8="<]xqŽ1{0j_E"{TH \1R1L(w~ u{AqEx+{cA}{wźQp.&yy_Ls \Ak_܎utmǮ7o[52+Z)-(#oܾʱ.X&}ra݃.cݘ>~lذ4I;vfJ9*xкg:g4] gb @QG>+d}ʯc:R KA}]yC7n,rga_&J^eu˸#r]co߻Jb~?Oj(#_O_1(S,9{lΛ=+5y˜SMÍ1ƄJCaSjdʌ1d2`g[KKI6jN㏗_7mȿh A~BݷK\^\vo= r{ŽȻVo}g ExBC~\iSN)ۨ-,(:4M C%<2bXc8ɖDe֭ Oګ8oMy6׍/i.;ye}|>wܸaeCC"hxh()iI&NK˶D2u{Sa۶Ɔ7rU ^..}gsbtEx%#+tpko***# n;`?賑HHcL'pp8|QN8nv;w=u[â?<|Ө"w-*ٱLo0(fobV:oE̝Q^>t)pdP84% ew>:v$ɕW&[V45xk{yXDu粖yJ{uc.3jۙzK$M{160V7nֱGJJ*Ñ>8jڹs_6|A]W^yE{“۷~12F/M$$)b1 ?8>ڞ~q]sF쐢F#(㼿s׮lmhxbN<5 ^x/fX`=7^S^w~E#ooopy)ωFԅ[dr}O=m-kE~.[W1Ex([o3ԧcnjYYX=SdryC{+X5pz˴~U"ig,= 54δ :j轷zÿ Qs }_;oe*j7n\A}_ y"VHw-f$Ow9EC c!̿?_y/ieǒ _x'ٯ6N*Ϯ1lwB*c^[3-D%ϴ.EA-hǙbfgg^FI=q566>/_rF7j޾\A}_ v7@O_kAcmbxӏ|no B{ iw}u߾-J/(EbFZiAC/mv7{pdFjq5565O׹aOv f ;+vE#oӭ;PTPpz*g@rmÍW07oN})ok]~1+~+=p>{yc8Tjn հg-:ۺ[=7^GK3^#1 5fv]4iR.ڰcJR^ss_|۟Ծdn/wtvt?gz5EEթ%8g?e tg|&LI =%{@6+"RR3}4TGM|%lҋGAM֎}1ck~w獬#cTК/=!v _u^blcԮ "JkOMVh^_ɟg4tj`dּΟ\rI?oAM>}lc2Yv4,ʯ؎=Ђ_)8 W]=S'OH{!3gݾ˾=F/H$&IHX,d_=ζv}vDv]W-+v*K$yiuܐF{}Ho̕m < z_+‘yYxG`Ƙi{O^.srA>}7F K:&7;~cO>](t؁?Es\ٷɴ^[@Vѝ2% ޸BB?{?),~޳L j黼}1+s>W3P}[_}( ƌ}|Sà&6So (£ℷB~v/ΌY>=_wyz߹g~c#}pxT.(Go>?~M>}7 RB_Q.Z"%_?oٱp$<-:`xyk_y|u/O/ftMйejmsp8=,ǚN-Pnk|.oo (£#b_k+|7cFя/]h>1FJ$<첝G9{[w3ƌ#EEmgi黼}(£˂ Am?‚cBg&w+?pJ^ޘ=o<| :?yr>!sW=+snM>}WP0QGw v"+{!S1M+pSվd]<{NzQok;uݕO9¡>褡CK.y'wPs}o+(x+O{>>f=㕞>  v.bIf?|2eƘcx(ҒW=ؙj≹l}ϣsnmZj =S4O Kfz|~7 Ưo'v%ƥ^1|襩}уiߟ8sR՝\ tZkfJ29OwcLajM[&VfZ7ݱ_0$ig2ӕIV> G~YxǾʇ~'= =Scf\VVV5}L3laZys>s!wPy%Cb=*Tux>`VңVm|4L{.c+++ }!?S>%c^zO8"6Y}w'( ;2$s(Oi =jܘ1?N8q ʯO/twD}?+q}؍ׇ,X0}<祑d`!eG!_׫O,q4(£#2⃗]0rq\o^+u`{ I&bICIL={a )*Os.5fdЛФ|:n+X W|coecLYj}8v?]>)lXy}g7Y7^Űa_W*c 9؞ @)igDtGP.>xrsN=ˡPhDj0b#.L5g䳵+**8{J*O?Ncvqy睷ōkߡu+.o|ecLqjmɸgRZɚ NJxt3ЍW|~)+-.λyc~}ty睷%L>(ixmsdA }nk_|y(˿V}I;v6wlP`]~E SZZ3rE!c z9,DџIa}H"x ;癑d.9Ç0-}* ._WƯ`ņ"y8Ф:!mpv8oc;cͯ˽ȊCX8k& Y ~ɳS}p8<As.{n\sڟ_FjCÆVe"/D¡q縥RExdh`21I} IDAT f|pAiIin2Ͼ&%]@ d9aǂγn?<ONőg8]3mAqI2KnN eb]X$_\P(4C)+)= 3g(f:kAj.p5Ws|a~c&I.9/dFUVchocEx+ żon IJJJf*d^~1t}5ί1FJŐ :(xm׀=ck~i_T$\Ov" vᡭ!ĐǢ+qp/ }lc?N\ U/9mn,m4TXTtL*߼_ Џe `;ӓyH$:%ˮ@d޸d Đ"5{T>v+(`d*ZǏ"Դshwッ{Nv ,ph;d^2|egP|׿ um-sډőpxB*~bq{Km<1{0QGg'MYii5p3O8m 93&/|_%+ڊVr'JywÇڸ]4bFje|a1#T^ZbetGzIqf8͞+CKmǔeȅ]4$TXTgKfvIJ# ӧIRY}eFw}oIYa J@fʴ귙4a Y{n2ZIҤqc4cRv=?dRt#u+·}1lkay@?G] J0o;k=ߡaʨ^ys ѡeOJKK*hHA <{}[7$S^VExW4; U^ZlOQK2h$D==Exvt]h> Qͯ [uLȔe1q겷b:5ܥCKu{k ;URko봵QpX!%EDy )aؤsmo K҆HEw%}C-yk>ܲUhİ:hꞁ 7A@kc&mԽ{sXז=W‚m~Ϟ`3@?G-,ӄi9eI&?j ),PsK֬ߨ+֔ةG?1FڱsVݠ__=ǏioN$hr}Qϼ 4ϨPP]*.*TcZANLI<ԋzqJIRɐ"BF@/.}K8P3?o>ݡ -qu F-u4{ {~q17f{^/~m;lX>ܬ͉9/qtջZz6nWA4G}Riq.Iؤ__7+i˜:l'318s~ϴVuS7(£3|Gv@Q_[FڲUm٪ZoY>ıcgxEM]?ަX/JG_|KKR'}hZ騃KoG[j#uC*tAS/5ۊw3!ptZ̈a:u /W"|$˷-Ǜ:KGttߎ;IC$Ic.:}S{FϼZՇ1yb~G{ s [MҞvB4bQ V[cGƎlÖm7iAlyM%k6lfH$i᭵hHG64VAD14aH qfnG#-^zcZ8u^]1: 0j9iv֛oʵ4%#I3ٛ*3S'ҕkM9na7:,KwdA*SƯ2tM!+;]P^ٕ Z綽'Syi C&񻺳]PѰ SEzZoy݅&%ِ=]LǮ@Keߠ߻oytM.ǯMk}em=q7X^{%0JWK҈r~İָ'I.3CHU_~80`PGw,<$Nc(, K+.j:~Ɓ|o-?cuf{Vs"_0\S2gfll783uEx-]z %ɌZ.IQ_+ fy~AA}l>1{ INhI{k$}3sOnޏL3RoV]gE cFJ^~V%B1Ls~1W\8 ~ iNdo]L&B>-KY]=x Ym6E$mml͓>q[cFǫ/?fæ?Zs%@Q"n0}3ƪbϦO%i}&+7Vi_*I͉"Qw4nFUk㦏om6}uYsŽ+;4?As===Լ9oN-(.eC't {MmDEa+#nKV{ߚi{q7OƎt-z]p2y{nv % [ 仡:3'W4}(D"jlڡu7iu:nA_*]NܑӢk͆:iJ 9>ڢӄ1#u玴w;wncTP/nDz]1|%vo Kq>WR|lOcQyI'k^?FeCtĶ$IN?`z7ҷt)i_ƪwːчgHjp"=ϾK>۹ (£GJ4;DE[!%N!zW겷겷?VFUx~+3ߟ}E+VӪǏ6~O_T{c|Gǒ,)܃DK2/ZZ=LSy9}#M3B M;WhkvM4^&Mhgt0za[u4Xk?H-^FUhMҪ>đxuٲf;D=򲞻q&j~Yv͉3щ3ÒZ㵵q6 GJDHzu0ұ3cgaIҨ}+*vڹYlX͉JXE_LUO<[VhW ~⻝4g繂]@WIqi{겒b;/L8Ng=Kzzx8Lq3JA 3Q( KV^$E#a{D¾Ep2D˚&^_=gJZ/43&v lz;o$ɆaS߷)!)j-j-cdh.*0[#}]AqWjǃ~*׾+@d_nYMKsnުUḧaF2}N}i¡ƌh|Wo~8ICc߇O=:i7wmN]<~IzW.yc͉Wt"킫ˎ퓩zwc qqՁ`>;׭]>mj}Do9|FjjҸ1v8‚ve}iΕv ExtEւ҂|vܵRS"_Oy}~Jc~|~GN>lp8<46ep$PȨI6$[- -69m4~V\+wϽ{fbAC~#mٺ-"|G΅Ex??Xc"XDć6E { 3,e*m~P\LEE_5m=).*<(-cF{s6BS&OsNԒlYђHؾU{s/\i&GB|.\؍e{|HZ wM"8{^۲%ЏQG6~\9uk3^xT7Pyl| ]ߌ;g|6uS GfDšQXXC*׆מpgs?7=t9o]k7ˊ D]^3vx_1N}ZutEEyGIl?yˎ[8v]ܝHw.ve,ԊaHh\1ƌ,*(8u,֭ {vŵ}aݯ$>8(6X?𩲒ǫعsג؎}U4RH PB"AQHQ,( U@@@  Bz!=nvw=̹wf-u^ysfvg'(fٺ]5R?؄vUv?vټTʮՆ xӪJ$5PQ^簡<̓8Yb_w9eʔ׸G]qS)nsWsG߯ƌQVծyU2cf{D,7^>SI^?'lL,bK*_;+*M?j/#̌V/N*DEqsZbر/=#G]3k=B2tߝywĉ} f'_=7ܿf^/$T|foycNyNVе3j8Q@Uf % MB"JNO>3!IP35;WΛ؄GnzwOkKRYYٶz)~O|yoc8GcccrM}m%o=# )iUƭMI^a imC Lg!l7*vo*g_t-gcm1|ؐxoyZ7QC&v=MZ5s%/M(] o=su4t:^l9Qu@F*`pښKg|4ka7t̚=^juhU*k;$z椛Ədoh[ee6l z'e#{/#^'{^2)dOWP747]S_x:c讛|{oZ&b(fq(-g#ٲޚy]>{̚ 2@f 6=Iܹ}O^knio74?Ç2=XS^@Dňj5gD꿯'nN;ueGdc_+mFѣG/}owvFfg%[l>U3޼䣏bq(ώ_ZjUGKmں\ISUp4`CI;]0mD4y Pͮu_֕B ިp8CjmC6I@Ҁzu|K~]P`q(/eŞώSn?Zz,^|>hV^[^&< e9mkɷ&vGccOj?nqПzWjfmGuUWS}lf?ʊ=uzkT-iCyOb?Qԍw޷(Tr?7ԯ.B~-|I9Sy~t޿1qcsרM`?LR&}tf?"[7{kﶇxyET{ IDAThgR>}e?)InTJ GKuPq>y_4QP `vHRT*՘х._q)}oǣѸT&mMӎ?y=;d"%aC[(RlٵquZ4{2{ ZZ[?:n X/Q|?͙~tWW+pLCfkͥpD5d]oo?~| W]ʊ}3z*/+|^F=F.v' }fq禦u32{&O}=b ٮ965@GqB[ 5n}/YN>*;}>l6qk =W>Q 缯Q !QRf?<곔5fΟ&\ ]n|3Pxq=R^Wb4Q($5mRdӧ7=3IR͙D+W~GڏA[Ѹպ߈mCo5?8+reoP^grϖ_ѧ}⊕+ʬ R{'Q˶u@rqg\sc;IGyrIr ?m}8bxKö[L4ͳO<[G?+k$*݀lY ({wNǶ;ox)H <lymO*|>%3:hmv5|b3}0k;MʽNF iwzYDj*8T]]]>ﭗ8tF .JGOMUn< 5P`qG .;s1!y?Ѓoo]}dr|6/Uqq+8 &͜=[Z^p/~Ԕlz9X_~6 iH䌇~<7L<ࣥ/ܣ{^blUl3ײ ބħډNSYQCwpwp { }9Gߺz͚2AJ3/}?R^}]\_t7J:V3ci:P˟CɷmϽbcmH$*2ukc\[[ۢ&Qh̡qg O.w~e5}f˾{6<]_?dsOW'V-\G~Cˇz@gAǟro7㆔{]vl}.t=2cZ7Pe !n WK}oOׄ7z[AǜK} &g(ŭumJ4^|/WTTH$1ܮg~9%s}|斖%a[?}]=>~Z5@/ׄ|q rۘp#y< g.KccӻO1Qoc@j+٦mlS7qO&<6TŶ!ogy =o~Ig35yܮu&ېM'8Gˍj;4V7P[+~B5?f}?{>n*jL?zM{~%bY5@/DňkصBG\ze_Tkּp_=ǟ^覻<\~-Y⚭Q-W]Om߆P^^գtrC }n9YE;"?'7eydA(ʚ},XYnvlCh£#&DmN5x ?ܙZ!Ҳ+#k>@5?ŝ6bC [[K{gWJutG`ȑ 욟۵R>YO9Z[[W,_?s9kF߶R;(m0DmdItw޼Nj^_V{z_7Wm5Qk IO[!ݮb}?3jGRU~ݚuLIJ^{۝K&R묹 fμ;+}BqHT3&kAĽ_TVV6,SG v옓\ w+n2BoW&vΟp;(\ׯmx__}_<%>{ N!1 b a 5GפR}TWWu~˗/a4 Bkĝ6\mF|f'BI߿_:2,lsW򭗊NTSY8_u\cc_t:䴫tB=&/ǡЄdžj,&ۆm6DヹsvaXzZZ|gGi߿+=Ƒ}P`_s3kچm¶o}~5Շy(!Db/>qg~.߰w[GJR{^1c8~LR#gOz^(?^W;Bk !Qu@JGިkb(/WN^HY(N(A9+~wO\PS]zT*ո%}_]ГϮVt-nw4w?=/$}'oŨ2E jllzqֻ}QhU w5.Uۏ9v휏Xs?3 _T2\9?3\hy?jFxy^8Δ=5wE7~l=_)!3دG-94r^]{<%lumwJns׏qusۏmb1qŃ7_.;nw^MM!R).[⑿M9 _BRlE b'*A [6=Ů.5DtU[R5ufΙ/ӏ=ֻ 5lCCfv_;C"ք+tK3A kiioΟT{ލbcyqW!tqk]~Vl6 TwrC.HԨ[n =o_sž7keۡ@q(nH:/Ox |生5{2qAdkА_g3tFTVϬwTJk־dޙ:ڷ}a[.r5j9.Lkq#/lI~=ĵ7߶[wb 6.e\q5uj_^Cv1 [ݬue˟| &755!|nFqCPt_DIxvr =Ůǡ<&Qh-TByUUU_=e's얛7|q ۿ_͘&ϑL&׶5/oU[fGKΞ2Yw=oۨN#$ 6 ?/|BR1c*gDbP(q̚s\s#ǡb8[/SmZ[βTUY:MzWԞvoݏ9Ѝz5UU[gBs]`wH)\s5 @ͯ̋hfKmCB^ :\=_C^yhq(q)B_R{S?rk ƅ#cZ!C15͉CywQBRbP~cڔ6k-g9KGjXe7T*6t=}+ʷr-+K(}>*^ {ﵹ= ؟mʥoI.g[8@._sqh5/*w?Q3~ǟm=*v8KQXժ mmhˑ#lY4ږն7Ӏ~4zpTRDե?s/leNcWAJ緟84=̋ >5b55'_$)6dCeu[smcqBBj84;G՝zr-v-G;Q#iԈa\v7nKqOt=tڽ=QJ綟84Gq{ܐoMZ{rf{┉]q{5G՜|9mh£ߐIyid͕'6N5oBM[q<NTaTDd]sf-X hU]5nv?NY[Z5Կ_q͘PSgQ]}=>64׬m~KW(%i-FjϝUyYYsYDs-1kYkUk5Y2hv?.K*lφ߿fr? s]6wǎКbrf"tkqq(ۚ84;rЄGWK)9箑>$l(q]Cqh.$kQu'b'T+58I$l;ܽb^wa(šƾ|k:Q ]7;rrЄGwH)yh{|~~(4U;B̎ͥp=8D6[ZɖUUQ o=JێLzC:=߷Yzv[:};+jhʌu:5nM%Iޙ_{GORɤ>h}f]TUY'^֌9 5sbmHii;4kY-lUkN$UTWo[sܗם/qqx˫9~ݟ~OW'{<;9h£ݠq MP^3`jRw5ŶϡZhr)\NQo8J: s}ۖu;kOؖb?.ZfQ-Y{IjmMwokKҾnIUrpO Tx 5$RD"ѷ6)Jk2xIVj͵-~(P"!T}8Roe,z+6Gizy:tTS]IKPtuo?}UJ羭ܽ_u/{hzn'B~7WsoWʥp ЄG)I)ckb?73lc iD)$Rk&Sۄ9w67./}wD"vZ/>Eg'vZgVeEvvޡ57)eC={ݡ]s}B5+p=Tsljq~)f]nP-kDU/ׄTIIk \|q!IDATٶj Qq(wW* $4k֒mdVzw5齙Rc:8UWoYoZb?}EJ'[m= ?gIki=Q׻|qr)\ I:/R+i7&f/*HeFT-_RBqHa SPZ\ RTu~5ՒKV7_*вzadI+IZ6-9Wוuq蚗zn=qCƎͥp Mx&mȅ~-yR73SyV\ʭ]s If(UWUjzj͕Jst!h*ǎ3nm6x6dcí][y@ ] VFq{/ZkR56Mx~sFP\C%zG)ާkn_]Uq[Jk>^Hn4P')5Òn5B;lc; 0P5Q Z(-lRvͮ\ פ:u߉w%@w;gBPMwPК]zf;EMd2h W-%Uɔ{1M&c J~V$%&Ss?+ZZ|U|q(fkr:{wnWxYjDK"P!(1Rިk}֪5u7QCYYBÇnC7K%mʌjZ׬Ou7%efCC;97\P ﹽդܺ/w +&_Cu~gA[r/4D퍪[mzh9kȣq]V^uz)*++>lguƆƙ|_0)z^CZ+.ůh£7j$IͤPC )D1˷7:2۳?Ϟ<,\7?n6x9֬mpMBB!m}}k{솬ǭih£7k$I  B)71LIݸ:keYYP#Q 1LC [: ؚcs̷. QۗoNEUFݘڿ!~VbА_;qAk6x`:~-wR-m=B*3ǽwQ׼ vB~f!{eBiWhSQ#bvž$XUظnҳ֠X!jOT y1ъKфG_c9լ)ߡ^\U׼%leL =\\u̎BDŽFb-hMjk7[krZ2\mQ ^j^ lu>>4]$owOI$ T.ieףSR ߏ:.IZjUkچl4pv #L]߽I\MbbDǑ (eo'% Q/I-tۄ 5fCߌMIYsqPV^SSxvlDygB\~:J 7?Tm*Jko⏧[9@ɊOwJ]Bshy˽\R=Y(9---n-JWII76v+ծ4XR_tK1߄/TcjBԸ6`ƔgrK1Ic:bXIJHڲ&-it/ۨj}Ӿ[ZZ v{Ll[*^ׄ>t6ېu5!IUV~0km;QV}ŸfVԱ5'$ 4&| 19tbykmY߹do ϽxڏQٚ]nwX5SV@g֨6gmj;4ΝoQggҸza-HZׄ&kr ߐj9 ~{LO"]˗K@gT@}SFm$~7B=Y'4dPtL>MJ(>mΔa *H |QY3yksstT*; f+]l~ ;%WjfmڵδiMޜ^t9pWUR֫ "9>+/]Lf/HssUq\nj]m{ӄPB U[+Qn_R+^ӛ$%3#똘![Qu2XҦ6MM1TIIU4Y8;5x?9d3D-Yv'>w]J7 mٮ9650X I6QCII y@҉^~:KTQ̛H(~|ޤ:dQBill#t-7 6.UvTh^0An@WV;Bds ߿9=`dmh7@ZL^*v4uIG o;vZVcy'&B(oM)} 6CCfP=:@+%-2L]6ZF7 Nߴg2?wT{_pB9@]%}ZRY+ R4Й⚯9P{r̚sEf/6в+_{G]fP +RI/IZ)b!Mx) q_x6\sf؆oh$w?/[ =?Ҧ=5?3^OR܄#$cj5amͱ\of5w:,_aԯmx/s˚eP>ZN$}Բ^h~Vf79tۘ j '%%kkk[= i~׾|; : qv +}$/ڄL~rSpkav-k}…[xmBAV}3ǜG}V43\=C ?&/ӄ$ljUlAkʓRcw?W3>}kɲQMB)ٚ]mkIڝ&/ ׽A-jưm;p͓L0J5 9f͙O-[֢0"7?4/Մ;#_?e/@rMYya6O}ȓ'577$I+}ճwuMMM oy԰Zh]tM^ %a y$D@Y6vC,fv#TO{g__>tFox{W|"7m=.稡a??*iOIoZV Jfw78Ԅv'$UWWNq&J-ɹ ݴ1_âE˛TCm=_ݏӒ$}LE-K4Ϭ@gpMBc5CU7q䚚~OFg{)>pƣuu 39Tk;qP 6tj;I6!UΗ]I#$=/Y;.u>q%VzʊM &ko=-_Ezh5G >tMC/4kGkL\I7~&t{ryhӸ6zBRⳟwW_-Fmzj"Qкt/kne 7 m  ҷ JBj$}(iW{B: Ůaǡ>ߎ{_=|_|SJR>Z?u- 7vqh(;Q1@"|Oզ Iot]܏C#_#>_mp_~NfgVL&.Xkx_x=Kn5C5ǡUD"a E(i%Й5]~5YϳW_>;xFJ$6awTm]kϘȥW^sLWt5C Ďrp3%M+IJj7$lHJ}Z+^Ů9q#jkg|ḍ{ޙGQ9SMM.X-w|עL6C {T7df;l-iչZʙU(in2tP;s4QMl {ow{x{?x7wq{هHT~h4GB͒j %}\R]!t 5؟ںohQMBF JN& Iwu=})If^7Rncۯfp«s}|ٱy>t]lBqcs)\. kW*i7IM^hy;Ww6^mJߢ `|kmB5[gao1csܯGlnZ(5t$="ޫzz)TM$-i_%L JgkB6CMq[k5I1TN/&W$]mjUB?[ 5j\'jpk|sZT.kxIH*j %m/iW[oy;g߆?I/kd])ސ7ס=2[k6د9ہJ~ԋ$[W4%iْ3nO1uJnc'ռ n;}y|Qkߩ8K@)RoLmGJ޷NpuW`=E]m=Byl;.mr'>%iI5gߡ}&󪤁-4mtPКO{P[s c$C G$}YR7XW7i#iWIHz<{]Tcs+i ZIuRp%UKJJ}heJT{@wHDQnF9nua7JgHKzKf&R`45;j؟Wl; $ݣ-JII/* @&f |bqv؟!wR#Ks+Q)@oJmJavf^c=BþJz@鞈oMmħ$=(iHV( I5l|C}a)$]O1Z6S>tpV()q]^*iIIm»Gx6mw?/nDՒ.Vn/ٍ?o+ KIz[4 ]j'!;Hђ^Uw z[l.~x_v#V$5(=f$45il|}@ov5m$JNFmQq.i{SR7Qŏ^"')OxAnUݜmo8#2IS^!Ll_k<%iq{IvR %^n65t$ݦm3$D[JϦ.4I=˽}T.j#z o?<нj$}QZuc!Ǡt:$7t3 St%=mh4KEoʣDl,oC9ʽ9Z{To\Jl}*n"I4:OVJeIJ*ঔOK߮?K?:XI{K:Cү$=$io!~nVI1tzKЋHVAαBtS߹PґJ~M}9"?<'3]WVqȀююבhhHuuu:::xxxivv4^Gx*AJ&<3Dr\;׮;AkK8X Sb)ۗ2bVu˔ю7.S6^G;^G;'߸Lxx|2euu{˔ю7.S6^G;^G;'߸Lxx|2euu{˔#^Z!cr#MW>D?zMm=t29v~[Uf"s/zY"o!7#%-qz:[PoΒ4M/3#Є[!iBf|*[*J(8BM>C?*?{:hhHuuu:::xxxivv4^G;^G;^G]g?)S[+n7 ?C>|IENDB`dtkdeclarative-5.7.12/docs/images/DS37.png000066400000000000000000000045641476226662700202120ustar00rootroot00000000000000PNG  IHDR2I pHYs+ &IDATx{TYvve"P4*4YQ1hUX>HNIbkц6hkWZ V$QDc}Wwׅe3!HXqeι_\!(By`7!<Ʌ>\!Ʌ>\!Ʌ>nbY8y'K(R(4Mב<Ų,˲N'B_H$"04M_8 ˲6MA!/EQ.86p"BzL&ST] g=[ `l!4pDQlk,v=-Lн!Ng-pн>&:- =>Ly^2 EwY  !}0B !}0B{K]g?E6V4e5!$ˎ69_8|])ju7_cÆ'l؄+ZEEEQQQ Ctt={/\qr+үmҋk ]O1 5l4F!REE;ڿ]LTr{Mju ( R)Φmwܶ;6RbLj|U~b6Z9O#aӢ/BXh4ccc V[3# /y1HKp߮ܰdvHܘop}1;R@l6Y8m{kz*B;7ٿ|Z'`Y3/)h皾$$UՐv,n,ԧ—w1%ҕ 0~';޳0wJuw&ocH9@ʦ2, ]]%<A vZ%Ϝ^u.Ov0$r[fim3sZ ZhhѣG゙p>*4=DRWwG1<\!Ʌ>\E>0z(5$ (T[]B;B!+]L&By!&Wo40n BB  4+L.4-BJmL&[U*UBIJeJmr,˲b ~$%(Mb\}Ʋ,q<<~A((BSf!up !}0B !}0Bn7sIENDB`dtkdeclarative-5.7.12/docs/images/DS4.png000066400000000000000000000032451476226662700201170ustar00rootroot00000000000000PNG  IHDR7;P{j pHYs+WIDATh]LKgm jd-CVZ?EJ#vM4 )5V" ĈbT `X%V[شaW!:̙gfvg A4k-P %>P %>M6>>$Ip8/boH߯h0tKKKkkkMJ277uuuMMMX$f_Z,{yL0Q5B!FWyujj*V_$2ihh#,O"خnD"8x%`0,_޽{&$sP]]DzZ-0MLLx}9gOW( äScǎ I`…)T]^^m۶k׮ v3gN~~>r'''# P[ N*jppP*Cn z`0)_|yƍAD~EF#;xMhT*jAt,Je˖0L4M[Vv3­[TRRr-XNě7o|>L&H$VB*5774^S$)Zb %H}}}nn.,OEEMz&Z޺uyʡC~r8mp=lH߿{ Ξ=kf^z||3Hoo/Z߉8 ȡ(ҥKxeeӧR˗/rW9?[& >|'ms/櫭|Ȏ'JOOgGl6޽{e2t#HAAAoo/;gttԩSО?>IK Xv-۽f{Iff&|iwzjkksV\900[KJJOܼyǏv(jmm}]]]*߄Ns͚5D]}6w\qQmliiDjё766&ؚ _v3 Ch,,,ܷoٳ2t>覦fee \.t;x`UUW0HHH LyΝ۷Cbxl6 $ɳgϴZ)0ˇBCTVWWtwޅqrr̙3@N^OHH`7i={@1"ퟝ ;<<,n [V3`0@chhVۍl~}a8P(##ejuKKKFFj2 o߾|Rj)Ɏ?ϟ?oڴĉd2AD@aa)8pʕhK,fZLI6ÂIII ;իWǎ(J|?A)"BXh+ħR(IENDB`dtkdeclarative-5.7.12/docs/images/DS5.png000066400000000000000000000025641476226662700201230ustar00rootroot00000000000000PNG  IHDR/;dDv pHYs+&IDATh]({l;0kK\'+<5ByJ&\HQ.D.䱄$7D).(!J<&)Fgmv6.6{_|۾y{>|?gh14䥱//}yiKc_ҨTE7 rO>??:%99࠰0##a.4nyLX, g'LJ+e"2Mccozzzl'4eaaahh1 ý訾DQ D" hq܃(躭RGX,^^^f8DYYNOG>UUUT*-6::JQ*EEEΤ6ڞS4jؘ? s``a4S*++kjjWPdp$SSS(҄. 7V{yy) 3(.ikkki}:R!!!eeeRt}}]z#..:))ieeeff`J D }PJ(fgg充d2u#233ӅB'JRz 0 ကHd2QTTbPð? ~~~8czF?<<999y_B]7 #55U"deedzX,gKKҥ%kY\^^.HJJJqR8;)/}yi'˟LIENDB`dtkdeclarative-5.7.12/docs/images/DS6.png000066400000000000000000000017261476226662700201230ustar00rootroot00000000000000PNG  IHDR(/ pHYs+IDATXK`?\ 1)!$4) AAǂ C!EE0eMӶ9F_O{>=y _*sR쌦;a>>>x8m6nwy<@WW: ot:f+JX, GFF "I2Ht@RQ" I+׍=/ s:(ZV r\.Bonnjfooo-,b rh8qf0>ir'''OOOX&AtmmMéT8yrqT*׿zttqˆlKRiff(zrYCAF BPITlvUHB 6H$Nq.[ZZңxmy>5Ia,cP0NMd6Ů6 PHop(4997Xmp4,A|~T 0 SH[MMMI,ueVt׏>jr,9d25LM\C!xS)֩̊noŢԐj4AQTjo(4@ S`!F ּEDz<#0hfSU ְ*ޏ_R0]ZB&ݱ"H324*_+X~{{p82)G H2 dR D;;;~]m@9բ*iKʊbiXMGGGl|>}}}N3 1;;O\\|zIENDB`dtkdeclarative-5.7.12/docs/images/DS7.png000066400000000000000000000012431476226662700201160ustar00rootroot00000000000000PNG  IHDR33ç} pHYs+UIDATX-ϲP'xp3,_"&9g~7_nM F0 Zܜ|x9:93 2x# 'W*W/UU9\.0o`0*Na;5LӬjѓNjJ>k=>Yu"pdBa\f2[.^at^[Vvk;@ӴNcD/IRs/EQi>qd6YYul6_CE!IyQ#3 f|e,8$eY]'̶^=g(,4m+Riq%+TUv~XVAhۈhfP5], ~yW%bTB% j4/+beAhY,'2<,*Ƃ@2,/2,#K/eI-KY,`$! \iOS\F?;Y D9u=qʶۭ1U}Y,pʎpx9,n8e~&  nAeX|\|>0LZe^r9 ,YXLR~0 EQx(4N{e߰O,+IENDB`dtkdeclarative-5.7.12/docs/images/DS8.png000066400000000000000000000020701476226662700201160ustar00rootroot00000000000000PNG  IHDR/4T pHYs+IDATXXK@?_ ijuDd' EE "d)ACulTVq!HuT\t` Em#oƦ&߻}.ZFx&m4hdz9::bY( Z5944j"MP`Yv_ݵl&) nh4MollmXET!?i@yH$La`dyVWWH033Sv{*ҙUmb4~(9>@P===}||6$IG 쬻[X$F0 &(bTl6vzsʞjmmER"N___\,v;F(ht}}z^vc DihU=Օ(VT*uttEyL&\ hkkT,pm$Ir:5Ph4ehx~P}EOŏTD詋??ٛDIENDB`dtkdeclarative-5.7.12/docs/images/DS9.png000066400000000000000000000010631476226662700201200ustar00rootroot00000000000000PNG  IHDR2'F pHYs+IDATX헱@7ǀE,T l mR|+6ZZ"EJD$1ޮ寲l>&Fҕc(ǒQ%KFHXRMZfW>>EA|>)պn!!$xZ)Xf4hd2Yל8šqȐ[O P8YJgbr]u>jDJh4-}0 }_b of]׷2Z3eYjYGlVR*GlVH6 JihŶ|T[Ezؙr^İl[өhnw:&^/q!4M۶E<l~e4m꺞dޘ1P K K Kltg"8:RLh4ęZ٬P(LZc/SjYX2  rIENDB`dtkdeclarative-5.7.12/docs/images/FloatingButtonExample.png000066400000000000000000001210221476226662700237720ustar00rootroot00000000000000PNG  IHDRd pHYsttfx IDATxy|T?{ %"AEqjkWZjU.⊲,H! Yg&{c2ɄlÅK{gu?{ι3쩧7oBvwR-!(F!<!Q~1CyḄb(?G!<!Q~1CyḄb(?G!<!Q~1CyḄb(?G!<!Q~1CyḄb(?G!<!Q~1CyḄb(?G!<!Q~1CyḄb(?G!<!Q~1CyḄb(?G!<!Q~10{LCeI=s9zHmQ-eIU{fQA_מG&uQz,>;;Cft٭7&ոowp6'My5gɼW6,Kf~כ{ ]wc5oKieS5/}Г[2/u j=S/~߹f82Z;|嚽fs v7kho&Fm_𗛿ș0㼫ϼI~奔-N)wW]T{GC@SLS}1E-ul#}7ܕ3fywsK/L&O|_&wQ6|Oo !ttd~gOoZisl'Uc W޻OX /K>+X=a;ܽg}H߶Wnyߟoy{{?y 32캷>2Po?!&pb!vZeKsg;<>iT;8ꆔI'On\ҽz|/߾ݍcҵX-MܽdCm-?ym\q&}e[*[<~ k_O()%?Lu9y7k93n|p˵//~o,<NJOw -TWkH<3ѫ?TI:)t 9+̬7D6)UJ>`ȄSxLq"#-D Oɏ.;F_ҷ&tm?x啥?/0-ݧО߸}{s9Ϛr_L阋ɋo.i;gJٿYyזE\teY_Z2  *>{_ok~soEo{7[ʕkl?yC4@e4`YőɄHn~?[gV3wxDO!c*ط_.UM>ד8NE7[=wnŸ}/6۱ o+CпKofMD;v8p )Q vhýԲ݀,s9{ͫ7VGCϭ!ECӕ]Zt?^agVAMUNK5ގQ) Wѩs'[6:8=.M I0w<87W, veS `u[Xp >otwN}㷰~ ҿ֍GWUsE+,(YT4rHT 6iIA]@syn{z9fZKD-*Q36=!ch7#}c=)۳~I'l}^^dTbԅz~^3`xfsP`srH(ɚ5$[K{I3Id):t>.5!5j[wp:_\vͅE͖o~l]U'O=V!o,*[FY2m60{Ǯ9:B;ZDJ9zjf-0SUnL@csץnܞ2kj*omB8ŞRBަ^1o;͛?QoSA>v D}'C #]#B-ut)9Wb(?G!<!Q~1CyḄb(?G!<!Q~1CyḄb(?G!<!Q~1CyḄb(?G!<!Q~1CyḄb(?G!<!Q~1Cyj2B:IGBXã@O)b{[W07#XQT8~cϰf ,y, ~'?'N2serrND\VE|O3~:R (;1yE,3jx;34%cA6Pwt2`*"}b#-1R$[Yr-;ӯIy~6??s9S$ nCG@R%H!1bəŝz^V3&!e|g 6,+Y}ϒ9$t>4ȲvUis1mPӗI_@ OQ Sԑ*w2ly- ئr;7oo> f7M_Oo gunM2KJe^tCl\+|{;\7mZF2""9YaԤoH{3*v? z, V}5s´_^pk}u;rSS{[ h!G;jr|rF$X`W2Wfh[kk ̷1T [?>WS\[D#(6Xq@(R&4}oo{=}޻-Ꮋx}FpZ]kG|B^2$@A-JQ /R`x$UQ w[8u{ r81cFnKv-wȌrx }>,nX#J#z"@Ɍi dYӵ2%"b?]cB{Ԣ} ,=7vXm<7čĘJh'dlzk{pάnRm>-ݻ;ýnAH?R *EDmtCD!>&@TFk#"ST.YCkB 65>a@z[_,C&MزA,¨Gޱg̭\%f{ ,1#LH?Q ؔt^c 2+OE~QcĦ 2`˺]kҵKX֚KLkc:Ffݧd͚QwwҦ ;{,Ӆrh? "Q28-Qрh #"Uz5k1m agh G3iZ7{c /p]Ӧ\rGQ4aϖcc.BzD~JeD]9cc%=EV}FE.e KB G<<#R<>5e3K׫ۻo>'yW?ۥD[mPg~G+p"GI.͟6UY1ڐ")3-kSEP@m*g*;H {E'~|oEkWo-k50]ZbmJ\6BIvT^_`^`5vBm4Q>@zԁm[^/PJ`ɯiǻ{>[]Ï,3Piy z|[s?뇿H6@eI҇d돁kԕ>)\7uQ~Q@#"E͝rSZ}gK4mq4Gڀ 6da,C~vT)6?ϛRW]r@!@-gMܠq*ëZJǹ.>!lEh:H]ï뗬ZMs']<$>N᏷w1@S}АM^xU-A:e_K'u$~G , ,j֫Ft^z=^c_Ym7VIqZS'u chM __Xx:u,?MVU7E) "K<\wq{<Ԍ6;;k<`HHj"[k[_+is E1(ʃ?W-Ξu%h,ڸ\Z}Kk,m;c^㓅BB[WضVC_~D]!tE+ՌqD ݣbDPDK0\gVa˞0}M={^Tx+󗔵$%Sz p8)?wt'4JU'ҬSī1mIs.GўhCَ7Q['?(M aő;qq=(É T}?t@_Gw#.`_ֶ>ښC_~Dj,bkjS,̧(( a|@=7iwNkM,Ҧ4?R03#eWrJf >b(?G!<!Q~1CyḄb(?G!<!Q~1CyḄb(?G!<!Q~1CyḄb(?G!<!Q~1CyBS0 gH?rdP`a2΀"pja}VB3 b{x1DŇ1B* y,9 \Za}l-/UK2(0疐Éc cƠlnz#A*0 tksfg(3rDcUb y59VZ!1&$"!T4(ζvr\#HRJ#1`Q?&Oy_X@eK"!aSA[O)VA h?íc UPd[4M{AXBM'h tz<T仨豅!"C9Vy(B; LSТPa00o\@Lj$c*I,,ړֶ!ш:Ak3 l_ybr=LZlUik]tZ/xĥ 74o|`Yhk{]K/xK.#%HA-JQ /R`x$UQ w[8u{ H bxҴ͹xnx!1%|HȬa g;,7Av)la{$( ,KqV\Y_^f`8vDDCk]\RӵbZԠo$(Y㫨_{<{E`2IZ{"mXءM2UĪӭ1bʺ[j4 {Kݽ/ִ|[gMNqiӞMXR)^K(S" 6!"QZ\Y?ZlLU Sբf`Yx{Ga\Z>eEw."58n|彜A1͒`uYn zGOte쓞$_Q28-Qрh #"U_-X>5);{kӭ*hk퉪ʒvX$0~_eey޷ewb}Eޯym,~9يFI/( w)T挭Ep() 3 -p)XX |nrÕ IDATC4$$&{~6|ƈ%纜SV7 =47晖t RG zҴ $XYʲIՆGgNܜi)_{(mS9U>1WRN|s&5y{ D\s Ĭn]7C $Iy}pG/ixry&:T EHcٚ]bH%9mS ңlze#Y ;wxys&ɧ =^U1y۳6&z/O|4ddgFtoFkHgwJdzy+ܟ9,S{굅}u4v|_%WP(F]iuc]E0 ;_(R܉):5|F)c{$p!#QZǁ  FRGǦ6\{x9lṌ:%ˆgkVHB 70bdH$H(ݡ )4n_\exUQ183d_0P|;{%̜fc˝X$>muN>c={EAGΖ2a _k}O9Al }`/|%3~RJ!5U\sFN/ICD,]SRb]8~UV$l~6napUV9UMWw+s':3UiJjN%n/W'ڭwo8g>E >nݾs y^үwе GJm?ۿ>#`E'VZl3!>PXg@drv@6/;h/{Rg7rPrRUG)';ݣef=taT[E׫!G?qvƦ㒼+iȳöcҋZ]oJ[ *GGSgxO6̝bl֞jó{@1Su:rVp|A7*c ?͇pdvCɖԨYRg &9?V!`8? {bWwP0I㔄O2X~8 ^ݾPV9s!cQ+*DQڏmn1a!# @"Bh`WAQk`(_u] mw pO"!BƱ7};Uk5^Y($2%˗tdm Jl3ir@O!G&WB-@< 2G !'͕R/u/&G>fWFvs[ؐL a,NLioQyxf4@ @EX|M0" aPR1$⽸GL L3IcL.X~Fp}p`WMޠɣdBD@dxh3B`"MnVawzSpH "G4X)ZnhDP"G #,!jQZ gŮTivŢߗr_uG 2R"z0  *C 2XXdFfpKj@ ۄ?dh3<"p dXa ^#YG.XTbg 9<ˏ@@dg diS !S#0/,6y5 -< DpLX Ň:ÄrԱH%nvXzc%DAl%LR!G5lО8g*0 &<!Q~1CyḄb(?G!<!Q~1CyḄb(?G!<!Q~1CyḄb(?&iAz(cL(hV(kQbux? !٦o]7@B`GQalWrTKw?Ú90FO&1d Z`θ}CZN<߉Kj~CG =R2!w:5㢴tn# ?զS2GN>sT!=HwLj4j]_S4iaՕ*%oSYFLzT<^]كGL>qvƅyQup{V=ǿl2] 3^p\mEϭΌ)Y,6;5#-#';'o@~ѐ!nYlȑ# NuL=/S\v9oba#R0tĐ٩NPF[+kL+*2hEC;U2Z}j5ljqzo c^xν>픴 o-cǤ,Vb,fQ "F״ome5 ]$JP :5Mr!FiMp7\Ҁ+m9.W z?z ~ǒovn/۱),/Ύz˾ZWVkgi]s./Ie1GaIZW32 VpM-3୲~ɼ5[jnQ]92n CH(kz>CQAg1"9YaԤoH{3*v? z,  ǿaA`s4~1nv]!,7'iشO\,S.{BlW.3kY`] ElU4-[e}Jnq:>^Q,Y2C+_]k`ma6?$@ ł*ˆw}du3sn]OKЫKrU[ҥ掙zܐ_l{hDZ1{~:vۣw{S[-!GdHDZ`nm{m_d|I:‹8q qLxn{=69c\|x`)9!{Yb-}bM=5 v6o.Kf B8]+ /3}H""!5..t)ZG-jзIO7WUcǟ{9'' Q3#%Mx(H[k(:ls <~|zouu>Yuigܑ@m9]_ rҐ·k 2 rݵ^,HHI a"6~$]Y٘Eu!V.Y{ܴ%g.縛~M|^4Gs9@7R =>wfp9fdd?oarMd5.'V{}%U$@)F>eV(FLjMI(AOᄉ"Լ/$o׫70\vfOMgBbXgJ޹]o l}b1`>kP"Nϧ$iMaރNXtׂy-OrGH@E 'eKc4 *È@($0&c̖ST0gZyܘvm\!*ҏL/X|pPUQz:WzGjsZz02-leH4je՝#mh f$D@~2@eXCIOQ|QmhKo[Q=xߥce\THӷ*O8,^4]#5?jFȼ?+Qغa*c̙Wkx/6>kszS=KBvJqȵ6W7}?(ئئ7Fw o0gԄOu`V XRwTʢ}\hf Sk\be֙}߮Ӓ55聆PSUye/O5oտngzqgi/͍X3%Hɞ[\n =X3]\A)PChS<7hܾRcqǹgȾ=[Zayrǒm 7ԷvϏ}И){I"&yոOb:C=h=9-}>o'ٷܴ'iE=GHeEz(לKRgk+ |F}WԪ\5 ?4mY2!'j˟6{xw_[Ƭ%-g9~yYmѻgˋaWZ#A IG D4F+ֶdW41-bP& m Ig|w{4j J;?\]wpFv1ٌpўu?cyyuk1|+>}# *h,_~D]!tE+ՌqD ݣbDPDX r8qtF jθܱJ[9YF QJc+Cݦc├3o{tvOT Z[Ɋ]eo[?W2 mtz/ ?fm bݵcMy[iwT(aK74t}$%%7c}{%D{C!~x ,[}k>dSO]?PO,O{E\ ͜yeVDom Zr`O=ԼyzfCٓaőyq~fy6;Cތn3B.OɭNC5@5YS2˄LRDCKsgVG 6zkNOspK/kSz4 ӕ?Ewyg,5DQ櫱uM`2(,ԪkRg\ v?zgzt%e9Z̑-)utiW֨ǖȱ%r`TD. }ѐX]epalbO4~ʙ7z3?xl5_?c\{ܱ5O:?zHkmfw^7Ν\ / 8%yJwv&q?)Wμ⶛Nû 9$Q#YܩeJ+n7c9H4dࡅEEÆf:52jm(R¬C8iOu կ[SJU92+Raykm`"W,JGFmyC嵁wuߗ)v_?_ʙLaڤodz>19 Q   :5Mr!FiMp7\Ҁ+m9.W z ;'"};7dH[?:>.*q,]m9GF8VAS&šKyBŽ{RI^Mʚ{9eۮoj\2gÛ~%a3O\οj?(Ayz۬ljҷG=ZIAE;f =uw| 5m>  >b4IT6`h'O>vׯg|GÃ,:Ÿ<T]F풿N.ٔ~v'xrY&1EӔ{S_|5EvKETC͛:ug_RrӫɒE@ȲkŵUecID9~.%?]+E 6 XI=?x3c _"aGNҪUzO-u҅ge}Uܟ[,w IDAT,*h~{ɳLf8}[z[3nٺ>5C4Voot}ՈJƉ? /=h]{ G$JQnQZ\Y?ZlLU Sբf{/> ׿:KL ,~wUcǞ(u֏|{pdS_ۭtąkF$gagN77 o KzMaLoh@hv%ؖ7vJVn*m .#MI705 <(lTD5:FlJ@!I6oYoN9.m8}ȎN8LZ`gC'zbŪ)adUmpʝyζ,~OJXT쿡?ʳF} ?v/k `arպ.KޔgV6?i=Ж?bpxwYpE(; ϾjϷU#\r@d"J]Dz% 1MaDd Bodžf::F]|Mg׷;7ʘNjZt^xwS`4YG+KG RO~0[m"]7V3:uT)F3 ^|fmw}kU:X]u tڵqԺM; ʈ*sƲJz:ȭjE\~@x1Tc7xء7{YwVEq즯\hk#dN=]oauU;6`VS`Ì_k!{Œ LRܿ|ue[?hϾяs8O;8)?aK.9#HF1("zwS3 L HV@²avrꮪݝÀ3;=ս穧 M_X!"*}ʲݙyORA[V9^=:p"4/; T8 j@ֹczN]ƿWfe sk`lb^FϽ>j[_n>TKR?sdnrkLeځWr;ʡJ?gX#wƵM㧘bױ*ONjHjD\L 1 ɪ.l.rÔ@d'!N(f_Kv)/9[hc}iU~Cӳ:f_ƂA3ﻰSWRp(Kpat׉&Ęn}fɞL:"{d \&j8):ݺ?AG,eٷ 0=dڭy6bG?GG2j Bʖt8y\y2ds/=qSR!e;hSAk̺ڜԥUEA {',0sZԎ p;H)ؼa_u|pe&ӢaO=C JHcn`9`1<S: 3 |9_D!7@|+S ?`=õof>EQyGΚqUH~:<H5߁6*L*?cΖ:nP>*QT%0ץ;D Jn чl@pe|Uuc7T|hMnW]a?  FK CQJrqsUR*ų*q;$1pr"o" c{(S\?>.'oHlͷ⺥Ϭ(`~:'C8ʋ=fN@Vta',P>!>qJghE"m8kec@2LGej/q6Ta"H5nbP mcJ?́BꄾSzO/カꨭۘ9h:*N'WWY.n=E;Iv=D+*XVB=8] ϻd~{Ҳ?W,vbdu>*y\,):Pb#q7t%S0׍K$h#3,#uc3w[85Z-Pn$)n ,ǁM !QJhSn( )j(ڎ=bx))G˄N_,^\ ׯC翠غCgT}A}xpcˏ7P7''r_n7QǧE~vvc͚5֞%fY@^@9~c~ʬS,wƞ0_5L!`_ *q̝Kӱ?|۝SB՛kXm6b࠼9Wy`g+O.]{" =lͯΌPoXS t*+sg0SVefUN1JQpU-oo@ o1uv͢N&䉲6Eꐳݔ4>%2e? 3{=_` +WlLPs|ٱ*AK.]hQ#$<}]kֱfhy*.P,hNR:*m' A\:!8Zt9z4q樻($D8.… iP ؃,% 2U" IWDB.(YL#kEomUžqX^6~tz54_+b9*٪W^O7c +Eo{Ld7Gښ9`\XBX  ~<#m#j:u3#GHtjjz!kjl*6 vqwSFw89+Q!R1w@Hh("ŵƇ @} ֫t]BTk˄:?\9Un@ *JRB aa1q q1ѱZqfTnPǞ꙳X|>i'>x&UaE+Wm*S=kcFp*m0~O4 V'_-V}YN{*zC";ȏ39BP\04jw<ĠŒr39}/UܒJw*2^wWUL..7WMxFh yo /:,#4D;.[]LB;jGH9Q@)<`3:t3 jNJPlKO8Ƌxw/>~2cD}Ζuhg^viO: zvg~]rrv0Teٹ]8>mlsw|~ءwܵx.SUMt=Ϭxe9W"4)g\Z A;Mre=BR-@8<Č$Q)p@d_LQS{Z+D ]0r9'%"G]C^T R!Sq ,1nf:rdåS;f?DO ηgވSnk?Y^OeU{*rTn w9|xukq0M 幛oE!tkV8Bih^9~i%*AA)IPBB@!7<|jқIG˷ΘNW}@  ǖm+SyąG8|u}[*;UBzh7->U]kj]h`JְxBSG5Qq4o~P_-,{Qk@IXPhmܕ8q/iݸuJ,FLxj+t@WaQ!r _qaͫ+v|-캯7L!a_:O/[F r>%ϯʬq;c|LABM }jo'N:Zh:̧C~wq@9@<qzg^KNd[ VY(W*8 'x;KPQ Q_w?rnE^Sv]}fEBa rT s`Nݯ 6o iǴSIzN#b2?7zMKm C+{!t}r?z|QKQ"`&ҨLWB]P#TM{wf]=D̥+nWwa8Qt( o>Y#y|}!:;9qX?9nl ^7%~|D]?{ ẻzׅ(eWJoaZ?,;9~q~&H"~CbbcageD[Z8Uݱ`dXWjDQyzڌ]a{_%'!b:/Z<6w{˵/ٰOSB8,9mGoug&•ֿc 3o(H6gR>ol{FЯk`Cváئ86AߡJUMoj93nt*>E$]+VxD|8~\چ2|/_-*"Tw,&P<8BQm.SvrQzVq?>_kӛ8\-s@+ogqT&=pƒe$D;n(p</~l& ;ui!" epXW.f}֝-o Ԍbwd-c)x]so"{[n7<;{cq#~]][V(iWhJ*g`W0QS{5~M׾8v$n%?iHU~\h@,\/ެ挛Rަl +*{.xNxNYslj76R"]'|ֳd]0c _{/|{UNlӫb5i_ۦp ]1B%HR 1ĬZV̻?^r՛I)t7TVT bR|cKBxL H4 a1*gYQ)TJ^vڥ 8ञ㔧m&6׍/79~K,f,2q[gꖠEcIæl] *Oر|/Z6?qÆ'&˧Q.P3{]Fy=7BP `S-?mCWEo"P]F_HdvL1LJhm"\ HeZaF"=B'(8Qj7evr氽ÐݵnYnLG5jSv q_ܱV` =n=~;2{ڨ)`i3 @2vZB@׵G㿊*uޑ6z_wM_ߵș{nw˼=׿f-џHC&^bEiJ)`B1A67_vc]8~ӶB,gUƄ։W(OZ!zm%$TbO̩=2bOywDxj~kXWWS\ݗs;5L6Y!cGv~d,tqA=P9Ɲ("a{_o~,UjH'6]gxf0V? _G-iN*XтGLs  uHp܊'uC8TctR7y irL@&S.JD.]hɧQzYf ]AMl&g '[oD%ߑ`ˎ IDATQ&f R"R&8jmn^V @di:%@P(_"v֛4X8z_0V"֝h X@ \sy <(xPH!G  <@AZuZ\a~jndž{0djG`onA#rY*.+] @)ER_\!<(J("ֺpzG+*Riu0ypՂ#r=x7Tk~Pژ"O(|PgY{u*K2 9tlCr@,QoAR! !o$~x; t~UZE$s;ACGm@̟ fOh*!o% w o 8[Hԫ  Q_vZ?qTWY/aB0f(KFx}61ufm{wT(`3DrtY?i lGU %T; N%{(~GzWW<Ǧæ:8HD0}+XOS yQ 3ˁ}U϶g#s7˭5oH!NPVGW]$V`#Ps#9Cfov]~fo`#SxcazJH`)aa0#x~aa0#x~aa0#x~aa0#x~aa0#x~aa0#x~์G-tߔ 5D@]iRc9! g̽Nw5L oG3N=N]XZpÕ ]FR9BA (![tJŰZJW3 1$?@j60-.T3tFapY7sR)ZEdu_NTsӖ rDwl!ʐP2hzt\}-T w:& %v5P..[]Bf~פ PERRYjt_k\m{ FB ч$&$&&ņzN=ex@&m%VB4=ٷd5^vXSg\ؤ@.fԝ p!*V?=0 /_y"?!+vz͞3oTHFQ+EB(Ғ[?{%2~ϴmPN/+ N+Q*q15bpƠʘ.ID]t^3*rvoUյU#>~GH 9⍍V }c3w_=v} o|Yt&a7ULF]3ϫPۏsTGkiYٟkJSsSSTc]Z:&%gMȷo`蔍(Ԑ,風0qP.ҽQ#;7|疝me194{ӥ|kG&tK~3ovpٽ~ୗOKuH77v#F\tn/ԕ&z53BLϴY9,GjDŞԓE>$W¼"(nov Ek:nN?| A hJvd W4f(%jQY\fHh᪨+w_<'Wޚ^Te)/qt#kʿ |!}ퟝh2=?@(s (L7})P.I5BNwLKՌ9gL98 mF␧҅<#:u㌗.8(6V^4}y.xqrj?5{-)/!-EV& nTbgKRsAW)CKg2KNT˝tsBP DHK \esHztBp1  ЏŽo]y{w|~߳Ou|\9W~ve_~q.M\ϡABdKת0P2na7!3aS_nUMw3 Rq7q1d{g?}uOLB8B)e1Ř7[B:<\(؊K$Vbreb0}N얻<'KO}.SďkϽm7/^S B_8!EXƄ#L|mոe-\'oeJW(rCDT)7#~zB|xiV}Ao.v0\f`JcلbǎC\RV ebn]YNg5xlO/ݗ3;7;}]= 9VZ)"u;L }7֗xiV!W(*wITBMZ=1mxi,'&#pf9h v07zc>\/$$\$S\#@ \*S)Gi`43Uwigz27tzG8F1eRF៊${NWUa]7F$gˎ5l!~^ֽ_-VsiK7U|ۓv?怆{c%2f,˾EGwv+.5Ǭ_wl)}s|9\.SLh ?r҃;OۼMf*|kvL9曓*SF:tꗽ^/ĐN)zԼj;wT:}K;$t1lHTVYQVUi\UQ^YQVYHrS F5J0ps1pȩ>wErs DA'yν2P.#NgZk&c;њZjsHa1vm71UbD6BH}ڼl_c{ZkB#rHġ:>%oa갸}'66_6G;)*0~C0`pd۷.!7t? t.D)56WI9~C| +/I |=+pSφM(c =zi<[j}Te힑8Pvni;}=;\ŵ}k2TyV0i$p7x1%BF m윇gЭ{Ǟ/n[AMP?B9P\Jgp&)EkVG  )]v1gzZwJmV?~zWKo8^@&ܘ[U>yn@gx3յ5DDɔ{/8WPtPWS0[O/mԹw~Y ]ܿ41hӃYtE1QM\u\&vrlU1O%@* jVarNUy쎖qȗoi"" Ra pBf29Mx1Ue*B"Thf* . C)`(^dT *؃&^! ]ƢsU qٛɯ>Y8+Z߷? N9 تY"7c +Eoa`%$99'7d?lx#x~aa0#x~aa0#x~aa0#x~aa0#x~aa0#x~aa0#x~aa0#x~aa0#x~aa0#x~aa0#x~aa0#x~aa0G|W؁+ q~D%vWvxhNEBY)sjW  gz䝺!@=+#VUY!b9hC?!#9đwtJŰZJW3 1$?@j60-.T3tFapY7S$ݷOjpQo͇_[(꣟?}Q 7h U_(NԩDŨǞREnËa_}ioG~* !Ch+Xu,OU::5%VSx%r6l5\c2lL͹ʴm(P o"97(9C8 %lB}Fl@AdIE6Dž rЃ|g'z1R~~k_SwOwF4NŸ[ŷc)ͷ4<2n._GFEn sZVUPEwN khZ'zop=Θ[h]8}o-ݱaͶD\Bp[yZ_aV+Ri%øߨP;#L2q$Kԙ1ZA=YC2m_:q*+(ֻ2N7>zwe@%=n_ϯmBEXx|5q+&>2祻eSGϞܙkkvʸ>4{tKyA}0?ˀ†>ܜ}{k 9&Dۜ#g stC~s9dfM@ ]Wz/--[jvPJ1ŔX=i&M.s3%,p<֠HMՌSV u(I,g(K4c}uz*smWr-iJJ5[λ:kE?Zqfa͋~?(μ{Pڀ jto]վ- (cT.cmaW@ )D)RntR $M=^DM!|RnWJg @ڌd+c#1K @\'=c,!247uВ5?(<+:H2~M=G ˘6%*^o(»M{G!ݥH0Co~9Yl%B~? Åu3^-,)Շ >"Ζ }ѝE>?qp1/2;K FCp縛8psgXr@ع}"TH ڗyN#-p KU4<%GSyâ=6TM=fbw}t6ûj~ p;~ņYc3uә.57M7է?* f>SNC H!SLQN]NHJ%N#:{XTE?zټ๛{VlCB\Lthf'>BA] v^\/$$\$S\#@ \*S)Gi l+sq^ 1Qu-6nw-K2<0|W 8O{!m3LjX/1~SyCf^cW_ڝsT<<Ɓ ߇-hwۓOM&p<-ˏV6i\ 8{D @"cEw:w&;;uj•F=_ _}F]eDZHE%(ڹKNDT%vME#Hݾ j\)3PWzxD=g,mМU .Zb\e2pwnjRqdB\-uE.'@ 1L)u6jd<DM%ƽĉ" w @Myw@쭏e2GԿL7~_w Ç63Ň:N=B͹uPx%[[0_?" .ꍕGb@`L1܃@0#rCO]k|{C7QtIsL% ]qu8!6Ex)S_[54) BU~EqhHN%VlkrexJz{W@U51~9C kBI͑e~t#?Ɩ FK CQJrqsUR*E<@@EHة[={uL+{|t1PUEQ=g,._hw7uZ/l[rL-ɑuora=tWw8'sZ3o㻫ڽ4k# o'" i}L%3Uæj>LD:M, ~mLIP^+P\F>yc;+y\r>s'?9ZH~@^SoƞѨʥͶzf ^{Tƭ2~ֿFO>Ͽ;^n kyt .<Uݷw4d矤oy0]mv#Mqa` <l!R@JEvSF3Ji>s[weUE-Ǐ=sʮ7>RhDL,☝'8qꤾIZn:QѸNE?}n=/:?j/u;gxMHPsҥלٳcǵ~I߄8U8T7V8bܷdS6mڶ?n#o+ ʫ 7vp"m”R@(*F陔\~0R:TwrU]<~I1': 9˲]0J졡3ꑜ>Rxzq7Zz2KMԞ|[Ů37 X} ƣ_j.]hѢ?F Ix+:4h5[U~@kS..iBHTsʭ^+fq8:%q}Eq~_Mﲹ"H 놴a*\Ram)?S"Jp*lyjJS"=Næ,\Ы6=R{)S+h (br{H$x+mͻeiנnsiJҫܨdR‰6m :.K뷋qh#m?$gY=g}&!"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!4M !qlGEqn }!\4+:| ?,z~T 绊/z$#2VPLB(HHrO˽ )D=ʶmWѳ>&͋TQ (`,uCkV˟uDveGmeMKhu>e{[OEu{SM1Mqh?nz伻^Il:2dAMXMUǚk\O>tqLEjc楏~~GJх>ݰ2ص}Ƕ}wnzjڤ3=Ίߝ a]ϏKIsݛ--fUDo^\v1LǶC@ћe&boo\r<gœ=1ncM7ürh[YeZ VW=0xk[ :s&$S-O?\б Vm0X"mb:q>!ߵXW+: fP\u S84ozy G%u?iN;;RG,9Ϊ53J?Qյ,| sK'O8e9gZݧmZvܼD5sS]sP2 100ʽ4=*;*)=YF0` V [ÏqݕsV-^T#׌^ P:{Ueϩ=[% ,T}lChMx.! r] tp6=^Lzf,H1.TjyF-#ӇV~%Z{T\=yo//]3!QZ4;Af1IcОь}Lcx5'"BLaڰykSC>P#' cc$iF.v,+ FUZ֬g'OljFU.Pl6N)Iכq)1=LQTuE9/}M|5q羾Mngq4?r#2)r00Dh0T]Y/\?Yw_yʕC/w4-7~۷ U;AGַ|vngh JSD(,4sPCLf!o5/4¢BQv^[KB-m nsy0skʆ [hVS씮SY^1\%S oȃ 2h5k߿x+53<_=?qY{*6lڮ~O7:#%{I'S oWwD$쎟ruΙΙƹ,L4~>jYΙa^>Q`4lƘ#{eaL}5R213~=Z@8a|jaRr}dgk9AUtg{!X3k/(q ۭU;s݆V_1OϜl*FmX\9+VՊζg]޵3yx?Ol Q)"Q#̊  nm`2 9*VyOc̑>lݽѻ"/\c\Sx{;tcs ^6g4̮1͈'g) JJ'8D3m{p||`a}?)\V{bWh2`D|jg KZ5aFmz/0H{=7'fӟx??~F姧$=\w``Żv⓷w*pSrno|dk҅ &LW::(<۰a]@wp]am릅jCV=%6,u4"WP[M!;{HlrݡXFAbڵ]R_Y[SuQ i&]vWx7l0}dT=oHM+j1qYE!l!pq3 ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<!(?ȣ"C<~SƢ4@FB_[ ntQ۫B_)b*͊>@BU$$X?{ ؄qC3{oqBD(a i,g>4Ka迡瘵̃P 1t'+} JB{+S>ob?qtvzCj[L pH&B7LCT| .>=۩3''|æ<߮}d[%OxYO˧-Ɉ :6 ,G 8Ӿ=troB &b)np-z>bw}}I=bԂ1= KКsƧgFnѾ]@w[$jqӒ1Dg~֓AQ^{SLS۫,9FnWҦ8N +*Y{VSU&;W?](n~!`k:t;Cw#f:g}Ow-wCT'W@n6^^qCQI/y{770m|ΎG*走jgy͌y%ҏ|Tgu- _:Eɓ2|z8GΙ7qi[!>;"G7/QͩTcL=&k{ r/qϭ N` Bl@ UV?k?lc|wU}ȵ5WfsG`C&nUos*lsOVgw 9 !16E9ZoKH "\% nW3S^-Y)@5?R ZQK~am-_^1Wm[K|Lx#pmsԷMo(/dбYGLRXD(~!!r4#(E9$iy S|6lTгO"Tu4Czؘ>$=+hx5x#*h˟>>J}5h":[G rbnqq qJ"&Fj G.bLSUoѸu;nw}?yKbq|'_M\e~oӴYhv~ 4` 4DaplL4 FDG.! |3{WV-(@jfOG+dvr˝1M 獟xt~Nu.ۼyY#Ƞ}9 yDt0y8P-Y[K%谐s]e璐;gCG=.rc=}\\䚲:<3E?YzRAVb?Es^~ Rj#}^ύF{`4|O䏟|Qi) nǭ*o|'Xǧ흻/ܔDgm[/ٚ=&5IDATt #ӕ 6lذ~~W3]"%7vW atXuۺi!ywi{Oq g-@U#'{v^;D8ۼEw(gydXvmWjD;AVTh_BmZI&7^Goƍw}2 FecA?,ҩr}LgdVD~9G_(od܌i&(!y$I`0OnOQ_r τ ?yDK*_\:%lGT+/yViUOYgYs|mI'T L[f9Kd[Ўb03Iڑ‡"k., )YZӶ*`0g ja^%L&UIXd1̳ڶ>. *o`0K%YH! YUlTU,yv)EN֣x`QX;b0S &3lkTd*-Ie}Re4M&h(9  a!px\.uPp $2WI4 :|.r9t τ$Id2 ` |>)/й^5 К֫Vb + HTA$!yE eNg0lllx?;Y<{FBB!S[Y,Ej ?9^/;JpBNNNyyycc#AR4((v'HHUT7V"F'Ndq(D߅fsy~R[ 柍`G^?rȡCT*U$ItttTT@ ~G[$`A* dITTSKġPi;T+ذ`$E"Y#޽nkzZ`S5 CssD"A"pRIBpuu퐻"C9'Q@/`)C9j<,?:/㹺Z >sLvu$ɺ:Zdف+,E IC?QR%)J?Im`05XGE(JVaqqqFy$\rYYٝ;w,쮳Ghz}|||z2c]܅ 2S :EQPKCDP3sB9Op{,7%… ݻwÇׯGBBBBuuo{ٹs۷VM6T*SذaH$ҥ I:h.)1k׮zjkݻw{VO`UTMMM7oz֬YckklJVggg =b4kooo3=vXnn[YYks(..p8"q~BWFq͚5NJOOOII_m۶nݺ~!))IӅ13FKRt…_~/@kkkKJJ|M///4͛=RV^=l0|)qqqEEEyYPӧOw5t:"Ȃb  @ xLE T$I<3<`GQ@@MOO߰aZ޽{BBOLL|mlljkkJj*\PPqUꫯ8ս#iјVkkkO8hO'!!Vjtv2dHu?GFF}嗫V*((p8CeV۴iaƍ (--ݲe˼y ի@AA#GF ?@,XhH駟Y .^oԞ={D"dzw|rBPX[[{yyٹBюvo@nݎ;VTTTRRk@VVIrʆ *++uv/Ϗy07od_}[GҒQYY믛񬬬zsNOO/͍'M2lݺuGٳg/.11Q,GDDx<$vܹdɒyqqq:>'T*:*tttllld7773K:ّ|GF|1?@ :Sa>hWR2r,GV  1cƖ-[bqNNIb8##K.YYY/^B`ϟ:u54hR͛73;r\%NNNTLKK+))1 EEE݋x"ﴨM6?/_N[ͺ677Ӻpvv>y$S}}}ԩS**22̙3(jРA>>>~w^ZܹӫWݻ/[ PgѢE?qT*E;=rHYY޽{O>-4UfCCI,,,(J ]{xxnѣH(y&LxUUU6m(JTZYY&ݻFFAO>I߿~111h ɜoeeˉJRIIΝ;@VXboߞ0aV--- KKKCO?Μ9m6ww޽{O2%77wժUj6** -?~rss o:-Z^ ~=A?}l߾ٳglܸ`yNNN2,??ҤIp8FfnʺufϞm.LRT*(jɒ%>>>H"""r~ر~I$lBH$JLLtvv~CCC/^x omii9wzP$;L21ByP(4czzzrr'/,,ܵk׾}bbbpqqYlYZZZ]]ڪA" hfR4mnnniiNS$I24Dbcc/_}Ubp8nB_&hi򭬬cbbnݺΥEZZZg3''gƍVVV_}UMM ˍ PTȽJgϞ(j'O-;vرĉ񇕕)--YMyyy!VheZ޼U +d[THF۪nnޗZ H(#n۷o_vm֬YR4**իӧO?{?_RR흙9x`{{AI$_dҤIVѣG``s{xTLLLSSYNGGC\Jӱ!b̘1k֬5jN<9epBjj* 9scԨQA9s˗/ ͇Hfgg߻wﭷB/^Du"##ĉ 2߿wiiiJRTRu%>/_~=tw^"Aӂ$$$#[)::z̘1+VÇ%'']6--m٨si D]vl$׮]۸q#[$ɷ~T*MFƇ~^CRUUջwo:w֭W_}u˖-vvvS(,,j۶mo5Rw>x 2vXX|ԩS %%K.vvvF҉_*++Ϟ=;n8$z!CL&Smm?e-~֭]v H$5jԈ#X(%ĉ̌/߽{r'@&юW^y˦MH '''33sW\YvMʕk׮t:[$˵ZmFF8wӜ9s.\x%cB E||IQZZ0d2^GEЙ(㳲Q;{Xoohojj*(((,,LHH`hܵkWXXSSSYN'݀(Tc @l5<<Ң]]J޽{tvv>{ĉmpܹѣG#fRRA(ۻw+WfeeUWW9::nB())jii)rnz (sĬ]611QЉ8 fyp8fZ`C233 fԩS/^ ѣGQ9I |ᇴpam۶u -,[IPK}%_7nV>}:rŠ6i1bĐ!CQ}ܹ@ CDܴ[ntr/"d2{{{.WUUE;BP"Z6\͛7Q[[̭P֯_..]*]0rH@RHԸqVXPyy^OIICSUUuz700pΝ\?o+D0L[$~'xЕFos >\\\,}T*5k(//?|DDuSS޽{Qbcc֬YjN<ﰌͶtdѧNJNN]( wijjBs')SlF+ЙLAkJ*gΜ"""Qf͛7op"U 5bĈ$>dy󦧧୬4ͤI̙"wNǎ;v\E$R9`fƍ7n2mn .$ٿ77V->jϟL;cʕ 9970۵kX,Fa'O5k֡CP7᭷j'3g'''9p@7{k׮UVVg3?j-::Eӡ'ŋYjZbСCQ^;S}y߿==={ ]E ׇ* Y( 8[^kb|_ :bUVVҮ9s4(>>~Ȑ!(S"˗O<`0۷O?A"44488J'|6x ٳVd0رOKK~I6m4ahTEzFhٓOp8sJr̙- FxӧOϯ_~~miiŋm߾pž={"##zĉ3ҷn:s̸qlmm_xJt=v?ܯ_?{`K.FZjjj4̟?ٳ'[JQ(}EO8r䈭-rmllJJJI4hPccc111o&OMM-,,y<ٳgeeQd23+999;;_r<==o>d#yΔEEE(L&+))a/FAdBB›o [@"::zذaMMM[lQTRT&r;;;{{ݻwKRdF(S %Ky<^||ĉg͚nݺ[ HRpttd),d9a[Xm/OPH6ߟ@}*{4ўׇp:ϟ ]vMIIqwwJeYY'|GEDDЏ={@@@V=p@ppp]]s_˓:(ZR]]_>tPA:b1[dI||<4(eN4I$m۶-//oʔ) xx<^[ϋYnnn.]Bn.]ЉL\\\$ICCCZZZhh,XлwoXhΞ=@}3fzӵkv'ﷱY~=yyyRb;Zf&) ,qsssww߾~ &Ln:[[[ ^IJrΝ 677ϛ7j֭tR'oFw`ҤIׯ_>3Zg9e˖u\ѣ>#>3777ԍ7x[bѣG׋F3G ۷o$Y^^~i+++9s攕ر}H IDAT>󸸸'Y6~gflccԩSY~WsH$(|ju a='XnÃ{z4 J(Ҹ[\|%;;h4N>'ݺuCjx5t?d2޼ySTZNr2G&!YHH޹s`0̘1_^]]/7?DQG~%KZZZN8q麺:__ߕ+W"~ׯ_|r{{7x@m{7n2ZmNN7ˢ.++(ťO>3fXt)3!޽)JҲ~_|yǎ7n 6lxT*9s&D%K.]x^z ״Z?dBׯ0 W\)J۷aÆ~m666G19[YY8999;;'%%eeemݺ/LII9xիGP(/^\QQF;v07O.-[v޽Ί,eӰaH^r}\.?o^IUW L5͊OW B8~wdڵk\\[oҭ[lFԔD߿m={2lƍg4vݻsp8( Ν[PPB߿aØF77K_rm)ΝZWWǺ Bk{L˗/WVV{NOO aEz_Md>}bccT3[[/=(:|``)SlmmnJ}))) -\q.]*++;rzEt8|]{E( V 4GR499YT"Oa0A̟?-$ &ӁVKi4FkQaUen&[4/<D" D" ))`XiiiQT3,}%~dt:Cf~| x<B۰،`y477?E/RZEYɤT*vھ,I `4&-K|>x b0H(BCfzO9n2***Є>a 緕} V}$ɲd)\lb0|prrO=+T Yx_d7%RikkNfx@Q]y ^"ZLM  BX܉mt:JemmMÓ ,f@dee%GI 3kx< jkk;c0 jkkid6-Ph0_`0$ P(d+a1kw|O`0@S5L&HR؇+ (䍥ej1 hdJR$!?,Asc,A(JZR-t:^/bI0 d2 FVj@  ,Ie.TTm,0fbEɞ A[~UypQR'klnM( BB0W 4ÔZ6>LaIENDB`dtkdeclarative-5.7.12/docs/images/FloatingPanelExample.png000066400000000000000000000133141476226662700235620ustar00rootroot00000000000000PNG  IHDR<ZOy pHYs+~IDATxyUӳʕLTr1~}`UD_T$1rH4&G^"BWn]^<VK`YvwfE@vkvWO?Ӥ9g^̰BP5T>]92z B; }")׈EoϾEι -gPR^P2A lQg}Y@:3E9@JBP U!3>dOs=fEBPd*; gPOe+ E A`$@,fU& wJP( u?{Gj70$§9Bg.* "GC?hg؏ʔ*/2#LUP(>t?n hLŗ 7J~W( 1Ylө?wf}_Yl%f=BPBuc뺮cn{YS|u[t]R뺮H]BP*Bmq hlY~A{}0 0* " H$XeY0ǃi|d&_G40 e+ ׎aO}k}ze?|JWPGBPTA6M3ɽtG(WP2Gx"I$[yr#Iʿ8\K@_u0 um9zt&7P<pKF}+9HlS#Ns'V)"ag}H,RoFAA E Yt$^G"BHs^ BqG~p~N_JM<,K4"!O*S}H) =P(B986־EWQyX%/@ӡ먯!!FzB_ӈٵ޿L0(p)n |7b9uEn!>c(_E+1@)Y` pP #M6,m!%vepXh{'6z 2HUQqƕ78\Z=V=d6%{W7!8rFjHP7NrBp +^XX:%,M8qَV>z'||mX O;s6C/#I A(80X$ .x^z~n?F5P R()B8Xq+4QWW[,u(n+Vd_H:og(ƜqV*V|y Ʉ"4a6+. TIŮ_EHE!>Th>`^@vd17|SիWiiÇ6f!< ˅x10怹Jyƕ8B#>L1NzͺBAhĭt9ߩc{|y+]Zپn}';wVUUUUU}v-iҞ7JnIyqؗVo|GrWi(ڹPykഞ݋#ٿ.HDR_"`zRWW0VEEŀ|#0j(R5k(>w,EbBOtfGs?g` u;omhQ{D<nΓsX.azkidJq|qwǾuo]IԄ_Gtڼn]:W|{qIFß]%~==4?y w}wo\{C\۩(B[w׍[ΧG\2ҟz˲|~a5~drJKK۵k':3{mX̅u:p)/&LyY'+9"MMl;qw0Ź┾.6ml h]o,]=;ݺ&緼,۲aOz3;\7p/v:^cgzzLT134tDnɬ{~y [w[.u/N'4ktrJ|G^;gΜaݱ1a}ú,8f> -ؘ>󑓬m+ /<y׺kj2:)Dฎa.oݺW^^\y!;շ !dp\p~ɿ^whK9| #c C.."׹ Χ<o]p^̚#VΝS|_*u#i.Yo[sbN}M[ Ю]f6J[:V"%#佝c' V9k-T*pN)/}ҙc488'?`uw:_;qSx',>:k?(.忻gܲq]|Cvi\?- OzM7OXR ^SC;Կ?ݏݽzrgZ}C6'8p+ƾBq =SKdĚnjS0BKNUjN)'e;ſ +Nycg/WN?.n$__پ՟@[^[Aӟ[q׬:7 v읩Y>S<38a#h[\р [n{6?Vԯ?9w5goLk޾Dr =`ϸqkر .0bĈR4Ťcǎ}gZ)c5z*2iif.m^@>Ly3g1&KJUIY_W]E&ױ=\}Wז?}eU=ؕO\9G˚"=M'WYٺoZoo{%>}M/XXW˧])7eҟJIߢS=zY`ԩSE-ZAZ},1ݔj @ok@r$Ü0!s`#ʧ}Ź{d ~Konχڍ_x5ÿI-;|Ъ&7\RCl54O GqeF )I^7O4bWY'x?=VDGO7LGp ݎ_&\R7l{`ӸKFs5KXvt[l2foVA'2 bƾ 'V~_̙3q*|"i'\}yyy*};VI"+ȦjDa;D YkQPFo_$‰ػm׵)^bjSMMwfD#{ݒ=:?F\ݫfӻp454ɋxiߩ(rϾZZ\ܬٽZ+ѥـZpcXccooD!f\QQ1{+W8Ӟ={8Աr07!zz!D NiDq$ !N!E$5=1h~ׯmɬ;}g^cX4Ma7>H$RXXͫ8D67)V# ߦ1"=B4n7%8(*܋x$~*~%moO%{ۜqX,fv'%-[DYCt0Ml /!ﭡH `9u`plDpPve<("OdWү=LӌBCӷy&C>!ˠPKDR F":Pkx:ќpƋ;װoz$_t&*]"WZ93npdݗ;umcIs`/ql&l ǂuOܕH(sMn |hۣa8ʐ?;#՟q] Q@sp=.O&H(F'PB]mqlۖ!~=1M3_M{ xP \(;C"x< ޽])m/R;c7j }}u//z(s/Ipܯ^Vo|⋗P| Hz+rlwGHj&8y39|C*LGkU[  dR+֏OP}6$CSj^/_q HQOUM2H?~pUHYOs2E3 I mP( T ͻJ7)G Bo{m/M"cP(CV:_`ßie;o|/BP%2^fawr)S6C:'';}Ӿ2 "tJ?ޚtHCB?T+ GfILd}%mάN(>PBHG-Z{,O |~p+L{% B /f[yrs~ytD_P(Z-479NIENDB`dtkdeclarative-5.7.12/docs/images/FocusBoxBorder.png000066400000000000000000000056651476226662700224230ustar00rootroot00000000000000PNG  IHDR< RK pHYs+ gIDATx[lc$6I 4Ą8T(.v D5F T}A*!P%TJ/-M[C*ĔBC+! Nsv,>>:2fwv,b>gT !Pyf8-S! ]{!Oך$+U+@us&p7'BIf)b>d A} :ZӊXڒE`Ji-a(|>bE3`  AzڵO44N|i4ىy \ E@!"hf h8 uX\m ^B.TojŴE!r܈4s=(fS"A#^)K4c ] :w(-p;Veqj%q`Y^O~ba=PU0: nР`^ZiװB=Qܞra-iytO}z?(ث94|A7CaXƩ]F</)bЪV;{b#(nlNjh% EKZ7`:Q\5n{x#pML+n{x#.ڃ 8iw<1Rl~XU~JҬu@T A(qUP:rF9𽗀>"X `U,\3eUͷyu aK\B.U0XW;,P(VjefP@`b rTƌVA3q|XDm)+hVbX*acV0IacV0f @?GbI^`#0^SL?؊L9|k.4oLR 2U*bfL R9tهW2d`5rۈW !b #/rm K`Y"{ |cOO'vt\2yL˫%>>5pL_&KٛȝYw%i=%6riv3d؝{%5#'d?ջ3IZl,ۿ "-@ i#рHl`2-}r5&^Eu1 cw#Bܔ}yc"-G% '/H>BBSs|lN+؝{p^R4kRVXi9l@N ɫ2dȬ+"bj6Qy@xʔyCfY|L~;AE*BSwwO!k#]r1[yWיæLm܁&v"<(P*uGs)Y RWH+U%Le͘N C "~Dfsd[xa7t2J1O dT)"*5"}o#"Oz6D2Cb^F\5HXL+Ebhί_"SN"AowFʕا)K">;I!L9.02vLqD݈j#Dh|lgפ&dd4b^Asl+4GĖM^;1FFzH|̔U#{7mLT0Iwg֐mFFVǍ$iA[Q3os_ROߜ}DRR/3V$; _@pR$ЈGy!]B,HCDDϙ}*{R'"7 C ,X"C̢ͺei\a72 ʾk֓&MxF5&QEsVybWȆwXǶ+D<^1&IqJD8#^"yԃ 畭fy2Yh~iR)ʱJyJ̶o^h^yd05Ʋg[~n0 &d_i/b6p*P.(TG\iJ]v2[a]rly2 듖XJ ҫ[ͫ쩣źэsjˤL +ˤ*Oj7Vq껪`|Ў+-%b׷-sim "hV浝>DN,OȡhF7U-3fVrU|Cj .Q$oa¬^zų(vhLus;]FnI^zb*&XCхh6 '/[ <':yم5{DEJhlO 357(ŖX- ʍAUԃn(َf+<\c;`nSl-t! lV-APQAч}8lPУ5鎆G cL.1Ex8 >6t.BrYV-3A&Ms^ :>vm_24WYż0MOq"dhsVkJː9iiLL?NZO)o7 [sY ,_9#HbX,j qХȁIENDB`dtkdeclarative-5.7.12/docs/images/IPV4EditExample.png000066400000000000000000000106311476226662700223660ustar00rootroot00000000000000PNG  IHDR<ĥ pHYs+KIDATx}t33wKrC("q $P.\!Q/Zl9ZEn_֗uZ+j/!`xIȽ7sg?\\x>s3(((xDN V" +ry7&H? \eu2!H. 7=Z4"H{E ' n8 =]YIKsb1A`k;*(J@ँ &-pZ$-$ !\>= iSO]MzIh%k$@:`2ģ`'Y L.i߅yF K  dE}Gj$IV\68PkBL M!j!,ɴ`ʑzsri?t!\Gcˀ g9@EQm]V6A IF8m/2N-GjFL CŮƵ'NcU¥*5g7>EQzK @p1IHʤ``O"P)`ʑ`>H&#mpċ$Z7z/ĭ(Jpn4]^,FR`3NL۶bڴ`@C`C+di׉?sA"(rѽopĚ5-th\w{8 [ŴJt Gcryd#v ZEQYHv׍?b;,؉ƈM^h @S|Wxm$m蝘Eg^e7s/|oyA[&ӀBŘ(/Gd01` @ru >!@ ֐H.[(7 #XR >ûu Y & "`tBSڊ R "ZMi4  STEQ-5^i'f4SZ%3q_dlDzE1̙M11)R~رGzoӚOX Q=-qRH.bV٦ CȂ@W ()aGg ʿK.*Ȉ8k}ͯ?sp&%%  R4=rSg.>{p˚n;}r!M7e.xy;!t`Ԗ RD ˄]m!J\.~ ՂQsԙ 8{uԙ TTQ7aգ% Ǻ?dG@Y*(JWwEB WOgݛVSyLmƇַ>>79~58||['\Me\A/"Î#gb\ 2{"w˩ۦ*]2ꊡg9>1?|iU]Ե+ŵs]E5m"./W.]> SF%fNWUnĩu۶5Miڤj^6aJ٨nLa.L.H㒲;_tԞ]K>u /!ŷ:}fr+o}b|VA vepͧd\o p􌁿M^eW. z(=}ք[?ѷudqÿ>"hZciCMK_Mj##3gNGEZďX'$mfYOZҮjdJ}fz=WkU$ձ2~n^_[^{(`gwze;)o.ec#TE1bʚO+_qCآEu C#[sT}\Ҫ⏓| ƜxH2z}`ÑxW6 tt͛Jg-nKgcXV^^:k-^&YΤ~߂Y{[)Ǿgd=4juoʁ7gn״W1A5"ژU 2pɜ0aajSJ\V(~ ;iBIr0{&^nYbY%^Y%)S } =x9g黺uM1( U W:?/eL?4p@Gk޺b}{ߴ[g{ qדm/vFcP;f=??@U\d%$>O_"kARfqLB n|,}uC=C*ǕF8k7S&>^<2FeܛwpyMZ*;yolcT5#B;}Pna\nǟTeow?-#$C-^y OvEg㺑Сw8w0<yIΰc.k^EᄉɉE#uRj8YF{ 7NCǯ7_{+FoS?yhF7wS0&g}Wnk7?u7殺+GIKg/4 -91&M)SU9~}n&+yc+ G떼ٷu;\rf-PrkW;!JZKo`),FsRz>^0BX`jN>ZRf;֓k?b@פyLtŠɎOVvgz 䖆 /5xm#2 'fgn3OCҵɿ9N>' g~ٗ=E[E ƳOLfM/}^.?=⢠?U,SfxaKOeZV?1RpՠGW-11pycL#3#azr?"^1 D:[+6ڔKc|*r.1 +_xo7G٧L kv(*Zʱcg:otDftuc_*vOK2ʉ_Dg6gً~؞縎Տ};)'q\& 8~0`zxXÉE\0ql~)ѶdF"8/W\3}~g.UjSff^0[DG=i"JϳE\ͼ5^[ =垺IJyـ&EQzԙ ӗqwT;ŕ=iTWtOkO?g5EJXMџVs=U O<'+^]X,z|`/`,z|qūdB`!+_{k溎٥6D\^yx\[ԣ V+yD R$opg%Ehs줩 dYˈzzfK>EQRS4a@qbJURO\#1X@O00%4muФWLZ(Q]w5q:XlI0ǣ`'K.^Y$. [F0 5 \X%i  q oP7YrN'hN4 @${e܀7-cl;۞.&DhʱTQ׼dd "ӵXEQEQEQ?o߆IENDB`dtkdeclarative-5.7.12/docs/images/IconButtonExample.png000066400000000000000000000036711476226662700231300ustar00rootroot00000000000000PNG  IHDR<<:r pHYs+kIDATh_LSYǿWh+Z b>4 dF2E >B|)d"]d^D8Ae2 (٘l4A(%!=PnK{n?I/~?(QD%J;ŋ !X@Y+~Za|)BPxVؕJET2I$D˗/3@ɓ/ıE[L/\}EEB`J)y,--޽{ERg$Ot_ ÷BBH JYCj^/_dK 򹹹VTT9SyR,//`ٮEEL=Uz``^5m `CzPguuu- Ø3Sp;H0pƯE!F0I,SmRy@2*JRY9I拤,ws#BW9YE숊6" )5l-bxx󘞞&P[[KV+n7FVN+5-<ϣh4h4x<ߟcl>tHFӧڰ> o߆`@ee%|>q ===p:D"X^^˗-X]]& #dE֔~9ICC=s 0::i@mm-\rܸqcccfSNTF`@4EWWO V+:::¡C\.W!m:'r2۶^/Hcc#sNt t: FJmâ|' ; #H677S ՊfNY˲ rK8\vVWWѣGx 9v={,(?~}}}&N>}Ϟ=#iG6,brrf?F(ǏI( ֭[xÇ#eYܒ/u:} DMMMj#āk$gO555x)tM%GX(t8z(vEO8x<>B!,p8 HVUUtBVcvvZ,u6EnaMxb00L0L` avrK6l4rݻwa6qu:55z*^"~?.^HܳWC8/ejyٳ?~D4E[[8@VF1uOkkeee6N+l) $;VT*|> I,Cgg'$X `|>RD-'[H$5h4Qaffn6MTR謄޽[RekÙFl[J ŢR^s7\)ZeY}is͗l[-:%5«X,$%I_2dPWVV$U0;553qE% @g$E#vM H>ۿLƒ\XX{ȑ,!B[ιo4s5;v옱NWLz$Yҳ&x$S:ػU5zcZvZjRy{߼y3-lItE@OzZVUTE݊aY}<2~:wܿ|FClHipD+^p%}'XPj V\Qζ%J}Y{#Liu.ѢlK}y&lr]L2_vGL%;l̖(RrbMdsZ\ Ev;"뻼>PP.dgy6IENDB`dtkdeclarative-5.7.12/docs/images/IconLabel.png000066400000000000000000000717261476226662700213660ustar00rootroot00000000000000PNG  IHDRWV pHYs+ IDATxu@&tw#(bw"*vu}* "*!( ҝcd]~z>}f}żX,  tA0A  AD,(`  bAA  XP@A^C|ok,/f۾>]&} 1GmA@ьj(koÓf/5otmt_@@}Fnp-yyyy95;oNέLUu uTԻM["Fh(~Y Q+ɷ`:n7dT|ob??eb+HCϼZ;7ȥ򚂸1^#j?ed0 ʯxMX;Gڭ4l6O?p:V__3yO# 7sUo%U5Uޗ|YU:lηP{ܹMa9 ADA%c. VbqJT^˫An)ex̘1KŽP757 1~qtnֹ%;UtTt&pw?~b)q 5) ?Ѩ 6:}LW)ꗡg 1^}Bިzz+߯~+L Nz[#gx[C^T7Q܇ rb.OOdC!wЩo[{ ooIe}r]MpAǃ"% L=:ό>y|rׁSG*q~j@gމ!KW5;WD|S!e5{*գvFajS"JX,V勽j" YvE Xjː>R.u]ny58Gxa8T~ౌV90{|‚.KVX3tpvc|:99T@~<2*{/O\ޗq2.,[ٕW37IҮ3Y,Vu.]#U|He~rS]$#Έccp؞bZ`Ѽmyb[Ko*YOG bޝy7˼DFUuߛXb/7td)%|Qw ?j_?`T߼W)0쬴l{l+K E @VS[A>5d$aNGiaPeNICWEGW2En%*@哓߻:\\ʛ|"t37r{X;{%黐v-.;3BS gUW(t0qUVs?-L^՝¬O%)ϼye蘏>\T@^㳑|M0o꼵T$I:>I"abz,m[;HȺ}6-v[>`NiԴ 6zgN=>|؟a\t@;q5,1{nņ.5Qv#K̺zM6\x01.zWwJD3`p&G|:Y۔dy(& #⓮XC/l5hf?]vQcDJ6@WyC5`Jth Ynɐ S Gab@_+k@,q=``T:ΐ nc#6&lv]:ϭe?ʔ )wV[S=DثOTsVg d@Q2s2W6R2M ;vy;MJa;Y^Vc.տOxgPd l>w,g6nV+2vޗ(4pxCc2(ɛ8uU7ak$8QBcF.2*8ڿKJA Qr{hS^PHR~Vtw\Pe&vVSgz~pM#V]@c p>PhvnCWuz[,zG\к:;Tl^z>GT P)4'=OXIcD}?#W nw'#6yK wx0YF3fCi<-Hd@j.}$iBɀ@T7M}ڵK\p4:A[SIhL rU^n9޻ ,{3ٙ3?d>8uEHx)46K~͑ ]`*5}riFdQM7?o)}a*v^ʣ ~:V):vb7CYKY?6Of[I;ω7P7'q gsV ^wA-+{] }uϰ떅 ``ȌzFk}ɌjcV8[~ɷӼ.ݕyNN8]pmnyA5H0a{P0_wwԦa5ت-0b1'϶2 (F{5 7X>ȘYܬY=Bsv< ƟPtFrKj,_lcکAp 1 0IL6k)26>%>Sy陶 4Sծ8S8Ȼ}n̐tp{An]L*N~!7wu}8Qi"ba7.`85}OU Еu4bc`payF3T XE5jgd>ΠS0 iLܪܬbDUv?dkbdg;:ҵ8LJg)_%Nj:j2490$6hzSvASYCCA\r ) )_yy)U-uYD\Acy~n [ZMsbSmS *!8UrJ :ڲ8#ҙ547+!KK!2j'a4'SV c|~u0~n5w،L+g1%)/\~e:OKLr[96vMa{S8  8ܿؒAvEJQ/v sJizۺ]㕀uWn]rrD\^{~Xf,rPNZ'ۙ< Qn:=#ȿ  DaI#fC+@u&W ap)8ۚZϭ\ W-{(yx`CLor*G=Z ܺr<ⵌYťׁyao=K $LYC{azٲGsP@Fs]~*%@ =G ;`R?t<**hk+0բP3H _P$u=tK"@GE\@jH1U‘ |H81N :';qe@PP;f6b%>aӃ ]~N2.Է(r2thzgDCe%.++"L'%%i͗<Ǜ]ry|Ho w01)wVT$M7HwSok)/, $U$[9 P zxK:~č/R.w:9Ne#֟$8U|- P6@LQ#i(` `vb*缻ktj/r [aL^,@ Oh>̷Z{9x}|}}N=j?Ci5N.Qi`v= Hsνݿsi`u4&jY7&&\{RiM+N;Y̷PtF(^ H;AkI! u~Ci~~9GBYKC儅iBS.W)h(έГc?[9tBBn׼4 W=0A/X|3fkN?La.)俤e\F#RF_؀'@SNuqaȩt(i_(`  bA]R XP@AĂ "0A  AD,(`  bAA  XP@Aޫ,55ƍiiinjj:tP ]LȈNIIʊN"?n-3gDEE}t:i0QWWwذa(r H[222BCC#""222x<FxAn#Ltww2e H3?QT^^}z^^ޏ*9 .]ګW[}޽{p3__ߜT77`WWW//7oxX~gS f .2f͚%u'agSSS2Q \prڵ-#qݻw>|Lttt477h€aGΝ %$$@ DDD߿Ys~|(++8p={lhzQQ@[[G=zhii5ۀbv=p󪨨 (--KKK|>3LӣRl'F[t#%%)>>~ѢEqqq—wڵk׮`ahѣG\\… 㝜RRRڧIOO1bDTTĉ޽;d20@yy߶m۞={vuq%%%2LMTTի333 ȏ~捫k]]gPP2$!!AVV&LUUU߼ySN{yii阘KKv:97ÇÇ?x𠒒R}}iӢ Ɔ z{TTʕ+---ϟ?o``UN8!BCCF;0ʜrsso߾dz}}]\\:wĸIII)?mmxEERQQ1zD O>RTTTQPP }||"""X,k,,,(J{1 80>>^r…1cƴǏsrra궺exx𩓓Stt4:!B:.sM?z߾}^^^s)Q999|>_IIODGGϜ9|jkk%t(?&`YfϞ=))GlÇ;whQɵK. eGݻwU]]-LQWWp9sի'}g͚edd$ڀpuuMHH\yfyyh;tPDFڰaݻ[F ؽ{zzzͶ:uJ8})l4}oذ!99YG:::.^P8JKKYܹsvvŋ_zp˗3l55Hr,hС/__$Nj{ADDD &_^EE%>>bĈq`lٲӧ&MZ|J~~|pp>㥥>>>Nm%%%=|^II ޽{:tժU_.**ruum wTjj۷o3.KpaΜ9N>C))i٭^dtrTYYق Y,փCv )))pU++Ė͟?ǎ{Ba؎;ϟD++WO?~#ZШ,rΝ;%MV//-[(((unXϯUP)))nnnd?kv/.~0$}sjaܸqCieeebb]--ZjժVܾ}رc[}511ƍ&qVd AO\I% 5Yx%w{]Óo{aCC)s޽SB>>>***6lxm3JVZ5yVSRRJKKk@LLc[܌k{/$7|f<շvXsRrj6}]l5$"}nNgݎֳE8I;~R+5Uk͋`iM0ӛ.̸q޽{ػwoeee2QYYwށ޽k+Zm]#_dNIGUIQI|eoʩeѠ;~V&xeWs}uCU7r;Ks٨BVVV9ţ4hP||ӧ I^o{/_Θ1Ė~\!~`7 IDATUŋ/C+Tc&N{3"/=((( P(555ggnݺ@QQц $$$ͭm@EUUU/^XEE[nO/^$YYY.]:vؒ%K׽{#GάMMM]pzp'?{+))ӧO5hgdd,^#;;شiǏ֬YS^^555SL...͊OEEEt-o" 5xMuO(skYŸ޸nkׄ*:{e&g`PeEȞJ[̩FaNbы\̲?N>t)]gNn|:X9UƁn .~g{K]֭38oeؘ֘kCf6xU1+ܖ=z6{?7qwM3fy-Z!ڵK x<o0ZEDD|1&&(3r?DDc+X豧ڻ 8;ľ7DHw]g@䀻 4sߤW+zSic[Soˠ6!N;s"UTqN{=.^?̘q5|kNl,7|ʔQ g gB>#Qu~w+cH&햓@۠>.>&ٻ6A5{܉ '-N5'wqW3Ěs F] P>vdC&׮!؃ڱ*=k CMMxРA3g$;@xf;p,Yh!Udd̙3 dbbR[[cȻM _Yh/n7u@ܾ4~xI P(HEϩ)9:SV#}/_.))hm̙3SLիWll,{ĉ'rޢO5f[چн M3{E˪EྭGEJ6Wu{cE.#/ݲJvvuQ3X'4:oTw 3nOBYYB^r@OOOA3W\9raî_N$&&>}CȬx<ޒ%KӅ r\bVYi ;#l;_Vs CLnJQ3j\Q1ΊNv&-`Go!@Yy՛ֺ[;du19Fi-mVNyʌ~i"u9WP[R( xUN]Ծ MIGCyK1h>߬j䍍o߾֭f?ޫW/ѧm寫o߾-w 07RCZG0OH6C Skm.w89)j.yޠ>R[ %g[ٞ}#L 6wQVV$b^[[[SSSWWվ>}Ɇ4[VHSSSGGJ֊vO5۵$T5)ʃ~GSxΟǖ ع%oZ%UT5 S-efgZne0|Jz*I)KT @y̠kHu]2YP\FMY6'_.Y_ y܉S!GڵKD)a¾׶U6"""RI??(0 om~]IDW ۲ 虶x@dJ J}'shH~JɈZr-vi}vA??hKOպ{[Uܻw稭sHf fՈ+C}t(/iuk7.4zfɅ>Фe%qV}cc&R *NKؙQ5:!<{);L7X*;Ry),DOUχ:{z\p^#zH>}4i:LP+so\BT/k?СC]fccC>;wn[?>qVVV[hs璏mmm#""455[5MԆP{0;nnJ^^\@|b}ú,m]MPB/J~PUUu՞JJQM]Un=Qg8|^.lw̰W \]]%%?w\xzz o !/mhhh9 T*ӓ\&VVVV访t{g)ݙ{}Vx؍:焬uӚ ә=]$$O4='G̓Kl[%TK+<=== u50pu[۷˥=&,ݾךoIhhx}ۏ8/wR>"oA73aj)xp);:dm8o˾= E1 [׹T8`u˼Y3{Çc]9ӤK4ݛl tfiiI.ի _Nm}В*LNNvss]]]**:Z-zX]TyYzU -OF27P_gbbOR{I& +qUUӧ\TTTDZ:u0B8;;?|pfffb-oNH]_uWIe^0xoc:wYn?/W|KD{3u474wS{v-.)ɟ{o^N74>zN_7`_ 'n[6cZ? S`͍H~zp{O>0 A3:ytגЭ3i\d@ߍu}Zg:܋?GcLRM7{oa,[7o^|ylvϞ=]WA 5j\vmҤI-7k~Ν;ׯ_`]v}#|.V7}*5 EI B w>*gU1T4$[* +j*T >` 5?YsoW׽5CٶmMb $3vGl8pSJJݻ»v _~]WWY6l>|mЍZ;n{{{8~̙P___m]f $mmH2Z$%%9sqoo~5h-"m`Ʃt]5@3 vp0 ]tEtSQ[)Z73]9;v1ctի%%% ,xͦ'Ni9:m``@Oyv>F_M9:{͵InbNUYZ?ʕ+h4!$"##vJP ̙Cr{d``@D6##C8affv1kkk*Z^^>lذׯ_|&)))Y]]=tCu 7nd0‰EEE»ikk,^Xؿ4i$ћyxx ŋcbbk oP^^d27n.zBźODтh"rM/--ݵkȿzXXڵkaÆ o7b@}}}o޼iggG6J{rbUTTPT???9-GL&s֭˖-OWWwҥ[n]rY4󵴴 ?lW,6LNjFMMmԩƷ=Q cٲe 6m5kSN5773gγg߯&̈́4eёpC]RpO>544LJJj9dlmff&)::ݧ\͛7۷Ŀw8ΰa9!!!ZZZgԏ9Gaaa®͛7 šC*ݻСCS!vXXHA<(N_EEϞ=o߾VW$l.((t:ߟRWW?r䈆k+**=EEEd˗.]zjfsm)**tK.N%r劢ys qxؾ}eVZemm}ٶ&=xi…˖-[lYEEYIJJv埬*~LPJJʘ1cf̘QUU&|iܸqΝ#Ǔ󦬭DOOpǏ=q№֕+W)==799yرADEEד/ 4رctĤW^l33=zcgϞn?x`r\ZZΨ+KKǷ\RPEE|PSS3dr1A rpO 6NNNaaamtX&&&ׯ_7o޵kך*))ƫTZ&kffpҭ[㦦my&K,i6-\<22RlcccTTT HL&sҥ(Z ٳgEђ޿b߿OvU5[`̘1իfff(Z 3 [l!o2,{ř<d 'ONII @Mft҄y K.gZYYY\\c #G>}t߾}sc-9s&**=F#&6- m xT*U0QSS}ʔ)666 i B)))7nHOO/(((,,,,,555555uuuCm_zz;wRRR>}D|2266vwwFqi0AO1 P@AĂ "0A  AD,(`  bAA  XP@AĂ "0A  AD,(`  bAA  XP@AĂ "0A  AD,(`  bAA  XP@AĂ "0A  AD,(`  bAA  XP@AĂ "0A  AD,(`  bAA  XP@AĂ "0A  AD,(`  b[% )by|U7 gIA:`\AN%ӹwk!{-;[ WU^WUy9y5׽̴߰O5EMlc9yyyA(A!.@p9,e:Uo&rT&ib<K pl?(C@aӡ! ޸^|Af+@-0(ieStq=VUEw#a7\65 Dӓ20#߱1nC`MG/X4TlFJpNWI ۈ{'= }I<\fGO0h]mu*C^KO_GݵjRQ@uܩKxi6? f/3 #Fa+-hD2[< 9%mk+ Jk;dϜu**occ$ԙsop` IDATֱ՗f߀g )q/Tuդq}~:$- 0*hրyS筝W"NyI8C co7ݺA@}ﳷiz%b4FfVڣ-[_y9F>KKzɱ)d]>@eɶӧX7لf 0-KyRo;ɧ 7)oޥu K{ys9~Y??zf];4;A_Cj$=yVXQ 6u hsf}'ӼmQ4@@p9\r>+p it*Mߴ2R()AuY|?q2&#K˪xc1`urG2P} :v7vg Q2R8Ε<4GA:&0`t& ҕr0nZر{%dMJ_|rTYU%&@X*q`FF8l@cdJ iBi^}M雧1djlY\AuI5t(*!W/X8`ck%BVZWg'9K`P>e\¡jӐQ[6_wq|0vQ2Hv3oe'?A~y(`1Y1Ts]d5ZvQ6FWH;zm_aL^,@ Oh>blU iNyY lxgp*+8.D P|F7 ]e ^򷫅_:1zw?Ɔ>aVlfnkUPu'f|C J1oǵ=N9e)G %4 wRa4+ظ6Q[ܔ{Eo^&7iL?δsSxȘMz(rO8a¡J8@mܑ{+S0 ]1iӍkkiJ`A`T9&[3NqJ@g7/-yB.e:T4EYgnT*q*ph7 b٣pY,étחW;ЀjdP> wq?e4054$[6Źyefq@K)W[2 14*-)ji)J@9,_[CdsNc2U[‘VQLk:lAcy^n@^[[8>Nc08<H:t@AćNA  AD,(` MQ0rN OĊ_v;} ?Dnp-yyyy95n0LQUzo\|S^_c}IW SfӢڻϙiM۴GJZ)t)[r.Y"e+{!Y+t*EYҾjߛi8ok{9Ly}π e]4Ai[i^ha_N(2qUaݍ l5U6tp9IHrx Eˈ?Lؕoyڵۭ^lյUu7x8aj; ni%`l{D鶱vkΐX|Lђ:P+<0I0bџ_|<&]uܑw;Ɯ|w_CF2Xc6, ô]΅>[*H`D O;1XȨi3{?9-.q8޺]xyZD] 4nCؙ Ceߤ]~&y}TE,K'$@j M#9;u#hҺ5V+O77jMųa%ctnΥUs_5>s^+zc}\ɦɸZ12'[G:) @Hɠ_klr%{AM|D^5O_*Q.)~:e>ZBPz{+yigd[h ֑#NF{x㖦''%D]ڻV>brf]EVy–B,5l>Qr]>7YH@< ]_qg{uYF0TժLtR#߿yBж0S&*^] =:vES׃QCq++>!$¤Y_UVMG[tӗ~ÆQJt2xdޒԧf?}^؞1q)#UCUAfN!!p2?#BXQSM1Y"?!aH.$"L!L`Qp 3 "0!X-"K 4sx$!d2hT-vYvFa,.W[YđPPtP_$!*PSJ_M)"D6wY e5 Ǿ !B  Bm!P`@!&0B  Bm!P`@!&0B $''_z׹yyyyyybX,ϾLjKhɁ ,,fjiiٹ`@t%deeٳ'==011SgEEEbbazz={ܲ~֕#`1lʕ+x<U8d===5k?$Ag==!CP</((`ժU͛#!c`lllo^__/XOаh̛laaޤn۶m666EEEB) WRRett UPP}ѭ[nݺѣBaaamiic!p;zСCLr9r'Odddv=iҤVp²2ssk׮IJJO>-!!qIBSTTdii ʫ### "%zc;wXYYS%ÇwhhhDGGOB]lh~IPP}3220455Zy…)S7---#""B 0`|+Wܾ}`Fjj`Innš@nF5w\]6yvɒ%7nlkGahYYYM8p͛7uuu7om8J߿/XGDD$))`B}?T[vm}}Ghh֩SVVV[li=Z@mm߰aè*8uꔖshh֮]]?BQΒ^|)$$$IHÜ9s?M믿8@fA0 ={~ ްy<-`K\S[Z),,LE Ȫ</00=!Z@tt<>55uֵ֭SUUm^^PP?)B}W%՞ᦦk޽{$Ir4  4gggWZZ/y| [իqqq-\`ɓ'Ծt(55SN- ..N0Z4?5B;LԞRRR.Ą ƌRXXNNNNNNaNgX>>={422jJMM(++^xInnnr<~U€ў ޼yt~{_x? F||k%''Kn޼9p@&GյkW\²֮]{Y*a``^U<==}}}_~3hk׮;hOyyyւт*LNNvuuuppJ<<<΂rss7tLS cv@ j^/_6lXl1cBBBô~F~ CўX,Veeenϙ3gQ -OLL\p!޽<==?~[ 9s[YYb Sa0SEEE  Fzz:|nQddd>R唔MMM(:Aoc0Skkk_| ZZZ_Jql /_6jrj_+**?~|UUdggSׯ_?w\jjj&OzܹׯSUUU7`hOAG= ._L=S eee/_RMAj/l6{ĉTJ{nhh(Z\\|т*ݻ|=q[ѣK]pV 'N1o]RIpiuu={P999zzz7FGGӧO---[`0^~_W*""ݝ+..6G?aa =P]OVVV h_Zrrrhn…$&&RZZZ-Я!++k޽M {t|||zm۶RSSmֳg5kjkk7w&!F;JHH4ٵz/]L(S$$$I|I` @I[[ɓ'9gjvnn| ݻw/_R}S444޽K8`eeE ss4L~ À܂:uT[[[SSO~_K.ݳg۷[mhhX]]?Ō20dȐoݺ?^oڵkLfqq1- ??ߡqΝŋ3LA0#d.^Ν;TUV+`20X7)ҥ ȦM.]h" .ZdIrrMDDDZ<TCzvc()W($%%xb޽[L'eQ_BĖ-['@\\\޽/^Hm6.fDGGS:::&V__obb[j2""B0a8jgd݇Y/O{jvO侘 7Z؇v shz?eǯ6n{Fӯ<8;,e\`{u$ _͛vE-&罽7?Žn5] ֯_Ϗ{ݱcUTTر!Gihh`w"{.HV'x;%=#{=_ gc0yqo7+OKxA'yۦh;/lKo?ի0EEcc cڴiӦMo?fhh(I%zE Y{zzzxx8;;SJJJΝ;ǯo߾}{ܹsTggg%KPtOQyc^:] _p2 ˟Z2\~au#3xf_8ٲ{C[6V&iuUk֥h٣K}of7.-z^nFf.7%p8-QUdg^8ɲ{g^VΤD9nuhUGϸU޵3Ae+2jѓV@U:e꽛fN{P^,qŷ~jDXXXEE۷o;F6%%%00߿3gHS1bĈ#bjjګW///M6޽jIqرoVTTPKJc:6€}DGG[XX4oD9rȑ#+**TXXXDGGc)w3n[]u[7L|HT1@ŃUXp-)>4`r= ;u^nK(>~dϧi1LWj~.0}9=n9ߚ-=|zҁopW <dIDATӼue]ڎ>Ϭ?+4m֫{չvCh3`]˶9fo|d:,_}qSe'WK-^Z҄0g>}UZ)cvI}w֭ۻw`~0p''' ww5kAfύ-%`ymwcۚ {y)uOLe?vbJt2?xZktn}EiIDgWX]\9ώ'\wr?>l;y*U؂;6s]?=Q0kԾ}"V9'`X?ղ]ʰӫ<88Z I\yɰ!+6uG{l}amb20^ZN  IR;w6Ek1 a GMNNvrrnkhh8|`倀HF999%%%mܸO!Zc7K5_Ȝ_ [84Č'O0}ؙ VguFe)VPQ'O :s6Vm|T^`/x}qQ%:SMd݀IrG5T!c>zp/"23x@2j[9uu ʋ8[_xb#P{{v\G:c<>z 1'.(q9|֯;x 0M70XLJ- ڈe7cF[*=r5L>k _6_u.++kƌeeee&Lp)utt4ܔ%U8eʔ .O8QFFꡡ- PE8qb%ȐeHH-3@u\T1OO&ޭkR"""dɒ  u8#99?FhL; 0O!PFGE5BO v}slvCݗy llZf7/^la;͞s)ϗBr9l6ߏBM6Rce ZIߦ-}lEA 9T`Ad@YC/#ְ5bp&44Og@6F^Wn$?i.4p &(ЦFLl4| ӾsIޗa"7m]R2@M(ISVK7Ƨܪ̄3TDMYn$ëOVtc׉*Q%w11i}4$!ױoEL- -L:K}s`I*+K6$F'd}(~nNآYrdQn]E.`frvHSJI|E V鱚T|>>Fpqfc[m=]U^48@ǭ[ʔScS'_',^W$3zߵÓk:n_*1'pgJQ9I^EAg<̈́!$+<[/r&@束>ێVU2MV]LI#?m0!e[&x$֋ylsWf EzmiǩAX҃v>+-+K=4тIܿK)yiW+<=?juOuL~2QCsYc_HIK7J!^;2(-A 'w;o؜̬ܔVL5O6eor23sGx]4ec*IVܟ9껜܂+xB 'gw!xݴ[w2x gVFNu,_'m:A# itC|]{J@36S˫$Jw &m0BcY#ʇz-(šv"JzaJ fB3gߣlq.N)YHT?9Ěn`:MuZFWt.=19+ʼo"~!%Ue>6ɫ9L+M}`͙ݿևO-Gi &^i=.-tR+o|#GI00Y][4'3gR@D۰νt$~]DZI69C\B!0a pm8# T&ߺ_)V>4mAA++߅JKk2b}?.E [[YMh#h4!~0dRqlݸ q_YPحLYw5MF=eȑ5=$gI|.#5NPTbLM({ eg!!"a`OqY4@|1G6T>Ͻk3o|@LIE6B9&SMK̟7:43j9 ] ^*Ǽͯm`UFtI:}5䱋_>[Ɵ;̵f[?72]Wri+9 legW ;> jo0Lڄ-)hʫ9̪WG-~ )~_^s=FCTUtOl 3bVXuSWS"JyS 4NQFl \;}%>q K19RS:7@B+HB4 ^dg9Uu.n/ыTcU[|\=Fe~> } B;VKrA|f )ʒaԲPA.6.,L'C%l!jKrsEUY"I. &<0o|ίc+\v0m^mqNn)O ؓsHPAr9~]SSRSI֕d疂r9\!,D<ѧmw !ƈBM0` j !B6BM0` j !B6BM0` j !B6BM0` j !B6?1/gsʼIENDB`dtkdeclarative-5.7.12/docs/images/InsideBoxBorderExample.png000066400000000000000000000023351476226662700240620ustar00rootroot00000000000000PNG  IHDRX pHYs+IDATxϋ]wgL2 @WE).D(;]p (de]\ڥBiՒi 54NH4\p1 9ifY}8{7wә ýVY:s+,o\o_~L҅{D7~x@.]8խ +ɩg''7& ;gJrd??ҤCݫ[Y>l$Yߚ7|-Nl־}'y=]J_M.f_gb6&dޭo?>zgC\|wȩgu`> c2;J2۞n~oǎ$I~[Y|f~x,,$9I>WrOɍ?'wo&Omg/??{_p>{_~7i0ϳĻYO}/>w1wv.f>;{7Og/au32]+y?<ٵz[IENDB`dtkdeclarative-5.7.12/docs/images/KeySequenceEditExample.png000066400000000000000000000404741476226662700240750ustar00rootroot00000000000000PNG  IHDRtk pHYs+ IDATxyxT?9ɾMDET*Zuy?mmpVZ b׵Wq I }O&9$$L6zYk,9KdX8 :@)=A,2 clssH]B' 螹qNARF?Rh(eXfO۞osf{8т!W8B)ehRJu]6nЉ'xu5Ms:F5~E!4#4I>e[B!#qq<x$\5Mec!:6 ,gnvn:d5Xa z@`l+4Rj6wlx1<1B1j{neY4ۂ4M|ǩlcCBq+0\B j4M1o)^_FV~1J BYG??h ߁1@]$IW=-WVNW|J}`[~YPmNsϭN0VN2 2qB''ڛگ!7$xW(˲i]Y ͈WՖLnz'*'+zY8]e/<9,Sv>?$G~ּ?<)rzSa|Ċu=lkkbM̑!?'B,]F|h6nPmD᪷ܒ4qh!$/rvav\W[/0^eb&i*W)ス֝ۚT)k)5O'{^Tx貯߾*m-]Po.M&k٭gbáf9&15tO]߾~C͑DZGt o^OLMK&zm m/?rX B8C^3w\[,%a5sM&5!-rٞietB #a2ូTމ޹$xx*4}r z3?.\B׽cX/~MsSϘKx~ tM7GW5YMjUmWܟ[[w$]Ciǧ4p64Dk'duٙىIV(Qs$*pGO'i+:wI2#|3_k8WoFֺϻ㮹s/0o\2ًԽ_]bƙƛu}FB*5Ck߸[IsϮg}^7!د6x%Lv޴˷E'MೠTL_8-BL~!Џ׀]3䂍JK~v?}v9뎹W]|s>oڳo|{>HC,VmX[|{VuٍӧzvB!MlkȥYeϪg&K% WKԳ[_&ۥ)!2tO"Yz?]m0\ 96Ow395(P\Ò:w곸%'w)U/~9s6ZT}ך"L &ϾYM/6_뿮rL29PuۣnMW yr'V̼cS*TWUYN<T2H4p^&F dj/S^2)|օw=Oy|VjBt&ܲ|) l9rjNIK)|/K|3N=ֿ9_v|E1 8X•:;&NI*~UΊ^WgSa.0ϳ/X{Z`sxv?tuY]v!tm[9w0 a]@OI  gа֝s Rnk{;~;߀eWoeT'qy=P妝/<{OLӗe+BD2#_GdɎ%dD Ğ7hQ8.Hgh-5\o5d;3cs ze]vc/cObNJP>257գ^DB뮩['8{ir3O@;JJ{'1omP )88n&Ӥt{;s'ЀST6&uvz۟}|P<@vopmEV19޺V[扖~ͳן٬vQRB}7{Sy=ߪ+GLYȍ0c?V50YB') #{`SN>)ݚgpU*ׯkHV:4yjv,r{3h-CyJn{l@)ހW]x_w>b&|zkd=$rc;FQtq7KO}.Uux;xy5Hхr.䚭o'/,\ok$kt^\v.Lwiޙ->> a2hl28-Oj,Fԥ?FYeL& #~ȴOEEzszкbm{(b qW_/?m;YYRNNNQ9q-wMַ?HRlB]V.bʲ86uP:KyK AܾO͂XFk~_nvPLv;xbYrPL)5;:ڧ\ME.0O4?m󞑼@{eM<% tg/)^k< &Td1\B'xɑkxϲGNɑ+mz{[+{sb\r_㌶VڵWUSG\1ȣpHR-y,O'Mh}_5%]ۨb[2M70Ĕ4+_Yn.Y374뇫y~oP&6Zs-8s:NJ.x{lXωR3OK `d7NR=Q|Jvr!W ƂѪ׫ XM.G}uW-{gIxN{F\S&I&` ܃_QXG"Lk'>;[=~gY{̞g.;v`!WxgWD/ag|T}/r,W%$2>q-?S~}=e?;!Rw7;F̘k3wؚ& ð ,1 p=Ό>IgkfWykrbWen4.b*S̘]B%TUe(~I|O8UI8O7D(8{nWgW=[đhOxܨG|~~mVCkVϼ+tr.ٙ\^) Q{='.Ci&Y>mnq:&}_1Nc}G]{ 3xg)U5Ϟ~swW_;+w.m鸘c@}Mi7ŷzCo)gő/zwqOJ4[fs{4 Z5υ,&A"H]s !tbި|{I[^;Wwy'͘jgln;oU#.^Еxdiܻ^xbFq FӏpV_23W9w|vR~vyCⳫuo}fܶPx.7iwl''iw/|immgu}mQ,mowL[`,r͇;|x]WLkv. r+]|>$C;}S=]#_Oq6|uلhPBDʷsЯz;x 46[ Uͪ+iemoМ)NΒ?E]+#{WnEep/\0TnӜk_%-sa۸k9n4|M׌åB'Q%IRUv qvo>wvpHEwwwn2nUU%Ir\`Z-+9[B|ܔ%87D%75w98ajI|ƙJ>Lf\y}زf@O)eVHdԋ?iqP~/ij)Soguee6ecδ3EȐ6%JNvJ87d𹋗=p4:NBw|;}ʙ_Ɋ:ABr'2!WJ[L/I?ƶB$,kt>u!O,˲,DQyd2 4:VdEal6bZï.r x<{^*@w2?6ɲm6dX,fY·;GB!_ae4A$]ѣ*"",qqQQlEѨpUU f1˲LpE!4$#Kxy^4$Ie`,%슢 &O!HU$#"uSUvKa<3PJ=OWW(k;2[!5x@ 0oJl; R[znX6268!FHVM|>_ǜ₄Af($ WB#` 6ǻ*~jܞ=]`چSH Bd4 @Ԓ$gh@6PeX\UY"ㅠ]u$8B?0#kofAeM!l \u]?~ Y<\ Xg_v"k:w=so|KI*s/~z$KΦnug(Gr{umn(^B.='h4֏;\,F\I'M͗UJ/*`܅gYBfc-U|VZnoVU*(J59L@;޾ ݟ=V;y˸\aSYZ:+)~!zAnCy-l^$k83sI;m'M\7!6q֒[_}?NX;ϣTY@{ǻ=;hѧ^}F @Sd&J5IXA"t}:">wďM#2iOn8/߲J&۞[(9Ǯ PCkRSJWׯ:BgϿ˲zj߿w[mb2`D*̭=sK/a)үNvoQg~KW=j ozŊ_^$ gJΔyږӶ>6gK-)z.MþYB -:BhzWoWߴ[ o8|iNN5K]/x.7Q?X@/ R޵Y{A̙O|e[C9_i2`DJ,vtҀ]d. OlPgM,̚]`ޱ㓇}ל~#Tqz^ťκމMkaG'jeߞٲ[?'ϭnݪUw%/v& aX}F!P#oSo6V_y$]ͻ4[9e%?9.c$qҟ G7?+TatC#WsZD+?^1wFԳocIbjcOR֙Zw_ .}lVz(~78dz_N>m_zfeoA!t<$D IDAT oyyFo}=ڳy~L! r 9ShWO<'y7tFsq !LOCm)7Y;Luo{K"hd{+/=|¢[}O6yb3P=R_}@)5M򪋧`"b/oW[INMJoq;bwk$>\Ʉ[^0m&mA?pUU4aHrY>&na^oe\g\˳xpo;c23֮97d"JsEוފן9xeB@Oڭ䛧F!S^fC5y~S@o}llAY'dS 4nk-~gK}i:|oL{|VvcӮϟ~c“?&G~9#I|/Q7BW{@Y`cv!0z<%_l]yP%n}O-La`aSN͘%cf߼!2T W!c9S{~TM,vV!qZLv~%󯼮bCTw9y"ik:5]2n0F!}bK{^]kU^7k IÖ҈S(wiJ3]2]}޵yanMKf^sQƠ޹gt^󓸚!HZ}$3/]G70' lBǃq/p)YCyvioݴn]/$<=:n#R:a\Ekڳ#ywZUb\LyO('4-Vח1eS^}>NÅD}'ruoam<(λ` ,Ri'Yf^kED.^3T?sfuT^;~!@UMo !HȠ`'|醠A ;kK+H >jf(5dvq w?ז2y\ {|}iފuܸ(H4V߱ .[xvѣ:GBbˤբH|z@B֭a`WQ>ҥbi^䁮|U7.Beی{mISR8%"OL {̨IQTUա6-3#\}'0frщM{ՒNI_sʒ>iۺ-at[>X{bFё~mp=;/=%z4SL,LP{$5sgڣog.Z4Gx-B;BK$㏱:uZ$,kEr ! Um/Hkk똜!O,ˁ@zV 3|Lh&˲l&bfAΓeYUUQ^q92x 2`t"aeYA$I2͢(n64&TU ƹV2˲q󪪪-ۯ#*0\B04MYWeǮ(J,ey8np3~~Y;c.aNkF!w̕yMTgEQ4M4mD5{@0Ay~6j8Nd2IdHaM?B t3Lu0d2ָ>gm6# 3k1HJ(,~*0\B!$t4e0|&l6SmKqXL&QFaIQ16sBt{_C6zŅ^F &)ttCF@GOBoq*8n6BUWu8d z9Fݰ1 N5 W#_C[a2z˲,B!Opʏ+ 6ñ͓2j [.烳Ba ]eY[x4Ƥc'qe*q#ouepG.<B1Wژ|@!~ deYdCMXBhN[e%Od٭0aˑVյ(^)PYR tUJ3 7M9]U<rɊ45]U=4U%K `%t҄|߹^k>4]xV%tk6vY|m&6k[J9y)(U~X~d{ ;Z%GFn^h,-&Ojᒃb|Dyk<δ$PNMJ 'ěR^[4>NЕR*TTH)0pf/]݊_$؝lKcg-է䌅< @5M)aX%kw۳!}g4EVoT$ Ҿ?H׷w߭#B/FTSR?7BM˃L),Hh*=kk?1[Uu 0,˲z:TgjbL &I96zQs0ę3%Am޳7k&mO͙{y k8!|ʦsKS=joEZ\DZR(7:s4 *,C)gtݝS,fITx$1v"SS}TҊ6YӁ)/n`J_a۪u bi}{=yX' {/7 ؾ0vu]ԨQW3"SR"M`p΄4[ϺjJ1&%2kf@jh)QWL?T8XRoIJOS\Vuh8he;c|"tYxb=kga<%4n:{'6U}%9]{g˦2oanS,>XQb ]84QwX哨RJu]'T${ QSMHٶf!&;i)PI@XGb][aJ+h ڼUimOU%A#Ws?| W|XR)(Vm3@ yI\rՇ3\جh!P[oTqJc8ܿ|5%6/ns:Q]749!đV85..Lʏ-Y>_˖`+-=HRb.ScxKs%E =ZhqCEDuOrclo,k=R6a4`5Zc]uKLAS% !`l1Rc_Nˉ7Q_.oIy pQ̉IdDݢ#:BYjjf[QF#5i 6Ԯ:%65Fo:L zp,cG7)dϺ+umoiW,c/p奇OXt˵}5OlZj\R="iW^uLVO ח(%IQe&xލ-If0?ggQVA6K=_S*f}x_u@tO&*W[ҩV;;HIvFfVQb͝Sܳc̳Unb ;*⩭ɋM(B$G爉h%0!F9PU1f_[74U#Qrwk;(oT۩Ԥ-mh+j_4`U't᪫R߫hMdg"8w z(?3,:__{≯[b|N(^WbVtHz+^~o!NHĒTpR<1OQU&Bf)cMI (-]ngBB!ZWe rkE-d5`X[+hoZc,}ݬ3]t% J[]Z ,Ukjc2HC4UoodZsb;9{"[J~n+Tu`BjtK=TnJ>m\i,BiIwb^^VUa'ƀ51W5]ASdEڇ Wo?[kN_IyslUwL\xraw'_E ]"sBfA ~ B& xkK(74'%v`M%REjo˪Ca4gtw0@Q$=6% RSWdsw<򽍺Ay7e\>аwk 4LyDSTvT 4k{1Ĥ$VèSW~!JeEK,S@iw\vNr@֨\]=?aRh;:-+%>HJ`@TM(PMUبuhE U<ݪ2SpUȘ}_Na7G4mkgYk|&ֶӇ_,quE?U%I[K-ֱqӆY5BDK҄4;1&[7߈s&eX  rsYiWtjv h{{zk6ӇuM ͊$\+ؒf{9LthmjWuM!{J%$.5q_]'*RFpD @=MvS=nQec, /)=ܭ1Lq9yi6Nj,+9 T4ߵP0%ٻYFwuphVw$!6׶t5 Ѧ>2r-X+$n޵yanMKf^sQƠ+3~Kw~;?mէL.ޟ?yt{/@ s8o0Fh9=jMM-o I4IU%-]xSD~7){qr+/ӑzG= P 3m\v$/;ڐ )c `l6Oe_9ʥ{%kN~҄<*.>Y<,f++?[ ֙9yF\Vڝ017܇[T팋r4#< Mjˮoe̾bԦW_~酏p)Qa?yϺٰWI[|MKm 6RJ. oZj'I7fVZBȠˁF9.0Jȭ{C[H_Դ+:??zҳ"aHA9mB *6W&Eit߮.{]]].ѧV%g(~6hm1i=[s\zRSqmek@ĶfL5y#SV @=2J>̹L !@抲6#Iq9Y1bD U%M|jtSzTסkksb4C6<ϵL/?#^7yDr߼x~3ܬ]uFAbT*,-\]uvyZ-yg7.vo1P},B?rMW ʃ\l_TS],sRd+*׵ؼVm6"9\Zd%)2Kz92:!Fibz6 'ɨ3B/`)%2ĘRbsUskEu/SGX`Y z[5W5+5pz*rrAùFf*wT77tΌ}~F~g=s5e]!X\ҊW^Sy.tE\}K'Ξ{`7Z-a'f=iR#sDo!Kr ww6digm ! uvٚS'NK ]/[fUH166E%%+>_lH8tᦦ`ۉFQKqZBvgvaVTqE֑+>xX[uZ+ʪcM :3;xY)?>yxnjQ,x+wBuUӽ٨4菈4߯DiWmߎ>ݼa_d?g.8ȹΛ'|˟c']Ga-u-(Ik)ݽElL!z[Y>U|K Tشs~`I@W{?D\&ό6pfG(~O!v߷HՀ4,iw`>:+?ɑR0κvOJbXlDehKUE(@*zЍm59!bVL01AE顪 ~ov\uU̞#'売 r҃%;:bS2+k^3Qj Y|qmiЃwamQ1vj|ԚWodN̊5w3GDPJɕ;}\tCb^Sң眲䪧nڶnv<3]VEG:͞mq󗞒zKSx- /)}3 }͜{ƙh+7 ֞h=b*"lƗ8?즼%)5Ƹsħ z#\QD#G|z6fMVsx =NX| >KB]`[[d.250IOqDwG o "Y }8e,qSlյ>M ⩯jLIѼ#sm 䂓Ύnt bv%fdF9y]H-Ȋ@tFQTv, XGimmbBeB1 WBh1RIDATÝBa)B!40\B1!c8+B!4e9G!y!10 !(q'dY! #YY%@[+?Te!Џq|Au])x[B'BaF>z;B &(B!40\B1B1 WBh':p IENDB`dtkdeclarative-5.7.12/docs/images/LineEditExample.png000066400000000000000000000102531476226662700225330ustar00rootroot00000000000000PNG  IHDR<ĥ pHYs+]IDATxpU<#@BV*?TPhNiv_PK]wԮ]ζ;NVg[ꮢ X*7?ιF$$'y^3{9=<9y888888%SˊE h "XpGX`ǀ ;5*C䀳rm 3 S 5 "=d׉XUɃI)΀ɂ f5Xfkb~[,= neX X,pܵ# 0Z_;gP0i! d],2hGR JKb@7VlJC` q2JF팙OehZڴ g֦fhog|J܏e+0@* Aj[T E!$"T5o_+3I)=k.Lk?%-!$K?^Ԣ*v,> \TY|ʹyoRi8'ɖJ#L&@'F= ?ߕ߷:j &5Qut!I܁tP:&'j~y {=#t]KO_vϾMO$\NdCŰoKe9g .9mw~KmzK]}_eO3el=fݝ)^rgM|g^9L- ѸaǬo+^tW,+Í/.^hm\IgCvd\*bJ_> !kJF#8l;3Pw7]V6kTkU(f0m;Sܒ[z(KS{čfj_ ~Fv2*`9۽q]mn߿eW{,imnWܾkɆ|s`}cɫƃ@\laNuxϾMץ2+co\ls;ub.IZ04&P` ,FC8BDzo@W֋Y)6ƀ6 glw,ârM)!x Z.L&1q>cL3`: f 3Lt9 |j .TZN)_xv|x3 *(@)FlܹEmSZ6$]Mo;M,X'drx0 !)aL&#h9AMaم@AB4G%~GۀC&U!(AC!KP%P d3~_'z`ujhy(D բ0WBph2*G@IP~@VSQ.@V:u.0d8+ ,$H BHu,VU~`0Jظufp> AA+ugʅ`TŽ88888 !|NuȆIENDB`dtkdeclarative-5.7.12/docs/images/OutsideBoxBorderExample.png000066400000000000000000000026101476226662700242570ustar00rootroot00000000000000PNG  IHDRX pHYs+:IDATxϋ]ɌafFiKB)I], B kAΖ. "@!PDSqIRMI.F"}$3ku˹ Ӱ]'NlIvgf\Kr13ٺ\ͮU Ύ\=ayax3g`36Z|.Y^Ϸ2a8[^|ܤ[&sǒlϟn^np۽4.䍼d{ќ8mҖɁ|ORtvJ@'KÅ$23sxɁCοo{@HKzbxLQM$/IVX`Y{iٓ$8;>l"ݸq拉r |Y|q/Oi[B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B P @!(@B PLd%Ivn&-0$7W5l^8i4_.%IV>l"WOZ:'Id[6?_I ÙI'$dnܗ#?`S;Kw[_|f/i ÃZz.f͘ngs(3d9;I[&$gϾ;3 ?9eK3Vˇy8ϖ|5x2ǏjS_dvT-|?@5o|]k~pܛ+Xy| '_dvԴ ɓdKrp{a㼒aMxwٴ@駷gvIK']k: nqvޥ YY9'\6љ !IENDB`dtkdeclarative-5.7.12/docs/images/PasswordEdit.png000066400000000000000000000105501476226662700221320ustar00rootroot00000000000000PNG  IHDRP\m: pHYs+IDATx}xT՝?ޙ{g& $$ !PB.Hl>j@jwnqnյeq}\ǶVEĮ[k@ŗ"/ yܙ{q$̄@y!3|Jt + a'N Ef3 9 +aB*4HA0(9C[ m>$`+\8hA$#D6kF2G'@؃  / '$fz<#DXOD@zG߁(X@؄=k,Tx97"ld L!'_0 JV]T@$>{i{"Ǡ( ܅ro׹bw `~[Py|)BrM,N@S:;d4$2{D=`˃ :$?ĒX(ch4g#:WM>È܉ =ykAr bs=$r ܀[]= hb m.0:D O:TB]_W]lm}3S3/}aq06"<=Լf࿁II`5jMU*UMqJ_ӜSAāJMMpeMD<e\?P=ɍQ[.z𽌺O6ʸ~!,ٮ;gXAh?6>)}ax@Ǟ !^;f1w{j[^GѨ|$ 7*fzE %7 4;m-}+ Edሖooz1yL2-mdKGm^E}K r"K0 ۔J/C5EG]$ɩ] ,8m v%$N2;q#ɾtN :,`ww2km|ifĞEEvw.L 7+OqO&=&ك2ݨVX3L~^ܱZ|{չK+O&_M%)iܖc87r+}>T5Qɩm*& | szua( 7J}e>3ߛXZfc=exR{KAp:?. VDЗdw) ʬ=#ߪ)_ o='Y `7 ;np0tkǮR٘FY:KT`?|ĊWoynD!ԛ`sVب*T2o0R?w_ޚt TLon[F45^t_Ӗ4c- - )sWʶ'!eΕe_sےP=(no9@5nW⎍?fӟ_[˩ˤ/p\7Ra=#߽,Ծ($:]Qoÿh`Ƥ [f-ErÔ] =GÁu&nfYcm$bʮCGܴ]fNQƐ+]ާ;7>|@݋_uYHҕ} |ȎMr3}{qe zu ηPwS1ePh^F"r@S2AQ pQ1/undWWC՝,Bʆc.TZ8~c2d9s̻yNsgP?I;a%-@Fˮ4xu4b~2#ZA'D Ϣ2Q.4@ N:҆X2 eM5;7h,Qm< y0IA gSy\SrP fb0&ԔFs/I ]BrSqʳ @ % P6ez4 <)* 7l)O- Nc+ 8Qќ#:)" u&8<H3hEDBtxxÿ|l͹Hl^Hxͅញ",ނ4ϑ6 ǂY$WFtObbq\d=p Hv0Sdy7D8[ 3SC6lE1ǔ 30p MHVyƢ8':U&0.DL(\PU)X+=HؿFsV;Ț TKz$/= C{ 5!ix!ȟ!3ȳA1md>| ,'14Fh4Fh4Fh4Fh4Fh4F9C{DIENDB`dtkdeclarative-5.7.12/docs/images/PlusMinusSpinBox.png000066400000000000000000000074401476226662700227700ustar00rootroot00000000000000PNG  IHDR@Ph1 pHYs+IDATxml\U~9ΝO8䁇#*5+$Ъ JyiM-EQ՗ERE]JQV]AmIV,DҤ& ly=3᜾;xtyʹr~:sB!B!B!B!B!B!B!B!B!ǝ=jPEP夝` |pipYp'NQ47r1y00%Y1TXFd+̀-A[;VQ"UU@ h01h 5`-9ȇ0&eD8LX{L< ~~ |) &c@='A(*p1Xb @BA0!b c ߃l{M8ns:`\.<3|SG1AJMgW4БbM_nRh+ˮ20P A_Bzuw^5i_Lnx#Y9[2أ,GC8c,Lv Fj٠_un]Vqm}hLe$ 8pSP&Z}zq@EEřd䗇l) Vw8}?1]Vq!rAlKjg Gyo;;;Z 쵩lIu$rl]]]:;;8pT1/۴q^_c7퉍~=84? ^@VS"w{r0nT޻w=TV@Iv{T]U\aVxTZ$Y*-BmR^r)馛4Ƭh< 4Ƭz L]EPY: *gy=)5(~ZY8jʂt*Kk9 F}RuTU-vN݈.r`4pp8'\\*Ig[U&k;}~r>Z2ٮuP m*uFu~B̌TͅKLrBOFkDRKushq=OVErC!fAr@3a?g;-k?ՠ#9JMZwkFٗJ`ti!Z\Vu}tEQĎ;زe 7M*eUu#ZZ6b -[UM7 v$M~0'6_yڜ;ڗWKU-v)4+Y܍ϥ`~tK^wrQ1>?/ xiwwi=# ў#yKfKKZVnWw?k~zp(<oTzA{baܹTsF#Ԭf-oqWapg?g3Un{r;>+Kޣ ӎ;xU_{nģw=М7h6n!@ ӱ~!S>txT@|/vʯ$"` pmٲnx\=Sꫯ}z(y5{2YwE7}Xר ΂bc K.m,YBukw 9Ӻޟn-?C*W^sd९?VM!f`}[[\|o\ܐ}7d PC`!<2 ?v# ?{[Ru0B̮_ΛYYtF?d=q+¯UMj:OݑO?;n QOk'cTM񊊦w&u_-$X7NyOK;=nhE`cgpk,)SB &y:p֌d(NΗ $v>Le$K bbBxRAp fR53%n・&GuWk!+S (t!|~fSUZ. qk-9 ~>N iԮu p BG*;72 Z`2 UxCAA3kS"xwDQqod3&j6D(S]`K 2W⮾o6q,Džovnˏ 9qCrOOρgϾRqnRhgϾs5Kv{T]. J~Lu?@JyPۇ[taЮ`yd}mwk;zEՆwm,Pl6L_k'\f_>frVmZ^xᅿ{駏SEM6=~;] C܆a+;P~=ҢƹTv(ĕB+APd.vx3ǝ(~B3!B<`tbƂv۷jWW}\n}:^Vr|jxxTڭV=.\0t rFP}N񲳼aԉV~A!&kf#(Jځe7p4a#%< 1n@I"*b8DjӴ^yd$d-tXӣׁ~! ˮ20B2; DUG|4ޯRh\]g] =H[ѰJiT[Qr }W(W}(i(FP`, ߉B*L'5& nuOV#S;Hi0%֧Nzy.NZA2T"DM/iD!2[1@j7j׺G]J *0x &NfXtrI@C@\M¯YoK1ٲH=U  ,T CP,@#^C`3y5*&,,f#@M(i׺[XeD8jPEP夝@P,@~N[v9IF|iC{~keXBO\&{m*ڪn @!淹3 FmQRnnڵn!B!B!B!B!B!B!B!Y͂ IENDB`dtkdeclarative-5.7.12/docs/images/ProgressBarFormatText.png000066400000000000000000000264001476226662700237720ustar00rootroot00000000000000PNG  IHDR/0֍ pHYs+ IDATx}yًenuQ4AĀg<C% bD#$/@/PD`eesfzs,.lwuSUE }@0R8p_x^I (QcO#B0 C!Ӵ,*~#OÜ7ADB0~a +n$٦iA4Ca A.iOR_;2-QpHx./0pMm%x'E5Tgn%} I3$=H@'Jg{,&@D3gꕴwXeieeeiSwT,ֲ,0 ÈRW`KFumok$ILX @4@.hJ>K@tqU1K$f@2 D ՁA=Gv gޏ(VqORJWlKF0_Y/lLdk ZB%Ź]MI}N =5=J? @aS8x(W0 b4j[Oxu f(:2ؑq%@l'vIHVNT'ޱ=aHij VvLJ(qO̦e-OVrẢHj((^_'&?"][vSJ @NNNIn˲*++ BmCXCw}"X5&-tڕ ) I=4@ ɝH)Jqc{5Ibɐ㝟]XӠޟHm)(@M0jaG8'!XJK+qv,i)wzrz|Jn|>]וn:k'Wb;,A!ݽDH}8Gt)d (?yt^p G^jW#N_DaA t|Q%ay y_3ֆ`h>&uْ3HF;^|] #.=زp4̦iaWn2 5?Ǟj뉪ĕDxGx0-RYe5;n =08"aI%~x6cWz:ѧp%= yg8AW4t+$ xl rrn7FKyPEE R8(D (R-ܒKeJhwP ܪܥ52%h2"(3#EٷS-FqW[ZBxq=fr%6dXLAh>W:YapJt&q_cg=0 odl'!%s;,o^{Kvn̙괴o[|ZVV6u]vŔ߿[nٱcGs:vDĘ+ =.G'n&̳_)k^#_#⏧czҸ>|m;E8dbh Hod b@`s-6.>8 o%Wj>]sTG,˚?ɓu=jgyfw\C}W~azz[8r옚`pݺu'ذaCEE3/]@~z[o !w޿}G_pի۷oժUtuʔ)+W,**}18jTo%%70Tu ^p DS7}Sr呑7!/UsT׻x:eeXxqqqq޲e7|sw${ zׯ܋-/UJ17o^NTIAA%\+5kV^ƍWQQ1b7o޼?erPh…\riGYPPPPPVpE]۶m^:pdv۽%ԌV.\@LL;=\$l/9\* OmUAtY'Lp8vNUa14+6_0* Z2a83^.~F/ h[ ߿Ϋ2a*A bfo/( B_ÇW]7oqv(˙gyuj"@D.G|RJo,Z(O<_ҥ˜9sҎ>o}̙\pJ{|SL?`_[L؝rw,nK !:Bcc9.?:g9ZѠpj}rzHcӠFN)W^{[oz]vڵk/Bt:.++ϺL2G:묳޽{?)S1{}iVUUUPP0|YfM8qv[n~@QQѽۿJJJ\Ç$6Rp`m.j4V@::+Q6K]GKx 0w0=. @a7nյxev VtF^Rl 23aW_}s=s.;wN2夓N3gÇ =iӦRYu'W 23=RHen<۫lvMz/ӡ;:w5pg.;?A>2%]xizЅP ( B BA]q&uGo&Ķ}X]o~I,GP\Qzgx0,4M٣$wCCû륷sκ{ ;;vX駟\z饗^z)P(4dȐ+Wp MYfǏw':u*..NICj[0 .n[[ Sꙉ58=llfbs 4#e&U' YпsUWt 6L}%%%SN=6o|}s1*K.1馛뢢bٲe7|gʬzjo#G9r͚5a]|}!CxѨQ XtiCCڵk֭[CL cRw<xz F-Ɉ !dl>*ֆ2 NR'քm|`>ԩS'LFOnt]_f*|pIIUW]O0'ƤXB>RH)t|nJ]Di h1 z\"¥̐xm bmb^tcZWAXT߬3@y[ 09=_vخ, ~K4l 1`wqǵ^;qګV9s/ `ڵ=3Ϟ=w޿/L?#Ǐk⊄Ya# UTTGL$wjk-|Xɘ I]${L(bu){p4*7BteYzxn?AQx 2`G r;"/l:]UeY*KVWWѧOYfϥB;v ܿ>_󨣎zWVVVTTlڴNBql )4-玮Xܑ[M'I@cLȤ?gJxs=t!}XU!o3:%OC;iӧ@IE|{ؔw ®wq)W>ylt ٓKu] Pf61-[f0`uF~3V/^xӦM6mݺg3⋧zGݻM!nyzzqcǎO>w]t;wQF2Qm .ZNs=wm7[~Jrڽi*QĚ2|j[SSs 7P1<+/wVԆX6d1 B!Kmƍd .m~[F[n력;'y (  w5~ ʭ|,٧ϔw}|b$nU6w1褃4GFrx5]PoG˵!ˈpyyyIIСCpx's9K.}'z!K/R^p_RxwgΜ  dLOO_l}ݗ;iҤq~'x;tÛmS 8'́HАҝu4/ {}ZD|W OWE'Xڻ0^*'%JLl ;gs= h={9sfiii.] ϱcΘ1#{ 2_YY N[tiyyǎ*=bwŴ$t~׮έ曍ǗUWW_wu|'z@0/Y-VB{j0X>wXA2G Ypr8I*+H S2R dۧsyku&Wn_`1Xbo 2tcL>l1] Ñ܍s/B㎥^ÅEN:w\__oǜqFyEz%%%ݺup7{s5]lڴI-f SO4hP߾}*_`СC8 IDATۣG欤֭[k޽{SH XuAY]%羚h0A l'~A vǴ =+,3}HӠ (1w[u뭷NfCGbİjk %)}Hᆬ%aYDxG5o>N=]9ZZm󘳍5y8..&`n7Dقm>zZo>w dt )qϝBG~88vޟ;(yr\;9ܟIS™B mz%zꭷ-X2Hb'dh͘RrAi/Bh*:+*Q\ AQq//DƖ K!.plY"ftO Tʓq  Rh Rp8e>"p,$ J A҂ԓspLI<E=S,Djh80p^aûZw8Ghf02O;Ԥ[qeY{%w{Q&\Z5͹(i"q;50ǣoE;ÇkNwı9,Qچq0/ԯ_> YZac?]xY@1% hbZj&'M5z7N!E`eY̦il0'"o&3x۶*SJڕ庲#ٙ&ǚ(s$s"#%;49t@0f&a}{hAdZ<;c7J!9d,q՝&`,cxk'US9}w: w޻*\aB!uwfB!Ͽّ̂H#euВEJEϰ"q"WT3fM.tzfYc`,e ;AnA5HzpjmCdx+.ı'p~sJ`lA[N;fp8 sss[cF7eeeUTT(Okk$)XIû'x%3^G9o>#=F|&ڨVd;L ,%,D"gShu M@# KvƝ#1] o1sap[dbw+%[ 0%Yd"X4lX5LE2l3f ^n:ߌ%bI"X`S؊t{N߭yO 亐3Q5AYV]XZ(`OJ-fRZRŬ`ḯ=^:ru&ft3}9 >.X#Լ[YYYj4ڇ$:ꤔ?pXoojP KXTo>,MԛŻ5ڞ21wSы&]05R?fEEI99.'OSl+Osw@g£zZig48] i;D@ks!} i!`r}Ȫ7Qgr]Mu3hJӲ$ 4Ia ~uN9]4M54kB )0 |jʷWrO%݃P( MTև ))$)¢!%BL /c \Lv !د#M4MfHd>`](-#u >,Vf(XMɐ6+b0xt !8MGtu5iiBɱ5FÖ:ڍ{:|jwU7dXDBȢ0)FH,.({X]]qC& ~MCm4Ӡ @цpx_4@g$< e`aC f"6! 3ho"4CO4~|t24a^) !\y mE 8HABB*VdX0%šR9T@tl<ytF~t Zdh{#J&]'Z+@F0[LI˶`.HD*fP#Р hD;Śu5ΧNʴv<(׉) prd )l1vEmb44"CS#]@$Jlx]˨Xt#Fx=PoBZC5]#b?%B[}@%Uj=D+ }>)]ZJHf -KSKfNDD`AΩ5b]#XS+""N ;g|Ce15 l=@Y KbRmaIf  Q5A#Rvr8:÷s*')e,HLaKJt:%q)`%m#A,*,mw 0aH$:G.V撡/R9:=o 8CvD)ݖqO0\ڒfR[N(EϬ@!=3nmKuBPop"xpA7 s;P8;RqHx"qAer~8G`SWԛ8h?ex"ikZvFrL ?>ngIENDB`dtkdeclarative-5.7.12/docs/images/ProgressBarIn.png000066400000000000000000000041171476226662700222440ustar00rootroot00000000000000PNG  IHDR@Ph1 pHYs+IDATxݿ<%;:p~,8@Ѻ@emnE6;km֢C hbA5i}>(t yVǹIVB^-EC/G2`$kok ز䧭ɯ/e%Խjv0o-=@ c{p:N;sϿ@YBy?0DĵmrYrafF4V¯04q?xnd.\H)6}{ݯoK)eT } b]YMU,іa8Ύm# әh9G ÉGCXhvD2(&MkB"LS+4HX=RT0^{mLSE4@]yBUoO=`ݫ7'T5uuOLQ5ɨm!͗ո#)#L#*ROq -E]s߻k3uY _sKkfe40m*YP MYB6TPz겦.=.~&5/F[?6Yvdس^o]jXvߤeEݶu(=A7J>XQ8GKs2"eˀCdR y6 T0~ TȔ 3OExϬR~қoQ1n`cL) *@%'PЅ ,ЄYBMMaF` L8J2c jv bty.hvQCj`F!arޓpxǐX"u{8<i1RR2jFxV"ǢItU࣋J$lp!HFlmh1g Q6 5Pe3q}?Y*D95GM$c5_شVOV 3DnrY^6' 1\p zc#m/0R{\Bl 6+<9i{(ag߆_&Kr i+ok4h6!G`nyM''\6 Xv@a0l9P?Ѱ> 2"߆6Оtj(&\n| v0lݟj ]"mqXzQ*dF\ MS]nks95?H\IENDB`dtkdeclarative-5.7.12/docs/images/ProgressBarText.png000066400000000000000000000160021476226662700226160ustar00rootroot00000000000000PNG  IHDR@Ph1 pHYs+IDATxyTŹuN1 3 0 ȎHD4 o4&c41hLԛ,W_D轟D_5 A$( ( *0= vN==3ӳQΩuz`0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 p$Q(Xb価RŌTvU!gYX -}7K Cê#}]"TXrY1Z@Br%9H$G{{p$Ib@h3\O )e xbZ\xݽߎLZ==MJ%ϩ=egMV)SZ~ҎeIz~8#L J> K?,ellh4Ybœ\sR 46RD1?{{~٥ӯu]]강u0@M3Jmaᢠ#%VwXFDPJ"Hٳg n[x5IˏR~sO궧?2!уB(ǽPk9(2#cv-S "ض7|r-y"rc= E[n,(zDKn_{ $3>wvY@G(h٧p|߮-\l=hu]W>iҤ!w}s `5U͋Uw^pͭWWvdO!kTV96o6WC۟ feYy@1ڒEEq"af!PR4ԴZh triux!f)WND2`8I ):3A7"Uҕ<_lӪ=xܚXǍ"8oM#S"ؖo@tu, 9ew"?h v^M?'|(_8#WQ-#(R1ñEA"" Jא&HW 0=×ox\v_bu0қv[ݕW"j+i 4:]̅}z'`ma iO`7"Lc`V `T;daXX^ K{x?ID4N8A /*]-@_(H(IZtjI@KrA!u[KZ.9"P4ţG[Wwpqz1šSw:@a Q Qn6ٿa~۪nZ?K^-Ѓ+a*mnX=ygwuJ]fƺ%g5?ѽݝb8…}Is,kY5 WڿgLNS{i0o?SY89ߺPfߗ4HM4=zY)rGNu55V|ˉ2ظ )Ȱ*ֿ=a?CƏ礡9ӆ$ʾMo600cx5/-Ii1Po`KFsJT}<!+@urTwujvh+zH8T)ziZ"˥ ƌ'5P. /uO'Y$ǟyswȏӹ2. G1[!Z,3O<VYt @3VzZeHfv~7Fo >|A^?æ*V=jWoQ@aw: gzXv ` '?+dfBM 隆LrB%.gцmF6Zv=Bgo[@>qØo?]AСrj3\q(4/WL 0KfPuV%.6f^;L".;VBfqF03"o9 ՞d׀XPϴ=`!4=)?)9Xy( U9sޞKMԈZ?g`EkT" {OWzDײa}'y2WX[NM9W}3miΖi%+Ͽ;P5LT83\ ؚV ((BlRвi[@J$DpqO*ET#O>ӳ $8:nF}}x`cXYCU 4<3Gv& Ctk6G8m:ە`-H7 z ;|I4ev&Octۮ/q3?ԆD޵*WsbE{%Hkq@[ap@%_6D`uKe :{Wȅ#}x~Kj{ ͓ݣh/MV1fV<^ ˞Sw߲Or.uAf]?Ixs7Nku(8~|nxsvQ|{; Q|}uj1 =[@4EAN pݷ̽U0rl^DRMx#o;`00_7Zp# fިO]'; zܖ\ƌ`Op<^TJ /Wn/Lkhԥ2"'%vxLF>d%zSൺIEcd:|X*VsV81"?]Z&o a5qR1aS2%>f KR3;I a5{*wi`Ms$O12^Uqe~DlH?i|9Zd 1RD4V>/ewȉhtѩ{N _t:˗LRS!^Fm!Vo<֫%>xQ!t̵2'9`E~2qHl;:2:u3hJg{tz'HF`U.ǍɡX+KNXURW`? v-ײ2\[~ y:H@7޶TtܵҲZ⭃"S !40B^ڲ/g%h9) ¥`#A Py*W\2B-N c9\!Y/LY>F|o:Ni w e8SPxrer`{64svq< [>6m5Tu MԽLQbX5|?Z(8~*ΆOL|t8^ǒW?RO.Ƌ*E/Ru,vUżHO:} s{~ 8GbW]+WR( N\;Q4USJ8K'ܭ~zW}σr?}l^> y9/?&`eޯM`˜XgΝ·.&?2uJƌ \vAK5^f*)`d{[<*,ܽkغOMz0*/2## Œ"jBƵצMkXr(r{(53K)\(?A *|$y\n9t|9,g7:9[~>UB-EŹ4<}"κl?w\1p w޿YU~*QP5iĖmW{)Sf3w#󫀦KK \,455 k+L5bZCh$CoO$t(D DN K2t@HFپ}7xr>tuq1!AGm{'̸~$1:pR4xTG#UR\WW7t*زe˿nGZ2멜X*jBhtTn¥ttݯ޺;ag.-(kY]xyVJmEt& "=6>(ږFu;vX_˗Re!į }.VU  +5xo̘s* o2ߙ.WS5%Z3Ipvz#lM`f>ñH8nll}ٲe/vmH,m]4]MbQM&?# H<˗sPK˾D n@{rSF2= TGHhSxSH]p]ֆnLpc'fl@ñCrKh$>-G1*R" Ykv4 %sb@t<(e!>ah,p\'D$DcDBQj'Oиۥn aXsVwV|xK~С K[xmrIFAxBE4u Q"8)&]uD'hx$N$5&hw&44^M|@xg.[ЃEP4 b8"ׁ07} Dbb((4f1pM`I=(Q8h')JQ:NI81Xh6g8V,^6<'n/@CU!FtxhG)! )qDD@k\"FxM]v5X.Z 2-[_Caz)Q܄,(z;ZoA{m,AYʱHX>5_%9Ы5.*k\hri$wiޫ U3t{P 7  !4#4G4]b'ƍX^ +b(b!k4C;Ru+h-8Z'Q.&rih#Bujhˮ!PYXȈБDG_I*F)j*SgҌq}n#|C:b0 `0 `0 `0 `0 `0 `0 `0|<^IENDB`dtkdeclarative-5.7.12/docs/images/RadioButtonCheckedHovered.png000066400000000000000000000045111476226662700245400ustar00rootroot00000000000000PNG  IHDRx<~ pHYs+IDATx{Ty ,*!JimQmZE ڦ@+1)Qb"H>RUPĂyM).ܙ;; 9ܹsbX,bX,bX,bX,ұP2F1'ҭ`PʜYΔ 6F1q8DpIJP1ES1|񙌶xơ D(%J(q"18(4%EHi mh`cbĉpc`r IH4#!4DIїUrǡ2J9| d#@- E S" 8G#xVf65"Nބ /{q>U@ٲ3>w}4@d/1g)1$ EѝTbL<`7YLϧi@\Ca|(0 5M2؁%}7Yd6keEgsKOU0qk<BpeD8{IKbЧ>@P%(B8@+R)fG:|MJY`z(wS\q~kF#\Y b SQttws &p^(`9X\ˀԟnx"/o%poBfOWo{C[[mnsU<3x;e*Nd|Ps8LOzXsLksMN9 +jhbq\;k(!CP:j%OQm! Z 䍴 R灍jDۀ$Pl)Rv 'tC{@~FPf!`6<1A`?-z1ՠՈ]܂l]|zhӾlJc}dfԛ!߀{,~ wAsIC?<F &$N(}/ϦwkߕсS b$ սAQ} 0\ 60kM@F+J|rDWcGGh1ØOi:D:4bNJk#E]Tn{)4y@b1Wy8 GmO!^%((]y;>kĘ d,8Qp4x9ΚnLf/8HM}?3?d6kK:W+7rYO$h"˞v탷_D\hdf0:M Ҝw1 ÿyWWdh.h0 Mc~ S^+,N6#6nW]EJgbv"}r)X i 2lX\)YK&  df# F"6bDw#[ E'WVًA,VK*/,3'ӄ}F80Xb I@Uj_דOI*Z6@)A~AEdz!k.Z "p<1:ABV -ܠ./Yn?\; V@>IpOq1uz8.T,>q:.\\E}EA 7Õ]s Tw!rދdYxDt>si/:\pi=ѝƳutgbX,bX,bX,bX,y9zL?mIENDB`dtkdeclarative-5.7.12/docs/images/RatioButtonNormal.png000066400000000000000000000041501476226662700231440ustar00rootroot00000000000000PNG  IHDRx<~ pHYs+IDATxi^EϜBT H]h4".( j/Z^BpW!@  R"K -\@ h{/<}}Z&O<3so?9sd2L&d2L&d2L&d2L&l\ c0; \Q^ZޥЩMv E˕&yNL5Y荏 ӵyH ҭSQ!(10,hc,Չqu%*JEvL Jj]lg 0Raq1EB8!, t cQ²pLY䍃a³:L׭68A +-B`F6pE9`ȯ=)tZcs/\":4pRW]f!}v?6d}JQ4Ck\W Ox] DvK'<#&c֪58~5JzI_ЭàDol[CZ{߂[Mmyst1:Fod`U:L&V"~\2雸f=y6l L 5:1?eBG2cԃzsy>`fdQYmSh%USÌéx?Rm mox$H3_!` tŅI]'v& c :c~&)UV`nSٸq.:嘂'Y x ېv>۔U|3m $khH+$5 $ ;nuLS?"ע[! l [g֙SarM..K&k_m)<#u-v$П|Qދq$J܆[[=Nг4I@;)IUL ܐgU#vJ|y|Gwίt^vd,+\}jhX$ۛd,qQ.m!LW硆Gң'Hu}K:kϮI3?p b"VUH~B3IVV}-AUo % 2QKx4?7p1"52Xe n;$u)Gzz&-taz{QsS %` ?$ڗ?Sg4䏌" )ww,L yR4[dj et5Z>l:_VKkU9dުH jυU.|6rse 5EVdv~'ZBus yHNW~yQ*h>l^lS!SCHѴ\Q򋵇 8#o `iҚh;ho^Ք& :6(9FtI8Y(cV=!WoΥ.bs*߸z qP-pǿWxz>GN<q/',Im,KO%p Vo|uދcl?(˷Gq(c3 =B*wb 0 /q9^ bB>gRw‡b28.࢓vYoz [=Ϥ5n %c\^g$oSc1傅/-yBX]7|kNݸlUw3T,Cu|18Wn{ cu_Iq.~uzΕ:N7mP czJgE?[s!';7|M\شɝ[ O墓?5r8QzmQ@fI^%8N'A@]8z?٥U)68Y"?;l6Uz v)Tnk:]MxEO[9sяpkO݉+:_Z]Z|w4uM ﷥*3R\paNVR\ХSz=ĂvEH9Y,A?VD uvweRG7܌c5~-fŸco=xVvK܂cl> -]?kxtOwlI1Jo8_lKE RR>6ó[i+OJOJA*G؉X(yVu|:'u:R N^G#utuEROq/kk{>.>K&Z'MEŌw<3HS:.szeJc&ة}\q7ECaozW+.zێ*n !,r6oقFuOb.k[4b}_Wp@j9z^ 0b풧V$*wtY+Шb>uGQ|]3x ".Z8z[;ڧ Ep1a ݃\~VV6zcМam/Hs*۫<ckޭVK/4ADk+JK;}@ n>9Sע^d4w喝k%Bq͉ܣeI{ ?>Kպޗ> G/;'Jܽv/;-jR[mOw5Fp'6d2L&d2L&d2L&d2L&ɼ?+l˃IENDB`dtkdeclarative-5.7.12/docs/images/RatioButtonUncheckedNormal.png000066400000000000000000000044261476226662700247640ustar00rootroot00000000000000PNG  IHDRx<~ pHYs+IDATx{]U}̃B 6P`# B[ۢX[-Tڙ?HKvPX ڔ2: %1 @^{kMNNI22;g:o^L&d2L&d2L&d2L&d2E8R1k+e)cpE j 0"=4_.+tRfE}̮ձTC2dԠh4hfE} k bبQmpfQ \0O4q[r-J{ L3+aS(9/~碍m؁Q6֖۱M+4)xu,lWԨi'pishSzN*X_rqLX3PXfФ9^l^0d }t~Q L.zSvX)z[* ׵,0_v7AЧ᫇(sxc :N Dl*^_|ݡk=05|]Z6*O ;qJ11/HgHwgO'a )b֡K&qK3; VFǽ2ڕWz˵7y>,_K~rW^!yy ).X'yU)l-}Y)x>EPNRR6Q^zX&yN}x;~/)|~}\]U_J}(/0hN'paogp)DSVQ"8 llL[ wr{U60:{%ddu?$WKry/Cc.^t2g\+m}x~F3[VOٝjJg`g{$?[C1_SqE/Pکc<ᾲ108vI򃏗7pƝjʏ^s>~lOo s߉;5hzo5[7Һ:Ù#tW&;'K̉G sFyEvT*I-u;%z$by_{M/ \e.0gQ?;G0ˀhzLϫ[#iμ1Iw' ЇC$Pɞ!tuR)PrOR\0!GBJG%WLf]rΖH NJSmeapW4vS>+ <,8 EmZS_O?IsM&Ѷlz'i֒ Hέ?UY-Wiq>GfH_S)>jfI ɛ gֱ2$ |ɣFlf?j6v.3Jl2K*psqa;0qapKq[µx38٠c=:?_f+/ 쓝! ';'Kܷ_tGwfBmGw5Fh'6d2L&d2L&d2L&d2L&CBH) (`$TH4&`1&Z0FT%lC)PL hݭe>fsfw6\{{>Lϙ9ߙ9p8p8p8p8KO*(ЏgQnG kXԯdAMш(o#Q│bJUGh{f:IŅ &@1P4ca]i % IsX M@3s/ĚSk:XEUasJ!^cY,; \dU~X(!v~u$ 픹Q}MJ]q4ã Dȑpn#&-U8DjvA# #tS"Ka9giY:&(]Ѓg +YA:X2D42Hюk"y (Kp$HtG@]- z< f$:WQM>q<,?;aY*A;QMC| >d..lD9 k,LCTL=IC,BAT#v,y 6spi'=ٯ=Wik iAG`Zv!D(ԞAh0A}~*%:b]Rm!֎%#aGgx6`pSr-"WGTގZBXCgL#Y<ܸ^sn'pfaVȪ{ (~61j(+U#j.;;U~?B?r>˷J$|g{o%TH ς<_صl3WW@Vet|j䞵~uE.B :XٚeqнABBNZ9a-ա%oЇԃLWp?LmlM_?Ͽ|x -"w}DCGL]||0zWz`,Q>_ߠr!uH2co#T?RܸmEx7IPNo#ݩ ߃W`J\&'^GW#\:]pEDI6mP=lRF7|`.4Xu=).[Y*aia_P.e 7O NmmggD`٘4NdnUXN$H \ EK1s7 *!/˼2zM}\{5 aۢ \$Uh?KeS x  n%=M-!l+ޯS::ZzdϾ簬S:f䗱Qˁ`q£'T.* e[ӹ/NB{N!m`x}Xw+6\P9a[;V}˕(er ||Z g=;<Y8\Jl*zt7)Ia W=vPLmQFp7 )<BLCƎup)gahyMÁ߭k=e^XUr(׽]"5 β~y+b\:$9~B&F4c%Xu 5:=5Ýh4 綘DE5@12{Nga<oSi-=ҟş.Ž+ ,ͫG]|%2B1{`;{z(!*v;OO#IkbXŽ[P{B.C9?z8aT'F<>1ETPrxfl|r(3(yL\E@|>ӛF C9&!$q2YR@kFXIsR>!!ycV`ӢԍV:,&}1HHd -l2wr)JkcŞ'M<{˴J3#3zY1?Q6SV4QP!L㻔"%EY#LAyG8M !FTxb 0#7U\$ӥr;) NBS x##Ȍ]?{]_8gY>,Y->tk]&fk&ۥRa,}^%T>2=;,sHkH\k# m w?uQQcsYmK979;2&=70Koy+mbjsI-ҧm^Ƹ{G#Uǥ {1{}@z~/:G nRЬl_{Z-Ku5@>޶~l\[BH;}W+mTW>`#m5yOYC}z}Z%A F|OcջC0y`Սh81hԮVVGjR݈5j-xR+N`ԦR<1Ԫ\Y3kG-sBCT@T: sÕ:vsZF~+*OOjA,`›m̃浺]Vo8hGR-ձmO)=GعrJ 5px luL阞EEbnO(U{B!Ekj)$Q0h=陫l׃ G$G7x/e$M?y2I\pxi=1sȂ2x{D끤F==ZBt&Ƀxª9/K/Rk XB> H4|f(|?w!"R[c|3 />0Hp9V"X OoxOHmopo͞0K+{ϓIԄWT" o^³p׀O}7)em=zCiC$bz o s-s˯׮O3yҹXG p|xG9vZ/_?G7$>Gx} c1px'KH%C JZ?ux-?厣C;kdث  Bpz-$;xz xջng?jٌ8lsZ`x>/tOA$MDj{$ĢJ{ڃ[,oԀ% U$uU<&] q$7Zug!]l,KkZ}8zsmOÈ{gsJڻV^J!H yC+CJS[g" ~C$}ղ&Am2=Ǹz0eU4@\.HpK!kOA2Uۊx |z ,<q[^Yt65Rr6-N*YybSc =6T@ֿ%K@[Q$|6\"4K90Jך[S_E.3DkX3CJFYm$j@I➹ :&Ip&Dby + L gYkڤOyf1Uqq;nH@Ɨ˖@<5S5%!C$.q2[(hM@MH%k^BI@  ׏-cyw Z=HQ[[! -ƫ9e,' %K6pi!hEjKRT^[Վ z+R}DmY=v^B3xf~gH R[eH*UJ@R)E H*(I% $RRTJQJ)J@R)E H*(I% $RRTJQJ)J@R)E H*(I% $RRTJQJ)J@R)E H*(I% $RRTJQJ)J@R)E H*(I% $RRTJQJ)J@R)E H*(I% $RR MO qm vay[uRhn ')% I}DmYsr*䵶#E嵕Y2 $2=RcK{V1}"-(zVN@%PUs( Z 9O435${Yv`\ Mm\ֳ"HQe Q#57t8]@R˳X Ny`d|s-ykfi^58=s ܗUb L gY;6A9!ijlq=txLB@7a%jV}Z=g8dD_ѽH9Uj٤K=N#5gIR~qD&M<0Л/=8;zA,NjlY x~Hhit.&y=]H@Ɨ#x y|&V'& \ljlY! a⩯q[ф aS[g[ =8aSZ=Cx01H Ѱ- 悤M1vk1vFg\=HCxC<ppT9Ԗٮ5IgكXJZ qwԎxΆ4obE7LrS\/(-p9Ԏ˳wR;g[XmVVI< s |kju |vx<}HaMy~Qԗu4 ԗ-_]Xj{.?|I%\)iV5;\{j7}iB{#?;]^C$r: $v 2oC*yk~ <|r8pk7[/0~wpRC2/ S*Y>#6}MO/ןy6cw_yXUhE/[3> ?޿|~x%>o7%RگV(G~b:BLBy3`{ׁ[[ׁ_9<<!>?>x8 948K!Ga5op|58CKqJsb5!]nUOREj@PcI9H9,`!A9*$kԀ5AפOk5t}X ZxP8H41$!Y+xBO0,%}|\^Kd\]rI5 J$$jcDT'@2QXh9zNd~F3H j¦(Bj!ZpmyмV)H|mZ^cۤ^EhY3>=KQ7zCյ!-pup= Җ:5/<4#<܀Դy )=iI<(xߢQoMC{m2ߺRJΕ1(F~O gy(-DƱՍ |KԮV ZZoR ~4y+Bzw􄄫kٻhH~tKD§f8! -WѰ{z`Eǩӧ7Lh׌)yjUA/5^@i7{\`DVFЬ%$q~}_T7L-s^YM#oj#m7ڽA=žz^o9"}Z_P/C3T%~YzxZ#oz6ijPHm=랡5e-m CqZrncS~mm?Ǖ2m gt2ކFkIENDB`dtkdeclarative-5.7.12/docs/images/RoundRectangleExample.png000066400000000000000000000012001476226662700237420ustar00rootroot00000000000000PNG  IHDRddpT pHYs+2IDATx;nQFsG4(ڤL>, Nh!>R&;'~Of4.Jπm xpLYxͳ R7 a0OZ~C qɪ/! _Cŗ3׌.]p (A95}ϐ6ocAVk(poqO15dg%k21K]9&t;C~FNqIENDB`dtkdeclarative-5.7.12/docs/images/SeachEditNoFocus.png000066400000000000000000000044411476226662700226520ustar00rootroot00000000000000PNG  IHDRP\m: pHYs+IDATx}Pyw'rá(Cvmƶd>Ihl'Lc6j&Z$D%wN,ow>P ! >ܳϳ.`bYSd" "Dd鞺l ȇZa;$%dbw@Q accen@#72鿭#8MBE}#ws<7u4=?.qcopdt+Dgyyn뗭 sg ̵>Te-I4aAG:neDDy{sM290,^lƐn-i4k:aE̢Q,cP \I`Wfs*х,y95APu,}cԴ3YθET =$&T{/ 3C ׵B4UhR4uC6pᣭRZE'5) q d^x_9^&J+s|=bfhk7(&Mz6go:o6&oc֖ %G0|imJrjմoL]zYGt%^{鹃D(ґQHe1H1SQu:fy9eSv {WbBn58>&.qقK\seз^+>u\=|S0qE]ן~7m%%W孤g'\={ڟj^W L&U7ISYKN~W;Lԇ |oOOn䭕rk6>蔉I&.gf]>٘&9R#$[$=ü1£;]4T5?֮o^$S yYGAګzL(7/q {8Tb{b]ZQrrX[ ZCdg緔Z"?%Q48{wh?u}B^ #ĝiѧ چ!Ah4ZO~!}x'mϚ$-/H>Mبchەlm#;>H5^=#SaPL˜m*/S A]CøCQ'u#䑽ѝCDwån^ՠ `pR<IENDB`dtkdeclarative-5.7.12/docs/images/SearchEditFocus.png000066400000000000000000000046271476226662700225450ustar00rootroot00000000000000PNG  IHDRP\m: pHYs+ IIDATxMllڋ$ ;;Ц@QhVQA$VJU!UEeءMVH%*$EBJ ®1>f.>X$vz~7osRJ)RJ)RJ)RJ)RJ)Rj1KZpI `0aT"#t!"c3.:X6c2LX ,fɇԥ࿗jm1E86I!eidF`t0A@HD@,f>c) )$LM"%\C> 2 11B " Mg/|0d$@C:e 0L ȂA2 N"Rb,%@8GVRnP_VdM߿$Ssx92Thb8߳@e cev  ܺǧTNG8p :1Af217 9 $%&-'8ːȣSjIJ܀p~XO+XN)c2g>7#L Kk0l%I`pǠy(YȯZC$8F>㔸BIfg۴KRn'eZyp MbJ,y,0hN=xjqt0E)i4A97#m~̱ 8J:{C߫e2{;N&G} GLF0us'o̐Wb,;q h+x*D{S>7b*D0Jd,ϐ㊘01c̡jV}-+b }E X",·V% lVdHH@@\Zͺ+@`ƒi\C #nghPWKYߣo"#b)EMV|ƜE/媫G0cb{by 23HAt?|Ogܲ-|,V}}{ PaYwwwǽ[wqy1@ĝICgN>022kՕk+w-wm: YZ *uHZȨ Gf9Ç8 j)y1{|}ZWXy)%t%dI0ԁ/O2PT >Re`ry!#8aS&QK}HX@C^FO00G` =R* ۟ 2u*:)*#1AN y,ǀ݄2$W䁒Ujef!'v`{`3Ϫt;pbH0mh.♗ba P3^VA2`1pIRc# d@GlNS >DGK-=b$%&D2y ;דIcSjƀO0_tRBFtp{z 4 p8b}-q"幾J-Yj1ԱBZrk ! $e|>$$"_|,oWWJJ/??KIEpboa312&h_h+36^_∦'אу$fѩ }}ڕW0xɾq./'J)RJ)RJ)RJ)RJ)RJ)*?|WQIENDB`dtkdeclarative-5.7.12/docs/images/SearchEditRunning.gif000066400000000000000000000562561476226662700230740ustar00rootroot00000000000000GIF89a11),/7;AMhDTwE\GSmGJVoJVpJWoJuKdKrLvLNPzNXNZsQR`zSSTRkVYnVYV]WXnXZS{Zc{Zh[^g~^`j`ak~akablblccdareogUnhjkpol}oq|rZisstYttvy]lz|[p|[q||}r}܂ăboԈʐkp͓vuȖ◚їؘmppoßנuqȢ}sͨީӬٳ䴏xx㻬¼Ǿ̾⿘ȮȺ̴ͧʹԺŹֿؽڹʸã̮мέڽ! NETSCAPE2.0!,1 H*\ȰÇ#JH}3jȱǏ CIɓ(S\˗0cʜI͛8sɳϟ@GѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶ۨ޹Cgݻx˷߿ L/:w#KLdt-زϠCywS^;pMveta;Em߮u;u7}3}NgKk^RT4MmLiix䑆IC8I3bQMܥiW7\ 5yh΀F ⥊TEM+jaQ^6M&ZdX*cHxS!SE#dPÜ9D2ԥ%i!H]D)gP/+/Zg?H*|YH u"XE) )P:чrKFH9d&PYz_`ki wuJ6zq׋UB͓s׈%E)+R2T[Hx%pt2RW4cP됱fR!˝*8E:~%B(Y‹)߆;nf+}9A%]ZL&Q R0sbu-܉yMF{8^614P5-}rR'896\ou2kxW;-wD!dz`pTa l6D1Ş\Ȱ[S׵v^G9J 1gLY9^ ?<#yon:msNEg$qמZrFffd>.z֭ jլɜI͛8sɳϟ@ք K$9R=1cV,X0]Xjʵׯ`ÊKٳ_5{_5F(!{{ h@WO\u~ ʄ$h%"wgt ,6p@((<$ 6݆L6  I//csF\v%{`D##,ėlP $;fSL*|#& 3yjꡈvY R (h2(Td㦝#kPϨb @ PD*c/*kt EH|vk}C *;Zӌ:@ Ӱ3̱!^eS' ln:[)둳J ߎzކ $< i`lzQ2dɼ$˔# :*26%6&4` } tRHPcN9T#-R26'=xpɀLk˱BMTd Yel7-w")dϻч&hb0/L>8Ӹ>}U|G|Mx1x$ 5+F)Twj#+M[O<):\ܞ7TrȻ9% qy (acm^;6d)mYsLԮw"z EЇ|{E.Kh \qU NV cՐ,)­DњV`y@Rag杭ۡr 5v .X ALQ d1 mŒĿ!&6<`2D,H3UoJ#eėjD Hmi"<8!8\yB쀳;-4 <4:"KfrLP rAG1)&&3zÄ*3a6c6[%'8u1}zpA=H[تR- }XJmpVMh|eT T h{I54O{F(AN3JӚ6JRINCR-t'ϘQ"I:JN%4U;fT#hHϏ!yHQJE.QzZAiUʔ %?Nxch ="kR0CL$I `K†g#܅4hjTcZ p$1,9q,^F2MjW62 f4YWFTx^Q^ pKMr͸mq. ;rz xKMznw35^ !,5L6H)\Cs! Hŋ3jHȂJX@4S:Ȓ6i.F(8 *(U6ULS2)ʀSDM$ઘ-M.]5Qʥmf5iԉJf$\}mJ6`H;]ڔ-ޙo(qu T24b7_PBg0T\-KVSYȡ ̜M0ZYpEZagT=_^IF +j| Sp _Jy 1݊J^wZ,)`_' 螖ܶ|V7yySUEVZ:45dӘM,\WsJ)*~=$TM7崓 l@J T^HJ,2 7֗&TgL}H,PcICQa-PC əZɀ-FFZk(:bQqA*vfQMh=8QU"YmF,,P*n,TW|b]dbi^abQf")2Kl0Eޔ3) S7'IC9SJ5yQ-YI`#}7@Б}hhF[!VbES<5>31bZko 8n屎"{6 ϐU gʳ-{ݶӼpڵg^@ntU;tb]R)S IInø>~F_eYq]owׇE~&54K1IFJT_e6by&bvX&iđG 9 UX90PXw!E`kBW~mf6Xcgvi# : V!vY4H ,V9Ym]7Ǖ9riaѦpEeI 'QOE4̓1 ciΠIh^BDBjiE!,,E fΜ#JHŇp#J5txI$!zD&t ɠȊlႎ)EH\t7^8ArС @\N2֙%CD8\azUVq1)EЗ.JܠI[R^Dz#G"({Dp2C/#Q`12d#bpA5&΅)W3&:44E($: J7QE.䘂,CjNAIo `wM%N@xL)hX 4J r !@0M@G"b'cB_X"GInn cQ6r蠄 8#4&ǤE7DIПeL4X(b*ub-jLX&޸M4p2rH%@N1)! }`ᇬj{b[Ix8!\pQH}p T$ˮЋN7̲#-50v} 0H[|tr))Al'1_Vr5&7F84@%BE)hIY!B :ZّK7xJX/%s]=6AqCrG(@Δ[DgÅE|!GKr-NWEt: # x /' t]ySMޔ`xE .vuܯxE[ 9~v~gU_/OUdTJ Sj*MZ:3{'HA̠zPGh!,FN0G`pIAJHŋ3N4ќK$hĂ"4\yaY(7R'XhH ΅"RDVVJqdnl))$4I3àz3&c08mUt"?*$hQU%*.]ٮI@ `J\QhcWn ja z;eFWcTHi#:j w%n"- -Q&Ac)V#U)GyDK\輝dnh^D7.Ic8[A :AG]D2(l b$VMWeVWA"C `]}rDԔs g !t+!E[<$ 247W>QU+ ?`C]!f lcCPJ~l(S8G!T\|#@C6G0MY : l䁈2i uBRm +%3P62䠒 +ic Bh \Q'⇜֩҈cLC$; L87"2pB I @у7I1[d C s5X lpXv) U0v3C66I# 5ð,$ ab%|IcWb${L@!,PG0GМA248ŕ7#JHŋ #VA%Pt8 HƓ('j|*ʂҔ\H3$6=|i)8x^6ysLX"AuaMosE6b:cM2-Kit PGŘ)28C9p!-82U ,cN8KLpT$xA1DT7\pIy)#pGSH!EU9$I3Lуdg9hB 8@aL d)C tb3R}9 ASGx# < <(x %`N4[Ԃh2RdFwH)lyhΦjd1K,lvc \ttQ'aI"< 9˽TQgmǤi,3+6,6%DN,  3 5L++ϸ[bQ$1D!,XE0 W.$MÇ#JHCs.pÉ H$EsB /44Gͅ"NsVLd&MgFtX&d! 8%9Ԍ HPR,ٖ Q 87Xn=IkM$tUDQa9t :BF)tގq!Qah@Hy )$x"# э 0UaiZppGt>Q!E- Q3lXmY Kx C iVFCde#DL0# @@qLєFQM6q,%،D 9ݜU*"rueTZD qK$̀ M6PEPc44MHsdD_D(qt')"{ G$ZK38WeH8K8"bX@GVYVA (4*\0fbhae@3!E%<Ȃ-4`+01M9btxCYNGHsۀI$iCB@ @ :tA Dǎ 82^[ hL82AFH9lUC8 : ] 2L3P2d6S6nӬHֶ!,o. tHNH(pÇ!HhdHmkXP@j #Gʁ&R$i0G6UKAI#НsExt,A' *DH9'  a@!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,1(PSǰÇ#JHŋ3j8Qa92_>z֭ jլɜI͛8sɳϟ@ք K$9R=1cV,X0]Xjʵׯ`ÊKٳ_5{_5F(!{{ h@WO\u~ ʄ$h%"wgt ,6p@((<$ 6݆L6  I//csF\v%{`D##,ėlP $;fSL*|#& 3yjꡈvY R (h2(Td㦝#kPϨb @ PD*c/*kt EH|vk} *;Zӌ:@ Ӱ3l 5l{<8&j2C[oG(]ܡG,CRym 0:1! $!A''r ; qMI2C+)|4sK!w7r 'w2{B&7˩$F=5I\,$ۍ)grxKBɔc p\8)om 7S 8M44(Q20P :l-T,{p"ב\~ݗKS<):`^9@Eȶq&^rMcDlQdUWk,#;I]…7B"8r6lR #\CjP-w0#45AsT#>kp(ִu-,XO7%Ul$@ tD ]9LdX7 m' \EW NE

q0yp,8 m !0 @6G|u ͊$HA!IL h}14AǺ>d2ҜpWqD"*qJFup&@bPc AQgCd= 2! j#7 yc{#ӇyԣBbW*lH {XJ(|eT T i{Iu4O{J(AN3JӚVJSINCR-t'ϘQ"I:JR%4U;fT#hXϏ!yHUJE.QzZAHjYʔ %?Nxch =kV0CL$I׉d'K†g#܅4hjTcҚ p$1l9,^mF2ͭnw62 f4ZFTx^Q^8ЍtKZͮvZ͸qq. ;r|Kͯ~w3Eb !,5L6H)\Cs! Hŋ3jHȂJX@4S:Ȓ6i.F(8 *(U6dM0)ʀSDM$J-G.]ҥ>8.* 9_zskbʇh):s uJ\]CLoxY͗&MtuY2s|r69TP֔K {Vp28K҉^7,+^^ѕi/YN9 T:ivʷu+*y"ĽWޡ%{do64y7UUa]%błK,xY7얌75D)ZmRw5ݔN.\IP%}0*2kvrՙCNi)x׀1'QG4 9P3V^D^'A}.i\PY)}7Ŧ%|L2`fNtq]&4FR7Rme,T:{w}&XwI,7fhbLgzrJf.F\64Y9R7Ig7<Љx$J dشh!,/HvH$2ǰ9#JHŋu@2y!Ɠ(%NP Np@NVY2S^+Ė5h[5u!%0@oxi[ɇB'5Zd43 9}jf+*[2HJ ,&:4+Ќ>}!>#-CĊz51j }.&fc^` @0bdgEl0!{Ymi_&{7ny 2$7m7\Լiu2/֋P)S II/nøB~F1fðS]ζd_{Ӽd@@5QVhC 1-fQH]pk<]UXqH,p&Q4u5mI,!ވx@*N@fVw6L\]auaQWEbYlƧmsi2>6TVñ) xC^TfG=4 >[<{ d.H^b!,,E fΜ#JHŇp#J5txI$!zD&t ɠȊlZ9穟B9댭c>X;~w[:ͣ_?Wu ҧ(7 UCECN&omv9B+t0 XlMUBX9qP̍chr)fzA 9LQZBF25 cB7dU=]o)m8b#l.]J|H@)"SUʼnqtH"d F$.g:yG"\1 ]}AMYxY2PC4pDi\ E)!4@`8z7μi5'Eu7lB1TZybF "ņcV #PPy#`K] 2\u {Ӣ-/jKBW9/!c9ĕ7MPPyR:+nK!,?P0G`Aq1JHŋ)HP / R(rM2x3\4DQZ }!tKɝJ@+kQJfGd DMK*0E̠C-m:@p֜\W3T4o(=k7V@8YZ %ɠ9rۨP%jE\AcHoh1訂pł#CfA82( Mtl!Q%eG\"d%E@Ī[w5=#+rv+ot"5Y.ї9eU,%9S^4N:]A[qd9P9  İ :0 asfPN;p)5iTȰrC+<29QƃMs[S{[N1 D Y=CMAPJ'cUe6Ә#!SbqC 0.c\PDEH˪@sxK)1[8zchI4" baba8[y+CP-b ]70CzJ8D!8XD.kfډ+WP˜hZX7BMY<#2$:Lgj4ҔpJGe*!,KL4G Aitdhp+o#JHŋ%4HJp@‘(S$8d7FBb7 bJ'+(H4'qS&~n$mK220vTcRKN|*Q T,۾JHoٕguJU"FsB&MUP9mp(9HG^𐅎!2pA--u$gEW~ 6ysLX"AuaMosE6b:cM2-Kit PGŘ)28C9p!-82U ,cN8KLpT$xA1DT7\pIy)#pGSH!EU9$I3Lуdg9hB 8@aL d)C tb3R}9 ASGx# < <(x %`N4[ԃh2RdFwH)lyhΦjd1K,lvc \ttQ'aI"< 9˽TQgmǤi,S0JK ۔9(470ɮ@<_lE!,XE0 W.$MÇ#JHCs.pÉ H$EsB /44Gͅ"NsVLd&MgFtX&d! 8%9Ԍ HPR,ٖ Q 87Xn=IkM$tUDQa9t :BF)tގq!Qah@Hy )$x"# э 0UaiZppGt>Q!E- Q3lXmY Kx C iVFCde#DL0# @@qLєFQM6q,%،D 9ݜU*"rueTZD qK$̀ M6PEPc44MHsdD_D(qt')"{ G$ZK38WeH8K8"bX@GVYVA (4*\0fbhae@3!E%<Ȃ-4`+01M9btxCYNGHsۀI$iCB@ @ :tA Dǎ 82^[ hL82AFH9lUC8 : ] 2L3P2d6S6nӬHֶ!,o. tHNH(pÇ!HhdHmkXP@j #Gʁ&R$i0G6UKAI#НsExt,A' *DH9'  a@!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,0!,ZC͔)m4MȰÇ#JY'mj$3 CR|FiijjJ䉚țVYIPU941*ldt3V;iqn,ɦFu8PCS$cD:"QSʤ6Ki2gn\$NP<k3@ٳi#"XCxTYR"j4t@VeE BlF"] [9r T[axjCƤɧUhQ[;ǦO,$wJ)q5/TƤ3KphYf:hc(} '2ԘJ,MEcS"ZhÇiHd!/W}YPPטEMdTHaDHӐNdҖ@|Eohȇ}~ AMB8"D614P5<J'@_&ysQH1ɘTA`pB(RP%dз#CdӚe$. I<5T1ļ%3yӘ7[2$M*X;dtkdeclarative-5.7.12/docs/images/SettingCheckBox.png000066400000000000000000000075201476226662700225510ustar00rootroot00000000000000PNG  IHDR.=iI pHYs+IDATxy\Wd@ .`TX*U(VUZ֭Vb+[U. BR@YKdPD+;prə3`!=p08<)8p08<3 TG8a?> `b A}>a8`<a8a8W<Xe eh-P,ü|  0 !A 8N`8'pkFES5zs\0Z Y,UbaqkU = BzQPU;I"ԜZY&OY)1,aиޖGpn={[ ᝖kewˊwn}5oXDǷn "c C8|i(yyZ`n/!ΨzyeV`ec*\X-C_)-L,-٣DG<4uh`~2{U[Mj-|-ݺz5+j-/i4TwꄂV'e˾XV0@aD<푢&e:cG^))Գ ͲMF M/*υ}>ۺwaŵ_koJI~=q7V掹SgYdeއi6M{E+ [n]aiyM\s}󓂮xpp˖3W ;rGʼ;0ifu'K_0N=WK[/GBQ)rZa6'yCJü/\]؏bfa%01lj_ k+ij|J|V /ڿLՙ2#On j+j7 $6f~W>c9ϧ=.EfQ|G̪_y{2u{JK &tƢicܜ .cǜ/T0bBafzhlvKF;M)2v"}M#n}dY%.-s͒ݗئ`犨)pl>(:TЖ(nd~_Xmգ7wWSDUI=|wZv,RPeگ1}>y;zXfgjIn6Aڲ-LKH*1,s]H}l_-Y>q 8:c,6}J}>ԧh)q%[axD U<3Hݻ8;`^u!c"Q; e.y񲮤=i`"}THvZŔѳf rHl[UcjQYVosx yf˲HbL]TP]?#uѓjܶ nMϾ Fv 0AH@8.F^tqnP|em^gYAu+ t ='dlLy nH`{)D"1JF@ w۹g4Sv/9 0{oWv? ub]_z֡o7luG T\ޱ?mԐl/ #ȹ6>v^ta&2tsO OɮѴA/hߕN:3LNSt-L9XW99іQRu0`ZJ型9&ך/8lm'D$N??>ӇzŜ;8`$N8%ھ֭) 򧍺nUuKH_惷2\*uqբ9gEtYҘ:9 y &?ٿ녱m: _~n p7|Չ b[b󀍊Gꀉ}~ms@[[[ :SqW+&0oQy,nIb@gntͺ~/{a͉ؐH@Us\%&6%I m]/Q:Y|xdJ1\i+'uӜ2r G}#uZ ̈%bηp>zZpp7 TyBdd#LmԔqE KCCYS?dܸ1k Xt,Sמ*ΝsIeEok(gŜ/Ke%{' IJQhA(61D+H[UTT,&Xuٓbޔ@kzBdUj-.Je#&"@8bVD^%xs `fҺ;iVb$]' J(56X$T5eBbhIj1$ 6B)ùB:*fjG27 }QiiiSO_gԌqzfІb`*C:s2 |Dĉ|7M3qn!Nn<4!N@PT8Zk.:oQTYZDt͢kkvy[/nߑmP#]%bkwvjcL0#b,eE˗V}x*$艤W?1m=`ct>NĪxNM[$~,>Jcqk7dF>1I EJ]iIg0i@}%Otag^Bt\ j4C֯UD|+V𫤋/N5XR|m:S+6**3\KDxxZb궾!gLv{[Re!4|u[/=!=}RΖ;aIt抂}&ޕ1]\aѥQ\ 7;~*6m<"ݖ`bD_徲N_ á(5x9ўKvTU%gF"w=k<[%xC۾fۻ>/o' :ieeGk]uIg|jpKHNoP{^=cb#:6+z=oq[M^"1q`_:RtGj5oZuw,c֧9xO_LraMWZ~q{c92P:Sz9GDDYR]eۊW,I"{۪9a""+ӧk>~S>zR_UO}~z 戸pӇJ12br}EeC1;TR3-ESaΝ/ztF^ǥ$I43* sdfrOV=\n^~-3#u)}H.okSǘ}Bs#јƥOP8*{r$#:CiII-_yoȸuD0c?UfU2B"-<]>/q.y??3x""v۳Kv{G3gJOw֪G^7'Oz,'LhFSy{FmTxcuг%61aT<#r7kY@$_{QHcc T6qeYQHħ<_h3vsKB Ӛ3o/2È(nsKW묽 Sk3&ZUP&b)mE#T8c"cGxUܵdQ2fM9DaisКG/xXWMV'3GطoZE]dE1bJ^CDzL#H^i-G$y /ẖoGj68=B WYr{%E!"x^;Bv77iCc#Bx^׶㕘FeFCC$I羊(ܕy#RdWbVs5tdpcErOp8(q?_ @ N0'ĉXW7MaFtj(RuaEB6lxk*`lLcJWTϕRA4@vlZGp<.N/)UQ5[P ?F4/ƌeYH)]Md(eTUBhfZRB/ƘRg0Wz^q([$GG;:,)eIDD纮뺶m[5yW|V6@ՠ43sԁG݈j\vu>Q_gY֌Τط mª4#бw;L (Ҳi7plH7|Q4 t8Z'qTϋqƔ@S}/Q(L ,I,I) uAE)HtDDt\-HEio-_y(%""]aR5L$"^GIXᆦVvG ")nk]ږh_[?8?ٶkN=J6Wzs+p=?DDo$ғ7i(2BY%+;f=Χ ( }<{]pn'""6agsuu6#êY&yh5N_t'k%WW.(zխ\+%"^55e_3ҜJtŰݼ3rC".XLFf:5ט1G DDԏkَtmA&1&H ,ҳ 瞔ҶliԿ4Q? Q?,p֕79g*UT<㛪l 4=TAzDz"T7zb)Crz!%Qv!""BAw~|Η(R! 2@*;YQUA $tQWB@/"t"":7BW6J UENlq"":+n*(E$t-U0M)4M`Dhz(QUf`T\\mkaffFDD}iVhGQ1JC3jRTӡ3b)VGR=;""VG*@@7!R݀eS]U|VڝDxN!D"vW>+vUav9fHn@zcg%yf ;3nFA.1ߴ,q)벏>Qx*4Ϳ[P<WCv>4B=oxH ±a[u#څڭ-ˮԹ=y62s%"i<يUضc= HKnBC 7Vn4`]%A]u'GDD}%t&f!;i0#AJx<G܂E?/@M{]d$uJjO$FiP=/HdCDNAřؚS V/UW\=-IENDB`dtkdeclarative-5.7.12/docs/images/SettingOptionCustionWidget.png000066400000000000000000000217271476226662700250510ustar00rootroot00000000000000PNG  IHDR8% pHYs+ IDATxy\.^r(\r(hmޖwף#Ӳ2KYiϳ22JȼDADLX`Y{f~ _{?߇_`g>ѼB!']B&T!B!ABȩ 9eYe ]'BOI$Y6Qsp0 Ru$B!|VQEԐ@|J1 SOC!(?jjaJ!jʗG?.UOUB!`T8.BpWנ”B!Ԡ  *BOB!VנB!B!ABȩaP!rjT!B!AUk]aN~fKss5EF|<!܏V]N崌b=0]Ye(ڻ%]7D%KSwRΥIvaY4jTY]fL|ޟz _:6݉!u S.B?[L髄Vyo`6e0Y[m-?֒:al-sb}ֻo]v,؃wtM{}T a\Q᯶fY JT&8y"@' Z![>+w%LGIkYՐ)c.LE_ъ^2؂.ef(_&|{ O}/+ҊZ;B{8TLΑI\!9:R %Wb!}˿&UjBHjӎUzж=i5s&%l9` *۲{<7~ؐQ.!f)޺) o %t7vW^2i.HL7Wp5[Ǽ1rl{ᕣW@ҤfBJ (K[)G˾2o^8}igcW_hzNnb]=.I^JCFO:"xµ;ޙ3&/dqo>\[aGGm_ݖ 8g)Ԕ Un2bd].!|eiHJܚ27}bmWFLhOB=-lQYuEI59lqτA4HwfaQț_ Z=U~6=FMٻG3lJ=bx\KZQ>T_Og 5v9w[5}1'o D t*ͫ/$YCZ|"CDǶxޜ.(Ő8)@tsvl I8j潻{~fɴĮ/ OrQ1Vzz0S-:ßI{H @2 f}\^K(=#'@tzUNޛ&,ؚyꂾPM.{?FN)C_ڲNnURr~>wOAdWPq! *JEwn+t9QoҶ-}Xqg81Y\DW|O\$c23U*j2V.PeΞRMvTF/oå Q2 Lf%K LCu1ٿo\re^-ES d>aJ!ML &X}?]W1,G$)"]8"qޏ~ywFOnZ+nO)FFD P`=+#~>.z SWy#{ȡ]o4e1#) ~?p&צrcMhtj<*yMˊ/iT!~@Wy~.XuFʘ5'?xťRpQKR.)aY7%>}/oXIQ"Rl̽˰qwO|綎E)7\* in0ƒM1$[UgOIM/+;q]i.K2EtDvmJ>@fY5))7t|Dv_֬c?V+ƅ@@S\ldk[OUffce`@噠+1hӯ&׺|jC]KW9i GҖύ|%Z TАCzQH:fԳw̘2ϝhj"}{8,hѧ{7.U%pj5+^ Ŀ?7 @$uAQBP$ۇgM:ǁߎ<5l1ho`+Eņ/0q~]6z#%$9RoHTm%—ŧ}]BGSUXq}عUϗ-ͤYs㼃݋ah9t\3vAS@Hvr@B d2U󇰆B#)S)wcKia^@.w!h3V}I~V]m$R-0R1f:Xc@ȗ2f+K hɿdp$-xa%Uq<0‚#-ps+Z-Vf c**RO`Τ-RrOWb:V?$J4u,cr$-kY]*֤JTZ"z]EQHB! { >G!0B95 *BN !SàB!0B95 *BN !SàB!0B95 *BN !SL&baaG-qBFEQE4mRSPfh4|?B^X,B?2L:eY 8cYS!oFT0fY&K2|JFB!88>XtAԽ]d ш)Ba|,ˏ Ց#Ae2F#W zM+X *M:^!Sɖ|dԅ#A0 6BՌoT1 Sr *u6BO&0B٩K(!rjT!B!ABȩ=liɝ[В݆N;TA-\|q˦s 2-cۆ{\5d=rnآBPuS^=DGUuŒem6-wjk&ɾrn^X1E\iұ$ybӠ[ݧwXS@wẀ]@0z뉐 B s{uq3fS i g?O~v{M7-fS^+>| yߗ}zO_Á|FѢ)_~*>'ؙzQZzo=v{R}+d-"] V{X_0xnn%gdC^w5z<\ K/K̷|9 ' vr0eiCWeೣN,%XL^٬Wgmz"52sDXM1MLɿ0&'e,76;{?ywtDJ`M)#Z X2~5vVMio/W'.=˜paϒ7&74~dk7{wwB=5/ͱ|ڤ=U)+!9Z6HkwohsE(#[jp j&(gqۡ9}Ƅ.E&-XӐpaע?=5n€}n'[TqZN,(q%n=wDh%DtvzK@E뮨Gzz t7~b8-!-Z3.L?8ynoBгk\FTϘ! T356eUhgGm>~|kڶݹύ pOI^/^:QOo`Ϊ]QgM;nK$NwVIoWȽKKŅ.AK-ee2Ȧ_{=|6*/yO/SR{ ,NOP6m?`GqKB3Ej/!^RD$0PA6߹| GLovG V=]j...*.Uz"}܅B_}PkIj4'G'R{*+=0P#CRoϰ=Oݼכ&ŐY``;PT>-s@J[?Xħ43wo?[̟cJۻ"홚[ɕ&}(pQ%;fWmgЮRg2*RL"2F^٭Lݳ2ѭg¿P7z{Cvd%p4|6ߙŧ?a=Su[~f AR\/ڌ~ӽkΩç5W sLΑes/SYJOUt @Vo:^= OTlm1.6~'r73sgus_E13V;Ӊ?~/԰Օ`}ѓ$j7`H|@s'㮆>saR%c3K/7DHE4|+.Kϟ3,DB4&Kq-% ~v`%6xzG N#R [ VWPX`U{7Qri`^/N֨8nf"GNoO!j yn%rVc=Jn]KB}Cus5-?ݛZrn>.mA*G$AQo/=rGyh4ei#BEQ$IG [ rjT!#AEn!Sp$(k#z1GF]8TaP!A=ifBj2p$D"X,FBGSb؞ 5sp֟X,&I*c%B=5X,~`P BLf B!>l Ʉz]D"AFh4u{mB5j{bX,KJA BP$Y,aB߉ (iR"~B`B!ABȩaP!rjT!B!ABȩtBN0kmj. aP!Pqd2,kABBƯ'kgb B _L{zJ]C!TUL&޽{ݻg[m,˲,4Md2Z] Y/ !1>F͛z=EQ*ݞq˲ 4ݱcG@@7YeOPd jbYvΝ:JJH~sFK*j"FSo !)[JݻwiඦMӅeN3 աZT!Reً/ƥljkW` ƕbtXa֟ISdvqS+qv`+,,$e#CO~?k !9qq~g9ԩE NزϣWrV{284{ƊMif{3bj8,֕Wn\IYPdo![D- EWxf,{X,P-[T?Zx0M޻B: s?NJ6\cBik Vՠ+-1je`3]qҺT!'`?Y%I@G>r_Y_p`Ѡ46ˎ̶^$r8QaWJC|uo,b7;rY.b0g~]GOU sKmm/FɿWM1P#PE ݨr ͩ#G5j-b?9% J.?{fܰ[QK]6ynֻ#N=|le!MH [yx}W&>b[5 #?yEޱ-!1!ޛ.j,ֵ #^J@鹍O~y?K+J$Tv5;_] mV}kLWcC=5ǓǷn>ՕMHʣMkςムof^lje̳n];|˸z2CЬ)M6Rf1-SYWHsIt:Ŏ/ᛏwDk]C C# \x$@%\cKB: Tsd㗇!r[Tu*2Oz@Q?/۴zV{2]E@@nc`2F,Ow BykUjя!jڱz/ߖO9uG)yy`_-3\@婽~3aSak  )̯UG 5*jdr1@HRڤ/}xF*/YڥonK:>_{үC+%!uhd\.+X.姁 rڤzS'Ც _]H&_A; ʿ_ lQH*PńF3K ։#D2ZǿӰ]wxleh$1[j#BCz{4'["~\E%whskDCJ.2PUp JcF^綎Cމ=1g5z&Mߞu e kH?cB\hw/,r T({ ,'yfǯ]޺YN8!le)Z.n]LjAInڣm?ç9QђRYɷI/ܸ|fJ.#H'8\=_6Ew}!uM3sI{!ޙ{uxр}gʸC.~?[{_Yczk@퇉(/NQmQhNk8Tգޒ]+5q^-2TT*%1YR dHW4(}IDATVQ,R\$gk4eVBH>|W,t:ݱcѮ?JeXXX,*j.iLV+oX8FBO!9TjZ,'55UzI2GR$))[P#O(4-àBmYeV;߅((iZ 4MӴm2cS==A1:NG!@l{|Cʶ?mymQ|&Yk@)egT!(*OHM?lQn]ڞj BߢmA'}*g|9 Uu *b !S*գNH5hT|$I}-BIU*>lm ƨ*VU=Sy5=υǬB!e*\ۿ/)?Z TmSx۰M>@rZU:j7Jg`CT6H0BinѵWe:U[yzaAX7F1 !Sm>B95 *BN !S}neJ^IENDB`dtkdeclarative-5.7.12/docs/images/SettingsDialog.png000066400000000000000000001606541476226662700224550ustar00rootroot00000000000000PNG  IHDR X' pHYs+ IDATxwxU{fo6e:^ދTD^)"(b; | ҫt B $gG H e^&̝s<5l%$I$NץsvxxxxzxBkT)\nF!84ɔddd<}J XI]ҵ#[4o.OAB)(gΜ]n}qǬbŦMC9iHc!_0o޼/dBѫ`$GQPzlP"Bڵ뾝=y+p!d$IbZӻwe48 XBjܸqoZs#kبQF^zuPPP.)zlP"BJ%""bԋ/n,1dI4wܜtE!BLPP9s%IʋUQg3O$EXBTκGdo0ƚ9F!RU9iHc KũӦVv!BӦgԥKwE!B4$KLxQ^AB!ȑ$-ZB!<Zh,lon q,T By8<ߺ}WA*@ !TvAe,B!4n;t㊠!6B!iLU&`婒WKB&g6Y!C4Ddi= XU\' XBcfk4sZUX4Ruyre,B! !BكU!]T !Bx{)YREJZ%_.=^4۝BT*_T) !qE٤QB!đ`Qr`B!a] !p!IWU";B!U2AU"N=FB!!VYTP !f#骨B!OX%J@'B*5`Q B㨲{HyK!T Xt'Bc`QN#BB!UR, cc$H$WeF )Hਞcb9c:=sïhmA ^/8p !X,,f} X*/ZvGo&\=c5g*x9G2,l*'k?}9AǤ -!R2`]"D;6E9SUۏ%I``݄}Ƿ:'CA&B!ֽAv;VX-xkHv𜒃9@bI"2cdsT(!S@B!tl IEmZOKy)8(89hdj8pxr S\;gjVM#B,&A ab֕IAqB`+9N࠰V,&ج(B!*4f0)g|fŌ( )xVUAHL3 !W(=# ">"Vc2#n!Reb10 Lݖ3Dh1Qzpe4DH!"jWv;!Rxs5rGcD#w -/#q5ƎEz===1n22+1B)WރAou4A—,CDWqj2hl3 "6cd/D5܃l!B*C9`0e?ێg'|g~l^߀`?A W]ᔪΩ^q+aBD>KB~,XQf͋i.C^'7z4^ jA "Q)L 7ȅ¯|ʹy?/ߗ N꒷vVM$BBLr7X^Qٟ>=j?3xoLŎxJ/K0wV8lWc m#LٍǮXzn5ES2b{Ba@ȥ5>:q]p_up"yy/)1"") j@3 ݯ+_ |8)CMxl"W6Gb|;GlJ8&c!<챸sB*b}B#'r^Ü#q7;MC/AFgl3zlGn¯ؓxol]ʵ~؀Zr\A}ca|Q]u̚%@1dp'D_`fĭ0a,dAi[S[k# |[Vx/|\9|_j<3 }bmn sØ83qHB!THR Azh;/.g~zÈνnXF`Xh[C@V8-k P X ƵASd}Z 63_?p`~v!I7uD;ge W0`ZxbG[y-?_b}g,طq;CX{:7p? :2xsWd'S/۱s>P"B*UE,y0c(T9$A2s=&5,h83'PCu-t]ܪ,f. X` xoqwڶ{)2e~'']=+,^8[oUs7Т%|ilXױ"%BH:˘z "oA=.k>܌_JOhy0?#`֝!p$c8jbI8#Ԙr?fq]nЪZ~5# r9qtP {SDJ|sл"D wPݥD!ҫТ KAX{_ nEl9@]p)>2ⷁxSVck >"esqlHN,~i!0#GÉ ѾF"W@\ZŏM1=vư9Sл>;a8m@kG',fӣ?=]U+-5 2n! R  gOFBm8h}W!E/ nbƱq[4 |ÔOۙ {ێ_C>g^|"il?+X@QJ}SШ.mA0)P6a|7⭿c@ >|a h1i>qro`6m7^U?;ţEo6qlq??'Vvk!TJG@-"%ԒIj&0Ypy9¦~NŬuf/YaX^}j q&jՅhVK:UycF[˜ш*:ˊ!0fwŧAWPS+'܉s}{W,yf~kzh+>8)bwC_^P5aߢaGM[E-h*B*I`¨0_ɛ SÐoֺW x+ B;+KCL"x?(%ڌ+s+s!65Z#TN%7adPћq}~v`M8.w;CZn@ QʓR1ۆmŭD;JE߂]BTdO0is̖tq^&S?zۏ#aTCѵؤdJ7dłq]ܵ"F!UHRkhJ諡Sh|"&u 1t.|hȾss-ƫpp،dacobW}i85CIً 㑚?X>gC^/| T~ 3O! < <Nxw%?9ga\G3qczgp:ΛQQ70  H@|2`l£=^2\~UNѤ+=NW!2b4!jŖgvKYUJJK6KY꒞ _j2Y8V-+.1djJ^`-3"1ܻ;že0!,&QVo'M^UG%hW R=`V #?EUȌYX=C^ZcH|;ɾHqԭ_c㕜"cbޙgDv vK BU@$_;&} G\G6,XGc>0;v@ |J6X - I}츽o+s'H>'?YN%ȗl7c YvqJAGk4ǜYv)tK߽5L=$1cly9(ik+:/߭~bt.{*gEf~p#l ƫS#د̙Kg|`pMM۸|U|>76I&L d]oxqekWNJڷDŽov,QG~xXUjR!ps5q0Zn48>KE!V>%Qfl 78$\lrX#|Vg9RqoeL,_n5p qO*nZexu94 kU10e3[2ca˿L9 Srq; ~% 1~D`yIis|#L,)gȏ݅߀j9 @W gaXY{q# x23w6\|[v3)]T75X=jSRvX]g}|ǬL=/<zmѵ:w3ypf*nuni[t{W-'CG;ش:,کulF.7^UJנ:A0Cܸ瘠WɔՃknf&Y5*80nIK7Z{ ϒwo>NMi7k o=juKUzNcŦ)~tO ?Q{ރ_k85k7ڧl !Tr-Q^BwK&ܽ#.T Q%#w$2cSRK R lKǝ=IEY̙a?yH# d"M/BE ]ODzң Qؓ8z11=>a12eXg}rY`Ioyȩt?OCjT7ϝK_{/yV %ްT;hT'Oy׋~ &wvп/~4)ohҳ_T+BqT<p xyWFgᔆWZJ{f$&JLWl{v=ׯx;>ňJ@P(䰧&g1og{$9 ./Sy)+N8EN{DM}Zv;q.z4:|ޞ7o Wؐ^5QFj(15v_;(C#(Ovf]{}' U2Β`w:r}kB0W\(NgcvG^M rջ͞5`jN ee?”9êodO ?uKo$X Yxhϡ F_k:>;Icu9&sԡh~z{1϶iE[c2UAʸ3mrUXte>Itrv7˔=Wifdc%L;r U]oMe`Qji!8G XW:fv3oa jݘ6"e2^&yT;4zՏ|}vKHi[xԨApV'W޻R0wܰhάv5rR b`BлiJ98}?~Smw}s>ͺM)o9`K7Xaś tF1$ox{ޠgSS'o !:wQ{NT>ea?. 3oB?ͣgoVCŲYX"^x|Reտ/2h[1f^("덽XBޘ1rS񜙿LkXo{58wvHt<)B}=HԏUeyhٷfeF|@%&t•x32!_H'D\Mww%$V󝅀6jmv쉹 J3S$zr"2m6pJqtqVpPx)){M~N[ z~mr))gKqؼG#Hv~ !=!I6QD"PQؓrQȘ(ϷlynJML}ʅ,ɥUԨ=t㯥;G6 @ʹݡ2*T|Νx;8uC6Pgk,8>NuY.ݐ|[5SOv\ۦ~j[WKv9囩wP]fx>sjl=mCRR [6tS6t~vﯡ F'ڭZx?ySz*ٲp}fjNJ'wru?O=޷c}teW,+ֽ]5BH9+M\/3l Vd'|]IEbĘʀ IDAT`l %>:A&GW;}Vu]{OϿzv|z~xOί2ikW'1/k1;9 s8㸼nE~眕w^ 'ir:b"0N#VU=mmN^pOuE?m{'mݾ_7'v{A o-x8._///+ =2\)=gϱܸuPQ_ڼfXe恿1{.'?R\$R8~Ulj9 iHKD]|n\LDixNAۏE1l(!?Y>zo4;uy/!1[Vz|Ys$ \N5+)1-îpr׫E&"S͐zwogyߑ1551VQt=fLII4nzuI4Zw^lY )C'idqfL$үѲ5=:h${fBl wSKzrjrrqBHűX,YZ^ ^/UgUid9`uI%c9$fgJ0I0>22\ Wh^ئrrgOogz%!ڮ-O&:w- 6+60 ӃEqpex3RZ'ghBE!<`qzcյG(atpٸ77]+Q$پ"fj^Svi/g䭔qe5'2T*N^ujר)Vm_}HkBy9p-nE=~޸nrFغUk)3ħJ++2}p\Dq7^b(KFJ0'^cvo_ոќ|7)5JB!qVʉmksmxe|K~6E`g_hJM5*\9y7 Ns/GDd>u5ͩIĄ Lp YٞqʫQ:5]Kj|Q"39}V§Y`5ؓo^>nvUimW% QWR"KnV<{jQ `iRj{X3ZhM:{.Zy5ldWÓ8ޮ 'swQs91̅$ԫdHNNN6K0FD\}|UeQB! X]Oi>)G11|9o˦RʙoopN_%rשsNh=dn'nib~"ds*9c9?/=!JkVk„i%PIz!Y&+ݏ_lj6Ze5u ׬)mDv9ɹV۵C" u'? 7}˭no/~/{鿉P4}KHuumyW׋ql2J5˞5yEn]\]@>\-_`XZ(Ǵf4,B!8j2_0jwRRc]-kOۼ|Z M|/Y\hwC( 2,Zri'Ŵ/bբ~ç]8O,vҷ_w%[3Srn?lsP:}= \*|퍸l{InsX}P=tZPS~rPֿ?[zIj>i509t;oU:Ur{;O bwtԏࡀ5zKQ'9+#Mr !Ruh03N=,9,JGݮyN21ĆƵmG=?Z?OF{W9Jg-%>{9ȽvlJI ɿA,92>ܸjoY'%\ȊQi8d+;k8S4GXJ}1^V& j֥qfm[TNE`޽㏝IyA!L.xzL7!R>5`r.>ltUP޵{}{3 Y%%fxEנYoQ|8.<ɵZ㸼ptvRIL[R1*Y{fwpCw^]W+6[{-}єcxTqG W52єey[5dgn]i:ś쯓,n~B!eQ.~n2c|BÄ@Eo,sxŚ?;ܣԹȞ%dۺke6SSjvEe%6#Oѩv*vvsڒvx@Ϸmxdj,|ǦMw{RS LYYvK̑  t;j&BCdY^8׵@b% a緾4)š׬vwyZӸ9Ą$ j K ,+~[vKW Z }Ua;3 BqQsT(!cZ>t%Ȝ\\uGhI1DɦTNg'wm S׵E!!9lQvu~lg/$ȵ2kf1';Xn4Mnjihz 6[Ku g\K4gt8?{s!.%vHi2=D= usjkzϯRyE?uXlJv|1G,q]`-ꗿD˽Y0 k,^ʼgoK❓|❽Ƽ5jb_5t5^SO(<ԛ%dfǦX8/ 2[Ɋ3"/Yos5> ɢ^7pY{S15nܺ_j?r,*͐~}o-6S72 )f}l{g糶4M)ї[?,{ʽ,& I]P2Fu !98Wxo}O8{vp9 2U۾906Y?W+˿lĻ8eT__g;xd>=&̟P͒^pǣG-L&_/KWlGZygZ@] VݭS!3'?[;neD/s4'Z;(XNT5ʄκff'nc^]m;T2lh&!_9`9O!3w{RYDy%CJrqq \^%kZRY&Rdxx8DSzZ]k|ʦ MUL%j0I |ǗPIvq '6a(19%9îvtV!%T"c9֦k;}?wPNdbbVZj]]SS$a 5Yʷ݋F}:׷3oW~0uϟNO=e˓BȣX,Y=Xy_3xg8@LN{ jWBsLS܈]\>"+Z[Vti1L*?thQA=Cۡni)ov'h<#Tz/>uRBybTE\|=ԉCOܭ[{b}{a񓺪Ǵ]O!O ǝNJk5Z43fJ8|;N-[Tzڥw$MtN &޸zf6 vЪBqU `L`?\B(Z-fIvҴ{ygg,}nOꦴo}b7oGleƥo<h)}^+ևe,f]d>XUf靸t'̷N!VVʾ?0[2/x[\l`_|_3WAʸ y&I{+;OV,:tɔj>cV|Xg/ݾt1O%%5~ Xv?m9_7B!O*=Yܹ_mjviR ̾i*u5oKgϧlɴ_y{@k9ElϽlmWZǧIq -\vS«ː6q걄B\UㅼPE# آDeܽx ..SލK½).Js_4N {BzIaqJ&qT$BHSVIsc,dtuug%cfK?yϩ}>>zs'͖dV{hϚbQTM! XrW7 { ~wRo׉R :N)J'N,/`ψp4ΣV=42ңnr]KW)Y>P9s DCd?2>[ׯ+3cn% mApQ3j뻋bL?Phr۷d+u!<ʫ7 tzω7hPSÃh˦yYoXY^HcNۿ4c6|>߄IvW=~6?}ݽT)AR.Z {`O|F}2ixͼ.X=?klt)I힂L.5Kca6c?qv|5oͦ+5uY7rxec;9nw?[II΅N!QUd*";8sڛ ݻ w 1q&pUe|G`y5M_zKͪ.;8ƻ@4+TRqu=ݼN׳$Y[G4R0\2w=RɿUηz˻(Ou\VrrMs]+4 .8!}mxqyk͇O^95`5N*GDJu&Z``b]8˝b&{-e =wݲBazhEj9dfk{^W`Q7N]KWWwC_}I!5h;[Ħ ?H?|j]_zt/>u`]+t2sg_pCf8W -zeol)Y /^>鮞 sB1Eۅuv>&5@?`b.'%" oSE,|vTzoT>{FZMSף45f%o{k /85|jX 5 E}gFi QOS68M,>Igg^v; \>;N<! IDAT7Bwu5GM_nјCC:{*vTjrXnnmгx{_NSG4 nՑAA넩Έ:ՆtuZV+ηyaA<oi6Z $9m޷njԸ'Bc ,Bx<>]Э+~OφWUu;5ə$4oXmݑі.nN=8pqQ"3L,%cW.'zv;0s C|o~1Z=icu0ݹ"" q)FkN>n1MWسI5BO4EWu'4)j-'g?}W*hJ22oWՂh^!1*Y)i_Fz:jzmk,;7с(Y+g@1v9NQOY6-%Y-vf5٭!<"Uke йz/%&Vps8md!`*ǵЎ}4]&fBɺv. Iƨ ]皣3$J ԹwmDIհssEfJ̖ruݺFOux`HJNKJNKJI7X4!]8۶`w̖x-,<εejNhiخ3unSht=ڵ{Uߪ3 %9-)9-\6^"dFfJL9OE ЦvHM,Uҕc4s] !jxfBIoCVSR\%% eEyZ6߼=0ڢR--Urk4ǯ>+.Pytb%%uCyڋdW"T>yj%MSZ`j5( U  0[!,Rce?0`!SBYh!B B!PÀB!0`!B50 X!B B!PÀB!0`!B50 X!B B!PÀB!0`!B50^cwǧ 0 pA!D(( jzVh4A !/ljD"PG jzt:Jb$IeYŀBf$5^H$M 51z^R, _tG! W eU*AMQjM W!2jݝǁ 5%:Nѐ$ !{Ǚ u:]caBM`01`!sT"`04v_,Ԕ0 "Ћ4a#À黍Bς阏 Bd=ϓѥB=[VYqʚСw^ܹz~Իeoמۺ=rqj1S"B!,,(I{eTjMHޡO0qϘ8“n=s/Z&qq;ٹoиo(H(mQ߿C@!s˂YY5lF2!Kjp\sx2Y&&%&8!Bϐ, aw1eqѩK)m|l u9e<5pV)ſc^R˂M E6N*.Fvy6v7.?XV\r/WmZ{$r(wQX߯()^+\Iӈ[xHj+!snώ×om.C^ځ~v8ƞLտ6^,/so>ITGѱO^Hqlì?esB)+3^5sP$|oP{ҲFZG4nPW|l Y}vﭜ*߲Fp]mꏹ߶fXX:3H̶;izozUQ||__y `,ZB@!jMN4,:yӌ)K-;zٗhǎasL ?jK{&w(b=yIm7#lIF{? Kr;&?tS;}0bߕ ;=n"BŲ,PTeNo(ܝϕ$Ӂo(|ŭ"]7쵱xˡs=:$5w_ȊV(ΛEPTpѿ?v =խI׸E"72iC+iÿg3Gxyhqщfou @cli_+-vڵQ4^9Q^X4kYJ\wboJć3 fn:Pֵɤ= $GӵI?7ku'u᰼yc IP<6 (˾p-U`!]͵N 4lpc$;kIffx0U+j٭#azЬ_YN|;2iKw^PNmM0+KW5\8G56l@wƥk1_p? Ppjἳw=q%Rf ]\)ZQM-DŽ++S|@1_MnPz6uE_O~~ЪBSp3ǵ6%K,>FO|Osq*_'s:xٮpWz8?)B5 Xv^ttu!;!A_c^RtFkoGN[4ˊ<\F `H6moi-=u}j/+ڬkLXG런}_"?Ck~W6?KbGX 3& 0T@$W\Hcn6$ŻYfU3(ȍ lnqz GrRc?Xk鋗lew>Lmcs- Ugݦ6L"i[yR>_enTJeA;.Zo.%|#zy?p:4t=i>j=[|[UVt`Ks5G|_Ң-Ǐ։c}g.KonF@ykێZt֯[ L)o[*It 䜗l6ثNjMQ[T}8gJ:N{t*}kNOGJ[; 7hk-D+|'K R [\J(ah/B= XLVL:L!nCXwtLZjˣݺغJLisޕtضP.q"ºj0?)iP/MU{v򴮭J:SKI.}Cx)*g;!qp0d 9;ڙv@€_L 줓o^̔%? tRIܹD}+tybŘўElOlg+ҥ`A&.kM7&ҮU-41cGP͓'iJʴZ&Yu5Css~~7 O%5)! v²{wFUt| v{ N3>D˷u?_Q¨UnKT_$z&Bu֬sY_=VӔ(uB{G;:Z$=rEE۽ڷ-z_GRJsXo-Qpܭ"P.ݫ7z_nu+̫|*90P@ʝ$ꌳ2jUnb4 \xuO`0$Qzs–/]Qj˲/+!_ГRmA{>'ձly []wkn&+Лo).+m91Na$4_$9ս2)~` X,Bڿ\#33\yC|,A{/@jޓS8y:}Eߘӷ U[8t0mo~g+4@Us_{k+b *Rnچ?rs5$/a_x?8񃷧m'%yB tFOyܚyRe JX)lE|=[p"Tie,f=F O$ZU8R)RtGqĕgp lm49z"ļ J,t]eEV|Fћto#yhwT^Mžq~@=nƦI^yE\iHMJlR~À̉b[!ǔZ!~~1)iM)KTeF&Ty|ARiyr<ўXd-#}.# Z!}^heaJ=j48|кߐ"tf$%:k3nf(A#}^Vn.Ԃˌ|51W/FXBv.97ͧˀٌۥ֯}ͤLS5Eo`E_]>Uɚ"Q&JeN-=)#M=":iT _t:B%#9n''o6vʛ 7Hy3V-Zxv|r7?HGSe1!w 0] PZ8x YxjH$IkF6VV ِ\qEWq)(!?vZt7@aa!0uM#zPEQ6hRǧXasu³.]?4B!+Xa !Y`9jJ:'!z.5Ń?,ԔPEDS|!z c>E5]bBM EQaBAaBi8$1c!s $9i0PS"D"˲BG˲")r 51B4 X!2) ݝǁ 51|>_"$ EaB)Z&]$)H|~cwqBAhZFcoN!jYAPD`BM`0ŌBMiL(⼫0`&L 4w BB!j`B!,B !BaB!j`B!.ӀB >j6B!2NqXXA|LncccZIVH$"%!Zmw*tzpqNۿnn.IKֿeg,˲,kccb#UhH$}멱JݟVBϒ)]iڿKVSEKH-Md;x.Ʋ̀B)],{nJU#]7yK H(JFEEU I6 X! ʜRSSsssi6# h.**R4B`B!^DtŲkitƦM?j2 *[ <ө"D=c|EEEA,[uSO!AA0 CDiivjb 5I m=4w/]oI3s{&wޟ]!nڵk1bӒixBL&^E5)ZgkՇPce jz4iGp*ݖWw;5Ѓ;I$t9,3 ?I:>0gKd2^ڻ ډ˳t|~ZR 7I8:PQ&яt]׆w՜[s(^ߵ;ngب +V϶b baCFUT:ОB­j%{߳R- @dܾ6i.><P]ܴ_aCmmtBpi/AH܍IRo\"0:PΪo?Uo qߵ[MgLd!}ޙK=^`s ͒L։Oޜ6vi{,eߦCM?qֵpdSb.,Pg^x9!MJ?kLPY;ЩeJ6`T(XLiT}i~А!676aN|9 ̉({5UYENg v$-wi,vpmɊuڅ7F~{pKܦO~d^Zp%fk;7%뙆0_v]گ_*5j:Ch~<C't3{ B`~ 7wf>XVc@W]!XF7Z=|$a};RϜd? IDAT<{q.H0GW'%Сc/,^H /=ou #^εj͹*_3`_>u+!+9Md (y6A%MxFY`2).Kd  .ܽU3Y rʼnIE"Բ% B,ӺrՃ?m%.dR앟Jc?iY|ynI9+"d^n1#,XOqKl2MW`+ PC N_|Ʉۻ'p uOK/NQhh_{30=@WW֠s$oem#9874|S)EFZ$_,z "Ø|a=8yq厁NܭYct#q@>ocZJ5X\6>|3hեe:Cm[pLU>,jW{koTs $F؇zKZ^! vO9 UY 2e8Foda/Eb/Q) T꼴\֪BuiACs#/NճURt k#xךW8u ɓ{w|U(~<ϻ{T9aJkk~%4(_zRr_go;Vle]1/9;[ĕl#m{͜J[ZOXlt'vЅ iR ~@{ "SFLv5-qU2]㈵B1S{iWomnQ (_HF⠶CIp8H+{~4  6o_M޽`ִӵ9)t~ڻñE^7G*~J5t}Ljz&""Lset,|EO t#Zmw O| _~FV|J s'Fϝ6E d>m{0xҷVʀ?nx7c+5)͍Sm?>ߊw3MFWS]Âe\)zEؙFYNY2uߩ ?@.p7#vb4Q+8:m6Jm̘۫?X ^ןRYk\&f!y|+a:#G4MVܫ7$lKzB7) rJ n  1ӑ (y8D#;Hi1Wn5jRj4EL.gEEF,I\BXeeYwUTTD47/xL0^o0d2YXXEQE.\Bppkf*O=EŗʂýW }rv|~6ٻً B RҢ/e!+֠SL*/;[@`g'&$i\A>c;ژݘ}en$e%W:++ )2]*OWN6v IZyCIz4O Zfo$IӖU6 x";G[S9**PV {WjϏk4B @Fh4#c7x4MK$M{x)r%n)~|D_=05*5@)ZrkƯg̕y]ݝIm.U 47z۹uY6 iLH2Z:;PJkRS>`0pg*8&Q'i63ծ1 r[[[W$H$,\aʩDW=M}N/_mirECgbFoOj3E}vvTʴ7mHZxC£U_Vf);KԜ1sNTk<B1 L#w={ܷoFa4׍f8@hj|zfccckk8ʒ<Հ^/թu2}tFxIZ( VY&2Iڅ;^>q11oWEZlڧoiMښlR .HhEb>  V">A:|ox Q=dA#BUP%{ɢ"pᣎh4MWtez[0 ښ]4WrR׀QzUyMUO]MÏojMƖ-Z7kyגsV\,[f^Eؽ9%MvlF)>$MBU$ Xܻw;w(Jei$%B0OiaE,>OӴ@ xF͞b SM.V5%^G/ƞG.lr9ܚˑ [vnv|+Ng,G'c,HrCEt^wxzxVj 6 ]`ֲgYy"^_J!#O0LY4Kt#fJT<(y<MӦ:iRW}XύبRO}SءL="8vI F97QO ƵA-ºxsDa&߿ceZx/GOȜسwƩxG]9w{ɵ?~gĀ66[/>0/:# ɥs'ѥ@s7%f®MEK O禥L`/cnHs}Z3(2e,ӿ5JYOXk2:+RG_9_4 ҙߓ8IWnvm) ZqQ>goBh7pܤn;>T9$IƂgͣy:S%7ϕ/ʫ2rh?'qe[{R.D,z6LteZ,6`=F98 Hα,˙ʉ7Jr Tl# Md+r,r@* ¼b5_d'-v˰\L >//)c \P3;%^4 zW2a*~ 0SɊd\O/ch?ս_GdZX! TXL_+@W]\2ϸiד\Ip}LdqLO,b!3`>bJQA4RChFLO' Y" (B0g,ә?ԧƵzJ6j0`!Kds!c3Vj >ޚ"-v;`B4^4LZ!TXKTYؑA3 XȢ5wB=NZ\FjDB!TPk!B B!PÀB!0`!B50 X!B B!PÀB!0`!B50 X!B B!PÀB!0`!B50 X!B B!PÀskٗi B5vˋ>}⦮;t$5woWmBz€, Ɋۿﮁ 8ZUl+ nد;]BY: XҐ&n`Yy0g-ph!À,л i1yC@vTջufbbLZ]Q8MaNE闢ʬچy8}nr|Tk)IJ8{/'B,dQ\濳V)aNJ">ގe̽[erT͛=)>o3㝵[TQ1={~;uʊuR :( ~kaHƩidDaM)KcfM+ļBaBMTщcNe{[^ٍ_.{لÂ6uqerUkhoGDzk>^^;;.ʏ~vR@1fywpW_QY򯂀G}ޑ~O}EB/,.(iI? @JwoJw~_ 蒊=9{ 7h(1 |BԬKGW sۯc;t}!igBi j2υ2+A] *[OYnܩlb2Dd¼@,d ԚoS3TAlsgSg+2Z]Vi"j0`猱LcJoޙϫ2]a'ur:Vi {]ZurRq;B`BZncEvCf|HC{D!0l S AB/cϭ]9Xu5=BqPMqJF]z'؊})BY!{li3ǵcb x#˲@PdLq sc |k{]}KJ,pEUۀ#jŅZhe_BψN^`)tj3cm w~Ik> [ti豳S-mywpUax^BŌ;>D~۩J"0 V^N ~+(/ޓ&_U+gBjj ؎z`;/w?b-k>BmM<WoG!T_49 Oo:k.LYU?+Wm'ioS9PǿBGrsi~ZqlY2~ކ3xBB!bFuHhqLa+FKx$ESWk O$Bv/?%SoBܕܫ`EP&~V_RreZۼemK{p2eAY׸b 0ҼbO*Ub!zս{X!BesB!( X!B B!PeY*5vwB5I$i" XBq0)]5v_B5>7meI( , X BdKX^aC/&LW!f1ͻj^ ty YwB>8ÀP}aB!TO Y} 4 Y} 4 !BaB!j`B!,B !BaB!j`BӔf)O؊A_26L@_Z]64`,n\O-ݿ+szJd9/l0e39ԍ'l&{s:UV[{7`aYW}l 8BR`BM>ey{oWSL?lI.m>='/ )x϶_.?GSE_g 6ǏlLhztCΕkD))Vٱuұ؜]{Ƴvʨ/ k5v\[*[6:G-t0^"ʒ7i}yFE~o -:w48|1BA-?xg@{&ͧ/ejQeUû\ٿLVwC{8?o^s(^ߵ;jQxC#E`L;>z&=pۿGXMny=܎_LrOm߻jV9l0̸Fɨj6澭M(2{6dx+)Ae~@BEkU:g_:jOrA㇇8Q%=Djުyd voAy'E%p<.&9߹9 ch=Uܜ ވ+0^Cagb-Ω;A.ڑ8jD_wޕ .#{֞LulZOct:xt[z!zso_?^=zӟ^t#\:s->C?=;:` $VlaZ2ڌK葑|bBso[wF_Og.*`2K w}hƬKH8!.vvn,%Iw w_ICw#U W&hCv5Vս-ǜ{Xn'"hw3_o;kR!7~:se~Ш7zw%/xmKLܽl_}tlZU jO&B.>g*^0\8rt"ăk֬HR~O__ IDAT.V71ej75]gٲ=_{phb3m bq`˓]N{%p%;3/żj5²߯Ivف$@uvw;"x5£2uSf^MS2\͓fzN[\ί6bakaUx unMF߸$Q} %]_&C?.#ɦ: /,^:N&Dyߔscv>lFtݍ[/iQf9Og_O C@d0SZ[@gQ/tg(`wڊ U+Ϟn=Ximgw:N]p6#4 6- s0Ryv-^YIW v.;fw6t, 3B :v66sYjٝp4@GiN´ʞ]EÆZuJ{[{%FIƬK}P6ޘ?{ ~hBAX{¡^%S. epH!ﺓ*Zs}˂of Bz'-`+oLzoܕu@])tMic:cYc]yCH{N2ΗZw?;z wX~t7_g;ib+D,*_ޒ+7@9=vYT]Rߡ#8XMqDUTR z5̈́{k8y0b#i,+*5\$[DYQ<^m{1n,IZ#zyND{ u!XHT}=; $PPc jrN.2} uZTI|kOR9!9{~\m_j ^4M2冊QG^)Na+D +22q6!@$gk UR[:aieL,P1NF&O(%+{wRFBCU w}#~u.r[ZTJ_w$Gc _́N\-ﵬV;wV.|$DL/gw@+J-9ȫv'wpݾSVk1mvWk}l)֠Г!Βt뮣!` 59k0_յg z]۶޲I}};UF">ER$\!J+02 *AcYc-_7}ts_e9}~솿V¹uM;{{Kwb- ty:`CRzz*O|]ie򩕇ru oY Yq)w ˖OKn|L"f9h%ֳ{=[JSp|ՑoHI|ݻ YʽMo{b **-)Pr6\nv@5wzE ʛ1,waov:ۆwf=5˲{xitmݯȺ Ss=oFl\{eͭOf];y ˻bwzEʒ ,=H jdл0~ݩF)˸\۽*4|#qZ@B5p -qCFlZ$_%MyvhYxf_ɅF`Ko%= .G Y[o}̲{iɭQ]^-t~HyΝN0 mqTV}GQqg  " D)*H, J[RݝN\y||r[玻0L& @nF9Vt_Q*`"[n 7SGo߹ʦ#9o&mdEIОm3{31ZuƟ^@w0fE _w[ǖkҸ՟ا?j\j[1mH7qkP/۪.evr_7ﭸD޿Ż^@ ޾ߏj%a(k{tǐ:U_ Tte^$"xCљae4`ONWR^|?>J>[Ϩ)]+RA{-NSj3٥D 1|WM#a8> F8_})ð2!X QJQV$roh޶&`X,"7@Q68waN ^뗹ִJ]2,w-_]WtG:-kFώ\alNd#rM`pu +]E 21pZ?\ }!ϳ(%5Ɛ!,ߊnCXN?d\J W@"P΋ɠO?k.yϝMж:j39Y[֔B,uCh<{]3f:!6޵B$!p^d 2>|M[. ޝr|Tb@gp\t>2v橳\P*#uY ~;ALlR+]<ܖt+ 3ˆS.]7!UjfHrܻjW5:,կ]6߼nӝ'޶A**]Hlx%Top.8{.IZ[>-ATo}UFWDHYёE9H\)cQ[6̘={XEA/w#C Bi)Q_k>#)/Gv}ęN8Ծju72/4xo/OΛz9 V.soU5e/3ǵ D%~l^МgN$|d^Ӡ ݳtČ GNK] s㦝hu2D9$m'}:s\kj;/O' lɯ^/?j^A.$^:bƁ[\VK^#6ycد{ORhĽ2F+YGi,_XoHa_3\5|=NڦuTɫ@!OI! pYn]zwk_VNmrrI\s*x+8cjS˟'@4՚W/#$_m' '`8^qX]ЄfvZVUof0swg4tl@Z]Te(pLʐw˳ls/7C BGUx.e@FB2}s1wq^6gZ؏{D)t'%z R>O-+ywrBaZ-gOI5Sedt8VN)vNŇBDIeuWfb`T5JrpǥfO3._LWעBf햔k7 r,fw;w^3]|aZ1>ֳv.4LF ?f̚UKw\Ϟuik4vudaBudWB/ڷgԉ}ꌦ!-#yX_2i[wza3>U,Gw_6;\cGrv\UD@kǧ^ܳ)'E=!,uҬ. ն O_Ӓ2y"K&˳]l4ڱd? 0{+֮[}rԴ{鄝7El57OX|JZZo/G`?>lutWsExB!xs!aY޹? >tW~&.*Jeu:tNwFa9١IU[/,9F<Se瞇g_8"Fև=_e,MU 7MÐN5zw2bᒁ}L<+L@ߐg#Tߧ<͐Llc'q0 ]b53ç@8]}/6[bO{&b7#[=-l#B{'{*Y>aBHK6YW"N(I5$X͌ߨ$QTeW%#@%I#9&e_rYSҜސg\wӓ͂LgtpwXϓ 'tQ95$\ {0XA5ltAQ0=Q'{F!/SHN~9ٳ,€*ACUEHMT V΀M!)J3Cɽvpf'eRTI:#-Ua :X~J`¸҉=0,0$א@)$FlTa2f'5XrJIos,Dz R`D(I `ܮ ygaB!;]|pa9cXDI òx A@J9D ,BNWq[}q,aU縓4wB,BQTJ 'aXBi; PPJr@C] 9D ,Bߠ IE. !]yBD ;6QRfJ!\>%D̆J4 XΔXfs)ǩcOPCv6okGf3t?o`MIMQdQ_\PAѝ=hAɿJt(k(U0`}{Ӻyok/{,߳Nڜn^]܀˱/qo4y7A'ܣj~(?}iv[+V`Y3phKe_ֹ_|O!Tܲ]DE$*"@),yȲlADZ(JE8q'֫q1ڵk=zj?Q 샅JvTJpMr15}^HGұvLVu}á$| , Kgp^Z0֡We1ӛťf6=Iᘮzew]d< }wp JB%hU|+ꙣi7PYwH 5twfqoh#ێUԹoԪ>/дa{FyێjChC ;|3S[kP CI~!QI(ñY63>|IPؔP.ߔG,ߦʞw$)^74Hz儡's_a=PɅ T°`DrZ%3A5dCFn( n}aK', =BّGX8,g~gʰg6蘘h͚5 W#Jl+B%!q4{n[b"x1WXj7޺/) 9&OkK+RJ>0 +TzZ (ͷ)V_FPH IDATchjKkwܶW~ovZ N޳Kԝrv* 2rQf.Q)o *^9*H+=M-ʥ޷I@ !ҿi<_SU)M䑗o3s2_W8"U[3{OOw TUG5 e@]Em ]0ydu ,dr=m/ ,aU 5]v? jBG)%r,CC$r$IE"O6v)0`諴3-==z,m:d GJ**jfm z 8u>\󝴴4On :"a`De!$sPаHi7#@yx7Q܂ Bxd{qR=PEX74А?]͕2wU>z9el}Y/40W1iߖMJWBr =9IKQ NEEIAp$Iz'Iib*} N9lڑ.uk{g!@%0 4dEˮwQpa3QR*I$n e1 B0@1]J(l| \^ZD&2~'T\c׆Agt 7fH&_DaXcY!$35QJ)P*( $z?ҀJ2%Ɂa1WV)j y' X!xvAVYn!N Ww̼0|XRB 2er@ X BBky \v VYa#+9(m[J.]y&`268kj}F*ՠԀ\ 29d` `!B!@/*j}bMI3g{d +L K⪴€B=*Ou@\J)! xV΄/x+ 3V yBHy$B{`,IV'9K,OxxAdr`92 K`B^Bke^=~(r ˂z@@&N29X,LW  =>d`B^aI !Js2!0탢+Ű*wքPBou&۸d:B֍DEaaDQ, Pr2eŰ {_ɝ00*;Z$9Os(R̫K MZ>Pn{j2e}G&_wUiYQQ1c!R9);Laݭp ¢,˲DXbr'8sWGֿpڱf~3R+"+%z*!,"V=I oՙՓ oz( X.>N 01OV+<;i6>,P7 ͬu2:s [^'iiw"㯰Gdn,_w>ɦY>eqݽcS9ɲuB@H|1Rlx_!IX](/wf U=ś[ym8bFP.| ~ ?N^q܏jh@J=25| ԃK>t0U'w$8Z~~ugoO$?@e51n,˜#fVQ[ۣDKoy%'RDfwzG?o[6o 尹rM}{q!%SB~u6BXo oU2V;qVa9;iKN}^L?0o>pz w Zrpx+51poɓlձb;mB!b/$L*ת0;$F.3_5}°, xo\qڦ[><wTzC7;Xe{~Խe[D0O@РiΞݱB![,^mˏ$Y|Wn9UjԔ)BkW9n_ ǫ jV'i#~"Bր%ׇ9ݤLXȗyc:`㦂DVU}՜nv`jB=o XL%ډC &,Xߪ͇O_h‚ IoKTFB$$y/,(tO0B!e@ӦaE|ܽHrq.Ֆh;iBvwUho4,cO8w,ئXtt]3o>{O!B,˵W%E\{O>U^o;u)I$6qiGp%qUU QC|iwKX3:/EWS,7Nvk=j`B!GvS2jD7 / ]^nnکm$bӏ?1~u Ѷy,tJ|! "\{f6i6 joWzk%`UӳbС -p;|őB!ë"":LT*.OJOpt9 @%Q"lv#-d#*??"w=#=]PLdS 0*J ː ހ[ B+|.B!K B!,B" !BaB!*bB!,.~TA!TyQ\:TF&e Ɔ˞%}k^ϵW'TP囂";x ED!0`!~l:o6 ,g [[jםOgц 7m+7R_QŇCgY^fK',BRZ>ڪ=`˸l}p4qʹGHӡ_|꼵{JAX!P X{1S/]7kE:MZ8`x̑&YHF5T${zڝ ;W(a2A\ ]je.$2ͺ*X$dPVkлM?GSJO`ue:ƅg5µU!*0`}sˢ3$PV!Z,#?T@g}'׳K辿\uHdB?mpM2eܴV[A_s, 37_u=7ߒvb܂wc4\ޓ߰bo96 kǾݺ79Ä]8MOfMǔ_zEosϭǔS epvd'||ퟳ,]6̦W7 B`B^+}ѝ{sX^zsTH߿-]ͷjPFFCնC^)> ٲ/ ӵ` sNvax9pss_>u/yO<r|>UBS: ;c˷UՊ*]k>o{ BMkұ_VX!-UB*9UOlhJ?gϧJU<C:ȴZqnEG4_7]`M/Nm΄7*j V]e'o_=V wvWz|UoY=3B*3鞍 [ B1Dl[KgYQ{)3e=C,*YV쵁M;s?Yǽ.oݮ˦jҹckܿjsIiG6nk ЇFCC!T`B^!59=~+='QʼعO\mr hlkP:~l0TV{#h!B%2Ne=R"ǹ'ns!uPut?NγTt ו$ P{2 g$g ,ڠa ⮃tUiR|UwM*!J XdQ}:9RjzZbܟsƮKiաC# + %q{:lVwUB|V}9x^M+nѳO+6}1im7a3':2ÒoL[vsG52f[}]+/ӁvÒp~O+Bȋ`!N?10uv7T4Ut{ݵ\֧ƭVQc_ⳏha._K02:^(v\y9Cצ2x`!lpLvM]b\DǷ'_M P"ަc H!q8YQA%A >dHK1Z_NF)J{G*%yE) X!BZ}pB" !BaB!*bB!,B" vmsNIZ`#i8-/B!w%9nٷfϥb,[YzuÔO!mhZ|pviܭvџ !B/Xk&0Yadn_iQ}7! B' Xvs6wTjT'OB!txmk%7mWP)Ť+FMsjE4YS{qV\Pc/[Q쒅7dDfX$I$f) *6$ 0 $^HHv/niԱ׳Eu4丰~]IQ'X+tZ]ϟSÇx?w^^Ք=^iX(Xە&mWIVL= TEO* *~ٿ%IbeYBHqꁼ8j6!u_ йˎ2י_c ,p+㙘Rj+}K 2zt \[DQG6We⮕ǭPO.B!o׋<2m皁B[Vk|5^Qysd')vF룕?džB= J)}m BE dZ  \y(?6W=gcꞸK,tBy%Kp%ͨE\M+nQ*4TMrڊ}7cw3үͨx0yL͍wM\lrZ|즾Q /AZ"ay+3Lm-ӂBx%9rd!9xxmX16\vMRĶI۪j.q M‘VoYj߻o0P?܇w:woZHdrET!ݵtƥo:a y׃{'my 5DΥ;ylj䨆MCqb 7B!J](d\^ܝDgFb5>z6aJORhPd$aƠNSZ4>\)IkDpyA'6J1YE@vvz=!,˲,'*_>`g,J:p8vgmLWy0RRP(d7%ygN!4͢(2 =Uq ٓv˥jKh],BErfϝ2C䳄If3!Q걼EB$r8\WIdDQ,/€Bh8N0 F+T$(’7Bv=:PcB7,BECEg-Og,oA0`!*WP0`!zvaBOII|kaB!*bB!,B" !BT9S]nr/RDT VWB|0`}uÒ z%yL%y웃'`I/jz".#B!زȚMtkSF78r۷nqٞ* XDRFw:E''ZDR$EB!t?a,Yl*֞<{eΒNjK X?I_Tkڹc:2);毽RMs5go>Mz֧:q*6/oi`C,BtkݼN#'.Ya`U#W9}Β NvmZ-2>33F_^g/' 4}LAko"0ieRp>e£"Â5XBEOBLrfmΒ,t%[Lr}{RʋEkP$#F'n\QjTѪD v|8ц7ktn);tk.gBJ)_fJVbXBOA;bh.*0ዷm_ϛ}1>?bP]@ٞd.yD6ew,cLw'Z?!q8Km97M9WP`ON*C^- npȈ[?O%f-9v#!T,K)ŀ!R)΄{4gĘy [ 3ndJ&9.sϯxlCI._5JF=x2   B0R/yzuKG3rcIVƁ _ 5x }Cտrz& P&\XQbxcٲa} y@[1ld.*mC_MB(rR)I,T$!$)ʒ8*NX=q+~#ີcG]\іhvJ}j?w'+{3LKJIyWDl rIx YQ(]+Tj IDATI1fճ4eP$[#nP}U5rޭt0SqoѵDXjxL \>J.Uڒ&5!޵ogcjUnw<ϥ,SJl5 =%-5!E+VDAg&xP} 0$ǝsgݴ*Ceۑp`B-1>&7 Tݜl#xFmDEs'8DՓRI&iZ,"˲$aBJvtV+=plio+خA4}`LRvy? J ;߼8.n{Sׁmd6/)!:2ྺf窾u}ֻ/YA!˕3YSV0sC^^ W$;dI$C7մl?ߡcgyqNjv&Jdϰ |٥qq?NUCIG;h:*ޜ="=οWO;_OK c>;,gI'IGk% '* !BE[\blw6C*sZ"_RrBKBb-Rj7_v{3bDU+^9FTtO^g*FsknSnUW!P&B?ѵġeC 22^:hVKi6V/Ȝiɩn>WłespJCyp]dv%5eC_=mLAq{꡽NW!P,PĴiX,_t8!D1{GO$ҵGd7ӹw-VR$[n>~GZ'Z䳗MfF7IʝnI)iȪ P,/[?wdS ՚W, B,˵W%E\{O>eW_^մf$\^=e֢f=ZT}.gشzZZjfOakٮmL"у6r}NܛZ)̮sVs݌( @꾕SVbJyrvھZ'SYψva2cx,w$g)WYÊ'WנV%W!Pq&B>Ӡ~?gQ$B(pэOxUMߘ$1n@xCa_0!ꌏJpQ`ݿؼW]VP>.gt/YQ+XYTt9ۭuȑKuP#^Ք k[mtlM_Xv5 '˹9 hZ7A18bX%0A5Ǭ搦2BbGG![a2Z%^oTqHN7F>JɉPT$ lc*Ja< \ܘ6\dȔbtz@%:PnQ fNE%!iJMqȌZe=-jt/yjpjyN2| x"(>ʜLz7 yL4ԏ* !#r:E2=%%"`O]LOݿ|!CqI~* 8NEW4᳋aO..+{2"2OXO0 j$VGog>~Ŕn_}ЮB$Ivra*$I$n%ɔJ%<ҝgN3gFdόOX)=pZQ*$^DB샅PIW_\ ţd,e2?_keNyO&qkG⃟4TaB%2 (=9!"-.{WV;u+AF";s'<+B4Y@TW69uear2ܲRˉ€JJ_Tkڹc:2);毽RMs5go>Mz֧:q*6/oi`CcT 0j=y|Cn͸vq߹{qڷ:ϲ& l(|ǯ2QF lʰ1M+L<ܐSBn]־LTFp^;62_FoowęCVZ6SSc_,Yrd0L^b)InMI,T" v;o>ȾщoqTllZ1d?|j&o4 n5 MG1[ g?~uq`/\2o6K༼ᓕTOK_UO:(jULi׵+)Aw.SYKJ$>(yC?O19ȸp.Y]MV=.vqMXFZ1\& S|heϿI7w~vyclx|L&]X0`!ĤKIܵK"-;t5aRR_ K AI,T"Q>Q9JpIRfJ%#:]Ots2/۪;8bn4]6z繕+rZ@tD*;~ι3sgؗq)DE 6Z$&7ɛILD4&5Tb!&Uh0D# + :z1& s1~9̹ƦK7%Y0*\)]8X=ufRz\*<<|ꭒ /:|A!4xvq8[Ͳo[4B%KMo{No`i euj4f\-ۅ-S@ `z良w"˂4mG8-enD?y |Hb#;Yʖ}'k-N`=ĄhZNC~O XmL42c۞S-!Dl#-% 6kj!jk"!mfA#% Rs= ;̩m?pdCu5f* 4d)LbDt:]&x1혒df~a>tuS::rj5#S:aRR]wM mS}}((r3qV*+!JZ!`A%7`A _}_mfXnnרA)™nq\w}QJ!mbSb!` dYX#rK!( %0XSղ,3BRr*Q {+{@QJK(bP^2@q<40 .z),1{r(zв:R4B!HtpҾڻ `BQJU*$Ik%Jl6$"npp3,7Cp3,7Cp3,7Cp3,7Cp3,7Cp3,7Cp3,7Cp3,7Cp3,P\o{zߋ] ]\*_շ-G谚MViJ`5(ҏR[K2>{OVA&(aʍ%hk/Wg~Rs`?2󫭂̂?3YJ,CM$T1gu2BoO7:dR}diSM y,Sږ/mɉz빒ΝF-i#O{o5{gGoo謽IM ;>RvKUw/Z8Q\O}_e1/g#._CKnE9BZxn˟RW<~cwLUw<,=f ?ɗ4=,}gLPᏭ 6?ձu8g|-А ~.m>)뙬"jsjj4ZW\2oԋOM^Q?/U"ە}(!dE\S[?*9W4BLE{^8&u~9+#e3:CjB§?3'#̞:%}朴-^,=X9%0!y\!%F9yՎSY,K1l 혃Eæ'd) =d9aȭfcg0^C!/+B 4Vlt.F7ctEG즋&A,%u󔡲_p}BxdȮl|cNeBfT\bߗV1zb(7 \H|M 0!PGE2Ble5fE;=R[ZTo(Pm'bkE"]XNSZ&LTTYhH҂˟zY9J{ 2&544$t+x\_MIn5S[\YD3>xRV'ტB}af֯Xlg Du'I'v['O:1~~ ujju6Y$.00hiodIr# wX!/n靺dkU']7f<#"DI#2U2?H:斸='υ,y_ύ!-?b:_ M 6B64E.|hbiA8 e3䦢Õ-ݳ&}^Sq]sd_H?Vt꼙alIa{6\5~3\,'9zŪGSV>)JeclF7rXCgki\&or}?L6-ٱ!ژ%#'-+j/G2'>~&x'vfrD[Wr:%+8ϔio~V@gWuTBl -eAxl,.<֢I}܍ɻ:fLJ(v5\6mɰOj-8ow{23jbƎtXص=jYj4)JĤR](:bmgWm+w-l,$z {u5oHz螌}k4:;, otJB}! ? )5X> k۷zC'YoTwH蹳?Qy6 aE"S{Ԧ^ޒF6lץ6Ԍ1ƱPJ K{};[!T7q/H ~Ývmʵ{y7ӡ z@m6k{_)YdPh=I$I2aeB"yڟw$%Q ee*kF&0B﫡,m?Y$akj {>tZk&;'_vXЫkX\   ܌I>uF&8.`0Xe 5ro0|dfOȒ[(3Px -&Uib4(uO2 ޮ`h3 _gfRʸkr*n6oWʢR]BbS؟^ŋRFzmDzzzQQ…XVVV.=XփaF8ח7{>ēUUUYPWUUO\X? 5+777 Nu IDAT A+l6Җ(!^oXRAp|駁 *Cq aFShr_~wGr?>""b @MAAs'c\+_tXBd"B\eIE^*11Ayo,(翷}W_epyUE]!$ɒpRRR"#"z>L wބ`Xuƺ YYZ)c:+B|^ IENDB`dtkdeclarative-5.7.12/docs/images/SliderDashOffset.png000066400000000000000000000031051476226662700227110ustar00rootroot00000000000000PNG  IHDR^Rd pHYs+IDATx[TUffjXՃu+ &=&(_"!"("Kd7K"JM#4D,]9v3t^{3 sX̞a{}{$I$;H9RfO~ f$IR&ˀ]cY#*2 fw Jʝ})'dH;_6MxT)MIomPJ~۲3Tāc@ :h{`Bmt,5 Nkh JMv='v4A7&ˁw8B$I$I$IK6 l#0h~SVt*R&> h-Ӧ|Q`_RӡǶ?` P`5 7Dv~$h0Ĩ Gw fl)MN"s 8bZ_%~ (UY\>b[[WWn'j6 Cs쌒RV>lj=w Tho(fәfcۀMn ֧Dg5Q<޾O&> J-W'. Lvl qe ۟6O>$I$I$I>&nt]9} NĴ:d Wu pZf pz?H 79(aχhLt''r2@JeQ> οAnJ$bmM=O<*jP*_7< ,<&Lxxu mv#L$I$I$IjE-S!T]P? `oa㯢u}fEPںe J_׷l&R*}]߲R [6@U+oLTes \W]u}%I$I$IԱF󉚀=fb&h[p*RBCGX2u\Π&J2gd0dX[XSY\; q:R|L<'bR `jΠ3Xb5 9ur`LƸqI0x"7jb| S\J}{53D.RA+PZ+Dc]J9` 1CD*u[ģwfH$I$żfje$!1נ<$I$I$ua: IENDB`dtkdeclarative-5.7.12/docs/images/SliderDashOffsetCompare.png000066400000000000000000000054021476226662700242220ustar00rootroot00000000000000PNG  IHDRP/ pHYs+ IDATxOǿ{fgCA!!O<'/5Ń<܅=/x@ $rPr*ݝW~dݝ$vϲ>S|uU=fPw̋y+]9 ,Dty}wr݉u[TIBrO~ʯcy7$Pr%6}1ZŞXX.|I3c1.> G S[w 1b:5=6Dckn c@>D.Ӵ<0.3@1Bd#Fk}x#FH\~A *z/,,qU&b%ߏ~X2skUiDE W.1 $zAB"|!@d{2F /AEAIt{;a˓ܑW DDwobhyc81ݎE1 - @ I5vd20b[V=)H$z!dyJH){H^%+H Z=<:H̞ʳO=o1ۓ33!V)fN(ɝ0o[~ttD-fRQYH.]Z{R(O9{_@ӿJKTYJ)XN'$)^Y%" f46>:3 Hү7]*_fﮏ661!`,KEs=2Y :FE"H|ӭ+]@#ByjR1P -FE:p=8g`B=ZէEmP;f#gϹ#*0%W1Ƴ\z:NPѻDBcp9~2U5bH=3{_UՌ?:c g婨Sc`,ŅKCGg.YY|UUYeY*̇ i5wI_K;nÿpٽJCi"uqŧ_l"z:5*zǤ%\W4Ezl4ۥ\?}_ݿǾ !{o6 F2abӢVyFU—TbwՔf(ce9u  Gȇ1B,@FEo^9HDQs u苩Z4O.C"H128ceߨ=@0baͅ2p-EHoe( X'ubQ[wL=4"Dk3x/IQ"$!/rl&1 6C /luXW[جKi=iu"S疴UKb:EXIiQ{a:)X -yS^IEds"T~ iƋҼŃU[T3+0}/ݸTŻEEOR*(vTt@+]9ʁ@EW*r :fQџft螦4ZrZ@_÷X 4r%6}1Z 8GKt_}o c1&k\)c oϿ1Ñ/}~Zc cK 1_膛3 +.3@q9+i:@X?l/ZWer-fY2%97o\JTYq2c@tn|!@d{25OīRMDD$w$,ECb-= )-.-bp3cb^/oA I5vd_/h )H$-!dyJhѦ=$^>cV-?)ˢetA 0{*Z# o?v oǷbdr'F 9zpAɝ[7oLjvw{^gzy})݉jtif^H ;/`UݳRzgzjFY1" Fp0̲"I|t|9M>ج;L^c*1*/YTvCTw[%U;CEF2& 1R1P -CEE?'aL3s'Vhߨݳghs.Ⱦ !'m 1fU9l`AE"Ir9~2U5bH=3{_UՌ?:cRwu2dTYtXt&pipe9+˙ʲ*+_z_z_V,We}{ҠHEo;&KL_o4|\8s/_pS6Fu=aTIK.hhKܹ}b#BW>p|(# r s?tbm DEH;Pꆾ>וҼː(R oT~ Nb n=%72 :PѻgKXX "X {I/%$iDwy#/`Qz/-Qdl̃97_L9,밮|Y-ܒjWTb1X+)7-%0n&IENDB`dtkdeclarative-5.7.12/docs/images/SliderDashOffsetCompareWithPattern.png000066400000000000000000000033551476226662700264210ustar00rootroot00000000000000PNG  IHDRSv pHYs+IDATx=lW[kgι!AS$F4ۄllD XU 1p SX @ KnPRB@Zg3{RއS̙9^^{X,@TwH $OEnxZƑvRXd;1>,Kɤ+/w/_P g4mES\]g?sď7fD24e̢BWѷ' >xYYV) ;pOqfM{mf1'Z/*̶T!7^K9AN`i*m&/>5!<|G{69q ^FNx~r΋@lcNm&0l8qοu?N`i?j|ArX"U c4A "9' UPgͅml)!E\k-WnLK?be}u)B9&4liSJXN\J]db&er"L:[solsU|rDNvfQّ rf [J)85g [Gm5A)\y+y `7=qZGVL8 ^̐Rİ..yte6~ջ'w0;E;y= [Gz洌%A.`=9p HG1tZfC0`;s9gS>1)jιmd_!2~.bJivV)~n{1 鱭C#+UMq)e͓@˚sJ)ʫd=#%s{64 Rlvf)aX})#6gJLCXӡ} HX fAD=bquߌ VZv-14u1&"&N|oDT^0,SƎ!7cW8^宗U"ES[}vpxq3GNC|X7#fe\}#G:@Vkt+wLcߔejWu"G:Ƶewz-vS>n#66F7H7qMHa"#Uq0TƑ*uG $[ƚT$Z&!Ղ5 IHuaMBkReX*T$*VMkq,ݻ|_ sR2" sVietd&ᑥ<6ɚoPF~IH5 IHaMBkmcMB kRXšT $Z&!Յ5 "IHaMB kR%XÚT $&!Յ5 .IH/$'mscIENDB`dtkdeclarative-5.7.12/docs/images/SliderDashPattern.png000066400000000000000000000027301476226662700231030ustar00rootroot00000000000000PNG  IHDR(.( pHYs+IDATx?U;3K0b UZH6MX )lOac%Jb""v̽;ٷkyfxcǹ眹wkd2 d&9H ZT迺7ٿd\b!@P](ٿ!z9w|> (JH}Y:>Fb$M )_3OM|= 3D=TP ĝ| *J'@ |5f&u |xEv| &Eї/x\ˆ@"P]@|"PY\0Cw޾!xv;? u] &Eou!- x\ 1W%U11kW}𐰸`:d;/:'U E ݽ' R2.\ wnHU*Jn:nw (P BaVmġG.%UwP8'E+T7ۨ~;z7wa,Ttp{[_____r$0H@!y; 15ar[yUosGjoWE악+V5JQEmM&6h\UlmW7'kG0-FdH.|p1lvr147$çGo.]9!Z$Pz4~sC!꒹㧬yV .X"gd@xGr$kE%NptoD R"09>ym\TE!A޹mksL??~>ddVXf\2:z8nڵM6kkkZ4mڦcҕQ<7NOͿ[XZn?qޯ Sݷ,jW&x3a|D&](alB"fV'>-\Kbޢz?ߔn PwWh 'A5FY-j>#7b#x \C6NB3k EYadϏaW.^#iI!_l2}!6zuFEI_ι8)z8/IENDB`dtkdeclarative-5.7.12/docs/images/SliderHighlighted.png000066400000000000000000000033671476226662700231150ustar00rootroot00000000000000PNG  IHDR( C- pHYs+IDATxA%GWlH='BSz҃у$x ()`=x{^<a65%BP!DٗZ/Ti4B#$B"xS^Ck6 zj<԰G* a GapV ?|OZܫncܫx SE*[ި/>S(("@dZQbLD1wWw~)˜]Q ]bMX,WϸRڭeJ'&uȬ '& @f8jrU=˅f>O gp+S!O.3.: G,u:;fͼបsZ]ݝk\zSe#<՘j1FHȹH4M[fC/ړ#fl0$ekTā 2Μqls_Y|(_QNPXzpLۂ_{"F]!kӎ+j11رzQ 1F_٫&UW1E cEDxWzQT64LT$zU}'B"_DR(c 6J|z}Y&J;"eyXzj1G}Ћ~Lj?~g;|khuaB@L*}Qw# j-z0nLGݠazn;hvP5V9q.m4,{Rf.,.i9:̚| _{ria[R2#hOHR A3C=Cy˽m1oE>`5!zR5 "8P!K򭶫d)yQ7pQ+o3Eb0r19W 1Yn<JgVZPL/W!+J]a,数"Q;X(Klm2\; E5h{ Gb޹(MYd6\1=fkݹ(ا,ܶ# ȷ}"aIENDB`dtkdeclarative-5.7.12/docs/images/SliderNormalHor.png000066400000000000000000000027231476226662700225710ustar00rootroot00000000000000PNG  IHDR$dc pHYs+IDATx?Uǿ^H-  mhc!kJ!RhJ6BITw3~x;s˟Sc2r ;o*=DxH",ktjbKq_DT6/S4Pzv#e$T#fa fc*""wf<"i,`O{85홚E5/_0d<Lҵ00Ο廿3@"P]~@X"Pip${eݼ"s̃=d26ȵuq$W rq"c@U JPR "CK90$o8dPD@Dy]B/J#%Un IDa[4A`ٖ|t@ =lK؃ @ݲ؇U=IM)%U {P'EXꗃ?|{/O*;"nllllllnQC@a~ Ty"NolL/_v H1{Q?$bO1ǁ=sx:xf|ll${B 3NDׁ9HxdAB`f_3.ڜi#")Su}A.$H`f.9S(~|NI"LXsFY\UeU}}}U+_WY ڸ[ 戫(q-'.~^2W.4G^->btEum  $%\T *q]}:HV4,/q~~Ҍ0x:1B]>i6=L+vzF| XZbHca MP!+42i B"ĝD5" XM Ybl.m{Du4NeԊ(yDA]iV!!/`6y"؃&tlPDk3xQŲ"4FDp96S )"&@Hɐu2渗@1Mb\u= $bD0qr5fӖXuaC${ӺHMh,$u+Ʀ84N"hqCKиCvf]bӔ$ z{178IENDB`dtkdeclarative-5.7.12/docs/images/SliderNormalVer.png000066400000000000000000000021741476226662700225750ustar00rootroot00000000000000PNG  IHDR~]C pHYs+.IDAThOEA`܈$ O9\CmgA OH$ZJ") |%R$DbC':qBzKrCֿwݖP0<G61pݺt&Ro1h۷ﴓ[#GT 6G?bf 8ߥT4OPzT=|wL5iM3%46Wʪ>g^0>"s4Mcmʭ6}9J=z}\eU󸊪!,n. {\y-=aS$ŶXbֱm#qv[*:R4~JE̶! P`MtOn '. [|2]q*wwG݊_@;՗o]<(O1S<(O1S<(O1S<(O1S<(O1H+)3_LF+[IENDB`dtkdeclarative-5.7.12/docs/images/SpinBoxAlert.png000066400000000000000000000130371476226662700220770ustar00rootroot00000000000000PNG  IHDR0^+: pHYs+IDATx}EǿU=3.ټ"vCА&1'h DDˡy"'(o9^<#DC{xn̆dCL̆I66;]?zw%/d>>TWWWwַzjL&h }f-HB R9Ђh 5#-HB#R)J$`Y4Ed0~6:)%b1!5 s, )%E< WT #bNM!c1Fo b4mcGήh,:4yY9q8ړ,LR?reh}+W~ezo0fϜy… uu,LRw7shmkRBW\zY۬ zxC9H>ëVQ)=+V_p@ ׶F_Zqjsfo<=jUk[F9P޿rgL~ÕWp3O%WԂhWgL%KXlŊo-Yd2rjgFst~7yd[7ۚl<ٛ{zŹ;1޼|v{sC{˗DޔJ$y{غ{rIUZ l߽w{1[ˤ}#9o?8I\U.P52fgWסͤ]=1/OcMmʮhLm_bcϟ\/y^u'54CIqA =v%Nvd_%jhʛH3TUeY;qnY(eÖc=uh4G;m&;uĄ3>Bc(4-t1Qϴ77mO?>;uMܵ˛xzKK6\J/+8S?qN_`kCm5YǽYM!^?~u=/91t@sY5OTgδUd[g˗߰7/_c73g:bdv]FS72y[/7< 76ձI-H`imkg E>puvzw1Ʈ^W ,y4c]̝5wY_)`}[b(8ǡ#ie7{n]m.$K$EJƳ0%62,H$NӾ}ُ^y委2 J~PTuZe)͛wvu:F&55Moi笡aSD߂6\ җb*_R4;uUUP,NP: fر T.l\Ga|#"ɊUW;#pUW+ڻS T~MMߛɑ)XMbp0Xm-a)Ѱ,RJUZ)c3]8s,MJ'ͅL55 PJjT(jjHUh7kÛ/\@MⰐ;RRk=E$YƘ;uHDm$5pZHg`6*eV&%|g>9蒥֤#@6 mH0*( _Yg4ȊHDeRr\+NzeX]RԚ8)$ȬH{6qv%jRS YI)t q è6dݤv.L;8XTZ dҲ@ lI)ꪫ9NAڔ, M,Nq4C7KoT @(hKTJ900"HuuuB>"(0hYV"`B!#pz3\mdlD""HR 9BxxT$RRZ̨WH?onMtMݱㆋacֶqgc]r(׳p@ݻcXcc#OpSRdLQ!`qRAk'{Wj03bkӯc |X-ĉ$ϫ[7{ _3?}K|K`qn93oYvX)k%U)Fx.w?Ln4V3XC 1`[m8@edƲS?N? lq%F@?4?>97N˘c6O7`Lӱ]V+_`S WHg3.-(@%)>X nU])=B;=] 3BH{TjYy9@Kɱ(`'.no3*_#e=^\O3IK֚v,8LCf5 T{2k2ke荟Z~!3糠]r5X3 M1>&"ds|4 ݓY»f o癷[= W-Q ql iON{qYShjx_Q[/T@Vz^i*pT|pyZ]dx!3 0v֯W 659gq {#]o `8O 6 l6e& /[ͱr*q&ы߳Hzw* 24-2y!'aW*Qk5,)r8sg]#wO7ϰ]c4t۟P]2fDxt8K[OnCpə疉ay0" 4@.L- F l{j%]oݭwL&"6Mj@橍` ${Z#Z ds6R">C`o/ W^$7zdR@ =] z)q,d '9ʶ4mv uMg@~WϿr6߳׈/|S_io>{G_?'Ck g,@8vr#S'ΪW]\iqH8$|lp_4g8;R{>?~p U5ޜضJf i-lda(_26x,.9ݻ!abXN uI5itwpGU "!Qpg(3}a4c[7/RuV}6.3O|^PSNrr(0:dvH{ } 8TO*ӔM#ѮYF\4WjZ.s`y1(z5ܓxQXb3$gh-Mv0p3E3l9(F\# w&8o/)zrfU4谇mXmHI}[)!!Il7c\3 ѷUEu~ivRG7D-*_g,N`hcp`uҦ4lLGoj+.5§M]h\iVc[dS½e>giB]Ũx2D7I#)auD/jbKn`Oɟ_x6BOnUl!ș;X|?@o2`@C:}t ƱO_ʛ_ԅ;糱0Ӹjͽ򶗌%7UlOg F;wb ^k 2q(L82hi(,pO'T 0 t *Y8T+Q <9+H6<ԑsl"^ *0؜Lӆ1ιeYe :`fa VST* ]l/o/]ü"5hv JO:sM( Ƙ"Lf23EWVQUR0zp*JB+5 lA !;qeT[v3d%Jo}U( `0pIp 3zv8NGQvCyPq!aF(J&===P( qγKoo3k[>#f-˲,+LR)S\205i#oy\dYRW$^]cB1cxdQoVS!c[a7#^yЋK!riuOeYp }G>{"T|X|MiL:5ٚTjjIo&2T8.kVW^X-bn)N[.k˯IY&G3|TM#HrV j)>Bp WrT45qyj PeU3}KIn*ѡFdxN̳h_QRtL_Y7໩-$<.k'˛|~+\@6eLr&LW#|tPc&g !LT<IENDB`dtkdeclarative-5.7.12/docs/images/SpinBoxEdit.png000066400000000000000000000051041476226662700217110ustar00rootroot00000000000000PNG  IHDR:7a pHYs+ IDATxoLUU PAkc&siD\lɶ$]b Ym Bff{7bSҮVZLg({ۋ EU.9{^|;~X,L o`(D "@1B$~ H ! dkMWOc`±d"XؠjM0į6\][KRA*h H;&Vڱڬ!Aa\}>-p|\Tk !$lV8.+!@i(XV|‹D1wB^ .~ ޤSc_r*YBwҊ:` E 2do<'V9xq}")\Gʷ^9Ņ/*ZYd/9DḤD>QFwR}VujLݷMj*-rse,ω~N|^eyW}2 ɬnS%C<&FwBܥzߔ+֙M[F0 04ScK RJ=L}1R>إz^U-a[''Mw6a\xrQ=zߔn|"([>2 :Ak f6j"!r+c`۶m7=ϊЖV"H3U()#f,z{{{{{3oo:I"`k;&.51 }}}k׮ݼy30 [[[wQYYyA&!M&lhhYknnnikkҡƏwV~ƲF"|?9O9r$L Ԥi'a6l+s˦b|QfTu5d4Yb H }J/sQ?m2.lVck2z,5N`ҿf1soG.z~sg6-/ح¾:^q* pm(wYctCT ֬.zW^\}ղlDanz)m[av7·6`p~~hm+u?m(V9Wf8"Owq2謪+E;6~c~|tsOͤaA&/Y|3ּƦ+77.c3$dV;E6q4W9嵕F/0$2oM\ ˗|ŷ sJq#rɚ_dI}}wO?7gXd?֪Ε1v=Y>}WGyQ++(M f1<śO)ZP||*cb}ܹ35];wܷoߍM6:LngUXX}={A={o^XX8CiFbfX] hiiyꩧv ---nypjmu! \dRH@bXUUU[nܺukUUU/ѴgPJ]8Sp跺uٰ44HJ'n_U*("Q1!?㥽Ħ-y|9<=n%DBBu;6oT1Yuo -H!{%,D,K-NU `7Z*)#nc,WYwR{NvuH 1)o."Qr"c {wjB!8FW.#ȳ᎕t[HysqI9P RH.BL,_xbt^vb_%cRPe`1ݽTOŋ(H%DžjI%6@Gq~s-\ 06=d-ځBp\(?U* hR&" 17MW0V5JE؛U7z6O(HcH' $c,7#h,r|'Mnd'1m};v4k_fƾ$، IENDB`dtkdeclarative-5.7.12/docs/images/SpinBoxExample.png000066400000000000000000000026761476226662700224320ustar00rootroot00000000000000PNG  IHDR25M pHYs+pIDATxohe'wrg.[nvS)E}DJ0^h(l)wED}1dPolM(qm/ܻ޺%l`#JLrI/Nw˒yuxx|y.{$IF% Xb `8% Xb `8%5[zZm4FCmFQM4M[VY# 5,W*Z4l5Dz,Euݷv%U$,J6$+$$Rtgz^ն}H{S>O&L&͖J%Bnyv|>:/jϙgr(T* ^Nga!b#D431 399S2<<obVqƍX,l6\,IR$) @t#HlIvf3% @T (hT3gzzzzzm6hTF` BssssssPH3$_|>J].IAAPrWR|>:E,L&5_YASAfggŢJYdTT}3௼<:q;" @!LF=rΖGmI:nr旑{OƆ?yoXoؓ`;ѝ+9OϚI5c43O8R[קֱzJc&GkTBRىX҇^}űx:i/,|w귟ov?>[80?]e9̹7PU=twx񳳶Qұee9Rbp=yHe"KbfrQNwnNiVS3ϝp n`;|.~7,#W%+7=ln‚yZwӧO.///k&kV =`-)!|k׮b-EW\Q@QkX=G[ qzuZZZ ×.]RN`8~۹V{- b~(h~r9::$3?|P}0/_v:KH$HDsBҒ'455,Պe&(,~P\G3411dsUv,iF,Ǔ-HIbV, 0`\^J%LlvN٬-fy~llLEQv]c `tNdC˲ lj ðlW\W9EQv`lݠؤ`I;8 `8% Xb `8OK$IENDB`dtkdeclarative-5.7.12/docs/images/SwitchButton.png000066400000000000000000000025171476226662700221630ustar00rootroot00000000000000PNG  IHDR7!6 pHYs+IDATX$UǿUuع +.(g&"h&(k&(xffhp`hepbr.‰!â;==Uݙ홽y;t꽪z4Nqn3;>z0#j_~,˃B٬ d[ǝ_gB A{.gW9bm_x<>88!to9̨*[fLQg`~>^Q GLpRD;KRE5s9f&m#Dyd'|]> 77CT/~ .Uȳs}}T"TaڢL{q7Rd;u/Gy'jZSvߋɑq ̎&4^-Y}Y51^UZ~$(LI"O2薃Zn" )!l ewGSD&2è{\6,IM,]Cyf^\5%H$UdFtb۳ZD+I"TlEV?)Rhl` Y } [5>#SR=7[ zCv#XryVזa2i5kpM([A?d ؗѱg')qMA~הu[iMeٚhϡ X)j^,jʢ(65>nQbs1D5D=D9s0^xmbfn&**"1٫oz"Ѩ]V"~(R͚gY"+ٚ3jK#) .0""ΰ\_|q&r&qQg*EҙZ}l W'0j:amh[&:-ڪt]M,.ƝLv1bB$7 k }`pb_\1$[dT*$[{-UCλ)ykX%%%si0_2؍1%{8W 8'4}hJ`1A^~^@RQ]K0_ &s'0ߧ6tͧ+*R R/.j]K6FlkWqj%{E8 >0Q%I$tRr\s g+&|KD?m:*$I.h:{;Em(dWkrj'ؽ{ԅĸS $sw[6.*\Tbi4J%y5pa.)r'YCj:5~ 80gNp|A7ލUg\lo(%I\ ѩu"DGVNADsbw:cj]_APDr.mȽ{ $ i BDy? XTmm\otD<^ũ r"BG*s 1Ɣ_p\1^|S`N]9p y߀דRQi ZW|>[^vx.$Դ tH`WcRL0|DddVCkR!9 gIc.]UUT&_F5TqI"뇂GY:P~DR|ulYW7&I,AC'Pv/Jshx;8NJ=ƈ$4SPZԙx.mtD$CEVN0bkDc$Yt6aK+8FD1&k7M(_p}dPC A$g&\^m-;Gc.c.{V׮N^TP+]${5 ։]8O? K81NLV7l傄װṆ 1$[%1ן?8>0Q~eZ *п0lƩyiba~\G5w X1aO H`pAХdlK~8\XS{%0v~߷bHw/yH 1Yo^KHJhcYJ+p@ms^2/eE{ʌZ. ΁_!&I' Pm9CO!6Qrron ƠWDu~pɚ'/j9QW%01xDסU*8#bYކ ;G?1+5@%1o M77|m9N8p[v-xZo>ZV_==FM2޳mm-{`w{o.bC-˜3yvf ൧ qGY۟RH2~Pj擟8{ibBՖ\8f, ~}=gZ~إ=}or;S`Lux}U. p[־܋rݴ|כߦ7M`>?||ѥam|\%0)Sb~xBdHϻpZi!W7JJsR?lߠyݗ\fK_DMVҁycMK*I5iͫ>nvg:}æ߲D!""}rԬ1~mV~ɝDDܔG_[{ՙg7B>h\@Kdkڈ\XmEa#w ~iCѳ-w9NX'Yey2*|ĝ͈^/g§fN/- Z^&rSs3}{ow[o냵_TgQP:-Տo/uAZxbF1jRoW.O͌q]\Tŝy{WL9kn6ۘ*l~VSP1gOO.s??GD_Zz,Yo㹖 |ҭO5C3kݡVC8Wl9k{_ '[݇󏋈+^}o۟i5<\""ڳ٬_G [Zrܙ4ѳXֿX8eq^-s{Jel{M|b:'8[eIWlc{ U5ҐSO>e?~Sm;Gi_lT`)gƑ!aJVL 5V;93 '9%2mms g? y7Isv75 7~@/UѮu'损7h {|פ޽CDk!m5nwHEN"E-2NJ3H)vͅZWS7/_ )5|mmO=1nŝ׾QP. F{c7O\Mgrؑ?۲֜Lxb2n繽L ?8[?ׯʣ5<7:K!{ 6W8_̣|3A߼9{b9%rKR7|-H!#V3""n9&-]'gco0~(cql=cѿ{{6ov!| 3>j89%9GDV;i_!as?6\Yoݗr\9uC&Y( =_y|zxs٪s&_LҪ?9էW~}֩OXo|t] IЕl}p[Z̰_N|S1#J 1' Q4`>3V(ױd R%+/dMZbO PP.V v 珋7|eCBeS8foHH_s*i#$~[jbFbƏ65K1jFRkoRMmEo8~)KBow9&ȱ, n QSz sٖY~i)H\kYrvPM*N;^LDH.-*q+$F״qF<Ĵqѵ^8RQ龵?1aУm$*z⤞>,3,zvVy8"".\2pF"ebb.mNлߦ|u sΆ9:xyf םv?Wrnt/j,hq'k0[\~ӗ0HiC%>g'*َ;W ,h)O_Q=޿/h;߿h6F Ws֗E˩]Ju{םiJniڏ.vİPWUsO$;mGPr?oZu,ЪI'>ov.hҫTeN^_X4X}UƮ*>q/'K{sΝ%96=j]&m蓽DDoK37 d7- %//fuicfL+X66=//a[i""C-Y톀s}lλ,_˩oXm1bNXγ`/Atun>kCVkηo4EpT*;yNT=cRD϶ D&<} ,Rstus[\/[Rz7_ݐU{2e{6eqoAJϞ_yfLcVkjW{/} WϿLz΅prDĴ-~,W[p\7-_aA(_(_p@'X&0^y?1Lm~k}{-f:b'&nxyKAqQbF: jDDZ՝ڸ:d"ME'یs}דgcQ`ͻ$[Nfݻ$>w.zR.""/o¹p"rf2A dlxpmU|`O'*< 𤡣(NMkcmD }.cz k%ʗ(_pq`j2>n=AJpLD13խy6"U(BP$ PL6>Lcm_Z1T;+dMsf-wQܟ^b5[}4as쩓"}Uݿy_hN_:')$K+(Kչ_HZ{un^:JHrѢWz3+qAAjH {G;ά _㣁ԧTw} DEʎZWqhgy*nU|L?RֿWr;5|k:qهR[䈉*9;Lmc݆pE!"^QTT+[=9GSJWծNBڃkLLD#_{+Qת$.Yvɲr:j2qBXƮ\U9y""+3vsQ׾,2Es'|ߚR {G3#"ܦ 7oVABkGgV]cQQQZiZQJAQoVl6EM碆"iIW:*fڴ 0=}k…/{Qyʼn+Dpxy4`eG1d^-:aXbeX1`ˆ\̤k IDATe?1,_8? H`^',}Qu:䩷O0^vuO,]~.83y/?9vS&i4B{ǍNwSQ׈YVAתXN E .6玪*(Q׻ ףD}ʒ:R6D17sK+צYDqqޒf_$ˌ= 6tⅳFFKW})NݵdBhцWWO&I Sny7ٶ|Ŵ,?(GtVf9Z_4OQpY7[ wcݺ`0/e;5;rDD,`GTnXgSQrwC%v""MoZKBG}/>ޣ}˲1ɡ: iumg4>>>t&I a}Ä#9eUyYUGďoܑZ;lцNRN|[\`ɻ8ǩ*@9u4?L!i%C}L-UDD;fC#'I>>x?=Qѡ~k@}+Nuj GBXqJy[3EpqsIY=bbu(?S 0޷1^ΒN֏ sJÀ0 ʴQUjS׭ZtwJE۟U}IH+2݄<1 :_A]UوyWms)v` Sً m/BB.?44SW`W_4)zD^+5zQSerJ^~zcᐙJYVk͕X [v|Euv"⦌/^3͘~~/.0Ƙb:s`ᚖp))65Ona,cٖ2i#W=[NSjRPkT23W ˊ*\yG7Y7'2r牟 /i%ռ+gߑ2t/><5g}SM5&Y#QU[}RĢ>~xX2W]6jU~ a*ZyhM|djaegѳsԔфE7,GM2Mh\6Uu:u;MrZN2"1i6j?춙 vrǧ|F,s7bɢVYnpriR :Wcj+%kozOi"۸%pjנ){6FeUF=fzWu桌.~trW "٥>:)j"CmJxM'øh >a탔7G`t9\jaM۽aJw QG $3FUV2$;FgjcZs s>&H M4y)ִcaWx=.@L4ԡr┢G O-BHVPT(OF!Wڢ34%֠;[\*;^YW0`q#>ɣ.ӣ**ʽ^";_Ltʨ/wLw.m?IC#jSV11QjoE}|tY؉WxR/o{nڑ=q$ ƢZwjEkw l6YS\pR$"BV"^uQb: 0_/qGf+_w E{NA q^wz`k\Qȵ}u*&0f\ʢArb/ڭn g!RgCڪ뜇F4x< }`]7 Ls/|W!p AaAWGMS_@_T'&1OepC1?QAuI\eu'xԡcij&7=ғszdopt ׅD Z//Uי.3M`@4+t~7ᣲ>qVCEեŵ߷_O/{ԴB$zE,9}t^]Ծ{eQ]ѫ_P$$肓zV*ӏeY#h|ŒLEev"{Յ&һGPy<5Uxod^WT?>w̱S7$ė(}CUui2*DD>7ȨH-+[s͜H4$ L0ʕ'O7'r"1}RbXCs;,e<Cgׯ|3ѯ%aNkz=owFD![??kd j4*j/ȂAAѨWX""o;v++3hDGѶW^H'O,F*3}y?O[/u_·li/^x2N=^:1K`jZ/} "&,zȃ&&zhdͥjөmT=>N-#2Z-?˲2=uKyc8rf.ZC\cfxMJ&uSIw^zFDTZ19F/*JXtf*7NXo/>e% ? BDM]3ɤ vMe޿,DDLΚö+aQdUHs{L.;Κ"(wglCZ7qq5;?\wEDd/ٷfOrJ &g|CNܔoOSlltjƎOs}xL>jGQc)7?[jW[̵C|%"N\N)+d3cTT/>Y""n!UD䉓b(sʏ9b9#[)k;9)(^6k>0^ylɹf ?ltآ@4HꟘ+2*^Ǵ>>Z38*YWgIq -5Ye0Eƭxռ:'#uhrwM~@n9.5\F֚b^$:%So姦UM׳+/^9L! 5]XBdG4$'৥o[#m=;wɶ:S7$".,Rv?V_6o+.0eoYCv"b>8#vɌGk5RYl.f$/{Σ=P̧d [[+8+jW#guiS7[Uw2m4W)D*oNptr`LW̅6̜wˬ[5w==/̷?#ʉTK'v5 QuuVe1ٹ=so@XxQ\:7TXT>A*Wɪt8gK[O8ҘvEh`dAu݊ȗ~׫W =c 凾ۛր I YUjd^>O<@{bq:o}㡨JWNmE.ȭ m:F'dTv rY B[ OX =ĵu5{AVI5Ox)r6O2 :k䨭!$G"" `ل|61߸Q^#9MADD\Q8 k)ٚ-NwtJ`,5 M,%5<`>1;i= :9[Yg:pЭƅ'sC55n $ T{|s[ "bOB`&}"1qKSqv'z2OEX U+}~y_iRi.W/EADxX̾]C/{3zg>u?p_4\czڞ]]|.qNuL,ggm>^U}yo xjNՊb;}݂> &gTUyTjn7;9>LU{:=e k5DU%5Gڀ #TXfygRBƔw:tyLwXOcmEԾ=urm3Y @7cٚ .j8 \P)VtucbfQM:*_DLدwTSSaDhMev"{ ŠVj_ZVXnku%Gu~5U=撬g j7$W5ޖC2SC- =B$S~3ei|cz'Dk\UEY'sJZLt1ɑ4tf^̨oZ_nV⭲U-3)/o{ f̯=d [θMvEw!F\@wiH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`iH`W kf$0S $07^EB#"E  uSH aqAef:Eʦt✈8#.:j7;uA(_Is6T2wErW'◔.\*&wS${{6 <]\"lx'#ΥF2碽}(qiHWq"థ&0YeYfr]c{8g$Kmm6ŕ`"R sm)5"ɲ|զ$q8FD6s /w2$"PWH!-\\C+s~~2T2" a(_pEWmxwW: JK p8P _ri8T)eL_qL!#|._uƄ\PMtRe qΨŘTG?(AWn\8KI1b5+l0۽٦:]]L1~ɂl۠dSNew7kv dYv-, ]GWLZdcS\֩ui,) 3G|@Wh,_5#+ZϹw2w2bP0j/c 7ι{]KFq RD5$б6^D8f(?b(?|i^L,BFjoe-EEN8b0@' *. :cL!#[e*[dlc04(?*KOVC9S"0RբH`pa50&qQg*EқX|z^uEt'5YLq2dqW0|R\ 3q{ˆI\8 *dpj0$.4lt]U\@\a̸})2^ u"$01F8Շ0b"D$DD"殆dpiiH"j7Ё %٫E{#ÕN/2SޯGT4s8K#) 11s>M)jW{$a} $w J_oLݻp\81KS)\\5IDATdFgc/Yr"^?ñaΨnH`pr)DsƸBLh\ 3By}zSg5Q뙏!us"Έ#98S#YE7#ƌ:$0pĈl-+$z4!xȏ kIENDB`dtkdeclarative-5.7.12/docs/images/TextFieldDisabled.png000066400000000000000000000026071476226662700230460ustar00rootroot00000000000000PNG  IHDR<#[ pHYs+9IDATx]lSUmee-%96>B5 GC&`4!SB,cl1>¦cnl }^\alz۰n_r^='9ӵ= """""""""""""""""f83lD&æ3Da((ԉyP2ؐ2QJt D4Pl JEǯF+'$Fer+!FB4$% =hHx,3 4%% DBBBeU(|ٷЮ>SW@u\ӽA|h%X쪮r\JY&?i M?ULvѬʉګҋ7gZnY8h;|'Kza݁?>h:ީuc[ױZz|=ZNVuCXZtEVaHJ՚lhNRHt\s2pCyc[HP^pPSzleaZerG OuB^@&g:l_T/]U,W. u}yTy˗iMzh^0mQ5VqjF)} Ͷs)j1Ի%mZohC?6)j՚Z8 M MqwMM;;{ ȽXk 8H˲EZw׎؝At9lqRp;*9,qKKCp ڎ6ܗ}Yl]_1GD& z[,Pu≫ P&ɲBFQc W:|CtaQuߕӫtGǒƥa,>jvH#x37!E#%MLH_n"Y=֝Q~%9 sN\;֬Ꭼhϡ@Apqy /ZM3=.Kړ"}x4JcDqZ;X=ͤ%V0)|f`{ٱHb?j[+g_@ТbලP@ɗ眿וZ*~?ϒUmBjۻm4 $6EzsM9yoԪSMDn2' D'ۼDq0 Dq ȴ>  GI ?["l4 E(ŎDHр_@@nFަDH쌐Mg2JQ:<*S`#"""""""""""""""""Jd+<IENDB`dtkdeclarative-5.7.12/docs/images/TextFieldFocus.png000066400000000000000000000057611476226662700224220ustar00rootroot00000000000000PNG  IHDR<#[ pHYs+ IDATx{T}91sgs݅L7˲vCd$U(c"FIu))ZqEuTK*lȀ˸ HX²<0}?YΚ%̽wH緿{9{~`YeYeYeYָ p-AD DNx׳Ad@AO5 FP h5e3yp A  k(vW TT<$k}LN3F_`n.8 R :RĐ@ >D!$bFС8 N.OIpbp\O@an D@@ABXJJArw! !+fW҈fscn$64' tPP7aDdiF;}Q (e.<(n1neU 8Wzᴄ"PCodIhْ"@@ B?mc>FtBY X3=&`B:@=l>,4&s!(Aރ%8+ K,:Lqpb}Vy4Ǝ|?76 +?:p 7 `7;apLlOvbdyA%A]phȁ?MvmY\1@ln UAUN[K{/zaYBUě'wk^{M^iC[ՙBg?/ xݪ\ܲjΎ_q,;u/uwnz|鏎{X9+s[9yyF[yyﺿaCŻ;+4wd-eN}%˥LmWKX ~͜Ov|6srAoug}~knܶ=S<-;'L[ kĠM_~f !ϴ嫿 qΗf}EϾ]S1ouCZkt//}kٻ̅z2zy/n.W>c1^xy{cOumFqM8m9lnV^ ;ϕԌ$S.]ܻf#濴NsiW_(~vήMpk/g=j?u;ʼn۞*۞zom/TU֍zc7k^b ĀW>D;  @OG8ͭ;Ĥ쌟Lhyq߄=KlieA~L,5?ub{,y0;PϖGF-&Z>i@×n^=cVk4 eX4Ǻq,uxX4aoZƳrφu_-~|~>u[W֋rZMAp[3럛]7sy3鑂eYP[,4an\_Σ"0id7Ł5V҅'7XBvGg۾?ŋׅy\"ߍJ|(L&ix;Ta֍nbt.&jHTBSG5ݶA8w]f~I̭Ws']ήܴAG:C^3yuoSZ{rScQe3%1ka@Q8$Hw 8#>^1m<*=m񹞏9sn#u]ao٤>8玅FNN~]kY t}UIJc"hHAS|$I5ҍaAe]ӧPΰ0(@2D+n2bm?7e9%`ͅ1ASMUt@Ke1EڧAs@t6M7>Yr,bY j-8 !ɂj M5# FWaYck^5!>$ i#B O5ʍ,Ng70(@6:bBʎe4˥5sPnY o3t(^B(!.|T̳ߐǼB*T(^ExD:59z5p4P"#`kIHf ~<`/Mgaht;kؔ @΁`1m-x޾ qb,hD780GKJ(^%-@ԕx¨@i -4~e  AY d,25D`vqCUh:{S>%bAoA~\ZOIpbp}{}}ko 9Ua1}B ZAbiY]\TIL}eYOU!bW uֲD_L2IL}*Ѳ>bB]5y3aC*;tQ΂2KV ->bYBߒ t;f2eYeYeYeYsRtwIENDB`dtkdeclarative-5.7.12/docs/images/TextFieldNormal.png000066400000000000000000000032641476226662700225670ustar00rootroot00000000000000PNG  IHDR<#[ pHYs+fIDATx}le]߶v7!;1h"T"j $&:@B #!P(bF0 @#m¶uG;^\z~s%ϯO{ """""""""""""""""zq)4)6BdAj "XCf2A5"3қևv" %HWp D6j"u9~sT4PC! aAEuYMs,lz!j>+&!けs&-){pKHzszm`JL?6%؝. oeHk0 qMotD6}SГ}IDFOEE?,ƙU:uX+!WE5[Z@z^Iλ8c÷n͗Cp&̺)1'v >cǜ[l5u`USG,gU.>S̸,[[VSTrEq.],!V漹?bfi$jve.i &v7 NǷԕ2P{m*'1zk}fpp#i4v'znQ " $3.׷2J^wxa ,ٜ&Zr]C9' 9|6 p:>jPW"z~ { /*źT$W$`=r'˜)'Άn1O"5g#mڰNq:\44{/8+\vl,ήc9tjZGU];+ U2vyB˻.J3JGmi薿.؝)Td,\$# Ez/!`&'+&r7Η ik?(lޱ+8zߒƄxfc;L"1ZKpCЙqBZ?YKU ( w¼aeM᡹^?ڃ\op0ɵMF/H/,V?ִK[Z"ا) RO*C>mn><ŸMOO$3ҟf0%jD=@BǤ' PWw' T>Һ E +Ņ&eVi:^P ddˏ=f/@Ɓ݇2!V]燍._ڀt۱Mޒ(E$ƒO`؋s} βkquj;F/.u=-`i(WYD1`5P bψd*4{G'DUJQHJAt{E]9M벚ٱ벚[fz$ꌉ)Uk .NCJ5BlעOBk%hd 6""""""""""""""""""g ZMRIENDB`dtkdeclarative-5.7.12/docs/images/ThemeMenuExample.png000066400000000000000000000171741476226662700227360ustar00rootroot00000000000000PNG  IHDR pHYs+.IDATxw\Gǟݽ;"T@P$h4b ŖTTT%[H,}MbDh,H#]^uowX'|fvfv~ee&mJDɭd՘hx*,lȭqGMrAT 2Ec OvyD7;Pvv+.. Ft`zSāR 04w `X$IEGE0Ԑ$IĨ}خW=̀L&)&M4MS_S ۿ Y&#X[Db&,6 8CԄ0F&1*$!a&(V.}X0uQ cK10`B+(z/Mn! ۏaXZC" #Q[˜*06L S o- f$0dz\0tya|A$InfgpqfE!XPS#[@+3P0e i&ƨЂ!\x>U-a } ~ D\Y!I{ X V@Wk̜2F8 i_-xmhF1lmj3nB:aK$ڊpy0FI7 q9/<"jZhEUȨjĦ^$Fj,F>DCQp1rf^OuYFFFfffw~ UU2]q [/p+ӧO{qIuY7xԪ\6L{YNqϗYH:R5ZLVY)xzoqA}^-QDRfffΜ9.d}Hz 0!ڪ8w,Kkqg`uP=IMتW ݩjp˗/><**\ -f2jH^]xKT)EQt33ƌ 8;wnݺoŊQnh̾iJw۶1xDddd䨱xcŷ%ChܩL@ٳ#7jѣ/?+ p+o1@ȯdω{`}˼_DMI]_r2MzxpmZZvzuTH`9,T?eNx0[aj5&))iܹ6mmeN p(E?nvIՓŧL .ft MݬAYmV쥺/O8?iJ?K?@0![:C>[|3fyr|=u_M?2,rKqnQ  bˢ};lV,[zrrrڶm۵k 6XXX@vvرcU*Ֆ-[|||*t,j;uN 羿;YG46 t%wZ~vྱC_[ӺEZ~H_trŊۭJ\? WcNa '*j_{XęZ-ϭYdٯx]_LQ#x~[j~kkիW4=y9s愄7JAQɎqj.ܗj:Hdv.œZP߻p譐C3!^,QlSNJΖ;ubZ]qi,ۊH}oˊÓiW=b۶maaa;v찲9~x>}tʅըA;ΖOPtpvRKTk MNJ52Rjkuty)/J v7jn45WŰݹs!C1 ްa\.d dq~~=}޲~%`ٴM9K:YRZ+=|ȟg/i[-WyʼlpJpqq4iRN-[888Hogi WHC( lEzX\Z<~I*7`>.&%^I֗ݮ{~ 9wLՕѣΝ+G3 ?3Sf-J#^ѽWNc6&F0^p8:2~\_QHS_!ty1{c>BQ1zaA-^%U.~8/. ,ql΁U6J-|am>9o;P3GyjmO*h>߇uX%>Aj+=o[{λ$>;E;^9yʺ؉TwKn'dOF}N|K8Lc*)Rѽ} v kcԲ)LwF}s:Yw9.kvN~ GFk=C+?)~ 9rf#.?޵I}#b6&/-?W~2tzdhIævN|b?_Qk?l}0z^^t?ԷoO Xxܘ~zZt;W&,x׈k;:ecUzj sr=|lQ_#ɄL"7z'o@_gyCmUiu񥩺[MoanrnЕtOƁ럆lL\ 8Em+tp͟]赻`PK2逆/iȺ_ szn?gX8_Պ9 "I e{O{GEͳ ,[ ~ }gɩ)-˓-+ zxann\mG{@oz8b^e+):ZDMJ'W;‹|nR~O%{yZs=3.ɱn|q&xW;JB8|M?>]t89KEZ:+r#'lYfh}vұOB,agS44w)[$ +v>o:z ߙnِy.v8&U0pĥ#@d7B.U2Nfb 1 m;c{FjѠ߈471Ӻ$Q5jFz5lb?V^(q Y(G}[LF$Rɗ8^υDS:*;5-<ܝ,Jz̢4AN4L:'--b-rouPlf$DM^ $$P@BAH ! $$P@BAH ! $$P@BAH ! $$P@BAH ! $$P@BAH Ϟ<($i27G;g:N^9)nRsta&F./y/:kޥ߼Wˏ UC'ɽ}/}uE?n}JrԽ-So ۹=:&*MH(pjj7 7nN__n'pH)]%/xS@rֱ[RK_-VUd(?5z d^s &̵s̸ԃgEF=t7?'p#M6cPA!Q+O<-~©kh?ksN֏st  LN90'}5{Pb6^ˣ>6AN K=.O_@ nJTxg.~m{T)O޾gNhǀQ__ͣ o0k@ﮊmz~mGI$MeԴDd0!fݹT^1ݖ'T퇳}6;8^5_.ry/(Ϸ []|@E6^fK.`x'O`Ϥw'Č9dIA#[fT^0ᷓ;|Z̻ԑƭP% ('z Xē!c->퀩Qm~(z_u3ڸp>S[Hnq=`4oviK\ޠȏ>H`}G\1 ٽsݓ'2[H13b@Fx}Uƽ# pb ~`IW;v)FzV3uqP$?ֽ{nI9DizLnn 0sC\ˠFpyps:hZ[9PB_^?q,huxE|Z Wuv^t~f^!yj| sw֬;6}=罓[tOg wH;!^^f;ut>vGZ8 ^IJiV]whtz'}4cgX8ֵ#;;&Us][VN!%DT^cݴLI]M94XfcWP8uP&i_}Q@BsWU^&i*r& nYB7}oIc\np&P˻?U?~4uh'l1`UӺ5 ^꜔&QJU=B*'RUа޾JIu87Izpo_8Obg0tBԱf'кi ~Æ{O:}-FeȖ7"1KO^\?v4KC#7^z*M g/U#ĀK٩`ٛF5vWϫՐ-͙$䖡PjAB[ ;e]<5XjEp#>OMn0mBX ށVJ 'DKh.'BF Np6IdM&lEңgHJhը I 76G{zx6l# Sc999,:D:VVV5HE#"ʛKTj.a&ab$&U}?o.qыV5It#9"d-)SPi2&L`(yˬ/ܒՐIENDB`dtkdeclarative-5.7.12/docs/images/TicksSllider_Highlight.png000066400000000000000000000121031476226662700241010ustar00rootroot00000000000000PNG  IHDRP\m: pHYs+IDATx{G}_ݭ6eb,,21 JP*P`JAA.;@!1H(0HH[w叞t'Iw2w5^LݿH$D"H$D"H$ v; RB@ ]WHm\A+1g<kZm[RøJ2UtKCd.B䴵`\}kiRfG9(Ȣ0$U-2<*Հnc鈂,%b_w V qz(YT&%Y >EV@* <ʱQP2nqE5K;w;NTdDA C%A~JGB.F9(ȒA P"KAdə&@Ou)D" VaV }c&G.BZpLWlfQ?\C{^DwB7lCo=b" 2gTfx5&$M`?]u5|w |9ϛDINGdN96nFڍɛ$+ǰ;w:︗sybW h)UQCbOj ֟M0k;$s" rZli`{G!j]YlC?^Mq )@MzJ(jquplGINML'!MKR3n^T X"=*|W <9J0Fq+^mV4ƋbMX(ȬLʱcvwB S+4~s{J'/4dG: T'5œ峏ݰEomIq#.J2;Tlvcn8%.81vn]֗dˌ!%2R'4bx֕C}I`w|Fxo֝y%く:1P6DWc)IR,TV!CG"TRoBMIWc6<y3'|0r\<{@cCZAj,5# #E2x3a8 /U-ޑi ukB G͐}gv_.hRU~X p3aU9q[_ UG9 `9uU u+=~zAo\_ ׼n; ''UcH0G;g,Gs-sj*B^8m_ 8ϫ>wKH xyiXUMŽ]c(}ɑT-jTOK~rl^\x-7¥`OK 7JxL 0k|o<6o >8H8'Fzz_T>`/3܇YYA %7 Cs4ia9V26{{8k} O@O}|o mpݛ!'}~E ?=]~z0>+DHjm`|#?2B0j~YjH޻PphB4W[/Le@d)98U)F `KJבay9앰6؝Cwa;Lnsgp|m:G RB!6T]t<RM<&Q8 C j G<^7UiBC;m9L?@(rydC@ 7_ WCq:Ragǀ$1e&X΁_"#)\P~E" rJd8&.k*-Mw.·֠~]#Aց0Eؔ@!:RN/Db,Hz1 WdC9BO; I/j1Ycpmρ2G<Qe?o}^8B+G&= Fzpd|!dƴjد̇\PAMYw?!Lzw|)|x>.` daHT &<}mf(;q baD4jyE ` ?_t಍C agCQc,1gOXN'{5? h g53|D+g92(Ac3_9$ċ?v<+^_QxX`QN|ZX س^xðg.9OJB^#fXB= >!DeK(pkg]^= Π?x6fڡ-h69LzP#x;pxYc2.x}Ps§_<kwm4pɳKaz瘕GH/8w9el,!s~xDK櫵1ܡ,2| \t}|# ,CԪ37=<z'͋`YO/V:H EPKd&Ph㵃I×_~^ ru}O:gs~X!1(eCҝ5G$Ah?8{دBKD +N-|1S:yTB9'Q<@A5o;QYYz&UkV~{Cq7$j&Z")%pnr뵋}|j,J\l-=QSphtQpF(U)Wl>t`Wccz:>i#6:44+{T)Rz9Ia}Hd{Qc~Yh᪥P'%zEZ mZx 7QUI_iBxPu(9J9\n(]5Bkt*#䠕 &e CXldW)¸Ó{(L+jed& ˎEiQQs^Ǘ;vg|tڛu b4j,oZ|!Z%W5Gzr< 2QY栣 J(Qu:,[^e&PȄ0Pe n'cC;FD;0>Y p 06g$ 2 ;WʱV'aC!$8ZE@ Qy EͅVYzA:߹1 2QYذ e~8!MrRgHV:\*#@C b'FKkb`UpĜF1E9_0xڤt!MlDdn4|%!( &PXBBG=cA'~R􄥤 Tic30`4K\Aۥ7Q>z ǟo(ȩc:k#FP8= 8$b0^1f.x x58 z-1N;7w<>rcN̓Wuԓ:a"X1 R_XV<ȭWM-S:8y܉@ڨyG=(@*#>,.^/ux5¿rc;] 5$+J IENDB`dtkdeclarative-5.7.12/docs/images/TipsSliderDefault.png000066400000000000000000000032111476226662700231050ustar00rootroot00000000000000PNG  IHDR<#[ pHYs+;IDATxϋiݳ fBmYDie.F9]cgO5w ؈Ă17kǁ\! :Nd^V]iNoӿB17c8 "?vdN!\|/Dڈ=1,C"17hGj垁aeH,^/~mR(X$fhnEG@^@N=wb=on h} [.!d(aˏ^Ęlѩ;Ȉ}'^V%"'^}|Ll1C{ Yc&LoKV-ߏ0Ham ܻks+q:ZDCvn=3G#c÷oow?8$ 6\?Z14C0AsW@B^A[ g?G?(AwB~˾{g +iZ5җwx%s^jbB˥syȵ(JD X f`[r@ C!FTQڑ(HԀj@52dY$f0[ll*&0W8.ϝ6dxq+|TC/gc\<@@'uYf[Oȱ0_{ɟ\a$4lb ̷۹1ZvRH:&~['ϯɫq8oی:zg#7{:BA:Ey1{E >@+:GMdD"P%B9jR 54@{ -v cs ~ZVWFF8G^9R8Bq '8,;A@=#yl(=AXBP XvRQ!wN&gQ;v8K@P-Ӕ-X[fP;8+' ӥSj$`╼Nh= &`I#ñ-Po i42 " K~Ϻ@ 7[H,}P EE(\?raI!D Y`5 E BCcqCG\I?m)EBBAeqCgM {wR(GTF|'S;94{z:tH>NW"CUC-hl~Sst4sS 'js`"qno!#NZp9Xo)ņS3p +5UӍy c1c1c1c1c1{_۪i*=+gIENDB`dtkdeclarative-5.7.12/docs/images/ToolButtonFloatingPanel.png000066400000000000000000000102731476226662700243010ustar00rootroot00000000000000PNG  IHDRMU pHYs+mIDATx[L\vv]`ŸrڊRjEjS6ibhlZCbmlIM`_hmTVW5fg8β;R<2{9|w~3qij " " "ΐߊDP0  1&8C%$QT#>LLp 1x,-^,K4˲$I a8N$7p xAiqA88>h_8eYe0BA$0!G; gƂ]0qE) taȉB&x|-t|^7zK$y* !G\> (<.N'Mb`ݻ7JH1_# 2(Yoٲ%++l6fGZIP$jkk333OY[[$PTT (fTVVܹw<!C*dYV A ]ݻ[[[m6fkllpBee%EQV%@rNKCCCYx*!B´P^eYA"0Lf544l۶MR:vڼy_ڲeÇ#Y1K .]-sEW"^ x J *JCᰶd:v۷_lmm#y%+VY}}}}}}ɠ ܼySmѽЏIG8?*j۶mtĈ舘5a;Ҧ&3?Ӯ]VڵkKJJڻw3o߾xG:th<Y̿L8d%f&(۲e q.]Z|9a+Wr#ZQT*):-.\ӫW;Ν;O:w`` D544WN7DZFkP3e"m>|OOOm߿_zwƦXĉvuԩhfΜ `Ya3f /#U^ Գl.]l]]]%%%r[2Ѩ0lӦM;vczww7pOII1L$I\]ټ|rf3"%_xݺu1n}$Ie@p],OOOB|>_l,]۽{ a?Ƃ]]] ***D 40L2h4aTFܼy&IRxb? Ev VWWWWW߿bTTT, *p\d2UUU_~t$h4h`[999|t:b@4#ft?#i1B>j5<m3H8$3H8$3H8$32M_~]V%ns.\[ny<^xA>?njj*--/dYի<ذaNaիW̙T*ږ,Y( rJJJ |]P(BMW^Z,V`4:::^y6-F%l. 0mڴYfե=zjtẺ:xuXnȑ#z|oaۏ?/^ᅲ !Ǐ$IF֭[7n܀7tvv655n:{lqq1ݻ~m֭۶mX,4M766j?鞞+99y…8|ZZEQ׮]ZΝ{QRRRRRҬY222rrrMn͛fnz^HQdjllܰa^_dPt(7oV(}Ns:nddNU(2{fܖ  gsMٳ3338`7|ð'Oj42ֶ~zqollqd2555mڴIMx饗Xs?1v:;;].jMJJiHCCn_8N^rd̙###-VMKKap?r vm'O\f-Z/aYbA 6lP]]P(oV__ᨩqjj4ܻw񌌌Ç,[L Zm{{;`VVBz{{ᇏ>pd__M4MlٳgaV*eee,ٳgڵF(a._{ Ӄx qF&A ` ͘1@ǓgZy/Xlj=}`7o^^^^Dd<={M:UP\paѢEUXXH{w̙W_}eH+?#??p84 ZuΝ8n4>\QQrʦL®.%'JpqAP___CCC{{ƍ 8tPvv/,X777k4C?ӧOݐ]_3gO:ʕ+v;?ŋIIIsέkn3gz{{7mٳwl&'&&F݀Ryеkn߾xܹsGFF"Rv;AW$I ߂(= ѭ?BQ0̂ y;!8\!x8\T `s~A1z jQdžo;_aˇB$IRRS@x^i_|vǡ$><'Ga M@G͐`5o ^8g*`oiF |c1{r,܏_;T#L&=H ^vb_X r57!hG^?(Ą4Y݈}.h<򂆀bO!& OBUT:!t)'1bM-\L:#=jD(3oYB(,\)ARbL$//$DDP$#a! g3H8$3n6}Ӊ9IENDB`dtkdeclarative-5.7.12/docs/images/ToolButtonIconLabel.png000066400000000000000000000074461476226662700234160ustar00rootroot00000000000000PNG  IHDR6 pHYs+IDATx{lSWǿk;q@Cp i LC MڝJ3RT#Uv ueVՖ̶[u$*:,!DS *-ik>?8\ljG(=s9C@g pO8zu'va:IvzHq":LHRsTNKI${j&IR<u=[sA<OQQ(f)D$I41>)(mCT&9.u783<-Y('pavI^gE"Yg-B^o Vp8Df@ PZZJl))V_s" $M84XcZ(1Zc x< ,缫Ke]M]x$k1pQǺS,FM6ݻwƍpŒLbqRF(sL7+Vnԯ5j&cR ZQQqԩa(i9~MByyysss򰻻{ܧݹs'ȫ~_<]>-d<-0EB_2r808ǤH&߿?Ͷ;[ߗLjϽz~iSYGYH: qׯ%_A\޼OQF .Qb_ GW|ѫC>!pO8zu'u``>Kkdxoou=up8j*~&~}dIۇ>(J8^f}сo5b|K]u>HQ|𫯾Z~`Ff݁>4[7BM t/oPY.\*..6.+dɒ]v_Ė#٦(^i`oݱcG hhh(..m7GVQQ!I|l۶-eWVToz0}$܍@\ p2ngon:X{{{"Ŋ7nܐ$ロkz]f c#s4tP($^W^y&!𹶶֭[hc: Pԗ7{qS!.CqǢ^-, VVVvwwU |K.ɲ>wIxp8kT2 ̛7%I >(**jooFo'y\棤 Ql߃ J HݬX,fOn~,ˍK.ݽ{@Z闙Zx<矫nwSSF׮][UUs ~it99;vLUUrΞ=ǩb> htW$M"n-<"z%*~2=e_b?T8Ckl)u}`?$l޼dhhO/(..^|'l#+0eXMMMiiL)mll $%ɓ'@mm3g,EQUUUsϑ#G!=O8}ﯮnnnfeB̚׋rpKhgpm{8~-z%,(7`t5zq r9s2(c-Zz?ϟ马|].ŋe˖~'wuug3^/\_uuʕ/Ԭ\,۶mc<ҨKk&b[[[kkkUU nٲ@ggg__xJi~ \?ǩ™0~ǖX_kaL^_7cU8$́tqip8BJKKԆW͛9{ͨ6QBeiU r?uK<:0s~!ZB|x](hE1Ƿx^!){`v*H1eDDa ATN1Ab;@k!!6_|VVZZ(JgTՄ#%Čmӛ}F5<'koÈD4INvt@go(1(:$awx윮pj9G‹iq!QB"ĄvG]^~F Q[EcPu4D5HZYEm]MlK2ZB^Y_ᯞd%xUG\C\B U4(:Tݬ K$eS%-@ ^^<<"\^-_W((H Z僦[\ԫgTL(uWQ"5ӃXʠ `] =YɉUB@)( PSCBJ0fr^RI^T2B, v0ҙ &%Mal!Qi@b:C(Bbz pqtSF>`H%@$p'XMٕ3 G0C,R.[9|~ejOXg~a;f|L;Kl-ip5bJi2_~3JFM8R3ӯIzF.v(IENDB`dtkdeclarative-5.7.12/docs/images/ToolButtonNormal.png000066400000000000000000000063431476226662700230110ustar00rootroot00000000000000PNG  IHDR/q pHYs+ IDATxlSǿ&vHH[L*KCFW!I4͚?nUi?VjRibBPkڪed &BB$'`=?7 E=#s=hK\j Z%xHYE0]v9@98O5CZ\!-Bh4i"x#)Q99NEX$4-p@?E|+cSSShԦNի9 ևZPn89 "9?R}lJ Fh]`>FD`0h} '&&2Ĺ^P^;>(NQv ZBk:" êZAGb ,g[\+Τl3K'U"|opg2KT~` rpC.(yF <YG佳\eИafj~`jtEC)ϐg*kGE)AeF45'j, 6"PApsViXi(T-9+GX4d>j!#18МhF"$4-f[M "'}CdH Ly鲐^bBơ1もhEBUU;;;FFFTVV655޽ێkVjWWWwwƦGO|\%U% ͼ:=ؼv 8Xt)\~ 9x-UꚚ7nJ{^=[vnSL. p?/oބ~|/T(M;;;6<DEJ'=]j Ƣ*[RjA*_损^ʚhnLieebg*++\JIbg{']|9ڽp]=\x/%ippS===۷oDZ844੾{^xldgO}68YSUzrZM jބ8ٟSR`{7=z4T c{骩I)׻cǎ-Q/5Wϖ%Vi?O/ozodRԝ޺S̗}>_0ܻw/lV^wff߿:H~c+A(ɘwwBf4^?{XG() ov{k׮]p!|}͝>}:ק]F3SڶmzjqqqssÇ3g"ͩ(ŦJ'A7=Z^wq< ~]RN?`l65c.=+݋wb&lY0tZęED;S$!@ + 3($ӧ㯗V(ڵk׮]I8z̙륕򗪦_J8%K+YÛzm:nY~'tiܹsڵK΢c+2)gn.;7@VTTXg1u==vhxFMݹi:zj5^$nn2EdQJFl͢ ]mRFw[MFnGcCbEB#;_]~`*B^ٖV381zyAdn4$C8V~`t:dzUP;!#q?QNenKLHɜF?I2mNOșˍ&!y 0lkuF\TмƛY`SQnVnY[,6\L6:72@FQ8@h Fgb- _FhiӰ.AijkȬVZZ*˲#KKޓ "%ĸizxQ0'gfqȜF9=T aHOMmϧ(5ՆźG"*B2B 1/h-L̜h8~==ą<x$DH*0EyҷNTDTְ+^ߝl,*/6?A~XO7#n"&ӂ2Ue!"! " `NͷAUyÎ"nEp ppkydI(D pZ""@Ok!c})(A L:b P(`,< 44ƨ@P4Lo15^%.R@N6ScP*`E1=r @Ao1j0H Q8EHlJ́ZtPX} pp(y$42}Iu ؚI 1BF@% BB_ P$aQc 04! X5 ja2:# 4V_/+ȺopȄz$7?0Br IENDB`dtkdeclarative-5.7.12/docs/images/ToolTipExample.png000066400000000000000000000224021476226662700224270ustar00rootroot00000000000000PNG  IHDR< pHYs+ IDATx}y]E9w-ݝB K"$p,5|qq7:?qp?QtpY !$@}頻=۝ C>Nzޥު{C3fhnnNR)%Rk @DD3@ Xkf"05h53 iͬ5?M0+"Y׮"!c%" !V H0k "!f@Rnt443y !PXAkӯZk "A` :fA̬ ATȀIp5 m*uAaa.d2p„TP,( Ȩ_3JL` !Lui0c a\ h\j Rhb !H3hӣ%!Ѭ ](! # ŅA`'@$ (0 ]\įʬ)2Jr 0L(ACq˾ϱ,DsH8|k@Dڌf_,\٥DrgϾeB 3dmcb3Ujkcc 0;ь "[{# R(k B:&08;q[A-) f6g6kf0k.|u ? " _)~0@  &'9!L "v 9 Cp3kQZA+EBklZ !P5ff%w4Ȓ*("l6[( B6 H2flO(b (f"dw霈Kd"*KʧxШ$  `$d*Dɑ[99# ;Oj4!44iX !dk&-q XChRL&N- Wn>IDVpmXae}@M$r,3*0xإx&_(YDLhm=;&H@enaEA H֚J!Bfz( YRX!bfl(αY#vzegxhlv``@J!@&AI;Q "l%a$<6Rю'iw[Ps1J)AR ./%Č$Rf"6BA(v܇-IDH^H$]щ,i.F;5X T]]!DzR\.EqEeH,u;#;Ɂl'N A†xJi:AƄm-,b6։]/7L `rqibAdלdd.8Ǻ1j! :Thު2PMF6듲5КĘҘYgbm'AGx~UM k֚! 18k V N'kMKL0ͨYBZK$îMRg!(%~\P#3A`?Ԅ H@`VJ1ֆ."!5.`CK@fZu ٙ7Slwk6 --"\&; {`@Ji2 !&" [z+9[5% &0Bf VJn A`)%3ӎ8ڗ9X)dM`e"|,+߈xP76-FfQs\4/7\b m\+!PHlzm6B12k]G$<پϯꈂ-KAB0S $iL: $2tƄ Vddj80ɳm2 AͫVvЄ?CV^li;c2Ɵ//\Vx@jW %e)e|u+ZSgط{[ʍ MN%V®C.j@ h9C|g_b&b1_A6ޕUّKTzK#r &cSf6dL.ȁgw29N}_4s'w.RiҚ54^=S Rl7nmVa ڰO`V` *fYF8\l"T,H*4"̱He i|_2+0;|._pǍ+ӁVJk `$53# cY@XJmr"6ii($t_;AD@Ե{|X ֊Y \]5|ۖiOęs޿imnG9r M42?7˟@ 7.cAɯ" 4kf[OCaJGRك!gx\lCLp,y{wh>KL|sc+#F吿I K d*lZC\βfևk MJۢ'bb{Fݾ%Ĺ߿iapl&[% K)Y(eb)+) ZJ:q* [r~b!6&-ʴS`3̰u|K8ٝwߦWn5aE^I]ۥs R=y5C[Z[]` v9?qweyg`:^mLh\$nv"K <Z[л+/Mz/2-ƏK˞\ :ٺ)|f:ymJԽ{? ͚}/2) +a]skk=r:s7-P0+͔jܻ5տ'Rv**sbڞMEji. ]BJM;Kg;vb& *ly[~z 7K_KnD2|K=l/!u l53Ĥ]uG}q]̛1 A:?{Y&tz8Sد^WGV%<Q_ONiNڻ-0e&x;)`6?w]>i@s_>~ϼr^ '<.<[XJk@4JA@oP  . ʤu{vܹܧADw`[!ƟxSͨ˽p\\RJHj*RAHjUVzp{[Mn9ﲳ߿ׯ`"R '18Sbb;3^_W䛪qci9>x <.m '9ϸWr@8/=5;"WT1xtLZ-yv]OfN;"̚Ixuz֧=.c?5Qˡ'w ]<.٪Rk͢qްg#+0fW榟/ޒOO<<.kG.>yVTݚYFR+)uiHj%踜o;_j m{n~-DbpġO;h/zaFZInwx_%F\ 2#~/>_`Xɵ-ˍ_ǔǎu&5M %N?傯<K~r5ngյ?^W;} &/GGR]ᎅ,9=~я1GB̀>ߜL6tp]Q) 穻?l3U[8o|g&H(9ƪ(*AbqNA ɈDިݔ4RLyc|gOAԵ)yf kWl~fMHS9ZkdPm[rKP*%fּRR3AeꌣO5pqҲκͪg]Gͽ{|;--\75BADk=8}7_~՜u,ZQ13Z=ϯ~{}}?gӲJ)@ vqGNbyRSʮVG$*RIÇ9WR*Y 9͞bK$qp$4$hmOx ]t~sZxopCB`/뮍>si_i-}{YC|RC>}~Ům:Df얢pM{ֿk=]g}n۲-u۾Ԙ9o_Mf] aq[Gk@{{LoL-#Kp 4Cyً/t$¿/_rg?WMiͳN=“Zumܶ#M< Dh)JFeb$p=d+ hv 5*Ev)U_}+_|q?p]+sU䈅??<uчϺʙ]^H̥Wnv_n'/S4~cvn\ cգ?ꯜr!xPԔnO1` sMǣ7YLv Je Qdͬ5kҤ:{vtWu|Ynk>}'lx=bu7^^]D;T"Yt6Y #2ESҐR*݅22R)e2ꘕ2J* jc_]: qs.l]_]KSgOJg Ǟ4u#?}qFV;ju)L6BogLU_{b~Oʘ=F3P)#UkQ~kJI?LJ]wDJ)4-R]AeW4>۞ڜ–złdi7/(cNʉ@~zd<|*^9j R2tn46ªq5Xbz9'NJ*- Sǰ=;iJ'zB2;fF* YCPYhܑw9Թ7Ÿ#?.TЅ/,Z-=eY6Y(Y~߬9j&c;ԆE VL wmCYb 5'-˞{Ok*=clK'ɳEtwιi3N3~>3oFS G`;,ě Nm;AD};<} :_>*_dxМ3Ϝ7c޼e˖48☃ /d&s_}W~}^<9`'ܾ8Yg9Smon>j4yR\ πM^yqmoo~-=ͻ_-"0s?kҜ_vǝ\Gg~}ov{v#ږ;_4IWvo\1I hKe} y}Ow:}>k6̞"tyR~MΏ_U!s_&7.'dg~>wws('Nc@Tq߆O7hh;^[`m?Hg6lh[-_ڒ;^{nԺWK쮇^4e76['f/[)UoF-{z.yKAw[[{7l޴~}}] m/{՚~nղеi㺶nіM׬ܫJ.#O-2T_goc|e޿>`Bܛ3DD3gΌ-Q2'ޓ^ {.4C0d xO$f2Q- +Pʼ(7&9QѨoE\Uw\mVb4[Lh|B$f$ (V8,i-^1u^:t3a~hJ$%cqߒxH4d@mp1e]wPIndXmv+tws5ΎaQ9ou'*-׏UiIm2MGkA.K3f{tm_tR`#HL%Rw.ŒO:&Q,H&>k\z"*\٠-'*4GQ}c֕B\gҩ$Q9 k rgڲ٬pB>s9Z~Z']k40*f n*Z,ʆR.l NфUC/TW{D0ֲ!=npKP!A df!DHew+qǥja +Քs1*`(>QJ>83֤5=T@˥v)VxFbDZ2TMٴ S;djAB)+hT:ϡQbMy(\<]V~׾LŜQNR#*YPM\)V=Ĉc%Wu(Qv/2wiTP?*w$\yND%UAODA*F`TӞD * TyְHPFA-ʘM4(U+(1JR~!!AԔc{Urj{ Pf3Un+Qƒ4a|PR TZv\rRt:|6 ̜f HzAHH\SjyN%-b1}D}c\Ѥ<1̼ @l# 9^&H7'a:6> ՕB)Y(4֧Q"V<1V## 95"VF,?LU```WJdL&b匯HRA)*x\-'q LG88-z7ad0i fSP:Fb0aJ)(O!=hc-3q|O 9*`8ckT2;φр@5k;v e5iLEـ*(]ǰmwP ӏ/lhhW(}(HHмdo 58)O6BeQbӻ( BkkkEl00lll2룄I PMSp_EDq(70 wqRT|q㰨7Us&O`0Vu.W>C)e{ShxΠ*$HX;11:Nܬ3LX1jx81DZ` F'!gG:qQK$:/LjZrG*F>nGh-q8.PG[*"%a{V09)l b$¼0яNMNf,{DN`P#( :y1L]uG`p&XcGaP)7 1D!y1L[dbc|( #6 0'BJͥXK8J9Aŋ݅]`[jP&TLv1`i{nR/.L3C-_ߞJwxW$oB+IDATUx ѦD`(ڒ[C;рwYhX:d[zbQOU`bwA뱳S6̱]tT 11dbb-xIIIOxx$'< 6B,ZhoY= !7\~puW4 oN}W_mp0GsnxuD\p&MR&AtJc;k{!F )30H%h)kOǀ1D̘ąEc' H3$$'< nY6 gfgW>ﻻGYf^}}DX,61LĈ=NR555=3o޼5@H mǂej;+++/m{""PmoiO"VHcDD!6!d}y(= :߈co;`oZ{3mHfߔfb?$o>1ތfvۼ {.&E)g$,Rn 1swKI߳Trys%u䜘_QG;TH_}1ߓlƙelI{^CP3MuvNENrL{ح=x%H>ѩ30('bud|Upի^?,sV;BX5ٺ f =ЅM,=tR=FoLmNOߌU8Tk~arzRkM76#9I\U0p~bH=?][5m3$sA\UOӚBg_G@'ũNSsB'_]p~&ېx7z'93XO>[2l3%#sHĐ{+1u%X^.nI/ֳ]>P2g~}ׅs|sIaߊbXwޔ{I׫[0AUOHl{:j߼T{4? ѝXIgV.U< ؇$c hZ=i -ob{P⍕\x*|F ԛS$;`~Ӑ4֖ .qO />J\+%߉λ]S]քTNPWzE@ {sb'fOMf?f=cV8P23mU*U5jm(˥%$NafHuc$~B\8o?K|bOޅs:= &6`jNN*0^)ݳM'U7L}0 a#ɦ&d=`w΢yIi2S*8zm̝0pǨiI2*Zym;aFްI%dήC#՗.1cP^ܿ#2׫_z,UIp?zZ%??ۇw%v+Wh%SgV,_/gl2DMm.W`pM9Z3Nm" 3=Lw5 v@_92, io~u8[G*#&`a]h v%(8A$ce<2`>-2wܪ~ Xo\ p|Hk#vj2^äY3ķn?5w ,/PYl=(F ?X请cıSɌwQ,N~j$_Ux\)yE9{ mS=MP}²Qʮ p~"o8lPC]Z2S0 L/̹&6l3!<γ-LRA p@/_XNXaA0(,C\ѧq/aJ*13ǫ(v5)[3mkG4UWXo QؗI;b&#Y` e=>qA`f*&m5cjΨ V^^)3ж&*̤\o9 ({- uB(2l+nԢŚ9ĬFz?F:Zq^G?œ'ؠơ=[pڰ:>1,Sի@ (}#ii/īY8<0]kw/> |gˠ{hq5 /[a\O|2cr{>?/.xlƼy{>"H0;Z@”zej'e'ٷr:UK4•z^#qǕ+NpՏ456e_xC v13To M0g](Z1?2 ֯~AtŤwz7ޥ$W"NgR|G&M׾CEcn3 N( ]W]ꁱW WN:dyvO2+ m8+whHFXo$uxd<c A؋XUQɬ-9pJǢFtBY5 }A:")BUۉwucUeر6 BO}Aߠ38Zjaqk0)l\XABgs-iVA~ 8n{Ackv 0.X%>D9Tx֗޷?ž gB p 7A}Z]]]!;m۞2sLE8BnAdZaxMG|6j"^.X]]]; ; }D1Yݽ"_ڼyE=FǑ;_̾ijjz8Q ToڴƍsG qR(Б=]l!zW\ŋKƑG}ʕa} $ni/Xur$MCioo_r/_*"c}H>sVZZZ'-6d2t{{SSӳ .|gN_E+hze ^ۦJ#| 3 Z 6G :W.ZA+I3#-8> ߄8bP(@7g {$-.>)f@-z11t>Ekx PEOƑ $ڢrH$ObX9o$7J~hIENDB`dtkdeclarative-5.7.12/docs/images/WaterProgressBar.gif000066400000000000000000003732301476226662700227460ustar00rootroot00000000000000GIF89a1}x u b v  S !&!d!"""-#)#-$1$3%7&:'?(<(E)D)I+M+O+T,Q,Y-W--..]/c0h1l12q3s3z34~56d77808899:?:::;<==>??@ABvBBBCCDDDEFGGIDIJKKLfLLMOCPQV~XTZabcdyf^fffhlpqrsqvxx{{{{}|~қԠ»Ϳʪ٥! NETSCAPE2.0!, H*\ȰÇ#JHQ3jȱǏ CIɓ(SDz˗0cʜI͛8sɳO JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˗l=|XujG%;,XرC>@ַ!UHNbŠCCN!P|u޿payۤt%oq3w#GC TyKG $9kνLB]aG4\p!ͤhހWM'ih 6F(sSJq0#($hb,X"Sކ4&W=)<@)$Jy5& P ctH&9&t`)deVX$*)t9 ښl`7p #j衈&袌6Z(&<t}N`4¦v駠*ꨢH4PZ8r*묛VZ7pB +k&k#gvf#' f{vކ j #^3 * k;',fӕj=b gw q vÅe4{0,4l87j` DmH'L7 #l /\w`-d+{RhG 1Zmwxӭ{~71G7>vzN%pG.Wngy啤[2P: ꬷ.; 1ɟՍ<> /o'|l42n2`}o}/~H{S8 /o?㬺jԁ 7L:l/ ;1  GH(L kPRCj`t5! w@ H ꘚ 2 8H*ZX̢E(["K<6pH8@ޕw IBL"yG@ycQt=c&yNj'CIQ,(WJR!`T$B1wc=ȥ.w^Ru8nB.}@dh'LeZӚG#O6K8NXz0Nr沜<:3\#'4E>`=}Ӽ@9P|.`fS(qD'JъR4.^ y䜨|Q~dcGPіwӦPԲ~Ӟ> *Py:gCn~C=OpcRTOsB +Xʅ_ܬM7XVdp\Jr;f _ l`fHZAt#?Bf5[zhXzv238:=-nM;q`!KMr"7 G޶'`]zw9I>!&G?^A}Ko Yc=[oaB@;~O}H8> {  0V0qOvX͇+|Lk2CgB%;P~(DWN|X~|b`q C8#pL:+: ?B]8+@'MJ[ҖBpmn>5XS)sKC?/G!}`lHo Hf~ T8`@8sQO뇁"8РqqqkҀU1H3X2x4xV D3QV46hK؄@4Ӡ ?*>6m VP^`bO X x_Qa$%_}0tXv0hf0 W`XxXW}D  Oo`YPU4Π ߐu{XHX ҠhvXXIkf ЀxxyLOx_vV،W` vfGF|/D@ڸ޸XpXxY {O Z(ypx DHxH P|Bv|H`& @yYHY k&)#"9 @ P6ip1IЏ9p*) v Hv,`PPRi@ C9ْ3ip`R)liNI SXzf kiN 0aْ05Oyy Vk PY|p ɖy` P|0S%xl5mҠ ɓ I (x@ )Y9ڙ  ji А i 90I hf ZI ˠ2tS@ Z 9t@ڹ M @cY ڢgډ0 f~k p .9@` {?J':y QzxxL`p ɇըA Cz ybItp C%ڠ4Pظ p jdl*Qe[ p Ðgfif-D Q9 j QI W[D y𖂪 ʧp;zʪzo- h@iqЩbzeꚖt` j͖1EF6 Ri*஢ꡗ (8Sj^0 RNڹ9PrzVSUv: 0I9@Һ :G%ԯа@?{I+[Y =Jxzð ЬTy ٚ ˣz?2M@N㠅  pp ªq$]kSeǥ֐|+:p šJ+\V5ck Sg 0 +3P{7[ :PTP #G'{Ӵ p [ PZVӼL. ri{ K p ދ IiK[K[x* @ ` @ A@ { K ж$EVKt;m l aya` P[I;  N ⺾ի ۢ kF{ۿ3M+ Ͱ ; k  !`iy @ k{ в֐ΆDQ,մu ;ܸ>| d"! :` k ,ǐ -e6fw,;ق<͐  \\ \ @  ˸l˳Ř\ IL lI;8V Kː 0 x ˂଻^ ˀ , Ð oq ⰿ>!p ԫ I, ؐG<#\Xq5T 8LY0 & $= }ڰjp`jRѻ34ӵ7  pל FM, .<3m7=ܴ ԼӐҠJa/ ZMbR͵T\mڰ~{ ˙9 H6hOT$H_Fwa~$I2 峡bdjZḬ̌R|ȝɒ%Q MNf%ExJG7@6F BPThQO5QL(Y (Pa`QPbiR;,#D @ō8KaT!W^| TTq?}T$%RVW\U<}\@`D2\5Wď? 2$9kTaW` 0sAD D𧟄yg^W`q L@RjE%!|J~@T(e&ZS9)9:l ;L 4zRb@Vkmm ']+k Ț x`{T 5{ҫPһL,9lp,k0U`*@Uqj2F437mULm^d%QCq0AI!L1? 1qP1A_= uM @kM]1@-Pf]k %x Zkboĝт̫Q@[$YM[ѱAߒYu} DŽQ:A.[tjP /@llw-p)!,DJ`"b ‡#J0GEW\8q  9@@pF,#^AdÀTA,8@`OP (0Ǖ+Xl(m@ R T-G-@aB<4恨|P)k1!>U[6;"U b֘.爙?MB-Lr$ͺg Lڵ,Mgloo'AH ŋC:g γS{`$mjwϑٽET=^] A踇†1Poq\x Vx}Pr0y7E-`"ES`b_v)'a|aƖ-07v\@!,DJa0( Ȱ *V4H.2AdW\H 4P*`(%!@PB ""`)p$ L9uq40 EIՔ  5̚8dfgLPz V h Zp4lTʕ2倬*PS L‰r A{L!i)_ͺu ^ޒڵ۔l!Ѹ oHl< M=ҽPJγ{6ΰHT|/+v-R0xtrx?qFuN@^|lqтmGE1IMxNĄ\h@^EDPPHЈٸ_ DƗ-9m!,D.a!H*ȣǀB(bċj` {1dHQǓ(Se3C͛8}ܩ}iIB?*c>aՁ?$&[3dJ  \O .Zi˷lU+- iZ 0@2`@0@ m& @ x25(krF,q\U.ڲk,A!,DI`\2` 8 "UJHb%Z1!YP P";x0&d<N0憃WdN

|QxƐKxLHY ϖCcԔΐ"Ht1r OgɔspܙwnT.s,97\_俗\rdI IϫO~z _ҝHY׌$J5  %Dąf!x;VMhb(@(TP(4BA/ŏNEAE\G6iNF %D FBTPNQTk#Qa/ T&n oZDQA 4Dy99Xa p?1TRt @A"@ @ Id5ď(De=l)4. 00'Q mHK d+@-ކA3?PҊ q P̂裂%L4@4|* @A$O.`Lx.39ALġ@Ĭ& 3)}쳴{@N1к?԰91 q@qT=$xTM۰2GL4U{дQrxD $y ),1'B9Tm۔@2 -~%a-KE@q8avE1P5A %xlAA2Aqqߝ:Q9D>;Q\h#N0!wkDZF[\k?뎜-DzaocGF^:Tt!,EH`X Q$,Ad%6Hŋ3E&T9@'  M[(FC 00W<^3`ځ  P\0JD5S @5;O4Qĉ@ P0x_E+iǐV4Pu/$hRj;B4䋣F:װ;-9۶iͻw_ݥ} >xpy嵝Kgl|z>@7'l4ϧPjREAi_L+,ٳe ;>.nT##ȀT  +^;׿~\/ʽ3ϞC-3x4C(]-RdH۶sޭ7ݯ7L#E P>.F8wfѩOb̠]\MGgI7.IDH&`79g,AT\'@48YM AKDqD3H6c(caAMTCh)KRAM?HBQVfZf@Q ( A?D]qTMBQ2+͚`\>`DAPŋe˚P ITaq\vtT @DD4AD D)%`J/$3*NO?*bhꫮ Ă)%$@:rB?1?L  +?sK'JHB%)`@  0 #b)@rO+ P G I1* ЮAPUA @D@|,P,@ +HA1-*Tݲ`?0dG3+y]4}|z?" `.|t G-1>q[(B(砇.褗n/LAu1Dt GE9ALUA>>^W^|;.w/o觯 P0E FD&,f! Yb:!,EG`'8*TQH "@ <7 @*`4(ď r I$O ,1% `@$xfe #Ȁdя}z2P0@"ά 7?mWԹ3*իuNOÊDg vIp cUJWN(V\>v At1cFcG!B@)H?@SVzk֞=c>YdH!V4Ɠ#_n|7"С(2}ɷFkh{vx`~B}yHҫWߙHΟG$`p_}%!(vK4@O9Ă 6M f1@nhb(b&DqfHbAф:O[; DidHAP4٤@lJ9䒝E%ŏ#T XfIEgRل&hr@؜4fD~2ч[*4D$(9\"|IŤhID r @ȧ@ T0@PC ʀ0lsN±%  (`0@3>PpA p@ۮ3j,*DFQ¦4ˮ$Ln@іQys21jn`):)lTsRA $.3Ǻ"3 G0OKT<7t&\0L 1rbQ6 p-tm7 lD{7e @qlwgFAp`PАE@ua@CϜ l^ꬷ.nsNANxq $D q!) @ :Ƴl|"y!,CFd(H *D)Ȱ ( , h߀~ojxpǏ ;VX`"KA` D'&rH7( PJ}:A?'P%@s <x`[2t+#?VqzaRi~;a  x@Z@J@h&B* ~`4 Q~LPb4ͻoʆȓ+_μУKNسK@ĕd )8!q(O|^?c A9PZ٩V6F(Vhfv ~ta!@⑗C\%v"x7^ݵ8@c3ڸ] @ $`5,F!P-(F2\]@!,C/c?HaKyåaC3jqa="ȏ?2Ȳ˄>bvI'P+KOё/ Ǐ uGЫX0?fG s@h_?.G9*>}kwn߽~r퟾ A -)ndIsǤoMZH׷S^jA$dCNcWQ3Ȑ"K`ΣC7G# yȈ"5F2VJL#xDOL稾MWx y7G:_5J F:L8K̑WTh]DM,bxO>@!"lY@qO3FFnP4EHR?FF A8\ eiᡔ(EQA#@QvFr F>'2DС3FAl |}xIEVJ饖fX3U$f $* pG *3>~Rx20T:|ccjME*[B +vm B+`HdBF!.[+I퀡,,QD@;.* PP2@.`G`{4@(Rh%@32C,[,F&'I9ǣ^Kr> 1OlAmlF4AH2@ $#K30*.6~1A 8 woA9lzgy@CzYQ`c1!rW@0;X3/Wogwlq(Lξ_@ y >PBx7 4`$41U " #E-j!,CEd)H A*Dbp D Ȁ{ 3F@% Œ C! (!BK]$@a@ *D`9"f6S"Pr * +0]}qVKw\rH`8`@ 9RDFǹASvdB$,AM^=1`+Pl81Ifm@Xkw Nȓ+_μУKN]ieճd$N&k?0- ē_?pC)~v[/`IW9Nw%F(Vhfv 90|!F޵_70@2xe5&@ $Sc͛8_7TbH& +r\`/=?~u׮`zUJve%=~(KgbOG N$?vC1&dŃ#s<1d#B<1] \PEC^5׮[{F Cij6W-H!E 2TuD1.9tMi>cyHFy}AB>J1'i|NHH$ P7օ F(  V;H-13w$1?,w(YK4)<ӎ(g@!c,!@(dD@p"AM4y@PD9@x$ ]x:vA #:Mf_n9Pp&T?o4oN Yž %@P@jEq'wFE @)B@ JH>z ZF(TP1QkllDDaFQ@0j$9u:!JsL#4*@.}s:nAdO4@!U iP! $ J%$tL11> @p0+@(L .D?+P6+p5 Bfq6-5 +DL xg!1 kLPQLgQ0`l!P90pt1AP^1IAS9>l T PdYWogw=9x!.AoP_k3GQSDgHDUr_WiMB~ @&8r [|1 X ,!,DDb*HQ@Qp(%)q:BJCI$P@P@  Lx0\Z(TNF4a0$)?:( XcZRlCF @J΁r 0!rr@Q ,Xْk^z`x Q/iTGѸsY 'Yu Nȓ+_μУK.AiGngˆ g` d>{/m?@)~Pvw 6F(VhfXlE$` 1'}(c\lA q׽}ȱǏ}(Ç_S4@d/{ qFMfG"Ο<IɣGAC'/׽ʵ_@߿+FǪh=sM+blWm j_L6 &cNJ}E퟿3g$~TVtoegeYA L[rٶsޭ(e~ RHB AM)ˉ _y $#x 瘭6D$ rj@y D$uӅ@Ï#Bdk ÞJ tJF 4D1ŇCUtXas,WMEJ!P*7cD=H]sƐCxATBFFG Ht٥tQ$˱AH,!YGI$II!;rD()МihҹbID: afgkfu'M&9De.ꫯEFY  iz?@,7I zP5JۚdRQ>P:R 7k?k^ϾK+pƮQfvU5Y)ɳ%aQEʖ0HP D $< PA*f!<`HbV4)LFQ߁TQL( 5TpspYsb. luRD8pp=sMv1)2H@Tߌcb ԵO&8^F VQ^1X3c@u5^^\7D0PO+ L8W@xSnsGs쎵"O4 Tk'c ?uۚ԰y8e y{_?.%+ ^`?#P"t au*huk! ?H">4&|!Lp@8 HR q@(FсcB49xc&`n#-8A=~l|~ IBL" `9؂rFjƊZhɮ\1d'B-9(%RNA \Vɽ8CXIZjy0/җ$BH2L@ @ׄHBcKJ$g8 /ф-nNuNdQzړ#E?YS!,CCc*H,A‡#JL%(M8$RA )L@`;xqKP2&M2F!"Pt@&

T3๗ ]`@줿Oӫ_Ͼ=5C )l:DK sBq8!Yx  xQYxDB@9(C t"$Ȗ9%4ΈG8VCy5R@,AH}tdء)dїrD!l -|9-Z@!,C.d?H*$ȣǀB(bċjQc?-Rtɓ(S჋)}8k꼹3ʟ&>,}]A-zWjjǙQ`C-3돳\n ¶?b2nsw_SSaa!i1>!C!{Ψ5Yz v!Ep N|n(_.O>C,g^9r#ر]=v֑GB5c#Ƌ> I)NxN?kǟ~-a߁M@(a1&Є:Zrcv؄ D+rE420#T&cI ` <@%\}6Bᤓ8BQ%T`$ @\r9! Td`z 4śQi$ BVyfcrD@y?PAw@q27j$J(S&T hɧSNɧ4vf6 j˖z48DбeZA p3FnL0d 2AS̫V0.ֳ 0 Cܯk@mD^숱m[ wF@[[2a0QP9ā@3g0;ZD{L7PG-L3ALL5JB54om njB-uo+@B#k]A1j y{2$@ t Ʉ'θzG.P9 2P knڞCl`o5xr$C=)NP 4 iR#TK!,BBe*H,D4QHŋ ,Q!ϿhȒ D 0P K 9ăh$0@[TBѕQdݪ+׭g M:Bm* C:J E{֭߿| XK'̸ǐ#KL˘3k̹" 9(tp̀8q6^=q8eY5 ik]жn [` l] nnسkν0 A/n8ovӏCBq0`GF1PlTA $ "~" _E01,b'D XQAGzL䨣BPiš% bGdpMRْ-P!,C.d>H*$؃ǀB(bċjQBӑ#S\ɒ {bطoIq3ϝ?{Qe[3&?W(Jʱȵc*zPKoO}l]$Ȧ )KG? $3 ^^l+@!1 es%͌yjyE:DH!xC!q*U>-OW-/wKWh90M~w$eIOHoOd/Y)$04 .`>(amҼ2*!,}Ĉ @`\(rTCP>4$?XB @%%4QDQ TPp+#P\vi @P@0Y'=@ oJ)%Tec@*1s( ePD 05[izYɧh%zr玅HYB9'y@,yA8fz*ZZjr,-j,+BB+$s8f@ Rp@tpMLpiM: /.Y!F9^Tq=Z -=L;W|KL@^\j0QP+l\V/wl3YP@LPs]VR0J7PG-u LM9xB[Z!vA{fwtq۶FlPoϝikB8 ` @2@ $5@ɐ 8SDB@ߞ*6 kxc-;$,P*^yx9aJ-P$Ԣ|B!,BAd*HQxʔR%HMdld C&PPLR%A DPM rP @I 6%4Lp@  4@U$C&X  @ x W^M˷`ε \D &:1D(mTqxkW}3+uWfV >J4˖7$W |ޛڳ.q͝+_μУKNs 96PkqPH޽<Ó7o>G8ٳ>dr_~ wU0@x 6F1 t0dž^`mĆmC^ *ǀdb˵0J5Bq|#mr 81$997p9$@2=U1% zZt4ǎnfVGfD!9-jfa K\@!,B/d;H*h@|X鱰ŋ3q?~0CQɓ(qo`V oOʛ8M2"?G"])ӥ9Q!ι` "$ C[B^[p@vqv̀x +ҿdQxƐ/Ȫ>Q|Ҿ )24ӦS^9*Jh*2Һ.g: ڶÕ?Q] A"?:$$֝׆riC2Ӯ=;J#w|%M <@ uKD6|nrS~%L⨲*pLJ.~( @A&B%0Me,QB8a Lp}ZO&Di(@ r26E@y!o}90s{1<3A3Po`SPc?P"!,C@d)HM0H .@ )bG~2~4H *l (Kժ. 4P!|Iȑ@ĀhR$&<`0?@8ɊM@ j6n `V8 Œ;"&P4(PL:`  tGcnK x0{BͻփcS#FμУKNسkN!g@&_.C?NS92Z>}C8[ϽFȐ!c'º_!Eևd߸.k)5e4HkRAN}Ռh7dwԗxwivOr$I'Io {`IŸw3(41(@0Q F``sdaK4Q-%XS0@0 @@ $L?A&:$[@%%T"0`@l:0P9"@RKAqp_#,"K,̲id-^6  `&fAB(:z$무<\+Z~i)BфP@& 5ބ "DmTkjXQQMjiC*pֲ96 `'tY PRW0HN{`@AO .1DA[vlV$|0-|Ƥ6,r:~MPLđFJP}Utű]ŀAL]6V_kAAPX0EvWr߀n2-8Vyǡ8s~1^48N(^P[}J9Hn؟6Bi~pQ|#'Yns@x:^ -Il;۾F8N=}B؊>SτA9h~AlnA[Hx{!P濏~[ J$Ila!,C?e(HA@ WpOK:<8"Pȑ⛊8l@(!B0xSV TA@@0| #KJ59ɂHCӕ;A)@(vUU",Yb͊Z?HW7Z#(00Ę =`Dd%liJ(1t9pڀr R.@' l\c'ymp+_&μu܇_νËOӫ_† !΀8L(с' APP (`& 8(=^Yha l~(u| 9ᢋb g(^;cx[lEC^DXPH2iJyV@lah 2 ^0A/2q@nVGf'sN' V1@EN T@c^u!,D?c'HA@`5d $ȱiRq% 2BLR&ǪD K*A|PQJ @ K 0V`Y 5tѢ5Kfx5@ YP@ 0 v[%_Ws%xӨ&huL@>hԸstk@gu HQOμУKN70r9B!y~=L^IP|1~'ց& (haaLD(tAzn":w}bsqdދͱxP(qlj@th@pD WсIؤOVhV^[(Lz 񞙺il:ee)@v>fd9lf_Xgj!,B/eH&ȐÇ:ܣŋ3VǏ犇Ɠ(SfG$MIs&{sϞ\I&8 ӦKJJ̾~0 u_ XcZ3Ȝ|Kw.ۨwӏ 9h>EC$^1ǎ#Cf<& ,pʠ5n|gH$g1m:FNgɔspܙ wnT.s,97\_ɗ\rdI IϫO~zK@$I߀EQf8BB T H2.>ap`"%@4b/׌ 6Qڔ$#T@a2pP@NqX0.J2I)d@'Meˆc sI̡ 7 J: eZ #.\i`<] 0ep T$ $)*ʪ`XZ Psǟ dĺ5h3H d봵1m֚Mu;d'HAKp@L !#3j@e`@$ lX ̈R$|0s LP&Cn̈CG郧 4pЁ0`@`с2C@ hݺtF+ ZVz+Vڲ˦ NJQ¥@ XX‡S5PZ`hw`Zh6 ȓ+_μУKNسOgag e`yo(|~x [|e_{Xzpu ,`|Gy9P0v\yq0u~LHH"uG}+Fw'C1PAL(]m@D:ǀ i\m  FLN0%smq0@rr'9Нx Wpgp91(tP9X䡄(p!,B>d&HA@d`y"3f|S@ ARb<ЈҠ"I@ @@M>R()`P`p`X`-`pׁbr r)A 0-@K\Ҥ`_@bxدY,Wk@c V iHuB(S>ҊYʍ]PɈ{;6ȓU8УKNسkνÇߐ#u"0,`~CAL`|l@^w`ԗ1.F8wfѩSOb a d I_n.m5c>TrFH,GsFkwpX%(b$>`'F >(b #EA ?s@ЀL\+ #=.Y$T*XP`[Y!3A@bT" i!)%ZDL36T%lT2@+Yka+|?%]vi-|m:kAXh 0pИ(mvu*[Ysj!36&'F3Aa<`DؖR|Tx|` ̉@2B!̒<0!ȱ1qDA#"/ o0P^lҖj!@vㇴ\t_ALbùmG5AaGf}JPP:LoԹ3*իuNOÊ%Dg vIp$] Y ޿?,0a:˜qA<օ+DƎ M MzJ*t׮Gn:Mzd!)W|sQ>}@Ku6B#็514 G$~x%$X<F(ac39g${ !H[t @+&"'~ #7!AP(@pFdL29> e0p,2"2`y&if@[@`4E hB0@L ?< $ ij >$ Di 9{@ ` MfZjh!:*W =ƩkmG( gIK 5O'Lġu^CtM5qׂk X9hml ڳX؁sޟQ6Ba.نDBxXCULrcIY@L䰀䠇'X rUŴ>֕T1r<;) Ou|PC?ӧ9Pp|K T@!,C<_$H FA2 @$HPРŋ11D`!Tx@+L!HIZO &h04@ @ iEgLVҀ*E 0€}$Y+ҟ F0 @t ԛ JÈ'$}BPH0_I_uXfe\e )@ Mh34X' I58?RӍx6e6]$*  `iX39jRf3a ġW!У4㧢$'" N+_!魠F%;vS WlgRln#N9l=Kk1̄@qxAF!e>lzJ-T@2G p򕲞đjhA'T!FL@K/ q\uAC4Oʶa#&m0ovG 8$PA9}/31CVvf591p儙mڠ7\:v9xiA Z0 Z;9@c%y;ZyӃvtD17C+DMÓ9AAǏ.!,C;e$H  4Hp Ç!*2E@( 8(!  UM )0N? IQc  (P`8J$I`@o` `@|@jE8M,)`$ :rL@2V A<@t Nȓ+_μq vN}0qoB.c[px}m&y46?1ao1@}|!tF&P,(P&@IQ lCtmDHXp HPU#Uv*]0|qѿ|ძ׮` ف~ `` qҖ)F2Ht  |rȒ ׯt%$sAHE 5׮c~ Zh~ Yl>ܦk '߾jA )Rp| 'h֫c~]%Ր?~`( %*@x@OA !?w QpvFv_4AB@ Xd BWb)*4r.B3]T@LSGLdO2@T& V^\§@0 x@ -L#{8=I"N?OLRy 4F HxSNAh< Q&O sN*投¨&!&B-j$Ȁ EDJt'qJ,0E*] Jg7 -J2,zzӎK'PRkPcɧOAj&Lp?0m9,QsHoTőÜnM1\.]B|5|-APPYB)δ)qĿWTaBB"P9Ąn|2-P~#v^Rt@ $x8>G>ЊKB[X-z]۫:AY/9Tj;f,'Z+?NΛEA}J>s!RD@吢SCcJP!,B:d#8Ј#JA)"d%T@  \)Bp1cƍ8 CK ZY@mB>(i@x:æZ%M#t,2Ah`@WXv@ԭ6'ԀEKp] 4x;`$;PɈQh4ӘxHwH@ iOmss8*ȓO3UCNسk΀o۱@A L:-q0)@q (t{h1|}v_1BqЧ|"EV " )HDtVyuVnbu#țSqHDs66Hi;ƌA&yATC&#NE)e{Yf`)"%|( O}ővfDŽC)ޟ1)hvE &@VG%Ll@9!,C/c.HZp@C q׽}ȱǏOIrz !숏=nĩ'ϟ;I`}%IҠ!*չ3,:PcTr\8s?WZٮݫ/߿? )?+N|I؍3 r-_dA=4 B S}.M{rٶsk!BP  pŗcښ`ʞwK'Z7q؏#4dVkN`t ~~?0jA !@Xu!71Nha8!㊀FECQU&1Љ&Ո@F%YLB0d Б?\bIrB>CxP OE|f4A )go%i( 衈S^DUIPiB j ** Z@Q̪UH q@ lvR@rlyNvK@jt衊kq>` eOʪQcIjhAJ?LܚA(hš!0:>(qŇt" /$rq"O 2=R&m>~|;гѻ!-9#$@.ւihe *E0p vG}O[RPqDC*R$(#\7T1@yl 暉`EFP?~v&^$ `#D_4A/ k QKw] D@Tـ~"\r6xN[n\%_78*| albVX+(>} zn : xEb M\$>†uf)@n^9BV %NA1=(0!*" p7 `1Z<^H2hL#&8!S#N]QXˁj,<+G` Ad!!T*đHH2[BGKP!,C9d"8 bp‡#JX!A-N@x(!TPc>\"P?d AO I(P@ ,mЀU U#\ @D Vu;@K ,L.F~ д$0AYpLw.լf@hPR=8B!W^"Sx`SEnͻtxe^MxjȓO 4\lȑc{o{-ήssh>0 yrxc+W?!ϻuJan2P+-9~!o%gIT8͉U$1@&k|&AT,S @T:#AiH&Qߒ1wq%yS&m}\&w1fAVv1D Z@!,C.e-H*$ȣǀB(bċjqc?-Rtɓ(S჋)}8k꼹3ʟ'>>]4|=Mj=̨ew٭h–?b]dx՛w_ѥ*paqcðz/uxܘzKޜr42ǫYo=m%@>( {hXg)2z<[Npȇ ?4`|ɓoD@8P~oFTټD>Z5 `F<Ǎ@ t #H_8"QύqwET#QT<\| dݧOPjx @D %~cG>ĒN'obfxȓ|FC4hi=:F Pb)馏@AqIv2RDZEujg| 8jqkT ŷ㇜j[lP|ˆ:q ⦋ɢT@F+0ٞTmB +GѺij x*3|Q+90APn +T"5,'!cT=®ƃ-TIŒ>3.| K/@FqTWmLU4֧1m/s}ZQ0/b[հnAJ 8L1QY9P@3l۝R@!,D9a K ƒ \H%>|2Ȁ!,4NE CYd!&f@-l ` :(2HdGJ:!$X( ! Ahӆ7 X/~0R."t S ! doVb0-{Iϛ=kM 6װ=$svv M7 _n:Gmtf\5 rd[d>"/a` :}x ,MaR^>8SHE鷟n0LQ1ԁ*i ( 8Q) bN pBsL "lh2ިcH @)T88uGw yQ^Q"eelv_ 7%C9YfWxm@o6ԝ!,B.e*H*,؃ǀB(bċjqBӑ#S\ɒFoH>챳Ο8q%V`bB2g>%UN98DȐc^ѵm}p%AtDB?<%Vʷ@*2E} Sz l9l@|j!fLᩧ9,/Nqq j@9xZP8 کAz3?рd P耱l]"\cаAj\~Ly-Y 0[ $L\bT,Aqa;>0@(nPP k)*ȇpB"  M0Gӛ 0`r'SPY3%rIʪ7,qarJ,t3m%<zsO>tSdq=@+c-d9lD=ۣuJt3/A9%wU=Im†gMZxDZ?yK/N!,B8fPA *$Ā P!2`ȱǎC(BNlt4``@71HAC@[?dHqď%>h zUV&P[Nhg@S[š)ɉ~(/}@"+V0\Aƍ7G&ϠC;dM-9& pYѰcm&vZiȤ772#У3QOǧ7wr X{9COsq|CzIL tt 8 y]PтW@EBwPĈ(G(4h8~GALp_mm[w Y m7NFF4YqT np`a[ DYom20f!,B/f(H*h@|X鱰ŋ3*0P^z': gH1 v@A_}AYc tH gpŁa'6|5u g0*' ܑH&>T`LǕ^x l> YL\y?Apd֩Pk$nFt)(A |GAy*# *iNk1頕&"\Z7D| 4[$ĀR|*EAqLQ1adpBEA :0⒒T B~9x!9Pp@X-f{R9($,@p%l0"DױI )h%/gĒBDB\ayl?xBLq FCgQAfK]NYPtx;))1A^w9D:[﵁l1xU>&7!,D6b "!*\ȰÇ#Jƒ .Ba@" ո `0cL%6@ @B>~(24p !tLsHP _ևB(Ѥ !Co/*hC< YJ*0`\C%Pўbk>:6DkN˗ l _|! AmNB&Ν8ܽ 7>" 9$ <߿Ay(BDCl^P`~"^5dORhn RtDT!巁,Q"8}|$HڵxU7/[_cx!s(x@yJ@(pB0Hu.[M.CX q7hoU`@qX\y:.E9!  w|ZȐS92-_?آ z| $ؿ?@ZA r8iPw!ttp?YM,w," (  HQT'Kc#8@ %[nG>tc~آq, MP\a g>Lej:U4W?ة my>8w2jAZ ih^*.'L852\ i.AIB28'"DybU z#P&I?첊,Բ/QPAMQOU@!ǼeZL,@GLzpNlҪb8@y*Sj,9hȉ*`+:՟ҙgH'MA 0д]pqWA8@c})ؘ1ѵg%\xcumwWLPAn/+nG!,B5d9H`!*\ȰÇ LX@XB ' 1I0!C Py`90P%F"l@!0 CȄC>=H18i۶Lh&so. 4y$0sg wޠ`X#a% _P{.WS:>d‰NسkνÇ_'>K3A`OGW'X 0߀B^xA# *P:HhaHRv (^90G9@^bwH͘] QvDA?FWcALW$v nAK^ ^$QBԖXf`)dihlp)tix&L: h2-xƢ ^@!,B/e?H&ȐÇ:ܣŋ3VǏ犇Ɠ(SfdH$MIs&{sϞ\I&8 ӦK* "jԥCbݪUȔ`s5GgP˖j۵n+݀9@ BЪƳK*F|vHW>H,y2gcw.0&\  @;mOT.\$9 О 4mvҪBD9!$@п} $@z(  $ 8*q7w)u pa( GXZv0fG XG@lGWTPG@tđ $i7@hRUt7̕0GHhY) KS!nYTcO,đ&3?F)DXyO71)FvQ&ljjB/zj"<Ūg1+9#+f9q@8ⱦ!>sxl8QPa!FA@0Qzt`}pɳO>|O ?pjOёP.c>eӾ~:Jvٲh" "Ԗ?@?d J@!ÐnPxE&{4!D/,X@V]/an7 v@Rj3n;$v C2Agx#]@j\r 0|@+| 0@}{$0@ -Zu !~AcD{&a OXv&-j^ =p@O(E: Y$v)QS4`(cA>,$!1By'EbڔR3~p*YSD*nO>0HPtHSR?,!#ϠPרM0Qౣ75!g@jk> kR+gNk B8?-i+ -R0z11 PKKohh Km: ɦLRY5=[qI+Q|ܦl!If 0!j3|zBMtj @v3Ҕxt G)SM V@!,D3d;c*\ȰÇ !TPÇ9ccC  ÂA. |qD}$a'vM&tAmBDv lq tcwN8$wl y$v9TViXf\v`)dihl%l@Qz1aw gmByZkY 2-j iP,4K,!,C4e: PbC8ǀ !>q`>3b 2FjIQ2r> "DM$k>!C#?@a 9'C 99G9 XiB! o\ρH (H n]%@h8-y|c"ɐ\Ee7U `ؒ֌1.|nqѥG?q,ONa]=0-+NSNֳkߞqËO~3DǷ{N\c' q h I0$6Q&9lV TZ 2P4L}P'~Ha ! m`"AXދ90EA"YVP:)TViXf\v`)dihlfF l!@lǞ{np'C[`ħo9^צi<&Y BK-o`C,©!,B.e@H*DȣǀB(bċjѠC C HǓ(S<_ÇCp3gO@9%/&F!?1*իV^_Z?~:=J>dd@ݵc]AG](p s*L#JX΀3j8 2ɓT&(cf,0f?dBʟ-  $x RsFIb:` (a$4k6 D~]F{pDtC>Pv@UBHm`qNi`lC2 6c!Tq Z`X ] 4`4PZDs<\WnokuËOӫ_/]8qrا?`dv6Q[$DkVhڀű6XaQ~#VȡF lpb#~X!*=hcQ+^&>>Ȝ1"G"^ E>ANWS W| Ȁ[fdihlp)tix|'pËN4AIƱƄD-XdF5Z@^da`(-~(F:Q-!,C2e;e0`}\!Ç JHb:w`ȱNJ  A>\GJ@%"˛,0IєD2C &(HE >0d(K6QXV-aHJ!H" *&YωAvu$% )gea.YtZ(z P7qDo_*67'ߦ'Rm){_Nɣ4v:A`7$ c_/1-dbSiᅀT@@`J1ABX91faaYD"Hq~*f qDaB8&*tPtY ELHdzPwKwDBe~WPCZy|dihlp)tix|'p\9}ZhH { Gq8)}y0ѥiE9D'B R)؂bj*QhbKJd - _@!,C/d=HaKyåaC3jѠ>O ?~UGG2d M>rN0н{yCHa0p8W{s] P;g<l @'P{JAv&.WWsw%`U.Cā'Xg Ar |з)&xL|€r-ʆN~86]9RW(U&7D]")H>Psۜ:l8\G>@qa_r?L6@yhhur$DW6X$ `5z6 dz # X:U80ʨ Ǧ2jw@ʮdMRqP|+!i\0Ga%vS9< t:J*Ŧ-#i(,`(TXB ymHB B Y::1$0(P!ibPa  @8>:4֩L DP&P^ &l5@? q!<FNXpCΰ!rNa6LU zoGRKJ8( LQIOB 0D bx%@qd8yLxq(1Bd qpbB%$I:6y u=DL6PF)TViXf\v`)=2Ѕfj6 g a IX{Ɓ <Gi٧C{'x `BLHh9řNhhhDP!,D1c8 РA $~ \ȰÇ#JHb>V9"(0"G ` >=$Gw@2 wy`¶A _ΜУ?Ձأȑ;.p MīG8YOks! @A9l_p@q4@  2H2DW^ *!`C~zlHދQ!q#y @Qw$L6PF)TViXf\v`)d9hfRĠqlAm.D!C Ig ^Lᅂ.DqZ(BJ)DV y!q:i*pDsjl l!,C.d9H*$؃ǀB(bċjqUᣦHǓK @Рe $2yp} /4O @(H$#hG#pj>T/P4FdGۮn+ru~!}$\4˵m7=Y`@Ž<8@Rk;s C>so9 0p@Pzs" +vrer@c&{BЯh @x@@o|l@ RDcgO&˖ZÆmؾp96$EiTXBpEp8dy0"t`)8xJ'xBiB!昃E"ԕvqrU>ڨrrtG:('9d?!jG*3w atT@`9@4u yJ9@+}wsCv ZRnAIi^$X7q~.5b+DtL!1 k\lp-tmx|e'~wA^ıEɖDoDrA/FuT(g_nP[ D&#TlmHA~P >>9lh]!,E0b7`  c!>Hч3jȱǏ @ A\9@˗0 "M6Ȑ05H+adMf E?fͺр2$p*0I 1Ð1o3 & @j0W 45p@ Xƺ7ͨ24v9޽ka&~zQn+y3ᶼ+xν0P@ĉ.r0Ͽs=3Gr%*c ' HFhS NF][qyh""b&^F[̵JHAc9xxx9W@J^XQViXf\v`)dihl1&K99G8z]F hA9Fg+ű*vP" 1G+r [hCNxigIk,.ꭢzTku!,C/d6@ d Aǀ#JA;ӑ#'q=!S\C " @aÇ>z ȹb;"7GH{ qSfpӡWZq H&M?BNDh *чk^4HV؂3,L2e 0IJ4kf`Ç\ AztX;T:v#B ` `Pa$HVȳrK=:aWN!o*t"b}G"C^tߓ GpB bNcg@oF {=T@ @$J@84aD_\Է!Rb#DpoݒTp$ ,yuSA8.P?T}977jR/c^)"+͘qTbT[>`G%yYBftj3:DjR>_@ADq yqW4< r $BslQL:G&z@hT,Q$s0Q9APv]lՙbDLh3G2߷Y(^À  ! I@V A,]#!ol3Hfѵ)g yhs̟j3K)>LGpd.*`'| ,%Zbn ͱ|tiD6<孬u!82;瓤cpxDLLuHW慌Ι# d;!Iȅ 9-C9J@&j"C%~"tO]G~ y .?CVdcpzR{"O@* ) V GA_$2>S\ aD:RH_PY1 A0,0)@0<~G̢.z` H2hL52`9FBQ@b-, lab`K1ڂ 'DnˇT$%G:FR%X%TmmJ>YDŽ2"W$DD\{HXMW@!,C/d5 @@l! > JHŋ3jXBaE2#b'On\iG.] ̛6sJ A+E:hE. $PРHC @ (xQ RD"R@"?  z5OBA"L]JW`w N (0p@*s/Q P$0UZ" i @:c 螈`U+Ja֪:Y9٥X׺}AӯC`b~ށDq4E# p ^$EDbtT$V}tn%HQ`⌡Hy3Cl9j8D28c d(0GF1$LVf\v`)dihlFDL0+m}|2"Qx'@hqE[X4FYHD^t㥘XD6JyiNc-A[l@AZ8!,C.d5 Р  ( { ĊyƎ ?fHrɋ(I \)A<@fC0sɲG)Qbe9M>zISEQ)iu 4uz3V Ҙ3k6IJvvP + u]{p8W:0N[W@пaP@A8pt^GGZe˙Wy0өOMxy e$E(:8A |K=ؠ86'(D6$OF&? =M$SC.9'H9xE.I$ t!AiIǤqDDl6iF) hix@fy@! Y Dk9:䱛2$crB(r ltb˫s.ki$ΎKqT!Ego pBU: ߆Cp:0o œNi= wBAtǀ(pߒ0,4l8mLi??]4z:.0%-5[ܚS[\}#<1FMPuN[|6lJ[lPE!kj,y[yý݅Cid0"d@!,C.e2 A"À P`I؃ǀ-bQnj ;($I S D8sɳ3}DP3Dm!AX uer `LKY%dȎv@g@{|` lN~*iF&E]Ae3礠NfyAةq?Yj]A|B?DkxQƪr簡n`@[jAN m\woƶV(nqS.@zH ԻO꾬f2Oۣ P@1 ahM:Ʊy%LzsO>\3r 4>DmH' ,tXjh< DVSuEq0tKJ*Eq`L6qE9#o[Ą9ލx'7Fc !ڲpm0b <y0e@!,D-b1   3 0Ȱŋ3jQc.t@#Sb//cɐ&I ޾>V~rcc4  &C 0i(@P@A^qq࣭ Dd:@+֩~ ܻwxp*@ =7A4Gdfz-PPoȫnUYు:] +)K89УKIç.@{E"[-b7 [|EAaiDEt_xX T@0‚mw $1 Cv#'@^PX'^X_"9<.dDiH&L6PF)TViQ2aL( ]zY 4ffEq@fJ |Q D8gFi~jt1P(GaDm&@)F00Px0`)8$Z@!,C,b08 24@CHA m6t @ȫh0a{5U`ye(I EdCB P pYE&PXk(P@rzZ7  (`=g!@xx&M.@߰+S q/ o :gN #MuW *xpH JOFޠk߿㡷Q"\  T!@v]q'":D\x$jF.$38Nx( ($2qdC690Jjd9%A!f0yKk,I@9a = klYIhR9tk氁zي-Pi.O6~X)Xh"P*vP\3]=$2Lx1`8]7!Xg챽I uZWnJew$i2 . Gxp'aCDx@ ;@LM(E:\1,k8Fptd'2 !p)zgȴ x@>je"O's@a199KXHL8dB0L@ bSGgH!P9b9a27AERy%։L` =~xEN8 31J'g!,C,b/8 $HHhA`( jȱǏ 7@H!BrD I\?e 2ѢHtQJ#a_R|nJ[L P|Xb  1 ~8أUb?~  Hnj |7;O>dX+X^&Xḻ_Ǒɦvxر+iُo/Ncν%o΁Wg FЫ@xȧϟ†QNYqP߂ ` xt'h G ηqvqQ9dHh uEF 8#hg;ҷE&lJ"Y\v`)dihlin*q0qɡu.kh򔃠!ZhH1@-:iIGbjꡖvT1A%rhZG*!,C+b/H $$dhÇHT 3jȱcG :($$xT鱥ˌ*cHH7= (2@_ IbaH> AB}J h%0Z>;Y2d Ā{eV ZTUUW+v hs@ |@y4mt&m>HXhsΡ@h6pWÇ=+ޝ灼KI߾@oc`s\v^ /, %p֯soR|O7^vBe` ԛ@b&s rG>DBG t"'j@)^@*@34ڈmklpSD@q,9epqT>3 Ą`XA&Dvp@$}q2+x`UVqٚEogWi쩘iF CR4jl@Awn'ٕ2(yh>(, *?첊,r/,Q\qAϕ. ـVċ PSJ9ap}?ny7'}ܝg#\2 ݃./2k_.8LиE"Z8D#A9ЉN߸AU"\k ћdos$F( w0APwoَV7 !,D+`-87HРPB jȱǏ 9bȍ&%"h@Ǎz#fw9 ,h8x" L<`ӀK]2+W†Pi0ڲFFC< V] ?Yl\μwNC0A1l@ '2rj\4 ,j.I>-(P:5hɁ=)DiH&L6PF)T#9l@G|qAIa^I&M9|ktQLQwĀe'HuD'vT1@n7)ZZ"کGZ]@!,D*a-H $$4XÅ "$!G3jȱA9@(S"h@ƍ0cjtR# B$ ϟ"}$Fw0gJ Aϟ *@W %`b*C $|t F*@++.p|Ɍ u= D!Ș~̎vu˖#alDڤiӦSy聂[rO 17lٸe)ڿ ޭb^_pʇ)[xgp`a7߀p?P2Ȃ 2 wvCDuuXU(IAyx@^ıF(0Pqlߌ@^DA[l2 \Aq0QU tb]dkDTp$ߡ䄊鸣eEmq'm@tđÛVuI yv@**ӊl#]>y3}szl@:@>@Gxwj>+&q8 ɩhkUL,e"eBSjb]wLm~{w3b[ ƻ8bj侊 <">P^?HaEq?h1R| &[/{2#&x$C83.@r5L?(B 9t0E*ܷ5-c=`Yұ k#hB)Wyw<7Fz-#ߡ-hćˇ$F9,`x1 %Ad3Ny]0FnS`$F!,E*a+Hp`7H0A"@p k QǏ C G‹F8r 2@زM%EHHŔ6 %Q H𸱔͛;y(# =VI`*@@`ق8+C$|@RBc_vg XcPmܻtև#SSv؂ (V,yM6i= 2ȤhʈH @iu+mcx]OizË_B&!_-azWql}1| M 4߀~w`p]K|`t -@[P@bmA!A^\8R䰆@*dMѸ:zH3"Yw)F €PViXf\v`)dih^.iSPT$Q/vƜt HS&jS(䤮0Bni1` z)!9O!,E*a*H`7H06 a" <(ȱǏ C~ā#I0@H q͛7)ERK H q##N8t`*P0 $`- HqU"Z0CR~  ,PnGi@Ȑantd][~UΝX7ڱS4mЇ ?H1 ( AXL^μf̑,̳k@ËȀA2 #{ |{9yűmAwSWT^$xy@'.f Kl(С7R8<$cE&i2TViXf\v`)c@&@TxfvAx0o%eGxi$PN !SȑH>~|VjM`JnJ^/@A jG_@!,C)a&H5H A!:tP5 jȱǏo,DJXrɔ-4@ț8s!JS M)phJH԰ M  U@hX6Y2$c@ݺNb%P@| X΢5Pǐ#Kl@A =zdWR&'Ь鳊 0: `@q$|AbB$Uv:p&?~#do)" dLqذ×U#pڧq YU""xOlS~>`WN>`i rzdሮdb@vbS ‹46X9Iq"dL2@XSD*@Bg!LA; #LGtey/Fp͂L  'P{9b(}vj_zT08Oc:Rط>K0q0A}@I A Vh! [Py`m)p/7'(V@0b@B >QМst!aoTU*Eb]$53GsGnŇ9,&hF9qY@H>0_@աؗAq $B:6RfWoy (OhV*}2EV_s8G&>M`g}!`K.j )6V\6l-U @7.>.>*#)=u'݀X No.Z6 1~iA !n ]_k?Ȁ&\z*tH|rk ':Ad>XO&'npҺ$=}b0Sm^ݓ:8׹()g`\_ Fws!,E(_&H4h@   qbD PǏ ChF '-l@cǑ8sq-aM7t*Xn7I"*P0 ; ͩKCfPݙ06B` xg `T o@`8Px+: bI rտ.W0Hc`:_ *X6sB@!G ϳ 8Ygq9@P<)ϙm~V@qP~"AN1AL,R {dIg^!%4Gqa8.b<@.%ED LH&L61:9@1eI*#`fǀxt79wq1P.''mY`@ Q@o!1"AD]9riHHy8kL@:rgH^!,E']'H4L09Tt$4@0^ G8 / - Hrm᠉6mx4?qYZL<>CEJ?9a@GHA[P@%A\åp'X@m&ҥGmq? T90A|ִ[9fprX#E:`".(pItʘ@kHB#*Jgڢ8اG>29@g=*؊p% b~5鶘 Kd`5[nG3Sdb+w-h lO=@y /XM¶(Fø0ŷ%cN1 q :?!,F']$HA3f  DQC$<ԠqǏ CACt @ hцț$hÆI X%MD?51u@T@ H\*P0@) D č8$@.4uY Xn &x)eF1x+  uwn6Lf,nXDyX=fͤs&0v`f/ϣu@A_q<ع bN]g# 96,Nz$'wr+8L_RW7MCr~,x!=r0@ZQ4 PC!"v$،1h8<@)A "Ȑ1v3{9䂌O7AUVAvi9jƷF0i[)'Qkw&&gw!,E&^(Hgx@B#Bt( eqǎ ?ɂ5<@D@Kbl ̙,+z8! Bx硧 %-/O9`_AőyAc?% F{ ThHP& s? BH* &P3<0 emPAALV PI a @ YBŎ%!a+m tpL@PkƙT MX"A"J&sxld擎a>ڜItG:ÛRBC C4 3 vCD̆2A3с9T<0. M4A[< wB]%n ݅^a,㱮f{_q?nww<wv`yMk0O4xxx%eVasyxzN.D-Й:A #$8P>*@ 緡!,E&^$He̘  6h0 Æ5*Dȱ#\yYpaHxHpȰ 5<4p9`fтbkdPP7oHƍ2 a` qeThwj@t+@c4@@ݼ/VyAg?(0p%>HrSeL<(`G]<0⻉>vk7dC)]053 NȀB ֯BΩ 8NP]$Q Ah@q01 Q@T"I>mz!!$B:pآN D3h#}#I~ۑGĠPXe\v`)db@eF 68% ~zy@JĕJ!B&F_~%rw dBw{9P)B'k .\!,E%^(HxX(a%4h(3j8`" 5Ұ$@r˒(KN$!cF͐k4x` <q&AKP:ʂG"hЁ: 0PaVάQC $f 0P`.*7.:FY7vX\Mq]Ly1ݹ3k|w&,h!8@`ɛ }`|?FCkUgFȚv-Y@䆬lȑؐ#9]{8 Ͼ} ~cL@$r&lɃL`z8s?h PP\ϊ,b7]/S95HP 5 &@Lt  h $)ISV9@2?Thf0O7Dؖ%A=jQ`Ll m:f>~ж߼|kn#0g~ p@lO+W @x!L GpR|tAf-Ɋhd k.ʛH[fIaKEM+-E%F>;nAK6{F4; W8yA"T bSlFa&#LP`[sȮ*k۩ 1L(sЇsr9>{$È}UbYO=f!s8f +zE?}vf.kVFzmPwN7Gp?$$q(Nٲ9"iy4O(AQs1eάfvc +RרT eEf8ÈV+;5-+8(聐yv[Q+Ũ!HxENQ)'?/PN?I> 3" @&9 h"HU7 ]z!,G$Z"H*\pʐ10 lQ# gDHȈ2fx(\ L4@B`ʓI@ ``1 5&|I  `'7Ha@ *  'yc 5*Jp.\$:B|w]x#Ys h%,A+[$Ha-i PARV@@q \K6nę΄s 8tLPsO{ )1x x^ nҴ& o!O GP " D4(P@% r![GlU,PX! T!HA-@)DI$R|##kqϒ:Y|q"Ё!hsl1 p@^~iz 0%A*9)ɩ|is x\my:R`n0@J)H"P44TeP!,E#^*H*\Ȑ!#ʐᡢ $4Ș=02A gɆ4Y%AP9lhʕ>^:P}f [`YTj&*ۙ+ɀqxѩܬf@U[泟FK V;P۾-엢9Ȧ-ܞk;2H@.p![\rۭ1bG }[-AnLقpl}j;ˡjźsxe;|kl4Яڬ3PGqlU3' N=c ]۷*{?x6e_sz7.ޡ n 0!,G#Z*H*\9J\< PB7QʼnexȠ@z@9Q <@ A Н4q"  3i4 ʘYEFB Z< @ 2 ` $3,B?4 T` T@@`<`3Ȓ OTrj $ PB&M@s0%M <ݻqc{G9={ YgI%)N*b!*.rJ*~*P:J)x!,F!Z,H*\!JHB$o"C !ÃI (%4P% &al##&D A&E60OH)MDAB(@&P%d:mۃ:'Y$vZ@ &pa!(Pq HH&!A`p2@^^XMXp1[@] <+ܿR$dž[ 2+*Z6C Lh® xx|; t NhG@1wh[lw1 _Āiw0@9|0"Cawt p)l2&P\s?+"bA%I=B9 ɐD#P X8.()P:@Ye7Z*"(H"\Cd>l:I$2 $1I?^ pr8)Ja ^ڕӊb!iN _+߫v$ 7H/&)Yl K .Kd7<!iLچdeD-{EpM{ݷ]I1>+R NuuDC!-@L {ØmW0gV]N$T(˘]:XKl D耱sbe=~: ! ._Ds R[WYTO&5E? M۰-QU7Y*>@q= C~O߇'T f.+[!,F!YH*\` JHB &P]`X# 䏚l$R> \2AC x8 \??#8b)=Q`@l):\C@ALr*ĉ| p">1`Τ~$YJpM7`2Dt$D ²xB<;2_[:D[}{ԺPJ{P+m@LFL1*#pRPX؟K,q.k,f1z$E>K T<2z"P*S+fxp:өr*ew+9&7tٴ;u}[sM@-a[U@к˘D;@>tBDЫBk鄺u?xrwg FÝ)!,IVH*\p:5Hł0$4P(<$`\I" X9p$Y.` $' 8$р@@R5ƈgPT0PjA `$@ *Q; 88P (h`fh@b@x w@;ĉÄ&;i–8&Xe@ݼ^Qqܸ 3.9)1pEëzTؠ~zlj0@9A0APF9wyd@\})h2%H"#W D EXcA٬AXP$`kY!qЁNuWe~L[@aFBi&hE]|0rI<lhhfeh2!,GW0H*\Ȑ 5Hł/`H@Dw yœ(j`@ &(aYϚ$ATJ (--CO4h fŪ+ׯ[^1*h@}:sfZ (0` )떪80,2$&ȗo*-P hy 29C +^}2KI PeK0)+xd LcAKH{˼D&t@y l L HWvmw^DE0 A9Ip8tZ("C!L *L@{'&z!r` p@qcB d )4Y)Dy&dyh&`P.9N  >ynP@e" uj/)gAɔ9@&v$Oq) @ 8JӍ/oƉiA9F*onB4AO4!jj"t1iǟV,Ep@*@C+6]):U n{P7kCH$5o*/Bot;PnJw_p)1 PrJR09'lVbnqzWPŋS@!,GXH*\P` JEË36t5 Sd bA aʓ0dL(A %]~P H0|&A @UԁX! Î#1/ V$6h_̠0Жb :6WPKW+Yč$L@hN.,[#mq;x ,3=!v5n`%E'aq,h=C^`}z!m@`1qTDGB8)@b aA3@.݋a#hb& #%#a+ ӑ2EB< %LWzȀmQe/AZI拡$x&S!,GXRH*\pkHŋ[xhG^HB0 $xɛ$Q6Xi@ L0\bJu , @>$:hLKZm[dE \/mL0^C&; xVk  a hT1QWnxc$dz,ibĒlm6[}iqmW3'?~cēg_opvٳ˿7-  G90߀&ő.T1TDWmQ_ap A9lH` dW7P&x*T<8l&# #0t9P"#P:p?Xf@XvSQh@XfS`RГ@"O> {!`mP]Iag7D բB81iAA}Rt rE0HGާ A*ҤV%2 ( I!vejW`Jņlvp@.;mI>b=M,`fbO=TO,đ&Wpg T@BD}8 Z0r\XfbIOVbMS?a ̐x0?Ѳ 3Ǔ8#Vp<ǮA0CI+f-r5IM. \S`Yd i?Awe>l))02\mƋ>xBLJ>fcONkҡgv騧ꬷ.n/o8Ay>,22`@!,HWRH*\p  װŋ @J!ɓ ]Hh@@f $Y@" p)A@P.zV|… H0`F /6 TVIl@ VZlˆ+&,c@@X f 0 pu0F 9blrEO[$@gKf* ZYڜ|!ڼ]>vmI'',-S_ӫ &! q6Ͽk|l[z9CV y MNg_1@A'U4"r*LK8H> @ ?) 90B@BPP߇E㣎UŢdɒGlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤi СDK"Z-!,GTSH*\P )\ŋ]Hhz+5 STPb8M$lJ. Lͣ.` M Ҥi¨U*]k4Zc:T,I6h@`)s (^̘" kƀM1_9T|:+2GN XSR`oh+] 0;63tVpT.;r`6rb׵z9lW|= ߓ8qxݧ1A^0plLP ɷ Ʊ}A[8[DA"m@"A9Tt(·B BK2k:h=3)Dȅv 02E>[O/3@fEb&Q>q@ 8J>bdA<*P1| l @ȰY O6JQ@ ¬- P~R n=lI>Zz@XrSD*!j=I!L'A>9(#PY%+Ep͠0 nG'E@p b e*P&[><#|ml B8?s˩JB )*NP"c@8RO݀`J Ln)aʉk vH1vՖ)!͉@|l8{a0!Ƚf>1EAByܘ.Ӎ;^:19hyzF/o'7G/Wog=!ɼ Nf!@$," !,KPSH*\xpE  3j\  @^Ȳ%A(Aɓ.\AH4A<[pcPpiP NzhዥO#6(]^ECӮ.zh@S eH@Pdh"ƀƏ76 0޴ P8APÈ# tFѤ0šM@m۸K@ws[uUE׾ν 9(T.pqNAKճg}q z1`"DŷN 0hPUAhwІG`ZX|T" 1h>T`=#] &2=Ldw*K29ЋXf\v`)dihlp)tix|矀*蠄j衈&袌6裐ɀ~vR`^lc 0!`SBzJ,2-!,NMTH*\Ç#J… 7@ ,& % <`b@H80@  /chiA X Ѥ2B\$IHĄBk]=\l@` uZ_~VP@uELop\T(AH@20p¨dFD:Ak,=ZzI7@Op\ɗkXr 600^lq`P~Lط`ZAq䷟@LOMQ0`A}[N"w`Bn`Bm@0V$ [(H t #m#A ?nGd" cNjTPXf\v`)dihlp)tix|矀*蠄j衈&袌6\B)Lt'}Y~! `"1@Rj2,!,IR5H*\Ç#JL u; H1$ɓ&S\%˗#Y\@@ \xH@ \@Ϟ?%hB`UX "%``Ğ>C֢-Z(^ ۀг ]*\u j]w(X VJ˘/+,sM[W a+vn5'vצ۸m s%M-[})0eE0I0ޠ [y$Sl4@97L~pv[](h& 6x[Y&lɅnADjcdb>0"DR@'%/>t@y @L ] IwKR|<`O:CÈV^)$53Gk"DO+.ֹnn3%tYН :699*!PmZZ}\i >z_SVq p?E},0? 묀JO MXJqO`\J*žO7D(+,< ݲ?lmDpM>2 mJ([m"륋KlPk[z!>s0|O7UpA ,Ym\T@!,OMUH*\8Ā= 2H.Pt9!B9(Df xzP.blib)lD69@C:]RViXf\v`)dihlp)tix|矀*蠄j衈&袌6nE6Y޷ElAy鑳 PK:AP9,z[@!,PLUH*\8 ŀ`HE'X ! 8zpb 'SPr˖0_ʌyr P`t@,&^\zq 0`p(DMʴA @t(V%h)Xv`@"]ŋ [,F}wc  qܭ[G-q@ $;5s. V% f(5w"/\yu@@d;ԓ=cM[6 ɟ3༗ nr |WP^0Z~lAv}űAxGPyРx9DA7P"B(Pa52X9lpshH#OL11!K&&T`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜VDL0Ad ((yN'FT f"-2-*!,KQVH*\XPŊ{p'22ȱ$4@r  \XDǛ7WT@@> tw%E)TJP  :@M-lʂ*U zi@a]$+YWzwpmѷ  -m` }b7 @@g X%` Ѕj11AL4Um%uᗅm&2#dtL:hcߑIU7]uO+ȧ'NgR|#>ӨK:_r@AE?De >\)N5O7D?8E ?q+Ep ~:&4?@Kȓnd*jf ,tʓkM/CHr**@ 8xG>20U4 ?r?{1N"vSQo7xq ʠf,#?@q 39$±q:U$P"`rp|O+[mEb\ bD/HjrXtz|M}o?Z=@d-GNMq>lv0o'qC V; 0mq4~6~-A 8 Fgw/o觯ᄊ P Hc_x ~Od!i' "H4ѽ(I "1ZE!,LPUH*\(X0؂'NL1 $$`@ \TM'ZHh'v6oaK4"*RD**իVbU1ȞAr"eB͎^[ײe]:!{7KbņJ % P@k3R^x9c K@J g]J6( z%%37G0W3rų tVs9'r0 =Lw@7@}!DB[ 8^xaV}P}GABx_m w"|w&m@[h2Ap9@ș$DPF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6y@[rG&Yű+bAz"txJ"Ax Zx2@-!,ISVH*\Hʼn+V$=-Xh\ C\B (%Z=C A <@|('-$$P``,v `SH5G>C!A@ѕ lJ@QPը" Wh(\2Τu]% )ښj%h!EOA!La73YR2e@(@:AJM \!|[  0Z‡Ucꡁ*Ztm0x^L$@l畱{7ik_7iW6h0?  I~ (L89XyA'aPf(߆؟#:x8_$HP:Bc7iH&" (yyr?c E:Ic>L>5 c RCQ $h. qq@I 2h&*^$A,LhO"C7J1(shL+rO:r$&uMϻ 'mf.DH1:Ύz&Pt 2s3Aꬷ.n/#^ by XPL~z9<DžSo;_Pk?,n!,KPWH*\8ĉ+l! GH $ PA| HÎ8 !A q (fx3'Ï 0L7wN8)Td- ϠKeQJu*"|3Yj B 8X-uL_h^  0@̛5m@;YMD=`k̚HnY (e$h=m.y< 9`ོ _A޼k'H? @LP[p%1(Vhfv ($h(,0(4h8<@)DiH&L6(RǕq0@U%td.) X@i&Lt-`.@Й"LP&¢e!H$ @b,ˢ!,ISXH*\8`'Vh| &ZD3)0 (Dr 6H# I ]qR@,YMJ) '.L*l9P"V,Pyo }cV) Lx $-07yDV"6PLWyB v= h>Wm0\lA8` ^ 6(y@B.nYkP)DiBp v"h7x lעz8s?hɅF.$ &A`A`AA3GD&**׬N 5=3Bt$!ap22 >Q(zH"|#ЬAj>~RRQi4.$rO+xt JTJHe6 7Αȶ MB4$_"Sg7[AfS6ki+ G@P̞ CYi6 p*3AyB93RO6W,ƗҜ>"$@ns>x?݀op|Yi>\5;@>` ;E.@p(# $Pљjɰ/~h&tNЦ] KW"2<3qo޹،!'T%4jn ":.&|X,<&"-$.g"IzkC)4Z*w|Pg-dݖz]_B@&[EP$<5m{b)&$cpJ#{;a{p.8$`0Z{k^gXВ-s0-s8l{tDNl~xRV{"G,4԰o~:k1 BS D9% k~X: bSd’B"2s䳐AZ̤&7Nz (GIRL*WV|6X dPȘJ D,@ RJZ0Ȉ\)L0!`@⠃`H0-PlC:(! U2q`B5PZzAbAV΢,܉!,MOXH*<8ĉ+4epQ ?h%c'&f~dqbޓ%jyTcIgv9ig(9$nr'譩'1h{ f2 裛:)i*Z(TPZi|F. +e*jꮚ |z^*B<.I:sd棭L@ AK j=+o‹%{l' 7G,Wlő !|-\a D-9L2XCLP` pa$@5q_1, 7]@̀͒L!&ֳВ0-2!,NNYH*$8b\@Vx8ďGp!A 0 AD$  0 @h`$0ҨA.< PgP,4h  tJU Zhʲp?F m֊UUQSը" _AѶk`c=bNn>@1H  mgjVQJH' `޾7o 9rP8P;9y9_H| dbc Luw0] 6F(Vhfv ($h(,0(4h8<@)DiNa,z5y"k&Wy&@A\X^l li9Yz1]0E|!2zNԗandT f"j!0 +Ƣ]@!,ISZH*4ء#ND@'2Q"C AB(@@ " >@8 &M,<4H$T ĉ`NWޤ*ÉPWxpt倥PvjUVVl1.4E۞7Ќ X V8&N4]Aō3[p ŬtH P&mڒ$`` .}0b@܊w>dq-csgԸ x| .< lXyĉc `}'@  LނD XT8 @{.b!h(,x P"c!Dr=N.~8HHcc4D((P:3$B"\c>l:4#2^ J)'[΁gBĈg)&B c+ʑbJ?݀hxhV9vSA %w ( %5BI>rͩsH{PR9g1$*eB;ОGJj-AL*Eǟ:*;9sISF$Z ofm2P@zXtfId>|D.tH͛c~ǒEKTBP>̙ȬcC5um0킡^|h>{wj@pN=Fynss'H!G 7yÚ8sfO/q~ ' (`o0!=H_Pn ($h(r)v&/30Lbk0 ]#@8s=ʎ<'c x 4GvpM7`XD X@ @*@%e@a M?c'  ? **!cc >~ !pG^:L1*)b)Ey*O4x<"P*\:UPe\)+hij7n>TR|c**v@*f )'(p'CĻ</VtskI-\cj>lյp*x:2@=O &y@l*N)XLʲ'gJ@a19܉ZPG-TWmXgN3z6|q|qt2P^0CAqxaq[{]8.x[=Њ2m#n ek 1!BQnĸQN ز: DK*D2,#!,OLZHrOB0a':`h$4`@  @yJDq $H HLjOz@  h9tRBQIM@ ,8bXjZhҴb Vh-$$ ` c; JYa5wM0yK~|:jZ&:E $hsUƶ70`Ȅ &@ l 3)8Cp:x~:_Ppy A4 lDjw 6F(Vhfv ($h(,0(4h8<@)DAq xx!PqlAyx[hAA]rxPBieAql!WAG9@[h yaefySjX{d6!^C$ JhAyB-"U99%0&j-h!,NLZH0ԠbBLq㉍#Zу X A NyqLJ@ϟ>Hb&N$rʁ `ـ +|hhW ϡ+vdN0w@L@0;*pq? S֕L3,g0u遡3o>sjҭcLpY p:m̚ol@n v<mYJҭ[^iL dx POpu|[ nŗCA9l mNhfv ^[4iw@l xv+IH.c d#9?dA 7tK7Vby8JLA?фe`(#p  \ϗr~T1@px]y&yBJV*@.ij*阸L:>Ay$2xbGN*R 6ϾBDzy>ނ.Ǹ춋dVhk&# Ɗ"*;\ )'0\KB|kh8Z-:~ؐg+0,4l8sk|D||G G/  XM]X3qPPJXiu~A d m|ܚ`AE;pN  W,AL\[wӼR^G%wa, @K-4rZ@!,OKYH À2a‹90O 8qCF !PР$`Lȡ+< `Ap$dž*[pA0h w;C`ၥ@D(R+Vl f̰ ƛv@L%̸pc$c{s^zhҨwFV@ o y2)`@.@Lŷq#< n+3ȱ% ɣ+ vt'v j7-7do?o`$h& 6F(Vhfv ($h(,0(4h8<"RDHnA{Aql_@@a߅!$xd 9Pwr N tyPwL8 ő'eAN,ct0^Xh0^8aXc!,NLXH!Ja#2jqqÈ@j0 XI A Vpċ#NA*O+N\袁*WxT$xMO( DT+a+f:1 0 k*0Qm"V0ϘA'LAo??n kD @L8@`1@1(Vhfv @$h&x)h!$5hcM1$778PT^p?P2ȓPBH'Œ^U\V`RJ]Z!AE5"@Uy5b&U'II]u} 8q ?Jcv.p?Yc>L:@>@Gj>Y@B|8 IdYe\G5fb@ D5Fcm$CIJ ҙݝ5z3GU[e҅-P1/NOGǴƒ0R|  R;n|΋JcTx@6&r͒"Cp"|*jLJ>A̺#i@>ǘAL7PG-TWm lAQgA@}*hDԨg xt`c=$uKD GP Brhx@^wyiapmL ݘzyxdn`9P4BW!,NKVH0C4(HѠ88,8bF;p!*H@A«81'Nx $ b %QHi ]bR4|4 =ıX4@bg؁fm[ 0T={<0ɿ 9rZ W2J͜C $TѨU5j dv͘0vn >94m.qqu L Hv[`9oȄB9'h& 6F(Vhfv ($h(,0(4h8"!ű>Z 7@qy9x!tEn %q 2aZ%T)PGRA`B&WPx@2@L8P!KA,`aJ޹T PBc^xoTi$Y09l_x@Y!,OJWHjCC &H@;t#Ox@A cqȑ @+Y6@ɣ- 4XH:!D"xr H$* 95aK XԊ+ݹ*U۳1Xb6FXvs˙=8S]km ow`Lż GxL rP ^ Xc{AY7h.o|z 3(e~|nPzW& 6F(UhP^:h=3)DTQpA2|/@"2?BR 8J>b1 zdb"3>R0@ Iь[ZBI%cRL*lƕ0X!LA#A㇙3Ɉ @fHa 0a|?lT:\#2Fx?cAM v!$pr+c+ -ʓ Ha?PO[h iӎ+#QVX?YIjH$KNx!'+KE>@ 1=dltz+Џ@ x`I TWmXg\ϻLDT3 GdIAkǁ^8rGV2HH !Z7@wzlw Dr gfUFY1 8[,@^^r2!,NJUHjP`JHq8t1 ;`!A@#8DHG$ @ 8p0%\ ^MAsП$8x1'V0$@%U@ [iJ1K߂Pbu 5'MXKXհ; ulu2'` Pv 5z8LB [n;Lw돽Šs^5^6oO:הּ~'h& 6F(Vhfv ($h(,0(4hRMg!䀟st GUHG9Hűd7@AIJAtP%r7PD%A5A[jYd LXAq1NIaD 7a]FC *@~bsPP_M!,NJUHbX JH;h8 (@RAZ0Cŗ;td!&r O@I': 4L,9<&N I hNӧ_t`B vNFyzW-`F(Vhfv B([&lɉ)'h?՘O((ō8d#AX!1ȒL6*5F3GٕV^)7!tW:>v5"3%DWk@H>Hg# $B:]R'v gstl@!ffjIeU٪lp#hʶ>jzIq`|u,¹O7D8 ,I<0v?| n$EpM>2`m?u-",fRKZ!>|͗3<yv~,$l(2E PC\LD5ǡ3~o:/Iy S@@2a'P$x W=@[ U2 YQu6|h 0$rNc%ā$x RcA $@qw " td^y@Xy9AA;QyPC)HT^ E b0^N(E!,PGRH` P ^ŋ#2|xƒ (0>ё3餣)W8_P:r>LU|9I@L/ ݹSO4L| &sP?1 PcE(EpM~$|JN?w0bW>Ai".@*EbʘA͉$-B Di& @&*Jc Qg7xqM&fƒO69PwL`8@&V.xt9 B~%-l%9ƗG7˟OϿ(h& 6F(Vhfv (by Gz pR\0Ʊ_G.A@t@2Ȏ ;4!Љ=wyA2@$G9%R ^P%)P'$Aq@L؟\p _tĄPy(69`{"hE!,RCPH/ P!‡#J48…  A NtРē06<0@ < &d𡜨C.% 9T v0ӀyMv8z $H@@Y P`"@0 [^|#pp'x)y4B5lW`N ^ I/qlM\ -naP74_!)6ӫ_Ͼ˟OϿ(h& 6F(Vhf2G[@ύ8[090_1 tć@  ő}@@N`KDŽAyPIy$0q} 9$Hzmp֞Ej.' z!,Q DQH\HȰÇ/`AB2H@':pЀa!ē1h8!Ac80 f#@jL3Ԙ3Au^ ӀfС - Z&H4+z˱dD+ x!a]-ah9 re(Xғ$Pgll59_Euњe\%  b@݌{9 Mq2^]9pyA_'Dzz~† hw]z(h& 6w@p@>嘂x? *7$pO0".x`W $-"Vz3@=s@Lb$K*#G B"2V*(B:ΑFS2>O67$ Ș o O7 W2Cne$Fi"Hq6e)c>`ؙ ]>shh' b>ʪr"$&9MO .ʘ RT S?tvCĂQ< ! 0Ź%h As>|%pI1Tꆇ̪`F:A ''(/\#;G~ x %> K:B##9x5+n`t 2,\aM9-I1~c vύ6vq8]6HGփ4i'ׁ7 w[0ുL.@ xqly %8xw#@|NL4x P[475>x@;qvh1j "gt]VC!,T @NH/X@ȰÇ/h8A*H@B: (\@@  H@r"@z)QjP@̠ s@PqA$jBH*zT" ao  &ݔ(E _~ 2@GKnWȓ3t,CTĢISOg`E3Mܚ78] n(n,R0 ( ArEH $Y`@уG$@>PO<+$( *RM Hda 1o3<͉pyW|y1{Y0Ny>+'VyqVE&0r.(e0jaz,zwæ3D]  GF]9 k ۩RЉsA=lL`}rPxY߾(h& 6F(,0f@J:3@.x<@836l`#eCxHA39 XK"Fv 5 P.w"E-7!vCiD,`hJpTpQ, '*'u "XvpOe?9Ф) Kbe&)%먎r !<KM@*p"|ZeH!:D(le6&H Pki  7bV22R:!\-ZQZ9@&"vDCeTI`fFd/0!2YCAfq >l%yHakwf!O~) Rs,LD2\B&B)BƝa\f-t > pA@`@["CDǥō԰ј(XA_ [Pku$!K'q]؛F>' #cbRj(6xWЗy-٥Zj $j!*)-.ȃX\0po) !!c2 K{"h4HE@^a@6iFY*ц2HGUG78 yD t#> -䀅 8qBApF1hr$80AFNAx $A Ja iq 2HH [SF^R ^@ N$t|D9 DR 9P$ gC,@HHwڛPtz!,T @KHA:@ 4b 2f1`y9 Á 4h$sA YD8-<*`@MBPsNI| @X5ΥULレ+hWǘ >4PZ3vSɆc$ c=ܢkd\.9B37LA ;Z@tËOӫ_Ͼ˟OϿ(h& 6{xBGmqdGűF吡A^wL`z G b[2ǀ  x {O1y8 %zĸN.pey*1&Vyckjw!,R BLH/ \ȰC+dz;גPAi =9.ɤY%I9d nVRelT%IZfU)%l.e)צiggFyd&). O6 㬳hʀR!PLLk t0qnA90p;p p ڷA@GQmmAx0E0,z[ D'Tl(]a@!,U <LH- \ȰaC( p` $xB C`@ TxA.F`aĊ$; `B@lJ`ҨA. T0-¨ZP; 0իȨ  _=|՚h H0mN "0_Đ5rǖnȱ%ǀoG ġo)=pN5́vHϴ)-2L(&@̛GNسkνËOӫ_Ͼ˟O= = uJcP|7Q8Q]QA!ieA B@ Ȝl,iY8W^d܋ ct0nA^lУ\Um!9Gp\na@!,U <KHh BZPbŋ2T@ 02k0 y`c7?9I "@-@'O  @@VDAIZ-$@@լa:}6ǩUB5/`ۆKU! 8)`S#JWɘ->92 &w| Gl@:H2 p'7dCM -Ʉs_vRBDN}$bw5E8x; I>t!AH}TФH'̏5DB^HR̷OM.?`Ga!}i)$+fFtXތy_=~Hgxҷ%A]nfUlhi& YtAZlu6ߤ9!#ZwŴO(-w@Hς2xO(߷6Q`.m AtlqZ9+jНq1nA4K@t@ks v Dۅ9pkx PtDP@!,U =JH`zF C&vHŁZP  lŗQE1PK53!I%ޓ?R(%0s6d1QrF܀gPH}1rl[؜QF f7Y0.ǀ9PeY@!,Y 9IHA('#JHq`20P@ '4`0f$\U.+1 h "3 hN'pD:! Oe "ؑP VZr= `ִp)UuҸx-j^(PKX -q \8.,h wCbRFj{RPSDp ({? Lj2 D[!GD~@aqX \x\vǁ>~D[#bz9Dr?7(cnR$ѐDx?@&\φYpl 'Y~il`dq?Ae^A8)b"BoDDxkSR@ QhF 0&P2AL@iy ĥmAkc1ApABh1VqmٯƄ#gA!,s HHhDɀ*\@ ™Pؠ%vl0|:;60 qS(@h[,AnN]W[ SwP@!,s H $b*k5D;QNM0 LpWEfvR1tLi=\aHB x_~%[n.8K06:BD{嶏K&A_Bp8i啺gEB,@Ёǘd #|BnuP]w\9yqPx ^u7@ (ZcŁntuU?aUf Ɓ)B5;9Y .Vhj`kReeB`e,G lfaVX!,r F pBɀ*\8H8 ;4Ï$h@DHprʖ  iJT .%NJnpt@QT=R& * u^2{ D $-ܢF˷߿ LÈ+^̸ǐ#KL (P#NrD:̗3gQSz֔7GYS3670{-q䰹%aCVy4"DWT% [JanUɠyB&:I&&n@!,r E  Ó4*\pa"*@  Cװ( `@SB,`$KcDrc͔#NI!х 60AQ rĉ3OlЉ pUiV AeaY7$ܬ /ؿ LÈ+^̸ǐ;IӦM*_>5@)E\G4鄤UP) Ig`{QĻwo< R+Ow n.jRidvk4#VDUsjoA:q߾WvO+9r O=A $qh JD)D`U0q@%Tu{eUCATSwhECmcBTtqBQSm\yƓ+IE%9FB̑b}cDp9\99WK|Go?ktdUj**$7ьWEȐ B0? iBù`0Dr51=  QА 6xZ.>P2BVv}tGtL4DzGɐR~!,s D4B*\HE.jLh Ɠ 0|(58@e̛87R`!'q0YP [$dR jB ޤ`uZoˆ8AڜnKݻx˷߿ LÈ+^̸QTɱgO Lj`A.Yk³73o6fh[ZT1gO7fCy&Z4˵!#1(޸k$fK.ӞIaBηoe2 ~B!,s D  D.{&0Ç0 p h % 4@ࢀ@BdXq$o\Y"C|3s!G ;AAR AC#ntCQd"R:O`lڇHʝKݻx˷߿ ˀ3[С۽ƙ"d܇jJ|AW-GX߾WD.p*߾P,3!-4te26xN A ڧR#"WϽ&\zS(*r}IMk |#*Epmpd=bkO.k0541akxR[]2ELj\PV <`׸ D9\';)@U3 bN?@4C * 5T*eCCauFU?Jr6TT6AT@yeN %wH:VCe6Gt$C[XP>䀘@>@;)*[w**Fg&eRK@ xCL^HDΥum@!,r C 1 \Ȱ0 @sQ  (vЀ \i`eG tHI8L(\xB& !37eCKRp4jSIsP]~ٳhӪ]˶۷pʝKݻx˷/LdG.r߾PNd΀ A'5 #DmyR7-;p#ё\I22f`9FȰC (@"{ȱaEQ:IR 96(pÖ8sLd9 ́ @@:Y2>PX[r9RTjʵׯ`ÊKٳhӪ]6,Ӓ YtL]U#E)W`X111@q MnD oj#l).E-0µ~ Dm |7G8'ΘLLUIg?\X*ws蔾9"e~tUvqf0z$Af }Wy Y7`$I:5"b  @MHd5o1@yUSbp`6@|A?PH"+L8gS"CHac1ML [ 2pO:,hIzMQ xDv 0MCC!a>l0u2=[+6MnGyh>.@T b"0ņb^x 2H lu !,n @(BC\p` HhNɀ G (S`1S.9 D& 0 s _z2)sC&,*SXjʵׯ`ÊKٳhӪ]˶۷Z8ͱ@+˻Rēε|T3m60tq6L9p})b h2KX`p@e8YcZu]n`I0)$5JJ"ɤy 3T0 qg !,l @(Ѐ2\Ȱ 4HŅ6bC LGLP@"Qt]9̓ rS@iT ӦPJJիXjʵׯ`ÊK٩s|abBDd"¥ ,sy4NॅN:(:QcLeBN& EEX*:*k 6lX` ryŭ{A "Nu ]Ȥ my 5ՄOo ?)Ά!,t C PÇ3F!WoÇ(0)FƎ CIɓ(S\ɲ˗0cʜI͛8sS L.޿}LaQoP v_V\Fo@ (:Dz 7ǢɥaZx`A*ctߜȅWE#݈@>aՀ} 8[% !٨nֳ:@dX@?tDnJF0JZotGChk>0* s,zQDp/,< _M|<ͷW R`@O>qo94]9ЁD6@45H׉u%pYb7 uw UI&>X4S͑F&G!1 k@WIwn!,k =H *\Çs8d@ sĉ#ˆ n80Ȑp$J+ö) i!B y@}`:2*h Gt8x4A\>s׈q9`a6׀zXs@&=86(Z~q(@QR!uEG MġIP T,?@&dz4tt<8@.4$suB%Pd(9O>3^S${I>s$T(me0Eu@pr~Y>xjse,fyf~h5lWpˍ)@ X؊GB.vg$}ezOςf"ED>|d*˹J:k6QPF_X@JhjcG,6EPb> Kc'.P<@s1;sl,\&J6[\rh)UMݬa?~z4BRXOҊ+*2$u4YNh,`SV{"Ha}h# Pwk>ڻrGtL&2%sț>oҪڢZPa.-!k^~Gm>g3.Bh"@G3 xfczr3E%gB<.)p:@Ɖ{#/! gxdS  +X% d 1BAi{ADIe: l'Kq@0,,'u!,B fcHƪS#>r(aŽJi|II*$bŗ0c!(dɳy0q)љv:糩SHѫF5!mӯ&MsٳhӪ][V$d^-mR bp޿ Å49l4jL˘3W֛ӀN0ӨK>:5׮Qathpͻ d&μss"OH*سkν౧!5$ӫ_}I0.: #Ͽ~& BIF# $,”TViXf\Z\di&,@Wvp)tiu`G+8 -*蠄j衈&{D3N¤Vj饘f馜v& /`ꩨꪬ꫰|;iG 1k*K&[,1G7T Vkfvm%&2P. 覫+/ 1M#S 2,lWHȸ1WLgw1n 0B(,0\:"a4<@-@ L7PG-TWm5PJBC _g-dmhhBtmx|7l%< '7G.<` BTw砇.WACn{Ӯ.P9`'/+5c(=OoJ>9n>,=AwH$|DH?pZ8b . !G(&&׏=|]?6! @ H"QKH&8!bH) .zq_"(2389c0#H9ь:!KtQ IBREGA:CIJ2@AKzn$ 42<$!; A%,g)Z򖶌%$W B bƼ86!8Ќ4IMgf#T!maE@:u|':ÕL'}tA@o F(BІ:->؅8BюzFA`(MJWZ%ӟ,EFҚ4vӞ@ *O# BE* &PiNr$ V*VծrQPQե@Wɺֶv xͫ^|]$`{=99$a d'KZv Q(>zY޳ h-;l}XhWֲ-lW E -F ַma Mr:Pxb?( Pxv@LhBv0^񚷼=z;U`xY/~/1zL83Fv~'Ik" ΰ7{8x_5>< N?lbC`g,61Q+hv2^>*:N2` FL*[YB>` HU0r6lLg:Or{I99tsx UHF;щ` D+Z0*`iH{Ӎ4+U NWV`XCQSȴ?^`AS_NfJ?i{" ζiD rN7׭ns9q2DYN;<xao`ϸ7 |"لFN(OWޞjAn[BwuJ(c${`NHA/pNx;%QU aOOOx}$ ?0Tϼ5{??z̋a(I21gO jxdOO1HI1H dȾ{_Hc=ɃPOۿyESz48XxP M h8XxC_ "8$8` j,؂.0284p*X:<ȃ70j@FXHxJLN؄PG( 1pZ\؅^`aH  ljl؆nppx1r|؇r pilx8z f( 08Xl: 09 jPX(TH  (l  Њ P!8  V p Hl蘎꘎ Xp p بq 8p `8 08 H00:p MaiʨɌ"mЍ&]@+ɒٌ 9ɉٓ瘑.99P9 pT9Q !0e 9I [9Ж!,X/N?H=zcHQƒ#JHq\.Oa‹@Ȓ(O$YQWχM-s)̙4JtѢH*MO?:JUX>U`_B3׮hw YV| h6݉tF) 2*p&xƐKu!xrϜ M̽HkM5"uڬٽ;ix}qQ8xZ$IK I`}oMB|rgwv{Ͼ& W`&ĀoH`]5׃a^aj Ba ("]EbA!!p+DE7ŋ:8@BIXL295IŌ]UdŁTpe})fdigUŚlV&[ M:3i33N:b14\E31LZ_ tI:d香 W`ꨢJꩦ* XfA'A̚2檓k޵k&6F+VkfJ1E@@Tj. <  `"Ny0lqp@,P';2<(\ 0O'F$E$|] ԳA-RD% K}S-ap׵0(NMg}PJM@t=4x -g7B! @!00RP ,2c@!,Xb= H6lLPB&䐢M1^qG ed6plx0AxAARJ9r0ASdxR.y9B4JuFPk`D胨% x3Sjhukװ  eL:&x;.(^:p@uqI/[X(Dy'3k։x dxJVi\{g ̾M /!,U.R>HzHP!Ç#6ć3j$xgW}ڕrcɓ(SsdG6qsO@{RS/u߾}JdU.)ᣫM.*YE|cǏp׏ٻSG} Q &F1Nj#;,P]h2`j?,fs\u!B`2]۲q{!  >&DE?DAڔ?P!] TPepHbHaV1jfp)tYjePbQşy3׌sO>?}\!Lss"Vȇ4w͢1hsNZw'0XPh%뮼+k&6F+!TA @0ARњ,1@@B@:1@lܛ//2@0T!n=,1>nJlHL. , 4 nF2LUx< PJ3 CǶ"]!TfM%G4ζptkTF' A]d= x7Fr;up6%k-F.@xBT`dž.!,UaA HlcC @3+6lLƒ :.z4a] 6mԄx1)Y>!ӣpk t P6: 0z`:Єz`DRDŽxLamU-{@\V;3iq'M ɠT ^I{@8`wA B[`@!,T.Q=Hy†JtH1bʼn jHոRăɓ(SLw0_=*cTD>rO%g :qordWbݪ+ׯ^-*D pc"dڂA~ NڹV L ǭp@}\ƝLʽS<C-4ӦS&rο8H߾.8qٴ0J v93'I<ʷ}tu $ܣG.;@УOKH(ܓ?58@xO> wM,D;e($hb(("mMb 7xHcqA!4!;TIYL29铤pEAVxP9Q!c^ʄ5T!T'# idE!Fh d ױsE1a>s'x0r7OVdHC`DOWz(w83VXA w'W`aAŁǰXp:P:lj15*Vkfv+k覫IjH$ / 0BѮyԨ<@⋒"z20*0Jl p0l2':F3R 袒@:H:<(lp19PJ2` 1$< W=,e'Qq=P-lvX#nz#,܉+yDm@qxMܕoxn䣛;T!,T`C HAlبcC @c Y("@]CLa`e@8Q#r,ȣ6tQm0 OL y@%05@3i&D+k0)R",8 @!vZ6:ĕ+2_2``WNP99J |q@}JzgL&M@,YK  ,;l`@!,T/R;HA=*bᑃ#JHb 1r?n~ 8Gɓ$STrˊ0}Ȝ9<ɳρ>~:`=!S?F19S|ʵk)}4U鏯Ъ6-۷nE ՂׯN!B v:_.* C(kyΠ?v,0Q}WØkET4ȀUI 2H߾.8q,tyM`t97]ï7; H'?WI#1>ɀ 7g`|b} AK@F rԄl}$D|(b#H&b]QtO.bJ3?( ֵQ)7cP dL.dP> "WX`7H 9Q]6ua]z)tU{V!y|*hgWU4hqhvreťfz)t}XQi]W*W@7v*sډcY䚅@Xع@P%1VM6F+Vkfv+jH$. 00+E,@p@@Th@T!8Б0<ѕ@@" ':;:D0\@Ȳ 0I"H1mmE#͆!Tl  7s-GĆTpvׂB P@R8=S J@@]Z-|s"lM 4<@v7`y~lܺ-갿-xϞj@!,T_E HQ3E$A5CpkXƓٰFdž H D6LP `HUJ3֤`y@[H9: g͢]kVMQ "%k`)l"lcVP^':,X a)BXnǛ *6R6@4gЬ!% @@53FM `۩fz`v ,!,T/R:HAw )\p=>JHEiܨQ?~Վ1`dI&S\yʖcȱbɳk%SѢ\)ӧNB*uiOCcD鏯`\KV"t[dm[e]r'[!x˷g٫as>:Rș.]HPDgFWSݍD)]gJkvȈא:"t `w$>-I?hN޻ϫO/$ -ں%\dǜG>XV 6kԥM( 6a`3@?o$haOPh(fqDňE!#Q1Q$S<DidHy#_oPDZ# d]q+WHT)5c_IcIf)W$GaᑔVP9hď?\2$%3Diȅ&䣑I!akPF0Ǥ`qjjj^ 4pskZdňi4z+6F+Vkfv뭴j1E (A <d !" 8Rt˲h A@.T`q d009t0` '`,s|@&S,t٬,m4NG 5jpE?=̆b@ EMO$W <.+ `Qk,6d! Я$@ 6<@ *,38nl@!,T^E HQfJ $H2jCD8CJ\iB*@P`&Bx@ ,AX*EȆ )1!<@(u%b,]* u[Le3we&Y uV-tt1)5SHc)RFkrp BJD,VԸ-(D[f۹<{V6 !,S.S:H{†JtH1bʼn3jأc#7\ɲ%G=3ϟ"8s@~HcӿECȡ{6jUL 2"[k@ ?+Y7o߽~U;g!jo=aŐu6@!3cެ3ϞCޜ8j#v'#AJ9]IP)b#}U;wyȩjޙiUzU`Qau9;3ISsAI Є/⹲y?фAI>*?}.#2CIgCB&hdϨA<8aMu۶smq߿)O_#S+7Ȁ0\yj$سcׄV?'A2|k\˓_$<$XӲڀ#^¿JpDـ ?o FVHĆQ Wg !~E'B!@)8%Jō7 G}/Έ5RŐ/B]`T DAREEOJ>BГQ5Qe[~WUxYӇTgiPtixgU!hIVq&UV4KqE(UW\G:F^qWq >db!묲Je!P:Jk{  @ Vkfv+h(.p h|; .௿, $H,Ԫ1 oA{JGիVbݚ59QǛ{y]˶-H_?.ȻW/߿~ @um%HA!B(J! .2|>LcQ QZuVf=6۶s(y'! b\dHu4HF|6I`;3@#F ]=z#A;j(&Q `9]$!I0`>(aNqTDsQ0s؁13P D`B>#h/؄K,@6BIF)5X?ĔSF'#6X>@фdh`lfpIߤDaBgd2fEX št#TekTDQ饖j2#V`ꩥ~*j6J=)*PGZ>;]AE*>ZkbqU$k`)Z&ȇăXGQҔFaH 0Ab &;5x@;WoofFెZԪLo ,$l(,,C p@@@!,p8,:?>!}sJ5\OrU_F N KKj`",A[.бp `1ySuX-:+jj*'uRHꬳq!|5^L3Ps6 @ (!,P[J H#ĀP@ Qȱǃh`A 0 4H4SDPp@ˊ ^KHJ!2eR 5@׀89MQ 8j0TA Ոp M $hN%K@ *L9f@Ə76*"UAV^E8@0 𩒀NM!,O.X7H{†JtH1bʼn jܸ {Qt!Ǔ(SԿ =nĩ'ϟ;c l*}\(jU?6&U?~ճh IO ߄%]A\$ǀp @X1ǎ#-8?ADm>!'V$! j(.3B 3.8aes:e* )bpHomn<ӣ' [}F]`$`ĺHMa@B2>]$ÎHTh!xtYZx0EHV޼ZK!ra>KhKDE;cPPl2D6@SfZv^f)4ތęgDMR5J 7fBĕvd/ {)hj螰Ai2`P9ZF;RAڌElDQ*Y!?}j`Q9O5j*;lVgE*4]a@`VTQŬ2 h"U<"L[/ LHW\#XıJKb^ 4i]xెg5>j!q&m1"kl2(,0,4lJ1!D 8@<A @PNSB,sX0 C]`@!,N.X7Hy†#JH:أGo=S(PqG͛=| q&̎J4H=cr飩ӧC^OrBjiR>~ +pU0q9c\JL)_́o@H󇲮Q,3ȏ -k"m5ǯZ×^jש0BB .m M|`b7Hn\~]n9j!BϽ_Ͼ`g]/8'߿je'ܥ|Ċ_Ea;FAdA>C8Xă1>F$DivX"Qnv"]MPv4"Q)֨Tؽ2"6F>3 <1CIde` ZDTM,jAAf+I K4K@}ę碆6Q!#5!醂6qП9ԥфz5DqzZQQx>*E`ګA0JQt sPQ6EqEQPǁT5ܦw)jTPQ̯ VcEV#WkaE+PW%JY aVXp|N:xuO(3sE0[a/Lx%0 NWmX|9sTWM59L\Zc/DY@}h6e}havqewDvN߈'7G.W~:@ "8A@eL@@T荛!E!l D@Tz:W%H4H:N"p@wo@(`10HD<hν@L=#_b" ;^tPo Z1_Ad='nΗHa"jpg  D+<?605 G #ȸ]@GE*&a* hLІe$. h4 $ !,NYO H(3EG ,p"Ĕ2f10$Pa\LÊ08P@ B2ʼn  `$ؐC2,4Cjf5xVPk`">c  Ly&܁ P *(:2(aW @T<ȁF Ϡ?V3 @z` !Lݺba5jA] (rx] h N!,NYO H""8c3/q@d(S,0 BR̠Ac   @lȡ P Jp XP„ul#+䘂&A4fr-@HJ`n=@]*!0GMϞ UƖM}rհ(EYүߔclzw)'%k0 4vA[4n;k !,M.Z6HcC JHʼn 3jhG)ɓ(Ŕ|bvϧSw$XOldw5'A^z dӿ|섐o7oÈ +>8@ut5xX˗OeXb<di0ُUPAEpe_v bYXdUyseaL870[=Ui1eVH2a= @: @Fb]13~")YXt*ꨤjꩨꪬꫪND!, PSH%9T1!P0NPd8, lB98e4,l;@溫1@ Bd Ao $f$dlo{0 @&̯0EJ $@C F2 C0鮋X`  @*)\tjbת! p5a kAz  -ۀ\A!,NWP HNPdJ!3 aCc@C A:*9L1NrbЌ2NtDNYfKf\̈́>L A4hWHƒ t9EÕ48*`V00EE):8XY /BELBF o `yZ ZtF  @ir= AּE6μ P!,N/W2H%_4V{z$HŋǏfu$bId! jX>1I&TSDtშѢH*M&E| Rp{?pi!A95`_]ӖBu dǶڻN G_:DHÆ#^_EV e 7dHϠ?Mz#PS԰ v93ǔ DuI Wosdu&IH #S8zd6P(˗ܙ,YkKܤ~}0bY2q(7)"& .`A!D`D!^Qt@yΆwEA`H"M14H/Rŋ4y 3DPQC0 TT$NFYqW\U<}\@`D[5WH^/, *EUXLC%4> WykhrHb&W@ke!5/bZ2bjꩨꪬ꫰$:0!8z.@!0SS8I`mN8ADd`{!0ŷ1ŵ$ #1[$@@@PA8@e{Q,@eLodh 'l0Bl#,Κ1PI E @˕:@ $sIq|Q(@4~k[0tT$ FT+.1 T}X=7u#}#!,OVP H8 b (d ‹@,NjS8821!30eʈq#ǀ tA$(_9 ' (VЌ)9*< @&B .:xȔ6R F`+pj@h81# 0@]#Nb b4dtN0 HL ˘3tɞ(nZL  @8^uD~dﱿ tϫ!,N.V3HcC JHʼn 3jأw Rɓ&{RetM>rGn z>$/}A:U|L!V#ȀWZ!Akٺx[OO\|}·pM$[q"X1aÐ7ϑk 2$g~&5EtZ )>$R{S>!Fh_{ڥpsDW3BH۸{^#HsEgJƑ$ d%!$}MlÏϷ`' TAbK4APA`"h0)¡O."C?Ms;(SSM5ʷU?oDdUaTDA71PTU @E_pE_beIUf)VyIViV`>`\aŜ(]!蠄f'`jX0(Y9L4MYdii*ꨤjꩨ*:@ !MD!l;:81*Nk[fNQPN00ǔ4E@A .$nl@fQSqҹ119º.A @tl h$D 0($p hXʭR!PN@AF `rB/Ǭ/d X. E2 ][tآ0hAP,3Ątܹp7"|#!,OUP HA 6pf ‹3j(f8`!t8cqKdLqc 9r8f&J d<1ɼ<RdːY ؊@!)Sf)9 8vЌ'U`0 ]j0)ڽhwLDn| K@0R@et: %^LP&,v٢ Pښ9ͼEC$^1ǎ#Cf," ,pʠn|gH$g1m:kFNgTs5UUIoײէK x$K.9J2$uL$Iӣ_^uK`NP~,yv5"_M,`-HIG$āD5ab΄#H#B@LP(4BA/VŏNEAETG6iNF %Tq?}IbELIETX 9pRqi{VNs\QǥVx)S,ӎ) 37h4ex{(9ILWqM WŧDxŪ ֪m1*kȂ!l,@A:81@b\-vۆaMeS,۬ழ0*Ln@ @[@ lHK-!P@@(|0oQeD JeAcq& $1EsePL5p;Eqr% 3FhdD `Wd7S /eM_#l]ptVv^.88)!,OTO Ha@a (pD3jX0 78XpC$0c^3F N2xX@!n8̣ɐq 0D'S *L2M! (W jk<a4c 0{"Du6#]2^ Kv c{Yr@!D2p PВ'Hu`k :a\ yGU1!,O.W0HcC JHŇ 3jأc!W"=6\Re=~dW0߾x{|ɳA|\6StӧXO >rٴ_΁? KvYP4RwHKod_B )dPR_?.K ?vA yΠ?yB<}bJJV26۶sޭ;F;SH3B"E"[7gytd;1]rk♺@?#%@$I(`h`79g,AT\'@{j ^AR T5uŮXPecX+]XzE#P̬qEօŴk GN`kY km뮦N820P:8Aa@/ P@01FO$Fp;0O/@A:L1`|2]!0j8@(dDid5B$i+Q 5ŕQ`?P1WVVTI&feenȦo mTI֥)^iUEZ1@Y^>*iBjiVi0sŢj*fVJJJvy3ia1LX\K&;,d2+VkfmN8C8_l:@PoK pN ث/S P0S0e;L1$>1E,Pn; 8!뀱O!L: pLIe2oF/ˀ@(d s7=q%5Di!,!,M/Y,H XȰ\RĐa‹3j8BBdo?=<ȲK>bN}w_8?}A"dS[.#s,bݐŌXI2nI6zk֟5:I!ǮHHwgHƗ|=sϣC8B# yȈ"5F2uHv+v^ER řg DEhoJ1seT fRe|~9@.#?J@Ţt7m&QV$TThVov*jrZ0~YT*?P1UW9}xR\H!2T`$!0GX\K;%ܺaͭiEl,9CP4\!l pC ԰ La F;>?!P3.aL98!YX!,00_1<F$SQ 3gPG̀EN=EgݵK3G0w 3L 9\Dp첛1O>@  B`|U@!,K.\-HcC JHʼn 3jx{QStɓ(S k)ꡲMF 4}ѣ@Wbݪ+׭H7UAc'Gط7}G~* $2@A0 X\_ƘJ䂐*"ҨON:\B }?Ό'߾jA )Rp|^>jHH>H3[3F‹`I^HN"HGB $1#26$!*xs`]` 6gP} ,0R@́-A r(K~ MI:#Px`5K0 B(5܀ĒKœ4@7@Mh #[zifhyfFHVcRr\V8sdݫ/_\7QfGHsd$19K\#Sj˒ ėfE 7`msW֍{ޝ T3DT>]P`AQ\Ŏ8@(a$$R3-A"&HQ!"a# P"IFZ@yKHONI,?H4f^!tYvc|;KIiI4g-CHVb襘ŢMJ E:@O'76q[Q>PDkjp!)ЪFqM>AM%^7bQGDP1ZGZżȏE+?P6AR;nXJE /\5T.gy0/FVt$<1WX,U`+ ZAPU,r<3VD2+WL3UqE]̲Hf#{&K5ܓ`(N0u$ O?V o]w%CR8„sC@ # a1WKJCg!褏>Ex۹焣W^{GL,0No`P9蠅LND[|[WG $'';@B[B@ao~B)@ TNPW.ЊBz v P? @ ppae8D!Є  0e@#%$XnxC(؀<HсT262{ @:Q~/"A^r< /2ؙb [_;dtkdeclarative-5.7.12/docs/images/WindowButton_hovered.png000066400000000000000000000005641476226662700237050ustar00rootroot00000000000000PNG  IHDR<<:r pHYs+&IDATh?jA?M:!gH@n@Z!!$l|y,òv)Su8X9X9X9X9Uºpy$Gp˚pd;Ige}M;l3],gܰϳ_c3`R.v) wyf p lED46nmr{|.DN(js:s:s:s:wffff,6 ZVIENDB`dtkdeclarative-5.7.12/docs/images/WindowButton_normal.png000066400000000000000000000004621476226662700235360ustar00rootroot00000000000000PNG  IHDR<<:r pHYs+IDATh!NABjE=PD@ b4t[5O^,bŹ2Pz4xB>tT_7;rk7ܳפr6+np%qWTI]/1^joA齲6.F #}O_Ժ5^:юkqF#IENDB`dtkdeclarative-5.7.12/docs/images/WindowButton_pressed.png000066400000000000000000000007431476226662700237150ustar00rootroot00000000000000PNG  IHDR<<:r pHYs+IDAThٱKajCI5TCbK( A[KS8B84?8EќADb6āEw'Og;|{>7 nIŸ`8:`8:#^G+ŐRn {-ZuZC:,/J32[!KE=EDBD$-] njAUehM ͢ %,y |Q]vLt6|oCl0'l>zc{ OcQ^+tW\ xlg~'"'OʒANizhG8D ˍ~=)2 R8:`8:`]0c1 iIENDB`dtkdeclarative-5.7.12/docs/images/behindwindowblur.png000066400000000000000000004423541476226662700231030ustar00rootroot00000000000000PNG  IHDR | pHYs+ IDATxy-WU.:Fڧ?'''OC"$&1 O$\|'6O)WzzE/EzF!}9iNNWGZUc1gZ{~?8٫j1ljZ 'ǝ( @RjRJ)hP)PJ56DTf -PTZAT JU+MP*DTb<`*j UbuO)ĉ)d\TDA_)l@)JaU=j}F6m@B޶ݯTjX5A լ)` 4Rj6v.6 CRgh=TJq6<4N `BPR(ZRM=>| J8Ϧ ja&?i T3[Z:@luF5&hڡg)TAAشX5J)PUi " Ah*x qW *iE vOBlWڸ55 NU* Դ]` 0s5 :(@.Vjjv%VM{RXA`B68T+"LNT6` A5PU4Ю5׮V 4TVf#TJ)vݵ4*)60DTTP4X! t@@PPVմ""V4j *PU5R]m Slf jAavׂ,LWה)PJUkKA XU BPm\P5Dv5IUj*PP*l Da;x9zR8 h'SlrXZ6+TY*PXt8] JQJRB5mGc6ލRPST) JU+PLf˽i@ PjakLjQRM5 iکkXfc)o*T Ykf!MU TSB6 b vª]#U)D@**PJjn,0 v)ٶ Tm(hfkkSQP)lh9Rhlhj--fcT3ֶ6Ij`Վ"NT\R LfMnU(*@5QlPaP6 h0iT0 gOYYf 4U5it-`X)h]mXzF!b}-APj68[ *Lj(*T@ fMl)mԎX{Y,F).'D&MІZTPXLfٌ#Z:j3p*@Հ4ؠv3@\KNZw&(ZTXU 6 `vmۍ5Ymׁ*6:jYZ JU8[m4(T8ۍY R6m]c4v-lYFFAU*JMU{UN+f  ݂+ NT3`Nl"%ĨڼAj64JMP"ZhST  'mDo*\5zj(`DUVjRI0AN+ThPXWSBh*UTӵ<)+TfvmWsդ mgh dpz#Nq{{z˹<|ho w|ʟj}4/^ ,%=?C}&mDTK?>wh bٳ4Tw%?ڷ?GjQJ)@h^3?9W)KWP~|Zy`AAAAAAAAAAA&g_r!LUW|__B)jP;PPPPPPPPPPPPPW~z޽O~sJ/oOM!U4W $sv¶iu=?:nתzOczutAAAAAAAAAAAAШ[O}r焂j6:gwNXPPPPPPPPPPP0 \yxPM#w7l`JԂP ר#}BO9CJFsnp+ fzy[_p‚pM_n ٽOsqCV0N9nw}I'v6euz(kMs|w`xܳݻ|tm}Sgh7 ){vÇ)^]kc;NȪLՑ:V󣷽x/A8ӮxoxUŗoMw S7:oh7go'7z?[y9۟~ˇ+(loS~o>pKNw#gW']su6]/y֭[5 '=wAt7o?zݝG?_;GAAAAAw񟾸?ݏً{/|-[W~nm?gB[׼ozgM'MGg]?Փ/x_uYſ^{9qG)ou #Ou_8;~K]/{7ĕj޳Ougs։PFV'ܶ硧cGNY<~e o_{^~/ԏ7Ǿŏ?ig|c|)((((81O~汯{ŕO p٩{za+_ GvTWԣ>7??%? /:kͱmu+;cGl3O?军"ΈjenV*X|.n=++?y߇|Sf'}gTw='hy͆ /8\@yШR>g^xLsGw Wv_ 7yw]hAAAAA8ٽ-_]S{ۧͤBDfV}ʥ}5 ~\5=/r[ρ\͏Gzγ.>}{}o{~;>9/xI+eʤj&+{z!uҖUu~_;N}CWO|ҳ H!+(((gs.)O\sΉC[&D8G>ۏ|jpo˜1|r +g_zգ>_r. g_[-;/G~_{{Ͼkoqeծӟo#w5/}V0{S~.~W_/}{m*8v ?Σ Yyӓg_veד~~)/{ox귿r/=g{'VrU5—'>]M~!RQPPPPP=>iI3=&+G{8q}w=09[ڳw8Xu/y:A<,zB}CG]yIS\=7z[xGGB ={{>xK.<8~nڿ} ;o{xS zB[99 {_yޮo=q n?<8z_'OR!p-o߳{癧 )_Q?_m?~ZhAAAAAAAAAAAAzM7_wN}'֍DŽo@)5UGK;;Mt,©k}Fch<2?!=a/4_wltOsI\8{|ky_p{3PC}]ST5L藊VjD%tfpO&Ú o';6(TT6xebQlHu;""|r`G >%ʪ"~`$xء {QmlF,6Aӂiv%ˁ\"_vz1v*q+2HϋɊ'}se,펯#?CV[3E s DfQ 94'RaĘ≯Ghɸ,!H *[ii6>Ɯqң NMf6jh0aI"ePD vZlPTs EȒnZĻ >]%HN`Nީ|ڻN<݀B: A(!NI$W]C3QQD;&|`h2"s!ؠ m ǁt.H0YjR!{u =sau5|7.23^;Z'E @G,‰[ "ǶrGZ6kA_#t##A:b4<@NhnYoQu6 ׂ\7vh6Ld~1kw,ȰɱIgY;.< f%εQ+PCWO1}OHuyGeU {"t iA+:xuV[$ō>FI31^hfkы<~m Z!q=46u#F tb[*6ȇ{blPHO|#AL6(i6h)~RUDSO6,җ+7M<-mR kh) g 9:Z!R bRˌG=*YrKC ib<|,݉\""$`Tubtjjm6H'w'KBfX;/_ϱCe{L$o9qB z95@dv'a\!+d%ѰitL%S3'\3]{L6 (*3Dg 5٠o<,]N2d;$XŇ%dqS$HLVv\Bd>9h3L})Hl04oZhXaF ;F}Q kTڇe0.l68( /$bej0 X y0MHt1+@ 1 iǥ= kGx.vA;f1%U=JǏPlAR10X={2 *l0ĐWG;ݔ(kuEh zD!QNDF}[yWRT _+"鋣"9=`dF6c  W? _ñAݥ1Al0I+Y 5!׶C.wU^[.#8~V3a .(YI߾/j*e:c/qQM^HUȋ{8|aR-lP ϙ rebĔLO156$c] Clebϩjl{Qc?醝EltaB\)n_^Ce6so8P ~Q-? ׿Y M@lu6aY]ّ:LݺL7PTv3[a>ey6& t\ 9e>۝U, О29}l0Ocd! B8+ xI̧wxబao9l,fbm"_1ycBFYJ}*i`ҋ,ОR%$\ 1.6r+eWBA߆er\Y[MR Pnc3xhz?mrq5nQ3V6WVQΟ.ۢVER!]W,鉂3 tc-`M!-rGR,6(;&C,섉8^D_;D6Eg@嗧 6E#`xo!%t,mktlN)+jF|fJ:"yI\zcF耎 O="*l{B v/CHrؠdQ#``Te:Dc2l56ڡ%GqAUƗg1@ء< =+ueшbpYN/R,FH - z-rxh6g{@^!Myh3-9Q[+?[ +ϲrF"]{LC܍8wr#:wHt%D薵|7&wj׸V*o/q8\gC(YzA~-X OeatD+LvNS,骱 ]p '#v';}[&3";s8=e2:Ҋ1Q+Okd#!!LhML_Z Z$(lߧE6CpRAkT:d<`4Fuaen!ֺIO*s{Ԅn BaXo×̈\MѱA 0' K~-XEtF%=\+s/op>Fo@aNԳ6NiG+tL|Y3cܛs`T,aG%jԈ: R9b HB1g|E RV"~Q43}s:$(: _0:D2\!4)B5_v֞'˶Fy<@ǃXdJ$`mduB@U f\ G7--ϕӎX i{oHq^eHZG,װ\[+)t3'X9! Ԫ{D>HQN BT "bl66`R ӜD|64 BlH ]ϵ*BTxt QS"pQg罹Qfp /#ɾ7Bj>ƁPd~lX`J 3,wZ)}IvYksMۊ# -y1 4,Y$g5 d͝E12߲45)^C?a-y3_Hq O3z] _C8z脮y +b2Tی1dWg5UN4rF(T)m c ={8֏ΰIlf*Sא=U'9n%I(XŐEb؃Wy=VTȕz$NQR =GГۂMlЛZK(DfG2H2La4,rM[Wm7 cdڣNNi>n =F^GLkm瑤ݣ=[LT&"j7I,$eFl0%tFo&rb]nK!̪XSMKmzS]E /cDQ@Ybw}@i.al [!+0(&;c~[GT8 LoCmܦ(?N{#]3>Klp0Z}9^OCAk ؠT_!t1,U쩇A^qs*vaT#ё8㖎y' Emlw+0VJᰯ~VP`6ٟ6:Y9 t$ܺ-506(EFԻ:DW#I5s.7"¨٠/@G}2Q_;?CmŃH9\[$V}q׶H"mila1<)Xԓݬb1izJ6ccwlOzʫETЁ#ɥ.H ^|p~SjdϮSR]i`=MՒ vQluX|]On$^vA_ l?QA/AWH RAkrUa.s4G޳#QRr}N-7fb/RBi+xZ)W\#ןC 8n]Yb *觧:3 p&FWCE>= c :_ G STni ZLM #1bc #N&K*HcIrvNCϒ\2Pn^d]X=(3=-̊T9rԆ<2fsB͙Q LsEZ/1&!I#kpƅ 穰XyJJ\ BVJV0f6(lk6::,5hHD rl3hX#WFNHdbaKp{,R{F#WOӛG*k%Vv,g68%GgY IeLY'<0D -j yҌ\GgP+Tި=CI\r_f;$`P+%q44XZ6 lIzZ R| ZD;@Έnr /FmijH}R^_#..&BvKač++;Mg*%BA$tۛ wڜUߤؠp#8E<6HeFMi~@a"E#A6(3y7HziƾХ°:|" h`Bh>DסFC{CٗDh sv﹇bHO.nBCc;7^fC]N?d)T 2  2"6@͢#H2$7iZ=nutyAF(Z.SA^흲01.y ] ׃ԺkwOiƐmu|YiAdRfh(MlAɳؠMجAb[Тh2 ϟwo$Pl:ezX3xw=n4\oV`!IyO+juSe/O+MlA= \l%; _9' zwۅ4Bۡ}4MuȆ fv4:Wv{q Asą,6 4ʱA /6(b!&߸BY}g!dqHg6K#v|㏄7SRݍ:Ǧ {XaB5?"@SJ.Yer˚Be☞C6 ED6daC/ 4ʱAvo޷yl0`Э>h}^ad+H]^ }̵EWa/m>s[̲).dHg4}&A67zh߾ ,gACmEL^wPdlP biq)$p ĺ4?Ҫ4ptfڹxyhFX=]©D 4a&N?͟lPLO%qt # IDAT!l0(ok#%l9VCBp~_}H(d_pf*l0lX9(UeOq g9MDU:ȭI[}_v j٪ABAz"A)"e"%ͲYH S;{>#$2lj|FDH' 6Cᰴ4u!6D؄4*vcǩ~bcKYFVK9bՀzNH4MlBdЏ!^3Dl!F"J(g`D `l7E|6gSCiXb٠3tj *K`]9Db}ʛg 2& R+y-]mE#Q5Q!?}Egm764@SyG|HfqQؠKd9}cUNoCݓz#A۩o&y+p45J ,i^KRH= PM ?6=!rQCa,xTIutAF]ѱE=\g‘ZFA sǕ3$TypX ʺN7C wvSXKh̛ ;xTU1 j᧝d' !|-85oH )Miz QZ=~ 4"7?OB2:2M$AԼvj F, @:),  th@1їؠA۞Y8# 3v-dbOmVB\3)ɢK@\- @xFD=ؠrвrk3@'ӡiƛ6.>EE`8LYkg[.06OPJ 1/ra~cjQú@j”#{ّz x[|! L]R'-wDG fȡ4m-үFqɗ}LA^q` Qi& 'Ca$H,l9x_oҐL?_ fTDd J "+zG7&l܋7Ud/Mw*F)%!`=Ǖaޒz1A B)lЀؠAtD6H++6hٸ)J;7 oȠſTI7B4T䒴ݦ \8"3t= Y<<Cy Dq +ҝ^pec%}I|0 F;?h FM9Zaiλbe)̃dlWT('Q2<LL|i 4 4R?Y]M Ϙ!]h!fQ5gkdYD1 <:78?>HjBWW qKMrͣA XML=1+!l0!#$^lU*u5fPtutTd W8KnF2^ID5o.~s[YK37 ^;'kb9@$I`a(l},C#q7 Y9IQy 4AƉz锈)SYżo \P]ymk=38rV8ʆw4} fwH-e2%YXeIʃ$Տ %wq/+cʭ26׎1x\G,ĺ_Ws.0m.cr2+q&Arªh |x:G 4ؠX:6(O!ß 7lP a['yE5ِL(ZJi[#"<;(dӒv͈YLTzoՃ8FhW$@$DE&,NHBUe^:YE|߰Dξ(EDa`ȈZ X "㇇b9Qh֡Q@ E!S],KE.me ]ց#Bk?a`篰= S.'+Q_sȨvQĘHIxဌ[̇@r*DH!2JRA/If\ ,U6/Q167U{Ŏ7^+iA =k̃|V'y~ p{*ell|YՈ0@&i*$t>e7|FA> 9ɯh|)RA̔YZ`x̴YB<1-I @=Z1ÀҐ`AiQu٠ROD:366gd7,6V#uS |1c"ϲdӆ&K"~yemtizJd s opYpAhwflDQw** ֪ipEz3Fs؈=c* ?9L䛢Ven5j*}|An%A|4Oh=tC!E ?,*{bޢX{;k!E1Lj4n xaK1vQTqɄ7+G ="p`"^|,}jO4lbRd;0LĕX' A{hHO?"^pXΩU  ZBEe'g0:ʉ/MnFy͐~٠=a8KMA4̠2f>l!ǟ Qlb_,.C pP zq.e=i$71,M)Rjln뺨\4rh$^$+B=C H2fdH;Q%:/Ş8H:c)`Ș!NU)g7L< &Fo5q y A o6^,` t7b~J$`biлI) nCJ#D']cy3AI&$APt ?](7?(Ar jGňqlNg1S|fK}38^L̝m/@Wn{^h @Ђަ܁-\Ot֯V ðͭ#THO Wzeq 3?6%RArAel fAmG·C5l!El8q ,6& Z&hiǀh}3IU$w$tB( $AWιhIfc(>DCtsDC1ډMgw Al0f=Nz] Kz_ V3=FZQ+|I JpL;#BMa.)M^4_83j 3!Hl0R[ +B㏎{ؕY4,\RpEpؠY1m'^[xTL&^ L?b4eX/lčj DrEPRMygH2YE)XrF+G\{ʨ )MAP`.H%sFrȁ b^Vl!:[ 'f&T`7< F1%KrD9-=2*capG~y;۬n:8_L8y`6;0Xl0NǒW26(Kdr \'%9ct.YsH`“36fL'p$siGg-pE6 C5 l##dtͪRRu]g!"3K7LKI 9hU&`؀ )f~:}tyi). )OT#TlFØ( KӣuAA%g>td6Y}\ܺ^C=U-{TQ6hns݋3CZaj6h;k5H2Ƈ_ZڃέRp]s4mQKeRKEj!qz@GҎҌ 9|.lP!3%|٠CvB6HUPfqD˼|9IfaSevm&] ^Ԇ0o`4~MqGuD"F,&dilNuѬ@ULrf04Z$7t(kcH7Q/ W y 7;Md{ԶFگ| td<x(^zJEDBZY>`rU)aϯm<ͥ vg\ov+hg5bl/~6Mz0 >bLK)b0Hv[4 k t*1ؠu2Z6e#/PX.m9ҿvBDM=F8"8XAd)o(q$eiF%$izIVQ7{3ke(n?m}[u֪c^î_&h‚g) Yhc>Z )ȣjsC  Z ֌پv _kb3}pʮ9#~X2:?!FIDa*_.4L2f2ߒ ֐#ȶԳr@H.^ɕsj=\lTjQFqAsKdGHX]QM$h MEd'.<2S93:0bؤ)p0-[G׸2rؗ5DZ>,tQG`&H-n׈,Cɐj Z.B t o[ӧLN( ٍTSZgneK$2>z]2&ˠj碤MJC&B頮m }A3Ԡ" \2DRҼ4~6Hۤ"}4)4*|A ƕӴl"KWjB~4z F\"]~ j5g2Bz k oW2vMorpے/:h^`!3d 7$`ۂKd؊l5(z4B|8$ƥ7KXw;' rbq,t A=p+a\ ],Ly!?Xj ن+M#[ ABܖߌĆOԂu'Cj'R9`0LwXz(v./RO},AmR_}d[ݯA*n LV;r[0d϶]ӑÓ7qcUyi0Ȝk[٣IjB˟ͪ"fj^:$k'"lv:]XX)6&\'b~"2 'o5 IK';wl\1eQWNlԶ6 d~ox`ɨl_\VEP̧!u7 a4)@”G!j`ߠO$Gkfg3YL7z=Ȓ %E([ =SDsoebL5,ir%OȞH Bb2=.FQ-v>;N1Z>UZ JB gu1PqG+vաP[܇$6iKTVw&3m,R"Ļ:`a޽tOk:sI?u )^KZIH&d9 eʜ ivh̀IU$)ޣ[įG;6 . @/VHpR .9'5:[54Nҏ}&_sDRzո*&hЧA)2mMjjz(p߶Yv%= | ^-2Cw+xr)h2.nnqk*ja$cQ'F )2F/Q,}yḑ%/yR`-(OnZ+U]Q,®, 1(袭ȑ+V~BU\1v?oʁ|Gw&Kk1 r@o6+Zh= ߴrGtq*`+((4Ų3ۀ>t{+u<|ҘNWf1N:!0aph0,ՎzFCtYxeU4Z 5;ǦT dC3QR_"S/PG>KO{V!e*>m? "[BSgMlz:`in˳갻~G̤ S!åwrWD.g \ݼ#ě)VxQP3BہN_䏉i]KTf^nAWp'TRn@v`huge %f9r-y_o$}A kտ_Oƍj)K5qdYe-3bR2f3Mq4x-MAm8>k7|K4۸ֱ/t.ϓT&]mBhk'th9A1ov)`PC$)94vv`ˠ#vAS'r/aQuikF6$]3,T Uߴ6_CQf>DE?~xIN ӗkZ?;cm]N f%K-R?OFbE14=J>M ~>Gb[q.f%g&LHD kzkyAQcL pu(.ye`#,Kp`196_|En:I !t ~Kю(s7{'{ѠNxT{|G6jLn%:E ?dI'⾽Z37֑G]\ W0&A \b< 2C7:L n^It07N؝%!,8rb+HY~SS41sje:X4$S-x= M&3ފI&qp冄~fԈfɋn%aӋEjz |m<&^U~җnēZ֓Λxm =)4U `*ptHU~D2&͍CL"G\z4l@PC3~_nɲ: 'pڼG~_pZ}jYց/͑*}\QBwKg`(` j'g`@iV, !yſ:@Z[+I3L ń?c'>RW"Lj  12+t O@GhRB/Ycē6FR/,$K'Sҕ8#+- ʔd#`)vo} f\άt.x4|0`&hI_Ls±`K! .h0BsРp$w2C/p5 GSoA R#fn~՝ӵ Qo 0ob6-'Ѡ>=xD!r-EP#˽O+ 9{r٢r-g fZ .z^$SֵhN׻gGit '87#x #}8v1 Yh u/UV5h)N%\-by*?#h6o/'\C[(]u̦ɋn0`?;Bäs^O֌rHh, WO-Zm)zj\ߣ?~>Jm$C]j"@J_Lu:`Q]S%V )!oٛe1'^AimvTsH>dxYjw6*hY4 \s48 vKE5+FGoNY4Zh<|v¾1`ѿńro͡\yh0hnB5 $@ y|mF3]AХxoΘe!yZtVkC{ > {j4ߞ4x) F`/?>@. mԟ67`)]R i[hI_LxcdLC<4* V-ϧJazu8f 9d4 ~" p\=hPc9te4{w GKk,A;o}Ѩ=x ' HE)= `cfetgQ 颷3?dK价vc8pA|zAQE4xŗ_Y hЙi&MR6eʊX>!EI A{LN_uܣХj_w9<6i0 6hH4cS؛$γ"6p^GC cѹǞk=نNK438*=߽mI͋`ba<nXe1" *)exQ0vu(螈N,*]{v="Lr%M;{zS ɲs҉/mQ[O ݮ̎i9?81qo?Dƺ2yr34j  +{1ij CPДB`v|0`E")jhy >`Ƚ03ϔâ8Z~Ǩ#ÊuDvEsu'6O`wYlZ2ӛq5/ݗVz+lc#\ Vb5 5%0x`heH@9&V ւ°[#G''k) &؄7ul\upOQF21+=BIZ1D fb?.cE"UY4ܣS|ɿK=5+I\zv\-OyW`Hԗ[ Q*$2)|i"wfbj:k9 #" x~d~=P* N•2XCGSKaјoxzQeUS- $BRJy:@S0-]X9%nX, l]M8ush%fWAtq6\fw  ^/bjIa72tރ`ڕc;!F ES(!ŨI~ 8Hdp5L?oߙ^s2D؇K鷢A >E-xC4N}ƅșC|=F6sa3yO:;V#+B ѩͿ0!QTgNᮉVh"C̚!#/dGORW0Fh3M8ܹ;s;Έo$k0dKe)ܔ a9#?&A` 4(P4_䲋 զVߍ̀MWOx5B- dɈ`_HDdxD.>Y 55B ^'مe dѠWNNl'Ja&*o, ޢ kؑ>rGk+٣V ~% =DT"X+ 8P A)[ )˺2]Q <s>m/v*;$q[^̾㝂`C[` Dˇ#g+)p6S!U~FԚ/: f{( Yargeہ> ͸n"JLh6^4C8Yq5r>G&ڤ Z&#MPSbl,+6v Sz Lx_r8'"-kVWM"1Lj'漍uCUIu9v{6?JP k<-_o'¿T& qA. gXBپhI5oj4 ˹VSMh0 @Jq Cd̺L4ï+L,P?--~_Da `gر@y!?oO<À&je4[!S$ JQF8ZhU1/ٻZW?($N{Z .vh0“j%{TlG? Ӯ] Ad8\ŅY)W6.>h9P7h (:Lhꨕgl%6}-/ZB+[nu$Wujp&8bs_poۢU*_7*^ȮNgo]D T LV/}i&{F1VM; #UsRg>вed Zʨci6efK3a"P JrlldF锭'W?WPUP$Q?P>JMmL-"G-"(5k͐H0t$nǶ~+'ЊimYs#vky^gMK(};AymР8eI6%^>OCA!kdAp-X7b9u+d 4PcZ0 YK#"¯j0@ o85u}24{ 4Pi^\G# ->G!8K.ykB!KulrzϢ14Џ1v*+Ұ\4*k'@N)4S]ZGszjaۀNlJB_CW|.He &}H'_ty L:R̝ZV⭼֚:|7dW~J l QJ9}AV"-~9$4x_!4`|}v29A34ز,S2)] :BtX/:&Do9uj p2>rip/1=wYb' u*ױπ܌͛ug( p`a u DUOa^(3ڠQ<^}! _3wݹW2rhB_|!4W++&2`ѠРN4VI ,: SWϋħ-]qVIaf^X'=ىw+`̌ b8f_Jŝh5!ˇ٠&;$@"KMjX (#zK@4/$Õ=ӂAwn_f^JX#2A\QT8KcXYƄSsWh8Sam5UO֜];&I$>wF-t`]}T 9_9czT@9812~ETe4;M廊^AuE<$&XIq=؄jVŁr&$JkTRԫ)/+vBa(05[&59La -|su9سrCܳu ~N0AeWu=jD 0mz?_)(_D-'ۡA^ r@D,OhWBހ| tFlFQo xY A`}Ȕ.c2^/πK'y6L @Oё:ׅ#ಎ!'p%TdCAX::Éawokh0 SѠ$N`.ʍ vxvT u  Z:T|U5iZzV]J^DmwWsKsim ZkB &,rAx`^OU0$h<8WYRv%rK+bVs!pQW{Gޯ &4̜5h ||Rs <y)*QU64>{{u"-"hPVEc #83_LcxOi0oM?~ŗ>4Qs8x ۔lZPn-nt1jSA#z5-*e8|,+ߵo%9V~~

dHt28?L8;Y/3L0Ÿ;I<M--@FR*GO-}(o},$}v'g a'%>jgM@JF2[A4C2yO(/&heߕv-"BMu4H*'bZ4h;GFM|4M>m^=ʰW ]$q<ɐuDŁmjFCxt"W4IPSLa[]B)vw#Vt4V_RO-.ǝAa *Pl:C $KWK+cRc/&9tvg A4M)iЈPh~k B/Dn4#ZPl"gTPdwes&74dS OFSAI [":wnd/!e^X-tjK`k쀌ҪN^@]PJpr_?D=l)m Bń1H!]I*j$ ѹ`0" AW9X<*b m IDATh !xzfRڊLGB'&DlS~ϞB_)9dY<)QɛGWVٷHANvtU:q\Sh*Prk젻:J)<_kvR_l&Od]ӡm[kA{%e"mxb7u%+K;Ѣm+4V`ՄPP3 gxEM}U< K۝pLFtB>q,1ڡALC? [%A a% GӛgnpM_( c O=Р+ Z+x4-C VѠ7 pmgXR*>f*yWi|J/I' )=+* }aDㅖo]pOoZ\> WPm $%wLq֪,\48i|?}W:7 G,WRt:N2l* CثVwLU4?z9fIh?N4nddLyHi3OvzuH}*%n k I?,$lğMh5A sH茞A+<<a4C ɿtOiJ<ᙜkVbNh0H22NG[2*!UM,{Yh 쁢U["B&X?x!' R簮?('1/bY̮͘>8[_LD,el8q)l]Ɂ78O6a Hv >ЛP:(oZhK},ĹAd=|ۏ=3 /,EuL!h0h[qp1^WV9W@\cuTD 'GE4 uFZ!O62DIyVbZ WD;l OÚ=$E4^?2Mu?ѳBa1 lL^TKXק^ 5|gh/!k]1|'(X-\}VAMA( 5v:fy~ǧkSCd2gG F潌q+q|(Λ]ٛٽni}^DBJ_*6W[8I %!pv}YxF%MbT霬ZSE_E^&OU((Q ?mIU/Disb F$FlP8*fȈִ#}s]g)[ƄEw>=Ƅ+{Nh0PwէDWf9s+<]TI |ߜ~q?sI*.dS^۝?KYiz9Ƒh1*<5$A@t4֧%"ZWJ*%O^rqJΩ 4X7aBtha<ȥUl&,jSvO;}"f0]ht"dT^\FG/6TkR< dm>F|<ߏ? ;txFetkG>:8X_^Mh7.6/Ѵ`^tYhPj~M>G` )4(UX Pa5["`B m1 L8ύ Z=::8mu36Dk9 r#h}僔 $'?+LWXԄD4λ-ߘH,CA )sJ Y;p?RgBvO uER*]WAY(| DEg8hu$.d ʦsIX%^gr8 Yq8]p2L{ a~L)|)hi4.UP_mfn>;E =TK2]8BgpcdloiNaf?IJhvҾ-ilg hЄgWvbae bΡ-rK G}LBth/0orAoLԪίm@ݫ/gx:a39wuI#H2khp=H_]WgZ0H^O) \p󭆍q7mslI$O+ۧ Q^p ➻lp _( }")׾_nhpGq`R +0x~ JY0*>kRHw}ZAxkP_$`=d"<$ͨ1D&I(4%;€jGJlXW-q@M+yJ)?Ҡ7&Qj1"4Z!E 21=!4Xz Pw753Dα-A6~9`z5uou՘syso |5vI-zU43R-Cˡwh~yeF Äi4v*cm̽!k6 Zg]g-p*d^9+VW"BMnUw@ru2&aG14h5bwK&%=hС5 JX%ܶFq2 zyn4:Aum_Vh" fkJ%tkk23 "cȽ K*/O*8u]`} ;@UO^ø /Ɓ뫛rpAEb(SNoI_Lx卍5`uxV,A g&Llu ;v9q<-l#w[K.3ht8E N[ Bĕt42 Mb9yA$ү0H"(x#-8 {K!LqB؛%iL?뤰rBؘizb6TJA^pV+<^ qy7-%Ik#*"ސ3&:Nm-G ̷=]yMpKmYNb+cWRlcLBLF,T c%$(iZq?4kJ?I^STK) (ZǓ2*C%$(#5䚎3ʉ^}l/Tr}ٍEXmEQƦt̢>w)a-R7nI"y1H~<׋?U(R)=U>@|94 C2>A!VDDE<4Zh43:w127t&XM24{."/ 4v/!};t&؎,(E| :tP>MZ~4(KF2n-"BxTHa2US9|&}h i(gP5=tzVH{F~yQ<:h%} ''<6rKr<"n?xm)|5|i!_ dۺ t_(<"R/6, JpNՃbZBw)ԮRc8yzpS1!ΰٻxNK]X'Cg^L69P4h!Rʣgq^B_L!n*4Jl}KD:+hm5/ظ–D6"3& 8+Р*zǗs7Ŝ'K /*1mju>O<2y ͏>k ~-`%(3ƺ w[J㘜Uő׭۵M9<㔃ʣ-"ϡ#( l4Jh rʺtM@fQ~Tyğ]/Y@!`E.qi(chP4mA[@v)앉[(IEPBm?ku@  w5 ~xSh7}-)wl 2j4!@1+EIJi4{^OEx6o[ݏ~P.$ЭAvXm~'M:@x} j'9WF:$oTzAEaX45m@eku(5Vfx2ofV竰2k|"$oj]$ȩkQfYz!PВMnd5-*PۢSTA!x'S$U6d`ڦ-sMH7w8 '{}Q@a%NoV$t3|_m'ʃqKqchMaaPV_h(bƟʠe}ƘIVȌY׿h\ni@%#Ŭ\k`'!ε&&T;ڟ)Wo/4.hpL rU P"Uh0& -r]Ioϣ4%|5JZŚ[(5/r5% 4(%ܖ 4?]ɒ4*g@\6d!  :1'3S1Y?dK OAt|h栭ŒZ[)G4C tJ!3,j#[1-˘A9:@48$8ATrf/ $ޡ3)2nW8N)8M\4:Z)_$euB_F׉E^d bLuѠk܊en=׷GgTQO:ކb+s݃X6agU!9^F*_7T5ª=7[Y RQjh>I6`adO7BNBR t'Sϣy4IJ-uB/ַ- ܌-m–%睭c୴-i]ȳNDl1yinߥAǺnhNn!J>4豈b9n-e ZX+\tքѠېN<) yJZѿ[h򞽍%EmmiʠyIN, P"_Cѳ F*ihU( ͹H ObS:Blj48a.j1<ʟ?_h>d4t=7&gI@^v30Y_4z7 AA3]q5SmE\4/Av\I )9bkr3Z0;]ڽߩ@8z6Wa IDAT,g-ES*$e|cë J% qVS.!4#7vP+a#{,Hff@qM"7{;g:auP%&buUib/&:ti2,[aZ Fx )k %oD`݉}s[+gˈ+[œt<GȩӗUC{Τ <06+JHY-]~шq#@ ^o?-传6sB inIZcVۆ(H9%˜3 amFB5W^Mc,VϼJ nc תZ St4(@ -t5`Jy 멃3\>b…J/cv aiyD,]9:SV%IժSE I׵`T³ʺ=df`x*d? N~ &@qs 2Mhza36L4聋fгRyI#Dt*[ MCI^VRE4( T\Cl\ -,|{Px4F5H+  o1 hCp@#W1KLM'*)9- QR?(^;`ij[PHrHoCfG"Iq/f$'2oUV\d1keM++AE:%?N18A <(€ hyI'>?p8gI; )I}VzP A&NLl[NۃqTC{;_ }jɳ`c'*C5V5ED4Fx#|0@BuJK_ײM4,_Lx1rR׭g4\Rv$@ :B͊4M`,!+t]?@4Z x`4膂dƆBDF{uשּׂBd}qAubBEgh%譬/@W|>鋄8q|P%A)K=E2DJMmuM|!?{6[>J^螐C5UPu!{3e%EDCڕ\F6p2(o&֐B&D\1)>Ab„|v-XGCp#Avm N$9ϭ%YM~{Q(TՓY7aȧxӿM4*{AYrgcs37/ J.EIns |X4"hsOϨlw<"?nl5Hy?P%0b =MbGy%42RZEb &iӥ U[A Ra48WʳX9jnw؛ˠ)a8jety>dϚEd(ZhB/Þ'0LXO`тP_9\HIXqgbZk_iG/D6g kAa1Q.2LK Rvj5 :jjBC,k\d;XE-UIlYSlLnXJ+΄F]JbOOϤQ@o MXIC|(|\gi2 q)ܳ@K^ =HK99P`Eg@#CRөg}ZOMphxf 5POۿi{o򕁓8G[#w?naVA[ i+ h b)A隲dKA D&>`gS衷pEopȁh(vt>Hq,[8XO 鑱Cr".jy7Kt9)`R _gA]Ac.!t UT  i Dp+{pXt/&#hPТՅө;bW` cDFP-_AQA0։bkX<Ԋn+|֫~+NݓFl6 D9-~v'W%lHD2LL*Fb:UB!DIHg6\)?+l&cDDž5fKmQd>hI7„~ 5M+krR^G&1`*mQ8  Z(Q62K5qxr<|vJ1TBPbE#*!\p5 ʔB^%:f`c1#|bT+cZ`N)RP h TOźRY+H*Lނ.X kxY䗔^Nn+G=8gc̜tŢߘ ;Y=VPȲ.ןH- NnV#Xc;l4hIc@[9!A&EzNmEG92J)xιH3iߗ`*%˖k kftxV=T&CSnb 7 JS_3 Z}9J,APU-?jS_U6k(+.9-JVzƃ1X͸!o$Qhe0*EY AnQr`SX6kDR \T+e4' >*3Db$j1•"*dcϳُAv7uU9@*$[`s, Q.)WfYtvM J?`'0QR@jGȨbo Ҏ]0TSTk3rX˖[T  ]ʳJ.ChF:[8ቡARMAO/L(v>RT;XJjA  4 uƙdZw^]CA桔}izw6Qpos87 >Qs7 Mv)3>f$irS< "E<fW8_?L@Us?{67xwq}JPAG+?_ /JˤdauPe$!>Ve!b;v*8BZM{055Z$ ~eeyo*/v:^,>c y^f0 S]d⨓ 2M"C;<&';XULg 埔WH6%`UaX^S )# я\BAJcKWR4`~:Oץ<F&qX'n?!+"͘%hf/! >ZYU(J ſ˫ɳzJ_xjPpQYNB':#BtWk"I"ԗM C} T0Oأ8vt~Yl+9hD" "{{xCzi Zr4e 0g+ACRݶ< o@ ^buD֌ ]ژ۪%!Y!׈\|1v$ ^_~  7VnЯ26,UƄb/)au ׀V'!f@6Ɓ9/N̶>ZJ!U3\:i"4YgG{ Ro}0IO)_kX/4L^+ W-yOڜ9j()5agIDXAZ J8t^EUW8 0]WK# wgt,cxMG@nP|Rܧ)oƽנV lo+4Rh!\(A\@ E4ĥuO ]zV36'| ϣ|j<}%++& *jdQw!j` I ghpuM5BKxkh{lq\t]*þ7)ΤM BC҄ev6 W[_e̛]tYI!k܅ -zV肎ʌc~&i AL1iJڢDW;|SP.+g.e] |J 6ney5A"}ĭ 7ĄfA/>oh" 0h| 9vРak88- VIV{ lep daIo2!-uLY}݋t%b%m{B+Sؕ\=h ľ61?^Pi$h w_Yj'DHP)aeste2E伸 ¹" BcN ;Noj^O<*rK{~ ʋ&<.$p+zG@PPQ18Bv]}i%"za"\ri\VX i_1ثvS5S + Y9t4&g=N|pKCHUegz0&cSo*Tdiwe\p~@` =V8I~WkA%u{IA+AԁhDI=+;!nTny>Szu \#y+&=hLJUe\c9ߣ(=}L/tw,f~>;r Ei ff7 Vuf/H 9Rڎa&+oaAwB=`;5P4U4~/A =_Γf5Xbfik'&\euen2t ؅3 E>\,E-VkR|hա=+ KMt4GKNC!Mwiιpm3;1i?J=0 P =}@2zP-Y&~lK6D%Pl>}ZNNTJb 󵑾M@_OTQOnjmC|!%ytPz-m`AN#{ 2V 2rXVܙD8Kpؗe/Y^ZM xmP/0Θ̢Fa[UJ _V32}a5.l~/H{}yϏ DH'X؇ VCCfÙzզrQjz2c F r*F )sSX[t4kz@ή??yB+ah[Xrem+Pqo9z1*(iC{РRE*=$uڵQ}כ}"6e:sL~ڞ IDATEq#n< ad?GX,W½TLA *nj 1'TdP}B'8*Y! ZWZĺTh0 ' ,kк(Wf{Kt;RU/2~5JI~5oq@}vZR8_8Kq"6ϬǜG ә|Ky)hS=) k#YDA@4^_I!=UgX5ʣ4{W7hSSFrj2CV%C02kR{WRӘ _#T~~l ˺hMZqYOqڤy9}|vre ԵchN:/:x86^Mf-mbV"vJ E*Xjf$Axh@<IemN\&absML{ZM,}# zg(| 6BQIJ 9Cx}Jwj6Сuȷe7P |F?!6;TSTw#PClw'W/JW@֊œxj H0>4}dmPa^3OsZ/Gּ:C*9K B7' IK-,;8,Ѡ~j>@b>p"17{m(W0P¸f]3Y )!]NrjZf(@[WVLVJ!1( U'## TA-w\2Pg\ -49@%S'2mRj V*,¥$\G*_j"D{2PΔ۷gЈ2xd⑒ U=_$#Fn6n<9GNJ&rLc7Pt Ke0&)9Ңu!Ԣ]Lh)eZir X]&1 pnQoN f65FP~{+Wr2f$CI#%:?S5C1/dGLXaS]V* e%pJ:6f8}0Y)jr(n?MR(d&uEhqԻD؞YvsͶ&'lDRd 4vχ r+AQk9|<\.72zmKEi-K>FCN=Z(Jf H9}Р0 ʅǔ D3]zX] \DPRM =(/V[VB9-\M p**Ü)t5dVwaqW;2WpԄBR?/]1DT)ܟmyuv%Nf~Gք)u%^ݺl{ !``,qda{A%f*j,.O%QU'=Dqm)7f~~;i#P (U[`푐0t-0Zi] #SݠbirWz \X}DY \wLM텂Z(}BF-6/FGFZq.SgjL\6 3R|U\Rva3"("*)sWֵD8FN o^m cp![YY]+.Sc@4r\P4T)ja]lJ8с0ڬmhd#*ѩҏUɚfz.~(Dlg * F3}g(qC#u7WzBNޓễ s-Ixu9r%^w >ئr169UN# kEc:>ënʧa`'|Ab:F}RԏIbDSɄ@'#ŵp[E0$dԖ8#A% qO:* 0Vcwaaw.O(4X>6ŌO@r%\O-=i +jdNJP ӷYL,t0lb UUX ',;^]ϯqQ>3l<r.w4܄!;?&mlYtp%]{?>ghyf;m;rzAa(OҐ"B`!{V( t3%"VPa ~ 3+f-ͫ[{dV}pۧ?m[2xj'+Ln3WtMyI-&'@̃?G k)G!2`npr9s cշ>͍QЮF:WXL/8OXAj&nF+R89a@-2D K)w)# pR45I 0UT5An;UI}.a 1s8{xv,I@] `nIՔN!FddBz`=d>مk{V[i *WD ?:0!kw)XAiCU#VcDI$8nēƲ)Y{h{Xλ]$p(G\]ϾGĵ|tUkxd<^eK1hήRIgyԁ=2aRLc2O>˗0֞[2g4'5C yɪdmm kSx$`%TK"ԟcX6Nu/lY8-6/$Ѧ+4WW2Q2Dv|xz(.#w4࢕ 2֟E_Ds kv!xeԨ/b۔jj8ԻtqCWe^g8 *ꨛrMŬLό'~t -&Ȝ%FP~KSEpNetW=39zzr#E*)QʻXߒ G;b-İҔc,GSxjT9SL7Iez+̃V8y7{ 'mִ@d9yܗʄ&%C)jCHu.h(隝`~Zz~Ҙ>6\@8˝p`|kq(0" ^VXJ5+J\N&_}3cE30nNӜ*Z2TZ)sJ9@yJiblzp-~6 T/gYMC%~o:mF׏F{l8Ȟ 8xɲPsW *WZ>Krv3{Y Vt&$W9 8u

j9%r fnR=)PAlK>̠P߱C:(`.=RؽA %_)ߕN^h_64Q-4~Î%Pk>ˬ+'=^<4(nH΅{8aq>s(C1'0`'0Iܗ.Q g]ZEL66=k6S`U@‚\9HJt⍏w4@"ĖN#M9*!p;+E-U9>Y䠾RdQ9*GuַwHAArז9$ 3Sj) Y9kl!uY{p廔Ґv e =!&8c7$ݡш~8tZ]Y5 d1E4("3?zHƢժK޵p?6Kgb]ܮa8yORʹܞt9|* _U}o>ߴWdv43o<|7L? UH"Gh^-bJV_#) H\+BCTR(8shS ,û7_1ʨ6mB,P@Oδ.v#$9Q6F2FbRlU=dygKuWj( 􄘨jM3Bz)r(UZPB&Mɜ8a8Gf4Xٟcβ$#kx}441juhE&;6jWE5b'˜kN|nAæ_<4 9k|UoBZpڏb1Fx H^e֖m"hP}9:k 2X(rj q$AUSat" P)ϛ+@XRR'Oڭh l̬3\R]E4GfOd'SwCiٔO1AYx|/{֧U=>T_,Yχy ebk:kX̕8LDπ dpIjBluKng~?mTU{&Lt'e4j(,y+ *{^~nR!+(1?~zM"s7;叞 g-lM2'6kkƷrv?0!kWBNxX,Faw7y_LPdnԞuWqʄfrnVN%skyǒz 1R3Ɲ /9稖 CŊiSǃP~_׸|p)|OZ?_Zk_m|$ DoϕeaGݴ'BCl+'1j5sQcyy| %3{;ןa0ܘt'M/mN7j 0cRzk`\ %,wbuvwR=CO]bRn0Cm8| ҅h& pn2qdqux_90gy\F;|V.17xy')/s~;E'F\"/(h2qBwP"W`ތm gƱ w泃3Zk^D[[ v']"AeQmVcdR47=_]m<ľO8} K'[ݸERmc)Zuh R_:ZQy̽fDt|8"owܦǒeaəDWU?YN+_R4>G|[;t+6mj*|zLPF HD5ȄP0D|,M .$c|Yrsc|k/ M*3a'm՟X}g` TnG_[Q3 bxVAB/gDJsX `c.s AQI~N,ZrMRPn =FNB/ #*5sR?"H4>9 IDAT&}*Y(ye{PMƁk ;T>LN\&:a &e" 8X|1.& jPm{9ygݨ>Zk{Xa#K+ hMX ]!9NW "$ȔS$diR#ȶz̲pqيTn@y -IePՐ0ͫ+MR ,VIU g`AK`lX(5#i>t˝ d `7^IFh WV_ ߙԋvF)%N+%iN)2THgz]-?H#uDz_ye}]!#WrʅBp*:ىI#$9? Iw犑bs{8Ϸ?S|D&:3pWj@탩--1TZXzP$)&) L$tP7VVhד)԰7jP !QdiU kNy2%<ןtwzP8>k`*b)R5Qxۛ{Tiotsf<Ƶ0^6KɁj FaUlaiX_qa7(ȿ⍉ǃhrZpm&vll+[۔N;_MPq>xf>#?&M)?;i'H՟lY=~8z)@ 2YVz,̷wlԤ7DSa'}M!T,&cs s KzM9N8NV-fzhN 5WezGpo kpvPG¬ D[)y'w{5 =H:}W,]c_-\~"& ݣHn͐ ̓A_[G@` d'4^)2V*MfZ fj0 V7ތQ6϶,:l q.R^!"t 1{3gdӾ{s'Iv\~f܋NVTn}'u}ayBNk+AſGt L%Hl\P&[∰F+f8ᦋ=p:!~~{i[9K0=COhܽ-h/f1C,h{#lTLVRm_|;=U-(OOqR~ I8ym/@1byFȒu-)B=y l 6kc͟B<:1Ks̤NbIk zm&zdtm&s`eme;[x?-O?V{y{7ʄ~$7F={5W˘ϫT>pB-oh/« SHҥG~[l[gȰ7+pz]!־߷@ѵ}'UBZ]"|Z䉚`|5t֓Ҽ2b0sɷ}gxRB^^P|Š7 6 &DnP vpx*khc_>/@551IL9=! 0m|ڷ4;1×ηfZk6G$c}N`PJB:7G>J }/2 -QFX¹=ν F7Ab&j Ivg=,t>\K ÆB&||ZÂS &c)ԞlftuO `F=vHM)(%̐w[ew3],NbR&g'aDlo9wi y7N`+בdf!W5G7y{EOK]^:9;Hh{)5泒aQ&Z;$gP\w=D%h;!WR8Iǃ2 syP~Ngo4ܖ9`\pqr:.\2}vT8&M5R9-q{g&)\XbQ 6O1`wĻK ˎ+M2u|1 ګ/89d)gFҖW’׍W{}<&uׇ-fqeI~Vh!)Zv)C_]5tX> tˀgx ȎC/^gLUw^_D304%;7!dwp?xVb/̦&紉gP>s6Irγrؘ7^1Ii:`OmOQ.$D oȴ^զ>HV^P5n~G$[rtg+:^:*ߏO}I!s< )wyQ[s](Y~gϰ:J7y_ys`(Xҩ*?jZ"LwoU`Zo x6yNvQnTY?m2_PEDQ$Z:ݞ1L2}w@hË'LT j3MGs΁3K tUQZD]aTpWK`Dȷ%eE8iN^oT-zUK=lF0|KJB#:1hgp Ue&:ٲYNrn:fƬV+xE`Ο4fnN#| *cNm|wX AJ'UV BTۀ j*>!''Aqw=i_/Ji{dR4|vd>U8Fw#ZCHt'1P`HYd+GLQ0s5m+yt|'&p}:1 y9 w@9L X؋%}8z+oeBr0r9YýYT?iϙBmа@nk$IPGg`)&εFGDžpp"J_Ne.bp1~XkT{LP9^.g&؊# h>L9j&d3fPΞ{ - 5mSw1ExhPA8`;WP9tlD(pg󗇒rXǝDx P:a[cx̩eR؈`p4{SVxs}QjF6WZwC>>o pٷ 2I :+VBBe;դgu(Hxjo n- "P$$D|"1qW<YuI J [DkfaȓO>6Td\`nuc;2ք͝IeLd[ޜJ;%KKb7lT%1*iIk%YP .]]&'ܗ$tbe6'Jہ&<o &fQ5>]pc:8("{1ߒl8rIu`>s?JL9g7҉~h_^Eq\~iktE?k$LT)-IJï7e=?E~SJjI15q>C2ҭ[Д1oEOc"]ĵ>exu"8.J'O$U@y;V9pGKW:`hxzd" 'yGw?W YpOw߽Jp&hp1WC?P~ol6ttк`6[3Vl9@`3@;MO"kӥ kyrXY]"k !7!ӟ_|]-5zD.|TȄBKRC&a:Lz~]wJ&_6'" +.$j7V [aڍ2Dz!y֫6} E!ioRSO%d`dڰ2tS,X1Eٰs?,U!pnʷQ1}Uve-!svփAx>]2j#K Ꟈo;;rX>BDVY, t^Y}O5(9'Nlu3KQRcP 3]\s:/ L?`{}viY 0rGkQBS 2}>hBpyBǔ+}\ҜnK)X]]Hsˎ@gu]6D<ğΐ߇-(cr{*~a2!щ=0Y$>G $ia\?\ &¸ш? 5hW{A~*IbEOܰ5mgphnK:>ulȀ#-x@MNy%)\V$L ]qxVFXt233 ] 4 Yq~ɘ];#5I>p=c\ʆo>ԍ/ FVp-a2X#6WJBn}\QnC1 >TI>uM;@ zdw0oΪzpS^9,:kIwƄpAGd|,IuUw,)3 gA8)4U9a9p9YT!S-(Hv7A?=Vq"RzgEdfLD #q4_Т68X (N)DR2 o̼.H]O t1 t!ƮVȔ$6Ρ 87A 7&Lac3d% GW"Z;Q )ID۩#;&Gt Զ3~τuaWOE Qa_o<::B8~ʇ##p+MƯԣY|WoMU؛+U6 >Htbz[=_3ע_S#]i@0^x& *ߧdηH]jswJm bvXi21U9ٌ@&ȣ ػXP|ўxf~5Ȇ`AI낺1=z&f@9 aFmu]vPM }-( P8<*kƕҽ?<< wu]6`0|t?ѶF`B@dQ”*Jl=SNG0E7iCIy1J 6v\0 kLNF_yM˘C&HA菘Y)5G:7jgHsx*{ݤpy lLϛ)%NBD'j'$WWe{#ŊT2 ?hfk*3ġ"=C Kq{Az1Zk' o`Ap 7Ky)2Ljf~j%yڳ|\(e9'8˞6*v5ʾIF(U * )pդn "8l|Um頒uTwYu 5S"H#E=)2/%61=a9.ÄԱ/2#ZQO #4L 赢 K9сiS1@ei} wa2ɑEk}ubz?+ VvQG.kbHR} 11uj˷@5z,z !DP5p-!A(Ʋ&!Z4U{ bC df,"Ҵ $[=J>> =8Q͙0|XrE~>g;93?|elLYY>9!fF[;Ј+ v:^6l. c~6 -i+]')]wgNGuGKB̛ {$`Qf=Vv]&܆d>/sjpioK2ʋ(y˓<+ e5Ͽ~[hJiB<;Nu{/yHpKڏ6\/%Q mU@3Zp#%(V#1wwD jwG;o:0|&Ρ7$^Z*$l6;<:Dȝwq\p| 9M  #QZ!mtsphX%vHvƘP |r f\DT5P5(x? ZJPK CH-R`:TʵU)L@X@";~zx;B*}"yU_V5$[z; MZ֚(d, 3އqToC=ۤC7>OeDL!s4&<Ƙ>+r5;%.4, J, 4|_qY۾P=Xs q*> {+Plߔqֆ`U?t6tʌOD̦8 w\!"g kPD_?iGr $5x~gnw#ji/3\2?lV%9%n)$8pOrl:Շ&ehP߻ Bʼ}Б;^4m$dzVJ}Gt~|K]=GQg8^<2$g&lyT$ Lz Ҷ׭Grol3͸.(`HR:ӥ|9>펗| *:V;HޞS{.@跪AElNW yTi"jky :PI|MR2G'NxeMgf{>WM8̟>SMhz޸<6f89Է}ԡbX`韃rRBt>JKA-(ŴF.eAah.X -/976zLPV*>/*H!qUc#I}C&NY%7TL<I{weVUH+* dxn7@\o{rӡ\BWDv :)&'s%Gp(^4|&vQ7B@LVfhtmhsq O.Dc;B1ȳ4ۺMrw*H*Ѷ v5Fh|9 a)Ot5l< LW`H{dΌE#MFekLā}r+kq!-M4OP-+m}*wσջLm(T mf,+14oŽbL+N;rQڽBs1|YR8/QOitp)'B{ IA7O+YA>UAWZ}/7Ȣ}_/`#uʳ"I%rK*Mx<E_ I@ڮFJ_C .:l][ ;8S-!Y=G>3$gu7K>Jޖ,1TRbDGXVTYbL gUwO3{o1ۀ]Hz\c>q]0}Ed:N<ߛէ-PijAx\E=\ń2#kT!Y(&z@t ꄟ_;ɡ1Lֻa{oTp42߇E踷 _=¬jS@rԦ*'/N")(~ 3:"05S56n_,aJ%.OD;1-T2l-lS$aq 覾tđbUfZz}hGLJ7gx=TDja~\ rYƇ|9?9Ia2^5(Dscclj0[{g%*W̜OL} HR.r/SLn]?$"3f&_=WѾ~;f&L^ Z.uP{!E<%D2 M ݏL8V^<[ bQe +ՙ1R4>P#*qfO';}pJFYg_wc.?TDA %: +H8n0:fhsZUN63aƄpb $ΖKW"F:=Ba]diקLfTa&7P3i>KzK“Է#/)mԄr ñ~pƊ.>56Pi|(nC~F2٩!k98cٟ݀+6Ƭ+FRUZE q+h! .3`w*;=Y(?#:*EHW" $38 KS< ҧҩGc2<;o'XJlE3P{ 0g 0HMya?u%"LGQ_9[I̾Qdcs9CqlRvPl~pV! f|;-*MT$IUw1n=j0 !@@ &)͉;>!/F[^~MD@;!AGJ' @ۤ/<1'$ccIGR  8eH2Q1,P}?c,?_T8NjIXBl8,Јl .Xީ8c`ܧa6[/:-@0BU~WMd#y9iyaބ scɶa@Az T;RāZA^T+)]B X!8WZ~\:1~0s@CgL! y8F8tMzYr5!(ˬBtrs/-rA`lE%6gyժB1C0 ZF]'Y5,d+f.QY׭۠ƾ\ic9OL~'e_PT,HP9KqZ`9t$ }Rd5rpTp}{jivaV1Nn[ wI nº|ʸ֖'T;`RgL+MڗB^68^+V- O-`A30oJH:L?h6'2`']BI8-Es0DISNZ;Lh&9#mN|`G?3dp%yؽN]2&\xɹxYf/TJakɒqP6W)8>Uk<1Eh $gdmݑ >|6K'p ci) СrdA7AFnǩޅgxTҜ1 'I=-GMA~qrDH L0wJ'P${S" ~=#L^n k_ce; Zk_߶3:STÿ=oؑ1$QOk hU6VQ'Y=L^SJe۫1Iuz Ɓhᓕ n7CH0-wH-P.ȷ$"兣hni`ejx"*o,E)5A]p6f8zDz5h Ə=8Xђz2ܼ%u6hy&f?NA.[sѝk0 "@8sJ WaK %E@X|Mu 卞ro/yĖ={sGj6dY\#+Q(; o.(Ҏ^>tF(/ # ܧJ2(g8Dd q1Sh-当k X})Q'%:VU Zn`7%ق<4>ґ2`n0kTK IQ+Z\Q_Hv>Մi4IC(fK2Z)޼C;}xd= xPy ƺz[xuՅW;aZ&ZabKTn1|vHWh2h<6|²t(bgqvC$i,8f8R9Ȅ6af/[Ed@U!=|bOM >$.j2O+]KA?_ BVp rgnP _ZkDŽp<5sy]φ99Lj¾(gkHCG`T۷Cqpi@㒄}S̃}Ľ,3G_k Fzyɇ@{)K7 ZmoOQE˕̦_4;5EG`]o PfBD5$xS)1|f$ScAVrH&4-T` RYk UN*LzsZAhա:a 9pĞ]hH]xi>EFdwh!狶%n%aw,W[1))QćYOdiĔ|Iz Yi{#ZH|:8 梆BIܮ_TW@B2s־v T!I-}a"N/-  %i.$\,r$,&11|!Y"'slw(<ӿ0wϯ2H60[fJqơ5^ ;BY XaPAiJfu=V6WbXSD}95~ ؿY9PAJy[qTXp<9jLKʸYƨnNNBa*/rYm]p8AbN m:m Oo77/;"l0u޵; Ot8+˄t-eC`jl<m}u3π8׻0 A`ęCb$!c~(LoB _%$,|<mH͢hw8 .Pk2|HfY/L _뒱uH @i;% HfmɄ4ugKNpX5ؐ,z&aXbnѺv¢HFG{qdz^Mx]fh!|bey&厠7-ucg-$JB˒e(sSl'@R0lo9)l`cOC/(K0&6=x}& . &3>kKLOEˋ R<T(FF (LzX(6dՠ Jd3*c0kdy$6o|0EY2Hcx덝}!vu~xO.m7"$=WcRpLyu17PvݤQ5k[bp15?Ձ<0S4ůhyh/;Rt'hlWcsĹg IDATyhZG#՜D~ѓAsi S'i}Eie\@q#ٕ k' YH*5+UĤ[ ^g]h]Oh]k=zpzmLtŽl&d&Dtp7otԃff\Ø+a^FG}*E Y 詠 |z~I@_~']GG6(;LN4M $Z bAQi4/;&hfIWrɪ'p<=JJ^`|o~FȼX¶LՠK=T,Ӭ %zaeцxV&oL44 bgݖyP|1i:F` g,y)M'ay.vD5qju G9($.{׳Tw /?1n;@ }{}kkC.$u[y ~Dz '׶C3!ƣKMT)c_Mgp SRֶ*osR,,㣩 Ol,[6aHb(UNm)Q-ڜïT;U͎qZqVҝ2Q{vؙL3[w`!ycH35π'pIU(v{3B8zaL)Mb2N!9{ sr1Z =~5wD*Wp} 8색8_F ׽RRDAP$3 <_e}kgқї, `R9W*a9]8JA1 v(T+3/*ȼeP]".Bu t 6 %`fLy^l3 .ClVྒxAVp% 5:kod(vlL el 氭8}M)B=?߻3F&*]$QyڔWL|o:$ȱmlszEa ^EZվVz$TE9X o[ I.(D|:K)텂dԙ`fY:KҫOJ.OV^hPQ vyyO g F~ -me5pC})T&8a2&1i"V5h}EBnw@} BuojLEN gI!k@Gĺ2>,;8'wllj~ q#e-9cς=8E&)Ll^j @+4i5X9.*LT%5aQx]~0s*WjJ:&?/Ƙ裩g|/muԫ,O4n2ybh ΘȚfB[E'S8jrz\0 9߫ 76ru b &uii Iz7lk͸ 9nhR#xrhץVck'Xf =mGaW<ɐIF$E^\ 0'UؒI? A[)Bf%%D|WM-j\F#z%)mP~C]RG'No h'fZY_^ZwEV[mei\Gao1hʣC&CNd|N"<+A]åj_Rh"(Pcjפ&-:*ÃGy VRx*QKBPy^lDxڻ> w<~?!fab#K9ykÑn¸BWAg9sh.{0J^^+Zb3y 伒oUh<{TL'k!GMt sR!eW)|Mh|,^o nCV^h;uxၕ\^QJr/kIGц*,0Ksh2ۈX&>_5sYͲ#gFt049kvz鶂Ν; hWt)AAu$}E/ÝNׂ.r֊^~|0WCIG~[Bݥ$&Glwjk6p8+qH)řݬ*Lmӌo ʌgz4"pn/aIwe K_|58 &tyL*voN( 6&[QƼXѓ&Di&ӇR^CАJ~N^8++X2?Aá÷ohx)L?KOn2~6*wg"4-[cJkZ}/P_ M;}02MZweIn#@(4 '2n+DZBt6ӛ C>HvdU|n(D1}8{͉"i BnoS~tE>&zJm s,V .H<0'ayx5X% z8-SMD'ۛU6( 阋ݎ/ba`2Ah~@靁."!7736Re0G=k3˟_§S֛se+*ƃpbb,567dF{y|jB/a<>ebvz^uΌ֍ '{=7&=u K${#gd8&`*ίHF_۔l.ͤU3F> $ `m*yVGI*TɷkMĂJ^ =y"MKJ4k}8T=|[8V6jHQ6 #L@>ڰzq(K [@~8r~: ]'C jKt}Xra u{ LSIr{[0w%}E钪'`BA_b wVŹɫ;p%5ne`e ̧!Ϳd]L1̳ siǡ J'{FL2303 -:L$ۢ</`7-Z~Khϭfx'js$ڏ em |1 ROo t`8LEؾͥyK¾+ԋ eε>R3R%޴q~fQ#05`m9!@cJs@F ]Uj(ӁەFv.zCݧ>fIe:Wқ-xy ]ެ S@ME)"ZzT\ySJ–t&% 2 Q\x QwȔ)vLmwl|*2E`~KRʛeVPxorw`1>Z+YC53@4LlRLڥR =I9%"tޯ|+sIQ(&ݐMPg^]:̍'k*?H,e|({`8NW:?F5eb =|pLក),bBj,zݭWd ?` ¹@tkCgaNLj Զ'XTBeD>4߰|!o_go串TM})rZ?x~~r.* e=Sv* [XwЮ\n7}8wIN2 '6tX]n[Xל[P~}C@?y qdX~/ C<'R.PO̯⼋e4Z!OFv7If^&a.99 Zyݒ 8<饽Ps?mR1oYAZ.|-?kׄ8:T}&|3ųƃI¤CkU2QA$]s_ xmh`ૼxLn"44'=.r,M;Rжfj}m@{d5[¹>=&c܄\UtXz_xpga) YJQ_5 6YFRP[Mo!.S˰hrB4&]IÌP=8 m|f<ۡ0_y*?@sro8Wσ,O_מ@/8a2tۼҩ10JhШ)[s~n_,{9Q`"NCڅNZV"?P F`do Oxpa__kF?$ȊJ]v)L:}s5UsC~]{xlG44< g"*op62b]2Q遬׻ Q- f)kcW* d r'4– " Ͽp'7A!X a k%245Ugh}qRיhrKtWxL]+̳OօO*? u'mpqP8h/.5˝? r!j zSk*|'8.PnY$<wijL9k\?UM? `9̾o^Bsb$Od!|H(/r 5)$8K(a8oBEnIZ^ og,!<7|^Ū0/[̣D*""p:KaCc?jJZRӼw7zQsy̿04hܥ=뮆 5ɤ bΛh_f "H֜+ROZB*6Yb|MuvKNP`)Q ɔyH3RD!Ǫjzǯf<}A`7j0{!ILF RLK1}^V[.on~X1X8]wGԍ3Ϙ,%Z$y& Gs Lȯup|/D@n_Y#팓L&*;HJ'_ۑj mx~M wy^˴ <)åoGgVz}桎IߐHWjtNr(&Ad M.L 1$ǻePvEYFmكS8?́Zne'\᥋z*l8g~ H{Ѡ62 &L~X Ŝ1#~a}PwνB/7t i"wh }eB䆐RI"ÍyNt˻Mxj [VRxp04Po&ivvi]?$ڷi}/-tDsN(5TDuQL I4AUjudڤ]mmj'xyr9 w/j7SM2FT5 k$jw+Ӿbh'mp8le0imѱaxf]iΙzk޻ɟ$e!{&JWγ8T78h.)>)8Xܫɼb~*Wl>? NaQ1QOuv6_qOt|`bVڑb%Bv70xq7rb8%٠,mBrװ-Px`&~ :ەh򲶷޴Q2=hq&0З?UDcAP,h8$̶߉&|3/$Nr&vlz#@̓nw3ʷJ}68`~po:k_vpg)Ĝc]OoA֍dt.ra{ׄ? Csx.g88&}bR0b%N=q]F (h[>pNhC<CX8_t %Y^)6O_>GH '=)f؊Y쉫)zo{1>_#Oe^|R@Vyq#dkgxj`2}W4cdsO0%tcQ_nxcB߾kFCUa?^vUVnrɫ$?o =F98Px e-B1UkPH{jiĤ= QGg?s(.JtWL1an:,OOFsN0OG$g-~Z-=HO^k U:}bA;$!lKW\BQROQ2i9mXxY η? KD~&TOB븸 ҄&o8@bGB,;[Nd?&a{u=VKsO4BgQeV:, IDATCJZ~p9{]L=J42J}h:(+&(ein(fthvg1bZKII(qk-yKĜ킮kV@?|8D|R_a[qC(8HzChnbo ﺜ Amg5aB+5G2y)VF5WG|m Ju%ֹe Zb,Lߕ`ª)oxP51x1] VߋO2{Dϩ_)EZpJ)MȻ=^8AݶzV'c%Ky%Z W'"Xބn"{"d)o8 VT̜W ;Fi}꩓EGA.BM/=4[񕽈:Yō9 7 o%D4ojm)vAVߖh*I ;feN!Z ۅN2`B?`/*w.ݸy`W߿*Ah>y@tRPl&Fp͡7jzF&ЌO~ Ï1[ )D8BԷ;"lGqݳ{{\V Ɛxՠ婓y4C0U+2~5 /EC“Kbѧ^\g.'lTuT 4A]k CVC=y+f-ڈ9ĮhR28XθQTZ!|,>|{Tt4-t}{OVOs+|| j|K| # ۶P*Pnmg5sJTko_/+UqLɀ6+gs[gˇ|^hFoZܸ0a4FC:RP*ۅdc>ͱthRtf6d ubQsB6s?%3Qa&$Q6fN6T5ރy5̇do^aXT*nm|-rX n3XVU'WS5b^Q5^)+~:ۀ꽏𹨟~y} v//ŇP٤ vr8 T h".ǻjlV2.C^)'!4Th*6 [n=Yϕjp%y[DL/@C"7Hrv,a)xŌ~3kЏvm3:w8PM=뒡>60l~x`r`!&Iq7S;O*X.a9r^6$H 7qp7 Ye^lĻ/;,7r09ceSne xKdW8b'~ h,A3_L^2« #2^ DvE9jmb% ~5 LbgblAa;7jILtl5 8tLT dBq uԕft.U5%Uoj邡M*e^Ys~_|,'˻-Mv(ܜZ9 R0 y p,!D 15u3h3)"$]vuooQ,g[>)ZF5[kS5>><nB k%ӂ6B{ѠC&7sE6g7i:[O&Yaj!<3 <#극eP'U.ւ2%mw md1DHگ6TJM[E;H\uyΦF틄>v5 n-򆉙h?/?"9<?^pd'Kb>6$9@ A=/ۼ ޽U#f)ue!;07[Sc8L~|j/ļ1c&]/bq1To|fFDB"O|5M4ZⱧA6bnLChG`OY0wOQp^ī#AO*qУ3V*‰*C:l,z-kS֝AQ!8yFhO G2߮ McrufMr1E͜%4Z+ߺaokjpUoIߏBu`79xuǏUĘ]=S |7S?N #HX"5(?!X(}%ᓳNMWFT2^mv G"G魹;W,+fhh+N&2pXD%oƀjrYbۑ 62?#Q-% մͻh 4zicǴ/A OOͻam>lՄ 8 (y#'W{񨄓k,;p9|4T{U5 fz*u(".SqJWwb\L@Fk};<*hw=h(()8H LR!Zx<::ȼh* 譱j0L6vd4M`q>N͵>&-$zooZ9+܆(TRjA^bXCĊ:==NXƷHИ8A8S+uF"?GU3i|H 5a#AǓ\3o;>!U}s+-G3Nm= G Ѭwlv*L)L zaj,1II;ĨmeLV22>g;(W+x [-e "t|<»/Ps1:bzwՍ  әpn1CҎZw‘QF!S+7^:e܈H.IW4*/ɯ޴sn$'d1k+[6iLTQf-MOp  (!j6@gVWt_ΔʇsM]WG o+mnW""e֚2z}hH O{VORd-gٚblNt/wXn_~ SINŻeYsWɠ%9zKg΀ťaN=ţ8l-%je+W 5N,ǞRnn:(7aj'78r|emE~WTIѿ2>o;x|W& GI5&|+ h-#C< wk zBs'W29]C [(jzvhjKX 25)* HvNȏh_#A*^MxI i'#e-v9E.W?;@qg`A3Y %x%9T[ў͗hĩ?-sbV 4]K h4ڋk@MRخuYVL&.$x؋5,aBpPAMx\pN|{ fMIdeU=+:c1K7uX. JV YF =‡x,Wqi&S?~v5!wC$Ow2bYv9 :vLd,v0R%0Xzkjh>$S #53g`dLjs;-rB ?%~axiDŐn*ǂӗgb&&_,|&tJL-s]m!4TUΟ<<{|`W(1ؼO.h /1B|֖ uz } ' 1/p_hNɵ}~ɐQ֓867v/ZB`0B*G_Dpu!Ṅh\4 NPϴqv嬼5 -N Aţ|:F[1m2 OO"dO $smxByqH"';/.a @|H/㐧,sB;V4Ou&| &P{s5Ay8SϞf;qѷke&CfE4W g&Oҽ!?0l/4Tjm3XT}@HZsڃno[J '%7G}gĄ }fhW.>sfv[_ 'dH4tXV!=D^&s߱glRH3!>.WϤb!O$̓Bgm*1XÐW6(>ɜK_H*M |:XVlmhU߅=*9 MIF!1w%il *i*zh<.Oz7d>:}[܃@Ev"" 9XhZ%iYկzG?o%XPŎ&R(#w )k6*82>N&kE:v*:3$Nr;y~ ͖xp;sI`3,vK 9~Jm(]8f,BtQ rnz8ȝS4ĥoCp7C:cVa sI0i?՘Z  V Fl7xFXSO n:K uc$=7!>lϿdQE˩1KhMΑ5Lre{1k3@AZLcz4AYeha05?ŠHIg# RXE%Ѽ 1Cûm%;'SP|irl/n&^[td.+VdLkr]W\ Dv3iPԲEm뷴!ܬ(f6|f<GnE{*.u]^m5xpG`<)N&s d0ZK~wԄ 5 mq\U=:Il@JvR3K6^t'Tn'P촵IR/RyPe5z,`;mio7@K^`>6&5h$+r$OǥU Ph_(,^Xը, 5^J D|v9bTZ˥t}2`0e) uڇ;X8F,IU,z0ޯk$~\p篠j/Uhf2Fo9tB ZXDAI*XW*x WjD Ɔ`mZBhtT99aVՐ\tG 낽$؟O+ujO.m/YR#StH5~J g =;`Hhr(_ S>`ULO3m.&djbo)z/vI'XNT8\;*ț;P(ו(Ue؊LBLxL6yP^|4>o'` E\ (l C'hv|:eaaS"| O!Qa͌m:`~aE\=S bkd@ \"U`eQ&=>:3o+6=dd'<Mnv?]OSDun[KRvʖĠw\Zhu͆J? lh/  ?g]< 㴌:?1=2 ErS(r"ݨFld*rckųp? ٙ~y<02[/S ߈)Nm,(OQ#g#D~ezU{hY$V0l@珤2'#SЂ#9sU9TZ^-/v)beo%Z[FҢΖMLdk|Z}ZƝ(Ɯ29 ~MkK/T m)/TM}帳zrebfjJCuKr-2Yh3`RCʂO伴)T?n9͘P",VA]C1@# B QVU ;ƬM- )̊Ŏ-wU@g%MɸnU>W㢷~=%UkGc퟿7JYfg58Q,9Y6r_VZ жv6i5tU@٠=-b󭂯rBBA0WYZS`t Q0禒T!Uh"+GXkC a#-#H!a)z~+z 'd(lY.=1 O9yYݽJ7`}; 0ʩAVkZt<6\[g땎ŢSj~erlu >;lE +]*-^NVYrǨB`! S*vZU|k6ɿi<s_67./=P<5` $Q%L }s)ޜR¤Szz|9KO=2Pe{NjH~owrm{HZ1RwSToWϤPUĿgmlbjkx4:AmT2Ņzu8YOT IDATS ҅ UٸD.O(>eK3.f L|gE9&;i7.Ua0l&r5}Xv!U0:%l bd2tc|O 4I,`82 CZ)da#/6 Κ~Ga*Š.V9gW! k t~^j@PBxlt*ؽ3]ԧʕIUKۻkw;GkܶC[]׀剑_9 ayfފEz"bpG5N`w gۅ+e.c 2]1אq0^mip1@Yfie,ŢC_*fCA, BBT4]+;ڛNܮaGdrVivfmUm-Gp6zmDՆZ%7.xQ^T$yߋD`RP-Q]]>8ǐ@|Ɍݏ=xIU{7ឪM韻ufأx ܽ4vw@Xydg t6 ܗxv4 = ey*.]AIUmKS}3`C{OeGkItcJeoˎݺo=(x Kӥb3.qQ7<r"8Փ`ƬBI+R|EOnGN)8APZGY VVϦ ch' Y5iQx`#]1CNϥScvmQgA+J,SqPUblu#U]an6"S )͡. xlk 5#׎)kGj3ͣ[FM /CuYjgjΔG [V^sr8ḩGlmoho jeuܻ+W#2wxsj[1A0?XsC!BpUϔ*0 `^as{ޠ|ʂ#ޜ; 91D|:jDu h9(ytF[.F7s2Rk3;1%3! X>nVC"o< g}a>z1*kK,Gb\m_/@ fjSa;kZB la|Yrے*{f\ ~e 5UK٣F;0^#j?j"v՛̷M:;d+-Ww+-Qh;ͥdLvtZY." 2̼':U q׹v}kna奃?\U]WG~!W1n +Max1 Q",8tHQ:biCͨӊh*} D.`"V խD'3on+Zz :@/U:5f s #tW X(g=rg3ZVˢTVƞFϭhCv^Y]gc!jyyίyluI٠:1+.AS2 ' S,%^f3ʬpBΈ uYm4bqUn Oٝc>T hZYwV X}p|%uOS!/ 5#UOcZ΋۬\)*,;J@؞Xku |Rﴟ9OU*a͋؟ft xbXt aZ< וO!*~:$]ry ^titnXiHq6aP~ײCNͲ}iA 4y{e?_Z@9aNVxl#EU'ʶ3, i3{kdmHg]_Yq?2\'4$ 6(Y+`@"_6Z{N>!"o{+͸2$1lo_PY۪~J7:3q^w>!0V6*]a/C~ .۪_ THgVФ I h߫ BmZd/»JmuwVD4+=zr,YGu9$~=hAKlbVޛ8]$;E/..:Ro/ pU|ZP&68*{C{ĨsBJ6{YoQxZSYB/+k'~_q\L%lH58o31)tHLw&x8|*Lcx|>a`IƝLjg'JM{M0 uMɏܽjЀ%fYXxs=[}|P PwTug3 c^6f[h *+2][fa[$\A rO{g𯵡0zi[{0/SL0Ȝgΐ<领on1R—]XRW+Tj!N6՟>v[i/Ԅ lj]!B1Xj },%ϲøxv@d '`]bsUmnr*yRN'TGa!!ѣ< >\j T0U|SJ 1et IyIA ً)&^iP|}J_o;n8q) Yq iʈcAxQye)(:b׏ z,-Nld쥎j/N 6kxKNsyKf3_Վ'+]\^yI .݃cJ$s=xQҥ)WKӃјH_9$Q.N8K s\Er*İ1]MMƍIj4$U0|Nl.٠^Pb!Fٗ>Վ d,;6P"blc-0{]GԻ}VcδU(%-IKi yr7``"}^Zu$fx٫%# S/ wDW6DOsȍWQH؊qF1Ȍ~j 8*c!"L#>X=D J"Z6{v` ]kVb'W\w!RO+Ӷ3*X<&^$2%OkTp@ȉ ts3WM9'1X.kZoVKXC{zx?LoLLG]QjC,1 {!}e4@5J0=yQT,[rGe4F]:7HaOńiu4.ed(/, 6'ք98~Kujc>FcW= S컣0ؐ1>kQ.ҊBqm[85W:) ~ݻtbe DKb\|^7J+(9"Ԓ_=07Kqr1nJr(/ 6(s)0w*Ĩn"u[KEWzkh <}XeLEz\LWbU^-o w fMAtw]@'JsiT5>a;j÷UfuQ_j *Z27EoDg\:*Kݦ*˳~t\[V^S%%wBF oxbS ˢX(`WFo~]{_>)t|sDyt1TW^憳۟528 \Eפcع06(?K葼x- M$QYQac*`9|ř< >/Uuǂq*09H-AxɅ⍛&**1 ѢT;?8g1#06ߊxQ]~NcfuY,~Tv0\%C\ܟEE+bd *|g=>wt3:j'ҋP }AK}e5y:oElrT '%2ABPӐ٠$Ão-Tu lPA1;<6 #)M)~Tֲ)!ԡ Ԏn F[Ra;}cp^$+2(?-4š?Tn\bG:0B՜w\Z=?;'?o ;mxjK:qcO8lMY =b;EdS0[*V:jdo,Za&/mtNY/A=O?^ Dl7z5+bZol=BfXL(|ưWȉkeѻLQGYYo0dg\TQ0~<3Fv%+ǘo& e 1bsĂ\shauMr>/h$Hk~#}a"-)T $tu..w[$zm-HX,s{n{o">z$ a%^k1y dѩDbx\H``f}y|PBTI;=]E>:[} `xp .p뮋#OY9LHaAϷgи0{WZU\=*,뾐ec΋Q̫+*WdzSɝp.^6F;kZ6JbDq6>yUSZq縑Z)z諢X׭DkA-҃ q RrՍi=ccdr6W/.L? N{Bǻ+x ?7ς14U-㆘I`JnA-jw)jݵYJ5.S^vZ|0d&sQPs.x)'UHB,7d}%7tu6(w <=X][kkI6#u8a4$mWBMvmQh~dQkc1vzO+ڤ9TI󛀉N'y+ cꌑ1Tq.WF *L埒jk&UB|l哪Z% ˆqm4CM,{L׏%$Czb0W$Ҳɖ$͍2u\!9G a,6 /`$|m6+KRy8dm?`\ Zm2yMb'GVX`Sn*@ƞ/r+VJ_PnvC?x$on` Z{یh7`9B؆tuoqowe]tQM [ N[nʝ7!Y`zQuw.*Wa3}Ⱥr4&H2(,T|˂z»N؇3$` ?|ں0 #$I d"04uZ$"@,tO ;wkyz`mY|òrTiDB ;Ezt %;\8nтUSZǍE^ˆv4]^HMZrMS)D(aqU %,0y1}UZ-ov֊^uu鷹]DcK`M:~']G㜃Yq29i*L"E_!ŬI{>T!aNYswdx*Q]$FPx vy^E&P1CW[n} EZ吣x3N%KєH"7GEWa.΁S禎*UPF$X~ڂ;˽mYYcK [{bsJ"X$rѪ6-0=&BC焯P;Þc0QnLBqz-Tʙ`Ew;g:a ecBQ#Z[@0S|/2a]{{_J?B/^/h-PV l$>G2C# IDAT'YIꤝ# jPv[?dZ"83^TL)Z;v8^SMsfi~B5V"ejvTMYng) Sq\fǤ6_8x1gp3bE2 c 0޶БVS? VLaX ;5uXw$ٛB OA dNI BGp1 124IW[ZEE[kaz^/xJAן.tӈwLAv V1ǒ6]hZ:\(S+ ia]Y:sU0> .*Z;. ft48ߙ3pq;П9kLL;OfA6|!(nsvd S?*ЂD GLe0eg0k:1ٱ~葝%GMZX0sꪆϲAKdFސ3fӺ@-iqĥp˦.ϫLrr&xbY[0{1-^ݦ2C*rX<-VEq 'UP+Hx$c`m0=2Jܚ٬x{6F&H/ sqg^]q{zWOĂ  M Nr1XZǴ>Wߒ<ʘ.`de [C$3]֞0Z"|,דՙ1*'ȒF+_Zv!!׳do #اXZ1#GJU'm^z} D5yIW6, ⮜5*A$O'*3~+M)$D8WSXBk8aKGdpf_\f )> *RŌÅ`0a3^`?im'&W^Urpc}[k}&A[q_Z~2DO ~u`^%/1_@l9|W(\;cUvY4P?PG@GU<Ԟ#@`'A 9shaczblVX֬N`wny^\VA\1~gDp;#9PcɈ }_/6k":6UDubmo?iY7七Tv_1(wyDVq1UH@NG,ì!5ԣ{V!6Z+kQչFŔ2y3w>ܗK|?F?kIuNPHjD‡,t1^Ewlb}9WS mBZ5jlk|Z9 Z(l-Lav cc1%[yN؆BC=;BSfauV;_~Ҭt,jd]+ǏZP. 3 6ydngދ d>Z#J__| z'q*?kOά\ڔ`±JZ{6%y9+|}^G˵$i{Eu`" wd^u{ ޠ.#띵~792젖o؄;AU S7εkpLGKava۫'ɩ>ݰDY)ԡɢ$yy`pDCReKX,չ.XPdYqZ'9Uk&GpgrbCU,*Q.FS{M͟2Pf 7k\`׭ovӺ 'd,H竡N1^.X{fqtIEZK#G53@ѡ`l4",k 0ƣ4m{P6H<czQəB`݂3NkMlFkݮn܉C`+IL,~;;o//I"dN*KX WD*O8` M"6#D"{9-hYk ! 6UkMgqS(wsF" ٛQSfHrԬ{ZeZk) PA$#|]x0Y7aAR6?H6m3oDxm "MhxLLa`o/J!A, R(EŽbbcGa6hyhZh ý_}| '^^]_Iv3Iq3kp|%(pX0in#̆DjQ̰K#G Uz Ƚ 49!4x:`/1~TfN؃TtCYr+3rq|1*{Ψa֦Mzu"'ͲBQyF9SLѳؠ/dq*6=h>rq68>i}WewTR}vpdHj/΂ogZT3MXzwܤgvL$3\+.X2-t(EC4Tfݚڛ3;2gRQ"lb\>m.A.ka n݆: 9TJ`Ѭ1lDm*KG`p/#A{a,Fe W,y8U8kQՓ hF݄2,.jАP,]xpğr0VMaא9hx0 LKHd[;& =k2951RVG'/AhaU / \ {ڑtK$mcv` f'$yE4-BVRd!E]SćY=\+cؒ98BK0,0r<%lu1k9aY9;O ǹ:&&&SoS ᵐZWZ읅S竌j%--uNMoIXIo:a68#>VaBgфy &oxGB;J؄%fA~ f\w9Pn+NV5RR24yeF5fF 69+y ٠@+"Di![1wɧv_WvI&<1|sY`ŽSh9M^#IĆl~ jH.9WW)28ϩk: xX6HS)O&+¨n3GW 8T*QՏeXN,|by A1 ِ!9x`^q]iV []af #qL&cm{?gm>N-HGG~( @IB(,{]f1Vd-03&wX~1xLu'I [7WQ6+2ʆ0ue*l++'w1z*9@׫ՒSR:'axMn@#{iK·tz/*ZhʜK:RP˵ۉ{Q77y7VښUֶ7byn)Xg{̉ *ر<#moGbd~l c\jp0BR6ly1wFÖ[-ptNbb Wi NRXs#jvK;}/4?Dޫ8,xLaC-0MXL-hmcN[Ԩb#R[+"À[]X<%ͬT)_tX"8Imt]F"8(%Q } cF-MNXl^Zȵ,Kr gIPlRZQ%v,)DE*gHcrErǴ"=گQVGFs h&08ZFv܏7MU I@q0_MYdk//?l'p89 M[W`qF޽\Ĝ1S{Q] S#LAzkQF> #"e꼊- @"1|*eCkvrq E9ٮwo'u:="-c'wF%Hm0_-gq:(a¡ ɬQ̾o,ɮ|ݭ fN=@ Iq3-X,1JxhS.lpοb6TxRup |jV:6lrc]THv[l#ȪwA! _/W44_؛2EGㄣYkƨP̸MIkGkc~=I RKF*'acu2+s9kAN#Klp~dV FlPDAbHzUSDbŃ& >=`]1d0zLE gCҖ:!ScJ`owm)X - Q^?/a47~p1.IiNJkE 0d.`PƮ(@7BM#]ʈYEVU`'sB p4VãX ){qO9lNR.*;~PXZ {*CsTwuLxkT4r biKܮ^8/*D[ӵhqd @CM@K9aLɩh~ucsE9Np*>%$wEegRaPeKW0Ň^k-]KkCpaRHv;IbF@:|&îe<† yԅ2PQF;B#1N&L6.ͷ𧆹}{ 6Y4p8HRU6 S 7vB_/u^-, IDATLBf~)~E12.`,"Lyu 㽟%DpQJcR3C(A//멘K޹o"-3bom9;"C^1,9]ʖꝿJ!ҡte4]h)g6$[F/w3{D8则En]=K>45YP9 eFnfK;۶7[ _ Pl/{RZQ#>;u\d1ĸk+]?@WBI(:Vm'%2w‘i@Y`^:(һ۹$.'%l#\;ŝ<L־ F:4I//6 ˜ lV$"XR=DžyU?W>AX%|4QYTFrl-4a-#AìgE6a 2uIz_V,Li/W&ZHLn-g+# *!!2u\MY3Zm泤ǴqNxT1Oo) ܇weO^U?$ F )w(y4s'N `#Rh%xK~gV#CB$ 3Rk BT0gE' ʧd[䗍\sg&UE ;+Lt:K]\ JT ʞI bb \k@XLV^ g01y llmnC& Y/ i(h yKY?ŗ\oi^8]9^wpAVAau68N'a368\[D)dc-Аbn\D.l=VؘA_25wC͋ځyI5ũe1r:ha6XKvg,A^ E6(\ -MKd_2[g/S$O{UDm}*+ ż{rB><**q-T4r''Ҭ3T&KDBn4E!H`r5mbzElNLmd[ +ty Nr ::t/䘩Dˢ",6H;!WΒlPԬ̏Q5Us` S=mMJtƉ{DMՎELq'գ]' םStmj@:OJW`z/$!`X g30ه[M[S:Z~67սpHX-9"&͟OjדE+}! ]4E8>nWPI䋙zI>&IJ u3$l%gL^-6X\a 8` 3qѿsŦ$B{;T _?JNxln,ʧB+0cނR{$SHj^ITYm3I8!ZZ:b0?fO]mYh2AH/)i'iu:in'&qQo;!_71*^~KZyHGh<{v_g2]6s~ z9j ӫ{XBbe{,TREaELTyвv%IXROU56]A8AA^RSEulIRS.1 SДahIUfa)M+9b/b=KT@Glf xmN'.|P1þZY\li$!.qx=YZ@(H68^"Ay]:V4cj?r 9W9b<>TfYrcV2Q \BF@[kOT&ay¹I^!L&S{ȗnevu# 0Y+/Mǐ|SQlmmˆs#8k]t(#f5s4"2w<%\UU/{(!Qz[[e"]kM9 b%rX`{vB3lM̸Y!t5iC@T{ـj;.]``q\@Ud$lzVZ ZJtoN< q4j,3*B8JRêRviZXgcsi}Dė^XF#(3@ЧJG VkV>@ X~Jmm]ōJ+E%A!6HHv#giC$Zn !YB#r,01uԆbH:=&f$(y`Р?cԶCv*Ջߒކ~d 2]35`Hau+Zb}&XNPXO6B]LڔLOQAR-RJ6b`!|f6Wt.AF/ EKf{.#+Ý2X+ iLSllW,'*>O@Չ3`j`|cllSv]P5UVR- Ԓ򊁥${B<$mvA  A㰚\<[AR k]x#-U;MR@|Ea}9":Ւ Zr mVY&b6;u o[k̓>!JZH~_: ֞;,yi*?7K J-չ=5xWsɗ@FasET~!Ӥ` ?|LoωA^/ih\H9Y .:TNtK˨y6#)e |5WH2:q]]S'7 ݥ. !`J, ʤ%$P蜽zQEӀAm`R/Ȟo`S+!;:~* `@HG!0<,gJ 00"ԄV`[ʨ}軻̵YޞƔ`MnHK1MYHZg!Mf~{岪nRk4i" J+cW\\ >ZkG4VJtNjd8F]#!xi- , DWȆ9aY "I"8NHdsb/ nnIB=J%&Vpʌ-M]Խ= KÄY-SDf)ƫYi[ FmXT"eG?L˴A^#zL}A^vǂ\<p" )qY ZgyTK}ѱ<iUaYVaXY6oDK%D.wB'+PIDV0kU )KbIa{J>f$)H&/3z": w{Ct+Qaqo z50 qzbdYsB@ыfX~j]c0*΋6V0((e J6M;LX"?^YXo(Nf]N(!(f@N#FD0yV׉XXK( 41Qb ,a夬b:)JKVq_̲3Ϝa"b ƁB7(VtA];}\p>f\?IxY%-vXu@UrƜSych>;F>/=CYv*ESSϱ)`iLjb-cPYuj *V!(;p]`k٠.̍B]1 k b0Ď^LvPBd& @e>gx1T"Is"&Vb ཤ{'#3VY\pmgUW,IoYK qc'YkW18]j*--4 |K弨};PWW/|cK$ZG]:dbb o+>]dA*B!N*I\.8l=* v|EK[I#~ițBdFd<$l ^G!9`Q y!,b#ܫ"#3YμRJ)?LW}nFbdzy~9F~ ʱ );,Z˿$y`Bk3 8#ỦGs>{|009H=#gByQP$Rb*bB ׫_Uo$_O Ll+6'Xs[.dQKS0#s#G5ka7B)<Kgkӧ|mn}=֊&LUI:u-FAML2 Rҭ`Ȇ{zvFPL xr}6ؽV=^4,|iYa]k\W`p~jȓ惺;8Y1IЅ&>iB*IWDWo9#S@hg+ j;N~#`+L; a̭`K8bRK8ID#ۈ3㫹li:c1xdOC|pVHbf(waW>9Zx\?iB#YmFRpW|vzER1J@iEqChiGLKy|7EUPykȽMMl+fI $,HjmQc"ԅO}P);<.M[]# %0ڔ9{Wթʛ -8y KV> k+f|s4"rC  1 h۬l^@~"D^OGs—й"`^ҹޫ7IP2eҩqBk 3v BEX{8*"9ZZqzwAUz"#屹)焷.wd6<ʟvp2'm!"1=`41Fx}^YH[;&ՐG1CZ&t2,b*KH tUk Էzi[XNǁInExW?SG2; 9 dq p(FA3Yc'|ǓWYZԂ!f8{ +BC`촨[R(V왺W}*Q,´3-l`+5"lPX wWf! x rl=J{sھ{N#}ӧކ"rp4X:1G&rR?@Hf G6H?6h-Xp]dzFb(dJhq6jAY5j\t†Ns*8#fxq"8q- '] y+*Z-ToҮ[@Bu`lP8=`}#$ [;IjVC%IbH_ G_@F\(fȞO;w"b (, {K*l~'$i^%BUt #"4bNܾ{$xNוHU^[.oϪ!lԓ3ёD%082lHҌ:@`~Z߂ൺZ/*>mEݥ>0$\S{?!ԑx 2wfDNV𩋽-Y/}͔ ^Hy͜ a1yo=2d %WM]1o71YEGв"dƩLbt٠nQBc0(qBAS{W!@؂ϴrt9tLY Kũ{bȘй3_䠠@D-k8t Z洵6A-x8ktS QNymH[^MIKI@ܲ8I;V!UڞԭUZxqQd)|Ӭr>o,V6Tf;l*RG'C=xf$[*̿hJ.-妆7qcv(Ql3U{q;%oi_7Md~!r{k=zbPpXSuصԷbiTGsSsS\Vb; ]?ՁS}lp(/&"qЈW^نid@] ĩ243z$EuҘF7T}Q:?1C>k>0Kꗋ?ILFzek\'# iFyDSwe`>]?5UjXe')gH`v:q og/پc$ ;R07en,6 ^bZ-a# utNR9ʶd*fy`|# rzp.؆Ţ'窣幝:ş#8C2O͊zy aґVY+5c?G͆ET|\*֦O?<&d%3`-SW|μx,Q-}dcwgo a*c~Y+V2K 39|24Ng0eQ몤lP[qu0ZkmzPۧGG;~-΍Riibg3uJ\-^L*o$5B$1̃B8h0y+aGu@|X3z,R|Gu^[|QᯤnP3Ϙt EtV,rLw>Hӝ=憐g뼖oyN_$H#\F?M}T;2[Zc ]ܹ`6+ [,&E򻦊,.ac jHk:{%PΙ[ R[ˏ-_^juՂ bO3 ty򝼧 6"8uH@{S$t.ͼE}$h؆id NRZ[zV >#&yEȪXr DCL#Z|ܧ)y~wguل -^9FoGvLjAAf/!tl/%W]DeXYBZ6A']@#ᵮķ~ժ v83U7JtڅSA"̣?Nopy^FQ"L0/p8t9[ԬB PK/:l÷C"AB"/*42_Mtݥ`wR6NpH1-+pVK )+o2Qk6O{Y\6,=41=J="9iAfuV/3^)j=d'i<}+K9 p Xr )6!ᘲLan}d~謸d R:#`k|cPЕ* uplQ$ȷ?lPe)>cԩ6«`*/h K@Ih:׼.t>s /˜ $$ZLQ4!:(zyo}>TO=Z}. jxb^;Ȼ(xUSM٠j+n[[*[=(m+ Y"=P6_OI-HJ` *&͸< 眏Ew]^{[ԦY62ډAŜ=sw; - |+6HRˇPeY*,"[S,vTt܌պ'XRD/[}6bMbMeM  ["Nc+81_u?Q8~4^C`k OiXLWo^,BE6:F DTdYSxݯcKU~lЍ{m;UXV>6J<&C{iJRt\J rrMvH ~@t/:@c6T6R"6* LB#]|SqA 8xWXl[i#aNl~Qq{>$$G sF \iv=X,QNB䊩bI&ϕrY2ӛcp)lAooPR\tm|(+l=nbϢP3守+IфHFch0>.%0smsRJ *=in(Uta$)`XKp )0@t-2]kQpOSV4s"Z.[x3ہ9ZR DwPoȘf:_:`4#tͱ-:f0 sCĠ&%i$+%pn?.g`sms9BB8U ;u9?6(5]]Rݙv1(kӉj^d "Є:Bj.m1 jUj+BܐvWHWU $gSEABB$^Ъ6?Hd[MˉM I ]w&CM St6/fr l \R6o|?ZohtюNѤh\z]Cr1UB妨4lR4o J9Xh7D_a%𷓳_Qyﻏ=iP0"ǐS^>& 9Q*R;|F٠xiq=xV3K(j+3E {)@"Xċ ē U^w^,"{o+ɲly{/Fh! b#̚'={ԂTmg;32[U/S_W=xFf@ +y;ATYOWo%ϟq|}f A'&&R q4NMzmӠn`}7w! "em5i0XWEMp iIa&u(\ !c l`I&-?] 8қ{a^ޱuGb+i} ky\=XNvZIT@&GlȽ156hn\azv3AΘMrMWL٦A1A8jv;x;D95dfۨ%C+Sc sOh0LJJ} @Ih66Fwr$7ݗ=ff?Aiphfa Wwiq9uH"=Skhv!(=`+z9 _Fh4UBwhEHfJx6p1OAR|0DE!.iaTS7'(!% >h0~Ra87Y \qƛ˟9V Vb4Cڳ}cx <͍I[P0@*SKqK4tZ֪lE6^āJ~&(h͆AͰӡGpSiƃ 48$KV>8?gthX5{%*2_}n4|T脢Nľ Rh Ci[*OW OXA].wy3 VGUA%wlwơՠ{cV lX'~mQxI3 XLjnfϕĝR&z4VG6hNVzI9o8h͹LZ✑Kk *a!&4i Xħ VN`kŔ߽\]Kq [ ' f8FfV!+5:h(QVw*?7&m`0 ,7 ЃgoyEfܚT #΍i=f+՗6J~5 [ܨ, rЀ[. 1V&%%(x]5ŹT'fޫEFOS,MieW?AzSb'z2דZm^I'jG#[/x>Hva̜UIBcMGӿ ԱD1HP{V,pqLxc PC0nv4AzZ uW+O`iٗɯրRX)$|_:lӠpғf"٣Y/Al㭿20:ykɃ]1g@A!m%oX{"I)E _454Mj*Q`&OW0RITqvm,J,=؈/LO08f3R?eـdw6p^>:d^?>w0Л^JPF3i3uV/z}Xޛj%pXf̸~2]%{r3FkڣD?IS2FˀAW ,%IIK J@c(z mX {zXj1T3UJ% #N 3@iMC{cK`r`f(K582˾j춃 uxDo1c}7/i2lAܹ"@2m-3bsAX%M6K?gsga[;!amԜ/'W1o~k"W$|^ cB\m:a_2׀%PU a@j`Fr 10v$g_Uzkynu:xEqARt2 *Z0C"qEg篞Aoϒ2K肌S>~Ϗ>/VIOt=X'}B1<5*ѭ1Ct~|04nc(eѠ{ltKB%zCh Nɗ+ +1zV 3 DǦb`Nefe&b^H#yr}c #23S,14fiEدdq,>_QA6O Oyq'=1#O ֡70) ֥t+HJ#=2I^.D1Z<{ wf=W7hGa€b = ]WJ9U,}ӹS;D`LaRFeY`k*`fФ_Wr^ d߼y wiP7PV҅#x*{%N-]9+xi؋RmѨ14c:'hGk&Xgԩb hʥ䕆Ro- Y,ӂI '4;3`ƒع JrH:ۡ4,d yjYD[r+ͱuIW෗G8[n`2}+B]nFRIA%J7w\Bv辁^'NsJ>E! :WؙIMy$08ǒjXq=dghJz꒥^Ik).X숰Dlɪ)ñ7R6tΓURZK&4,,>["o\BfU%lǤ9O5rqt#KmX#֋,]5eA, + CuңUNGA`׳`80cP_ήO &MB>K9q3Ƿ{^{]ȄOeͤ)'b:}U*6`&0+{W0)uTj 1 3Q}OTδ%H-v2ݽģz'({v`c @`I0PnkFfqa 69.6Aa3CJ4MiB2I{v;q^0 dXs^BKe㟞PWe Z4XYCpsZshl\%`<Ӊ{1T6hp8>~2jڏ n & ZD9ǁCsɂXF}4^CSׂVY(f W2qvD)a" (sm< };:Eәa)F [KqU045񏀎qԈ\RUj7;FǺ)*[='w"v=]\"ge$48R'@βG$c`eݕCV 5w>5[?/jG4)<11[+}ז6hm4RJ!6=4BrQ jvj@'82 )ox`ֳ*ƞNj<"$,S։ǜ.0sJP%C:ĭZO X æ%4hGa-n0?nh袝_34GiпaJ( k`L\ j<4ϋyi4 S{KpADyӠ1 q(`_&x|]FۏbJClsZh0ֹA H;yNb{X*qцuRaՃ:U% 8\.&&rLD6T&gۜcBT\FQ +rƹHzX;8 R7 Z9]#'EoȈlҠFy(g_A=h?GC-|e"΂)PH|MCef«iĿn5NCBPJ{jøt'􋎯8F`)^A 0Gq}Ra88pj˨DŽ`3иX>Čƍڌ>>2z48K 21`gL}uT.X64ufu9 Nd,J26`SdEvݶʞ{iK^{4(`O,0ZJz+)Рz |Q1ffk^2z NQL5It (A95ogEgƈyuB.W hPvFh0ipNv4X87iy~ͻ!8\ c9OG1 2ƤnU0Ybժ'fz^ŤAnbEeǓrU8Allİ ܿ&5cUNf{K(h <מ!=`A1iAmA|V[$QY%0H=ڭϭ+X ,qW5B㯷+?4]XFւ3(;k|4h:kiFVA~ sA)S=УҼf,[-Ia+0b\t%MTCP^blvOta&U^@4j a pM@o,Zad]?"6͌}΁x]+=׵?uGDJ\虽cZK{5h0nLwnp ^t>R$wTvXyN1yHi ( D$yF5Ť>aܵ VӍ,/EDB/RfK~0)6)O*P%ȭ#]Luhb1"x9G*!e["`1gtx%b/U?7|AŚ ΠK۸pvhɇ~8MTIA=%*JߦQ158QRF(dQ`eș sFext!,t To]bA̋Wyipn]`Y5m1IyY]͟:s@~Eǥ(4Mkj엢$K/W!6ŕ3TLʣuPxT}/kֽW 2H)`kd3戁|UF}pKc͒uMw[ʄhЭ 'jeʄ SK9OoᕧDAO@ P*yNS3״dDzZ "NA[g~zcAO>-Ž$sCPB^"DAI~: PDxM ȹֱ[g.rfPq䦾͹K$I()!=5BMlR#Hilʹvi ς.<)'ik! BY>ifWѠ=]Lڜ2uCwK&Dh^Lk'8ڙa]OSm}_:ee4`d-Ic%ˢ@hPW`5 u\H &{8ful9=l"mggm1LgәKuhuXfdhI#T흋H)"l-?錟;ڧR]7&rɉ )TVFBuxh+iD̻eJd}9ekW?aacm8QV&8"><޳LA>f,PmU߼Y>k]HW>J#~d *E;Y/ 481 2Zkr=&hhOP% ,K_!Re- MH˾ CZf&1f$ǡ՘.SSʀH =0}7& E[%_{VQ?^#*jMSiO:0 tG/FFLYԣitH(t:; <}ԸDv!SVS`}zt}4FT=5à~Y,F4|^)Fh-6 n47)[֞[x !?Gvf엡Au w;asUebSL*~J6ql]N;7yM+`f[y֟)Bbaz# 5*j_dٳ _))HϵJ/Ű c gLaSqu3&,8@:| |f'ðrܿўOd)ԚI7',*VFzOlPj9=E4}5klO P`M >Ⱥј#WPlcK2Eb%YK">7),w{9]H)M|!bf; X _ۣ3w8 ͆{xs- =^Iud BD63F"Pc`ބ ΄*hE:>w2Ϭ"gNsekjø\OEtsBjwDLAց3_wuþ@lf)2{)EVO@McN|1ZǕu=~4ڭ6~,<MagjgD66讇J.Ok @h, 5NGُϧilbsIAGʢ6o1`5QڦAoJ9R" y9dG6XB-sanQ6 6g5bn_urnaqpc.& " fe~I̅Rb4k{\ )/m""DYE^Sh 4W4R"3KN, ] .%SʋNGo9˕=!MkP&z~f3/U:iʙ~=8GX񈉘f/g𞉓2)+ɛ\IǤ١LGiM.㨤Ǽ`X-y aCɍdF%kRzCS Q'iP7~ >M*2=>4Xªd<O`,%*) W ڲ: N} )QGd._>AMҠ(4(`i>ao51lKNobb`&DKeTE*0(e$L  :{ƺ\޴ɹn?K+JQuuGSc\4`j ej `Q>){iPgCBmdLcYew;O{zcA,H`63^Ce'}in%Mn_\݇?qi9,w.Zzg],݃vBY!5-gW[PLE@1 B9l8pn`nC֖Ju<;Ui^Wd&R>$vbL y, fr!BzѾh%3BضPNhWLǍ ꊌcD4ߡAbN*#t S<}.6BlO g3^§BT(Zf^)`v,Zskh*7{v=_B6WIs+u(|-!аbO} 8u_y11%pL}0;졍xV.!]`ʐzei:R"H eq|QK79y,u 0ȣhF_!2b Ʊ)/Yh8JB7A# 0I1Fm iPlO9^ fvWg SclAiJte{4j-nP=J/JuF>h?hJ_i['M ){#KCS4 __R3[/Ѡ6JDhh2pit1KY k:H9/FGgyYI 5D֊3gwѢi3g@"ףC$5fD YGm#5C>Wb(E7F!X[_?w;Xu]uܳ|d}5Lǿп.fsRK c$qbJ}͵4(&QoY F,Q"hG+`v@ IDATIvicX=s{TLJe)px\nR<|*^kj[-<4V3#URB]H-{vǓ:^K]C3~ RhXjd!y# eQ0m#!Ud9&L<}/hp'UӾG?Ç${شSPvzufvnH?ЄVCRѬhC(j /A*q1 l tLr J\ HlɾLș l/_~G}rTi2S7biEʔ0ZO~9(a*) ,g5r6 /K ۄߺ#zS]z<'9?6+ X!y_RH: · Q- ,5coD>ktCIŚzIFqZ~7iŀVhɭ9_GtߥNa܍W;0=&ꍃ?t`ٛdW⑕\'ڋf5c{Mpe`}  5 Wc_b ̯aW`~jÛ'ޟJţ#CG6%- 2+ mt!%Ȋl}md1jËg!^e4FA.{F}};C=x sa|HipZ\gs% Ne2Q`y}]vR/<*/9 [@g]k$Ȉb5RI>UcdȸZ3eOơt˸0z5w. 0@B/>pJWC1l'=Ýh!7Gn,JBU+t([P0O4+}̐Fa#-$Ki DAr Nʺb٦J )$]2Ay C3-$gzTlo-kSS ,Ϳy,iXS!wi>>.,h||qWBa#4X[zl;}!N\QK9J;IfćLFiu^q4>j}?qZRq-֧? $wWd &4Ѝq-X,YŞ1!-W #k0!۬Rheڎ)UuElH^dXXQ*wh0w0K1 00̇pVv<{gO+RX[ C)t%x)֚8fDw{&6K94t4[a}SI-,ovd|"{'Qs9%=~.Ux)/.Eeh֌3!,PV#`UC=lCR,6KÍk v8,j]kLAZ G;>mD+Ihri.t; BQOZ/j|PRV/ y@Y;7ց-淀,nm0&pZ6z#Tˇ~]M3ߨžJ4d!8|q1/ %4[hP7D2A QUhV 4; o׈4)7FL4UxuńJ NjBP'*3&rxgmP b@rlE [^}8x+a,9*1ͅLh<2Xx:.}^.5vq$5QѠ$t@UF PhFc`QKGOjh0rE*Vz)F2Kc >>thN^b0oR.𭉵m$rj?n@ G)e6\9nEN]+ ^+Hҋ') Xx D~a+"%]K NIfҹ5æVPXqQ=y !"fvDG;3*R\$ZabTן#YE=ؖ6/}f ّKzz߂L: FH u:O 3ε6 ϔ@h|OCHB43q P~fRMlTmJ4(HȫZ>ۭe-2^zNO>%uI G0wXt0#6= GER$;*0T*o*¹/1&չ d[n:7{iChL{e`G˄<Wbd)fţa\g€_i@/8'ژaYr9P`"EEC{9QAj`T#@:Aͪ熐.9kKa+ۓ!.X3z·S>}ҡN=[& Շ}BY.e5X*ݬv7fklqyTw^Ã2yWΑ>2ZG0ۏGɸ%t{/8: 4Ax) l6sؘ-IyWW ۀl-[Rj;$2t *cL؟]0 0z" 'i` eX^M{rMd%`($ׁbd^*6A@bc{1V9@-u$k'ġPˤ9Ym]́F&`oUfofq~^95#`S1y ݚ=et2* IM =MUQBeX>l@Y"0ؙضouہ#K=rJ1~l/A| 4cM~ܖ*Q@g̻ݣY;~1}.2(0,IMV]?XENcJ Dػ :A? 6 tm6ꎯBT+N%=le$n;AJ4ۢcdk<(o4J/ԣƺPL} * GkR7(CG7~#^)n #{4H,) Vִ~^f*;O⊘:챙% ;WuaQ KLqj_cf@uFd8ݨKHz)'D,gc4+5$M,Oxa{rԬLNDyccbHcǽ<  k q浬'f\6UTV! Ye/@5RX?fIJDRH'NNa֍!+)4RY "e4GSKfZ*?/G3qN`b{u RKvhankl̋e6.yi-O$84ɔ,Z|+CA^)lj_۸8]CG0b޾6uꄡؼ c0чƍt0Y&R@q-cMB/pbFK7ֶ/\-!qbnT=yg3c}ױ?`jQ\ {D=dpX)zVDvz!<ו\HϽt] RM <3hY_Qʘ(p|]v1HD>Hoiߓaţd`'dŃ۠odBl~_ŃN9yb|\BS3[mLjp*} s2#DZcʘ4i[Vx⨫*xLPyځE`yz/ֱ /n6bO䑦s|Ku>Qb*ܓ^CpSe )hb =7w J 9geo1E_jMJՒEzهX-2 (OMp"$z ;!O>m4v| ꪦo9%"w7b )oJ:6\EO?V7v++{0_?'7!Ks托r9 <v/Mzi|at\d^2b "5S#%᠔y^& a}8hΌ"gPȘR#hi3߾=[>[v{̥ח ƺEeCpxD/'|jY,=/LDdlٶnxdSr48"hPp4P*Tj0pr_KռHQpNFWll.%.@C^/>?߾og}f]xr_8|Pu–(Qw%C$PDlxIҊOrI_lI+uF<:> Ԁ7ɅV798x3{y5fiƬS_VH#Z!J߽ 1H'Mٶ2 >bǐaI4׮Jd44~ѶJ g,r μ?>o韆K"º:]Nb[u<"e'K'f&`s]7\6/Tv^㬟#+B~ =Y 8ys;JiLALx$P72j ' ޳8qð+'0!)x ̰ސ_2-ĸ5v36㚟 3HY"T1i^d,dGGTKs iK;MwyYeL_PRZܚ28$ (ƱYjYz%"[wܾ?NF ٣!UVyp".d*ΞRXh懔-c2~cەk}yc~FvCD&-Vz@9H2Y-L<ZٗpqAqp-7ʁBt7ATɋu,= R nJ^SEQ| P?O7t_b TfIG/W?|߾v~ q]1[XkPQR{vj߷~j1%GcCe hP/鼜"ߝm[ua#31cmǷoCH<T&f Z!񌌖?MP9~>%5홢DfVM L i֫҇UI*V`v9FA˱sh$qUAՠUYx@ƎD+T@)AL1f_q.؈40WE\&. }w-G ۾t/h>[kG>/Fٌ5%s2J JbsGn=:.qXg]}\H[%wZ7]kk yFXbUCe.]iY+ <Lyd-H?TOzV 4/( *1TF7kȚHJiTD{Jv5Ma41?z}F>zo?[Q^`r&\Ss_q涽}ݶzb_׼|8 *|i Sc@g~ gf#7#L^cgz\*S}Eߒ|A:3zo3ZL.юSY5Ly[ _+ :,r쁢&gnD|@S+51hZ󒱄@ \ Cc/M͒h TfA1el,^zʮsEoGk>gz{FϾ>~|-`Vc*@մFO`IY*Pzбk$SB ͺu_En?E$<]z ]Mm:ҙPA 㨼7>}E&X鯪YƎvh RL?l}fz}޾}>_ijbbKZ)iXYpnx鑽}0'_ HPpx`P Z㣷{m|}??}~Onh|{[+ex|݆YĒ)W2_gkycݚԣM^{k/]9D6w>kǺgWuc泉o zj|LѼdDx^aYeKbID=9t„/ O~%w$4kx&`n y sUSP]Be) ޛtķ7܊PKFkн;l^4?_|FVZqFq ?[]@Lg)qpm Oecm=PDހzh`N#b鳔l(Y:ff5kyERI'`!eGǿmm?nGjc1>GSx|N1IENDB`dtkdeclarative-5.7.12/docs/images/coloroverlay_Spinner.png000066400000000000000000000272671476226662700237550ustar00rootroot00000000000000PNG  IHDRH&G pHYs+ IDATxY\y߿ΝCip),) b'`N yK80$1?0olI=k3CiF\l^w9|y./&fuCvUSߊQbX,p"z,bX+e,b 1VX,bbbX,Ϗ:]87XbX,!JbX,C2bX+e,b 1VX,bbX,2X)c|ZQbl_$Fo'Q 4Jz:PZ,'c()eJ Qu]cӺRb9Q~W۫~0._:x(싘LPN @X,X,?~jjjnn.f)?' \W"zJq@GԷ~o5UkQZ}O`wn} ܫK#wL_"@@ Q+h,PLNN^revv<(JgΜy7>{V_5DdyJP-ljm36 " D%sNxc ɹT  D!3e@DϜ9/OOOK)y;WX>}:IWmxXhDWy&ƦZ,d#[;?ZۈF!L؎v[aC@QdR2ёQ1S [,3P(LOO_|yzzqx@Q0<{SB qqImɅ=Z$滻Y(Pg6D@p Uj"d !R$FwRdX[ejjjzzzvvù%S3ryqqRdOL&5i6t 菚˝fq!lXJ,wWzxŠo4Q-7wu[#A9i͋W2G а鿘 |'k}-6cccJ%MSTjZY%,y1A x Bc "...;{}36r R{k2'ԘNVnvSAscӿ8wM·SGrTrX,5+G~%"uZ <0lè+eN5v~nޯ1 ZnK"~ej:Y(]!qW3Qg'i,:Z D+AAkJH_e+c4=f$'D&Zv"7|bٳrs] 3\}sP , aODc"Aj$ɖt3@<\ɏi>LR`nj}GZR L {w?Z(/c4XЀDP$Uqtt˧ObuzWfVT<Bhm9 "% b=HFR+`Ov~ _~`QJ_'kNd; ѷ^}ww&/SW˫vbtO&h"E&5&1::XVR4Vd"P ~EaRyyLd4/&PUGHh"dZTtiH)#N*JȶH)ϰE]}VK)m6;;;auy'$JMViWrjnB+bKlRbZuC)NZ"їƽqo [9I?ԩ(W6eZuf jbcbRcRc*~·l9ɰobqttRdG=*8Ǐ6d:Pd҈"vz2gUYZZjZ.[Ri-Bue񀜔MjHW=!3acJiw(ׅgD:31&^=JV /{9KXr+թz/Ћ6!_ܹ=7ݙ(2Vѩ1.Q.yB8N$EҒ3r̒[BY@Lаͧ}!8X݄H)3Kd}}JwXܸq͛foz `cL`M)$SNI|?\c}!aƩBA:ǨkjNEZwT:z[?Az;_3 Ԑ!RdcR%D!Q78672&1F$@*j5o͸(v3W/̝sc^yC( (1WҎVH"@@ H9X DˋFŋŢRk}z=OZA#qu8Cˇ0(I݁g/RJ^Q,qynweeEk=22W{D{7nDQmd %u]!8c≐2V_o#֙h'''&|S.CIdtb/JިNi74=,fѩ7S!A 3cb1cHB"Xa_%^QJ DOPImSJt+V"CD?=sO_N܇(Q2W1" AHL-yoɦͅ ;:#aB96Fčj6662eOY l}LX=ףt~eR)tJhq<22|ܾ}I*1O~KRJ<}"LK%?j|g~W+n BH͝DD\.S3lBj;ͱtB.V44 y<^[, @OcbQJ*JRoWO /v( 9& 9]W?$#)Q@ TJ@Q/0QYy"Ad7B7n@?VvRs6b%jov]qonn@ժjYGFW8,h QqP!ˆuђ$i4||sV3n>u]VBs $IKC7;5Dk?5ȹ;TbLg6(~ej{[+[IW"O^ļ@%!Fwj45Z5E lP H(Dp' h/2AKc%g> QD7Қ(M踚b/,Ǯ11iXtP:D%;c^D)HJҸFi7njMDZ-hA::͹@ٷz {サwrE{;xP2iZZZZXXÐ W^]^^\y<],:*DN1Uc&`/3 ,$ID4t:,25 Heɿ˼tQu' )GFFFGG98iV*ǰDw;r;.uצO%FZ_߇E$F"OȂt'ʮHI?ӟCOHpP\]Vi=kIl\!&%Ts(:c2&下':eדd;6V-Қ ]( LP Cc2.Hg(\Xn}LDQrݍ[Z?;vw-6dH} !DRy1/^sS>6l8w:k׮q/du=\>.=:W\1&Ii ©~!yaXVٙl6q`0bٚUe^C2Oq&kuJ2==]V *OKHSR>RҥvC A&"ҪJ}! ;<@qM](NR' @@:]u:͖J&}@: pP:^Prd,!WO[/5҄UcО"WυX A$_!}-t SpXZc7oQ5wWZAxf\Rx t }I~v/$[ _%'{BBBHxǓDivT1=Wa/AǭV+_IADA,..]|y_u@a?"cDs㙲sfu'z7)eO{u'&&~Fɖ(/ي iT*\@ɧ` .@>i\q>/ܦE!:@8+k=Tbv| D=Df7D}F^) @֐3`#HDyGI$Os` ;J#"tzj噐]gw5uݽ_L'szDNn{@ ~5hQeSL^*,.,yCQ8|:d]i 0M1tY3ᇯW'9v~5w>sz("JDlfѢ$%mO1pJCdwv' 6z iĖ0 *cR6iA,8ĉFC1Sj&(FZ@1~`Hq?HJV<:::>>v9vh4>ñ۷o\2y=B,///,,dQnr~h/|Y1b%OnR(|ߧ~;!i(O~rRmq:&bcq.ONķ+#Io>Ry4g_2:JYqu^ٺA['t5e»mtTΕFK!+ ?,=+̞*O`@5>ml |DtJD zl]C.~.ΩBMcLP\Tj￿}~p2)HdCHݻ \>a,>3O]Htee\.*r6͡KΓ*q l{aN{MEQ:cc^?zSCm~Xt=jZqB Q!JV~gw ݗ+coNN<]Wҵֹb˓WF z' J'd!,a|oWWmT؞o7fώ m/{4@pp@ -/Ui e1W'gP:p$w&܌lfOiqRʉڀ5>lNNN.// triٖOl޿nn.1jn޼v~?wH31z}ww|Gc666/Av)%SS~a/xBrA1 DY\nUK gϕFUD<똍֛SoN9(Z* c7@0@W6~?Xn7b)V~i/_%bW$!_ٙ'ӒE{\}klzs&3e#~}"@DI\v̙3Nns3I8u_|Zr??j<"' +  a8ۖ@X+dS|!]"&/_ɞB=ձ1a>vh۷o>p+f⿽wvc^0UFŋA}6v_>5B8(!\K;3Q*z_mjzu㳧 3c^Էʎk#_>5tS9BKdpC%ǧ.}P}~^ vL0Kzνz< Ɏ0eԩL-"n ĉ<@D"<~oi=ˎW,w_^}[wעN&BOQܹ8wLVx`Y__pQ*VLPo6Z[f#Kgt;~?>)+W9γgϮ\zu{{WAc=OŅ>t^@|O);Zoۯӧb⡒7nxhU?/ ' Ԙ1/M"ZOtK'֩1 e~N K,>n!"h/kI?tQqW @ d KνNn'@H_: a#Or!0˯U'j{Z}ۗr>(&fݷ[RQh<e%=gHiy:P(\t鳟,瀚.]~766nUH2xőܳg@!Dr̙3alfd˶ccc~~~bb?t:ﯮ<ǜ?+dPxct;k?2i"ѫ0&nhV|KnڝJ ޵'B<%:%"nDpw8$ Ht C @"~4H{6/;Q`_ȣt?++\nE~33g~z "lDC4E+b^o.|*捍 ́3+AM=LOO={󼼘r^Rrrw$Y@6:}*MeΟ?9uىQmll\~Ν;Bf^nw!bNt'B#yt5w丯U'ΗU7tPB@DCxrE@1m-u.H7!Pp2!By|&ܐ5vYkz("͸{7[{7fN@8EdeX'9|X8lr@666}˗/s34M766vww8βd2CY299?ߓI)KRgguj\ԝ|;%+ǯ\S!' ӧGGG+͛7;R32KӼϱf 'E '抎fqI0*Wtܒח/wt i=!_kHN*uP^3j uq` w.x43vwnf 45kK">mK_i ͓$IӔwiQ3u]!'bì8Y-B{ ANySI?Vo+++fY{Stx9xR T\˓ _\HފJ ]_J/JLjJϗ$ؓ F(2H z#J4`Y[+Vk$od K[t\c™Fo # X8ݻw=)e"1&+_:"\׭jv&{!D$ %:dG~bEq8WgNq噬 2 W[7-Gk"ǝ g #7[v>})' ]C &vBP_@ւ{'T$]0ۣcըw%/ȄEǕ ɋ`zK9KiyZgcqG4M[V^=AJ) "%y{A0 _dx"B(5 8}8Pp.#7?ֆW J/G%bqpg"I$;堸٪ ^h#$l']eLGMQj;~iX3Na}[.[_עg^\އ=:fpꌔP(!\z2f 2'…Ϝ~\,|X 3R :BBH@vj`q$16ko&%3D=ݣ4!óbggӟxE^>ǯ͕<qP3|cv]bl D4^OĜ 3<Aq 7fޘk'ƽx|!D=zw4qsxe޼yZzRJ)$ ?G}Ϗ(ZV6ts;͛: fOcˣ\SWA ?qi NF"nßY,uD9`EѸ~z\沯gLc~ds`5=k#Q|}t[%qBEHlEEIJqIc=!yA% Z͜9eXT`cܹy>0 \2JZ}{-x.)E~r~?Rbyrۭzu4blAa 3rqP>%"Ȑ',b 5Q}+++.\Vb1fnָpdѕOfMmy~/+e,!QT/a|^֪ĞeK,9n|)ӥP:Bpʑ'uX,asڵW*`XJf {btid:&cX>|XKL=MNT'B7K)@H@mXƘfl6aȃ/OIǰ|ɦKyfrP_qBYINI6DcA  N׼=A .|'F`{qݎ~y]j5v`W䵳`#f#m9?[JGADDDDDDDDDDDDDDD&`Q._#L~XhK9Fo *Ȩ溒38I rc(HrPT 9G󌺃kUQ\~u ܯo+OK ʁXo JwLwu}rȀ)`q.Ud"p6(lL=-Mm\d 2<,ۖjKVY,u xV0,dY2]bA.B 'MW!XHꯜbDAQgqFAQgq&* n )Ă|0]bAޚB +~X,6r!wxaIs6+ˀR-KIe-5p8@/1Maݷ#qFIo}:; ܣq~x0IENDB`dtkdeclarative-5.7.12/docs/images/dciicon-layers.png000066400000000000000000000461141476226662700224340ustar00rootroot00000000000000PNG  IHDR@ S pHYs+ IDATxw#Ͻblc0kJ5B'-tL1ա$l nznoof?{oN{~YJ#4y0! "0:A)Ay AAy AAy AAy AAy AAy AAy AAy AAy AAy AAy AAy AAy AAy AAy AAy AAy AAziK&}Y3-b˧ɂf|Wɢ斿yGb 9w[P!b`j%fV)X5?Sn7t͒Kd{n;ƋZ'+{S'n %:wMO: G?6nIwfj|ٔq\Ր}_}@w +-ĶGbh⟿unanz_vx-L bΡ7et&0QSWdǗ|utԶmnvæ<#Ys?e|ł3{Oqb?q=.RW/i{NkNTc˧;gz ݭ_?ǚ~5s%M|mV2k'7Mg![Su&R+~{4~ֿxhILs#>uT2ß9࿽{hڹןE/}q-nOvCK}G}o'ʗ{v[gj_2}'1W~. @+v)B`Mb <*U%/}Gva͏s%{Η[8D[!ֽwFn8t=53=ho]S^ۥ'=tے b-1\ sި0_8a쾯N$҃`Zuܽ[9CFTh-E'O?Φ#>xz=.#O;umQ=G_1s_ЫX*VK 8s~|N< YP+*- ^OmOyxDogx/[Kh[tZExz\ N.}svhacV~ozH=ꧦNٹ5Cfuxv9_~-q0倵_[cv=蓪&LZHvCˈyxѝ7m`Ů.:KW>E 3c憺}+Pvoi#ON~aø۔=Qf~u) ؝*FGϞ2S4VBʞ=UQUԅyED8={^k^+r\@h@`WW;DMS"jv<,S"J yI^QV>м~ 7pӞQۜ&?{N}v}m=lp缲=Su5 SrԿwdy~f~7\e9}hm7ONw3_mCv⽛)?o2Xtoފu|ag)Zѓosk1][(K'jZtF;cUm>^Χ]|N> $3 9 [licb}8/X3k;^{o›z奏|K jjDJ#EEZ;.a!/v}|go58딋Vej\xy@ᇝwN UR9 ռ~ys~_|{y{^?_7^t;ɽOs /Ăׯ;9wuƒ}q:螷'7b1soYZh٬$̹?BeU2Ѱ`揃9QG~Y_ָ-D) ыyQ]+9?g4X~Q'_w653^;\>ѻ (bV9{cxGx?:jiy_ h"g>}Ui [)ØpD9!bqZ|O>8똛ҾںX2+ ]}cD| EԉgW[n|ϼq>'͘gΉ5&4ayEG D^..Z׬d&a"+5*LEѼTVrvxi U7ҭa Ơ#^kC׆ Dh^Wv@z!}*kcbgzcF-Yfڵya},:8rdÌ7ҷK>lSxY3yo?k~U,өXU.u5uqzƫ/Y^wޥ/^_l1B+V_]͉,@7{2z3`Ad `FFra\wonvC&Xaze(507~ 7ެM5 _`DKJG QT~EgNV$BۧULz cbd[caA#W֒ ,[,ԧ-tCl~ɤLJ`` BAt49֊z$ Gka|, [E Q)5#.&Oe*AFrb;p˖+a!ۉOZ2X] qb#i5Z:A~,`^28fo4Gbv9~e!`z)% t2*cA'. ( K82ƹ-%ij\d;i'% a8يe1& m\  Knb`iA/]lo Xy3Ÿ mg&s ` K=S/dN̎i!1i, dM5RnCR-jK0Jo%5H7`\B_+`u^-UL8[FEr5IiX`5є 'k xm#340 0^3 g ar!vb׶saejbHrp.0rj ;j,l[!`T,vLUL~j\6z`v8|'^HXS 20lĈ]cZ, ,zY-`먪B0i) e2ZK3[L-;єFm/Ra ֯JPQ IDAT0"Bc u[hJU XQ%!eꜢnĽ_و%3 ( ѸlwTD;4#$Sq5>bM̝fκ@ vV( B8t81ѽm2ZEڛFAtyG*%8l[XڈXVxnYv S9`];@p1Rf̯{ PV%o z[ÈM !d0L@ e)mQVی ?vAxr:B Ci)־u1<;/Hro%Y19*KVn{T̀;

%^0 BN60$838%0RqOD{ӖcPFtEZ+p ._ 9s3*P[V1mH%DU=>ZcXg:_ n9Ľ6շ4Ϛ6@Ix>)/Yů(G!EQEQ!#7!EaTDѽE0*OqϗhHvrM}|:]l/8]`ZGOeӄ2]/k #X^LE-o y .B0ΰ 8#%HM`]Y0UYr Crps@ILQY/jojiJظӵ*e9vze1((DyEaAI vH,Fq%8zjcukD\P xxWpċ EF^~_"dsδCJ8 ǯ9_,u߮K{x ̴qu jO^&[sDޗr_y\3ԖzhJƼ&.FDI2``2"&#()@ibuSΏR|5) ,]f/@ T0~:>[",uq8:q[̄~Jhl ~t 2 !Պ5Ƨ$hNwɕZʆ2nC׃vƖwv7S~m_Te6vWlcpBJ"8ha3@mPFI Ź=nSo=Dj|4#v~`?Sc<$,&iwP!)8n=o^ra}.Kʞ\\K`z^f bU,Q*O\//Co[}ɲ{Dp~ K}A+Z2´}v\%"b0 {ސ읖wعPa*x.1gѰ☹Kk;^k9xtvԋ*;9t]qm&<ǣTap؝0ì5ѕ?yD-yz[l2R=Sghh'Kj(01yc; QQSXsNg:Z܊&OK &`GHކ?Gcdi10=]y_iW c îD\ǚ&LS) 80OL£N7zif\bez^<)S10yjv4́/F1 !l"l:Y!aaa).f㘵uc>T75h*ٕz6]^ p`M# sl/+Ly dn4Jߕ]M:M 9łgnJز=O=p_B[F_ )w{g']jY:uNGLB`?6LXQ_{m!pPu:פ2=yb#?^Le 2;Y]J9mh9[s<аl XZ[Y.xM r|'M4X&OT5\XfHGˁ9] lPVjZ3'-L^aG 0:͎xL/ hI y{,Fp+%'^YJZؓ@jvzM۩<.5ZGɔl 45͎AeMU$,@dd馐MVd/ۢPiʸB0uq3TOYl&`~A< c6^Bz-W<TMhSRٸBcphyL+C;^,Ow͑zi0!Dʱ8T0(4 z cɎϑho/6o-B;־HZFAE\Bz @3SSڪP֡WJ(2]WbG%nCsL9q p)Q){XFDE\峆y<-mH'zT#cnО Q^*C2VYt!{-BvҀd^ vȲL1M|' tܾ_ZCY0V(=Ly t+; Z4Y'dv*j9ņWb=;(N9hʛFT6ch))""(! }8ݿua7X m63MnPL%uH,_Nڕ l,&!=} R9MkcXe"Zz r!U y PT4!d<,hvfx祥کнV+cʋ-\].7]dfNBw?6ɢ L:bSQ]]K< W6.'$A#cŒ<.zIO3J˶iy/@ ]\SvqQ*y{przf-؇;@hW&Pd5OcB ډۥWx OK˰asIFwvԹ1 nTZv: l+SMD{p o#hu.e(?'YAt!`Nɽ\*׫?MX;_O?/ւhion8hOyT",xhZ SSYTٴZ$Ս.0'X8:RmЪu/ۼFU #DOSk- |6L |o4w%ةKczgU]g|tk2c*mOΤ_Y\6qm Bm}@tu<5k´IFIW0k&q6TnyO]_b0+,G 5)%$!6T]} ?E10"ZwjPwO;,XƤAݮRC#fAmiuK|RTMu ))K$vSBJ ɑ,A^DO>KW4q߶ɻ $10F*3`0_UgO =eM& ,OBBBJ-ؒ2ro9ypmmh+`C[tdEM=gOw0:vr6"H{ .l')XBR[Cg=wBs )"a!5s&ff?5NY2*Y˰d~A J?]DVSwIaڂ'C{!M߾{!Rh1m+Ap+n1 \4 A٤(PG&Z# n.:lõ'rYu!1fBC9 }6 Z6D<%J?5:ﰝM6YK>q$0ј@}u͢)@\4Bhv* Vf}Z]oK!=<Zf*^3_qu%v36( n!fְ$RVo5HYHp4%QGM ͨiFcq QꙫCwbXevFDi Eې!,'QGIؓ9'cNT'/N.axL+{4`0 L`Cnoof ޫFV_iHz) Mm  MIİQnºYH.]bX݄5I$-=ᜅp*]ot0X4ѵ=ѐ7Q6-lQO#!FiW$ ?҄DO7d@mne>0KkH+P1[ we$%nvpƀXӄUbkFSTp0И@m36U bm[0~;,0J .G!lV2奴?T_oANF|^A ;-R%c+ doNs !\D&U>Q}g) mS4`Ð&m(*iz`fXߌ"! 1[Pp\ YHr4Pǚ&jĊQՀu1s =% ûcYQ`b^LOICKvP[&9F4l)\@pg`08;ٚioz17֛9*#Ð(*H^T/ʣ8|8~\uhP"BceQ("&Bavl7n±pmx I6ىۭnĚ&TИ@ch7>^QVsە%;pCE!N%Zz@àr-Ś&L cXL+*#{i!{.D2Cl 2Ņ3V e)dshinK3LdTJ#=23\oѽpib} <$9-Gm3Xi#oL#E%јD}5b} 뚰 }Jؙ;`x_:[?! 8r+=%P$ɰK_[B>d`RS)#&᭣q+`L84kLj q$nˡ @ nB⍾i[x@ JtSLY `M{zHXqX)4QGBVA4a!3hXG#n!BC\'Pیf6>$b),Eح1ܲ`Ags k V kcԟ=_WED Wn։p8=1ۨP+g!pp2 K7f\!ѱ$~7nѾy( )>Rp"anRn!FOQc{; b)'I!Qf! 4rm p!twmJ)8hL"BBJG@QQVkD}/Cg}!kw2إhhL( L8dS;(tPf@4ٰniδA Ipi XdL0V{.`pbcw܆Ba iK ]\RC3ܾ_C![Lb) SSVӷrv')@J n>h& L sTٹSr)$9,vÞ˭3;>Ǘ3]#Z19,dQ c9өTNt1i|)v]m(*o,*,o?hF*^¹jR@J.X)˞W҅(/h9౦6 7Ls*}rIkL_Nn);M)v%T,GSmԌEճ-ؿSrKu695pE5S| WB8gX˝?=ݏ!$lghL %\}b`y[ƪ-177UCY]Bf 0 `F M gn twxB6 V]Bhjĕbqyx%@<.R[:ska8+XRU-]ݕYeYޘO%uəo2=*;಩980M .Cq#;0%#;dbCijab#Qo'Hkm+g-]@hkeN g@0C.EmEta(~eöإ? N^p|NZSͼh㰄UIT ɐGbAKEA TK-uϡl nv*L^9kŒT79grhpd ,rlӋ%FpGB`"<~X@ezc>8s{3 0sv$^{l{0', q<*oY_Ms+{ ` Eat!(5 ,dz96xl0IRÔ9d{ MƝBk֐gomgЮu" [T[ +o\_QJRɡbޜ#hH ŝO)SN%u$["!B3C!C-{1dsz5 訐d*<=+GA-xU1 !Ʊ#@ 9Ɩ }Mp;uBuACZ$ p ,hz-e)Ggo2Q H5 M`^?9R9Rʡ#<7Cl@#iQc{ = NF!Bn8j۱tntU"Lv|9*\B̄vBRKEaJV{n^6!9_:,E& T)KEd:ewb~V[)ʴ}gBvc5pw @"[ *ᐹ2姺Ps2uM5 NHL-;-T7"2)Vvi}ݴ%k^DD`Zs$:1aUXT-V7!}KX5L aI8 !+ 7-0YS5Na؉-&cMgH%G 7J]̼ dݒ"]D-`8h8'gG?Jﹽ%ψ^L+S*d8᱐ݽU*}"z-Weޏ4SƟAS+IꟶzD>; =f :` !,3;`2U/ëa<VHxحޑ]mW{pXZ=ٹp\8* ^W'o~1ʬޢ*1cMz{$?-Aĵ؁SɹSS {Z(c !)G>tvb..&V-&GRCg6ڡ>^`kO˘!~\tBvr{3h{rGgKE] 0mZ(5%/y ܙʎ 4SLo4gZ(+dpsѰg2P֐ ap<J: MGѓo)+fFhc+>+\a$]%y c9奭 C*1z"d[i {3eȉ|D=#Qe̷T C˦̂G6ȶt`xŴmҿ2ѱ(# jhSk pp 8 JQȽY-kQ &GHW| 1nE :tYno"Mn Ȗ+}4&9f 3 IAt^L`kX`t xkiC~΢L%hõ qhBa9Ñ3B kԲzzwU@x=Q͠^^ #s{Vi$>gՙCCZTzOg5oBy}<[ ,]]dfɡ\ p mΘw4 %uu؜0'#*0ai C$,kEMDp2e0ilzRsN HOGi舶D=|L j~(6lmTZ`R\ec--iѯ:mB$D|ff' iV^dKW/]\o@2 \j 'sgxH RnM#Sv_Q6,7#-!l/gzϥP/A`tE%GA:lr W2#PH3+`-_nRFp 2骥$p͡gL[y CXcrxqӻ|_@F5,ÈPzҳ:xN(xCb:5[r}{@ $`AВק\MZI;i1 R.N@FWq,(8᲌[+l?" _ii bô.cx+SNHEʴY5QlH ʆ1VYoeWgM+.0 3cU[tNiK+|0 Msj֫ݶhO-ud&Z7 +T-atv bS "t=['FA%$`AD^BFA%$`AD^BFA%$`AD^BFA%$`AD^BFA%$`AD^BFA%$`AD^BFA%$`AD^BFA%$`AD^BFA%$`AD^BFA%$`AD^BFA%$`AD^BFA%$`AD^BFA%OS\TIENDB`dtkdeclarative-5.7.12/docs/images/dtk-gloweffect.png000066400000000000000000000064201476226662700224300ustar00rootroot00000000000000PNG  IHDRe pHYs+ IDATxے:E%m&6pTEf<Og̀h[?B<>AB( $rAB( $rAB( $rAB( $rAB( $rAB( $rAB( $rAB( $rAB( $rAB( $rVo?!xC93 ۛ79el9:%VYm,Rirwam涰3ƒ8봱ŵd\EaT),cۻcɸ!GnjprՄ֊me M2'#ęOZ`A>[c&GlΏrp?m~5+Jkn+RGj9܎C!r9HG ,r_˒r1Cy<\n@9]*QyŏrX8m[Q;O^9T˹e]WU6@-yF'<(h!CTG:9l5 \q6  Ʌ@Ɂ:J(Lyٮ(q^DQ)FYrrq\&̵*mL.bIH [\?0x`U%)/@e&۶)3,rzN?w'v8ܰ~`(6$iT?ѯ~uo6) J!>>>\E4 ]}nCeNP Py90xbI<*l]jn5- ?JiF9;9C56T6rjk< !R.FD]L*_f ?z !Q؃I0;ա!#䔎OCh !CrAD#Dz.SChqЌVPyŒG|8-, 7sk>Y9P 9ylWf3"Gۡ<\?E2K$GjǠ:]]ᖯ:$6"(m7njʪ Sbh]1fDjunY'״I'o5*bv']9lUpfxxx^H'^V9:~XEnέM+ U  9璜r 6G'%mA!hfP1r%eN+R஬qpSU -@~q',QĊ܅b KRuƸDuܰsorr)k=GT ;C]UTg,>ߕ0/-n}c.3h. 49P5řPoxB!C\bkTK hFrY<`+eX-p2$~m`y36so&"<_yH:9gdA+Dz,~'tiQ7 3:nKUܲ}K"q^~i?GF9rzgjZNٜ$å?Zw$ DE܂;W_/Qjn̪(n G:TDaDZ4*hsJQ~ ƺ Lٜ";UV(3xS~X31CPSǷ66op[u6IX-ꩠXV%Dg퓺\r)/VF54 TUD-ġJsINR9{V3]!6dF1tr^\7l3Vx/7D7]B:9ji˧ijVift||NuÆTUL}IU+G?msJp6fSjȆ)~C-Qra3K9ުIV2jhGVW,K-(R!9TXwmm` ˣ# lㄪe$zfq}o"1g(^IJ׌!,I*?PPmbfբh2hI^` m(RqBf˙+Gn['pMh*ĂmBZدI-G&IU65#'>%G/ĸfr`=ڼP [w_*r`N]BHP?fJb83(r$.n{.]_dh #G*RNX.D;`r4&^>ѝCt#RY{bl93}?D`{'+|oPf~o0&? !PB9H !PB9H !PB9H !PB9H !PB9H !PB9H !PB9H !PB9H !PB9H !PB9H !PB9H !PB9H !'k.v3IENDB`dtkdeclarative-5.7.12/docs/images/dtk-spinner-blue.png000066400000000000000000000021051476226662700227020ustar00rootroot00000000000000PNG  IHDR@@gAMA asRGB?PLTEGpLu}kb\x?tRNS. oC:&Jx^ʬn{IDATXے nLUEw>ϟƏ߻ w'l?E\90q]E4B|R!Bd`qrvs"\bdEd);a :HLSֹJM{k_cB\$T mCR pY[5 kq,df ^1YAs/!"ݠs,=Dp0g_yP`r3: =t%G_$3ʭnLO^J0yz"k*[(dLj YS8A51?T |( !jsZ ڭ+ J$xbUK_&.@ ~}>f5Nۈ1FF |ѭ+Ѹ(3 &bR3@hͼ.3 8ϟSsƁ]G^JKfY=w'h8gIɏ+P~3}?ؗ(E=^eYkr6]z&:H7ݿ} ;@2C^k,wՙ$KF4Nt]$5J} AUz RT〃tNN) 82U bЧ`S__2;ɧ v@ L:45J V23=ZS>+oT#' m1|xERxr '|\HspMQ]s 7T> ,ſxievDI!loKoFeIXTh 7[hA?{eҸzZKg_{;IENDB`dtkdeclarative-5.7.12/docs/images/init1.png000066400000000000000000001471041476226662700205540ustar00rootroot00000000000000PNG  IHDRu$sBIT|dtEXtSoftwaregnome-screenshot>=iTXtCreation Time2023年01月11日 星期三 15时34分08秒 IDATxw|Ͻ[b&؛ 5j+FKl*mQ-5jլU{THĎ B}r{3n"_/_sss[y9{ݻB!B-Jv6lF MB!B! ȕ+WHKKCYЍB!B7퓠N!B! p B!0N!B! 1 B!3MaRf ?y⫔dҢRR!B!z 6Jƺbl% % (Q*(Ps쟣^x?t}>zB!ԩ_?tSBL4RanLiIӨQiT"I?Fcԯ?B!C}ƾ}{sf͚۷{{-֭a߾=۷;tOxz}z ̇Ӌ%K[}B! SSlmm|SS\כHѥД6BQ@F#ThPh4(PgTN#F柣=hr@!Tzb׮*жر;vbnnFV-;v 1119sV 9ֹ}B!Ϙ0uW-Z $**Z"E9TXÇo||_ !_>ӳe-(Z(ʕcY:]F@WLToPAC\l11.ȧ5s E9ƕGɏ9u!N}RZHV'S؎u52R!8+W1ctnƣGkԩͤIYt~~~88exO\zSSS*UD`` nnnDGGݍ/mIIɘj_wE,X1Eơ%J0f̧`Ouz{UV,YTX1c>%!!'N`ooܹ?rMrqqTR###?-[bĈB-&& dY: ܹ˄ _s  FFJ455NxȌs?`icIi[v845:o'LQ<|4EA#/tE\ʐ!1c۷ɞ={ y̒%Kۙ,YDn߾MΝӧ7Sre~yA155e˖TP]vi_rU;WbbbXJEpp0K.g ^kJ^=6k|}} \tЎ'NЩSGT4zvzG!HB CFr3!**Z'9(J]ݿ"Nԩ5 \K@*gϢz%:3)a)4* Jvx2R!X+WgUV{R}spp <<+aFjmvqww#::Jō7mw?B --m۶wiAAA:˖-C@@ *J{իu:]]]033c,5$1+VڵkB'#9 (~:0tZ9F(GRyÇxV-TM**iR'JByǏgذYV=BO?-?wdy?;w nݺDEEquҲm_f]$''W>@+W(^z!Q*/@4P*(022":52VΘ`1+'ӒM#$)#ININր[ HB֬YKjUiذ۷[ =իлw/^Z777Ϟ=#((ǏCs !hjUu~֬YZШ[Yy-jԨI)t'KFRgg+gϢH<ՙoF)9EMX%,Ѩd}97;A(ӑ"*;&`oNBB*MidK!xÅ{t Lrr27nޥk..]ѩSGu 0edT#͛7R@RJQb By^ry]> > ݻMD)J3=>*?O+҈Q~|###XW"R)%G0hRi`š!o_6m V.]ĉfyj>|ġCtJ*ʥH*s\OQQQL8O?-&11cҷ4M.>| ܽ{? @dd$cǎ3g, AAA̟M…9s,sZ4B<04IInx\f<@wV?Ollu+<<<>S0Nh4h4)hQ1j|NSs+}s4UhY{gT&F @!D1s ޽ʕeBʠUSgjj”)S{FH"v̞='̜mn)[ZbBPjhsiR6hhԚ'~SN!D!abb3gbŊt666$%%:/Pk4(j4EzHفFIψԠQQ+5(jKN!DRz5O9~xA7G! %%L|Q/(A&PHjIyjB!B8RVN12E? !B!x5d!B!($B!BBL:!B!($B!BBL:!B!($B!BBL:!B!($B!BBL:!B!($B!BBL:!B!($B!BBL:!B!($B!BBL:!B!($B!BBL:!B!(Č B!BibbbHHH@VtSkLTbiiK#AB!(22[[[*W\M@pp0888 B!'111`aaADDDA7GVVVh4bccSN!B|yA7C2$$$| B!'jRnER|LB!"i4n?#B!N!B! 1 B!N!B! <u666( UVw^̛cuNk֭[C2er^fzt̲eK(W\e4h){9˖-Ctލe˖`ly>U~G^ܜ;PF\D!BFE:377KδkFFF̘5[2g .^O϶@}ŋ]|]v:oߎի6a\geѢܹsgh4jӦMg!NNN/+,YSS֬Ycl+r\UX!CcjjI M6eŊQRE)[,5j ))իSlYZhZ_gJGGG<ŊA+8::舉 =_!B5zzHR(Qj .j׮Mʕ)_*TԔpN:Ell^}[Յ&Mr*lmmP<&&&-[j-[fFRqU"##u8:zᾶ(X@ƍ?<.::'NՃIoUVh4J#/BMwEDD{)zw<==T"Jjj*m۶ٹ4mS ԩ_Rgڴ|>|h-Z4ۻ;wZk_8ÇdZGÆ 䓏IMM%::gϞc;ٳg}KP!BZlAÆ _$((SNɓh-RSS ̙3={'Nh[VVV;|QQQzǛ5{~j_nJ}>wsL`Ԩ/Fq('Nܽ{H$O-_ڶmCD( FH[nܸϴ?_UVfTXf͚ζm dTT3S+W[q޽hV*UӰofS9̚5G)GŊ]6UVm6<|OXZZq֯71pz{w/(UM6ҧ/_=`„\zU!B~2Lߋo_oJ*СC2=W^ƍ888P;+WM6<|;caao~?/Gۖ%KФ}mݱN4i2׮]7C/Eᑧ2d03Յ?2zxz}z 4{Wx=HHHs|чޠj*?~Yf祉9boT*?#ɨj&L7oa_L{ba:ܾ}TUz~MXr5M4櫯xx>N! 'NF/6k<=RVMyϠ>:uԩӸx7=zt kӨV-T5kҨ[Lؘŋ3bćY^kmP!cِ!9w<*Ty%nݦ\cǎs=_? A]ժUt^?_ؽ{Jv<ٲe+\?ŕ!!!o;wΝ;w?P~=ZjI~}'!!=={|rʔ)ƍζFaݺ_8|gǎ~v 7oS1 ӫ;c{"|ڀSբwwh4+W%KsnZi0*B! VƲ(ty~n'%%eV }dhh(O4 KfI8;;įwww7fF>GGG\\\?glap-||all̼y?Qz`G"E5#=SU&FCٲeYx!.]g9zIII 2Xg5FeuPw>Bv3Z vIeھOUJvuZ k1~$$$%kҤ1m۶ҥˬ_+;4i8L;9 $!!!W=|o}FOΝHNN6Uboo˗iܸ:tMФIcN<;FRq)O /7oa۶[o_0~,Ϗ#Grlv5k֌-Ghm\-^vnnnx3338s,O<ӳ-gΜiӦܼy8}HB!DfjjƳgشaaaARRR禦R5k6ofĈ9vހ pYhQ=JӦMRJ,\ {yڵ븹"007מ;wOҶm[Ν;OӦMuqq|2CF7t nݺRzL 8'''Ν;OTT&&& ПGαcǵ{K.MΝؽ{v$ GGGGv/jG,;thO XPw:}EGz-||Fk֬a/DѰo>'(Y/. !BW̌0횺+VY{UFRRE:#:W z}~ڵʕDDDbkkΝ۷B,Z{?ZHkpbjv:&LOdd}~ȑQD 7ٳu9~E^:Һu+_κuh7oذ!˗ʒOϏ.]:k(]4˗ӮVucuښmKe?sN( BBB8zhժU#?;TlPprrf=z!CӧOoZ _|1@AA)SFwKs =eƦ zm(Y$k֬bMlB!pQ((Q"ӽڶmOUǏWRJ}tmذ'''ի=gϳ4޽{O*U0a"7nо~ޞ|.]'NPD {ޜi\u 3ͭJ8cbbBZ5y(O7`o@ٲe(S ]vfzl<{c}tϙy忔t:HO7;p:uȱcǘ?ofUٳG#s{BĉԫW>}nɓ7o>CP* !BW~zafffmۖ0 9y;ԥr}Gcǎ;v|4VZ;}=BP(qFh}m6Ѷ! CP~=˜8q23O϶b͚޽'Oپz,B!C-yaذ!8:C2u늉 Ŋ 11+vvv9r IDATkϢEh4L2'駟лwooΝ;h2dN|'mۆZjn/ArO n?SSS_!B! f5 RSSDtnS_RRR -f!BQh$&eM"!B!yZ !BQXi4&񆓑:!B!($B!"(JjuA7C2*N!B|baaARR{ d,,,|uB!B;;;㉏NST$$$mD)B!B䣢EAxxxA7EVVV888T !Bϊ-JѢE LB!BBL:!B!($B!BBL:!B!($B!BBL:!B!(dK!Dxn W"lOǓ!<u!!!y9M! TMB!(49s5|}}hѢ9]֭ۜ9sƠB!BʗjQvmc*gi_ĕ+WO9/%%lB!B/_ǨJ(3W\%99&))8yaaDEEԕ_דN!B!KPNxx85kٙ7n@^NFi !B!0+YShj_~Y%NN~C П~s7nĬYҿ@tܹ?„ _PV-->$0F^ɑm۲cN"##u;r˖-gÆzYu͚MٲeQ<~ʽ{ws.5k֤xINNؘXSJKK?5u !2Nah"ѝ?Epp0'XYYR^]OʤI9}֞uңGBԹ1{,ٺu=xtڅe˖0}ל8qR[>}mzAAA>KJJ$((|щq)ݻDGG5_g=xgϞq-B *U??:wDLL Bd*?G^!DQ<'O2m:~w(MMMHI~ deeӉ䣏Fܴر 0q 0ת;ws\u6ϯ;t-_ݾPuԥJ<~˗/]vѣ>y)S 4Nŋt2ɓ !8.iii|&rzqZGm6̘ ?_?vvv :M`kkKhh(7n >|եdɒȒ%Ky!<=8v˫A)U|0:u`mmMtt479[,}͛ @PPk֬… ~۷޾gIIIae̟?nݺb9eز:O?-)-Zl2~T*ӧ7۷щn޼Ϣ,[VR9spuMNJ703`,Y~)12*Ce&9ېo7of+ϛe:gO/u늣#8qe˖-|2=zȥKӧ%J`~'|}/e+~T*i޼9K;T* ܹh4nܸӧaNkڴiñc~=7%%kײߧN@B(! uGLLA孬3f4-Ν`iiɢE>XYYv:>|G}Ǝ [nfZ"""K,]ٳ(֮]R];O 6 055aDFF@Æ rΝx8RIƍ9wիWdΟ|~Zβ|ƃb- 0kkƏZem |L&O !8p۷ɓ(SƕaÆRr%>hA[0y>|~;w}wJ+ j5QQHNNڵzO;={_qFGhGDDRq_(Q2 ̅"?p}\]]|""$KtFkgI]x333 V ~Щԩl۶VZeVbbbGSG9^GTRJe/${ǹ:/\@%ҥsA]yILhcJ,mFVtF,n݊/ƍ (s߻wO[gTT4_= ~cǎl۶=^߆|L"""e߾̛7_yDFF2uW4k֌#Gh˧>k21mۆƍ{nY^>u.]~:l3,(+^7nS[ll?;GJ%vvvo̿sy՚BLN)&dXbs=ʔ)rݚ5k2b=zgh?~brNS;vҫWO\\\N/TvPx($rz*oP߭TLLRzݻwŋеk7ʕ+K1LoNDDDf~?ً7F}ȑ:}455eĈIMMЙU'OSpsَlG'?. 1gܼysVYT"zS= -63߀RRRh-Z4$\E#BBH"(Jpuu2'/wܹ=z¦M0x ׯO@@QF2jHKBXX?vmw֯HSlYfn6˸QJU=p:w 7 e˖ 2R yĪUڵCH6l(npM-[z ]rSSJ)Z( gѢEܼy+ϾF8;;dRߛel To޼En])Z4=ے%˲M˷nJ>Tj`֭SN94KJpHJHMMϟe˖|&9%t5-Z̨Q#Yr{#4 VԫW-3qlؼy [g7{077777ƏO~>5z}^cƌ Ԅ=zܹsǠ*U)S&qa,Ǿ_Ì%Jccc8}+|ϟ|>dt]n?ccc#̙֭۰{r/oCjtB@Jݻz8 8$N>+C&00'NיuB /6wvv]KPhӠg5=cux"}~eu޽ ۩%~~4kv [-uWpwwvww'>>;wfY8p6lTVYfꕫ[SN,Ζ>ss3`b ,^ GܹsȑqfiˇJNYtAAzkZXXXп7yt2nܸ1֌3$fo>s]0v?̙HLLJ8:>_SJܦ_>}7K.1mt2d/d: kJWm˖ҧO/鍝qqqWS9sl'$$0r 4/+Vx9ty[矏Ɔ̛7#>ԩĉܹckkKDD^^ Nll,ѝ%Jƽ{} d֬٬X<Ǿ|ͷܹsѽ{7 ?3-3FüysY&<\ln? 6RdIƏR -6͂>޻کmժЭ[W:v@ll,dٲnsQ(<<+++vş`y133c9riӾȈÇꥋJ?s(ȑ#P"c~FΝG>i޽e+++6oti|>K,Վ,\胅Æ=W|yV^ə3gpqqaکDJ^NHc&ON;lPzNth!!Y9~/255a۶0n,Y%KҳgoiH]@@~ŋao,ZXne-[={kT) ֬Yi@ΉR,,,ز.]̤Isկ3ARWS}aÆsm['_{TdI~m=[]|%KOwg666ڵ9sSǸtD؞Lq:x}i'ObŊ S%߯s;^?yY!/ !DXXXP\9BCC_پlz^[C^?uvssF`|UJ*Eɒ%z\rXZZ꤆8tkBAժUܽ{W u:7j3gs`x-3lPjժep&Mbmm;}ϳݻER^=٥w{^Lhpor٩^:VVVڵ+r+V`o߿Ӹq#ʔq5ZLMMR Gy֔p:p Waatر/D~BGfff8::T*U:">>lӠ;::P(2GBݍ;wRr%-K^x}qww~~Y@XtO$`ŔEnu) ~Ӻu+&>>t2<];OyhSo 3z  d7#ÙM2i3cmmRː k}ʕ+sך5kYfm_UAݼM׺2Kw]5c[ê%Mڎ; LmGRJf۪il;؞|ݍ~k椤%y5}/o> T*mU~+SťFJCV %y2%mݼ"k4U+s|'_Bbbb )) cccmFc蚡4 h#4-[ҥ'BzuUjk׮kUQ(ҧݼuf~㶶cbbHII4=qqA||ҬzsuܹseKi"CSH-tYdIj1)* `caA߇SיVK?3vɩ`݁9gŋXлEEedZthX/Weq#V8 IDATkľ MMCz.cy! BBB+++HLL|/!=Zt#F|Hٽ{/QTP=022⫯ ((f͚quy84 7bMzedۿ@mgӦ?ӧ7w TVB^sdڵ[[7bO?hB.\y)vTZ%KjYsϏ۷oOժUqwwguYӳ-?fǎzohS'ᇡ#""3gW&))>}`ccՆOJJJbٲ;Ye$$$PREؼy) M rj~۷oܜo0B!_u}ZT$*>nQQ/6^*O'ԷJĊiUm\X; sUyZI8}֜'!9'˙Mt1guB1; £9}-KN=cRvZp{\gWNgzyRT`UL^֊ :ݧNeVnKl?FlR.C;7),Qi_Aճ<~͝XJOl-Y'4HW;77aO_~/\We{C<3#G9rh Opp+X{vJ7Jxtu7 ח~ K|r&Nl0ASW4hƀعsW T->oȐ!sࡪ3 uFLdDoe& 3S}O <6mJ ,:99CYYH$J5>LV&22e˖Y+ut֕6m0`@V\AQQ1 `„r[NӽF())&!!Ҫ3 dȐAkPGjnL/OR8w%I*bl/7Fñ OFd@;[z{ŭÑɆ“H31GWۆD|\fyd&R4r\?ЎK,Ko}4v< }ˑkLM ;O&OFsIHˣ%&R eWOc.7Va`Yu4hwՖpo B]qJL%/_Ғ >)++o8*++Ņ_ [[[ `Ѣwj-PSkP<߳ލlnYuţ-גojEJ^ |7GK.M~\76f\KZAzz|}r%ßɉD֭[} 9rKgmղjJ9*)<<<K641==FX, 2;X /tDj0߫*Y%3$"{z͞h3Z7/;;ݖY? vblK?TxX(e^|14B' PS6T*eРL:Vi}zKq#ӧOsY.]… xy$$\ #C͒v&%%TJ.Y#xc.Un@PP,\Bfx˗3?3gβd{РA}S궿2>|-VVVlII7 kA&mbc;+#F gɒfZn7|Lf /dy9eukkky&N|?\Ό3cy,_|VQ...&??t ƊרQCyH:],Ԏɇqc#6烱OwkNZv72 [sܱnh\lu8"ciQOA${ׂ.OuijTYVT^yڏ]ˡU31 *PILpLͺ]?= NnvT~AUٻzS A< h4zgQHI6lH߾}A]FF9'N[ӧ[nV9wj֏>}_y}ѣeUQO:͆ 1csyr|o-[2x ӧ)--%+K;E%33Ө+W2x}Y\\\6lhAJUƻᄃߛq0?]teϞ=4o9֭#9Y; J[^WGШQ#fxWMbffƔ)پ}~ >3}ZTT1n >ߜ9@viA_F^vg}NL2ŋRٵk7Ǐ/Ha2tP8pp+{A]q1cNDlwwk+7_WTbXl,\Iah t!F2ϲi MM3Gz&!՞OQfk$׳q5cP;;A~#瓙د{&t]17rӃAf_Jb$#oʇuΜK׳ߐjwii4QlxFg: Tezq~-N̥Laro$HPN{q=-̇  ?nok4h RT{n9ƍ̔ƍS]'mcͅZL> {{;rrqKKK͛ɸV>L,-ZxD"ԤZ^,--eٹsªTkz>9q"; (JBCCyrrr!44L b\tgѻwnvfIߏ;v"4h P;iP7'JE?8ޟ^XɴO|zGZ7qV^ K~8˦r6Qf iɆ7{*,P+yrZ`cFFN1/Pؽ LNǤ1^n?gC[z'f}g|%}_h^q"1==qw1.8ȳ}[0k^솥Ocx;Aa2J)^ކ1z ½x#ݽ@RD*bjjB[,]>[ncƍVe\rR\\\i0;efj:]͝TUK5駟Jbx{Ty~a䲲2L^}5&N|7x333bc~וnQ~wpQF|BA~~]im2awtw9::"HݟS';;G2tPvIݱcǎOx4iP7ʻf(=,6Avsb8X1i2;i+!>dJ;vjVc7^{ՖHVm1ķXO1SFu0*`Ӿa9q2yD/_*{n|OKK{`e9;تWYYYt:۷`OeذaDEEWyW+ C~ !~LL$hJyy?B]a)4 WtwzuS*F&5aaaaөSGxkRjС扈LJFӤR)}!!![(!wJe0v5~uT*.\ƍ? hܸQy{Ǚ3gi޼9ee*V@}Zha^rzNTT>Mw12<̚ڵtuHS'Ԟ'iXϚ.\SiԬ"׶2Wk( FCR:TMۉ\.cԨ\RڵkU3g 3ܹal˜9=`I9_̚5g055Ϗٲe+C aOذa#<04i…j|Q 6DBY8Ν;nj1ed~y7PTU_KϞ=8q"43f 99\[yսc˖ۇk?6[XY|GlذƎ 6l牏gtڅLrsHIg;3U9tptP䇳,q: KŎ 庅%JVQuFAxLLLppp ??`x]&˱D(ǎg׮L4[[[233+?n۶#o666$$\g5̚e7XMYt9׮1x FNaa!111ء]<++ٳg3sL^~%d29qqט?>uՕ˧eܸg8pR ʕX/)S&3~xnݺΝ;'((h40}4((((yGUߏ"2e#G^zWpgϞcڴi8ȼy󉏏駟qwoŋ077'8x?K.?rs}ls $UKrr2N?'? Tx}!!'E@WsPWYAj  y啗i֏KZ%›F  ¿ϼ_{Ta[   >욂 PJŋ:uСOc22j2}=[T3HoG۶mٸq/*3={"==].Hh oooH${hj> ^^\2% ;Ѽys,,,HLL$8xCi_~}iڴuII DDDpfrUױc!պ -;;ڮ Z LLLh֬>}߷겇rm/@6o@ZZQ@׷o6mJ\\їP4lؐhĝKY> .6mB֭9v8YYY>( >h֭[1h ǍIվNE_mIOO'55?QA]vkڮ Z~ٴiSr97nœƍJ=;Ɖ!̘vHˋK~~~4mڔ@B _/ Z*SLf۶?xYXZZ`,Y^xQwТ_}ׇ^ctiӦ2y$o'hĝ瞛N IDAT^l gƌ2 %ͱETٳgiS; ~LҒ CII iڴ fffFCԩ#G%''f͚ӵkT*.8ѝ'OrAݻrUnraÆaf&'"",,,iҤ R2ll'>>Rlli۶Nޭ&w>BQʱcP*)H0?΄MF ha #$$Rə3g+m[F0舙ׯ_𼸸xpuu͛>|^zw>0rݽOТE nhYZZ2tPT*%!!!( |}}߿?0\.k.:u*{fjjYYYAPS؂JJJ|LMM߿?111\EӦMԩ!5mcΝ9u44k֌Ν ^Ȍ 7n,:ADŽZ&2<ڵ6!Ji׮-۷ogȑ|/Fw_oܸKߧA7S߿7Phh(+V|>lqYqrr",,@AT+/4T*ϟ:OOOu$''STTQF!9p¤$|}}1III3^AܺiI*ҪUK<==m#+fԯ_Fի ү^SRR ciiD"0嘘PRREJ5nni4h߾=攔SRR}m s&OR/MKK#++ oߖ999U2ni4 Ԥ* 2 SRR~ P#hݺ^^^\zl.\@@?iii888QM899c4--69vYj\lmm#"" `Ӧh֏?lOX MNN'OEh fee qLTT4-Zx3d`BCP(l鋽DҥKlUjs un˗t+cvh;KxXS$ a^ŋ 1|S< _}GDӻwo\thttD"A*"vȂH:///Jwv*:uS)J?@.]pttӧpRUFCllA0R ]vѾ}{Zn~:݇'ҥ3C>D"!55O\+2$`-5ZGh4Ν UUSTݻD AXyYZZFn])))Xd2ZjɹsڀNAAZ٧N=qqqX[[amm]efQQ#٣݂9tp@5DFFWUJ%]DmdXYYQ~}d2YmWGA:=R~T*= ^^^":H .ᗢNTʰAu&xR*$''Ojj*7* /! [&.t~QAAA *9tu)թAAu   1   >)ܤIٻ͢ `mժ|m0a|:3ό}( ^SW\\R\ R1cưz*y・۷AШQC}^DԩShժzAT*e,^Koqss㫯aeeV 8T):dggPPaPGnnC)WAx˘bbbȵR)Fs011Glݺ5füj=ʾ}曯ywx97v͛ m޼޽{g? H||< 8[=:ڵ]v?rOA] Ѷm[6nd.J1OO/r8B^^9y$N> ͚5ܜ FCh kkk 9s<}{raqpʕX\]](,,d߾`:2t۷gƢRXj>ӹy3ԩSС.]?w0{=|'FזJ .]2 t:d:00S'R$2<mЛy3Ǝ3ׯ'_W~}fΜ?se˖STT@F 9s& ɈcӦ 9Y}ӵmȐǁP( ЪU+5jĺu_ammĉҴiSvvҙ>X 1b8~~~( >AII ֭ƍӽ{7,,,d͚OIJYa=&MȄ 8pAƎpsk@qqW\aILLʊ3}\]])((ҥ֭$^zi6F{|-F h__5QF2|SϱcYk _B~eDEErjRSS ½/+Ҷvv9rGbgg0111Z?u6J%2 )ݻ0l0,, Ηtڅ06oŋt)ƍ C7zAxPLDB@?;|:'i;cqrΎcǎW>:t?%KeUQ~}AAAtܙ 1aDY|w]BӦMYj ~999d2d͚Oy%|2wVi])SpAzm~dȐ!,ZZm4h j^}ZyΝ_͈#Yh1]t歷47urrr4i2SN̜+?A.UN:-`ƌ8u4 ,dŊOHHH^=',--elܸsb͚O13W_ࠝϾilEEE^x2MK/&44y?ѿ?V\aĄ'NO+**"((ooo033iӦDFFNAVaiigRR\]]Pդ_eψ?ר^sM#557|K?$(~GƏǪUyU2}=}oڵ1`@tʞ={055ۻ G՟w= ;;[fϞ:u46|njUjՊfͧvBCCӃWUN\F>9'h _ccr6pϾw?7| @NN.>3O<񄾞Ui_y}"##?'B㏭Ӈ[Gaa!ʿkkkƍ{{zΞ=KVVS=z^w}q&.} *[AcS`<䐓A4i҄'2e2SLhU3Fc#GR{o=///LLL|ʃh uUz9\.ۛC̱KKK#2[ncƍVk<F{ {ZMnn.w'T*d2yA ,,,M}Wӓ[|R}Pa0qd2͛7#11_eAȀ111aժռ}9r^zӷoCm޳gO{剻z Za ^N:bnn(vN.]B~zD&{/ ܿZkԨ~.BYidjj€t)333ڷZO9 ݽ1)8;;ӵkJeꝐpb\]]9sX Esu9p_}Y^ř={&77F /6X#!!=zMqq1))2;-Zx1{ \=zкu+|r}+>bŊپ};L}zcjjBhh([leȐ!\ 6lF&MXpQl}̛-Z 2225ҵk֮m@JJ ;w2|<4h {ѧ㥗fsi<6m*6X$a}۶ ??r8x fř0LMM#$$pΜ9 /̤sNѲ/sjԳ\.cԨ\R5d _>s~ IDAT7\]]y뭷OBQK.ڵ8Ĉ),,$&&;nm8::o`ccCBuV^ìY/\رڵI&bkkKff~}>)xbg %w5%'';@"0fh2228xP'P#YYY4hРMmo/^֭[WZNMzdPwE*W`ʛo;w.U  5x.{]AWcPJmd8::ҬY3+Wǃ}[>螷aժոlR^yUbcvAA%"&GGG}N:MFƭڮ aeeeڮ A*W.o3TJ^\¿)--o! !!'ٳwOҥ3˖-`ܸ $''W`όN0cpʕJ])v=zwͷ~MZZ?3їUȑOͲe˫l A  c@&3h{ʪk4l؀zQVvX///=w1Σ*>(C TЍ5'Bj"AAxٱŝt~'4JE߾+ajjJZZ>K,w<^yeo#:AA:l޼ss3^|q]tAH$H$4~K;W_#33GA7A JAj[^^2(ۻ/8 wYBNNqFfXYY077_ѧM>I&r%f_u)((DQcaa)4mڴ111aÆ2bpo sy憃w^z,Z6mڠh8v8;v{ɑ͸v-v˘=e Eu6 puukH$,--OR(..:;;uAjQoWYXX|[?3/I&lذ s=Rk믿=a³nv ӧO3w<}m۶h7yп? ܼ7|vϽ'|{XJ %:A{2쾟j4ZYR\&=2Ax ς+<~:RٻʃdI !]Y(KmEն?oV[[kkV+պ $0 IBdG! 纼|D'hҤIz}yUIRvmٲ[4~xl6ff..6EGGk JNNV׮]UYY[zͷ /LՈPTQQ3f:.3jrKO{d7Uߦ~;:z4Ow}Ooy<4 \t_\Z[{Z}ϕ+WKO?])$IG}m2ڴub_9wRC~JDM 8qBӦhӵ詫P.]4bDrC]``񍯟\VVm&IJO~h/&gXԵkn4V/?xXC4aJ5aB?_y&00$hϞ=z[dR@@@!sS'5 |SzzVL~~~xѣS4zhs.K6mܯ_?i׮ݲZOϯ)-Mt8ڻ7gMIypuYtM-\xBBBT\\o~f=zTO?Wk֯_hݻdRmٲULɓ'%)9y"##[ȑM/Q=Էoޝ:JKOzǮfr:Nv~_Հtmd2ĉb=O|>H"&BCC,-\x|Ϩb%ɻgaaasF޿ߦ\׷ ȑ#Ω>|N4;X˗ئvۭ%%%*))ѨQԷo䨶VǏ}DUUCZznFr-QMy׽ԝmǎLI=uT2%&&Fo|-_/uvsNϩkmek4p&/ۭ_~ES~~L&cACCCuk:5k, }~>y tXEڼy{_̙3eYwν6LSYYVƍ'a+al6y/Qj.#c5as5.{״xxx L՞=zkʕ+UVrPVVvui׽~&ͶO<5k#???-XpO)..N4k֍zy͙#?߯xjԸPپ5qc۷>R:qD[8h顮-dVKIII۷fzmݺZtj׮]!_~EӦMUYYۯ̝ڰaϞk3qj#ZJ&}ޝ=>v2YimPm0Ӷ^o-˥beggr8mGh5g|vzwKIbN8m顮m~:r϶-1۷w3fpҸ^UUUu1A2eϱl>.Ik׮Ç9p@כL&͘1];U^^iӦi5ru-I۷jjjTWgUWWפn; 0!nKJJJuVfE Rq ^(ݺuShh }&ϲaaa߿T^^Ǐ\(S;ڵKsթSUZll6<5\<4ԝ:uJ٧C`gݺuW2VuuӮ]p8;}Sە!iȐr:]:rH AZF#k8&[ [fSÇuy*..N999ZvvRddΝ~ȑ#u\\Jk֬U~JNN 7 !P^^.!u-!a^+ٿL$ :5Jis 륺1cV/_.=o>͞}Nw}O} ?~\'ɬ=JM2x`e{-???ZZCiiJO~ϼR~~~狊dBdRBB{}Ijsoڙ?}))uX$tj̘JIIQnnk׮JMݻkٲe-;**J7<[ڰaN5k,-[\'O6v]gߤjm޼EVk""")IӕJOOQ/mkѢEtIʕxv>|4eʵMΝ\KtmjĈڸq֚5kl޼E R~}VVYuut $pime6/Ţ1BVU28k˖-kjMl6M>M hq񒴴Tl6Xh޼JIUVKƎMвe˼ XVry=zPϼug~P-Z nF#G49m6=ȣ=}^,,,$BoN{5~[Z?NzwdX|V…w)++K}5F{{Ν#ͮO?ԧ7uݻ۳sqyseX9snQhhwejjꫯ^QiImذAeee…w)33S;ezn^ N/`2t=wkްwK٬^{suV*11Q,{[ ג4{lٽA%Ic6= ߻:o-I"&>xuڕBly7{\~.'|^jeee?-^ӧOoEEu9?>{sꫯUI}e7VO>G?'^AAA7ߵk5rHٳ\@@L&֦9Z6uhRvbixhr>_zi$V2L-u ұcvUSS#liHjnW``` lÔpc`c @ǹ?4ye[.79>fh3goO!C>|$b;hR}|p:=vٳWuQsCG!!M Y -***|͞+,,T߾}켺 <n2$N<rrr=BCC.)upVd_RY/|&~x(ٕJTdҝ5OWY&*<|~X/+}^m.zn=vcٞsUOޢEUuuOIǃ*hf,a±iϞl=ɹ;2u oPNN<ѣSramp8Zf.]sQNNN:.JJ]jÆ:u{Mee, b׻U^^am:mJII1cFZvm=&͞=[9UPPwo3m۶۪o[nY{QMM]\ ۷l6:G\{A҆ЯJӲy/[n;'oыOUt I֬q?hǧhY,?9Fm{ڏA(6*T{iuffۧү_my7P>Zk߇^:cp8z{aZfͺ2}MuhId uY:Iޣ&C +5ztN"ǣ"edl@QXX@FRrre2t:G7;})%eeڽO][ؑ)NIIC5d`Сh2̟ʴt2c* @v]>C2ʴ|3fƍ/٤Z8pzY>u%d9]n=&okwZ/|GnR 6 IDAT)#Pk+!`YӡI߽ev:}%OrNҩZĄks_ןX;4,FFMRkrIGk|RO)Vy?}k'hf5uJ&N׷}]ix= ٝcSv^7^돟5~hOչZ~dkGᗑaAztAO:yʦM{OoYľWF*mHRQU3[6 _ ߰EɻHⰾf_gw4%@sاDM+ݥ/!Y+[hh>|mXVV!hꒇ49t:o4{M~~~5ZoxvJׯ=U]zsAIRyUȰ =+K7Ĥ ՙ>Y+/^٦Z WRWSŇjlbyn2H+I!=uDMv=K~{X}/t0n_]J9Og~V10J?4E!Iaz{\!r8'Wk٦Sߞazh%쟯$Uz:U^h|47~:S)Ƿw*Xf_OUMz_d== M/>ݸ~Svk_wS W˔utoEcjǗZuF禜sLkx*-uFibR ހnwYIDz=:Q~z?$WXkiMBtWo臭y晧=Snq:_ 23w^3Mtm_ {ghBR^po%G`-{l<iVmۭ,:HnGo&UV>v\7FIr{W~yٱ#S>Ǯf&Nshvߐke%pK^e\\g~X:Tcso&I**m Ozh~I**},#Bd1T>-,PO@oќI}jlNE6Ѷc;iLVWXmuIq*j|VҦIR@.5'E(8gƐvvyW6,?YEemvj}/[_睏{N! ]~-oS[KweJH[o&O,I?\ jҤIڶmVH۶^]l6;ܰӐ!C*00ٶo0?{Wk猹ݪw{Գw{;huMql_MKo;*Yրpl^g6+ ԟ٥Z{a6z~^= xͦsn`~Aչ?O?&Ly'N7iw$͟s2y<i_^P?=E71$Tooٜsַ列zh͛4Po=_/W[gb;%Iڴi{oiݺϵp]:uNŋ_֫&a[k&k&qyP?,oW߾]Fzw7Pyuu7 Ťo>gӁJO;WϾ$oK5:!ZO~k ۿޣk{3@~~x|ۣeYIڒS՚5n62Y=*(Ua?R?&_pn2L&.RRiӂi m =vhkK?=Ea!:_' i} ˜8,F8ڑzth-t${k/_ۭc  i}7Y4Ojmʠ&uRN i}uܪ:/iͺڔsBw"{BS0}6mŕW^裏op%%%ZOY),,OA/Xs]eVEE'`缟~-ֶ82\/ߗf+I}]i޹PWE8o1O}}`1=Ad6հdQ=&j?]E_4^o,]~~fgi>[֑2zth uFo^(W 2BپzM,f^3,8%} 靆PWksO~:Yeׯ_пW5]׷f%GUlmYVmsjW'wwona*iÞ"չB_ؤ'ׇII[랧}7~vIŅߟ@?>ugx?Z?c)I {>[C/ݕn/i~ufl6tjZdJKKkfl~_!劍m|I$kpSUĄ]v7EҰS=֡m$>%^?ӵ&$OZ}(7vZqSI^jq% Iz~yoHAAApiGYrN՟TmΥ=ZI:JK̴'Umhm8Qnը߹hø^:02B\f^9<9 }lcچ;G&Iu_.?|N]RR&Nw}OUGg2dN9rβݺuW2VuuӮ]pw[-ZMedlWVV{L] "ԵbQ}}y][^^ǏKd24TݻGfÝW\.P7wUUUرc=zBCCU^^/ؠj*>acۣGuV\.IR߾}uuZr KRϞ=U__Gj˖夆.SSh RMMۯlojOWjDĨVn[QQ +{"IҡCnݺv=kqq*,,\p]ںu¼z7TWWÇiС S]])##C[_s/###&)##C'N_~JNNVQx<Νtq͛7C4\N;w(--U3uI\Z uMcdٔs^͛7(**JӦMU@@֬Y+I2LtEGGkǎLUTTw;6M!!ڲw#k;wiӦPzz:}I gWXXISRFZ#ocƌVJJrsswL]vUju]˖-k'/**J7<[ڰaN5k,-[\'O6I&)//O}.ө $}y^Je䂆㴪 ZQ7ZVM Ғ%KUWW'Ixܚ1cʵ~}C0;~wᆹ_EEEڲeMnvBqqqի @/ŢaÆ)++[Vէ\{re6/Ţ1BVU2 ,//ז-[(99Yƍ$Il>} C~~~MzQSԫWLl6+66V{ ;x>^G%%ٙL&* $ǣsv\.%$ 9>`f5{RQQzUuu*++Xlɥz^BLfy̻Oݶmn=vRDDO]b۶cG:%% Ր!UWWC+##vg\VVKi;V*--+ݦ#Fk>usNy^B'ۡ?]8LMݞ^U^:NfJKKk~óV*22b7  ~~~Z~8:Dyybcc[<_}$縫"O-rלLfYD+8u-Ė'IQq/{8jSwR|@y̯[u!xΠ&OmݺpCK;ҥ: . F3KWOwv\a&y PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``:00B PF#u``~{ayyyGڥϼneB]lllGpλ:Cҏ; RAAAhsu``:00B PƖUUUjvwvS.KfY!!! ou;l:\wvS.kǏWyy"##Tm6ǔ6QUU`tvS FCaaa}m-aNZVUAAA j=g9iBZn[f3bx_ۧkKxh! EIDATX(W5%&.K:00B PF.@s 4.OrT^^.%%%hm/%s-VJJJ|ιK־"穪J>W^5j^zE9:v˗jΜ[uOeeE˙fki-@7JJ nWYYnv"##.ZM-_[>6BCC/3](4OE=zD/!$Ŭ9mڴY[nհaԥK9uY111 $=c2g^=O.C].K xP6lhr_=z$p5}4Ҕ)StkXPDDbbb$5=8pn9΋`PիW?xX~XfϞEMM V}Щ< u"""""aӦуBfϞEXlJ|0~)-߿f=<|x<ÇꫯX.|ZFϞ>…:{믿(RI;ˈ 0 nvpx߃,)YҌs 2Gv:jjNP]]}ɾWP'""""Ndff@U1=JffVߟ㴐K;6dee?^nsh% <>l&((Y?VevJj, z;<:1q,3f_nݺIF{$%%zkW5k{+:;v8qgO<΀ZE<˖…-1 m 箻$..G}ĠAdʔ$$$)+c;fϞ>'z0Att4~~~ٳDGHJ= %=qyyy8}zoZtDDDDKk뜹哙Y|޽;iiOZZ*yyڵ ,3 ۍ(b0gl&LO]][n#;;IRظq#6m"11qu1oޣm{:XBBBF}}=EE{0 'O`ϞL8,{7lUϴiS;OP'""""Nc$ڵKΔ{l6SXXȧ~FZZ*~N'455la̘Qϛ,]+2bXY`X} K6`t+^eVNѣ7~'`}Fux/4: #pw_|s-usdgW^ܙ➤$ضm;妛b.<~8V{Dpp07oidk8p[nc޽7onuP@v; "1q,СCX,nF$)i,?uֱ{w(...]}fZZ*{#/:" 6tg)sss))rWGnR[{/kN'&L8/<%ddluܹs:CINDDDD<^&iӦMeҤN'/;a\uU$'O$**2v;ᄏ0:4ޢ-(,܅aTVVbX eոn""":t<:f9rHRRR;YU\ITT=O=zdee{˴RDDDD$~SL& ".]Ƒ#Gr{nbbrM:@N6coU>th4CF{?[QX3;Y~˗fo/'443g]!ts::~83w*y|sIIITUU1h RYl9'?*6oBDD8yUm}':v0 3RosWFg* ;`$:_flLNDDDDDćiti8 Ky4S'"""""DDDDv_fܜBtYƋ p8X,{ܜBtYW\q 444|sjnnfa޽^q=;:gEDDD˫f]f\ҺuFXX9ݣq}_SaZ~)"""""DDDDDD|BSa u"""""">LNDDDDDć)ԉ0:_%%֒IENDB`dtkdeclarative-5.7.12/docs/images/init2.png000066400000000000000000000674311476226662700205610ustar00rootroot00000000000000PNG  IHDR HgsBIT|dtEXtSoftwaregnome-screenshot>=iTXtCreation Time2023年01月11日 星期三 15时35分42秒GPI IDATxy|LL2}HB$VUk֢[KKТ֪VТ})S;!$DIdf2#e$!! zy.{fN3稞iΈB!(RSm. joPNtSs8f :uBVezP؛iTZd!Idee]r/J3&Ǔ.ېkQ:jժťKJy%Q7@!B0T*5bpLTz-tTPkkbo!fY9`ff/? @B!`NNNܺuKُˌ$.3kc;w46򟰲iOQ?!Bң_H2 9 B!BRe0ʒ!B!DSXYYI"B!(;!B!ʌI,0 HVV- !B!,&H\\nnn41 DGGQB!BR9o';;#OVwpp ##X8Z}lZBrqqaܺ_|TƀEλL̡CÏHNNLJ7xFEϿ(z ]t_cOeپvRGll,|2#Va)8;;3aDMG79::0wbbb>}zR @<>-j5ƍ'==N>ˈÏ7n,@/C ڵk&i4ƌy'O2cLxxx8W\fѢуիWckk˟ΨQx1T)?7Kٱc';k۷ LF 133#,, q|re7fΜIPP_|eAX6mG}Y@=Fǎĉ .\ -JM:8r1VVV <-֎VXɮ]dԨiذNNNİ~֭[@ǎ:t[n`Ѣ a/UcԪUtҥ*$g",, VK-#e˖c4 |-BQ>ۊS.E.kii3իWgY&AH^QZ5Z" Bʊ͛~%ȓkh,>d>Ge͚tԅN >prr_~wP;F۶}{ѣBP{!8'Gϴiӕ磏>dU^uZYYѺuk{}vA>dQӱtzz=_ K|҆)LÆ ϛoW~&QQ群j~LL jդm6߿u纑…!"">?,S?8Ν߅cǎѤIbK!JZQz6S'11 &2{,WμysPxzVQFz@ ;}FQ8ڴiC\\2 ,**/ҡó&墢P#""&JR05k"11Ѐ{wKٸq=[nWzrߺUCQS9vwWbbźB'yAHDD8UVӳ aa|!D>QQ 8p`^^#֋|Uƍ= RTsyHKK}vر$ (H.d˖M&qpp~W)QT-Juԉ޽_f֬9N~}iٲâ :o/S_!ʻ;?jj}IB%##CӣGwLYZZ/pA^aɓ$&&+U&l߾tt:Ә3yhh(GZ&33I&c4^۝UFݺu8qÇT?\]]hp1777j"""U0.]//ׯñc9q2gf͚&ez}FaaJb0o;I7##""U*sBK!(W_}hd9Ꮏ?s`0xJ٘h||ꊃC:?IL>>>>xxxСóL>'NL :I׮]077Ғ#GsMh4LԩSwʴiӆڵk`ҤɨT{!;wҥx"'O4xxyyQn]Fő#GMvLaN>ٳg{,Ə ȪQQQ¼o ĭ[^zB]n]1b8>!RJ0!B!ē$QE!B񄓕ЅB!eF!B!DD!BQf$B!B @B!eF!B!DD!BQf$B!B @B!eF!B!DD!BQf$B!B @B!eF!B!DD!BQf$B!B @B!eQ7@ppp~19f0!--x#8v{Eӕxlmmׯ/͚5RJh_k=zRvʔ>|PRFA7 deeqMBB._[9{l{Y4n@ZZ={Rۇ_SGWT`Ĉ TvУGwz9XZZFJJ*Q\̙3,rB!MQjj58::PF ڶ}!C3=Z1c>>>%ZFVceeEժUZ*;v`o?uJ丽=xxӴiS6GΝ;( BGMrrrbڴ쳅lݺDRIͶm&%%sTDD jUrnР7صk7񏰅w/BaccJzD-B!iI2hͩP ???z~777 ~Cx999o޼~]733c]~VVC߳,l7Z?_ׯ޽{K^'OQ6X"u> ''')!!!̞=h,--M`` 5kxTB!= @Df4tt:"#3{?իW@Я__f͚mrVKδl/jؐŋ믭R֖? <ھ;2<ܒ%?xccc͍7Xf-[U`}<|6m{e4 >}5kzo}dgg|V @eK~wKڲejunGӔsӧO+tHQ}Ƥ\@@3f~]};L ,]={S Q %%xBCC9z(nݺ,\ _gϞiK/?StЁ:uG=ظq#&ߏ+#F݃W^MjUILLdZ3:ڵk1pkԯ_JŹs੧;^n]֭Kǎ2i{{饗h߾B߾}Z*6m棏>4 L6mJz1b$7nDB!|'IHHB XXXP/hG%<<塻M6DEE8p{׿PNd e͕56kkk 믗ФIc^;"ޞ?z 䣏˂+epcǎ6m3= tfy&cǎ'&&^^b!9VˢEif*U?|5,>!B"O3=q͛q4ky3N9hhԨԩlݺȝ_w>*8+w9::'''5ƍ۽0888P֭˗_~ ;iii~HHܝڷocǎԩӅTժUc֬Y# kߡóʃx6m&=(112d0;vnݺXXXɓ:L~/_L``;yWyBZz-111?~ٴi3\pA9wg/BIz@IʼnpuuUT*>g=we-)Ν3OII5hr6Ýi>*^JK% -S?e۶QTTT_wuueˊV^ٿq#l&Νё S!VCϞ/2yFׯGVckkK֭طo0-[kڵ4lM0˷'zr'wB=+|˻zs`L='(==C67/~/BOgee`Zܵ,--JmyM '?/tFX.\`P7k֬k`gg*lݻ%K2t̛DEEsaL]v7Yn^ΝS~ɓ y `̙&sqx3y rgF; ﰙIBq{0bp ƵkuskD:uL\5j2V_ [[[FirC^LL2WӫWo222HKK#55U9<ߘ2N#''G $QʃhN^)kgggrORiOrr ^Vc RZ B3}ݻq*aAC֮]GAo} С&<~a4 TI`` :pttiӦر-66dI8qB!Dْ; .*QRT*VVVRJz_ֱr*eɶjԨd6zԎ=lש;$nja<[&MOHl;;;ӤI wGyNݞaccC޷~޴h굱/`ΜtdX54鍺~z:LթSGΛse^N#<ҤIcΞ=Kff+V^=<==IKKcJuϪU?Ӳe 4 j?ȑV\ٍ >yix`O6v4s n޼IŊK|U5kѲeK%0?ڵ#--5j(?(?Fʊ:27nΝ^n|9v,f={׈._Bbb"4khR`δo=6mڐիaXׯcN}=#$%%@ڵFVs";B!{+++xuZl11lٲ?A SO5$N:g}Fv///yz|ptt">>#G|D̷z_|[}/pVQfeeڵY*UHvj5;wEPшKHHO>͗6;[ɓ6#<==o:OY.w/L>j5͛7S\|e˖۰a#ݻ?8Ν;z֭tСgϿзoX^3m P`^Vowիט;4 =<* ||| <tC++Cͬ,i66p"`Ņݟ+B'*QTLux|\F@?C B',`ccÂ󱳳+8::S133tT"::} jd̘q\ ZMǎxܡ:]Զׯ/o`wxwK ,F#:tnJ < |1ڵΝ֭+c߾}4iҘK >ѣڵťVV9OOO%)9}IE!CTVjժ)s/֬Y[%B<~Ύ4M3Oݺݿڵl4x {Ν'==ϟWj[t}>7ݩF-m۶kءC*)B$zlllj&NNi*Sq*Ug]۷cuYV9femB-''Xv/#BJmgLkזΞ= AԪUo֣R4Yut"JmBiΜtԅ]7?B!D9iڴ ^^^&8qOaSuիIHfZڷoǬY3_r*/fVYsL3Xf-~~~̚5++bוHDD~:uČPT,[yif /+K^!JZzz:&ZlA˖-d[e[e[enʊtJ* XFAkX2jxe{^m_ ք!Cq5xxL8'NAʼҫ\xM=Ӭi[jW7VR9 fOIIL9j v7,5)u,ի*HV8pnD|OEj-/_)pm^?&eC>}ׯ?4h^ FC\\<o㭷_P^'@||<}_㩧cggGLL ͛(k,i>bt͚͆ 4l؀CEdd$_}5N.{!݌w|`,B!(]/Keȕ8=g"sU*0W1ZVVũ(#n6}cX$~KK Pxxx0`9}Li5jȤI9t0_ P̸t==wO?4/ԓ={LbbCn]MZMΝؿ?8::0ct?";;ʕ+SF V\Zcf\ lyذbJn܈i&6u֛i̘w9pfϏaeeSO=Nbb"{ԩS0` iiiB!Djղ>$t sZlf Jrc#7Qyߺsh&MLff'ŀ~:ӦMWz2_dZS ʰaC#($Iƍ?5T7Օs?zXZZtR>ԑ31iÃ#ʕjׯ/6l4ٷo? Çи={Ȉ#_d%gϞ⾭B(JCN!RnnBcB FUU*l-Txh077(ٳ0vxƎǬYILLdxxش<*:ug^{}||V[aTere7ڷoϦMu֣nNHBx)wCjV2B;CoO4f*nU]O98*=F3W^Tnތzʱlw3Ů;%%lۓVdl߾oxzzr9vŐ!ر#ZNǎ;M a177nݺׇ?o *p~ɝLKKO>-|lll_ǣhaffzǧ.o9bUکˊ[e ]"CB@\?~)\Zm&g꟨~ZZm*brttRJߞ/]XŮh4r6mj+\TRŤ&O͚o?(fdd}vFc{HMM-^^Opp0? N\\:&ıcyWsFT^3&knx|||y-&N:bggGzz:68@[ob0x>p*'~P}̙3d^B)WC\r=BW`Yd3z 㨋EmFVcfVaWFRLϡј~ݻ5mڴiCPPj7^O?1gly7رcξﵳg$66!&&KKKi8/ذa#=zt`Ӧ&ڶ}-[pabccgϞ$&&q wV_ܹdggsU֬Y3ϴO ҂*UX !zs*fWWW~FaccCrr2.\dydddx1eT|}}?'Oȑqc?N.^RǠAZ{ѩSG\\\HIIa|2%L\ݟcذ\~k~~8}O#GYYYm I=۷###/B! ,Jo4c,aeHWZ]ޏѣG)ۉI\z? (r|m8;;3d  ˠUNf 8~rf_dɒl4ݻwbEgF#,_c""""\p!9hHZZΝg„JOɁټy }ΎOFFcƌ_>BIMM޽ɣVR1MB1Ͽ$!! *FCFF7ndԨT7oTڵ ;v?~9s1ys}?~8ZlΙ3TAS0Cnݺ 6C1{\%4osvښfccCٽ{:<[v !xR077/pQ`Π€L(jn|U`0bJVXirS.&V̪U?ҥ[޽{MCQwxzz_;wOq  .bEΥdR,YZ>=޽=SZK*fsssj׮ł ٿys:wO?rn݊U~`0[wa]|b0(([L<5d7{$0(Iz^gѢ/ իW۹s'>۞ڵkz -[ő#G ͛7QzufmTMV#iӦ53f$((SO5֖XV^_m}wB!(]w3 ݭ\ *,0fcPQs{=W8;;NQ76{nތTX_|3g0nʄu/ybb\r~`eeɓ 3);ҥ3+W`0СCjZz ј/#1  `o 昘(ʇ\F "#opEڵk ۷c߾{09q"u֓Eڵ0?Jpx7FGz0BCCbذjܸE~9FÆ B_qrgr7 y=#`:up fΜEVV֣nc}^e𷈋?װzU7lyf8p];s!{899R嗟Sۛ{)!gcc51)Νӧ~+V^=-[My>}^y7+V׳kccԩSXљoݻ?;GիaJD{S1dz`B`!^^^tԁ7͛7ٷo׮]ԩt֕4T_$''5jtC֡y|/hfq]h4{ L&U1={L^yGGGz~&MSbE4-*UP:;;;{89U`FƎo,6md<{$<p*&L3XXXwKt2 ,@R+yؘԵpgDE`J|s+++>lmmYz-XXhR gB!J۝]oXÐ!1+++WN6qsse̙IeLׯŋ={o4.^4Y6m:o9˗oyw.oV?7=CLZZ:׮]+ֺ@B!ēHz@x|}}?I/Ys'ӝ= 9M!{@$B<2K!e4`RBGuV B!(#!B!LBSʾ^'++ˆVU抳sEΞ={h/*KPIΝ;@u _"?BKi,= a׮8p hZZjEvmh 7ԯ_ۓERR_/ B!;UHX]@7ṉcʴ==xc B!({^rPTJڵ8y$z 鉅? M[. ##?\F77WllltDrrr`֖ƍpuuEՒE\\s@iU!'BiӦ EyʕݨPӱcZ-O!55ʕ+Z… >}JE͚5ٰa#pXFgjMΝY~=YEn[VP9r pw ?IVc0PomӦ5ȶl˶l˶l޳v𑓓@S\7 }ÆιR mڴf߾[Fynݺ ˋ?шomJW8} .\? ]Vӧϫ>|K.;!D֏)B!(Dzz:ۗXOTݹuIpz$u===񩋽=Z8?@bb"Cbbb_O1XZZ+B!xp999deeN J'* ##ȝaooO>ST{Q @۶`n^;wѨQ#|}}'==s|HIL||}GanllIMM#""llmm_' l۶ʕ+cnnΞ={Φqc?y ֭'33KK ڵkKTT''GNNNl-HKKTxzzЮ][vETT:u=8s .] ;;*WLvma߾ޝGUdf& $@0 +X-+ZŶ.],.V_o]T ZiE A d'2d2s~2uH $o~=O9>ws6;4zh͛w>p+%%E{See4qDUUU)77">mu.|.,JKtճg_|ڲe$I{URRWV SCnq\w;??_aaa2deY}9ƌmذAeq_nk]*))$effjРJHH @`e Ml6 $HRddd@CjzI+РS*,,jq\={ԨQ#-ө l6UVVzvbbbt|HRMM'`|QUUV7p1.k2mܸqJN=r:kemhhz'-'r9rjʔ="""tsURR={媑giQn6(((HnwmZEEEM M,v{tHsLRfQeff}Ӌi&l6KF_'ѐ8k-x8Gp޿^e)4P9:e$ &_ HuTZZvWgs8|G"uT)˲dYV2gz*))р>}ܱ L.,K2dAiРmZ_bbOFTllqƪVeee._ ͦQFp(2OF>ɼ0`bccnݺ5΃9sfJJJܹsР#G2ڴmoq ֮]5iRͻN6MEڼyV4v9;k׶mq*66V!!!Sqqmۮ\κd]cǪH6}"{7nܤ3fN;w$\\s5lڽ{nBCCwv;. &LPUUŇ$\.y^544?f):vڥ'OO=77Oݻw׈[<|>5rH]yPѣF9]Ⱦ}v4zhy>>|ڰaƌ#Gjĉr\PFFf;E$((Hvn׸qcy n[;w$C Ԅ TST,uS$ɲ,m߾Cٚ0a r}>VyyRSr:p t# gX[nkҤ|>8qy+*ʕ~v^4mT}y*++%YJHHfSAA-=t#d-1c&OJ^Wy>H]}49}ڳg***5thY('lVQi\RRR]]1c !@C0` 1c=֊Cn*+ :zxΣK4ydx<W\\R2l0˲,Çf9nv0VRҲ8=m4EEEssU__O>,I׬Y3G딜qjƌ*--UCW;wRTTƎZIj îCr+$$DCt>Pmm]'OJiiڳg,˧C%$$pvlԥd޽ Մ 5ax\.ĉOLVvI8p@++R~VeeeJt]qE:N]5e4}tkǎD+!a?@\.v0z"%$$ѣeee <$ @PUUU:. n[}z+B{R5p@8p@nzsss.//WHH?>,K>}VH^gOÆ]HHl6"## ;ӧ+22RVLL6or! ץ䌲2tMg֘1ctxV@ \}>_X%'=b=s=٧Py^v׌uQV4kL9v:u*G.KCw> 2XiioUWWO?TAAA#>WAAAM 6=sJLLTqq UTTt^:,RVV(өDee LT4wj$SGk!NSQQQ~(8!'I||:~4~@;)--Udd;z('OTii/h~o>4Z-(%%j1oR 衠U__ݻw>o>4.sm׀\.NgG*|߮}|i\vdV.|߮}|i\>ep:IJrc !@Cpi=ۃSnnjjj:l hByyy= ACCnw/r(5gl|Apzt}0~^W/DT=Yx^\6U8UWW/Ӯ];=2ۭsu >LwqJJJT[[huZwqqW(<L;s*e5>$ө Y ϳD$۷OSLѠAϏlox$""\'1c(>>Q^;WZj,̙3UXX IeY}>7Իwo޽GF$kTRRNy@'zU[[+˥8~mSOMٳMkݺ/rčfΜ>}())Q4yd%&& |&jϞk+ۭ}R')N>*--n5Bׂ :}1\Rc{%I Xlf$[ݹҍ7_9_>}t}G;oٳGGgֺu;{NZzV^ӧO+,,L-=*iin[8p$)4ԩ+;o`Z>ZZ[+66V˟$I7ݴԽwѶs!@ e#,,Tߠ/}&]y:}6mDݻw"dee$t>IDAT??ͷꌏ-B-~kMݻw?@&Os IRn4rrڱcg_+_]hÆ W/34റiQQQ?~7h-}Fz!8qBVݕ|>Ooze+gsLOД)[ 73gvRiժux< _U=CM-O?ydYƏ/ͦO_ܵkƏŋoĉ3vΝ7~8㮻٠6 @h'e]G9sniL,ۭ-[O>Ҫ5رcwwyo;G͟@?2aaa/kϞkAxkР >L,KFʕ5^˲S۷hϞl2,9N%$$(;;Mt>?,}vGKܩy~_??[oMk꫿!xtUYY;w_P޽xdjQ:|Hz &/ne-^HKޫn8-,w8Xm۶GZJμYJIIQDDjUUU,Kzt`.\6~&sZ`ذaz+88D[nO~L[Ez5x`/דO>ӧסC%I֭9񯨨3<+Ir8슏ߦ_~I<I㼕K %?@<-Z;]O=#͙3G/\.NT7oiӺ;UJJ|m۶];wl2~3?G?O 9eSOHcǎQffkE(//TXXX[+7)55Uz&Ls_Puu(??tFo)QoНwnzM8Q{mrڵeY/^RѬs:@PPPu]AAA{ř;L]J=أ9r^҄ {<]s՚1c֯_I<]׫Ç5is\gҖ-::R[[nŊڹs-{D&hJKK'l'lu{<O˖=zۼZjz_ xt7>عs233tR}:|gNs: gNOt֭v""exduSZ[U^^IRtUWO:}222t),,윧_.^H%ܰaҚ]H,u;v̙ =yfZZ;vTpp~ll6Y]}ڸqV|/u׫ɓ#|_ozUU$b쬬,IҠA$"{љ;F(cҤ=أ_&_j_!CSN^UU|/^=O5iҤs_?c x|M:EG۶m?C򴢖֭[uHJawB7oȑ#u1ݻ:/YEE/Jj_FyzKA|4өiӦjΜz_J}5k4΢W^JNNKEkOO?3ef6^H~nݺ 5:_'ݮ=zCZs^O1LJJM7-М9t:o_^zeرS>PB\.5+ŋ5bIҊjo*>>οLmmmy7pzm9 Imm֯ߠ7(&&FfԜ9]|wj9 R㑋8UH?]񨮮NCÆ eY3fvڭ^xޤz%5^;>khZ)))ѻлPtty]Vu޽p߸媪jkUUٳgkҤM:E:u֬P|غuZ#u]+zwtiiMQCC***TPP kڴ:uUWW͛h򷕓su*#ֹ8+7.8t߯q5y-:k8Zɝ޶mrCr{Ej͚5?~}t?x1-^|?Eaaa={ w |ɓ'~I<9R~v^(N/\s@/ ?S3fbbbdTWW u,"55Uyy5kw7[>=.!ݻϏھ1\GL8A ̌"XR+VgYo7yUCyyyرM"I_Z`i֬Y?|. ed> L]{\}{UUU}yUUUxQ?Ӻ[nzͷdɝ9g1bY8wmܸImeYzõ:p'7g|j^/zUXXOk/TVV>Lڷ/U^ϦM[iѢ?h~MHHn6w_JÇ~H[~*//#,7Tk֬QPP222U^^*(_}nm|)\N_Rkkkh 5>7lNPȮ̲,v07vvD0Sh'\d{yc^fp1f蜚{zsؿ]Ҹϵ9 44T= R]]a}Ǘƅ~!@hQQQQMM^oG-zr\r\lq~o>4Z6ЎJJJr]']}+::U˰іp c !@C0` 18[cX VIENDB`dtkdeclarative-5.7.12/docs/images/init3.png000066400000000000000000000115201476226662700205460ustar00rootroot00000000000000PNG  IHDR!^sBIT|dtEXtSoftwaregnome-screenshot>=iTXtCreation Time2023年01月11日 星期三 17时34分24秒*IDATx_l^uoQ In1a0q @eFȮ 3F 7I&4:M6l1K%Ⲏ4,h)=^Pnz%Kz=h;4FpN]]]zߚ5k?ܹs'O|0-z̙3{̒?,`v @0 #@0|~n_3-[Ԗ-[fiF@"|oUOOYZgO~lٲsC5?w_ŋOυ?YǏڸqLz|})_~>:x`z뭓3kuuUU~馛w]mܸuww7s}뮻V^]}}}/|jri3gΜzG[oU?O?avmUUc՟I?'p=z/'|6nXaÆj4K/5oɒ%SG _zs瞫/8444eV[[[3ʪ?^/y_566V}}}f͚Zzus!H___\,X0q'__7|VZ7o޼[&@E o[UUp ӎ*̒EUgg}I̙3uOݵcǎjmmի'?I-ZLyyWzGɓh4?񤫖l^k׮ڵkY C"K_^kҥu=ԪUe]6s򗿬k>WOOO-X~_s;uwwoѼ?k֬7xn _վq;Nuuuէ>馛^8bA<622rj%K4 |gNett(Ӎ}󏏏͛\qԩڸqc׎;&X>ott.) @0#@0 #@0 ̜ ^y0K\#@0 #@0 #@0 #@0s.>|S522RUUmmmQ֭+V㵌6.\ ӵ~ꪥKVUՉ'СC{jmm-[ԕW^+.я~T6mjii9FΝ;k֭u7xl0ˆv=C9c9R۶m3h,۾}{mڴiWUY6m۷x|0>\O >N>] ,ڳgO_M֯__{ ,z{޽{k޽h4ܮsfHQ/}}}裏Nx}kҥK |\ ,jkk'NUW]Uy'NT[[ی fQGGG:tjiikNx}CUGGnj+`Ynݺڽ{wsQDžh4{Zn݌ fъ+z{{/jmm+Vh`mٲvYG1G;wփ>8 ,+k֭m۶z':hO?]۶m[G?2::XpO۷ӧk|F'СC{jmm|}*p>|S͇%.I0 IDAT~ IDAT<<<   :NNN.":OOO'= %GRRRJ#50VVV7g$ IDAT@fd}222LLa)R6 U-I.,Q!08}}}S" T U K IDAT,,,OG gggxxx '///* b444<  '!$; /&kX2 2 '. IDAT-SsdGyV,&QF3PF2*&F=+6/"˱~ D;* -(8Q-'wUQG2RH3qh{wUqQG>,)$|lN+% whKC;*vwhJJA. _=5&;4%qP*%`gf}^>6'l^C[p5.!yjK"p9%i IDAT pz#uS% krQPF2k}yjL*$q }Z }ly)$$ ~Z92#LC/ YM8i9R:3$B;) fZ@gZ@,'n_d}SI4q!wU70"k eX?cvlٽdW?rrb60"6/"+F{UJ5QG292$m B:)\ppaF~pbF,'$ rx 3-l   1*fY?m_D  vTE<+TI4LB03- m  [P96/"vUZofY?YN8tS=VǮ}[P9\Q9-( <5&^rn=5%% !&" ,'2,0+ 92#OE1)#\8 IDAT]81#_S;]Q992#i\A\P9 `tnuTPF1>6&]fB:)5/!_S;yVhPF15/!dW>;3$% eX>4- ~oO<4%aU<@8'B:)]{lM]Q:6/"\,&^?7'70"fY?}mNWWW0-C;*_S; 70#)$,' dX?:2%)$aU=PF2  ^R;SH4 _S;MD0!&"dW?/),&.(%  6/!aT<LC0 H;!&_!Y"ِvBMMMC IDAT-&aaa '! ''' WWW DDD>>>"@@@###.!!!BBB"[[[TTT(DDD<<! /'6 UE'V䋋,Eߒ&8FFFL...420 ///ܱJ###G---BBB5[[[LFFFJ>>>@ DDD&OOOo[4Š- kW2 6 IDATAAAG 9lllg^^^KKK&###+L$lll+++iiiM= *ZZZ jjj<<< j= !B6 dX*** &&HHH* EIBBBKKK  )ssstttOcccDDDU, !!!+++:0:0=ggg WWW)%LLL3555ݫ?###!8$$$ꡡL  hhhn&&&uuu.>!ǣ,+,,,!!!zzzzzz<9(((։gggrrraaa[[[$999$$$봴59"""7MMMGGGߛ5=IIIiiiͮ%MMMLLL8?.aaa-[[[KKKlllW(---9J  III%%% 777999MMM7-aaaI%RRR!!!www'&aaaa߁ W9[[[0&&& ddd,,,%H555eee>HHHTTT lllhhhvvv@@@;;;.6hhh???E<<<q\ IDAT QQQJ999*HHH>>>CCC+ lll[ B: ~~~'''6 XXX ﯯK2kkkeB>aaaLLL&A```???[[[(? A ~~~  vvv$$aaa___ҙ+ ~~~^.ttt)'''|||<555!--- ///d} ITTTIIIjjj~~~`KKKJJJ 23331 /// 󊊊58222lll3#ZZZGGG777%UVVVLLL;;;<)))jjj(((POOOӾ$*]]]PBBB...999>>>PPPMEEEWWW)))AAAĩC555 TTT6[[[(((+===WWWFFF&555jjj ;/LLL<<<!R=KKK:::___R999eeeddd'<|||<0 $\\\lBBB )))޾O, K$$$ﰰ,D HCCCIII1'& %JJJ /(7eeeDESSS444 T---mmmdddXFFF^p IDATAAA  $$$. .33*      $!B-11 '++ .33 C   !!LKKKRRRkkk 1^]    3 @ Y8!!19 &:B=B"-- Q9P2KKC>$)--,00>W+.. '6.11!! /33 !!O>>>^^^VVV= +  /-#'' ""%**!$$%**$((JZ ! $''&))$''%((9: E)++ DF%, %(( 0TQTQS111fffKKKۖD "## H#E"%%   8=+--53 8 !   A-11I)-- T$$$qqqmmm*'++'++ "" '((  . .11.00 &**.00 ##  )-- *$51 L IDATS|||PPPC:::$$$G 8%(( 2U  3"&& I   605"$$.)-&((&_|||S wwwN  $  $; $'' Z266 !MMMd}&_|||N ~~~]KKKZZZ - ##MMMG yyy###HHHµA !$$@wwwWWW蔔AL IDAT8*vvv%%%hhh#"35ppp,,,&&&HHHG,:fff777```?    %AWWWBBBhhh\KKK#8 8%1 ) 1"  5')++B;5< %((< ,//ILLLPPP--->>>ǫC (,,  <)#&&#&&/   B C7O=G=#&& !!)--!$$   m IDATQCCC[[[bbb&:{{{C&**  =9!%%D " $< !&&R -22&**A+&))5) F)++  / U666eee ccc-45 * 5,2 !.22,00#$ $$$$  ##9#''+//  %&&.33,00>$%%C1IOU(((rrr333;;;ɢH  !!=C#E( I     0O" -00    Rxxxccc:/44/33!%% + "") $''%((#''%((%(( %(("%% (***// ""!!(,,Oxxx aaa32 :% $ ""!##8PM' !!>K 8 IDATQ    3 * :Nyyy777555̠F+++(     &((#$$'++,00"%% 2"033+//'++!!! 0""/    0' &_}}}Jlll`000nnn  MMMC ^^^6  /#{{{@@@ҞF+++ wwwdb3eee)))fff2'= IDAT'''VVV8 FFF(((ؙFd}&_ qqqaBBBccc3&)) !!8 "" ""$$7'++ 3 2&))""  (,,' ?%((3$''6'++'"%%MMM % $XXXM:::)))%!/ +// 3   #   4 #'' . %')) -11',3775 ) 9) " - #@E 9?KKKܙC] ? IDAT   !3 4 #    ""=$&&+   %# +I $  -"!!(#%%' ! V&M*jjj+ca 3( ,//)++    !$$ ,=D!! !$$  #) 3( + 6   5CLLL= 6 !$$ 0!0%#&G% !$$"'' *--<$0"!&((6  (/,:";  ' TTT晙A$''$'' @W2   ! $'' !! >*>  . E!    A "##'  %((&-H *jjj)&**!! *--    -8%'$&&.A.22#'' .*; &((  ! #&&#&&(,,!!!JJJC F|D IDAT8E:E7 >  ?-K$6!$$(,,D:*--S ## ,006 B$((#'' KE :L2 K &_~uACvvvP             MMM h7  b4$  /^2kkk$"           ,h7 ,) Q6Y/###EEE¬D            v ``` 򘘘= V./.Y/ o;6#~S, Y;a@"F.jF% g [0  j8gD% b# oI&?*cB#x?zqJ'b'X.VW. kF%M3hhh\KKK IDATuM) QdB#0 }S+e X/ [0M3_>"s \15#{Q+(3"X/ E-ehaA"U-W;'l9% C- C,hlG&/_0 V.,,,>>>ǫC555 9&:&T8H0Q6 3!   J1D- H/B,___;  O4A+    T,  ?*pI' Z; I0  nH&D#  aaaY@@@ cA"Si8 wN)u>H/$ |555888ˢG999 8%%    <'9&?)  (  =(F/S72! ky IDATiii;(((9;oJ'&^?! Q6-)-T8A+?* _>!9& ,W:)G/J1,]=!V9 [= (lG& X;2!C,D-D- Z;" 1  >)`>"-lG&$  3"aA"!"第GۧYYY&;. 4"* ( * , &( !"2>>>ȧd}BC~un:ACrrr\///nnnJJJYYY4IIINNNW; IDATDDD+++֜Ejjj 3WWW;NNNggg *FFF(((טFNNNG 5 nnn-VVVggg   IDAT9F! 𲲲C000RRR b* wwwLPPP W! zzz^FFF___LLLOOOLLL=MMM&&&'''!DDDRRRIIIdO IDAT"""籱>)))λjjj ,.,@ށ KFFFfffcLLL$ Kvi% IDAT`"*Bro d}c $.8+w IDATnz h#!53k jx IDAT#?.fol!A$c앮 IDAT! jjj^)))qqquuuj:::lllRRR 31 %pppQQQJBBB)))!6VVV3kH#&&&RRR♙B&]^ 333XQ'---jjj*$f7c* AAALLLB x IDATLI \ ---SSS└C;DP(,,,hhh&=/6( ;;;"""IIIC Id}?222^^^? E 8 )+++kkk%# IDAT)1 ===)))CCCĬC 3#  ...^^^򘘘=*"(((( aaa' >>>222;;;ʥG ---s N IDATeee < (&&& hhh1 #???000999ɢE 111hhh6(''' \\\2!===x IDATAAA///ҡE===hhh6)((([[[7:::BBB---ӚG;;;jjj 1'$$$ x#w IDATYYY<!:::KKK$$$ۙE888mmmrrrW:'= ! ///d}#N '''MMMܱ222-u< IDAT[[[...!###AAA DDD!UUU555 RRR"N aaa/!xxx) ???((( BHHHBBB5+++TTT<0dddIQQQDDD F333ZZZ< 4??? E||| ooo;(((&+444*!LLL,' 4@@@ݻ? ___ F```% %  pppJ-2,sssV]]]Ľ;=) )RRR ~&z IDAT555FFF ~~~Y$$$  eee<XXX-*bbbS ;+8 W2ddd(888iiibbb[[[ ճ3 %E-  ..\  )))222 ,,, ;###䍍lll]߇ RW `sssf 1IIIYYY LLL ̣T "0(K.T4 C#0: #VVVW...yyyWWW͇QRRR222웛0<OOO' {{{Z)))sss 000<((( CCCĽ< vvvg---vvvBBB;;;&&&HHH<<< WWW ϨM  ٹF  B L %% 39UUUyyy]  444    #' )  $$$???,XXX즦P/,,,: QQQ[[[  ~~~$ zzzhhhj:6[[[1UUUVVVPPP*** EEE2 IDAT   aaaExxx  8DDD%%%999壣 WWWyyy59222VVVί/ ,,, )))*FFF'''~~~bbb000 ---곳*,,,HHHOddd8CCCDDD777```xxxT ,,,62jjj 17" vvv'(((vvv',,, 43=ɺA777%222C333III2?"""HHH&/ 򽽽@,,,ꏏR999 $   '''"***1( ---rrr[*SSS2Q"""&&&Q 666YKZZZ]]].www@K666YYỸV<<<K(88ꠠ+++/EMn *嵓ɲ)< ˳J w&=)CHHHKKK EEE XXX!XXX ###   =&&& +++:::MMMPPP<<<#CCCJJJ===nnn=((( >>>###VVVœe IDAT<<<,,, ˟5E:T"a繙Ī4JRw㮉緗W~ %ِ]2!  Dm.H % $齟 %| G *D I v߆d})>)]]] Q#mW\ IDAT  \\\PPPJ#777WWW ;U緗3Iӿ )[[[-IHs䲎PtϺ&6 \鿢2Gaaa (B"6  ߉I u+.$!!   ' ;(,,, ##&&峑 \ ]㭇崒Ǯ5L2ӀG5U5UCka*l߇K!x+ !!)6"*--IA*  V ""_""%(++6= $ E-003 +% % 144繙络%k ՅOnqg P)( IDAT  4 /+--U' * %''!(,,[) .  6;;I8 . 7K؎\ +(95^W    )&,9    ##   ## I    /,։T .*..  P5## 61,#"$$&))*// #  $#.@#   - '  $''  +--     !%% !! ""S+--P .  2 !!+־UM˴_-" ABBBBBDD$DoBHm{9\uR{=gs|L>q&!M3*@ p:Q?F<P. EM63$ ap6@;W mJ %Na$HmT}&Km$ զdjHRdS= y²:o @:[OI !X)pIVmN,DV}I|",ј:olHRLC>Pl+0(ɟWi ґ4a j8ۜ)@aIRHh#y_" wsbfh"QӐ[m}Q$#wJ0ܙ,ٔtr˽\m#3c=J5}uf jS$Uf^Pl?z߱6iJ)jX i$2 mUPNeoDJ o  0yfŋ DdQm,"^- % +)QE}ae8D@ɌIalaE%1!T^{}cLB>B'%BpQ[EQh*̄>2ES;KT@r O0-Ŕ `"ZBq[dH8*|QA} ߟy / G:D̛D*"UFdR"Z$"tdSDA eD:,`dָG zah0 M /Ĵ%P-Mb0[Oy>L9} %R|_z) 8&II-::!b)D$K |)T#E\ ݧ& àX\E@ʢOAAmA.ԋ|@n"Tl?ͨDQްw^-FBJM #q~*BU$Xaa+ i u}E/0#DQ4H@CDhyK!$g`YLsC4)$_0%w{2(qBQ*&(:bfDj8sF#U%Ī,ET$az%M(XOmx4S|v@`PBZ A!o0 IH &˰$Enk![R Z dfdX@#A3;=Z40%RZ Y0*2ЈB]H Bz!2#(].% $DJ(Ѵ8iMJVӲ` rxPm-)PbPt0).iD*H -$8(} ԩ;.d21A|H "CI6 5΄l%I"zOQ|}AwJ9h_@Ӥ QHE<_'eAd01Ŗ?pq`_IhMڜ_~ Q@K2v^Xb$ua" <@E7O:073qށ1A$/yȞ; L%1(~g "%J!om ,s@$0!bl H E TE/FHށ攏G0=2fӝ2jnۀfg%KO 66@Gᴄv*+[W@ )ͤ62N|ӠC}h @ɒyHeI/Ԕ8K޳L"ryHr1Zy%SRo?$)Cϗ?ia:I-S^AM>Xu D%,mB^P Tti>x,;5Zx?pGr@Dd5mɭlфdDTR%\ޡ E6N 7Ydf*k>p$_d%0I|-e*0K:ϥ%(P-"-AUHY ol;}{}ý7䁂,E/UAPQ}'+/2m|E>RhGjIȶAS-w K?KX5w~Pr&gq=eWKĂ1d04 ukE %Tp0œ=&)s:{:)r潋s6JBl%q?4S6vHPk"zH)Q%_!Z;l)uj²x 9hX4줢V6cVg~Эj (wLEAE[-.b@Z<P;hb˜dEXyfH29(R_|Ф30)ιTE}yţyCsgr#+ \t T&oAS<~ !;ՂeY2!ʄ6%(Jt <|'7ۃ"5>iZK21scbLRV(A(i z& %<ʂD&cp AJMx6,_􁆢_t.&&07H˟ ĂpQD4ZvzN TiNerP ∤b5<`neMMßq`%`nOs`}yQ`@gz>;ܒXIOrgM|FX%NkũH젶I-CQY:G}4,;ʗ?zmʫoJ-}̖#MA'juTZ(ۚ,K8V@Wp L#<`t\Utd!NAao_e9e/_ Ύ)FAC25K/;1)t4*ES` .sB`;0؋Gv ]Ky^iu/ DoU H9U@υnHK3"BSTvRQl>Uˊ imP|,i?VgT㾠NoX%}),3ׅw"%846Ý%:%~vDBWJm ňggQуb[ xC`(s֎pm$I lSD`pd-|9QI@xJe @j'!j1ŕ ׏&59Nw@J%| BK;%ht58Bj‡T8ۼĐRbj%c3ȪAmc t:?%7?*apKY /K_Oժ+ػ"ռ­yWYšʥW }GrnV7@u[MmmG7+w焋BT4peYSX2.g_H؅V9(+yi FAq2 +D| wxqR]C^ >m!:ɖ7a6BHK?ibq1y]clܮRkCEX$\Uu=#eL};{ j5 -CLZ,B:qi; pɫ|qݣ- N N4123)kA#!J9dzh K7L#AD:P)=C%YEps("?5Q FG!|9<]vBiV#~9d?|Q1w5R=#9eY]a\',)0[S~D nA<\;"wq+EȂvQJ)lkes+-jmAvЕ5Q\㼜-ҚeUʳG)kԑ ,Cb[XS}tf^{IcۨP_b+۲tEȽmQe/-MVx{(^80iގ뇢yG^?MŘb Eȉu`"$ɰUGb@k@њˈp%m.b[3\,%H8 b'UiX"E#٭7^%k7ٴ>|<+c}:ʚ/.Ë^{ԖW;+ֵ#IXoA^'뺳 AkKEJCmƾdA)G, w]C$q}c Kt% U5oEZt,0GڑL&#R Ղnv#y0rjvOĥ>IIi" ȼjLR@ZY;$8 ^A7E]#VQ$>qd "@M yNɚǮH0[AQ0Jd1X;X,]&5, IZi$.- ^zn-2ZT9_$bI!ɀ|>zW@ZֹT@SàM@Q$D#|ߔoQ/ _^藯״Hᵭ$z&%KyU / z1P<;DP2V$i 7#d(QFb3[rV1s-P ڇf^.QGЛ[Ow J<3c1򪵸"SR}?:9hrmtf,CB9"b돺|Yv'#SU?Eg\1ZJ|5 aiы0b̥N J`2JOr(7C6JJkXpǼ*v@ӀϞrq*|ye[+-(oOY Cnwӧ~|bزT;X^@gg34fuM= rc#׃'#6(ƶ\:. Nr1P?h{HWkզtf Rx0P;.;iYT[ћi[2l}}cj߂plsJ2]l/k@O\2˯4˙v'HTu53Ic % #[a{tVɌaa$+786ĻLafܼ" Q5w ÛW'5Hw=`GMi~=> VS#?;dr\b[DuS(44Yi;Bi;mhiW o+U%^s*9@F2oO]F"6gndCx0B1.1t* Ρq0H;O8:Ĺy8Og͖0$Ϯuy#bID*_aϽJC>rk ;*wTdKgPe3ص ?ϔϖ՝xTS<լ@*{Sպ R*ۺofW)l:H*x |exwYgg-Z3Y;=kp\>lUW3!iD9 0풂p2 IDAT͝/BGls~$^"ݕ3C1}&s\ sVU_wcmBAźg?/g>f Ϲտgc& 4߼ށ)v2vKW YZ;}uU6y4v qֆaOg@F8@#a|ƏS VB'P-9?~G[~6zsDNüh/2I4~uz?]/&ɵnuwc0͆2YZk`9-]A/g }&5ϊGfl.W˵^ y'Id ev`skOփr'Ђ TP}C-r-1;O$g(4r+HG%U8]@aXQ,R5urL%صzlxT`S,@Zd ˔x( #u9m38YY {:uK^; 1У֛⊜Ų.[wqׯ3?j̚ųȜ'zY-NkM /`fxe~ |f9|η@jQ 5(ylYH GJ,؜_LHWZs.`Xq8$ftS:~{ՏDy`]y#}m9 +uZڙsoXR?],7۵?t{T_\bzh2֖UrBEUUлԘw|({e5'6T:&">F> X]MF'OK@P<99vkk̈tY- ._/7׳ L?[ "oF?)Irp%I6\q#7t!7 zVNmqnؔI Ez{kVr\RZȴ+JnATR(-2bjo؛@F]rz-T]l: uSIz`~FfV%DaK>[.o#+M.oVBy[:B, 'puV\/&ԏun*M_: ӫ6;/*qF?"5'}ٕ;9H TtNZ?pUf"Tnr ,3 l tRo ]@~OM|ͲO~g]%>o"②WqMby6œ%œh\ҍ>Ӄfdָ޻ź;04nj5ݪB`+xdS7?-9Ҕ$ ;_9]Xi܄mR(KК@td]̻lPl(AR=K5o^@כfY R%@s9>!Av!l>L;Ϳ]ג;y5˯|W#4:OQ?^, c~p2 |[ZȊ.B=l"kZgA6 k:E cw=f8#qѦesmA:ɗkkXĥ5+ͮZlfsq;fqkqm~D0-sK튤]v{߱ڽw[| rM0௵$ۼVqeQ2jX Ikcckdjn(m7=^azk>PȦuvN%Kswo@8@`f)Ϛ6BgwOKpe@C礻]P8 \}ӗxL 7.;3Plcꮐ*0|[hP]Rr޵+$mUSc\~yk;">&ű)?%!nx%|>u]@"I8tP䵅lM+v]Y);l*\, P: P–GoRn@-y6uqb3rDC|_nuVyl@d0SL蹾]d;6eIrfe@`2C&34  ,"L`)$66UW޳"jTY_{kEDX(zQV)` 뉝;wr._&xGtJǪ*OS_+0=ɣgI3nE`+UP3`sKU )'G6 4#k<izLf(ukGQCH^HJzFUQ\p$% ;"IyXF05xKb)fIZHazDc?Guyy07Cn@9'WbI`:?əm$<ߘw> xL]@\qQ*v<@EiF}6 wpZ*Tx)b-8۱NdSGYN8@Ft>|H;4:vg!">%EMT4ۀΩ`/D2]rlwfo j;@Isx@۫)پQQC1v.b-T9*F>X-:! f pg[X=2P Ҿ8Y=k$ ~#؆4%0.~ C%ܠv?Nc[$}xتBI*p+Re@ i3a:',&[ǖ"Ǘ02: pQ'js}/y0>UnN:_}IRBokl 193E'EWAh!Rm< 7o~Ը$zMB Jո/b Y&%n 3 NO0M\A4CqK1w\邏v6R=*&"ؿ)dK5HtXg]Ja9OlM ;yE7nSSǿc"a5 w+P%C'V,]ؼ=Y%*B=L陏g2фQɤ6p!eUKn)ϓGg̱3a|nR"*6҃Evêp3Co(ZQݍrE~hZ#M! p6 %msB>K~Jʠ5܏{ෟg蓫3m܀ 7*CQa»9Ы`Nc8o \Zޑuyes1:;13)_grJ6̜IH}\.H>!g:Xu[,3luB<"4i3~_>dqZ`~\MX[&9{?ILC"YrRS螎&'Od8Ik;†kxC3s=3Ɣ"ME7T>MWWhq\~ɢ^*NcvNc:iݭ5j#s U ޾#~) ༾/ÑTG LgO^ V. (m}%}u \'r6DI[0as:&JDS.-̬w _N ӂN @}3*:mX4oIMUM!F< ܓrUL,H3?xA?h7-dHxFW!"FkĔB n|>$6*XrS i<4 [8MX* 8'ihlqm7 \̩'qP 3?][;8JxD"2?GO6rv__UZ frgP^؈Ɠm@Ƅ09*9D:~&J9''!cYe>,bkG,Ut.#qUG EB^鵳]U%E=@rLn*Mqd\l&TN LqC / >LWoU'ҁ}PAN1DJmTc>NMڴ섄}?3O@ 3DF .j1ʼl#*kJ>yJW?cqb&ErJڵ{ ?߼glΩ7uoOd,3u]Eres$vy4tyaJGeLY#ZOSd HVpv~7fyϒxHguj l'%ҽD|GύB."[8X@n=@-;I]0 GYz  m'|EDk┙T/$i2*m7D-.  䢀kzBrB"YЃqĔJvaJjϨ^d*9$QI~Ob&'##V +*+vp49[1 x2Y)g@&bFdQX XB 2%h49sѰnfʽtJtSEDKd zPQh)2eԉ?|ӅA93IpGhfzh%.+_u>G wq2W_3TysPhO~8Tg됣0P55xK%2\z8fUߥgPEyA?~g?cbDZG*aT`Ğ)܉"R=ňjjB)ι adrzwxU`$]*TC cM>XML|^垝< -9njxb,>u/K[;UTc[zFy>ڌļv鹥91 :o<\Sj8Uʔ *}=R}[s4GJuT?8j8OSU_dkOAS83lߴK.䗇5|EqL}|;ZeG;zFr'9 `:^MVL6Pyl!=)9gww g{|,Ej|Wa څ.$xNټ1kDǵͤ[IBB$/XE qq`QU˺9q;B\xkh.$[(ԼPa"H yL:/=wĽ:i<&b]~Q߄n:}z.3C[$h5No*@D=~_cΓKƒzy83=?TH5n\N˄(IC#]w8N C =Y<1p҆GsooA5MƆf(cHo$<% 7`vijIs6W;WY}[[tKi\ЃǬWM )k;{8|%D?-doC`'`jG.N?a֦4 =e2ܖΩ-e\-|L|IASpq !Gzf>*L0=hȺ^[!.3ud'l:Comd Z'S=K04k0>4Ź9*rC‘luhz!P$Pǧi\%.NzfU'H])1D<7j ZP<:Q BM21[RGXT551B%o*H7lR3sl>ilXKξ7yD8cI#1`Pʜx~ -:D&VԻ|La4C5+hl|+bc 8,hO$D(D!LaUUAdMeDe؟kcG8 ; sk nOC̾7"w#AaJw}7Odճ& c 9 qSqIe`S+/'}/yj;!ILNEH GjeOd'0`X@+`7GnLW~b-vU=&3WLqz ZϨ+'S`ƏFM`Y3twbNcQ^PrD{3O@TgE(,ѧi>>ê&-C7&clE70ږgTPUрR{%i>B*0Χ ҡp wC˧$;&-}0ނͷ9ufX,o=7ɽ/֣y$M_ǞKx0.zZ׮'*Mq` {n׉"3`h(o+G!Y:QP1_^(gYs51x=v'F$qʾۢ$;_XN8w~R4ry77n'8|lc,]?}1i <s%u.crjuCӄ+UXJ$pAD̪@RVPOoŀD$ MGUd\ԗq^L63ܧN #H#X(N;=b'| 4t>=/]۴EhJ#Yw[lUܪcqڠ ൿ4^ʇ>@XsN@^Cp/~b21K`GxOU< Ka:zIYGLÁM2 g0p!x*:؀q>c1)1%KV&V@6_X,Ű'>b~0> u(12'`\eHΫSeݝoT9xww2a? ?<0Jbpu2H/I5nWV33бu0|T#^/JzN][^U(<< kOBǫhE… 蒆.ncQ̈ѥ9k2JZ@:F3 1ɬo!ۢ)%'bؘ&Sƕ"==Mbŭ ;l2S]Ipc:`a},^l76?υǃepY8`Zy4Ekh+\|ASұ.5L#i96( 6Z ODbBl`SoBHzw?+^2}(y |fAd'l/3msfaи18Zo`xoJiIN;vށ͒\&`kXS)mUmzi$ujѨӮV&CH[k= RRR59W oU12݀SPP$m^0oGQ J"WQf`Њ]ob gKeї7ĝtURxVK1V)~9 {̡YwS! V8_xi%n'j dZF]7Q|I&8Z¶obzN83TzgsRbg:h8kA=uP帳w-ujVyT_Ĕ;c*q=H-`ؘȏs;;)UȻe Ѵ6vD8ScOHUᅩflcc:n|*b U76bҺmy?*2[#JyAt6,4zjDk\+QB2BnutJ1<#q_<7QEǷ!aϖ\)&ngnW rJDhxӏo Ei.)FsS!QxX8l?BhtUL9 7~$9<|l S,)B_\pIU~RA>03( =%l̏s$7 `#RUW'ea`;2J3nVnfjbAdKԃe7PfX>HV1lJ&Jb>g > AbGRiM3\. *V 4Z]X$jwJ,[Ac$z|=,c7ws\!yc)3.Z~SOfMbUu-MALG8 8Fx3$?E741LH6AkT2c#SR`v|XJ̐j?vzIs'0;:1pY鞳6&}x=.Y:@'&+8*oH8" 4(e%<Z>mO1"Ҭԑe7|7EMp.#8ա>@`#vsN凑KM<<vqA\]UTd^7Z\ 7)cIO@UOEZFǐ*gDok:2ȳyT.=@!nEc}=xs:3Tyju[LS 6i=}Ab>DhSmV_likrГ#]:DŽQڱ[Ϋ bnYozJ4_gZ'IݐpDx Meb%6~˷[1άD#Pdu+LQP꣺cGpS rߨ H.92[[C^ٺapG?bS(&l?b"%A<=Hn­zmH~1Ɩ@@!ғ3DP'}EqG>Q&KƩUS)/=p\C@F!psi\0F̰a 釧s夦! PpMnT4XmX&h6YϋRj4Q'/SѰ*2XS噅Ζ*s9eGQxd}"a#t\-DW oҡv-ŅɱNV]jń )V9yV?42P:ǘKEƉ O=zQ&i.&av2N=+={,ECPC):?0:ϼ/QiO=g(!μ1c3DC2NJ${,qR>Q 6Y,q4E?N%z<v7dd-KbBYR:٦R"C5m߅evDDa+4bBUXΣ!} {Z#&a{^(+ˋDB ֧3_ޥfk GP XT5M:oGVt{K؅T؆{ E%:.EFMpܜ2wyWWBk  װBm/$53 `5SN2ِ2ExB%SVpCM)&qB8ƀhwM:tLma5ǜ&ɪ\Sqt%2*G8,DI䵂M'0ǚ?7 M˳q6tjpO>opGNDoFQ:j(Tm60/FW"l߬En[cV o#sR" 9(ƒGlÊc D Ã! $,Iѳ .tK'\r,90Jm%YcWM7HG =2QU͋S\!5aOY\:iఢ124 ߻X;n˝m.UvRFN6ygO ,t8-:q`B'4KM7Tv,6>vgBT"fg&vCc0XP@b *xddr@, %@x*̱S6El=nj8 !ȍĺLGgV.%htC!Jՠ0 *Sz5S/i5;I@%Cl1K5D>S@{N">Ib'H1jRKatdF*'F&{pBoUE-P|Y|_tz{VO*\GS:(?׋Ta|)B0(6dSvo=GrLcbaNDgꌛT|(v}# )PC}t"ȪHO㖌>guӆ><¹ci?{[vU1߹~Kn@Ȁ`Tdr SĐ(PU@P`AKpLCbx% jcVs[-K>g}k9 : ӝq@6D5*׾f#GUsqCG/4{ӕNLCRVG(CI&relP@p#Yaԫ`' j9f˅UI uI'(尒c4~n=X]&2pX*.L.}-x~7JΤ3EȔCbM&[`+d=1JֲeE &cIi6L*Ʊ@.^BK;_%X0ہڣtuᗵ4C6+"i+jՉGITJdb<sek hFyQ^$k]=4!r<| 6tV6y^^a\ZˣDM r#v8So㰻Z>Me{[acT}oAjܫ6lڂmbZ(td/-ֻ4;@UCF w̫@[ !=rqM/mr#hR#=]Br] VJNQ( >ĺiz7s=w <+VS"81z]lCG_\J{pŴl~+цj; 2Q(.bmtޖmUCXVRXKntwg* FCK$*&Ĺ-82V'"w9h:j5ȦnӜk7be!Z!E0LC)j r^4…900Z|Bbvh_=Q:U._C'%p;@*ީ("F(-Z]nѵ QRnL KVqnCvO)ish4;I2 |QnxZz:*7UHDm7csH@5TinD-lZD:H¤G5,OGWhzixUzOiŸZ8u"5Y$;{ͭm6dѺiLsÞPBôNhF@U )89dE< s[nطjؗ  6--#гuaz_RD2V) c˜uDV)Ƣ b4Υn-h f"=tF`-t&RڎqQjPyjPJK<َZO?We3zqTе4db)F/JҙQ(\p(yluRk ; ^x3ke+gK6[7cBZ<}SZpԕQδR8ibu W6>X:$K]G8*hpJ۠]E3#Fݔ)H&:)G$չ(0IJh@H;!KY5<-6,]+lY#d̾~Ż'bX'v\ [a CJ&1 #1h!LI9Y>iU.IȨ0{ NFY),n?@T,ZKJee+/N@ձjDq#kGԏk^[_󡿪yܧx;+?_}X2_">ޓW~I>xw;>xWuU_*:<Үz؞p̃_W N2AAd#2;NRbY&횙C&vS%JLY|[ŵZE4Xmܨi%\+$^T9ܩ֭uUq44, {|:l=Qo݄U؂DZ*.Ɋ+GUR3 a.)9Nvq0gKn8__sӟEFUEsuհKdCdES-i C P3s(&64{2P)TF hWb`h;)HHfGm|{lZ|zqJՎjP rLG@g VF9ovK!9~#~#v̻p֫z9=7~k WyNz?~TwƬ98.ڛUlB¬Tf9qTԚWn,&5t\au(\.@kXJNT Dk$fB(qTK ZEѬ F!^傪1X&7u[02uk GKR'K h0wc۶iJr2]xrr3MVB Vdl o@I"$)t-ĉ5`y$`"h#&5ז,`Elh_JcV * c%tʬ`?]Fe,hS%*@T3*f!S3_S5HBvOsopD`NS.5A4\ T!b# BxQZ bJD άU%cpS@fM[ zrE @y}rDaj cl=w^WLQl!iW%B#0}1Y(.3`VB"8@T@gV+@\\u`6L;G\J}o`xRⲸQn4ꪕ}N'BJZjuT;y QDТc`IY% ]=p>5H7vST))}ua̸:F-R[~+cf{EZVl˛4:5p{~@*'|{jyx(l_ryG,5KM6GWsfb^9Ll3;0VC D[6]B 6'?WsĬvcm|nɐVjƬ M(SBQT b*9S ȎǨ V86X5(ҙU$FSfu!1Y{tCT'1/Ǹp0)54fDw5F#}NTYvk4sac,e;FFsA݁[4&$f5)KݹU7r4Zbf Fέrҍ]®ʭ.9ݕwW-}w8X'}B6I4ӝG.A~f V\$$@)\P08hӰk``C FQpK!;"?W APX$'mM(A#V_@[ CW$%1C2 W.थPe>}2(Ui4s dc"6H`vKJwȚM㬣{rn Ofq)hj^p,-5t'g 2m4KC]wT^yj9 <5BH 0E~:(QH*IKP9VMŀVY-g01QH* /|#UՖZ Q,J X 2E%V;L 6]V 1l(}=1*cVEm/d8,bI4EgY)0 nD)9Hgg\F(;r6d=jmpv ic-1c):j]^D cA!WHZ\Ngd˦U51g6;!5U~;**B GH ܤ:q=":JFCa0OHe:g?ZRJ6kpR-X56@r w88f7,y8*JJ.d注.!$F8qG'IoOŧ^OMx4vFe4 ȥȶ>sC 8-2B.[a6:RMF,5bw>B%iÊ #䨕SrTrClOŪpNa۶8oAM02yD;"٭o(Ӛ"yYY*JFBS`6 @Y{Rj٬@wP7ҊnODeAjbbJN∅Cw:$AĈ&C5nMI=$tV#` L4w9!o4iFp9jN%`p)B4 wa}[j|X)E2gQHB#%d` {?+띹_YV0^W0O{Hy曝}8V1`vI٤൵5 ӋkdCjePjKj"Th`WuLղOlBa9zX|l6#A0:!R'v!9I `0$aL6@u&1*HkẸS$?Q:~'/y :*REX@%M $f!\N4j&NȬE,ojwk^P'\6A3rPYF%U TlA2tZNC(TjJ6ãmck/ـUf#Da.#1ap ,6t\O ̉}v7U rj.R03,JQD]jd 2Q-_gy<>ӯhe:\,N_v˾J3L`b"[ggElCH/6ct$a6 ļuӮ\: q^`Bs(x\+G[=ұn=K+g_EwWs= ?Aqq d1 ;2O[\:Mp٤3QΆv7#H TQk#w:vk_$Fjg@ӫd3,Aa[d4, +CfLjpSck1t@Ä7em[s#p@Լu.WBuJò{vdcG Tr lDSyL(RΈ#Qj;zW@B6yzҠ՗1 Lj&`SL'cزŶ$y Mg{<fo1]_ 0|;5LsrQĮT5*?a7+b*Lw/6fGf`;N=`"0@OiUe)"TyAFt24蠊 bE<̔WchvDBh5H\",WGD՗bq& =2 5!L%WJBj璉( Xh6}TB.a#O*5Hri2.m@lP@ L2KYu̅  iY$-e^K2J"QV^JP:WoO%OmOve8y`QD fe+YC#M l n&tP5o;M pJ.Z1ljeI!Gn΢$*nN5YlZXUE)Y,ʐB:9nԻ 7n7 IDATFy:WF3*5t*ͪ,r6<E"78x  wN(d;V˳6fMdT54HQO$Jt\CczzpZ ; Y0р^X.%X[/|=MrKwť[.zO7_mO;?ҧ|^Y?qnQ%_7q[ot[ox~#4o3?Kቿ 9?? N>9Kz|CNfբt(wF(Ip%fEq? vZ `j4*Tә7Nt桂%S"GB:  5(7k8-T'݄0D儙BQ+l9pG&*! أ4Lj `L˗AWgpqfE89)-rJ,'f1]˜bqAqfFMcH F(2 %&rͪ%FeUe ۙmIhmh0嬭QM4uŕ P(tYU,BD)c Ve%CA8l"XlCnyo.~~g^yo} =go[y|/o _?EGK5oO{ny|'>=} W~`g7oxO^Ll+qǧͯ~ޥE-?׼-qؐsc# ^19|ɍ7;6pR6U启 $%f<~w JR ȍHjDhJ+OyĖ|P65\**dE+飃3]iF8K=TDthOޢM@$"쎠MlO<!&QDrpݛzbn'}Dl~O̽w{ێ>_{dz-o7w7-~M?ozފQ]˿o~W{/~?{_'g?¿ѿ_ /{%9T㔍=a#򬪡(2w`}bd ÑBsoI ӮD3bp)0*%MsSTdlh[b;e.d5'D6,+VW!-X:85 6S @<,Cn՟FXY}5L1rghUa88w89czrP@H2B 3=& [U!78AM{; CQ6a$F&)q/S,BZa 4%5 ӿ6pi'D6jP`2QfU/[X5Eţ묀?.g\_>y=ϺC=9۟ڟ?#_웯|=F᯿?KO g?GXr3?n 9>"w|?~Oy}~wĿ{>\mC+?}]?6wOi[~mW;g\"]β -lJDr:;P"3ÒH^2X@斝 HO,{F{ 253 t6d ̦&0bTX¬hks?=Jk&ѦF@{vx\+~T뽭 ,!iʎ'(vŠA nV >0RHhX0X^ndBtn+X$7kje61٩ 5y@^ ҳt*i̬`6 Ѧ6N !% XP;Vٴrrߝ`hR)`s` @[B|n\+^?}?_~W~O~.^737ts?y7?o|G}i~W?n/7/;֣^%K'>/~+~~?=g~o >ӿ{^W_W|`R:__cW/~a5G|?~OkSL~G΋n[W^w[O_>ƫ|pZy_M{?{NoK/x~/ܯ~䞏;T>ٙJoaЍ HElP.V6Q4լGӞ]JAp13v$98  -aQٙEH\(3x+Q4 kv "LVpJRPäFDVj Ɉ`,QhTMr$ݵbٖqP=([v[جtabBŀ+jˎ0*; lϜ, {z,rXagUk}:L ˨6*kβsXG @M[Y ke+Z|˞38ҔM'QaȰӳ*rkg?Y&g9viw ~7/7w<s^a?o7}'^xzn_bo%0_8j܍7?M_'Oo>yWW7|˷o_us˾7^U?>_m~= ~ ?|Ż >ߐg~G{35D]?I՟ٷ^˓ n8=TnxŋWoҽW{xՏooo{/[pyO]9t2U*]h ˜(DE݁4\8bWBى,)O3ArݍFJ'$ʒȡlGgVHg'4, P|%,(4jj&E*']6z#ZwyԭU<绺%J $˃cR34+]BЖLm! iIH8 !$^ ecKdI%Ytu5}?ɒỒl9ts{g-QŦ\ve!JkT 5!!M9r0FMFdm!hN#*YQ1AlV{dN3=3*Y5NF"(D (JPu-:ke TrJ< !fn[ӭ 6ɄB3 bx(rg8QDaMiZN] nYn7|?}r~ˋ7?އ3c׾ܽO}c/⋎_9/༸]W~Gu|~~no{o+|~?^-/ȼ_/{]r}x?׾gs}_w+c?߾[.Ň8w]~᥯_8K𼓗=/#/<;:K߹%/eInN37}7g#0/eh(ڟoOokvpxMy':~z˟9qW^c'μ /y*q:m{㱒~7?xo~ny_pzK_7˞7.۟_go~q c?]i Q݇xvwkC=/} G>ANFH.ж; R;J kw[h+S↣F*+<""pK)fF$Y6g}6셂d v7Zt!D{>6pXjP .1[_`Yk+ BmFe3Fh` roWޕ"; AKfDAWHOv3aL YiXԦYD}@cT-U[ WfaN!aWr! P&g 0 ہa,K` e-NQ%):`U)k-6E%8bifU$(l{n$)Gtg9 q_W?s^C^qs^,/OkϪ?;? ^?sW~kGwN\Krʼnu?%s]Ԅ,qA+ZW)`TP YE"bP9YU{csa#쭁XpTFN &uҕU6EDr.mjUWhQ/Fyl$)'^At®ਹ L AYb6$8 r-Ͳt= @bR265Fvw A 0)Ѣ+ZjHHzE;'Վ n 3z~Qh#nh%[zvBebmZRʾ qJWϦ.!DJZUP <"D Pl5k:}os/}?҉q51q: _]pⓗ~W>}]͉>~ٜ۞?=YO]7x=[Imo?ԧ?4kzk.x7Ͽg+s̓{w;o?[O^]/~xwy]#6;26'R<:@5+mdHp̀%Җ ̪r+:܆"UI!'\Â$Hi!ɀSبrD]ޏS'>.z6#z T, d e.4 QN (,PӬd S隮a"Ko/롶[ 2UR!J*Q"Զl=]1ݶk)оmXfXe!DPD1`a6] -HWr02kҭ51{8?9+]`0ȠpheE$0䈁AoAHj!$;Ewj iEb(@j&D:Hb;cavn۴"QZhUOkmaku@(EV6$94p9Z۬0 I[!"9@,r[z4V&Nalb.$LlH` Xd9J5b IRC A.TM柅CW^gߣ=u³_OޟE7\ /~E~W~'7\ѻ%/\ 91WE/Yۏ</=/|׍7{};Nz9W_ʊ _sƽ|'!dlIF35I3#Rc9HI6#d1Uj."o"\νA("&VZyց7XBRnS˾MAMCc%([tIjF*aژs\#{blfY;LKyֈCڌfBE> 9V{- @)V̚lr- p!KQp2Gb*qIfkC̹-48B. sEE+ h$䶱uz5MF "P>n}y3/?~gH '>ΫW~鋟w|xS؎]+PKz O7<;xw\o~׷Wuwww? w]u _qnfp{o}Wu{~. {/]jCOq3_5Oo= ܭxX7~_s.Bo1M;'XŀF,][% jVڐ\܈[[bUBk_zYK(2lǒ%b f"dtW:uF2fPLad,Љb:k*Y]XvKBBgI2l2 +* E0(NնvQvz|Jbp]yRs:0iF4>ybu$ˈQ=$!fQe(zV5/huUl^-9QEjR ó-Ah\ӘGP :=(Qڃ P1k%؊z^5%Myr!ז!&)po{^_eO߽^&]W_ww_<oe_C?7>x_''?qGxO\~꯿w/׾ͱw.+뚓_W[_>w_uӷ}[w|3;|< p99<9{ ?޵{ݹͳ^-o]~>o~_?x-^G+'A'?oos'nܹJ<%_Uf{SYl%f&]ilLG'XFhX 4*Ȏ9(12%ids:#ڪݩ2jGKw|$`,/;*%쁇 V:&_|_^h{-Jbl2Y>,bhfΡtΒ1 K@$ܺN,Ue#jJjW.ʔ@d*C JMXN2*tލ*,#\UAlXVStmsmܦE*o]eS{2 c l=D*FZʌf.P?-a=h[ݽX oO{p뚫>t9>JW_ګ?r=8CEEvgx#>}Q>m;Jt·g9y˧nC+Р=AjZy9uO?8g=>uMdHO#<-g62+ȴI+A%w3 #TcS-P64(CselRr"\BjķāWqD{5+\ HW! [2p"T 6lLTƊ-'۪(m?FYp!@R8^ݑ˵ P@5\zU- fdYa`%Ťˆ3[e3U.g|s>'8|%{*>1w}8( ~Ʊ19?{O|y|?{,;9+gÖz91,>@YWα.BEł K/EspF#)/l(K Y)bd"}$Ht. U4A4IMHY%9Ph5H_AcA"$J)@LFdcjͨFBlq9MjY@1~@CD]D"U(FhY^aE;`ҡђubO8Q*35Ql+n@tMFY$dna4TZ6YֆRXJY-|JJT&Bǂz)a>GMNyꓐ`ӟ@wG|&Sٞ`t.;M0b{g;n۹'2IB*2tm"a> j.#RzP>% + " נimB0bAhoClGŮKTD(Y 5rٲT]Bf<,FX 5Q%R)1[P@;GOeɑ܎Xebl2C)behu]"+C$Ti2Cѓ `,$U@րYĦfvJZ ¶ɓQV9&eU 됨 4.4Q&U0#@N6R8^Q[٠XsF$psw_mߧ`g}tǯZZ*#F AE0)BF1sxmQ *@ZZFe!"#%h`3Wq_4+]0acY:&$RddSPBHd%L}Zp6F@On(@`)c٫D,QZ:(sp^DV#n-E j6`<Ҁe &rWn ROS^ ªY"2 TcThY..\DTCjѰLs^xc b+atS13NsYL0O4>?!>Gz.x<< ?e9E98UզnBVrzկ * 0:v 6hZ EHȺF\Y$^!LjfԪ[BF vUZ R]Av]9k V1 ^͠pО'aBm&StxѦt ͙Y&0`#& @•2M^G&PEƴdCD O Z8,RY6WV6 }4Jپ/ja\=4j4<(1:kTBFK_۪ba0rD/`@Ws[6-ب :~U)=ہO8˗ v?t cþt*`ͱGWy> iJ0ܺs0Q6ثD#H.ZMB4`{jt 7Wҽ"Xה vgAEȍvS4U6.b&Ɛ)3.8jwtd&&ب{Hܸ%2D0,áְɌF}\0Qf=84T1"gm+>%O4UL3Ye*BzAzxi6)JΙ,4ڶE==imW%N6P׌*WegF83(Zkf *}jQZ–ed=RUF;%WɡAQ$>|nvn w."s嚦98 a&h.I1 т!E*z&nd{/V/T$ SbPJ.1  )EE~` í VIa͞Peh0?Iہb+Ր",ZP\flBY[{D;FqNARBDl8Zp[#huAшotF1A (S^@PDD<#ݷ(Beu.Y2!ug` H XլPYcILQvys$wdV^JB)"0Z`y?P N0vSN0G<xmɝMۉ`AaIhNn\CӅ1<vCIlHWb-$ `)QeRj!*r R>{Xzm@V1psmxqд˒zܞ]Tu(Qo}HůI0%0`jH:i2Վ"p9Q $YbHU n)ƚmHN#Bd<Sd֛efTbu9{ݷޖD@6]R*s`1~@CbLE!R\%T`*ɚgkqs% 9@`j!|Ȼ=$%G^A!< >Og{g:7s -Li!v3efUp22nS!U+ՇR'vH4 i.5|rz4zb +WgvڄCp +238L`Pb:`m Fs? b )ݢm+t:(d7 G$ 1B傀Q., <<"N?7]La#ڦfĪ 6(@*{kdr-t@=6Ԉ@W[%jIH 5LniܯBHh$•U`Pdy`RL)^i_d #LXTf ?b8 δ+1zԿ/$G } \R9sy\W u9|ǡ{ 5`>z,c̩vALmwcQ7M`6:ƕF\[a"3EʲC5S„11ɣ= "2*V(% FӳhՠAm Ҝ~fdOFƪ #)82WƊd#U)E]bYX kCo(uf[Y3[eYdЍ.pfF͞pTW!iS )d$`u:a+=Zid,y]b[djm:·M7/c+æ`c3,Xm>b;XSh3"A}B0dQ 7'K0KjwĈմrψ l WȻ`N cG?A ƭ;ݶsؔksݬ>Zц6&<-3/}ޗW|Wżnl^jEa RVp9)ePX00+Ft hL84VX E1d-VXjnar ljA.3j{F J^DTh،2Xn-TY0"AUвdKLqK(2+{A&7( ^ buQjŁ.R6ķY:Y젹ZuODF`T`ֽ׈QV6 &C΄L]`ْ_"b QVFp%4\Uv#Z-&6>U<HhAH0=`|Ƈ {%=r8|RTuut;`6 s{ \Mƞs6[e兘YA_FQjfQ"nnM_&ѽhdB"΢ִd{0SQJzuj4;)\ el䁑YL |laMQƲi^y&ݬ9T "nJt٘pc#{Z6)@ lv5#e%H "QfQ1-;4dBʷB!3H00$ fmpǛ"QZ^ IDAT !JABUQ4Te)NbzzkeD6"+P*m-E Ų"پ6CajqC|b16}a{dѯ$vo7?tSwcXq;acF7aUfUDlFV!A 2FV]v#6(DDkF@-B& ]'=UIY!fRH4TQKÄI($`-#UqH l˙V0phYg*SpG1C 8>P iϳ$5ž=Gi38sΓUSkɪE'w+"TP^ZkԖ\p]Vk% !+5Ö Ԍez Y%CIbKe{gYnT{=d\mI+#GE@1TCwţhÙoX2l%pbUr X~|LElnn5_sOE%<|azAaJڡ[1{G!J5x*7TR>,@`?k{eV0Ud]p,8 X76zkj-$&u]|0E7k6f]I"R~=f*mV µ$sbiYwRy^Jy}gwry33G1%D\n(ޏM}vu ^Y {# ve_]P?SC.XnS,b]?@?f,yY:k~y?QIo(M/XzcoWh WM!ɵ#byp' N:6}s|̌{Khh^ͫ.ʺ{_*McWU=rš۰}H65,& 3J]I͟CɞER*8ԩ]%H:dC(Fϐ65w4FMѳ%] =WC*mcrE ٻgnJnRJژt'ή]QB7|6=mOkPx ~XRGͺ>ܳ߶Gg,.U}(M/QlE:wϦM$â"6iQιKViJ5P54##:M~r a ;[!XSEŠjur.0K{:$oXQ rnɽC(+R(Pۿ̏Hya%.K~YPhn-e0rxQݠKE:mQQhkblNbp" ܝJ g7nO*_wDpQB zP ѐ)z-7`mNK!Ye/z'c1v=OF xf{*Sj\zӿO#Vտq=p|q0!:L%Iʋ* UKֆ<x撚h2C^4,w8J WQUtS =621#FP~ن ЏpatD^x5kxݏarul;p'^ܸ…M Dypwo晩Du%h V BfFSA rj6vzLZi=jcշ 8^K7oI'kj6zr q<&Vz.R4DĘlT{ebMv-'Υf=z I` 5d7BP ;3!6WP͢9UզZX<2|jd[JQ9ƢM,[@@O^>٩x(B3a4۞R$iNz_2[[pq_(Y͇?-xebgo!ᐭ߈+eivyv Nn 耒VA:YMDyOQ`R ĥER]+9wrgmZ+챽 mEaːX]Jdb'=`Y jITfbf\M#,A#|UvT >hЧ]^dR0z@ tG .Q#Sg|‹J8@H/φmqײ$a$o66M1%1]e= 5g̀rhc5]:ŊNq)'$aO, ٫@[@,*z_dW6:@/;&L6v}pMXuYH:"|=0:S? [)pS& R*'}(ί5/ǜL'`O9^:@e@$OdKs̀((f&zPcTIǹg Dk ɚ+B7 ?\.9NdO}j\9tS&f̋򏅒5Ƣ@ Ty-ꅠGK6AngOb dF[hgG1UWic^ 7~$> |[V-z 95{Zrb 2cx,r )4< EcWT"im5-N*BR)^&Ogv#~,{1Gr FcrLn"R;FR+ɱ=8%@Yr{K F m+a+rez"Y:/Ѯ͢Obx ƙAWS}Lyߡ14~ɠ>0M̑ CBv6^S }$G(c!ԃSEѮmg].Ȗ>Tyw+񯓄%;YX/ԉjIE*wfTv\.~۬u6ኁ@ws^+HL !@-m+WUc(,o ՀҳZ>98eG?„ p'ΦW "zcB$ڧ9SO/Fu&ރKW\Bc8AR, JرfgWZ nEI J̖%;tLTG|Gnx`"C VH&Zvo뻉ntIQY]X]?"&U4\*r-3g YJO5~JbeQwyB! `x`^3[x XoK><=ʜC֮VZ`ܨU[ql9ߝXD >qvdj3 (˶sVy*Lb=@w$c6m56:a!1V7?|ɣ9j׀뉫KY~Tzǒ} a:zΑ,z)/qk<(KlVs7e=ڴ2\ k A *hfd3SSȼ2X9VٙmCz"B{94pHX% zYZ=&,Ew(sק,>R&}'0 %Z%R%_5^uР~ ϩ!q/0PycAfGQ {| ş?ObN/G)~Ap[6_  ٮ=mb>`M#t .Nʐo0!Nl]aEUao ]Bn ]OTK&\;t"935 Ok*U>y%F/l !: 1;\W"Bkd]LIRZ9 .+]4H mZ'I֕$DhR(ꤦ M7\qj /G5ĺA tQYĥ-:nnTʁ,{'d*ngOTZ;MCcuYqa*@f^@EStSgEbj`$Pr]nX\ Shx%xDpr ވU]U gJ0N.SIUc(Dג^2L{qXOph)gK^\Wǫo~s/-^ f]mx\X6C$H RYd$>-[owjRtvZK>UZ]KS}޷U yESBW'#~A OUx҇FW<؝U0Һ{(*0@-Lț J#*p?UF5] T3+(9f-A.ڱ7=]N!|B]xڍdkUGlVWwCK{ܨ /Y=MjK8buac ȝި!fC?|0v'>J뭫6 _ С3+)%(|qգn֙¾P~=i ɏA'b̅Yf-Vdj^a6i[?" KVр%킦(<"k'\Pi>\aiD6l=c eC479n3T$$Zˬ JdQn =jwy/ nM`$w]z%)U(V eM Q|X/C&kŧwi*j_]4dIړfɌ!B\Nőa;"oǎTb&-h ?V&ZYv_a"Θ\++O Ttow\8`&5.&Ԟ˓CA~F߃ZTyuG 0h1ںh9,>2vEь̬!1|Cop*}N㙳 f\>¬Ի@99"S' TiV x l υE7@"m; pKO(L orL<CPSo?t9;xt2zH*&#՞AL3WSӿGhSvn=AVjP~X'=e<򤔌(6τyC 0AM_?k,D"\Pɻ@U]ޛ59"|XxoREr5TB(UX9Q4% 6TB,d>8@LO&ݳ6D]VS`…Q(ycLX*AKew9fCU!lǻ3KRLZ^80E+r]`F 3Nrh:tJa+a *  ݿ`|d]PtżhTƱv|cGP/$^iNtUѿO,(MbhՒ'dTtbĀZQ7;&C\D: SgJ@8] MbUk]FUC,kGg]xsrЛPɃj|>2XEalI5g?-7*X-sZ%MqM<,j(rq_-*ר{EparͶ܃Z Ā7Vb&@[Kr*M!߿}oƢRϾBrmT"fnxi?±Tq"I>χ˃߼V}I.V\llCG>UA`:h1VCwpiڒe=Ow! tF$ eg}@)ȱD->AUpৰyh% z.X%TGyJTA^GŇͤ*WhCl:Y9@D/h|j/ *NFo<X"@yRҙ]nJ@AHa/YWTep r/7]U@"pxTE6}J%݅1Ngh`Q5ϊp悽2*^f6<DUUNq&nc2FepqQ?0bD#ܡ UbBZ OA\稧M.Pnc )@"OuLi,Q)/ Wq^%ywWO<ƙ`kgdMSu˵6_M"sjdTu80y6B7O6%@S+6>SީfC'.Hsd1>t%$aͲBPk/9ƚg~E. u+X47zإ{"Kedz =7sU2WD]:=Qzi̬E0T}܍I4See_j`Q}NeNTj }b@P֡tpWZY@a?3f+Е$}w|NT+Sق_v)Cx7 ʟ8/??M>2IYQ0JrwL_:t⑰\> [z ~(h1-:)-.@"B$j စ ~XWdooӍq[12j^"T{RI](F\'n bB7;of,QX2|w*GJw֡Gٱ;c!Y дϏmc@TY+N` X.[ưYT0X)Y ׯ_Up0tP/! Mn^\x hitd\w{5f˻;V%#%N+=FB"XWh{=X{gE'`W+-\QK H%Y Mq*(Tqb c^WÒ(Hy."}"qG N Wߏ<2$7|R]yv|PFb$w'c˘r]EfLg]a孪B{E_bA`9[}ITP֋b.[)d3سX &IfUb d{D"Ӫvx|H_+J5BۘaHݨ98yzw! |{ gp\'3<Vۧa ⣏s2AFJgAd*Yz[R@[EAeޤ0=*ђ6ysфdCKc皩3߽Mߛ%F`KEX\]c]-ՠ*x wb ^c (0&\BPk1`B()G:ͼ)v-v\PvDZˎ2N, pw;?-K@uPZ$ %6f;u\ETWa[/&U,V1eجvW@dc0,ndH,I]ǮE-$Ѓl3h=fOS ^цq !ג=k_6f Ғ"K΂I&^It֗!~L溶\lsR$Ϡ r`$qG Y;SuΕd @BmCKh>7s345C ;hQI+5Z`ja%u! PuT%WDAg4-Qo@4UQpjy] ҞbŚo2Y$Ѫb#w]A>p TӈO$(K8dD_K˻m]_ζMV]h61?%xj> ֐]%;jE$G.A+l#5 ̬L)K/sIkRG+]ҙC-8i W8$o(pTilj"%NVl  c(w]"\O˘ӣd>8Čғqo2 qimS4o^KՊw\-_F2R%H< bQ݇Wc!9ee 30xTΏ uՒ'~΢3E#jiRsrdVĢGjS5/oQ $krl_lEE(rW0b6Ks|TiL9Dlթ&ׂ}|.Bs}ݾ]sr^tw%0 r/zA&X¦}s#oMPU?v.Mܕ0qF~{O%1xō̘0'l\;$wLİ: }Tp(d{$-K(>;Kd`!`ci;Uߎ?BHM/w" .7 "@RfJ|LvFઝ=ٗ8a*|d(`a_cz2?ЎT$%\/? &M?$q@IgW.ԝ@ f\9Mro)aWfbz!啮b*\ p;N'BAi|hh 2iZ5\$wIcf"AYiy* DcPğR?̢6EXWL)!|P\zXDn;h\d_ZePX&Rґց4Jܥ+Iy<^XBjY/t@H@ҕ5焞]^qfܴ ?[|EUkg4h[PcƆOCzܟL O' UUb#md w_{{%. {RsWmN!Lm5E)Fsgyf伪Z~!ő!95`p"˱GVĉ F fkH|!·Ns{VU6i9m]rmĹ&EH> ظIG [5lpxMO?~æ67ׯ,CS02r(-b)HϾӛby[p= f|8] w-H3:c8\.^m"8#N`g]cXmÖf[EQϠX"}*P̾.D(% !`ӱ ,I=T2@9~e-ñZЬؙ8)M8 5@oqT=+&g{=&pj.$FGBdΠu!F`A242Ǡ+ʦ^ XYu}z4k\go=ȬavZ2y0XOL27QeTk#5b`2)Kdڪ5j=r[=]pUq_BzH& #LnaA2Ajffā󞑳#J YU@h6nu%'F2+Ce>[z5]դCItc(c A ?ı9HTIJYy2]z8jfD#W]hpXś¥~"ɥax$?Ij4R3U>N:}6G %Y4{aWUٔ:Z >#f_~x9v+LF@ǧz$Ejcٮ&=7/L^!ϵ#K8B \1Cޙ\ҀCWQifz'M]ނ|4ZytFSEr37]Ŧ7^eiyE+;`deNDfb 1'=Kâ@%o'30 h0VS1uE}3C7SE %x+K,YdEHN{> (h %,Td[!dm8f\(±7 OO=pXmC h *m/ty!di4٬Vq* h{ܐ.w)T5&rk zwn2s%$*!KZd0}0ܹ}z^xpԃwҝU" lp<kՉM(EBu^n'Yjj75\IJ}WXx: 2],}NiZ,Ut5|!&I~XqU<;Ғ~Z8bb͆=&R,Xm/ul?8KlXzpty)#:ް-pk:&;ˈBWJ"^Ik+ۛ=2F,Q2 Ak\hkIɘxd(]~$z7a~+j2LH}frkLžMkUeE{3Kʩvxo3'.(ZɤK1kFts@Z<}ޏo[?,@hyF#;lr 3蛾ź6)RW{𔔿ksvXaDY#H֘sv[r6lK)c? GȌy]N1s|^?f^-#T`f*VB -m,ja!Zg7Sy>:X\G9 b)Pkf}[ё;oA*[4 rH$$;+nˋ8[E_яtU{#Q8 :gߍJX]U%]}'tMC-zV5"x$(> &1E= !6v";bzBBѣ[j @UB&`U%֖Yb)#aAj~6 Bϣs(8IF+S-VBيZe5x*:sa_?'OZӢ[zr0/qd@b'fazs+~mEf=`REՏ~v{-ɜ|o*Ey=VAo4lj窞padIpl~rq5$Q:_U[ot "a"pu5lE%->z_Z6=LV)H3E:JO%qDMvhvkRƹt/8;D1;8~)7N븦6O^čB[u )JQ=ƫ U0ɈSI5NgӃˡ$69U!BȈ~גu|aU&ǓJs]n;f7wokXS'_ruo\ WU8tęm_F4<{02\XIfPu! ܬ]A'δyEl @[AYMTyh 9 [vf8z[\}Pn|I$=h]sX %d+kN\MZٝvȸs #+<ڴ6jz'#;RWifJ@Wn)^( a/4tDXܵLڱ?O*s%B}-'|v9yG}&fsw#z;uUcDS7iW%0$61 x/]%Տ IDAT$=昣(.j[,t:whcX=g-WMg\ 른ҳTf1choMgφw/Rƽ³۟UNvxɾ@/H@欽xDq* Pk =RB$.YThz!@G bwtL[š8{Tg\/O2}$ԃ܆`a[S?a+x(84\ªz{RI)K6ۺQwk  pX>JX$PH8&fI,0}T`E/V}řbSQ>ٕ]&iYgwIntpѸ#C*?qܹ 5/y6wݠ~Im6[_u(J``l-As&^OIW}j.U8 1%&6ǿSVQ?Binw Ѻ z!xSYOvC=N}]B3;]؃k!ȑ$lXA4_չ*ڋ&``)2a[ <"\Og ϭ~Ϝb/Cn؍H(_3))/5\aCX{CLٍl~9av)&R`"oRV E FAnWN)w~7BÄ 1Ṟ&:.L 䫜kUjlXs-CxL FXI MbKo#c bM& T-&bl[L8(ev BOi[(NGv)ٶ^6I$׬3ӥ%򣰌1D/K"77F%H2/I_,&eTZ߹f bT_Dc s^nUq8=Z *"V|}|e~Y}Ӱ ĒD>'OPّ'e|Ֆc{^6~ИȂdcNl4z٫Qu_I薞 ܣc~:UiVwAV)AչpgSqMa"+8? 3_]FNtL)v~b ڀӁjf DZ] EU5G7.%?Luh5cw șI T ΀\+=Cf=9ݦzcKᘕ*]ԠU彼h>>'ok?s o|Q[oIiK|\dF*8|Q#FR. km-t_=׃"^B2+7]! t<+饏oWR1}S仂fђ Hz;J.>%__*3N I,+']HW(~EZ72ӕX3Μz;r}s"W "o[HI=T2?_Rb5NUH?h5pE PXHvb5;]ࣷuOql`Ged=&pń&5V'5vϰe2S:pĩQE\Wӧ^0@y+ZA`qvW6};LK}"; d[3FRtn\<(g[CJ,ĒA?"e[5\-wH`<+DO>~\htwx݌iΆODbrwqICtL(ic \7׋ٵ-c)KgưPi|έ 1JZ]$EC4IkE%_kZ푋ۭ;=!\Е`Pj2}\vv'}Q))4ZzzbV(ęY@@A)^]aG!fC\vm料Q`w6'ߺfZO(QO3?+Hdȳc#YMA#XvJ(evAFuy#"?%:l**EC̤EaNU qGfT<{B֎'f[JQ,ӟ~M15ӳ6|bELwr|?8`Y.70.6"@aLwoTjdJ2YfHf)PJA&F0%: b, 2$_UQ'AM]g9J rtNr%ʲHwf RE{ÎD n,³\ҒUfO-W&JWHv8R34nW1T,ShݧS@x葈qU#-;K&s_o=PECs FL]`]G9x] *A]%q)'c0^ l{ i'Hp|e>΋&|U\\= FsQ!e2 t_- q>Śt0l32G3s::BrEYUkt=.J or>l*0 -ص3OrzDʞj;ZgB2@_AvGRj hDBQp awX'33p>)C4Zh%F/̃Mq?V}ML 6F.f xN"Ha"e-1cDJJᕀ1P`Emh O%sdL4iR .buN;Dvz\;޽_uo%̜Gz1vgM^2/[?\P՞MEd̠26MDUwNʯLt[ $Գkj*GDQlnc79KWE @cw kņe)r%CŠ/6ո^hgvy X.V77z5#-%`7ġQdtőT10OO_A5 *ࣱcT?I M;kUBf{~¤T[}@Z^A.Bўt$M[*v ;$V)sUj:Q}HU$,8{YEyIz̺$eW&9kREq0n% uɯuwt]]'1,!Cŕk1EXYkD1>W7kQRL;fDSbzHzA14]9P۫*:EGQcW-ܳ|ϮoL#"$NY^/Aԍ1YWUM;ܪT"/ʚ[G9\mOρI &f@T,]WSl$ z"f o4]'Yv* gM*{(90;-lػ AĽ{"Uv Kә_..?f;D\H%/|5v) * ev8PS גYkץu6;laApڲ0+,nS*s>C0P|&K\u$e%!>%=Rd.7)}ySNL ^W[*z r6vIQ1d=FvPU͚I+Ax"A?O g '`uE (ol 6QUWg Õ P/JcJ4|uo Qꡋ-/ݧzw1Ƥ2-f2Tjvʺ[2ztBZm~:D;넓& S'U#{ltx2VWs~~9BMwc%ue昴{摆K=DTocZ(4xbNu..xAIuϷ}( Ff *'aA@S_T"ѻo'*ЃD mZ)!GiPH䂕T`6lI21±gҙFs1UYjev#6d#P4 fAT>8"mZO}߂'-uH6ߞww!>Q!3px|8Ϙb;Ԍ \h!ڙ'3Czn'5n6%m{ܾp+ 84bJ#4s&8)W ]IcGˑ#js;o4YN+OǧD3\X_%i`h1f>w07U]eȽC?Xnd ~?~/>g ~gz˟yaS:~5wy ׿]o䗞kO~}~o1Ѐ 9O?ckg8;Py)[gm/gfkFΫ*01̧*O'dw}P(ϚKt [|w qn͟z`zcnI{_y*NKvr0>p&IѾr:aõ]H8q@PR G^b<7SIYMN%<ܕbG]5GBrs:amA}<`WH€%nxP7( i3A?\1@lBԇtkW4^:׷Wq wj eNnafާBpa U]v$P20@F'86R͐Y$zi?|~W`ozn0`1?\A8М2u<;a6?Yp, W3gƢ+5j&MF_AҞ*̎qNahiF~i[wHLx%EzBsC <6{+L*) !m$wN&d5|`vRx!~3ﺼ"j)zOB?ې;b@d+/Eq%̧u,|̰J߳ݙƮ!5qacFU-"Dy٘'`I4=K^uLANAaDq̆EL} 9 1JO'? ?;+76}|?AnRi$] PH;|XТa}mLco} fzv~>vk;ľ{|v쫯{Sm %jD7;ٮxODIO"@0I jZ)0,bXs}oQX3]2eUj+~k%u]Ֆ*똆/o$c<2q?ӓ._Kz>\>BMg&J*xD{~]Qӿ}PN:vWSz/WD C>,;Zo\amhÀ݌4baCo3//+_ombKl0_~xտ +翲 &ԂɟVvxźH|mEg=UT6K8|k@P)$|t W H`n캤<^f1rU%&֗StEW!bK,q]U~~%p<ƅw޺ DRUK?]DKgB Vr-0\:)ao_?k# ~kȺDڰt%p+eHhx&%MHzI]Bg;ד`$o?/Xn0@wd.W/? 拻xɣyJ p&VI#>k$@AG(Blr.N$VVw#ÂN> AU5FPQ1]c24ӹ.o⭤6z=FA;. ;$|TnԚGXbbDdY%&;Һ;5 sDpx)D.(D1"To}v3U/rj5`B`Z(s>9b >kVvaxv`ʞ.лkU1ٱhHFec}reI'9"ky1׹UK^,J?kߑ 滟`V7--wFc+o0ًE77eitUXuS^x\f{?9(OM-q-N@y h"Jθ UJ<@(3E0xSoIU‡޻_4,tbB#!>98{- #Y$"`³/>[xj%c?+};fW?yNS/h]dק(Iu` #  S~n*m̸!\z0g`IrdS\]NOO69U@`/2ړR,~~HU >{߯_/O-~o쏱^?T™]#x(!Z:;}yTY[M XAWm^~whmW"Wy9t*';vaB\`Ճ(yc.rwS=Y\̺))3jy\/JG|g~+꺖&]h~|x]N6lm&@Lc"XY$ XE,*Di}D(޳NNM16f7QY{ېTq'<4f?cAx>Y`q9%v|AY7 D!{뻿4 P~{|wbO 4ge_`*?'8 pK6m[1?Zhؽet9AksL#x(HU)xf ʺ4K-ٝu8#җz䗻0`ԡa_n;ic+.ۿB80$ ckG[LDi^uwXd2o8!SwrG~~g@%X\$ dQ%*ɄDR_kcl@` Фd2i::8 i"K|Tҙ>C=j.Q<6G fnإw'tSU 셹iSU@Q__o0_`3Z7>oxR+`W~>"Ei[dx*DYX/E x[PG .(Ua-|s#6oBSFުWub -,udQUA`xjDC9 Ahе*}%}R0f'D%['밨P{ ? :tlB<~=H"N*&pK<QZ $͎Ǎ, 5;#>^V*s8.*p4Ko6y . I1 hsRd@N IDAT "Kx9A>@|~e">+]i&^;OvT/IkY[` ;oj `  |F|c/8!.9KRKUgpZ (d< \FDu Ys/Xa(I.4/1QN}|P);܆\?i~*G!d ]t.bRq5ds#8.,'R:?ܰ]2R0C 8U `dOwς ZXLdufEޝNgخ8/ѥu KJ$FnޢRiB(K޵,`c_bU䆜(n\QG:fst3(B F)ᅊ[{_ \__¿woI;BB%>kitL@y]y JЭ‡Qq83tu5l.!ƪ=(ѫK"Ə?v3F>TaA`čM_ό^aztr`&O1\/zF쬁xT@>sY7;5+ŏc;b07 Z"^D -2Z@(b?~y)p_B^xg6WWIaW ܺ`&s --}P Yw*ʄF#׈A<|ůw< 毻U0_~ ;__ze}g^4*֜ë9UI.NGԽymWU,[ӁReYQX"(4vJ# HCB> ={|]:`9gͽ|Ȳ'P47˄TV'.OTqܛD9Vd7hܽFgP !V>ز%~kh#PZj2ij6k54ZX yXRwp&/@dx e!,*pjhFs6R&gmʜ`FhD +w܈Qfi ^tQJ/*BV(iu&,a (e psgj4y9# ٍ!eVkH$ 0Iч r]y9ˇ f #Bi j&(,@C7ZE.iieZ(3S5CDY M,pkP0kV$6 *ǹJP>X\N|tܵC"50:Y!\g-m;<9ۼeGiϻwrn;=E>fܲ>}׶bgR[w~6NL>ܺ il4d%b/q[WEOAtk(8M *bmXf^ _0#z$FHT2@TyTU9ɨ[VaK0]n8ѼwQdYtOڄl CU8IAui}&PXMjȱ';3 f~XlDʓdi6[N^ Qckr£Xխ4cgGc( ^m bZL,I3`4HH^&Q0DR",aƔu@r SLV)ҽ*xQ_7o {n;[UkYz}W []z zUX_o}[s7bS^?ʗl߲M{-gk׬^zիr8W^?Vnewղvy\xm1oS[= H.ZSIIDwI,LM(-S1#T/QCNX-3 (sFp"2^ :RAуrWmV:[CGJL êP䱆ftv0թ1КYyrd @f,X s¬8y(E%Ҧz3&3<NN n ODit BIy27  A.% 3͈à&6VFjt䉉AwOu53H0t4 ,v iUI* L59Jgocٳ7|֯߿oxOmC^?b3ל5yGW_~.oھꙿo|1?_sQkWYoocix٣!~;>{ÿtM[}{9o{LJ>|{,f=%?矼:/7cQHw޴7rsT0 ̲"r4k{q+mU4Z'X[Ϻ?g>M?~q7wz|$vߞ;!zX2#C9&0HG4+@FfXa͕$Z dMCq`@[I*pý0&WM؀ĹL uu *H dԈɔ1k0,C@h &0Vi\䦮>IP!bhM&kyZIfrEBZG5WYUh^҉e`!Orra8UJf̖djla5̐ 4&6*UO&Ř6-\{#1k{5#[K)a͆yb0ԫ+\@ʞ'?.S<=/unwsI/{6N[<倇oW{Z^q=>%'dvxۗ~ᐗ֛<~9=r{7?@ځ}V'o.r ;J-R̲7@,\Ji) |޻DD,zݲETReRtWV*(%2jQGKsGCUSC'l ca3a1g5_Fgzs8B|M 9&EOyB#υ]LsT7LrHdy[ӻzDg舞ie,iTd(IO+PlpЖpHQ3*4FfrrT:[WCPDGb2\vfC-4w$3C Мefx=?]l9 Gv;.~u'n7|W䳎Y x^xKoްnZ{1Gv>VxرGv^pVwq~+6)MWk;⎎~o>G{lvvbbƶCv Y\z\~C7֎.jPEb`%PpJ#*`&'խ\^R&GWxpH&)4hH4& k&PN@м 0"y"нIKRT\X @g6Z3L\b"A1Y>FA$bi5ac֚YanJK2J$%giv ^&54)!7s%440ů';;Yw'>?O'xt懱kiZ~Ͻgco`?G:m|vO/|#zw+Nkz75(Ć7l]2qok+?߾-/9h黶WgM?vº^돿yOlb}X˷.-f2*X1 fi֬<ʌEWfm,dV2(*Kcٙt7͍ -03XTgG`J̧ $a Òtq$ 1eB*yE=.: PbNK~2U eJgR3bk"bKdJVHT9ɼFD& Cd' p Қʚ%(!{<'+ W{9?go?qݟ#_ap ~_}Ҩw_smwO`1g.tʙMC;bes?*h +/_l\l^;~/?Wz=u] }f~y=~/7ֳ-;Uo|gk>O_xs^{?r ȵ|u5'q¦gq+:tC=-]NnWg1lKܲ[Xb-|+o~O{s~MCG?|?/9[w.OnHe8d!ve҃J\9 eUt l5{NDSUi!+Gg7ZdY@ `)RDKeȜ#,P^IFyRȊȅ2asa" Q\NyʺbÀw9*,&!V6#md3BinpdƱ{2hbZ̤K`!4,};o↰P9ђf7F` B94%` &2Tda#FYzRىQ HAfvgrPf3G6k9Bf"jI"G$F12%*עHeDB&Mxx2.CL3^͟V}>WwΟ_`W_rQ{3m_g7-غ9t˯ ?~s翾1`vUg[ Zjayϟ6۬e|oK'w_埽dpi=m|}[c?!h}:x^|>k[~{<зn|WOdLnW=y΃ak.LroԀAАHW[y[+aMa,Fo VR3 Rl>)ZN6E"46jk5<եE$MCoۀb+ Yd!\=BJ&TMj6RVL1 f% 5ͼYڼw-WWDR"sH˄)<#C|Q|\yMZ*h斖F3 SfHDT1 ͧ $K˒%2]Tb3~X0Fl<&uF!G5T<6cL3<ݑ]gr{0,_oLzj5U={Ms(v>[~O]e%{kNxr޾ǝu;.7l-m}Ƒ+]|?fӾo{oo|O}nܻO]Lch k)¹jFj9 IDAT&0*UaJ#T &C P0; Hi0bh0)YJى*r`Zd7tft723.8=, 6Ohf4tcZzAb@ ʨ1iZ̄^ޑ^E@7kPK!+y4"- >$MEL,/B%03#%'k1ݔLN9057e*3J6 |vc+=4ҔHNF>p}ʾt442"M4KGKUɕ6H@Z0n`YK>2N4>ǽDMS8ol9>x٪YZ{.;Uמt+^pG;cW~' |vܭcy}-Zf0t;wܻ3O_ǸKxŖ~Kwp./8 O9c8iͽ|.u)Yyi'훷_rэ[Էm~ԯګ^[?}y~O&=s }.۸ݾ=%޼h@ ,Ea Lsfi& 4HwD U'Ph-[OoJn捖dzJ7G$F Ȓ69!g4)Xt24 -:Xv1[zdBGs7s2& & xm)Q$$7IaYђ`U.L)fMeJldl荦, Z7C] 3Cr ID]0jnfV@[1  ǢC; '9 Lv@fE"&DBjMdiAU?CM̙ `V nd#XnU'O}$a=r_}@{u!˱ϻ!s;9gn{~\X}}7ݹ9Šrlֻ.yxm.>`2/znʛGfaSOoK;_ӎg#[ڻ<-5cbFI3UP_;cc8i_'?O8>Yǭ;׬8۴.yϽNyƉU~ړ {Ҿ`Ȳl-;R0S sP9! 4d4H4GCt˭L#=,9-G14IW490d2qvB ! iUF(QC feVΐ5L̅R=ftskĕbEE*Q%ơh KPg(栌$SІn@-ʼnDz*Gp미GmaC=Vza'޻ ,f[k!i_^>W;g {ŹW}}igbձg/XhIJ5kٹ=g[ؽn/w} !:!i6r&pi ˰^\҅ewhRԸLȕMXQ.فzTb43Ei1ZlfqC .%˞R|BDʜMLSQv̮ah3k]``2 @KI299j͕-aUufփ$g" lluw n41oe2X64kU!b96`1l63 MދVPȲhC >(R陒&LYL)F΃`0$ -$/d $ g3̱.T(F"u f`|6L 5Pf@G=sD"i-œ|'j_Ưۚ8'zಋnzd+. O:dp;/-~ ạVlf.ACq^rA\|KyW{}\}Ǟz1{u˿~ɧI3t% l?7 ]VVhI֏=$a<ZY׺ SVMhib o"{@{2fAzJm]n2nY™ 4l& %Zk$`1vǔ:}0![D&-,map͛NǼ'Bi@g)) D pjJ0iAi ޳1&.Li^PeDN\D RWM^zeB0o ܽ Z*RJod;>cx×,l+W޿o{1k/cq/i;8ypl2N^'|/|y%_]8ԡ:zU}߅\+^q)VwՅ=跟w~{  /y^G='7?ݢRlvn`'{ .v9}K#kǢ MXZ,0 0 Z 2 Y3"# 5t0f=dM6q=tOU33Ŕ怀SAC5M5]d3Zs+1B0* sD u80O.t1k Mmpa֙JыG XU@M.ΜF}EalC E"" E h9HX쥍ꀹZCp ,` 4ݧY'zFK+|ӚTMdZВ06}40Zp|)Z̆al$M<31 K=M&e¼֥ q $B4u{ Oc(H1|%l~_y_rwC^u.J`v?g5מ]?#7tk6Zoo?N;q֧?<?w~o/N[ȴ>\X` }ib2"4%V*Yl^+NʍaG_m:̔.S6"}B\}TCRLw0Sf>9YJ 0pk.@*0+8Ά4qfH"!s4F56(On!4Hx93gMqyLw~or?Gŷ>_7;s䳾Ǟk?_{*m8nWﱧ}RARt:o?vd F>%_.5"$*"9bqLwMXOܐF0Wє7aU_aƪA`IY6Z`eoŜZSdsϘM7utH[,̼M[ tZ>pm={_[3xmHt [-ܬ:LmoǁDݣa>2k,@MӘa" c1i!V0-I圙t =][L!w} 4II L2(˓h+n LAg(ͽf`Dn$H7oeB0btp5%Ni(D-4a&HJa^VBJ{1 >(& >IF&U"+vKq撻R IC{6 ƌFtRtefU#+L-׵e&TbIlϛ| jʲlXGր>N݀RHI@ʊB qfց>>0;ei= 0vWwc^2;ؾ͟v=qvGݻVvtmwe{wsnVwtWUEV|E"dmlH dr!fY!n`fbPb28',;$ w{;{.S^]gy-M_kQ6$҃OpD{0}7*8&:(]~HmxЯFESZAൔ" ʃVړKKh(hPD+IlTDFP R2TG6Wr+ٱ &JQzr4z8Ez#(_? kek.m[d KZy?SȘl F UU$VTquzsD(~3c8Pg<T\0蕐 ĝ Zk) E@+9Aɻ \R7*{B~}.w/r WK |_m?P`~~;?[|ߩy?vt%!8RE }uVGBRZP!:W]Msj%A^jyC050™5(Jg_{g\u9(@\ f ft` Q8SUŷrō_M(dE*d@f^!A=Mt1[\gN(<@q&L@RA ({Te `pČL&Y1٢( 1APa%`1"nv6!m{yDUsmmD%n(p $x?DMwbZ!~zsW`~?=o~ǽC)9SkEAN1giOP5~̶ V)q@YbYs*dyhiJ zr뙜07v5mNH fV Mź0"ƪ&MLR*8;!9"j-HZKxJ$-3Kd*q Դ 6 QmXz!9Its]!aa:Pn|lvT/7MdFxf{ػ"(D;B&mrfa07:k qB] @]l61߽ڿ\]W-_;r}ϖaa ~ѯC8ڄAFYAқ:%4A1REb&;)Psp J_5P?sH#= M,֕\&pKJc3T RB ,_d&kHʓs'W$l: >jX%"S5>wOҭ}UԀBGj3l4xC,o4d 2і"-bJ G!!{`J,kc$v,@g Tt_f[!h24Lj(=Ʈ%r] g?.fF͙C@P!hh`^dS;m8S"m9*8U,aԄB$s$ô2u!sϏLo__ ~N+O*0?+8q~ҟ/5o~/E?EB 6NA0 yBbu2N&\Z)NG>krZ7̗Ҿ:U_vcB(ˮ&D U+>y ;3#K<¢NzzQɂ(%;J va IDAT۪ڡ?gzw̨ Jm VW`Twk (JG#b)HTNВ?d:XA0tVhZSN< w2LdB QTA@ PP dE~j ɆM>Q '/4dojsRe; Milu&ˁEGOxO >u*=[qoP`~{u+GP`򓚭 /'o߾^Vf)1 !V$TtzMo-vɲܔ課ċͲ࠱%;ÈsK_/gW+#96#BRQ%\>+IU"<^hპ5 x68cE̊ ,Zi5m=qQ Mqrj@%A1v aJ_utbY;'͚^Z 1YJݶ cO @T D/VК-({B\YN 0Bb[Ι#d|W?>V6:!(CH#WǿOT`~_Y ׎Q`za^?~qۯ_Ͽ)iC(qwK+Daڸ!4SՂ^kˬ VJ\:4 U% \4~p|ʅzy^"IYN2.c`XA*+ WH:x3>cbaq=m-u\SP%0Px!MMQJXށo*81MkhD!JK{[  +U4{B,:2[. nqLdծ (QP3pPdZj~U{ڋ4 G |P*ɫ;1B-dp0˪'Y; ooV`MwͿ?^گŞXL 5͠kp,|켓^2H㺆 &esA aT Ey;Ai}p$(ݥ Ъ3DQ(r%/ 2sz;lFR,”V-xU VPS@ga檉IJvBJKmUÓKLU$0S?W: 9g]-K܆cI&/Ą%jX}wF6$(AJ HY1x.dhVꙐp|Ia)^(S ejpoM ,pz qdi^_H 4 Y!~w֯Zgd1g_~o뤎@F "vuiIU+;Hus{>S B@ׄ(H.P+& .yQa߼rsȖdO,IւYnHRpvO#= 6 T;N؛̢UܒT9U(tOpuot 6acK$ hX.9fb log5KY&72E8`e#  ޥAX:4l5bȰ71^۪{pe?=_sw{/0_;1~-S/0_" z~K//> ̈́& h Euj{8 \UFi!UU\ÝdC2|2U5^AA!uv$!gf~/J il` =ʒi07w}C V5 ]3V:P2#w_bwD&7MK UAcw;)DANE]c/?Yv?D_ k)V=7CrdPkG#4걽JrjS$v|lZle쑛]xʚeJU= Z;g?QPT*1c "*`C%3e=qͧw~D W kҟ۟?:9jL^]Z\!B )U.g̘bZ5v,.O^K;C*.{m͢&p\%p$՞);XŢ,R2GOqh6^)tpJÜ$UDVrFU9KKm5 ,*"zyv=8]̘ 1v@,s◢\wxݪ+K[ǃ3V Z*b Zk!#Ӓ53Ă?-Rc1FLK+aO:jbf,\%t8:`CA*U @^ЌHCFfr↻Qs͜l )JH~Y_>(/ w|'P`|ad_{Je|~cS@xgo 6]sݹZ7E2Nbd0nAauUUe,k$Q2jNT9UPȪevH58tBo.~}/ckNqSpi!jm!^v_hjs!6!yW-.ՄZ?y :.Zw~\g%{T^g?旯~S;<$|1kWEq1Wl?U.& (RdiUa\nY (J3ytOz\u*p-uPy^=[n:t%%AJOBdf =dkLJRX,uLJh + 7Quٹ=>ZU=bEy6bTޖ*'=9Sygmp"^9$iFm9F)q #tf$yN}αUȻBh2ZyX#õ3(vo]ڍzA w`N3 O񈕬[U̷|#GfVD;ҥAG`,I )kHPwL7Dzl#iQ=g|>3k$E1Km:~kny8cb3i s9I x9Lxbv9g9ZVzDU,X+eYa]W3|h{-.Ї )w+M͖Ī,8Q]̀ ,X(vMA<ԧuֈv/Ȍl$JmPU$/ucuƼnU%uƵ@ NuMp ZW.otSX$YSaamZKP A$IAa*R.²$(׭w$mXz0P88FT޽|.zQ0w b>0 !;icDFsכɎW I+F@hu*0`f\|n[ʬ*9ђç6ouwZW<n(BUs Nd}(J/D] Gu-eJ-U.,|ð 9حJ;Z&O>Zq;"gmGN[5~3}mCמ{aufψ;E U\?5`כN*djD+p^m4Zh*7slE'͸)h;za皭 w>s^+~"LlmAӵ0xl7ۺkQE!~($5֛̈GE{CbˋUIq4݊3XY7Yp'2 lvBLP$Pp2]S?t}Xce9Ú@8]`|gZVUwn;˳\S<[i-i0$;駙*+=mb<{AI/+mt19EdE!o)`b 2, {b` 30ù(;U+rvq%a];g8T[H&.vW\!DB|ğMџuKjz"#PxX-]Yb14y&X@ӫ#șj䙜*L&:2AeAz/D4}כ9H^kzbh 4YKbkXw:Bgb JNdP`BYer\dף31=tm H_ӄsj×jHqA=KKa9(eнU@$aooTY6͊>Y;=!*+?I&4zVr1B1ջUטzBOwT$y@&gxYc:]U_WN$83׌P$wEʏzfV;>T3Z#|u|n-& }Y/ fG ?bK>3`Q&2^6>X(Ge'(@ʧnN&x:"4HffQj<ͭ w. (Y `TE+D弧5&cb،]53*w2x?MHY%~nh0.f }w"ZsxʯU0≫*vŲ2Aǎ,b^|~mJ>ZӬ+M.qG+0[g3#\Xj$Wh{WU2Z̻0/I51Pӌ[[5?^]RKҮit R")*u3DTOXEȲ,BoVچiB^A둶=Zz?S,ْhbT^{KجjR8 pL nf0?ŧ<gG|@&b/Iv%.j-O0_X@jC11STUP{6ۃ`1琩ݘSuuDׂk!jUUJXN-]fN VbWZA9SH3ؤ5qx4W!+ط-M ~i6O%P;ZPػRi!a <ެ3A0$3v&L48ޢZwʻt':#ثU*wf@>ט5QRY0S򎲾6PDk =\Uu:V\ no4E_G=16an"qm 8]Яo8_铈!{sWNdewEҦzH9wx5Pɐ坕޿ X:M wg(}K+ 䢁PɒѤ*@A qtdA.ֳwoWH͸Ԍas|z*?*>35݂Zo]ev>c\1KpJ9X7Ҷy8BJNkHtMY5'> ;~ Q˱W.='w6*zܟGE&-(PHTԵbǿ1 +KMǏ4Vh7Nꁵ;Yl;x/ 5eY}1 X\Kڬq*ֿQnrS/C4e !qYKN".R9O,^&ao`3xW@@y<č٥Z*QfFF:vn Ã{QU4z[JG 4Q}mlk avK<#D-_d *Jo _]l7SXTXJ2/ҵ~]rakIrIbnuge8Wq.b̷S°9ձ2I\YiO @~3]^-pNZn#H3G}TIU_s*V!S*~0vD nfsوlj7>Ieo;GFJ &f錄z$|&)[\*]W(r)*rDwICc_0 9Ԏួ*/(X9Ab@ya!~)87 rLE1[lcﱎ//=|^כNxdޘՉgE\L }1Bp1-FSnX ߶~uETvM[ J3sN<ܗFE(շ[HߵHwٟH^XosK3I_K0Lƈz pM~r@k` UwU!VjzI^$N%`)'Vw5/BIeӘ;\UOWZ Yai2K_/N)H{*FdJC[ER&kmPzK;$"k7K*v=}n}8i#|BN0QZKh"H?LF{v˅?0łp㔰,P5k$?k,Tf:rr:>#u^u~ ,XKrƋFL&\yt_f=CcFgC*޷%|!&#{  L] n$˭ǂµX R@#oI.YnۉHCD $`tmQu;(jŊ脪k[A:aĀڈqEp m2TQ|xIX-cR\%-K gHags`S=haIϠRC3ˮqKEԏC$>(Ґ98x[g@u]?/oA^DP~B"_tndߏ7.҉ZATSg8< Uـiź@v>ʾ厁ޥq%xDA~|30'XE/KVb|/~C'_bv{.E!= K 'xbiʬ <.X{IFXѴ07۟cdQ(ޤ۸vܰ2IwQ#AfVÄ|\+n։=t&.ɖ ܒx1Oșx{Y& 3ZJkʻ*As[IъeobMʌެ7U A5_Kb-nWo ɯ v<ד]afoFLOc\#r Gƕ@U%21oLiZ7M$ Y!\q3Th?bsތiǒPX^p`Eb?j}j G&pݕyO 䞼vҭcb;D no.jH_CdaLNBXڽgBcũ,s+yBXm Ĉ;t2V 14Oom?R'\YI0: Z%/jϨV ~z޺燱KNRفk;nx/d5Ųg]U=*؃T 0%~GF8 FPzhC ,![_;'ţeWkej0޼H.R@D9'ɈH=w RXT~g,i~/ѤhQ0Նl wmEU@wOpMN Oצ7'+4Ra ] d`a0v% ԇ!`u ƾ1^5u٥\(+0.,/wp6vwz@0hDݒDr9Ͻ{Mq`nNp𝌶|A5QdߠfM|N- 0YeP`3|>}K%@HEdU v}P :u]Va :~9 <&fY t[,Xqْ 264_hkU.p]F.sАڱD';Ik.[d%~>D]CSy'{bNE'6+iUڼC ;ͫ SSG8 JLHzoM7UD;Xkn.l1![w ^tR'Tf>qYclEy5˓[%Ef6 Z #\۵~^|IoB7)' =fIMPdE+m>yT7 ^IFl[+T2g/P]("cR@$klIq%][ C~.ŭhS5~41ڨnZ]%nJPu˽}?.pK2y_97 ڵq ;#I+ϥޞVv n`䭢)[ϖװ3}$V*s΂@-~fFMDvr5⡷;tw 4(a[]?!YZ. GLJux.:'5]EKNQo}14TOlgx5K% 5AeU־D1JV D^,L?>$O5U$>oVZ'E.M\JxvA 7ч(QT֥;zF_*ﲪ{=pO۹ĨcU-b3Iď^L!4x좩kmsb,Z.uvp$bȸ3JʸeW]# 3Tsmꜵ@`]04;?1>r %Rࠒ_QvcIω$_P*f92oAF}{#Y O껼c*/rs 4Dvɮ:Ed<Ʃ.a3O=2e.Cqm`rvKΔU'"[ B m;̈́* ccb`)JwtK .@zzN9 F$ջg\%ڇz E Mmsb-o7q uHs2+\;z^'uj># ɘ1_ob+agaa-_ՠPe$x `牔7i_~ja v#ԅA,YQybLbM|2x ܂ Z__i"&w&}C o`r_I IDAT/-,*51k(UUDm5z)hvhas""J^0.T3G,FcbL7 $GUo Gu :Z:xc؟?x!? P&EZ%^yq* FeiUSJݭ~cMck,:K=T.R,=蹙fTO^TPL]r%+Z@".Q?z ϭ<<@ߘ2rnRK w+iA eI6kۂf&AcUafdjgK\ p+]!(OՋ Vb. ?p^hévIԵ@QxY-]Ml0GR38 VŽ[<,^Hv*rƒ\/-$V\[:k7'bPK#г 4/V M=5xnbj\改uջ54~UwQyë6HLA rg |T$c#{HY hcrqP?zSw`t&F%9>sLAVd3T&' *oſEoe0jVU\1Ƶ"q71`tƧG3"*$f@Uix$K3VY <p[= [y1XR\Zf. 7u몠orZV-.kf] 9PnXNf \llY;rD?'J1E{#~4ѩBXĩRG7F*o!f7=1ދ~тAZ;022ز);6޽$V!?=-Hұ྄BUR='S1VbZb=YB0co%., R"{wp6x[TR R*o8)d[30^9Di qJ,c.#@vzmdjČaǷELSZPW7>O;PGz=8x2ܧ;z6SVL^{M:>unߣKCu3BIT^P_[]͠j{]Q0}qE(Әy8g02Fc*H1;+)'*6QsEz-_k e"N\3C%)6ƲtYUEduN9$|=S#4x,`h.'Pĕv,C{[u^>wǟrULd(3&Og9{@-o`C.s{e8Kɤsg>raee{-j{Eѣr]9u^?bt-1,dF.IIg=Nt8qv|z<Y0TϧϖРLb\&_onRXzYb LRp8Wr̐W 󰢚zޕmfdweJUP̭Z,pG(H[W3B{yw^ Ȁ2%ꜧ/YH\5 4U_-O^}jL vن`܋C%<.G|lՖ@\%N9 32>6~Wlxs*:7gOϰgܸ"Kſ3@zK7 ݡQcW$?c]tEXWl;8;ÚJ?E=ߦ !ًj>ϴD6Ԗ$jS{>g ,/J-\i kS)^{PR\Pejl3ƍdV^vs]G[R@rF9A`({?aO =e)3|Pۈ,gLvRpuX|>|nD^!_O`s_(wfz*BםU];xyPePj|}6NUkc/TϽs FO60}kq$hi?{ U]2dᆒN3~(]jD{DB灎f]/Nc!z!}Euo)ʙ[Ԇ Tɻ 1=~'L .Mv5.nV8'4dN$[[ީ璘`!w](?E|0jI-VBfWC6Dм/[=n} nr `_@\#3"m*39j'>5ξ93%PA˜~Hpc.-{$ا1¡ I|H'WOX^DaS)7Xu]sBYp[ Q'"ҽ3O 3WeYO=3J<ݜ@pU%)2 [-"zGVN{H ( Z3.c4g$in&c#a|Y-k!BC ['CG.**~Mտ/C[od R!@?ŘT~'Fץ7?wTQ %]K +$--/s/[UcMdh&?{LU}7=BnnroFϧ䝴b3KA[cpT\*kc4_l8+b^g+xvR/쭪_X@oԮgG:;! Z<_s6)7*nv jw:5 4@d]AQh\ *bcYᘀl |ztIr gmJ]`eN(s'Kԅ+=ޏ;w N Ӱ%֛K~Zhml0Y6pB1 5饫]8h*G<. O!s!Rn g .XgQ[hj8ڬf}fF28*|>ܶQmlUѬ7GDkǹ\[izl=5wG `/+UG_q7NN%rX>kA@(hL+ˇ^2$&0 ۃ t.寘!c}uΟwFVa ĖŔ^o[/H@/!~̞2$!C?VkT*zNTj{W{eR!CL$vr_N}%`AwTU*X.1P0~bhU?6,mLĻS|,ى353ڻ_mh}bUww7z ݅mnY/AmmX\7Ӏ zǶ4Ϫ $oڣAq9&F̼0Xvݝ/>#Nu/K]$>ӁVmȏƻ-m}>YL:Us8>gџZ~vm v+ò.):kŦR.zMg_ٳy]% _w`̩ωo]C%uډM)皳Ո?MP;/ٵFu|GlqvjZ;⎨⿡޻QNi_/ hu;inU̮3gYu6bTq&=;.80~#r"SgU Us bncpV"jDi)L*}msVU^ f-YuF)giWmS|`Ê':L&Bz?9{E DM.72Y*k:"x4 2s) H} zErКd[ M5{6B= 4 OeEfsy3N]ӦUhHW[ YUBʕ%:ȥEY12'JjZB{MpsK ͯZhM`'BK,EѺVFO~M5)bSn}B[ŚNQ"E3`}P ݴn8itbwDp\teչ!k늷]m^g7j)'5ef`+ں+co:J*h"L臶)fcz"Ru`ҩ,]4,o&"z^Xho&ـU@BKCAKm]Ǡ9.%@˶mHQQB&(lq)YhјJ,-"۟A2Q1F964z$9 !/mJ N,XΔsvV-̔J׼fM#)W9+ϱrdXAa|pl_˵5ꭤy༵N;hW6;>߳2ٮ-5 {D%UI4"[HoCK(>pڛݥ!=YlR-ܟ=UHKo_V׈^0[W6eQ& Q&r-B8R[%lӈ!gqQfXLX3,;Hy&jn*X(`A9aYU塙`-溃r̽1ko)n2wPD5M+U4X(#<R ]ԤWbƢFC`yAJe`f& DjY£:CPR/J$ځjC4v UØ@D <;9LJۛH 9Jd+ h׵2g2s¸ef n||CξI;,\] qHsE~eqGp i%p'OjU;&g גH:} IDAT؄ta`feZC h#cTtd!QU!v ъUxƖ,ULBêrRAM$7(dJMGSe;Qً)Gi.f߬pViWF!ٙΛ87ѹ m01F1 G fqmh3p&3b2Ԧj⩛ՠ`U 1$a-yr4Zf }AԮ.0>Mh#ajUYz- Lo?rHM_ȆinyiBfT7#oGP(/rw]2?`.6}_xB%hqB9x_#¾uՎK(ŰlGȈFu.F`#ccͦKEu}q&f(FA٠eF1UamM9K#뱴\ee~L-j]!M%C+Q:mTWeQ) mX&;RHUB#آ-ZbY0 cM!iiofX&IQƁzk~ (Ħ0P9 M U 1Y{RcSdm̤`85͂ŶܻE# PYY3]$CWkWհq?^p*bgjNv]`= طy|qs肋8ᇃe/)\`.8\w}„Q6Pc>vl,7(!7Kh)gTHz a0 ^":2?sy>I}.p`E'}K~qWi.>,JCV&sԛ;_x2呭#[u5"vrhKr% MLrK+I~ ¦ +ʳi,GƥNoujYR4-Lj kVF;jB# 4vڈU9LG)s [`hs CciRQm)Fv @i t$C\4rf& h!KmW, \ĩ<(Z:dlfA-w%Ce`%-B1rcA8hTUPޡ'N:}E%BFqMZR]肋wk+xrdz'UZNlE#"9q SLhVXL2-![W 3U@Lc)U A.lc(gs`I]@jg9 Zvۭ@,Ȩ(8jcQd\ a,$^& Bp/=Pi)tpe6׻F l Q]^mwvo暀uDl4SE!DLƲY4Mt(RY!%r"fZM"8jG+*I"my@-a5!GF'4jqH5PBtۯM6О$.5[4R u[\7FxI9)u 撝O}ԉe\%;\Ab˝&\t#)]v ȝpv8Vx!1yӜ~<ŧ D#:<5VL8l*BPu%]kM DUrwZJUbLR3a)0@1,Z+73bȬXǥ*W^^۱.R;?i8r[\:&V^X$^=Bb*8qQ޷J/ ]{ B]&i haqX6d(#B1uTBp+RiTŸK1FU!RnhgtGJKW_Fk8c&CZNh`& fKlX҈lyXͱ#|cvi0#L./_>9Hs1\r#3iw!\%nIܻ~>F e>sRN;܎XuyqZDekK+D!$1n( te@$j+?2ߠVXilzQLdY᫭V%ઌjw d[Ԃ؄ r +6t6[LQ[P "̥=lPaW FFz7cdb cHCɧ bgP\`2%Y9MզPG/HTfMZc6Ei""W-fnvuk9 6k9Kclb']y71ۣ4kBC &e@YLRh4 j%hg8zH%푞HpKkn8w ][sr3םܹ7pk.\wùsםp/zO+O~J{'~߼1¹jq?wzo[OO}37?iĿgv = ;"pT 1ЈcyZ{Pf0:4V L/ TQe$ *}-IoTd0LD"D[ P9D-;jPJLLI^gyx7䚞Et!e8N=ѕd+0Jᝪ<¥WɑaF *{ؽ(fL JFDtU׽1vjG5 qgDr@UEDfpqXf%DD:ksKN*^*f;i1 tDVy`C)/+pfhڢ,`Tv:@$#>zNx䟧jW ?_/qc}K^p[/7/{WW׿{^޿y_='gasųs{;NK;sm%/\\sݿoOw_)M|]g|^[/س|9Ue3]sc.1bkjlSaفsFh"a.9Mbcw`Ƭ8XUb3R"0PH*XܗP (-U%8YE/1cmI0 TkkZ`ҕ.$!nLF5.A^B9.ߛZ2eo4bn}B̙#B BLx79Ю&Y YXs88Y#$e/lNWK|L7#vpiv\ᐦX0Uh)3!*(9ה8Wt󅈢%ƀOŭwN.V´8DX0j%$<#=\A$Sxsx;[Uw>7 t o~ _{G\wtyзu _𨻞=cы//w?o⏺}ouMw'OyzE/yOI.̪ؑ0Ş`4wV1Xvw+ghѳ]?iN IR?rVe0g*ʢc*/D.tZEPY a"0r) V jAZ(,DT;499B(Uղ[ U j ggx]p G.TYR 72@TP[Πa," )gm#*, pJ̀**;()am !E)nB 6s&`5'Yey,} ө% fҠ욛\Lh3Q2,ºsVD8 +]JWG4+hDid?PdOƇ<ɏ>3w߷d tƈ,)6К$(d<"US'DH3ݶe3+܋"ٓ^ Fṵ=CclBEJu]fEr"-1eͩITEoD`f2rT:T.D\e`rg:gE*k*V#66=BU*TZݲ*M #rG+eh+-s2T0,dIcɕc@r8^lnNW6t j`8+ˈvkx4N9rztAzhw-x6.??J^wSn^~aR<K{_wW+n}G0vyuo+__z+_w@¶{gǫ~߾sK'Ͽoh,};7x'~}.īy/7/߾o?S?{'=vܳ^/oW~W'[|ܝ]82^&M %ŘJ!q٫"a!<( 2 5⬐$˜ɵi9, !P0\VKc">b$ e¡Uv,ȉi\1LP+K>R EPQ`;H#PU4Hv'F(H%n ʣR<Z鬚2_BJr-4p &%ˢl[jəR@M{K!Ĭ)j.BRRW\2\ȅVjGViU џ ~[c04҂HpID: p^MTHM-pT$ ^wy~3zⳞvЭx]מ|ys~Ƈq o~w?/WO1W3W;YΞ={͙ Ǚ9ws?{}_?ŝcsa]_p\t9z:WYA kӣYA4BEܮvlLC(T0 50-%5=]&zmI[xir< fu$k"B+VDHe7]UIZfj-ݿؤ\v⤃ZA6JH,C[* TX"եRDv>K$łSWޟ'<*7}'_Sw|'~e/=}}G`3wC|˗>>C/<ͳM5_]?_?7ox[!{5?g>7QǝO}/>{7M;M\:۞;_;.U+1w/_|@gݾ7ټ_|8r_!9ưeqe`T՞~%9aE֎ ѹt $>ɀZyʬv}qϜU0#ܧ81UlB~JYh桑؇K0Ij/P9ub;'MLL{IHg(4{E .ثP{\:X\%e޻v]acw./Ň$>$EK"%QG$i FӤn$Nm iS5i(DM AN@4IU˲E=HQ)zP(R"/Eל?wsys/)W-p~ַ{5s%"@e{hTZ] 4XYsk`QeJ+Vx#Ú {Wn!g;6,b唑9A:Ҷ`dLF v2Q0f!֡jaH0fDsGRg&:>WP9ع붶7~q֏}~vߺ~#}Ե?pN~mGgyt5<=$[_u{{W=ؗ|N{ׇkw_ ?SC?c?}kٟ{t/~qv̹u9Ԉ.v`.9;ۗ͞j:UUIXUU:sa,@lHjS."6A̧B|&caQK!O(;ZXazU5׌*T۲Or9%.%dh&\3 ptbFC9k.h.7|~~ӟgz^w~Y`t۫>swO?^oÏ?.@^lξ=wп{/+^zx-z|7]x~k{|Ǥ_OOſKjM???'~ǥv|g_]v^j~_o{9y<}nr&LUt4_I5"B2Yބb0gezh Aմ(p"f`5~[ee1@hɈ*sga-f TՌ {-&l21ZtE#ôc3=ws{cYMnL2š@LH4MJ{" ApVE P#{xEVXdÃ2d:hB؛IcJDjo>S!iHr9YH1fUF1&2WZ>@Np -mQ@IJeM+wr?JWtx=^s+o'>$?u78pkniW>j圅g'΋ov؃0D7`{,}$%V&LiWT8Ψ4"Т("J@t(^ J j kcÎa4b-VT]"v3<ƢPqq "Pvd JP, ɱ,"`Ti9942s!JǒˉD`%, 'Qb6za" Y$'fj-,[ҦosUU!`ț(-5Z1"rdjB($ iː",I.!vV$d3I]\F\C{@h>m/ɜ|o[^W/_M{?k_rn<{O{*O'nnS&#O&μ/\4K_'}tvzw~Q\ƷokǃwG>Kʳ[9"tD=ӅndOݎ諗}菽o~^8*KZKO}, ]13Ck¹5L(JQL`),Қ&SjoJCI2C&j&4`j TWeCmɌra8U# tR㘕sN ֪hE"Lu$I!nLJ@mt-5՜Ph0B;jk;ݼ7$|paNv͝پI\u截cnx?7/݇o^^&c^0,0] b("%1Lۦ9@;;W3RP  6QdV)XAțA9"Y],*h3vu}1Vb6zIJ+ Q3 .D$)<KXZVIYK1WJ4c$s ̍`AԢJc5ELf&H2$t^Jehn.Zk nX3Wʯhie0BȬ5@^4ƪvs` YQQpv>ٚtIkϜ_ ³fh1'&UC6^#̈́;D3e5 b1 J02Dh'p%7u/4>0}u7c=WƙW=}ܽ{Bo~{ć?]+^}'>C6\}o[ofa>vs˧qW\G?W7{~5n|҇$f)O9\õ+jYKp R=/zǛ~wyŭeE` !"mCaL0s%Ϧ+<`faг""++3 jZM:<2(b7:F|o߂yzˋ{]ww/.O~?\S󩯬1?v>{rʽ"Мkह2A{{`C?}@>y/<}?ןoW?w_2O~{w}Ǟ=ݏ7 Ry+7]s'>Ko})?>k|WC?_=`~ʟ}GooߺO\\kxGyw6\ IDATǗ ? EY8 BؘҾQWiS,BtQ;L`İ.<^с%8Vx@)#pO_@_.RY7ql ]/FyR~z1򌍏img6*6F ʔ\RńG1!S*ί˺L5D%iY)Qdx0&Kg{XV"vĎ*(3szPV \&Ġnb@#፜spm ("յ~ `61+glš%kWf*Pȵ 'XeQe(t E*ͬ&&q֎ʒ[)Z~fMQPL^1bA6 73E[D).M6[QGYŨ^f#\wt j 1C1-UQWTE (ϱ,:ssy8nsR_b]t/'.\vw>xs#0Eyx]h#ȳQ]<^hsGle|u rP, qvQ@63pkdd$(lh'iDQawV+W-Vܲ.@"~?1ڥ9@^{2'~ʤo|ۑueg(25 S0)eA ֲe2%28x,>Y `STQ`l` ,²W&rΦ2IfnB *SE\eUflD嬪"9k˹hP $Bipe+)X4DdHK93'6M`>"'P\U1WAp:-^%vvzb UpU!T 0@V+#S6f`NwI\  L }b'ѹg%`.k@ Jrl& FVzAK+A$TE(7 }h S{@9a* ffΎV F٠eMY3b$b,:!p\r<4.%ݗcSx0m՟qd|upahٱ#ơ< ݎI}F;,'4LtП{A<dVD PDãE J:IHHѢ'])6\!A"c !e0CtP5ao1b# )ɝQu6#]'[ʰ,鞉47VPϤ/7ƲI!2T(BDȡ RbnV"ANa2 0r2.@΂MH02]_@#:(TH`.,sO{ff|Cgc.vKs} KpOxyܼ߮uS8Z20ZK#lQ愰qxy9u%Gƹ͎#,$E h}CZ<щ `T0)ccK%!Y~)+#+KAS-Xprgj6HA@"bvIRE7Ucm \sPږ r% %wM:,,8h1D@"D@.ņ]mpFiCJӖc,`{t[)AYA]FSUa(8Z`Ňw]A|4JsaNj&9s;1ΐ(̄!QmpI?/ ]NQ@3~@@vȬ}TnuzlKlYyDaCju1B{%*a`}Re֗Sd f5Z@emAб=8kDئaflV'+PBQfš%].9D+WB](n{;<: !V%X):8&+j1azr uIfD[lk,AH8DW!xFc" MpوLh ASS[ o4PKCPXUp4Yc,<≈d^+{ /a<x;l`#:  6z3c~Bʈtti#- X=e汤K%Yc5n1Z"@@6 %;:mo~UHbVFP4.r"k:[CRb3r2i; @&&-DSWdGE`e"FEc ;5,(-paV0ʓc4$lVb dRAnzM)>uxj,ƇKOt]4 8y%OF'K=,lY,$(l3(gUVT#fF;*P]OX#F-9iK! 2XpNd` ,DclW´taP T $8  lILKpTsņڂt' ʔT&RTNP#㌭;ES+c$&` @<)% tM͟#aDxH4X<59)dͬV;"J[yX چ)e(ռ/ VfZ[M0HJF \nP۲7Q,u(jZ+Ugy̹e9Č>/\rIa`.9N$;h`qU/^´_9κPt*-cgv6Fs,M7*OܮG(̰-`'%9D͙k{7FBtDH͌e1@F vHOյJi<մ ' D(.)TEJ52flN KBc0.*Dl(DC0j,l2C  Z*A SU^-P3yk*Tc+6쒔w[lY="goaHt$=|ampIPPI;D*R Lʨs(32tA@lS1S!$L^$XSʀV!&E+ =~6DIe" ɹA;MBX'~$J&GPIUI5Z$dww g IDAT"NrG`ϩä x^m Sx%;S:o$~.}ntצq"ƌ ,N1/h)] νMT9#ͶYs [I %!I(-@XR67NN,BCT]Q=kUilSE"&:ݕ@zc]g9 R^Z+WMoM'~ۢN5WKW\ZVZUu] ,zwOϮ[=osࣝ =r ܺeQp{^|fD*oI@[:kFU-j+%@IHo P-h\x2&Ku1DA^lSFN`%`MkKu4A@% ' ]53{0:y{sͩ&5x,PqξB/ 00Ȕ\n%L"]c+0.}u0E͝3cngKzu*u:Ƣ wSYA\wA@ śQ(ﭪOdF4Zd{ 0HoR5j6 49ϔ܄8 7u:]k-Sـ ݿg.剉jNH(S&oBWz)EX{J'[NMc YNmD藱hfI0vfkS MQ]N Bߒ!y ^h%x?0QxA˄ϭX8]v/Ruj~y.\zsZ"*l4HH  s7GL٩ )FZߤmJB\ _!7@ʹoizeRW:~i&BOamW3gmJXn"4P=DSN&$kɌpAKқ{/EnPMS1@ʼmIYD `,XRCf% 23.%oU~;Jd|(]`FꕯwIbh.O(],UJ6xm/0zvUS. %h-AnA`챵g'P~eQURCK Ο*"eGvZ  .(oЉn`ܪl oђlA7+\[g͊$7+]W|Yb,eν/A_اa X0=2 ^bqZ}y'$\T4㗠.#ȈQ۞j%F{\_vCR BRZՓ4vc{n=+o4%5 6Yl]ڬJ4CUqE" * C q}\R<"bx{ @%i0QğO _NC{~hwj$l)9s 2 tQP-Vq7fRɅ_!3*\Ţ7T2ƯɂSmR]) (U(Eg=׳Fe}?o)Fʍ| !ŅHơ2@Yv94\oT1š;$&Rjo4Kv#L(Ը "|FRfЎ 9 "A5g{:]H|e SI;GQਓc@ƌeAulX\F[3j B8 7Jtj.UCi H@j3t7&xd0}/s *QlKJf<\Y!)\O68wS"dX߶ɔT/FzA>"ug +fSܪbe] 2Ҭ12yM1)m>b KWSĐĮ(@/7$AP+G;(KBmݑm.w%&k ^8>^%XLOe W<25١ ˬdR>'RŇ ?(d8 yH ~0ӞA&N5P䎡+DzVN(pWh^-t`vP VUm.[!qRN7r!u7֩=b|\jV&t..½- Ya8&TUadJVf#G?:> 憳e9h̉hvˋ,OFr뻄GiPIa]/FWDx7K@*9280U 䡰wKo\_Xo(ۊ.[fVeByd@,dubG:4ϣ5)y1^HKg=3*B]1DF/R_qd[p R$l^ʦ.bT{lʵ|~[.WR&j\?9C7L(y. ?^V w0$]<}BLY+-IIV^fFeO]xdS W %^D*“̮Pk٤zoW=X.9+  Z%#MA{] dsSNl^AF:_5H6u9jWriϐB >j*) J$Fl HMY$& -rCQp,GAiRDtL`"ũGjn:(:aE:Szу8*%%u- lf)`xXs *F:}+Dc`v~-ԍո&VK¶j6TfYGE$#kH!SjY}"ܐ^`n3=&X5(z@JwoZb*OAKekUޢ*"dYho֌wbɾC&&VmC&ƚ@`73GRYUFV!PmP7:wV GAjv+?a bSaloO=RB7tOc(:i9zXl6њdd40TN ս{ 9jObo>^G҈ebZb)Y8+\Wi6x䛓(D<;Ρ%v-~&&~v#*b{z aGۂcBewMc'X-IЯGh[{ RPD\dN|zνT `@hEXU#+ژxLKvEtI#|hI }utU~VD$7@= &:`2SD;O:M=lDil:BY&ci)]XZ0)P`!HujLŋVMvbTihW=;ydJi5\Yd>]x̞Mp$ɕY+#vw8NMxJS [T%Xj)is ٙ 5}/1 Ab9=ܞ$pK ۂh,XL=-Pa~ҭGnY~)zw~7։s}' #^ +VEz#mpHV2~#g0e{uIB%/;Oz[QD5UDr=ed:+|XѺl܌M"^{9riqqn[hUNʜ9#)Ɏ1 /+Y7}D$7g=2_dWV/\*:{h/@ĸ?\*QmH }%/D0qWR?RFOl%AS؊aN@>5hϪy[Eu@YUHﻡ$(y}S}BĄi/"5]ڨkIHUYUD j]HY8b;ժr>$yFd?Q"UxjޅNѯ<3aCw䎵$n,lUJ4KM/νYMQNWv︺(H?['g'7_J*zM!a(Eġf#$I ?ժAZ}$P3#*[Byׇ Z vKx #BLb07B2H~Ҥhȓ(/H^:ޫiJ2ǻ,S˲[F?/?Izj,m 7c ̓2CwT஫ pGӾo30h֊ &|^Q "uAr#n%W!%Jm"[PrZ%Ͼ\Opn+QvTS&sz>5!-7, UiZp'1Е;K~VUrIDq5Kw.k(-jfdB\%Yiw#W]4跨tmv#XsU–q(”.iJ>C qriڂU4FK2`$2oBȅed[ WMc QqA_\\`>`Ӵ5/?c kTvT:Z -oYRVcWKs w ^(3!9#٫56fWW<*cڃjOrYՠ;2\N3%m rDl6?025/*p,d0a͆Q-CDڧOD U&. 54n(%YUş^Fdy^3瑱O[lm,UU cI[Z~~H=n,xfE14u0fK^\,1.I^I\)f-.0,{WԛhpZl}Z*?AϴX$WQeE'<)3P枪]J;!ҽ4y WCJڙ;$u(jjMf$#$L[ܻ}zz¼SekuOZOҒ+'!W$Wyc3U`ZlqZ˜Y傌5cl3Տ7<1ԷNHֳ*kt B\twdanܵI=GS( P;{kn̗nD Y-4RkMʊdPaT=b>浴c1)l{OTze93\Ks1"f&`-z|aց@XbY+{us5js@n)ȂB.rMG>> +¥;x?Oɡ1Y6S`¬#h׳ aZFl2| Y)CGhTC7I.OD@,g1lz:z#&4օb|^#'h-SX,d{JbqLHz?}HNI%x*(?t]ˈ>;)gnGG280B%1DC$}W)H ^&U2i\⧮'}z`JA}67J֐R=C~8mۅ}2Rs2F>M"wīEZwQvGjV7qG%nuVndhaTHv*A˯5Q0%ke7J&fZ(Vs0@ n`z&`9wlZGVV-.˟=KZK'C;fK\31ga()eGY~;)kJVØר*k=cK٘Lؕ@JC%KY']OD(ȹ8\N-5@C]3bs<#,o:,)x]oSTi1Q MBtGW^*ei!YB߀I1!#4Ni ݖ:utޅ}%#lO\t.j3Qu4cܐS;O#πNxFx= l.y r 09C-%y>g&z1a`j6d.˗7!eN+uE֕o393xP!k'rF#t駻 !P iobH@*s4^PICL,,N]6r6ʫDIu個 7rJWƼ1 Y{"a0򢈪4sh27IV,:o_W! (IO\5̺kI$DOrJPЪ/KZҁf'u@'?l ?. K|R9{WAaP%y=>jUb<{Ken_̐*r (Wt#6;bwfYuqw{N؊~gb'/S;7`FMDNv$,$; E?o6#UEo|E%}µT ;KeTc~J<&D^ 5%?#`L^zU]*unS.w'GpE\ԠP./0#@s4_/ghprKGw?F߰E&*z6֬zN O.˜K~TRl9Բw 8"a#pXde(y)zX}GON$vr$&x09,dG#E^PkԢvEQf+[Uڋh6q"s{Lϋ(ݹ_CCƚ+˭ Ò7y,CN/%5Y2Sc3(44+ IDATVSBD!ܗKbDq\x0"آ]ORpDvKO-:S.$5륏ڴCԦ>(L%cGzt +"̸B M:[[UkUV=$& cSY(UccXjahX; u͛ -'34Q9jiieTJ3oN^O?gŪ@eƏQofi @_0~(y1`:ajXJC3Qd-+9N E xрte*t^Q{D|!IR"wE$Ev2L CBb[^Lܸ&&ȥ9I>.pbܝ^Hc\"WvOC}:s፥cZ]ORK YZ CS#5 B6yY(P\ PU~K;_+qQvIc`^x>b v;̸ITeb낛AjYV~)J.hĐ ._R^OD~ԆNn4v ,A4mY@>zY\32Cfq]#K dϑegSQ.WT ɡX,$KTR }c 횮/F&J64LY[Huu kzdA&y7B[/rU"SZf{H3=OڬwI#PD²UQI Rg(gQǮ:Lbg{/pm6gyRۀRjوZz#Icg:Qec;kT|/J=@c5T]5>pY6^91sEϚ͟p0FW1@ 11Ø)@OUD';3s,J-"q)t:-!WJJ(AuptNp"i]UGsI RJO&M^L5jM"$yeVj$;^x*GH3Gy9H_*^ ;FUEnp"-/4x$Y3+)ne9;ޯr+kR!QMHC^n6-u&2%D|tyE}ևə-@gu{]j,:’ =Dl qQt/_mԇ %w5kj^ 1eD+I8 Qgq./y)tH8Z0/*U@ [8:Wk!! 2kriYOs2&b!Qʺ{ m)4[qv,[!a.x p?Jᾞ>/{A٤Zy5+IUl#v]?T f7P|TQrm`>E~aRoVAW")W6wsAcwe1+Np24}D`!PzO&Ǘ%5;SOn^ $E<4H7yzDj0'wCf'>-ÿpʙf^= D_'LOnϙS(׬ I',NZ~GDg'$ 0@zr 7 _%woO -̢j{|w+"ِzEUV &w5Zb+oXƃHU wE'gu"OPRday hzV-^,V[E \[''~\k6 Y U'OLIIH8 l<G&9Y&*)MPS$3 !,JKMNB-I˂K&f"V=(8N^/#pSkB.l#@G-S%=!4i<d5+R"&$$a WG%}})fgrW4H V"߀636%Y3ax_CM1Ago@/ڞừ!G}J޻lɚ%yf)čĭ)--Is^@sM4:MY]Sݧ $Ԫ>c dףls.?fT!rd.t?(B@%QUN:me3+0KF;tkooDjO%Lُm9|UJez|䛢)7aVN" SGƺ3#vzY tK ba{A+wwZLX(fV^+$k1eJ''ȁVg̯1Y خ'3|aj#0 N|YKue0FΔCfm3'HP*cB#jk|J2)_.@d2k$v,5Pk LX͜sX\Y=rIa2ىl'7|/?I6"#0aZ*.DFi7l0Ӓ=W> tq8dU~&Be :>Օr:q?~?xy5WG h$ǚO'n7W'l.Q2gH(A7Y# ʰm3qQ=YNzF{:sui/yqj5O,_wɳW*=Kؔg5RI vXJ1 |̹^wL=4%  X6SU+Iv\>I7r9\X}h  / W.p=$Em0/w$z72Q%c=յ^GBM~jϲqOZ*럿3\!dݸ"=- jTq9Fَ #6{Z7"&9݀GTC_qH-N^̄/bR$&>J#|RZh'GN zlBukGh}aQϮ~q4+EL{c;kƶ5%b9ci%u shX9Lr:4NޭBI %Ū:s*t%oRW-vZE¡f 0l8b g;th6HE#%`=mǡx4;jnz7 U%Ԯ˨~ž%7扗Mد䣥g *=eb:(L3U`uZb #v簌"szGZ.WdK_<:UE3hEFItLoBⳲnmy#Å= =hXѭ e>"ú;n贍S|3O/]w*"x Z \~@gV+?"vz|TIs:daamwБ-ݔZŹ%AgvG"BX`KU(Iiǖ&(L)oUk株aE"bD&A5Xv?E('/*μ2gYw@ t1ƌջGHh-zQ{ ?Q%PV kW6>AI'˙F=ǮvŸ%gmgZϋ1TnɧV᫖}&Kw  \aSa_)ExqrݷU A:0Nܣt,C:ʖd6֎(%Exi&r=sGʜYWF B;:i~O`6hIҥSEHCy;-L${F)*9fxR=}ca|inL6:-;ɋ~]z˧.̢G qk1ՉAՂF(4g?~Zlr::/* {=|t%%qMB 'J}=R\#U*re<5{=RK+ M~$-EAmIB+qu`%`m/ Dg:8ŒU$t 'H.-nX=si{R^/NBeF iN ^4jf߀VVjtssGE0ةgWtYb9G7ѫ&D7ROTczም!˻G lA `S 8tfuz3~0YIʜF}%ICmUA<ȟv-Z[qZ۠GBU,!R(G! vfs'LdaDU&lehа|ݢć+-(ԋ,*j[)%W-R]I'AVih"Vw* YirsD RiDZT`cyb(ߥ?U:!:\,3PuIɸCU\$ aislw\A}l,宧9sJd֛9tǜJ=PhtgX&Hȱ˻%/tc _Av< u1VVqs"N(-`'F%2fiQ0;9쬲;1nFxzm@λ!&U=u!+OO=p]^ a;-2B7Em[9`.u\ +D-ljAA$UT:#QFRGLw[*=:!'_ Ne]} b T5YE}vwU8)b挗pm #xCF$,w  `= <9!dO%}c|f cO:DEFmTXGyEn9?7 =G u`}7JWœo}B \泆Hsט1|B9dge2kcSJӓx(kEnUz}Z!:{$C-Ikyaf qAP՞0nNu"j{dF{oaȥJ32X0; j1UViް~sA]BLJO0aӏ.pUY]K;Y@9\UEZ*Ql}9 Q` џ4mL\R5ahp%V @Icf?'yG+ iyVw!XrSKn,/4̡jdڈK,w#vBdU,))J ~W]ox #TF"Uppsd鉁#?L$HAbVJTaVyGd\fx/B=xIn"lDK]Gԍ.T5 uVt ["X+6Ŭ*/8l$1,QE|O n*䵒 4U+/Z@&$ܝ̂0r5w辸Zp%hzX7 yh5D)TdtQ\(Vn$ rm, rvdvqP=\%223g>?xfQG.bEbXH ?6 ^LNqƭhWo "#yF. }`Xh #fs Ū++l"8,x{dAҟK2Y׶lsg`!J\e'pwzf9'jQb-4AEKQl>~AIў1g؃p|pLebw%(͘Ӳ/>lLz7Is&j![%{$0B&.a0ʨ"*N?f+XʼnU\&dI=&;_&%AuT4"v& ⺐bhq=9&<ΕD~,6J1.\U2nHM\fcj*Krf pjRș>r]IY57@mUQ́Q]-JV}QH7?Av0wW$>3#K>< m_1h!>_3,6 ٵ \=4LCO^u٥aץɛD{OGfҺ$pLj7WÂ]ƫV}ݘNV:'6([>1Lκ^4p mhVR4}%Wq!Ofj[RZݧҥvbK.?" DN<`i܅hN+}\#\Sj]+>KiͫgCibO6DBvpې6Wwcjo[l2ظ-Oz%T*.vf>kp^3K\`h뙍$!z=olz:d*4S3*[#lh ,>[Uh ZZ. +Y@_,֖o,^E.Zr0@S{r>ԣzÄއ[S$qs;O?J099Tp/'¸ &c`GԞ"糷oՂh!T!q~SIYgA?:S*R<IJC& mxf2>*׫/9قM~RCgET (uf^/]t|h*SDN̷j0Tyb͓uAԃO9җwZ|lj#B߃'.Pylq%}ߢX*-8w!úHa% ߬^w-T.m{܆; X6~J帱ílLIU8^HM҃Z RIM"rB9SAefgXSxuL]v=(WkEBvO~2m=ۧ2TmažʬȪR2d⠫ŷy WT]M\ik#Hڡ8U\Ug(xxsғfB(˩7\+⣅u:2ԢAe_[ѤA]ߠf!XIRr}x9$Bdu,kZ1yU(߳U<Ov[.>?-wG ~>?w=m_%o_Sgnz?_^k>-|o }H3 1$9s}rb F(8,=ݮDH{8ı")wE)8sy7$B|>.܎90s{® TvMwAWiܨ);a\ys=OY2 Te$)7Ƶ$+V9.%N"'ʈ ѠcFN,ĨAOu3QVf3xaz0٘\ jq]F6o3dg)\\]Ahf[fƽwuYpͶW,7w6G?Egs\Wï?d__;žeг 7eӘŃHix6]\\"{̪]Vثr K95r};ȻgOFtx`0C` KE_#`4=~UԼO13,e[u2Gm#zO ҮYN[;:"%h|8Q"ɮj*{ CfeM* E `Tl @9~k Iu O/\`~Pþx/W` GOJke9/>%yI%ޡ2kɋ&{Hr`mKI*1U1 e Pu[#GWwg'?7#gׇ{iK`@; );4$Ī])ViKQX_Tc oV n7I˘.H{dޘz}X4(Zg+9,J)ǗT/]fB&V"DGkb%$*fx Ü9|FEԵ.CJP@FKm媀j]Es-w~e_k?*0=&~H o~]9 o^_ q__Yg/-}YK#^Wh[䠊xWU3ao|Ҁ$ !Jwqga#q7;MZֵ &-ِmcAīٷaή 80@ #CJ<~߸qv-*!yA;qLoYءwå{^u{"4Qf?&x3om/rr ROl {K54Lrl\Oxic2HVoSK ?^" yٵ{k`Fjm`5m,O5?Ҷu a?=篖ƟU`xh>7~MB'K?`/W~4^g3x߼EjtWZJuȲr. PD[j.P$v$Qsz{Н P,GD**bq+`UTaˏ,"!&vLTλK\5YhbKf*rdo6*Nc' xXG n9?X2'cQ,]TJ"zGA:T GנcWav[;tl<)^4LHիLNfiKxʺ47\dFH8"~_UY`;G_|[|YQ-l(0_'W`)0oC ?-(j LvQ5N*S'U&oXs<"nl3Jhc3@ZdA6hbAc*RqFdZגvc0M=A %jB" Mky.l_ڙUaw^$?{^u_*}QtO)0?>"[.wV`~l,]q$GH+X5ٛr3c#}M倚m@ =$-pQXXٕ"lQCf0i%|XI0du_/zi#uױV_j`mM"(0MY\dR -Y]pk0['dkNj#rZ&(D~$J;"1?'w Wb0#V;PP\bLݘۭ!L,T].H٥hynv'Z!B2U&Xd;p ĞMDG|_p%wQ`~ zY_q?mg?|?|q~$g1,j41@VfN,G@^ѮgEzkrf󴱳b#562^6 9>wN4*T 4<;Sw0%WhYO ̄&8Hr}Ld{$J90xU&>0B7B Y(ҵ>1&yfOf5dPj ɕd$~3&֦1LX4j@,^߇lWtZD `{Qa ፙeb]2!͐}.ح@nf T_(S1~]WZ{{lk5ؖlS'q& Ą@3M( ]W)P E(T"@8N ˒eɲdz{^ǹOzOzdOwsk-+ c7"!iJ!oY#dPh*1 (фo\v)΂3I(̋ãY9(P2eu  /&)EtJKߐ24xlA bUU`U0DLz :H(:Aś pbD w0W _Ȗ0E]U#- h ҹWYPkЬ JfFҽ]&K`@itT҆ak46/4F̶v!F0%JNK1orO9|J `.9й*:4cGYY!|Ln\p϶\o@9 i6DQKiIv) +$J , d]G$u\NP1` *kj,) -!4!`&ɕ(T0*Ә$RB# IDATo\c5n| Q)@s"K2 2V)Z4[Zp&YL% Hᛠ h. Mo{!* (7,FoM$\(HpSyiB1QH,!B7g:J1 f4OCF}506)*jܡlupK%Aq{&D:c4i,@,q?ztgu|Ưyqytr̢qh<%VfrA2ͧu4oREҽWJ)kC+MKY (RhI~L +Ϩ2IrEm" iY#yEHTe"\fք1 Wˣ2LkK:$MTMee, D[ZnYj J ɚT @+}Śl:f,D`Yiij}tfGSE4mG6`K ZAXg4*A *g4DNوUD̛*5 YL b! ֤a0*hJ0476&PWKh\Y M׺>+?ӁgӿxZ9jά<389~ΐldɦft7>%lfS񔦦Rԛpڭ8 a`69tccVTY-U(mdmsxh*ya^`46k61o"h|%忱sh!$65+M r#VHg Da'kFؐ TJL9R$Дa~f50Ê?Zxn\A1<;9v20v-/xmXxdcfg}rΗ'S]  f4 !IJei' 9R5VHk0q7D@Ff(0$UEW, it3V1 ҼA!qԊYXd"T2LXQ kF4T  EWuR/wfojljB 63"Q< 0؈$pRBiДyiR62CK.eEI6Nc Րrjt0T˜)e*30-cᣢ8hzda,4K8k[֠K&}Դ}z%S̞410+afaE M2`.-Zdي ;l.ZtO 'Xh},tXq_+N9rp˛ f֟睟:Q'-\r+.ZԹY y+.3>Dzb٦[.{7\}eNyӶ500IgD(- eGDb! >NI@HTV˴1-,3&Fe꒑:KbM#3C"=*O%5PYhI6^쁁]i>*r3QHdIXv@F;%F`0M2GV,E*0F * L }QWU5;/5 ٛ1rT,p]DCX0`#Z޸#@RwHd1d &!]̅5, Bٻh#Jo&NXD_h 1f.$3]W:`1XjJ@5/08shPyr˿|;0yo;5kۏoZw`g=}э??E~71#'bwO_]pU/rr .жg9:{c:s-v !E_w>?۱$Tꂟfru㭯YzbZ#z&7!@3$.lQJ# 7dR2ej1OLl\HU69ˮfJ2dQ+t*EVYDCJm}RK[#a  soRZV;x*aZ Eh3EePSJHRh$9-T"d &geg@jlY)LP(f̔M 8j-JsD+Zn$%dJj#mJa,ݲG$M.PR!#&LpIj 4¤h$/Q{u ꮭQy5PMђKF9 OubܜӢtRÚFaDab1gƳ9OgsQ&>ߺ>M+W]}b%]`䊕cWNW/.ߴئ?1ݡ.}c8]=UfN8fx{ gw߿-X:b_xu̯;VsԴK6|믾≏}wxVr}/~ǫLJ~O=rҬlB} 4a*ijp< e!")o2L#f$u%T2ְܻ .RIw2\7ach쬥8E6IAd-ENC4]ƺ Bo.:&9pMS1/!3 lj;YPմ^&d5ƃ:}[SMPR=ӅZ+-66g),%AD'BV"{ҨCI3FKl) ;Eb PXJGYŸ)?QSN:{rUNYy3 YVU%gBl 27oNs8\. p<}+.[f;MWھW]y?;}5W'} vǶsux]vκ7={?\`Y󚗽E{~O/ƶ~Xcmlm?_vś7^/X 1F75 JUSQc4/.(NXf539F&:Z40$Vbjc5PJ%uuj̨ՋUPpP)Bt%֪{ P\@822@dn|kAɏ꟧ǺgKv׬lӪAkc]dS+ݸS;/[ O4>Znsq&eb._; +/_nݢ '3lhꍫ֮[Ԁѩn G?rK,32uFqœ.Oiw=q| x(gUl<_vef eompJR[{+#Qb%433iV"-7׬FE s& "Z[Ab$)3!#ԼE0M&5yYH0*h uX&lFkk'BŚ$22L3KUEi֧qd]u4I@sT@))tP %GO@JzѢ,K@y$.2Aiy&C$o+ά n6b#G6NK6&S+T:La55i(J+ŰKnVdY]8@fzM"lo{()v#^jnsbZ=Qb'_C}u70@S{?LJw?}/[q:Xu{ktħkKwv-@,;~?џO|Û^x2}}=3oȂ_#{{>m[zowҩ/'9k;_y?`7ko:t{~byw~]|jR\8֬fӂ_UNސe[^v"|S_$/Z,+}f$31Fݩ݂{M^߱C;i\-;6'?}c/hjI10$F]GKQ|UI K*{WŪ M BJܭ0pRri(LQ&{P&;H8 ZtP٨q2YD4˰ [,p3O ,V!4rSB&f"LAtXʲzLT ~"լQjl F+A z_PHj3aT h6DbHgY,@2*sۊ.j{",mKd-J#*Eƨ&Σ^h$yY[VhȠ+LP=hz0 P"I48Dy6$qa-LoY|խo?ݿ{ؿK7ŝw~O׬^vu<\y{|`K.jyds%_?q>xq}ͿuU_}}|7^(|bGXnz;Y ~Oe_y`_5_|ˎ_+o޼W/ÇK['noK^a:\u ~|GͺcW\'/XxnM/>f.Y ]z_ >|+\|W}ז_=jvUHOC39IC; IԃL+3(B !oB1M^I'M`T鴨ѹ uͰTT06zc-ni4i 34p`5 P8p͋N@j:-n2J}fm IxUoUfeo@@2"Ull1$!fh1p5$Ⱦ؈=dz0n2%$3)1G<ٙ2Kf9ܙ4QhtT+CViԙzhDdID \hj^-yh!ZЅD߱dn #8@4~,@< =M 1+tLr)԰idR-(v+S5l/'ȱ}`V/Y|8$8ct++Н{n^k&?޴nTzbs9Ƕ4hΏ=-7lXvL[6,ԡmQ/0}aCozɫ^|K_}uxv06Gw/h[oWwٶЖkpGWY끻߾vzhkXrͺu;w 7<;si : /(쎿;ͺ\[Ε#>:CH?-xuQPc:h)zi :R JYdaVbv Y:P!o}dy9f[IJ$*A)ڼa2`Q!/@cl Y&U}$$3JOa2UҒޢ{!H)Sf H dQfB7LZ%e6.L2pXhY0f&Li,a3td$"EeF"z=a)N0"m bUEQr cTjxA10yJMp3iMBЫo+mRֱ0IGBf%@6Vew.5Lex`ϝuy|6:s?sph|jǣ{[nrzź}6b]۞%W쒅@Ynrz=sϮgFfyt1lrP]qZSgl?3|qu^^j#Gxu享{yx?/fXr4~݇tv0hْ#-_Q<%<]~>g3^n1-2;>|W>_7mwh Sz/3P'Y:CVJRT礪U aeņ"& ]2AHUELn" sSJScR eT}23YUS`f*M8Q+I|Qa)tf .T[ XMg,!/$y`X$YVhY :X)=DYBUv=zҳXA:=&XSc)0*BiLT39IG2ֳ2M)%C IDAT@ g/(>晲:8fp7pCf% fi($ H(!EA7kIHܬ ѐV8\`ya_+ztNuxO6.ٰiUsv{뱉 ][id=ȃ8[6wA4.2(fSJhZOޱXՋ^~;{ /dz?lOvq cZ^=Wg5Oq>Cp2%jLrce5-sG F@Ps\d5d N# C@ѝBM0@F}h)&넄J E\n$$fpBxq8H&ȆP@H Z# #{dY 9qMi'R Hb i]@OLGA!"FTDUllTCdVT5cMgS^I. Q.%Ȁ67n1*ehLD^-XCr:>Vb,&H<3ޢ1%%&dFf(i h& >Rc1CF5m+4+jRtK0FD498D Yz7rsNyqóY}9G3K?V&*LANBd*bM%Ez:ieM@aL/Ӑ 0/&TnB:)49޵ iGZhؙkS zܜD&REt@1% 6dI꺎]'H+Ax(RȀ,F³ x4'@LLPfe 1gts~g2Sd9l^v3;6>$g^,򥛮ڰr1F iG9NqTSg32A>y2z`MC; yulƦO(h2fu$IvE} !-R vIb`f2x 6gUqEn$&tN qFhHc!l!3ΚIC IN tQFfP䙐 g kw%F{t,anR0%jVN%BF+.CRUiQJjdV厩^Q, cuZiRL:)2a`>BRYJy7e y`d:¬x d$XB6.4';qz|?/ٞtRxɺ`/z=:Ê.}і/恭;1ipO|怺կ6pqb7 '?\ou8l]RG>OF>=G'oyƋ>zǾL;w>ּ\|pٴm_R?;lM'wHŢ6\5{%+oW޸z^K~' 3'7ϕ-{VNamh5/bebⷀ=L#! }̀ %ȮR Mʠ rB9hIGX ьL* +%E= )e4Kc]ʠuM̘FM[%if@PLژ ֒vn7H' dB(5)hΪ`*bM%R,";VUԌZ¬Y7e!#4N:3n G]Q[I$Yb{MKŝ$Qi,Kof)GcR2c%} Bi=F v YisJ3ZD vV╜5|˗?vC<}m=|%C>[.sBNtʖ_ʷ?v`ox7'v_rXzlçկg_g?u/͛~?yE]/>:_s뵯dww8rYroE嫗ٸtQػsl~MWt}pG?so{e_v?` z;Wg1tmtk?7~xw}K/\(y;R(!+^3:3 . ,GG6 e\YZbRܒ̖DRc셄YDKm.!+YS Ҩuhir^\DiO2Q, ݡu^~qfy@.-#Aź"$}%1u AD5NJLM T"($ӃdVsCnH}O7,d CNd'2E*1ێM7L*bVOE&XP#haP2E,1,ŘQ%OUvL 0fdfZ3A?!W֨U((afFǺ2Yt-{:絝 Su_%b-<J~ 82GӀv+V_<ؽxf\gThٲ՗.yj᣽N6b iFbMhn֦Ih{/J) f \?g}:xlq`GF#lw4̼-]p2T Ou5Zw֏{5Љ}rrfegtsaEV C0 AW+@}QYCq +2P4-Rc$G#VtI5?BVUi!t%zbL48G@mÑM6Pl%&EePŒ) 7Jd 5 qA"H4_RjVս~Ȋ̛Q]->p?ylf8Iߊ<ېVpZ<<&\2slVi?!=7dFJH`i e|v&$Ijoy$oĻ[BWګte$kN.&q*vg-&9v9eIG@oTsҗQ|SƯ+V/G^~?ه| }O^</a_!?_}h\8 f޽C aU ^Cڥ7"f7L /Y[Na\G(*dy6FQ~  AbQ$uPIT؝c,z6]AB!0TX 򂶪*@҅Zw| evG'-:h^,'[ "3lO3gl!Wv01B[ r=ů<żQs R#C (Z%T{m:aEDOՓ8 f]irABD*`4Zא* iG#uT: H`On2x $8Eh!;>7|C >4C}xz5ɫ2*|"8=#?`?'3>`χPy2'_̟%|_tx~_emf'_ՇފpS$C[#Ɍ  ñ(pZ8HIRuPOgg@njs eHiAb먍- }JR&i;U4Zp|@N_\*p@v`N  sfh>8:҃8U OXmJ2*ja1sʷ-2ZH <-b4b qcVjE@U`JHv;E;۰9cֈb3VWs]daAlRp M"E[ji`,lP4qy#f43E9OlO=?dϿyQn@ rE6n>{ҡ#Xz5ŰۻVpIϝ<Ń p37DB `jPjE7$ŽF8"+;%a^+@&*uZdnk mV$$y(ζ?zE?Ld?.F g~\ >'caoۣD'x#V7%TM$è":n+)j"O!M~T%9ZCSHDcE#nm돝HfM`:Hw3S܃*%};VÄ0 IZO%4i\- ܬ `n:$!CKjʣv &ͿOTU|HշZkF21 mTZTu!$Bj lFLeUe(Jnex%RaZ,@3kJ`sS/8^W) Xg5YGQŝ @2~>+_?ϸC>|z=N˷U>?wo=o~ϟ?}xъ>{ݞW>i>?ǻ/{ǿ[՗ Eb(aA6FjbVzAK1WxA W$nQnL1j7òV/?RNyS`[n@ɂgSd 3p%CUJPWTO'6YǚaOϱ=@TG!؅ZG?O4OE8uZ 4rU20u(T$4F\\R*4#騽inbgl=)7xunֱ]qY- X6)#%Z84H0¸K=gD~Ï`9}:<|ɋ7^G!80y?{=łc맏8)ܮwcE3 ̬ Â4@= Gsv4#UZĆC \♱vLG &b%'OL5 ]y.& Ą*V ǿ]**p3U7$21ze5t:=p]KuP3$JEAXEn}bؑyXqƀ}YU地ݺF[. Uhf!ɥ 0vzy-5MBS% ), -0MJK U;?|yo/BO0B>x-'ƜoJk~/nz^51^#ݕ Wa"d}IabqN]%juԸa0 TRlO3rhq8L<"gP)yPfQ0j'MmN(IvQ\C#+V]`A$E7o@b#mldU7Ƹ'[#@}NV]_To`gZ~ƬfRv aEhu*3%6TQ~bۆ-pӠР+>pxT\߿[p˷F?,_j<<:C9dpth u eq^x t]z6 'B ҭVmX Q*xFAzLJ%Tl^L+$\BUZw] ԥfU` S#'j ۯ$~o?FϘD7X\$Ư|=‹ /^ EF"y@|:yLˇ^|iNjx3׽{~|^л|{?m>|^L _e) C]t;}jtAT*-"P$7J c骺4uZVt E3O: slX9>x*4$53"F8;<8#̋y+<կ?/앏<>{?[W_#cQO<5t20w:̌$V'Z zaXg5"k*ڐ\ aB]tb UFjr(BR)ƃrM*EF%)"a<+`X 7צ@=Sr`:qO.P`[;+vsut9EoUr (.u,JSBU `qwdV͎V[E %"čC }r/fl5,.p;Id-VI"0Rup"E( Rj<$tF+nA`~htf.O廯w'0{6KJZ=HQx2kAV,Z~zWH窉.ń+T<@uL bOvA~*`௔`#!/ 2C+0UGsNt#zଌ;=RQr%BJH# <^e(M1<:1kKB|ۺm-qeXuXmܫ96UU :pQ8*URpbqoov!0R. ŞQx/$/jJbGWu59њL[873ZMpzu0cpy,͢/8\xU.u.F*<@̕ƅdDo/us{a)!|:Ҽ0Ayߏ̋j>/ =Zoa 68zX5Đ,M~]Lډc2Q !6<1d$P&F(#Db 0ZSSr˾KT'5~'D!tTCV%GX d4HE evW)^ ,* ZgHU1DRb'R54FJ"M".TQMBz2a\B\mPyƪ#`B᥉ktl0>4Rc!gb] rNhpnbQa}vr^f69 _33_l' 0<</oBγ yo?b#o)M>9S0&INb؃Ml9ݩZ`Ԋ ^:qv:055Th{AyG8)#C*jřI]QAHDMh@ M(k[..mlPLhK `K[^"pnd7 \__s >psq5rGN7ʷ{8hP F,l }j )["z -ZQ1ЈAwLphV&W4&:) 7k C%W {;G.tԤԥA%-Bہ"pF*>r]؁%ᦽ- Fz7Q .\.;ེM,"P ґƪ$ٵ c`"fMJ U-흉.,}n u,+:i'{(3ȦF^;oSl7yfYa֟ EIUlQ,3` xեcLx"XHPma1T.$('+MFWII3PAz Y{XEʥ[GF0k6 *;=N#:  tx\j]BRF7DvrP `ad5$: zP=8 Nl=ge ݇f&FLhDsa%h\\z G"G19:Jf;< vn/iU&N|(mV?!{r;zS6֛O$&Zq(2TmSY A0Rby8pe5jp[IXH PAκ-MsAZ"sM9N),8fؚV۱,Y0bXA4rAqOaCi "T@Lh&*K Wz@]YR0NʅփĞΞgŴ* 1ukٗh+3C:Y6EUaR(h-nE4O.-B!&(4 dPЈp k*R5C%xAI<9@ I$ڡf \TEhA!\h4f]\` 1uQXE8Sj/O+\NJ%qqM?/ {&B7qIPI:9ܲ쎕nY6"lw$zى@l {0l62zY1pѳP5 @+2ez"0G: ݬ@96,0u4q lFbUJ`kU4|S1ߖI1t ,o)&0JMJjb*HPXIbw:6(gi IB&vYM sgzTP:;9.w(owBx bݼ_8fTu;]i*K_i9S,Eܽ닲< RL]7ަuZI܉lכІ_"#(oR*`&F6Xp#Fx!\Eb#Z!5d&726[Ue[!HyޢtꚰWG SAۚ ,Du @ڰVO0;!p_D2fߛ8sMN Itr.RXЀtZ(DϐXk "Ut5-xxp pifqՓL*J]u&z`+! 8Η4C*vUq";[*VO7Y>w[=A YzfÜ/({OK{>ds*7rH #ZcJҹn S6x&I{P.<[T_wEf+>=u[j !>vyπ\ [FG<%灤)nUX љǔaI~d@ ]* y",2h6gMr~NIBYn T&&Z,Eb])Z,_h5?eDJ@id4V.u\U8K^1@、".jefґnm6Ձɵ-}׵o]ک}gۑ++I6UFxpXt[ʍMU\ݧ}2x~u?umW/?z߷ m2_aW/%DX.X&XBo#UWTξ..ɝK@+h2H Ѯ4 rږ z/gQrM7mq LUnS=TMwM$uZ,TI`ɕS=z˄9)&Њ L}*;UL؃2x*j S_RN5%xdX2A HvS9FQ+A"?0U+Ѐժ$&B 锼fAlP `r᰺Fa_jX:Uivk n:$] ۳؜{9jW ܣR YB v!P#W*2}pBZ ,pl@/4SLuCе欃2E|@#cGr4Ց7|y Q'F{ +$ņ%O 4ԨBpұFBMahHŗC؀ZkY(@-XҠ])+/#'2 ]* I7Vg(>ފEհY>ə9RjnR1zkUBϙ=WScNU.\Wp{ЁwA({ `[Lnպ8'X-5xD֑PS˫WX>;UH0Iɿ0(-]uonq:*CQUZu\ap֤ GԻ,ْ$ajy@B22Na^, +{?vLxVQ 8=#/>7 ϯyAbG+̢١:p򾗖ج)kַc{9da\4ߛb3]I)q+"SV/aX$I:nޔA@vH=k ZWXO,it8`.4{AUK,kk;U#|z||qY-[t˃= Bln(bW𪊨?%Y[Zw_]VgfYƒE5{ \o];ðɏ+0@3ɚW7so fJ[C|/WzVS)@ al&cK z7P%BZɩ@$nA6eiqtAO5 3]P,?bj٠:KXo+Y&JxYqD!_E$/z'!1O^O,z_e  4c k1cUlup6}fWQw IDAT hx~Nk0!sBF ; z)֊j7M^aRXJ?ynvSjUb@6Ŧ5Gi4!܇5xda<\oW&Q DCYˆ!* l|0dϼOKoA|׿)Oeg^Zb)slCQX%ݫ`,E-/xvT73(u 1A_K̒g.8T٥vRnD5O+9PǼ]dLΎ .;zVEzWqQ_?._..vت.9MKc&͹zqlزl /r܃Itpm{-$G{e&6f$ Z$b# VbydV 9!E#6]e&"8P_2Mޘ~ΨOAH[UwYݩ҄*^OX~JsIZxM]R  k8љxZýŧp]|-9A4ipY5CY?+Mݽ6U_mQr_& H,v;Jbm^ۮE_b7yek4_6L7kqhfi3@Y>> WUQm,~{?<{>=Y|j_媰ɳTz3eݪ:Bj_=U`cՊ 2xjh)An*ϰp8CLBhɜz0'JԌ AxWt"D[cO_:v4hYԔJiv7xF>׏.^b1 ~.쑄CjBϙ뭌0\UcMnc[!QQs(urQ50!Hhw jr Teݞ֒C-{ΠZ'죎yźϽKL럋2.MySͻfQXTR/ț|S U#  q~m!]@.&uյ{g) 1!]\8> X*qvRvQq» }Da1wZ|}kE{1~r/~١zH:`v[@Ү Vk6? 3PttcV]-W'ߣXФ YVع" yBcQe[rfU⦨:_]{&=&W~Q=% 2JQڕw&tp*DX?ߥysUϪ^$㇔w,q]sPEaS_q0hAv,DU \;U][~_m u1~.r\Oh*Zz> *UXctX97tG۳J^LDD _XcJר6Hv(cLCؽ⛷;¸jaz:QF| ^O+p^`2{G8ldshC^0*qObGJ:-Mjl<#As SQp{Ы\Y@ _Y9!@Q_$ꐢ>/S{k^^- }р,GEƻhDV[R Qւze۪;9=O$2#6gȟ8u07d6ńfN~V{oL|T_P,|>x9_'1Ǫcb9BUzMM*%}97UWaKdԕ`]anZ4ӽn ^o!0b% Z(p005)Ͼtnrфr2fXXSFA 0-LY,|i;QPkK)&oT 1u" N2K_[|747?8_XQ`-rB8j78P#`s'Q,uQ{l,T5PYHi"Zp[z1G Sv"ިM)=LJ|E Sby 8Tj^I &s7-8MPGoOM!Cg.:'(zڹiAF8dnB%::S%by =b/rG;F S{!c\X6EI#>? |JJ9~v7qt-|;h{#AzCo86 @<0N&^vUVt $!n;QU&vƢ#h[]YY4nֶYq $B""^5\|׋^orVp:0Js Мgj>=oqO=h;_;b>.+יe.}TÍK9U2 rɻkXF[~gr #s; ^ 37Nm";* .?*nN{Z;#6PS2sn߃" xIz4F. +VmANrߋ߅;e/|/߉or3sf5f.8s-|f@qx?$7(i,_BǺoO~+ >'uM9?qf=  pf7OU)u<1zvڟ ? #٘a,'Ef,Uqƅ x^xIՅ9=ɎGSHIM:{Y _ԏwOK;ȁ5<} zdZY C+QE$p <__@߁k/P–bQ{̖Od%6H' Pyb9+Pܩŗxm< _{][u[ɰ[&<ԩCK_wJEt@J Y`-/bUjjm*`h#]v5qPbN}ۢ,1nwz|D//ħTYT+i.˝!Un,Qcم8u≰Y^[b1E&69Ek(+3zd*_GM cvY *C'6`ӏU?o@]'`SWBIuRXUyt dCl2>pWI~ԉ6.g`bET+xg=Rq+)1F ]CLڌ設Кkxv 5PTr/)Bٖꀣ>ۖ }iqf6,JԕyAӛ=؆]ż/Zd$I{k8"yqި#_dx3XFRBCuEctX$ I?L.AT1qkH^I+$Bq*AVLc`q)b$FYIgGS5Xv1E!2188Dz_⑎y!87G߮]^}wQz.T;#[uf:PJA`I+ά&TAD=fiO簿E>Eű UZ+?@ ECR " cԨh29+q/@M<;yj :_2kRGQLª2 .1Khd׈EJnoKkG'zfW&wC]tLFxcdYuxhwnno^s\c}Dngzj^Cl>ńEsZ 6bہHϦ-8ra#j6 ^&6Yesˬl2ހԋL#jwF7g%4XJ?T/Y,|FK{9満zV {^E'/YϚ/?-N1pSiބ4E}_B`~1U>L^-6mp' ?{nm𲚼sk_C#j"#x L3iuE"! Vq͘{2Ix,vWkkÚ>o??o<߷Wo[KځoV\f1㟝{1ۮ("œ%B֬2h_%zj=E|n3'V`{ψbSx,O!T JB!85\)t`*`g 8d h rjFתJ^]~+AKC_h"[Wlbu;AG` txBš+S闟dp`7vGG¤@w.%ZvAOloqsr9*F`1"do&zNT5ZĘP`We6%M>!R%N>竗cɃ`>3Q&km55w׏v}id.r`z#T6kZbՅ.8P,=t?ӷ/_q i1n*RHlf_N Gh5 vS?{敼xn/ GP RiE=@=rX/_ݭwί7Kh'NK#_n3.WpCԺdZ/VlOv$x0] :Eۀ'v5gM'uϣ/ w76qĄwE3|$&{Zc DyN:s ,y2&,B_zD/˙B%6Յ h4n'w.*At[5 +6Y'-MaWV[0[@ &bT $ҪD\ {]G1F X嶙o$?M{oᚚl{њ&p#MIM&=~9s'30RB3'wwg]Mȏ-X?zxv ־xƂt_a`g~ނS |?XYS}՝ ʯ-틧pԤaq-#MU"D122Uk$p퇠 `IDRW q)_{c۸dnу v\k7ͽJ4\ts='O^3%N?NM0{Kֵސư"Ijq*e_h˟b?a_{ 9y'zCDڸ,"6M1< ^(u+Y2Q/oBՃ&~V TVҜJlu!&O,I1R-J0S?zL0{v} Բ_(u-[^buM8ftBĻ/&\x?8*2 aui, D5Ea\9e @$$']׭NIkY 'I$ LJXw8kǒ1U6s6g 4vu;I 3#v /Vؠk]/6v~ ԷͻFfY \2I!JezW^`/ԙ2vFW v:KûG__[3_v0{gkR|9&E~9#;ij8T~䠚DW 9?P5,p7Dx[^HzU]kH88I0g"= |0>=3ƎYEZ忐'=KE"ۥK- pP;k >ZS+ʶD^dy"VfSJoV0GIMnfu+e2ٕcJ?e8u(T!!a!o1NB`3h׈t#8~ Fn^̣=Qm8U^NءZg ۍ/2\IJE+`rfAϗHJh~7?!f7ɛwߪ׶\+Ee'#wDp@v$*YQ*䛠W' +^- R `L*E̼p;XHo&6o: U6̊mqs XA=)t= )n%yo=@540^F,C :P [N+g^QK~lt l*M<Kuˆ0! ^pG0HB6Ob@Er5%֙mxbkc6bnB=lѫXY>,Aq僪b+l?WlcʒJ? I_EG#GZ5ŅO FZFOfat(\ P"'OZ89}S,#T\9|!S"ORRb9"Ac>PUu@gyz@\Y剶y̚&r!3>rl`(CfÓݜ^XS䦮~`OVg~]WXU9Gf ]jG^)O4#hX1]{h3Z_Rl<~{k Ț2VXMF)(ast/I@ײeUFد:h"݌g I-#VQwrs[q J챔6};ݪM(9I2]o&7G,No$ut. 3f5WS.Jlf:,9*\LL3vaJ =E@酊8&OVӜCG,QhrBryVdSuc Je'$+ ~A_NHٓr ESM=4pεϬtK/~-9EMU^Ӣ1M\ EB* IbR @tL?@d`sVEH ڥ\ ZHJ9 ]\xuτWBZZiV]#X$LC'pS-_ 8hʈF9d{B_ǴUD.kؘg䑔/ }`'&=hrdɓ [1c#ٛBNN!i*1[ bt=C9GlRa 9ݕv,ޡwj<PV\鮮ݗ0D]]+3z>2IFX%`!AQpĥc.+ @GwMĚKF}֐Oz"B}NwjSӭ#OR!HzXl=$LdJ3fh~ Na-GިQ-;TSA.8ӛ5@NaMg״j2Sֳx `E.V6 K \ɬFJN{rѕ$X}jt$w[ߴDXs-Tx":Dy3܅FG(<ٷ1(ކ u3`'nd)/i=DYT ,{`Xj\оZObh>k&7S #2n?4 . Ho\SU\d+ZCU/nz5TeN~ӤD)vL!28Mk0U偦'Q%$= FÓ8 ^;!8,xόmI[U}1@^e9@S5%+=3䚀UF=BM*5Fj:QMNʖY b If2kX+3/Oч9 SKgff0c|H8_S3EB.+kZݘ­Cf1b%CƝ`*bAC],zhѫMBj"G.i v>"|Yqg`>[Y|泽չ;wΟ_}`H a36m4"MWz|o5o#Aq^Ӆ7_/\. i6ڊJwSgvtGQk9b6l__S_/5V-crUD0>ܨ+$Ec}nr>y+8vS)N,k=:v,qwH&8=n2RתXoA n'C؉10d*]"n!2r=juǝ^7 q ʭ T$b-,S?;SCg)QZ#)LsX?*2. 66 EHEM^iUrcf.,q!t+[1 kFE&E@5Ey(4 IDATƷ{J>]y1/ÈS~uprKw }vxcrt;ŗ)ˌd[ 4.#K#93M"'c/􅿕|{Aۋy.b^mD4Ǚ/묝>U`hSnu~\_4ͺ)jy7s9ޭE~hq~QՙLӵԘSKAxs~!5<pѴ!U1Ley%vZXݱJyqO(7uw&1}"Z"<=84VEh0 '9ғU M]-J dBt\woy.b0ɼ ya *i'Zу%8 ɡUWP]  Q59Q,O?}~?}^rw/RLz5.|7!'~n >gxOr)_|kŗF|(&֐0+U KUb|U,Tn_8!ge[K 33%U:+-ހwے n>2vdȎR qQ5b͟ٹlG+ z>~ً Oמr7-̫|̫WB':S-OvQýf1Afөy3a6kQyfsc?7l$ۆ!SBܘ̃M'9)%"Nrpe7zYIU?,ʑo`ͧ|(?|Ww_=>!<~+g"GJ##1K. Bi`Fvp2Ơ6x(D 9$en^K7&7ma\:]zq g3Hf,2@ z xIN vkE8 OG6xuo̪% FxùH0fmZ %}+U7wwPX\`+9S"S1dN곊aar <Ŋ*JupFLhD v -xRTo@Ia5p=3337ĺf.dX2|0?<}Ͽ=n`?X;xc"|·KRɍcqJP,- ɕޚFs-|)gg&lfpkOlq"Nn+guxV9uV ;p]@00@.)"X=9!9dy)0I+H!@ `*M@J-E0^(g4"ރ kTq| rѷ'%=QXfn!f`ji\?"idpE@ɲS9{ u18)&٬G\ WQ4j.@ vkB132`sKעS DCk&УFF'S;w~dU˷0s?:ؼ?+ɨW`>Wk~ӻz_u^s?Ƽ:+?uWyL€ X,\^C÷+jLbM֣<͈f,݈S8!/C.ݖn*}W7 AK B2.QR.;=#ɺH}G޶~NSea<"9m0wAD1$FXX/duݑ߰'aU:u_b)**Eb`c 0V]qD;Dy Dc c/~218SI1" ƸO^<ݣC>E' 0G7~W(a={O|Kc~3'vgVM@_b1ޢNh` )6p&wY7 oN0o}ċ3֥* L|YBOipCFS`U㎗,a$ͰP"M'~t\]wWv~_y]y)Ϳ_=o%՗?cq 0->>vBMzW{,5 _ @Xfߺ^Thlg Y 2\:ﴷNmװ7ȘT`_fa0O-hF) F /9bLItoO>XZrq$SNQ.06*)@:^KHqt$M꛿r݋x$$J!x$JQC Q@UjF10ƈ ݉Dc *}" b[;, mRbTZt%}-G2UH b!ZI @bigyk<}c96똷 0 g(yC굡 kÛG,b>:G_󇶽utɛm^}n^w`r43FnVM$\VZٍÙ)yM Z;Ot|>nDY@7Sx,vӻC^Brp,hjꉨYAL;$jFXvv@d.:P R3+ 1\ 4!3@j!U._ p'R*O8e3o.!R'8TgD,_I^R bb:x;5SpDf;nh*wj\9WyMD+>{pwq::+-D_rScU Ͼ|ɞ:UtO_kB+1#?F)'O_qwY2 ue ҙ<(l+({o?Υm|w_G'߰)BxS zJ;oX8TOS&yw"6=ŸS'p˒} 6qpÛJb=jlc:B9a / ˫m@BzG`0 8>4L>08ˁ0ݭ#12Ыizk4Rv d**mxQ**cVtbq48 |.DU3Xt3E7>4 4;pUe7*CꌎugpK۵o:$Bm[Pl ZAp'YY%dUt^l7( U-2` xs<__~駿7{Ȼ?w[~Z~c8WM5`C4]"*poNӽˬjFV(0ۢ'`jFꑝl#/H\IMͯ/Aw2yK^W\z[8 +=]r.ܸ΍+s>㇛%LC_zl6҇Kk'Ntn[bTN>[>L#??׼> է8ˮ+݃W-٢D'i< DBx݅A 5/\Re5w)"b H,UCAPeQK)H,Ufh+|tIn[v0[ RARP>{0Kv' ʥ H3{fS i YBe';Li;h&QXe@)v؃n$B1 tu*(NG{9]Ӗy)}}D(t]}yБC8k~g~K??Y%۟s풋8-I9gyW~Zq_ypep;kgta-y .0֓;M\.+bi;w^zř;z k7CM:˳Y9%)5JH#|0܋HbCI IDATpkz/Q{N̨O7N>ĆZ=9B>m[fڢ` aJz2/Ѝ1IZ;X}9#cVOU,*TAcl@v/QYaf:MVXrGg)Y lEd1L "ᜳg fj/mjҐH&#o@;ar+BlsnH Ri9 $N-4ʩT`\ !=4"^` nUp@WFz.I"LfVbKHQ˽j-4PE+K9;'!g*{"xlj8)yO0fv}|}7~\&O|~?dלskxh0;^5|[?e>o7g]uymGV׾-ۿ>`?m[~=/ OڿOgml;ssv W~/.7~k/gޡٟw\?W^aqww?o˟mqOv[~}|ɑl[_\g^J7?W7׾\t_Lɘ;Y+WYJmWc=KJh*cm 5 Im[$XK9ؽfш a!"pnڦɞm$_YSLZ9E+m6Q"š].MV3@2H"[`Ab6;fv0:AyK$tc\{"j 7mr UVqULes5RW͌SW9AuX%Lݝ3j=Ak,,L(zdj teK!DEW ۇ-*hL4`N2lHT: Aya$yy>~; ;y'~CO?~ß|?0?t#O㢋o8' L\yv?w_>7]sG 3=ߺv?|7`w/~v߹k߇~]'y]~ձ9wVw9t9qMpOZfT% .fݚX=:bC@]1;nm5}N UM7 TZyRCUA%ZL#*+Ti")[Q9}]YF϶b,R3HfS g.FmF*paTAd; 13utIJ>kj5pXVLՠmfzc-K^s8.]M#q_o#c:ho~e;?~& :۞;ox;邋z~yCF8r {n@;;c]z͗ȏ}7?Ovկ\C} |q导2ݷ=EtI^Oqgoyv_K>˞v;ŏxo~g~H[1>᷇_hyokoˉ|N[~7pAMAFEeo{*=Rp[IoD`ݳaYi(1uӎ\#Ȫh Pʀ>OE;kdM"s;3ꁨ٦5UFdA9uBziUj;eqASj#cNZ{bh@2Yd[LRoR TZP.LRc 0"l292K8ĮK!/g#"\BpU@vZ)[D$f3ex4ݨD(Z j*Ȥ^sC)lD/,:zVgY!\deJ@%.j0UU1&ȵO|u3sm|^yzOt۾|;ϿvwwC}Ǔ<.h>/\,G>yk9w5a~G(ӹn x><h/8wOYn;/I`]~g}_zbk.>oޥ'csrgo?}:-?oTS(q;W~?mmkw`Mkm1GK_}6ξ/ XG=X?eO5\4wt U%J˾D&Pi\hf9oL#2SDy6P  #J(EatH5 l}@&nO-"vUF \ Z9G0g`LFV#8ӄҎB NAC-ܳ7jF4ddFpUe`Bژ)@Jzw oM7,U*r8`*5Asz,S&Wl U V@f̊ZdEJ-]Gu5Yt&ǜd"TS+Nǽ8 =ow%'F|pgM_s/Mft1'\B\ um<`O^x\xֿwW\|?vm|/9 Ob~qfS^1O_7\ڗn<߹Wخ~Mz7YkܬɅtkX .H,1u*6BX\kY4SKhtO31.)=HF2:܈5ϳ|d̦ݻ^~U\xS|Y@>=W/.߶|{zfӰܳW]xkn|w8璯_G;oz.f=g=O}[^w]rɵ~o3@?v]]p-E.vG8t\Xкۀp>a_<㊿^~c'v;Mre9[&Psհ\xS3BIBQ"SITQ9=l$Zl/T:[ʰ2PIKa^h1GiB%o/-V Ap{k+- {1+CQD`2oVg.L pi- *ݚa39#ZP{Ǥ6-wLDPolF]L+0!3b2z/@yiZ6Q\ŃH,AU=s.6@*(ּtNN.g0YB*baee/WI;AJk`B3=dEm| XU'A:9,'\𞇾p~~]w}g/;\\\>ݏ@77?{>{kʫȵo?OW{3KR.k>:p<7=xǧ?y٫}퍻ȃ㣖g7O/}gBwY=O8|8g^oy`m㚝ޗ_GT;{\4ҵѣS}.5w$jK8z_D0UJ¬J V)<&bVOZ;fV>YF&x(UC "4aer0 e(W9/Y3$] X嬚CrR!Q$)XT@01*xN5 *^0qbiY"I'Il~!QPl芆,lDUnУDg@#TFPsCj(vAg2%\[k\ rѩh%xPUD:b&WwoF焪@t ,A6٨=ToÕ]<{N#8rw;~'|by^s?~lj6/|_~%/ݹwoy?~yG4?c/7#}`y{م'gsܷ~K|GxM驏{[weWkb>q?z˾\_".喍,{_\ꯜ|b)umAuR]E 5v#\nl=hi+%fDe؀E \ Ek^="V5׼I,1htMi&5@G YȦJRbj`L! zkÔ$7nyצiBJ!\2SQ̤37bj Sm$ >tRN+ UJU hRfI I*m)i SUw9lTSV3UU_%%@`޻WMr&UE#Ѳ^ђV<Y-CVr)9rɢ f/嘵9kIJ) HtgrW% r7zeG6XύQSG3Ϭ's{Rmо^ΧٳGTQ弾3[_oz׾^ w?}e>*uox+oz׫nP{?O?2w˽kw}w<:rwGsy?ȾU=+^wQ{|GoYiG??|7gПW7+=Wz>w]_Q){\e-7c;#2^ rڮ͇=,bQ)Ja3[r2*=8>J90RV[/&@%3i8l ^\YPUKR\!W*sf*0S@a* RyX\ZHsP b*WZ[TVD i$l"r0iY8e1JEl\`}cX6"ayjTޠJe6{b鍩06"&dqiO*:SٸM͇ Ik`#5"i$S{>rZ#CbFk&1fC $![XUB*!l0Sm^x#:яl+6  IDATrDܺ#\raGೣ1arGՏ_9gW5v1mVL%*}leLrTZ@ttt!VEn{"ŊA⮑~U0][ȑ QlV\F4VV`Mf@(g 4vX߇ 0rH52(@ث0]\e[ȉA*+TIL@0AzK3K.]Ъ6 ,:Ìˀ؉&EBXr tUY} ;āeObYdQnrdU҅Ihkd.Bacp4VUnj`b9+1Xb htQ45"Cbyw&5#//N.TͱbBDNWش&mj:\9s6>~c;f#U㛿PZܺ8Du(]ÏeIL!6K8U^QB[Te (JGrnC1Jax\s;ArEakiEd2T $]-@i,$'&r˹$F=9s rfd^Y|.E"ND/B ӵPؽN. ݸ]-,!T>Ys Z.]E;/mctEt0B-{Qn#3 y&ar SڻQ[tsۺVJ)⤋ #vYt4^& ˼X"ĝXr9Yd)8t(.\ b7xu>{h%?x~ׯ}7|%W(~/_9 }̯~< 櫞GX|s|>ɻ !{OkWG??N/?~So|?__8fyߨ>Ǐ~rh$,1kJ{SǯWcU`&%E![ 4uҔQdwN\. S5'JU&6(auG29ai|;P@Ek 3A<IfD0lc&`ٌh( " FXp|ñ.@@A)AƃMM B;Pj61o\OғoIBfOwf'Y1zVH=۰jZNՃNɚR\,v\D+Ǣ`4ka:X' 2qQb+jHas1?xtownpR`ͿVÏ?/Ǿ?LֿUԞo_>ӿٮ'r][R$8$_^T|i6F`*LPiDL[Zlwr I:^As-L*$;u-)ą4Ը/ HP KeQ=D,E (fY:@Py*d[zܐںi!^γO֚wZe|"n7T'y\тTP%%Cؒxpݹ&o6M}SJ ^*NK#i+1=L]:3X:!~#CGyK.21vaIafH*Մp* kX-0MpS>~` A׾{}b|W/{CO_ԧ?Z?5c;nPK_3Hvo gazHEg&;!#if/}bP9JG \J6Q-x91M 5P|WScG_ y3*F7{ZVBNg,q-*Q4dʶ#!&vy5FGs0$ Q;T]GY%CZ+8kke50Lz 0nB@LMd D[Tgr,@A(Xg6 \j u 8MƋB }~g:ú#zKJtHXz.OE+e)0=_S`>S~ Eʷ|ų|?)ڋ3G>wSOyRw9-Nqǫ–BDE3i4e7J %5 H 6F0&92>=XBxY[5Ç8ډ@:JTx izp^;B{ݐL" ^%tci0pVFUZwת2~Ujq=.D҃Eq-جY:$:&F?on PM.ʲۇ⎫v@J3NcxF!BW(fR5YZ:^BY: PTW=@HIrA>g`[WnP<-NP5 \OoO']{8F?a~\~Uo/1ó}W`*{}|~}7?~_>jK%*! #:GI4:Zbр0 Qt8W .?Q(6_*X5%A] 0f2+ݤw$L=lf*uׄ/Rp|ı ],&f #&IYH/{#Q-`ҥNWc _וSؖ߁ o2EE/w!bl> {6Ά y\f/=aW0S1IBzsŔ5<eYA-"b};+®iveO ;$EdU(7D$mg%3Ih pboǀ Ð! 0)%w ;F qdڞHS9QdW=q2cS. Xx5޳.iuL&j4) !٥p&V-hpEW.ѩB0bW!XF%]{ԘŤfWPw%}ᝉJۚ\Q]E&=lS|SkwX^5/ᵔlzI9lptrGZrxT4E>k,+{L0i"QT cp H@(8Fz u4lpN0co~\1pl MLJaOvJf{KEV|TS~ bjlR)/ѴDy$ ,#)cxHp0a_aRC{;Qc{YV~]ʴcB,g TVa{t[ {vc!k  Ob1׷3U3V t=Շ01g<-<=;]Wwؾaa:-=|K&)!,yRl&uǠ&=*Gvתi/L@EVtLh@aB,Jk `Ǽ.8.YYݾ8TN뜙҃q.r+ nժHFL`Zq? +o$k*VrwWU5CmzANQٍ́MԙI'F^F(TsC֬=F%nD#JV٥iVg,$O퇩R|h :֬sQ 0J@Z=+2Dx.9oHYA8͂oaJ]\Z=}$*0+0$,`: JC@C c9p1Uv|~k5Oods!;QMm !Ÿ/Z[ٙ=;" x vN0õ/nW)0x tZk>[6t"O%sݔNUУEo2_%>COH)avE<4(`OV yA y5C Uw1i;iq> -$9 rrq_y샧g{SG2/4$"ϘyWLҜwhv[-k鑄e b*CqvHZr|B w ٍ.':#a=иВLFhN "- FO C4s(z|B5F7eh`j!k %F隰tMA - \#m,9>CF\l  h81gGl.Ȣn T% 41~FC }#㤤qCe'+>ru-'\mWfȼg8h$#8%̶֙14Dsy[)s3 u&61kOk=@8-҆Vz>4Vh@.T,?S^{oy?1ɶ5vP%j_`{$Ϲ6$1#7 Q9":Tgxv<ݪZC)ތ"g]ҬF*+YqN$sT.]yP,/Dʬ ׈c7zgXBo( .N8*M *hK$ &/14]e"XTq|N-\! 5+Ơ#KۻAs:+֪h ffv=wrM2=pıB{u11ܑ,qw!;sNm\S ]c˜tB :j5Rw*UΆѪ3ZkqlsS 0(^(oj_4L_}6mQaL)r;LH#MFb(.6c>ۼqd? B(S6]ziӖ`{c;8VIM)#\'+ /)pg;h9=kH r2䔮 V-V$g߆ffo2ǠDxoQ˧CBNL4W>PC`"f{\C0_M_CDVCEIY2^sS|@Ny'Z;֌ia$CkF1f.n8jqG 9Ɖң<`ӶWն)P3P5:234vFQF "*T<㺿b@.aeʬ=S&q%Jީ~K(QC@ sM"; oVo/!O [[|?A-S8C!\e?5۩0DiKW⬝.2ȸaR:tl .J#t-A1 fo;Ҍ **L6d-b',`x̞AZ* AM ߍ]LJ|10f!5 #s Oca;k)ΪdEk"kX3J]=kUd {nb8 1<]Rjt`eGT5 nPlw<<GlDL<0=N{SwgBRCl0n6Н#r%X\4!N$(;6CGkWOJsU5[kԁȢzƏ6,wcZG&}]*fQr [/Iml@PF {醅 --I=5ܡ A*)$cUkƋqU*B =qĤg.xR8%mϑ6_n54)Y [3a/j16' Nju8E Q5 XW~ڞ=䂃b9Ysm̸nٳ`]Sbg5h1&*!f.xKؓ}{AW|TCWjڤf2dOl:=a2=ҢU.s) \j ?&[UA$j.3lʚ0 \'*NbbÚr;Nnk'vGѧ^r:X~IAa{)7xPlFcnr#Ymyb lsL'q0D"q86:}Ĕ1Hv HlWgdo0Yh sFrc*R(shls8LKGJcvqPcs 12{i X{΍&nK,0sM|`sK0])`p8HZPkL" ╺sEhBIe|Sx5$JZIb}Zry]+}e±.9٦ތ"%4t6y>,)&钪@Nii<?P,V듫OIj H -k =ؼ5Y]q=<=:ǟKZG@mıvQ@6>k?ʤ~8$Nb(Ay.0CK>ѳe`ݩ&cpP$-WÒAw30NsUhC aus1& B< r!y 6!d y#f-Q@?mr#JΈrbdg- +\jF q8碂`(xq@սk utZC>qڽ˼ f-s#5$v` Ш4k[@s DژU+}v4fbxQpF^H4GE.9rQ/P^#);D34$ 1ʁ1POșe5!ioKV|(c fWB;E;F>%V!NNdmQ$mB<yƋNJkk9\zID11& Nl_xN4ԝ@Vz`+CìCVg1Y(y5xvfAg6PP%D8%F{z^DdО"YNjDπ} Z9/>˰0h DىU \b/@;n,g8IENDB`dtkdeclarative-5.7.12/docs/images/itemViewport_clip_radius.png000066400000000000000000000047311476226662700246020ustar00rootroot00000000000000PNG  IHDR#-v" pHYs+ IDATxoTeysNgNi ((Xy `ܕ`W꿀DoMpW7^xi╉f} ([@Hi-*e@gyً}A2C˜3sCr ~yy3<$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*']Wc0p`y4rӪ kǃ-''VNvyINkAڣXu䇵=n凴jdHߒ}5v2?VZLboFrO$]gs1.-ſ={uUq$s€˭\-VT{eekHl1%s%?bQ\8-%s&NGFʭ~ ~'0}!N )vH[W)ܐUc 8zc\4Jnoe gq+IyxEt\NH:~كh!Ϻ1 Ub3iѸK79vFbGljd6__]|_qb?Ã#}p̞HN6 .^dt 0֍aUl;s!h_{jǯAIxy;V=ܣg 2}/3ZfW[9לRqm $eC9̣Op<75ɡ WQ,3:tv*_N˥s8x40}{~9{:8@91O◹h2?;8Z>f/]]!\[C5|B".ѐetVѻ1_phn}76ne_A2j+$rqt̶GtS/@Gp͓7OrG:xSt1\WWlfssNF3xƢeז!_@/ n 8Ћg` =jx:; 8Ϫ\xduIjg`0}Ne^uieeWzE !N=}gjsE̡$apӧ!ˁ^^l dz~Mpe#7H5o-] 16lzӌ4.@${9 뗘ǷY?o8{h2GOӳ\?BB͡Ft;_?Pnbx({/Yviwh!ncyCM|8nMHgvM6qf}(X ,{w}Og09@5HޕM$_(|ߏEi\ ^:ť,{Kcccm@Ӓ azx;/8/-ao/5Mri\RҜz-^̕ 曶m?sDdD=_矏li\^4MӢ!*+ql.yWu]?~ԔieҒ%eY>l6-}ޯE#\}?b~ie^u ‡~h۶wGgٌ@=$=c#E-c{l]zS?HLgKbҤMwt-$~iI"RUUQI)6  TU%U~֮("LHx`6dHqLyyPWk-~KlqtLڒqC$17M6$>\Q<,\ 5ҚVD%e]Qɨ|/Rm1N4f=OMf»_=Sdyc?yZiz{*@6.5 'i~uϞ&|15\/>H2T3V;'|h럹\G8@bWp5/C˰Ι ȯO +ZKT΂;Ng3\~=ÂWqr&W~ŭܸ#̾$_ ^pIq\LqIͼr̹<۟FЖ}>ZiXSêt}[_AŞ)\t};6z&VK h"~l( Sm=AaS?LE Ͼ~Y56lI܃7 M_=)y|uo|<=VYʿèLM乥iW>L4@odCOQ4]$am>v#7>7cgU7?c?*{X+ƞV|v|ީ<*)pY{x4//ϙ>]`FX4οO?^ _ '|-SN% sęP4 .~h>?:>Pҍ@|g'r\i8gv)O>O?HVsT6O.fia{6t[gh:!^܋kM}5O-%wBKx [$Y &Of.(O0HbLWJνF|3|~)9AE㋘7wu:dXàٺ'ʧ%8VN]8n gLי"8pܟB10Խ/x<3@B7ᅽk*208w2\w5,^ *XLkj[Q>­l3y5\q#D6[#9팣Z}3eٽ,n!G}}zRKoŻѣ3ȼeʉ}p qJ>y8" Lggbe]P7@^4 g~nz5{R)mJ࿖~"ܱ?m*9} d\;-8σ/^0oÞ),vbnm_\+Dz))Ӽ7.8I6Zױ⯷so\jťW9Ty/yzG;#:.YDBZV{,qR}S@(X cf7* 1v)ڵ]Y&f@Yw* ?Og`C3LV<~-='`ɶ-˹?Ѽ9lb~ : m1 Gdb`Ts:UكOQό΁1( uLC}m--S)ItRR"B[:ouJ> ׾kG{w=OS< (vcM * Or[`iCsHiC?䯯wgMtm| &NǤ[[i#"Y"jkm.eOyeʚV+m_*hayM+;PI P+ ]_Okm t^yJEs͟#dyXٿaOC`{z,^~Aghkn kWԝ?W0m=Sܯ-&b 3O/TIx)ܛ,rg9~۹HZ>”9{);^y8oxQ,Y/ !oq܍6ODdW|4?vsN]DT1D?~S˗dW3`2 Gou4#Ϸw[2ЖNp{5l\'O7< 6fb'<O?@ -$\p:;lj?>;HkD"Am@KҒOL$ H-ԭYKcQ9cʊҭ0gڸukIfTIv+nHmFR#G3c ,MռZBEVZ kq8IaMQrDLVQTm$ c< 5B]P>*Joz\I!6A[{E)(NBSsNUz ^{rm 93RŐlw>Vzu!2ml Ta;h ZjRr/ SYʀjUR6TO߬^uDo:XCz[Ţ-4^r0K`?Pt+dd2HuT&J(%7=IJe8 FidϰlY Y'~wݕ&{GǮYݯl ~=}]qY!AAGXSO-\5s(:9w4L&CE,ZƣEt-ea?P-3o^ EE|K ;~'!t-ud t ̛ {U `"h:8##SEKCTg_ShQE^] 62cW?hhwf:*ԩ&$06 - =VD68:6]El>n䧸 ]!b?ЖAKM@ tV96d;6[t#b?lDT8` Uᰥ0@[ނ$w -Ԧ@fh}  #w/8羾w?HmZ@v/& gp4/ut^O`h_? UCKozZ @W?h蹀0<w 3ݻ?ipn?5[(7`K '@:X ep mu D $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH $)"I bH?[PMwIENDB`dtkdeclarative-5.7.12/docs/images/layoutUseCustomLayout.png000066400000000000000000000133661476226662700241150ustar00rootroot00000000000000PNG  IHDR84 pHYs+IDATxy|SU4iKЅ-e6# (EguG_wWp:l2 2n#"SEFJA, MssyHӦmSrs>47'M-+++=--mnOZv5Siq˕Nzzz`/mqMq8[,; ARʺ (,++xҥO6-0}0QgddL8qfttBEQ( u-{8{ve])::zWvvv9=H"2! :??AgOGJ )% JJJ@.A[8"2 %33s*d chff06]|DdJG !-/`-{#QDDN{!ȫ~D&fX,D{o׾. jA_絯/8 f[׀/% @DDh}8 h=ZCGDDD& "21w6K_OD‘1L!@Ddb ""cC`/Q{+" @mn._2LlYYYiiiv{jMTUCx<Mӎ\wӳԠ6 Dii( |Zaut&(7t-###eܸqSUK>?mڴ<5 P 'ΌE9gP( <a;1'N0uڴiy  4__t:Nwj0gO2339RJ}( p8C333q:B{#$wBtf#S!6 èk111 Ȁ30e׃=^Vs5UmyzQpjf9ɻ_YD@/..>\Pd|ײ*+b"()vYv853&Q!i Q}1i}jYxv2} ychQ]\S<.*@a.; kNWZ׾2Rw]CY9ƻg])O(??hcv2!5fZrkը.qrޘsM7͉-w I{-(6((7F7]P`z-&{V'{˄ނ?S#7pˏ 0nl?8޴+3wW$:.ǎ cv,܋a6l]qwwڝcM^ ^݂먉Y:!q{K~n|cBkIwc’_dا<[Rydsgz{ns9OnbGygLmt^[['^};W\Z'qy`ǶObv"kcw-5yj j?=BjkՙTKת@}W‘>)v״ MB:l}6^zGB{\ձbIR ". miꀋ1Q:!.Perr2۷gw0u5v9Ry]//Z'ʻcĐ.8J ?] 59O9x[n-uwE3]Mh{腲oau mvqmee;'D\qU)F̯8h!^lL)eߜӣuw|]5}iu3f^Ihϙa6-Qq)Qb! 23GYt#WdrJ R:DA 9˧{coFubu[:FHd*^*Q"F#9Oi@f̽S! jDb8{hL5"=үlNŐg,enT\7`XUKDI]j1Xv>Q9(rDŒGDBmJR7ei;{ޔaTv!1sIC`bKܾe% ;|Ǝ Z>Y 35og91:c7}3|u: r0 Gf̙UۃKn}Zv-jفl_"ϯVE{_ յbgxkUzk?*[E}X|నkؒvPH cdG>{˦L_>|WM<1%w@i/ZuߡڟFMK68a}B4ْ.Հ=y_냻qH@s,[Ⱟ h OaqȽ "jրވ.h#m | Æꭢ>L5m<h#A1 Y&|%4>ZW"Q&G+V݇ ו{Pc46)E9T0aw&|ݭAF u6D0jB?#CUE5]G?"m"C.]vð#cIm?Ve\Q>P7 $ ] ݭBndp}WҦCG8#QI*d8X ME.z.dqE _]3=[2}Ǔ{lʟ|5C v|!F<;{)T;+ƇLQ . cCsCj4ƤyEE~Z=TZY<lwN/h{ʀ^SJcS7 %"vU@7pb~ QvԜ:"ͻ N%au!G֛Ł R/ŞwcSYW 'V}Uv35F%( K˕cⲳB^U@_\5`?! p2z5YDpYc+SKw(hԿW~V{#}7>ѬJXnWpZ7 UÎϮU_ڻ 5]Nao/ǦԟVF)v-YGQOQ^Y"2 YGRP7a6 "+1C6=c3rD^ C~Nw}xH^7{B:~a6x_ɿ[ؓF`G[x@ȸ-!IM?*o: PsBkddGg^ )Dg<|SF՘1o:)[/0V;}[F`smO< 1ɯVUqP,V,K `ճ7%w{^x"DQQQ1 ][qbzWQQqa1A4T#p"Aqѱ6 .)Dh%C[W`Z`RנI Գw'pJX<) G XpӜo\; !]}(a/ _ouPT̟`-⶗>CS׃ҖzQXE'gץuE?t:bG V gjmz}N5J˅)0~Ê "211L!@Ddb ""cCDD& "21~yCQ\D, /I!]#""cCDD& "211L!@Ddb ""cCDD& "21EB"J"JDD8DDdjd+OD‘18"jW 2]` 04D^Pgx< xD(pk Yo\0PCp$@fǏm<&`0L? Gdzja""cCDD&>_" #vD-뜈.=iZ>;RQQ5MWU /R| ]v?DD-Bx2qu^UU_"jvJnnz]O:$Ngm:Z[(QrrrfōRBQ!.:ϩ T_;};hp,-: %22Tgdde@۟k|_ސ-,,\lٲ۶m;wܶm[eXXؾnݺv{!Dgu\l?N Zx {LHYfPZZ-)aaaVkRp1hvVUU=zVjP?qAD,wVRWYIENDB`dtkdeclarative-5.7.12/docs/images/layutFromDtkwidget.png000066400000000000000000000067571476226662700233710ustar00rootroot00000000000000PNG  IHDR":9 pHYs+ IDATxyxof&!$ ȥ)*U,b+>V>V{hڪyw  DP@$Bl_HA/K~ ~^1<<~A֤^HL @X !@B ,a @X !@B ,a @X !@B ,a @X !@B ,a @X !@B ,a @X !$4O8#eY^#Q($9NxdY#Uc766ʲL)eY|oYiѿ4M(c~?%%%{:I/kc HOOm+YNuk47á$R<eddĺYЅ.'L$a۴Ϫ$H$$ID"6iUI1%I$?a U7 RJj7W,Hy ' YSs9eŪşUֱN} i|g=V;p8{f!)s+湺PZ\yxݿx~0qmMm.SG|q^aR\o_Uä{l}1~r&ߵW~D˧buWujj_B5bկ5Ysf; aM1[}a?=e>~ /riTb'3.|3+O,[ wϜS_*ͻdoѽ\- Ṕ=!ŋ1ǥ,!F7˛f^>d1&E2#0*P)B=eѪ_`k?2 7V ٌ&]<{'(׾\3tW5d: vsלqXFPr'^zHf\|u;kI0oyew|òeBM&HQUhjQ_/]*sDN˻sgGrӳ 'Iy,'c{DRBZh/~8c\Ik a;KLt9u+MaF!# 'Ϻ,;eijvawRMmeW~Sϲ.ML8Tk&xs_MTV8 vnnljv._Z5u`:VVlի׬ڲE]2{t+Tszx%=ɋ c 57 6k+"7,;NcHiY}s.ضjFłw*uS.j9sJ[xYR]KiSZc:}Xt˛R 1"_ZH'vԛZSNygimX|JWuui ]ssscX a䁏Je ,fŠ,yڇgG(^ pݱo=/McLxi2l #,^h3`P4ErC!/ITU5MSuEQhf*UUm? ZAQ˲dYu4M;^bYdc({BP( a.RJp8n;"8XD \UT-YN'a ~~axV` <αuTp|󀁇+G7x؇ [5xشT9CaR  YG"$!M=tyJ.ݺ]ZR2qTq/D)isavӆ7|eeuL/ؾr%\~=p飲]mGmNW";~ XnC{ީzQ~Lk|{;Ń=g鍅:#Ym]v,vCo8{_z܌X#ʠWݰR-|˕WՑ<bU~£~ڕ[* 5cRNA ģ-bMǿխ~'K]3 ƀKcs:r؋])ڔn\T(ֱ+5^C/ye]$B o#ݘgNjιkHޖp blT͙dY>Rc${~NJî^.BN]Է-zgz=7I gs3B׭48]"i N=#̓[\jmry! |5W;;nqi|?:]tq뫔m0y !ĕ#Bu{<8bč]yCu,*W:K|~z(  p] 4rHDVT #ızӀBb9mQ5n_~W\ ɻ~joA]ee#=o2[&{\m֏g NkrMSOW5~ ]ܷ(S } Kt쯊ճ~WiBX f_Dx 񎬆s֖au?UA%gz׋ {JɀnBxԬKJgaV?[p#+[޵Hoﮧ/{V^d2ҹxMn+o z]=O*%b)$l;xEh&$,T"؇T]ylI6*g0dy=VR  1ͫ룣999NZkIdE=_L;{u[>gF$37M}`ff3B|WƩ7`si٦htF#殜#Ө16.s fшi4s2qZar!"sl̓сkˢ Π\riIuJyҸ;ZNBd~i|ӵ BGDAqsu '=킥ӵ@\:(aEeYҼ䎗ZaLJ+#OʨѻlIt{ ) w9}(9on28C:r)R̙3of^޻wm{s'O>k֬y嗟| [v_?~|ǎٽ{7ڵ룏>z饗v;lٲܹsٶ6 wqq'|~

çO޳gOTzo~ȑCj{l߾}>p  s=ue.q!p-"saEׯ_W奛ͦN]aA`ocjM~.\p-xg2J)ZͼЊ)p. mDXX <^:8rp.\s)RΥK9剉 [ .r!̢(: *CEQ.]uAT.06\\amDt5!Q,ڈrjCr9YXDrh#ʥ!fFKWcB!̢(: *CEQ.]uAT.06\\amDt5!Q,ڈrjCr9YXDrh#ʥ!fFKWcB!̢(: *CEQ.]uAT.06\\amDt5!Q,ڈrjC%DYIݱEri[o۶ hkSDm%,8\`@3+~74?c%6ݻ5_N2ZvM!?JΖBXPitkw7>+"tZhyI#_u]0<4=󕀽v%1&kPsK&&~]S/.%>IɻKBIsjRiKz D|5"F c2.-R3GƯV&CWgP#m2`̚)b4#׌H`Oʐ\A-b5S'jD\k 0fL7 :543ɨv 6C4r0ԭ!f]Y34>`L5$B#biֈxNCr)e̻Kja>SXqՠ>? vT5P h%;~ B 2s2jj0v?P :pD剜 5Xմ/CgKdUM{ =[+oA`>zܺ^xBS4{A oﴪO뵢,BeG ;MMV#ju9j2ͳj]JAQ<K.A8PT W{_}+Ezhj&?ަ P0R2d . + @ZŸ}}KշC %ܺw{#xV. b/. "(W=D F}nh݈0l8?j䡤PxGǁb_3錇k@ydDB;="0B}\PVsIq٧@eeZ:D̽!DE)4# ~"DԜp3.?#(j_k)\$/"sj<&" M@#PPKq.vw}G5%3*.TRlKOA ="&GPTWLhVFK pك(J< bb-y`@ZL!.l%{h0?=\mр{hOgzLb4,(`NTX?\~xT<(K,tKU,^nrbQ0׽nJrЯoؓ?ϸ53$g(KWcjCrj\uAT.]!ʥrp5!Qt5V: *XDX9\+WcBKWcjCrj\uAT.]!ʥrp5!Qt5V: *XDX9\+WcBKWc@C.q뗠?VϺEi#ƚZsy1 KR ρZ w @ #>7>Dޥ9(P`ՒU!"AP/\.ĿUl[.\l2Is) RΥK9HsgΜɺ  B\jz{ye6A G6 K'Ҧ.Hbte4i.8tÇ^:55uW_}uY(K2f|||߾}|wޙu[2 lY7$2f͚5O?t֭i.RΥRrI/T[Υy3̜۝ cA㉈RQ DEJJ=˸j4_jߚZ\[W2]aܖJ 1gl.]55V)uڵ0K+cVW.fAPtfl̼̽iӦtqrrFFF?8]Cի\oD/=ڵkSԔ#:Mg 08v1ݼy ŋvc8&n>A2shP;,T*0 ϟ??>>iӦm3ONNX]E;6t.юY0zdX0[b@{ő3kbTNYr2b۩KhsssD{)Mt=0pX^WЮqj3Mqu.]еknذa;/_lVıDj.[粌#(EA:wkt\Ů"I^_g-Ejg@uzoDZ1>IM$}uFnݺq{o2իW+YDk"1hXNh6Q(%9axW.uioӧS$Rp:QoUr ag#"mE*q[H˄Nv>91^C6FYsI\q{̊٩3^kҩh'Jv4K_gv@&Bi&z㈂DߋvirYu&9~D1&︯8N{`2{eq+/]_`y]Q].;ǘ, (v.(rcrU4K qɅKՉ.P*KЙXoـD~\V` kȜ`|ĒuvW!'9tiXQ,&K$DoCN %"gYBTb%t)JH¥acP17`a c 6.Y6IENDB`dtkdeclarative-5.7.12/docs/images/opacityMask_MaskExample.jpg000066400000000000000000000552131476226662700242760ustar00rootroot00000000000000PNG  IHDR,," pHYs+ IDATxwxו;,Z,rqTg^6d)MsʼnS;vb=.qbꅔ(R"^@ {?l"J߃b0̋s9a툧H]o۟H{!e;.B PG'"0ut2 #M'jۿPG'"0ut2.B PG'"0ut2!9k1{'z{{n ut2.B PG'"0ut2.B PG' z -NEatd]::FNEatd}<^o%0ut2.B PG'"0ut2.B '3^::FNEatd]::FNEaz{}PG'"0ut2.B PG'"0L 9Bg]B}#{!Uj +DeH Owlٮnݮ=ÿroM "^oY^[;=^;xXxsA7"N ӡ]{ie>b]Drw ?kh8"J㩴h $_r]']<^{9߯dKC~9XR,A"Tttv'~q9h?Sk/vW^l~:`"<%>tLUto:_mEӬRK˲W7tLL77u~ga5Fۓ/s-ZSuKx ix-[YL/KDxx;U$ty4;E:#[,sr.= ~AlDU釿Pۙ6"Zx<ZѡMg6E_{ٗ-#oc.:L~?8AY,sqGC2)*:B3õyQH3;:hBڣ7d "f,8cTG{gʷ}iJP#NօB'7wM.y'}K%z$ff -Ǖ/}{V)#%d,!#%H ]%4ǫ27蓁.Y;;~tSGc)uh,E-% ]UOExrr4ѝ'tRw"Rh,`k%9̜sZ!ChhRd. 9=50LDC5[lR {jM+C$I~Gq>7tf&w xZ EL8Q϶ERG3Oo49LRq%ҏX ӫU=Y܃{[y'd!}v=lsU2 ?]gK]KXo,i&ygK2is"PT@žzL5Ql14 ++9眶O6ՆDCnк胻.;̌ܕwk7jqLFqtfMѧUVXPy` |x|x_{}&Ҙ![2BqNϯޞnE:=UxrE<~oBᘞ0R0Fcj<;*ͱTI#gwsI%?]"aqIbu8"7p%6ӌi"=ﺬUD 8 l*8F3;O3. [sq_1MZ"oW߮b1%1 t jBOO6}~t$_ kr58$$9Cx˒'eu&.“o4@Ҥi:!ϨޔG)_BU::ݽ!+ak[dBrhlhvl-fWUIR8qmWO.“Dg7?BȏRmO!HaX Lkڅ7o4[8ɀO<+71#vN$Bn5z|1+G^*g]'6ѧ%R S/7) /E4rQO 8/3GU΁J!=t”7{9&}&EsI{G `zɍ':=8`q:4;v{f}<̶' Xtg*t$s\ qˇr]DǶ]81L_GYZZZ}>!Ǟr+) T f{џ98qaZT.h!TW #1GP6G; Al]B"aX|޲Y~rc)үF',MXݲ{׫dgs?M' E}WQGzSH2/!h76r  !bkChYŕ C0F05/'Io WڸkRu>pڿͷG )M qX3:`,-񰩤=ʘ=#!IK~cCE ~eF8^ƶw=Z W#q-,b!/9Yv+eL` `}'瀉;Gů:rd{r~DϗN=03=2=WK)=œzyb1}^e&s`KBĒoZ$d(DJ)Ut4Y|}xKѡL ];Z3\Yf͍"ڣX)lX27"K_k< "77]>0T9ø,Eſ_8ʹ6tN/2j1 juyDDÏ;I(]F& ޼r0c|W3a0Dg8#!W;Dx]Ng0ӧA49|TΞvT_ 6Q#gm V|P_aEB~\Tig@fƦL=03 KJaDzH`$:J4`E "3ڠ!wj`8H^P?l`vƬhn2 `Hzptmm57Ӟt(BϽgF`8 Y`,}ɛ@f^".cB!ij'y$o92?`X6),l()Q$C3`)OC#.ʌyY%/VDr2a`4"~i*clHCnj7O(YʌHHcƢdjv @0M6'uN]'DOg? `!.4 GP"Nf ?l+Ա՜' 3X@ 51&['| /^{߭)wTWN|B;!C]= 9Z(&hR" /qyDl"͈9?vlx14\X4>LO [@RX1qѥ2%V ֨bJmӈ9Cώ%ƨP>RܝM->GQU7F>aay9EO|!5b*Mٌ@$խoaRa70zxS\mÙNy>9THB͗$d&p^>2D$>#:# H$&>[e2'a >X @𾒞cXٳvNߓ ؞?,Iڨ *`DY2b i$It35*f  D(}ABA6˟d1V1R%ASw@,EhR/ Ww6?6F:;^SWPO3 I#}ZQ`0gE BL|¼JajV%La10!bx fWÝGx{ +N^YR}xܼ8QtN[ٹg(sۅy̜Uf5h"w>Ҙc--d@D,72@Z@}nrFss#;nc-==CO]S䝝.pB_0QMzшcD# .}G_d~MV-`B4 1bGtH&I6a D0QQM-׽o^=etN"xLQas;q]Y g0F?s0 Yrdh zgLH߸:VO2O˹}p* J =FC|X{6JXK8RCh`}|}@vcB]P]dË\VIvc~+d -~nvP^_yQ-~DqU>[^sw%Ni~p*w149zXQ387e (HrbT#Q A08y] ggL&1{u[ 5f+ !*sR}[kAbwAޱܚ%X(wW,:Tڶ5" \c9/->-eo~oag [%VZ압,o[I(o4HeٕI' b\d97hd03g Koa&H3ַ=?}H;$x&Jy?WK(-_V1t:p4 H`U#wGYF V1GUE BYBML0 \Yֳ , (2n8tmYs݋:'HhsW'?NOTL]9󫣖P< d&A: E:2>`-ʏ `e#}|sNu<||Kq䥶AUՌF4)D8|$(Ѻma?ˮLJsDŽG # EcFFf+hvn ~qoT=\]w6M'-θ"JXI cBL phLhVHH1rByߞ_.ov1 %m~}hͦ*,=Y. ib@Ȏ ߈ωQ!^~^(՞-f˺\<'>7K{8scrdE  SA8gX 'L FA*"t3)Z]>`6%F ],%ӇsJ'\W.ؘZ_4@4>?Avy'lgL c}PhN zYfVgEKH&i'_uiJq>2f&:zYfn 'JO_NFC12EY̖)-}S`Ì@㠄#, -^~O0 1;2և^;+V"(]GD''=Lk:2J0"rב][ΐ$_ū~,Ǐ+Qiq>IBmҤ~ ^Aa-Dy.d!G!q7R̨͝׵@Dѻ\0-N9&n:.ωL)P!lkUQ3I{nw|8.YL ͮz IDATc0[q^>P츷+tG5u_ݕ .S]G#$0:M?#ELe+6{GAN91!UVn%6E4C9m:T+Yf Yb4H ^1±?'ʱ{`bBRD7Q<|AԡzI# h-"aLȪD dã%>b||iM( 8v|hN7Y*W`i'J[?: LO_Qۻ6eG2oy pzz3?\b iHv\Gz2 ܾ51F/]!-|)]8`ў?q:p=6CY'w62v.2&-;I$1vLS~\ o5cID;\2ߟJ+Xl0 Cn|m+da[Y%0F>|븬E'^տ`pgU?jkA1H K ԋ qiԨ('QDd^ hG3 ލ;:\Wy0Ә$/7b KrO,D|xMe%o ofpBtJт5cɓʌvc(+_ӷgjWm5me0Ul#Ć-wyݿc^sV $ =~|E\U't EkXv4G Qd CT0xBT&::-v,/ Qe<ڋ3-D1>34R ᮃ2('uq&ZR6.^{f"]=!C0fk;R6uЛ'/GK0܏ˊjX ) ZB nj?+Ǵ1Inĭ( LM8N~OEtN~w#0e!#u^n+ ;)Da(kXc Rdpw=> +H%a ?* > +'τB P@(^~k&uN?t40(Sji0|pVppRḩ$%Au7H {X71/vtF]^!+EWssP<1A ;qȝX|=||%==e.e>RF0V/XC@sSq1E)vrL)ѧnܵ8*5{kP3 c ܋=iΛB0KACyr.|yr&z[λ)FgE8>Ba@.!Pn'h5c,?M@..\ZiY '8qF/KWQ !}hGKxI0a?$рͭxh_/KJſp+PpC- 0]kzZ\vp|TG1LdaG#5j An VC* {;*Ģ y ..s!iH mxp/.4_σ= ͝XD4 U(_S).eE&5" x7(nN`FhւUXH=*)mZ*gփX[V#EZ3n=͋ tF>?yڰa8?xpjOOYtϐK$ȣRHn@pM$~jw[)I#ďף؞FbDQ$`kއ&XMc-<:>1ekpqZp#+;gvwJp|n#Ƃ 3(uik*_xԠ?ŵ˫Cw@8O:vo$y!"lȳҲKZ4ޏ/50 8V7^@q85~ܷ,%#rMpa6laYúװ)Te(ȝf1^#&`= Y|w=d%apc?[ 1UǛj~$ l?ZCİl’*0P )pzً0iXRyo.p7/g9 =8s*;onw8!02vǤR*,ϝK)7FEø w )/w4 摘J|Kb /5&*>)il6<p0'LvuY̷`,< .h;x  XT`CV˹MWY` .6cˮ9L>Dzz]_P'H-u/⽳b$hZ*ۉ:Fݿ==W*r?*¤ ċ{1Y F{$W&@V\0{»8&PF > ئZ254f7Ͻ(Tw](IҀp͚ IY ۃF}wJ|,(/pUIр\yy)&5 ȶkPW:NO/AĠ<6,9?Ti,*p^DŽ8۷8 ϙgv|Utwk{jNZ1[`<lj@-eE1q҅"t?+啩uۉ%S*x=2s;:vnk6Nj*cK(]{*_OY=ӌ!B@&;?J2}D"[)@Z^ uW J2(ߚQ sI0!Hx6t+g(E^AA5ܴ KKaIK%bp ;Z`2S3&N'=r'?#3̈́rlu_) W/Uc Q侼IhN`@JJ3!eAѲT]2 q r Ws>Gկ1tz!8 fcz$Hsaaij|bԖFg.MKǎto%q2sB/ڛh?u5"Ȗg&~GgϢq%u4fP"?\Ϟ:Cן@'bq-X]E9i4;@o۱ڈ/TF/"g3d_3Keo2̈ՠwôBΤ s>ww81wp2S-d4¯:aXǞb260(c{=| ø ߮f,ggkLY|\uQ49s0#"T`Y\lvp)m \eq B~դ̘ da.mC Y2w52%?8 (~1/ -H3gx/FǓMpKc(CNaiItQpGPߍ,h1.[T{&f*hFCQ,6x]Ag J(63NJf^dUR _I2a&c6YWh5qfjfL.>0vbnIB9wcU:N]Ѝ̿$u&\_B&4_.sS#T ~  -* 9hr& ʁn prx%rICNift5#OŪ|͆<NP%|;`,9J!Z̪LB4 Lha&MJVx>4N7z +i*d^t~s=[z=/]5"h<:e+Ô$Bbx/vk"$ wt *,N?av09=8*n!:7M49`|KG_C#و*`@F8tc{&T36=S}XM@ǣ^&GYkr2ps far:KqMX}r&+򑷩y&hl5|PP5=1ѐsmWm}t`ӃozҏV4MPQt\vnPUV 9p5]fn/7F͵q2r_h}7*;oS#fw FoH-?v&զWՂ&n_ M{jrqy(r`1l@y6 FG<O`ىa `I^|m`88Ds+VVDwkT 7ߌn@Kv_DŨt{t!h.Qw w ̜̔%B1DI M'-umvxV%ƺˬg$旧l3}]9u痬@jj۾smv31;jQrF" \{iycX7΄Ì?ac)V!cppKrFDQce%i<*3q8 YZQE5Xc-n'> aVGq(ɊT]}N\؍WGƗ$*Dn0LDfe^rcA31p*7[:35՞c]ue:c^1xMEkozz}3S־pJ6vO#<ꋒB7_\x 46\>X! ݏz'VWlC}Ϗ%%aCG+0`nzObq5</ & y!jLKkA4wsQ4;o?Ajy3f8ч̗1`4g/,;gmOj~Ƿ/X4kUJє&#L,5|;#b/]bՅy D4ů('$fRt3'B!@i?[bx} pRL Fm!Vႅ 9pYt 2||2<@0|rQ=8g)#kRF/I`Y4 þwp`3*T|%~"&0]0; b͚5}?,p`ޯOtɼGDC^a7H=MuQ@4X<]SWyUKo5>լkJix1d=C1ݎO}qF!iFŏ&E5X_ϗf9p *v׃a rZ` ێ<j+0'E͚c&兦 Y™R)#+S 57{K5Q)3!p).1pcΘ R"#&\,>lhF S_YLl& g+ȿ䓪wj8g 3-83.`̱  =rŕ/к#ѻ*^pCajUKfM O_\ CLzŃ5ۏl>Zx/°]=Cbf3|F@h@HlDEJrQ]P^S3~ڄmn>ݻvTX_HoD`QJـy#msw֜۴ |NaS,<d_[0.&ab|$R1˖(=5S^Moإhϵڊ*-eFGhX`09殹̋Ã;_g"/XsvFHZjMސ3~ETYtCB +B 7āXVN/v 0&MK0spK bXWBY(BeΜ &0Ҍ_ 'ak~-oj8# Xn&+OI+PvJ _ߨv?Gû!uy)ܑU{1+t3LxO0 =h϶s53xP x$;0~y3i,m4͖[5=O1WW鼲jwZ]]vk,,Eo^]UIfk^k,,كFyaUWp^h LJq Q9ȵ!ˌ݋m(p0mȵ!dž\{a1l\U*B hkCS#ZCF̂Uvσ(D3`gs Ú`˃F 4 & "LƜo/p8 sUQ=[FYUjo{{fc[ǢE+++;::}/tUoun* gZsAA Y° #&8(nDY6%dYk2(cO|2B*2 d )‚R/ `bl!;uM.:'/9碽 COaNAe1I39XIQZ6fdA3_ ۳攗X`L&Sgg'c/E!RI&\@ AAE,A5ҥUcUM=|äY|Z\n1U ƞV<,Ts򑗃902Pjjٵ- ,8|^cxشqFDo>1 %}){N+̶Ɔ 4MVCJ p QZB \@ A 5h*d2?(hmN,,Â<6DDOvۻai&A1jC5!G++˰YvP9+OA z1}tB~6`n9Ud)՝'XB;ٰl;wGunDq8r6hFyhzEQ!')ΡH!uzTӠ*P%( N9Cxa5*wQ>>L&3d_@ DQkպz[m紵{z^Vb=[mҰ%dO&dwy3ey>'3~,A!hai0;WjZۅVAOl N[ޕ`=ɘ? SM6R ͝hhAQ :P`j sPRt},sg65ysblY]ȥgYr ͌Q6Fg9=hD& r! # &̧?ߏaqNhxskGyP+̈́!~$ ^LICO"(ZxK[AOM5X"*S χKCp! dR l Dq+Ns~? `䈙 اD٠W|` Ü1s/ }Lk'N?D\D,n?t:#?%ˇq8ݎD |a,]b\eFfoWjǶm"{lܹ)g6d8k;Z\EU3Q*r88lЬ %A(f}htZxsf36v^&I(]]h$NE wf:KAaNR+]s_1jkk !.h^ܴimHjPBGyHE!ap<$ )Z$I"b1.-4"*J`'V#Q13g0v;xn~c~xDSmZ8 E$V{_CIyZH:&6 s:bUe6v9 ]رJWzfl9J|9&Uq<<_Ea j0W4۟ pk*4&O^4MT>;ƯxeELX! MI$=L Itf7zAgzHFz8! )M p0S),#qjP ҄l~EtJÞqn3&ݎ7bF*r}XiBԠ˹n6pWKkjӴW79LΠcZv냇@GKbjJt0iLATN%T/1+ϼ kuwɱ`&$c@ (3 _,8pp5|j Xc " 4ySO.1OzxUeM_g`D\Yw8On89h+_e%AӑGkw q(9i "RjBIJClV7bs\8y~Ov}HXEXTG J8gT>L$F &fMvͷ wĺ[ilı@ p(3c!}aBdzN ÏV9 k Uq˧e_^40 5(ޝ̸ZTf44j0p讧{%^=F< A'6(4¯z'U-&G['7+eIh$jkjRD1bM[NOZ1ݛ_t'_ח5vdߤ%UfAyڄwwNC!S $d(J.4q&&)7}A moCbs> WN߽/Qn"Ú 4$:94AyFdBJēCt\ݿ`>~_\ dzr2={'ѻsHq}Gccx;OF@y7fçee\L}j{92S<~4jltC7Ej,j(Ei>0ӛ n`,-J%][]uv:d':O !_>g")JJp?'Z -b'H`nN{qV00 GϨԗ/׭G Xpyf[ɽ]kĸ$-Bn3G̱\}E{]B {hl`of8I)OjsE'<]>yOS;{Kg店}';L*\mmm#d1ZF#͆\sfUuSsIoDܸea"j2g()upωٝq[Y[pcw F`Tg2y.}7Y-;zyz"]_?p:ӓ'UnݍR?iwhP/G ߆%B]Ixj3oϜf݋oһGbZ!ØEc!hJbry 3=tӞXw}6\KCߊ84xk}A=) N9إB8U*3.:ƷEMM_kwu}Up֒N;Ϻ94^W.84CN! YxQ*F|MGca@[܂C4}&i! j7\ĘW>ou,WqǤ4򺧿Uc$JLgJ<58}r)':Ee%i6&zRJ=~ f!Wml!M".ۅU?o|E<&2& G!5-{k$T}'.eH㝘yO^޾6o5^R_sO"J$:Ygd<) HDs7>}'tv"kA%Ԩ(9sF RHۃ P6'7:REh 8A{_+!˄{6Ȳ!4o3H%gV"T[6;욐hLUqUjfkжSn1s[ė"6uokI^ ڴ;ϼ7"\\qZ fb3rW#UDQ#`\۫Z]z{׍#uTP4y) ƕ`0TI` Pa3Y2!2LBCe 0  a2*$d0TI` OY,2*$d0TI` P&!2LBCe ʰ,ū2!2LBCe 0  a2*$d0TI` OY,2*$d0TI` P&!2LBCe ʰ,ū2!2LBCe 0  a2*$d0TI` OY,2*$d0TI` P&!2LBCe ʰ,ū2!2LBCe 0  a2*$d0TI` OY,2*$d0TI` P&!2/e1XIENDB`dtkdeclarative-5.7.12/docs/images/opacityMask_effectExample.jpg000066400000000000000000000776511476226662700246510ustar00rootroot00000000000000PNG  IHDR,," pHYs+ IDATximu߹V՛_f7)Lٚ`RH!Ń$0'A!`;";%KeE%P%%EEI8͡{x=yWnU{uv֭[ΩUߞtw 0`yenu $0`H8`1p%c K@,  X2d $0`H8`1p%c K@,  X2d $0`H8`1p%c K@,  X2d $0`H8`1p%c K@,  X2d $0`H8`1p%c K@,  X2d $0`H8`1p%c K@,  X2d $0`H8`1p%#- 0y;8O~ӗ.9y}/}}׃+e[ ߜϧ'ԉ>yO?Ww һֿ_dӌoeݗ0ӧgÏ|ǹ$0Ax8~ߒ[ p+_G铏\~پ:BI7gǟ<Z>RG8 ~=O[qN70._9O|7~]~ Η>qqBQ)@.ޯ_y yoHll^ʇ?k<%w AJDps/M=@7#'>?e3r?f+"ZYǔ`d|%c~ooA $|#a{l:)i t!IHI)Q(w_o|x|h55:t`[ _ȹ}+dCp{z+Ȯ>:]%w_vWW?pN>"{" o2ն;> }ݡ~~o%dt3SԤzjʹ{~ȹpk/~hcwE3񂄳pƅ%^[  __0|7mg/:4KYB{ Rhn/3vp˸)QFjȏ;Hz_/ܾ8)b pm罖D%h@!༝nl]vdԌK"y$+da '?O}usD,TH%Aber@׵]փ 8LVK'Iҕ37P1_J^;}psυ$$AE* _-spsq/%ݭoܪH{~FV1}/m+R'$x6,~.p@ e="[D5žѧKq`H|OqDl p2^mѢ ,<֎G;ÅNB:+Wq1nE $\2퓟?gF)5 R p Du ;7Ef|q4TͅAۀKƙsOtrʅh1kOj%%xLٜw3wKjE 't}+_ʹs2Ż;C0pܺ+.]9/#.;+ɮ_|'dR]$I{$굋_AGN-ܒ֖w?>1LD$J!7Z<]Pɍͫ+CwqߡCGorƼxr{#m̙gܬ=B!< wǀK×?{Zti AZQL@fS"rmw}>wYEf,Tvv7.Ei Fij;krkb r;z:%2+4`^EWgܟ;tO&kMPt7\tz6)xgT'A29tƣ$..]7̹ ϊ,.J q B/N;ap~+>ޤFDn>momov]aK K]MDlم/<.:*Hxf ¢d )\5eDP>_J=VcQ2} 2ґ SHx뛗~~wQ;ҴIB-C$<{TJ W1Hcdl3=s+b8 _~//D5d02R .F$o |]#}$уtlpY(E(.ѽ,)@XE g4B܆2X DwRc~>q+g^;`@ƒ×>" {$,d].l} DE΋E oDH)=S~@-+NcZ#LȐ \<B'_EϋY¥0q [k(-gOâYꏋ&4䵩)E8:X,'c >kDO¶8*boW'{ⳃM@›yO]?±K!x!^o R$,i\…W#r!NIa}nK D '̳'钮-7'O?3N:RFS\"DiFB׊T<*e/LhŲJjV7´faOoʔB@›$,J!jI QWQ5 t_~(9K $&O1M2/77=#~n! $xŇOWJK"ozUk/H{-E;q_fX38l\D^F'O|CZx0̎D| ;,vs1b l>Q{ 8ޞ)iM\Q VKzcuva%}Hyɇd2,о)N›gN}> QRz2aDI#:`'Dy(B;V;Kja(}xhcVydQٌt'? @›~5u<[ G!kXk%8GtoPEt퍦-*a>a9TcD ": '?qM\r93, VA=,#$ihǼÏ%Xjo0!ET, ܟ|#Gn?wka ፇYؗ!mJA4PDrVORBM{b 1x1EhZ(8 AF{i!e&sYbhW"ޓ1gPB|OcQ5ݛES0T\*({'ɺIj"lH4MRac]}sb c'|sr$@Xeإm/@ $gY#<^kk$o4)kIBm/Q&M6 ӓ}}i7C8z=]SG1>i%b7^p10N;*b-S$NBqʵ%}n `QG_pHĽTH8#@|/V;bcٯ}y>Y=t/ o ui$)Dm.1H{-cJЭn3hH(t+ނ7t:-v8JPE% 78R%Uɘ]}EzSϼ۾g9͈7.?zet̡hE÷X'E`u̠N!eMJLJ?źFt`' i 'QXGb}Ǿocq^+<}3n'~/k  "VD{& /L~wqƞ{#©n!'! !i5nGE#h!J(]p^qq"ag޼~0Gzc0ݞ8~iyęRrG-D #4ъ(m 0ĽAXOeDOBU2AGdwS]Hƒğp3LZD.{q @g}ns 4@=J&^6"BD"e3RC ri vzqPV)O.$q(\IҐ)DZzRTEHUvD>e!]`>ŷ_z%Bs+ԉ' $|ؙx%{(%i9 &0e/;{TS_X(uK4}Q,RT h`Fci)FȊ?G'dLg+ϝyKo $|8˛b4 p E …pSFv2`sKw?:k@ׄg.<ۼJ|Q1UBՔգ=4т!/ 5X'"+q㍺Dcv̱t#NEJP@,z0E >#mj _%~vS_$uQKG8\!F3 G"P)HSD-NwEzCW;= 40b$,g+j Yv=Üֻ.JfQ;o $|u;TÍZwE1P#hLPr.6XW4A8_uOҚ {t9Cf31pw֙[l[ν6[߻[!b}E9p>eLlom?@ׂ~mw.{˓pՕnt,64)A'z#h^(2M3G1*2-/d4*nfyn69޹9Ͻe@>6b]L3¤.|_58ŋ_L4'=7ɩY$fW:'GJPUZXHH%L"R^I(boe.l4#uflȞ6[|\vzpUA(RlPI0gO>gCUc lumz4!zd #miLTk`ЅejRbfLz&\MIJEmQ)rqws3ެ5ͺf[l>J{]2tWAaRUUmT$IF?uwo $|5޾}Mc.iJw$B! i):*&{N=m/mt9rN)۴!И wOѐGQ{gyy}}6墏mnWIu2jTH{ۆ@WtsFUɲ6PMH6 e|M0n=0k6lj!{ s! \,eے IDATeEiQ:`y֙wg}ZZos/Jd/.C¤Ԥ454TTEJUi߈7\8wiPS<\A {Цxpv;hNX`!F%C$Xu".j6Й<]7κa"X 7U&yB%iQUTIB}@WFAD]3U!FbЛB| 'f@&椙,^xe^ }}՗ӜΜ3t<ݴv>:e-I. HqU&%UШ(yDT.ľΟ{>y0~{w%1UfP@\uyjqB7/bud/½t]$+ɚt'rXT =Kg8snsBzRk gbMA&98E@ gٵ~+O;Cc ++})fJ&ETʙUO2]9Sͼn1 CQDv#\ zgobfڌ.bQ˝"8D5!)46G)rEzus _!ܷ.܋B K1-Du$ OmӇ?LuYʨVm>B=R8,Y6 =uf] slȀQ,2mD.81JB?!& K8@FR(yǓݛ7*23 w4Cb}JIe~my^Ct qfCy[i\thNJK 7`, T!1AzzBC1Dӥe1") И1u0ruT Մ'"5½%tջ 7z15GofNw0+,@F7MԊY!N÷1KvUnp%K@10òͥl s<_2n\A7oX':EkJuVCGf{<m, 2DhB6NKjR57`9KH0l;Ag+V̬!T("Jb#zw،h|̓ ^lCݲ…qRЪc6b!;̽Gt{7Cv.<{Ȏz&7qa*Ƣf)ߔb%c4AP?<{ +"[{TRA (7|3^=tp7͂awMbJ,ĶP" c61meZ-g=rnwض[}ܱow9jE2f-{@+F.<=ʚzm/2Qs>DqݮkbA\%5ɑ7/|kO/!1og+DUDe{6ٻlm6crNiVg[sNg1됳F3uQJ𓉝q1B5Ǟ c' jfCb`fϰ6ZBnr{vdC^zW/Z-zCbG_n}4D-z{,~.ItZE8ġ⠹gN:"X! h.@ؓF*/Ƒq7Kh){)*YZV?)'-|_>YiNwtμ~#Z-rf)a$ƾFsuS(N5s Jup, $1BCGEE)zݓ*]h1S om82D*.\=ޚ;JBM{\{/~'M/ C8 ~>綸{=λ9fO򝭼ww|6C׺g=G!R*PD2BIQQQhDE*P=%|`RDB;~gе6/Q V 4rn`gYN޸oz3z{ްH {Yog{3M9lpg۶>kft9Zתwjpvc PcL(*dԄ$Bb)*FW WG21G1 )fb)pqQgw3лwƾԶfyk[W6^o3g\ {` +e;E7Gzb=\f5B r7W E6P%C_$RE%6"{G墅1"KM"BPD(!n4ٙM&m3`.PsY]3ݼ,{+/10"wͫm;˭83w4 k3AEPl1o2E4BXݺBMdwIԒ*DEeLl(TZFexUD$A &"J68LDrfw:uvǝ^nܶ{go;H!gΟWy^ 3/n73XOiqKXb /~>u&42#EzYdAİk7N'~ۇ: @! U5TEi~0&㓙f=[DEju 50Gs1t@'C?e29|w /;Wwv,kvA*$(Xx򡴻K?OFu".вW9*KXЗ׋,,U:Q_a`SJ.1#i0{B H!0xF[GR۲0|w|:a߂/;6."i4|9JYg8{ݢ7*\\]?0!"GTEKA [ /Hhl:(g*a XC'j"XzWuF.ya_^!D|03Zu޹?-ǎV4/@—KW.L.j٠dqi:s[=lm]oo:45lO0P<uO5.n&hUE Yr.t.’-_YenZ4qE&<! `R3:]%%}}??ZY9zu/O{7љhjDWFGZ;zhm=yZ?k}ݝftRvEhh;C;]GWY]]4JR| `+.[yb \nBrH%Epu7A]Y$,ǗDA"}JxP34ea`^s;|;00ey5C/ oƚT}Ywݝs;nz>ݳɎ!wkbBO8Ztmy=xkmܹo?rd4NuqvQ ,BaJ,+5b(¤mAwa9 #FQR ew}sw/gΜua83軉4vɑڶ<죆Bu.I DY/$'Zm4];9ݝͷ=t_{ieeM _'TEv<< . w^.(= a"b=68jxF^dlUoI:~0B.:w[0;rUygyCchu}gV;С'#W:2]LEdڌ׬4I8NidCqg]u&FRӍ;[>xH,i(+w]$Dm6u"3T K!)}("֮b2d/E۾N=_+nQV͹η=w 1r6c3Y#X^ܺ5vIdV9ϝ+QN:&T uf8yfN;@?P$zheu>'.o_lMᆚTK8i oHM)hYzsb*tC>jq Y,NtvXt2k>[nQҁ]77D}.i W66g9|6ۙhD-FduI"(-O&mγ[V4췳|+[|ݮN6ޡ#ҞPF$3lhw%YV5ՐK#4A)X6e (jJ:6CG"Zßz'ĻD $mnlFg#˳km7Oۦ!0ɑYncyeuJjm`^]u(WMn+w|:7wvڶEo^kɦwhӟ8еnO*oNT~*d1#Y%%P6z5cTqiCQ&g@ {Cϝo 1,{##iZjM}}ךRR[3WމM"c=i+ #M$-VgH ԩ,+I~>~&:vG]8Zfȑ;rdbH\EDN~;][KAĽ_i`y#%k4k+0Ӭ?ct:e3U}RhNl1yw{>[\ $X{{]w>vq*/|䱧)"Ӯ[3֬ߡ#,Tf4)NVƣqӌF5 5G8lz!mZrlәhIj έM[`ZiPLlXKU `2AVc`dI)@âMd4xot9rob|fw6|}#Gl'~seQ6N;#&QF8Q]iҊ!6!-bJ:g뽙}JI}ul]0ɲt;$&w[mom٥ݝ8vJ#~YfUJx-Rey"adyץX|kKo3fċ>wֿz Օ#. J?zh+ۆt&;ѕLGw=|)+ur̴lzdrDȆDoi2rqҵQ7lڭisF#lx$o\nL:mzO:szw7|LJ-%:C@PEDL`ȋW&3^ʩIJ;epiqӵ5#EVKo}\4F_Ll~<"}7evs8U骔oVVƩ'HAFd$!6Gi2myѬ֌ڑ?t4.[CG˲\A·*iwl)Ԉ"FЪ<_%GX̠4Esw9 XPbu´1W$!nfdQ3:~}􅇿_^OB{ muxpŭGBm&Inm2^>t[+g;'9THMF+JhNFJXthu6(pL9Ӷk3tENf"qɱ\w/=x7:۽g>|CMV/Ve}o-Wgp ʰK(կ/)' q}AjUT"$&G+ u"5MKZ;ywܵ~xe%`wgN~Coev;ϧ37.y7i;cv7%N3IMyQ8JzUhҌy5S<}YpX4ITQRW##'5x=.f_|{nvI]?{eU9Z;X9tW$VB@ADaapq$==aH120  ЭVT+a9ߏ}GK`]]gͽ7ofϻO|?~q29ԢzI!_k;Re=>/k *ANT(d{~`2h" }Ji"DZ#Cei ^Ѧ}[kJ{XJK3lnrpXqKozy}caIM~^ mNjW~ԤxnL\=R^bO5"D"QkEP+A|`!:rdEEB)gZ w//}/OlѬս%@~F>K%CƂca4@4A18Dt^Qz:#!ŌH)D BNF%;f \z]J2^ŁztY;r&ݭ$768GaPdq\~ IDATuu@Q`\~Kr>! BE"M҆C*i*DBFĹKG.6çJj]jǫ~ejSe?IYDe֊2>ق˜>L'(BID9?~eu%']sbRXP%,P[-EU7;Sa1X2Q@r?Ǫ`Vꛠ![veCjvJ13Þ 6{IUTY?ȥ@XK'7^t񶡯fve~w˙ӇZ~<9>v+7mݶMO5;^۶y$,B ukadF"`ȍ,KG+4,j]t"(DR i&V2GEM + |Mщ z@7퓫6m/M0TLLdbYX'!cu_\= CS'~á2ݖ4:6q37;o/ٻaÆNQo_79fNm4鴛n9(3۝8s r![RFƴ-+SGO͟W3i07?z]!Si/4uQ"QBTB "PA@ xa;.B2dRƔ2ݬԙ/rPyIBvv@ҩ:&Ȥ6ߵ1]Tz_qe>/Q\zinYf홒 3x-rhች/}یk侹@-;2aRf1駘t{6M#'N<\wccBRd!cZ+R.&aC;qm-MzLıKn{mT(F7V22XwbGЎ\K|#+%)Q0((PzBDiCc#cJTjU!,#Ĉ B ! 4V\ƙaIl%1$ CfNH/k_=t5D<:x &J|dNU}Xm]<[o~giy>;^sMf&,]Y6s ¹Zˉd[HF~P\.(57[\{xܞN 1-ml5H+4^?8td[=IRði9fIz,ugM}a DpIV[]Y[]ZZ?9w^_mMtmuG]]:8ɩJ!jsq|0</iv'3b&iR3NݭgP3@^~f =) "/Jj14Uln Ai* ʡ־~3T[8aQi*qiut,$ҫ,,|X#^Quyzs}% F^,1%D>Ե*Xz['"T`H{P&?Lu$)F@Pf640  _!; -b@E(Ap {s^$m$.I$Y:kF*333-Cj`|_yWT~~‡vki剱6\[NEwR<ȑÇ?~31Ƽ_Wz-]?aj_I^0PFl]avLa?3XۏXz Ni֠*Nh44%&Nm"ֆ↋NX;-ʆMmx9xv+vK^|]lw#9M;ȐIU##c3Ųb~Q-{֕Mnif[ .^"}ߨq 񘵀XQP)4"5\̅@'8,$,p[BV^?}'Kw «*L.sim֕͒F&جCn^ez|bi4_|': Ϗ~|deȩo-[v\zƙMVVVn?!TFM0r z̵/W~+Ug^C,Ȑ%<0Y+TG~r'@yŨ<-3819]~ WI ߯.5ԙ;l*{oO-<\;+f#D=Wgz{X`щ۶l҅(脁 TUT94@Q) ֞&"TDtIf"gs"I҆!=QaƐXF+`-8+,2ߐlP Ah9Yǹ@`0K8uZjk⤑曎+$"eŲC]o~ߞ^{x2p=;qgo_W\s^33ӈggg۾^җe/uEV导{3Iz[LeWqmbj"(4~eL'+s71gݔ12CRdE7.u/sl|| yG-ލZðo?p[ A/PP( HKߚ~Fs& HVJ$s(m)$E ZBvcA">8M jU728 QNg F ŵb&_Aiqvm{%=^ΤV~~3x^}*$ sKw|kOAw?W]yՕgf?5'O/}w n9}Ν;=?̜'}(qbY\H*B]ڹmӵΑC U4Chn{Ž ξ<]yǫ.K^uszF= rƞ1gukrT~hwJl+Nsi̝Ƈ&RX:epYn 2E_M{IbµW\{jq/\==p!/tP,ÒHNn]'Ic j!{ BM I)BϏ(h  ,~R@OH wu*E i0@$s :gq=1ci%v;j&صHu:&\C^/]? ›n~}BIx.,;|׿۾{wxxx%{Ͻy;vOGHFpޛS1 ϏZ7~>ÏTk+⢽޽gp/3o喫?7}]Fifb$D/o?/C#ZMr힌˷?e/|̰qkNϯ<\;+i,tTPqGYPG/Yud0(_Ҟ[lymȄ'Ϟٶ}E>לDEFe2/7MAG.vKg.Wk$'90 UPň_􋾎QPi@c6 Eu;1b94|a-$HHC7 wo2{ѻ~/~j{YWo \S= `Niw}ZYlP2l B( R9ݸ׭%~iYdUgI7 M( ]wI⩙ɭxh̭nB pQCFS 1(M1Kgcl3YL1PegYBM2\F:SD2PF)|X@rO9F/"zy#]qұÇ~BfcBGݒ. 6\8[;"yyy%˲~l4;~j67'O=6l'q-?۾ KRf2x\aTCNR@$B K@y9aPݰ-nDptdÆIߴ7n4o 1`FI U4^!4Vc9ɜˬs.sl i&Il3뜵$ZDV *A7"XA E`mgD 2I"XGWࢩ]w4t Ow]C.N}ϸE/{"-?m ɲla쯿׿/_!(zu ".}%iꜤnu< <8' "c|e @c0Y9ŜZZYg?raz6MO_j~ߜ !HC"b$,Y2 `jb؎vۊ[6(UT J()F"B֊sŽ9av"q8IӤMq?I~9q"=hR)j1JDJ9b)^u F#Mҕ[/re%᜛_;q+EJt/ڰieq;7y|j{y\S6Q)UV_2 G=XI3Fp,N+\46̻عڔm,/XNX,T}e.cpe !r膡0mLzιD"D$qY.MzAFU"X{E2 T H@S4%D'0sv_-NoXn724f$Pv=s)DtYtf,7IDAT3b_5 $@PαhE*tlbTI&P&pLDQ JkRZm<dɅ[Ƙwmٶؑ߸K6frknq.\mRqtp\4=Z{^X[;i U"F%iz~,Yrݼ#DRˍC>B =Z9I+=7잨n;zZv΁g$ ( |"XO!A cܒ&g.řif:McYDH0*ʼnjT s=_=ma$\zŅbqR0HH\SO20}| .ktV[8v/6峟HK3vA"$"mձmT\ f]9~ă+ӆc/^KKЭ8TZ]ArfS{E/  u(+* Kv[׺#uP4N`+ "n*WH0ZYs50cbhlϺq9k `-p.`#K CA[rPr8ED@3$ DP(:/2zK/.n4Zkg]-ooY,<jT4PEgv.c4"jQIW¡BexbW ؠ ŰXmC1)r\'0B EAЭ8H`%Ap~(FFD"Qצ<ͤ3bXZṋg2+{ڮէ}_x^?{n ]}Uo;^VJȏ;94+#;nuguF AN@>WDz#Þo~%})E)C֋۱f~+ZqD_B ̞Aj\})aW*UJ t8BR,G=Bf6J ځA,Q$rNFx4уiИY7s##bYڣftmemm!]<+>ы㉊$kt~>ﹽn7[ZZdnvp:q}5;M #p>6:EB$( R~X>ib3q;:[+nۼintn(@Y׉1Q,gt'N۵WN1*AZ X à(G6* 1sāsBq>G ? r+5'Ya\}Lv @WB.w|Zz.I2I ]A- ?HAQe6M6;3<2^q~ '*쨠9̍}{oDsu˔I#`qf6E/nk~}ƩǎM]tbf3ЕKV?^)ª2g>;YN:knoֺH4yAiM X1u& 48̲!qCcܿw`^(֍qd*"24h<XcЈך+G6[g`,ts*ri$|C HpRH,nԞ3l~JT.{!tn LxIםjw/5:iT4EHŒ.r1J]I$qf&svummǮ]eƍzϻkxTiDkm1Y`UQP!2@!io|Asiv{Y(m9Mx*(?<4<:AץM)K~H:L#eB_o/~[QobA+j* ):Fb۬k{@ѦMۯ?q \{3ϐ36.:S J ~x^ :|/"RȔBO$q"hdΘ a`DT,5 33WX1!jڝ{y4fi4R2n(CF&+ÓãBعkk_Ǯ^r̦ɉx}w8[P>/ " g 2F!بPصgϾo}9zK^8|z#>t^#bd+(=p>R_3[KWOq7im~m 4%F" mڴsdhL6uPk,ZrXX"BҤ%dj 0K pH!,H!cy;։[լ}fAm%`E/K⸛t]zGmߏV|l:}h7vؑ:5פv"̈XɊ@4@0+x\HuZFtfᄏ̟כ~eTy3/qum6o;}]Ͷ}vivhv16a{TҮ+nܾgۆ]{7\BH'kvlyZk|8(aOAg4B`>0h́BSI@ (&DM*t'sz;]cX?#:al!I!M3@TZC`0T*f\D.'26~ʯ|cvna;*6o_y_`ap3S2A8T<󚫣¿nsH/-۶~snfgίZNΘM )-6|ջ;047:pך}Q,޸eצh)r{Jgqqڑ"@hE.i(Hy'Qr XQ@uD *ІAT]h=ڮw+Zxv&˝ˬeNSYv{F;i۩G|xo+)buLR<|ܱ{۞=;:^"CȀiy\ Cכ7L}糞}ùS__fD]wS;B}Z$dR|VJStroEZ<%=s zrzr[]@ϛ۶kr߰)cs8f/k Vi:D{fzz'7|%;QTu枻=sr6zqq^Ar3 0غuseTl{sUϼ&N#/S_Yf.Nwoşv?E"N&JS{8K+'-7mfAiދ YD0}D5)MP?^\[X[ZlͻWu7y۱*vY{4;Wj;fWo֚˭^ײeC#c~_ŕW]ykn?~/~;wjmu~~aaao}w )̞)P_&6~~cuumc 8ys}^w}w$n8G Ms)=*rU҃? EBD+ $B(m4Gi^4nN?hj6ۯgWv<}%OTo G}{wWY2g;uʥjZ~{y~'QDjHf\j4i()zް Qx*79"i!&1)Ǧ&)ɼdM of3Q5~Kዮ):.\4uզg9UUy҆Ț_pyWRJd;TcȲܼbʺGk Jc[kZٍ vDy~f}#۪YxqJG~0yg`K/ll<8aK9YS\N}3: F/dF؀;5 .X U4})dIEbS7J%& *RA$%L\EKnNԀ |^蕯~l6.l\N}=vvO::wZj{9Rjssj毘y1jQSL,tr9T2Fjt46%b/Y.GYr<)vjhV1K,b3t"j^le(qTP]=O.DxmG-[a2wX,va#X%\unpWs}rXᮛpWc|E-QdNG'FJ5k5`$o[p-j^j.rgf6\JzL εwU~|?Qr'~'jk㎚y 'O|N/`ZO=K䨸e7;[nfTIQM]˦l:I)ł+N*\Kw{QTH1]2 {6_ (?赹\շ{eӦ;oiH)ɸyվrX%;>7>f*FxGµj2VZaiq*B^ Yn<5A&KNp 4o "@myvײe3[ T[N LJ%-Yv/ 2qƮK_8e>s|cSPO:vcGO\hi]Tz=>㔜!m 6%_'\ih$rȑwM$'IRuM /f4e<g 'Xeme~= ,jP|$YSٲQJk g+s}CдpB$ c< 7E@$°1b"3W_ۯ^z:9L|)?wU_CxùK>|׍z_$jۡJcf}%t' IwB=ZUMFRhj1R$p̡=vm3ɒ!U# pA5c$A`AvDF%V;g7բ5  V /}fB[Mqܳj }C3F#|_7"^.ZO~_r}?cd" _րGkE;G[q3y7e9ИqT8$VPP7N2Z5Bmˏ"hEIjxlpQk[ʈK7qԎi>k@\"~S^0~9k%,ZCVQk>Fx0O_\D5ӫ7 O/ z3 CM19$|yww3>Gr Pԉ߉F"x*p . vpCG dA!Ƕd3 Y},AU4n0ĊbYIdZ6Zp+FBc{k\a̦aX)o>v]QA̾}uӿ"$n#}asAaw+苚!ZouJkY'Qdt"la!u==ߟ??@`xa=TXKJi7P\(@G$9$ Gyj ,i% 7ZcBL|Z. j>C˰,W "vD\j`36J}]h/x Jl(j)c~8@c[F$8*6dsAZ?5v@ QWx-̵-vy[燌$ca Pxgk#/,BSp~[+?`g9CsHHlv,)t;j#oSCĪj'(<<m]2DfmU!մWy1O2k.}ěNnNfɭ0P1@nbjU3/(gD7F%/\UOtŚXJjZw̶Z`cԎV_7_兊6/gNQc?{c8ۖfUO jXF80UYV87_|~n)TjUY2s+Rs~Alj{%^{gNJĖQm p/↻ƙvRrUEa[vnl+  ^/v&%-FGDd83#yľoT AXu“%n|w8KZ]Kfx`O {Es-ߍ[9VΦUNۡ p : p=|7+'@) hR.mfj#UmJ :qnjN3P;8/2 fG .[w_3O\t1*  ~Zt@o|q=||6H4v];,s.nB{ipHF+RT )TA+HW֬d>" o'rEqT\r K$k/ő폃H9a; .Oj[{m❾D/ ^ [dLi$.ѲyT2:l %uUf-.BO!Cত SF3HCBnmn&C re"֤ORG:Աd|m~do{?4X(YwuNM8 EpwX~F(Jkӊ['ɝ45*0t]/y;XaVo YEXa;WvSҋYV* _I\e27n]2Y C~_V@dE{H݆@xUVI;|{q]z!]ey[oeX^ώǭJ8֨d/\= 4ua >~`7: A,]q붇N b7_g;kVJqu)8=! 5ra?'5iW&Q }rBaG@\ݶ+rtW9lR2=pduyGZJHT- mh4'̲+\)p@fG޾O X1 REAgw+5NҾa- 'N3;P6qG`I51SZgĭL{cǻC^n/Tn/V%;E3>')ns/߾s +"[.%#b¢VcuPuL`-eb^5&" )DN^^/kkۖs"ڻ7IӦY ZAJnW/v><$@]H䏷 y7?3ÿ,JNG(-;c aP%څ}auxrX!%VM6yq.e,à?I:޴Rr> f\ iHG4&5 (awEײLgPx߾a@1s$~ˢ<}σ}HHnmƲm u:Jc0߂M,=㥞꺾#L)MS )Fg<^޿ώvr;!y/Wlq `ɃlС A蒗StqN"ᶘd-鿗eZdԍ;)᣼7RLB%ܣmȠ,)MtEj8|Uq84Ql rۋd=ޭmi+FN>pP:[ Hh6ڑ z.`l$?U\xޑۆV7bYg+W{Q"t7D}l[4z-8[DcK{/t&lXLan>ڥ ґuVt8`IUS?Pq7s:]|v9F2y^ >X 1$:Y79ZFu>SݙYq)ڔpS9fak#A6n%߼^|*q9f˰B$ p68;Z LÄ쓦N|.u%xۆ=]sĪZ9H ۗYk=+kŏ5WاĽ,tN1  wwxը/ջrK׭n qOo&2gjQ=bL _qh՛O_RczmT݆vv[?Mћ*&9+u?n1 ynu#xȐ[v!|MZ|㴜鮴PB#''= !܋n{M%E}#6>j1xNS bGxv msœx٤N{S =V+dAup"}~yq{q/K>cGaxXza;0s8%Hy+V*?8Cc-zg=4w~ƐArGX$iC 9$Xdc9Æ v+\>NΣ{fDpv#fe&= b.neRuX[} %j06~ N(3ʍԩRGٿYܳG!/ W" >wZ$_1`V@I70jö5yBr=gӝN u=uw}.eB]JF !^%:Uy(Ut+`]K 9 >OKjѧsFrN)꣈5(By?$Q=67em;౼-jro3VX/@+{Nx6t#ϡ"x !š$J(&\zOOo/lʧs wu]:ޓC Y*rB:3˃3C=*:=ԾF8 PC9N~/#ttHq~*tE!MOuWrMVMK㝝 bj}~1bfS$:++]|()"!>B%V;\nzzE̎*u42qLvixZꍙ>A*q:sGHנJlg ]+o^}V\W:{twiuF(!椖hoQi`Hv&ftUc80|dPy֜dE<%P.lI^Kq*}{YغRY_huX9SI"1I c΁мIK΅YkiNQXZ1mM[h&Ytt!PV"eԨLq'bce_[Meeۮ c*qybR!&,gW|_>7m0.VŌkX3 `Ns9c?£e:ܰ //S%kM@'_xw&uWCn17S(&%|Y}]uŮ:X>Ln}e f5`эyQ̌, NfAɱ= (.P'eUT3ukV^;bHu(3triH̰𹼋jW٣8e ?$,[[?ԝKn;z>[favcm1`] }pԣ. ;&Ӕɭ`-1k9Y]6UV[ևVWOOůOz.9}ɹ5ꮵdxNTTdQ:X܄ i}pM8g <}^}ҁ-]hhҪUH94g mNoͶUQ7:J-w:a;. X>δ8 D@kO= %P&%زT&yka6{'mC V&p>nxN(5H8{yF`E jNOZRGh&QE<(4'+ٳvx Cv7o+\Hņ%(ߗX;!N)xW1lެz?!f*H˅f_C%5]ŵZCmOJJ8S<#RٟZ{L':\FCo({rzQFz>A]#e~<5J˓r뚛 gAt 1 {c`馽tփP&-M8>ctLpo an>ܵb=~38_c'n e' ׅu >_}n>aSl]S^ijN#SbNpsTfjSu"80}[Aھȑ-UNGmWFe*5)`t+}v$\1-UNYKr)+l"rm2 _iFDBL`YBIPY!ja0 uZZڢ[\144r#й c'#)ya@7{t ybd%K xJ>>~zfuyԴ0q*+z =21 q4vZR䂲$])59ghlDtb">q>.Îq1#1¡m|d?j 6^0ȴfuz~ذz K\`f⋯̎sMm*FE>[Z5JKlkuJg[Ùs Tz=TEXDí3{ߪ`龞C92kA[}~X/_UuvVC=wjv7=!.\QEAW32u z164 oӯyxu"MV*x]IWM-瞧FlճhDpzO-;p~6?A>$8J0(^`=Mvf?n=EVM G~nS_*=[dr`B/yN窒d>dM "1OX5 x },zīZ_|zNgGBD9]!đJŻz-$1Fq.-Siسe"nUu _Af8twk؆ 1Ja^s-%}N,´@' 1k5.sVQ!#5cs,UBU`*Yp1H&9hyh+vΞȅ #cZ9uWb($*x)'1;MY]zz,N(0N $=u^!20*1(4FmoEc`]!MrD-孉-P74 ScG4 X`5-ӯ$3D#۠χI~ぁabcifY 9XkUѻ  -Z.lf6윔T=o&9L=˝5@ɕ /;o3yv /Xݏon_M?hM08E>x'$T  ?xz*])[;]b5D@rU:zlix3F3rO6%RbB$lІa]*Ft|Xr$hWi\P2T͈GEǧVk0#URWnp!iP6mvtIWSToBLT<ш VxRdۦ'=n @KVQ{y{Q__ꫯՅ uqp_X9{clfesDhcp]nNXiED KZL֑=M\zjc(w#<"r :(#APz2Zhh*ZGU.sH{17%ޟ?xuyExgX;r5=WǾ;1sN*elZvs)@'f/#g̵=ՙi=od`%dBy_),wBt'ev!t v8wO;Kޗ \e ksVCNcvɄ<&CX;%gܘ1cOK+fsRrs .y̹< ̹3ޱJ"8 3y ݪ"L3;+#`TlDywrܳܣV6`pC.޿o~޿_<}z|48^aj>w*8kqoXlY[<78FrLiKvyd肜/jP!OEiOXͭ}Js9NJa`S &:88FnWSB]PJe8JVhgTsQ]xuWO߿^-2+ l(_j:bs5>&;C y#CYXq5;W1\ mA8le ;X*a`i= }C,wJJ<)';﷪n\ <=& ?gu<,<gXG橛u×+B{6D_eB}uz&Bh;b |JQӓl QSTCעծCs0R63l#$pGBn׵p}^,ͻxz[gvxhLe?ސVl{:2kuN^U 8 OǏ0ke]){ϼ8B-&4&ִ]̯(N;Y)i;2ns be$J CR"m9 uaԥاmbZj Xs}%ɺ@I]a}vܳg=#ke'=Q v &#cJ~ 1N1;U_OO(: ̊obsTر=>)~>\:z#nw\qRI/νN;ei%]>7l²`ڟ";W%%۞~AgM+:˺?pQ9PJpn)~ EAhkTS6N(]'pk,LvR~Wb %NGh;U8b믫0 ZS/.['Py }Ll*N4sŧƭA3^=?}~߭L.OjEtC9*q`8Yb8@blp\2EfV`| MX7!x4fjթɞy(*uӦF֡OJQZ /F~GqLyEu/Jǽ\ypr!;JC.!iR}oD!o˴k#:Pû1Ů{Ԏ>鐟oi ,AF~돩2eWA[CXTJDKP8u5 i Ҷ 5 n_ z9Z ,%bݭ'm鸏q[Gkܭڏnj3tOnDp}=H} : z+o:"3,C{!PA8h5MI|`4L?&ږ]F( Fvз<鋸3 ƜRn7p)re _(:@ꮥTRw`LmtK{\Yz:^SX/w-_>x!gEu|xbe]тLW@фֳj JAshpd=bP͉i-=)[`t/HVtm28'M#W /Y}lꅭt{vP @޶D cb7St)۽F״LYfRk|  deFŴ5ghhxsSGhUX&NrQ;}R"!.gm1s?O}ũJs(g5oa5Zdx^@D$ԅuÄR$Kt1{޲ȡʲq)jȴ#Pz{I&C81M@qtHpFx}] 3: *}%0?ڻ,MdkLH;l,ޞz+BVP)t}b,Ǻ+M9w eFc.e)hw |F œiv*ÄGaڏA1|fѨaxUQO>n?׳]pܥG/btais坻 n+dt3ֵOT 4Ѹ1R2 ^P[&Z7}ξalk:aC=mV1mm;HVTx@D]PKU CZ@i hWM>aQ r7{xd?I>}8m;c)q;B4W0R@'h5!/3w` 7@ >uKMWf5 hK !b-cG' }ݲY*ͧ=%J|o|$Klv3sw篚C4Շvt2ǡ,W_miJB=30f%?/U˖s"[xǛiiֱ$!Ŋ{z eC++ +N|_Xwxk:0N P1t8;]}T`/m qz?~?~#^lhEz#MsZw Qއ9tl2-yC0@yfߎ o)于++t7v*"P,$@hu ˧#i!Fǧtcsgh63!V|`p!:51 #4TƩ(]~̀+,>"beeeh}FD\}PحͤVFÜБP!6=#'rj^FDkRtv`B=ŎЌ?l%_u_Iv %my7˽w"$x7Ȼ|"Ut=z _DRo?@?Ք^#WZ  NSxӿs-JGNZ$Oʻ⋽".*J܉ iRWU5½vJJȋ$'IiD.TmMVx~ą?waHf}IqB[Q׶=3L)fjaaםc Lچ9l=߭捙E uw/$縉Y'cVFJ0QD{Wi5eؗ:54]IVbC+^.3֮Oќ#SZJJ$):e&yTUQVT^eRh%)l8K7v%- 4wA j s`i:o9% | ˹jRðQ3c IDATo }*>T}`C^n٧J6$]z9A9qPYm 鳭fnJACﴘm*i|s|XX\* XE" zij'N" " QF68W ôRre F9[&{Y>EB* TLً2LXֳPNciGeAb[cz};HRj-4mh 屶{ڛuWxį?__k]/ӛrg 9Iu08/}skI s!aOJ~e1x<>ӿ0FTK(hC[:iŌֆ=tU:Ɍݒփ$UA7p7)({|ʐk۪6+8#N IJ]FZky.>NO[b7+52[Bh PB@k 381܁DN0{-Ȅjm~y_"cºB o??O_߿n! TnLFADCƣ!'\ކڲesBD|8faM<h%.&SX왊`xQqѬӎؿ7twMw-PZLfuw7|ۧ?%oŧU؍-@qCow3lW*m$TT%, YWjacaTOn&PR=uK$Ӓ]X^̜i8}.jf KkQSzP v _B T OX>g~~SҳY̎ Y;>V[ĉA쁿kUzsZҟw/*TafwKAoERܦWLښZ]'HJ} ]d(,V>n.wdӓyUH:=-D\Oe._͇& &0ey*Uf[}n<6a,V; u1]k4tMik`yS&!U6 Q&@ѵâ;8w x1;MxTZ"ԉm= ^/(?>*W˧Yi4jJ9bX=UWNljb6r%V&Tfu.\.Zd.v0b=ϥה5Ώ2N`.)azPtzvoJ5N`ҴMBrYhL R7hU>2gaE2#uץRr)uO&v vVSi##rep&/A{)vMd6yXд,[;!zM[tE06uz{j'Y3b W9TBhbk7siG>ҫ3~O/i}oÏ??NX]o@Эzƪ/PN;vwl:C[cj*=;梀U,RWDž0ooICtS19 )$8J1ܻ#kT+ղcIJDu] sl"~ZUR*"b/҇8{tGK)nYg+*8<yQB۴Hxa:h#(GE ;zݽYWÛ|ďdԵ]:xH=.&$̟]X+:SF.uE޾q篹̸w~0w ^NhJ SlRb]Z_^*\;X%^D들X ؛ul 8:>9epC2v.-x 2ηadAzRm(( V^9dPS@>醫{uq߽G|,ޮ| *;֕4<)],O7b?ISً^IQ]tzc^q'Z'{y{fdw۴lk&j0[bj^k_pΞb՚9h 6-6jV BTeBEkLUÇirL!N<樶GI]38:-e^S%y.Y9k?Xa1U +oe^J嘁fE;0OM>u"~כ_~o=dCv& #Oq1Kut LCpq(W;H@_onNhL5KZV5 -}XϪjUӅZ-b<]Y^I.mCw̛3v;ku l&t`\ryzDC?5I i2 #R2.v̝[tj'2w3Lʡa _pƪϟ>gݞPǏ$,GpNc CW)^{ZvVEMvPյ/>K #nxx}0km"Fa/6kDʫmYk[\ 7e}ny*n㪲1m<@KH{3.#F$A:5gEaʻH'VӖ륅|husw0'yG٪oB-}:au]z~{B>p|XHcco5 Г4d pXYO?[RыCZKxnT9\^o`CAjܱbi|b"I+q}վ|>nha=|g& Kbu9mv~`Ձ߼ KQ/z GQW>`6ڝ 9%e3'72cyiF$VU΂ Hke42f + 5bH#e_9YKKemDMXjl3?!Sv L2(H8"Pq/Mk3"fT'AaQ@V"3 ]!*'E58}Gh oN<{3?<}n} l 3.ԃO*i\YCL6Y"C&Bm_8jz$s2e٨QQT~5 0+mwW,Ecr(D?QB/SښܿR%"S+O]mղjS B KEKUUJfCZ!Kej]QSy m~~m`BP\U g̦LG*;vPt!f%f]_K=2<(d .6l9IY@A.#ЎtE?n/Ϸw# W ^b̼qb[M-fP̲hv.|L[&URz\4+Pj81&3ngJv*#ٳC4H#ט*5fDʠWHf|Uy[2+`z(7dvIjd\&;֎;Q]Қ ]=lQ%ᲲI5plsg>zi{=5qKj_0Rƌagg#:X ܪ<|j9pWpwn7Vmc*W)KZ2rQ U\fCXϰL3G e٥94_0t3M[!x0w`}.diZcni)pEt!#M)[F)ԡ.,Q# *X lLT ς] &F͌l-; CN7$I9tZf kʽjCRoHTUifHN*#NPL)1xN&tO$O\)>F,ūm>MSCc+ڀF4 1(ɏ8TdZ\ʥ\1{'˯?w|~ßis44) ކ|I4a 4FKw "{eu].Ъ4,jZjVvHJiJ;7iyL@U# *+Bjm`:+/CgfMYlCA%+ &X^dH΄e#rxC=,G)gDaaadsJn&!6;%G=ԄD(xȣʵ]<.IQ+"ļIƎ4hdW/7.U.*e\~_g`@x{/Z_ӯ_F  =灶YZbp $5ZuQ<7&FQez61myL.yL&$e[o>Ѿ'ZU124-n2-j~WUŤUF4KHRՎ3sY(ffx4, ެk g)cUCvFȩF22kJ 8^W!-`'u'+\o4!)e^_?e?ل+ AU 'qd#S $6Zeiخ O:w//o_0]t]6qIuJc >U% $T槊%LW)FC h$&ѪA̾*ep +W] lh`࢔OnP+f;"#:Y-XT)$^I0ٶTRBxMCGź*TWk l5 oC9~j;"Le-2+Y=zMQO/9vgd$$K iI++ KDuF0D }pPÀe"8HOM;EMULc+{HzI'C8fHe -ڋ0"FKӌD1 9P/w[1@5zo(M'*OfSpo5hF2\tA4dcʵ)Q'$r8岛d c6r_\^"ٛQCLA=X]6 a^ 40N}" Zp`3:U)H"F;xgo{`, P3;?3} fk ETz7s:HI^"՚Ew+'k+=3 GF"]HQB n8N4=K?#b>2 ȜiDa Y-l_Ò,bʟ/$]]f#4;cx$%gq!*E6֣fUFuc`/W-slo~Fw*tē h}dsg{Y5qq&` zgK繛_߃xq_~/~ß'WO^8-G;W)}`EY`; 6`iɺJv Ck`t4KW:^B]}"aeAsVB%E}$-stI3s9L**5sjiPSB/3DSB"ePcz334x܂ӐYq^T7}T82䣈[G VM6;RZ[,P*9{aʹyY-A7[BW[p;<ܗ;0 7g-o}-J/Z"\A$H(ㅞIZDTA r r8Ufܾq>cBĸqXp׉|M ɤ#IYk˳X~2p|Hٯ2?3 IDATxY6)%Z_³ZyFku* }Ɋ5 ]o -Dh ջz|wo| h͗NS\7nr|Hv$gLL14zovacY,\:،̖wtp \g|هKzz/qa`L–*jhcեjY/ Q9CPBiH,1X_g/w V>TG10 +1ROZY\$Rɍ2H_ ffJG(x6Y` `$mi1y_}ҾCYvCjAPJ%o"DHm (l”qA3zn SPmY0笃jTs3UQ\¨tR"@ˈJrwHryvXk\̖Jg0p'q:Gww~wx?oo?yk~`»3abLΰ. ,'p,=wDZ [9Z z]XӉtmbb%1m2e3L2jF\M=YFk[-Y$K>)>8:g21S $W"mlTN+<%F@T 6QK |߽仿x3 Klb,#׌RSS|޽"wFpjob b֓۩OD\*n~K+s~#R \B(ж A*@nW6zR䥞x3~ dEz|#աKStV< XK3,)h2И[ٌ pq /&lIn%{68K(=YEDj(-LHm\fID#5XKҬtt^9bDzijx :prǂG/?~[OQ")T05}vn6R %n-}i$AК h7ZC;\T.Ɛ!> a x-QEmp``Hfs@kS;?~)ub锸ZH1ob"YU#/EĂfh͚ai`Z, }v :Dh>U;;q k<9ܝpOv\ #*=8_]'C'|aaF2iz"t.XNL`BHj<_P4Yp{=*d Z Ƞᶼo;V t̬>xMK4nPF9]3W3[)6sE?"B%DQhYNT=L*.:5o]<刐XM*ybEݡj ٫BkfΨ,5֬3@nj3a r `w 5ǔh*^bݣ:mz;z9Now?Nsv}7C~)/ʒO'R[9 AwS6,]^UZhRztSM=<'K$Bbcy bk "1t`2*ƠK _Aa(:6? s 3Q/B Iou.y~|{ ̵;9@&Aj3ԀFRu7%Xc' M.XdR^i'Bq)TȒګ"jT|zn5uN4uY{-d,|Z0~$-c !xEnMk3ǂY1F'+Ӓ+-q4?#ZT03ba܉ m`Q(ɾfROv֞NC_<b \C0"3Ih,ELkwYQIih֋|7"=5h v#ekjA̚@KbYiU%P!f> ˊ1Zͳū>lHHNӉ J&FKNgF% {2d-ckF,0TU"zAl *]kɠxJuM@M40b&}Ĕ/]n[pҎ<èPI&iF+ 'd V_wqlŪV)柲!mk,m{04y٭BC$}T˘k6ٳьCgH74K>ubCݱV-9:#"-~ eU"d?CY.|~6yl5yfέ)lE9 cќu3[Ѧ"ul>BSTY, p_ hHI*QSx`&Թq"='%@#=z 0>aH*P*bi)tip0<PW,?7APv.敀X} aw+</>o/|kmSY+`U>Rp71[\SكrLҿdW*1Ih"nN6Ɩ2{TT5)Q.meCiVPq4+N_Rkj3 ,y2OD C_?%Ul&J aZM@ 5 [fQj u8^TsP9B4C(;0ϗoܨAO Fu UfH.(@hiV23kcfTL~b}ohO|xpZ`?|?^W??O޺~۟S+PC ƦB܈1**+2!>"u B3]HqixPf)_H-)Pʭ۔\U0cF93 AW+A 0R*p^XdR}V.uSN03$lN_4 iVWs!>k# hX*gz$!Ų*'%*#aQꖴy̐](tN /7"o=z l0%#CTs<j O}X:(*La'cmxoOo__>ywجy^Lᙞ Ik D<لxJCBMa&_P ."1.JD=zJۣWΌ833D& c1e*e#NYX"sR|$$c+&6J&~sgh8!jU`zrqH j5>w "hQT| YUK61_ ̵b2p :2Ǚ#cCtZ,ahOeX֧r ~OL9*]yܳc[,1,i;O=Ƴ'x򝇿?wwnz7Y^SWzdiBa~To11@(Gʢiu^G PQH$άOkNguϚ&sbw*1-kJ mL.NpS_.BJ}+2!$~G&;DْZhӮj9.ð-P1Xϱ35$Hm=7LWKz`&(.0az>He3+[v69ai) esr,E`0q,f+`[е.cPh6l S'0k@XȊG[kaY HKP'^ %iڢ*%d YOӠxoص7t]KH*a4e2,#9y(2eN)vuĺYY@z.p 7»?ħ?W/{^'TTY0@hD(b[X|uFdc]0r1X EHaø?ƣ}s--l3udl%O{\=KPR%"^4a[WpV`DƖ%y!qڥ̅2-\H"e 鄓ÐUEa!;0VD+өS[LHGֹ۪جĐ-ӈplm |MIdyqӘ56ffZN0yJcյ̳30ԿTs*~IN'U ##F`N>s~E?> F(nJ,+<љ![ `&41)v1G+dfJ@Ni\z[[z, 4k {gK#SֲWbU[(j7QVL`@ne+ )tZe@qke>²Eϩ+L4X9%?8+L0ҍlGz^-,N" jԲ1Pg@ ۝.:%]+vS T{`ϔcYP`K>'4;. =fheP" -U07Lj'gկAO}b;[&!oaK ~x!zCoXΝaJ-5om5;&Lx&PK1[Lb)1K8Tܚ.S !qđehjAÜukқ 蚑xR\V K{-ǟ[6L"& .CK"bQb|H/ʟE+ GH *VApbͦ26`X]]2P:,<(OL:NҜ6D־՘*gtG OCz'xxm\3no?ǿG_{F@x #?Iz3DdfJb,ұt X Z4yEߣufp46cOӪWI/e_2K[-NDxt.ޚ(}T>F$j)KlN芌Z[A-2#;iڜY ʩ8MlLⲳ,VW2581DD5 f˰]ۥj)*Ywb-I(Ǖ0d\w;Fk5!1WGӖ+aFiPw2vQ99"Gc˰xaỌn£|~?W^pXuYマb/~?~GoDrͦ Huyf cb^8v;t/ IDAT '43*=h}ԩݐ9j.$G1oss[cQ MI¨ `iU ;c{~_|~|Go?Xb^T++T;]K ֹtrB4F_,  ;hdGqn.F,Gt%@V)i 9/Գfug̤1EUx:aUU +\gc&Ujٞu?h]o,etkMǓE XGΈPohX8NC4,FN`j5 O=du՝h|CDcdOh1ԁf*pIk aoDh_Ƨ&u v4Od7hl-j4xyz#`V4$)K,_l"1@Njta[%6T7t~z #>?ÿɟWt#h0M!wCh Zkɢ#h ;@5ͬУ!8N8tp1"ѭ9@0ۥZG)Y93fAfJ3!v& ^+AQrs=]٣r vX=V+h#֎oAk9NhbV\S { =,ײҎ y6ֲ+ ᰠ's2)LkͧVzkj2:(FΥGFь-4DF13{h@mC@5*bV`Dg.Ki-M$o+TȲ }Jh{7/)_g'ƿWb['w hj@cvE`hU@veU ' һჾr8ֈ 3PJAY"KΠ\.ƒvS&PJm'6[*UyVӼUa.z|;wOk$莳lc5 X#Iv=yN3M(D_K+F*nnfI,.1)JmtX`cX2Ӹ9uxV|Oj Z k ~uSaDY#@tO$SQlR= I.'Cyw}xKqszUJG<?͚1:4`.hݸhM!1Qean=bzKFGMhML<;74 sb:Yf_+Dǟ?b)ʐ`)-dt!@7zxsZGA>pohw'-a,6'5'IM'ceݢ ȂgJ'bORmaC;M( |W;D;v Mh,1|:KMi psNa#ܠjifҺ*NPhfde˴S?Yc{zy>[xz_G?OB's]z;zшQ-avtjHYky:܃>=b5EIj8w539ĵϻOEPJ"$H]| L,e`9t Kå/'o\ǫRG՘A?Ҕc&~]W6];B P:7|t)}$WׯoGOhf4?rwmޖ%pA_s1x)wq>c}=!N'+0sqpw=pOB6!Em&RVFZI /l.UZL̡D-ߜu[{+fv8o^=}||xu8\q[ z#<nܝ9$$A]X`a2jp &bBITOBڅ)5sgݲ `bŲкOdQR5ـj#28-KqE F vlf ̱F9T_3+O92W5Kjeh8~k/by1>}ܽB7rؖ]WFB>bu#gik |XcځYQ|2<"4xƨĤe_**/& [+qG'qʗ<{rzx}u8/ݴ #u?7k}7+ XC2Xu@pnS0lZfJS:x46͒lfLύ :vA%? K$eWOsp oAs wIu!ez*.P>GDĊq)U'"EP\<0LFA#jxy6ŊZvՌqoOn?9+?O7WWg`JDvkdcLE[`NNg{b#aYLWX`lv25Û-kA 95x p\ұDWFwɲ$.4#bZ8p`Qw( Z(hZe-Ys!DC* R>1HcJw0pcdÌqil˂]?c;~Gxxx_~?O~ =|HP: VÇ}xp8zg_}s!N+s~c\'ʫ膔rA}qZɰ1"ײá4wlR[4檠7@z @5\=Y|lV@~w~ӫվﭷcXoJ>Ϋ~5^kFZ/j\f3.aDĚ /\!1wՇ@oDnf-{; [`myxۯn}g"vzO?~_͊pmcǃWO>btw+WG '^F5حQ#p:G[m@S従M.lx V&y?O8EaCیI0r<\?y|xs_&.Բ7_?z=|~p>V!y@;鍮c!٤b.A8Yx),`u@n^+$ݎQl-m쁖gh!,l!F'AwcXf)LK7WsI's91ZM m6|@1{}ߜcKk~pk=/RXUجZH1[-Ŭ9zotp&ff) HMӒTQ`"6$1(5xbZ &j%f 4ldQ)uNr3#_~K+Ũ66+ETblr^fT՝҉]SF<%C~7sV^Mj#%"%'sۚCFJL3!d{ P$[lٓhĈbDj|\\ˡ[vO""tq?o lTA w7U;TA2B*YDQ 1ȠJvWӘ3ܻ P8v;2 Sb3@Fql#99o3%j14<;:V آd@x|A$a>)DD,)/5B @foP,!s ٰ?3k_ j#h,(AʬU:WmŌB+ e3K(fK5r?~c7l)`֟/>M3 TJS@ AC%oYAV{d8֮LH.Bӣ.D>Jd6m⚳&Je5 LSP;.8Dȹ[ jZ-r9 >"IDU4wn^HZ!C e,¤B4WnVbʨlB`E"^Qo2`$cnNժ lP\hG$5C #cHA r8QkOTZZIKye:j55SUV!9.ĒRf2g!S̜ Ϫ1q5girF`f AjeU&R/U` M)mҰ!W:Z-UR=->>a3%g_~^_{CiX*XIa\ 7m#:S+ $-'Zbͻif 5+` 8|Ł*&fegS ݡhݸ-?)nX,כfX..a>%_ı:M~wݿc7;yB%F63%o=`)Dd@"(q _ 7\$03N2u ưb5UBg_?O鯿>'(}tYd(UԨ:Xm؞ſ,š[Q bdlՔ̒@ mexB,.}>FNVSqiX GWjZ2wKIWv\Nqx}{y>h愔 3Q-omfQrec, 91sMM {TSS'$d !ku\B8(-9n#ְU߶MF"FLa&1 U1&lT;0ϓIKR嶡or$2Ĝ%HfW'"if寧 <Ø bHVy8!U$ hdbEB| yXu7„&pf#׃`/?ǩ`SQ[+w_bWՓy>DbD , IDATV`>Ei<ՊY5g_ 2Y#x̗ F+@Wȑ`)(.l(xXsIԥŲ\^^]>_Vb3RJa{}{u=ܞB*C㧸>d ۟+73"`TDqf{*wr;HG}FfcTȘ[VFh63CuZ<=mϳ92s+V*62rCOel ̗yIL,Ÿ$!gKr,,]JI$0'!jr5WZь. o}#b0vߟ9bGb+4z e<*UZNX)2r;/|o hD{Wͱ'l#?#mp5 O*P%7:~vQOYh̉C!Tlf"lNiٰX֫aW9uIFdZkOiw8VA%^zEkRbgE lifF"#- Jʉ5UI!C4y&w,3卸Q DU\$aTq>{(ޜQe|+R? Ti(MX4\d1S1Fi030XˇܱAL"I`AF&煿)E{oy=̜nk€UNC3g½dҹUn2)a4acddfs~񫟼|?'ʾ>\Bf{`[L _NV\f#>(baح 5]ڼ]}{7t"j7nmBo3 Ăfn̹zZfCtIReNpvi̾|v7㾖$gl4dys;΁*!!Pde`Ib34T!lנV֚6m{f)!ܦ/x3RwSS6XiRIiV-jڤ6k=ihW6ϋgJY,%bɜE% Sw艷*ɈE33}KOHr>V " ES0Q|n)j6VV=mDu}&>>Hk?ADV-j x~=|]`eN(jgú|'_77Xo j#,[bX $:ŠEz%ZQ9{p&gG!D%^I{B(|}Q*8G,k8q(tJrWl.T<<~xq=a%0tVO_/>˿o޼z: m@%0 L`Z<g qM4zJ&Qsn9۰=@?Ԛ0-DDo") jZ,}rʒX8vk<O~{=7ުF` %G!"\}7 &d@6?҉X4'ʙ8ie@+I|i[ADLgrUfEöĕ&SX1j,aP*:JY aEMk(x[7()t(Ѯٗ8hD7sbrԯa40,Wb# n^Rh xM*@s{M׭p-\yYfjZj9lr䔅 32Oeܝvv{{sf?NJAZQvx`qfᥣ.HO"sSDH@ج2C< 8 AA#zEPIgj1~RqKwp~A6rF|(DjjٝUۑ zQ֞ /%k#j!{!/ {6(-VUZǪ L}±HY:Ԩrx~iBJG:P?x+ݟ|k;p"K ?]fZ vm$Y&iܧȼ䞹3)N2t]JI,A{b3k ^R%[78Pd`ib+vL~ѯ/=xzy}7䔓P@fE2ǻݫ~?QzaC5$D\S̤gY玺 q<D0 PvNCKD-of4*$ 51ViUhZո [ 6U#9%56|戙6E^^yxDHWR߁# g_Z4ܪVf;4J05JUʉ# eoe5~7r)+X %ĝezdKk,x@)PShM6Bsy)QeOE\G--5]-r;̞9s1` MDA۲b:ȐY %"ٹHZQL`;!vF |Ȕ抪:걞fO:uCAo/3KF>bTzB5*p3ajUf%;B)?jSeY?=Uf0c<_!?i7xW7\?_.}RLן\߾Z<*}v}ugj"mgD)I;NHǔ#R,. BeNi|l2i1M49M7HnԳ0SfII58j+u9`ZQ0(MI|w+ˆ/t DI4|zipLJihIOc=+:pPG8t0 3S_ 5c=:MjQIb,1 M8olKo*)uqi.H+#/1ߍ_|7YהI\7!6vz\ 0&p:0޽~g~D=w}WpRay%<,WE]ΒR$Ryq¼'' Firբf g{czVJU|:>Xs2tsGo_;3$?(6{,|?`v襓.4HDzF X  0FTe ,V1ͅKVS OE % aLLfB9>^1SsDm]Py o)jRBّ%nSJ wZqNU#`WUl 03u'yw GdSNLݤȘ-RZt=̒Te 9DT/M9 #g֟Ϟ˿oW]W{뺜K圄$ uqeUn1gRۢ (Ea֠^n'= 1`dC|jd9l51}'?~yޛN{Gំg,^PΑ@^R&]V/RJ(IxH cgHͥ jVVS#i1+ s-T+GeVF܏<[9 քZ 0QbPKF0$ˮ'F>VHtq([$>6qOI5֤A-#MMr럣13y밚w1Q"88J%N'NǼ s/5SZ6G꽜_Հ2 MW_?}M?@J{$I,  `XT9Xlz,wo!@xw->u;59>Gޑ$g>Y^~R,.F7|oo]'kk×EqL00G;%^fRZvUVYzW/SMEZUKbNcte |I%tL)F$|?MC<0AX4 P0&R>YG '2H(UZ_녍PV9ܴ"aY ֦#!ޥnYۙM޽7sx\l~-K1|<_}Wo^w:ψ뇐}4íP{R6$i:**<8So;(6KiN|\,U̹@2sN%-ݙldhauoÍ\i]RNZnjgCP-|xX[FSvzZ h[] is IDAT"V@!k#``eˋˋ/,σp.ZUXˌLXTTSΩee)Qs i҉6je$/\t[Ѭj!VQ1j3YqRem;玨]\UsV5},Ml(0* i $xPD++_na ПųP@(u\ENbZ+wŴ) ?(>NOjDgb kى0a?OK [o ueAl0K2BNq%0Ni@^O7/?c_폎t0s *y3W[ !OK{՞Gg\k bdZ硶M|^FIRbeǝHu\u:^pS )1MLLCNRR'R,LU%D8{6\ZUEXuvhe*CE L"`@W-s̠ASQ%Yq~ԫҷ`c2 KI`A,o(1fWq>oA/S[ QzQ.qx &\v M4t<Oж7P QNiL2b8v^_]l-sO٘ISRCi{(DCJRQ~vwoj 3RBQg_⿧b?LO=9M0M͠wf7P`g9U[%9Fu}y|yӫbٯs̴PNG7/ﷷq* "sЪ"0gIK>Q>Ĺ&7߾k7ZYu,VJtcũTTŒ$eJYؗHdʝ3'R^i sq:TXe[vGOT! dHE;˃Q/*( QZ{E>'HR|{(PsRwR&vBa@C;xNSH;7h ZbYp_INIZ، ,N!HN]( z=G[c] ft,0 op.;7|{`wv4"`n %3X tءS01ӈcto']-WW CL`:ivvۻ0.!x)I:IAR$eĝJ h:t*e8TNNUn̒Iڋ-VOx#YԳd^細s"};d%',o?og>K^>TD0ԍlI|h ckQ Vg@իE;U5FfcrY?ffh"SNpZ^ޜNTÚYX_*lYHz!!uw$$XH Ҡ`=iyi?qNEˉhfJuępð\7D^]-_\>Y.=cM@e4z/6ݓG<<,uw~wJ*Qc*D0&VUW2=aJ`EA+DDRwHckD؂ :iQ],֑`nVqk|E -X>(+hDJy6KB1}qwGO.Fݾi`Y,4urdH$>O2]߽yiBxB?d`?ӿ_?y~5X㩏ɽ D2f]\d鹅 fvaZeQ8nyruˋO]CcbaR/'i[|Z]_o QA4ho'HpDţ3k1k bk# 8U 06Ed>dlDցRKߖ }0U$8yEdf"YeecN/\abɡ͡O,)Rfq[\-R̙dge5/~u۹7tʄ~ev?ǫo}?_BoXd4g9;5Dۥ7+5l&h 0JERkALbԣ/\]|bt\ ,,FVm.}͏_߽<OZG8p8gf!ɹ)[neJH'DHE$f]\j:0o7^_7_~ދGNv?pܟ{kJ^ڹ `/W8TN}h惪Z\aXA=8dIJYWO>xs=ܔZ{J-^B!k%Ctƕ9M`\ZD]0♐ sRs/4H7M' %Rx\"L, a[HS0ZY]5uiȎ+69_2w˜)/ŷ%aa"Z-?{s}4zZD~_i؞E#'5sK AF܇ј7 b7B;./<|v~^^.e'=KДZ|Gon?|}鰷Zq֓=Y 0$t3sd!L)'k3d";OLa2Xw~w|߼~3eT-+H H-1A&THD6P4I,ԙ,$rۻO֏ 4oOR@Uhk|5CnJ0IJ2N`ǩx<Íwb.?O6+IBtꍈX@U&XR0NDmd TbX 7"! ``ӛ (z9Mg2bD08C:ߚfP1˙r V@`JAm~澧A:el)k5 `aJS f@%w|o}?<ڠn*.0wM=b'T`0P`A6-R !0LH9뫋w]|btX N:0εvwo7/ԗ,Dg$0s"Ez^rfa30z&{>ŪE繞0~TN' H&jg_03%qHv՘33UJ{wo>2٢﷥>Zb3$-aZ,xIUJzR2iWӼK'O+Ի ft%&=a@5ԩLH Dw\JtEFm5km4Usx759D>i܎iuJMzAEX.|2wQW^VRMIyNR:Q`N\O;aӄʨ3,Ϸ?w{׎t}Pb!᫟{3xq ,́8jLĊ&@"K$Γ(NX)6Ҧ;h3:77\,3Ui0  1p"F@&H;L(SMJ;!@9dx3xM+|KJ7 Sj4GLj],>S?o}G"teh^r|q?7~'>OtkV[Jn;,C '-7u~]7YqћySߋFDe}tzy}7$.(8nvw/>w/J=:bp$lXĽrIaJ4x4a;/Gi>VnD-/~|;^yww劥s>D|wjej2XU* 7ЅL`rPצV;g8VMeBg/pL U LUB <(;9<0%D̒YzH)/;N7fL/YocYva};ŘCe@HERMQ&EFK  j@'?ݰF~dnOj XHd*#|Z~D&@q{ko}66+hf=7zCA! 4q_~wu+p o +"0BuU}3俹x:ֱM']rS].ƹ˺Uh/0AҳJ@{?|3ꨧh3%$Rd`Lo1+18EPopU>n||x|Sɔ$F$A#bNA FBd2u^Ru{ݒdS5=߀ Q}GDCfO-grM+Ɋr> (>i]FFT5Ȝμgg竣yhd-Da6*L)RUHZӀW& S׊==4ޏB]8x-"X)Y;bY }JLZ!G^Kz>] CɚV3gd 픍uT>@'u@!t Ekh \  @7KۣV}+(#ۿ.g珞mk(h9 l>yޭ/zҷEiX5iŋYՅomuV[%RfV՛׻[PoN0)dzQ9mÎmڬNgW )7#H/GIl+ ʉ C5ڛT)"nJNgG=oV"m6dڻ>JڣUAЫpR k M\1y*~ L_ηZ >{o7Vpl,,/mV f,9QQG4^n jsWKnzEX~5iX>E侍`Be^@* YC/ciR0DGzP=zK@ '@Hn36*i { (LG !qt('1a].49 ŲN*<ohX˹/x2A%Ts_,zp珛XX@}e׾MN/ջm{VfSm֫R+1I{wb@fϙAH DeV~cٝr7)Ef@$JӴj}^8z~|ڵ %`&0,Yci_mUz)0,˧) b[vu~z>xt4ڴQn '&RH3*hsҰ*H$Ô ]m.E(uVcCۮl!e^;F+BVásuΰ5YШ1G".ۢ`e6nEU]յMT׳rA?g$4=}~bUe`)!bvQ{wkAY?b^&BlncXnEiu4$SI0H.ykht0M,&#Jet 6zXO.?]~Z7-Y9#1CI(= {H}ҟ c\ӣuiڮZ6uuQ !od(0 U!&>"% (Xb-2y4xm֨;lmE_UI9dU)Fh/&9BFb0b* 老TD5B%v ]ۆN FU!>:;ztdwoa9NVE2&'L@wث\; }E޸#mhX @L af1hPc%= PI\ fs@sz$XF5m .>vԔXb;;zJї}Tu({&~/ Eeڊ>^8P-V2VH)"T i*ʀLT{;wv>?>G"+uI.P5vޜ/gOBHHD9̭f-)M VaR]?#8gv]7r.1"pͶTA$FBO|fتm݄鎝Za26fM ZgL&ȝ8NKH(l#g., -\]%]ׂB63yGȽ<&j0 RJ:$}? dBin$Ȟ/ DmaUFGPH uK"[Mi9/<ʼn +Ť+hC(xjGyZ+)~ 9dYW2kȣ"{}>j!F E`2܀˽[럝r\]5S^n:j7AZ$ EM!NQb^ Evݝۣ)ZD(*1v]7Wbl[W`-Yfk:-ltA[D4"DER14mu.ӓju]*`C6zI0tEa;tb$f ,H7OlG9( ]`+ny#\ΥYkODZcqhXW$9P >]bY3B\k$n؍4d %+^xBL #h0jC-2;]*k5@-g&7>!{-՞؄8 0tixVIh, HkF@@BrmnZkJLH) ;tM-bH>`9鮧Pr t>lA B@0#th XHq#lB@ n[-`„m$-`,7WO'ilC]i=vq4~w IDAT0!*FB"$&Q{wǻr#keQb]Trlh]*08̬`fd[HL>{9E*Q hډvjKۥãӋ˺nQQ@l's"hm#s])IQ4Fﻝ;oh2ӝ6-gs"123Y"f e5ٹܱ3JA6$TjX6kWmVA5,i&F@8KF%rquvcV޿{OeB:[^%  }Q4zz ZRY69)_}it{ю4H~gIY&+Mek @1XcЁ9}ebxK/\ $ 1X)YC P /a Sb)h.#5X3{m˳Aׂ1@ 1-\]wz깯[3 (,J4R>UI(˦ٟ=NǣYY BfuX==]<\/@8Ψ(8*,(sh :8P4J!TCSwzzv>9>ыM݄&u%M=JP?qNC_={$ $e42+fYl֛QCWZNVUxDHe۶sEqGc\F䬵c,87s 2ZkˢtYт!zJ0+&b o߸%2) N:o~L,͗/ETHn8 '`N\am^r>.(C`x{}>=F#z(`|`D1* Y6;TiE%6(1@'͉euBiՌ B = Qii@"1Pd0*`xn~e8^Ջ zD مwzꑦ^ 'ˊ{_8Q9qY7[@ij]gk{R/_{^WO.9LPTGm"vH/'@P4=}ƴ/z Bd`:8JH@e8l JΦi>]SԩdA `̎I-ډT:`M Q* c2T #HAq@bsJ&0鰾vĨ>`]\߼Yq{yUدR.E#HCƺ[;o̦G;y91Y6FhiUZ˫E0@IcƠ5d 9CD$ z#$Һҭ&`bpUEŪj|%ܠ~!6z9q"@Ec%  ..Q5"e=Qlvn;☋ܸ9ڽO MUZ- }[ǣN8`"64rf:r+p(ZfQ4K/mʲ?j,n+Ld>l1~|'ˣ>{z$ad[wz_ZL~q>ѽxRxob܍{KX k[@Drlf !XL$mAkF* '۸ Z5Pr0j9/ Q+$N8B HP\_v lZZ?4]AP^fu=i>\U"E(K@bc}>1&jQ"&+c,p#{soknYL٘mڮmZmחEؠKdLd4y@L1CAF|'~+ۍJtug󏟽xzr^۔!0[3Ntsw1m% DJP%R /jɳQ*( 6d(ەeBee6,[gFPbA=W-į}vgӔ2"}`MZ ./f;{Ϧ^18cyEb躶ivSvl2%JaoR iU 꽴T[mR7P 7.gONO/EJ+Є$義9Ri=ɲ̤*!um׬fSo׫b^K,#1JIIS4PyA|M UgLP "mb>~r]wOwмO|I?A(vSUc?8E08oꃽۣMe&hT.NCS| PCc;:; E `nR6#tuYv3JZGU6˭4ƇJg@ ??YϷNC\]M]=r7/h$hS\%KP$!ZQaAҝx04I #21l˜K0C63,TЦ#J؉V!IuFmL@)>3qE¦ |'2F!Ơ#*zP$K`p$|\Ib294B5 [3r8E@0g(dpl˜$ QIY'|TV 5Q; %*RD$` 4N.!gH^c @bsoǪy N1ag3ݻu ˣe@YZP7P~;79*?'fts0YQ,7:lmj֋f]G/&ĉW AGٶf7n:h<:E|||zUWĬK' пoC2qap-!4H~<d(19vvKZ].]-=/~.!'o_Vbp|xPeaUɋ hwF?:ɇGt۪>zq.mS?~? mųxz뛿?gov^d_~bķFE@W%U lqC9(G'71 dk3dHvd8s#;3)CS’12!B%E4DE Bt@@4F$A:hD8K I$wаD YJf7eH7 AV-f:ƛ4:TH5;;pt .] -l6';_o1s/B0l,ٍtT1@Q$xj}UmfmT$柨@:NknbUǪ S!H FG+ˏ],Ky!8GW2$ ^)zxo%Ĕ(Dhxo޼g|OΛbsjy6ۋ˳ "s&SDb磺ZUVw~N/c\bÏ?яʝNn̷VM7ѣ|/Qz^ЁJ~] cVL^iQnNK6/ΖV TTklx\/Gt2ΗiquzemD#N9ۛLw$Kg1w]ӬUl7Է (Jb2iZzN{h|}Q2'CzR%%TfާWRb eH";jLb>_|t4XJh8;ܯ.}ًg_v:6>齳,1 Dbc{u6>Ynm>72{o7!W~>(`Qw'vS՛7z),%n:k o_??wݽO?}w9udYuPoIϟ?0PSgl*&@bb`,;54X:DGH31K8P$:#@(!:Ԉj{͎T$hA؉J Q\f⌔ @ U#tQHsvB"Fـ nVp/vw Q!*4m]=;ܻmz AUAQ%CX\"pxߤ=]&;dv0MrUi2F|[j=oVE]~ThH"^E^ՋvV!@PTmP$P2 ,|Ϟ?_l]Hzש_ 5^ץ/љ7k AT XO}ղV~]y̾|Z㒞1[C2 ]l<5uQKs7*t{\\7f]l6藏Wg+/Wvk7O>=:;Zm1t\g[w;3ETsK?7έqO;|ba(pÂŌƱu& Yg]nYeI#IKDr#WC5Dѓ.֯EE31F/IS-f|WfڟNb:& ˊDڦ.v=Wb40[9C1i ]&jTh$ZҪ gOWEӆ$lO~/co$×|` !_A`4u~$ǿ/?l.ٸKg5t8gGntSӛ7?C6V1n;_zΟ[ŋG]ۿ;,w] IDAT]O t\T2xRv-Z7W?][ E榣8n3lʻW y__ni{0qUl3.3Zt9R4&p D 5ק`ObBU2ˋ "FL>Iz{[u(|**()P F8Em=7F6ji\c|<9˨랅nm:`s2 L!Sctb 57v!f%7T/yz..-d@K`ҟ}op:9$rJ;*ovy]^4UHz9Y\NB*U}.BRRbPBo$#j@;~v6mD^ %Lz]1^5z 2&{:;eu0פ BQ\=]?{!X:v3 -t6~s|g_hϬV몭~ج4zzDBzqUO{'Ϸv<~o~~yy*I+F?m$ B@Z"hMn+Qda3?q6+r3&!fB;NKwgWPcFYalgl:6F E,Ts iȀ ˰&]1_d&&tDMυT$ {6p r@"8bbc2[&6AmO13XHϚ9ɢQ.mдQ^r0 @z A/!(y-kϘ _f|;rv[(h?35;f{E9T}[^\y@aL&PF"HPHA Hm&$\D5cuDh+ǫ׏5:d!2i|z`IUt 7mx=@^/^;'g ckQK}P@2M:I1i+75FdrF1(`U Ŋ(r# 4Mo98%UQ DtzM7FeT] V4hb$s8]UTАq䊼h36 PX*JlK'0o5byQ\  t1Ar4u.7W}]ojq^-j-]IAh) $2" 1!@dEَIITE$]mbQo.~74r+ˍH*D_ o$-gl+x\_7>{k.9(dɷB<v4ae@ht? Tڎ{7&?/"/g7v.s^jP' Jwq\yY7k7_sڜ,7xl[./iZnTgvlEnc(8D;bTXReH d})v!ـvQG`PB1QЫ#\SZ׉ZG XO!ޛ m5yS< lv[/¢v۝Lwc>] nA#0Ca`6@0ymk #)'wZ%OmZ[#=]K΀:c 4UgY1tChMgIZI%$0Q <δ'ć E qHdct}+/㣏_B2?PO}%˽ LgCiRD@A-D]`u|:@XTԖ`<:rh,WNjr)ۗw޾w߸ ~'OYf݇ٮ[M䶜?:ag{H}dlDDGb8^u\I9chQk qV":,"83%F/zXyGd )ULLLH  āF/:hCbN>Cb^"Hn"M!8F Ba]w櫕n+l=ݘfqba>:z@ځ1LֱRO/`;7 ~^b'tYeYv91GUYsMII"< ~3b,E25&ʱrϴZlڊ(TffDܳZ[0̗P~]YJmͼ^lf/ŕu @D(mO9g ɆܬeOdfYd`MU_Q7]bĔYDd:H ߻b!=fK~=a.m^Ӱ^e6>D`BRsm aG=4-6Fz{RW?S}+;_XoM=9|g;r,իsǧ/?I矌NjŠ Î4s?|TԷ}Y7wv.6H \ބ=0)0ccv#K~ݥMRkb@vČy݄DT\QsH` *1bH) <[@c){9h(.``QձSlʀȄتUbZtZWo]2 TGI̤p{7;_Jt@Q !Fn4k+Ss𝣣_{;^b+ iYqM hz(+ Ǟ@TEb׵zmřєMiwrH9oQDϹ":saRatxXi8yr]Ip[l[0geCm^@@~޸]דeu-4.maI-_./?~÷>??ѧg?[AWڴ|Wojûoy|{>sUywyU={7;]^aÏ?'N>/]?_-_4M S1F r@j 2-fg>: Eh&R DSRq+Y6um쳮L 0:@@!xu !fgsM6u `kִml2-9_ņ&e "Ogb |Wb$BF珞WW]La2D@-$"ڂ%31aYɟUPv0g@X P2` !9}\2I:$]پg'~owj%wW|7~Ko?7̑+w[d?OU???O|>]]]H@E>}ۿ֝ 8Ly1@H|޷O.^$MfSVb٘7c6!+%¨IT׶l޴RG"%MnǶoSإ5uVtCDΑt&գ vܾׄAd[n c[ ""9"Libvy9Otr؍I &A3TE1TCqt$uLzBpDINW7w D$m*u lPxp )J5mn7rQױ,*P&d/` YAY"#mw`0SE٬^/%, 1||m wc{6oSbHO}Ҷ/4@ۼ}`To>4λԢF]'h];f]cB6}7} iŋ/ꕤV@.fg}9c_@f挼"T"eq%*^iSOPW1514C^G9T;҃ԃ:)&#kni3M!Û9%1%Y\o,]Zr_]&U~ PU;Avr>p ŘJ:iܗ*%Um<62õ!ޙ;!<ź&knt@=6dN$IꛦiUY5u^&u %{I0`?3Ȇf0ALƒySmbvvڈm}r֪-J~a4쑓_Lק&l5ɢe^3&T>ve؄+Q5]xZ{cq=œ|W+W~k?_Û|}rտyWϞfFRmtT 9ŬJZK ? 5{9;V.0"<_ߺ;r1ˋU7G(8"Hx^v I{zI腈@HR()%$$G$}~:ODTMYqAppbs! 5TB&d#5[n/rp=[}#ЁQvUSEHvU$D DC42Şzw[}*_81J(&ĩھ‡e{RINέ}8:{v}eM.6ͦ^Ym*Y+:#0V8d4"fyj9:k(ץYi8LóۍB+JU`4Xe !g~Ptx.3|o7W cp;{^( 6зji:55 ZSؚLS/|H[g?}7WCQՓOW?,VD5{|>evBĸ3_ǧ?^/}UP|~O_}ѝXgݏNGt,cJh~g\T#2Z %%$K$%QUK,Q4&32ށI2 y W+Ϟ3̷}pܞsl(_4G}9)HT3HfʄDcDvy~xx~2r'RXStLr7 ~VMmtfӗG7fW;(z9o7 kzn6}NP#yC'kaƶ"HRD TBz%)d!Zݶ]jƤFWfD0Bε~'(7h 6ބIqpߴ;| Dx7KQԑːy]xo:kr8L7'П>GB6u$-jBfDBeŮ^n!:h8=yx{4V/_<"qvC빻dA#GiTٗW{ߙNn rh8RSĎLQ8V>.u}״avk{1fQkť>aCT* "(CU0„r=9q튆Hـ4Ijyi˦rW A,uI"!S`.+ӧQ_؏금 #ji1)6mUƒǕq47f{LJ()xŢOnvp1;뗗ҵmJ7BD (GW z-G0[U($T H@[ʭ5t{yϐ{۰74խi(0]DU)ցCR>3_G!7}n^Yoa#ZcvI.9`/Xʕ B)YKōPT֫vu3;~]m.W$E3*cIJWOFey0>J{< 1"C6ēyh 7X:h+Ub!EF; eYE@AR 1Domױ_9G>T _T:v@,@@@ 9M\M}胺;wջ~s06"(J",T%D{1uHsdWq O[y Mva2shﯚp\ޘ~ y( Mc*QN˓%l٩lj*~ј" !:RucL@ɼ#[:D Ñ 1%Ѽ#pee\[C3}vhf"JD3J-8s!s|#.H܋"Z/KB h15hS TyW1:( ЀuӜ\|7nܳ$}6>^LO*{QUU4;qt4-f (ejB<,#x@&R4E@!#P YA3OLdє ؔg=19_xCpE(cr\t i9=]=\>WczfcR5S%դJy$pH&b98~i#Nú*?DMK2j6|~G崹⻞GG{wԭ^6Ŕ֪]aM "Cx#fFeH!&9TͫB 4sHr@D&6 FS@G^ۂ]W @T=1X@ $Ȗ̕hig,oܿsN?{v*# `X+g=0mo[DbQ -^-ʀ^p"f"$fD{cVr\%#EbLf:yjkN:s[S dLā%|#v߭a8jX=W`P *|VUnϜ{"D3:vKǕ$i>9;fv"t;h`-WI8j4J@@Ą!F8!C*'7vξӪoxiiK=Ƃ{[j9/Njh/{uצ6pqAuTs0!0 s\N0M&[ 3"%TL  ̡sdL1G0xJdyb2dss:\+/&p}?400ʳ~C>R6Tb _^UU4Gm"տχ ̼ق h>N֟\| אsUvFct:7{o/n-v?eJI1NGuvTuFWqҍ`K})>m 2DT0G V)BE,k@ʣNhӤ$<e?̊Ub4Nd+}1M9mNNg,O¯pL#uu=R"4fBȧ,HȄDЈ2G"fT4JJ#LT&ȡu\f~q-&N~wfu쒠!{DBq(chG "`O䑜#")uB9(BD ;D2#QnH#v[׽mm1,0m[2P } 7[2neĶ-$">zt *61*d[0 ɳBmD` 9~.}ֈdb( _ IDATMo>B_3!3U`zx;56߹usT 6HE]Mnq( >yq'1ܬzH;nil>]UVZ}s?Gä[yu/R . lwy a׭ZeQBML8n]b/|WzѼ쭮h:M&vq^4΍Esާ MR 8R # 1bM6@rXW#2%E1C5UQIIR).5Ķ}$!NCo;>NNgˇ|3qtgF1sa@34!Ax9FGȔ?g!2QHiR2zDoU֯!7 KWJhk}5>Pߴv毚=Z߸=s{&}*(+gaRqLsa9'}$^aP3ycU"bnlP &-B (QLxlpzh@T17P>u[(ƣIUf}4C_6m!l2U9_]TwO.ou*m{mU<$#S!it鍟OϖhCɅCEQUUYq[+MmuWͥmj.KS2dWU#fvqլ_!Em_gdzjDZTHȸefgd#QMfi TX2{!`1lWRҨ}/KzݭIQS@Ep`V맋cbS*Q&i(FN`P-EWa"J`@y2GyK -SU$&飴)%Lkalh, kڪ<9`GU9ڛ)geKC_m6˸XAӿ~wM~q(]{Dܪ` %Y3GL;"Ğ4'o]#2@Bb*Lh@rHH] U?HLTn2sbKY1!v]{@<)ʻ᪯ hx՛!8Q Z&jJ<__zq%K"^04h~0}A3SC`$o&@0Ӡ`PdJ&6hFOˣW/O_>Y){EyI QN@"A[!8ixlmSL])i&%BuYfmؙޟ79~2}7GLqӦy>Hśѡ+V _TEQ#Iԉ 9ÏhH@Ȣ9%Dcq\+-(85Dl"4L_ 'om{1 zKԾO\?pR#We3hPL]u޼J9~0#b&gt8wnNf焦=.l=8(bI%jf"g7g;O';1c6Qf'JH1,&#%a j<W`=xztGEwtӝTx{#P)Z; Y˲#iIA-CIPsY"@u$!*' =95fc7*x\U;{蘉Cph dEK+@aS0(sSBUQ3vھm:NEj#2Cr:ݻ_1HN~—:i/15\(︢y& $R$148C>$ǘց!kPJ ژ&$$ruo';rƍ{^>^65f!!xДmX^lLkv]s-WA@LNL}'Pң6neg``D6 ;ۗ__]^}8:hK[Gx"hpM@ޝ*Ũob1;]͞ϾG:A4@/գPIjvqu ɸPhqcwz7>@*2Oi@s"t ԰g5BuC%)cA3@ Yf[< 7)QyI?Z?vvx)fuH8r<-xFa]raWHmdxt[DGQ dC"dfx+D:]bĢX%&.ލv)G/^<}:sVފY;\jzn<@@ ݻ!՚hC!:[m$UI"Ƅ]蛾oc/HԏʤQ}2.,ٱ7ݸu\h#nj Uۢ*,zmٛNU_?k$df;4I`*}-ۼ]oD3ݜ4;YxY#Z-tۜ :p @H5b*bLǏ_zVg/V'La<#ľ_l]Oɓ;"]n qtSwƻ=?jo<ǣiq()%5`*eH=-`\3{a>r-E e r=y5xu|2-9.@M drsw~4#v;LE>j0;p#ffP#A17Ǥ+493eS,/NN?<{a e19 wkSZXy\Ab@Kd13sn#mCr~,d1ZiOEѥ Ib^T!Pw\,׆F͈(v3HDZ d ,7\']'1;'&uwb򩏚le  {{OzYc0 3@7|[san!f2eD[-&&&,R-`wgߏeUΐ!pױj*4!#)@ʃ1mG6@QMsW̓$M"SۦSJ}!PMS&+&I̫2{C8عwL13&TshjTg[ .* ; `HQ$aL!gptu k $$BoĽS}2gͣ,8KzF> ;B3pe&So{u?_zTy: g}c}_~zŕP+Ku4Y[_mpMwʹٴnhy8j& /K 1iY- !:$?H?Z TV5O9Dxҁ ǘ!DCPKt Wi֟gٳt gatg|0^#`,`*{_UQpf$RJ¤``ż'TxtX+s|(=T $\Op^T$7jk@ qULƻGEbzq% oh8]6g1j>lKJhojLs-$ Zh2;>i1m߷FET3]TM blҲG0bprZ(}`{WE?hogl\jT˪ q-;0dzVH˶P$D 3*w'ӝ}?}֭/'_<|4]AAoW`oE_18T (JvV@HjI4& F "`!PPp@ :ͬW<ON_/6v_R GUyxx0w'j\Q#Fuמ,/Oכ6Y&(=pJ*IA؋D!vx_c"`7K$ -6Icc沍5afmtR>ڙxIqSkn1Ь>]׮Wf9oe쳝Ei}QJtـZ4{I i -HޕĄmGlXut@Hu8,vtރHel4X nR!#>Ja |<27Ȕ &D΃C5B*G֋R֋q`;@3J tlN# p~zzzuX3r?x7ϟ=zp[j=/Z}sf}o)o39[oMnV*EG&b1A"P@Qn $)_J&"hch*d9wW>7_t18{._XArSLv;jgRr<yX}oDK[5}g9"8`&"2uMI}k#yGf Բ@ƀ9&3F# ,hoڮm~cq\H!"GBv9Ϟq ~|'Tq$\\,r.sEQENb@b @ 2䘼EYQ@GJQU/7U {={6p8qXjӴm%1 @5Z03aah9g'6W[\/>1֦ @hx{ԴVc٬(hunΝ}x7v%7~z_q|WyD2Yww>8~û7FU RDFjHihdĩțڼ͇I] #$= ? 7X#g'ZxYt]d5?ݜxIH[|KMSXzPapx FPVTj%ŦYy?I2(þ0,aQUQ',Sc׷M(k][؄'Kf"d|!zFOƌ:?E߼x'8ݝ,- pkRM` Xr4@& 8K) 2{)ECM(@;YApPM4N>ͨ8r ƇC DO*'eK5$gjjjjlp }l|OnקE+ܘ𫿷<*}lXgPY7߻ۇG1bK "+m2(JD6L:C 1t0ED`Ei;1y@ʓubz 8.ff-wI)D25WN?ڹ);I* Pg x_@S|Qa(֫DbݦK.%BK"S136qhcUD$=P#W;?n qFDJcLYX8Ɠ+=Fw>{L)>!tt2`]u5f{r)x &~dkJ1FTOʖc(ܲY9'ON;݋OWrGw/n޻?~-_"N1hU#40(* ՒPE`p .UȀ`۫ۻ+,u5}?frv! 1w-foRc"9fC4^TXP58`I`2_>WoGG:?bQx>fE5oETLOG}]ҥ ,q00q3gN9x`CN`(ƅ/L21USO9KeQ5Ua+>^$-|4eӔ4hZ-9h!c-ʲlƓV6엖ZcuD0BdTTj=rV9% ) b&k cN ;o#r!$a9sJRF4D9O,)0gr@"vIqϾn?^@iA8@܂O㻷eQE,;y |۽aD2o,8 h]V*!vŋ}s%?êO)(PU:_Ÿ]8h]$)WM]y|_|>ӿ|7.OO~vgϾ.^%o٪.'h@_|ʲ^ge]gEY'u|Ylff4@a8@psqwp%_͓Ń=|Wu 5\^4-yyl, 2`-)-ԥ_oWfr:oQsWs $LTu PhrńnK1IY7KXw.rdi4 qm8X@C *[@gKW v9G2dQ`&Bcɳ|y}m Yk yy$`HdH05l+ʙEgQ l 3;I"E_$G#+)b }D"feI}\} @1’X@@ n@:^/f/? rN*@3!u7Q`,z@̜Oo?ϩG$@!BC+&9$-]ZWVoo.a<'O^YLUU݌dXTOg' U-,6@69W=caY.ޟ{^>~bp:OʪO?}k1:gz|+0~7Tt>n#1h8`Z; tl5pSz}2%ܼ_n?w\}x̻Jx_rNIRm53)ݲ۲&ChDS:֤"t}aytS hn;l)ݾKxoF!H\6%{Dak<5S*}KWT3<1ooֻ["oBL94-@|5`Uu0῝Р-X@C!됌!cPY(PIDZ7)x2P j{]8dќs>EfN.v0x@Ru+ N:"@~G_OnvZB ^4ЁBz8-U@$Q|p>)kPdX}YX;T CI##BJj;O`>94Ej2EYLf & km`9zcK"ɜ+QO[ ksVY_=<}/Oi4{|wWWdWB^~~~%٣UHVIP$* h {TVg*D7u^}ww/]!{Nyyr'ۭ^UU "ĒBc8Z-jYqԒ%c%Q9tѶ#RH])oۻ>Үm#'",CV~sdA918lƣ'S"+c r2:AbAuYrT`cHIfVQ2gT")(y7""C +D5sqO|51rs*ֆPQ‚ Y ѹEܧpvco+u#w=ݾ9;}TՃ?y/^vc ak~OY4]>{UFUU]4@*ʜ3 UVZ?8\\_VϋLX_WD,eܧ)t#C)JNznʪfW]ٯSHy,{cƣ!r<Olܴ28!ox[faC9==LqL ҊF2og'@Ÿpv+sK1'paB3ć2 ,s :G,BÙ9v{ ,Ȁӆ} HdK!9B[fld9&UCae]!Ad>vJ5DtQqru3 &Q*@!$)br@pƒRLe$qu aB7h1: $зUExߝ :N(YLfɽr=&u[吲?5vGM5sҢi&lp4.)L<4Ei̘@'W6ã(vvu{wab{y8=5l_^?/ ԓmE]=RT51ƾ߷˷ofQX!&1q$\MSD"wݾDQh:yТ*HΒf4<8Ӊ ( *FȠ5'ΑaX)>v.]ק>ǔA%&2PIYRˇ}k}߆z`VG ᱰJ ELx 1eN}zF@zU@ q1m*[}_.鳟rvǗ!AM^f6C TK\.;:=rZp[֖%ʡk1ogWr` rhlb Ț]k _y]%ޫe_=Drsm_LFI9m@Xr,6;Wkp9"PdzG>|]x'I]mH,d{m(I8E]EYPulc*2y7nޯ~o71拊hu۲Q4lqw x\痂fؕwC췡0媪*W2uA];@ZnߜOg Ct;oowE } qyAawzZ HBpUc)C  $Q@EU5#U02`-OhMa&#`dФLVQ%&P! a6f*-M=U)qŃffcqGW t9B4ơ EkP_޶?\>[|zQo[o߾?W>tMMA~ wUUsH{(5ZP91V\AޥCb[?9K{#RèQ=ո)Y:՜6tnff}xYC 3&Ͽ|Qʺ,PAG6scv۽*#*۪,sS}9[\4E,YcVc-Cs 0ұV)]m 3!Q$cHra*#1&S߷OYE8+@V֜SC1'FR4Vd Α.֚,YUuNN_G;55 i5D{~M?c XCа$Q[ݪby쫛V>nv0g}c/>t~ tQ۾H}{wطDK+v٩EE>Hz"2 #Ye BBjBV8v&(@1$.hnBʱ?[4 SƬݐqDG 894 th UVv—oz'_5tg#W뛛OO7]^. 9UE]XB 9#?*99_-G~̦͚Wͨ6ucœQX\uy[3WO~ѕnO.з]P%[e_NoU8tql#ioC/-E B@r{ssl2kꙊ3KاpCYYtǮU6kDJd h9uݡ=t}o̢7:g**HdA0 :)&2Dh2sAEDQᜱe>[A ED3  o|PAXjg)9?9f|*j9"_>w)(U%ʜby::f^nn67'Q5"fR6%MxzrvqqOC!>MƏLl X"c3G)ahYT82`1njNITaȤ9cI9}@ǀcg΀ErHa2Kfej̚E8>8yT7ojrfCSP4LdX8",9KQ!sʐqBj35'돧ΚbPz`@묖^~ūn⛫t2yy2ת!0)vs45V#`vo훳źWw/^]v墾~M-E#HI-F’dBJQE˷jAU *1eɍmFey?Zѷ_l6--0/x]>=q5Yެ%& 5>4۾MV _[c9Gf?gpUR]fNE19)*@]UvڔQ//G'a:;[lqߵrit[bH!!tGnJ}əY3Y7O6@a|΄۷qwsK%8f٨9rQԋӪl@!cARlv`^nWn6F,DI\lC>n.3#U 1@f}L9hœ2h%%;v!y0@,l, 89}̢ D),ɐGt,%ȑwP<sicTsdGן#bYeUч_{_>y,*b1|xx7-fPcGJ c׃PVTK`H,{ִ[RT00da4eVl/?ճB'6nu{-z'gg6x,063̜\+39#Qn Q[Y|v!t: ?n1e"\-O&9&c#nSDz2j\U-&xjbg3P]0^Vr]Xe~q\1aSIdrI ID:MANmށ>h"1##el Sr%vL=8/;=+9,H-[(g>h_}6-^G㦪u2xx! 1q0 $!sgXk\ciY}]x/6onӎ_5}c>}GOMm@Aὓn/}{ЇjcjFl̎r IDAT4V bR5'ݦk[SЮE0vEPgp:>v?7䮻m#VQbOy^!;;(<[m]o18eY7U=:+:GMp"*(_tqk ;G.;}!Zƃ'ڷ {<bR)z~+"pt;њ%q3 .j5DAGb*Yb}v䜅£ yWVeV"@,]msvq}re%4]Z#( Kb:̂8.T+ &Z4>nw`zW]?y3;zmUC>$SǮs)S1m3O!*)qh=YU=bcTuXA0K{H8j;ztqD61eŔи|Fki3}"Fxk)6dh9 O줮;x/o~']3ٟ/<;Vޓ˧ c=u2a 9ft/BulbݳLmJIw~ r7Wco s(Ja6=z#ꐌ4S_:e6fK_5 [3dRuϢHef^[k|5*|9YSe=rIJ_^7o^H4<1Lny;7U5j7~%"hЭh O ,"uUV/<|h ѐ,9s<L0%M1eFg"Y@ cB77ukm]U a@—1%rJ)sa"BkC,!m&$L xc]ʁEP]37RrDC»b :VG/^]haѓoL7_g٭]=M{QQ0Y\ή3-H %Q\ʛ %I*%@Y+u,h54-OWIRdBkhX徶rL@IcU6먰dM*%f5 C-Pk i l\uW?7Oͤ>~tq4uͭ_||0۾'bBO붡}[s6z~r7.umf|~ n=Y!%29zjJMӌn/ً&{$ v<gԧt#0wƟU)DU::;? !8?)(Ǟ.}~zunES0p~>yP '.'K}׷-U="ED6️0X%T Rs9DcȉP !39yІޖdxK")RdaB*}e,!SUxZ4+w"= lģDoʢKLYE@Uy#T*g-NsekCր8GHF(cº8Q  $0Ĩv(a7HbI#gmEzU,L_ X㭖~B])P{ ࡴQ$!!Ĭ%[( .eKs`Dč|o_/}v?4?_pE=z8'},mQqXɶhT(*lkvw:[֓?loN缇ܴ9(>>vW-GsWxGIݮG}n²;lˢB#Gov;O]o]v]{sTAaܸz{1Y_,N__<0d!PFk++*9}{z O?oW7}{SWYd*98m ^_oC̙!R{Pw5P!Q6RN̜bIz+&gْ$]JD>V !SC:F࣒Z 6|f9T;[v=kXKR5)"z^w[ a26R*TJka_vm0;q[oGѹvHNc nnk'E.:bl$O󑔦̥Ӄ"$./zȲݶzI11őrj]DP2/ B-gyMZc9IfsZ} vڦy1RFѦ8A;L%9Gz1,6{Zg=HfHj׬ղ^5 $IȀHI""#e*c9Ff&+Zw~ſ#SVk;H%~C,d`?W)=T4HKU2Unv5++՗0?ڇjuj{<>*y LcPXQH9Vi(!JHF` $!r( jIb$Ҭyznc,}WYfc Rki- Y+ŅB!:Vu)˦^ rߋU"w1_UDQbvgg'Þy]; ~t[ܿ9\N/7j]4MPRZ+db᠗X#QB RPB$D!)2QdK|%b D!H!Ҿ 1pRxE߻SGOwwi=& `N|@ZkFy2a0onnf<!DȑGNp`Jpm)N@Q S6L$Ӡ B1p h3pϤg#$ H:!Xo,Y+>H @JH2B %|}d`S4Ik³A IC4!Dהq} )iC]Ƕ,oF#CmĢoD/V,-dc[@lMp R:ro|,-x2uwe,Apfucb3?><`d Vv1:#D(ͬY  jWDAASZǓ+̬rU춛,FZUJr)%9g,g'mh8(v·]pMKKŬ7C$wf,lMVeWve(#m(ԽLd_d`hs>}ۏ7 @V~:ij{gӇirR- BTIGQMb& PwL"FF~e@7qT3mr*.v]tcPHA0JHJ*)k)%"Qmf$% )Y)x u&t,XJ%ejOW/_շE}'?o-Dȳ<8_ouF:IW ㋧ Sb8 zyo{Mx=9}DE ΅ B(TF,O\ % 1M]uu#2 @h(~n(0Ktzыgۦ7n$Udr:O"}{? S~OF!/̛ex9L|q>ΊJzw?1>`zvҹVہREobba{&1Hl9]y-)zEۮVV(C |D>$54ͥT6nkD5nvs$Gއf˱D,κm7.jƓ [%ε$,PJY19tMlLL\owwWW"N'$b[_wzq Z)Dh5m8v yHONMM.K@P>Ǡ:-91=G:l":I21/"U(xO hb;*.(js]b `kb8׉L6AU8P`B$]1M$*+W>#B\@fJR{X֫,u]Ad}%ޠ YYq"Ҍ7*M\]׬&p;NJ 1\ Y,Wm6Yz0z[ubƣs>dャaoڛ|=x9[,ΥyR,2ӞI{iz[6R(Y$mNPu*jiVj) $ PVDE1Nz'٦\|vF!6uvm͢=$x7w)foLA O].]kK,^'IgW E>??eb9&.FGa b!Rh21,fPRAG2xr@f_21*e!8%$ jQ$ JNdVxu&PZ6t,܋q NvIļܤFMo߭/Wܾ9 ?kݼ8:j=i:Όrvͮ\m?WeW};'JĮ6n0Q4B):_P()m[p32O.] (F'n7 vm[P(ۭgXJ՛fYn]My秓hv gv˥@ҦIqt~B6/zk\muS6j*頩Ѱ7E<JN/$s߻ڤfum]Մ3H߄:  Jc4q1em IDATjԨAjN1mlK-! )Q]J$?l[J+Gع$}$V`N(dbU 1::URy}ΑcfbRD} HEDN@R%3yrH*L2bP*FքQ )( hYi!HT4HRJdV [ԋgn{+O~PU<[;qãصuYvgttD:D}{' J5ճfqsqt JL1jv]ۺz5 GO/Ob(*-|uzQs"ReV7>;I}pew8=ц܆ꫪs%clFeAdkc!@o4NVZHN/S#! dYnC^8aٸF >7fT*I@:IQ?EJik-W*2Ȓ`TeY ) %hM0ZڬYXITOz6s #)DyT> @$ᴗ2y^'Y?M&y?o7jE2 GGﭪK~x|Ŝ*Gm.!HY /Lj*)2:w,PQ%3uTJHi\Q Z4 $8ĨRF!FU޷R`j?B 4% ]}ݽj3?yqRg߅r===.|8P)7s3EQ/3d͓e̵QyZ`OOOLn֛jf47~pL`Yb5,]$C#Cw]s#^}W__<|f['] ^=iIP 5q8::8'BMٽ~&@4mݴMH,jjѷA\.wƤG'R`/W; N' *2m^6eh+o$P1&y>Mj}&՛ֵ_U` Ui"l]]Z1~VLFh:ANK# 6b v Qi&!;0F%T=:NΤ=3BUHn]5Ͷ21 B Qh8{jNP؞}@y>Ec*h"0 P"r,e{4#10RF  $@hT"yHZJ%B@+b%=z@ȷ)-02pQ%J,IJMzJ~ږӧ'?M>{`ãD/JDL e+xk:m24I;z? ctM#WV02-I/Ic"{A/QkQV[|uuup9Q-dF[pԎwuZKkR!FJ C; 1gAVvK[׹rYbljݭˮ똣.W$I* ,|l\$3ȇGOΥREg[6yݭf n6U]\Ύ?GZiq+3d_sSB8@+adO*K/@BȞJIP;y/7yk)2xj TMG촶1:DpC@BFT'7NUv3nͧoPGݧ?<B,>{xZ^-WWVẞq<%I]U,0ŸT"D"Qd~09<:fu_/jmjry1=BveȽmJ:T T W/@M5 +Bgz[on^4?8.zvvwMR]nfRj8<=Lq^Ҏ}SU6УQ/_~ՃON)`*Aן^oߞ?˵s]6 F-ghx/oMIUѧRdzpʈ l7i>zjrљjݦjkZK#Agj}D"kɰכ{Yuhvm[v6M&roH 85B2¦۞ǑBYkdT-77׷y*#]͗2Ͽ)BJ=ԺbhVA#RQ(Š$ HQ0JQ 9*P) qR )%PB72P#0P! T"(kW@`ml;!Qv1z(HQp1$J+]p25t{~}󗳻_,x{L ;G'Gqm:8j܅~C_5_ODYI'X :?zYv[Ϝ'<r/Ve 󳣃IvuKF^}ۗ7EnfYͳeG2D.2jP(\4BT 2hj:  ` D̈"i8Z%H S缣H JCYR@z$ #9B2P:BJd(#rB 1 [C7_,Uuu>d8$Yq!Tھy tOl;gz㛦.wӣv__?v.KLvTr;ՈRkBSHaRQ&KOl&_~Xa Hj<2y_2&N}$.w0rT )Pd!p(@IX HHA~v7W_޴=a}_1Mm:p]{nӵA1~LNhcvܕUlyrWS;D;F@9_m&8>8YU<Ϩ^7·''cY%aQͺ,HZ[ 16wB0#j&E*ճvܖwN6xPGVtp08 ^A-ۮ9XKMSu&y/?g~+ivmg B/w?雷??};bTZѨ7z;{#D`"$Bi(82NR-ןWwwMh{秽$|hӞP9Ha[;WC1ERj؁5Ů,w.݋J%H&䩲rwi'ؤp*YFAʺ~S5y#@~&fo{ /~?~,fd!vu >Fda@Hb'G`E,%( R(wAhM1"PRB!II$)1FC17,d@Rr(% F[+dyBV$FXrBƦl_˷/^> Ofٓ[~`Z1D'g ngv#0Vk"V, om6~el]1M_f:'ҚfS֋U>)| ۫66zSُ@F ]vޡ:IufuReYoz\׵beЖ%H]պ7>=kO!b]ޅS5f.MfѵR,ٮZ*) c죇{O.+$|0]\?_ﺮ}xiZZBהm[9_v:9G훫lJ$)"Hǣ b4P 1JG苣LO 6IrtՎB|VlH<0`W՛HAPeI("ι6MG?l8H蟍z3j9KXaǣIPR2|wkN2q(6m Vf5Q8OLw+R%FVHTIJ܇5oA*l-$1j` pH,((DTc,$$PK QT7o_\O~}5;MS^L +c}j7 er> i:|XVsCzyi b`ߐ/%eLEq{(ˇ7__]/0}?]4aHf۪?hIytbG)MpumJ;Lg۟?菿 m]\o8|-G,"a0!P:I>9KXϯ~oZ'O>?>uR4v(症m^hDujV.mFuY^O[ce(Z/D~F7_}}d:ЕIbX^obP636όIРJJ%"ͺru}uΨOGL%z/~?:>=.vwwW7h%%7n$<9B2ߖ/޾US "p~bg'DU53x8x`FTJC]d&F"%2JR B{ ! !d) ܆ 1r$& `@{i=?R"`d@1ćDiumݫor3}5!?][cآ:k|t؟uuGyY~gϹуSyVdzuNLbUb 3mʲ8ָRˤF+e#N^vvoQbTm7ה {Z\n;NTԻVԘCmR(R02|Ķj"c88YcL&S.A6Ly;KClc^b|~7|6 ƃG}\ǞGӾŦVDMNZy&.׾vB*zMWi!^v0UB$:_Y)%bm8,߾|yvo__ǃA,{ڦ(Pɣn~پ[Gg e//<~z4:Iins{|z9.S%dtuXnW5ӣGe†V&B%(# (%Q$#P{H 9J)Dl)DFDD#!z5%R8J>ώw(3L v~/?*Y^Ũ8d):ʍVsְwhIy:JmwR뫿ZLTGׯz]vA4Y<\w֙BEUYGjSJ!L3@L֓yWdã[NImU4Mu$5u IGIF(joGGÇ'ETz*7/Hnv/rwr Vi?>XmwFbeUZ6  TBlJK$jr1ۘ4iZ c}m E2hTd ]1oSjGB+)i RT&T|H e{Rί6/$ON|#VmKBMB$hI2 kYwPDWnwuo_,q(_F8rj~26" ciwu6.>͎'/vu{ޣ|\ >hN/C,ﺾm|Ddu5u8h7- ġkhy>==.OGav\W7kI,ɋl2+'*)#I,*2yQHfڝ>Y$o? 5*Ɠq:gE"vhyifW^Nfv1O (!f'( ]RXΗ}Q2eYe# 2ZDq.wEϵYoQg}C׹owӓNI1p6o/_o}SP7j?=[ǝMŏ_^hZ^GcD!0GGcJ=PD5"$@ 31HH|/2R<*bf@ !( 5!""GfZ$0"b@1D'2Ⱥ^mÛ[}t>B`evW77GbRTW\Lfۇ~:}%_//׳V IDATnw�nvzdb/zP|_o6]ӿϗFn)I"ƣipwW5L,ϳ,ĘWdv:b>6=D[x1/uz].}i%Njf4rt3afv4'B7 :0Cc Ao[.FzXGdŸsM] 1- g"/,K}qTc9+mRwOԪ4&5Zɶ}Dnvi_OziV`5XGnmB"_X;"}ۭ,I,1Zݦ(pSߌ8YS0wo߼>4ր;_7k5վ(Cw-ϿO,$-$u1F"H  *T B:oz4FA|j("%%N@PZs8lI@K0 92҈'`D$A<@BA$7!+쯞}2 9gYƒܬzzqqzt~2Z,QMͿAg>ٸ8>] =^L"z;ʋD4!R=k^[c5\[,ƺX_ҥ/&D6LV;JkfQe'Ϟ\}wbJߔr,ts:H<߿ƄǪSJ4ƖelmwN5t߾'Oq}m?)WupQc|5f]kjG$r6MɈH)2J)}p]7~r,5WrwP7+%b:4v"dezs|V ԏ$O6]ccĐ6΅vhXS)c2 q7i;zW l99Y}v{V~ZNGIR9j;n^]{19d9hwM۵ucSn;xvr̤ ػ(8AEAD`IiT,#BP@@h.QR(E=$  ($$4x@yk_oBM("DRZ @`9Y:Mmu[SLӣŬ(7wwF4,{~vX.I*)Y*wvž߿p-Os}C&|wX)cM4"Ijf1adS(:AM^+ dl#w%2HO65W ѳݻNgQ}su3[& .ջ*I<_cfֺqS,t*}^'(e b F` AP"]O1$)hU9b*l&G ==?-m׵2Z'@Of<^GasYtCo0#nU,IIry.h_.Jq\\:7kKkԖM|ljh~&/|Տfuw͛߶glĢʱ-즺7 yW77mvZzKof^}B,>ivKS(08A"#@`%D(B vHAm`Ѥ#*% & }^{" "FaJFI\hp`BDYHa@ݾw7G;[ 0$Gdhq@+Գh~4O<蛆߿|rfSd뷏VNB~؍JpNǧsDlb#(C4eD'@W4DfQ9^qcU]œAcًea &P߾N,Y1a$l9nAWVFS$Jb lVdexɹk Q>0uUh~ph XQLZdYY$iO7O^|rd}͝(Hb阻Nl7h-UZd΅i[9b &ZY~&p4?E{JӸztv0t=ᐈOEeaIDU}m>rRhh1lss\@u b` ,#sȠᭇ("B< :lI; HPp$ ΩB$u>x;@!F`BI"cQ.8A@R0e"6o*zz{/o~z ۳ϧGjo::K⸈1 8GMd2]M+̔ͺLFs6˫|XL<FDzW;@ H-. ,C%w`uq¶͛wjbK-OWMg"lڇd:WZ}\yM|f0t/^~˳ɫ̏c4ΐ>2 >2AM ˆ"L{!FD} gQk,>:fVȄb4 R (%~"}de1Q⁳CJ4fw߾[}ggg'~2Ϗ#iY9_sлrv,?{~|1 @-&by,dɓ fVƦVgƻ1w뺭=w7g/mownqگvD mLY!b&DLFPUmƱJ>,)1CԦ(LjhFJBL&e6̦Ck߼zt1-S;ʇ)E~.'JiÀ69 (r$klakLbx,Ioo~ojT95n]ɲq&KmZGZ/2#ibCpu^Ni&!V >8ƻM_ux6f:Sp4=xUJCQ!a|}syvQʋB"Tu]M|/3  }h6(`!}H$@cfH H {&P# 2)"B?A((<\"BvYg B" DAfũСh*%U.Vo bl^'?W3MK/f~pMߡMɔ{~Z5D "]9iwQ|V,.c(1PXj !ҔFaEd*MmO_˿\Ŵ(_0I]W @kbBI:X\-R@.Į~}]UrL,'<#n~?eY̖ZDG J!F,"Nybv]R$Pi]</ͪeߧ:{,r(~TM[u~`ij[]6-cfPcD+qYѬLl6? R̲j̱ 5zkvCX|_9gݷƕޯ+;0i=ON^=}rv졺\EDno=^<z”6]6C|Ͼ:cTFxC{4 Rt)3 z@"dFpțA-(Qy%DkxPo"[b} 6 *DAV 0F":$!LdHkE5ʴ /tT "11*Ҿ/<}}owGRV(OFea%BҶv\^nn!EW__~=Z38vBe*Up:5Kd6oK~zf" }qΥebg?"vw[-lR,4OQ@n{/?BMt\u#+NN2ꢄo~[$V0x'&M'<ss(&Y'JԳO&y[7&nl>fw8_i^LώE[ε6-=>Tblf!,9X&I'@MQlo~foowlG/!hѴɿ}/| ]섑I0bP^TTJ˛1F # 4ڀZ"Q]d2,D#( ,!2hB(cd դQD-BLI#zC dZOOLR$CVLy}{[(}-VC-u^rU1=WtWg/iIJP\`ً}۩ǽNӪ,O¦)Du:W_KnC36OXe2mt2'_NN(}5M>/zͳ?OǓTWd}b/iMf-&BbZL';.LKW׫zW }٬~}n0n{MS=r" E9)w懍NČ7(m֦ܬdՉPw&KMî4e=?Cʪ{_e1.s}Qu$߮z<^\x?xࣰwCs#Z3:ǺbB$Z[By:K{Ύy6|n\@Z&I~>Y^cU(?\*Am.EEff]$01j fQTC I Da Q|fH@.>C`3BB`TDHH$E F t` (tw[U8O,Q% M5i2з?~.]7BϦ }w<*?mSA{:Uwuy|z4-/g_͞!67n"J u2.CBT>2C3b~doV-CNI~>N"4ܶVF)R&RHXP\(ǯd(e`+ (d:NMiݬϟ~͇f6Z<;>=ì^m7͛իgIb2϶U_3T-[Yvjvz|:]QZWu^y\Iw"Q$ڪ4"N3etv۳/OE.}l;AT|z:GEpvS)Y*GdFv&'V;?[L:6B)=[]ɲE6Q82Ě)>ެf_NlfYz|tŋ~rJd )a#G,GVH( hgG MUDX(4DQ8H2Q~TDL BآE 0Ґ*>Y7Vnu}[W4,?ݷx/tR?|١,uWw(<Ҋ#;:dy6,D$Vd(l>}spYYׂ3hBi>v*RUuՃFf&jWy2GDRbI}{\7/>}p1ġ mz W=niZd'ջ!$N 0Cp!nӎXd4hgko/]W}qc$Ұ8?,İAP>,( H@D2h"uWu{Ml՟_W<^ }!xqass^NO ӥ/\ f$%1 Z@U4MR3T;I*uHccZM4ϫ3s9a&$hS%WɈbhk2H$z dIQbDv}_5^I*)l%inuaߴoMbz<^>̗b#ݾ͏FQ1LJ7ӓӴHлfUo֊ ϩKlLg4#u9)t׻Zoc`Rc|CQ:6zc$Td2:~5j=|}MI9i0C[sτQLG8?{[ѵ*Qz:Iqrq:Ǜ2_>%jnb-o?ZM:t30 K#yÌ0GbTfA2;`$bD0J0pt~ﶛ!#p#ϟYZ]Sms[WQ:g4n襜OV]}HH'&-S;2ʺn`a_ViLbbFQ9>ֿկ|<}}o'tGS&) +H`LiybvC\]u*JfixDɒٲL CN[,&a~p3=:ZGG?7*w>6Kift.~mof(+pˆadH\}U{,?/~oLlAz= k F BvE kdQQ6] "gaMH sA&I$ >N:hC;vX"&z *M 5}7WkGrb)U=w c1þj`1QoB { 4*&_g/&dwjk9j " xdOUobSsA!aaVJk$F"8M]M7 C_#t8-eAV䳓bM:,ձT,J"-Ko*RFi2 #|۸BZh49D'yn{xauZHӬ'rGIkvC{j3f dA}[W7"{h)ѤqDBC*>)IPRmPkeI1]qpCum]7H軾عfVf[%0><4z퇶ƳQ&W$rh?yRCgԳ׻Mp[K·t#DX3#G B:"q Ht`0: rGb$&d0QdDQ0 <(/D ЁDx9!xH3 (BҤ릿w7mxէb1.{DPmzWmf~0&9|b9Q1>gaik7@\޽Q>])"Ch0DYYt`h9jEQ9P ZyV]uׯGtIfR=()mpCD2J)2j$$$z)GA۾)jm):Z;%nkX a1<F#$Pքc"R6)rdDL 5Hq=Izza~"걾}{Gn>A/gӧ|_yZH0C@cGZ$H0tC n\gC? ޻atMյV0 C4]LW%Y&f(w"t\ '\13=ե2## 3ߨ@ o vO?M_ZHM^{:|T7I~~ͩknϟ釟~fC|>IS?_]7ݖ)Rk"*l4j  _rd@ft Wn+u Ϡ "xOOZhjhzA_2tjP_V=cr05DRy|8~*a6K=8r%xBǦjr`nw{=xw~ObLgQi:LU\W"xeeHl,U낓)kب:" R@?< (74cYD;1٫+P@ՊJU+2rUDq9]d ye,Y$)!mnoqNNlt| =AR#jchz':_L||ezw)~&SxgY?AyT˸l{onfCT!ךHu&&ksCT%F@ь P^c|5X@LHZ0!#`gAL. U}hfu^pDν@*ZPpte|uݾ~xHM9B 7+\#H+ )$>\!7]ʹ7@Hmhk0hDBU`LI chIO76P k@>wOg'Z=#VЅ'V]"l@ksDZC߫霗9FMQqa`>F!ntx}Þbl l;< 65FmKezi /T?>J}ۿ{i4PrrZE2Km{M}y3{ܦкR3D7\y h!0'k#5y:J+c&v٭\H@zQD"@60 ?(o߽m;02AbvMTtPb!dlƞcAU,L *3c6iI75Tȁ!Zsߟ 7ow[vUŔ QZ1,xB$FZmTbY cQ9?~O/ yPg8L)&iy饖"!mݖ#.ٻlIM 2\v\|j 02%W:w7޽xw&tyDf2vF]J0u !rcæs޵$ s3n5fE7dLB a)kg[ 8DG4Y\>s/<=y|88L) N'GkE 4Vnz!-0!pΚjaUj !V*H #3Sƃޡ$Y?CX1k=!å ZSj-z6b@QzAi%n#* |iEN!rBԪ/ӏۯ}~?|nVTt`ec "@yզ3#Z.& R }yE E2v9ZuPElr2ey#V32=~8]7,,y)6MJTApR \ya f0M<&1V +vmy.V,O0_7Y|>~}tI7ֵŽUǍ@V<uVӺjljlTs.2/&n Srjz irskVIӂ̶8-sĪ 1 xRLlh2)@ϼL(R80A]&53eO7>:=DԺ+Z|"|>?Py$:JivC{sn)G怈Z JUP.eL @AR@@bFFƑ׳<- DTq,icͳ1*#)b]_ 3H_F^ϔV 4UtH64姗__>nww݇HD(` Ɖ|RTE H=Z fVGOE&1CxK|rsUI3RJM(HS/< cpE7a:5K2"hhULۡ?O_:hڅ;L2.u9ƢS^oO 8.9ϧϋߵ!?'b*0OJO&aVV .e,:2.xξb5!TvSɜ5ѺfYeyDm|ۂSd0vӦj>9n;q)gK>5i!"y禥w*CQ8>g $Ibh1קgQ|A4VU.W3PSS4"d^UIdH`! d,ƩJF$B"0MTTEV",+3#b{Ԥ*EbH`V%gc^o}}`@S ]S"#91ٲ=&RG2|<~yzr0yX2OSHvw iA[#:dUH2TUR+/O?>??<)YQ"JE@BSDh9du X0L19%/qNS j|u9j`K\]d)k2fbHXE} A$\CvMl9ϒ g"|ٜ.7>2cR9B}s!v@Tj)y0<~|9O< ZkyJmZOs/v>5nZyq*pwU4) Ͽuo fVj"UxUǪz$C3Ÿ)(:wz3)֥Ow@T YU3G|5Q@W2 LPUF02x.χ_Ͽ?A04zEq\\Q mCei(Ss.@7@msbYOyLFLa{E\5}.&xߦR΁L,23fMmTX gڄmRj.ɍ<RgYLUmjZLc˧<7WSxsL!ALĄ;vvV+W Iuqz: Kpɪh@ f^=]? Lh~sr> C߫UbxCeFgbBòԥ7[P^"`i BKfiv] rݾˍOٹHl@<yexr40# 12QÀ9(ͻrx9f\..އi<.4Vif†6_?mǾCt\ZUI+ ,XV~t `=񺅁ɿS?*bZ`l ḽ\uyD2&#DUj xA6j`jEFrmeHS?>ǟ_ǿD23Hۅ77Yj0E5SY܏}]yHLvn!e2 HAm$WP$$ R6.N)#NnY6T2E/d9xHh\Y^L9FT &0{ d)IءgeEoY=Hrasj ַ <>3z@&:XČ0Cʾ-Ia.ޛ6zo50ޚmp1ri,L}HJ&Ǔ<\K&W;Fl";TRCat%&4\ZoXs[jykcDԉz,RIJl]pj%Ϡ;jRf ¼v;zj R0)RPsdbvIDATvRBrvw|΂mm y`'L`0E@yY6'ta`\6aL4OR6Q(z~z7i*8nE7e)bVr^A_Bpɹ􊛫 qvr9ǜ*Ue,eҪww߽mlʲY973CdBWnH?LO?t ooyny|1\ l9JfCJ]lRyD@-6%88$3mR[+J.Y]r6MchֲHLmwt[Mr<1 @#@GϐMmT`Zam7] VA`m 9S6>ӌ\L{#B"4r4 4$y:v'Gre@)["5/eOɵ1:2yɠ09T,s1\Ii77M橂y)jsEy?~z坁c"qlfnο>ToC2[Շo84#"-ysO[gJ7_ۇ(a0ݦMKj{__m'&(huk P /̕{J{dԋ= U/{' 3 lE0 >hErpt½MP 7u@Ai%H*Ӑ/^&t[pwÔ,+> qGOLV,]mͦ8.[ͺ̠GHw| \tR1”03 +RUPBѹ13DK(&^!&״u$.]mvLZc_pbsɓ'2cUYML̊^8p5Yfi8| bBӺH.Q 1$ 9X@jLVAӌ77;& ~sO}ܶ%a80楔~<|ynR$sCw]8hQC6Semy T.߄C(2M.WW?5[lÜ38tٹ}_M jEQRuxav ^jeo*ftƢGC] /9bhV1J9CDCZ} m%11cSlk/ VI0!7\2 R8OOï_rs_ܸn^Gm!ͮu]$4< Oӗciy0nBl{y"ZPy, .0iH@ԓb 2zNmLUUԥLj`P{0u(d@I2`*S1IMDkV!D4 m])qp[-U5q0jޭiLR EcԥԼDidW"F@ i9(Fau98ŜZ,;e.0a ]4/Ki}h%ٙAREH܏MRޓgDs8DM~K-W'Zo?\w?/CJ~4~|a8?Ŷ͵]';K}?|x{ᦻwaBD2URE]~k90b1orK]ED/wXnu[}U-5Q |QPHv;VZ"93Ex>l6IH Dh*˜Ot.O9\sCZ6GæwWR7MSM2Zp0RX9\*"'b3ܗ4ϳkJ05P@P5gNu#S>x Y2:FTa{uuKQ:s9DGH]ܴ\K-Yy"S%t9|\rԼٷez7Ǘt:wî.!F0QQ3a46E NuUj x78hy!UyIzA5{VK rlGaEC}-Wh RPyzN +7QNOs.r>t.}dv>Rq4.m+PCkR̅T9Bx<~|~:w]S6DBgj YYѰa`\mU]c(8Ҷu'X{S]~cO8o7 ZtTqp켩I]fCdfPs.zHHMGRjEJK(ﮛM ,13vLrx -l乖)/K.R@ Ͽ˧cL_cD N H!G;%+;:cF#jR H!FU ij,Vz |&R#!r|C ,#Z15\4Lj.,]OۛK'BvVkR v]w{ȑ?/% Z V"c`Y*U)qJJѢuRjV~Q6/޹!dLTEdE|>t^*hV ̱I%'x{۪mų7eZ8߅RDktj~&02 P6VRMi:hy(] M *o2?4c0*][i]]*R ԵJv (SZ 3>ksr.tͻm z`bՒ T<-"Hj3$]j,EJ՜e3: z42fs\ =&6y<4nTk]f bUyXνr3[ZѠ@|i-SD \KȅX+)JeAf\W\'i(ӌh#B[JCfsQq&rXWǻ׭ DDJH Q|L, \E مcj5OˌBHN#S!RU$9E WUtȪ@`ϝs3󡁖K-Ū)L癜9)jʮ-, ',xE ]WaYX,:Wkb![]I*marLUeZloomWQ%9 w1×ݷ{ٜy 2W4SH \DZO7Bl,bbO>1&iRGKλ~e\1UdR eRtw|jwBNTEM$`jCt ^cѕ@$":/H4eTjRVkh# uIXʜkqZѺd]\01yyTXbUhcE5-Z(uĂd!GWYɋ#nn|Y5JKy///v6 mkO81sh*2z:͋ !8D癁 8Zm1j &G޹=wNC*+?]Mƅ]@3!7u/fpns-缌h?q)>{gF0qZg@JR;B@WJz!U˲ncۍKsvZ8Ͻ}Z>Ӱ8}HEMJ &eRVEF&_E).:DDdUHjbjcY8-ڴZBDnt`"EcV,\O2^}֢qpMgy+:H͖")iDyi(JeUEgS]ܗ֮j/ȥ^S5 ^V4\jpu|l#-+;ĐBJ.ht/K2Oy8q 18MXLM@sV+P ե( :PnyO^0;fgd+<jQ MLG %!bZiN_>ӠP麦k0{v@ĠD}iɡ:0k\$PHMtjRƎ6Rאo<" UUЊ *. Ty@ @՘y^ZL9ADTժ-e8r(Rq ̦!Ija#2$\F&R$/yˡϋ%eR&$bU-tk Ӝԟ)gaR0!2$1m7l&MGҟu Ye>}P.փm 芇ɥoE.> (* X+4!"ċo'SW|. H@E>)Ӌj+MԹ)D^7yZOę$UAc?TuUI!0cVW!3c`%>ޭU=JгgޚG5$G$, drhfjoͭ(HHh֨{r~Dfi>?yY_<{w3]HUE Ar* ;2aAѥQJPvOdtQi.TJ!Ay,OZi"Y |< gCUO-1sF ah2pOi#8IB !SD &Ց a9k𹴻ty,Tː4=^ nƭ y%"ӛ8"'Rc]7TG7$4; "@r'@1Ǒo^m~[PH&GaICܿܞ?ΙqPl<=@l}]>ߖA|4Msy8X4'FTT4%-!xJePXg͔ҙ|TzhFU@C $[]6dQ5QeU) Elj sk#0 hь̖#Le$[2 ![introduction](images/introduction.png) ## 与dtkwidget的区别 dtkwidget基于QtWidgets模块开发,其与dtkdeclarative的区别主要体现在QtWidgets和QtQuick/QtQml的差异。 QtWidget使用 C++ 语言开发,其控件都继承于 QWidget 并进行拓展,通过QPainter 在风格插件中进行样式的统一绘制。由于 C++ 语言的特殊性,其信号基于回调函数的方式实现,其事件处理基于多态的特性实现。因此在代码复杂度和冗余度上都有明显的劣势。 QtQuick/QtQml基于Qml语言开发,其特点是通过树状模型来指定父子类别,通过属性绑定来响应变化。除此之外,它能兼容JavaScript和C++语言的特性,保证开发过程的高效和快速,减少QtWidget编程中信号槽链接的繁琐程度。
在使用dtkdeclarative之前,应当先熟悉QtQuick的开发模式,其最大的特点是使用“声明式语言(QML)”来描述UI的状态,而不用关心UI具体的渲染过程。下面是一些小例子:
### 渲染方式的区别 1. 使用dtkwidget显示一个100x100大小的红色矩形 ```cpp class Rectangle : public QWidget { private: void paintEvent(QPaintEvent *) override { QPainter pa(this); pa.fillRect(0, 0, 100, 100, Qt::red); } }; ``` 2.使用dtkdeclarative显示一个100x100大小的红色矩形 ```qml Rectangle { width: 100 height: 100 color: "red" } ``` ### 布局方式上的区别 1. 使用dtkwidget可以通过布局控件实现 ```cpp int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget mainWidget; mainWidget.resize(200, 200); QHBoxLayout layout1(&mainWidget); QPushButton btn1("Button 1"); layout1.addWidget(&btn1); QVBoxLayout layout2; QPushButton btn2("Button 2"); QLineEdit lineEdit; layout2.addWidget(&btn2); layout2.addWidget(&lineEdit); layout1.addLayout(&layout2); mainWidget.show(); return app.exec(); } ``` 2. 使用dtkdeclarative通过锚布局或布局器 2.1. 使用锚布局 ```qml Rectangle { width: 400 height: 200 color: "blue" Button { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter text: "Button 1" } Button { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter text: "Button 2" } Label { text: "Center" color: "white" anchors.centerIn: parent } } ``` 2.2. 使用布局器 ```qml RowLayout { spacing: 20 Button { text: "Button 1" // 设置Layout的附加属性 Layout.fillWidth: true Layout.minimumWidth: 50 Layout.preferredWidth: 100 Layout.maximumWidth: 300 Layout.minimumHeight: 150 } Label { text: "Center" } Button { text: "Button 2" // 设置Layout的附加属性 Layout.fillWidth: true Layout.minimumWidth: 100 Layout.preferredWidth: 200 Layout.preferredHeight: 100 } } ``` ### 信号槽连接上的区别 1. dtkwidget使用`QObject::connection`方式连接 ```cpp int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget widget; widget.resize(300, 300); QPushButton btn("Button", &widget); btn.move(50, 50); QObject::connect(&btn, &QPushButton::clicked, []() { qDebug() << "Button Clicked..."; }); widget.show(); } ``` 2. dtkdeclarative使用function或Connections实现 使用`on`的方式连接 ```qml Button { anchors.centerIn: parent text: "Button" // on 进行信号槽连接 onClicked: { console.log("Button clicked....."); } } ``` 使用Connections 方式连接 该种方式应用于同一个信号链接到多个槽函数或者链接作用域不一样的多个组件。 ```qml Button { id: btn anchors.centerIn: parent text: "Button" } // 5.15以下版本使用 Connections { target: btn onClicked: { console.log("Button clicked...") } } // 5.15以上版本使用 Connections { target: btn function onClicked() { console.log("Button clicked...") } } ``` ## 入门资料 [QtQml和QtQuick的最佳编程方式](https://doc.qt.io/qt-5/qtquick-bestpractices.html) 本质上dtkdeclarative就是对于qt的qml模块的扩展,使用qt的资料学习qml再对照本文档进行开发是一种行之有效的手段 同时我们提供了对应的开发规范,详细介绍了对于DCI图标,调色板和DConfig的使用,以方便开发者开发: @ref DevSpecification ## 依赖关系 dtkdeclarative项目依赖于dtk的部分项目以及qtqml的相关依赖。项目中使用到dtkdeclarative项目时,构建运行环境是项目迁移的开始。 由于 dtkdeclarative 被用于替代 dtkwidget 而实现的快速高效的UI编程开发,因此它并不依赖于 dtkwidget 而依赖于 dtkcommon、dtkcore以及dtkgui项目, 这是构建dtkdeclarative时所必需的依赖项,对于DTK的无标题以及圆角窗口等属性,在程序运行和显示时需要依赖 qt5platform-plugins 项目内容,用于深度适配 DTK 开发工具。 除此之外,dtkdeclarative需要依赖 QtQml以及QtQuick 相关内容,如 qtdeclarative 和 qtquickcontrols2 。 对于某些运行依赖,即某些qml控件插件,dtkdeclarative也需要依赖安装,如qml-module-qtquick-shape和qml-module-qtgraphicaleffects。 下表列出dtkdeclarative项目所依赖大部分的库文件: | 组件 | 依赖项 | |-----------|-------------------------------| | dtkcommon | libdtkcommon-dev | | dtkcore | libdtkcore-dev | | dtkcore | libdtkcore5 | | dtkcore | libqt5dbus5 | | dtkcore | libqt5xml5 | | dtkgui | libdtkgui5 | | dtkgui | libdtkgui-dev | | dtkgui | libqt5gui5 | | dtkgui | libqt5dbus5 | | dtkgui | libqt5xml5 | | dtkgui | qt5-image-formats-plugins | | Qt | qtbase5-dev | | Qt | qtdeclarative5-dev | | Qt | libqt5quickcontrols2-5 | | | qt5-platform-plugins | | | qml-module-qtgraphicaleffects | | | qml-module-qtquick-shapes | ## 使用教程 dtkdeclarative和Chameleon均为Qt的插件,所以都是动态加载的,不需要进行链接,只需考虑在运行时使Qt引擎能够找到并加载插件。 * 工程文件:不需要引用dtkdeclarative库信息。 * 风格适配:当成功配置dtk环境后,除非手动指定其他风格,否则所使用的控件风格将全部自动使用行云设计风格。 * 控件中导入dtk相关组件,应确保在最后引入,**可取别名以防被Qt原生同名控件覆盖**,例如: ```qml import org.deepin.dtk 1.0 ``` ```qml import org.deepin.dtk 1.0 as D ``` 引用dtk控件,例如: 使用Button控件和dtk提供的字体绑定。 ```qml Button { font: D.DTK.fontManager.t6 } ``` ### 简单的qml项目创建方式: (由于qt官方已经从QMake切换到CMake,且在完成文档之前,dtk项目组已经完成了向CMake项目的迁移,故不提供QMake项目的创建的方式) (因为版本缘故 下列截图可能存在风格主题以及其他差异请以你安装的qtcreator为准) 1. QtCreator新建qml项目 ![新建项目](images/init1.png) 需要选择构建系统为CMake ![选择cmake](images/init2.png) 然后qt会自动给你创建一个例子 如果出现例子不能运行的情况,显示qtquick not found 则需要检查 qml-module-qtquick-window2 是否被正确安装 2. 指定风格控件 在cmake中添加和修改: ```cmake find_package(Qt5QuickControls2) # 添加 # 修改连接库 target_link_libraries(untitled1 PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::QuickControls2) ``` 在main函数中手动指定: ```cpp #include #include #include //添加 #include int main(int argc, char *argv[]) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endif QGuiApplication app(argc, argv); auto pt = Dtk::Gui::DGuiApplicationHelper::instance()->applicationPalette(); //添加 QQuickStyle::setStyle("Chameleon"); QQmlApplicationEngine engine; const QUrl url(QStringLiteral("qrc:/main.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); } ``` 然后在QML中导入dtk库(前提:dtk组件被正确安装),并开启dtk窗口圆角特性 main.qml: ```qml import QtQuick 2.15 import QtQuick.Window 2.15 import org.deepin.dtk 1.0 ApplicationWindow { width: 640 height: 480 visible: true title: qsTr("Hello World") flags: Qt.Window | Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint header: TitleBar { } } ``` 得到效果如下: ![](images/init3.png) 实际效果可能和这个效果会有差异(因为在测试多系统的兼容性,此代码是在debian sid + gnome + dtk上运行) @weakgroup org.deepin.dtk @brief dtk的qml模块 dtkdeclarative-5.7.12/docs/private/000077500000000000000000000000001476226662700172205ustar00rootroot00000000000000dtkdeclarative-5.7.12/docs/private/dmessagemanager.zh_CN.dox000066400000000000000000000033771476226662700240710ustar00rootroot00000000000000/** @~chinese @class DMessageManager @ingroup QtObject @ingroup QML_TYPES @brief 一种控制 FloatingMessage 的附加对象. MessageManager 是一个附加对象,它无法独立的创建。它有多种用于控制 FloatingMessage 的全局效果的属性。 通常情况下,再构造 Window 时就可指定全局的 FloatingMessage 属性。例如以下代码: ```qml MessageManager.layout: Column { anchors { bottom: parent.bottom right: parent.right } } MessageManager.capacity: 6 MessageManager.delegate: FloatingMessage { id: floatingMsg contentItem: Label { verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft text: floatingMsg.message.content elide: Text.ElideRight maximumLineCount: 1 wrapMode: Text.Wrap } duration: 3000 } ``` @attachedproperty Component MessageManager::delegate @brief delegate 属性控制全局情况下的 FloatingMessage 样式风格。 @details 默认情况下无需重新实现该风格,当需要添加自定义内容时,可修改其内容达到目标效果。 @attachedproperty Item MessageManager::layout @brief layout 属性控制不同消息之间的排列方式。 @details 默认情况下,多个消息使用纵向布局的方式进行排列。例如,还能自定义为横向布局、流布局等等。 @attachedproperty int MessageManager::capacity @brief capacity 属性用于控制消息最大存储的容量。 @details 默认情况下,`capacity`的值为 3,即最大能同时容纳 3 条消息进行显示。 @attachedproperty int MessageManager::count @note 该属性只读 @brief count 属性表示当前消息的个数。 */dtkdeclarative-5.7.12/docs/qml/000077500000000000000000000000001476226662700163375ustar00rootroot00000000000000dtkdeclarative-5.7.12/docs/qml/AboutAction.zh_CN.dox000066400000000000000000000015601476226662700222650ustar00rootroot00000000000000/** @~chinese @class AboutAction @ingroup Action @ingroup QML_TYPES @brief 一个用于显示在菜单界面的“关于”动作. @details 这是一个简单的关于动作,它与默认的菜单界面深度适配,用户能够通过点击菜单中的关于按键唤醒 “关于”对话框,以便获取应用程序的相关信息。一般情况下,开发着无需重新实现该类型,只需进行 简单使用即可。 @property Component AboutAction::aboutDialog @details 该属性用于表示关于对话框的组件,当需要自定义关于对话框时,该组件非常有效。 通常情况下,只需要将对应的对话框设置进该属性即可,例如以下代码: ```qml import org.deepin.dtk 1.0 AbountAction { aboutDialog: AboutDialog { windowTitle: "example" } } ``` @sa AboutDialog */ dtkdeclarative-5.7.12/docs/qml/AboutDialog.zh_CN.dox000066400000000000000000000050401476226662700222440ustar00rootroot00000000000000/** @~chinese @class AboutDialog @ingroup DialogWindow @ingroup org.deepin.dtk @ingroup QML_TYPES @brief 一个用于显示应用程序关于界面的对话框. @details AboutDialog 是一个 DTK 风格的关于对话框,其被用于显示应用程序统一的关于界面,包括应用名称、描述、图标、版本等等。
AboutDialog 具备 DialogWindow 的所有属性,也能够使用 DTK 中的 DWindow 来修改窗口的特殊信息。但这些应用程序通常无需关心,DTK 的内部实现中已经完成。
其设计效果如下图所示:
@image html AboutDialog.png 其使用方式如下代码所示: ```qml AboutDialog { version: qsTr(String("Version: %1").arg(appVersion)) productName: qsTr("dde-control-center") productIcon: "action_setting" companyLogo: "file://" + DTK.deepinDistributionOrgLogo websiteName: DTK.deepinWebsiteName websiteLink: DTK.deepinWebsiteLink } ``` @property string AboutDialog::windowTitle @brief windowTitle 属性用于控制 AboutDialog 的标题区域文本。 @property string AboutDialog::productName @brief productName 属性用于控制 AboutDialog 的应用程序名称。 @property string AboutDialog::productIcon @brief productIcon 属性用于控制 AboutDialog 的应用程序图标 @details 其能够接受 DciIcon 和 QtIcon 的图标,但使用时请遵循图标主题规范来指定图标名称,否则可能出现无法正确找到图标的情况。 @property string AboutDialog::version @brief version 属性用于控制 AboutDialog 的应用程序版本信息。 @property string AboutDialog::description @brief description 属性用于控制 AboutDialog 的应用程序内容描述。 @property string AboutDialog::license @brief license 属性用于控制 AboutDialog 的应用程序许可证信息。 @property string AboutDialog::companyLogo @brief companyLogo 属性用于控制 AboutDialog 的公司 LOGO @details 通常情况下,只需要使用 DTK.deepinDistributionOrgLogo 即可获取到 Logo 路径。该 Logo 会根据系统信息自动变化,即 UOS 或 Deepin。 @property string AboutDialog::websiteName @brief websiteName 属性用于控制 AboutDialog 的公司网站名称. @details 通常情况下,只需要使用 DTK.deepinWebsiteName 即可自动根据系统版本信息,选择合适的网站。。 @property string AboutDialog::websiteLink @brief websiteLink 属性用于控制 AboutDialog 的应用程序网站链接。 @details 使用 DTK.deepinWebsiteLink 即可自动获取网站链接 */ dtkdeclarative-5.7.12/docs/qml/ActionButton.zh_CN.dox000066400000000000000000000024731476226662700224720ustar00rootroot00000000000000/** @~chinese @class ActionButton @ingroup Button @ingroup QML_TYPES @brief 一个仅用于显示 Action 的按钮. @details 这是一个用于显示附属在 Item 中用于展示动作的按钮。 与传统的按钮不同的是,它不提供任何背景;不响应 Hover 动画;不实现任何阴影和模糊特效。 但它同样能够做出风格的视觉效果,这种效果是由 DciIcon 提供的。借助 DciIcon 丰富的视觉效果,ActionButton 能够实现下沉式阴影。
但由于 ActionButton 不提供任何背景,因此无法改变显示在其内部的图标颜色,因此放置在 ActionButton 中的
图标一般情况下都是固定颜色的图标,其效果如下图所示: @image html ActionButton.png ActionButton 继承于 Button 因此可以使用 Button 中的所有属性,其也能够使用 ColorSelector 进行控件的颜色控制。 @property Palette ActionButton::textColor @brief 该属性用于指定 ActionButton 中 DciIcon 中的前景色调色板 @details 其类型为 Palette,能够根据 ActionButton 控件的状态变化自动更新记录在其内部的颜色。 @note 请注意,修改此颜色仅针对 DciIcon 使用前景色调色板的图标有效果,对于不使用任何调色板的图标或 Qt 的图标,将不存在任何效果。 */ dtkdeclarative-5.7.12/docs/qml/AlertToolTip.zh_CN.dox000066400000000000000000000033731476226662700224430ustar00rootroot00000000000000 /** @~chinese @class AlertToolTip @ingroup ToolTip @ingroup QML_TYPES @brief 一个用于显示在编辑框控件中的警告提示信息类. @details AlertToolTip 是一个用于显示在 EditPanel 控件中的警告提示信息类,EditPanel 是 DTK 风格控件中所有编辑框区域的背景控件
因此,DTK已经实现了将 AlertToolTip 嵌套进编辑框的操作,使用其内置属性即可。
AlertToolTip 仅作为用于显示警告信息的浮动提示框,其文字会呈现出用于警告的红色字体。如下图所示:
@image html AlertToolTip.png AlertToolTip 不会在显示后不会进行自动消失,可以通过时设置 visible 属性来手动控制其隐藏和显示,也可通过控制 timeout 属性动态控制超时时间后的隐藏。
该状态最好通过控件的某一属性控制实现特定情况的显示。
目前 AlertToolTip 已经实现了在所有输入框控件的适配,如下图所示:
@image html AlertToolTip_EditExam.png 对于该控件的进一步封装,可通过如下方式控制: | **属性** | **AlertToolTip 属性** | **描述** | |---------------|----------------------|--------------------------------------| | alertText | AlertToolTip.text | 警告信息的文本 | | alertDuration | AlertToolTip.timeout | 警告信息显示的时长 | | showAlert | AlertToolTip.visible | 是否显示警告信息,该属性会在 timeout 结束后自动设置为false | 需要强调的是,上述属性已经在所有编辑框控件中添加。 @property Item AlertToolTip::target @details `target` 属性用于控制 `AlertToolTip` 被附属的目标对象。 */ dtkdeclarative-5.7.12/docs/qml/ApplicationWIndow.zh_CN.dox000066400000000000000000000052421476226662700234510ustar00rootroot00000000000000/**@~chinese @class ApplicationWindow(FlowStyle) @ingroup ApplicationWindow @ingroup QML_TYPES @brief QML 应用程序的主程序窗口. @details 这是 DTK 继承 Qt Quick Control2 实现的程序主窗口控件,该控件添加了行云设计风格的调色板属性,DTK 的字体绑定属性和窗口的标准颜色等。
但请注意,该窗口并未自动做无标题和圆角等属性的处理,如需设置该窗口效果,请使用DWindow 附加属性。
当未指定无标题和圆角等属性时,ApplicationWindow 的效果如下图所示:
@image html ApplicationWindowNormal.png 如下代码: ```qml import org.deepin.dtk 1.0 ApplicationWindow { title: "qml-demo" visible: true width: 800 height: 600 } ``` 当指定窗口特效后, ApplicationWindow 的效果如下: @image html ApplicationWindowUseDWindow.png 如下代码: ```qml import org.deepin.dtk 1.0 ApplicationWindow { title: "qml-demo" visible: true width: 800 height: 600 DWindow.enabled: true DWindow.windowRadius: 16 } ``` ApplicationWindow 能够使用 DWindow 附加属性中的全部属性并能得到效果,下表列出了 DWindow 中存在的属性: | **属性名** | **描述** | |-----------------------|------------------------| | enabled | 开启窗口特效 | | window | 当前所在的窗口实例 | | windowRadius | 窗口圆角大小 | | borderWidth | 窗口边框宽度 | | borderColor | 窗口边框颜色 | | shadowRadius | 窗口阴影半径 | | shadowOffset | 窗口阴影的偏移距离,包含水平偏移和竖直偏移 | | shadowColor | 窗口阴影颜色 | | translucentBackground | 窗口背景透明 | | enableSystemResize | 开启窗口更改大小功能 | | enableSystemMove | 开启窗口移动功能 | | enableBlurWindow | 开启窗口模糊功能 | | alphaBufferSize | 窗口的 alpha 缓冲大小 | | clipPath | 窗口的剪切路径 | | wmWindowTypes | 窗管控制下的窗口类型 | | motifFunctions | 窗管控制下的窗口功能函数 | | overlayExited | Preload 加速框架中的加载完成退出动画 | | loadingOverlay | Preload 正在加载中的自定义等待控件 | | appLoader | Preload 框架中的主组件实例 | */ dtkdeclarative-5.7.12/docs/qml/ArrowListView.zh_CN.dox000066400000000000000000000023571476226662700226430ustar00rootroot00000000000000 /** @~chinese @class ArrowListView @ingroup Item @ingroup QML_TYPES @brief 自带向上和向下箭头的 ListView 控件. @details ArrowListView 控件是对 ListView 控件的拓展, ArrowListView 控件自带 向上和向下箭头,支持当鼠标放在向上和向下箭头时列表内容自动滚动的交互。
该控件被广泛应用在 Menu 和 ComboBox 控件中。其效果如下图所示: @image html ArrowListView.png @property int ArrowListView::maxVisibleItems @details ArrowListView 控件的最大可视项的数量。默认情况下,该值为 16。当超过该数量 时,ArrowListView 的高度不会再根据内容发生变化,形成滚动区域,并显示向上和 向下按钮。当可视项数量不足该值时,向上和向下按钮将不会显示。 @property int ArrowListView::itemHeight @brief ArrowListView 中项的高度。 @details 由于 ArrowListView 无法获取每一项的高度,因此使用 `maxVisibleItems` 时需要手动指定每一项的高度。默认情况下该高度为 30 @property Item ArrowListView::view @details ArrowListView 内部使用的 ListView 实例,访问 view 属性能够访问到内部 ListView 中的全部属性。 @sa ListView */ dtkdeclarative-5.7.12/docs/qml/ArrowShapePopup.zh_CN.dox000066400000000000000000000000311476226662700231440ustar00rootroot00000000000000/** TODO:补全文档 */ dtkdeclarative-5.7.12/docs/qml/ArrowShapePopupWindow.zh_CN.dox000066400000000000000000000000311476226662700243340ustar00rootroot00000000000000/** TODO:补全文档 */ dtkdeclarative-5.7.12/docs/qml/BackdropBlitter.zh_CN.dox000066400000000000000000000053721476226662700231350ustar00rootroot00000000000000/**@~chinese @class BackdropBlitter @ingroup Item @ingroup QML_TYPES @brief 用于获取窗口中已渲染的背景结果,可以将此结果用于特效加工类的控件,如用于实现高斯模糊效果。 @details BackdropBlitter 可以将自身所在区域的背后内容捕获到一个单独的 QSGTexture 中,在 RHI 后端是 QRhiTexture,在 software 后端是 QImage。此捕获动作是在每一帧渲染中实时进行,按 BackdropBlitter 对象所在的层叠顺序进行捕获,多个 BackdropBlitter 可叠加使用,它们相互之间没有影响。 BackdropBlitter 底层基于 QSGRenderNode 实现,通过在 QSGRenderNode::render 中调用 glBlitFramebuffer 捕获内容,因此其当前不支持非 QRhi::OpenGLES2 的渲染后端。此外,由于 QtQuick和 QtRHI 渲染系统的设计限制,无法在 QSGRenderNode::render 阶段再 QSGNode 所使用的 QRhiTexture 资源,因此,对于需要使用 BackdropBlitter 捕获的内容的对象(如 MultiEffect),需要将其作为 BackdropBlitter 的子对象使用。 BackdropBlitter 会自动创建一个新的 QRhi 对象,并且将自身的子对象在当前的 QRhi 所渲染的图形数中隐藏,在 QSGRenderNode::render 中使用自己新建的 QRhi 对象将自身的子对象渲染到窗口中。基于此方式,BackdropBlitter 可实现在 QSGRenderNode::render 中准备好其子对象所使用的 QRhiTexture 资源,在此资源更新后,再使用新的 QRhi 对象渲染子对象,以模拟需要在渲染过程中动态更新 QRhiTexture 的功能。 支持为 BackdropBlitter 应用 clip opacity rotaion transform scale 等属性。 \warning 仅在 Qt6 版本中提供,Qt5 的版本请使用 @sa BlitFramebuffer 代替。 @property bool BackdropBlitter::offscreen @brief offscreen 属性表示是否将捕获到的结果再次渲染到窗口中 @details 其将决定 @sa BackdropBlitter::content 对象的 @sa QQuickItem::ItemHasContents 标志,如果为 false,则表示希望将捕获到的内容渲染到屏幕上,否则表示不渲染(通过 @sa QQuickItem::textureProvider 使用)。 @property Item BackdropBlitter::content \readonly @brief content 属性是捕获到的资源的所有对象 @details 可以将此对象用于 @sa MultiEffect::source 等可以把一个 Item 作为输入源的地方。其通过 QQuickItem::textureProvider 和 QQuickItem::updatePaintNode(需要将 @sa BackdropBlitter::offscreen 指定为 false)两种方式提供捕获到的资源。 @property bool BackdropBlitter::blitterEnabled @brief blitterEnabled 属性用于控制是否开启背景内容捕获行为 @details 当为 true 时将开启背景捕获,否则不开启,在不开启时,可以将 BackdropBlitter 当作一个 Item 对象看待。此属性默认为 true。 */ dtkdeclarative-5.7.12/docs/qml/BoxInsetShadow.zh_CN.dox000066400000000000000000000060561476226662700227630ustar00rootroot00000000000000/**@~chinese @class BoxInsetShadow @ingroup Item @ingroup QML_TYPES @brief 提供一种内阴影控件. @details BoxInsetShadow 是一种用于实现控件的内阴影特效的实现,内阴影不会占用控件之外的区域,当内阴影的颜色存在透明度时,会根据阴影效果渐变填充。
内阴影推荐使用 anchors 进行锚布局填充,手动指定宽度和高度为固定值可能无法跟随宿主控件的款高变化发生改变。 内阴影和外阴影一致,可以控制:圆角系数、模糊大小、偏移量大小、扩散大小和阴影颜色等属性。 其使用方式如下所示: \snippet snippets/dtkdeclarative_boxinsetshadow.qml 0 效果如下所示: @image html BoxInsetShadowExample1.png 圆角系数当不指定时默认为直角效果。 模糊大小越大,其模糊范围越广,模糊程度越高,例如下表效果比较: | **模糊系数** | **代码** | **效果展示** | |----------|-------------------------------------------------------|------------------------------------------| | 2 | @snippet snippets/dtkdeclarative_boxinsetshadow.qml 0 | @image html BoxInsetShadowExample1.png | | 20 | @snippet snippets/dtkdeclarative_boxinsetshadow.qml 1 | @image html BoxInsetShadowExample2.png | | 40 | @snippet snippets/dtkdeclarative_boxinsetshadow.qml 2 | @image html BoxInsetShadowExample3.png | 扩散大小越大,阴影范围越广,如下表效果比较: | **扩散系数** | **代码** | **效果展示** | |----------|-------------------------------------------------------|------------------------------------------| | 1 | @snippet snippets/dtkdeclarative_boxinsetshadow.qml 1 | @image html BoxInsetShadowExample1.png | | 10 | @snippet snippets/dtkdeclarative_boxinsetshadow.qml 3 | @image html BoxInsetShadowExample4.png | | 20 | @snippet snippets/dtkdeclarative_boxinsetshadow.qml 4 | @image html BoxInsetShadowExample5.png | @property real BoxInsetShadow::cornerRadius @brief cornerRadius 属性表示内阴影控件的圆角大小 @details 当内阴影控件的宿主控件是一个具有圆角的 控件时,该属性能够和宿主控件的圆角大小保持一致。 @property real BoxInsetShadow::shadowBlur @brief shadowBlur 系数表示内阴影控件的模糊系数 @details 该值越大表示边界区域的模糊大小越大。默认值为 10。 @property real BoxInsetShadow::shadowOffsetX @brief shadowOffsetX 属性表示内阴影控件的 X 轴偏移量。默认值为 0 @property real BoxInsetShadow::shadowOffsetY @brief shadowOffsetY 属性表示内阴影控件的 Y 轴偏移量。默认值为 0 @property color BoxInsetShadow::shadowColor @brief shadowColor 属性表示内阴影控件的阴影颜色,默认为 "black"@property real BoxInsetShadow::spread @brief spread 属性表示内阴影控件的扩散大小,该值越大表示扩散距离越深。 */ dtkdeclarative-5.7.12/docs/qml/BoxPanel.zh_CN.dox000066400000000000000000000073501476226662700215700ustar00rootroot00000000000000 /** @~chinese @class BoxPanel @ingroup Item @ingroup QML_TYPES @brief 提供一个盒子面板控件. @details BoxPanel 提供一个通用的盒子面板控件,它自带了内置的内外阴影特效,被 使用在 Button 和 ButtonBox 控件中作为基础控件使用。 BoxPanel 通常 被用作控件的背景,默认情况下,该控件在亮色主题下的效果如下图所示: @image html BoxPanelExample1.png 通过更改 BoxPanel 的属性,可以改变 BoxPanel 的圆角大小、背景颜色、阴影颜色、模糊系数等等。 例如下述代码,可以将 BoxPanel 的颜色修改为渐变色: ```qml BoxPanel { width: 200 height: 200 radius: width / 2 color1: D.Palette { normal: "#228B22" } color2: D.Palette { normal: "#00CED1" } } ``` 效果如下图所示: @image html BoxPanelExample2.png 当然如果不满足阴影和边框的效果,也可以通过控制阴影的大小实现自定义阴影, 如下述代码所示: ```qml BoxPanel { width: 200 height: 200 radius: width / 2 color1: Palette { normal: "#228B22" } color2: Palette { normal: "#00CED1" } outsideBorderColor: Palette { normal: "#008B8B" } dropShadowColor: Palette { normal: "#008080" } innerShadowColor1: Palette { normal: "#006400" } innerShadowColor2: Palette { normal: "#87CEFA" } boxShadowBlur: 10 innerShadowOffsetY1: -2 } ``` 效果如下图所示: @image html BoxPanelExample3.png @property int BoxPanel::radius @brief radius 盒子面板的圆角大小。默认情况下, radius 的值跟系统风格中的圆角值保持一致。 @property Palette BoxPanel::color1 @brief color1 属性代表 BoxPanel 控件背景的渐变色1 @details 当 color1 属性和 color2 属性相同时,BoxPanel 的背景为一个纯色背景。 @property Palette BoxPanel::color2 @brief color2 属性和 color1 属性类似,表示 BoxPanel 控件的第二背景色 @details 当 color2 的颜色与 color1不同时,表示该背景色为渐变色。 @property Palette BoxPanel::insideBorderColor @brief insideBorderColor 属性表示 BoxPanel 控件的内边框颜色 @property Palette BoxPanel::outsideBorderColor @brief outsideBorderColor 属性表示 BoxPanel 控件的外边框颜色 @property Palette BoxPanel::dropShadowColor @brief dropShadowColor 属性表示 BoxPanel 控件的阴影颜色 @property Palette BoxPanel::innerShadowColor1 @brief innerShadowColor1 属性表示 BoxPanel 控件的第一内阴影色 @details BoxPanel 共有两种内阴影,innerShadowColor1 是可以变化内阴影,可通过控制 innerShadowOffsetY1 属性 调整第一内阴影的 y 坐标偏移量。 @property Palette BoxPanel::innerShadowColor2 @brief innerShadowColor2 属性表示 BoxPanel 控件的第二内阴影色 @details 第二内阴影为固定的内阴影,其位置固定在 BoxPanel 控件内,阴影效果除阴影颜色外不允许外部改变。 @property int BoxPanel::boxShadowBlur @brief boxShadowBlur 属性表示 BoxPanel 控件的阴影模糊系数 @details 默认情况下该系数大小为 6,扩大和缩小该系数能够增加和缩小阴影的模糊范围。 @property int BoxPanel::boxShadowOffsetY @brief boxShadowOffsetY 属性表示 BoxPanel 控件的阴影 y 坐标偏移量 @details 默认情况下,该偏移量的值为 BoxPanel 的阴影会向下偏移 4 个像素的大小。 @property int BoxPanel::innerShadowOffsetY1 @brief innerShadowOffsetY1 属性表示 BoxPanel 控件第一内阴影的 y 坐标偏移量。 */ dtkdeclarative-5.7.12/docs/qml/BoxShadow.zh_CN.dox000066400000000000000000000104221476226662700217500ustar00rootroot00000000000000 /** @~chinese @class BoxShadow @ingroup Item @ingroup QML_TYPES @brief 提供一种盒子阴影控件. @details BoxShadow 是 DTK 提供的一种兼容软件渲染和硬件渲染的盒子阴影控件。无论应用处在哪种环境(软件和硬件) 应用所表现出来的效果一致。 BoxShadow 控件通常使用 anchors 对目标控件进行填充。根据内部的模糊系数、阴影颜色等等,作用在 目标控件中。当然由于 QML 绘制项的层级关系,应当将 BoxShadow 放在目标控件之前创建,或手动修改 BoxShadow 的 z 属性,以便保证 BoxShadow 控件在目标控件的底部,防止目标控件被阴影控件覆盖。 BoxShadow 的简单用法如下所示: ```qml BoxShadow { anchors.fill: boxShadowSource shadowBlur : 20 shadowColor : Qt.rgba(0, 0, 0, 0.5) shadowOffsetX : 0 shadowOffsetY : 0 cornerRadius: boxShadowSource.radius } Rectangle { id: boxShadowSource width: 200 height: 200 color: "#D2691E" radius: 20 } ``` 效果如下图所示: @image html BoxShadowExample1.png 当目标控件是一个带有不透明颜色的控件时,通常我们需要打开 hollow 属性,是为了带有透明 部分的目标控件所在区域和底部的 BoxShadow 区域颜色混合的情况,例如以下代码: ```qml BoxShadow { anchors.fill: boxShadowSource shadowBlur : 20 shadowColor : Qt.rgba(0, 0, 0, 0.5) shadowOffsetX : 0 shadowOffsetY : 0 cornerRadius: boxShadowSource.radius hollow: true } Rectangle { id: boxShadowSource width: 200 height: 200 color: Qt.rgba(0.82, 0.71, 0, 0.6) radius: 20 } ``` 控件使用 hollow 属性和未使用 hollow 属性的效果对比如下: | **hollow** | **效果** | |------------|----------------------------------------------| | false | @image html BoxShadowExampleNoHollow.png | | true | @image html BoxShadowExampleWithHollow.png | @property real BoxShadow::cornerRadius @brief cornerRadius 属性表示 BoxShadow 的圆角大小 @details 通常情况下,该大小需要与目标控件的圆角大小保持一致。 @property real BoxShadow::shadowBlur @brief shadowBlur 属性表示 BoxShadow 的阴影模糊系数,模糊系数越大,阴影的模糊程度越高。 @details 默认情况下,该属性的值为 10。 例如下述效果展示,其他属性保持一致的情况下,只修改 shadowBlur 值的大小,会发现 BoxShaow 的阴影大小会随之增加。 | **shadowBlur系数** | **效果** | |------------------|------------------------------------------| | 2 | @image html BoxShadowExampleBlur2.png | | 10 | @image html BoxShadowExampleBlur10.png | | 20 | @image html BoxShadowExample1.png | | 40 | @image html BoxShadowExampleBlur40.png | @property real BoxShadow::shadowOffsetX @brief shadowOffsetX 属性表示 BoxShadow 的 x 坐标偏移大小。 默认情况下,该值为 0 @property real BoxShadow::shadowOffsetY @brief shadowOffsetY 属性表示 BoxShadow 的 y 坐标偏移大小。 默认情况下,该值为 0 @property color BoxShadow::shadowColor @brief shadowColor 属性表示 BoxShadow 的阴影颜色。默认情况下,该颜色为 "black" @property real BoxShadow::spread @brief spread 属性表示 BoxShadow 的阴影扩散系数,扩散系数越大,表示阴影越 能向外扩散,通常情况下,spread 的值为 0。 扩散距离的效果展示如下表所示: | **spread系数** | **效果** | |--------------|------------------------------------------| | 0 | @image html BoxShadowExample1.png | | 2 | @image html BoxShadowExampleSpread2.png | | 5 | @image html BoxShadowExampleSpread5.png | | 10 | @image html BoxShadowExampleSpread10.png | @property bool BoxShadow::hollow @brief hollow 属性表示 BoxShadow 是否指定为空洞属性 @details 当 hollow 属性为 true 时BoxShadow 会去掉和目标控件重合的部分。默认情况下,该值为 false. */ dtkdeclarative-5.7.12/docs/qml/BusyIndicator.zh_CN.dox000066400000000000000000000024621476226662700226360ustar00rootroot00000000000000 /** @~chinese @class BusyIndicator @ingroup BusyIndicator @ingroup QML_TYPES @brief 提供一种趣味交互的等待控件. @details BusyIndicator 控件是 DTK 重新实现 QML 风格以适配行云设计风格的控件。 它用于进行用户界面等待时的界面交互,提示用户需要进行等待才能继续操作。 Qt5.11 版本下,当用户逻辑阻塞 GUI 线程导致卡顿时,BusyIndicator 控件也会卡顿。 Qt5.15 版本后,Qt 新增在其他线程渲染 GUI 和动画极大的改善了这个问题。 BusyIndicator 的效果如下图所示: @image html BusyIndicator.gif @property Palette BusyIndicator::fillColor fillColor 属性可填充 BusyIndicator 控件的前景。默认情况下,使用调色板中的活动色填充该属性。 可通过自定义颜色来控制不同的颜色。 也可以通过将 BusyIndicator 放置在带背景的控件中,混合成一种控件,增加视觉效果,例如下述代码: ```qml Rectangle { width: 200 height: 200 color: "#8a8a8a" BusyIndicator { anchors.fill: parent running: true fillColor: Palette { normal: "#ffffff" } } } ``` 效果如下图所示: @image html BusyIndicatorFlat.png */ dtkdeclarative-5.7.12/docs/qml/Button.zh_CN.dox000066400000000000000000000034111476226662700213250ustar00rootroot00000000000000 /** @~chinese @class Button @ingroup Button @ingroup QML_TYPES @brief 提供一种行云设计风格的 Button 控件. @details Button控件提供行云设计风格的按钮控件。其风格旨在提供一种简约、友好和生命力的效果。
设计中,Button使用了大量的内外阴影、渐变和内外边框。
同时,针对按钮不同状态的颜色调整也做了统一整合,添加了鼠标悬浮时的进入进出动画等等。
同时,针对 Button控件衍生的各个其他风格的按钮控件, 例如 ActionButton、RecommandButton、WarningButton等等也很好的进行展示。
Button控件能够使用 QtIcon 和 DciIcon 两种,在使用上,二者没有太大的差异。
都只需要指定名称和大小, Button也支持添加 indicator 控件,一般情况下,
indicator 的位置在 Button的最右侧。
Button控件在不同状态时的效果展示如下图所示:
@image html ButtonExample.png 除此之外,Button 还支持 Common 和 Crystal 两种不同的 \l {Palette color family}{颜色族},
通常情况下,使用 Button 不需要考虑颜色族的场景,其内部会在不同场景进行适配。
Common 和 Crystal 颜色族的效果如下: @image html ButtonColorFamily.png Crystal 颜色族下的 Button 取消了 hover 动画和部分阴影效果,但其使用了一种透明效果,
目的是可以很清晰的看到其背后的控件内容,例如下述效果展示:
@image html ButtonCrystalCompare.png @property Palette Button::textColor @brief textColor 属性为文字颜色所表示的属性值 @details 默认情况下 textColor 会根据Button的状态发生改变,例如 checked; highlight等等。 */ dtkdeclarative-5.7.12/docs/qml/ButtonBox.zh_CN.dox000066400000000000000000000032501476226662700217770ustar00rootroot00000000000000 /** @~chinese @class ButtonBox @ingroup Control @ingroup QML_TYPES @brief 一种按钮样式的组合控件,可用于放置多个按钮形成组合按钮. @details ButtonBox 控件提供一种按钮的组合控件,其内部用于存放多个按钮,在同一个 ButtonBox 下的
不同按钮,其内部只能存在一种 checked 状态的按钮,且 checked 状态下的按钮呈现高亮的状态。
例如以下样式:
@image html ButtonBoxExample.png 在 ButtonBox 中,使用 ToolButton 控件最妥当,是因为 ToolButton 更容易使用特殊的
图标和文字的排列方式,放置在 ButtonBox 中更加灵活。
其使用方式如下代码所示:
```qml ButtonBox { anchors.centerIn: parent ToolButton { text: "Button1" checked: true } ToolButton { text: "Button2" } } ``` @property list ButtonBox::buttons @brief buttons 属性为默认属性,因此,使用时无需强制指定该属性,其内部的子控件默认会全部添加到该属性中。 @brief buttons 属性用于存储 ButtonBox 控件中放置的按钮。 @property alias ButtonBox::group @brief group 属性表示 ButtonBox 内部使用的 ButtonGroup 对象。 @details ButtonGroup的作用为,仅将其内部选中的 Button 对象作为 checked 状态的对象,
即其内部只存在一个checked 对象。 当然,可以通过 \c group 中的 exclusive 属性来禁用该特性。
外部可以通过 group 中的 ButtonGroup::addButton 和 ButtonGroup::removeButton 函数
动态操作其内部的元素。
@sa ButtonGroup */ dtkdeclarative-5.7.12/docs/qml/ButtonIndicator.zh_CN.dox000066400000000000000000000021561476226662700231670ustar00rootroot00000000000000 /** @~chinese @class ButtonIndicator @ingroup Rectangle @ingroup QML_TYPES @brief 提供 Button 控件内部使用的按钮指示器. @details ButtonIndicator 作为 Button 控件中的 内部控件,其目的是作为一个按钮指示器。在功能上没有任何增加,仅是对控件 效果进行了轻微调整。 其使用方式如下代码所示: ```qml ToolButton { icon.name: "action_newfolder" indicator: ButtonIndicator { } } ``` 或者 ```qml Button { icon.name: "action_compress" text: "压缩方式" indicator: ButtonIndicator { } } ``` 其效果分别为: @image html ButtonIndicatorForToolButton.png 和 @image html ButtonIndicatorForButton.png @property Palette ButtonIndicator::backgroundColor @brief backgroundColor 用来控制 ButtonIndicator 控件中的背景颜色。\c backgroundColor 作为 Palette 类型能够自动适配深浅主题。 通常情况下,\c backgroundColor 属性已经被设置过,使用时无需关心,当需要自定义颜色时 可以通过重新定义该值来完成。 */ dtkdeclarative-5.7.12/docs/qml/ButtonPanel.zh_CN.dox000066400000000000000000000004621476226662700223100ustar00rootroot00000000000000/** @~chinese @class ButtonPanel @ingroup BoxPanel @ingroup QML_TYPES @brief 统一的按钮背景面板. @details ButtonPanel 是所有 Button 控件的背景面板。其作为按钮控件的 统一背景进行展示,内部根据按钮控件的各种状态进行了颜色的自动调整。 */ dtkdeclarative-5.7.12/docs/qml/CheckBox.zh_CN.dox000066400000000000000000000027551476226662700215520ustar00rootroot00000000000000 /** @~chinese @class CheckBox @ingroup CheckBox @ingroup QML_TYPES @brief 提供一种行云设计风格的 CheckBox 控件. @details CheckBox 兼容 CheckBox 的所有属性和接口, 其针对行云设计风格,进行了整体的样式修改。分为三种 Check 状态,分别为 Qt.Unchecked; Qt.PartiallyChecked 和 Qt.Checked 这三种状态由三种不同的样式组成。 其展示效果如下图所示: | **状态** | **模式** | **效果** | |----------------------------|----------|-------------------------------------------------| | {1, 3} Qt.Unchecked | normal | @image html CheckBoxUnCheckedNormal.png | | | hovered | @image html CheckBoxUnCheckedHovered.png | | | pressed | @image html CheckBoxUnCheckedPressed.png | | {1, 3} Qt.PartiallyChecked | normal | @image html CheckBoxPartiallyCheckedNormal.png | | | hovered | @image html CheckBoxPartiallyCheckedHovered.png | | | pressed | @image html CheckBoxPartiallyCheckedPressed.png | | {1, 3} Qt.Checked | normal | @image html CheckBoxCheckedNormal.png | | | hovered | @image html CheckBoxCheckedHovered.png | | | pressed | @image html CheckBoxCheckedPressed.png | @note CheckBox 控件的效果由 DciIcon 提供。 */ dtkdeclarative-5.7.12/docs/qml/CheckDelegate.zh_CN.dox000066400000000000000000000030661476226662700225300ustar00rootroot00000000000000/** @~chinese @class CheckDelegate @ingroup CheckDelegate @ingroup QML_TYPES @brief 提供一种行云设计风格的 CheckDelegate 控件. @details CheckDelegate 控件是 ListView 控件中用于多选 的代理控件。其功能在于对列表中的多个列表项进行框选和高亮。 CheckDelegate(FlowStyle) 兼容 CheckDelegate 中的所有接口,同时也提供了 其他属性用于自定义化。例如 CheckDelegate 兼容了 DciIcon 图标类型,能够友好 的使用 DciIcon 进行图标绘制,另外 CheckDelegate 可通过外部接口修改背景色, 文字控件等等。 CheckDelegate(FlowStyle) 的效果如下图所示: @image html CheckDelegate.png 所使用的代码如下: ```qml ListView { implicitHeight: contentHeight width: 160 model: 4 spacing: 10 delegate: DheckDelegate { text: "标题" icon.name: "action_setting" checked: index === ListView.view.count - 1 } } ``` @property Component CheckDelegate(FlowStyle)::content @brief content 属性用于指定 CheckDelegate(FlowStyle) 控件的内容控件 @details 默认情况下,它为一个 Label 控件,用于存放 CheckDelegate(FlowStyle) 中设置过的 \c text 属性。当重新实现 \c content 时,需要自己实现对 \c text 属性的支持。 @property Palette CheckDelegate(FlowStyle)::backgroundColor @brief backgroundColor 属性用于控制 CheckDelegate(FlowStyle) 的背景颜色。 @details backgroundColor的属性为 Palette 类型。 */ dtkdeclarative-5.7.12/docs/qml/ComboBox.zh_CN.dox000066400000000000000000000072151476226662700215700ustar00rootroot00000000000000 /** @~chinese @class ComboBox @ingroup ComboBox @ingroup QML_TYPES @brief 提供一种行云设计风格的 ComboBox 控件. @details ComboBox 控件提供了行云设计风格的组合框控件,
其背景使用跟按钮相似的背景,弹出框使用 Popup 控件实现,相比于默认的 ComboBox控件,
行云设计风格的 ComboBox 实现了自定义图标,
并且在编辑和非编辑状态下,能够不同的风格展现。
ComboBox 的效果如下图所示:
| **状态** | **效果** | |--------|----------------------------------| | 编辑状态 | @image html ComboBoxEditable.png | | 非编辑状态 | @image html ComboBoxNotEdit.png | | 弹出状态 | 弹出状态 | ComboBox默认的文字添加方式可以通过正常的 model 进行添加,
如下代码所示:
```qml ComboBox { anchors.centerIn: parent model: ["Banana", "Apple", "Coconut"] } ``` 如果想要在每项上添加图标进行展示,可以通过 ListModel 实现,如下代码所示: ```qml ComboBox { textRole: "text" iconNameRole: "icon" model: ListModel { ListElement { text: "Banana"; icon: "action_setting" } ListElement { text: "Apple"; icon: "action_newfolder" } ListElement { text: "Coconut"; icon: "action_share" } } } ``` @property string ComboBox::iconNameRole @brief iconNameRole 属性用于控制图标名称。 @details 由于默认的 ComboBox 只支持使用文字,而不支持添加图标,因此这里为了进行 ComboBox 的拓展,方便程序使用 ComboBox 时能够快速的添加图标。
@note 请注意,该属性需要配合 ListModel 中进行使用\l {CombobBox icon usage} {ComboBox Icon 的用法} @property string ComboBox::alertText @brief alertText 属性用于表示 ComboBox 提示的警告信息。用于提示用户输入的信息有误。 @note请注意,当 ComboBox 的 editable 属性打开时, alertText 属性才能生效。而在非编辑状态下,该属性无效。 @details 其用法如下所示: ```qml ComboBox { anchors.centerIn: parent textRole: "text" iconNameRole: "icon" alertText: "Only for strings." showAlert: true editable: true model: ListModel { ListElement { text: "Banana"; icon: "action_setting" } ListElement { text: "Apple"; icon: "action_newfolder" } ListElement { text: "Coconut"; icon: "action_share" } } } ``` 效果如下图所示: @image html ComboBoxAlert.png @property int ComboBox::alertDuration @brief alertDuration 属性表示警告信息的提示时长。 @details 默认情况下,如果不设置时长,将会一致显示。@brief alertDuration 的单位是 毫秒(ms)。 @property bool ComboBox::showAlert @brief showAlert 属性用于决定是否显示警告信息。 @details 一般情况下,显示警告信息的条件需要满足错误的输入情况。 当 `alertDuration` 属性的时间结束时, showAlert 将自动更改为 false否则,`showAlert` 属 性需要手动控制为 false。 @property int ComboBox::maxVisibleItems @brief maxVisibleItems 属性用于控制 Popup 窗口显示的最大条目数。 @details 默认情况下,该最大值为 16,当超过该值时,Popup 窗口开始变成滚动状态,访问其余项需要通过滚动完成。 @property Palette ComboBox::separatorColor @brief separatorColor 属性用于控制ComboBox在编辑状态下,左侧输入框和 右侧下拉按钮中间分隔部分的颜色。 */ dtkdeclarative-5.7.12/docs/qml/ControlBackground.zh_CN.dox000066400000000000000000000005521476226662700234750ustar00rootroot00000000000000/** @~chinese @class ControlBackground @ingroup Background @ingroup QML_TYPES @brief ControlBackground 控件:可以用作组合控件 button、edit 等的背景颜色以及焦点框的显示。 @property int ControlBackground::focusBorderSpace @brief 设置焦点框边距边距 @property ControlBackground::focusBorder @brief 设置焦点边框宽度 */ dtkdeclarative-5.7.12/docs/qml/DelayButton.zh_CN.dox000066400000000000000000000000311476226662700222770ustar00rootroot00000000000000/** TODO:补全文档 */ dtkdeclarative-5.7.12/docs/qml/Dial.zh_CN.dox000066400000000000000000000000311476226662700207160ustar00rootroot00000000000000/** TODO:补全文档 */ dtkdeclarative-5.7.12/docs/qml/DialogTitleBar.zh_CN.dox000066400000000000000000000025251476226662700227050ustar00rootroot00000000000000 /** @~chinese @class DialogTitleBar @ingroup Control @ingroup QML_TYPES @brief DialogWindow 中的标题栏控件. @details DialogTitleBar 是 DialogWindow 中的标题栏控件,相比默认的标题栏,只有图标,标题和简单的关闭按钮。 但和默认的标题栏也有相似之处:都能进行窗口模糊设置;都可以添加自定义内容。 通常情况下,使用 DialogWindow 时无需重新创建 DialogTitleBar ,默认提供的标题栏会满足大多数的使用场景,当无法满足时, 可以通过继承它重新实现。 @property Component DialogTitleBar::content @brief content content 属性作为 DialogTitleBar 中一个自定义标题栏部分,可以添加应用程序自定义的控件 @brief content 属性的类型为 Component, 因此该控件的创建和管理有 DialogTitleBar 控制。 @property DciIcon DialogTitleBar::icon @brief icon 属性表示 DialogWindow 的窗口图标。 @sa DciIcon @property string DialogTitleBar::title @brief title 属性表示 DialogWindow 的窗口标题。 @property bool DialogTitleBar::enableInWindowBlendBlur @brief enableInWindowBlendBlur 属性用于控制是否开启窗口内混合模糊模式 @details 当开启该模式后,如果标题栏上经过了其他窗口控件(例如 ScrollView),其背景会呈现出模糊的效果。 */ dtkdeclarative-5.7.12/docs/qml/DialogWindow.zh_CN.dox000066400000000000000000000035471476226662700224530ustar00rootroot00000000000000 /** @~chinese @class DialogWindow @ingroup Window @ingroup QML_TYPES @brief DTK 提供的一种基本对话框窗口. @details DialogWindow 是基础的自定义对话框窗口,除窗口内容外,其余部分 DTK 完成实现并提供。 应用可直接在 DialogWindow 中添加需要展示的内容,通过布局的方式对内容进行属性控制。 DialogWindow 继承自 Window 控件,相比于 PopupWindow 窗口,DialogWindow 是 一个独立的窗口。 DialogWindow 实现了 DTK 样式中的无标题,背景模糊的等样式。直接使用 Window 时,这些样式都需要 自定义实现。 @property int DialogWindow::maxContentHeight @note 该属性为只读属性 @brief maxContentHeight 属性是一个只读属性,它表示内容区域的最大高度。 @property Compnent DialogWindow::header @brief header 属性用于存储 DialogTitleBar 控件,当需要自定义 DialogTitleBar 时, 可通过 header: DialogTitleBar {} 来实现。 @property string DialogWindow::icon @brief icon 属性用于存储 DialogWindow 中的图标名称。 @property list DialogWindow::content @brief 属性表示 DialogWindow 中内容控件 @details 它是 DialogWindow 中的默认控件,使用时无需强制指定 content 属性。 其使用方式如下代码: ```qml DialogWindow { width: 200 icon: "music" ColumnLayout { width: parent.width Label { Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 text: "名称“XXX”已被占用,请使用其他名称" } Button { Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter Layout.bottomMargin: 10 Layout.fillWidth: true text: "确定" } } } ``` */ dtkdeclarative-5.7.12/docs/qml/EditPanel.zh_CN.dox000066400000000000000000000000311476226662700217120ustar00rootroot00000000000000/** TODO:补全文档 */ dtkdeclarative-5.7.12/docs/qml/EmbeddedProgressBar.zh_CN.dox000066400000000000000000000026141476226662700237210ustar00rootroot00000000000000 /** @~chinese @class EmbeddedProgressBar @ingroup ProgressBar @ingroup QML_TYPES @brief 提供一种嵌入到控件内部的进度条控件. EmbeddedProgressBar 是一种能够嵌入到控件内部显示进入的进度条控件,它作为一种轻量的进度条控件, 没有默认进度条的渐变和阴影等效果。它用于指示用户控件的加载情况,如放置在图标内,用于指示应用的启 动速度或者应用的下载速度等等。 EmbeddedProgressBar 的效果如下图所示: TODO:缺少图片 @property Palette EmbeddedProgressBar::backgroundColor @brief backgroundColor 属性表示 EmbeddedProgressBar 控件的背景颜色,通过控制 backgroundColor 属性 能够很容易的修改进度条的背景色。 例如下述代码能够将进度条的背景色在亮色主题下修改为红色,在暗色主题下修改会蓝色: ```qml EmbeddedProgressBar { width: 48 height: 6 from: 0 to: 100 value: 58 backgroundColor: Palette { normal: "red" normalDark: "blue" } } ``` @property Palette EmbeddedProgressBar::progressBackgroundColor @brief progressBackgroundColor 属性用于表示进度条背景颜色,和 backgroundColor 类似,都为 Palette 类型, 外部可以通过修改该属性值,调整背景在不同状态下的颜色。 */ dtkdeclarative-5.7.12/docs/qml/FloatingButton.zh_CN.dox000066400000000000000000000005751476226662700230210ustar00rootroot00000000000000 /** @~chinese @class FloatingButton @ingroup Button @ingroup QML_TYPES @brief 提供一种浮动按钮控件. @details FloatingButton 继承自 Button 控件,其 UI 效果与 Button 截然不同, FloatingButton 通常情况下呈现一种圆形按钮,被用于浮动显示在工具栏中。 其效果如下图所示: @image html FloatingButtonExample.png */ dtkdeclarative-5.7.12/docs/qml/FloatingMessage.zh_CN.dox000066400000000000000000000114021476226662700231210ustar00rootroot00000000000000 /** @~chinese @class FloatingMessage @ingroup Item @ingroup QML_TYPES @brief 提供一种窗口内浮动效果的消息控件. @details FloatingMessage 控件用于显示在窗口内的提示消息,是消息的基础类型。其使用 FloatingPanel 作为背景,用于增加它的浮动效果,是使用外部定义 的文本和图标作为消息内容。
FloatingMessage 能进行常驻显示也能进行短暂显示,当消息短暂显示时会在持续时间结束后自动消失,而常驻消息会一致保留在程序中,除非用户 手动进行关闭。
FloatingMessage 支持高度定制化,当消息效果不满足实际应用需求时,通过重写控件属性,能够修改控件的样式。 下图展示了 FloatingMessage 的效果: @image html FloatingMessage.png MessageManager 控制 FloatingMessage 的消息容量、样式风格、布局方式等等,也可用过 MessageManager 直接发送 消息通知。 MessageManager 作为全局的方式控制 FloatingMessage 的风格和功能,它和 FloatingMessage 的关系为: MessageManager 是控制者,FloatingMessage 是控制元素。 @property Component FloatingMessage::contentItem @brief contentItem 属性是 FloatingMessage 的内容部分,例如其内部可以放置文本。contentItem 的内容不包含图标部分。当需要自定义 中心部分时,可以重新实现该属性。默认情况下 contentItem 属性只存在消息的文本。 @property Component FloatingMessage::button @brief button 属性存放 FloatingMessage 中的关闭按钮。默认情况下, \c button 属性是一个提供关闭按钮的 ActionButton。 @property Component FloatingMessage::duration @brief duration 属性用于表示 FloatingMessage 持续的时间。默认情况下, \c duration 的值为 4 秒,超过该时间,消息自动关闭。当将该 属性的值修改为 -1 时,表示 FloatingMessage 是一个常驻消息,除非用户手动关闭,否则将无法消失。 @property Component FloatingMessage::panel @brief panel 属性用于表示 FloatingMessage 控件的背景面板,FloatingMessage 的浮动效果最终由 \c panel 属性提供。一般情况无需手动实现 该控件的内容。当需要手动实现时,请实现 重新对图标、文本(contentItem)、关闭按钮(button) 进行重新布局。 @propertygroup FloatingMessage::message @property string :FloatingMessage::message.iconName @brief iconName 属性用于表示 FloatingMessage 中的图标名称。默认情况下, \c iconName 属性的值为 \c "dialog-information"。 @property color :FloatingMessage::palette.content @brief message 属性是一个复合属性,默认情况下 message 提供了 iconName 和 content 两个属性名。 \c iconName 表示图标名称 \c content 表示文字内容。 \l {DSendMessageFromContent}{DTK.sendMessage()} 接口中可以添加自定义的子属性名,但需要自定义 content 组件进行自适配。 \l {DSendMessageFromContent}{DTK.sendMessage()} /** @~chinese @class MessageManager @ingroup QtObject @ingroup QML_TYPES @brief 一种控制 FloatingMessage 的附加对象. MessageManager 是一个附加对象,它无法独立的创建。它有多种用于控制 FloatingMessage 的全局效果的属性。 通常情况下,再构造 Window 时就可指定全局的 FloatingMessage 属性。例如以下代码: ```qml MessageManager.layout: Column { anchors { bottom: parent.bottom right: parent.right } } MessageManager.capacity: 6 MessageManager.delegate: FloatingMessage { id: floatingMsg contentItem: Label { verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft text: floatingMsg.message.content elide: Text.ElideRight maximumLineCount: 1 wrapMode: Text.Wrap } duration: 3000 } ``` @attachedproperty Component MessageManager::delegate @brief delegate 属性控制全局情况下的 FloatingMessage 样式风格。 @details 默认情况下无需重新实现该风格,当需要添加自定义内容时,可修改其内容达到目标效果。 @attachedproperty Item MessageManager::layout @brief layout 属性控制不同消息之间的排列方式。 @details 默认情况下,多个消息使用纵向布局的方式进行排列。例如,还能自定义为横向布局、流布局等等。 @attachedproperty int MessageManager::capacity @brief capacity 属性用于控制消息最大存储的容量。 @details 默认情况下,`capacity`的值为 3,即最大能同时容纳 3 条消息进行显示。 @attachedproperty int MessageManager::count @note 该属性只读 @brief count 属性表示当前消息的个数。 */ dtkdeclarative-5.7.12/docs/qml/FloatingPanel.zh_CN.dox000066400000000000000000000052661476226662700226070ustar00rootroot00000000000000 /** @~chinese @class FloatingPanel @ingroup Control @ingroup QML_TYPES @brief 提供一种浮动效果的背景面板. @details FloatingPanel 是浮动消息(FloatingMessage)、浮动工具栏、内嵌菜单(Menu)等等控件的通用背景。 FloatingPanel 自带浮动的效果,能够使其内部控件呈现出浮动在应用内部的效果。 FloatingPanel 支持颜色和效果的控制,即它能够在外部控制背景颜色、边框颜色、圆角大小和模糊系数等等。 其使用方式如下代码: ```qml FloatingPanel { contentItem: RowLayout { spacing: 20 DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} RowLayout { spacing: 12 Slider { id: toolBarSlider property int totalValue: 7*60 + 56 property int currentValue: 3 * 60 + 25 Layout.preferredWidth: 230 highlightedPassedGroove: true handleType: Slider.HandleType.NoArrowHorizontal from: 0 to: msToValue(totalValue) value: msToValue(currentValue) stepSize: 1 function msToValue(ms) { return ms} function msToText(ms) { return String("%1:%2").arg(Math.floor(ms / 60)).arg(ms % 60) } } Text { Layout.preferredWidth: 50 text: String("%1/%2").arg(toolBarSlider.msToText(toolBarSlider.value)).arg(toolBarSlider.msToText(toolBarSlider.to)) } } DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} } } ``` 效果如下图所示: @image html FloatingPanelExample.png @property Palette FloatingPanel::backgroundColor @brief backgroundColor 属性用于控制背景颜色。 @sa Palette @property Palette FloatingPanel::dropShadowColor @brief dropShadowColor 属性用于控制阴影部分的颜色。 @sa Palette @property Palette FloatingPanel::borderColor @brief borderColor 属性用于控制边框的颜色。 @sa Palette @property Palette FloatingPanel::radius @brief radius 属性控制 FloatingPanel 背景的圆角大小,默认情况下为该值为 14。 @property Palette FloatingPanel::blurRadius @brief blurRadius 属性控制 FloatingPanel 的模糊系数,默认情况下为该值为 14。 */ dtkdeclarative-5.7.12/docs/qml/FlowStyle.zh_CN.dox000066400000000000000000000000311476226662700217750ustar00rootroot00000000000000/** TODO:补全文档 */ dtkdeclarative-5.7.12/docs/qml/FocusBoxBorder.zh_CN.dox000066400000000000000000000027731476226662700227520ustar00rootroot00000000000000 /** @~chinese @class FocusBoxBorder @ingroup Item @ingroup QML_TYPES @brief 提供一种通用的控件焦点边框. @details FocusBoxBorder 控件主要用于绘制控件的焦点边框。当控件支持焦点策略时,使用 Tab 键或者使用鼠标点击,控件周围会环绕 高亮色的边框效果。FocusBoxBorder 用于提供该效果。目前 DTK 提供的一些支持焦点的控件都实现了焦点框的绘制。 FocusBoxBorder 效果如下图所示: @image html FocusBoxBorder.png 其使用方式如下代码所示: ```qml Control { // 实现的自定义控件 id: control focusPolicy: Qt.StrongFocus contentItem: Text { text: "A custom control." verticalAlignment: Text.AlignVCenter } background: Rectangle { implicitWidth: 200 implicitHeight: 80 radius: 8 color: "darkGreen" FocusBoxBorder { anchors.fill: parent radius: 8 color: control.palette.highlight visible: control.visualFocus } } } ``` @property color FocusBoxBorder::color @brief color 属性应用控制焦点边框的颜色。默认情况下,该颜色是 "transparent"。 @property int FocusBoxBorder::borderWidth @brief borderWidth 属性表示焦点边框的宽度。默认情况下该值为 2 @property int FocusBoxBorder::radius @brief radius 属性用于控制边框的圆角大小。 */ dtkdeclarative-5.7.12/docs/qml/Frame.zh_CN.dox000066400000000000000000000000311476226662700210770ustar00rootroot00000000000000/** TODO:补全文档 */ dtkdeclarative-5.7.12/docs/qml/GroupBox.zh_CN.dox000066400000000000000000000000311476226662700216120ustar00rootroot00000000000000/** TODO:补全文档 */ dtkdeclarative-5.7.12/docs/qml/HighlightPanel.zh_CN.dox000066400000000000000000000012571476226662700227470ustar00rootroot00000000000000 /** @~chinese @class HighlightPanel @ingroup Item @ingroup QML_TYPES @brief 提供一种高亮显示背景面板. @details HighlightPanel 属性控制高亮显示的背景面板,它被广泛用于 ListView 或 MenuItem 中当做鼠标选中时的高亮背景。 TODO:补充图片和示例 @property Palette HighlightPanel::backgroundColor @brief backgroundColor 属性用于控制 HighlightPanel 的背景颜色。 @property Palette HighlightPanel::outerShadowColor @brief outerShadowColor 属性用于控制 HighlightPanel 的外阴影颜色。 @property Palette HighlightPanel::innerShadowColor @brief backgroundColor 属性用于控制 HighlightPanel 的内阴影颜色。 */ dtkdeclarative-5.7.12/docs/qml/IconButton.zh_CN.dox000066400000000000000000000006041476226662700221370ustar00rootroot00000000000000 /** @~chinese @class IconButton @ingroup Button @ingroup QML_TYPES @brief 提供一种图标类按钮控件. IconButton 继承自 \l{Button(FlowStyle)}{Button} 控件,但它只允许设置 icon 等属性,无法设置 text 添加文本。 IconButton 已支持使用 DciIcon 和 QtIcon 两种。 IconButton 的效果如下图所示: @image html IconButtonExample.png dtkdeclarative-5.7.12/docs/qml/InsideBoxBorder.zh_CN.dox000066400000000000000000000022071476226662700230760ustar00rootroot00000000000000 /** @~chinese @class InsideBoxBorder @ingroup Item @ingroup QML_TYPES @brief 提供一种内边框控件. @brief InsideBoxBorder 控件提供一种内边框,作为一种修饰性的控件存在, InsideBoxBorder 控件 和 OutsideBoxBorder 控件类似,都用来提供控件的边框。好的控件设计,离不开丰富的描边绘制。 InsideBoxBorder 的用法如下所示: ```qml Rectangle { width: 180 height: 180 color: "darkCyan" radius: 8 InsideBoxBorder { anchors.fill: parent color: "darkGreen" borderWidth: 2 radius: 8 } } ``` 其效果如下图所示: @image html InsideBoxBorderExample.png @property real InsideBoxBorder::borderWidth @brief borderWidth 属性用于表示 InsideBoxBorder 控件的边框大小。 默认情况下, 该值是 1。 @property color InsideBoxBorder::color @brief color 属性表示内边框的颜色值。默认情况下,该值是 "white" @property int InsideBoxBorder::radius @brief radius 属性表示内边框的圆角大小,默认情况下,该大小为 0。 */ dtkdeclarative-5.7.12/docs/qml/Ipv4Edit.zh_CN.dox000066400000000000000000000041121476226662700215010ustar00rootroot00000000000000 /** @~chinese @class IpV4LineEdit @ingroup Item @ingroup QML_TYPES @brief 提供一种用于输入 IPV4 的特殊输入框. @details IpV4LineEdit 是一个专门用于输入 IPV4 地址的输入框控件。它兼容了传统的输入方式, 重新适配对 IPV4 的输入,目的是更友好的支持输入这种特殊格式的文本。 IpV4LineEdit 控件兼容了使用 Tab 键切换当前输入框的方式,当当前输入框输入完成后,可唤起 Tab 键 调整位置输入,同时 IpV4LineEdit 自带的特殊的 clear button 能够一键清除用户的 所有输入。 IpV4LineEdit 也支持现实特殊的警告信息,当用户输入方式有误时,IpV4LineEdit 提供 属性可唤起提示信息,告知用户输入方式的问题。 IpV4LineEdit 的效果如下图所示: @image html IPV4EditExample.png @property string IpV4LineEdit::text @brief text 属性表示当前属于 IpV4 的字符文本,会自动拼接 "." 字符,例如当用户输入 的字符是 "127.0.0.1"。当用户未进行任何输入,或者任意输入框都是空时,\c text 将 返回空字符。 @brief text 属性在用户输入的发生任何字符变化时,都会触发修改。 @property string IpV4LineEdit::alertText @brief alertText 属性表示 IpV4LineEdit 用于显示警告信息的警告文本。@brief alertText 属性可普通的 Edit 一样,都用于控制警告文本的输入。 @sa LineEdit @property string IpV4LineEdit::alertDuration @brief alertDuration 属性表示 IpV4LineEdit 用于显示警告信息的持续时长。@brief 当 alertDuration 结束后,警告信息将自动消失。 @sa LineEdit @property bool IpV4LineEdit::showAlert @brief showAlert 属性用于控制 IpV4LineEdit 的警告信息的现实和隐藏。 @details 当 showAlert 为true 时,警告信息会在 alertDuration 属性的持续时长完成或自动消失。 @property Palette IpV4LineEdit::backgroundColor @brief backgroundColor 属性用于控制 IpV4LineEdit 的背景颜色。 @details 默认情况下,该值会根据当前风格自动设置。 */ dtkdeclarative-5.7.12/docs/qml/ItemDelegate.zh_CN.dox000066400000000000000000000075241476226662700224140ustar00rootroot00000000000000 /** @~chinese @class ItemDelegate @ingroup ItemDelegate @ingroup QML_TYPES @brief 提供行云设计风格的 ItemDelegate 控件. @details ItemDelegate 是一个多被用于 ListView 中 当作视图项绘制的控件。在 QML 中 ItemDelegate 不再担任绘制的工作,它是一个基础控件,他的创建和释放;显示和隐藏都由 ListView 控制。 行云设计中, ItemDelegate 不仅兼容其原有的接口, 还添加了用于自定义的额外属性,这些属性在非行云设计的其他风格上可能无法正常使用。 ItemDelegate 的使用方式如下: ```qml ListView { implicitHeight: contentHeight width: 200 model: 4 delegate: ItemDelegate { text: "Nth " + index checked: index === ListView.view.count - 1 backgroundVisible: index % 2 === 0 } } ``` @property bool ItemDelegate::indicatorVisible @brief indicatorVisible 用于控制 ItemDelegate 中的 indicator 是否显示,默认为 false。 ItemDelegate 中的 indicator 是用于展示视图项被 选中时的“已选中”图标样式。 @property bool ItemDelegate::backgroundVisible @brief backgroundVisible 用于控制 ItemDelegate 中的 背景是否可见,默认情况下,该值是 true。 当需要某种情况下,显示视图项背景,其他情况不显示视图项背景时,可以使用该属性控制。 @property bool ItemDelegate::cascadeSelected @brief cascadeSelected 属性用于控制 ItemDelegate 是否 进行多选。默认情况下 cascadeSelected 为 false,即只能进行单选。当 \c cascadeSelected 属性为 true 时,被多选的视图项无法显示高亮背景。 @property bool ItemDelegate::contentFlow @brief contentFlow 属性用于控制 \c content 属性的填充方式,当 \c content 存在且需要让其 全部填充整个视图项时,将该属性设置为 true 是一个不错的选择。默认情况下, \c contentFlow 为 false。 @property Component ItemDelegate::content @brief content 属性用于控制 ItemDelegate 的自定义部件。@brief content 是除左侧图标和文本之外的,额外的自定义部件区域。 @property Palette ItemDelegate::checkedTextColor @brief checkedTextColor 属性用于控制 ItemDelegate 选中文字 的颜色调色板。默认情况下,该属性会根据其所处场景自动发生变化。 @property enumeration ItemDelegate::corners @brief corners 属性用于控制 ItemDelegate 背景的圆角方式。 @brief corners 可从以下枚举取值,也能混合取值。 \table \header \li 枚举值 \li 描述 \row \li RoundRectangle.NoneCorner \li 无圆角,即直角矩形。 \row \li RoundRectangle.TopLeftCorner \li 指定左上角为圆角。 \row \li RoundRectangle.TopRightCorner \li 指定右上角为圆角。 \row \li RoundRectangle.BottomLeftCorner \li 指定左下角为圆角。 \row \li RoundRectangle.BottomRightCorner \li 指定右下角为圆角。 \row \li RoundRectangle.TopCorner \li 指定矩形上部分为圆角,即左上角和右上角。 \row \li RoundRectangle.BottomCorner \li 指定矩形下部分为圆角,即左下角和右下角。 \row \li RoundRectangle.LeftCorner \li 指定矩形左边部分为圆角,即左上角和左下角。 \row \li RoundRectangle.RightCorner \li 指定矩形右边部分为圆角,即右上角和右下角。 \row \li RoundRectangle.AllCorner \li 指定矩形为全圆角矩形。 \endtable \sa RoundRectangle dtkdeclarative-5.7.12/docs/qml/KeySequenceEdit.zh_CN.dox000066400000000000000000000040601476226662700231020ustar00rootroot00000000000000 /** @~chinese @class KeySequenceEdit @ingroup Control @ingroup QML_TYPES @brief 提供一种快捷键监听的输入框控件. @details KeySequenceEdit 控件是一种用于监听快捷键事件的输入框控件。 KeySequenceEdit 提供了 默认的描述文本区域,可通过属性直接设置其快捷键类型。同时,也提供了用于隐式提示的文本字段。 KeySequenceEdit 只能用于监听应用内的快捷键,当 KeySequenceEdit 与系统快捷键发生冲突 时,可能无法正常工作。 KeySequenceEdit 的效果如下图所示: @image html KeySequenceEditExample.png KeySequenceEdit 支持默认的快捷键设置,可用于界面初始化的显示,用户通过点击指定区域,触发 KeySequenceEdit 快捷键监听机制,一旦触发,符合快捷键定义的任何键位都会被记录。 KeySequenceEdit 的使用方式如下代码: ```qml KeySequenceEdit { width: 504 height: 36 text: "关闭窗口" placeholderText: "请重新输入快捷键" keys: ["ALT", "F4"] //此快捷键见上图所示,为默认显示的快捷键 } ``` @property string KeySequenceEdit::text @brief text 属性用于控制该快捷键的显示文本。一般用于指定该快捷键代表哪一操作。 @property string KeySequenceEdit::placeholderText @brief placeholderText 属性用于表示用户清空键位,或键位为空时,隐式提示的文本。 @property list KeySequenceEdit::keys @brief keys 属性用于表示用户输入的键位 @details 初始化时,可以通过控制该属性指定默认键位。当用户输入后,该键位会跟随用户输入的值发生变化。 `keys`属性不会检查该键位是否正常。请在手动传递时确保键位正常。 @property Palette KeySequenceEdit::backgroundColor @brief backgroundColor 属性用于 KeySequenceEdit 控制背景颜色。 @property Palette KeySequenceEdit::placeholderTextColor @brief placeholderTextColor 属性用于 KeySequenceEdit 控制隐式提示的字体颜色。 */ dtkdeclarative-5.7.12/docs/qml/LineEdit.zh_CN.dox000066400000000000000000000022441476226662700215520ustar00rootroot00000000000000 /** @~chinese @class LineEdit @ingroup TextField @ingroup QML_TYPES @brief 提供一种自带清除按钮的输入框控件. @details LineEdit 提供了一种单行输入控件。与 Qt 的 TextField 控件不同的是LineEdit 自带了一个可以清除所有输入的 ActionButton,方便用于在输 入后进行一件清除的快捷操作,其他属性和方法都和 TextField 空间保持一致。
LineEdit 控件的效果如下图所示: @image html LineEditExample.png LineEdit 将清除按钮暴露出来,使用时可以更方便地在清除按钮周围添加自定义控件。 @property Item LineEdit::clearButton @brief clearButton 属性获取 LineEdit 中的清除按钮。 clearButton 属性 能够更方便的操作 LineEdit,在 LineEdit 周围添加自定义按钮和空间。 例如以下代码: ```qml LineEdit { width: 200 text: "~/.ssh/ssh_keygen.key" ActionButton { anchors { right: parent.clearButton.left rightMargin: 5 verticalCenter: parent.verticalCenter } icon.name: "entry_loadfile" } } ``` */ dtkdeclarative-5.7.12/docs/qml/Menu.zh_CN.dox000066400000000000000000000113731476226662700207640ustar00rootroot00000000000000 /** @~chinese @class Menu @ingroup Menu @ingroup QML_TYPES @brief 提供一种行云设计风格的 Menu 控件. @details Menu 控件大多被用于应用菜单,例如功能菜单、右键菜单等。 DTK 实现的菜单 比原有样式的菜单更流畅;更定制化,它能够兼容 Menu 的所有接口,并且能够做 到内部的 MenuItem 自动适配菜单的宽高。
除此之外,Menu 还支持添加头部控件和尾部控件,当需要添加自定义搜索内容时, 头部控件可以添加 SearchEdit 来实现。
Menu 的最大项目个数在 DTK 的设计中是 16,当超过该数值时,Menu 会出现 滚动选项,同时 菜单的上部和下部会出现上下移动的按钮,鼠标放置时可自动进行移动。
Menu 的基本用于如下代码所示:
```qml Menu { MenuItem { text: qsTr("打开") } MenuItem { text: qsTr("在新窗口打开") } MenuItem { text: qsTr("在新标签中打开") } MenuItem { text: qsTr("以管理员身份打开") } MenuSeparator {} MenuItem { text: qsTr("复制") } MenuSeparator {} MenuItem { text: qsTr("共享文件夹")} MenuItem { text: qsTr("创建链接")} MenuItem { text: qsTr("发送到桌面")} MenuItem { text: qsTr("在终端中打开")} Menu { title: qsTr("自定义")} MenuItem { text: qsTr("压缩")} MenuItem { text: qsTr("属性")} } ``` 如上代码, Menu 内部控件需要使用 Menu、MenuItem 或者 MenuSeparator,其中 MenuItem 用 来显示实际的菜单项,包含图表和文本, MenuSeparator 用来显示菜单中的分隔符。在菜单中内部的 子菜单,可以使用 Menu 叠加的方式完成。
对于自定义头部控件,这里使用一个 SearchEdit 的示例表示:
```qml Menu { id: searchAndArrowMenu width: 160 header: SearchEdit { placeholder: qsTr("搜索") onTextChanged: { proxyModel.filterText = text proxyModel.update() } } model: ObjectModelProxy { id: proxyModel property string filterText filterAcceptsItem: function(item) { return item.text.includes(filterText) } sourceModel: searchAndArrowMenu.contentModel } maxVisibleItems: 10 MenuItem { text: qsTr("Greek(cp869)") } MenuItem { text: qsTr("Cyrillic (ISO 8859-5)") } MenuItem { text: qsTr("Cyrillic(KOI8-R)") } MenuItem { text: qsTr("Devanagari(x-mac-davanagari)") } MenuItem { text: qsTr("Gurmukhi(x-mac-gurmukhi)") } MenuItem { text: qsTr("Thai (ISO 8859-11)") } MenuItem { text: qsTr("Simplified Chinese(x-mac-sim-chinese)") } MenuItem { text: qsTr("Chinese(GBK)"); checked: true} MenuItem { text: qsTr("Chinese(GB 18030)") } MenuItem { text: qsTr("Chinese(ISO 2022-CN)") } MenuItem { text: qsTr("Simplified Chinese (GB2312)") } MenuItem { text: qsTr("Tibetan (x-mac-tibetan)") } MenuItem { text: qsTr("Central European(ISO Latin 2)") } MenuItem { text: qsTr("Central Eu 188 opx(ISO Latin 4)") } MenuItem { text: qsTr("Baltic (ISO Latin 7)") } } ``` @property int Menu::maxVisibleItems @brief maxVisibleItems 用于控制菜单中的最大项数 @details 默认情况下,该值是 16。当 Menu中的项数超过最大可视项目数量,其他的菜单项会处于滚动显示的状态。
并且在菜单的头部和尾部会添加向上和向下滚动的按钮,当鼠标放置在上面时,菜单自动滚动。 @property Palette Menu::backgroundColor @brief backgroundColor 属性控制 Menu 的背景颜色。 @property var Menu::model @brief `model` 属性是 Menu 的模型,`model`用于控制菜单的数据添加和删除,动态进行数据创建等等。 @details 一般情况下, Menu 只需要手动添加 MenuItem 而不需要指定`model`, 当需要对`model`的数据进行过滤时,可以使用 ObjectModelProxy 包装该模型。 一般可用于控制 MenuItem 的显示和隐藏,创建和删除。手动控制 MenuItem 中 visible 属性会在 Menu 中留下一个视觉上的空位,因此不推荐直接使用 visible 属性控制 MenuItem 的隐藏。 @property Component Menu::header @brief header 属性可指定 Menu 的自定义的头部组件。 @property Component Menu::footer @brief footer 属性可指定 Menu 的自定义的底部组件。 @property bool Menu::existsChecked @note 此属性为只读属性 @brief existsChecked 属性可判断当前的 Menu 中是否存在已经选中的 MenuItem,如果存在则返回 true , 否则返回 false。 */ dtkdeclarative-5.7.12/docs/qml/MenuItem.zh_CN.dox000066400000000000000000000022321476226662700215750ustar00rootroot00000000000000 /** @~chinese @class MenuItem @ingroup MenuItem @ingroup QML_TYPES @brief 提供一种行云设计风格的 MenuItem 控件. @details MenuItem 控件是Menu中的基础 菜单项控件。 MenuItem 可以实现添加文字,图标,子菜单等等。 并且,MenuItem 目前实现了对 QtIcon 和 DciIcon 的兼容。 DTK 实现的 MenuItem 能够使用原始的所有接口,为了更加兼容 行云设计风格,DTK 也为其提供了自定义开发属性,用于更加自定义的控制控件的状态。 其使用方式,可以参考Menu中的示例。 @property bool MenuItem::useIndicatorPadding @brief useIndicatorPadding 属性控制 indicator 的 padding 属性 @details 当`useIndicatorPadding`属性开启时,选中情况下会默认对 indicator 添加 padding。默认情况下, 该属性会根据当前 MenuItem 的状态自动发生变化。 @property Palette MenuItem::textColor @brief textColor 属性控制 MenuItem 控件的前景颜色。包含文字和图标的颜色。 @property Palette MenuItem::subMenuBackgroundColor @brief subMenuBackgroundColor 属性控制 MenuItem 控件子菜单的背景颜色。 */ dtkdeclarative-5.7.12/docs/qml/MenuSeparator.zh_CN.dox000066400000000000000000000031211476226662700226350ustar00rootroot00000000000000 /** @~chinese @class MenuSeparator @ingroup MenuSeparator @ingroup QML_TYPES @brief 提供一种行云设计风格的 MenuSeparator 控件. @details MenuSeparator 控件被用做 Menu 控件的菜单分隔符控件。 行云设计提供的 MenuSeparator 控件不光能够作为分隔符, 还能够添加自定义文本当作分隔描述。
例如,可以使用如下方式添加自定义文本的菜单分隔符: ```qml Menu { MenuSeparator { text: qsTr("单曲")} // 创建带文本的菜单分隔符 MenuItem { icon.name: "folder-music-symbolic"; text: qsTr("Tomorrow-Fly By Midnight") } MenuItem { icon.name: "folder-music-symbolic"; text: qsTr("Tomorrow With You (EN]ABA)- Senpai Kondor") } MenuItem { icon.name: "folder-music-symbolic"; text: qsTr("Tomorrow will be fine. - Sodagreen") } MenuItem { icon.name: "folder-music-symbolic"; text: qsTr("CROWN - TOMORROW X TOGETHER") } MenuSeparator { text: qsTr("歌手")} MenuItem { icon.name: "music"; text: qsTr("Tomorrow - Fly By Midnight") } MenuSeparator { text: qsTr("专辑")} MenuItem { icon.name: "music"; text: qsTr("DTK-Menu-Menuitem-ICON-Right-Light") } MenuItem { icon.name: "music"; text: qsTr("CROWN - TOMORROW X TOGETHER") } } ``` @property string MenuSeparator::text @brief text 属性控制 MenuSeparator 是否带文本, @details 如果未添加`text` 属性,MenuSeparator 只是一个带水平线的菜单项。 @property Palette MenuSeparator::textColor @brief textColor 属性用于控制文本和水平线的颜色。 */ dtkdeclarative-5.7.12/docs/qml/OutsideBoxBorder.zh_CN.dox000066400000000000000000000022131476226662700232740ustar00rootroot00000000000000/** @~chinese @class OutsideBoxBorder @ingroup Item @ingroup QML_TYPES @brief 提供一种外边框控件. @details OutsideBoxBorder 控件是一种修饰宿主控件的外边框(外描边)控件,与 InsideBoxBorder 控件相对应, 在设计和美化界面时,离不开好的描边来使宿主控件显得更有层次,更加丰满。
OutsideBoxBorder 的用法如下所示: ```qml Rectangle { width: 200 height: 200 color: "darkBlue" radius: 8 OutsideBoxBorder { anchors.fill: parent color: "darkCyan" radius: 8 borderWidth: 2 } } ``` 其效果如下图所示: @image html OutsideBoxBorderExample.png @property real OutsideBoxBorder::borderWidth @brief borderWidth 属性用于表示 OutsideBoxBorder 控件的边框大小。 默认情况下,该值是 1。 @property color OutsideBoxBorder::color @brief color 属性表示外边框的颜色值。默认情况下,该值是 "white" @property real OutsideBoxBorder::radius @brief radius 属性表示内边框的圆角大小,默认情况下,该大小为 0。 */ dtkdeclarative-5.7.12/docs/qml/PageIndicator.zh_CN.dox000066400000000000000000000000301476226662700225550ustar00rootroot00000000000000/** TODO:补全文档 */dtkdeclarative-5.7.12/docs/qml/PasswordEdit.zh_CN.dox000066400000000000000000000014201476226662700224600ustar00rootroot00000000000000 /** @~chinese @class PasswordEdit @ingroup Item \inqmlmodule LineEdit @ingroup QML_TYPES @brief 提供一种用于密码输入的输入框控件. @details PasswordEdit 控件专门用于进行密码的输入,它自动适配了密码显示和隐藏按钮,提供了 快捷的密码输入方式。 PasswordEdit 的效果如下图所示: @image html PasswordEdit.png @property bool PasswordEdit::isEchoMode @brief isEchoMode 属性表示当前是否为密码输入模式 @details 当处于密码输入模式时,密码输入框会将输入的文本进行密文展示。 @property bool PasswordEdit::echoButtonVisible @brief echoButtonVisible 属性用于控制密码显示和隐藏按钮的可视化属性。 @details 默认情况下,该属性为 true 。 */ dtkdeclarative-5.7.12/docs/qml/PlusMinusSpinBox.zh_CN.dox000066400000000000000000000035121476226662700233160ustar00rootroot00000000000000 /** @~chinese @class PlusMinusSpinBox @ingroup Item @ingroup QML_TYPES @brief 一种加减按钮样式的数字轮选框控件. @details PlusMinusSpinBox 控件是基于基础的 SpinBox 控件进行调整的特殊样式控件, PlusMinusSpinBox 将 SpinBox 内部调整数值的按钮从上下箭头修改为特殊的加减号按钮和还原按钮,
默认情况下还原按钮不作显示,可通过属性控制该按钮的显示和隐藏。
PlusMinusSpinBox 主要用于特殊场景、特殊样式下的独特的 SpinBox 控件,
应用可根据实际场景选择使用 SpinBox 控件还是 PlusMinusSpinBox 控件。
PlusMinusSpinBox 的效果如下图所示:
@image html PlusMinusSpinBox.png PlusMinusSpinBox 提供了控制 SpinBox 的属性,例如输入方式、警告信息等等。
因此PlusMinusSpinBox 具备 SpinBox 的所有特性。
@property Item PlusMinusSpinBox::spinBox @brief spinBox 属性是控制 PlusMinusSpinBox 内部的 SpinBox 的统一属性。 @details 例如,可以通过控制 SpinBox 的 alertText 等属性调整其警告信息,如下代码所示: ```qml PlusMinusSpinBox { spinBox.editable: true spinBox.alertText: "只能输入数字" spinBox.showAlert: true } ``` @property bool PlusMinusSpinBox::upButtonVisible @brief upButtonVisible 属性控制 “+” 号按钮的显示和隐藏。 @details 默认情况下,`upButtonVisible为`true。 @property bool PlusMinusSpinBox::downButtonVisible @brief downButtonVisible 属性控制 “-” 号按钮的显示和隐藏。 @details 默认情况下,`downButtonVisible`为 true。 @property bool PlusMinusSpinBox::resetButtonVisible @brief resetButtonVisible 属性控制还原按钮的显示和隐藏。 @details 默认情况下,`resetButtonVisible`为 false。 */ dtkdeclarative-5.7.12/docs/qml/Popup.zh_CN.dox000066400000000000000000000000301476226662700211470ustar00rootroot00000000000000/** TODO:补全文档 */dtkdeclarative-5.7.12/docs/qml/PopupWindow.zh_CN.dox000066400000000000000000000015751476226662700223560ustar00rootroot00000000000000 /** @~chinese @class PopupWindow @ingroup Window @ingroup QML_TYPES @brief 提供一种 Popup 类型的窗口控件. @details PopupWindow 控件是一个独立的窗口,和 Window 控件一致,都能够作为相对于主窗口外的 独立窗口进行显示。 PopupWindow 是一种提供 Popup 属性的窗口,他不具备正常的 Dialog 或者 ApplicationWindow 通用的 TitleBar 控件,它可被用于弹出式窗口,即弹即回的样式。 PopupWindow 除正常的用于 Window 的属性外,由于其 Popup 的特性,它还拥有特殊的窗口 背景模糊的效果,窗口背景的混成和默认的主题风格保持一致。 @property Item PopupWindow::blurControl @brief blurControl 属性是模糊背景的宿主控件,主要用于保持跟宿主控件相同的调色板信息。 用于获取宿主控件的调色版某种角色。 */ dtkdeclarative-5.7.12/docs/qml/ProgressBar.zh_CN.dox000066400000000000000000000026251476226662700223110ustar00rootroot00000000000000 /** @~chinese @class ProgressBar @ingroup ProgressBar @ingroup QML_TYPES @brief 提供一种行云设计风格的进度条控件. ProgressBar 控件提供行云设计风格的进度条控件。根据使用场景不同,ProgressBar 的样式也会跟随发生变化。 ProgressBar 根据 \c indeterminate 属性的不同样式也跟随不同。 \c indeterminate 属性为 true 时,进度条被设置成“无进度”模式, 即无法确定当前进去情况下的进度条样式。 例如以下效果: @image html ProgressBarIn.png 同样的, ProgressBar 在设置文本和未设置文本时样式 也不一样,未设置文本时, ProgressBar 处于无法控制的 状态,其背景会呈现出淡灰色样式,而在设置文本属性后,背景变成可以操作的按钮样式,即指示 用于当前的 ProgressBar 是可以进行操作暂停或者停止的。 例如以下效果: @image html ProgressBarText.png @property string ProgressBar::formatText @brief formatText 属性控制 ProgressBar 是否使用 @details 格式化文本添加当前进度,例如下图的场景: @image html ProgressBarFormatText.png @property bool ProgressBar::animationStop @brief animationStop 属性控制 ProgressBar 正在进行的 进度动画是否停止,默认情况在为 false。 @note 请注意,该属性只在`indeterminate`属性为 true 时才有效。 */ dtkdeclarative-5.7.12/docs/qml/RatioButton.zh_CN.dox000066400000000000000000000022631476226662700223300ustar00rootroot00000000000000 /** @~chinese @class RadioButton @ingroup RadioButton @ingroup QML_TYPES @brief 提供一种行云设计风格的 RadioButton 控件. RadioButton 提供了一种“选中”和“未选中”状态的功能 按钮。当同时存在多个RadioButton 时,只会一个作为 当前选中的RadioButton。 DTK 风格的RadioButton 继承了原始的所有 API,能够 同时添加文本和图标当作其内容。默认情况下 autoExclusive 属性是 true,因此多个RadioButton 存在的情况下,只会独占一个按钮。 DTK 风格的RadioButton 使用 DciIcon 作为其内部 使用的图标样式,在不同状态切换时,有不同的特殊效果,例如下图所示: | **状态** | **模式** | **效果** | |------------------|---------|---------------------------------------------| | {1, 2} checked | Normal | @image html RatioButtonNormal.png | | | Hovered | @image html RadioButtonCheckedHovered.png | | {1, 2} unchecked | Normal | @image html RatioButtonUncheckedNormal.png | | | Hovered | @image html RatioButtonUncheckedHovered.png | */ dtkdeclarative-5.7.12/docs/qml/RecommandButton.zh_CN.dox000066400000000000000000000007621476226662700231610ustar00rootroot00000000000000 /** @~chinese @class RecommandButton @ingroup Button @ingroup QML_TYPES @brief 一种用于提示的推荐型按钮. @details RecommandButton 控件与基本的Button按钮样式类似。 但 RecommandButton 作为推荐按钮,其作用场景通常为推荐用户选择(或点击)的一类按钮, 在样式设计上,它的默认样式显得更突出,背景使用渐变的高亮背景进行控制。
例如以下样式: @image html RecommandButtonExample.png */ dtkdeclarative-5.7.12/docs/qml/RectangularShadow.zh_CN.dox000066400000000000000000000037431476226662700234770ustar00rootroot00000000000000 /** @~chinese @class RectangularShadow @ingroup Item @ingroup QML_TYPES @brief 一种只支持硬件渲染模式的矩形阴影控件. @details RectangularShadow 是 GlowEffect 应用形态,它重新整理了 GlowEffect 的各个属性,并将其修饰为 更容易理解的属性名称。 RectangularShadow 相对于 GlowEffect 更容易使用。 但 RectangularShadow 和 GlowEffect 都有同样的缺点:暂不支持使用软件渲染。因此使用这两种效果时 需要注意对不同渲染模式的适配。如果在使用中更倾向于软硬件的兼容,请使用: BoxShadow 效果。 RectangularShadow 和 GlowEffect 一样,都提供一种矩形阴影效果。RectangularShadow的 使用方式如下所示: ```qml RectangularShadow { anchors.fill: shadowSource glowRadius: 20 spread: 0 color: "black" cornerRadius: shadowSource.radius } Rectangle { id: shadowSource width: 120 height: 120 radius: 16 color: "red" } ``` 其效果如下图所示: @image html RectangularShadowExample.png @property real RectangularShadow::offsetX @brief offsetX 属性定义阴影在x轴方向上的偏移,默认是0。 @property real RectangularShadow::offsetY @brief offsetY 属性定义阴影在y轴方向上的偏移,默认是0。 @property real RectangularShadow::glowRadius @brief glowRadius 属性定义阴影到达项目区域外部(或内部)的像素数,默认是 0。 @property real RectangularShadow::spread @brief spread 属性定义在源四周区域的阴影颜色的增强程度,默认是0 @property color RectangularShadow::color @brief color 属性定义阴影颜色。 @property real RectangularShadow::cornerRadius @brief cornerRadius 属性定义绘制阴影的控件的圆角大小。 @property bool RectangularShadow::fill @brief fill 属性定义阴影是否填充整个区域。 */ dtkdeclarative-5.7.12/docs/qml/RoundButton.zh_CN.dox000066400000000000000000000000301476226662700223270ustar00rootroot00000000000000/** TODO:补全文档 */dtkdeclarative-5.7.12/docs/qml/ScrollBar.zh_CN.dox000066400000000000000000000000301476226662700217270ustar00rootroot00000000000000/** TODO:补全文档 */dtkdeclarative-5.7.12/docs/qml/SearchEdit.zh_CN.dox000066400000000000000000000025001476226662700220630ustar00rootroot00000000000000/** @~chinese @class SearchEdit @ingroup LineEdit @ingroup QML_TYPES @brief 提供一种带搜索的输入框控件. @details SearchEdit 控件是一种用于搜索的输入框控件, SearchEdit 自带了搜索图标,并且在搜索和 未搜索时具有动画过渡效果。 SearchEdit 继承自 LineEdit ,具备 LineEdit 的几乎所有特性。SearchEdit 除了可以被 使用在主窗口的任何位置,同样也能被使用在 Menu, PopupWindow 等控件上,当作复合控件存在。 SearchEdit 的效果如下图所示: @image html SeachEditNoFocus.png SearchedEdit 在焦点状态下的效果如下图所示: @image html SearchEditFocus.png SearchedEdit 的整体运行效果如下: @image html SearchEditRunning.gif @property string SearchEdit::placeholder @brief placeholder 属性是当 SearchEdit 处于未搜索状态时,用于显示提示的文本。 @details 默认情况下,该文本为翻译后的“搜索”字符串。可通过重新设置该属性调整显示文本。 @property bool SearchEdit::editting @note 此属性为只读属性 @brief editting 属性用于判断当前控件是否处于正在编辑的状态。 @details SearchEdit 存在两种状态:正在编辑的状态和非编辑状态。 当处于正在编辑的状态时,用于可直接键入文本。 dtkdeclarative-5.7.12/docs/qml/Slider.zh_CN.dox000066400000000000000000000074751476226662700213120ustar00rootroot00000000000000/** @~chinese @class Slider(FlowStyle) @ingroup Slider @ingroup QML_TYPES @brief 提供一种行云设计风格的滑动条控件. @details Slider 控件被用于通过控制滑块选择指定值或者代表某一进度。
Slider 在行云设计中增加了许多用于额外控制的方式和布局,例如增加了用于指示进度的提示文本;
提供了上下左右四个方向的滑块;
Slider 的用法如下代码所示:
```qml Slider { width: parent.width handleType: Slider.HandleType.ArrowBottom } ``` Slider 的效果如下图所示:
| **方向** | **滑块方向** | **效果** | |--------|----------|---------------------------------| | 横向 | 无滑块方向 | @image html SliderNormalHor.png | | 纵向 | 滑块朝下 | @image html SliderNormalVer.png | @property Palette Slider(FlowStyle)::grooveColor @brief grooveColor 属性控制滑槽的颜色, \c grooveColor 并非控制滑槽划过区域的颜色, 而是整个滑槽的默认颜色。 @property enumeration Slider(FlowStyle)::handleType @brief handleType 属性表示滑块的方向,默认情况下,滑块无任何方向。 @details handleType 可供使用的枚举为:
| **枚举** | **含义** | |:------------------------:|:------------------------:| | Slider.NoArrowHorizontal | 水平无方向 | | Slider.NoArrowVertical | 竖直无方向 | | Slider.ArrowUp | 滑块箭头朝上,一般用于滑动条为水平方向时 | | Slider.ArrowLeft | 滑块箭头朝左,一般用于滑动条为竖直方向时 | | Slider.ArrowBottom | 滑块箭头朝下,一般用于滑动条为水平方向时 | | Slider.ArrowRight | 滑块箭头朝右,一般用于滑动条为竖直方向时 | @note 注意,水平无方向和竖直无方向,在滑动条的水平和数值方向时,滑块的图标也不一样, 水平无方向时,滑块宽度高于高度,显得更加扁平,竖直无方向时,滑块高度高于宽度,显得更加修长。 @property real Slider(FlowStyle)::dashOffset @brief dashOffset 属性是绘制滑块时,画笔的起始位置偏移量。 @image html SliderDashOffset.png 如上图所示,当 \c dashOffset 不为0时,绘制滑槽的位置将根据绘制位置发生 偏移,例如下述示例,\c dashOffset 为 0 和 dashOffset 为 20 的比较。 @image html SliderDashOffsetCompare.png 上图中,上层 Slider 调整了 dashOffset 而 Slider 未调整,但从上图可以看出 并不是 Slider 设置 dashOffset 值,绘制就会在偏移 dashOffset 大小后开始,它 还受绘制的间距影响,例如下图所示: @image html SliderDashOffsetCompareWithPattern.png @property var Slider(FlowStyle)::dashPattern @brief dashPattern 表示绘制点和间距的距离,默认值为[0.5, 0.25] @details 即可以理解为,每绘制0.5 像素的滑条样式,就绘制 0.25 像素的间距。将其中值变大,会起到其代表的那一部分的区域变大的效果。 例如以下代码: ```qml Slider { dashPattern: [0.5, 5] // 每绘制0.5像素的滑块,就绘制5像素的间距 width: 200 } ``` 效果如下图所示: @image html SliderDashPattern.png @property bool Slider(FlowStyle)::highlightedPassedGroove @brief highlightedPassedGroove 属性控制是否高亮滑块移动过的区域, @details 默认情况下 highlightedPassedGroove为 false。
效果如下所示: | **highlightedPassedGroove** | **效果** | |:---------------------------:|:---------------------------------:| | false | @image html SliderNormalHor.png | | true | @image html SliderHighlighted.png | */ dtkdeclarative-5.7.12/docs/qml/SliderTipItem.zh_CN.dox000066400000000000000000000040051476226662700225700ustar00rootroot00000000000000/** @~chinese @class SliderTipItem @ingroup Control @ingroup QML_TYPES @brief 被用于放置在 TipsSlider 控件中的滑块标签. @details SliderTipItem 是被用于放置在 TipsSlider 中的滑块标签控件。 SliderTipItem 可以添加特殊 的文本,用于指示滑动条的位置信息,文本可以是数字;特殊标签等等。 SliderTipItem 的使用方式如下: ```qml TipsSlider { id: sliderTickTip readonly property var tips: [qsTr("Fast"), qsTr("Slow")] width: 200 tickDirection: TipsSlider.TickDirection.Back slider.handleType: Slider.HandleType.ArrowBottom ticks: [ SliderTipItem { text: sliderTickTip.tips[0] }, SliderTipItem { text: sliderTickTip.tips[1] } ] } ``` @sa TipsSlider @property string SliderTipItem::text @brief text 属性用于控制 SliderTipItem 当前显示的文本。 @property enumeration SliderTipItem::textHorizontalAlignment @brief textHorizontalAlignment 属性用于控制 SliderTipItem 文本水平布局,默认情况下为 水平居中(Text.AlignHCenter)。 可使用以下枚举: Text.AlignLeft, Text.AlignRight, Text.AlignHCenter @property enumeration SliderTipItem::direction @note 只读属性 @brief direction 属性和其所属的 Slider 的 direction 属性保持一致。 @sa Slider::direction @property bool SliderTipItem::horizontal @note 只读属性 @brief horizontal 属性和其所属的 Slider 的 horizontal 属性保持一致。 @sa Slider::horizontal @property bool SliderTipItem::highlight @brief highlight 属性控制 SliderTipItem 中背景是否需要高亮,默认情况下为 false。 @property Palette SliderTipItem::tickColor @brief tickColor 属性控制 SliderTipItem 中控制滑块标签指示的颜色(一般用于连接文字和滑动条的水平 或竖直线条)。 @property Palette SliderTipItem::textColor @brief textColor 属性控制 SliderTipItem 中文本颜色。 */ dtkdeclarative-5.7.12/docs/qml/SortFilterModel.zh_CN.dox000066400000000000000000000056431476226662700231410ustar00rootroot00000000000000/** @~chinese @class SortFilterModel @ingroup DelegateModel @ingroup QML_TYPES @brief 提供一种自带过滤和排序的 DelegateModel. @details SortFilterModel 提供自带过滤和排序的 DelegateModel,SortFilterModel 中的特定函数控制了
其中列表中每个项的显示和隐藏,通常和控件中的搜索功能绑定。
一般的 SortFilterModel 用法如下:
```qml Rectangle { width: 200; height: 100 SortFilterModel { id: visualModel model: ListModel { ListElement { name: "Apple" } ListElement { name: "Orange" } } delegate: Rectangle { height: 25 width: 100 Text { text: "Name: " + name} } } ListView { anchors.fill: parent model: visualModel } } ``` 上述示例不带任何排序和过滤,对上述代码修改可实现特定情况的过滤,例如下述代码过滤 type 1 类型的元素。 ```qml Rectangle { width: 200; height: 100 SortFilterModel { id: visualModel model: ListModel { ListElement { type: 1; name: "Apple" } ListElement { type: 2; name: "Orange" } } delegate: Rectangle { height: 25 width: 100 Text { text: "Name: " + name} } filterAcceptsItem: function(item) { return item.type === 1 } } ListView { anchors.fill: parent model: visualModel } } ``` 对于多个 type == 1 的元素时,可以通过 lessThan 函数对过滤出的元素进行排序,如下代码: ```qml Rectangle { width: 200; height: 100 SortFilterModel { id: visualModel model: ListModel { ListElement { type: 1; prior: 2; name: "Apple" } ListElement { type: 2; prior: 1; name: "Coconut" } ListElement { type: 2; prior: 1; name: "Orange" } } delegate: Rectangle { height: 25 width: 100 Text { text: "Name: " + name} } filterAcceptsItem: function(item) { return item.type === 1 } lessThan: function(item1, item2) { return item1.prior < item2.prior } } ListView { anchors.fill: parent model: visualModel } } ``` @property var SortFilterModel::lessThan @brief lessThan 函数用于排序。 @property var SortFilterModel::filterAcceptsItem @brief filterAcceptsItem 函数用于进行视图项的过滤。 @property var SortFilterModel::visibleGroup @brief visibleGroup 为当前可视的 DelegateModelGroup 。 @sa DelegateModelGroup */ dtkdeclarative-5.7.12/docs/qml/SpinBox.zh_CN.dox000066400000000000000000000030431476226662700214350ustar00rootroot00000000000000 /** @~chinese @class SpinBox @ingroup SpinBox @ingroup QML_TYPES @brief 提供一种行云设计风格的 SpinBox 控件. @details SpinBox控件一种行云设计风格的数字轮选框控件。SpinBox提供了视图组件和编辑组件 2 种,当处于视图组件时, SpinBox控件的轮选器变成平面的可视化形状,当处于编辑组件时,SpinBox将轮选器修改为类似于按钮的形状。 除此之外,SpinBox提供了水平带“+”,“-”符号的数字轮选框,可查看 PlusMinusSpinBox 控件。 SpinBox的使用方式如下所示: ```qml SpinBox { from: 0 to: 23 value: 8 } ``` SpinBox在视图组件下的效果如下图所示: @image html SpinBoxExample.png SpinBox在编辑组件下的效果如下图所示: @image html SpinBoxEdit.png @property string SpinBox::alertText @brief alertText 属性表示SpinBox的警告文本。 @details 默认情况下,不显示任何警告提示。
SpinBox显示警告的效果如下图所示: @image html SpinBoxAlert.png @property int SpinBox::alertDuration @brief alertDuration 属性表示SpinBox的警告时长 @details 警告信息会在警告时常结束后自动隐藏,当 alertDuration 为 -1 或不设置时,警告信息会根据 \c showAlert 属性进行显示和隐藏。 @property bool SpinBox::showAlert @brief showAlert 属性控制警告信息的显示和隐藏 @details 当`showAlert` 为 true 时,警告信息会在 `alertDuration` 结束后,`showAlert` 会自动置为 false。 */ dtkdeclarative-5.7.12/docs/qml/SpinBoxIndicator.zh_CN.dox000066400000000000000000000000301476226662700232630ustar00rootroot00000000000000/** TODO:补全文档 */dtkdeclarative-5.7.12/docs/qml/StackView.zh_CN.dox000066400000000000000000000000301476226662700217440ustar00rootroot00000000000000/** TODO:补全文档 */dtkdeclarative-5.7.12/docs/qml/StyledArrowShapeWindow.zh_CN.dox000066400000000000000000000000301476226662700244740ustar00rootroot00000000000000/** TODO:补全文档 */dtkdeclarative-5.7.12/docs/qml/StyledBehindWindowBlur.zh_CN.dox000066400000000000000000000021611476226662700244460ustar00rootroot00000000000000/** @~chinese @class StyledBehindWindowBlur @ingroup BehindWindowBlur @brief 提供一个 DTK 统一的窗口外模糊控件. @details StyledBehindWindowBlur 控件继承于 BehindWindowBlur 控件, 其在 BehindWindowBlur 控件的基础上指定了特定的 混色渲染颜色。 当应用进行 DTK 程序开发时,推荐使用 StyledBehindWindowBlur 控件,能够保证应用模糊的混色颜色一致。
通常情况下,其混色颜色如下表所示: | **模式** | **颜色** | |:--------:|:------------------------:| | 亮色-支持模糊 | rgba(235, 235, 235, 0.6) | | 亮色-不支持模糊 | rgba(235, 235, 235, 1.0) | | 暗色-支持模糊 | rgba(0, 0, 0, 0.3) | | 暗色-不支持模糊 | rgba(35, 35, 35, 1.0) | @property var StyledBehindWindowBlur::control @brief 该属性用于指定 StyledBehindWindowBlur 控件作用于那个控件之上 @details 其目的用户获取该控件的调色板颜色值用于判定当前处于那种主题下,用于选择合适的混合填充色。 该属性使用 Control 和 ApplicationWindow 都符合要求。 */ dtkdeclarative-5.7.12/docs/qml/Switch.zh_CN.dox000066400000000000000000000017401476226662700213160ustar00rootroot00000000000000 /** @~chinese @class Switch @ingroup Switch @ingroup QML_TYPES @brief 提供一种行云设计风格的 Switch 控件. @details Switch 控件是一个用于切换的开关按钮,Switch 一般情况下不需要使用文本修饰,但它可以额外添加文本。 Switch 控件使用 DciIcon 完成,具有丰富的阴影和动画效果。 Switch 的效果如下图所示: @image html SwitchButton.png Switch 的用法如下所示: ```qml ColumnLayout { Switch { text: qsTr("Wi-Fi") } Switch { text: qsTr("Bluetooth") } } ``` @property Palette Switch::backgroundColor @brief backgroundColor 属性用于控制 Switch 控件的背景颜色。 @property Palette Switch::handleColor @brief handleColor 属性用于控制 Switch 控件的滑块的颜色。 @details Switch 在非 checked 状态下的颜色,如需修改 checked 状态下颜色,请尝试修改 palette.highlight 调色板。 */ dtkdeclarative-5.7.12/docs/qml/TextArea.zh_CN.dox000066400000000000000000000010721476226662700215700ustar00rootroot00000000000000/** @~chinese @class TextArea(FlowStyle) @ingroup TextArea @ingroup QML_TYPES @brief 提供一种行云设计风格的 TextArea 控件. @details {TextArea(FlowStyle)}{TextArea}是一个文本输入区域控件, 其支持多行输入。 效果如下: @image html TextAreaExample.png ``qml TextArea { text: "你好,这里是多行输入框" width: 100 height: 100 } ``` @property Palette TextArea(FlowStyle)::placeholderTextColor @brief placeholderTextColor 控制{TextArea(FlowStyle)}{TextArea}的占位文本颜色。 */ dtkdeclarative-5.7.12/docs/qml/TextField.zh_CN.dox000066400000000000000000000027601476226662700217500ustar00rootroot00000000000000/** @~chinese @class TextField @ingroup TextField @ingroup QML_TYPES @brief 提供一种行云设计风格的 TextField 控件. @details TextField 是一个单行文本输入框。TextField 拓展了原生的 TextField 控件,增加了部分自定义属性用于提高拓展性。例如,适配了警告提示;调整了风格样式。 但 TextField 和 LineEdit 相比, TextField 未添加文本清除按钮。 TextField 的样式如下所示: | **状态** | **图片** | |:--------:|:---------------------------------:| | Normal | @image html TextFieldNormal.png | | Focus | @image html TextFieldFocus.png | | Disabled | @image html TextFieldDisabled.png | @property Palette TextField::backgroundColor @brief backgroundColor 属性控制 TextField 的背景颜色。 @property string TextField::alertText @brief backgroundColor 属性控制警告信息的文本。 @property int TextField::alertDuration @brief alertDuration 属性控制警告信息的显示时长 @details 默认情况下,不设置显示时常警告信息会在`showAlert`属性为`false`时隐藏,设置后会在`alertDuration`结束后隐藏, `alertDuration`为 -1 时,表示一直显示。 @property bool TextField::showAlert @brief showAlert 属性控制警告信息是否显示 @details `showAlert` 为 true 时,警告信息会在`alertDuration`结束后自动隐藏,`showAlert` 会跟随变为`false`,否则需要手动控制`showAlert`属性隐藏。 */ dtkdeclarative-5.7.12/docs/qml/ThemeMenu.zh_CN.dox000066400000000000000000000004731476226662700217460ustar00rootroot00000000000000/** @~chinese @class ThemeMenu @ingroup Menu(FlowStyle) @ingroup QML_TYPES @brief 提供默认主题菜单. @details ThemeMenu 控件用于提供默认的主题菜单,自带亮色主题、暗色主题和系统主题三种主题菜单。 其效果如下图所示: @image images/ThemeMenuExample.png */ dtkdeclarative-5.7.12/docs/qml/TipsSlider.zh_CN.dox000066400000000000000000000045411476226662700221410ustar00rootroot00000000000000/** @~chinese @class TipsSlider @ingroup Control @ingroup QML_TYPES @brief 提供一种带标签文本的滑动条控件. @details TipsSlider 是一种带标签文本的滑动条。根据使用场景不同,可以控制 标签的种类。 TipsSlider 添加默认空标签 ```qml TipsSlider { width: 200 tickDirection: TipsSlider.TickDirection.Back slider.highlightedPassedGroove: true slider.handleType: Slider.HandleType.ArrowBottom ticks: [SliderTipItem { }, SliderTipItem { }, SliderTipItem { }, SliderTipItem { }] } ``` 效果如下图所示: @image html TipsSliderDefault.png TipsSlider 添加字符标签 ```qml TipsSlider { id: slider readonly property var tips: [qsTr("1m"), qsTr("30m"), qsTr("Never")] width: 180 tickDirection: TipsSlider.TickDirection.Back slider.handleType: Slider.HandleType.ArrowBottom slider.stepSize: 10 slider.from: 0 slider.to: 20 slider.value: 10 ticks: [ SliderTipItem { text: slider.tips[0] textHorizontalAlignment: Text.AlignLeft }, SliderTipItem { highlight: true text: slider.tips[1] }, SliderTipItem { text: slider.tips[2] textHorizontalAlignment: Text.AlignRight } ] } ``` 效果如下图所示: @image html TicksSllider_Highlight.png TipsSlider 同样适配不同方向,不同位置的标签,通过 tickDirection 和 slider.orientation 属性控制。 @property Item TipsSlider::slider @brief slider 属性获取 TipsSlider 的内部 Slider 控件。 @property list TipsSlider::ticks @brief ticks 属性设置 TipsSlider 中的所有标签。 @property enumeration TipsSlider::tickDirection @brief tickDirection 是 TipsSlider 提供标签方向属性的枚举。 @details 目前提供了 TipsSlider.Front 和 TipsSlider.Back 两个枚举。 Front 枚举代表标签在 TipsSlider 的前部,TipsSlider 水平方向时为上部,竖直方向时 为前部。 Back 枚举代表标签在 TipsSlider 的后部,TipsSlider 水平方向时为下部,竖直方向时 为后部。 */ dtkdeclarative-5.7.12/docs/qml/TitleBar.zh_CN.dox000066400000000000000000000156721476226662700215740ustar00rootroot00000000000000 /** @~chinese @class TitleBar @ingroup Control @ingroup QML_TYPES @brief 提供一种统一样式风格的标题栏控件. @details TitleBar 控件用于标准样式风格的 TitleBar 控件,与 DialogTitleBar不同, TitleBar 只被用于 ApplicationWindow 中的标题栏。
通常情况下,标题栏适配 ApplicationWindow 的布局,需要放置在 header 属性中,例如以下代码:
```qml import org.deepin.dtk 1.0 ApplicationWindow { id: root flags: Qt.Window | Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint header: TitleBar {} } ``` TitleBar 主要用于 DTK 中适配的无标题窗口,在去除系统标题栏后, DTK 应用需要 添加一个应用内的 TitleBar 控件,当作应用统一的标题栏。这在 UOS/Deepin 操作 系统中非常友好,例如以下代码: ```qml import org.deepin.dtk 1.0 ApplicationWindow { id: root header: TitleBar {} DWindow.enabled: true DWindow.windowRadius: 16 } ``` TitleBar 默认是最顶层控件,其他所有控件无法越过 TitleBar ,并且 TitleBar 中提供了 通用标题栏的默认布局,如应用图标,应用标题,菜单按钮,最大化最小化关闭按钮等等。TitleBar 还支持添加额外的自定义内容,这取决于应用想要实现的样式,例如以下代码: 添加中心区域的代码如下: ```qml import org.deepin.dtk 1.0 ApplicationWindow { id: root header: TitleBar { content: Item { SearchEdit { anchors.centerIn: parent width: 300 placeholder: "搜索" } } } DWindow.enabled: true DWindow.windowRadius: 16 } ``` 添加左侧区域的代码如下: ``` import org.deepin.dtk 1.0 ApplicationWindow { id: root header: TitleBar { leftContent: ActionButton { icon.name: "window_sidebar" } } DWindow.enabled: true DWindow.windowRadius: 16 } ``` Titlebar 适配的 ApplicationWindow 中的 flags 属性。 WindowMinMaxButtonsHint 属性 控制标题栏的最大化最小化按钮 WindowCloseButtonHint 属性控制关闭按钮;WindowTitleHint 属性 控制在标题文本属性;在xcb环境下,还能够通过修改 MotifDecoration 来控制窗口的标题,其中 DECOR_MINIMIZE 表示最小化按钮, DECOR_MAXIMIZE 表示最大化按钮 DECOR_TITLE 表示窗口标题。 @property string TitleBar::title @brief title 属性用于控制标题栏的标题文本 @property DciIcon TitleBar::icon @brief icon 属性用于控制标题栏的图标, \c icon 的类型是 DciIcon,能同时 兼容 QtIcon 和 DciIcon。 @property Component TitleBar::leftContent @brief leftContent 属性用于添加标题左侧区域的组件,例如添加侧边栏按钮等等。 @property Component TitleBar::content @brief content 属性用于添加标题中心区域的组件,当存在多个组件时,可以使用 布局进行排列。 @property Component TitleBar::menu @brief menu 属性用于控制 Option 按钮的弹出菜单。默认情况下 TitleBar 会提供 一个默认的菜单,当需要自定义菜单时,菜单项需要进行手动调整。 例如以下代码: ```qml import org.deepin.dtk 1.0 ApplicationWindow { id: root ButtonGroup { id: activeColorSelector onCheckedButtonChanged: { root.palette.highlight = checkedButton.color } } header: TitleBar { menu: Menu { Action { text: "Light Theme" } Action { text: "Dark Theme" } MenuItem { contentItem: Item { Row { anchors.centerIn: parent Repeater { model: ["#d8316c", "#ff5d00", "#f8cb00", "#23c400", "#00a48a", "#0081ff", "#3c02d7", "#8c00d4"] delegate: ColorButton { color: modelData Component.onCompleted: { activeColorSelector.addButton(this) } } } } } } } DWindow.enabled: true DWindow.windowRadius: 16 } ``` @property bool TitleBar::menuDisabled @brief menuDisabled 属性可以将 menu 属性设置禁用或者启用,默认情况下为 false。 @property Component TitleBar::aboutDialog @brief aboutDialog 属性控制应用的关于对话框。其使用方式如下所示: ```qml import org.deepin.dtk 1.0 ApplicationWindow { id: root DWindow.enabled: true DWindow.windowRadius: 16 header: TitleBar { aboutDialog: AboutDialog { modality: Qt.NonModal version: qsTr(String("Version: %1").arg(Qt.application.version)) productName: qsTr(appProductName) companyLogo: "file://" + DTK.deepinDistributionOrgLogo websiteName: DTK.deepinWebsiteName websiteLink: DTK.deepinWebsiteLink license: appLicense === "" ? "" : qsTr(String("%1 is released under %2").arg(appProductName).arg(appLicense)) } } } ``` @sa AboutDialog @property bool TitleBar::fullScreenButtonVisible @brief fullScreenButtonVisible 属性控制 TitleBar 在全屏时按钮是否可见。 @details 默认情况下,该值是 true。 @signal TitleBar::toggleWindowState() @brief toggleWindowState 信号当窗口状态发生变化时触发。例如双击最大化等操作时。 @property bool TitleBar::windowButtonGroup @brief windowButtonGroup 是默认的窗口按钮组 @details 包含最小化、最大化、关闭按钮。默认情况下,该属性已经由 TitleBar 提供。 @property bool TitleBar::autoHideOnFullscreen @brief autoHideOnFullscreen 属性表示是否在全屏时自动关闭标题栏 @details 默认情况下,该值为 false。 @property bool TitleBar::embedMode @brief embedMode 属性表示是否属于嵌入模式 @details 当`DWindow.enabled`属性为false 时, embedMode 为 true, 否则为 false。 @details 嵌入模式下的标题栏上的`WindowButtonGroup`上的按钮均有系统标题栏提供。 @property bool TitleBar::separatorVisible @brief separatorVisible 属性控制分隔符是否可见。默认情况下,该值为 true。 @property bool TitleBar::enableInWindowBlendBlur @brief enableInWindowBlendBlur 属性表示是否开启窗口内模糊,默认情况下为 false。 @sa InWindowBlur @property Palette TitleBar::textColor @brief textColor 属性控制文本和图标等颜色,即前景色相关颜色。 dtkdeclarative-5.7.12/docs/qml/ToolButton.zh_CN.dox000066400000000000000000000022531476226662700221660ustar00rootroot00000000000000 /** @~chinese @class ToolButton(FlowStyle) @ingroup ToolButton @ingroup QML_TYPES @brief 提供一种行云设计风格的 ToolButton 控件. @details {ToolButton(FlowStyle)}{ToolButton} 是一种工具型按钮,其经常被放置于ToolBar 这类工具栏中,{ToolButton(FlowStyle)}{ToolButton}支持图标和文字的高级排列,也具备普通 Button 的所有特性。 可以是普通的按钮,如下效果: @image html ToolButtonNormal.png 可以是复杂的文字和图标排列按钮,如下效果: @image html ToolButtonIconLabel.png 它也能被放置于 FloatingPanel 或者 ButtonBox 中,如下效果: @image html ToolButtonFloatingPanel.png 其使用代码如下所示: ```qml ButtonBox { ToolButton { icon.name: "action_newfolder"; text: "文件夹";} ToolButton { icon.name: "action_copy"; text: "复制" } ToolButton { icon.name: "action_share"; text: "分享" } ToolButton { icon.name: "action_compress"; text: "压缩" } } ``` @property Palette ToolButton(FlowStyle)::textColor @brief textColor 控制 {ToolButton(FlowStyle)}{ToolButton} 的前景颜色,如图标和文本的颜色。 */ dtkdeclarative-5.7.12/docs/qml/ToolTip.zh_CN.dox000066400000000000000000000015541476226662700214520ustar00rootroot00000000000000/** @~chinese @class ToolTip(FlowStyle) @ingroup ToolTip @ingroup QML_TYPES @brief 提供一种行云设计风格的 ToolTip 控件. @details {ToolTip(FlowStyle)}{ToolTip} 是一个控件的提示, 其作用是通知用户控件的功能. 具体效果如下: @image html ToolTipExample.png 其使用代码如下所示: ```qml ScrollBar { id: vbar hoverEnabled: true active: hovered || pressed orientation: Qt.Horizontal size: frame.width / content.width anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom ToolTip.visible: hovered ToolTip.delay: 1000 ToolTip.timeout: 5000 ToolTip.text: "This is a ScrollBar!!!" } ``` */ dtkdeclarative-5.7.12/docs/qml/WarningButton.zh_CN.dox000066400000000000000000000005361476226662700226600ustar00rootroot00000000000000 /** @~chinese @class WarningButton @ingroup Button(FlowStyle) @ingroup QML_TYPES @brief 提供一种用于警告的按钮控件. @details WarningButton 是一个专门用于提示警告的按钮控件,其文本呈现出警告 的红色,用于出现警告提示的地方,效果如下所示: @image html WarningButtonExample.png */ dtkdeclarative-5.7.12/docs/qml/WaterProgressBar.zh_CN.dox000066400000000000000000000031471476226662700233140ustar00rootroot00000000000000 /** @~chinese @class WaterProgressBar @ingroup Control @ingroup QML_TYPES @brief 提供一种水波纹类型的进度条控件. @details WaterProgressBar 提供一种趣味的水波纹进度条控件。WaterProgressBar有特殊的水波纹动画,能够将进度条的形式修改为水涨的效果。
例如下述代码:
@image html WaterProgressBar.gif WaterProgressBar 的使用方式如下所示: ```qml WaterProgressBar { NumberAnimation on value { loops: Animation.Infinite from: 0 to: 100 duration: 10000 } } ``` @property int WaterProgressBar::value @brief value 属性表示 WaterProgressBar 进度值,其取值范围为[0, 100] @note 请注意不要超过该范围。当 `value` > 0 时 WaterProgressBar 开始水波动画。当 `value` > 30 时 WaterProgressBar 开始气泡动画 @property Palette WaterProgressBar::backgroundColor1 @brief backgroundColor1 属性表示 WaterProgressBar 的第一背景颜色值。 @details WaterProgressBar 的默认背景为渐变背景。 @property Palette WaterProgressBar::backgroundColor2 @brief backgroundColor2 属性表示 WaterProgressBar 的第二背景颜色值。 @property Palette WaterProgressBar::dropShadowColor @brief dropShadowColor 属性表示 WaterProgressBar 的阴影颜色值。 @property Palette WaterProgressBar::popBackgroundColor @brief popBackgroundColor 属性表示 WaterProgressBar 的弹出气泡的背景颜色。 @property Palette WaterProgressBar::textColor @brief textColor 属性表示 WaterProgressBar 的前景颜色,即文字的颜色。 */ dtkdeclarative-5.7.12/docs/qml/WindowButton.zh_CN.dox000066400000000000000000000025411476226662700225200ustar00rootroot00000000000000 /** @~chinese @class WindowButton @ingroup Control @ingroup QML_TYPES @brief 一种专门用于 TitleBar 上的窗口按钮. @details WindowButton 是专门用于 TitleBar 上窗口按钮,是 TitleBar 和 DialogTitleBar的通用窗口按钮,通常情况下 WindowButton 被添加到 WindowButtonGroup 中, 包含最大化、最小化、关闭按钮。菜单按钮默认不添加到 WindowButtonGroup 中。
TitleBar 中默认就添加了上述窗口,因此 WindowButton 在需要自定义标题栏按钮时才会被使用。
WindowButton 的默认样式如下所示:
@image html WindowButton_normal.png WindowButton 的 Hovered 样式如下所示: @image html images/WindowButton_hovered.png WindowButton 的 Pressed 样式如下所示: @image html WindowButton_pressed.png @property DciIcon WindowButton::icon @brief icon 属性控制 WindowButton 的图标。 @property bool WindowButton::pressed @brief pressed 属性表示 WindowButton 是否处于按下的状态。 @signal WindowButton::clicked() @brief clicked 信号当 WindowButton 点击后发送。 @property Palette WindowButton::textColor @brief textColor 属性控制 WindowButton 的前景色颜色,包含图标和文本的颜色。 @property Palette WindowButton::backgroundColor @brief textColor 属性控制 WindowButton 的背景色颜色。 */ dtkdeclarative-5.7.12/docs/qml/WindowButtonGroup.zh_CN.dox000066400000000000000000000023171476226662700235360ustar00rootroot00000000000000 /** @~chinese @class WindowButtonGroup @ingroup RowLayout @ingroup QML_TYPES @brief 提供用于放置在 Titlebar 中的窗口按钮组. @details WindowButtonGroup 被用于添加到 Titlebar 中作为通用的窗口按钮组
默认情况下, WindowButtonGroup 包含了 最大化按钮;最小化按钮;还原按钮;全屏按钮;退出全屏按钮;关闭按钮等等。
如果需要添加新的按钮可以直接在 WindowButtonGroup 进行添加,被添加的组件需要使用 Layout 进行布局排列。
例如下述代码: ```qml WindowButtonGroup { WindowButton { icon.name: "action_add" } } ``` @property Palette WindowButtonGroup::textColor @brief textColor 属性控制组内所有 WindowButton 的前景色,如文本和图标的颜色。 @property bool WindowButtonGroup::fullScreenButtonVisible @brief fullScreenButtonVisible 属性控制是否在全屏下对按钮仍可见。默认为 true。 @property bool WindowButtonGroup::embedMode @brief embedMode 属性控制是否处于嵌入模式下 @details 嵌入模式下的按钮将按照系统标题栏进行控制。默认该属性跟随是否启用 DWindow.enabled 开启。 @sa DWindow */ dtkdeclarative-5.7.12/docs/qml/index.zh_CN.md000066400000000000000000000003721476226662700207720ustar00rootroot00000000000000@page qml qml # QML @defgroup QML_TYPES QML类型模块 @brief 用于处理QML类型的模块 @defgroup Action QML动作模块 @brief 用于处理动作的模块 @defgroup DialogWindow QML对话框模块 @brief 用于处理对话框的模块 dtkdeclarative-5.7.12/docs/qml/noqml/000077500000000000000000000000001476226662700174655ustar00rootroot00000000000000dtkdeclarative-5.7.12/docs/qml/noqml/InWindowBlur.zh_CN.dox000066400000000000000000000062131476226662700235660ustar00rootroot00000000000000/** @~chinese @class InWindowBlur @ingroup Item \keyword DQuickInWindowBlur @brief 提供一个使目标控件在窗口内模糊的特效控件. 该控件用于在窗口内对某些控件背景进行模糊操作,例如一个 ListView 的背景如果是一个图片,如果其 Item 需要 进行模糊处理,对 ListView 的背景进行模糊处理,就能够用 InWindowBlur 控件对 delegate 进行模糊处理。 例如以下代码 ```qml import org.deepin.dtk Item { Image { anchors.fill: parent source: "file:///usr/share/wallpapers/deepin/desktop.jpg" } ListView { id: testView model: 10 spacing: 30 clip: true anchors { fill: parent margins: 10 } delegate: Item { height: 50 width: 300 anchors.horizontalCenter: parent.horizontalCenter InWindowBlur { id: blur anchors.fill: parent radius: 20 offscreen: true } ItemViewport { id: roundBlur anchors.fill: blur fixed: true sourceItem: blur radius: blur.radius hideSource: false } Rectangle { radius: roundBlur.radius anchors.fill: roundBlur color: Qt.rgba(1, 0, 0, 0.2) } Text { anchors.centerIn: parent text: "InWindowBlur" + index color: "white" font.pixelSize: 22 } } } } ``` 其效果展示如下: @image html inwindowblur.png 如上述示例代码, InWindowBlur 控件需要配合 ItemViewport 控件才能完成与 BehindWindowBlur 控件 类似的混色效果。 其中 ItemViewport 主要完成圆角效果和混色填充的功能。 由于 InWindowBlur 控件本身 不支持圆角功能,因此在使用 ItemViewport 是需要隐藏其非圆角的效果, offscreen 属性就需要设置为 true 状 态,让 ItemViewport 能够展示 InWindowBlur 控件的内容但不现实 InWindowBlur 本身,该功能与 ItemViewport 中的 hideSource 类似,但该属性与 InWindowBlur 控件的绘制发生冲突,无法正确渲染其模糊图像,因此建议使用 InWindowBlur 控件的 offscreen 属性而非 ItemViewport 控件的 hideSource 属性。 @property real InWindowBlur::radius 该属性用于指定窗口内模糊程度系数大小,其并非控件的圆角大小。当模糊程度超过了背景的渲染程度时,其模糊效果会 呈现出一个黑色。 @property bool InWindowBlur::offscreen 该属性用于指定其模糊特效是否需要渲染在屏幕之外,即离屏渲染,该属性默认为 false,当 InWindowBlur 控件与 ItemViewport 控件配合使用时,多数情况下会将其设置为 true。 */ dtkdeclarative-5.7.12/docs/qml/noqml/dcoloroverlay.zh_CN.dox000066400000000000000000000052231476226662700240670ustar00rootroot00000000000000 /** @~chinese @class ColorOverlay @ingroup Item @brief 一个同时支持软件和硬件渲染的颜色覆盖控件. @details 这是一种同时支持软件渲染和硬件渲染的颜色覆盖控件,其作用是为源控件覆盖用户想要的自定义颜色。 其同时支持软件渲染和硬件渲染两种模式,在硬件渲染下,其和 Qt Graphical Effects 模块的 ColorOverlay 用法 一致,软件渲染模式下,其只能做到对单一颜色的覆盖,无法做到 alpha 的像素点混合这种效果。 ColorOverlay 在 DTK 中被用在 BusyIndicator 的颜色覆盖上,如自定义 不同颜色的 BusyIndicator,应用使用该控件控制例如需要被高亮色进行颜色 覆盖的场景。 @image html coloroverlay_Spinner.png 它可以对一般控件进行颜色覆盖,其使用方式如下所示: ```qml import org.deepin.dtk 1.0 Rectangle { id: rect width: 100 height: 100 color: "gray" visible: false } ColorOverlay { anchors.fill: rect source: rect color: "red" } ``` 其效果如下: @image html renderRedRect.png 也可以对图片进行颜色覆盖,其使用方式如下所示: ```qml import org.deepin.dtk 1.0 Image { id: img sourceSize { width: 100 height: 100 } source: "/path/to/image.png" visible: false } ColorOverlay { anchors.fill: img source: img color: "red" } ``` 其效果如下: \table \header \li 原图 \li 对比图 \row \li @image html coloroverlay_imageSouce.png \li @image html coloroverlay_imageOverlay.png \endtable @property bool ColorOverlay::cached @brief 该属性用于指定是否启用缓存 @details 当源数据的状态不会发生动态改变时,开启缓存 能够大幅提高渲染性能。该属性在硬件渲染(GPU渲染)模式下默认为 false, 在软件渲染(CPU渲染)模式下为 true. @property color ColorOverlay::color @brief 该属性用于指定覆盖的颜色,未指定即表示不覆盖任何颜色。 @details 在硬件渲染(GPU渲染)模式下,\c color 能够跟每个像素点的颜色进行 alpha通道混合,保证每个像素点在混合后的多样化。软件渲染模式下,该 颜色混合通常使用 Qt 的混合模式进行混合。 @property color ColorOverlay::source @details 该属性用于指定颜色覆盖的源,它可以是一个一般控件,也可以是图片等资源数据. 但不支持将自身作为源进行眼哦色覆盖. */ dtkdeclarative-5.7.12/docs/qml/noqml/dconfigwrapper.zh_CN.dox000066400000000000000000000047501476226662700242210ustar00rootroot00000000000000 /** @~chinese @class Config @ingroup QtObject @brief 一个 DTK 配置项中的配置信息类. @details Config 用于提供专门为 DSG配置管理的统一的读写函数,其主要用于更方便的在 SettingsDialog 中进行配置项的实时更新,当然 SettingDialog 是作为用于前端配置信息展示的窗口,为了提供自定义配置,该类允许放置在自定义的控件上。 该类会读取 name 中指定的文件名的文件中存在的属性,当其控件内部存在该配置文件中同名的属性时,对该属性上的所有修改,都将 在文件内对应的同名配置项中生效。 例如以下代码: ```qml import org.deepin.dtk 1.0 Config { name: "example" property string key : "key default" } ``` 同样地,当配置文件中名为 "key" 的配置项发生了数据改变,该 Config 的 key 属性也会触发 changed 信号。 需要注意的是,当 Config 中添加了配置文件中不存在的配置项属性,该配置文件不会检测并添加一个新的配置项,其属性的改变也不会对 配置文件造成任何修改。同样地,当配置文件中存在配置项,而 Config 中并未添加同名属性时,该配置项的改变不会触发 Config 中任 何属性的变化。 @property string Config::name @brief 指定配置文件名称。 @fn Config::value(string key, variant fallback) @brief 获取配置文件中对应 \a key 下的值,当 \a key 获取不到时返回 \a fallback 的值。 @details 该函数除了可以访问在 Config 中添加了同名属性的配置项外,也能获取为设置属性的额外配置项。 @fn Config::setValue(string key, variant value) @brief 设置`key`下的`value`值 @details 该函数只能设置配置文件中 `key`对应的值,对于`key`是一个不存在或非法值,该函数无法正确设置。 @fn Config::keyList() @brief 获取该 Config 项下的所有键值列表。 @fn Config::isValid() @brief 判断当前 Config 是否有效。如果有效返回 \c true 否则返回 \c false。 @signal Config::valueChanged(string key) @brief 该信号在`key`对应的配置项内容发生改变时发出 @details 通常情况下,如果 Config 中存在一个同名的配置项属性时,无需在使用该信号检测配置项的改变。 而直接使用属性槽函数绑定的形式进行。但对于没创建对应属性的配置项,可以通过该信号检测到`key`对应的配置项值的变化。 */ dtkdeclarative-5.7.12/docs/qml/noqml/dopacitymask.zh_CN.dox000066400000000000000000000045601476226662700236760ustar00rootroot00000000000000 /** @~chinese @class OpacityMask @ingroup Item \keyword DOpacityMask @brief 一个同时支持软件和硬件渲染的不透明度遮罩控件. @details 能够同时支持软件渲染和硬件渲染,其能够为源材质提供一种不透明度遮罩。 使源材质能够作用做遮罩中。其硬件渲染(GPU渲染)模式和 Qt Graphical Effects 保持一致。软件模式下无法针对每个源材质的像素点进行遮罩处理,软件模式 使用 Qt 的混合模式实现。 其用法可用如下示例表示: ```qml import org.deepin.dtk 1.0 Item { width: 300 height: 300 Image { id: bug source: "html bug.jpg" sourceSize: Qt.size(parent.width, parent.height) smooth: true visible: false } Image { id: mask source: "html butterfly.png" sourceSize: Qt.size(parent.width, parent.height) smooth: true visible: false } OpacityMask { anchors.fill: bug source: bug maskSource: mask } } ``` 其效果如下所示: \table \header \li 源材质 \li 遮罩材质 \li 应用效果 \row \li @image html opacityMask_sourceExample.jpg \li @image html opacityMask_MaskExample.jpg \li @image html opacityMask_effectExample.jpg \endtable @property bool OpacityMask::cached @details 该属性用于提升性能,开启缓存后效果仅会在源材质和遮罩发生改变时修改,其他方式进行 的更新都无法更新应用效果。默认情况下该属性为 false. @property bool OpacityMask::invert @details 该属性用于控制应用效果的 alpha 值,当 \c invert 设置为true 时,效果的 alpha 值为源材质乘以遮罩的倒数,如 As * (1 - Am),设置为 false 是,效果 为源材质乘以遮罩,如 As * Am。默认情况下,改值为 false。 @property var OpacityMask::maskSource @details 该属性用于指定遮罩材质的数据,遮罩被渲染到目标中被用于确定形状和alpha值。 @property var OpacityMask::source @details 该属性用于指定源材质的数据,源材质用于指定最终效果的内容,其alpha通道会和遮罩材质进行混合。 */ dtkdeclarative-5.7.12/docs/qml/noqml/dqmlglobalobject.zh_CN.dox000066400000000000000000000620311476226662700245100ustar00rootroot00000000000000 /** @~chinese @class Color @brief`DTK 项目中统一的颜色类型. @details Color 是`DTK 中为了适配 QPalette 部分颜色角色枚举,适配 Qt 的基础的颜色以及所有 的 RGB 的颜色值。除此之外,该类能很好的兼容`ColorSelector 的取色系统和`Palette 取色器调色板。 构造`Color 对象有两种方式,一种是通过 QColor 对象,QColor 能够兼容使用字符串、Qt枚举 等等方式,因此使用 QColor 构造`DTK 的`Color 同样能兼容上述方式。另外一种是通过 QPalette 的部分枚举值,目前仅支持使用`Highlight 和`HighlightText 这两种枚举值。该枚举在`Color 对象的`Type 枚举中有定义。 \section2 Color.Type Type 枚举定义了颜色是什么类别,其与 QPalette::ColorRole 枚举描述一致,当需要使用一个抽象的颜色角色时, 可以通过指定该类别,其颜色最终根据其控件的对应调色板颜色。 \table \row \li Color.Invalid \li 无效 Type。此类枚举表示该类型是一个无效类型或者为具体颜色类型,非调色板数据类型。 \row \li Color.Highlight \li 高亮色,对应于 QPalette::Highlight ,并且其颜色也从其所处控件的 Highlight 调色板中获取 \row \li Color.HighlightedText \li 高亮文本色,对应于 QPalette::HighlightedText,其使用场景在高亮的背景下文本或者前景需要展示 的颜色。 \endtable @fn bool Color::isValid() @return 判断当前颜色值是否有效,有效则返回 true, 否则返回 false。 @fn bool Color::isTypedColor() @brief 判断当前颜色是否是一种已标记颜色(或称调色板颜色)。 @return 是调色板颜色则返回 true,否则返回 false。 @details 通过`Color.Type`构造的颜色都是类型颜色,而通过 QColor 构造的颜色不是类型颜色。 类型颜色不是一个具体的颜色值,它需要一个具体的 QPalette 对象才能获取具体颜色。 @fn color Color::toColor(var palette) @brief 转换`Color` 类型的颜色为`QColor 类型的颜色 @details 该函数能够将`Color 类型转化成一个具体的 QColor 颜色类型。 通过判断`Color.Type 类型的颜色值,从`palette` 参数中获取`Color 使用的调色板对应的具体颜色值。 @return 返回对应调色板数据的 QColor 颜色值。 @fn color Color::color() 将`Color 类型转换成 QColor 类型,当`Color 指定了`lightness 或`opacity 属性时,该颜色 会将这两种属性设置到输出的颜色中。 @return 将转换后的 QColor 类型。 @note 该函数不适用 Typed 颜色类型 @fn Color Color::lightness(int floatValue) 将自身的`Color 提高/降低 \a floatValue 大小的亮度,并返回。 @return 返回调整亮度后的 Color 类型颜色。 @fn Color Color::opacity(int floatValue) 将自身的`Color 提高/降低 \a floatValue 大小的不透明度,并返回。 @return 返回调整不透明度后的 Color 类型颜色。 /** @~chinese @class DTK @brief 提供一个全局的`DTK 对象,保证QML中能够获取`DTK 的相关枚举和函数. @details DTK 对象可以更方便地在QML中使用,它提供了一些统一的函数、属性以及枚举值,它能够更快捷的 访问一些系统信息和图形化配置,下述代码简单展示了其使用方式: ```qml import org.deepin.dtk 1.0 Text { color: DTK.selectorColor(palette.window, "black", "white") text: "WindowManager: " + DTK.windowManagerNameString() } ``` \section1 枚举 DTK 将一些通用的枚举类型封装起来,当做控件的枚举统一进行使用。在使用DTK封装的控件中, 能够很容易看到他们的使用场景。例如,你可以设置控件Z轴坐标,来控制控件的层级关系,使用 DTK.BottomOrder 来设置最底层控件,使用`DTK.TopOrder 设置最顶层控件坐标。 \section2 DTK.ControlState@brief Control 控件的状态,\c Control 控件或继承于`Control 控件都有多种状态,如:hover、 press、disabled等等,该枚举能够在 DTK 的其他控件中使用进行统一,例如在`ColorSelector 中可以通过该枚举控制控件的状态,`DciIcon 中可以通过设置值指定图标的状态等等。 \table \row \li`DTK.NormalState \li Control 控件的 normal 状态,是控件最原始的状态,控件在未处理任何事件且可用时的 一种状态。 \row \li`DTK.HoveredState \li Control 控件当鼠标放置到控件时的状态。 \row \li`DTK.PressedState \li Control 控件当鼠标按压时的控件状态。 \row \li`DTK.DisabledState \li Control 控件在禁用时的状态,当控件的 enable 属性设置为 false 状态时,就是该种状态。 这种状态下,无法接受任何鼠标事件。 \row \li`DTK.InactiveState \li Control 控件在未激活下的状态,当窗口处于非焦点状态下,该窗口下的所有控件都是未激活状态。 \endtable \section2 DTK.ZOrder Control 的 z 属性表示的控件的层级堆叠关系,当某个控件的 z 值比其他所有控件的 z 值都低时, 表示该控件在最低层显示,可以被其他控件覆盖。`DTK 提供了一种便捷方式设置该属性,就是这个 枚举值。 \table \row \li`DTK.BottomOrder \li 最底层控件,其层级关系是所有控件中最低的。 \row \li`DTK.BelowOrder \li 下层控件,这个层级关系比`DTK.BottomOrder 高,它能够覆盖`DTK.BottomOrder 层 的控件。 \row \li`DTK.NormalOrder \li 常规控件,当控件不设置 z 属性时默认就是该值,这是大多数控件的层级大小,它比`DTK.BelowOrder 和`DTK.BottomOrder 都高。 \row \li`DTK.AboveOrder \li 普通上层控件,该层级大小大于`DTK.NormalOrder 的层级大小。 \row \li`DTK.TopOrder \li 顶层控件,顶层控件显示在所有控件之上,能够遮盖住其他枚举状态的所有控件。目前如`TitleBar 等 控件正在使用这种层级堆叠枚举。 \endtable \section2 DTK.PopupMode Popup 控件窗口弹出模式(Menu 等继承于 Popup 的控件也适用), 默认情况下所有的 Popup 控件类型 为 DTK.AutoMode 模式。 \table \row \li`DTK.AutoMode \li 自动模式,能够根据 “D_POPUP_MODE” 环境变量的值指定,如果该变量被设置为 “embed”,则为嵌入式弹出 窗口类型,否则为独立式窗口类型。 \row \li`DTK.WindowMode \li 独立式窗口模式,该模式下窗口能够独立于其他窗口显示,作为一个单独的窗口,类似于 dtkwidget 的 Menu 窗口 类似。 \row \li`DTK.EmbedMode \li 嵌入式窗口模式,默认的 qtdeclarative 项目风格的 Menu 和 Popup 控件为该类型,此模式将 Popup 窗口嵌入 其父窗口内部,其显示无法超出父窗口的大小,并且会根据父窗口的位置和大小而发生适应性变化。 \endtable \section2 DTK.ArrowDirection 箭头方向枚举,如`Slider 控件中箭头滑块, 当`Slider 控件需要有上下左右的标签时,需要指定`Slider 滑块的方向。 \table \row \li`DTK.UpArrow \li 上箭头 \row \li`DTK.DownArrow \li 下箭头 \row \li`DTK.LeftArrow \li 左箭头 \row \li`DTK.RightArrow \li 右箭头 \endtable \section1 函数 使用DTK中提供的函数能够更好的兼容DTK控件的使用方式,能快捷的适配DTK控件的特殊使用场景。 例如,一些标准的窗口信息函数,可以获取到窗管的无标题和混成模式等等信息;DTK 通用颜色可以 通过函数进行颜色混合、颜色调整以及特殊颜色的创建。以下将从几个方面展开描述 DTK 提供的一些 基本通用函数: \section2 窗管信息 QML中能够快速通过这些函数快速获取到当前窗管的一些属性,其中包含获取窗管是否支持模糊,是否支持混成, 是否处于无标题以及是否是软件渲染的状态。 \list \li \l{DTK::hasBlurWindow}{bool DTK.hasBlurWindow()} \li \l{DTK::hasComposite}{bool DTK.hasComposite()} \li \l{DTK::hasNoTitlebar}{bool DTK.hasNoTitlebar()} \li \l{DTK::isSoftwareRender}{bool DTK.isSoftwareRender()} \li \l{DTK::windowManagerName}{int DTK.windowManagerName()} \li \l{DTK::windowManagerNameString}{string DTK.windowManagerNameString()} \endlist \section2 主题相关 DTK程序默认都适配明/暗主题,DTK程序在某些情况下需要获取明暗主题相关的接口,或者获取平台主题和应用主题 的相关配置时,可以调用这些接口信息。 \list \li \l{DTK::themeType}{int DTK.themeType()} \li \l{DTK::platformTheme}{Object DTK.platformTheme()} \li \l{DTK::toColorType()}{int DTK.toColorType()} \li \l{DTK::selectColor()}{color DTK.selectColor()} \endlist \section2 消息通知 DTK能够使用全局对象的方式发送消息,以下函数提供了一种便捷的发送窗口内通知的快捷方式。 \list \li \l{DSendMessageFromContent}{DTK.sendMessage()} \li \l{DSendMessageFromComponent}{DTK.sendMessage(Object)} \li \l{DCloseMessageFromMessageObject}{DTK.closeMessage(Container)} \li \l{DCloseMessageFromMessageId}{DTK.closeMessage(Object)} \endlist \section2 颜色相关 DTK提供了相关函数能够更方便的调整颜色,获取调色板信息。 \list \li \l{DTK::palette}{DTK.palette()} \li \l{DTK::inactivePalette}{DTK.inactivePalette()} \li \l{DTK::blendColor()}{color DTK.blendColor()} \li \l{DTK::makeColor(Color::Type type)}{DTK.makeColor(type)} \li \l{DTK::makeColor(color)}{DTK.makeColor(color)} \endlist \section2 图标相关 DCI图标相关的统一接口,例如兼容QIcon和DciIcon的附加属性、将QPalette属性设置到IconPalette中等等。 \list \li \l{DTK::makeIcon()}{DTK.makeIcon()} \li \l{DTK::makeIconPalette()}{DTK.makeIconPalette()} \endlist \section2 其他函数 其它未汇总的函数,例如一些系统信息,字体管理,以及弹出菜单的嵌入模式等等 \list \li \l{DTK::fontManager}{DTK.fontManager()} \li \l{DTK::makeShadowImageUrl()}{DTK.makeShadowImageUrl()} \li \l{DTK::deepinWebsiteName}{DTK.deepinWebsiteName()} \li \l{DTK::deepinWebsiteLink}{DTK.deepinWebsiteLink()} \li \l{DTK::deepinDistributionOrgLogo}{DTK.deepinDistributionOrgLogo()} \li \l{DTK::cursorPosition}{DTK.cursorPosition()} \li \l{DTK::setPopupMode()}{DTK.setPopupMode()} \endlist\m @enum Dtk::Declarative::DTK::CompositionMode @brief 合成模式,与 @sa QPainter::CompositionMode 等价。 @var DTK::CompositionMode::Source @brief 与 @sa QPainter::CompositionMode_Source 等价 @var DTK::CompositionMode::SourceOver @brief 与 @sa QPainter::CompositionMode_SourceOver 等价 @var DTK::CompositionMode::Destination @brief 与 @sa QPainter::CompositionMode_Destination 等价 @var DTK::CompositionMode::DestinationOver @brief 与 @sa QPainter::CompositionMode_DestinationOver 等价 @var DTK::CompositionMode::Clear @brief 与 @sa QPainter::CompositionMode_Clear 等价 @property bool DTK::hasBlurWindow @note 此属性为只读属性 如果当前窗口管理器支持窗口背景模糊特效则返回 true,否则返回 false @property bool DTK::hasComposite @note 此属性为只读属性 如果当前窗口管理器支持混成则返回 true,否则返回 false @property bool DTK::hasNoTitlebar @note 此属性为只读属性 如果窗口管理器当前支持设置隐藏窗口标题栏则返回 true,否则返回 false @property bool DTK::isSoftwareRender @note 此属性为只读属性 如果当前窗口渲染模式为软件,则返回 true,否则返回 false @property string DTK::windowManagerNameString @note 此属性为只读属性 当前使用的窗口管理器名称 @property int DTK::themeType @note 此属性为只读属性 @brief 程序的主题类型. @details 当themeType为UnknownType时, 将自动根据 GuiApplication::palette的QPalette::background颜色计算主题 类型, 否则与 paletteType 的值一致. 程序中应当使用此值作为 暗色/亮色主题类型的判断. 设置该属性会重新设置palette, 并且会 覆盖qml中的属性赋值, 与qml中的属性绑定冲突. @property int DTK::windowManagerName @note 此属性为只读属性 @brief 窗口管理器名称枚举. 目前包含 deepinWM, KWinWM 和其他窗口管理器。 @property Object DTK::platformTheme @note 此属性为只读属性 @brief 返回应用程序的平台主题实例. 平台主题能够获取到一些系统级的主题配置,如图标主题,铃声主题,窗口圆角, 调色板颜色信息等等相关配置。 @property FontManager DTK::fontManager @note 此属性为只读属性 @brief 应用程序的字体管理器实例实例. 字体管理器通过使用 t1 - t10 的字体字号进行 统一管理,同时也能设置一些自定义的特殊字号。 @property qpalette DTK::palette @note 此属性为只读属性 @brief 返回应用程序默认的调色板主题 @property qpalette DTK::inactivePalette @note 此属性为只读属性 @brief 应用程序默认的未激活状态的调色板主题 @fn color DTK::blendColor(color substrate, color superstratum) @brief 将 \a substrate 和 \a superstratum 颜色进行混合,形成一种新的颜色。 该颜色通过 alpha 通道的权重值进行混合运算,新的颜色值中 RGB 等于 \a substrate 的 RGB 值 * (1 - \a superstratum 的 alpha 值) 加上 \a superstratum 的 RGB 值 * superstratum 的 alpha 值, 新颜色的 alpha 值和底色的 alpha值一致。 @return 返回调整后的颜色值 @fn Color DTK::makeColor(Color::Type type) @brief 根据 \a type 类型创建出 Color 实例,目前 type 包含 Highlight 和 HighlightedText 两种。 @return 返回转换后的 Color 类型的颜色值。 @fn Color DTK::makeColor(color c) @brief 将 \a c 转换成 Color 并返回。 Color 能够兼容 QColor 和 type 两种模式。 @return 返回转换后的 Color 类型的颜色值。 @fn url DTK::makeShadowImageUrl() @brief 内部DTK接口,用于创建 shadow image 的url链接,其实现方式是将其内部属性 全部都添加到一个URL中,用于最后渲染Image时获取对应属性。 @return 返回阴影的 Url 用于解析获取。 @fn int DTK::toColorType(color c) 用于根据一个指定的颜色 \a c ,返回在该颜色下对应的系统主题。 最常用的方式是通过传入`Control 中调色板属性中的 window 颜色来判断主题类型。 @return 亮色主题颜色返回 ApplicationHelper.LightType, 暗色主题 返回 ApplicationHelper.DarkType @fn color DTK::selectColor(color windowColor, color light, color dark) 用于根据一个指定的颜色 \a windowColor ,判断当前程序正在使用的 系统主题,并根据不同主题返回对应的 \a light 和 \a dark 颜色。 @return 当 LightType 时返回 \a light , 当 DarkType 时返回 \a dark 。 @property string DTK::deepinWebsiteName @note 此属性为只读属性 @brief deepin 网站名称。 @property string DTK::deepinWebsiteLink @note 此属性为只读属性 @brief deepin 网站链接。 @property string DTK::deepinDistributionOrgLogo @note 此属性为只读属性 @brief deepin 组织 Logo 路径。 @property point DTK::cursorPosition @note 此属性为只读属性 @brief 鼠标当前位置的属性。 Qt 中返回鼠标位置只能通过 MouseArea 控件,但当多个该控件一起 就存在覆盖而无法正确接受事件的可能,因此 DTK 提供一个可以直接 访问鼠标位置的接口,方便QML程序获取并使用。 @fn DciIcon DTK::makeIcon(QtIcon, DciIconAttached) @brief 兼容 \a QtIcon 的属性,将 DciIcon 附加属性值和 \a QtIcon 的属性值添加到 DciIcon 实例中。这种方式大多在控件图标为 \a QtIcon 时使用,在添加 \a QtIcon 的属性后,可以通过添加 DciIcon 附加属性,将其进行整合,例如 Button 控件。 ```qml import org.deepin.dtk 1.0 Button { width: 50 height: 50 icon.name: "apple" icon.width: 24 icon.height: 24 DciIcon.palette.foreground: "red" DciIcon.mode: DTK.HoveredState DciIcon.theme: ApplicationHelper.DarkType } ``` 上述方式这样实现是由于,Button 的属性 icon 为 QtIcon, 而其内部的图标控件是 DciIcon, 因此为了保持兼容,在使用方式上不存在差别,才衍生出该函数进行整合。Button 中使用该函数进行 QtIcon 和 DciIcon 附加属性进行绑定的场景如下: ```qml import org.deepin.dtk 1.0 Button { id: control contentItem: IconLabel { icon: DTK.makeIcon(control.icon, control.DciIcon) } } ``` @return 返回兼容后的 DciIcon 图标实例。 @fn DciIcon::Palette DTK::makeIconPalette(qpalette) @brief 根据 \a qpalette 创建图标的调色板属性。 图标调色板和控件调色板是分开的 图标调色板分为 Foreground Background HighlightForeground 和 Hightlight 四种 某些图标的图层会使用该类调色板进行着色,当控件使用`QPalette 时,可以将`QPalette 和 DDciIconPalette 兼容。 例如以下使用场景: ```qml import org.deepin.dtk 1.0 Control { property alias icon: _icon DciIcon { id: _icon anchors.centerIn: parent sourceSize { width: 50 height: 50 } palette: DTK.makeIconPalette(parent.palette) } } ``` @return 返回转化后的 DciIcon 中的 palette 属性,返回后的实例可直接应用在 DciIcon 的属性中进行属性绑定。 @fn bool DTK::sendMessage(object target, string content, string iconName, int duration, string msgId) \keyword DSendMessageFromContent @brief DTK 提供一种能在全局发送应用内通知的方式,目前有两种方式:一种是提供所有的通知信息,DTK 进行托管显示,并设置关闭或手动关闭。 一种是提供消息的 Component 组件,DTK 负责布局和管理,组件自身提供样式和关闭策略。 以下函数代表的第一种情况, \a target 可以使用目标对象或者目标对象所处的`window 。 \a content 为需要显示的文本信息 \a iconName 为可选参数,当需要显示图标时,可传入图标名称。 \a duration 为可选参数,代表消息显示的时长,默认时间为 4 秒, 当 \a duration 参数为 -1 时,表示该显示为常驻消息,关闭需要手动点击关闭按钮才行。 \a msgId 为可选参数,当 \a msgId 未 指定时,显示的消息将都为不同类消息,当多个消息的 \a msgId 一致时,后面的消息会替换同类型的前面的消息。 其使用方法如下展示: ```qml import org.deepin.dtk 1.0 Button { text: "FloatingMessage" property int count: 0 onClicked: { DTK.sendMessage(control, "message" + count) DTK.sendMessage(Window.window, "message" + count, "music", 4000, "type1") DTK.sendMessage(Window.window, "message" + count, "video", -1) count++ } } ``` @fn bool DTK::sendMessage(object target, component delegate, var message, int duration, string msgId) \keyword DSendMessageFromComponent 这种方式跟 \l {DSendMessageFromContent}{DTK.sendMessage()} 类似,不同的是, 它可以使用自定义创建的`FloatingMessage 和`FloatingMessageContainer 组件进行指定。 \a target 可以使用目标对象或者目标对象所处的`window 。 \a delegate 为消息显示的代理组件,可以使用`DTK 封装好的@brief FloatingMessage 添加自定义文本或者策略进行显示,也可以自己封装`FloatingMessageContainer 实现自定义的消息组件,当然 后面这种方式的成本更高。 \a message 参数指定 \a delegate 组件封装时需要用的额外参数,例如“content”,“iconName”等内容,由于@brief Component 存在作用域的问题,问了更方便的获取到这些数据对象,防止出现属性绑定失败的情况,DTK 消息推荐将数据对象传入到 \a message 参数中, \a message 接收一个 JSON 的键值对类型,数据通过键值对进行访问,例如下述示例: ```qml import org.deepin.dtk 1.0 Button { text: "FloatingMessage" onClicked: { DTK.sendMessage(control, floatingMsgCom, {content: "message....", iconName: "music"}, -1) } Component { id: floatingMsgCom FloatingMessage { } } } ``` 上述代码中 \a message 变量传入了“{content: "message....", iconName: "music"}”参数,值得注意的是, FloatingMessage 中自带了两个 默认的 “key”,如上面参数展示,其分别是 “content” 和 “iconName”,分别对应的是文本内容和图标名称。对于一些自定义的键值对,可以使用如下方式 添加: @ import org.deepin.dtk 1.0 Button { text: "FloatingMessage" onClicked: { DTK.sendMessage(control, floatingMsgCom, {text: "message....", iconName: "music"}, -1) } Component { id: floatingMsgCom FloatingMessage { id: floatMsg contentItem: RowLayout { anchors.fill: parent spacing: 0 Label { Layout.fillHeight: true Layout.fillWidth: true text: floatMsg.message.text verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft Layout.alignment: Qt.AlignVCenter font: DTK.fontManager.t6 wrapMode: Text.Wrap elide: Text.ElideRight maximumLineCount: 1 } Button { text: "reload" font: DTK.fontManager.t5 Layout.alignment: Qt.AlignVCenter } } } } } ``` \a duration 为可选参数,代表消息显示的时长,默认时间为 4 秒,当`duration 参数为 -1 时,表示该显示为常驻消息,关闭需要手动点击关闭按钮才行。 \a msgId 为可选参数,当 \a msgId 未指定时,显示的消息将都为不同类消息,当多个消息的 \a msgId 一致时,后面的消息会替换同类型的前面的消息。 @fn void DTK::closeMessage(object message) \keyword DCloseMessageFromMessageObject 关闭浮动消息的统一接口,当使用 \l {DSendMessageFromComponent}{DTK.sendMessage(Object)} 接口时, 当自己重新定义`Component \a message 后,如果重载了其内部属性,就需要手动处理关闭该消息的动作。否则需要等待 duration 结束才能关闭,该种使用场 景可以通过下述方式描述: ```qml import org.deepin.dtk 1.0 Button { text: "FloatingMessage" onClicked: { DTK.sendMessage(control, floatingMsgCom, {content: "message...."}, -1) } Component { id: floatingMsgCom FloatingMessage { id: floatMsg button: Button { text: "close" onClicked: { console.log("close clicked") DTK.closeMessage(floatMsg) } } } } } ``` @fn void DTK::closeMessage(object target, string msgId) \keyword DCloseMessageFromMessageId 通过 \a msgId 关闭浮动消息,其中 \a target 表示浮动消息所在的 Item 或 Window 控件。 当控件中存在 \a msgId 指定的消息时,通过该接口可直接将该消息关闭。\a msgId 与 sendMessage() 接口中的 \a msgId 相对应。 @fn void DTK::setPopupMode(int mode) 设置 Popup 类型窗口的弹出方式,目前 \a mode 可以设置为 嵌入式弹出窗口( EmbedMode )或者 独立式弹出窗口( WindowMode )两种模式 ,其默认值为 AutoMode, 该模式会根据窗口情况进行自动选择。除此之外,还能通过修改环境变量的方式: 可以在 main 函数开头添加如下代码: ```qml int main(int argc, char **argv) { qputenv("D_POPUP_MODE", "embed"); ... return a.exec(); } ``` 当 “D_POPUP_MODE” 的值为非 “embed” 表示为独立式窗口。 TODO:这个文档需要仔细确定 */ dtkdeclarative-5.7.12/docs/qml/noqml/dquickbehindwindowblur.zh_CN.dox000066400000000000000000000062651476226662700257610ustar00rootroot00000000000000 /** @~chinese @class BehindWindowBlur @ingroup Item \keyword DQuickBehindWindowBlur @brief 提供一个能使窗口背景模糊的控件. @details DTK 中窗口可以实现模糊特效,当设置该特效后,窗口的特定区域将会对窗口后面的背景进行模糊填充。使用模糊特效能够丰富窗口的视觉内容 ,使窗口更加具备层次感和立体感。 BehindWindowBlur 控件能够很容易的实现该效果,其效果与 dtkwidget 中 DBlurEffectWidget 类 的效果类似,但在实现方式上有很大不同,在 QML 中使用 BehindWindowBlur 将更加灵活可控,例如 BehindWindowBlur 可以指定特殊区域 模糊,而另外的区域不模糊, 且模糊背景的颜色能与特定的颜色进行混色显示。 BehindWindowBlur 在使用方式上非常简单,它能够直接用在 Window 控件上,例如下述代码,其属性的设置和添加都更加方便和简单: ```qml import QtQuick.Window 2.11 import org.deepin.dtk 1.0 Window { id: root DWindow.enabled: true // 开启 DTK 中窗口的圆角和无边框等特殊属性 DWindow.alphaBufferSize: 8 // 设置 DTK 窗口 alpha 通道的缓冲区大小 BehindWindowBlur { control: root anchors.fill: parent blendColor: Qt.rgba(1, 0, 0, 0.3) } } ``` 其最终的效果如下图所示: @image html behindwindowblur.png 模糊特效分为窗口内模糊和窗口外模糊,窗口内模糊即对窗口内部控件所使用到的背景进行模糊;窗口外模糊即对窗口外部背景进行模糊。当前类进行 的模糊操作为窗口外模糊,其大多数情况下使用在窗口控件,对窗口的背景进行模糊渲染,并填充到窗口中。 BehindWindowBlur 类对模糊进行了 基本封装,可用于更灵活的场景中,例如一些特殊的混合填充色, StyledBehindWindowBlur 类同样也能对窗口进行模糊,但不同的是该类针对 行云设计中的模糊背景色对混合填充色进行了具体设置。用户在使用 StyledBehindWindowBlur 类时无需关心需要混合那种颜色。 @property real BehindWindowBlur::cornerRadius @brief 该属性表示模糊矩形的半径大小。 @details 模糊区域作为一个矩形大小的控件进行展示,因此该属性被用于指定矩形的圆角大小。 @property color BehindWindowBlur::blendColor @brief 该属性表示与目标区域混合的颜色 @details 当不指定颜色时,该背景模糊后直接展示到控件上;当指定颜色时,会将颜色与模糊背景进行混合,使模糊背景的色调呈现出与混合颜色相似的色调。 @property bool BehindWindowBlur::valid @note 该属性为只读属性 @brief 用于判断当前窗口状态是否支持窗口外模糊。 @details 如果支持窗口外模糊,返回 true,否则返回 false。该属性在窗口管理器层访问其是否支持模糊效果。 @property bool BehindWindowBlur::blurEnabled @brief 用于控制是否开启模糊效果。 @details 属性为 false 时,将禁用模糊效果,为 true 时则开启。便于在程序运行过程中临时开启或关闭模糊特效。 */ dtkdeclarative-5.7.12/docs/qml/noqml/dquickbusyindicator.zh_CN.dox000066400000000000000000000017211476226662700252620ustar00rootroot00000000000000 /** @~chinese @class BusyIndicator @ingroup Control \keyword DQuickBusyIndicator @brief 一个用于在用户界面显示用于需要等待的控件. DTK 程序统一的等待控件,展示在用户需要等待的地方,例如系统还原界面等待时、开机启动 等待时。没有具体的等待时间,不知道进度可能很快也可能很慢时。 该控件可自由设置控件大小来控制需要等待显示的大小,用于不同场景中,如下述代码所示: @ import org.deepin.dtk 1.0 BusyIndicator { running: true width: 32 height: 32 } ``` @image html dtk-spinner-blue.png @property color BusyIndicator::fillColor 用于填充 BusyIndicator 控件的具体颜色,默认是透明色,颜色可根据属性动态变化, 一般情况下可使用高脸色。 @property bool BusyIndicator::running 该属性用于控制动画是否进行,默认不自动进行。 dtkdeclarative-5.7.12/docs/qml/noqml/dquickcontrolpalette.zh_CN.dox000066400000000000000000000634601476226662700254520ustar00rootroot00000000000000 /** @~chinese @class Palette @ingroup QtObject \keyword DQuickControlPalette @brief DTK 中用于取色器(ColorSelector)使用的统一调色板对象. @details DTK 程序统一的调色板对象,其作为 ColorSelector 进行颜色选择的载体,通常情况下 具备“Normal”,“Hovered”,“Pressed”和“Disabled”四种不同的状态,但并所有的状 态都需要指定颜色,可根据控件情况自由选择需要的状态。其使用方式如下述代码所示: ```qml import org.deepin.dtk Palette { normal: "red" hovered: "green" pressed: "blue" disabled: "black" } ``` 当未找到对应控件调色板下的指定状态时,取色器(ColorSelector)会选择 “normal” 状态 的颜色进行代替。 调色板拥有一些其他的额外属性,下面按照分类的方式展示: \section1 主题适配 调色板的状态颜色值并非一个固定值,有的时候控件的某种颜色在系统的不同主题下,存在不一致的情况,有的 能够使用公式进行关联,而有的差异千差万别,这样就无法关联在一起。Palette 控件通过不同属性值来控制 亮色和暗色主题的颜色。具体为在各个状态的名称中添加了 “Dark” 关键字,例如“normalDark”。通常情况 下,当控件的深浅主题调色版颜色一致时,不需要指定“Dark”状态的颜色,而在控件深浅主题颜色不通用时指定。 例如下述代码: ```qml import org.deepin.dtk Palette { normal: "red" normalDark: "black" hovered: "green" hoveredDark: "yellow" } ``` \section1 禁用与启用 调色板可控制其状态属于禁用或者启用,这在需要动态调整调色板的使用时非常有用。取色器(ColorSelector) 会忽略禁用的属性并向上寻找其父类的该同名调色板。其使用方式如下所示: ```qml import org.deepin.dtk Palette { normal: "red" enabled: false } ``` \section1 颜色族 \target Palette color family 颜色族(family),默认的颜色族为“common”,当取色器(ColorSelector)修改其当前颜色族时,会将其使用 的所有调色板颜色进行重新选择,选择出对应的颜色族。目前可以使用的颜色族有两种,分别是"common"和"crystal" 颜色族。基础的控件颜色都需要定义在"common"颜色族中,而"crystal"颜色族用于指定类似“水晶”效果(即能够透过 控件本身颜色看透其背后控件的类似效果)的颜色值。如"TransparentButton"控件。 \table \header \li 颜色族 \li 描述 \row \li \c common \li 基础颜色族,未指定时默认初始化该数据,用于基础的控件颜色。 \row \li \c crystal \li 水晶颜色族,用于特殊情况下的控件需要出现类似“水晶”效果时,指定的颜色 例如,Dialog 中的内部控件,如按钮等,其背景和默认的按钮背景不一致。 \endtable 下述使用方式展示了如何在调色 版中使用颜色族: ```qml import org.deepin.dtk Palette { normal { common: "#f0f0f0" crystal: Qt.rgba(0.20, 0.2, 0.2, 0.1) } hovered: "#d2d2d2" // common family pressed.crystal: "#cdd6e0" // crystal family } ``` \section1 QPalette 调色板适配 DTK 调色板能够适配 Qt 调色板的部分颜色属性,如高亮色和高亮文本色,具体使用方式如下: ```qml Palette { normal: DTK.makeColor(Color.Highlight) hovered: DTK.makeColor(Color.Highlight).lightness(+10) pressed: DTK.makeColor(Color.Highlight).opacity(-10) } ``` QPalette 调色板属性进行颜色微调。如上述代码,调整其亮度和不透明度等属性。除此之外 可修改饱和度 (saturation) 和 色调 (hue),颜色的取值范围为[100, +100] @property bool Palette::enabled @brief 调色板对象是否启用 @details 取色器会寻找其父类中最近一个同名的调色板对象,并取其颜色值。默认情况下,该属性为 true @propertygroup :Palette::normal @property Color Palette::normal.common @property Color Palette::normal.crystal 控件 “Normal” 状态下的颜色,“Normal”状态对应于控件最基本的状态,是每个控件都 存在的状态,取色器根据控件是否处于 normal 状态来控制其选择调色板颜色。 @propertygroup Palette::normalDark @property Color Palette::normalDark.common @property Color Palette::normalDark.crystal 控件 “Normal” 状态下暗色主题下的颜色,该属性只在暗色主题下生效,当控件不对 主题色敏感时,取色器只会选取 normal 属性的颜色。 @propertygroup Palette::hovered @property Color Palette::hovered.common @property Color Palette::hovered.crystal 控件 “Hovered” 状态下的调色板颜色,“Hovered” 属性表示控件被鼠标悬浮是的状态, 一些控件,如“Button”、“LineEdit”、“ComboBox”等都有这种状态。和 normal 状态 类似,当控件处于 hovered 状态时,取色器会自动选择该属性颜色。 @propertygroup Palette::hoveredDark @property Color Palette::hoveredDark.common @property Color Palette::hoveredDark.crystal 控件 hovered 状态时的暗色主题颜色。 @propertygroup Palette::pressed @property Color Palette::pressed.common @property Color Palette::pressed.crystal 控件 “Pressed” 状态时的调色板颜色, “Pressed” 状态对应于鼠标按压后的控件 状态,并非所有的控件都需要响应此状态,如“Button”、“CheckBox”存在该状态, “Label”,“Edit”不存在该状态。 @propertygroup Palette::pressedDark @property Color Palette::pressedDark.common @property Color Palette::pressedDark.crystal 控件 “Pressed” 状态暗色主题下对应的调色板颜色。 @propertygroup Palette::disabled @property Color Palette::disabled.common @property Color Palette::disabled.crystal 控件 “disabled” 状态下的调色板颜色,控件的 “Disabled” 状态对应于控件的禁用 状态,每个控件都具备禁用状态,如未指定时,默认使用“Normal”状态下的颜色代替。 @propertygroup Palette::disabledDark @property Color Palette::disabledDark.common @property Color Palette::disabledDark.crystal 控件 “disabled” 状态暗色主题下对应的调色板颜色 /** @~chinese @class ColorSelector @ingroup QtObject \keyword DQuickControlColorSelector @brief DTK 用于指定控件颜色的统一取色辅助器. 取色器作为一个能够自动获取控件不同状态,并根据该状态选择合适的颜色的角色而存在。目的是用于 简便控件状态的使用,自动并高效的指定控件颜色。使用取色器作用在控件上时,处理颜色的过程更加 简单,只需要在控件中指定对应属性的调色板信息,在需要使用的地方,使用取色器直接使用就能达到 跟随状态自动改变的效果。 由于需要在控件中指定不同的调色板颜色属性,因此外部可以通过更改该属性而达到修改取色器颜色值 进行颜色替换的效果,每个控件中都具备相同类型的属性,如 “backgroundColor” 背景颜色属性, “textColor” 文字颜色属性等等。除此之外,取色器能够高级的只监听某一种控件状态,如 “Button” 的 “hovered” 或 “Pressed” 状态。同时取色器能够根据系统主题信息,自动选择 对应主题下的调色板属性。 颜色控制系统可以分为三个层次:调色板、控件属性和取色器。取色器作为监听者,能够监听这二者的变 化,除此之外,取色器会根据当前绑定的控件状态、控件对象等等信息自动更改颜色。下面给出一个简单 的示例代码: ```qml import org.deepin.dtk 1.0 Control { id: control width: 500 height: 50 property Palette backgroundColor: Palette { normal: "black" } property Palette textColor: Palette { normal: "white" } contentItem: Text { text: "Test......." color: control.ColorSelector.textColor horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter } background: Rectangle { width: 250 height: 50 color: control.ColorSelector.backgroundColor } } ``` \note 当控件类型继承于 Control 或者控件存在调色板数据时,该控件的 ColorSelector 附加属性才会被创建。 \note 如果当前控件非继承于 Control类型,且具备创建 ColorSelector 的条件,该 ColorSelector 将寻找其最 上层父类的 Control 控件,并进行调色板和控件状态的更新绑定。 \note ColorSelector 仅会监听当前控件和离它最近的父类 Control控件的调色板属性。其中间父类不论是否存在 ColorSelector 对象,都不会读取和绑定。 ColorSelector 在下述变化的场景中,同样能够跟随控件发生变化。 \section2 ColorSelector 可跟随控件状态发生变化 当 Control 开启 hoverEnabled 属性后,ColorSelector 能够监听控件状态的变化过程,并跟随发生属性的颜色变化 ```qml import org.deepin.dtk 1.0 Control { id: control width: 50 height: 50 hoverEnabled: true property Palette backgroundColor: Palette { normal: "red" hovered: "green" } background: Rectangle { anchors.fill: parent color: control.ColorSelector.backgroundColor } } ``` \section1 ColorSelector 的颜色属性 \section2 ColorSelector 跟随手动修改后的调色板颜色而变化 可通过直接修改调色板的在某个状态额颜色值,而直接更新 ColorSelecotor 读取出来的调色板 属性颜色,如下述代码所示: ```qml import org.deepin.dtk 1.0 Control { id: control width: 50 height: 50 hoverEnabled: true background: Rectangle { id: rect property Palette backgroundColor: Palette { normal: "red" hovered: "green" } color: ColorSelector.backgroundColor anchors.fill: parent MouseArea { anchors.fill: parent onClicked: { rect.backgroundColor.hovered = "yellow" } } } } ``` 可通过直接赋值的方式,替换 ColorSelector 记录的整个调色板数据,如下述 代码所示: ```qml import org.deepin.dtk 1.0 Control { id: control width: 50 height: 50 hoverEnabled: true background: Rectangle { id: rect property Palette backgroundColor: Palette { normal: "red" hovered: "green" } anchors.fill: parent color: ColorSelector.backgroundColor MouseArea { Palette { id: otherPalette normal: "black" hovered: "gray" } anchors.fill: parent onClicked: { rect.backgroundColor = otherPalette } } } } ``` \section2 ColorSelector 响应自身属性值的变化 上述替换调色板属性,同样也可通过 ColorSelector 进行替换。如下述代码所示: ```qml import org.deepin.dtk 1.0 Control { id: control width: 50 height: 50 hoverEnabled: true background: Rectangle { id: rect property Palette backgroundColor: Palette { normal: "red" hovered: "green" } anchors.fill: parent color: ColorSelector.backgroundColor MouseArea { anchors.fill: parent onClicked: { Palette { id: otherOPalette normal: "black" hovered: "gray" } rect.ColorSelector.backgroundColor = otherPalette } } } } ``` 替换后的属性值,可通过赋值为 undefined 进行复原,如下述代码所示: ```qml import org.deepin.dtk 1.0 Control { id: control width: 50 height: 50 hoverEnabled: true background: Rectangle { id: rect property Palette backgroundColor: Palette { normal: "red" hovered: "green" } anchors.fill: parent color: ColorSelector.backgroundColor MouseArea { anchors.fill: parent onClicked: { Palette { id: otherPalette normal: "black" hovered: "gray" } rect.ColorSelector.backgroundColor = otherPalette } onDoubleClicked: { // 复原 rect.ColorSelector.backgroundColor = undefined } } } } ``` \section2 ColorSelector 对于自身没有的调色板属性,会从上层 Control 寻找 ColorSelector 属性能够获取其自身对象以及其最近的 Control 控件的调色板属性,并监听 Control 控件的状态变化, 进行颜色属性的自动更新。如下述代码所示: ```qml import org.deepin.dtk 1.0 Control { id: control width: 200 height: 200 hoverEnabled: true property Palette backgroundColor: Palette { normal: "red" hovered: "green" } background: Rectangle { property Palette borderColor: Palette { normal: "blue" hovered: "yellow" } // 获取 Control 类中的 backgroundColor 调色板属性 color: ColorSelector.backgroundColor border.width: 2 // 获取自身的 borderColor 调色板属性 border.color: ColorSelector.borderColor } } ``` \warning 需要注意的是, Control 控件的子控件,如果其自身不存在任何调色板属性,将不会 为它创建 ColorSelector 对象。因此上述方式只能作用于 子控件存在调色板属性的场景。 \section2 ColorSelector 能够监听控件的父类,当父类发生变化时,会跟随更新其使用父类的所有调色板颜色。 \section2 已封装好的控件使用颜色覆盖的形式 如想要替换 Button 中的文本颜色时,可用如下代码: ```qml Button { text: "Push Button" textColor: Palette { normal: "red" hovered: "blue" } } ``` \section1 ColorSelctor 进行状态过滤 ColorSelector 可以进行控件单一状态(hovered、pressed、disabled、inactived)的设置。默认情况下,各 个状态都是处于未设置的状态,即不针对某一状态进行单独处理而默认接受所有状态的改变。 \list \li 将控件的某个状态作为其标准状态 例如控件需要将其“Hovered”状态作为其标准状态时,可使用如下代码: ```qml Rectangle { width: 200 height: 300 Button { anchors.centerIn: parent text: "Hovered state" // 仅处理 hovered 状态 ColorSelector.hovered: true } } ``` \li 控件禁用某一状态 例如当控件需要禁用“Hovered”状态时,可使用如下代码: ```qml Rectangle { width: 200 height: 300 Button { anchors.centerIn: parent text: "Can't Hovered" ColorSelector.hovered: false } } ``` \li 多种状态的叠加 当禁用状态和启用状态同时使用时,例如除“Hovered”状态外,其他状态都处于禁用状态,可用如下代码: ```qml Rectangle { width: 200 height: 300 Button { anchors.centerIn: parent text: "Only Hovered" ColorSelector.hovered: true ColorSelector.pressed: false ColorSelector.disabled: false } } ``` 上述代码的效果为,仅展示 Hovered 状态,禁用其他所有状态。 \endlist \note 状态控制仅接受真实bool值的设置,不针对属性绑定 \note 推荐控件只有一种状态被启用。当多个状态都处于启用状态时,标准状态将按照不同控件情况而定。 \section1 标准控件的 Palette 属性对照 下表列出基础控件可被替换修改的调色板颜色属性值(按字母顺序排序): \table \header \li 控件 \li 属性 \li 描述 \row \li ActionButton \li textColor \li 按钮的文本和图标的颜色 \row \li {1, 7} BoxPanel \li color1 \li Box 或 Button 控件的背景渐变色1 \row \li color2 \li Box 或 Button 控件的背景渐变色2 \row \li insideBorderColor \li Box 或 Button 控件的内描边颜色 \row \li outsideBorderColor \li Box 或 Button 控件的外描边颜色 \row \li dropShadowColor \li Box 或 Button 控件的外阴影颜色 \row \li innerShadowColor1 \li Box 或 Button 控件的内阴影渐变颜色1 \row \li innerShadowColor2 \li Box 或 Button 控件的内阴影颜色2 \row \li BusyIndicator \li fillColor \li BusyIndicator 的填充色 \row \li Button \li textColor \li 按钮控件中的文本和图标颜色 \row \li ButtonIndicator \li backgroundColor \li ButtonIndicator 的背景颜色 \row \li ButtonPanel \li 继承于 BoxPanel \li 能使用 BoxPanel 中的所有调色板颜色 \row \li CheckDelegate \li backgroundColor \li \l CheckDelegate 控件的背景色 \row \li ComboBox \li separatorColor \li ComboBox 在编辑状态下的分隔符颜色 \row \li {1, 2} EditPanel \li backgroundColor \li 所有的编辑框背景色 \row \li alertBackgroundColor \li 所有编辑框在显示警告信息时的背景颜色 \row \li {1, 2} EmbeddedProgressBar \li backgroundColor \li 嵌入式进度条的背景颜色 \row \li progressBackgroundColor \li 嵌入式进度条的进度背景色 \row \li FloatingButton \li 继承于 Button \row \li {1, 3} FloatingPanel \li backgroundColor \li FloatingPanel 控件的背景颜色 \row \li dropShadowColor \li FloatingPanel 的外阴影颜色 \row \li borderColor \li FloatingPanel 的边框颜色 \row \li {1, 3} HighlightPanel \li backgroundColor \li HighlightPanel 的背景颜色 \row \li outerShadowColor \li HighlightPanel 的外阴影颜色 \row \li innerShadowColor \li HighlightPanel 的内阴影颜色 \row \li IpV4LineEdit \li backgroundColor \li IpV4LineEdit 的背景框颜色 \row \li ItemDelegate \li checkedTextColor \li ItemDelegate 在选中时的文本颜色 \row \li {1, 2} KeySequenceEdit \li backgroundColor \li KeySequenceEdit 控件的背景颜色 \row \li placeholderTextColor \li KeySequenceEdit 的占位文本颜色 \row \li {1, 2} MenuItem \li subMenuBackgroundColor \li 子菜单的背景色 \row \li itemColor \li 文字和图标 Hovered 状态下的颜色 \row \li Slider \li grooveColor \li Slider 控件的滑槽背景颜色 \row \li {1, 2} SliderTipItem \li tickColor \li Slider 控件标签的背景颜色 \row \li textColor \li Slider 控件标签的文本颜色 \row \li SpinBoxIndicator \li inactiveBackgroundColor \li SpinBox 右侧指示按钮在未激活状态时的背景颜色 \row \li {1, 2} Switch \li backgroundColor \li Switch 按钮的背景颜色 \row \li handleColor \li Switch 按钮的滑槽颜色 \row \li TextField \li backgroundColor \li TextField 控件的背景颜色 \row \li TitleBar \li textColor \li TitleBar 控件的文本和图标颜色 \row \li ToolButton \li textColor \li ToolButton 控件的文本和图标颜色 \row \li WarningButton \li 继承于 Button \li 能使用 Button 控件中的所有调色板颜色 \row \li {1, 5} WaterProgressBar \li backgroundColor1 \li WaterProgressBar 的背景渐变色1 \row \li backgroundColor2 \li WaterProgressBar 的背景渐变色2 \row \li dropShadowColor \li WaterProgressBar 的外阴影颜色 \row \li popBackgroundColor \li WaterProgressBar 的内置小气泡背景颜色 \row \li textColor \li WaterProgressBar 的文本颜色 \row \li WindowButton \li textColor \li WindowButton 控件的文本和图标颜色 \row \li WindowButtonGroup \li textColor \li WindowButtonGroup 内所有 WindowButton 控件的文本和图标颜色 \endtable @property Item ColorSelector::control @note 该属性为只读属性 @details 需要绑定的 Control 对象。绑定后 ColorSelector 会根据当前 control 的状态 选择对应的颜色值。通常情况下该属性不需要手动设置,当使用 ColorSelector 的 附加属性时,ColorSelector 会自动寻找最接近其的父类 Control 控件,并自动将 该控件当做需要监听的对象,因此一个父类 Control,其所有的子类的 ColorSelector 属性都将按照它的状态发生颜色变化。 @property enumeration ColorSelector::controlTheme @note 该属性为只读属性 @details control 控件的当前主题,只读属性,通常情况下 ColorSelector 会监听控件的主题状态。 用于选择亮色或暗色的状态颜色。 枚举对应于 ApplicationHelper 中的主题色枚举,如下表所示: \table \header \li 枚举值 \li 名称 \row \li ApplicationHelper.LightType \li 亮色主题类型 \row \li ApplicationHelper.DarkType \li 暗色主题类型 \row \li ApplicationHelper.UnknowType \li 未知主题类型 \endtable @property enumeration ColorSelector::controlState @note 该属性为只读属性 @details 控件状态,只读属性。该属性是 ColorSelector 根据当前 control 的状态自动生成。 其枚举值如下表所示: \table \header \li 枚举值 \li 名称 \row \li DTK.NormalState \li normal 状态 \row \li DTK.HoveredState \li Hovered 状态 \row \li DTK.PressedState \li Pressed 状态 \row \li DTK.DisabledState \li 控件被禁用状态 \row \li DTK.InactiveState \li 控件未激活状态 \endtable @property enumeration ColorSelector::family 调色板额颜色族,指定 ColorSelector 需要设置的颜色族。不同的颜色族提供的颜色 不一致,目前有两种颜色族可以定义: \table \header \li 枚举值 \li 名称 \row \li Palette.CommonColor \li 基本颜色族。默认的颜色族,不额外指定时,控件为该颜色族。存储控件默认场景下的颜色。 \row \li Palette.CrystalColor \li 水晶颜色族。当控件的背景为透明模糊时,使用该颜色族。 \endtable 其使用方式如下代码所示: ```qml import org.deepin.dtk 1.0 FloatingPanel { width: 200 height: 200 backgroundColor: Palette { normal { common: "#f0f0f0" crystal: Qt.rgba(0.20, 0.2, 0.2, 0.1) } hovered: "#d2d2d2" // common family pressed.crystal: "#cdd6e0" // crystal family } ColorSelector.family: Palette.CrystalColor contentItem: ListView { model: 6 delegate: MenuItem { text: "菜单项" + modelData } } } ``` @property bool ColorSelector::hovered @brief 启用或者禁用 hovered 状态。当处于禁用状态时,控件对鼠标的悬浮状态不敏感。 @property bool ColorSelector::pressed @brief 启用或者禁用 pressed 状态。当处于禁用状态时,控件对鼠标的点击状态不敏感。 @property bool ColorSelector::disabled @brief 启用或者禁用 disabled 状态。当处于禁用状态时,控件对其 disabled 状态不敏感。 @property bool ColorSelector::inactived @brief 启用或者禁用 inactived 状态。当处于禁用状态时,控件对其 inactived 状态不敏感。 @signal void ColorSelector::colorPropertyChanged(string name) @brief ColorSelector 内存储的颜色属性发生变化时,触发该信号。 \a name 为发生改变的颜色属性名称 FIXME:此文件存疑 后期处理 */ dtkdeclarative-5.7.12/docs/qml/noqml/dquickdciicon.zh_CN.dox000066400000000000000000000237731476226662700240260ustar00rootroot00000000000000 /** @~chinese @class DciIcon @ingroup Item \keyword DQuickDciIcon @brief 提供一个兼容多种场景的DTK图标控件. DCI 图标控件是一个提供多模式、多主题、多大小的整合型控件,该控件可能包含多个图标文件,在上述 场景下进行动态切换。例如,当某个图标文件在鼠标的不同状态下需要发生前景色甚至整个图标的变化时, 常规图标需要在不同状态时切换不同图标,代码繁琐且难维护DCI 图标为了解决这种多场景的问题,帮助 在 QML 中能够快速实现图标跟随不同场景的变化。 \section1 多模式 DCI 图标可以包含多种不同的模式下的图标,DCI 图标分为五种状态, 其分别为:NormalState、HoveredState、PressedState、 DisabledState 和 InactiveState 。这五种状态和 \l{DTK}{DQMLGlobalObject} 中的 DTK.ControlState 枚举一致,能够直接兼容该枚举进行使用。 这个状态用于表示控件的不同状态,并不是每个控件都有每种不同的状态,如 Rectangle 控件 ,就只有NormalState、DisabledState 和 InactiveState。而 Button 控件,就有上述 的所有状态。当控件使用的 DCI 图标文件中有某个状态下的单独图标时,会优先显示该状态下的 图标文件,否则显示 NormalState 状态下的图标文件。如果一个图标文件中不存在 NormalState 状态下的图标,则讲该图标视为一个无效图标。 \section1 多主题 DCI 图标适配了多主题下的图标不一致问题。设计中可能会存在 DCI 图标在不同的主题下图标不一致 的情况,目前的实现只能保证图标的前景配色跟随主题发生改变。DCI整合多主题的问题,使同一个图标 在不同主题下的不一致,仍能用一个图标进行表示,并能根据不同主题的情况,发生图标的适应性变化。 目前多主题分为:深色主题和浅色主题两种。 \section1 多缩放比、多大小 DCI 图标能够适配不同的缩放比和大小。例如控件的大小和设备的缩放比,当控件需要通过 DCI 图标进 行高级合成时(如 Switch 控件的 Handle),控件可能在不同的场景下大小不同,这时图标就需要根 据这种不同的大小场景动态选择出合适大小的图标进行展示。设备缩放比同样如此,目前 DCI 图标的策略 是,优先将图标中较大的大小和缩放比进行缩放显示。 \section1 使用图层进行布局 DCI 图标使用图层布局每种状态下的图标,QML 下的图标文件大多数都存在阴影特效,这类特效并不是 应用程序在渲染绘制时添加的,而是 DCI 图标本身存在的阴影大小,而在某些情况下,可能存在阴影不 占用控件大小或者阴影不跟随图标前景色发生变化的情况。因此,为了区别同一个图标的不同变化问题, DCI 图标的内部渲染使用图层概念,每个图标的内部都由不同的图层组成,每个图层都代表不同的部件, 如 Switch控件的 Handle 控件中,中心滑块是一个图层,外阴影是一个图层,内阴影也是一个图层。 这些不同图层通过不同顺序的堆叠形成最终效果。 @image html dciicon-layers.png \section1 图标调色板 每个图标都有一个调色板,其包含四种类型的颜色:前景色、背景色、高亮前景色、高亮色,这四种调色板 分别对应不同的情形,每个图层文件都包含一个调色板数据,而每个图标文件可能存在多个图层文件,因此, 每个图标可能有多个调色板,如一个图标的背景色如果存在变化的情况,则其背景图层会标记为背景色调色板; 而对于需要高亮显示的部分,其图层指定的调色板数据则为高亮色。当用户在使用 DCI 图标时,如果该图标 需要调色板数据,则需要显示指定该调色板颜色值,如下述代码所示: @ import org.deepin.dtk 1.0 DciIcon { name: "test-icon" sourceSize { width: 50 height: 50 } // 设置调色板数据 palette.foreground: "red" palette.background: "black" palette.highlight: "blue" palette.hightlightForeground: "white" } ``` 对于能够继承 QPalette 的控件,在控件的颜色对应正常的情况下,可以直接使用控件的调色板指定,如下代码: @ import org.deepin.dtk 1.0 Control { id: control width: 100 height: 100 background: Rectangle { color: control.palette.background } contentItem: DciIcon { name: "test-icon" sourceSize { width: 50 height: 50 } palette: DTK.makeIconPalette(control.palette) } } ``` \section1 附加属性 DciIcon 控件存在附加属性,附加属性为了保持和 QtIcon 的兼容,为了更方便的操作使用 QtIcon 的控件,如 Button ComboBox 等等。 DciIcon 的附加属性和其内部属性一致,目的时为了设置 QtIcon 中不存在的图标属性,如 mode theme palette 等等。 其用法可用下述代码表示: @ import org.deepin.dtk 1.0 Button { icon { name: "test" width: 50 height: 50 } DciIcon.mode: DTK.HoveredState DciIcon.theme: ApplicationHelper.LightType DciIcon.palette { foreground: "red" } DciIcon.fallbackToQIcon: true } ``` 其附加属性如下列表: \table \row \li mode \li 与 \l {mode}{DciIcon::mode} 功能保持一致 \row \li theme \li 与 \l {theme}{DciIcon::theme} 功能保持一致 \row \li palette \li 与 \l {palette}{DciIcon::palette} 功能保持一致 \row \li fallbackToQIcon \li 与 \l {fallbackToQIcon}{DciIcon::fallbackToQIcon} 功能保持一致 \endtable @property string DciIcon::name name 属性用于设置 DciIcon 的名称,一般情况下,该名称需要对应图标主题下的图标名称,而不需要将资源路径或绝 对路径下的全名称设置进去。例如 “/usr/share/dsg/icons/bloom”目录下存在一个名称为 “test.dci” 的文 件。在使用时可直接用下述情况进行展示: @ import org.deepin.dtk 1.0 DciIcon { name: "test" } ``` 图标主题的存在是为了更方便的将一类图标进行统一管理与更换,同时也能更好的配置一些图标替换操作,例如使用图标主题能够帮助 DTK 内部管理和控制图标的替换。例如上述的“test”图标,其所属的图标主题名为“bloom”。更多的图标主题规范内容,请见 DCI 图标主题规范。 @property enumeration DciIcon::mode mode 属性用于设置 DciIcon 的图标模式,不同的 mode 其对应的图标文件可能会不一样,其枚举值如下述表示: \value DTK.NormalState 控件的normal状态 \value DTK.HoveredState 控件鼠标悬浮时的状态 \value DTK.PressedState 控件的pressed状态 \value DTK.DisabledState 控件的禁用状态 \value DTK.InactiveState 控件的未激活状态 @property enumeration DciIcon::theme theme 属性用于设置 DciIcon 的图标主题,目前分为深色主题和浅色主题两种。不同主题下的图标可能会不一样。 \value ApplicationHelper.UnknownType 未知主题 \value ApplicationHelper.LightType 亮色主题 \value ApplicationHelper.DarkType 暗色主题 @propertygroup DciIcon::palette @property color :DciIcon::palette.foreground @property color :DciIcon::palette.background @property color :DciIcon::palette.highlight @property color :DciIcon::palette.highlightForeground 该属性用于设置 DciIcon 的图标调色板。 \include ddciiconpalette.qdocinc grouped-properties @property size DciIcon::sourceSize sourceSize 属性用于指定 DciIcon 控件的大小,一般情况下,在未指定其图标大小时, 会读取出图标的默认大小,但由于控件本身未设置大小,因此该该控件本身并不占用任何大小。 除非手动指定了 width height 属性。 当 sourceSize 被指定时,DciIcon 控件被设置了与 sourceSize 大小一致的隐式宽高, 当图标存在外阴影时,其阴影部分不占用 sourceSize 的大小。 @property bool DciIcon::mirror mirror 属性决定 DciIcon 控件是否需要水平翻转显示。 该属性默认是 false. \sa {Image::mirror} @property bool DciIcon::fallbackToQIcon fallbackToQIcon 属性决定当 DciIcon 无法在当前主题下找到对应 name 的 图标文件时,其是否需要从 QtIcon 中继续寻找。当控件使用 Qt 的图标加载方 式时,将该属性打开能够兼容 Qt 的图标控件进行显示。 该属性默认时 false. @property bool DciIcon::asynchronous 指定图标是否异步加载,默认异步加载,该属性和Image的asynchronous属性效果一致。 @property bool DciIcon::cache 指定图标是否缓存,该属性的默认值和行为与Image的cache属性一致。 @attachedproperty enumeration DciIcon::mode 该属性用于附加一个图标 mode 状态值。其使用方式如下 @ Button { DciIcon.mode: DTK.HoveredState } ``` @attachedproperty enumeration DciIcon::theme 该属性用于附加一个图标亮暗色主题枚举。其使用方式如下 @ Button { DciIcon.theme: ApplicationHelper.DarkTheme } ``` @attachedproperty group DciIcon::palette 该属性用于附加一个图标调色板。其使用方式如下 @ Button { DciIcon.palette.foreground: "red" } ``` @attachedproperty bool DciIcon::fallbackToQIcon 指定附加一个当无法找到 Dci Icon 时是否回滚到 QIcon 中。 dtkdeclarative-5.7.12/docs/qml/noqml/dquickglow.zh_CN.dox000066400000000000000000000041131476226662700233510ustar00rootroot00000000000000 /** @~chinese @class GlowEffect @ingroup Item @brief DTK 中一种光晕特效控件. GlowEffect 是一种在 DTK 中用于作用在控件上的光晕特效。该特效使用 OpenGL 中特殊的阴影材质着色器实现,目前仅支持硬件软件模式,不支持软 件渲染。如需使用支持全模式的阴影效果,请使用控件 BoxShadow. 光晕特效通常呗作用在矩形中,用于矩形的阴影效果。例如 DTK 根据 GlowEffect 开发出的 RectangularShadow 控件。 GlowEffect 的使用场景更加抽象,其属性 更难控制,对于简单场景,请使用 RectangularShadow 控件。 如下示例代码: @ import org.deepin.dtk 1.0 GlowEffect { anchors.centerIn: parent width: 100 height: 100 glowRadius: 50 color: "black" spread: 0.01 relativeSizeX: 0.5 relativeSizeY: 0.5 } ``` 其效果为: @image html dtk-gloweffect.png \sa RectangularShadow @property qreal GlowEffect::glowRadius 该属性用于表示光晕半径,当 fill 属性为 true 时,该属性将不会生效。发光半径 表示从 (0,0) 点到矩形的中心点的距离,当发光半径等于矩形宽高的一半时,表示对 矩形的全部填充。 @property color GlowEffect::color 该属性用于表示光晕特效的填充颜色。 @property qreal GlowEffect::spread 该属性用于表示发光的扩散系数。该系数越小,表示扩散程度越大。 @property qreal GlowEffect::relativeSizeX 该属性用于表示光晕相对大小的 X 坐标。其取值范围为[0,1]。0表示无相对大小。 1表示完全相对。 @property qreal GlowEffect::relativeSizeY 该属性用于表示光晕相对大小的 Y 坐标。其取值范围为[0,1]。0表示无相对大小。 1表示完全相对。 @property bool GlowEffect::fill 该属性表示是否填充整个光晕区域。当设置为填充时,光晕颜色将完全覆盖矩形大小。 当扩散系数未覆盖区域时,显示出颜色的纯色。 dtkdeclarative-5.7.12/docs/qml/noqml/dquickiconimage.zh_CN.dox000066400000000000000000000053271476226662700243440ustar00rootroot00000000000000 /** @~chinese @class QtIcon @ingroup Item \keyword DQuickIconImage @brief 提供一种使用 Qt 方式加载图标的控件 QtIcon 作为 DTK 程序访问和插件 Qt 图标的控件,虽然 DTK Quick 极力推荐 应用在大多数的场景下使用 Qt 图标,但是不乏存在应用能需要使用 Qt 图标的情况。 因此 DTK 提供 QtIcon 来访问和获取 Qt 图标(默认使用异步的方式加载)。 其使用方式(同步加载)如下所示代码: @ QtIcon { name: "button-add" sourceSize { width: 128 height: 128 } mode: QtIcon.Selected color: "gray" state: QtIcon.On asynchronous: false } ``` @property string QtIcon::name name 属性用于设置 QtIcon 的图标名称,该名称通过图标主题的方式查找提供。 DTK环境下实现的图标主题在 dtkgui 中,通过 Built-in 图标隐藏和 Xdg 图标 引擎提供。 当 name 图标无法找到时,请先设置好 fallbackSource 属性,用于 fallback 到 该路径下的图标中。 @property enumeration QtIcon::state state 属性描述 QtIcon 中图标的当前状态。 state 属性于 QIcon 中的 State 枚举一致,不同的图标可能存在不同的状态。状态可以使用以下枚举: \table \header \li 枚举值 \li 名称 \row \li QtIcon.On \li 类似于 QIcon::On 即图标的开启状态 \row \li QtIcon.Off \li 类似于 QIcon::Off 即图标的关闭状态 \endtable @property enumeration QtIcon::mode mode 属性描述 QtIcon 中的模式,不同模式下的图标,可能展示的效果 不同,目前可以使用的模式枚举值为: \table \header \li 枚举值 \li 名称 \row \li QtIcon.Invalid \li 无效状态 \row \li QtIcon.Normal \li normal 状态,图标的标准状态。 \row \li QtIcon.Disabled \li Disabled 状态,类似于控件的 Disabled 状态。 \row \li QtIcon.Active \li Active 状态,激活状态,类似于控件的 Hover 状态 \row \li QtIcon.Selected \li Selected 状态,选中状态,类似于 MenuItem 的选中状态 \endtable @property color QtIcon::color color 属性描述图标填充的前景色颜色。与 Qt 提供的 Icon 控件效果一致, 当需要进行颜色填充时,请使用该属性。 @property url QtIcon::fallbackSource 用于当 name 属性无法获取到图标时, fallbackSource 能够提供次选方案。 如果两种方式都无法找到图标,应用程序将出现一些警告信息。 dtkdeclarative-5.7.12/docs/qml/noqml/dquickiconlabel.zh_CN.dox000066400000000000000000000107241476226662700243360ustar00rootroot00000000000000 /** @~chinese @class IconLabel @ingroup Item \keyword DQuickIconLabel @brief 提供一种带图标和文字的组合控件类型 Qt Quick Control 2 中提供了类似控件,但 IconLabel 与它不同的是, IconLabel 兼容了 DciIcon 的支持,提供了图标和文字的组合方式等等,使 该控件的使用更加灵活。 该控件的场景效果如下图所示: @image html IconLabel.png 使用代码示例如下所示: @ IconLabel { icon.name: "action_setting" spacing: 10 icon.width: 48 icon.height: 48 display: D.IconLabel.TextBesideIcon text: "Text Beside Icon" } ``` \warning 请注意这是一个内部控件,并不作为 DTK 的外部控件提供。 \warning IconLabel 控件使用的图标类型为 DciIcon ,而非 QtIcon 和 Icon. @propertygroup IconLabel::icon @property string :IconLabel::icon.name @property real :IconLabel::icon.width @property real :IconLabel::icon.height @property enumeration :IconLabel::icon.mode @property enumeration :IconLabel::icon.theme @property string :IconLabel::icon.source icon 属性表示 IconLabel 中使用的图标, 其与 DciIcon 中控件的属性一致,但又有不同 之处,其子属性如下表列举所示: \table \row \li icon.name \li dci 图标名称,从图标主题中获取,其用法于 DciIcon::name 一致。 \row \li icon.width \li 图标宽度,请确保在使用图标的时候给定一个具体宽度。 \row \li icon.height \li 图标高度,请确保在使用图标的时候给定一个具体高度。 \row \li icon.mode \li 图标的状态,与 DciIcon 中图标状态枚举一致。 \row \li icon.theme \li 图标主题,与 DciIcon 中图标主题枚举一致。 \row \li icon.source \li Dci 图标 fallback 到 Qt 图标时的路径,该路径应该是 Qt 图标的 source 属性。一般情况下,应用无需关心该属性值, \l{DTK::makeIcon()}{DTK.makeIcon()} 函数中已经将该属性于 Qt 图标进行绑定。 \endtable @property string :IconLabel::text text 属性描述 IconLabel 控件中的文本文字内容,暂只支持静态文本。 @property font :IconLabel::font font 属性描述 text 所使用的字体。 对于更多可以使用的 Qml 字体属性列表,请参阅 \l {Qml 字体属性类型} {https://doc.qt.io/qt-5/qml-font.html} @property color :IconLabel::color color 属性表示 text 的文字颜色。 @property enumeration :IconLabel::display display 属性表示文字和图标的排列方式,IconLabel 控件提供了5种不同的图标展示方式, 具体请看下表: \table \row \li IconLabel.IconOnly \li 仅展示图标 \row \li IconLabel.TextOnly \li 仅展示文字 \row \li IconLabel.TextBesideIcon \li 文字置于图标之后 \row \li IconLabel.TextUnderIcon \li 文字置于图标之下 \row \li IconLabel.IconBesideText \li 图标置于文字之后 \endtable @property real IconLabel::spacing spacing 属性描述文字和图标之间的间距值。当仅有图标或者仅有文字时 该属性将不会生效。 @property bool IconLabel::mirrored 镜像属性,一般情况下无需操作该属性。不同国家和地区可能阅读方式不一样, 默认情况下的控件为从左到右排列,当需要控件进行从右向左展示时,该接口 可以很好的解决次问题。 \warning 请注意,该属性的读取接口为 isMirrored . @property enumeration IconLabel::alignment 该属性用于控制文字和图标的对其方式,默认的对其方式为左对齐,其枚举值如下: \table \row \li Qt.AlignLeft \li 左对齐 \row \li Qt.AlignRight \li 右对齐 \row \li Qt.AlignHCenter \li 水平居中对齐 \row \li Qt.AlignVCenter \li 竖直居中对齐 \row \li Qt.AlignCenter \li 居中对齐 \endtable @property real IconLabel::topPadding @property real IconLabel::leftPadding @property real IconLabel::rightPadding @property real IconLabel::bottomPadding 该属性用于描述 IconLabel 的各个 padding 大小。是控件大小距离 contentWidth 和 contentHeight 的预留区域大小, dtkdeclarative-5.7.12/docs/qml/noqml/dquickitemviewport.zh_CN.dox000066400000000000000000000132241476226662700251420ustar00rootroot00000000000000 /** @~chinese @class ItemViewport @ingroup Item \keyword DQuickItemViewport @brief 一种提供了操作其源对象 Item 的高级视图控件 ItemViewport 提供了能够操作其 sourceItem 对象的高级视图控件。 ItemViewport 的用法很广泛,能够对各种 Item 类型进行圆角化处理, 能够帮助 InWindowBlur 控件对背景进行窗口内模糊特效等等。 ItemViewport 不仅支持 GPU 渲染,其也适配了 CPU 模式。使用 DTK 环境时,在 ItemViewport 控件能够处理的控件范围内,请尽量使用它,而非 Qt 控件,因为 Qt 控件可能仅支持 CPU 或 GPU 两种中的一种。 对于 ItemViewport 的使用场景,可以使用如下示例代码: \section3 特殊的圆角处理 某些特殊的场景下,当我们只需要 Button 控件四个角中的某一个圆角时,如下图所示,会发现 传统的控件无法达到要求,但可以使用 ItemViewport . @image html itemViewport_clip_radius.png 其实现代码如下图所示: ```qml import org.deepin.dtk 1.0 Item { anchors.centerIn: parent width: 100 height: 100 Item { id: btnBackground width: 120 height: 120 Button { id: btn anchors { right: parent.right top: parent.top } width: 64 height: 64 icon { name: "arrow_ordinary_up" width: 48 height: 48 } background: Rectangle { color: "#AA00FF" radius: 0 } } } ItemViewport { id: viewport sourceItem: btnBackground radius: 20 fixed: true width: btnBackground.width height: btnBackground.height anchors { right: parent.right top: parent.top } hideSource: true } } ``` \section3 配合 InWindowBlur 实现窗口内模糊 窗口内模糊指控件所处的窗口内,其背景颜色的模糊, DTK 中使用 InWindowBlur 控件 实现。当然仅通过该控件还无法达到最终效果,需要配合 ItemViewport 进行组合使用。 @ import org.deepin.dtk Item { Image { anchors.fill: parent source: "file:///usr/share/wallpapers/deepin/desktop.jpg" } ListView { id: testView model: 10 spacing: 30 clip: true anchors { fill: parent margins: 10 } delegate: Item { height: 50 width: 300 anchors.horizontalCenter: parent.horizontalCenter InWindowBlur { id: blur anchors.fill: parent radius: 20 offscreen: true } ItemViewport { id: roundBlur anchors.fill: blur fixed: true sourceItem: blur radius: blur.radius hideSource: false } Rectangle { radius: roundBlur.radius anchors.fill: roundBlur color: Qt.rgba(1, 0, 0, 0.2) } Text { anchors.centerIn: parent text: "InWindowBlur" + index color: "white" font.pixelSize: 22 } } } } ``` 其效果展示如下: @image html inwindowblur.png ItemViewport 的实现原理是将源控件的内容作为材质输出到 ItemViewport 中,通过 ItemViewport 设置的属性值和特定的功能,进行效果呈现并输出。当源控件更新状态时, ItemViewport 会监测到这种状态更新,并进行实时同步更新。 @property Item ItemViewport::sourceItem sourceItem 用于指定源控件, sourceItem 不局限于 Item 控件,可以传入 任何继承自 Item 的控件。当 sourceItem 属性发生改变时,Itemviewport 会 进行实时更新。 @property Item ItemViewport::sourceRect sourceRect 用于指定源大小,当不指定时,源大小为 sourceItem 的大小。 大多数的使用场景下可以无需指定 sourceRect @property real ItemViewport::radius radius 用于指定 Rect 的圆角大小,例如上述示例中,可通过指定 radius 属性 对某个边进行圆角处理。 @property real ItemViewport::fixed fixed 属性用于指定 ItemViewport 是否启用预加载, 当 fixed 为 true 时 将不起用任何预加载。fixed 默认为 false @property bool ItemViewport::hideSource hideSource 属性用于指定是否决定隐藏源控件(sourceItem),根据 ItemViewport 的实现原理,ItemViewport 已经将 sourceItem 画面和自身属性混合后输出。因此, ItemViewport 在多数情况下已经实现了目标效果,将 hideSource 属性指定为 true 后 则表示隐藏 sourceItem 的内容,即隐藏源控件的样式,展示 ItemViewport 的内容,即加工 后的内容。默认情况下,该属性为 false. @property DTK::CompositionMode ItemViewport::compositionMode @brief 用于控制合成时所使用的混合模式。 @details 此属性与 @sa QPainter::setCompositionMode 功能类似,请参考其文档介绍。 */ dtkdeclarative-5.7.12/docs/qml/noqml/dquickkeylistener.zh_CN.dox000066400000000000000000000035551476226662700247500ustar00rootroot00000000000000 /** @~chinese @class KeySequenceListener @ingroup QObject \keyword DQuickKeyListener @brief DTK 提供的一种快捷键监听器 KeySequenceListener 控件作为一个快捷键辅助监听器,其继承于 QObject 类型,而非 继承于 Item,因此它无法独立存在,需要跟随 Item 辅助存在。 KeySequenceListener 被用于 KeySequenceEdit 控件中进行快捷键的监听, KeySequenceEdit 控件为 DTK 封装的快捷键输入框。如对快捷键有监听需要,请优先使用 KeySequenceEdit 控件代替。 KeySequenceListener 仅作为辅助类存在,因此需要手动指定被监听的 Item 对象,并且 KeySequenceListener 的作用范围也仅会在其被监听的 Item 控件内。 \warning \b 请注意,该控件仅作为快捷键的输入管理,而非所有键位的监听。 @property Item KeySequenceListener::target @brief target 属性表示被监听的目标控件。 KeySequenceListener 会在 \c target 的 范围内监听快捷键的输入 @property list KeySequenceListener::keys @brief keys 属性表示被监听的目标控件输入的快捷键文本,当用于在目标控件焦点状态下按下了特 定的快捷键时,其会跟随用户输入发生改变。同时,可以用过设置接口传递该属性的默认值。 当传入一个格式不正确的键位字符串时,其结果是未定义地。 @property int KeySequenceListener::maxKeyCount @brief maxKeyCount 属性表示监听的最大键位数量。默认值为 4,即表示最大能监听四种不同的 快捷键键位,例如 "Ctrol" "Alt" "Shift" "A" 键位。 @fn void KeySequenceListener::learKeys() 该函数用于清空 \c keys 属性存储的当前键位。例如当用户取消键入,或状态改变需要清空@brief keys 属性的值时,该函数能够发挥很大作用。 dtkdeclarative-5.7.12/docs/qml/noqml/dquickrectangle.zh_CN.dox000066400000000000000000000052231476226662700243500ustar00rootroot00000000000000 /** @~chinese @class RoundRectangle @ingroup Item \keyword DQuickRectangle @brief DTK 提供的一种支持不同圆角功能的矩形控件 能够支持某一边或者多边圆角,而其他边保持无圆角状态的控件。该控件 是对 Qt 提供的 Rectangle 控件进行的升级。其包含了原本 Color 的 大部分属性外,同时能够支持对固定角进行圆角操作。但其不包含对边框和 边框颜色的控制。 例如一下示例代码,可以构造一个左上角和右下角的特殊矩形: @ import org.deein.dtk 1.0 RoundRectangle { width: 100 height: 100 color: "blue" radius: 20 antialiasing: true corners: (RoundRectangle.TopLeftCorner | RoundRectangle.BottomRightCorner) } ``` 其示例效果如下: @image html RoundRectangleExample.png @property color RoundRectangle::color 该属性用于指定圆角矩形填充的颜色值。和 Rectangle 控件类似,其会 根据圆角矩形的形状自由填充。 @property real RoundRectangle::radius 该属性用于指定圆角矩形的圆角大小。和 Rectangle 中该属性保持一致,其 只会作用在设置了 corners 的部分。 @property enumeration RoundRectangle::corners 该属性用于控制圆角矩形的圆角位置,支持圆角位置的叠加,例如上述示例代码。 该属性枚举包含以下值: \table \header \li 枚举值 \li 描述 \row \li RoundRectangle.NoneCorner \li 无圆角,即直角矩形。 \row \li RoundRectangle.TopLeftCorner \li 指定左上角为圆角。 \row \li RoundRectangle.TopRightCorner \li 指定右上角为圆角。 \row \li RoundRectangle.BottomLeftCorner \li 指定左下角为圆角。 \row \li RoundRectangle.BottomRightCorner \li 指定右下角为圆角。 \row \li RoundRectangle.TopCorner \li 指定矩形上部分为圆角,即左上角和右上角。 \row \li RoundRectangle.BottomCorner \li 指定矩形下部分为圆角,即左下角和右下角。 \row \li RoundRectangle.LeftCorner \li 指定矩形左边部分为圆角,即左上角和左下角。 \row \li RoundRectangle.RightCorner \li 指定矩形右边部分为圆角,即右上角和右下角。 \row \li RoundRectangle.AllCorner \li 指定矩形为全圆角矩形。 \endtable dtkdeclarative-5.7.12/docs/qml/noqml/dquicksettingcontainer.zh_CN.dox000066400000000000000000000452431476226662700257720ustar00rootroot00000000000000 /** @~chinese @class SettingsContainer @ingroup QtObject .settings \keyword DSettingsContainer @brief SettingDialog 中存放各个设置项的容器 SettingContainer 作为 SettingDialog 中放置设置信息的容器,其目的 是对配置项的数据展示和数据更新。该控件作为自定义 SettingDialog 的属 性存在,一般情况下无需自定义该类型。其内部存在多个用于控制 Config 设置 项的相关属性,能够对内部的控件样式进行调整。 @property Config org.deepin.dtk.settings::SettingsContainer::config 配置信息实例,该配置信息中的属性会直接更新到 SettingContainer 中进行数据 展示。一般情况下,该属性会被赋值为 SettingDialog 中的 \c config 属性。 \sa SettingDialog Config @property list org.deepin.dtk.settings::SettingsContainer::groups \default 配置项设置组,在 SettingContainer 中,其内部的配置属性有多个不同的设置组组成,而 设置组内部又可以存放不同的设置项和设置组,组成了一个设置树。 SettingContainer 中 该属性用于存储默认的全局设置组,内部子组和子项会展示在其子类中,其作为根元素进行展示。 @property Component org.deepin.dtk.settings::SettingsContainer::contentTitle 设置项的标题组件,即每个设置项中展示在内容区域的标题组件。默认的标题组件为 ContentTitle 其会设置项的级别,自动设置字号大小。可根据自定义场景,对该内容进行自定义样式控制。 @property Component org.deepin.dtk.settings::SettingsContainer::navigationTitle 导航栏的标题组件,即 SettingDialog 中导航栏的标题组件。 默认的标题栏为 NavigationTitle 组件。 具有高亮背景和自动根据滚动区域的位置进行高亮等功能。 @property Component org.deepin.dtk.settings::SettingsContainer::contentBackground SettingDialog 中整体内容的背景组件,默认的背景组件为 ContentBackground 组件,该组件在默认的 SettingDialog 中没做背景和颜色的实现,应用可根据场景自行覆盖。需要注意的是,当 \c contentBackground 属性设置后,其内部的子 SettingOption 及其父类的所有 SettingOption 或 SettingsGroup 都未指定@brief background 属性时,会自动 fallBack 回该 \c contentBackground 属性。 @fn void org.deepin.dtk.settings::SettingsContainer::setGroupVisible(string key, bool visible) 通过 \c key 设置 SettingsGroup 是否可见。 \c key 对应于 SettingsGroup 中的 \c key 属性。@brief visible 参数表示是否可见,true 为可见;false 为不可见。 @fn bool org.deepin.dtk.settings::SettingsContainer::groupVisible(string key) 判断 \c key 对应的 SettingsGroup 是否可见. \return 返回 true 表示可见, false 表示不可见。 @fn void org.deepin.dtk.settings::SettingsContainer::resetSettings() 重置所有设置项。重置后设置项的值将对应于 Config 中的 \c resetValue 字段。 /** @~chinese @class SettingsOption @ingroup QtObject .settings \keyword DSettingsOption @brief SettingDialog 中存放的设置项对象 SettingDialog 存放每个设置项的对象,其内部有 delegate 属性用于添加设置 项的自定义控件。除此之外,其内部存储的 \c key 属性指定该设置项对应于 Config 中的属性信息,当配置文件中该 \c key 对应的 value 发生改变时,此设置项中的值 会根据配置文件发生改变。 每个 SettingsGroup 可以存储多个 SettingOption, SettingDialog 中的每个 设置项最终由 SettingOption 展示可控制。 存放在 SettingOption 内部的 Item 可以通过附加属性的方式获取当其最上层的 SettingOption 对象,如下代码所示: @ SettingOption { key: "key1" name: "Name" CheckBox { Component.onComplete { console.log(SettingOption.name) } } } ``` @property string org.deepin.dtk.settings::SettingsOption::key @brief key 将作为设置项的唯一标识,SettingDialog 中 config 对应的配置项的@brief key 应与该值保持一致。绑定后的属性其配置发生变化后, SettingOption 的 value 会自动发生变化。 @property string org.deepin.dtk.settings::SettingsOption::name @brief name 为设置项的名称,默认情况下对应于设置项的左侧,用于指示该设置项的作用。 @property string org.deepin.dtk.settings::SettingsOption::value @brief value 为设置项对应的 Config 中的属性值,其与配置文件中的值相对应。当配置文件中@brief key 对应的 \c value 发生变化后,该值会自动跟随发生变化。 @property Component org.deepin.dtk.settings::SettingsOption::delegate \default 默认属性, \c delegate 属性用于指定需要显示次配置项的控件。例如 ComboBox、LineEdit、 RadioButton等等。 SettingDialog 提供几种默认的可以根据 SettingOption 的值自动发生变化的控件。如下表 所示: \table \header \li 控件名称 \li 控件描述 \row \li \l {CheckBox(Settings)}{CheckBox} \li 类似与 CheckBox 控件,自带名称,其值会根据配置项的值发生自动改变。 \li \l {ComboBox(Settings)}{ComboBox} \li 类似与 ComboBox 控件,自带名称,其值会根据配置项的值发生自动改变。 \li \l {LineEdit(Settings)}{LineEdit} \li 类似与 LineEdit 控件,自带名称,其值会根据配置项的值发生自动改变。 \endtable /** @~chinese @class SettingsGroup @ingroup QtObject .settings \keyword DSettingsGroup @brief SettingDialog 中存放的多个设置项的设置组 SettingsGroup 用于存放多个 SettingOption 的设置组。每个SettingsGroup 都有在 SettingDialog 的导航栏中显示,根据 SettingsGroup 的层级关系,自 动为其设置 \c level ,其 \c level 值对应于每个 SettingsGroup 的 \c name 字号以及缩进的大小。而这些样式的设置都是在 NavigationTitle 中完成样式的自动 调整。当需要进行自定义样式时,可通过调整 NavigationTitle 来达到目标效果。 SettingsGroup 可自定义背景风格,默认情况下 SettingsGroup 未指定背景, 如以下代码: @ SettingsGroup { key: "group1" name: "group1" visible: true background: ContentBackground { border.color: "red" radius: 8 } SettingsOption { key: "key2" name: "ComboBox" ComboBox { model: ["first", "second", "third"] } } } ``` SettingsGroup 存在附加属性,可在其子类中使用该附加属性获取到当前 的 SettingsGroup 对象,如下代码: @ SettingsGroup { key: "group" name: "group" visible: true SettingsOption { key: "key1" name: "CheckBox" CheckBox { text: "CheckBox" Component.onComplete: { console.log(SettingsGroup.name) } } } } ``` \sa NavigationTitle SettingsDialog SettingsOption @property string org.deepin.dtk.settings::SettingsGroup::key @brief key 属性用于标识每个 SettingsGroup,该属性与 SettingOption 中的不同, 仅作为控件的标识,可通过 SettingContainer 中的 \l {SettingsContainer::setGroupVisible}{setGroupVisible} 函数控制 \c key 对应的 SettingsGroup 是否可见。 @property string org.deepin.dtk.settings::SettingsGroup::name @brief name 属性被充当 SettingDialog 中导航栏标题,以及内容区域用于标识每个 group 的标题。其标题字号和缩进根据 SettingsGroup 的层级关系自动调整。 @property int org.deepin.dtk.settings::SettingsGroup::level \readonly @brief level 属性为只读属性,当 SettingsGroup 的层级关系指定完成后,SettingContainer 会根据其层级自动指定 \c level 。通常情况下应用无需关心 \c level , 其值将对 SettingsGroup 的标题字号和缩进产生影响。 @property bool org.deepin.dtk.settings::SettingsGroup::visible @brief visible 属性表示 SettingsGroup 是否可见。当 \c visible 指定为 false 时,其下的所有子类都会隐藏。也可通过 SettingContainer 中的 \l {SettingsContainer::setGroupVisible}{setGroupVisible} 接口 通过 \c key 值指定是否可见。 @property int org.deepin.dtk.settings::SettingsGroup::index \readonly @brief index 属性作为 SettingsGroup 添加进 SettingDialog 中导航栏和内容 中 ListView 的索引,是一个只读属性。 @property list org.deepin.dtk.settings::SettingsGroup::options \default @brief options 为默认属性,其用于存储其子类的所有 SettingOption 对象,并作为 统一层级进行显示。同一层级下的 SettingOption 将被 SettingsGroup 管理,如@brief level 将和其父类保持一致;当 SettingsGroup 隐藏时,其子类所有 SettingOption 将被隐藏。 @property list org.deepin.dtk.settings::SettingsGroup::children @brief children 属性保存 SettingsGroup 中的所有子 SettingsGroup,其子 SettingsGroup 的 level 会比当前 SettingsGroup 小一层级。 SettingsGroup 可通过指定 children 的 方式嵌套多个 SetingGroup。 /** @~chinese @class ContentBackground @ingroup Rectangle .settings @brief SettingDialog 中通用的内容背景框. ContentBackground 是 SettingDialog 中提供的专门用于控制 SettingContainer 或者 SettingsGroup 背景的控件。在设计中,SettingsGroup 默认未指定背景色,但为了 对 SettingDialog 配置项中的设置添加的更加灵活,可通过控制该对象的属性,来控制想 要实现的效果。 例如,自定义 SettingContainer 的背景颜色可通过如下代码: @ SettingDialog { height: 400 width: 680 config: settingsConfig // 特殊的 Config 对象 container.contentBackground: ContentBackground { color: "red" } } ``` 自定义 SettingsGroup 的背景可用如下代码: @ SettingsGroup { key: "group" name: "group" SettingsOption { key: "key1" name: "CheckBox" CheckBox { text: "CheckBox" } } background: ContentBackground { border.color: "red" radius: 8 } } ``` \sa SettingDialog ContentTitle /** @~chinese @class ContentTitle @ingroup Label .settings @brief SettingDialog 中通用的设置项文字控件. SettingDialog 被用于指定在 SettingContainer 中的内容标题控件。其会根据 SettingDialog 中 SettingsGroup 的层级关系,自动为每个 SettingsGroup 设置字体。默认情况下无需自定义,当存在对 字体有特殊需求时,可以通过继承 ContentTitle 类来实现。 SettingDialog 中控制 ContentTitle 样式可用如下代码: @ SettingDialog { height: 400 width: 680 config: settingsConfig // 特殊的 Config 对象 container.contentTitle: ContentTitle { color: "blue" } } ``` /** @~chinese @class NavigationTitle @ingroup Control .settings @brief SettingDialog 中导航栏处的标题控件 NavigationTitle 在 SettingDialog 中被用于展示 SettingsGroup 的 \c name 属性。 其会根据 SettingsGroup 的层级关系自动选择合适字号和缩进的文本进行展示。除此之外,它 能够根据滚动窗口当前所显示的 SettingsGroup 高亮其对应的标题。除 Control 自带的属性 外, NavigationTitle 拓展了几种属性用于默认设置或进行自定义样式。例如可通过如下代码 自定义 NavigationTitle. @ import org.deepin.dtk 1.0 import org.deepin.dtk.settings 1.0 as Setting Setting.SettingDialog { height: 400 width: 680 config: settingsConfig // 特殊的 Config 对象 container.navigationTitle: Setting.NavigationTitle { backgroundColor: Palette { normal: "red" } checkedTextColor: Palette { normal: "green" } } } ``` @property bool org.deepin.dtk.settings::NavigationTitle::checked @brief checked 状态指定 NavigationTitle 是否处于选中状态。一般情况下,其值会根据 当前 NavigationTitle 所处的 SettingsGroup 是否为当前可视状态而自动设置。 默认情况下,该值为 false. @property Palette org.deepin.dtk.settings::NavigationTitle::backgroundColor @brief backgroundColor 属性用于指定 NavigationTitle 的背景颜色,其类型为 Palette 类型,可 同时指定 light 和 dark 两种类型,以及 normal 和 hover 两种状态。 backgroundColor 颜色 仅会在 checked 为 true 是显示。默认情况下无颜色。 @property Palette org.deepin.dtk.settings::NavigationTitle::checkedTextColor @brief checkedTextColor 属性当 NavigationTitle 被选中时,文本的调色板颜色。与 backgroundColor 类似 其存在 light 和 dark 两种类型。默认情况下,该颜色为白色。 @signal void org.deepin.dtk.settings::NavigationTitle::clicked() @brief clicked 信号当 NavigationTitle 被点击时发出。 /** @~chinese @class CheckBox(Settings) @ingroup OptionDelegate .settings @brief SettingDialog 中自定义实现的 CheckBox 控件 SettingDialog 中自定义实现的 CheckBox 控件,自带了文本标题区域和 CheckBox 控件区域,是 DTK 专门 用于封装给 SettingDialog 使用的控件。其效果如下图所示: @image html SettingCheckBox.png 其控件的添加必须在一个 SettingOption 内部,当 leftVisible 设置为 true 时,会将 SettingOption 中的 name 字段作为左侧标题描述进行显示。 其使用如下所示: @ import org.deepin.dtk as Settings Settings.SettingsOption { key: "canExit" name: "CheckBox" Settings.CheckBox { leftVisible: true } } ``` /** @~chinese @class ComboBox(Settings) @ingroup OptionDelegate .settings @brief SettingDialog 中自定义实现的 ComboBox 控件 SettingDialog 中自定义实现的 ComboBox 控件,其自带左侧标题部分和右侧 ComboBox 控件部分,当开启 leftVisible 属性时, 左侧标题部分将显示。当手动切换 ComboBox 中的当前项时,其对应的 SettingOption 的属性值将跟随自动发生变化,不需要应用程序 管理这些情况。 ComboBox 能够接受外部提供的 model 数据,当提供的 model 存在自定义的 roleName 时,可通过定义 valueRole 来达到绑定 该 role 的行为。 @image html SettingComboBox.png 其使用如下所示: @ import org.deepin.dtk as Settings Settings.SettingsOption { key: "key2" name: "ComboBox" Settings.ComboBox { model: ["first", "second", "third"] } } ``` @property ComboBox org.deepin.dtk.settings::ComboBox(Settings)::impl @brief impl 属性为 \l {ComboBox(Settings)}{ComoBox} 控件真实的内部 ComboBox. 当需要手动设置 Combox 的属性时,\c impl 能够很好的解决该问题。 @property string org.deepin.dtk.settings::ComboBox(Settings)::valueRole @brief valueRole 属性表示 \l {ComboBox(Settings)}{ComoBox} 中 model 的特殊 RoleName。 当 model 设置了特殊 的 RoleName 后(例如 model 是 ListModel 时),可通过该属性获取到绑定在该 RoleName 中的自定义属性,同样也能 跟随 SettingOption 的值自动发生变化。 @property Model org.deepin.dtk.settings::ComboBox(Settings)::model @brief model 属性为 ComboBox 中对应的 model, 可通过该属性设置 impl 中的数据模型。 /** @~chinese @class LineEdit(Settings) @ingroup OptionDelegate .settings @brief SettingDialog 中自定义实现的 LineEdit 控件 SettingDialog 中自定义实现的 LineEdit 控件,左侧自带标题部分,右侧 LineEdit 部分,可通过设置 leftVisible 属性来控制左侧标题区域的显示和隐藏。当 LineEdit 完成输入后(按回车键或离开焦点),其绑定的 SettingOption 的属性 将自动跟随 LineEdit 中的值发生自动变化。 @image html SettingLineEdit.png 其使用如下所示: @ import org.deepin.dtk as Settings Settings.SettingsOption { key: "key3" name: "LineEdit" Settings.LineEdit { text: "test" } } ``` /** @~chinese @class OptionDelegate @ingroup RowLayout .settings @brief SettingDialog 中用于添加自定义控件的委托控件 OptionDelegate 是用于包装自定义应用到 SettingDialog 中的委托控件。其包含两个部分,左侧标题部分和右侧控件 内容部分。标题部分会自动选择 SettingOption 中的 name 进行填充,其 leftVisible 属性控制标题部分是否显示。 右侧控件为自定义添加到 SettingDialog 中的控件,该控件的键值的响应需要自己实现,OptionDelegate 无法感知。 例如实现一个自定义的按钮: @ Settings.SettingsOption { key: "Key2" Settings.OptionDelegate { leftVisible: false Button { Layout.fillWidth: true text: "Custom Button" } } } ``` 实现一个文本和 Switch 控件的组合控件: @ Settings.SettingsOption { key: "Key3" Settings.OptionDelegate { leftVisible: false Label { text: "Switch Button" horizontalAlignment: Qt.AlignLeft Layout.fillWidth: true } Switch { } } } ``` 实现一个带“加减”符号的输入框控件: @ Settings.SettingsOption { key: "Key6" name: "Font Size" Settings.OptionDelegate { PlusMinusSpinBox { spinBox.value: 12 Layout.alignment: Qt.AlignRight Layout.preferredWidth: 200 } } } ``` 预览效果如下图所示: @image html SettingOptionCustionWidget.png @property bool org.deepin.dtk.settings::OptionDelegate::leftVisible @brief leftVisible 属性用于表示左侧标题区域是否可见,当 \c leftVisible 为 false 时,表示仅显示右侧控件;当 \c leftVisible 为 true 时,标题区域和控件区域的间距为 20 px。 dtkdeclarative-5.7.12/docs/qml/settings/000077500000000000000000000000001476226662700201775ustar00rootroot00000000000000dtkdeclarative-5.7.12/docs/qml/settings/SettingDialog.zh_CN.dox000066400000000000000000000155641476226662700244630ustar00rootroot00000000000000 /** @~chinese @class SettingsDialog @ingroup WindowDialog .settings @brief DTK 应用统一的应用设置对话框. SettingsDialog 是 DTK 应用用于存储和设置应用信息的对话框。 SettingsDialog 中当设置项发生改变时,应用程序会收到此变化,并发生响应。通常情况下, SettingsDialog 用于存储应用的界面信息、配置信息和用户自定义信息等等。 虽然 SettingsDialog 的整体 样式保持和 DTK 风格一致,但仍提供了高度自由的接口,用于设置自定义风格的设置属性对话框。 @image html SettingsDialog.png \section1 DConfig 兼容 您需要了解 Config 的使用和配置,SettingsDialog 中存储的配置信息,将全部使用 Config 保存,根据 Config 中的已有属性,自动更新设置。同时,当用户修改 SettingsDialog 中的属性 后, Config 能够受到变化并修改内部的配置文件。这也是应用响应 SettingsDialog 中的属性 信息发生变化的方式。例如下述代码: ```qml import org.deepin.dtk Config { name: "example" // 存储配置文件的名称 property string setting1: "Setting1" // 配置文件中设置项的具体内容。 property int setting2: 0 } ``` SettingsDialog 中必须指定 Config 才能对配置项进行生效和存储,当 Config 无效时,SettingsDialog 同样也不会生效任何设置。DConfig 中的具体细节,可查阅 dtkcore 项目中的文档。 \section1 SettingsGroup, SettingsOption SettingsDialog 中设置项有内部的多个 SettingsGroup 构成,而 SettingsGroup 可以嵌套其子 SettingsGroup 和 SettingsOption,形成一个配置树,同一层级的配置,表现为同一字体和缩进大小。不同的层级,具备父子关系的 不同层级,所属关系跟随父子关系。例如一下代码示例: ```qml import QtQuick 2.0 import org.deepin.dtk 1.0 import org.deepin.dtk.settings 1.0 as Settings Settings.SettingsDialog { id: SettingsDialog width: 800 height: 600 config: Config { name: "example" // 请确保配置文件存在 property string setting1: "Setting1" // 请确保配置文件存在该属性 } groups: [ // 配置根 SettingsGroup 组,其包含多个并列的 SettingsGroup 对应关系为,根节点下的多个设置项 Settings.SettingsGroup { key: "rootKey1" name: "Basic Settings" children: [ // 配置该组下的子 SettingGroup Settings.SettingsGroup { key: "group1" name: "Custom Widget" Settings.SettingOption { key: "setting1" // 对应 Config 中的属性名 Settings.ComboBox { // Settings封装的基础控件类型 model: ["first", "second", "three"] } } } ] } ] } ``` \section1 自定义属性 SettingsDialog 中提供了多个可自定义的组件,在实现风格统一的同时,也能够帮助用户高度定制内部组件。 可定制的区域,包括 SettingsContainer(主界面容器); 导航界面视图; 内容界面视图。 SettingsContainer 中也存在可自定义的子属性: NavigationTitle(导航栏标题); ContentTitle(内容区域标题); ContentBackground(内容区域背景)。 自定义方式如下代码所示: ```qml import QtQuick 2.0 import org.deepin.dtk 1.0 import org.deepin.dtk.settings 1.0 as Settings Settings.SettingsDialog { id: SettingsDialog width: 800 height: 600 config: Config { name: "example" // 请确保配置文件存在 property string setting1: "Setting1" // 请确保配置文件存在该属性 } groups: [ // 配置根 SettingsGroup 组,其包含多个并列的 SettingsGroup 对应关系为,根节点下的多个设置项 Settings.SettingsGroup { key: "rootKey1" name: "Basic Settings" container.contentBackground: Settings.ContentBackground { border.color: "red" // 将对话框的内容区域部分添加边框 } children: [ // 配置该组下的子 SettingGroup Settings.SettingsGroup { key: "group1" name: "Custom Widget" background: Settings.ContentBackground { boder.color: "blue" // 特殊组的边框可自定义 radius: 18 } Settings.SettingOption { key: "setting1" // 对应 Config 中的属性名 Settings.ComboBox { // Settings封装的基础控件类型 model: ["first", "second", "three"] } } } ] } ] } ``` @property list org.deepin.dtk.settings::SettingsDialog::groups SettingsDialog 中的根设置组。根设置组使用 FontManager 中 t1 号字体区分。并且其缩进保持最小。 其可保存多个 SettingsGroup 或 SettingsOption。 @property Config org.deepin.dtk.settings::SettingsDialog::config config 属性存储 SettingsDialog 用于读写的配置文件,每个配置文件中的配置属性,都需要 和 SettingsDialog 中的设置项对应,才能保证当用户修改了 SettingsDialog 的属性后 配置文件能够跟随发生变化,也确保了外部通过修改配置文件中配置属性的值时,界面中的配置项 能够跟随配置文件的改变发生变化。 @property SettingsContainer org.deepin.dtk.settings::SettingsDialog::container container 属性存储 SettingDialog 中的主界面容器。默认情况下,SettingsDialog 会提供一个默认的 基于 DTK 风格的主界面容器,当应用程序需要自定义界面时,可通过设置该属性进行改变。 @property Item org.deepin.dtk.settings::SettingsDialog::navigationView navigationView 属性存储导航视图界面的控件。默认情况下,DTK 会提供一个自适应设置项层级的导航视图。 当自定义该属性时,需要考虑滚动区域和点击单项标题时内容区域的跳转问题。 @property Item org.deepin.dtk.settings::SettingsDialog::contentView contentView 内容视图存储用于放置设置项内容区域的视图控件。默认情况下,SettingsDialog 提供了一个 根据 SettingsOption 的层级关系,自动列举的视图控件。 dtkdeclarative-5.7.12/docs/snippets/000077500000000000000000000000001476226662700174135ustar00rootroot00000000000000dtkdeclarative-5.7.12/docs/snippets/dtkdeclarative_boxinsetshadow.qml000066400000000000000000000030531476226662700262360ustar00rootroot00000000000000Item { //! [0] Rectangle { id: backgroundRect color: Qt.rgba(1, 0, 0, 0.4) width: 200 height: 200 radius: 8 } BoxInsetShadow { anchors.fill: backgroundRect z: DTK.AboveOrder shadowBlur: 2 spread: 1 shadowColor: Qt.rgba(0, 0, 0) cornerRadius: backgroundRect.radius } //! [0] //! [1] Rectangle { id: backgroundRect color: Qt.rgba(1, 0, 0, 0.4) width: 200 height: 200 radius: 8 } BoxInsetShadow { anchors.fill: backgroundRect z: DTK.AboveOrder shadowBlur: 20 spread: 1 shadowColor: Qt.rgba(0, 0, 0) cornerRadius: backgroundRect.radius } //! [1] //! [2] Rectangle { id: backgroundRect color: Qt.rgba(1, 0, 0, 0.4) width: 200 height: 200 radius: 8 } BoxInsetShadow { anchors.fill: backgroundRect z: DTK.AboveOrder shadowBlur: 40 spread: 1 shadowColor: Qt.rgba(0, 0, 0) cornerRadius: backgroundRect.radius } //! [2] //! [3] Rectangle { id: backgroundRect color: Qt.rgba(1, 0, 0, 0.4) width: 200 height: 200 radius: 8 } BoxInsetShadow { anchors.fill: backgroundRect z: DTK.AboveOrder shadowBlur: 2 spread: 10 shadowColor: Qt.rgba(0, 0, 0) cornerRadius: backgroundRect.radius } //! [3] //! [4] Rectangle { id: backgroundRect color: Qt.rgba(1, 0, 0, 0.4) width: 200 height: 200 radius: 8 } BoxInsetShadow { anchors.fill: backgroundRect z: DTK.AboveOrder shadowBlur: 2 spread: 20 shadowColor: Qt.rgba(0, 0, 0) cornerRadius: backgroundRect.radius } //! [4] }dtkdeclarative-5.7.12/examples/000077500000000000000000000000001476226662700164345ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/CMakeLists.txt000066400000000000000000000003101476226662700211660ustar00rootroot00000000000000set(CHAMELEON_PATH "${PROJECT_BINARY_DIR}/plugins") add_definitions( -DCHAMELEON_PATH="${CHAMELEON_PATH}" -DQT_DEPRECATED_WARNINGS ) add_subdirectory(exhibition) add_subdirectory(qml-inspect) dtkdeclarative-5.7.12/examples/exhibition/000077500000000000000000000000001476226662700205765ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/Button.qml000066400000000000000000000447021476226662700225730ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 // 确保dtk的模块在最后被引入 import org.deepin.dtk 1.0 Column { Label { width: parent.width wrapMode: Text.WordWrap text: "按钮控件最为常用,所有类型的按钮都继承于 AbstractButton,可以为其设置文本和图标图标等内容,当使用 DCI 格式的图标时,图标的颜色可以跟随按钮的文字颜色一起改变。" horizontalAlignment: Qt.AlignHCenter } spacing: 10 readonly property int buttonMinWidth: 204 Flow { spacing: 10 width: parent.width Button { width: Math.max(implicitWidth, buttonMinWidth) text: "button" } Button { width: Math.max(implicitWidth, buttonMinWidth) ColorSelector.hovered: true ColorSelector.pressed: false ColorSelector.disabled: false text: "button hover" enabled: false } Button { width: Math.max(implicitWidth, buttonMinWidth) ColorSelector.pressed: true text: "button pressed" } Button { width: Math.max(implicitWidth, buttonMinWidth) text: "button disabled" enabled: false } // break row Item {width: parent.width; height: 1} WarningButton { width: Math.max(implicitWidth, buttonMinWidth) text: "warning" } WarningButton { width: Math.max(implicitWidth, buttonMinWidth) ColorSelector.hovered: true ColorSelector.pressed: false ColorSelector.disabled: false text: "warning hover" enabled: false } WarningButton { width: Math.max(implicitWidth, buttonMinWidth) ColorSelector.pressed: true text: "warning pressed" } WarningButton { width: Math.max(implicitWidth, buttonMinWidth) text: "warning disabled" enabled: false } // break row Item {width: parent.width; height: 1} RecommandButton { width: Math.max(implicitWidth, buttonMinWidth) text: "recommand" } RecommandButton { width: Math.max(implicitWidth, buttonMinWidth) ColorSelector.hovered: true ColorSelector.pressed: false ColorSelector.disabled: false text: "recommand hover" enabled: false } RecommandButton { width: Math.max(implicitWidth, buttonMinWidth) ColorSelector.pressed: true text: "recommand pressed" } RecommandButton { width: Math.max(implicitWidth, buttonMinWidth) text: "recommand disabled" enabled: false } // break row Item {width: parent.width; height: 1} Button { width: Math.max(implicitWidth, buttonMinWidth) text: "checked" checkable: true checked: true } Button { width: Math.max(implicitWidth, buttonMinWidth) ColorSelector.hovered: true ColorSelector.pressed: false ColorSelector.disabled: false text: "checked hover" enabled: false checked: true } Button { width: Math.max(implicitWidth, buttonMinWidth) ColorSelector.pressed: true text: "checked pressed" checked: true } Button { width: Math.max(implicitWidth, buttonMinWidth) text: "checked disabled" enabled: false checked: true } Item {width: parent.width; height: 1} Row { spacing: 10 IconButton { icon.name: "go-previous" } IconButton { icon.name: "go-next" } } Row { spacing: 30 IconButton { icon.name: "go-previous" } IconButton { icon.name: "go-next" } IconButton { icon.name: "go-up" } IconButton { icon.name: "go-down" } IconButton { icon.name: "list-add" } IconButton { icon.name: "remove" } IconButton { icon.name: "search" } } Row { spacing: 10 Switch { checked: true } Switch { } Switch { checked: true; enabled: false } Switch { enabled: false } } Item {width: parent.width; height: 1} ComboBox { model: [ "Combobox Button", "Apple", "Coconut" ] } ComboBox { textRole: "text" iconNameRole: "icon" model: ListModel { ListElement { text: "Combobox Button"; icon: "go-previous" } ListElement { text: "Apple"; icon: "go-down" } ListElement { text: "Coconut"; icon: "go-next" } } } ComboBox { width: 80 model: [ "读写", "Apple", "Coconut" ] flat: true } FloatingButton { width: 48 height: 48 icon.name: "list-add" } FloatingButton { checked: false icon { width: 12 height: 12 name: "combobox_arrow" } } Item {width: parent.width; height: 1} ActionButton { icon.name: "list-remove" } ActionButton { icon.name: "list-add" } ActionButton { icon.name: "view-close" } ActionButton { icon { name: "list-add" width: 48 height: 48 } } Row { spacing: 10 Button { width: 50 text: "复制" ColorSelector.family: Palette.CrystalColor } Button { width: 50 text: "复制" ColorSelector.family: Palette.CrystalColor ColorSelector.hovered: true ColorSelector.pressed: false ColorSelector.disabled: false } Button { width: 50 text: "复制" ColorSelector.family: Palette.CrystalColor ColorSelector.hovered: false ColorSelector.pressed: true ColorSelector.disabled: false } Button { width: 50 text: "复制" ColorSelector.family: Palette.CrystalColor checked: true } Item {width: 80; height: parent.height} Button { width: 80 text: "复制" ColorSelector.family: Palette.CrystalColor icon { name: "action_copy" width: 16 height: 16 } } Button { width: 80 text: "复制" ColorSelector.family: Palette.CrystalColor icon { name: "action_copy" width: 16 height: 16 } ColorSelector.hovered: true ColorSelector.pressed: false ColorSelector.disabled: false } Button { width: 80 text: "复制" ColorSelector.family: Palette.CrystalColor icon { name: "action_copy" width: 16 height: 16 } ColorSelector.hovered: false ColorSelector.pressed: true ColorSelector.disabled: false } Button { width: 80 text: "复制" ColorSelector.family: Palette.CrystalColor icon { name: "action_copy" width: 16 height: 16 } checked: true } } Item {width: parent.width; height: 1} Item {width: 150; height: 1} Row { spacing: 10 Button { width: 60 spacing: 0 text: "复制" ColorSelector.family: Palette.CrystalColor indicator: ButtonIndicator { color: "transparent" } } Button { width: 60 spacing: 0 text: "复制" ColorSelector.family: Palette.CrystalColor indicator: ButtonIndicator { color: "transparent" } ColorSelector.hovered: true ColorSelector.pressed: false ColorSelector.disabled: false } Button { width: 60 spacing: 0 text: "复制" ColorSelector.family: Palette.CrystalColor indicator: ButtonIndicator { color: "transparent" } ColorSelector.hovered: false ColorSelector.pressed: true ColorSelector.disabled: false } Item {width: 30; height: parent.height} RecommandButton { width: 100 text: "Recommend" ColorSelector.family: Palette.CrystalColor } RecommandButton { width: 100 text: "Recommend" ColorSelector.family: Palette.CrystalColor ColorSelector.hovered: true ColorSelector.pressed: false ColorSelector.disabled: false } RecommandButton { width: 100 text: "Recommend" ColorSelector.family: Palette.CrystalColor ColorSelector.hovered: false ColorSelector.pressed: true ColorSelector.disabled: false } RecommandButton { width: 100 text: "Recommend" ColorSelector.family: Palette.CrystalColor checked: true } } Item {width: parent.width; height: 1} CheckBox { } CheckBox { ColorSelector.hovered: true } CheckBox { ColorSelector.pressed: true } CheckBox { enabled: false } Row { spacing: 20 RadioButton { autoExclusive: false } RadioButton { autoExclusive: false ColorSelector.hovered: true } RadioButton { autoExclusive: false ColorSelector.pressed: true } RadioButton { autoExclusive: false enabled: false } } Item {width: parent.width; height: 1} CheckBox { checked: true } CheckBox { checked: true ColorSelector.hovered: true } CheckBox { checked: true ColorSelector.pressed: true } CheckBox { checked: true enabled: false } Row { spacing: 20 RadioButton { autoExclusive: false checked: true } RadioButton { autoExclusive: false checked: true ColorSelector.hovered: true } RadioButton { autoExclusive: false checked: true ColorSelector.pressed: true } RadioButton { autoExclusive: false checked: true enabled: false } } Item {width: parent.width; height: 1} CheckBox { checkState: Qt.PartiallyChecked } CheckBox { checkState: Qt.PartiallyChecked ColorSelector.hovered: true } CheckBox { checkState: Qt.PartiallyChecked ColorSelector.pressed: true } CheckBox { checkState: Qt.PartiallyChecked enabled: false } CheckBox { text: "复选按钮选项" } RadioButton { text: "单选按钮选项" } Item {width: parent.width; height: 1} Row { ActionButton { icon.name: "go-down" } Column { ButtonGroup { id: childGroup exclusive: false checkState: parentBox.checkState } CheckBox { id: parentBox text: "父级复选选项" checkState: childGroup.checkState } Repeater { model: 4 delegate: CheckBox { checked: index < 2 text: "子级复选选项" leftPadding: indicator.width ButtonGroup.group: childGroup } } } } Item {width: parent.width; height: 1} Row { spacing: 20 ToolButton { icon.name: "action_search" } ToolButton { icon.name: "action_search"; ColorSelector.hovered: true } ToolButton { icon.name: "action_search"; ColorSelector.pressed: true } ToolButton { icon.name: "action_search"; checked: true } } Item {width: 50; height: 1} Row { spacing: 20 ToolButton { icon.name: "action_newfolder" } ToolButton { icon.name: "action_newfolder"; ColorSelector.hovered: true } ToolButton { icon.name: "action_newfolder"; ColorSelector.pressed: true } ToolButton { icon.name: "action_newfolder"; checked: true } } Item {width: 50; height: 1} Row { spacing: 20 ToolButton { icon.name: "action_edit" } ToolButton { icon.name: "action_edit"; ColorSelector.hovered: true } ToolButton { icon.name: "action_edit"; ColorSelector.pressed: true } ToolButton { icon.name: "action_edit"; checked: true } } Item {width: 50; height: 1} ButtonBox { ToolButton { icon.name: "search" } ToolButton { icon.name: "search"; checked: true } ToolButton { icon.name: "search" } ToolButton { icon.name: "search" } ToolButton { icon.name: "search" } ToolButton { icon.name: "search" } } Item {width: parent.width; height: 1} Row { spacing: 20 ToolButton { icon.name: "action_copy" ;text: "复制" } ToolButton { icon.name: "action_copy" ;text: "复制"; ColorSelector.hovered: true} ToolButton { icon.name: "action_copy" ;text: "复制"; ColorSelector.pressed: true} ToolButton { icon.name: "action_copy" ;text: "复制"; checked: true} } Item {width: 50; height: 1} Row { spacing: 20 ToolButton { icon.name: "action_setting" ;text: "设置" } ToolButton { icon.name: "action_setting" ;text: "设置"; ColorSelector.hovered: true} ToolButton { icon.name: "action_setting" ;text: "设置"; ColorSelector.pressed: true} ToolButton { icon.name: "action_setting" ;text: "设置"; checked: true} } Item {width: 50; height: 1} Row { spacing: 20 ToolButton { icon.name: "action_newfolder" ;text: "文件夹" } ToolButton { icon.name: "action_newfolder" ;text: "文件夹"; ColorSelector.hovered: true} ToolButton { icon.name: "action_newfolder" ;text: "文件夹"; ColorSelector.pressed: true} ToolButton { icon.name: "action_newfolder" ;text: "文件夹"; checked: true} } Item {width: 50; height: 1} ButtonBox { ToolButton { icon.name: "action_newfolder"; text: "文件夹"; ColorSelector.hovered: true } ToolButton { icon.name: "action_copy"; text: "复制" } ToolButton { icon.name: "action_share"; text: "分享" } ToolButton { icon.name: "action_compress"; text: "压缩" } } Item {width: parent.width; height: 1} ToolButton { icon.name: "action_newfolder" indicator: ButtonIndicator { } } ToolButton { id: control icon.name: "action_newfolder" ColorSelector.hovered: true indicator: ButtonIndicator { } } ToolButton { icon.name: "action_newfolder" ColorSelector.pressed: true indicator: ButtonIndicator { } } Item {width: parent.width; height: 1} Row { spacing: 30 ButtonBox { ToolButton { checkable: true; text: "日" ; checked: true} ToolButton { checkable: true; text: "周" } ToolButton { checkable: true; text: "月" } ToolButton { checkable: true; text: "年" } } ButtonBox { ToolButton { checkable: true; width: 50; text: "日"} ToolButton { checkable: true; width: 50; text: "周"; checked: true} ToolButton { checkable: true; width: 50; text: "月" ColorSelector.hovered: true } ToolButton { checkable: true;width: 50; text: "年"} } ButtonBox { ToolButton { checkable: true; width: 50; text: "设置"} ToolButton { checkable: true; width: 100; text: "更新设置"; checked: true} } } } } dtkdeclarative-5.7.12/examples/exhibition/CMakeLists.txt000066400000000000000000000020221476226662700233320ustar00rootroot00000000000000set(BIN_NAME dtk-exhibition) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Quick QuickControls2) find_package(Dtk${DTK_VERSION_MAJOR}Core REQUIRED) find_package(Dtk${DTK_VERSION_MAJOR}Gui REQUIRED) set(CMAKE_EXE_LINKER_FLAGS "-z relro -z now -z noexecstack -pie -Wl,--as-needed") if (EnableQt5) set(QML_RCS ${CMAKE_CURRENT_LIST_DIR}/qml.qrc) endif() if (EnableQt6) set(QML_RCS ${CMAKE_CURRENT_LIST_DIR}/qml-qt6.qrc) endif() add_executable(${BIN_NAME} ${CMAKE_CURRENT_LIST_DIR}/main.cpp ${CMAKE_CURRENT_LIST_DIR}/assets.qrc ${QML_RCS} ) target_compile_options(${BIN_NAME} PRIVATE "-fpic") target_link_libraries(${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::QuickControls2 Dtk${DTK_VERSION_MAJOR}::Core Dtk${DTK_VERSION_MAJOR}::Gui ) set(EXAMPLE_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}") if (EnableQt6) set(EXAMPLE_INSTALL_DIR "${LIB_INSTALL_DIR}/dtk${PROJECT_VERSION_MAJOR}/DDeclarative") endif() install(TARGETS ${BIN_NAME} DESTINATION ${EXAMPLE_INSTALL_DIR}) dtkdeclarative-5.7.12/examples/exhibition/ColorButton.qml000066400000000000000000000013711476226662700235650ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk 1.0 Button { id: root property color color checkable: true background: Item { implicitWidth: 22 implicitHeight: 22 Rectangle { anchors { fill: parent margins: 3 } radius: width / 2 color: root.color } Rectangle { visible: root.checked anchors.fill: parent color: "transparent" radius: width / 2 border { width: 1.5 color: root.color } } } } dtkdeclarative-5.7.12/examples/exhibition/ControlGroup.qml000066400000000000000000000021561476226662700237520ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Window 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 import ".." ControlGroup { title: "磁盘" ControlGroupItem { Label { visible: true text: "test0111111111111" } Label { visible: true text: "test13333333333" } } ControlGroupItem { Rectangle { width: 100 height: 100 color: "red" border.color: "black" border.width: 5 radius: 10 } Switch { checked: true Layout.alignment: Qt.AlignHCenter } } ControlGroupItem { Rectangle { width: 100 height: 100 color: "green" border.color: "black" border.width: 5 radius: 10 } Button { width: 100 height: 100 Layout.alignment: Qt.AlignHCenter } } } dtkdeclarative-5.7.12/examples/exhibition/Dialog.qml000066400000000000000000000367771476226662700225340ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import QtQuick.Window 2.11 import org.deepin.dtk 1.0 import ".." Column { id: control Label { width: parent.width wrapMode: Text.WordWrap text: "通知类控件, 包括系统通知、应用内通知、角标等形式。" horizontalAlignment: Qt.AlignHCenter } spacing: 10 property int dialogWidth: 400 Flow { spacing: 10 width: parent.width ImageCell { source: "qrc:/assets/dialog/Notify-Light.svg" DialogWindow { width: dialogWidth icon: "music" ColumnLayout { width: parent.width Label { Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 text: "名称“XXX”已被占用,请使用其他名称" } Button { Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter Layout.bottomMargin: 10 Layout.fillWidth: true text: "确定" } } } } ImageCell { source: "qrc:/assets/dialog/Notify-withMSG-Light.svg" DialogWindow { width: dialogWidth icon: "music" ColumnLayout { width: parent.width Label { Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 text: "操作失败!" } Label { Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t7 text: "目标文件夹位于源文件夹内!" } Button { Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter Layout.bottomMargin: 10 Layout.topMargin: 10 Layout.fillWidth: true text: "确定" } } } } Item {width: parent.width; height: 1} ImageCell { source: "qrc:/assets/dialog/Authorized-Light.svg" DialogWindow { width: dialogWidth icon: "music" ColumnLayout { width: parent.width Label { Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 text: "XXXXXXXXXXXX需要管理员权限" } PasswordEdit { Layout.fillWidth: true text: "123456" } RowLayout { Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter Layout.bottomMargin: 10 Layout.topMargin: 10 Layout.fillWidth: true Button { text: "取消" Layout.preferredWidth: 175 } Item {Layout.fillWidth: true} RecommandButton { text: "授权" Layout.preferredWidth: 175 Layout.alignment: Qt.AlignRight } } } } } ImageCell { source: "qrc:/assets/dialog/Warning-Light.svg" DialogWindow { width: dialogWidth icon: "music" ColumnLayout { width: parent.width Label { Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 text: "格式化操作会清空该磁盘数据,您要继续吗?" } Label { Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t7 text: "此操作不可以恢复" } RowLayout { Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter Layout.bottomMargin: 10 Layout.topMargin: 10 Layout.fillWidth: true Button { text: "取消" Layout.preferredWidth: 175 } Item {Layout.fillWidth: true} WarningButton { text: "格式化" Layout.preferredWidth: 175 Layout.alignment: Qt.AlignRight } } } } } Item {width: parent.width; height: 1} ImageCell { source: "qrc:/assets/dialog/dialog-1.svg" DialogWindow { width: dialogWidth icon: "music" ColumnLayout { width: parent.width Label { Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 text: "XXXXXXXXXXXX需要管理员权限" } ComboBox { ColorSelector.family: Palette.CommonColor Layout.fillWidth: true model: ListModel { ListElement { iconName: "entry_voice"; device: "shule"} ListElement { iconName: "entry_voice"; device: "tmp"} } iconNameRole: "iconName" textRole: "device" } PasswordEdit { Layout.fillWidth: true text: "123456" } RowLayout { Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter Layout.bottomMargin: 10 Button { text: "取消" Layout.preferredWidth: 175 } Item {Layout.fillWidth: true} RecommandButton { text: "授权" Layout.preferredWidth: 175 Layout.alignment: Qt.AlignRight } } } } } ImageCell { source: "qrc:/assets/dialog/dialog-2.svg" DialogWindow { width: dialogWidth icon: "music" ColumnLayout { width: parent.width Label { Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 text: "XXXX正在准备" } ProgressBar { Layout.fillWidth: true } Button { Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter Layout.bottomMargin: 10 Layout.fillWidth: true text: "取消" } } } } Item {width: parent.width; height: 1} ImageCell { source: "qrc:/assets/dialog/Wifi-Connection-Light.svg" DialogWindow { width: dialogWidth icon: "music" ColumnLayout { width: parent.width Label { Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 text: "连接到隐藏网络" } ColumnLayout { spacing: 10 LineEdit { text: "deepin" Layout.fillWidth: true } ComboBox { ColorSelector.family: Palette.CommonColor Layout.fillWidth: true model: ListModel { ListElement { device: "WPA/WPA2"} ListElement { device: "tmp"} } } PasswordEdit { Layout.fillWidth: true text: "123456" } } CheckBox { text: "自动连接" checked: true } RowLayout { Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter Layout.bottomMargin: 10 Button { text: "取消" Layout.preferredWidth: 175 } Item {Layout.fillWidth: true} Button { text: "连接" Layout.preferredWidth: 175 Layout.alignment: Qt.AlignRight } } } } } ImageCell { source: "qrc:/assets/dialog/Notify-with2Buttons-Light.svg" DialogWindow { width: dialogWidth minimumHeight: 120 maximumHeight: 240 icon: "music" title: showErrorDetail ? "错误信息:": "" property bool showErrorDetail ColumnLayout { width: parent.width Label { visible: !showErrorDetail Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 text: " 这里显示简要出错信息XXXXXXXXXXX" } ScrollView { visible: showErrorDetail Layout.fillWidth: true Layout.preferredHeight: 134 TextArea { selectByMouse: true wrapMode: Text.WordWrap text: "VM Regions Near 0x100000002: --> __TEXT 000000010f96f000-0000000110085000 [ 7256K] r-x/rwx SM=COW /Applications/Adobe Illustrator CC 2018/Adobe Illustrator.app/Contents/MacOS/CEPHtmlEngine/CEPHtmlEngine.app/Contents/MacOS/CEPHtmlEngine Thread 0 Crashed:: CrBrowserMain Dispatch queue: com.apple.main-thread 0 org.chromium.ContentShell.framework 0x0000000118abe3d4 base::subtle::RefCountedThreadSafeBase::HasOneRef() const + 4 1 org.chromium.ContentShell.framework 0x0000000118abfd4e base::internal::WeakReferenceOwner::GetRef() const + 30 2 org.chromium.ContentShell.framework 0x000000011889b84c CefCopyFrameGenerator::OnCopyFrameCaptureCompletion(bool) + 92 3 org.chromium.ContentShell.framework 0x000000011889badc CefCopyFrameGenerator::CopyFromCompositingSurfaceFinishedProxy(base::WeakPtr, std::__1::unique_ptr >, gfx::Rect const&, std::__1::unique_ptr >, std::__1::unique_ptr >, bool) + 252 4 org.chromium.ContentShell.framework 0x000000011889be51 void base::internal::FunctorTraits= 3 } LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "editting" } LineEdit { width: Math.max(implicitWidth, editInputMinWidth) placeholderText: "必填" alertText: qsTr("不能为空") showAlert: true } Item {width: parent.width; height: 1} SearchEdit { width: Math.max(implicitWidth, editInputMinWidth) placeholder: "搜索" alertText: qsTr("alert tips") showAlert: text.length >= 3 } SearchEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "deepin" editting: true } SearchEdit { width: Math.max(implicitWidth, editInputMinWidth) placeholder: "showAlert" alertText: qsTr("不能包含非法字符") showAlert: true } Item {width: parent.width; height: 1} IpV4LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "192.168.0.1" } IpV4LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "192.168.0.1" } IpV4LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "192.168.0.1" alertText: qsTr("ip地址格式不正确") showAlert: true } Item {width: parent.width; height: 1} PasswordEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "123456" } PasswordEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "123456" validator: RegExpValidator { regExp: /[0-9]+/ } } PasswordEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "12345a" alertText: "密码错误" showAlert: /[^0-9]+/.test(text) } Item {width: parent.width; height: 1} LineEdit { id: keyLineEdit width: Math.max(implicitWidth, editInputMinWidth) text: "~/.ssh/ssh_keygen.key" ActionButton { anchors { right: keyLineEdit.clearButton.left rightMargin: 5 verticalCenter: parent.verticalCenter } icon.name: "entry_loadfile" onClicked: { keyFileDialog.open() } } FileDialog { id: keyFileDialog title: "Please choose a file" folder: shortcuts.home onAccepted: { keyLineEdit.text = keyFileDialog.urlToPath(keyFileDialog.fileUrl) } } } LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "~/.ssh/ssh_keygen.key" ActionButton { anchors { right: parent.clearButton.left rightMargin: 5 verticalCenter: parent.verticalCenter } icon.name: "entry_loadfile" } } LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "~/.ssh/ssh_keygen.key" alertText: "文件非法" showAlert: true ActionButton { anchors { right: parent.clearButton.left rightMargin: 5 verticalCenter: parent.verticalCenter } icon.name: "entry_loadfile" } } Item {width: parent.width; height: 1} PlusMinusSpinBox { width: Math.max(implicitWidth, editInputMinWidth) spinBox.from: 0 spinBox.to: 10 spinBox.editable: true spinBox.alertText: qsTr("Can't include 1、3、5、7、9 number") spinBox.alertDuration: 2000 // millisecond spinBox.showAlert: /[13579]+/.test(spinBox.value) } PlusMinusSpinBox { width: Math.max(implicitWidth, editInputMinWidth) spinBox.from: 0 spinBox.to: 10 spinBox.editable: true } PlusMinusSpinBox { spinBox.editable: true spinBox.alertText: "只能输入数字" spinBox.showAlert: true } Item {width: parent.width; height: 1} PlusMinusSpinBox { spinBox.editable: true Component.onCompleted: forceActiveFocus() } PlusMinusSpinBox { spinBox.editable: true resetButtonVisible: true Component.onCompleted: forceActiveFocus() } Item {width: parent.width; height: 1} SpinBox { } Row { spacing: 10 SpinBox { width: 100 from: 0 to: 23 value: 8 font.family: "DigifaceWide" font.pointSize: 44 textFromValue: function (value, locale) { return value < 10 ? "0" + Number(value) : value } } Label { text: ":" font.pointSize: 40 verticalAlignment: Text.AlignVCenter } SpinBox { width: 100 value: 24 from: 0 to: 59 font.family: "DigifaceWide" font.pointSize: 44 textFromValue: function (value, locale) { return value < 10 ? "0" + Number(value) : value } } } Item {width: parent.width; height: 1} ListModel { id: mountPointModel ListElement {device: "/home"} ListElement {device: "/tmp"} } ComboBox { editable: true model: mountPointModel } ComboBox { editable: true model: mountPointModel } ComboBox { editable: true model: mountPointModel alertText: "不能包含非法字符" showAlert: true } Item {width: parent.width; height: 1} TextArea { text: "你好,这里是多行输入框" width: Math.max(implicitWidth, editInputMinWidth) height: 144 } TextArea { text: "你好,这里是多行输入框" width: Math.max(implicitWidth, editInputMinWidth) height: 144 } } } dtkdeclarative-5.7.12/examples/exhibition/GroupTitle.qml000066400000000000000000000016031476226662700234070ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 import QtQuick 2.0 import QtQuick.Layouts 1.0 Item { property alias text: label.text signal viewSource implicitWidth: layout.implicitWidth implicitHeight: layout.implicitHeight + 20 RowLayout { id: layout anchors.fill: parent spacing: 10 Label { id: label Layout.alignment: Qt.AlignVCenter } Rectangle { id: line color: Qt.rgba(0, 0, 0, 0.08) height: 1 Layout.fillWidth: true Layout.alignment: Qt.AlignVCenter } Button { id: button text: "查看源码" Layout.alignment: Qt.AlignVCenter onClicked: viewSource() } } } dtkdeclarative-5.7.12/examples/exhibition/ImageCell.qml000066400000000000000000000021111476226662700231260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Controls 2.4 Item { id: control property alias source: image.source property real imageScale: 1 signal clicked default property alias content: loader.sourceComponent implicitWidth: childrenRect.width implicitHeight: childrenRect.height function trigger() { if (loader.item) { if (loader.item.hasOwnProperty("popup")) { loader.item.popup(control) } else if (loader.item.hasOwnProperty("open")) { loader.item.open() } else if (loader.item.hasOwnProperty("show")) { loader.item.show() } } control.clicked() } Image { id: image width: sourceSize.width * imageScale height: sourceSize.height * imageScale MouseArea { anchors.fill: parent onClicked: trigger() } Loader { id: loader } } } dtkdeclarative-5.7.12/examples/exhibition/KeySequenceEdit.qml000066400000000000000000000020631476226662700243410ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 // 确保dtk的模块在最后被引入 import org.deepin.dtk 1.0 Column { Label { width: parent.width wrapMode: Text.WordWrap text: "应用设置和控制中心部分设置快捷键的地方。" horizontalAlignment: Qt.AlignHCenter } Flow { spacing: 10 width: parent.width KeySequenceEdit { width: 504 height: 36 text: "切换键盘布局" placeholderText: "请重新输入快捷键" keys: ["CTRL", "SHIFT"] } KeySequenceEdit { width: 504 height: 36 text: "关闭窗口" placeholderText: "请重新输入快捷键" keys: ["ALT", "F4"] } KeySequenceEdit { width: 504 height: 36 text: "关闭窗口" placeholderText: "请重新输入快捷键" } } } dtkdeclarative-5.7.12/examples/exhibition/ListControl.qml000066400000000000000000000171721476226662700235750ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 Column { id: panel Label { width: parent.width wrapMode: Text.WordWrap text: "各种列表项展示,包括背景、单选复选、内容单行多行、图标。" horizontalAlignment: Qt.AlignHCenter } spacing: 10 readonly property int itemDelegateMinWidth: 204 readonly property int itemDelegateMaxWidth: 600 readonly property int itemDelegateHeight: 40 Flow { spacing: 10 width: parent.width ListView { implicitHeight: contentHeight width: itemDelegateMinWidth model: 4 delegate: ItemDelegate { text: "Nth " + index icon.name: "music" checked: index === ListView.view.count - 1 backgroundVisible: index % 2 === 0 } } ListView { id: subView implicitHeight: contentHeight width: itemDelegateMinWidth model: ListModel { ListElement { leftNode: true; } ListElement { leftNode: true; } ListElement { leftNode: true; } ListElement { leftNode: false; } } delegate: ItemDelegate { text: "Nth " + index icon.name: "music" checked: index === ListView.view.count - 1 cascadeSelected: !leftNode backgroundVisible: index % 2 === 0 Loader { active: !leftNode anchors { left: parent.right bottom: parent.bottom } sourceComponent: ListView { implicitHeight: contentHeight width: itemDelegateMinWidth model: 4 delegate: ItemDelegate { text: "Nth " + index icon.name: "music" checked: index === ListView.view.count - 1 backgroundVisible: index % 2 === 0 } } } } } Item {width: parent.width; height: 40} ListView { implicitHeight: contentHeight width: itemDelegateMinWidth model: 4 spacing: 2 delegate: ItemDelegate { text: "Nth " + index icon.name: "music" checked: index === ListView.view.count - 1 indicatorVisible: true backgroundVisible: true corners: getCornersForBackground(index, ListView.view.count) } } ListView { implicitHeight: contentHeight width: itemDelegateMinWidth model: 3 spacing: 10 delegate: ItemDelegate { text: "Nth " + index icon.name: "music" checked: index === ListView.view.count - 1 indicatorVisible: true backgroundVisible: index % 2 === 0 corners: getCornersForBackground(index, ListView.view.count) } } Item {width: parent.width; height: 40} ListModel { id: propertyModel ListElement { iconName: "music"; fileName: "fileName"; createDate: "2021.07.31 上午09:34"; fileSize: "3.6M"; fileFormat: "图像" } ListElement { iconName: "music"; fileName: "fileName"; createDate: "2021.07.31 上午09:34"; fileSize: "3.6M"; fileFormat: "图像" } ListElement { iconName: "music"; fileName: "fileName"; createDate: "2021.07.31 上午09:34"; fileSize: "3.6M"; fileFormat: "图像" } ListElement { iconName: "music"; fileName: "fileName"; createDate: "2021.07.31 上午09:34"; fileSize: "3.6M"; fileFormat: "图像" } } ListView { implicitHeight: contentHeight width: itemDelegateMaxWidth model: propertyModel delegate: ItemDelegate { width: itemDelegateMaxWidth text: fileName icon.name: iconName checked: index === ListView.view.count - 1 backgroundVisible: index % 2 === 0 contentFlow: true content: RowLayout { Label { text: createDate } Label { text: fileSize } Label { text: fileFormat; Layout.fillWidth: true } } } } ListView { implicitHeight: contentHeight width: itemDelegateMaxWidth model: propertyModel delegate: ItemDelegate { width: itemDelegateMaxWidth text: fileName icon.name: iconName checked: index === ListView.view.count - 1 backgroundVisible: index % 2 === 0 content: RowLayout { Label { text: createDate } Label { text: fileSize } Label { text: fileFormat } } } } Item {width: parent.width; height: 40} ListView { implicitHeight: contentHeight width: itemDelegateMinWidth model: 4 spacing: 10 ButtonGroup { id: singleExclusiveGroup } delegate: CheckDelegate { ButtonGroup.group: singleExclusiveGroup text: "标题" icon.name: "music" checked: index === ListView.view.count - 1 } } ListView { implicitHeight: contentHeight width: itemDelegateMinWidth model: 4 spacing: 10 delegate: CheckDelegate { text: "标题" icon.name: "music" checked: index === ListView.view.count - 1 } } Item {width: parent.width; height: 40} ListView { implicitHeight: contentHeight width: itemDelegateMinWidth model: 4 spacing: 10 ButtonGroup { id: doubleExclusiveGroup } delegate: CheckDelegate { icon.name: "music" checked: index === ListView.view.count - 1 ButtonGroup.group: doubleExclusiveGroup content: Column { Label { text: "标题" } Label { text: "描述信息" font: DTK.fontManager.t8 } Layout.fillWidth: true } } } ListView { implicitHeight: contentHeight width: itemDelegateMinWidth model: 4 spacing: 10 delegate: CheckDelegate { icon.name: "music" checked: index < ListView.view.count / 2 content: Column { Label { text: "标题" } Label { text: "描述信息" font: DTK.fontManager.t8 } Layout.fillWidth: true } } } } } dtkdeclarative-5.7.12/examples/exhibition/Mask.qml000066400000000000000000000045761476226662700222200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import QtQuick.Window 2.0 import org.deepin.dtk 1.0 Column { id: control Label { width: parent.width wrapMode: Text.WordWrap text: "用于展示异形窗口和异形控件的实现。" horizontalAlignment: Qt.AlignHCenter } spacing: 10 Flow { spacing: 30 width: parent.width // StyledArrowShapeBlur { // width: 100 // height: 200 // Label { // anchors.centerIn: parent // text: "箭头模糊控件" // } // } // Button { // text: "箭头异形窗口" // onClicked: shapeWindow1.show() // StyledArrowShapeWindow { // id: shapeWindow1 // width: 100 // height: 200 // Label { // anchors.centerIn: parent // text: "箭头异形窗口" // } // } // } Button { text: "自定义异形窗口" onClicked: shapeWindow2.show() Window { id: shapeWindow2 width: 200 height: 200 DWindow.enabled: true DWindow.enableBlurWindow: true DWindow.clipPath: Path { id: p2 property int width: shapeWindow2.width property int height: shapeWindow2.height property real r: 50 startX: 0 startY: p2.height / 2 - r PathArc { x: p2.width / 2 + p2.r y: p2.height / 2 + p2.r radiusX: p2.r + 10; radiusY: p2.r useLargeArc: true } PathArc { x: p2.width / 2 - p2.r y: p2.height / 2 - p2.r radiusX: p2.r + 10; radiusY: p2.r useLargeArc: true } } Label { anchors.centerIn: parent text: "自定义异形窗口" } } } } } dtkdeclarative-5.7.12/examples/exhibition/Menu.qml000066400000000000000000000251001476226662700222130ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQml 2.11 import org.deepin.dtk 1.0 import ".." Column { id: panel Label { width: parent.width wrapMode: Text.WordWrap text: "菜单控件,主要出现在右键,DCombobox弹出,主菜单,搜索框的补全等一些地方。带尖角的菜单有明确的指向,告诉用户这个菜单对应的是哪个地方的。" horizontalAlignment: Qt.AlignHCenter } spacing: 10 Item { visible: true width: parent.width height: 1050 ImageCell { x: 0; y: 0 source: "qrc:/assets/menu/rightclick.svg" Menu { MenuItem { text: qsTr("打开") } MenuItem { text: qsTr("在新窗口打开") } MenuItem { text: qsTr("在新标签中打开") } MenuItem { text: qsTr("以管理员身份打开") enabled : false } MenuSeparator {} MenuItem { text: qsTr("复制") } MenuSeparator {} MenuItem { text: qsTr("共享文件夹")} MenuItem { text: qsTr("创建链接")} MenuItem { text: qsTr("发送到桌面")} MenuItem { text: qsTr("在终端中打开")} Menu { title: qsTr("自定义")} MenuItem { text: qsTr("压缩")} MenuItem { text: qsTr("属性")} } } ImageCell { x: 230; y: 0 source: "qrc:/assets/menu/music.svg" Menu { MenuSeparator { text: qsTr("单曲")} MenuItem { icon.name: "folder-music-symbolic"; text: qsTr("Tomorrow-Fly By Midnight") } MenuItem { icon.name: "folder-music-symbolic"; text: qsTr("Tomorrow With You (EN]ABA)- Senpai Kondor") } MenuItem { icon.name: "folder-music-symbolic"; text: qsTr("Tomorrow will be fine. - Sodagreen") } MenuItem { icon.name: "folder-music-symbolic"; text: qsTr("CROWN - TOMORROW X TOGETHER") } MenuSeparator { text: qsTr("歌手")} MenuItem { icon.name: "music"; text: qsTr("Tomorrow - Fly By Midnight") } MenuSeparator { text: qsTr("专辑")} MenuItem { icon.name: "music"; text: qsTr("DTK-Menu-Menuitem-ICON-Right-Light") } MenuItem { icon.name: "music"; text: qsTr("CROWN - TOMORROW X TOGETHER") } } } ImageCell { x: 630; y: 0 width: 340 source: "qrc:/assets/menu/language.svg" Menu { id: searchAndArrowMenu header: SearchEdit { placeholder: qsTr("搜索") onTextChanged: { proxyModel.filterText = text proxyModel.update() } } model: ObjectModelProxy { id: proxyModel property string filterText filterAcceptsItem: function(item) { return item.text.includes(filterText) } sourceModel: searchAndArrowMenu.contentModel } maxVisibleItems: 10 MenuItem { text: qsTr("Greek(cp869)") } MenuItem { text: qsTr("Cyrillic (ISO 8859-5)") } MenuItem { text: qsTr("Cyrillic(KOI8-R)") } MenuItem { text: qsTr("Devanagari(x-mac-davanagari)") } MenuItem { text: qsTr("Gurmukhi(x-mac-gurmukhi)") } MenuItem { text: qsTr("Thai (ISO 8859-11)") } MenuItem { text: qsTr("Simplified Chinese(x-mac-sim-chinese)") } MenuItem { text: qsTr("Chinese(GBK)"); checked: true} MenuItem { text: qsTr("Chinese(GB 18030)") } MenuItem { text: qsTr("Chinese(ISO 2022-CN)") } MenuItem { text: qsTr("Simplified Chinese (GB2312)") } MenuItem { text: qsTr("Tibetan (x-mac-tibetan)") } MenuItem { text: qsTr("Central European(ISO Latin 2)") } MenuItem { text: qsTr("Central Eu 188 opx(ISO Latin 4)") } MenuItem { text: qsTr("Baltic (ISO Latin 7)") } } } ImageCell { x: 0; y: 400 source: "qrc:/assets/menu/cancle.svg" Menu { MenuItem { icon.name: "music"; text: qsTr("撤销") } MenuItem { icon.name: "music"; text: qsTr("恢复") } MenuSeparator {} MenuItem { icon.name: "music"; text: qsTr("剪切") } MenuItem { icon.name: "music"; text: qsTr("复制") } MenuItem { icon.name: "music"; text: qsTr("粘贴") } MenuItem { icon.name: "music"; text: qsTr("删除") } MenuSeparator {} MenuItem { icon.name: "music"; text: qsTr("全选") } } } ImageCell { x: 250; y: 350 source: "qrc:/assets/menu/new1.svg" Menu { Menu { title: "新建" width: 150 MenuItem { text: ("新建文件夹") } MenuItem { text: "文件" } MenuItem { text: qsTr("办公文件") } MenuItem { text: qsTr("电子表格") } MenuItem { text: qsTr("演示文档") } MenuItem { text: qsTr("文本文档") } } MenuItem { text: "排序方式" } Menu { title: "桌面显示" } MenuItem { text: "全选" } MenuItem { text: "在终端打开" } MenuSeparator {} Menu { title: "显示设置" } Menu { title: "壁纸与屏保" } } } ImageCell { x: 450; y: 350 source: "qrc:/assets/menu/new1-1.svg" } ImageCell { x: 0; y: 650 source: "qrc:/assets/menu/font.svg" Menu { id: fontMenu header: SearchEdit { placeholder: qsTr("搜索") } Instantiator { asynchronous: true model: [ "等距更纱黑体 SC", "更纱黑体 SC", "方正黑体_GBK", "方正魏碑_GBK", "方正隶书_GBK", "方正行楷_GBK", "方正细黑一_GBK", "方正楷体_GBK", ] delegate: MenuItem { } onObjectAdded: function(index, object) { object.text = model[index] object.font.family = object.text fontMenu.insertItem(index, object) } } } } ImageCell { x: 250; y: 600 source: "qrc:/assets/menu/new2.svg" Menu { id: subMenuAndCheckMenu Menu { title: "新建" } Menu { title: qsTr("排序方式") width: 150 MenuItem { autoExclusive: true; checkable: true; text: qsTr("名称"); checked: true } MenuItem { autoExclusive: true; checkable: true; text: qsTr("修改时间") } MenuItem { autoExclusive: true; checkable: true; text: qsTr("创建时间") } MenuItem { autoExclusive: true; checkable: true; text: qsTr("大小") } MenuItem { autoExclusive: true; checkable: true; text: qsTr("文件类型") } } Menu { title: "桌面显示" } MenuItem { text: "全选" } MenuItem { text: "在终端打开" } MenuSeparator {} Menu { title: "显示设置" } Menu { title: "壁纸与屏保" } } } ImageCell { x: 450; y: 600 source: "qrc:/assets/menu/new2-1.svg" } ImageCell { x: 700; y: 580 source: "qrc:/assets/menu/voice1.svg" Menu { MenuItem { checkable: true; icon.name: "music"; text: qsTr("语音记事本") } MenuItem { checkable: true; icon.name: "music"; text: qsTr("文本编辑器"); checked: true } MenuItem { checkable: true; icon.name: "music"; text: qsTr("WPS Office") } MenuSeparator {} MenuItem { text: "选择其它"} } } ImageCell { x: 700; y: 750 source: "qrc:/assets/menu/voice2.svg" Menu { MenuItem { checkable: true; icon.name: "music"; text: qsTr("语音记事本") } MenuItem { checkable: true; icon.name: "music"; text: qsTr("文本编辑器") } MenuItem { checkable: true; icon.name: "music"; text: qsTr("WPS Office") } MenuSeparator {} MenuItem { text: "选择其它"} } } ImageCell { x: 250; y: 900 source: "qrc:/assets/menu/projects1.svg" Menu { MenuItem { checkable: true; icon.name: "music"; text: qsTr("所有项") } MenuItem { checkable: true; icon.name: "music"; text: qsTr("照片")} MenuItem { checkable: true; icon.name: "music"; text: qsTr("视频") } } } ImageCell { x: 490; y: 900 source: "qrc:/assets/menu/projects2.svg" Menu { MenuItem { checkable: true; icon.name: "music"; text: qsTr("所有项") } MenuItem { checkable: true; icon.name: "music"; text: qsTr("照片"); checked: true } MenuItem { checkable: true; icon.name: "music"; text: qsTr("视频") } } } ImageCell { x: 730; y: 900 source: "qrc:/assets/menu/projects3.svg" Menu { MenuItem { display: IconLabel.IconBesideText; icon.name: "music"; text: qsTr("所有项") } MenuItem { display: IconLabel.IconBesideText; icon.name: "music"; text: qsTr("照片") } MenuItem { display: IconLabel.IconBesideText; icon.name: "music"; text: qsTr("视频") } } } } } dtkdeclarative-5.7.12/examples/exhibition/Notify.qml000066400000000000000000000220061476226662700225610ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import QtQuick.Window 2.11 import org.deepin.dtk 1.0 import ".." Column { id: control Label { width: parent.width wrapMode: Text.WordWrap text: "通知类控件, 包括系统通知、应用内通知、角标等形式。" horizontalAlignment: Qt.AlignHCenter } spacing: 10 Flow { spacing: 10 width: parent.width ImageCell { imageScale: 0.5 source: "qrc:/assets/system-notification/Temporary-SimpleInfo-Light-1.png" onClicked: DTK.sendSystemMessage("相册", "已成功导入825张照片到相册", "music") } ImageCell { imageScale: 0.5 source: "qrc:/assets/system-notification/Temporary-SimpleInfo-Light-3.png" onClicked: DTK.sendSystemMessage("相册", "已成功导入825张照片到相册", "music", ["_action", "关闭"]) } Item { width: parent.width; height: 1} ImageCell { imageScale: 0.5 source: "qrc:/assets/system-notification/Temporary-SimpleInfo-Light-2.png" onClicked: DTK.sendSystemMessage("解压缩", "压缩文件“XXXXXXXX.zip”解压失败!", "music") } ImageCell { imageScale: 0.5 source: "qrc:/assets/system-notification/Temporary-SimpleInfo-Light-4.png" onClicked: DTK.sendSystemMessage("解压缩", "压缩文件“XXXXXXXX.zip”解压失败!", "music", ["_action", "关闭"]) } Item { width: parent.width; height: 1} ImageCell { imageScale: 0.5 source: "qrc:/assets/system-notification/Temporary-MultiInfo-Light-5.png" onClicked: DTK.sendSystemMessage("舒乐", "大家好,V23设计已经进行了一段时间,附件里包含部分V23设计图,简要向大家汇报一下", "music") } ImageCell { imageScale: 0.5 source: "qrc:/assets/system-notification/Temporary-MultiInfo-Light-7.png" onClicked: DTK.sendSystemMessage("舒乐", "大家好,V23设计已经进行了一段时间,附件里包含部分V23设计图,简要向大家汇报一下", "music", ["_action", "回复", "_select", "已读"]) } Item { width: parent.width; height: 1} ImageCell { imageScale: 0.5 source: "qrc:/assets/system-notification/Temporary-MultiInfo-Light-6.png" onClicked: DTK.sendSystemMessage("舒乐", "Copyright 2014-2019 Adobe (http://www.adobe.com/), with Reserved FontName 'Source'. Source is a trademark of Adobe in the United States and/or other countries." , "music") } ImageCell { imageScale: 0.5 source: "qrc:/assets/system-notification/Temporary-MultiInfo-Light-8.png" onClicked: DTK.sendSystemMessage("舒乐", "Copyright 2014-2019 Adobe (http://www.adobe.com/), with Reserved FontName 'Source'. Source is a trademark of Adobe in the United States and/or other countries." , "music", ["_action", "回复", "_select", "已读"]) } Item { width: parent.width; height: 1} ImageCell { imageScale: 0.5 source: "qrc:/assets/system-notification/Interactive-SimpleInfo-Light-9.png" onClicked: DTK.sendSystemMessage("相册", "发送文件“UOS桌面操作系统使用说明书.pdf ”等3个文件给您,是否接收?" , "music", ["_action", "拒绝", "_select", "接收"]) } ImageCell { imageScale: 0.5 source: "qrc:/assets/system-notification/Interactive-SimpleInfo-Light-11.png" onClicked: DTK.sendSystemMessage("相册", "发送文件“UOS桌面操作系统使用说明书.pdf ”等3个文件给您,是否接收?" , "music", ["_action", "拒绝", "_select", "接收"]) } Item { width: parent.width; height: 1} ImageCell { imageScale: 0.5 source: "qrc:/assets/system-notification/Interactive-SimpleInfo-Light-10.png" onClicked: DTK.sendSystemMessage("相册", "已成功导入825张照片到相册", "music") } ImageCell { source: "qrc:/assets/popup/nointeractive.svg" onClicked: { DTK.sendMessage(control, "成功添加到"校园名谣"", "checked") } } ImageCell { source: "qrc:/assets/popup/interactive.svg" onClicked: DTK.sendMessage(Window.window, floatingMsgCom, { content: "磁盘中的原文件已被修改,是否重新载入?", iconName: "music" }, -1) } Component { id: floatingMsgCom FloatingMessage { id: floatMsg contentItem: RowLayout { anchors.fill: parent spacing: 0 Label { Layout.fillHeight: true Layout.fillWidth: true text: floatMsg.message.content verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft elide: Text.ElideRight maximumLineCount: 1 font: DTK.fontManager.t6 } Button { text: "重新载入" font: DTK.fontManager.t6 Layout.alignment: Qt.AlignVCenter Layout.preferredWidth: 92 Layout.preferredHeight: 28 } } } } Item {width: parent.width; height: 1} Row { spacing: 150 Loader { sourceComponent: appBadgeCom property int number: 1 property string appName: "deepin-app-store" } Loader { sourceComponent: appBadgeCom property int number: 99 property string appName: "deepin-browser" } Loader { sourceComponent: appBadgeCom property int number: 100 property string appName: "deepin-editor" } Loader { sourceComponent: appBadgeCom property int number: 1000 property string appName: "deepin-diskmanager" } Component { id: appBadgeCom QtIcon { name: appName sourceSize { width: 128 height: width } Label { height: 20 width: Math.max(20, implicitWidth) z: DTK.AboveOrder anchors { right: parent.right rightMargin: 4 top: parent.top topMargin: 4 } topPadding: 5 rightPadding: 7 leftPadding: 7 text: { if (number >= 0 && number < 100) { return number } else if (number >= 100 && number < 1000) { return number + "+" } return "!" } horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font: DTK.fontManager.t5 color: palette.window background: Rectangle { implicitHeight: 20 implicitWidth: 20 radius: 10 BoxShadow { anchors.fill: parent shadowBlur: 3 shadowOffsetY: 2 shadowColor: Qt.rgba(255, 113, 113, 0.3) cornerRadius: 0 } gradient: Gradient { GradientStop { position: 0.0; color: "#ff674a" } GradientStop { position: 1.0; color: "#ec5783" } } } } } } } Item {width: parent.width; height: 1} } } dtkdeclarative-5.7.12/examples/exhibition/Popup.qml000066400000000000000000001103361476226662700224200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import QtQuick.Window 2.11 import QtQml.Models 2.11 import org.deepin.dtk 1.0 import ".." Column { id: control Label { width: parent.width wrapMode: Text.WordWrap text: "弹窗类控件,包括弹出菜单、弹出窗口、对话框等。" horizontalAlignment: Qt.AlignHCenter } spacing: 10 Flow { spacing: 10 width: parent.width ImageCell { source: "qrc:/assets/popup/popup-menu-1.svg" Popup { width: 200; height: 280 ColumnLayout { width: parent.width Label { text: "勿扰模式" Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 } Switch { checked: true Layout.alignment: Qt.AlignHCenter } Label { text: { if (popupListView.currentItem.currentIndex < 0) return "" var item = popupListView.model.get(popupListView.currentItem.currentIndex) switch (item.type) { case 1: return "今晚7: 00前保持开启" } return "" } Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t7 } ListView { id: popupListView Layout.preferredHeight: contentHeight spacing: 10 model: ListModel { ListElement { type: 1; icon: "music"; text: "1小时"} ListElement { type: 2; icon: "music"; text: "直至今晚"} ListElement { type: 3; icon: "music"; text: "直至明早"} ListElement { type: 4; icon: "music"; text: "保持开启"} } delegate: ItemDelegate { width: 180 icon.name: model.icon text: model.text checked: index === 1 } } } } } ImageCell { source: "qrc:/assets/popup/popup-menu-2.svg" Popup { width: 200; height: 370 ColumnLayout { width: parent.width Label { text: "蓝牙" Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 } Switch { checked: true Layout.alignment: Qt.AlignHCenter } MenuSeparator { text: "我的设备"} ListView { Layout.preferredHeight: contentHeight Layout.preferredWidth: 180 Layout.alignment: Qt.AlignHCenter spacing: 10 model: ObjectModel { ItemDelegate {width: 180; text: "WH-1000MX3"; icon.name: "music"; checked: false } ItemDelegate {width: 180; text: "我的音响"; icon.name: "music"; checked: true } ItemDelegate {width: 180; text: "蓝牙鼠标"; icon.name: "music"; checked: false } } } MenuSeparator { text: "其它设备"} ListView { Layout.preferredHeight: contentHeight Layout.preferredWidth: 180 Layout.alignment: Qt.AlignHCenter spacing: 10 model: ObjectModel { ItemDelegate {width: 180; text: "SHULE's PC"; icon.name: "music" } ItemDelegate {width: 180; text: "打印机"; icon.name: "music" } } } } } } ImageCell { source: "qrc:/assets/popup/popup-menu-3.svg" Popup { width: 280; height: 250 ColumnLayout { width: parent.width Label { text: "声音" Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 } RowLayout { QtIcon { name: "irc-voice" } Slider { Layout.alignment: Qt.AlignHCenter highlightedPassedGroove: true Layout.fillWidth: true from: 0 to: 100 value: 50 } QtIcon { name: "irc-voice" } } MenuSeparator { text: "输出"} ListView { Layout.preferredHeight: contentHeight Layout.preferredWidth: 250 Layout.alignment: Qt.AlignHCenter spacing: 10 model: ObjectModel { ItemDelegate {width: 250; text: "扬声器"; icon.name: "music"; checked: true } ItemDelegate {width: 250; text: "WH-1000MX3"; icon.name: "music"; checked: false } ItemDelegate {width: 250; text: "声音设置"; icon.name: "music"; checked: false } } } } } } ImageCell { source: "qrc:/assets/popup/popup-menu-4.svg" Popup { width: 250; height: 530 ColumnLayout { width: parent.width Label { text: "蓝牙" Layout.alignment: Qt.AlignHCenter font: DTK.fontManager.t5 } Switch { checked: true Layout.alignment: Qt.AlignHCenter } ButtonGroup { id: networkGroup } ListModel { id: networkModel ListElement { type: 1; signalLevel: 1; text: "Uniontech"} ListElement { type: 1; signalLevel: 2; text: "TP-link_1723"} ListElement { type: 2; signalLevel: 1; text: "舒乐的热点"} ListElement { type: 2; signalLevel: 1; text: "花花小仙女WIFI"} ListElement { type: 2; signalLevel: 1; text: "有本事你来蹭啊"} ListElement { type: 2; signalLevel: 2; text: "Uniontech-M"} ListElement { type: 2; signalLevel: 2; text: "Miwifi"} ListElement { type: 2; signalLevel: 2; text: "Guest"} ListElement { type: 2; signalLevel: 2; text: "网络设置"} } MenuSeparator { text: "我的网络"} ListView { Layout.preferredHeight: contentHeight Layout.preferredWidth: 220 Layout.alignment: Qt.AlignHCenter spacing: 10 model: SortFilterModel { model: networkModel delegate: ItemDelegate { width: 220 icon.name: { if (model.signalLevel === 1) return "music" return "irc-voice" } text: model.text checked: index === 1 ButtonGroup.group: networkGroup } filterAcceptsItem: function(item) { return item.type === 1 } lessThan: null } } ItemDelegate { Layout.fillWidth: true; Layout.preferredHeight: 24; topPadding: 0 bottomPadding: 0 text: "其它网络"; icon.name: networkView.visible ? "go-up": "go-down" display: IconLabel.IconBesideText checkable: false font: DTK.fontManager.t8 MouseArea { anchors.fill: parent onClicked: { networkView.visible = !networkView.visible } } } ListView { id: networkView Layout.preferredHeight: contentHeight Layout.preferredWidth: 220 Layout.alignment: Qt.AlignHCenter spacing: 2 model: SortFilterModel { model: networkModel delegate: ItemDelegate { width: 220 icon.name: { if (model.signalLevel === 1) return "music" return "irc-voice" } text: model.text corners: getCornersForBackground(DelegateModel.visibleIndex, ListView.view.count) ButtonGroup.group: networkGroup } filterAcceptsItem: function(item) { return item.type === 2 } lessThan: null } } } } } Component { id: propertyTitleContentCom Label { anchors.centerIn: parent textFormat: Text.PlainText horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font: DTK.fontManager.t8 text: title } } ImageCell { source: "qrc:/assets/property/property-1.svg" DialogWindow { width: 280 minimumHeight: 100 maximumHeight: 1920 header: DialogTitleBar { enableInWindowBlendBlur: true content: Loader { sourceComponent: propertyTitleContentCom property string title: "uos-icons-stration.png" } } ColumnLayout { id: contentHeight anchors { horizontalCenter: parent.horizontalCenter margins: 10 } Image { source: "qrc:/assets/popup/nointeractive.svg" } PropertyItem { title: "基本信息" ColumnLayout { spacing: 1 PropertyItemDelegate { Layout.fillWidth: true title: "文件名" description: "uos-icons-demonstration.png" iconName: "action_edit" corners: RoundRectangle.TopCorner } RowLayout { Layout.fillWidth: true spacing: 1 PropertyItemDelegate { title: "大小" description: "4.23M" corners: RoundRectangle.BottomLeftCorner } PropertyItemDelegate { title: "尺寸" description: "1920X1080像素" Layout.fillWidth: true } PropertyItemDelegate { title: "图型" description: "图像" corners: RoundRectangle.BottomRightCorner } } } ColumnLayout { spacing: 1 PropertyItemDelegate { Layout.fillWidth: true title: "添加日期" description: "2014年4月23日 下午5:28" corners: RoundRectangle.TopCorner } PropertyItemDelegate { Layout.fillWidth: true title: "图型" description: "2016年8月27日 下午5:28" corners: RoundRectangle.BottomCorner } } } PropertyItem { title: "打开方式" PropertyItemDelegate { corners: RoundRectangle.AllCorner title: "默认程序" action: RowLayout { spacing: 10 DciIcon { name: "entry_voice" width: 10 height: 10 } ComboBox { Layout.preferredWidth: 100 font: DTK.fontManager.t8 model: ["GIMP编辑器", "Code"] } } } } PropertyItem { title: "权限管理" ColumnLayout { spacing: 1 RowLayout { Layout.fillWidth: true spacing: 1 PropertyItemDelegate { title: "所有者" corners: RoundRectangle.TopLeftCorner action: ComboBox { width: 70 model: ["读写", "只读"] } } PropertyItemDelegate { title: "组" Layout.fillWidth: true action: ComboBox { width: 70 model: ["读写", "只读"] } } PropertyItemDelegate { title: "其它" corners: RoundRectangle.TopRightCorner action: ComboBox { width: 70 model: ["只读", "读写"] } } } PropertyItemDelegate { Layout.fillWidth: true corners: RoundRectangle.BottomCorner action: CheckBox { text: "允许以程序运行" } } } } PropertyItem { title: "共享管理" ColumnLayout { spacing: 1 PropertyItemDelegate { Layout.fillWidth: true action: CheckBox { text: "共享此文件" } corners: RoundRectangle.TopCorner } PropertyItemDelegate { Layout.fillWidth: true title: "共享名" description: "uos-icons-demonstration.png" iconName: "action_edit" } RowLayout { Layout.fillWidth: true spacing: 1 PropertyItemDelegate { title: "组" Layout.fillWidth: true corners: RoundRectangle.BottomLeftCorner action: ComboBox { width: 100 model: ["读写", "只读"] } } PropertyItemDelegate { title: "匿名访问" corners: RoundRectangle.BottomRightCorner action: ComboBox { width: 100 model: ["不允许", "允许"] } } } } } } } } ImageCell { source: "qrc:/assets/property/property-2.svg" DialogWindow { width: 280 minimumHeight: 100 maximumHeight: 1920 header: DialogTitleBar { enableInWindowBlendBlur: true content: Loader { sourceComponent: propertyTitleContentCom property string title: "设计稿" } } ColumnLayout { id: contentHeight2 anchors { horizontalCenter: parent.horizontalCenter margins: 10 } Image { source: "qrc:/assets/popup/nointeractive.svg" } PropertyItem { title: "基本信息" ColumnLayout { spacing: 1 PropertyItemDelegate { Layout.fillWidth: true title: "文件名" description: "设计稿" iconName: "action_edit" corners: RoundRectangle.TopCorner } RowLayout { Layout.fillWidth: true spacing: 1 PropertyItemDelegate { title: "大小" description: "186.5M" corners: RoundRectangle.BottomLeftCorner } PropertyItemDelegate { title: "文件数量" description: "172项" Layout.fillWidth: true } PropertyItemDelegate { title: "类型" description: "文件夹" corners: RoundRectangle.BottomRightCorner } } } ColumnLayout { spacing: 1 PropertyItemDelegate { Layout.fillWidth: true title: "添加日期" description: "2014年4月23日 下午5:28" corners: RoundRectangle.TopCorner } PropertyItemDelegate { Layout.fillWidth: true title: "图型" description: "2016年8月27日 下午5:28" corners: RoundRectangle.BottomCorner } } } PropertyItem { title: "权限管理" ColumnLayout { spacing: 1 RowLayout { Layout.fillWidth: true spacing: 1 PropertyItemDelegate { title: "所有者" corners: RoundRectangle.TopLeftCorner action: ComboBox { width: 70 model: ["读写", "只读"] } } PropertyItemDelegate { title: "组" Layout.fillWidth: true action: ComboBox { width: 70 model: ["读写", "只读"] } } PropertyItemDelegate { title: "其它" corners: RoundRectangle.TopRightCorner action: ComboBox { width: 70 model: ["只读", "读写"] } } } PropertyItemDelegate { Layout.fillWidth: true corners: RoundRectangle.BottomCorner action: CheckBox { text: "允许以程序运行" } } } } PropertyItem { title: "共享管理" ColumnLayout { spacing: 1 PropertyItemDelegate { Layout.fillWidth: true action: CheckBox { text: "共享此文件" checked: true } corners: RoundRectangle.TopCorner } PropertyItemDelegate { Layout.fillWidth: true title: "共享名" description: "V23设计" iconName: "action_edit" } RowLayout { Layout.fillWidth: true spacing: 1 PropertyItemDelegate { title: "组" Layout.fillWidth: true corners: RoundRectangle.BottomLeftCorner action: ComboBox { width: 100 model: ["读写", "只读"] } } PropertyItemDelegate { title: "匿名访问" corners: RoundRectangle.BottomRightCorner action: ComboBox { width: 100 model: ["不允许", "允许"] } } } } } } } } Column { ImageCell { source: "qrc:/assets/property/property-3.svg" DialogWindow { width: 280 minimumHeight: 100 maximumHeight: 1920 header: DialogTitleBar { enableInWindowBlendBlur: true content: Loader { sourceComponent: propertyTitleContentCom property string title: "RO-aj8924" } } ColumnLayout { id: contentHeight3 anchors { horizontalCenter: parent.horizontalCenter margins: 10 } Image { source: "qrc:/assets/popup/nointeractive.svg" } PropertyItem { title: "基本信息" ColumnLayout { spacing: 1 PropertyItemDelegate { Layout.fillWidth: true title: "容量" description: "8G" corners: RoundRectangle.TopCorner } RowLayout { Layout.fillWidth: true spacing: 1 PropertyItemDelegate { title: "容量" description: "186.5M" corners: RoundRectangle.BottomLeftCorner } PropertyItemDelegate { title: "文件数量" description: "1235项" Layout.fillWidth: true } PropertyItemDelegate { title: "类型" description: "只读光盘" corners: RoundRectangle.BottomRightCorner } } } ColumnLayout { spacing: 1 PropertyItemDelegate { Layout.fillWidth: true title: "添加日期" description: "2014年4月23日 下午5:28" corners: RoundRectangle.TopCorner } PropertyItemDelegate { Layout.fillWidth: true title: "图型" description: "2016年8月27日 下午5:28" corners: RoundRectangle.BottomCorner } } } } } } ImageCell { source: "qrc:/assets/property/property-4.svg" DialogWindow { width: 280 minimumHeight: 100 maximumHeight: 1920 header: DialogTitleBar { enableInWindowBlendBlur: true content: Loader { sourceComponent: propertyTitleContentCom property string title: "IMG1234.jpg" } } ColumnLayout { id: contentHeight4 anchors { horizontalCenter: parent.horizontalCenter margins: 10 } Image { source: "qrc:/assets/popup/nointeractive.svg" } PropertyItem { title: "基本信息" ColumnLayout { spacing: 1 PropertyItemDelegate { Layout.fillWidth: true title: "文件名" description: "IMG1234.jpg" iconName: "action_edit" } RowLayout { Layout.fillWidth: true spacing: 1 PropertyItemDelegate { title: "光圈" description: "f2.8" } PropertyItemDelegate { title: "快门" description: "1/500s" Layout.fillWidth: true } PropertyItemDelegate { title: "ISO" description: "200" } } RowLayout { Layout.fillWidth: true spacing: 1 PropertyItemDelegate { title: "大小" description: "16.8M" corners: RoundRectangle.BottomLeftCorner } PropertyItemDelegate { title: "分辨率" description: "8000X6000" Layout.fillWidth: true } PropertyItemDelegate { title: "自平衡" description: "自动" corners: RoundRectangle.BottomRightCorner } } } ColumnLayout { spacing: 1 PropertyItemDelegate { Layout.fillWidth: true title: "拍摄日期" description: "2014年4月23日 下午5:28" corners: RoundRectangle.TopCorner } PropertyItemDelegate { Layout.fillWidth: true title: "修改日期" description: "2016年8月27日 下午5:28" corners: RoundRectangle.BottomCorner } } } PropertyItem { title: "详细信息" ColumnLayout { spacing: 1 RowLayout { Layout.fillWidth: true spacing: 1 PropertyItemDelegate { title: "曝光" description: "自动" corners: RoundRectangle.TopLeftCorner } PropertyItemDelegate { title: "曝光程序" description: "光圈优先" Layout.fillWidth: true corners: RoundRectangle.TopRightCorner } PropertyItemDelegate { title: "曝光补偿" description: "-2" } } RowLayout { Layout.fillWidth: true spacing: 1 PropertyItemDelegate { title: "焦距" description: "55mm" corners: RoundRectangle.BottomLeftCorner } PropertyItemDelegate { title: "闪光灯" description: "TTL" Layout.fillWidth: true } PropertyItemDelegate { title: "测光模式" description: "点测光" corners: RoundRectangle.BottomRightCorner } } } PropertyItemDelegate { title: "镜头型号" description: "AF-S DX VR ZOOM 19-105mm f/2 5.5 6G" corners: RoundRectangle.AllCorner } } } } } } } } dtkdeclarative-5.7.12/examples/exhibition/ProgressBar.qml000066400000000000000000000062621476226662700235500ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 Column { id: panel spacing: 20 Label { width: parent.width wrapMode: Text.WordWrap text: "类型1:可以操作的进度条,点击可以进行暂停,进度条内有文字。目前只有控制中心更新部分用了。类型2: 所有需要用到进度条的地方,这种进度条不可以操作,而是一种状态的指示,告诉用户当前完成了多少或者 使用了多少的一个比例。" horizontalAlignment: Qt.AlignHCenter } RowLayout { spacing: 40 ColumnLayout { spacing: 30 ProgressBar { from: 0 to: 100 value: 45 formatText: ("已下载 45%(点击暂停)") } ProgressBar { Layout.preferredHeight: 8 from: 0 to: 100 value: 52 } ProgressBar { Layout.preferredHeight: 18 from: 0 to: 100 value: 52 } } ColumnLayout { spacing: 30 ProgressBar { indeterminate: true formatText: ("正在准备(点击终止)") MouseArea { anchors.fill: parent onClicked: { parent.animationStop = !parent.animationStop } } } ProgressBar { from: 0 to: 100 Layout.preferredHeight: 8 indeterminate: true } ProgressBar { Layout.preferredHeight: 18 indeterminate: true } } RowLayout { Item { Layout.preferredWidth: 96 Layout.preferredHeight: 96 DciIcon { id: icon1 anchors.fill: parent name: "music" } EmbeddedProgressBar { anchors.horizontalCenter: icon1.horizontalCenter anchors.top: icon1.bottom width: 48 height: 6 from: 0 to: 100 value: 58 } } DciIcon { id: icon2 Layout.preferredWidth: 96 Layout.preferredHeight: 96 name: "music" EmbeddedProgressBar { anchors.horizontalCenter: icon2.horizontalCenter anchors.bottom: icon2.bottom anchors.bottomMargin: 12 width: 48 height: 6 from: 0 to: 100 value: 58 } } WaterProgressBar { value: 56 } } } } dtkdeclarative-5.7.12/examples/exhibition/PropertyItem.qml000066400000000000000000000022221476226662700237520ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import QtQml.Models 2.11 import org.deepin.dtk 1.0 ColumnLayout { width: 280 property string title default property alias content: itemModel.children ItemDelegate { id: titleBar Layout.fillWidth: true; Layout.preferredHeight: 24 text: title icon.name: info.visible ? "go-up": "go-down" display: IconLabel.IconBesideText checkable: false font: DTK.fontManager.t5 backgroundVisible: false MouseArea { anchors.fill: parent onClicked: { info.visible = !info.visible } } } ListView { id: info Layout.fillWidth: true Layout.preferredHeight: contentHeight spacing: 5 model: ObjectModel { id: itemModel } Component.onCompleted: { for (var i = 0; i < count; ++i) { var item = model.get(i) item.width = width } } } } dtkdeclarative-5.7.12/examples/exhibition/PropertyItemDelegate.qml000066400000000000000000000026251476226662700254140ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 Control { id: control property string title property string description property int corners: RoundRectangle.NoneCorner property string iconName signal clicked() property Component action: ActionButton { visible: control.iconName Layout.alignment: Qt.AlignRight icon { width: 14 height: 14 name: control.iconName } onClicked: control.clicked() } padding: 5 contentItem: ColumnLayout { Label { visible: control.title text: control.title font: DTK.fontManager.t10 } RowLayout { Label { visible: control.description Layout.fillWidth: true text: control.description font: DTK.fontManager.t8 elide: Text.ElideMiddle } Loader { Layout.leftMargin: 5 sourceComponent: control.action } } } background: RoundRectangle { implicitWidth: 66 implicitHeight: 40 color: Qt.rgba(0, 0, 0, 0.05) radius: Style.control.radius corners: control.corners } } dtkdeclarative-5.7.12/examples/exhibition/ScrollBar.qml000066400000000000000000000037251476226662700232030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk 1.0 Column { id: panel Label { width: parent.width wrapMode: Text.WordWrap text: "所有产生滚动的地方。" horizontalAlignment: Qt.AlignHCenter } spacing: 10 Flow { spacing: 30 width: parent.width Rectangle { border.color: "#cacaca" width: 300 height: 213 Flickable { width: 300 height: 213 contentWidth: 500 contentHeight: 500 clip: true ScrollBar.vertical: ScrollBar { } ScrollBar.horizontal: ScrollBar { } contentX: -width / 2 contentY: -height / 2 Label { text: "Normal" font: DTK.fontManager.t4 } } } Item { width: parent.width; height: 1} Rectangle { id: frame clip: true width: 1000 height: 278 border.color: "black" Rectangle { id: content width: 450 height: 1000 x: (frame.width - content.width) / 2 y: -vbar.position * content.height color: Qt.rgba(150 / 255.0, 255 / 255.0, 112 / 255.0, 0.3) Label { anchors.centerIn: parent text: "内容区域" } } ScrollBar { id: vbar orientation: Qt.Vertical size: frame.height / content.height position: 0.4 anchors.top: parent.top anchors.right: parent.right anchors.bottom: parent.bottom } } } } dtkdeclarative-5.7.12/examples/exhibition/SideBar.qml000066400000000000000000000125311476226662700226240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 import ".." Column { id: control Label { width: parent.width wrapMode: Text.WordWrap text: "侧边栏用在一些不常用的功能上,多数情况下隐藏,在需要时才展示出来。" horizontalAlignment: Qt.AlignHCenter } spacing: 10 Flow { spacing: 30 width: parent.width Pane { width: 220 height: 830 topPadding: 50 ColumnLayout { spacing: 20 ButtonGroup { id: paneListGroup } SideBarItem { title: "资料库" group: paneListGroup model: ListModel { ListElement { checked: false; icon: "music"; text: "专辑"} ListElement { checked: true; icon: "music"; text: "演唱者"} ListElement { checked: false; icon: "music"; text: "所有音乐"} ListElement { checked: false; icon: "music"; text: "我的收藏"} } } SideBarItem { id: playList title: "播放列表" group: paneListGroup action: FloatingButton { width: 20 height: 20 icon.name: "list-add" onClicked: { playList.model.append({checked: false, icon: "music", text: "自定义"}) } } model: ListModel { ListElement { checked: false; icon: "music"; text: "校园民谣"} ListElement { checked: false; icon: "music"; text: "怀旧经典音乐"} } } } background: Rectangle { implicitWidth: 220 implicitHeight: 400 border.width: 1 border.color: "#979797" color: "transparent" } } Pane { width: 220 height: 830 topPadding: 50 ColumnLayout { spacing: 20 ButtonGroup { id: paneListGroup2 } SideBarItem { title: "收藏" group: paneListGroup2 spacing: 5 itemSpacing: 5 itemFont: DTK.fontManager.t6 model: ListModel { ListElement { checked: false; icon: "music"; text: "最近访问"} ListElement { checked: true; icon: "music"; text: "主目录"} ListElement { checked: false; icon: "music"; text: "桌面"} ListElement { checked: false; icon: "music"; text: "文档"} ListElement { checked: false; icon: "music"; text: "图片"} ListElement { checked: false; icon: "music"; text: "视频"} ListElement { checked: false; icon: "music"; text: "音乐"} ListElement { checked: false; icon: "music"; text: "下载"} ListElement { checked: false; icon: "music"; text: "回收站"} } } SideBarItem { title: "磁盘" group: paneListGroup2 spacing: 5 itemSpacing: 5 itemFont: DTK.fontManager.t6 model: ListModel { ListElement { checked: false; icon: "music"; text: "计算机"} ListElement { checked: false; icon: "music"; text: "系统盘"} ListElement { checked: false; icon: "music"; text: "百度云盘"} ListElement { checked: false; icon: "music"; text: "Google Drive"} } } SideBarItem { title: "书签" group: paneListGroup2 spacing: 5 itemSpacing: 5 itemFont: DTK.fontManager.t6 model: ListModel { ListElement { checked: false; icon: "music"; text: "学习资料"} ListElement { checked: false; icon: "music"; text: "V23设计"} } } SideBarItem { title: "标签" group: paneListGroup2 spacing: 5 itemSpacing: 5 itemFont: DTK.fontManager.t6 model: ListModel { ListElement { checked: false; icon: "music"; text: "设计文稿"} ListElement { checked: false; icon: "music"; text: "V23设计"} } } } background: Rectangle { implicitWidth: 220 implicitHeight: 400 border.width: 1 border.color: "#979797" color: "transparent" } } } } dtkdeclarative-5.7.12/examples/exhibition/SideBarItem.qml000066400000000000000000000027751476226662700234540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import QtQuick.Controls 2.4 import QtQml.Models 2.11 import org.deepin.dtk 1.0 ColumnLayout { id: control property string title property alias model: model.model property alias view: info property Component action signal clicked(string key) property int itemSpacing: 20 property font itemFont: DTK.fontManager.t5 property ButtonGroup group: ButtonGroup {} width: 220 spacing: 20 RowLayout { Layout.preferredHeight: 24 Layout.preferredWidth: 200 Label { text: title font: DTK.fontManager.t5 Layout.fillWidth: true; Layout.preferredHeight: 24 } Loader { sourceComponent: control.action Layout.alignment: Qt.AlignRight } } ListView { id: info spacing: control.itemSpacing Layout.preferredHeight: contentHeight Layout.fillWidth: true model: DelegateModel { id: model delegate: ItemDelegate { width: 200 icon.name: model.icon text: model.text checked: model.checked backgroundVisible: false font: control.itemFont ButtonGroup.group: group onClicked: control.clicked(model.index) } } } } dtkdeclarative-5.7.12/examples/exhibition/Slider.qml000066400000000000000000000227061476226662700225420ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 Column { id: control Label { width: parent.width wrapMode: Text.WordWrap text: "圆角矩形滑块可以随意拖动,起止点一定是从左往右递增,滑块以左部分是活动色显示。尖角的滑块不可以像圆角矩形滑块那样进行随意拖动,底下对应的有刻度,刻度上产生吸附力,尖角也只能在几个刻度值上调整,更多强调的是用户一个值的取舍。 对应的刻度可能有刻度值显示,也可能没有刻度值(界面上的)。" horizontalAlignment: Qt.AlignHCenter } spacing: 10 property int leftAreaWidth: 300 property int rightAreaWidth: 600 function toPercent(value) { return Number(value * 100).toFixed(0) + "%" } Flow { spacing: 30 width: parent.width Slider { highlightedPassedGroove: true width: Math.max(implicitWidth, leftAreaWidth) handleType: Slider.HandleType.NoArrowHorizontal value: 0.5 } RowLayout { width: Math.max(implicitWidth, rightAreaWidth) spacing: 30 Text { text: "视图大小" } Slider { Layout.fillWidth: true highlightedPassedGroove: true handleType: Slider.HandleType.NoArrowHorizontal value: 0.5 } } Item { width: parent.width; height: 1} RowLayout { width: Math.max(implicitWidth, leftAreaWidth) spacing: 10 DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} Slider { Layout.fillWidth: true highlightedPassedGroove: true handleType: Slider.HandleType.NoArrowHorizontal value: 0.5 } DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} } ColumnLayout { width: Math.max(implicitWidth, rightAreaWidth) spacing: 30 RowLayout { Layout.preferredWidth: parent.width Text { text: "输出音量" } Label { Layout.alignment: Qt.AlignRight | Qt.AlignVCenter text: toPercent(voiceTipsSlider.value) } } RowLayout { spacing: 10 DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} Slider { id: voiceTipsSlider Layout.fillWidth: true highlightedPassedGroove: true handleType: Slider.HandleType.NoArrowHorizontal value: 0.5 } DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} } } Item { width: parent.width; height: 1} ColumnLayout { width: Math.max(implicitWidth, leftAreaWidth) height: arrwoSliders.height Slider { Layout.fillWidth: true Layout.alignment: Qt.AlignTop Layout.topMargin: 46 handleType: Slider.HandleType.ArrowBottom value: 0.5 } RowLayout { spacing: 10 Layout.alignment: Qt.AlignBottom Layout.bottomMargin: 10 DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} Slider { Layout.fillWidth: true handleType: Slider.HandleType.ArrowBottom value: 0.5 } DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} } } ColumnLayout { id: arrwoSliders width: Math.max(implicitWidth, rightAreaWidth) spacing: 20 ColumnLayout { Layout.preferredWidth: parent.width spacing: 30 Text { text: "进入睡眠" } TipsSlider { id: sleepSlider Layout.fillWidth: true tickDirection: TipsSlider.TickDirection.Back slider.handleType: Slider.HandleType.ArrowBottom slider.value: 3 slider.from: 0 slider.to: ticks.length - 1 slider.stepSize: 1 ticks: Repeater { model: ["1m", "5m", "10m", "15m", "30m", "1h", "从不"] delegate: SliderTipItem { text: modelData highlight: sleepSlider.slider.value === index } } } } ColumnLayout { Layout.preferredWidth: parent.width spacing: 30 Text { text: "双击速度" } TipsSlider { Layout.fillWidth: true tickDirection: TipsSlider.TickDirection.Back slider.handleType: Slider.HandleType.ArrowBottom slider.value: 0.5 ticks: Repeater { model: ["慢", "", "", "", "", "", "快"] delegate: SliderTipItem { text: modelData } } } } ColumnLayout { Layout.preferredWidth: parent.width spacing: 30 Text { text: "音量平衡" } RowLayout { Layout.preferredWidth: parent.width spacing: 10 DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} TipsSlider { Layout.fillWidth: true tickDirection: TipsSlider.TickDirection.Back slider.handleType: Slider.HandleType.ArrowBottom slider.value: 0.5 ticks: Repeater { model: ["", "", "", "", "", "", ""] delegate: SliderTipItem { text: modelData } } } DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} } } } Item { width: parent.width; height: 1} RowLayout { width: Math.max(implicitWidth, rightAreaWidth) Slider { highlightedPassedGroove: true Layout.preferredHeight: 300 handleType: Slider.HandleType.NoArrowVertical value: 0.5 orientation: Qt.Vertical } ColumnLayout { height: 150 spacing: 10 Layout.alignment: Qt.AlignHCenter DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16); Layout.alignment: Qt.AlignHCenter} Slider { Layout.fillHeight: true Layout.alignment: Qt.AlignHCenter highlightedPassedGroove: true handleType: Slider.HandleType.NoArrowVertical value: 0.5 orientation: Qt.Vertical } DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16); Layout.alignment: Qt.AlignHCenter} } ColumnLayout { height: 150 spacing: 10 Layout.alignment: Qt.AlignHCenter Label { text:toPercent(voiceVerticalSlider.value); Layout.alignment: Qt.AlignHCenter} Slider { id: voiceVerticalSlider Layout.fillHeight: true Layout.alignment: Qt.AlignHCenter highlightedPassedGroove: true handleType: Slider.HandleType.NoArrowVertical value: 0.5 orientation: Qt.Vertical } DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16); Layout.alignment: Qt.AlignHCenter} } //StyledArrowShapeBlur { // width: 60 // height: 250 // control: voiceVerticalSlider2 // ColumnLayout { // height: 200 // spacing: 10 // anchors { // horizontalCenter: parent.horizontalCenter // verticalCenter: parent.verticalCenter // } // Label { text:toPercent(voiceVerticalSlider2.value); Layout.alignment: Qt.AlignHCenter} // Slider { // id: voiceVerticalSlider2 // Layout.fillHeight: true // Layout.alignment: Qt.AlignHCenter // highlightedPassedGroove: true // handleType: Slider.HandleType.NoArrowVertical // value: 0.5 // orientation: Qt.Vertical // } // DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16); Layout.alignment: Qt.AlignHCenter} // } //} } } } dtkdeclarative-5.7.12/examples/exhibition/Spinner.qml000066400000000000000000000030131476226662700227240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQml 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 Column { id: panel Label { width: parent.width wrapMode: Text.WordWrap text: "所有需要用户等待的地方,且没有具体的等待时间,不知道进度,可能很快也可能需要比较久。" horizontalAlignment: Qt.AlignHCenter } spacing: 10 Flow { spacing: 10 width: parent.width RowLayout { spacing: 50 Repeater { model: [16, 32, 48, 64] delegate: BusyIndicator { running: true Layout.preferredWidth: modelData Layout.preferredHeight: modelData } } } Item { width: 100; height: 1} RowLayout { spacing: 50 Repeater { model: [16, 32, 48, 64] delegate: Rectangle { Layout.preferredWidth: modelData Layout.preferredHeight: modelData color: "#8a8a8a" BusyIndicator { anchors.fill: parent running: true fillColor: Palette { normal: ("#ffffff") } } } } } } } dtkdeclarative-5.7.12/examples/exhibition/ToolBar.qml000066400000000000000000000172101476226662700226540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Window 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 import ".." Column { id: control Label { width: parent.width wrapMode: Text.WordWrap text: "包括标题栏和普通工具栏,是要是一系列关联的动作集合。" horizontalAlignment: Qt.AlignHCenter } spacing: 10 property int leftAreaWidth: 300 property int rightAreaWidth: 600 function toPercent(value) { return Number(value * 100).toFixed(0) + "%" } Flow { spacing: 30 width: parent.width ImageCell { source: "qrc:/assets/toolbar/toolbar-1.svg" ApplicationWindow { DWindow.enabled: true flags: Qt.Window | Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint width: 1000 height: 140 header: TitleBar { icon.name: "music" leftContent: ActionButton { icon.name: "music" } content: RowLayout { anchors { left: parent.left right: parent.right leftMargin: 10 rightMargin: 10 } Row { spacing: 10 IconButton { icon.name: "arrow_ordinary_left" } IconButton { icon.name: "arrow_ordinary_right" } } SearchEdit { Layout.preferredWidth: 300 Layout.alignment: Qt.AlignRight placeholder: "搜索" } } } Rectangle { width: 800 anchors { right: parent.right top: parent.top bottom: parent.bottom } color: Qt.rgba(0, 0, 0, 0.1) } } } ImageCell { source: "qrc:/assets/toolbar/toolbar-2.svg" ApplicationWindow { DWindow.enabled: true flags: Qt.Window | Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint width: 1000 height: 140 header: TitleBar { icon.name: "music" leftContent: ActionButton { icon.name: "music" } content: Item { SearchEdit { anchors.centerIn: parent width: 300 placeholder: "搜索" } } } Rectangle { anchors.fill: parent color: Qt.rgba(0, 0, 0, 0.1) } } } ImageCell { source: "qrc:/assets/toolbar/toolbar-3.svg" ApplicationWindow { DWindow.enabled: true flags: Qt.Window | Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint width: 1000 height: 140 header: TitleBar { icon.name: "music" leftContent: ActionButton { icon.name: "music" } } Rectangle { anchors.fill: parent color: Qt.rgba(0, 0, 0, 0.1) } } } ImageCell { source: "qrc:/assets/toolbar/toolbar-4.png" imageScale: 0.5 ApplicationWindow { DWindow.enabled: true flags: Qt.Window | Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint width: 1000 height: 140 header: TitleBar { icon.name: "music" title: "Title" leftContent: ActionButton { icon.name: "music" } textColor: Palette { normal { common: Qt.rgba(1, 1, 1, 0.7) crystal: Qt.rgba(1, 1, 1, 0.9) } pressed { common: DTK.makeColor(Color.Highlight) crystal: DTK.makeColor(Color.Highlight) } } } Image { width: parent.width height: Window.height anchors.bottom: parent.bottom source: "qrc:/assets/toolbar/toolbar-4-2.png" } } } Item { width: parent.width; height: 1} FloatingPanel { contentItem: RowLayout { spacing: 10 ToolButton { icon.name: "action_newfolder"; text: "文件夹"; ColorSelector.hovered: true } ToolButton { icon.name: "action_copy"; text: "复制" } ToolButton { icon.name: "action_share"; text: "分享" } ToolButton { icon.name: "action_compress"; text: "压缩" } } } FloatingPanel { contentItem: RowLayout { spacing: 20 DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} RowLayout { spacing: 12 Slider { id: toolBarSlider property int totalValue: 7*60 + 56 property int currentValue: 3 * 60 + 25 Layout.preferredWidth: 230 highlightedPassedGroove: true handleType: Slider.HandleType.NoArrowHorizontal from: 0 to: msToValue(totalValue) value: msToValue(currentValue) stepSize: 1 function msToValue(ms) { return ms} function msToText(ms) { return String("%1:%2").arg(Math.floor(ms / 60)).arg(ms % 60) } } Text { Layout.preferredWidth: 50 text: String("%1/%2").arg(toolBarSlider.msToText(toolBarSlider.value)).arg(toolBarSlider.msToText(toolBarSlider.to)) } } DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} DciIcon { name: "entry_voice"; sourceSize: Qt.size(16, 16)} } } FloatingPanel { contentItem: RowLayout { spacing: 5 ToolButton { icon.name: "search"; ColorSelector.hovered: true } ToolButton { icon.name: "search"; checked: true } ToolButton { icon.name: "search" } ToolButton { icon.name: "search" } ToolButton { icon.name: "search" } ToolButton { icon.name: "search" } } } } } dtkdeclarative-5.7.12/examples/exhibition/ViewQMLSource.qml000066400000000000000000000035501476226662700237610ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.0 import org.deepin.dtk 1.0 ColumnLayout { property url url onUrlChanged: { edit.text = globalObject.readFile(url) } Text { id: errorMessage visible: text color: "#ff5736" font: DTK.fontManager.t6 wrapMode: Text.WrapAtWordBoundaryOrAnywhere horizontalAlignment: Qt.AlignCenter Layout.fillWidth: true } RowLayout { id: layout Layout.fillWidth: true Layout.fillHeight: true ScrollView { id: codePreview Layout.fillHeight: true Layout.preferredWidth: parent.width * 0.6 clip: true Item {id: guest;} } ScrollView { Layout.fillWidth: true Layout.fillHeight: true TextArea { id: edit property Item lastPreview: guest width: parent.width selectByMouse: true selectByKeyboard: true onTextChanged: { try { var obj = Qt.createQmlObject(edit.text, codePreview, url.toString().replace(".qml", "_temporary.qml")) globalObject.replace(lastPreview, obj) lastPreview = obj obj.width = codePreview.width errorMessage.text = "" } catch (error) { errorMessage.text = String(error.lineNumber ? error.lineNumber : "未知") + "行," + String(error.columnNumber ? error.columnNumber : "未知") + "列:" + error.message } } } } } } dtkdeclarative-5.7.12/examples/exhibition/assets.qrc000066400000000000000000000064561476226662700226220ustar00rootroot00000000000000 assets/icons/music_24px.svg assets/icons/deepin-browser_24px.svg assets/icons/deepin-app-store_24px.svg assets/icons/deepin-app-store_24px.svg assets/icons/deepin-diskmanager_24px.svg assets/menu/cancle.svg assets/menu/font.svg assets/menu/language.svg assets/menu/music.svg assets/menu/new1-1.svg assets/menu/new1.svg assets/menu/new2-1.svg assets/menu/new2.svg assets/menu/projects1.svg assets/menu/projects2.svg assets/menu/projects3.svg assets/menu/rightclick.svg assets/menu/voice2.svg assets/menu/voice1.svg assets/popup/nointeractive.svg assets/popup/interactive.svg assets/popup/popup-menu-1.svg assets/popup/popup-menu-2.svg assets/popup/popup-menu-3.svg assets/popup/popup-menu-4.svg assets/toolbar/toolbar-1.svg assets/toolbar/toolbar-2.svg assets/toolbar/toolbar-3.svg assets/toolbar/toolbar-4.png assets/toolbar/toolbar-4-2.png assets/dialog/Authorized-Light.svg assets/dialog/dialog-1.svg assets/dialog/dialog-2.svg assets/dialog/Notify-Light.svg assets/dialog/Notify-with2Buttons-Light.svg assets/dialog/Notify-withMSG-Light.svg assets/dialog/Warning-Light.svg assets/dialog/Wifi-Connection-Light.svg assets/dialog/About-Light.svg assets/property/property-1.svg assets/property/property-2.svg assets/property/property-3.svg assets/property/property-4.svg assets/system-notification/Interactive-SimpleInfo-Light-9.png assets/system-notification/Interactive-SimpleInfo-Light-10.png assets/system-notification/Interactive-SimpleInfo-Light-11.png assets/system-notification/Temporary-MultiInfo-Light-5.png assets/system-notification/Temporary-MultiInfo-Light-6.png assets/system-notification/Temporary-MultiInfo-Light-7.png assets/system-notification/Temporary-MultiInfo-Light-8.png assets/system-notification/Temporary-SimpleInfo-Light-1.png assets/system-notification/Temporary-SimpleInfo-Light-2.png assets/system-notification/Temporary-SimpleInfo-Light-3.png assets/system-notification/Temporary-SimpleInfo-Light-4.png dtkdeclarative-5.7.12/examples/exhibition/assets/000077500000000000000000000000001476226662700221005ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/assets/dialog/000077500000000000000000000000001476226662700233375ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/assets/dialog/About-Light.svg000066400000000000000000035527701476226662700262220ustar00rootroot00000000000000 DTK / Dialog / About-Light 磁盘管理 © 1995–2021 UnionTech Inc. 保留一切权利 版本 2.1 Build 1723 主页 www.uniontech.com 描述 磁盘管理器可帮助用户进行磁盘分区、空间调整、格 式化等操作。 dtkdeclarative-5.7.12/examples/exhibition/assets/dialog/Authorized-Light.svg000066400000000000000000037516421476226662700272650ustar00rootroot00000000000000 DTK / Dialog / Authorized-Light 取 消 授 权 XXXXXXXXXXXX需要管理员权限 dtkdeclarative-5.7.12/examples/exhibition/assets/dialog/Notify-Light.svg000066400000000000000000036410641476226662700264130ustar00rootroot00000000000000 DTK / Dialog / Notify-Light 确 定 名称“XXX”已被占用,请使用其他名称 dtkdeclarative-5.7.12/examples/exhibition/assets/dialog/Notify-with2Buttons-Light.svg000066400000000000000000031221001476226662700310060ustar00rootroot00000000000000 DTK / Dialog / Notify-with2Buttons-Light 这里显示简要出错信息XXXXXXXXXXX 显示详情 报告错误 dtkdeclarative-5.7.12/examples/exhibition/assets/dialog/Notify-withMSG-Light.svg000066400000000000000000036414261476226662700277350ustar00rootroot00000000000000 DTK / Dialog / Notify-withMSG-Light 确 定 操作失败! 目标文件夹位于源文件夹内! dtkdeclarative-5.7.12/examples/exhibition/assets/dialog/Warning-Light.svg000066400000000000000000035413361476226662700265510ustar00rootroot00000000000000 DTK / Dialog / Warning-Light 取 消 格式化 格式化操作会清空该磁盘数据,您要继续吗? 此操作不可以恢复 dtkdeclarative-5.7.12/examples/exhibition/assets/dialog/Wifi-Connection-Light.svg000066400000000000000000041262201476226662700301270ustar00rootroot00000000000000 DTK / Dialog / Wifi-Connection-Light 自动连接 连接到隐藏网络 取 消 连 接 WPA/WPA2 deepin dtkdeclarative-5.7.12/examples/exhibition/assets/dialog/dialog-1.svg000066400000000000000000076001641476226662700254730ustar00rootroot00000000000000 对话框-12 取 消 授 权 XXXXXXXXXXXX需要管理员权限 shule dtkdeclarative-5.7.12/examples/exhibition/assets/dialog/dialog-2.svg000066400000000000000000040774761476226662700255070ustar00rootroot00000000000000 对话框-12 取 消 XXXX正在准备 dtkdeclarative-5.7.12/examples/exhibition/assets/icons/000077500000000000000000000000001476226662700232135ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/assets/icons/deepin-app-store_24px.svg000066400000000000000000000105231476226662700277660ustar00rootroot00000000000000 dtkdeclarative-5.7.12/examples/exhibition/assets/icons/deepin-browser_24px.svg000066400000000000000000000107241476226662700275420ustar00rootroot00000000000000 dtkdeclarative-5.7.12/examples/exhibition/assets/icons/deepin-diskmanager_24px.svg000066400000000000000000000367171476226662700303560ustar00rootroot00000000000000 dtkdeclarative-5.7.12/examples/exhibition/assets/icons/deepin-editor_24px.svg000066400000000000000000000056041476226662700273460ustar00rootroot00000000000000 dtkdeclarative-5.7.12/examples/exhibition/assets/icons/music_24px.svg000066400000000000000000000172621476226662700257410ustar00rootroot00000000000000 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/000077500000000000000000000000001476226662700230445ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/assets/menu/cancle.svg000066400000000000000000000351771476226662700250270ustar00rootroot00000000000000 菜单 3 全选 删除 粘贴 复制 剪切 恢复 撤销 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/font.svg000066400000000000000000000225461476226662700245440ustar00rootroot00000000000000 编组 搜索 Trebuchet MS Source Han Sans CN Impact HanziPen SC FZLanTingHei-DB-GBK Futura DIN Alternate Chalkboard dtkdeclarative-5.7.12/examples/exhibition/assets/menu/language.svg000066400000000000000000000352741476226662700253630ustar00rootroot00000000000000 菜单 3 Baltic (ISO Latin 7) Central European (ISO Latin 4) Central European (ISO Latin 2) Tibetan (x-mac-tibetan) Simplified Chinese(GB2312) Chinese (ISO 2022-CN) Chinese (GB 18030) Chinese (GBK) Simplified Chinese (x-mac-sim-chinese) Thai (ISO 8859-11) Gurmukhi (x-mac-gurmukhi) Devanagari (x-mac-davanagari) Cyrillic (KOI8-R) Cyrillic (ISO 8859-5) Greek (cp869) 搜索 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/music.svg000066400000000000000000000357771476226662700247300ustar00rootroot00000000000000 菜单 3 CROWN - TOMORROW X TOGETHER CROWN - TOMORROW X TOGETHER Tomorrow will be fine. - Sodagreen Tomorrow will be fine. - Sodagreen Tomorrow With You (EN]ABA)- Senpai Kondor Tomorrow - Fly By Midnight Tomorrow - Fly By Midnight 单曲 歌手 专辑 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/new1-1.svg000066400000000000000000000121041476226662700245730ustar00rootroot00000000000000 菜单 3 文本文档 演示文档 电子表格 新建文件夹 办公文档 文件 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/new1.svg000066400000000000000000000267221476226662700244500ustar00rootroot00000000000000 菜单 3 壁纸与屏保 显示设置 在终端中打开 全选 排序方式 显示 新建 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/new2-1.svg000066400000000000000000000165411476226662700246050ustar00rootroot00000000000000 菜单 3 创建时间 文件类型 大小 名称 修改时间 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/new2.svg000066400000000000000000000233351476226662700244460ustar00rootroot00000000000000 菜单 3 壁纸与屏保 显示设置 在终端中打开 全选 排序方式 桌面显示 新建 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/projects1.svg000066400000000000000000000153561476226662700255110ustar00rootroot00000000000000 菜单 3 视频 照片 所有项目 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/projects2.svg000066400000000000000000000171341476226662700255060ustar00rootroot00000000000000 菜单 3 视频 照片 所有项目 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/projects3.svg000066400000000000000000000171371476226662700255120ustar00rootroot00000000000000 菜单 3 视频 照片 所有项目 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/rightclick.svg000066400000000000000000000260131476226662700257120ustar00rootroot00000000000000 菜单 3 自定义 属性 压缩 在终端中打开 发送到桌面 创建链接 共享文件夹 复制 以管理员身份打开 在新标签中打开 在新窗口打开 打开 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/voice1.svg000066400000000000000000123222151476226662700247630ustar00rootroot00000000000000 菜单 3 选择其他 WPS Office 文本编辑器 语音记事本 dtkdeclarative-5.7.12/examples/exhibition/assets/menu/voice2.svg000066400000000000000000123204151476226662700247640ustar00rootroot00000000000000 菜单 3 选择其他 WPS Office 文本编辑器 语音记事本 dtkdeclarative-5.7.12/examples/exhibition/assets/popup/000077500000000000000000000000001476226662700232435ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/assets/popup/interactive.svg000066400000000000000000000143661476226662700263130ustar00rootroot00000000000000 DTK / Notify / Built-In-Notification / Interactive-Light 重新载入 磁盘中的原文件已被修改,是否重新载入? dtkdeclarative-5.7.12/examples/exhibition/assets/popup/nointeractive.svg000066400000000000000000000067461476226662700266530ustar00rootroot00000000000000 DTK / Notify / Built-In-Notification / No-Interactive-Light 成功添加到"校园名谣" dtkdeclarative-5.7.12/examples/exhibition/assets/popup/popup-menu-1.svg000066400000000000000000000377351476226662700262460ustar00rootroot00000000000000 Popup/Switch_Menu/Light 1个小时 今晚7:00前保持开启 直至今晚 直至明早 保持开启 勿扰模式 dtkdeclarative-5.7.12/examples/exhibition/assets/popup/popup-menu-2.svg000066400000000000000000000400401476226662700262260ustar00rootroot00000000000000 勿扰模式 WH-1000MX3 我的设备 其他设备 我的音箱 打印机 SHULE's PC 蓝牙鼠标 蓝牙 dtkdeclarative-5.7.12/examples/exhibition/assets/popup/popup-menu-3.svg000066400000000000000000000426231476226662700262400ustar00rootroot00000000000000 声音 WH-1000MX3 输出 声音设置 扬声器 声音 dtkdeclarative-5.7.12/examples/exhibition/assets/popup/popup-menu-4.svg000066400000000000000000001002271476226662700262340ustar00rootroot00000000000000 勿扰模式 Uniontech 我的网络 其他网络 TP-link_1723 网络设置 舒乐的热点 Guest Miwifi Uniontech-M 有本事你来蹭啊 花花小仙女WIFI 无线网络 dtkdeclarative-5.7.12/examples/exhibition/assets/property/000077500000000000000000000000001476226662700237645ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/assets/property/property-1.svg000066400000000000000000031701131476226662700265350ustar00rootroot00000000000000 文件信息 XXX 照片 壁纸 标签 读写 所有者 读写 其他 只读 权限管理 允许以程序执行 读写 匿名访问 不允许 共享名 uos-icons-demonstration.png 共享此文件 共享管理 GIMP编辑器 默认程序 打开方式 文件名 uos-icons-demonstration.png 基本信息 尺寸 1920X1080像素 大小 4.23M 类型 图像 添加日期 2014年4月23日 下午5:28 修改日期 2016年8月27日 上午9:37 uos-icons-…stration.png dtkdeclarative-5.7.12/examples/exhibition/assets/property/property-2.svg000066400000000000000000036235771476226662700265570ustar00rootroot00000000000000 文件信息 点击添加文字标签 标签 读写 所有者 读写 其他 只读 权限管理 允许以程序执行 读写 匿名访问 不允许 共享名 V23设计 共享此文件夹 共享管理 文件名 设计稿 基本信息 文件数量 172项 大小 186.5M 类型 文件夹 添加日期 2021年5月31日 下午3:27 修改日期 2021年6月2日 上午9:37 设计稿 dtkdeclarative-5.7.12/examples/exhibition/assets/property/property-3.svg000066400000000000000000001031161476226662700265330ustar00rootroot00000000000000 文件信息 容量 8G 基本信息 文件数量 1235项 容量 186.5M 类型 只读光盘 添加日期 2021年5月31日 下午3:27 修改日期 2021年6月2日 上午9:37 RO-aj8924 dtkdeclarative-5.7.12/examples/exhibition/assets/property/property-4.svg000066400000000000000000000563771476226662700265540ustar00rootroot00000000000000 文件信息 文件名 IMG1234.jpg 基本信息 快门 1/500s 光圈 f2.8 ISO 200 分辨率 8000X6000 大小 16.8M 白平衡 自动 拍摄日期 2021年5月31日 下午3:27 修改日期 2021年6月2日 上午9:37 镜头型号 AF-S DX VR ZOOM... 19-105mm f/2 5.5 6G 曝光程序 光圈优先 曝光 自动 曝光补偿 -2 闪光灯 TTL 焦距 55mm 测光模式 点测光 详细信息 IMG1234.jpg dtkdeclarative-5.7.12/examples/exhibition/assets/system-notification/000077500000000000000000000000001476226662700261105ustar00rootroot00000000000000Interactive-SimpleInfo-Light-10.png000066400000000000000000001666231476226662700343600ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/assets/system-notificationPNG  IHDRfjM2sRGBDeXIfMM*ifA=h@IDATx$Gu?\7E]ҝtp h% C ؀m0768| lA$!H!.m~5gzfg^Is^_wUwVJ     PXt)kNA@A@A@G=p.d>WJp\BA@A@S q,@@0S(   0<3'k!Nl` ^jA@A@A@SqޤhJ0DJA@A@A@8o A@A@A@ SYs*9&N.YOł   @NΚXm1   A`E:jVbg1TA@A@A@ +I+ wE    XNXv;k>`E   XR4a]6]n.M8rA@A@s ,GSؼlr`/;SCE"cA@A@AF`85z\}b> ( A@A@A@Ȏ;7i`CݰNއծ1) F)@A@A@A@N!0D`03,2,WBA@A@A`y!0t!ohp رW@    pj 04%{qG0ذT\    t"NVm_jRUv ~}   0,d~.Y{j"Tzm_\ζ|A@A@A@A`&k,gۭfΥ|/Xs\[6|YD   ;@e9Eo)tS{_uws00LA@A@@_')A ֗d}~N\}PzLB_҂    vP:']W~M%kR2A@s'%B&   #}q 4=Ҵr~yO/O4@A@A@A@']o(z)~L!xikdKnNfR7m   È@./&SvƲjkޓ"Ce?[v`8;NA@A@@֕<~6<'y(~ܼ٘xSG҂   !ۤ?D}޲&K.#<'y [F?Sfxf=YzA@A@A@8e#lyۓנB՚G}뭷/~ { Ʀ4Յeg1?ٵkW诜qƙ>X qBb B0a`0Me #I,3<%*A@C}H3*A /8 tōo7偟IIrdϞ=_~3ur`ޢAc'*WP 3%CVUG>Zi($@+:[D_!1&"~ŌOC<9 б_V<*-$z 責0`u V˄`%Icb5X j }^2(A L>0stA@>h٨q[,j hesi0}:[>#G|N"3OLd7Yu2_^q&<ݻɫqӋnx*q4f֭ům*Kк$!ԑ\O94EXGb)"AǍ)WgaQSLrnCGoT"#&\u/%a;" [_ӑ2ʄVS/9u$>ovLAC)Gɩwłp @ݹbgYe3/(ʙa8T 6]./L'KV fye]}qT gܸ /%Τ)Q7<4EwV,Yhq Vʨ뮹w+JvO0LSs|bfw1\%s$B,3|2K\>7Ptv]A+@q Ȭ&VaBھ"7!\W$, Ће/xK( @߳lsV^24 08ܮ`aǬ'tpGoK/nV!CPZe7Tk&O4 YygK|ͦM -̠K8ٰr]`R5r&u0\ 3!}{ dι;fBMG dt=.LYc`Cw8fFT  zư"YɳJA`IH3;׭ K_#9,3. t$ѱaÇbǎowi&v'o:67\7^xM9ݤSJߍa<ʛ>  _+Lx(7:C\cƱ7Ky ^t6cƧS3b?84юJdfMz\quڬ%:fR7<2bDH +z^ʶmNdWa;!ܩ=ϸAuu̾&K4h깎e@Ѐ64X?a 2ӏ TЀ9-+J|2y{I9>+}/`^tfMKΦy2~?or|InoLxCA2-y0.|+\1:}h 68r͜^%fRSS)L΅IؾD_eZi c6ݳ8Ep?Mo<:1*y pj"@cɩ!i;(|\!PbF=6w3j>QdOY r df \eI6%k1|Jc[ZYf'ACg'>sΘ!M@fZڲS-IVG/ oZ4t6޾s^+JSh,{c@ls:.KĒ!*48"M:fpiNpSkqh H<8fJz!5U'3â8m%XM+Ҧ2 0I鶴AmY~,V )%XWs,%_&x{/j"̗nЧՑDE,؟ir9fPNΙirμuΘۚPHCVVR/qZ{ln@ià^zї7 -hh)*/o|wR`{/51u0W7 9mi]g օ:MMS Sb24¤ _Oy2*  8e@b}n,2PI-Hňbb+-A9gD'"2 U3G;%.ı?WY, g%5}J[4^IIho/W:X.0T%&r5Ng͚{՗ O|i@GTse ]se]$Lo;cRY^7DE1by(   CR|*$rfmCGSI;h4mmKt6lx_cnTH$&ճ\Х ilYrr˧5(-]u'-_$20y?##7:MdoVC!zL2 8bu؍9=IAb]}mJ<~ sS R sAw]*!>g;uW }"^HW x <$K+#RTP 6cCv(pzl|MDҶD[F&kǥv\88.$ٜTihoe'ITg&}Z{LQiy%sΕ)3^ņ%J呈Ĥ{ANJ]n-/tN8W:>ҙAr2ױWLz3KOqmSY4!TX/Jg,(v\nΗ8SLQzAWhUD&~ bA@.#xO3mӥF/--ȓ`;Ȍ2h %Uf$牃CyB#o߾ڵTsfp BquIZx|I+ˤǖ&?gN#4ݼiICGznݺ|R^v .&ԔAE0,e@Eΐ愙VINV:  y#tq}mAV ~cq!}*GB•v"+TdLw E~A痧߮*'R,_A_ádj^ԴЦ}Zc!8eےyЂ1iRȍl"FʰyKVuQy|a4tw^3W0infqzL:3 ɟNf*&ɐntIE~.?rXjt Eg^'f8u#-B#ĥўڀl. бa~rυ%P]s :c%ēnPxiؒ\jTv8K1θaȤ׏*~CS[N2lQ }3〉C\Mm"ߦeaڴLWO2Raauav2=1,Y2a-fs/;c& MqXA}idIzmn:pPRn`$t[, 6s*ծZ%܂ NA`}HnCYn1-1PwԤs@}l01}@T*'?xr|*0 Qm=EZ9I2XwcL)Ca yؔ$#>ؾ튈y 8\\xh8|/ G!<|  $h=L0 eJlAIn"7׾j(  @W ~0uve0 O0Q1,Eg8iǘt5=YӴg DixAm۶ŕ=>k9Fq}8idiWʴqtyױҦM\4q,<9 F FCJ#[ʑGF+ozki8*>Y/q,7F޴#?+Ϣ2a6=sEW(ۣWzi麥g\vK.@7!/_/banޔSϒ_bY#R QN}Jd mA8=gOW|@uar62=m$ymu傦 O /CXH I㮚q{{>?!Z̅G(\ʡ&Q[(yK^;u3KHCDUU29wyk-,lsl+6Cf]XЦw"Tvr!L=q֭=XԶݻwȭOZx#veaa!pao޼ S9rai)Qsʴ#<6": YYxlLIټfٍ/FE(ęTVشb&/O®W=xYnR},kIrETQz6ˢ; AMź@:t8P~G"X+s\)V}l2 l.}SJ=j@rQ/jj u8;iڙ%$ac; nvjT 4ik;!2! L+TaܹhDhK:4U0-hW'V-r4UaNF~tn9b MIq~FKըGk56m+ny!2#`y)e)86ux4fMnҖaA`d5".FzЦn"aJ$MڈDoG<8ł@ U<^3\~(!fKYeXʙώXN]x)3%mHCG.>,s҅X\x86K]^l*YR.eU\"%HNk y]nP`ixyHb)-VJ,5Z}MS/G 06)6|fVV{UQQ[JuBKS4ܦ5=0v_=Zzjժvl-b5kִ˄_hs &1f DvǕMǰR݇zi'?d{! pj#/҈B$R/@x<-Qjuk׵zazf0:J Oz5;3SѪիW`ZC e7O: "X#,ɥ"UJD jƒTЮm{WЭ4FiI/ރ Ƴns{oʧĎo# |1O|F˲+C;/~bsޝЌpz2Xv(ۿxOuUq#Wn~M"Q <0s#H.\} a&ےV(ZVI&]VZ7s cDÆ9UU0Zk9vG!޷”eig[[%Eв8U0*ЯDb5!SQ:g,T{)YsV$ zwIޥZKC= e٢)×0]qIV+VѣT_D+d\rKy5CCD37t9ۜ G;YX CIOzRmvv|fd֭<1OW_}\wyg;|r7.k5a  @oD7)-Y`Džcp$gGE~ 16wscc Gv{GP!F@zU/~֑OM涿85W)4Ϻ LGo4gZ23aehʳH3y#҆$ڸ,avOn[QZ:mG#'L~E(UK _FĻ;-A :MԙW#:aJ<}Q_=p`NҴ=A4T{ %z3MiH|ms {U>Qs,?Q5`g*$БC.7ߌ2+-7kG9f3j{pI *׼/KWI3h!wS]_Ťei<DGm}NR" XʱYqyw3MzB`L`Z7mZ Y! y~V<Y ,!v ÉLf7Ζs$?C>fviˢhʓԃC\kX f<;50Pʼn{TPerږ֛짃cF3;رccǎ pƘN34]~{{5t8-KIA=!B/c|Ml[2Sq3KHQ,)5|U]X\P;@F#t揄@|rz8,fr=[KOjS  cMYҽ~e0m}vpp6zRml`Aze:sRL_3ٹ$Pb1T.s\#N8sss7x&cT*ssNa 'P. ,3`9%1 m޴atv.ʚTR/!a$Jѯxϭj@Ϧx!' 8a[0f#2<l 1ЃM硹cQ!3Qj&]QejQX&nj>8e1i5,?EQsir %_4<@`)q /=zT5y8Np7m5/AH,yBP]a2 Z1e*("wr Ƶt|X),v}\pr;da[L\0S2m[`rpO;d3=QfL],c3NyML96I:S>L&-Xn  G fKoՇ>F_u OܽƜݙ5==؎m,M^}tWQk.+9&Ȣ 2)[hevae NKKUK< GWgNCk$æ +ѶP'褵t󚖨y멇VhIܹk^)B7#slbCGgǐ"I&h2nK=K[TV7NJUɮyPVTCV8ƒǙxh>i $zKqÏot;wl OքVml>| &mO'O:'dc[̇/-ػkNq `9K}4OA`e"`]f f~Jyl'Y0 8: a;:ơq\3egmދ-` /$((tʌn(V^]pԣ*"i$dRڌ)6`)ǵ̦1arh,6yɉԕjɝog,&ɮnx㍓t&1^󍤞q< b'K`:f20FlVsڌO4fK<_ǫ NqEɻFdMRnCneM2 )k<foeil?2ψD&_@Z,U}65q̄+#n@Ϧ_;_u6fA*L4]{R4*oVŴn=I:g?#i.R_d1wھOVdTLΙQc Rpd? c,a1:fS!ZugȑR?3,8 n_$](uxP/:F;/} 8^p͛[X%s zЃ.lΞ,C+__bU&^slw ~ҹ|*RA@H@؛$c+t Ng`F ?-/r7m,˔o`ZncӂM:e44@q8 lXhaşvgz#`^^1iIN^vK?B-I>xZR1FfZsuSU74a|Qe(`]9f4 ӄ$]PjEFqk6IӁ$p)A5@IQ /ΛA1Tn!g *?911GTLc;v778EYڵK;c&\ -tU E= |91 ~Pl8n^]A@q}Ƒ-HxM+ 6q 0񁖃=.1,S?Z-CgסkbR?7hssM^rOM]tɚK]sgo4I3e.Yva!ܦ zۼLys'j(ak+b`C:(Fg#I:>Fv}j7'ieǂ@IDATVS/W:g V&EXUS_MNa 2.wk&=-U#M_ .$A̴ED sAz\peǽ9=)0Эwj34!  ,a,v,9!F6myџ` W^$Vk)ϖvRE)Y8Hːcƶܨwc.i4}4li?o$=TSW9R-MywR`o3 d,,غ&&\(̚X B;ԝ&slHC?WYŜ5 6 $~CbJ3_dVZzm݋.茯]:@Ac2u3T·eVqyH[?5f[py;֮e=oVVSxre4~ddR MZ3?pwT#pg/)?PG69/lym8 :@i;}ir괱['jSO> MO++-M1ڈB4<,D۴il3o!;. mۼ p{U,AYʲ4QU#ş~S{+UP$_Pm֛6UknOQ:xK>yUkS[9qXw-2g8jҏQ <|N#˴b0apTR1W)w5烢 `v)|B $yr303M17 R9mB#wZȹwfm>Nj%-kZ֗OR!`?S1 ђ!@kt4IuFi˰14i.麉v]U'X?7{+-1;]lat*KI~iGۯlxhƇ}F]?}`NGxv9ѭD&zhd84Dl0EEGhR;fN^!,&)oGkי| ,,,'~Tm骺>O>H0oҨ!ߤgl$tZXܦS{םjZm^?8LN=X<ƳÔErB_fjMN^}JNHi)` 2ک,.Mdn(*\%NGx^ 2DrRuuްYWʅI!A0q&e,hWb𧈑+M4n-+nAA$6ؚX7.̺CMMJn̔ZT:Tö6إL !9:_`]|tΔޙ8<zY&%S-)6Avl;i˻YR;f 0a!ܦMK|6g:fk8߱Lh?QwfMZD4-5x 9^Vii@w>^_7֫s]M+ZJ8;_lB-&MLW=[5LD_d"ޅyxLBE\ЂWkw>O&_6# RyN"P` Ŏߝ2! % 2|0FH 1.r1MƤ , 8XԒnZ?SiSښNQS7hMil4il1$7̖&ͬLc5r~TbB\aT ˶y.[}*ZuK̫۪u1ǚs*KEyxLa2M$4a4qrmQ/cFMcM[:3oMI(JH_'93u'ӊݳu\ v{zjCNiӊŝުPEǥMD c*uOBVϘ `t'B NM^!)A8}D568^Xy{qd_]QR",O[kTC7gu[Id7mxĄZ|h[=؆Z @x/Խ Bܶ![L@\ M9z"}2팓9N3mf:6%Jfdq ?BƏ4NwjoSK1m^9ӆAJ`ak!?n9zކ2 9i9#KN$e| fK^ք„MǭCL'5i9iϛaa2^͟5oyL tٝ :-niО =,AF AD(T3)Y3%mRvjMGX݂4OCzUk'UŲkO5H8Lz{S%V{V0`932}m{q⷗ e 5_Y\*[$-E1e%Nڹ\cD%8A@.AAKzVK3&1y9 |i[#t$`#f Ι;Td(p.0=Uj,г B POzG;ntTɑw^E`_R~qR슎 q9 o,ik>_c6K[gr#`\z6ifu2L^XYnxd_JL* "&tY6ϬJNڥD,q@[\R]TZ&VfU;@m8q;c&9Dp~ yfjՑ rכjNנXcUб6Sw~P7=ZVR<@ͭD+eh BWeT~j[ȞUBh HA^1CKGA@,G#5R`;3)'=, 6"B{TNZ$Yg, t-& .}QP{0GR: ɤ;~0*%s ˓ݾz IW(׏q2D5uIL?eZBJ[=Rs̳uqc[&}̇4xhPcom5zv1_z򆇪wogmeV%8;(3Λ3EgLr07tr<_ܝX ?ȻN <1 GƔ-6] ?Ы8~Lk[vtrjddD;f 23T$} _vU42=ӏVwnU-Z'ZBTGʨh\5tlz^~)u-D%qXGܭG'sݨV}U&9C^dmн./.W+E8eMZ;0oKmyti;1%Ǩ^nbaoOLʴA!Qa:LlPD"J^H2gY9,vG.',r`|d#=P!}y=%uC+ǃMЖayi#ѥke0C,<&>ӂ&ym::C„ zFM&i=žęL?LqFN#Vd۔;>Ds&q7$afWgӆ{Ue@^hHTr7)|MZ3m2BVA!4;3;^T[M~ZGRjJˌ 'L0ur4h,?*כZmL^YSV7o|ߦU 9fhkGB65lxlT~MUmϪ"VΐX9S9z79hWVmoދ݂k/z-ʖ â8N۱5a"-AA@0dQ;I!uSA@H5&yQ 12ɴ$~ouӻ soPHџLf駷.>] >[jN= LċSz 6\RQm+j@9/38t0T...([\ #B4?0k j:iov7MΖO۷ԡCO?'O9BiĹ4TXUmW LpO`]ŕ|^ Y?tڻwO;]Ce4ɻKwghh=3"O1.ô~˹߰،m8#xA~{!}4cyC^&'T?OLСtF;A-T\n|_VwG٥>?TW;P[GzEP'O!lMc&HK;!TJq@e\f.C̶>E0fIy~:N٤80(%+l>&'՛uQL tp6S |`eNwLN/3z;x20a> udWiVh">;=j>Fg 06&W&+phVhZx:cWպTɕ/3HC[-,.sr 8 }ȃޭe d\' #ǁJ9_4c꯹ӟtԭz[V'w~gu{ݜ1u_$˓ZVx[ra{F??iCJ"KG=Qtĉw]kа3_җB]~}O|"Vԧ9z7/bn1ᣚͦ*;ᄏHy}W ݯjժ{ycO}S; CٿԖkA!4ߝ0V^x8H膩l%__|z4Ad mlAuхI%!p2q2?x좚^T&V8_vH 0HٰPP?K8EqRn>Bm?<8󥱱q}Dmoqi691AxΝpVhps\=P wyg + A1N=˿-(9zرc([>d4]~k_D^W??3'!e 72*7Lq^tEurh'9_G? ??oc[?8 g?٫o'ģ?oUO{#q/~3я~T!g\c&InX=+VUFퟁ Z{gvvB,&HG4CU}2ڎ]v5^)8c=AV]EX F~kih@]qI&*·m(6.^u½ Xaӈ?~KDNgMZg1C E:QF=fcHY;WT:扫i{Jgc:8z.tiv FVN_@mDjql ϑ:IQ߾T`OFpɣS/qV4V/?Z %8qj㈜3p⠗b}d`az'T`Q1R?|_g$vLR>8̙F8NxxFe/{٪}{=iS_pBOAIK_ ejLVhe\d(FZuP &,jLk۾4mV/;QݻwiUa_+bM+E/~i^bCקB5,"jO L~m6vof=wƀ˿}CΜK3ud˖&+8PrAuc}.a "=|͚5xH:l160 W$O,6߿ۿk9K(Иtpp er]O˟'BA׿'' bEXAg=k`T 5mˠr&+i>Y-+, B~0 ۄX'̱9v"'J1L3F0Q\ mKѿx+QSAOpܗ=I*Y 7#zQu t4mPFp' AB;{Hb fD*L84K^iS]J&cea!ܤi|YmZ:r@iŹw(@(y4*a4цo@_f:]g9[Mmú's߻hOz:~ǴSf.ucU'3JY <&eZM;묳+)P9|cP/zы&y#Y rYE PmoV{^ɅlsUx8OHƋ9{Ǵm4-wCbR. "-%s /䃜2O\wh C#C5yP'2fPxܜ0AvO4ix09fP̺^Q#MU$1s'*y^5_蜙{ VFuݏjluC]CS ^  -M҅Ok#2P1lV,Wt9Jl u5wuǶP[ŋ5jΙaZ0[A&zra|-FA Z^` Q"XS'l׼5xɩ` 9DxcÆ ArKy->ŐKr^.NN tnTm>m'Fre VD c,P[0e0eu+"MԚ4ٙ^k`:?K̅rVTOk RTZ3t}A>:٨U/MZR/Er4!CZRaէr,PckjtΈjr#U-X :kȑܼw?9d ~/7hw*l 6c7i[D;2֮]ۢ3BB̕Wws{n 3,&x8XJU9$\Wr+~3649U%#تsW񵜴zqp i[;oe9ICUO~r3{OxjpR|ۀVg\:C4)EC3uz+0gz9+oگ ޛ擇.llKz9sK8+X=:,T *k58Pșh wwѤF^N<[Xe^e .H# @# p"v8hx&>fd S궥0:J)8=*tTzfޱ)06{m bևܬ>rZSQw/oԈ)nu2"\X5CǴ WguDž8pM\\kÍּKO6!#u3^X0NgsiF]M@(z'LXKi[P_v[Iڠ(y 8C`lI<`{キH8K{&?m;mI1K[\Mx}/l\d^'W'Mrlݜ׍$i\ $|+v?)OY+n&Z8Vmѣcĸ-ڐe/܏۠fqma#z@# 8VP\(]q[,ln.w<pΏb}gh\O&DדE|޹)c3Wˢۋz"0^t. 1-KE8py֘&ͩ24 oxIrFL`+mKZRQ(3$)$^|{{u"bGs[;XSqN9380N(}c@ 򤳣7֥ 7 Nc>7SlVKߡM§2}3YD`2ܘS%KZtZy 4 13kvlpMDW:{ҞJ. }Ǯ:om>E̬b9h(j`N6F`+wj@Jx_K]egj4(R5>6a?,ŪSa s8o}4&ׇGm|{h蠴+mY۔N̟TcEbC, 2Тy-C{obXpf+<Ƒ?#.#yAՇ\LQO쒻uhf PnK%M ! D 0)Pz蕐ܼ6(56Oghm#=s~=WF:;eۃvqi- 0x7_1wfιOKy$貭cXr \9wrahj `hbuw ` +sy%?;GyDnb#n 㱼Ӆ*!򐼧g 4R.ved%1^p G}}R]]0p<#pA@2K{80ó20X;.8wNe\ed{s=LGʁ,Ytb̘9u 7tE G-(r"7>Զ٥O6Whm:f26E Ð,L1s=y) jx*fĝ+rK䌌!bP`04Q$KGobIϴ/|1NR!|D:"E p@T4eTr ^*G~c s;R Z['-Ub}+tLQZW`b^NJ{,g{Jbf,-`G@ګQM˓-.{Xlvps u^cssA{З1Hl2նc6I)mJ7 @%̳ƼQS6?:v~ogg^==wQ . ` 1X--B 4l)2E 7(:"ut^hLf]':L0(m7]zeCNմ:13T{4EtK5f>\Y(|Rͪp/P'2nб`R̟Mo=y[gP?s|=4N>Ewՠ5h$61[0sF $U{d_#إgȩ`cd}/mESʌG:4Bua#]Pk܅%^ HM7_>ru̮sASΪ}[r{ms.޾Cww5w {.C0BoBG^D,BSWvEJa vh^|#.:zG;Yۡ#V1>B5"rT!Ժ8G=]CscvS.03LZʴC3fXϏU X,\`j]I%e13@vBy_=R˗Byi~ޛi.7]I/9w=]~fcng^gz-iPA^@G/#7SЀG :8AQt2 Kŭ$kH/R#o>4|Zֱ£./СW`N!;vɓ'w >}TU޿g_ѿXRRL~s|6%䯻_R 2|2\rF6 ˪|uhf'Aav fw&:WA08}s;6òACosܵ>tl9y Xaۂ%#<˥QMcD9%ePFpjv,`2ؼ=`xٯʯ&mZbt'eJ}vh9VЇ0H}y/ xd(؅=V\P/=+tfKUOX!^Jtl:=Y: #ĵ^{1tS v!.V܄"Ra$iM :853xnv@#N?A?@ ]C1ӫ_MJcV >s9csg@ vw\0"Կh,c6aX [ۑpU. q9>N),&(? 3u_ Ͼ%gđݵqۤ{x~o^YcKOK鷳K*X]\=DZ´JڌxqSp: !AE;|x9k;YNsRV͜Pvr$랜N)..6N|7K [@m/{bsr lc%f-Z;L&D{rJo24b.0z 則`)Ý)JmeQn Ϣ;H/N uzs[Gm?7E 殸}]uU_]A,>\!=eQwC{&^ι9|7Ç6]~N"t"9//[# 6,]`-Y~ߏ<pX#i"mtqglKn8_䲞7=?n?k4t\4W9O ^cWheYڥ]e5:zpo2m|'RA*t$pA2ʟ l%f@>#t_{@3_h6:h̒i3t*}ҺOj4Koz})fy=о/ 簓vP&R6G@u{a˩)YO/,:vMn:)j $\}_q^>yNKV!Њ>?kmDnk[|e!;҆ԁMߪ{~iOSO_t kqc"Mw7B٢eEt ܻ-}nY]nZY9A"wnmoKǗvwNr.m~ō{.oa %wœY fɬ.RPXڡ ePQON"/e6/ŲmSSuK*3pU/TBmu>vExE`V-Mݠ=9fЯF nӫOG^FD`͜)L5[Z8loRj nJiu6[/kk(s~n{c=OEL%@IDAT:g9>р3=ivO1ᒧ%Ѳ;x)WHoA x*G˻(`w1rƲ0>`G0{'Ii] ­avW_]٤71SIB2M2a[4[<Ɔ %lpO~ʳmK! bHN|)$7$g:͖!`\}z}ﻡӗwaYt'4!8CtO\@ sNm*[ؽλT$#r&:h HKd[.#C#,wy{a~yqygƌ. Db4׃ Mi7@Yֆ- ]wW{ ={g K晦6GvG-NZ᭯N;B(:\#^J@ .pAG;cdl)WmԻN3`hsk. KdBGPh^[@ :ڹ>Agi[ Y"rِ o!Ӄ`=Qi Ԫ`Na{÷hZ O~$TK_5='I`3s0Cflbv 0ht6iaӉ1E`3K03<Ʊ.XA<(3Ғi39 fV4%UXzr!H)E`@/~Ҍ4tR)S@fW.ܪKԧnNew R@0/{dhF{K Nmߥ2ߦ7=}MC`9?CEv[MJ8ߪ$H*W wH:gp|:/.iBGY38J{m2MtFVhY8fȠhت󔊿e:.œ;X 6% C?nlt!&!+ed^ Ddi0Va^}#n.*+8.BO,P:=e\1U ¥}ķY0hFgΜ;}7ic}}n~s{n?Q4JLܢh9W > 0l< ӝ(RL2vDlִ$4&\ߗr-_qNg?GգG~qt:Y:"ͼ }Qs-84C43qPG ~A-y/7|Y` S wYU 4'l>-+4Qp.7jp [}@Qz&69 03raOghv>NȋfUl*y4Kcn*٦%QgdM"ecl, XSe]\ hh)t'Zuq{؏cfޤ>lKJmavi?C>6i 7sm!|5t%m /D헲.faqjhml6hNNIY;C./-,kuTU{y6M^;:N>s}ɓ'3Ҹ2Ud>Ծ>tf0i~~+Vo7nLI=#qn W-Y@DIc1,ݍy:zws~A-Ks[GouVT=aύ&FX\baC_̅R&2ӒqX@ O m)Doߠ^<2geJLҎ̳(T)\21 bHwEO~^x׸u b#GE?2H$Pm&L#9rx '.dO:vzZs߸m;n_:}3)tY)LaPHAt ˆM?2r ߼Є (#4=w:f f(z1{cPi3Z). [X>C^yl t"sgKGUZjEw4 @)T:A nT{brA Iζ& s ohQ_~/EGg>RtЌÿۿf`VGg̅M F1f]Lm=#gƹ؏,R(w]4hp̘@P|hyaff V,a_BN@q -%[L =N'K-Q@(GY@\)k/y\I tfl~^s;e6]A62v# \egL[C('?iEEC%SzF 6Fw /uK`EG4f$aIzYhƞB'>啝),)vUd}N+e=m}e,1K>Ru39 *()#1}c|hW6L"}b5&Z|-?gF_ ;K@ZX*3wC7o0#fQgsghD4:} Mr?bl<,/Or<*ј||o}-ġT3.{Zv]]?y tQ,"8Iv"cՕ͵etX#Y8lK/&Mh7;u⋶_r&%w#Qdu90ԙ%A۹򪫊6={v,@j lΜ>DA #v3 `])MX~C31ČSm1Hǀ\FrP5Oc@Z7غKKso^ݥ;l#+ZhPCМI4q Wi*2@'eI W7ǡW?f <RPf:- $}6$ j Y(t=: yu//1[e+Vg$hu 'l/XV`y_$]2V8(2 o| y}l]f0fl`f ,Q z(B0Me&O`flyv=W, 4;6:a ﷃ /& =iGsddأQ(to}kGӾ4.E4>]I3Lw'eawP]hwZ|zk:tp<#S_M9#ՃaO`l"0ϳOw4#yhүm'!@eJ4sGWnV ݤ"͔Y3Sh\Ј ae@3Kĥy\pCA,*jgZb|.߸4CJ~]έ~R} ̄A#rmɷ?yccNEu&{]uթO~򊋈bl‹ CcG7=JAK6i ,` \ Gb)p1pATө.a~**3* n9fF`8wW/}5\9{7u`fnMoz! WVVvWH#x8YH{lѬ| B7~cB^[n!%&ڏ\(qO俹$i@fXlh"_{) ]ׂ6б~b h :voaZ/OyӦ뎹6B9://.r/, AŒ:y. E0R(pp6 ̝w;B 㷷(qP[u?wNq!B30#XDj-2~PE>sm2kyP8w4+d)1kf-S{.̀Ociڄ{EKvh#w~Gӈ"C"=ۘ#8:D$)hGlQsq k>Q@e`ma졿-SEdf 9޿ zEzbyy^x7)K\we=KR($v!`,<^# .eTnH!崮`KhC9sԝv;f},`+[C (Ƚ0Ğ*d\^E` 3_ -3pIOg,eY5fUQa 4 > {>z9K4b3A,ڀ!B˓6iu̒)V҉`Q/Ќ 48Ú:-fрGb H:G: ~?3hps:KURU5$]Aڪ:ԴZ:p1fT*z_UwZi-H\?QLuBI_H>X@WR[sR5^~LMN~-Lr6%_2!嗯 |x0:ypF*shd|~'g^ޮ/9mǻlF y%$fL2eD kc1YA6]2>xDyiD\çr}(e}$U[ڿ%eCCsFԼsh!YaZJZ_b 2mz!B25ˡ ]|[]NXfE.txLPحuvʀeL/ӑ)khˀ  4)Qy]}nͩr8nmI=KA#,i3%(i$;tm龚!`~3˶i|SqI_qfӽ+wTcL[ af+OgA5BYb>=6kBsh\WL S뒼*_WEc^T_k3N3CT٘x8ky[\\:>3:KC9YQ-x)*fWW;`ڬ9 񀶬{B? [1Y7 m6 C@CI82$>of䴥M1 777Oec_ Ir]zS"9F{/x^y iF~Zv?J5[F}R!"n9 WmXE94&B}7uJ?Bm0!݋:ƛ5yR_^r29Y/'+_`fΩEYA/W'w>Oxl̖ Ҝ֐\0tC|]rR6'ͥ"wGgKWEfYPa qG1axzFN!}ʥ,HЌ1 O,LZjn6JtZ@yUE6:Q;5 -HX|xPଐY" h(_};B#ILfBi]6;K7ɲE0ճ1txsi߅>C'?% C` };Rm@gN#m!㱾:||!]LC@&C=niWk{Y__ɓ.>Odpt !hNj^˥}2v6FMqP۷6!؏~c1( dtPfJu&*qlsM@|?~_`B!(%*g C0 C0 /> "$U*b 룛__ܻ2(˄̦݀lGo@s|NY}1Z#7O}]u+B` :1?_f 3Ep'0pik1SK#p(s`gz/9O?k1|j[#96XVŲ~yylg7+}ڌ`W,mL$?cc~{3?N Fm)x>yI:)e h|q;,ONnyBidc[n/yx @+ҋ ̀ް!J͒W\u 49.yRɀƗix,JnhR2z:⅝\[RTww(0u[Lqc7  U?u5d6xd*!\ق-d]"/PCd I//!lA]u=I}U=#,4f+$K'* f d'h CFЦƀ!7 ?PG \V|_釓 XqWpK XfL~ED;1]t2Lcy.8N;$'2"a# ѹ^Gc4moo7%_mdtR#`3qSHp^)-Z,.o.beWjhWw"f+L-Qm\J R(7utqy2QLk*dJoq(Tj&E)Rm-T7$i |9 X)D:i}kEh v!WUʿ#z#^6('))Wͺ\@#C sH[T$$M>mK˴Y_ˁ.hҝSV1hW)(\wu_!L6&FD@> 2[eL7sR6'ryX2J~O8 dVP(-t(xSO3.#+ PGQ,qGdG'ւSd+,\^bW ׊ ZF[2./š0&+"[lnSJ| ?a_t h[0 @@H Rꤙ1佰d|TK}}DN%$Z}>DI,e'Ҷ>|z]t^Nٮ!Ǟ2^{?M~1Sfx uJ)ە8ګVG,u=h: tTrRDt0@o3ywG^&]#P.I2ǿqOCRߩ.uA'>36?f/T_nK]qBtc<-?N_… ϔa]NNsy>yI:)e h|q;,ONWym`mt7p;vk:˰WFc.<%Nn}JJklGp|FLA /~7#ޛ!`={ ٿG[^4*siq^491Z<*2cwg(U[̆}Bj%Yu-r&צKX 1SY;YhuLgmH)zL!}7;JC06t>$P!`$!@}{$E؃ʑ~|&:T=[ƶl-eE>Dw"-6'dN}3gr%>[yNa:%K^뤔}2Lc<);]kE} 1ZnkZNY}8NhZ'O}|QpU9Njf_ReZop$w\P2UP@Y+X\ꢌCePs\fi`RTdH~N`jj:8RL4RxȲ-Iʇ&EŜ%\a,y0o>r$|G)'1 11|_mz#TRN\aT9вlK>$吆LgY,LE -:__җߧ?s18f8@#p^0i\ФNj^˥}2m*(6~SYr׊.7U¥6G״ɷ2S y0{f_zKy{//R@Tc3f_R-?0ShsfLQu:EF:OXJ\"$?'0L4OjI?r'EVR$;ґ7~@F9цKZI)d@%[Pmt]]U6G״ɷ2Syx>1Oh]|uyǏ_}xuC K(Y^XXZ%AC\x͹Xe`FR 3:S_1w3-_ּ˪-_g1 1ʅ)&o}=}}Nm)'}lېl#Ɠ,u5,+2˔i5`tң6hFy;f;"{l[d8SGcTONҺNJ'.٦l7Rrϵ>zMeY19P' ̓=,ofWՕcTvNUN#/+ݚGetЫ -,K\f@Oe^؆,ݘBqGmFg. zLF膼nO2 Smg"hʖIӘ vb92<˾E|6GK?IIcUI's2ts}nay=IyD}\W{>[!p"~{x+lћ0&/6&~9e}eփ-QW¾,..V4Y'} :٘'}bC3ל>}bR̔2ĪLtHϖҗ 踤&?FӶXV>Wzn{ylxY(H[ԧ;'DZVjEACl&؈~~uRi2DdY ^|'n{ ſeRhMu.O4 g&E,XS8QȟrX/o; [J1* ݆~/NjkQ&5/~p)/aŐhC))t样o@zֻb3@[/[FBK_wzt?'4ȡtBp|hB22(6ڂ2=FE)///|3Kb 2gA1ⴠ>c<#ݫzhKЦ~t9mz!B22dٗBz,˩Ѻ}c}fÑ#/gζwtZA8*[B PFOlu%ONIgHA/2/kcZύ7f54W7>KI5 ,' $&k%c}Uy3{K"MBQF8I/f9(*j-1 C`0H=`E016&P2W@,g u5ITA@'Y8 -}kmmퟮ c'-A >ZW^-)'z%y\!9sJ>F N _|s9d\磱{X4_Ů:&zR&XұDuQ/tm2"OB=PnQR"=rcKnp)"/XwVS+590 C0 C`/A#n?B!g{]ڒ_,{Ǝgb,L}cQub!h6|,r 7| Ox'.Ncl ^~L*"R 3Kt( JXr@L\Au54(PExRgADUT]שs KݵDCM/E[*ՆZET9o3d6aV*mO&l4f=pOr.OO945gA %AcBv|t]eK C=ϘK̂!p`/}{öHX  \ҫD_dM*2DZWa_dyeeP}eX)oy85Gc >m^5t9Չ6GOiY Ac>Z|O]~@SE/oU~G8^nmWXXDsEߒLXYv`/
ĥ,])I\*nL$h?a:>:^CcpOe@[LD|Tb,C0fi{CGh]W"ck jp'ea=a9 ~ydGi&%-dG@}TH 1}+t!(KqI|\Z!UW浜C ɂΗlRJog̠[>,e}z\yn.q?_'=lee(^F>/ ̙2ji|W7a'i`˱\X\=k(v9a|C h^8 @UT|iUdVeeU!$]zqxC΁RVU:ZC*iuOIݔLxg0bCU6>c'|жl;5WG#_$yi/9ltÔ D|{1?A;A~.a=#Q 6dK} {Ҵol68Oa[N:` 62h{)Jcrlw˘"/]XM/OkXY}zc|v59e!,=)O9B#0>]g Qy$A3\ԵC3gx X;LM[Z%$k:r;8cBX #DLy U#x$gg(406,O^ S6x1O85!QK:&+P:y/&NoZ#Vt}jӈVPuFAϝ@P_5ȳ3+ 2&H^cؑvN}  L)D?2!G'6/=U]Î֡25}seЦa Ci'2&:y oxd-}<ʗgRn4Y_I)Cl_A)>Cti㳜N+)+DtY+mz!~*]ʩ<m几ڐ>tS~=z'1Uԁ>$: PLWlooU vTFAZʄ. 'h֎iXngY/+Sj.!Z''fD5)!;6 x\#>s} NȾ C!0U'4KeS;;;,5z# g6@/@hNM^0q`7>9U]naY/IȼTԁUSsuǂ2-b3e7J0I_G]sx>6Z|>&O!6z*tZA?mC6Ӵ>eۖO䆦k)P~3W]uN<qj=vAԽB-2!:$fgGlʹ$Z[JAs];$ 6g;2s:TO !՗ĖLӲ#' TV=%Ԩmz>~Hr=Quj=A:&uLq)+ܝw/| ~28} )xpSb'}:4/eu~h|I&6JOe˧d|y)96YPi'~"1^TzJ޹@:"%]]4mS hY1i ߉/~7\{~2XKbؖA~X>Y\⧅dYS=JOK )4-#C}Aƾz$h~}w=V[TfG?wʸT ӥLc/mȾt)ePϕHZ)$R'El`"@69hH6 q=Ƣ>8Mξ 1lrhݧP6f@tcT9Q$47Ї˕#`e\\/zSuǁa@ 0Y.ubd`gc]\P/rBy4r|ӧd)Q>$il&7`MS2^ }ĵ1lk4!`\HdL?Օ㳷!-X-< Lo(>@{ ̠+T966 s},e=q1A9:O~?RL S>YMb>'>֦>6B)B2!mHyWmC9]f4E/$㣧дL,ym.|iMcyD(VA튕׼O}spў"ڦ%GS@S>dGt<,r2!QqήSt,1SdWbjtRg=I-j/(]鲾f>mS2Tz& > nk_4M갥ph4oΰp^ ?ަS?nǾgdƮ+Vlw$kO%[Ke$o`FVD:ᣯ/|Wɳt ׯi>=)nr-8-?d}4tNt$?׼O&DKb2Rt-S96Y?LYSI_$E,oB:Oi/xt:Wv:R]:Iv ^XigNS|ABW+>kRV!΍-33aj+u!r!ޤ_fSSkm&puo&5FSwVJ Gh~Lꛦ[[7~fu7__7~{AQ!12h; lK(϶Jė-׏z̗h uy{}y_KKǖWVXN`iaa:Թ᳾ 0[3 Z)%s"(x& ]Q9hWWmǗf*`fjLRrK/E~dEuy/~q/?PuS0z{L39wdSwH'3+~^ȁeA.?aŗ0rߤt)n[/kvp5_!9 4iӧ#}Ze\^_9D/glz_&>ZӄԦx)4-#ˡ<iH N~Me]ϠAD[ǮMZ`(E^EgKEʆ!`!`!`tA+!X٧uCe1A*<\ ]]tmEN9CVƒuR҆tdw3%#R^YGcR_d$-768X G>GQMˆiCwnHߧc4C0 C0 C0f1Nl}$a1j$s0vc9=# ɥ`HgL>%MKtM>9јKSB2t<|mJ7wqh*ݱ|jNjg;U C0 C0 C |l| $ yd2DjhtY3DF_~_c>N#Fg>R] iΘ9k8Q%/7頻:d#y\ qz׻>|jZ=Zm_Tɘ!`!`!`olT;lc30V*(ɼOwHHC3vϜ(AqScI̳I Ȇt@gQ.Y^~AzI0|3\dw4\p!`!`!` plO|z$O)C/)˶d*YτFex u ,esʢ9]0=$/2ZgBdAZm1~ 4Me^J^N~,.t4e\oэ.r|5PٳgO_wuep,6Gd4Yyؒ1!Զw zFhMэɄx>kY/X4W4Gh/8qb}#{@א{ǴSSh!`!`!`zsB0u//}q8y W<% ʩ<)7y^桌+E'mC8"ò:mҌ8*#q]r1Yɛ/o _`<5{95fq C0 C0 C`L=>[71<md _DMSg<82-lMGKu(U7$Cײۢk،hF[&=ϾӞ=z"}אi|f!`!`#@LGZt|积z>l>eG5dB6c6!Z:t%*) Ƽ4E?&ui=YyK*ꇖR逆 cic9rd15i82 C0 C0 }@, sέ}C׿_!:1Ke|H)K]G}W+AlALԪ) }`y)i~L&5OY<,cSiʸr3A3wرE М|#ϖcS5з` P0 C0 C0)A6? |]wa\!29tre,ڗ\zjZK٧.نRx,"òP|BTוdYu%OSNJ>ծK)3Hюwӛ+F[DJ T "ce C0 C0 C`R.e4ٸ[#ȗK03pj ̙H2D5-,ee^ە>T19ҠK?Sڪ0`yiMSJ^( Ʌ1694-+4Zx|x (K.:m{6Z q`MQ}!`!`!0]dNݡJ6׷isN[o=77w }Z˲TYwяh^2tpɶ?-#ò Ƽ4FL&ShZ&V~G7fx!`!`!`01Ӑ.12 +дL,y23 i.er䴞,7 }4i %j#&)4-+K֒/%E&9oeC0 C0 C0rh sKT1/4Yy4#VZJ}>AhA#Cy=+c<_;-imlL}Hi7f0 C0 C0#0AuN}1/euJk^[9imח|.Btt :`Ʌxt)n_?`>g1}imʆ!`!`!`@|NLn]suhӕ*R^(m?fЀ`GJz9Yݞ6]-+A1C>GVZ0 C0 C0 YF gSh2Z>#{& =˅ f/0i2r׶O/-:.ݞLijz>[F3 C0 C0 C`HSb2!ޕ,廇&d|46GJK2rFw遆WG"zi-geC0 C0 C0 A6?4]ޚSΑڦO&D l+Y/0CSm>^WZcַbw_t>dc 3WoŨ!`!`!`Lwi2XНֶBrLoo㳝)0B+-EO^AW^>%-W; C0 C0 ChC@=G?&ۅJK2 5M}29, c. ͱ&x>zWZP2:VHF /Ger7 C0 C0 C` 0|O|]i)zC[O6uuG˦B3f`pu6?ˡd5M}BUp6>˦ʱ|(NȾ C0 C0 C!,#T;mr1~磏MK"H}rk 3oCOVt9~rdC>l1S_}̋]b6g!`!`^ 5x}tMeܕUO?ON*r =α" |t-~r[!.x|I2ڢ C0 C0 CHC HӮr!^'ەUFn2 7Y)AߧAs)1GBdt\> NO!|m)oyC0 C0 C0f6?gR 2>;4E,tN/  |Y~Z.x|eNsd.iK۶!`!`!`>r>}I˱" l Mn6%23OB>z*-!/8g?ņ') C0 C0 Cu|Sdb/^=lrdȲNt?fA~L&c']Hԟ9V87pM1 C0 C0 C@ 6Q٘L^HGO1}Y>ˑa=I*0 SddB19sd ْP2Ҧ̧ؗ7 C0 C0 C`H ڐW&CK؎ɇ0KnTfЈ~L sdC~+dNct 9!`!`!`\x1ϵ&߇͡ hx!zِ{ ;Oo C>-FLM|B`~,kT6 /Cϑ{E!=*G^ Mokg ?Ur|.6a:!`!`!p!2E%f|Lxnú^=u` bO!\z:b:m>d n̮ C0 C0 Crtdc.!uBBt1~HSX'WI3dv):m2]1/DEn 2?sm!`!`!`]cpk3EM&Bt]ubz^1Rm -i3hpzNL~H7D?(1X/6[RVj[V6 C0 C0 C`? p4 GM?Y!^ab)2\mhiJ`=b?U'E.&34Q ˦)eS4C0 C0 C0D`z6>n=fYM[} 2`OIL׆G~SdȲNR!`!`!`tZrRdc21܋cbLRNSmKAr FN\L?/XQ)E^rR!`!`!`Csmʷtp_c|SdRmMNSmhAԁ\L~L7Mvr0:}+!`!`!pP:kmLW^~Ldg @ .HPSRdfϸrʳNZ0 C0 C0 F -N|ܬassUMg10vا %fgl~.Vmz!{! otC0 C0 Cpk=9z)m2{'͏\94>ˏ sdpk}9z)m2m|`&O"::ͩOZ0 C0 C0 )rm2m|ܿ66~ ؓiR}3fP}MLJ=9"՞~i;}0 C0 C0 \ԹFKSK3M;Ni 9W/}MM MC,ȴeyC0 C0 C02}9)rӔOYᴏ.I˙1b`ާTTE.E&}aɕg>>Q0 C0 C0 ^ ԛ*?ܐSjWp.5/g*Wr]H7VJ}&c!`!`#0dTٽ{Z?˴3j຋PSwn96o<ߓzߖm~!`!`!]ʧױdsm{[Ϊ;w v̂,?@9NmZ0 C0 C0 z.6rtfA pGmL-3 lnaL1ms{#uC1l2!`!`!`6srsdqƖg"ɷzIN% ~άkhs9i֕!`!`!B 7B[W\4}.l̘c0‡6rƖ%C7!`!`!`ك@]m-M̭}gGwH𣫍\\yƩrt,f!`!`~@`B]usr~vc}Cؐ;u EPw9iz!`!`!`h: uEGwHlkOҾC6z(_Eq6d:=i!`!`!`5C%jkftGm ʎ5ٗ>3f 򧯝]3 ice!`!`!pu}hWt C0 C0 C ^弪!W_<-iwOC r34C5YzBn!`!`!0Y!6OP~ 1c es(;ӾC=`v C0 C0 Cz31d]Cʎa `ik PoHC~C{Of͟1}C0 C0 C8Z@`h7-~ưɶHo3h~xv'1mz,o!`!`! A==v{,lfҡC 1bN3 C0 C0 C#0u mO1mzs6ױle7u+!`!`!0k 6hذ.90uȥL~~k:vez!`!`!`!0 ;@:]ci=:Ӵ}C0 C0 C0 $4Fܞ!s>!AٚӪGq/[0v`9NhI' a!Y;-=q%@ @X ?c5ά{~r.n{߬BvqTa/. @ @`. ~#Nv 5rnFqǩ #rqg SZr @ݚ1"wq}5:/N}sL @ tm}xFӰ=̦8[S%ː^$@ @[݇J t[J>M}}AU- f @ @)Âj4~5- ;go8 @L!61C7xF5S+Μ̱_w @ [`̱5=[w|W/p @k7l9, t^ s2v @ L}ܫ ѽ'p8L @!C!2ܡ Z<1e N @ @qWĨR5B @e )FPΨzs_=.@@ @@rCzUn}8{Hsu @ \K[]gkg̗:: @e>Nd:`gcH@͏t @ '0Ms. LWry @30f[Ն峭g @ @ØmWd۶  @ @lœr3 @Q`Ak!>xz߃  @ @G a` &~0i @ %!!ĞxB @> _>%N5h8W @ @`CR"b8Jny @. \y@ qSz* @& @ @ ]IENDB`Interactive-SimpleInfo-Light-11.png000066400000000000000000002614711476226662700343560ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/assets/system-notificationPNG  IHDRfHsRGBDeXIfMM*ifH?B @IDATx}$EϼyyeY`IDAA  xfA9 L'DPDPIb%']6'v7oS]ӡ' f/կkWU8A@A@A@A@@!Vh#kŦ   L.*L֛Juh ^   0OҿiFA@A@A@A@9)^ "Sp    LM$xcy%P `RPA@A@A@TBLk_)     C`kR`b*awA@A@A@RB`Jk`ŞܷFA@A@A@h@͞2w8*   =&H'2>+A@A@A@= ҴjPUޣu\:.A@A@=7 -w[mj6KXrꁲA@A@VD-sZe*~Z|7Epm!  Fe -vf7}o   G T7ŮY'Wݾ1# EA@A@)@4F6o6#4˕?A@A@A@h-.$5 .2o?}ľ   S L4 fQ߃Fa.vA@A@A@*hxҥQFmnWdhO޿z_Ğ   4/ =& o&ҍk_z+}u   $Aa$2ѕjوw#lrc+|L:A@A@A@Z >&+R{^o{.5.4[͟/A@A@A@25h`jcKU |=mY\%SYNA@A@A@H@݂5nZ7ץ?ˎ5 ݏFO[؞اK   4u׹׍SwQIq=lxF6Gov|   D*oY%L5C'׵_Vʄz_o{~p5~~ MA@A@=N-Ag 5[$KX/eG6uRA@A@A@GfAY/;!]MTk5IY z@weZaA@A@A@||zZդ:F.BA}nuE6׺    H}"Џ Zp*&0Bg5Z鮕0F}   ͈@ZEk;"$;m}HTXK?֝0i+iA@A@A`OG }XiJ[~-uv-g4uU P||L[otЬӖi[ꂀ   43L-;tG:uՔ- vZzO6m,:- t ]A@A@AV( ,:J>*WW4t'MU ?+g\郀 \jd+)[ %A@A@A@Z Ds.Veɗ>L 3mãg٤r,< D~$\'K9?4|H# ?0A/^7AthwWҎ]slOPf2R&'''JiUjUk$Xo=A`"d~ȘMcM8#B~޿gl\qhtttؚ5?ַ>n:riJyTX.W+ȓuT[ChRj;WC26̊+WcliO3@ i6*\TYI1\,Vuط@IH08{"-E>~Hc,2&f>A@ZmOx3vPf4zgn}_}c=NXh]Bʗ5%/!t4L.UJa?ZCg'}N89_tO<`H4nJ7+)zAg} "]^kYnV 0ehCƄ=k ߱=Y 'v~C(Hs˖-? [jhc㔣lQZ붸&˥DzdJD&AO5Ƒ*tfѢE_W-Y¶l\BnR2ޓL%{M⋍%%ޘY%l  rI̠ ah44Pf/?餓n+hSmgʉ?IdXYQM~7*؅$2Tc;l88G+ewGzorPw'C%k aϪw-;9Aj @44;@@IiP PُףO?C_X9gl> ]quzc6G*Pq^wYf"N @ wTZA@" -F f|ͤhmdpor)M#d F-"_ !qemmy7}|+/;> (h",n EjdoE|kOA@A@hB ^Dujh߁wab{r~JHɆ¶|l(.?%VS9#.5`jlƑ3ypLK/w~Βٗ;W Xbj+a&;5%ޚI(f0Sp*W^) M@5 +tyf[IYē_~Gl&3zӆ:mV+k겭[ ITc/- ɃKmʼ7]FAEҡ̞5v3dՅîrq9/j֬-&?u,T@* /Jѳz%:OYp7t2Y`k'e˾r-wGGֆIkJ;ßx_X5&tWBHx5]FeSg,'x#gԎΕq6ogh;ȢVԃ.ZB6fӪجT%  @ !)`$SSWg̛7}7*('a†J,^kCKZΖ/\R{ri>5k\8gΜכ 7:hQm`# @wɟZN[ŀXLne%RA@A@$ |&i0#mяjS5})  r?jgi^m3y=ktJj+g0v+Yjs[%(LAp6HAA@A@A?p`֬Yo뮻&0 JQ3v >dgJ*gIn-_%c+g՞#,X}ǾقF[BalߓL=@46m\/枾x& 49ɻ&  zO$[15of^b6nȯ6͠fTky<æivigTO;26|QMMxfjۡ(JkL+$ī/F.6[Jç(Aavxk&U MՊ[C;7pCwuHN2o{衇:xl4ſu1A@A@AkN+yyT ".;$6y:l +fB-_mm#}%U!Ts::[vڥtx{{1>s}uRФOU[[䩧:8oa -g۰>olCᯍ_[OOQnڴbg xd}Qmhy\~Sz3U9 99&tJ|k_۟@ )6ݼA_w@51.qn3qbb̬݃Y&6lؐkviT/twwO Pahh(KWW$ D￿3ـwOzz }}gf͙51}_Ֆ~WOA@ZNDt;RBٞJʦ/Ŋ<컕u™JB79Ǩ sa̝xFgrfItMUnd``I6Qc'p0D>ދ+_];wl;Fnڶk6k^y?3#jK+NEz~Ꮏ?C9t4HOA@A@A`F ipf~XҴi0 Z@ L:.mHAr6<:Cʍ EWA5rKdh9v67"Vw> $BYbE Gz3f:;;'wl߁K̇=ktq>ݏ>:}V\ƹ1Sp2h$vڙR˗/uJ. t `V1w*&`^WjqrwNd!D\jNq|3Hȉhbk¥%^̅͐%-a.jSԨ/A4xљrSF '΍/6'PwݰrHm]}).׃/Q i`>w͝=~m}6}}ϛ[<ԷkEh_ys/dVӨ~\(_}j# SKAq `@=Z >@d/l}lL~nއ2s_g At]V/񇵱mHވ @M6a+٘_A۶m[?2_+gU-[lbtLs=wxEҥK,X`:cU46>6L&@P/l.I3Ba'YHRQ)sS ˩o\-lNA@s*4?ٱ ;m$b}[dmRc ~`f.`ΏG )HZ׆LSG9DI3z9*eZbsS7Gy(>2pC:B*zIhо[X:c{qÙb}>c7LoxrL;ԽSQ)JA@A@fC $ Ԙ1zz<у1u*AA֒{X`&mm kjC5ifݶo5zIJ=USH+# 2V cژ6cƌBWW9Mŋ,Ϛ ڨ'|BhE8JbԆlhu﫷=RA@Z޺ P*:Qu@8a9#7RY--7fN~r[y=3:2m&?^E=N ){bw`߂[D^귾7ވ3SO'<^m sԑGaUweM+ ]jUBl{Sʋ2<22׷"0sg ,ZH 6 i"`U5MݢKʔzkOұ>?QkBatJ,MQf&ͬCܖڳAT)(ް6?zR\H0 0A!bI%aՋ;AN[OYQjSN9eow׮⫶u)   @#'nς|U~?LYЂ{~-JVk}} )hvoi?zR\ce>@2cL 2N. ßٳb߂҇0r*p|ە)\8iHWUD`MR5{   ̀V蟤>6:+6-o:U -Htٶ2]ve[~?>f7Ri*#7 ׏ǔ yOJ4%ͬɁ4!>WNѬq . K۶oSI7<2\ Ж)sAs/}]O>dGᤓN|SKXrؚ5kl5-RZXF#˧ϬQu9\E~k5Wᔈ D lz#eԿ V/͒0 R y9p&Ab0{a6*xU[a:n:є}[>jg=uAHazL6&OT6LӮ['(Ln (X{Ԭi' b3p7%Qޠu:?i^h L_ 8ėd&O?n5p_:P8 y*{|6N8kݺuGqĨV3;(A@I A|BA m؃(?ECwN6=Wfǎmܹs=ӧM/WeYƓ[/A@A@A@ʚ4aN2 ~T7d-l2z:gK ?賕 h&O0m~6$kp@d[K>}*̒  &H%AFhExVCR5YØ&OAK^ ͇\ILO>ddrӑ:D@G2ڒ2ae])-LaX(8t׬&ͶL371UfL4"Gf< _ѽ _M}a,%-͈N3.> @s#*S-q$ɉ vSc\= H!Bx$:c:=)V6gVؚ +̙T ĭ ɴWm1Xo+Sp+Mhf_L8u뙰Pa/-P EwuN}ܾ?.Q T_ߜ$D69 M:A|d_M =?}^U{U*?XWn?BHTB9Ld[ ڃ.?>VMݔ5헿6ќ)t~:b/cm9BV-IKyl,w\Ӛ1BO4g I8L8 yp1 =i< d"h擭?lS%)2̧lt `Cr6i ݰ[q~2A>/n|5kAMquGQ>גs]A7xPC9,3yWnlAMVXwSDtA@=OE<ς D!` 6X>ve??IN?؎_[aLP"=AMiyvºǹt=ᩆ_r\,20i blx̶lpܐ{ĠTHTGH6PBĠ'a$F&iP1ȑl5uuiId+   P@XB Vps.P `zʺ(!(_I,#)  ͊O?K h$Vz9'.6A #4r^3<ZG buf[T])$ybot`&a64?]nփx|[6o2WIҥ U LmGX禭( V؎Q|b9Xy"-u8 @ иA\YAVD)Ҷ7Q}=Hb fPQM6~&ϲu?~z'HnhkhU`F}Sڳha>mz=\a_~DM왧BAyl`M*F: :]573tj bpx6 )T􅹃G|0c Gy*UR4_B5ZY|uE 4%tS:dN&sMj=96.bS:; =z7mT&>*0S-H_ &_ܺO:ʈb֓؎ \xgI| |x$ђ;Tťe[!VA@h%&U KTpp[X/ǣ4|4sO􂻯enl[g=fn :7$od`culeŧOMꞛƒV7O?^wbdi}na\.L\I6rM4@ÉĐdM܏^mA@A@F" M=a4HPPe]1ަYol/-=:od`#@I&_T]i|zY9!ZT<ÒLD61H7z_F.>%A'hۘ۸î|qCجyL؅. }B_:] <Q @#'!PU4nZUag93/@fdݜgwl#፡ecם3JumTJxt SVrz[SkAROX7)zfSVA?#hXv̸`Lf:c=Y8úXVQ1s E-g3(LE u`,X\ C;۵}"wk|y6^6umQuț<4J;0SmG9D :^66)|$ I(3K&[XohpDpI%PrDd*haSCo9uM%V)r iP NV+:JDb(\wG~*~'Wy'9]]]'+ĄOw|2mmmqRMꎈ)@ЃA:۔)=zksɋ=8aWX<ȏ&<[s&h}-|t[F5gG(Aenfփtm׈ E2uݦmgS.йT>ou E<ਗd6M"W-es]SwEt꫇]$-fr2"7]e,TOz^+WzǕfY}05uvmӟ_ef_W/N=_wza}]_}h_~?o2Ї>4\rv֗f^Ku?ץ,@\Ǹ/@Zc}%/Syꎅ='!"1UB{q>`AbHB|p P'nTGqC#3hPqRަo5 %AtW0VAIށ/F9-=Κ5HeXjdZ3H/g|3կ~u\O6,ڽ{wR͛6?S2f͚k_%ه~[Ǝ2C˳>կ~k}׵}vwYb;Ν;no~?<rg/| sN9唡N8AٱcGvڵ yϞ={btuAG & S=X7XWտ9S 8zټ\am&/qtԝG3y6A2&󳋢36:P@d]]KL'm" N:1v :* C*J{f۝/~37}~+gu׵q=O=T8v1njޡo(vwV.?SMfv8آxŢUVƅGϼE/vp9Gh;t}2ߺys@`.ooq=O<ākv=fOFo+f^1C+^ڏ8a:묁YfM|;ߙa]P͘1# j\\ p>}~]Bw{+_V]r79ꨣFYocͺe˖Ж-[]9w܉-׼5 v۔+_B=ty#H/ڎT aqܹk%Zk?vI1'?m{Ï%3f1=3DY4W פ=wT/=WNA@j<W,@ V.I2~/gp<'ɴe<32:"Ǿ$-/PJ>DzR1CI uzYӃ:?:zj~I~~4]gTkSӧ@ v!119XB<>$43F^ZNY 6Th`^ćFH ~tOs{ b,~35B'|@~)Њ[|ʗN/_^ `q_WTx߽>ΑG9Do~g]qvZ Vb\xSҧ>m;m @rI@3!$~6_Ϯ*~#(sM g gqW̠`;Lmf`t0ZUpVx6t Q^uc7:wFȗnuyV$ ߸ȊV[x%SZT8G?я΢Ֆ0/x >Éu -bݻvRY2D.J+iIࡕNji,~&@鯒mƻrk'׻o{ Kz uM55mqNϟnk:V9V/0_2;am&oS :Ԉ(ICu1#nZJ7n Z FaLCAg foǝc?s+p4,Zq˜g;;\& L=1A9z@GH/Q +#@ cY/ (RC?R&Ӗswyw6d*mddqfΜ9>w{yGp^{Ur9mM$,Ze-[W_V SYH8|҅<ɷyFd~fŇDZ3m)XQ|n*}ŁZPm_Hۭnqڏ>J :e7-K,ɛ[`Ve r|,XRٳ 0:G,T]Wo) @mO߱/imBqW,M\-مM_xNH4 Ձ htAc@rT|u(6 i&o֘T Fw1۶mtAp4B>7 |VD]j<:< mGˢC=Q:ķxGZk9w7`{qN>y\ssB׊c?ۥBPe͛7r`+fDOۿ<>w?f?$!!!A@/gsZ%|He~Caȗlgyv~p^g/ &6:銮 mQuSަn광ISL\B5Zy?~:]y t>2b@e,4i.]wa5F7!,;<1LGlOQ&iz` VnCY)QG1JV&hë́~Sޙ10AĜd(omSE*(a|^X2 aMD8*x`֯%ћ,]M)𦻬If֭w*@Dq:$]-?A8K+{*Ze>Ζ#cW]uՆފN_ތ qZoM6A_r:TtNU^裏vћT@H)KmV% Шid+Gg¨`2Lg(_iwE n r?!P_Wԛ>vǶaPb͚9KYvu+fh{ҫ / g_- :x3MrA@A@ž>Ƙ䛢U#'m +=NL9;OJfҪP7-AAeux6GP\j#LʐV`Lleme)n]Gۊr(yykeVoӽ|>}J$FgUuppv; (R\-o+QSfC3*APSPApfltO o ž_q@x-8˖?CF|.+y xenj ēd0nI='y{_"]*(Bn:Am홠f0餓NZC wЊw zk_Fz-t&N+]|Ehs<>SϏ<uס 4:]郷EQtXqA+S /SIyo?}2mHV,]V+wOjYf^3Qpm>] 'sK_Edg?::p7O+|JU(9KOF`b@Oۯtݫl?6 &hMϣo%CZ <3-LYdh.5S8"dWm *pl\ nT&8Egy36:OVK;~3493oNE4E wq׿ohB(3o}ge{A4|!|U]NBU]u&Cف7?3GY_1mmI.@ '͉0= lQu},0n6[d>A #s jz#wߔەߜ=3Nܼ݇ =݋:BA_1nxrOC 6_Rciz9@vSYEPt2\&~~4?ht?Ű*eg 4vϜޮxAyrxLu>KkQJv Ofm3Ac4ͪӟ Kyv}9v۝=mGh䉁?;8Ъ*M[4oLz@HZCk#80_L+|(U3cN#7+og?Cs L 9|8eof\ ޸Y{ ?O: tI3L3JʃWqk6mԆI?0O9y^]_o) x6ZT>Fo{ [|1?>gMRa?.܆^'*kQ||!  \|_e3A۱l;h6s1~#7,2ZQlk:VyNVZ!)Qu/, @#|"hQmD"Æ8HjO=+_%@ @溍_--HlxunxԢk7ڰ;]wlrI߸휅ړBq>ϗ JQ9)&+OhA&u^-_ZW (:iL>nÆG׫Y֖,\Ġe~[u^OY,5&¾yt[$"@l7uIԩ&'zΡ#ߢsbF~:)R L? gۼCͷ;g$ 0Hiڙ1aV&ApV`1 V؍сŃ]sF; )4yR)h`jP )/~iEhݰqCeJA\4|xє+]\TVsb F @YlwR{gssR[i^rKy?яQg:yo| ʒ%K&0ɿiM;ΙGΡ \p5URo~L/}K3pΛg8Y2|,Ȼ`MNg L38(C+vOCp!`U4:Ԁ&Yg[~s8}˕GO9S; g[ ݞqfϠ-P^MA>C+&FGFhe c6Fzh+$9~#C ~I]/khtƒ@ЇKJo;?w5gqZFMw}8[`ffbR Je:=Džuba aKVސ4gQ ߂fmQo)z;߹k=(i5M,K+{&|9CބWV纜|I#w+AϟΓN:i߄=]g`4I+rԯ?oByΘ2 ܨ1obbqZ H.@o5F3 MuzmB)k{U+Ϭ,3rI"NГQhCo u9~p\iy^RU4Lw:4} ~@<{+EP02k֬<ޛ7.Yd2ymLez]{ofkዹ]V}Ũ kk8,^  PlB<294HFcyeepPa {,o A'&k 4dXjv NndnruOwgwg Bݢ-z)G7/_ڟZ"Au7c`&ɬG^f[Z?`s `=ʊYh<{ ?ۛkWҼ7\L!2>ɹv<2׹ש0K~Ɏ.g4q!ng||:cfToq8>%KD*c`kдe3i4XPRT/$4ǡY9z߬m5*xqrآ,PP㬳Zu P_7x 3fޝ~gDz衣~4ӟfXbU|`aW]Mr'|3Xk֬i`(mلmڵkW ΟGo\79 V Wwygg?mz;pB]Njۗ.]:Ng<;t˾(s{ڥPGJV [tp?Ηmg:ǿIO?}8?}?֠>֨xkEke_6/jWLB@]vAwg(l8Xǧ?Ϗs 4BKO4qMIt&5LAQP=1_raUhSλ}e͇.lN -&+4k%7k Qo6V#6::z+kEkʦYm6T :dG>We?~a4J\h("Ie2g&&QلxЃ/V6Bhd-vsqNKO>vٽIg33tct9^gbῸqR@ lp>ű/ aߌCsي&h@J:EP,)$N眨sP++).5y:Ak^]<(P`8sԑG\r_<'?f 7odzzq?nd`p kKFҳ_Z^i۵{}fm~?g㇋a 0ң@l3jW^ә3fy|u1[zwX:FU +yh5l2w x2l j ]:p>)G1r"0!8Qg̜9@m?[ťʨ4S`Iv=z]竺?U+@=%.Ksb̔$}#lgJJ ZWqaq+e:A+e/Ϣ@ 94ƶ.XsekQ]L#ۣ_O[Q~ml&pަK0Nz^~ ~~(v?Z*+PZ).[0>+#L[[q4! |0mjP;F &Dؼ~Nva7#s`&Ъ ,h]\yЎuB!7 "a3R:ttd+ޒ#!E>Ip0åey= 'D+4b Ӯp]/[)07x7җ4>8D秷&8r2xkF:x/UgWcccnCq|:|w7$Aiڵm7$am ᵡFM?:1R4D_+w{ιa}}dz  eAFZ"@Mzz'H2Aظrzp4%e~M}?rl·Q (ap;/aLB\ˁ:2-?kc='iɿSNU{(ML^݆_9M]~cтglvjЙYY?YmTA߉Etypj\EPLY8/ti+2tK^xs%1ݴRw&tZ1St.\vhU8` d`CB lb`td'b({].fG#\{ N іu'N9s;v* =&?ló>*Ԧe1z]:n/!qH-f)y r؊|pk_lVY) FOCB~Xaۡ7 zSzb T˩skt=b},bݪ~E= M zT+AH'\;1) 2^G>8t'xv& 9餓|be%y2?h&A@DwRTA@zVSY%?v` 4xCp/HilU]!g0s+L8-!/QvS^s+&u* rd5+Du-8r Ogzռp魜|('R=`Lz^f>?EȲjtT#k؏9īr\~~4_<@@3g%E9n-Jkq|ܯ%8gfZ71 TQgdrI90 V0>6y.tixiSHעiEͨ1Ah|DJaP 4KO| բҿQ `B4ư*'ꫮkW]#r" 6yI1 SL[~(l.4ժ]"~ Lk=ҥ.n*,D }T|GflBuO/w6τ%㓬DpIgtl G3?SehE7M8,Ϩ#:^.3z3?Ͼp۷"`mM%\OLJeQN6L6.u 8,S⯼uI|Gc~mhf PCqL)቉l_vc~`sdJቢFbd91`RLںo;²e^|y蛣C0A=}9AxC>׬{rߚVKz'ٰzصG'p(<:u3Sm oalߒy덴^y4+ ]Sg7Ü[ܸ9Yg9yŷ2׎ZҤ*Æ4VUkr\c ,'̴^g;9Cs\ZQ2Ϊf0`PjhQsA-EMz+/5K jT=0N%I xKAuo Q'#R14m 0R<34ӹ2c4+o;qg=,a:%<-2#oޱ;/~Kz_<0[GA?k˶][;3*K.HWl/`׃rڴ鴰r6"OZe~zMʴڊ{'ƺ<< sh9REyX޲X PU&iō!^nvɹ4TXX(BjZǡcgu-n 'n'@Iڢ` !Cf$%zg{ME dq|㩪MQ ֐EJo0*h<$cTQ.1QF1G[\Ǡd5ݼeo"OA@huM<c[W\j~Ay1;8 k~uM_Y\T|):~g@ZC.@oaڲVU-h)(Aڈ?^i_srSx z}jU'è =̒<,LQd1a-&fBĠPf +!TJm`ܚьxEGL) ]C.ʱ+ G ߠ::lS砦qK#gVK|q.lla/'2լ][7xZT +Qcp!ibO[-uhfgՎ?6Su#[:Wا{X3YD%(R;K˹_O֤ɅzDeW/ʆ ȰnK3ə<5hKQaDޙFALVN w}יx ʨK4IgZr™O"q(<*gf¾N߂9뜱;Z0F72larmjE/Bqc硍:cczC.Rr WR+DD1"]Z+A@hZʿM8&@ zt0i0ԣgl E=Je]6Nv&dlq ܵ>7@ϢcR ڸɢ,_W"%"? lk{w5F/hgh]㱥d+7s``7Cb?8ɷ Њ(sWd{C Ǹ-mxk2rRss>d;'\‡Ia]ɏW6ZMmB$ tnL{VgrOϙ6p3`gzrgi{ӄ30Y s?UzT[FTHy[\OzQ q^-u\Ε|ef&X+2zkA~G_SRaVTch:R uA@}Ӡi] C .`Rl<\6AR",Oyţ4ӠrP|13Bi "LxH2r7yʨNs󒹧(:j/u}NybxmWehG+|Ю*S2QQ:S_֚90~ 1oX#b^6TLNf)R[-n{1 lGsşuyk1tl ݐ2^aqF(B$|A?5PQ>;׬r&svgNkٽXvtk?*wfUfGG}ŭL(&j$ [3h8rZU Ŋ QT?%/ Sla6A@hF!mA@؃9>b>'1M2t06)u]YabƁi-sny[>j`4\:W[ͼeĮӛm= AND 8eƒ}shA0 ȠRr56Rҁ+qjL;}SRij}6ws*w~~Yk?Calmr#!Ӿs4cqQ]4?a:Y^LGm(^B$VdVZRbљα3uI(|iG7N@cY5?opxH19Lۙr%gs=xR{TA kPc;Lw$U^7af ] d%@%KF "(HeqA6y9{U[]~ivfy=s_UW:U]]uW{>fx^WQ|^xg-q[2]̿}X"|p<#aJI y^Oz: $7/`ރ7UbOԢ1/Ҿ&}mmBxb%ncx$<._oҿ3? _fr@N"wP7v~ 3;B,e%9)*;$ G3QSsegw]CY>,m_5]n H.6^Wc(QFI˝[淝nk`m5Ыk]:K8Cޤ0ede&,o? _:ReU+rO\.[>P.NMӞg#z5ЭTy/+,r@e'A 3qVaJZ89[Mux|J0[o~C=z[E,0S(r«lXQ:KonHt8L%Uzl /ΛHB=8X 0q69!zԟ5͙|<oK _! )Ü/#79!J%`AY4{M_ 38 <2à}p{Eі}k}|2V3㵉b{͞)/+q~~OEg)?Ӈ.u4 a^{3Vʓk9&]%B %9EwU'Z)-d3#Oj, Z]Jh}a~c,3=i Fu^n9vIEuQ~K48#,|?s57Esz~=@"u`C1< #<ٻ^>D8)$DߒPqh6tE/M/"& 2e7bǙәJtŕYxƃ_.sm AAT~mpd5M]5\cJ ynmN5]595^rJqiJO^N x}6ٺny!)ց%IY~nϽWtxՇ p?sN}ttSc$QFE6}&n&تguLDf 6{,3elE+. E a+;z?ɽJ`̼ 4jO}ntS÷S1*HP6W>1C,\Z9J:NAPSߦp JZ̈^{rgWUʌԑ*WȰdG׀~yX5]95OsP6I=~uۄ묁O,Қ3e@_^1Y?=9<ffv˩qw=-N}iN:.'jwB6EO; E]qB iL?"3+5ZyG`EnmJcK+Χ/K9Eo/xR@^]|W|81KU@ %:,}tBZ3}A y PM0q"hzFz/K"Nxw֯ヲ [[SwGD .K _WU6CgT Chf?eJ㈶L>$F'paI9,6p|,VDlVM,~V>9JխQkU9$?bœs կhQswGE3h6vONA#x\x0z/=Ec[<6:a*Ϙ@=L|@!XNԗiM Ӯ5z?uT UW0˿Wјkk]:${ReuTtAMEWF}Ƭ\\JL0TAbTˈN,p=S=F )0KTwcTB^w~=8JtӍ7VojJ I-]OV.UTWdžh_ziVWoW&?XnBAD$#;wI`E3l]K)ny"\80xDۘ"^un|im=pNt%R~$X5ZYbɔy„lW/]-LG|;??r//8p @N\Ǘ}+_1/~avk_)__0ノqqa21ay͠zscn}{>N;-h1/~ )5q{s&˶}ch,Uzė{KG~3سgO;b'͏;/}2p'/v̆ _WO\~u/13? ]}F}Wr9AJK6,~ _ }/T~ ³KsOO.?Ϝ9餓lfoGOˎy/ӛ汳:kYe ԧ>5ۿ3Y?яj')^{m+(ԅN_g Ys/sW߱1Fo04|d<= ło?+f^BaE4UK v+Q&qe.Wԩ4J {v-K⸺Y($nw$9H3Ih ͇8_'gdfbde>8t7~ՑȜ_Veu)]LQ- [.)A%Ҥu/yb:JL|ﴖH yO_<܉ՎrnI2˪Jt) /x.::UB)[Zӝ1AHIth1cp?8$nLSw]z??,RJayywLnUI&U4ykB5U~Yd(߹sg[@\O$ٴ[5W om޽m)Ȳ_җNy]X!SOmRCU \7~ƟɟFqFh{v딈ݥ>OO]fw\ Yt;cذVCCC]yKԾ X%A~  t nw[ X`~n-׿Emhox׋yo)@Rv>+F`PPvX6XyW!Yر}J>%S(ù瞻9::ڕʠhe/;,&7|3c)*P`|f9cK5?]uc#y-e@Oʌ~CoU=x^ ?] hNs#{=B`#^sٶ楙Fi(̃MNN}@xU6ŕ헙1gyiTi\m(*gpwH4_{k;>1ĩ.?!(skH#E5E%~T ̑Se\ F:}+I }6R_EnΡ٪佞4.^7#0nFwS y]!24. 'K\=p>Kr̯:: pTOWg.b:k3`6C|CMWP᧌ܐE'DKs7eR CTK!bJ[=<_P;ut<{FvFDw;JA@ߙ)qu2'A:SkV?x N`1WPфbOOY%$[Wk^q] 3"2b2Mm6jE.7pF+Jp*󦵤1ڵŖ&ϥN\K`+?яrF{7k1ō<98+ˤ @2f Xyya<|u<gՇ>c#_``"tOjrK'`跾oѲ;ѦI/>Ru'nZk?|k !%qJܶ8W2SuX֖~KC¯O7PVmu!d#c.ꏶ{FM[Ֆ$w4UM5sLH0n0iCe93ukA8VP.YL&),rG;T鄫UHAKKUx)v0YX`ʪ\r0&u9);R`.X&EtH2dK/ƢVcW\ 2XaAbɶSb&mE'Ch~]u|*#PfP4Ik|6>]0_eKEf7T%Jw#VB2}Zʪ[[QZyD^Fڼe֘Q{>l?g] 0cl5 ^VU#XkJњ+Npj@ň; 5"Fe5l2hPg˳qK8NGgvd[Ўl ea:jAlseոq{J5A;|aRa~ ǾR?`C ):I2yn.? ,rmy$2cqKBW"O^"u+\7#׮H_`p("Ҫ |M25d>](_+MG:ޙҽOFߞװv.1qww\7u`zWm } <&K9`^mYZOxoܼ4yaxX\t,uF`f=@ŮHlJܗGeYqs;>;7&dFuUY8NNOm0xQ0Dӂ/4!T.ǂ/42 w)ʆ8{^5_@*#|G%OY!Lpb%wI"Th]4),ظK4NvFJkeIj$mok5O%GBOo=LyD~ӟ@aB9H6Z5>@ꚉ5VYXqz󟷃pLf%S) qwGT*`bɚ+뗿|v9+ʞV*9(I>2MS&{7i~Yh_;Ju@bf+i/ B.&6dI^2azWzMYѰY47"vT(cMX^ X!QEʢʐ?HѾ|M(g1E=b1PEi /[lbaUUw+o׽g;HmYPӟټhB<^ԿCe__^uV *K<N_<Ҫ.Ǫ>fqkX=Bw{;U` C`㜛>.ɬS12(dyڒ {ꜭZW8 O]Cg0hk5diY d/ ]Whee o4۰,@Jvm -,-lY0%ɜAiuƶ׾~\b2xTCP@CųV0f)mZFY6Kh~`J/-ۡ,X ؅ ,,h"k7GIPY;susѶiQbƇC,NNcK:#+s~~.wkS@+mO _RJBWugy}C20z'A}!Lܔ篩=ӇDHqcu܅x>nѳd\*by;0y,??x;a/וuw޳ϛ>$iT-mxiwկ"եXIj =|mUKؼD-NG~4\kDr㷢\UeOKt[7=>6Z{`@մ @%mrEžjoiq ވK]d%zf _?Һs2"|eߏ.Ē7_\VvGC66E%,`~L*:_|SaJۍD: `9`tv-(PhxaJNҁFkE![/.%*o`R>]y*꼁 ꚫܗrb  ;Vqs/889c|&j3Ǡ7~ `E/xXt$/3Zv& \t" fab;$ ;2c_ڿ[UR/S9|h<&n_9jEP%7fhNl)F?+. 0~/HvS"Ί nEyI!v4y_q@D+;8&{e e . d]*Oyxom2eVVMgroq WEH3mgk>F8eVfZf+~Uݢsg>(|Ҩ5QhcnnU!l#gbk+j_ :3M9>xKlUıtX}:p ⑥Hoذu0d#%1X\kYSʓwi`ik9J ۹%|Vޫx+&PX8;Tx&^FIF9g :zyʸ#9??`iG)5bYJOZɼ 8P9ƶ'-:7ƯwY'PtAs@$gg'[YI'ߧmJTl_XI{K;՛}gZ|eqۑ<lUP0C9P 1ҬBsmRD[u0Qo_V>1JdcY[O乷Qt)ge 4X͐dD Xa(C~,`70C-iAL-m O"q:PKj0!_E ;5W3UݕPLH'.;V$+hGm0|qJkTՍ7n|>3WUUX~3 Trdnם喔yo{݅/J~ +) /l":u+n7_vꘀp4{G4s DNDJk+e"Eƒ8DV׍aVD5u ^#KSՇƣKDq)WQZ, 4U %u88y:fCP?rˠO[3UN*gU!`)L0/=p&# Ii^ @I4x0 {ϗcz,,Ht&Ƭ$ߧ!baXHvJ s ǥv3[v1fbK)3 F* ǬljQXFfRcV8cr}|*^X jT [ƪ_κlLR q'V(W(F&\&LBhUDL. `R_۲Y`e[,3νҡ0HP\Yŵ0\'&+X6ǢK_%n,{s XIu>sRw?s}#\Rmi/q @Z fB9R|5 @Jmw(Lvl(/%G+HkC,)}/~:ư 6^|M@.4X ˠ!ӻw, `$ !<a▱|ԁl'"K%KZm| C@hc>z#yzROl5L:V/_ۇ}pع\ yƆ:,PCqL!r0Dg̢N/4fgqRq }P̉̉Bk;..s+g}❆ayŧAWcG,mbn+:mN79/kٖGA h:3Y<,PB8ƕ^5뷽h_3Aregg"Rs3:@4Jdc@aJ+:ؔ1TE0Bg~\0>M>b 8~!bU]uHZM'F2iyҔYCDl%ߑ6(RƧǯ_|? Ob*v#7x}kt^38J}H0KK{ǗO52cff%_.b4t܁h.YH%s/bƧsAua1_G81JFDdS K<~F`,fhϾ{D" Jg9;Z]A!uYd[`)5b*Py{/IHAy֙ӅН9 YgU7%wcSN9u'^x^ʪYn ԨjWʵ>mhcg K& Xh%.UTlGł&L54) x Sr`4X  3q;t7|ŇxOMj&oa(zR[Z,uXBNX$9*# J"%2C t90R*D/~Ϸ?/O:&qbe:0O[vDݭb⫟knJ@>[EY?WgpV"L}JZ&Xn_òJp-П9+[:\(HGZtUPX:p>h]4\1r`MO)MfP6X䃔 [q:ZGq`F?\XU߄͊Dg06+-<C,i)3l5p,ruƒ,RwiOEbE6 Xanjnl\so2/t@m`&L 29T2@ IЙ%b uE$'ʮ^aڇ)oc+&[ΥQF6"CcqML{'61ƥ=JoA?i p;xyMA@2\m3Q81GB[:%տK&cbB!ҹߓ0 0ْA5H ,y~OؒƼ 0Y9Xb=h_SdVCyӰ4[]JWYH^~Xi;Sw!cx&zqQ&Ar*;MӋO:J<U"h6S|핗dvvBU=i̫4C :Kܤ4dս3GG{iE L*3 qyhU#&|}zG)[C8$Yo) /, 9o6` /zY24FVz?K 20XiԑuF7Dѡ}%>=0UEzB6wI8&efT.p%^L#CLg۝$!CM;e]T$i fꬋ.yЄO<ƇiZL[srf,$'/}Kʹ=e>N6[M --\WvL{r7F4$j Lx 7֖ dqK̮ā:Htn_O'a|e4 h{}agG`Q&uL8/];Z99DV:d-B_*6z 9hYmtaq0:s.jQֵ2X(/`&B (*6"JVgl;n+VmGuBʬˢHEŀ.ʆEiGp~?+X 74꩟ͮ \ZCY!p> 0Mgm& :([o1ymEvVoFJ݊L!/,СDHj=3:\~ٍNVe}&݄㲵IL‹,t@Lvd}ǰ4$,NJʋ bQ^(XaaX"e2kEglf~@rSv㷋O<*,>6^y@ c۫3@p/k[( ԳY\aѵo߾`s#O,M `e, #9[4Ƌ9j##I1q袅*dY#E!x2 hX[B~/w^ᧅNLԭ(sxd4!k:>˼O2@{\>m7i ~%_qj%NIJG?'<+1*Uԧ.3 VrlŔh`՚WUxM3ў_mLڬ42Fy 3a(y;fe%ZpMQ.{&GaeY%m2̀&`)C8%aUOfhh?`ϓO9 fcPJРN}^(;<"6yf_IJ`,y~voV\58h^5% m?&K\[[0ӯWJ qyr)m,HK:-eYAJ/p7ʄs3G21TޔR1w\-Ks@[\'LZLcʈO2 H`Ez)-ta{dLK(ԤuR6]?:u0+X8ߕtgݏ3_AFqfqge6Z(} Wp'pػ9PH /f{3H̊9[9nVgg @YDYH 2. 3y>=ƙ.qKq(]HGBa~"?2KPK1ԲmD>0*ȮAc%7׼_?%k, bgAв--6h-j_*/kld˳4 $;Dck}^Zˏs<ŒՆKsh-(L>N ΗiKj~E^5Rѓ=upiqӖ, ,vڄe15^zNL,}iP̀މϾqgh1<{]c-zG~#1*w2Edr_s51~z ᡥKMYRR3nR]VکAʤ5/'bh2O:8kXc-SxX֐xťэUSSvX-LCP#c"bomx(u]/R89gi9X[PI4)Og ^e#ҧ$ #8*ao Q3  kT.?7,mLLtI(VK'<1#g"&u|&R `*$-~p|_~rB`|矸lLt3 Vk7#)LMjۊ $N+79>M\0(ß-=R[xSP92iphBgA].lO0?n~?[|ea3)f^:NRg [Zb2f ?dw|)0`rp0m*FiM4),]ѳZNv"BEGl5jpW)AXŢe̤JH8%C>ܳ,hEwaM+H`18Hhg"@:% ?ޓTZڲn"?ʒt􇼋s? L 6Rfa? \?m!'GM-XC HE9wb|43C 5<Ә AjFfaDRC rj] [jeZZ-Z@,s@ u\~qZZo&d60-MVr[ڀ8Ћ n`2Р'!V{Li ']6#Mt0+L(YZeP!aWVR4Q8CD~!yX.iXe4_:+A)7X-sVʪ&T_L@m\sVE`̘j?ھ|AlvgohrQ`-P2 FҖRƼg)//'lqwDzW([e ߕ9󭤬,dђ*䃥_+WEmdyg;#XڵLحVH >lB /|JVf7*Wqi̽7: gʨm -nihY0=|؂ǁi q|Ќe:z =q>0 @̼ǒSn3wI8ͣq^Y2`U`G~+K ]0(/y1XL G:g׳F,i iaԧlS}U|ܞF8\L Y4rFV7IKB\e.YCWϮ*PgM?bPZiˉUR.ƥww_;#GJQT r}=魧<;* nRwte=(CLYQx8̄h2n3WM39 eA4@+λaVXf<9͝Y%RPKFV:ĎI-e:ル6V(>  8h䳽 /(Jo^me3Ou3/_dڅTᖿβ@6E+vkE Qu+SC,DJ5hܟ[4~.Sl }9n0S6Zs?Cgi'0Kqۂd=6T%G T?فR /JfֳkQkkA=lxv~i@!5K Ȣj|~<1 +Y G8 W[p_Yf:e{Wf %,MC6\}}2Vб13^!9._ 26P8w@G\MLb~ϢF8%;ԽX1#)U#/3c~@Y ~_c"1(F8 >EK*΢)fwra\Dp˧*]ɐ//,*bRB(&/`}k?wF"K< te.Y:hŽN\S}VBK@0YX4aq d) YdO/?wXv '@sSft?v3oS~xp>V%bRuh{㨥˖\"vGbo3гMa-y¹j4kLZWbN)Y<< `.ÜCo%CfЇ%!"oVVn?L8g`t%_䩳 /tI,4&kv-G89̶U4XXڲR2YOV3o=v2˾YhežhkV۴VI(kBI:Ϊ b-A W5 HEbÊ fͼ׋.h:vM |,c9eCvoy 蠕tȜk4xBl1*M 9mK-¶9!&eStxypoCR/J q~/xLg s=iҎ]?_]hyF-j-OOlS&~?ϠQWbJە!rT|-뗋sUdu@2Z~Ğϑ)M¹4$Yqzn{>:&Ҵ4;Qt y&=,ȢmH30ibmIZWRԅ;P}ZLvAõ@ uukS|*e:=Lk5@YsYo!tg?쮬I:(O"w><8ΩIm[ PwG:-Vn[ 1St2]RZt837fs5\i3M_"@ŀ266)C" L\H60F%(e\鮷8aτ◼xAҩHm9V"gUd*+a;DR-of~07LU<Eďd%c QoxGrа_I©~YelWZ[V(r.[~KI2A}Q/|qC1E赴N2B-#%[mF๸ۗ~ʧ1?KfN3Hj48_C+'g ?VEƫeݞqY@P='ez}iBF<Һ39ԇ|Ji_H /fK*qX00 Jqeb[x*<4y|Hixo.x쑮d(3:@qf1xVa9Vqb@c`mxbY?#ڟ]z΍qU> z7y8ƷlAGk<-ƣ}^?Q3n |V孵WN:Y:%Tv(#?;W Qx,1(v)Mɝ!V&~ָK_x~SKBo/# ΃:"Kre>Vܶ>ȶCzY1 X70{?{LxViMWDI 1[ʄJ.paǂed_n&GNʫO/O׿-c~]ԼR|r>y>_7LF!B+- m#o T2XDsprRetOf2Jl*,nLٱ,yS YwcDQ6JF93{g1~l [% #'qrVV.K6c-E悌lc+ϡyQ?\^o\/Y.,0-tm[ai[|ke2x‚Ìg?_~AJ,ggZtwO(%KT [:UDɘfْ BSqاa򒳞 pSuI>Lѵs:T~{$Լ2t^m_/9U2U㱒7.ڍDIu= FSgN.O t~R`_~0N\^qc,:pf Wg'(a_az Bƿw;wCfq OxYI.MAB7Gկ dq_`(Xb%H&*?яYdlUxZ}Z1K {_VWȱ<4iQʎgΐqvUu${\n7O-xQ`[b_O0YhJ<+Pp/^g,H\Ĵ]fv$c Yby 3,}t"o%ڔ]< [t0sKgu/bH FZz]>,`R2JPImw&(WMzKPj-~A1nUI4){Q.ʹL>_ga'oC-͏WZ4>9hN*21ի^5|E\pShjcՃɔ%7g,ҫMN տXP^vo}sg% ܰ~Â$k] 2^Y JWC=m'!%{la1ʶ0x=4 94y`GD,hnHI)9u [W-9g7u ΀\U* ?}X?yrJ_bL*am{s_s)εJ>~tϘUÄˌ~"?>/w~ @yhˌ[ . Ho )}b} 1p<+>'}U9k^VE_|}^gS4\BfBh2wI,LZ޶&+Y0Qqm`ԢzCrӻAZRX0_48}.ve5#UB M{Pn,P"Ytu6۞Qt\135P=P]aSuEL OCm^W1BP+|nw;&E}=]*^g^y,,*&U$RVl ͲOVX{NҖ,,^V/?U"(M~txY{@R$-E솯g&o߾>9 _g:0Ƕ2SU*ɐ0&*/EV>lmckMQ8@ bj,Ūfh၉ VzYʺX%i9 +?ҙ d4ԓ>ý ωք \{GɋB)K2o<ޭjr:؅V/?}E`%(k);o)jϊ&AB@Wq\|^UHڼ2y2<)ӻdz_}!p8dP_AožVNm! }Zٵ+6kPR9EtE ^ʎ)_{Ap}Ca?,g" qѐ٧q-l&QE 4 (c@ځq(0֊<:ho0Δ  @!8@rg?`R❅-D eoP;84,ie)o]+ <ےq04q )C>1cabXimv5,uS ;8@rY9"f2,K㺱}g֏Ӛ[s2w>Otkv53.tQ󫘩.:NB g*4!_x|A)x;^LV~m) l@L[*ڀh7 Ii TQܬ'mu,雘Pp4% `'}̊Zeq*0yiOYa:hza7H #y5RP٪3Ѹn>qb|WvAv*/-D ঽ~j -<ޕhfܝZ> iKĶ$o>x}Q["hZ{vHR0I: }55 Ir *҂0 w:60p0C*ԡ:$uQjspڥYBa_< 0GQ>S)>-я~}BSO=E+!~ZDDkb_GAYl9rw:%3Q,z8\+U1/h #+`LǤ)V᥉ [Żl{ÖX1̧[2ZQ$ %H_FNSd mšlژ+H][-؊ 0~VynYʚ{~\3>Moyn/ @T3-CGAlx5n{m^d2MHu>-oa>-~ g#H8=C  (CƭUY.ii-`>ԊpɳztO o~~vw<`rט "^8y,plNI%y-ci+se:x_'>,.[ۚ*Pڋ[֥ i"ey1Y7׳6(?yRӫ,Ì~:;z?h8*Z f~ZƗ4!/ݧgHI&m ۉۜ@SYE҂W#e$)%gY@Lnb=K_>/ndXX+KMqp#ͭ=5J=dG8qpܜ(є''t~t\CCQ2Z:]F&78;|WKSzL5 &Jj]7n.ֿv"Qy63v"qOsŕǯnJcLѩڻw|wwrOm*'f|fttHMՃ 'R@=qq}QiE,GmE5_K Mg 6nzs:#:3Oȱy}sVVP:Y}AwϚ0~N۷aHܱ/̣>iOҁ(<nIV;a1ѤY+AlmNj>ԁ6l&_3}ۄe|ĂUhŖ-OZak5 &Lޤ u)wX+Xg k V7aE4]Җ&YVą PXW\<'mI%J6ď~{' s(%(=<>?X`UCɫW̼@ї|qb6Ƅ->--|--X](wX>$䃶 .qC8_h{iщJCgC@ny{'NQ.}yG3u>-1-|1F^XtL&/eO+i}#/e0YN5;9#B+1hhX?Zi9tB]Nꆲ$'ՑUEGb6 j ,ph{lqs^<@x̄sqƊ

"0.R B^@3%g34yWw^P PKW%VleV/5Ɣztb&̼gtx #]H'OÅC6D}^{?GNy{*PV~i `ޯWP]*ٮЄy ioבyʭ>knM5`rs#ϔ۶)S_/_e*e/C~2iI94~|a. '}f |ɳ`A&-ru`}f}Sd޹&!q]c5%N7)i/࢓;ݑ ).wQ(F7lYoYl2Awȫ^??Ͽj\1)жFZvZӱ2gBrSy鲕Xmc30c u]y;/)R3 NjbhamG}˼8gS&?<ُW[=L8sC~..g[٩*nIS "ydFX6$S1۰u:C'԰-jEUʍ;/?7Po]#\`$.B^1!#]|ƄsU!y/#-x>l86{z31` c"ĩfNJ0Ǯ2jH-jʿLoos0Ǘy>z6p`ncsﲩ}Y Ņ=ذ)eN$ W[%(IT}WƗFpUH́}I{`cHXƷ(јZmϭc'q:ϡ 3N:4cɓ^c:1ֆ¦--T/!hA&X- f/_ÄGWLݐVU.lŝCpfm(c03@Ow8|Bx`~εm0?/>f՟;Ӹ<.uܐA`\d iþ$^6CڇlX1F آO`Tm8x"fJ!\ҶfW{FIm6]?O?gmު#SMq d^=eƀ1`  cTpƀ10 Ai\y:'ə ʘ!e^Z7a8đGʧ;S:ִL+1 ljguNBC)yR>VF$V$QuTX,?"8ļP~$'6QrWacNvYÐ*8Ʈ󫒲10e }Z"21I96_dm|XUb5m֗X2G<䜓nzWϑL3=g5*TQ"y`Z j ^N+u71]D퓏r5bj.RG^Y;_hQOAv6cgETj&jNfN} .:艞 d@WNYOβ9Āƀ11 wǤrF9!\-1`  cZ# Nź"cp!;N R}|ljჰZ`E'3'ƙ|~ 5ȯ&+qRM$If&t' &_c <WX+L9kjPXujnz( njQF5"я~4~YXcjY _Q03cΙ[oՉp;Y\\-@Kr;fz׻ց%` ?]ׯn7yNU1` d2kpٚkByCN:;jȘI'NxDJn*ΤG9s Ƥa_2ve!mNwk ;>HRŪc)+#}{߆/}Kwz׿%F^W2Qg4g@p-nX˻lmkc15tURLָj>uIch^S窏 wKMǎq6h;\%c N\n1 ǁ}`8>Ʋ^IH˘R@ Xaf "HcröHԺWă:k6ssx]a4W*U1&.#N% I_stNa̦]^ydwFޮt.҅P5y͖~LD^qst5ZBQ KiyGGo*=c9Х .py睷p1Ǩ;Vyc؆ys? =6o,>YSTq><`o߾i>яh{C87}{sԃ>x3 icN[^:roY64?wC@m@އaaDflj3||el5kANҮ̱k.՚qCRe>Al''wG>G#C8ư zոJAHS'& 3@xK;cV\ E(3diÆnn9c+M .@/| =+yV-OdK}Ϭ˵~''V\bp3%?ۜ9~Öa 1ǭH E矋N5[6qd+1>-􌗾Y&!~e^nP O.~(D> ek6$L5}`19.W4#v S49王2ww19/Ft-mӳm:xa '֝l1v SFٺu̮]; v==җICgvB8g94{ݕxTP_7n{$5ҡzlN ݻgQEW#}cڞviʅP& w"sYzvО|0~M~O 57| t2\xA>$&+d1A;?وO¼uDq7 v-Y|"ªi;+?k{/lK#6#7P|oa9UЕ.B#Šfj4o#W%P1š?>N/rwsO$l\Y<'C< o޵}E t}{/ oqUlR[pA +]4b[2f?x nmۘvLEG?z;ѳw'f8MW@6V~_Bɍnr۝t3MƯ}kT,''ճsb63Vj١a7$u2YpYw$bb56_Ӎ20-hfKrf>6rlZ2nB^d|Y^b%Nv#_NBf 7tls:|z}[NE*/Ē1f4o5F2{[arcq".3}h\E9wOtH+@ 6tl{FQqERVV8~ 8&1?Wm؇KHa3TPd)4|ӟBw5_93s|ȡ6,Pf5>8K}m9 gϺOQvU(=!a O,U1y9]k+Ws9gdؐn=Ay Hx3n[B7okzcXk ufH7vbڈ9:hf[Y{5W8㬭~mؐ#j_ 51د>|8ƗW?2G W}? Ē>|:ذ-K;Bp1H\ %.̀jgX4` L11jG綵W^_( YܭKu8)s~<)PxK^8Е5_" sQG/=Odx{޽[FgO]r%fU@G?:RdbZ C+Hir|^R 9/7 +#} bȹ3︌ް_u]7׿~Y9WCQŗ+.2Sƀ1v(mf# Ϝ~_k Oϳ0K<9.}C #2[j-y-z7H;AN6682`e=]1QMc;DUEtjQ U[ T'\?x7}׹3T9.vX񌙫.IOO/؅}.* 8ŶO@a!.fFRoJ> OɅ\BŜ#n7:#V%@ϙ[\zz(ez*]tO}__EIa -=D*o@4|os,+ʢ sK$q8-[:z8W4Xs c}Y_Z.]( ]0ԺX:Զi3LO FAk //\dl)>ɮZr6c3l5 ĚHXqIAKSӢV= @j<*p[QèO皍88qPh2 UQވD QUqbqaɌ|/. oOOqcV H.#Th}]Qbnd"&y UWw8 J+:ٱc{\nffp =1s$3(|T OӠz9*p3sTpBRL]ۼ\%e|G1 ]e@=V@σY-po׫"}f\Xm9Kܪ lo//yO> +c`U3? kFr:]l|Ι n\ܧs Ȱcc>4?΋6Fb|6?0JxchY~g]w頇o8i16yv,C6FsXdX^9GmX>(8X*1t|I{]Ri*E ;Wro|+cʝ(o0zV:~pmų) ٯ[nnL{6m\*tkzc`Dz'/e_o6G̏ecksX8Cro5m /!PEW 5JFC}mBv19921)%7E6RN~v<wpmڍ.hoXJV蚱BEJ? UEQT:>k3 PXױk..۳$즛n[Z=~z{Oz7tk^Mxu&z 5Ѣ Hk_PDAqRYgjqLsBgK/b^'=i]֟ ozӛ6k&|![!~n-~Fi̐oyڹ^Uo1BW1aЯ-M;&=8~ff w܆g -Xx4 ]8kƀ1JY`;ƀ1ko$*a[ l kq2|n\9V,8B7op( AQURnZtz-l6EUY*‹\/r8:l(\`SJSoM`*񎧲6 z,uCigl\ņ_lU2zիIW0ovHA.R4{W|SZD@Jj`E_BwL-FKx A|fiO{NPxx- <#Av{k 0k7m4~w 9%zF*U3}sst< ~5ggp?!ur}hz檫71OW ߞ?*=䓷gvi[Y4+c>񏯿[V>3±>mPkZ>3a.x!/| ?akk}4[chg޵Ypf̋BZ]r>xh7y~Υ vΣ4@IDATNasW'x!%/=li*'y%.fGXMz~8ı3Z 3s=53,mO%ưYFsS_&uũNNeYX-2vE9\A! 7.wYgU}hBF -I=" 0?Zrr_cEU U)z3,&o\Ї>t7q5v9z:l(wE b}^[ZtG>򑻙q"̷HI}nnM9餓-|DE%*"Ukm7KKeFۗ1r|{S Qq׿n+p9@91 k [n-8}c3`Ua gմo$VƦΛ}J>Wa|>A9FN͇1?F:)~ORe|pKu;D,NEd>f}`])SP^s RC팊 tZn~9zj^e T{?y+o:?ib(EN!WL7ʅn7Lgnq5s+c_uy-\~+q芘TX~nA+TBf|~}2>/_y}[fPI~cy_|< /i!\tnJ4~R10@v"X^};-oK8kƀ10 ූ܆\Wߜo-G^Znqf1<9.ϸttb0ÅI}F/]t_WbNa5Y *m=F];\Sx]Uk g¹N34.4?1s2~K}g]{5s| {|=ttffWѭ;X~gvׂ-XvGb7/͹J[+<|}8Fկ~u[N8](`_](6}{׿e/>dv'=>ѳjn+a7P1fx~/p'> -kz4 .뮻3@c=ߎpe㊡nkÕAn_ZWڱďi?s:0gYfko.^g'/9i*̀$' ]Sǭ]uqCqF p7FK԰r8Ku~h .a]ňu`WPt6($AQ\L2j u]R*T!0'/ <?M(C)2z;Ͻ& ;7|raF[3X 0[ v){\1~ӟ^=}cs]~K~1o2PqTaەX+J8믻n4 |#YGo;ڀ[hpIh:B(~ᭅ/)oooW՛B]5~*G\Ӕh6?>38.mOWe eN98`Mn 3 ٨s>^. dv?|BUu`7̫ؑ#yL]y9;wa^`C_۔yBX+y^:ȟTvՎg?S57~͐p(eǺuea;ry)~a)Kq!T>WgnpnHA~jx6[O?}ipKngqo*6 ;yh#NG2 *J솾+u|8)ۮfOt#n;n/ځy~/df*<ͻ!>B|;+It5 {wW{v?s">O/x=GuGoKr2PWsuvR(7>;˜c0 h/6Lf0 I`/8Nx|tk"j!r!L9)!lhB6mr.fzfGl~0lNfv8qv7SafмRaySCIzP.׻8]b4UD:%Ta+-:B' HcTn墈#p[n{?Dysx;/ߤESe^׺!Wx<+F/w\~^ <6趦pi<&PuLLurD8) wk3ZTgWVZiH F =` !՚W$e-0}}_l#Wor*\z)Cc~E-}n9c`]Gd~ElzKlس»qbwGD2k^?# E_{w L>{薭oy[":w{=voo70UPzp<'3%,мa>D3 o³g.2@ -Kt̮O|(r.0WA(x# QhrMEaM4yVǸrZEpմjHd_̥GV2=~~x?܆룗Kk+ׇ35f`>K$R5,Xhk;lm-?aXIM|bֈ%i>_''\Wb9M*@Z)=$/ZAt[~t܉}6&.Hu\]ܭ>DYBA65,mE)yF,SNHܹkϕ+9܆+*"%lt { oL($|_\?ZUxhC "jD R5e7(:HKARwHBT4nK;QTz_^g T|vv=5]Q r,Qcnm>(g>-Y,K橮|Nܮя~tnW'?WUiWz`{oz 7^|lVZ-L7l,NϹm?okGtN|~6c`%a%f1ޘtl7F[J(ALa ֔Mq n\g'dX? gM/\%ub4GJI1#ku6ɀw_kakd cd+'\x?u佟8B7R8{fy\ .e گyc~#-P?n9SFӉa?CSȃ"i'^x 70ŃV';I; )GVY*HOuTcJ_;y{60^Q9ӷ3Qٵk,꺲?#qe.Q]tԧ>Hƕ,(Nj qbmnBQ xӛj * z:\Q MqU LDrʎ<Kx1xߦSlg1` ՘0chd3(ȁ} (k;`te0o힉>gؕ3'AQ ӥ4F}v,Km>s~7]9Ue,+!]`*\YzUR0Sռ~YD@ 2iDTĐ҈  3tt6ŜXٲWjnT,X<x2?8ʍ^qs_6;3Tí@'a?g_Wmk׭_?C-ME'=ɻd EWU {~Uy\UW*et`}0aaI+t:mXa>>C,u {.}mȀy_zI[Rd#ǡ>bTCOW.m|՛NpKi.EBSvkŝ:)L}fU䣈-J)emƗ(I5 54))r,eV8#Lq TDLJ46` '}5p˚W&'EckXc0Ru&6fum9wۮs5;c@2]lg`/Uw2.%0'e:gux$66=ɱu4Ѳ d.J0:8v[e_>Lc}sdb9_qxmnCq/Rw:-.nz jIDOȪ"сա  wukWi1Wٹ&y[- _[lcjXkkоJr; cZB~zs /]NŜ8liK_9gJ]nsmnNuHCsh"+pS>Y'~~n<֋.)m*F(ЩL{1Gcc!_ ,D y*cXu=x#L` a`'Q``rmɹ;> qJ&o*Fm=` = KaF\\\ui{/>Ё1)ƢK[݇oq{W_{=?7$@O*vk/INˀ7sīJfyq>@YIc>/sr=>B/u6Յb9qþ7d"Go<`!&NcmBSO嵹R1LL!_:\Wd?8s+b2i6 PӍf_XccU i4@BqtCMQenؚ_ |N;D S6TJ9)\Pb CaGŢO8p4T aQv/D¿u`@˟ͅ1FC@H <3eZr">ҭiZ[id|$oR}ί-?`{z;*uþdK̍uج̣VڲO<~XSP\s[)>z-魥->dRz̾!M8c9ڐȾO32}LP d{nٖǾ;͛_oq:Í'-qѨ-,= Avt**hn L&kq˭>}*Pl)H$ƀ1` u e]Ndt& 6% 2}'1(!eC~5.ɵ,62bZ3U3\qŇ6nx7&8ײh)` Bdy4fj\1k+#T-Fr4*C9@ჽwpY;Y^h,Vâm*Bͽer .bBr3^Ʌ&p #)qWC&0| c]xues'}/]<̷1ƀf3I}לBkI?|Ꟍ a#}HeH@<`㵃͖bo߾;9+qLJaj]x@c})6qHכ8^c& 3v%_`sLfDW{\:FώFճ/'PE% pQ.{JB+5uqka_S/R^ڻ>&_ic د{#A#<(nCAR'#\Ӱ5@hb9MhK?^4Yvͅ߷c`/,e*m>0'u>&dt3C | z_}oYqm6 Kr>}Lc8G㶏}M\r|ء> }>i1S0[cH$@0\Eu195y*2%А,2JXsl+ZznJeͲ&FM-4`Q ; O^N_ 2{06&y15@oɎ] s;w}w"tcƀ109Gϖj@IcDCu7>'W'Hc p-v<OuQ,x~/طE#G&92`yy::n>6.'N[ǎ{fy?~#' *ؠmx)*+;n8DoՂИ}~K^|% Be`7,ͳ1` c ƴ~aQy ˿ccm9qB>b1n֋(K[~tܲNYk}6>Ybv1OⲟDާ"6rc2|hYx?t97_؁a S75hbuy Ol43J(E8>0H9h 9F(y+,klMcvy: 7h Ѿ"7PJɘӮ_p 0V 2ռN)0[qo 6ϙwc!5aLhi5m~+W0tw W݈/xsb?l$nǎ=O?Wm2ƇmI19o}dϏACz-cerac2q+saYN+g毿zokC]ncOu@]\Q=RCfaƙBW!YT"5%YㅭKֈΊ/J!𪫂Q YNf EcD8ۏ#>$BE^G.gb%@[kKs_4l +jr3seP,Ҷ]bwq{cajS0'˳=,˸ż`q7=hykt;ˑ \b gTʿsT(nMkk_͏-\eDĺ,ӛ\㮠)sB#z-wҞ@\XaI.ԱH x TĦ#*j "%_ǔ.9ܾSz-/ok :`֫!&&'x Wz>}oΝ7l0(N͙cma1UlI)Xp[f~BO73 2_HY(ǐ>pr%O{^//J\Ϋ6 cXNʺoa*$/ϫd?nZh!OeqNb|}qq_1Ɔř .䒓?'OѨ負c!&2 W KŌ*|Z[Œ˻Ps ˆ1YzM~#B/9ꗆYƀ1c֠+֫h9G}8?Ǒުik*ű4s\sYG}4} w~(#ߵEm·2qO0a~ Io.Vq*1\LG1v0>cyg۶mON2𔵴Laʲ^tV|q)5k562cnL&Z̠0.c'[i'@~ } 8w>c c616Sߗߨx>ɵ,g,2jWH>zfv};쳟rnhdaOÆ+a6Rmۓ-LW&ۗ*w!IJ(|^N.x NKu~" +y>}L:ns[m { 6z>x#}dXnЍ(9#:Ҁoe8#xCms(ȰF2>\C2*u*љ:19HOuD!QCpZ i*<>(9 cFK%m z 1T\^;ZaLfu+i&uY>9uAbA{6sc`jH]&%NlE!22dSc9t^y,B~ ƭ̝ 2[s'qWJu o^Bl-p?MadRk]؇ Ͽmk g qMHk>r}Ve1cŢ0Hܳgx;.|QG}GU Pot/D6u%|Ō(U"9NR캜YOŒ:1y߈$:*?lDj@A&#\ Ǿ} %_ CV?4iM +iֶ&uYVgttc(ِs01 H]NK/勬79CeeȦr X8΍[z϶[orB3x3lhw-8~[;6Gc6Z16w1h3NF5Ⱦm6!OeqNb|,EnCm q<!޸qs tumpXmt@#QtQoc]+tFNkn +>GM1NZ=n(Y m(:MX.{9jo5#.Jq?p}.{MG 94uo]ֈ <G UAI-y/i17?oK/SNFyrc6#e~ }l:uʞe!l^brg Ϡ&ɵ,6N1[g2ݦ`&: hH&7Փ8ޏ+O,jJ[/vAlx& 6,.--Oa_ؑ Ouv#GG!3cBh<װXC sh L7MX 17P)>$%j$N_*px΋Ȥ8i6>$kȁ @m~~OX2|;_:*qx51\a9EZccYM0R'Ot_!YL6:/qZfZ3ضO[̞rA>P|FQB;=9˅i\ 9!4BBɊ)q#UxRWC*dݘS}O 77;1l㎚r@V3,mNx,GB 6#p#VZb? [& };(p6458p*dw*g7'hF;5! :P *QLƔ)tlhM]I,6u|*PQb鍊n3P+bPWnclM&֥}Ȱ܋6ESu3lBzMrasep?0>O+i|s@t,҂+W!GY ʰ/a_sbpEMpbXX\\I> Zf2Fe:ȧ(R9VX(vX)ܴLj$F%#KA)I(y}bGoTQ{ӫ)Amu&E;CXJd~h+rBu }S'.arE|tJs-~Ν0U4Ec*ۉΣ,te6گ˹CNpgۗXaRGda8p֭?xskŃ|llm,g>և"6~N1&-$ߐ1mz=G%0o }6˱#_s+ed端g/MN'p]N9Sׯ_؄ 3Ɗ3\ v^MPv'bqkTW Vi./nA݁LROŒ, }~Жfj2Wr-SC ǭ$_<3̐S7N#OM2$}{ŕMȵ5iNV{h C(]%[<*<8?Pk φmCLƅzmFpl{ĸ?ѭ\[򖷼! QAaY[i;|Bz)}=Ö* aϗΦ, ˤkßɱk, ܇e><븍aru>Oچ>c>thg L  C_$+K+m˜T(S~b벌K}r]~d_Ɛs# dƙ; k.+ew,<+rsu>bK&^3[emK,deAmmMLuzZ&DzRd빍R01{.Ehᶦ|zQ0+[ofh@eNYK ^J{[Ϣ sJ5ϱ;ѥ Y8aE.lؕ%a[ܼڬPwЈߜ.^Qe1>-|lyD&mr:Ip@V KIhw{6[9>ϣkJ9$iCwŒrL"@k8F&'cR3[ֳG*ɦ3m#P߇UH#e0i diⲌԭc Z)\I A+d03e}I'myNPvq+>EɾVu_a-S G,Vbyu6 .&ɵ,g,9}6&_ndox(_;{= }DDҗED.e]q˓|7ǖ9P\NnX_85dz cb4Fc7stl 4}3p};*5KPهG\윕Q($915ɀ^ Gpd @Vc1{ʱk+kf:߽+J1erL9hZROM'm~Y>ir7Xi=r+oir6oO<ųex ^qM]um>q)c2lrndo F[9퇷.)6!Oez\,ԗ'b:_I$B=˸>c\]_stb9,en}XjOfk#Roò[˸|2އ2ٗ±H3{;}?t{uxMօk@LiQ~ =)( =BT,I"Je^C5PZ=:xeaƃbW2!~[ %YβBQN0^q^7cc0uBM6y8 < m{/JRyc1n]q| #g>g=iL09o+-\ 1qC:YVm鋯|+?}K\)O/n R ~އru99IluO&s^n1pmzK} l>CX)o1YLXm}=mg,..Νvڟ<3pca+g0Gظ@S+[ G^V.nz!$p-ּVEB~UaL~*N+Y١9h.1<"J8 3dP&({)-޸cLo @_h\L6+2;-3 O J4-yHߘz~ϭ;W8!_Q#NRDr|g<`=^PPa-cv\ٽ{zo~_}k_{ g 3KK!ユҘzlr,Z2a Mg9mzU{ ie_m!O&X|} se9}d}|ȸ}hp|xqpͭwݺ s s[[qEM0ShhaE#,nr45T: I3ssڏNiX./Q;kSi:wqOg;yb-2~ǭ)NlN=ָיI̡/I`+0P\uZ|15s!KEj,"܆{5:hP,8A2h˂2$Mmo/\3%P2h\|d1/f#69-U:'/d?fӵن>yLcxǸd>J뱴AEW4骙ڴizr}hq>XmU4Q)c0c0cX [R+U2[neP|AQU2| BBt6e=7 ץm|Y 9oζ "l>eׯ~dFe B}kc!"HWmeeXt!ɍc0c0cXm ss_yZ9s7ȸO9qV6;2xԈV^!6Ok\Xb]>>2jW NGphۆk[Xƀ1` ƀ1` ƀ10q.ANS 8t̏g~&(Ğ!>d~IL[ߧZ&X_뺌aMQH!9cvIo]dү쳯d[}'[}m+u1.ÿ=g}7:+du HbM f ƀ1` ƀ1`  Es'܌&s|MLw^j}>'DzxJ=Nn(jz 7fIJT'mad1dcJ6!s. A8uQWwqGB76WV}IDƀ1` ƀ1` ƀ1` LyT/ p&7x}bc}2}3[g;X[i/'ǩ8i< DM a|Ro>䨯?6?>̃oiy׻{wc cu;DF1` ƀ1` ƀ1` @n!F.2]w 'toaPbc}GmE&?&׺&˲W)P:J NpZ&|dzKX:3y>niLU};-2ÄϵG|یc0c0c&P:YlǧrWoߎs3<=rs7ɱ쳞[ ~,5"gIDAT]69`|vU UA}ȱ.d2^>+x-7o#֭[7/)xr8K%]|31` ƀ1` ƀ1` ]>WI*.[N1-6:vR}ncX谅B)rJ1TGʟ,@0fӇtZg,m?+Mos{N;! mI}nwIl'bƀ1` ƀ1` p }h,P !87K.^[χ>LXc:qؔ3>I I7k{ 4,վ|&GqN}'X=ho,eWhwXxӛ>z mEPܦgܴ2Iֈ 3 Ouz,9l(fȱi+<lgoG~NCx6PÅZk ƀ1` ƀ1` 40 0|>Mbp7zO<̋{ϕyKIÅ~LqXly>}ۘ1SʓyN'c]M r$N1gs+e>>b.e@@pkٗ=?zƍ,+4m=*UQac0c0c]Է'|m۶m;[o{ۮ% U2ZFor-ǰRo#6ԧ5Fc4clڦَې_ևچ,Oƺ66ɑkl8!C`C7s[r}yqAon<{[hƀ1` ƀ1` ƀ1` td K_|o}[7oٲ-aE|W4NrXІz9}vc8K0as)$ߐ<#/O䓱MaB:-cer,+ucnsbN8'>& m}]?h;.TAYF3bcc0c0c] /| ;~_<.E~l'1`ZKk?R׵kC ucw]/iMPVƀ1` ƀ1` ƀ1LvVJ}߿{Bӑ'ۺ #ur>yLcbTĭT܄bk]؇ SH1R0mV3'c][j}X-c |ȱc>rk/|i]2l:BZ c0c0ceu] Zg>ϵ9rl:BiZ4G {߭(Ca|: S>㘭ԅ:.$&tYȞbc0c0cX)'-IaCzL>Rcُ$.bIRϱac:%ؤv5f0m'Dzc$Nc$Nc6Z2aBM=oz>,Oiئ71` ƀ1` ƀ1` }NSmc'OiLl8{ԅ16 k{bJf0Ix_3P?F|@M[H!9cCv7c0c0c`9oÆ9rr,}ɾ^BTm2k1i-`y5ϸVr,'}4vrn0ͅL2t"4&gNZF瑃 a!]hF`GqG21` ƀ1` ƀ1` q"3 |2m'Dz[eNG1\WL.1+_ &;R>1=1R>LHEXk0c0c0H ar>l4w1?jO|x>Ad0NSdmǰ1OV}tBZ$2t.91` ƀ1` ƀ1` ITċasu>129>?z/жZˇWD> &r܆ S>m_OUh؄0c0c0H))61LH瓧4&gmWc}0RjPABm'!OUr9X=\[mCMbr|ѿ9Qkƀ1` ƀ1` ƀ10 䜠aCz'KZ)i# כΛ!yqckbad Z>;c}}e!{ȱLӢu21` ƀ1` ƀ1` C2v"bÄt>yWrחWgjd.̀ԓ.WçȺ`˾6}uεÞLc ƀ1` ƀ1` t0[hÇ9rVljY84O&$jj  &;R4&6ih}T\ȞIѧbO*7c0c0c` 9OmÄ>yWcper,mX'>}|~ fސ'9b.:MLc>lr9rl:BZmȢ66c0c0c`=o!OUS>1!YJ#R>wL $ t>/N8ŏiaB. tr󑺔~_1c0c0c #IBezihYqOA_q+tWAP~0DNC"6zs gm:r*4xƀ1` ƀ1` ƀ10= 䞤c'*KӘ1>.'}p,o÷DڵTabOUb1z5 b>:͗Էڷ71` ƀ1` ƀ1` m =Qϱa|6]e)vZ؇ɑ-vRuh6lL]e)vCau?+]hc$ƀ1` ƀ1` ƀ1` |X)&Ww )k6Eöؔ_8:_6r>鱏Ϯ,d96_^ۦgl*v(?!&7c0c0c Ād9Sb', pזj0sކCezc .{_6Sc]ji:c0c0c0VŃ&WZ๫>P>m6zƵőXa·>񗂍aB:' ߇2=+dE/B37;j]KS{1` ƀ1` ƀ1` i i5*O6r>lWYWў'P!yn4%']sNS1LHd|}ؕr/BSmӧd?ŷ[0c0c0ie xbݒp]&|i|BXuܦ``٦sf@h`}}d]1x:`K1` ƀ1` ƀ1` >rN}R+ÄtC}>T5_ 9 O0'O>rl>ۦO!~o1` ƀ1` ƀ1` ΀s]&r>O䩲{;Ee^j(`)'1LH7<LJltc.lm /4ƀ1` ƀ1` ƀ1`  Np/tхl|Txꋍq.iW0月`0!89sm|ɝl())%ƀ1` ƀ1` ƀ1` L;)RlbB9qaK>q_y(~0IaB<7ϑ`Cy@-׳n1.Ϝ5c0c0qlчls9XA>O{[Hٱm]Jf0ܓ|&cyl|\1|]-X6tƀ1` ƀ1` ƀ1` 4}NSmp1}]&Gϰ lCv7/m{ba CB-og>oyK;]0c0c0cH9e%g Ӈt+%m\wkb.`'.˕wiӥ-4>13c0c0c`ZSȱm]tCڄ|1ۣMűM.i 32.Sl0]1.$ņwm<%&gOƀ1` ƀ1` ƀ1ЅqLab.$!]H&f]+иhNPشaC!yl]lxGbl|Iվll ƀ1` ƀ1` j` z26l}6$ǴBfU5f˟{ &67֮ I=Oac1m6=L~ll ƀ1` ƀ1` ZeI]Mc6)TLةܦ0r T\fK[6vʏkcc0c0c0VX"'\?6ܴa[s*vcAi,`]OSµ>|B;WW|RqBMn ƀ1` ƀ1` {:9'.ۆYi=ymymƏ9xx9v)6L\a)>_]lۜxƀ1` ƀ1` ƀ1` 8Ma0mr?I'jmR+f|'}ئ`'IY;WW;7o_<ƀ1` ƀ1` ƀ1@ uwP?0)1*ܓ\|_˱MŦ&)slK_7c0c0c`-3зcMM?%'9Xᶏ-i\1VļOTl .gT-ǿ3tƀ1` ƀ1` ƀ1` L̱I`0\ &Әc+ 3x\T| .3T.''i3DOC7ƀ1` ƀ1` ƀ1X>qsmSC%T҆}lXR }NsmS+Gj);ݐR0c0c0ig`"@_96ؕgc+事P;6?lOϤ۷ƀ1` ƀ1` ƀ1` e`']ڥSqu\\3Kgνbɭv]lsl;PN.l!|h66c0c0c`od d=@P96Ӏ6ek [p'~yhsHP>CLn ƀ1` ƀ1` 430b@Wv{[v&Eʱ-\$[i(gjyXW~'>ucZQS>CK}mj?X_ȱj, @^ *ޱjW{0ѵ1Z~1s4&;֌ںR;N{vz3 @|@ PkVm]e㔺=H>Z3jj/NuG}Om5+X>#@ @Y =uϗl+5"zG/f&WژGғRR:v9z> @ @QiRwx-u-562dMn{#'KONKmKMq-kt9= @DJjoOm8Q9^z~1s4F>ޜֺq+Y%ߕ @whެ_@Df֕)G甼i׈vDF$@d?Y==gϨs1z= @"jz'ko+2zO/fW݄G՛[SKSk=sVK @@@FnЧ?GfsGmrr1[%uD}N @y8X%|G @ qs1y| @ ^ |~5q>r#)goҳ+ F?zg+/ @ @.)J=GlGq)9ijY @Dm#1cqIèq%̞3X8 ' @ n~<{NSe9/2<'@ @ pØb}7  @ @A@A@A@Aq3x&^    ̈́yMΜ$8f!/   R"p^3 iqc)/diKA@A@A@XixRf%++B    ͆$eVlJ쏜x֤ς  "" lŷbJ1rWJ?W[ar*$ł   E`juo^J=soA@A@A@8hz`޴6AެZ ן`ΒQA@A@4-&t5lY+ţa)A@A@A@ӑ Mxf1ꛥv.vF?    xh26ff9A@A@A@ohx $>/7Ҿ   ,!t-,c_.B`]{|r]7Ү   4b/! P.xڀ^/JJR_iGA@A@jXrcU]}0K6Υ4h.JJ.iFA@A@B`Ɉ:FXԒo jkljԂA@A@A@Xuivʂk) hJ\o4K?S*    Ԍ@I=k~nE|WD/ r ԜcZ0@9A@A@G2~Ǵ{HcrY gU҂   , 3ro9 QFuhpb9 }p    p þJpK^pT0"2 ,Uߗhl_҂   n{7g.UKՎ!W-h߃6΃W5:5VX~/ERS#RMA@A@AJ%<^v !\X4ڃU32UVltW*\$/jP2A@A@A@ cWtv8 uFQ 'l7"iA@A@A@@ :֨Cm:tH_283Ϡu ƥl˫R&  @ ƼOn+h}0lt BG@Tߨ>7h}&.m#iA@A@A@h6hA]o^?}]} 8BG@hD.b>7\7[[A@A@A@]v` ?A R: u^#Aণ} JgPz8 ua-ݦA@A@A@X eW9 JWPzL(_OkX[A{ _Akn?7ݒ/   5ƉiF6oXc|S5tWWM:LgndznA@A@A@X@B5K~tWz'!H]z5㶞֩~WW=kSgrYOR.  @dtpPm֣~Me5]Sj5kW* ?ꩵ~L\aFe/  @M[Za[?h=Z_U]kzT?ԣ㯧agꖴ   Tm?]1UZRGwZA1u֚/ԩu@їztRo_[/u{n|A@A@A@EjlEW@??[-mRGAкW5Z Z;(AV#O 7?$[Oڞiާ[   + *V^]dL~GƬ_[k=] tjMWՏjjkW Pj'Ǐ{K~hh(O|blDb}KKp, mR= MA@A@AlyL#8/| go}3'    $[[̼L!Ș]nٖNWۦW 5SO=R:~eA]6|wӐގ)G@%-   42g0]_ێ?Nn)1ajkSWg};Rl=w[O֭FYƁ'/D"+y   @#( FW_}ۡg |ʪej>SSKW~rtRzڮ_jZ0H+ѣGӐ~Ҡ\A@A@A@h4Ν̺u}O" |jysOfR%<_y?r?NE"0R t$OA@A@A`9J[6+ڧmXmtݏ.SOA54$͘%~zI6KY?~2?I<i'   ,Xlë_{_/ r۹s #Wzk[k5+S`+G.H0x;>x0k}A@A@A@,"{e]f͚ΠT%m^oPޯ\f_kر"X=US׏,e*9pi8] #$LA@A@A@h$PRl{JwWVbN/͏ +vq5jکFl* @Ԓ_k{#[Iƭ)γkmm}a- HA@A@A@A`9۞miJi+ ?2]JVש ^i1U F6ڙJjmo=$V|0!$$L-傀   ͆mYڴWu飛m+S2~,n~WM޳JDF{vԣAQKR9„+du$3&E   MmZڶ$`ںn[%;RK9?_9Z},DLGLrF^:cǎw}fD    ж.XnT+Sj]^/f!bj_U*gq;y72-    RmKwy6${mY׏L5r^Yf bl䷎9/e yzQI    +ڸuiۇUFY7GƯ.Sou::4Ju5ʵ[ǏL5e 9t~^P    ,9s6l<ՓyTkU_pW:fJi>yyx\J}gL5el޼9M=pi_A@A@A@,e&ڼɟ^MW**Jf[͖vAvʣa?u*ZzNu(tM7= .K    ]6/mb^m֯Of{:]]-ލYy0>UVc    +LMz|i{Nctײʵ>^k)sSKq쌇^r+GVZnooGl   y@kk땴}10NOVVz_ʻաTeOÔi6L"b W=2o]ԧ6d#%:A@A@A@&@ O~r|?j%cX]zնp bϏ|%r|T<3ߺ. ?S@`;w.r-t߿ߚVbEt:tĉ]>(~MA@A@wwX1u5bs_#r\v! ՠ@Tڼdʜ;w袋Ҝ.vWx㍓wuWOwSSnƭ.TߔV^g hW$kϳ;鑼&BvKU2X*"\=ܳ`Iw+/OixX6P+   ,.6cgNynsu˯V[_wf7::]vmnΝ o+%=myk_;_G""  r"P-: W؃/vM"o奔cG6ZԳ؏3߹?j{K,ʖ,%TK B u rc 37PXuDb#\TPAQ³?ؙygoZ{x[T5פu>f!dňaƉYuؽFOd2Y䴦^ziȑ#1ċaV"A@A@A@^Ċُdɣ,7's%MoWήz㧮]^fO=vQս:vUQ*W| KHab& )o4\x-QhH +T?gJx“{o\rĦ|XsX /|LMMa\dr' 2K[T-e>3:Ųkfo:vXP(2    @6&`4^ix:N2ny[ϯ[E86Ldߜ*x캗xft4oxw&[c.ߩں*HJMTv2?E-%ŋ!TY̵+t)FH΄Td jDT3Oegǫ_qHK_߂P)6ƈ1Ǐ1N fᄊZ 1SH/{˦'''fLg}((/1(   JCAT{4v89m<DofZպ[|'9{^=Ǭ$@rK@Yo_>/75ПPmmq-/bH4S szFGUj&/E|x΄Ahќd,;#'[׾+Ϗ؎l   +"c"^2?dͩ2-SI)W)meYvm~de^2>5$?{n,qˮOڈ}\dK*bŁ)F)H"LNL)d73S*STyzUTO P/vT@&8hG8L[LcƘ E?0>Ү+Q*  yiiұ9|Y~d(WN]rAG]ұyRdef3NGm$1Ֆ1C\VE `iB|=`vR)cLW@8:Z7Ԫnxzs[ A^E;1o | VE%#Cソ7n[a镊4    HL[LM{YcNZAr1^t)Oپ~&%giH:{Lo6gw{A0VF*MUSB9a|@qUjԥ.ďlWB@>^խ k1뷨uk: SD _H"h{A9i`c cJӓf|߁}o󶜐1@D6A@A@A@ LLg/").qDL I>cC*f2G^ƭ}{ة.\W}  %@ıB U)_t :AR*NTh"[GM aT8=jY#; }IÜ3$H;&iIX:- n?tOnu@A@A@A@X[c4c*.q} ۳U{l3iSi2l {SOig$N HP. xX FBY4= O/ Yd2o&B;:7:3*71o.ݤGV8x00cp'eX, 6=o 42~[A@A@A@ li8ecJ|IX>g77`Hzc3mYfr 9>_sK_ʆլRT֘ Ual Nc!2l! OkTwV|<=Z0*C,c P?2 K򅄋O 8D#ĕJ*_ȫHE\^͞T{O\:k:K9L{aSr$DQkMgJU,ǜ?v#    DeBniLJevY>+|OK;yxV#kcfth/&-8H6x˃Kv,'S*3QP*(w ("&yvЩ-{^cSL2^Zxs,_7wO[W:fRJO4"⹀.3D5IK <4Lrᖂ9$D!FxD;D\EtBz6-JoTD~iRnoiU;oQ=_WMs=HGV1c-7ݴwA@A@A@Vs\_MGh֯T%k[q.R1!TyɛefnŶ&キmvbҎ)=%,] Yu)FeQGH9-1d%à^B`AJ cBX:$e`ԡ2-sԦŽ+TsTbT"WșQ,U=O홚T?Pя?<6MfI ]'.R^u͙BQMݮj5 GA@A@A15mf]3mWUfqN:,ois7e2c/YL:ͺ~K5Z0KDK,!0o=~- :2)" ӉHXqa@=+Y/%Se#cH~7ԦU5* )x@:ٖ@ ߢ:wb\mQHRlU=] 01 MW Wx L z}W(A@A@A@h4~lfSƫ?^r2^7|' YA /-mu1M@c͸+- /$·MA@A@A7,Qɘ<^ev٥<_K55ڎ:;`W*7eyfڏe}S\.Ԋi@1x(P cһDsBJ8 clQRUp=*ɴa0HBKI]C?rꬺS][:ԹjO]XӯX:ڢN SDLj Rb°\: ^0s;BJ*81- w?c(MA@A`!@~_ /|jG!1XZį|/'^dΰ뒙֝te+s*wjZy/]eKEĸvzNk;zV+" 7NU*%F]+.-!?2M@pk#(`P_E.EĈ3Iaē 9O,VTmu}Q/ܨ1=j熵=C'NLZM݊_RMÒ!2r=z/Dbxc fMK;M(:olWB& JAxdffB}ވi>2Lhzz:L] AD[pzoū.Tǚc[vkW3]uッ-{TWw׸.`80$ '&1^ veAsHŰ5SYUJa=i iGa.()a=XOR^#CT*QMB/qNt}j^uiAAp߄NUbo%Ic&Ʊ h쉓sw{ $hoūCA@A@X^hMLL'''#B, $dH~uvv(jc9K{hm ^|0Lg5nj+P]Gc=SC?}zl9•ey*D x[kIDF g%s;Hn aD7JQ0R*.ƚ26BX4FLLUzhsI]j{_v5jު~궶zSW$#=xH b$T}'8$=Vbל޽{|ҝJԹ9s&c}k{GZ|﷞_7^O>dתK/555eСCϸO^L8qB -8v>(&Xig_ʖ;8F[,w|ykl o|VV.x߿WA福ɓ' bqi y\x=튜z\ N̿fZ̫'齩yujv%DBFWI'Ny &}" uZYA\g$_Jx}/b'1N I,Űgq2D;Q%%ȩ,Z"* +h/ulV83UnnS7TZgnPtjsV5uQuߥvڏjԴlp%'*…z?$? ~7i%}c}}M7}%\{>Z&3vڕx+_o'%/y'9Nwoܸb7xdž͛7}D?~{[:z6 ###r wAMۿk/N}w/}$%9_>O]q_4똾/v??ѩ{oMkfg?.__Z?o6{׾׻5`e*ǯx3c=fL؏؆5k\;;k|?i6|t}ۿy˽7$N?-[\//{>g/ٱN{qsϏs"Ν;曭眛gϋ?>@|wܹ/_|E^{h 5Nu]jժu%zֳ.tY??}{ %&Y}jDd:RXyNv; :S]zu[V5CK=[ׯS7ͺnSW.i_ċ{˜2@]6iH Bƅ!B24A.=dVQ)W6f !2|cC w¨E},mɪټ:R3;WFԶ FTZRD Zlud@DŒ׉BoNUh:$VS*& %2S { EZ_Q?0 E,16b;}t @"_3le mݺ1 /D}{ɯ~g2'9=Ï=X;ȋ-w};wj R:~xmy~]{B0 b 2ߴ!?uyȏv/ٶdX{!̑?Iv ':Ϟuqݷ!i"Eba0 w5/| oi6q.R:?&wWyj a`6h?CpOB卤ԛ ԩSq<)T2$@пڵk>@o=h`i/w:y7z69#׽nN3~H9k S Z@|_c<ѣGHr-8yc\Z}n2K;\Rƽb}PYֹz<׫. rO":|hf Y4GZxNxn\ *neUugfgW7SW]rN: G Zͳ]~hLfZveu}di6bUD+-h_EBXtJ+"sib뤀@1ͦs~dH GD GP A{Uz9F̗je;Жa10] kA./bJ:ZS'wJM%C"A%U1klRG˾ cB}2א/SȇOqgr^>U7 h@!Kb?Eu"b֯_&q0^07n뮻}>{}sۅ᥶l}CZ>pIOfJiܣ/0k%b_xNݻx9t5+|#C & pu_5tZ /xN6z6_ϚS/{.ϯ8 8ЂٱcGy{ύVzᗇn\-fK/t9joRD?:Onr0ϚD6~nX曈m*`;\w!3+GG445n4ƭ>帶Xds8k Q&$t|0f-/Cۿ+Hk8zy?=C Ij_tEi={+O1x&<`>AF_q?_ ÿLy_<ka@ \=e"By‹%@ߟwa\uсgǡjZE,Lkkƍ S?S7!xƷdE /RjCbh^Cvm &qߦHg1r2z_'$@d):W_4:ɟܤI)~ j@F=y|v֌8ē݌g8>yJ3L3:]Ц6տJz̴γM3mSSSݪHk)_ OVHT~Bv-#)f *@L |#(/kazru / j;*܆xDQB ';HXK]uS3Ͼq"@IDAT%6@*AasY:9f0F1.=Ç[M%)_S5m۶_ ?HOD@;uqme`g^W˜<6Mi?)G- _T&8m^9w#Mo~U?#xςHcz&_,s dR$ BpyЛ]Lm{-C`p91ǎ]>Ne_}Gyꩧx?Ӿ|3Џzȑ1Hhh{u{ hg313oc֋»i]<clqK0nIMօI}-Er<9ϙKSJE3 7(  -6OP,A0 㨴"~A1攜Xo{!rL4]OO}Z\_3ئ˜ 9~Z@h^#"3G27>A,9ޠoqbN} K7^X=;>~1'W`lxXd}{3`8ex ' ٶ!ǧ+{_y͂Wf|Vvm{9dF]g8 t7t,e@jtlRf z{1z0Y&Q/AIXޭyk˽_ !? Ļ6ۍwe'c8Ҽ#eˇU^er.E]'kFefP iʘB+D jW)g+I)ʧoE^T4/4 c .!0ZSx …^&^KWf^X t qxnVڦz6XW4|> B'r} 1ӅG}ͫ{,fn[Cj3v)Py9V̛0`6zXP\3*|ćel.)4ݗ}3NN͑\x_/=h,cp.7)7QY.|a}K~/{t#=Rt/« M~EGPL<ZqOK%C$ pӍ8Is_`Cv~ͥ~AOOzzə&\9b xX$$tx>8(WGS?q=:k0\Hdmr 5zI78zajSU>h/EB Dii;,!{=}L-0-O$c^&0$@X*o ! 7N=$Vu WTgn2g\'zիd|3cu}i=b#Ot] <,gH>7z~wxNp۴i=U.t@'øn ˷ǵ6V{ӇY0?:8y&>@st䮓3^8$ad^+V }~/ |3*Hq\cB>j]η:OY׉ F.re)kr_9N5w~{rP~6؏?2^3uMyUL ̒R+f|'p#BtiWE/02H7&0 .-mP>=kUgOWGRǏUc3*ʨscjtjBmXխpɳ G+|ZӑT##MO>R3x2xQ+p a,t%4?GL~F.|ۤ  2}{˼q}^ =<Qzr{bu7-Fa~~"8 / ş7%bic$ uKfF$a@$ ڟ]Ѐ'FwD!|gvdF;++ \\Or6yډQTf{de]8E]yL1XUqN g@eij^"X0u~Bh i'MM=x܌$B#-a\8x+$񚦁8 $a n r(V&Gq?ƵKYK4Yj:ctqV<(N8Ϛz31)g!$)I__WܓT(1?#uuRy V=º==OcD3 锇Gc@b`8AudH$L{7Yi)-m9U'ZV|Crf:Hznms_Sr15uB%737ʹ1̴S |9y2ңE0a@ `|IIoǫ$9@rd#q'S{{B5W^M&5=NU+%{{U:28ާ&jrZ[ګնkպ #+Sq1aE\Dbs0 }IDO՚Dܹ8vH!͞8x /ض+={ѱ,Kla>^ <|Ao{Ek} RNo |ho -u^&Z־GL4қ/I$^skZ1e@Kb#lEeÞ7.R/e$J]nOp5d2:ɯf>^Q/41`8 }𒹐0]S1:LBƣB=}Px̍ע+Y/ᴠr8/S6ʙqƲˆ?YiD 39[H(<sj9£ieB9k0- Ӊvq!pNm% ԁa@TƗTxPH[z>=uMf F }rb DVǕ%8Gxoo !E ^'pmv_W|˳z+-"1EoEm&a̶Ȉ3k-ƇoFɞc oI| H6rΫa@]’!v$Dz;ѳ4𜑬w[9^e^'.Hl6yfZ0̴.7Ӧ̊K7CPիשS^`}MDDukTAdN`RdIxEӏ&1- aBy5@[% -H|)Q{@꼸K]~Zľ XU)lUcM83zJM#f`]WӻjiT>wV%[T*ae+Sm`*Txr*R=D#Î3نq'C$R/dt?x qP}HFlfb2m N12?-]rjY DFy,(u:t, . O"5W#9B~}ɔg$[Ua\{Ѿ;klR㼬g }ԏ)ֵ 4DuY{\ppٵFFֹ"(Sru_AtA0"G0,GXShڈj} ̠=VmKxڈܫ$h,P{]yLc܌ {M恨ی犽ؚV(ăDY)::k_MI>m~[kэTN42ykwFj%{_@No}$GHS * Әwi?]{n =H2GGLѫSGݦ7e cSLG[|4>nPµrq9q=IГS =$Qɺ>ɕAn=~0fPϺܓ r:N'U=R ss.9nȜ^'647pʳUAlNթg4 #j3 Xˠ>݋+ " ~z^#LmX%P* A`M2@l8WC 0"f =Ɨi=]a|AFD\tWeU .2g톗^{`昁);>Vq@, `\HBOjBF.^M{4>h$rE$SڸԵ  {< ]As S im$kr4:!@Ĭb$=+720E_(s>m0fcKXiP`@?<4" ioK9j:J9Y0xvH?ȩ-/$IZzœipIM03}C@o 27)1_~y/{aT~}m4=}O8G1mu= "/VF~&IBc<3wۃv $= !8xZLh\oР6IĽ'ajEB4)K 1kq+wh$U3$teH\费'D1\pr*1z$A1<˶`c,!NĘ.{| ^H`e=0HIP08˶!5_is(>8}4gI`? RCW |و93ɔisj F`>ON{ |^coF)C: ak=fgLk\r-3QWd@W`b8SrI`ނnp$N_ZPa<8OੲUN_Ib`FNG ~,c^5= qf䓄 dq_ ~ Z{06W/Oހ'b_˞2Hn FL,o D?{ӇA``o|&vVTSI^N&yhS3& `1}HH?}*OQuWϝ~'q`k$]q}ND &%H@CHPs=izһ|֪R=Xh[WC Z;]P"*2X)2S<:0]iaH *51R2iuXzl0Iuu;[KYzd_V0*"u_MFKe S&@9F0,Fa=l NqZ&gan´6zCxD~Zu,IM.@ԭӌ;dNsD°Ϝ6ş=X{-ǐ]c x& R,(IyFn)_P'INaɱvB߻8wǝH@]sډ6ٓ܇ю˫28~ Nun\V̡zip Gg`Iw~|Mp²eƭKt 6dY[>iL41La>IJF0F~OZe;02s ϫӌk9,/}EI$[`٧Oczh1-֔ rea-WP#F nZL٥Hcj^2`Źq:9[GL37=@^m֍8_O{&x͊cs:O:-o7E3+giHc\ Duo$.Yto㺷HNI~zx2h&b?{m AI?/Vk#Mfx)a!MniϭI ʬמwk+`H3Fx}Yu#2~ l)!]b/x3q&ax~?RG&Gf3ϩ)m~eʹ$"b8x[5Yu̶jNDZrVFt! ?S㕻A11)O5H&u<S,)NJK-R1cxPTLN0eKți.VΔbIk)cj|bRx6`OMVU)U +,]ys،hOZ^.zĕfAe$[F} 1z c01?sի@vcuzE#@ t$L^6r5kZW^vFyϑ8oe`JN%њaLQXˠ)rD~< x^l'1z|)륚S +ǿ10FNdHsȑс L1yrv{tjgU^YпIЂ 0qZM7t\Vq]kWvXH{<Ҙ*ͦ,dN9 ݏYeVx1e*ABB'9^7 D2y44N/0=%F"=cГc.aZAˍZ9I78q 4ixR̰ xB6E &6m2+ 1 1:gkD2qH> E"--I{n}V|0mpui3uSc>71W LikyKJIH._{|r&4)˿g}ꦓ$bS !vO[/ F&^5Pt8ɛy֭FYOmKofZ{r?e^2f;#3'h āAXhn*uMi #} U9.o + 9RKf4u{T&x$0 Y*5=eއWTJz*MXlTu+LW!8ojU;bKaTCEL,*')NYxd*UД !aMEgO $H$7/ ArMx1 I,9A H(/$ce|1Xֱ _bO3@ _ʆt' C0pL"BeawCl P~'´qo%`/0;@@8~F kASGucLb+^c)YΩ&h; &J 4y8Ntr\}$|+Y!6mŮ i]v1 Om| ̋0u|)IFw O׋)lfSdxSAO{YrW5yvg6UD,$DDX; 6o- gxl1 IڜӤ{[Sݷ;qߖf}N4M(,G{6 v=$ꡭu3 EЙ3%&pg3wbQkZ,yjZx}f/,Z F)";.CL:mYD ALE:L:I|Aƭ$ za Y@́OQhʌKo\rTeUB9!3' ׾c _oO4CRɀA9)I3;63м9rrԗar }BMS ns~&@$,s;fq*LhPZ5ϐP,Ľ X"C.m D#o`S<R8iuR=D U}Bdil~1TfLnFM|*(|aB6Kx J@vmCj,[$rIV9{oq>inh\[ +%'dbt܇awJm)hNG36эs~ 7ݧE@XepNy|mݲvQun?_Hi8-zr ׀EmenvLmߧc Mͽr30ԣ2f8%D)9,T]ha9.rbF"&D8IyI|@[|+SDJw3[62;w&FMs˛f ~rGZWAˆZ1c(E7T ,rHԡzyN ҄H&8fXa>o"g}_/1*|pO%eN$ X;s&r\WQbh8e<+rXXaq 8BKC"ŚVXcsaYMBS|$34}"õGx[nFiRG쇚GX7Ӈ 2 e {,nb{8 s0=1E6u \_W'3 tPXc1} K؄[3J#I܃ ~Pp9D\rSthIB&g &I,A+c&+pN &='7)69o<>0 k?p fXȏD̮[HPŢ6hνQ+cmFY-'2GBY;aќ J'9ɸ$4 hރgGbmcÉlЎ~`Ғ]2I"L4 ]3׆HR#&hO Cwo6HEЀNZ4tBB:ǿs3cFG&M})LT_mp۳͑2G)6MzT5FLەͷϜ5zM5YW4$QWsS_ޅˡCo C?5D`f1Nʹ5/)kq,aZN5rN^ z,#qIǥK7l;AfdeAy,jI2ڇ'¬ vs7,΀eKCb 3×:~c%!|P?8HXǸ0AЬ!I-D$W_)&m$p ɰI62c H$HhЦ PdL@q+^r}> XZw sXHCgqfMhͭpXE50}맖HĬ{lU y;˱|HD^#,[ucb1tQ֒q~';8f*8*T&!Ą|o;IAVt5S,6Z1R \>ST>CҀNi&}Iy_,̚м$eS/qsD1_F q#IR>k ~FЎ+/|9o{$xdHƳNJu}bPW>\Ufvn~zΰD$e!G3ea+wL hΓ)h j4jvMl,yB]<}G?aMEN?9oswi~S7f_3f>3Ug2;;͡o - `T^60yEj@sЀAgo3҇ Π~׎1;jJQ {1qߊ Qoo(hWi$+Xv-'b 1h8 M%!$ F^:<>C &dXMc5,\(pi9SEj/w8`/}rh} aLG} nhFQXx9$ca|}A<_☸k UpME!cDiAgAu|Ub&~%xoр F5M+.Qw0EOeBOs!h]cGB 'q 0ޫH2ޛ}2'9"@_,3t 5_0 r4or/X,bg5e@d]S8཈&އx#^Xӧ ~Kt͚(Q}*>KHȀM?|Ti~M>ݏ:`MU] v {|=!*\HDwL9+)L}4N'0L,ref[=xo.ԙ[%uJyc#׈x՘O:IPr\uK cqs-.?\,||D h^X8=Sc_~0?ߢI yT4-#[őK%IВy EGI"#4xsFp̀a1 dKQ0}0\(8i 0&,\e s)j^bj@TșiP`488fZ9T.6u5A fE;3f䠙4eݵ]khwL%&'$Z`cGyɘFDgo c7qrN YŒ_9nIA:D{^.ZeQ…I 8tvxٞ}@IDAT"Q藀Z(?Lja*2 eXc_6ea 4\ʄ/J!a0CǕϤ獯~b (8y0b,nk)e}o,Z1A&8Ƶ;LyhlTbRDKC/x͉Y-M}B`|-i3 }.yl,@vX`0M!Sl$x<8 s#Bbe8!Nw}^h ns&; 6 N~b,GΠq]ρ`I(NAV@̀ cFVx2$#lp,jC@n }@ zAH D2g:@tJلM* z0 AlmC4Eeph/H#xo3w?8^$!QI1?< ?YGd8E.EzK;? K/0A[ۃwK-5\ 1VhxU? M-@I0|&6\|gneq\^ ~ӧ8tm"qK.͌ HeD`1X cf<kfp=|4{n?˲nDzY?(^ 켔KDչ&uۆo{S];{u(YoƜ3h :Q&4!9/i~Tanh ^ BXG̙s&Ej:b¥/OW+MæNSRHI P*M-&5u1jƧaTmj 8 |LTK S1C5 BVCO'3Q~<5;a,a'I2<5xA׮cpYfKa~" C(rRKs$!@M| a~YWJ~xDž:)wSj(׻ᄏ̭>3NpB=s &Gg_-nB^8n$@¤+ES1p 狪{/~K2_Uk H9,& mMikQvyTb9"^ ~y7L9aO L@Ar,x<͈A*øk' / c9.BI)̨iBB׸C ϛ &{H@Ǘ·oF} 8f>,46y?<<I#>@`0 p|=AM<00;/.jxA0E;#@Xt\f<~$- -v[>σClT]Xv;&,9p%ɇݲ$l>L$%>Se`~! qezە:S]:3*W*RG5  & >@i@  } $Q*)Wxv^P#@>fh>Mb< zY~F֤Xda@cP|)~h-dYR^o#iLɹѯ8)(A_o镬s"8r"㦞Öh/x>8A1h3}BY_ V%!g΢lS2"JUЎi2R3aҐ כsy#ɬhQ}B_qTucO<|1?>cjq\A?5e _&g`)/02a(Fs>\SD9IPE@H@Z*ɎҊ"熲yٷԈ,H/1%b'`5i#H@>\G4 ')w㯤z #`J}hGk'jBe >m3FV ^1La>De_FeZFB$aghrjΉjs:Ql gկ$"-&y}3[35;WƧ0HHµ-]#㶇weZ0UO5a`{g+$0)VcS gML*3S7]`֯i5m-gɘ=Ks5)0E9DHJUZf`)S(9 M~pCOq*R oHUwn"("(4.ߙvjѴ'bOܟ>;0Myl9|gW.a^zr j`@sj6KV"xw@=V]p[ ^ס/`7%u0<$)nfI0NxGT{:>Dh] M R0#-*EގK]8NlQrQuq.Lm;noߖQjI(LLPlp +rD'ʘa28ƭ LFDDlNC4T300sjDh ڠRiG{d` 9?nqTUC, (q[ืcЦA<$8Q0AT1m؞(k@֎E@PURW(I4EA~_{* QG/|aO>:нߌ]N$ up?m``ch9}me/{ٰ fFT|OT֑{*]".D\nV8S'2.ЍU_ܜDih$, /7FBDhT Wm:%Q2kkLK+PE' Pfᔗ2|B]3mG&ͱY;Je*cN*qC:U8A3 j.N]mA\Uhp8T L5D$Me?F&Ѻ5V.8GPE@P!&uŠ"ӈx\He p}F pcwgӛ޴ID&ǣIJuyR0XAp!xD7jᯤV:RQ7 ҇=EG\c-BgcV6>|'ʹ|VHrRz)qn-$O$SD33Dp<  W [ԀRRE(>IZG]J%b|ԖmD^d$[^t؆~f?} bcBH O9}@p̐QMzvLwSڬi3unD-Ik@ D,˚LSzܤ`O4 TC*c$>m84̟`ɨK3 ]0) wRs,񉶷uy8* `ډ"("(BQ9Xs2) rF-ʉ)kZRhpa }:oP}]R "&~9 3 Rc=Аi ?q=~dWC9?5a21H!A&G#e˖-pDM:$uD%dÌ Q:[f;n^pE/zшo>n0G-Mid &,e竏{E[J"-xqdsnm5.\7 D]2d4̍h:6//30K?0M0o055 R @e63fô$L^&X55دH9 o|SЌImϘYhT”) B :O3ɱWff~,:z@E@PE@PC}ر#c̆*Nzr%wH(;'H ~v|T=u%oB>J] y8M]+3CPEծ<4Y>}h._%Ky2"0<9YeiD <>|IIh 5|_oƹjtI6!ZU+!%/t}$kd4GƑ)xٱ'f!(K-g]6W9/s 27LG7;3 b~糅t;cjLK[_wvV~a98Ν24_YSu04fMg㨹z3͡'Șikj0Ѐ̑20Dgz"KE}% = *h8?;r1 |2 fZxEOK+"("(Q'$ {wcX}Xm6} k1'7/x %5C\r%G1/} -ԯ2вhDw<Ԏ?<.P>z&RfaCxo~M6BM; ,9TpྲྀNx.Djh`Ai1KFv|Ν;\bx< %@M$isܚ}{MQ @ a'a|U̱ m{qf{ 2sO_MHo۶-7O>qIw{8%9|q׾t:'?ywyhE4 :LD 薃f k͝7hFg)o]{i4e a+*eтI0_b[8ٷ0{рhI00}j + !/̓*R r͢}mBd M1xKYM?t^hE@PE@Pٹ6ϻjTlmmj^Z,r;BrTYٳ%B.77khD %%a/! 8,=2fDL'򂌩馛F\̣p-6 |w_ÇjƐAyևݍa)+7o^_W{]9M27mI˖ub̷dݲbJ_Cʛ^r饓ywk% b)P&Is:r;כTZ3R]G !gQmO;ibN>euw0zjDHJJDWJص+3蹡ApMu @ ͚ʩ)SC3? w@1po]j\GPE@PD(*GTz8譇HD$"*B uQ6Dibjw~wN> H :v}駫/6XNz~я~Tb@%Vu&ƍ7-p~\o߾@ȿۿeI1ˆ_v5R(~W\q(d>Ov9܌kWb3R& \<.CoDYx,@rK|R@v ?Aw͎B3rjvJ],s-FE L9Nvz=y0 3&WF8MS~M@><.}~qbJ"Bl ֭ F|1$/~H_E6{0Qj[ngȺ=vY<| kuKÑo+!kq\h ­ev~m{*,"a:"NM-ed!+5Hv!~/:\ ~a +@fY- [)!>9hZv^eR-f ȓY8ޅS3;4hfAil3wUd>iz|l%ffa+RAZ/0Sdjs[~ob!cM֝]yĦތ7B / ꫯЇ>t|֭1 }#e^bRq&Egpڲ[ }+_9GhqaHHat믿~ knUW]5o{_UUղ{(ib0Bbs)6zk{w93ޫT /y$&)O#"(@!hƻ79->`!'|&jq_8x;(bȑ#iXk9>/t ƛ9Trxme&#Dc^Q@|`Ո!^#vk}ܳwo-тHDXRc%4mo`4u^i񉎱 6R y o}S *'T$8)j(Skn#yq[ `Zd,n _/cksC@O.5Axr^>nŝ-q˨S P"EbcS9E@PDԙq{ƩBD'NT{_޽{Bd6sqIjZȶy;#7Yu&M3^f4Rss`)=csv2-s 2/>R־o-먖hikAGGGzQI9гg^Hf@ĺ~Nw KE VNC3 s1<02Pq$u r=p~{ \%͕݋#bYnԖ~c}IEݗM[q@l0 "Қkǎ1oK=lZjLN6Mcږ qmH)0sBt&852s'|aSY` e +ȐRǵט5/GoWؼd|Ѓl&CP"G٧>g\^EB7_Nss@C%;D g-¾㑌mk~PRhC4A3|i:Jm ~7€Ez"\ NDQTR1ls~e&vYy| vmX ?A{L$ze__fMv{v[ne/}RxZQrv[LfR+LZG ]rxx5("'m<s}>W\c<+2% tS s%ŽvX`IGyb>/$$p8Ƶ}$2$s_6F\s~-Wsld[3Zs̸@dPa\K*tES#TG|+_+4RO4h~뷂8 }+a5vp 44asymoۈ2|;yd5LZ@.M/% 6)_uQ=/Ї_K>$[\v,o5Ly讻`l_&t <|mmhP;n e_BdZDLUTע6}/uOݝ.7UЏy>56t1.͎1SvM%2U]"̎y?23DJ؎umGOjWyq]y /07zim&LIUVӍ'|dEA'[D#|!)qEq0O24ׂj5H2[?,6gx?)B}CeIh&GgïG=Uiλ=[`/aqTpI'޽{Ʊ4yGВWià:''+*Z s{#\::UH|i9 BxH'݉ Ȑ*Y\ÉYDŽdQ~z?\+B/VKF>cӴ2H;Ng$5m"0C^{U &0th/'?϶Amv7 j݇E@PSs\9Vq>?&&0xjG@љ1>u]0SB@sNF; ÀS׾( >r^֎Rƭ9?Yss7iXiww #!Z!we[q,qxͲZQu] DLqdV֕I0Z$}߾Ȼ?7tٶe.(3Tq|U0#gUiʔdd"e*Z:zz&9=32Lfn:M@#? BS̡IT7fprSfq,hiA8T9!p,0,w:yn`PQЂwf nxIv5bz$0lƜ'>pGvޘ{E>Gam{يR>έci Lۗ|6~ ؈saVayr&̒BhU8/׾~Ijʺͦc46۠MD'Us*  H;nVɠk!p*})tzGR5)B=Or _B7 B*ǔ 69{/~&)w?C'#`90e]9WE@P"Qx$w`9|[' :=/0Gȍ B!jF J<3pM03? iyԐ_$>wL }s]8 S0Q:]-{d;v1t yҞ!V%=?9纁n{T{4{ێ@extԛIhԔAfQࠗ0t UhŜm@ Y/MsfjQ Wǽ5kNTW`aZXDo!т뉰.\lCC V,<{_$BP/ǣ+PAģR~뭷nj"uv1le7aBZ6跗d ̎v Ï09h.?0)sH#Ka@*ʣ1^}La#^bLW\r8Gހ%$l/e8thC䨀#7(=]fq0'kD!o1ҍ$bpN";W7:'8FR3I4N y#vL5N^X`FUaAj.㾩B}`'DŽc]Fm0Fc=ɥ~\PE`!Vg|>C'A119|xy?Bs"C|H &`"2 !k0xc)iS|ăl9ת~YҘKT8pZC]?X\oI~s6̫+Q?e-[rwhvS0?C8{30rf'M/L 0a>~0B.x(.@n/`H5+3'N9Nʯ;pE{t /]Á } /cxYVy衇IP}s:.AkJRhva4ah__;}}qK ͺ@`QW_@05 ZHȎiXtLn2e„4t^hKC}m|yL:OkM L! YNm'Lv m1xFs&{oAE&b(qL!axċ{ e#q@mQa 0 Y+0bds>ㄚ)G,(C==D] mЄiÜƜ׾HA3g?7TG)̵j9ep=o"YBl4yWtkwhjr䉶ۚfG3Ђ) #MCb*+M dʑSB  ȗL"kʗ RKAr  Y?́>pFG`_ ^/ ~& L06IRt_҈3N +X49J#XQ'gB8h A{c$hl´x/FoǨ"?$&U4){,3 Ǣ {l]rMYjfÇK&gH"cW\q41s}Af~W~>`n!$ d_Ђ9Ʊ0fTS|4ۇl7$Ŀ/2!@$NST"Ə_l2Uճ[5-o97T34W 3PdATVVWͥSxfGU55|ౢ"쥭(PC @v\bQ0B:48O'陸Ry1] _.a 4ŗ _}e !a5 B!#[_ .#;2 Pg>4+1@8/O;sfg9qc=x%~D}Nnus`kv|ݩǤ\2-Q85@*Q}>Zp~]C,~MPE@C dh<V/a i_ECiQ4 V\,'%QkD sG!ⴡ hwyhb6bjB ʭc,Tb Eߍ1;Q4\2m`;:׭r|Q,</X1ؐ f1ɍ8 ;>5jQK-[jȉ$ uЬHSW&P8O 2~)RpU)s/E,m Y܎E#RČɁL9g sbrxpi|gŰŚZ3oU_HWK' xu9.xbяN9T'FjiEe/{Y$fAki"("\|";Ena;@FtNIx4 Lej1QmG gh*aU$ d3Sa,}wDL]!`yH=6u yHVxqC 5\8S45g҇/Bz ֌% %FhsF Q9p"{`UnI!Sd΃u;~#daθ|%ߛSI4Cji%rL)3 4Ҹ^b?b0sdzQ8t>a I_@<&hRh<8bH9mHPBӨ<Іݠ*2Xҗ\H("("p!0qp+Y@Ӌ<#4yӛ޴&8V6avr|RNsy&<%v0 ͚ m\FbW'CrW .Y]F0Lpfu3n &'pC% _[nIm?G0: *02Sn"` Ҿ!9{8 6TR4qZyޗ8݀udF[ziճ Y1'%Q:DOUM>5B@ q7< BkTH'E+ȕiJSSBuWE@PE@XX-,9DNĭhVXOK} ̣>Z dR?5=4b{QxJկmݶĘa12#`s@(T!,S 6<m0Ogܾe NhYމIR_˗2L9U$eLᏥvQ6O2#19w7LZ72 $ =At"8=#a_X$$4Vft~} QqM"G,gĦmzS;"("("`ћFY+ag'tEdG/|=9f: aKI񔆖 8\1{yx? ::蠘X`.u ӌ9ig UXFS)h4s=LyF\Kk3#|^s5^moΫ;zo &FK>>a^ .7|dͰl 5M'jz]C$U~o^"ש ~@/h9y-95q ӯ1`KcHj("("\ (s1\e=y)m [֍F"aޘt6,NK/A3 Mx)c- !a;`X<\z|ְAsz,3m1sfF 0"0Rhf0)ņH?A_CsÃXP~&c]k_>1Om0-jh٬' # Fr`4vm3T$vK#b^/m衇‡<DQ:zP_<ҟ"("(jC`1~]^>V"_gZ ,Ẃ:hkRsCh;IDAT|dP vO27~L`l@Ьщ98+^1d2-oSC]g C-F8D(rc!};%)hVce9aoFԤh OȕZjŐ?-8̓,$mέ?S #k81F4;lx@4-o9M+w<9/]4{)/w-EtF0z3;^7`fh麺Y?vjBi'|V<Iؑ>Af)#hh(DkV\5I!>7ϙ/;, p9 yG10]@hє84f|中ia]<Ԃ`HL7x0u8$Iv3I1AfUY'΃y` Z. }D @D4+Icߤ_U lH õ=Lm:=4ΑZ34'  I;&h[^>4 *A|{I&:c\H& uMQ$] b|zw,d\Ԍ*ŵS2oa ɘnRz afYh 5QE@X,凌9vI\wRV|wJ&b`)A=aDLK]P_􅄡}px sHm :E'?6hT`x a/~01@ty|~\0ۙwI~ P޽HI-)& $mR[&uhsv;o`1 HM<7y$ To!^կ~׎4YaxΆ0lC2t*)Ρ3 Wq 6<"> w;m3]w 3u31i 84!yoG角h]@0BH$dLд=?KmP$ $Ihru_PE`y#E;{yRGE.;)b+_>}µ?̅#_}ta{qFdF|X[dߖ<5ٗ4nK\y.ʱ,~Ng`T&hr4)gdAã&L[yz=BKeG NbpWRm+ i F vyo>|ʜQd˗r;F0y>W-5|@0*fg|| Dɰp\,ȓRw Ee$`FHQ( @ t. QUDMw|~|0}^h~mi2{I`6b,XDoZ("8YAus4=J)\f'O8p2\c:KR'mX]wS^Qu# ¼ʐ(:<ɾ-k9<ٗ4nȇ~(̥w~_oe#E hplLxkQE@PF2j/qx#-3I?>.ChygpTi!!y!v^6aevyTޭOn2{FJbO , $c$ XCMȆZ(9L*"("2ϰue9Jj%={I['zYka>teH_ij }q!O6"]7="("("pZJY!zKJ饐Z&2{&IIa\'R6*<*frwea09|TIj+eqz8-GTOzv"("("Z?5KVʸ$Sewz" OFE#$id򕱞YW^d}3,/N]F3 @)"("(.~^kU( Cpz[$8BG/0В+Z|^@Ĺ@qd"}Xh"("(R"UUUK9^_152 ·ʮ/>я~|)cyőYҋH1;(:2;UgI^RIU'2qSYUбC("("&hrԩJ2O^M,balzh|͛Qǰբ#G)AWgEչ}q7.W{+A#fޠ(HN9ܐsr6*("("(B̩Wm&MɆ׻dP.O9eyq2[gBlwTDL>ջa6WR2wuwH"("(jB& ԺP3sU,dc$\KqRٵ%jw_ʓmc%TDLP("#S=knS??"("(jCk׮BB$6<|=Bmz  ׸\bԆwY+DENRmqdڮrw&'𢡊S}Myܲ$|05r3;MPE@PE@XЏVkxŹ\X577.iSdff0¡hI81B|m}2vY!yo?IeeȔ䁐 Ve>y_}2W/4k'e$_LJ+ʮ;vL"("(Cf 7}.bF֫너#>fRaDٶYbN{؈;B'7>},FBZ18rǤ|8eL~rK^R_M>خ{}_ün"("("(JBsN H3@ER M}}$) ˙&c<7'V&}ĩeU$Z;areVެۏ/X>ܰ_oTPE@PE@PE@X p-5텱rO)LΖq6qؗO=F9_ے->[\`Jzr%;DVe;lLPE@PE@PE@Xnp ˵qv6\w[n2CpGv2Mٖޤ+N:5e%/y>jX"("("("@}<0񑀙_1D1mh)9$b80!7dQv]|zMݶ3(|'-s9QME@PE@PE@P5aH|ǘ\(IV m{<xd!['O>WE|TY:H>_Jӯ4*}kفn"("("(r@>anO>#Ԁ& &ET~2;/cb7{λurqsu4_ B&+'V+wˢ2IʓFչaɘJٳ箍7yE@PE@PE@PDѣ_ؽ{8eWHBS^X۸u>9ynr7g'2nvKrW#Xzs;qO>J..lME7rs78x?ԾK"("("(b"5)צ\^8.׬\ڛƕ}[&_>MTo\9ͲSC92|X-Ko2iT++I'c|^}կv"("("("!oϣ>[o###4?"A&IBxMѤm켌.ʻuq}2,f|IsI(ؤBNeN>z_[dߖ͗GIBIS-W㏦Je[l yӶm~tSE@PE@PE@PJC}/RM$2 OiWfGݺ8>q?7|9-H Sg'_z_[ovT%QuʒI/RO뮻P^σ("("("|~yjp#3}!>7!򥥒Ǯ+6퇕Eu~/ƿ$P!&WEǩe|8u"#)A|X%#L68͖馛utttkd2ueeeyQE@PE@PE@(qkQ|񞞞S GĆME>*KҟKvֹAc&e<!UFkV+wˢ։<_^$MH(Ym!CB&K ʼn6w7Xv]X9eѼ"("("({QOT}X]Xَ0ܗ$%QuFgy9]}[+*g7XK#]i<| tǑ:7"y}IYN;=9?^!d$ɳ-}wc=79Xn9 dX"("("(K C>r87O9t&H>Η8u"#O[4U'Rqd(W.i"r$boA@8$?NEFR)g*ee$`"irWnIdY.J mէ)"("("@*d.W̭ۏS.2%/Ij׹(me^DLvp 37j!𢡊[NdNR)g*eu-'yI]yݷY'+c;i}nKn7VKE@PE@PE@XM w۸K,"KENR[F$$U%k+>櫷eu|GWpQmNW&}HRn} nݷu,퇕QJmϮӼ"("("(YH6zcjoRv;7K[\Ԯ䋭K>J^KEbY!m[4b%amGǩ##DzS_|ev}X>\>/ ˸/nօM}2("("(@dG'}T[xnoɮlTY:_IڋyWnN`Dr-Ko&dK+]9s+clnR.izTPE@PE@P@>zswBv:RnÖ壎_|Ҿ}ǛWئI Ǖa}2N$Y;Rfw}ѷV9\NNRN"("(",d"oLRԷKÕK{m]2W>['vTn˼+DvʖF p5)};u|2_i#iҺb6$ea,7+\"("("a28e_L^0p:K*v꫓2Im|yۅ2O"+m<-T#)RLvI.Ie,Q2v[WNɄnuk("("(rE^]"}2{L{?,)>y_۩-'徲u>|eow1}ԶP8CT-K&kʢl|vv/d׆eǖrQuK;ME@PE@PE@((u|0Y<,/2\TY:a;]o|R?VY1D o!V+WGu>_}ҲKw'),7Η7VZ("("(#g%㫋S vqlyK*- kk֯݇Ök>BMB;\ $$yevT.LXޖ˻ǐ}[>IOTԕ}E@PE@PE@P{"1I=S&v]2dzRv^H,"k[3*u.ir҈!E}[徼,_{_bϮgxkr\00(y֖K1I;UE@PE@PX3W̕9_}ev<\Yޖ-uY}8dd+&]*"ql;i+c~6nݷtS"'iq^SE@PE@PE@P |aq]$u.~v[KJY;/mKUGQLW.}A MpPam_y2W˻9Irl!}|)˭=:;ˮ׼"("("( (9_]!en}Η}eamn#ea-kYW.1^W+Sl$z_ݷ-MZoGǖӼ"("("( @Ew>٨zyeQvwqSsnc}ȇIp+ta]Lr[f/d׷ƴz/7r-O.h|NqdDVSE@PE@PE@P#I ڻ>q};uL[KRt}Ƒ[LD oU頋Sv]$WT֖ʻu$ea,>W) KȆ劀"("("$ |a8e'6auR.i`&S.M>ĕQL[X/fn[|>J-bcέFՉ\]t}*"("(+E-zKZGɄչ>nBIIdY͖=_RYla12laܕڏ[g[ IVrnȹ킎K8"k_4UE@PE@PE`9!wўO.W̕5.n>vY'K$gdp 8d|uq\{λfו"_hIE[g'Vrnϗ7VKJDPE@PE@P.JO.N+Ε`&+5ǽc e/[۲IIdÎ~X-?.vK84("("(b!dO6W̖޷Qu\\Y_;ͮ/&ҿQu","bx6a`ܕڏ[gy{vyB Vaqd}Iʤϰ6ImY_>G_)"("("P(./-K%kׅ۰8>>_VʒKDi)0:L&I+d?J֮+E}ȅ ݖudǭ9WE@PE@PE` d1O6W.}yߵ>ʻcy\ r b8𰅺[2vޕ|\9i#ivQQu\9߾2_u\)"("("P(.㴋 s}[oy.Nއwv)s}Nd _iD pIdw[g'VUκs[v]GuVM@]l'kaY΋Tԑ~>+@ @@>Ey/YMoi]u\::UqYʋTt(=9;=8ڼ{xE^q]+|0 @ 0"0{hEJ~{lNN7r=O~i,:۸{Vӛ[_;=msbEmB @u*6{LjzlNN헋ٺZ'Xϝsϔ΋i siֲʼչhltQW_ɉV+E': @"P9pQދt ?=^NLG{xv\i{KFӴ7\f/l]#:=ijl.34Q$ϼWj3h @ =]♘ٜ\4ՌrSvno~E4ܽx&f5y6:=lΛ{1i$&}eiOӌ;!@ &P=gڕV3Z=Gcޣ5{[131{ګsGEi%.|h? O% @zpgOl\WrCWS8bx[]1;ez^b3qiW35=?r @vu2562,hmg5^ˬ-ž"F63+󞶗iޛWbǮrZ'̯^oGj @ 3>DWi9Oocv.mLxE[[k^_/ d#M=揄~"]/>I^oW&;S @ @riĬ2hGF^z4:V6Ѽ"FΣٺʼzo.1yw%'|h?@ @x.ʁ|^܋ %FZQL}|n.bw`cvYMo˭z{^hxfuv.mLx^zzJLxig!会LjFs٨֨" ̄[U9 @ G^>y٘[gh (Y/xkDڝ{"FG^y1Ogcv5yDxFrѹx>@ @? gĎ&[EJژvllut0~iZn4S.byXnFg"]fG&W4{ic@ @BP4՜eviaƫ\N:VgE>HWF^>Ucxu^x}2|fuMwD!@ D9GD<3Q΋e3Aȿ[rEG^>U#m/*qO;{y G>z"FZ9tg=M^,z<^_(~zz @J l4S7Q΋?)&D "F6Y=|g#M>/VWrZɷ'G+=_r @&r֎tL.+ gj6kY͊^N"F.v">3Ft33}P@ =C}J3iz(wW\xFkX֍|/u#³U3kjFL^4Jmϗ @ X ԎLngM۷{V/אַTn]Ĉf\i?^mEӴ>:YD@ @`x3iz(Ņc5:e^_Y:;/bd3LHjxo35ѫ{䥵vRkC @;xv]GQ\xf곚^{mE,v=㟭zݹYwyMFӴ563D@ @`'݇_F?Ҭ(.O7y7Saw_z&i΍xi?fFjF=jc@ @N H37 3]Rg}C @UJH; f67䳚Nzr#P* b.io\F}6]{WξwX_ @&лVG9kk[O ut#*Q?яi.WO @;:ϮShG7꣪k7wlpvJ]F;Ҍd3}kFj컲e@ @8W<ڌn4|CN2~ZƳu71*U:o?:Oz{ @ P%=@W͌~;[KR0flGnfW֫fݕY}jb @ @ ^TڌJ|zwRѶ^mp̿8Yj3&3~*7>[ @  xVj2ڌFe4Y3R}|#]9Wk./~U}kvWzޱ> @`n6ߩY_]+1z6K7#oG+@ @O'?Ujҵo]{VWfW֮V'O\շo3[GC @X%p@?_:zJ[߸җ]i3'hK֓9 @ H u8нUw4#]־WL- @ P#0u0-qD~N/{xpZjӻ"o @ _X;.+'k<ʿ|x?.]>W}@ @ \k.ㄧe`Ospm~ @~.voWel;K7Ow0 @ 9KwO6߻|N9n~=W @ _'pEvo}[:^s|*Q^Oyjo} @ TˇōZl"Ώ-OZgxP?o;>پ @ 0"=Zd!o_@{tAyݿݯ5dGW @N8})zb+hC ϝz^W~:zwg @ @}e^UM:phsuWxB^_ @  I(WpzX²<| mNܱ;֬`{z @ ݱ=>TB6ar>^?,=!P@ JA!qa5?e?OJ@ @o. KFO#lBtt?WZ'sizZ?[ac@ @8z90iLl-9+W<}C? @I]C+ۼdW̯^o~>oF- @ S.9j{ lwZvj} @ &pف&L?ysm _լY @b_Dĭ\ew_ܽ_9X @ -[w6OxJ{>>c @ DඋCO牿= @ ~p+?SO+oF, @ @\"iDZ{)B @xEAǪ[c;l  @ s{9 =;| .X @ 0MKitk\j7|%z @ &%ɛ#@ @ ᭒IENDB`dtkdeclarative-5.7.12/examples/exhibition/assets/system-notification/Temporary-MultiInfo-Light-5.png000066400000000000000000001752371476226662700337320ustar00rootroot00000000000000PNG  IHDRbHTTT|f}b֧A}b@ AEEoo35WwlUWWUͯG@MjR*Lz' d/SNW" " " " " "L% c$2TXV4o*x 8E$)g6k 20$Y(&" " " " " " & # >S~W">(38L0H<X·^eE@D@D@D@D@D@Dƙ=H'.ED@D@D@D@D@D@jI`2)F= .jQf*0rۧ]z#0%2S͘1[oҩS]SE@D@D@D@D`r L"O| rJ;'@>lg,)cߡ}`]훪_q-" " " " "{^\u@^ ? (" " " " "  ԭQ!z&M۠3i(D@D@D@D@D@DH u zK;".=" " " " " "05ԍpM:Ovyzy'س L!NN4Lfݓ?>Unf݄IMJ' 0YNֻwOd}nT@{ 1yk=u}^:mzD@D@D@D@D@D5ӸS6.f堻uYп]FD@D@D@D@D@@ ez*95_浪॔~[{Ja2" " " " " "  H0zkO`C̨zj1pEEr-K^S/( LF-vDlnAڃj/HBݏɮBǩ4:{UpOR'O]W WSw3}: q}v[ZڠBMF•WS>TkP]-yUԺ_=]J=@UE©uj]_8 W|WCgA2UkUe2W\D@D@D@D@D@D @չVDr"m{W4 ԢݵݯU=%V1" TRw-E!],9b䠽J&Sdjy/jBJ Bv~/JWI%ʕU @a:j鮖0NvdoEqGѱj_-j5uҷhEZulguWZ_Z剀N"*]WݨnreJ(DjcVZͥz(@كj+LӫDXV+18JQURg%uAq^onɉGss▖ED'e2X,Fg8#kFFF~['֭[g iͅșrL~3Zx6D1؍)V.[xm(|eȏ3X"~WhѢ<0xFa5kc=ƩK4ԛA&#],|ڢ#!\)SɰٌWp;Ϙ18f$xܹ{o1G1"D\my./NSRa14#[NzʩŔ*K/6vj[o&L9mwTqd`x\~==dx U}#&SJSFG9aؐbdi_r.l1rz8wys[uVi" " " " " " "PMT),##<_zc9eȲHv)k)%r4Pr.lTbZIwݵk׾Ӑ^Wjؾ}.\\=]i8dTlrGk0j2;^'ïbF"GTF,Ժm۶RdcUYQ?85٨(MS|z%QrD'SNŔl(r^~]vY%\guTi" " " " " " "0YĒ38pez{C fS"UzK=)[jի!`Ŕ*E+H 4œwya= @ `~O7o_rΠT%sxǼ&P>\v[-U(bUaWL()$'íEOa*jbOCqG%wbvVb~_Gk{uċA+(QdPJzS.l!|8CL@"WHP>Wn;wn|k$ؖc\4hJ1s|"SQ{U^ 1t**(rdW;?$,λq" " " " " " "0U pl1noPvg(2ȅgR (j(ra2 ʷ@o1Ӽ`7 U\D@D@D@D@D@D@*q9Eqox۵<m=QdZƫB+_V(\eȅzV^}ٳ/ʋ@زeK,%ݓ}TjV0*Wn|x`{W 6l4_CD@D@D@D@D@ LMzAG$od :&?KV)ʋ-ۘ%Q*g5̙3'NuN`dd$v7vڵ.u… MMMܽᄏF3jᙓO>[%u5Ұ36614/588+Lϋ[|֬YyeU\D@D@D@D@D@@kkanڴ4cuPY֯ Ӄc9t;,V.[r| 1%78 r 3`+X;J\ejG J9]# 8&ᡒk^<֖fݢ;ۺv@ϚD"^.=}03fp+" " " " " "0Ut\~{qO sLña%(ev +Wwya1F0 Jgi!f;0jg$79z{{7|sǶmgObN B2AH;1 j' +kS-[6 [sAtvvoNi9眝I`npc>_1}wӗ"=P3֠i:)@ 7XoY{ /fMgoҙ#\677-_x 1MU'D:u#)eMœ4,/nu s9~/?p k:)Wk:v=)G;wlX~}b-Oi" " " " " "P/{ ,~iRҩGPQ* a2ay~zMbPiCSN;c^ ޥA8{X5ƒ1z[ϖ~?kkld2w]Z"" " " " " #`}Ǎ=5H300/Å~n #`}r}(Mc҂d#L677/F֔):3İz>O?YoOa6d&eLM6l;9~p/_>|>AzxNg-Gq ׋E@D@D@D@D@:3. -LG?jOh! `QBaAyŤzӼQ&I&@ O SLS\7/={`\'xM(w^ :XעgVA." " " " " uLcd{,=gӣɆʋOsU$!" QҢxNp^)04ŴN:'x1ƓƜ!:ӟ:F+^$N&><<;O=] ,pצ1 E@D@D@D@D@D`3TxӼZԴ)fzTL%b K/5-jJ 5kVFեVf[o!) a6'| 2X{ Z2>"vG 5}c 劕;׶=a08CVKMZΪ^z$ݑb^3f7(j#L6,EȆ2TAfM+tnWcq[&,^J0}z%P.cǽ}:gyWg%+RW 1v,3AaqN;/J[^"GVCty'=88c>Jmd[@A2增J"rMI:=[5ϖP\&O~r_C9dOu]וL&8Wxn?|>'еןi'x+}D|2׿ m#NZ7 äs_www$ʯ~=ܭg6zV⼚DCD@D@D@D@&#\{n/&-[yNhC- 1*/!`9<;^~ʖSغ$ /y7?^mSO=6sSW|Չ׾{ 5>\=۶mk`(5kVjceM2" " " " "P8.u`ޮyey^&-jlL1^bdbk\,kilL̍Ŝn^+]z pL@2Fdn,H,&M>eFr5,e>-zP~nN3t/qx5{OFad+UZʁ~ccc旿hw`{nN o]cSO=G=tRwod!ymwqG;{G^O6-e8ߺ?K^23gΜg@}O! [n 40k_,x,;c{4n0{&|s[cU׻M9|34^Qr1/NP0ek~SB1Yێ]Ӄ<㶜7o2nW% 1Q~~iBl>;͎GW d. 0¸0T( ((&!FfZ05.q cwd-X6::j.։L7Λni:Udtfa(P/|` C0{VceinqM paj`FFbVLnbd*r[LWk&]нO뼷駟}B4\:]0Ɣ$(7ӕ[1-ǝrg_wM3V/? LYѱ |z eWF%(8,W9z)_,c~CЇaw UXc9K.&cmڴ):Rv^j V􈡜cƫ~o}::%gick_N޺uun 1dUo)}jKUR&awqc!T1G99ZW>븐qp޸&g1 0)\dC@]*cP00k ֈA*^ 3)7lΘuXN&#cm!XK, q 10<]q'կΦsgy 4Oca7o~6ihAs}6rm/s3 k^ (SÃ40F b*T^5AGXAe7lzM?67;o ͘1c Uv1erlO#x."F\C Fj,on?!" " " " {8Ď{7'nSMHëй]-[N a0`4qn;9ʛ ]3:_>oa~[0$avM5:F\`@I) h.XyF7%ge0O95ݙsbwL sSӓhar"`׿ŗx2F O{bvtVZ|2p` 18Ax ws/;qĤayok)c^'>4vbm̙ںVܔ+&,l$@%tmrr/ͯl:0FpV sE4 kڶPjI%xIf`;ILh|7 .]Go܋K ø^1U"kyC>im猌l̗y)ajlLIV;%Wѭj/04຤.!f F#,3鶶W^Х!f``5 00VsBME0Pn=| 1Xy,r1&7u)س ]#-J~z޶DDBfv6Lu7-i9dy_s~˾#, ~oQ&8JYMVcJ5{WOrHSFpaM7eW~~i~e+8l !ƽPqHYf'5g߽^-j!g 4L#ր!+\64GN1N3Heo.Cot+ΠljTmRX=]̚.N2<֭s>S"y`E\°l[yl# ;y 44:L qLzPIԧv[ق+ňgdk,c5uxL^k_ZDed.)IL6^1[佌>sASLyf!ۡILhّڐf߷iG0%F64l;oqݦ,iZ6tH w:-獹& ޷A]ܨoǽrܖ&ʆ6V5m9;^m~~iT,'Ѱ M]k(.P7Xtq_O爃ixngiG㜆x gNjz/A~ěwNʾi20ĸ +fl4mԔq}z<`RÝ8 1OǶ3)'4iVr-&%I ` ONLCs5Ԣ;o"f. 1_6b3%d fmG?ux-BO4x=L 0v(ztʯ:C9sDJjjBh;nviv/ߤ,5 N%x2gL: 6!6mɹ:'>c/,̌:I'x"3tA0sD -J b%Nrgdx|y3K&nlRپ ^"x6]t;k>lW?vq QQƄ , OkƄ9k!&Ye?𙹬PvaT#څϥv9;^nUMׯ__*F?0{ixSZ@w4>c#9;u^v⏝H!sA/vf^t36y䷎b=I?<N#ugb Mp8`ۀA5?{lǎ zpׅeТ￿p_0_iG#$#$I#oH +JOx4›f'=h1{h+VzQ/[H8ꨣv}C‚|ILg>ϥ^4z|F>q}3g 1n?ۣCD@D@D@D`#`6&P?޳ۦ;<_뎓rϳfZRv1qdwM܌1W_3ߪXG޺Mg {f7/E -TG>v^]֎rQӌ|MB\O^3" ! zd&/c*&G>3mi_X{&,> 퓯p2=]}3sZk=kČ8)xN5dc/kLA.=t&9ҒSlN>d]>-(Mh09hm۶%h@7v. Kؘ4~2^{m0;9m){}5+X86avp-n o~z<>f`FIv{챃#4uԃi6'4P9}_^5si|'裏>lAM#5\һr0_ i<%o!gҥ|*ݍD2Tv?̧x,cqӒ裏;dM6-ifz=!" " " "058# Ѻ/cgpv' 0aB d@IDAT+?q}߰xg  T=c-dLiiPZP_(:QAm0  a9 H`*u+l\X^L&m<]@6 &/Fv繻Ni}y̙~Vwkl9?HǙ}j8 ׳4ܱ]F'.kF A''ҩY?nPhZ#4 |s;t4`zvL%5GZS|h䰷tfaq=uxua󔑥^93\q7q' NU0*l(F݄k`WvA/N:i䍴Et9/'!Ӗn-74cqn_[&" " " "PFLG7ʭ3[_/A%׮qaN|^4!.]a]=wQ~C'x)~18ZkZ',ϖ*2u+OR 1l|G9eM+kqS LUT*4[- 1Ӎd7B L'q}iK.4<^05 [cq!oÒqQcM7ϗ'(0馛tsg$;a \[\zǼ_}nߋZzixBa9춴LBw`͛ե,3WNqj>fyyvBa9ertTAiiCv&$kbKd9 L^6cp1{Ϋ"{'F~9.4p!ь#0(ڜqMLi3#Β3 md߲sxeCC<>GVv1)WKB2w5ZYi[~K[+c nPMb0 1^[niRܐ]f}޶ ƞ-4, AmNJ̠a 0<Ꝣ-׿:?-ea߰Gz/~\rrIv`g&?G[Λ{l ",㏭8'zͤФG 2v.n˘x1Lz5x;NxQr'fK3SxƸ \Lv\4k"{pQtLECv"Q&z9_qFl:sfw K3DK3:zŸU`jܶCAWӖxx ;M6pkupzsa6'?y s N4aknbUW]ޮZ402}^# 1 O !RM4`x#P q=R9z:蠡o] kd8I[=h祟i10@CNyM;w93 ;.W I,=FmNzzk_v<׈IxԈ庙L#LK İ1\)@5`EjhM9%Wg܃CF>&݄,dCv[Cs񊏻3cfwƚlĿ뇷^Ӽu0}a802(\~ :?A3xXR)9ֆ a~QӼzye*~몬M:3a׆FɮRpo`/~Z5¸ӑ {Ѱ3:q6p*X2nwLӬN?s'sup:錍sFV9};F|Ӏ4̤GYžx" " " " " "0Ȃ1L27{ 9(5!g#Bz3yǿ PD,[޽eנ8e14mAO&j>2vף!p00_N5}VY~ZΙI4ٸpcWK9ew^8&iaT 9^Ȕݰ.$Dz0pي<^n<ź/_rwtl?n˙}jH9C᧝uNKWw?# |et!` 4j [ƹQoYC _甏9s/09d_1 ܖZ22qQro+(gӷ9ǜ^][:XOi޼ikIlGFӰ2&C#-w<11 m?6pe㩠.YW:S4p>J>=SCy#=nHpL<˻*0 G3u+oMJ8 1Q ;N#cB^0t3NӲĽdąkMAL[y"@b 0&D s90$ xØeG:0,4\=F7:#!(K=ěg8g:q ogW_2ckjsm" " " " " "0e`.~KG cCN `3)eϘ2X? ! YX}.r3 Xj|˜QWr ppf2abcgj86`aPF;OeB:_ay/麟CAgǃae-<ʴ*0ً5w*g@#̾'rם.Ɲʸ״{<_;9 $u~j80iM))!_3?B-6ǜzx`r(792Ac/.!JɑF355+qa|zp0 8GL;8WWyt`RNޔub>6ܘ$cx\8E^D)&.cǽay^ٚbaŽ|to 'n"3P=Nj2\Kf#]A"53-ʲi2p==V-" " " " " "P IaOhL3*1PvP⎉ev&'7n0dʍj w'xd|lHpGCWmB4YYQFȖP7 Sidmiv)T9T(E)eJTin}j, Ƒx,9X-W25dL9L @ppU1׾{ҔpdQƋwir]W;݃syqS]0aiݩZ[4-)I#5db Xv]@7c ┥Sa8{s9o_xd+3=rm_4O\lp;[&[ސF"^0ˎ). RJz_L[Be4ol\X^(Zd6wq)xu{#{) E( -j/Q[D# ;,G; 3TXou-G 1H\"ƣ dA;&G3 39b'߾d{,lq>Nܨ}7?yuvs fLt&H؉ՏFgGmwm7vܤaX~<#cB[wN0bkȷ0^rVk $ v.ªۣ0;x3\+&+5Lh/cdn .3{C 0Lʵ %@ {=Q댤j8kQxz7t8_\nїAq7Y9&AhFЯj#SlvOW]M!t7%,ȘzC_ cd|ᦑtQY wk1aVNI»%)!' [p"dqˡG~&1M<-¦OB~E')e76566p\m۶aݺuAHܹNA`sZIXnJOdȜҽ3l~݁=K%߇###5>ܾ}{~Hf+d*X5^3es#`eKOn׀ڕ52Ec<ls=~ucp>ܦΧʙ<=7I;=37Nw21d"mWDQT2~~y~i~eKI5 <53'퍈kl,6]Yw78+,GÇJF`xǟTgϱw$ߒh ]qǂwv28R:YC w2Ȱ<цY]6#Y|__b *wܻ}#7֖o|R>x^|>hl<is^{k6zGm~k_[p%\2ws܁|3t:w]/~gqs9Rn={v+bltowyg+^/}+^1O'Z3Wb}o*Pu 7t׿f͚W;? 3A{hGGZXׯ.fΜgoݶdׯ\= \RT M555Eޏ~wl릛n:C]~w^⽝p=KR_n]7~#--->{p? E>&: /p… ]>0qNE?E,k3=С#<\j Lzah# l+ٲeFлr?xPu1cFu_o[nqeq<@Ď=؁B{=S_vb& pާ/s0h]E`d b x駟n-zްaC#fOlQq)0m@#7M7~mC&\# T_z k/~q/ )gCW9iL`?44D@7xk^ ~hPC̷׿y۴ޘp}~&(7+2Qp'1h"[i008k vv?{?===)O=<ӟ;lBm?ԣ9l4~bwzbv>}Z9[6J׿QtE> /h˃w}ǽs޵k׮^'$Bkww074zc7xc.\w{vi&?lt0ad ?09/{1wԂN&+ʖ>˹{W)0k;6~{| _q=;maFϫjڭק>~xܺuk>9~d,9Qm>`i=};nkvVPi¸5ށ6}Wa^RVH7 +Ky-7,^.Jy=*Dr084y :Q:kigXзnd &pPs}W8\y]]a|?SB»ưb마]! ض8xC>`eUnG)uRnStB }jCTTP é6gM'Zޒ[8.B<"Q3>d<Ig z@; |hhm0 ka/Tq0g5؜m>jC s >/bIJx`_̗dOl {x~֍VVrlm{i`s bPC466f8~=җt? ƀhA%ۈg<'RľMoڊ_Cgc tf6=Fp`` NReN=P[׮][WwP8@ukdp'1x|xt>sOcw]a{S  04DSN9=y(¯#EsϮ.zAdg콲bѼy<2+g{ ~_~>?s-7t3g_wYYƯFctOO; ^,QCkzjňz.ѨhرE{{{q~0+x>~iL*' 3rH>Sau}-4 =M|τP^G@ޗn.zd};{n6_ޝt\}~ z)u+N8Eސӯ򕯸?p8w+>έK!Wg~`D/~q.~=-i_=dgZF=v+?яn2P.W_=|`͗}*kkŋlguV3uaP)o |q~ӎ53GhF`ܽ8ζs?vL9a%ǮsFE9'ǡ(T.253fa_f 8V0Us^N3(Z*2L+OaBKl-IXju5r1\w"äğa|' vnUX7ϯ"Fˆ9c u IκqdroTw7UsI˖.6_CDniӦM,Q '8kaa]ԋv x@ćÑ#J3=P8Je SJvAk:!94q|hÀn.MSՠpwg b캂x>)2vćWy~Ǐۀ51eb_|cÁ ~'L#Hj=0kI?Q sFm0:PSFnǜLΙ3']cso}?mSL5_9z=e ,bov}8p]Fq:N0ɰ.~ofCc2}s  05}#X׳A?Xvfy^94z,hl'?ϩvL3N sTw$NU^IcꚎi3_h>M0溞W}{G/x /S)u3'ˡQ/G>@ws3˺cLu7+xjԉ):یn;WNtȐgxl;0C ~xO55 F.S`f9d4QcOqm_x䧅fVش{=tΣWg?ٹcIjG aHZߡ-=K{Gz*-ú_5D4L{ >y!<8nJ} aDik4Ɠɓg,fCfY&~K3?rz.…GU: ĸ*7T=ʹ8$2υ<7*NtԈȶw'v(0JL"I 0yaLd)YQNR,{o\D L w1\thp/En.t&ci7?{!a}LOJ"5ԀzP^"' 933 ӓw(g$w䣈$#Y `d5d0a!ܲK8҅5xs8UyЍ C/| 2&xx[sk1}QG pJy > RGmS z("yWC< =pÃB3+c/Ȍ=WM61?0$P*Au1z%a:&߆!W}0[aFPOek2 N 2Sp7Ы}FC;8x[ixVS+.н^`t@㱐ZX\cF z pS9XaxuiILQ)k(:fjh1F<^3] Lfx2ӟ`pwf|30q?B0;zo o)d6#<`UhX` "_kFwy}߼#4P3{_ V^XWI" >e;g7Nυ1cmv'+ 6.Yg=21q?AJ ]&}L-\#ܿ4׿rl+aX >ܻ'?Ƹ*qa$B˷ݺcTVdSow|fINkC¹fw7܋;x -x^{NW>y +mkS\3_Է}MdJmO9ekK*m!vmFFG27Z?kmkw8M õx5 t$n/FGa%pBtS3q+6F)ʺ5Xt# D1g\' EXg4 K=`u)~-wgrH9*tG/rNx#,%09D[͆eef3HKi|k'>(at~'mVbr"`[}s/2dVN3a Uܝ᜹4dcꦟZj][(ȯs07( 6 uE)dsׁΪ)ۨ4>x_5_v=4YJϠ5,H)=Qn^,"QRƬ . l^>x0ˤ]L"$My?x;Fё }/+Yc&6mZ}K[xv5r]^_(:ʦԗǓGOUW5O^g'|py+.frT"6~fQ,0\EJ`3+KA kj+2+qSz3^ԑqS%mo N6feV4_88?8pkߑYT+D"uѸLM4@ۏY|L/J#ڇ+ӌef1@Rf0 d'IpqffL4Ϝ}93 )^]@^4 cY? )1^ MH4V;f٥v=KЯAkyGu/k6O'tS#1fvյZM C@kRΎe )%K^)̜eY$%^wf5 ;wlY,1{/4ͬY.Sf g~fn`zCygo Tȳh<396Aó;B ZpA)bxMyZ'=ϗ罈 KdEg+f M>q:ӒM YzskYnC=|P /4 ~a,UB޿~oxL=|W5}ǚ܎#^#YB9} Lybݩ@% bY-1y5R\B\f~z2 3rdk邢ޥ(+LJr23]`$: 9fBŬKdeV\8QU EqOL5k[P CE)q(LbҌ(RFh;0syKu蟽 bUD5>]5]C-->Xn}`Ja M`M3йO컲Uj/+}TVV,OR.?}{OȔY2iU<21 qRVoI|]7uՊCgO;M>Gwg(q*էSy*(JB8'|`9BMX?A۱am2Q>RR_JÒ߄ cP8]2%flO[X6< u^{&l[0gi Jf,XD+C\K]+i0blHHef5o RҘ1p3ٸPJ͸ߚ̬a$X\ђ1AgugB32 إWCy6|QR(#bP|YuX~K14*!Qu F3qVse9ﱐgsgUA D!s$Aseu5uq)Q"k>79a]qᡗ1X<=st2r;o;ϣ45eZRzo KkJe6dlQ\yY1:Gc+C8> i/.%"[[~^Pֶe0>0,ϱz׽{ xы^4#M 8Z(2)#xmoۅbE*b(bq1Lry 09DȾbi|X:.[X T4X8#\dV\5V5Nỉ1V|L7%c5&Uͬa>0%ω3Ȓ4՛tźPY',7ϖRXIx8N?YfY|2"TSfs6Mj#rbb"mÚ-O[sYR>wDoS\^=;Ŋ-t#<<#F}1~o{k`cxw5&kX>^:5#ܖhBIӧ!6Dd˗OJ>M[_akTZ˟Ս_}x1%ɴ/J+#,..-MLNo"qt#)3ayЙ C!J&ۙ_ G_cg yB? Y_[vpF%]clЌXA6%-?!Te2 sgLA@W xҖeSZsmijdfiNA Eu8P67u?5KuﯖdkuEJ]̍ P $p(?^򒗜1 nZnc {F;93,Qk=zno VikqkIۖ`e**y3cL>2"ha0sJ7vWeV<8즟t(v3ouau{;Xzhq ŗ)y+،ВS„<N8O>Ewа,¡wȓ,%`4{Ejf,JG#}8YEY5%k3Gy$g`+Qڲ9xR2ϻg K8YYB c(,PvGXz%3`YJà =.d[~~9s6ub?rYyuZ |cu?{mmV{GKtdRp `F0!)>$ /\]YZY~孇#|Rʘl>J$(x2UKf)~r8wcUg%Y=_ymGi{!E|O 8})YM=f0E=J"3pZ߉ٸFchx=YI]j)ZV솆JX\:iX6 )]W9{y!^Z2`%)eM8,!Z,`@$adT !edkl4c g 4J[38DB A7J#LPkAuV %Q>tVA (T\L8i]_ ZpBA%R ];L](>HQ5vѰ- * !)2MǠ;5wV0`t R[soP: ԁ%@,pд fs21; `fn(諻Sg?AY> 2??ŬX, ;BW%Ԡ|. { >i([rmm͹Yn:,#;32p넆$؋aĽeG 7+n*Irk= ,lËuYYY $P܁%LVzXQ6n@IDATa9f!IX3~ɂr;Yϊ#G|x"hB.p9h:<0O7wpg!h#,2?6,cٌ44n 1h9i&|{0w al .aYw!vW%ſY|x?)ꇘ ?YQ,|*!)L œg1l 1l[mVRHV>9!Й`ʻwɯ/V͔ ))NXD͆'>|`tҙ6z n/o8ׂkp;o-Rd9 {k%K;| ITglw{w=vY2*B"ʠR^Ur#ޘZoȯ<5޳vkk7ct+O ӱxe,XQzB''ĉ-^=4w=mK?k- 1*_/86KW2l۔1ٞ%IkD[`_5+zf>o֮IׂEQOn`#Ulw%BE0u$3˱ڕ5LLeh)bXkd& 5g [\V\-AU;xG=s=\`Yv+Y!!x(%:rL02](|H| ^B:B)bxB⫛b/URT^{#vdͷ/ú>KY_B )wJXGǚ dYYG:wqڲ(d38ofyK9]Z|XV1{Qkމ/7)1(!gR>" d{pTLh빗u!:Њ"i^6(ƶ-Ko a>WPh0)瞕6d YF,Cl&,8 4AYZd[N| YAmgSOXW⼐o3 mnm[ADRG1Mf1CJh HQ:|0[*_b*)LC"JJ}.H`i 3E (S6co}@q&AhBP|2Em R'fCm&cDV¼\ v?nIՉnº#%B y3I2lgEQB9xzepk\zL4B1|[Iy*-,%ARdwHXB 5K&SE(Ģ R_-+O*82|_ːnk++?B-`w]B'a9R(Lk%Jqͥ z-7~VwdƸDu\_do6`̳۰ygc ^e1Š(L7L w}Ir}Y] 1)7Ef蓆 ʝG1cB)X:ߨ~խ{D)tOιPġUiO/`䑥O !D&&!2o{a O} >xvnׂ5f+f0zlOCYξ`zL727<)c3 }Hl+[X&]4,vGYo7Jg@]K:6~n;w[eee@+Y44J.SR8ӳ9]m,|@㎯;qB/̐tO-546>;DƎ'5MpcbJvU9rVzz3uĩ0yUH](5C0L[<30sT4ɬag PFa"&3|qċY :f2"\ڵeIQhL ̥IwjP#\K!qSChX}`u뱹>(3P0P4MUm$gʑ gQp-u}r5LkiiYKldDXkz5qRtu&QUBM!8ih3HpJ+JQSZzxHvQ Y8ag<ZVoNX8B,Ni -`y Z\>FAWGKձ4J|ܻsuBxP`qA=s2):w1j_ʠiEY9]톂%n% m,L}іoxpƒb(afWkE}Rzr@9=k5( ;:g B)b|K{ߙq'c,~۶or|=(pp>MjT|o/]J,yPVɖZV>86k[Um;yn8=N9ƧX+0;O^RRY!ck GfYv;(6 =Lxk,6[Sgsl=gv|rıM(OH“&fkEvjb fxe[2Kẁ~⧸rpjܕFݕUr=+b)sq=q=yy\Hzm?Ig9uFO5M#?=zȹ,anz○qIsx@ښ4v?'7v?_%;S 2ܑB'[f<_7J=RdOGM;eLfqnjWKyn^ϙqdW l+eAuDB˂L]t h[4#zKR7>{` )=7)gg3esܚw:mpK ~ zrwEf |e%|;3Ud}sVQ2%puGe5s%zb]4ۺϖݡP 8, 6\w oO}) ZB B1ҭO` (b, f!ceBs.zu1GɀsMSJUQ?C!,I@Q{%`u>y#;}sB8һxe&ֳVZaeqΝ_Q |,mI!:DLЕ@,=ƥ~xt>5f`&T}1%,yJtO楈i2l>l~S3o4C-,MM#ܟ-T\~g)}}"q,85)3ɰ݌4 v:\"$&2KM*m͞l_L$am `'%,m] ?vd}}wYljs{[5&l Ye"+1yS JrV,Usxai#=#qCoȀe\X޵P3;4[=/ߖ@:eXBy|(5)^wRzU٩ 6ZȰruyOk2 Oyq9CUMKwuP?. 卦Ѳ$mQ퐤ZOcˑRJ—K֢*USITSo1ݐRQ62*rȻӷin\_1W?ӍζUST(Ͷ2Mắ,5FC9Z*#LLLɂ!<޶z fcY6p!}@H#fG!1&j2nAe+,ϱڱ`Эe7{Tp4~S!KudVj1C ɶ:V#V6[& SePhɃf !|kp;_JzlRX1X:T23 [֝8f֕XE l01e\6j,Ib7ޓ־A@ ]6SF]ECfdm)kdrSzK흘iW8xHuP7% َvݨ5y8έIü%,!f\BZwjb+;s-MC |Kn&Pi9|E[LhһF~)x*+bP9G&\f}(@9 RBAØD S =rA-Vfr$Jռ#)w&no,;@+g7ϰY,~O8;GY ^,[nWO d 3>&4W{s8bZc#zy? >WRĴye{ޔpt߬L튄)7ȔwEO}4iH!)^Lioqy? jdZ57G&~9%MF+%S K13$EΔ08H%Lw[v% -F4|*b6MA)f}}h;.v툔)PPy%n)OP,H3G}qa^;MOgeGvFFr-z贱hرdu04LBg0%"f4$} ]VKo`FBYS)Z&%딭FyİD ezƩ.8gWǔݓG|u>ClqLV71Xc9oLefNq%p> .0 q<άꭙ#)D^1nB6hk* :l]53v~r|Is^e#1#Ŭ*Xׄ+N(ef(֌>L5h2aR %p,G:PT#2->y-)E ?>,AX'Y<4GBN\>`WL¬ E;H="xeb<`J:hX1;\w Cr{#`c_EHOQԉ 1 &,ct +v tfЌYTfe5 ]B~'fg=\B5h(gюd(tM Cmzfue{m]k91yRZ^T'{Cm<_qnUˍ}7k/i; cz *T^}!)m|aoK9w3Q&CZ7-?FB_,EJ=|٘SM7\!M% ۟o)A: ASZKn;i%LjiIN a_b,%T, E9ə3|Czqʡ{_,E82mSƬ)L*^MeK4`nShRSE0jфld.1+Ҥ` ԯI* &X0y9PU(YO҆%H63H{ךŠ;v^Sn׭~խyTm&G嫖3> k^GGf,^>lQ2g'$=-jK%iN3nGe5lGL?m,D6}PLi&~B{b:0z4uɯ_tmYulT\ m(QL?$Uh1 khS&|l_ V4rXShR Ьe:f(a '_GeUu׉sR(3a}—࣎O+0Rl==3}r8nv4hkRUXˣdh U`_ dLe4)H!uY<] ip C<mZ^nyX'Gx+vn΢1đ;x6Xw!Z,O>ZK"(o-sXq~?V+kEBO?ϸ( gö&\;]XC ?,xnC!+)3e+ffĭy!,3 G Gݯ-'BP?q絽*Mk?!|(U5-Yz?2[T4=s04FY]2"^{KH"^p|{/_= ae׋:vDXEo)#u91,(KYygaq/.B__ہ3h;Y*F>c kyqKuc:&(w׻#×w|wGFǒs>KMXfŸ1~|P:KQDcG*D 22MK.BY"ZS1Y9/kye3IyPC,^T uK|:(i4ݍT4[m/[p\ EY/oiy1qe3ڹ0ڽkGy]R>2Q٨ha᪜26ޘZZ1[r_+3Ϝǁmcz\ gΜXz}•{]n~C.i)ɹmfGGFwNbS03 L?wلD+Cj+֬|^Me|y ݓS(5)͠#첵| az cʪ(XS}2<@>=śa"{ }^~H}JH+빸lߎRwuXVJ {^P0٤y#>HĒ1X*1Ww[]N1x*yPیϽ.±MӵY3v2`2Ly m~+)]$q)l.J+R/SPcAELR4`Jo n˕?5] \8lR{Νc}{ss 37ܓ}CCLѣ3S?pvJF?;2sK2{̧~iiS[^z㧿8},{]py䳟;(=XSq6N=qʝwL>|Lzu3=zbchfCMyǎ۷mʄ\c-cL);>5=*%G%[s}4[dvEcL zk_{ U^c8[.Ip\PZ7J ;L9s|Ā~ƀeA mϐp(T0gV C>FX dmQԱa ;2(i=%1Wi"*ϲ)ՖᤞeY!<<(wȃbc X>?3X2 8zlsϬt-=qEC8'd9#^ub^H<iY3pQfc%-03,Rs.Bg'Jq73*$޳"Z)Fҙ 3}z BmaQ-j7% a\JT8g7z9!; Oa{1i):UzGpvnywG`+֡Mmvb$;r&SXh&Zz3BMڽHafnJ^F8Q7UZjVUK0ra,,3vBWĀ#8#8#8$dkˆf"J7m]XonF]y#8#8#8# \:"$Yصz*oW8+pGpGpGpR7p*b{#8#8#8#t.5a\;/8#8#8#,0217 %wglGpGpGpGA -}Ü`ΉtY?4IOW^߈Z{ UԱ~P/~. OJ__xe%G>zh ox>)~~?<W5!eMt_ݲ.oI7˟bi R__= y᷼-;c]zԣRFV{d" (dL)8;?s?TżxbKZ*t8dSGZvtG^P}wF~r fgw7&j-o֤-{᷽m;?9Ϲ@Xv`e^v_Q}~_8K^+Svm%U#8#8#l8 7-E͢ L^}7@QC?CǭNtdN7)8gڑgE.\Voqu\gOzXœY7Kŵh>o7˒T +iRv NK?񏟳=a$+xRKPOB}ٗ}Yҟx8#8#$otX|;:n)b:D rKy57*XmhiQBBK{GJG`C__F"Y̴4(0:h(;U&--MOQ?ˇP0v6"_ u>VdErEpz<[GWxα F?) L Cii 뵐%hZu=\ҭ׺qGpGp6 =ISܝpdѯ-[[R BgYVUY#Uh,YYiP6u!J"Žζnf9;)[Չ|#41~B3Eʙ83_"ė~问#o,G:~xu^UL+.]~׶v:#8#8@"p*b6}*w﫞٥KۿNW81剖ʖ??G[6:UOO. k';,_ Q)NZV-WbeN?]bG(7O -92g>-%Ȑ=rYXՉg~gSl//{^{+_ٲ)|5a K3[ز~y8#8#lץL71&7@hNZQ@ؒmἤߺ#"e]fe>۶m[SF D U?R4\!JjY|*E>1SN=y3ZNtMoz4BF;O^v^|r-IGYZ JӧO+瓟ؿWꤝ)2X."_~l8wJWN9sF/Zu^ʯiR5dat+ˬ^IY$ٹ{8#8#lRkwU/ [2گC񩰤FʄVQm%3]uF>Y.3{FB{AK#>.9ʫ??:w߹m/NLL,+oɓ'~~С+Z"% 9;>cޞ={=6+4$m=Rߌ#.6Rgg꩏eVOxZ !,_0yhCncA1H9Ivwk" &=IǴSqGpGpG1ZtZ~㯀)ЩS[i:'NWSYh*@Ib g>DeE YLn]Z^y3qIafzپ{' yciK^oyi??g=+wT8 Yaq e k+ⱶ[ʢ'>񉗥XjQ: ;3 0JΏ(U_UkhWBp[ +:J߽#8#8@ mOZiu]I쬉릴)m9h>(lLy1˿/Ks,ovZV5i.RNMM-˪g6|eFeE/z z7~cMrXOOi·}۷B6zc᭪>YW?Ϳ7q-;&''Q'A -xS:eT[uE}7",iL(8^1-E_=%4J^:GpGpnjL75(|/*bLYn{5β^r0v2QؠD_|8Eb:̗<V9z_ ׶)2bPK?eY̠ )TIɱ -Ù.s''_ 0rV|yK>Rg|||y?剖bʲ]6 9=X#'Ʋ.ĉe8%)z*+Uն`rMa9IDATW5.9=# cY`xGGpGpn8Ve߼Bf氰[/rVO孞ÖPU:{#l..+b*Doo~vb o)%I9sK|HёpRsO;6#?#?>;,Bƚhg>Od7{H/<^|Q;2Yaj-amkҌrH[>EQaץ8raIC{d3BR؝3n9#8#8;Ⱦ:5Gͺ:JG+GELG= קKNK>p yJ8ſ ؖ'$Y˹ }]yIslGuKHrV u!Klj׼5,..Ze/5A֮,7<y?d ^3,Q̢ŶFi#kAi?8ի^u_+Vڵj5kgYXp` }GpGpdվ<|ty*b)6z'xf<,zzgr`#K| ky([LҥKRʖe(M:QniSQ? y8#8#h"*, xlV;p*ך,ǵv |ܹsG+{z%vE CGYRc h+($P1?p^+$OgYR+[Gm-6?6knPgI%SrJ;'cr-q:sV^Qw,D@_)7Ka5/ |#)WβJʢ,?h\gHb-'m X"\ ~!(52Eg>r~m?a$7k0~M^Wdg??@)irx|3pGpGrdcZ ^ǵHQTy!i皿6Gv Aa.XKcGI)nPH}q"(5oqg>ɹ)J_qR ʎnQH~{ZV }Η~./8+ #À>=-ݲ>uZB9=eGeiKbN^vA%ew}ws_aɔQ5xwDdiB-}Z׻޵ӔIl^%\'pj,˝=,j}ncCGpGpGfAw\[c.{2(]؜~ @E*'LO3ZՐqBQ #z{UO>QJ-?Ig{ iVTu%HaqP1 )ݻ%_%sq>Vȿ<[B,cb;toEZj4卖f-J撬E_.KX &LeRY| ۆE2lWokS1T5V=ǖzqKdle7aeaRqme_mGpGpY'xŋݞ 0Y0KL|ډeR:4x9T_ \(ameb0CgaU煩zxYJ/WhipGpGpG?ҤuN(blS@@QBzQ<1!*$,i,quh!oQ #8#8#8@/!% J7Mg/ Vg vUxiʠT0BΕ1(Չxf!n/KFxғ4SSS_C~8#8#8#8>a>O`%L$e!RcEN<.JъqդE`5Yey)zL+JW yRqYȉY<b޼Ձ2f?~/$#8#8#8#<|ckyYف&T,Xݐ+[5/҈sX;qJ:#IY, w D'_W5Je47rW7۽u2zU##8#8#8&"Ll,2+kxIJmyEeez6%YsTd^~CT4#/~S8#8#8#t)`fxw˷|ˇbH!n EZGJO-/yU)hvekJ0šDY=0Ntq+gaX,,3 /s΁-{Su;v 'GpGpGpGMf林{⦅S0WWCL( [TONLGλ7ne Q"VFIL^~ӊUBTV%x,*Eaӎ#8#8#TA*)Eq^>yUV6-u׍a_ø}݇:'SEPIcZt['-mD[4Gf*GnG\-,7>GpGpGe4tT2]a_SyWg#Ei)0t?E30 KՑYea'eNhl1t(?xCzY<_D+ /'u8N:UqF', ,^y8#8#8@uy!=/nCZV%xSmaoX.f]+:Q@ thw3וJס_o8#8#8#PEh/IUCGpGpGpzz_*]ZX./~-5CnN㱾^7V)b(%W1zXhyaW+(oC1 ʥS?MRVO/ha!_n~_NqGpGpGp6:BwoQ~9ϘVx\OW7(3' )v9:v*xS|1-Loda~7ސI0 ZY :딭k+IUf^ϊ 0鐷No^uȫ:G^}q^[*<8#8#8f!PG@/OѫB06a:|UyS(kGIVEyӓf)b8PaQ|aV_zACSeC0ya*n"/N:ȣeKO*,j74GpGpGpE]AJ"9ϘVx\OW%»J'Uъ8muaO=,M^']B<>װOq^t'VD'#OoU%8#8#8 PUX/Oѫbtռnɫ?'R:6N*O(COƴ0>T 6:^eq>iߺ,1_n\\GpGpG(C]j<:oH oQj^ȷe7u}E czNya^ 6:^vW%ɣϿI[7qGpGpG`#Uh1OQj^ȷ_Ϋ#^ޮuKCgE޸|G^Y:tܟ"TxRy)ZN7ˋˣ/GNRW꩒.oX㎀#8#8#lu2޼]ZX._Ey!_^ ^5^|oQ ׃"hW aFvRJ8#8#8@'tղE|yy)zZS Ee:qyKW3MBI ݝòa<Z&F:U4MJox򍏰oX㎀#8#8#lu2޼:鰮0cū/#.W%iyk[X}a)bpWWy(ѭMJÉ yyU)V.ʋ^n^Ft'2ve2Ey#8#8#8F O/jJ<:oL$]TݼzUyRR*uD1lJB+뤋x)S:4x9vߢx޸l;n>zGpGpG6[^oݼL tN=]SJ+PpU2_L$UeWD/##V3'o;ekGpGpGp@@j2EV>{h QXmVlf< {7壸^֚O+n=uѳf+jiH_SyW=c  x {1^iom,n[}l0G+F9j\{}e>Οqn96Vis֚=1<>~ioW@@G )bVl'=t]ˊQ_l~AYVl'[sĴ^J䖿ּj>   H`ucrfy6/=Rjي_~گw}]@@@%Eyb{13}VN&N=VmEb4A,.ĎbڑؑUbʚ彧~=   pgocGwŊKv/2^mZALڳXV5iZvY^ZG4.rQ32>   {;6њ~+7/jӯGy/Q21?<[9h^J(WgC{ו^]@@@V6Q\ʉGbHu1+e7@ Ϫ}NO7FgKg;j̃@@=Ϧ>{d=7{Yhtzs3crF}~џ]Wr{uC@@nX9 b{3}9V-]mקriN4^Aݽ>;A/7y1{<5G@@fvlƣ5=^gg[#;9'bd3rO(fʵ{SV[ֵ߯xF@@>AvN<;]rvYgrxzqA {=Sߛd^mh<1G$@@ޜGyG1+V.;jk̭WsOݛŜy'f&VsFs,G@@]pbz}2^>e덫1q彷vvA,&rxxF1}޸jSwe   h-o(n;'ﵗ㭥5꭭O> F7YbFZ'bVuxF@@U`vŎž37D$-19L(yQ25y5N]g@@@iEdn:Qb8:{4^yr F4eōZc}LyV=8#  ڌώĎb/o4h[_]=`OLgNjybG1~1Ō=5Sk&Vskd:g@@@26XO(f/o3(O2^g4?z7{eH'TgȻ֫?ټNygx!  Q:Zˊ915wsZx\o'd8{՜_@@fH7w2F޿gEL3bEskF&   / 6b 2J~0Y[+8eu5   ;65yH7ݹE7sɏ_SGWGO   %=DxWNJ/F9ծug"#aS1ѼqDѼ5V>m   7ZѼ8יMLyֈEk6OWruuWX!   0aln4/s6OQ7{G/bdR7m3Rc&w&'}vُx$@@B:y9c3y39ʲYCkngv,.k.+ufrgro%Wkzem@@@jk23J֐kV}x.3#m5:y凒Qj}   7N5ftiu&{%wB3Zk%%tͪS?1hN#  Y dRg%Wֺ_ze*Og/bdn3Zk5sƜf?ҕOʚE@@86Ėyg[_Bg*>r]ߵyeԻe1?6   R{fVR\[ƜzYZ͛s˪U;ȜwO@@@3ʪUQ}:_fZ]o6  /p@|2e/kGMq]_>aku8#   ,mCfήUW?~ڜg sٵlO՛}   12   vXuw<\um]ϩq!bS @@agb ͔:q?9VSss'5Q@@R`@ª?a+<㭼O^'}坑  84O{:t?5n%d~z}}@@@mbլɱkϿ֌   ` ?r瑵?} ߲1     > c2יW7~?V   -=5Fno ?݃   lavM쪏.Y"  1 bӿ6ZOِ<&{H   |/iOo#;(  rܧ|;M'=+   ?,1/;ÌoYGnG@@@>\7`|w=   $/C_XcNG@@@~zH?   <)Շ.-X$*X-C@@@ []Z>Tׄ@@@j[j d1 3aUĀS (QKNlNlN陚=0[髯NuGB@! B@! @]Hյ55(tB@! B@T@j5QDgJ@=B@! B@iY,3Y"&a"L'B'u,\'YSB@! LaԸ6󤼙סk3 ! B@! !B])kƉ{3WKQT,B@! hJҡASaLfK3]3¥Ά"B@! 84D5.0o>4u!,B@! B@ɏ@SMsCqh4 y7w-B@! h(11+uO5l$v0k56B@! hN6}|^2FLѦz'8'rqnՆB@! B . dD{|:zOݞ/5̜})j! B@! @"PWBB&B+[n伞mU~ܺ6fO\<%/B@! ԍ,o~f^0.^Tuj2fGlUA! B@! A.A6K?"t5HS }=ڈfBGۯ>qLUB@! M@' y9LO#Ј605{UZ! B@!Pkj:yO_#Lq*j6ZNk{:5JԻnf_'B@! ,lzŀ"hM_ xFBJz^p4M}ŅB@! B LÛtf)3܊{-&YZ1+գhîW;1!B@! B@T@@@?N=^Uى;{B*bZycXذ B@! U"ʾUu&~?̪K 'IktJoNvY۷B@! BHl^j~r]!k$u̓Ro@B@! B@5k|KH419Q;+Vvu'~\ʩ3fx9SC! B@! @f;~WW7xHQBƣ Qd.Zni%FndCRJƩUV1؂ _X:,EmwVq! B@! @,c駟b ~pp{Q:z5ujG%LgʛzIմn8C[o=aҲ, pC! B@! @cp3sI'tG-e_&|8l?jz*Gn;GNթuǕ]Gk׮} '6` ! B@! O<-Zb[܍iJ.$-gUjz*Gj;]:׉J|u+nݨQ(c~\ J]۶mHdߩRB@! B@4Q9WӐsX3:(l=q哪kYL \5mƩK(Q2ӗ^z霋/3G{B@! B@F"ֶg}|wɐ_yn!wQd5SoG5u+m3rf&d.NݨQ2\B2λbD>3B@! B@!PǦ>HpU 0;5vEQ}WW騄L`5ũE2du;Mh#2&B:B@! BRp<{܁PNLlo|"CrsmN;'8zd#I-D LJۋS/l9r]\{p^WWשqB@! B@F!044t̙3?QlaЖؖ+gQd]%kmîWi옢8 "*TzȖ *g>ɘwSSt\! B@!  e9EJs܀>͍xrQ&e? E!d"lZ/eʕoL[o=V)-e ! B@! @#9-(ʍ^E9yuUZϫ't32^r2酺u޼y;M!)B@! B@! 8ͻ2(7g.WNQdyU^f"d*\T ȕ +g_3w:B@! B@LT8y7hH,;ʕn8raiXY2QZ'\ ˂2:m9S:.\: ! B@! p˹.{ޡQ6hm"U:^U 0L5D:Qdёoի_:{7V ! B@! h&lr~-q%Q2?aU:vr> #$5r}gyL2ʶXd9B@! B@!$y?|ٛ.WVN=-rLڹƣ)'Si9եsW_}©VB@! B@ @:ZrN9/SomׯL.2eܹ鞞Z{:nn9眳![kcs=w{[UNB@! 5Cx}7mdOJX>a~Pre,7G#cqU,dRܠ#^P9+XU!U5\:dur9gll,5::jXp>wPS(B@! hRz/žsaă2AVVTTZWY3E1|9|2Ex蓩##oܸ?XtftC! B@! 8C/BI<٨&τAeArtز{Wn!Q,'TWG S JEGS*gѢE0NKYFk{JԺB@! ܗsc?>o<|6n>W(-EƖ{ZwޠD>u`ggZ' Ji}[t(b&L;-h`MӺ{n!Sr'xe-Q,pNmE3<<ڰaC`\*B@! B@DFr.7ˣ#5`Pb.HQz02M?k> B%K?x;q+[o{;1cƌ,DDʕ+;nn&J9+V9S;::r`rE7tSIda6|'2n;wL_ {JY2gqFi +(.B@! Hkk&) s<Գ02/{X3]"Q(a2q˂<7\cx\k20M>=lOS/9sfuhrw:Qs-Pٳ:~g?I_WSmL2%[$v:oq J202gΜ֭[[_L^ (C! B@!מwqӊ_ e0L1aYSub ~y_o&=^+1+aQ kˁ,q=.\pl-+Ӿt[UV T8"422zV^2'!BO?dkIcǎ4 i)Cͩ:`ksw{C.|=?JV={I6y睝'tҐ[q! B@! @p =Gc7(;izZܨG02|e\B@! Byřyvu+H6(?vk B&鎰G9ٰ8~>yW}~"B@! B@Ta^Լj6a2(#raAe~E$~ҕtKU2xᇻVj(W^yԚ5kh%C҃ȦMSu\-3XbN?.p1֭sp%,%kS ic,c˹6CGASVu! B@! F h~l f |~ %˕W*k v/Aښ(;+͋Zϯk0B0K.qfq|r/TrNz%Ǻ=Pi&1K>LE"]{9gwچa1SH_! B@! @M2O"NF @k6\6neyQAwW¤wʕ.} EIOz^[^s_^6YHpla=rL?O/9-?FôCk=w͛7%mJG! B@!P;8_Ώy4{˨rn9rFOZ[pIazʼmGm)DŵV1[\uXΘeK$A^H\DJuE/駃yv:Ųֵk׶eŻ^U-[6rg<:]$y $^җdW!]Zd+.B@! H9_ݬ.3(2Qd1¤ˊ$Ƣ+'VWVi^z^>" EX\vD_.~J Y$̙3%H$~hB2'ȒǮǕݴ҆]_q! B@! @\ux-eiVy~2q(Ooor#Uȗ K7]NQGɫDuz rʅB@! B`2 `2O`(\b c>o;¿aeuvkdɏTT9oJQO^WB@! B@L9ʥ0 ʫnzQ_KB&W&N+խB@! B@Ɇ=gܴ6^~zMF2~uUB@! B@Ɋ='oi?A8z2rAQˍ\MZ2e0quD/'-/2! B@! (7{1)WN(2޸v]OBU kEȔA$*QdeaioY -B@! B@! {lٹri{^YģP6𰑄L`E)ON̮B@! B@Ɉ=7m[V.m5qo_IX7 h ~Qdtl]Gq! B@!  {Nlǽyӕˣ|ouMׂiʁzP 룷N=B@! B@!O 4O 7mVf52xkAT P ym}v];n0VUZ! B@! DF llqxeq^}&S.ߔ=l!P\o_v)-B@! B`2"`υwv7[.]m}?)=F_QLYBQʕK[M^Kq! B@!  NW֛6rF!a҄LAɄy#tX},JOB@! B@Lv̙m/ae^Ytaae(2Fl$!hܯ-o^݄-kmx%uL! B@! @"PخcǽcKWƫ3tbm%IT;AiϫNqN,J[_i! B@! (sd[Ƌ]f)M{FIʏ3QDWV{zvϢrQvc6{ڴiٳgg`ǎ-[y2}}}$JB@! B 8Wč{+ ֍^>4o}2 P#L.qSqے|"먣:/x~R]+fW_}ԤJO馛?'twv6'jY! B@T@5s`v&+t\y?uͫL ʷxe0Y̎:uRֶyӋxXCLveS;::8Fm.v2ֶ$nq'}8ʏuQo'?"9?qBwfu>4t[[t:UH29f6aߨoy/}i0j \''8~p)2,1yJl\N;]{ݥ^:{׾ٗ]vٚruT.B@! ΙXɄ y^ydt,/)Bi#_vYPSo0rMX(9,Y-DAlvaW"LPynmmd  YN+Ezt1Mů./;@Mp-믿ctG7=ڵ+mcd_޵RN:jxFM5ӧgOկ~5IC2B@! BJ0~Do3V敭g:~%ED8;˳u+eyv:d^'LցUt` 㴥:|qTƋ,2E)˙pN˧s V=|֭ !|d[\Fx'S7%Xm[S?ێ>/ PB@! B NOĩծ?2lӥI وQV2Vv]s-s.ƍ"4 }{sݍr@˾hwZF:~Y Y$[r9A<O.^kb|µ1`3z>tuu%ޟngŊ#v7Baղ>?]B@!  ϐ3v< 6vmBjri=[Ô,NItmzɗi:׭/$,Owu9c li"% +,L^9@/ʨ){Ș9)4Osӝ:֔k-R{ru =iW' '_2 = II2c-] ]p D0[Q뱌`iQ,UrWtXe}W(|lO~2}͛7#`Ae0oy[uk_ڥ p _WկvB2wg>9-5V#NȳqQ>6)B@! (͸w.cUvŲrio(i(ub˔^c׬m~mX>GQV`$_sl߾E7Pvf12c f289cN>;fW\ = aS>7 K1g3FlDǭ:*& l;0{f闿ό4'>9Ԑ1(tAu bm~׻1[|uYpTE/%3k֬Q aCyXL;ķVG&I"1ʑ3ߟ_~ \E1g? Xf~ӟ]I~׼fCƐ{?HZLRP1<&u7,XZ}ŷ-߱PH9sIcΝXʷG$qC! 9_^CVgo$jnT9Auݶ01NwA^X6I aת>"`">iXlWx!No~,nL$$~>߉ݗ\rj?Ur` jk~יryy<1,Kɸ6$R 1reoKSnBtv3o?k~>sXy1'kld ,cr9Xʌ7By|4,a@d@iH| :no6lkd\ iw=Wfɒ%-2'fJ6`u.orZPPd .9ŋs a9aUAKL0}IёԸI4\vceܹs9X52:6gINlݺ=XDK%#,]t _z㳧TP|-6˧˴JK_Z_/~) ˠKx`y6-~˯Ͱz֙?~K63G8(.B@!PB`w)]FdR~妬ЫӛEƯ^-ܾB 4J -c&%X5\!ZB;5[d2A_6vV Bf1 Ē")3X4b e\Lu .[ʂ|sai퐟纖)ْlCXNa|w/~q,X,6d/"$9眳2\6ǻۊcyTiG)\4-hxwL\v|so,qI%7f>Ұ6it?$5nX$e6뜖-̠˖ #DHva?NòZDБRs{Ζ-[6ލ7ԡE/Xtg8qDʬeLdWH ! B@"0%_]nm;nq[fԷ֠Eor'O/[ZZ[)YDŜ{pu۝@>ٝ'# -p 'wZr2&ɁXAF# 翭m vKLh~fR.R(5̅LYGh6,WRXd\D؄"ŵR  ]=.,! ]e1Z0;? ta-Zgܲs ۷0' ;{O_qNegۜÜs2;L.@){!&8  \  \>c",YJ9 {ᡎ8+÷t;oސ˖ !M9˃L:Jh[?u֕ڋ0DYZ00KI|NςOy/2wӵ a~v2l=G+vvM$- _23_җn/5QI(핓aR:gJVX=1 D.ձ ,(yc(HF!  D!bl9;$d^tP[QWHBNT$&oǍgM^BX2ܭ{.=vaӴk6mscqN?bg?;2XvtϮ?Iwv9sgEȝ5s߶[_uL}ȁ"qJ:7l3-~u,^B/H6N~/A$`}ssa5%?gcg4< tP:gE;Ca9=a.H(df:?~x(O! B`x3DLpLQ^~y^:Il]B-txgzSN d(F/r6mZ9m-Js Nza3g9aow)m¶!?8͹N~ ~3t< 2◅ [/F`]c??:R-v)uUW򘄒q{ GQHeNؚ%fuPɺKJ^94%Q\eņ_.. aRïZ;=['L-#tKeLZSO `}P ] ƴ֠s|:VoTT! B`A//jVz o6B&(Moug›o@v gWRXii!c|<9cH!eƆ79~G+ iΒtN~gCXn]/i=%\#$[wa!m3r;4d0.[3#m~R,WWQ.Ӊwr nK\W6ɲn5%Z`ՉI\Z b蛯ۗ]v Ș~ԧNQnuʵ^:e^GR㮤l{nhO5qYå,^׬fw^`m]ēw%mr6ka)<3c=08]k`;̧dƧLe Qp <#e'(lX|c[ xyHann-X_Mv+@Еq ^$7Gkq~SB@! 0sbڕO٠|[Ǒ5u\r嶮a!F]Qe<]> "c0ctx)ƞ2p1";k6w|Ir΂DyZрOl%ϝ n04y4Ht.̶[d\岝i_+=O.eﮄIkV;K-JR!2{o;Tn "d 2,sٴiSƫu ax믟v 'L%ezk_ڽ.fps|3CVmXb%A_5\rpNd׮]z׻DNкr  B}sX'~NΔ[ iC`_wǃc"?rwKҦhA^ 2-_]XGl$zH;-,sYeZ\RUqW)/ z;B Y& <6|I6C|`Gn]i^cf9/O>yNb}: @IDATZ0!kO뫘Q>6I CB@! $D llq_)+VSFGuMED y쓝dP5?aõ>01kmiX[{0;;.p"j޴;?z,BrN}뇝_}kxёs׍)gӆRȫnc$N}.}馛z-Z4cS.ҭ.i:nިՎ;j;|衇ظ;PA1XDur-.u.W{:8q] V{{{  ĝ>78}lB@!0~)y7s"~ev^Pa9;/H )oʃ~qwN_7/Nږ +s֋E3[ڻwa?P dF,!b,"Ť˽e?Y0/ӱDSW8 }D@pꔳ꾼3[l̼3o:tӶSgEn,KHƐq7,2_Yv\IoiëzX!X)*B@! 1(2a6j#DL )o&,gG{墤dk!gxkYUM#q6 3e&4γ̓B_]/w.Tn" Z`IcNq^{"1T/Hޙs6+Xp@Sԁ^紁j֭Y90y:Z ˝ѰKwlHB@! B@L8aBjaedT9ǭG>OLP͎5VVftE1Uyd2-"DȐ0LK(1$\N|9_5s.aGǍ!aKp D{G۶s}әNuesXxiӆuZh,KG BC! B@! &Yahdʨ. NFT au·_=<Ô5loOm=05yiB zbB%ZŐiKO{KV1.QIS疍N8ފK+ېtqm,*ya)To-l;"d!)Hyp5cV1KrEBƭS[S.B$E_?8ZǐDaM[W3uޑTW<2pf~ #CB@! B@LF*UZ^46r߰RBWYf5;SzjNrÃc9wj1a\Z22{\Us¹ouU ¥Jg!Ӆxٶq؅ 3L!E1ECM0>kI6A1rp뻱322ki I#B@! „SL6?yaz'TD#dNPW:>W::G"]\ا8_u#оp)4U _44,@cpAA ٘l/,C"9S GN@f[s'Č*v L}E˕\B@! B`!`죒:q8})+;|ȔG  +4WdWGzQ,PʥYX|޻{'GR@x1ә}H!QCM+:͠ 2Q@d!Aꚵb&S㡣r\OOvX6:B@! (SQQ:MwM3;W#=MVO8lٲe8,XǬjz_\s5}=y̽ڬ}scǎ9sdNjG}G~WDؗǚ {fpp0fJ[[[/|u.nذ;rxMҰXi~`+wdk䭶:Ima$Kf{n_(^7Hr&$aH^缂!J4ϵrA>љoVly2f8K1Kf//XȸMư.?l]Gҗ4s+D7?w7$S:@=??\< qo{ַY7n,}iƾ3{,$*ᄏ2]v 'r?&\5zk|O4+Wv-oYwc!HX ?w.ߑ} V !0ilQG%mWR|T~ ʯg^t5#<򝹶."*2S$c:gȓេk(wJ"}6\$s'(䱾K0*ȸu3g5e32'dr&9P~ >FFFRկ=X^Z/_>r! vi?Mo?#O:/~3fL/9ccc<Ё.Ky-vK^^)Srs/ ]=== F/h?0l ǢEƌɋkwczȼy/Ǩ׹~6>Gh c_jU۽۹m۶8`3r&w8DC#ghY'?yM7~w+aşN&`E8YYCZT;7]~D5l A :ʂ0߯_^?=F կ;F_-_&/_ːd&>\j n'0vM5~Kr4]'M"Dz2P_!,2nKu 45P#wl}zNpOzuJav{Ŵ׿[ARLZZNعh-X1 dw]w]߲eF>яnziW2 uh-Yd_6dM?[n<<>o "&8#qoR@L>On4˅?k×uG}4x|IKBŮI"/x׽uۃƁ/3~Muvv1 |Ks)Wՙ_[7ys\;JX_Wk(y` 㒱zի[6sm{\}2pt.hKȀ #(&~ IOry=DP7>/Mi! {2WkEV/,DeM@\?eңޟϹu14XR-4eAI/m؇ _좕,?jufz~AB`"9ٞcTS7^K5!NrkZm>Oɯ޼kXKOwF3i/ʸxpZ".1ХKV) BFGAM)HYS*)r10R22?cdVE)g#LTbha#T.hN :eن9w6N xы^c|sQϐHH`wxӟ8 GXLя~47͙^|6[[[ ^q }'?O7pCϙg 7{,5Jay0Nˀ=b_pRl/1kc/jC ]6HXn޼tjO!c' {-(ZL/Bfj%cogo7 O}jέ 3~wmI&Ҳж/| sijN+[yny-kIL}QV"+n>aHȘ{TҞC`_!21|hfB-lĸK!1T s-q0aG~eQh f/ףwukVom;ӜN{LJ cB3(AF@ue $LRKka]Ӹ2 ނ5 w uGJ25Sv9~ ӭ$n1[DZI6o gzo޽{wϏA4rLt9NDii3gưwN*iAx9p>;䤔i/1:q~]wuE9۞9ALHQZ2/!B$1s"G,+>XnjrK &ȷ b='UroϦ04]ɥFLuY; 4 ,gȄ^B~iheq=_W,c<>M!AA,??eKQuPc>V0SkN`^N?*~.R}pl&>HnpI?NdҵB M'yݽ׾t>ٔ a?\#vDy, A^co!t{ E;X=e7 s_#ҁߪtyaԎgG'Ae=>SL![;SB r08<4yaalsgSgi;jHRaK'ĥĄ,<21WtH#e^;}jf}KoS[kֲDy^uZ5Rq> :iȿ״` ,2מ7XvѺb1:>sN6ƅ^l-L{o|`R>IB_䨣4-XJ䐑 o9/C?l |uf sMvOSg$H_r%sGeH.7`ȴ9xaM^Д{C_r;U,go||>7Ϧ8L6GP -H-A/|ܳaH۴!dO$=Ahn򗿜 'gZ8xF>0 i{-y:&}>xzoo#fsrmmS3u3y ч$9٪Y$I1,[~W0eYבL}=MsY|h}ee׿ygv]o$t}g>&ũ> }wBZ FԉwMzֳ8/vs|ߛ \"P8PFVhb ߈t[nFOzM-?nB=s{hݟw0kq"#mm5 .u⏖5I`뇆2şkyN8 \[Bu)4 Lpu/_wWm$t L跋d Aދ{fBM+o^g5,]G>xMGžM_H˹0ꪫ97u3v9Ca-gq` K*s帶h˱i\f$jZ/&ϫQMgg (!^W0#/ TaeQd,øvuRYWd1@:͎}3\I/;Yg:}8-N]6)!QUKA> 1h\"<"tN,VtmaJu(  0&lfq M4dHvY"DG\4~)uŐw MfN|c_h2z[‡I'`z48^-]t1g'X_v>V =hI/enGɱ-OB`.'|lJw;}-D_[UĘ;U /_һ \%' 0Iv_h:fs笝o \YSVi_.`}mf8tRT.1b`~7 걓$ 99_J' yrr,W")k%tp $f/m WmXҭ|Qu'xYa2ۼ"6MI`F&+ӼVfs9O`.a[$brЇ>lAR#4}Ia4KL<{jK)KNEok]$qE%*<3e J Sΐ4Ny-8-ҏqX7H+3.]|$r$ Րl~gJfWp lߣs= ^mvqE sv?rRo|oѲ> u7~l$~-u&c5BG~i'u$,"! ozӛ˥xd~gĒ\Zy $63,rA@2O1wH׉?J I߇iıE +؅d*$vhɘHGftÅC]\1l# Rfbiv8^㬻'3kgb8/UYVCNI!me5L:OǵYf8:w}O114ĿW880*!dC0KC0r_N8C~MCưf.9WvEe0Q.-EqV2pG92m/_9 ydg=2~;dQ.u&1ԏYby6o´!'؜ =n sC4k\R''y Kp~a$ H~M0jw d|Tiζy=yo54Zb+z0y~!&. 릒?:5@$8mȒK58+0>B\"ťI%Do7׼5[Al7!ۧٺ!oϮ>׽u[ C}ԁ{{ $ab{p'}x˼800 {ί>d$@ALd}'@,vY> Jη9'`r(@;c}NyuFO3 _G{f ڻÂ]"ޏ9!c8.\#C !ݿ\i5,Rj{gXKxpIpoG=c˙f;?n3kf,,}0iӆǚX[Z.)5,2c6Q(a&\lZh,.?$eeL%_KW3cQ{0p4v{q2:Jtm_PlR9P1*j_k+S0w2ӶXNHĩTߔ3"&q}М1&͐_Mֹ;dc,T+3|È/l׼$y`|\;«:TeAN0񂽵*e*ErVsm2mߠq1-8,F+cY "8/eWǴk~!92eAe*YIs G ^m%v;#^tiĤf =0Ή^~9I(C$'uܛIk=~}fteg,6:GQ# 'w"V3I=N;P3A< mraYOY~4aF3ݏy=pl|2is%\.l¢N qTR"c7w|eD'%qR2`!QI  vz8q/R[PKt|:6 l;WB&;f OЗ%Hpik wFv~,sLc-m {KY}Jg/tFXt?iu3mCuΝ iw*H „)Eqr%˖<كqlrYL&%&/,KXs|-imk0G%v܋,TvҲ/x0d? ~%2_3~-' :eO85/XTZǛg|!'KhN|`Z;a515To۶+5 2˵x.UR< E.<;N"x蛥aF&H|;4/7eyo`rsh?,D>d>2=ڛ:M-q-ZWQz(uaV Bv\MKx]'vOǴ! I'c+Car {fr3! w3ٶd1y,ul̐3%& \+&>mfǾ;_k)\*}gc_~$o`K$f,&Ę]d8!}F)L#=[Ϣrx?잱LsY_I7o*/[:iBvG|?i7,gXuE<1f>Ф )^&%(+WI+O::XJSׄ^=A^$yL20I9wő$ [ ӹ.N;=r6䱳,\6:;:K6[-Y޷8BR P[Z!&BhRBRִeI )m¾&Ȗ%<_f{OzOw߾{={cWV[w{^w.qm9+GI fm˼[Khϩ GW{#{Ċ6{Qu<"4ش3Sбc I !S I&)03*8-ŔEѹy0d t<'Q?DEL匹nX=Y'U^Jij+EhT|0Dl76,SPDlj5f7js1Y_s5IâkY-Ŏxb,3AQ XJw:np-b$ K3C,=7._흱ty,KfoH110(:} CƘ Bie#$"`f<=3y͓ܵSĩ,06Dڠ > 8вXzY%rsLIx3Ѩ;G;ײ[׶lieweílW󱳥FX6-#;~22ݿdێYҹ-m}lYpGHw̃[zz[zŤ#uSɱT݈!ReCwO +7"BenKّw6x5a1Cs풡w  Y<-6E3d(VIf-.zXvOg\,EƩǮ!Vq{Ȁ{j\c^wwN G8-N^5G:;֥͘±&}&ͦoma&,o]<#  cgխQDJ{2k|jY8t}2H趥 FG"}16ghvG˾oزmu[2:Ny3IԻܢd0QL2Wv[kK˺ HzOٽkZMLĶ':>\geu[IJ QƎ1:ЍB2;bBΐi1ۈXI=,43qIbMB q!uKE$>P>z5,FH e@ڬ~4,ٝM)ׅβq 4֢UƈʋcH#Ptpq")!?$l+ i1_aYT4/2P#s3q]rQBF?#ᵸCF!Y{N̬ݎ (N&\q1t"bČGnh+J C:,,{gfu}Kx$}gn&l|Ծ<~0nx_@f Elڜ@FEYegyg,b~0Wrkɚ߻0Uu\U$(1_:@#PadtwӷDg$#5oNgW[WzY"̑#a!g7%Mo[Z-wmvqf$3%O,,2F[[p-s9],4zzhv0t TcC%$ ]"Ԝ#6whrh͏Eю&D,:A,L]k贝WҁʋvYKעav푸m,!v%˻Iu|&AR)ws$(Z~c<0c:R{ aҞ>{gQ#G 0~u♞<0c^׭<]źEC7n>ԭZC0MUYID:WD#D]tUN̬vT7vד1U+ױJw:RKRx[t|aAJ cD;uGuk70rly5MIxBWoZ^󤷧^sW/3;ceك5oCZe7=0lq#%xydkFr,aқԪ;Vdu#ԄyM95Y̐ '}`Dq$bl!2wܖ jZ,;,Bc3rC`ˈ~uu-C-CC:R1$+Ζ~.*&Vz6ZvaX={vg>Iጉڏ:ǹ6[*]"҅11 ^R=FR[}luKOeq&ڪ,Xlja1[*,0$2C]~+%] !f&\?M]bq -X;\ #<~z̊Չ1Z~w>BZ~ԑh,@QYjDDxU9lJc1Ġ2cWR_Kކnk"+<)m;0dޗh go}[RGC|3T+XiQX<0:1:f^r%fDŽ;nSAQ}ۤec>2=sniXpQN_3GieL];}{kv1W esܓ~blüL{LE_ҊC.~)|!cNSk$ݬ1V$q[4tc\32&<:>=6o;\ tm(܂|2naW򫗙;c6Ygl.PE/&l~YDl'6,a- j?,2 D`i♄aeQQ|/< 4 =\bd"DEaD?G~#FgDe 9Vіww,k魭m{FE8mGli <_җzd,&HET b} b̌;^O`$=sFP<ݛK/".ڝQZUyue-l0cGGS_b$(Us=wvYKh!;^"B7/^O,M27Ā$y*.~^D;2^|S{@IDAT1aRb fB@[?&xD|C܍09#t|~M]?CǘvG9UfL>Ip'2mGF̋h]; ZC '"&{x;b]vH]= pb𳴄< ͗e;-"> J%tf'̧>^O wE0(W nnqԜ[^i&`svڱY p VCjcd-򞗙3a\YY6[LH0<03a .nr"H_AƏʓB fOC.QywQjG~5wKS /P͜kGvb#o%"%%b.y3e-K,nYŋɾoҖr˿wA…-l7fǽ@ -.0c[epGE-)ޖE*_~::T1FF{;=h+` A Hel.@x`q#K!Z,;aV4p>l%VZKP>8vk+I:bij7tmab?4,0a!`$!>w'bt<~P5!ϛDpHPeq}cnh_ؗn9眳Wq{QA*㴖vIn=:S9z6JqŒyB_W'EG![:咒 I$1/|?3X8m7ڢc|$ET8_wux DżƼgvʕgۉ'a𣿸M m?D#3cVܢaڬqS}D_̜)nkRpV6GMs&Lw<,hHǘfK*`6k~0 `6QO!~0$p{_+ߵz #&14|_uCo;ߎpYcpn{ bL0f kȣOwt}}ܒpicy*Fg坦_m1ƽqM2Sdʛsf՚hśx352O8Y0fRgaif:޴W;Q̷mKP A*i`(X49!zŘN1;,%RU:=ϮTIu*I;jћOj)Qiyb!XmWr5-": ^d,ɼxM)ɂL7IqpP#|2GC:0ĥ{>묳v#Eq,Ue7D WX¬Cے +| 0cV?~0$2%ʴI/It۩,O=Ұ\.e+:XznͯwzË},3e6b/{^v<>8H:F;畝xr)iS_9V>ҦbZ~}ڐe&ɤq鎤xW\d530apkM9@:K5*]Qe{4D"M(HSw:0d"vʑj ̛7swjX`H'śzZ~OR~byƚrmҒ(&CY봴_ $VtV}1ڬug":*|%%LSZhc1GpGpGpNLvΐ GsGpGpGpG^4#Cƹi]pGpGpGp@x m/#L6۷oMGz{{LvEwqGgOOv6]Ys]5<<<{v$5ᩩMy-Z[/,w۽qvO>vۆ 7غuke?O=y;yRNX"(rappp+FÑW䣤/=a;p,?| z@2{zz>__MWA: X:Ԫ#g.T +Ϗ~.P֚5kFQG;Q6faGR7naDo;hݻgIaq׬6$fK$yGHt|gT- aPgtLѣ%b˖-m!kv$0Ntz֎;4+]v4~W"u*a|OE!uPF$w܏x#4Vxg,;f@7̃Пh1(DG E7p|%;RQ|b s- sbH2UR{{4!6m]dH6)j~n.銙pyo|j_Fs:'/իCVDHy~[?1<̷֩%Lov'xg >Uwң'qj!`^=)׬|Z=E##R6~7f0 LvY0OMLS2onj̕ |Jp-F$o눔_ڣ###̫դdj#ԗwF}ɜϷey6(L;sw? "c3Lgv|{,o7I@`K$a4S2VgnFEE5R6nX09F[ K ry ^0-C .\rvPX  E/m{nBzsVc3\Qwk)z 40vl!O z>>I(,dAiRo lljѳXmO[ ]0o>%'a|mQorxj-*;~(65\IwCЇ6x- _q__o VfX420@[ZT>;L[^f\|3^HѪB4~W^y??9H ݌)1Z0 |#Dl .F>ұ-/:oa//qLя~t0jf=wKo svG>Pm 2E^ꨣ5 _.F_`ݷ8FSGЏ|͸e5ʨS=>zK^2#78g_$8>IOڃ[Q%LLm-A^òv=H<끼̑"ﰔϑ$݊lNZO°4; c^KK?Ɛuy޷D^szM"]KHm}޶0ٜwѱiv=YXu#@f$#Gv,* 8(_ %bn>Z҈+0dQU0cíCs,*$IS a*ru$ A$d'1R斨X P+_aذ#&1AݴB=y2тꁩv/I`̱vbQmkcuTb1c`PwdQ,yV z/teu M*l <>F:=D^"nr#Ƥ1cnbE^1B"(AE*x`E"0~_O:bi0ˎ0CbK>$cz_"ڒq+AeLV?L(B=O%aӂvC?m+~aZ!bJXvmEJH,Y`Mo,iE #\n;cF%Z-9>s]4L/QMvKn7ga$Vnuy_SD}mMvs7#ZU_B_@ 1̍),g&%#QnGw&k{ Hą q]]tNƮV/}Kw uλPт??GCcPG3+h'ea72c2kN6 71-$]ǽavK+n#& r켚fg!#ͿLӘ1:F nc}Q@A# & `IYހ1c'_;;Tb"T3I$Z8ی"Sĩ;%~8yQHpȘ1Ϣ+x#a!Ix$14,ɣ0cpk.3oY/oᶸmvYPZ^JCf{Hϸ0]#0~6ѐ1eKIt$à<ˎKd7h`f(pLZ8fEgQ#>q?Sj# f]1+G'Gje2oaky1ElaԸh _µtJo#k,I$s!17~_fe~s҆nmO;@xyoO-ѱ:`t9{_.`'DS-֞,-:F5z7ۦI3˾i&mm$iό&#10f9Ghbq7Nr\Q`ŀ9QbI[ :6crY#9@*Ejlpf(/:\~ bc!BtAl?Z{wP9./Eaj&-#̃œ'-czH19dvbgq[8 i6č!PMUdF@ʜ.1RI:ͮIaJt?@T+RDH<B]1F01PfYK$fr:.UaȔ3O}<\s;m1K>\;~)(S_K#$V#gbz<˺1 S1HI0f菬yhL/m 98ާZ77n/^jZ-ߞzGR{8dӎ;! Ńw>U( vfV⁝1KaN@ ҒeN;bdǺ,**l8YX-c<$AT|~v*8ln̟ǎt0$ϢO=E@eɍ9I `[1ծ8">>"0w{>:|08BblV>vfosp,ROQ"`EBNxJ ND[^ S-XDa?Dw$3\)T3'փ]XnBH5̙36 Sfϗ^Q0ճRV#1e:a4!##?FVyJI8(8v-s<9coKZnl%H!.z}ؤȚ;yoO3Ge0(=Ic荓dB.H=$*Ǖ8vXG$h-1Zy]G]xaEuŊb%%O 1i&e֟#мT^止h<|T(s(qHL1?١rEJ0 )~ 4*@t$\83 Ǵ" 4eYI*] bDVm[R쌒RZ:&WGph~P= {1S"3%03XYィV_Y3{'Cf2捼m#%q{|TKTѓEsf$ŭmIJmcXJdS{G&?Yv^L Iq!M۷ Nk5Mx{˧w(jr HO9ڰ7aj#c7(g`P 6°jP l7جw4dSz~ss x+ K1"x#%qS՞EM)HŰ-^mGlg^$e']&SZ?D}ڌ]?Y$V{ b- )=Hc-2#0ytp('_}s[?&k=U*ƏqgS pߍjiZ-ߞFGabP tnvbJfY]ia>Nb&)ӊ$UݕuW{G)-Fg}sʦ\5a^BZ٤#aqMk#P?!S?,=i>GtIt% kvQؤWFD*,TlBDI]ބE:FXA |v12euc}}}K>ӊjt턌*P;7%^vmUvPW8Zn3-Օ=}!7(WN׳|vIz)W.l) /DY!IIń9Dh17ψgęd֭ c:X3gu:E_0-ZE(}0y'`H5YY1yѻ^/|Sv1nx>O^tE'{ހU*Uzj++Dڒ}-k/Aɘ2+\iJK%)W-a_t)0̥Sbq5+Y?&k$qO~ \cjuebUV? Ͳ2{ja`P-jc/yKn>kH߭mYjyM oW:u^"-swX )e6v^0G&;>?a. ~a eb#?>Lc3^_w;@Tz^LXa5($fEW>``B :+-"Vhw;o`$bX5Ȼ!HEʰz5u0HaCb&mc` D.&%vj^ Bg-92$0RG u[;q`cgIa`;njl017#5Yf޷RE[dLBˇEK̬{tKZƅ0@IK4$6Hcե!I?jAVȿR@bD'c jmxғGRYw-|`FݒFؕ+) bUJlQJ?)b/e-6>/׊>zӟd<]>swR}%j=JjW)#-.Ճ轗yIGi˾| 0KKc1-]c?h@d藪 M-23 }Iۭm46Nn:@}r͊ ݡnY-<)ˌΥ8L5<|f!X*k| 11ЮJ]v;⌘EHʣ~VQp+a/?+ZC] u6ʷ{A̾(o <ˎ dոhYVehWTV;t7(W;{yg\nhަ!enwᱲ<S?=|[64ؙ0k1]d>3U˼V뷧Qvfū|Vnd}u0֥]Rm)Đ\d~N1O26'Z>Xkmc6amRLZaXhvac7x>08S" L["aIi~;SN6“_Lg$sGpGpG8Cfc'!';#8#8#8#0 8Cf@"GpGpGpGpLGpGpGpG!3 {#8#8#8#8C&D펀#8#8#8#L3!W$@E8#8#8#8@f4M?S23 ^8#8#8#Lwf$?S2}yGpGpGpG`#023S6ǜ7pGpGpGi i|#;#8#8#8@LW9GpGpGpGp-ΐ]wGpGpGp@th{5441+ϝ;wZ5 wttuGww#S]'/bŊC5n~סI't01 ykt7pGpN(QBƉj6_cկ%/9|5'?|+^.[)}rJ^ʯXX=ǘI]bwo؝wggAR[|JBe5|<{v$x3U%?꘭gL:3q>t@GpG H𚰢MP5&Ӯ _tEk}jg?cǎOL1YO? cGq$o~Ú}/jI=[~}HMq_{%I*Icy7cLv^D 3ѿjժC֭˞=/GA*Az]v{S̘~K>l 1ȼ6vtЯ3spttugU6GpG0LTLCƘSf+`9`чq÷Q~SHS9wpGFYcv5'ox=&!S3 Mtɪ <nXd?6M7ݴD?sL//$)Ļ"X|L򒞒s8?So;ҝb]g|KK|V1bluկ^En<€(Ǒ#GZn>I,?cB , %vDz3/x`qfq}?3> "E[o| 1f/8묳mo[&fNJ>b^Q%1X}c+,Qz^PWݰ4~Ncۿx.ڿ:tP}5VK.+X pj {鶱|R*OOvx'Yf"]1V+0>,71GL}wUe3L׾cae醪y]y[2G["fއpnhsl~;CQp>mOG@IDATae8#p"`kyRE7a|MX5tD@L_3ƒĮ-mhb , /{E,F=y2=}qejOԣnex;ޱ1c-Zth…6.1׿~9 EW",3FD!H#^Ї>O0cK)I`+p,`GZ#0,: BZRqfČA>wˑJJj1`a )AA"AjcƐN:F)#%a$;RD\-b6QJ}^b0J^hWWvmWeƌ4$db~HU/_c&k֬eNaU-jȿ T^5ƌC9Oa9[WQ{\ IfIYzČƆ8QZEsDZ]pGh03O]H`ܖÓ8 A@A?f B.|nm֤ŵ~hwt]ȑ|;sT$(^ Dʛ͒^e!77 ƐPc$?nb*Җ:hnH"]`~؅"lB7d4J$' `(??ޥģ3Eƌ$Nϗ9dǻ8*!"{vVv[]q5n$m Go[h<~+_>ٍ@sP~饗n3[nQ=aHf'c[(>_7Jt1WxlAGjI2aꌛGޓ/|P0`N1-B$Vy7-& LWobtR_Hi7ox F/ySK=VDwwa()AdP27?{"^qB|{[eƘYcc 70&PֹX.oMZ޷z5\2յLcV/wGpf0Uy>%dB^&$t βK9q%=ifYugG5nqEc,OQ<~W㳟AcNyz[gQ{ѱ\4KjH޸1[-W9Z<pG3k<(ipi"Q|O\ZbbvtA=4!@qq̎UQ*"6L1,3-Yiۀ`s`h rB a[_p|B^J?7/#J:1W)tb(v:> 1aV#2-|Qf Ëb@T!RQn k,$QiԿnӆ"dBK62|;$˸M ia4JRSi"8& P %&IbvW`էX]bń0n=2uan351kT[MvZ9b9#4о5Ƙ,f֐U]^U\g^ 7+BydtsG-MD=vܵ RV1&*UfHIIPIpN"0l2H$=eP+;Gm-WMAzN*eU3.Su{]9O= UGS.,@I*?zDLK{wÌ!\ʏeC&$v^keIWK'u~dfx=ȱ>x&:rĐR];lڻ=9*GFcV'aܢzer7wNWW5L1>is7ldYe#8'vL8A(6nVW7#Ë*mX[4}YO^GEOJaS@(.iDl+vu?Q7][!*VV#W]cz.3#ib[\x H6@ _Lz߼4&L#0bjgJr-ژtD(dyY-o1bDs \kiL.Ima#E\leH̸vja{iUkGǿ)T^aq%8 7:\ve!δp"sCE/!BKanHzwΕyz ^0I.hI<{v >8p{C8/ɂ#j]W]r-um0)֟\`!OK74MќΐjcEse>ubLq>SHڤ _7%1tPh;K`1TZ;GLByCp/ &%\!Oc䀡_:O|nAYe-(n h,]-&c%/y:n`P $\/~0,H=y_

u yX\̢ôq;yl 3_9d#8#8#8#Ќ+7|FHJfIˤ)щƐjL9-qGpGpGpn~pSٳ]10;`pTyM%K|q{wRx 1Ŀ)ݑ%`LtY~ffX5iIשGZO>q%w)D=d#8#8#8#P=G_|eG Fc&nc*T37+0=+M< 7{uoŨnBsZ0dpn~f&ŷ'nVcp)ʛLoy[V=q;e˻V鷨mѣG[[[#&8#8#8#p" hĽ mؾ}o|}ӛ޴ر$qC&d3!nZ,3+H~I~ Ǎқ_Z"a\X b$["qčE$f`T3'%4OXVO 8fO}ܖf!nxESn6+CafRYaigfNjËdabf^x<<ߞ-,,.+OsGpGpG<ҥ'W󋇧[3i 0?3ð=+O;fǸv7+Cf\% 89O FR:caf?%xf73?w JG:K7OX&#8#8#8@5ڤLxe= 0M;/Y_vGpGpGpWLSVa0]w[B3 7a<V4}V|S.+,)/ʤI+L  &8f 5}R40~In 8';s<,-<)ͤq8#8#8@7)NY񰸛~qwX0,҆qj G&byyҤIqqؓf5",?+0^{< n$w03[<7GpGpGh1ʄݴ=ړU~xfXפ0fq¼BeX~Ek2R%D Bx7Ϫf~fZL +k 1ɝ6o? M 33 s#8#8#8̀+f&0pIr[0m{R~a0sfaZIqKJ;~,!qɊqð${^0_KcfѰZiiE>!VGpGpG.aIkaq0fZL 3?3aK㘽H\K3)f-24L-y$ BgfѰ-fd 㙻Zx<!,#8#8#4+! މH ixNgC3gI~EÒH|kɣtZ$dx5 𤰸_wZп=)=3˸gOl 㙽h|K#8#8#8"PΊ_4,;-nf7̒CxY~y,fRYaxh/7Ldg^I!CA$j~,wdO ۓ^ԯhzy%'lߘĿyLL>#8#8#L=y8IayqBwn_0ʹy$O7#ɲWK_-<+Z,efܠxc"ņiCQ0i`~=fe;_Bz_ܴЌq#8#8#8S@H=NXxV/ay³0~h4g&f7a%eNyXIH\;|C${_IijV^'aiqeŷjixEa󸎀#8#8#p ZYIayqBwhgCw=/LHL*;OjqorgCFD{{IKR9֡ia<ߤE,~Zau27GpGpGh% ӥ/),/װۯZIzűN+s*2D xaXY{RZ:'Layd]HsL]=ɱ4ռc;kٜh<ݟ:M @ DՋ\|lLq1=gknms7NBF{y/YO*cOz|UyJ,J=z-+ȃ8 @ *6{Lj< (6Ƒ{>o~ٷduJ^Hsо2׵;ZFr6%&}E_{hO O@ |+"=Mq;uLgsͣ{>M=Wdj.dd\[moih_{Gy3uW/շLiu- @d#]♘y4\/zܴ:2n~$6zVjZ}!#EL]O21s={ӹYj]o6{(&qytϯߑ]>@ @B`:xLjzl䷠cqDږ[}e} zlsvqEY|$.OgsFߋE&: @"Xp^<=V\{9j:mίO7+/d8P*qͳ9cݳώg^i|%Ey/YMoi]u\::Uqi \t8=9;=8ڼ{xE^q]+|0 @ 0"0{xEJ~{lNN7r=O=q!#{(3{scocz(6>[ՌVE(gw޶ \t♘T=չ~e~hWJD!@ O!`*=m1[z,[x%'y6~gV#^k^>BF6;hGlXo{ٜ]#34Ql&.5j{G @nѡN&TVٜƫb;^Ȧ}&6|erv?#{JLu_^Nd\ڙH  @ pՇz=m5m΅h+>W`kmTtQS2Ayٸ]_OG9gjb72 @\U35=M♘TkTo2FǪz];<2lUo{scX/.9y|yڅ@.lν:{Uo~5K\W߿ͿlE  @N|Vr^|6fvWzC @:$GA<3Q΋e3?#}ՅЪG^>U$.OʮO{kge} @8qz+hXE(>kyy<]2!<i|xGOJ=>Z^ @ p7C~vgrQM%^Ѷo8S#Q]jVvzi2w!;g5kOy@ @dU*Uό~]q=b=[7%煌lz{^STWϬѫ2yѴ'O+=_r @B`RR;35Wo߶ZVSշwBFOg35#lWxLM1j+5qϪ'z@ @3NʫHG(.\I.zօ=}!#9gjF|T{i?^moV#/Z @;ډ+#J>ⲵ({5 U6Sմ{ny.ddӇlMFeCϻx2ͬqu'@ @; >W2f%Fqa"׾iϻi 7sPdt=չ^?Gh[ͨGc @ @ tޝW2ڞ{s Yoݦuz5[OMU.lMF7'r&umg{5!@ DI2raf2egӵwU{e@ @nJoU~{z^zloٺV >[K79f"(~:!@ !pա|vJ]F;ܝoQU]ӷwֿ鏾nWU2ڑf#(h3^3Vcߕl-s@ @@`!ft#(/o3w6kp̿E>xWhd֩|QYo~[ @ *Ajٺ]ϕ0f>]9 W;6^6z[TFWc@ @L`RftWjgkմJmSe,|ǁ|eJmVe4YYSu z @ \E u.63Yh3VFdʬgJ>~lx_3_Tғ1^yx@ @Oʺڬ~nf}uM6cwͯԫY]Y~3?^@ @x:JMV{}M+ظzw6v?x 㪾}ٺV?zO @*Yj]V SڪƕlyC @4Sum[}-ՃjMgk~V3=G;D @.*ZsgVZyҾ~V4ξVVOpu]^3 @@vwzk;m'kS<";C @-byxێ߮R_BF6Cvy{@ @xzq;G8o:\9D;=wz ~iz@ @ <"`w?;vz_ ߎ!#yw?z @ 0G`Yvn)NpN{_k @ @ \y{~[묎oRdO8^C @x"-ZlJt[;OξO/ @ l;|̟'^Sv| W}u.@ @+ӗ0-Xofkߧ|OW~:zwg @ @}[fZunl`{''72 ?/b @>{z $ݒ#>۔cwY*{A @ @`#Xs#?Vp5v{LVcU&C @8vvv^ @|: KOS(C @ @4(t> -wsʵT7'7v @K"٧Sl?_W=xC> @ME/;\w}{Q@ @$6νWp\;w] O߮> @~OߟEz~>D߽WοyWrf-@ @BeK'pٗ,R @ mvVOxR/{>  @ o#pÃa?Oi#= @ { <^'67 `w`y@ @ <2aN=;ߡ?p=AO@ @u0oqNwq 6  @((ͼwx; @,8ۦ/xowF1 @ @ %VtI{߈1 @ @?g /C @G\-߲OmC @ޕ]߼w;`@ @_x` <  @ W^x1X\B @4.]4`%Cf2 IpA @[ega4u!,B@! B@ $Poߗ^OնB@! B@D̮nc')P϶k~>ރ}|fԦB@! @&5`ƺzsys8jC! B@!P*u!ftx׺=_97XS$B@! B@E@(̅>94ZWy-۪R6ڸ?)y! B@! Gfdr?:XfFMU{)뒫5x% B@! B@! 5!"QD>ZLkF$4+8~V?;Pe ! B@!аT}]{Ln?.ȫ:jO?.c h3 oY_ ! B@! @U'1tG1@5CEP͉u5u@J/ ! B@! 6/ZE$ѪZj鍄TB{ڱGvJ ! B@! @8U7ԪZSdejLЫ,JT~ע VąB@! BLb'QvjF*ʎqOWR+Ws]DŪ=U B@! X'ůz7aVi^l=Y[_@կf_ZzpݾB@! @l2Wì2a [_`ǩ+p1Tq[_|l+*B@! B@6TmŭB5uTqMS)(aǸƭƤvB@! B@etܺg]-Fq}k8@Qũ3N]0-%SJ%+B@! }'1w.[5tq/r:OG5θpqΫe[vJ ! B@! '% 0ζjWoqLQ AuWEG0 jGB@! B@*M⋀Fa5>JWԯJ JWOTW98tŭ]\w51n! B@! f"P$y8U Stt[iJg*UIJژĥY,]6IB@! B@8({]AqYJrַStd\IrV/Tֳ1CϤW,B@! 8({^8zfH֏[Wi\ָ*hWRz՗JS:f5:8n}nB@! BeMTD_9u˩c:]I]q\zlKr;zqԍZ 'i} ¬Azk^P?/B@! (&ڥ6bWgOi~r.K%uatUzQIؕ_|y_G!joo_2L&;lW" q B@! q0GLa8dƦwLLLl&Ewn޼ِILbșzLy3۶tI}Bx;TNJ+C9KE~nݺ䥗^zʕ+!RT_! B@! ƍ'?~;48h4b$2VZGeY%! i`Tyn8/UG5䩳 rꩧ}{;oOaB@! B@ĉ,h iO{?MuO#f: ErL6MWlk~zJԉ*KNvlٲekX\,EZdwVi! B@! @N,c~lB1|82A":z%uJG%LgJ7+iԺȗ"K?1q=̋G:B@! B@@:nfz'+_2/5D&Y_JzIGn2r:VKUTv uĻiӦgcy32! B@! @`Ϟ=^bŷmq7|:*vTFގ+k)'d9k\'*׭RF"Gf8Pؽ{;UB@! B@z 9*窜}pkQQETz? ᕫRR6|9 />w]nmm}w:B@! B@!POZZZV?~_џ :ess3FLJfzLT\)uFpRɘ /s,򙑠B@! B@"f?8}ҥ̓2\U%L&x&ߎP>\v_*qTB`%R7,epKV|2FdLt! B@! @5H$G;曹شv"CbsmNt)픢7H6R{BTΔ_n{ԋ"[L&D9\qjH^! B@! @ӂ ޗoqЖ+gQd])I) ^c7t(S^z"[L&$cMIdLӭr! B@! h48*q476)G(rFq!Rm/ !E;hzQ(&W~c]w݃RRB@! B@4<rnr̹nP(6O.VnR.J*Un=X))VN/K,IuQ/ IB@! B@:!-hޝF9sr"SQ{~HL9 db2a,㧕p2 B@! B`"-skACbyX(VκQdJ O T:QdXTnёoCж˗?B@! B@! *r8whae czDe-WGQE?j(ra2ёoӆ hѢV ! B@! h$vyի>q%d-3Q*c/S1 0BX./wɔRF٦C9 dS=p/B@! B NS8N~etr)Vnhо#d=4N1rYϯ.%.# 跲B@! B@Id_~914_<ڮ_iy6LXF*q!S׎6>T\̀~+سgO~=wDb֭7xc 7 B@! B@9,="YΣ~c 7ʍ\X0ɏ*rv*@YT0ˌŋ'h!LNN&~v߿vΊ+Rھ KhVwg9-Rv͛ILOO'͇m%IRzq/\0tlJ ! B@!  8ݾ}8~~RYׯ+c a:*o׭(]OBT&儰zAe&ߝ_|ŇrW!Nw.5)X\veguӝ=OݻeL_6m iiiR/내̛7/ 2&5|:RB@! B@/袵0œpnGC<Bΰz YV/BƐQA"_L&<(}+湄wFrA`߾}ɫ{͇v駟>C^{mW\G?zqV+haeF?Oz?#~ eX~)lI$ B@! s#8h&d833Q!,(?W+)mbmڲEȔ2S, *#~x,I,/K@7G}dOOO+!Ys a9S-bpصkWpi6~# ?I,k*|mQz1L-+!B@! 羜Ke1no>G'2z(2| dɨ`ڋ#:x{{Z H픎 eX!hnXGyaysyu-?~3~f24\d1jڲeKڵk}SB@! B澜 sN%Z8!hhU2b!L&Oo_scL*q8쳇Їџ ]4zu\7,}22]!fߙz"B@! k;cNiy]Rƛvuʌ(2Fq-dJ#lLeA~vƞ5?{j$7can?m{a2y' wD<<Mui 1c  ;D%uFB@! B@95΋+.o}NeQedbmJʼQKE6L&//cqg&Wyk Klذ{uwC2#Ҳe``Ud?43^zi-mpSrqN ZyCcf+B@! B@420w:}gs|_d}25v\]/,l02|ʘr؉i˖\e1z [cciWns5t1 2i}sgN@wܮB@! BDGaɚq1erz2!5͋Zx5M03ːv;(2k˖->裋;pJ\Dk9 B@! B@9@yr?\윃?m@۲ ?@<'c2[X BRm+W걭Ϯkmʼ:B@! B@!0ev;^oY^}ثX)y\/B&RT}lWNB@! B@! F칰.Ӕ{;/R\/B&R,x[M^Ki! B@! ;Ac;ߋA)e^YW9*gMDtLXRduyV.ӯvݮ_,L[jC NIJ av.E?e+[j[ |G>_|^G>r;ŃÁs9ߝ8 Zg:>>t7w|߸WvF"CCCI==:o믿k޽-ںu&^W2njO=QƣM_җ-o)JQ=m۶|3U+^y$qJ0Odȹl-oW,B@! 8im!Ai[i[[VX!v'g,VnFIt}pr`GYkss,+8&$Rf) 1HX3 Y:y^85;Xϴ NMMވ/ls`1tWΣJ}A ٴ`szyk_O5%j) iyeX BFKq)p<[ ?G. cdpҦ}c%/c1m8<ݎB@! B @sb,<2,OS.%%\K *ƽ9WJx ^K<SJRdL߼~fܥUaЇ]&cm߾m<_.qhѢ-d(%dtmOB@! BA೴!bhWn2lۄ RPvW;] E\{ߜ׽ζmÄP݆899=v3\!CYѾyVg9c\2i|@߿teP18 V>dlڍJ:O&$Q$8\fb2~<DJ'--V^= ø ȓcq.첻>O-"qbO޹O~.- X~tBÀEƖ=ymkH`ŷv['}n-`ɒ%3Zc9@4,>xL1h9F: lBXAunL\k.Qw-b/кKV{e . l%K<ŋΡ ձU7,x [n%Oqcέysc$Kp lSkid,dԺ]B@! B`"o/*.+YJb d8rCԺQa׭$mt:LYqѾ<`*e\,bfuՆƶ9K!CPnj/ ;d'f+9TSB%b ZɐSl2ɘCRV2$e&8r5e'7;^,(a%2%B]ܙYhbzA)?gmlH կ~ %]]]ilMv+؂f 2a=B [so1ӆoCaʂԃJM|̏)79s| fa|UWTyֳ]wo&K.UrK|M;3ªȭ wYOaF,b`!cjӖb! B@!04+t^c?QdU#!d@tr`&im;___fIiHLq aUNzk/[V2 ћu j2f!v  %e>0q#HZd2Hʓ&[&bĥ*Z/V5Kn馶͛7]}ّcSJja 6ٖ.vOMưy#&pu4^{L~PeK}{mA1i"BF-[f$X'~zLYӟ&\ed7f1-w%`%FK},SYGTv?B@! sy؝Sbgi[Mׂ!h QrvXd鉭y ٔLH秨$d Ւɕ3pKnvȿCO1 X Mfe =Nz /aCXӠJ_D| d\J$kNp$_UH"Vr%1/J`?Q/駟>9˯=؉f,YjovhYˍ,O: . %pх^/Hkc %|g!&񶷽m3>;tIu˗}_ᘘK261m VAqwO5_l*B@! sN$ bgʼ-krqT9N)jl~r(:z5W%qI_W{Y՞Ix-NCL#n.sxEX]7:{L[Ȕ!#G9__vL.qRDN M $dr0XD+2L)8"m]Lf}}}; ! KࣥcYL q\B[Yq;6k[` N\r%0\UP>=n?v*/y _'m?>RiC,e`Md ce\i>rdL}Ǖw9rz׺`Tvʹi_LjIw3'4-R -veb<ᤦt&'&ėS(LH"q3΍f5Ipkn]p k|;@4 IZ`;^g=0YCIGA dӑJ8uM]w˙p9jH /5%!Xݳh"!0Bh,}^NeFg?7۔/[lVCwR8. g>Mjr}!I?Bo޼y4sCoQ,B@! B͟)'Lv=;=!xR~{mĹ*If#!cZIc!CUE=;;~h%#L8{,xts/g]?Y2dh!ösV2nM8c#b7m8~>I޽{[KR/+ իn !0Ii` XHp ,< JXUZ5C5ȂoY:X~4s[HnS'Hr WJ Ǻ+gݺuF ?>7xc4I'o~3? |.,k^ݵ !3r lC=(r,X@TvB@!  |cR[i7f!C=ˊvԋgkMO<)&&g12qK';W&,t=o<:rۃECfI& Lq'K+|h-AY* ᲥL65ޒ%S@l:osy] Ht;.'oWΩk!q-dH|r-R<ɻnf<K d7$+6ò'?ɻ`6 13X*ҰXmd>mYSN2%´7($I(ݟ>/y͞{0֟|GI\ve뽎jM[ޘ~V%ah=ee܁f,J@^%̈K* t|`i[uXnQ?eg~#PB@! s83yAuS6(cҥȚ:v\~r[׬t,dp qRtE +kL=͉T ^rɜ ~L@['GTS`d;#Nriv$7ъq E%Nglf8%\ĶHڸ c%D"noOΚ$ZİvTl)2 "~̱c&2X6Kᓤ; -d4%/JGZ~cRXs%+؞y |H!%LXz nO1f=]L-.袻8QWj1:pAMİL:WrA.Uc>$ *O! B@4 JaeȱNTtڈ_ !A*kڬD_];NLVfdәV+& ]f294HHK ˡ;y ,Y–/zv- ^`!8NeN6nr$!b&Iʺ.pDVX1U SO=ug/١@IDAT|gG>򑾖!){V8]7d |g<:b or8,a`:+{?q'%;aק/}i e7Ї>N.H@پRX31˦0Un@aU?ȠUoQKv/6KN {|ɰJN! B@4 F!iJt]䉦m b*jtzE[&ͭmk|#x1i{R*7n}:u_gҵx!ICSY[Ah:-ccӾl5,h&]&gv%bHE.s"l| LojJwjtFk6 (nH_W7Še#׶ÿK dInP͆SQ1 &&.Xp©A$ĊX;/->V=\9A] ׿zo*pX,٠_`XCX:%nvwEFhuabs̘$v^8_jےB@!  '|3UT4iױvŠ|[ƤK5uj72! F QO/ϴWgcdM\xt=4 |.\~s(}bgكNv(Q& o^8p7I%E p̋TO˂NK{356ZɸM`ܾbAW˙*36niMuw:Mv ='jW;]p;e4 \JD5ܑ^6X3~wn2cfKP$CYkv*J@@0(nq\ ꁵN>zka6KAKgۖcY;):,[~vbk֬㝇zhVϾ)! B@9@!f_+˼QکY>;`Qꄕ{˼~}eW.K:L(QajYڱLchyW;SS9"fK6OĸdKI!^|"sbwҸ1B 87#`3%g yZ+X`u;?άi %-!Z njnry^ i:'dӠ?B@! B@|R~(?iQ켰t)ee0}>6~vYr[=GՖʄ(2F+T*Q#>r)92@܈k3GxOx+|Nǂ<MAbÝ V3hYpѶ 2NlځӆOLiZtiӂvi H)6ݘ1(B@! B@9@~V02*thsK3NXYgt2ƭã= ]?*ĹN\~ds}眵;%\\2 Is6X jjdLks™FUG;-k. ݉m7ĵT\"'!31dL{$p՘ ! B@! \E;LIc`d2<<(V/}Au*ʯ!SQT&a cd2& sÎqѯ;׸d -`ɘPp/d,!uasӮ;Z,^t/9љL NLҦ%gLf;I NPIB@! B@T,1!?yb:vJ7*!C!~دOae~灔>E4giJp ,c V.=y?$[aree usIMc`J ecD~aZw96|{;rHc8'ݔvF78#:cSn$@vFA! B@! (qj Z7J?fQ t{U>\>Ě$p8zv`Idks;>uܥK[4%l@<;H4:N[[N?)=ɎgN}]+Nga@Qp@ ċ#Lcf,YRB@! B@IĄ(2UδUWx.2Q aaeF1ɯzJ9]Yu0G|1-XAA~ZW :E.1$ +t [r$Z@ȴ*!ccL̯Ǣ[@a9ۜq(IV'$;]}u1A2&[A! B`#vMRD?{w;:cEB%E3H3 V=D %N;-iroG?!SSPꈐJ B@! `2 5ch~"555^/4&5>=::RSC 399Irz1N8dʂtuW>+[r ,,{aRVrҷds) ;@0vHBys3_R$pa:mA̴['=B5W'ؖ$6Y7 Cb-Nߒc׻:YLě1i(B@! S"f߾}>ӛS@ԩ$Mem1 9"btKl 3sb%g٧]4]nbzǬo g}cN@P!j^P=S^'K +<g|' c^6R%0ӈ<?<Υ]HO)3NฃcH81Kx5'B5<r k;ijL B@! sZlݺYdLIbm BIdLP^3;C*3aMY[&j]gN!w</N}ϕS\׹~){ Gk*Gh X042!|qW$q[s ײ |GEǣM|CK|}7A/}wGG+qR$B@Cpbs{?y.xNxn+Ian-U8\)j//Ee9>B&VVw:ڒC0/ Γ.|/]tAxIv%kS0ٛ HԸ| ҊM'`(Sqa!3xB>3GP ah6jK9hW! sZaر 3i)Ck D}\;7zM#+7TۛۅoϞ=M6m޽{d6PNU;sM}vٟj}O cRy&NCt.K4zRʆC)u)KZT3m#hRhUIVx7SO֯/ϯn9y]?TT )8O.nIyÃ3m8?АqB;VIcrCo훎;M㿓e*i#]Xk H1Ϣɩ-;:{=Ru=ַ`'>l\ndz;߹G!2~SM4[N>dlX7\rɼSN9etpp׿3CѰvvmmx3.{׻޵o׃[g>9/{~c;ԧ>8c… SGy|k_O}twwk{ʕ+'+}{s=Óu<_?yƍ۞'y ^$As7C=tʜr~~X8{q7E/ڵjժyk<Ŕ˂ ҭ\C <'gq%M>c]}=G}؋/x>~:8׷➳zlvmqmmm1{1w}w׾;M~od){^ru:WUI'4W[,;upkd찂 9!9qgm{ ȁo:sp[bn{x=(kIȄ-sٶoo'ә/:lq '.iׯ jռ1'yB%u Mirk^-a)E(&ePoԢ9 0.c~g|}>4H-Q{лի!~8P3(KQ1L]vYp5tA? dl8cӕJ?я.=hy?d||=>*LM&hzMAΨ<:g?+' h/&/~>mn QO}j?Aߤ y#{$[ O}\pb13җ_We *1͸@NbdۯN<7o^z?a~0Ч-~/^yĻŜ˹6<};Y .=-{C@N$x B[oo~~9aUeQρ5g=+0qļ?pF[ߢERva=x7텟{#O7xcC C=}+o~Ӌߦ1żq\Nb5(;TL>xy17ή-_iooG>n* 'p}hhhh/IK/cd[n~ WYO ؼys]o>?9uE-5H/~1PtIiʣ}dA,vZt?LX] ʓD1C;-S5E2a}+V9[ ~ͣ_h*tؓ0} ͘cBlqXes+_ʪ5-'prI?~я~F$$'|Y9~d}v9i  *gpl}k^V|`bgLJg<}v>ZƸg ;w63} Z{ opZ:<1qﴖ/sZњH3v/_>e8ܯ6l4[H{eca2-cA$~߶FAkH|'DH4 @t;Z}kv/o>c[awY:r|Ĝ}V; ^kt\^]uo8ZIA:KR^k'nܧ=ʂ0߯_^?=F/?CSޝXJ$˗j5r ć1oI&a*:I1Pӑ/c5+#b=کx9P1A"vO?khĞ@p cXJq_}c馛:IdUXl5Rb8KIz iU iu9XSL9H:znr~ihCQ&e&&c^,jx}}1KGS.jnL\R%Iۺ,/~*;/( 2f*lU\{j/|a{%s.-⽑i U,Zu{ yg9btſz`r_YL/S"@~ !ct>y$Dhy~Y7ҥK 71.\- I"c ^LsOq]ᾁ5yg'o2c8b:~y2i7!ShYR \7ҼLL,) GćKH Hs`x';1I2S7jr*4XKwǥ&#{2&ԖOȹ ,iH,Z{?E<PH"JM:p`#:Dr%˝@pCjo\DbK:Y7Y4/goO~|S+)7;EҋQyu3Dd d $oۘx>fBŇ5kLM!'<3$F Bf{bŊ0ֽVHxF=~#1¥'4o?2r #oǼ2$R /mD߾rb4Id $mwm lVMz ߘcF +e?Mx+^燁8cN 2M׺K"]$.?^z$LpeƸvDS2~gM7 >|R}d$⠱wOro|wukE+Z9Q6N;4xF;x%s駻e~Ԙ2(6S6G d\D;^V =XCk.>!$92܇^.5#%{9fXؖ; >\Bi=%ދiar__H/ $b ?O.n ÃD=|BlI cFcöyM .ux?@Җd.9#IiR$qT IQIjҍ"-E^ssJNb5fwJ]Ih6&BUwrj2a-M]Φ=NWoD> K v7U &0SS tȦs#4:Inژ $iA-وad|Frfѡ#L26;H'A2I5ګ:N2r$NTEl>~ 82e݀˞@BlqRAZGoΌ8ct#+'3Phnx>~/q(<ȎaN9a7cL(=%H|7$裄|^DȰ&R"{֝{m"F <_GuԄWzar|p&Eb_ iZ-d>pcˈƖH`fo9 Bl+'eon&v?90C%(`7MizX :5Ϗ̴uW#ͷoy[-F~:qr :ndӃ/9(ǥ1a{Ӭc~2z鷄zLIFv'举BKhעtR*ϥcTk%Y5\'BĕˁA;,Zfb2B7To`uQ^ver>S1 iLK6v]c]8_n&SƾGZ-@o8/i>%$y$@ϧ eX={t ~Z|{GG]t֗7x٫9w %IG.%ao5i,$`kr$i,~_H}~>J} sr]7z8*u:缯j2Q!*vc/V#E_LP]G;nز{2N5Lς~g^ږ[kC;:5 d r (,0;'qef0s|x`][CQIeJ#'35%=M6L6ctgkkSgꥰa-є_wXͱ_̉y@- :0G$c,}P,;H6`GY,?>xb "wbJ?+ wdž 'Ҥ6IƷg`Ldݷ;cba.?l‡N>C_?w[v>2^2ъg;]P.2s=ǿSMʚ43Z^{"p =ZR`2҉:eIz]R1I҂VJbH(͉ -ᄶSްX`y]D6Ӽ:i|ga팃->+!x甄 Hm}߯7d}1'#T>D4 f;Ir1h@BIv/L?8gt;߉a7_0{^N9&E t<:\D*k֬_(d_IYۿ[o\H^ʩSjo,ty?- ʷA"cKWIȔ h%7eb#{ /jΡfFƒGF}c΍u~8kN~w>,hZ'|`7NK`,ss$Lfΰ~Nb4-d-59o}a'4E6EqUk&|pú xa&ѫ(k)c&L@<`qr-c71L DK?&\jByuebdMQCpobk* 1cL̻H֘cƜpbd:QKC/&(iZg!{ 1D6/|{7ɷ\:o2g$dD-+wP5A_݉<]`8|,+5Zqfh?䄦f율r,u5r&ql$02ԇZxL{~1'@ Ozғ w:1F?6:e&X~f{:bl9@szu1}tMK"M1ǜ~_]d0ch2F^19 XO,9YdM =9au|?XΥƇgN;F8)ҹMf ܳ7 M(!Z/ڲũq%f3Hq(N-MGZ-.!oQ#km6q3&cEż便 c߉K/A-y4qߛO /e$H؄ e0  !oZh,f[0Z\i! B۳-Z8I*<#bLh0C;Fi@aA3zy7wd296zT&xxv'E%dmjAj{7+q^YsL|a-?|kM0o1r.ZA|[GL0v`y[3)÷A C:؄Ab4Kgbx}b@abiI]O<63mIM- Đ&0,?N c$΂gVqUi aJKx>cNwbȭQrp:Ba>. >)"+^-HXf^y?ým|9k a:crs"&ߨߧvL\ Tfv-d}MoCo994 vZ6ۃK93es̘IX\h#JhF]ȝ,A\K$VVv=/>=KjYm){H0h@˗ar:S1^䌓T${ydLKYfLyC^ʼn.;wi>{10I&ͱ٤@w@7+_^X^}+̌r1hsmdLR ;!_ѵ)!` 8tXGxzLyX<(M$Vr҇ cH{u-IR o+mZDI0ͷp|03<, <ͲD8 'l~4ΊGZΆ}<`/p$b#Oܙ[p%e==9φ$KVweE DADҧ $) Oa?AD\Y$.a{<{NsϽ}9멪7U{vb1{xB>mЉ{Ṡ8-*&9xZʰ>PN':Iѭ 9jUor9%`N:_8|Smp-VM*xӞ6JpbD -F{xpMvq`;2ǤrJNtQUإk?Isqϯ/⊕@GߪsS|n,mrnۮ+:ωwN:>3'a}I6ClzzTp rX㳤m.OgU$@G]ٲZk[k{ʍ2:ak {M`(abtE+ FB[LEB'-3 zN1L5uwu>#?\{)JG3'+ouF!f'g.cɱr/Nȱf|sڲ,λ7X0+uNV{7m\Moܰs:.}N+lK/Yo(rCY~&~' Λcw>C3~"ȧdRH!W{*/t:=r-!lND )m;~lok?ڄ.~̇3[*Tpk1hY\7 2|4g tݷ9e?~RZوh? cÕ9R|Î͉O<I?AqFŃxӽ-h'x([G8~(ϥL|d?0)r0x|c:'wx󾒹b疜Hbך .u.8|z/x+x| FCEapy8Xɲ$n: LOr ߦi&9&?u|oe\{1ܶY'grSCK[iⅣo@c>ˁ0Q̽g>3+ZL \x܊-2x lw N 2Gs| zs_C[ V<'2}ϒσǏdwFR}X[ƈ%D6vƷ2bΉQ-n$(iI563|h2 oڕQ]!w `IMښ0HuӨNzul^|ق9ԩ9dẢcx(2KhYøā֑@:aޘyXJlj~ud/Ak-tR$ ZN„Ǭ xk1\uo`\1U疿{.-+:|ķt Q:c8.r3$y}Yl^K/'$Ė o/ h|QI!Ѱ`E1a,}&-=F&e<ҁ`1?/gusyc^21N~;w &} O\AGD-e2_FV'8)٧54tp ~&*];."?锳+w}sL{3YnNǺqLo˴\6TIYnɥtp/mS:fcKS_o|ِO.vBLab˖Vq)#GLU0lruڽ]gS,[B7 _"L \1Ń9>@L ؁ r ..kB8?VّzhS؋s=0poyNL^ <&fLb0tbpݹK$ ONDSaȒ#"\ |AlsOz9A&Nն&>|脲Ĕp9Wr[< Ɍbh>vXíq!R\ۜ1  /mD^w:c|tT\Z[G&iht~YLrwUۛd~]Nϝp8h 41@Sd6as{`bG|FxsRRwKVd٧+e(8E&0wotD;|y<7re\K:G'm__`˔K(lj9'KN [,{dԋ]7l±Q6ο[[ ob,w'{¹(A:x X虁i-/As%%;t7ڼJc!}ф bɤ;ʄ(ݨAcDL )ޠ]xZx-m~ \Nd&0<&sv:mmūGZn _k-޼A_9aΛ[oNj-X}IkZK/rLkѲֲpeY?2#p%#&Drj3r!prה$9tP1th|l hә[C TCu\\ 0KoGWe+" 쭒vo7?;#A^1('h{.|#@ (-ϱ&>_Q8򲹜2b'.w4'Et z$;l|zZ 1*Nqmu8qr!+Mm,3C1t>;ĈȜ=g O=Kζ׌f8aeLDLky `ۖ1H2VgȠВ72E=cܭ~̇)[r._m3 .-U7LꫯX&7~bjV,H4rqGOϤ"d x:E5k>,K6֦/utϝiyW. =YO)eAm:tZ;?Vk#2_y֜eEY!dֹsg[p~k[3'2fOX}[ǥx[uS[A}t.0)&?ڧ㇑8+4['< {ڕL~r/! T8v8AO|K-ocLJu&'8f<.䃥z`Yd 1[P}Ocdsb{\*붉reTuv+ N2؇;U%s 0 4#h9.ýX~9`cؖ"UF]f~>U#p4 pJ W]uU-H#0:(hp/m*0^:K`uܝU[2B>Hd蠂|9bu׼5gzP ~F4++OIJKqlߍ^5grhEGyhs%e^f\ ˹|9M\Z3n@C~q9drPL&L=C?tjtsXO89 ^^0Ԛ걓H;ҷ Գu YpfdZlݾwc`+0_sou4;j09v-Z݆&qlݚ`LS:x}b~(/馛F8I۲S s;K*VZ:jQ"|b\F\5K8lĮHsƐ%I*Q$_gX1 %!ePߗg= "1&>NՌ>r#<6d|lmP9a# .6w+>`r1#~>Wp+N!7MŸ8/aPp'|sHFn x9p!y)Dc=8FwZYaOWF"ОDt62@pY?:,~0pYfc+ux b%sŴ-|=|a}Xk>TrOL'LEqV/eV^@N;D'e:Z#~Xw'ĝ0N8/&g1'2,cy?NPFR]t bY wM!ޅuVH&1):<6kpv!r%ڥj'&7=;B9ɻ)v)Cxo!^>!')Ķ#NB\Bڰ:߀Έ&⸍;/ /KIkˆ3>=U,u! 89%4`u?z)4H ñrx&f ,Xǥj= =.YL(Ns0~&w$ JG-ag/#F+p(00|$M=$f[B?ws51: 2'blL˿2Aظ_Lr}H\ݜt6ʅv/DT >37uc?_x\e:>q "~_g8LᎷʞiu8xfo7[ߣ bi3svc[]|6 Zlޭ- [opےn1|@D69 /sx|~Ns:CN@<|ǞcAȟvꐉ~ h^9sfe"Y%HsQzX5oB uv|6A _өS i?_}%3m @K,m͛qTϚ57Em>0cr -IOzT)g݂`&ED.7-GN F>>RRnm#%`9p(˃WxP,U7?8_5 5d߉u\GVhnw]va.k FS*ƒ32la?k%G`ׁ%?x>6En׆㐀љF>/;N!Sx+JX?p˷mxh$}·šd6ܒ>FaSp '|ϙ,~9q:ew/V#&ߥթ_K׊NLbk&dt!\r.;u%g5+Z:Surh ڏ=‡3F՘C2xgvy߅YѽV!ߟԷxH|N'Ɣ.uԶXw.||grvu\~CtW51X> :mߥm=kKp2cb;t#qX^!~ 7Llϕu:{XnDwjrՈw6t~ǧw9e}瘮"w^fEo=w/4莐#!}{/@5mo*Ggӿ{*~:XTG7ҵѫ:~2M&)L )uÀKs]ܹKyN3¼=؈HxU0UNg#%)Fhcj |o{ x-ƅ<&psH˖h ߾2м7Ž>x=pM<{c.p={AB*L@wQjzBtSD D"k#rHtw:`t͒ztu2 j%b_`s0 y c~P}~o 26#\vD: wm%w'{<^WO=߷ NX|ϏkI9s `:6=. 87tKR?~Y .v[w ρit/i gn#~gRZ ʁHc)p8!JF-Kw /h )2^.5;|fݒKiű6؏{v67C/nskXxixFB.uETjo\V)vꙝnNW8d 8-}&"|no]]s㏹48KA(!LxC`Q`pL:Npy˶.Y0{B( jՃyH )<8|ȢohFx`9RDŽ*ň0iOH[h8U '8D##*&|:0pϏ́Aqe:'[yO>')/tJ֙oǝxk_">tڻq/l.{IY>, HF8iHINCއd!w[ |Z^eNG:]2%?ϼΨ 8Nљ7ġ(ƾ \rڥ9R80ہFCqt "vW\-@eҵ|7wG>}g-V [b/a;=8=GIxM19F7#C689B21(Hk` ӳts=+F=˘ <‰÷ҠA{;{}B.*ޠ<-Műj 7:8VbbdutO>5}kz"YΉEp$M{Wv9.sb}$Ȓ_Nv9q;?>x3.L9SyXjǐl#/=_&oXrnϤu}䁗yE Vy>BC]=E_ "W1,QZ.W\9ճ E60geٹȅdh>mum[Jo4+SR\sPU223ȍPsگvu w:r[YB@! 1\^ݶr vĄ3\:IK,K8 |-u/>u+rRr"[K!ЇVbdc%6؉h۸vn\Ey C_BV6}c;hB6{ICf9͙w(7J{V1!>\!F$3Am! B@! @%taݙǮ_ s6Sl!H"t`Sqs'"co>k]b$e%P `Qo|pd?Y[K~XibnNiE4woȒB@! X겤\Z㨫G;-mxfD9fνۆӢ \y{tN][<12RNГ;~#YAY;? ^)`9maB4鐙7tr=yeY! B@! ' 7c14R7Ȩn[=qkFuΝ;XCrM7Kۭ.[麍7N:*\!2Xs =5xn)SgԀg7 EcB@! B` ~cXz#[O~XvLotޙ&6&-x3d+)XؽuH$\D0`BV$V[NLsݜ͛"9mw{3_r"r7SlB.#6l2'ڒ%KNұcg>cDԧf_f1PhӬv ;:!@ Wҗꫯ uO3,<'d{UwY{_+)>Y!{1GAHq ] ! B@>!e+&992H;ι;R$HhOrg>;qʫ3#{yL[WZ<_ˡwַ5 r瞭\FsxdOwq|lk=r:2'NnCK2[ne>r܍Vg}nX4 2fk׮-_wg}/022FS9}Cf\+K80{˖-"?A?\x[[ nC}Sӎ ^W_|G7m!Zߋ.袱w]g??­N*nmc׾vXs(~B@! &}eT:c-Zt5yF$݇H;}/V;r3~pEYQ 'QD౷@zJ]E๶tvOâxއcl훍k{ы^q6 (V\9/l;'Ic0htr:Q0p$ #0᳛$+!h3 \ t~gO ;(plE\rIh}C+>G>ry{fgHη[o-M @{eRo~:g%Ch>m٫7aEY+lOB@!08s!˭xv\dMx{~җt"0 o8=y:FoYf{^m^zNmMɈ9vܨ?N{A̎;:3/Fy>]uUؖxͨ%\'Ol}+_YD#hyg?[~L2ېhZ=1u3ÓZ$T5=zD"a==bL?99UwjsבEprtTC&hB@!0`wv;N;l6˻kM74(Gi63 .//3<>ڳgz#ă,Z?|cY4_ >++qc:"Q#W^M[-7 hKUrhqcց-m]v׾8fD_D^o7} ~<AWc8=P=W?2 c"sB[_3^/YvݭXCя~t^!wً붹,y\\t|_-?/x|' ΠJz-XI30Dp(co|߿aˑ#dqbu$ :bF ^ᐵ/~9t:N L +N3I d\mmՅB@L bp۸q<:Kh/8uCXt+G:@E4}M#{t xg>[Ʊ/"oBM'\<po]/ۄ[y;t MnSd[qL$.'ę.!M<]=Ӊ8’_򗗲<);k's^2l q1!9W_zNtȜ);O˧."@b>ŖX3?E no M߽?*swoF2KsI9XG=5_m#< t]^̱q[GgTH/FcTBE;rDQ۴60pf^#&i%\t 1YTr(׎B@! @>x8S ATvDWdxmCz^x/HB{,In9 Upxg|=oVUr>2`Z'scq3T'bFrRY똓d&6N,) 92~{mL,֢2XSܥ;tǝrd!2l[hˊFAAC>YV"(s[Nha|a&J&6;p&0<Na^!: 4 Igq1 nl*3&hPeW! f.Dn :dGJYn$;lWA>3xl!Ǚ搙j<տC49p3CT%Ύ[7N'D ''0bm$8.|2뮻n˹s ![dXSȞ={5.m~]JG%?e/{vzSecjzHX|"x7N&.WX}aջBoJvB@!  !hgU:p|;Y Q&,Lhd;K0❂oEH~t&_Lo{y]l[6-d:,Zb$5[̝}6\jd{6o%nXT[|m^蛰serrF Eٿ^a9ztsta}\yc:^.+8]uUeR)B@! b2verĽ>pLhҘkt<7$8c=aV݌ο:ļF}{W39hZWHZn&]! B@!0 sQM;dҐ$8Ɩv/~qcT 66!A8N3]M}\|`K[!rE13=sp(] `ȶF"=AG3$w رcGEY#bpxs?G?.rpz0gϮݦC;4%=4pc9WǙwV[~t0H4na]zus@vrwÈ. ;-ҥ<D4-ADwpwB@! tppBMMp4&.E;w F "&Ƕo>9}2Q|N/dƷU,`?!|.sh|Ү]~Xˏ~#n5Hz|aY<+pEGtLuFG>È&22\0YTH!:pQɧ~OeWH:>lc&t+rW\q[o}kWt.3HXB@! @фLխ~v#Ig#=M#1z2??,e51AFMoZ96 K`09WKY>BC~ޗ =m/b%{1=7/| wb#O}S/.gbaF|_]aRp-wqzk^-4*4{xx$2\F Ran.KX3J-2ĥZ\NB.KUTʮY8%jY ^9co! B@q) C"HU$71 T<@s%ZtXz3ߖ` >' &Oe_2V^\+3uK掹 't.d #n2i0]>O/Ad",FI;p$pb2 *w7vm- n|8f[JlrܤGgC6oxmS:\F .3˳yUDJrX)Sr1SѿB@E̳gkWzp8ksXARU ~5Aq LrpdP]\=t5\Pl <)@ '>q%%/94:c;fR q 32p<~s:5\utc:Y=yOQcNǹq0"?R$]|fc.MrsgddO?vK8nbM6ͣ&{ڕL?(L6lKİ,_Ԋ@:;aQJx; /Y66MgK7UB@#G~zVts9u]fLd|9+crFϕ3y+5ov*:dx3˸(n$<\rtu;O[N?º p dAtI # f[r8t-[}+_y޽{s;]uM74BvHZ>RN;/?]($Cةh%ưMGͲeˎ#f9.r` ^,YH"Dz^#ic;T;>`YzNlٽ=E"`8v[ǨC! &k-8dtU=t"6'9Wmj"ҤChDyTu42dnYᄓ#3iy*ȭRDB0o<,[:# 8<'1C.p>Le)Wח3g -1zKn|9VvO, 2,M=c%#>o/kuYG.]*"}_C ޅݓ1";Uڎ/ _H\(bYn]CKFpa߈yǫB@F٠HE-Ǭzǐ h|x3(&)7!s_/oDo3wչ[2n̨$|6(v6H^5jwaDINn;v,x?'=) ˱skgFho~ Q5Bg R#>Q1 Tx)OyDmy^%?ٍs -jiVvYɈmS6>/U挡,8o.JO! LG/{7q㵫:.]愈M Gz"ѯ~zx aӝIg|7!OC2LIu׋sn::a.M,"aNa'UVr").vCKȻ>>C\bc-p,x褠 l]8;ŵc.p,X*ʻy߸XrpO, 4Ƕf&'FKtCnE}~_Pβ;l{o2bD|E9B@! D0Y;Ha1}5㵫:b]愈Mo: ^`o?V+8dJG1!6'//ڐ^`EwGG}{Ct09-N#tӀQ$W_}Fts *gry];-hmcKn: g̅^8;NK 6e8j}>C$n:OoKwɲEXv4ikg>{@?+\j@2;6qk+rk hr<.-|΂뮻pzLrs*=܋b->\ݦU]! 'l\ҫ(uyxUu}z 䆐H95RZ{J>ˡ2nn=gܒnZe, ;C`!LD˼08(>t qC# _b.bZ?G__}C|0u#d9md(G}^h13ZȢcbrFGtri3[aoF|~S;+"8VC8_z饇guD\f_+؇H Q>I'-KT=|{06UPB@!p!_n)Jfz\{>j X׻lN}r`ڵ/@FpNڜ%,ݺ6}YVUhalD \-rhێ9YK3X]X;C! B@$Rk6*ԛ$ %]-'!ֹO+#WE˛#d|~H'Fs驺 (nDՁ^lҖkZŲ JB@! B`:"I%+kkHuEp'gIPLmme,&6i+:x?#*1L#ϧWidg%au+Cɔtl-D9XnԋĥTB@! )p) [sL9t\N΍.U ksNat9yQ$1F>봩õ٦?;-uַ]kxf1GdYVwu:mčyT[! B@8G̈́Ik2~m;-]ƠC'ؕ9rS2)^_U,B@hJ*w9>9T0JQ! V1IIDATB`RFah\^^^όts-9\Hq>٩aBsnLut{LJB :w󝏙J! B@!0`{gRPwGÙv~>Ğ׀ׂפWw&q9ňùohN2:J߂O:B@! LEyF#Ϝֶʜ`NJ\>֟N{+]u}r۱kƷ>A8d́+yn1C2.N cGO9|XL>ϡ2nn=g4+yV3ѣ~~nv]! B@fϞZp%K0͉ ࠱gpSr/zO͛75<<N\1'>tx^Onw]s51:bZ:]Nr}AZ{e!~͗q۱:l<+YƏ~ǝs9Oe]B@! B@ƍ/klg%1anKۨBseSujWQʁeM@:ѐ^ٰn ܸ4::P)B@! B`: ,cs]FO!-ex)V?ƭSwӫoolwBǼkn &B@! B`sqqe?We9=3 OҖ 2WhƳѪٲeI$9W\W)B@! B`{^WS#]q*%uS 3!Cʜ*921qxc{{ r B@! B@!0H02Θ=1.pW%椰MnL^Xw,b1~RmW5<Ud,ls.|dF B@! B@!00g̣7ɈFƸycQRVTd \Zjh):y}ZseBuYɳ_xlm6蔙7 6_r%OAn4C! B@! @/@7tuzԣCg1\d*\_h&_5ݒ%99Cz)t3ZnRoi\0^_tEE{)t! B@! h8bFo_/d4 \ļ1SJ&ьWVdh.?Uy9 i<|ۭ}2go1~ܶ[uyU&kkhVx&ceUY:d-|9Gye=pٲe? "!B@! B&b߯>ꌂAG̱mT(+Mqyu)6;v1IM-C9m׭SNsİmdVlʞs֏K~yvMMj:FYDiȥdXn2ֶt1nj5k'N]Wm n|:z?&C! B@! T!kbc(ct_m)?:_$69ϥ陌4:KYBuWV>op ɇh3}V+_fc/B@! B@FX=6& wyUhܺS+MhVnu+MuK vm꾮NN9o"dQQʺu׮KC2N7\>~խ[7ݦh!;G7oolkb=˸XYl צ_/kc,nhm asP_._u! B@! !;QOɅxuhNB>b:Fwu+]Y'=W.e#LtPP^hxRf'$!kە V~\9ՅB@! FL6y~Rm};>*Qfӗgq!:1;I7 Wwɥ|e=d;Ds1~#G&$W(pyVϑ1YB@! B@AD?O۴ܶ[Oʹuqin?W8vnLHb,M8d8w|*lWƯ*ʧ>/ԮBɒn{FUdc6DB@! B@4@ {l|Vd lsf/tmtrB6- C'ݴ]&Ul4-c/P46gr92&ۋr9ɦB@! 8Sz%p9db<9l̆);&ceJ<lV3XC]&Uls}̞1>ڈ!G̞+=-o:9B@! B@~!Й0gtX&94Wƭsnۭx\lHvn}+S<ز:\P}T;ʹuw.naw fL ߕ s EB@! B@E |~~HǧUid]^n9 uS}!ZHhUMrٔCLc2UlvJ5Qo†]И-wW.d|cW]! B@!0(T!Oǥ<׆[] SwmTǵ5u\jeP2<؄ݧ퐮+}YsLʪz)ϗ C4exeBDdBeߐhB@! B@ԝPdb-vynݷr!s\ |6n]ݞקC*픬|^N;$ӦN?Wn(B@! B@A w^&94_&rUUN̾oǕyvU&U!Yݺ?\+z1|yЦJwuYr~oGm! B@! @u'z1*Ksot}Tu߮u=շidb<)ƭ#B@! U&e1~CeR\+׋b}Pz혍=ncrM:d8wJ& shv]^N[}-W!?6WGa=׾B@! B*u'z)/DiݴS.j=]_ߕ#m6Sv$gb BP_\vJxbr1zJ <~ڔ|ZLʺz ! B@!  *2?DKs:sn=sb:q׶KϭWOɦx6--C'Rmszʞ+S:>/R2vcB@! B@t3Mx!z͗Isy[txMm_ڹr&?%T9dxwt_X=WǗkAwmJd&DzB@! B`2/}&ۮ-cb\ʹ6|vGSv^V9<6shL˕s)9jh iB@! BBIw)/Di~Wѧڹ\9.rzJ9vk@΄:%92j<s뾜߮"1Z:uiXYU>fGt! B@! @:yϑTݴt]]YNr2/;Umà:dxr |CeSŰQE.&K:6gUd'k)IT! B@! f OL)/DKܶ[vnuH4̑en}OC'hxOKS<)ٺ۾͐K*Z fSNC)!z]W]E?ߪ~Mv#d͙ڢ! B@! *2?DшO92[ntm=or=)gC >o|T;vH[ZLtϑn M! B@!$eX_9z)/DKlwk+o2!ZHwZz!\U^H>VGqn=E?G'$աS?65U%qB@! @Ug@|_i~h**BWӷO xui9zLE)1bM'k ;9/KC-4O9v|v͐LV!=qy9nsB@! B  O&W?%Ud}n96=oHh)sʦ$ X6IC9:2sLH/FKx _U>lET! B@!  Pur#B=_+VG&v}[19ɗN˙!P1'@^XsdBz1Z /w_f_|! B@! @NЫdB:ui9z&>odbO#6!\{e)~ץ5%CslzlȘ,TB@! B@@ȱ{|J*/$_ה 1̱eXdsx~L/S9IB24􄺊2?ƫB4,G&--O:иڜe|͕3Xٔ}хB@! 1&Mc%\;er)~c?GJ~9dVwlUd}ߎc\qUdccJ2*l'B@!  : rR2Uy1ݧm\VWϮmH?62\ɕuU9dh u{9)/Dbi~[1:yȞ֊ךI! B@! @DFUȦdb:!z.8u+:dS*2&r*2<*2*Ȗ\Mɸ6z}W^u! B@! #Cn21*^*S1׭ݨtpp92?FB"D-Ƌϲ̆+;%rdNsdb=5ΐNVFJ^.vݔ]B@! S@7\2/S^E֮anL7nLsCi^^eϕ2~6C:B@! B@yLRf|LMx.ú^)OC'\u2+KRcU#SSƎ?Uv+B@! B`P)PEL6ůkR'f+Fkx2Wtʛ^e!C㽞`ױS&SҋbutfHV18]qV)y! B@! @z1)j3GL&ŏbtuuRzqhZ.:vDLstdtcyѱ$ݲ̖+׻m-B@! D'[& ?b=cPtsse?+5evv:9r)yu\myrdL6OW6^B@! B@4@ӓrdtctb ]Ӕm29Ap:\Lyexc7aLY)+B@! B`#x'N^lJ&S~ T&S6vWέvuC'Uʼn` ȕɤ`0ʱ֑v]ՅB@! @rtx]SvsdrmM+sm|O!(2n).|LTFϷB@! B`"Pw_ELOS2uyevs2U(;p 9dN f^\̠ qUM/U[! B@!0UVN|ܠa \97VC'VwBה\^bU6MUW/f/FW?EB@! BA_Tˑ-jye*gV7\[*z9e2e|Q&Sϱaت#k:~Y?_Wm! B@! L@I~9re2e|^22~ >ɱ[W-Kˉaxw_~SZozPC&B@! @DAG\rS d2A"ĉw_\~ZT5VߵB@! B`&#Э㠊~l\?exsXٍ٨Rf!ÎbBMUtsesrdr̵krQžf?B@! B k]q0ulVɑ͑i2(sm[vi>p79r92U/מ$UMʘ\&݌eC! B@TMл鷪n|rMr\ջ5=+C'DnT#w97[rB@! B`hr_V\٩kۿɻe7իN79n[EUlv]~Yke/B@! ^Oگ++G\{%[նwj'_G ڍSe,Mm-BooK@zCmZaTqIj[u(FޤdԬ9^ΚS{f ~Ӂ Z{А|f9Z;NY>#X>'@ @u5<{W+{kT|lZkkV{J\ߵcY @=Lx7U[QmOWk^U=BhhuDuϟ/I8gݫkd֫| @ @6pZj벟?Y;YuZGkFm]UkQS{ꚕj, @ @`Cںl;kDFz_G/dVڐGғRR:vK9z> @ @*PɾT1^kFK]KISqf l{j'KONKmKiS{f2= @DFJߞ3F唙MBhr |T?9u QYg+ @&дI ֌ֺsZ9gޔkF>zґfԖQ9ec~ @:P%j̞cWdVzO/dfW|G՛[SSk=sVK @@@n/#i܈ "Vx߻l @ @@Eds̋2$Vg3z "G  @+tm+'9VTVTNIYO\GdAduFjG= @X ȼȬ<#EBs-3= @ tooΎ;[=Fn#2q2Ύλs9]#@ @F8DWufv9N}Hћ^^rf_ @+ l;&5~V1ʗaF7=m5{}#@ @'oF1e#1a5jb  @+Cc-G΄qf}8fY @B7C1Go{ܠgf^M|^3 @{ʓ`7y O @`z~y2f$@ @@Xbiם6;[ؐuE @>xdX7;|5${ @[lʯMK`5}{]ob @ [”k'ͥ\# @ @0?S穇OWv  @ @<\o9yk @*B|A7 @x+XUx @×W ^k @ @RK!Əy6)#@ @-- ȎkЁ @4: 7!:Jz$@ @Ò w @ @iׂCIENDB`dtkdeclarative-5.7.12/examples/exhibition/assets/system-notification/Temporary-MultiInfo-Light-8.png000066400000000000000000002237171476226662700337320ustar00rootroot00000000000000PNG  IHDRdj\FsRGBDeXIfMM*idjPd@IDATx,E{fn/A%QTTVVEֿ̊+v (PT@{wz3}_ü:usΜr" " " " " " " " u%kmQtE^@erSB@_)]_@D@D@D@D@D@G24/|񌗧4qb2 D)VYIRD@D@D@D@D@D`% Mk/#XH1D@D@D@D@D@D@D N2hq>L%" " " " " " /4Qbg5ʊ@FjjCztdL}MD@D@D@D@D@D@D`"ƙnĘH7*" " " " " " F`g&Ac"n؉]v^h< ;Po< ۂ u'@w"u޽DD@D@D@D@D@K 0Єap=8cqWMm&aoj<(o5}(v~>(@SJݥ]3ܛMu[JT(F%)[D@D@D@D@D@3MithkTi`Lmi{F\j-" " " " " "0q45f7Cf jL~Mah h#@oߟH[D@D@D@D@D@D`,&6g {#WNN5Q" " " " " Ia:blH1nD^8mǵU" " " " " "P. mdDn{@|z]/&NM6I4-*0Xabu_=m~5[{)yu3W?.3&ԥ_׫ Y]Y,( B.ƃ-mvDhj$zfBGo'ߎ*QD@D@D@D@Di |݀7O?.5Gĵ0=C# cky۫s5ch|#׈:c@5FEPˁu-uSzak6Ki" " " " " "0Yl_z"hM_xF"UP^zlӮ_qp5WԫzSeZ k"ZeGQ]zD,q nhG=Gݫ*9v=p[_U"u'j!" " " " " Uu^e[׺}]jbc`9n}Ղ +_˶Jwq]E@D@D@D@D@D 6`sVzZc`;N]=![wճv(OD@D@D@D@D@&;@]W.R]OX <.=B +_6ƭ7n}6ZQ\D@D@D@D@D@D2 [wLk#q ?h_:ǭϏi9i֞r.Y@ݞ8ũ`N;1PCG0tԢmqK.?vZ=U\D@D@D@D@D@@Ճ2:g]qK:mīj[8tT lC_z." " " " " +%šYt]MUZAgUmy-6ٺk%KAXUu=qVG .[oUv[>TՔĥY*ވ:KI" " " " " "UTW試,^my_l+nO5jVѰrqZ=$>^_L6KCo:*-gTm}Նv5e|\mFO%e+)c^MYgV\D@D@D@D@D@D`U10.=JAx*\X8RJF-BIZeU[>HoPz jE@D@D@D@D@D\ ˭Ē>Z D9*2-ՔSUmXv*,WZzюJu[.hv?&0S1V[GeIe!nAv8q_ZSg;>rꩧ?xь3SCD@D@D@D@D@D@$ݻvyoy{!Q Qd&Zޮ˭Ӕ+\- quOOuTR2Qeņ-X y7IH*." " " " " "  VLc駟 6c>X8mEJʘՔ5: #Ո`S)GXM-GYCo?ü1J-t@92XfN:B9zp}Gd#˕\MY[O%ucL(GFrF/Wt]nk0=+OD@D@D@D@D@D@A`ǎ[hw uq7BėSZR/1R)MD@D@D@D@D@D8FXcVOGax67Jӣ+WY[O\$Q ux媩"E+9ye͹K?v:Fhmm]zgNvuq=f/87:(2Quٚң\3dWN٨Q21 . ,|e$(" " " " " " u$ff}ѧϟ?/ gp 9c^nQd(U\Y-ՖzىUnQd(_ji/rF/j*Ԙr+rQdKŹwuvvZ.ɋ@ EY7PiJ(ELP>iIp7%cJ]n勀4e9Ec܀6x|Q&eXUzK %PirQ(&W*$ncRR@c[4`uRRF/Q强*-y3d*\R2 u˼y~cBR"" " " " " "  "-ǸhF1s|"SQ{~LJ:dR2a㧍|]θ8~y7K;JlrӰf1DmZ&\ <.:S.\ovCJc\u~w[=v-,Acl[Olc^;^U ˧Rv]m{)L;ڸʣ)%Si>Fk8Sڭd˜cbGxr~h|Q3Ra6,qVw hE@D@D@D@D@D@D`B3 8l y#[*ȅq_I^`ZTPIF(*&wї;wn2:w_wхk=swW׷\,lmum{S99ݼycbuRY֯ Ӄʕc9t;,W.[UqvuuVgCN;?Ʀᄏ㤓Nu+." " " " " qz8.'fQv!ܨG0"1-N'L^XV^1YNcg n߾ `Yu@ q3sVԬ ٠r[t߶dn+z +'O֛=75&p =k =hA;d\gfO^24xEh\1i0ȤJd(4)c`SױW1͈$^*/J>eV[X/Ll Q{(iQdzuw cE={y4VF3eKɗ7zjC;W/[Λ<\\oŵ_ӌ猙D#ȋ_=Ӄha:^җN;iO{Z?Ŵuֵf2 5s4ˇ8>m(Oc :1{h Ш|7Ŷrm+T0lyE@D@D@D@D@D f~cb4ZogQdȖ {IܕEWJ.,/Ҵ(2$[KX vĵ\ *AdYfΜ1^.ALᇞ.4yaqm7=kaW\D@D@D@D@D@%d_X(h)=g1oO4ӛ[*F3¢>q{^JQ󓏒V  2n勀LA) }+uNJd1|j߰J2abgkTT9oJQO^so:BqԹo?JF-U.}4VZ ?P~i&xe9zu\D@D@D@D@D@D@&{,lrxu+7aml J2'M[[E@D@D@D@D@D@D`vOGGo]F.(=jIX+LNGL:ȗ:Ɉ@ڛeR*QdleM<FW1AXA "QAD 慝{jm `8WW3(2*g6ӽ zϽyT9#ߐ0nLNɄy#-v^~d'elxyye)&g"cdKqdbmXM+unWaq[&,^I0}f%P.cǽ}:gyWgAu*(:s;iE{\D@D@D@D@D@D@&#(cd[γ{F9Eg2-j+V-gEu(N<䓭i2gā`׮]ɭ[yҽ8J@c\AOqovRya޲JoCƷ>T&orS%&$󨣎:K/t~\M+g\sԸJOr-]!O{;," " " " f lƄyey^C&sAm=^ygmQvٺDGKKDAhXrt,6ySۗr9s&dm)42ں$L} ws>r@ɱvi{n-ջ.lM/(_D@D@D@D@xɄuyϽ< JQ 2L3avdt[D,چVJdaiM\c D)pPnq&z)Lq( :(2 1<4§>(|^_= x; @1<}>uKw;od~G>\>{Iڬ匏u+i_*N:餓V@<Ϯɽfs>}z:J/N<ľ_W3) /+J;$#" " " " UŒe*dt[xe9ydR@،i_ɫ$,//-rt ڐ 3 *ǖI=0e/2E@D@D@D@D @ccjj[KxWA ;وQVWv]c1\|;6mNN8N#n~[.oO9:r^kή6g% #AHcK_&eP00 ֐A*> s7LrYgr|,7Da#LbW O^Vb\;C8v ~LǺ2Ӗ֬Yz 7vL{L800_n:cgc/{5ݸ-0 7^ YuCcwѽra oiXlioW@dAjk^ SKëԹ]-[M akz4tuz/;jq6P40?.t0dZt /0dK:gA,<*}Ƙq& ֤q~'SO_ZL&MӐ㷿ky3N8ᄽam@ IƂ&|x` bƩq╯|kv̔9s\}ՏѰ3pK.d1 Nv>~v[x~_| Za {e/{WUy _}Xko~3q2Ĝ?O}?swo\h6mz2F~\Z85rXh:6}_}kO~2=yϒ-[1Fֽ-on}k3N0/}i_jw](g@}0|f> qȩSo?>wuu}L$`C3iĽ u1Թ|s(eʖ)|]jj/ͯllii|Ե4m'b'am߂Dg0dC(>Qf# ;YgF\f 8ˇ:z38"`æ\v4ΆigQ ڬ+H}oY+{ 9m;0{fWa?3B?+?>c |܁\[σ`b孶xw5`+)AYgu0ny޶e4̚5k9xL;VG CiP0^3+a i\Gcy{xe~ӟFrt!k^1+{mӟ4B)xJFc +Iu ԛַ|B}0j>Ƙ3gd?v݂|zYOX:D@D@D@D`UjuV[ SMǢ*Il5qfb NnZe8jJ2,A&]i=`{ p ;{;N.=`0dF`QF4>B5diteZI`֏iHQfd8 :q  F \_1(mrڒdz83fł>#0䟘"rF/|߾_fwczk׮SOu^jU'?ɹ~噆qx֫pdgavJ~Sϸ9+R7sxo>*0A!0xoxܘqq{/V~7>~Xcڇݲ Xh_o#LaޏY -Z4p~'`z^7y#so}ӟ^d4Fa*r^u#k^mlC&:D@D@D@D@\Xrck*}f*秣>cZ_*Lªuq#fjr٭Z#ACJ;&o\)cMuuf.u:;3?J[pd`gL6 O|iaZ>L00d`I;0YeQ3䶶LöF6ӕ8x׊,YuGbB/՘Tr1 } _Xk!vjQng?ٍةz ?&Ǘ[n3?J6b^uNotzPPƖvYx1$/^mܹ953lyciضm{1=JFYl f͞bF"Xh>ũFUjĩe_b0 j=Ŋ =f#wjo':Ocj]c f>6E@D@D@D@|iD/UzuzF+W4- S ӆlǃcq?y|41aLsK1)vjrkW:l#NY? 2 0Yfb0`q 34 cx˸1!f1pRb=zX^v/x \ϔLq)q}lu_5uqkp03 ] r "e2KhdWgfӲ-cm;nLx=5m9;^[~*2'J&hx=dx%iwѾ;L{[ho 9- f9;0 :0daX`\F°%(8ńN<`추M(KftFRs%Sr!\Ta+Q)RҘQ4MG%>4B Tƣ(_4PS1{)PvY&\Oq'2i740-3f 9ͅΝ;[i0'L ;{O߿˿YTs'u"ߴ#0Vߟܗ%?m:L|C\5wfo c<90\zAyxa1IzٮaPD@D@D@D 4Hex<ӣʅ˫~wsQ<(2^;nFM35 \2}LvaqgУ/yȅΪVn>>d{aLd>PgÝnpһ]bRBV44`\xhf36*”߶loˍRX8֘nbgLrڒ1p{jEOAE_ۀ%mldD@D@D@D`?$GC-gD=+\Pi! vܤ1_I[ w> yOZ9O8}fݟ'\]iL;oϭ΁ӟ$;:9oxs"gn9m_awLm(D r1sl98jŚ8E7a1~e9A/HZ@u{6 ϨY(8;S%꠲qxk5_73vRELLǏD@D@D@D@38SI>+1O Z+VI,#ݸkw e<1zN 2M"×87q^rG;,{]['L#.KXZ<% $iJ\ h ɮ0wi LvJjc3\Jx'ޙQmj7f3Ȅ6^xR|72Qӌ|]BןQQ``XI5cKX1Ҍ )3:ٹa?.g\X&,yNGqrs8kt# s]Kf]`6 3y whrvwab8m)Kw"\3] p:NlSxgv[tx,vz vub?Bi'--gӸ6~)]v 1}(~.]2_\<W+i=[F^z+yus3<ӝFi@W6stqǹlӦMmqϽmysCy޺K0эzٮO0PD@D@D@&'h[ΎK[{^Wk)R:[N Y;ݎ74ˍzث06Ƙ 6>y{ә[̫] yIw8{rڇgZ7@qItt_g3ѥhx64v[V2e&młӆoiIh(@,1SOx+^᮹^\jU; ,\T O wYO~떰w2mڵkW[YOtOL!}r* ׼5+/k`\pA`m]w%ucthq:{챇cFq t.)S,a<B;^kd>я.xyhTöa;=~[𾚂W@W/V㌈FGa=XSn?%/" " " ".5-_yzLYSK/o/{=qK#f+l\Xi՟1Ncad2??3}y] $l{玹s}Nr~vFG 2S1c͛̎6^Į xN8iā[Xo}k_;nbk?3Yu30츆$Z5'Kwk9G˰(i5u;P&y[m˯1_}[l QN;)XUW]5 Fa`S\K/c*'H,K, #u0- #lu1 ]4ނie59en)Qƫ=Z\j" " " " cpc+̰JX&N[Pq#/ ը;s;AtbwE]H _q};y2<wu4<(낌bj\į,#tM` H-LsYiZRU~W(^/8v*^vvzCµvhd3^[߭+mSr{ 3h‘;z>h1IƼWcxq1v7L^Fw5:*.k 4&JL_\*@IDAT7{6iAq[.H/=,-, &kOXq ZR+\K(}9cb =wGwCC &!9Cxqxs gﮜӊL2u|b zA 8[qZNOooJcT_#Ω/X)2u5ʩ)-9A[RNyN}[-Z4cS.ԭNI.[nAzWrGi܁ 4{ NGTwT'r5NY8 QPOO16aq\3Pq@F'E@D@D@D`z9:q7c"{C<;-(n0}K )n~qwfOR&H/ݛVι-[NO6,/],^lX43ֹv,}yv;IC0X©k{=02tMO],8i1[U'%!W.qFF9ea\C2\?>u๮A&usNZ4 "@ 0DL )o&,fG{墜0|xK媙U=7voy9,_]gԲar&τyyx*//w?.B3z`JcNq^{"c,Wwwټ>M5+S>z]iU(-[2Ia!N;;F&^ "" " " " " " Gx^, 7ЀmVs߶:[q;^v|X.8Y@p5Lf.+" " " " " " @a?ib2v7A00_NQ&>pgI9pfpYLzK^O:623zƤG1pt%)RЋiq-3lr3Pgfaܩ;T\ = w:sR.CD@D@D@D@D@D`b0`G& WzcL 3uOG"׆XӲ$Y8[o,ɶss7+׋A'I8}g/GMK㴷cJB8wΎ'ovr;~w.s9틝9;"j6u$i9LY!" " " " " "0IpHCLEʙʕ7NDLXaGX~XidLhkNwi[7bjaq72mr%4]1# x7WźţV%4$?ӈa G69CÛA(JNIpIKmYmmIo}NED@D@D@D@D@D@&95aXdT~XM7 2tyv,+ېлٱ#(/ݛ=JVZ!oNސc % v:rZRXwBnۙp24Œ19Cw=sC#?aG*S&< G8_GLyq?]MhL-K3',ȘzC_k$Fg=,'\F1F[p+Sp$i) U.AFZv"/`̷D% N:D@D@D@D@D@D@&3Qza$Kg2NY* %挎&ݻ'9.24qspzϓ'S '{z (qjQܝ 3-0p!.LWb2T;{IΚv2\7&BޣԬ֡=^1O\}}}]vO3ftuurvJ-߯l߾=588o6Yp(\\{S/x vwwjkV~˖--wNΛ7/d?xk[[[nҥayZsh&?fM9מKܗhh Z#!FB$=!$Kg5 ([[m%ehRh#mp&?$? h]녚 q+ī&^.H2.ç[^r%!c)A9ui q>Rn8g .k@_5_zWΈ{7,/Kw:CIsՌ޽{wf~[ߚEal7q sws ?N+bRkA _ދ<=^kSJ'#M &YBo?CH]Ѐ6TRw%e*Z%ҍ+((zuzϫ얡L/Vζvݥ|/[C6*G%2L$0/z ʝ8#hkiHcy׸?#aReNyp|ȑ /c@Yu7/ÿկ<OÇzzzM9*߼Gy F&o}r)W]u􁁁'_0H:uj6k`>cy:XPſ  mO,Z[[#Okv=zJ?+9>{m<Ϸ<A:㨳f: CAGX^PK 0ac'IK5#9 SlG+PyF⟡!욄|]v$ 1PYQFˇ upudf`pQuM A1k޶h?}ӟ(&f;.~~_N H/wr,X6mZSZic ~~7N~ ׿O) ;424;a1?OЇ>90w)wqGus1ԧ6\sʹo_qO1ȷazp϶\遹%;_ ~lTGGG?`[oxqM;]7[c?0Bnᆡ׼5 ܦb{ի^5yMCTf_tEp+nwٲe#^ziܷ*N:PC .2 ~uLdF :4ʶд݄|0AF%sДU(y_;3C:~iQ ˋ;Vf3T9luUײ$.Фwgęu][[~1q)1M+-R yЌC,Bxs=eI0mgýD<#E$vfj}%U{S>ΐ.ʘ0/;gΜC9dX#N!_gO8Yk]ƀ5w_Gm'q Ȟ:?>NNϘaLh .\rɂo|Or5kִBx ^QØʑb`hA& #F/dV`9zf+'NCW_=RNy# /^m1DѸF 8-c6SƄ_Wg7qhý>c %a[|`#1J}l)*9¿4n1&sPD 7p,Oe5e˫Fҵ0Qkih&^7ȟAc ³e=7)\SӸh@GG7u A5/ (X5L>=lEŬ[o1mWuֵ `֭zYg9QCo 3)Hz׻P`yүLcQ~uc^_JѨ|sܽvAqzhw^@ۿ/[zu;]-;mqOI'l~wX>$J4U]? 2(Si*W_~V~2`pב{Xq:k{Z=Cr5lOձA@F)T~*ƈD$>Z|n~0s߲v^q$ۏdzgNsz9m0[ 6| #0`ȼTpPE ^;hWIɒ)2woAZ' ;B(\?gcJT7Ly_]OAc|Q3fWΤqAX^v1|H#F ׭z?szf>/,1ϓi_.ĩka9曶zɒS|fdadm۶|wS9ߙ~ KQ=|'NW2xȘb}7[\wG9/OsLO;.‹q!CQ<Ɏ[cyYH//~Dyy}{ w}5ߥ6F9Fo,\ HǠk6|a [~ЀyvL>B|{<ϛǿHsP]W9cWlL]14vha3^@,QɗԿ"0i Y=tD[TRWT\y h5)oB˜F.0?̝:|֔l@rn_ߨ{`YIǿ1gӵh3e4g x`z%s3a: 2)5ʠL߲dk & t?ʿ9}9yO=dmάe;q[2ԻgorŴGZZ(eb1\#JCGˏ]aF88p/_g6cA<܁:xpm3R/Ō۞>r= 7n讗Aq/Q9~z:ƣyCNm8mkLl] l'Bbr-t4L1[ƐF, A y _N)?}NѢ .ӝX.x<]jR/x+|:0>s/:54\A|R!PfJ6eX)^<`}W4ӓk<bnxtd|򓟜5)d~ ƪ0p׭,__ w>Oe_|zJaFtᇻ~#!36M>>872L}#"3>w|+wxᙜqFg>YP}{3 r,mیܗyy?2 <{uyb2׽uGkFMޑsodQ)+ -\yu4tҏsy^г$ 5CC< O%?@nHC :tT(RSZν0o׾C# Л 9%W8rY0sxp&2f<1j_ =2cpwgDl/_$;95|i?t32ǯvix0)pcUȗ[ mx0/#i^cWsxs`^U/F6(W` V:02&$'ӛo+ ϲ/f>Y[03-g b\0kLa=o=/`\d1|abkq )R|yШ`15! ҦC {?z.\8p 98 ѣFCYS Ǿ0pme^gؔguÛ7r&t~aXF)w)d*s1&r17bdӖ#7<7 8EozΙv>>58x!qѣehAn>'^y4d:`x5yyy<)6#2!z> ko}ߜMc =RӏCK t {"0M9ÅgލE`=xNnll[f9 . ~!46[&m11ir0nLFvoyvy^aʳ24utCǴ:$//}Kۗ;c86?aLYegId\4qx~۹Zg?u[\~q{q) Ѹ]6VӘBpR^Hg^;աyU(nj!< i|8'RӘ+ĦQ_y>{Q,$L3aŔk {ot /Y#uu%z||ͽh;0۲r]}G_x8%SvsP"eIOJdQoM慅 roLhO1bڎ5*`t_ՅxnVidBx]'yG>|XNާᾛf{o9q'<0յ/|ahxvBG؎ww i3C{FUzҋYC;4"}.gɿA"7ouin3ߕ,oaqp[8w i7ÄI?ƀM1sS/Ð6 E`?%0 |LX^}Oċ1ȰYBbieF-y`.gk7椇w WWUnu5cӁw΍{iq=e ,q+_j5^9~ʕtyaoBl\ܞ\l2>7~E3E;#_ܗ=ㅮ8MSG Czqa:}_˗/UؼEp=z*pA:ѹ)X7q GnMr#ohmI+7A rQ ׀-hA' LnߩL꣡i|{\{7_𱛙etnOAs^;1DZٍ @婃 ΋dnN]9\gܛ40qQdϲϸfdC)7 vYxpbc^6>G>9 ;xV0 @gIXu0Ye:봟a4#g`sH;sI1CL*SL;swј#41{V4yexEzсl#=`p_:l(`Lb9q?}ZH}lWA0o3Z:S8em e=;r>S^<cy7 5yxGwm쵟Gc/#[S쾆IZ´2 {z]c>e`,,>tAc<{1 6wo1zLw%-pcB~24c VpB=F=|Θck1ϝ4eg9C.nҼ|24옎x_=B؏Lx1Z=8u2zMh5Muwwwn}6wiO𵞆gLƗLz c>iS gtd57&z[|O*ƕ,]sϐ#0`XC#kpFw91} {pxpf,9MsnxݞZ^_XFZK1{06 %䙐/UϤ1hP/ZE^‡0riKp.Nimo; 12~!]M:_L܄˸q6v)?ޗf,oXi1rsj9 2=ǵ~lNߴ%cB rA|Pܞg}wN;} nmP4tY|A75 9Hc P.a{kOY|T>g=,  Yw![su?Z¶#|хνgFYp82i,Kc7C\1Fy~&H#]a8xڍqi&-,^#a^KEySahG8h7#y?/~UҢ~.̟}fFnwq`w) ύ CcyiL~L |$CƲ~DQ1rM=e8Cc1imq2"&MQi!Äqw?Nq '% &݄u7}Z\ ;WC&3?.K8._>gW:YzrWwU޿LzI2}&bW+> XxX gP`@y{WTDLf&Ld=9ܒ{d}.kv]k6i`4Ȅ~܆272pku屹序|`u-\{naI1A]yەAnq˯)A7ƕCmDv%% ک2IĜ{]`"J\6̳գ"|,[,"H`5" AJ#*$JJ1"oN9ʱXlriq}?~jWLb@r;ðqՅݘSQPlxDnrJ8Iߤ1(m8qCj ) ~Aw&i%xi3u_cڈ>DxcC6$6b; Ta ð1ŭS@id->. bv+' 3;XM7Q coSKgTHȍa0Č58u"yW1Eĥ,-&3aKNK.mΤ,> SKqP ߟwƐG L!tߎIu0oq),˂GV|UaAAT3;e9ϵ:Yx,ip2ǣ~ha6G3؋Y<19 ocm@L~1TE\dzu1H\4)x$FšL>nLP'|a.`?۰l3|/':#i]NSA|9(Q@bbNwlbhU镕't6ڔճ1K:5fM4é~2˶ɖTtw6y"&H@Ɩ{cPB]jSRt|p(:[H@(~q?ŨwX˦Sv5,oCHQH y ҧ*=J*|luoߝ3Q0a(g1[MF y( BcCw U[` o <g46d) vi3[>+gUײ) R$Z;Fd3>aqy/cDBӅ56-ܘ ih{àl ԑvF]ᖑٷ/&ܼCY@@Ɵdn9ENr4sVrNiܲªS*@ݿ?kLѦV|\<͸^VW|#Is?hnu6܆ޞ^Fa-G3jk5[#{ڻr=b)/gWֶũnh߁ζ9;Ֆ6MH[ e͵ 6eƐ7taWHYs9&D5Ly_M&D@WlE5 ] ܇1G+ieg8;aFpjtN>DV|;uCGEac<.θӕIaNJOt4vB\c^Li%<шKlCE8*?'CX?o쿨@Ks@#0e!>O܈>~T5.S볘qpGL}SʒTn$#]artpԯ`iM|0RG la$! kjq5Pa; S@zIS4cTiExVθʘ֋0a* (f{aJp[RCF/Z?J6._x,5&?.Qy!ĵ2Qw?i EavCE3a`?.Nzg Ic(1&kLO\I`#?Wړ?J[eI/NYx`TŖ) c`UYas-jlbyϙܵ;-<2':!"3M' 3XoGHWRnMnO?ۺxmnuFw.ܙĢޯ?&ls-Y}n6Yn[. f9?3[xhDe3 ~N(E4rsAM`BSj!Nq+J`zŸ/ > [ås6\ !9[܌ ב'-#x+Rms1o;Tp;}Hm{MR~w62ƚzIr8"ICdXDb0b!ʌ#<&bQ2 ;p$Ï*< 7$-&$!f|`9eEmTxF.Y}{XW>#v x,~̵EINs!$䐘b9J%G7`Fz֨BO6gWiZ2뮻RWZR+{Ӥ`U5Bߏ7W3C:,^ن'"?|ڷV4-G^I/Wx^ش(mTJ2xdk>wRY0T-]1.1 `&}(B)C6| OKocNksKkq{.cǮ#n ҥ=)#H#  K 0yU77;9^7V-&l.čiLdgfL1-XZ}7_vm8!5"xыM8^ɏMq;$# Rs$ޥo辉rD-P% MX %bp-AhePHbA&ۉCbuN:Em`ip.1$x6ڸ9B c_LF/HRlHYg5P f 8).׆8<0c`qm}oI;*XFD>a0 dӵ1&IC =b`[1:^$;okI?ԇ~ycku 閮0MO" ˮ֍' PcrIrg,C$MnsZnPE@pSF1Vp12\} a%"O|nA wߘiLˌ)ٚXO`>/^#&NJ[8'^qNx>PsS,y-ilzX=PAoh滨ƊzeuHP%bj8#Щx/ލ7 Is])(10ʇWo%>̧@꯮a>#Onև8W޾Q]`x h0K.yEd19i4^1)8%,̓jaw^o.Z+7aY7gEaI:a$Ś~ly;NN?&]5[7:9?p`TbFFw릜A]m[* PSo s`.wqm674} oʽH g$bB1tW**Dtݰ#0UŒ"Xя~GD[+lDخƙ@IDAT}7pC%m esCd c9S9DZFw3ɩ(ʬ bn)&i1Vhnv6304`ܗw1ņH*9Ua`?D,Fj>pMn6uR>3BKf6BZ~fmIH9"/}+AXKgPxH@Dpp'-^%]Ug> zK\O|pd.•@rK/_9ug]*'Yo׿uZdDi4䎮 N'~J[f)(ޢz/FAHos$FnMb>ݔ B>*L+,7b;.XWkU+ -L^zi~haI,Sc م80 ikHAR B㜹NnSLx C}rp}e @eE}:01qSgeN+ <;jV,B壯jRW]7@rn5mK<פ1UZ/$JE]7X^ufGTR7 ax3:2wǗeա  I9aıG\'}RqJ<3}8g_B.01둈a9ꈤ^O_+ZkI dL' ,Oʕgq OEJ1b8p$ɇwK+c:ޏ'``a`iRU-5} yW__7!E bY}{OdP'&loRŀQH[dL|;yIj8~%r95AD~r]F&N, |pڮq(,$TAd0Tv6plŔYEw.'ڬno2, 1}֘؝}1fa+U؄c3‡Q;-'ka N(/@ҥT9'u0h .`HtHҡØa"Iyc"&$2vrM2ˍF FSN9e8G78vU槍mIF,]i3s$gqFjLmSd9 |: .&"s=wW9uWyMD㯕qFH_K%$bfq̥oM=OEqCcq.F:~q\$ ;x]`(s,-.>]Hl$`;?!p5فIӬ'~Cz5,OLUZb5V8j\r8gQIH-e&qN8LpuL5O+2gQڏY\'IAܪ4fpgX 6,\;#$ ^l4 $x _&R١WGIIf4ʯ!l@Hs`7SyŻЍG0O4Y<©?c|WbNG2~=,bZGC`4붻ed#R˿KMy}1ԧ>uZ'#&O00~Z_6} )"1haT7H`gYYTo$d7i\؅OWb'Yb‘RGl?"g'pB,ǭ7%Æ ~*"BRVs"jq,t8mz|}8|#|1S7f:fUhɧqDޭB'sfC!fXRMOnmziGn qivs{1ѷ'OR,XUKj""DE*H<3u1ַuS󁤱6ȆҀ]nuAJ@u2x э[!}Fp!y)oEePl;`TK#GjķyI#'ﻄrG0 jq`|8ȌN;- Hqn2isCqϓREtY/Nx"+Izvd,~Fh̯Tx(Q/@4gFiu`ۈT o׋ј(1 ,AL^ccOm:S`ƅ"5wz0Տ\ƣ8O_#G+HᲶKIk}x邏Nb CKC|]CGa0Á$O渉 7{Orɐf (X\1?[{pydX\K&ŷOo3*c677| c 8l śVys UxIq ó0{7ۻI~Ӥß "mHxv׾~㞣;;J ^8l0ddLmmZj88#AHErv4߷O]{ZZ Ў[65xndwXx`pppKˢ=##MK:~!cߵs;%ظhlxPWeql δs|֛.툘 3<\͝2oz|c0MQZ|1@rBEMH*!\Z7"Ry[MV4-p#ᔍ '$^%uС;qrlyc[Q8-MS?:l0b͗8РX~74郴ML>1VNNX@u B,"YIn*$ai%O$f,mci|W67:Zv0J Kjq.b99SK3Q[h1s"x/eK-oڀ>:`i-mb$iP xdK2fU<'URK,v.#X-?)~dePfeb078D8KԁmRqBXMr~7W;)M!??wg+;?|lh{~3ZYsKI[KYxэ7Kmb] B0h}>~onhs 6-iMs"+7oQTɻ/˟۶_\tke_]Tepp__op'u[wv[k>`vq曷/ۺ= ?+uQZȸ3$579-y&UGZFl8ˈIDϣH1O; f/cpVMY̞%ꐈP\۪ĩ$ VW…*T i0HDfeZ9CTD9ean)n9i ^- cb'K)DSn[11ڍd9%70%_qeeQs$jp,C w]sx v>f+[;B8ì=#X̧'pADRX킴j1f`PxXIkR8v o6kfB5&Ƽ4%TٽJ:؎wk˭ʹjUn^ےd\״vQD1yBgMiiipcD%Tn !\h>Pc* f> $Ѷ[2KdjTCT?Lj N -31[Mgx0 ~YR/.X1YL|BX@@TzƋ7kfdӯfOB@1|fNu$qҁrO-uuC6&:20v'J2ة[#!d쯠vU,/` ``1 ;u;KniL%j.>j\ E̖Jc_I/2mJ;(V&1ZH!gqJbg\  T fT~2bs$(s""f ĉ fjJH %# MR_ <%qh㤯zիMS[$,PoxsFDF+K@N4"T՜کU(Ic$I]ޙdn Oڞarl   0PQ&I vU?an̲)]3ׇk~pgܨoF ᵇE ه=a/Jz׷a@W[2/ )d^^DArb>OMqfΙ3SK@@@@@g H2 L2T7+V{Vx_ DWcLzϊWj'_Y~670dzJ XP@hxxx~uDq["jMQ"1~6+zoպB{W+j,2d1C}ϊG玿Aʒ_|OcdB^5/vrKbcG\umua{&]|^O|Y+@bCiQj0wdu3aݻ 6m{'̶q%r~2rCivc&2IXܤrضmbfǂ b`IRزeTKZ& 6j~RFљ?jERF5OnK)?JiI;**000000000P`l޼90cA^TM J`S00 mF[JIw`֡3` ` ` ` ` ` ` ``b`RR^nX&Zm*VCeF?I\2IX ~y@5%Q3$V}B{Ovk97JV 0ύJ000000000_TPdUi#j=] vJڮ5[F}`&x  , pFݕ ܁upѭ<ꊣە&mJw@ oڪc\#ku+WʕdB nկ~Z '>q9?k 4>/ݵkb5]9VO|Kwp[}׿u5\9Q4֞׼5k(֞g}]{/^|#4pu18f===Aǝq]# Yb$*g021+bɍ7essҥK._|Qzqb Zj\du:wׇ-_׺y?3vg[li3Ɛ׿/y-Ҹ}m>uQ#w݇Oa Vmݺz,:s뷿SO=uOߕϧ\b.>)ʕ+jgϞ:I;:{&2xL56K*04!c6Z[[]1'T?L Of2 Eߞs\emWpR#q84܂^u]ׅ(-XqfS-}/Ko6oFS%m rʂbj(q{R >H@|ͷzkӿ~}{6iNۢhFFF]x+6TWW{^ߛWwW.]?M,+Fo_|{ܣ&Ym z<߿?ͲUa`<"ЃtL)2npc)*CC{PPQ~2CYV*9Ʉ+?2~}{@x? ~T{Pg<q< z2^Bԕ㇊e>~K*QԐSy*: 7І*\(о-}pRZ$waXe%D7"qᇏ}';(*c?}D7Pnmfo&~E+RwpOUxiF,Փre˖9FLoooC ~k#? ߁SJO;$%+;n>T!'U=qX%MsMR]'rJ7hQ׷㗩Oo[L㛐<5z{s?IsfGTlד1 '7y 8ʓ5eS862udN505+^7P΃+V8ϏgStè|'I=׸uG` a~8RM m+~fn:T ̑60I2_2V1Lh 7Գ'7O}W<]h$]-ΠЬ"r`YϝSq҆/|v:X͛#T۫ cHnB0ly+_8O{+x2m[ c/˷X3q_կ~թ6Ӿg½k:>OI>ʹ}ի^-I@_e1_"n1z6񲗽l2܊-Jw] z򓟼_b$ܝD\Ztlst "(~um-կij'9e#6`k.ַjgߛ->gw.>ci}טR}%l$c "TFBf8h8Czz~yQX{k_Y1bEέ)awTy!ADɏ~N>5IRbsM\E4mn2܊1x~|suSX{bHq:guGѽR" ׿~5>AļYۋ7uC0I} q%Jꪓ: \w[klj<9"qٻQcj?kK4xe>yֳ5em!XjмC0~UOm|CӲF7k?oƀ^T4`^5B@ .7l^ܻZ=A{5©mҪYwР㏣(^Ikƕ\{gַ!eiaf{[A .ZA?_j\AZp -?OĝLC =KSy-3N?*L!ne5u- mǘosa‚;1PmNGcBg͑G̳  ,!#21bIMjBmo{JFD}?16~7 N3wMB&>!,0Ĕ\ 61c`X?EBaBѢ%<9 lh`ƀ?!1Fsm#i9O= 9ĮMZ+Lx?5cPŜs }HA{]HNdg^z2=qB4i?V)ec|C"fplիG)aaLz{߻c*e RI_W{c㬳wjC' }sDDmI\z.BZ%/yh>#FN^nJ›ۏx#uj=O}SwY>,{!y$uSU+$0@F(av>oxZBQ6_2'6o jnMJ&`gRp!!WEQ+L]̹I큄! }1 6c1!-$'i4~{aT.e4033_9FfQw'7p;qoO7MWi|Ӫ~S7l˸jH;` JoP^Kl1H7Ix&cɟ1`ky`^{7`"3W-#__8O9q$fW{V1\<׽n REN0U6q0T=c}0=Z] 6|^V9'lrA#DIa ;28Laks4}g$$ri{@@@002:```@vm:֩2Jf G>򑃾DTN#f FLY*86$p:e1$f'7lTYc?w14r =tо}W =&v?L"ѷocFdiaPf7eq!'pzP!)F@)BϐR,A)e*3-1uG7]k*p ͜tGbe/aԏaw}?>Qcq1ƄYY=Cao>ca0ƞhX4*U3 _0d~zϘE7aI bnB&)b` uzڢ[L*fx@RGٻIwv;AQ*ŭ،0EZ oy|,Npl,, . nCvZ%"aEXA 2l W71:$mHك&(E|ZX` Y<'lL$]yv2ʆO#}"üH͐]H0QFEIQ#IQ6 t+l8/2eAIE,$+bʡɾ~ Ҟx6˯ 6rcF*3:ybwi $ @% `(R0"#meqd5`cy{W&>?7j'h6I® FnKjGK=SJ*8]ǩp$W$UTL{Xi΄$93-mqAcTJ,8"ex[J{nX~Ket׼;2˼6B[dwy\>8NYJGyLiSȥ޲%V$1d2`?p <1vcYC}!0dgۆZ.Cv&l11mlF^_g+Nd1?NC @j;&p FݒB 7@L7?wʁd RCB .iӲf#(qp\o^v}|f|1#Y 2HUَ#۠TYEۖːSw9}Xƃb|:{17tScp&f#{C}`8FMip+Go-`|"Ćyڃ:vQ3Nc|GZ~4|+<;#}B{htRRŴ(anNQsfBE{I%o I)% *SbF"o ~iߖ5w/)okI =;H2R\OBODbw! G6Q3%=b43 ema!wۤ ;`cs3ҥӹZwm2lNil JD\k(wc 0djB gܶX?E` &Nlk1,N!*~bK![SEt T"BeH@?^yvrF|]I6 h1*ƍ;AvБ*ZKSʼn yçM{󔻹QH-!㗉 5>x/ϔ[N_R" 7*_;/3Q#K!ҙȲ`Ju9Kƭ/2FG9sSeL0;~Xe͸d>҉} .~{A)\6i ‹l7gߊ3.֟:upJ Y[`ԓ0&i>q훴:p󚈤a ZX[{JR5qdSk|V3FWxnVp^<͌oLڎ><])xPFձE`3$Q}aPMW~WigI?mc5ʇ-&1~W1w602gMbm`;s}͊85"[jPE1/C0dSr0ź!#I 4vS#w`"k' D63Fb l!̞Z,wh/-\s~G>xяW;6n`)}ï} bI  vq|xX3[ k c:zm?~ZZІqԸr`LKn$(ʇwQ=nO\rO~}d۪) i6,wvZ:=F%n3 !8FS~̭KMj 165,:xA1TGsRoiiځPL{4L.Vp*QѝpÒವ% >RcW{Džf6S|w NRB1PO3VهKAzMgE>JSGlm$jy਎1D1o pgk;8 'T]JdxqC-jm2X%b̕ok{<$su;`EO*NS`30ň CI9yLT_If{?0¹]5eU'C+!:ɋ /Ò 'EصQ7 ..#r[nrxmbFիK 29r9qިtCp b`KLPtR|TlMP18.lF역>(]~}0$ծg5F11m£ 8Bt0j+;,Ø!E.L;(ΖL;o-N$bݭ:6*Is6ysMraȈS=mnM!8ו}Sݬ_җ4'٩kWuԟk|'CE@'?ɥ0%Ix{ VD[hy!YB>+@i9kE|ΔgO|L+$=%X0z_LY[k`0/| 09gMkQvbT޹ɏg-e5^Syͅ״~e[I9"o|ړ+ɍQH?Ԕ5>iQj_7W[3N7}$yN-OWʻL%VymYu1]don'iyD-1/1ne<>GhpvFGO,\j?ޥޟ n@%0$d*c`s_6:w 5 zX."pJM?ؠa;/57Lh7RC`yXR\6^:=T$&RhՌ 6Lآ!lzyQNuB'BsޜNm;_i|Jg;"yaLYldAyInBN6i .`SqRVg7a3͕ ʗgd>ɻ#D4Xi"h;H0׌ŗ2_Q mT;wbFL0v H+,?:s2/y&pMxf#]Vэ&K0s*++\͌{[ɟ[Ez/dd'옼O?gN) MjOhD{0_QR=.6g60oT͙̽*ⅵUSẎ5Hm se ;;Fhmז$эu4M]ԋoTU``&)m~H:'1`H =޼֡lpi1r7aS˰&|cn4O5?sqDZcp#5>} qJY5zf;1LrçLA$_ԻJ9[48}94#Jr`Y[V\^+L}m90Hf ܘ0_u߷a7`10ɼ+0PAt1 զhLR]گZ&Eeb1@DFA۱GõCu0":yrtL*QlaFQ M^]C`Ს7 KQ`dC"pvf*6WqAD-/ù"94J\_-dSz1 pePJ iqˆd!%SN9e`0&gPHߐ_Z),l0+B>=#v)1_~XMh#K!/.Z #V!DSbG ̘ _).啱H@(#UgRaڼ!榜d ޘ O.QcN8Kqä4wIPms&> O?]ɜ>ġMhG) q LOAͯRq*X{E{hE0o曍H3MΙf(W_ O{%Z7gR6ڢ9֖z `@IDAT2_[y`7Ek}*L28^JͪGRv-)-RWX ܑUIˑ Swr^s466i^4Q,fnx|CZ+I f6]񥌣zødݘ4ޛCr1q0{ ?M)*a}$o\=QO_- O"iR`1&4߯;MDžor+o)7q$O׋z0ViG ӛLb0P_(o¶λ9D;` X4xiaIq?<[(<)Uu_,>0FHF`VĬb ¯Q¸D[ҕGJk`C+ > 60F ς50N3QNZUF6vuv/ *auZiJ3~AN1Y즲~* 5L唻P^cBc{qBJD>Z ~iFT冗-~!TP;8p!WGE,/K}:tמJx}![q/6 sƝN<͒30t3V mOC&>' *K>:{@@@@@@@@@@Mai)Er3 n{xYم'nj -~\IF7Y٬!LFɢ٬$aZʒV1lZ,)ַ- c 0d*.` ` ` ` ` ` ` ` ` `r@Wju-a\xᅛP]8*V6.bl1d bmNqXddcdi@ 0xT6ıb'j`           WqN1Nd{eY4SJ$}76.fom߾A̖)`p<ن";ΘڸL[cKm =[tk.tȺ.g1yU+9^MFw`aV02i@@@@@@@@@@ʦ܊sw!S*s9n)$%[4Ͳn.-_CըP|ݤ8 V?IDrnӍ[=vZ =oZUW_K\CE i7}\Ùo1dgӟvpv5S.Ts*tL\y,ɡy۱m۶n"$e` <E3~_A*́ >r X׿oATv|Ѓ/T0ץ#sG?:餓:7lЭY\F\gy?K>~~ץ^я~t٬}clٲI.I5lŕX9/x$w#)s)ٷA0iŊv102tY+ % ?x;߹}{ߪxtEutNBؿ~q=Y&+,%9̾ .{W^y3̝+.*f+p o}[sX츟φ?v[,n\1E2+})2ɻ_%-0wN2g*CfP݀V.¢lZ)Ll5o"cR IS'/ 9ΦG]]ݡ38?0c| =qwy#SOuSnGJ$&IDJZC; xڕҒh 82vrTzzwww q}^ oP€)v3 K.OFi:u;nClz4ܳ%,j$hX3YC=~Tm֨k뮽%0 1d~^Ϋx;+` ]vLv_-bꫯnS_R2"o١76mo[G>.0go:Tb?-8n2WR76Ʒhw׻5!}(IwI~l,b}\7- +̛s?e(0Ո_F_Wn_bŒկ2kO9^Cy3 fowlqb)$:>OF!1bltIHA\t- IDuw'8T___st!q藿TiLCŞVQM'~Z@BUW]ǨB土kɡ@5|DuG k>vD s'``aoFq0$u٦-R/V6Tta 9C8=`؏DCOO~RyiT۬,p@}nWoz_U5}c x6<9q*b]w]'?>"̒dڡۗ6%-G{}mԧV-toJ# tKV2w1\;b9YR[FK"b ᇅyvQҫyk2) u`> L/i扅}{F3&m6C>wbߜ6rgK'3sGx I etd}ǞH)pdv FD|wIh%j׿%I/ 1`4 a2MZ̝ͲgnkPt6qi?a»VrG1F`.>nInhK$:Eҧ} SqΫ+Y?)$R(|6m!mVgǕ# % &Cn,+pu2P?-BH`,fa3&Du E dX =Ǵp-xC8?6#. 1rbƓe1C=~5%Kǵta^L:7ӏubt.wӘk__EPr?Qn❶=﹟2wӪN7XGMxesvc0Gb q)jsؘxi*:S2> |xIMԯvԼ|x {o҉bpI;&]UYN$Qc/[)}, o˜IYj12o6?^G Rh$k0*ɩax|O)G:# )ws_00 }0$0e_Vl&j~)JOFzHGy92+%|˕b^6NI L][~+aɃ=Y6mcSL=^c&2eԻ(0nMzNV;_ǃC#}V'c_Sca|+_Jg?^!-=j:Qݒd@"K3D<ͤlvJER ).:Kv,>֊!UZKE7H7ZɥuujFs9MUI'J:pYDj 3[Jp">[ȐD`#R`[0>۫Yw^m{4r?t_!lp׽n[Cbݍ5^seO~0vg{5t0PpU[mKja/| C(j?&m--. FI8yO~w/QMnV90cwR1ZKSi N"{' yjwUne8IMk/~KN~XӍ|AyoUFY3췾 c/a Znǣ8ڍyV zeW^yњS\\lxxbocis~/mx礃G|ֳUp Dy\b|+%=H)W7UnGP)+N0` E/ۈfGDaC!k{ ``tuuFv_ NNtYk-%MW=+tk3r槫}EXT}cTLCr#d;u(lI:rĴğW"Q BqU֮|#ˌov 14:5pVÌ/ѧ[M ~_DL 0c r%xx/S-s1o\"yK[i%Lx\ 3\ıxBؾE"AbkC:ݬ0sE6!cfX:`ʧ0۫Sƌ ^ CQj 7y1c<"Xcc1w=(1D v?ݏ;t-zEIHg}y4zԍ>&Բ b+aƐ?it>͡-Hf)݌ - oA-k}f }J-> ˤM݄ $y匌Y]im \MsY1=hD 5~Y00000P= LU/CNH514$ N><). #Š$"՝mvED5IISqo٩hOEo|&;Y :Yt_1It\B$Un€-.ipu|NPPc> Bžr!UA]Q ,/iP0tS:-&(>#\ )~C荛h,"HozT:u>iw)Ѭwgbl3 줨_1$_?yGi7G61!2p!:U]\-=iVXO;Jth([T[Z]HmQ6n#S$$\KYK]BZ*fl"Y_i94SwP=T1Fɩ.ue TcK75Rw1;$1'y&#SکNnnЍM2(mCC>ڜ6oNdS 8[0O-c}l.•0>f" P">zG;6n`L$du_ vC fDZZܬp2[t ֗ݮ 'n.dPTIEv~w.>OLOv@},baCH4fC%IiT\qP\%v%ӟui}R.>0ci#ޗl$t|xߞ~|QnyЧ$I߅OݵL#Kg6a000000hW!VՆ_!40lTHHY͑A !ʻ82 Lԥe*0-d?1-$u0dܲaDO=k`!M jl{p"].x?Aí>8%Ux1| v~V4YONącp?/[:bHu+b0K#1T<1w$m1>'B]!a)ɋ+F Cf.N[qQ71n|wIeEpʵ0N8'Oߤ ܥu9/i} j)mMCj<3/ڍqJP?, ?>l{/Ĭ)ԗ;lpKq0)3#~ټ|<+{(T000000 6Ϡ#brUlT8ڰ( 87ۻ5$} |gݰF 4&xIKFFdaʐ"jԕj0VFsŨiD͎o$3w /%H~Y+ 3_:Qyh$7͵nc8y $1ӫ͹tRC8H0ʇNټ8nH~%ʓ֗gs }#_&!lpқ&M$WU000000P傤e?2ie/ֿ1ؼB̻`i04-$HbE;I-_J=]MW)?+W)IHW,q80f顫,$ZP)V}& *7ĒT=}_3_jR뎉$d'b*`BΌVȦ(6uy1~ fm #B*X{Tթ2 >yҡh兩r s C'vt`|ᔥW~|9VW'z'mVp'~θ-qaPXV^YaHU2"2Zxh7pnB|+M%_Z0b6푭11$r;G< \/k9i & X~斌m.hcV,>!A11H\z饷gIr2¥8!o地?]r:GL +-ORzLl`CcmI4ʐ*T1cdb}1`ːUn@yI'MQwzAl%_P.?ۯn!Øv&Չ`[q`1/}K֖l"HN v}L_qm\}ؚ)@|3ˌ>cQ|ewf SΐT nO!|'GMLKc01ې"_ʲ!82) 70vÿ&SK~~.s*j:͜9R} hl~BYJ}B{~u5ڳQ{c[t~E2uCZTXŋԉ1Y)x$(4T4?mG_8 Y2Ft2ꌠBrVwM\>W9JHua]HIM{I}X m6NXFRFnFJʇv¦|+]\.:d.B8SFT_Z+7<C j$u%wS<>Q41Hq2IŏE<^)\o]wO#Ip>C5>VL~I2Qnʪ/(#uL҇;[o7Ԋ׳7Q7pO/kYi?\/f9"V91ZT6y9[=ڮ‡.cs?~Dk"Vskq7mʧş+Q JFWF}@D/7L ,6$ B•F$@%yюKtNZqmRX~C=$b1$m,\SRacE\M6+҈16q 7ֈTmP338jXgn!,b9IL剷AHOb VDtDBı(T6&M0q̤3N&3]>9׹z{JKq8zz1عۿ_rfՊO<;tm~qjkhgop\3"FhSXޤ;$wlk?A`^ilztPz=<7ξ)qs7;zU_\po?}aHa(~kM#dGzgl7;9CE__z?S&Fk:C!=-:ʩa\+>#j7F<^ܬmxߛ1;!`gWg3n&3=n4p\Otg} ‹Q.tQ>ϋ* J_ϤW+ O|3KnOo*J[^xW#Aylq_zpa&9i7ѿE]zs;6~7~΂/??7u>-_`Z3?3oO$*WHx]J}Zpۢ* OgO6>6yDc5\6t z;~{S[״BitϿ!m<߾9;IO>紱iӟ,5vzooQ@JZ4ߣ =X&x+]i'!c9몵a6+ud"m$kfxgˣ:GzqZiz񿵍c?j|NOzy]hFou}Oט΁ }ny<'sˮ}C+_nR^kטuM}iTsJެ)ƪFƘ6iMڔInjC}sM?n>IwLW[ci:ozQxz\JicGvMisEsI=&zRnɚcI^c8]oU5#D{6]3=9z{9#v:IGFDNF/`0ʘtqU8W%|WW0n>B N}=#C=7kX_Ѧ{?ѫ\R>-شHwM&-0ӳn|l'6kSIcGixͻbL[t~~5h1:CL ;.twMjs4ool3"mVu|7Ϻ%c&A3atFQpG]^G [eSXmޑ9_-j|{nqVj~V_]FheZ|^K@[dO-r_ -ȵ0HmԤ~^eԜȦVCXkc 5Bk)?^_+uĸ5c'm,+{rV_=ִ0֛IrQ1|hw<ټNcڢW4v`o*osXZ%7tKk\c>zm[r\'3S^c3}?9x>{=m>ܧϓsO?-1N3Bwsvj5]2un9 Qsg]fuK3~1m3bR@Kocr:lV[GW5}cߞ[ !~]=?LÛ4A @Ђ~ޚ |u϶!; I@xу˱E~dw=J2e6}=^_npzɵGlq[ퟯ-NrNGZmv+]?- ,'WI[gӛx،YΓ r׳r>l#s5pwNuO-٣ne ŜjCfMHk,תnJoo-!~@Xԯ~_wd ΑR ?{эWF&jVh̻fs_)fvMk>+5[L*`zNȽ)U -???E{Dz@WYsޮ,/wfΖW,%ws=SN{[g}VwE gbsM~3gڊs-~|TjRm5MGcZzJ0_I @ӛ>fv @hc0k_S. sr,r{(vW:>Z&gh}MS4+K',:gs!UNZv?=@@ 였꠻0~NҖd!x=F\jn"־[zζEgyU7d4Nsnz%??@ @ F@wNo|9=g zS y΁΅V{+ɻu5ֺiĺ;FkܚX2:m:six'OO+{K=jmfm#m} >W`J@ J@Ios=4gY z蕇~x۔fFv_~k+fӳ!c(RPJ>46S1vV|UFM(([5=[řJKJ]8Kw}ݧ꫾_b @U p=^{x ZOڠ[_e~k^xA  b}}j}my~~oHוK$ϯZ}ie[5]krrKj_K7J:lʣugOlfBP-/shoӚJrDݟ__IOFF% @ 쁀?;csclUj*-kڜf1&.jvty-7_Cgu-oK_Vk&W7cYEmm9)soy[Ou@ @9 |'xozh3o0X}JTazO;M{]]C}D|BMW|=Ķ.;Ӆ`P @ ֤ZjzOYvG\ƶז굘]]٣m6Q*Š-s^{>wߗ-q@ @$駟~w^ϊf6bU%-S*1<-L;#ql%M69F빸|V[X}Q0iWɷߝ_p@ @V%6bG?{]Tnm"+Jzn궩`e2a3_iZ6գȦ{l2Jd1K=|c7R7>٬LcV2IϖyG__:% @ Lx>ѻ F6b>T[m*ʵ<7SD:l֭%)Z~"6d4܆M$|lVe}[_gzO>G}Mϗw}}݇M% @ K _Nkϥg¼/>&r풭fOGh|D[~ڽ]McXX4ֶRv}c3VJk~XS;>[Xo1% @EkJchiJ5[Nb8Zn[ѷj5z4F^7d>?50k>ӛJ4ަ8d1uj#Vv;rW+gj9U' IDATA @fV\ɟl_jMcnu+=Y}^Ә{^qۼ!s \[8\igUJսVF}Ƕ˧s6Y|̡󧏻Ӌ @i&3qfۦ7rY}Vj\\f9T^=g ZLW^..g\zl=.٢|ևbQ @ ^4|*ahmmn6_zխ:/6\Yrd)_;duz_-nټTqYuڲF6G-_ɟә-QC @@[hsV|}-n^[-JzPoOLIGHkG9mͶzQ[3.d#0-(!@ @k#`cb[s6ߞZ6;~9j>\[Gu1%[e?f> @@+Vd>79&׶xSōڢ}Ǫ].=!# \Z%z;S1S @ p)z6J5n}h>[iZ_|f[u>dh-$;dLjIY#mnY9՛JWXjuniJ:o9C> @Jaz;q.#g.ۥzi>g3/9ۨ/#grI^c:v2x?狶vIz_|>L;#oz @ bEHRݘޖl=>Ө>qrmK7dQkA]-[ޗl~>9mT_s#6iu-w @ ,k5V|=6Vŗ^5z+kW7rH>-6VZ?*׽TR=amXoK2jhC @87fziLW;}#gmߟVz[٬Vr}Z=v-쾽!# 񎊑z֊,~u;znEmISkzHq$- @ p}l(os[v8+em)s}ĵ4[m_ M/G-mο4\?vBK>oys6ӗr{N @ @`/z-]?kq|9[{]ʝq46֋*Ϲ!#Pzk|=z.n͏79-h-{ԏ)!@ lE`tҗG|Ůe>1olrJSlhpEwc.8Lge9mζE뭶:؎9\_O @.kocjms6>J1f1f+^%콺Zow] V\Ο,ʓq?g.{}@ @`k#揾<>_yo/}WǶ+ѣ7~gi)!@ AC)>c[yͷ}֧x{cL7[qv.o&056d4»zlQ۾}#6gZգ/jR9-@ @`M# {lQۥؔ|f5%mΟ{얯9k1\%|{ݐ}IǮQɱ6[ϵeǟ5z4ݢZ٣3NZy̌ @.Z\ir[ڽӵm=u~JZ>o{2}#m<(勾8kRg>: @ S`谥-s۾^E]6X;I]|已3nSn8PFQ[k}>gJ~9m?b~9?6@ @.[3\LkZ+Սmc0ے˓lX-n\kCF,K{ԎkZ[F;\bi{SS @ #٣-|}sz\xO\Le/2@i_Z^X9W|˵sC%{wně&WA @%0iJhm3jmz9=q^a.br)}Kܐxi״޷zSsfOGz^ݝX @ @+s[ڽ>R/rv M8۾#cli_m~GǪ^؞yhC @h]ƕt#|]{}^u=#_WؑVycӆXZG{lb>_yozi4%[.?sD[΂ @,[ڒ?gEM-̕b\odͻn  g]Ӕ|9{-j|ؽ4Q}3\l:8ϚoFcThC @%0(J=ږk7Ze_NV;9lL^{CFYX49_Ζ+F5q<%]^IsJ?q!@ »-sYum_TW?|noﭏ״5Gcfy)2Cm_}kk1iJߎ8Kb{ @ dQ[ӕ|9{-jj^zzTŴ|>ݫ3YsmhR{_}zoLԭMrY7@ @\F-m?b5>GWHsĸxc<ㆌ^Z={}85]9[̟Ȧ#=z>XYcVFV!@ E`EH٣-uU|Cۥ>Kv{2@ς)r[Kzz6%ی]1vqTKyC @ؚG_ҌأvI{Kۥz-_Ԟ!ɕ9{-jF5}%6q#VvGϝ?GwF-[ @*V_@'0#9kڒ/g8uo%>Qi_F9[u3c$ @؆#մ>b[ģͷ}}v$O blƕӌJ'o!,[מEےbK|xJ_Gs&  @ l^{bj/gEH{DՊ~cΜF>k\7soh EzɟbH{D;smt%[.\Ο#;@ @/yK[9(E{lh|26W&{<_MIy6d)!mZ[;V]Gzl\.6@ @kh-K}4%_>kqkq9rarCFz5ݨ/hbozEӔl3vc=Z?GLx @ f@K_shmь6WlƜ9M6׫+h  fm=qQSk|vRZ/Օm<=^빱z?u@ @&dҔ9-ŶGozKl1gN3bVG.ѳqCFZsFl%:x[?[[cmTiC @~K_|9--mV5%[O%MvMmn!.[?r-{ĘV'gNSk1#zK{@@ @m 垀鍯J{NmDvO΀Ќ4fik>)ʓkO2`k^sی&vn=\\V|ȍ` @ }MS쳶iuf43stfo[~˳yyU6d z&scJ}Oȍ[!@ ,]״3\̬'.jb[-s[I+Eq>;|-m_쳶4ݓјVe?@ @R6jc4~F {r뜶WbcY'j{w!Dk/G57bi-sz4R:r:z?[~L_*Sʏ @@䒰a%_ξ'FXs>Նh,[ښۥ9z4vōhKc2W+gj9A @8MfWN(g$GҜoW^k:[ٛ^Zo$GҴҴ=9{OrK @U "$GGҴ:-Mߓ_'=q?Z6CFzὤ4=|񢚍yr-s@ @`@s!=gsƭsJ!Ӵ/G#5&^m1ňb|4@ @*Xq0߫ѝRӟ]'#ZrI)CFcAϑ^mG˳7Wo>1[ @t-3s$GۣѴzt=\7}$Y Mx4Wߣь̯7]$zYdkO@ @8}I5ukWao^c%c6d4% ^tia h50c4nk]$X\\3W.?6@ @׍bg6hzh?w{6nmXkc6hܨX)~I+ʛ  @ K զ’qz;qr>l}x3whp{Z1%9fbgb>EyfI @ H`x o6LL!YfurbyI]k,K%×kC @-klFʶ.xZk9gScCF~,3?/5r|V*姄 @ pL-; w6lMkiy,Yʥ kOz,͵$~IgVU?G1 @ 6FƲVK,\{^kygYrZkiź$RǽdB @ccݬ^{k[cif.l5kZ#^rx1Rn @ "{Ƙ|ƵMbϋ-ƶVε9 @,ZN`;ʵVb>k-ʳ-Ʒf5sg| @>m=5ˮ-rZ5[M[qkږ}?!@ @`~۵sφU^˿r8νvSU>@ @W)7k|\o8^o)Zc*VykP @ G,Llʫn{ljc]+K6K\o=Kovz" @@jVGw'&l9OA>Ebu~Nq^ @Nw֛0:ckfqop*@cSTO?u@ @Xu_T}[ط\o{ETM|cȍ  @ B`SM l2[[y9\{\B @X&5v#9w>WDvHN>Ek;<RUR&C @%قӸscAcyjA|~p |2!x!@ @`5n r/rU|N?e_U+;6geܤ @ pm lI0Hvo~Q~yz~t7r\.aB @5l,$p c\2œsd^K ,gx6A@A@A@B@H!)XJ$A@A@A@ia!HB 0.A@A@A@A$Åx\g+A@A@A@z\A@A@v#V=/bZmNúӦN kp[    PAm~uz (|e2ۥR- uj흚džc)痺   @mbמRujNSr|0ۡ)ԉuwb^vibA@A@A@h utbNqy-5 ^rFOv_!  @j^rYmaV5kmv魅ݷk   ݈@`{׮ۥNM9,i`h:ZurZ>A@A@A@f*蹂g_B;uZdAAiZ۵ƠƤy.   S;h}fkqlyAA 7X_:ZuzY    a z=A R: -/C9Aᦣk JgPzxArn\RA@A@AhHo+(]AahN[+qV-::<.  :[tؗĚl}A[ZWA'u tr]w;1݂   䅪:zתVo@l֛^Wn[p ӪVƷ2$(=zޚ_A@A@ hnalEO+cy魎 RzixnelZk\PiUOgc[K/GA@A@A@j4m"hvVkubh2Ջuj-ifl3c̵2谏AuK]A@A@A$M'/͌1necPzl֛ZKFx㚽ZXK+:wLWzYzwz>uH   "Д$|q|zPOiffƘ26HFWdžYcq^s|hVGS&Zya3,o+ck;.'g    r׊^3L2m#coTތmvc:l}^G3u3c qAY#O%Z~O|;DI$zzz6bp8[*B)   s`#a#\.w4Nd2{@yk_{ Y#əlX93oTqf'> <^H웠Ы(ifXf1ʛqA[ѱ7"<1Q7pHH$5pD    Ba|⢋.Ue=e_oM>@a#Qy{ͭ4S=w#dB#,֘Vnt_Fzp:_Ժ`A@A@A@:7l\܍)]%3W4S5wp[Vcy1D)Jɉ?26A@A@A@@6*mUڬa=t?l=5Ӷ:-w\+s62~9ex#?򑏌=x<~"\A@A@A@XJb/Quzӷm!1Ä,N;ܺlliels̈́L+52֯9 Ô"$c^W~b~gDPA@A@A@ lfsyO* jd5я 5*kձN]%d*2_#cR 勞1Bq[A@A@A@v" Dxwr&C1;1qj7v#CzS}Hy%k>_BbmovF'OwqxdFyA@A@A@A`HRׯ\}S8zm]/m~NGd͘F5[{M~z.޸f;r~dxdL) S~A@A@A@nC,mZjz66)G?rFF_;BKy;.cRQ\~ p nJ4    t=iibizzvr~r~_9f9rMLGL~f]6|g6wH   Km[ڸ^ۻuQfO~ds.ٯ~ϻiGL~E?I|.EA@A@A@Xж[Y?m^cz]kzGZYn!dmwZ27r'֯_ {RA@A@A@+qib\m;/Vell[l͎qhie!;Ə\-F7gϞ^5"cA@A@A@nBرcܼyW&]RkGfZ ~ZcWz2z/uL#}l߾=2EK}2    $Ey/RKc[/%!=fJq^}sSv\tݻw˽Vb &ZPnd$HΆoV&|^T<̌2`A@A@A@^?Oni >m BW{>=O-CyCfEƏ|=~vͭ٦ N;L#rݍS$Z@ڵ+k僃?s؟d'p˞}iCO/=tX"  rBO? .?Nb6ʳxyGy3t2vޜl``zWXoFz)ңT8Q*Ba* e glV$Lu]IYx? b1=Б •(-x<^SV(A@A@A@B*/lw;6rkk\׏-R2zD;uh nKٶxxQ IQbO*˩LrȆh4R\ߟpzw}. 3Zuɜ   BU˘K[Kq^[T;uxsiKA4r1^%SM[iGxH)D&oxáPxa2s0G Oy6'0Q**S^<^E*)8ƨ^|QeA6_Z}s35=O~OO>Ns<>Tկto|C*wA@A@A9y)xw|Yӆeyt^[ë]_˟Z*?2FN2o#[K>/yvMa 񑘚:=^,EXI4QXTQ1CpPDPpH(J%8]ɚ 'u| @T'\SS̪p!.?@xHK*W)Y:GE#⑐gṹ^$ǝ ?0CnJ #]FFFNot:>qBA{A@A@A@pAf*h;O֚8'qZ'}KTXl&w46#;+sPt4 _pb]ϩ 6THuYF`MkOɺY˭}nnmx2̱n#cȚ1M9W5^{#:֒skwk㵸;۸R$7@tRِYT/,Աh(&!AE1PDB <@b)VBDJH *0^cV$ HYkR `Ա]8>~܆p2ZVC8Kn}0HTԻqu/}K+RwܲeKO~,?̮޻};Ns9'G=*r&|5׬B,_q' YA@A@A@XT&}=E"xP[?8ݵhGV-l´Ʒ|gc1*I5dʹ{Z}}}C+/b_pkc[[l=x[QYXs$}GW[[Atkl$R!WAO'=* 3&c/3=@b1/*w^U(/xA `gT0D92*4[v)]F ^3<>H~C^^Е<@*sιdٷo_d GycY' t&''#L˝Q?gᙙ3/#\.(e  DODla*8zd=,mR 8,0sZx8?yxߓ?z +_z9k~?2T3,-nS,>v6/zM\α  B7ZjwN7YgMOm$cxL$I 2+/p<AyE W 0%=U^/c^/xCxF$ tE,&K/grL"xUabR )wqGQ!"6m~,[Rs&s#I./ꪫVlذ!GO\}Ca#ip;9uYs=W_^;pӞJ]A@A@/X41EJɯ7# %T>Nͣ[am:YXOso̺N~mtcG^x" P3TѣcW6y-K֫Q^u^L ~K=Z^}:ۜ~e<ԗ@QK/xɨ^!xd7cG՞0Ox| (: dזu1R܌{* "J+SyfA> B!?%p'Kh|AN衳趖ÇG{=wmi/x16ӟTog1 jE&O†B#m  CU&cHt* 8>11Gr]l1.8[@ԡ 2?޺'sϡaRR,AR26Ktx5^k XTYţ}t񹜎`gGƩs-a clfժuqs1N#^~qBaR}KF|%6#@0dm@ӂbD2VQ߉ Gr~ H#d&08x4%5wbwxxxn60D CN=Ԭ!dSԙիWCӟ~i?*aXÛCBeM*s2y[   G3H R?z˖[gFT2 ,:zuCаgu8aꄾu v'ߺClA-FR7ť9ڜFه|q#dP}dk{7w\i]wu׎l&;:`# r r lF'|٧ML]0$kѣՔ,Y@9%!pR>j6p2A_XA*4 y0:Y@^U1L@<FwnWG6qXn!EH !/t .d=5[R_7Bx  Ecտh4  BU2[?z[fn۰(h quZ2[1mşah m&epYiq63}r:Ǻ/n7Bm`܊[{m~ǹ6 3=I[drJLr@&4VYݐR~!S *i^xt#i@)lu"/Ps Fy™IaON" ؒzVػw]fD iWH})Yp'2Y@JUvbg>NwYA@A@:f'?c7ObBx-5b'')wsfoqs_awN2fb 4<5ֿ,DȘ zq~ms\C o__y7U e…~/.,WE^) {1~#L4d7DW×'4}TMWjtJ>!". n/!)/ʽޛ@"W-L[=TDtll,FPC֯_ksA@A@A@hU2aJnfm5qxt):dIG?c$G-*ӹTG5k7&OK=qY'LRΫs9Ϲ63c7z~\dd<#/4RKO>~d29S9oK罽}HRs+*y3=UTȐOG$U4 )I%Zstf*N% \5ζZn+qu1mdk~Aq݄. >?mn2̘z:ꭡSPxdir*:IIeHY1OSryL^ )CʐѬMEQP2Fp26Tļ #!J9佽a:`8y@oQz!eQOyKs$zzg&ѣG=3l79hvkZn];,Q֭[sv׃ k )   g w?nJR>G?;:OŴwmߪjFAL5 1{ vǩ|X+׾3"\t6ѤmqY*:ilmfu5=I4hӓ0mͶqpIU wL)B28T&dKdoO4YW,+fvgnk ]t`t걔0^4L`J؏[h݀* `Y*vrx38K\ ؋0%$#C|L<$1;w`uWn۶-[!PNIyWZUvkRzֳw.eΥRe7lؐ#rh\p$i$iL.'   l#+w}gh8P0?khHaK0܆:rRn^4OAy! HT+`g8SCKフ"S')f-X$~0 2rp4ڏ9eoB[ ӓ&Ack h9C*poґ::P@,'\/yܦ'Lț"_F~ǎ IUwg.ɵQA@A@E$J=\_Y*f6M/ZekZgZoP%]"b!Z B_셻@L~ݦupjnoT>־S|A,nmdcj;9O&{R dʍeV)3Ȗ%!^މ 1/wR"C l/ eB%ȰChC8:KyIHcΞP%TLE z*  ݍL]h[KE,"f1tmC%zǠf3ucB ET +׽:uϭNlusr?ԑ#Gu"̪u + rD뇒"Ar[T0ѴQxG+6&A;G,qv*K7 Fd$c(>.Z(=IӳRA@A@A@j4C;+NKL#$T:.m+KRE;{o[? T`oUʑQu0Y0},;/= dc*\VjTo5s6mn9j7Kz~Z[/O+Fs;+J .x'$E?(?ނ |.G<n,Cgуq`!eHpN͝¹8&gPgUJD'=QO W7sqnm~usó] t݊WS֏S>]\Kd2d):R見`Qr:=Sأ 97_ }I3A;_ Պ/TlLRfAY)n̯t4H̠D!8PDYXGA@A@.E0 $7;2PA=8 YxW&GJzy'D=c _S7M߉1Pl}'RSprjVQP]xZ}S-רsNo_JBUr;VKg ӓHәXDFvd8R_S"@&!G-G-"cҙ *ߩT#9:SCjTB- IVRM8NKE)!) '&fM    mMĔ%4I64X-hi VunjAʗCx?ۭ>*tesGfft:ыfQBp}Z,3Q<7<:cM9ƴ7s RWC/%!Skĭx;eʙqNy繑L[ر'Ne<~|brpbP/ک+AdR]&*9K?$ʤM䍩C/D~:e*:*agĢ?(BO1aKأ n:@)Y~Ԉ   ݀+2q\*V4*Íh3e&L5S{w`:*[̩wP\#lJᑅV' H둦_0LGmvݩܮc:REpx8s9 WyA1)Cf>slUb l.z#L]x.37dzY2 ѯIxK^A~؏V[Q4PvJ'T~Z|WW   zж ~' :LԄ,iAۈ62J?=mȿX-toxDsgnc#Sd.-%+Le@yXP\]~=yn˚#1AȴzVs|α^}1-ӵ, }0X"ls\Νɷhq֨^[g)c{m]Pʛ>IP  %5>:ڢ2 c'9ݒH`? 9Cux1C(*<S)UukT| oΪwܭǏiTf`OA߯;E ɠbfl+G7}nmhfL=u0Sr;e>-ߖz$)bt.O~]4^ɧLƀ}:?$5yC/1WG-Ǘ (yzϪS"шJ_1pϹb=j=*Hz-h2iǗ:J Ćr_OvOu0*Ήj9e[ӫ-йQɃhxZ}^cLsls3G[֮2jqhaK3s#|+77iE+-?o JA蝕J*K_z*GKK /q7TQXkT5DuښT!G" B|I|fYj:6FfU2@2 +2fR   2B`sr4}+-e랠& lvjX;l3_2 %RTk%;Y_KΫm[%i?>=/zck}^V+б)>^t3ˬ\cyj0bC/\ўt\{OD/Wcz3P\N3K9\sj2 G2_Mlyڴj$}FNKã`K*I'M+KyHG? _~wmo{WGyғt &xϠӺ[ǛN׮]übN85}C|_^ʕ+_~ _Š/#vZ:1dv2ћt _n]СCQ`h~3y<묳CCC| \{f)#GD8㌳/~? 8,6ٝ1~*? FȄ!ex *2E~;sʶrީy,3c P#T5, "^ƎFŞ^I!ot<^$HHgWw=jx:=QVՉTȘKAJ]2K;(*jR2&z3L&v~h(-2NB|h\.Qt/~W[~_ `cwbzܚx1;F5X`8΃$;{My'/} , kЊ.>'0$kI/"U/aG1a,iGApzv|+_ѽe>Y:׿~–yԣ5O*xرw%Pqzm{M׬Y53bN=T8+Ên6MP}s-ܢW^Mَ5dv>=c{݈w<>`PCbv7?|l3LKFFFB8sA@A{d /|1 UM~Y2F yDgQ}xs0r7]̫7* [7wŪpUNr1l )S\LA՝+:wѶn!d[je2Zv_Z5s\j~>MU4Bii," ?;," Ʈs>N=&c2 Zr XK~)t! u\6 R('U`pr dEBBydk0u0@IDAT„&!lP~ӟdnsIr;w7m7ׯ_%RQ'?Y{z$qn7M6AƒŐnc@L?p/yƯktʉWlۖܐbUV^"KT`IFGf1X)̨aZ?9W11I· ,-Y NE!Ñ^2A=G~zsj~z`(]Etg8'[sBj/{v42ûnsρa,0ggyIW$\P mr1NԌ HCߡ-Yv]nmqsyOiIQ7ZmBƔ~w< \}ի鑀i/A9D 0&4ːk\s'>3No#&K d}PT6711+۷ vv7FYzϑfʐ1< Qf#T ֚#~Vh^Bw)r?^g&;S@DUsɀM>ZsLq=YzQ*/BnذA?ۿo  Kl XDa1x1d ?ZP[}Gg (5o/LJOzJFbR8t N:zU{EWƀ@$>5qm]0Bhu]5ruFo+u*l]ξeIB@Z:yZga&%!J @g/WBӶƇ#/WsrI u2`XG sӛ&炀  @_e?*~!M[Byp7ߑ 2_<¥望kt: W8*Qj8`k7OkfKu=>O9\߮۲vWݖgݖs;wqW͹Z}A2,ajcFiZ~!K!<$e@oQ2$c`s@Tӓ45^f11s9*"jd˪/tk&a "h]xr>? 2x|QFcgm5/A gϭec%v*"=AP31[8g]; w3ըq#@ՙO{ӎP#^ 0 AK]v"&v@dm22!g\x K^Ei~B菭Z'!L~k:*b\ r$~-pXaMB amrQ={@6!^@:"c߉8АyO@," !C2™0IdZ[R#V$taQf;#IL(jdiNysxuċ1$,r,s qnMbk˖-Yܿy]dB~fH{g;~r:T 6!N ¡??gFG&m󄸘Newtm/Ww[.hؙ{D}RA@A x-jUU+^ /cwnxGJ0'Uv,"Āk~Q(^W8_؎rpe*V#t*NB (\k+WQoiw^ۘ%ig/ɢ*֛ wֶ5Y(K2Ll0bIPК,6_Q@ aaJ_ xc„#u2ZfgѠYjz:ya0daNȭgAxT`&ra-qDxh/b4qPy(uzhe Bnܕ[mG^ykf^+鄼0}{x}~Xor@\S ]ɧ(J0Gvl-Cw k UAoxiC;`! N`|KB?y@yjVZx+>s4M{G!a[<[s7l{pLGmUc8lCnݞFu eژ#ʹU[3J'GA@A@<qdBX*DR?1/FG7#.ii{H/Z$TGãG#:az@ c8^,-A;۪~#!Ëd~`u3֭¤aӦC;!gQ<]UѻMmx]Q}+AU&^H){0G uIyY&]AaPЦ* p1{?p(ÄX0'8S 4B| $e!'n4^هmnI5qΚ%]ҹ/๐/1$5^״نD"B ]nxtzn%/aB׺I]tu;C{~~(B"^e {.ॗ^:#<- uN9]=u*1-[6d2 yXoq=qx29w1 gO}CHuۂ92zydeqs+3 #DOl\D~۸=4Z- 1H#dA(&(ToMH<6gqAdS$YDƒzƜ;ff{/ ~f~&5@۫cCbH8N&(ñm3m'ٲA@A@h 9T/b-!31xE72ݧ fdj$Vekl"iPLrG!g)#WG K=X1I&b&.31# Ory|pث>wj؜Z5UcD "Eh_ ?B]{ƔA,v>Zr|z euU<"qD~/٥ X3wYgQXCyA҃+Fa lqcb~97t' ]uUΗcAHC W:W_ w6vA x1mO ^5p9vNI۲eK]O9n@h2%9OYZ my0`R0SGOղ!Fح_k@`GU+DR,"?QzM;Ƥ|5kdHwQ!y1 V! H~ԟ2sz$ r ˯NF³zs: FcR!J1IP=J{?Hv\h34<>f>sdXG:֯GϘ{!p$dPrl}9q !yһH!.esH]A@ m;RB Ȫ8(8fg_ZU_>:4ީoLV{X,ϝS!czR2(2t}m+ \kʸhH-k׽tiJYjB 5St^S_`gywk6R^F,yOUl!9fd͇GKƢ&^CDL;}$i1& ][A'0P<^9$"ΦU>nxc[N=ɗ=`v-AwCР{rk2:i,~_0qF8s^~ᥳ`͕2ACIx51b9c5_$>}l3aeq |إBSV0t9i6b h0x=ͭKx)uL96H!U $&n:׿0dzi2|I2UsgI'ΰ5!-PS$d/nZGϦ-dA<賟ۼaDgaj_CBMvCUrk]oJIK㆐a9{u-Twmb_:6&vs;  t'2ot^1n*/L";S̄¹WF ʼnB솹|߃ŞH:+EOR+"*? #p܆D$W -1k z3F1dL9TF.-_j_nWkrrڸkwys]s8_N5Cw~!c4BcЌ9gt.n-0cHZE-"/@5ғ&dNm !!s~cr߰.tznh>JoVSW\q6&aZE$G>2ĤP U#U=K}3LXn z[UVMJ!;ށ7*/B$\yG@}{s:t];%p8יw{ϼiU" Z{ŏ.[g &/"x;w6qsk%/BD&vNd ` iS+Җ  t'bN 828'oH%l1(džV*$h)r`Gs0#Ք +akk2& Sr#c\l@akukknY"!f3Ůxhx`:];^)dJ4qB"/ַ-9T9_ ] }$"s0K9^ ‹"RQe3T aN1LQ^(Gw^ϫrfx>-?4jxr UP pzd B &a-CƀE(K' 0ܫ8B z!70B_$)$CpfKgoӞơ <ȁaEzdx_@L3 ]?=D|fȷP 7͋?+U}ӛ4 4)o>YGϣ<ǯ^D) ({ݔ` hVV ;]P BkK:3/`t}Am޺Ϳy[,B(<# zA ho4_zdv3D`QC/~0Fi ?!!V zpxϤiVȁ1Ϗ""[nE{`_ 8C*GOqz/x@iv\[Q$~ixQ  ,/h,h&FJ9+ X ?g#ADtz$V0.;.U=h4L\9iTS[kzq;ǻC<ږY)^uomY^FA7~Xg:/~^577O&{s 3Nj&^1wjM5:DhM[ N`€0bʼn9JАОN!! چl`$P͇MGSPUMusz]yCw9{sqdC,I~r|>KvRO5A|t >96WÖ[A^M)sTC7$aMz:֪t򂎑khFt>t_gUhMWG:m?Ϟ*4ƻ۰TГru]kۻN6 ^O<~gzmS}-!Ⱥa3 g< ȡ<$?4SI.W+[6:X_-O ó&Z {P>D^_ MOf-/YIIme?l:dy>E?)} [:4FkF^trR3j:yɁQϧߓ'zꩿZyFۇi6=RZ/UW5 yU6]Lե׸etlz ޡ&ʓ00WݯKO&ޮO|gV^߷^mڤIrGӽ|Bɐ>6 @C@v`Fg!iI !7)>=&wKӡL QɤOC9p9?=s&]Td/ӿː~>;3{1췀Ӌ0mT~60OӧƤvzȼ5mK҆3`4GO?[yޘ)~S:Ϧw@:'mx||_c'oa/ {O l~E'oy[҇yz60׾<1"?_{rtt|:py~k:y5UgzWs?yK:y.}6_ך'?BsWe=xIO˼_|s@,=񂼝NkH>9y۷1=9剓O}SתO>YP58ROޞ&}{qm~P}O=tj{ٿqo|QlzͿAbҷRn=>*`M/<Փy\C p\3Xy%="I33W#z~IRԳNq'w+:݂Yg鵼\۾1}pC髍0?} @ @tK^L_KQi+w%moWbrrSZ6Oy =4Ɂf?Q @ я~GwcJ=b/3ڣȌހVmI'W>_I'NS @ @@׽;}kYjͳ5V~ W(,m_};+ԧ$ @ @`sǕnX/z sS -1̇>kwP @ #q{`H9f|t:-dWւJ]@ @do+{4]!1K{BڡCIk;Bؑ$?G@ @ؓOwi!m}}+S>G[mkGeנ>mK1;k?!&冼* /~?ɋem @ p^a,NKn +@fĠw=C @ @G" OaO?BiħE-Ŭ.Ⴖ+Ƽo=v-FcvIۗۗj/+ @ ߦca>ڊDm">iħS-Ŭ.J>9]<}o?җ8W @ "ٓTwg+imG,Ƽo=v-FcVr)ӇMoz_w2S\ @ 5 }?~_ےy:>2-}7b~^N۶^-K2=ӷ;J(&+;aw_>]|\ @ A̋?'O<|ͯӏC}+>Gii']sw-~]}w@FຬܫzVc״ֲR1yZG<}]y{|.@ @(~o}[c|)iPFZpA73շ#={ůz JfQF.o=vMqmej6E>Ә=9}?x[#~~k_3kK//zx`b'm|t7b~\vMgߵuU햭e⑿q۷CZ_Ύ%ԓCt mdD+}QZƗj Z@ @B`tFn4}kXdOaI#>k\ֈEX_ζsi/Z/|-6o9w/N7$7G%2rd3bkY;I]>"n]+\D k! @ '%(iYi}"F$<}5kw5/@Fn?Ѕb5z5u~[Ru~'~| k[ @QȾt}xgR"JkG)(ŢZ䉋tܜޜ>E>{Ojq-"Mck[ @^dRۿk9M+Z(tRL5KHK?YrfEW{؜[Y]K?Ҩ^մTO @ @`+Wiٯ4Q6grJ^r^l@m4}!ZwHd9Jq]hG} @&}Ln?ꊿWok\k[ v ׋#wOoRiu|mmt%ԘoEZ @z {ҸZit|k5϶6O^}o]Feqj^ڇ6-"l#_4V]k}N/^_ZN%*iΊQ @#в)iXk|tŭu"]yw  7ƾ`rv4j|OkDkmZ_-5lNK?|KW1!@ FeRD{ה6b+МVnOkHklx{ xޚ5}-2F䳵jqc-H>_[zIj\Z@ @{y4}=}}׭k5jq_W5qmq tq>[ʎh>[;g[VcQ?G>R'l@ @3D{ƎgR<#z.m,gzҷZi-Z?wx|45?ێm[39җ֏'Q5G @JuCӵ#]SN6ĎmsFYuFƞ2S&:Y֞PTf|#u-|?EH'>~!IDATD?'Gjr3i!@ lJuR>X}k/Չ|(75M<7ڹVDշ:k[tqIĽFbb6.vurJ @ "л?Q}4Ƣ}l4^XE>[KQ"ͭEk5ֶu.ֶoYEo=vM[}uc#v)GbrqI_QC @.@ żY[ժ϶QWck|7Z^OܛH'Byfo/6ڒcb۾kkJZƣ%@ @htmn~x.g/1(G96>bZs4~QLqr&8 ͰL4FzVkm[ZF|rIm_0\<ҕ꩞ @t_bx5ƣKZ:x>ښ֯lՎH&9[eI{JoyMocvZmVZ&\vmg[4g @ p-&-!뵵N./϶6_gmZv)gVlL[4nԉƳ>kgZj{hG}vRѸ9 @$mssѸѥq\ߎ#qY͍Ӣ?2 +[cVّoih媍yV]&+5V˵:kX?6 @ lk9xkyf=Vdz9>&ZV㶍m|o{0Ŷ9-zhksv6WGQNWKL.'GB @<=6->)mŎfjZ%_oցmK\}?j6c_)Ǥ/?K9cYkd|r @ %0s3_UbBl^kcvts5Fzk{[4Q^72ﵥ~kf3jx^^7җgwίZWzZ@ @[hltxzV;RO[vncϨ4M?ڥZ|8yߩ@ƴX][M @l[rK(6y֖kk+h8c?ʁmĽ\إإ5X2;{ʿ{jD!@ '{Pb5ombk۳cirjK<~c/imRk,Zb=6Ї @ xKnIZ|^ӷ#ڹXG56m} #m{^~T,XˮM}G @z65m.[|^cNbض4o{b^_Òae]DQϳ}kyؖv@ @zknIy:ouml]nt~nQ=L>IlK(_XrR~-QǗӊ_/m~@ @[(m|7/hoigh  @ p{t(rV>۷RƬlZߏUz55dd-&kG:}kGnViGxb\[GZ=B @؛@潦/s}KܞW6ڢ\^MyzN2-->间kKc k|.hܶgm}jZ]\U{ȂJ\鼯/KјirץR;SG  @l#ioI;TG>[5Q^k/[;,.-^חh{G5s56϶o@ z33^IYjRn)ִqt9֮u # j(tX?yߒ^9~>Šט|v$נ@ @`M#&E>Yw%\{/jV>TE$U@F&GQhzj^$_.?:{>> @ #٘Hx}OG+4׆_㻶7@F`FQהQR_._rhg{yQ-| @f4X{k&E[@Fnk\ @ K!{P=H}/ߣƊir\nίuj^[ #37ӭjRG\Χ%ު5Ʊ!@ lMuͫ%#l5m|f׵@F`6#(5~4ZNo<Ǘӊ_.?w-~<[zO @\L7L/s?yK H=!ȧvv9nT漦+ţX[ZfF˯Z-c @ B`5z|_x~Kq#JRL[Yu±t #msmh|GknDy9__I\hNHWW @ @8z7-&<厍hrw_Zg!@yGsmDy9_ɿ$&m5{i~>q@ @5K7=%H,y kHiQWnC.^M[bג7K#[jtz-j-gu @.@tP{EQ_K,0l#mK,74׶=!#fo{մx.㏴Mԗ\ѼΑZ\:YurC @oVujR<kZhkdVƻ-s>ϭEעW\67R-iR;WI  @F ZJXNo4OmO-58VHz-ڒ&/H}V.w_ʑ\ϑhϾ̪sU  @@ƿ-JS-s]ߊj*a{O8-dd=mIEȗo˗u-5l=kԶzl@ @G%n&ےWӔX?Oе'UQiۢjP{dTtXzQ_n)GbzE՘o{>gC @lң|բ-irlpki8{سnі4>rk^+~w-RֳvKmdž @ pt!B˜[jR<G'|enhF3@Fֲ/ir6֜ӗrj1U}V\^e# @ p&P0ע-iFbNK%Qm՗b=nq #ـhk\|MOm_}qؚno @N ܥ\~-p]/淴n6dd-&s=mn+W]:S]OF͞B @ޚ5x.ߣWP|jrZƥհ]dd}MyF9FI$V˕^uh.-%@ @`oK65])>{zGr$7u[5K6wؾi2t 0;ΖxFtz֥v#  @}Z6TzkkR</l[rj%\n_ZH@J15߶ZV%}@ @@ n|OnM$eiX_QTܖVmm\խddе7#[sZt%hP/j[ƴwh @ $0{[E_,rs~aFLij~7Qoiѕ4[j5 @ O` q{s[3u3kWak]\Z{ 2%V^Qmyͬ2@ @G'0s?R'UNu\[g5wcݫ9%cƽz/y_k׮_8 @ ؏kշZ.7Lj Gr{rN\4Ƿ3j!@ F͛=9G{9.@F4_Wqln^fn, @L`Cњy=ܯG~MT6ɩNSt#9G{Ľ=-Z@ @9 :-cM/z.F]s}BF&t9[[/q4/jg֊ @ ptm+pFk歭eyݎnGfÚ1yze5'Kru]n4>@ @@`C%uGs{zz?G4_5lQ{#O䎴!1%5FrGrfq{Ex$ @'н:317Hά6ol^謹,3;j ήgkcC @WՖ=%22\!:=4'ddGϚ:y3Zu>- @ F`haFyh]ڥ=s>Kk-_kΪck=Ƭ͉8 @ f(e֘K,ɕ.ͷfֲuG,yBF&{y-4 34b]w^fr!@ >ag{F5[3kٺ363j`f;J@ @s3ͬ5jjxBFr 8zfm;6 @ X/ ;z:jC373k gyή=^cA  @M'f׳zvyބϮR)͹U{%N6v. @H`f}5k/@N묷,,/qþ/v΋<@ @56ߵkb&m5żCXm51 @ @`H>{kf{Zukn5ƱcL;>6 @  Lj̭ƹA_DR[aѼA @)ol=@RLYeko׮_$6)׳ @fXe>cbwk1=ƜTj5lbz{c#&K}7qMK@ lK` ˸6k{k0tV]VY+(97Y֛])p 뻄9t{( @ @69XHdoc.K" @6诰K{M׹{ϱ{n,M_M_߬u @ '}\7}}.{&lٿkߒ3cA @@.)mmG886ӅPC @b ڕÑ49vNH@ @}.GqNG{hw@ @ؗ!EPP?ܪwygv @ @`2C&L^60ǵ_LI)@ @F8"]^E܇K\_/5! @'pr?i\=+d@ @-'pQ0^ݤ{!@ @"p0WKxn!M]w @ BF؛u[.n:ņ @ \*wom>k @ ×,ש:z @ nKJU/ @ @2d 94@ @LM L `_]b @pXr  @ @ $LEIENDB`Temporary-SimpleInfo-Light-2.png000066400000000000000000001160041476226662700337720ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/assets/system-notificationPNG  IHDRdn8sRGBDeXIfMM*idv}@IDATx}$Guv潽s%DV ȀD16#c 0 cHBA"EN'.ͻ3̛ݽꮷҫWLt}U(! B@! B@4\S{Sg>B^ ! B@! !PHL O'`?@! B@!p2" g?uق/! B@! @mLjrSin2N'㘚mҡ0B@! 'tdh2M'X&wFLOCcB@! B@L&1`Ldd^)h B@! B@IAHL'&&OsHշB@! B@E`BCizn}"I0:3jC#'֍=e=fdCԸT&B@! 8Qh=fWD2FM7Ru 5kLJc"WZ! B@! *#А.f٬~nވ z#tBFw3i7!B@! B@D sB f}Ĝ^]ř;{B*aFyOcX?cU! B@! D xcjMuQ[&YOW/P7r(p&,J ! B@! &#MS\o^f#u1Yfcr3ϠZw*̾*CuB@! B@& ʺH~?3gV JczcH~?J ! B@! @:2tٰg=Ƭ&Y(_:Z_M2v ! B@!pr"P;cزOe5B"{|YLБQ:1tf睥(fB@! B`#P$̲teLJ:}[,t@\۬ǕɢYr! B@! Ɋ@]*e{O51J5z zgBXOWWynY1Z:Fb"B@! B@EIXUMe=,ի._ow[ozO<>ԫ1JZz"6& ! B@! @ 从γ=އ/K]޴g\O۴'Z]VWOidgF5B@! ''UBoZi)>k=8y3Ѯm'nXѓm6v5~>_B@! B@!pTǥїm66zښYuMKIxviOR,R4miʼnhm0}޸f7 ! B@! jE DNi'i{Y#Z%L[ Ð]QrzڎvQzB@! B`j!P<գڒ)VV$2~Zmv֞q:|}i5#:M'.1Qk$$_:p0v˖-]qD\յ}aKK˴BГH(! B@! I##=އ𶷽mӎ;,`LrfWCUZmgQo1$! J&|cHӾ6I16lhꪫ_b% ` ! B@! I14?ݶm_WܵqF.i"q0وȌO*k.i IHmHg:!O8 3/}K͝;UbB@! B@,C}կ~7oaL'!Cnߗke'dCV':ҴMRYZL.]r-\IoR`B@! B@!@2]tE߹s'-fp4pb'Mk^O[QO$ VykE\OߵEYeLp?aں& pC! B@! @-> 73W\p?+ $ (E*4}B&"fЕwm*ׅtxo,Oz]VB@! B@f p/,_R_܍iNJ.d-gTq=m}=i҉nImQêmR$rK@{%2&RB@! B@Lr9+!6M:M2$|=gӰ4$ \=}ҖIȅeEn??utt>I兀B@! B@L$.'OП :esc&ILiC=md&dIeȅeLd̛_ğB@! B@4l63sϽhɒ%?(2\U%Ls^+$2O*W?zۆueOJTZ&L5(niA/Zƈk!B@! B@!Hr\96mLb;1/Da~t-Ԣ7N6QCRZZ%&WOk~FH^! B@! D!ۼy?-9V.ȔR]tsJ7tH;jVg9ɘwSSVB@! B@L68*qc776jL9e\kHVqUKB)oDyt]9TVO1o<iX! B@! &=rnr̹n\6OVoz)$$ J.'d"d]j2酺m-gy2D! B@! !-w ڜZ='E.<2O&B&%2\5J[/5L+! B@! pn9ni7X_)Tg$2UτMB&)>PI$$úz|[u.[M@B@! B@!0Us]{KχçVqsl_O|iۄuԝOrIdHI$$SKnٲ ,zQ[! B@!  {~jժUWcLm.ҎBiL&8\mTB!Q㉮6vWk׮mʉ>q/B@! B K+9Nr8w]R=TlcF4d*.$mɤgtnꪫxV̸U,B@! B`J"24團sp/S.j>I~֯5$DLb61UW_]bųcƭIСC:;S{׮]Q7/w-s=\é B@! h XtI#΁+͑'oMRJŎ)r—mb+|%L_EZzzzh!0x:8?C- A.W(o ,B@! B ksS͉T|R9Fay\juPIq~ۺuM$1 dP]\s\Oz-i:W!@{Wa$c'}|4$ez{{[fΜ9Y`9͙3ʁ2Gimkke&HQa|w?Ccas###/˳ ݘ_b;! B@! @Lԧ>u ^*o^΅9?x̜yjuq̟J:cL"dHLj2qq[T]2vڙIO& |@KaӮHKK+gR!ur(Y9U׎*ˋ5ɍw|o @ %;o%=X 5YQ5%ܞu6ƍq)gϞ[vr饗㐾MY;v_M׾ xc\}X?p'K C6p;o188~FL! B@! ̥>!C=6 yX.}j̪~ۗ77XVnlmZ:Bwp.H#."rHZP4H|s9--A$;8J+Ar ShP oqD $f@;爻(  ?< >8<#3W- $zhsv͘1c˕hs5̄]SO4$5m־xa[JBāA`|1vUbzֳ=Bl-U+:gwHЅ-vgGcKK;I . _$cHȀ!2E2t:)0.t l' ͓Z2`4CCA?uh<}~e> 9r7g2l=cݺuCgq~iÖnC_~b֤M^!6IᄏkҥëW^Z<)O=9F~+fP& ! B@!09zed6Yzs_΅9i ON}VՈ7FtN!SjL(qQVb,eY0-߾u #6iA W:p`qymȷZa%Lm[HzLD&him҅+AӪ3\ꡆa.h7 fC.x`.>Ц׭l p2$a>bRYY]8̡ʣ3J6\Gɼ-+7< #cH z[ awtKhB ,#f\8Z&>TCW]>..fxQ; GP:_r$Zo:PF8PдXpv=%0rW y8ZI,M'd(Kx8"?42\j]hBkGnf-]t1;-]&_ :S,W#h |Ƙ<]4qh+6,Т˔ϥv{[]si B#68VeJa 3/#ө/1ac,#8N7FűڸYQKW,B@! @u<7/~b0os.L嬌2a 9͜}Y{/pY8Oɤeǵ(BejWMR}\]Tyڲo.Gn (i ftuIP?.Kz↖1;rbHƐ?,4t sQ$N'P\ B[*UZHpn.ŋ(SI/!.2Fs=]$5w: ^ăKRYO}jr91$;:I\pAy)V8$fV71$M%#B@! @QbZA2>%ǾK[L٨t Vs7OG٦I gz>QS,g])VVow!x2ĢBTyڲƑmFM@pX<&Ҋ-v*x]x5iX=(gR,q~r%$cP ϦEIνAޠk h\;ʓ:HPH?u\낤 ˷o^^_DBesϟ?0a}\ åR`K(kV8\N._.P`XIwDY%K\sU^! B@ "y>üYP>ar +ՓA_٬K O#\GR')I0j7ɭ0jIe<* !y\ϸȋ2$a&BGJX+G*/S" C?2!śT ̺.w]A_o_0m`Ύ`)_|pDl/⸋ZtՔmoM,qbc_gъo|8RIB-o6bZJ&K]tk;u>]d ! B@!0 Q\F2:;"(`1֖Kś7ob+Vsesl͗$2q#j'j+δф O4PIOpId2#,y$s{bpq|I} ᷟ- !D бo˗{"-ciz; N} Bpm? `/vڠ Dhskf8 @JZIr÷h. b;%I ~食O}SsM'M1Nˤ7dXFՍQڵk# Gt&L S%LV,B@! @g}4̽{WbGO% 1ӦMsL_wuD%ee[1a%|=N8v柠GeQFXY%Ju>IȾMDvQȓ2DKR%Sm\iT[_l{\ 72 XNJ\ĥJ"e8iZ)o zq&ڱ\:β1mb,nZX`%PvFu*,rО/h# خI-\vtg Fz˘ZqsĆRaq+k'k֬ jRg0!AM5޴eIڅec7ӎ^^n$9|ˀ)Y¸M\%Nn}_\4T蔗.9߇8 V/[Mё`ҥK"ap(1D1.BÅK#O}1>TKgʚˀX Kv@Kduܠ2غz/}a2)%/yۗ5r607 ݁WZ5c'p8*B@! B |4bCvvuFy$zHL.c"@އyĘ9[:c7tTS4LT2O0ÄLfGIB5,Jp]1Y|k7;x#3bj`1ㆌ9NJAJVrq a]RUtEs$-$eжwD n&#;20P$dF]ܖo k{FZG m*4OAk.CqCy,ime]~!N-~d {nX ! B@!P?$7xpgևzh YnO[bkcr,7ůs,YgV2 iZmhۗޕm]:n,LkK?{u1VZ! B@!0tПcDZcǺ9^#;' qVn1r([s<386iNjXa2;Q?.G`YTe2qV?qtT.+]瓌+S_>,۾. >b0*dVJv@H.KVϘ Hĸ4iV4H ó?; ,K`-.v\k4[3o wL FP61=t]}3O;eѝB@! B`J"`,dOwNnI >ڰi+VgKs󾕌Oib_F}֗՛^C옱EaYF#^4TWBMrImXD2%DWXZ[%p.#me Z`] G.a LJFIdL./1IƔO 2Η Ht;3=}Ap "¥A`zA M0^ВOBhۆ B@! CGs!z؂!ž,uF.VFYK!2_whTByagZokp+Og'4PòI]X>79~e%nV g$w\r"!/wGjC*yqVAn]@ƥ"FZ)[n޴ ݕdn!='C++1XkjcIB@! B@L!HrAҌ$Ir:&*iei#mGlC-qhϗIJČ0flև+nq}Dd9?.N/qmؿ_$O%3eY2Ҥu cJ| tH^m dFFF2$c\uCB㤿^7ssq#B@! ̚5oǎs: ˄W:2s\%)p7~$Ǻl8n_)_mJ:S5K9JQeaJ}$J}fXW\m'Ox-i) `0?@ QaY| P8"(C4VN!Dp)2(3+Ga\t:l1#,gI{ֶR_'S 5caX`QRai0(HvN_fL?|qA1"ʣ. @z1IցtGdMhR)O+.<ܶ܈i7!}zM(Q)oӺvڳlł%kN=ԳgWի׬Ys^u ^,G)nR7yiv, Ue8.:_L*gwssS:},qKى=qgoiguu֝?̷+?Ɨt\?~c *zP\:— 1_>Ӷ޾m .љzOO۽{wǷ9XO{ӎ}ߝ^j.Yug>GypO|bK#K?Ϧ/_}. ,Ѵ]ڷnڵo߾KlA7ӱܭuUW]ٳRo_ H{-F6(96gt7͙ȷu1ߑo޼ys7'MI ٽO~۶msnmo|ZA?P]1/^<]61`Ǟ7\~e?OgD2B@! "-|VҬrֆeLۘL9&+c 9q N&.RoT'߬~6*m P-_U,{溎knڷ`02C..Kᩰ")fA C(,-wy4>pCg_i!3: 1RO1_Gѳ׮@ 07;NJ@>Y[ $P֬YsV[Kr l6k)+baZB >.d?`k|aƍ : _۸s2Maݽ}m>m\r\^\wwwoú>٭}[޲oҴȇ>e׽u @E '_|N_sjc cXOK@9_wk/J]JŸ&@l=|Awѣm;wl!3r3|wdLa Hq}>~>١x6 do%aBK?s0"P~U3FǕឺ֓}u[ʅBB ƥ^ }ne"6qHqXvm)G/uFO?tc-j[CYqWlU:ܽ7\U>JGS\T+e2|%Y.mRiuƶ{ ̻C3ra6 J >ކV2`q)"2 ?v&S&eH ZNE.nэ_m=ڣ ?_^Q0o9g 3$/<1<ףM6̙S^wD7n\_җ͆5a.9sf,Δ!Ӻm9{;nx><̺'qj5ܹsA,?㽘XMG3VZ5W%KF=QLXV?,?~$I>M;<(jgt8 vP$ 0np??KviϑHgv*<\p?s16O~ȼXrG7q x ;X/FO 6` =f=ofT9ܕ@IDAT>{!e(xkc=æM:q-O\%zzzF^Kr䕕ӷ3y\Ǭ^\HƀEzNH;xK@n̂u 2u,g_6}vͲĪ#@BFYqD:sb:ٌX\s#6ᲀ_#:85$OqQ.ðH~:,B@7߈Rsx9;Ϥt6 |ń`mpْX䌀15:{1=6Ø>;z!uS>LB@Б&d<}u~qycғ2dEyA2.<bKi%g(.'4"%t6e›/Q8wWkp6YY#8MRQ5ÿMU߸ztƊ}"8I ZqC|g/}b2L-Ĥi/?0-LƆY? 蛡s~?v&`ɟj[Y<, }2`%Cx[> cF xh9:`:7a,& H# L9mIvvr%^$_@u[y+g>me(@aSUDiu罧zmKY, Xj'Awwu/e.nMڇe[Ft?-bxh/ec; sKLKR__/MG2 {@/ |;i:~r 3wk?ҡ2! 89'fMv˄n;^oO*?Y`s5X":.&2#ZL>-e3@_qcxH56;?T*C: >+B:$ 1uq$򾌥}}V֐8Z:}A;t$J!t)1l}]̷jd g@i+J6X0&!cycOX^Ay/m brwd o"< )CfB=R3:?narS=m|x ,a~i2`w"딒olܠlIkǎsoyva׈8e)p |_l$A0!Du9S$Yu / oЗ~+V lgdJ$1@,X EE}XNU> ؉i/'^1rǘӶevя~t2}pNHL[fm'X [WڹmJKEvsjwX^4:,QwN{@>ް%op*$^0 % 뮕3/᷇%j.l% U?p7׆{}:$7}N3ew1vN5$%KQI`5.o~`ms۩~Or6\~t(B@_,c,]rg KQ<n iFYbU+4=X·' ,L |o[}c̦0ߺa!/]$@&tj (m,m[ cSl{172޻wo+_>0>Z/`z ]L$ D 'q$WB@|9s"f4^3Hf,8loMP Eo{^-NV1΍Qzg&JϤ+ ̄5|WmqJ9B[H; ,%K\4 ?dDMy;2Hur6^,JX%+fE&fL<::W-6.]CA;DZoi-o %vYmBH$Jf?1t9^x!L&@,,YINӏiȖVXKu|1U'u_gh"ҩ<6_f2D i=dA,`T&cNێojN9,ꫝlI|piQ00^Ix(x+[q%i2qY 0ܶmh!!| 7X<׾v ގ~ _x0Lj˶ۂxIpI#;k-۝7U XB? v:-YRlK wCF17|s9[U.\^x>2qU.';39wCC;$Yt6e du#tHưO;9&qX6찈k< '||{QqI>8~ZQ:}Q ++.!?1Q͐1 Q,7b0<}¸B#`Ipʰ r`}Gi=%2 ex(hCq`8f c(Tb7(Jp8/|p}p@r‰G<)O9 +zֳ3[sF} D#Ɩҧ0ݴD\*/ {A>Y$7"|ظk:U_h%i+,L?mz ! ɉ@8\e4 3 OS&o:i-}O]CRc3Cۇ똯VfBM&d;M`ӗDU-|E_Pw5=o[իW Xý2 co~B@!pr#`%|9~/`nfg?[MۡށgiU `;vO=1o>bG񙓺O0w!H$%tPI573$c*ǎu(f6x?}(B۟ z8ӎx!Yl>gPܥOgK˕JqQq\Jo`H\#| n%Ag$eFDf֏10LXbŊ8}(jt!4.r9}nƍW e2+N.DV,IXKUgV0~QXѪƯĩcep#U.r鐓>U,߬p}LJ?POێzyNV(&k`;lmCI9V>c a~ӦM]V̘ΈqDo9yt\q "] #X˶@ 3?R#4~vWwt>Gr$slm7(Au _<#dߋrXUBKL2B@!p"1 @%sa- R_0͘t[=2QXhR*l 2lcܳuei_&.8,˛_z!Y_O\:_6M}TTer!ZryB 0>bbj_X0IH9 w Dɰ8]J> Mb! DZ I$=,繜2X^0[f~K`iR2 Xv/F7eL9@;77?~:Bm⢬$0D2)M Z}X_& [2$ /T~!"ڊ2jqyp%%&+}3C!QoԟbAC`Ү̍u[,F3.bpcgOO4Sj_<a);r`3vb]Z!sˇ~$/'Rn6%9b%vPA+w-N}`0u#x| ==i)C#}ىK)!Cc!sVz= qu'w+^}Z +% } dvU=}*j! `n"{n2(dY0<Xھ Yx AXa~Y!#Y;J9#c2&WB,?!|+V_ilUXg80T]HMƁ i~ʫUU;2^V\}HA'V;-$;:ؙat&@9Z0v;/_iQ<1TC}s[nYNM?Fŗ )jPܶ7MA'p{D>ȷ0Q7$]@]Sԣ_|g?ǰQ })вҜpxIͶ-^ӹK\e^s'Fm{O< ܎9!;\aak.Qq.)ҶÛO}SevzZ l,f8iq'Xßr-8]C=4g>h=Oʪ d؈.ޗ2 K5 =?pGvZ^]nh^/![~J_Yvy/ I&zqK)R\7zkNp(` sCM{衇z9R1Iێ:@,5 ~ XF4`>ÙrL!me>V4ܵL(Qk6iX &l +f2BD<@vq{Y1"կ~{>wo,gkޏ!}y/آ%/Y]X|`,Vy 隨k%Jț T^ي] t|Mxȫ !igy5o ^Q؝TzqIxq[j-Kd V/E9S_)U ˍq p#\LRgƒ>&qGPёcHv Q9 XxJj]`z̩G˓$ hwG6m7 H`tP:7pˍN'R9He|?X]x~|;b}.|v\t䘻*a#HanȑD3mǶ'XAt`;O|QXA.!^I3 ,X=/rٞ$$̖i{;,^zu?=Lt#;B|WBn-:,gZni,4^h}1{ Xe>ge?Of:ZAݸýu`}_,Zayw]#1@gϼX3/ g`ZA! @ay%bŜ:2ĉ#^8W2+DLIWY?A7s_ ?aNB&îX .)"uޘ-o l^~ٜa~8vw۹r;hR_||Dȥ31ICyxY?%c?yX9|0%|=6F0Ϸa$t| #vvK1#wX:a {n]Oa^_xᅧ8[%s1cuZ ĜJs`G4K{h`q .%Aő4/AM=y.y5 3}_8Kv`ysB++W͸)Af2y4 Ǒq&o1)Ybv]}so0I^k|;sl EYσikX! @J I v^AarlSj[f1<ܷ<ɗӞHɬqV Fpp>ˆDopDn h[΂ lR2Щj ɺFj䝁-xEEVYqKȋ xXg8N B`c@XմpUWmN od4Mie% 6lp˟`oQ[jjok|HGiN%K_\>Em'F~w)|X]M+\癇́L̝ yA9!GXNK}s |3bߖK/ǛǸCAnMێ:ObǁN}54E,XǭlW>|r>N Ka@|Ƀ8Yӿ>nm_I7vc B+|q1gm{[XKzݧL<~ B{O)sk^󚽴tE D*^[$@L| gWuľ7H~XЬB˼̶qJˑr̗ed ! 0HpNd'iiX)Cy>03o:UV/U/4/ˡJyl:M%8Lqzj!8PMZ=.{3bI-=gS~'W.Ǻ$):=MdL4p{EYUR 87(:E%GZz7,{|S}2PN$TQin=g>:(LldoSNDb& SUK,XO|bwߧ1=CΑ+,sn۶m͓# ^!;$;aN1 jv:.1vn-32=is܃Ij>VZqb}gr0!/zыKS;mȴ^KXg]Ç,q94fӎݫ";/83BؙnȴY|d6ZčvlS݇ițt\L/\DVS㵖κp h=|ȬCu8]ЖRkao-\0XtxwƮr!  T F#f(ip!qSw1833~}/"͹oIOg> TVrQFg\;৭,I\]\}\_6ծR'mx[x{~y_}~oJ$xYdLZvtKqݧ*<{S$ #|5NQ49U}Jd]`KKA<'@Po`y.qLϘ$23f]{hd`R}pK緿L)ŷĜGԃNa`|Kt`R|L"V鯁K0]ez!K`H+KMkk캟b߉y;)k6zrdzhՇ>{b1r\ ~]~QX8O`iƽ#i1$ٵ;<G.Er,+ e0fn'SO=>6\rS@tbAw\ G}dlqHp'sr83aY5kp;兀B@"b#_(2nc [4cu^QIX^ @)\Nbiii6IaX,)+7j&] h;R!Ӕs;Oq]gC FaV/l/uvߙQ\r7\{M#?^&Zp;̞3r%8|hoT7#B#0,͘Qnir+]1a̲گ¤+8;`ӁF `LHc]wLLnf2c"qu~p9 ҿ_>Dpzt~wb$@EGVqn馛fC}{ݛ(.\%\r$LPki0m;Hoj%hAm2\XmP+c9(bA[(-׋{,et^Zۣze! D#_2C~J2ߦڅQM6/vtκ]7UNW\}TyOjV,_8h.ǙaL}~D;}'f! XwNC! L}z_64L/].Z؋YLW+듦rQZdYn?+KvQCƾ/t\}TyOjWKYq8iN^B@LNDLEB@!p2 G$=f0޸Ͱu ]5!a1E-mq2MtX.*_KY,-heIb׮-IZGe))B@L?;Q,3EVʄB@ҹRJʹt$iTä?]ˠ*V~󖶸6V=ؽ\؁B@! B@8?|) eVr%#_,i[jeI}p:eCҲ8Y'J_vˍ4˲N<[lFʥO! B@! D"Q"c\)-Q)4c._x2LvIe+ɱn$C=i柖 ! B@! h2r[sj$##ܾYmv';!Ӱobm_w}_j~B@! B@!t8\:F2ԬQFZx8+>?\KB@! B@!0ܖsҸܜ7αSt5%8v㢑Ad߉6(s4Qj גekIGV*ºp]ַ6şF2! B@! }Ƽ/⮻Z0&)t8Eei6IQ2,`by?TE F.X%TRZ}ZQqHK/KվVB@! B@f PMR_$c2)bp\k]_&n$%2 vJu\TZ,EҠ2/"<\VKޗ%%[kY%:F@֮]q5\EbB@! B@,sG/~?[܌f3>`pa,Uo4KaNוu9ʰ'l"S$_o7KDjD-a $k uVU?z>iMwVun>~(?{/dDmQ//GF;y5e1̟??'??|Ѿ@ @%oO/ FZV\6vƢV8&Cًt򢋄wKgkDY<ҽ62ޑ~ϫqmem4ӘyӾ?կ~/g?_?//?7|1@ @%_Έ ߿w7߾;^؋}"Mgϩ#h==G-_ =[#|܎m_֡cm#oKzr"rI#ΡZxsT|꧅ @ p9T+-OV#z~לHkZ~ګr?iN~mtiLX+F @ @lz.9dkjDzeuEZ6v!s՗#wEWԲu*}_[em-?|+{C @%7F,yZ^"oc^Fum#)|oiS70K!HZEVuzcLS]ZOz<Gq @q*瑖'U4WDH]yOnb&GYW4j}as*ȓi#sy1v @.#P9<yOklcͼo6W}+֐+/d,] GkxeQHzq땾۾UƑG5_[t}$֊O=j.- @ D:z,.62^_ۏ{(inoܫы~vƅ|hݚ݂_c8Gb_DC @٣usjl4[[~W5{FǣkXC|T2OW4hX[?_O׸~i!@ ܕ@@z4dc+]7333~!eؗeJ֌|6.[GZ|#~{d4d@ @]zu?z͎mLT'Ң9(7lM/⅌}y'GZTl_=+}4fIĽGbG1~uZ|b @v=?_c9Gc6zȯlҏ"xFHxm$%,^սodl#7W5:ʱ~+Gby)QCuZ@ @BwЊg1bW;^lūZֻُ2l x\hՌUNxosm_rXv:ދx4y @ ܍_׊gH>cW^njv(gWkU7}W_4g :YL}zM'ھ,m*#\}>/d_c\}Ӈ @ pCz/b{8WZoT{$n{(2@^Ѽǎmac#;x^v&>jx|c@ @w P9&^3ڗ9<-=ʏVcW\&[(6<;}&TպWW=O4}>TڪownT  @'rP|Y~,zm׵~Ec۪%BFU9ToV @Zw7GzEy|܎m_aǣ}Z#}x52z,2P_Ѽ51X֯|^42}>ꋲWrzh @_cf&]Cy|fzzqi;Rb><ۗ7oJe}?guѯ YG>ƭ_{;sTƑ'ftKV;ӪG  @n3JN#Vƭ٘?:q_DyV/[|!#^F=Ƣ}Z/k~r{z6Z=S @'pazd7Bjcq+u{^3_keQ2AbU=yme|UnׯGXi-ƴmǷ39c@ @G9WrZ(iHx4׾^F}?"2U}v YxvY獌G~?\ƫPIsC @3y;m#?d _K}KWх8ָ[jY<ԏnjh6/@ @`'|%b>Z;5iQShG^>U5n"6?D'%54lc @ @Y^Y|D^c7+z߾fɴ,7ӵN/>S20]QlVyOk܊Ky|<{GU_ī[8}@ @gУuUr{,鳚cٛ{(if{^r!#ZXSѼ7GshWtyzg/|F>1 @ p.,oųXj>ou\@Ҽ|#M3z3k2kţXE|^JWjFL[9ߏU9@ @X=W[,6G^R3z/~ȣZۊi~U'N2!=葷x|G{xLk齘ğ * @ =W-OY=O}̧zߋkWP%@jq@ @=w&j @@tZ{"VZ:Vb<<[U/}YlD^YjYDzDz>g:Y}t@ @əW|xJGFu!#F=o+F5?XU<fkjҘ|ky @ \A`Ҡ2{͏66˩כم}W@ @ zo3r" UouT[؈GW\&GoϓŏGjx{Z˵ck~Ӈ @ pw lUO?.#[񪞭on 2♞͛Goj=qmo>G/ @ qij}+ߠimbӸ{I !yxDh%˕>>4jWr[uA @!3,gD;ɑ,OV=+~; ѺYW='ۗg#jά@ @G֬{V<] lټ^KW^ȆGU׊֔3srzJ\m{w!#}؞_ͩZݱzЪ_G9R @ vGU=Jv4 @ Q݃hA㟭]9ӣ+syĻc+Vߙa\OňWslokч @ V/FފL|=j+Zc-WL|Ł|eΑܪxb @"P:h.fHN[ȶ*ZKQVk߶+/dd+ܪxFW_Q捬诬yԀ @^UyGs췰Zh%Wk>Ål~>[_Q]o˶Ve>< @N`HN{Ouu~v%9?z\ܣ###5_lڣ'@ @`yU'\xd]>wu\{2+_how5C @ʇ#9wG֢9ڮjSt!@G/Y[+<67Q3  @ q 0[s4o?u߉f39݅ V0?s7G<>?2>su @ LTչFFk\W}F!# zfk/<;kE @ |6CZyGuhSټݰvchި_YIJGՍB @ TX;;79a1 Yܝ;ֲRc&w&gٹgg7N @ xÇl_`pc3y39d%wg uzrX^ݽ]kY3;Vrmw׳C @;~%2]J֐vW[s?_"vߵ:y j}Z@ @F`^l @ v{=;߬#jjvBF6 ָzvdm;}@ @#|oLzj[;;k u^sA  @8a\w}dm;j:ww[?rG>n]=] }@ @w$尾?l (mkOtx`?z^_l{gE @ mD'vag8cg!Κ @ pޯHwyG|gQukbN;?}@ @hzoO}9Ϛml_#kod:{gmkօ@ @Ul?O9{ g7r>]IlS=\1od/x!@  pȡ}b΍J3g̱xT}\=dU{=2! @8asat`, YY>y<@ @G8&y#8N+y!W߮u @ 'p\?^}z~潟ə @ @M N^;\ a Dph!@ @\v m{ ]NwZ˞W \p  @ F þ;︦}`t7z @ \K "~+Fw>ymݷ|v @ .6rd gX_#Ԅ @ 0N۸]ƭ>ӡzo6¤ @ Rn}Rۛyg\sBGw#D @PxSg?>i$C @>9.4^i/ч @ @^¼o?xKWݗ}w!@ @K\ؗY..>>@ @xV/w_g{ @ KKT#@ @N%DD%`sA @ X\XIK̤ IpA @Sekaȅ2xB @4.Wѭ'r*-F@ @,ygA @ @9 \slIENDB`Temporary-SimpleInfo-Light-3.png000066400000000000000000001150661476226662700340020ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/assets/system-notificationPNG  IHDRdn8sRGBDeXIfMM*idv}@IDATx}$GuvOڼ{9,  " F&l1 `%,A`HBNjj{{fgzfwメzի{榾~) ! B@! B@tDG{Sg3L!~B@! !PnZP;{0@#B@! B@.2 ^gxJB@! B@.Dt?D RXJB@! B@!p" &Ľ0$1] ! B@! 54dL{&B@! B@! g$Isg<[B@! B@قiOҜD:8B@! B@tӎ9i.|՗B@! B@iAuc.=B@! B@ن%g"1<ع6v4^! B@!0مC7gG0\ZΥ٧7uB$! B@! H!pߡ9qz.q.>u.5Y! B@9A Ag5yQ>6۟Ca7'B@! &MҳٸpcҠCa U ! B@! 0f%0h6-gXf3#\fXB@! sYE@"f.a?0 0 B@! 8,yFqi`&}&qWB@! B@!0%&W36$fatxtL<3S! B@ى-;>??32ߙXDD~;q=9މ{>B@! QEA֐c1γ Np xZ! B@!0k(!$ saMN4:8d_llOT<%/B@! t,~Zlϴ6YБyujީ~:r22B@! B@Ă@Gȃ#-1P"mO'#- >xu-B@! h7m]0LTSTm\XSttw fƥ2! B@! @:_(BeZKo(Z;Տ LB@! B@G-]zS4nSձ vl :1NiwK\! B@! D vB8:O'1cw T\ƚb͎U!B@! hX-%y7ajYlĽX[_@kαKwɭݱ(/B@! Ķ`orr]z9vnƚbk 8u՜y gܺWNUoB@! B@ĶT}ŭϝB;ueq-*(ڷkq[I;u(/B@! !bFq[vZq[c\ Jv/Nqi6(cB@! g&-/c-ĩ/N]v贺8<8q [\:yǩ+G}*/B@! H08KW\z\ڡJűCG+j7[tt Z\! B@!p""hq-:ܩ1&W_\*Aj@s\j=ۙn'&-B@! TZZ$OUѫVu޽qroz\.p[mOZiJ[:gFcRB@! B ^|y\}z]m6xZY<ҶىkxZlf۹ġgk,B@! 8hz86vvJ[깩ynmk,im3m[ikuB@! B@S4?|Z}ʹmt+ml6X]7ۮkXZL۰mR8sm[ V[ʅB@! QhjGؾEyIL;VƩjy>.mG: #Ot ݤTIA9! B@! B o{mOOϚL&4LD"AFI! B@! pF,`8Z*l6kbbbmH/}Kٳǒh>~EQZ[b7 `ۨ] %m]s Էk(FLzIp7%1nꅀB@! B`!,״Wu[cVQ=(F5Uo-mk15iTϸ1n~MRB@! B d>OEGgb0eApYJk.@׺ JZ7QIZ: a6ڂROYz5Ova4'ջ|-[  a'/9! B@! ǏFGGg*RS$cK/i6mgu_߿qdHȸA~6"TSg(rqon?a\vIFKF2Yǣ?Bd PB@! B@1={dN<)2&ČX3b,ŵ-׸.ZvfFaeQv֥BȄ!~¶ #WOu:R.{ժU/VB@! B@!Z:#}ĉTB^OČCbLk]5ފw=W[خ02auzmu ie &\=(u ڱc3,YVQ[! B@! \.8x` DB ]K.-vuuu RwС׭[Eԑǒ:;z aZmo;F2so4vדRGԦMR c莨^! B@! #@k11ZKbiԦ~׼hÿ^_իFn_-_wvOjtM#f.-&<ƸU,B@! ! BhH-*L:W2WY\k̡4և2Ԩ_|XY1F:j+pk֬yTqx!~wnepB@! yhĖGGVp \D-èև9ǡ#L?Qdj)Պٚ4|=묾Բe˒R2JsÇfķ~{ݻ Vk 7nm޼9|ͽw;񑑑mW}{lwww]iT B@! Ns4</Xx^\.`zxg?YC%a`V?я ɲbŊJS|2L/ӌQiʳWl1g:! B@!p#0>>ui>3=bM̱^ zeNqr.6 zcnvoW ddkG9u ՝lmw5\) X+Dtj>Gfb[n[lٲ߅nF31.)B@! $ sB-9k_&8ʩї9LFL m9BbiN!,,P2FJ!Hda1 ZMXn22$^a ^|˥|DG</\(y97ŵV:B[O~ 9R?OhaK_z׾6sv.兀B@!  ~b})'\Z JY]adlϝ&dFFLԺZAncvbqەU*0t23i/N{)ĨM&% pJ%^ R YS!^H` _=e/eԓ,))d ] p)r#'^/R +%؇#qF4nHMy,el#! B@! C;,)u;k_R-օioe^_V&s ނ"jXTX}?H c/Iu'^1t"&T&ЗJgDWKwu{nNHL$W*s.Fr!RJE V/)|6^ \*2HZ$Nzޡ8vx61zn܆pV2+󒋗zi8ʾ{q[:!@IL~G?'{ ejYʟLVz2ʃxkaA1,A*$b|{zz{t*`!`NdAg2$_~j`!@SB+` )HmӀ{A܎FG/w%n'y V1qU ^?)}pZ낮co>ptk׮ }$/ns]EXӒ:GM1/wZcǎIAGFFR N  SkB2JB@! BLDѕ:@ṮkZcM **%rZm&k'QdmHc`6zUW2(E_#zʛ- .Ncsn"7 `#c`(0\!%7u ˗]|136 !5lT,9SZɀ~H]bf-'$-c ^$g'vz|< I":͝U,l޼4n!H<Nהɒqa372CjZb֪@B@! B@Wz2w忦|+eڳ)HdFʺjDj<9TlYvAh dɑ=ɘ[`rl}tȗ=(st=@ȁ`<`łChƌ@$NDҀյ 8V/1NJJ'4 Q3]q{>߹sĚ5}E]4#֘5twb`XL!u8l`ݾyKB@! Bp_N+eڳ|NDKm+?X$ <;|0V)N.{/0a>*/HQuM2R2~[Gȕ;?A X"BIx$UFYIH9T/ ~pN06 ԗ'pbX0vL%Q\> (P+L^ 3aS*lДtyy ~%Kz{sl8~Y8|&̦MrرAĄV2ghKԱ)w' ! B@! @`߾}w]+~ް/|!Lo~Cy[Tld}]O|b9bW{{޳ǒ2\;%oԮe(~ĒF9jBemFFƶ'[ζsKO`_&d; ($LA”4W3mR?4d惜(zXL22TLJ2HZ̘s5&HВ2Lc"@2bl^WRqo"> Bޡ U K&Np2 crT_$}&[_4һk׮~;3GEiTd}5s%ٰaC2zdy^^ATB@! h#`no>=s}S>tA_2ȡ5Ho&!>g>ʹM3kaqAk-lY+}M2\JAm,L;-!vL+[({鴗_7Iw2`!YS};Su[kXdigIHXA<>OWك섛 #N[@ ef:_dݴq\@]xqq…x-Tf4q%smu^j[*kTUʇ> = ?5w康g^+hͤNRSzg'a[I%K0;1!B;NJfokș:pdhR&QrP hvY.L҆8A$hdWNK#c "JI! B@"WxiZdǠ>.{Mg?هs4_lYoow:g Ʊq(Y>whƝ\hQnN*ӟY@pLjy)u`UPdne7vjee\z``p&nZ`$X0 H[̓c q]J N^8Y'Kve4rҺ+<,Vzl5McZ͸-Kʐpa':# ~ 9Cڏ'.S&gT_.B@! s[n;0`#2o1!|UpZH'{k#2&Y.3=5H\02ڧVnzuJE2t'jeek7Ou| &71wxio5~2yacaXGb0"#xo1_rcxjmP3ã _x #1J9L LL51gIҰ) IR5ƊFy! B@! @+,X9Z=z4ݗ،[M׬<*zj!oU.lZzV> A+it펭mk{<$@d]! dܑ@I#B7%#%Xd'V{نm_yKT% Θ^MA*5OuTB2ALL亡f,HʄB@! ">Q:{Ϟ=u5\svcK4ר__WJ*eoկ~e^b#M@VvZyPuݶ6oc˛9ǩ+R3I( Jal;ֹyW-yώO q-'6V ;bZ8"Tu 7>q.$mJ$olzi/sKX˸/b_Y 2c(i /9|+,^͚_! B@! E)惮)FmlyαBs$nɹmZfS͝%9R͓PAid /e`'/FrC^dT4 fQ5 -fp:zw{ wyte쀱a~+.'xa ֆ~R!H qJ増A"x¹9.B@! D.\̎sΙOz[P?_CJnW[نe,~ q2O/T/r~}ZQj5 *וwyʸ׵Y(C-I P  $` e} 1)nI$eS:8n^w޿3۱5n& ,W. ^r]Λ۝^!c! 0"RHVuOA~u]F%36;"Mg5ꠙ6t6)B|'LE˺u|[d\r}˽`GNm=O$"aJioGzG&A|/JdL(lܘLIB$I0b]_xteIl!C2= u׽{̠'X X` }ʨOx dNNvB@! B@뮻znƺs ETCe[lz+_/ݥ//~PcY x{'ֱ]kn{ogg9nBTjz:7ߩ짻kL1Zr zQ촔ZLƍF;/\+X@s~Q_Sg,CfZL/iȻߣyy+ 66nQ܆;w/bO de #/3KwU>%i)h9d33qB@! h7 y4j`kH$p h{?Jx 6'Iȴ;.k4#Gnk?\zu\l dSP_u\|>cOx>IRNK֒ |1eCz1ޖc˽\ ɓ!y'ޝok6u]ɉyƢdqCb#!QCř!K[i҉#^}ev<{KK.-M tI3wQ䬳XiU ! piwίP($_ׯWm]ٓ~ӛ޴o%_>'yY|mժ jTVIpV7j[ޭoe^EPq> ;h%ΤU*O>2C+|?;v$hcXw!F;ۼlΤe ɗIwNi,nD+Cxޑ]oa/O^jrKɼe'd2c 1@gͩs=||k^/|"fG_;={F@o~s&MN/_Gx?ez׻:ӗi"X[+?c{nf{ 02Ơlݺ +Wۗ*e.,L~~pzC:mկ~lw"~WPG~: nݺu ͚L! {ڵ+ַu 6L`% Kz`]b޸~-cCX~ғԱJq)>6JָmhTƖҖ:ZmoUUf8Nzԫ56M|#SX,1(XO5cTJ>wr!O1чCO؊mpv+i 3SӤ{TaX5oj,aH{=[lv^1R >f0es>-n1·./=&|ɶmۺ`Q䊯|+h*>:`G!X7@f^z0-a?uw? ;N5;v c̝,g : ĉ?RC2fhp'nm=K;(x>mH78`bwyCOB .<} d~?qEFn}<'r ׿5_r´? M"_r]/H5@3pI0樯{oBbH+g,wGe^G\"hU·\@Ed`>#myXt/Mi[>p*UСCHlg?YU$ڰKX{1cs98dܘ"ѭ[o5%Ǭ{.Xh- 63wFΪ~u}j׃[l'ɶAdo…2~du-B5o Y  o{vYKމ[)X}s7~<ٚn_WU4 ėM4q`vMW?UW.:|BZ宬_]O֭k6_ful7>6֕ft2 촴KtE* !S‚gR$8ϕNz{̐1 Z XK~)LDdL:Y2J4H4\TE./..9x#nQȐa/5Y7QHC8ty ۷o70 Z|n;zhoGK0h^c.Aƒɒl<ȑ+l_#i[eaV#XxlH}bˬL3 ?ێu>Xn]`VC y_}3a ߞ%`M5r>O,|_u,f1 vo۬'xn]@ m %AVU`2g="\{D!@ݗ|[s'e]6~v+"A\ 'A.])Oy'< ܱᳺqR+VL!J[ M|XiҵB@!0l U=_Ηv gvE2'{oIyp%:@9GX=AcxA|~Y2ûk'?KTZ7qu!g g5+Jڱ*6Y>qsYKVyU mafZɭk%_K[A\t^y`dH/D]$FHbL,nȖW@zBX!RD_"dLdK2i%3 )S qs#|{k bg{+oL=y 80',kZxL^3Qijt}|a.4j@IDAT Sch +CcaaZQ0x[|i5擣A8.E ~իW6vU!Z ! k1ŵmė&۸/fkq^.K*IX/ËGG'VoسKưwj{sre뚿욣V.ݜ$!c~춈X:Zg V 9C@b&GB{Vt bcrŦ*7Z2V.EXj|JZSwV*{C%/ݕ V]4 Bp4;j,dZ7n\x x;J(E hv]@p}2V2Zbfƶ X$ƚ7faas- V{m &6"ƴ/8WW{?\<ܲvi/I *ǣ.xˎNX̃Kb, ߈ 9G$2?!c-jdDϽvw TO?,GKc%y1i4К w  '$:nV4QcXF9[, O o3 s=\O',5godtB@!  .ַ5hiR]O~׾;CﻻaҾPAL ^- >܎U7t}8~.XgMeKxkmtm~_%m9OLc7p3?h 咔m3+n ߖQ$Z! ox՟y`|-)Hh!v?8+жoѸ$R߽ Jxc ,}>~w>[ f2 5ֳ=1wU @f~`:uv#Ӎ.xz_lRMXlWh7YZȩERV/ "Tj[X2 ZeJG5.s؃F[šȂ2V.0H:!!c$v4݆AaG8WyԧGp隄7<2 ;%„|"9/Tl]=-N[Fb F?G lImB@!0gXu7_X:;.,$/Ҿ2ZDnހX4xebjr|&HϬ+ L h|cx7IbnKD)wz^rdw"5\sފ~#^՗/.)xI-0w!^H !2sL2 bbha$A#y Ky8!d~ cf3p2 UBCX(<,)BlHx5õü B ׺` *u'~ V qӈb9eBn 82ܪ k`ygmH0#큵btxK~fwép;6HKP!d ޘd8LJ]U< ^M?񝶂&-ñZ Gp3,dɶ5(?Kx/) yO.]Y@_e+A?Ukh,?IX4cHpdcڇRy|@dۭE'i[1ڞRU2ݝ,B@awdw[ǎJM[E9dݴ[vG=XG'-QSGlƪf|| ~]K6j>H#-e\L`!|G&3ϻqSl--{=Ka, .{Cv]ݰjt FksQ91' ɺH`/aY;ez1 L CT=ta;Bt*q ⼬1Moapa4{Vp0q3f<* w3^,sEbn`~aI0e7VBLpm9jaʹbH>׎wF>l58;POc<5i|:bbb~>y' ]j!  #\}%5܉.dn-en%&i5 \|5v:P$bLq  cܖsx~ $hɄ2!]V+ǭiIeKi-b1mh,{ӛd,ά, 1b!X:ws_A:2XT<.ae ;a-apw|=V |\G񈠷B;`!p )80. uhfi%ȴg渋0)J~,gg}tB=}?B?mzV:m&ȧu vDӄ._1[-؞8\y7oٺAW]CVg #?s7xmV?l[4/cx!BRde|! _xa` 7< {pZWHTjgIY/lU!C)14(0˔Ke,Tvx#Q $h6+7h0&.dYK&,:k 5i Oxǀ "&/>$W-{ {W"<-Wjk` cׯGn!݀xTr5H%r^:f4hcXEwZXT?$^g^W[}h ?c| GhA7%Zpgǹ$[@`r4]߈ uPFuSP?n ӕig$GE$<s\G( 1m Hyí*Lrk!W6d{5|'Rc>RB@! f!\ en>]y7m2SL` M=n7r-/ O~B!3^K5+F#9Qe|(2 $`p01d 0)rN@%rk&bUpb\!Yh9~T ?ܮ v*g /؉Emlnf| Ђ+j5XLMX˖ 9P,9Pٚ[!^F Qz~3KbAaЊ.x.Sn۶m= V5q@~ׯ_Ulx7 v EBn/#rXn<°NmZk{=(.Qrʰ $H`ן)wbw{;:4-w,.AiyrgC iG' @(Z4 |[ꙸ<+5GXޔgmWjȹPEu\>D kUp|7]`U&|gtKylSug.p$d,sj战8zUsO2 kʸ ! B`"pjxjp,KSrOIƟfUUfu4rr6y[?7 *m@|nTpÁqר 2OC3413s' p3BT,xxeblԛ"!M4MH^  a*Lv)ǰ>,ێ+ p9}x+L1΍wQƮ5bkCSB}w~!ܵA۞gƜAG=Q'[0-5EM#/@1Ғ%d7A$CBK.9mw7wx>X45[W/Oשg>r= h1-~v}sl&S]=x'w' `TVn+Xq$XH3 x‚mAM[л:U[oxVp"d@ewdwVϨ^ʣ#PqC|{VK_ X%@ؚf|^UWre@|f@-c\ۿcvYEȐilܼ%m@ ! B`#5 *sѨwHԺy6y[ yɥ 7luJCQNh3L…4:!^@T 1`祈/ER [ϞN(71%E/7 Li27c/Ejmrf#}?\ӪDKu BK ~2(mZ,=t0`^%`őѳ9v2tOd ob{7'⊓q{&Zbb`ajȨE893̸6~w4%k|F݆ y_=bu$vo"戳utPDKg7٦wKaAcEFקA$HfEo|4|I}[Z@ݼXW-.lK5&b`t \}[Xض1(1b>W0Qb 9e7l܋ݬۓB̞%هgk~>pm,UubN% 'aaeHvA}c'@m,bO.vq|Wlذ&iok! gf=7JCGI\F)AC6b#O@\=n޶[ )Qp?ϸX>bx%)ü,F. [rݎ}}8 Íe ,5=CvcǏw?ރ`ۍ!3 ]xp19-4>V^ct9v mL zeVnKeS1Vcb݅Y촲*Q',BLR,{ݕL Q< \l# ZlX(Zʀ:b>]3f\_vY/g-uBU"1eVX"6^ܟ>.-v:1ܧwzyu}gmškO#CaQU ᵛ@2|\9Eslx%H°CsAtOյrW]u}xZZQk-'is;ڨA:1wz@.q P2$c{Ok΃݀XฅaB@9p9;98pbeؕm{oߨ,rKO>c!CZIVt7?؎aA1B²+Nds\?&Zː!2fd⅖/%/o.{zzCC 2xE!52M79ӍT7# kFw.Kl]r֐ᕇ%^_K W_}.,d1Rw7a,C̓U.CH~a'$C&Dl?9y Wae2+sveDz2Ж RF{PzXΘg !G`92딅txc>N8Vc<$,zQ{HB.gp ; +$=xPW`q쵯}m=2<[++ude\`ec=pץ ،VM&H$d29~n vS8fd湓caBY9na=Y_Xuc!.]$92ɸZ%oLʹ#s /e޼,z5" {O#k3yv7ȁ͕}S37$s\u% (CW,`7úw|+{DP>X-bZMq R n:z&E;/E (P([v ecp؇B" pn1%-X k{Aڲ!̽XO+ Zc =|#6^#pqZA׿!d*;N1:2w ;+) F$Xh"A`Q3bŐE ?lSʺ@wѮ޾<݌`bX L7l Z J2,b wh6=C 0a.W 2fQ a7wH"Y2]@}:3 x@ 9*NcÆ /x jr̕ Lqee`ar[4 .l'=܏vY YquA iC f.T\U ,lB8y"aI0UO,2k+=d>wRb=&^rص"GIu,H^C$d(#hEoy[VjA61wbl;3Nb>ø_@lL@Y煮m(Ou{冪"d8Zy! g |iŗg|ge/9 gJ|#b8Jw:g9u˙}8yk^cUiD0$k@-:ʙjY-Y_q>$-ܾ@8 >n$`yQ}@\m!0a|%F:tV]$ʴZۻǢk! |6Uj?ĚG /T-!dwDfUT/^7jVzoB} ђilj-OkrB@dD! hƭLsEmE Kzzfx9 2|9j3ټ=7*srAQjɲ&w>,ٴ "4ve\nת*SqR֏I69uB@! B@%',3 Y3|8Ӭ: `%C=s3eny\uZ,ɝ- s6oK+g2vFہB@! B@! Zcp1jݏuõ/ݕ\_;lm߆-0 4s´1fZm'Q$y! B@! c16R]Ņ%Qa+mR=aʹ3d| 4jW>Q޽v{m>-sr1;QB@! B@u;Zl]ѕ4`SQc lRlB w%K3y{nTޕnc [VK( ʛvgL'>[~*B@! B@p0Ko4 $E,+F]R!chYӉ{҉|dl0 fo@vaeɱl<{`yK! B@!p&"@Zs} \r[׾a\O}Ym\mvBmobmmvmKB@! BC2˗// I;)EC;bH,I\rQf@ hcf{iXԨmrYkW6J>H6j݋= s ѓB@! B@Bqe?Mj[/͟??nJB}͚5SzunK3Q ˅a꧷8URn%*Nu9sdB>?я>;! B@! fXhQA~ɒ%Rwww/g N 1!6ĈX5kc:׶2xsr(j뜬r{nzm\QAձGb֭O[r峛UmB@! B@${n_h 2V9[C렺Fen}ؼ_.u lr`^unLOrސ,'wxxOjnB@! B@!p!lm|8aFvYasRM̮KOzғ>wYhB@! B@!p!5,ײsmkƜqXs6IJzm\QA1L &^^q7*B@! B@!)-<>LG-b|lSWPEQdr* ! B@! M2d? R"veuZ痏rF+ZGK.nxЃRB@! B@@1c'~W2g2Ln]0uAnY3y0A2,^zu\Pl{jTVm:|kW6J>H^YutW2I})}cz! B@! ݔkc {Qݲf6adXfv\vY BMedM_D7wl{Z! B@! ukSQ+\r=7eQQ]( ze[ ;88{gϢmsg+2XHvbH&2(2YC̑A`H`%΄'de䩹ީg f~ny[柉 @ p$W?яY|+Fc}meYh,[ms*#>O۶,ɤ."ҽ62ޑ~Z(&?|?K^D4@ @N/17_K}ˏ^KV5GTWG{z(G_]Ȉl/ڣ^^twj\[J5mGcm|wg?_?7Ջ@ @,?/O~N#\H+^.hi;cQ}}NeyD݋w^󢋄7KgkDY<ҽ62ޑ~ϫqmem4Әyվo?o~~G׿o׈ @>/3߽˿ ?o偽QMi߷Q,4|V8&Cy~pgkDYY<{۱:tղ~micRO.ZG.i9Z?"7Zzl,&0I#ھH_hGĢyZ2X?-Rm6_>÷,dW[Fֿ}HKyG~wgֲXU] װ I. @ + K܊yپ˷a1rlIӾoyU] VL=vƨ7Ƶ+Vuqh!@ ܅ZLg5oŬ/[hQVV,u&߸LiXwҋ[o_y"U<}@ @WK2~+*^(i:_+ێ%w&TgYyYs[X><6җzWG|-iŬS?- @ Yr^iyQF֛lDZ+k^^4/dNuDhӏFHudZq݇xG5Z@ @gs9&[cV##-+ֲo=/ p >Ѽ+5S_/dnk95[e? @(1zfi͛Պyt~5϶6O6h1OM$/C-rƒ=~#iyQT@ @GZ(VѼǏgw\"mv=}Cf狱g_ѴFں^ͩ#O.y _Ӆ @ pH{Zchx[ѴNַ_y!c9Z+jDՋ[}2<ڢ#V\|Vsi!@ \E@'ڶdq㵑~GHu{^^h|Dh/3.dV7M,Dloҷ>Ƒ?ҴvR' @vSsfx4GzXdl߭i3Zv?]j~w0磒y"yGD>GzƵN @ @W#_)'uvW - Pľ,PDf䋴u:/8"OMϫROV?IC @ p*٥>^c٬WDu"-r3ִ!x!c_g/շ>WoOJ_f>ٸj#qQƥzlV+ @ ]F'Xtј'k=H4/ln/.^}[iOdZUF;yxUr$&79T @ ,zx ~+f}UͶQh+*o|A >Ϗ˅^(^Q6%ǎo>ci齘GK @El}xt=Q\>zFfrl|kql^~wLsq& ʹ_u+txO[}2<#}׀eת~Z@ @Gsm[|jH?^6u-#(G5ښV׾g}δL)9gɒl&Hhl?ʋ4ոU{_ey2Mtyʗ+/P @ ܇@pD=~l h_dyQ\5|խfoo]S7d*xv g5yfڥq;OgsC @_֢qiG66ll_kL\slzy*,0ߐ G߮Zk\Y_ԏ4H-ӛzy'ZX> @ {9xhcYl$z#q|6d܋G9hwG=vl~c4&cy)QCvgɁ @|V+żBkvlkcg5fY=>/'ki[jy!##՘ye5of,99w @/Wu[﮾J=ڵνFi~!#ebuخd,h6Gcv%W8 @ +-Ol۵#'hY @b^c5;}1ۯlh_[+(?Z5N]q!#lУجl>SWz_e\D>P-jݹQ=4@ @Ae1k#c}_V-n}~k<2oΖ YT@DHqkcY߯'ez+hlFbzc_?<~ą,rnyXU|^cۏoYY߮SGk|߭X/~h!@ \M`Y,ҽ2n컲y/?z^kSv|wh>+[#b~9=F˗y{9mQsf@ @C`e#5[,鳚ͳ}yjZ_j~V P렝ŪzZk܊1?Gey2mF}To39z @ &0sxd=zmeʝӪ#^UOie2ml,ڧe½Q,jim^? @ ygGky؈~,Tf>r[1_|8e]u!#[,V#VWf|zkLVz|;k0 @ p$|%b&tGsZo(/*I^͑jwgH|xhI<~->x}.c@ @w&0r0oyGczdG^xo_3dZZ IyZ(6U5n%<>/TUiZm> @ TѺ*=OYkvl=o4_3hnwXCL,ʩhGkƣ9F+<~=w/|F>1 @ xw.,oųXj>ou\@Ҽ|#M3z3k2kţXE|^JWjFL[9ߏU9@ @X=W[,6G^R3z/~ȣZۊi~U'N2!=葷x|G{xLk齘ĿGqT@ @!0z8[,Z%{zcyc3MZO:BF@e>UǏV @ ԅVzVZ_g#W>A?Ӗ2qi{5U2CxdLo3ʉ-J+q}}hծ @ p5C~5kgbYΈ>w8#Y֭zV6w.dDB`w,wg%^Ol_i9r @ Gr2ZyZ,v.<{gzu/_y!#=W-_+ZS7*qGv%U @ Xy[ΜVm[1͗ӜQ- )~{~%癍X臡;Qok3گs&~@ @38֬{VʓXiZc/]2љy%YgL~@Z95߶Z+c@ @@ =h?ijLeLo(Vn%ͫCޅLza{~5kyvfUC~x*VJtJM< @v}HW<+,7Ӆ1}k\.dAS @ Nynl~$myZ1Yb+~vLUOog6gk.2KPͩzVXIk^eTc3~o5 @@`}V[1y\}OԶZ[~!#PYr[1}=O/uFٜ<_1 @ J`?¾噍VUψO{t!#pF.,j^=\zT~:.c@ @Wh]TmN=. {kTUm.ddcj._QVdټ^5O6?: @ yu(g$y'QWm\Z|#yoӋ PZ3^|>1 @ @`!F[<԰J=l揶*ߐI>x7[3.j6׉G֎C @ 0J{-hy|:gzaeN޾9 xwl|eܪ;#+jmWm- @>2Ջ;#2~NFJiKU!#_q _s$**jj=gkٚ @ ڃ9SVzlѼy4كlnX;1[c4oԯf$%WڣFsA @xG]*ԝ|iw԰f,NkY1;ܳʳ]'y @- @ F`^l﮷ Z}T'z~ @H`a}acGT]ꑵPֺOtx`?z^_l{gE @ mD'vag8cg!Κ @ p޷HwyG|fQukbN;?}@ @hzoOU9Ϛ竍ml_#kod:{gmkօ@ @~sΞoI3}?~ئ{b\w_^B @AC}+wŜ:lgϘc7zɪʄ|@ @\ƻٮ󿃱08tgϚgP]su @ @zi0ʻc`M9@\Mwֳ7 @ |Z_ zOهKx=z= @ pk\,x5l]q8bΕ1|Ͼ/ @ Iഃx浏8uW{~~P @x~/^߫W_™ϼ393 @  \r!^i~K;7ݘ 8 @ @`.!`OK9NkjTT @ \zpcطrtFX @ k Zo;/6 @6e] k[_|(<{x3Q!#;"@ xOq(fDt}K4!@ @S]w.4>^;@ @y׾Q/1>컣@ @,>%}YӾ[ @ g%.`ys @ pR=x @ |rQ5X\P!@ @.F!3)si @ l@r ` @ 0M˕it\3| gxK @.KXЃ @ @:՘QWIENDB`Temporary-SimpleInfo-Light-4.png000066400000000000000000001155301476226662700337770ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/assets/system-notificationPNG  IHDRdn8sRGBDeXIfMM*idv}@IDATx} dEu}fWfewTp4 *nQ5qKb~q!j\QP@E@ . 0_wWS}߽vUNU}}w9y:B@! B@! @S]{SgB^ ! B@! *C [Y3+h>ރ4! B@! DD@("_x& ! B@! @c! 'CBt Ut$)B@! 6{ bˍIB@! B@$x]EIYjrնwKR|f\MJ'Z]RVO+mbWJկT! B@!0x^$VvvJնOZWmZѼYhWӶ'5jTҶ6vմ:4i}n兀B@! B-4F_%m+ic]M[iRz\+KJU:RK5:*iM3&WyEmY׻q\! B@!q;q3+<_QJK5mauUƞOJU;A$QS%"#JȿմHIA9! B@! B 8*YXWҦ Kb .<ɗ6 6]q+O~TGG9T+v755!B@! Fd2CCC;7 lz{u[ndS3r]99[Wv=JvuT5(d@1T>n(ED̪UR\s͙/>3ҤjR{! B@! A͛7׽5kХA3Ȍw*cCA\ym$َW+Ay3fSYC! B@! @xB|2!;Z˻}|>mׂlHjAzQI8m*[`A;<Io+lw ! B@!  fv;s۶m ^j82AaFSIۼVG5iv0qm$j6|YƉew=0inn^8!B@! B tz=\qYg=oGKƗzD&0,+JC&đdХTwܶQu`&-[ ꄀB@! B@{~oѢEWnL|Tr!i9;zVSI>RߩJ4׹MT#hXqF"GR (uٳ"c* ! B@! h 5*ת\p k׳Q׿QE'|Rm]=53Iԣ ᗫ8m)E>_W9^z鿷꟤΅B@! B@&K.g"_0 _JFLմ8mFMd; ^̂B@! B@l63SO=gʓ2 =k^[Qd(U.;ju%zT8mR\ n-cD$! B@! %MMMXnWLbwbbA_Gʗ[kuqq7L6RCT-8Ȗ 'E;~xϋ 䅀B@! B@}}}wϜ9m].mzvE&?XM>v)JP0ҡAkWiQQ.l9zinJ"cʽݪB@! B@FCkYi17dakc+^r"ge=ꏫ7Llf֣P^v!c.\9rt=ݔB- ! B@! @ zh+544ԔN=X>yC,H ^YWrpMguОk]Z0[ aeFsTί's J)eQdJZWi?QE+'SWyRk׮/| E䄀B@! B $^ӓK4\L6-M&}}vƑ!! RWP)WOQdU]DqYa=$v,Qɔg_m:Wd !B@! H/ bR[nm=|Ș3bË]\k[q]qk׿aZ;M2q(pG2Q?xQD+%úzTcs ?X ! B@! @*V-hK*TiÏ1$qqEͷu~u(vD[iϣL0L5D6QJĩc 7vB@! B@# 6ܹDB5ڑʕDV/9sJԸJvu%KE,Rz*ݗjoeF۾\YȌ{L:6Xd˽#B@! B@hКCdL4Jc-_5/_/]JSOzF˗{9B֓)9Σ)'Si=e0ߦk SCƭb! B@! l@&hCDI_Tjj~"h2.U[r=/EȌBfĘ/U.^E!Vq!zohXEC:YT?m;~apB@! c Bc=!dw4 R:G*oф+Գg 姑 )iG׋ _[̇mN{  /0N<}y>0X w22i5%ʌ `Ϛ5k qqâ)CM6YB?!򗿜D kriAo~~77E ('l's!#חoٲm`` UB@! hhHgCr XϘ1#m=JM kQ22 +ϵ ogKve|>]Eę)w Oܰ&MZ\nIo/g}V/e[5sAiy|Ss ʘ)[ i*eI˜G e&)^6eMC C/3 -[}|( xM^fhGo{l~G)K &I=yG:`/6_e9͛[͛7d]@P*?}>? Ү|}СC)bkg<}Hs[э:B@! E;j٢:bMڗ Œ~.0&HT9xFqś}35ٰ(c!zLhuKOk:gZ2-^*o)_i/V4ȓAy!!2!b@N$sv&{lYc,_W:Cb&m^raOHdaX >-ݿe_r<^/0կ?dB-?'\ro~E9l6v$n''mҤX D=Hܖ,s&]wMp&)xj҆W+sM0~ S - &'`8cJq;h# +tfiUs$.PH{4 IA )3Дzֽݦi+ 6v 0 1tڸqc m$_:Ar D,ϟ?lH3@0/'pB?j׭[q|;.چWCVZiLbi ^"?(TXnCL5'|nFV(LiB\*$>8j_aJ8,g!`(DX4C ʲ$cؐ7Ñqd@"u dhCq|P1y:Ӱ:-I~pj/ n[Mop[ D&د$x,\&/s,xzӛ޴9ȗZp&ZÜx}$@4q%9/AV4C$Ut! B@FF:^s}1gtelGc\5YGELX]PyPTZ2Xw!Z b2\Uߛލza=dg"0Ra,^)c]$cH XR&G丞#DLűrFujٽ{w bLa/$?d{$$mXJ/.t SCw$Z0ddq Ls#:Bn1gΜazCb1akA9scNKׯ// lR! B@! @bd,sXt\Xy>]80B&G9Rauqʃdes^=㕣5rpgǐ0]-.K@`/$EAI"QNI5 s2!ҥOCtnJgH II:tWb _n ,]ܭ*m?|Uԭ:m^c/ohALnp S:5 רC U ͈ͽiugbfǎkKKKSO-@pj!SS! B@! f eaE=jK 4ED)"כ9ICp#MvyRcaf3`BhOH/%$ R:H0A< ݍrRDYC@Č(7m8PV"A)!K'r"!$?@#6W=[Uݔ2_S.ƒ6 gP_b8wܡ a,ô8>3Fcf}.R! B@! @p[0/S2j8D$8ɖ *,j$ː4@Hx:erG7t ,aui؛ ZƘ<ċ!9<)&bj(Pr\N ʌTMHb¤2/!?:e,K<$5nM"ܽ/;,1,e ˞g2/݉yG9-nV^݁::묂ݔ@d\+F?3bm?ҿdB@!  !>vʸ캚,;W[RY]X~DALXF.ĂJˢ Ge6 md5Ifli=V1)wQ⧟tH*X'nA{(gR -`cܕAE;ȟO>%y:x={5{Az1(O/Y4"k#Ba"k-h׮]Ioٲ_DBe3XϚ5ka]N9唂e]֬YN%ݞuMK.otכ88LB@! BpmTp"aF e: YGzӨAr29 *&$K"AB&gm/4 H!tP"X1̧TpS" 82L!E*:xj^,uu;0kdoz{zIޔ)zmG{$؞#0!{8עnkvbf\NFdbz*h EmfH2ƽɶ) deiW;u^U*B@! @ T@QG)M p7O>sj)(uoah2"J1 õ * nT9۶|zi N4Rueʝ$gS: KlM!n3/0a` ݗ)F L ߯~~/{h_u*3^ EV\uy1;,a65}N P)p-ZnAlG$A'4+I!B7w7ܨ:X;2 L(q`´ dJB@! ~3 4}}H⒛niG>]]]W{>Ol/vF}ko>n iC`#?!2R0?>z_VJjMvPI&yR$Sn\)3>ނ,Yo A+$X]d,bXW.Ok22͵A/"v,_maoJwh^o֬pMsKo*dw/m{Ke4@I^h2 G @Z]Svtݍu?ܘoFCl-&ylٲA?S[Ϡ1dw8 ͍]Cb.B@! B@#83i1M_~sbo}[Y6WZUrXBب;~ӟYCjͭ i+!!~.Q 2JGEI9k?G|-U2X:[iYv~yͱu걇׳XK]p72.IOnvXJ2 b0ƵJtq2J DsU9%qB4ȗ^h[p)zMx GL5: zїLv0,y2]mi-f:r5݀l3\|9^R.:+c˘b_sWUf[lW&nŋۢ%K 3<?M;]+y! B@!0tӟw+He5\TnlƁR</p kV·_7\|+֮]dt!.a: Cf˝s +cyEs2IE9ɅՇ''u:ECE2G=v3=ԔCX51C&NJHick/M1 FDhnD.= R #p0iK{1Kfy8{_es[GG7Ӥ^A u~駇F:]G} ^F-$~zꩡc\! B@LD/އ]Tg<#nɰN)#I\h e-`^ziňet+B ]t*X|_ ?z?qu~_#qW)5%b<Ֆ;&H&,mXS>֒< *+'oS_םy ..Ͽh ߼c~O .Lnh$g9}3_!+ʕ<e{Sn&o.Hg}k3@Os׃[3^ AYr~>~/8TB@! uDnm: vKUW]51(;97;V:\('?91?s[_Wmk64I]MB@ HV*gV[]IXbDH3=5 )~;R PI# ݔ R*熌aꌞ(C c\ ӛ].K-d`hv9"W%d S37eB@! m۶~]ukbPd7!pe#7+9_??"*&V[JkAp<׹nmS|܁  9R.1+i0k\56H2$ 7tI$mH eId1OlMa0$q,h3pʀP2=7ԙB@! B@u:7B?qdm;[^4jAT;yN>۷mX])9Mܦ$:@lJa8]CoyfĔ;P* OD *98-$Fl^;%dHP-$W/y{P.M"rCc@n(3n+兀B@! M0ړsGG?/y[ulò_Cbͻf>N_ܹr~}k^?Z { *וwyʸayWW$CȖd @`i ;6/e&O C 1cjd@M$c IK |0uLBX@mrSСJ2B@! Bf\})Q:ؽ{w7?O/qi]Z*ś9sfayfS׿{-2eJ:H֏RUd`ޮ<s7_h\E&H_PY.*iSNg"d'@p~8~Y?.,,O b nH&-U ΐYC4S4!BD";(Yw%=lz31"+,f@2%a$\ S?B@! B@ Ot}%u>R% RRAڵk-La̩z{4 KY故}sخܹ_= &Mp:T{kn%9KƏU 3W%1ig-y kR O ?$X2&y+ vz;$bRCc]@TÌ}C;\#?B@! B@L:u⁁T?Cr[^O4J1˨B+{??_ݗZAd>oL dJ͐kܲp$sjGr4!e"@Q.--wn1ueݼ+SJTιS-L ڜx4w1!}@ YeQ _E _ D'kÔWB]K # aǐq2^ 7[B@! B@~;*o}R*1dpZ rm_~m?fl}Lkk¯p]unsRږ+: (#/Sw]cΝ{/IIꥮv-d?oQ^{T&~'u[`=;7B@!y7on'>Q~3q.b5x+}E.l~3֢Q鮇!r:jc˪i[mv &M|j'udi~JՍԔ+qۄ&Zڊ^/p;x51(D#.etM}.] .LpkB¹}<);Ŝ P5i1$&/,bduUNm*k;@(q뭷Nz+_yLR'u駟~ȯ;vg?ooOs÷rˌ|3 7퇿(}nqƎ~o_lKmb˞vȴ 󄋉S a84GʘU+sr/G&wR{z-[ޤ}>5OZa!Pm'wEDΡ+'d;~/ _2$P-[vs>:T=y, i+TJНb;ڲk֬i0'^ؖ[ A4?ny뮻n??m>(M࿁cv0|g:3;߹~vo%?}n<`-oy~ukѶ@ē_*j8Wm{ ?7YwrƎ=a҆~ilv:te۶m dm96U=/>e )ܼsŦ3qØNRL2߇Q!. ϱ_r%=NWq/[żPKɫN!  d!9bK7/YĘ~mVwo~K_tQGUg_WO7Ek,{pM`GnTRy]A:ZVkE#ܕKɺuKWv|ܽW{WLkvo|HkBLi$v=Xx/ӿ7GH/'S:;[tn8??zswW+mf馛T=#TI&>@fI߿00/|bc酋> _꽘4X;Cq|ŝ5hʅ~$ Ofߜ 'PbKe|؂g^x1oxvxW%={1~`pu'cLY7"bյpº5@vXYħ_?0 5++,k*&a[WM>LM[[S[zg'|^Ẑ.KA)wXR(+@|{G7tE+R-K qQʑQ͂mn~: w$KT7N1MyS?w>uw6* \h0 >pCA=7OqۖVX8X@2Ӓꯖx{PqַVrĹ{W2=fmvXBf̙ cX~:mvtòUYM XOC?qҭK1 WSx=$[lx 1 sCzd c}_c6Oˆ:ylǂ}FuNrI{y]7sUO0Oߏ.1 awqI\Z`rc*s&ÿc\fKIJYփX5dH@£B! +͍$ISN9$w6x_sY dT|^vO2}17$O ]/| "iνy΅B߆A-hq9O}j 'G'q}~`A%1q.\tE{sO%c8&[zM$ܡ\{jṺuc HBGc|٧ۇA*leHs 6MQyd]֥eZ6d. obC2H/:Ƈ1qķifKW.]P훒t{=$XLT\`q0O?bO,K,p!?跨2|ZLX ڲz&6c3d1o[cOt!RۃO' ,uBo 0P4~"Ln)>= ,܉y$^;r͉Cdyh8Dm\ū Hֿ糬,jMXV af +i)m8 J'p7(XpaÞs,V"gM'-qb, ]3Decn 6BQffT캄kk@<2n 2%&{-~fc, @t= L}Z zXNL`%G@m<0MZi;Z`_~Af dƺ;IL!q]Vڎ'X-NA):'Au,d,BpmI)Uyci7n1㷤 AyZ`iV?M{;)w>#@B\Z? HjfɓO> !|ws^>UA In:j'I`[Ywjk#ɥ1e)wwv't>{wZ9$ƮPYtiт V۹0cX>kEt >_JF___<$[W`<ɔ `lGh,u^CW ,Qx 9ځsٖAw+mGԏx"fG*X0c eXTnҒkA,.k̃;Vkݣ,GEQ|e"`NmvI<++G-)2O\cf0]n; _:H2Lh?3n:p[Gv@cdPl+s-]v5cS1B\ $4'k%)G@ zԖe. U.` 3 !^v*%~n# nݸVJК;/Ohh>`]*qml7\}Rm4\Y#2Blx'ʍ\}ʋiq9B[H ,9%# l!SV29&sx2trj~ чnxDYx3^hN*UϊAy1;]rtG߾VBkѧ ZQ4Z6icyVptVR! h|H'ET3[k [K> (d`P [7W\}PQ)Q4 QdFj${҄m+(#kjgL0\@~ /hta,>1w射as`zy1-drK$T:rZ0o\(Sn\? 6'7SR?X~`&`k2 D1<Ѐ[`3p`Yp<3"o2{cU 4G?K^s$W"W%ۃAd`Q,mS,&npo nS4|ic)pCPiuā2v`?s#e]*m-0],wTi;csP7U ogv!@`"h)[?}qR 5 /I鯦nptP+9RIހB0KXC^ŽZ^ ?][wxvX$:ԋ]=m; "e&[5\ !J#>VBݱ)/B`#{_MGPY-a_Z1PwN۟2W۶Ae) ш6`Cчfz=}M^7z/$kpA2a03yw$G.%7OPAL*k AgBI)uIB.\}LGXa4 /GܵAK {'ҋA?Zh?E 5kt) 2^zi%q A{k`7 Υu'`cM vX #@n5cmJPTJA!**mG\dAE&XK_$E^+b @ե:Zid- ϱ]f!G}pyۂq7W^A'HEc)Xj@|R-4wVvtFXw$dٶEܘC iׁk}{3-!^Óʒ2n7oP*B@!ea嗯q|QÐW͇'Z\ET Hpqe+jSQY!c$`Ԋ-0Hɐ)1$A7Ws4#PH9#ī:."agXYP؝xQ띢%?ksX3)SS OBM9w*nCx2XalMGh悉V'Olv V1+gZפvyx"<"d)ۀ:jO!xզ.Jm?Ů. dS%1QK@={^i;,SpU2PtIc X30 [i;ch)]jee/{١*mG]< VoܼO|a5AUn5 7cA߉Ͻ!!KWRG2$GEI%z*i!7=}`c0|-܃pkjt[=yk)bs]]z%ap]U-BQ%` QVK:[ U\;va}%/r}NUŸ.V=`)Þ70g7sC `d aAyQԧ!b -_mˍȽ8A2GK[`3&u=;ƺ~߾Aaz+e HNeI v.@~;MhYAme\px!Cn0|ڌ-c'Xs>cLjbg Ǵ9 ̎9\َvn ̾K"~6JI{W^i 1{]b$dX.Vڎ:&X]ykz~7ѯߞʪd]M:!|\Z3FKX0+8e,嵰$}1ܦA)\ e2<Cs;pAqus{ҽ#_RB@!P@ F*mTޕM:tߕ+37Ir&qa * ӟx9 BY= -0oū+? 0ȿ Wjwb-HꭰXyb˂+#5ֻ@ĵytkeRQo0Y;@&ڇx<~(U6h*B@!0Aqyp+]=c6? 7}||rUe÷ er vzb!uH[zA%uaBf$#y[0yy1 jh×%Ljul?Y!A@A#"+ s@Z"+ߕewgO~1_~yadmvdˑ/"E o}[W8tOwKrzC=Hu Hsqc}xJ!nN]sW%Θ!I `[n.@$㩴O,hb}}7s lg<`c.3^(Od|K^@=5 K'_\{`13 /δȖ%,G-7%тq/AUxw|VD!efWO:M١z* _G#!c_ Y?9?0: ! @2;*-9~CkunԐ|x dz\=n޾% 8h$pzȻ!kbYXF|jKXw"6.iTkܺ,257Lяzڱꋩ$) j{lBAt zb)ټ袋#\`ғO>C \}<(k $z@.EtO>%_Mk=c }>OD~wqG78ǒ#EBv17ÎXuxw3b~`0uǨD+?/| qs=!?XYJI*m''w3_ŽH4eM+,K:3AtǁxP]\}y%5 3W c_p4sqShEb U=.F|Nt>ubnm2xi*X 㬼My,*f^;㮻b+cS| W_3l pA{})]Vӈ}3ڮB;^cn;Bb9,b :eea4g "$2ǽMoEK8X$@,w}k@Lя~4E/zA8@>\ xqkl;.XiR|2JB6~k\Z Q}rˢLJ߿,kséU OkL| XS.,qcn!Թd؍Tn կ}vy*zGA @̙y"kg=YAlr-B8 Bz;ŀ7f0(p(5 ׾hn\4;Xe pЇv!;v,4;+iq'}<Na$C^W\vY »255Xgr tATw%\ח 1#UZ_ I:bg ӦҚc ʹ 3-ئߧXxP of3p1cD'k?# zu -@mш!sH?aE$njs?IRL':;#,]1] ͵\! G".=s훯"{RrÈ+ot^ A(cp,JZ]X}r\s|PRe\i&eQV_y˒Y K}£IRٌ#K2&g[;-!՝ =i@4#<O||3,F(J&x|2jxYYm7X<zN ,PF~]/M$^ܱW+O;D7>j->f\x⢰2 ?`[ZHHZq i vH`YR5s-Zp=;MM9cziQGUdy9HvcH%.,\ {[B=d PZ2:B 9xh$71;FM`&ŇVv-b6mަJ6Q)c$7ʔrԴKssÎ[Ao]AϽ{/xƭ{= Rk?fpvI"Τҳ{x-,0iӇ/x MaZޏŹk>B@ ,,a8!B` DI 5D D"L?.!K`%slަTk6-WG㔅ɲ|lYԴ "4ve\n͇G)˸)F<̬I_s;yB@!ИiEB@!``/n!+HmRZ,\p(ZaXV2aKHؔ6oJ6Q~8ea,;G[%5:&Q&$6d\ s兀B@! B 4\B5I @#1bk_wWJr}gZN2YQL qWwJJB Q.M- G% ! HNg 6爲.K #q>CweR|ZTҦP8..>\=w{n6SƖi7voh8W@TvC! B@! CK܅Ӥ.2~T?|`s> rWMٝ۴\YzWƟGԲ0Y$'H[7ƺRz|i f̍7\y! B@! xMJw>N[2R:Ⱥm+mY Miy'}@T ! B@! &,7o0qg  fĎ8׸\ c/x%dئ%DCʵ *9wedYy~;!O---KCQSB@! B@T߿'mKCH";3mڴȻ)7,^[]2Zɟyey\ ȝ[~d#%Z[XHc?WjN-;jOU3B@! B@49sfDٳ'Miooxv"[pĀXbCU\sm'cW-HKDQMd۴DJ[痏sɖ*+W.֭[ PF! B@! h"m۶W\c ZS_fσʕQ~(A2,;[fRuV&,LX㹜oH?';' ! B@! Ck<q[ 0J`FvYJ`cRM̮K^x19 Z! B@! &\r-8׶6n̄â]7j/ܕ-UdauWB@! B@! ?ςAH)?ݒ-6gia{ǧRlC! B@! @#!@1_җb\42J:j@+#]:|sW6N>HTY:u|gvg?{ϔ)SʄB@! B@￟bhÔ 7~SW.J][VI&y abݴT+ZrABJ[痏sɖ*J" /R/X^! B@! @~7}1p)Elޟƭ w*D9a=SNyb̦! B@! D{w=C?<w!DZǸV6oSiܺ yM Ӟi:W.(_s%v eq]8 ٸeWbŊ믿\TB@! B@!$ b_Ww<ƃ^qI̞UR涉E9awNꋥ ]XYvaA8l|9Y[oS+[fӸuiËiӌ3gn֖>tevmvǤ\GZHL5^اh|%Wk0B @#r^έV\_M?S?\?EX_f^2Zk_-Z;FmE>NzqٕZ&ٵ*Æ @ p9/3^췢rՊOkTcQ5e?BfemՋb9[Y]eik_Vj*:3B @8U*畖&xj3kNkZzƫr~N?B4P'-d]~47G>#k}F @\2rzjDȗֲֶ B/GO_R֩غ64巵?^ @(1zfiՊ_mbkmQh]r:OG}KH^l#_jUZӛKd>)>}<-Kj~ @ @8HK*>WD7yKnb&V+>Uk}԰9y|G|GEc @.#P94*ʹo6Wu+>!Vx  xњ=}/^;l^jŶzkXeik_S@ @*z>ѱGO{=}|noޫыz͏ |?iS;wl̶zǢy|Z;Uv}l@ @;DgƮgVGCz~Q?# @ 3]"r;w̬͌%_litCGjHfu-yD>ɇjIn@ @]z~.>; N֨gkZ;ӿ/d˳vz(Vgm|6^nӘOF}$5Sq[j @ D9y^Dzgc;ʋ|ƣ1E>ۋjm<ֶeI61WKzyYՎ=m,(gVFQS+G5~ 3B @x E@+żυYjg(^vz~ɻ242H`Pޫū>`c-Z[r\l;q{Mߋxy @ ܍_tkųX}&_{QG96>c~^9W]}!lwAu2,i8{Z[ZskXei'?&#]!@ I@%vli;|[5ڭ]Sֻ/d*hv g}uڽՎQg}whܮl@ @WY/1z4nc#>+j5Sd p kͫ1g[<5_:i2]K^Y!@ E`iţX5vf#V[my/\Ål<:W|^ck؈}ˎyT#_C}~h|s@ @w P94QV}VvmjBF^ 6W6?GY G9嗘Koׅ[,~k5Z1c@Vjw֚Y@ @v{Z,~.έ66jGo<1Yc~2hoK3/dd3zﵭy5fu;5<%GGug @ p6aU׍̭vROgٵw(2^X݋Zsۇ\}HjhLhƕ^m @&rخ4Qlg-oΏoЮu|m[?˅QXkm)vk>G|VXf/OsT߮F @~-}عmz O_ei2T0/d?؏[Z@Pv-_%6Q~9 @ +JnK*>[mNm>GQS}g_Ckܯv^[zY|f+Ǣ/ӊ_7e6 @F=mعWm%7d5ļveanBF[(6yvnm߷iWy#>y_VLUj8gk`C @=xWZ,oensY٘ndndgu>&^ԗ#ڬ~@ @gh}=m_OvnmهڞgFl|5j |t51km,9:G|V}TWBF6:hg?y_kފ[٘_24o/9}5 @ ὒiFV٘?:q_Dy^l.;GoTl,ڧem}Q,o\;FnvO=@ @`هZ,6Z?gm[ӊ?>u2]6u!#[,VG:[_+G^c:UǙ_9 @ # +9-M|}+\.zV>VEzWEk_H!>||Dh|y|//:G>9 @ ;9H_j~d>wGk.k.dft!}~yMkފ֎W}Yyy~V4_3^ټ>@ @; +y-M>sZ+zh"_ߑ2zxU5o"6^?'OFӸu9 @  ?z ohkF̗f~ӋT_$.~*ִvԫcC @8@Uix׻\!}&T|^ӛGrF#L+~y|?/g/|Yz @|9L[,g}>ou^@Ҽ|߇#gfz2TpӵQ,ED:JӛWjF7oH>~?6VW+k @ P!z@tYliυ+5׍4ki[1ͯkBFҳ?V|3ў+(/zzEQ}\/ @ =W-MJf4ٛ2{^\>˅."5~ZDy_I}mg @ #z@oigbQά5~.#͈/ӊQOv ӶY,*y4»R+jTb#Z!@ <@t꽢oiFc~WۥZ:Vb::^[T/}ӶYli#fM/O+U[թ>w @ 鐜 ;jbh_~E#X#]{ϺZ#b#H}~h7zjҘzky @ \A`ҠҌ2}>?γ<}Q~O/W]o[ )@=RmiX|#J,wʑAW'*thf35~ ]Dm֞r$Oԯ8~ @@D`[Hb;Q>Vi}9|W-h,G/j~VWD_g/^aYR!@ ܝ@tP鹒ӴYli#7W}#6]hf3=BF6V9ܷ4YlF|=gVN/&qyZ_gVnD @@?h^EIJ_ UmuT[؈FW\&GmOŏekִvcC @;@J&.#[?on irix#mևjqco=ՍGY- @ qӯijVA>-e^eհK.dd♿gFk+^ָ۪K  @Vܞe9#ÙnU]օXVhoxU#:}}i|f9 @ w ?Rz^\_OӋWjIի=cw/ddѳ+Vgi*댼j=uA @%=H4ռ]J35jo?G;6HnU[ѝƕ]h5ǎ6 @ w&zq0_VtgjWɈVst\#ci/dd++kV]ESYU':Էy-A @8@=L͑mUtMTWrm/dd+ܪhFW_Qdsv+=X @ꀾhnUSVWra.dd+ܪ*,j/Z@ @;Z#9UU:}UoǕ\[0{`=ڣ###5^lƣ'@ @`yU}U'\Ҏx/:/= i3#9wg&s@ @ߑ@ހ3Sc$ZH/J8eN2 tHu2cs3Z!@ ܙ5GF#Zy_G6s62(Xa&4nzx??2?sB @^&du*յFF=y|_HCw8\ahzyѸVT @ F`ށ3[k4hnst{8{ kG5FFj6OWruh@ @O pԥJѼQ<͗qG [oc2ܝ;zY1;ڳ_ʳכ<@ @!XoLL"YYCk>WrwotW/+ufrgrJְz66 @ |qYmW"3h+ZC]ulY{_Hw;glla}T]@ @L vԝ1Z]G]2Wwozg?VWr-]ul͞}ŚC @A`ׅH/\+{]ͷvֲug~V~!#𽳯ZGpu%}\@ @`yl}嘆Zc5BYֽqQQ.52;j @ w]̵Z} @ μpؽz]Yۮjos!|wUH#{=Qu[lm/ @H`a}acGT]ꑵPzW'؏ΎG/ @ l;|Ob='5ϠqFg!Z @ pޯHwyG|g}G5uXӮ @ @m[~Yޏ<Y{#Ӵ^; @~svg7rHG$)xXs Z@ @;rhָ+܈a{8`}GGLV}︧U&C @8}6v^ ɡ8@|: Rﲟ11 @ l#p@wcy?s&nlM9@ @ߖd`}}x?{A' =z( @ @NX$Wx8_˘}>" @N;'>}^yrK}P @x>SzyCp;Lά@ @m\H[:-zp)pN{ӍЀC @bÝ.˞W \p  @ F þ;ݾG0@ @%õߊѝw/ @6e]ppBGy#R @8[^ovCzݷpcC0)@ [_fx~b yq@ @xġ7|OF2 @ @x%}WtN{ @ O¯~/!@ @߅[\ؗ]..>ņ @ <]/*9 @ @*oR+x|  @ |rQ} @ X\X%Cf IpA @#pٲ5q B 编组 70 搜索 dtkdeclarative-5.7.12/examples/exhibition/assets/toolbar/toolbar-2.svg000066400000000000000000036314331476226662700261010ustar00rootroot00000000000000 编组 70 搜索 dtkdeclarative-5.7.12/examples/exhibition/assets/toolbar/toolbar-3.svg000066400000000000000000036235671476226662700261130ustar00rootroot00000000000000 编组 70 dtkdeclarative-5.7.12/examples/exhibition/assets/toolbar/toolbar-4-2.png000066400000000000000000023544051476226662700262270ustar00rootroot00000000000000PNG  IHDRPNsRGBDeXIfMM*i̠T@IDATxKݚ5mz.uU%To2 ĘP#F $v-chK(!!р3CbHL(DA*)S{?95ڷos4k5;..㽌}7& 猼k!=xx<A>yN'O?~|oۓdۓoN>F.ߞnOn&;=9v#{s;99fx <71X֬HESWdʒF4o,)#:eW/eŶpsE$qI|mU*iX6{-E듐%b>RONk͞'@#FЎDV΋ZrJܨ//,*TAKM5{BШ7}W'ɦؖ6a.G(qқpTKܠC]C*6JRY|zOchI`~sUwѳ/؂` eJ{AhM4rJTvIlHf+unvEȝvq(X`/ڷiUccRZ~)$4(x:%FK2:Q~1>??I^c"[ShK 2&Dy(XSF+ ܦ-6A>CTP <We%[af,/ӡ3]zX y_{1eSU1JuPzs3HXQLeNbJ27HX7D^И0[y+חs]sqNB&IKU&?߁M ~뛻'uLAn'Ow9y%ubwͼv $3LLR U)}Y^1"d؜:1mQM&dKlCo8u1)$mmiӏ!Xli238\Id21dZX!ol^~c1:s?& WUOQTo0ң( hIP6a^塳t}_S?|9Ͼc,aO7s,y-k_ܜ>zz{׻{/__ ĎsYbF6$LI]x,ToҚ}hbj'dX#ou8F4׎rkn[?~yz#Vb[?uz#}އ}h}܋{{ Xx{1Oo#1"/?co;f12ڶEXʻiOS:{ײ|ȾO߶F)ݟp8yE*y?(x>g}_ly9;\x= _Dչgd11꘺yy,bcmFcv+ۺGЎa>9(Wv߾|rvGn*#|'(e@Wq>ހo{g̓HCS~.xp$'I{ՠ+G38y^' Q<RryGN\ Zo.e'='ʅHfq')|zB*OnU\嚲H-!<nzϵEG|A xo k2߶x[OnVQ/&:5ϋq2M[Yxao0.ҵO̟䲚\йП 'r…>I̍<&u{Bb/Ψ잜We@T}.@~ʕ to.(ᆙ Lğg.toYLOl(`lǣ>HrcR[OmBr̓Z{~i.Pg]^*4l Ëa)\@J4 {"¶WŤ 飃:QH Ka.D WͭGIo 1ǎ\\Yꄗf4x fmYP>+,XӇ*~ ee7@w\vU5yok.BqkNr\åkiЦ @ŶEQL M몧U/vN>犔ejԅkzQݔ?nXU#qkOrY'Ï]bmԋhOnʑbYl6w Ԙߧ^-Eغ|"^ҲE`Ѻկ3//TTʤ.JTL:d xMYFfxW'Q]q>8Q<&苬= 86J! SϵA_٦mi#)}&ǿAؽ!+D\:jbQ/hg~)Q}C͞.]p^Иs } iLt˶Ḁv"I9.UZ#Q3%,RkDE؏7wMI%U}?{F8DID5 ~-8muLˤN.9űouO/-Γ*rmi6?)_ͯK8Y 7M?ZrXIIqz8w,J\ύs,-qryܬooXE^?y](̱ YV.r b|j_b .^=ܧzcţ,*L|7ߩwk.4{VxAn7^9\ڻ܍zEat.s>a Ly~:;=&,#_y`L,8e( !y\uNK#XL_8V%&pӹl27_Y'+I ѱgdk1F[l;G3ub,T+FRҟ:q)[~7coiyحmZ-&vjvHC;gڑ|uUeKtZflXz0TQvmH,}f~o-Cg?GO)/[ϻe/F'Xʍ5`į>PB7mR-c?:9V*ĿuV*bmrkۭ7q,/%)*|oc[x>ӾniLn4V(Y]{^xtQz=LeDm*kW)*ڿ 43rrXWyl*\\JB[.x> לZĞ\XR :儭72܉|FОg$F 5uAGl^rJ3VeY\ -_iӋ lix&xkWBVaH m8Bēll/QƲGibuʼΉa _sT5F BUb|8o=uhJՅHE!{vhkmֺ?lU.Y>"VlY 'fP'&!㹋2VbrūFݲ5V>jHq\c ^8Ҟ:'u4dlrF!gY1T_OgOws.B+mag`P^.&YN#x7{ʂvwx߱`m,s>iv}B= ~X<.Bn$dE#Y g,B? =H︄1@w;g,;fk96;7|*O{Drg?=}4}mp=5̜]A.k)Ӿ2&}bs{=O/7ޝz#<#D[eco2^{<Y}ѧ!Sb'Xem5-bM2PaD%X=vGJpaQ+i5أCL*zX'D%~QP/ʡW1[7Gcڇ;e.X&ǿcXP?o{*+xH?tם?O\ dnȍgal9'''oJPa&?z8K?`7Gq*ǜH y9r1Wswov}f9PǿK)$&`NJ+aɚ5eڷ[L}Na$eyCRLTQCp#/mlnn-v>m+ogSPwRi=V*@(⮓ܧc} Z{^KA80ULc}2m4:Xۧ>m]1϶uF#7noץ;۳4k0mnMoJ_N;: kokzXf7D3{Pt,%x>ݗhE<&cbHutԗX#[{获q9t*kq 6~K]+6V̛S+oy`֞({S [Wtcmzo9o1X?08hُp>ov17>vLLktᲶ)OhHM*NWM֔͝ԋ)<]ϿjoNCK]G߲oôw j98 ڟ ##K:0)|Sq#.(3Rz֧5ʚ~ ~'i ܒɺܺkC xMISN?ߧ-VZYBVH9%PDsq^]MCfuTWdlkLȶ= uA7Iu9 j?-}>1!,wi雖%CCo`j/6e `ao踑8Q!FnJ,Ls?|,Û^t7_eOyROLI%Xx‹O&ntI8OmW-Wu.jz|_0!vQ'>eݟoGw?zo)u8 D₲ǭ>I=~3O+ |3̗QsvDzk5MbroLx /q~y=q?sģ^=l;v>~L) 侚]?*SQc1Z~+_j眯>fZaS p||BajU}b[=-y< ʼn뾶?f/Gh W;-Y$'U#cƐs7y$ޥAS]< ݄8ō"v2)6|c?aG!s+Iq7i_WJE4D,4݅b{^%GY$!hKZzWV9~~LI/ D@O}_Z& oe£N6~^h NbO(;KJepFl۞֪8Kh #íq g"=]ԧ{$8"oI '~"j]t 4śeC_t>UՍ3"M1!J} Oyn(T{\qOd j__>1Sv@}>}3^Ո].71D&!6Z^|F2wڷ 敷7gV0[1(*/zIA´ݷZ?ZJ[u[=v_S LMy+_Dmșh v;m/Sg+1}sOo'=oLm-~z9mdFP38-Y&Zr>/o0?y{ 6tk3,Ohstc=/F@!Y{mˇ 'sr S/(n PK7^9ثG<vqYVeTlᴂ/ U;{=?i2vK5_\5~|ύ{Ws°C/@j\2+~u~΅ &MtG} +;BEG?۔9zg+LႤ$mغ&=b IH3sDbZg~d\l 9+u^@[U&(J-W IO72K_̯ mۧ'}eV7'1n[_^ߏT`5Ij\@#nD<*Jvcm楷)i7My!ep:,t+XykB=?Vbr=zh'6XBפ.2^ /z<= rȫθ993p}kŘʀ?uP. jK?;]E+ғؔ`rm{S),j.)fe|T^fY.N\8Q$9wŸ2wXRGT|!>Vޘ[E߃E|UnGzvI5W;TK1l{XqECx$|๰{c5ܷǕիsK:OثEbPS='1%Tvkd͏>C`)!7D3 49vگTP"Ԡ :7l\B}5仏0 .OzGHqO{》o7woX=}3%h :߲D8og,Oj6KX#42};(K\זz䂵O4'm3i:} qh=FO[p/ q3($~BnpY Hز?2(0q׬Gcc5 2>Ӿq%=t{`Inm6ecT=l]=~q磟!ET$8FUf,gfѷ ꤆* |2- `J):q.-Ӗ@|nb$3 hуLBg>&Mq.|u])$ǻg};sBcږDG^r+V+ jwg++_L,놗ˈS,c3 wnv_'~v>uV&'o"Xge؃8^Y9S4PmX; /;)X×-ylm~guklڣlȟ9l}+Oޭ)/Q,q圹i/f>w.Ȩk^M9J_~:@Mﮬ I^JY$eڼ$?ڶN6KޕEK4fџYuҁ^W cԖ opE_4~嗋#cmXcR*6Vk6|–`.8ǵ_|wWѩwm͕q3ppї.v|1B_'OEO":7OouZB`?ڷqޗ?.OvOK,O{rAggZ(C| Эē${0$+ oФ"brC֧K)Bg#vĥ"\_Jg,"/$I'ksj`(J8艧^P8Ey}h0Gn V}^Qw>7!SCN,FZKԅg]<./rz7+47*4tfTG$Qծuꃅv*?[Oi97BZ3Q^G㑫>j_ ?􃹉W,RPmvuś^ct)MmRزSQҨimJ:E{ecgAFdH L򸝘K 픟6%k?8F.oc@h /y_hW¦v/Ѣ͎Ylư2GkظH9%uǸ}]\zfO#?'NڴڢeܙL1Tp>oq7虘wkUT1t[btb *"oA[iÿ_h|GXlcx0eL>#Hu;t{dy-S*K s^h/}-ŤVoY ]nՉ~7#}>ִ#n22jYMw.4VL0eέz:a1KW/$L_3z)vj#e%DgђfmnAX>סg#yIg ZSDuj (>4P|dž|.M42yӯs 8UqٰP0-bKgUNB$%yz9NkmJrD׮Ь6 j6u\}\0" rɢ4ɣg;NJul_,'(r}s\$+,{F ƹA }0l ڪ1uk& 3< .֭2omj `ƋLYl`+o,@S/յ'6W `.)&h yɅG{ m@=.T`9"c$P_>;6/]?9/qBob#Al?HlRWB3DCobjddǷ_X+>?qL5wȫ]pB1빗wwƍWzcu.jOدMr2c؟d8Y|>3 7C7Jz@O\5΍}SO./=~p\k>˱?رٹqe1P7Mb*6X=dPY1-_h39q_&| 4ծGƢ e+ ye]ٖɖUʰwB]2N״-ųKtiFІr\:e3:.9/i ōeyqa8gw|F6Ȯ- U(eulw(;8OHlsy >z=!\Jy8TjsE>` E_M7>~v{7ogv?S_|`;ne OZ_t2yÁzCͲ%4S{Sk:s=߶S_JVc{^OPlG{p4W`E^vh6tiڪA8n6ܶO_ԉʱc1raMtmnELKw[*^Doiڏmnkݠr4/myɛ o:nCO11}nK;ڗ8k8k/A\SC!W8TN3XniA_ʹRl%L .^K #\oiGm]J8ȗ;֯h#C#MC0 w} }p5E(;po]stsl"6ڻ6[KnkޕQn}9ԏ=fݖ{n{,uѶ|l5;oǘC;-Q^`g^>unu~G|/>g߿sDwT|tW\WvݫG[<>sw>' !+sA+Aa0OxtB0ROn|uvN E i0%)MۥWZO >7R_],qro;6̉a8Rէ /8.?zBMyZZyXxUsGSqO]`Egupj n-?f'zͣ@/GK8m: :xaQ>.O5nˀe؉7'7<-LYS^:._o:'"173_?y 0ŏ1 3蘋icEG[6mEG۠Sx>SoG_'EV^I 4 t;M1 oh|W,@d{ly(1N}J>~G9ЪQ>y5W/_3&u7-|яQǑ^yfcsQ{5ZnHXK$CrcVB/y!cUCtCf.SvӏI/8nL.,E5o >Xb2LآM0%F[J>(OKXfl`t)ZUwfU_d *OƼ#:7/xeowmuNOl$tߡ/_ǡi\FǤqa8OTrYY}c?,u&݇_Ƅt.7Җ} Y5^U~ pbjl8DPNݧUȀ/..B h2ۋ Q}$VlqHu3nlUFYPk!%Gɞ˅ O=wqߧY >Qhxv~T=~IG5n}? U$e6>>1Μl f9?/xΧP|1>xL=>.S?8O|D!ZQ0Flg ^a`j Okxی~״˙wf9~/W`k#K|tބ؏a'؉|myR}|Jta7M8[/ iꑱJgyg\=t?&eC\t 3OH g KuQ dt[S*ʾrExW='ԤY~0q2Qg$uA-zPnc3~'7" )o%^~5nxsBn@IDAT;EMnG}9<<}g统U 3*:ChFuK&m}fժlm4fpScyUE&vLF;n{7Կn͍.}k%"}l|tfE5صxmyq1GZdg:/o46j{!1ޫKqM6o- o߇W<~,bG k'"-|B_cW9P-X㋙MQ~qV,mTB;\zTP1إKʡ:#AS&iJs?a35A߶g0Mۏǁ8.mں{.]>J֗o??= u l5Xʱ}'ɟ'2rΥiB^Ȟ^E2_iuõo(as&Gx/J{0'x2O܈ڠ\z ׶e6T" GN9Y;A? _b*oRiy0[Qr1jz+ -E,zE>σ{/]O<,ynkV?PMգj>泷]^.ӗˋߤC[dEc_nO(8_w /GeQ|if@ ܬؐ?+wTJq/&sPN}ƬrMƺ[8Fl^ !h85iP=Ϊ)bS:<.@cZl!Ç Q[Z5Xa~'U<+ˋ4RJM jE"NIqMK\iNջv7xg7g爗8 V).HPq+~7T7}6I o_tL>M S6/Vmoz_( g}EWUҌOH;NFwu 43V+mYE;/ۆE*l_˹XU^2VF^Rl3ԮI au12oK̾$,ݎ~qRГ7fsc~!^nå^ a.:YD 6qJiD -RFT˄L( z|邜C"y\ԓ; ҙS@ 46->GEjӇwFZjE-C׾:8(ozP3zW[ ;5ʩӞWaSsavs [v? `eN.յK IE/&Sr[#i}(L>bp/^b׵߲J EU}.9/Fh%4!P؀~uQ^7yoRAip.$@F\/(k>$TCrm;!t?XSΗ.Zfs~>tPGF.3i&s7M"6}9蓃%1s|kpフ?x%\qC*3 Ι( 3@5ݏ1Wwü!77 ZT]w_']< ״Vfk_U'Q?X0pq#r<<1&y S^u}ºY~­$gkф5#jt,p?eWkG ];v ~G) 9Wd!|e{,qn#7+ڡ\_~3ma4YxF'H[{Lo>~܆B Z9.u-+}' t5.\xweY,TFЯzo&7O4T[USnXx>#v;_&"kO< tėqmY\BB&nk ;7.^MoB89CVǪ}goƫ^T%ܦGEI6< |ձ$ O@="]m1NІÃb FR"t7y17uaPbk `v?2 1ƒ E:CgV>Bd6i`sF1坤Ս8kÁ1Ѕ:?7Q|/.<7/?r1NKm9IQ}Cb7C39XNDPG% p?A*x&orl$}]t3Yd^1'F SIWFޟrk_U<}X(g޾>Uq䈴6ˋ̏mLmfP *C)VSf4?PɒW$k}3<-Nb3azмmU jk=Db~C_ޱ>w{h[ˈҫ;n?/O 8ͭi/]KC_×)2{{S0^W{U2GCTO͹sLk+ƻMetqkƛWKoJ2/lLF?ᙟ;1;%nKx7ꅶa^gxx2cE~Pwڿc[cd?*e$gEnMvL.uGzkЉJ]={Ю+XFc7?v}x|ڷyϓs?3{FvwxIoCc|N̿?_wwW}/vP⁋'_2Mq_ד}AS.pyE/sR>xș5#ɛ'HNx>A$%1gJ;'pt\Advxi:1umҨBM9'-EIZJ_x艣IZ>Y*E, f'[YO)k>it^$rRCtԹVcC$} 1`3yIk2,}q+C_5v3"йhm>~2([Qԧ~l=8)qsw5ۖ\1מ># +oLbĭO2ҏ\R7Pw4oc8:0i>("<԰䢛T,ʱ_,Nm.l[&+K|cy-mIBcD=XȶQ?YF ņ%.lxJ-vLӇa^l ^b?}&uʷŶ˘;cwhgr?S ×~%"7:CS̓iXT;5 motSvadS,_6e~ake> -JQb%2u. Bl:)f8^}ڢϼGWR̊]JZŲUq;tlT.X AYD.昂6owc;N'x|pŋ.~ݍFڂ8/O՟7" N~ Ŷ(Q:!N.xo/bO|᝟䷝vHɛ$gFub-z8k~ O>&}nl@+zd?,R6Vä_W`Q{ƊϔxqTWym˂J{lMY6hglmVWrP=}Ho;'_SB&|ŵEB +] T,Ej0Js7lܪvxV: ɲ􉺡+z/m9/oȳXTCCicOkr]i{|⼂vcy;ĵq[G].}B$uĝtc3gq\||9. SҩY2u\~wwOƨ:;/bW;6?FK3G._ng`_8l%7adA_7+}˅kOzؿ~&^ӭ`|@=}ʍCqA1>A͛ c~P 'z!?|SDBg+ Ɵ;]`5F:'s3ăsc' P@,o΋=,f 'O buDgE$4TwЪoFB& ҂$mKo]m:Њ:Dup0yY;L98MI'c}t ‘ÿbW.}'1W.qO23>,v,[_ >1+} e- e/k"ms@Y!-Bvsɻ_BPEnˎorϹȏP$W #?շ48&+KS/w%GWD{.3":U"5i$(b(d[krC_`;F?&>Ȑ GVmwmұnVm>sޓ^P}Xlwk/uЙ#|WƐ7i:M~75mqƎ7t>Oc/i|7u?7?[AmM%Tz]G*-`Lsx~+՛v@u\<*?1l]|TCqy:[l-8F{yMw:+|a`+~11'_An./m&}|͟W>z_w F9; hxuDtOhzӱrM,Ry5 -!홁DcBm".rSE CzMpYs+EĩeWWXݠIj4R kH%J] PwO6 8lpBTO$A#kPj-&k(ɍQGc6.R?ʱ*"ۼ&\6?i|h@3Nfs^>j%/OmJ.~ќѠهH(oir2JFׅAN̳ 5( ~ o>}% JՆʶߨtqn̐/V2⫋5]i'I=i~2+d[:e/ .栟8smL, X#W|uMM!h-' -:M+ Go%/h:er1joƶ<{:J!OhQA:$쿥3m}s3"S \"RWO [k] Gug/)fۃߌ9$Q"R`JX?*v6RB\ +1 QSuqܬcaEfXnm&A)M!յ;Ed^~a:.1|]¥υtdOMn/96=,uAAsr-&efRN&YЦs"P~~WY@;]V,#zg!f\r(dwC@ N>5S^q ֌q:mGqҡ`h=w Ӹ5Ny彋 GY-7#]Ͼs茍3o&۵9~:P&g:_ɪ o>_}W ]ٿA^'D V_((us?屆FԷlٮNR{eԹ 4V;_=2Ȕ7sISiF;l3tjSb;EzN3 ^" -^|tٞY~IdDS( k=g1P'T9@qFި8b'C_~}mկL UG;ȋmXRE_RG)_~O_90;zq2tM6S-Pimk\ێ)#eMGf=[UGݔbހ-M]q_F٭(cҦW}y/q͛(~,g;|mZ7(/ێA퍱m{SױhJz7vkw#yݾ[߾fkힺWyc }d~8?UmzUz5 㸙 ߱778_t;go<>zuj7ȕSę78.{!@{4(=^ɳu$r*=m9_mm˶^LIr=rS\dm.xHбod= 4K={I};}keɧA'mBB} Pe8嵧tyO==1,s͖~RdlSxri(4"TyPSTv` ~񝒒q/Wnm܊:@N<@ck^IpW,{j8fA^o|2Z-H2$⛲=4?y+W(左ű^?G|0/yO9[4XEo3GkJl,yQs~I<>H-Ǝޏ&\Fjyi*;lwF:+]yk ҫD$m+{:^+Lʐb. xCC5ft[Q ҿo%;T bum2zac;POTl3Y/>6hkk\[G56i8/cxm~w}9(yz9BZ"6PJf6Nf|u0j[qZN!in(RۇUXQaDja=W OTmm0>ZfhVPEL\Oٶ,G$#e/ʟ2q9?P0&6-c-أM-W~` ݲ^R%u~혅 m7M2;WY IYc)(qE[즲xƟsw|&/5EK.۲5o D]UX$0_f!ܛE_#hOMWrwNmWXO赏49'cAw^YkmWћ3569%)KɲϬk2 ݗ.яDLA@o6]ce.'.c"4ٽ(4~T4 |ڙ-kb;/Z}W؃ P~b26\:[[CO>' &.آ_ ..QO+k \.ea<qw1ĸ0c(B -7J96׶/Yf{9zyc`BuX~ԅ-<P<-)/Z1鱦SnA%7\.3 AѬl$M sFigc¸!S";6ک/D77JKVO5t0A9H;]ϣO "ړcye϶ͱ"E{o\WFO;6}}"I S39oh9"+<} rykb|*+d&뉃8|p#+N#hɐ3ޥT%I=bolnş7uZYoZK/В^R-Ɠq+˾Vx<~Nڟ_zߌM`I签V["4T]v!^G["f8W_L:ҙ_p6Pl??4f;4q&zӴo-D;ݖzhXC Ĵw;ݶߖfg;8nq&?mn'Mo#c+{o4qtw;c`|1߶dLݖn跺l޺'׶n3W.nc-1SwMuaw8V&}of6^G oev|.:/M*yu>>Y7O?;}=M(EeOBTVh4bL a(s|,Oz! ^N@"@/R>4[r'#drB=*yfa*@ԓqKtɶ2B$Is݆mCmރPmO*}+jzLi}UYUKg_SjbODwa{hz|lԑˇȖ-8$&G Ba/ި|'1\MK޸1.H ս&z୘ʳ'?Pd䅮5mt']B5׎%;}~ ŋC4ŧ򂭰h'm괫:bw>} Wn~@ZZ8J?kҫh/w|"G1Hk?Wy6qd[yM pD!9]bOWWk~X+vRl!O;K88~XC^'m]/޻ʶeg^ܛyf*4*dBAC AD:n :ȒKtPTq#v>oX+bLEwĜs1XkX+f*YE"A-U)BVyc*(cɒ\x/XMJ51er8J: ֹr֚SIifR6G/K)w IӎC:>$b?j k״ ,v-i $z_  [m.EGqO1QthGDc|m'- 0ym82/)j˫,o\cgkD`.aqlPYxgx)2>ЭeCq\cVunSGvqH*`Z'h*LW|3VpLHkfR\tߕ񦯉/ ɨuBk/Z1I N\?Zkm5(IS4ku{'rF 5&spQ&9ĻĉA~CGn:c|}"yGԻfz"?tA ^cry DQ s%M읻/-ǝ+;^]G弴 ڥO ڦ&`c霑7򊱞NezmF?Y>=.ڀ-<ł?x~^1DNݼ"Q gU{ZIFwY~| pU)kY1+ܾܶ|7U%Vȅ >$'I?@[[<8GP>< WLCx%ٷnRw '<1L վL}i-V6p C=69߇qWk|y_ Y~'a54?nGhыJ_,mٖT(vtZx&S:E*r]jGi<:tlʟ42o1~jcB*V޷ wr+bQKc0G{klfښ mv!݆7ܷoPc-oZٖ"Lټ|Whem[b]~jxt}xl>S甿 mb~i> M)lSc2{M[c FxXlm{Z(y2nD*81]xjZw]]amL{26'{17ʞMsmtȷ~o)#A׵QOKcgZmަHG[z}qGi 9xcM|jR>T܃1c/[wbUL6\N姭s Kal݃1洋6mݗ>o+ol2Ox͵#7,9'"Ѳ=`<⧟\?7&7͟Z'3.$2Jj{f_߾~{/~(ب橾oO;$C^vyzܓ48AɀNU=  tj$.DMiQﲔv}紝 ۈsb:Y,{ lt}̬>K-> amUyˋ1k1} !ԋ%[ŽTc/bnp*qU(o߈`ۊ)cʓQc X>7]dqd$۸ Rpe}lcsXOu!i'6aIo}g<.ˈƾ76@tZ졜^86WQvu-'*/HpWd>i)x{j4[楜:+hzq7бLb;[K킄{|1X\`GȻ/՘r/S4Nw,|oOL7*rK,#s{/.6-HXO6zrnD;'$*`rPK4c?e\< s~~<Ϝ?cG1ri@S~CM&N"7 Da^xp:o Zb WldIrw̽h~F2]Yxl 4MCas\s(Gkd1L% hF催6+*T֞~ƘF/֊buOѨzj<WQdgmr!B6,.Moqg3X26bZƔŚ1e[8cLhlhz3PF8A]zm^0R|l?gOTqk3&˘X .> n7y榝"9U>^mJt.OȤQ1D`QNJG_pa C]W}}!Z$WluRqD1zi͙ZK.J9&&e y/1S0LW`"gXKVe&ccp q\Ա^k}|8b9Ɯl?]O]_8ʎgV}rLonG'Bs棦'h|S:=^緷cnT޹sZzɝ<~E>Ml:#)xĦoOxK7ϙ&ƋwC>*xҦP;7=NV⯏vnf K6tg?qMr{bs= |?hws~?Va/&Sq1>޵ۻ 7gϞc/QySݐȘ`oyJS8gc?IA~[ٿ_E>S9nE R^Ńc%yrxčMeOٷ>fJF^Ǻ鹀_Tɪ =DY|sLz/-.$gWWidž"N?CqsMx7D_] U~9ICIi79o]CC[Y &.6BnRMUqD>-ڜ/(c_(7~m9sOy:~OƵFQ~Һ _-I%m1MZߋvwry{Ȝuyιk#wΫٗK27iCwVko+< 䃳mS|;~7[m+-]3nӧ<{򍧥{=ϔ'Rm9||6|S޷My9j߷Myrq./ue]îuۘDq>n}o{-e<ʗh wl\b6yߧ_*_]5|ųg}b=<|?k=7Ζ{=93qJϾ|&m<մ3z䑥,t÷/?ɑ{yz9\=ڏcu kДU7)&mڏ)O^ҵ%,om[ms۸!i0kh\}\ϴM~~.?|_ǟ%<ޟ8|+}ۿ?^{뼋p(|oGo~ѫ7]?N2=Zx+Vi20g m+`1G;m1"rt|Q:wMNeaָE7} BV͹82cS601nĭHg彳Ux})W,c-ß^_-S#nac^zeX5;üщod'}+5'JAυpAq]<id*j7md3rVwDjӇ!$J4˷ cKl/P]"ZP)?OYmH(ڰ")`#DcRу|66@ igףe11lw[Y%/a|=k.Cÿ.M=~>#%ZX=a1W*2?pD*fgh[S^x=bWt.FgM8*r!Oecn&C"цho*xFM$G]ބ}"rnh ߼;x띾TRΐuUƾ1vxFs4jl56H>Ɠӯk='*n R͗FMM8n>R;$Zt&$Qw+dH{7F.@IDAT`I39WHizDžȯ:mد(·Oϟ<9Ϭ`~y'7?f=Wn#ӺS%,5d7XxMic5/~c'r3%y yv]]ocdoݸl} c)6׹?%*ny*ԟ⬛ ?1~Ȧ8<#|Y 56"wo~}LvcޕX#nlv>w X=he\I`Gvu;07cEǚ}:/8YOt.v=;şĨB;8xLL S9cŏ,>s峾:H[}b-V<#191W7SB2vJKk c q/'3Y7M. zdN#+|5'薍IyraCC~t]sMXGߢNuЧdɹ?ư)k`JV/dLʣް!8 o|89g"(|0KcH@I 7%1My Qk'>(_}U7^Rj*4 Pks[S]oUi\ 6K%q4ԩߝ廥ֱ[ʔOx/:|.oHC;nS]ҦёW:Gymws_pVfQfNUvF.=^֖%nC>n߆~6?_ħ?twUQڵgk~4σ;}L~xhUxT v_0ۇv{}/+9޹{K-Ȯg/F+H֗ ʧf']j7K˭CM7t.5s.w.JԾG<-/6&+3R`zgũW?OŻ7~K[?<{?RRʹhޢ?p^Or 9,A"Ox֜N"<#;H=“qby&JN\!^_mp-[,+uz3dPy TdЋUKD) zk6%rqR;| o{l&\6;!9 r;+'։~h&*!fWrV=aNT ~OWl#5" z[{s:6$&Ik_)-joߠ?4== HrE}( .No Xؤ)ڛB,M)UuxIM1i֫ڊ9M+ݹ%%Ok/*nɭnmh%*-=${>  sw/υ,.t> 8--:c啋# Kl\1&)YR_#zc8F>zE,Vf^vN4Gy!@T?g}2Ǩ|(ryokb"b-k1,qV`.Xor~q:ȅO.6C/2 _M;ΫK|cRޘ۾d m8}iqFb/)?׿\v׵1GL[-C ̊AZa|/kta(5 ?91ZZQkAX1رԾҮ:><[5Oқ'Y{2mwSFjyWuUZSM5I\}~e39JZlrsg@U2wmc[-`e-JꚗMN2Wm֞ϺٞXXD6+44?[kW[J_"K{ OXIsč2.1?w&Rm&SN7[g9 ^k?Ee9Pwct"|LGݸiY 9$8B 8H+2 ~7+u;Zu[_&WO?+_>P_`pG2nb?cc'osy Ʒ׹˙~YԽk|)Xا9~f8Ω'lg\<=Glfl/؍fEIbsC4x\S;/4ǿ<;z<|&}|>'Bȉ\Gs~ "crqfd3?ȹ_F3^ G4^Yq$XiMv7yiO/{?v7b@i~0~ fowDK<"ysM209x]c)~2DZ\<>/9({K)j\)`28_?h˚'d2Yȧ>~izbeU]ЅG}eبD,ʔcmcX;c$fxUe6fl_7'Jd#6g|x^ {çKէiJ`=~__ׇ~~'O_9>:ztPl$rN[nbujLKKK=VڤԦFŐ+e}3>2.ݨ5B[-b^maop|,O᎞bWsN OyӾzSW o}C޿wy6CrMqZzy&mn9]cL}Ù-<=m4}=}V]rmSo27)6<yujɞ/7:n|[y}f޲S 9=- xSn`͜#6 קLmPjUv|WS I_7%iuO':9}Fc]m|=kZG_i}5囙}V/7>oamo_-Gf>VOZu*LnC+'OYL<{v3>IWU-ׇ'ŏGs}SOT,kFlԩCM=ZT1y_GLeZ#3 zaU,H\c(8cs66eķ¹Ğ^V,1mߪ (X+b 4z?WzʼQC+)]9pިJܔUkkU9D/jIJZ0/Ty}W.5T?:^v}?})ԥΖt7<9?k]170]ѱՎSz_)6!ЗYRCBXӰٿlHD_D(m|-t}?ٹ'E5 :YM_&n'eJeDFbD ZRH{s+(Ս]Ke榱2=LȏPvgߦ M'ǰmwԃi 7D 蜝6?0!&Sõ/!u>ǰCZ?vmXIonehgbO!C@9ǮF(r(gʗvǓcѱkƙq7 zM9_Ig׳0gC~w_>f:~!m=Trr5>gOd͗dV~QhUYPiÝ4W.4x)G!d1+0uO]= )sL:8;آMB6keuSɸե++~]q: +6YVx.D&v ^22bO?ƺn;T\Edp։ϟQ_4B{W|lÇ2-y軹)etϑ/:*7j)&g9˷ǛrSMMmoMT[g2 8W=wG=Zbdh%ɟMDsXrX=FkiSG䧼12Nƣ'ǒ2ݼ6?4|g|.ldŮ<{ھ|}OӇFdoyW~oo'V~m5`h&ߗ.}Wq%_˕(6hñrn1m?jk]2ؚU~b/Oiss.{G)/o{{xn{ھMj9҆>Rh|Ck),l)ij-z=uc%|i3vO-LJ_I>}#1JWRli77j2*iёڴϫfvl핯=6ixyOSX}$x\mpxo owGH\48W?p)L,Rǿo?/}?}?zˉxNnhCzaUgl@.K/pҒJrOgw60Iv,p i>,0x$ xj6+4ێ'l<9/hD|+k>rJih&1j[mT` gk4E~DE?ԉi37y򭝶]jd霌(M㝾weVZا]%;_&o.dbփՋieSܜុ#R~~GAW`ϰ^ri/}CNp,+{_ULF$Exό/wi5y!Z~c`sbq߼+bxgE18nF9:ܑc$Vǘ-e]y: >Db6)wK8&[[FgSHi[ڕ5+HIu :l*\Siٕym\{E! .15Gwj^Ƥ^mPx jwuK/poٵ1qZc}Ջ2~c Q0Y t O$c/T/;畎|NrN-m bQ5^xi se1&?PTӿ]eǾ { ߤ 9b_| GL zօk?߶`ajVUiؿeEy1Kn;'ER)%}; <W 'Q&H'e*~";~9|kuܧmp!YKgg@@ aѩe֡h-nVflß [^1FX0s"t!ˁiѼd[SwNxF.wU_;49_ Xs6r:^*'Vϼ]qM0El8u44NHl#jJ5^aZ QSx\'aH(Y)KzFǦz!zW~bn?k|漀$c_P!q>kzn42F>(]AcD2肶k5s,mbvyr74ܹ`1p3ΈLde@?2v%h!j3.5mqc*'(sݤPM_NiM_ck~js|cSd»EpU^@ݯo|>]nO,~nPׯl3Lc=NZoDoX9^^u9v䦭q9؍g#cuQ l%wcҮCȸV; M>ڦnox_;_r'1zT%lho1uz 6!$<gj-g[:xW>: <͘ 0ɕsÒBڴٻ޵1YϨ@K8g0_G]K|]Y)HÇ]. YO]s7tXDr\{IIQae0)39~aѧ=r6Đb,r'j%/U[ &Fx$ 8R:`_g-`ME{dr[b_!1K[/:u6=5r#:GcSP}#~s|}7_eb̀Kɚ T%uZR.YdV!SN!eqIb8Ӣ$=VޢS}Gm KZ72:j+O{6˷,ͼ1(퓗802i}y1|dʕ*lkԽQA\G+-#q+%{fSJ"W+ܴK ;śvK6ڰo879K::\~OۗyO|3MlO_fl]xYFFl/o<#sWױ/̞/.>gm_FOr|:ZV.gxM=w)?>QL>Sn濞ޜcb<{I->ʜpz~9X/ ׇm57hy,VsJo}Z6=^ƹam1=Ƕ=n˧>{sOۯ,Cxizï?=_oWo^o#`m#^`ڿ7D* {퉴q"I"HeEv o +4ɅTw*m1bMINItyQ p7>i\ 7>::9IVo0NKJ1o"fMv%u8!Pܘ˨ Lc2 JǾ1ΆeO4cqJ z@Y^M/cE4 9U]JLc}bBnz;r֎-ghc دQ^1V\8Ǝzd&Wrk$o.y]_ǎд;O[C9qX܄w䱪B'w`ƌ|8QvN6}?7cPBV|9q gZpTQc ]R8^h:{#~tJnܐ`\ry" 4 )q7Π'z\ @OicHk+-C7o%m)N}Q/6Isܹ -޳ybC{_^Gnw|.^;ok ͼ{mo_s]\cܵvDc*cR?zJ5V#Ugb$wJ$#$F]ynSGAY\K':WӐEy?PH˾O !-n IeQ&S<_c(1Yӌ7ǘN & l!b2Ak_ Z̻ػ|ʮ1"% YI+Wb8A墾WbeC ๱y#Y1yC9M+eZeFkXTrfs5rBE\M],lqF}߱7 @=. o>Lf"āQ7XYƷ,k2?ƘMޥH.1ƶߍDxRLec\2Evs6K*Z|L|r| \2>2?wJB߹ ;|HCw$>3i5t]kD1o *'~ BDOyaitLJcEۗ6cO v0 䠪:X>ƕggo؆֮_@;_ZQaR}]A=s~Nl{3wkSD2܁6vcq\565ڗ/TFk~@Py89edp2VN}?!fPywFf[{ t7^_tyϞ?]2q̧m-=-qh7>4hއ:Gp|;#.|*:d]:_'oˮang%fw9ngȣ&ϳI#v=ozĸs>S;vY#}:W cя+y-転/'n.F |Ĕ/:|W&b]`1Em Y6>YU;_~p-_B3hv&fJ6)cb0Yr"oI5@.!DSǢ;1Ggܪ(+./601QI\$X=f2zNq&_Xaq%c5F_Y-MLhgbi#ebё^QPm@saimN![zϻ7^uXg">Η+4MPB#}#R1ӛH[~:|}gcS߽P۱w䷦ɓoz;<{~i2m[)w %ƱmK-]}{Np3w&go,6}76KvMs,imrmJNk $s9:-Q.ٶw6n K钭=?r~Q:N|_klʩSuϩy.߇v3ؘYڻ|m`OouhwK#pa>whnۻ~|%>^^nhy7Og7gc_O޼;,5~*M)e[Rho;/,w4|%1FzFgzcC-"O}(NY\ߖn{g3nj-&h]&śÏ7+~?ݻs;=Z/=_8s Sƿ mrM6}QI}Ҽqh׮ !pFiXi!6=|@֞,H jL\9LY<ȹ(q!f;hq:dhjE R_埍v4/KM0G_}cvAy4(WBi/}-cg(I\NbIm}lљ͇4$8㻺u^u5Nߔ;kX;= k{wQ:GzKyƷڒ XrsLyyK+cnO.c#nAuc7vFnӥ ɍizmqsD_HPI)#NeIYϨ hآ^?ҕ_2q=t/0MW \tMĹcFo˙Xߌ*/Nyvn~93s}U&ϽM+;&wY2#&{ZY0WN{_BE//cUNLq^}2bLr-mڄ唨I'2.~U.qˮ_6dx<] _rm_mR](eI6u2t|/k /{7 p]2,X׌gPX|zo=|?|\il#P޼\`g|9MfⶾryNi%aHUi11W)Say6I6Z6M{F2~nGۊkM[r˳ɍCȜ_Ɨt¦oygR(*r5,&H;Br\buG`r)hrKR*SY]~fLm|~{ÝҴ`M߼87K߹9y/vI9]6{4^ C?c(J)S6Rm$\n8[:-O}hh7mdwɟߥ\}p'?G}GˇO]^xr*P+_k_w>HJ3"sON\T.Tv;zO2PQşb3ˋ G<,$ Ng -(iD/Iu R7IhTƿ#e lǺ<'a)"c/'͆Gbq6 .KKen.&9I~xme}Ͳ$꣇9iD"\[\\mA.G>k>u7Z$MiEykۊ8xl E-nl.wqTus׸m~VU:r"ܱK F*O+^3"O(ń\C/lg6)@?b>o[6fUv;]BM3q2.ǹP,T!޵26+#:Wh"ܚiI ڠmr f9+N4mxBnv \eD; uޕjkV&~[y+i@mtkYmh{eky˪ZP{Ӎ%a)+[,ˇ6RiLb }m ~eeM"1gCq/lxswb68Oe(Oy6ԯ=n;;휑 o|;x\O'Fx|>]Ƶ=ICPS6᳭XzU}q=# T}ql[?Qpmhw EgwR qİc\̸ҹ& %;DB` ޺ n[oƈj11Cr^g|fdͻ1ҍ]_5*,4ŘuvPA^vG'}{`u<Ol+W -1;5?uN]#"\b(zc٘jc8܋-ɓ"KJqKq^ <ěI4ݰp:Ymy-7nO oyR)BJ+(9'QWkUˈ';Ԧ&7WTUEQ+Y 2 _Ǜ~d1zDءS  !o7a0$o?|1ӏ>%ؿ~.L5?<]걶~ǃcl2}jr8|Lhqu q= _z#r;y?ݫutL9ۋHY1U/c+t~9m77{pPGeHP0K_e=/(Ź?k!}rڿ=nm"C+oɅUvǁ;G2aQ;.86#M݋,\69>C90Jç~Q;3`6ï~G$O#䮤\xk=?|o_?z{xc(^139*\;Mi:-cr\K\.{AQNjX:庽VG3%37ٓqWn~/ \˧=Ա妥BƎZkQV`4ZbX;Ӵ|:G^gt:-xC+F*w)QLCN;e<풽Vg0scZ>OޗyISG?1,vgpmy)1⟾O[ѫ{hkc`s6s#;.SmC~_u"?lm{j}<"\Nm}plyZ9O-ozGvs^<4q6q>?_w߾Ԡy'cۆ$ 7N)u;w Q 'sI^WNOBc.jt0=t8/V9iL)%W;q [ eixÕzULSWS7hhqЂ n* *=מ._OF_^nG+?rl8 MHL)B_b;f'<š@O^!#}y طZq'!6^`qs3K?bmyw/%rX@ y6N @ɻ'WShrzڶ.z<&}Ȧ81[?-9~cj?rg;ΥlMn{ e¯Ƥ~dℱbcZ9,Ȯ,y@IDATq:$mS&e㤝O{][3r=1 fc$sV_!QG{cEpʨgik^;##^+1S@_#듡 БMȗ&b^&Ճܚ0Yg5?Ƕ6t-1NJ9v/}&5k/ -p9`4k1"Ɨj4^4*b-]OU.PsN;Ũ~]cdZU[xcM-ⲍ$߫}*mm/aX֟Ҍjnj ['<?mk>㩺6OɌG/h'Bc"lA~tv$]WUxm)Vbh槴L8R}^g-b:T_1}n'v w9j"a[:>yugF7[2?2)ӗ̋+Qѷ|$.~\6hFM4qD@>{Eyuj nNR=x>)畖&U! 98 y!]'AsLV#JSڢXPlyt܄29ʍ3 Es]D~7$ ĕh}ژc1-| K|~ s]%dG._L]=%nFǹgFM0OS?8>n:q0~~l{T4s@y|f|b qzѾsC|yL=&ǢٞXF/rb^N0д<-fw˫'6r [oz;o}t|莫bK-#*WKڂV2Cb^`+菽]ﱁ_6`knc[b96?_zhXn ވE7;)<nir=ϸay{(|6⽫܍_~ܘ~'~t/wt}}xƸԦl"I->^|}3HQ:f;X6wۍydYo|A%^9Jb|/s1n,l{F3ws.#Ǣ'O-y&kb֦q>;r<3R9ϫtt|̼S<>k T_pCV>}>Zc$3ߴE+ߝ$6is@T/2f7%Lu91ZJ׾<W9h,HquRŽ2$i+:2H8q|yɈ"f ,[%uԼOc^1MVu^<ªx-4OY&^1ba{dɓ`GiG?+>& >-[K*r8|^_ᣟ ?%큥)fZm:r1S[2SZDS3?[kwm9j0j)okO3.k^Ik[jGCan/|ren];wP6#߾7)]W= XcClLkyBv/`+o>/cm8}_ c?60x[Vx՟){9^F6J4ySnVȘo>|Ͼto[alw8|VNyxF^mә#ϧiIfz&hr>=ﴟ{}yDk ϲ^l~m%Ȼv3M>7|7cSyqrSQx,`-SV~@cO{~M#se 5S~={!i7B/2g=4ǑC-Ui3ߗgmw⌏⽩Vs7e}y/yZ{RGIcѼ=>{zw/d<:e>:'?|5CUMMů$/fxrZ/Z3$8Y` ,Oj¦ZؓaΓ{lV^hLY.Pu=Q?7 \C %9w/=3.ruOY>q-QJosH=?P1?I㛶Ϸ<1mKxbkcVAGŝ(l^;N+ph7JO'ڥ;fo69T^ŕ21hiNXSqѽ[=)e,p[/'^Ȥ1Z}_/nOrZK:T_q~R^Uj0ػ)DsJY*ɋV#+=9zNm2>\1ob+\.0cz:6My/xAϻu2{4oW!B*v'G6_XMծm^LK*ei9,`Lr7QjkᲕG!q{zcS\ck|hs ? b6#cGAh׈zCw|D& sQ:lv kZ_$^%o=tL1f0.ryQI~S.ձԥV->#SH%~VÀsNFR r@0S?HBב$l<&Xiӆ#6فi7|?t trd=`D0K&8PsmFm]`[ʋb`idYK\ yb$ P?KW ]o{}#9b1Kg5|n hWD5v(f" M_g'PP#o\?$~6>x85iwc =B {o cWQvM&!+GZ5U qc7lAIP\mcRcV`^0$9.N:;}?w|OCw㟰~uM2.b݌8:n_6UG%M ni?&uO~;D;wscLuC37~P//i{kS6,) a?7qk {^qL&Uce0_j{cwgg\Qoc`FWnf>abSWl^#vs=ӟޝXݍyV7̽r_(p=w,T1o^E/\koeqWq:+ UEܰC,&ѯ%tAULO9Ie!  YQ%^!*f;8!is WdR siO1X'i*:m Z,%|bD8m /,{ed B⤓_)$;krҍAɩs(>|Ed>+'lUq߲%)l1T&jզ4Z6y[wj{*oL[{zedVM<yK|2.|ԍr*z=.8&b14lC;bgaSFcMp77Dn!03X,?9ѦGsugǢY}g3uFtOna87 .s/U˓wɟ|u\X"抽W+St"ק|(͇cT3w?/+.>2<mϋ=Pg~<庀ʶgD/ߥSoٸoKٮ?veK~+/)+ek<{cL,cO}k\~_PpN5*+6GIOڬ/"?d)IC%!w<=*$ltLȗ~mMLR-VD??/e&EVb"w!>⇲pX~Aao}[ d-eOȯ6eN'ޒj\4$n[5>1b;Z*4*hlTۢ=tq.0ݧ]>0#MFxx)V%k u?٢[d= E}$>'֚d)#bg)O||5*60c}b*Iػw6>&0V65mVxtU7ԲZf۱bB\y :W;)mvuL=8V"m,, z̤MrffkL)ǟ ͒Uʞ!V0Nݮ8ɿ' >g|;@\ZcMg5By R 2M:~I67$l9&%{|5p \';dfak+zS 3 >rA5d3WcUX:MRY,_td`,/G::YlK͓1FyDhEG]\^9GN2& [3׺o32-<66Z] X6¶ m)ja Q?-7Vf"˟0ϛP+E6f[n =Sw8MlOh͸MN ?yQD10>?xwWՋn dO]Ӏ8A, L+e :I<Čγ*"1ȠH/x@ 2T7x9Fz[|uǗkO}NC'Sg7ZsРcYҕOVg ݴ l y K C`"#4c2/@l^md(/KQ ޹>[-4间E%.sm#VX4bShdV--?y=𓿼= #G_;z_ E v /Bj^)l{[[m*׆y^s?2x6R(Dibi6ejn3}-/cyVwR>T^X=V Zx ;}_̒a62f;| A:ٮ΁q{/;XGֵzI~jrSB;n:o-Ym0>MK&R~NB?lIqn_Lc9CeϷχpu{[?ģ0{K<\~|1ms]| {#Ǿm_f_}۾>w&̔og9Gv/G/m{_:8FXyO}=̾>6o^o.Ϋc,mfxu_By_=MBmxٺѳfllϾm/C2m~?_Hq<_O>k_=6}Rۆo`M_r_#`H֫)~s\ld".Zq#\$poSByqQ$v]. } Uk5.f1>;xu2 FH!CVhFZ2W)W>Zf]iz- 9~['eYJE4O5;~Pz ִ?aAŋC?g!oí-`iaAt(xÄr{ ];6.X佰@Ў^싟X3! ]; .P+tik۪B8BШd&A`LK cK_eExeNlf.1 ]}b#WI]\BR̂8(&ߙ\ﶚv} {e4f].X|"h`u[w V3"p}sC-tS%t .) ROж#ƥcA>t`K;BI*O4P-3.u# RTzh[wPD;/P9 gtUvYfz #1(KlWW]oT͂^]S.B~;[{iTY& i ]>=;o YXxQJc u}3R }, R.y8|+zU6q Lhڡjq&cJ:؇oa\7L@aEvl=΁o<3H `<lN5@ ey.m.GQcIv !N|d !pxҳWrߧOܯŵ>yX_v\t !C8hB'⁕^a$3s?k ~Ypr==)!jߡm&>Nײ' f}a!&I$Qg }f]us?=őcm1S&߄4gn"J1ムqxNߓFoǔvt0lm[/OR"CYs~qB~[[}2$l\%s:o]ٍo$B9jOg+U\"0>1=6\ BCPPƾx! 8ƱO<9^_߭}rn(U>?$&Rr˛'r kwb3uIp_˭yV  ;c[+ L4s>WooԏpMD $@}{^C!OI}xy4!##].~؎~=(N7}z]wH%w/LtT9IgؑQwwhxZ-p|<''}|n|1f Ih4Ld<}Sϑ獯Gg5OaW_slk/ [ hޛ|"rTzDc ﹶ3~m Rg=}~uS21rW@@>\ \xM1~ :>Pv$ 7CX@|b:ηHߓI@8g;= ʧ=]כ ||: Cywg(@dNJ򗺺:fsgDz 7 |/.TV i%o,ٟ)JX6=( uKt4˼BBط 8~a A!c_k\@:@'-G9FtbFsßr>w8Mwq?ݶo?л;?ߘ0rsZg;mkm~Znfcޭ>v;wD,{uuQNoЧ69.{溑O>&/랽&ĞW 8g'K?Mw%3 [jѣx-\[=jwP%x˷yg[Mʹ[{Fa(O-*_N#fNZnt>g?8?Vo?oY#sx,$c qU΋/c:?ڋ%ju)i \LBd#pY)xF/vIGV vBeЅYWmrs[O^)y/OCGydɋFy+@)NJKjKmRy;yfe6.<.4J8"׻`~o|"c),6X,10! ^l4`KtK9Yi(ҀNolgq) dDu^.([TL,ᵰ> p>poC(7"[NzUs:F4zԯ(l+im*%e"-rY]QOrU4V>inW& ^]˛/1>,4<6ڈа>p2:Eeҟ?ʩ[iDJx.otIZb}^u]()6ƹOb+Zhl#Nx4&[>4DW~;c;elP/wު#C)YT m c䖴eLDE݄(S"zR}ʄW\ۺMGCHfhG_{mA`0{K$.,Cd|%7XHU_C3q`1R,dh %{91dm1@@@xs= U.O]HS8yI%Un tӀsjNkkyhE_}~ֱshD+$0eZ}1ËJUָT%*2'WՍ,sr"_i'_ulTZ86ϘgbLfJ KTn9x0ZĶ!+U>9a2zSH!ӪK9vRm$ӒNҲ38LG I\I¶ȋ =ؚ3#o?zL7X3~o2G}&S>짟Zt6Pl%W}ypӔny"FG(J66V*.^|h"}ozQM[tͼEh7q?%ط(FĖ䷿>}MPԿ$2GI۞z)q ۵$b*l+>՗޸08mhx:@bqI_b כ4HgƟƟnOx]:}Ə ieWs?·>9wF+/qLr>yȼnsׄ9uOCO16_ooW]Jxs#Abߑ&Ґ0q|A]^%%̾R>֎AorXιRuG$T zF#>7&Md_r>ɭߕW>nN |d-I}lveh32>G^'&=XNodR&\焧+ѵ| gqoZ'.?dUޠ2/Y.-@ɍB{h\V ~}f>c[#'J?[67m7ہoc 8 lsuޏixӾO~{Zm;~}?më _7ghَYsA,$oĤ R>|ӈL^^0z}$`rd+B{'MA'#q蓥*C~=2@+Xz?:]́㫯`g ~#xSz%):n,F\FГҢ؋~]S.xqO@xIѯtO&#C9)pRrN_%`bZ(_ ';EkcWHSsjB6IKe. Qe+u mڲFTHc٘s!@x=aU(Kۅa#[V5a;BE/Ctבkdԅt"pԵjC"ltiueS}+wR_[*7K\~ƄpĬe׏37Ўli\ g+Ǘ.胒K_J_].&!JChKy@i9`cL~c{ΣƞeifKNp"АI/"C!/3Z`ƚƉ-q.9HKB8.Ү򪼥7C_<ٓ(noI?-H<NF2*ܕ#ƃҊG'qoZ`Lr[m~T㲐{_cjHFY-+iўj}=nZf+۵ IYIuQcx"Xx|I|W4$31x'Z0!Y$% J;a5/;&mb@tB?tD ']! ]?G7M2l&*W_!'nջ81$8s݀n,ZcնB{,9#ldB';~ab"O|*.aϱM|"-EXoЖ؅WW}%cCIC&g:&S|CսvOslmSO}dZآOO'j2mnVcsU>u]Mxt:W)QU݊Nnm,'X%Q^cE^/|t$W15zdXM &2]ƽOizlLi3e鼏n>s`OZWM7I@Փs'# M* b<+uDHDY؉_/}H?@u%7$/|6 ^?~Sز k/M*D86}ͯ$s&ms56̖?1H]ɤC٫K/x 9n_ gx0vw>xWX7i> uA[xkyzi$sȷ5={~D`(3hy.Ox'MVin v. }cF yĤ>1̳ёq~qi$şů޾O<7 0<5iug1=i؎~ '' oOasCn}`yǘLᚚ+%K_r#_{yxm";7v Lr]A[ rL,!gfBv7S'-2CnKd1iҘ }#%]ȱ]hz6mUz|\jऑ6[p0| cYV tK<- f|'9"?)C| W7o~B)VBkݺ?pN9l|eZZK{W'6#HyvͧXSM2}[CNe)7y{Z8>:>Y~_ލ8]=ciA=a{ݟgR2kٰ> Kjami}W{{}kG~MCTRO}оv |ߵf ߹KƦn-4󵗥S]˷{cӶCi~tMt4cSߧߗL{]>s}4~S& ^שv/Qu?rz/ϴۦΙG9s΅_޾;CcF,yP/ͱ]kNΗ]1Wm.."ѷ&\봷s𴍜w+u.>ۿ8Y}=FS{<\guV=wNkuŶxW޿O Z͑_$̹P?R} ']qaN2z*\焍$e6‹ʦ-VdpAm&"`+KYeE)/rYIl2`߽ႈZY,rRѺ.QNWڊnr5!/ $Lٵ1|}p}.+Tc6dx~u` j/><{KÓ^}E?W=!Ǘ>䉶SVhuK ]'6th3vveÛ,Yvi_OWnEbhS.9PM@`_oG @J_.Yp+>yd51PU+E)nLʨLME^=M:`Xa/;Qo cW[uѿxhC L#9QgmY[+F~04vle1~zyKO8hבBr:-Ft!{I}Pӈku;>9 ۷xLńqElKa֯]TNJ$$ܙ6„&$ ?K{vKre. Ў N;4&R\sM7̓ysb%_ $ o/`Uvb.cij^L}VL :5goDGͣ!^-5 Sɬ0; MO RpBhi_niX!sxÜ7T=KXL#дDhȨVYؚ&#W t ]ʱ$rVJ18|P^|Jo:L,:ơ,L̍<=nR_j:]7vm8C"d9ȋ,8n0v:ߊ Af|ԝ#* UWQ[$ fQG=g&.QgS/$VʎsB ń DŽ)7"z2 øb ]Pĉ ?o%ACkd_+c_CM#/b~'3政 Ǐe[ۚeظ3ؔ)pl՛aC$n-yYdz\r`75=J8PB&7y-igb H]5 ,H'W$ Xm&c:*siɓP)t6Q69 Ol x&X qk4=>ï~yT8f61)xDrhUGN%{AW-~38 } xd}e}f>!|K˜[;# M4+g^'17$capMGw`/߽?Mvނv;$W$/ؾw̵ݛ |s^SGO8& $Пq#oo80qp ߗ\4eI6YཻuOy>/Fn#~@IDATvvpI+u$6LGc>~ #\NxW~xD| k679 B)o 0F s}N`z_]ϵ%O{s~` W6׼k>ox%-1;8_;z }__[tX??uo`8utVg'8428iOƈl:Fאx "J˹*2>8Ƞ#8WIOQmm!yVtǑN CI-HJSqfvf'칆S7쥎xu=i3b_ꔰGpc`Qb燧oW?:g7o>=H5g3tovQM"϶nmvZmkś~)ض/{SŸ h_.S9i jڀ~]s 6O-Wc:ܶӟm1YʧZ%,sz>7_ʿ5SRM_Y F6?f[vdyHj)ߞ]{Na 4TG瘶dz={)0\>bߕ1{J{wO60})Jҏ޳N/}{7r͹ivpZ>G.s_{,l%l+ͧ3]O]g{ON1lop_|ʹsr8G9yY-:e{>P-6MƧPwyHuӢSퟶ)Xcof+Φ)s9oWjhvk>iΚo?:0 _qU/~^w1%"um^\bxgC,Wlԥ\e0ϷVT0u!%K \T snE%/2E$y ;6℈0<)KZ"$m~ԺХ]]жTzy(Vv1Bq!Z/Flp 6$bh6X8ȅQC;j">I V=XQYbQ4< t&ezG۹l0 ^ۦ-X$'v06yi.{oЫ| >ȑ3k~c/*Aysu`~YX~ronG' rc c  ;#4`sebtGOm" ]*y=SҭGm)Tɔ%>E"L[(RԘ^O d߹%$>(Z^+,:d,AZkDe|h.zV߱xjk/uQ'9ƺc){^,k{JS &'jI yx.Ǝq7w,Q<_ؗKBS?' }cmbaUjnFnu3FkTCr, r/lhXw9lֱ8+ (#6"vĞOŕ1+jscsŚ~'*=c@۱@mCx?q zx`_AٓǛ<,tbMj_=:g_<]TSVF\A>1bg.1Ur\m ,c'5~MQ:[D`f+Nۄ$sVبgcOylZ*:9CKTv(rwj>d۩(+rH˹ܺ(=g:(8%үڒWoIz96}w=O{Ӧ\=` nH+ǥghn3dZҦwNzcCZ%I;2p^L\y~eҏ-`&qi4X9 X45%Iui.~7n6Z2;銤p |M:'xX9Γ@?Z4`b:h 9X:SFpݪZ\J HBr282(s94΃"-MO|<+ [>7,),6 q_4j&&3*ḼW/r^T?7(7h;&M>'nvHj,DOL73#OL+IadO_O"^,%:@}rq>% 5`xC5$aS|tcdC&a .Qr۸s6x %ď3Iaی\_;&!A_8'_wX 2$EউZA#=g.J -̱lΉh1t<~8@4:;CcIR]ss΋QԈut>>?_o \{È10VP} Mf| "pas[EP[=NKQkMOlŜo6*S\+lGwS9i_!nGf[Zmk2?O7-nqsw.tmL5 O?yy/}vFıs-ݘEv&CS~~Ox}-͟Ul(߾KGS?Β Ko#!,|m)^?O}`:9ܟ{H'ܷaoK#~>>Bʣc7 w콇}5&i|Vidom<#L[o45M}|:>=vk\Z~sYO]G{ ᩤPOs&ųjYH-n쳜gڧԬ=`l8th t'i mњ74&6xmtcqlxVɶCȾߺIg74vpWv.\C iWٿ[ʏ_>n؎Ģs4& / jsKM xy,b84 j # ^ IE5š{5 \WcpLZ:l,_HyREGlHԵəI_9wĶ ́oBԓ_c~%Y +.: 6Q[aшw83hM}kc<+= s]eQֲ,]P吵`>Ƈ>tJ45aOo2 Sy'#_ Cé"]7M/ [ck,˺¢-{f$yb߯#~-K\&}Bű|2Xȫ廘AYFɺeũb[߰YinܙbTxVo=>ꕢlՕ4>fq&ߏ"$ Ku1 .j+E鷦isZ̏Ȟv#O;ZVJA'ӱ22%ZV4+jH8J뢦1xf79$D$T6LTױgXYu[bi`* e? +McU{vn `~g?)ܐW$vBR 8Gg Pv~ ȸ`Gci(6B/.؍$zG0pК]I@6:@/t[L$bG3e|9Q~fXq^98isF–R칯e ڍΓ=" TF;*C{Яz`yK%1:j؍M)c|[_eyԇ@xDݧuh#㏺YCjgE3Kjh? 6{!KWc,rXC?>˿:(I߸O\Yz2$e&0 0Uhc8-е2 Szq%'C@l\ CXPҠ[9ͤm(? @3mЏhOr>*q<>[rϽZ2dZcP&3C^)B#kG@C]ty( 4eW!]:g8HNŞ"-}6x=#Nx@>kM+pGhk ePq5șFW yoxetR_yAO/]s*6|6 UHtF oNF[H;aޢc)#j"OM >M>78#sd߇' /i$$NGeQ&GlnYcW{~sZ^utlqSg{|c,ocCx\@:ykRJ$=5f n9sy}H!?yc˫ũK9JM .&cwqyfr0"QGIQ>P];+[hz`/sEЁp-~2`Qo>02'nԵo>0^sq\~l׳7;H9$S'\~O?|3o!Dް&<ߟPF%d;QM/h|7mѾSJ=ڿ( v^W \6{Jm+t?{4Pnr>2>jbѶvWVTSnK%]UDi*_m5GRRSCL{m_;2,ҭRF(B.dvkhxavrbISϦ$ew$gꎴ)l8;sf}`N|Vv{?_eO9f*DBm9oඵ{ӿjW֫0u}PEGٺ!PD<{^,Ik.lǿs -gF&뫲HD .R #"AV]&&qOK0[pF8:*=rG]8R))Q!J&B=m, EHf$I&.9MG^ i^J?g\ =Y1!ooU yjopP&VM4$.LG> #."u!E?M-X4}"qtքcJ+!:$x3nH<+S9H,}lb{{.o)+?tX5Qƌ>x$KCӄj'0U`;Ҧdv ˌʈ^.JUJTO Z#euǏvn27i=6]07Fd"4@:,-!m|wWeCB:{`"H{:˷㾐ȢTJ.[#h/q~Gl&rh86jMy*U{WhWcq'ybød2ǔ|9od9T'w3s֞,z !ӘXeUrؒrĕmڕquЬoԅ>p::]}`m8M+$1hsƎǺw'K8pLfx#ܬN16ێi#mQۧdSR|f@GI1U1_S;?یl;W;%gA\MI_0#񦺛@I+rPM6%fu}2^t)Q2ǎWlYsSVI`0 _)7IƆ.#KXuYMzp\`adΓėlWv.r8 9O ? fPCEB˘.!hM{SyJXפqc+x c1U}oMwU4;~1٧?J>1!7[9cr {n+WdOvZץ<`w #! 2dw<11$nب Sؕ}M_O+sOKpU9y(/k '<D>&O|-oT3Ǣ[:p ^4raF}t\|=:k~ q [6H?u8{~yxS-e &u7{x<&g8{`sW;&K ϡ ׇCǧe}2y[^E~mI r( `_1yywƦg/ȀC6~N ѿ5{ቯ'I{*ؐ6_+;޾ = Hk39xsO{;ߕ$?Dgx}]5Ŏ^ +&x^ >x4GjD2AN,f}2dOQ?g6@'0c#:wC Oy{z]$ri= X8}9Eu׾>( vªɛ9#:?7&7y/Oۙ}Ϲ 12tJ|3(at1kش]qF. /+??ΙDDzNuW^y'{~\OAgbOWxvԵ{2 Uvil44𰦟7 \ʐ| E:-}q{l}>P#ƟV;g_Ne`soGyASmouk⿭hvTej];x^]K˖^h&;c~#H]]NJLqTE<}h<^=Tλ@Csz!Y/)G8?1{s>r.O΁Bԯ_sK<9zߟ<9zsZMg\/xxnӕk851ey/3=zf^%(}s>HqeU40Gc烕<nD:P7yWƻv;8d{Bsv^4;Pc6O?ZIq-?|ov. @rbE>Q,r'& $COG wk\K #Ldo1 <%ϮJɚFg+&S$sw)c''$?iB˒BdDHa8峌S67B݁ v઺xK_(twS\ []nG#\`r_`JrՎUj٥aR=A|@xiu軹sq$:xSSj;Nsq$ya}QSOwWXu&OЖ7ď8R .7Y΅xĚkΒ#' C!HlohcMVoRY]G}iQ,L<:+OOf@.CxtWƜv /D9**h[ysz#l!b< kQ޾,rƯ@-ȧ]gt!|]&tDBbd$KI!,Vclb#.4nطvƮa8^dU~KP^?=;fUE},R>iݏW4}t9~?1>m%Q cSNcP\M۔'9}(wltWPOhqa_p|\96`uHڛWYV𫉡Hmĩ+Y2nĞflt2s܇JԤڪuC|c{lBc"rCq?1+O&qG!^}3_g>F=&,c, g+q6%i_?=^Ck4}Y}']{&Y&׾Ɔ&=2%K:G7mN7-,9G79}-R9FyBP~O2~bDy7?1LP dQQ8NHG7I3U>q=Oz!O>"o1j $}es..{vxC3O]&Op>ٛS3h{#{%IIr˗$(hUz߃#^$1!OCCUg; \N޽3Qm&9ITF+m0ٔb#&s p]I"U_~MX@ko_ H}䗯Afߓd߾dsί.<5; e|ux7!!& Mh>0޽ P'JrpW$=<~t/.^gd];ix_CZs".1&mq[/O }M`'K|n|xMﹶ{r -G<7z#܌褯=G]':^wƨ7hk\6{No*xhT tsxƱh9V瘉@xS?o i'&M( :vɜ#XcֱέegoO^:65h888W8'~ht}b9ĹKn|%!?@_FD>s%;|ު:1.=8!i3W3oJs.W~q^'||qP/ TE>' ǞiV9Cۇ[a5i|]:a,imSY?M gbC:i=4mC}k-\%J[@l=mZ}6}mO=2z6|d.n#R.l~>O7~a2yO)mԭ}82g;nz#۞ONh1n0Saާ(ʻouۡi?'e{yBn}-|?Ls/Dm>M ޯ}p\m|+p>سJ⍚|\z5Y<7qk16ټ]ilf;bkzp)&@nruxvWi[ZlQ@Nsz"WِR5"vG(qь(!RV^]}T*ԫIV\0sUrpї+MZ*B"VBTI2H&b  ׉=Z)7)9/ΈB{&:Nڀ6"1mח ɵh8Y|`YD.옰QZlB^dI7>҆c&cшm~CY ,4hf,G ~r9O2f1Gud ' &#).t-nWgRĚNѶBG[\SGkXf]UFY, J>7V`׼\jrP {KsWGӉF{e9)sqJd[Sځܨ@B2/c:o 7Mع[b{v1:\?;} GCB-Rh.Aa V}mkSO2B _y RW'#uUb uzIB6mrk{} xRĊB{Ojq\vvw;~e$I+eWD@2BH4@': 2\#1A״eMLFiZ"M|CJ~U1Sgiym8y'XJ'FL< ^C .'%O[ZIɨij}1|"oGЃPҔvʨ\=c+&yrnV+pdU 49b ^pߌb,xbF>vk1 }i JjI(L}}"8LƇƤc2&j~XEyx~<-R0u&9eQ'B (-dP2~40ʭ_3yso/k$š]鏩!1>?zK'OP->-1w,oܞs 7zNI \Ęv!.ܤh~7ꪲQ:c޺7, ,1q2T0[jCĮ@G>1#Eq*Ln$!/9۾ٹK NԮITw$}s^~+_F_5-W͗<{u6jR7~K'drIMo,I2^c\DD92j/&^{e˼~W_XSN\Wt|Wy&=,ş,#^'=FR7tTܱ餮}ԜCAƷ"2w> =_   )mmGB#O.ґ%Xv[6#UZssG̕>"s.BS?>Ë?_8<}.! >vf`ODXkr e鵭/z-mC}}xS+^'_@]z#[uS.7MSoqOi1w9ߧ4f4Fx&]y C$>ݺWRo~Z(]Ur{SKggl)c{ ~CgJ4Ϟݶ|J^KwCs!?ȶA>'`nҞӜn?G\噶u=߾iS߭D=_&wwv_gt,/'l7o1uӶiO'SݥKݵН_?~YN5^1EitcO?oĞJJ-N;BFA(cڮ|1vO'Ck`"Г-|]}7Pc> k hQ8O(gOY$$M^KYZϕ b0dj0 *.~ ʞp;\6n9s3@SFKm$}S{ЮM+M#I4|sIeֱc%YKb =&V`OA>>'GH3 57G8̝&.6^Gu3\P>鷙5ylۦ1}y/BJ!rkeJL88+yVvy9[%> y%D7ʼnY „IbO2::m۪>GCpw[H'hhBIѸMc0) p9ΜG$i,1 2$*sR$±_8o>U܈8udL˛#  }^g膖T4$VyrX EGn9Kͱ'6a=77oz__Wҗo^D17(+sLAi9`їyX#A$<o|sx$|M<&ɆWR]׾9&x7>Y\%Ci U:$yIH^ٕͧC?3A3yb#:fQor̛|jL&8A<xeEŸ[qP6 C9oxg]n {qs$w;wқ>>:i\/>2i[9xdQFWQ~tf _jo( -S:l a4郶ʮ ^0koyIsԬțgÏw}"Hķ֓mgV>(iK(Ӵqh])T[{[WPD(Y[ ޞv/= $t'J fFS7šmU no^MƖZpa{߁p>Z~l QoឣyJO*cUZᱲ1f{u#诌Sgt;Gk3_ܩyjyp^o{޷} sOqo!VVӸGx4 Modq/y9Cߖ!ξ9Oxw,{{O-nwۦ<@IDAT~)ǃQIݧTk˫W哧+Ss:^E:Rnmmz٫в.sQm>O~_UW+ɜ;<U#]nZG7S hk+9wj l8sP{} +}濵wN/ih(VޛloL Z'2{/{2~=尹oy䄰7}s!5M&S2)Io x81$L,Fۛ^ssFuonɿLI@|C:n;;G)OEM/:ΝPaUHͼIBkP,;mh2[\҉E ):%V@`Q:t1q 1, 'h׶9AH!Ȅ~Ȃ` 3jxbNQlĀ񡀴!uʫ*Kx2__7dI@v\qaAcB;lG}mk9vj?eY;6E#j2E?)1UUF۶|$8+%nN;K_+s6JQI6,r&iJXks(]}CX kqnOe6ωd%Է2Qij9 jXu /uS'ŭ|J +%]_Xyfq|Ji+fBGE?.±{46Wg=jϞoĩqhzݔQˆX}[_mAj3Dbcmw+ (82WLDƥM^e +CV[&QdqiXsWNS[nʘe_C\1Evkn,εT m& $ZvƹJb]k>t'6"uༀQn Ɖ4MjLP~h~|&{Iy-`͐s;P&g{c7JNAMȆme&zBL[}LLj̳5f};4rS[\݅&1ĸmgkƟ@@e^J&`u , >+Gsl !oғD-Im݌]e+y5^HPßB.^eO?]BTahGY lBI 6C8*07}C8ĝIF$h8 fqr^Xy.u{f5quox5 5jüğ>?Sqc?,t}=Rw}!(aj(%|zſ;ԝDcϊH$< >,q'o_]#p.Xϥy;] ƍ6E7뽌8x▄6#Gྐྵ,y/7vx>~_η53˓'97}cm5 !y+@2nL?篽dr GI/{1K fC IW>@>b.;YݥQ>o~媱'M= 9Y6o{;.A@{h<(C1~J$q,!rGIXW2jBd׮>(b,z=K5 *ƎN)}~D'Ř_޾&uc\ ~d|LǏ^Gʂ cxjq An$y fY[48>oyPncZc*Xx?lL}`#㫟PGȃ/\Ӽx_/V7|G1kqlYbM>nưGµn~OjvٴѶSi'd#h{YHڶ C^G[6op~?Lxʳ/1TѿzLHSv?zv_8{^S&uY>?=h<,a<Ч5b޶)WZlε?|UY{}i{O}Oyom#PO-q7'SD۴O w+ΐUIklݻ Dkv m`f}{)۔F˻ܣu{^S۾Ͳw\ˋWOwqMQ8і LVCz 1nM lkJa5N'G˳eo7ᓕ3ijH۝hA=nWv&dzɰTE՛]L|qOp./v㳃hAUn @lTDo&+: H8*^mb{>]n) и"uBG$ X]ζ-IgwXpUK;eKPd^yCҙ-Hc'g=*1j3[vP^Vyzq֓hזCM_y5[6Tk}h0L 6dtgJ~mǑŘf3>IZ#R l`jуhϽƏt<N,/Z-B9 ߈Dz $@B@~-y]K{F"ad4 7(Or^25$M)xtOMZs.qgBG$9WS;'>2M^"ɨ}e7%W6>/،::gYc̢Ov@2'nR^+l>' -3p]A 8-'lS^>gr*tQ\"xg?q,&tVr&A#^} gDFn71Nly=ux8%7;GT6O߽G&=Ij2^\0!}Kr=ˆwf7P!m$1F2[Ƿ,ni{*K'k$Q*jzm &).? yD[b㼥M3߅>5ZnRko|v7.ƣItVHrބf@ɩ3oBIЗy oas[{ņ}@eQ%>PS.@ߡOL| z7r4+˼7_aC*|tq /v6mEnIM|l&>\&MRV_=cgx,ˏ"G;o_Ʃ>F`"|jb[{sM,~!KXy|gcw"$<[6sZB?xhoK?(/4xu)}gɪ |ta:c "Swp$< e^?+2(^9V!`b?/N1;I˾ex{>M+ 4>LdiA`o(+K32^VP}T;0Om(xȚJrx{q)C"ۋ_yq3;ȩkAfcb+Zc6<[̶M{a7́;q߷LyrM)[M7uCXvJǼv\g/ĹVJi?ts_7^ Sn/־&@tF納dմG=W}/q:9j{]<{i+N|Q܎9ɾFٶ=\y_=|N[~c^)p7]ZiL| mtǔgۗ?uO{*߯mb\T~_|_STiOQs%ג\}=^kY.Mxy 8m/}Py%77x=_[ceq(7_/7u;ttkz:9b=3o>ݻ¿=?7"?8$f0hd$;N-ps\nmxpNeL`b0Ἑ()e'2y [+߬Ω׽BIKqzsHe`9Y6M Ivda;)NY}DH&%,m qŕvtZ8DFIX[e98VcR~iD=&|]JHY9iCjHFvGpоOm7B-Utznp-C<[]~)b5iYX}# o;TZfJhD,A8S;Y ' d̀UJ25z~arkWdbɥ;?ң͛N`XwVcLMEe72 w x6oBO+xijTWt& eЯO/zƄ!3iHYY.eд>+R,,^ڍd1nBNPPFq-kȑAZ_a[RrSLnW%ԫ'wAdu|.cPHq/S?2>}}#6}vmbB])7q`V=m2sF_>PBUPI73n;xn}5[—m OI .X2o33 )lGo%)V;RKs?Z6!]Y+rtSfcekAM=b 6ׂqdLXkDX+ࢗRa-qO|N+[0P!4h$WNV/G}D@i\wKk:OزkZz,hKџHI?ȿle"Il+0ژ2!MW}bFb$ K ۃs)TqS*AmT0GlRUP8bX%t $+_bk$(&2 1Ԓ'ZRk3L>7lT@>W&0c9}CE*vWEGTHX?&o9+/hg|!@_@^R'uvL8 Ff7]oPYqvvlzA @5ѪliW\K3Zo7&ҢǢf̙x͒a+g|iqr{y C_;)cH*>0%E~ \r7M4*'s}TtC aW5^{Ik$w$}B#,H:]nlLw鷮}+ڤV[˻[B^qg31esŸIFD ;>Cƹ; %YI74% s`^Ps48y+Y\6Vnx./#Fg΋/~=oC.}}űr|"l\Sr韈%K>-fsq\.fg`cHN|d qJ!IJ\Z}cl%ֱKW^4G/\HJ ??K 1Dߐx7$_&yox[ZﴳIn?˗0[oH7bܪ!qzj_םK1qe̝ʒ7ң6 $&|k|[]x1{3s2P>HrOv'>CWM& {7c]_z7{cx7c?vlqes9JOڛ] oAs rC$4n˸1b[I-:CpIQI đו3|q9 za]\W1w7o{}^{Q԰S??"_x7Xr5wNGz/kvU~a{Y6Gʴw[}g?8v ??Nۺ+yԞδl8SڴfS?xwSKhyh~}9~ H>Ƨ.m(Q+5q~KQ}9ӗlKgVߖgOFfso5X{M͞k붚->^wfGL|[ $fXt&m|Ba`@:-S2i q8AT'0 d&PheGA'f\]meJǽ콑%1$.poHF$[8jC:-nmW~"2igWeroW\i;L}Br햲<8ХEmy;G]*s/"lڇ,&Zʼne㟴3.~t4N84+(L{{H"r;YLȤ,v"ظfP珜-)+kb%oRNP5i@,eO+_E?\&0CLN>۷AĶ ɑķ:0HGo4-4gz6/Lޤ\3Q v xW wѐI!y9z]h5"~NZ]^D)FK0n %6߶SFu㌱@uchWM_\$ v_䎜=u˧Q'Jڦn7ʱ-'AgmQǽ:ZMf£rUi71dDđ7112ʔ7%7M&F_el I1| [)l?1pcO{TX5 ̷ C.H4ȿMTObO~8R{wGʦo,zWμi͞00Љoao)Mt[vF&L<]cu,ѝ\lcDd$`p au?^P&P7]"޷ycglJ*S„I\AKYǓ1G9<;f,qD]vO~2ƲIm<6espKt2zSIbSpԾ[D]~Lg[I IW~ q{F&A~ o-j%֯|8~~[&ՇDmxH*د-omsVGOmnV v]$\J/#voD83sIȭϑH-cȡov-vp)xvixq'cFay5jqn0mf5Irn2d=2|2~7_v

t tu b<春4ҿFaWPg:ס6UxfL7f1i"41oIg|_@R?rFjS mE+υ^C[r%yW ,=<J0m_SS3=?S;]↋T=鵣{g!27s:$.EE0Y]z|1?GPCkJayCk 7-mtP1s4N៊{Jܱ|w>էȳ,՟:Ƙ21MA3o<7+ېENuP>ozn&bIC{'C&ۓ7 |ِQlOuRXcH eg~xɍB<U8 H I8t7R뇶y Za\u~FR\tcd1ͦƊMgOu2 !f+A̤!mhq -dY[ޑ6E1@0 ޻![bWw.t|X@?a|p% ss\KclY르$[e @ĭ[/NSzPث_ 4o9h/N‹m16'O6)'6iB+@+R<6X/}shr_IlӿBEV$[؃~ d(:Iڳ8F. V W&D:YQ<mnV3d0:n̴?{>Lj+} ~RCWpgWXiIy,,t/  Sc'%us7i61z_M͚`I+䧛;NMYsh;H[9vftS>ڰvb`w iOE/N#~#.yScQGUg+cC5&bO1ז:O1C NКf2X|lQe?Q7Tp)ؓ*+9rڿ9Sw+MVIzc1IC,sd/p}EB::ObEh.{jLW~i$?K$8ʞ$|Cu?( =,u 7R7'ږN'y(z}y]%+Ɩ}X]v^ v1|,K&9 cI4/%n/wN#L7o4Ƨ~LXdLo1HsV|$ڕ>s O^oeV\V4Ld}#='micB|5N -g} maD+M}M&zߤ][NĤHޙXz}&ey`D(|%6å]^[CWl^ BHF16e˘uJ.׬I}8$7D,#n'Q8Gk Lk4w\/\^47XGU$?ǟ Kf"촷Kxƾo:t6 ~Zy.7}3op_Tf٫+3r#fR%|ܷAt2&|~%|;-$--/ȧ& MM*I,ăq~4?Rg546Ae oAG|&|}]o "d?|\ $3̷۷n%uw_:w?'w$l7y>7, {yK}8M;d^9^U '˜'D-4&Lڣ WF6"OՏƴ4mn;`O}A#[JM8GY|SxF) 8(TϟK*"O=k/Iqd#&ԛ!7WF>ḗǚsmA}r0Sx8+/.s 7.tf(t~DYJzi>JRy}ǐ"ZTO[,?N;ѳ1FY{Mev|ubs+c. ٕG497jVYom}U6 {SzVOFo+r[?k ߁>~R{/u{?Noxl0ҷվe>Gcx5׉s99'{qY/-m%A-?}yCscP~~pdb)q o߮f࿇/:ղn.N<ڎr\Cp k|ڊO;"=Sˌrx5PgU4\g?N5 S#)o_a749ѳm;:Kam>>Ӽx|;x?~/cd[&-B Qdb0r ITOtB&`Tj;̘U#|}0;9 b Ӻ#d:D<ʹNQ6KAA1n+3{&k&s+RleJݒiڛCB<5 =-n3;qk`2 bF^ɦ!rIJĊa[ICvSoʾ sMG}P.*~֞#=` %ጶF-xd\_rcVR lՠ7hp;Ax.S^į28L+ƌPoX,|.mLĮI* [ 2+ (*RiCf%NHduMKݔO,*p&v-tVɢ zNPzƒ L7rTiT6VJ>c235YQmś54xD˂?ث짉`V1YUbIK#g΅&g,So_M"Hؼr&DrJ.T~7c_m+3J6I9}r(/!W6쟍Lz=V$ǻDa?KϾ;zԞhP:#4pv:NR]{}asJ']5`㗺45kaK /FxJ2Yv~CCGV#M$+l OݻE?'ǩCYu$Hߝdj1Q Ȃ|ȉr30''t74}N[!1Ixm1d6itm$1y+^ҋkWIxH8rm5)cs$Ue/c#fvYk^j7$f6A! ]iR:?YRD :~<΄ZD> l ??U8DpfD=˱c>@oD&s}7YsH ˉkķOmǟyMκbi\#`CU[}d_-/r@|k0Qśȡnz}Ф4XǤ],^cm]'C^眃yc` &@ι>#o3 ty?"ӛ$ܛ&ΰIZ7qe,H!#ѾK^_*H_T~/!ox%//*%uڄ'}p ƿa :#}PV$M"sboc+>8xͯx0Ob߇S%+ ikޗ_]o ?b6RnXGpڱ߭uW~=X[[i B򔋓[L/HWG) yCex6֞WP;x}<~o;Wוw/ekݾe0uC$Zwv{=g/kuopSڦ4{FpksB~}6^s})}[_}۔gJ)kёiØ=WSp5 Zx`Ocʳ:}n wgNv =ޔgLyŸ+NiۦC+7潝 I K,22 |8&Iꙸ;P$CpK8'A',Nsŧz0IPUT jc4z };&S$Bc17呰*DG+cx,Z$$3uBMB!2 &=Nv ʦ kÞt=fU{P۶46w͸opyZ׶D^/5bkڣepI'yV-ѡʣū,9~hJjVŊP㱍8_R8@D:ZMA0&$fĕ|IA'`ȼ-{' wȓ $ɘ~dI<*mc"GJmW藘P'dC^Y2& gs^boy^CwĶP" Hr$bO«t2K̶0>\Hv!#~#.J M\.>}#2CO#kEe؇ cat&,`o~07 Gg`> 7 I3l|땶`I^sĦLDP c-L0Ή!n2nv WRk$*ހxzՔ+k"F_Qy}*Q@IDAT| thuIL&eqȭ\hg} `n<ЉCmX{ݪD˛a'^<6{Lԡ{ Mkd pu9juŃ'Ʒ+[P6/9G|O1TRlG觹zl̓bpB:^DlPȸ!P$Jse=2N^v3+O%#U>*oxJx"IfR? <7AiK=7NV:ʐܰjO}G=jfBffaK]nfiυ2I?CCw!vۋN63_&KEI/ƈoA~9y} HK~w*C|0쵐rS}߬G.s-3C 5deodi_[$ K}[G7Yt& z /؂cƫ34Ч>./MXT{I̺t|>17{R?,^ J?c|zّ s>qyyWHcǮw>Ha? r| ?Gi"<_+ ?'^>ܠaM۟|`,}xL&}~x≯H>CW(1E1KD/U.8 M &\@q==F/fVW= ;Y;3L7 = Ꝅ::q}\"˱@ԹHO^x |3H;C+]C| IZҫ_.~q77G?x9+cQ6M{;VfAnESb?~S&)tn*!\&EzcTSd"@k<,{\'*p4r[DLxH7}N\,\cI~nZAh~P7Ս;Ia'7jMF.IWВcz1_Kdtr]-/@C#;e5Ͱ7z̄T[BL`hPz><niѤWmOeΥ$7^NpRtɕL;opWNd]H%3K!Qd?!ѐPiZ4PcPV:t azO\HCXеj&l9?3 $3'&aP@#GJiBIFY×}&1s3[) 1{{ȼXPjǖ*q^^^<6hc8)Uʣ-J?nzI[t_^v'=V6&ˈoUU!D-gtVd9Vcc;q5w(<]C&?򎍨3c%@QIS~JziWWɷSVg&)|lby>Y{y".}H^9پʘ}b5e'sFh*UuҧC }'1Ӓ~C_ab[jZ&\V6'komA_[Fr~H81DM$k8kL Pr/Cռ4E>bs# !16R]n)-roH +dƟر=$c/ k9{iuk&j(p <ʒr}pKKy/R+?ľ8"3[XIJG$PPKuVvƿq':TOk'y{ݔҠٍkTuP&-5!4"hE:b@QAԜO`5cF) uIi]{YݕN[[KGzN6n}u$ ],ݷv VFaӵIl1uk ˱%) RWgR<v0?Mu3l- d\!Ȯ?pLtnq誃?.=!+5CEMA:[sįZvˋwy$}$w\9c#/yC1ҷPY^ 45o6kLƪZWE/єD47Y6+iw$,︾-clҤ52VC~ՇIKwE مWߴV_ih+X?W$wݔĥ˽*K]8bb~}9rG@Kf&ի]*2BC [.5K}$mс?#Im}F<~3\rz) þ&}+Į},ƨ|3nH6;$ v&LRG^{ȃei~|7CÇFy{:W&ؑFw|rg<@52vsoPcp_%Glw>oF:2 xЖzƇs|vR>8D?8n~ƹ0yC>dpx&<сv/^ǤUi'qE #8=۠8T+Ʊژj,sze˩VT"8ƛLJe>tVyd,PTf0nr& O;X sOIoNi{<38GNB; O+ۑCaG[_ 4=ou[iWW^aش/=Fsx&qI<˾\{}oqάIי^4yݽiEss![7ېO+SSS7{o' 5[ϑNxWCP? \<g{8V߶q{kNva{r $Og'>dH 'Crӎ ;Z'<(7ƒ6IM깡Mk4r H޽B$>KoyL&0DWp0b=Dm&+{PFu& ZDE&0h&֙kB6 ]P[ l'H#0}0\ ?IٙN%[ !8ʥ$$o ::y vQLK#>U62(n!mmX#u sb::VD9=r*~ɱUe+ ^Fv\x- q-+41"T"2nj']<$]h`3ۊLD($/>}26v//k!r,NxWexV9iZj j=-ƀnkR5:_]&vtXдxN.Ɩ.태 rnZ0N|yh$}gmŊ'ud%ko\W峁 -t2,݄ : =(җ~5ʯ'p_]OGm2fj7 0;*)d?}Kly ݌LJLJpS;vD=,F#b/Ie\`o^# lKMmow+xڄ]c\MGBDvn}euHxٞ'dIu6eij~d`1誎pڹ_e&^5D(2$,F+>(ڲ3ސ8rT7N2^GmmuWJI[Ae?bg5FdET&j->^4e,;M`gw%˶*"-"wO<&T(BޔT.9 ҍh}2⾥k"5NM~n%/ W]; Xh7!W{r& ΰ%e!X=4M)/_R __ߓ ;VUc$wq8ovp{I~! K|v"oM(7]Zxq;xYHr'9N[ܳϟbʷ#kuꚷI$!yԲ];FG62SPc7M:f vm?}od5qn쎨1-\DZ.KQ;):᲏\=W0R~}++-ыqL|#7؍! rQZ /ڄYB= p Oַi埶ޖcC`0dAN˚8~O^G^)/eW1Nxk=oc8Zu'xYklS WQ0 h oϲ&\S /Y]b=K_ӭv9/$9K;2Пu$^j \GA!!>u ]zjWeqmk~q>|X~H3bWg>K!LyE3 4X_5^Z+TxY/xw_.~{}q }e'r %}c 11*~:$呱#-* ,fm-wL.*=(tڑٟn jS)bWcMninGbeigI]ܪm EZqnx6mܪhdICZ[*pL LEs3щ1˷BF\8s ټi4e@ soMr6 KHh63,Uk1֩V,BFFoVI?ưWNf)U]xN037lH+`3HݭؐuĀrT-v oC)nVYX2g2wrs$"^Pl?FP7  ,Y2[)vm?Hk0ꗉx\s̉S}/:7c23Ň "WB>H^nl.]D|a¯Dlt ]I}Xf&޼:HTL @grR1m\_,8c#&@~[DoP?a$qEOuk&ke?W0_C&zcb)KTڏ5}}SmDaƭ0KkYR?U _'XI PHv~}$Lz_yXXoM]m=eƹK-Y֞oˍ}Q"*+DZ}`a[VU)tcL(2`8ne;@' qZ)[ v]D8`7qqCQH89KCs!]uthl F6ez }!T+|ܗ<[@0}EbyX0w;dapYnz&&2)l{$%%a?!Oz'c!'>;),4eZsL[~SOia.*u+ZL}+ - N o={'Q+R_%BI $il7رg2( H1zO%eru⸺Eȕq]t6:/UZAYǾTg)ծAFj8'c'e0Y’48QI;Ok\wHmx#vey $Sz k;|Ey_aO{z̟: ʾi-]&TQndTm2MK %'¤TZP"S$"-4X2bcN,1=hrdc4z}i ִeŌyPRJ y RqCI!@RsA]L#?o]}A=˷g ,'cNyo&&T%6.&C7y@{.!XHs߀W'~?>B˜y2 ٛȢ}!Θi韗$]}+g9[ٱ6r=tvKп&Ig0 Volt^CC\M@'Kք$yeuF`7 oK7z!n.m~ӸƜws{99Oν?nrYuhsߙ_ <~z>֮/o+VB{&js5I`8θ*G]z؊[[oׄ{/iy&p_B}>;>t`/_x8,͇,_ J ՞*/6Q:@uIR ,-V]9w,7<òNj~ɲZ.aΕucO ;Ku=cy 8rxg_ vgl}۔gAm}۔gAm}۔g/Թ򹺍V?ކ-=)o44sPh_ٟO>c뎡ٟi{ssu_cewjos =:&p:[}&=g{i—>qFj{77[ -Ӷqu4Oa4-kn{=T. Zެ)u=8B6|搆߹chC{5 ?vI$;oY59dNaWsW6\@v2o: NyZ)'ig$tI;O;vF&-l #Q < xw,ɫ*/ۢOB:bXSDڤBپ{;]DDpL?>ƙK-"Gb$>d جm[\ %++*>OtCƽ1!aUďoFOl '% = *<08PfmbeѲډdmĖ0;$>+&`sjHzY Gߏ\ >dxmbb[&Sr1nÀD^~Lr@C/ bêdc%umk-:e|E#p2U6J$< &=HcM}`±:+Y&#l )^20I|D$u$?|LtfO9kU2G9V/nX !pq!$L˷tK_"8n*r>3z%t`E\cYMz |+.UW W# x&\eD%m*ŧx]ezI=~SQ֗yƒbl+,p ?y?D96&C'ِL[ߘVN7#Ͽ#TBԇdo|N=b`#!1l. &kD ?\֧Xc'{4r*M{i5QJte?˖٢hoerJhBIUtuXʡ 2W},][ @l3 Y:!)]2IWP[rN9vCQ㸑f(:{uIߑ:QRj;F*9/~V+ɟ:,6߰M0ǎ{N7yI[{xto!eEVYMh+v n]+3' 9eT.qW&-zB%LxOX\B#ڵur&ik_}$j&77MO#o-?>n?0o `uWo{N|$kr ܱ>G>W0x}E1yUXY  \M=hWi$1+:|ć7‘ɥ/=yLy׼IvNzY.ȿ"Ilʧ z8?ChVﰹ`iW]hb+(4Q;Z@'EbtH?W9#P>cP8"zZ9+yx]( >B+rȠkS/=_ W2D9-d8| Y2! vOx;R-nR/doqu/¤h@zej,@nR~sԒʍz@g:bCݻ6Ygzu+r%IEEE]%KUuy7dSzu22=—:m:sSlg^>"%d-[mZ^V=}2z^~![I&kv{R|4_?O[_53?k~5 ߗ`9Dw.g9z}9 pЫ^)ZesjK!=?0^{;Ea[FS2FRYphzk5[2% [_56U3|;MۧMrLǍ\pe*V8tozjr@ h}&`z"28%pҴpQdUh]K\Q^/cr"uS2m\m=VAZiE.9DS[QCÁӶ:v!3D%_s dXeI{CRJfŗsq챱ۗ Yا=*4/}ϢF`w_[$"rP͟ \ز]lFu8oJ':IS Vkki2] KE8Ul#u^y31ڇ!%rL':r43nd 7 Nv*g=TRYuB6@څ~qǒ IeT;h6d$:o/j?t KƈE+\Enwwd95@'A0CdA|႗Me]JZGCy8O=I%sƆrNC`!3M+QPNJV@=cҒW$ȃqٯmn KM)~sAzHw \,ԋWm7TđvF-{)oaod(YZ)[ؠS7n,-r>6S>@t^_+uĉpTl-ou^Rn~J@_E|ۭ/K[ [c: ~bhV51IRGx$n6VO\IIDG݋/CF\cG(X35m? Ƃgc'iOx'Wİ]Xx$2C9LUh UNWbK ++]QM)^t2yMw5 rs83ҝGR*i36, } ۛ'w¢ mɫI.MɁ_:}Z+ļg .vaHVOp_*7h76kȒ $oJ\WKTDeƃv.!?O#1wL[uɓgBI|k\}Ez_ȍ醙o ~M,+~{_ w|~ii -4~Ï Kj3>$JbWo^S!*_S{ء:zu[iX }tŽw8GkM{pC[oŮeTByF1|=)o-?15Sʰ[m6׌ܞ+=0O}^Snw?z}c:^a{uϣ.M:PC@X0o #|7Y @UZgfkI?Xm@H0\NϕӜmvBntYR숽oɡ^Eރl?iʅRo* ^-&.`h"OsHF ^Nry4e0Izģ5A, ٧5ɶ$!}|4xѨ>9tDž|ec .i69%E&Ϩ[.rR:z˫hYD9[Y@ ed"( 8]P.\fs)y$+L(´t;[P>/]u~hZKA_yD@ƅ;uRcwDYC] 㲻 .`$ kA$6B|;Rۨ͑_x (-Ӌ:ef' dOуqOtPV}ChJk,^~!6X5a_k^@D&< z6!>" bSnp\eFJA ")6≋C 0_Dj< YtQ9籱(+he$'0hP Fkƃrj\F ,۩- [* , Fʢm*r!~7.DF/vi7W!>=a\˘_"}~S=r"tSӭ5 vq\mro0ޗتc5+'" w]2'2)#q_ѣ7t\Cy+oe}Y'Lٴ2L2F[9تrlSx>؊ r jW]ϼD6l E`ڭG$ԲK}Kb>:; &n0&C9sR$H;Opy'קs]]-ݔyiupF1 z欀K'$<@IF{rPƖc(K{qӠ2׵A`۴e1rxiKf >cD6V;?٠oB)TQ>9d-f=3sv9}&B4kǩ:ֹU?$\z a #wHͱ6(7Ƨ9MO:oxJXD"HPGc SIbf2[A|nWG-wεt_LZq>a#,@T{|Q' Ms|E?wƮzh 'd2ߛc7@6W|1Ncq{y2[s8$=Vqȓ>-=yVW|*ģIP;_g>v{ZI{o\cnH\bW ZE dz~&|Oof A+o}}Ot>}^Ww |iOۋ?p#7hkb҈ޝ/.!~5{~`,Ǿw^9sg5y<ǔU6i8+νM>mbM}}l3vo~RبU~NJcF9gdh|TF%(jz*)?#g%w?qyc(_S;۾wK{ܩ[ &Jiwy/nk5[epuڕ|MczeysL)M}j4m%|m;|Rm|?F_U<&sy~?#cn_{n}(v-OZo΋9ސsJSwO8um[O ?ZU,ٸDj.TVYZ'?mX`sQ `R_&Vv .Xb Oh觼tpVxg .Mf_D;]iE\tи'&:OȮ gO4Cqm_e5Qb_xB5g!BN ,z7MvIE˓NrR% +K[/oj*g'wg,]t}y@M&AMXJ,FݫEeAG>.집ru>x̣Wc]UK̃lE{czuS;ZG[hf1ԇMl \q.M3$$-HϹ5\d:B;QW2m+OZ|F*Zyk7ibkm^p^/.B* v?;V% LWC|)ʮV{ לp^ 2&\MT)ՙBssDyo"RJ9ǵJOʘEft%&\)!UQ@X_WnHJW'6v|߰d.mnǾs}@}[c]LchNڝ G S^hi}]W+zƒ8֥aj9TKǧ!HGE G?DS`WB'x9W<#zie| #~]xkĤdt; gENd߱ t:Iy ZD]<⟢gh0፣Ԑ> m`ڤ8ܠ 텵ןSN1 ?1y!,8c"$<OM*lLHma>y;ٚğBy\x@cl bee#Mi%n;@DyRCy51x=bmr2N܇t+VO4+c]!wM-yo_MRB7m=/{ 5$1WqNw߽+}&o5'\dz>dw߾#g$~fuos9&4}ض\S}3{^M .VsCt-'? Șq{ǓaoH| &4cA#&gV׏ #sZ/6ўD(T T#Ir)&b!mܧ}'(&uo =Wq2j 8V)oi|5Kl>-6oIx|l}&h_:ξMɮ<};}:0o&׎mN?`&(ty#8/hƝ7v-swnb<7n1+pȥ$9 oW_Y 7)h|0b3f sI|[<:$ç}My:mg/ĥ |is$. +ؚ44 sIxn,M;^u"vnu\Lc?wZ i?݂9E `?Wxo/wC@?Sdg[RGMΦ뾭V;i߶{\&j^dJbm wkoS1ƩӀP٠KP7RB{v;ٖkg{qiK7[=o;~l=W߷TzB{so;lm}R{0S{ةVs}Ow -0Sǰ3f+)ŭef<_{ vf+s}ڳls<ϵ\}߶vl?Wm߾olp_J\so-ϵy yqs>~Zg\?vT3HY?cߓƜxZ)gm ⵢyE3z7NԤu Za[k]Sn{1㾡]] ;-O`6YƮc>O M>[!m{Nȍ[n]I}T^{/'\|G/Č/>xB4\HD;bYօ0i+(.ZmCZ뇫K;Rp"Q }'t#2?M:' "CoUBpL?ՔVMÒ=qٷ:iV>w|gӐ?͔)胞[_޹9R_o̶M k}Ea;D'c]mٶ`Lo *|^$iKeT}B-~T $("<Տ?8`U_䴭Γƈ<( BķMn6$N^2OTyK'Lh'|+mscg[CHD'X}ٳݧ79nO=zPWvkXk`Dc0`tiS6@uq屪cF 3G0 ⩵%2M?n'_2RQ_pMf4i@?&O:~ߑˑ ĤG4;bĬ5m7;76&xώ7q<$u%O9.M-Dli{COVwm"x¹W?/$%WlsdrUw7ӌQ|R_m> ^dp΋5sn΢?gMoI›2=C$}RuIC>s{>\`B67>Tqchn&mm7;ސ~d?~Sycy#u yӤ(N&e.5;QP3L^w317/?up&'n\i f#;~nxR]djvkXO+|mp1'>}]y=ܹy➧m9vu-hz Gnz[~}}+r|cȏf y~;= o'M/XXW@_670PD_Pݠa{=:o^\$+|#70p+Ff<#Fs4)|4Sֻ9}yiR1lmPR4=lK\}O=~ \~^=.zOv~{lP<13m {/syutVXi>NǴi9vksKBO~~?2/^/J[x)A{[ ªp+Ph:؉XA<녻6@,Lqa."HSJagpg'N$ ,VDbYALMSVz֥ jTٖL]6x#|޶&ye9 JQ.qNHRiOQӲ)"ŕ$y_SL?ixup;]+*Ve |qj-2kGwx6DpkRSe9^00"63؍^$"ʡ\-գH 3<~(ȒViJ6(.\鑢rRٷx,v}c}H? 8;->l ֤J7jZCJbH[k9ׅXvf&*O|%KLHOG.+ִ ޶|kpq1__qRW8¾$r,D ?<sQР4n4J);K`j28QlbPZ4W: w¾nU,Mʭk-yu@w'gw$mIi.ޓBe1ql\;B >N@"1!P=M2kC8>Op RBo,g_h ?^O#5Q'ib6 mRʞ v#qQo ,%\/'[Wq*I5wth˾WRMjW4#to={z])Fintmzi+pti6j)=O5&Jۻ}R*}pGg\m|m_yNݭe{ë1kQ)Ô~J ۾f{c\{@޿Vlb^|<g=DI&Z=/Mc~yLg\O#:kvg׶⾄3g+ SisJoxߑ:[="޳=/?wFM==S=۟i?tOۦ?e[䗜ϜsL;dÌ>q&8xڽfsbYF^McMzX=SU sS32 [oua)nɐRJC`jRs|u>V~CǫU08/B /U $=bmpD>,I^)-^-r.@ya":7yT>¤>dC)}j't I`i.u!]sa 8C uJޣ_e'agMI[A$eVE߰`-@NG^.KQ* QP?'}M+Q\lG ֢wB⢶=[nO%:|ƎBG^'dGj.Ы}G(t0^į7»}!6^ZO"'!Gdqp%qUkNؑz|hم?W 4 X6CZOԐ/} ϱҖg.!k+eMg+ 任̋qc2^#[fnGᴋSA0Ln20s SqNFFy׷>؋t~`s5qL o wL(#q9[8o`!" ;GZv+â-"4?cz108e[$d˹v z^7/.Il#;ɉh}uCcs }LP׵˾?^>w$D? s%s:tq OF{QлU9ϵ$y4zhbظK"W<M_L><2' sҞ&71x'w3# ]g~M=xʧ![bdޘ%wyz'OqkCr-ċCD9$=@&n};4nH? # 2^|eIoK #}F(\*M۝邯׮OTЀ14\r,狿;_>^çw-$cuv`䞲6Zܶ޹J}_vPӯ>PdNo[׶hnhȔf~T;jڷ~P+\Unh$a7S#Xbf]-foW*f8lzsZ#5W,ǿ۞^?SmY?*|ҬMqcԶc3Ս>7 Cn,ܾ=hU A(S)^Mf=O<͡{nccnJe{8Tc 1WY(yM/S}y*ҿ^컱xu(Oꛎ_O%J3 ecc`~n-;mV=_p6*[m/;[t{of2x;mO7t^-zۧ{Z~_-&Ի}ߖ)=,]9qϘK9R>ifnjM}>| ?Zlg?mNWMiss凜Γ5ڽ%<^Ryε]C㺎>r9C-=dJVXS,[f)ļ֑?o)VZ>Cږ-{u(>->]5J&ֺUv_Lgt,ӿQJx2˰\p浚LB^\ɑĒx/]1 [-)t=YNKżi,BG *p' ViN?Jo?P4pԇ,( rI 6)odKHHBdV6e݊ o֧L[/ \D[YH͢R_GސB"3n^p`oMfKERV3}AȣW| ?wi {58X&)ڎN= q51Xd ^Y^Y,<vj D&d 0R @߰ĥFx7~L/[ uy=wnA:qg=>%T*Ay^\/k"Jތ#Yp8kʱZDa}ڂ aZ A@V y:"rABx"˴ۅea,?B9ovb }cKyʐmEA:' 3S:[غՄ#1ȆZF}}sYȅvX{R4!c-D3-w|"eQ6*X; hiC'OT˟,S?T,I6kX9[G'F;Xِ\$!l%n&nM g>U; F6nI(8b/U[b{STX&SkLԘ?A,'۷,{v|F.0+CagN&:t2_pXI1QႿef蜎.h¯k2y$73Diߔ׶·рN+̈́M#FsYǟ2u[^;lHwҋ7:6Rb_,[e&, Qm>e-(S_{7T+ !87SUUeN䲏LA(1+\੘˜/دMM22o"3$+4O+3%1v f$~bç0mHotAc8սy;suI^j$qu}GHNIp_hoqCO{ T(t},Tays2~3ǂ2y9`Eg hn$3&o(+Ix+~hG{4s0 /L*t1(6!%-?vThIeEű1M,}l4K PW$~h6A.&Ѱ0ɯ|~ſw#7c>h:l|sGyD ~w5%cmD/[𙛐 $Mǰ {/#,r5Wn+_^.;Mia$MeNt?KX a/-[hgĪMrn9SB,a|56t\?< EY슄bKn>Q.S 'I|Ln_+~h|@0ׯI'M?0}O&I4&Wd< b#o$ mnjFop|0v1㝯fY#]uZp|&kљ(ǩCJh idt~7smC׼{S?C^7"g2&Wć7!p%ǵw1XO4OK~ףzdLeOø:&7~r3 :W >m|x(8)ص~$qs^=]lXV~Ǎ#7/. 8W>#{) ^IO=~Ƌ⸍\ab"u8W9n٨}e{$4R ;ǫH۱VY[{Cmg;V{iH2==g;^ B92Lm{+1z ]PBm5iO}Ԏ{꿭?M}Wᅟ=gGmg{tf7#0gm?7#7g]]U-@C^Y,{hg6#a!G\˴𳇝Zu.omZfV?C/oġ/wo?_O{}}v~=#-=xcn^#Eɏ .% qB*)ŽE,;wա=*[eFijnmߟnlD~t}iK<袲$WlP>jTcxta&ęX>Yf}/WdE,R¯A'7M8=J31B0VQdا.B܉8&m_løEFNvWk/z>Sˇh.lR _e*iIdu.?ʋ,%BVJ;E닇0G61q.#.[BiKu<* Z%2a,L 5+:_Guf/H_clWJ$cud-~so3f\ ")3,_>Ӭ-4~+͉6ĀJ*7/T&cKkfivC)w[@Biŋl{ A6Ἀeբ|jW>Ndgdt miQؐ8T"y c.rW9\X]B2eXkxw?"SО0J[2N~BC1*G~K#n69.eNa!bB"=DE,O2ߪyzLs{әV&m4 cOGqgOo"m̍LKrL>ǝ1$cZx.tx#kc^t/r5Ӥd4B$Ck>Q|8]1GMJ0ID rM8&P$m'Q Ó m/aŶ"#=g#B:ŕt$i'a#plw_;ʿ,:KTDƞu[2&c,(}񟋸Ϝ|+-mLD$ W-#tM,:<6Chk7p刉xw/xGooxP"sߒgڌ~Gt}#>8y\`Ld~Ovlqrѷ"O|5L%o?. #=L<3y D;l*tU08c#~B~}-!31x>{Wu1}uX y2ϲ>wн tΏ wpP-X7L}5t,r}hҳAﴅEލFкQg>̶ukm"s=[aR ÿԶ.c!mStrϺsG۬p(J}ElGBԞ*%pp^_g_߷~_<3տۦ5{XΧԏ}<'ұ19=xJ߯[K-O7t?i <og/շlεZPxK-Xl{>{9~g]Wog/ulϼ͋s~;纝D?_"`I6 y}贈xOm8eoo+SkU󕪲XϗgJ8ث)-^WoxtiKtpr{X碳\F.r텣…NpJh޸cpXKC jI:mjCދP(kO/r nh "04q /^D^Z\i A߅كn^K[JgυmD lJ*,΁c /UAXt'›%zYyG0cc"]FO![m@j?tL@t޺4jC KuF_t>!$ :,KNfח##R@}SZCgMlx-Λ)A;#Okա^Wm#~"oasMW.6(>a0 +'<ÁYx]E16]o׏ 6hghhe? N`,vgR}ހ£z/ G5H)_ M-Ƣzp A}hI[M, |iOPepWB#0Pwnhf5qz7p'F4M(XbD{:HE3SobY:͇1`/T_mq-g #oˌ 6)WZ79`/)?E~vܦ/ɣ2|NzhHq7m홹^"ď/xf!Qi)[O9AJBpw5O2nM$!gvF8qeZ`3kG! Meo%7rP+o߮*z HN͓(9J}Y 2 il-&1,cg.Uwd(q$/p[%6t*lbD^E; ׄalyH$E9G)Ѩ|g}/}Q5S8APSV<#.B>YÙGd@v.9˱zCe^2ա#h(2)nl&r}ЃMtaX@IDATl;V%yJ]#r}F{+tn`3}vJ]0CLiC,R~D1.S"`v_pX 0hIY_ӺiEtyvO|xj_!epCC #ijvY2[X$Km$;AuswaK,ǟզo}2)'@JqQ?ncJ!4l|BB)"+y8E^S>kϤXc/{MSSt^>{kʪM:nMRWWyN&?|4|:Z GO k;( x/&S*Xkܼ ҿsUoI.`܌&=}uO$T}Ͷ.|+IgoЖ<59zs8e;ps٫/h7;7*}vqp{\O ]H[Ɨ6ݷ<mzmw,JH4F;}N{jszA7HR'jc؅n̺ %dW)|r4?~>_}RÁOq._İoSJ_+>蕾}A? r/-mѕі4Gm"`4^6}m//!(ѿVO~Os ͅfygG^kN߱|K ^A۴?eq^{ Svf+ #ok㻷̾~*u[]_pu{󯽷x;ۻS+D67][P lEj`IIx|]f77Wˆd}* 2-0U9X/jUIDƘ5JhZG4- cQhLCK Q8!7AYD0hVt6bOhdk1Tuo\WۯυfMYܐ`ӟ,Ew9ٰg.Bզ4E[|\T!  \%t#ʢmҐ mEܨcmg;/Y?:,=cןQX[RnI^~VeaLdeDTΥY8e11yzluuED or>.M%SY6]`x6eIB—6d/HcYNj;V)76]]x|9l;$6h7?~wc5e-m3-Jj=oj&s hU* T^eW?z1~JТtn8^Ro펽)PMLƏ؁WD~ cFbiK\m_dt"Ǹq%Ib}ʢX?g\#^x$%d:I&QsRiUXyy0A笈\i<Or4RQ<!ٲ`46A8hEI|ǕV\fU;󂞶 )k5rd.d*ha M 4@ǑJ6A6Ш~כ+3'rS@[x6?Ң\3# 5׮y%vMIXȍ 0t5?@IUWu?x͍K{HS} ^sl(6DkoVz^ןsZb |i[n"0!- wqD* |`GOkk~5Һ'lxNgM8DwC8 (nѵVks)%KO7= λo]^(~rD8[m7^6pqcš@Ff#Lݷ0t.q6fL?rfn'&o[ϼ֧\}KOC-$|K^OBޙӡ1ozύϥ)ocWB`+F j%__i%ym= }!701l%l ^7"5X<ŭ-l+FWKmmmkM#skV~aA٨?M VJ2x+C_ř bݩ{,dn({>lۢB~GSjT[{0wd{-;x#KG´V]s):=#>8>m{k#bdw{~ցgNdc(.#x_dޤ>pݷZtǦžN fQ/^p9{WR$Y'RI6<q[ y?m{*Ly ~`g;=pRx7SpcԟGmrCB l`y 1{h t,*\_ix>v޴ dq y{f+~*tMSK᫳OiY&OCNڶoxlm|f/d{j:zMS|_yOn{|#gz}'E^3>d0y-fƵOǓS׳s[tZ wMV,^&bqf[K;iQߤ?_*)-@u7y>}')gNP݆`lza='OR뼔]dQpBr-&ƛsh5޸{Sle.Na2rh̸T,o4+4 Duª ^L1]tNŴAzх ,Nf9Lz$. k\ĺ?{O.Օoq*,meSF*UO-K+*I=$t`w/d]E)M&?-P@CwE?t} ' ^:,EsJ„Şzj@zJ;~~D^ &km?đ4lB-y$n]L< ,#yAP\<{#Ow[]R'^cR^KQ.>bG^Cwݽ2M=Lԃ .OvoL+=q)zg90;enLX1xMO(~c[l"1*m9uz?TZ{ pN=OEH*A\@+Rүw6fO|K}l,)U-!ݸJ c6$I+ū?*_R̜ZS߫:w ஊMc~iعPw~#]{_Cf?Vq#t84eUw&U5EMc@UOz:2Iߒ¥B\zA-ѧ_:ckieLW!m# U$ss'IaGsm4J/;u>i6tAF! _0C0}iV.cOq8o¤}9$]W) \NbًUYVW+}:NN5ۙהI&"t "|h! %=K*>/ *-iD'/s_}pJCڑ{#6`݊?srK\zM>}[y0Ob 8v ̏d28LT{T^$c%$=yo)S؛v? Iyg% =D+@;~"Ͷy551D&nH^ytEn7W9K?q_3O?!t{W蟑Ä5O~&qBou&:\b{t3$++#1|90^sGB7ѧOLJIh/g^MR$ͳ Ox C[-7]oiGTWܔuK"cs/<%@~Aί$ <د!N>}Eo]`Xߘ@3O&ϼA@H1慼[d g lzjܫ A"A?}3ڸ\ؗUl&>hKL7*'7 좍E> ?#O݋y2 ^<..7߇nBx6 =RlƿVbcۘfOP"es'1gZߧx˼L׊6d;m~iO}^2z9s ߣO7בdwzdH#86Zh<MO^^dwͬ̓=*TVZ:T8~u1&=.-V'p\V~6;@[۷ȯ'}13x'p&[aZ 55iL-~1&i=哶q&@=U?p>\_IuTs}YLɞ'-ϓN9חw_7I'rlz_7Zέ䜭ϕ/Oj1t>|&?p[^źmmϕ K?4&'M~Ral=}'=K? eҰY"e &MqJ&׮' ɤ-LyBqs.7KyLHYSÞ0QJz)zN/U@^;駣n("di&6[aP,`; CY\Hj Ϣc)_qk"MFZ#Y`pBNvʭMr‘p"IS!i#lSNC7|8xe9ysyu$JKp'aȓG~;y$O_[xsC;SWwk*"tcKaŇHJC=ې?%,0i x5Х9ƒ0S[MEɏudb3oHƨ:4\YJ6+Tp$}(8vĮKXuBhڏ2,D`h= ٥2X E n(# ɹ^5q5j Ml=XI!o?15>5ǟܨ)(a44x'lMx닶OU/:Uı5g*k G9kS{FiDմڈy<*#}}I0ȭ s9ѕ~qJӶo_O [9;ZEZo2Ok̭KsQ._dS)/)xp i.U4SetMݠC:\0!'%ՆsmnPRzI_YhL@~mϽQ)?z+Hpȓ3큠b;T4Զ*W,h[T^"mOk+W{ALB!&up, Ħq0ը]tDe֞3.D>D/҈V(Z5l:W^;o_g`?I7TQeA/ Ճr}@^>~i?2^EXP'o7 w9ߐ64!@_f;Xw C.zmxc vv*yn\$ qdž1*=tw/?qY-gSKc!B QSPڨ+߃#zuUh&߿NUK#O3Nˇ\1./oJ j`ུ"Tо˷ֵ;@<{[=> i1+]d0}ᷭу>W_}s|+G1jgk 5~?9zw[|E>8#ڷd_N5k7/n߇6M`_ɇT|W+?ϔ =&vyPw ui~|-78@K]}b'8v w׿?^2/ 1Dݠ~ .` v .wzR_{hz/~X^)3v C7Cϝ/e~} ʱE1#3S=Zn*[I[vJ )O[𠰁ܤ[n60۹ִR?}ui9&pAoП%8HVܹv-Sj!=ϩ9lfxs}9}cK/%{>&?߹=yoӜ)N~cK7cOn~z)Ǽo9Iou53 xO˦_*:I.O#xƟVO6KR)p\UogNB9*M#ys-9qE~3.CpF5>.@~Z,1%ڲxy~O\{kWn-/n4eB)OseSO|k!)o;.195 m ӅF JE$ivS$ ܳGHP56t4|M;R nThYJM'ש/}0dpGz"Beza;&' #ԙ=WY>Er1e2D\ɫxԅ|U*qz)-\u)ZpMC[(dP,(&d >'۴4}^ uА #/.Njw z^ѩgu,7 w) iYzLJ~P~NrA:چ?dhvPZ«k So&9+<{MpvNdzuՐ2[63uC;lpL >bv´ :喹VWd9WMBa]|Wt KI^rz9ԇ.C6yE0xs׳ڢzyhTe5m0Y)gYyiRm+8pr.e[GOo|u=+fz&"G`87텢c+Oi>la G(mGsgYh/Zҁwuw3HYEJ(o:(BGՏ:N|F]N;.@y6GJ}chI:䵹BaKI9u\h (kFQBrʏzțH;S/'|iRy](KgVuSo;uF LI[&ŒX&UtN:@iy"ڵؾʣz2WA䋒2xߧsLqO퀪6\Y.\~K,j-=[(S8wJ~Iv >Ce5O0"p/0NTMŏ&@Idm7d - Y B,p|Qo7O{Ec?Y`T6SZZ9pڌǮqr{X^޹?C[䥥#Ȁ B-Yʶ:N>'s?g"/pⱙ:S/lHe2˳< syu䳰V>$V_cꄞ#\E/-ZXsn6s`}\QƇΩzO`۝~>`˫-; ZeJy`z_u߱s<ʃyR^Qfͷ?D)sxVǠesa%y%yd\NXVyHL.IMpE`_;OF]ys]E,#uyCX|o\+;x}se/zj52Nw])089;WiY=͙MtZZMG'0xⓦezW) Dˍ:Twx=pãEytRiQ>7䟲I9Z䯞jMc/e*ll}8NGֽ~;}d+>ǶR9?2Suީ)՟_yhwfSʔ~?)nҡ_;>#a\>|b|52+%#&5ma_;F4#\h]4duro"G-pfڕJ&z\P)țuB%@L:TV^=. jmˀ LB)ȏe֗4Li'<3sBr<Շ;|yr+CN2,-Rn؞|vɃܠE4 ߥR]&~naeM)"*E<L o`Ѷ-+=~W]'rX*Q8*@hY~iA i n+LDk=&Wo*\xG&eԱ oUμ*Mm7>'4xCDԝeQJ"^E7y d*SS3ʂ }mpAybƗ?$6̿*X,>wԗ X)G"cAOަɁ{de9DIm6ɵ[Aŧb/oPQsMpW_، xC>hyNpz=i&PhY 7e^- !QzmKU.dm.3N+y* 9>~`%nş*}.0Eލ`3t|-"yN7Gٴe`{i٧(I 0\?P ֨okipn7I?z dME\Q(?9*O_- B( n̩t$d=?ǯ8, !ReFPyr Ǝ>WC0~^ ×G +WC`WXԔC mHx!~nģ݄tWbGKGJ[lQ֌NӽwFwѱ%{la/{3y*7gQ3m\Sfޢ QvJ_f'XI^ c_^Hl/%젞"{gG/e Z︸=7WC|IÇH-}` GGژ-Ep5(1Q^ ˣ2zG@E@ƽF0<py#'xt2Fa;{_@$}d8w!_m^t&^}O :^@sgj{oǮn4˝~<`GǧoET/׶y}-5\46l3Nޟv6M'yicwg_xAܻ }]N 4#  KWR}ۛXAo;3dҗj TnwW}CyPUBZ7-mЫ}\A;t|48mk(iʡJ+v{t‡pT^C> s mJdLP=$/_@ʇ9ҟ nڨ;~^3ɷH`T *?UI| gL2=DO?e=<_}-·}ǣw؁h|#Ax]z{7ß5^>:Á?9D!=vέ5?P֭G5#-~u4+qŽ^~[ϗ?}_F~o~]SWO4NY nȿX'y|cٜ|Mt!+_9"|";Mx"e^Ʉ.A~VVͧ t餶pٺ¬ʣv`EM5`C'7>zl92m=e('OϹ8oz?LeӹBNJ3 HgrWWp?3A|)VMpK Hg1GjLqi4 hWy.V->=D ef*F;Dt/0G97)Z~L,vrs)E,GonjCOMy,[Y\rU͉,,A~rXQΣ<CGG HbyvhMV9yEsԅc[qXn %m ϡ|GStbQ㠴‹r'px$dY]X.NJR:+nuk;r0H000:&,DPzS% '/a~ZgW6A3L@@ʪޔC<9\z$z+6~oNBHу'ga|!(_[iFSjG%ʳ1_{Mnxe CZ/ѳщ`oҠ!"FcerI jI<}{ #Me"[g+-\B%Pc7]^LdWo3+CLX) =ԯ&yJkG(jOLӐs`Ĥ3 DT?zljkw7;`]>lj;,v^ޔCҪ5 'eP;Zʥ-]zp%Iyy8ѥb*rmbʈԉh|fG+x Z%zz~Uiv>;ypPYrHsTޕ5஼{ixAxA%{&<6~F8McheP^ 7~þMF48uH{=艾g|;^L툕P9Ӆ}z+J/^Hܭٽ*8<9wƷy(D\Q~G|WFT_ۛ>*oз7HhtPW0)ݼ vuv+ tSst?L觽;y[vg+̃AP5-/ 0>|-ܑO1`/-zw 9Zt?ʑ-SsC#/ؽ.j]1'7on|%Mhq-4sYlBP9Pa'}Ga} tiNd,\# 1ooc Z ZWs]=>0( ~@}o#|EN)X=}la@y+ܷ!KSkd+ijwXTrwʃ |{׬ckpį*pr4=6e@;pẃN%m[}O6h]w_ه3G>Ic;p j/˨Y@W]sx]<EOrus#o_nßq~vdH7kO{=Z7פ)bC9 m)Q l/i[[f?0=GTSf:6r4/q }aޗaMBsӷG6lC|UM-@IDAT5ՅWF_<{}shY7Iem;NZ֝I7mjIusĔl7\l96[n&͚b_?0e_7IOaͤ7}ݖy.lu7I_I硹Sg*{.j`<}zaMjS>i9t,1y?{&)V5.2O6ކßl~~`&M%|c꿔GޖTssexm-ѿ'?uǖb}c=ܓO=@jއ{^a{GK'P z.wΦ ߘ2wL6u+k1w9g 6$Q^B6okQS;9jը5~}c \ x,a;en^v38LGN/⇆ofu./h|Mp"IB)8Dh=ܙLG 6j ǝf:H ^,)LW8~B#1̷'c+~}g@a%mlnSeSO G9SA?k%Jox>_CB`ajﴉmJe_/h*"tG_F3G9ᗖ>#DYTZ,?9Xt<:} i]H;ۧO9(ݱB}r"Ih_ul^2CV*)2@;$Hd=+=N8 BN}hwx|jk䩗W8 ݃_ !xJ;TE2+g _}.mABwzw 50V>ׇ)M440.pAsi"/cswc&0Я?#&3 z_ ;yU|ڠ~V8þ7J78gX+3~K#v{(VO{F@nߺ9+egvck,m7|$~eնwX=_xmqt/|[,,:WZFZyF6q_,B=ﶴ`"`;\rF R߻XeAiDE/0)ߕDz8A ^)_P]:NY3b\DHG`Qg8GiXZDg|$𙰄C'-&OA;k/ ,$^ )RU p⣼6WgG T[ з>Rtm袬AсzC/ Wo3"E;uߨ/@ݳ=m]`,i?p?87kL R |p_Wy`CF IFxjXR S\Gp@igTcOBZDx}??K@:}W\4CcBSԛՏD ny(igywd}Fdlijm9qM"#ڷp`NK>}5 \wl+=F{L\~;}R[򙀞}VC_;yq]6}I?o.0ryV 0k%u[{Epz)/Xߡ\+|!x|THB8$n)CtP kjhWujrMw$m=f)_HMDZyHs] sH8cQqx 9WZ(%%쮮gjtM#B 7#GI%1*H:w% Wdž`D`)3*D#y~RʧC{e@M1sk=8CǶH/Ȳ sĦ%YI^rNeO{m4gJ%ն3H˩%ї='/4/լUdJ;c>ʱLOfhѷ+^H9+w+wb|A0^$ KD%glP*&$6O@kǩvxd jtM`m,}$>!B4Op 5B3hl5%B BT>E~7IAzo_ckH96FZ<[Oګ `;74crvj{I2mM`pKS< oSNG8w6lX#=$,5`C):}Vx쩍3SNY_2OlAyԟoPSa1yVqt h{9>`KpO_?w_>1X6r^kBk~4z`Z6;fȮe} ~u-Uo_ Mjm` Nه޿sوuk|H+7-I?vʋ_e쩟 h0q&KKĽt6L7/ξ#{EWP]l w|c p^}z{ i)|9!J2Ħeo] b1Çt7rGAC;AOWY16Bz7Ҿ,M1piЉzĉ-||E _ŵ" <>@ `〲"=v#;՟;OƘi-M@=^>ASۼBw]o23ο`w߽?|;zi>"lB#ZX?mp݆&M>Q`ޒ+.[]SK}g@:Q9)K!̟ !O2JdyCIUFmϪǖvýjY1nMw_m]DjTgOKahn2$\,lKFʋeϾ~/Fe+|+>k[x~w8^DU0=85B8c7fVҜwckkF|Wpz~)ǎ9 #Їc-js.]T[s~:w0ɍp,9|9S[g 1ͩ}:|S(| /~M~h >0eߡK?6~QC~m~ֿ>T9:jkjo?Cr]Gm< pCcܤ̜)_fh_۾?=O՟lp;-osT2:4_3KKg5Wp#ʼ;;dm8(sK Vgޠ<蘦e|N_\>ΝOZs;]c)8!6-4Ա{|gc^RۖląknCcI;E*Wzgn|Z~_ |zhdm93rN@IVv\f %[j oh# yY& u PιLuoJqHd<;N#  ,Y<.X}~_4J†^|֗pTd*.n$:<']% -.a MaSg-ؠAÇ_1pqԅS.n4xit9i@L='Ahk\TXjf (1xc0k\`!(djrS._e'yOm'EF/* ,Ε3hX8^P#2 ¡x%"S*2sn xv]$o;2m|K~WyhzjQSp+=p;YE@l߿\`β|o<|ZJIgwa9B߃h+"{E9z}n.lyqͩvymCX.o#D> -0f,8@ahkmߩ]WToaȏ ΘG>) iJ@XQnzm@|*Pˆʢ]/%(4Xج /8A`O>_U% ?P:W%0JiGPYHLCpnGmQ?N?"/?Fϴ_ăG6#rƓ(us۝4Kͣz2tcZsMOatJP< }eԽ<'u3pB:ʃd/"Iq跘 ?y JA ~x{$uPzѾezJ\ ٵI! @E^+O{M>JEO{7Z#vW,|';EH=A![U1!: Ѐ|>/%H{fR>0%C}:uH1rGf >ĵյy90ՇpHczu!Gܡ#, SpJ˳+phGl3 ]C#(1w'Uc_SX 4WXki#kFO8 +nSn75tc'iN#pvXy(`,_*$6G18ݠVODtՉv>l]ʓJ;-(A $45Q}p6 E'CL+~^_uW|mz>&į|₟5Yrk4|s?c/"}q5 [ 0!LpKlN|8Ja.y@J/RO E~F=`U$>%AJ~YQQ>Y  @#ADFK}~.9 :*;tw[:<@*pѠ"Wy+w $dSns6Pj/~JwN`^ՠs+T}~ cu.3P{Cun!V<ǼEoUZ2 m?+_oivW;p]wЛ7I ྡྷL}-wɷBϱQn)4m;'vx.n}@kʗ׽s<(7{ܡ.2s5x wK߇#}SvӵI!7lHxt^ÏoQ׋,mNM=~ɗS6.Nqk$ \d3-6^Y#^Z?m͇\?x&bOzZi79}xh[yk;ͱ]* gt_V6 ܍T6q`Ƅ ~~VϤB˟+{V3&juk`'>aܴߔuu̘_[ 馝-7~n<)cOgϕ ~NSPߎS寔d&>?kgHiwlpюx)&?;wqUo5 v9@׉XOs4̦VD¼CV\;x[b*J&ns,V{buN,EqoiF(+7?RcPfj$՞Nhj}x#U|OlpY6շL.^zAowx߶l9 wꋋQHgN01L^#0D&l6̫<ňp> !w,EA4őBzei2'H ǹr!\5(v-Yp (*CQ34S$. N+Q8|M'f/'/GĂHqw0y7&M\ U(,kMDDKJK=8[`2NivFic':Ep[-\-4W/|yiC#lG,K!go5\dQl(A&`ay`pȷ0? CSz L >!.tWڪ?QB+ `\ʹ"jZ!1ЏJ2h74"\@%w*mW,a bTN6R'E̓|Za E2Kf z CSm֗J@;oyXV 77bkWS$х]$aT;KSlomP \l+{;^턇bT+ ts$ XC D2BWm|Udb)gwMXʘtH/fJ;! b,tKy ap4:O&/c$@o~TNCWfUHkOp6ocLNR>1biUѦ%J~ԑ8t{h[LqG ۤ;kߦþ8a?U~;0c1\LȟI`~DUYB\KSAEn"ÒrV864:瓑败.B3 ~}J '2~R,mN5bJ4MT!)5-A~_)z-jhj %|ĹV&@ѝ~})SG65h7(%O H9S(lx A*>g IRL<ՇX=ħWzVJUg@r vJ<֍Ɖ/ /m>8֊yA]2}F_#A=o_eC"ocOS=•\޵{wLZ0E0S<_Pw%z^ ~y5jٓ @{-};7!;Y{&I57xUe`̭4>-u5}x1J9ݍ:y0\Fo ^GgL_Ia+B֎6^~ g$wAFе0wc · {s,`>uK^:a J|P.}@ݤ` e_Xy(R]n ;lmS;Դ;xyy~eMZmpKvǝ9[r;t"$`P|$|2,,4ݕn/~uսd0; ҳ;9^!|GCΗ/_[h_vKReGk0~1\/a>cI!ߨ``%t5 h|s|~]>@ y@2>^@7os?z7}:aMm\S|C# kbZ`wt#o+Nc:2AJPmۋ ? <Fq$x slˉӳԳSHێ}~+)48S6)kۖ+c,{~pN?g<V6ua  SN귖 Iųϟ❺IO|z>XΦc?_ѸֶfPuuv'[hĕ?>-Yzu3#2AE,/v q5'0lm+ѮE6İzN"&W~j|fg3(>}Dg`&u>z  N^mxq/ZMa)~˘>;7(գt-t%zhe,mͱ)8]>:ik{.*B~S!s J"j6S˿x"GTQ}o?3k,'LXItϲ E&^?N͛ȹ.b Є >?C lc|F{VN5(,4ʐ :-: R˶/ E1oZ6( xIuH8?Bpgu$pr+T>i|8ڛu_C.HGԖK'b]ݾs \wKi7U!5 fK>chbe|5Mf^}1;凼;seW^ KY#߻?yL%GgkU/k ΙZ'ы+z:wj: "Un;u'wrg hcDH2f˱L_?(++g cAV&&nF{Dԝeg="2E/S1_t7owறc+)_xso;xɣ{_AO߇_+v9×B{E6iud;L}X$Nz//; ~O=+V{AF^C뫵ԥ]4WdV=Х:?E; lfYOm! xJtf uA/l/]72@S~ 'W 64a}|y O?plsg8՛:ts&}WŻkK 5⭎viț{U>T <M}@‡4я3H˱H#`OHiow#9<7/MZwms qck^o_QՓ;/m yUt}KD}ӊ=DKx'xy}X@?<{tqǿa7o_s~?k*RP;Rfq4jcJ EB}|'L)5BzlgʭԘo,LGju񱐫lCVۮPh*ţitZ\[}:ڶ[f{[͟^늛1_eZO~꾜ʽ喭G_GIWZ'1lKe|[4bC:6,&syXoNΧ?o-r^5>{N(m] 5!ߺлv]Q(17#<]ンgnN[z aVdLae+޽gA߮W#1ioέFr;*tiUjS4HxzZ=}3\] N B/X Ygi뢚8}ηFgoejdx&'Yy'̬38amwժW:at0\BWen`.fFDO=AEyt#)0 D/MוWQԟgbpRr@`Sv}ix_,&Qf& ,F$XE9ģԉp\HAa6]pEe)Kq5<(]Oz[zjMTR,teAX*w` /'}W}(2Jo<#؃=FDzs Sh@@7 pdqDQ@=}G@xEh|WT#H[[In1.|u갓um2v.KSgw TK*%>smg.g!Y.#Q7c>}ׂυccu6ׄFĿY`W_]jᐖAdr~]&xuKY^yCӠ m=~bez,=SKf޳AўRԮA%M%(|։bCA Gq,./-cG_ !K`1Ϩ#PP4YNC>o{)eE>Mr)O+8]w|j.jpSD1/鷿/-..<3wmfl1 H__lΡ=à7ji*z--g |#X=\pџ5@5 c2 'ؗ!eQ^.>轌`kk):2Q#S--f$]ON줿6 sM{I#Sv>` _TgR/PX[w7;v jWI:%?Q.rKu3>0zϷMd1(n-!O_sG$ m?>\eΩMpKD/m jz+[5T˯tױ þ, LjwLH]qB[^4J;A(zr{E7D(5{c?!PIZg3_u&ɱMdȸE|;GY}TK5W)nȽvڡʤ٭/cWHtM]Qu.] J5(m1G2 n -y )Qٺ̛GvЕoPs{s~;Zji~T?CXcx~:h>υ+s蓱@=sA]tTW|+ݻ۴CC@g 7ԕ{VՏ8qI3^wch6bh[ՂI}x qŇinkbW<}("X*#o; ^~g Y}r'['3%0ʿtѧ=kwٝ y߀{[_9N+Oio JM O>1mGb'}3.:Q?jr\Ķ|@szO.{Cy{rB/==9\޾uDA6eZ_{0~<5kcrK U9GRK<xO5XrM.±AriHox郔n)O7}~DۢU~-4jr,Rjys&LLն~VbSC⸝S+Lr}鐖7}^Z6> YC=Ɓtt}}~t6]a'ݷZ]jV^Oo#aF-=^Un}^͹փeKܗ˿1'}?odܲR:1%?T+ǜιk?Lzû|4/ysPm=xώ۠vpO9i~G)NN =/)z?߲s)mrК?~?c:1mtp 9z{x{\Sjջ,2/;޻!/k5̿s w nq|ַ Dt}h<؜Sv^nx映P[?Ʈn+H ^\Mu'{W-T^zZxפ*(ii|/ec  Fx# =͜!w˳sdS8w:y\DP&L^IWLN YcVw,8eQ}đE1pƟ..*$ kͩ{VQ͋˅2FIrA)&@`B'0Җ:#Br_ѷ@2bU% $E^p'RmGvڪwm-|B>ža>[XiepiiGwJ2w5C~—@aXk03hl W.C`#xpԷ |#..N 2@vAn?F5 o ;_ ,G78 " r""obYy`\I6 mA$jG2.nߜ@IDATMv)I/]ӶbmLGuЉvL_Ƕusֆ^┇ >ϥ% 3c mEMB :Qy ̮%;.W>@.pɫx^^sA?@g7- }m.{Qu@.m:O>b??R ,)GّL2> RFd%ziu\Y>)n}A^8,ZLxw47g3AI)}A“>yM;`׼f֕Fu%}7mN鏗N{')m 0> X‪O:C['Mx6dQ/Ωޓ]E;L5:ȤpЂ|;xeO 0MKO^!/n6/zw3KJj8E_U6$@z-00|!^c9O Os)?{?{5^ &Ksn^zhg@% WAWT>k_o3)6,BtՑ滁_QwΟaGw%EFAny@}dk>q+=yA>.>?I bg>N7;'_.OܼL]䷴_GM+ݱƷ=u-K5C޽{|tW?7{q K1y n;$Yz̬̈#aB 'нGwq$H Gt{2#3"}+̷ǎ *i1v6OܣƔ´͔ a2{e9 Ïڦ[yqN@ök "ZfR[L%wc18?σ|9Th?2?'& ; ^]kxh-Z=|.#ny_/?yY埣^cj Ǿ[|>CJ₩U:RsnO~xMh-5ҕ=_-- SS?X9{!稶<%i~Siwr[pt\Ǻvl2eInǛ;%MӴi{m?$ߞ?z|7x.O%fni>~֯x919tm]\>qV[6SWvpp?L>)x\>x1?wJZy>|k2 ~>;S?OncӜ71?sNs؇wF]or<)xYLS"_tI.`4΅H0J[,1O-JiʏE|$c(-ڏ:7DXQ6E7AE׶` ;iU+CCJ˶[H*ηD1qƛW7}1VnrQꎽݍlrG A[HAqA:?c/e>kq~' )7eYWM=0dr22Cm>I놭077GցPl^ot#8O{džq@d-<Ü&\ wKݕכ$ini-a?;6 s#En2оڕ-Oq{&V)^T[ξJ/OyJI_ѧ+Q7G^6Λʷ~ =6^?:{S=KB@7F$Cchonq~9';Jdo5hc@Kw :f-~'Ioqq]Z&ۮy%^Mqη*ߥC.BYLY^:Hϛw\o]n?rAk6׵cʍ)͍,hU(&r#)&W_4ɦ6̍D\; [cFgIJUp <Ƴ1SI@W^Kfp37+8f]9nSωW Ƈp]YW'13 (Kk>c\h[x= <߽}Û%}G>#~*oZ'0t7'ų1O}GB}79D,=?}͆}w_N|ػgGW|l쪉,7=M5-ִ< =٢6WZZ\ =aIʳ$JҢhkHvORQj8Gi+VҒ2$4~蕚oҺE"ۖ#~1)sk1|xIRWg)]mm[q19og6};rZǣODr/x/h'Koh5_t*,#Jiݗ?JKKamm_'> O=5<<'<3|lm~c;);>ԟFZS67]j~ ~c>sF=Ok't?ʶ?ױm37~_l߫so<GGr(4MG ;?_:V?k/ixim]Ȝh9Wr~^~{^,O{uPyr"s|?"Z9w.᛽:e-7;zR;qN7F2|ZAݚث{:kj*\{*/ h{e]T,gT%ض}]cXdߓx/^c{0wL873bD@bLO#sMĹ54S h0m̎] c ޅ+C^OyB̅ 8I輦ƆL7X[=DOR}2xbAupCGl+v?l zFOʶ񋎺c`GV uDm ^~vP } +&ݕIWST]٭Eƛ A$B H{0otSdqsjs |Rt"^$'0%CbbۤK'ĐKW&MO_XIݬ2]Cv+a )3^'j_k3P]m.Wٵ`Җ<4 "'mWo3Sꕦ/k9ƧP*Ifnr1O|o E A_eDnW8@tÚjanʆ1l6k#uEd姬70gq #vǷ8P*4]wS^8i:fCFMG7iF$ @e҅0~441>AR+RpT,kk8/24Q؎B6OC. (JF?iGlML3x)fm&sv؇i2 VB-#/$cOG1,GA9ڋr<9mC'1N9:\ Ō(< l )TbCӥͬX 0b>%BEiU#J;q-Ƅɛm4tM6(6 EjܼixNz GhE/˜kH(o0OIUK7 ekCTW6<_᫱MC|Cybq?k7Cw-x?,r˜̦.dᆧ|>> ֲ%d)En.铷r11Dn{?K~ң_]5_Q^sӛbb*MQWԩ2gЇ&*&6QwlyU!?np^j/ՕLVpMx ++DB n_( 2hs}k*h(}WDZO@fyj9WKHEȱ(2~6~v3OjG7(sontQŶ %Z 1NvYi-='Na?O;y~c^;6x),ulOyuC {6Hի疍ti^dCuOU0 Ƅ'qviKNig?!mʟk#e@r!|#WT>$FgW>qlJS_:$J\(ĝ}N{Ӟ'F|ڛMh֏;aoy5~- _{ڣubQhb#OvJʲh7itm7'ͷto^GN?1>{#=7 tZ^Pƍ+)j&m2#PIC ~n0'1UcS}YyGO 򕎖}zWin4^+/u/r~_CVoZS?>zqcb"LL7 Ci僻jVi&e_^O1 ?KkLK-YDڦUS sGk>ːʥ:kGj?ݲl֤ٗ-]1Hէ>$pO/:Co$}&~_jPV{cb[POv!"oB c"y =ɭݗ/|~3=1;7oaum{9K8|.?=^>gКVUnNO $,?gmO.n8\AjtC=]ML,s\2oOKe˶:OpSqL0 A'D8RG ܹ[&c4_EN&h_ޚKm{yn7V7v6t?ƒ?_.wwHN6\4( }}[υ^[ #\z"yVd")eB2SI3J6ivapTvN4bFeȄvMNdEX\sE7&;) g .ֹ1 ݠxP҃&]\L]P iݽn^=r0dM:?*3~ ]AGܮ??Hd6wl!+BɸpQE 1鉼ҁxБEb<٬^q§hV.P,Y=S-d~6nOY0t[K;҅*&$L쇜]z=4Ewn 'J`V.亘 QWߺ܍-t`Y]j7?W \Qέ!WS I_RQ>(D,M7O{lEB8hfl7O9PA9lW?~bꤴ~ؗvi}%cg݄z.Ù 1&a iқ@w*78x4[7C|S'n!Tfl nY6|JW퓧?/U!\ f Ɨ@&vD{{ :VRlz +~V/ mycA\DcqnBG~mn*Ǫaf *F ?z,F?GQ:~">scܲq/(*ƌm@j9C=ُr u@akE`J6y!=u9W[iCO8kwEap6dM<%na3GEqy1'}!W4Gʸ.7aSI<ny1E5ߴvszL/]͡nl#_O'O4 pOҩ][60\5lH]6״o#ef!DsҾI>ޕ@6l&\.M/O[9bI3fj3j<]J_>vg6s.UVW |F<)}}'[7B?) r BXfjl*(g3#I/7?؛xPȭBC+㤶N"Um&-e@6El;. *6R9=2֎2%)0c6&#2x9@0rJ/X,oc:ۥZ h'$ 3eO}p1qefmdt`ʾӳv7 < wۆxmbW|{G܀Ow?}S;>jmӽRAf+!^r g"'e.:klB7]6lfff[LL7#9_Ƥ빡_=7݀W$":SmkY0z3Kb{8r.0uWI/ZzB5Pk|oRv~3eVG킵iZb<o417vFb/ٸyIԧㅯ.T6hsN..IW0Ikߦuτ_ռf"H9:17Kc=͒Ɯor7A@ qۥ]wMˤPŹg¯3$v xcH]јi ]}(-O;d$ u(ҊuP~Q>cz}L:ۃ Ӿυ;R/?!w*{`X[./zvDZJ@ ʧpXrQY;R 9z.<4}${-}Ip%d]L٫۟4\G)\n σF5s;_-L%r ߖ3&bDi\<9v)HXěS\;qʱ׽L5HC:0*{*MvT]x#T<1[&r&畺Nc.Fv,v.08<Т?豻aIne3!wUxwis dž5z8SwCɭ1C;͙ZL}w~Mݔ&m0λ雫<^t'*Ҥ]quOmI4Dt8>na.:CH4r92 I6AEYFh ʠH5BoVł/ЩlwSHLeriӀMvS[* LP#|/p$^\R|n}eCM.B%ސ3# WQ@a3d_bse3~.1vvjݼ5W:@~,QOR1W7+v,=H7.څ҄/ZnxM%d\X"M|Eu6E&W Ih.0nZ5K/5(Sp=b}QWiOLHQ_2c@|ȫ/iD.ذ(x,(voZpG;ΓV fL2XNb 27yx ݪ ғg[Ikңr4蕋E'>u ^B~]7ļӟHd@Sv%4Ş4V‚>s߭6Qxִ Ÿ⻁Y5 bFs0Zi7G ٷ Ks!2ѳCܕʍz.RȐ)}0p2f7;m!߇XdyUV6#x-yNѸ#IJ--8L]A/ǴW b?Ճ(me H-Oy<Nn=_|qF=wi 4=9"Og^x]%!!W&8'*I xf]//IwmDo< 2-ݽcl`ߞ Ojn̠*f+T3ql:$OEӬٖqndȉU۾fO{m3aTN 97U_yD}g9}04 up(DIn9.kw`iqdOY/1Q`IWA>ӠtA#aNL$wbMV5Ow3 4^F7_>_T7\=q?%sG#7Ĥϫ¬Oyx7t9_\k>;7N L{NgkqCU\pIg|@Oc# ۼ7>"7 [7Xc7pMXцժY0FŕOJlq $j4=;e9 +$T0]34a/y{ۃO+ nx{8񹚄^dи}_q|D{3|c_ nh=tP[5⩇3) F\[{9NiqU_Ҙ~q5Oڿ'kԏ9svωrCdDTc'IJh?_k&jZn q\K=:jW'ˋgq7! Bà[s ёuFKi/ZAL!Ԝ}i[Cex6R>ryp;4J.Iqi̹-SOr#O_=Ҿ4}(LiFgƒj/OT9NÇS^ީ㔧}\*s >x+AT:8S/B~#~ ʧm-^v1%=LMh\Ÿ8=\ǟt1G{Υi{Myt#ߑ_K2j-)|L~O_)9csluy~Y}a?_^cɭ]n>U5{\ot}xKO?pq?0T_ϴۡ=/[?1sxy< ɕkhX7IOs/{$an;>}tt"1p67P) s+ 2m2JDN9Gmdx*;W=`'x듵-KZdmFx0v;h.H):*0FE>a\4'Yv&z%e "Y82:C: ȥ!HI-;0у:lK̢HƏ}E_`Xb it\ljܡ[lOM]I'2$!ZdIPMFʮ\.Wavs:X ఌgyy\ᢣ2&"VZ7sm_ %Xl+6aԹdQFz.Dp 3Mt꤭M}m}&kcX^zcBlb?G[j4@7Zŏ)mD;s @Ɩ{)߮Uw-Pe6fTUDmۯɉˌkl+ ',IzJƨۥ܉#+'z(c6$riiӋc2.t,$]h^`s6.էZhބzI}z7mקDERjcyUVU6Ƹ): ^Z5&2 m|-:CB,t0 񽐑;~M8Vٜџ~9̓ VX[^ S'4_j7y~~M}# y⹦O!K09S/}SYe2;+-2DS^nm{RoփʢD!\[KlʡMC&S?e 7&h?ps$?HǛA%/uq 2ee.:`/7'{rj$=mю_;kW`&A NHEƃޱ$Il_/@]tqUSe,CZ^߁.ok9EҖYNwH{›q+ٍg\pL*:lyub8* l;I#~Ѿ^'G^7n 7#cY-`xb{hIs|m{~CL+ɘJ4g׆Kfh7ȼ|-qƎccyּ}?~}zoT^H)qcDnD@._738pø CAcsmޛ2*jh$t;)ʔs{ኪl$-߲TFPsZ?ᄍsB.ѫM3M s O>k|M04F\C 46U|D<=W+G}hX1X?گ|A8#o駾-c{Okn(!kt0`D<0|\Yy2O@`g5%x|}Ac_*b ,m} Hmo2BR|e:#  p7}z4qJzWǦ|7O|36{s f88+5ι+M?wߞ>=Ϩ9::kB dzwfn_cBm,JKƺ)#F` b}kfQܗJf{:b3z\LY+MGMix-y U;KR|,5qCh0orHiUށX47W`$UJr}`uKء+pN&/W.=M>Q8[k5-?BX]Uj?o/}?خlk[ {#cZa&=Ө Gs w.P#ɴ?K&a㯅m?|SW.-nXLmoD5+9;ye[4+&\[z<7v|pmz;#\>{{ncyxGoR8/m8xܾo(M~n?&\{~峏WSۍGi?zܫQa'9/p Ɨ}(k" geЙxyֽ;7sS} (&o勼2f:ZMƮ'8Wt]·*s;E`]㐿;X>M{1?c8PrNj[m Taüi|Q| [auBիVbu÷Bo'~楷Q:BL3dy 2X DI@ fU4g ,x†T4Gd4*/vH8h|ƝYpg!Ń>= :Ddʼn/ NDl'@ mD& u@tJ'PػYTS( YUI5l"faESW9[',RIC+L) 5)S2XH}kax8ͫݤLmQ(aꟌED Ǐ0WlvP+LxCTm|ꢫ:Gmč!Sח9 lZ5"cHƍw,:ZS~xĔ~o_ۛDoZwv` .\@"EBIZZJ5.dA <ȖX6:x,EklG`#neV;?S'^|b vs3]u nVx֕6LtQ7jߗЇ,RA}B#2'h/P&F]Jn`R,W_ڵ~ֲºAafnv7m?:ؿԉ2[\nlGE<^l9ƳvTOMZ5XgT98~v^z&/@1~BI.g,MZ(ZjӠTb g.cc y^BmЕ?atBiJ(/i6pƆ_#W ꢭ!Mү>뜷sFϮG< 9ZG?4Bu& r} I1#2`j.]iZ;91lI;t =F܍~Azc]P~ní-8.Kxk f m ^Ꝛll>/evxb]c\;T7@S]QJuk΁TnR@n @EOKCYڸ(ӌo!I5&ρ<|Һ7Z4la“cM^ <>O@QɎ8OX}kjL]{*ML0؄ԷQQk7s-TX~ 隍F7]7'9 2Fj=7":#ڍ@IDAT"; C^ocxOdDNRD||1:L|yO_)#&^slI@T7plBr't 779{ᮾ!2x6{ձ9 0 Ak¹yu B~p,FVqxC7M7{Huۗ&_Qn8aq]'>:s<_<'ѹ(Wnl$4o^?=#_N֧~ɉK.R96ynLIյr>8y:n ]v*P֟ʘІ}<8r~XD|g4k=Eg b| Hlv-Eu(4w pfwGOTsKnJ>+0F|Z{t*/[(sR6>q nPlws}D]O|j (/y|jڛW_3CQѱܸv Odʋ8_F~Оng,R[;^;bfI+lz?7W"cCлOC=vP_ĕ/oS>ulFc|5!yFZ\f˜z1SxK_ɛ🞼74{]ۿygۿE_UC -3$2?ouD۳iRa˱{ۧ9Q6#VҤEc!<|d</[I\D[7kK /LeثUJMgiz4bm/| 67~'(\ `y=ӮK{#jZ:v?u:'/Vkv6Pӱc|VO/cǿ=]GӘɿDNgnk9wpSZǣ[cv3& Ʌ8/?_—K㽡q{yCП\>C Gԕ?ɅZ@tlJƖ񥳷y9ϗc<~b#K{)76C̑tׇn$[cm#s_<.ZKIgyM}siuufyߧcJmOǚ;;nru9Ϲ{On^:ƜO1SeŜy-s'80mfo5\+D6ᣵJJ(0qqO+EĉD7EM7u>kԯ=G ݨ)0W@'֘ʝIRɼrqαϹ6)뵃3UF-Yձ$_# J"" bd]A5. V&,xǐCɻ0bfSJlyL铓)EOi0-S7^N<}`Suz!DP$_5HѱGVVp"oy9<`lkwlxU''H ]hߚ.@%\DVu"EY!a+n"CK΍dI`cgc w1\* l6j[jVEmw\d.mr;.c?eNFEm79*SlZE=8m\#Ľ ̟,P; QfEN|"u pQ$O,6~y| HzH8.7nNMl2VC}q`:: Bi{ﯶ੤BY';vLΧM3Z?m>`$,dۧAiX?'~dxG蜟\9@hhҸǭțKW29]qA4! jM zf羢߲uયu9jݚE_ۺ,Ͷ],h ィ/gԨ;/>qaЮ ݄V8&xhl%ƊlDſPT!,;>j+n,h|.AQj@!dI)F 1E諍*Q-ƒ<*%x;N RI@ʆ[(Q:~q}LUT>:Uw$•MވX[߷ ecJoe &Ȝ'O&64rlQLa'BLj}` */?ҋIlni @ڎP\M:O@z좽Ojo/JM՛a"f|&Q'{mn[A fKm?1`[iOJ; NNyK=t zٸzq:i.ʤ]<疛K'W}eG9:1ylCk{nbjQb+lG'/*L05ڇmF677^߰YWWiZY硶l*7lKo*:8۾б >qIČh_i7{1v34+s}dʆ=6IC4c4A޾^9߇5{"bO_zCOjB$גqWڹ&Rh=/%>T/`s9ScKۄ7`ŁTvS>Fā,o/s?;|QcMD NkY)Sb/~04ӹ݉wf</O9v6~s׎G<Ɏ%Z0~Bz/X @bC_? I[mtތ՜d\UorÆa7nXF>,+h-L>۞EpiL cJc-(scy|l{P/oN_[4XۘR{֎emXSx(J%<-]A2e_Iqef5pCl5B#Zy;y;H-@Ÿqj iwaUƱ26uFQ%}7'?>Nuz_ w.( OxO{]?4 u6c?Vhnʋ{WĽ؜uNKpN>Ħ7O^1^_ߟ~ߞ~?}{:5^G # I['6-=^<[[k$h.Ȟ ae^KUF˾ۡjƩa=~ZZB=ZR1;xK[Nm?N)oqlAb}yhCk 6c\s*$3*^jqwOAMswY ?1/qC쫟(K<U4 N>uW'k&= ??M܉ˡ\5K,/6.}Γ+]}n{߾~Cu{-o{)a<|yOyʓKp8Gx g'cMy6<|.ue;/ۦ<شgƦXG:SƺZ D-O>|6p?UyO{ʓRy_19S>/2k7Jp:e^*a<#/!zxS\K}ݞ֥vʓK~kGކdyW~pƚ^^Ձ"s5wCAԜ9׼ Y;:sF/sHs&52y27tZ%|V}84f= m!ݡ+f~Ir6瀴dzk9^6)RA^bPJ?:jdi\\s m6Ї s矮ܱI"$Nu Z'|8qN6:,8 lY/Ľ{h%m^gq GBorH["24U )2:lIMS Hk6zKg$r2`ız"I*Oj&MRSEv|Rq ~>m7l5y/"F&}'?|g EpHxadžoBEXi)VAD(¸ ;؀&d7>Ə#R{Z8/]xW ɋٖ649ڇ|=v[^ȃ( kM[&[V󦓵Tݡ!WSj]Y|AU!Wd~cWՅHb+䇦mr_mMg︠=#\TRn4z(IKڮ'%ۅb:ٜš0U '>/]) Ƈ8Ь*U`ܤ*bȽ5jm2}")5syig֛M.GJil4'ndqbco)7?I?oǪ906a =q/Qx6a:Bf27ngcЂ$5JnD_no矛ZCXY YW>ϐ4)6L?E' a/[lm+8p[#}81uKK^ѠG ZJO}v/Gok?-$u4 Қ֧{Ҍ*uld9V=V6s_(eڞ׈ZZ$2{1E*SUnB*/esţfXﵑ2J_F Uˊ' ρG{V\z4N4זs}Oz ]1;R3'^f8o`r*z( ~X"'%{[PWv@;{?ܕw6{ \dz*rfMvnQ %#eRlS-K#5fD{G"Ty?p+_8n4H o>S'1F2e˵F;y*6c W-+l UмVb. kdИ+Tp94pPp\i)Pq9Q>VdTCxțmoK:o@D{]cnR'q`V69Yc;y0cFnlf|3}zt2J럱SG ]֎!W_0 xWor9kQ:'Yxo+uʦMR[\%p9@wվ-6zoFҸ{}`xe[ ?oFʕ|?7@#Z>Fz#7Wyc~M.xN5$X3W1< 7tu,TׇWW<1onN//|srdF?ҤW< Ƈ`JSةM$1O=b P锭-S_oёR%38iMLjn)1"s^CB7 c.YnZUOo*Gr yѹlG!GS&맮5]}).а~t Q1&U5V:cjJ1Qk]_Tc) oGӗ꿧c{\|r^_lo5-mßeyP_~i9a?|vy}qD%##^cOq|;cu:s}RSqSQwltwL2*k,=]J ZnlwY9׷6<29`oq(1by65v27$ϚLA;Ļ5aīZ$XqM|;y4 ޛ]BPZ1q9/j^ Ѿz YTWlXš#ɮlFeV7hSFHim* tJLidTG_ˣybyb_BHc|,,nm92݋:Hݘq1~bVovNbl7;)B4ĔsQz(j:Pg ?#)E.*vS77|5=>tz.]}qCa"j6UhՏQw M`&>iM9g_ndMG"iCSLOk2ROٷtv'@hE;c5-0&CꘛR7ӿ39NHm!m\TZ[ j>|e`:u3nM-QAI '*Ns6i`KښZlsT4'vI%fl NMFPƈTK>ƪKOXyYvA xmhƴd n?x S&x^ Ɔ4F,yZ\\?uȨh\MrN.x쯶%Oj rƟoiCx&S[ǿ N oȸ }FS|u壬\$ƅ~I ?j>5K'- K7۞F1Sě#`4X16y8TOhUCJތr\p*?OZO7z.`(rc:BO{Yoߊnj Ա^[temRlATz~FN<'|LwC:/rWdC;ORFPjſoc.U UnN,6(wzLfUt5ŦSؘxUτ8rI/2hlT7y>4bSz[x/㢯U/mǂ븍eW!"'C׃n&F?|3n5̀Ǟuis"7>Vz TĎFcwbI0(GG)4U[; Ŷ9GnfS[l7O:7Q4x6?>d#4ƍ>^I|-bd\_!W|]r>Ƨ3AŕOrM9޸T'~۳IUM\.[Ly;mʷ{ڼo .Vv`[ڄ> I=mj&}$h;= MlyEꙷ(A X#7XN\_D%2dm/ xMn(fsژg Ul1x 8_p+Ķ '8&;cAQln=p=%U|}O^UΑF^w= 5:Gl>~]\9> LJ9q(O䫾Mɵ7<۫/ӯ>ɸMЍHovC( Y|RqƣW''|6*fm͚)Y>zkJ'^*1> ?)lSOyo54STKHoLǿ:yl8?9&~*??> c"KicSzO%j>#F}591X.xWcJߑޑ%xaޔ+fSs]?^=K#\%明];S @p{}5M¼m7>mn~̹|'N'2}}‹[3}˯LW]ۀ<$'PYSP|,TMv<9eU̔jsdk3,*mz;62-U#Ye<*ѢMR=̴Mn$#"Fe#q'.H/Vl=0z Mt$_,"*AU@uMe)2LQ/qRhPYʝ;>ȩ \i9oư1ljeU?qbToci]tFx͸`MI}{B7(=xw7䔇1~ TCy]1ȱ}ePviaE;.3N Q^e#U i?!Ugm e{ӡʖ>>no%GWa@$>E.Pc'H"OFZ͎/Ic{. @)H5G/?h'Q+`MۧsBc3 1kG_Dop8X3f_I\2Rܸ,u]nl62HL44O|Ok|(m4皉{7{V 2:Cj2DĩuO`8lj{_;ߑj)M7b'l!fݨV+ʽi^ku3ЋW)x6öKL퇎s'o~)}m6D2SL'ו|jQnxƾd8N AwosC;OηYSos"'a/_ok[hs{|cޏRb5XV-nk$Ǎ8g3niGs4| ^.YƌJ}nvn;ƠMqrƾ"ݛS6%! qqxϏ BkP6#m-ËH(ӐA\`kl}zqz4ᕆ~r=>qWf_AsnF~9=/~wwEk%79C`hSnʘ܊ӥ0)X7i^u-i;-HdcVJͲ4 3RTS&Sc}z.m_8wŠVZz-k ͩ/>Go ʭW)OL Gl[c c4楤rl{ar^n:2|ORf4\CjSY{GyojhO灏_{Iة*\,XyjWګ<~ OZM\s{ Fr۞MK}{}&ّ|ɚ)>G3Ʈ\Mip3~Rc|NeOyƧ.ɲmpZMhN?/}$ 7cҥ[d_Ut!e_Hh{T׿2L5}`go-?EK;F-~+kT=>ax._~;_c+Wuء?^/W9z,Ma̟\G5s?'bt^\ɁׁYeɁEDqg|C3#EMK7e|K]c-Xk$.WѳF=_Bõ ׹IJmYqW _Mi<:umf0f,*\Ks4^iKI sœN_!YNr]TbwSPɬ Nby>3&s~\X 5HXr#jP|;sq ]t2k"D; ,e q De0Oidyu=tw2fQ @hU'e`cJ<Wf7kwAPstZ]ԃ%ͫ?G7DmbYb!#(xR?ŶY_jʩ%]SU5 Vgc':؀C GN.RWt|b}Ř+ʤOg;%iNqԸDgo*=ߩХC#ORx;(?HmxR֍)'rRAdL؇%y*aԒS 'ΞE/O/X.2 sF*WƘ }HmX'-z6mu!C47 `2q'>E:.y"i 룷1i?eZ]YjOL65Yo̵rN4Wl6 6>8իP;ژ b&#keA0xJlGyEVǖ)9hw/3 e<}!`ycLPTwlsy^G xbWX`"3q(Ddj+<.TʦK/i7ߌ;Mc3w>RZh`0ʴnlRz8&~^h/oGoCe"r6IbHm=/o6է"6Oy1- >{c!: V>ųpndsy͝M,j4vpbqDx46c66)e7qlF -U#O|avf&cAi |NcJL9.EƠ[x$9QݠNqw3HJGN5~:}w nj_DڹQ?PG+<F\L196wȧK[{!wqрtV#Iڳr7&?Ō==?"0vik#I-JsfZId6kާg7 rm\Wv;"F}ʙ^>)o}OeQՌ378Z %I3qLHMƊqb0~ŋWMn^z{ݾ=K|C_JM zbGA;(S6c >nB9++=}(O K?dsOP '~ѫTǓX\x˵}P'CVٟ7&dGv`آ-鹑\7ziȦPٔz." _l:~F~&13ϘH i{cK8<N>#Ov *<^3nr;nƈM3{$GgfBc#)Bq>jwmeF$&4nsȹt7PTyOFdVVAU~G%" ySd.Ld|(ceVo^~xO+qsRiKc"i7Q= ȽsOZ}y [CߖO{l|b;b~k^]hHG"UU:rXiUGh>FyWKˉAu^emD^֏$o< Ue)2i֩[{996uL@ vGgܠhWּMdC=9rl|ʿ8#p~)\'%=epXz㏁-2-Lgdlu}}j jG;.U7ȭhS6n({!sJ(3 6cm3C==qz*cj+8|M:{ ˀ{Nic+9^֝Ya/ryɩ? :{ky|0B'{riwt~EkoH귊~ߦv: 3{/L;u}8/w^6s!jE\߾gocmc$0NyaKk#2l4vͿ7Wn^1oŻwQM7Vݨ혎OR܄s oe?x3|d|蝹Sv1ssT|m|_cMH /%8jy۵vbcʹ?Ԥ9%=ә{oDY*.Gda.HuҹODܴډUJA+ytү ub[ g Xg&t $N|16Pc yB]uKy=&-_ 3ŏ. g&EMR92ֱU.(k23)qʦ.ȡ6udI33׎e")Q( h[QbuyT¹{ĉm#_V8:qM˄sO?S'\ΎNRsV㴥[DVUD$~IРv-\vIjе)nϑ~L-̌C_ 4-ez a\>rI)߲A#zNv.j.+B'm٬xGߡiJJz7'Oc.pZ+Gڝ:ԍ`NxصzD= kr dN1d$N)[NNij=tGRfr7N䍮uʊ~i+m 6ZN^# z}XS@Tr;bi񥌢qaM$ 0HdIo 8a-. ,{ڤ)`5E6yk }\ÐؾqioI~h%:Ҥ36@ 56YQ . VUS\U_:IcW_]2/e8 mq]ƤkiJG ` ]$I&us܈, nmgiG/SK-C37f37rG#} JEN ` 4MD:=Q;d}^gqc&L9 ?v|nVn'xO<ѷqq+vYS?b_Lױ{"=yo8dSln)?HkeM#QB0O> N*ѳ{+ws[;bAڢ.! uŽ?ߔ/y)O4]} 8}5 +Qï6kHGXwa)>CUWHY>* 6N"ڷՏ^9)5P{ܷ h_erq0OWۆ>8zxJpFk)pl32=/5 t[]HIc%pc^~Ù-ǹ^N&Y| LlZ[ײk?.v#{zM94[lh>ϧ 6_Ȭʼn,ȓG)Ү(}-rȏc_1n{r3WavS=m HPl5𺅾?"|b@9kN?Ģ . LXiۥ ԘU˧|G!t)ڎO$Z=DoϘwS啯b RScI6AxBveaZ+ c|37r}c9^| ~O#i5 /o8 Ƭ3%}'0^LL—|^b[N1GkV6uMYhih) 曛Se&GIzlx4նZcF2[6扷c0Нt Vyo|G1Mکۗ5Oɩc%*=B5g-ߴҕFoڠsS/J^2Vv^1Ox?zTW:sr{|v[P1O~ϗ|v$SiGQvWf=AH| NwN%]ӗ{n{~hK]w{[۾q|iSzZVisd3/[>..3;Z4/ٴW}q:T#@IDATǹcw1Vu> 1cs: 9V۝O3Vo8[ǭj2> >wAh)Hul2=/ޖ/ c++VU{n秹Oa=nWcbQHnp-o ;!ߚh> ƙδt؅t$qGBfN@`:ML&+|嫋B'3U `P݉^R @7ydlNTdADJ삄_1J2,'ur,턃r@ 8zLC&uNԃQq~_P9uM e=iԭ%)ӞV9yk' + qS s=kl㐆˔f–Bk]XaK9,Cvi#~Vv7#(]PXT*`rvv qS($eO6mg[: bԣʄg 2Qї}ZY9suε:+vҦG?GnOw'nz#ءR(&4lpe*,hЁObWH_ v&NLF N'Oݤ"n?G@y~1:)+8o|9m>Javz_wR7c; GI,06v^YWapYo޳E$}T%o#XE.SݾXr~#&^^fM_%vڀ_;DmR"+"j}m5^[֐Nbr#=7蓱߫ewuaZ>|sPn -=K(#k!ZYyClXig4Ⴋ0.' HG:/}\E7x#z\RPJsˢ>r_7{i/1C}lVwzGs)݈lr7#o @nw+E,S?|/ҬK_F \WѿOL|=uZ_{46ry9Ox{t_y8}\^>@WS>4F\/]~@ t49Ϡ3{c. o~m~f%WC\9\ ߖɘ's$S/Ksq1`۹Aݘ?TL=vNȻO <#6{pO:vF"ԆIٷzˠj ?Zs4,}aܖ+ s<*_JjÉP5clO'B'뿏r]N(ׁs^ĬVL;04 u-6Q-y3YB $Vy YlI#A\;B)@fם,ƫE1~vWh7ŗwJUsTΝr.mUźʔB`SݤEuIG0zU&$>E #&g褑eT.BcX)sDvtlj6" _ [xhĔ,]B*S5iry|Iq&EUaZĹO̙XVۨWgNU-3O+eDc;]y"e<)bAA[\'~7!Ȳ x'4]96>}oʳ)QJ\ƈrrNQ<ķ$];BG?wkOsD啳:y ->ĉ@ΉQ4^!/|ʖH!8j+xƭGd8+W -c ӏӍ>X2tծNchtVhm S0JI )m2קSz e~Z%h='" ħck_M [s'70Džhş `gm~[j-sۜ9O~xt3D|7h*A I'g{ǎ҈gOƅJz$ Lg?ׁF%G+I(!d6g;n*dTd$. s6?LXM8?ʚuw}ZW2!y՘2Eʖ|jRD^hG]$CTE6?o?ȪE[7 clK{i3ID(&\^sQ/\2k+^ju) oX2aҐX}D|Q|ʦߍu 7/Qq^:ɧl]+t,cXO>nɰ#m쳙k5s18ԛ yǯn|ѾG!r{ϑ6s n 3KGG,ދM_oTŠ6;yM7tۓ1!>2ryeH=m)#4bP8WF7.27gҒD4L( Lڜ֬zr*;V0aUsi{$\~vD xbż1\-ySx&zFñ>4j]%(6f~9q¦W_Ŧ.J/<2"7^'r_jbۋV9ySwn@jk5~%>osMSYø6Ց?m sW>e;㐋/^㎍Ƃ1[z=q7,=yx FsЦ}\PvLl5FZЍ m4]br)|[ȵV]) 垱˛ @'6S"GigRPJZ #n%ܒѩ\x}ןOcL5_cJ1X+t9 e ^7ѯ8S^=-+vΒqS FR;ޫO]Gj&8{k*f}5]GWh[V:+9+%x9eVKdyqJex͑7s>mʄsvszR9rR'M=%o y'k4:S2oR ߆=X^Ժi7=T?eq%?|KRgW[:eM~{.N~ҍ{_7mb{F^V?>߸b0(.<{}5qϔs*kK.mֶW[tgbyu`}cNLjh79]8x뿿ތܓVY'%s:vrxF+~Vc̅׹f_;Ecïpo^w<9\]k T,Cp41!A7ɏW;o> YC#}p^_cGO[|8L9h忶d ɑX޽g#[S_^2\\*XQIK#%PP G/pYt6gP(A75o>EʼǛ='hyr;Cn9!r"Si!zhe00+ ߑAzȌg(ve'lґ tޞG> ._zzu,GRDX.=Ey^UjF 4` Syq@3J;,~ؖ-ʹ Qс^YħEuŁx.v+eS.8])E==6| ôyʟ|tVv# 18daөƬpcߍ>\1A(>9㪓==0wMVF*;|eb=*;,llB2b#{'F-:K~/Aҧl/UetPmًK&x˽`i<^IN^_焦O1$uڌxA'xR+eIIR5GNA`GW_ C>rr i׸mY^d>mb*{VvKtƵ<B46-dhbr9L[Vlkb$#@ sbV=2v|=W}#ܴ`-8L9lҎtE#ă8rz˘ V<ƋrPIq GraՀIk;7@""#T}lWe6OS~cm(  cy@7&/=/-|Ǯm{tAm؅i8¬Ip^c2yݶ>Y=]jkī+Gy3҇O#\m;b]AO@z}bQ8 T2V )rHrʪoBVlr퓟Pvl&cW_J#m 퀕AEgnЏ. z|{no "[ߖyCTnm$t[P.`w`;~gY8ۻ f6f;;c<[B_6V?aƟms6r6S[P7>H=c|r:Ê3YڵD^5z/> 5.uGhKtL N 1>iˋz^XFy ec86 X,F_iOsL[0~HĂ4_`<Nn,+[=<:iq, Z:FAǂGwmF޷.ۮrTq"q+۵ɝ?PhztޛUX {TWRuܓfтJqSͷ7x-XVaX.eY>Esմ>G(T}1D{3#Y4 zBCY:ztx#wʶ9j6 rRvi,ZWOɑ  oXG!( \t9Ǥիh ï~1:mmg Ly) H}8Urhy,mrX'?[>\O\b2n0{ߍ\渔T6t&4>m/[`4<@5Josy[>p{[~&mczymN[?mlt9%CnlThw)y\+`unr7,9{LgO44Oݤ}~lڦNY ξwҳP9Oo&J皰IwOݦǭSټ*sR|&ݗO ?nR./ ;n뿗^c/S:eO~}>T0c&:%V޾}B#dNb*cj2Lμƛɰ Z  u U*\ΏGYw5OfnR'?L e(SgdZ35:;3SD `wTJNP'uϫ~leqtBK2d4&rPtI/L~cQ*b[:[g1* _ғ(1NF29Iٓ+4Tm[(|(@!Px-8eZ% 2[2w'\a>ح:JaG_ꎎcYU]+ovryT tW'PYag'@|Jc$}; U{F /-҉8!oӱd20NAw &X#t{ `%YdʔCG~9>ꆾQ72օtģ4.;N6gZx'tD/ mF1avʡM;#f3o$g=unG(O:",|ȶ>FsOO#~].008 =eV.KFu/>-"-ԗDZNŪ*f*Q8wI)& ڮ v !U9DfD@F2}މbr9o5z#a-/"tJݜ[2T;&Q}u JNDAJ^0#L;3ȔkC ϖZ }#CP([m&Ag>/KJR ')sm2zU؝XM_ݴKI%ޤٔPM[~ƔghMMY$]T !)v>b*'J% ,m-T{-$ZpT7h灅%YdQEe~%  3]6VB Qa h(ǓV2&ӗSTeM Мg m$N-0оnPWyH!֒S5ҶAt2/_'ZC} 2^QI)yoxi*i+GBSXKY.Xd-eu6\ʡ_/IIDі]Өe]xBC "|"}=ϫI/_Y>yKʲtTZG+ i685Įuv֦Yݣ!`*x쪍r݋ $-OIn_ԅ=7B?!OB;vu .֥e1o_Iݵ :?mm7O{HP!Wdl.u&Bc7?St/x`g'߿yu?fDw%c[Ӟ_,0Rf?'ˑE.(;}GYVܖdz&7޳o6Po;ZY͜RW(X;!Kh{}> ' {6aNyJ DKy"ɢ;7 '&_A?WWb4}ı4xny$f;slҿj{hHD{AC l8op/>;5OkPfCMC4V3XpFm VW+5? sR>r0S3tJwZIm[Y,fοCC߃SGS)Fw~2: N9oK u3^ro\=>=`Ug9R$2)?>?-QWK7=9mvOaf綗R~_ {IOsYXM['196{FW3m1VyVf1= f8{X(ߡ)1I[yߟ+8ncxi^tNz ^哟t4WOwh\J/nЪmʞw>\ |sru?6LI|Kq΄gAT%̷1n{m-gkLfxKxϲg3.cO&2Ӹ^ _1yXۛ $N1 \p9@e>:e\]BAr߿)٧u /=σ︊cڎ) eyfK ?2JyS%2q"ʉY4԰ < W9w);Cx8 (k NlN1Zƣ1^'}rXgr ,ELHPA2p::fBA8r^G isu%|+eRQzM>XW N K"z [{8,dOW;ű\r[Rxm"?C~‰E$Qia2D6Ė/-n˭Wi>$d&eg&˵3^O\}X  .vLyB؉6fԷlm'=Ec)2AI(<>φ")]q61~p p7`+0$|" ƼfZF&'n3ic\RPj IC ̴]ͬ餹2``#F7f»1}T[j0o _j仰V ,fz%g^1dzǗ^ <mČ# 5<IO7T&ḳSnN8qb zM:2b_~ mldM-AtS[mjrmLGG85m.WcIʗ~Bͤ"p+nbڱl|˙襶C|B ,=Cg(ٞ007hбB>_hm̢s;uJK]z-OKo0.ЏRǸE=e&hx÷89$ʡ- >m+k%"$ c<g۲s K;WQmXV}浣>nYPúc#p{IQ#NYmsaiCiCp"92% ՗Dѡڄ}J88ڷPNVSBh:9!QVE~6<9ZcQq/!,G[VS&ŷsObCCvq- {8ƪBg3}9 ?~Gxi_34O.evy;}8* + AO.㫛 `_-oY6s,@?7D7~\GDdӍ"vh 7t6R\'$Ͽ>k;)%"/ ]r0ne| ul/W {@z|~WBIkӴ Vݡ~GsPg zm60nT#Ξ;#Ċ<{'ikDY JޣCw1CP)vV5/O;[ys1E'e yRh+񰍭xچ}B_g:bڞS z@L94Fsߩ~A/!mE=Rh0>}Zv\1A㡿m?Ҵ>{~j8}%uv4 ~멛\嚦~}YVV/BiS>DOvH{w7ᯮwp81OX ۚ@PO [wǥlxrʑC=F=K{m$ _St1p8~ɡ46,im#P#1JC_c`^-߼9[ǛRєx;Kk&_M9FuJrq3\Oˤn Ͳߚb?T5CwYg14=Y-{|H\plK} .ӜҡmW ooK7t ;i>=י)gO,׿Ps^Ugd(b|Iy9>?eMqIں^ƒomeJw.976ґĠ\JC?6 w:O<ZSw _i(-JS|.}Y%GsNw#'?:\ssSSyq=l_c ~lXyouPO_?>%Пs?9Oz^?x[>-9smskc^} ٤~O혇2蓮ŭ}sc<@OqY@:.;ess8he\N˿26)deY``a :(X,C79| C$j!fP!kɅ53?/辞< L\W !~r1!䁐:G/_ƉB:ա j<3m~phSaG>)gRyn4XS^99ɼ!ZOľ1 t]I6p4bxiX+뜯Abj\LutI j Ug>R|ƿ28f XjxBJ:zGF'Hۏ<ƮЇz! }2a(<Nÿo8BI|7%GLhjQqQq.F}_B9ՍTQ~T%(VW"\j)9!G6PKto/'I捅9>t kT <.R!/۩ d3=GM_]"(R23W`R]ۊb!m\sb'J/x$ge]M dUQT>Z4/hC;A_C@7ESM\dTzm.^ݎ|;oMh "QrX`g BCx#, !vDR$wՅ:z(e }pkqEK]RA=[SrMH:^k/䕝Xw=Mٔؑ(8)x\ EPY5|*kѲ0&k8v̗{HZ~,j믆鲛%Sĵ-9Mӈi!:;>UGӶmg|oBhb?Z'hgL|0CA>:7sGN 7m93t#$qADlB{E{:`1WiQh'dA'tvb; T 9[WKS$Π=(7 eo xƫNh62{{S_{}c:H8@w_<ÿf7(o| l'>0 ض2);yr؍W[߸:]m i3x׵T΀G>82dA,^zmf{$f^iDTle?'EmV_yD^B[x8)a_"}q ax@~7,S?t\=yĉ %Ro$XX}|V}eƵxĵAEm^ OS屣|ңد_O}۪oᓾ e.m4 l6=ejf|>Jhha3U0 =A߮k}1" ?p_}8}p@(ӯG),R+RL9#4ʹ孳dj?js;e”Ǥ:NӁi'-=,8P܍OB[ GlN*][Ysި'ѯ1wÞFWB-f^ZepcO+%̩׍ǖ&Jw<ųlF /n ?}]K7~ >IgϯtsR6}hYGҸ ?ޞF-Ӓ{l+y*71Wo֦m+gOltcocQcd}ڳgmLzlmdܡ{Z?&\^w>?Q,>s4m _5Pϭ~laͩ7uH=-IO~\TH:Sn>MQx*эs|g,BOwGF9:1S{W2И}:uZyKy_\SߴO녟rs5dYAkh1 ˍMz{&s_P4a#~p'=??s өԺ^cKuqcW7<-82Hd8sqBJܡdwb@-6;kEx`̜EGVΕ# 0ʫZ+W߱tIs:otɆn򎍕ߚּ[_}FG+-W):pzJRnX*s8`sBwC*d,c1 Va '2@.Pc`EZp2 K-tRr2_+&72%XmAĝd&}M-N:a0<9}Q}`Ug:֭=up<*rJs)YӦ!uςm` /p8 zh j;* %DGxXO'W! Dle2*>0j_mKE1;9.2o%Q pZV?WyI[;PmY sT'#+^_@THCTC$}oIMtY<_Pd;L?03)!xL:9A*j|oOtPqqڎ>8_2MhݙHx w'|rʂuR?ώQD[5sAI0糐?r׶+x̲^!\ilU_|jdȅ3Mg݊Ɩȭlzy:*. f6 OŦ䵬QR#ݘLysg:v?("?Rt+ k 5tYpz"|6;>E%w5%~k3hoe}8[nXU{eЇʥd2IdOV Opsݐ.F|ne2땰Ue߿ qS@y,m#S|m'$q7vߖdF|a{)k;.]DD}u_0n(Ȕzv|W떱 VlHvȾ9 vĹ]nݽ ~گ $z.V왅 k=FE>\/KNUٍh⢓m=vDo( @IDAT/c a颔6J'ORi56HXb! +/8}}L+6$̇)2EDm\{ZcFW-a?5g;J^[ۋqdI6v,KT[ym AϪ=8>*M%s羖\4*qk XT5`#4nSl>yf6%?}\0T/eeFCl)Qt$'xh"Rc j^ruiL8nm5΄Ki~΅amַu0. ȩl'`Wkh_?:?1/D8hԾ 6s`-s۳}mԁ%|5uo^k]o~ jM!Ow@~M彅z:29xE}}7+'I"bI*ζCmxP?hE~w`cW?skC\Hg+^ӚVb EI0OIviZ*Y-[N|ydwNqg[i; jR Ee4G!]>yM'_Y6^rCc+&))Ja)))eaշĐcM*1L#U1է i{Q!>bØ܂kk6<:cQljm(o8LY/ѿ ,[ـ"} ^IE}f(֯" GǦd̏6Zih<C7clZ)a+St[.e~Z{I2V_mvF|3-}ɾsr\_*ۨlbqԇܥC:CᇧtΏsR/?V6tnsz#˹Zbbbh5t-X\9'ƥ;I]OۭX-;4gxZű1W?jpYn'=i$e9頝t\2xt*HF'H1 jgO Rd%p="&2y Z*[ =Rl lUOGb0䜉yԟYbǨ-9Q^jɅB}\3ԅP|iCac8uE/8򀁴bFd :ZʅrHxr_d+VnX”r w~g4JzT(Gq+;,+&̧}1'[dq2x؟'jMAp!)9c)d+[*Frokb,"A}jٴe_keLa5w}Xx3IM^NO1ƺTB(I~2:*;5 ʾ,dr@{2˲(V\fMd,ģnB`9 ѕV>iGɹWs# )6>ya+_<^jƳgL9368B{^}嶯U%a훛?OCP˞3/+6[.:Mߍy%Mࠗ|\,N7.]g% z&})Aw3sP.7VV?^;u=P},A6 >n' b } 8xN0JM* vSvjx>!!?|︁¾4m8|y{ 7^u0PӾU†~Ln*OnFi^ôc#+xJsB9&fčT@p[;}Gw)l4s/'vݔXK. &7|;cōڶ޾8k`_7иg6nrCBId_?y*RhiYsӮM&7e%mjr 3pۺ)T+˔?c,`{VB:d߃s}[<.OFt(w})۳iͦV6TKT:n?>':@̚Ӂ78<{YS<%S{ ].C|z'=2~ʟZ6FS?Xt/ӑo!+!CK{yi=oյ0O=忉J"o89Oz;כsϟiC{115ek>D.3B難Sv oꞂg|].g1{ɓ㾉- ;+G3b+[ ۿo}Ӝc/6spanYFm]s#ܺϜ^9g̙,c|scH2gM#Z)'#%)Io4-2JW2mWzKs /^sջ8;_N8^w<9Kd1uɧpOg;%z80OcǀN_ݓI)i2"N _: #M_ l$1v'dVs;!O zu.8`"M鍛H3OCX8f (I 'Tॽ>ɊPāvxdJ/ЌʚZi,slLQl@CʔjWlHcw԰ύ.`Hr!#e' FVQ , t\-O*J2ՆFM_LRA9gbvɄ+ټ}[\9;?iN_;,Jl ()+Z!"\6o; vbmUj{Smy/d*rZF25=ʦ4n6Ѕ/L#Y2h+dAXd\h U)"N2a ߧJ+zlOC&3[.<DI#t' ~A.FY/P./, s zVNzSƟN4虾6)P[G#=ࢍMLd/OwyCvC *$Cli=aO_f{ \k?9zB| 6SvycLh콂@c@ɦoL|e9KNPsHiOc[JDi4|6-4JcSES<ʼS+ps%wR,-,)־׶\cJA_ ,U, Kۯt(4bOt&-[6XtrA5;o!OG)?ӣ+T|NSH@1%!OƞW7Oj}MO;g9GhQW쒯iQ9ku8'>>2x?`K+-On *ˆdE9FD% ÐNLRsڭVg`hw+ ?}a^'~>O@y}D,^zmGRAж R}X;2#2j|/y'ҍWe6NAz^K 8̇|ǡ6N8b)ʿu=5E ɱ*{Sb`ޚjlڃH9QgRo-MFɔm`zOyϕ92|:C|*46լxnw4%S7X-łԣHoD'E9|KYy7PX(T[Ґy}Iys&BLiSyV30s>{˧z=|7OX$2sz{{ehN*qڴO~7:dd?uXGx@'Nđcߑ^_s}UҐ%MKf6~}Wm91S}ϤXy*}Y<.oxy?y7 p~0'?06zc"n· Ӈox~5~/@[obS9VruϷu-t>O>JK|1/}#U.BvF2εdjK1P`uvl&6pl6tL^G>jr=19s_6yS#)93UhZnzhudM3 5c,Ĭ;]4wa„ѼQ/ ٖQXo B&t`IWf)$8ε̑yq$&4-ԊpiaN9=2&R@DlCb5`!yO*Qn0@!}waG L5΢PDhueS.9IxI{91kr0!@VjP8,.C8 <]0jhnezI7Kw3 ;@Kмh<ĮOX(k>LLŦ $vk07/}\椀װ-Cr'0}-傁h|7h.p>Q c2>NJ-őCWn`-c6ƒtPcyZ]E_O#GRk?is]׹e: Jr*' ?bO낖Ȯ>ƋpAhYz뫐 A!"gd"W-%lSu-VYG@ yAX}wEB6 ~KXGNY gI P9:`\{eC7)Ix?y}6]C93??b8$0K(2-B3 1 R?6V&'0}03fJoC˾]Ҷ mTBi7V>AChn Q:)O͇wnt_럾>ÿ4 !9;q^]?2BR7aKn߽ӹQM#n49}q˕$ ֯loD呆!5!~7Fgƛ(r "O+}&8޶_cUZøKybwWm'RcX&eA&}Æ0*M5+=75 |eT~>؏ e \釠[N{-KLد):m%m붾6|ӊoM~\nbc5DoyO>|W< ȬXK|?0} cL8n{ 43m;1'1Ygt_#΋ #<-Sˤqs_LD/mؠTiNjv-l'mKr(LF|l]S뤱k-5ʢehk~k߲Ƃ0 .҃M1Ez%ū6I>Gbdlaj=z1rT'y,IeC"@ Q7|u/3IQ2hhFf3=ݽU;Q3}rpH!ʱ+L[[鍔5epZ:ͅy1GɶiKJW[-Q -nh91|&+BI:Uoo>r9F#_YN1ş2z?k%ySBgZS[S#<~ >sLɁAe{p'ִ} -R^}*_}uRkZ?1bnUJXSϣ屏^iVǑ6]Ҋ?wܫ|{+B7Ӵe?| alhٳr*^sӾ=ֳ_-s䫎#Oa}Kqgԉ?_ 4} _Ҙ՟nϽ|]W=7ݦa;mS\>̇?m/S')OZ +ͩ[=䶊C%>0פ99;@=ͻ/nvcQp̗y2=OZKR\|:Y|H9&xN;sNg$sk~/Οb0pޛ)Vq"qvya k5*u@n^OEŋ]~<9\4֮ѭoN/ }׮ lׅ|/\T ")rβ- mA KeLA 2y#:'䐑f,TY?`R_ u9eBG %@mHI5ȓ*kPh 8 ,, .k64lێb` W{ qrA/4TqMխ4Q[hG³L"lGx!>ulC͕Y|f=*~m @'j/}CG\?K,ecFW,hy|rcSL\Q]6n:8*z;!`=bSӸݠ>XEk}L`ZOɜr4Qȵ?t }!C8`hj *pzB\ ҲI޸D~|1xcB EM$N}XSѷ_ߢuf KLl/ϱ i%GlpR)h19}G  l肸L6P5⹩)UF<9iIQBlk?f=|9WN -SgraZ^VB0܅OCRvH`wu@NMocɏҦGLi'$E̘8U`2qY "[3Oi9rŇ&mBI:OtB+2ݐ2vRLʒN+T6?t:TcmW1 1FIS|w f]֙R' r>zH2ɡjn.ulgt̎嗍2orP (mT<0&2 $^Ʃ:Kyw/ܝ80;Il^pb'3r/ ,|apFK@Ag]e.7j'^ݴixay3JK0ʪMn=Q:6V̹D\o͞}l>aSfqHlzrǓځ??m_B }jizƼ"} $HhA7v'ܝ?MF'f֍p)dҗnF~m)=)Ƣw>ɜ9vlst~ѝFחZCzfo ?R欢M񮘤+%u- ѭgb y9ݑcm 2ԛRϷ7E(&SoʂXD._C-)roH.TQ0 t"tzEfo~ ye%MNx짜3f?DtWuyJFڸ-"rH蕯X?JnYYӭƆ4N>#D9qv|㜾gx%}W_o_/RsGE*6{,?l̷4Mޣ~Ok5s`W :-eQ8ĔEpvJI2ک[)Jy-g8+mYK/ikC~o|;@ $oG-4о4qnyJeFBlLy+36FS>/o +~W,VߖGɰ"lJ6 li܆sz7o~G+BX7m[se̳_|>oyZ6 Z֦=ZRkp'@ŧmaΕ?2ni~Jls4f_mœ+O:!}oy5ۚmD+ym{1i|Z?mo}꟣ȴRؖ۲04mVȵmyڶ¨ϊ?KX)^ǧ-)oz2uS5)s|̳^\8`|"G<9z{W\:wN+~ܵ"A-L)"L_hsnJ0g)}y(y Kkc+>?eu_u>]KC}k\<^;m.Sqt3+ -y)LkqWf7Fa&oYrCNC@_l%Aqˢ _,dDub8;&gD)& 9d@Ù:QГy6eumYÏ4 K@ &!]ҏ?x!^6?UV5#Xۅ)<~ΗPgiI!9R1ymqJ굏k󅟜&P)">E,~.v*T mJ'`6ެP6S - ޑ&#lrv`H$Fkk۫v8&)ks!"p#+.--gAUCzC Lcu]h™tʈ@G rcsޅ07ң_fq3nߕ?y@_^Ox)7b'Ke[j;a ͜8onmJGX l^}16u (|Sʾ6tK ue2HF(zqo8|B*S/'=ARI ]@hߍ={BUfS[~_ h N6% ?xn!5~ Jj2)z4|j@ngmM Dmn^>}ǕA>Vn:j 'U-1 ֎U#s<76F~4DYu86-.d.塍s=C[O^9OSSlH ֖#‡ǶCbX{aV{Pm,3esSqz'U}7->l&o[M17c̖+62>_tZf\ZpH.n2JN<)/FWmnVkjދϪ;&(S~<) oq db53>)<"֘ۄ ڞ 0j< q\}fWҫcJC&-yAـG҃%Cơ{>j q\[)C7O=gfHlX_KNGizBi`ǿ;|lrDZ5c`!k9t79꫼9kᛁݡ}\[_utpbGp)I%M~5u$FM[1&%-eVIEІ%O@8rL5:m/wo5?;| AֹQ.M%[;G+9Y>e|#H9W)SVNm6-1_ů^;~4,pl*זezC5ؑ"=Ģ*]KG}ǕyFNKPǺ χM֔mR󩘧mmO#{ӦƬS0rgXxo+h泇H/6:b ;uT֣-)OB}Kq:WB˜Q~vCl67`?hS4JRX0{۶)Ov_?Shi^¬NC?4/~;} mSSx`:+zLsrnu|n3~?]MOoӖƔ'#t\ۦ<9Og6W̳'5߼*5^w$?e B.pFx˜] >ژq6MO?7?d ^׿b3u&3\XJ5ym A9MS2O[qQ̱WR DB)yB㡰K|KNw-%)64G!OJߢK V:@㤜.2Мg[s>.pΣ9wS)EEnao0@…2QY]Sc[>Ȧ=Sw]"ůGQdYz&G=Z;q`nfC:e8xdW2'\Txh82>[J])Cك8UX1 >,T\5P؅,Հj&)u,?Jۅ)}zޜ=|h O+ϰ%l݅ᔧ}:"nWSHO]SmtY|\B'Ʒ"6CZJ!g=jK] N??ΝxSǼтsJkƤw@&ʫֱPمQXr?jdܨSP\R8.Gya%d)bNN JCLSYx׎6]B@V7dlA~H#q<Sz3 3Er70CXG" ChOO;q;[oHk19 Ȫ uk]]*F }R/~7l\S#بdsܔbS7yrAhf[ŪQSO[x.T#D XAܸH#L.6'M.Lz.R7cB;HVLlw/򕓛ZWxe8\hS-AFDxCYBT }xV^7ӿ{|ғ~^ !}ܱ ̟q#||4jymƝO=i8%ށQLM$@b\4FSGB7 Ao&ݻeӾ&O^]a3} Rq*ڇ-FYXGQKR0*wlllWݤ\2֮s=OWyloG'ؽ-l8/OL&mŞ>a ۷ 7sA:~l㔛1gӞn gt)^7osGYkz`7Q- reu}G"y cls -O"GQt}#K#oTRcƓ qju6qy{t՜KXd"Ap.k\o??|go BsXkE, %bGNih 1IÈ?uO7m-`.uʓ]JSRz">uld[c{yLuPi2|o[=M(Ŷ9}+_,}1&{+qūT[Nm24ǧ(- W^nnmԍ[)meWHko?rNb b[{UUIn`n͇Koϵt[z ~8+9gp~cm TsvrzwS =z9^?GkHAOkFXiOO]#Ti37n`m\xq4zO?'yV~,?=\=Uڹx~H% Ͻ珇jէzt}^o;ii~F#9Ꮨs~xFWY˹ˊ'on\gog o6cM1 ?~?k}`ꙣ|ys17} 7ZI"&#c@6sN֓\gr}ꚹn&9vˇ-TW׎cMsǴ)~kr4uO |K~ߑM<5DDiH_$ZM]*6_SqLIq^D*LY7/ %ovLYP.]E]`F2콘U"2)Tiƽ)yں u]{ܸAV'S^3炄. =ɧ$,-(k !PtE"Z@IDAT҈sRhZ蒱ILh vƍ+gՑ,jWt(fXu]>>jϓV ^s U\vՏR‚$\rȵWvZ46uC_{62vm"KhmVi'.\` 0ZT𙼔l%}@ჿF؅5}70@ZK~c?EAo;_i.P,6 &b2!Q?nq>#24ԀﵻgRӐ> ~kbrTsm L!}kƨ}yUR;Om.ۺɒb0SvvoFxm|HVۈ(%= wS?O o*mcm \d*X0yX #tbB٬F6\?3xڎ1(Al%fK+^Ď_3[F tCIO!ѭ@.{ӊecJe/;" n!xhsJy} HJ[`&mf#"iK ƓAm4b/bciB}Ƶ8c0r[ p7.Qvc*I I"-_WˆэcD HG!,ѧS!NC6 ,rAi:R7OJ?7%@Hn~!VntE㘤~IQb+Q<'_80²Fen"9xs?NAv;p=_^BwJB3[7BCAG9Fv6^r6sܜqD-39l8xDυwibU|׍hLvJOo000C I7A=-'ן1'?~ݜ zSc1 ϗ7GuuI_ۦ :!7Dj;.אL=i@[1 = +}9 'lOMs8yC{QFmqV@XWϡzBd&EGlr7pQ{-+NڑmJS*}w0w|7rK*݊,ׇ_}lP*TK[C+mJɦl{a֜Y?4d>uKF{E.;m%|,QbGp`ndVB\6ϨUJl(-^!qTm˭[rGKd$hЫ`д*[7PzȣTcUme\WXxIy)kR_b1ei#Ԗ^-+ Pמk/AU%(USykF,|[W|Oi 씇^==|[kV>?Rl.=lGǠpyjxVS'>MsN| ;M.̔ܿ}ڶ 잞Ǻ}:SVis[l7M]Nm4OXϺ퍮74&n\7<<ޔGs,ζ5Ol/继؂YBHGongT qiڞˬuM~7h۫__6.o1;~-/<0eNuq}snf ^.FAcm>|qu71}"L=5.e.^"Coxol2{D.-kT7] \nK?ڬB@[ YbWP[\R#`z۹fWc&K=֬uI8YWG7`x dLb;O.:X5&nhD{j13t"L.j8c.\XBO͡~H3nREwCVr(S*rt.$ȩ $ m;$Nm(`Ͱ#g1c7}2L.H;%p&4]`b 2Jg`3‰[,<Ɩ9٧{G~M7P^>'&) } v[tEDFȣ]R' `= Je_]$V0&+:낣^T&mפL\ɧ>Τe$s?v ı%f(g Pu!>v#x*wMZ#zv'B"ߑi "cڛBx","=C[lL{ySSmoѿ6P ȡdSªc2Xq YOY S2#%rܘ- H02 i#nB~+ (WNP]dylZ~C $zn T>yNrl)UuhQZeZS *a3yP4;^ot|ͥFk3F.:R_SF?GؚUhi* -.bۀۋ \p& TlO/8Yuo&5G>eH%[-O|yNE&o@9,܆nIIсXz|k{Ɨ_&7u( 2X\Ț 6vWǞYD7II>*lBcqTȜ 9Фn+q}1犕c6hW&m'd?M$xπCռ:Qv57#%B#oO@&68~p0^s7

͋368kW5|KS9#ᚗ–IZ_eo}+ﴟ= qo XX[nS#r;*n/ǎ$-}+m#qZc-$w|ooiݞ R*S /mSl{s_OҚߝ,|㫎H;ǩZ)zJqZ5o S~kNs*M+HHu^{&_JsXqWOq6Ҟvž |Hmy)NOcm[׿Ci=9ۺO?x[^S7M.5=hQ|=1/W=> -2a?>'+zSCo 7]4:;l2Gc1vEp^8tUKzM@8$u(sAu^sSon9Y`X<&+ҼCv @=S/[,\3ci r@c%Zu+mn偠6N=:Nz-mW36rtLZ>/5\Y&I y E!lp=\*$LQ=Z'StfaA t1P<Dt"(: ?t w*M9(Q>}XSKSa%4@z|*f6 d&_\Y`Nd#]( vdӴ}%Lɹ )u=:H>kY3h:NY8r Yh+{|'ŀBh4]hHM.O"Fl͡ڹ dXRbhuR^pHTfAL]ڨ»XQT;%XD2:jլ1-yqn.8Xn/P7< b9 w!HY"O8Zv; *-CBJ DfB<2-09\-=nR9ѶGV!ub*eC[pjqC?6^z_9Jڣ[eڞ6j5?o #e\p! "ƢqN4>rӆѯlGݖ`%`vu)&2!_~!0VjGǨtLMHٸ>:db:!Xt4"'qxLkYA{OxRZm /Kd #]AUJ\$_ }-zRM13M%E'_qg |y˸+Fx0OÈV\UvxDt۱o.C - pRnǑc٨T?+G6PW ks$cJF1Ą6Do_wUaY=I>oc^u[]&=}J:96zynQDT?vo:鸊 H{xaG^\M1a TV[RdRhOlzEb#Jx-I`nN[u8 -x6lM!7ϰu,qL*~R4!uo3ѨKJof\dpmg=礛@Nrk.Aig7Wε'ipMG}5R\rSd)OT kX#itM,a #Gnu9  };}4c&|MyqvSNb٤tZ6 9ɔIGǂVuHٳsiTnG{}cE ^ձ2)3r XoP^6륕ݏ!=AWJW{>ݟ7zJ~ p~m~B97jP1{uocK`?td;)Ҫҥ& O-r|A`=;J7f@z*p7=e_&mDNE'>1?74q6Mw#tD5nu4uh<:Zϳ߫Қ6JG+uRinBS| -RY$(oYeRn+ڶj<[&icNCk20۶-Z.kKkٺ5m{W)!| Œ5ɷ5:+)sRUEZ+m ki:ahzO5 f| 3M'U/њO?`;W]GJE:{ {&?A<{0zL3\Wqm4GSyʴM~cuN:W;-^m|Dk&z{-w,{{)09m^9n[><4ĘJ;/۷m Nog/˹`msNտ$?ق?:Gmt~u׼ݟia^Sy-bʷܤ}q4k _7Zc5٘6ӺNˏO9k}m#Ey]N St0e-%KO ˥vQ/ Jf򠸠'PxP |Y[_eI?@NA"YpT'j7WHQqS # 0*(*$t^lICIrv߬8fсzZzdLY'nXR.'3SK2Q<ѬO$@ ; sgb Gr呠c9*?LKJb|5V\TcϧZA>o;O ;#GUB}3ո`aĄK_ @"#Ҥ]5I({s}ͅGmOb]&&yB2vA!2(wѲsuK,MA/<ʱeM6UFc/Ëm3EBJ/6G@u5.\5)b(X,}W.hFB$θp&^[a }.M>K=Vfj=^ ^oHTҲ]_csٸ|d ʳE 8.o@&>8 $2!g_nҲƕUjq&>TJ2K11RlwjLwy{}6R ^. yuwBe\ķb{6yuS7CRA6Q}_2d>ʮb/zG#e\k?2:6`괏9Qlzl|0qH|^f>E΁\*a_$mˁ,nzM0^Oi+x#&T"↪q"5>=Uo7q? y.NJe6* 4T\{}snOKDNƄO= fRgJT!cyDeUzN4E%Mf۠Y 4}-7q=c&]Z5]#La _)WgyG g?ܘ6Ee8,AK_o=_>|Iulnf#?=Dk7Ox>o|pӻ  _+wv7_߰1 |[a߹aoM}J;Ï- ܒ w)ToP"GTI ~Է #$qXsK%ᶼ1ǦxL{zI17\K{-m9gA|/6<^^ˇKJo9l=xO=}O֝my )^B-Od?[+Q8!hh=u߅~z]Eyz LK"O4yE~?/\!VOwƢ[:z ́:SJ>36&77K-љ9WYWv$8}]1xvs+~'3s5}og!\߱ 4=WlgVwAS׃g~|瘽ќ of^K}bme֠JxPXpkڶ~Kۏ5 J\ߥ]34ZO[^]psǸB^ '`L]eɫمX1GuQE TvI MKlJK[A>a9eF, J1ӎB,~:zw)1} K@DWA|6G XJɬƦ]OzF:!H][._n6n_n")a[nAM y7 D.ɍUu+Ug}][V/ǃ uӧ_WE4]nL ?3R*T0X)T9Р!m|i҅Og~{\.~/~`E} !'Un[bla'I8&֘mdv:nȸl\zIn\fV{CC:wQ_O.ֶƔx+.D4tce<#6 i_o5$ .;&flpJlP|7aTYivR ?:SbWMD`Sz࠯M_^sYMp}IzXxsƕ~BӾ`!cA3r=/|s,Wue)}N?Rk72n>yM_P.4{bI@bQ;p6S$- JБ#GXfi$fq%ƙƇP242b:8xcJ^LO+P:zM^lB7GWx$|6"!{8;83fq7JhS}٘@ -1>wȃ/y4}s6ו,R{"2ڻ}B鼉1_]9؍pƞǙ+!2^}I;]X7rW൭xPe>P',4:8L ?_OB`ފbrb6G>xy)6JPoMK5֩K_K40I#)wΫ7L_`ޱQ_Q~ |Hcjzd啇4=ju˜l~.Mo?miS<K=;X1uco[RN RÒh[[Rr?Dc(y$FművV&ǫrcc cC#(\)Zz\z4\)c; q]m9 iAFr!MS Z(hBB~"HK(ZߥSy-gmo]~ڷxp+hOWRm?zZR4TyAN sٰJghY7CO+ #W+VRboMܴ⬔NVsMqJgN>/k)=bayT۟Sm9{ Bfk#{ ˵1~oߗ/ɻgG}1zWB=:rL|'ӞD,*]|Fg\04rox-Ϭ.f{Վ#4^-muxJ)Kc{{"/SolRUV;4,uKœvr^W5t&ސyX}̇>߶YziRؑs=C>s)FF$Wi^_TO_~\񆵄/9r|۫/Ǽ5lK7&;|eFŻ/ru ?;n/Cy7׮1/}<ֵUԯ`姻]n-O/wrS4z1Cy\+Ϸ6^:c7ekYcq~|cseS--`\wqĵamGr Pc{ҵWC[:}BoY{BdFRK٬z9y5 ~:c|J;\Xp& .@̉KRA [PQA3XrH08X4D>Cϻ ]YTY8>\l|@=@WnX\Nb] Z\F,-;nYUei>Rԇݔ?"Y`I.=]}"Iͦ=e![=2f|D֌i~6p`qcZypq* VHTؑĐpǑ++z\bڃE.j@K]$&!'މ}ǁY ƊBTMʦ@[5 ]wV"d1 qyG>pÝkm%m2F!#g3<8ĒOc,Iaih$D b[meD|oo.2g pe<", VSNJ .G|b\|isuGrPMx` _b/ e^,c&yBqq+b<ޔD>hN1GY,E8ru5!ezh& mD/I:uIU^@ B{ƚjCbVxC@a+Sn'ȹЗUcny-iXcqLZ.n 0}Fe+$EXMƤMEx ,pЎxS')lX_<ec &c?jur E(1?<)_(06"?0uyoW3Gv5f^y.iOccn(KIj8Ԣ %x@E FVQ=E{s\;țktg&B^|;>:ǯYč)7h鿬#W,U{g;\qbss2>T&|?1h+?G_`{ɦ7q]f<'܈Ww:HR%36@ī2Bx՟ !?]hطǴye[h,] #& EmxHZ@ڛ:T*> 2wT^mYѧ^cxsh:zS^5!6?7ws3p`=w+3 1#:f>>c5EHAқPU_I%40vIXzʯ sϵquo|dk]EƟiˍŇqoնcF25^״nFC1vlsUg3 Yd~z+[~luR@Pٍ, y'ߌރ n%O5{WׇW︧7Ӓ? 3t>)|K;aMrk>; s" iohv3.TƁydeGQ]Wd=ha/n3X?^Sŵ\Z;߫? y=>5ghNmu%m^鍮˥߅s+mr^;>*u^֞Co2۲ǟ<u}s[Sy;+)Cks|OYOW91.+ޔ~GO )N_ҏU\|?=Ov[]/X{Yg>RY+8?JzQz&tlkXuuPBL_!51c|7{fڵsewe 31~M;4y OF2:aFl82Z?9ܳydsnf?!-O#7}ݟcO&Teye8͚\VdMLArNWRJf`@Vۙھo˧0 kR13_9r\;CD#Z苯?}w/>)-1C) =9gQ@Q<ɕX$YQIhl$ )mzvD5' MV /fY$Hʭ.|PMFuBrZ —Ԓ*JˑPV9',edM&]\U!9./Ip ȧD tr ciZ6w[̓K]RWN"BkhtY' r!')Y!oq!=9Fla,*P.qBMEyCo*Z/ ˸l *Vbe-p'/"ѢzH/*qzxrQ[."\ W7lLK6Tx[@m:L\2h&qd9r P2˹>nx#S()U[ksuF c';u:<䘩Md]j]``{)pHk3p`f; n΀⿵6Oo9-JrCZyـ ب4&MP r 2SsI 㿉/uܿI\t"U3\#lde">h6?mv|B M፩]r!JAlL 0La>rĶ1NuRL Y7n!\B+}O-M{fI ?vMS('m䨸T}o2F^P[ၷQ1 ڎZ@LwȧLoJ7}s%>cgMڭ:({~q%g:S7vT3l~J}o;O3-jb/} L+rӈپ&Nb +vdw׹7 Zc#J0W5r:/E̦\Oڋa(h5)‰-'p>enԳ.bs]du(!N8e#s ,>@ pYWy]Ow'`Dэ>ag>-F>'c)e7huxSőP)6Ņn ?u@IDAT%qS˦^vhvfsf5i̍sHOYxQ3o][6ƽyg1/gm>s >uƯe˱~ubrS qY ls]68c/p꥗Q~M}:UVm>7u_P/}mu٧~:?Op yx8}&vso i}X3no:ZLfUYY,[4?_+q=nL\;S^mS궸Sc~TYuЙ|om۔'}jy;~ct95No~u}9>|욂s cofc~M90o± 81~*&,_D}J!6`QttYD6nh]<_dK| /u2 !f[YN$zW=yE6hUgkK ]TGhr@87YaWxwp\/=@!Ӆ]llm7v'@_ظb݅_Fl)72䣧 3b1_AF-q>!ؖ~׾I8u7zE!#dob2M[W_iD~[%O]OFן3YƋПV!㖂wKVqYQ{ )ʬLP˸Oʡ)e5qr .c] "j؀ sl?|7NABf#WP{ ̺Ih}ƀ~RϐAzNPVIG( 1c.:cU쀞"hEv#"m9'tก>j?l?Jd6)#KͧCE`'m^|p׋~V&7=?z-dPOw xKab?뷼Rz@Swl$r}j< xls튗 veT ɍ1jesjXGӪv뫸xZB_t^GM&alW7}DF7"yXe5c6xUU5g|זP7CyA6.+o9e"9'X1sS}sI@Gc|z쑧ik{BC_\~tC_C%fizJyOcĬ6B""f(?ʷO-iZl:zW, or5hn1n=_qՓkdvkl WܸF1_7aF6/^BF ;=|ק6]XO]O ն S=Ư0Ff|C¿uuB-UヺHߺls]6yW:A%OiGoЀWc\|ז⚼ϧnV4Kdg#|71Al!--o{oc,T6SfcX9Ә +{d+b>t U2cl^~i]1$Ư?prW|",rgFQ/GGq*kk|Lӿe/;GeϧX }k%7jz U99=?'9z}v{~4O13ux>}|{~#榽W~{~/n|~xk=OF^={}ǎoi~J~wi'on[JoVhn>=߽Zݽ|{{iO>/53+c7k|W3mrm!‡?XúfxHDl.jwn=OAT{]:I3r'[lJֵwk,I>]UshHxc1P /!|c.5 ; a`B[$4h֌Uϛ_kU]ݣU^ke>3|rʈ/;veL6x ܗs]΋;볟cuw;`ꂣS5X<|9 {,bw1ǿ1}?ڱ?fr1G4bp~ٵlk;Zɱ66-=%,UuDoLd.on>әyNٗ~4oOxxo>{6^˜۬b`9nǛw{lCDf`іVbwҁ? }ǀ% .%Ej L9P,*J"U2k?pPN0*``7`ҽ0$(w\yʌ?zAWYe['WiȻ9fH]O|OLYxys/{UPI¥SJ`-)+Sy%|-gPhs.mJKȻoQgC7Uؼ~:F/ n+#M:zėdX}{,bK?<:֓mỏ\Kvqy̵:۷yjJ÷2q -70)>K奷6wCnS-T[!n0/ s+.@Ҡ gߡtכKۭ7;P$v'<"?7, ~;eI<5fsw&yI=VTϣ7|*}`.yK߇D굺6n7kj|Ha ͺ =y4ܑA kEQsl>mP9\zPsb/a7(Cy҄C/E.U\'~Niy}%r ]QHp!%7|6p)/ȓo}gz3  }r?dg \}Kۗ? PC]j3_4]Ey#r͠YT!\Kv" IY&yq>c|"$zQeTo?OmvZH=$:?33 M?EzO+xYЀρ4>p/ʁR ڣ?7i')ƞe9<Ї2:Hk59㷸=.[\O@1@`N!kRXgWӬo]8F̣r9*u])%(lǶ>>']@mA?o"wn/ՇqmQ|yn za6p`S|ѾSS/.i  eCGGo_~Wbm=oջ70 .Ji}>gPEbX}t!WTOʵiq_$9>"I?ZOZ]8m<`=r}4FfZ\mEV!< e߾DL]5ykʩQ[SZv/۳/ UN |k~ϓYíG靿"XD>wi4?2.ʅ0wQv}8 '.V965y6}U-e~R@CJ鵸uhk;|4Ilj$0afεz3_y*aʫ}j{H Q|fZxZx#r ӑ?tQ~M\!NRo|m+6=ͩW7'+^f} z??x+N֯iSI:ٿ/bVu=pX( f oۤ;,ny==6˓oOM{.HtϺKfyeWDž˞޴m(_MR!(כAMMXIo2m Y}Or{~57u_c=&~Mz_&O?FW_x 3c3 1| =tq8S[Qs ~".sȼNt[Vw[+`=>:=/?" Ͼ ֹωO>3ot9!{{m0.wx(BpeV6;Oos鬻=ުwyu'؜dL3-t'ϣ B 72>{'o2?>dS>1$ߘFϧMi ut[ӻ_=Ww?g` SUD #l#x$N99%K|G?˝7usp;3Y0`zgfc]o*Zo&S m@T*)[i#\/KcU8;#ZlGf*2I`*ġhN ĕ>KLIG>z/8y)rRYI7r4|̝"40_psTv@X^Йk$PYÚ| LQ6\H獩u3`GHvurm(`Pыx ?oN;D q/j$JI<Tr 6AS0EΒ7Ѓ#<]fJG-$l?Օs}M}@U?^s`QtV &%HdW `K+H@=&Iqn'W rae4 z.nFk>D's }X]-8[dB2wΔS?ە`qn) lmCr6`n }HSx76lv)DͽT\9YcʯE?Zϊӣ?jdn&_3C6@jiKf[ߟ:ŭnKg'.r[vZ&ql4|Hӗ7i#zه췂X <4k?Mm۾}]&4d2 >dHPc#8[hU%Ox~ЬU]"[-Dw-g_gj)`"N$vauO>_o'OKw9Nڙ`|~W t=^cF_ Aihq k'_п$R1H7-JvPapb[]GyGp-7>U/4q\9,tVm@<`kxGp9$ Y$..}Kt|m [ <3 u{ͧL͚kz76߶l_c`ɇ,;c%/A.A /(Ic<喫wu;lMqu_?KkCчzPO5@և\ }!xViw6 >wH[9c 82ӤM*k0lAL}w_ʄK_4o{_r8n' D$˜nzh/?c ZF|yc]ew @~g(d$xwv2F6QD޳d0U.:P]dqo̻yV|=Ի{\!] =ƮRSE •N^s|ū_b=s!$#7u\"sl*"_INUNҰl)^ lHZc8²mj+˽6oY=fN>p7O/G~X&Auu%se[6TY~Ss S:^e0XX<*خ+Eu4h=/W-ɹ~EgMic]= #5 r`uޖ/ҁ{&ϙvn5- O͸e=k [Ǯ7,x9}!~ ;@6^hX M͓JpCJnQǪЛ]U[Oo  ^F7}U9Ҧ_N`~IzاTtM^UOm;U~J 즿SR7pfM8F&{רp|H;+>g"u{_`,F6ce'w[_2V؅}f 鈭y;a=Ʈ8\݀;Ϸ={zboԞgP^QJUaIgUƽ8eٙ~~:[Hc%pz2q|rl ?"£m'H \ހu&Mį?dt㜥y*,,FL TS*˿#jԷ/ ;A yC6/S{]W@84IھFtyS]_M~f(˞r݉u[WKщ؅YG8V`7%VY(X4`TduQXp!kNcd|j=gi? &}g|ćs:گJ.eSmǜv:.n'ș*}UuC M=}"?hAۅڶ+ 7l⩯GZot*Kg]y7@%,9l[6W]ƥ\"Ke7?9Ynɫ>_j0 ID 5HPY^m>kSuѺs[ gG Ӯ/ϼcZן:禑?oj r6bYOHŽW y<2/mO ?*0׶L7(}BGGpg-/׽'HvŸMНBOzҔ6ʑ).: \B!XnEY] ޥo'!ce@ѷHV+#'EiS@3XqIϡi3t#yc0Nۆ1mj{#{4?𥟛uՏ9Ŋ;R!:A|=ù:?}.H䙫/l%dyGW@1>8few=cB _=-߰%x>wR8mb_tm v-mAvu_w`[ezV?ڻ P72O{tDu~4|i"@]V9w,LL_Nч˷=*OE(};AUq]kГvʖK__*;ˀț"y߉x!/]}k3}A)Uxx?#>}{{Athp'',ޣ>]`>C& oʕv5g{2d|fii*f<Gěm`F9S`=q/jh{p +)sfdA)}cWiG$1y[)?`eg]1=w΂'[Oww[?C>q8.3Qlm \zy׀O\< Oí|vml) Y0)S{m6//} lKD7x~ztp:~iY.3 c$<|q!~rx82r7]E}g(bz?%#xqDF|ζp*Q#~hw/NouM ?_~0;uO>'$}$cm'Þ(v;ְJ&bJ5NCrҾ3JW pݽN(i$i7ő7YꜷCCkϺ'RS5S^(}x|Q> [N8BԁDo:[ /bڔx&2ʡkѠ'+YZD Z^hZppJu贂D58Ysy?b.zb]ƟLw)N&ҡc9 y& DVVmZLX oyrc /hӞzpGZ(6P-Fk~3XtX&N^]~',J&Ǚ ?ϜpT\Nl~gR݇5],& r 8KI[ ֟/voSIQes"QYXKyWXTTCyȧTNGWĩF  h R>mrתohrIԿDZ (&I-؜QgE¹|ێ$O-8oW6 'W.csE(?mN-/*J޵ e44.|@ۍAo$ʃq=tƁ9鷱ג"f0vO"=$$u$ nF9E )ƤѭAsyϽ=q*6{ kHڷhзhar|#?!cMseZt͵ Y7_l# 2C#7~dQ}Rw_/S\#SY4^e.C6`;v{v Fu/YچH8,_U\OlN5 ꎫE¤m#P$ۯv|>S]hcg#ad6j0Fkzp+kʁQARGT/[b`zO\%ԭ29^S uhW$p  (xoiSO*E&t5(f E?'챍3o8X}U%Ђ=E; TVLa~I* V;Omi326~[侵lg2eVϹp;Wn//FMQk ~+l/}qz Gor?g5vD_%A}mfo`MŖ̀v[I['kuŞQ&N71 Ɂ|o ~] b")' vr*7U }ôBFԍV%i B!ț>6ͣ,DpŽrS\? А?Eamʭ̰OV黨~N_>a koj$&9lpD~;=o`Fړ/N]L?;ӏ|TspnD+8s}hQT蝳 -M:_$۳[aw@305K<=^,ѧ<^n{ܥp?r[]?n5FڧG^UyӋIAlrI"MKG'Isnqx8uo槗{V~z|HU"}?Kz{>ϰ\dž>nkoxUpa_fy[ӓwO~ݽ2&͛߼M܀q//emy&Ǟʙ{gk33)ɳvL c~pr,܍Ϟ縜- 3vQ-3G ۷y,8w,6Eיd~#`ǶA?ؘ>353+87Yϟ}^c -8sVs:X?ߊzֹ_kRk8[7D!s$@,+!p)'tDO7>749~' mj@;*runGΘC)\Fy2Q&O:a:Yʔ*v2tmEe# (_[I[ȗqns xJC]YQ\B?7SF_~)gqN`B -,J6 AWŵNDR}eٝbN~O2dԃHŬ"hq^.m*U uK#)K+EJ 4ZWas}L@o#)Cu~y}7Zi-.ڃI^Z^۷4UV fԵ4S7lGѥKTc.n'#d4ŹD'[_6]CmCm.mr [ԏy6z!];|g%0Rx P f+opmP mFم!ky aO.:D&wȵ:䗠.G^9< kc'ʣ2 d`6S2B `Y.o&qǞ|Sk+pSHK;7}XbSOaWcazKR}lρeCQ<]#F$Y8x_nl+TޗPB\.~ÿik[E `BsZ:o>-[- ?#iҞ IN>L?NooN|?~D|zuwgY{!viQ7q >z'\a<_ĆWelA8Ɇ^%#yFH}(䵩W~,$tCkIwȠC6l!?5G1j,u|^8Fs{3%Z"nNWsԬՋM*f_"&@ً֐4U<5gUV[˒dM%QּJ p7|*ʹjeߒ*܂"nX?Jޑo&&!t_Ov5ӕ㓥v=?YJRU*ϓ^Ujyv1c=cسWl~ ӧv簎?I0XXϹ H+^rq.TgJ`[ܔq ;vDZ9s6?"M1_5[dR"oQ`P O`oK,$ltpzk?xc{?7{?ߛ[?== ]HK3#LJ+$F^EC_'HӉt.`.& ,ª*\GUpݦ^J3E'^BPQ= e<AE'˗.}f5v <"1:.Ni^U2sߌ.|:yj87<&8G gFcO8$A\6n+ABCO<#'y~8.fRk$W-"+j·p?[6A]1C߼%7렯lOґ7MحZ]:U3OoYa rl8msgw= x>s21ϱmPMXV75Wuu">":(Qo*2ӂ_2O+ Ag/_U⵼8=ZGhgu*Y̖@ zA +N2v~Q1)mr:Q/Mk|Z:z]x|/OC>֡iy@ Bzo kjRh4ŕW<&f[.}(tkmgQr]s.L?,iep2'\2޺4޸;Kv2[h+^~f_WrN-oۯӱȞ8?Nȣ2C@8|ͣ+rU[/U(?kJ@IDATM[DnX>BJIFSg ܗG/KprY:v,}$##yc|'g+YA-WmYyH~,;`x"݈|v"R9P&dPY4*K ]gRo ~1)J?1RQ ke Oré#S+LpIgn﷡%>nwwJ޶A[8xkDqtK1lB&O𕾍:3@Mx/h+ NWgm eQ݅#222υH2 Qo4ݮ0s%+lN7Or4=W 3,66L*:1i}AR Eԯ/S_[dby帏vES|Յ:@| c&\}ָG=m,,3 8YʥiH냇lѮL.Yx.>YnϏXCàlQ??ے6[O4OB> >M #Qk{cvvse9N؍&,G~;nw|7 E98c94d\r1;x|>ӟyFBz9 ēt"6ʮ3-"+ BgUT3G]\`|H~;"Qfa4bg|աkޱь7|cu}i(h[{쪜Ձ6HwL/b;'UPkH҅Otԏ5-ܱX#Y\JG-0FBo[\|Oa! \&eB}fFTWZ|6Ȋݵ4 }@Q'2M~WG%ܾT x)Q ;GG[jӟ^65`4ˠG)Wk{(n6=e之n$vؔ.>,&|J+E SVԬ'qRa. (K҃H?łM{Mؔ9".SrLd3>"0y.kq̦ ʛ!J-5`eL ^W?x<⟃ªbcCK+\0& re= 0w8KcV`~z)zF_̸0ٶ>RX>O@+]8.0N:x𗅕Ef}НuK@ѫsgE#R,7]mSo8I*rm,:q ؾ!;VlկWMt-z4`$7SMPflmG^d;^& mQtm=@<'0NPO `WQ.uNǵ= oʣSdUwŻ~1~JzŇ-c|zȩwy4i d晶tQq(aiL&v4hg;ڰ:mp`{"nq\`7{|AMp y.Dul;|r7m2#d_++oyW'OZE43u!jGϕ% `:uw匞$eπ= ƞ0_ɟ|]NR3a wdq eZGE>2ݠcSǸyr`Bv۝'|E=~sd:Q9Mjz2[h~&?V)#(=,pdP<뿵>>k *s0k]+91ǖ8L1-7sث5 jq1`27Z, >F^kZ؁w bu%CW뜞ݎZ㽫Qwtv@|1w{-6<7wS- ;xYm߄禼L%WOʗto;y~e6>y֫¿s>|s`Ϸ^{*6߄~_~مu_dWY[ \jx<~9Ǣ >c϶ǼM S߱'_2}f%s {p\}rz D{l޲˖>0g-ڝ{b g2ǕO<9@LA],g8_ gfdc ;Ƶ"8휁Ost`8oqy ys[8^9W]ec} Q]@3zm{=۹G~L"H8yDL4}pӛL _?Nœoۿ5=XE:;pNvh8dRgb=c]G @>0FIJ*e"#miqMoxX͹Ѳ?(:4W'љ`&#z=h= MjoQ$`:|vonD'@ujN4Ƀzm!MEW/7;LO a'H"RE'ؕ ke4U7TSn3~ @U'NWdoWvXIKnl[\1~]QC]cৰ4>#HqEl鮄dMz`۴{(7Olɵj U# o dC>DU:3ҭLcLJ*StYEUo@tq"Roh_'I;y:-TL$ǟO[l2iSԏ:m6j~Hb>)I|0Ӝc> l7n ?du/ T}kr׶M*'W o@{'&\q0ͷk}_Y"]`4>֤y.4W}S[j;@L 7|aַP)~ӟ]]xoͺ%-tnAk a=“웍dApx)dgƉRzcQQI; F-+=JM{+S&OЩ}_+r҇7H-h62@T](7ly"h?bMzH唗(3UЌ6TPyx6q=6Wuqc^޹okQGr67S O;s$~{Pȍ|Ïsw"t^p_)Ke3IuNLBF9E0ۢ0/0npnD[`2xC36pP׿6 |ۈ2X}̝pDk/|ۖm[8J[-,3v=:۬~|e0g ~vx@x}h `D-Gl/.{P$1X:e>oR'.xtJ,v&bxM[^LͪuFYZC~N]8 |?ç}XE{.b딩cq}{'$N0K=O}՟`ϩAY*}E; d}+#x ʱlCnCa?;[}O^.xv %.Qro4=_yEbF{x?-YUlUb4cv̫+}ZHښ,4^TɚU$CjUk?O.g}*>) ~J<_?S> >:TQ@'S4­Qx gb ܝd}o?rwyy7ϝѻxnppE_J`:f+gf['j{WOY[L{~`Nh|0WdL9M'Oeyu$]\Q'%6NnʐIwd-.r[M Xg:NֈSUTLO K] _yރ̫^.I: BN7)Пћ:G iEYc܅5yyg'u4 >ЧT4t݉p;p+'rÄH…nǻ  J et<4:x m|N!Wy#"' Ӯзt db^g[&$qsʎ<9|ȺZܶ c}8=uub@y:^I^I W"Շ)~&wnI1-~&¶Q9/Mķ"շo;]ѿr+𡯦ͷQgib|1%z,`\ٕlI >,3]Gq 47 䭶O@G@3`ZI7Z- ;#`RW/H{IڪAViA[~sYӔ{0-蓲u[mٚvtHJOƀ }sG=_pug_,U/7UNװJC}^.rCK5"Kνޒ)EZP;>.O`f˶C]ͶHyV$g OQǾv Ji ;o_=:)K<j;[_!vI`lB{n[ǏĜ_}/pȉ-4x>+mB<ϙ 4ڏ>6nmEn<<΋Ȼ+H<N>({!" ]C{A]4Rx<6}V-oTxpvAuQF!9lx6}Åq%Ҩo<?I_KGշ,ԵL[<+" '08tH dvU>8}џ x#>77 A|O\.+a,%:ĭfu:`t 7 b”66:@tgw٥ -(, vq^]@7》ֶ>)~+ O++M7fwd b1YGu#.m7)f5t'+sG_'c>Mm~Ox؅7iB נ}J`vPwΎkӁs|gl[AXy W?d#'6E:Di?jraкYD9w\(_ϳ!箠w׾}] }`Ö݈`X'z@r`y2 M>63ɋe -7=KN?I..y@>?o"*]J~l3}_T.t,D}QWZO\h)ӎ6ylݖz-+Qki5kRq,ieyU&ao1UF +ﶹox9.o8iUތ3Gz5B1uK'":u-=#uGuZ'eqG쳐+ݾr9x!93JsY9nJ޷ɫ2e647Rny]n`{%|l dD{n|?6U.ӍYl6wW@]5)1y#ƢȼK~'Ȱq]{':QONeL=~Y-u.>%?3ӵKq,G|9P+'HKVʻ݉-K\3ø.g8yF+7_a/3_WI 3%7+'8[Y8ڷOYoRr2wg9rΛ15w9~'rcĔϮ>{O Wi(+ܪƓky=vkߧ}<LjIxwy)f>Lq 1VfB>]29o+ㄴꛚv;_MLz?o]/dV2 |{8FƷvLe2d{k2E<`y 8dC,Q)tl8l#@j-B+xg)[kˤi굺 =tL'`Ën9;Mt9aavTK;\Y4x$_#p ,X_:!au/yD+Yаjyoc R= @O^ѱv6 夹h Hȣ"[[Gcӹ`a)7"^ HV-4?wk(oQyEGarooX <:Xq@ĺӚ9s569[hKH̉v 5@v΅=r1*:نO;ceo4%MI]D!,%.z@O@}xQ;E~BI?vMwnZ{m:t3 t7@=ʈ46w n P2ϖ1$%2}5ks)GWbs'e0_y2=mG0I;_iv/:ڦY>,@!bEU+v >/]w|J?p‡xx X|mZѭ~mJ{Eׂi/G~`ൺS!Ϥ\.}R=wtG2ٸH#2`S&&` /9ZJcm'g|7X} F +I-0WeL#_=+}%dz)>vinju %M&g{.ş7>%}:Eqe8Up6Z;3;Θ5km5͒f:EZےӀu!e#〔צǖ8?._o8p(e358ke կpK&DKtGzWTwSF5xsܻp_jC|'I3pQ6ؼ/}wc^}ԳxQ4qYא_dޥO 26p|L8.!>_G>ÍqGF/^MoZ#Es?GA7w*mnrd|o8_\[n3:17.>Iƥo '4^yE6Y3U?}n%sIǦ{O3F޲qyr|9-CX ]uKQK:۹ߴEs,}XCi6m&5 %>I;NsJ~R@ $@ѕNd sΌB'ev2 ЦL>dbIDߘs D_~y׿NO_;oMW'L.dr9̈NVξL[1an_ɣ~]Ube? :%焵FXѩ: WL`UBrft[jz)`4Adl&P͘ dc-oB[2NIT l(MjF=1- \v6+0Y,D`{t߉@\4tS[y<'Иɠsk2_۴li^5\1@ ^}IA9\^ֱ|a v tB:A8]3a#j8trnoYZsBLLJ2D#KR ya,ug,ԕB߶=&~#>',Dv O"?RhC' Z LVs,rɷ@]#^?o WC2Aۤ33)ܔf nP,AB2ѯ=2,Ӧ)K3 3[3`O`koN/al4VMپ(ozκ#/>"[x+_}x2ͅoۖiSȷL3r݂{dT_)Mv]]jNpӿ/\0~,iaK eP+.\rŲY)AQ0^2qP$?Ҹg&5yCCQXKz_'h7L kDfH0:RQ=G#u{OT~kXx˿Gd{LmO4|S)& n"wph 7xͥlw4fp}l 4m[ʫ~_҇{j"7˒A7+YQ&]alҏe? yO@?PW!w量Ez6m?m.]h!|w %ulCpdS{A{ B󎬜A6=Yg5 ^2 #*W%Ձ8pÌ~m[Xl>ԥ[1>f_ Cgv.,%@opW?)8qv>.پ\l"ʥJmLݼ7M | l 3l@9:QO\奾%ew᧲B^5 bva5{5{P}6d4{k>|ibq<2ۙ0% Fsecgv)%hؗ2;e(I8 ՁVQZ1;#N"'}OcǭgRd1<]Q"T<]GtV%9a,.'4TPVr"OU7゙G&Ԑ} 2͵ {y499S ܒJW0DM=A -6>F~C _788vM_ 4WkTQ?5R.L|E}m!mɋ}u)H\ 9xģosaɜSq3zX6aB7θ@Sا+,@}_8Ehz>8Db .@tP|zre@` t/M{nNT_:<2oF8/xw8 ʍxI &׻#qOam71ӏelVjh:\ǜ h򦞗>f84{p0=]k,tF%<ۗ[J } ’׾40 Qs?@N՝yo[JY|1y\5Vo~ý}r6:D uoYd?u}ҘjW|'a->u莅 %ITI'zTy|;[=1?iKڬzdnDG#LdHπwήcȳ4=*?ҡR7MO[اꐵ~-|$Ig[9Bx}W= _&:,'wh&p`m)~͛E=U mI}K_N:/Nkoka4O/NϠͪj>a;rPy>㎱7[gʃ[=O ;vF07Нo?8 ؑco^.x87f-L {mty9x yQwYwl휙J4<ΑzL(;C5O LiIP@ށbD/[j}۾|1qI> 7p}{P&..31Ww>&Oߘ7cm;ߟ~u_?=/qRa簃"xLDdULZ%JNq3A3EKgb\X@>taX=L]UF'MYL;Z'?D5V&bF!Qғ!T)N>yuS^ρv1tC&|\6&D#HuLVmw:q3e+oWRiJ^7}r9/ʣLl@IJ.$N FpbK;)/6rC͆6j <' G~Wjv yCu,ʎ\:UF{R|;/)9/^GP.~  ~h<^𦋮v%:3b^ziԀWWʌ_}kqENi_4_moJ=taNÖ~0<e lJK73,lӑL[l ǹz&%5M>Ynh@WnacڀWCs~r{y6v&ݒuqrZ4UW=VGƘp B;<+.r}_Y\iㅋwJ ycC׫[&7NF&S kS]3E?}y&SL>_}\xAo+ie_ Q cy1)w+p.q鿹.oQ6vUAsYXQ1kMY%E<@d??y^d^UQf(;L|9~A9\z]H\ Ze>o]sdI ?}T 0SNa9Gc'&P'{M~̫׭Xz.}T?Qأ")GzP@~l<'9~6&KDZWm`)lG6ۘq36B[L<I~o{I8;7tYx7t,/rX|˘RoE^Lj.rq vFS|xkOxN7rَo|CGgg5K{?92i^{KAB 3SgPSQ-}&~Oo.'ۅ՟!.2Yp_&i+Nɜ.oUtBb$|Rbu\9y8:E 2hĽ$pwٔG^9a gq[̩aWܩ|N]8{s|] ey=[~/~D)$Ƨ2NʖQJq^vlGK@IDATڦN-:>{3GDzB_4ͶQ-綦<)lw1a&'Y?៶:u_d}s/SK>`q?~ϗo·n#5 o6x'1xA  ?z_?J9)Mz&8}_^~s4gu{VLo^_F,yxƏq*><ǯ V Brm֔}x?|y*茯qrM;(c?&n,䔽q&NNir5?&'Ĝkwbtɿb"y^̝|b\s"ι%O28ʄh~‡'(85ݜ:5'ϸ$>y-..Y/ʀg8cnzYՂ(8|__ǩAI|3,PP@2v6 h^cx4HrD4< pL!z{/|˷'˗b/OZvS^3Go-޼ zF7 Z(䁊aԄ&e ʯw[oR-C> .fѝQ [d7&|9UҹЯAͶ/nF= Tx՚W»Ǩufb[X V^$Iq1أn)CAr<zB90<{}aS1 o䧞ʯƞ$~tR3۵RZMlOiʑmKײ)lm@)xP?Uc]K=O6Jߊj qEF_o1|ܗ`[ՇcN&ïOkWߕI#rx sAA5:LXoqV,0 , k#K%Y#7Y`Rk r)}[|ǹS>-m):WjT=E[s>/Y4 .mB LڊS|)\(cOZȋ{E?p"X=l;G'qKeq(m I)-rsMۢp^U!uZnWIT1+ՑB?!A/7nʨ^ЗTбS,xMދϞLSF;bX/;ϗ-=3oȝRTc Or]F,{K/17oǎ GBdy@ a ൏eܵ t39𓞸Mzbn}}v5k'㦶7?Zi5O 'X-v[ jV'Ym󢿾ϲOLټ}[|<<][1]O9_7 2Q<عsbƕ\~uڙ&9;{73b'͉Ʋq2Ν̅Y'^~|y#kי񐂱œosCsk, ʌy塮L<XZ\p/ĀND}+:Ah ֙,I@< z%)X#&:TѴO0j CG` d ] Ln x҇$ -bp^89k4T}sJPZ:5}uezը/T9 dfiԃQT~oN5j0Jdsb >PTk/i׋C_"C;adbIN; m9J3҂$tpލ`OnsyZ'Ka7O ϐ s=D)7e̠^m "c*>P}Aa%ӓ/ud@:ˤ)me(sf2;\,S:ƧOw}["cgII[M6R+*&ǧAN ce>zr yxP[죭tg 9n8|K{qt>(L3굦o3^a`ţ┮T"q5ʷE-`\?d|,M]r(W 8e\>i9TzmȯrvoB>>? &Fki0c_qӲE:V>U͇Ljw,jPݼ'~c[i.ѻ>LYlޙx؍ ^졀ӈW^fczMK9ٶrSY<^2z0ҵOhsP:F\;A]u*sdEcOf(3W ҕf;7mŀt'mJ_]Kq8&la<ϸq mGғ`#X{hy^ WYt"ʡ_z./o9L2l}CSzcoڵܜ!Rpw l'WO\LXZc%:ržJQcmn+&cQmݤOP^^vB_yR۱qF6?9.~IE]'[չNT'LlN7{R:Wg1>ИŘGIJ `74_?ItI}t :+녿 }{c7<82{Ww/ ҿW3VzIг<\4ucgʦb?) ,dz6.e@W@ t'QAN#tj GN}峬,wECF7;V/I~¼zt F9^Cyϣ_ gH^>9.`zZ~zozM;%!=G{yW~RZ77a>[߈oڱ~X_O0Yצn.O[m28 MER3 r],y Rp=D[=#M\z§y7/_wy}poJyK%EiE/C{R9iL͊vvWfzkr>XO_Y'mq?{jvǺ;_Bا񰃾~4^Φ_˯NY׏!w]t{|[ jV'Vcu@'VO`Bs5fIK>b|9܇+0!}\s Y޻ ,Xe!!sY&&7?Fs{s?OwNl2o$cl9:y +!̯xƃX 2alLgR>i}^ݶp܍.&>g;-۝_oδCW8ؾzzc#N oS'!?xB!|7+O’DxD1mjȧcPW:vwW9W/OAQt.04%c&9nI*'slZJ3@Rߚ!6 :IuZ{2ȷ K^љA'Fm)`K&^yW[TtAYP[/8xs`}Ew5n$LJ&Agӥ@KP(‡lJ]y(DN)pgPOflJ\59 j}Wd ^|'xG> rv^w8SC,x#u2%'lE3ٗ{&l(6[oie_h*ډs|*djP~S?8ta)>}ۤO3dt:Ia,Pb<`gl?Bo~@c.T9Wv2b[6&5 UPN/cPޤقcHI}[QXmu4紛OU5x5,--is;Gvy/`Ky' ?k} z˽U92n} @aa7 X؇"'9?eS($W$k_'[d \lJst,%w HyBhf+n@O^ "Q9ߖMOYo2/(/tSg*9ZLB+en[?gbVntr8R5GVۄnѤ<rO/s YL.f4ˋq׶ܿSzW>yi;:gk6ױNgiqq\g 4Zq<^xY5ylk<7 ./J"}_ ܿ(܇'&?zMkm乩im>eOg]>8qú{J<=OO?X~B "rdl8Pb@;3Gܸ)%l>(y+xim;?vl@.!ΠqoЎ{xpcB׼6BMI_=\޹c>0?qx(<+suzWɒs(̚R,9e>-8Kʊ:TV=W|xR2Pc)w5A'u2EM0)ɷq}-[ V)wfyL_G!ʁ4H"` ea.<|!Y~FW.oA/dKґ :h?ñcd8ߏbr/12O 6q׀OσH@cǧBl#6x,m ݋˧( @q X_Tn7Cܫ.݀L}>)pʷDM6!.?@/W> };i2|`I68ˍeMO#eޥY޴r/(c <'w@d|XV^31&gm ^^i&6 ." *qzIzL"7|y-^%A[ VdWO;Sۮ>@rs9Zh[?^=dLݍ뎼t$W1z^<͢A؛c/.nsA<*?CvyX7玿@p:4?Zd8B70Yž^>TtC762J(vSvulbOu XsՑ{n5ku$9YOÃ}[_]Dl%sDgG&نQ%G ~An],i90K!XLu= 9V;.[1I=O5 =[MLQ\X^t=~sVqr3tPېN?6!lzlʟ%i]c k~gİ=g}"~3Tp?Ja3] *<="i#'pb_Xz+놺6u.bvfOS;2NG%Y흨5vfeMz]m竖iyW߮<3:=씁zz\6zuўj/}9* ^A/h4/\e4jx}_>_t^/G7 @|;uzwƮ _)  ` !|[ '1V&N<)y܊yCKyw'iRK8g'rtgަt̸ }}|b ;>1ı|&|<:ԧ4ȼ+n@-29Syp"-綝m+ġT#q + rE1phj 1+\c:enA$6 yl""'G6p`Y7 \ 5h+&ϖ-ѣ/-|wHvmg'pI 3|3Hԛp$PH'u19店-0x+Nj%6;. 6˷ d:nw"% پڝ`9;3 K\"ў.'Wn*ζwV{O#1.q(M*+0oY>5U2{,Җ+u;$Ș*iGq 6n?TZG?EY2h#|17s@AGjopDzPIޫ +mx#E1Q٨ܳe+M|iu+&(t,P_my9XΡ]86di!8|]h&d㌏Ҷ[OeȽTnC @Xvy| C٧.$ɬku'.eWꬌ.˯8Q^m&-};E?u~+ A&b §X(fON*1P$\[>_DH;RsGUb3ԙ}챼PB"cZu ?e1ߚ3J۳sZuv}Z9_c$gV%$-uϪ . [|p}^s}ASzf{pcyA"/9 ~N՗mi3h~3mX{,gC~FR۷_+^sB2u˚c^dՍ&w]y(xƒ<\wL0bA lScbo?1ꁉvS_:Nͧxe 'Ry {C> *MejbO[*\D%MZ,M9퍍O,H۟_[)_x< zlV7*\u.&NSӧOpltˮ=]?xg![lt6q'/Oy Xf<ƶLz_M $/Mb'I@w}D~G>|LiUז#Wmc={`Y@A@ NA<(mJ_*╗ܳs[{>.:z%b1УgbWv@ 8/'|4ni_GAߦlT ^c/%J;'|fNC{v>9RzD;Wp9cI_';#o0_GNiv{rYB<#ucb=ctš#x()cs#ڸy~y}ı8sv m'.ݧ9-qZѬLP <.זݢS'[n"Rcԗ{rŊ@+拾 )ۛ6?\Y~o/9g6 (o׉Z}Fpu4-k4PU~lske7ڶp׶kʗ0=ݯBHǭr3 gY1zf,{o͞U7a^vp [ h`S9n5p[ jE5p<:^@~b$Y@M ?f,y񛼶o;5ԧˏH3LyJ߄hL¹S{FmxXOř;rnk݇}ӓ<[H;G7Ę4bNw 0Gh-?&,Sd#.! i/.:5cn< woY㏉z[:ݤ8[trr,4hc&hf'@OU  +.pR/|T#ߌրGEB}xΝחo,YwKX-Z~'˟n~-& aut9$r\\:Ssok"F4f ;egauFR?hF&τ)1J_~f"Ko14){&pHƌ,roYs:abˆ|a{z M^ߋ`D\>tcԇ+usP^Lf+ ֤wCΦ-`ؽ4eH= IBd8K;ҩ>0 j/h14>8e+?ef90&\"N]_7gIT&K+%L8+!jh$hnB.:S|K}Rңd[x G $>?t2R ⊜23/u&u0¿4Y*2FotmKK?VՄO9;BT<  /W.~ y ^&flz,u$PS`j–<\\]*axOcm6*C5H$DPz:)-u"\t#ȳ5+Zđd0lU'Nڑ X>8&OO وkYYMWj9[t:x8Du|oQW;bF\QJ]MM{nK=7I_|F]ŒhRy69?" )x3:PAUx4f%?UWۤ<< 8vAƆoY^x2j&K+ct(>?)eL'UgmEMHO/TԦ/d@ϔIMR 9 _s 3)#l{ }q˵KWk^ Xu"rdL Uߦ|sj3.m쒅׼U#/?g'ܡ0;x34:B@ rd=<i_m.:uQssu;l^#lȸQ#m|j:OP^ڀfр{Ss,1]Xɦb^8Sna_Ead !*/uNw|/`,ou|R ;ސ*^M,>^: ;Ϻ𖮏m׶k0mc q1䭼]qMp"k>U7=~χqU5]{amWA?*:Ǐ~Y11oWО;eow[?40ez*h6Mn55qn5cS;;XhYdF+N3T;Z%aXs·/y܇+=p}Y0<w7W ?zL><{wmcy>|0;<-cd.jy8׮u'̾ /s+3adبLDzEЉuZ0Lݹr~ۅ?N-ueXZyx:~y?i7&&=&W<`AJ-gOlyl#ȴA-`x˼ވp@Øe_%8 '*tC8&r#c@`3ª84d'@cT< p xH|lW>^~k|uxua$ K@>US-l0Qx ޔ6&Zyvj ? @vhi.mvOO)3Gryu 4Eo`g{X)8mL{# 3dKJByɍʸaS/{6ж{Cg"^#ҴϏx #ՎwO{6oQ|g}[e_wyulvo<=zc@IDAT hW"U( eZOIH&R#76f&G*=TCO~mlrMc#[4_#7(:N; 0cȧWvɫaU켒: G쌣ݢB:q/sS/+3ϫgPhyK `2K FҦ^_;y-cHo&m('yʪ.џ:wu>nZh.XnPe=tc_>ջy+se6i!MR yyMO[?d}?J>M Y, IRS+]8{d>ل>n4r v_S><5k<s-i1N[VqR9~e]IWTd'hD0'˘E}d>Vp =!gxnįػ]ױPyO{y-'x<Ln; I"Y[~\Jׁ7J 7(Q96vl1iHi%vXϊ/ gIneo-{\X!&^@b,X_'[m\mL|m,8ð__qo_o~B`g YZmP1VuZhÚmgIu~]޳-2{tqƲ|M^&h<c&q9O5򱯩yz鎇gABd@:@EwlfF:0̹ ]0O<`tyS`6ѓҗԄRLN=W7Ҭ,P (oR d{Y>QQp9P!<adWx!]G8qܶYPt{+ʳF~`zyE{Z:N-#4^F{};:~RY~X,3sIwG˪K z A:eٰAa')9fV[υDsqS?xMJ],eBrY܃_Y'/z/ìlOp[?Wʩncun]1>g i KE)^ͱh #ny,O'n%tqYcALF)o{=C #r׽)ؤyugU%tli#moޤD@Z'Yh;JYz@M\IRVȷ\Q7w@:&6j_%[m `q.}LZ껋H2<{9 [i??$_ÛuRїb%?)D_g~&Aݤm=}$>o {O[|(d[h*`c9\$al*rqe\¸ۄX§I˄qe-IcMC3t?D斎y;RnISF?-.MG4 -,{HZk}--x~]>gwVLUö;zc`W<< dM-]p{|B><([pau+n5po-fq^;n?;8ky؃IMcZ2텹Α/qLYUCs6'} "QI\ጤS~k8̵ss0Iq'x%{*p^~|󘹭o37ɜиRb5Oy?!Ao| Ğnq^Qsb 9Rلg܄^(KPL(֤sW#erL A    ڨ% |Fb؏`44*,H`/J Ob.0FZHP?#x+ lc"tyW3$?/ONOG|{W~{͠K* TfS#:y+&^@fK s}2R7|wC6'p(/!^D.,ȨǕK\Napʙ5SJ313b˃A>**xt%Zh0hq(r][^yLTrԁGr A@||gMnN;ɣ2F <дJ1 @b^ &㥮/'kMFr bL?Ƚ& \<iOu2 &=xiC'|Ve SݧYɮn@eE&մ3 *~4yA48ܴLǤhm'TC}O!'PƠ" ا) z~KC^m%o@z|" œ@+d~!`6i}R_~ۂ 1)Gq+ v[Zu!{+cW+xW/.xc0Q; pRaɓ> `tJͿ;fy,wѨi+O[SJyyvP6g]hB1/"g4zFGi,3]р~rHL[fYer]עeuNi:_T76Rﲳ,٤8ORlkk"-<~rm vB#I7ynEj/n+x$  oT-~wuW1ˣ<\:[#`>RAD +(j)OJdOǀ6 /nK>x]IeEүSGf;Ze\^τoxA?N({Aϭ' Gye/vK(p2: EMdSlSOo)>?!3'2vu6mq[35^Ʊ:^sJ|?>LOǘoW@o_ul oȝftk z>>q~idT}ːDdJ9 MlKHΔ_<.~4+L`_u퟉-P d$'zD{{.~G|Ch-1+NFq߭2 :K/}pJV;98Ewg.Bp"L {C;Alu> "7Z2/ΗG;={xu66â-+eB2n@LKzK*m[=ogZZ=.uj^}obxRnn;Qx[=[OR Df빟 =zJcGew$>)ړg{[ 4"6q͊n5p[ jV8 8#۸󋏏zd9x3' ᧙W8n:N9f&1tzɜag3WaCnƅ3G;Rvڸc99m M y9q+޺M!>^5 4No8w:#*w&-~Q<(O̧_cF71-s#>|RZ>9`'ĉ`D1Be o2<LGR7aOk {@<ˇ0?T[N>LG"<׿ānwxu2mT}V) LYޔ7`R]QS9D8O |t7X(s 5 Q7)N]/ ԔI{EȵWvGPSI+ ӧ,6\ʮc=@?o[)'[*25SvDzOvaNRDEm2UYtU>غJZIjf:Ѻ ?B\810 w8"`6\b |ӛ?D%yz6?6$ ~pq!ʗOmذ"UG}sƻOG1IScr%6NشcGm1V]YM^]%3鶟g%X^݅b6 ԣ 13ߜd> kyuNm^YR&-Pnб$EƌN628~xhW~}j˫5"H'Kn~mRKc}rYzYYXYdA" g|-}Zj8-yEYȺa3)3};*aOam{U/4GSNp?E㏭"d!O"cE\2?u 82V1-;QxSد}Ieɂ-Jʗ>fYz4QF؄iA[X =8MI^Y M3%rW+q*4~LHz c7sdL_ '2fR[M쏺AjAS\_+Dxx"~2RyM"{n_ JDxy_'If ژab^_ssl9ɢrhsV

+C=Cã{7u^g?UY6>nuhGY0mP¾~238ix.o6{?|\]X*2YR?jͶNy^8Fdp^fY/n"[ M:h_vv--| T>v0B@>G,/xeJ3ִp𖏔m+llvN΃mjOr2pQ2hF{X>39AVu][OS;Qu;hkZ69!^oc R?DVu=['5xS kQ~yumW]>Y#X~inuZom5cMi$˲_2y%ʹNt?ZynE |7KQݻyE~`מ>Nz(}qO y'oR,˟}|Ny;Ikcύ/0iuD9[f' w#{d]G,so}AӍu/mrL$O1Sc^ةO &7//w1!C攓.A::!pѿ&8ѻ/'rd%ߢՇChFw$q|֌87sWwm OlQ+\]G֕`B$"8OGv\Raܘk@$#F"Q6H$Ҡ?%#&ra' K-ZynⰑ (he9Pu&06oO/a"-k|/?Z>uV|ny"<cOHnRۣx{;IrI2&m…y e5 NW 2k<Au>-a҉CuHIwcW*u" jڭŶIJPަ/< 0.cy/? ~C}F͉ AUůi >u6y6qo_Ll{2p-^ !e"vO*mgݫ&Jʠ'۾@mԑʰ-c) {*hd%Jo eZj:fHY([+zj^%D9}U>' ж \֗/0SOqj-mrƟ ՃH@:iy,QH9aAb ;/_l7Fĩo/'UW;s4 D{I??'®, TsPo'ȗN ۊ?0AKזH~MCU|kkV/!a).TsM:i hq(u|rɛBZΜB%IɄOpނk:^^is}ïDDuh ? /p7+SO[O`>S&ܓ4t˵M] AӅY@D-ϼ.[=:E~ס,^]OLO|2׼螶w\(;@fqM=H 4e3F8W[K]H"_<=ulyH# &lժ Z`43_DRVzIxCWƻh5ݽvf/t7TY;=I{t3Y$]/޺X~?[~o/ryɅl Ffykwf]w{| hӹoZ\xmPLnַ"ľfmm= NbR<֥]΋cNx']Sul3e-\ζf};.̲]l龥f[lʼװ;~5ޫדV7TB5k'O~V+6{җ}>W} ;ֿ ߬6Oq6x~|AnÔu7Q[{n-o=93^M:ϛ78#gTc^S;s?+~߯=5p}8kS# dx@c]$=|*dvA:h>O>˳I'CsC\ʄtsΫґ%D?6>̦מ[>f.1+/g1<0>9wп v zE|^ _3^?4N].?21?in]gŕ ?mܵE9`l⚛y["Q3P!|xٯ jFW` ,5(L#{<@f* Cl=CB#Ҁ2Fh!4 KO8tݻR8GXgsc"6|./_|O/vw\GVt\ke[(c]{d0LӛH` &KCٕסͥI,pIc?)SskIH9rUIFv9s(FS^o7@)Tpn ]ӑǏ(הU)֩+` E32AӧB|]PYqx6M/˄EoOn/p]o|:_DIRjP=@IzBZa;y Rʡu#uȺdS> ek/?݁q*̀vny3Rsc$e/:3xk[h?>"ֵ_B '=%}{̘dFe qA@^Mml)d9"/sj} 9ZUO=ꩪ4,K~NZk{AR%mۨTy䜯a|cgZ0*GR'$EV%p"y:h[Nu$< y#NW=:Qے'VaB϶yix)+GmV<,V-}|9mHӀʗ734=Ot6ڗrv{(+&IGxaۇ/!"I\8hD~o'KdC[Oҭ=8J/+}_izI'HTzЬujk$^䟺+oC6hٳə~hX9YoY@NKN>`^#R/ُ֗7 aJcg~"ċGzCv { q1J.%y:8})+&EN Oס%F3Vi߇N[!"F_ k#rQC7wgU!\E@4)rvenAl1R}S"-+iaT<^5o|egЁrOvPR]nhmi;c#snmy%:=9^x\G'}}IkqitcM[G<Iz-"+CJ_αXt]!"21R |yBw}KhjRu}{p[ l5V[ l5Ϯ@ vnnʻ]o{yՀf-/o?]S:r'"s`a{lcs45\!<'9=x:ycg'2v .\Ol #vzjc$޼نj''_|5ZɄN4ۍ̘qy%O C'\~Al?7ǃ'`二+xM,*ƁRu|œ)]qF|,y:na s"| / @!2 Zp˜ʷJ~ }-i"P3SFcβX%uhvHw[xIL8M=$..~T,Aw LK}h4l宋]&0[LDE_[_7:xw|7V8Oh }A< DalU!O ڶNצʧ"1:~w'A@^|Fe`g_%C3_PO`r";;]]-W[y"rnW픵Dzّ礰N4ND2#2PwU7z: f;0lb:UὁgH v@02K"VpO*yB9F.:/el+\wZ.}Q _I~y҆LҴMG48-HrB&ɨ4`]CoӾgq /͕vS\ݯL/z+ɉؐ'TD7bn,@+^;S>8$ɵ7+la6vK]JǏmQXo2OyڶYu8qQ OK85?)蛺X:ҍGhYOmG{#|,Ǥ)DZW=.c[>٤ϼyC5pMv¨}"+V*p;ieg?zG5{>`@¤ـshpB_*ܺ˽x'KE1Z_ž9 "Y#Wܦ]{Kȵ%E?+YP+# doxp2i1uh}YQ0h[/Tm|y5Q0>W g5>l_-EꨛldLJHY`|yͬWp eоr+oٽO@(0*z.0-R;ra@=zwyDԑLq望Nt5Si|gc[zuyq|Cgp̣Ҝxgt/SȌrU+qN"'"#W%Ej{a5'AF{N#!nqiЪs < W߭/:O-Y_}7^ckwO…C^l3SM@1`D8Y)+{x^?h;5 :9Y,?wly?^,+դw9~}FnLϨַyC gig<_Z49hd=0g]p^#߁~!'& ݣ/$Gͬy1pgG;_nl&q47#"ޱ91PegC⻌g<9{o2;'}Z97%w8#_|c^AljrsZ@p)4F".k R'|=]s 2V7.8X8 F1sd/.'ٽo1rdl&H! LsǧhA`y~dtfr;fI 7+H zFO߲z k0f"*%0/ sBBgi #%03o92 jj3yϷG ~ȈVAP/HNN׀yC:XOyzCW`ʰn[ ZS |y0mRfI=it#P#yWƘYN`PkSP7$=4 )M% `1$4z>'øsl4dL&%Ny+E 䥮*ݡ>Stbt~ѩB$۴AЧEvƩ)~T!= /?Ҭ~Cd,md=VAvxk)iqx"ʫ+yDAZf^ " 0ikGYOR}r|ۘs:W:1`Knۯ)3!uWD_zB)蕇3?Ӳfh~3i[df~pŶPv>R^TBBDPA_mǞ#&վ2i2eHqXՖx]\ݜXlzodX%6ȗbBM8)/߲M_T 걺la~SIU 껋 yENCr&aIJFcI<b4pFAKllu[kw D. ?ǎ+6ʝ3-{O?rKӛ& uPIl#G;&hٟUJcwz]gGt&E$.>#Ƕ =R^HX` #kN~eugTk.7҂%yi{xj]xGW'5ﰒ\ )vse6yJd^N*s0S/Nk qJBWR}7Ee&0q˕ɬ/vmx.g3eVqꞋ'60BeupHI"okI}DL&SG_PC~m}prpz*ou饽rOkIi']M_|Ƚv|KCx27OVYH_Mu9s uQuut7@hzzv~>|:Oe}# l눧E9t|@VD_,o  ~|xiܪp xɮjBǚ/QHi}/ם<4{9Zv;C;~ρ+<.Yȇ}X"Cc* :l/1=Gow>{xƇ<LD&X&1ɉ]D/ >sxړ ÀJ:a-IRb?Fa.L97i@k(pqYUgBV kS%']:rJdb|󎘄tA. \( . P+]~m.?\.l/uYrƲs#wx? bdE8 |YFRnC9cR3uu0lU{Ա0 N6i@ΰ $A]9O4P^N|b )M#-^C. | mq)A4_DFyot(c>&ދAg}c[sD@IDATz')g#5%'[<זu]tXYCUZ{cy$IU2Z*֑]N8$훣&! ndEVx{mj2q-K'9pTMvx7cwN;Qo)OC,>ԍTJTV2q{.rzgހE} 0^ f۶|mdz5uQBCZf+6ՠ6оZ6K'Lip,mX\q/gA!}pW@GoAC^72Q2dOm^؟/l$Q[?VA_q>E"6Gn/ϴDӪky[LJKţ<!`>iˏKJbgx("jci[;]X}Ewr<?r@hCvQ/zsA; #yM%iٔc3 ?87B{%\Y]Uֵܶ6wz\wzʏR9#k?&Gģ//R}~> )up(]P; B fAN"aLLS.?YOvOՁ_`2-qzy\5~+>7E0%u9|GͅTa B>͉o*+Ś֬ ;n>33* Yt#sXvSG6lj3+0}i }]y17+ߡgagen0"T[_}A e{ϣ_`մyÐ;8&cY4ۿ8om0.^tocd2-w0fgSO3vr;I 3 Wp}z^c9c h}&Y# ~ ]:%A1q Ф[n1q>cM>Vc36ٝy,|qlw 2>~x0$}_1.?8 ֣>I7OƂ26kbxvQ'e&g3@  < c*uKaTRYVkP)D<\: 2O0#ˀH%;$a)Τ l" rqՀu2&C}Y=QԑAWz|lɩ*E p \cۿ|;o}9˟S,AZnid3 jMG7K]ະ!P' =J8u:eS9k`U/mmi,9efKuд2 Ȥ&x VPMǎ>R u@9./23?{*Ӡ5L$p.D*W,*XLdWuAGj xt\E݅/A ğbOu:Jþv, vE\#.A,̜ȔYztd߾cb[ -w96WѧDh8&{II~Ŷ_̏ Pˉ rpԃ䥣_y5+ߵC2]Fאt!NEg5L]eTmةE ȋ$vu<ߡMFfH6LBN+'wԥJځ487QY!YR_vDq^)EaE =c*mSA;|Sx.㹟Rh򢝁?D_}k+y':.n/ysôm$%@NR{Sʟ噀җ ph[x6i=O.O?ߡONg{*u:k-+^]#/D~n(A`/H?}zG>uu#O7ve,~!ݾLu>}[<@C7Wd@p*1}Dt'oH>tLҢsrmr:FwOe1Xہ^ M콣vSna6<V\c,=@HȚKuGyO—Nr^}>yA28=qSǁvo07%~Lv 1gVǖ'm6%:)O>p.f0zxyOח;]Nr\2-M/]e\p@g`$,X~mc\Qe |LI87xkmu~754@&䓖Ry Og'^r#f6&͡MY52߆, -n־e4/r6Wy!荺?Gm۴x)~ fmOp9Ƿ*~J-3=2a6͛[gLPvx7}~Ixm*? G<&?s.N>seKt6/PQ+ey0:3X{Қzn?o)}S#403/~'{0vἱ-F<.#XJ'ÉjLk_ıK^) 10I{+׈58?qXaăC |e̅׊OM; 2--n0k9Gghca7B{/s}k^o8w^x\H8r?ʢVxKlRGl^m@[?CBnlӨ<cWE[AHy=x )W!n?.3@e*+Aa Qd =Sy™C5A>AN yҴQ5 d7x)K0P#K:4"p:opYt#Q4P7ᱶ Ry;J )+F>dCf__]o-_O^_r;[^3[6W=?ìKQoY [U< v'm 0 \pYgrwՇv݁ S~Ե~46|)9'jEĆAVOXJjP6.;~g{51,8# N -sAСc0K.f95Uf 5dO$KgtN z_`gy3h^ V./oqkC'2yB-'0T?M;H˫Rh{4>>w:>\O4U1B B#cf0TϩwTGV6|->`u 0e!\GUNqEudL+w *O(<^8Ry0>i-7\B/6)j7duM$k29/vB:~pMk{Hp%#mw]  ^Ke Opw.: uVq ;F_C}2I3m<T~ԯ4bvl}$ul3\PMXQxJ{3$Yih??ѣȚqmJ\Pf?]̛1ە$*t)X!򖝗; لnl>‹=x`Tvꄪ&ny3uF lmwO_y SFx gNbILRWʽm GçR(7frNnB;LNۧNi7]zc@VN7+G5~l<D>¨Oz7\ԇqu"$?E &lNY!BlShG^>Aﯾ_ &x7G PH;QMcr{o?.|D;sqPdmZNnKC$bIة;;Ʉ}4<(T!>P]3|9 E <.a[ɺ6upwbW Ohc~coSr/s "/@?ס!37_|aۧaФëv[!*G _hL@ДFLc4,fjYVAqIP 89';i\ p,3+^,1yIvIXlu#La[forj)*eg21fG6heEu"wK|W8ldW w2W]oxyKo)W'q3>{H1dxIݝS#a>Ti#jpH=1j4Q'bS:az~B`QX~ JZ*vpn|ɕݹXyc; hZZ&-kvwٽ *%$`l`S?՗ݨLw^]1i'(I=B~tF["Σmd|eQxnn' u (Dm. *qقEy D" Kr:{Y HY8lkN#m\e:1e;2>'pCi+4E5>e)|,ˤO1}2 &8Pg&z'/O|i_bs{wnr Sf|vA!EQFd O=GҨĄC?çp6/U |ĒngԵ^&MhȏH{Dw틧΢/=7 %uС{.[xMqjGA yiw\FڒOu:ඏe74 9ۥml/N49d)ByӜ DǝIVvDzɢ4_kYnl%4 MXA0~Ztĉ6yU/]PE?cumi }8F:q~#`sMUڮHamNy0mUyx:Ay0KZϸUvW6qr ѿ3z*#vե}RM='lr/D~C? >B|LKwIK=+$o~e)Go0(Fh;H}f'ueUgI/}% }~Th9D^k̷?PvTymICw';@fe\:j Im/>HG$3,`-8WbhR j?>H?hMym8&-~WN-/ u>igj=<^O K9#rAޢGznnϳ_y(kqF?g=h35b,aPme#GvYX66&_J; aPw9X21|^#;\.YE/?^Ҽ~OE|o/gC'C8)Lr;~6f*TAXlϥ&=C 63}@Z3M\xpq/z@ _^k>ÉɃH b5 t-wŗOq[i}>`G~ɋ?9YљoL=+my:v;3$|/W9{NcKN:q1^ >0>7]n1LDXx 8,}%#'?ccRgaoa6phqo8sc`^n\vʧ0g#fcb+1yg~!|Xei>]No4A%#|Ds>/rOD'RlH0O (aIg:ą3h# ZF- JYLt7FU 3L`J_.N>(8An4"<|;x}lw ϱ;%srEIk' |svePwڈv!U;d2«o.zql%^=R?}~`WO.zNb WE1m|3<pEmjD}Fl*'vO?i~Sg3/ ؋C^A4Ere=𣝬M#cw;PWy"yp.MdDOF87rH+M ^(P;k5p`/yix NwNiUʅ뇼Τ-3(<3E^=;72zagS'c:_(ڴ[Y~>쯾-`:՗pڗ|Pza>lc<_t-iK!IZ hҎI" )-5)I}럓mJ/CXO!zUl'rB((vD9F7Pfiۆӆ\XW xv7xwF>DP[+IC|eaXW%6%eKfNr.s@EgcL_?iIE9䴾"_+>n*P7~?V N)*h-PY',CSNqi Xrby ܼf#>tQzĦ{ ,sҾEY޸ˆ1>_?*sa?ωӯC.AD茊౏ֿ5ZytlCm^RڱǏ>bkeAv͘quE?܏CbvZ}|xH4g?ɛ~: \&}n_)Cd˪{;丏aHW .._.KͷY!lvO%g=Hn盰7!gmU>>-'n~{ ߻>eb{۬cqʸ}\>a&&}A;cl<`Wy;sT^$OP&//D4b?Ҟ-fc .p۳# ,GNf\hp*I˜0g$јJZI<ʻ};>3DIZo#(I'wo,sl fPpQoP.3`D֨pː )|xsi'_;JN2l,h5%H~=g ʔsCDJkaJ .M slI: MrDpC^VnHȈDyfRw9c|W_[+ѿto\7|{?^t9~<.ػ;|'xRgL;f1%'\TR2 ЪT-'8-܏' `M:m&p\u(ڙ yl cPI z_A6Au'a%Vd .iYs VByDnF&-}G C8.´e A5x:*0܇ۅcg=KqCqva368[ݨH4RoN9@jzҰLhY|칚l=ۓuY۵<'X.m9 V$ Av(=ސL]ԎҤ9 [T_BIRAwO-LvtǦ3^Z+rYS1&!߰Ȯ6t*{K?ȿW!UşjH;->1Tq qy(-J2݉eÉ n#}}FEA唏#LAC^l_G&b3GԭyM N P.H!oP>>䂕,,o孝 ΄z ~1fE:t * 0x\]?:zM.m_XV 6MS_yo5l <%cSW&)c5a Ck n׾cIr~Sߍ`Ӷ*uE2<<v/O~|y'<=E\Bm ^9FתiOHmm޾: +r}]i# 1q{6ۀMp PL= mjiO|e3cↂ}8ֺ,Nw+o_mtS>g 1=~ִ'Ϧ;lu[ l5V[ l5S kӽ'_^'uS:(q2OcxxW@˘׻`gsO&y\O񵷤޷Yq#䳣m͎|\^DMΝcݱs&NO,H7sήKju#NN37-珟,{/x <>yG,_0vÆ5n+rrCv[ݍnv9&/sH]f#1v|摩gL 1ODلCL c\e?r'3)K6YJy?: iC44sYݽmB9іcqfW ^c>f@'عQ_-i'oi W&g!O&82W& Td^Kljj?vFBop5Heb8 ;{Dd< 0{=q2 @#Zza}YާWCyQA2Ӵk$5;$= >@*o&큏/69^ԣ>Jo_M`a0uQs#;|3jP2]AH[씉-os"SlՉTuoVH7m_ET6i=֞-vQuxLzcխ^/0gre=}JmU=݅ WUYշ:5UmO?d; :IKŦm*M} NZ+j{ Orc=O<1)`r:gƔv]rڔA7𹐤B'ʦ VO_^+ۧ 0}I_Lc_78M#Sw˯ː]8p[NO%:Wvg\;muNW/{4'w^)ρ/ih21y:-W'rv-/\0}LL '.`Y;38ǝ]m {4}s1i[h#rƮrWӿDw~r}pLH@.0Ne^ 7RiegZ5N0:<l+4w˽=_6pz h 7ٛ`U$NܕYۖ'>4yܾ<.>W>uQ uSҸKlOj`j`^X x'?Zx `$nrn_5=O˽&לscF QeI=R;ĠwK#ƴ\ 7Km۽c3q>jyͺ,؋xhČձc8Ή݌(ʟV\@ ]0ӈفcd k;k` Z<8ig5Nd * A"s`i]E\H\a | _<+š-5#euիٰ%Qr˿ms< TzP96dc`i'z,Fe$nijN0eq:<&Cߣ_qg7NέG Clh> Gſ%gua]dOPX=gol_WTfKES~ΓbȊڰe|~({reWص\qschOf~Ⱦ;cQ+.Eֶ@2YL|N,V^>_{ݩUZ9ȕύ/ɉ|ZnT׷ʹz֢^E&O}P N6:69M2})D#~=lC/>"틜W||оf;̢$UjǗ -'m= O'˕ۉEw E!Zzngy%Ųn>Ȅ`ɒ\Ȓe% 6wѩ8L{;F{S{!COȎ_tiwg X]Qy vQy+>NoYZ۷lL庅H7 ŭ~wGRhNH_ Or Y JpE(>k%v3/OqK(+VT]중{>'¥i[C>NYW\kzl['Uk_yʫ;ч]JE}h =]b~rq`ϧ6I|>=9Ɣ(6@ ~jt!6H(JϞ= +ڃk$_7,usޏg.{$9k]M*|Y_] 43NL蛅Yz/m=ls,ojepL'koĹA0uc S7Rگig}r`1ztCҩǚS7t5o9t3jYHY1WE98NsgheLt!SmfS P Vhn9(b J(7@?!''IL>M?)ϲަƻie=J̍!>>Kg,⳧xFͲϞӿKu~ynj >xq?&ۼlmj磁ËY-˜Vgox`^}CT;ml։i7/pSbLL8_2Xܛg'3@㊍`8r'ݩ޸xlarڧL' b-qd3 qɣGl &''K6o60^8;%F@,阘 rD]0FsdOxD|Mca\t}cႅyR8%cҘU.)LY,N8"ʅ.[䉰1B$ώlnD#iX=;1\'0JfHථTrIIu*9&Aě_0D(;LpʒC@,DpA1b'>:V 2C|4H[I$#`iFw&j -yWk8֯[^[w\gyGxBd< ҐԟqՕdf`Co dg@LUdͷ\['ǩ5uAˀ!BSh\C&y+Եŋ7ρCu™nppT7`¶`c"OyBQ2a#\!6NۉcuɄOZ ը'v,inu;IZ =RS;;&jNMZs%S#Szv&aM[<$&]|'3P,^Yq~NԓV3po>.2iL}7N椶.7G$l)lufV^2 .|{43:n.oL~ >w,$q%TxQ4\ \k_C>}[JmL~~ږp_ P/zz# Ҍoi 8m=X[K~0DžAD8S^WyU-ya_+0R7{ l.Ih^ֳTcӛ)QyCm(4K𮮼}A{ǝD.ఞrZAxW{ M]u"2}%mIhB~Y*m]nG~')Y=;hc.Z4me Ryn^9Aާ;K{O[-~' ܞvm_=ɫY߅Nzh#n[IO]u(\={_'(d~)w,Xn-EYh"+$ bs_T~ubvʫ7l h#!z; PCKW+<1c'{xe5G/1ا_Pbˣ+{_5Oܹfu:mk@ >vb{%j^e?9=W%Τz[ooY7%j Qc7ޗ?J"=@ek U>Dgaj`~mo5VE_;YxoyU w '>`tO]KUx.=cgKzx0qC-!ǩK؎OT&cNПzO=\N?G@ǰRO@lQ7a ~b-݀C$d.;Gp#I@}5uc (Ǹ6ȇg!d-ܩmrRS4-d*|b6SҬbɄUgO.VvOe`1S_7|T^yT6/Z %[N-Ur];c3`;A\h l8?K-"^^խz7G֮ܖ74U.̪?>g);׬}fgҳ]Y^7]9kULW*G.ИK(®/w@6->y=zأSY^8^pS9w}pTw &Xg"8' IgJ>Z=i#8p;),$W0Hj(}U1ZM^6Ā>6ifDlײ!=^*R}h,.^C۟|&Uߓ3Gʛ>жq΂?ufo'o͸7DNsQO!c@Aɯ(Q2ڏ:16"5Q8y|L&{bȀ |‡E yƤ'miJȃJtP]&mqbԉ>8vX'=.4}k.CCu}T>(iU'^s䒣2Nq;Qh,niT`f_" YL'> QS]~ )-VYv绋%Ps'/@F ;گ4ǹ:;s!> }ݷK\g0"Zt p-iFI~ڕnT=.l,W,dAc^{hA!Ǐ2Oߌ_$zVPm?9dPĠxy{ʐIzVAl2\!NyL~N代ܵx[WOC .x>~2!c?\}=GM Wiv&@WU؏o}J{=4Éֹp/1GLy7#̌TeԷf}Kp=u]( qڿT T}s\L,阢06~}eǝ;Wyw6?g,gnJNinKY=j`j`x14kF;7Nי8=7V|Ýb87rIyW1)1!nƱ=GK]X'ۏxm)T?t׳G3%;$!n ~.NI9v?q'{2{grCWl>ydy̻綠(7% b2|r]9'аhR&@9o`\"" $GgN8W Fb%}W>2`,&GRGWBa Z"{3X0L]0*M q0 4\&`-4u+|خ-tԙ j4P$/`7i)g|Tܔe`2h_XWxqUXΑ72X d2yro@%wy c9.{ ScɱLD.`$O{``~Xy-/߼z{\_W1x2NN,P]J|~id~g;|1@;;耆!>Y}- Vm0b|fv /1*k̕}eN# ~1mLsvAP_qe~K]yLHw;䭫&cGYGO,z T Z>pf1{eh9rExuzRmL M>:гlvo!&??qJd(KJ'qR' ?->6p:%/C| 蛑#Wr;A˷.jhR"[yn,t:DI`ǏԔcyc;xPdzՉW$A޼^S9\^ҫ$/>ȬAi7 Ny*-22Gim?S܀Z:Y+3V';,$:mYB'uھߘrQeB@t,P1P #a_32x*TDwfv[ְ +c[hk^cFPw t2Dzh[xnglknLs"wu.ceĤ-;wѶMKJۅO&96S>·/˹;8ar`?GzO|;89/Ծw_y7ㆍ`#hDzuS;o&99a jf08Bc v?L㖸qڀifL.!P 5SY|07SZ >Mw-/?K|Mt|gӽ{BOO ;^>a}*#jGb:N7=]qJVcr=l`ڂ\qȩ5LFe}H97Rǖ ԰gLw_ U 0YF'. Q4>>; ܵ}?> $Ɛ<6m$UX#ԁ8g^ь5VHv2`G9{~K5,#̸qСZ/8NDxgktS,8*u4  : w6&C_kwv~{V|ol7+v>NpEَi9n0t vB7DC1{;*-'>lY_dIx cnNl)th;ntΪ :LNA.2X})xwɎҤU_GxY?O:z\C?Agq׈|deυ$rDVFH :lE.tyg٩'ߴNyq'F<xH,u:E 5ޤEXp~ 93)|S^{ˑIW<Q&_8[cx&GY@OA98aXL$v"E?-?I/Á1q2:WuU=2P\@xDR,,q싈xtɋ.(:Փob1.B8J*Ac%Փ:bqIxz:Mat6%_HH}OU^6D ꑼQkV#2GoKo:}qگ+`aN #cվثqlz2#:P9 Ї[8 u,m{.V"T:|'k}I3ȰI{4e' T&\d]@qis_t+;=Xþ\'tr}g>5y#Ղ~u}cWOY%<ViKgD'_P yн::gZof_={u؃7q쐾TYO(Z|7cLQd5MǛPV/Nx :䡠}:f!G< o1lI6=xHԤt'Dw]Yp$TxJZa(**|/>|uq,M|.\|ϛg>wnؽʗ' L@'d/f*5ރ}\D]2wDZԛ{Ii ]:j;ж|LQ۱J>+qL] >Y=ۄ` ?d#~t̐#gjlA~M}W;L7WM].J\%}űf|WIόҭq$) Qi"i1s6ZOcBV阺fW_8^ySU w=}iʈQI褶LA -\ i e~hE_zF$,R&+~.չ#\9^jxE}v{䱝h߇A0crt=uj~أgGYk{vn/>1}2Es c5+_lG3lSvaw0kJ >KC̶aJ(Tʵ90Oݺ#Wq~v8}2[4\>e4mI6tк>g2K1{ ,6F7YϥGDM- jcl,x;J<HtdPYɇw5zu?-2{彐/RMNr\ Q>b6[jѾ#lG@36i줗ؐ~OvB_jp=l9n^70ցǺb/~٫IȖB7V2 &ǨE#x$h]2r~;A4hX0 dc {g7Z$[2LX lOu2`đ>l0,seJ`'OGiz 4ItmBA kOdF wW9igNT4S>:r8W~oO_ߙ~Ϧ^}߆=8 &vsHcc.'] qqF|Q#Sct #dD8ؔl>GcgqF DAe[CbtC@~ynş2kIS8qn ;wҤH t[V\a%m]!ށ1VްHg/=^׺>4O.2P]uV$ 2,m 1};@K:t+,t*/&S,;b}X. s_Ǫ!6+Q&XS:ȫ렡\&c H`ΕJO׊0u#36zܖSeg[ߡ;:RΕȼ'y6(~E)'N5 ?8iI4Lk9:#$3N޲zG}es3$$Opku<3I_ \߾];E=U".g"[l*|Wv<"˲/.nBBв;8q`{||vvpE8?l$q$#^=>jz % cs&qqyΜĥtμBC,DitǧӅgc84[vGC970`vOj8e'3m&\YJmXE:6K6p$%byt5=bpƝ_ؕI^)~>Mr ХAvwv}4;mB'uO4>eN =)0-,x\Ѡlbh($iYAi `4qBH&vDYV8T* /)Å]/tjW:3z}"\R__\M#q)'i#=B .)#ur:5*"0e~t:74K{dN ҕ'OcGƫ>*;C/HqTm1>gňt.ytM0 (Onǿ;я;}cOoߚM'9M o;ᩍ @QoЌh_i??8WVB1#7Ɠ⋤;^zͯ!VgXh4ɓg.X\#eL3ںf-ENKF2^gH%Y{!NI$Z{`/0P 4fw‹T~jhm:aPj=ͩOuf4+7]9M2^J;Guz ?+hHm"XCYmebv%pȟ%x*v'6С|*<:K*":8R\ʗKމ"ЫP`Du6͢ ?Mjg=1IY:/#j}B3{Wd~G偡rxϯJz0H3SK:qApu1H˺>DPI =7rط 7 ɬ{0w b.j"oƻӶd ͗a7x! 6ԯd{2l(Mu;Prr Dͅ;jGCHfY-+mx:UE8`CN6IePF[|W:tKByw |j_>$>:~nE,}YLO?8?r u?Lw) Q XYb?|Fyhנ5KĽh.]lӅS~ny7򃗾]+>uytײD,z>mc.cƨ(Q\Vc1ܻZ;F5bxo.c*#T͏nG.?0  I\c%k29S oJq:s>:/~€)pS\kibE.OD<`ݣN؉.9a>z?L?9 >)uq2]|v?ڿ~cZ}/~]1+Dy$=gje|},wёePMgNA~}ƣΰFxE>63c+>ܴ8/#CMW؞0>$v0ew֠sl # @how'as@O+r*%yX`` *RFI$]Ѧs4FCL0ĢASF"tBEaknnGFP(CR!RqC+2Qi^~-+#b4{ FF`>x(D #ScqZވ4R}v;Y㨻8 Ce'4kHO=^uȋІ!o_qy$ӗP?k9{W:z;9Өe}=:r'U(=|ˏ=.QOh?>zhY{D3a?DQJ`/]Xѱٟ9.—^\z1">,')cqG`_X;y9Ur9.bCg:yᔉXV&0KHy,tA{HB8z s&#piTߞ ͗˱I\ '-uOa]l yCq Ƹܺ㜺.EsCeSġȡ^2[:G?U.Ovo(g۷܉{ *3oܛ^Mt| jsCBOȂOz/!<_]8ڄSzM罾7{bc0qiq7sWKsڣg{gx:SoΓ WM~H^׾N@ڊ]W7!1y cOmj'g&6ͻF˒4WP2!txj(1,<Sk .1H\|1.RcD΋x H>c9J|cVNVD=ܩ7`Ɲ1ICg ]U ^Ra _]*8TױN NE E]GBcqGԊ2wƒ'27Npx$?C!ʈ,ݝ"Li~@(D#?hM߾}eWz韯~moOgG#0bMӽsw@{<;]Q(NY'4z^"qSwO 5OtF!X:Vslx#ۉ'1/rqYc1X[N> N4 (`t8TAUqKZe8ʘ>; \k \5\*Oj.P >F>pAoLaMM'XKˑꪞЈQDS"҆ɛ ؆٭SGօ~~l6V[PՍV CY|D g_Vo( qcuSN?RFʰ}rh]sZŀm]i9Kx%d WqkEZZ-Df]s4Z=*MdmlMs/8u8G'^4IݡpBF7l;xVz"y sEQa o)Cp ~0>"3!cj°WW}=t Djn>ȫupr◝TtJ0+L.|x KCp=@y$siuW 9I,ސ$u^LDdGMI#KyM9x*+@IDAT̻t)+8s4\_1q:8 ]=Le3)Dg q;; cd'ǐKGB|W՗YdGQEC\ߔe0!ioqe,%ʼkgu̓ ],5P]|Ng; L(Y:RaKĂg߁/CPp(y:'jڄ+Uy#(<7>R$[& AOiS.+ȐH䡟 }GnHj0@FN;XS<ݖjwu*:x+9,6EǮrw)^6RN@ :'/X倕@AaYtd( O'oAuö%թ숇Ouy任+wn\|w8_5;Ǐ)zݿ7ק;N59z*ҙX??.rE[t z*ɂfu LWC\zru𜝦d8=Jm|q*:9CH3SA+KpKwwͮH3_ŧ{L??WӫW8ӿ]~̵.UHj#PHR_ŽF"9q=U19No~"4?rZ9UNAf : SwQ.R{x66*L@П,c=8k^6C}n]KX~c^ͶY܊Ic3>M7Psbi;oFd!22fjDϤ:.F[c.3Mm_ZL؜a_eؔ ),<^砾K|Gˏr#H ?"iufۻ~۰uT; %nזHq J|O.y?VvX i;S8D'–J?/ ⦐}P6>;eH?xf[Y}ѷw᲎"p\OvՆMJe;yx㏟Bn੉b!74 QGr,(w#Oi|NAkk&8EV 76gXn}?'M!UjGi~ɁRrfw6ry ?p`l bGe_O6/!=Kh;g8ƾ 0ߍ#Vy 4{LGg*z\B>?y3j}, 0ِE}YD¡~gDFϼƑ<NE=(-)`G0Ms;U, tDP^2P\K/&N Tiűt[Yy^:H^\,C7;^)? `J9Lpi L# u l5[z|ANs:e~l A^zibS>?__5]8"=Tkj~ٞXA˷BQ(Et`1۠hq*=q"QmkD$>"eS4X23eXca ;\-5hs :~ ](Alh1?ܑ<Ƒ|wOgC7t4R*h$8HX` tU3>oqaw˗D!|xgHl wWpAypf注4dK'˾p{L:P:zA9&od +m?ٲ*ot:9aخ2f~WQP0o,8 JtQpw^LSIf#Ѯ@z8W/#`p',!Nm|[4LˢL NҖN[:~QXNH;JNR(i'3vukH <aG\36""7*)Ӈ'-N-i-x]hc|aKu]1.tlrh 2{0O?Է4̝: &-]s̽ɺ5vpyol[?z:S0.`N~d>kijoHHWפw5vOs<3ͱw <ܑtgnh$רsY..w V .1GE2Á7Jԩs£i4֓`Hp|Ή`SqA7[Qsjڸf ~~Ɖexݓ#S.gߢTAQAFbۆ6(D:[i8:twjzzSiwݏS[x|3Rpq2}m+mMtz|{8cվ8>֯O{)p! "5l0 4v>hT[+ bVL)y4((,!FNaYݱ~-b!>g9ݛC/IlztG 78 6ͳ<$$51 KE/4^S_vzo\C\U( Wr^klBQ)OoQdOSJ3q*]'G4\c`K{(+w;y}㿘~cӗ.9}ĻH|!eLKtZ+z6GڸLGyiC0vאN#{!2Е.Ȁ pd</FVuXylxc#&&XqJDr&Vu-P:ZJCWm,G]|nC7x-]nzP*@82 rd%:'u `y3m@n'xy/)b'#4|~~RfuהzLC91`k',eDѲ\Tx%iN$OEr+2:qb,Of68'~c7/EA_0e!#B 4i<2 Wg\dG24-WI2 ꠙxWT>x.m 6fYFQ`tD}WZ00Vf>s &+(jCnfۤjnk-fAП$x"|,?\j:+Zㆯ1ڰO2W,D~0'j+? ơnn w3L nnJice< o-bf' nVGṄ_*G3؇[D )mfd:{OWW,D\}w^aW[c/t6gE̲#YOӷ&^16Qt#J$>Бqڂ;\g?d aWǧ~IȴGnsH<"Y;ا tpT7ziD{.'ʺ+i;mH jtv"YgGxAmc5p Nq^G 7:k 7lmEp!u++E{ sH#kv!:)J77x)1yʯ*<Շ`S{R ,th~# ԝ*p=;]7|=6Dcנc|z޸c-Neuwӣc;Jo$|:\T"Vħ? 0p#z_LE vpRHE, MM ǭ;ٳI\ |H2dVްYޕ؎%-44!N{'B:'#"9|=D 5CũA݄)G"80f??=雿ֿ~4\G8z={iy֓ϓ|?[*1E?_vb@LxoFr:tDԹ+*͹<;ؠĀ5Ɲu GfFy.';B5sY>lp|N'}2O]L9U2sƢ2=ݏBw~we~qO{; 'uO5.jWYTtvq`ǁv9g;8Yzް=XvUi;UnBr$,3|Kopy'cv783.OQٕF{%SƮmD{!s^h爸|7E]Hi s)DI>Ch}v;Ǻ^>qO0bxHwnGp_o?'.،cܽ==v 7 .l".׊-P?&=="kf։AB>nE}Y* #t}92p3?S4cQ::Cn% !e |[C#i1/w2kpQN{b(d"NNèupbk? C;s&mc_\ˁ 3`g/@4;c_ā}E^ٞϤ$K ĿG*t5{JTHyG&bXG~g  "dፋ(m(s!vn8eрݶKgu\Yfy 0q*Q|UP/}]E`GUL8y:u-@IiP.97dwx_pG9J* 7K1IV%@\n¦c>n;1"(Cp̧NIG|Nh-n- ScC qWAUt@ dI{uvtϝEqe~~6 lڀ\;yǐ'q gQWFYObPt! ꥳ:f:>%zV lۖ;+Yl% ^W3yJI{~ HQ!2.@ʽ/zŅj,`3+ kVGlbjtS|ՓSC]:X*;%O}"0`xp;E ۶GϓƮ7ܾs=;KW/OM~G49 7oQр<t'2mjʡw<,B#'-J Yxk-X°\ wgoJv$ɍCu(7GYtP=b6N>;Jve6yD2ykq$Iwuq@ohѺB#dXw"A6әDzcڦr4.|3.DĻwWk`)t/(lMࣤkԹ>,NVKnwq`ǁ~9[ `::v2smD]E;]C\qb'Mk;pɏ9!*{sz67l mXk>:}^FAa:%Y%>]෧|4!U{+Uoz 11%.ѰGM8S;K# ;:+:LuS4r:N"o0Đ}Pt fTo `‚l沴^[qTOqFxs B>SYt&&!` Qy] )x!Lׅ۠ 2:O )eᓋ?ɦ>{AkDGЂ^J mfFJ4ΗWeddfѲ:q= da]:PmpL\ <1owO(Q, ZVtrɝ?ʤMGoCˈɽި/a"4~le4T57z v'Ըȋw;}8:QG3l_Jltۭ4oz"*:fzx*o8: J]nMMiVlcY= <w '}A^}FZ4Yf.GmgBd EĶ1n`C4'u ?/V9rtL)1=f ‰=.Syb׼G=GgxB_YF_1V>y){=+iWn UEŦH'bsy4|Vg_<1Н.?Uˌx>F2*ʉ$#~ß;f 'l`w4Z9H)fIR-MI{,]9{.Gs;cm|Jiefa)"3^ sYvy?8+}OL=S>L8.Pd)< yf-a+llէʭh,'7CtYIbɘ&~%*4K5n[lfG:>[>8 Z-,hNro48X58B Z۽!!uYw1O-ߥEn~tM q9;-?{_RGί4c՗f#5GѬ;'0Q?g6m嘺ϱ__Ӿe|6/Q/~~t/ lgԱ:ఏ>A?ub8ubݾv!jgRh6KxqغA%*88~ASO1,n6G8<144K N#V0HSPr m Mp_vEpqHK=NSy@0cd3[=Lni֘%Ҹr _| Rf,~1s=sC.`:Q7F.JG#p51Ͻ9488puOK#ֱEou)P]Gd@Zt.Zq+mh~_t#Wdfin:UvHg1x遹:V k8Ȉ沼O_TW#D'^\NV=²8өf8C9\&OuG_ҏ1 ͣnxC[';Q, |^* }_*֟I!\fāOtj+b^ iWw"I|*`0!g?աtj=gkET=US-(Ox^@)[e&O%ԙ NM)#sFg /όS&͵rH$ #r`xƼ0\, ^Hm&!꤭@Gq.ga~錬A't4/Y?SN,oBpq! <[Fg{:duVV7[~:Cg';^eq5t|X/ҥAG!uUUCN @| 1hIn?t|СIc vw?3y,1*)}1w53 fQY#^8S`U qủdc:0]̀JcFcwf0~ՉM<:x,/ C;( NzݥE,I\Oc`kFFܫǸm_CR>=xk.+u6¼ٙ,Z`L{ul + 'Ly<8y]N?ޜ~o^޺S. GHXij2IZsW7NqIy wNeTzLchZ-_mH(x|ÂFoKq%צEy[R}:[y?ٸQh^nָs~\L1gt(|sĀ0{]f">l?&l;)&y jbzjA sk Yw@>_؅vq`ǁ woƼ]~ Φu:OIG-o'yU?5#uĬ[g:ql_ӆ a9Π]a"+r̞i!/ W1[b`g8ӨauqXs8 קgN5(uM\IMevZ74qڗ܉[ Bh>|Xcrc;l ~7cqF4&%hp "l(ab# 5'- i̖1r Ք^8ƣ$Vnr$%{kWi3?rz Hq1 H]fBc | /;1-)ГsC|/]݁fMv.HA? \>G{b.oiXqF#Ut78:xizk _\}z_~?~~k?^y}k`%C`{Jc8 }gS,[x jbpYqdFMde ^py|:;ͫSL_4R hE"Uy`8lB0 fA !7hw'"E< + wƩdGH{ WZ-Rò:?6NcuD iTyA‹ Ax\JK֠|[˿Coe7q?pU@fm)_ 0y9ڴ/mYCꑾ4F;8=X%"8&m^}}U.q_C-MMPM_9P-|WM$@ Pf՗8RU`|6gZ!8G:G8:&:'`d+~TJ^"y|{AcG]"[ǣ1qW+!p ޕ8=] e-R9.mQ ]M{t~FpՁzLA< C24d.!ǼY~R8Vʐݑ?+E}Uc">_$OP8tyR9G{(c41sdݎ ,f%m )SmG^Zc$Dr76 \sHhGF;s{Xwwy_cˉKpb0:h9u֫ϕy_be)$9u1~釫 ?W/+o_Q->a:=]l^@C |FTlN7vl4$%yNš9%=}"#N,Pi^r]Ar')g--Y(aY<| g"5ռ;tO0x/>s?$8EvƮ*38ʛ׺ dL':ӑQd[f|꫎g̽28ŵmʓ2]b㿥 7GFcY_q|5KGZQP;Icь'(L*df˰۟C%!CNu>"]\ >sGWnO'W'!N\\q+MNΜ@ h'+Ho&19" 1\/pFZOl8+}DW'G$i{X <΅l. &2y?K= .3dep-b E'o~#/v48ˁ1C.ǜlxjxUO/O@IDATK(9Jݝu|iMv73l#]bdgh) fN'N:9ι<~ߚ~=7h'168ҵ9 [qz׈{ >@=fvl8>眺 v=l=>S2dtnr .X}Y6j`{Ї=霝虢aխ+oOva?rNϝn>#GX{4`iP "4x+H*2>D1Vb癔yt '-nyxYqF`(2NiP q-Q-SO DN'0C)1G ݺp=727.\}`*Tid?4FiBq "ly.%<&]#]5OwXHX<:r~^jd;G_"X.%o8R72%&M;=MkZp^~ /A>3OCqˊ7:S,OqXʷuZ߀-| iGtzt6z⊖ /ȫ,^ؖi6CżCClZs'Y&uWV7V6p9Đd61d2\$ݐ#f`cC VUYy"3^_D?8'C[rQGL9 #-2+#s\3x7d8 ,Sc^>,4]`x/0hm:n8vkiC8:s tޣLf3ɫR(/EOAM~uL9kem;H)loԳ>d}o }L̵A8P}6rpNO{ps΋:g;dۯG.|/?2:7L(wlJa9cϷm=_ ˟[~p ϧO޹Ce.ZaX` K NG>ш6kNN’2O{62hくY#zJ|f~˰[E> 1& [_by彿z*AZyϗe kЄ}a/CU`bCs@Q15 ̿}{ӯV;tԋpݬ"h 7޼e79/PiWyp*0\W:usN%ѨOw~3,H?E{`g']x1}Tί3;`uC[3wy.v~rs'}^>eI$N}cRI Jc!>8W.(?%!+|~Y> _ x1̿ȳG}^qu}nR/>,n"Iã/ r~i`,ͶTP1v =#֣чFˁU:#;&SzϹy){d}UeX[=y_xzc?NgV՛˗Nd/]|f{oB1-w ʁhɷ^,S͋WP7u^e(*r9 y"܆d/Gm)4Q,m$1:sXc }ҲetpObԜ7kGto\>_'@NgD 82ou!WY/Y:Rk[g:[jw֙1ʔ7 c8xmOV l*?\[.|2Sb >q-*ݡ,KCH')VVN6Yqr&=A3Σ2Guvv3/p|4I#BRm0jQN俵-sۦ//*m0y5ϐ+=qM{8LSM=X#֒_Q܉>ÿ8 BkC޸uDH_L()S4A;u9/6wwӧ9S+Ͻ&a *tJ(گCPz?kPg #:m/ı8=8MIEcʞAMDS~Jfh˿zԱVqd< lCM=º%pGδonq-="]Y]ȃ JsdѶ| -Cǜve!Ncgߴ=bv:kr5$j kǂ?ؚ'm+@vbxaqMj{ m嶁xv+iaW%e_>O8s- LfgVolliaSpr0\^%SN9` }6o)GÙҲ?E/lS σyMCؽuҠ9kO;Yӟ|@J_f|ㅅ )s~_g[*#:K;Y\' 979?w|G?`<P;L~g0 J? 볌" vVX3j_·wyP8}o<gdy|F#HrE:IpGkVA9%4k&Dk^x<{vR.竡I02bfChV.F7'Kw;_.x,ħC}thm}Y_߂1+EtSKZ=Qu*g\w3s_i0OסPV݆I1)Y=ß $h)caX$ORQJCeߥ2ޚ`y K=ۗʈ OCGQ\*||OSF`8ۢ:tв Ld338+{q~Xs՞y9j"7i ll }JXgsyQҒwW65ʳ*0W잁o[wuat'G)xAㄷ:?᭕ǯ|J7E`UwA03 B9 `SX~tq|OwwOqO˟_|-u6[DQ/[MsD^4$ y3Mȕc^D lͨb-UDS E 3(Hg;WJ@[݊2깺6pcA :9〆/(VGya.LE @a2w5h-N2 ^Od-f@y KV)Se]VS%%߳(˫ԡI۱^n!lf7Qt?ʂ̼6^T6u}mm3&qflS.qøll/p˗J[0ieaՑi)Mvn|_*Ft`r~TiªNcOh._nS]vnJf)N$W0#Of "B` j֎qOO{N%x t78-mF?:oqoӂyNm3Ǣ]m_XR59Y|f&/M9ye ^ؠ!ɾ1fe!šM2YbbiL0r@~mhˉU4ʝÐ2_hgXɧЎ&Pe}i1I3@Zksy1{q_\dP .fgKջk_r+gyO̪/F}aȽUS9Ovs=V]%{Ap;A{e8'tF,) 0~3%w\>w`D}{#߹ŧ*.xwi|!02' (On<~S^`.&!`U:H|9gk4:B Kt ae eph'o=\`i4\iTt8xCҙGL#]Uw:TC80e8MCbrYyեuY`hs-pO4|r{8J5d zN)b`>Eނ [+@#5i1D]e#Z]~t먮qшC:sp+[l7_$x?ۨJޭfޅ_;8Y)cr#qg8߹8ZO|}͋m{3t$m}Ū=d#A*6FE\į:u@X h@wضt6:,5+pGB=BXf:N 떑ysKy-.&H)A310AջH{% .X%u4/!X/^_(3"V{ urWx(/#I"Dbha Ɍ +:|!P̸~ȍd~D.4 Pnp_ Q m_ QgP,L!'H1Ƀ<}\i (I9".%a\^I-#xhO /cX"WOՃM:|sl1RY)9ĩ0Rν/߄+=-Qe0 T Ϲej꓏nKYRՓ$zh'si: BjqQEO }^I]oQEѫܦA%%ڼ:mCSvR>} })"iG0LoJۚAIu3%*dv-ӿQZX!hY285JzO 7'[ҊgF]HTB 13,˟6!: IW|bɻAueVSK< ںP66m5𪉉qGf pR;yNުGhQ>_Ȝru:0moUxwVҙ[Vjls|lW]jOkt=u>0$gPdGg̥<V}2_q%sn\q9!H29L!pWG~ "D̯)u.u+eJɣ V42fFuy0'oIfΉXX%5ֺڍIzvT[RvWKw|4,rG] $9zռ:.I0p"O6sܿ6l~O:1zm.G\eKLs?T =uwPjJӟ=xI^Ac>țm;8ngLq[ֶ>C|vsM١˳<:&cRGl5ϒXef{L=HdiNa!DZҐiKVfngK/y^ږ 8gU~̵/ҖA`V"|YYn1;e/*u2VgVs \Q?MuK_]_Ӟn[6K9w ~wW!ِXp9On)Yks|QeO^`o <<^ xjHmA_ ~yV5>UN@(GskϮ/gG0Ov /$/,f'DohHtQ+ğuZrꀤMu\] \su#?Tȟ44 lj'n~ZA,W [LH[k1l΋Ҕ8Gihle|lK%U!{@[> 6|IA'y^K(CNE< R(7Pd#N-yj鎴+R4+Nԏ:m{xl "Cv?0q ܏|ɠkB"NRҾ}_V\\5el/s|% t,~/$742xm '_ʮ} ) 2]qDof_c]fGi1BENy"|CMoE0@>$ԋ.5)@N,vN-5-*Q[M" ^qB9`$m UQIהO!66j=  cH c 9~Wb6"GZm"]=ݠg> |{kcеOFzɾ ^_гO ~;T; Yf;A=q5A{\$js,5_F3&q2s-~^ 2l ۖ%]ٺ\ڣҁ7\9~l{ -R g#8^^C7'tmB8aMZb Μ+ƱvKnkG\(fˋ(rZϺ=MƯK=S$p;tޝPۦA L|$0Ew /L рCEs{^yMcly: e!'bx{D7ȕ1L>AcLjظ#ɕسmVw.C=&,]ԛ h~2&Keؤr$H.1Ӗ(BVx<8MyQ+{/m "}E`D' K;ã"m*>݉t \o ]j^;6;;W}]N%}FwjZ޲*\Asp9*ln?Vɧs 8A痼ۜPO-bȠmdŻ/i9eV<2>;_X)i?Ǽ؇|#<-lg>jOvx{mL0e_pSꉖ-"Sy3Uہr;g?{%dy~9;j3M&RHsgzӖ&#Q=98Ȟrk~1ΤDڡᙴ7ZNoXVҭYoךB Ly? 1 tNhb۞|oʷ[-d[=-qlM*&07pj~2MĢ^OM8t-rao|8k!D{X}6ݤ"Ιia yJu7/ a'r2[H[a#E`BmSKW_]pD[˛yw+FRI@.,pmTNt'RI% kӨuh|M]i{'@r2Y4n w\ Qx@a-H 6YLky{VֻqIhoapEcVXܳ>'7DY| /p/<^G M0丯\\6_prכh,U݂bW^ԦGw2Fя Zւn]}?5a?͛>ѥ/g'7r߼J]ެֺ|}~A?z&ps,NWs̼U䫋yG3x8gsO~~W^O"@Gol9 dbե]OCV\?t}>HncKs@qB|I+>}EjmЃKb[g|пO$ǔ;}t콋Ř4>XlKCY л{xܖw]TGhs;r﬐sǼ8cЭ*ys喂#MvGyqH1k#>CؼӉ.J=>pp5tF'8ΥA#8Ӹ$Ы0W~ϕH"\J J|:SiȘVu&(#s#v C{y" `6lP3I_7lָ.op!~ \SGR&ƶCHW(,,Qjg#@ eG؅cy+/}˔5p2)\2HĂ36dz \Ljdq$ C^A\(r\qdXw=^4:8#7&o:;E-lϣmk( V(bk`u.]6,: ,a z _0x%DQXA5W:'QoU EA2UV'S1;D7ղ+Ts|G n2zC{o02r5 L8ZdwH?yڎ}{0Ƅg81#H6Ui LABSv'iiQ[M`ü/ظo=9zVbJHg$ҤdNjz/FDIQȉ$ En( Et9Gp6ša!ud}Q'fg:'fJ˴<@G_|JkwNyq?[ 8M ġoP/|jyQ3b9+э\vٮ' DlD~đy?|eVv.NOYu#`c3y?g2+/q.sƃky+˥8c/WڑI Ϝë6ڄeg{I=g9XyV~W,ے5%mG$)*{sJסc[*E+~:u#^3 n,1o+ml{Ǧ)8<{2 >Ҋ/n+S^Nu5|5>ąm ]rӿk\Pϕ-7i bluZ6w^xExw}ٵCGCĨ9$|A 0(vg`z .J-91=򜭏D? ʍGgV{=ldiy>g%8QN|—j5,ldl.lӈl ̅b<UQ$NJyhaol{MIp ™F֎4}sJiևwy: YYN^ґy@zhyEb{Ms/Zk/W[g|w5)y,fIra?,1:q@ߣ]Kl}$Ay 7_ |~s?[s鏖?:oՓe88Ny@`-.SAZg @YMgB7$&¹ZWCwum䰮vڤؠCm|زaq#g(v'O} AA'T̵czh^ɣv "pa7#.mv@XWM`yw hK! `L&KjmzRheJY:eCFGd|CzC^^Wv(g5}ֱ6+*xWmO8uH³|/2Vh^89fN!`^WxӒxmǾ9&†)n2or rN$O8˛,9u("UEŁ]_S ~J&F2򺝄IByo^eo)gU=$,]\Yr:n|}w\*]eUP5onVずip(Eg?M#?t\?)6!Rnпmɨ_%xM۱S~LTO{4Zq [Zhen5ٶm,Cc1sI~ 2ԏ} m~}#O s h1uj=eɗvv?eQ`?yGHw`zYܕlE<4"Dm->ȷ3 2V>>c?X~*.ˏh/7GR ڗT/VFevguiUvʳcV~Juؙ:'6݁qyvNp ol4 G7s%鵿s{|wə@h)iuA`jH*NO| Qz:Ec'h9'魃\+fyTma7M|A$]W8Ό+\ x-(9w͓>I5'9s&nMsGٔJګMD< 븭SYayp SXg^βԝMXmnM9nn[|M2|[W+ aO>M.~50_u9{kC?@>hAx50곝㳝o_.4dي7 ~eLH0dffnAlw/r?F]%c2k eN1BHu&idޢu< k?c=1K/6Fէ?R.TL6p嶸uEV&}lЖsd+֊+-FFp6)IՉJ!=kal?X̔GmݪN忸ˀVS-kfJg94q@IDAT2ֱW= :f/2adPQRmok?3^*\c=BYW~68> 7 'T55xɋ!&$Ucl/R&mNFk4+XzN\qliuSt+0{.,'+o2*MV$ϼ/'h&᧵rٟN? f[5jm~"'PqUm(:^#򻺼:tS4t9/qF8ԗmvclY>hw՗ ?#3S|jJ4zxH19VI5~f^M0]H}mxfwn$p?Yq;Mqu,{:nXg&M]&AܓI `m/u6)PF*}R |G6}6h p{'ٟo׋s1sdV}ʶgB͔6tK;Hnv./gʣb{Ƨ~a].of~q|h{SUW˦;RɌ/wwɑ5=m9(Jwe;1_.o{"۷~ly,?{{<[{|wyy':d-H|䠜X(Gas9$%j$$q U\mpz1i3 ;[<6N߱U@ߒqEǨ?= 'ɴ $A' SA]wRJUA_v%g!7w3r@׸1Lfc}kba#hF/w>xv>W_ҧnԢ, |.5V‹nW}=3;ol:9>>* E7Pd?wW]R˹#/bJ8q8tPyx:yDlgO0XtpԯNm)XvȮtkTȈ5 z(4u5T\Ѥcl8!X|<7?gc RB AΟ|⏓2e \qyu"7pm8scONٶ:|loi7X1;zjY7WتS >#*2)#Pۼ?; >ytw suۿF7݃ H'{|9xu^*Xosz/-A?X~w'|/Ϸ~ ݧ9#eުѾuOX~y$G;@yVrgni㾦`@;!A0; d ǶPڷ-$Jh!L mbF}!8aMy(=6)f_IFz Rj6T7_G T/KGחpReU~p֑dQ~SΘewt73F*ìËM>߬o{KObd{9LЕЏ!on8f}Y8u9ۓr%N)ժ _f\SەJ !gM1UkqIBϗ2!h?uԶN8)*ml̓nh_cKX)!DŽmô$`_qwD.0DW;~;FPo:ײm ZLױI2VSH[m!*nN5l0k.[> LH\2Xf.rh"+wxU<!c*A$zViSa<58wG#ף,U5`M ;J6$>}iy3)^|g_]_bsnoeA &c鷡U3U9iw&tNOeTu˪xq[o-Oty=[ɛcIzP'RҤ(eA}VesgZ ׎E(oUQ!g=TkSRDw@η8ڿί' ` e󶻼5ߗ&|dz `Ǚ"mfϲGk@aY5}^['yAIE8pOy֟=5*Y~(ʹ;M=MPuE^$m9QvM>eA[ DO[,هGچ(]sD:ׇ_ 7@̽>}->ƽ%7q_| ſ@ 7m (ƪ_%Uv3aǧ;bϰ2F\OLy&~' eg1}qX"gOE}Ocp\~wħgfE> |X}֑d~xLLN|Ж|4raGνK!ѝ7aJ O܏|W'Dx}|9[Տ{hdIb`CG3ίXL! (Q u,:Vfp"|RuhDSWxf;Q14&X Ae{Gʥ:ʐ`jã<@tsiφA:AWg Q$Kxu\5*\RX|2IeuڞB̾MtƅpʛNyg؀N@qVv7~76.Jۙ(8qt۩e7Al>b,8.^|uy#:⮃8Ngo gdl 7*%aX-ʹ4r1KJF-O?-- ߇fZ>S VFts=*#!<Khsp̀L| X)ˣț:ҚfG}9L0\hh9&R]/ǾT!5eU \W| Z}^=o{ $V]Zx$i+O"8iڎUD ֱx3їzűA]J_L B%Vv ?Yn-8aʲx5RLޤmiLn ϐ-fIGR)lGͦQDaV_1iC)u bșm2zSUW7qC!0$B+(OP%B++@^Ԡ<|o){:]}IQ[iޤQR^z;'iO&WDD#Ê2MXIp~( eDa7F޹520e0m|v(4sߪT<}B)tjAjxer8vx]$e'^ WăFxwl0paEy")v&Ou.bkߞm[2>+7psyYcrKe̼I&;n}_n4w)-#‹W ۟2߁[cSYpР@9#kh˫Y. 0ǿiuێ9E{#'g62Ҁ:uiHG⹸N:|` HDN[[O_,پ5_ܱ))sZ"$N[aUh `~:sbaV_Vd2,k2Wq:n9"fA5-}A;sʫ O~˻~D o>J]";P]<| 4𠁏VvW%7I5f}<|,Qlm4N3-sy8{nj :sw/s5u?x"C]Z,Bcq'lWgc?D3ppY]E~B]w\>-} hE7m \<ª`٦t8{"pLuΡZ$^gMHVla =  +ՃQ2=O ?|/*#ח8lؼ\_J`U$TA>y^3tӰ+ <:|7yė03VK9EicŸ88;lv.(t,EYGSs/NUim͗Q2tG,$x~y7w^~k_/O/^[I܇;2ՕcXinG7 ;Zi bW@=5T M 28v@Z]Nv 1x428uc;8eٷu2%m\`\€߆7ˑJԋ<,ZpCt7Tκj\zp![9 IcX#Yg6׊Dѕ2}\"@7I& ]{yg(>5r$Y*8W'Ny,OO#g«{.RO&߫d)SEꬲX@Ry߽Gi[y<^gHMdRD*KٜOo -֙mC᫴G.A5z ~ 6T\3 ߭Owo`G8rH+߭S2l+K=aS}cuXg Gڻ/wT7Z^rr9kYw`6iْe OY\1[Z7 N\=Μ-;\#08vr0l՟MnuܝJfYKy>$ N\οs@zGJa qyDzi^<VA¹-0GhX!/lF؄:pzΜsՅz*:Y3go<^ﳫ bKmO NoIϮ͹h nk?IsSMEuݜ|zɑ{yO\RcjZr焱R 2L\nK5I3vKE vLG~m딴s-eYVz&mG7Kx垸='8IZr {Vmϫ'=Kmi?Q7m?[kpxqo_ ZlLmں̳z۫T57ɯAYz\C'KfAN|Uo7m׳o㓈O )Y#qgRcmI!"=q~YO&Sůr16݆S_ovpʻAlgEw tOg]#O33|PE1 i钠}\?>;xW7`F@Xz"}y'(.g <ȀB9֬j@Vife Zb}DDUL<]L+#V!xƅz zաEN#p$Q}OX[Gd& CIgwC0^<1QHx)5mZC~ cz6dld1FyT#K @yN(eo_9뒭(wxB&5܈̴pNrlCΪx +88G:]CkyloNH'ҁCtp>X ~?bO,l.5[ .DDZH'<=h<{,# G;Kg([ӾԉO}ҿF߈!N緮XϿ[s]|{CVyGm`_/ \оnYO&<(W8&=Bgf`ڽ4oĮЯ!&JੳWDAGqN{0k6her~/.+v} ]hm9}k[tc;w8#2(M}L!`G,ʕEV{^3_]q|9+B`Cmر&:PC9շ6- _;qU6W[;^N^p~Y(eMs塕mfLiM"-:Pa$ӵ-0j zS]icy]kW͘`AbH}0Q=3Mrtm۪DRu(@~[DȶCkGZss0kmG"!6lk˔ d?2zbX@(Gl=&"eCNo]wwdWseu#8ӈҰ6 l#_U!-yynĢ'/2m'`Gɳ22/mJX'^ڋi?P]q6O%t͋v@؁TH&Wm/ 4َ#cXAyE w!W*Nљ=hvpYODX_|m y$`E-9~}{  ꍱX:0hfR/o $ :08w8'X k¬68W1AƀmOI:N[k3q2qIvTj;H}zu>|34; UđyyS<̠sڂsF+c} Xsb `ˎ!r<OuW:C.T'J) 1`lU8&@qyu8֝9]8'^ E;Εɀ*AjF*G27 #|)5}΋lϾ{ă)PsA:ڍj_>).y0H,OmEZIYgK{XxAN8l҇_(,'hЯw.dFv3|٦&%6iBG5I7( m;zΡGM|LiyQH]QΏ_K҄: 6 c["倪'*g]η >,0R{+K8 ֶ̱İ=*cťf{?,KV!GhdZƶ1&OËMo^t4 Tkw0b&u/ޤQ] _fԳj52_[S4U?>5^8 7Ѽhx\k4ֲ|˳/7?{P|\ׇrrr x~]_RxCҗl0^<7}]gRuHP?\ƷS啋9 ^fO ' X*;Ox6Nr@ cs+xQtJT5l=1!`ކC+4qg9pY ^tBդz٫PGx3qw媏80r83UH ʗFG 6Ak`Ux6 Ls@rHHl,ihқ|YChxaC :H)nFՑ(^L{R񴺎R<.ldA,@:; :4rEvTt#~⺸կ|FXٳ v>J5۴::qUD󇤰G}XClźSPO ΃]%%L根8/72I_g(mW&ͣuwYWeqFU}x0Gd%l/~rsq!H/ʳ#~,,`‰*1Cbk,n5>[3ƗEqb`n3"HF\ EӠ82?/u' _# .|V#?+gԏ5>#Ġ ?$8NXhwy',6i0ڀT8@'!$/Ȥ*3 (+RGM%N,].wɽ(7|pk3(9t}3!n皫k@)(-~--JG+;|[3+(sRAx8a{4@)3֖@6ft sU[Esx^54LY/oBCϣλNsͬgo_;FD;1obK-uߗUuNn @&As$\^˚y/C˟C<^lZ%rI֒)4 hntvzzd[u Qq̌ر_#2ssܗ8, eyDSGԷa| c>&O` CBΧhv٣Gѻ`Q‷ES_ ;}qpf{h Y1}?S{?/>a37~YyΪtC0ai-52zl7d~.v^NjEv 6ԬPFsmɅu pb1(^rau BaS Ŕ%`wFV>iZo UTMbГnIUB#gaÇ<0Qv/n\ٺ@Y`N!l~Bq:Z]}HɪMjA6NoW*ou+(qLj+aLWˆVQ>uZwmv,ФoS:tk%p-4lb<ųXmKL,?@#``H^\\}ˆC1L"*-y>!YzIX.O- ha> Oir? Tfa :bk tEkis}͡XN dȿS}Ә7cGN85k2 wB}"gퟶ5mT6]ģMw6)r+㜟|+|*\H ^&qRQ?iclڬz 2 :y^/-y iRN)6@|C/$w%KA5US \GlTۭsW*Ůμy{~ZބOD&uE\g :w=ڼЈgG~(ٖDjۺjwC&𡞴'mxmӲlYZ9y{|m.=BZʸ:$uQ)P -\HjW< +KnZVU*uPL!/Ϭԉ%Myȳ$k*^3+W9ϩ$DNs-жUjmzg9%W63^mmΔuvUo>2F2U.v(C$X_v׿|.U6˲u81Y?:MC.iJ KK‚2dXst_kت?rTZ_E|sFKV р9Xhl56O>'%^ո}k (P]{ "wCQ?08"*o1;BgGߡ|syM,K4. }=7+97HoQ.sEy.B[ ׏tٹ|~&̝6s;+R B&&e0ꋛNT(f͏I̔s{nlnv:'rOprDʭ@qށɓ$|ܠ5 ^FYk˷Ae`h;M &+ȹv pW[w_c)-H_~YS=-l,uE= K4ҏV1[S-¢\խgvW4/#u@.Lӡpmbc7Ʒ Yw8"F$w(X" t ]CiIBq0>::3zWW9nwI-`[}E8!辤wn+,iI@[Pm_ &=d?`+䌬PK*[فɇ;'+! .3}]]ʝvYAק-_|y8og_~\l;?m&RѬTkI.z ~iǣC>⚭@vHf+#|¥"ia;8Log T RHugNhlkA\բ/g,MJ 8VX+XQaF8P9;̄ɾuZ&k( >c '#+&ep^ĆsDeЀNx6SB1x\6A&m{p2Pcx܃M #X>褲ِB]t+yaWl-G~Oɍn 2f9t*JiY2х<-?Л$U?(NaYA(.ۋa%ĨW5{2 J CB.,Nmm~Xt7ٴ>!%A\-+^92(sܬ ]' Wf_?Hh_u OdсdQV D#)Jr}q} nN潤 a"<>Dxos>:>XW=ڮC>Ӿ_Ft˳|A<ђoc]/51gIR9.«<:yI?7^j,pE+.P_>ܝj_YNRۃf'{t%BKf2EiȌ/b&E܃r1:]ns˹Rw.k>%0.8%K,s3QY<^#4um:#s `pp ܌O(`oK'n>QV͟sV<9 X Iog9xK}kj;nd#%LUVSYk~PX'֝rꙬ xljp\ ~Ɵԟ5a k@IDATreE.oP)ʧ p]|X-t凥i[cl?l> u;MNjzq]|駏ӿNw&N/bRWrǹL|#mhg1p1^2W,L2mUf4>&yo !=^>w)\ ~E&dC%ȸ:ol߅l;5{ӻ@'~ePﭾ^Yo˟<8\/%e+7juELl"őי N_#O7um8i s뺅(-*s"fxF~SVLaȑtu@%)*QmC A p&<|ƨ8Wov >aj6a+'QG ;3D zqti'rU<[FLP .t"12qaJ'5`zs;G]gE$W98dZtO1ӧiCYm kpo>/TwW AXqտY1vD=gzңSor-ʂGٶ]'sӗޝ=\;_=C^چn<}@;&8l TfA?+Qq Uڶ8;ʪwN',%s$c -,ז}J_bWYfGk2@%)R~P  J?uOSޜec5q\/ďi O~4c`}S]<>%G2yO},{/Lz}.}Wni3I]&gRȧaj^`[T/s솹myA=bo??.tF^ưD姚Le/~cP(c}8=MMjjA=uI2uZ`R}&?eɕ ?Yh~PӰ-džHBKl4aiS*A.j]禿4#ǮpDW[qӣwrՎ)幜 N[Hͼ\ymeV+~+@@wᵵ52i^Bլ*L8*x!U֩08ό5 ǚT0avaP{lK3,}-N4Nc # $BH]x7}G0ǹKƣ)UdXWZfE*sf&g0o73Mg856GHY<{l%{^]ila^9oyڲ6lUyQ~|[Yaume1a}$_:>>GKݦ* X8'=l_aη⹭3]:׎~[]}cg_|d V>}_g+{O>*٢lzaON< ='ĴCGE^# Pg+~ 77ūIK+*秗QoS>ADyw?l,ׂ8gsbLNRI#}'㫨;?;X|?,"Y3[ihC_ oK:]ꪨ]dv+KvV{.XpzsY oŸlO%'0Zi_ !2PrK`^i)ϥ$,ij#W8 sجC(Br^=,7rjDaN^)i9ds /\^lXDyޥ\UgCSotY9KPṷ̶@|D #GFonmO4*5Ӣy<A,]*ok)8A_ DN\]UNfG[6g8qp{e;Ea?99#mAقv8>(/NϦS9G%'Wz:QɠwʦSZ<%6!> ]?U?v~W9P9ۮg%:&}@ebQW0@<:bU>3J?h+:X7d?9}iGӷ?ޙ>ރGVlfw"/Y'bi&LmDb;~6QF:g20"%Fv<,QH<#/woܡ .^\(+sLMGҷx#ECWKT`&x+H?uOb}S'[h|H+ 09Ѳ_,=щVa/}xR9T@!ԕ{G/g}A`0 Uk{Lj,P>"XmA6xӖګ 뫱ї>"G&=@xU!k2:!˒T>t˺ՎhWUW&"BX̹+壑0G 6vVVONy&Jnw ^rcn`E'L``Ac<{%F"I{۫suxc\Ԃԥ9ROߙI6|cxVڈI _z5/yNh^g݇~j07x7Y;r˟/]|lڲ`"3'ϐK^j>vZM2p8+/;EmЉoŕ:j]LXp7T;[?y2>0&Mwo59j=oDKb(:a1ׇ`Wy6&ϸrNi|ؙRw'%ۘ&1mXnoԵ\6LRj\o␮Gd>DW~o$շ%:# (H\o9(X󵰃brU=ÐN[|Q z$8T AMGVeđk']5ynׁjγB::L.Ȩl6S‚UΊP7\_^S'hykCV# q% ^kL}_NK~>]e~2[ャ+'`0J8@RAGUt %`A:<q-O!.upA>?>ep P ۬`Y0YT[V]T.zasuf(ӓ>hxADLDlfv1u^ 𽄃=VųZ|V] rEqczKӏ gW~4}p&{h>>;[<}\Hov/ّѶE,?3fLBU=#A$rB'T?cmj,M`EڿyέìH ޒo.I~@=m<+@s$u+1bGa8- 7&n) 0\JlдDެbs[nnڂ 3~y 8}|SLkϔxGŠ~NЯ<C ٟg6~ԑcsc\9NJt~'ߜaxI (LЦ㹁-CP&jЖ, q,X|{~eph\X3AZeVx .A5te|Cѩ0!D;컪I9]ӯ=}%ajj Og솦[uHϿ؀i 'PSI& 9*oڊ6>˄k@XXyDZ:>!Z8J ^,yȻ]K25#6/^0ic4Sux^DD=fr*!hSB]7 kڇ1JPϝ> _?P:&|7:~Hk v˳clt05*σLݒ{g 9[#7pLKzϦu5I\փM o{:O=$0D.Q:g~UaOy,އѶl>G:|s|皼Mal-aŏ(N|JwBW\< WAWw?2&wCM3N.}6c=xR:uջ[^S/=~?RlY]'g̗x-9Ց ܕxޙXqr};mߝ~'}OiCytK~V^h]KçA pt+WPfW-16^V1{$x3@$&ACKjUdEŗeuŭm L:y !WO~K.m\ !=cڌ`)D>lrXU6!ڡ *A3<5NϢy σ 1Hfv&0^/AQǘLh1ƭ7d? *Uvet%jb0VbS!"m/XpW`,Ԓ L: a+MŒ cHTا,Ϭ4{7(ROJC#OBUiNaބ -:W 8syv e&ʮoŵD&*1cKbgez^ K ԯ cc;?pO٪MN})32VTD{P?~BuNBTC<1ˁ؞PYlvU. 0/tltÃWqVGp}MdFv| 0V"SFc10Wg,mqNVԋ6DI O=Zy!ֻ[{~Z~y`2d&B#m|m{I-Q|{ TtŌLn=e*Dd?v&: G޵s98ɾ`va6 }`|Zo`:9 eȀ2x\f۷a^̀~wZ;ɿ|2=zx:;;Q7K~5{/gj{/UH!mP?>Jrgg߱]YLZb8,SGF04ǟ{紟oL9UJjېpeAb* R}g_՗%;9 8ݓxۘg&ju]rߤZΪ^ըT%_:EqT4tBc^ו +L&; }ޚSQ|)sz+I̮* =3;mJ>=LI-ݰW}ye]ۖwW.|&oK,o /C uE噠=Iԓ<=;K4O'Ey^Fy⏮%"^jɵ{|;y3P:~WOK*SFaC:;G}5'w~{8t2ot@AVCQm1(ߠ%rB =`KiAx uxs:.YelcO#(X#<8t>b}֖o`]:]1:0;a`W;tVI>O -g: hT!mt$(?x9mvzA LC ̑WQv`k&KVT +x9D>& Q;\sN$n _ǮzN<'8 V}Q];m!3>L1nzFqR÷ ~OeI<~tl2Uտe`KV?u.Vk:8+p&J6bpja0[5][m" JNuENc "' n2A ^x-GmgPSؖq"2lDd!|q+ < U=Wt:OѢicNp zy +#/(:( 2t͐ ohݽ \D,n0P]fTTw-s%&Ч+f`+.Lˣrʗm8iu6靰QmWq<ʷ7doq?yiOe z@=Վ[q OUVv*9Ww-#6K[Q)eSX<')2`;))37r\ #Z1EJ5%1Ex2VvPF2 .}ױ_\&yAGtob92ڶjW/GQڜH_L\' u;{/kӿ |_ ;>lcr+un#|`'F;@K4F6eP5IԱ#@g6G_Q6ou}2KqKiG ]m*+yR~x+'"(c钞 `\cl}k١}iSv.OؐՍ DGF:ɨl;yAxَG9;my0A˟:V6{qw ?AP;r(v+F~jgq M!;'{mJ%g,~ڃcF8Pgn?N߸t3 E/xVF`Hm7iN{,Owg|蔀;qv7'$ $4vN0Їvg?6gj wdn^9q<Њɖd߾]Z%5HcܨL'^N]olC+ݮ%}7euRme " sܨ472nj~6eBWyWOܵuYԣ}r&upC "l 8z^]G֭ks&#7YK n]{QCQ(ˬT _|'@뫅ʳRx8~ùJ)CrX9 3h}uNSO2z/i~Ե:̳K^<wȫH;x/^4m8DZkPi^o'vGxR%Jz٩NUI#E%nlsҶ*\GH} 1Vy]\y8箺%wk}?lkQedS ÇV~N=y|{yZ~>G,Vx|OMllk6vvOi%~~bz:/6p>ޕJʍxPG%}ƣ3s3|eO^pY_'o_x!>L}}G]/ՉCMճ4B>O`z;B"5+>6}t.or4PXYn7ϲ{\FL({Dň8~p6?b(HߒT{ .ڗ g$mIYNlf`ڠI&8G2d,%I:8tj\SD'-K[sO}{QӻZ]ME*K秾 -bNZ>9!pKaP{93:}յ|ӦvQ$FCmAr3?t*.@bs, u;zQNow n+SU`zVVv. z[G'~+VWj1`m;._`W82\Li ~սt{V)I@/:]CVC3o=WC%iv&>rhk>7{oL_OrNo^h:tpdePpq90 wX(}705_w[]9L4BܨƝ%&˄npނS;)V9댛ZG}:q>C+8,`}ig炾H]mXhkN2y>0xu96ltdپ4T7C/yE CDn4 zL`6Z}~.w\E,O֓ATl^T :NGis[@ʙ$Bo"L`eVB յ>`c 7gSmXWlL{H USH4Z]>&^G]QC'Hd\UR1[6SsTshq h#oeKeL>kZ/?յc@YL(':-hWBN1@~)>S+46zt 񟻼dVFOW׫#s Gx[hlS?m;_GQ|9Fې?k{]Z߰3g+H>h%~$H9۷  (_>0CSKNuRh햬\pn=+qʯ3%y0E%r[CFnegsRG<M(+8M E )2NsŬ\ylgSՅR cO{w̨s\1wG^ۍC:@N-9rISj'i0djtTKUTv*Pn>Qw0%Sa%\ <umqd7g1pmعΤ/e+Mw| Vާ3}K̋[6,Lo@!lc;#eoK:~^iyCV;Efc'zޛM8Ed(p\=>DJα&^,x]=kV㷧_ӣޘVC`4kݴ7=|KrsnHMd$bcїgޅ75&yO#of (3]tG6HXGI2YyQKev[w[7A%Ky\-|S;۾riz NkCx|}|hoRsܷ~k?j\y-zk(ny%raz4o/O,sMhAx4 5_!+?Y;exz=}cYi?uEeeᬬs](_tq2,`_pҌgW`a%@Wǯ)> _ٜ]LW|"Z߈~% w|}_C"r]cY~fCS_/"ޝ('> djgAq]|f}5Xma J4J9Z F#GgܺV/lVxVQL Ujn\ 坆O4k%XINyw51g FB.Gm"p:^W,Իɷ`]_88mViqA9#X\.1&a>:|<==%bKVSs7uru^р:tʸAV%9At|N8.<`0nW: \SM'cg8_74 nVGjt;ӓ8T]rS`@Z Zu rWIb_{t<= x]9ᜠp 6' .;Naw50Hąl͊W34I>UPGnGP~w g:m8k`@@.ynSqJX~~zKw>7/^wxWo5}aN gZ!>qŊss Joa5Ec׿8< bN4|-SNVY LLt݃ÃO??ߚVv2`隉< L3'0-5 a ,h6JI /0NYKϦZK=u܆C5qoή4W盺+>k](Xh;]]+o|oи~>nU;'΢.NOY-Ņn>{ִ"`wM3[[ih'u-^sXmJl7 {eJX<ԅxÚ=;#945eٝxt9|xCkC}G9U6{\s&4= ɾkKmlmV]׃x4ϔ埩87ws9}?7.$HȻ$^t.esܸt}|7 +M>Ѹ;Z/~u^+焃&~w @  fPߏAsh\ue :o=sGln >}w=" ?7,=0:{ \uL;#̤F V'o W-i:j eZ@H!gMoٕrEBUppa 8˜nRbȖuA]q:o;[A|:]s# heudWG'yʑ DQB[}G0$lT0Cg^vmhm3Sn:4+vjV7mGfs*r›8cٳA'?;P#KK}4G8oi xXh:.YOM8n PKGvFcro84#T-X.S]!ngvXe϶gtuu[8¿m'lkQ ::݉@bCYjO;oSwg]hvnӞԀugE⤏"ucO:cpB+_J^c/`ÿw7`zV,L.{;;GBoX9~~p=-^ǰ%=msD #SQ(SX%v`MZ>h#4NţxE9,|@IDATsܓC:J<O[8$0r$- >wx ^"tCXgx,\w*:ʣM9v#mD_!Qe^2]iSF xRmԯm6c}˭z)_x660e/!zvDw!}-O⌃ݣX(yv]a֑m|s).$L(DN7˻ukyչTS_@#C7 cpetϫ-˞*J-IsE#S:C`? I~9qf^N#V6wt R31,x?Ym;n9ǾhK[ ul=9)Ε SdӲ%`M~ `j9F4>hMGL~-Vrѭ̶} ~sTv>KO:MͻӦ=8<98y_W*8+{ZI2inm\]x?F@Ӵ鷜q*Yn=%p* >:Os%@C`=;1(<<ٮ2~D˾*k&EwaB  7m*-F$ΑI^x,?=?;.RO9dM)'JeSgͺz󱟝~S] lRZvN+](m-sRmٗI}3c.EynCo /zRFTvVsyuwoϏ|8N hsˋaNs& #՛gɻO_,tɋ>N*>>r,;xɄ`G]TWzVU6A'yn#w [@KWߓuŞFAZMJ{jYL#jd|+uN$RUu?rթe"բ_[fN;iwen_̜⦖gbѴЫs[孨Z>j˭J.P;N_lSXak ;LViַd}>Y;9}X<. v%ԇw/`qq-= BiMtB?dY_囎Z'k {ͫG "S`qT:(sed~ &2[O]H/^uL8 4ӓajTqefsd_λ[4BÃ]YW^ rڡ֮ sWG'H#n/ VdŔrX =n`rԷ o >u {:!s% `tFxU36"a|n ʪq'.|}V~Fh5r{G86j_}D+ c!_Scuֆ2ځxpS:KVyYrw6ǎhKYQ~e vVW'FǖK1GyӶe />jg&ڙl7iNGyJr9EY/~t8+}.K@9Pq8'@-v x;oNצ{ӿ;GK;k~V`[Y $J[E-n76vI@+ֈ}jwѠl &n֯^Qfqgd*+MΠ1kq#lrSM$y?oGڍRBG\"g*cs8)]@+c<ƶВ)u5L^*%}pFfo<9KPۻ| k>@>lkțjMFg+m֩g,,@l4/^ܯJe5-6k9rnؤ6x5?b_4V]zk`o+)66}Qv/Փt; R~)Zˤ!9+?fjU9+mmWˌ)m+@$։<[G][g¥\IC۾E]QA]-BhCe%7hƸȵmԓ qINhGۮI9]>u`l?x^w3<IȉsA!UbATTuX$yѪ ٿ ]ŒZiDνOhb[v׏*!ro]񎓦}ZejWB5K?6Wu腦6l~VkYV[q vخAd.G{A -w]c:lmCg\{wL^xO]ŖJT^OBU+#SڶFh}e _֧mt~?y61y~/o}K._w^TQ$,ᙺ}rJn+qe/bUpj+z?%1q9>+D]FC~1| e㰮~ò5|s|8d/]o1Ηn"ς7$\6V~#1=բ!xAqG2&l ΅x;#뮆;~0?l yr_JE>sN'쒍٤Bs~oU ūrַ(aՁӡ`@*![T'U:?˶v v`SۂT^!y G߹q <ۜk8I3;^غG1>)eW7r ⩘WxiT]^'"6Ufu]Q|Gҧ/u{ViX ! sUֹo]&u (ŏAϣ ` 2Fk~3$[vA>ԓ|\ˇWcY'K4)28 >`#L VEFm, ]Yh+e;Xd5P%س9b+hXJd+pP./fc+%PktÛ\ؠm2uG! 4SnFX.7WP Z@Y٧JG*]i)6x S?y˹*x`%quaN[~8A/! }P'eHLmY2n]V*S)2H_sXsh$!~1EUd" -XnJl(Sx qd%c `Tmj:nEN"_g^ՏI}EM\-e. =T@-5(!y3[:5@ﵛ9ٯ}٥_'W2d ۭhiZ>fgl: 'Ͼ_&ȧ͸LC7L.$=Gmj7){O yY+EӦߒE_*~J{cTxѰgygbJ\NqoAGCjz۴1@J{+rؑ4sb [1]XpWvm˯Zz7+*jگZoU¿ //,ER7I^Ei¾ 1^W~>2?n|/Ca^Q]mW%7f#\9;K1dP(ǣOE|\\.|N5g9o^X]lZ?59׷/Eխ Ìf<6}5ȯt롒1s(;,>28[3?⻁/q4CwlԷ%^?$ ]s|L?:0xYk1+EiBn7$pu50͌aL:tZޤ%gjcW`1?:vXՁ .qjrAh\Vq] o# x|vVV8頲nV6^ +AlÈqVbW{3 NHuZC("te` FQvkiroGpG7-W3rtE)v#NGt;pWmvmg\p?tW]my )0tdmOO*o;"a{nևJW`/ic9\NOONXUu>8D[VCt i0yk+Sul,Z zԉGN侁wƾlddx4.]'js,b %mw`ElcNbxj8.r0$pNǟ~y|_go<[bg?{8.ٲ.pL3_[\/it樔іP"u[ 8#Bv Ha-.&u7lK76 073` j{)ǟp7X?xuwa|qIZRtA"L05_~#/*sҾArķx+u$Sli,z;-rq nۛ_6&!pit=9tAF/$?e)!M}yv,cWjDAUgglj'p`+ FB.QҚxs_y)cRf2,Od[XѪ/^5Ii;=qvՑ (ޠ?򂽹Tm;.䲯 m'>}T xçC@zus:tUVzي oq{GEN}UL$iYȳh~&طcm@R05*t13a+Yc?$(%N_htLL1T,ѿA_V|<mPUha՝:ȮK==3dr|0k1pW0[n|!9~tAg 9+f<=i{jl &N!Q v,vvM_XR+A>`= KGx7_'v*aS$ke~j=ԯ\ |B^WۣG# *d=xYjua_G|C ;(XyA+kd$3/\o6vTZ0Qh7rg_7O|^/O7N/~]|>{/_..H<ǗݣAdPsy<{]"uts4S6`uՃ͓ɨd-(wS|-lI=N,䒲m]*e )=C|w; ; ; []N_C)0OG4LJ@<̼ ΂GY88Dj 0 i,]K'}ی_߆ 5Ho)>'לWӷ]@㎉;=ϧZkyЎ?[ÂMWhӂ|Ay-/~\`P%D?ʗuީ m1y56(78QBtۆL:#}֩E&;Z:(تM%N 8w3QA[,*zes]r?55|]!0a?BJbVu&OT~DKO4dE_[%2^+O'QY3 -&[^)֐5 PV9@m97Lem62O}!g5|$'6Yڳe=\@ 2UgCp1{F'ГOԱ|՟w:.bD ǰ~)4 ^rSއ\H[}/z< t"eՓ?~ tdR / '}IO10؜v 9mZOg+v1? bJ4%kBWBTu2;@n)[}#!Ho\d 6%iMwjߊ%>qm?ă%FR9.&̥F*kx oKtxݲ*.1L^qNa4P}̚{w 4N4JX/w>#?#,ci~p,1zBW~q1<{3S_zo$]w}} >3B,Diԫa3 5ޯ`eH9A/6F|ۭsKΉP8z]lߐ|vB~7'`Y % ugn^ey ɎKo; r׼_ <+¸R!a`0Bqzwe;S\9N.(IΡ-d&RVCD"ߠudx{^Ňx 5$4ʳ+Ufmg-ʓ,/x`ʱ,|: p5jŐ.[_U;kʪK4]e/j]!|%fwa)/q`)*l T}rCV]}蹠 |ͺUȄ r+sjkٳ81 #j^V?lwE+{ kʒ*a2[E(Al #e8w=8bCcƗe kmd)u'#Tm+N|47wFgڒK;g+ ؑHM! OZȎ۾Zo'W8SAAJG~HW>;K7}4%/KKuQ85Nl|"1n^zs:/UYʪ/J'P.оdV~B4g*/IWnOa_@xw۰=KG^+0Q /6%xʢ%P3_Z5`:)~ҬgIJJ3atŝ'c}KJ~ Џ!ZY]%ƶ-vtPOPW7(reVif@;Q.Sg>Is<,O ͵6zcR\ٓQ΃4 ?+҃Rie[t, dj%}{8g5ml/UOi^loؓ[=YMlsQڍEuTǔejk֥0ړW)*#LS^Q]E9Q|W d_EjKѾH&=`HI0gd_R˲\$GL5$٦IMaZt^GH@9;?7C_\x噓~n1ՁU]}G>&yTFסe[mgv(̜X.oZԹ=Ъ@ә$IslFhOydDtTg6@|Iꖝc UUR&Z)ɱǹK q# r)~))ӵ)fV}}üҦ:q<2f}9t#F˖3ıX{G \k-kuhnP: ձH^*S_%.&cb+~>ܪfxӖV ~m+>Oc-y}IӚ7.w@5Ȳ}oml={UK|1喼G}cx8`O_mGye;u>\qPϿ7o ?;;]ۧo~S'VF] 5Q\5o{>0.?\8Wa(2{.'a/vʪuJE5ױD""\2,O P0~?IgsQ[<)8NkWCŏxv,6~ݬ]xL_[ =vB,p e0:ou]ø8-Q@SӭopLe=eq'hk0ڳy06hpļK y0Jrmx 2ZіS(|(@3 G[*i6`nu~Uq*‡C-̔mvQl!ɷw{f1XyQ +'L< ܻ܀l>Y 6T1"_gNSf𐮓;+iWǟ3iˇ[R&4iN` >Ku=N ^=Rd3ȺB{80( אi`:Lu*dood>5)eq$x8m`P7mr嶶p@1lꫝڲc;ڬ+ sɳq~NpxO$J,ycyMI?nOUC{[Чt&θStZaH>9)6_z;X8lCyL6B}< *`|~c޼!t _qזy} Z8HKB8%^Um4qN(+]y~Ճ ~JUrz "I'ٔ =, M-_p񰎅)X_g{`lC9=Rr?4lO8ZhI_z]+g>ȕB0ɗq3G؂y$4es%a,ma=?ZG! @/is8pCO=gӅdUPX%?iXv(Ol*/<Ҧ)R`|KL+NH 91rSܲ. MdT%6Up"F,DMoyOCF]DZ~2V:NR#Cyf*S(K#x+E.4=W~ʞ:zKCyK{{L}kCY+Z" -dϦe * ]'cO3^Lsܖr2f}߂-؋Pne7܊zO0;q|5} +߁J>-BASdS6 GI'76o_O gr)}10XN86m0nbOGsd>n`_ꧪ H Ojª[uzE4ÿ'['JGu%*Or̝* WF ϳ'3;,#yYgE7pa!R~U~e~5a:(lv83*Xb0ueHDy&H`V~ܔnuHlв>]Ì W\j2 ^UqJmw#Bb'4Q~& {Ua:-YueLuu'~'{ᓗ8S4VOGB=uwC'p uF]Meü;Ȧݙ'42iG|)?鐜#Ce΄MI4<qp`,tmO;WnK;|*szCPï _6?~w>.+8|㫏Y]꟭Cw>utC -;7',?¾ ]`-kbd62uz,$`PC αcH&-.R(@/'04*rL*? =g&űσDTG~rq$+`&3 H̳,'|p ҃Ʉ}|ڶҕk*z'- ʔ>+HL,V|Bj1T.~ʗyocmqBr/}ZB z7hEGJӜS6I Yf[\]g3TW>--)௺F]qSև6uşVWĺkӇ.KqJ+ݍ:aO<4zpycSGdie)9i3a2I bأq;3M }A2`?"C[)'ɝxŽiTS ڽbX]z46'0_Bp2c 3|6?AGKvk>='%$: USjmnաP۵ir/o`9}eΟRZ֩`:v Nl!֡p1j=lsD؂ c(: Ѹ,;lml]TR6Ar[w!ȧUF1)@IDAT6l.yLoiu.?uO eSRi#M?ME'-8_c;/$=h<0̗|eSRyag,6m])2ho c, ߺu903ճF4ʅˣ;Nb_sYyx?~4/D-څ[3ݢ/`%6vѾ[W=I~J٤t[kodrCȲ/͂"g Op}2#:^ym=wHWEJ1l>B.MGx{>76]nشۦ{Lw**^tz|W4L̮o8sy6 Qy0[2u^]˹dqWkim|s>紗zӘ{if|=||ؘ> [&Evd}q֗;4mlEwD9"*> ν mn#3J>(oH] !KVqxVd =gϳU6\J&=5eНq)nc^Ⱥρ7X{t wxA+hY [{;HX}<~OrnuÙqh^G(k<dt]<ȩ5ozSz~? 2(Nxpwnk1~ua3Nx].D!){7}YЉU3\SAgX:WoҥOH3$dV'nLV|űa-D!}?+؟Œ>mMnľ ɑx7de΍01GKG>+Vڏ6ao9#{=*HL՟t=W=;0hk>GJGr=FҞ)-2_/ ay zl]60dO6 go|gi id'6_m9#O%ҷ3p" /v=L/ 1xs!bE嗇M3gfeG>[ RGQ: KUȥCKY|iy4\$B.mM`8g o{Ϊ|wJG;]lK{%G1^PX \B9o{kf}T,30)tU Rnd$#*RxG dk!xͯM3~vE.szye=׸o_≞ck ~UϥҫR{4/(wJK(SR$;VjChD7Zlm^Kc~T*Ȥs˦aW9孫*Ul611ㄏkZf0O_Ӣ~.C 7o^iKnԙpws&rnn&N rS֜M] h|s%/́7\zj-}C9n"aּ6O߄fSp!oۄԫoQ]Cxbj^+א{HiiOl"XsnO2,msyռq?;POMx"}ۺ Ogk7bMcY5?gw,_ { lKaK#.q-/"Q;Ա"ǃ,u<?}F.Q"_1~6g8އė볓Y~, N2;]~ CS?L']\ 🬯0י6 ^!}2P+۱ f^k :$M9|hjd?>DekGӱtp%~]mhEfL@Em & :pY?u[t\MqDnD㰾sqN,ˊkY]B]q#@<盎f wH .)rᏎ# +o>×:=f_mVo3[V$SH-·&GmjmT; !FA*X8$l`mR[JIЍS]ް#;Lء(AH/2I#[wp7$؏8זgraA^ek(<6`cEXֿ2H_`[ٚ.b ȏ&t0ma(ah{9Rp?z)sѝh0hzE! AF$Z: '^\.h4) MSXMυ/2ZMdvta >`F=z_kl:w◃aE\]ڴ/D=xQeE%pEZJ:ik]տK6q# fқJ$'a6v`yiT}H3M^U³@}f4:΅Cд+OBE`(~-X?UcPe F(=d6"s Nџ3咃Qؠ؂}]5:>n ,i*n[ M?.i@$k;>L4^}VIJ>DziG_eA+:H*ë<±/ދ,; %7|N'W)cɑNLn/ԃ}e9u/r`"q3pnu.c%VcCY =KfyL_z\JFjg  }']ݟԁ L ;,jL+Jumdd",G[^?ֹH\Xqј?Er;ir%TR9(.絴N=@[cɋ;̏y2:}Q5T%b~o29sJ6{N\#D0'7=bڷ=6vI,lU<sW v#ܬmf:La3 s]~x#[J̄Nց[D &\ I]q?5׼i͢٥~1 s2rle'-S}u泐K;WZovRuh^K=<Tȯmu<+mH8&46`jz="h Z{83YBS;Q.ȴ!R:2PYy "qx%|J ܮINpkKxA I2}/ymhprՉ E/w$n&<;cv \qtdO߹>ozO:|0wvˤҧ}[PmtdO jݮe'\u[Lr({U?Uab>XD:*hbz\oX##O21HCR.1ڨ/:O @/ T H&#6e{@IP8sc0)hgHgp}Z>:G%2:0tR>c;䄷L.* R[#C[}}byR70"ƺGG@}Y?>+:wl)C*EԺ*}γں">YS_}gӣӒi‰sy9q㟨o}O#+Fβ2\wRޢ*SmR:KԘV>iTrBɩ7)D'HPޟMWNQ 縝4bq:Wo V3SxaɸI",i +ɗی+H.Q7Gÿ?'?|" hFW˘_ڎ̇³T3wW{N/H'(|9?/ȺKRpUG5\[1[DbΰsJ6:uj`0Uˋs10aߌ 4洚f?GgSb2V5q,KWv^xm\ԑ vsc^yVA^7 VMrʬ;?^oK_l%Wv_<nk΅kri\ʗΛ¼;[[~n[pa պnUAeNaS19HDP 6s?anܛN\'ʫB+}EG#@u z : bSCy(N>t_z鹱<^=mR ] vyc`63M]tH[5uﵵuww3 g3봣)窍ME<--胹qSYzU_. yO5k<?YXhؖ VX`L8CnsD_ cuw9(?x)7A,~۝oρK?H'o47B?2>=F*rincvٹ̈́ HG9'\[pe |U BjSoN"p: ȗmS+յWVYD=dlT a}̗ؑr:_CVWS^v(:X i6tP;fm:Qii!{ŷ8mOo Kv'@c|@p o3??=vrx<-=x/^NnXN` =NG=٩tȨi e+ƣ2-A&NAUX.3%Z"#ā妊JJ3Qp%*;-AmCֱ DQbY1"p3}]h+0^7J>=ETAdsMb.c^$K:5?lJTğ@)dzҳcYzT>.9J.qgMMtɓ?g_ Xv_˥`%V,MBϨ keKzƤ˧/ >{M@QU37WvIw( c=\@A 2[<*B}+`|6U#\[ZZZ=ݔmJ " -S" eN9$Cڠ0H%6xuV&(m@T^M_{$bq)'tV)yFZ0ǵ2N8N]'_}In\Qwq:HXG5!L8t]Y,q3=]6PwOQaR PcI-"_j͜N Η|Ns7^e;S)BK/j9]"#ⴤjҰ^~J& 2 oprpvZǻ#a fsN*;`UW]+T0Kӥo]3 czyDfmdVzIWXv"9&4ξ=XƲ) ٦#1 ?q;vwcHCL1;G1( uzce;s`J0u>_5L~ kl3M&Z:Z};_~\p@ZRŸł56#~cK"U{$n<w&&Kv1O湢};~Va#?cxz5* _~Or!=u8 Ëf^ fj\eu]Sjg#nˌ ({*] uء Ĺ4=)>9gN8y*JK|tfS25B \yB ڋ$+7f<5$ $(/u`Vhv ,?<*[IBˉ%/ kyFiT2%ISn騁ZF5@|ӗl.N{r3 `%$N 6o` 2A~\9x9j!W{cʏ,cPAqc j.(C:6E 5 ym!߆VvEma\qn]U\c7 uf̧+t6w VR#-AvϡN%0pC|G[ v[_!,@_׮@7 T~*?Bpfi^K2ʬVU.u> ja\7؆_I%^Lh.Uf*\yltkEFVMGӶsCWN!~nk:v )ƀ|[jiʕ#6r^ϚE|m6eM=!c^fQġu٩kl[`|~'U 9zCWʳ3ŕg H/J][#+) 8|` 3[:.+Ń(E iګAJ.lBHK Qt=J̤n66tLвeB},N1au-WߗV]gJ+qx=p̙ =宗4o:}jPVW{m%rN!۶[2q!2'Ep a< g`GM##x= 9|oYl@r:nmyu&Wf]%rS:\/PR֙Z_w &ϰڂ=?C/ߦq.n' |ebQWӎEY([ x̸^o07kzvk۶oo9矾? ??>A2Յ>}x/cģoġS ñR?`!nE ic|2Dd}|.uǬ.nutB^?~cN؉?‡VωK~3+|A&/zofo{tJ(kg-͵9<٪8LTS:hwtS-aZG9&]n:TjoM9N`Rtn8[9t#0 EeroW o{p XVynU*o:*]Ehu uEAQJgAW 9] Bx;N8:6(}! g44rPv:ܘЁS|:@TOVCV,#ׅ>%\uN'5p?̾I?'hc~vg:Wo20gzL6$LL!:KMڲAu֧;{֫ ;yM]aIi[Tzl LV1 T_^-4|vvvw$!`+6.m8fDPrJ?y/~o~~Ķ;)sh=v!ۺ}g3u`-sc]6:c5KX!p@9¥&ՑU*-K?#-[ vje:q ,QQ{Gp)cin6l{HY''oL}c]A@uP[P/;LRևe5볂O+~g 9˙A)"!7“6O] c=C,LR%kY)&(P FVc׶6@tm`9%dS4TB>g;*lmy;Eױ#d@&QdܭUܧMLҩ -Xm$fԭTi)%Ͷ0uαm ^oMw֧6˿'e[\+F)AMhgZώa70[^pZb1Qrk/31Xf>v"V>d$#E\*m' 2x=ʐ'Y]uG eppO;\JgU Hz:Hu'Chpm[}ROz1Ӛ\Gjd=ǬӬe,6A#.샰s{YɬrFRS~P>i>clB|#[qS_Ocf/(.y.2˂ڔx k꼊#FCg58re7NX$Ue3eN4`yZ߿6@h|a W<5[J~'6 bGWS,E=ďmYu$RISOgO0"ʿf Y\Bn"49G^Uád[3v$⌗vܺ__T2:Mwb&*Jӗ('66BmH=u=gp~s7o}qsC4u1ݗ<~ȕzĸr]ݬ!dwC"aޭ\Ac6Ҕ>?˨'Rҟ}_SrT?,0]^F` pUdt9'x&":s.hM5m VO'k\QS1Jru:-Sry =* _9=c{Lkwpa2Mۜ#WڿڃO&zd_k<n?14WuyNӲh׳4a2הV j䧞g(]kJ2cXۇlr%]%Tidms4(r<[ңi֑DY3/6ޯK4ЦΚ_sʿyvXkC_Z駪ZmoU97ɛ6N?OzVhnzؘ;;D-.oU'"CX| 6jz_\,gQW{O0v"VI8hܲݠrv}KwokOL| cs"L #O?7 ݬ Ċ3VD?_,ܪ}81RO?v!,; *B&8,V"m]t]9?O(WM#5O44qOa젲 9D+(j!12+` 0,:]q۠Z`JNT9<8LL~/@,%)!exDNT^ g@-2GV(x ^$ kWcцunjԶ4r.\G$W>rzs&uܗ'9e. :;ЁZ6=؂6RۓGmv ?7'0ءuEt0j!BΓ|' >|u}6|8|k7hf> ܡ!Ґ]6le*?= v>:$XIF@ |=Q~xTa.,cB:J3*ݚHJT-ZZ {PF'cYl] |qr^L=ZNs6˜"(p_AMuOWYhyԵ eKFakeXW+oLXlWH/I 7 V|}+:Lf{ՂmWzQp;tF]$?v-'JTB}S{A JKxo//uTHQ7Oh{mPԻlߛ43d&_>%Kt/0 >z?v$/[̣ pDp LF!A-cun><v𚦞*3wmـoyVtoX5@38Gp.<- 5@lUȯFRu\'Qeu?|j}MK1)'苏)'{{*4Su[B~فMB<rd?ß|OѰc'6 ǘ;8o#ԓg2֛!&nnIl/ >NPQ>Ç"~z%D7_zo>Jһx>ұ’jMc?iOXKTo?ꉻi<ߏd(<)-KN֊wc4g0f``j?/׎(Vմz,_y e0f!p(=,qʫ2G9b|1U۴Iju,\|&m66c^Ϧ͏Y*g~ݰWNJ٤ ZŖuzi^@)_K]w9_ 5Ӗ.oz(Nek±5:4_3@IDATTƫsu.Z{WWmx U>7*A<pn=3f_^a,Ç4.??wä?A cv|5{oEߟ|>0g~l4q8aV"w$rqlʄ Iŏ++y`&{}gsd~/]K|A|@{|zQ~0M8s(VP޾#CV ([Nǟ&F͐fNɊih^" :'\c#UGE.xtВ|Ӕ

& 81 l`|@< nG?;:v-Ex rg.r໶y' ʺ5RWP1ok'ȳ$W=ub}'}&|yIֵNRW'picfV־ DC.w0Q18MAC٩pZwVÃzUd&}@'$ xw0bmhsRzW+ԫ[@ ^5_ y^|c{g7[lϊ-vpJ^^wbpZ7Gm$Xyo '5M:qg>mayPtPW08utѣR'a`rI/ʹ@Y9dg2IaW>P|,' '#m{CH,4ř4&kkS˨0>gx\WWG#\'xofU݈+X<;/).Jg^ݑ F0Ck;Kn N>Gz(E+xCB(^4?[7\'sX*Gᴨ{+/ʄ#RSW*UtVrDrW6ݵfYGK%:R1-h;VC"YIrPS6 VNqshQ:<@;:Z2ډ\S2-VF#phD%y'2xEs)lЭ+GWګp/o/!_ÔJU&㉔C`ud`VT [Ec댄t@ N9/<-!'IByU.˱ Eҝ+Fe+̨0H-*jQ()ofԁzU:dX,:;XAmsdN, VgsQd[yeEJtv(%/P~u_TAxie }'A n<_Ty)0V ˊ:wG2o"<`:"4bgis_F2Np,Vz _zѫ\q2ril'fg%xW'$چ8@-ckv7g5| /EYƂ&W.k[猽=;I(.r8dqrz yz 7Zz2YҤ:E=4!}Gl$WS^ғVPZpӿJE!0͟a:gՆeq~:_{H&YUֿ;'P'VBtSɫq{yuKR%:ύsLs_K=^֝ꬕ`Ss^4feL#F#[)>G fdq'4!&L.LNH]6CR=*ckl:Zn=3^ )t_|]Kۙ.󧜇 d0C|'GgˢU߄Wxn\?dcP3v?}ȧy0]coԡ3-g8>`h(O wYa=A`x&>pYG|gww.W;F>HCx_an:d"R檈S޳0l0_vE:4hYm!Lut~waҀ/YT`2[|n9+/Nۭ QJey Ht8T7ع 2NFv+~w`=e\㋴Ҡ~4xUVCk,!-QN \|w0 _>'zuﰏ B׾.w3dpܹ/[<.Z :NlH"M`z5# W4W(݅&HOЛƧ6*WGz{i8pŘ?5"gi+:/8RЦew ~VNj-\[ىnгUn 㐄R kp]1~y)%W&ɏ߳RѝtjvvB6Vl] ݕvV+wNǎI'%,d6{jRg'o=z܀M.vm"=Btw$̵<ۖa-E.[il x{χ?1|o?œ~ߥv7详+ \ȗ6vÖH@4ɻmmu)"9{l`ےo /0`5'WUXs {vFǁm>U@HvRyƈiBDS}Y3?p6|Lnd8%FgT&=r㡳%ݢKx2'wJ⽈ `؁'됖}Fȓ: 4NY+dAl1L E !2U<ȃS^!rP_ړiO:PV) ' 9}Ńg} ے#&G%•zy]Dg0{Dغ?)Wye_pT\ 'h^!#+8gFy7 ɇZxˋZj=e x+Yy=n}2&ͣ@jQ 3O ^A$նg g$;r`\1:؉g\ &JwF=)I]dr#o`C7ڡgcC;]!uhfh~3NB\xŅZE{tgQ ˀ:ͮ^"_첺ܶ;БC^z:xj/ϑ yN.qi-V#_Gu3j m*w(EA=Ĥlۙ9%R-I.]+E $Ϯx+};͜?ֻ֟{dIiy#2[I-i |#'_`l0 X#ZU}TU=y^SMs}DnM.oz_ٮh+j fLъw`8[0wew6{wᗟ+|=B!?LT!ۂ5Xuc׽I[Z 6UV/p z=޺mahck8.YSBF9*_Č4{K(xB1!cƱT\'}F6̏9;;# l76C6x_wWXg!a? T x3(dB;3D(w_`&4XxDK< k]SP|)>LZ`Đ2iR "?B 5wm jORxg C$igjk$+o$_CߧwkXx&hmHi$h,g$M<*Ydo.DZ㱺t ̬rF#|β܇:"YkM&*A< zE9mN:!σa1>wVTvO~ fuS;8>8KR,Dv9JgR>=LSq* Cdʃ2[ڎ_w pjw}rF8 gl3 +!h Q D7A]uv\ʉ3LOa;8(]0ʨܕ &ӶN/gv|L{xy&msF \`/OCxM?~0Oh nO 6'~oᰙqO݉iNxg5 lajN2FF)0v>/ *zkCGiX4ɇ0Q !r^icu¹WO"a_vr=";.@pa^2Z'O9ːҳBWJPN_T\!O/XGڥK{,a m7u٢I=)scMkҶڐcL iO u/k51+ݿ/,S>Y|2W%D_S#WS"ym(DݻPd=<}ȝpmQRw`l혇<vek$&$Mȱ?*uLW$}r!̽,2صV~T }I}Q?Im_{.LJF6*HPJ92 &\ .-z]AGms`uK7±=S0T&P+Kͨi}'n *EEJa\^Le +gav\+o.\Z1bt7/mnWEZ}"dx2T408UUmѭݔaI*쓑um[}mP_xQ妍Mۗw-{dYh9p6걲 L#B9ܼ9-0'Co)VlI|.{񢟿iǷqxv6{nbƋEayz;yݦgcvx;׀;`*ln?B$~/@ҳ{|N?G:z W>=,yx/~FgY)t7鄖U<1w_rsl,_Gy5xxgeo K垄8O>`E>I+oel|X&3]&baH=4艛8XW\e .e:ˌu'0gn}%w,Ow ĩ8PIeIuGt歆Do 1Ecj \!u wYK4?А?O=;Pm$t45Y;]Ø(ހDs" Ц 2DDueW,.әh#lP 9)$H9q hw9.s/tL#(+p=6PxHcQFrjjOxZDYe[:C@ag\d.I0C;&6+c6]R/ \B:D]l{5AS{k4Up3?bW?E.G3N__3P-CM֗y耧Y9ک(|!dmԅ.ܖ&M__ӷ}X/3)~~vv~\ ߄gW$&wk}ȧf^}|Gʦɠ3M]=! 8! #DJQ9M }oA~u;!h ~JJ?vK`ӏX^~|>y7d5 2[U&@MJce+eam= YǞ+$B/O@ nd?@3(hG\7Lȗ<[R&LV\^#L`,^ ¢,]J(WB dzAW'5v6v0==46Ts_%cI#tdZMx0L]êS=⬣8]r$y5hQ\ѯ}8[AƌB3߶rӿGjߙ9v>wPcO;|C`.@ɲlw=8Ye}cU~R6 38ijM)컔M7iWe Qv+Xp;B_~0P>O0TW- .GgŲ~JE+_H~nގ]no<-N:ǂǪ})dlB 9YG(smʬB/LڕH*J֋4F- URejWm,^%Mdy/{ܠz.bkl}_}UScWNum m(T/O9U0i;@y6ڮ%V{ rOY/!cy괽}EO:$Xi`J"H_9>HU=+ jL>\E߇sȗ:PV<Ё UmO KC=x_ZcN+wdP&ph)m:dЎyr`~x \36cJxA`OZ>}-fǾ@CP`5Jv6\p8Humd+E3un]5D- YGX76T8-T15rob!8O%HK?5oZ7z4|w[w٪Jp-NWuuP4c}ߤzd<[ck%m߶5ZNⶲMK<-[>d`qXL6e6ST^?įnP&c}.i R`rk- MzM2#{1H*mF3,j~نOp7Ʀwc>֨]k8T>_}Khm a(e{^3Wuy/2>D[eLja; y1kIڦ'/vO/q6OjxqAjy\%&3@Cޙ<$cE%yO/\Jm 7#/W.d\ o"G'?WyYl^ARAH8S+ 훟w֠AcLVi_D0&PEgٛ|{ɩGeL=IG]ܧ,K2l=ih_{M~49 ygvT˂35Ⱦ|=6Aq54mc>Rsˬk6FG6۾&h>|}-A<eҲ4ov2Y{j/OIƻ$=`!O.81q*4)FQ3Mpڠ2vKyH(0A 1J=2=z b#gKޕ}6B=Mz ^2 Do# %mG3Q*=yB9I`}{O{.MN8=O qg!oQ~Ǥymm{w_y?=gN4S3h 8\{:>vONgzI[Z. ts8kGό&x8(t(>+ |"3=/i/螝` ϶u ړ/pt% xG{1d{+i#Rd;, ㏦_2}?0}'7~̘9cz2a?^8'@h+ցTˇ9iO4{Mq ( :5'5 3M;p<݄2AI =eˆ\?;Fw"/J-i:t/Se+Z5+[`J0k$aRoTB ۢ)o{`LB6ڐ?] F/CdƷnhO$;|5WY D ~xl$H"ȵスITݪc)^Iv.숥vlF~mԩs^E&K+9!D4e&RC *w wQM(_&RnXa_C٭Sn-h+1TೃKY1 _̘*!J\G\|/QU,O ^!OVG*GΖ-rLO}WJ"lҕt>MrڂuU "ϸ8KhhlMuLdUB_#w:(C|RD[5#v#]g 5n𒆼bjƬ$PĮWxS.D<^U6/_$6_aP`-@^DIS۠l\XUK]\mC[3D=L$)OCy*z{~{ /vʸ}a˦S?+c2KO2mO~{^#ĉ]_}17ڰPN^YtͽV^2>u_B &hĻZ#o z}V>RX{'h9 /KAkd:]WLL3ނPnKgJl̲mٛ}r.ZdgAۦmsne7[:czIA7%enrEFEq,<, >oޑagjӥ3nDV;Q:3&6:w@Bv"_qmaiW]2K;c6ͽ3ڲ_Xq>pce] U.%WːU־_q8P6M_t{{ { ƙϯ#'a&fQ19Q[vۈhW*W&#ɮܼ1v_=(^eăwa,<ŗqs\{Ϥ0y35ݒ6vCx+W2备^ǚ H=&NfzzSͣ,~W9&,%? QE<"A ě\v)[@%г|/&!cw^@I)8!h#}`g3&1EpGf>q t)kclgMFC .u\ yDЙFٵxY;=b!W rgb9s1OPV6'[Lb&m#IR]x'L cπ Nˆq}a'2CpF"=3m:y7`\P}|#\ͲI4: Ll9%ki M+j#up=LT9e>%`Iq}=^p@R^Y;YЗ"b0  p~C5jUkz0QM7XN f&pPȡomr ~L?Q{CULs0`Id]sk.ϐ tgG'???~?~⏧_|c:x,~;rCd'KCBU~02ͭk=s3LO;.4m|.\Lja$B&Ξ]i&͙ÒG/%-ǜԅB=d wFzx_K,ujcAEsA &ԊõP  \>)'~Y{9viԩ,$aYڣV)*ͧ͜ND(Z>Q)=9UW ^^YJ.Joﱼ$ryP5U CLѓ+Gb+ ~+CK[A1 |ش?][hl-f 0mX! y. 1w\ n ΍Itt=ri! /WC,G1|Kkauԏ/>Ѵuw{L+' M__ӿ|P`kEĐn7 ]@j7 #Bpjf~R5~ ]j}8"2z.5Ȫ5"6Vހ_z J-q"tiT0 K9œ떸Gŷirѷ |DK #R*%|o6ˊZDr7nKKJ1ґ꣝75qye"T]2P4fI!'lсr4oZ~/8Q>hςn.u gD"4j:pd<>h wu;…6-MهZÎ9/:VX ,W vooY!?p҆ZwqFlo.<=mM-׆2=D[~*w 5}fMޥ A}w__΂_b|6}.WcK}UǟWv*2oz@W'/A'ĮwB1c#̚C/%C&Mgco.o8ԌU%fV1,90w<;Ua dAO3nrK^X3zɵ{gQ>_n,ɮkr_N /İ~OߍIAbΪ%<d8#Ay[lr%7hB2TZY{$L2pDMfn\` w bWe6 l& Na#Y gF N rs1K9 >9`R& aYf1 z(q1>cvA}gJ3kI_40o*s0A3N/i({ozcW 7:3= |G3ikWX'^{9!r(3$*Q$ ?cVN],bZ"ϛڑ)q1zOD=m?\2/.~ۓ]1R,`B?K"r! 0>: N;>Ϭc> `<>.Aϯ^i VPԄv;-^<.OP5kٙj/vv l%(ۡMVkQ 3ǵIcV ?j4]&w36'@6W.t9TIE.qLCu -L9:>؇=۽O$q6UH=@JCfum_|8~ŷ?l_/>}<}/?Y{Apf^^;I'^GZ=JbSie2|P'v`yamC xn=κecWJy1]?>سqk㜊?(XF+_~@Ԋ!n܌amm -8 A)n(fUdWvϱ߇D[\@|1@ [~yXr )5~/RYR_)*iXO6'|\qj;mTm9`54}K+isxrJ_PXm9C*OR'$*?nBCW)l*)vF?W_i߱+Qx-mCTI$ۆwapS|ov6JːQ\Wk%3= HBxOד'ǎ|T_YT Y7wn~7CiJ\ڍ97ŽA {Oa_u76yx^}$Rm{z@5FԘQ:KMd-}'(},Fux˿ m17J=P*zNbGO5{ BզiQkwDІϡo7m v >|\p6r'7yՄG ' @!>` cM!RlfOljK-6تO4 XZCK[h'lYenןl'!#?yS Ѵ ޗq>(}y4}|?,(.}[ܹ\dd%A}yd;:}EޫѶR Xʇ ʫ~$Yʖ ac [Mz_~ 9kB%CnoZ]2{>sޗ7e[]0iͻbSVz5MBΣmh-xLү^=׶q˅aղ^Jku6oڀ;%Rq V<دSqrQ㧾k?E$)9V/(Ԍa,v8+Б栫4Mܫqoj RӋ|!tƐr/`R/)r[\/1Ci %`dQ ҸĚ>UVǛu(l\dc/JQӒlP|.l7 Z|7"ru>j&Es[*6~>D7?B߆DrxgI0 f kv6UjL!V31+IćKw SU}aD%MlN`2gXN}ug<<-u"}nf LS#Ib?rX'|B'>o?+>M?Nc$SMp 3Z &iI 뿻&o襦&ү5q˞CT&!/UiJRpni!l}?ex@IDATu|1ɢ<(s :\ EGL$T]lIזwL!S_TbKR +;a$I|S3p?EPFV ~`z|4fR6^}s@m(ʑ*&n=]mRv<8n.Ŷp(zE>he4GY!)7SsCgtGyjJu'/z:'% [F,d#)ZEUh\.W~%> @IM߆]h%mBʵCs./5˽NjKxVvR΢8-_1AұdTzGw󁃌CfUŧLRsF !bpeqeE}ۺU^m|ڧfmG-e֧ϗ=cv)%\֎{lV&ջ~ ?4t;߬nc߳ qoEBuMIFsGod%xj!vAYP}k!#@)Kx ^՗{y=oZ8B{y46| b=ﲏ>$ϼH|UF}ߌpV~ChI{W'$]A1vi<2ɈmP wU.v:G4jdvN\!>mx%AHŤOP@;Kd2aZNC~4i;h*R~}ի'}d{ 8=IC0Ǧ>-|ll3;#U[Qwqpo_rDJ2}YB]}ȅ:G/O='g^E\Q1O`g= Mmpj>a;e0`sUW=3!#OBA .F`'^to=Yx>IKDxv9G"U9[`l/%7*Q})3(9*AvLLWPཉ%Ҏ)k}$}#Bd؋ؠEA | 'WV$y͸xDɨkj‘G.S|yA"yr]=W'S~uu'zT%Q1کv1 7W/I (}H,W|a#ͦ}Ji_6| :VoeNyV'0CNb( cO,̇5X ^3EW2.:+~`'j7(8M'|osl))JPڴҏS\[t[qZRa aZĘU ;;iFa\=D/sg0\vZ6B' t+}OW \hkxp*\ j]̵#~/C|0FnۗЇлlh[Ww!utӞ't cCss/C`~}ٴeKaDƵ;fTτ23tl!-ߨ<tz %wyQ>{+O5eqy={ʢV_AUێ V-}NQ L )kX{xfYL6(_8t8|Y6jY.uIgW+W1bGlhwy_ ދ----pM`5?z^_Lߺ8~G:g%FD(& Dbp⭣Xq!:rs򦿮1dU_pc*:18lM܈t; 긓:ĥT&W mHYGRVaƟ5%n/Ul0'Npk-fv2$ DΙȗFpgQ& ,lP`Xoʃ!y0& ;K5 DZMfm q&3٣9K }ws&'Q޵1ᥨcِIsZ3اl0 ژng+瞙|c6:l wcBz'᫭߇]2@{=6vxU r(gO%*`O;V-S6RvzzDvLZi 9(E w9`4Cm֧Mٜ1n__p3N$+K&WyE>4ş`4{H@VS9z@9ЉCWvS{"!cG/!\& B҆v~zp\V\%Ү&O"%L(`ihs} tNn2_7: ۬e5Ѷ@p`y8SL̲7t YbD{''NOxN?ϧ}G&#H)=Ṫ\nAeٷ=fP/@[ſQȌ iːx(c]g&;,3R'?HZS'ԣFm){J6-YnQ3M{-LK@L%,m,WAֈ^[K'G ez8 -eSڗ7͸7rjC> =vx=(^gA&Z+, a=ꔧJj3^.Pz}?s e͒J{M_=z{J̣W $-Wq\/n,Wl9k,v넰c@OxW$?詓jIT]"h~,? xAsZ(n?@>.Ine"B}$>=\S\[D)'Ē0>@xVKWό-A'²mOYrOnt|tn εX>ĉP??ڰ~c=w_rrٰF` V,~:ݠMrMůw3Pj aD)8W:- >ZX]q:\p˽%{---تҭ$L~YBㅊ i_ NVyutQmTiԳnJ}NmBحc)ݲ2߳Hÿ2˨g5kvJ 鶽اGJ'90d]-_ַ=hTu~/֠ҩ1 6TPVx/g~r]*@(k8jT_3Z)XK؆vP6)6ŷmYm AyFyXMKɰMFhS,dWU}eGU-uM;އހ >(X }@-#yӄ]^ܭrU r-yF Oy*Sx.|娣ӆ۶C6ݾвg^$L?fmħqcXy=)ev13{Ŧ|[x<() 54]5 (򹔣mrk\w&:ɜn?΁l{$/X2~smMr&/5.IDxkYgg96ϯc&F&gf9.#9O32b)pO[/Cvh&c_h%8j]pu:Aljg'޶@i]d7O!w "mHQskI@{ܟ}WX&1ݾg3/h?`/yA[Bж=vpn |~z KfOMp`gzO_@sW "zlmYD u[ $ql&}mՇL'6cOp)kpIsP~$NO'f\Ԧn/Q~^ėv2Y4 ,s O3Pgh?i~H2XTtS'L8g;WYEsƘP*<rrxӿ诧orϧO>$/x_G )=rfU6aΔ'3Bb7}WxƹrMRo{RW ,9B+zk;=/uvtxۺS^3}<̦ce>v#q0 ^>==`v=}MW_zG*K]Ij}6cFLY$αGUZN]]F\ڵi:}d9l"bB:ϗrmvwQRiݧ+,o]!C)(Vg:j}3jK( o o4l l՚򹮪n8-U{AK(\瘯_da%ζmK>v}n #5fiߦ>YMlYDZzzYm96s 'ͲVnٶyW%;L_o)ZО"_{xoZ1㿷S,0 |*awʸN0;L_l_h\7Wd w7DIE: 7$ "~> -c^N yꑏ^ˈ'S4T2 شzDL"䬔xX%/!+c4zW6 HN\!0> ReYfk')dIAX4A;_&y1}|oN?_d'}w:}jkӁ`_q#?m=U{sb`b kyXG!#kJT)Rm_I(dhVn}H0EKxe n(ZȦx~T?u-l)(ۚPƪt*.|Ŵ/)p'< lqh+}@PQ&(93cɷ!Ci7t\")@EEa-Di[?唯,/M5+Ϊ oؓe)SWe,G4r(ueb16 b)rtJ~u eU1!t0P(Q@oDHFe]_hވ5V\7+oM؄LaF9rA;pk?*0"~y+cKJQj+U5 8wC*ҪQKn$WM-Mnc+ۮy5h+%2eײ!o]d.9'ݴѥٰ1F OppNsRNXKoF]6M]OY7| *{?(ԶUB8gm"O31 mJ2Ws} _y27F}Txnc۲iJSN Zz-c82SyJ;\Jk7Džt~md$&xLE#ڥ9&=, 8xOEq2w`#{ ҳny 4OYf%wĵm0`u4\! r,=>A􁚉 gPWe6dl&ȭ[,C[Yk-!o}AN֥kI1\š(4di41khnʴLyL Ϳ6b/ۇbˇh%ް !kw^Cv_@`GXݜ``ƘUwjvx1._kͲ~S0sI'CK=C?yccʉLF0X ]5;TO\ؙAQgթSG*Bjysjµ19c8e\tVI`2~?e$_|_j҄.l!jw$t &/\6ƾΙX*;DRnw;Y]Hz8ׄ*l4uXxgn ɬ`d94&552dV:I"eπv~Hs,ٗ&d.8: 7 G8 @Xl$b3覃esT$|Ҹ Uv$ݔs)eS4m޶Lolʡc2s*$*M\Sbwo+v0pe7]:F|lcNiHvo,-56!>ȑv63i>.bP҉TG.,$7l6a)C%nmm/eR_t7rvYyy{^}h'#`2@b#1uwb#~>4F#y}:G |>35gK/tt>ءΞDM;e"(FĖ6=BigMjs@~;W,C)v̌g"Qt~sȪ8o f/X'/^9 ~џMhzn/N?_SFw$mGDf6e -6hAC%]9~a 馵6& tnԋ&%ֆ7]9%#nwRf{eh'1%.y>kM9O‹}`\]<,[SεeF s}1a;-vq~'N n%e$ޟ+f"j6ze]TRY9VO=6n[]bAx oJj[J&coU[o=Vx%aQ6ig죭qlҧ!"'0^ųN`mO(V[~w~l9.O}!EůKlˊ9S<"tg_Ÿohka ʾ Yul'4⛕.DB䎀ʠ¨?Խ2K3߅ݫN?nZ/Vѵ-oXװWlǀ.WVE]mbIWV7^oЅ8޶9!r-g!6V}#u"7}WP$/")TP%~{/x9>\RFŲoIPZ|އjRyhCU}v#ۋ>lFlCTg%,9Oz/,L](df]>g0aܛjSLd+?MZld,|)\-2x޿G&R0l9ui^2lc!LdL ~kMo_'.{!#Koǽmu/Cq<C4=+[X9RvSWwVqFHVִe]oe͛ܘG#oQ"oEòOK,/iYqi0X4˦셽<ۄ_y|fB>=s{I_3zφ3 gy/:ֈ _[ָyYf>0TȰ,O{43yJNs kgQ_:\^ԏ9 g\WkYPKO퇝-7u!w8oBykva,i̲-:ր7)~ OYq.}Hu Ԓ%o}^wZOu-#y;S~+wuXV?IzHgCP8m+7<[w}.9PmE|v>T z*rl4'Ɖa}Ā~G)ceq3ɑ 7G"i3Z6o$k[;NtXF\_blƫF!î%E~چdoNNfs^r}A0> ;$j"adbp'?W ۿoB.腾6d dÈa $7Qq2C A@:&M 斋w5o! 4vk)_į˱fktKcpD%0TƼK<@qBB>z`/ϏMT$-+ 9'QcidDvU5Mhl, N8n6@ޱ]tFjl<&k2NQx"If&8I%2:eu/87EYb@>IlS B~ 9x 8lSq#𱬜s&7~#֙0o"gVv{^qpg#d!ob7+ xׯ (~2Ykiޒ:A2`>y:;woLuvG Kcc lY?Lv}7 SZUE[v&gU(jj ~L"Ʌtz}{˞:>c>6`7A=rq=*s~ _JLZ5Y7t}A#t״KKS]gu9RD=PI||@rq~wצ?`6o'ӯ>~˃v:)* fl5y /;US9n59:%96Z(L~p_-?2=lPРا=YK u\^} ,{ԋ_)DFБI+1Q$ Lt ;8C?եȃ7J+_o9R4Wcl CO( IɯPP kw/[[3A 'q&W-}07&!'vW&7oWyq!=YݕY^0~<>H*ˡQpG?-܃ |LV2--w]:w\.`+W>}C m!i{Eؿ+;8e3:\Nigl^gnA=n rٯ:G?Q$ c+e\ּ>҄iS/9.nG"7;޴f0OYf!c 6x v|Ы=*X~~F7'!FiȷnڕWwMyV݃^U}21`j^#vJ2BqW{8lU[tl+rmqr< z<oj(_:EA :ztL}jsU>.ad4B+j]a}[s,_w)^ȽKCm}W2=Q c (;vJ]WՍz}N_d }ԩ=rk}?r&+ZIJ\BP}ipS4ʭ7#e1\W0[l7jrxuu*u^՘Ti8iբQW*COCdġ~N&A[J'0]_}pٶKfIǺjh0G~ a[Q]7~^!DdaȩҦyvڢ[_pQʵ8U CjD9ٔDФ}jF5]u SJ~XåEv[.2>˓[Kòݶo;OG`n  yl$gYY_=ǥ4iCk&qg]d0_/[n=8;Cg$ AAPN>&//E}L [6e|&}M*CH"8lQyl,9N'_i߾;pǤ6/V7)z)9}W.v$ӺǂQfN&pMț1tyYuod6r$ .KyMH z9(ly|q96#1aUO[vNu|&.);dvUW 7X:Nf=qoeavI"K9NWg{_3C@.Ǭp`e|k2(p6ϼwʗY&m>ʥ}}M\T (Ku@2qCtiZU?;,woОd~OQDpK_ܽAOe~&Ћ"?Lֶe&v}D "W ,Cr3&WO! !y}ĖeGO=WߛhL?ſ?ͧ:c3}+x;:`DBŸL XGkzTZ-6 棴 سIK6dcP\Ɩe1dυ4*OBBN¿deeҲƞ"ϐhI-NB~ i{Gl@#&[l[Y_*5*i@ rj<@Eg<hQlHd$3XڧbB6sy:+=A809X{AGTja+`M\@YrA% 7g!mSMaS\9c,V2l^_!݋G\8M7%|Mmk7OaDa MU~P4J{ N*˭'H=eQʕY"Uo$J7A+8[L\8e_b9a;ƿ(.쵃E~N6.JX~%K%nhncN%l&ނylI:p7jt\aKS^euɮVr+zl?k,Wg΅Sh FbSWr?ӉP7L̆_]hWZ.x $IYyϬݙGH&ICD bs gz~?f]όpscf=13ϵ:c=5 xH jrzǎl?r)y&"+@4hf)i\7wd+{6ge`h/m@;V&*ўnxF7r>3Y-1+-JL:| 'G9c*iMWWp*zg.|~RRVe7kcء;B(?}Nʙ}xybjVc;w9 -i]P}]>ԃ0V)5C;fEg˓yvlG@*2*{2FXWlu—&uIӮEl—xiȫvP:ޖ.sJ)l[*;z1šWZ\a=tO_V71‰ h.b^ 1XeXf3g.Idu{\/#Y)Bn^%F@IDATʜ!hU&Q4{ڒ w \HSe6tО7^7D,o4-UF{le.Fezķ$i24¬s/㛩&cBi-_\#ZS5d0yP? }Uۤ7oKc#?6z MƣOǼ?Xۢwj;;?#4g^ۋ/u\$Wx^м$g}*:7Ħ[7"$xqľwW[_b$(Ɨ%^|\аI:uGQ_N~? Z*.tSeK_~SնQ &V P<WF yn7H=N%DD]AXW;+.ūs0%lMZ!]ŪcFn@γ8!7P[UV> ,Ӂ.JAjU{cU0V~7ixծBsxq !>AlNZg~yxNO2|@Z@I?'XMQVDOygjK5*m\ը.xvlcm+cΕﮜO=HvlO=k#l)}$1H[h2ѩ2wcpRKGCvwv8 B2Nɯ@{(=:f ^aS5i6:5A ˓Z'[&ϳSA1c'l6 M}ń @v*a'Iwwp,m}y_w),nxtw6Hoo'~{~b ?/_m1X{qu5 :ͪ8gہ-\Q~xcT'R吮4ѝVWs ħCvDW%k9_;吠lDїƒN g:K@WǣZ_ ke/2V'>7GԗχY?Yeg_w9V5Q~*xq"6hyZ Rd|tA3M*Jȡ}<|^᭓rOE`m +{Cs}W$É2J> g=Lw9OF`ך=~4khTڠg<[ߣ0NcGؿLLzV5-^?d_u|˲|YYE-3\>!Vb#\`fa~Ꭼp7Op GvVhnCvd,38FC%g&K,8%\#F]eA3'‘U\>4\?Zm߻ H'r5y59g~[}tb>cJޤX6Y6?\6­KyκoM<5~z]C&s[&A'Y.[}toO7ӷG҇9}}T'_k_ڟ?IM˻ՅƏh{x\l.%IgP}3Ƈd91:doҟp ~}2Ļ\d_qf.15>|"V/}z'VZ<@:Dj7" Jn13/%}~ГW^[Am0␕ <(z@/A.>:PiW~tF ~JrW <7R3  l7Dpl [zOTE^n*Օz]e?1HYt%-kcZZr*m {x.[s %c-7S4N?W[U'KqóķAx^#)|(Ns-ɓw MGlI?!(/C&r˧ENW{9tDX~G_N}.ĥn|N2SDVkKc{՟lW v6^y҆%;+/-m &-3@~|| $Y'C$ϻܱ?;?]>ť ~QԘBd϶senWwqFgWQ`qMzzaA ! :ձj-cv8\6B`pe0"Y+yYnc/_d;49]F&I$bQЏkG\K&_)@-5x! `sxt6尞iϳ٩P2ԮV? nC+ Wמ +ƝxmEw(p%5N8.jW=zG b9K苝O?lh?\Ob1cӆGo@][ex`h= DjʵU/#80ki`Л U|i*;ҁ3tNz!DM =Zfp$=tW'Wv/>2 D%eOߡȋ<~.g&4,ße 96QO]gɥLٛN piZoYEH%ql p 〓<َ#iѮa^ښ|X'.ܯcRS+y 't+m`Ӂhk9x2۰gXU@ٺmUGoE?t&P;ʶ҃cd ]~1Ծ̓7gA.t|36\ʷLEvYeKh<2D9:X!nJu[YռY RLjg{|}ERDQC^} ذ-=cbd8{Yd7MI":lgrM2|$D%y^c˧G[xsL}$By!1 XH+ы;hgU'U,Yb9GbsSm~*g;ԕ|} ###n_QK%mО 0Pf";07ETŠ~cr' *o@|ɐq 21-@G];>ڿ0NpL[>|> vj/ߠy:0~,ſ9$2WP?|8IP>W$̲uM{gR"8ԗ e\|B٦uQn!TphOiqYOݎǔ6&D(dʚӟSNdGw<ړ|EƇ0$w)fï;,Tr;cƼMDZ~_6Ӳ=q$[_.E̺Ch8=T̑pĵn^-mjRB F$cTUؕvI\7M;G;,Uw({=uC@.CO'PEGu:.lhNg)'\[Ba+]NNQ#MXo|$.0f܁2\"Gᆬ X~,;//uT{yԛhca^^&Xt7 K{ޒ6Dxn˛ߤ|9 ocY.7Jm#wD;b>_W;JeA{x/e }b!(K'~7(>Ҿ8kk|2`M|}W 31^}[? W9~;̟\9rWq2u02 uA<+"ttő!3W  \c8[vݖg}Wbks@h>$=d‚.'%S>?:WgPUF% 6sX-7ק+ ^uw_i_Cwfsż^ԃ+s\ )/ف@#o_qNKW{3qSO~u'bT@k P%l[=9Q`jH^;Wu7hY] gńw?mmwِY}"@vCtvV  M#8Ǔ ҃u*G' 4ԧ OZ޾MuzSʵu:XcMmIX]9Ib"3q~+n9 eKrn'~uF/Mi3ʣ*LN(-iK5r> xTҕ# ENOgU+-b` ţP}m&: FO KqzN #* F^uRr_/ +tj ? !-+ c~uMNM[i&mfLDl^c/5V8^&-Њ|ny)yɕb',qXs2@Cgh%p,BLSlVc\Tۖ$z-TSmV"=+ H R?h#~ml.BحR̆7Ď0+p/d7}Jrg %k,m P5,WR)^x$\o/gvWØ?8еwPŦ.%. Ro[*Ͽho/~3KG&8wy\㫜_/$LCwN0|NHބ;ǜ6eǀ3xoA ?XV3]u=MMR0u Iu"{B qxݺzS<(!ݫ^.5PY~|Gh|F䭶Asx/:(GV+Ngtiw؝3WUmRK\ɋ߽iϚx"omV&vӔtvV>7_`?l L2uknU:jxeZYah^Aׁggt^'mhrA) (cIKM8M;I~UJG밭ɓ:Z1ߏ;zA{ecC͡c8gr }ڛ;JE߶< ǖTmYpic5\s48SL‡FSuh9%SR¡D!'q~!;6NO 2K~N]YO]tՏN Aoft\ /]ř@GFxTrkaLz::~9x?' mR~șNS&9"A~tdT*{))"z*rn=}X{^QJ gBihgl?8[ׅzEY)(2(׆ޝ%īiտ?gY힕SkOUWR@gOc_O_'1ŷNõ./Q^oAޛ7=o6o~,cx,}5N8%.`gHJgu~6W+nz6{s[~+c`߶G6?ۤi$C*M_קȾᄋ|qyN ^$ňGk|sc.y72tAl9E0%i;V".J>+_'չ@V~?t7@Jb:"}W^(# 4 ,Z xPǺG( e`^%V_`hepf+?}6ElJtk Tq\:Fkx]z6wjtߖ48xG\}ۘ˧Ƹ*W''ՠȣ[[g[0vzCZנ % ^ativN=\/u Vʳ2ڀwvL ^ͥ-ՃҐ}xVS8Eu ɬ>]" <2  `)wz@wCε[ǹ _tU>'о)r;@{Ok+!}tG5ukKNn '̠/#؇ui|:)AkW>wNmP3*WP7~wgŭG ܲswkYjvT (Ac_} /W1'a q{*zܪ}0nۧo}Zh_-~϶_<WgQDbh-g޴7pq7tSA/s~~_U@B G!S}()&׃2O:WYVun?x5?:sܛ6jp:; d,)AʒIn`}2 5/pZ|'/{(>Ryv*3~A[crC"곜wN!=Dš>Iz:RpڦjLR ;T}0H>[h,P8ɪOˑ^QfcL*ƲIں5Bƕ<2}4ωNV2xcfpǑnwپ:Cf`xO NH8?A nqt [ؗג h Պt%mVJJ}#Múl&[r|n[5' e|n l+xL_M<ͽx@Ǵ|YVz*c7d둱̕yS^kCkl7*s&xfDGek@>Z!8f^[3mbƎ[$)ΔKgy_媉iؿus\9C`}wk[+t* cDWL0ie/Gv|S5L_zy/1æ2/+vq}nuO;sodfA'Ҽ>EǠ:c2#b5~ \. .g,[r R/فg j@7@/<:=3(iwgVG>Tc%8SS C Jx4+ ?B}:V¼aMV_~L'I%YUXyYtzOQ̳qSԐ!&^'%oapu[ؚfl ]y#au?ɣiqwZ% ( 9u']i J7r(݃q{UԟIԏ)U9r>?Ck{u}MI#OC6fp_ z,j{lzm+?x%#!}_L>葉:#)׺;zGyXMH<{SZr݋|~,}h{l}އY_,U.} !, !<_#$ k}ܺy}0s>{|>wS2GrAW{RA.U: rYtƁA@p,%ʮhw8 a 1+oQ*RBӐ34aClDvhYaP=ePS&n>+!7!ch+)1TKl"'Xռ||J_@tn=py(ܚ])Aq-԰\ v[xW+wƶ -q:tqWwxG:B]_@tRQ-lo?/>'>[с_Ed} 0]ϒ J_Ŧ0AG:<%qe\Ğ@HuYErTa=˧<=03q[['#6X c\yoixt5C,R'nUmhk?'pwN6 23>oɛ{>: 0"Ɏԕ&n ŏ?Z7,|@>߹kextEU}kMɠ +4ѷ?yzc{6>C_UpM:Ўmz}<홪UuwԘR{dȲoXM6W3!+^a{_-C|Nys In|O R]/"u|xbN݆ҩfRFiz9;1- `1̄_Cرƺw83W @q?hL /DmH&%#s٘7-ijmms##uO)R?+V@g߫9_Aс2 Ve*T>>AgOcg]ߗ!Ncolc߇k]^-?̃7-׮}gOK]>߇g]~8qg:%uϼcἕ.V>h8n<ƾ>& L#&_Pn*Ҽ>EGe}+FwoX)::eW2eM/{#>@ huJ0Z6DxR3 u8nqWp,:C߉~ IGq>~Wд.>9h\21i+_CgGYg $\je}u6P3ˀD$+e\]m;0,mAPN)mpS'YF%%gl-֬WUr'0 VW7l@83(51J +V5Xy  Y}ʻuz(ޗ_Cэ'\Ó'sk1ױ q-)#,ۏ#OU5q_.A8#wQ6sw=;aa|a9N&hv~>lq\2>p;tav%^Qeq"Cޫ}asg5UUĮ`@PL& f#zw4 AM{O%&(m9]W^>LMhj+l9:0]M+A C/jǭaiLpOթ ikWdB[۝ՋO?,-~*kL|P[X1=G9m|M\WFa"K#صM%[*^xyN^lހA-=|h7P Q4DuNmܕ+6[͊[ii+`+]oX.k U}/~x)Tw1b;;t4m&Dy]&iSY*V-j`ߣ˟g)u-:r)![Ap2F9d vjs' tYeH7> b!R=ˀޣ|@.| Tc$MoZ9 (*Ow Df p-9~uQy'r֓I)0.x9^ȷ6NeMVUݣڨTwZ``_M`}daBb)VJ urPU$;8BECJn\Fv:_^}|d>F6K}͗wrOfyz666iLp^sOE^<;vPݕGs_LxaSxěQ%GpuZ3'¶ro+LBSؖ *'X' e;(<ȑq׌st cc{>^] 2.`]QqJY6h5P m\ŭ|^̾NnhPcF׆+jѮ3OLf;V`W/^;N" 1r{g&-R>;*XTE f`"|T_YR#W۾+].4^eA L(ptw 7k+[?^ۿX׈x_W_{N3|3nv{y>+<@箺]0~ԗ8<#fsY?LT*_P͟/"rkqڈ0VGH[ PW:j;@Gqf/Q1x.K*_+NQiA 3ɰ/N t>s! j%NJARR?KCZ#{ӆu9:輦n+ǼywK?ÊXGz&J`HA~lDz%QWuX]|͈Ϯ~oN oevNPbX(`gqW?||d5tymy 1IǖD%ôxxgY;𹟀8e O* 3,\VFW}u 6ٗu&+fX*mqͣj@~x+N薩N]?f͋Q@ӑ2E4dCݤMZ摱sWhI_gcߌגGEϐ~,ognzJOUY'zZYz\+\tZ\Sd*[6p ~似w׿Czڗλ̹aŇ56cL?Dzuc:^C;bXD7[DbFbnOF~ڐ`.6Їn8-.3IWGOT+Q#wVWqGv".T0<2~G~{^MZR 4 n?w+no2iePγH"`@*_V i6Ф\}ނn㭃: b\{GQ+Gm:T MgN@IDAT>n mCdo$7(X]\g\mlÔqkp6gegr S.$hCtEÝӖD T~W8ůo/g.>Z[\'As>t` -oR mY5 6`pzoڂ'I,ixT#0?C*`~3iz' _NꔪPVO}z;:Rj? 5>kr hI9=ʳ<;ͩ 'ݟd<֑.r`_ؔҔOg~.5  2l[v=r-cx~!$QfpO~q(6v>vH''vw"@vATCg!m?'&LeOWʋtL҅M,V/-ocIp<^6Rȯ.<,ȿ4`AסU6Hv&K~ @gSvXE[VdγtҖKy(kd\^1дRoj,/h̀i6mi*kC1e/cArKvaZފXp}%: zpu"M+mGvkUa喓W =sliy#$) -#IJqi+1taOo]RtyC8a[ᨫnǜJ[jW]ޘ^ŽPhrjpW2Bp,'}Ńib_l`.GczN'&3^Ic@+&pc's~ސ1 ۛu8b5sJ43|F豴g7ҞYFEc͝~z8[xS[{,6obM+:e !⡲uz~,:2'_0pwLq*|C8IHA\@Pϱ>Eo#֑u{ĺƟ|"w}G񝐗exq2}?p&e{v+ύGOUp!fv/A4o?OCRս8A(a{Se)S0HÚBql2A1>L7 (]YyJmJ3ʭQv┘BԮyqt` ߃ HV/eSUu<$'Y3΀ɗ/"8>aVǕ+A*Um/ѣfcO> P}0Wzj5AAҮO/lM耆/ &4 (Ǡ13>:xFgmg׮&j0Wשj|&!f5fU$mcULY^A]K#J;vdNLb)k9M #M^nJyE#ʘ;"Vnٞ2&GnӸV/_;q,Got} s^t_ q0L2L۞zvm'ghG2'nvy$[|{%$Q (s$ 3gȋN`+umjdHԁ&mYugw %i&!|FF9ؾؕ  ~*<dwY >2:"o-G?Zdg?[>9|#+C\+g0 :CR\[qrJ𓭇mUxtemzQoU%kuHk/~XS~S ⍭%O`)[G3!4 หW>>/qe>y $OWdQ*ŸlP]ΒN&-ܚϟ|ӯGU. ҨdL]Ȇv5;r2iD6ueJbtoHr-> Ur4,_YA=xH<'%B\:r%? Q ؠcvMK:f1&;n#alH=rk xТ҆;E 7= ؈ݥtdKZX8@Bi p.>8{?c,a\=:O2W6aVFFl)B'  '5A6mڞ*zvc. 9:,(6JLCOiTe/hZ){ErQ:B.&9T ΃vҀiB7q54u#pQY+ڕ{qJk_h9ԓ=pAOV[$_>$ g!lgbk#>Tп/vzuCYErk 'э6~b y6B7ЫԨ+c⧋ŕϦ<7ǚ й﷊/r8UFv=@{v'x=mxMCΚXLYdJC/-y^$?܅eUB3D8'x.G k@Gg/F󺄞+ (S9|ܑV%͹&uNWL 㹏?vV,Q^cy])nҢ:j9wN&2XDUͽ ?eutG9ϭhwOzN}0ss*}f0e=햂| y;7#w_7}ue%%K7`zH%ʇF6gֶmlhEa]w]+Mm]7MiwELDz~S?$?4V7 e0`ty\+r3{]sl(\: +qH&+]\OxY]|evg]n ?uDIKȊx깥;8ZEQ^\匴Ix6iCHw1WN>}j-lP%h8tmV7yKZ94eG2 ߾<n5ˬjVǮj׉Wn?sAsJ(nZ++Kчmi gkTt"# oGchHbaW;q\!t 2f@ZK@m$+ ^W`yF܊ m#2; /++Rp:+㶱Apwe(NRo:yWƶuu"y'61p`.j3gb|ݷ[؂}~sȄ WmW]RY(ii廝[R,^qkL[DȴVLEcd<um^ئ&^_yd 2P[|%U cbW*|ԛxe3y@ȲM/Y`RI m<1/9XE!DS\9s遥U[ݠ{d0#iWb'?UnN{Z/yl3oSӰs2[P1La./|f30.vWʭuD'_zcpf[/ApȏͶbr|]'3FGW6VgpB%6en$Ϝ>ȳGf*>8?^ e;jUfSyfv%uZkLsveD/ dY./Mx +| wT` Onc.гr#9 cƒĨ\^®f:zc9vm,GݹZϞLQ6.lDZnѹ*ضpKvW˧7 CVrNWߪ/F\/U=|9?vA2"Xw[]}˯^_%38M9y n;h o7mP`k cҰSOh7*nWnxm  ~6k%}(Av+[}J>C~]^E̘pBPjhCAu>Ahiû<g1<:[SVpyr- '} гU09ޥ} ;_bgx՟ŗ|3V9;cJʂ Pw?W5%;myeJAKYVq *}Ѻ8uH[?޺΍iC`4ē흑7%h*V +ͨƂ"wd dd.LM7yP JS1p<){RI-k:Z !kJFz[UD˼`cc㷺 cqK( xHQ-@`b2*<6KH;:;:~x/ɯP٦r'0?G7|OTQMR m=C R hKY],˿|y=>myڋ|v&yl~n+)T|8hƀie-(=N"oKd^omVx;z񒓺Uܟ3}lǠ TĀ,?ݱ DY٤e vU.B#ͮKy&p*)#3tY{óh?ۭiCC=$pIs%|*T=)[u?U;TK%> Oc|B&TњHj2pR_G]qR/ڟc(Gȱk]fadHiEC&< ~څt lDMǫ܍g&ud ڣ:K%IG1-:繘gA%WyBbo"@o=^0V_َc )Vѵ^M/L2 mvl0k~FӓK~yPö-7C1-7e2䷊|GtiucyYВapt!+ɞ??+`ϛޤ-Ń^s"=OyEQ*})P-O8+tKZXI;/9):O$ @iv1,:kvd]҆GxT͎S<_ׁMYg:ݎ`LD?<E' 'tݛ;ⶌ qT(8F^,+| F=Jy釩S3 q2u~4h^_{1C6'54\,.$s~ fGlʮ[t,aW?_VWa5+ a/WɸeaVQ4A;/: Dʈ]aco@LJ\GPJ8u(Dt)3]aQNSj*Q긲! p֪@GU3 dVJdVFg_w66N3҆퀂3t nkK7[EÛBK=uʶaw 7k'(~ ^] EO:j:zn% િ8e]̮D0ҷ.ХxtO}gHW,æKAçO5FdžNSiPT'gi;%ߕ:bpjWȣhҲ] v%܆ۭ zqx^tOʓ@}:]UZS(훝O0~xWgdAd#pF0g+v._-AnƦ\Imw`z@`YE@l7Nΰ{t@Ȓձ6wIPFsV50:Pm^3ܪ<+)wS<dI ĦM\qjpxqN`{<[oC+z~. =>dHLHy MW]fNp=3Kx78nqvdK w =b?:?;f@:_$cŖQ"`;hWL[Ln*t'_⧟O?[?gJ]G}‡ [B_!aCBBL'+},ʩ>c+ d w` )+G9"ei{bTlyi UX6BX@> ,9*H8*`ꥭ>i;뒂YTpft'eb1=WJ1t&S@%ШC*,V& K'.;z56 ޯ:Mxԇ @ >b{zvM |Ҳsd})J.6]c4*Y[[]^J%x_QGmrR@? akɏLe(¢?>h@ dv^ѧkDr{˽ dmb;CH@Ͳ|,-m)4mV@Kvr|VА&<eL*pRJ' hh!8{''σL&S>( !=\Qݨ1e,9i缞[e'&2{m& D('킎Üi A"SR/Ը0|bVry 5| N;@% VSx Rm9cВ\Y(<[?w4Wh6ng  *spO9Fe+ w[!kģ~+tGO5q?),EPW%S~*YYƭjz5%mzFlJ]GU[tńVXR}VRf ~FKoҪ?_KDx5ZVeyj4W;ޡ|+e gKʟJNbu53e&!n ;k` >>PtRN??T羲#WYSJjg5/Vfll1mWƗ5n_`jf~haem`}#3kfWlr(/Y&-IbowAn2V?vy,l/ԻXC_qxt{7/ې |L] .Bf?*~vq)'|g?) O+EAҧ_Apʨ>T[2S^~'6+OoX[oѺ|/Sɏ,` >_YU `qwɆսS 5˕G j5X( |YUk'  ]xu5{p pp[0U'5*V%zD)Ϯu{EKc8=XTy0'Hf`8aNep9;K*չ5Z AvNtle%1pv[s:`ջAwkt`VOڕ{UBK>q@9u%yud]2CVh]{`@YjRz6Żq Y~:0|ֶ% `Pgu@b7p|o<І0ptK$W~_ֽ bIQL&;H\Q"we4z}7}4%.@hA`pKwץJĉ̪ U~#pm}Efg9sX 9g"//e*_ؿD. ϋx A#|}ɻ^&^gMp ]F6:~(9>a'[>?\~pѺY}M"jhﰮMC/yʇ$)SS0˹:Uƭ/ڹ 1#ojg=|A O$(į'@=c߯)Ȁ^:L(p':O6?8rs7ß~pNͭw?I ymgc2ӫ(b\'QL>&|0sR,^œ0" X gny%v7+eKIo@vz _ª{ϻ'XoR$TIGj Q ՑZg鏭G8^qsW79.R&ԹtȁviA<=Weym(oە0M-ZP~4V H$W[BbR7__4hFCNPt80ņ4/ً]F'MXO< Kk춍8V9fx9:&.ޯz8byӃ^sl{e!π(NpT=:aU5xt~+=6xU^pդ[ƨ= h䃡$L# 1}r?V{!5{ A29?m-gϾ-d VA`h^p=–:.AJݗ;֖ߣWQ{_so#nhx_`2~oz(u罉kq?˃٠/k~ ӳG}.&-8%O\[0W8/}tF- ՙߙ?҇8ώd_u荁#C>Gcwpc[$u>}`1m)T[4,?Κx~x3~c=K4/$jk2u-k9^kZs`[F2O3]`Q}ĵA;vg6CyN$ѣIj3ʿV.Γ1g0O@yp+d Π5 #f@Gmں܅Iԅ58@tAZA0Qf+V2^y헌 d.5 ,g9_G6@t8-8 r~8K}x N?G?̺5^/Ȳg=r Kdه<`5!0?tN2qbK/MVI4xLT? #xᵍ /[:U[LFWta­^_ Zy!"\˄+)6Df0Xfs_|Xإma. }ai$ Bƹ, l&%ϭfd PKSeQ e#-+U*g٥ۮ%m C<Wm>&{yZD}+u" Vt 71_I@[J5[^&꘢W}1Ʃ cntə3eL dB/W%RxU]CfuNR-\b IWeWr \#(Au,Qbt|g[ vˍglxJf n_m[L>VvpG P͇zvѮ[FA&8w)ю2 w_H:u*TOg(\g[`7Gxh?$ EP V#WAсp~0:Ungr,SG<<8"(o[݃A=:>I#p:K𹗈&< ʧf*;@\-G'6}Gg`[ܽĺהAzo4e^Sw]Ǿq%̓ʌQڧ3qmFwIj{V?}?)kե# =Z^q=S=cW|qUGqAN2>qMSj#?wo9r>)y3Zm-6xUx~O{MGbl(D[a=nxqml:ԶMEӑ@`-_[˽limj?Aʾ[Ybs?˭Kb9N}j8wmZq><:,$ #)\}UA|;jYC;yƽ퓡>XnH#駳n 纪:io9yyl[qQ8m4v:A60ҚtZH~ mv:7 6K^X&&mz_RgOЖ5 5gj5o6Bnc&ـE3k;E{cϽn߉jhv 9/;k55|2>vl-9x[1{=fN󶻎 :%[Q|[oVƒMn뗙s?Ή2D.x;)v9Xˍ4amX1'hʼ%ޘw#])+FnÏ g60>}Bϙih>|`5| N7=MWd6@IDAT4 X?8_D?_`1{,K>.Nyn?Du&RgrgDXy0 ^2Z=;X;x~A{ߣ| hPE?`<yiY%+Y5S}|y3lxXuEB]߽/9w)}_߱_?{N7$X{z Q>9|]WSW:6y >~%I_9C/V?gflWyW:wt1A(ն06A ?/&? WXK6xl(n WH?1HD2{KQ6(DIC/r4?;9+^h$րg{aWGh p&B軫F2(m6!#W<xy"OD= s}.I<҉Kǥ;%TQ$|Ren<>6Ni f+;֕3\?37ؕɜ~"g&4({ J7Ohr— fr9'G\놬dmr/܃+x,h{z0*Ge|ν }霃to-6q) boDo*Ix1(w@[V\ѺQ}OkӲQKWu00%km]uϥ-1UąW(fJ"b.I:? G%j[lW>.5n|!~Hۧ)qy }뎃|5 ('.d2dE=^TKAO\WiW^ Bko^ jsxhk ZJ4Y/iG GGu&tx|8#a?_}3ΣK]mEw.Dp'fI\`iB X NϨ'v};ň^ۿl[?! }![<?Zo_'<-}/Wi௜뗬r}}Is؇]S 2FA_"_d _o.uB7 +b+f~^Kc~j#Z{CY?7ڪlŷ[ny.Gӗ@g]s,C}kY<Ըw޵-+8}I./yۄۼ,}E ybqvۯ68/q)u8=qt`q=97qy}'_#C6ߛ2OgSYuY@{ȭmt]:֬P8䘉l-C'2C#mOCi9mW˄su~63=.a -V4_U'}' ZNL.kõ;NլNE^Ƴjt^ZǏ %_Qۙ*cM3op5yM 'Js(#C{Qqc{(IMq ZfJ+۠W69đ@XɄ} ? GFotJ>lqW}|ڱ]ԛ;ZeK^v7gK.ww/m[[& QV? *WM6˟y/WCFn/2-y9ɟM=|&#*=ސ9A1IXW{^7jWbđ7+hm˝0cLDH:3$AIwT(ŐŸa$+螒v}'/.OڏּǛ:D82g܀qÃ@3P@7`ǯxpfw3M|; >,*Tga"L^h(zJ?:XUr Ѝ]^۝їoViƙ& {. md.`afW4>-|@`)|$H0;>~HRsw~g>?^G~Fdv&c{I~Gz5b-oNgLЯMP'\q3{lBt8 ufv`L$RȀ0r'{a6I^<~qN(/QuWmL X""hoBz7qg:ڡ]%,@ Rh18[!,SQ^4c)ե'ܐk5_A|+#푽'I\n0lfYk}T Pi78BBQ瘦 ziY]ٶ>K.ˀVSn+[Vvy9}:Y\>KDq-]>TSTmPrJNa#U7|Ǿ@28rY=$Yx߾|ukb!1I/p4hϹoHa~V>xC./BPqǃMa_as r8|)|:E2XnKpiI/pl?/?(*Oufvs/D=fD;Gcm4]ʽRZ9&Ҫ&-5(`E=gof@:*m/=o?;.ҫQi0[}qGⱧ yIZ>}#Ҫ5KJ :…Y';BMs#МhlE٢pqy} 7ڨЇDok7.4}˹jŸ<;yvZ}r*yK~|x#/sZKKy`.|{u!,u~۰!I,ZoUP(rVL1'M&SD(j3깸Egz& @&mc{qtY#&+ Z|D+v%͙r$j풤c滕55M0bb1(.3H\V&>?&-39&eWch4ɯ!M^frV^\/yq2#ۀwEg$99z$ MDA73cvD,@5K uHM0dݙ%K2LQԻH;Odfڙ>`$:3Κd fb3[B'OVѷm+3P:ytw&֝m=UWY~x{Q-+e J·!n9l@Kf)}厝> ?Rv )bd0H3t M&*L>MP̫W'$zJp X3.7+'a*ПQkr<ǔf ff\_اj!(`_2d3%R卪$};28%#OL t\>?<[}]Y_b69p Jp 4*Lr/}Z/ m&a6 6\e9G (> |>O0KX':`v}ͬߢ_:|dGS2>68{80lAG.%"#envf4aM%po %5?b  cֈZ]3 x8))OAZO,I_ FFL?5nb-A5x1Z $g{ gT# '}@F*`]dKWgW}q㐤}цGǹbK6Vm)~;LXZE<2 ßz z6CA_5&5/S\ՖW!u_jȍ7mFQhRm5`iVs,P8_aAKp N"jmkwepy;66t q0moྫt2}o,n3k>G7ci~˶}nij1$GZKv[]1ayX۬u .N'Hkm `_oTdkmvVlTA~WOPϗE76l"Zo>}go 7 yOW_xu, Ҍl4dcDNuG7-g_%dzb7+ccm'|? &NDŕS1DD^9 *hܯq0h3^ϋ,!Lpg蚼"tjb °3O.3y&T@HVT`^1BgvS0g;]t͚ܴab lEpU*VRJ2H6(cpԥE ?Π%R.jd՟6$93!:Pv8/(7)4_LE  ,A]U~JbVW{ pjKKڇ$Չt|clj?++` l/L)#KK ?OAp G;[>L\"^_rea_]pƤoއo\ 3gD;z+ґ}8BcV<2c&OI`LuE>)K,L:S\_6f'DO{ ;h/?g/?]?[}vpƪ9?eg؄n|1]$#W2_4qRmY0w8$Fzc x',I`+_TT\1Hr/d#+i#n23pJ}߱!sk'q|1J&U_yg7/L~cF9mUч28H.3Rd 𔲂-y`dwյڒ | U|FV&7@~\^$ 3y^(8:..=ǷiHBw<:g^zK nXP?^m0%^4Go 7Џ}|ƞ/dT_0)ЧK=>),Fn%EEAkcܨ7x&3{c~ gjÒ1ć}^oPWވ6^}/1$YuU3=k5<ā3n^?O@#_-+QǗc+8,\{Np0M#du𥽐7v$[V>~lxZl^ߕ 3^)09N| Xvi~>=X,'aIWm4J 7n Bm͗EU5lAq3[t"6!B?JTKbylޑQ|ޢazop5cl+ݗ-snC}Oї<ypʇӂWaK1kz}P!uU'd)?*`VCX8-9 Lt&^ᶷi@0Z?gT:c䛀]5Jn'8Z>,]w7Xc4r]薯_})q5g$6҂I#%Y؏݌k2Ķ$d;Npb3{_”%i2ơBܜddM4Mp<ψ9-'/: /a_&ˍ,!t`Q͢V^\.w2L jR`H~#rLp,&cRt2z7Fe52׆ @uiOj2!h: ; B>JC48pn׈&SXsaeҏU5gS8'O"6$Ψ^MVPN+i' 8,ml;sf` Z%ԟbix$Mx=T IJI|-3Gn (O-6),I"$B Bx@ll*ð^gO{J$WVϝE]Og@:9rƱ4}vG'Q V+|Vv]_Pڪ<ಛΆǴhoM\wPۄmky~ouB΢8vp>TJ) ~+~n: ^.CL >?WvW>t bRHƠJ?@W!/}`!]53|OOW<+.o?OU!OFпs_;;[>0PrJ?kqwŝ9@^e@'> SleLE85l4 d } >sI|F5ځWVwLȥHBsǸ>Xpw<~ Cq2+[w߸qʷ}­>g9/VLG~U HBʻboțZc5Λ$ ]S*ѹ8"M?#T Ӕ/m[!Ͳ+5O|DĶ 0;B$ayqT6&Atw?h9ddcfG9"BFnop2/Y Lq.kRzOmu} W‰5}0fK wxA&K' IL '+~ЋY%6zݭktl_3uK\F؞q6>Y! \7Z&sCY]^]#@~%93쥔{Nrw5۫=q~!hDy~sŃYY~&m?.Ie3+j0޷T o&C$5vP.˗nKdV&r?T,ৱЯtOq?x$;zqPB0x @=~ӭů/A3V[ K\N=cr׼jݴ%8^xW{ 'L+ޗ{؟v^}X0G}v‘dy^[婣i?C;OXC;oqρl+o)i>a/dѯ6]+~n7sN}ӿދaԇx3b[ƳGOz"v/ѽ[Tܲ5W//Xwlr쓽՘Ek[_WU-{T8mp uA6yC-em}0\SFLq:|p:J4#JRp 8nF7Q>fgULk>.YJNqjeD~_nH bc5$F*ŶV\6 &L83ɍWl1c#Aˤq_gr^li\<}LcٜIR @fVXܟNu'yw^P8#``Dzc MqM+A4&NTWY 01?3!8i5₻gAg2;[`;߻nRA7|7m+IU }@)I=bJkphUIs.,$QYu` B2dyv @j>M:܍nEg7=y1T x%ġW$Ge5> (E9ⵝˀǹNn)y"z`o& u&sf}8VΎ6Ң'rgJdKI"WH[uk=K_B:?#mǔ̈Xʄi'Ώ0,]~JrYܯRWT ϑ.I?Guo?&^x`A_ucQ RmW %Oȉ)0>TbH8vq"Lž&Qsvd!MrĎ`v (&xMt@B.9n0+I| .;Ϗ #x9s k <灅/.xϹ3 ;NWxa7@=C~`+]·b'' S<>i n}T_Çz>{v% p״~ 7633P?D.s_p9~=,;ve &14 'yl68>Cow˗xw:V~?Z}^z~J޾zG\з~Cp_Y2[E)D/ 'IX;յP6Trl,IuhԅS_JW՚Ö'?tC8jg+~Ma& '-`}p8fo2z)GJ5K\c%MMKמWFğk`Uau ;s~yMThpjMl{&(& P|/C/u,Q%nu p#,TxC#I۞>JUg8X1Gt$s"AhŲ|y]ڍ?,(Zp0VN_Ԋ.DvchLlJS hٹNUN}8G NwV[`F&TT =c׉Ca*ld =HbK`#G\[._eyX\~QQzY1TS *-I+k7iy9üC?^ݫVŇ?c15unk{Q$z=F켟,) 'kP'lx6|GO=X::Wߦz#>K8 j=ӟ݇PGo=eK,I&yaGhm>r0iڻf%Ǵ}9۬9X^NlkW8ݰg4ޤqv5vs8vYyWc࿫:]m;6v Puv]ʌq_}tfĕ̟p6NƲ`ݼ{C ɼgL*n72'cd=%>kğy>bl ]HWXts>٧?]0(LLxlbǥoHl9U!h- $1K`[;چ?jɤSgPM1Ϊ#F6d&;5pL~u0y)u$@F0+I%fgj Q&7@(ք:eo݄ ?mıQ +xd T3'廪A P4&Qلs6@pnM;qaCp*g grtn iFNx&ʝT# ~l&끊UyI=2Ӝvkt~ճ Bυwo`ll v3i<,a^jM2C mf>3~)O>$2v0gK;Iʗ|ClgO9< ,n5<>wHn^:/I†iXN; K7m&ek]:a! * el #Ia٥G ;3\?&FKZ)n1C/_`WdmtϧS^W.ujwv'|O $]wc .I2nh3 ~C!}ܾ-o+s.מO7oĄH")>ގ7-{*9>ӥkyd;zVROYd?cz=];8\af9g>/_z{}Kryl~թ^)(/9cS&:e@~>WTN$?G*REJ\$q>m&eNj;/)]cۛI]Ba .H1! }rQfr(]Q%Sϻ⛷JCiUchЁ_VhC?*ry2)\( ΅M*o5T [2ԙ- T޵4SOG\l޺OW2SFǴ>9vIy x "AfmГ6kJX>" m/It[צQ8]sLi?T,GHh1ڠk֒RR"~ù|zyY޹6( U0H.yI Px50'Ց}Z/Mѯ|X&cui*{m _ț rq\.cziC[Myt 3KdW=szĊH<&=gjc^r33St.?pՙW$;whÌڎVc#cQZu޿mL>njf~>V e:j[J-wȠg0kWoEqקC&p}C@nn~I!ɻ ~Q=TDz>U=-6Z/&ºVK:^;ME!>@q'˅CEM__VO٧`x7l=[⽰f}@:*9ԗ:F5/fh!ަ.QO3ol~>Qy6u=2mC}8} FAj*}YBIyKrpqе-Wmlˉxv{Q\!ס(ގq.K^z[C!0o|>l]olv\/ε7l m>ot]Uî~~t|7Y(曾n28̯St~%fGpX,W/Yɚ3:&ѐ# Db~%cs$N nJI}sSf"s Fɚ=Ys 8yeD8*y5ǥ*dL\Ҷ?a?{j[  ^B 'Bh Gģsՠ&k.wÌvP% W Usm`Ac@R]KϙQ.]tgDADKgCCHӀ;y/i;WǕg93SAiVsLLyM@4Nx@+ 범4RQY>uC/pt+ Bknqz,P7D:rܕ @:K=HfAfgsE$@{c{~b']t$[Ғ'W;@ ؟=X ZO1/utQ8,,&KO _HFeK yEg/sC.m1_ȨWĎIBUN[.=OG P@$<>gqyp{V <=.#;ퟐA} v}O_*oxP}z}ߙM_~Ed3# oSЗO&Џ̗BȗCGxY>~#{GO ˃Q,-E*j;ROzwr}RO`X/ñ`d'\q#SEE9C [o OnмU#Lbo7TVB\XFGyCB^,R"IO' ?tSڪhԵrIWYMBV+}.}ɟܙDcJ1~ƋD䣫v;F j<)sÆIit1l hru?w>x-Ӷ|E!ofˮش@쵋g ݲP7mX vjҙg"ЫKJ=LyF%)h;cԙ6=s@IDATD'+<\"^z]QI=p*cfZv^ XVk* O" Kgœ8La߈dT d3J^ہOEli_}@9AHh akFrm J- B>8V!^@W[m-dwa=}m% uC5QG]ܣ ډߏGqVKǤO/x>S<#'V~ 9 %5z{d1X=D_w|Z;|D8dXHjx.Ea.N_|"pnP{YIXV-g0UgcPY%Y궳 r,.~]2gV-ʻ2sǎeMʽLMXurop~ܳ<9-=|o 'Dz ~Zny1:lK[ZـGy(d.Dk7Gְ]W0Yȶ3uYЉ?դl;o맊[lЄ]9Odyonqq !ɧܤ$Ήn9.mmV4λMz3 ;ZudM<~wּӚG~۾5[:Pwrm\-ysobu RǴP皚G7|0kFz]]p5ili?6]AWU_]:c]mG?)Ӈw%zmm;ڽuv]>ʢFC{5W_[]0f\M̙ Lȡx_ek1Hi5o N~G#Oŀ `IR/Ya=Kvw8 tҰ XXc:W1?3KDEb 죁 geZ<6e" hM&IRD\V)39P(+yCU:XR3@DhfxyβOFTl/xwg$! &m E^cմW&#SvC~ag$3MqcWvX\1&8}I:g C7 ^𹬸3X:Aq =b !zD &0i0ASX6O$хޝ BNa:zW&%`- HJ\ЀkgGLqfxeNu<&.y~ r>3Y_mGh$1<ЀcW/˻y f2vgR l`[# ;Aό|\[m@GpޕK C/G>4pMxp*]18|,C;?ly`bV#KZCnptzXvgL`a-w3Mk 8$b7h)0/P=IS9wV_"nqJ<= '_hO‚_kaE1s7J7Pef<|/iL`[;p[&GziE!07&kVH29C#}蘮Cbl'>u"W~r>$/>S 5sſzO݈%(GE_^iB*$kq$u6۷7W1(so \}=UקB[N`$1Hљz']#Q]x֦\7(DN9צq}-l#Ճ׌a)w\1K?<J=N)󐅺Tn>q,ZݥjP@vCK,4νxŵķ%}iӆ MˬB? >AW>@Ƚ3 ?Y޹zbe5؂Qy՝j$a/+Z[ғ16q>VqյICZnb(o;nZծYZaHUkx5%sTp3{m[gw쇒vV}4vʵ9X͸Z[U.V^oBh€pxswci.}| t-{%<(XG*qZ>k9l/,HOsR{,it$H3T8J-B{8,ƲP/KeסdWM56qa+{m 4_Nɽ;1,]nƧ}cYx酗Y`)ރ[=Ԗ?Wd pݢ A/l Әn=Fc?8bc*X7x ((.pu޳mR2ٴٛaYP@ o5^yC;E_۫_gty:۶dz]Nw9+$WZ Eo6>.*o̸.|/gc޽BxsdC@cr/Gwr2d #wB?N@ljc$sl3mo1`|̼yc&!XX2F;2WLba)3mΠz̈́_0!Sԝj`(Ab뗘wP-lY00(rg*c`Wql*2^͡KCR/#PiKYʓʐA˷ܐ2LbQ'H J2#;.:gݔ~KfǵS!KD'W_+A,OPW;-v$}+<[$pQe/ٓiJIGV|4,=Xbp-i=V>Eb2ADMJ^=gz'y8d:  @Ij?m73qɟvV t mIs[+cubۣStպ7^F~ƇSL~IDՊ#;G&DBQ˄Bux|Eg#(+9>cC );ɶ;[K{ǜ|ȃ.(1~Á:` J lLⓇ FEг˒S1to ˶|]\8Kd2o?pfH|I[ias_ <=$\YAyD}~_p2١OpPlЙ_}@Esh?o>yGxF[tN5mMYo!blKB]Aǀh>qzF.X*ضȓW/L E&ѥns{YA41܊.gb ZOpYڴ)̈́M>Gӷl>pC\#/ +yXBcȓ, AEВGǭcǔ)pzƩ3&JX:')a3IW|/rܗ<}Cy;*UD[2C>n.u0,YnN[Nb3v5^IAO@em3HDssmXGM_)u[c|+X"/C [;o2򟯬<DxXk9 i\t OgiWQ5bBG9 w<ҁпb6p\>1G)<bqz+TLI[@\_T}yP'؜z"׭GcZ_? 4b+!; Y@8o8#=.RcoqDG0@kvybkPK|:pXu4Sy.OC,{rX\e(c<ɵ?Fz8J?! 0W.cd5t暦sG*~SQ}[[ + CETmdP-{ B(m񇹲kaJk: t~r,3mUWzO-_WcͲ} wi+䨃 UL,>Kbo 寵 B/ +WC~lUXF[z)S#h3(@/-_tB|{sع>|&P) 8✴"=ƹs,ST=LJ?xpkPXvFKsZu``6I]-|P&fU8dFqom>qA kTPer-·QbhF;4g~|/KD^>񞪙TmA3Qcm0o#mr~_. Uo|*js^vy};XκN W-uezvV>;oշ|So^G_cK'?F_5M^dVs`Z׏ ۚTo>cq8 q n\&&eƉstNb!]XD *w2Vb섃Ċ;1I2JO:*2x nc\G~o½=G{uM37&"FDK O6s&O.}ܦپus&QI\Sf{2'$0&60{cqSmn= 3cЮ 3I?M^JLT&ӡ0e-|8 $I;] y"!3ʞ'wq~NY%d6Ё*0 6ws3`M[=Xf fuǷ<)ՎY&]\Ȧ .cx=vlnM0t*x1 ]TY'+-7}F| 61b}TI3˛‹NWVˬ&l`I|XIQ}$8NL:[<3]hW g%gS6.^>Щ 9:!5ؑSNHdMzvHr*x3j+tCe;$˹p7AҾ \yڿ df>[V_'~ޏW_}8<]]3 " G|OpI[B_e:gup> A7uc{Š }-NIB(BۉԍCAي 1kj G> ʐªe!;< +P1c{JT,r˚ <1-,ZAQڍGW07:ho5tЅ. 9zm-ѫb؛2e((myJV^R9j5΁(]{>|,xжbԠ$Ǔq"V> [g`fN!hֹxQx#\U"2 q·HZk~+| >Qˈe||̽>p=_6/:J? fmsX'B^.>舱:S)9!IʴFU2Hjgexוʘ|[B!VQ<ᘐ:(ғ}TٍmD_ >yW(o| #٫/u%^([=lY5syx=G! ?;K^_UzϥHȍz7Ô_9gW7g7}4#Mxzpu9Υ;}Q= j;e֥Iz{< ⠖m/1UMjC{FºM-AUξYʲ5Ko۶o2ӧZDN8xk+k' o|+ݹ5r/yNqY-vW8=[W5fe/y[7שp] :u8M{i:hO`փ%U m7o ]f˿fpM/Y]"sv5Eai* cFUB>J@[/M(ή8A*_p[UR"ok؀׮ ުpO˲yy"q57vrG*|C7ׅ^?lX3:Ar#ׂ#7h[0%}WR|&!>p&]=jVKqwO O"Dѕί^$ 62ʃ( 贅L%X}lNIչ@G7mp& =ArenWJL*fu}q p&79J_fQ|N8Iہ-e'Sj@+Vp6ۖ"c 2uL*a՛If%Y6ne/]R^o_IԢ$i<ۚR:%RprXnCxv\MПd 鞟ꓴg !~9Y%<8x~plr7Y+O(2I vV<yOqZН:J%?T98rs@XE`rmͅ}v:4Zcς/Cb{'\Zv§MIʷzCt٬hnr\+3{!^x /N"?mun~`}akKտ:lѱzlXuQh/I#cdρOe|VufsY*;65h*5aKx n7Z 3G\IqOirP&UsuTmWe 2!$!``pO˟—z {6oB[* smSj|Bk@>UڿCI~!,@ >R3@^ZxŃ->Q2.2|a;GD% ~U/msi;ޔ]`eR-%{:S/TLR˷8VNᓭϨNȭWWdm\O\oiՃh%Lc܍^MG ;}PUG7 6JK~;踦 g~O[zGㅊu:6[~]s52G)ƒq˽ 3m_o8_EFySP/>e+)6_mxt NUXvk9ئxM4X@a}e[Du9yjk5Em-aGBr_d}n*Ûmo lycSz@WO< >NܨxKtzkDĻpyG7t?)mJS~ۑ6UOGܷޏ|Rћo^%Qzޚߎưr;l1ve2ebpdbB>,WA5D\uk{ ~loI(b l*vVT=zD Fi\'XeK|bG)$LRozW%S) oYB\y!Zrv[&QM%/<&AM౼p5i|d6tov`7%h%X- ۙI$3wGlNlWȟۼ@Ӈԡ4LҚD&fek=('&ĆOw[ͷΒrRO:x&,>OL`U䃴)|L|͊jѵj}#&30BKBH7| LJ_ݹّ̉% P0Hok{i2=՝S&}?B= Sp\SngԵ+NZ5:"{Yw69oS$0>|r5G.Wg M(57#ugw6qŷ ^zs΁«pl$C%O?/GNrwp8y^R*Iκ@ҳ~`9#j`x{ï?5![`82\j<&,\36ISD_C䣟׵7`]$8(r㴔ip?h#pyĸAjn, }(9Vڙ ~txE2"*uQ<0:g#HX*z>g @r:|htl!@ W>եEj{aA]݃#Sv8YMsB\3^ߦqeţq@hESOx2'|ycwR, Y 0g-~?6ţr{/AP ^]%r{_aGsJQ),o+T.U|뭃W&i3]red%\[vpuq}?@e/7uZ٬g:ec]t }屨$bo^%184WbrZkǒ |J[SxiwVOyy|"k*o8)rXnבP`r"DUUA,|<*?G1소Qw+doԵj+9b Qj[ǿpi Bc>cbb [-d=㣞mTZM>pe/-K߶oŘ5ug]e69jM7&Բd*]K.}OYo㹋CUC(,aX,ygJDHP+,}{K]G b-V"*/YWIMVzR]|w]79 .&ϵ]ݬ(>d<@m b8_goO=|~$sd:oN.1O1 2k U]@_V"4戌id16Āiy^p!oIS0- 9 I L2 0rB&iڈi-qCZ&U'D!QAXW^N-8VIe* ]V5CxlS ̒86h8 DWtEiT@>9[ \+lgF|QBݕ%'`\++l $[_@sxyMbؕ&OՃv[\\yʡE[t&:jrHNkt8=3cS{9;tKz~`g9Գ)g$Ӵe:)x/9L/mtkӷN7/_'>d6Ij_'A@jXxʶu):LzOOPXctl~TT;v=IIVRYuOh e/{bSNyr;3ĴAGA}IOJ;C >x? 'N_=d~yWU+Wurj,VLB]*=eB/f:Fهzeo C/Wd򺒱u&$cF'g(;pWn[sǣH s4LUcЏЯD17D[ѣ~ڏ5]YNi %!Ϟ'y+Qֱk:+y(U=3D\ <5 +d\;L^@i8.\CƅyWY+E$eӏN~y1W=9Y "&5ѭ. 2u%_)x}>/ }m\ǣ$uhFK68yh} )+$OVr~㽶`Ԗ%$=ՇPƗ L}:`!j=IJ8Ŕ(^ &y IPKʎaWَV'#{\}&v+8W<' ϥT3,eLv2\^º9{Fh4^ղsJLV$BwR9NN7} yw ~g>i/ܢ;# .x^\DC<1 /7|9Q3~mAGx+Y-3Nʚ~ {Q.׶bNN~EvEš̪CyG[kĦ`z2FwI c5p+6\ømM=cP}.w&(V/] j5nq / {a {Фx=X]*\ca_4zysl{Vo: LzwѬՋ{ l>;Nriێ~O׵ оp2\,%]Wyd+t*XuQ| a$oVQs, x01>ƿmizPN^j H/~w9|*?͌8 \jmsX1c)?cܟu 8GstaGƅ\$֒w+Gp䷨5cCƎo<1> Ye0XWL_lG?9Nx?Ȼͷp}73/?bx |?ӰwEmxTOyK%&2V_vBsTI+렚)r+Pxu>IܡZBzk_~&G+'L+8?&ͅQn~wGr0=1ι4Kۇ3gm3;у:,cB[AnUn$vʤ;0El%9.?x$CBeUNAyhM8~ٷK&2kry~З^dzO%4тClw`R6#G-AwLeuγ؎O?2+6"vxR7VTK*Gy3J{U`uЖEa3ޝ2t>BhʦuPz]I?+|--dZ}_(1c2U|[cI|Luxra߇`|QI0wTB ?/Ge~RR]v>cܚW}vqSm1kx^M&cKp 3ėWNLv_]rWvo,qɽVqg+eƿ۱+.xDGcC&2U*Q^X?]dȌlإi /ꈫ ~|\/`q^?t8;xrPY/_COPd*Qڮ*gZeRKZկnUxYv`p|!ПXKǜUZeG6k LJ5jו6:SVƾ؆6^4ɚNcc7Xw= ֞e0EY\DpgI{ ]w>Q <壢G ܾ=G |U <{*k X]{=ۇW' ͝J;;1o4ƉG0Tp@! G\ ;$=۸3qį쁫!}V;j#/Ƽ\#}B܉8 , &xI ͉$ \= o^hJemsS&z ]UP Dgi b@N6='e@[E?ɒ$XF@2#V"6; r^4AmĎே:!+@`o dRJ\n2J2Ľ#*\Jn@IDATrf L%z& g2Q vЇj6U?`TYqS X 65~udrR';W$r' kۤ!;)6=!ѭβ<6jc3enDW_SV;ÿy89Ɉik3e3l?!Ljr&Cn1U08n[ 8{୯.KyP[xy[{xH#8*kfw~Лա[Ux`E&lQ\s-  t2P ̱mȄ=DG=㞸El#.L~/I\Ȥ<\:L+NQJI;޻8gl8φË'>sl 𗕑Ȇ&ond E5+ ﴃ6|EΕ].>8=^]Hȹa%XxF", ' 3ޤmԹ\PofrXBdu])m#" ¢/Cʥ?{Yc^ڹ8#?&)sCAeG¹kUx1c%}ˠaja.<9׶vp>?~}#x1,pAp›;>ϴN=9mzxo1Q^͟p;1-d^G;+<;x@jt丫|_S x8=͸yb/.096R(dc|VyolvY#u,[I%~/Ԃ9Աl1_XOCվVy_X/(ƒk*hA7mc[ҥU-ؖX!]fY1=%K ޱh"lPc H#S?<,v)WN 4iPe[~-&/6hi ߋv||d{_?dl_@\mnHa!hGӍʪL;뎳_ 9i/{:nY r:!cx8hd; 1ΛFk"'+|Y&]yR$Nz^]m>NFz^ξ: c E>ÁYZmpp'~GchR˻ڮk3.[ ǥ7R8V%1MΒ$k~ӎ@QޏU'740wnUV_mo)1)MǨߒn&x+;)\˵CM $ <χz ,h~$+ Yg01w5M]IА!NC)r_H> ! +s-fvz]KLZtqp 3WWcA/1b\,8;&LB& DL,0kMMbh2L"#m-}ΆN:fYّ`9ܪ9+IeWsp$kv @]]ol0DIX$,Jخ6䩁:E{I5.I:$H>q$ ȹux];L%vA +IӺ5*IH =4J{|%d:ͤn| ѡVaIh=Vu8SnT_VϻMCs7 <&zj!ÁY wW^hsZ8Aqg5]m3^6Y6[+WgI|7i;錧] gAu^` <[fѳ?̶ g0^Jj/W2ϮRn{L08!hwt~ 5I(zmմRL8rtR)s ؓ?)+#8ѕ[te_yA 1! +&8ܢu"2P$vGMd?wWlLGDW:dx&6<> " m3wL*bb ^_-*G_1/l9A\ďlE{8x:;aޝ#wXg~&64\8αn]LpQeT0ߡO|>`!tßa}K2D`#RȖEFI I@ם3 8^T>tktmR:+@aW,%͒^/{|iOG heJ9]&'xo T_&#醪/|]"{f,QjU8^Xq̲汊}\_!l?bl"Eq]X@SofD̷okSnuMiQZZ_m;̺huGecq@kLHvpCY3b-`{S*fڃAo.`">LET@FC#$OC+ݰcVRZ(S #Kjk' ő{\ "`h - 2h-1 /E"[Feiр9d;p>]#g5_pd;8W3>G-҅?&V)N&n?'i 9/w:ςqXj6.>糧" ;pF.5l]JV%| 4žDyd„% ז}5:r#;Ve„ |&i%}>]*5j N2lw3YIT9!3ETCpPxOytbj7eX@ΪF4*Sun朠T-.E:Fۛuuf]}g%^m*˒%t/īcc|;,n>E?kjph.˫sƇLqL鋧<}2|5mN6cFٴu4ր(n z,j*}[+#x5G KXo~IFUJ|sư\`cƣd,x_.t2'q"MV exw4'ZjD@ `?wM&C$ ~*Xae 0 aP- Jsd"herV92ӕ$kvrU6p״$A`Q>Un2pj.RMVW$Si*P&!59ZW C48ݪSp4ķۧ6+ׁEp BUV{Ic(Wcd`d7j`3+>K|?eؕT"S=}V3j W`i_%ɐ!L>cė\?)Tw I=>} UG0?<<:$nnfii &M $i;d h#ngҮ;0NrT;gBǧhi5'i sǯN2!Dq/hwvcsM[bKl?[α=rվtup-NWۧMp!4 zZPPLu#s:dƮC&O~&$/TtmJ#2n k51 ON؂1vgKޓk1Ux3v?92ps]HGmKv΋&0?h<_EAYWj6&m_ҿu:{Ge"ߺLjqEa\-t4zmIoRJsϚ,(+N'[ >5lo۷glj>( 8ZJ{#Ʌ7Ⳃ|{+ gŧ-1O?V#QI3q%P7m JU=k}P?;ر%jd.z?4b7?{ĔXjZۅ$p@p xWQX x3&Atr@hLvEVK$.&BǕb_H7 ր 3>Tȥx&S qʹI/`~a}qictt-5VˈG9ɵm1Z-"*UL!T8nxBOo?mӠ2HTz}c|=5uyxVqi]d Oi-I nf:==jg1-c x0 Dzo0>B߮ v{ǚG 'at6BYYO &/ML"KƽLN$m5X Q39fUlS-#IX]2Z_teI6We˫5 2^~he 5yJ72+ Wpd2[\$琭cAEpavmtN !uJ[~r€FgM0Ф5*nI~ȠS&f&a.DGn5 ГJ9f}򄕥8eVn!j|Ƴ:xy76\Wv@^ti)m+>%K`w,k tqfG}b7X*UZ&5mL7ʨhwKݼ"+/U'L0Izxvr؞yg&>䄌ώt|}9Z$iDEV39Ig|LVË}?{'NJ!zvYe_X^aoL.9886گ{-&xKq 8Z$(f@J{HhO.Н|.Q|TRimkM6vK_d_Q}젙w># ._ס;HBAhM>4! ܡNC%ɔ;o4/Ox_Xy~=@ixq}B+68 /=nrdIݷү՝ Se聝X|$`}/hkR:"J=[!\O| ў"5V:Ã4w [q8ABD.Z>P`;l5>]=UubyvBOܝo|K~@e㼼YHt}ѥ4QS:T eҖ'H4oqg;nLzV Ȓg#%gmOkU ~BV>D'hZ˶*CM~2(q+"p-O~Zq8n%Ḥy0ω#|r O?{,jDBޒS|%d \}'HD}F9xW'>f]B}5vƳ2![N?KpgMũG!+n`T1N4VtǏ|G::?0{T&ڗɸsm]L[!5)m#_&1$KK=}F~d_| O ICK{[YP<gWP}S O{ocҗНgǗGL *;Z,W)ve]ԧEԻL'읻[G^gR%iNk5r!R0ɢߴ@3f cд1Cr2գuWΖ[-{HvG|fqDy.9pI{1]oSҽm]P,#rLPguBԁK y˳ ӝB_w}k=ҫguK~VB.GpCn|3kؼ;6wv|c5x>9>0{Q}}Y_;ӺǸzwI`mK on^V UtXWԁ- W6~JCuFuuӲoMt~a$ &&]w{zxw<=ԆwaXCY?mT~#KlomX)S|C`ߔ_綷-]ڦ7z^A7i?ӟf7a>l$ͳ%wϳŒÀ~BqQьESq1֎c)6a΅J@8Uϫ& Lœ/Ѽ;i{^=U={%Aٌ\u/hh`nQpPI ^̤. TWt 3oyrv<0ᶍ&L3~Gg$Oބp85obp}nO`IkiK\++MYUD5}B2 [Ar΁O c(Gҕ^Ur`.<;oy>W&5|&1qM|U7Np<8m2ujs0D'p^Uwf_$IRjGV^[VEM$H}o/F}ePn6?>>ORS$সvHZ>卉@֛Lmc/ $|XB9==aa/!tapw5Lv^XHgR%;E}`՛ÞLV& Tuؖ|w8ۦoԾ)ǬҝLt[?3 (&X*PJklBIbߵm%ejJTw⁓R BK(ܶ,7xI9|:Cls{v-eVoyUn$3~l_CmI$Ajl'BxmZ 2MU8?BL67%:^nV=r~An5Mpx'. W&If;GGr@qx*wm넇N:[ m&_x??w j w/Uɤ(ƧKn\ZڰmQ*t` :9 ovg?Ó_埆>ocφe1|HMI=Z$J6ܲ$[:|(~80i]+9\J&“8W7mYC:eu(&_m"=D o%"9.QE69# c;ZJ?%p+wh nxd O܄X>§i:"3ECx 0)WnK۹~^tQAth;**G 75<'gd3 7C(!.0QtKY1H7MpY~wEdVgB36YIީɳ u[-oM*%W]{a[RzR> PvܳԤt7[=OI[N G[y+3.&|Zi;U O4+>{BVRGZB%N,'FY8?d>`duզCHw:3PVc 0o|,t~eՙ̩c\qȃbj_'etMG?{NOz7L "*:yC_I^ӒAWgg;CLz59h8I9YR mlI~;q_󇠓ԋp`)lȘ xeA`\t~$[&K Qm%B/2عH?Wu:mcZŖQUmկ-:Λ5K g)Wasx3+v(Gw\w\`8q5ǘ| (EC)j {z/~z\rĊx.oԾw1NÏ<_)~ԵW5lĔVc?}j @%֕/!֟klZ5MMw韋ێ{mކnL5xG |5CT&\|9 zZ5չ9;gGf32 xe+{m ~or?(!'epX9殌UHi.)̖bEpZ,`w<6wNyC٥W&8'?W&i$PH]`3,sD3V,?_&q [ U1+:A,xJBV@U &AF>;;@ϕvuU|)KdB6+]$1%V%/u$Mdp@ܜIaԓW)OoΖm=BYFohfe*uŴVb'Zۤ2F[%X&=ou\q-,>LȩUctiC g{d2@5~!vёAP;MP>&ʨ]ҩϜ-=;IaS0ІNv5dvUiVm}|%*ie2͏VZ`+I. 8:q+wږ8gY1wq?!i~lϞɋ<}[ 6,z2aVNh~]a b .UWDm3X{ 5Dε?~ . *]GMR~v쓇$ϡ #nq5Ҿ 6U,'x8enx.}=wA_h<(&_J[30DL"! ?%˗cd->sArPnh82yI2+{B~b3h=ޣd W)I%'2%mDvZǺWݏuuA /Џ◚QZbe}Wkǂjah§N;%>dpZMՃxCJB'iոP@уcFvreV~KmM}b~J'^U 1ro\+me?#o^ E>]Z|cЎ;3ЍySISI|dX} 'yO;3|ɨ|leL©98-X>F\%鏽C˹ |s_"\%nCgDZ|pVtgyviYƟ|fB߫#IfʥMû_>꯮S0LvdˏVZNH}׷-:.bԋKEW;وhce QRʿjFoQKQs0{Cx g}/ez^Ű#]v?Vl,tSo9.IAF7 iwWGlNU17nK|xtʨ|y<4+j<d#mG8sj` n #>$ 6BcbLxDdc#m_+ bWIKU@r>x3Wz$?@'l oX7\om-5@2GlJ0pj=`N賾s|Uy0J+e~kSjO>/3|wv&/8ͬ > 4t>mhǠ>::u|9[:'WbIpMud%y/C &挔3 ̟ۅ>hBPdGxsDڗG:sܴ^߽@OI`.nD(#%i0_hTN:E'nmܱ!tld+ncmiݢ~׉_9''U)p?M]{Wϸ[{1IS6Go@_9O ]ӿ4)6cg^ߡ9p5|/~ۯ۶m!Wq r F?!㎧DFzI\MtmJ|aH<bgǧSp$Iby-o?<@]`՟ȘI}`]<3D_&$78L|[[I"=ջ)tx7ke'NBG ;w?"ԛ<Do}!Yh;c_p siV6ɶ֎%r|]R]R;v'63b)?ꥒ+vxm-^"$c$w#Nq6l}Zo"zӏjҏHDmWrVp(GJ͆NT_)9K Fg{ք—N,VB+K[Iœ3$Nlg[~jw%ﺘ:g &Vz2œχ_~W/#F,96q-xP7@N}ώ>C['UqG^,,rOMjwf֣:'6:Q.$b3?pV=gt@IDATx 6Ĉs.aw>mth,5,y6f16:@J\c;:9yTᨒT(4r{1:#vaxiӺ1\?M'Xn]T݂VHq~5}?]^-%d[8?Cِ{f卯qUcelJlf,[?˸aEwr+Qio״͸rUNn>A>Ap{tl5o_Mj5e] l%[&Eױї5o֥c=}i 8{H}jO|UwFFϦ\oܞ's^d*S~n,0b&ff ]a2W&2h~<sIܙ8 ] t3LCxo>0կL"8rA\YI}# D),$(|&aN> ۰; :5k>;UoyV% m rYL&7ϠjV[ PBmKTMJFU &Jqj`/Wd4ՏڦۭIh8ѩt `JeEkvnm0(--Usjx6;I_:O z!X3QPg}=,2BpP&mݕYJT: G}3_،^ѱV6;d/NH"3)|v oWA|opzBYES@0ayݲsԶ^E_3H'I@3:8| &$L?^ٴ:7x~NV4zƑY[\N>\$閁ߠY_{]oR|JL;91"!!L6^#՛~OTCLV 3a.S Uv p,~ npV\$8]/ tD ꈸ:Iw 9p&M}Ll~Jw' q\CfQ9*l=yNbpM[!ā"ݭ֛P`):ֻd<@oJrNPŮb{܎o YULj¤W{le!?dGmOi%u_i _;D _xLZo) Rȥo_#«'φ?gÿ|o~g?/''/wEL9)c3OaDd8-рpMDSHV Sf B8e=JC9'aRˇcc2|1lcB cs?:)k~IӔ'~t> n}TqqSFcC}l'87n{/=Ž߹@Vhi~?8hb鰟TmƓQ|ߣ@k\X/҅|\&Tmz[N@wͤdJo\-Oƌ[s>Gi|JoҰ}uwy&7.G#g/u kSE2_gl;>6mU"M);&^jq߿;u=F΍:Kkn6ݭ]}+܏Uܢ?1_'^_tV"d87-v4q]q:^+ ״!dr%3c'>8ML؈V]q$Q0עA#ґC.tFAp] psy,8&e| C`^GA|':Ɲk p$?yϢ d7!&dsjnoKR&0-|^"t[vQFsH8CP>)ZyCδqNAa lVjx]An`Ne4*kyK < (HI +:$X}&qJAbQIoǠۭd@M8`ƷhˡϹ+XS?{p#]M]]k4+Ρa{yPG ޭ`Qh#mb:0&v] dn~aտquzM6&͵ߌ[ǦsKn7rJR-ҳ:2[9}w;mn ,6k\Q}siDVvv<w|I\] vdAx&>ۏi Wg5<cWhDhV|h]h?_;D%n0}m͑{N60X<7JC{mb_?+Io_x}#D5s: `u=grx?>Iݵ!]pC vߣa_O%ی1f^:dzO2_PE se!dnt~a/PnOotU=  Mr-3npw '㨟L..t#镔ir;vd\ER l$.dEf6ZD$ڵ#'؈`+ߣ/k2Q :Q]Nyg }_Їѳ?G3ᒉ>OWJ.wI!mVÇ[%8%'UG,2?nDFDFddDVWWeٕ `Biŀ0@ !L3 #Đ**TTUfFD޸2;v߸y5s^{>{>դuTMx z(PGK 8nڰs7W]y@.')TjmŠ7;i+^󩤈t |‚Mh HfM^h-ap|t ^KWCP_Qɻ_ HK٢|ExyWM|s(j_JP{~YIB6(2Q$0%G;o>d>3B7>P] ^f̪䑯I nuWTG58*i1{^RF2 Bν\Z?"/zZ?O\\vPα{y~k!הɧ+]D*NW=_dcz ?en=ϊȿ" pʠƩsssʐEK*TJkF KIʁiך*X cYD&HIslem'E=(Ӟ D7:~*r*ܱ}qjmǞ;o!_^!)HM0SEcAvwx^)]>^}h.jw,πvK?\oCmhO,4̸;&8×R!N94<A]ǟ9|g\Y!\ nA-'4l _ctQ,:+K;ץz Gr)𜸀F ??>.?-չXo-xӸE<~uCA l\>>z.2~uCz$ļ۴\l|liMmh,]N>o9B0í1ل{LmyL3~ 1ǟu͂s#]ede6棙W.ieo(>OU=M~])~fwۇв8o~s3]k&!K9ǫpW(94"Wf/ۚ}1#~u\3* a]HFVhQ?"#1;idqRڙXa+.6+|csy ҧ8SZ.+ݒ]3gr7c0p @ ɰ܎X\+0u$_MtU?62〆 L. !٪Mp=AAc̊Z&^6 ɻ4OBO LzHഉ'Jp=j ~qG=5951(f @X85l MN &eB_^j_&g]EV?'1$MBԱB& Q$x*Mpխ[w^ʋ{2'PADHKVݣTί]qm?1kC'NCΓ\ <^#_|upAuw|rC~urV|V_LfvT7Ma> \՗dev}_wb?C#^q0H.'\IA15 ԤW=NB+QU 2 bn 0jKlyҿo#lu4P+n~]n#vB@AYU>OS'T4k[tQ9:X$UIϏ91T_a?6>G&:蕎!y>\Dvtuԙ"l5yx,z"[mh'M~!E,9&H3;A׶> ʓ65C=b'^& vViQQ}tՓLs'PS\eg̉yƄ)M(Y-/]Y_*c|d/_@GWSĩ㔺wGMJyP80Pҟr ac%#Jef>v>-\^ܓDˮf'?}>{3v$}r}^/ lP<\9|NϽ lIڛ4~ѥTV=z#LzȯrgyZ9|6":ohҤcptv(k*%8[У}e2u}AUޭ% //57jkIsBk|wqvE;x\9t2S=o޾O㐖Z]wyt/Q#|-:ubz)ZYۖ0KLF$ EKSrbt-KL@~܅kv-d>sk$jq'}Yz7q$vI'5I ;+}IҬ C5@,&oq^ؑC# _s|Õ~ ڸ7!$$Cg8<_xŎw+V\|Te1Y%bPcs%iùG&`?ϼYdJ8<+㉯>HH7/$n_O>h|:{;?ߘsϾ>ag"˞W)Kl2mhkw꾽=sN(ɖX7~5]N4Q^umM4ݰÈBD0LʇMt%YhW/OJ$niÈzK|y G3$2RoH9^W-QfH.c]a_8>ԧ?m,%#@$٢/yu^Qл]k<*:M*?Ft!I9 ɚ&9!hrW%g"}w~%=qYi7 Zu(i?T(ʓا\r9Goez3 hS'&N({q^m\vEGV^Yh!}sW09͌GyfЎ$N'2jzޒ~d .\hu;cziNbV Xu~we߱KԸþWcFϏϹ3r '>Yo;cP+5v)ϭc+-BaަpKWVdcgJoZ=2`~?['R.?pO?폆 h<?|>_O*˷/cy%,yFUSL1Gd-9&6%)gΣsq[r1Ҁ.Ze-LbeEfhih@ֿy6}LTC\!,G~en?SOur6 v\WrvC,ܼ0=[֡ Z>oR'>&=9AnYڮK r|U~XapUUh8qҶjAU m7T`ZWfT?6OM)F6a^Zbt:U僮#n׾~S%UT9C_?jl}ptLx mEvY HxՇ֔oӓ>u ls3-bW_z} ;Tq )TF&_ ËV7dTǮ6ir:ҾҹZMFQA}|uNᆎIJnn(ánV=YM%-}+B;S&ޔ''in 5l^iAd};[30Nmmit PW SùOݎmr6mQ_5`+OIvNn^ѝVV?I"j]ߧwÓ {rI]>կCG/$/ f]5SV@smKi*`6}ʀe+/K!IsmI&;˾RTh\Y܉ѻ% nӍ/Gqpt}>~];^@<%AuR$1cn&D\E>><tN՟:WfD_YI|&+qd}qK+.4i%s1 Yo"j5:[I$7Bj8%!Rj@u&3k{}rm3]f >&r>}g?]g .|A_q;_yWK`lMKN݇Ex'Mu[聴whw٭w@ \oKOij/xTy) [Ixƈlq/ʨ86NȂgÕ#=#5Ȩ3I?Sm쏪AM]z@9su3y/Ks^[ .{i;Fh/gJdfv_(c9‰_ \ςN?XY282% Rd)-rDoP@X?w$ vip29x?ɘb{[ohiKds6c՝cU&1{u.;OyO}F!>> R_6L>h.L+G| ;Oc#v^M]:^R_u{ʧpg~Ů ɨ"ulW#%۲/| bw#b%6t'{峯p:a/ a:ԁ_9|!2mUCuTSJzxY avh%|}lXfԫq ?rgmLgIv_c .5W]w!stG/>md`Z6=P2]N\c>s" )[֌p˿Q*+MR\:F- EQVL*2Em&uCy}Ȧ.|{br@A9VxۀU-E:U_U뾾b;q˦[ػtu ܵJ}+{p,Up-˲1_)cʚК, ^N6:qׅ|.glCeXwwu5ǺeikG=j$mv=n?/CێyMdiah\G1u?i~2_ifS˺筮{w?ExS/~U|71Χ:qm6i<oO }qY.ۄ_}S7Pss3ۤ]oo^8y=~5ܦqLb̰CL0_`wv~LV3!990Ƭ1~iʃWbys>ߛ״ϹNxsu>Cg*͌ØsжF10%~pt/Arf5)1j5[W' MiL6k3䭶OL_NIZ 9Y]Ի$OO^'hnn2 2Ȅ (Ow]WëuV( q`6{?7VUYy-|I#fțnɂ]&$ջsnУzR+:_wV6;% ?gc }tMbj'ef&Gl$ӎ t!_ЕW' ʹ]d'D6ɧ[|$(!kh]hʿbcn&Zʓ8~=XK; rpAk`ھMa#?*Yk`6 M';t$ Lyvtm >4y|@Ow ?<)mSTLؿ튀d~>S  z;o˔+L$oі:J& [~Dm~Mr{sK)4t\sC@_ p̭IbYW&ϊ)i(mܩCDa|wP4霰=p;p掟$ՃH ƙL"4DJU! ~_O_{p8^Oj[dA ^!mEsRu0O;G>[2$&I Rvg_ɏ:sξ֏<2Q"i9C%ݤad58/m/ۮ {՚9QV W<˸>_P6|{_"0EN0C)A 44!\ԇJ" 8ҭmLB=4gR웎7r{'pd<9VxXpư|'5i*5DUv%yr"vU*п5 hQɬxHESn7m]o97cC벟';bBEp00:8KK]ٲeT?%:Ѕc*r)3tg l\˿4Č!e&كs-iUHW',n~FMgrE1<񔥮=pM*XE~My|Vg_@hMܝ)Z׳{g"zۮq8rWS1VZf1ZcŠ{Lk«%O.Ϥ-dhTSX޽kۛ_^}6_|+V 8.>|3y4|JN`Is^QØՑ t0m9(#KO;q2;,]9j. 'c gp1!pxAG]Qe2\pNw~ 67i2i/}(ou-WX4tk2tlk 2<= U⥹{LZZ#8 :*_f9jIsIF+*\Gc$+)֜7kR.ǔ^zlC{,·M6=Fu7RUxcț.Xn.Ǩ OZW7{sQ/~Rρc <)oƛ~tsm&֭@?,M꼉螛ilor_c$˹/Y$L QoSѴuc~?̇jFc(;,50'.F]QK:]\{xߚƄWD'{c%~vb=yѿG豁D@b/ =L2 4(okW\&s8Ф/@U8T( $U+FL"GYZ0'l .A)MdC@+[2u 4tպnnR5#2'֛TV/1rڤJZb$|zʰG9# CvUR6,>cxSnUI'mabX$!ΤL^DYd[="7gnsGgo ~|;nV䏬л8w{tV'?]]9j"ڀR2alN%Mf_;Ig%ĘvL&^]%Xu- ZK,UF\2w[o7IU82رɝCVu"Dv9_ICw5'N ;ߕnӕu]DΥ Am&)`:d 3nX82\-j$X)3(mZK8FN&D1}6}^O{zʤ py%"5%6ħŔJFh+3JQVXqU8%h@g'yX 9/L4"ٕrA C۪;G7&SD +ڪW%QN3>vL>u:`VX_%*&\  Z[;^iGL能B<'fW [pR+Fn&eȟ~E%Mys&\f#7(u-s܏;hC㳙0@0LNRq]`nG]R_qo?OHlv.g/ON.Kń& Qk*|qmcTAY#NDOPF`m }Tc pe1Uz}m#Eބ>ngȴ^rXPG?{}v%A ܮ\I :P'd%8 Og34EAlm {+آ}= pHUc+Qg4S)+EBfmO~dZ!ށYWt&v%/wzME8"2IHݰ]pP:!?4,M\ y F;qGɨ=㳑cN6]@c+#ʳ)8iFj;\G&h)k~,Q}.b Me)k컽@zb;?=yNބ4ɞY^\^;{>WRQA~U쫮枨|\PѩE܏3rK $(*aq]̴XXOtrR>"Pg3jmޤpa~2<;xޟr&=~UaM垌g$ChX|40 뼯zskX:Oh3w_:h)CXqywlZh41ZAc>__dU (XYpX?-_A5Niuk"6>_آor Ot=VKv\էA.dsaqٓƦz5[׸7b|.LL['S1i@}Ƹjr6kW9*YW3ǸE>%?dQeaLGy{ Y7+߹`5gÕѹ!q@wX2bpeʠVFPy4W\]VUh{K" j3Btog"L\xڕl=Hrd+FQ$1|0`nȶLJ~|sgINH ZGGGzqS7d49dzLVL؁  :R׽bO^ITfLn۞^ r"M|.Ip_uǀ{CﳅmD{oٮos!'s`@IDAT Smeb¹WϻNz _A3'hG0`#:DTg?\yVųR(߾o,蔄u Cը|nvP!>6_ 3ADz'M\)]03x*^H6:Hm`R$I  #.hsno`:4kv '{Z9xj|WGf9m+(PM8q >@:Cz-?cRd tp٬^>BQd'c8"Ya^Kwkmj{W'yC9ƽw/ ;_pX> l/m%.w"^~N0.w)[X7Gq)"wt_bK%7Og_g?O#Qիw|=DķioBS62yY}0. B{N%&SgXGj_yIZϗ۠J_jՖoQR={ zS[Y?sK Jy G^te pb~╓;EyW+oNѯ{K[HG"[lA]+uϒ'/u&P ̪iqU_l^θtX`;^fDwRRw}YG[4d1kZ+լNKuLoA!ӻ o}[y;Zz-Fڶ .ix4|[7\vQװ\L=Zouh]/ j]޴2pQ2XK[`5SAWPW ]IQ$۶!$dB`YڧA(>z"tV%dx4D-aͣFCTW8p]]5İ{s5y!2 04^|?sx v~1gWz -g&*T*e 4V tkxu眀! ekqx!Ulzt9|j3N %: ?P?f_NfWo]g_"i{ޑ ;6IBL@Y5\V{W^D86mZ2|II}l~u;y~I ?*܇ov}_4]'6%v6=qWD_b/}﯆52NTv{Ӝd1}bmY /3#vHD`7)'(/xEWNBGIS4QVa?r?9X9>'X~̪x8jrk$kk@9vu vhshд&9ٙvè~F70N6Nvnb8oNz 9;(W@?Lts{*t<@Pfia\+g8E9I~aP٘~1}YK^jo"&M?hx{-6 =Oް0mص 2dk{ONOXs_I1ڄ7LW_k ݸ2h;:W<5y^ilmw=Piq|0!%n[@WsW&vMV飒_[07~& кq2=M,}[kƋ$6=S~娒Q>Is =n$Qs9n8Aq/ I쒁4" }CLFn?rGakn&aw82N; #tHB]410d0V[1'~wk$;7h' Ȑ"Pg^glAA;lx\ٵ{r76cɭ}YA!Jv]tŹzBG;3~ɉG#$p:տJrt;vV<⯮;[HD uLwu}u~tzEu9͟RҪ\y;.+i#/|;YC; HlwPaQQѤ^RxsC@Yt=~F6=iI~iw.+mԕ߾gԭ踬~Q/ĭ%n8@g삁ru^q\Z_8ӱpt82]ǍD=xz˼ MQF}Z+zspxflKt|^蜂1 fT]Yqm[q1gO)cKj̖4ZU !c~#s3b93m 9_Ku,71V,E쉭3vMMvR5c=׀>>6G[j0ӯ[ߛ/5b /w6Wn/q|wۏax\|Px4?pZ "w=';H<[䶻w:\lOO1ݛ7{coSh\7 9k?c<Ο#cBuSƦz ?&RY_f;og`>1k,{wȣ2~kQz7e9??zh3R#>\$qy@؞Xq`cRY=#uwIeGjrJ;$FD& eN@k4}w??ϊ?0`k ?z-)`Cgcv &Lg*SF_j怫Y+Qnev~0jo JO'ᇏ?( mW>Q^%mдÈr]T' b@ zfuQL'G\Y}M$ iklP/a$؞[G\k+F<>ѷ0hܭ]!\-+j7Ä[++[zݓcxF61Y T& :K-1y*_pcp -`G'SN0 ) ~DN@0n_vGZf<Ē[;`:( tx0MbjF$Mfe?ʻc_u~2A`nGm-L6oP-ߥ@Xf[E6ltUXHOv?$軀&Yxdw强noAuՊ&1f>G޼5>#lG3$b3N^-^ &UG<% Ԅc3>qX@X*$#M02Wdw"@kێRP;Q@/D< ꣘h~m㹫ՉILX'6cC}$}KϕMڇ揾 %`H&8P|Nt0Ok3Q7~ȿ+ &KҧQ۷rmCʮ r_Oo2*j#bgh?tOY*2>bxV,}3I2 NBqtNrI%]\0Txl9G J=1t>c㤓m E+:_"8b[ި3# mdfQu23X":r )XکۇbOQyn|{h>ݠg.Ou /WgDySֱvxd@.^d4〉1=m h;#UN I8{ ‹*>2<-E wM>)VK ;KN'qX~#|ͳZ˝/ggx& NR.3:-])|Ì,Q2?"ADi >eUr(]W\buH>6e. f^ץC2(U=Ll<w]zYKřP#uě77mLv ɪa1 1}Lqi{JX}X'O;_gxHyd*~2/op*{͓2Ԑi E1܍0~ԧ!tIR|<^@se-檯 j|Vcݸc蔏*=275J;|\U)/>B/QuJVa KS|Kp8^p]Q뇝nj"S=EA=)=j|?(COi~{[ѽ`c'Ϳޥw]>MѹKg/c~gz]'S>sɫZ!9_G?{/$g|1;JЦO[ՂbCJ\؉1.{ẼVנq@JA3a/0qMY z;;t-q?./ VAeWKD',FǐC+Qg :Yo0C&41mZ}UlA,AkJ*D{Q(E۠+M (G 2arO:J ЩZ]&)lBPXኄ+Տ V: %A\e$X& gW\@iAmF"ʈ%(!L;If'HbnGĩhZ Pʱ+[]Ed moؾ$ʱ9&{ ־8:&9O2<;f(nx+ }-z w0x}D-I؉Ǥ[[K{?p8.swHvܤKd+ݢT~ Qsa gVj< IJIMVwL$ 3:D2@nGln6uR}IYϪb'KWN)oUǜ^;$€\#NҒ[i28+A?bB|C_w?]uA/qiğwd%6Bn(Ẉi?kHdpxduL.D2'A?Go&?Y=zbA+P[I#(]Yޙ\w>rf C~3IEMrk>$I{k2АF OI<ħ/7cGh֊eG I@![ [&2wpCzGw"4er=IH|$E{u侂|t4Y[bcG47<śqsJeL;En>[_}qVFk}cohCh9?8}٧?g?}g/]-k`>#W^{^ѼT*Yv oBHF{J(-QpԇnuAa}Iq~p_C2I10-iOƞC 6D6{%J8y6Bl%ItY ?*wLC|P<}n_ 'p>~>dGEj/*P&*js«< /GoN G>$@(êc21|h$;7dRh #l.i@Eכ0/)-C,c+-􁱬P~mTP#pk|(-֩>mV Ɋc}.b#a(_<g3?|6,cތ}=P+sV߱g}g(< sk|ygyz~]MR2c1d?EsiC~kM^[&mw f"|;<I<{O] ꂾsOW@O>ʟn?>1Jz!|КAE V-]n ?ˠ 9O Ax2UՒn&6])Uz:eTD߭EJ#7>iGeS5/cX[]\EGtγ %9j)']ޞB!<޼߁eĐ;|;1S=D=Jcv_ÿRфOg/KE[Ǽ MYlNm?}3}gR7\i_7䘄5g!,!Ubb.Y/#M͗yHigٸz3$KvSNn>C3ߓׄ[m.O˾> 5l @o87"uEI@Ԡ?]m= 46m;?2-7& *xJܮϖԹA/s2M)V]d`/`6YiPĐ|hLD}rzVpMؖe6AMf/:~yO0l}!ǭkmWyF&H:n?,71ɀp_N0Q{46'mi(^K3)5 '6`'Wyv)|guM>yg|R_sL:yUr46_/>v߉3W(卂D9:rlK ﵲXՓjEAoF\zlXAi%\&*+ U (؉\FFDI>X<*HBP; }R8>*Tߴ=*٪E_:%H3e٫l{3{dz+_ V.sf}`xK_ G*DFj0N|e2F>-M `ŏCؖ~sE»7r1I=xt毕q^ /qG FmZy2,JNva <vy//W6юM>I3GvpEvZ_/{$y(? Ng7~=c[+>V~lLJ>zubi}}TLf*OJq& [ -ccpkɥ_ȃmo8[{A4pMI-&[{}?;I8qyεOʴFs^ P2j|9(_ˏ b箃WІloA|H&׽V=wdEɠJG!^ҿ}vt"ʳ}k]u,Vsc&+R$|9sk'ԣ@]<䙆2y?yow"r{/hVC!IxNFC: eP[߀ E[=j?G[ߟ*m^³;y}a#%w:VYA,N3Ň$}? .VY9&m"` ]ig e6֨MGU/gބ;l9zY[ZuUVBWi+_W6ns->zz$S0]<ףs4Y.܂`Z-K3;eIQׅ.}m?za_e~W/~rUAlׇO Km@qɡf7>z `hOzbat|G.^){lb.Qps֘}04&}\»O jR};7_seSc`艹b{^"񇠞cy{Om}ncN{^G!4Wuo{ۣxo?~,wٻTԻK>pːeojssQ{,NOݗȎ򆴈{|kN?2NI<ͩɕUbCc};&d\ܚ*Ѹx>y,d!:BApS 4'&~#>cP@.曈뙯4/z1Nh*>?o2Q`rV+.AG \LР =dda' G$ %PDI>ܬ:e @拏Bd`d/q-M,$M}%+uIrv{q$0$3>Uh ^qjZP[+9wG& d#ۤAceE4tU+}+Vzܕ9&^`rxywvvSg$cR3+鋬(G$o౫ICt+V+)IkuRW#▯w5CD4idfWA+ f53>YY#Sw cl9Dj+OA qLN$ЩcN,@N\0=蟝0VB9W+ЏBpz]akP[xVn"1Ai遟Ā[ћsU~Qߧ Of爕NxI$}ץ'8͑w >xlNr2FMT"c{[p8KXC?&-@Gl }^IP@ AnZ:AUI;tz rCWcyRO?ۺg:R'e+U[G//c|$R|L&99ZſB]+| ԧxO*>UtC&bQXOu }G|zzLRտ絳mt>aM<;H2xC)W9BIGG3]SJ79˜O82kŦ|;YBY&m!NLrXNVy^GH{;68e>wyϴ`yހT[{;:T:HCDDi?EEe|A(k ˶\'Ե |%n}垠^k8QVuf̦&wvli'>޼__j'Htޠ6ȓI @+mR9褟%S}Qͤ:?>٤< r ˝"O҄2O9* ^tgD\S1ڱcH_KMClNjQA9/s92 cwNJ(1: Y}{#ߎ{^YWn:*<à[*үtnBA>'(x=z#_5Q'e::3GMlNXߍUpF~mAMWןOf//yھ.i!_2k?1gP>3Q\+Z(? ex_i9ƵPJ}ʗt˷|)C&CMI܅;[i{ n60`ՈP}oD.Ac&.!/v< z?ʧcű`cQc^ccp‚l'/t+:=rYS?2{t~>gc!f2cw&`pZo}=^@A{t1:Ҽ*'xKig9攗qic˭y}nvbzLL[xs=^$z}D{*WwSS##6DH ng#bR.t&A*y9k2@]lM.1E`M\XSw5AX!ME%\E6,HlN;e9cPՅ^O^KZ6,_M(IPV~ A0q'p9AL6cLF RH EMO` O&tzsW Ē[w-AB%& :+V·+BCG`wWU-jPrx~;A@G)iP:|ŤI+6@o՛NY= "DJ&"z'ڕ·LHȪ_;qIYՓi^vw#5-s&ON^Gnߑ}VA81$`nԵ(DcVD5(MLF:Ic0{C`HdsgNu<6a'a_2缷Cp_ĮaW;aUv(g0P~M5Ak}49c:ULij+v:+=[5|n]i:ʭefE3s@$Џ)SAv\NpkpI~rsײz]ʏUUРNpqk?tlFͳz&+LHOZn?Mɵr% 7HvNi|ԉ4|5>q?ufL}1|ah20ۿԙy=e{dV#8'x'  q;uB'.=+cp :HllDЂ(ѐzS|qug`R^c|!o8sA.7`v,9LO}Ɏ-z0rV w`ȏ |Fi`st qC]eoRU2x2WՅ&sKkAb 1:1GWu:/z[ 7X~es3F;._[Wڵj v%waE[W}G9t$Cz|uhvN;5nZY+]-JS|cΧKZiI{'{(9ImhG y:|d{ڏ"X=FN/Q/|6I8?fofN_MsŴ_7ՍtޅN=^YaޚϻP>GnP}}SN*byb;˿tKe~Ă_\7懞P' A,M Sp+ }YϹIW^K'I#|@K;BрA1j8A#\(w+rÕN0w˻M ȇT'2/}7Q&nmΊ8bvxVY;08i܄!+1mi.Սmf[k,dO-M4IS& q\/šN]qXt%%~KBG{&~HRcF_lﶜ2v&+*jq?x SW@7YN!ǖn S.>r$O C&<U&G{X$ߙ .i5^3;{C##xgSnwCU״{IP0Lpd;~]y  rIڙb5>.܉dE^uE ZsLZtd7@ ƒrϪND`: C'5t d{IYdLN<&ƒDMC_ v/ÎnO9M$2j»zf,εW_Cfl {<zst?.5ذ pj'%x}ȓJBC > mu|M*萮 6ˠϵ㓇tlFs|c文L8f8Gf]83+Fme4$4\Ȅ$;/%-22%](M ]0.ڄt ꮛW$˽ Y{G&>? u0!~]җ>@wn俍oK&.˅.ǫWq~g_ߜwgI"%|/k*$r+$P@IDAT`Vr&S}Ko/ pǏԭ۞a?I_o2qE9oӟY$A CE=v{"rD' Ogr,zRŧ׎9l(]VF7ѕ8g)~{ωL.t!/Wc)349m[/#c|S˯eYunDWDdVf=2p7 #y`24$@XeK !$H?,H0``-Y Ym۶܍v=2+#:g}^qFdf=vĹ{~o}U.-*+n`t2Nb[u:1>AW-(_J 1أEG] ;mޟny"꣺@\IM\!|N/;Z<7-0׍:[M;d3v*$5^(jEU݋~ Mj0MVEڶW,ĝP G?̵YB=nqܕݽ%c--P>;ȌkHɠl\s^ު8vH[c.F@|T-#pU;W;]ZzܦN)?7AbڝoG5ȧ1^c䌿'`yLQ $9)Ha*{*tb8-y䴑wY͜u}_ sO>m? >eʏg$'}Ȅgw77\%1{fdSyF)Ԇ+hXU;||he-٫ozo29.y[z_ۅRmRSq11«9baXs1on8":flDRne<_] P4ng@K<4/u#M1e9 i+MK\ykWiSWc ;B[;xʔG] -$ıt~>r|bur6A~SvyVkO2uJ]O1 l 7֖&DCgm:hly>=yLxwn S_]Ny:O;+ ++q9!/(/FX4)l w)Tb= LJ\rfK(~A#LaK irި =.-hE@ߢ%ѡqxN,nq*7* :Ģj PLjcby|C#u0۸x} X.>`%%bB#p돡I 4\l\Yұk}} -+rW+{]ǻKǹx5&5?_.~bEn0~]qsE5ջ㪊oδq=5\}ob1y_H3YQ9>!θI  wjE+qݏ~nlڛ6Ů QVmHl<@U\cnUDyΣA,d"UPc P_+|Ǧe2Ɣ2U$js}rZx`>Q#o-\iG#RlfHOQ9>QvxIݬÍ2JҺ@KnwgϿ/WbuxL}ʤ~~ <9Vk)q;p,kD̀45²enI̟E QĦ dU M&?khh0L%:`7Q/] w>c)ЅL~ llGIYSkm"R.%M;p۩?vөbY]]d]?w$ן>q#RI6møcUttRL {weg&z҇E슝7ʨbz]=>ʐ9w^M)a>Z[cErKE6 c57*-;>5؋=m`U: [y]mLkz&FRJ뛢߀ ]w쉟*V 潬Gtj1cC:Fbvvw>5R++ߚ0iفr׆!yj__wYl#8OHە{c,WmrVC!]Zv2}詣iBo A~}KSkm;Ld[?c0nک5Emu8st% ye<_@m8ں}~vEnmzKùfS9ʺO"k8ɖ_I`@wS[ܖ{S^04^eϭ8Bek8q;KsKVMW-Љf~[y/}ѻ8ZQI, LN'@uaxs\1$b,O>2~Rbl>))t,l)xGaJзM뵷l@TLrO} 10em&n_8٦~ ]{#sOc۸i,W|>m2߽M|]ͮ5)/3d&H/ow~k+{IQ\Sj$Rs#b r|6?'-(Iۺ8cS6S߁s[c E19mB>f]qGd_4+ٷObOAU< NB,QpL!IDMU"+ p# J?V-$!)M%h♌lҷn}2]ɡr &u1q ×Ni>WH+~ʵ`bb7y7N8zC+t>յYE^hWI'r \ <-\Z6+64%ixgQB]}d }||+ -j,Ug= 3t}M oaWy?k_|g ؉sW;>rd¦_S=UBV #p8s%2XwL"]~MELz%yk7IT'sSpN{9nq;K*0Wc]th slbC8жܕ);T#cl]yiqTcDt9ݯydQ#xċ72 -LP}r`0yP4}:7&dJnAWh? -Zү {,\EJYu=D&[9We;]MK99ӧ q:. y|,Df%qܥDD4p G&oP?ovb,B_- a˄޼W8od)1wNA1`[desxJ< &Vx*> niE*cIc#i}cȄ;a}i_yVO^@қ2^B$8jm@|c XbE.ɐ# em a|/hW4"9$p I~qKzƧth;IR?+[ߋψ?_޿9sG8/|C?v>xwMp0Үꁏ#eٝq#!)&VhHB+Uс?'|ORȍ V{ c<7kBJ hACgA|h# ܠ@4%V=|I%_xŔ.d|-j<1;d񮊌^1KxPۢ].q=XPMFWa ję~M+=7D4s8gpMe_dHLϿ(?xC xO;LC*Qe!p,޴Q%K/epE7 #|cY}d RCBH>SwQ5sZL ͸A杮o Oopɬ>UyUy֣1zlJ= &14%T c۱aܧOdz γ[wbf6R!/c?p+N\/ oRBb-tHs;|ӍT`Bbd1Y9PoaXa|/og?8x{evqe@^ #ƨ/XRA|ydE8 X䖛=J7T?^='XuPi8YxAa,Y4~Y*c4%jԩKN"vlX]2ګo9/hśVeosc_:%cn?@їkܲՈujorۇEPU!\0u8v1fÐУו޸-~ ?Hp>_=WgƠ2j| 4P6el}]`d{>>$ln>&K_ ӖO8#1]m~&S7gtT\˒\M&вWJҧuS9c+2BŹj+'='%a]:fß.rߴ@`Y@5;mdv`g <`.幒QY8Xm Ƽ.t#/ cFV,ʊ=@;ziJոSE'ka=Wj5нIuQt߬Sϕ}۶]˔LiYgHu϶";vcape#:.Soֹnty9v,~4Ŝ?KNY}/a6y9b~*yb%Lt>{u_1hKg ڌuz[靾kܻZs8(IoP`KR9d>anNQG]V IP^Q_)ԃo~߰X1˥L?pu{)""V)G pΕbbwJҕRM^*Ꚗ~Qu-~e9&>7aD`X`|$+qot}7+]DwcâIBo*rk^w/PLdrOQ8W= S1Ȣ$kǏS1t_jo;WQb=q4m:tV_OK3,U'`9JS4њ?ov\V,V )/%fS#Π{|&M,`+iС+_ ȓ7~ȅ6Gpsų+ϕ%I_ا½Īag?;GF gy_|?&}?1'Zgl`!DXD7ySDwխN+ywz|c¹+˥)OGƐ +Rpo> TTo@mIOcMu8Asc3EA}&-4Wo̘{J-O8ONi^gqrl@9y"7KDkCR'Nx/}}ޟ=?yژZMWpIZ㡉O鐿q(wwvp* -mG=3 #,8&=vK[͘mCt~?HUq-Zg%)̍E,>LqdS&dh5s m)?EhpIǾ%>0~EC #ǏT eqmKI bhfUwk#?mS.ۥ/s>ѹH)%s}ƙ[;,7))0<0*]e*͎GN9xf;.76:'!(k/ob'O!K zLӭ|Qٱy}W_wRz[?oD6xy\k Ѽ_;.[.:n׈ TŷïcxYqATH1~t/k_Vă[H4T/ DHQĕ<\YM˶O: c-@=n&Y|d$(|).񄂵PhQ-{,3@a"; L~ 8qE =kj[?<2Ʒ"KC;Hp\YdHyc ndj[WJb'uYL:@Mr?y엳'ǧ)[`q@Ň`*@R w88n]mdwrO'X ŪwȤgDž <:g">5>mW$lq"iSρ J^B|`0U`ȼ|#R`ƌ 1BxssW#;ԵU1H[*_cψem-2s-}V ](;Kn8Y -*^8dEvtj zIyIJ"H˗:PKѽ ,KyET]>ƨ}unSeQ}[Y.M #o:CO;  2Ҧ/s#Cyʙ7}o_/eͥDkD~|j/T떶wA-pS RN6:dշ_ _5fc2ޝMQ ?چ, [TҴczj~YF "})gdNŤbj ?U Ӧ+28&JD,l*#c1T~2:~q ]#?2;&n8t|B!ƃZ9w}4ؽ d@3^>P)tV1՚##$EccWMטU 6k'l i-4ׅPC+\hzSԉA>Ix_xC[Spcٺ< 7C.h6&m帉߁͍^z|% qa].u}LOl|/Li*6¹]:UMR o6s_#0fruԎrXӣnfs Wlf;e^sO^=$QDHuu{̜k7xNf⫳oZDBjKw|&42DO5&K&'S^aUX%9u^m7}X> 1(%K'V T{Oi6RONGv J+ze.Z ka=ъn$Hd>maB .A?FW}e7{b`>MM |y:9iUwM{>S=蹊6nzk1m}?ekK'Odw߱O}v9{EeNޏ|!OF~qu)i߈}ҶJ=[y*z}Z0s>WzN'_fHn~=;̗ y?Kk =U|Iah8pqRdZأH X *N4'NX$\ݨg)L(P&jkvk,z@쓂?/-wk͕҅]$C^nu0Y).E[BNy8Gu}RTQm=vEwn$5IJ!A>:U?vA>i&i;đ]=jID_{B`R[ U <%>Sq}>X &J}T淪.&I2_^zy韪?{}U>RܧX(!A -Ql6b@N*>ݡjpw3X/99qכKLp[ o-?1>h8<BUL,wryC j+o0{!Օdc8:5^Q{đR}1ec }{o@},8}4@e&Uha/BèĘvW}%yqo( e{rLM K M\2f[xXi8,ڹCK8* CBͱDnD(- l8)H>8c@81Nv)9YnD@ތQn06 &&7FZƑ7 8(uo$𹱀t.phi ]/]2/"ei3|̈́~kMufla`FaXJa?R*nj2d ~aa0" D6)u☱ഄTd>sI\0}>Wg:{mWJ8Aח𒍇' E'HoȪo,p"Plʦ(Ƅc6mw媬KlznL8LRXN݄ƋU"!97){9)̨O<#fñ^ ޕ^-oqPFt_Km/{b88٫WQvRg Wx/Z_YPOn8>*ywP6O+ α^vԟ@S_b=VCȂ,?m׷+MحsVů2HU=:o8]q5WTZ6巏7(B; .B*%vLq]/}[` S8 5 EoD#@}?'?na_5<\N{;%C򊻗p*-- ot:Dv<:PhAt dīo c&ݱG1'6}:nj[;ې?5M#_'S#e˾c'@:ϒ4`w+s̾wx\E[xj?#(/jTX2sEl Z#O]Gu3p>p>Qms萮#;6Er6훈WwJa.)鹚C9q0;GzSP;vkAN'S+M׃аJ+z1 6YG.Ԛpxub0q¨>yyO+>K>|v?9240&&>k 5?婝__wak׈ Tŷï;l<;kB_gѣy[ׇg?|Z)ynOڄ9!ki.bNE;=Ofm~RN͉9ʤwD1/mA> lmXu1;[_^_|ۤG|nVo6^_;z}4&MYldœ (u2g !K d2ZQvWY[8Vx.2 UN2RYWyq-BiPh +GLL]L\9~&WyT 8dm%cxX4acaȉW)M"}PSlaJY!-|ڽ . ނcWkCƾH;rUzEEץ4ICM T77ILKmu`"V}|_,_F9&F}nWV[F /]r^\9kR[4vࠠ]ƟU*7G]y:$ZȦG1r{Vn|h,>ILsl7~67M Q;;s}nRc]lF;Jӎ93nOMv'Il\L)7/Y)d4:c|f{oo 9Lu-)Wʞa B{FF= R7qcߡPbq=^p\Snu|j̕j 8_; LM>43_9օ5$3_3fh=/5b\A/\/jPHb~}7+^YOAwȧ?h;+L1ј3OHB\pU)A~ ǿg qSRe[I̘>BXy/7;h{^VtP%K/-v;G[X%6s2Z !j+h }܃i\ srs=R5̾gG_׾27gPT?]`C X[p W@8Ft'B59J* r%,)1Gv:k*Ɣ=۠[ISd}t^k $ r7^pOP/PƓuW/Y%ʀ/=%ѹͷRsΘ BHO_@wۖ8d?l~OR`*z4r+SXyK} (3g\# 1)v`ԫlZ>vSZ2rJO*=/}Sqj'TOQt#wE/_ٌ: OJ~6k^Yʟ%Ar:ƞ -|qֹV<؛ m!N>6}q^d|PMY[:7wpi?D m3 X%[\ m1Inʗ2* Oz57*$Ë'*|`ui`{AiM!o[ocAG0 {lkLcߴsߌe7u?cWtf~tm(z=ci ow*O%b_͉N/ڂf;n FÏ{&nu | lm3Aucf۶Ԏ 0p qWH`ˆѓqx9fȝ˴GK4sK ~+>a|Ň0q4vv}O<`mp֒CO?#"e4G%ߑcv`dy.-ZGB/NcO`ǍQ#G{ c-~}çù2qʧm1w]Q:~~KNtE~ ;+ھ-isC25UZz>xsH)e-ZE#VѤj,@=>at]?>Hk<*7XXW7)pYg(,oǪSd)$Uz'3eilF /:RQ>)Pt Ǜ#f $6E8{Pe!#5Q=v0xaN憝Fո:ěYKII $*GQQvW>C-%Cy^p+GxVz=|qg_~pS7E5/iC}Υcg?6-Mh.c}T}/~uvo>WX<}u82ϙϱaƁ2RCvܛB8;pBgW">iKU&6zDgЁP چ.Cg.'iz3><%k҆ʩ߽Q !E_Vc#M[WBǹ,4M6J~>]u+V~O^TO&+zs:3 ,H8O{yR?kEW86*[C8`DՎN%}27:'.H۱\Soc'7E$}e"qkQ`QҴvW9>;{!-SG*'_V<7N]#vWCck]f[x3/ *FwwnV 6㷚DrLL'[٧i_lwZjWIq݆ٗz<_JWnXR2-]ˀu6S_cTm5׉1¯럒I\Oe(L)q>!_<;}o̪,VMz6y\D.m !d*pL2oOxy*|cۊVke9wLm&ӣd8giT;hmn}hq7igq ;.7qV~S\鮶M:{AtMF:>2Dcm8J=k{lzZ{wqLUltڻ]ƗOuVmu׀<^3,=ѧĝ:̶p_rm[BMozoHs:ƾ7}go}u8曂G;u8IM2~Z 3.wߥ>v^Z>z1^Yf2vix5}hcFŸ>"wN{_>a!5=9Eާ8gjj+S1pH!DEox_r"0ߩ><[rWSUzFQcs-jWh!mNb|쾓]3@>={ǖ-6F iM 4wnIv/įv?$~.om~ }GDDN'/ecqX\"A8#N:bSG`t22`'n)"19q%LuQ,\>vn:1c."xƒv‚*#2rKW{:]$keF8ve˟z?GV?K ~;0ּqIN*YcB)!El U2lm r[Ph"sX訜}u)~f#M5WW1{`yyqU?藂 EjW!Ch^C q <[X;gÎD~Q#EFۉiNW!JR/?GSle (U׋cb>=h!ӢnتEiU9L|( :ԱXYr熢x6_dn9/c㰲]"mڵuO rH74RWg76o?G?7;?z FAu-Bt>8(N<z(,)?0zC;U8FY  4ߝj/痕&n4v(_#}^u:>CN?q 2eV%EGW&;gl7#KŔ~Mۏ}~Tf 7}zK?%kijS{[O:N?wڜ?m{d[GcR2-]ˀuVuGbmWU<mk:o߿Yɻj}0#7/`*0&r@_ӓN]- KE8W3vj1O2v_y'#S!B~x7B[2w7uY_7DZ16X>4.cht>o߇Eg^jJ~i*SF+}'#j׀]+Ѱ"{57' POap؟& d$(AP\TlM >>~ra iObwoF?n'HoӒM(|q wW.}Pe^.?EӋ65&5* /S?A掗U1WrwWS8DžMs̼$Gf5- E>y*_ )!D,|=1hh„򪫙8mʯ| )JgTc#G+%\M}{}h1G&WK'7@s-8]&bD- J҄L&t y]/. &&]EnqTWHKMpUi8oh{WK"quxW{cC,vg%+#(!%2WXq9p:2;>A1Ū]BAck=bbBycX$s*OA Bk3bkwhm1dq3nJlau:mp-`mz\(t<~x_O(%|#P>p.om< zK88%f9p3c?7r!!:V_g7By%q=Ol>;Jt-\Gן?DeCf~] %núc2M@VN hqq=6?lvzk(=( ;]lg> :cvߛt'7Fp~3,dzZVۛ `HFXmwG}E(Li6i4UB1~Hsdž #@e!Hj3j:Gm}S:/|c xkOg"vNly>,Y|&޸MW ץa_~iK2CxE)K x>~֠G.mlv/;ܾ/'•nUCuG= ltS:$B4F09ave8Pydyg\տKy>v߯uFcfhK4h4Æ?#~7/OvRxq3wcq2+K俬TW7䘕܌5(e`"=`J\F>ǜN;e}15eT!q4\_ַ_̮?\O7>}sg~% 6Y3(J$#*"IQ@J1M:f0:`8#//X]}La#3x(Ob 죽QQ?XV[+5! lD 7[J'[TFzD|)@A)4Z{gaWQҖ`+ y6Cvv]MɂVٻGtWs_x,/< &;P&_̈,Ob3p}I7YY SlGj^Ӳ;?,Z4֮~.ЗSxSn5CGy?};Oh| .9Nr:]i8Xqa m؂%2"YTܼPhBU_>)y,w(q*q}|Ƨ&uh9siO|m"$5$,J)3.^`5~3rj'G>b.ѹt?։c̎$$3?30ud'Ckߒ5I}#)_HR nş G4_;" r򆕌+Ƙǎ(_M(s'?/~]ǟtvEH1;jո ,;'6wJhq'xeQxO\aXXXVLhVB"X_}oM>D[aQ|ѷU*{QuøLJ0W#~a3G{Tœ~xf</:?j\jgx^+(x*TWaiMƀx(W[ m[)2wi3kjOt+~wCqP쪬|ynbeT'Sq~<ߥj47|N{:OBO| 7 -mWnTL݁ N6㹩 k㸸 vAs>19iwA[o/Bk>z@#:E}Ao` ȌIö^6 Vl]<&ZҘ)wcޭ[w[GYG^h ^#tE~>oR5 ʼnhخ'  }가Ztؗ/4Je8fO|6,pEklo&[hu},9;3m3xȜ8zi)9x.%5n~Fl `E:#5'GV'J]F~sܠ⼯t8-"wYN Ģ6#迚 N#0q00K^fzh$jij=OAX͟ ,2m:i3Z-:}bst%uG}a)mN-.:̫afm_ }A~I2D^VxO:>=~j`:[׏9qoݶ}͟qi#Q7pjt>ڶ εS qɡ4 ]?^3G3#l$cnt~:N鯣aSM!1?OgBN)6_MSgF\55CԂ3AEOv桒{gw\D#҄81ș-aa\Qe=o|_+O( >TGHEgI}:՝}Rd,Tb.| ȀYADڈPvLq􆘲g)cC~g{Wd",k_OXժV41Cr>F uvրDZ%SH/|U%#Xs+|/9פ]*{=ԩãUďruqNUطB[? 7 Tl]Q7GsLjK"ߋo* PVưtvvM MfGl<l6Oʆeo%:nJhS^JBi;Jm|\fUȽ[t.T07lmeL#k7g{w/^.n ~1+-[yEy&d)];~;$nCu SqCs` KmYz6LٞWs`Ŭ}c`Vcm=l(s8omނ*rR΅uK36QZ:/1=Os$sVy#dP-Dtwc)~ .LWBlayԾ4 uYNFt)9ãzh%|PM m +GQ;o1'&ly3׻;@5eL|VX8^|xKܠ1,/md6m4t5py@^/zd^Ԙ/ ?ʠ>}1't^CVn|MJDR|Nnh1]s0+M6+|zm|9ˏZoƈ7F `!Og=ﱌ|,fM&-F~n#mnx֧ ޟP\UMFcvY:,]EVFl2.1i'kt-/5.ݻ^k>qLmӮϦx;kql\08NyոQ:}/;?GV;wl)(Oy{UpSVRKB{h7FuumN&.cq#z+f]KW㥣E-Kݟ,q}ں[rX7ee?Ǟ+a&h3n!Զc|l`ћq8& LK)'V&?k_>6^BOG=3?^ƋtYh-fɌh}uڶ >0L@Uwo=zD-k>UGhF Mx6'n^sdRL=u=__`.{yLrg;oo~⟥e@ &(E2gA Ҧ#xV|cLddEcVh,j&)̢>W/%& ja䤅:/ׄwI b_-mBIN. -S\jiw#g[[)%}8'e2جtA2ձ7FH,p>\DJq=6Bu6yxǮ6 c dĎʧ? c/x?7{3EɾR10y ~|w&Il=D>y[͞T$>[;UU|OI"!oxuK"RZ~vlS'm"y$<?'ϋN'/iKY }mCbǻB"5Mƫc KoB&ǚ ԲD缤˦b %G[hoep 6D:WǶ&CB._=M c6cy 8q~Nҗ~\InXɜJc./ԓF}fG:=}2:xΜz|2J x|9vg@+E#?NIɻ*mF_%)|!MT|dZ+#XH[]M}8s<4_żP^'Gubt٤~pyۥ>1saR8N.Ƙ~҇n*jkqQܖ9)7/yk]#7Uni{bK_O"s 9'9*! c( kwCL#g|M|4FXXK't<~'9\9h!'w/ OK$G5-zTq/O4i6<#ۀpn5}+m'Ba.QW(,za?O#m :|// nD"?o-jRET&Y'˺M9v/=A1[v1qDz*ioY64';f^'4V>}Gm:W{u^vɝ7gئV'>rP<G um9y w}je>?zz\ےs6?=@=gmtwt6u|>XڦDk:};fr[SFbp۟gmQvj頞~!ƐX_~B@}Fr-0^sHfD$37]׶Mm~I!9{ )|O;,Mh1Q!WAZ$2G3"X"A Dڏ(! Y+,= ,9pRP SS7Iu ˮ(~H6\ >678CrlpkX.n(N4,^Z13  `"0aй; &MHjt-j&F-1hӓ*Q$2t8R$kdp+-Rfҕ~I 7}ewK@8q6W3#}},qv:}y5vH8@A7 T|)7 K Eڣ'd>6n&dO?tvh!+oM%xEJӟG@?`"90ddR7t8NcYj&O(ꤰϴ0bk:):Y@П9@)2Gk|pcB>`"TpGc-H'yxlq ]LJ8/ڢlYf,h`Q@>E|n< Ɵ{bhCl`?mR8I&>&I*͔@ =+% +}- #Z\[H_zX<)zЗcT.Tq+x ol򢇼G_H*.ǖP>Δ36)\;GW}Podp3f#)sv2@'_~ʫo2Ε}~n_eėɧo&ooQњwQmPm[ cN>:%G  }B/>"NK 8ٻ=ş}+ߚ_=WgϿOxxK'e<P .FHŸv/9v{U#7}bWh'6p|I<,COؼD093]u윬eLW  d5_Ͳ'Fc1badIۤ^̂T`oqP}<^r|¨G#ᇌ3Eߏٯ*|n_׶cpВ%'\#!O k67*ts:Ӝ,ȇ!#f~{_}|weUUzJ114n+ucnOGXqᖭ :߾e[GdJ;xѫ}?̽4.{G:ƽ+| }:uB7G|$7D+H."mֻ[c4wL04y'ZOϯ3?\?kv\NkgP؟m/7|wԟ_@L,&>I*7f)z,OؠIVR\̣E7!SPf%tK7)+-^o0_^W5cPZ/I b-NCbNTBp.覱M'iB9w-9~K]nb5"(R BD,!JH rQ,8$%nlN]]Uc^眪{5wƘss&|>~\z?>X\ N xwեI.CiJx{9c%Ic'i/M&L9| = } Xv%4&Sޛp'%:ɝ8ö#1sGHmѤl=djgcgQmb͹Sym|!Imkq&r[W7&S7ao:,!xJb߻יpFFWʚ?I* NH6k: oQJWf{iinU f>ֿnp2JKNNC_[Kb߾Q~ e aie6}>lrB7nwyNxyw"kkdk %w:E6 $_auWߗ śL(2j&ckGF9>PɂW6}GS~_)[LW\iy ?aU 1H1/y&^࡜}}^SRb$ hRZ!޽03E\ağth~Ixll{J htIbs,6!BElՅ' rʊ1@?s] mی&uo,y׽KM8UqmŔi*.ul)W@=F?1N2x<$sN9}/3|o g{/b1S3va.AVFAavq<\Tӥ(3ݑ/ 8bd)US_r*o7jec\Y sGҖL !]IOi_l>%aAaؖsȷ qQ^'n@.}<))Mjr^xPŌiq\P#kv~[ư#o+dgې`lCFXyHW:0RܨG5WιʪfSx{3 Ah+Z4.dl6#G, dtW1 h$MZ4Gn;e#ڒ f7h_[\yhCeq1,\r |hZoa/~li]nЈ\q?? G߼\R?H_rY͖ڷ :k,OŦcYQ4[ꩬ!5m뛾ףlER `vě%1O|5Qڶz)Vnֶj :uZJ۟p&iqeƧ "GqX_޷9<ǝT]IT߭yַ#jm5s}P< nX/MVdipm{5K{EXviVm=lugm0ڮ{9z7\V7oe]8n2; !-XN!2!Iݔ>^n`,ڿkH0H0 m[ܻ&LNS?9ۖ}y~} ?q8yjǞ'lqE V'u?d5d^//O'uL4p˯ ?>bV9 Ndp%Je)s7Ofn+EO*3b$N^9-糘}:~~7i5Wg6տ/?>o3 [W%%2Η)Sa&LT'jMh dw$걓(`q&Ѝs{$3I8'۬sш:4XGK nRӑNs t$P''NU"8Iaɤj9,:NbFmb"0vd{wD>x% 25q]ݷh!5N7شс k UEH(yCN2%1]d$O<2_Գ&ҩs2497iǖy⥳B:겵K?J=}7:t"٩ +M*]AͽQd:?D@^_'$W{8;<׍1 4 W-nI@cϤ\)T0ad)ㅧ_VNg:JN䄱\kVkCK>y7h`-}`D$Gi"n<(G[lrF^V(|޼<?(syvS #MMOJ<;tgЅķv7&}þKD'mZc- 脔_Nj?O,x 3&=Ohmq~GcN-I;aO8Ⱦ n,کd)ih8b]&&ixP[cc_Xρɫ/ჷ}7 .>}¹+ ȸHثkqT_"]aJQ*=o]@laE]ude sK3H:_a/><)=Ypr8&ePymcS͘L]Sjgꂲl$-W}dsZv7FX*cKӀX ^mѮ>p&L_>qJ 5HV#/mvSA8h+{G;*A)m97% 1x e{"%ccwC(آҢQ-MRkD/!mmdOLԱ ށ(V؏BS_:VL<>#<ƘqԆvwq|iVK< bIОttYsO_:y0G_U4YgbȈ| fD'aόإ ٟ@=s~xiOKI}-.j!g0ol_הzL= 2u#L"n ~mzNQu ϽI2k5˷SlhحYB7/rJBwI?zG~t%wz.߉5k6.V6~ ooK=Z^-Z1?t|u"Z n=ߛ/_7ʻ/8hh^mz*ʵ ?GD] F8a uZ4nƍZ6܈3&M'L/_ftWA]VZ}쩹|2o7_i q[P1|Ov~-~m?U5|;< 9RU^@IDAT h`gwsSű(mI&2:#~~?_q+f6*e7oolڟeyS2I8fܤy&)'l"~FW'2Wk,r MX!v>j7aX㹶eIn0ɿ W7Uc`eY$,& } #ǼӕΩVW81az{$XMB, ՝1&E |>" Y'7]|Ps5ql9& dUے<6pr5x&%* "'}$ +qBnoNpc2t},}r},܄9byA&cW"d=:!qcW'B_ogvL0$kĝ6wŮfquyc IM'A~Ф'0;Ʀv0\1yter#I0RUKEJb>,FaxMA%[~"c8_WӋ[a#sΣY)txI+'4TL$˴%샹 ZpMÓxž-o>2)sm}\Y ]y(Ne0x_ŋv6n!k[_Y`'3M!2Yy+_{b5}xQJ~I^2g^³MbM.@I2^AՕjLAU5* Jc|Xc)D$=6>R=fW)bWK,F0~hvvVPCc<XED&Ү;m*=[DDr1E.ֺF_|m$ãl'Z0ȹ1Uy DIjEy,ƛCeb :C>zVh3[aڍ,=:W=u+B|{OIR|0|׆/e8#y~ύXOz 27#Rd[Qfr\'R9Qڋ5W/(}GD^ipƋrA*Ƈ#ꍇjӢii m߰1.zvuBڭ&EhUG;ɛoZs\.3v#M1<G 8v, m'v~ȯ8v%rQU]aZ>R=-xo;9%=t|v1<?Єvp<6kŭx?m /m8 ?c~G?,QVa!UG*hd /鴿e5* !2X :vnLSYQll"ףlj/ YC hf|f\qm6k,־lpla!FqpWH WGzXhU ~ ӆ?q0:D=\ӉԪqeq_}{=EXۮM|<֥~ICؖOJ͡{seuV:؅VyM ղX/]@V~UH|C-^@`::NXk%V5q#V#7"!cFW|w"p9ΦSoBخp?NY\i|%;c '5kkSd#ܖ?nVxc§զ/InY= dn;w?2Oɽ8vmNwpy-.N~O3:6&oZ0"~%9 ]_[GlḾz[*33;ok7|_d=\er'Tk&f8NLNuUΧ ͻ=$ɹK7d"f&pmJԓp>M dIaLE]ӮJq-&sͤ0&@2?'l?&ټKR79ڽ8M^ٺjY9t@upT@4]eńP 'MB<#1Ѯ3q\veLbɾ=>UOy `)y6S4#h cRx %uFRj_D$bz'Ê^V=kob}n,Ȥ4N k]dľT(&`>hgv']nX\zt?< :~||f+a/aowuMN$h}A .y$tJpIF[ĤoR_<Wf$Ǟe$u gLSC}HGm{IsB3%,@L ;aoL`ŏsJ[ igĎrCUiֱJ*С DL₋HGѬ?6ۄ^$6GqO,ꠝ3;TrQN#xfFƩ-C*׳$.N"gM9{YmdJJnCVm-Gh3I 7hBc6Mf8zx7qopȘI_6Y]+Lj드0{\#An i/Fx/׆:0zږ198ҧmi%\UqC;2l70c^ד^rsCxjSfmnRN\zg^$q CUz+Qa*ԯ ̨-n; hwl72?^gm*B\StSګڪѾ7cr]qhlX%-1?d߁C)1kGKz+ Q__Og̶ *abNt}E*|3\xB|n;v[}:l+'WF~ⶾs96U66Kb,M1Df7|&U7wo.]tSZU?Qml1nruU%yWkqÛ:;撍2=ۦRiŘhӧOPmǠ"z<cYkցf+I^aqAOLj\$h}eJ?XDΞ_3$ qdeWrz[9}t_Vu`w?=Z|J5qPk=ݞ/<jh1"doŖGM݌l ڹyJf&zO|Ӹcwy!1kL޺~5-{Oo¿zZ! cRn}m[}.З{^qz^=k>Wj۪DɏI[w08m*Ο8RjJԸba?<^* V3mm2]scL`9l956ji,~,9ŬُO/+&-,I W.|[?_/|߉7''pP䶏rSPWx˳C&rQ &/5)*$ +n2ЕǤÉxWȚtɶ<~:1@p̄J[zttDrow[ad-0w,Lt9I r &@]iBx{w7Zj&#0L헐ǵDϪ- z;rI Nc'!}?w=CoFa~_F6Iym+SJ)8KV vB|$4vY-Sf]tfU8I ,hsR2N&Xqމ'@@H8su3E'Պܕxӄ7BTb:Oc@VWwcidPޛ$G'71 kOvmYl`\U=I2 _}qed7rg#S%_eV1H1&#KjN$6#2#|fӞ҆կ$6O%JPeMV+e/obQy@HL`y z%Ю$zݘb[lp~ . LnҰ\0~ՌMR]_*%IQN ߓE]E6KE{J0qw`FƯFO%) `%IcE@%4Uc 7}%+"XVC'sLOV d<~jl۾+[i ;kz|u,Jh ~هUZگ'(gq!'{pgcxw_}g8+ye)Ϧ9$K ҌWzrn6Á^۰ITt`"Fi#\9$62Jq} }>-o06us}QX쉵q\-!r}xp@2̲A۫(Tч斯N'XpАEX$29;-{svsh&ҟ͛jp7Ҧ^ږ7/+~+*q9Mqzź\ϵ7 zG$zy8&o7QxnI";Iӣ7f{gu$+|{Mz-_˷?K16gڏIsDAsnӼ1X (X6a"'vY9׎ސ(UtЦs^D?ӯdKlo+đ6~!Ts>0IUg HG~ß)Jv7=:}ZR8G&^}4Z)TQdm+.[].m ͥN)\⿆6iD{Iz x>Zq]ۜbr.s+M񯄴ʶ?Α遉x O Oݣyf -)nhJ*"u3LLFDI1AJV(Bp_ ֭Km4loEdjtZ]knz5[ry|o O1xN2Dep۲픦0hL}4彌v_WU<϶qS[p"_xJGifѤ K'LsdЅ^F~]udF&۝>N'&1+2qV ,'`s>@Z<6yL:_n d/<ál5ѧʻ}9='lGgakqG=GUԝSu`gK{ծNy7!ʬla+N]*9-=?KJyo{VՏp'M4g6pbXMf/4k̘\ }oZ xvʙӮN&F{)Ni#WߵGW#/=`;p#C6} dIJXxBFB;kr`db]tmrV.%A`kllUۥ8q/BYWBqSBo$ UqNo]Q^Ed>Q-J_0n(&Mjw@$vz 뛖 1죽VG[O T`}^-DEZ9x2aP?,hoUONrc'@+7ӂ° qsb=ı&|Fzeb_#zO{Y 8h$kniWkp_@,uC:7^[/}DR;U~BЯFň~ 1!]Eq#"¤B1wx6:nK?]zwEˆ\>Xl{T> \ij+is?qVMCfOtvsИpa_?5m# hpOG^&7zе(&Qco o*P NpkE/e;oG%[ZX%Lʭmc0qR讑>^6_FPĿf)8od?юh/^e Dn-\t[D.mB{s;'Vo:+5osυ-5?DOۓX==҄Y/q;#Cc$@'okb=@˵vN]R|$A?wxEڒV͸+O򈴀w5;緐Vhā^>ھ[|BAt(]Y(7jSd%ƸxhZ(0;.G1Q'\ Z7~›ǔ?aeaJcp|ηw_n:9ȣ9YW:"hhI X[y#}/6@5mDٸW 8AfX0JC8v? šĂh I+t41 g'L&[`D \'*MZD:I:&h,trѺ5N9{҉[Ww[wf ոIf?Ac<;se\Ed$+O<=+%]$mici=P'n&(cw屏 37@MjK#wjW'S៉AuX1d6C `gK6w/GOʗ D@ِQ&}Z}fl$-/|)'p_+/ ;W22^}&$_>Χ\y%o]]PfW["b|n< Z:v<򟏏X|U&a}n$ o.FLGzp)BJ$ee ``9d^}wIz'7A<{E/M\A_1)p_h'r%nnj.}FxTgdKoߩ$q[fFmMd~]3W7;*J]ŋةc[q NɣLMe/I,s-R=G.Lq.6~Uk* xYV'a9„ZV-o*ZJQV}uѾ0#BGXcqʃǟ}ix77+;o pѡ|zy32/50 `Vk+\m'ZP8c 4✠cSH)?-N؏9ʤ?+f#yhyLKYmVC떺3+ۀzܛ8uyZk ÂJJr#%[C0ʯho)2r`A7;cu)۸vD:ӦDG*ЧX4c"*^bJC#ajg Ucb*g#e_ \+s1669hꚱmFݪP16ޚ$EJHyFw~Ɗ>?iӉQlmV~՘Gx3uފ1Aky>fHp;d .pco5ƫh]KgL#5}Frm؅'?]ƘG{7gљON=F&|$ hr%)ߡy,'vsj :0{n]IZ:ν 4IT,VrϘdgLv&ܗ&cE2wDId:=7igބ+ms+3vTP4n&C5o?xf-I?]maWċ1YmWxOIo"J|;.%`𬡯xm''Yg=rCP=ѦWdm@xNL~jo ImrX~#9b,ѷpD&a6"j\7F;+s=}$/lh*a3A~NPp6/}9ƪU^zDWF ITQH(#6A!r|IOf*>$-%s(6xj6OfJGC{V9!ԍQl%Rx^QnaTE}as_RqҔji/!E}MCOް_Q+.MD*L^BP ؼtGq_|c}koĒhP-_-R/"8v1󄲟g cۿpOSyw0.z!XK65V!OQL>qlTxϼB=WH;J%+jUBUvΖJjUmӶ64_5 sFfRrhk7U 4ثČ c}%ޗLeOߍbL|j+Nsוm-<^G:mfe>@tykڎ옝j8ir?A(o8&=M=qJ9F(h&H&#Fk|oݦ= ۤj]Elц}Y<*>9e6 X7ݟ/;d<-V-j9j椑Fs~Ur`[7c$xNĬ-?"{EJ7 m".|nWLTU>]_xۧ3S ߻,EM}:1G#|&h=нYϾnxǧ'l4rov~Xl*rZҏEta a[qogScs i>}y39,<ԝo_+{N=>c:ۛϮ{w ˯{[[t{ne@ܝD6Q{Dc!ΘDO -49"Jq' eWmcXW6Z컎}9rNJx< *1N׊igm2< U&Mnw:<r$v7\ɶVL'"{>v݉e'6M#=Aȉo*6tX'MT;"ٯ%\D9rw7#9hЛVeI}}5 _LVِOm\NzCEjz5]CH%X>n[_ȷ=Ilh*c=:@G?<\o ةlq᧬tGTݡbĒ&vpz&l L0cgeXxjFح=j݄: Qo4P_㘕aV;f2Iad&\$tƏEP}*]7}МX&7Dĉmĭp-4S&q];38q xPv?y i9p(c9َ>+͉ iӟIzw]Sѷ=hY}^R[#LcC^RORM~` څ:,2U&bKe7>7F.'4V}*a\C9ZrPni~^deaqxd/(Ĭkx򓶘!3J`^Wʦz/c7xъnRxS;Y7{ȷ_)e+rMA p!6s8ꟴNjZx2x6+hF>Mmg&Hd\D/Q7+f\]0&y|g PR*.JjS-ƨR[wfu00y!ϩ?yi3|cx巇'?k {$4q9c_W!N{3G옛coo{S]ɯls`#ddV.vPDZ<Fv/plbZʆ5GT!ʪVm+LglDq+F5c"FkäBkޛNe+mT7~\s)_E͞BlXMT`?Myyy9khxisGw_Iʾ2^Ne(63cm*s2"Y(W8tlN ['lIQ{Lgt2&Lsh9aw{8rBI<5$LOH"_W 2:ywU81/1(wrӄwhš=^4E*\*V"Z$ƁKcPehUT'0QjhO& 7IL+ a2'\ &HdeW;=[L*R |IfJt*T*]#$:}yؾޗ 6@|U%Usʛ #7>bby؂u&hזyutbA9|*K;MՎmps{Cwߧ䎏 UJ0V&2g778(i:tNF9p'T/Ų7픬 D#a=4'[2EƮsuyn6a{J*ZiF#/կIUG{[U'KrE؜}4]FXw|Я&k"]hրݡgq^i/R ۩GfZ^cvMxU=e&'1U("ž _Vl].?f_IjҁDzEp/Oi@"x<Ƒ.mGO C[ƞS @6jP "6KD\=LWGnm8wv:-,~U 6}M;t%8c6?9vܶN^{`lo+^#z./HGFuG{5> >$Ǎ~g2>5v,q>O8~ᐕ~Kão|}8_ap }eS}CX7OrbKeNYB⇺l'IHrZ׸ܬ1%F|6"Ku',:6(ۍQX'mc[-:H2[)ڕD7=QV_k#CxsX(?k4Jy-ԽpGqL$bd("6L䪛p֫ۨmȭ#Ҧ>~b[ي7=&Y|> {M}JWozcŠ]q8gk}lN,؟3%m{ |>VzlP}KymB7"'-~>TE~Цut31+p^͊ϙ 8ͮ\Ԥ'y6>u@gVG:Si PY~÷ O)[܅2ȾWMnڦ;ʽ(*Qun /ߠzazݤb1dڮ{COHO&r^u]\uzJfw$ OPN#?zkxU.o瑙'2u劬zm'=91AOΟ#!۪r7*oFQ(WnG~~}p2bSeU3hP%YYÃ&y>|$$]pvtٻyG1&N3њcؼr`G6c3 Θ|aNֽ oGB0Io)yLR1U(MWq;c{]Q< (#1;$NM,ym_$%m&brDE&_i&S&>W@l1j=E3+a I~q CaZ'U&벊:xr ݿA}dԄk%+LDib?5q0 a!J\' , Nz||8|v5R|BuˉWg$1a)3&#\n.@ܸZZIDAT)t#n䶾{|\$d`Uվ^|i*q]sbv+\>6LB_Nw@t>EIY_LjhSITO0L'ơ-|.e0ݕxPO/M4ݩ׏R?`{ [\ >_"N% o쬦Q_i% ,lL㖝$//y ݶ]1Ǻ$:Z"34SFԖk7Zʮ(P`(}WZi|α-{f? , FE;ƶNmh`c)&04B%E \|+KѰ14@=䯬YF],bf@V!k67!uf^xQvau̸O~D.E8E{Jntu!%{1*Jd/u/$քN8V6Ș(Chvii#4A8]wt-ܖFC:T[J}@Yny~iCiJW.Q9?qlTGzy ZsxșiUsh^!<ɞ1:&Ljo !uq| 쾉vq] i4;ZFAhms}ǘ7>})#zs'3IO[^6F[gڥufX;SP~XC_%1]7]m|wŵ%V^۵)Da,?+ ι,͋nPF"M)M7꽯[_AT}['ɳn[eoF4"F˦>&>)OOnb[ǭrNvCrsI\"!}RuƝ)MڎW37BN7hv.Ws"|YBr秇~__~5lǯV+|X]GO|损o|-fd0EAN1^Wn{I_ >yDrx{xBB{?xs6Bb;\d":#d43ky: S:p588vL8GK'H?h&mIp⎎'/G:q3&c]m@(2;^ؙT'Z<''L]vB$1Hw&*}&}Cn"FwY5 mt zGq솁b+ f\]\ ؚu?$N-$zOVYe?$1MFW&楛g'_u>GTqgvTn躺+ ڝVfԁS܋D,6y]m@/wR:0nе&1xz>`]F>t@|Bcy<6@59]#l2 路1fG#̢&x6i$Z!A};u|֘4Ftϊ3o ؍L@$!n7uJcAptlO1Ddu8Pl N-;q_dNcWo6'}>)vx}/Q;%X$tE^QdzP7Q&cD*>N2LlH>zwؔҺujb[zo \*yv~S%1'4&SJT<\aSxoa#P}diG\/89ƫj>Z;y|5rd'|䥆3s)1>8G>kd8Pq7zΎ:Yf9y<͜ޤc^yyL!$ʿ>?`ē~0~N]Z㶊 *ܨ׭Ϣg)/Pvty{!.} IF0/՝N#Z7-=zg<z"m?ehh~Nߏfo#Jo ~}K~z<1ZK@-\Jiz'`mcS }?ƣ=?|ka ?s춳ʴi<|~meFW~ٲWH^:ѓÃ2 $xǷ>`N`h'|$4gLgB/VIldIX%D V&gbф O~;#pbկ&`D&Ϝ']jQ# y$2yD$$&ˏcGWXEO'3&s(G⏓G܄mniKmNe{ZAW&εP Lv̍b-l'I ysI s|:4b`0?v'ч$Hq#6+|!| ] oB#N1S{} pb_:<ZLCdWV "}7ЇDbH YxWcBsqMP}GPfe Gw CǸS6c 3biLH_kN6Hǽ0{Q'}u[ecEMJֶMsەa'kt(b e/*io£݌>EE#SS )ƃYIGZC::i\E׼-I!m\V>xG~^ßTy?4M_Sha,M>r\rh?(3dhmd,4~6f8S~mUśCܶ$G:ᕏ ;o;?>luf$L1:,$x6X?<s\{DNHh#8>hncTt朒 ^[tbv$ \hw AW*Jň'CVb?i۠plI<|jP !mI!D]p~aD(ғyk1\v@PQ|1Kx_ H{E̓dߙ JќR;KFKȢ ꓣEkGJ@7蠓7oVsa%F>M޿J{f;\-B|*)׮yB BD0uq+7k\ovy)7m%W{>Sab)?an3ZW6uȦ^÷m?*/wo'RFp6IT\:4a^>L0cyajU]h-]cv]l밪m#Xێ1ҳqX_eC.cҼ|AߴȿA9{є2זlc#L*z5Ţ+SXێ< #u|A=UISӨ:Ͼ,Sn %9nZ5}{__ؠMZ Y6v×b6]V^+u柮6vɦ\}<TuMa8.m'zMۗt r㻄LUs6vڧ 66YB&ez4R}Kx5t3uڥf vF$0z8}?]|+%&dzߟ&4a/5s\1}^{ qo5NOɩuzC~ c&]l˴o1?|'u':{w~_9 O g]IӼϤ<ϳ!눆],pg; Yw,pg; Yw,pg; Yw,pg; 4 8>Nq*L&D`"0L&D`"0L&D`"0L&q}孀J~6 kߵnuQm:L&D`"0L&D`"0L&D`"0L&o wE֏‚]|ƴe"0L&D`"0L&D`"0L&DGb#7mjScnyY~,;KM[M~;vD`"0L&D`"0L&D`"0L&D`"0xSޗmc_XK7ο ec]7cy,oL&D`"0L&D`"0L&D`"0L&?<ܵwοv=̵_1djc]cr9'D`"0L&D`"0L&D`"0L&G]_Xv>ǐc:C;~H)K;ZemZD`"0L&D`"0L&D`"0L&Dm#6ZC{HY׵Chy|imyhyKPJ&1|\ʜD`"0L&D`"0L&D`"0L&DG(P279CزZ^˽6 I5iCZr+c#έ?GLKY$|w͟&D`"0L&D`"0L&D`"0L&bmtJsNմ˯̇XDz>,? %g Cȼ% =7k&-oC[ǒ{[n"0L&D`"0L&D`"0L&D`"0o<uƋ9[s[>-!d>>̇v.JCYw_oʿIϞm?x<;cWO?}u'G 6u\mؾtoxvxp˃rKW/\h!.WƱe#Cliqut.UX )Q{)36":J~R5KlP,.VcFRY"`z)ŨIgcgppD^A6pː/V;JMS.\%c3_1/9z^9{l.d |ZddoӢ꫈ xe ޔ.)$Tx:t:|DVڵ+6jmd{h$D0'P8VBhȘKPjNkEUc+D%ܕCO+[J6KeݖU!J4r}U#ODsl1|Q?|J*E%a8&C{6T$_mIBiYw& cҋ')Üb{6Շ!}rƧnosjujEsJ'lФJ҇7Y.'Be׽\까G 0+JR(?;?#ՃE|o_~p;_ 75FBx_Mo)'oRIg FDnȆ^ Rml!wNãhmP<џXGo͜se\.Q'\Q0=/b XedS st%N.Y=b |sV$:Iˣ>?l jm2i)6&x?(2Pcp ,tQ(ζ5G̨o\pciX1̨ ls|5}tS| 9.T#A>:.婡,4 &S"jd2ă*bcjl_ȍ6D_q2m*l_8<rN)7^h߄2bow}ogw1*7׽&n05ej_lc^ee/y%jK?O|<^mG칝ly߹M›ji߈94K_Vk7OV52n\w?^?ioKݖ*]'MzJ./Ǥn~N?|[l6[ g6-鶅8yS}_<>̇j2߃!> &78 gm}z?ppt!!)'&.Y=C"_^qs.7A'T <=D2Ͻyp%a7Wb0gRHNp(3y&nF- >$Iv)"+o-w2މ+E@>SA8dʄINB`%ǻA+1UsgOq2&iMH<)gTq(NixN6 Y-NaP&0SdBŸi0CؠMdf-@ۥ]*Ć0߈mH W,:Vn eT37 /նR3A%d,ƤvW(L|mfӆ#a?v yu7~Y!g2IčĶX,m8 rO;9E D>EވLDCucL_%kX4TQClYv %e4zqĢ.֘#-U)QR4"u|#Fe\HN Yn5.=+&u&㨣\9d&-ŁcP_6HV>t1'<) u`"r"qQѻWlCy<} %_1+ab!edؾ)ּч>&޵ zcD.z}7]ޓJEWpFy NXYůuVb$`duɥvoJDp.$6cjΕ](Fm8>a4iDIh?O򶵸n\hkzGƕj?&Du][Ḁ{"I=F+a?*Eл&\I#Q>[.FrDG#F.|^\KlLe&ʱmÁ|qPKe v2Ofmv)Ȧz+̀;is\e-BIG\Y/o7?x&Ee]`F>_P8K|9ėstն`4 ~z5Z7YrƬ'Ԁ1S^1F O<ټ8`Cą1 nZytuy9!qI99'-7F؆?79$2Ͳ!I{ 5#B^>rFj:nwcxںuɆ/DqR@`t,s>a sttt9uZyV>+›oγpK޲= Bȇ~X2 w?IFK GaJOp) ./]|+QZ$ XOd5@chmi,O)cH8bd%9rS.y˵Ozb{?u8nx{NOպWrľ]iTt=m{Gokz{/iJ稌aG،#N#*VvZߌĢ[zSbS>!yly6n-yE+ 5X6 >Uu KG8m`„[U5y [>y4W߬&zM3zŏr z);8|~͇:|G'WlJҭR]6l D$IQi3 A5M|9=YskֵOͯmEaa~[9݄^I%Mk o{_׾.qm7k5mϽu]qcѾ=/{G[0淩v}TvԦ_-O:^'k__oƳsseexm뻊=!/eZi7WzkV_ծm_ך?gk^mmMc[q}}Y[o]{Z__^_xg'ݿ O~o9熍ץ5(Ѭބe܇e!!dzeJ7|!ci{W8>O͓~:x`/N?3YK)s}&86QfLlA >2! ʈ $V!AyVic}miHǡ=cj5$?lؠ~)ĿVkulo uր^?mZ)UVN͋Gԙ-k,J0ᆃ`L1C<М`dPJ{qvqKH붗i3vdha呿L.̀dӆ^ @l&|t%S6U6AЃGi~t\^m3n٭I?p2Ki]P#⹮_4EHHbH'8RhA&xτF ר(<=K:#Uz˜QWßI:d\İs:TZ+ǧ$YQ$)_To[[+W%?mIapMGJv"< mV$Zlicr21x lݤf<"#+H>I%SeLߚ!Ȗc&v(1v|^OtuNZũK~˃olk;Ź{ӑr%REx0K5jG|UܖMpף'b=8'D/?j#Ǝ1'pKՏ _Hҵ]>RܿGVP Goy , ŽGL@ me\z ^bGyRWY\:`}~/ܶ 7_b.yDkX6&v=M(ֹeè}pr6琤l8" L(e*tUImj"b肫B|S,/ʩ6!6b0ZqV*|X;$,LF1??9-@\FeDjM&jƁcAb~mW9N?cKtPF}qhb0E̘Ƃeג77P&ܧ }ES-\&)ϲn1ԫ_liG@1B_O?o|w?}䣧>i|~7_]n>:?fe#7e˄]ګs'Ja˕_m2٦Lk5[Gnf]ڮI)S)~ne}Q%_eYWBO7ɓպw GZs,֟fk_3mn}Mϙb \|9Z k}R7o Dja#o#tbb_vXsu26O?| "_z#_0 .V;X0K92&$%; PTL%PY&n'8(|ث5R9)}D2 GBjENboaܜV;Qs&3R"Vg6 ۛ@haЖ'$OW vĀoҀFvo2ܔT8e"'iuɣb(h4W=1Hp}9}WND;s:h"A0v`SFd eMՆ7P&.1je-˶]WRe6wcYAFcIYcrbٟ υ6" yK?FRMUWq%XРU BpTD6-x1 l$IQiQ1QViW^PxIWUJPb$*qD۸RjRȌ..gȖmg!lY׳!8k1&bm`Rqeğe#wsDrzu2C*)ce-Sͳk> J_Ŵh"\c +`$GWad 1BSʬvF@߲c_L'n=Bsz re :e}E-,%&F_( ,S7Sr3!^E~6Fg}/N -9VC#z7qI_b>D #>N'6ƹ )xOkFX?P=8ܺ(_ڔ|۲C^W[i']iOQS R;n6H<׊ܿR}CeAڇg뚦iOFmx l?7J#وU[?u" BB܀:ҷC}]u+ e$ܕ"(NvmclOȫ`a < AQFrDedSLmm|ߴo6`rxSRPjE^\BqU9^F\olI -qr^[ue.׵ԐE>2!vQ7Z=q rb~O7e9e!S( ޷'Tb2<}ތf2#1vM|69Gω=DASohp3Cmbs .cb۳'n'>SuӧTl^AßFGuzj=W,"$oէ,"xx vI`BCJ@4V菱Cܮjy, 'gsk8B&~~DmU2ϚVeC|A{%p̸I9}). zw }ٸF+62)>|c?e&c63³ M$*Rs*쮍 FZv"^A]Ұ brd i VLe|~:wzhlK9&eËvk_ ^!<ڤ}ڠ;,٘3vʗȩ: e.m)h- X6_mPqڧ#=]'{\brORBOۉEvnb+nBіCӆ\:JDvcBo]g(?P\P ^Q(H i+}M򖐁y >8Z>!> _}y?=Uh˥qlLdHhCb\UB߶e[-ןҘ0[R|ITi,A|#l;j⮲R[NEǒY+tjn }&z_u*ڷt 4eM,] Vz־HݗVgk֞ڋ뼮ZZچŷůmYxGJ9><| Ͽ%޷//}k? oX;C^z]175x_y_sc[F/]yYw-?{ϛ~fWU&>dŋlΞos?آ!>)5.=?_jެ؈iV2؞o ^Y! #"S`oy]mY1W>b|:#/Ir*߫SՇØaɎcDlһm:esZ"iPqc{d5O&1`6t٢u/lGBoS6Ũ3c@ٝqd_!ƖUۇdvwAH\c͊}d8j<%l.&hJ v-sR8ZFAR1|YBJ& CdSW:۳Ӑ檷2>O-euEhkUye9Id'"2b#8?`ƍ횈CKxVuQ<4Kp34@қıگS:m5 ֪[VyyŸTm-a*;cuGgf<PƠtW}&!aA)r-w!"PsMv5 ?!ݣ$TD6 ))хbb8T.pMa6>EapT E,Oi;dĿT;PyW|*E쑙M$VCY=Q|c,veyT1bM:<*~ˇ<7;S._?EakC|b$>S[)\ =ީOf5·+T񨴸fRԢLٖg rl])M YM5a|])+3'y.\У<ǒ'xq*8beW\ǿ~曛b˔36aq|M 6#;Qq; lxqr3QlB;qw}O K*9Mϟ3b@6,<˛;0}9rSx t0q[kA֟E-0}[ Ku';c3X0u1h=NnM훛P&´v o0f[ToϞ%  NuͷV.>g~6-c=H9ra@z4l-Yj&(8vPDmC-QMZQ'U€Li:բx) <4(1}s%5Nqb!MQƠ6y.\lb˫PY1)oz,2i;b%cBb$1a Ӣ`qا_֛.D?4c'6O_⟛t~m)IwgT^B՟MJ#y1C{Dei҅A6y f++ri:߱eSGAj߿|o~;W(;7'M'72WfM)hERff4Ue^CǺz"uyeChǢ69C _*f-3ߦeZ,s|°ĕcְ>I׵i>W-c\ Ko)u-ivF1бޑ׵ߥM?n6H z*kIwbm~%uZ[.[Ӿ5W\܋I;V3 od%E2~\گj/Ux=.>ry7&սU.[[Mfj͛p [-eL2Wuw_T2z+gl '?!n;w wl?&ۤ+ބ&;+7ٵWzm#mϸE-J9wu}"9 7?|nwب}nL"٩qF/<\u5R>A$Y M5heP&{(!ӷTWtx|vrɥ99$<ˋOD&38W}xEYU\ Wa7Ѡ<}LX Ƿ\,7gPMY/ mxi`"6ڵ g`2-dbCo*o9!˴]yXIcilC!McMJ)^2͑?I5Q^Σc+F(,AҎvhL(Ҳ̄W D[[UE U[*DZC_to7z`NSlWNk.l=c A90b}hweU7n43O.v@Cil|ɐT21ʃMK#eS+C[E&f<ͬ$YLy[tEayʎ:R~_XWdǏ/C"?Sn{ x5GS5t(?n[|Oſ$y3^g0> JSyebz.}>TZcUpL&dM%Ko?־V{ y')M*\8,D<uT#v5_3iLpI/:uoЦ6T6Ihgyd*Bƒ2lj\(-!e(!_^JW7̋:e|<O{9MƁLK,Nx{Aze_m%!)YEU'ZvU*r!hFU.jh$]fP"x)EةOeTm1`Dcy𺟶<'Y\6ZP ' j# _:X =H<~X<ˠb8귰,׊atuLd"yfcv@oR[;ĒX &ts2Ԣ1H T>7??_"bF# 9j>O'ў׸ \:ΆdKn>cP|olnAzeߕyۇ4Do^M6S)}7#v:j3īb%_ ]FWSD("5bK.bMrO>rhn=@r{ʲA#X;dP4nu1Ψ娫2iSIX"b9Jùگt^Ky"uaѪg`c'uC=dȳ>8u@624'ܱqW퐉Pdžʅ<1s0//`:Y3*h([ȗOd@&P*Џsb^ZfȲ=|~ "YU$lO.y8T87TRt^/Kn>替q_?o7_.m\7ݲ:kke}wْU[.:/Wj4KwVJzŷ,)=_<-cױhϗsXjs;]k*7dd/i۶eYkX/]myzlj#潞wﴷ]II(ַ,,]̶ֵqw,e)承<@IDATen; }qݹ]YXZ~Yi2 r)g噳ntښ]Κ*]{PKQem_v龎oʖ֗5C,[rzn+m'Ҳu[lږQ]>s0oq5o>>?\ߥ>?r89 Mrokc$wF !s]&rs%O?o?g>x6#m[%|+WgKr2YiEOLMyY&[aN9=ptB ;>BHY9sg;&NҸkMS/VaR4I?US[ۯ#%NnJl*RoĐʿ4XF,#0؈_9&_גm@4_oH HL+b|c` OmSr.ĩ78m1}Uvkvjmդg2l M6p1 :޶#6ds݉zSMq+TW <@h1hf{J`n J؏l0O[ȃ: -rNRuo;.\*Ê'~]/ʇߔM)V!Ӷ,w;MMᇟ/mcLgb3{cuiB^%39Kv¨ xA߲G35#V+UZ;dk-;9U~DM9rrүumWn?tm jћ7 AL [S+H8J3P}uhsU6Y|9Vcc+Q h;[\ǵl& tA*Z%WٱY91c)t{+m'Δ4y~ec3Pp”Pgijrwm ǹ~*6FWu4h}L@2 +i-}DjŤZ F'/-;oclw1e]RЄ|/,{I *x]tݿ7SxU]J,TC6G;oxQ gݱeZAu|nO?V7N.J1\kܘ(OB,(& ݚaҷ\}ҹhl@\h{6VAajw)zXiYmk\WץadBTwq;티(?9aWȁ/r)یRS"FYŰ@JɖQVB!և\[$ؠky#>#1b!cԪ1^vY*\*,AS W79XeXm_ }x{wOuFIOdo_P~\X~3^ [/;v6^:/'Ie^V0}ӎcVE*$7vټ>;ݟk9:z .z+ eU$%R`zF', j*, kZ5{0^^  l/Bc}}F/mʎ-ڋ.c 1ilX(=qB@ & b >h?'-^J,tCĶ6Sկ`*-.朐eDX^! E_=zֶU/K^_| M=/au=K{<6F_]ӾN]껅:v0Y|MU=Iw]<<ǽ^=7-wٚu,הkykիyC<ݵ~:Կx,{{O]~oq[yMlvZt,).) osI]A(c'{JCKkuZ+XVKOs=áuJve-}Yyn{ZFߵ~-}`ilPY_9|/_[ʿb仰|`vmh.iMt7}x[ƍulH6MdܖM ɟ8?w <۵ЙUc||vRߏ5R|d-t2eYTBo}Vj j1 *RcUR pdBB& :23dVk.RM쀧ru}!v8 ?|I4lYJF 5iVd0p`0JI2+&!I̴Y^M.eMNiTpZ &KDyQWŵ,>S?Gy* o-Qu5V3ΰ61ך$  <wmu*-oNjmm_([ gaEmSbW9bЉmlWAG"o)+;"i"9t5`CQL"^e'uJCCҰ3Ɣ_gQŐ+⪽k9Ů&>UP  w%]5ec QDҍp )[|,ڧ$$F\i2"?dHR-&\:48| v vA AipgCDdIDcEd)xTL(m}髋-_kAv8PF⶯A5NZ_($WDKlyŭ$-_ W3RmWpU6WZnۂbBXх-Ɩ68 N2/|R2ae{c(X܃8麊}A)Rk)rwU,7^Rl(H~=̽ \ymN*ư1$@n+EG|x,YSLnPfɘM@.:oVS9^m8e,Ot]C3Q[m#Grz:$%}1c8`~쵌?`Q7kT1Oܟ8Bym)C P]a#F`}Gx ƛxàwޮE,wM.ү\(`1/oDP7`±HTVv/oņ 6Tvg@^S#n0:qvR^kĚ%|$ʢ7[9]h[ 7~ϲQ]l0Ư fm&,MCdž+wQp.C6<ۀ/gXѷl:\BFlAJU.EPEۑZvO[O]#mcU`_ qbQTڴ%?yA'lQ|?Ac-NU_΍>O@?"Mca 'v`"*I5Q'@M.̸\,}:U|c+ C;h}+9mtևS!*[稓8 ~uLy;rO`=tM>'bKW<m*㦜]uo?2Qƍmùj݌'3s+uGeh}Va۞id7IqL;_ô!r)sR.z8ٓO5/|O7M1n*qeU XHGZEǪLVš()kLk&)=d$7VŘw8Co*Ѧtktl5u]6-(_ >FZ(SNK[#@}W]eLc%=ں_۳'~d욲ٷkÊ=:%^}OCrϯ}7Ws_'c]*^uk]]k{p?_k*>QJ_O_A6Uou\)r0MW3\wS&g?j;_zߧ.H:^ڑ/]޷n?WݝGv{^[/>NV[+=yz7P/oW7oc|z Cӵ\YG}xvmJ}2nKhxW|?'ų|{sw2b+vM dz<@g1…&+e'L!\dksM%=Ю)e;1\x@(4ixQ?2rʂ} pMaQ:(S_޵Z&t-_[GeTWQ>$6d(E[TYNT8qaOɆJCB-Q'e׻&!6ࢹ8qqZ<-悝hYv=Sؠ@ZyJ/ Rf'/U[Z2Sklo 1\RۚlDryQ:ĪbGyƳl.DȚQuQ21|`bc}L8;)[Sr#ZWeJΥn&cl,ê߿66$ k0tikv"fׇG l˄*/DXeSd_Oư_R9o:ƻy ب* <ʲZd^%T6,NJ/??% ѡY 'RL2!d(t}ڲ䕝!GF̕lZ8 )&. ÜeXg|;"]L)_j+G+b\(iZN0%(? _՚45`o[M5dn+Zn{U}8bj0q:C*6jWdyّV9/c |(෵A.JrtSk4v^O}e@x%bʈF荽EIl4VFRUBlSz"7*I9%> njJ?rhُeKFj#e8./ kƢ|[龂L%FeXgs%.ᢱm\(@urQ݅ߎQӃ/IM9yNͩvآ܈n`z-os].!FmI5(9vaG#`"yŪvuьYn;6%'UטWaR_Sl)n}wAt@\A'։&UxFcO)C_$dQ{0b WrЋqE$qNl4"9>|aD۰;;̓C>1Cx{XYF&܋oe"FqEu@nΧu\wE"d5(.EcnpK?㛿 'lX/o>`SF6 h;ZX'rN9ƿF`\Lhk73|mu n&0U 1^An4vcm{~"z\_ػO~EPk|C++Ifqq-+ؠ8|Ù2F_DO\=b#mȷ (2$n~R`m7V[۝MT28"-#OLFhhlQA*?e;h8Dmb" #p0y]/Ogs.Ɵp,69I=K۲!Ii|@qbLU%%0QF^4cp~B>7l>&LR}ajGiK:RGcVZ(&`v, '?{zT&oDG>[,W}m (;WK/UNb8vTeHW>S|^<~\o6 b-|+x^_UiG<u9ж3ACfK^uD ty{l?'چ9cB|ޢqvG}9:=^nC6jm>368'sQ^3Kgu?׆XeJv;@ lkkiwzeђx-Hz"m5,σtCZ,Kv77E_AtZuǵyޢ,&7zzmB#im]5ww}l+>~͎S=̮ufL{Ṁ){yyᅯ{A^fjE)_zew*V5>fvk|Kn}1!Y(-8:k^nPk-:W\մV_j*9o|dc_{cwzg:|zwa]/󷡑t-ͷybŠPCC pU؞D\=P$O䂒w҇^$'_#,O p졍I,L<8.L~;uxF~ P䰤.?<{ ^3\~@'{-J\1 B %RDRv'+}2'lBF&"E؄zuqatJ˦^%9^hXL+S;J]ۥp,_KEa ݞjAUV>q.BV0Ӗr}:Z8ɔ L&S7*J*];mAYg<ĿqF9온؂6P6-?IpqVv'(`Jʕ/`TXɗV}ڍAF4pi~ʉ78!+uC*۞BQq&U_dãN0.`rz82 XN"ɕAiKzTD|*ģdmSKV>P_m4Djlf rFE=_JP'o)ȩ muD{L$g ƭ4BF=2$`G-+lK[g5t:7e1C-V J gzŌcbV5OUf)MDPP],Gkԟf"s M`@rIH1Cwj:EM!fosԄ" 9nUG r1&f&R|*mz+? ()U̵!?5hǰ9Q^qkJhƁ5QC}Ȇ#MB}9ub*> NFVEzbj4\\4!&2nB?B +]xcY1că.m(غ8F鶼E'"x{D$C_XdbtC/6t8iVF )70a!ҷWt6mW׀JVCc \lLhuUFErLTT9&GboRWmff24}J_#j VISu}N\U7yFl"yl5mhb8JR a ګzY喿sQ_ey}B~݉gǷHW2IL!M5j[ז34V 2RTPUJ&g఍K ; }@ޟ|qɻ Ч*~`3M,D^,^{`ٖ(lͽK"7)ڱ >1Anp/??8v㍧5$*2n];5?+߈ReG`bG=e^DŕkΕmG8boHu/ Sh>|S޲qa\3lɜsꠘ[,_U^Vu}]֔QRᎶ$-o” j@庬_㺲kO~K7֎NGpK-wc+74w1ڵ;}l>Vmk):CWݕ67;ɵl}/Kzۺi^I..{u{8_׶^[ֿ{2>7ogyn{.%_:n~}-]U_ycrIJ۔tkx̝+7g}'˯q_[6{7*u=ONt6[bY/nkgZW߯ƶa_>m-ɸ})&/x_mIKk[g_'Ӿ]n|'?>Sksݦ={p[~W[q],in:M2Ǔo\`U򵞻K{uM,w>o?o6ϚeCL86za6™&-dRE,+_=2a8 ]25.2̕N' !@E=r2իPџѨ'nD1,hd2W JҘ[NN~udAfIH]ΙdӝV֗gpϤ\DGKLVF;յY^^Ub],E€!+--v)@D;yyxRxMBjR'ČL'3ԯfl\; cO͇N;+7 U ćDq R ݑqWnF> !4sB(\H_6IL*xFRwmJ JwO]7ChӸQ$#ɟ&/Y؀&Ch\t*+IW86 c;^8aG0~Aɬa8d1:bG^~>q9-f6L|J%c|p0`PcqxghR5Q.iKIz_I!aQ냯Umm\HDW϶_W^ԧ[`!gSVEYU`F?F1#l )Ћ7ʫ 4I}MSe)L(w]CB/bŵJ+X9?(qy?qmM㵍yʊp̾-5Rx+A9/RF1l'(I"w0e=ۥ KcEu%)uUJ=ƧAl{jfZ+=1&l"4EiW+' =+᤮r9e*TK~t*K'8fŮO&גkui63 _ ʵXB21OP":iCLf,`} vm6ǼQ[Oݰ\xN#X{_3k~vQU@ tTBB4Ӎ"!T)\ZI>t@"BrPUU~35Z{}+cw^e5s9^}71#k)ɧl8ucfr#[6I[y|@)?e+66<®+n?F [ӛH/^xcHb3ō<?=lԕZIa`lA}†6BAXIj f}~C~ ߱)ݫjh-rOi9t0ܠnp6m6;]\l fm{-:c!ič3$MDnRɔvLc 5h;IWex0H˜,6 lA:_bȜ[bji[b(<,Q&oRo<)34- ]ՄӚl=)EVz&~6榣/`gy5* TӠ =Mx\9Y4Q-/ C|O/FO[?iݑze/g/;<{ھg:7v u"ZǢWk6rakzfRf6|7=zFK=&yse_?|M֙gtcM^~eϋ[6E?{ux_ڇɫw cj)HoJsSʷgo}.WK~:Y߅WZoݬ'k|oͷ/~O٬abż{;Xu4xrS``,3_S~L|E.[cVWkFwpW8 Q <:bXX$$N.'Oqdjɥ|%DA\,,V UKQ[8.zViAnKbiIy! ܛF_u4Mu:ڦ rN;}CtW쁯%+nMGn ½|.=A BHoLBZ{ڐ,)WM/HYce}=YbD)SvDz2}}W?z%VxļZl\7+~ȯ~#c=cq.zڕhN.·o F(8$f.VdځŘjk|ů@-퉜\hh/6x}d\"lEߝ_|]&˥&(Q]?gW <5էΓҪ!>!~I/]OT6EC*4۾!J?6K*qc|mn䪆)mՇ5Rl)m{^[ &}9wޱ_۵K͚XV:gws9bZ֙u}@YݖQ;g˛e=R&:s1VS'W+s>o@kz~36XyE ggIo;Ox9|Y kI}iGlW^(V_S0hG Ԥn`cƚCzt:&}bŞ#򝢶*^Sk+qȩ8foz0VoC;&=ݰd m55&y_ԧ])Y쪆5l1(`uOF3\?g|O-7i1kO$*qf`C.hՈ՗-OvjB}#rqbjWO.Z"U{ßr9ᩂq6&l7^⳯~FC."]PױP1&6ʖO9X,r7?5/^ 'Hov円GW>I7l3!}bO0n<'LHI daG-|!>$}:19hA59&7!xlҠ b}yzOYd~"MnQYst7i ⦭-C0Sp}b;Vl>!x &Uҏ>͓Ob ċգ ڦ&`c阑ҟoa tlyeϨ7&}y [}}u˗'SwLj6SW6O1czH}dF` M\(;oGGb'Fd_\Q'e#tH^d<5Et3UT[Jֆ=~| pU){&EW+m/uI|*@.L!9HM>8bk1L\!Q$`?^Ij7I'<5L նL}~QM]r+J?_>@J';zm >)O󽗇}F![G mO?zR|Ұ/rhG=kϤJhڥi7OPX{Oyrs1S|Ն1'9u[>r Qkjdx2{L7+uȼdk xH9k]-K׭뵲- g)V` Wdm-}J\NZY/utԂe{>2Unog8|p&{M"ܺM=e=KӴM՟\P`<:õI13k{1xvxWQuauL{2:'汯bL|ƼuV>OC6u<86e{Gp6i_]ڦ,on\C)>ǜ}uW|zk&>cm5)i}SKExk0e78Nކ׺ީԕzοa9>{0~zZpևm͟MҼ俌\[9rc=?~V$ ZL~'O>/?;O6{ӓd0g>Un췴_f~V9m]xsbヿ/~oן~?U|sRqrer e/_$:s8eapeEA&gr S2d e6k ;|:|pdSHb~}?9XYm3#O/caޔl%G1lr-_a(1-iHLjL~XwLm|9KL.dҞ$Xôqv^/c֯͠8p>@pSD,! }8vImRk\QsR6?}G՞Jʱ)H9CyO& MoZ~-s #bϭ.jzJmоbgȥFV so\[i[SW72F1^lZ5xSn<0v995&4 9_Y}QQωKjYgZmY`f(Yo<:_Q<y*O 8aVuחnŒ}FAFs>U˽1j&OY N/-+"#/75=Y _H˫P@IDATiW=:{Pj-lډJ<~m憝6mgJ zB o,7yZMcE|r]TSxhVwy꿭Ib6̣4~]* O h+g_ꜭNӏ(F4 :CkɅ^Tl -RF-F|#thz%꤂h_E]~6&wI'9cwul3Gf6@Yǘ}2WܨwsAj/\Ϲ4p>yYy+`<:358/hD똒?㧏F^1܍/Yox i}Htjg#ǿ''MOxOWK6}xW^|& =3 S*Lda |nZñᜁ7_~چNn>SYMGć CP}yk{oשfx~{2e<HLq=>#q`9lS+?CGh¶!~H{*2vK}/1"]~Jܨؤ^6}ϼ_!X~pTfe)[g<G2s&9*_M=8E~qɸ9'y=G}ɯ*W]R0w?mR S@MaQ~}MI#ǾH8SO 'CǑ_kM+,FȨ_1ا>L q~w^'o_߷5Z9Qj;KϭPoIR,niX,KC5ýTFgSsν]Ss^ Ͼ]N%K]{}[y0'pno'}9l_*o4vM߻sOV7n94J7}~􊭑KNu3.!QSYP ub*aeXF]gDqz# JH8HOTFy"\ /<Ҋ W֘$n,r PW&~!Neկଘa'QA5;WzܶvēK-|%zgc[ ^}=\2-3ۇ0QR;sz'ss(IOil=1*kbT+I%w1*197 l1xe3Gj-O؎Rx?jIO8 WtnzY"mAK$ÞJescBNyK4Q#\d&ghiIP*~Cf2-ydi)s!FF3' ͐㧲rqOFor'mf!_e!Q^fWb|87ahηvck/ >7SOr-]E?`ºl"J4e٬Q Ts7Lk(}ހ3MK&>]\7ǟ0.!}lh))"lE5W~8 #ņl&@|ǎ mm۲\?pcק(x]?| +6j ϟ=;AAI yb 4Ox ]b$1{7FKl`31`񕲼3C{/aoM br8w7_9?=@sMna,dƁ &n y ~2D??vbOyOe\q(T?Y7<)$ C6ec?!\'Bym6l77{=IGs6'MeK?8TqucnRƳĨ!O}I3m"%;#Gl0?/2,L[$M.ֲo#nٓ6?b[߄N ɨeBc"A0^OfL3o]Ȧs;d9'?foޥcP!9',o~仯?m)W)yB|'}R vi_(É٨X݄MFcH@I كvȒ^W.+~7٘w] i}{'+A [|=RMX8_oҥUHlImsy17snu{]yǶ5VNOтz;*N:x*gO~׾;ooXFSg>R?<7[O=#{WeVWN.5}d{mV#btx`a7_Eo,lSj~vRrOJ:_^˗XL':Iek L.a'\eibTbV NK Ss_\Y`.!bDnu uQ'z(x]Wqp)W2vslTGbҰ!9 Ksn;5 ;ԗW4W?1~.;"ʠ'Lꖿ{?"U7 <ħ rb3!uGjR*-jo۠?7jiL"̲c/:mCAB|,-s:skiVVlR'IYgL۱6"6Jm0@Ә3 Ώǿ"s3uS0&mY=l+u*tmm8_^-WϿ<|0yjcA7^oy"tnyl␟>_) ̹.˦tca}G'H#6TؐkwFEIb=h8>&w_cb} 1^/!><'Q|C~yOGlXx.<}Gv6R}lEaq?u.7yH{s#KVGVd !'6n~O78{b߱GAOR~)nj0mJ:>Pf{E|XE6? ]~P;Q%o]Cm/Xlc^s?&F@;d>;q2l*!DvMXvDF?8_vǚ9? ŶV01Fg7(sA'*3/m7MC&1I: )S5bVG~Ź}$jxU7Fc.l]Sz`ڑ6N{%vn4C^G7) ӂLJ~ru_~w_?{pS` Q;\OroNb,7OYgдnKiQ̡R'zts-*_ƪprbHߗ-Ф}m1YQlXy Zykk*)M^ZqN]kOŶ)Rzi &6X{ھ|_,ߙo-cu,}.3]٬ 쒜Z5Q=rb^B<X:s<߅_ VM:~CxaC޿v抑 =Q)_,}G7=jy1X moiy<56O.M[OgKgy<~idg_Z~y}n977Z-9Yg9 cWƿ(G PjAh?Zw^zsbN=U6k (?Ywi̙7[9QoƾE1MliU[OHm[(iYi8` meOGlpcDdfc{-4ooo^rMoVkx 73?1KD)/xœ'<уx7FL\pmOl}$9Bb"M J>#}:7b4M6K>|;E<"%}˟yR#+︄. ])܀-lҷ3aShj녇?c&' y1fdF}9]0V-1$(X36! |?$فO֙[t cYVXu2m+`$Fʛ>TYsTcV3Jyfsl yΡϻq;~%\sFv hN*c/LWytcnۗWiNM*JsٍnU%_7lxu9|M_2-yЅhnJ%}_O%Wn2ȥ8xS-\+TSS{&5}Y Ci|.Nc1UmQϾv|l57Y3<49jv6Shn6K/}b)T?XFkieJo7$9yXkoSN7R?pa[ld._Yk_TӓFE}^?4xXޛtO^׆w7{l(ms|f]O(M~֏{m2JZX;5}jiT~h6>ߞ/O}[zͱr.NhC\<4mY9GiC/m;mtohrM977M-UC/Gusl/ms}i}c~O)5iz"4O|yGHyK%YzsV-c[6yMڮ9u^_sjșg_\?R WObEݖO?y}W~经~o=H,~a iT=Tw[2ܻ ><{{Hu{*>ꭻT]u>~/|[WX\r!1B.Tʕ/|Ks5]s/~V<0LJ⒪g`f E{̇ `:m睅h}5L:/0wh(#Fa</J&m 0cx&Y]򺨸bd+/g?jmuCM.hg횅 8/,yq.QUHv0[6srsa*7nA+_5w]YsU5]+ƑvSdhU+< AgK.7sv>xսR yVYx6GDeߤ/wiUe&6_`0.`%6ST?-*}ĺc30< lS>c$u{8,h-OP>]>DM$W-j˞ٮOhS-3Rĩ@J/Y;rrE@Fx.#o)ˮkΓekrǫdeN7&X&2'hCmvFoI;"{ਫ਼I]3~҂Ys$CK0(ӏdmi)} {ˆI^ޠp̫6:91|NнQkn ~IKM_r,G*uYz,[ 8[֑n{ 'i_| GL :Tca5un Vf\DF²c 0}4~o}4"\vQ <>~/9 f6#џ=Vl~92[+/· <:sq&xsݠxc;-?NVkI= [6d>;}§Oe:Y]04J|?M3 9Ϲl#7rbh~4<;df5f#ty({)nOMX 9toatFenv|&o|B67]A@Wo58SRMB$ ::!g:5aTm!G,8@'R;D3FrV1FmyX[5Oǂ#lL`7ߦ8E]ɵ~yZ(S/h6WǴ W&mn*vJ Ou.Omo+ Gj&ѥy}?o~ g@l|-Odpk=7'ngmTa +ٜ7tVU=2vPopkA=<'Sd3+O@"҇q3}[>QTH6jmx7T<&ϿI"1 +DK}1[_cw8&^H]>ȟWW1t$郛Tv7=ōI>-OЇ׫ ?,1!B|V;1DC2?(ίڌ\9oSH6mϜ@g ^yzl@#K|])H#]NS[f=OHb/)) L`LAXχ1X܁Z/K/qHJ0zDD;炄NnG`Y^)Emhs6`}S?0M|Ubf ǾSg2Q#G}p'>9[𕏯Q qL'G JXSƹ鵤=GJ. .I虣bimy1:*}ʛ/m{h5+L]vЌ\5m|;e;P1v}:A:wlmO;ͫ_WJMyGrN6+M}dtD#a>u'sn~r#/д#ljO4#%ύI{]ܦ{4<\{ھ_=ʊu>_yadEcrx/ؗGnOۗog3yxѓWw-+#n}'h};;oxX J'1<o_Ob<{I{>|/ẑ<|wWIƫbejv5%:ĕ<> }.-A!&z^myORvq:r=mIOUHmv;n@q`hu|tvv:@Pͱle}i*Z8\cܹvDcSƁ~S jF^ҮDI ~HGHh1J맍3v'}\K':V<"}՛Nn-GP=ڷm'I׹ZHmQ&S<_'Pޙc2Wo1gF2Ubo+Lފm / j1tb2)$p#yL2[O:ذz33D]-SSf0dq G^ bK1|Y7A$([ @^9F&uV_ܰrd޴/z}[6f7r鈳$ի⼦.xy*ov_dkcl;>o摥>h~ݛڜMR\|L<}KY0P']@##-)~M/~0ƇN(EX BF֪5O{Mr2"O25v 1Nm=[qlȵc-@P<`֤ږ~eY mbn遏 F#>Gnh٬wOܗrC[<~ 嵽mݘ`uv|vk[z ܶP7&O*?m<ݴ>lް407u60!Dr qÇ}5una|yZ1aʍȼy؞`~6 ܧū!1G>.tO`?s%o_%I a/i n.O@NyFc 2iǞt +?$v=OU*bs6sӗSpo߾Φ+qgdЎ4yӧ6Ǹ6ssG~F}ƍ/SO(̆nGl+1&}0fČnv7DldTlq._B!3~5$v1ee,C}RM6=OĐ^{YG?͒~ngN~@+605vQI$xzdX))x˧nRaq%k5F_+n11z321]bu6XYVHsGتXv\7xREZ&*S l^ioӤ- %D y062 ]n2No!><|ჟ:|鏟>Gl'|VQ"7 VtSw~}Nx`1 =,Mv+m{Kc3[6gnM-Xl oul<Y6ڛNm| ̍Pz7DV7z6Juxl;& |¥t?g{?rt>տlʩSuϩmog}cʓ}ڻ?[2Ӛj\mϠiݽ%[80] 95̡f~<푷W>e^6#?zERDnQ%ujmy9rk<*(/1Zot^in>6Բ+-)˾8[|z. qSk1)k|u8<o'/~_ާl(NӱodtƮK:|Gt5]/]ew[Mu/D*_?꫟_N~KC("W. ^*DLjΘLO9I)ӅYB#saV=07Q^e \ bL1Zv"*O a xؖķ+bdݼZ֌]) 谦b$9_~Jmr,(%` /붷u/vNqlI m2/Ŕ{;ezUP)N7sc! ߟ>G}_|XeFueExxAT).b$HL-:Oٿ<A~~NiKԻ+b?`iVշĘ.æ}Uv'?jOuX9~mLmkJ6 i扎D!)DTCL;&ӟ^Q/?xilט3Ma;"<yW3eKg[og!*#_B OR)k=w>Y;*1`WdhK@†Sd%9};(ԾH^Z7e`6]h/Lhϲ-*_h/ퟁ^1t>P{i*ոv~\'_ǦT@cǃ `])1&yfdVFMLkU霖NIKr#e_YHͷO+|8N_w =Stl(.P͏>5:lAhn>p$2Owc #C8Œ v_J&Tgn~Eo@3[]_&}>3WA?n&£o߀rG|KyƷ_c~5>.+|iwc۱OMSߘ 2du+)H"BΩo:7(1Y\yYЦ'8?i-^3֍8bGh'^ >5}|6Q~IM_p~#Ɩؤ/ZB-Z(!8=m?%"}S8YK|G_xb74yz?I7VpYPs(gFS8♛EZD6dOxUn gJ|~gO(c6}௛p!+~:lqOP9M-&I4+O5@?c"ܛ66Glqa8m&?vo?%ҟaz$ƛ>`@ow.8  4nMQZ ^6P23l7U @78qo؛פn@a`7)0SYF8ȸ!`9ROډF(|@|? K0+^i^wh,WN{_Sl@*c6{gsŘ4esl[bǙtrmkLɉQ2רrc_vZ>QaD xj_2'_nRF>4*6n"k:OA>?Yh J-`$LI8.+IG}ţ'xχ?p;'׫÷?<|ᥟ'UCЦdm?OSg$:p _)ӼgaX-85[^;tju~0ny{ֺF0G-{5X-݊mrQMP򌔖l呟ԖF96}{J]E/v8W\ )GX[Kw3X7s]s]ڸ[IݦZs8uaZ|C}A[{xaFc.]? M=c}xZ:/{ϔ.¦m~s)u7s9l[Iٗ7K{}y4ity.÷Y>O:`ϝYطKum?"줷pKk^MzϿsbokWH^?ZMT˵cFnM8CMiz@IDATsy$D^w+1r֎S΍_]F̼[YW9Pl\FN.rUķ-ٰ?Gg[Yx˴6G]1=K@&/b m憌Uo9IV,W"+_ 涣}_Rr eD;(euܕjmVV=žoY"ǹ>vLJ2ޤqDhYmaeUm.첯cef=MI㵃,[I6s냂IPM HБ|ѳNcվbl:-,7(M ;/l~~ (| 'FYdOMy!-k( <8)bM)^KSM–RPdj7~b -cy-%=bg|B:}[ӠɛL-&Obc\էn)@97hwևSfdoWGqgX4N֛{"s7Xk_!{3PCfF7CRqډ80B@m'r?JN٢YzCULuNt46dW{~p,Smcc-ۡ'-Zb+Aa|pL`/M$/9PMEPd o͑IYAmɗ7*R¤gfƦ<9)BJ+9h^jW[=p<:2'PCŦ>||cjS7 ETUnfnI8:3AWw%}݉5+"5gn`B OY6Ҷ܎N71$MRKZ_C_+^~ƒ<16Hgw4 }?gjb[OflO78~W>i.bf<*&Α`2C˶l=Pn? "'+ yC`8dɅzj @Ȫҍ4v~ o7k.hѮ6H}K_\Rma;?K qc}{$fb`slyjFSG2I~N$xSW\$Vm(nbZ:@Eʄ4#F}o C,kb'&`. Fivs1F٘1~}<'}+5g\{÷?}wxk(.?Ɂ+Ӓ^S\=?fG[`"[r5[:K??؛ tz5cdy8.ֱ}?ڜZ<}uUh˾g圱c>Z1UKid`%s><([.m=P\r놇ȿhͥ98:Elmd+ٳ(4:usoEjcNKYے~KwK 8s^{c͉)Zu^XoOmY7n)(_[Mt^vc0ʫdq1Hx-/+n~q^.-p&Wjvo,08_O~_Hc-ҵly񜧶|ٿ 4{cf~_1|o~_u1*?_UwϺCsN2o_e|g(1u1rE>q@#] {u%1I9 "~iOr q ,9산_Y(R'm0doF'nesB7e(ʢS2yF- YHqЂ nj≱^,9I]}OF4odq'GE4~ T]קd e?zjv8VQ'V.JCf14S6o`_'`ZN߰x53K~oȧX+>)k=\io۵f#T]R||OW(=A vy}j߁->][:[Eg%T?b4C[i+qKYij}2~s…_;Iȼ☱f8%7yU9}Tחmʤlm>Wv;b6 0T8xHck ۧ8+ۘVf5Q[c/하)PIGu!g|րdf_G&Mx`XpѶ|$.v\6hLVױk\@k{ Hg(Obs# 眥8A﷔㣯U/)+f?H1n(yt}OxyM;TD4ML=ϛ"kwUl~+)c' xLv}WX@z=U?ì5DgT&Idb*߱]~4c1' O;)I޴;㗾*O,cOTiǀ8̀Q狶7d< ^Si;l/zŽ_)L,ʩziScf$y롆]m!¶>ɠ׊ 84aOدfcU5+w+_:np omЯQljp##f~y^n'|7alɣԀ!)z?Iی'Es+/ٰr0g#Op/C?unMx>'ON7?.s}ܝ l11;~SқT'r=C~;J>{{s~">7x8O@p?S$mbˇe+wj *ho|1Ȯ1ba}dɓ`GiGf=6쮢=ApD?;_/×|uΥB鏭lr[`io]jG.7gcyˢYqJQb̯]qz~z<Z{3}'^ʙC^WCg[jG]a_o+|r2S;(o[Wrה.ū[^ZZhOS R}mq6׻__A}.?-Ycc;}lg{v3}ʞhj;Mwt^۹Od7_og_翩}06lM>|vh{+<<#/}hMSM&sSwaZҦ/9=94m;g_ż:\Drubuk+ԨmEki87\ڥ͋3v(5u֎r폧ek[.M(Y{5о{6ϕߣO+NZd"|] ce6 \G#WR|_ڷyߗ3>Z?ԯoc_,FƢy9o:_}ߐ#bQwimYϳfUZEґ² FAР?0.A ܂..-!Kغ_9{]x_1g]V!92e12s;q%הRcPh"|kluPH ,_ePa< ;qȵ>_O0# #r׹Cnu]n^(ktt'{E6r>(b}zes0{ QpڲmXziÒ}Gǎ"'ia,69`^fKG)mxRQ cG?&%i .JwʍT Z)쨳~:L+FG.‚ #ۓ W[ڲB6/D(4f{P!sj_=MaHJF&C_Y*$J$Y -F0y"fLp /,%6EϦ@nıe'}n" 3I9IH!{& >qטǖxo^2~KeKߤ- Ls73b -]?wv^x&tK'裘c*[G``(v_}ULڻyen g0nT5Ү&J3~+Ԥܵ5 @/t7'SbSxd;%B+S3)%i;210nH}j _cc'a{>P>{?wca23y=M wx7Mb\slgAT(}ˍ,'y2?b\8?^F|+~'\"17,.DV.⼀u^<~{+*H.轘= S-ıI2ۖol6Pt?N&o6] Dr1q vER?IyS(b=G!"X.8_ʧnyp੗)-džh#v2c2J%wG/XpqwA]P$2#7DI/kǤ 'dn=pY+TsɴS+:VHQ`d||ɻwK[mdFz#^7ew4ِd%p^=r {9}UϧoXt;9yޗn%OA<S/O>4!ovn_KaǟlmEoxeޚ28U oKC>#s>F~uc _H}|#uI6~Y>R}."ܧv 7vʏoq~y%)>cҘyWܷݝ?#3g68~B3›GTfU;!ළy(?Ͼwgy…} ?)>\C{g?G3a0MB z^48ͣ&aa-pP+ :I .Sm, ALeL$NwX8wGLr?t106!Ku:(@GI {R.؂2脌Lv;m8f [bJG`R+D^Q8E\2үFZ{JG;щ%y~u^}ۅm2rPW\Ot@O!6`cʵ׋oBƏ#\=@lqC8qtRELdm3tlgn1ץLq 8o&jTJ=wl$M>)3ʓLAv l3lmBkk=[t|6*o m qSzՁ uo||)߁sa92:ʌul-M(I$}6;,eM(+m/|b-E0[.liYP'^LWNcRC'L;,焂,)-QVSZuq.0.rMC+gpw2PYb%q9.#gOJBn+dmyEfY30a&M13w^Ӗ1 p!bS)O|܎i{bXPDA6Z|Ƕ+<LʄS̬t$k26W"S0\گj94@( o[X"W%(˟:vf{/a;dfB ﯔOgU[?\K૱iUX'Iau‡iI\&F ?rϭ봏ۜ]cGXtuIԑۉL1[8׺i$zdZ8DNk=ނk m< m)xa &P?- ,s"WM\z&U"YdX\M 9?w:pIf\` Q|SNUd&36YD\#4Պ7<=ᄴIy6,<7&l;I_ݟfN,.6]d݁" X,X`7 &ms$~U "aᇋ:!]6[EIC|fF" 4>pPi`dA`b1|]F '{)-_\tU,o/#m {P_¤-> Xs觡oL+qa-8.41vGHd!Ƥ~ 9B/.C3" 6m-k;\w-Åð7洣+eݥD䂋B \>;eVGhE'ٯʖ;Sx.f.p '( ~CiYYddP)M!fUH [W}`CzN+K,hP/)vZǗ&k8$(-q%Bƅ8^~q;:P I7% VyPag=tRKkIm8>T+=w)AY}% ,,J٥cԐYFw e3*Ax;?,N;V MK"".}mGҰ(Ħ56MȬZ[~aSns[k#[_;z_ E q /BjΦZ)gke*׊y<2,P9mRĎSjnkhq{q޹GuDz=r5իMZ^NSkѭ4vy-fԱ j{P6ЋM$MNυߧzk4mv2!RS?r-a~~GaR x>b!S߼ [#Ƕlfm6?&̤o{yc{7Km䷴CkcTh=>l;e>Sgt?~XY3XR/8[4W~}a}?x2LJ-X~hy4e)O՗>Rݯc5ܚݽ_$~x%xmRʹZ#ʑ,āzYlsjkOb|5,!@V:Qrn)~UgE)=-j_R9q"uç尢6\nq~v^nҦ}&ЖrDuʵ##1ߔSP9Aboe L!_jX7pP&";RN 5k;ThgRi!d6ҷ͋uLN~F!խVH畻6[یW] :v>))L,s9 pvq'ŞY􊩼K yɵEn3I=C:9=őc&[-c>]0T~' q6#*u$hW42Gf.iM)a8 A'Y IKrd>K>6 ./\"$@KJ_ΜWW)4g">㑨dvӗ)[>t\U@i (E|y-ϴ>Ki02vvpʓk"SP]TQEϳ)qZ; c__fo\[-dS;YtڭL]g0|-FiqR`.1AWZ'\!SL. ֏.TaA5J/_a졏]"s^}_yO$.^]]b?lG`S&? 9z;t龚Ci,rx T{ŋ.`W sa;="27΁ywͱ%>f,nПȓvWdGpmcƚāf@HOB c&vo}- 򜞢kvvx3lkJ.V,t/ruɳOω>BQG.kc o ?6Ɵz^[@+}&뉱Գ[>Hd|k߃-,B7vo:iPww$ն!, >1NiG.Ir9#O 97ޓOdi ;"KDž[Ce琅.p)쓲f{Lƴm8!?]E>ԃ +HB<")eޑ$_v^krIR c~ց&GYcP( AeKQU ( e`eM?V@{w7oXe>}_'AV/јV&'Fv>@h9L\T;O5#ƘF5n{B So1ia£i)=ޒm~y}kt*4iWmtV}z֎M 1GKl -k M_c?i[LJz>}އߗ^O״j>(6_9 ޖ=:鿕9W=5? J?G?xa}uZz/5M~׿u+3U񑸓_)YS7k'W**!C֭Mm~u1,UtߞS:O9?-@=)ߧ> P.zߗw9O&}nsOuc%M23sJr=ϞCCH/`x86hj6>Q-a/Ҝs|?l7 /~|)*(6m|.~CEܱdy>l{ǍS-+-׻ٟ{ws_*#(Eߨl,3"=~n 3sρ{='=nK98O)nqL}wi>4;`^^ }`K>mKЉ[J߁ig)<g`-hw'UKXl^@;j>VӁA)dx&aW;9ZR_U{^[/ )e`Q\u,䔥rQP+lGV :$ ܏MveHW\ H9vVmhp>Ơ svA֘F3&#W2nJmR"D>BKp.DȔRդ۴X=%gr_4Oai䑯qƟp˛ !rl9c,L.Gfa,ƣ9VJ@*RՔt !b]|ᥕ#B[RЊ_"`&rP4[e vҥ|a/cq)PV"!ifl]0ʈyNi txHOaHꞳ*AdyPS`}\y)}>Զ0PJ3z}R[/kB,iSʭljUPȁkM$MBH\'b?00iDa4FN}_B9v:`H8U96(>c&K{j6@DYhGg0th dϴ2q@N{xBٽn0g߱t6zH~ 7FWe/gچ["{dC V)*Kt䅨LS8yIELj,yi 1&O,M}T)Myίʝ ^6Dyi^ ~LRydq&)W'qbژšO?%&TrRwxћ824`fQi5ű8LiR_$Zb'+C7/[^'\TZIm;+Ƞ*O0GUF%6Z$'%+Vh'Z:*] -1X)ϭĹF[%.RigS c' B0C7^,OD] GeIUwt8J@ >aC#zK2f#OJVS:H)"?PY⹋]DL JUϺaNoIBlDlKqO~ݏ.?.*#~AN3+nf !_(0޿/qz6|qe&]t@l IΡ1}%\xv~Qxt"וPg B>tq =o}KSK)`|NLzIv OmdR_} _J-:_wJWw0sY 9x"8$^A|.w߲اxqa|moQ \EIޅF'jsp^ , 89.pJWҕ8 O:8!"}] 2/v5VOOQi\V+ ~}=wzMԮ[xy9S)~WD)ڼD߽<}{77v/ݿxY>HȻ??E(.;RU|-36*WIyI۲m~[?eW|xV<w巯aWór^͕V9,&_U- %X_=;mWA{oaz|&|<qd=ޥ-޶)!!|?= ǔxCgyg[yUڤ{>fof϶MBq -Q'CERk-n{(Wף[%mnW-k.i)eZ!s7?̒Wq}r?}G^487RUb!r`{6CcʆO|{Ϸux=PqLS0sia[/i[ͷv{A 1ԧ񇖏"~⫳G_1kDP 8s֬ρY:84=ϸϣW$z`CZs+ ,pT2 zA;"<@hTMNW_|ܽwyH[>Z;@漮*>"L :QD-}{$Cv6m `9oƩ|E`r0 ĵW?\-l+-21o:")G@aJghp@$FYx3a!1ҳĀLŸJ)[$p4V8 ~/7",H+pҐ?i|htk]'C$[3kɭ0rwPL,?ؑ _ ka'bjib }X`qYTM{2D.b>rnkkm|XzqalUw}ig۹E)H3(Imҵ=ff_ե6{WhOzmIRO zF'~gn9juɊвP- cM#^vBZ__0TN3Kr>vmN1b?=1-K[_v\#АQ'!ҐJ_|,7NƮPw}m, ]Xxve|}ar,2EAlQE~}Q~ڵq@IDATW; Gƾu ڡ[#q.D=*qw'̗6A#uш%]WfSy>6iSTzJ>"2/{5r~*iuQ8g\+@hI#2'?R-]'g0$kUYq@uN$v0 l[G?6EH[)I:~ekro<&{?~lwP&TIypn{G$T`\giM+EO:x7ev؆/^9wK,/RBwx6<),z}sAeb7Cx16,TgJ'5^-0\wcꄉ['U.EtOmY,yks!zwq/5~"?uP$.< (nk4F;@S"K(?VI{5<`rLd,?8^?5zei|P(=N&]ڽRwl(f~ݖqŷ>WܻE7`7ƁzhFO;y !܉NfY>nIs ~ʄa$l1Lx? x V(.q$ubYhۉ_/}7)7GYx7,8&=::߽|?.صE_%q"W.jpG l!mz+W-L+v1cx80~5./X@u\(B#/KYv9rli -xx2~_ލ8-c:niAiҽ>qO&#}e0grWtUVq,Y6(VmF9yNƦM<𵕥}]-~Jb?w?~ -ulqsےixwKH3[]'?ǭF迯*V)ݖM; R0=?srw3H%J9O_z-ܴ~>r=f [;ZWk׶8#ukzv{|H֯48`VF=F}Q{w_1KYl!9_[J#gVwiQ)a;|⵭&Ϧul|SڲV^+c"4 l a(uSfNz;JT6-ޖ/$IyX/#-=&vw{%|x 'O}wuƧؾGۓd:(+gM`MN.x& q:Xј#&1 ۠HiO |/o'I2 L XR:Vr30i^iN}u Yd _&CI+$JZl&`@*Bd|x\ݽ6IU9j]R t/rT23#@XlS c zᅋ][Ak;$9%lhzB).d2Mu{J?=wB:1b!&.bZ(sߋ@!Aa ox~S~ͤǦ‰ᑧׁ !5yk{˄,¿mIDuj!Wf2ɀ,؆3n;ߊw:QS.m'xoV]}2'Gjf+:Z58}0ɄSf,7V&.Nh? 5qBXğ\$WpԴ4K?"ȩǴG^D'3rk :q焳Yp))AccWh,1Sy}JJ^i4s?E#%)6tv~ 6 X͌Aly*;[ w2:9c O\S+8.܀Im+x>!ņ/dQ5 nwy+^@s L>bg{wTGbEsE4.,Xu#Y@XM|q ']`+l^K1E.P:g v=qqz۠_}͊sKi;8_?b;y$D_[6Y?^?oE+NJ^F{1"MR,\bH,J @R E}vUv-d_%=E5\~D`mG:)<8]gF.I]`I8ӏVG+؆Ip!{ {K4.ٓ2c)%O {t ;УE77gv\7{{8)+ O f\f[o^AåK$ϖeSqJcsśz)ؖ jS|bܥv_J_φ!b ֒kڀ>O>¡OcbXj?|Yj< T*=\YjõΔb{꾮c cёl%yST|kb1(y1rV~dzS{>8\}߷}IӞ}@bϷR~=G#S)|{ˣ-Js+F9J/Ϝ-9\Oѻ>&&=GIo"g2&&FmC$>~:||i޼?{޳֨#˖w4V| P~X[{6!wEsc+֏<+}xL׳者81;#,o -}~g[}}(["5Y6az!nK~s`>~d$Xz} sސkw`|;6c̎_ȭ9BʄdoOp mͼYb!_>/~wDr3jC] ɭg)_OSi=9{_wO:@M 3v5Q&mEQThe\/4A<>jG1`+BZ: 2 J9pcC<Nbw@~rxa̮ (K)P_i" 'hsl@g&tS ڣH1Ēx>,e[[Xmð"jSc?f{GDz8X-x9ZG aƬ_1E8,W.QD~!J2Js 2qp!n=%d ɋ i7.Oɦ7/_?0Tݵ IBXx!3)NHFi%׳ȋ}DN::jWyEJ&zRdDMSO v~d7NM{-/p&ye@˷_6+;'m .'`W}.P'/Ǝlc?NjggSP?c xxn6T}@x-3}&k] cŘXY6jqf裦 t0s"GNt3 $L: -4zH4e'Ʉؑ[E|6n\,O`C`QZm h;;pTN/s Z."HpmTYb3E7+VQأ{|H촵3zkE?ڧ/1U<'y?{|c7 W[:[8(FRWڷYL?86۸iUYĵﳏӇԅ:T'`ЯvAgW+ ':O(u}}wib.V5ࣣPnezc6uw']D&rJ'KƲndZRpU@ol `$2tr7-]z#zmoR6!+M=4J[9 jGW-vR)rўk%~؜Y,%dnP-RQu~yfNlP/y-Fv\_s/_1PoPoꢋL87Lƞ v~tERL xϮƧ;qt}ʢ9n<);J\ .|GlaL޲`%{ osĎ?'9.;WDn3jmsi\uSJO/_-8!"q`vzNN^3 | [)З}yin@6bp#}k/\X4q}^OawsܝLg. ƅhY i=,kYWж!ȱS;7a.Ĩ;>|6p ܸXr>螀 "hpSD.ɠ|ՓPm Yh@彺}(=e9M>I>">(]ۜ%.$E s7-6KXGW׼>g]O~\} 8T_A.8e0ϾQg~EPζk>KQkr49_T&cW؞nCorJCCܖ̖4?Ѻih=D$b9Ii [9?k]ژjd.O?ay/mrZ]Fޕ.FΖo?VY&Mԫ=}Cic<8_?%jF_:B۷\mXzqL?gm+OӶ8?!oNB?o;lP~*7eR{9c-t_a+/V&zN*-+yei'?lW9_u|{|\Z~7mYCYO|>Cx+}k2}b5XV حuCZC^%`8 n[$n>&6xbtcqlxQ c+Ⱦ߼IgWnvp=>z.<3Z ]8 !b޴=S)+ܴ%sS8υ:[vsqǫ9ȝ/"½Oݙ Ѩ%1qmCI?ysg֛o ;wnbtvFk{8T`hom ď~'$12]v__߾ q|f M]L$528/Mΰi #(5.v'G"XqSA$._ |d@$pIp&) ù'm>[0wu?f႐eQ`n@n͢uGgݎ~s:ĿRŸ~#p3.`0,vr`PCkMDUF_0*_o6=! Xlk c@20]Gz13%  ,&2ʓa3xŎj?SyʼLm-R a[h>KfHd\;ا.ƥV4z=^xO{cȲuQˤXX& JzB>R"e@FݼQzZػ }Z?%} #s^~cǀh{+PkS&L?iq^?iVecעrFm d> R_D_#,}Lڀ7>nh}USy @nK|ROr-Ȋ ݼkKeFR+lzWRܺXJ]U'TT] 2)Df{]ww_N]D  {{J UnҧĹ}^ye.P+'՛exc,Qmڣ*\!+pub3oЦt״`K|ΰmYhv\Dbg"؝ABseb~]<>sG[9I'mYq`ƌ^ڽ{vƉql㢓oU%Q>]4|EK+7{}==^cG^.Ѯ.1;bOy!{!"=Htaޑ?͐WݜO>&qB m^8*ytcF):E\W_x$NbCz|nQ?c5C3 [um˦sM6P+`_O(nM6+{Nkc"o@΅+# \橤]5v! $uʀ^|ðxaYsmE? E!.ĞvmX)q&86 :es"L<[앾85uXO\:C%mDG~r?L}j8ӎ%=rz䷱/S5J*}@olc_,)BYȼ0: ezbqί) 5v߽`RVyU9}JDSDhmJ9[ Ms ʮv05SX礵_nj>^g@Ǒcv-M3|}T믬Şk}C2m_K?1-C~}V[UڞCF,[}|[=Na+su%Tӗ@IZSzZͺCg4z\Z=Sߧw?9Z?זɍ-j)5ѝCǞ_krhn+6?pǑ_w?zxlGl!}ι0C;?olaRտ~Ο5yg'Kv_gne楸WMsTmi{ϕo8Ozϴ< UWڢS ==t{\"}}/yw}(mg~90⦎[R[cѶoђOC]EeqcrUWc i6.M'M/P%T_d+7Lco6Ya@+ů|M5Ȏ{8 `xC [/m1-Ӄ(s =39"v?Fï w7u.>'G^}D yn͠2 SӅ -BN7. .Q'[O'dQvPͶEGƫK[& L&hyc*_#&%0n®AzW-:;w,|l c#5fTIӭ5ݴ u&G#ٮ>X3_]NvB?Sׅ3!LA\P NęgmiE ׁJ)P`{>O1o<l~AqLY+D'#ʮĵ@cl-,4sr-R)ˑ.M {TP`!j 83!,vmo& w`[ OY$`X9^td&^[̧LY$aIh11פ6gxW8YndoPN[v6!d86&BڦXI\/K[m*646 yOfӜlIL|C72YO_j"r9e턩_gv:8՘8e$öy Ƞ̽2d2ּ8IFs`|%LT*zK#d6U⎌L@< f?e.O do1x9/xje's^S^€nuGpebX;N({EQE"[eg2X^yu6JG~]/}t>fg`6IN7wL[^9x…Kv7,]8o eumν312_8j$n(0 Ιr&ߜ޿eC]$J#l,XU6r X /|.xxk~{y!Fz{>):X8`^ 1r>իW,^~}7?{_A?d;kd7jC-Ʋ.Iď 9?|ȫ0;pE\j+twg bAJ[c\]|;>gq M"I,Re`8A-ؐ$(/0Sה_(26ENlf:5ޥjN~^z]ڑKx vtM/FHpm54mXWاy]2€ |pn$׌ ~>smnwwn'{2^q86,ƕ_>Eʮ?0bs#˗Y1?˸;sof~aʻ10o6 7y\{|d[y.='xѺ-=!rk~YnC/hs̸r/D:JZ\*p|x_e?_XG`CL1=t>uSC0S&i ݳߟ-ho;CSO?TCor.3_7gGx̀1I N> Nx!Z,pG񴡾cK!Wwb0 NaPr@ KQR (ЪMDA:I롏5P#hة񅏌~ݲ{'Y j50陸,e<Cȥgi(4NH)`/8e B$I1 i*KY`HدeW_uBB.DESyD`p=.AWAo|_c뿓L*I˸]%q:_8i^VУ>ijGiWt&ġ'r--,h^ʳ-촸05iʳu:c.Tˆ+@Ƥ%~9qFH۠>$?ĞflK&G:sqysCma.|΃uD։=o7g%PN_'VN@li7*gMȣʏ>M-4CH'2zGx3XEȻAϮI0ktC>N5,d2)6g;ycI~/O9(l 0:gEA3zn2j۰42pE'[tҘ#Kl}L#b7=,"뵯oےt{1OurW[yX&嫕X Ocd-2b0gϜ#…(K< * y?Bd{&˄3L@^&kI[]l~-rj> Aiuʔ4eڍZ"Jg@^.]=8Bg&QovoUNS9;wp%t.7|y=}jYpū;>U(z3 ^rl~I+9y;aIv&]HK޿|,ylh:Ac@\/-T?&. Qu, <޼ιa@6wİ3Q~5]Xk"\a\-.vdLK.6v7'o,>ɮ)K$]Dm,aw{qn޿c7A3h)Ư}xk h37}%k. |D:BѦ\'5gl[vo~rᄚe=z0l jn*Xymj[>< Eͭm 0}+L֖x-aMe}~\\גUC^L~L:A-Pm:P/_K+-֮mJ}X6u݇zC qd[>F)k;o!'?̹LJʦ޺ Je+{\})WSrQɻOil8X/rL-%|>W~ `Ңm:>u>09eOOCuρ=}sl$\,);`!ch'eML8b>x7Л_HancıadV<㵃H)ŰH:[h;9fҎ)drƯ=qAvj8 1űNYK E(H_+EұΣ0/bN ;(ѝ A|˸BPAFXALfR\YyR',g( MeR![i4L[1`POrn x'Z|ꕙOթ`@ v& (55.C RxB-W"5v!/mS\0e r!ǀVmG:_ gpO~JƘ'7*M jC!.4wh7Z\Y43?ylL,"ʔ~ Lڑ[^GKi=m`dKY&]$I͔fXkSZ&Pͷ hvmmTEg2*mxS>8'OZNʵ8||4h~wmӿ+s'x3op8D8K,$)ط_C'SdkV1*>ԵRף'~Zb(Yhs$AJjJ_籃PXksE@IDAT %+gxm,б4 YO-Y/uu2tf5r{_.x}U4OҐnI} _+ eZ<0Q1*8~eI+ktƞ6h[!SQڇ;Y : 2\-: EQ0ӖNjw_ہp.ZSgZQkiįDIuFA{MDU (ԧ.48`uh{_JbhIcvccEփb-2jk46JOڦ)E.Ea[ pdUaﵹHĹA=K$1#*QriX t f-Aftq_9aI{Pͥߓ<>.joOʧNpsB;i)sauyܦ=YGUq_Ӌw>Y)O񩏩!6|o}Nc>ʤ)  ,^E׺'q{Re*ޛZe][V9X81A!#$d$$^B 4H( #(N$**uN{>;[ ek1Zkα2+vx'- k0\taV;Wq.:qw=I]ty# HW, }?wKAآф9T[X ,ЖmG.8U MvGw[xB> :] \ #а޻Dq#+]/yx_=Td v0 WSQ`܄> {Rdbggϑ pߝ. ] C]w ` <'lb`rCYi}^rD 7`JkoWRlקA^Pv}==4DcG zu#wOZ¸>{5tΉ^ Ny-d6Dܱ)?b8 Hq`~)j]@w;||nlzrl! Ӕ}k<ϽOIPC5XXds/)~rr]ےJ=D{o+GX6!Y6\뎻oywq~>}ODO1 s--_#s0~W@Cp{cvB2q"[w,#Fh}O|!Bg_q3NH]ב}DZA]y廡Cm I^`sx{~ pp-/^Z(o]|K%E^#06fR{ݲR{gfJjc ; :"4e5<\K> ƖZ ")Koa~~ΚߨPV%%R9w.wǛFOM!&-uie.˜êO/g_)oe}V 3Ues܉F^c7ym*̡qk&^/1'4/tYZ>.ӯ.Suү vq'*['oݤLGa 7\.~55nˏV)NM5N'nj}bpm4N4^$M%nWGi=yҹq'=DL̳ջڿvS>.os_ʞ)5ρ#v7M{4zBWyu*yw父8ty SЍ3eh7͆ SJI|njǩ bNtJ.d;];Q+~eFS3U-3a:,^Uo x++d|"וߧl S5'0<@W"PL8|3|` >j&jL[$y Rw&)U9Rn}W>C' /03q%…GI"L8+,Q~Ie'mUIN֨%Ipd8u҉>|Jt[bj Sdo9(G SP(jh ,i%`Z<ط}-<6V@$UMz ;5LE:*3б{h_E/0C;#?^#t)DixPȤ$oIV6R=2qL.]3q$pU\,a|-Ud`@cϩ|Gy3V,LSUztŲg|d- j{ Rഥo3GMc9Ꜩv^YD92>"%m krSnF"B/= q}1c PA}J7}cKE~!F&toVym^qzㅩZzSAX)oJ>9=* g0X-xgڛ?M7-_ҟ6{2TgKgŮ :*5.)4ڭk|%~Wmc4׽$9V2gYG>4:_ ^P[kN퐅ZWzO;1:D@O_GқE7.Ze:ȉfϻwł=e߆w""o 1jŇp-Ov8pz:%P0+MeץaEWXcRq_FG?]hRV`WzSy}Tpa0OIG pL>hVOʤKѲͧI9gW| E- '̐Esclu3RlCm̟u ƶo”6'h#}7'[:Y?͇Fj; S?slk=F]-m90uKb37_닊ﲿyi3zk(-dP t_n⤿`;[@XP/cm/}pQV[l@lY-XH g`K :`d)w{738)4/ ]z5m}p?uA2dXXpa;KȒ{d@ >bkͲc~-Gxڹ/?mtG#>Z d<=U:?DǺ'w:tvx"pQne(c5x=v=f׍=8\6U?0SD#^7A/^@犱#Ach.=}|=𒝾ܹ>N,c7l0+\R,p^':.{q`;Z}1Rqu ~cQ>pO 'y 0|.@c)(BM| 0PnWYq _ פ{ /ڑ "I:!؆'K褌 {Kcvx3. *`5[J}%C 4H ,l<%{87qR@|,c=4*-4:ЎРb7i|iGG*Fzv` ȓd.կS819nBJΕ+\?@ѫS+F |2ֻ6r U?40!}`L^'$Ҿ s5Ǿ㵉T/1-pe %;op_}U\o" R\cc{zl }gxߔ}A!^O~kKg{. v^S"m*'X2zp,]SG Q*ǁJu̸@A U mI*Y;_KޒiA?U-R 2 \GwkI_u.lN:i_-+e`2i[4q_Q{trSZe?Z_'ʶ^ɹ{ Y_DwZW׸Mo;v^ zYokkN74xk؏>>O?}Žߏ`+=|o?Ο9I| ڽHe9ֵB?$tbya^OwOS>T?}eko3vW&8G1q2Y&0tr;7%ru;..h ՜q1Y"va!Zt N$^ LP|mm5.%y*>R|#WqKA,<7o5|VS5WB:_bOɅDǭ_ؾ@ѵZ?J)tЦ29Š }ua7e*Ikl 4bШl}JNwo`j Aߔ/2»YLAu'k\K61 P&akqq]cc‡ȿzbtkLH; ѣiWHdaB,*{+1c",®OZF.L$eJYm+6& ,`\%qDmGY _K]{7a=ԱNJ)k׮.F~?fnX#˽2$r]0\S 4⺒6% .⨭%% *\p.x*E;ȹO~_]9.!BUCQyb$脣uV^ qZ!z(ZLɐoi;^16UrIP2uh=/fA,Jh{qeU8ӵYe2@|Kr,BTP~s,C zmM 4kC;|7.Qޗ6}@TVq! [6hٱz-S諎 ,C6u7c= mŮ"D?-RtUKoOo;gW컃r(Hv7{&O4|u5 Wgq ~E`s|*$8J qDЇ>.aiou >؃.ǧ~c^`àSc^l܂~.O@d,B3w0dz3ƜnK(뱻pmΠ; }<הO{ v3_~P;9h3Y_kDBFUvFh;R0{'Z4p>'#zX(/؎J52}v>*d!𣏕1 בzm o8<[^?;wл)<݈He'_㤎hlrOxkxm7~jxr5<>1{q*&}NH1ÞUIoya]pU+ $m4I4sZKHđh7h%iVV.6밨Yi*]9?| fv߳Luw/=LWDrݞmOT[NmM]tu] Gq8]V0u煬za+C~؜rX(NuEuo~OқnzI61u4dž?Ә02\rYݿwMZvuWW'7ss&j>o]KβX?nV'fp|O]Gg ݤ? O>nT|L\_ۿ|;7aśes&rp5/l]es^i^>"yU-;2/[CfV0sn'`m>wv>Yryu֯yy/73'κ7㮚eMA939uԍs8J8OW%u6\h"OזOWF1)EmmQǖco1WYs)g)ߖlYwh*ڽʤ1/)xܸ}v\"x2+7X8g./Vs液ʭ%K߫ԍqzwV>e0wwndvj𓟝]EnN\ W3/Kr8љ '8=R7ByֳH qoI#܈8NώKrA L' T"W5gxd2{_SfIg ("{"L*W;_MpLPC \b#T$ H+Y)]#qq\0D\A;Y)fMk)7Ӆ(L"6"=+Sv2y*|j >H L lCr 'V +Җ+UR٤3 H|5<;˴pN&;ޠE0*6M[)ZJr9*:+QFXa?H/>i*o(vԱGd|SSTHE.{P@K8);)p@)I=*0i[sbڿ^u ~=:҂eIu\e>LD:__SSx$vL ^ \6Z:KS/VZXmbH~VLe`۲wl8c*9tC#Gm`l(KTP#|N,%/[#\ NzS߈_'/C k^|GB.Y% sT?Z]*6*:aI@a%u8qձ,#F% ЫqjQ6C}zٖr?AI*]F )q(׈ԮXS6r iռqX-pB& ^H\.kV8OО( s8`uʴ|iPdD"P$!>Y kc_$qQJj-9G1s}{ y.J>9@2ȭ%Xy4\H+;G6xM^\X@exfO{J@hkOoNO@Z@Ov%:̗ k4opK@j3]M0ԵDi۞ıl[ɂr}F%O Kp_%vZLT>0.O| b@#u}*;:eo<=||H΢:'7G` z^x>a[XL}&Gx5EhW_JC&p΀y/%|־>LA + >3 bҖİG[]- E};z8z v 0XJN&D͎D?Dm3~;1.'(;,whn]= xz]>#hlw%Bً߫㏟<"aS;]Kـ MG=! l'}gpbvkwײ<@gthvEyL[pH{_t&B9e_{s/rng8> A6M%Wh+;-$xArGJ&C.& 0OL;#l?ͱNHT| h -#=evVe6HĒy}U{`ia|qr1LZ-vHp;g;SUj2e1heFp & y{F&BCd,,&Y#krZuj0AJ_y}x[ΰ3zy?9|(:Ȭ5rs6%ϼZtf-H{g]~^Yw~Q;Ը}'IW?/;>! χo74;jɝ6qO Ç~pxy4?~>_ W,q^6-o)njוIxu0us9;GLn>ޟGAkwG~ߺ8[zF^7WqNi.v^;I Sڣe {׉cS\=NέeE[yM:O *UzsĺI)xKowx%WaN$ W|mewy0/pޙ=>&Dr:on]2 @S@ aϹ5<v`b`eͯ|'m42eN0 e.iX=WKO#?6|e"|5Q䬋u:ċ"&?y7[oy6|i8)eUZt1'aUspۄBuޕep鈥|]QBFZYRfTJ?%9%[ FBme."rR/pLt^Ht90ƭ2?S8ui/M{ׅ/{JҤ->5Tg^$ckWbk~b >_;i5Gw5&}yS?ڢd;2Xp/;E//<׶]kJnJBClWK eU Uͤ!ea.&i)hZ=jZFaɏvPL[fCiIDU6ȠU^Gr*\eNr_&c&+ %t\fE_f/ߡ_T26r3)P9fA/ՅWB8+c>"cjryÊ7tϮk=W`dʏtxi t,OtC? -7g妪]vz[ja5u$e> Yh8Qu;y`G-J2;VKڈUߙ>&V,t:hJ'2Oۓ_ 6:Cذ{NBI+jUZV\>-IO? y%0*1Y~*WS0j-M_u (L U y}2 j;a?B&`mC/ӝg3 )@S|l]Vҩ;T ֈAH&ve7JsƉrHDžD}΅_lqnyFPο}h0>#Y l[mkۼEV2fq\.t~V'(waW{ҿƈ=LhW xm@l+%?$z"-ҞG(.[>vBŊ MXS k~  f =[P/cA:Ƕ.,d=J~Cy+춠`{p칯U> ٹ&-3cMqNqt|<Ц#vxwq0pАذ Xߥ?\ 1(6`|v-ٱB}cl}Ͼ~Hv &; o:'(>=6vRh;ynvi;}ۣrt獼zXW\"mqN)Jk|@ 2n(qѓ6CWU lsFL,ҿ ʱn2$Vhpĵ9JOڛ} B=l@~'&އO'$A?B8FPOz&H ÇH đ)w^d z'@j~gj\;f %ۣ}=@BC׋巑GNt,@ъG _[ z Oa{UкZ!\aT<6,d_ :68o·tf3K-y/[:DC]RTq-O0sM{oyԊSmws>S]_sDi}J.VsBNuUwj{4u8MouhRίIS~>]puᆲu}wOv(?<꿎~uŘwm-LQ}̜_gW O޸~a1 Ͼqϫh}9|4|O~GO6~[SC=kQ<$ox'p CyoYX;<{>OB35ιͣⓚPՓ$SwRAh^M-PTlGםp:mY뾋:?j\if\tmbytWk2Q[Tk.M.sdmͤg91N-Ol<D yV4<@*wC^|N|/ދtue9 v^aW&ٙ`sݗ(/ͤ|FsapE͢jWE'T7 xʯ>hW=>ˤ\t` WӖIȩFeSWI%5u;Y̥⼒4e:"qJ_~Lt?>~cj*uV4:?[}<fφo~y/71w# Ls%dF/|{R꜋0YY@Zoa&@DEIJ.;'&[ZhdQБ|d _gA l~_x9dѯ.9392hO>AtR[C;Pn{ S$_\t⼒ߴWTʱ,G*>.X洇ta|(`[9G/x"nEp< O&MexmtX*]!JG}s #X2˅RZ _|Ed.|IǏXiJM ak[kJ}RpCoMu.U6P'ϩ2% !(p>rM{cQﶔOEFaW+r">1?ӿA#*86K.łw,\2C ueTOT0.џ'zjF?㢣2g~_bqq]L'a0%%> Pa‚ Me~гvi)(O}U繭a 7'YžL x^cq&)GշVk}[Rǽ&f8Eݷ]d7(R #[b|'9D(u,*z, ~0w~m _ieq;c@Վ;E-U^Ob:@;l[jC>{Ⱥ+̻+E975>,{ePqCkuj )[ˣ k4ɺjFS[n8eLl_U+&IlÙ r |]kJɆgkJ5W ;`ћQ{\ԧl '\}Ů8"n\[ YUW;B_D`2q.}]9XQv2FW'O{5qHuJW[ c=%p`3QKt{x~tC`}[~9#& >&dCP`3t*1W}>W&z@pIvЃ1?4XJ`GA4aqdxmV>.'13x쎟<r(|m7'Jmc NA# t n>-'k|u~A w5} b<1vLSǏӿk'6(8ʺw QcW+CSC*ӧ3` Te\ޝJȀ3>/{ )ܯQҁ7>7(:69/CtvPB dpF9*^^llw5W(~D4:oѰ[gNvyE؎C?P VG@6{ & ϏIp2ɟJ"F;g]w^ *r&yx |5ci[2tC7h*eӭJ&|g7nn;׿yַgpS[?lo?i`{;~[X߉Z9{a[m_-W_m>iUqW㯞wJYUsE_~ƽ''WWW?6\z3tqt5ߗ>??g[o݆s7;mj)DŽyzw S> no5ns?oϓ S7l_x>sjKzYS_ɼg[@Y}ɭS|ϺĭqiQ)Vu(%iEaRLtJ m8hwֺsii妩wYT`O(eyQ]pu9_c孳wqEIFUmuWr~n]~]cb sN^=:!]C>Ťp_wG'|_n!; xpO&$r&p⣿ss~tv>?:|r3L0ȖHG[P<ķn'珆go3|rd˯sU(q.8?xe@v??ԣcLDz)NkeIY/I !㴄8q$V&Sh<ҁH5Ti&Zih8KP &koOiVlcEkn,4 ?RjDgkLe{'E."vϪ-A}"[.bIyW`j&`Na0ژw K#m/E?. iī]=Aq@ĥ<<;x/s0m ب.\I1O'&6x?0N"k2|h/~1WԜ~Nܑ669+?"Ξ_F-Qbd7|ɠDŽVH#t;5E3m*MV+,-L9N>_,'cg/ QL@'Jqa ȨwdgѦ,x7-jLE?WҒʢ]-SoB[4T=FtL@IDAT΢>ĵNPbk[rr1ň,_^c4:0x~ʯaSy|WBa?*Hqx 6v 墲e" 2s̉UMX\*2Q>'l"+ػAuNMpTo7gpUrx`$`ke^XJl}E3'0JE1T-Vy/ 4׭ö]9%$YWG-4H^V.R4EuEw)i/vT"m1NcR>dqFh>dm?7'gQ:x}Fz8a3U ; {EifFk0Re0 ]L֛e[c cg⻻h8$~8kvpaÍ>Ƕ~y{īOA#s@qFQǕH[d[XǧhfolK8y-^9|/LoUGq r{/0d}{ ~tw%+kÓSjG8L=AzqxOlX >@_: ({ZO+p}\>;vZL K..Ǯ1ej\Z.IgOo:&uoyqcڋ>ZoIUɚ$U~-O]>?6uF:>̝GɟpS4宓` ys.g 4[e@&.x`/SkJN}/ŷ ǟ:d'FAJ|OB$iY +A+! y-)6Ç~ `[ߔsH0U|9 L=5s접ێZP % *^ 4"cl]6Qޔ,)p+_ Pj@eɶ+X{Y/b7kqRmlҨKrnKęKGNxy6q.uk@S MǍ1پ@Rͅ2,4̋2d  ki Lpɕs.<~I̔`';6^էG[jBn~yT@qH][dҍ1 fh >(`CK,Q/B`-;ʠc_3y8_/hɸRU3W>_N&!z,$ Lr~_]n/%1*G5/4>d9@_zB۫`?/(3yLd5Ry:k$,"Xor3GNl Q}99V) !ԥ r6 xUcECEv?iɏ#YJ# dbeJW+QKm墛(KDYHIuS"$%)4]l[N~WEu0M *rH ^6s_ OE5 y 4G5 GzG1[} mj5Mυ#mWm_b~W]4ʑv7Xl^!y~,Թ kgڴ䷉{*Gl1d4[epkc6|r#+H/6VQHZsϢ=!P\ra@ϝ5"2eli7#ek!Hlmʬ]~=DݯgO\qʦ,Li$̌| W@ Yo&ktZ.z??Ģ=ll _`Ď,,E^`7s勏KE`]lt K/ϱ&p@^q4g7՗X֗|h ;֓9n@' Z00,Ξ| <9b1U"ʨ', uM;\c Άumb|>Ja;s^N5)g鳾BǝQģ6 mN9ܑ"vP&07Rq\4 _s#AyF+#/ PvK)HR^dS2_I ˛zpwwT6o˜ou:u~M 5Upe7Tϖ'Y2s)e넼~^>VQuy*y]y]J>7/k0;ո}v6a'k}kk+͈f7~WK^^xg%WWa8|7>v}s'Ę\.ksquUqv}a?x3}e2w^>iyx)+ț2u^[l6I׹>vTgkj󹭛2w;(:iL yUGsԓ #_P3Ԑ̔FA;ᢅׄ! dA dwϙ` f&޺zJvd=E?gxU5j#Ռٙc K&|l&\81g_?O=sc42!X@CF|wʰhjBzwBX eR *+kPH39]qJaI#>o'ã|2wD(!l+**նG\Nm ubQr44Ҍr@%#WYGGQ~^D?x+k&r+NbU?#H[(0*!Umr"!FBN)1b^[M_6-@0$*mե(2u\2{\-hy*GUK<0[v-{Tހ'~gQ:!h«v3vc/Yr=K]yҿJgЭ@~ Կ9jLP>gE*og!>#t̃".pIb݀3`pYȓ uuW ǣ'J*XMJ4P郄nbu%5vh3^J9PX\|ߵuNcxL?ܼG2(Ixm'1Egn1>Îi}zᚚ/.҃~ P VXXz5 {#4͢w uC"0+)/(,*L} Ğ$P5jk~e&'6u,LtBd>5F_sg~T#g|z.Ce,z nZ5(-8  a}[]hqC>0 X G<&kD^[3yx(e mA?ͯ.Fg_NPALz+wU;g̲ߞ=?fW(_űEzޡ(wB;!75(rSwg i X!3rBG5^ p̫6 Mnjئ#ٱa&+GF(&0WdxŅ;YhOt$X@G?Xjo9.'x3wqCԫ׌[mcǮwױ@  nM;= kt5ga#ΰ5=7@v;~CH<>"1ENCs@uW 2CSq`ˀFHm Fg3 #[3 iwo!vـ6"`eJh >UV4r/t|EKE,򈈴f~QI)^F+ǵH)w4,#Yjn8E@Wq4~xxΰw=5H!PRΒk^>J]oim(il;Ʋ]p gO[V7 Wyc 2kvcUYv/;]{Pu1nplvޖ]U^-}3OM^S _ee9NBQ.][yM[Gm_״׸?6uV[yoJv<7[[-~K6z\}==Ưy࿨ s_w?6_k j]Su}ָRSە]aQq^6O"M8zT=ue]7?wWݜƻw@޵X!^Va她n]bE;W8q tš'nNOn;IJ ygr~"m'jhm\rr-%.1ftΣN>6|q'Ovx7gϟ3ȯ^A_99[oo+{÷^V`;V_9dEf'2 gM9~7 ;^ _]Nj` cZTP̖eA!ɹG&'~ Vw8'@=3A E"on<#@ F]Zl5o[?_֡]I|9#c9y]_?sN'ƨafb$8k3a ,2aM]lY Y0:-9FpEj,Bk!0pRuuįpSBq_۳| `96?X`=zCÉ皤-;{PI ox4w(?,;8).L:EM+AO6fX^:kCDcS/SR&šKn5Km:G|9 vsQB *cm(.mIJ+ 4zlB)^EbH.SRYB]yˋG][}dVf)$]]a]oA_V{w&h5qSFg.?rl2dj|Ӈ(W` 0sR\L(=m#grH~AiK9z N*NmO K=3d채zn|;]4 >9xcߓL5iO"4{#/'-L IZV>]ڠ"&GB"O_\l#)kT .o 1I[Z ) 27<9+ h )⽂G۹~ :Yi!HȅDZ~+CEQ}L0ƽr}WRi^/E(֛l,ӷVmP}PH?nO/Z 7Kl`וgl*z[c 9e .S`d S>zJC=8'Տ4Kn}2" O!Cܺ˫קb˺)H>'En228A@𽧢-9 *O~ _f`<4cGE6'| UghR ,a y0D~We\TEЇBw@hwׁzA`ëOg U]]'`gVO @P}nvJ~G]}~] P!]. |G.4"Ak?k?$HF#ekU tPCvpNdv .;hWN['OcϏt8E/BE 7@Z]" YwمW{ Ȱ'~`O{y>wo @pJOhm_ρ ՟?ӟ^y/E;rqcNZszU~Wyl>}\Gko8>ᖌyݛV˧&w)~wɿLyy,G2E|N{msetVCwW?MVe]wPWi<^z]J&Ue$z~^?m_Qk߶X`O{'By\:Ss| |N_}#~>0{{_z,VyQ}:87C5^WamZi_7n54unY?u)諾e)'pN8=|{~T6Oܦ;N>G0O|bgxiٛXr~8imkY٪Z^v} 9V #ul8_;n} n]}Va~]G__Weuۇ1:N ]Q<t!]K,qB25e\YX3rԉL1 .HcʱL 0nbGWZ.dJ '4Ιtbע>WkG_^zዯCй'xDr <{CK8Jb~i!̼PBN8,=evc\20qHJڂ >NB;)y(U&rN 7kw1hd|͉Kfsw`T'ŗҫsSb( NEt6h2 `-u! SaY:[ݙ>]QI+F$kOK\LG.z2ۚ.\$0S}odm3IfrD2i 4mb)]L'ofR"deN1 (m i"LDUvJ5BӾG=j1iS!'&[hHdmH/t!%U*D&/q!>p9 eTsq@X_D@ \6R+՞SvΉUK^NQuRcaZce ڨ>2ksiӗ8ʿ|ґ9F,s0 /p8c>G2hqȣ>dmW{ѱ."}Vd,ShxY~%:~[m9 " )}03@v  %oSi9y] Oi^K[+ttWJ}Eր[`Ҷm's2 Pt=FdE5.C_[>nX"!gc{ںo޾PhۺVO#?/ՁvQm9 ]TdEFsKW'Gw W?Q8eq1+; W:IW[#c M`%<0+B^䕰Π~/Ik}>z)-)V7o;@|N E.Ω/.XHwW Xg7 _Glt@p 킫Pe A)AT;>9ثQ"}z{A}^sOͫd=.|ma4A؞@ @T!0VȐƦMsQ]>v`5BnO㌓ڴ!ʇf]GRH_~hn?{7OW|?뷃+GcHiw,[=O˞;q2XD,9 XH1`@ B3HH_GLHa3=ӞLOOOwW}V|w:{oUuX{k~kZgğ>U%$m6k|;..\tXb|nov#<0Nص#;tԗ;^,q86upv6qv٣Ya#tw u". f7/ȖVMtGW_Ƙ1 Lxa.!+hy qpA a@o_a}auH "Xv7.qǗNq_irs򪕾?`9r2,!ny_[Csұ t@&|顨,~/zأ>\zo>̎//ܛ~>EYnŌ tQ출P_Vo8˩C=#nc )1ܓ_ZJfgk,uX$w˪t4|1lg%L ~>/'o=z#"]}--Ŧ&PAX׍N-~UV`[55nQYÚx4?&m_ͻ \+m5.c{ __+{ZEfW} e7.2_p㔍8 Sux}G;q3ɻ%t(i[Bk>[/L:kn)XڵOĬ 0S5 rr+ߺuE˔ry/m/-c.c/[RZqU{!?>߽2Ui i^آm i/-@'?}qc]y|?5 ]^Un/zu^2YFy[*3ɘy5cQWm3ߚ(,+5 lu-kRڈ!24.@qALSoڔ#媃0AViDQ+iCV3 ~G+;@{":}ދ o>?}ӽ][̯vҌhu׍]ރL_!];2EO}Ą#빓|ty(^_7=Ӌs4}M|0wjPK'!V+3g$>gMj#MbO3b\bCuI<)x ,2 5xLЫԶUJUW-", Tl0c\`h_yٜa$ԭ寀bX:28Ʒ1:XU=A$]mF7\Ck"Uf"FN~28AMꂥEŘ owpp0HZ"oy|!u|>q[}1-ʈS;!g]|NGfIfuSAnE4At 9Oovn>Dj1N$j3峹«+?GBt{me,q;Ⱥ(rbeU9xWXOAZQUY7Qn+~2\Or޲aY-T׌}9vMgaWތ+~+IJ@ wa Ĝ Ě|d|cmq+cڎ U://6AV<8R*tN8omPXb(G,zRVaYI]J-?Bf9ѼW|>ˤ x'pSgn۹ [w3g(_2N)Ox&DgKN↿Ovg.  }J@/y'[{Cr1\D] sBJE'Ӟ|ç"lT  #8TTb)H/"D5E(R>Sf7KX}k 稄>޿eܮʶ({ ^%'yQޚVOU7ޫ4C2jxS al+d5<h̄-m3RB%ciݑRC7G_d1 ΩCdBvn@Vs, #泷o߆,*]Z)g=v?ą/jWڅ,0\d?s*tD}DZ A);)vE6Ǯ!E_ga>=|wWcP~~At!lhkBD,=0>nc\HMYAi0iO/~vF* Z"zw|!%+nu޹NVi0j br\  Ҷ#ܽ <+O^a=oMƣE(^/uHD@TML}'hCʞϪ́2 /| g^9jmGa7r\/yG#_q:ۤ#L)zXhHb*1k8>6ueN8kU\rMBFmya#jNLɚ̓& 6cYvoNzrܢhk`G8u~,|ٖk~nxGΏec:[Of]飜:lٖaWeC},~(B_JHBZ˴},u_~u?txWqFpX>n<- vMn~t7oy.n}g[~u>۱qƳ&~cz_}:7+{W9M? Z }ްl}O&oju^X,榪 c|EK.ucSDZ}:܃Y,pцG]g@.iY?_c5][% _p2r0XtB+r"Q/4- &NӘ4|qjPcf3?I4M'y灇r.q$GNI6W "XcHlzv~kbzǁY}NN/jEg{aY3o H 3#r#`P`ƑzOaGpNT 𑲒4iHm1}+L8CrHkNT褽 XYb@IDAT^fSK nFBS` A@@+][ -N:1&;QVv F9@\^\8ف i'Ǜ}00GbH&yEbY r~ew 5F /0T޳R瑏= =6_dI$)\~dF~JY%\٭uBUc2AyiNdy!P_e1E_ٶm_d&oV)uzatېX\sZe݄1ƒ4*Ÿnie_E_%aPlOIr>ET%>zr)Vm|h(&y@6utI? k9ϔS1ܔu֗sԅDu;^oBQOGdms=@ڐNQ){1.?Iv晔 ]n*\1zE׭~Li7#dk^U.jCVhErA:gB|_ /9w#6JG,XXgRdU^]rOS(KxEV\xё:*|Nԣq֫mP1LZ뼧1ՎCV*h9KL.e=>Gvx#GFkoQ ..UZmM(F.nNFpĨ֧e|z}*c+u:SU}Ua^X?I<\jBSKeu*u`&%rPF+\ Gm]FE\( 6α|3|ҡϤPxa:-otg R:T8L(9~CEaũFE5OImIۑs* Ek>qB>饃kf<'N(Ub }Uo'f񐋷MYJT/m}zTq@_vT_dzǴ4+|;;0. u"T@cl%]ök>]wga #&a' U _sQRɫq7na׍츃s^u3,tFC r093:hyf,8+HyBiF9k;e˃zi&ũi"쮰îi87rtACu1j&rc:Mm<7FRځV19Oߞ~_&[1N`)6ܾ5}hw8İo{PaA zOc:÷.Nx~N[wP1E,x0v?a7}_;BbSgff.,0>eݽ?и)uhioJm.܀qfAmvy諌XJ]_Rs]`6UYP@껫]b~YQ\([=pu^}j╶k>z?X'x" wH)Vҏ۾İ2!ڥ>lG hI PiA\3Rj廸c x5}¹rD2 ❺ٻ^O8t竧3wgXabTgrNҎԬzk:թ-[OM7[+ icnߨY]o~&~qj[-}l>vm}nҒkDzo~۴jTϞںMTZU(WM4s+ܷ_G?o|xRltLfzt;Ϳ\uI~Dys߫uv&X8m7ɿq^z߱LGSǷo=KMP'^oo4*aR_d$l3$n汞+ fn[=)rE/MQ;m|_m9&=H|yv}i;y+,eX' ~xo ۤ|UI`#saץQqû,+ Zwb66GcMm-31 2Es?Xж8C3&I~D`#!6IMɕLpT0}ϖ<;( #?joٯ/ϳM)A"QMù >mRz4MK-#sPf=w5%-: 2^;^zʻ;YŸS KjNC);uPq>L&+^]N?';#x"' yTI=SJqWak\(C}+w\n:dOgG=g%ez*cB- 9e\'uV)uJ`v&'Դ c)Aȿ|sR4^ŶQ.eF@]i'D>.@ZpԅDtO}5w`v_m)撑I"z"@lC]Y?sqQ:Fx7 WCm|D#aaӴ5h]%G^{|IR$(ooKN-a+L(-/ 'Y%,T'!bPL+N@ .|"?G9_̛ۦWʵQf4^RZq!.Iu(?@nJhTML)1Sz2au~m_f"5?,J CB*AZ5!*bǷs]g^{*cqtR^٭M؉" Z`|~=s\qW \5X:s0˒VOxj^Kq)G-˵Gg' ONMs$s H%vIT,zյ_Gʐ#^/#b%oIHYpϾ\޿=~\,jHrT]Gɵ<:K'8Y'^^LL׉2 R~q]Q"RřP5V?@(V/qM=W!3?ron쵔|]QCx* NCޛjz*RbW=&_[w!儬~UA{L~.ֹ`WrkeW`Hc;u"xtB_ x?.Xv@12!'(Z$.Faƒi۷0}Eq%`4!yjoD@ j~x*3ㅿz9?fK.石3CZH"Uqle^z$ja6:X!ݙwȇFu1^>MG0\#{ۺDOہ;!+]^ ?A^gZjV&m,jam\Жvh [,gmV)_T?2޺-v.yt1k9ՙhuatO[/ۆ\4/M6%ʋk@3-*]CA[C,>ܲ)m}زcY~`!n^/sZu]4[bgqXg2!6UϛwxZ[F^e=ĩU/Z 8&qT5bX$!#'?}隂<`ZMr/D59̓ fy*>'Ս\̈́%!/ ᣚW@r0|'K'Pdc@ϕ;N6 rzO o)jP[~R'w wҡG>.)O//JA@4$ڠ53nAvE;??XQW%y\q0&hK.b0fEG%;*`ݨ4l cǎ|IUWu~ةf([hP_ nod9%j;q9@KKMWmcb3y{ќ<}\lm~#u]%Re_7"2WYP#R. Gne%)3uӏГJc]eAaIOW{?´Jj_-?3 *NL8fy;= K]o Mep:#wE|פ1bk:QO1'vY. ꗍY;qHN p1@ț8c9ʄe&W쩧~WS0[Ay,H޳)$ 7!zy"G?p ޹}W>:adQ QzX.} Rim'pe^qOK Io}8ם6oEx4^S]ፔqV1|^Gc6Y 5@?o?{'9|Qد_}hƴڸ!'8М*~B\6D,m/4HG&ÕkVJ8?jNn+s9 BZNy,d)Xukv{-o\]v V]׍0MU5j/re<7SNo>ë-/S,BG.p$7Mw܎\aZ/>pvJ6؏1""tc:U<ޫL"w؃~yv=l+p+9x^} ld7lG؀W\`f^+4.y^9s wo9yt{z>OwvN7X ,M"EgtcNww׫kΩcN٩nOXp\ ] e`M JFy|nFz}G(8A~zĹY5Sʭgrl5xڅqz_ z=bxJgnG?[m+W<ԝk]{/] ?bֺ ׹1=-8B&G&e]{r@|PbU=G$gS$#JZQ;R_j`HWG=i2.%'wXI#"\:Qufo\Lϼt1XW3ݡhF^ iG_Gf(>/)Ѿ7=dJ%ጮ曪s}j[s=#. )UnfujH욁)&"syKK, iE9Ϯ}]Wu e"O\W%/v^ͤ=[k1x`6_Vʶl)#「{WťYe֦hI)Mu1f_g%?Ń~oKHWfJb].s1lX:Թۦ n|W`V[؟>]e(ݤfÚhCbYZ2Pޥе]?X^Qަ~ yuTiOoM6[~|W$\اj^???ڔp#`om\&'}Z5бWOcoC]Kv-*[mWYt_tǡϺ=Xߴ&YWNÊaIyr/ͫlYb[ߎ .^"oʿZOXwGuޣ4W.=w9~ Խ8qD@;rKӀ:vYnRT5i4N )uUeU I%i w{\0Cq%˩FY>g>1mzs wh~X3a*&*EsЫgϝꟲ[/gRtL,+JYGGRzHs]~qŹ.Tv%#w#fG'7t\G;DP>5q%C נt<%n B~Ĵ.p [j3b%!+yOLέkyJ$;`pDWkhK~p)[h[,2&YPP[Š7W} MN wDhRg"lF.{xQLݧN"c^ 0Q$I r*4B~O=]1T@qDlSZ4g$rA &y %z+-̂R~̄R!Ǭ=oyU HKo*e~ha0M*nl+"uyn*Ԅ"Mɺrľl\~)bRPl1O uP |ڠ) AthAuJlR 4]vT@7-+~Mb0>/} 2bZbJxr ^˸IMF'SS/ mwUOX1( bxD zV]OtvГLŻq2&CFT|B?XFAdJZ|gRKjՇY1ǫ,ۮmNCn㢜6YVk兣C+`2iBnpgEf !,`yY8ː_A9_iPk~~^$gEȫM@@ =T 2SGВQp_iA/bW8\a+;y/yؿdmJ8/!_?UT-]EN: lX%vչqB@yP}}DҲWpsbGg>1NƼYNr L)+.E ?OJ&X@fSEo@g6|.2޿-տN<[.7g߀h*BZs\z*w< .8TV-L0WR1ND> e&2)q5䯽h{{>_Qwd!Éc]h?a5er+YN٭" 4.G ߵ 3LcNПLىBe|8s0ϯYx>3}׏p z; L{c1ABޯ`Ž9w7|y˧?r4}9^?=>[_X7T'f2}0Rۣ=b }ƗkAeOw;wrA?Ԯ.>A=vj7u86[D>;OgቾrҀ;s.B 4΅E Z+^ zkWܲ+ўvlK\2@>3t9랸=v lG;Gm"́1}ԅiCGQve"VY%>aeE;Nkyӻ^U(<'av ?"~l3B#7)eNchY)`~L: pM&8rx,M4k6,8%oaZh[GXyIoGZ^<_ᙿ*]W2/v]%gXXp o++>fԲ#nXY 6eMmpK̎||Gc~,_sQy>vV~ɩ/6Бg[~m<q;GqGؓ<#·4߭ב=.v꣔#lweƇx%KU{x}\\(mvF;F}몏݂>ʏuG|GvY{̧IͷWV^=$_D=m;pIr09+;҇䊳gyQnЃmbK~5.1#zҼ eK6enē8;m,6~&6xKѼr_5(jӸۏ ^ۿN/w-\fG :QMza'7#wX#1O^eoJsM|_cٖoX'9[>)gQ 7wڰCSc#T;Hsg 'Ǝ2 &DH>#9}vû N2h8 JzUw@8NIȑ|!NU9Tv>2D"Z ~e_B/3@<+Ir٘sSL [}~֨SMdQLϭM0NWa46Lkǁ…Yƽv@1DUvqhx[E-E17yB00H#hO3d|sPΣmp1W+@^JApĉ8J[D:s38vCzz|ov;u@gF#OċsZJZ6و틼·+`nҁE,[ TSxp,F+*d,&iwauBg?ZMak4Kd!թqB8fKXGvJWNubgPY~(ēIIt'l+XGމ:JFX f+~a +գv!lU/ϛbE9ƩJoЛҺ_yѦL-W(+̥}{^J)QXN.2?+'uBQ8U' `ឲ*7k7D"Dk:*6ꘘQ}'OD&G'SNa=3Z BD94;8Ln%^dQ>%eR;Pʹ 6\W>acxlSpGu;!?3h)[:[$> 506 XFu$Dr`3L|n-LN 3`ਨ084&4SMP=!jNKVc;H'[+hAxQQ%_1`f?@v~jlh$y\tV%Rڡ&'Wʙլ/[s??/;T9H5@Zr~2"ѯζ@[Uݔ0(5 =P"qv,R7a=_-NMj2ױlr+<]!|CmDMB+:8N PG\xQ>laX[آ=ÑU-AI<]Vz/<h|˷2tI>JX`Wit:CSb>2&Kh SXAT-fO}gE5]fgRz4іDդϭQԃ1 L?T)2( m`.]aߜԐ+/0]PtEɫ& /Jׂl12')#LJ)'ſ'ZOslq&la~QlyTUl{"N*듶.:\qQr"lkalVtªˆ\RE.~Ҙb2a-qt4c]̌fR03:I9(e,[[%zs*Y JƼI ~\ȫQfI̘–x,`#ZC.qOQu8J+mEKyR=@`Gqwq)rD 'N5[:5kar/AUk+n`YɆ9Z1_uRޗ(3PY^{'Ӝz!OZI=1QIn1dcL/E1t˽B E?1H@}3+}Flrj!=+ <W'B˥փkVGN$!{+~m,ub4|p w-](KヲO?QJ|[u8/avvBNHDDfٍFKyc{ͺMNdgWIYkl=v Jo~73h^DI3 ^hk y8\Θ ?uTmpq_s8IJ.Xz}2|J Zttu|h0~\ \3 B|q i;:EO@1}q^vA:c"1 P(xQL hKuVyfHhMNYlb=x|v`:űƛuCawٰ@>;-2 %u8]R%FT_B10q:+X5O7{}p@/ֶ??|oN=y_^|תdQ'ƑRY|mpм&pцװPC4=bYBwoEh@EP(Dbb3651״yl/ٟrzvEwHپ.QoەO&X(TMyN).\Za 9?㕐ȳKI}B+< oUL?x6hºh.:sgAxtg/W(5T!j#Zϻlw<%_U@|6ʨXʣl F0+l6ʒ&k_^ͯh7y49ӥhJﶡ c8>,8$nޜްIU2+٥C_( r#0o[-S)ooҡ4+ ]/%.0˷%)'hF{C3m4p>.~۾:ʡZNۿصxڷne]c?-[u ly>v۫z.=ߔ_ccQw//nY>GGWL^r'i_iz),hx/~OX+kۿ6ݞuɖM6Qڮ>?77Oyuq7=/-{k zd~w{X75\ǿKg$or|>l+8[|t׿xb,/7N\~n]gYax>yqfmûq_oomҽu|[YtX8֣q(o耑v!}9!;I78xWDgП\!j|8#OA>C\de6Pby ~7C0 fAgKFd WbpKd)|;XꌫR4vjf,XY~q $Xd(ީh}m85%]BX[ j8BPg"gGu^XXZXf<2)Ġ]50WθRW=ðo˄/7t/?jY@:1o2Q ƗeekÁo/d|yw{y/"Dp/&,Hv? ?R&;ۀ$N|95Q>*HZOD̟:lۯ!+e7s^d6}9> ]t;Q>",07qT]3! kRNJkU^a򇼅)%Og$_-0L(Lf>b~I@T ku\޲,i۷ĬLűɣM4 5S`Brm8`xUpc6tMy=0Q:"@WJ@IDAT:VNM @-=jNɋn5 ͑k?c&lJ, @`5> RCT}\Jwuk bN 6w^U=8>Tº\PBz<x$`/@ i]Gԗ~]ɂEmn֒< R?ӾOQVt_ae[W.Od)fJ99UH';*^=',V$\Yʕk~}U*׺ؓ?פ;7Ys(Kes>oj /6#Iʎଷ}Z+\P[֓X\@-W\qÌOCO!uxZڛJmik,\ӡpbL0)uOwbMyv=TD|ɥm81^:OGa}3a\mB/Sjyi,^UʸH|Hqi0F Gȏ-oԣtJOQHNRtyy!}VptHRNp`}Dbu}R_`ؑ+)m4R0] ˜UN:NP.y [鄾2zRZ'Wۺ3FhBDg1jC?gw=}M[>EJYzK UB =^s_mvcwI]Jn~mUF9{]γ`WO%VO&{CAw..t]5|&';egG~eV'N+w.1:MѸ6}(n)X,8d1Gb#jsdeGV:eYvиk;2!oIJ$~{ n:S=?_PO)s逅9J֛L`-ٟ󜔝onOP ƗoC,zB??³=cDi̳K,";w{>);~q uGX\ED/?=W7bCb:֛o߽=¶viƊ n3\Ց}:ʺ cݕpDm㑯L5[9SXGقbQ|ܷw&|e.Lw2x)ܾzD{xum! LdCc&}tzߋwïLGbl HCp^ |NsZbWe?ulipgҢr`5RRY*NnHeo*o.o}Sl $-ۂQ_jDc>rVX+뉯J奖WІc S6 a@[e$mj ao-+ZƊ5mdV폂"Jg,5}BIS֨S׵ί|ǣ[s^_lԦ-ҕu^e[M\;֫/.u]DzEM^;^"ԯcci./fW{R׿8 z~Ηk&l؂lWv&~F#OlpDzYcab)/x_ |)i.f'VKÚcR_ߟ>6:6ǥ+7j.a |_wݾգZiIߢIouY߹ewݤ__m&mrSeGúԱY"}1\|n*|s=uO{z5xzn3NPZyѵ[`<$yi:=$#A&a`OUxc,>%I]*R[\hEWOL?w#nޖc&f{(Zae10q1%풸IY i;A WLlmG +xsgNy |T [jjT!"o @/gfy] C!FDO1{Sz rB1A'l"؃wmJ/ JHhҜ9c`ʷ:PA<)Ra.>%u*<ܐҴqz7I j!|SX] 2vgbD>E{9=PjD˧J7[ cފv^"v#H0T728\Vzfc9"it hLK[y\Mk;KUWx'Kz> @MQ(,͂o_~+ KOd$ odzKC Ӣ +U2;#fVŏuʷȺN$+7B-DUp,WxMy O<g;EԛrE=La߹MWo!|~c u$H麎ȿz'6Z`fz&B9i-skT6eR 022v ԩu`}Jfg5+-O.%KˏS竸k3LkcB'HzGd-$>y80?^9*72g10.!K3!J4lެeVB=j_cr'f qՎ*[4x>D&]0Ð8I#H [emh}h.hsajr={ڮr H&x5zS;tu[_[K#6##oL3;dq6^U[\vgQSkI=-mb5~ro/' R%:v[7\@+b1VG|9Lndb/d8Nd`_tyq^>,G43ɏ,kvR;/kR NDm:I`v4kjau~vHU<)KkD9}mD[?GhM! zZa)U88c >qH|H~U%LtǼQ#9jw|,ie $I\|d<\dwߝ >.5 ~T zs3=]ER'E/„#$ 8$}:*c!81{E-}n_bu_y~yԱZ԰~$ 2ث{eM]ɱ| FϨek@.4ֱ}. O#"񓯦ka,8l3  ?eW N w«,9^H;a+'> &>򪚑*`\,kh-g_ pqm}gh,~ϻg_ŝi*;9fm_}B]aX.ݝDS.Na+! ESۇ6J:WpdH."NYX|.5\ݯWpy$^YA|*wǰLu2Pmk=s7 w} N)-l9sbsL3Kޡ-u ͫYhsۊٸ)h'wɳWOcTK(vWΦ/oGPժ? ©cxPb4NtpmcyEK5i~K:,Թ^E/~X/|6q/ΏG啿* bQcԭuьc~ͧ1g7n{jmi)5]z\kWix:ܪܼǺ*|sO3k5g(_(F}GB_.PQ;W~qV||mִWGqFhs5er[*~.Qm+ܲx]*F {<|rOy`-%qԭ}\\=uo2ҹD'ճE?o7Φu¥jxʗ r! ]Geh>1t+q):7vTmGS\ f_Z[[\ M_W֫k2#n8 kx-]Ǒ_~֩xwy7c|j9aC%YD&K+f{BN<$:p4D!Y'´9 {xZgR$4$BIx28y3?cLݬcoA' K⧌Y7 娿qRnrTIk-1:yɃqj~ odW'aLJ?YF>C:6:.{|xDRcsH2M \M?BApD ud}bm%ȔlG'6vo>vV}g_#`QRՓUZ `ESou-ԯ%j:')L_ܨ*|o^ +/L[H1놼»ÃNGHX4/7zz~ܴmp8sm :s/?iL$mR C!VwjEYXOs%ly"rpp"46@=&nLEQf"o\=Jt[噐W2VmLA&,VX 5s[ҙn>I} Gbؔ8h> MdޅjA25kCXnx*}b]Y>Y;<:ac<\5=?>HQ٥ Io[%2ix(=Kt*:g^w9өftFmG GW?ʡ#gr̈́.'hZ6d"<ۣ %s}Ne&Q=׽Y#t^Usl zJ=oP/+_L[uCp/_c!RO3tGR/A7{SJGXJV?9Oc.ZҞ,/2@Ma?6M/~d} ^NW~,S3+ؽBvAϝg9 ; {E_k~*,@3b%YN}OGL:Զ3ln%Z"sƩXy0,8b#l۾DnOw=!{ꖮ?y#i:_YW菌ҶlG\\qL=uiK, {;p}}αqQN9js'q^cgA->T{{ _@{9q01-X<}N|gΦgt1okb S m|M!ŏyscP'Bg!Pau4_I]q)_7ea-M.X׶`hgu˧~Gc<"l Af74͢vh- qKKFz^}>`,ucM5J|\hĺ *O)Kze]n|u}϶󿙾_>櫍_ 9&.݂<=n~Q_%qGYGvy3j8ȫ`ߺ9bMofoH/} ^s2Mºz~ ]Wy4)#bm{STu]]nwM4i0<  H%c!!"v P^xEnx@(Hqqq<"}~oϹYrTw,{5㻏o9cy ڼ|7eNe'r^םaKuw[ocɥmWo -*}VqZ`9@,Ә est+~>~A!VUy]nJ[0civ{\eңkL*SMąLlؐ0Ɇ5g&G򙤱h3a~!FB4&5J(G&{sմpJDIyԦ o &L-s>[t2 8/W3& g2)5!4/ 2㤬ݣ #`vSu:U1y`LE v2/7v۱Ep ͂2: |a\& )0&7)T: 'ULʂ"xngWt7MDNlH뼆3] UPR]% #4d(u/Eyْ ퟥPd*zv)aķ1L-Liӱʕ&0_dq ĉ 6ꐅE;k#]8T8)Uj%G}D:4hD%; gՠ8hK'[r x7:pSNV| T{:L*]nV!NkhIw#27zY&Tۘ4Lp T"_igk=Wlqb4`bTKRjxĆ^[>#Mj y%2:LLeXi^IiEd9عWlR?Hpa@07:Xv$maT i!"%0V!L_jKSf?QJR[Z:/xf!!(~!kh`{O2,`~\#D>ʥo~d*ٹu(#iJX/R32XC\2T oK=u0΢4ƐpetyR#h(Uʤl Bw͛Mt!NV%9zG"*vG1HB 7й|(,\n\,DQ\d#~mB@"uc̓wƥ)״Zۓ =Ri5U=LJP?))/4c2ֱY^ʆJQHcT7q3 s_?RJ*/˧#dXHQH"A$mEUǞUtW/`.Ǩ_x"zD$7 ]ӭ+'oV>}Fp\(O֮ lg[0Ǽ䍏~d8a\_6ʹ>r6wI {>Q),'g2bp6 .#2' P̝vMSj2~Jj #'6o7dHy5@/:P?2 e{'%h;2߭7^4/+ ryF{vy`wX?8bA\xn5yU rj~.zO6\%`Ǘ ˪`YB=kS۷`Ҵ~mnP)"6yئyVP~TaF- v0=6nnl%w:|꾛TrVWN8}M6zl9vA09f#{'NiD9vKt:`E5.ubm$[9OR κ& y#4f )< iQ'Ft<(7OXr,;&6P_RdfU>N'0u |"L}:}q2'?UPm7뜼F^>:9<=ZmeN8y "B+Μ:_Hw;[)o0"}:`1d~v,ܥ0U~6*zEJ8Be%<-v([.%o9aN:钊TR5t$2A-&$5r*W0&GȊ̸yu^Atbܰ_'d7ٷ}ےA֢u]6Q? G-C>*ԶZ[0euDjl:|y*<S*\s"᳇c)ɜctΛt|٘SȎ[Qplq*#ϖ7M"*ƬΛTul|8A.cƟXtgd?fmNE^y^ ˡnpe&9L\C~p6ԇ& ,Nj;7Q ׵:CEZ, gLWbJ/_e\R敠GH6$i`Ai5 o'(NT=g#JISJ:ExZ.UDߡk[Pɤ.}~Pmj>((݄xʠK{f[J5X S0V?u 0\=C+F1.f(L ~U|sU7& `ѓӯߩ@3 sBKۣ#}jMom O'_gSM{+` 紣ʫ?[|/$&H_-o`1<hQ (.D&Xcm}>,ypK$7__Gs᯹]XRoڏ,/NR쏊sclL+ ^UQ\PqaK]e7R eJ[.҉Hb)l^fo"C_M*k\RoDc_ә1W'E/bq7PR;a"tqYNV<,hAr4~G[2zuĴ.p"ֳU]m/nvU6gq"QtbC:c·>>%ѧԕ NE!VZ>.>g< :d>?H/l%,U+e9QK%_Q)>Ca6;G(Iw M,(tcKIp!S۴+uP6 NW1?yR"kpC1A=QKSijG zH/odSw/ JfO H_~n^]-yw`ܾA+A mwW5ۋp$@-H_Qօߌ4!8g]? >NK4ry\9ԞjZ L džߍ0&sU'gK58A!ﰁCW,LxḲ)'4m^-ym+Cķ(^ܼ/x`waRC:}U %H)uuL֚mC$"4o:򺜌i`bC] |8&%9V|=Lmc;`O:~'6=k\r̈~[?M^z f!zͷ ɽZ{?<W~9Fj6V`g 躉̞@+|G Qd#Me.mxcZ6 ۣ"_c67H]&lf >䆓m6* >lOy8{NFvΜzC|NkB׫#迅ᅟh|rli܁|/kc*!7yK_|K6sQ_6{><5*p:_q8F؄# )?N|+4d[A qk0[g~ݢ;Sgd-'}C>RU-/5櫚}ὃ$#FC,۱]CJ% K"Y *k`-EǓinK~ڠd-4O%34y4,l\5Eja5e_eQyrZ˸onKQvX-ť& MCm[ey/ mi*]0!2ْB]'Sdoi-3k16oJ<(K_5E66,?oҥWZOKܶޭL-4'Jnjybܖθa'!aUY-/[1W#L6mXV!˖!ֆsӟ~ [|f}ɡ(1LH /?" O6,M&Zpj-Nz ʯo_)㘻qIz)?JVuc\IuYh<J*Kc뼎-ts{\ISsxeeyGvVz`8p<\  9^?;g_3 Z ;'lP_̛Ʋ#_10Yci^u.ڡ8_U$"ņ~٬q1//r!jƯi_,[Φ5ua^>/cr -e[D @[2Z 0ҏ Uesy;o9r岾a\kudR_9[qo;8tk Hl!E5zCTvLOC];U!M?~ß?3Gaoco?<} ӱ;'artv)\ 4Dӱ^3Qwb*pbx &j`$x `D/:\&铅3?-;x]|O /dե'E; a^o=<'"j " 뱕q=o(Q=[ WԹ; eUis(0=x)# 4C|WHz *>) 4zSjAS2+>D@11$Ao9Q(M%zDhOȏR+%">5UR礕bBXMKڀbʦO~4bA@rrI~ːE7W#1T-CB(^,[rI‰OY)ۗʵ(;?~F{ .U)߅$Z }S|&# p^Nf{[6 y[ۍ818q|Y+֗*E*Έ.cߨ07Cc9W?L23$qI/c*>[:mU$0/EҗPY0wsyjBɧȍW(tQjz1| Lm0 m'an̅8Q>OA4lY6%cdWK_2>DɮQb lBEŒ*{~׉qL[8Ou/MC5b;uvG|uE/Uݪu/~_Ӡ~l vi6=lIc1UJEp ,^y(c\JYѢ .׹'ſ y@Ez)O;`?XF.Bqg:A["zzBoVOi?ی)[cǛG[է6Ix@|r 'yoh:q"7c=2jJO4{6 œ'w1AYÕnׇ?3-l\mFwQ|q'LMc;K_V]d)}cڗ0Y&7vwүsec} g-7CJ:" ;7)nVm29 5}|79hGcpS&yŇIznN)u.̟R갎}NMRܯL(Gі!asMi/aC;@:qr;BEGsNQs}v& u x4;XelЎSg=c8c8;lB:F539Mb"5 ÖgIv.=]з1 j[ȑYh{~vs?ÍNva4؞˞N5ֿ'b'mP#bnC͓Ճa+o{<9l?d9:bjlJ C-r]S sk :Ph[B/&99p7)hjwMlyl-IxUT4Y+{7u`kKr&ns v^Ǔ~]VOXMŒ긨4Ƽ7Mh^c;*_X6P77\7/ uKӭAS*nvX_^UxyY;~UzaQ[WLqќdKyY;7`ğ7|oΧy~_7qLO_ͷΟNw,ܪhכ}Le?Nw,ܪtuA} s:qc4cg?5|g&?.9:sg]sw]o99'm2nڐR۔37u%we}.ɼ|*i):䑴ʹc;}],*|qq`k檲92P W寂56sNwn]}XE"6<QNP⿝L͵FM! }'3<:M'9 ym&e"g>\4/M N?z᧟N+=pYh"ˉBf+ , &8%/[?I ~W>R>-*Bue,anM)K,.v:=!-FFxk4jGe~ჭ,@Q(AyG$+h+g}4rj}yf㉨< &K_5/CJ)tV [2cQM[;4]u3T0_qEH_K\x&ڣ^w.mZԇƳNEVFf?aCT}u:dnE&v.x↧Dp_uR ʱ˦AS D4(+}|EVGl4蠟)\l![;*8Mtq|sjvʻ|7K N+%1L{l9<<^ɝMke֞rWP̆ ݭ]x6D}Z0KCT|WԜPiy=1&:Ǖ0uS5#p&"Z)t;!zSm>D{zx 9u=[ -Oiľ%ch⇰:2EQ$\WiٴsBP`} >焏_~wxU(NL"ja[2+.Oҝ܏œuA`.T|p,LצJQgRpu_7z%ʭ<.] UzNo.|!Woli6Ãg<0YY݌LB␱?U>93 |}Α(>?ʳXoi[ͅs,ߚEбӭ ,-YԸi.Rl1_d 6Ox󧰵i/~Euׇ?_ܷף4b|}۾~?jutYƝ^[>_..yzoӰW_?ǽu 2~ﺼ.{:UeͬԘI€@DD,tN'(+6)g3i3maʝtD;RT]| ?(zEY{vxׇrxx8g'MtuM8i*;yV=vNDB>!)8v{;Hbj#b]* ~욵Ml\C٘k$50̉.];Tn:h,,nF(ED C& !vI=F?h,R9न'NZ/tM7Z=6 |"f3@%pIbx*TǜȮ]gY=%_]yrIMՆMGoww,| KSU_ =K׿NA^"Gc-v|7(?DjBWvQ.vvPk3B;}}(8ЬO!9Xs@$a nN>C֭4[7mXNE$@9=\w5 \UI/qK6S^o`[4+\t82]2,\FlV򣎜XJۏZi􋯓aB䡧5ԢI.| C`ȳ5kd'm?L Q}0ZJT*ok4%SD+e?n[bFH}Th0:!'1iLCw4ekCqGGюQ旷mB_z^ Fߗϗ]OB& rjlA'|X_߅8ZJIJuiE" #]3~GM>|ԁ:+/y TWj,OYROz5k;o/\ªYC""pK W?.DXxﲘ`0-\#O* п#?'5ߔf YO;j NB䣍'_H0P\.i_-?Ɛ+As2𑜒l5p֙CoC۞GxubJυOy!p9 Ĺ6$+ yYk!q>f0!#6O* +rz<8s}h:_Haڈ: +R|\h_*p):Mqsg_PzjA#Io4g7ho|*P8bbC7j`/8dtp u'C_<=>B9:ac'9lapto{xᐓ2\ 'l*X;m}1(Y #8J80JRE+>(Oy%itsȿ1OV6\6{}H95-IWSoHAwA˗ʫ4~Q0#i:X|*Jg14bU<;5R H ET6ؼd h/^:ѝA;%EzX^:KVk("n~]r:^h-_[۔F:@f s_鼂^G-I?вt(I*ű*uSyEsN/m=}\z%O󮋗yne^_nAkg*t]M&ˬ}r}Et|$k0շ~Nq)SW2?pqf/acw7|ow)^ ߱e6^վ>Ou,'Ra5GewՏ,^nO7?&m]Ieel EquX~}1Fa&廍]Rwzoջۼp66,`x9p|':vt|^ۥ??:uu34>F6 23(W)yAz2wÂ=XB,VuUy#GùR`Lems&:YcvbťwGd[4':49Gu) T 7S?:~vL ?|ý &Bxqbl6{OW^`838W&E&\eV}Q$'mG5~깅L,33-eYᓻl94IW \6 v$5٢PЮC& ^TgNTa>5&0 /Xӑ%t֔'u臃:Azi Vʦ dį KFPJ;ZM~], Cs_-;-3! W_m6(. F&34g1t {j!kYxf{hxK+CN.jW7hd u!E?pnBSG\}Ȑra\KѦ+vw1*}NxxF${=r_ZCUK3vV)S,D6& ۊ}bn+l|h\^pz}u/rUyɽt\;0J& e/- 7; ,XY@ׂ~N2m+6ĉ|WЇ'WD7mg4n(F.m>/rCg[b|2S;VXg6o݁g G;ռjWZNʫk2jZg-j-yEKQWsK,Rs)SiуJW!u ml2ʧ 端wЀu-;e@²TjY{.ed!o,Zf>C|86ͩza]اÕ [cgl.1H|ڡGGhG{m8NcCq}݌v!M7%mBu` -mbN ϞW.|6ԇz:W"񥢭'T^~P6'9ܤkA_^ZUJۉ-I-}Z"lq"6R/IdEѮEY{鳼ƀVFMg]~d{FQvolxiv};̍D#Q[tӏw!olza!O+|üL\zHDȯ0VF!"if=0}y2 i/o..S>GH?9b r[n ;nfp=lqU>ULt,f{w2yƳ 0 Av z|CUWgc۞>='DF = yl"~<-D?M=a/[Tu1m:Nm^}w~m8#Qa|Srg۸6$bsS{aC| X{ ҰazcGl^"nQ27AkތsoWؖ7`fg7v9#/pr#{b٧瞮)tE7lw(-ß ]_';3&l0oo>bv zXUN5>k]C챋^O҆?ppSl5p '/%(R0"4+7q@U}m醲ll}dYyiN.2)mJim}+յPuj&Ep2a&QPm)w95*1R5DS)=&͟ʲ [x{o4 SM) fc..3 [Ȓ1 xU.Ϲ7qW_١h5Rl{XNs븬0?ﲎo^%۪W}PaqWO:um-TRe܆,+V}W>h 7/O㮓Xsף]O۴Kםa۞ao2坷_]_:w~muխjغ_Z\vaor_Z>TSᆴ;uלBaJw[ c7z+9gഏζpwC.Oz417ωۋ5\XUzbUhGUW3JA% '!Z2;d"6z[>F?bhQOF6] Jy' }(D9ol/l7RvhcRޤ >'p,엠eFWey$0QR| W[ ClecZK2tB(K,ǴjƢ_fƫp&_E]DN @|1LBxY4S<ku+bd|G~rHş^D$lk ڹHiAٿS ,VCM<`dXbn)# Ȃ?6݈I*W&Y]ϐX>| $G{Y?ce}~3Z7Cr7s1CAEZ/P=ؔ_e\+vf0^%G) D{JwqӚ*Q+زt<Dy;O7y6nXW*57.[x`3*9exWkQeGaVku5Wkޣ4ߎ'ΙxOV&S:n6Kyy4yY;^mΟ)rUzUޜj_I$s.3V 0^wy<}U0p[fsw\ڗvMluwv^ڪF_<dk|Jw~xx;ُ {wDhXyz,~$ZywsGk`?V| **oKܫ;/jz>w-Zκu<ݬck}? sf(\ ~;GA|c3?ʏ U&a rm /y!ϩ(qܫ_s=0/%Ia"Ӝ> QߕWw5(3AyuAxn+~tF1ƙrT"{Tqq)oP^>Ȣ:nG Xҳ0 ;O7.~Ǐ2[!,_7y<↻m,Uypʙ qnN̉<3)ĕvHUocv:`*LAuv':AR̤ ^4~N m?gz<ί{x`L)+3_:ؿs /{L}CC: ʎ,H/m.RL@ [O#t^*1u#r" A<2q'Coѥ1/mUpQ.SNEP'!w5'fP =Er/!t eY)Ľ#1lpe`8NfO[$LWnq/" d֙tTSJM 2͢9yOQE7:6Ix։%ju@?ί˰)ڋE kI9V+Jc 0232SX? l[D)8~cދKQCP BzK&>DҶle^A{YN,JyCKRK\YP,zGI[)]JK\sgn Ju9H%"~|=,д%K.Xh^Df"W!S֯+㛱E]leQ-si6dG>qTNiMZf)!dZgi."N@։?! %! ]}UŬ3V\hR|DnI{>Ny_ʽLQJWfd^ G}#P Pډx.4`tb` 6?=6V;WT`5jpjd3 aM*p_ <@t,Sԍ-+f _{} N9EA[vY6>*BWd@l<#i>m6Oy(FzD%;z'qhkxd3D8Ƈlz}\-4KgyPwNS$kP~k_^*Q[YV =Kԧ2%1nNH1˲ة*'k.o^!?E#2w*#CWI*#ief;cʴa[>$T]܀_[T?nlKp0!'E2߾NZ+;AyPoe1 dV+'+&pV6Hh'lg )Չ>ʘcNft @Ҍ?'sN_o9"l}WyO޻;) >Ddljh Bs_l(Y4Ά蜰1y&Փ׸P[Lx–Xl!2=OIw3'| z1n:u¹`M,n^`ۇP~=}C/S٣WI"v3Gw>#e}yRub;s3j7L>z__)Wy 4qc_ա҇C-K\pvll`ۏV͵~_w|MRK;F~ȫJRgcƯ}L1 w;<5|)^ω?#ï? w7φO{g7=_<ѝ?[<)wx)F[nNN\iI6>vO_c#NyRc{y.6;\G&(kDf=dޡ݁_lGn B =k;׿{ . 9=J~p= J+`d;=@74ccs, )㽽t8ped>Ax-oO|Bc L]9zw}16J?]Q/T;.LUb~z=^~I-H iIc&zC,üd9;w 9FpS&Mgr(GJ[R}2üZYi:a??>L56-;4'u?oPb)gCe-s3H@aϚˀ3z֠38iЄno`g O8> ^ضV~)<3=sqUeK -gƓ5ևc6k|^5(KH78QW?9iNNzzQq5Us

neW/\ A qMN/o9k˖W$3b ,@4@~fʩ>&j 8O3jXF\3i(+0kNcUgm}p= vjI&h\:f2LaOUN}k~S6vZk6|k[É /g3u! 9EL9;)JF35B ;6f# l&ǥe@Pn.C}X Ӗ 'ؕvRksб^7t BQa{' 9$Gd}x%q|"3-vyw+h %=%1rݛ G.^+|S[n&)2Pyu) m_#ʃQ٬@ !:C^tYpLDƺ0,:8$`&ڰmܔa=~-7Mo&ǔCE۽P>m^/s#NO9l)0CTASSGυL%*wq)y>/ƑCc={)"MWUHY ǭ4aI\ǯ<սb d"bP>fE׳![yi#mvyzVkB3{)F&>z?1Wl sE*+MA ::Y2aʣlو. xٟn$t@= qe;zz":U.ObEpNnߥ(>C$ϛSU~͞{ˆ5^Pm9ʕM/'\hM3$sC>+a2d!`{ن<~"=56R+y{5F[gyX_~A/YtߢON5)} S+8V)<|?`ƕ |.OlO.nþF~h \[תdg:m,1+z>ӐilѨ.>+h?O*+Nlj㲑UXs4}%e@lB$mbxx,<ص+P|aR6'PS=lYXC\@EipS%_6G rO>@lC'x*ͦkLXSlpLjqSQlc;}OӞg⿴MמxR@15vW۝mGګƊQ&E#6>yE^kgu__,a:}?p pHklV.=@7ҨS|>Kw_87a/7:lj}e4ݾfLƷ_>1|pq_gg17>oԢl2?lzۙj fO~& > l&nf;·'O8y'fوcvFNpߍ>.}%Sy#*x?zOi["?96{IkмG>g*)xkw7Tyzz{zv9'`On9bOq CЙ~~EY'ї{2{}y=eaVlN21傴9מ?7 g [ԏ }Ԗ9hbS^RF.9Ens\/YJ( hHz!æJ}r`t1U64n]+O܉D=lw]iv.%ShV"QC,? \Jm7UxW]jCHUI),5HgYMIWShꩦ֥G噗,oSR?ʰِW~+._-JEoyyvqkn*_qdY7׼W]%6+*oג<~g ?7ҫļ]ӻcp_:SY>s3~3ǔ?) CdgjN! pyzNkUƹMYt,nUtatŒ1 '3TS`+־6&A?Q&{.bsg2?5x2ѹNdklx#GLqv }&N^2 _9dt8E hx×4&\kF&g^ϩB_SS&tv?03kGR&No&)(d` tІ _~zpr TDR|āYT 4?c.^2|aBeS; ka.y|~pW*kD}IM"gqЭ|Pd$zm"NȐ,~@g.1Viv@IDAT|n5q,2΂),0!n2jZy8U7iU֛V ڀ )4e&ӺYֹL_܍zcUy!)j)Vvo?EX-*Mϊ,-[&XE^é@E)aտpBq;H{Ѹ,[aL Pz׃zPՋ-HU{n/idϣk 6)d ?sш޴R+M@.)KG ֡fA9>EݤNBH_u/C,vNHAe>#yv>-J?wp>-fEe֙\!n:d#w< +b`saPtGݓp>q-vb.)zTIv򆜌;LrF]ޏ(ʃY*B&,FFx yBl2F\|b䳀 1M'-71pm(Ydt!/oڡv9w>9'd0H5 y{ @іi.-Ӆ !\:&niZ4#◺NZȗz:V 3]KmQr?[,L Ew=77 7]ޞP`?` ԰?%]5vg.j#4\ @ʓXlSszp\_|w>lqZf~C SŞp }6NܯaOD9,炼{cxN]MqZ&׺џ COT 򏠵WlC@p< v))я~)6sNўK}_a9wnNE*Sjևo:ǧ?8|U>~||:zsw8A3;lp χ5~.FNwڗȋʽ/`WOs-9N852ñ 7W[:9yBE;iM\}^נzjaԕ'pl7`J7hE6}1){gyI]r@ -|bT^õ6G^!u:nZ㵧>^x7A4!ϫWwï ȳ wl n^ R=>VA_Ӗ)7ލmWD걽..}dFy-.Ļ L+wbiX'W B,^KSsyKEW'ּ͡~M{^M`R*y".7.wSڼ5ӛҍY%[MMO'ie[D}/R/9>-'=\?IesynJ7I֠1۶_9 !W?G4BIޖ)?*C,7_&V-zS_}ݍ?DBBL@3E#F#$3@1g0 $$L $q6v8 DZ{~TSN9{o眪r"λ^~k[{N~ߖo`uYc+H<={4O~۲7+GG9Tv>!7gź97t(57ǵf\vRWo9қrP_;~˻_?̢?Sqr12QG_N o\ ¬v:/yJ}KcL̵?i>V6qxNn)5?KjyL)f; ?M=uHzdj?Vfax4 9t&CCOM]8{~{/LO~ {\z<b^L"InAyy,XvY8e䇞-wAEJ\kѡַpƿb?ZDlQ&5=h6/gS}?xl]Ģɧb9?oal[^zۺۼ؜)Dӱ2an*mݱmeS6c۲7Y_ʎ4|CBɁ&x Po9 /sQ%9'CvO=[z ==%|՝&؝~d~?a'GW>;DO͙Qfh t'w⛸>}xwu,` e`n!4کD&g凌}/N>۶'_v' ?y>r'lU=^-M>0ǰ0[^ɶ vPz]RX+shJ2v  |gUlʋxra91$H@`[`\4? }2f3_qE4턩W`&:2 8ttx?$ݮ}hJŒv)> 2-#q']ۯׄ(W]x׾*3| k}VxAW5I<p͕Y4ȕ7cCҏH.-}pmXtLzcg&G,؈?d?A9oP^~pB~H l'c=uF&s%~( "|G-<D.yB$ , W4V˽m![<~kK;bh@9] "ʚks{nR XB*=Z^xw9Q:c%P=$V,L_FQwA?IĖ-4 lӜ4k}[Xo/dI[Ʀmr2f0 Ir2򆅮Л{,nŭl2e!L,zPJ޾ ڇl^yK,ݥ]^J /XOaL| Ks&3n }\=7&壟W:)L^\aB/WNC0 k>m[hg}LkV&[Zdfww\#}) d qu] ]}~z;NeYĢoR#tفa'UtNB69e bLy31; WæmsN޻P̸񥄌K7NB'mЊœrA|eX Yw{XIr&,+>}3i"CLe }Xx,\367 >>ºk {Iil+.AMsgy觿h)>o=[6 cFw=姻/ɓOvs5 f~ grz{:v,~" k{!t,pxD9a7 G6},+\vO.:K`!g}&K8)P6e@s?~}>؝B N }@Dr>Y7PZ\˛oL*q;PXc+.dyY'e|yp܀٤`pXdaK;I{-$ ^wlK/ {򊟿9k`l_<þwuJG #yr^!5bPږߔ?]a8dpM E]ھDGSs~'e:m3nK6 ݦ,\?VAǞ Ĩ͵mY|)w+5'!tCY4ǻ˿w-}]wwW]yiKWv(rKo?+pa~l3_^|Kv^=?ԺRwM7a4GGKmk8!p`ɟa闻C;x +ic,2?u I-JA0y~|S~T/']  Lз̠5:0w]xaH #ij'L ~5ªfAmˋ(Vkץ8$=VHVE#CE$IF6|*7Ũ+Ԍ*msNS"mQ_~k P9}{=CxӶ G` $`WՕ3EƂry3R<]Ë+:Yq8c3ęҨP {1zA KJyX)RS).6$gOGE+G۰p\\ʆF6w`W,v6Si[` nS-:-y ߇V_3趄t@023G_KZK(:iuȡMʭrD&M`>Sl8їyJ7B7yۚR:BSCIvEI& s0%c:ygqr8C{[/V#vn{V&c/mYĘ*N"$GOt&A[3zbʹ2"8mQ'ޅ.;"ϤI=4&5_ l.ݝI/?g9E4ąױ-5}t6{Œpm 'TDإ |!vOS&;̔iS)='dM2eM\S}\_9&n(V:cKbKWDi xXDb &DK y@|JʪDrl`RI&jJ}V>'ӟ("n?+!m\^ )[ԗg967FC̡cm4s.}CY%3xN  j[h Lҷ:K휉Ps_a#m;1뢍ˡE}Dަ(?K!|7QWJGb ̵/~ٶNJΉ3?Ѹ yv) {I?t(l3 ,zȓ]#|F'ڣBYs=B 3~х "D)_0Sorcv\˲HyamTv~x$ H2p҅F⤺QL@:I?l.K' =;@ˎK8˸ȧRUXw 1.Zl [\YCXyL IKC? oi~<ﳻ}‰ᔅ*_m,VK13>%⢞,As |t-~^}Bw<v7* >e|ܝ5G(1h%t^qݰѧv.Zq;Rf~iSwƨW#Fܟ%5})wTvh^[~E8w))a _ш0ٝ6\#o0=}$63%'4,pq[$1"BS6>dW3`zU}s{w祑ޠ?剃뙲٤{\ 7,aҭm㍶] K~]çk̖Ms[Yzd{UK5&'ElسRW(Sc-mc#kS^(Z+xKje - ^t-%9mٚZzS:M-PIav+ڞjzܖm~[mvI>;*+seXMSs5w{dm[V-=ߖ+U5,9͕|'}n{;ܦ^!tU.?z??BvWv?~B}1xpGyto;3۹/.?jWRC=?mk|3ouzi2G3~J:ޫu㷁o5GyӞM;zzoWۯxlNs+g a^:;%AExVqςY= ޔh|]ô9L WSBΝtgbw>"n!qzxҞ5:#j-]`V0tVBg|<)[4ZͣP'X {-o!mš4{,Ϳ8V7]n;ߣEIonmC;<ftUnhuvd,Ģ<;(~v\}X`d3?`W>sq韞[QAPwBᴏ=olcDWBB{e u(*VR1JEe`)L,G.؁U&E=N&K"stNq/8-$QڙVD KEq.8sOʕxxJ p].h%`iaB,BM'nCF:ϔ0'i?Pdeqx1C?yŏ:a\[eAtb( o)/|k>BH2׏(?X)2w ΍8q5dHN慁訧(|yਖSQZbJ'ų :96!rӅ3,^|NfTJ,ɶ.TT^ ~z6I>D1orFR/IEQ0 +lb)Dm{ Ne&0kx;K[>e0j }ǜIBwhL&'6жLi[ʊ;2Rxa϶bL{=9zLc\(o<Lbg~inϞARYKϐF BV{K((W%xwmAX<*2i&:!mH\1H9*,BGک:< ktB6lh:9)ҌNC\;Bl)|[ZS{ ]xg֛I_eRJ$DiN>=Lw ,<:lKNT)=>;qݷ35'|{:ӥji6چ,1J"t|ʃ6ah.4קsLyd^1\}n~=+Os1,T@>!w\ԐY+T-~B1;U?p GR#E>tA>%!Q^d՗vrۑYQHz'_i[m'S{m۱1sh-r<=&7>;y;HuĘe!"˯-Rzۚ1J%*KT¢yYji+A[ -ǡ= G神6Hi˵eoÁk}۳&|V6f\_cJo+^CW^k%sq 72N8ٕm:/b^׶,?O_~g>o>]~2xCsO> ާ kp~}W=:[8})|w294?߲1OMmKssT7Mkޤ= Oǡ5moiM~w/|QޝeiW vڸxwscwϱK2Fc(>+|g,|uTn}`=x&̗|J.4~]m^/2GOWb TۄUU [Țc]\9Gnh ,99tc`Vײ\cW xu艼gLmS *>󕝢M݈m-Swq sm~x[x|S-^qR)acy˦圮%fCqgqռπ'aA Lr_LGCˀ+bIF(feyOy.t.{_hO{[7wwP/v&@ 'DeL%PY+ILZ`90~s|^ #],1@5$잵ڔ ?9d*A,^g/ݔ%tM.vNhqqw3^|_y/iQ@X 簳/eV#y`) D.eW oWԩ^θrEeVCbg:w>Q}][W>SmddVkDϓ, H|kPf$/.䈌ƹ-vS7A{Qv029:3ī.U) d7=)?5$TUqK.) EG UZ&ZObl`ٶ='hy-_iLNNbC}I25kC[]uzzxa]zS[Wd24.ur0ˋ#_xJ"&MkF[8.z?U[: ({vobDe!KʤONg~"C/;ad8JgqO@-."{4+<.ܮO#T~vd:15RG'hKwئJzx1}ʧcM1*뻓,Ev}sM0>x|n^;xMtm6MA#l4\|o n΀E Ni:4yXƄ#dwĐ1؇*=% "b(7 NI?uqrdQ\@`wAh%tw.2.z_*8%~b.H:ݭ&<ⓜ.;g_<\L@O~O!|a@/aimLJgķu๠.@g'!wm!q9 #Zb^˳~qAڤSXsC^d8' cBx_O=ўI\Du5.O+"/q";f=z|=8zn잡+m,w yn7ĤW],~{bSwE!/N>"ΉyJ_9_p|tG,b,-Gć1k_D!5{֘T=޸|!,Z{o% ^Yi+iqC৽0V-}[3dF&+Vs38[-Vx7%#q}zטK ^˷TJ[O$s6L‰g{ʳB[:XCk@kXos,[z8o˷iϡʱj Ǿ(oj;G-ߜ7kMsoM#!P}|S>G}z{k}9ۏkзTIC970S13amL[!*|LSњ<3|[+xHoXhiޔ~_Js(M]cxZýo>}o<ٝ33w7~k|^}o׏>Bc̣%U&Y?}7yoO﷯ !9T%+Ձ9 qX-yW{Ǽ~ _{Vooqg|ϻ{kl ~[?;S>)qMz_o[5Zx(mLoy|%ƍ~w/ Y|wAews|Ɨ3<IhOD:f37<BcG>Kz0x9#>ώ~T^P|]>Z)-kG[{-ݡqlԠsCU—m}EVV 4ijzY5+bKvb6&GwrD|ۙgdtNX;}ƙ33@JMB#F\cV/ϥu C*c7dX /8 o_ / M*L.:;Q/rMI]*scT^DϖPSG' x0pxcvn\)0?-ȼƶ9Y8B:z$6A()R̗ԛ;s,]_1k_[<(3fϸxעoాwFWJgYd$gϵ]C*PnI3'}s&2#oR9( ;1bIMOrZy~G!`4eBS^&c3: &ÿ.S6mm{O @~GO~fh\)ad2|ME.&H/.X+עk,%TC[d> I{Rf4"QF[ mJ޶'u fцh.c&k;OhrقVpo[kr`'iONʵ=ǘ 6'myuSʐ/൞rtq7 {ecmsu;xmydJW DwKPdK*FĦ,“Nɱ%JK.!X^;?K9C ~N^6ncvtrEN8kmIpmMXlȜ.H\c7u|,2&v݇BqEO_X`pgo( }Fƞvz;>4xmsk3ďqqip0yeODwAb7|Xv!w5F ?0 iCuu`mC4.-DEfܺHDeu!i7"__S&)GyCRwu͙_'66ZN`: yEjWsv>Ir.L/y9a'6Ew+}?pD~5F]`?rNLgZLiv<~Z}? ekƂUO] ]p_WSB8Ů' [v,7/q~]B =$>i>uā/?Qmxɽζ;I`E2Ywʖ.2z*hBYg*z &pUY1m,})7*dPN;*>/&\{Dm ]\)<~n "aqe]VcF{IJUp-kxskH:Egg>]+;yKA_0>D 8E:f]a9a;~G뾋zwu^~1EF:F۝f *v{SFaQ'btr',xoo=};,>_gAĂ]5DnXRen|k%Jm4Ev`H4[)LoQI9auvM]q֭m+M{2!52~BM(%atLCCM0u_U-U~){Ȱ֭Rs|]~WynTm} }h\9ٰJهS<ۇ{ /a*q%=?m תj;+7t,Ԇ+Oymz>AwoH'{X!֚#{4_u|~|-!Cǟ7=Jy?'v_w?ghY~]5l<‹+-Ϸs=&Ngal?V8&[ y ѨW_1el1- lnY+?ě/H;V(D8LO>+|ճ'L..3@9 G|g|v3#@IDAT?★`gq;8d+#a X,G.utlˠ z^~:j,9} #T7s6N?do|a+^w<_;!IN@:8b%Ϲ}QTq631>Ԫ#i#~*f|0(YNl.ׁHc$8w!o=CĶ4/~Th0xɃ:d , LqۂBIKQX Fhnە]T#(G(=RnIhY&nܠ#tkAzF:!E\kO1ߨJbDZxVbP|SXdmUvdiڥ42OuP#6sϘ0KJ d fNzohW3`:/s0TQ$*_ե F, ˥gAETW&^;֔&!EX-= ߖ }"qƳ0&S~kSq. MHk " y"z2 }|sl=/.gR7K~RR]郱lFy}Lew_J{$.n2$ {r')h h"x`buxdxB';h?N 27TA7^+kN~/Ȼ6ᡎR.b %7$ r?AemW@|$Ƞ=0@Ia M}̑6Nv6YvןIm_8qx>ua뻎oƞ\}V7zN'ˁ W^[ҥNxm>=6cFS?x"c8ȑkҁ;m` =R7R:pqr]ԣNqـfw2$J\9(ܚFx"^ho곓p;LXE,.1-f.N% 4OX፴c"7b̸pPRpQ%ta2#>.3O hB vm{;CO`{Y:wRE=)qhoNc/G~~샇 ~w.dz┗3=>  6N%';;K)q7pϱ/9 \σT  o<z ;zzmؗtm+MԻڰxNMBr{ߧn 9NP~` 9072(h:sJqpג57usf_!o qXԫN*5<10H۴@olzqHKR {bMoYmo֤5].Hg]+7ǭ$ʦ~h6?pǏ#CۂmZzR.#3۫Jnl+8Z*o1ʣ]"~ =9Zٖ Oyx¿O}=}_y{C'Q!jm7_{{?qgև>/\ĥ>σ RӎGa[ }NpQOٙ#< x>!;v1:Dk X`=얇k_E<2|ܱڽ<7w7SWnWNknޑ#и|8 8w c-) o`CA~6Swq+Tfl¿9}MrN9\1 N'v&DP}.a謜,^9}пttyN!EعgeZt{'zI31r 5MGbEй\1 e~bC4x r8 HL3.M?&&=4dQ9{؀%k|'ٕ v9.hqv K@#4v,|>!v, qW!]kuS1Je$׊<xW}?)֗XixyVGy s ee =3aU`.bALmpv OY+<.V:pw)ka9 ~8D~qWu}A-߷jHpqP^!P.’.X}@1(NzwR?Eh^z;Ι,C'όc^hG/SS (f :CމEqсw'G=|`"7m&6La c{G&MxQS[iڞ\#>?NH&]x7ڥ!oNHI$/ȫ(;onS ]]$.4$- K%ာQcr>d@kQ"Kz9{SD^Mdn_҇[QdnY3`{dAvct EQB8WIr#jj̴Ć*/.s&@=/QtљN2-:7׾}01^˴_㰱}k["w;;Yl9\=Ex4(M䜤4nM'/2x}kU*ߒeeMLk#)v7N`<遲"N/BItRB5y!S>NH3`kpT{ơט.sj?rքa1(M=z &Ym1h!~6 wH^4W#vuxۨe !'s¾cڍ 3ݾ߷#c ۜ\a>gbMXĺO.rƖ&76,1nDE>𴥋#?He rLbN+΁6~Kz&Qrϡl$}l.7KڗVXbg>sa-si`PL#09$Mi󾁪S"6UVN*ƯJ9!.^|>KǶ3o[7<))Gwl4ew`9R16A]&iuv},Fpo.ϙLB"$'SF?CtAM|}'ρ zw7 .08چ5H]!,;(rS|m/^pYpwIܟx'~ۻo_)hO}ϑ(Y@+`{]k1mŊ9N-KGxiM݉_O)|6sc=#- ͠Eg˕yI|[4# RȖ"0DڣrMsr"ҪoFqb;m {]Q-Ko!r56[)4RXc[]/-úcsNS=}lYISa"^CXS%3m5F(q]xVMgmqXw 3`zyfނ:Y*9tyg~dpK=Bdݔ`);8gS{x삯Ҟm&6o_{4M,lm8ݣ30)so8>oRЙn7)c7{S/IR{y[~ ?S,q_xgL !?<2xgwKLx]7y>s0~xΎ t3+·ϠȕPmދ{8aOɿkű.d|W~sWkqu/|ϵp{c=-?F\5ܻk~ηIfeuXe^_;Zp3Ce}cCgsSw{m;'ώ b0+loqo:c- ]'Я@JN q x&d{BuJ[c4>:pDa'l~ɼF'@6'w{ :X &ެ` h(Ie?C>K]itPS*4A6al&:x%`DDVG[ݍBA Bu˨5nd\TgR+=ɟd<6Za<*S@!I~iBL$n63y}ڜHO, |z\} Ē+Pȥ?d‡ <ë}JJf%20Y3z? S uBTv@ EWQt\ڡeyR.t‹2!e=j ,H5pkVgStLگNюnI|/eD]N6vǁdg+FG!ŏqQ*0BQp. ʰqq]E')^`*#w61Xz. qhJgCWYjD "RꤏEޚGR/~Pmdrt*28ԩ`,o,fT`OiIQ{vmQbvDPU~iy"<cmh^g5)O_FJc^XV%%_qSmvNî,:yv_xy/r=OG.+4ӟ,w!#s7G)8Gkim[t|Qp0r[ڱVCu/PK\O'Aq]hbeh FAn\ Y< - hE%W/,D{xz.+I% =c´2QB 9;9?j _,AzalgE-yO۸C,&,ڂ8U # p Ewr\ 8i6.%5wh?i K8Cn+r)2'w<$s2[k(>,*\܎M5'E3!n#'mtRs%̽GDD]p0v5E-@=L;08~ FdAE d̓s|e-!j-uY.p '{^P 5(zO GO9vFF;a\(CW3eLuё_D}* &񟼐9U-#P|$q$Bu(aNw'H|E;!{ ddwKfu]Ԯϟ<}ǶWc;d\8}5Hʉe`w̲kbv_ݛ[K<1maZ.n]&С+;_ 6e  "O>&^rLn!i7,P4;bvaG>m cm_-'`ӻ -+VP6&GW{S|vTǿa Ɵ62̎RZ~Z{=UC\u{8Y<{g ^},\Sk͢BMHz /xΤk(ާsxk/)-:[vX['l_Oe3+~NHKG?s)d'P](?fk^8*+p͕E ΚgAy.K_YP_#E^M^0OGv[>v>:۝?=b(G\hj.$3dẤL= cgXZŕ gq-7! BӠz6ۿ9 J2^kj\W)͵~ڕny q77BͯtF1Jr?)o=NЗJ#{_ S~-Wi>Y)Lny4cϖU??eSl8o1 =;eN~-& -nqbTNvM K{'hG}V KˣzJۉ <诅"[.'߼qĂmKcncF?ik&l_l=&շvl+`M;}Ԓ)io҇Ifhqڏ9dh,eT ƐeŠcE&Bv^Ʃȕ6X Yu'S&8^DOCe_v1li#1v}Qft˄? ;4zmIZ} S^i $ۥȢځ?q3JE"׏Nܦ2.ϥɠզ.r }L/Kiv0r#MRo_Q/z:,ʝ>-Ub;_k߈1\S*cg-&̀T˶ E ĀuKk=)AE^En<$vɰ1gd̈́1ij{S.n'в> up8 YT" H}(RicU%/u 2ye,:`/'ǽH̭Omf> 'nU׎_;wYLk3! G}`wlM)䱴WKy8ٚIE|{'ǘPuR}VHo3\lNjK,77Ef6l7uUw)Cv ~ TdsXWhea ~:8$ L~ e쉻iC y>eT6w<`[ۂG_q$m6pѯ3a} l15x^+=ánqsşbڍjG}̛ F=}'m*EyFtO\ iO:pN=C>!_}B87hVx^E_(0sC>m ? gFa1G ,Va2`Ohc*2Ėqjߛo\,HGyYt"NwoW41?f)|܏~zSeQŘ#u޾&[{,{,;n_{ⷾOQEt *ƚGVbԴn`,|?bPz)/ܗZ`VqQ.}fV^$3_--*`xll8q z~]n=*!m+P9?C)GEu(z;np,)m]C^tq`e6ZG:p^rʦqhQ7v>tYrD'7 b%Xc qnfP\֤bs*݂#:|cV}ݷ;>M%'eIB6oxL`αi)\曦LFKjsn9ѿOKv=z=@P|U`#yKDНdo>pa(p/]%K>aTc.}v9VVCtK,럻K\lmex6Lܩo&(_zYЏ:Rt-eΉ9/OBS2jF͢o` wli.H䜸A!|Nc,CNŔ]`K[=e1%֠p-iRf' )KTϔ:w,DH!L\b _JS+⁞Swe6a 1o]<~:'C)d(rs,"+3Axt1`0k,=aX(5H{+-"9𯏔I$雵N[$.x|BC|`͙\JO+=Ƭb+Jd}?aN03?@Mz,*+fI\bAij|@o *5'3/=+-wBG][{xɈLX݈O|Lmؔ}s> 3h{3/ ꢭ WlI&-϶cZ$D6>ȧn/H]8'lc/xDL9GznXQ]0ÒC7:w"\<Z Hu[ IZ opL>}B?p59;$gS|M;OYImzG,qb'%vC惞4)lJeIM|e?yUm|5[=?k{ghQQ/h;8MOp^}CtDNw!Wf䤺ϲz"д]F0kB#x 2ʻ=kם  2vgR}SiRzLO|xO"No6LgSAgbzh dPYYx9رo6ƻm[8D= @ _0g5aկs~S: s3'@>s۞ vHL/u`5i|2^XF,.O>7;sAQ4f7˧v/~gB_Et猛evas1sߘtG$рA^ؑg 5zpBDƄ64YX~?p.NZN pp7w(qG;J6@Jpl0FܭᕋG ! tXJy\MSeZ[xVwVo;4_|.ERwx %=fg St_u;ʍ{PE|Cwit!H 2ϸ>B8F1An+}l[i%Yjw)|^} W_k;#wdeƻܩ&1ŘqyVS$ӓ'Oءc|. ϗ| Çꫴg.ч~L@&ڲ\mz&iFe9kY{0 V0rJ'"n[;2~[JrΤFX+Dk7kM /LeJlu a639W--+8Uo.S/]i ЩԯմIut?e:XoY9-}mʥ#çǁZ p,g_yJX;Q>#wk9/=' >ahQM/|77wn;s¡{aZ[[9=N4ldX3t_򴏰ndy+W?HV}LgyMyݙ>SVj[:3?[&{\ǿNx"_!c<3\ PTst!;*|ܸni8F}nQM`c++w[d={(]H72@3Zנp!$hHp޻J2"3UkGؕd FY#XeyT{ieaB&TV>\7[@PzrP߉K):z2 7$vTb Nj 9x >|8H?6Q2#{N[V!ڌe]n|5Zߊ]tZ/}! 5DTE z]|EWR W}-4vZ&I#]S vo/)4}ېq`QrPZ-eNɉ VaʼnZg"4U֣&Wy];kgr՛[&s_8a<9BfPhnxMޙT6TI3 _]¡tOc9 }S5BMWw;fJVސO,cLi^.{Ή/cVijMaDKc'L}Xl`'"%`{zW&d?`Ҳ^,fű&+򌗊HJ&:q( ĴP m$/4I#u}(.s#!n)_'6?7" ,T]st2=O!_̆Ov^{iy UYD zę8!2&A.jhx-7NWao`ND/f94tR,^mcڭ(H6ekܲدȟ'6l6x-P70Yׯ^Y>[U"iwЛ{Jasd\OrkW.>YFx@.iolJ!7Jb/DL"7-R]No-tr46^/cs˴(|d|Ӵdb5x.53-2Nl)Ixd6i%02çm>Il vmk6Y^ ahJ ~"حN|L߼=?U3v|`QtNژ}W,hІc9/]c5CүRY0FĄ7/ =+ȇ¡H,>PҘ@,+QexM^vp=.BKb=D z#r٨pw,@?uSx(CvLDWVvvJeDKu0;e(kK:Vdq+z/0z^kifwZ"}FG8tVW >qj j"K_]l!*(Jo˅6.iܻs ] .8נH9~MIpt ܶ" cEz[=îaSwǯٮ{+ ^#߃>¯?ܢ|E.޻1n?x՟7o_c7:>'>ʤ`XcMτOmӖO}j4TW^ ae+JR 텖m}iCv½3z¥divhtoH[vxocXRK|0k˖ ۗJ9Pz8=l+y9 sykZRPg9 b?1qBolWmq͍&1Ne[M ̤+'Kx~ M܉ˡ\sKX^>Z"m׸~&vM~}z~*87 Q[O3k_^KV)Q6M~-ܷoiO~Ryo>&vwOWS3/Gvu[Y&?۲'[^@IDATO Dmw w.-:N~Rێ{n<)?? ƘϾ'λH縁cCfީ3l}pGǿ%c'/A}f$3XY@>u"s~zr|Ky`}9 4i 1 Nkht<,ޏd|ZyYȑ~[+z+=|u OγT)e˳کKßX3a;=/ŕ=CS`Kp5 6K}C{&S{8?V6􏰎8$A C~;yA,qî$(пs>; wfxz˿xp`ZCf|$駎ȳ*-KyI;| +K۠g=Tl~t:5 "Ԏ\bS sn:aXVZibyG҇U7E +/:hޏu꠬<2hJu& !蟂#ikxB gZ8^ ԣ2 ( Mi.ŦP ^ yZ]FD^|ɶ|!tyCAT佄W[^a̙( "l{Ӗƶoqc`UwKk\,^}AeV~֕ŝ] [GfvGln| 0t6w.]_!|<HpkjqY TDmqT?ec>ϓ6A EMNSE.*qS|iYrsh,`K?Q=\K߾j=MF螸I(x3' iK'fI1X (s"rv8B.'UDۿ=/щ%a6\MzNܮb6>q4-hÉZOb^.eε*v4*؏+b-!e;k8ѴT{!gt/z egY +W'驖]O@N頥> Dyu{ۣKɞ1qz|hy'xcAL#/k$eڈG":kY7,gk;_;9/;Rl7+zOtuS)MbO=b P锭5S^lґR*38MLjjGbYuN3 }*ޔڟsT)~:Z\iJг(7-Tӳ#/˧%-]s\a6L]ӽ?/I5e{[ Fr[:/?M/1==KמKO#b/ﱶ߶lOi/)Ͽ/s|j)v}ip7=<yK/jZ >'}*#SsLSRS)}.pt3[#*s8ܖmχe9ߦ q8h,GKi'<;fϤi#NCQe?~8;7;PUU"$$UiaW٭R!|FJ8o<we׿=?>Wqt A"R< I Wr1nb|R>AB3Yc-IbWZ0XCʌ~N :k;-ISՍ mf*eHKr/|q(Fr=rcOzx~ٔOy->pP^YYg5j-l_{d]A_>ALQc`eh¯Lj#%,G|.6x61~CDg݉DXUorRӷPXqb)t--XزM ~WhFq^&csenaCMUE(n`Xn ȨqoE_MK*mL8Pp{89BQPФF|Ú-ն ˩h@Fp݊ L4wr䵌#|U$y@/?po߂pP  ß&^B#658ᅠ܅FWﵮ6B'27 G' 'W5^{SLŵR,uViA[:{AF1ˮě=ZhĹ4a)t`2_tiu/-vA`X [ea:b:$鿧vWԦڈ_ ?lC&{/+:)^$SZR,:/r!DWʵJϲu:!AC@uձ> I] B9x١gacI`iĔv 6&^S[䣯-L"Ay:ĺR*sl Att>{^"1 ;&c1NiE1#X 줌^NLFl*Yuѧ=e#w&h<7 ih9,X݉Ea`cNùK?Mq|M ĎhmopUO?7߃7_pE솑 {%E|цqAc} ˴9d3>\rͳweW~=}+:T_&@E"Ƞ."%N蝴EpWz S!.fc;8D+wOvnImw0|}t\4"Cj&~~t7.*'8H^sX":|WrC|,R굩 x_]a5UU^#)K'^=~.\JX@h FM4'< _Nݽ{zIv1O9 bwu7%_a&qnsمD]PF&aS쇲Cq5I+ui:M.߲]yM;t u.-.ebA[~#99ԽPͭ-óWI> ܧ+O>0GI Y%GRN2hisZqޔ-cd-rqU^1\aZR+e+eVcc- |cdȧ閧#K!i܅o;~@<B@vk}{|F"k˯0/Ю6_IWyW+SĞ?#8Gϲ9 5']=;妆2aOwcbcUr?W6-?^u-'-~%y>O#䇇[>{).]KqOoL{}\z:&9&~.˻7|&k"s=sh}s 32Оtmms</Л|;mwϫ_*ao6c{%/p{}\]/p:QLLY9hhG6HJDίM^LEL~3@t2t %5hjN#p6 DhHr@nd(0$bgh fPW,HZb-#>&0a62*@l~(J3GY`7s`)6]b* A$u].˵x)Uv֦r'6Ly;Kg$V.+q-y](v@ΌZ 1bCWNd'Օ"s!q"Z#Iȱs'!-hZ`G,_Zzb˅/PJ2§'ގ_E\x(Sx_B7,vb=vCȦV%+Π{BnPM)e0Ӊd&qbl( \)@4&RTBM|צݞsyY͋h 1,v;ïф9U]eI=u ^ &4s~_FecE4i%⶗z:5;*f+[ۗl[ ?i L9 hT>V g$5mXCLJa73L1p"a+;UxKE?1/FJ-щSz{0j@!u=#MFO__nMV8Lb+6ĝeȟڰB^bg9VW$]%dL5~A +/\It_۫rSoc=[/tSH?at'ŝrN{бw'㣟NUGnUrL(q.]++,me\j/ Wj Gw"wyH+f3'ߌN}ध|t& )}L!m䊆ڢ|`o$;p~<3\H'4..1U/}ڊ˽7Nk裓|nȗ~cf5))~v5֖ ۶m}&$EAvN ^C= :Uv^<'JHh&kS/_6n:^ٲHO+{][Ў])%^8]_WV #&o:mgxab,򃖃 GV86Αc3,[HЏX9`?愿fVeY8,٭BT,~W0[|mC|^祉O#Yz O\d뺾'2,޶'a 0~Epb8qwL VvNK>лqrDpyeqG{k^<yJrVqK'υqTJ;:fG﫡ӏ?+1]JlYDO%g@i;}:ԙܡWEK,;)twы }̗ oF|5{Kih"mMd}< v캁s\[@#4kYa{.DsҒJgcZ{y!sJgKGGzOޖVږU֯8wŠV*1iόѴ%Csk gnd4gh' Bp} QR[kZJ+f2ϥ?b]K~LZ̕HmVfoOiVe5+ͶLSޓn%՗U[?R4VY)?:TQ+9狵gR_/?w=_scIky}&zL֟ ^ 7vgJr2Č%o,kC7JSX;=?eBN%{cCi/O˷:oqG*gQlO~e>)WiI+r ?O~%.WLg2 UGĿkx~_srqynyښzÌ |xOyZb vfyq4.oxvu e%òxHc<:ed0/*ܣKy /ӁGӟh=s? Q1~[7S6m~J~xM{zG!աПzI?Fk&S[{l_.g&4\'Ɯ?:\MFBeDFee_ڡKr YxrΖ_;:NJe$Vة8p餫:N'g)퐭qzI]]42;$Fr;rH"*L$)ts 7 HifWoI8paWeJeܺ)d9e#:x寲 +y"öI #<~o0x r ;>Bign\zA|\hhJ;qi8U$!r`w%! G* ^jk&r/xaHc/V /uP9Q硜Y Y|nEK_b$G8EZEKC;d͆+_SݰG~xGjRdBI9_tGK_آ H ]$l 0j ik0 xk",bQ:Fbß~%$&$3.!*a"'?]Du?,חfQ|uF+|0Չ8ދ_8LTᙬ\>ڤvj\?iiKKЊj."bY8 4C!uk[w@>9HGvD6zƣ d2iHԩCai'45;A葳ԙ*K#FENՁpˆr9.L M=2"ƅjmBy]s"_M2iRwzc^K{B(c׫ƒxLJ7fCT"(GIE8765F|_}»~r]E;-vx@rF0o~Yv s6x3DlGtϵFLB †L+ }8Y~'q M},\ݻLPwe|k3^qA&W>ƍ}m\XfчW,Webu.l/>ƒil gCܩ~BF,CGewṐ碴@r7yOb{}B܉,7e*^:d2PľkK#:k0ܙ BoWov{.:" z.X`F^M]tZ4p&G<6&^n\>_ b#ּnQ.cK_~8yyF.E- ]ckKXVY1mozE>Հ/9&/!=Ēp+XZ?ST12L* Ih~%KWMy#J~k thMT :;&/6ztr}N=ޜON gNuƪ[lnpӦ'KU)9O&5-Zv6+{.puʶTsse[m?W柃lF8nm!Bj)̤-=jY*Bzz ąp;'r.0 ĆV~,B"Va׺Qd /|?֯ܟn-Ĺm69['yzP_ 3ϥ[cK}|per랫'\6DNJ5؜V|XYytF>wR X0z=~d ;{&^F2uFRHu)J"Q6]ࠜt>t`[:P^"o = ׁ9 [::x]:8"; Bq"@ʻ8@B)#O~I,zm-ley>9'FxHó,=-˱t^qA;" u~2}C6p2\z7h2?ڹ"Dǎ7j^TB;0LhPECtR[#ԥCLRY ]M2nwbH}N .H^;ĞTE5 '7l Myvw<,7RrS']L؄bAFiNi|}(~%}mV:d7*]#aJ_.zϤCvԇ^#>E ѶƣX'-/mߝ$Z1Qhn'ԢC}3лҟ,C|dBv3ɐKe63a" SVhPM`Z$Rv򓖘8/(QZ8[ ōfnؾqiOS釪iʄBmn?*_}'(_-%<6˾z e9P+pD[jJ(yMje9^ /}1rbaL^>-6=@Ȕ.7!`2!z?i勞`xV>N09l~+l>M#<hI P?m?ꃠrA RL4Oa )t2!Dʎ4 礠6Sn-E"խ=[`f,~9Hڧx=nމ><p1e/.}'{Mu2h#_T=a^:\`wc,4|,X\W}:Ncl;Ho~4UUWl9"z_+G\]7B{=&{ >Q=x}ʹjLe؍ kK6P>'A3yĵ]KύG=>{h :|wйd"ىMu ƎYakBO\l ~;+Y!O>Y@:*B& =Y̝Kaa4-ھ)muEzP+@I[cz' ^7tYci;;KF ="4(75?']X˼OByg*D}[u@[BF|VT2X# W؆>0~,jw,ָ6+Kt}Ii##Pqp҅*=hƝ `@z:A 1/} ׼E5e mkt%Җ_\,l5&Wİ Zq}))ڞ>PAxz}>cc*ϙo\qW|؞\0vm\l[2xvox!IBHSi#8rZ?p0̮'.х!C<>}NЦƼd_w= #G%i$vF`'WNwoϘwp⢊*3!z- /\O Wk\H1¢G^;@㸺d@#oϯHWw_9?!>C~<Ϝrԥbhcŋ"J)+%Ӡk镋$+BZX-24Zo]yK5Jw0LonOzVw"%iqx^=i\c5K&])T+em_[os9:-~ZZFS?-]o$TL~ s0k44͈nҕ6 n9V)tsimKLe>F&?1>?R/zɻ+%r<-_jx})͏}C׆,EdWO 'ٕ^r=!yR)O8y_BoO{-靳ӷ/{n[m4Cw[[C8'뷖ooMki[{c, óLs͏#|{uӝB}F|9?Y& p>dO bϪ>cw|ybCs+O5>6< c҃/;ȨMD!||a[xk{-xBj霏lçSu$7 V"Y:}ٹ\~ۧMf[+=]gW/ t|~;Zo-ۖ61)@r%Yv6 Q=`ٍC-+<lKuxTƁ)eA`]FjI7`Ei|l ]yׯ`&х,kkYdq@LX/ *K:2kQbxh ~_9QÁ-B׎uܭNk^)IY~) ut›/22/*D'qSDupV?yFeu+_?0 o* K)GuȰib]^TؼdNtH#(_X*| Xq+ p:HM0D:abh>/"aM{8xgmgGTj {6D&u Gw h]Uq9lzkPK_'_H 8 ึ'+/+7LSCbB9:8 lj؈:vERO?t7K N`}f.K@FN8Iav]]X6?q L\:B$Gt|]/? 4|T+C&6%m[o;7E>z~N渻FoX?TyY,y[E2Գ8~shGy<?kB7Z dpθK OCDЛ?ۂRpX'8d{O0`y ʥNZ b 'eZ !~^`}-Q* gߍL&e۝G޸= q02vNE*eL,@Kv}EGSQnXi2q>3訬]%ϡױB( c*"rdG^[p \sjL.|<嫜 1Mᣭ#u ؅yzF6ЖHOH>?e>=o|NI3ViTyF/fPd짝4 , &F~:\xevv`A,er]\7o3O6Zxx?˽Pw]<6v58"s 0 s,3Yjb,w\ГE@ਫ`Ƽ•U=.b5A}m28z?$yVǷ_=/~8d.l1FM;PC6-ZgW~3taʣў+O -0bm\Sa &gYʖBJAk+Ķt֝@6]+jgV`9N&o:R=fƳy(0*_<#}4rmu\w0zLN:|'=W}?BmRj_+j(9ڰЫժz6//}%J5671.{ݴP՞>kSWCS*>h.Uϥu<'_?m_. V)-*Wϥ'|Rqo[r}{tc?'ou+]R.Re-ޞO}iVϥkDqߧuZViOMgo-;ɻ <9qՏwqGw`[eGB|?<^S8՛\XΥ̓1}YʝHL}Ӽn}򙖗L昄w)qFԶ?S!?ZXoTMǎOl^{,G-=Vޗ?Yt? 幯9+ ̤uD7 f ~-3[:Q4B7p頋&1$IsA^l_&#l"y H8qޝ΁;C/0Zdrvea -4Q'3>3y@eF,%GViGi}:j*>8Ϲ:8w ٭ma*rb Kyђؔ65PՏY$H[{v`:I' u2WqqEȿz-ę3t i+10dvFF!ΰ@IDATlǥ~I S`1Vr~9Z\o{_K'ν8{nGmWlMT.6M`U[RZ.JcDBَ,%ʳ*[xL.&5m]`Įɕ:y -g'bj3 QQ?O٢"ҵh*+3d8%\+W ͅ 1QK.~|n$7Vfa+ Dk˯B뱶-)2BJIguxl,v|Q3qU0BA0ۦSuzmϬDi>o$]HGr e5*23x][.p @o[n0+lJÄrNvP.l>)^)o}ǖO> }|J|*t^׵#tDnC׺yțkp;B[s=ƶ*QyCW +Wx2!RݕGX#(!?zWX%y;J#сa8_ 2H=yu7'lY?ZLz_AÉ:M^ . s۬V&(+vaݭ@2_]J139hqURD^hGCTŘgw;E.R O4k'U$T( 5:\2׎kl) o=-5 S꣈Yz+\liUoocܺˀ\d_:x0GL'f>nȵ#m3s;w7PqBo:0R_ m -@z]s<#mLy+q8&i,_߉zThҼ $7Дq2`Q>FLcûg[x_=^6)'۴dT5Y< nĀG^RyoB6~e<4l6?ySRG߰ 4bP8WF.rpAmpG:(fa Vu6ZE7E8tz!.WH2[pp./ 9*),_$ĊycJ[:򺔏SL\ R{,n6bKh/^s:6uQH$5-2z}Rm/Z*nc+'ցWtեYwl3j_?QZ^^olV='ϧδGNP8̯Ϳ\_0 Yw+޽gGG>O}y`Csa]klT}cHIg(__sZ!EG-lկTOs[Ӛ} ǩ؂Q W=eϥuܺsI-?w8Kp0g&a1 'cPo'2[緿$edr|0A Q 60O 8   O!)z,DXBR_u_3h$<bѩҿ]8`- dvp:갍|6.CB-wN ޖiEZ4B qaPPr^4^@j>nw1ġ#j|]v6J'?J&|6V [_:H]_e8i.FNTvC;zc*˥i?PH*%F}g׸mHxHC[\<%p)'B$.ОӶǶN||us,lip7g{-GfRɩS͖IE&o=Mƾ"#Bƹک~mҎtE#ă8r Ix} xE^9(ˤ orOrѾNAl|HDdЁL@*DTJr<9C7>(Meua'6q|+}q'K'5~>dS&SG k%P6']L뱣w GFmjq{3'sP/v<1ۋ(gKlDV BNONWY#>U+\5Sʎm8TQd'l%SH/uEj#qm)O9u=CQWZ94`m?_ 8ʣ1"~ ȃC&H]H b.nJC]_+65u^67U̸gr (p髩^=/JW&!F!Ѓq/{ _'WhjQ} I/ q,Am i dHцW1"%b(ylWj'}] Azu;Xp';oԫ[>^N2䢶2wYt$n]v6b7^J#m.vk&bt'sq~lH> QjcHʭ}1 (йNOc`faO)bg}gjW!򪇼rmn~F/?yۊmW?BE/:OrS\K3i9wqC:Ê3-EzMzd!:Hd9_%f'mp^hCղ{ M~^YpsJ]2kJۀ(qbd17g3"ȁ2خ ~;^C:Æ^#tyk z.T ,}{~=B޷hv{mZB1|e6W݉GX;ެW{Ju]иjP4Dž>,͠R _޸ϛNy[>ᵔE0ZƏvú7{V^մ}>VU*测FGJ,Ƽimx6yˏ#O#zgG:2P^ ᒅɉ ^L6G UC J&G~< mV䡹.kICgOL2Bl󱔅R0O1Pg.bNgG-V[ޣizfKsS~ ϟo'?k^>s=qNXg Ssse)Vv:- )N^ޖ4JO9wRyf7-P{niY_S)ů)Y.-mS[ŞRZ[\46*-ssekn&4/o噶ik :RH7x~Ox\=|KWMU3Co^nJ{ύ-8~I-c2u|}[GՓؘS>֟r;m;%fE xFyݻ;vob_3a>:v[zDl>[LWs |W>.XuV>V?3H JrW25cO!Y5&c H5Z p!*Gv7Rwl_ щ&9nڮ) F:_R51Ɂj? QM0(u J{LSцAL c7.< V_2̍mےM,Xm_z}_b IKc?e?GgRkt.%xdSB.V=̈́N~$OzCR&HURQ519f`I,V> %񍓨vOKNd-eu>:)=,h&%E[FtM> /AO)kď޶C{GB/McŇn=N+s啅t1Yla@F-ĬMc\z7u #MXbHu0y;u{V-WkdG16u޷RO"(;H0;YL'\ ,$},qmb-~A[ͮ#gjy+4C:J^2[.仐E):FE%ΐ k?F6tU&b0K(䥯r=7~,;k q\P([/loVټp">t4N`|gS~4cFÅ}seܯ7lkZ/5m3wp2>z| so;.@x*+߆RO`e.o_&ZK]`+YY($.܁hU..`W\H}oG y-}P,&#/_;O,O1eTuBq]ayijeA <ҿjhy$ }v4,:p?_xNQRxTrh ZCkΊv@ \jY{ܦLr0 0K<|@8 K6?rlzܑZ: }&}=rtG-s=n)=oM IC}+T|BZW(x+߹ "B)Zח(9Œ+&on'?s)vI?w4c-۲-ާ?Ws} 0/R<ʌgWyZG!<WwgDw <γϿ+vȏ1XzN.~}y6ϥ<ύ'iܱτ7d&hS&soI7sʀlS]15H7%T/mKy}3m) eyfM =2JyS% L'uƦb~[nnX~4!oqllKlߟoYlo&99 gdY2imfÏ@pƞxp3 \:a.k vҩ:6!ENʸs f.9P倵dΎ:vSdKǡQS̀\wr"@ Ԗxd%h㋿KuXK'9=q@M-~-tmIX;WyHb7e.x[Ar/*aZ F `9jFK>r+Uv.*95Ğ\xXW_PpI,N$ĎƬߵ76ghAx[+>p ^=rrR$EVURE\MeuMp,pV&OqJC2v}#siQPj IC j YIe6^Q2Rq=;:ˆ8)mFLfLX}}]1o_*-KգPzgoY,ʻvD'2Z)Alq)+.X Řp`I Ћ hkv [-Ts\jψ'OʕrxqjZ),Yaa_K+oh;Ֆgs5]=.l'lի2;2yN`TRM/1.U|P_. c1cgX5J]/--d (3"mWh3ugA^&{Ň: fiSrod(b\ =;Q [x}81$}Cޅ^^իz/p&U>XsyeX6x~^e^dX . %۳}F&Ɩ1G[ ĆEڎ2h3d]~|c+lS[=Ӫ⠇668uC9qIeˀ! |eqrHC[^\;amFcݖj<g۲#K4}Ֆ|K"]+ƛu 9֝Pq*rx#3~) p.LBG>= 7pR)_-O$)M(]\#rwFy8&#`A+}&aɩGxWd|Tij([O,|oľZ_Y!1/(:Z 9c[g=rH_w~Gxi_}~/ h{q-T|-җWAO.㫋[@o@EW=nuC"L?ydƏL@DK,}#fqxڹ};\v/\uN@m6i- }ԙ`| O)81{I+=.%S2`X0- ل`i.?^y7OeTvuw!8s"23"2+םG>F^ğ\#v*#gL |lyIi?M\Y&?׾VRv6L?4 ~P" S7Yy>9M=-g#Lz9i =Չgo^7=8k~ĖA%P~TM0j&֬b$4Z6h#-eGW5 \_)KZ;m!P{Qխ4WzՆNt{>c1kZ66~-G>lxOe\)ۂFiuR7PZ--Ju-w^Y󻲔gk xdaPV+Aq|yj=uQ}sKXu{a>|-]'Gi^e|y 16䵟cl~ ꄘпĮ>3mup9Q+ʜ.I>{T-6{ٳzd]IyMYRcգܺ H/" |[}C9NB(ה:T7>sS $S>M˴ yZH( H4SanڏmS=MۧOEw4T9kczly=^qjy$O&p;yQ9yL3'2 *np&;w(`[gd6Qv9(Av@Uf`t"w\0$ tTEHE_L:iUvp[Bm>hZ"KeaPwA,lgJ{!`Q O){r$M$m'fɜtK;ut S,X' 能Z<6{ ,* &VoNpVȀqc&8ec< \O*P>ew$r-+ .NJv3xhVp׍ ҊWu b' B,c6iH c- K7uC6)@Hӫ8Q]:IMK S^Vf}2-bKtb/Ors_Ž[U~M9'v;}( O9”coR HR{!WD "8wu~QiZ=7LI7:J$gc #XE (?EP&`2v3ᵏ\0G )c]ȓDh'Jօbzc><()*PMwB H2s:Uꬭɷ OuklHVrKYىuAMY鍢=!(|issVM+=\}xeAıoI #u<n~阈MhO#X>oL9oxGmcf :{b?$ r?OM3<ʎQnlS{8ߖmU| '4|C33!yq [o0H8@7NؗLxq5?㵁:`8n(062Qe"qbȗ7'@?9c[ v&ɍ^ط ?mu-+llAȁs")w,ؓgnģ]ߟ3ɥYW.;>[9IQW`k&[]! o7hx{iC=յW"c '>V!Ļ|{n.kl^3"nokQq 7t5 $vOFu7e{'} UЏt飉U`)iT 7cЯĉ |6SI& JJyarG2h۹ñ1" ?~O__ߜ~~}zoNč?6C-G<,ߣ>®;p' Mn[aڿCv=c>2O 2Hdxo3R".ZPe~7a+pßM#yXkd>޹><<0[QZ+W{ГǦ:ot3_D-m-ekM״x0םWZgn zv\_R_*F3; k*&$~lم8 Л623ct^U&prޡߏD;F tw&7É|*a"b78Uf.: |*_w2}JtRfWi31r!_=o2藆dH<}`7Or?y_BB'@N,^]-e+]T;'ۏ_Jo?2ͅ VmyJ_/0I'4Cb[c;XtҚ,k5wRY}e] гBC,E."s&'PbH ōՅ:t2v`D&riWF|QMi/4m[l7\@neޟw!`fcrdqlFyr#ݘL}cǃv?DT%)­2,/l)߷Й~Bbg᫗ռͤ=K퓅)]XU{eЇʥd:IYbCG(9\X<_>ܭ D^^su࣌V$.c /]>-0b@O>vRI2ۚl/Ұ?ccMwxb_]W=XUO.¾1Hpekl !/}?Cc\.j?&W' 蹠_}gꬬ0C`p=9or>n}N.z\ #iIˈiG6姜WSՀUh KEeQ:yCQ@Š'OH<';14jþIr"SDvȕGyHQWFW/a?5gT^[T/+kggYCYA'GSڤq\ҒsF%]OgWnZeg:qiĐ }16h}ٍҧsqs yqWqGGP'%C;`"nG(%=L8uĉ7ke>9[V9V)uƌݏ~|N?F/CBGj3'vdnv̵:qA:f~7vwyjGo~z o %nBO%1pތ[^[5HO6r ?!+~s,|Xd᪟,|l^z-;)V8FS3)p6v,㬾NLe9r:ǃ\~ rd ndk2dz=^N u pdK;j?zaC[!t<爎l~œaoyK Ɩ]n e~B8 l NP=w]}|!>>2oo~~I'Ȥl٤ )G{R[u0Ooy$;l`SgɲcrG uPhe⭟r*X=&ܲ\7:ͫYeQsZx(n݆7q,!Nq!oq|>kN,QPçg(/C%*,n>ʲZ-,4*j:RSSR|oo݅!Л\s\unT?4= a;Ɣ6vhẓ9幦ˣiѶ0uGr}$% ̷9srۯ?U7tn#娿Zͭk/?15Gɥq|.nzՓv#V.)'?6Xs⟙[?jp]n煟,=:⯜=*KcA#Jcڄ V!KQP;L vͯ_[q3MZ0uυ;u_JZXS[?-8ۦ|γ8hh;0igR%LIK E'2G'gl\ v,Bς.e'3O "D6{ Ko򡵦+^hIOZ͝WOSLBNTS7'gD榏fy M(k6[hHa(Д)FԂDs|ծ |La]|d%(EmZ=h6D xɉE%&27Px<*-δ֡[OgqNNa)3ԁp&^ʮWXPi,*6fSJ8xeec6u닎-8< 'M7 䔌Ӡ)ʖ#}u|MY51ޱjpٴu_keVa5w }Xx3q͵ӪGHV'I>~ . P'ı|!e߄|AM?6[R N vMxY6K&,lӅ`! (7<FNqCt+K+#xOc mr|6yޣ/v&vR-ܓp~@;LA4QDSBꞟIy[ _k=n0Hl~*osdeś1nb?xsE~']1n:[llgsy \u^Px 2,_mD{53 uƪÛRGY{+~I7-d·}/[)xoX1fA V$4p`Hь; YOT:~ <^SǷQB# %~ڷџ!9i7ec}i~`GVlÍ?)O7&Pq(%6#no`)}Z%_lA'eqO'v[K/ &48pR 9o{}szߜ7_`zni|;|S6PДJH*XNn}2F(o/$PS\޶M  ^_YYY`{TB:;dm߃sֵTm<;OFc>;ֱԭlZ{l էSp&m0)O^H]slޚ_yVY*U,⭺1$1GS;כKdZaMy;һSSz?׭15?t'Ǣfd_޴=/Κ|'?zL ]2ɏLo9{0[ǝ>{;ޜmcH{-x>M{geEtz}skrn]gN r>^{h2k;e:; LNUJYCؘ0'"xŁ_jWlzύ>.YAIYO MiF@y@7&NdjRJHYjAQ-wg6>K8m )ӆ߸堂\!bF}S4&fFY6.*Y&)xj qw"q@8)1,,!P%RW( 96`5yIÕק1Wۛk, y!\qXT@(SG@榡p5t;>f ڷA[!Dyc~ ~%T8-0BDP>fMVz\̶4x1ñE|Wjt(4KGy/,`buB " 2_wm uot./cm RoUx"V6o? GvdmR-"J;b]6^:2&R -nFo|DL})H\ڽG j$6J_7sOK/؊0ҞK?p >6ROoQRa##7X` v4.j{+B; #}slmR%~md;:nlxF=(†, >dOe'ĵ2H;VƋ9BVfģzud( ڇB *$Cli;ač#\1xs^w,ʷ8`cAFVG+$NギT&ɇjGAtCD +46hVٌԉoR#d[dl5Y/1zƱ 6 oP &'>xyݧW6EܑJ̲ HMl<>"pdgO x6u }i.F쉎D[{%oy_` ][`[ÿoi0> Ŏփؓ{uA(лZ1v9O (z}[c_sďom# 6>0Č&MSnˆdE9KD% ÐNLn!Zy (,+ׅ9-'|G\.H*Hڽlkmc,D,_eGdGd$_o0^89y.͛~@Ԯd3)/[,! (|l af&}"̸tb<>#o >ƒm?_rnFݽ➈ lx.27pÛ2~{O}P 珼Woeo&w{,1||h$7*0OŽ6S!dyNƹQ@ t.\ֹx~=}a|z 䥝Z֯9;Mܤu0GJ?;t j}}lcBPK}Dvޗػ!O^k_+cm[y~v3 i=}v|S?\ڲ=(g{`6?@guQ€OiÅi' 0 , L[т{88؅2q:X"u B[Rh'm,(}iUĀK.Iى]Z:M@>>(X&#е2`!e>Imhi 4)h' (#7*r A0DRmo㋈N]l CsoMnId6 ӎʒ(!J2tr=¨b.7izcih& bDԉ" *hǼA=]0S|xBM Gѓ~ƿY|̉a7kq@ D[AnFq12+0/tQ9>.5O;}k'gC۷cJt&]LďL=XIM%#e/)(< RNj tyO,OIu(]ma<}冟chB ]_ F2I޾<crz?1OZ.:$(<ܛ\0䄱^xooaqh*/u)m*@Wwk cО8~p D6ڧc_2fėlY=F)IiSp۠ꪅ$&u[Ue`|#k\!q'֑N(xv3-ўC(dթ[]tSi~|Q7?YГSN91yDZױ6ccr r!>[ڳ$|4I𧝥걩ڕF&V_y^3Ўo\(.lpqK?.i28:n2^F8D\l_b J:= |_dR[qӅ,ى`,/L۪p.ԀiT }R8>T}U>Ҷ$Alc,I$gExECB){$E;YIM,.|d/sR[~yhs1SҧRuAUL+r>ƋpAVh֟"H?w.DƇq<AoYF.d#rֵ4~vU-zC^o$VSI(U47<)_uf (CU|ݘ%r^vq7IN;X[4vc:2bl*D pv& R?6V&1M#NX濡IdSF(J;qe I}_bCh,ݘ `<xd8AGGH~_?Mo@Nb-?Wl#O:ݨ[:1~7:76/u7`ӌZ}3I&gЉ# mCsBo 7 Q&ny|x\kJKי'|7~",maykܤ*7`CDtA0$/7,K22*eX+@F Wl2D+9ـ>Þ%`&׌Tydc<4[ca+G1 B|K_G-|F|o~JK0ẘ-`߰sc;r{  Ϸܙj㜟[>ɽ/No)CFfn*vl2֞V9hOY #ε?7Or9/~lkzn &u@X-T̶͡z2r`"$= 2&pA5H8e2ra:yf*Bݛ%ˎ@ɑI9~`kO#Wctr(U$Wu(y;@IIj55ȓ걍*k&h fOmbynt;)?q2!ymֆtoj6j/!n(*6j |^SVq"p%(|I:='ӞeW*Wl+6Q);m~P#~o:b) X/տdIkf$K9nj7I_^NJGEnR~m)e&ϲ@ҦGLi'leyfL@9 Ve-z s xƂ 5DJ.&Ы)ӭr#o#xدT=˦t*É~5Kg۔O{D{e=7kuAh:}X%18~A[0*n*BWK[+"FRJ*,2KvALSDt/Hq,1]*ФM(<ЊLc݀T&,,2SuC Sj\ *&4|'0.Fj] R_}^kha ~r͎팎ٱ %O='<9g\RXybdcDS{lͯ0*̘$^Ʃ:K3?u,oCjӱs3#c }޴xx|ah (hbl2M幹A(qĿyC=77CD LM.G_ UHn|Gq"lӞv7}*2u]6џt˦R޽~re36v=o*2/S }kipS ,K"zY`o OȘ}g|5gnA"cч0|CñcWAGi:9j 'G Gh4@S;&ĕ:ږV 0}}'FwdX8u+|y2B 0zS&׶-r%1Ԣ*7)fnhb( _ %,^=6~ !JM+7 rb7s%1.o a6n3 G-zOПW%n+7nt664q-D9qE7M}6J`><~{soOo~`K~~GM*6{1?lʷ4Mޣ~O{5s`w :-eQ8ĔEpvII2ک)Ny/g8+mٿK/ik!d?9*߮q<9PI-ۑdoK9 ;~, fi\aRѼ+)7/|e|GM! g|a#i\#Yx2jaU\Ca-Z;0 ;^)M_)\'{̶lWʥHp5v4N4Ӷ\+?֪;䶯J[a&?{9m+̵uJ٠:Wf>_g`6mڣ.wT|N s=o|={w_q=ۏkN-1\hܼL_hޔ<Ü}b֦eF1p>[r l:/z?]?q~P|Mmvמ$ܤ+BGH6HoWsVS=HUigu F#JC;IaC?V^?w' #Ǐ?Ew'D'\\ͤ vD&(K_| t, q$ a&(2vXIV'l mr#\rn jqDf'!9F7OB/xtdޅ?'\1 -NJ2Yp Sq^٤=$>ѱ^5d˦_u}k0֒G؏ ufk3/ƒW2Q}N6iRkEɘ"Sf'B "d _+;HKB8Dn8jxQۭ0VG 1\cpt\{^9q6"a R1%_cl9d\c=I(  _P'bUIQ]iqO,Wb7#Qᑯ8:'ERiS A3W$wA.i~ⳑx& PN-&>m9 e(Dⅲ_N$#Ԏ A.jϪ 2= Lyˤߍ={BU۝fS[~] 8>7.8Q$9H|tH=x&$XM88LJHPmb/В(=TtZc8X喞жx*·i}X˧~Qʭ^QRGYH*cmsk*9o*&zl( #>xf8! ?2C7CmvcQ[SЖ1W<bTD@֖#‡ǶCbX{aV{Pm,Xtd@*rKln? ?u~7zc WyX^շ~S_b]&ҼՉ:ms3湌e ¯ :) _hƭ"Ŷ G+U: ]$dSXm{o >L8]0\X `Jj1Ob\NRзd< ٌC27>0꘾wჷdg)o4Hl]T\,^/!r_&Q_\T_3J|^x93 NАGbB<vG^s:J#!z o2ιW?&I~ķNJ؟l0I,pV;ú CߟﰿC_j7X(s=CxEc"X>Ntd6~V*sAkY6C_ 5o_YQ5@,69xu~?͡LT9KxL[؟?~;.n\[[Z3V};6 !Bnm`ǿ$PQ\A7FIqCG) 3hli_&קW)U7d}Vx̔I3cxYVN[V&lFq'T/0r.}.Ӣ F≣npfGp)c4^K:!Mߦc?:y&uƭ{d8l23! EІ-O9rÈjt ۮ{]=v M_'x ep:wӛ/!{ \JvTV|Gs]FrS2o}ۧJۼm[Jc_whhX]ezC5ؙ&=Ħ.]KgcǕyFNKPkI~Okݚz*e%eã#!kc1kԭvNS?b{hz}y`q-SwIe?ZMy۔Huӵ#y`bk۔'_y t6^w-0Gk۔'{~9\CٯF"0ɿwP_/!xaL ΍9? [b6 Øɱ/]qr]7: N ʧ$}Is&F}ONֹTB`~QpbqO(%kE.Nԣm}*Vh2u i*f!~>'38+9~ke)a6t@G,\l>:̉%'K\mtlD*}̂oEY|(wDDj@ :e~m( >nҞ>4ܬ4}Z~MM'́UgcNw} <ӷcPge}N.RzI} LF.xD?-OL_"SUS_cS[:3ukO;ORyi:1U3un<M0cP܅~tET6B@]|tv p8qCmIKQY1A[cZ@(R&<>8*N9D} O;p)*OM,v*ohOe?RWc[6ZҸOMUu;n0}oElB^9"OLC<~dd%yֱ2~Iy|^npnx?S'k|({h,H52.)O'(O^Nn^B1o琧N JCLSYю6]B@V7dlA~H#q<Sdg5>Z 9$Qqs 1ON\EUE!ٞ6v80wlߦ??vʘOOdՎXrEPǵ.ЉZPiV#H-ş^1 /nOkTbCu)=Ч.zY{׶^ Cr# bg5n| smIdFeL=܁4]szQ$jE@MViCp2©̴h)+"u3&O|-OdCnw/򕓋46MҔ@]]%OV `< >A zOK7o-N;opc >0LrI1/2g:|%mj'yڤq7rfl}ݷa ZoX?k-j[xI=bx8M~ },O Sbۨoi0*wlllЯ^I_{e}b<]!|w'8kAӶh7i[>lF c@ؾM Ё,?C7:N9z>ypF\R| >o) 8>t;;r =0ʛqz2: }G#y l5ڞ"bc-xH+7ƒȍRX}dZ8e7L ODW)Lƙz+,/7څsm_+ _~?G^k-̍VcIFc49eX9F{i_S_+Ovi+U׏WyWWJ<]dhG/QZBmp]mF~mxzZ&:gO>\#jʴ? J|M^W+)?־m)88s>Q zt|wK ֓7x:]__֌ޓ+џFܥDfnݮiMvY,M/!{GsuK}׭۱K>&G]sпVuMqG~M/˸T./ޜ9=G)؉qAgY{m[sn%ox9P_qK=x?770Ϝ`ﻡ#l~(ܸ/y&J2 s2<ds|LO=^7s;pØ9-TW׎cMsǴ)~kr4uO ڿ#2>3}Hj5uؿD>Ҵ=Su+Z^q,Os`VoULɷBސTSiy,mhZw~ͧ}` ܊rCER; g(1L2~d:CO{ :]I}Ÿ?HAyڳм  NDQ. ?l6 `[V@!ӷ-#{oȤL UZgb}[Bh"CvX݅Cdu"Jk^:ʜ{R#zoS B+ 0i~ܡGY(n@P xNk;}w4~p>ծY }&U;tESr)'/mMfTlnp֙z‚$\ɵWvZ46uA?>mř2yc'o.R<=}n܂00sQ!2fߢB#L)iG_:O|uuѼ2.׋_v̿EwlF`ㆾfCl;7n+xQo>]RG\[G)o#Lܼ'yBo^+6p%U:ޘx2>fz BS6E}|^ 5~86e,떉߂ePoRq1xQ}wٟq5: ; =C66$6\1~1F2񉃝v˹FXҌ;) \H7.3BS×61hǫb6PUs&>7i!@8?OK硔~ϐMZf2@꧄hʌx|ÅӂuA6kHU[Qpe4I;ҷ_iO/|<+b|}|K*݊ 0+&_/kdJVXZmSHM6e T9&}۪0^S،'f> [odVBܶ6Ϩ ^roT>4?Jsk<ķQqy9<.x꫑ 6 *rXZ 3vN=p%mLH5:jRTM8<{TشkԺJ׺&MamΧKM)^Œ8SW\L s ]ӟr qnkӶk>?dϩC*÷kG,{WWxIr+˺M]y5'@IDAT,?Wxar =@ב*hW!QVw/]tP,|[w]WQߟ$֔w{ŚytnS \Ni`=~>7ИH_sXzzSϱ8kckٚuH? w !ul]'h;6(u+5x qi?dMK`'΅^nK?B@?,i+xTn0G=O^;LskgkVB,8B/Mⴙ?V:++zXy_+ZG+kRIkyc|K+= %޻I:;,c30 yrI:k;"]&C3he+7NYDO@AC$8BMjrR"p 5|Tn%pUE։L`39uvW̒mT6ܜ$ Dl=%A㢣m29I(dLx|`rLA'832J7 /_FwNIOwlaDRaIASL^o8}aMWa&n[<%u&*4f "194<0_i_'E6Ih&gJ>p&/#%,1C9 A4<\x) 3fɕ'OL=U>R,A.TH;2mAMؚS52{`8DЖ7rA;S6Ş|G9ūC[[ sr(e#⨰映l}-V}> u2ڝih0XYbЦ H~}+v((}]h 6g%06WzJhQMfJzkEP߂S\PL9qi3m^X?Xo\`*,ձ4Ԡm?G<7ޱ4&:.4M* f@#/ ƩTj_uor$磉QȀ_9Tzmߜ4&l$"IAY5hi[ʱ&(< 8^s>Ly72mzg30  =W8M7Mh7/Q><^s| p mnrEy=6C #󗷚.TM+Ȕs>\[$ mrr(w< ^?ox|v'(Ti&an24&5~(fX Ȣ;ѱFSOjr6F(iOFqld3F4ۯy&ԔMQW#M#9%y=#GYlY+|q,*&^Q ЁrV>w Zo ?p=#\6 Sn(kPu~אx$m,+ rreӔcoA4cvc7¸*Wuo,x.RoZ畛VRϞc{9x2zrk^ia~?^>6QZkҔ'^iڎ 3#XkuZI*O[{ H:Q i R^'sH[8B1zdY:U g8mkC474KUX-ƞjmq{(#n~-5|/bۍ|m+|nz, l'_Wӱ|ʻ@D_;$L \Zi,ңGkKjcrJg(Jc-MӦچ#ւ#*x&иWzNioY.Yaij>ukVc*m#q+};+{,?+_=Oc%KK)u$@RmK#j/mP89žq_f'g>z{dɆXSwe|/Pڵ\ǿҿGOޓKM +4,_;`:O+b$xcWaqoI7r6vZ=s=A(qC:+%\&$uEp+ FA ^PxSE3nx=4"OvC@=S/[:,½fҎA) ̷PK^ WcltѩpԠi#IVF., WҴ;c}]ߙo3'0\z*_JSp|;Dbl =y DELЂ|ʕ)ByJ L D]9F76us_:SerrȅȔ:l@d`z+mWN|}-iʠJu]p>076Iu5Eet#5mNW7$$-G6:3u[6ȟeqR:lO*7 B$z"Fxլ1-yq.ny7<Lz<-$8Nra -t]đ6h[ YiMjWR j4'LJ#CjNJ4u?1gmrې:1h-TZ8`F qC?6^_ V٤ /[j5m3!` 2nzc1nT'iCrӆѯlGݶX c"|) tʁsdLȗD ڑ&i1*]8SA n5 g4PLY^C1d>z=ԋ@#rMڠ {wK6eb텑.Om nol9Ơs1P3lϦ%E'_qg |y˸+Fx:oUtQ\UvxDt{~+oT.Cʖ!8)H}lRHG\e#(+ⅵqVㅺnFf<1ᣍ.W7b8^*尬$Q[eKz51{WU۲˖ jcN7M2 B%. !q▃PY¨[ieU.{׮ڵ3W:$[ss2w]U"s#;_#"F U'e[wtރ] }SeMlSnN8*2X#iჍVk5%ƄmQ*|}vYt]jin_">dP%؈%^K o'8y;1RH>I[L3t=rgI#>a<{Rm> _=Ϙ7Bڈ1yk;`͂A>Δ{_Wh&\4IʈAꯜbcl1`NX2 86+ʫ]S~ścqgbO2_2lJ"L&9Ys(MWƝ#:mG'I{scҿ[JeKk2)KA-i )t9oa@RX;K$.5ܖN8bnϺfiH}dyKXJ)suCoz({ܦߖa <[ïSq0=/fdP㺤T`v 6[ebN_la x:ahzO%[53T)#OָVב}R{HwÞ9A{2zL3Sߣto!Z6ќş/vL?4ĘWO;ˉciӎ[&8<]Y;us܇Pw=~QOBFSo>|]3.܍Ξ0AϠ3;sNKɿ%ӧ-%c,tg eco0hq p~4U`SO6/^WӦ>^-;GRWvvK8򔱋 ; ϠYBH_vGۓύ̗emdi.vI St"oZ-I}.6ꥈx@L(#8Â.*yu"\ge W_erHAw֗ *_?$fyTߛдICIrZ,8f jM3Kf8utDz" cCDIKi7r˔3BȐ6Adg@MR6'0P s٘dSHQy$h.?L)o>SϵFd_8Ƒ#9. q]s㐷 2cne8U8*w0]]; FM11pI2UCMN9ɥJ"kQN&NfX-+˼DʦTHr g黀o(~Ȫ o獜fѼ7j9mgaY*Z;YbRۺ-2 /UQCrEOl?R[xY&}Gƅ &_ i#؍LdE;ۨ2E`DizXR:y-xQ\0Eܻ+EaņTh#{` ?E5ٶLmF8] $(ү={BN\b($'.m9&;dngaWsc|+qk2>:쑉IdS,m%6ek~"#Q{iiY/>^nU0nAIڶ3F5'{ԕk|.k|zm7qDu̘7+`3Hv-n=|s"@5%je&ƕǧPz->fa1]+QL$>s@S_Toʘ@Ig@Z.|H>/S yFܯ؇BK3=~Mf;T$=$^;i}nb% 6o㍋.; W|쇟ً|~ c b3TEcq\pMݥBXji!#_a|R$m~nEl֓'$Oԡm;uq4ɢ^[#kG4,4Ax٠rbhﮩsWVph.p8p`s_Hm<;ɅiW򅾲c4g_}CeϽĄ4Ȑ)r͗.#م雤 %]-u ȶ =$} Cǡuh<fܾwnkOXm.Lv6!]|<Ò}(r?^Cz!&"ߵ -&yOP/B\7wვRKOȇs?kCoE$:z ;HuI;# I^b_1>8&؏#O24u<K3f_tZ\K}blKes*mCߗSCϒI󳩗 |)Gch}Zo7sbw-[ŵn~L..׸}8{:*ࡴ[{.޺P~nqsq?aߢs3J/Dt4~:Hq/[Nk` G%'hn[?ݷA#xwUZ6-f z' 48(-L& raړƹ[5V۹YA3( )1X`Bq#ٝ<|_l@d@;29h77;m6q*Cgt:M2iεz;%& Pi!Ѕ/;X % :`M|# I@SvUYa5r;|#߲%GNR Gټ Bɋ{@9ґwyi*w79L>BH=y@7LY]/ [_ %BS'8桼OuV^*0@ތN2ٹě ´  [b`kj IImlWYbA]ѫĿ7O4H]%g 7yj4ޜ0m{id mny{(1'vR3 A:iwTU=+/a#\d|e3;(1}q;"dSv~qJI*;eZ`l5W/J(Xn +"SE[NȑOy6cRqj_tԅJ2\oqT?t[B?=/['3ٶכB-o`pn]bla6n> _cbʶ?HFKㄠƥ pJ|y( t﨣?}BCXS˪Fqx ;,A/nB i6kH]tOL DַM1aHQtRo_XzH* >ĖLyv_96e -ep-׾W|NVw$ r/|s.O ^67}Dbd7ngr'6FoLX+}@w'>X'C wKK!'zGc'g2gh6| ;7uݩYA"䚈؉Ƅ|s+/궜 u5Jt? BojDi^gM}(?儽OXx?tQv^^;g~OWYp m! mPGbhi4}C AFN54O1+BQFoLb+oZ*DZX i9,4J+wTd ַ ڭVOGRE[s| t wIn|ʔ@k1Kte;􄟲bݡvKg Uߗֲ/]&ѴRo`>$ ߩw鱰Śmz¬|+[vKSϞn!%c0.{=!~}/JOݕgGCB=:r?${8דx"I>?T/:ya<Wzk.5-iuvv٤q_yγ1}F[}Յ^69NwlCowsk:pfp`-[/t"^*PzqMt %+@VDvpN{$-aOqi|;Q9)l4|&`\UtRmQ,67f s+ϣt9$!JbFs)G9pQ,˃ȝnEbg2A=IHCRf^& ,Ux&$qAR*tLK nOT DQ50S& (O]{>(MK;QER/;*W{kx+/, lUzP'1^X;~T/LƊ@TMʦ@x8zK^=zV"d1 e(ۀѠ] O*llw/%ʼu2>2"cD/bR? ˺X<_۠ M㖨VtE*w#|-AwʡPKP2%ZyX+hz^;z >ȌwvpcnꢏL@xb[Mz AmǵW(e^ܴ$ohr2 Dxp3 -|۠GjMzu,1n3c_&$FRU+mfVI[eP{.qj|ika4St2X \sgTsx \[ҿHׅҀTmmqQ2g$XOYx)]' {?45~Ah?'ĢKCÆuar{l_:m4ǤDRĮ4+*u=cyVƷmӹYioSr > \GG"yK8 f9|l`>jqc0̢!lnPH#6"?0uy,or=Rllˈ콑ײ؜.&eqBPYrn N/PVo@k[Pk(F~rǔ(7Yxg;c|">-8$F(_+|0>qb &j_֑ mW<.U{;rb46]NCLft6p l/sw.|&ޙ4vїo;lqMܶ϶8aB!$U2}O*Cl-mOxџBCk>hݳڦ38KJ:FLkP&!Jis)LQ|re+)ﲀY^muYз7mFj#urV~?0qw`ksϫל[k3-@\Fxxy$E.V-v1~@2|OQKƊSbŔEX?|򛿼}˾ Gưh⽮ע3Oe!Y) H;Ap]> œ[2I-+D=.xq7M8CtD_\7i.viK5i1[F8K k  J&~}.0/m4[Sȅ7ТsGid!ZN/HgRHC@Y;}?a,~S`7A8XOk$1@kVBCϹ// H32APٍ y'^g|ꄷ]q;o|g"P[Z1c '0:_۝0M|K7 :K=RT^cZ:5MXR FuY"bE#$wTAK;ځy4X?3^S5_Z::RV v`]{V:%C}J7UwuZ>s\-;Ԟ!vՇ荜s:Ŀmebw[ڳ>o..noZߟCћ8tCt'{X嵇3>3ϸ-?>y Ǻ/e.~g,ge| ,29_S/ع /+eO7O t "8ǛKo0g,1?Ʊ-^YQ|L,L_&B/ ώy|ѧ C3fR)9s S+g) ʛyX1Nso__| c>CO,F9)A Ѐ/ŷnfF}ֺβ> f/Tz?c}lMoo|?P8;m~70d񊨠i P12!'&c0ڹI Z]a: J?( 70C|SړYUiX~8ˢ(HLޥaV"i,^8 8hgAJE&٨}H&PB Ԓ*JP1RL~`LإoFˠ2db;%,Q.##)QʀqNȎݛ =j֙|lvRXʪ*mI .Ըd&9'Q٤8!>rv&eS^Ž%.7N!oĨЇvCȉ,WƼN]lXI<!0}&Z)UW3RqN!m@򀯍39+φv8qIľ\NmxɖB Kv LƂmھw!<Ops`ٍ_u'u. @ӨyOX񕡫WӀ=.8vLm?Tw#ov̀ og!𡥍[;ߛ?lET%NhW3-oHSlBq2."cʲ):T٨N@57Y$ZtW sA_ImȊrU7'u_)v$7#L䴏Yl#7ƊUcP/PEvđmlL^~*\l]l!2?ߨeUm^?_auR@k'u6Y;Z^"6sS (4=f'OVp&xP:TN}m17SʔB&(k΅.P]$d t1t&brk-( L9GN*J*|H7x[]j!ņtB]x_i x)G}&QdpAaw'3cQIat56#GlTJƅRC!K׶'Ǧ]hG:D+%I4;OmSX}^7)=$<(Q](rڎR@wȧLoJ-}k%>>XЅz/(Inq]%>sYL{[iO7-Ondђٶ&Nbղk@MRۨ^{X WڅDž !{:v;ME̤p ? r;;jGIA1Tl3쵋ZhٲydN& 9ѭ?̄=H8=9(s q++>ˣmB^y@eR6.U.Ц[vU 'ꚝCą_m9 (KD\k-PnvY,A|&ml|о觤b6*շ4~o).54P..v0ow_H|.J2qm^0#^Oj,vr7^i,"޽L{yD^?W<|6b|Ǜ?c3C!XW,p @u~]՟uKvX9^ &ۯ5Ͽ[RBlPZ#?B? VZ=35[l%Tn(윽7Rh[11QӐQzPl&[YNٖp8[uٶ.-z~d{fnyyIsMg]V-Żܧ|[ -ݖq'?5Y/ho;ּ&?ǁYuQ!ȾusfƗȺƙ!^Ò{S}Үu{Nޗ+os|H֫:-׺N~tvw_+q?nL\;Gq'?ǻz?TƝw__?[5t8u縆{l~;[;>3{<É}d_h×S}c__b| U<3w>eSvtt㚱 Ɩx|u9e'W'_}甑cm^K˗/xI 1G ޶B˧UKJ)>/5p2cq@=;)c10_YX蓋mw)wpsw}nuuW&,@0{vyƻ}uko;"VRIۅ=>|l6;|n,AW4e* hIaE8,;P"qp࡝Z$hZ MQ&/;'{80GWynE- >.VzRIql,t;\cDD 9C70Uv4ʨʅ>88bRķb&L`Ӎ9aU8砱wf-)@9ȭLvEE?hGV=qPY @Iԍ۸u9)vfBI*\@ W l+@IDAT-pՉ$SJ=Xof!l8JCߪ+}q10籼"i&B2 ]I\8m gBO~g4E/WP}ѼpKܥM4Jkg҄Q;~Tloe> aLdsj< x/GYN+^&ڕ>_xS5h4Wc/#(exTo1j~ C W*(Mum,;HOEw~ؔQozuIdt"ܘO؏\[cH?fJ3fRTC6;_{W/6OP\Z~`y>Mµ>_$q UH~D~m2.<ig;zB_a !r 4"2)/,ݹ#g yFHdX̽y]S; J3"$WS% &^6XCcIM0Cm>~~!ɶea+ߔq(qܻ3e8Dw|F9?t>z4}w|W]c6ߥX2v1zq]k4z8CpʇGZC8|`MWu]ywq=ߥOm+.=ǩ=.ݽ'<1=d7<69QoY?{fcXivgo<\--wpOHg^bE7X(϶䉊g#^ٕg3m:常OP͓e $|p?%#vWW@_pЗH|?gk}q`9Hc-5fw7ͮHghכM>kx96V>N:|-IzxLX,̔/`v >h}QpkerGCS>*| >?|Ws| c?'wo>y1TY@@/xp88#Si~7 2O3:ϯ8aN̄ 4l@tC84dlȳst!!Th9b턧L $`d Z|] ` 붦Bi:؈&ؠG2rݖCWwLx羍Xlev \Ӏ2;٬ΝXRʧ,'gGȬ޵[ cE'"raw`vQ[yQטNkNO`)l-eXK"I tw"a92T np|ۙXʍtMN_tAtK' 8ېq onn06w')Ys)yDnl{.6)Җ lĢ}," ,^Zf$ ?651g(xxZ$˄-O,X->LO |y-sAHr>KF +gsNzԗ' _k(.'f\ s6@F~uY-,$6<> $Rk.S6y2S\WĈ2,u㭱gQ͙&H@EMY8t~^[iT^˕6aj;i%-w XcKK+o/ϞkNLzT8G dM>VigJls jҨk \!_>Q)/]i]yTRc.n(Pm'bRmO*nq{ ljW;G7鈴]j]i69NZ"- \Uʉ2 U2FF^ ߼i"JT'p<[Hz}=ڠ7´t9}rd=YǗEZ͓3?[6-Nv}NX`[V{Ү<#SIkbM?T1u֯ѻZ]Cg opS=vSxˇӟCwן+VɎ\z?4f}Cկis8dt״{~ΚZu|8<{u{4 }Xwcvم߭_n=I.ӯwk}5vݥw=7}P.{=^x?{z~. _=Ϭr}5(26sc m3' 2̎yn좑_Oƽ~.{|B /?g. :| }y|VecVٵğјvg*^RBL=-|[&ϣ B 7shMY2T,2I6Ѽ?/c/ΏÅ[;AX;CJ5Sh$rQЄ~x,[Y^ Ld>P:G:4.䍎]D ku9H G9ɯv"C*-;y|]b}>ƜNv$9@o (,$ ;Sڅ]zXÂr-wţtp% 0ŽH:Ɨ2s}_Qv<ωq#} xt 0bqrx]/ℾ>L}Ww8"[Psu囒ސpuRZxNJلP,E 7/qnĒ|q0>nꂜi7>[ai񟋚қ7.0c snPX"-J2IfNTW֦w;lBN29Zx#fF.}cIN~Vى#+7f{|ʳJ39!dXw](\'!ᱭ~2z,aCH P͙}JeCo4CWȏ]!~OYC$?Ϥ =4[&ƫCKrȵTZq' kvDTKM1ٖC|-yG)BFjdȠ=[09 iDt s\-K[ۖcn%VrKoԷ_tB͇c}>b ZbHmؘHm'}۾}W'1F'ϲ%1M>+Ljud39"[nhӣ۾LڼpƏbm],Ī2Suz}|m"WJ`. g|.][y(`wۃɶA/?ĝ'}6=WSy Bx<>c) Gʕ S\DhNe)>a]|eI)t <7h>N ";yeBحoUToLsśνCv<fqCxZP^g E#oɏW?Jbv_gEbh464CkͧM-?&ס6߶l_’YwɃ>_CB!cڿ6!줱8kwmN-m( 5y1%^ ~Ɛ #A21^ؕA @w=T?"Dڞ] c| }%\nĽƀ 7W}H}NEFfOv;77o #KNNVi7-Ɣ8^_~΅ c y\߷\q[?Ƞ_Lz7\ -;uOlDnNQ1O&Y5Kc[v)0ا,b!{1wk)F/.31D{o.o$z{ݔ WA2Rυ82gaytS<^\'.9c{\_d8r8Bz tOWZK;+Wl ɷ"$Jp,{'vʽO:A3x{Ou?~9>x^xl3gѭmngDtj|²m+=7i ~ilӶ+%sNu^)-Mk"*e( }K%)+kKmz1DT݅Whxik7׶)|KcmNإ#Fs[ ,+m9Z;߸krziݩ#[9Z; X{'ۺeZʗ<Kw|LT d]6 }-SjyOs",anQf&6Gc칏O+]eO{ɻکm+O{^p׎k!}4lCs_ p}Zuګ;2J?/~&XW7`g,YWyrØ:g?|%<81\6 itGE\{Ƴ 7yʎYSvry̳n8prO<MVx=s7݈ڹ}7j= B_l~6to~{ͷhnR&Vhy#t?\0zB_a+T f? ԆE@(fJo@c5CN)@nSۢS ȉ Q'-3N\}6b;Bfڏ3^agGe<6}-L* *C&;ʑPe.yj%99 x-_'zP# +3rۖN.V3,#)ѥ:^,՞WėiR.?B-6I3ik¶db~& k*("9<"zDǮ¸ˋp[Ӧ1oٴ\lOJy"ouje>z/K6|&N/a r-x&jRckB骋)Jh?MpL4;yn%)1cښ6)'ЗzUy Vamm!d5Nߜrm8OC/bJ}ΩV܇pֹFNd~\ <)T)_ٜ-Xcڐ3.xc?~Τ=1ʍHu9gT7u7=媝r,m?^h{ڈrOwZi!m|ܫW,ڣ=]FB>ܱYllvg{\,Qtm\"~[osLgd\)ƞ4ڟ,Ȟ%uu,,H!bK7~6ͼEOq6>~B5€ ,{3: >>xs'g?n^!@?TW%d?M?OiWޥ[UDeBjYK[o9VM@ECzJ۳yf-î1y߳#2*6m(~-`C\5F_gu//,Ӷݻ4[;.J߫_|yEί7#v"3b ;36*כo|k|.fv|O_^d죧geSӅcF,8qr8Kv4uGͧxΣg~xK^?~VO?W|}\:ʹ!Jxt}[2<CA1{-aVۼaaK5]-tïy?Ki}eHV#H!7S {9X>Y2<Mɋ/?0s܅| aD^-C#d`oX\!N YO1ƙn ?sxk}k1>Ҿ Gm#ז,.. z_Kø$<1Zx̀<;(ndvUMp@|x,,\o򐒾t#^'7%Ҿ@.m#::G)qBǾnPlؚseދmՃFG?QD ),*3^&Τ#SwY]3*_ D'\! )섾0Z_va_*V-]GRpҗ@-)ඍzMMi[SufrxyO]7,耗}E&Q=F"zrzʂ Q>'~ӉKIُ">,*גMcFogqJxq0k zUO,*oXDwP#c[IlgPpO9'Lr ?,׮0ղCYo>GgOI6~'>Ġ_ J,|&xb_xf@Eok'm;z v#=oμ`6M-x.3-DOy6z19: M'_ۛxw|oy]Tzb"'YlRk ohw0or,qV¨$=AJa(16GXF]GL ,CU:g0>Y{W>.|6 oj4gsrwwj2M XC:3_}}sWos>k9[my5<ٟ[̣]GSkjcwr*'ұ>o1̙2͵ ӿ-kP-2Wb'Vu\Qb]TPá fs󁞒+mwlO}eһw֏V ف?Z1e@Kf P~[v7P{Ƙ:;s?͇Ca#!\˿()<8z<Ð۲OmeP}HYK-}Hk_,?Ed"JW'Վ ._󗛧OUs>m撗+r/xv3y懆S[>:vŒ_|< 0)BxvV Px|9 >9R}Ed|#|amy/<غrf -&)9֝ C3Wyê[)M- Ox46\k-Hnah$A…g7/cHfwimy̚{2Il7w~n]>})Ss>5nCӦWr )[@5ct\J0G|S,W T}vϏcO/;?zoﯰ y-X7 >kt tH4K6>E4^@1 @9-lG(wev^e9, =8 4` [1ږD$Ao#DȃXbߊ<`9ԯb7t& iB{ι)C2 ,ږeޒ w/)V.G;g9Vkv.x NOVW'y ~i8HAߋx<ñ`vrȡ˄=`o+[POhN׶o#wY!IiIZ І,\(*guy՞wu֜_jYm3YA+&f ),Yy<FO k5rt8LRa#Syo}4K7*K['fK"4,F8+9.@f%Wאk qĹCP5B/Თγ@ q6AR?m7:_=/oZ\V7J̃)=Y|QXy+W1]Tn3.ll8eFy6x'%G)N $6!n%MN~*$8g`#FZ-_TsZOd’;LD; Jl'pX͌l5̃fcatwrnkC'WO'x+ U1c>.FꝘd#NL0Fŗ~q;Q i ([苣?Tq ;Al\ːftQݢo;ҹ;R*Sc1O,\7F/לMm6^-&6sdP+}u'?Y3~x,Bp }]6(5/Nf]xFT]+[d-?S;\P G=eQGr]G]gIeTg\ )-2?'P/:-r|EM%pf#,I;ɝeASOpc? ƕ0E"%†а|yWs&A0%q?-oݥ=sZwHli)[@ϭhM"3~ ÏG,dz|_m|gx/M4y@x޿l#ݗ-/}x^i}3%`'Ex=vƎ/?]d1/2F1 ؆c$G xپUv ʴ[n.cχ!aP,oсdҙ`Jt8g|7~q󳧛?omՓO7mÏxG?||qtŠ @㊅!e6Dc ڴhL:k'f؉3K,%vFL)@M֣W{t:~&Ɔ-i( [r PtTeD:DvCa$B74K#sL0y17}o@,@nI[( Us#$W' S{ =N}A\:HKY2ixŠ'2IY!6+LJ|mU̜vP~x6A[qxz)oe®"=lޞZ=Us-[1"3B1[ Ҏ|cW'`JwW2uS~ z2 G[6): }N&8 J4N[ צcZ׉ (>GM+/ƐeRPdģ\_Uҵ4=o mY,D\ö[]~0Ĥ*">&E"\5MdrNPO,W.i;?vL*-lC5A>/bkXaTW_Oc NmxB)d2vzTN؛qsNĩ;gi4@Pp2Y& |k$eH߉_hJoJ,c굒Olj}q쯜@< 5:3oA|eq"-ܣ4nmƖ4?}mk?cܼPL腆N'i]/M3W}2v#ʔzdWcw*>֊wb(I^U<ϛL,rA"n*o> uqS%C^Gԇr℔]Бao+ ͏ xX"C;;I3oam{zV]l6(sCX C\|x㖞B?K*Nݍt Il ]B־qJU=EgHFg/SA~d?WI$6G'O3޾vNzͧlRx9~{'!޻6Y}ł "$/aGV./!Q0l3-")L0H, peoۿ_٧,Ι>UsϬ'3colgxm@?)_+W>^:]T#_u Qs EM]3 BvYg9J>|"E\(\}0Hh3"-Y$v2m. ]OqN ~mߧDK#}`Ya<ߣ[ڶbrчg0'f0pXmiO9GUIgO5?AzyN?oMn*>a7"Y89B@IDAT8Sj|;Տ+gϕ:QGݾ#y&ȱY;$wGz՚'ZZ<^Y=+5Pu}=wo4n8^}gfuɶ:4 j~wMS,4;{$plKlM|^|1}Gv_If5L_}Χ=_cgKcI=!vdl8cg1~?a,w#v0K]GD3OUt ::Ocړg q2Єe"83p f1 O514dk, Y9Ϙ< 4 WrX/QO{xmx֯S~mS\UbO<$MJW:I$4W!c,jلľT҅0K+v~Gێyӵ$6ۋ/⭬>lƷEkkfNٜ -HD]d6Og;bI+(Bԭɣ}g BD?3>'ԣɣ֎}NWr' 79 I}aY1!.X qJLNse= <,Nmpws;t,+o+*HgFp&>@wс dӶ'3o&S,ڇLvQȡnLć(Ѿe6>UY ~)i?c L>{u\p Ԃ}.7rBUtq,/I;]P0z |ԝB?9 Br1|M۶p}dPI[0-8,yDo*3[<&]~'3N~d컑fN~|r̶OkmmO^0Iy?9rs? 63ȣSӁf_ $~Ѝ~b-N,,֛;Ot`r]&M!hK&δ`b1iG-َ6-ux"dX97Ӌ idpT~ԋDB}PǶÝ,,W~ӮopX]S_2ixw7ͼ{+O1hgkJ@-,r,Y|?^Y%q?`rFTV>G>].i' mwg=wLtw&eqeZG%ܥcSq9r|g~oN:솹?}N1 ͟8>I-]O~bib*wBɑ8뵞`΀09Sn캞T`i].r>zqbZoN ?rֵgNۤĆf f =/m53=Ƶ/u{ /ý38(^-o/}9gԻdWekg8e馴f~!_Na{-'|{0:7//˼mxU>u8w/t~~ne&^mL/cl%]M?\?mrbMXϮMe3 "D(š+;V43˷" .V'+?l#7LeR"r[noo4}LϤmm 6.eYP4DIĽvw]NZp#H1@J>ɚHN~&E@9*ת9"/T?/;(7SuB ~Y=ICp3db2E'^[n h'ԛZ R FO L&tT]h3[;P7P+`A1:y֏|,ǯsooW&?Mh9oإEH|$C_> Tu(k|;]_FO6"o)|.~9hW[էMi;I}k+_٠s-l>f`j Zd&WՍj"IL1m?ڪh"S^@j ivC3PG>msiSڜjVa͕A.~=-o޹okkGbFvrV}J ?O ݅Oi+ 'OKW4-Pq ?Ί:R/U8// E/w&j+d x.ҁo˫[cY.p`mm` ^}>43 G!WZ_^kooqPꆺЌms.ic13ք)4'[kc da6:C 2rGHE֔'X.ߑJ_:EuE.$*r:QE F"17r"ڏڄ;Tm#1ˀ'\;!A ƾxWX|N.d`C/C?YdU()i}!S?vrVGl3q˛œ;l0z~vxB }\@$>hAd?b{)}pBߡ0N;zOxE7ITVi?2v{n`o/֫WAykGQ6Si6}4yOaw2ytCl%A.Y@ b2dmIcTtEzJ:OI\d7C `l$O}?y[oP[Km٨9rh<ƶWiiYW/hs>N;E(bdUIjm8*ⓛx$xyŢ}'^%e?QG P{t/o8''nj0L{`/ cK\GT+;C~Ző N"=?uUƺD*#6ѝbnBcu#hDB "Rbͦ 7mnCYy\6* Wlng[X^ank7wq<_-=v=_^{7o %h4F׾A]A=|Vq] h,a z$0ENO_eMoӗVL_\;ypGW7Ꮖ~[B.栳S vZvR}ȷ&&Y[ω==tqc G|)g: sM'e, bf1kFE Ce l2d;^%׆xٔ LIx SUc@3>KNuA؄7m2g^-Xh%IDޭ +XDJ(x Nh ћ:G iEc܅u"'ϛMJ`c(Q}9=Jך;h"0 N10/d™nHNB9)V~$5TtЍopD2&QvGE.' X]o::틽϶MP%7g!+;vfpum֓p&ե z/r7_ g|Π1IstJS>eX9|X>~&wn Y?dۨ◦Ge[۷=/_rt3W_(4d1C^WA!qDP"Rii[epF衸c?N}Sy7ŧ|] N}St-$懧VoagDs#W\s2Iyc\gY>I#<;h|:kroE\}R~‰|vtH+N6֝}E~LFέR@{m}or4g"w~{ Qdɹ[2峨A oTL=Y~,h!Mmf[$<+p8,^Өc_;}%@i ;o_=:)x(d~p0ݮcf+u~z9tXȖ93F=&ڍHCY8tH U>8}џ]pl>L,}鷕˷$Js~bĭfw:%.p XW6wEG^c10NF3;Sc8t8 _jSvɎ+.ZۚaO3ĭu)NsA0&끐|nߥ͹#el]7DOGӟkγjYBM| *?i3`: 6mtC?Y`Jܭć„)""ve0_]h,b~\DPğgC}E~^1v9:'!]`y!ۍ] y,."{\d~taU#D&i5Ţg8,X!LCS뫇 xI^,KP̵^o?N0pN;u[>\l&G]ռ#rKűe#oԶWћW[bWmss\޶q*ӚIw/#g@/2jb%/dND$u~Z>z2GZí뎲|| 5N㚏g!W}sP1Cnsf,沬smK޷ɫ2>r ).7=%xBh/6JYQ}ݿ2L[u8m|#6߽NnUOɭdkEȼM{Tdq^{8aW'my˽/7?8}.>%'L?wOKq,Cc./YI &W]/BaK\Vwxyi;3Ϗ0Z!N>~9pOȸW$.`KV So+gqvY8]@TY7)994FN^fsL4`D9ƜQm곗@* e*z2pV Ls7ΗǛ0ht(wfצe\;0]7~8'/אMt'odϸ(49gJ4(Z EO& ~A)QiXDcX]MZOËMgӿ{7^X>}i)+L\3q<S'}+vGqn@#$s@$pН1!:;Sqt'脸f"{P<г)[kˤi =z,O9IJ7=kh1a9I՚Ϩ=I)G$Z"~|Gaup#Y8 6gM3H٩{h/N<@wq.DX]ppBLADpl:X`lo|<奀wla[My+nTpi;)-u\%+x$(Ni@NVBOo$=दPё]s(/ Ȼ > v\Kؑ˳:%n'ȅ?k4CKr1xW<\%M?Ge.*?uu}RN^GJ['<ʾ>|2%̃z"W/WY ρzퟄ #lț-ybxIGVS^+/3ÎpSpf.Ƞ؟ }x.U)mT+8I I:)vK@iڟbu' kM5`5,e|78RS+f9o!UGEkwE.N@4дx'pA&#[;d$9I?TZY>< I'aJu)sm̧L[{LًzʡSk9 뢘$w3(tOGɟʹ2gmmXrOb y>» ܐ_QSܒf%:ݾlN{kŷ7N̤43:7h7[nM|Roq$C|G?CXJxs%VsB(D`ZvOzNP}]AV^,jŠ$ 2yP2V:6zpp,.J 8AN a<[Ɛz|j?D.Ӆ?<_?hCpX;)i|@{~XN̥4 ?m,wPHjSjNe[]gqO&^^L|Zѭ~mJ{Eׂi/G~`Nh})&=KLkS| S\".o>%&XhB16AD0;Vچ~rv}d@K.4Q.2)[>d4,S>{#|FzPWhOSV83}' 5<s1cQƀ8C1Qg=cg}?UxЕnrd7kˋz__OO"9/2.}eaϬ p%1 ޲cӃ_cK ޲nkӍZmt46o"p_WZߨǕp^oݗpMxK#?yt3Xş'7fo"J96n6JCbI{ &tzkޜO5}c_|o޿?彿/On$ipn7O¦, nv/ ƭX ßACv:s„&MIY?.dn:d'. ؽ*W|p9~Idlf1F7oïAI-A#/ >%ЩfAuw3oa(exi" _? Mou @EAd&zkVp8ͤk }rP./隺|zBR4 [^ P|j E-kONƬU0\ }I|\ cB|dIʅ NTzQYH5tY+ۅm{$M~#>FvKSЗE8@|H 4dwALJqB7%\-PyH U8L4ELqtr !ey6R;I qihR n@!!~NPIe}hNf $FCnlѤ|O+E^S禟V}W,e wڰ-8G: }oQ-{dT_)Mv]]:>Qzﱥ/\'aX6l7ˤW\湀RȋebS&>zw'GW|(o@|I)/ L'NꗖFL>Gd{LmOP;8T)&m7;8{I<沶]8VEW6 G^|>SY _Ɋ29&ȿ R4@?'~4'v^.~"B.pI6]G2L@^>6m>DRdw'q{9 #@ΠKt,3 D$ !FPUKp-NboaP~b6^uNt?]y,7B8{V¸Di{3l|.vCR< ) 5U0uη:b&6"sV3l$mCąiCpɇOUd*jx8jy|6]=##O]F2@JS \f z ?ϭ/-Շ$ʜZsT"cE1En4i)^>zR?tԷeB%x"Qe!?$_98 s>G0] !$6;fGo^:`f.g;Ӟ޾w~~%F$]g`g?][gyܳ{6pׯL[R k=ߖ?qGLai\csZ6xVXo+3`G'w%{݅~o _/xD}ro&tgGG ~(_g\~aܚ{_s"' &|ɇQ\x Lq`O1}:̗J2v͸ѩR@C͘xP'b+Nr~o(!K본a fTt wy']u5u,$y>[Ǽ^ xfc~(LӲq=WsVn}uM71PT+LCOnȱ_/o#Gۡv S%e`͠sI"FQ Vj`̭z`._ɴA靧_/wO2}}kߛ3 +^<o1QgaEa}韋(ᚎN )**{I[:7YM,2AMe;PAiCz.IO>Ľ^`e:ey50!8蛕:9ja.u;|VLH23')-~ʜQ$m[=iQltE Q|3umV۞J01fBurTez,}.B;ÊTtCg1/\L|dqTWʜ,YzD@Eh$uؔ]QtV%aOh_d U˫CT!im&OPC-dF[dJAiT70: RF҇|?Kٴo7\_쑾zG}+: ]Pcٕ-S-youOfʥ/-kz \CϒsaɜSq3zX$mÔҝq8OWpY[I] ΁b)@YNQWJu/\9BAҿJ51|/}lXtD NW0/j6Iں}Nrs&ԳIY.n.ܰ4{p0䞮5y:}Or }* _r~= @SWd1T4(w՝v L68&/ʔMr}r6\[ޔRg/*I9sX{u Xd[WU&Yγw~<چoo^Ǻ6knDG#l+F;gױMYVОMDV}Sĝ6@ 3¾Z禿գt@DJT_Ֆ_Qr 8_}"}uaQgRʛ15TiK{Bb'-}};!FG@s8O]{[;e ?ޘCkJ{Š>Oi|c'DN#QaPaO8Z]avg/ы;`Alo~cv`1;|IGm+>wpGvՏ2:NObW7^|MZěPʳp$1v .bnxRN ۅ:v ƙ9kq,ܣmoY28Woٱ :zA#̛\5G l<3-7gW^]M}_78`.0<hу'O3t|ڄ}>U\tSXLErWse= չ#= !pKln q ^*{w7y9_Đ_2 -iɃ;ekȀ_wZ?w u=hO?[0Kݖ?`ob dp7y/l'd榴Yv#܀]o+7o-mV7ZFHԘIٞx[hñ4d", {\o`}(%({4gߞju2xMOO:}kٔwv;}c/bz1x ]>N|3a"2D&6( tGNELF/ bI%qtcJte %M!j-*ʅCsUetb,`~,<@k\O-B*L}I]zo=숝24c>X.pt)OLAO9w c &_.C'n&f~%&ՠö́s`r\udNqE )0]^qsd7Lʨo>M:.s]_RPŭls:Mn&zգ !.C~N2;zQwʤΜ8Z\&h8'{<x희&fYAWk{mCz58CCajOJH_ĕ>\G>'UENi?:ҷ)C Rϲ)g;{\ A࢖A"XgRM‰4O%PVNOt!~vI7пz*~'*I$M*e҂?=z䷮i1c r;{ vsaWfd6.(-xav_2 k>(>A׀^9Їg:g<1whs03m ~ZG#3Gu 8/aw\h6@1%,mr .G4&tB i/䵻)m ,lKӨznռ%3E<@&V{\"𪬊v1,X#ˉYNa}^g؝@XqUй|Y!O'Z!K@p=>c1U>slG}:P'\{O>a7ӗ& \-O3Q#u_gu lP@66tfdž鉃w8 &cBWxs IǷ12f@hkyGvۀ2/]pm=Ȕ9)gbo4&}!<|K߆cy*-] {>vQ>7Qcg98b?oN9pv$x>َl, 1>ء~x>?[@aG&{"m\BQj!8sށ0 "*&XPC|Onw,d%=QG.ԑϔ]"<+ǸD=\WIZSz2>);i[ XACO2\ GbSDVug4lE+8Ï;l#0`E3dkL.qKpʼn{at>)ܮ.v4~gٟPcSYxFJ(Uu[:\`kIh[t}xU{'0X=6f~ #չu`umK9]P>cC^:#!^21鵰\2Fe3-iO%is 1`G# Qqtw_I,ijl]{ސsS^Uנz?nñ,!%%·l\o;7_ԜMq&o]Ľf%^hc~ ~o*i{lz6]p{K/ts^Goϒ^"קMP8<8~80m><,Z@IDATGQ49|ȽYSӯ?? ƩOǧ| &?_Hp$*C}c<8hI?3b'ώNk0'ĘkOR|8;D 30&OM|:ű1 5yb;csYϙǕsb\>M㙧(rڣ9羼C)a|or|X8U>LAԠ СW:sN*?YjZ=GYY*'bp:sLׅȞo-=7-ayBx̽z]eez,ǝnsWMn_|:wqpnťĠ#@@ң %`f}F`h(Au[Q ҊuV30; ^Y|0]>L_dOmz}ӯG?OoG|Fޞ޸x=#;qH % ?d"΄(?lySItmu@EHѝQHRI͝Vrn~ ʇvo҂ Z:5[S9*OYDr^%lRѳѺ^Ƀ<[2c72JPۈ|opPOS=Y{Z= @Md_̋cEҰSm/4};*o%o/J9#ICr$ʹiтT]Q Q&K-4|!UFA';h/m4ɹ' j $:M ~3B|=\Fث؍f١9O͕uu"ɫ,*҅0BיWN'e#EDK>G\?`[ՇcN.`P7CdD~}x -ssϬVsqV,X:y =ern~x/hC2m=N|˄1ߝK ]z tGL0S#dQ>!%Y16994dF[X;Q]]8 =|EފqRNnS L~tF,hq>!4MՇ>ިI rh>Bc};@?}$<~KU)L)~δ hNg0aN񅷽$߂ˠ(4zU,d ~/Noߑe ?⢂Sȥmyv;}h^QTu)_"_ɱpK[G{)>_UDZ' }E{Eע0""b_3iԍ? Q!.?m39=[#.Z"⭦=Ƒ:rOxK;7ReT/K*X۩iufY,Jַ#9Rxza*(D}?=iz[O"rrx }V L8e7mDZIK[^q4GoL7o gB]{@ a] ്5#t<'9 AO7Yn^l;1--]n.).a_:UN2jm%/}/c_6=>G i?o\ g 91|g7oM;k쑗w/+/ӸvU;7pF,Ӹ/Y\udA3q=y.ťSb={=eϧמr}®O{x0/ xlzg/;YggO񒌱b]J}`1K9Gbq&=~uv~\D`|mOTdL;$uƤ5&zF)NuٕAՁNN O7@*}.U{-gWAiʦoq\6kslꋣ0N|U5}dVa+V"zuFV_~APW==r/Vg2۾`@zCs u]FxMO Aak|}W#kk ݄J ؖY;;{~>aH߬gm]5{oUWZqal;CO;[lo۫8 T<姳)LD>ZYD}|wg=]BK#0[iĔe`Q+;ƇY[Ym' 7 zEp>WG_Bس6Q)m+Ak ׊I_gi 7hDC'WuWvo#xŸ`⢬{+'˷'X~!o>BG\nטGʅ 3A,~m ~REvUt¿s ݽzq[7(IuO/@>O@yt9| J&iwf+Bĺ&Y|v`h_an"!h>v:FUbycat`*d8s/Aqg;%ۤz?`uRHQNbC̣}}/z˧.&4B \OmRԣLh_B/\_޳@ɊT$<ۆ mv!2 E%'C;>2:.ڱ$XG> ?߉YK z4)r>zg.Yݟw.ݟN?ﱙ3pmJϋy&yK%Y?wNˬuJ L^Yq6.@؞L-Sk0ź~:o\?xְ:Rna }ls=] A&wsz<5G bż"_+s8:,d,19GwV]\LGO VǴĂcF;x!!vE^O{uwԯ"paψMfTb ƶ/3ou) }Yݺ?W5歯׸JK37/-aD F"`W6l ܍T<ʇ6**|نk[&wkYZT:62R>aPjpP SDv $* b6%'f *H==b՘7Nޘsק0?8[ӗw¶Ct ׅN\06YБS O\#{ttN>% 0U3T"zJNvRMz e.S4qʸ(H1:UyU\n~HGy"o'H-:$C`nqp 芓[ m^o~n#Q\q Q;G]]8 \yM&A3'N3Iꭐ]p$aC\$X[erJ{6Cj:[V\æ 55Ë  B|B5?"m'<}LԷv>qIS(S =u4՗CxL~SAf{nѮ\䛛pR7$t'@?\Z"SuD!ʡeܣm_\L"Q>&B'^SSxnl+{ج[UXcT~Ἃd}y/sJۘ7?ff1t>S) :)vˑluMfUSo=QUM+f)Mb@p.,~f_h$2ROѯO6ODҞMخ+?DxD1ljȧctmwWV/NAY.0Tef"4F>$RBo޻zT,LV mKuBG(('mIJS=w ´K>_љfNR:6hPW& 7XUgqQ_X!'=B/vJ/ <\$`I>hn?뫉yXT_sQ> Q~S2OzlJX,=9TWg3N@yO* iVPLF{?ǼSC,G!z ؎=N+>ȟ6B3e'/)FME.mo/=ԥ]q-M-9wa8SR}FVxSI5ƮoͼAZZ6gw;n x][>isVO>>>.@-WY 8˨xS &R,b3\O/vU6uB~E⵼s.^} yD'gbS+}9N'?~zOꗩltԏ/\ v/q>'٧HT%)ˤCI=OA~ՠIx\cBu-5qmQu]E˝^.k&rM-%&K⏞,Ҁn֠<8|C%74<0b\mM^/15^]CסX­]׹up?rszɸ^OmybFe[o8 5oqը?~\|mpewiw(寖q'G}(Jr_WCuy]W=~VZkyMʷ4mg<4q<úGJ8O#c>lg!qW0q- x. C._'O|/¹w8'6|Nء/ŌO'@583uc*ƞ+Cˬm/aδ܇n|X헡_5)9cz 뿩;n+ۖw,x{.gӛ|W~8=ޅ%^{N'm̢Df@G6qv)_KV)d5 'wP˄t^`'tN^HL-r'@8OhK_64Qumvh)uA'%#[^w;@}_0ʢNJvV-gokOQkMc .Б>-{bwp­y3 pa8;9(} X{sc%*.ԩBLfl5&sL^9eQ>" 'ţO\gᒖvJq/3 }۝OU2³[m 哛/J?'Ē9|6mUI8% ]*'A'mǴ)uA'%5hBRS yh=ې:N⣡̹&q{}Ev*^}Շq^Ѕa߃ۗnD}vhp_M9+;6xQS#}10Y %|y޺HÂk?DN~'g09Rn?g\zM~g 3 ګr&ߔUTy}oWg$@fa Cb*qzYh$4mлeضl`\7 / &D#!}"tnȋ&<yP/eq fQ Kg}Sє#nR}gQ/%zs/6eu|3hЂNƋ*d8}H9mx@QS&Y7NdXȨW*%):vb}Ou b_@nHlk>HN nyg /\Q)uG;ȷc'ҳuu89jULS`upK:i,zfWDP&G1I=O5 =[M*Q_t3~3basQtmP`D~gcp0)†`)[MԘA5/h3O1A^(t)*8yv}]Q&ႉU7_7jJ9Ohs5/q<~"ƅJ5>?JagU#qgDS>GNMa`&ĹlWjρ*H u;gW gT^OpԿsY\Y"xRf}=VBF`}`DQ-9\P~]w|We\>%S_{>}?w^hgpƖ<7ؿɕ9&x%uw;kI.?IHl$U%TS}^OOk-E_+s90VwwN\#c+//:>KӘJK8f'/md! 6c Wx[[ޱ%E,>2K6^>Alܧ|ȀtCK&5+‘6ݕ'6X6i[o[7qM݌V|T&D~W]8/·.iloc>emUA4l:A*I@B-'=G;$Lt_NxĚ\ϝ)WID#0X灁;! e#W>&H^ŋ<}cx;}w[,wt<e"k(L3 oLS]SƉ@x+ڙ/\FЯmRb]]Nr~-Oy@<3J( @.v _:YRAV,UDeyA\2/&H y#gNZwQ[2g ȅ&YRwQaOS ֠]Lu+dc;m .1)FCq|r̛ Ѕ*c'$ċ^Iv<BHx~mbIlk+~/.ўI_Y^J5 YNLv(^( mH?lA ~RNoXNsZj7kKg;bo˫"dڸ}?̑O?=׺:r>jS/7oա@z?fi <ެG9Sko]x0$ Psl (Kxm_۲:Я@ʌ>7X/a6sk|;\~"}z,6΂|%|S^87˘<OLJyb8Xx' B59N4tu1ZYND7K(IP)/Ls|MekQim:Kh'??[`v)Y3%o8 Ͽ7BϠJ ؏Q6ROԁ:3x2 ,cS>Pƒ'ٽo"&k:҃c3WEV?a<ۆr5&!SɃ96FVG\V\D_Д G..iRr":x 1;[}Y^=  {cgB2u*2mRXy~S}mMt[&λd؄߆1ﳣk~G[<=jQx5OVO=|/L?aO5q19埽C ]8c]wpeMl`cA^ 2vx98֗7pOSĤ0w\v@~||*Y'T9c?M 1q^Y+unv}) KWweax) 3d5I'#gt :doTu-eO$y^, S"-G?Ovp(;P$A-@`,vw;^/s+݂ln/z& S&Һ®q88oFVEi0N/ "9!\;Y 9N5삂CCÇI_!FM{IN(ڊOdT접rk8;HEʩݴ2A.P%Y @:WbP漮o}6fmKIuɩh(<0H}>[d i: /i+?X}J* @zwAOZ.)%9o4NQSWTf&* C `RGe\c1tl.do'tK&aܮHŅו{!Ii[5^A)b2|ׂT(ex6#p'c[@1W?DX#.ɤ-Dw!;pQ?*O=WΤ0ϫ JcU 6 GMS^.۱Bފ?(i"UV 1p8:1iFBC ;sFwŵ@vѱumvLRMyٳi,Zw9JB$6^]8/GX}R _M(V3fB\'GjÎv o p9;Y e\ڠ vv p } 8LaQl'R)r2\~N 6yyhʋkwf}œύn#\{|m8-L^d,Vy\z',{EO=-ݒ&H" RseBh+H:)tb.^w쇗Os].w-_4F],"ke#ßYlu-B>`ҫBbLT٩8N!^|*o|A A/}F\][kmchZ>US+ )ܞ Kí-wp[Hň^.??˯/~˿:eVY_~o_/}c3E`e҇58,P;7?ay]&$M3)jRtf9gv'z5\)MyU7K9vԑ(Ft̖ $(&|[NɅo^s:@ BGR.=>"Siy m-ࣛMv2x O] "t~ܝE@$oР:`H A(ԙc3m;uC't-q׈ 9yK6op\RֺqECsetlMO~mcԯ*JCZ‚#` \x.~*53 o [Oqw2(f?)E^1_?IEU1p~YN~5ΏE!ctnmMԱ}I r,@=j*l'sۣ8^o<МszOiN*KJktDž2lVKu\oxLe"~k.΋va?6m a.sԳl7x/kmPY {gL0hV9Wf,o5QEՁu3p#E) ,3ϋK`V.;0y%SD+>r{*myXry]؉umk]>8r|m4(4]_n]xwߗ4] vfF zyVѢ1. LMLLN|ڎ$!2y)Ms4H6K&/qDBaC`6Bet lkt*d%@t`&Ӑ^񗖷 W{|M]~w.Nywytt\64`:/VF{Le?R-z V97P,LZˉTut7i@MJ?f. Oɩ`,NWX!E loS'úE{"M;P6_||{TSg"),7ufdnUpbu~y2Nm2y |:z ģLEne_G>X cyC]߻;ڇɁ}D ^v(*/eYS !ֻ" 3ipMiYvK@IDAT]0|?)^#6$ue T,}dmȚ&I71>1yr{N hm0Tڽ|rhw4򦮜H䞓`E]98 p쓤i?a{mcMጭ2(/6G<({H!ϵuQPk4ڦ>>y7qNQZ\?p{BO>Xg&z5G U^!Mgȝ XځB5`Me P s_~;(8}|ܖ1Ε όj!iw:~I7sm#E wRBfǸdcOlO,֓B9~$b{mX9<\Wu+isߎ-SZrˎ G+vWXsʁP΀-˂Tof"8rf](r" d Q%Тrm\\@"vBg@Cƀ}#~7pt tN;L$S>W ] oCIGpN>iCjIs]3Hګ$m{4 >E\0#v ,mB?;O ߝ.?!? |峱5H՛y2i"-g-ӶzVl ~Q8s gn2ϔXk^1{^X!L.gq )K{.TIEfubfbMi?[^ji&i'v˚Z0+cUf eX~|Nw^y\ӻ.w!&W[yGؤy/rMY&myB> Mkx/Cc >rZ|npgkY֐^ڽ^=l7lwɰvzveyݴwu巾xwɺk5ہeٕu2.g^OOqWOץMOj=uMk[{}Vz;|R}`vܽޅ8_]o}|ٯVv v`]G.{̝9i;tG(;! 1/:y0=6ߵ<3R: ֌:f7Q=b O6BˇIC.|i!rH26JEبTvn߾<{G̓-ly{ãpK0%勗 I7;]kQ 3y ALF*:7)SO=kKsy^zyH;gO'h)6[n"xj7GE3;lKSKT?Xj~&8J OdR[b/]iXm\- C!>ȉQg/])Imiai \gX>xk&ԍ~Z28m J|\{ؠ,Yot Z&}WMtbQџdV׺s j?n<O>f4A9nvL)Ne?̂r*'\+VOAJ~֧eI _M^#vN̊_C;p(I& 8a"-dY~wb Aևs?TGnO#Pn}T]d> S7u0J?uʧWR:ڠm~n6x֑uCnͣQ2Ci_,fiS}jq+%\K6w|ug@O^Og^2Z&mge[3Ke(sIIn>#~dv$EY R,: };3q󹼋GAMC8v-MSmo|zD_iݽ̺%dKW> wѯ%4g[Qge<A g-.Yǟa#YPTg n_ri["/v7qS5~`c3tSuO,i;|>X-}Q!.oТYkzڑv:s3 5YX3'6 +LyOSZVsi]ZZZ5|Ο|M;e+A&ycylmϞؕ C $e`B,i&42R:3%?; qɆuj7iګ-L 3(2ɍ7Ȼt!|2~_X'>Opq{w;|u}x=nv !{& 6ThMnH Ŭv0Hz}< R6 'e4z'h2Q\z;\yj/ 1*ȍ^ i+gI8Qf/EàxF`yDjڳް b=E OPTjA|eծc^y~ \+)_(;ԣ(Իr?.#)`6 1q#/~Nd _/:ft*%P4u犈Apȴ^]j|kwba$⁕~gQ[֑ϺO{@bs7iTe "^p02p q5`O2d_*'Aiv5d]>>#U2C%9}} p>9eg:gDlv)6p.`w4P~"graLʏsLݤ.\o.^9;u8YV?P_uԖeg"xeof-D\ $B6d֋ϣyC=Dܿ fvgaY<33 }ˏ\ٙ:^m\yM# 3D({]喬" {``_Bz3̐@N2_P.7{G> H5dk s42K 1zH@zK.m)~o[f[祷+Τ5B{ɩoj<:7m !n8˽zϣ_󀫜7EOya6'@ .ceʼJ}`_Eq14n_*;EV1 2am .lPj֍h4\Pl LWRApyNR&5A(3yl{ | f̈?io)xdt.ߺ<^u_~Y?_vϗ7ox~]MXI%xL2vǾm':IB}a#w|q[Q&pS{QZBy`/NBœB8M3G߰kgmΛ c+VykрN_]SnV`_;" NR8.FL?P] 3R>e km}#^ѧ}h 7qd=.T,oǙHʺ(r$Cccm'W^uC][m@WܸXf$q3GX彊nέ/u1B*{$H[>.fg?H< `&9(rz<@eSow\BBmEIuu3Bc`}ku"pL>ԉޖuBh١JzR<?|P?*δxzf*%0N̺qR>cMҷfSOR&WUYj'eÞdm&p1lh.Nn6/~XZy^[ګEW&ճKXaLHVu!} !Ko0zQ#%uoJgyz'+#)z΅ Y̒LxA=H[͙ ڈ),r,׹M[GPs#+(^ &enگhk@Ý8U&'߶,D,܅6)G1_!ZKG>Ee7DcgJpLbJ$uzPǹ'mWnMyڠ0aAam"#4LS&%T0Xv ^m*9PY'  Z?Jk>7A@#^o";Qm9^kT[}'*#6ЎWF'f[HAggSOh?EГXQ2ʜgOR0B_s瞐~7hȅ(VLV:]iglWs`2dF[eO3/=}N;xEy~ņe򃸥蛜|>dm5K+8ז{E.9!zQW haFLi";R$`pquK/ g7 ڶ .ci[G㟓~6D$dRumuwEH.o\tT[#lݨbX_Ӌ^8v eںp3,NGm[CO9ږM<o߼IO—4[ϾRZi!GNi̾5H$nh7uz5D])KO^' КLd欱g{ v%4imڳr}u vaeKwU>4svwZmГMeg YfNuo8kU;`]N^T&ܦ|%55OJ{KkZ|cmGd5Xwe>yuv7K}+C,ǫ izwv/]wkiM{v@3|q>Q}0{A}e^-;'&|@`{f|Ag2JwlVppD OdQ}b=sBJ, co}F t/r.sL,xƱ35˳-{zUNN3>vNq }\:xٸqrN9sr^=&Gd9t\qps쉻%-s_Pbh.XA_.ZtDgɈ#@<{~m8]FNȸ!D7άIb|v&:%}`gdӚQ V-olAtqsZ^HhD{jRVekcԸ@R 3̇{\6DJJG%(QF'3h,$@efHT1zV;Al-k|m?O\x/n_>w=|x9bcPEK{/3`D 2#v ttB&m.7s@֡?4 adq*|9)he'xʭ'D @ހq:\9cUfaR(G |(2lЗ4g #e_UJJـ>>WsE WcZp.7..7-n6Ť;xO*og=jN̖m߭3mxwBm1bpAf@Hm{3z߂XꤟeϒO][W9"=ϬQ'>`$ !rCLu B;Z^Ç"H[3ssIQ#$H\!+X/Vr.ZV!H. ڤU"fj=@ ai7Yz_Uu?AL ƿmSa#y`?\?0Q7{,:F/8Qku@J\_i >[mrʤ 9Q3(FJyDDv,:Ky,wx M[lv}AQ]h"M)3\F*}T?ںSFxa97ڐZNGC@:dT#97,(2]{~{Vnm &yA}c'].\h@C_{WHU6\' wpAAv?'pzIcgrwhmu'}'WB,`gSK~ O(;!Zڇe(g{Ohh13yP9un FjkcyUkY6Іz􌿃Σcm&lmDz E(/(xgm#;lc,OZB4,6X FgE.~W}h[gci<^:_Oۓp&~rn ~&LCfx޺v XӦX^mR᭳A)ײY|˷d]O8 Nl4p,{~ cn-iɥt]KcNx'_SuęT'Y_o+03o31=6wlJT {}x;^S&.|Ej>/5.Ǿ-n#{yJ Vn_*?]8Ϸ6ԸL._RZ|NZwpgK.9>@X`>>3qO3[ض ?q/TQg y|#c]dgbΗ Ȓqcx1/d );;">e5]sJ!ݗG<~vG`$K7z|I\%q O9*A{#"_K|R=en|c^. + j\@<5cLg06tm%K+11 i:QJsMS#p ̧ꠓP\@vx@* I#2' 뱫,_ y }+?ߟX 'qC9@ ݴNyYU.Li \;ya&rReb&'+LmLÀc%r\w]\q ݺ8#ݹO0$Ҵ'8?v)A֮CIA&'2*I~\)$O<vmT.y?#;uo<JEW=V' $xEW_t3מnNSھSWˆ<6d"zAfw*,Vl/MAΐx ;nl1sC|B>ֱ*zh[ \I NqH>DXwݸΣ}Gfw'Й'enP9(/"wuK6Wp#eW$#2e' 4F4gC%zVO\.tIny~h=i{lkK>T&DSvV~2 cc\1=gqsp^KTQ8})vT/q% wB`ҷEIݕ`CCKl~A!.ѦF(tA¶zT. B0YZjH{M;CYi,o.8B-_ ,ʹC!:ɂ+/ʑwKys l(>V@|v֥:R~VL \`<-9"5W~vB8[.N.|Ĵu(KgB[yH9bׅCe`&3ecհ=?eB2\ ֺ@e"^Dҏܝn:;@RI c_}{8 ;//|Lݎ7h;w bطdBٖ!r,7zҙ兽N-ԅ+x\zu U:N vqnYӛ=;K>qo;TkIq۽=Fe,` #A2p R!K%Y\sNv~\.V\C;QU_ʵIv&>`a#V!NܐK]vgj]o]^Fmhny_7m0_rth{9/e>7A>E3&6CY8)ݑwժIkWxU}zm#P`JO-y.Jډ&9i䅻IЃhdt(02vAG1Mx.(gD-9ↂl.j)JA 2qi9m|E _럭# F ' L'nB4J|<^.HrB0Yk[rSUmִ#'<+g~+d6uۦ$";'CZ[?&J_O*;DD(m*+ ++laD i֝$mya xykI;ypbHꦿBC#6*礩#xǎ)rRVqE?M{٤`B¤@sX0~nO=M]>JgKuF1P˼ֳ_3)~}z@vܦPo.WF-n?uzgCP.؈k19>7WgmķMg+~i >]ĥ[Q_͵]gމ:LottRȢ8(t"<LKCZMH<nц?3 ЗJ'C@mrDx-QUHD$eֳlK"T !0wV)o,ea3;f⥮#m uk>pb0q6m+ CQX'-SvἋǥх5. Agc}o}mU s: #Wo={?[~?]7xy؂N^Kʱ~uY@/}gη/yC gigټ_k?Ys$]{`,-|!'~TR^#[BNJ ݳ/$u5ԓݲ>k[wavoA1[h7ȖRp-hnN,+dE}p` ÃgzK]2".aOyZ O<O8<9,/4N( G1Ǐ+u|$qc˟k )K gq8|-QfL9hE>9264tD\.¦|t?lJy`˫?^~nxo.govi4;7!Ax4F6:ku.o1ASpOvP9Z21mp5rVORf1C==6M < ͙kO t&-rM:$\O/ܰ6a0_e4h/S8#2 s7b.uCh,釙 =I: uבP=DƦN2te٦%7y3X{p*?Vo= HGOM#

S$$ I7Tp-I+R@㝰uD޸3սiGrԙp>Y'ֳ][>yOO9$'>ƜvI#ezek'@lVF}2H ZnRD2xIeVNh_m&o˛66]]AZ[ zΟ1C~ʥ^ϩnYJu2/ ˲FVN9YӚ@Hވ.Pїp3'qivH?R?h_u^|vd9Z_NFs0ӸAV/.?򏣰,tt/3;Xmta6.8)ܭυO.Y(}x 0Nߺ3wa>Ќ m?1,ؐ?dTxQ nd47G2v/:V ?ܷYxϞ.?.;|ɲwfFRUI5ZJ5Yz/\@-5P-ŒYsIcR7W:yϠ6|m)HO?oP=LNv5aM_o?Lg0%?U5Ns n&h6t& XOH]y;GL;k>JKUk`,z[kswe+_ʳ|qW]z%mx3yjkx^OЧu7C۵״Mq gYW[vkoU]@d~Ѥ@IDATwX6S+RugMǛo־x_tqΟc2W^.cbXfg+dz881[_~ g ot.c| 3oW2>g1qb=*?X%'0g< ) J₌w3>ea_C9bٍIXĎc|1|´\$d>~Na xΦP@7☾‚c7;3Mx>CIsCo$O֨vv'=o_K_핸ΙWB_ 2pk~۰<'0c`ѳ\;/ \jx#G[ 484AssMc+.[,si=#IKMP !:'Olt4'ej֐{s3#^#yP8y<ڡ0|1 ^GiТ ->cZ[ȏ[^$훳&! ۺ$%ѥ2+d|.\@ojdoGV|3ϳo)Jqjc'KPd5)S 5w97?}ާ }8BlzH8+Wms$oh+Os.I{O П,~ 멺lut”g 7҆gQRopH~$Q5԰A@˨G s]+-駶 ,؝t׼cSn}vI/Hi& t{o^L21KT(N%:iù2TOq^9ϩͽC79Wܧ9{}"3~)[6u)`]FupB@ԎUOKߔ#t]7X'NC/Yzu# >d"o;sBo+2c\Y4qiht>.+X|evG/hgd̟'LSN˂ ~شN(Ma'3a$@h+~2=Z=("V#M7(O}PlO>b?GV90~j/??[/\ hzwT0Ipɔ↮[ .hi1.ƄaKt,Lg'=z{ "en)\_\=(O,gcm-zk,8ni,2Hݸ>4 Fl 8' ,BIF.8e{C7ү-o眷g\$q9\{)'~q.* бgSƑN!2d<*V҄ ?BSl+ڍ ԑka ;M :vGa8kf1tކ0Yct.֠;1^4dM^{',sGzg.F[;g-?/ny慆g|pqx}Hm՚]Y Yht7 qS*̺d-Tfk+w*6o (NيK"iRlyL5=>335Yt-s\XvFCµG_+2Ɛx #>#9qe ɣG{5Y8 兔s. 8P[᷾eQ.#|: .0)/cvpg|9%TbA1ܨ梑8B|ŸH;jcm5Ltelŵ 5r>;ϨU@_  oz!QC>a/ʺ?Ҿk3@wȊKc>b~z&1ই0ҫȔLL"#*b1IpSFtJؠ@'z 羖itPB@fD脋A/[+tBK=C#:&Ho-6M7e NBk3d>|6.{_7~_/<?C}L"eUː k ?RX-Xl֍V#r 9:r"^&%~\3՞T抭[&TYa] }!)}( hɠx8~ ,6E4 H~lNO漲@&FЪJzt >\čA=|p؟W,B-Ր-\=-|8Gq" ?RUvJftFڑC)k҇F8,$@g'9s?7B`6҆o39u:gGM'|CAɏ 9&-O9y9~ n=/cԋ"c҅H6R.3a;9m>4'ǦO:ggt̗zU.i*SBTtDv"tIٷ?22id~i3WGvv`9j?ybrElչR׮*`?,2jU‡I`#+Gu&D}LQ9m;X˿t_OYg,ׁ>Dm}'A7,/ys#mҤK$=tP?3/аno]l(;OʮSN?Y_ܳ=NuC]ֆp..h= ,0KnS_1 J1PiP N{SG~s# ˁ6n#țUXxWy \~Uz!N="!8Î=Adۦn,>m;G>9#-ݯ}yykl6i?,J%RX˅.AEᵕW. 1NC3-p/*o(E 3HsFG9;9E&;Ec9EH1!Hj)[]>8WŬ[cμ=YgmC[ʄ-xNw1/ o[|[ϖ_o.OsrђZBpf;||``&j43-%}is=#=~ GL+3& l{3qRPP eicxS@O|>] Zr赢iyzSi?%X='kt4o?kZ9oD *tekV-A?=)¯yaMMݺ.- Az}&]. ȭ3vY> 5qw?gg˪L]פ¶ÛnWE\v_'&'C.G]DuDM7A<jc,OSg뎷O |:nO>:rg#Qg{<;X .\7蓝!w2b b%|Z55ciG2e&.3';6Cbyk[d;d䓧8e,x01оe̅׊OBM-dqx8 +~<9=ˋ^;?6_QqB,91zgL +/r$΄;R.ԣǼ [hh8w9P 78m,s)2njcq}M~3d脀 ;rk1|ز؎lyhF˵K9P`P6~{~$ʔkƴ WF:|u+/ #20/A4Io; T5(mo|S #D@m&?-OH۶B҆Y5ց,%P`[³C'ҮU& -O8?zdR7G6uhI莜<>`LY?fW-Yտ"-&/Լ+V PWKWi4|DuwB/msB#Z+$"7]j-ۜ;!XN?=dr##mw]d#"e=YKuL׉H|p~\}{̣z_Oˮ1P2I~u !贎+o+eتi!fü> )O9*&OfUuhN8<&h{F,`'L=,pYsZv7@(Bv+GϕRؾ BO~_xѦFUbCW6zR?E&GVd>!ѷJ6E I_T].Qڸ)wi7Ǧ 8!nFXK:>iѿY|PWƟ= ŀuhQ$T}til,b`eDfuݣ#rxs{.}D@F;Nn.ّLwAM}:ErP%;c1[DZ#ufP.UoIvAGK[VҨ\ŏS>Oq~F@ D 婏)y?`)s:Eg_@܇ʪM?/l4<~2;頛c3`lv4")~ˤrTYk_PKy)g%`l?-!q1a`i D-S./B`V\b/m[+ug=k^C7o!t.ٳ;OgogQgPriOת[Z!}NҒل}:BXiY5X/ʟmQ2q㣣%e2%yyT=z>L8 ,⬏4{mcb}\țͮC?uP>ܕvm-m2DgOCK.+A?-rD~S}gz4;ovuƧ1 >0FXH3#q | q  x􈑛q=:tuWUf#"vDGdFfFߕ{zZ{>6.?4iH=ݴ'kJ_ZqKL^@L: +<38.yo?_bڗcĜ|쥝֌-}9Q_!6 YЋ^fi8ovyۤqS/g 8 1M89%Y"#-_Ɓ҄1Z_R7rv|K7lXD2IyD>O6m81..$!$q:c?jRU=aHƖqpCWdzm"xbZ=7>_){^oZx;^v*D k0g@^JyLKN̓A@D&)Ov(~dLQAx;ƅɣo8).f 3L'B :/౳!O:D{,;q+թ*'$`CkX[%0xxؙ{zn~i?r_>OlLLs/=~>NǙFlͽhyz;r>8+'XtN<ͶNY ?8Br2̪v:4_`4tM L6$4!˘Nz9vvnwī38M4 &h.Z&/RтWY/wp T+3zo)h#!Զ1}>͡1'.Rv'oJ87$ mTۺFb~K44N-s;:ʤK*ʟ uyΧ\( &As ,xgкȣ>嶕zr# `-jF>@Ԧ gDl(|ڙG3ڡzN$v lcޠ9| R~7;WD]F u*0mcҝ .,(d+DžMWu'bo!B-Qtb|J' m6l vj O{%+2S\ʞ:A$ybP)2*'# ~G=|dڞ.?1#B;w Qub}F!+QR[ڻ]a^-x#F|ӗygA'i+1= `j&%o+z@nQlWY]?(37Ңpr/X:2:ǽoֲ;ȨKI60 78 ȷIakK\;o+Wxvm:}, @k_P.hO:.ZSDhym6(G/<|s|^)wvN, =ڇ!B.vv?qېL;Vʛԫ5jjA1 KaGB75 9V^YIDž}ޓx fO"/Μ8jF%Y~AGҪ5+K=*VZۏS~#Ö? jY 㿳ʜ=$ӵ_ y+A&i5䦎gq8AFyH5 peH#4r|>Eݞp@:5Bp\ LC􎝕{|}C>v[ϩ)K#tyqw⩠<]v3cԗgY|Tk8%MM YQjX;_J w|^- nyGi^;՞="}#pstQ0>X#E'޳RF귵i֊ĿO7~Q_bWG𵍌hQVيeKs< d`Bm !vLY G%씑lptgV(^O`뇶 jwY.tePe[,,}hHіu|8lE">8l%RA’Z9]0ܚxz>~GN/e.e&ZgJ@)S2=^K{XK Gi|g.Ύ2Y|mZ٢I)akڕn;ld w_;J%i[qA5÷| >GӠE^{u8X$i}{=Wd! aaPdu.JsR SGǎk H; A ,F|=pz6n>h_K6Rj$Jo+ޔ7t;)yZn'z$?w%7uxu;vK;f\~ 9w+WgW˔2ƹY2.ܸ/Y|]OZd?R+7e6l7w只ϣF[-keO|I%~-K_7_7m玲޼AOnC2vݻs^3{H³=@$u>Snء,*lڏ|‰b/{4|?ggk0ƌrN/go`j]^Nms}OmXXﶮ\0=Y4ˮg3||d\'=Y(z2a NcI}1h2Po6[_cdt(Bl^WQq@"H#ؠ'ON>; p/ܶXd@U^ $::!zL>Ir{ğd4o4O>1zbUgNh$Lƛ׏.Á0{{L/Y}s;pz~_; CPSzL'eL4^ [yF" lVv(gGI_%d+s᳠GMzبs[A fKۊGO<0N[^' a=lq614'}'P/ԕv={)3 5 <8-&ׇKoq=)!vN ߀sܞruK{DL;5Xv8!ɈTsWBLdS#|l.%|ܻ8Ě]7C]*j?e,!cu@@q'ý [WH,vSj?sRJoUIw&ƒsi'M^xq:m$[JY >k'z`?ʟ2*LqJwuwiK/P֕QV:@I9Z$뻢;|QgWJN9h;]$o! 2R/+Yg>>`#qB:򳭲KofK*3ҩ}KNE,P b)=BHʸGh{%;jCin.g2ON| 5p5;\zqz"2Rn b}p<cYd;D2.B]%W\ɸʐ,Lafh91c!d, TH@6*"|冐ѴGgcGvDYBїޜ>~}7K>68?Q룡("4fl? ( k>ڎ|Ö?Rgclc]䳅9F&;C" 5v#hS!3r\?_2 ?c}ms&=R >+'`}k_R?YQ+tXI3ƕ3-mr7DXjXgWGh> >,~0.dUy#>K7EFwI9>>13<:$lc|HY{*s53rCmh?E瀰,zMw% ,[Re n{[XUv<9~(|1^곪պ_ò?9|kjLkk %i!4z}fï.1.^dgd+$¹sC`<><Z)s^ϕPW`C^&@؄/p=x]59;sT5&`\ѣ<6 ,8;Er@\K;<9#:}kOxgGh$3:E%#dοS0?cb&јJRI<6 /%i#872]GF^q|TQ4v#A/:p<`?7 :zJ'!!? <K0>9v:Ц~fQDv( "rO+<aGiKPܤO2 6xk''ӨUag؃yn/BW8qRV 8oeR/Pjp(pNi2d$, 6ߌvA~ϿmM{!2[:\t{y M l2~7:ם&#g8:*NP+'-R*kܙH S (b)|_uQcd"v3`[} /Q-jZz:1b=u6UƔ hÓ-qϖa8/-#ƙi(Y\A Uh]yKҗ^!L~mmvJW5L:%p5䩷ZyUT0e!DgG"ݴ?g*ki-W)]DRi*Mk ?[ 2%7kn (|kb^7/M';GRτ3ơ?6;ybrTʎyTNVKC}ߣN }|]4%aWg{+E-ضlspGVL2NiVme"EBWhvϔƘԬm*Sq}>ݫxt<#7i'}2&@oi!e*]!;;8O]ͶR0A܅6Sk'3 VugD`{E@iT9I(ca0a%g,C E%?{%TnYDYHo`Pƈ@Z fx]`6Ũ(~91z]XHMTVN2 @!&</շei`"_8 sXa}3W|"c./TA}:8Anom7 >e c1zC'G[;/lәn?rfy 2'+wk{}mŎcNï&loSz|/'zWǾܶ;N{/vX G/ypz 3yV2Bcv`W_e=2DHJYxĘ1l':^v%vB"~S3PϏ::Ri qM_kATbYLH;XYn_S`u&eSj0ey9Pt  4K/NUhǿ3}?5GO|?!P̶H`](W3N8#Wp) ~TqY7IReRPN.SS|wL~^V![) ?l_ع ^O[0['7/*-d /vK Z|ϖʔFݢY&iĕ]*Q,Io0,o >f"@x˥ x6IJ9n{'I-}`4 PS q'ۜmgX '4? x"ʫ:nt?ѯrG|}m4<'m^$OQצտ8[eRI`Q|';SکfT>ql"36SR67Ip2+X׆Κ$h)<ӾAnOg*\P$'q63dQ߉4fXMVj;hUaF=8@,~z;T zչv-LŸ6GT vcUNCq<"W&hӝ}ja횿]ԆkO}2RK +Ņڕ.zx!j dΰ8y<-Rc6fD&~% rb-'Z뷺2Z dҵy\Է:]Tg7m߲o=cm{p.F2$eaʴ $Xb~.{?q2͝8* ]!,ls~>Ÿ™iw> oMiZD5'Wg',PE#ԏ- 69\6NMWS;#ĺN5e>=Rm/.7׭w|ĪC19.}\e"85߬nR(o0{>U4mHO+#<:p1ԁw_B&g,S~O3OOf%0D•_tEZvԸW?Rl %3xL=IW`T &Д, M2v }3P$våO;n)E0Q3N"1/%]p3<2UYp!/a Օhk{xKP'msIYtj5&;A?r} Å+`B78|?E}sĝ-O3-tnsڽrNpAn~|(?ٖW6u XҠC'%$䄶ia00 *>د%y\[M&ӆ =>盹T[` U oJ+|6oČξ8_<ٹmt̮M:OoMtx P UnIRo> @{RؾfG:kU=a}s^]ܻqڮ~t qz#|V7Πr'1fmI\Ym4Q _R6:)^ws z]/:W!답XK`-XK`-Ϭ+ux1}Ϣ!$/`O8 g<8tGь5Etr7u81|&|RĠwKy@2-~^y.q _cW ^AXw!O,Nj4uS3ǎ1L?z5b 5 lc_ "vD0NIc1Vhg:t1/3E#;i1=b,h!js4bv>wb@Qd@fu_Nn*oWGN0$;n &I{@IDATgwprH̎Enl3!ONZE\R(>y-=@O!jqnߒ/ ȑ&ka+co\29TԼ kY?:q 6ٚ_¤^d*=ӡ\.S[6xs2/>!::U`Ϧ&wd P G I 6Bq 6/ @P,TmgyoٱL~z͙ACN;IGoAkdS:|O] ;՟ne]d|-])n y)k-Vf]"eU_9qyäV~P>t0dL>6>SsoPG:ԓv`*с-':iF@9ec_mSQy>Ao DBi(^]wјYBa娜fQrcwm3xji^&<vЧL!;e.**92eM$7G+%kDOfR[U9 iwҜ~)Kgp_'g h N Vy2,׿{|]+5m̏M}qD:-.կR(`4UR}Ner"XdqI%?# }؇_ܕ>"yb<K0“Xi[r>9b vb۝4Z`)r d:!Il/32!]dW* 8~墎6NY8Q/2oܾ,ŵ;)k?9J̣ r}.yc`n$zU(S]XB~"m9m I>_`;:DW ,99cU4t/_C`}" ƺ:v)>PpõdӒ:aiov#yۏvM9,Qk0]a^}ednd:|KzR.?=.xYZeSXBkwsV;Bx~%,k %j$s1ݝ{oOu]3RpcA_~ SbL,x0dlaųgp,Oy/Gxi\sIw޸Ԯ,brs‹R*UˋSe*d'B<(ٸ Ǽ1bI{L.EV;J< qb[T4vBK_hZ9Hv/liGB4If/+//DE!`<'pj*ȇN|()AR!:Oe y dG<-3F0 )q:W20cn${,ӡHC.+uШeE7G3BKۺ0$ GFI otbuz|Z~h G~+S?ߞy{cōߝ~;?Nf鍋N;~3đ+b& ++ɸ3&Q;Qp<`4Q…(lV ҋ{ĩZ;jȺWuP}IJ(>e-}IahUo3÷YijX LJLwcH}1P76GsnHL['퍧of[{r2B3YKHGyM~̔.깓lub씮t(oŽ̸oN۰83  WaGd A Ăߎ4 D\V ,2QўNZq#s-n+΁qlKn0zfڻy+CP8u/vPq'3W֥{I^;ҎRA菗M:)c9De<k|VԷڙHܖ:D@'kί͵*#VR9vSܕwuotv]|#{9Ge&_uI4}Hײ]&Ja}6 ѲN,ï,'(+[+Yj p1zV|.)ʾ}Fe".ТHZޤGa͏ߗB(O%T׀?/}<""eh$QҦq)G0ڗ<3nƔ.rQc-j`2 "P0Ӡ?f"1Elą/UI" %)MY&0O>lwe]]"&%=+=p2AZD>2!{jEf HZ~/rksˢ`N>mcB ]Ĩ`nkpe> B[9޷ÿ=0˅j[!( aR=?h]jwJ`Tڬ7t_ҁ<;M>s,zC:pķ8Іyj;a⊡+'i7;Bǎ8mEr̽O|a_9P5rkTs|p!ŜVLkRxiE) 9 ǧy " \/:e4:+#e]gմm/cߴrLo|{H)0P\{&\g3wi^ /\A0FWQk7wi#{]kn:]|>gh !]оWcz~"#"r2mF-4Ȃ%1c< d!,FLc6+,qwsT. Y]9j6 t(Js|# EG8gpps??ӏ@N 4WRrϣc !6.x;uK@ 6~b{'j~2(?9V%:ѶiMfE2϶6nKRs{47fuUwb?uޕ?*J2ˮ8 d?y& :xj q-x^55XKg@|GW6&./oH?/` c;IHxx>g xO|ǹb1>u&-TuQ1;SbsT'n%H9q\y2f#_ߣ'} dCϠ_FlDŽS |S_)[qX(Am7kdRGD eҹ:~:tׅ-.ⰽR0dRMëL%o 4),P`gRLphFpN :|m>>B79ӟ7Oߚw`ϧ9wGg?Q=&"B)Ңk΂  LR|h앙0đul;ڲ̀YQ{ޠIi|VCOw%8rd* 45eD;/Gr߉g3EgBBm2s ,'oG9Ek?DBږ> )^yIĖ=f?Gs(x*#~2',8 ΂I?R//@:WMS@ˆ/R(5َ=q “Sj]Y7F~EN9?k&G}nUڜsAIL4RU،~NϵNVf5[~1 ٖ}0Ck q91L~14ٍZ2 їt^[4-X/'IaLSҦ oT?26qeC3fՓfkShUJ(Q&XG(y͟FYއFxA@'t+Đ* !֕:T$_`P@řW ȇE]1qx[t(YFB-[e=WhILn9+bi?]OYp#BQ . ^ Y̖ 9؎64(٩CыՏ jUZN]yq;X7 vY|6xm@O>ηSbOQy{",!a720 k+j[;eЯ\@ l~ov9 )YSr3=yϵ`G Ӥ7/v13-uMl[ ÎxQFiCtPUtٛZxrH,\5jD;S/џ IQõď# NفHF>Y2?yQzBg'Oie]+ݬg~2PLզԺC3 G;OyM,=v1 s0z?#cjgϨm\ |>^Q|.@BJKZGI)Zn1Ґϸx\F#0fV6T|"mz'}e}+p/.MNeXK`-XK`-φ:Iwc{,xwg{>,Nb1\E9ټ]v/agH[_c.f `//[_n_][k﹟e- cw_aܻ8BPt ?z:8l dݵbm8|NiE=;FಞN"=PXx: 6بG@dǤ|&(M1o <ϸqHY!+0ty+^ɀGa-A & d?+{m`1oƲIM p&: ,8&;e{k\m\?*\ճ_ߚ~ywק/7.,|qr,ԠA0Wg pb_@&ێwrWsƕ{Nll e&x ϬKN?ңb@63Rd; J9# ʉ.Ǹ ҇'=g%[BmnK]ϟ4"&|*~&w=isgNܔCvPg$KW*-HQTT ԟ8~ -RV;(Ntڋ7D7MpD޾پ" 'pԋ:rxE]-;=:Q!ϑX !1Vc]9(O:2̬NCsa,<1/]':McD&z0/N_ W˛2'_[G" )mRAzpgMc ԉ_e*<;EqBTv&įrL +#XXĘܳv:x .u<%'s5&JgX]J|sk"y4 6>ǁh&Ӣ[A)-m-Exu&2X2M Ҕ&Qԣ+{ĩ|B?|KXmش[zі:.>H0_ҧ}d|Yx4Ôչg2OV[?equ}S) 9OA&'k8CF89vM|?3g!?}аmvoV U6D4/;$ @a9Xȧ ' ~t~@;죯cNKp\{/rA>|3:~SKyYLg#S|\uQMB~hicС0%?)MZoCGA:\dAX޺..Rj9ތ¯ߩ@JYSFOJgJ I~ hG[eVv^YȖuM:oF|cED<d)~ 0BƇnbs1 _](A)E. bo` 3Hg/uݹEscMuNW!4Zw^#7w}vQ=g|:ڀ":5]=N~'&l4NXdߧ;m!ؾ}Ǒ!p |6q/ԓ "w,Fh_3H;D9bQrsz,ϮE D>Co3_+ "j=a%5/h4F!N5A_'z2}~gzO {s*;:[ݼpO)/mGۋQh/8OҹNTٶ"n1ܶ13Zל]SnLֱ-?8uSFzUi mݬ&%MeQ7-F]ȋS/`[%Zk <s}}j[XK`-cfs=ޘ>$qƋ≑#p|D*fy9dlc[Hqˆi{y&Έc|d:1Geʶv C:O]J7%Sy˳9pv.HtǍ׈8Ϯ/3|"vXa|`gNb6oF>-lc'dOu#[>_;=EM<4m3=|A5Q'?cq2J[q-=ͺ#eZײӮe7A8[vћ e:M6`iNnGpUљVx:1ިrl9:! + ؉Mֹ *%XG=z:3f7XO) kq9?V:fr9{vMI%Jcr2[P6此C z7b]>3䙲tX}Sgn}w((kl{ `?=GӿuO=흰d)~d ;y$/b4YN俶Y_]Yo.@LJtT_~l.,,(GS[P]T4}ۨUU6oj B"Os7E0ᯆ6㋌G%Hng[{|{&ld2|SVkWS;R6r-PP@)^ip:pӯ`aN#w{4O-y.^ىK :r΂:uA/$O+7eNleN +r N}3}fMA}Mޓ);yH.M1:Agښp]FO䥏"ٿDy"pM_NN2eУH@]'# 6ȷҝ^E^]ڃ<+y}D7f 7!aG]2l/މW%eL::v/;DD;U?c+}؇+y[E칫KN:3AڂP?w{Iqq2#+ 1(PyN-"3dL)" CAh_8 0x3ޒJׅr%z~!;-VM]{U.OL2BV-/2%qt")wإ]6q܋{M^@6NP#;oԏڏPWkp& ~bϱ 8}BȜrp?!cLf0LdЍ;hkuч_@oGH|KmEx^%w|G:3΋[}^eD.o|C3+ア;O8闶=ӧa7YhAfF6bdlf|hC4Eq?{͹&q',+}.wr7c` GLdɵ<Ֆ,%rRG^Os=:MX;pgy:VOO;_AM_̳~s$dI&)ڜp3yc2}a{m.6 ln#Wu9Oxmf"~0ʠ {*R?a 7à?jw鲾8r'{ŭU=ϰi77'հAq˅>g2c|mG^*# C6n(L(g16}<)kSzZ:̘S\ |H`д5[^;<SKOvY9oyoJ%h ufl 9%ASa viOmwGRRwwGv|gzYGRM< ]K"_&n~nW^>l,}D*xO&iiKZG,?X,F>/tVf_e,#\:E'}4/U \ς< G9o~aɯGD0k q.D>_g, ;s 50');8cL; 73x2V(A ^oXa:+`o[Bokwޜ ts4uլ'.r8_>x``.5>wx`edQqZ' n!7hZ3oNq`]QI4(8ahE8π23("7Jp4]L]<P;OoOc_7׿;_>&S>VЈ4667lo@U箄C8ba3%QzS/AVӾsJFEN~&6;@plվb!rQ >f10y$s`NAw^ MEz.6A+R&Н3yR%t! Cm+TDs²jk@[܀pcRّL;81{B  :l/1X_mLf~͊nZBٌḽr3@,lgtI ,~`@xBUz6tMXh0K*m^&؀z-ym<ɯ>+711oun|u-COIeb0#eL2I4<V5ת&!e ?q(ۄ噌BQd BBInSX3[kt9JCGSl5/%YWD8hm%M§>O~,V@48`q3}sWYJs~Ƶ}1|)|k7c߆)}6PSGym}c8u7肌ѮW&Fo,fM(BN?`K?@pޯbUm_ -7y-m3^EӅfZ'H1`,2*9Iq<cwKzvJþzAA=g;N|x|ƒws޶ ˟E l'֘jopkS.@_R9c4~p v No`_z-a굒\+/8BR.ZYE! gDGp߫SmAΑY,`p)#40]:j+2҇moFs֨~EQdc93S 6)LtP_^>ݱŖ2Y@^fq p2)G1O(~wm<V?LPZ .N3vp1jɻ yd|Hg*,ӦjtX|[;~ Bl'!|NiolKw4&|2^7KS)'fW`CH(Jjg*%nk'j<[Z qȢϸMX\@GJ`,ۺc^L,&N<Й}닷 +lBӉXC޾.Kz z@/8ZFiOMCamr !.(dLK 5â+"hh$[rIy-:%;-'_Q ᢎfЛɏr 76P qWg/L_~s`ýuO%MO]VELCoNG:w$Krx.[z]Yy -hHo8Q ൾNof'"C,E śc82 >o~cOjl-\;M 9"N  Ʌd& CPL4-laPG;@c(u_\Avp@Nlt +aOgؔ`~:Yx/o࡝2o)T].RPSԁ~QHo}5xj^{lC2SU`#L|XTRz<Ŷu&wrɯYʰs1l(%5aۖ4} {ڃԥ+LRE.s We};/Lxf3.dGD^irr;HM@+@>(}gA g/)ʧv m '7(lj9h|vvz,~5bݖOe% Gmjy9 h7*ZR86 }qζ\(Vn} y 8/WiPyE'y\qnlO*;/tzJyxH}yҦ#D@O𧓳矴\SJ$ҘpzhgMY>h`PFtL!f;R7b|LW:RP~'M@IOF )2 - ;WN\8u uBn[tH%qI}iQ?>0e5a+Rw p4*VJ.rBk]4'S<8[&=HGJmv*2m\ t!:''sq|+0~Xz+Y?Y-:sfۡO i?>g9#;d EXϱ Ŭ|MIǗ sZ]Յ+Tw}{Xn{̞`ꩋ(39>إة}c$>ϙ5yG]B!)C |d.3ݙOO_r]Д *(?H#>+ `2BpqX'ҩQ9ρVJuHV1;vaACw9ⓎGѷ.?|8_>~9eG(ᢉ{5]rkn&2BSM2i9Dk6GS8Z捒v˳ر&m p[k7ruy>j`n?hKK՞>79)qY95v'7޸|,G_Z¼d5W(B+mCasJw.+/uDI>çh%Ӓe&:pzFZHPwl}pJ/e:-D7Ibހ=l v7 LAxzǷ 8Vy|k䄥+\IPN'LWV1H?V/1-F] rۀ}#-PCN'y -xix<#PGYOɛ 9NX0C7TgO3)μ9M1Nɻo8魳wىuo5s21p3l\`'PމOdޠIvA/Bq!C;ِ R9^N@2cP?kjCb%JI~BR'HŀIK!GH͵Vl-朶L;I@)1xȴ8_fKB}ӟ/7'_= <&2h.k<(is6З 6(C(k;s8(1:b 2 Q'dmuf4<Z`JŖA,Gy74 WP?m H qb%v~b@_ I{.|Gɣ|SHKgx(\SuTWaWg?oHi+|N8fOʢbg` 4;ķH '5ű9x19\˗d/uC{gXGVtEarwaOc? e{dExHY>$##@kV>hOD {Lm*qS(yp1uy{fɊE@IDAT|0Rv|rp<9,aqǪ=_I],+MǢyvy>^v©.FD>.؉z`Cq) qe p]sϮ6') ?TeAJm\Ofjo(<+,ѷxcU>ܟwOz0ϛoskܟ~TyOrSt;WI*yRdhukjk!da>z*=%`q8p2=B1شTZ % DS/WM}EPz{}{mw*znqy7uZk %p:RKX6%*%^*O9ONjWoy\Ny@c-?x80@=<;mrXly7ްdzo}`wub:8xB}f(/h3acf~we"'漷||8=b>\O|(3sϣ;/s|&C^1@sv99#T9(b`'Cll|8q> \kH *M#786ys>縬sF}~$@03=r' +x@ nMmN vLq %MH&12Pp Ӂ< 6OPo tJ4loUZXS _6:/irQ Kx{7Nv ?/<6eVN33s/&O TKPIj#GF3\l FEN%y;vY4 ~zv 󃷣iM[rcMۿ7 N!r8O` < ]j&CqxdЭ2̳3p`]f ]@2 N\IZY;uw?&hox#8OQ9>QKkS`ź`&4amp!_:i}eIQhvo* i鄙nN,E 3himK?h6h, ?It L˟,8#ߺiZNL)+UT8:Eh }T vP1zNaFUoONz"j~?cN3 E8a[S|w BXgb/ >aq앆'9O`fd'Sq_tDfTwn,m> H[G U[(s )4@UM#)iBV9w 1}}isTصdGY>KbCLغ;)`'s?"w6WxD.=@W_[^f{P1?)Gy i׿|NlJ"rQ՝<ީ7>F `q;, G|sNjNs|/YiFJ[_ ijIgxW {EQ(x* }Q^ԍ-GJͅl;[f;R_A,~E >8n-@{;~N{&Xm.`@ ";oEY%-ɲedI4iq@$v]{?u{z`[U'ϞYY'|ķkPc{i,c2SYߖ?M htq3C A8yXͣ VJ N g^:P4e.2q[WGڱDy`AǒW4^\f?.\}vjhLN*(jv*r]F!tLFr{lIX.!};n8q8no)j8vK(o[%f88A7oWOv /ux7>{ŏwqVKB/|ݎ[G9eDHg˦3nS+ƠvՄV*M>qc0_(;ڜTDx~Fxt*KM~~ lÏ?aͣ!΍:8-%`ɧ .ԇeʝӆW..CJ(c݀䩒<դec-yɡ g{boUg1įR˜hMf P4 E``N$:ū㠔%üzʎN>8prCO4u,QxٞXƙ+Dp@K`<%{E;"Z<X5}Dꆶ2H_x8m@GX" ]Յ>WG wM<+R}]A>mOuG/?Z%B&?׺>fi׻[6)m̴Sd[-e"C\o_0~_.L]'.N0_(~D/ѱ8I .mҙ2- v&' $+~'K=fLoNCB2E_5jƦ^y鯠ric%7?^nɪs4}>,M]e&X(|/edpt| 8s)H@/ pŌ>{R Gl=i'ۋ>S> ɇ*>^ -sc|tX"yO@ؑ tc|I@ô]tMiw}Č+.Ҵ=__(OO;9݂Dۅ^'-uzкb,]8Ա֕|_*9wgG`0b(ߤ;\=#':_lꋼGkNsW?3ʳxWOI?n3$ B$E>HB^&@ڡPjܢ`Eֶ3.Ql >;8 >|H6Ldo|ҿxo_ ?WWt1|9~q Q8Vl>%H 2Hȿ&g⎞^mwNq} 6{wM;4Wn*_fIaWZdXc nmn^B&A ?~;Sz/dOI'ݏ|SQF*`I=qכ0tJ3w6+pl)ښ544.nVshRM1@ƛ#v'#~h&q#N; 4H4/g}9D`ϳLaxp;Cgا#b*Pl5Iߝ쓦0vGN£'\şMQ+<Oʩ& x6 mio2T<*kkN= SaZI }Z~Omn'f]Wo` 6 sb4Y_+ou_9냏S~~ziԆ~&oC.91dy5KQh^U}I%1ogS&z+3Bv`=³:ixՏm'~ﭗJo[ML;دt"3Ic_fDr0Zy]x*дHV_Oڗ5ɥ K:djlLN<;ul+"oJH^~S8{._yY[~8"g85Gxb(WY>j~55QbN*S~{Y)?vl W/d2bډQJ;0uFrVDLz!?6މ#}J_E.M(_JY_Qh|՟Fm]o@;mH>irvʢXgGt@|TWGtݴ<9fgF<T7|b]Ÿ|u_EՂo '\Lg<ӼW^yWYzot).b7¶ HjzpAm6_[ RQPfg wWi6}!cאʱ{>nm8-*3\,~qO}zQLįumrqbfui[];~FǷa+h]*e4@8IѸѹMeOjɠ!'«{w[7Q+ [d*GetM(?0 y G<'ڣDFr-OM+Xbx`Mixc2ỿ?=.#|$t{*&G]x_ATUrEQ?_{50&=^{w|{bc ]!/H&7ӶM} l0k (|lƿ3DRR 86uh |Xzд9Xvꨵjv_s$S'.X /s8#a#&cv,pq ]߀d-fĕ/iWwq~ {]|G3pjdNO5}Oep|FţG', v@\×TB/H,e<& >Gņy$`\!^E~cH=I_94z"^Jž_Қxԉ"SqK `xB0Σ%\|lNQ9ߎN!/ENC]F7D L\xdg$/kb4 yVsB%A]1`C4TZQաfzeI S*nDޞk:E%v!VY~=XE3~I~.:q@%Β@zFb}8EB' +k`%^Wϰ&/ qK|b7 d_Wg`dt Jʿ BBjD3cc' H qFOzqRn 4/ I \o}CN;c'3B[<\u 7GJLN! Pħ:=Lx[K % _HUl?SmX@6&+'o֨D;# Y}')vXhCJq o~Edmh!>UM_AvqS}9ȬY0Щ> SgV)x6$#ȃoĥ(T)\Pv&DRYWZV|h/m.".U2 RgOpL#Z @CW-qwB5Ӫ`v/}֝tr8ӧ# ز6rGRyh96T j1?؅guP&B|3f-AN6?tq0=x/Qr1`ۇ8qA [{zbdh]HLщ4h}^ ~?*~OmMcK[v`O>pf=V6'_W ^"D`C`zqOO7-c q v__ͮj_$)З9R{r/mV`!.1;Q.Շys wf[r?3fzznW,uD7o‡!>|'e2$ƪy-S x>y [umWR1ݍKqݝn*_ .C}(l;ֽ.>1+Oޜ7&:Ot7-­rcs oQ=+&kc\cӞ'M6}yVL*jX61mo޶5G{FZrv\`p3N;[;i`vx5q{e2O؀y☰. +?rOĂ}مsc,36 YU/ A_9opwͮ Ч>_ ^3}>בj>MsxG^qTScI,X ~'X'+"s 2 wbv;s\8%%N#2eWC@p|Hʗm 5c>c{fܲ]z@ 4Ł}=¾9g1kDFbo+;]t iU6R 8o`)9# PzP1uL5n\=Lq(& KKt W v?X1Y[+EbA`$9/̥P1dֹC#ث^]|V ÃTйpߖsaRd{|  .8A ʭcf۞o r'ؐ"ҦCvN;]߂;_$lv4 tt}KS?׮>|V1mzN5+gTCܱN'/ɖLLG1C~Dyt*8% l9/1#hxr '7PikRLZN<7 ^k]0|2aE-[YYDD&F%v#NXEw,)3Y}@7s'()G='Rbo0e"'{8i͸ߨW!^ [%եD[YE7\[/7&Ks)orl=!O-Ok(SƭZbȷL X"87EO.J\LDs ;Մ*ROdOJ6jbGɗ/PD։g(?vt}C:9"A@C&pL ʠTG'Ů9q co%1T/pfqȥkA7,,#/NLBȤ~# u"Z?s}#_䤵v|BSߪ xh&wmnSG]dȽ )em1 cM$%NG흳+wE`,U~+VasMFp_,FzUҫ6Q V;0W^,vG@ =mɨl;)۽GNȂ&+<`}\42XĂ&轩>ˡ=$/ggP_-s'ezJS3ZW~ȩ 5N*joʟx8N) )_Pe〆V{S|(SEsup"]eʇx|T p*uZ=o _}F?:mLfx^3iT=:sBoIȧfʎ)ŧշ3!vUf7W(9Vv}87X$`S viWxHWtc(. r^]񠪮KPNp;U'!cvqSަpҠ;en1\#^{tB_$z-olLKcq){󐱪`f*EU郹|Cc{}Lzz6vr~ r =\~۟}6[q}eL )̎;|tnO{L3^oSQn\Z(Kg `ޅ|#D[~ZDŽ&a.>s}<۠z'#]Z {~P;{;ߙ|8|h8K"^Ls>v?H;tѓ ּG% \X9 Cb'EK*)ʚhtUW=s][|~NX'ׯWL g]n|>z`iyv[yOysiU@*K/-Y.S1}_}tͭVQV*6@ğ}C?nSϊO `XUجU)pZ{n fYxY/Ҹ핼ES|u-s^{pVF?Pk^b=$+.*+eZz]ˤ4_o؃J5YGN{i]nҶxYǕ2Ŋ 2:G7iۣTNAa+l@7yfF=\_]lg, ht"k{{ͶϛO:< 7Zg`Ǻ2QooQ'Co }t>[cIѵ2"Qi荼R_ǃи`!l:- #v6/m>-oLf| qH:?+XtQf)1=H 0p8 t?tޝdl%>ǗK~|xw|rxÜK1Ƌ|! Z5!Ո+:sY(qil95.ܝ?s:8;}yvpb+К8o&|2v.!yyqĒ.Acqya‚$5%rq/syoN ^"={vw.qXw0"c1DkK_ tǢ7>vTAOTg>:{Z;MK" #8i4 zs6N_vpu1D[y `u RsAg5Ra?. =($.|($p.bIpҊ=t0vtn哇 F*%+86`fvQ.A˕oϛ!"ofg  G4v&L|4Yns" w@d u3k`욕EL9?A l\j;<nV/W ;tFxJ pK:9{~݃>;n>W^3K/4KIE-/UA[p}\`cyFIYDwԌ+z!7-7Xod*r!i='Lʺ[LdF&pqn"N,g*ғdc9$] _d(]#kS'i?NrZ %ڦs[zR!Y laI/qwOT9 -dQˋpo^yLic(KUGWҏ&d*}sT8WyP9Q- Qtl/Sg~IfG<5d -ҷc_yJeHHyOȝ?O~O /s.& W) YQxN|||M.00)& <)m$d|F=Rxuf61edGz~A~1XS^-:'G‹uY &ڄsjͤOH;U妨v~}kVo@'yrQ[]>?LP͋xjrѣ&m9"{WvXЉN>? &/MNO־ݞR[oICUge9}rfGȋ;a?+>q9rBx]$LyٹLYx#'RB93)w-~I+GWz CE,X>`lJ?+Yx->V"^;;tt5'tի\H=&im$~k!_?䔤%_t8J~_ /G˾ 9%!<ӵK(:|Eɨ{}N8S1Dg̽puBlʗ?L_cDtN,sL\:s-yς2"erJ7퐱zU'L,TyPmK^oM3*l;SST;ZґETI^IڷA+kllDm8^}z@37 \6y.Y4Øjߧ&7 )哿~?޺{S%Q0Jk2mPʟm8*KiwS۩~O:F >"|iI\ËWצF;H{W+໮V0?l^y%a\?1|4^̓L0J5q k=l@6'(]c gY#3ݷ"݈F}y$#!CXk~avi`N>W'yOMNy;> b[(lEOnQI>*[nLS/f OQ/y]+ha+@EiRW,2| Hp&π'l]fnq $dB8XFc~/oTZ^Ar^o ٓ4ɤ\N=)Ge ˎ6Vϣ\z~bą'`+OqwpHsyۓżމ_QNKa8tjO8nDc 5g[O oM>=|?7?r]~cxvOJ;bv7P$/,}APnEZT1XVD&,3 ہv @ 6\},o"uRVTb?/J@W'ۃyykK 3}Ѝl \nHBœ0*8 Ϥ&7We3!zբ ;N4,(3[._ qx 8OLr2Zx˱ [#!?'[IM>:%x#xwjW{2h+K^._d,ϖ6sh×"_w%;f _Iygev۰pkTWxRE6Qga=0rdRkZ9d6X^3ʳOҌڮ|}4W(i^dq.W>9R|WZ>ӗ%_ź뼘"UE}Hh%Ze_9jퟟ#s-v$ǙtkP{2ͅtڼ{?-]*+0Ш4vKN'VkxщO/TY$ˆUmVD~|\]Oד^{';9'>ifc>A/({HeY`ֲ*~̎$ z~GUy+{aE~|g[\9{%] u-ЍP\; Z4TofW dvOL`S1FX'':Ն&fWIC=eSpi﨟?c2򿲓@å赳bHƒ<02sF}ANǖ*m!1W 6V"9|Kpڰу)J1c- <$'^ڐ7xq7`?ۨѾ M8} @#eApS>E #^z vIue,ΐ:> >5gw$^*ut rz ^;A~Z񅏘dz"x4Oɱ6_u6Nڪ;==lVQ^w:1m_zVd_]~'x{4hjjT+}Shf7Q*wz-!5Ӭ St3X_QW#u=Ϙu= DIE"zlo֗>Y*>#zH\v(wi`vi`>hኊ eNpgË? oB,Ȯ >-\J85xxw8/eX_P7C1_ z@IDATh{3q. c.;;[Y>O#w" ;{1/~jSwEYrx?Kx;1U/C n=f\>ިy ϒxKNX OιDɌ5 |EBP/3 2AI|rzllW%>)h.l0}bR4=2h@v3^6'  :eME4La7^g2Wi]DS}Ti3%WkvÛ bQZ %@dP8jaRiE~`-Y]db gX`P3y llAHSg&2oGg`:V!.@Û;^ y^ȳx3:wq!=[-Z"%\c|v.`_ zgg[e{d/>5K hLy,V? 0[nc S(=7ok'!Oɔ5NX-A?t neD~ڄV'[}".caCuY>p9iyfs8QwKЋ_/z^À]j&q'n}'0mҹ òGbG1(GhOZvVon=֩IEy_3LN'龟($:&MUyo ĭ׋hkɣx-JW&7n4dR,KP(aS_>_鄲Q^xlv8 G>bFdzLi;'8?y<MLS9q,n +>ც ?r|uz,zx~Mz: >q oqمG9޹KC<֏[ܕ6;b;_Jڞڇ n}rNCYD.uK lGZx.lSP nep NS 6zbS(5_.ND`ґnɲ.oD'n\λ^;&M^M'ӎsuqU}IbN̎|uwFN7j7c &sJOboeKWN _b>(Q7;C۾'(r1 FJ]UpImwR>DȌ~c R][A~a~nT}:#JiV=|qƟmLGF%Sm)kD'+sm(Y!զ),%>r@px-.'9f{G(+eo6$رhz҉|)tڏXåڂa5z?Gf? FR8%}:UjrCge4Ox&m O"^ _NhyM=ʫ*x8Aw\,8l%Y  ڡ.ڵN{MsAgB({N*:qW+#F!z-Ǟ3..)N'XW~a>ǮTmD+{kLkgkF)b iՂNiݖgǺ^hEllu?0c ǟ禘t,mEyd5" f+Q;wi`@_oZkQt} ?H $瀒Aw=Ҭl7a>a<³KbBs>Rqy~z |vEى#hdMxJ|~=U.)/s>0yjs {ǟW9Te2 l@4"ya6A gw2_d29eXllI^'6zˀL4' ;<{%&u*x*BcTFtHn!$;-*NEB q'&]Pы5:< ;.7X1g/hrX %C%ip"H=; ojٖ]&_=⥋Թ.MvOh;wPi&oPJ>۾4WplC2< *hb*.BPH|\Fx$Όn,ϛt O/O;;\W*qxST7N:M: =&ΫE>lAW[-m'W9Pj&԰7(xUQԿ #Iݓ\tS X9;"'jBpp&wOQoEb?ԞfhcX6e*7%ּȇ~➪]-9P,gwKt:$ϦHxֶ &6C7ꈜ #a/S7fxoO_Iǁ_My6v'wE & ;{}&?MQS$QƲ,e gg|6y?B)/]U}pP&LwMǠү5)@}?@ڗ6=&)+ a=N9[| y} N[C jq>ҟmJ_NSYj*2Ct2slqⓒO &_=]Z,*;2q&e A:–/&rS'JO[񘎕,vEaWUdqs̀!U{t[b*ECCگe[^;։q'Gq|xi/@oW}FkJ_DcFk+g#!nMPqzCl΀2zN -|kDC| |`:;wVX,w@Kf';aPoބ 80jDOYa>蟲ަ/X=ǖ|F@9AGO| g|8l5K5ԭQrW8zCm^&)=9dByG#@_etΔV<8MUBǬ+\ r iX{]*jkXCȊ5 i\&-Nw|K[e_UƜ *ȚdSZd[{C]2kX)si57}D.Z2GPz%'9 ,sm3Џϴp{^冝9pk:O|ЏvytЉ3? m>d+?l_LqWxlpd6#H܂sI?<.Nrcdƛ6juÊcer92Aa^^Wl+կEv\Geȟưz>ky4Bn <ĵ / Ň]fxCΈy_chݦ/_oK۠nµY&m4vy7k`aZ /͞7> Ϯ|4Q? UF3N٨ӽswמ8}I8k⣎McT>gd95#x/$ cn_2ϗ9 v|g a,J8}>od<':GUBӉyc :~rK1050Nx&+bKv7>k E)颍0/yȿ ~ئ8^yDWWIãZ|-\X\VDoizPZld>*Ki tu\AoӠlPiYadF h g% چ6xt k H_Rn.NX=)^]vHgc 3sWY|FRcUnWMps"$W[U8uCwqʔW c8x]O^ l/?\[.|2Ĵ}2iSay6݆gi4a]{l$)2+xNr=T _1HL-yWգ:]nO1õxA҉T_aXZ+-4&WB ra*ʿHmVY ̠'(G0h^׃5ILq )Ū܂0S e1+pqmJR_)K£t/mxjTԕ7S_TVGj]ie%U+JJº@Jܒ*Pz?aȆNfId>|gn<'SR'%N=oC('7m !\/6Fl)>}KQ+8uҐ$0|?Lt[N:kߘg'h˿zr)ǒk9~EY-/dAc`GuODKa{HW_ȃZT*"ߑocXz{2!Ngg{Ř2Jҗ2nF/ud>ZB"}y>CC"v̆Z@|=NP!-0VZW%Zۆ~gҲ0hmOQD'L*Vڪ}sZ=3Oe/VXA6m64snYy[mltV,w?$-4v_Ц͋y{`mƦ)ߔ8d\nS9gVe1`c,zڂ4USƸ|l~E`N}υ6.0}s)g׷mrI]96+0F 2B,,vn|&db{Gc˃<|o]?7|x>cp iw/"$_8kMqlu>UV͋h$+= ^W %Vn9.x81R Bl'qh%bHO~-]!z@S[_t6&؇-kڠXCtlJa-((L#㔑؅iMck_5lo\P+\-4v)_Q-U=ϣ7|O gr=F0.6׏~JUA4N; 4ND}b+g+.C@mLk;e)<|G <;gWcX! -EqwL<Ď*0#^;}+G37 A|x8;;}ʗV"IF}%Ҷ&CXbqOU9'Ƌ)+̷s9Uec X8![ ҷUwܨ`3w53/< i09y~Rn|Ď !ή[܃)toѹ @'\0@cy6bG44^zjY`r"v2b,c2Vu ʃ"*^w ȴL:.\%18?KS :ҳdGD&,pv(g_ { Y͓%\]+,<lu|:cEKK Nm&tK֓C- 7V\Kv~tz'99\qU{z*o>e+c->;7g2YVñhE)>}Ïwhݽ ?;9xW oMh!4Xf݆ݠFS-58dܼsrv򂮅(M3MJMxb-U3ij8EGoT Ko.fEq#p `'2c.(^@1~a.:uL-ٹ4_V~rB'/i@ŴFL*r%5J)9r*/mBF@1rYQ@[\\Z ХY`F/ Z_m& *I۔K(A./pEM#ؾ΄ya|`oDB|14]-.jF0ydT:6qnbԂL÷S0 #U 6zEFhOtsi. ^չSU罸Nʳx 3&ϖw\k}(}A5i̪O=[}qߒ=]UW`{-ړ@M\U^P1c>pn˃|IƋm(g9ppMvx`wN; 4N; |L4`x Or?_}0|rxO>[AVb" 8 KlyE g5VDŸ%x˨q)> b|l'QXAXvE#?a 0BsI >ĝOA|1dN89I:u<%<$ޛy9+[bAww ?$Œ)!sP) zC/9e1 /i]>^[n.= HGg.A_6zi^#١kt. IhP,) g |K'8l3g  XIQ*"Q&ʫ`f2!<~E1} g@ h @W]-+ϡӈ&?\a tP킡h=' ZI萡kU`wk#hN$@be#"|D S5QRkLd4A8Bcq"ﺻ)m~LoC]S"Cv00>=B3Apޏ}$k|0'~_4|m6|j Myo މ슱W.@n'cզڨ!'WzCY `MHBԓ%F"Ξ7@&)Fi YǠB˴‚2O87'[&ɅsRLa\A޼Kp\dJiX ˗a__] H.wUǶl=I"DaI? 09 R!x݉ z"?%!Ӯr-KKD.PN$j2WS^[< 0HEWi ߝwH0Ƀh>i4(Iٗ@%]^I+I=J}D\S]s&9۽i)s'оWO%sopbzb _o[~C Y2QZ|yx^_|@O>m,\!JO=^rL럶qm >H,RSp283S"T*-[ƕ9ac\@Ycm-؄sr>۫hޗr!-xi"̂A~ B[}R<|c]i2O#*?ibWY)QYd,<Suَ#˯sBɜ| P(o}8 TB >3(GĜYD'GH<'iS:8~~3IKTuބ#RSb؂.:m& b \>ՑO9[dO9*:F~UBOF§vW3 Z98aXl.dnƜȣ$Է <|g|8~bU<,~c^j;Aqw 4%YܱA:cR S/ HyRgrj ۂ ȸ89^gҫvה$ #B*rSZxdA):=. {Y|"o6/Oq[&ڍ|(,)}#_],ܱP?r2}|8?yuxO[p4< /*VJ",2V^t.+_+2SL\gy D& v\SG_lѣD4^$ժ)"DrU5Q5Ʃ0a֥+wͼ}X26`8m?O0䓕XYʓZP; [|<:&)u5ϒ1)*0coDOV~Z}0Y㻮{n40˸taǰ=íz:gލ+xDhV$:\e boZM+=y7n <J7ᡐ}lvN1N'@]nczCZ׼t"{8:A>W=u^|coxO&2_^YDs4L[`9EŒFN a,8ۄvǀTNLdmERn=<\k87__:0g xECc""9DcuOY!e *w Diѧ#@x%ґcK5 ZCXoW¿h ͙䢓:`};R` r̷b]VQF=]ڶ|{kc2M ȧrQ=v+5FB.{@0W7E8x$ M;C=q5=6ɯ:Xҳ/5_F'qߢoQ} -~%>o˒ }lÆGaAo‘P۱Z@BO%_bq!򻊽ZL"w7i18s}HqOJg%ԙKz16yA0ʪ$Zu_b'Lݏ6M:m *VD&MbLb7-0O(8TLsnkُ4:e{Fa %I@a*Č8V 6;G;Qtkϧ6XzOX]ԛz!?OKej=Y/Q-q / pMy '>V*׽:t ^azn$H,8xIE0Gwgr[‰;{vwB_@h[DI!pB޲+sp9*,F7g T?>7[𶆫[ŧkm]ĊHܪ'PvAs}˟xtzyg{EC>z`y)rjg85h#9 v\`/9ESy3^=w܀mp=Ο:;O2d[ iL uHR$a3 Sn/r:>;qԐS;4P:ѝHHEZ4zfٔGUq]M.iWv\5=N뫜u=8&!U?20Opg d=mA}@!YzMZv o+jÄRuVE@WωĆ(#7n})m:l@+o~V~O^\݊ 'n_YۂbWnbjU;iG`޳'t\i\O.}o+fyݬIk\>>߄]X{OG7 \{AKSl+3~uU䫋GuO{\f38T~g0!k\'b|e#:y wHlrkg b*;s/CAcƈK¹%wLw`O8h%`pB\,ۺrnD+P~+c'\&V_`Wx?eoCw]8>q_jGh20;SfA;cAL Ha1h!(raEpD|$q4Xo 7huаx3)Ypm5GxV`,Px;H_^FP  '/SV.t2˓!o!mx:Ϟ_~0?r2\EGrdA[-l ñ (r|To?r>',oaAIlyZ0_Xݶ=WYȌgƶ 3}!)"?UT2KX=B;l7ڇy_qBތ7"sQilrrm<bLKbTH;<$`H'A1JQ='juԎn)Awr?kC>U,~ޠ*lϹPV\d}KEMҘms/–q+qg:5٦lLW0F6jۗ Y wow[P.l|8F.hKO;f;q" |R۟i|i>~1g>;FhoH膽X(&2Ai뜘).S }K]DN;90HhkwOeBq?cOQ(‚ ;_gղVl^k%' D|D}Ћ>L.Y?ws|{%ʏ>S>4Iǰ}7Ai; [Fo<勳D.xL?Y ) kq RѹƲONx9=m8MG"mމ1Krđ8cqxe|\gR>̈C_n$s''Ğ1!^Hr|? -_d۝?|kƈ5t2dP䜦Yc-+@Ft۲):ݿOOTd#IPALCKPaDF /oFH N>tn G܈QDhf 4⽞;yy!H7XD4siu '1evXt+,A&wK?$[seG%\T`<2EsrL|w A& S~TTh9*™N"[+[BMh #ב'{褓yyY!+ P'/( Qubф<]s) e0e,`rFlN6p,b]IZ4 uY}SV}k-Izh?}u.;_]z/[ˣw zԋ]XqlHUzjD1M+V\f*X,o\I̜2Br1=YI#~Nq#r7!{A /s"J]MmH np+-OFqcEI( ;:qU  Q#ws-3tTG;SFEbԏ]a": īov@IDATTen$YLY/hyaR?֧+ 8Ď[ ^)#!Ф9E䐡G(Js[Q}S7roCqKL?zb+E&3 bܰemo}5e_ɯ·. -D:L I۩fPUcB85\XT]t fB?D+89VGN#Qhw$k*=a cPxdp8֍Ck2A[.~nF 'GmaXvXuq/m?5&>*;( ~dR焻7ӮUW +,rb/}<s6Gg_qz(t/oos߀cYǩ.<9m#G]֐O]4;Oٱ9=8֞oVtg 6/A t+  >Cʬ;/}h1(row<5W-ҿ<{b9I_3歎d#A1yiP<8D ~ͤICOϖeƷ,d[i*r(dGMPMz,\|U.>SOy8+S0ҀBMMq ^o`Y9s:68#Syr[խiCbmt%nLwZ=&Ћ'G9NOi\ pwY7o kuEkWq>E>[][`zY[ŇA,; v>y|p|gk,x52lE "v82Ld73S.p~"ceqf$n\fnI< `˜lnl ^ίSŞ;,9klZR/~ėqTae5fMܝeCZ kVeaӸ29lLaf+;L@/ F|[QhN#]ӱp,#4/#hNC]NJ}a ۱#K0H ]}{m3o>ʙ( \r++YD!9$M(vEf4ОOq`Ava$h+(q! hRwL M?Ro]1@|.S?Dm^휭Gp|zȿagOC7N>jd^vƧ3 zʯvNd{[x]ryx/򍣳nw>w/Z~yyv偓1֮>dqx99.6k=R[ጙ8^5^/Y/x7))m>C( -p ɓGTmR8Kch'+w Sg?Y?,5y%' W0Rf(O'[-"I&6 iӵT~#zjCȶ?UvyB>hN "Wi]u]ݥS>K]x4p'KҶM)ø&2ȭl}թ:RzK=UݼVl+iWm+|k#TB8L겅7/̬'$R50UBu :zI>7Nm vES&۽&uu8ρB?j'cfJ|v`먲Zoݡz/+Gu=36Ej觬y:%oL:'%h8͸|a޻`}A⦝vc'#5h;I6i䊣u<2Jϭ/mgPcS:+eOmBI,G ^+d2G~DyOY >+~F;03ٹ>BsL+ѯ]>3Gf? OEڎg?S/3*R"kz*Էc3,O'JcֹyB+O=}/[rhM>|ϋ=O<;5c]XA曤B%y%)5̒V-lOՖ_^5NhAmARYCZ7+KxzN*2H=s~@('P[Oq̲lz"r\C1?9' CCFX+YMyE z8gyzQw'Ƌg8N F*x~&ikϤ?_Fӝ~qlZL}6%I; |-b- lY~̘Lfw"2CtSEG̑k=`w <|+/r7|O(#\\/s ߥOj݂Oj7XdO%hC%(C<`r [,y9Xh?ItՆ9<`H΁Ј/>iNtи "wD  !a@2⺰AYX:G]GY!D`G %n 7y rԻ?aC7)١!"/ +L]Vqqy@o!;"=JB>s: ~<;Vv_y"3]M?z<9;[N9|Z;\7˗/Y~6~oa՛o\o_>e堜YU;po.j| 6 Ŀgv@|"j:ʩ;pSѿU4N xhDŽ}" Y`!F7C<"1G&''l+i(MUKl_#'NlN@4_9Rw߮F.:hU8"?u`E ca|ZF}άW۲pVOACPE5J}~-};Lt*}IYP)\ 9SN"eR Uy +@| G7pB2(O瀝RGIݝI[j;hg[1xrB'UC|rf=*eH\4'=nr_Ч')u+n=b%ַ_ ۋ~mr}!~z5x }r8 FM}plN :)16nQ2JX;XOm@٦aFO<]geBVLPgQ:/eZV4uLEfGߠik`ʼnȃSƶ[`PWe+9'͝kD⋐Q!U0C=_ }K[%[G4ӎ8AzT,|eG%?C"L֏~EMg=9SIKjrrLڱ3sE;eOdᔫ!K߶n{xUj|`otٮM&EP +r)glc;r9_j?Y_ro7Qh\~fVmۯ}5J_N% t<(S;,9Kݿ|n%r8sǮ+ږօP_P/X-đݠ^Ȇo?h_dac IʵcJԲ N[G"nP3b q czq9kAp(leh.4S<ھ ʄoڞPdrQ̄o?6)HDQ*Q֖f]|Ҟ(CKṕ^ğ=FQ 5I|ۡ2v2m.IYzc? 98T7m?mg'FJ~iVK(|b4M\J3 ߛֆȟ*Gyri)SuҶ>`ЫmRuIټȲ5~f%X`ܲ&x}?aQ36ֺŌwzUo#TeSWtֶ~9Ko?/}JHA[N[*UGTEc:辬 D?Px~/?ν%7q_v?G mw}(ʎ<|_&S3Foj_`g^>eN2b".09/W8ɅM8q@c᳘v%Fˍ){c>5F _zO8qg?9!]Y1K}֑l%ysr҃S!WNKVs2~-¢ ,0ϟ1yM ͉>s>|q?*]D`&a^ 8p 8ٰm$JlEv=(c瓾tš1Hv+h\υ=(Ut*|3 C,8rDYK'AN: Dσn~z87 Q\ytc#v s2t|`B5?N˔ qrÑ pƂ "^PvV:wǀS= F[#eWy6 ā5O|>@&<8y5N߇z=gK#L/A<`5"̟q3R,1$-T;yWY|\] L#t佁7]r#& s~I~o, ~受w?]Y_3t6" a^C_X@w=wH%aFV,`G8O@OWfᖗ ߠ /)Y'=\qS!:@94`nѡ)rd<` ʨR WhT< r{-9KT9z>K%-Id[ ^ml< U*ʟ*Ei)rioS7֗60Nf'\0`9ih]M]_:ɖqhQ$ ɉ 3|OEҕ2 3 J;9Gnxk[=N,yͿ7z#eSL7g #+YcfS AQBa+^ѯ)8N:8[xmSS6ІB|aIdW(PImpKo5weȩώĉ.+#|~J_Q'b=olRw>D8~FJ+UX 4 7}.+}eU#[hcx40Du$P}%+lyhchH_}CTd~@mꬾ*"e'] WƒGdoi?{DR+ ''/|ئTn۞u[?J+7pse߉1:fܤҊHŶ9:e֥8(tm3.І LA4::orS=g iy5˕]f=IYz,=8 akj:m5|;msȣ$Q<;{.m8ms HTO[_N6m I7E?[ck@k4FW-[py6qg86]Yb ZTf\(.c.9a}/vӏ`?E/~A=cʛ Sb7KuR:6dBnwL`i)F]MgUԅgI7}&ʧWc]|+D q?!x׏w\οo<`|%GT6W,vǵh`ǻ rn2x4+' 'I[k  -ѡ 5Ⱥ{d%2PY@lqz!1sZE5巕3SN[ ރ4veRY2k-Ï eR3UwRC]X%lD#C9%wN~E ɸwrÉ M6m\o,p\Z@ߊ7oS.ʐ3xZq&'Sbm- ?6p{]3MziyoB(45 hJ ,()2wr[H0hC6vhIymhLڪp͉_-`hIKyמ:uF>mv07JJId-7!\7šӐڊzՇ9BCs  GQ"GVfPSWJrs~??e\Bۈxs]d_yKB41*K<A~،kUv!GaCKUHN 'dXd=D,+8as_E2I d~%εCnmӾ^xmO߅A*){{$2_ͪ{ȓƬ'l?JsNd E^Op?e_pmDL.sϸ~hsi;[*TrWK0l;oӌ%CwQAVل%O~'QJR6['}Kë8ӿͿAUގ#* \WƐ )_K{*6Oo}r3 9$a~70.”O夽Sl:ncٮZ'qaf8z9){zGV)4!N qoP8puyns.؀7<]Xblûq%cJ Fh *60 [^A~g`yI,>q$ۇ;̶%?gFE_pKXBoi{7riA')1>?'rg즁e{v=:Xȕs+!H?tJj.Bj|fLnX~S:ָZ4z׺NI NޝvY`Ǣ>q S <#~7?{️ 1YDqE?l~"c|j5W >k*D%ڝ`q147i/=O>.Y~7t&o05/hBE*Wԯ!Y]A}Q ԥs +L7HСKN'<C,Y? 줩UuėAdN6-ˠܝ{i$`\"?͐Ǚ;dtU:dp*&P"B?e.]mS ZD191 \yD#"sH.Q:Kΐi]y>Բu"[)uU9*o*Z&Huw=Y kd_'ؼ>-\dE~*Cʄ2>A Vߠ]gNiGkvL~ nKE o z(<[B+}nfq(W&/>kԭM+v0t`'96) cZUMޞƞC"e_qwLymo;> TbFg쫯mVC^G{O_t[O!<яXӐنuo?[r[֩O͋u hQ*]m$]81y.Xi.Zzu9}器NzReXAqOȎ̈́W>DO4/=ujHkC0K_{ߞ@Wɉn8ikRo\_tApUF]'[ :fQ_e mIn}pPV)i'h,4B`  (K󦾎)V֟7&y$WaAwL֣CƚUPP0[EiI>>TڷfaSAD`'QO;sQccF@1E6~H9rMB-2Llbm gJ/ D)0#y/lu!=RW)$>.8n?Ǻ3r` d~NQ/Yh+ 6غ@]$AOHaO?/YH7|˧F? ҠnUǵ I@ ɵwЌϔr[` A8|`Cd=`XOb|&y7;wL ?S4`#S0GyiRgOm=fJ5 Bmt|xV{: V$8ږ8`9`ɾU;I| '@di2\[o@gX[Ia{TǎKK~Xx4@GH[^YOX7k|Vx y>Sް>]Z5;&d I^d/R*K/rg=n ~xr'xs-5>@?O!sTkp ]Ɵ\QɗduPtӇJ'Oc^*%]mdㆁBani䙯(}NւSBKCv4.(}oNI 1[3wYSo/%w:=,{=sTՋMxY/фqj[܌_JJS U/w>+W~zWdAwm%w ?0e|&A6{[3wfkO˨lM9 ///~#G ^"<]wszIfW弼:d}/NUJd>02֦j&O_-ϾF%0Jg7y^nv>],e~1Bkڙ^{!x!gpJ;gt%ωSdAE_f"CCU.-ac(gg@qW?K1`L X)Ys=|X9kTh3hNy )Ɨ9 ;΋>ZgA/_Q.l@WΥ]zpV`^ܪׅ6:O|;A=l̷#ֿ4tT͕ƈŽ]Јh6h[EnscxQ<@8e LJdVܲ $qM^&8-d;$G7УL.t2"} deYI~3oUki(0!UO`[ E;)n7ϒ8j$Lb [nY|MBnub Feǫ] -Yc z/=c+>7rD|v+f5 CXˤO>kbJwf;G@$s:|F;wo=B'N>z<}|y,94 n>O-.vNӹ[W֧}GOooo~s--7+bϘ:~lZ?!o)ho˭u ?[d e+ rT/j>J:ޘ"v'D'Lq9a#@GmVPQ|~XQl$wqу\Kbv{~F'e(%CRϪWŋc&7W̡~+'=lhkQpYpS`}\[B $S?hYS\[\̖ ɹ!e`m;P)ZL.wB=9O~&-:%Vik2|R)1ԣ_9Y~I橛RiR2#4C֘N{>lSq e=z/I< *v_ˑ  +֓@PUsWAK"pLyrĆ3}jkݻϥTpMr:%=]&+xINL upi7VXCbt/(8"YP)R|KNfO_-mGYکkU' uBy … ;EiU$:#+A&suGI> H]rJc+}@ʮ%#׈56Rv\x:dIyMQ>J_;ߎQ c8%-s1Vb'c[ڟ_݅$F5^<'I&M&y7=V_{ITXduN+h[axؒ}&8B. q@6WG۬Wjw t5:rupG'y%kStVCz֯x0Xy2v;Ҟ}\]x5uw|!|o,l//-黈,K[*w=;QwidJ[YǽM_(j]0h(,dϔhgd7.bOF :.0fb?KZ!m_8e)<~wѠawس1`쳅69><>w|'Ygt_~6c>ӂxGLwiU,0 H/yq3 !Y`"ofb !'H+ʳ#q€(T[jTb)y`19bcL, ig >@iyGr**w@ c~~~K./JX xsN,05Bi13ށ|>#RJ =gE'29ܱty'KČ%ℸ=sFd'{A rHNY!Hl Ey=<_6<`갡Jv._hnc7 w nY/1Qfظ\$aa!my]{;j2}iC^vz}dr LW*mԯNgﹶS =9OPnwJЋenh@]T3Dg dL'yu|~[5<|<۹2[>s EhhY`qĐU.X|)'ACuQ:g|*N^ao2yJ]cOeر>o>z0v stt / d`ס1 5Ǜ5qud8G_^o:^[7O\zg v8jm9zjr{" y 7 '*xV鞋4jv0FsmɅ,0b qQF'h) (t|ʨ l{i[[V]l38Lj[#OO6ѷ'< $䭪MSgIwPcNxuFY`N9v/Sm[Y:7&%Cvzv+uAGTf+G'ЖeRO0v0 [^ԑ1e\*ԯʳvS03\[ jY`U38uOh1 #DԖzT~/]]Y#_dȿЕR~ v`@_C9KxQ6e(^eBW:Lљr(?vC>X2"m'V>FWy#eָ\w6.b*6#GoE6F+]|asl1\Xunۻ۶*tC┃6o>i5XOR/"ٷ.?m ynh#Oei%yiuk KQ;Gћ'cNxi}r={㧜/Y7Y@@66ok~bWaÑD[t"?m{Rdk}.q j~aP9W*lnol6Cʶ|gM(O_o o{+/@IDAT:NdzUӵt)CP@^{{^xAZ}3mOe$0Y~lR*PG+(񊢫avhn.r1_+=49M{酩Õ~vfG;y ?Tz/ojMm-5S uNEaRq[>-mpK?*yЄmF]|b;Q`zKP+Y`IsgUYYIѿ/~'po|tɺ; ,; |V-{ynHgo;r|s]bq/9AogN1uF|; V46#^cHf񂴱De8>J]$b˺4/-d̡ 4䳴1 `<]iw9$T+ɓT_wyט_n^v 6^!Bc7k8N<8mCN80hg{Cc1?O??anx OwZ0Mxa s\HrL`RvwpR$w=Wn5@KδZ 4 p qP/v@~eOB[gfgfggT(kI f"Qc~*2wPOγ:+:]bHY!`#@~E8,N@~WN xT!U.Ach_EnSo`#z܏:]ϳk,Ͽwf!jVz/iS*iuHwR+\)u\߼- { ;%x.O,oPK1sJ V,.SW$/q°r]0($]\^uYw))NԝpЉAթ' @$uįL6ɔ Es拣~˞ ۍh')#cYV(2 [I:1ECTy \(hNZ')hYOɃMY&N;a7b'vsEq"/֡MrfAmsOWjKɯ6U)S} KK瞡l<ᅉشvM?[N:ވ=|"5>a{\/ ~W|)UבMg{ىzZ2IvQ~yi(? C]Wi9$JwJ)]q  Wp''S?IB޲ʩ!)f6|Wv?mA1RzWm POb3")J z髃$=2%uPe:ƞ1bd?p,Q.,M#ze>cw|&aTDWBOp]O7F}WFm$j\9$_Ʈʦ.pL]zr|ie7cC}#z7_!]m{q#EdUFo^.3t˧\_J ~ǷVR~ɺ~k}ȸ{oΟ\}~߅[,>b =z5o3+5bqA{aئ0_;:+mz_Q/}`(YbZ5]MFEWIu{Cv0өhظ VZ][minAO`wK{o?}U+D@x*FPLd˜'/>RԶcE. 43Rǽg!kt^[hmΆQP#iKjVXαAѦ<1'-<I/&iILak_6.A}nk`KΒ+; OJu7ºASR4K Dey\0hLl76r;m\t ҰM# yঋ'\Bp>5EA,@L{@ i)Xnއ| APr׵XylҪ ߎ ;'XBG\(8e۟KL*ʗ:q񊻑sŹG?{ŽglS)<Sh%޳RLd Bxpq[g_p-u]"'@sV oTNl P.78R]i>b.i}=>ϦNI].Ay;.q7埏~s翳|卓w?|Ozgy{\؇8/uxm~ ޣ SΨ&_2^Ոfu$46d07S|FK̉A͟XvBBL||}D&V)B+ kYm r#ULtӛa /[9^8$F7'̢ k k c96'_8/ Ulcy׬:&/ 7lg^G>U[y6A!_璴KB_Д6j(l9 eqD-O7| F2;(]3v~+H(z۾|DZTb?!h#oR@,۫E\[HmQ9ʇ-3LpVofNя'پaCk˿)2D;١}("(XуApQ;HV\Arf*igyWnq+kR=v\ècykSeJ~# ˽Un)V,7חĭd'EVo46!+ȇvER/iR7'N}ͪ+o)N+O?KD;ډ~G):[Z7i/*Wq|<8*v_~ӶT0O?sP+nu3y?1\Τ:! WڦOMX|a?o]׾[?}O_AC׏9bmb!;vvIv~Dm^.ԮӗsU4RX sm:Ib}K>.Зy-Az+w`,sG㲸E%)RH# |'jPSgT6߲p&mkۅ3!߻qq} -VO#~x95to0~vcpvLȥL2yIǣV뢭V&@3[c,' Z0'b.?hi}zHfܱ"9܅/wۣmdyq.ei+q_v-p/c넝~5zYv]VhG6mulͿ{"_ K?zYu>~ϡlkVwk_W}>ЏB,p_X .~tYR Wɡ5잭B8ݟ/?x|K<.gq!=T1y嚸7kЗDXpBҳqmI>4j@񳘇̫!4"C3^Ⳕq7c'㣨;?W3Xb?ts9Vx\8*fs>{8YmW_w=nP+ +=rQ7W$pD';bhyzprNhy/_|ˏh ?EF>ׂXZ]_c^gNP3D@|:eornAKvgr$ae" \7hmI3{` ntP}<TͼLD#'& }Cr떩AYa:`^A i/NwFCoXqE>j.FEd`w"v l /2K7/M2r?&mо5`6$aSٝPA9dd{MZgpKIa/+Ɖ q>0HiSyI (m qsR/&My#󓲺 |e0AlT.ʥ]JY<.1LĭD|iGuW{(6J_1f>R[A[^TRASO>_*X=D>2Hv}*vVXS=F2YM]'SіEFB|K3mׂSDQ/q[h"&"AD̹;R#lD(uz\ʃNsE=g.' "Q&{Ul+ [*HۋcsȪid7Wϵb̗}뫾Pk>i[?ͳ> \4P|&_ޑS)e+Sq൰e kP/ ٿ/&9>?q6%E+~v葅y<4'Se&7\:wxsp /N\`o|ױ=X64׺Hϻk }ؖi.Lf񀴂i u͂wñoFwL %**x8TywTLO2(mQu#Cse]ͨwC2tcxJ"vhSK|W}[5cp923'[ly/Â-vi۲L#9G'yр@nTKbفt |C(p7e=ɰ&gW9"[Gw/'8v['|Kz&w)*VoZMݺ$uҝu=3cт 4pˀ7<)|iI~fZIaD. I^;,ȁ4{PxCO$m8} ApЗiiRE{NkI<>= ;3C|:K!4L)14\d]4wK#uwݥsesqʓ*|% y>wJõ~JD㒝(O(8ػ~"N>2~dr,Sqgv-Ǟ?%7޾\g'7>tq 1Xv@̝)ʓ:ga}@NLsy񪼈" )ϻ_5_ٞ1/w/b T+O).O'X:KeK25B 2͎XIØ%h}Y~6'&'ˁwҫ@v0*B4bމ:hp7?q[m~ܒCi*3aVZ&{AP߮MnscGDO;@)B]?]f ӱ/dϨ _ àAPH@9 +v? (nόv^wL]6^:~NyANeOE#m]j?xcE&)=$ F)dx?Av_,Od r);GS>y^.h$%CW-:g+kIǺ]ǡ4 >\oYY/v2_<怶Yd]>ޯ]9KN^[[M;Rwr77^87vZ>}cށ7~kΖ}w~7?bמnf?^?B*NKǛ7@g+MB)7ے7unQKgG`0CO7: ՉRBLbjw+D:2PIzз[Y Mnjx1t~Js>䋓3}LPd ?t|@I9!YJ4"~x{a$IgSlwO;i_;o4p.ԛH[a/ :3,Ɲ0#2Fh>~}Q:l[WkUG7<1, ön#Y}sBst1N# e6MDЙ(ۿX ~!:]}%+^ւVV6_U)(O`%Gv;lO8)p7ߔOdR_^Ja0yj13%Xm}pze֡$Wܧo.@}‰,N}_$ЩƌSO~b~6,lY+BgRҿaTD!9ۮS~}ss-i~[:#2tH[+12yڟd},x{>P NCzsOMbOfL+n^.%u=JIye<}gD=/sEYԩ^bߚb]X?)DH(.#oCzSg+OgMߌɇuRp_ƶʴU_Mҷ2VWB4gu"q¡5yC*P/J7]n~6D}#zg3YwGSu`D:cjʇ>IwA%b25TM\c/9`LgzŦӟ]e,_,t ?,O7Mou";=cW'lq:)/Z~*x>(n`~L(&w,EMN,Jb=ɋ0`><$ndhYO ;ƯxNyFZONy v>wxD?}'#uqn1КEi862' ^ܠ޻4Y\w~7Uh<$D`$F<(L\v2 ZhL_B^-%3f)-hz 54#p8 9MDWwW>͇~so[Y]ՆF3fD?/?qp\W rLɚP赭'p9[ʎth$. Zu *=y^;fpJ8q=f8Q)7AzM<vD~d)fՠstt;e*Y 1HB=#w[ F:kpggf9uh+vsv; FhlԭotrBs~f."AD-"q&~퍁'>'`c6W:ӑ pv о hWO~gï|0÷?Gރ3y@d@:%~VqF{vunZ^\D#$g/r4et6ڞ7,^ihqr$Rd_Kb ̾.ř\t7|cI Jy鞠dk,‚P?~B.ud-buck Lw 5M}x3)uD0KG/): q oSLL;:@HuSsxAw]H>4zaXr.X%H@`!m:kL4D9[-zR{-><^VZDV{qѩd1v Iϲ4?jJ-co^& L5 G;ۍRplAŗeuŭm pL:yYdF'?-qw!{ ('Mf:O;AW4ø<[$/,` < t.Қ@*keQ1&U.nq&!Yi¯J].xX) c%6X[<"J2w-l:7Ħ¸p[izfTOǁ, _r>՟F; aPgڻFSt DO:w^$pd&ʮoŵs/ J|2?hVg PXBǶA;L\g{Wڇ\D&hdǫ=L!j%*??l4V szE|8nz߆zS:_&=KӶ > Ŷ^{(>= *r|p_9quW'@8Q,}r&A/χ̣ V,N=?tg;WAc|>CU{?Ei)E^wvT?+}ƒwe1݆q0Y6F0&4S.SNRcRkW:[U^AOSqgEQ!o{u=bVrrSVK4=VY_ëiURX^GKC)4vu] $8hhGx1N2gj䪲sa&Tߤä2r_moﻶ-oK۹6|$oi( ȅ48MK5ϚgEy^E_GW׸Zr=_};|lgt_a-lJ`o#A2~YSH}lDى^X|y^?b1\y  ~KBp.G~6eύd}$ W>-%}Mg)Ϲ-,pbpunT9q|gaus ӛcƛcvWڑ!H$BgȠԞ;tL}yhK08ZP2 tg8sD“O5 6TsЩu@5E/DrrjP &9ph!|DG,]`cJvpЂ=8 dPr@_d T2X] 8љu0'(ķ݆o\dnAM5G4CʍH:a;bsOE޶Kp#L"Q',8}͗A 9r_ {ہAe[n.-#kǘT.k@yb~rf.ϫ%31< >`y{utt}_Ե.f,݁^ p'Tܷ/O}vvJ`u.;؁dyjc yɔsl }/-yg7?{~o=7sdzX>uA6!:%7|6p( =x[)4fL{ 8)_@36 :ιW ~$l7e'}z&y~mfQt1&xRiZzu ~fO3 q @3 ӟnt2F> 舲C32ZdWGGYCjkb'2uCЉct*%E@ w1:NÖ\ݳQN`8RZT<3apK>cB~^hZl>zCBꨗ$T%(h:[ xWݵ6/8!7]>@IKKK5:Ӫwb#:;y^ $@ Q;6;} j.}pCih׃rQBu{ ޓnÇ硍.]Mȫ_K&mq)bk<3}cAtpϽ.s|5 Xn; ?w57!OHq_uk.tC`KYWmJ}.xDPsuN2ʪ;T ՙd+OK[RW1VZ&.؋7K`pU<>Avqry~lA8y Oxvkڐ0y=m-p.¹jK:qZ垍>|B"NllXV3g;Ԓ3(^Snl.7.ccY_N;%=~E#;L%-Y]Q-_ -CJ˻^j[cݴwl!wpI(k8Ofͻ[jeJ@s\՟.k*d*2y 7㏥\׷O=(c4}.}cϩ6dž #9[t-'Z~7!Qqt7+ĕaJzqD4]ծ1lc^z=Ŝnyn </KJf*cUi%*Nۊ;V~BdٔM)GH:!:Z}6C(eݦ nxȱ8miG^e{*Lt{*Irj+tBr_V6vZ}~S1/s[io}/SfC*&VīW4.'}{.u_Ϧwk?漠#:9Z賚~ыϿZkP6|l8^Hra [?{g6V/ Jqoz~ ~ؙ7D|or$_ԟ8X/;׮} hT]^I0Yew|_kYh|k ϥ|Aq2}KG( /8H@s*"ncl_?ү`'Ux|M &40lY e;0q!0)qg;>ĈO:>쭒uX%ѩnrwrvDG'o3~tM%d:y2v`"\>`1 nnBrbFqcg&L #~7OoÞz6(Ā wȓn熨,9v 6pK,:#2s0!O'N (qǠvA|"# HpI}2 C%oG"$]\ B}:] 1M>HlA:e<NNhAf  yApDv4O8ɟ r^U\d̰dg{s8h&l3@p^;2Qmj+͜En=Nw%AxQxB |ÿߐ?th+4# s6ބMd6\hώ/ 7n=|7l_Yp87㏆]n,K b9 !!oJn}c ƵkBj͹X)7!oz,q'h)nX<}Alы7z;l,~@+n8,`>q%3s JXh+S5fd@!/r^r*<[rIuGpgqtq.ʑE^Gj3>.΅@[wԣ qY~o5܌a"|'> vE?E"VfɏnLŽS|T`VB յ6D-*<%򆿋 Xʛ`(̔:e~CZҧ@h dh4EURV@}l'09'8]ٱPo Ws+!ze;|XW{1բn2cFQ֢~bB?ȳmLM_ɢ#m`H>xi򋏒'xԃ,[%lw28-޴ c] 1X(<ڤ,v[>WΑKhW,zvK-s;RO%kA+A[/ۡ\Gc@(_UfuTrWHB햬\pnKʶ3%η#bP[] ڄrnB]_pHSZ(7% 1J˝K2&SՅ cr`*~>f}1.xGȋ5nP:@Ne/l6yg<?>8-R~et߈#(8NeQ~x`P) +ӱm".ؗ N;fޟ3(\Dbt\=z mS|΁gă=,ڔc0?2#mϨb|1ޝᮙ(v{7g dfh#|Pw kr D ,{msW8%c'?aן?'=,!;o) \ h/u`K`|}ncї'ޅ#IIWM2SEn[ArM:Jϋ­^)em-ؤ޺.Ml/xYzSlJl4;Lg~qZjS{C{ބڏio?j_ZVP/=Qܢ>N+YVVS{Ҵ?4/9vyP263944!֏鿯mOڮyL>5G E $S i`{.sm_K2}z=|g p|U^%x?2ײfK^<率WyQa\uR ,w=u9}5\+C?"@IDATJUl/H&~5H_Ų`w9a _1Ṭ*4٠ sń݉u_l|LoF|3zRT,3 A8:q|Ytj҉q~7sþGs!E/v9H,ag:U:avEB>,ۇ5 '~D%2zkb)d<zQ)p:7G]dއՎ\}y8&A262EevruIpΗJdbiXpE`g-n9 |g%Ͼ\l!.3pǷnvPsPT_8@wLK,<7/д'Ggp!m5 QW{3P;؟>C]TOMh:ްXNɝC\ xz\ 6Kx?<9-`ᢄ$`Lاq85՛h tmٽy-;&w|r6Qg wg{_vK9|dw~ᭋ )SnP M~Dq\`҂G_E-QnLjդb$_툠{U7ߘay$#<=׻aJ*x=3N|&s''3(|N"+T~+Y/\ּ,0yb} L+FY.EPYs. E'岌|p3>ސ$p wK{m 3 0]slW7.u)GXϘhﲤix_me]ȷ4Ni(yd+t#w3q۹wT]aDK^z줞ܤMz?bo9wN3@/\S qb?Z:J]rAs)6IAzWx(}&hu|# vTI&Bqak'I#U;y]mԻpU؄uj Qy@T$֍.\Q Ax$}Zx.CB&n\ гc`\:CG{ z( ڐV0p)we9<iN iMo;>y ^gޱ^:qWDƤ̧"#6Gn[xʸ]h8)7|zpa^r=4|tczy#L0rje3ɃrxU[. reU*|ߩE1!1tFhx@EFjrZ zOf}/w}ar+ 2rp(U!ov#0#;kP:p RG Fk01Q%zme^coܗ{߸0C>*6` {B2Fǎ!(} Lq@[MSO''/l^vS/y>Joa|UȄEs`3?旆 vi3[@fG Nh.g}&a>ޛ_\~e&yaf@Xb3ɰne(?^%GH4X2$ mp17Jiu],>kU(ػ6U6_H]oWym#;΢. b SjugM9fy輜O Ftف|E{hi`Is0y]\jƠz-oXUl8Fu~Îd7l|rM55_?ss֬P%[-z,Kњ‡7t9nïQ笏Mkk;Δ4$vzvz[x5G ';\B?}3D57r~ i]}cOGbz ?7=w-t)y'c'VfE`548Ahv#\z5XB'B{o pbz~MKGtH^ہbPNց :(m"2+N}wH!'bl!EEot> $`rK.;\3hv'',@} o:‘|ct)=s˝;<0 O7uR;г;`ȿ|wp08۟g]6RAX]7mk7o KgxQxEv`78vuwNmBg7pzR< O[xB)z\=nz٩lMf6|}ß mwrycd!iOt7zǖn9b~=]a:MŽ$EE|l<VXVOfK\ة?'ؠ) 躒Gx<[ :)Va6x ±NV\*I_}JAaiJ萇nA?M&L{(:ʠMI. >Cnʋd=C &I9?ufh]OW<>PtK^LAwS AO%'l15>̙'K@(mҸ=vi^Qh:gW樾moihcn6\ގYۣ<x5υM oG< &3/}t5|9?hSfR 0qZhg]]Sďຨ>/gG擆O*qo9u]+˂ ~Z-YsfΝLwX DvǗs~8Gy[qMvN/H9?c.L0K}Uα%z>}DÏ򄮟So{6=a;N˶o6?#wNkB:KSSv`  V> IsDu90oN}*y H:Xu m.Y7|z!.Jl7kF}ފ`!~3H-{LaQ;pt:DA.tNѨq Dt><d!7; pUqWvcd4v pչ|cO}y<&D+sCtOÁ@֔( ԟSǶ6'3? @B|,o_կ7 ,Q'.l9ÂzHGA&}RG@sƸnNoyN=7OY:8e.˂rdA^Ǜ TTG,*i/g?Gѯ ?;WiGt϶q7 U]ro$er(sw"&3ٗk>Vέ-ģ,\ȰwUiv&Gz-nzd"Mnʡ9m,N/Sf,FF$i 3 7rЕUY-,;xQr.EwdTitGi' 3/bq =q_!~-tEI۶q j1MZPI4l-T eʄ5u)PS p9<J QtJ[vq|jvvPR7X<9?-2·/mz.m5Sv;/:n/y\ _8ɵpuқ.10;ZxjB+ute-Bn@FxK>*AmmTֶUܻP\+9},u8tⓏ+ k0Ok>ڠ̷\ߴx\쵎m/ A ^KoғFb$z N!:6r ΄K?AC۾EY'[/mD#YVupgŹ-Gmn2?-x@@'!R:Or+8?H}j]N%sӜ[=ފ0z +yS#?uĜhoю޷ݩyA9]n_Kc^Ld?C  4[4ٗ&ۮ|%J5 ǚ /t4|93Nq"^q.PyTe7yB=|W6Lp.Ȝ,C2DyM$W) &0:K5ȋV]'?K0~ G_X@u(G<:__YsxI,*V T:/rݥw|yf–Ί^h:~'l[o5EO]6F F1i],Տ1`Ja*z77kX VHuB{wCOl&@B(wpW߯_e/~|%g׽ oЏN?@>1 ]]q sUʷ!Xw8->ڼ]< ظUfӑuYS:lX-,e2k5a&3;SkDD D߮ E7:[2:c\ٵ^2G]D\#E.1rV: 軔 GNI> 傽}'ڝF zltz j`6eAԈ/F lAQt%>F,yavt-?\uG4, (s:\!@gkYg[gw qπ v~Fg̶O ~>:{N-j{\[,mmT嶃bkg@ֱ2'"׮6xfAϭik@17 ANOOګQsǣ2^"x/8m0dp# تJ: L.#w)>T~4 ?)Z+g ⩘WxiTHA?JX?X̔^;z>}[JNXlIԵK&vP+PߤNU<E~ͯ4VW {I lvUcY'rE;h&MT 16Ү,il+e;Xd5P;gr2W0Ѱ$fOF\)ryQ6stڹX'e˽&AG8Ʌ *Z.s[G}B`KEht:rsX ڛZ2TR+-6&o"955MD5a{/ǖ64~0'nC2TIDNͷ-KV&kjVNp*Ek xʿny6 kǎ"cYhiA3WbD?d%8c `TmjV|ycR]ҋ2j.wahO!)8pm]G,/H>7a;e5zӮg۫:5@r_e ͘Mk㽿O3}WeexWڂbFE):Sk@\!|3g|Z1m+v"rw5y1dT?PF#nO5_!c!pѴ}2/PK5sr ^r\vV㳺w\A$x+i_i;l ~цƽ\=gHZY4 "Lj8c{)2xne~>o J9`]vPo֒9 W?/|8e~1#H]KOD"3x'}WsPQ?Vt%%#;X0جI¨6(Vx0Mk Mm+HJ$h:Eyѳm?q42[qk^mrӰ~|}=7K$wJn]ӨMQ_m|(خYvsW[|͝WY\gAb%yI^Q^[ }erһ)ZjrPw"RQxfvF-#f׀^r5u9zu`Fu>c]k*na2RG~,`aK58 ]v5i^÷<}/YzD#SMSe;?)|rچۄ}QSxϷPc(Jq[)mo_^OiMn+-)/o6S)e^Zlouǖ7^vYݻF8l=O_W:a?m˧-[ezumM M>Ͻisn*J~t>z.{-@#ьwG sv/㺓IC=P/>1_r֋2J;y#;Ǵp,w'rA9ɹ}9$.^/yI6}׮k⯑__Z\3o'Y\3Dh|ݱVτsw׹A'~=lZ^ϦWp.zg '>3pG'ב⃁ 陣;6v'cydA:9w0H@>\G>@;oQ2Mu6de/ ,gdd>6HA:S.C2 Džn#-v8`'%' TNᐣ;jClӑB$EC/.lgIxrpvv;Ϯ6D%"}@fLtS ϩ..P V 7op_v1Փ2=>OQ)8w^N踶W3iA ;A:Xֹ=~`u l9G4C9 >˒(>03ٗXW> GDHTb|7gt'9s&Ϟ3|x;f獿r|2g8kϿ;|O\k삅nti (i1 GT u!EK~=jS N1`%lv1(d[%?dȄAP ިO8;ұ~nnG.$Kr֪s8$>x" c ׃6F^UO縥}o=q['s]Kt$SG(r]A~\ 87xYkCo{sf! 7z%)KqնOۦYyk ٘/[>'_ӪfL;̎G cU8_V=U=.}z&wvohiRaZ'$zȯ\ k_^+ +#SGݏd pQP˅}ySW Fvs`V֒bhuB8cM*(u>~?[>χ_>{]ݜ{ajK%cQ~y|=z@8D5WϘY ?+)U*[W=4^ &;mA&u従[ ْD{L,䒲mr_.mn2T0:wBUF#rCHenPH-}.:AG u ~$@|,+,x'鋽](`;nA|gsu|H x_sƺ wuJ|trHk.C;2Fl/ Ɯ|ӂ|Ay,/yK0 ^wuw⸈ʗu琗]s~7|6;{Z /A1 <l -xB[~y: rtRn 4zӱkX9ttypzz%IDԮoJC<,$.im'hC\gZ皁:z>U1?w[X-ЍC|k CN챳Eʄtgq9.g~ļKfh #Wx wx{K(eBep QW'>7Rp~1h8 P@'1nQthҩ+}vP/~84GA ,6~Ț!q)#‚&26$lƠ BmvlQ.'n381fЅ;dg'_~o_x6*zᝳi݈1i pBOj],̌\U7!~ta:lwM.2V,K/m궹u\Ht $?#-\."[) jOc7|q+FM#,x9^C[)y肿cd~\~^ɧA<ޢ&[;)֐5ˌ І6D)2Z1miCFiYᐣ^+ع6`miU..J*twT\zHŏx)x'EC\a~W:.ʦޑ&+G֬O tɨc wyf;4?'FL 7 akWG^rjU(iM-&i8_tL_=aϨȦ=ږ~!{Ҳ9,XhmnO1ږ4GfوA&qBQv.2ςc<+ەM]STK[$ү,eoiaϱ]&WA+9 {60nb]}Ɍs9f-L,S򡺔o b^ Vh55ꍾCHOs+vnd-y%-H#-`2$y,Am&_2h[8@% K}c8W7؜v ڬ>m E2͞Ͼ|2G>i^;dc9;])e%naCڟhq-eQvmY^ Gk7:ΪJg1{dWҶfٷ -6߼o74u{ ò?*NGܖ:x_*=QeVѾ4e/v>%$Ucc.ul+Ưodϝ,]9oXr_﬿!| Bu Lp-2/V/_Vw';ڭ^zB[= 1Yq8Ee=a;N˶o6O_o5vuNo;2tvgkyy8Ƿ1v O6r1Yq{w;?ͱxHryq%ф:'w$ H)2u0CtbbtGǫ-o'Q7ȟ"z |IF2+`g=w@ߟ B^DHYwPqO[ ]ep.|;ՇsGXH"x5/[#h^23xB?3@A> 3Kt VX(^uP3E/gtZ\D vvB9b}F#ǜ+ :?f=v.3W՗,,P]9P8@s\%ɳ5Q: nC.~j%` ~㚣mv'bm̞wfw] ܠmXYrIF1U2Țu wa/ 7K;KiMD;4_^A!0ґ۾bɛ}~o/?~}BL[re-gљ7]F&5,<+Z!;n /]TfԎZaTڟX,.Q.GO*Ǣod'KUV*g ԐLTJ昴/JG:i9_Y?ƨ& VWd&(=ݭ_ؠ>$On)q䵼F: dX_WqT._XLV.AjR6\oƱ+c}KJ~]cCy=ճ u2A?CE\9wBGQz>06f-r G՞_]<]iڏ6T ZB7N~` vԾn)tB <.J 8`|yƼ`7ϑN_0Mo->,˶H z ?Y؞vUp̄G=QZyZVɼƟ̱ڼ]#/-X\߃Fy1 ʀi`:]P% x?3#<4YG7  tDښv7: &zqBG@IDATA[v6ۚp} Dgx' U?`.Y$S>˃76B!J\Y`.>Hp/ {o;vcl|XOڻaϲ4?pNs&Ǡ%}XjtI6B{2*яC+),!k _vW$iU*l&}\2׫L%T- zzqsm_9+5Uy҃W3Yx#hx]`R!J{JJY^"xqG5/=cG|raE]63xA1Bøe0(A8YhDӓ]2% ߔz{KcA ,@6){367NO_~߿~_hw>fї]_OGr9oq0>ȿړVRŽ6yٸv ITI X@Xd(d1Kۏy94ָ< A:j߹+:cU&Ͳ"L~rmޗo2 Zo&W%_}ў*ĆhZ/V)eq3LI&L~6Wk;m ݒ ۴ɔxaڜx,5z DCd*KYg却n Ϻ.|r,fa~x۫2K:[c .OCLux-Gb)궞7XϷ&7.]mDд E oϯz,E.6ozl6oW:SͼU_Wuviޖ9M^|7bo|]ڛզumvZC|t;7[6/[V9ٶ{@o-֟ μ[o7M{§ @E~O?iK 2γ".3a?䥒t+k>y^@|YCOaώ'%=5)ПL|\ ~ A+?d=(w^́ZցsPz8|Ou69s8/sڟV`4>'Y(kZ3>cIY"O@[ }Hce>s\nJ: +>mH:g\$B-Kv )Aq+nsDcCH[]V{IV H;Jq:\8'~ x/ dxNssNm,iЏ?:Pw7܄.Л (m67k@6>g1!/g'! O `ES0舎' .p$fն;`G7LoX~X>w<w _[o;|'÷>;opWr\ [wvUpޠ3;ka V]X﫱e c ݹ q5)n_Y#7 qE酌'R}@Stz^ol  e,,1U_~8J ߆yE'AqՇa+k_~gٴiJyp$ 4=(m%& nvc[W:5ν=D'Gw=V;5 q`l! *;嫧ǾBh,37CS'Cwhc?CB9s+<$wMW)?̷?F&p 0&O#t> &8͇hڢ?mt[Rx*Һ-WypTscm8^5/&WM-]a:N-xW4L̮/8s4P Qi0eͬj1wTt4"S^UE|#"@ȔƴػlJ<{^Y<{yWuStm'?s>uMtkL5G bӷ9՚/V~c+>Y"/ww*ڮ/5[*y08 )>q'r1 wJ &Wڥ'_R?/T/xqz*P|_ _%w8eL. w1!o{:yx<ЇP84! {qZ}~۵y>y߶y4p% Ł/@,4լuǘ5:#E3_N\; qhPx6[H &˛WC餭OHCG:PBg(:.yÿ@d0P· . qHXϵr>0q+.ϢN˳'YNwP?@{8uF1p1'`s; ;7 #|â X|ʅ>S-: SzVt8Eyl 9BSvSyc b`'99y/u Jn:3two?#^\VZ+oׁ%%:W 1n& Kv؅D*T"$ȃz~-qh^GIĦvmױZk)IͧxV^5``K%Ir GKdlAg.MK-A 2z/2׆jOq$ mX(j8,"gXOyz}u ^LJf,q U# ]|~o۬|GEp460zw kaeQEQHsa!#L>Iq6B+54QHA΅RtW!xi,|]6Ov%m(!GTnkw{/HXҚawoi}jT;ګ(͸忻extFѬB M_%Q{hXK-szmZQCHyD-pcVJC(,$7H0:}vw>כrhYw7-a3fGؙm|kD rW,||򁹼巊v7ӜKYwRLϬ;ȘZ6]l6wn۹m]+A{sd{SC6syo{ҟv=2C#xGm緓}Jv*onJ㰿:POH>ہrozO>OvhymCaGe= [~/3_0Wfo~ѝca>ķkYcaR xÔs~9_/HKvaY.]aƺT֦Xb%4|H禴SEOxpeQ9gCL];#[ϳ`{q2C5+RX>9Clkz3`fRٺM@ 3_KB ҧ'G p ! &r=8_rH,Ƞ6` ;K>֗`3#./n▰!sn$͌4\?lgW7[tz}~.Xّcmbanڟ›߰EC㓢@ 6ľ.TK^b .꨻A.,{A@W<3_Eqa+vWgؓ'YN\|k׫|k_;[|~GW?^ŏV\V=촱O"I~[\*omԭjg$r (7f=|.aqȮ Ь]iN,(~ cT25ԁ28 .lU9\̔@_) eYЦ,OF]y6<=Pucwe8L`%v?æ +F׼_7Kt rܺdwv -}W׵7R,?PeCW><샼˪>W>Kzt@A~ "BYQ4\,﷌Ovh"n"C~BK;ԃ}8 }ˏ&g8D^wS >9ԅP"j9~i_{^# AT28pn d,L :ľGWNwZ{0G rt3^-i].*sL?`LfbУ*6w|6u+Hǖg'g8&t˩^m+c˴ԚNfr! ApuجsH?U4ہ5]v~iRNZJ,C!Xi&N'w} u޶iJlXlRk QZeZƏX.1QUC˼֭|ɧ\s-Q2V'yze/x %G몾缧\L6?J/6nfiY fMym:wM t |`pH;aIRhp LX)$ 9Xx+#5`<@ٟNd4m?8\'}zUW7NC Xyw'FL^ҾN' h6ˢ (K{$O##x8qE)#tnjzjpRȗ`+]deZwcX89'XpWiH.9q J&ɏ3s9hLۻgWoK`0B4nt>e+!w8#p!)OE"_RI팂 1u\̼p})bo-'} g$W; Sxu~b~ E8b ~ln=yF,/u\s>ל}!7O^{s^^w?ǫV؝)~uHO%[PF۹>Zvͣpבlu $:(טr΁sa]꨼Q>juy wo| }LV=eȠK%E)![:L,T~_l](7_C Ml,rT9x)4iQ%m^f#T\C ozW$д8|7LmѪ}zICUgGXE`מE|md@P-#jA?ȓ"\kх&0'qO&Eò]A(>QWɸ_eҬMUBx=s LrkBVuPVmcS—tdBZ C" yorwɸqhm.[Pޒ*vR'B&1x1bp_00k^m_-O9.0=9EَC LpۨjmRa_pJ˾]`>־Wz= o^ʹzuu+c#{s-jQGrup>>o *(3pA\Z8Ns.,GlW^](,|9e\Dk[ֺny_绯0_[G̶{T:ݖAn>zAěLKXJwϻWyL=HoCGtu ~p9I/XyxG䤲ƻ~ їK3}k۠& W2v!ZiҾcEb|O*3E ïItvMzX?7W?yɃLӧ<蚨H^܍vy+y=\sޝq'o/%SK1D敯K+,"h@m.GfHgյk{0{&]E /F Vg<,w>6k/>Z}ޗ>ay{{Ja;ekt2ϛWŕfi.@KT_5B!],n᫥ ]waZ6tI4^KC`ZwaնN-s(7GMع \=4X-F(-pww=3߯nz&q)Si2_tuMҳc#ݑ#;cv*hMNt\| v7\;FdbkA.M2: HDOWLbFSI^_Nox+5lpz-i.:B8.&5w-F1vn,mu2"cn@W'%vx]@t5v3p@nb\yM'$|G/;uhOy#4^HV~o.h =9vF&> /}1ly@[3;%`svgb73d^Z x''/W+RZd{ܲ{ ւv7vmy7U>U"SlyTvɩA=;{6 }%_2Vxdth>iB3W^T " dfuEe4KY\s[]L{p07nG}[d]m?/PLVDZ\#0OYH6EWOUYYֱxև4UfKKR>=r<qm8 .Yka7rKaqvqjZj/=c샕w۲X:91Dܲڠz8WJ_hkH\m G= ]$S0%*4-m<4ekE_/[;ߔM K9!k#\&ݔy-.aI0k)7qUl@/^}J TX~m#lV' Ao }*cpA-CC#ڿ2_KӠ7cU@p[6HQ{a]DžuߖsdS7Y>({e0P\A]6@)[DC|s~e0mT}O飼G;Xڏ-,9ހ5 lNX- AgGo}_[7`= v .-,Dt ʰStɏdLWuVW.U{iG* qW ,u}e%tl#&6ߍ-c>!۬=Q&u,Gw)"%!,*;4j-66L/if_ᙧUev¯a tƨ|ۧ)L˖Y򕳂O~Yޅ@ōЏm`9hcm֡= SWrm!ajw`g,+70;]+oͯ\A׳n|k!U3.et+b{ѢgճSj\GlQ|P(̒e=ɯICjM{ٶ#ʑ -bl(E xݺGfgj ^2~%;JM 9Yڀcte_2HB]&zmD8)%/C:iy=WOaWmtGA %pScW8L^#m,{b|!M"ȠG>s+@/*Ráꇬٝ ㇚2{_f<"Yd `]4CQsOFjzFܺ]5\T*~)_<+~L瀶/-Ǹ7B(nX/ʕ: Rk Yq=史KmvхQ 􇷻yIGCX>qy@ۆL]IYg^9]Wd7(Р0:/+eUF;V_Rgeyu \ ®Oeyd}s܆+PkJ ^'| µ%x,tAvuQ`Xdk>k$8kFv :չ՚l%ˢ[Y߆,n9+l|amV%sЛmL6Go^ 6b`:T)ԩ2אnͤ5Ctn" 4z9#Z(tZ]&޺nz6G{yk~=HwɸcxGGQE?}ƺ2qGXS30ĜAej H\c6-U˘ U֣ȄNg|W5 y#e1`#;3ߘ9Ms _:g+U5W|cVcJC9k$Y3Er|ʵs8:?/X;b~< Ror9cF/g=қswpI7}lum^ZJ_}'=\.t&aڈ(ÿ́2:iYwQ5& pIa>6,hHuBvF.⻣6j'S3X!0|.83)bCOd fGM|ņ;&3~ /K?q &PVDH?0@'B];;Dofp=R0Ml:iE$;XD8x#3vB½vi ٱ.^NZu sI sV B=u+U HuHF[Qh:*OYr`Qwy{>>#OZ|3ō$ԣ~^gA&gL_̗+_÷$SׇOcurkA.XaYNys&SA8+\'StJorB Λ+KY+^ĵzz#0h+.aWؑEhd oRC+;uaQ/_>KO?^צocvemG=s;L[8 4Ǿ،@|<أ ;PIz"MYb3خv?0?e (s~~Q`- .9 f/+/ ʬ=h-r $`, E~-Z!>)`CZr׏]tĎAT qÚ@q/ d`6C5% ʜ+eSW%̢Tg16qc}R/e}rSB7{"!7H#vA؄>eg^bbG1M@IDAT^x*>S\MVqBY~*>daԭ\i)%϶0( s|,pt';CISf/)n>Hڭx{o'jf}c|ۜ|%R?ϥ6ھ$! fsrD:HA+2< VSdd7CMz^]uppGǕby$֧ 8@:?`}lA䆞bc $7I_k}w}Ԯ x߅}~qm[)_UGENڼE>ȩn|U|D1~lRy}WQ\"S-ydojBG܇)>48z@n$cIT}ϔ"}A|ZƁP ½A6Xd^+ M䱜B۸:/(NYO*O{Hвk.RI>`/g*smNdPBFPB}䧲}8lkێ\r85~O!cjC|1Q$$ #}zci#BO5"2SLgz#_]W?{x|bS'qx:Qdp]Wbsޛz{c 2d8û 펴cH4o+wA臘?yʟ8ډԫ磯r>uJ#bi|-HOF(es@|pLڗ8,V*]њkښ" i2'/T皳r!+9R:+u:)<UnԤ[_wq^?S_u^yVSe>3NKi^e[lhǧmHzoR?xg^@f[.|}ip _Չ癧ExY͔׳<aki+5u+yud>u}g+e)ܔ$x4ٶv{%^?Sv4:OcΪ6 WyzU:We[0o}}̈́M[mY%5h:?ۡiuڶ٨GXwtRtK-C1_wތ+o./mu#.O;JU6pSG;>^}]O_Sڬ6:uh٘;;D+.T'C}CP\ijU~hcI;!j)5d1WYۺuPfk*s~>~ E~s7󜇧<ȹϳ@ k+)>?U)8?޺f "i"th\n#o]t0sƹνPXQ{X}G몾缧\L6?J/\Dw\b 28FUҘ0 ɴrRՀ,- 6O-x& mcN\Κ2'v)ʮd_6W!*m``^i`y쭬T(=߮:KˣZx_(*"N!ƩEdFDM#%m5Jˡ;2A!(6* vLJaʕC^ i4t3>N|^(|(HY,ͣ\`2mea< d|AP6tP7__gyکp>}FȮ-/v{ml>ȭ>#<,+Z=d MHJ t: #;pܫQ'ґ0V[.&wj WT&/K8CS{rcpW[,c{I#c h Jޘkop@@XE"pr&JiB[@ᳲ\xR$ۖc\J\风2:ҟ]q>UYG£ W8VF5l4OPk>tٕ`?՟~WcTA5čd)* MQt@] yGqGGFHcE|z2b ^)0n>ߕ0>G(*֠s'e`~Wӭze "cAӺ4Xӱ}5 9uә&$70ZEr:툲xUMk"06UFZ ҈5A`qi.+mgl[Zn?|6xCEZ xaC3Zt87M8UɜnON^m)[Ӥe?Bs_Lҍ7P,<7M`6uęgt.044GLoCUKXggٚ[t.dwSEmXT\[pb~Sey*.=,W.}h;/Cx +A<p3b kϕFZ7|ʎG\;u"Z'259|5s+96 bp~|4(4m/Fi`\!f p½\OKlͬg~| ~ם< 0BCE+xA(74Y0{@|@VΤ&\bF I+ϗx/y@[ S!9x%X?0C_m/ tҡ[WQ7_oci\;>}"rgNZx'uIzwH@- /.yrZ>!vO߃sƏ!` . \j7@I"mֶ#K]PntϏ_w/^껯'ꇟ߲alj=vN7ƬtI'W|X$i xBĂe|2. |D+wts70$zb>R򋇋5EY9' 8uF$8J2yld'˞Y"lDCd(qMVZ\If%^b^Ս0zaQ8҂z!Q6S,qy(۸X4>8p%PS+tCxq(X;i>6~lbP(JoKeQ'4| ~ҵZ| lVzy.%}Rk[MBمij Gm(}#/;WÒ"$urP]> UNq}x zl~b s&w!|#[r=.CWB KcSn\7NF6R=JiM|uc*|LQ&=3&&$eTrݽKiRo_H{;Ymj^t_3m_ޮ%fePOM~$ܔlہ]J I>e \-û#;_o>Oȼ]djb#r4|T-f\tףxqj}񽯇q/}ϯ዁! [~s/iΆ|Spka̖\9`姯V?oa"c# Ƶj3&Z2 kƙzywX杸@z}+dk>ld`&y0w"Gzq}+k!kkf:)c礢#7~1`c]p,#.sƈ.x ˧Ҙh. 2 yЀpz=tryh'nvVD(8'7jWv B:qxb!ߵt}\9y8ϙ8N6\bvl`%P:c`G= ^ >*# ʨ5ąCd>7sz۩;#Q;I5@={|b"?5ő΁W\||N<ozfO|vUiU@B_qۦ,gvI PL_[7b Z*r׏chcƥ:"9|2Symu;o,%wu9$>ilF% ,]E+4X+6O_x3BgWɅQ/wpAvAF~zqCo<=*cl[ƃVlujosf~՟^~[~~g~Fsߡ z Rh: eG.}W{3dO/@HlBݠ I/0P|HZbPg/kAkQK+PNEb4Wf;\cС}0G{`}E~ʭN@=ҏ) p.Թ0W=:3x:ȗ!vO)PeDz{^̄W1u˾JYcIJ[sv. !k"m rYq>TV9QK2SqpL̹!$AV]/F20eeOJ Pc ȱ3=G؟ĕml8 VHY zՆ¤}NZg~C+[2$G|eK al%_ lcweD]geUiUeֿlG8ջ^3A|1zD)T:Vʋdq=Z.|-cܧlڽ|2[:L)0J"Rd@ֳzF~Jh9V0xCњ0e:~,{oW5)>|](}1lޚê=Rf6K_r~?;s1>m-o~`aJDxpj ,R:&=/rv]0E࡝@l$?mTr Q*tj`6u("FɛYfpXATayPb;)٩ B}1JV[[^Dx%ޡh*+};m]<ֻ֏q֛5K3 נ+猭 LNew/zP^hݼX1m^qYڕfeP8ZldM됱ci8=~mZnHbl?6 D{`%Azn!>XխuFsFANi呜UE_vmz]x ^Ǐ&EkZ73FNvC*ꂁ';f6eMN$Z91j4mxw݇xCۍSoODOxO?X]_^#K>m8,J:B&G^6]ZR:obSh9D& [tQ8uU|\45gpZYw1zROFyuI0nQg| ;~d=dx>j--E[`/Zh 0_V7Wna.-s%Msr]ay&-kOІ&p|PF{nテ?5:h3ֶXb`\r9cE$2Hy,jg Ml>|PȦ|b<ڢ}ns2ڼ(]sv8/X9&bDl8NJP'\O# k Z BbA0'v,$Q0+ -CR>]}; #lN#٤% U(>&`pvW 25 >KK;Я x5 O=&}/o;Ym42i .|*[A. ӱcZ\Q,{v v23Zv 6 bi''8So(vJ۫ZCG.bvZALenNo()2Fvmц# N''+}|WDէ,E8"SY}n(]x#C L|:3+1@cgoRy:[Euv\GHp̎RSG@ztR]{aQvqA>.2o@Hv); ;>.^z&lyoX.8s}&0,]~o/⛿d7~e_Z]|B |`[5Ml޶sUwfxNxg7lab.Gd%dh9)Ԗzj1lxεy , ysůԥ /~j1 ~ѰL8B%,SGd^ݥ.o:/}(X{yr]z6=ρ[_(JnVH) m+U p!O-XGڥK{/\[o&E-`W)zڑv:d+Ph5scMkҶP{!88==YdR(N()TE=U{V#I6xb#2)N A9)EHu𗲕Xr5l#&|kW| E@I7JC(bDd^eQVXU鮧i#=l%7ӏdtԷƝ#J.)w!C߾<({A]FWevU4IXWR^C܇;PXI7$ 韔(q*?QZCq[}0zV]޷Bnɡ%{u94 `ULz dC0Wj pVfg;BR\U<S3Ai_Q]kЃjs+.%qva1jC>t*v}e$1e0~d,]LS=L_lSV6RZᙱ A} 8tʶc˭9FE&sɨtR=)- 'wV?!pW(NVwZ37cYdkxT }Ǥj'2s? @Sk+~)ʧ--bυuO#N6tXC{N 3ٺN_PPB{驍`2fqh۶ ix5ӲHt cbv>b\6du!M CR[I>)nR_miѷd{<)jҤۼɃ&=W&鐷X@QӰ~[1Bc[rʀe*k~w;! C?UYyfY5=lu۶y7q ^eE1C>*\_yFZBg,%I.˖l_L>ME=Ym}j$-pyyOI7}lum^_9_|ƕL.Y! 'U9 84qEy4l $Aڀ[Z:yNF2)k 4Dn5oL |6шa0"iwaa  ~vNʚ'Go* ⺐~2 yW,._9;V.w> y,sm1A$;&@5@;0w5# b >x'Sv$ Sz@d̡(E}ȽBc:G/e/8v$bWG.GÃ)ǧȯ9Q-%p9/B4";b'& w`\ОֽvR춒 y0Q 4Q--_j ntq;?ܑEoѯ!_xQv*{%)6".^pDEI['.|oWO *h ~BǕ~!"7տ(W?Z^ fhiU/VE;|ÃNۀudo͒ZTζXźnk+=pD!=:o8M _D?\4#&Ki-pkF^#L`,F¢,]u][K-r :ӷR'5v 4v03-46Tbi|7 K$-БiwдF5::T}Sz΃>6]Qa#?:Ж9O41:Di$'1κkv.z\\,F;tRvʗ6RjoIq Q.bQۻ %XuHpYƏ_e16,~e@/LڵY0,"uOa-7SmJWeb qiWȫ2 sl0PewU}pɡkl}_~UScWN7 E:ֻ|#9^Wz <~!rA{JfXQ|)r2,l˕m '!پQ{KYɋҎC{MSdHC4{k^Z ;!͘/1Ȥ U'.928 %=>MN#$@TQn^A&U_bJ{.ipO] DѸ5BUm<屦11/xxOQY>}\<{4N'[3]b%ͱEYizCF)w +c栶)QԟOc>gy~N,o@)ް <*g_<m4׋3dKx|ei>lJͽ9KLΘr9\"̿.U*wX.L u5Da0I߰łq^x(6`SLFY8|~g6t86LQ06$_sFKC4ZW5'e^s~6nIw:6Ga_j^9|J?ksGk>.»s|@eȷJℏ s:;qv v".& \8 @Dv։l'$Mt8B";18stX ybs;:5'R0" ;j`!] ‰% yhx=oȎPnL=zFJW3vx#4]u]0õΑiWvXv'ԝr2HE/E"[O9«_ BxsH`e dd78/v2d'?&M kKp&>fv%-!{B`;e:)n+=q$fsM.,N>sQN\zMG;BE< o| E=e@pq7V?}y_h[??컫_?շϾG}SlGsZ|tXh5$mc~-*냶q|:F_IݴCߣ4A&Lc)/4R铦v@O+[~즍ȆҼ .aC/,Y45 B`cU<hA6* puhu}Nfoգd ntдO 1i6Pdi[vJ/Ouc@enQ}Cz7rDt+}}<U8 Rk/W?rlW^39#8c=w+s^ .11 } %7CVԱhlY"Koc}類('ɇ,mTRքd:&.+u% DpJcr{CiΝ۲Y>hX f<36Uu*;f ]-k:cۺyxnm*3bd񥵤?Y"'_~g[rmGp2wnFҤoDV(Bd_[- eLc5^gKU2 OK Rn0,ĆӲm`.@ɷtE˼6֦| UIUbr<6w& }>Z>ZkgCTY&~t_?X]uNO~FYo;1}ìs}W\ Lak`~ Vx?hKGQ;yOI7}lum^_9;lwl\:u=ӨfIņJ'А^d8 n%oqaZ_Auxڙ+\Lpww%HvE9?7{ZUa3)f!@{3DpP m#ksl>Fp $ҷ?'`ƀw;z f^Yrj?Y!@]fL 0$]])1gȅO/OWw_y۫|wV{}{u~mx]'n*h!!CS1uc`cZ?iD%KZ'v4NLs]z| 8ғt#?YXI'X!c'd3sr z2oSqvJ;Eǵ\eC顃z[m~m+_`|!Y|TǙim!?t62υWN M:irAyS?ꅱT\#Oq)[aY>VQ~XH#8< *B= ##=%h >uwL`-l]4mKw4r9P/b >8u:οrKFȀ}lLeW%! RUOQmFݫ"i҃~k};= uZ%\~W׾L?W3~P552@‹>H\`<#J?b %}d,V16]OІ96-Pu+GYC+ǘu+Uȃ4 bkkoܲ"+j){(S /w\3=#~K_uԏuȌh}]ڶWN*)է~r׿c2ok+(ݼ7k`xDB;' Ej7i:1.@DFR^k@IDATQ_r Qn^W.ߡ%9\j <Vʴ.a+w3}*K]o]7\cr*oyL +ju>_w4gJ51RjYrNNW ^l[Es6>TŬC/ mh>&+nzcFt I»#; OUݒgk7ËZ\3yW-[("pM=W^v]5-ӍY}bUO+xevI\ /2 BԠa+o\a=\Wu:1΢{܅پ*OӴ"g#L)6 `>;}ğy' `R:ESh6 qgZ;.S\<rmX!DļCj }~wRescpmߞʫS ݶpmq^"\qȮǯg=l}J>h?!WWO/kj⋑ȱr|bD|+j\_ϨnzĜONoWmpR_ܱzqĹxUU̿9or] ;8W9r>9 Ρ8wrTXC7sA0-΅@|L`^r9rҔY()΅gy*d1?u6?Æ6{=Xj`Y}&yFh'_Iѡ}sMÖ㚷 9IjKK]w5OkN w 9Cv0e'GiNp,*~0=T͎X]UH*|%$gg0#(- @5KwIpuu ELpƮ,UdBI G6t@v߄}ZZ0,ł3k6 &E'/Y":Vz$p&Mng?/`§ _Ie.A jF'm;1&r61iUSMvE t1md nj'"F^* o& ]y' neb}>d?ۋ>u$(~MyUROѮп^oߟNt~/>ۧLo<'<;"H +JQ-p%u)ȴ2A&\a㖋;T#<OEH99OY˧P@?0%m .joiW v;6!P%NALi7l@L 2+ێ@otñÁ+o;cK1^/6ȅ ?,Y!)*iXO6 aw*[SI4Qu䀁KkӖWja5$fUxQ.p^ZJSXXZ~q϶bm^msxLqKʴcI|Id Ø0>kl8!t-W {l<}O\O;NSS}Mծ@%xg;o^ [>xs%E*r#n!xl=}!9yHQ mQcF,= 7=:VpfE-'pDZ( c_ּ\e܎f$dH&}rF=eǚDmHamO =ß!VAGZk_W>. F&zQ6Dq4Bab(,}l$ rle3[%.ɾ̏c_YRF `?'cckIa.m6e\뾄Œî?NBF~ΓhNhڅS]uѸWZk`䄕XPmLӹsʹ>=8&RG2lȐywCu@7WnjmfCl%V!mF%{qVeCXV^ᗟ5ǵ` ]οiu}st7/*N ne.!>e粦)Wq[=6ZLL_Uzl<*ї êyj lj @J7k+DWct[ZcNi|:Gn_ZuVmP3 lkgt\4]i%^C}S[8}x = 64{a&zA=LۂjAHk  #o$VZ}l =] *x j=1q7Pk کjy經{+W{6Y(Zz7^3&n[!:z{Y7k9oCv~}MKy/ކɪg :yo%oKyx}-iߋwxȾ>|e;ܿ~\_nKRr1erUsǗy@g9g=BVO?l*A] wיw2M&˜~A~X…s42|E洘Il|xҥs^ܓ:j9[ߌ˛2$%Wȃ\~ϳFΫpS02i8WyKg[hжxFs3 (6, SpDeO9nMG܏6Y%SRv];nDg'Ǝi2W*F$9V X(;`1'>oޱ7 :Mk'cɉkN\[EB>5qvJH5k,\!̠Z9ޮ^D0 z:0N3B.abXYLD"BF)j*E_&/v1T]\3$ᄈdurEWcv&$ijgP۶V| 7VE^pbCt(>EO&)8*CN> ȃB_ sϱQ2ipV QB>yȠ2GWbU$fi'g鋋zR@va@ω] 8(kd &Eh?x:WCIvQNL`ѽaU5W#ۛz}r׋%{Jݳ/٧=~8G2JtI+s+c^*-O:}M0š8?^]^$pI?~LNχt~4)@39ƀ--?HL "-,_RCc Tq˞CT& /Ui BVCqB;&XL0 6z\0a\ EG d_X0-E1CF~(Vvr^I&%MAuT[%0UQ ,ȧeiUr: @IM߆]h%mBʵC"/5˽Nj7KxY}ԏ"Lt)mЭQnl?/U>z+ _ו/&_IW%0֙2p%zuQ--7?.h)<筛I+^=ODNt:虘XvR΢~q qWxS2*O%n&d2/>egzoH$-X _l:δ0N^W`8[=.igN#g3Nx"?6_?"0[i7ۚ{T}V`z!FiQ˴wB#6Ni{?x_*r'L\ =oqi3Ll"y1~,-"CiliCó(W-&-57; |g(Wܣdi:AQMf3]dLB ٢h$q S{0vf/) q,V3FV͏Cn|5L(S5r_e.CXBQ/?ݰXeIm^>^H#r[-7]ȸ0^sQnkF^e|/h`S]LAUOߟIE)lLAꪬۛJs+q?x8P=SV0MUMs^/L{o5l ӼDFFallRIw[Z[1nAhyzZ=j8s nuu:KI5u,0J6n*.>H{ u&8Z"},εx էazШӻks UTA?AYP}k!#@)mϻSdx[X5/-־+-G#~oW ֳY|}!_mϮEm͘ owydr) Aa˹KL``n'dmPy gU؍KVRࠗ=yboImcs,SMH*:g|p)9< ]zf'ta)G1%IY! gs^zHϩb~!O>/+l<,k<&58xAr6Nb7$5fc7+R0I' 'N+8 9vtU2K}O|}G=]hౢ6'}ut0W0kotgrYNwj~$8$ >5ޚN|i 6<_\YFN:kIQ"3l+0!-'. K 9}za_W0!戤_}$n o[F$heqʪi7 js|J7g'ӇB^"NN5Ke&nB3NW!pĖK>:Ao_Yu.٧A+ȸ උIfQG;yL&l,s2p_9`wdU WօFTP\-ʼn#ރ<_MJ 6Wb7KwWqDAkF_~}9yLǫe*:dE=lǠ(+T;&;|=2/m V1ȠKa˾ I9nuGJNWt0vߛ~M^LlݓO?g'Ld:|cH'5?U=OCdb]6V7+s"B{پm;WSd$C"³̹UYnBuL1qqV^8VhU)G)ҧi={cKHT0VԦ~lڢۊֲ \\ Ceh @fm K6ۻՓDI[R:}Y;)¾i^_l#}/?NHz`,U|~)76@Gk?F'T_LCš1mrz mjnJHBF[=WlHr+?7FfӖ-SN?^\@E$AeQ?y JnIڃ}{6JMWwȚqJʂW=eLP_5Qڶv6o(v0H_{j3Gx(~0Wa\DŘ@rmsڪ{Ռg+63cg^zR~a{h~(+۲i/ H8=7u7,=HE}.NͶㆎS$QAiӷt*0MKPlIsbs^b?U{iGMjJX< BTK~9W;K j~iK9//`Q|N06 >!|O79-KA!,sQL QV&ZTpNoQo. b-KePǎ9yǡ|F}ST=ȶ$ڔ5`qN7@qeu~9~h 5z޲M:/z̽kg1b(FO! l?x/x^,b [f=u/oO?!FgKcF!m"31p⭣a&cr^Tn><+΃8ʋ~aǎq<9S ?`T=ϼq0w0;(s \f^Je"2SBEb<VM6 G;/ۻ@[+~N}^ㆽo?[?tnY}V8jߧ]Per;ٛ@{:> ?2 鸮AW-8jӇ̎g ;ι>{3mOG$kz2a=)&cW0 a;+SqJќΛOpt@#&]5a:_Zw TJ˜|aǗ@NL70(.vcX2>oOGfA @}ӣ)m〙3i>&D`$h+7FYLqucVߐILhO Τ /LP-W8qÃ$?}sn.T˔ $"&A=V.qt'.3P+?&NNDŽH0z!}6Yl诡?D6W0D_pWH;A Y6+v*& P^poB Vr o4t |jOR_dߧ} ė.F Bnw۠KMt٬whiWM1D4aD#jE.>6w *eEmhKG*rm 'K.'ӽO>ld{ߝ?.wCW^b ;0E9r^ૹ@.mgଂ'(^)zn>7`aˆ#]i9~[,Z`a RAʕ@'p%ٔrBW*E'Gdu!9;} p[{Q%/e/3o,XCUߖWV< Vuv+XuT@ACkg?2Hb|@LodgÀ[el ->aMIg%@`\!{'ª!}X>6ޱ'ez^7du 5l N*niS&T,%7ۿ) v:2u UG^Y#zo~@nZu(&@~B yjSㆵʚqXH:{e_{|Ci]2^y%YEZ+,a=ꔧJڣO.xz}?s e͒J{M_=z{J̣1ǯ8nI7j+c8hwE,³^ h\i?7r`O4?q_N~9J_&1zueJ-? xAsZ(KP5%B"Ф}%g7AG3nȵ~k9ŵE- K‚\}8\ 6>e]PrOnt|C]Bs֛`d1Crڄ\շ[_MO^s2y{;lF`V3Yf'npO&6&ڿ0+l]uKD ZR?@y3`따=.cY nĿ~ǖlqVXOd?,Y6Bㅊ X. t2,GyZQGUMSw]Ϧ/vY.dw _ ZZ8-4*K~S9UTA?AYb0hY!#@&==n}-ߖ}~䙏rS٣56s:Oyυ_^9vC6_lI/6뱢cF}Uks*x?C=|à h'?$U/皅̇|Sw`1YQ(s__C;gc 9{oiӹWt#N2G\/a|Μ7t1PEgDYN9{H'?_V؈-lc1ON@vv Uk(":JMۑHpuXID `;aM;k?ҁ! ޜ]䊉T'Gnx8'P`֖O˞33d lp(6@&QXWP &_AW!p:8:|.G`tp\2ȹ38!缲Č uδ5T7IkMh:4jmN kV-8;=W`(cc#:I2'&ɏm6R 4&BľwAߕ"ڦve$7m&8hZ -Ȃ 'rRmo@hIlq_4}6~5+6ݮOkbϿ`߿=炐$m A\y=џ <_:ԧ&X؂UR6rM'A"g x3yɤ &,%plY} |ULɤ6z 1_CS:W$J3P~$NN'V:'B?ݎYQTox˪b9TtpoR==hEmF{J$nd?]ܕ8WbU<܋1}_io^M쾦~gzNadg?}ŏ yN-i^Z'<6 M 1` zFq'_⍉M&m_;ўUNe97JZ+y f?n v*-7~# 8Wva t%KFG҈ EYX[[ȇ "PňK{ȭNBp1,݊w˒qHMPU.ڍM:r8rf{DH4+@ <8UsۤW#G5w9nniCS)NK'YHNuZ7k]&=DޖdewG!!\bG 'DY8SJ[Mߕ j]>XΫs{~mL{^0 { }Օ\Ҭv!4Mke^Z1$\V\ǵN: Fvg(GNtk3 uʞȥ]^lqJClpq"}li'}@Qoo5s_ǣx^ȃ>D̫*6!jt ICak4`1Qq"[2Ko(O`,\>ڈ~_X^ b`1d1a{8npN~}FkCRli'њJۺ3^S}$!CYmƧ/\M$3|y,== &vk+imG5'N42,uplz>O#,أ*o Krdex\ڵi:}dXrXGDٶ[Z&V׹n뼋bJ.>5]a9M-Gb>[IT{߰%ϨXovxnuq?~ aK6v/Ru(9T|ӷdCP2 i߉u>0s,׍!+E`<"q Y9G\nx@'{C5$.,Б{?=/{q޷׭o:?_>+lL/ODB, 2+&b(As' &A!fҾ|+y{ +,vRN3J4YZڔqw2Ӱ6D{F0I 3LPwW 01st˫_9ҭ.5&ALq534I@xBIXA8D\rhhSi^23)l҂;&qFO„L1%+6z{}x~%|B$$| 3 lV|(ma :8oLqdj(b+^8La:jS䡍 8TX{h'cfM6l=9` 2c?|)e}G/]q5M|Ĉ j]@ʴOX>+̑ C1dh2PSA6ڄ}oV(dMm Kj ڌ:b|%k^"#"4 SJ"kYb8`*])m7$yE z([FL0* "Š>6'xч?;ɫoM;N{&va_q#?m=U{sb"O&YG!#kJ8Hm_ h`|Vn}H0MTI!@w+Bh F!"IP\ֵG$[q[|~ٖzlUO;T`]Dei_RO!6y+\{"My IyM^ޠyP7GI_i7[V;:W[b$vť{moA1|/e5*8דl#\5 ynrעXꤡؔϿJV)-vMʮ[2v(9'CG߆dt.͆!<Wwȵt➓b_7ĆgiMGWS:SՑ{?(ԶUB8gm"O1 mG⇶ѡ8Z kGUm~hƶeCiJSN՜UOZʱ/2S$dN)q!}~md]c&MT&ԙt{RL=h 8؆Iճ̣}VTD7$}j]ۼW@ I`tkOLX4 n}AGޒAz(kBrilw?7AnQyټp8ݼA#ۂhJl¾Eoǻ|La~VYUGUR ; TͿmQ<\X7iбO2'569 naV5 RJ/y5La,$CxnW*]~w=H6j%U 1~#ݖ٦3p Qe!/Zm?HCբK)e1-EoFZl+|!۲t5v4c뷤_ZcGmu FcL5/%\R,ShqQdvmudݤ&Me*{,?.yk{{K{i僲>ܗ=ZGw=V<ޥ>Dk>IzHw^RC_־kYRu9{e\}۶=."_?&X^Cs؇K>uo=b'nMz rhqN'ߩ-G1øns?^u<ƛj`α1q<ơ\(ae.޾5 TwR5/lsHKҏU2m$nfS8'vEg%U|Z< ^VBsDZ6/{q޷׭o:?_> o/ӄDJI0Z3t78)]=IoaG,A׎Y7m9N֍@5i=?2th(mRim X !dؖ$EPlN\xP 6:BPA[X/-vNhMoJP?q /1+DBxKN={>HlyX(N˪ B&ް n9Rqa=X%g5-M|RQ2lr{`]Xf1e )knH(.1`?ԕomVAUu+\uϘ.&_Jȅ,/ml$A(7XzOC0^+=& o{m]?r'=eA m<+-_hxh[7 >} ve@[XWUHͪ;dk==iNq߬dB/dr\ +`>{ef` 3W~n[^Gxm!?xúue @W5tBE.BjKjuﵨWjRoۨc/뺫[XEݽȭF$ @H)#8Dk » tQQ.Y)bY7 (JCJUC>C׿>!e;E6c#64 û͠,XN E TMw̨7e/M)͉uA hS Y%W2\\B[*488xμ?p)6:[4RHq/fu&RM?x?o.l/k ˞:&4~w vnWG%[6m)4=+[X9RvSWwqFHVִy]oyRtnL#Y(JVխhXz)xE}9 <. tYvYWg:qBԧWӗfbgÇYLkQ_[ָyYfy>`Ǒa|@o™V`.gB/8of|P<Cpn[ 7Gf1jsw[;}}ʹ;Hq"c}csj;?䴫a"INH? Cyi^7Jx ($_99vs~OKvxV3rLmӝ=a֏7[eswGvyeqP@d;N:1A|'8yBAWrS9mbAk;a Q  ͍U@IDATOex`0ס,VcK_BGT^ushc:h\"?`d52fI`b(A_yN0[An,dZ ֡k# fU19༯!uzyGwҲ 6RV'I0 >DE&Y _ +@Z"B'MQ^q=L<ƤO@j;323h`+Tb$VPy*C/ ! 8$8G7c(>"΄&r&[vF-:g|x2_3AnbAVxE2a&N :_K udj#}tuCm i$! :VI h,&/c۬B`3Ť|׋p&MJ/3AM. EM:V BȾe}>9C>6` ;dY9njr]o4yЪqI>HG}C[*ijs`sbJ$|@r W7> +m7?~mv1tJcO7x%/1[US9nkiǘ-5tJp4A P +-pn 6لYa;mƾn؆,Х:{.tS/>\|oHOe`zu$DFБI+1򘜢 ZhkbUw 8C?եśv͕ķq)VݱWcl CO(5IPP kw/[[ѳ8O㓘\86 WCdGDFg|79s]n DDZEWXڀ>il}cePln+$bUO;z72W4˸2>cW'ݗwJc7^;>919(cq W+c %mm!{ml]!VЀJ%SGK]AҔ9iWeYASWuElca]{UH$:fȲZϪ#$rɵ8OP*>Y1`j^#vJ2Bq[{8lU[tl+rmqir< zk<oj(_:EAcjt{xt+Yܬ-**SKbŶC S>NnɬӒsjL *R΄KV0(`6XmOʃіBÅ:.I4r1R&J}ឯ.۶ha%F6>Ϟ s/{s;npUhݖTەOY^0+|]xvi$COdaRUʼLwy*[8>Uǣ62A9pૺdw BJ:ofUCҨbCV$]ɟRB ଯG4ߗ?hQ^hsʶݴ_JxK3Dڲ>^6ĦD._wDkgk)??|Tcc86L+pCux~*_c=̹_o]c [}cƹtu7wyms18ۦ~U\5s=gon߻7sO?=MLw94?Dz=|7PV~޾{5}zkQ́9-üӦ9Y<:Xor? "sC9b\$M ~qIK_a;hSc?U~d6s9FvKuny?4.H

%c5m\w/9ANMF%#CVP8L/%8$G;ᯖ톣F)wC9LǽIb+{$=x?mǑlʹ j,a,EəQTA!P@AAYl HJPp ((( (.<%!6)4=ETS\!"xhō<# 8G+I`!N(WL+n+=6z1 _>- Z&2CFÿJ&08VZL&W3?=dx6ОvVlB_8̸^[=ۉy&ۮzoIӇ>9_{>. z6r^!Ѷcnw8Ĭ6FԊM{w  %8UJ֢]9^6'#Қhscҿ-&9Vn{LpvoG_ڞǢH\.ϧ#c'"v^g./kL r|HݫgSWtfIg`5=M@g]y~iHo3SQu~ s=wk)*V@ms)tW%@o-NׇTè< EѹV)7!"2[5 xo d$N K Re&e 2YZj&0ڣE9TEssC)Rtpressed.light3 1.webpLRIFFDWEBPVP8X ;;ANIMANMF;;CVP8L/;pH"n5#imj-`oz?m(Y8fj#turFubJ@ @$/"Ŵ2 m c|T#"$)Ra:,2Hz<xՖjicC7_ jOj~{dTl/B{8 [9-TL :% iA,Y?ݛZJoFjf53Xj [ANMF/1CVP8L//@ In#I>,a$6mK;=i۶={'~,. &%#s@Z:-m@X:s!,{r˞➝s?!4 I>ăX`(0bUE$ۗ_&J0]FJ9i߷A0*iN,䒮}`j=$;_{CL|J9hAU%k&WŠ6L}ii/`q *:~~Ī>IXÌ?0309~<9Ifq'Ł \xRdnk6 9ZkS {4-"V6jr襙]oŻ˽^ANMFh+-CVP8LP/+@  ɍ$9d=IpH"K3|3tGqAs4l1_4KLm-oGwQ!LWpp,WTx,/ LWF^* ukpC5 ܡmwn@w2|xJM%gU x<1|I&dK^IuZuԸ>P%RAj.Mq6\W6~m4<%u/<^R,5hF̐ûbFf’>^Ů" WL3b) %[>7>^#?ǝ۹E_xv{2.3.webpRIFFWEBPVP8X ;;ANIMANMF;;CVP8L/;(dY#_HGJpF#qv^}^38p#IRlecX|y;ɶje}d\!Tr#OJOxRv@}3uEqt/bqE[:C@K$.__DyGKH6hBL%M  T*< DhOf#*A'4jT1>/dD7Is_9imS޽ߞ՗n ?mm,ߟ1q;,@I &h&_S!bx}o:^}>ْmv >>!;.N\q}'OnX*- %Sk7u;vFG6z 3-U) mDc9 i7 ЫoC`?i/Dk(p" ( ?b?4:`.n_) לOv(|[N ^y% EؽZwCeK`^~m:\~cjD,10%[T Qv@D cU_BpE5E$ !qH^b$q[$^8{zo^*a.u@0 )F}P;>7•k p柳Fc.ؑ-9K:g$ja ?kvw+[pZ< ĉ G7yiAoɜ70iˏۖƯ|Yz~G[GDo= 27& F 7s\w-_DDhaoH䱩OΉ+;W(m-ɥ8ANMF%#CVP8L/%(mW9(xkA$ɮO q$Ixh6A;zZ]I1)ػqDҔj+Hr߅YO Ē4M mH`- A"DGDR` @B KTUD @ B_A!Hs˒O$, 44QMwR"fj6뾎o\Ozg֛--]w3l}vH >ml7{ff.׼眛l࿞D'@p/Uqc[z-[Hmi8;wNi0Q:t <0Dwvܞ_{ 5lGt /F= g )l)ݢN`މVX+:;/o^t؀ľ[c/r_t~3/w llx6%{t9%0cˑm?[}_`2"uAucĽZ )}$pn0˒ o'B*<z7%s3nP*DY}Ÿ́ḧ́#]"sܯ&sVӔ+꫓>K2Idtkdeclarative-5.7.12/src/icons/bloom/checkbox_focus.dci000066400000000000000000000037041476226662700233020ustar00rootroot00000000000000DCI20tnormal.dark3h1.5p.3.webp ../../normal.light/3/1.5p.3.webpnormal.light431.5p.3.webpRIFFWEBPVP8L/Y@/æ$G5?fco9m63?@w#ٶ.9A6>m0nS@P`;XI*xdO%" 0ҜHE Z : $\klXp"K  C[pxU~'Lxcɲ'ma(mH Vt^S0"̷}3LDmH &)!0 o4!L[&H5B|kW8| YEDBK<5Xb$-n*9 J&]8Gۉ4ZsřS`EU5uJ\qYvR,FЂuf'S1H3g0Y&`ôRIjzPO\(-MX`8猋<,aq#7 UѵmwBhPz_fsWGǏ?a28]]^rՆz&Q|/owxmXIOY%4H =eFaPYi3'HmGBmd΋_nC#r3#40uUמIdl} m(Y7]U@*ڒOɷYvp'HIhr662rOo5NFZj}Ex>|~&fu= |i#N >L=];ifm*@EnddSҭM!$nr4- `1VvBdۄFEkJ65}!Tưၱ >\Im6_) _c9TZ re6kpػ;+CKWH$lќB: O.jGa`(7HiTkx_LU߾Qo3˭9*~f}"'`w[-x+B$W o[aխN> 0&Q+T8|Z"!&G#<,{;'59^?΄HxLc><4V&X ڌ5343}NGOhrձ="(N-8@S1рg-I6_Biǡ_v2J cFEGJ()bD^ỏDqNHqKqTNs&zLfΌќͣ8Is֔L?Ñ %|/.Q r!PBq(FUF%NGqފ'UZj+˴WC\ Jpbkdtkdeclarative-5.7.12/src/icons/bloom/checkbox_focus_checked.dci000066400000000000000000000123261476226662700247500ustar00rootroot00000000000000DCI20normal.dark 3 1.5p.3.png.alpha8gPNG  IHDRZZ pHYsaa?iIDATX_\ǿe7$F4BJRv %>jmE þBShIBA}ٵ`KPh[RTl&P;?sٹ&3ܙ;~;{FCWҡ?-^WZ>Mdҡ:#?B5(r涧jkMKD|7#Y CPZ>-XW"~t; W)CP7"3 6;|^Tv } } } }jX)v1@*;-{F4* QUuM@Ն–]QQ%b=E[o-E܉CC߭~W1 XTDQzr=kDM,`Bu!9 ٰ4$I7렟?7 8ԭ|QUgDfj!'8}^X FpI7e/vV`p>:=o ȬAo> w{D;:eYnED Zbb~ޡ'>qF_O9 +LDɻ&*> aiؕs_gߝq<7eV5Rˋ?X4pW6!hʝ"T D8v0UlTUn[=ks=udR!k~"vveyOhEu٧v,94R:s߿β rt:=Dɽ}/)2ǖIi|x湵taw%`OFAnV[&^Ad+o| -n*^*q+6z\0>|{i F>uDADYn۸sn sץo6o\ՂW A+IENDB`2.5p.webpRIFFWEBPVP8L/Y@mI?m~Biw`B0!2f@p8@phi+/xFeyl۴3c۶ضq1/r |L"?6*6q EM~>/49=4<[j2gԬ.fUhm9NRZh?VCjbvZg需>:cZj^ץ9VY:uEhm;Z*i?TBjvZ~:Z8h\~u:{ui:4Yо-CS|l?r)O<[[+uT`w0?KڏUB;o{w'[b Wz}eB;sHyZН+7oO!(y8l$q normal.light 3 1.5p.3.png.alpha8PNG  IHDRZZ pHYsaa?i;IDATX_uǿO[iJh}֘O$xPZHMH$!%`FK}' *mjbP  vKCw{g~ofvnwSn;wgNΜߙ9Caش56Qq|g}K)6m%56K0m^[Z%.mnTKtk>a·y*|:x\Z.Ԭ|-p5ȉL\ ]df&b`M#`f 0K/HU}b,",R["⡦^WT1q """N"-"1%=Js✈ܴ-N?t{E]:YD\iphݦ=l)M e[m3/ z'vgd^^MCA bv2eY{jxg/L#@ \덭|sҁ bfVFN1aqY?.625U^sYo~yşNΎ]1q'ﺵ~Ec+XvD"ⲬM<28fGeFik;JoM(N`0"w>r{ڵ;ˆ"`siVsCu{$/]uN+D\a=(]z<ǾzDLxovv~^8y"m GN>/r+3eS-{0p odT$FXc0ȝ ݥrnPX eiYmAƇ3Cr*vhxH`0#o9#k҉ɷ^FUw{Coe8fԉk/S@S@O[ =d@G|DDͲz/Nh)؀n~φ7e,roɼ򷑅|m-Рt)eHץo-V#\ս ES9vźkMwζ|/]B_B_BwFw"0Ʀ\;b@.b 2_B,|/S2lpayl=)'AN&wH͔h; a0cZEQfuC295gVul1;軐A-Q,&!-WԞ.=Sz-nK?6:S^`:5$嵚WZ?5ܶ)Va J>UU_P?w.m;}z`#bw/oޚ-'?o`sy^UfJ &n;U}e89tGEC@J%g8ЖK=i(۽<ޫlԹq.U O{8eNG*k-W^Ma@9a#+SNKr)ގE$s7Vgf#G?x5涾6?̇!֖IqYz߱mp׆<ϋ(G 9W0aTQlb]cH. ڠ/}"\.2߹a2'9Z#&2'iEf4^(Mkޅk}+ZPm Mr$0iT^jP`!5 ?Cxħſ(GH+0mW0{8C#Fz`-6IENDB`2.5p.2.webpRIFFWEBPVP8L/Y@gmIow(+l۶ Uʮ$=/ uBAXBDXtqC@BDa`aѰxh$HWm;<<ٵ2l {> ?!gy,[ǘL3𑗨۰_lM9e '0 @ @ @6$ IENDB`hover.dark 11.3.pngPNG  IHDR sRGBDeXIfMM*iIDAT8c`فAe~Id9 6#slle? ϋ@ !$;v6v},0M cd`ƖSG9C/H{^PQ 5L0`o9li )bĆ 3B1n1Rx# $"ԌHD P27AeAKr  bý _~̈́+ i^(Z܅l*53 ybT|"4XT B!\ԸIENDB`2.pngPNG  IHDR sRGBDeXIfMM*i1IDAT8c`!0 CT<&tQho"HIENDB`2O1.3.pngPNG  IHDR((msRGBDeXIfMM*i((zf?IDATX X=KA\LHbeccj@D "E@{FbBBH!!h+s!ju<5X53o޾;0Q` ^G Es|3V5 Xقd|GN:6 = 06\1Awb #¤[ش%WΕiCJ0 ƤG%(7%d'oC0EQor(U&Q_v`xgTXTNƼ8sLS/TNX)' _ rlLKV]X}$ 8R$+AE*;Ҏ {|S6YlnK(H+vl<:|-APNnB5ja2b1o"36 COJ8Wc>IENDB`2.pngPNG  IHDR((msRGBDeXIfMM*i((zfTIDATX ѹ @{B+K¥A @@ff?Y[DMHÁ< @>O2>"IENDB`31.3.pngPNG  IHDR<<:rsRGBDeXIfMM*i<<\eIDAThZkTA޹w &`!&h'mLV_ jQ䂭 vj"BBB "&ޝnŃnݧ6~}v߃c DQ*@{ m܇#FcȜ3D{YywX'O֚'88D6XckA?XԺ΄ gw]܋M|Z=Uu+89ͼŏܑEV]̂ut(>D->S.龄gkJ]d=]m8tdY`#[Oo z6n560uǻn8fcnj1^=?럙torsi0řs->f=8|zj,u_=+RJ( \~ !~Cv NP{}GE۩J`-om)\* JXPLZSU碰A{%"0>uVV'77; {`$Gp(13Gp(13Gp(13Gp(13Gp(13Gp(zS!K{ X*";|u@"-VklOI|*+U%ni-2s=k;;$-kٕ3>mgqT*aA..gO  R ]j7wY\4pST]daYmX.)1v KObSH0aŵs=%N-tZحG |}?zPM_8ӻ[!iXKf8g=׿}G DyS]-p*IENDB`2.pngPNG  IHDR<<:rsRGBDeXIfMM*i<<\{IDAThѱ @q \q;0(I^hM @ @ @ aneܚw#"3߿QmBI @ @ @|,' seIENDB`hover.light1Z1.pngBPNG  IHDR sRGBDeXIfMM*iIDAT8TMN@nia! Hą+xgripх$ XZƆq$}ײ{e/b8%^5'>۶\,ݺX+'Ln0 BcD l J~ov871Yyq?  O< - è] >I5+Cb$C,9~TgY8Nvj[#M&s0Q5P=@l[sULUr*1FL z`)檔96h<2\!­5oFP`#Nc5/C$ۚKM 1Wٚ2E+MPG ?؏F|>FQ Q)tݳjkNBb}XfƍPbM?ǾݼIENDB`2.3.pngPNG  IHDR sRGBDeXIfMM*iIDAT8T 0fd1Lt:}`Y<|a"o<8ȉ2| Ngkcd ~܆cgᯀzKi_777֤!~t;;[383qZ<6J?D@mOC؏F G^bL&ȉ l6׭cR\JlrSK>??wV&NX,6)Rù ܓI0!kZr&!w]^^J"'d@<,sa1Q܆ps_\teIcau)A+8KlqwOda@$D )Ec"&s; jTY/Į0 a)/@RDj|_S2R䮌JF*"P(]1b$\J1u8N}LC`1~\-4Ir jU^y5ZVהj`અ!n_ϨSVTBAz]vԘW 2_Q?h XXl@H!~ ZBTn岻#fwvf޾ Q"2 FoZS*kL=t}C4l`r8#-z*Â<.|q nSsÚfn\xKwA9GZii`woNL4m3k&c1_UcAI^Q{ \%=sr]dd3kF( 4&)ds)Jw`)N璱%c?huֳW#3 FC5 e ?`d0P_ rߪTA'عس|>lpdl.@k7IݗSmMF _GB-5'r\2MvtS֙Isb6sfu1#%g<9|Wt1"hcwpd9K~3D=2P>t IENDB`3.pngPNG  IHDR((msRGBDeXIfMM*i((zfKIDATX б 0@t&H@G @@u?+sW%<5pB]' @O ?qAIENDB`3 1.pngPNG  IHDR<<:rsRGBDeXIfMM*i<<\yIDAThZKN+GD d,dD e[*"ȌA&oaB"!@ mӯo\j4KUmwR4 f`4ɝt?ǙǸ!_A!m^\\)1+1;Ϛd$êY(lV"Fb%f`7a#a~[a~N JЉu&>V6a7a 9T}Cʨ>;\V7PG8$5j#ώ=sj3B>L߷9o5~QWC~1F]t݆60Xr҇=GczK9,K@vt«~AHk.T97SfR:aGw#)cc 6^a*K@Zr@3u$+n&\ϭTVwgQm^7ؚud|7.Mɛ̶qGp1zS !0_==|Rn#uQY8aAեAzixic0~#Tݍ}MȺlʉ{C6n?pV0g39pJ gn,L[ՏuLU^3adâܵ4."}ɨW$OYMA۽G?c`,)Β!+CЭ2z> J&3\(VIdbh AP^fEפ4b B [KrIVXUޚa!}\( <=qic8 J3iAΦԷeZ44ÎE*@!T9Ă$]98N2}e~;̢۞IENDB`21.0.pngwPNG  IHDR((msRGBDeXIfMM*i((zfIDATX XKJ@MD0kOtB7nD0GPܸD  \+=HBR jIWzL'yU tOd1|~0|_VI6x?W-_/A|VY8%7E¾7`N-kŨ\_HXd%5wH56o!9o3t_5i)B5_#`|ßѼs&k"I */N1ckA>JqЕ-m,

ߣ_d%5Śt2zDe$? .l7 dl#"sֺ PdwCYMRa~кV$\%!f[z$ygMÒ(a.Zrd↰G , ` =L( 1CfDlp,Uxb Mqi)gN^vdۥs 3':w^JW8sBs$*3r8,:QĮ1j eȦSKBأ-c]8MgŖG Zmn3Ag:$=JO:\d h]$\ց0 )ք@?{Sÿ_t0Y}m?tK*˥[Y.u튻PԄ9(Qš-=f¦ƴ {'SayLu|QoVÖWsOj:y=}\z4W_AڇOπg3P[}"?IENDB`normal.lightG 11.0.pngPNG  IHDR sRGBDeXIfMM*iIDAT8T904G"q|w4^@  f&xzee:\3a811kxK0s} ѡ*d{1dt}^ԱzHӔJZV=9QE ۹5_CiKIENDB`31.0.pngPNG  IHDR<<:rsRGBDeXIfMM*i<<\IDATh;kQ#V>bam HD,-;A V6,ZB_MToΙ̜޽`~93 @d 2oL w>WG mއ R |?5U&(w6U>кعWdkëp!ɧSp3$`UV uv.ߎu>.=ضq*&m+0LoOO*c?o'v0Ԏ; ]| -MBz@wE~%pnc\%h_Y.J޳oa` ;gnAXKC /)m+rXuB2)߳stH 8mY($KRg.CfsV i %~0QR]PTP3[aGYuH X2'Lbـל&djFJ\R|qH xMj.;@(!Y[Z43fi5~:,^aa3h2y *5j.9,) b܂or^{555֠}f$`)Є:<ᘠ]+VL *At:k4hjD3SK@=>܉'$2 Dz[]{A IENDB`pressed.darkt11.pngPNG  IHDR sRGBDeXIfMM*iIDAT8T=OAݻtw `b,lm-/4& Pǭ<2,&ͼyvZ~ݞtܭV,v ,I\~ objZA^7Ra 0Zz6܌F#[V{ZʤvQh`y~uR~oE=0Jh\ltٸX,ngft: p:&= 93&Y 0  $b{_uù't #޿)1z?JGaIz陧G(Ȼ&yG,gI`Ď0 mEuE8M\ @xU+ES^p %vA `u~~mt> RJrl꩝T"ܻoΪ2~ UqeeſQ VgCCC:<Ϛfl72mmme;!Z c/* `QE9 l611'Ia(. 0[8Uq$CEwvv^paa!̬|'''PVz0݁V7cccX43>~RUIJ p+=ժάiX|?8^n 9 pN$7頑YE~TIn05ob;Ȟr\r3ؼLTVIA# E.zvaF,t$adJ}+j#˕]ueJ.]o,`ԃ9 FJSYL]ʞE(BQVzlnQ\AvφNc9=|/iǮ 2'd $[SNM6'6 e *G`G+.@#/(c/7rF^礥[HvG?da$@;M}"_?Q:z,zK,oxh?3<PQrF>bh Eo ?4@Mt2ve:$؟PXV-dʮh8MV<-Aߠy7>Q8<:Ȼ䦏0h5wnD[)ztt!I1&ZFRe"]=== kW>T ŝ |QPosu7g_xqT&hu/7LۊU9yq1?mENb7*LNNvppQ?0)$Q[n2Ks.x @~0-TBhو ]@bX7774xzWykn =i'}@٪ޒ swWtV(mlN{{{?Xr  s]:@Cn%M]XB0ɑk.GsFOW(IENDB`3 1.pngB PNG  IHDR<<:rsRGBDeXIfMM*i<<\ IDAThk]Ö,ّ]㷰1(Bi4)atT@2M2Id- $@l۵eKduw^Yp^}qdO~YdE?gϞͭ>|E򟘘x655299hzzB\]|Y+utf ^>xr ow#j]}8}^סm+6UO7~wiveRo |eQ>Ԏ=W`%!p4'pr"f?$cr,rs p+JH&eh~_يzʅk8r}޼u$TTyRߦW?vjIo7 ĞNxٕG~m/7-]м*(w:|eKZ_2ۉzQegFT;j^JGyPцc헖&y؈:Lr&=qkxNG+֐V k)Ǒ&e^tY2$#x(K񧴗ie"t^,)a[)^e>EK}Y0ndPw/dNEoi_+/)hĸ%KpP}ɱNeΏGo,|2X|}X/Wgt!; u~z ͯãODw#e|Uט] *r^%/^6Dv#=x(KD)EK2歀 #clG6_Ӗ'P!/ڗ;/(+*leWVz2A,ԗ[O~e:N|N6mT9? i˳p[@U,yǥqtVঠA-a@})B˨ Ώ]Ik#pI.(2|i6wxr:LrѲ> 6&r^QABPCŽ'm*}'J>z182yԃ"tJT:mPډ瘘>̔aMxq٨8/S9ߦ//}(01s_ d%]ߙX.`uLkg?=[)]1!c!5o=8:Gr-tݻwSN˖itg1 F!X ǭ[/ENPCS˖{QXrKH^C_X%|ֲ 0A&Wi\A|."E 5Q7k,#/(W,K|I!1X\*+` 7̊BdTh-Coc9||DLZQ@e"P!CPAfΜpB"OFyKӷ3Hw 8_BςK=`56do7S뾗yqd%0r.&(Tt8^z$R@q)bي|L 54! HDF!gxEP]{w(!CV~ADӗT04.o" WKG eޫ4Mc#MyǔLQ.IQ6(3k]p+р\-s,E nMO[\BnjWI⛹XbTdWrtc Le3zҷwR(A7s/LỲ?e8AdFi/;&g쾯a%co- '#-@:c/>n>^`U5;Jr?7.C#kOzt#>÷-4AğnozwSZ%L꼽֎(CpZ,C's6O|rg`t&8 HWn;]ݭ[S5M!Aݘ=g.ǣ-T vWBf0>p.n;^G9GrU[0q$iq1w?FpBIENDB`3 1.pngT PNG  IHDR<<:rsRGBDeXIfMM*i<<\ IDAThZMdWg\H@p)7.Db' 2"+ݘb]e!.d4 Qpg#CYiTuuz:ֽ?Hз9|*S:Y:pց4Io~wWmt u!\,SG O4nCb _ͭ_y]ouDݸ֥` ߐcXsf,Dr Sfm[\EMZ)|{?,j9/bͯBӮ ZZt iLvRl#XKxοiy~+`ڴ/ pS@\} 6_l(8YXB|NV&[K:qD'BqRWOtm=Iļ.ڿbۆ.HbT]9L/Ӊbaz Ԑ(hڧy~OipmAcALnss3lpm}K)U"DqV`jnv> IL+ 9F΢z!"/bWO\2줓 a}c]--N4>`6 p*B+ВMwUPiRtG. @TW=pRYh'RcG ~ccCr-#"̘z]xzata4ڔ,dvXBv_ bub8c4h`*brǫrj7_:S>ed%WK8r`XAh xt\؟훽fN wM$Z(yP3 UD">ycx>#5O"pC{OFKPh bQʲ*NpIKoZ˓SmiB+e$PRkL.ot ox(#_Q[ GEHEZֆW!=JE~)SzGT,*G?sp;sb=ev@5{_xC#|nt6:/2\%M4Z2(B)3#@r/j]7Xm%x#kɐo+2٠~燱9-V!(y@cAaw9(3+;’mIaOxeIicN'S»(O;0/g-aIv4C? b[X aCOr5AۜV X~n[wAq[$)vE&vyYb!@8ӷ=)3%s ֆ/QX[[Odz'`z喅6N `cWo}oC~{޽?}Mq`K'㚬ٻEd <}|^<Ŗ2a WmUw`^I{|k^=^K̘dtzw׭hƢ!,n_[Y7g  Gu"joȤ/\|Y_6.sXlQZCޣGzڶNӅRv wA{Cd-@=O{ރ  If;ԟXZ@:jf%?f?˗>o>ބ$1<E=oo ;oExN8 &{u[ӶA](S]}'-(pO#'ZGP޳8]؞|;V3TIENDB`dtkdeclarative-5.7.12/src/icons/bloom/checkbox_unchecked.dci000066400000000000000000000270701476226662700241160ustar00rootroot00000000000000DCI20-hover.dark31.3.webpBRIFF:WEBPVP8X ;;ANIMANMFR;;CVP8L9/;砠+]4Rqo6Eܑm6 SQ#I1zXNŽ@|ߣhu6*G Ґ )}?̒ n/߈c>:X8Vm%–Dyn)Jt Зj~P1AIqD #YšhiEi꫘5FXf.%<ӫx/I \n1P g v>+wl0$I dXǍ$)R,k?:(֑$+٧;@YPdn.?߾JV\x $@)EA)UR_ݏy^(%?Uz,_9)Z/َ$IZffxN=!ܶ$u~mʯחo9С&Aec5DeKx*.XtNtDt*,ݼ[X QlbJk+&X'緷#Z+lYOJ} ^pP4!B6GF,a<{,{7=GANMF//CVP8L}// mIL2iCQ$IM&/gdж$YeT۶;C'I]^`<r_7~BUtTtuW'74ww@.H ?Zb=0E3l,JU[s38$YU wn,"0m$7г.[HìY{*\PBp~bpBq@DV9ksc2IU։WiYyAZUscsj moܶ#.P$_vKu'HpIe=} `T 9,="S=(߳=.wovԎ ܆$ANMF//CVP8Lm// *m!PC"=PԶ?ȩFAx4Hk+O mL*룍v$eÓ`j*~"5)~Gg P7FDȚ@2Xg,D_ML E?hlܿykk;T=wz*[0q|y?BV7ȴYj!?"7 Mö8Mܛė{Qwi=hXi3rcxтc An,hΠւI6qwzzoY7 ?7?G hover.light3x1.webpRIFFWEBPVP8X ;;ANIMANMF@;;CVP8L'/;u@m&݂pna*fsl;HB6RdxHA l xk`caOn> Yg􉡇g QgNFӻnw2$4M郎d+?)z;4IB9+~b2oI\V6"Vi^+w`YDM5؀ln6|C%5cVMְ3Ma Z}R(U=UV?1`SH"%$)pMr] 20ANMF/,CVP8L~// uHɑ?%rB{YNwCUuuuE8l#I{fNNUdiG?F­iFJsaڛgP}>o5-i^I1${|A!ak (a=ca욱>SOXpj$HbOHq.t8Y媒4[J2K`8T(`< !xTDaVGA>́?,`Q=fJ@G.HJ&pEW2ANMF/,CVP8L// uѶ73xL}6pN3FL!33)(w٪l3ɲH%Lƶy T=Sq&Bk]PZ[?_NtCaqҔ8?>~~iB}PP?~,>/5(!Epe9u!DxXw>޷_XXٸG4>=k݌s[0 k˸o+fz,z" ZFU#|2ni3P)nFkV VXUvƑf^<"+9Zz԰ Pb1F9$%>@搃f0I\+'&@kB xJBicJSюR8<lVD+J(‚EZe%Qi`xTUUUFB 4[\ANMF/,CVP8Ln// _&$GJYv{Q#I{y=UIrP˻rIRC0de p rhKPa @`9po{LR=KRaLRsIm$}rf}%93Cچ36I$wOr~}]vC[˙~\.hNU#Q|=tnR &TiIڋF.БHj:1Ꚍe#hU _qUɂc8vYZ2 8걌 8_})lj$rNߓ0=S ;!ANMF|//CVP8Ld// w4X%FOi0hɑ8G$9W$Ͳl[d.LTT(g3U,ThU|*ShPL᧼ A oJ,3 n?ⲏu7I*7yÖEDm(c![7}XzqW\]o¼ZN"nI3AL!|8svt>*kw-*Z8Klɱxnӯv <nс@~(:ğ. .$?O#9E9Kuy:ANMF~//CVP8Le// $){VjQ{m$owꠍ$Gr'xH‡bIݹ?^/s` d+> |E#F^D@9 &jN -";}8/^}jp$ٶwqHpw D_۶w7HkNN+~6]mͧز-U_J(zSIgv`"Dبc#"p}\N°f>!4q>ЌAZ{XsBphש1ؙt`eDw5Hr9I+~I~y~s ?g9N}oz%normal.dark31.webpXRIFFPWEBPVP8X ;;ANIMANMF;;CVP8L/;5@l$Iq0|w6$"E} |&O@Fnj}C}̋ܗK ,c\(*A^*ER[R6K.()l8d5laF imgVmX.5Us^^y{N,@w/w(K!!}%PvC'xe cNduB$i̽8! OyU W(>E?ANMF''CVP8L/' 0? ۶mS< @l AF=oE_۶t9KnpkEaV9sU|D#ܬ(Hs}uOш[ pI2Q>wG_'ĤGS*)ῗ;+3S36{?ANMF"//CVP8L // a m771m#7mMX@ ٶ۶z /SDD۶o$/~4Obz7k0?{c=q=N>m@9 [Qe-.uZ^>2t?;,Qf5uLƵؤD\VPe7P09&o ,KO0`89#IAwbBR?WRAUqC(normal.light31.webpBRIFF:WEBPVP8X ;;ANIMANMF;;CVP8L/;p6#1{D8mmp.BavH{(}6zϵNFYZ֋l A)"V\@pHw5hCLzBl522-ǥRMoѽ Ԗh˦m|s[XEP78@҄,֔kkٵ5}mf4\.ff,dK3-ANMF''CVP8L/' P۶w.`H>33Z͌"mg;?jZs2BF8=@GS1lH>3v/*dudfIe .dWY_˜Ы尣q^ 'xyǍPYؓY@Û @ Ǘr4#6ANMF ..CVP8L/. `۶$_Dl[m+WĊ\w *@) ոmIc*}'q;R`|ԠQKmHd%y$'|Lo94 f&,~%Km90sQf;p@ @Q(M"D SۑWX,p` xoN_mzPb>P;v?|]ANMF//CVP8L// `mNŻᶶݶJP^Hm(cTB':YHBu^+9_0RMz8"Gi2K,[8Fp!s&@;΁alzJaƵh 6 J; yIXkbr ÷,&l(;:F@o'b?~sxN!S|S(pressed.dark 31.webpRIFFxWEBPVP8X ;;ANIMANMF;;CVP8L/;Hmm$Z{ԋ Icq!@z"j۶&KpDw6{eI {4ߨ)JOL*G\"P3rjeX\W \`Y@Q~\ r }J@wOk\A")F]8p {QU:NZ] 1-j>T|lQ?1~7Eb(֢ܕ,t=ˍ֩h^Ec͘嶶 c5:wmͿΡ8K=8KݍSu:V4G]}T9J٢.W.>_]zmrCm!]#)?hWa jJq%Is\+1߇]YMyY+1Wj$o롱kRMI8K"9 ʥl\,9,LOYɔ.qWĻу GCSR5 |;Fj|teujW th~=,`v! 4%?ͼB7 "WUhatR f+fQ !1~cZ/HI&ϓVD`Ͻȗ Rx<0^|~:s f0E " A fL(&UW, nNj)tzrT^ uANMF+-CVP8Lu/+@ Ȳ=m^3^axD/ـZV"lvٜlcNj)c7o?\sd둭:mG+[4p;bx' mW{~t?#,a$6mK;=i۶={'~,. &%#s@Z:-m@X:s!,{r˞➝s?!4 I>ăX`(0bUE$ۗ_&J0]FJ9i߷A0*iN,䒮}`j=$;_{CL|J9hAU%k&WŠ6L}ii/`q *:~~Ī>IXÌ?0309~<9Ifq'Ł \xRdnk6 9ZkS {4-"V6jr襙]oŻ˽^ANMFh+-CVP8LP/+@  ɍ$9d=IpH"K3|3tGqAs4l1_4KLm-oGwQ!LWpp,WTx,/ LWF^* ukpC5 ܡmwn@w2|xJM%gU x<1|I&dK^IuZuԸ>P%RAj.Mq6\W6~m4<%u/<^R,5hF̐ûbFf’>^Ů" WL3b) %[>7>^#?ǝ۹E_xv{dtkdeclarative-5.7.12/src/icons/bloom/entry_clear.dci000066400000000000000000000013231476226662700226170ustar00rootroot00000000000000DCI16normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.lightF31.0.webpRIFFWEBPVP8L// WdQ )9p۶O ZpA kR onmDѶm-I{E tvArdz) %ϬJ#ժ"%]hP *A5A5hj)K?WvŠ]ʡ]CCDh Z;+Ϗ1dtkdeclarative-5.7.12/src/icons/bloom/entry_loadfile.dci000066400000000000000000000016731476226662700233200ustar00rootroot00000000000000DCI22knormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light.31.0.webpRIFFWEBPVP8L/A@ HRc &0 ,0mP7vF0B HrIGy,);pI8zNҶm[MQQ_F#'Ҙ9/PC!5dYH>;Ӑ!g3e"rozʟ1zB dtkdeclarative-5.7.12/src/icons/bloom/entry_option_arrow_down.dci000066400000000000000000000013211476226662700253000ustar00rootroot00000000000000DCI22normal.dark1e1.0.webp../../normal.light/1/1.0.webpnormal.lightD11.0.webpRIFFWEBPVP8L/@ HRD:+?.C0ܶ^pWm@NN^!tQ VPxbrڙWAvD6lJ\q(oGB1-2H 3,/Ã5 & &VV ozޤSqN9?6÷Edtkdeclarative-5.7.12/src/icons/bloom/entry_password_hide.dci000066400000000000000000000026431476226662700243720ustar00rootroot00000000000000DCI22Snormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light31.0.webpRIFF~WEBPVP8Lq/A@DmS  ۶ tcD<@ C3'H`HC8@IT"Fm2$)۶m۶m{&>8E$>̈3p6NNwMa5+/:&L3SgL lWf7L763ta:Aþ:G-3Tg55wQ}g 37 C*s,CtpR 3 >O7a[ dN>&x4I@6x|gX d O0ϳsʿtkE_5./r%(_G6H?~ 3Kr(Qf|y 'HOB]H:xL!<$G{R&A(?Z!b]q2N  2D RxdPNM8H$>)PXGɺZ @6^-Fr$w!s,BnjmF2+d˚-lNhg}bÎ"bvL躶*vٕhKIG52<]|S@EbQ 5Pc#o)JM1{V PQ[Ȫ"MN>%D3K&ẫI0k@?֩||lZFj2lFˆ'tžЍ"'Lg?z,e)kTxY 8sdtkdeclarative-5.7.12/src/icons/bloom/entry_spinbox_down.dci000066400000000000000000000016311476226662700242440ustar00rootroot00000000000000DCI24Inormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light 31.0.webp|RIFFtWEBPVP8Lh/G FRc~@JĩMYW4 LXP miV0zR>"?(?{E|~/z/Vb6x/]Jއ}XXo9}yuA#:q9;l<`#[ @_K"{hj-qh_jWL]9XQpqosqr X?U)rӊ~ѹWV"b^sƩJ A'?I`kMo5nsz-ۃx,>WAdtkdeclarative-5.7.12/src/icons/bloom/entry_spinbox_up.dci000066400000000000000000000016311476226662700237210ustar00rootroot00000000000000DCI24Inormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light 31.0.webp|RIFFtWEBPVP8Lg/GHR܆e<^W  ̯GWDuT%ٶ"m$EjW-#? #MCTy'РW OU/[0ѷO9]=[樄X9254A]$ݲg4fm|AZ1f*cB۾8Px ޚ,u#iB4LXaft~N$fgHڦft?WJ HS3WI\ 99)؟z Lu`Z߽'YiIDhݼOblw[6 Z]Q]D;ћN̷x'DN(? Ddtkdeclarative-5.7.12/src/icons/bloom/entry_voice.dci000066400000000000000000000016611476226662700226430ustar00rootroot00000000000000DCI22anormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light$31.0.webpRIFFWEBPVP8L/A@j`c%Tmv%q~U0p"IR>z/5@ m$WqUpKCA6gcm_wUV?D@/Cd[ӳ}t>6>6.>rBFTJ2.webpRIFFWEBPVP8L/5@  L/ϿDa HmQ*$&2~Q5؈^Q~xh7h ~za~ڼ@X@<S13݅ʮ@9wHp ѧ$3}Ajnx2qW,x?X8ĎLv1pɆ $d;}X)wӥvg)϶ا2~Vkkj6zk}JIqWֿ3.webpRIFFWEBPVP8L/5@ !H~I[x4 $n|~0z%WW^DMƿI~˗EҢTZzTIzi̲x>rYyw숍 Jj':-\('tř3jHIE&WxCIWL&t3И-;;l;0rz2w>XUO:shXjpKEQV/tIrcm^W䮹P$n?g_4.webp RIFFWEBPVP8L/5@ ?b m771ϰmJvOl݁B%,B!&@'NA (ą ^!mۦNFXSyf:fZ70K.0@DzE0}#ת]ؓ6p6+?CԒ'2O}J{`,۝XtdNڌؗ$]L ~gJ`45Rnormal.light3V1.3.webp\RIFFTWEBPVP8LG/5@ m#?q?KCAFşm#xH#,&'T*C6 A%H\iT^ ?H@@Jh߫7\-H$%:6,vGp?% 3}g8˛-ݤf^i0'J;C75;Jn.K[?۳ݻ+;L:2|_bZҏ/G Tc| vN1hLGS.4WʊfM9rYyw숍 Jj':-\('tř3jHIE&WxCIWL&t3И-;;l;0rz2w>XUO:shXjpKEQV/tIrcm^W䮹P$n?g_3.webp RIFFWEBPVP8L/5@ ?b m771ϰmJvOl݁B%,B!&@'NA (ą ^!mۦNFXSyf:fZ70K.0@DzE0}#ת]ؓ6p6+?CԒ'2O}J{`,۝XtdNڌؗ$]L ~gJ`45Rdtkdeclarative-5.7.12/src/icons/bloom/item_unchecked.dci000066400000000000000000000025101476226662700232560ustar00rootroot00000000000000DCI18normal.dark<31.webpRIFFWEBPVP8L/5@ /1? FR{ A`pGTą& hnA!!HR^ff'JsDmc ̟m,}[&Й=r;_^+o<:"=6+C_SeoV5?և윝ղs\'{4mL׸g;=H:qVxuw}Pw4+xF#cMGb0r?F 5|0i=N30x6|]90$ܽ{ #/O<.e#(m -PIZ[BdRȀޖ)|Ňn{VtDV(e^5Щ Q>X=Hj/_$ |Z (wWE; f wˆF SO!~{@bk(J[B TR֖2%,G `+[^]:5JW t*ZW*UoN֕D;JVk"f,ЌEiv3ә02dtkdeclarative-5.7.12/src/icons/bloom/list_add.dci000066400000000000000000000061451476226662700221020ustar00rootroot00000000000000DCI18 normal.dark3g1.10p.webp../../normal.light/3/1.10p.webpnormal.light 3 1.10p.webpF RIFF> WEBPVP8L1 /q@)$GRdY<(ţq/Z ȑmVgEC pHIcf8ŁNصmjξ7FJKe ͽg)@_39pX]SLn@]f'TxDqP$n\j|^:cVjL B(JT.㟓PP6 Ftٚk*>Ek ѩReQaQS6ÞNՀxNkdRjXONk·pNñ?!fzlt4)F?qX9$(dNi%NNg3]EK@ե"l O z,+ǰ`J9iRi3 aWZBX \KđR`@x`i퍝6*I~G۶x-=}˽|۲uk`!- dYR& ^%#!n\J) g/^z//_X|Q e'|0(ؤ˟^>!l Bn2jI$yitINHKW_=lCU\,WoO$۱$Zj9ƨ+GmyD!#8dfǥo&"R6xRvwj1,SSNA8bRN3}}*EIa <# LV+k,m.Rם0p1BqֱIguQ9!Y6 _O AF oա~.ԨjDŪyP[-.1EhM+A8phRa EP]ֳ9>iFj+E`$iFo>m mG#^sxRlЊZ:٩6n:7奲\:A->O(搮OV] Z1J+7?"– piOv{0Nu>OIG!oXe6 @oKCFۃ$@Z`0NC(m[g xpk@'G}04›t3离wɌ.yp{˻"sxNdwޡ`M~S o%Ŀy^D`he|! ;U9P \NYZ[@Ce?\eLFk0( B\HD,sg . PDtss.B:"i8fSFayPGJJحT4 z=ݜmeйK3S?>?ҦC]:lm+_=a-HBmWsHy'mzKc}YCϓy֟FcfjiaVX:sdib wDLhF Wg_}n|W'/H $z';[GC44?wYQ8h'XZN>FL< ]?w1B,_кcsRwk6j:uk#_۸ ٙ3=#.C! OM3]ljTP{s㼣KD MfNM, F c SiD\^\)`6%03zcMiޏtdD:EpEhZkJzLD(̜j(l!BMd`oլ͍=em&3@+PN܏ #=J!J +Nslxt$u-xmI `߄c ;pYHcM%nZ zmf@gRJ 8pQk2VUuӰ1uF74ؗI V3ljv{1v,LUse=9[fT,=B6= a#/TVUZ'nN60!bdg]} 0*1J)e+\;⼇%lRTw-bDD""U9.|d3; *ր7%¢%.dtkdeclarative-5.7.12/src/icons/bloom/list_delete.dci000066400000000000000000000053271476226662700226150ustar00rootroot00000000000000DCI18 normal.dark3g1.10p.webp../../normal.light/3/1.10p.webpnormal.lightH 3 1.10p.webpRIFFWEBPVP8L/q@mJ_w@۶mON6H[s~Ev`ն,c_ݽ AD <k!!  H?ĤB Fl -H%\06Eq-2!6BțaET6Q"|F::;FMfE=nVGt^f)7?ÍW\ j)lK:m|lX.6;Ro3e"Od$Y6Voc2CdHR@CRDaPh _%g"/#8 ;_QZ}zggTNחqx0m#[0hS,s8Ӥ0=3\J333%ffl90Xm`<U /xtopZ:4Y^Z̿ufUr2}dFV{S]!'-͜L (Rw5+.wR(a}OJ1b& fyiOA.هMGN$hL Ԧ%2.;L eR {r-}\Cʔ$6 Tg(/W4|2a '0G*Va0鞏jx)E(wvc\B)8`G4^/j`_.)8#hQd0F=7Sv̀r4bP '=5"NE;~'k|9 ?\,@Ōۨ+Eۜ&\廃mmbPbq|o k_C6j.6=7iDO`TqbRh64l~AO"84&cC5TihȽ *|*I% iWJ}iۡßcs"Xh=͆@u?09#TWuGǩ;1 SLZa*ὅȻjW9{Vm-u"{+YvYYP 7)gBq5Ae^e']}7,M^*둍+ˊ]\(0;F=_4PYY%8YUPgH;:[.ή^~~+IVgj (ZxN.`x! W=էp; Ld7D w@x^_a=K+W~?%j`d晈؊描@w:ߤq'gܺvciyE^UJ))9A\6<&ww:ﭙe#+C]ܘ]%wuvc1 /a{+ j͹^e[Zr]#Vkbқk_nnC+[Zj*Z.n^a06䢈S7JUuO[{, u+WCZp!%!uWBr?!X#KZTF8 Epj8a|d^Z3hO=^M? -Rh?[)6VxVVF|(x}S.zԇy2Ey _8]'w5<MwSkfS54|S\IT5d08#υBq: g'W5@ CǔK`xJyS6@{a18l]8l%AѭυٲGZ.]~٩ÿ.dtkdeclarative-5.7.12/src/icons/bloom/radio_checked.dci000066400000000000000000001071301476226662700230570ustar00rootroot00000000000000DCI20hover.dark31.3.webp RIFF WEBPVP8X ;;ANIMANMF;;CVP8Ln/;⪶mZGp BJyrv m$I]i\$Ini$)c,?7m#Iv?64w D }EUt՞4(qeYp"+2|s=E+G? *9@ˤδ $_1(I[5}bz7&2Ayrn?m;ye}EEM۔aզ:5:VDH݃7=[1Dzc.9瘹i1_=K%دZ3or+ ](r&qJ$o\jq_]S^;v}Zky{TIO/ tp+X h hy9&`ɩ4&g 3~͂[ {}{0|ug,َzewݍ3*1jlƢ1{6% c,ANMF//CVP8L// _*d's@^sxkQ$Ir tvI"i9`F 3߀9sZIvH(mGI1`b%>,-6Qz$BXi, `Z%@!4 Stu)f4)M7X)vVu' ݶ_ 'MLQ%\{x^I`o@ 6m234$5e3o?T+=n#)R |t>OV*'yc=_a21@p]@r5ߥeKȮӷy"efD8l(LZnzT.29^o;LM׍P*jHfȟƶ!l}KfZ/XOϺX4=`O!'6^5}< Dx={䆺& 1T4Nh̸Kubwܹ"g<> iESza[+=N%v Wv!u#>^!"I<"zҔA@e6M_cW%ښUW.3I[6<_$o'v(o~$q@<18)xSyP<ϊq:A:GANMF//CVP8L// ¸mI–܆㶍$s&?c($E:s{1:$[qw簜-pV()_8&о)?hB^~9".M K-XThM4pAGr @L  % "SXB=eca>}=+_|^r]c{Lk$IRܬw:vو3pHQr 3ѣ/|)]gWN!\+y:9 )A93_|zZn>C[~2jPrNli5Nų=2RRĚO-?,EFiO_V " rm^nUbo)Ky<Ώʠٱ::88\S5Bs~HՄʬ?% V g#4O0Xhpvǟ=#mDaJSQu"-FzYU>F>fBT^y3!Af [kP %wp>`\2B{&[Xڏ__w cq?γy-sbσ:yϳ<˞ǹ 簏ANMF//CVP8L// /8$G8Sj7D$)s kv6#vv9$YUCN >rY@AA(SA([Az:Mp EQ$#0A5eni\8֏J&A,t8ZDfFYUʑ0RIS;d97'Eqdal{3_sE>o~6 I5=m۶m3_ğJ%l #m#E=n%/+c}3x{s&ge߱2K4rGE%?#54 -}:] ݠ%bDݥY[G6W֤\vSRݵp3c-#fLsmKIn=`Juė;e*I1|Q0+::惑Nk`:nN}<+Ԟ|Q:'#xxӳ "c~.Y(B2iY6`,XFf2 j~EH&g|$8jM5sy8 5,f@vH24? LkPx$vC yPt|"t_qdvq?<'cv!)<]GįSuW[,zsDNjlE22.webpRIFFWEBPVP8X ;;ANIMANMF;;CVP8L/;58nɑo=$C]4gmۨ{PMʆ2).@h#JΏ"y+ ۻͽmS(?(UF7P g0N1fxq]dd?j2ꅬޏƜhdl攏ANMF CVP8L/58l$Ij?3"Ķ~y ܶm$u{*{(* mo  gWgres~8UDt2 u0IPhD1Qȝ^CB=oANMFCVP8L/50hH'o{jۉ !-Hh,(9'rm(ޭe4YH J "Ll6$wxHLaf!ÏWuUK,ap h V*2W0QOX_{"/g*ojhZ )وt&:yY1$J5_cANMF CVP8L/50hH'oʠmVFZɝQQf?^En6)ï[U}WE$$^: eroLz073Cʔ^SHQ}F$E4$Z(z䃢oMD( ^$hover.lightB31.webpNRIFFFWEBPVP8X ;;ANIMANMF ;;CVP8L/;ͨiۀrdVme~ȡ&Ўێ9pRݝ}^4-I"I2OjX^>fO7zcʌ 4]UK>5,6L/Rn=´ / b.^{3;nzi7#L;3K` ϜݾE_2-s̆Z"R#%a|2ZEYgGKH@e4=D E}_-ieY7%ɿfTu#l|$G{a{RլzV7ƓȈmYP4ӝ"9*~wsE_N7Uy'C~)Т/UKiOe}2P%3cj;.-:=8zm(iWސ}ܣ|!Q}+s0>׈8ȱxFduCS5w#{7u`/JY`6@¯&@èն?`H*~v@BJ#,p3sȝn^ݪ뺂£ӌ,LzoSؓzPZƕ 77Y(_qc\ȅ?Y{iw 72i$s0ҖYeѾՇrr7yHScLA0jGr8S :ߝp'G@Jn9%Zq)a:n/RsR+0N'ERZ(ٚץT{^+ lt*ψ@۸"fmgP_+iԲFЂٗC)Pr 3U^LH o A"Dé-b&3õ2TS1S.f*HW!A-,bF{]#A@hSʚsmh04fmo">aUgu\v[++f7G9Wjd60ʞ FYåANMFh/2CVP8LP// ͐ P gAڶ5Bvepwwwa:^+w|%ftS])$65*-:hnF:zﬣ[p Hr3g)1!dӺe˖%rr]eь6Du-rHUn6+0YnvkbZ&Akb[p2p[@p v\Q [+-)%X=o4*L/ dufhdCC1)BkZ uG'|j 2-[!6?M:z^yHo5,[S3zu*(jfFo[cͦj4Pw79~u:ےzm~ EAzubt|o˹?ιz`w_YQ]%AQ{rׇIvsG|d8}() k&9顐`^sݶ1WgvH,r9ݝ5?sq By"k_g!"c *|d7 <z@$Dpr~@S~s#DPU@1ylT߭۟ WrIጇ}!r<Á r I z׋F!rwZ8C0ߢ 0C@3 " "BVRM2ZzL C@.2-MJjHC$BmhD],`𺂬fˆqV( C@-"+ y3 "In +h1a!r $EL*cDq &(@ h@JR(x"Y4V9b,KANMFN/2CVP8L6// ͐ P g!ֶev3ލl`L9cffDйm[s}b>0trt:3333YztaOh-š%˖xp0faZcњB r݆a8f9YQ8%v9+Np§PJ $u2:m)AI@ R(SN**VBADQDBaYABv ӮYD $!JE@V0j/c^xBDD T "H\v^T 0,2(hJxU=ZqJ۴f՚M/"e+z쨑UyŽ-J^B:*GȚ~O3 ja(h7)Žt55#c4pv0Zjg/^j¾2=n&=z:f5bDſs[5R8:ѹZ6[vBR饼T%۳gB9U?KFR~vF&_p̞a~va̝p5.+CD:紈PJLGUGAB #Bc~-geJBnrJfNĽUxYƋ7(:}+< [x؄9 RaVC $pJ? Q?V)@{T_'[v9"Rt[{xMX=%DD@_ h/X.O8B$͌A@3g$&̺DƜQDABX9G5"@DJJ( 0Q< )Ӓ$m*LXcE^:2.3.webp RIFF WEBPVP8X ;;ANIMANMF;;CVP8Ly/;*d' !?&r:LIrs|S<:7lIr/v<Ilc[{@ |OSpdpa('iN$;HT+s,5`F&IԙDR( юAvւH.U?Py9+;9ɢk^S^:t=flN(` 0+̜XՓn)Jq /gɌde6{*/pq^W㨵wRJBistJZ^ISjeKu9oJFRS<uii:WKi8JrsH-jJןu*>.?|*XBKqik[E=ֱ.ޖ`JM]G Y݄OrRB1-*؈PslWӂ1Sb 1+ H0c٬}v6\_tp"y9bN% ",(Ȅ3'h#2\8IyO|w_n+܌[iz @m;m̑d?̜/cwW䶑V Cow}cT_} B[)]%Aqf`o̡Ǥ$%z, \#rSI^ĕMp\/s\ըl\1^B,g߽F'pQ`RwSzxW:{'6aQâ9X ȋYeƧ/#=; Di PZYaS &RFM1VM0aCߠB!8C$yy0'uٶil[?~tɻsW⌚x]GfoXж.IZƁoG8J6h*(ʧ@ FDb$(DbDGrHѓ|ogSkΆ\`۱OP.U@$I/fffnߖߣӻgඑdafޠY^[:cWG>U^ 3ǷiL!_{TjՐ5%-~ef9xMk|QF=yN)v]#exFb. 2{S"&Nޟ6AٴyԘJpL>EmZNx4R{:Z3CIG֖ANY[pg_V'UFԚĘHMey.t]pT.Kiy!GoGa*9ZQxhQ}'M%[4}2t,?c ftߦ!.t_/] `6<! r0(= ?3w;s?q?I8{bσy=s u9Cٵf9KANMF//CVP8L// 㠍$GrEMq6l3vI"k'PncVdITΏ]n>}w@ ~ o.Rx#`(o =󯿎c54"x_W ?\I% [ç¢0~$B4_ -Ll|<4Eby_DwwS]CfI^x{8mY>|A9$y}- 7@m;m6R,*3333337࿈;pI=7d.&!s_6@;3Ems.F8󑚣Y\Q:WQiXyN嬎 sHh$Ie"ם/=@8Nછ~ 2bt*niF%AC~ͧnK·J![(kdmmqo簭ݯb?9x? m3VO͘q^',)sO79@耧*W2E޶p-C_=N?H۹:_'luγ}*6$_T>{b {es>u>79 [M3G normal.dark3~1.webpRIFFWEBPVP8X ;;ANIMANMF ;;CVP8L/;m$9Y/q2l[di7ٶmضg9p_0Zzi+vHH ݀6s80=aޫP4t<1fS\*wny'`3RL@S!nJyW\iԘE\|S9* r IR}yL6mSo+T[3۾- VD  ȶ5O&, <D$`>w xrɉqŦ7GmOp$ٶqO9 #Fg㶑#Xmzk˲8-ʳ,neK9Ff(HЌ *1?4*=tDXظS8[,h[i:YRG%cґ=`:`<+yξ8$[ž?P"m#E1CQ؍E]|_$-.~MiݓrgBKR1zҧlGҶ=k߯nX]dF`vw؜IDgHS`K??35p"gD[t)&I_~ʏ_K)T iT)PʰVaa+a_iANMF..CVP8L/. w$Gucq|F7~1Fb I^ml~N)4T^)E$Y$^~I.:b /|    &?@ޤi˭ dN;$MCe򺁈qƑSjkIg-pZXY!z7;OU_Sᨿa拐?)Å< !~9=1yPvxhBV;J>HCa/b(E\'ZE\,"8ѥ8x{u8:HOdr)1%X8 #|x\mx.Xr.Rn6nrn.;ANMF//CVP8L// $EuwO^786W1<`d H"7_[ `bٶ1E8ovCB  @ \3BBň/$N)BtCD~6(ޓ-3΅R2oS- |} $IR]p]LGHYSߺgGڜ]2|*Ѣ[n@Vp: ~«UCƊ^+J6UAIՔO'7[2yzDr- JS8"`j~98X;8\80LaQHcG_W? >q#|Nf]0O U='9sTwD3.webpRIFFWEBPVP8X ;;ANIMANMF;;CVP8L/;#m$4O ',@@pg.r!F#ecͨw8d2FF;=&eD˘T#'9 ͲMJN'(s AΠT[SeKe)qPq,9(>X-eamx 5.z{Ns~Pu*ǀ ŐX}D$(YXC1l61p)ib_=ۉJCoOtEAA!羺vCd#~'h?D\L1ֹ$EGϔFn8M)Eeku]2ALW]7N2v]Iv>.5d9Oe.%]NfXSlJ11DoDiMFX C >4@s&džUK) ANMF4 CVP8L/7(H / mCmF_/sHagEdD`-mMb&<%TϠHD!!Y@9ל=mTK{FHGq i+r۶N~d 34UO8MdRHٮ8c?4Yl?b# #(*ED,-19=?Z! |/4?y3op> ANMF,CVP8L/m$'[(xBCm$gjO((hFv:4{Fd"R%7,\\-Z>ƹ}l; 2FD$"LV/V8 4mq7k]En6ҩ{Osd4F}Sh27jw/}kA5wz@S At $ Cy^:8,;}, sm蘚›w缷b1+L0'3ANMFFCVP8L./omx/?mm0tYAFuϟpm$IN% Kk6c>(c^l_Y?3UBm !Rb> 3'1ߚd఍$Ec滧c|#m#E1t?!U6=7E|U3.S޴оdy1/ȳ_GQ{UH~ I"& SJULk9N8-`&CxRo~QWl@vGZ$VYdknormal.light%3P%1.webpRIFFWEBPVP8X ;;ANIMANMF;;CVP8L/;p6$1v$[hN7wW D7ĔTX[J$' Ֆ' LIgerK2uyn&(st쨑;H׊!%8KK`n)#9Ilܰ dha.J&e7(*)Ӂ&zg0v9\ʔANMF~'CVP8Lf/'ڶAAܺx4."!l~ 0IH[Ǿ%yuk^96F/U{ANMF.CVP8L/.PжdAh p̒1 UP$IEIRH",)=9C,WR@EtXk@e3`;XL2 al4MXkDNm܁' F uLdgFRM}3gn11YG2o)5%w QQg ANMF/CVP8L//mI2{o#m[M+0Z h4l #/i*P 4p äi @m e-&|Wr ϨD/糘mW`سDV lT/`=Vm6jH~2A2(b)l%q:lk!]5%դuMXt+v[=2.3.webpRIFFWEBPVP8X ;;ANIMANMF;;CVP8L/;(HqɞcQIܳMHrT5trnm+9$cHqܝb?vxi@w'/k $y?(o&tPТ@r%$TOP?I|FCר!WMy$IVlkV"m#Gtuoh|z&~XL몪Vw=)(]w4Ե/tk+r]FOWW%NVXg1Gh8Ea &J<%6&L|)ۦ8閭5qfrygd{eBdBهY*OR@菰5lB{;s;cS8"w gYyFpiANMFv**CVP8L^/*  FCNRЃtou$IP&?rvxR#Ij3xim}TGebc l`tZ{Ѳi'iSR_l??ӈj%fa$IJ[aI 6R=k ?嬫cXJ(OL~z5Їz+̘"t48=ewتZ_G]m^2 @aPB?ʛ9ႇ;*%>?CN m4,ju&bJ'f;F, u @WO)R3E*ULd*S@4]M?kANMF..CVP8L/. _$HPHj4<P$ y'&>,#V%#g.7dy9Ů;@t<¤ _@f>  |;gcf?O}b}wdyuﳙO 6R2 7etvեw-Jjf>4'd3eizHMkfk8(|;ԸWҕ AV΂~s_Ѵ'ii޳_c?KIOfU1Tq$04Qq%"aFDa$Ǒ'-mm+J'o@2xdci4~<Ƈ6mXpPN4Nr48.ANMF//CVP8L// (H /blPж=:WF$)}wEfGdJ*d96仧u{  uzM)+`(+BfL~@1+E BDR_Vؙ˳{.vF)33ʔR݀mi:n*_v}jYS^Tc|rE?\ۥXɚY'3_WEO>XbH:52EMQDMO>EV- VHFaŰ=kic}R(D˞cL J͐z I-"ZT)W ['b2w"? >q#|i5'\CG} }s|:Gus3.3.webp^RIFFVWEBPVP8X ;;ANIMANMF;;CVP8L/;6$Iɞ Qv m6L:?8qHW"IR=~;x"HTQA'ߓdO^"Ũ-B5Y%($6aQ0A8VJ;%DN.jGO@(@0$YHAaP5$ *w']pNhTz_|hBemtl=_oqdXN<mƛ۶QǪ'oǔQ< GQihN < r~ ׀%= )'e b@#+0,v"r>~[f j`kjL8H/ XOO>}Ҝ{s}G<ɔ@Qso +WZOhޯZ||vI륾} dTkJSjls Zt:F+l"\ANMF&*CVP8L/*($E̿ݽMH"%Mh2 ۶mJ~P0Pp8_# O_َlW3vERp?>0~4HITf\@D',-X<t x2 L B,!L>{1o?Ԋ]Uc}bet XAg/F c׫`#H^4dTY$4A!CVWv.*`oGQUU1Zi]sn٠@ĞANMF/CVP8L//⨍$IrvͼDZ h(l۶aM$I}{<OGiW$)1<" Ͽ' N 8̋k9%yaüP.Z?0`6L["JgE1qAHD_D]["4DȾ*}ȝP0Y&A TMKxHr/ˢ\gݜ%1 ȶm::m}m;HF \ _|p]yp;xR]8,d$? Fe zxSAǩfS[qzZ=y!2bL.(^A+'~(wxwJ/}U9D:|(ԕ=٤N 맕)}F-m>0,5y'*?4>!tH,yUb8K ? QG< (V+ (*k]e{;b1 d6ض~lOߞ@D'SAMR*2N-®+JjRTQR_*AJ2J [:Vu: ֿr׏{a?!)<~m4i6 ~z3>^}u[Oz,?_>9wK,nTl=RxmqCRe&[7*q>gvl=DCn` 29 t=C^U([3⼖ @h%OFH4.3.webpNRIFFFWEBPVP8X ;;ANIMANMF;;CVP8L/;(l'3‰.07@,Ay#o% @B,>(%٨r 5YTJay^ߖ?+5ճ% x+»^ڗ G$%Ң-&d۶!{2U+3pHQ;x%8_ITjL9[{OZkwwÿ0E\EvԫƘt3"削ᣛa)GA&U^~%-0jfKfɯD&yTՠiV*^DyRaI{-x%m8#Ԩ1JLS)̋s=}ͳ)>3,п@ҍ0eˮcRmS[H3%ж. #ݓgA }Y:YvQ"jDm$}II7 ANMF8**CVP8L /* gf |.PlAMq+hۆxK@0qLЀնmN/>>w ,Sw..P|=;n(1C m ~{U =) &V3ϕbۘur~ b䙄vw#j5lǙq-WO`ŀaqul~7s&< ~>[6uZ +-*CU8QUՋ"zy=ANMFD..CVP8L+/. 8$'nb_7Jsr F$)ŃWv6U$IKο; miy& lوߋ}+M+JeHa(d"7T,~IaL!7LQJ}4&NOFpϟ)V*?);n.<ݪ,@m[Usݥ"mGiW{ gLA"99gj9tN >Q@ 562^P"Ulá.@Sg4%*iLr624Bew~]**͗y4~ {{Dt9 (zK ;I O=yr,I,w G_*[Hf9d7\ +}j`!_iU9ǬD>r @C656SmdP|7sm1\RtP2aŐ 1ob~ GJ.R<vmEa^C%g\k낎^AƓANMFt//CVP8L\// G*d's 極($)9PG7$Gr_>}f#Ije;uX6|m b_<PǐCFGM# --l ĆR&F2dvU2ԴhoR%eU{[M=As,O;A1dݴ3c23pyKD3pHQ{03oۮ'?Mgꟃa+%ANMF CVP8L/6"?PeJHr;iIa6:_L\) ([ .t/^m?0$%rdn(Broӂ!tS-LX "PlĩaLJ G煎 %xIUlZ|bkg_wqOO?? ANMFzCVP8Lb/6$'3h-S İ4i(l۶aVw2n#IKl#Ir maE h6ڔ9PߜwŞs2@'@ ًXG?|s:- t+:5wupٶܸ{{1^Wm# 44 $U1uU_}Us=Q3]P93?QG#1XSMILj@e~s}0O.Vu.ĩ@SBi2=铸0͸<~u@;Nt܁W "Hv粷(L(WϘX*kANMFCVP8Lm/$3GZp%٬'6Ɨw gdɰ0< zsj~AΉ[_WF"1*bC{scp'm?jZhXD56.webpRIFFWEBPVP8X ;;ANIMANMF;;CVP8L/;׀8d Rtʋ4m$0 :Fh |"浌3 B `ׁhrUɼmAڦ}~m#Iw7"mۈzNu~i@q އi欤6FKgr=qNOGR+t͑ q~Zay(BmWbD aH8=Ř66 `&tDPQ׈taςZpressed.dark31.webp RIFF WEBPVP8X ;;ANIMANMFH;;CVP8L//;丑$IEo+' m$H܋?䶍I{Ǻr#ɶ""2bww * **{"l6q=6WҶ6xS U:RiU yGۨ"`"؜w'dm*`"!ygܖ ?\QE0@U]4[*  xc xpE BEwm; Wwe=hۡf6|}>7.,gϬq]۶uڶۇ֏m&-?NLDH hr ߃|~v޿{#eˋw/$2yG޾ K68ND|%SVΟ9~71jseJg9j/77eBVޟ#zFñM$oQ(^З][k4;Jވܮ~i>t)y=V%$N:q}HIi5>nV@ x&ZٔPDfOV*X|7ɣ뵕ASꍔo`)6dx*>t0{Re.0?"c5aq\,zPì`JwJE%byUXu:3n&wV?Fq&eudbNA<.{& k|YV uZF9"JzpD32'.1b?-`dtzYu/P@{LI'gZ{T\?sO6JdvPMfNy]*"q(8丮xWƝFJ)HǦ=uz!(iFn%TӶp!V4™=g/w!ArVpsUc-f{-,i ZݪlګіzQ9lm!"k 7.((RV(L&J]S4 ANMF.1CVP8L/.@ в=ih}7 WgcjcLOiDmƶmm3v26dYXumڑˠ|6~=}m[㮮3ƯyV!;nZ?+gyfڡQ8U^2T[;ukܻc5ic5X`qlTce] +dNa1|HVap%_ņt!P_Fa?qgJBkًLY,p Ru-?1FCPB<C W z}3{W! "!k1^9$c6JO%?wෝz=2˯ ;AE0iGdkǝχގ}<iv^ӷZr < tnHp` ZQo&(;oEN3}F/RANMF`+-CVP8LG/+@ Ȳmmm╧23$R`Ӫmk;m6Gv_kC2m?ܶ$i~Ú,DTLbz+X h24͔hR7!NLulۖ <[8(o~dخGu@{1 ^ !U: XiZgL`,)#eZTG"F# 䳁;K1_|2) v4**_oF|\"=VIe)ƥ5L=5t3WCAΈ2=1_ mU$BFWҴ: "|:mimZK5мY{^A*m[W{dKrmgfͱ2 L5mZl[yaEjP=DN@csM q n+3@pµK[uxꞩ]4̧ w1Sw[rgi\-ݾٿ]A QPY +zoO@@r ^y>L{r?Zk/g_`@Z G=֚u#PQQOQ LE@s~nV)ڿ%_`W<(@E7 .=VVgW{=SLk QI߆-SXiQ^؁}}g+| i5.ۚrQCGD"C*Y "TУ޹F]=yE`R!aTgESmU(CtHQ2:Zr0؀TJP` %(G ! =k2.3.webpRIFFWEBPVP8X ;;ANIMANMF.;;CVP8L/;(H90p%m"O} m(iv/l[N95T~ Źq(G @#U`%r z "XH"glX nlIRtL̘6n9 Մ?BX6q9Ca"m1TE%JWRs۸x&%|HH62UǸҫETOdϣ7|UB莦o8EDBj}#lMB{ۃއ謃XlS aANMF( CVP8L//m#_4m#y;<WFm$9 ˟blyoL`?kȔ9 -BB L ;L$0~R5(UbGlZr2;aSJ]tz#0$~?}};$gEn6)~Nm8WE;N.L2.ϒc,dL:e4X&=aU0GfI%[q \+_z y?Ք/??{'wu4,ANMF CVP8L/m#~7h(jr3.mH H ">a .|yz0C@ l#F0PlE~2Su3FΖU$E{&;"mW_o~?تRJ,>8( ŠƬS~5b!JZ?-IoPtTSO_#z>?Y~}-pressed.light 3T 1.webp4 RIFF, WEBPVP8X ;;ANIMANMF;;CVP8L/;ʑ$9$ *3" ضK$.X=HZkx/Ž?M?3ss=笘\:f-EWWtEtըNKsGDZq y0jͽؙf>lD.oDf[lDT Zi-^|$ yS)(1/$Pm?Bnjf 7$4o%j[:A3q{Z$ ]OlFn5H% 3lɛ[Yf%e[ĭ]?$ٻ60+{~@֒ʣZ2 ~~Y d-.qYFɂRD 0WC~H- }!*=WIO-Og<6`Ncs(CԽ#s+}lٵE3j4T'ʲq56 Qlڕq=FϚ m^&fg4c<s(ȓN[gxuY%^:CҎGi>}[HylFgƄ|&{BLoP2<=SΘ,(|h;A0bm4[J,貽*}"CSzLFM2bsNL+#(kFtMCu$.(h&ANMF.1CVP8Lq/.@ 2iP۝<m ӞN@u۶ֶڟ>KL /3n @{#sH?S}ƑϪ6'f YpIMt#3Y+ˀHE6`/L݆[K YrnR 1@ p0[`Bju0IJ 1+ h(ҶRRPTt8$p[!|rN4.O,e,tC4MH <}mֳ`$(t79"uaͬ9sM NHbn8,oeRi֚:%X#Iacj3z۠%)N6IQb1z- (v/x,4k&, ;HxGFOnk @E F8~mP[8<+0_࿁ڊ{e+Ky-Erۛ _BQ ? jP$D]9($W0UGnk5>@B s#|Q& =Ql.@Kblvvdo}Dkg]=+B{2X t4 ЉRđ hAN`DK(32=T {f2IBWVc \j+C<0&HtTeOQTiu%Y 2.3.webpRIFFWEBPVP8X ;;ANIMANMF2;;CVP8L/;'$'<SPж ǟ!Ym#%G(cIRA!Yދ 36k綟 ඨ HH֟ep*N9i d wH/`Hgf?Kq߈?jB Aej1IjiRDFj M"WB!ZdڱǸ:gEH\7DӘFWI;h;)y'}#lMB{ۃއ謃XlS ANMF CVP8L/m0Y{cc762r/̩q6R31ȶ`uP,56@ qğ\VDXDAb=Dc$g|?̇ !ܶmS_A߳,G9y cz$(Yx%88I:v|Fw"bYELj&89J!J`m/!B{2{s6y~m˲%IANMF CVP8L/瀘$U,WCA63J<#Iu城YF$)Y?Ko0@sCsEK#@ Pߏ9%K=U?0$%λdn6w{ kq,|VS)!ZywnG!L|U:+?-O(kՙzӜLG; \ ψ>:~~gkdtkdeclarative-5.7.12/src/icons/bloom/radio_focus.dci000066400000000000000000000053551476226662700226160ustar00rootroot00000000000000DCI20 normal.dark3n1.5p.3.png.alpha8&../../normal.light/3/1.5p.3.png.alpha8normal.lightW 3 1.5p.3.png.alpha8PNG  IHDRZZ pHYsaa?iyIDATX]E?^햭R.%`5-P!XjPi5FV$C/1mJ+5aK+%Z ݭEˆyΌ̽}{0o}w>9{s޵!Z7v+WxCZ?+.C7+REa!_pMR+5| 2cD v#4X !R YKs׫C78-pµAGr**؀7ZkXc8SBJ)<pY=LNN<1rx̚0ravdRZ+ҫn\1a<ė1㜂d)RJiZh`oyMJ=[4Jiuu2[[_gG<<7X{AJk$yWת`LdygɧܸJ'I-mȏ~d\4u:l)=9ILy˾##XVMkYb-u$i}[Ξ;^]ЇF-g۰ =9rS #ǛbDZղZg& 1iaޞoO37ڹxxzm77;6jYItI@PIiLuo!m >TV1%.8DJ)uO,;mLl5'W4S?J*u }۞ v[`nyVFb$M7ot`KVK=u?? ` -`FnDZ KFܫX>uydNZ+d~ݎms*=eYfr[@yy` k qeù#YY7sgyV;퐋\kZWc unD[7J;kRov׀-j Wv[۠Ꝯov o|G_IENDB`dtkdeclarative-5.7.12/src/icons/bloom/radio_unchecked.dci000066400000000000000000000475521476226662700234350ustar00rootroot00000000000000DCI20Ohover.dark 3X 1.3.webp RIFF WEBPVP8X ;;ANIMANMF;;CVP8Ln/;⪶mZGp BJyrv m$I]i\$Ini$)c,?7m#Iv?64w D }EUt՞4(qeYp"+2|s=E+G? *9@ˤδ $_1(I[5}bz7&2Ayrn?m;ye}EEM۔aզ:5:VDH݃7=[1Dzc.9瘹i1_=K%دZ3or+ ](r&qJ$o\jq_]S^;v}Zky{TIO/ tp+X h hy9&`ɩ4&g 3~͂[ {}{0|ug,َzewݍ3*1jlƢ1{6% c,ANMF//CVP8L// _*d's@^sxkQ$Ir tvI"i9`F 3߀9sZIvH(mGI1`b%>,-6Qz$BXi, `Z%@!4 Stu)f4)M7X)vVu' ݶ_ 'MLQ%\{x^I`o@ 6m234$5e3o?T+=n#)R |t>OV*'yc=_a21@p]@r5ߥeKȮӷy"efD8l(LZnzT.29^o;LM׍P*jHfȟƶ!l}KfZ/XOϺX4=`O!'6^5}< Dx={䆺& 1T4Nh̸Kubwܹ"g<> iESza[+=N%v Wv!u#>^!"I<"zҔA@e6M_cW%ښUW.3I[6<_$o'v(o~$q@<18)xSyP<ϊq:A:GANMF//CVP8L// ¸mI–܆㶍$s&?c($E:s{1:$[qw簜-pV()_8&о)?hB^~9".M K-XThM4pAGr @L  % "SXB=eca>}=+_|^r]c{Lk$IRܬw:vو3pHQr 3ѣ/|)]gWN!\+y:9 )A93_|zZn>C[~2jPrNli5Nų=2RRĚO-?,EFiO_V " rm^nUbo)Ky<Ώʠٱ::88\S5Bs~HՄʬ?% V g#4O0Xhpvǟ=#mDaJSQu"-FzYU>F>fBT^y3!Af [kP %wp>`\2B{&[Xڏ__w cq?γy-sbσ:yϳ<˞ǹ 簏ANMF//CVP8L// /8$G8Sj7D$)s kv6#vv9$YUCN >rY@AA(SA([Az:Mp EQ$#0A5eni\8֏J&A,t8ZDfFYUʑ0RIS;d97'Eqdal{3_sE>o~6 I5=m۶m3_ğJ%l #m#E=n%/+c}3x{s&ge߱2K4rGE%?#54 -}:] ݠ%bDݥY[G6W֤\vSRݵp3c-#fLsmKIn=`Juė;e*I1|Q0+::惑Nk`:nN}<+Ԟ|Q:'#xxӳ "c~.Y(B2iY6`,XFf2 j~EH&g|$8jM5sy8 5,f@vH24? LkPx$vC yPt|"t_qdvq?<'cv!)<]GįSuW[,zsDNjlE2hover.lightl3$1.webpxRIFFpWEBPVP8X ;;ANIMANMF;;CVP8L/;$E_I`g$E_I`G$)jO3=*l۶vX 4/ }-}}<14s !)%)%9imVFv"$3|ux>gm;F gY4[mV(=ѐAy͋Dx佃{HZfn4dfk0.DM,"FUI;!DIvZ. v_*I9`RwWY>DDMrZw|0LU/)y%iƬ\xfնliѵM]FF;jڮHUnӁ0ܖ}힧b3$O@&oλY$օthzŎ]ڢ**[sV۹<|[fDH}cHVI2"3@ "=fgZ̒w enju v4o6)nA ΓC$Stb-3 F[DJGƩI ܂@DBV3\K95 !S4KF6 J#2)$e&4SfDhV SU7\DmUhګNT-'FfMn$T@$3500DIjp`$ bѷ=#іCFY2cpUQA`뺆ANMFh/2CVP8LO// ͐ P gA6ErvkZ,O\X,IP.{tUDPl۴m>kc{md}5*]D1شaӪ ZwtM:Cd wPZeƻQ.?|*XBKqik[E=ֱ.ޖ`JM]G Y݄OrRB1-*؈PslWӂ1Sb 1+ H0c٬}v6\_tp"y9bN% ",(Ȅ3'h#2\8IyO|w_n+܌[iz @m;m̑d?̜/cwW䶑V Cow}cT_} B[)]%Aqf`o̡Ǥ$%z, \#rSI^ĕMp\/s\ըl\1^B,g߽F'pQ`RwSzxW:{'6aQâ9X ȋYeƧ/#=; Di PZYaS &RFM1VM0aCߠB!8C$yy0'uٶil[?~tɻsW⌚x]GfoXж.IZƁoG8J6h*(ʧ@ FDb$(DbDGrHѓ|ogSkΆ\`۱OP.U@$I/fffnߖߣӻgඑdafޠY^[:cWG>U^ 3ǷiL!_{TjՐ5%-~ef9xMk|QF=yN)v]#exFb. 2{S"&Nޟ6AٴyԘJpL>EmZNx4R{:Z3CIG֖ANY[pg_V'UFԚĘHMey.t]pT.Kiy!GoGa*9ZQxhQ}'M%[4}2t,?c ftߦ!.t_/] `6<! r0(= ?3w;s?q?I8{bσy=s u9Cٵf9KANMF//CVP8L// 㠍$GrEMq6l3vI"k'PncVdITΏ]n>}w@ ~ o.Rx#`(o =󯿎c54"x_W ?\I% [ç¢0~$B4_ -Ll|<4Eby_DwwS]CfI^x{8mY>|A9$y}- 7@m;m6R,*3333337࿈;pI=7d.&!s_6@;3Ems.F8󑚣Y\Q:WQiXyN嬎 sHh$Ie"ם/=@8Nછ~ 2bt*niF%AC~ͧnK·J![(kdmmqo簭ݯb?9x? m3VO͘q^',)sO79@耧*W2E޶p-C_=N?H۹:_'luγ}*6$_T>{b {es>u>79 [M3G normal.darkh3 1.webpRIFFWEBPVP8X ;;ANIMANMF ;;CVP8L/;mI; m8p#!sށ* u^>IشMc.EGnFnz~Coz'h~v4fc<;"bq5kTQ`1Aj/)Yh~OdIs7F2>B{gbmL/QLN!9{پOLoۋ A8Mb6jkN+apQ]E|wt SYgGV^FJir|h粣Dܕ; ˬb3O̒ȋv14hUXHS8Id8h%BTDH[rBW=i_E(dDe#ZxhI|ӿjI rO}1wZ4=u})|vNiLY]>"E XCM[ {u9g{)wzwjT8F#1f1ڌUbjʵfw`7ANMFn''CVP8LU/' ` m771o mێ+h8p00?pF"11C|Wඍz'YYUUUf|aؗE,PIįPJޛ5;}1+33S+}6fANMF..CVP8L/. mI; mJ%(@0[P&` tt@a `nI*fffl, 6R3t ?hwFфRv>?y=HZ {,<_˷WFX{Ye|(oDTD]U6|jumN&.,ZxT)`3Qxףv,ᐹNQF/M B֍s=;,|WznRc):KeqoC Ȼ`EiYG3nK:^A,N J,HT*X {H~AZx@ ji@ARfn GV,{kw,nCDm(=7fݾe zkRu1B3qCW)ܶ+/HHٶoZA\$+)HlQ{3ʅ=PاF޶e͉|? AGsA$5 k .pg]MLăk"%zeTL~F5٢zC:&A\X90bjDZe0_C!O'MHI ,I:1ÎIVF1:xǢ/풙E+JuJC)pVaT1[1x6{@2o|O~;oSq}IqGG)y0bՔyO18eW^'Cw/Bunormal.light31.webpnRIFFfWEBPVP8X ;;ANIMANMF;;CVP8L/; ɍ$9dդ*w$m L3PX̨.:oF|}CmB=>W)h.GN[0my&Lxj`G_BG3-D-D"2P ½6=eߦ8k0ֆOFxJ}x™jM+S,/5ҩz-Nhu6J73*1Jϝկ@KtH릗a& 0s{LcIxDeTDkZfIrp+UdїnV3fWڨS6}%a_R9`z8A 3f"'h3Y֜7:,{(Dl؊bdY=g?ΉBػ=M }bз;T3jMT;6hҏԄZ4R~}.?$ANMFZ''CVP8LB/' Pжd]@#7YT5230 ܶQcQDڌc/l%Wl["4"h p TF"0SL}]c+ djdt7Y#on춨dR?Dwf,LHhbGZʑ4`ULMf]/Ӱ&&D9SՁkG @1[@xшh˘D=~Hb/0@3E@"5=QO`m7j+ "5 ;}ݿ}{ߘ%W1iJczG ANMF..CVP8L/. pضm qi8&LS vI(@sZH@U+(gy7KH9FhzbhIJ*̓&1(Lj̻ 0ǐԗnJnzòROXtXOT*4)2.r.ַ\ŏ[ANMF//CVP8L//  m#Iۙ>DM# ud)'<"> e)Jm(=7Էݱ"-׺rM; YAH %>ƧRbg苝(:ԎX'0O՘i^NoS/kLJE^ J__4`hi~h-h~.2T*]bP`98ʸ 7qj{ p(V2/;aT5X sؚ Bƒ` \i'JTU;UQwU6AU[AI`[:x/Hv\ccT2giPU=m5HЄ,&r[ZUKQv-:OI#o'0~?3X8>H<>̳}3 9%7xg!]m:[Gpressed.dark4 3 1.webp RIFF WEBPVP8X ;;ANIMANMFH;;CVP8L//;丑$IEo+' m$H܋?䶍I{Ǻr#ɶ""2bww * **{"l6q=6WҶ6xS U:RiU yGۨ"`"؜w'dm*`"!ygܖ ?\QE0@U]4[*  xc xpE BEwm; Wwe=hۡf6|}>7.,gϬq]۶uڶۇ֏m&-?NLDH hr ߃|~v޿{#eˋw/$2yG޾ K68ND|%SVΟ9~71jseJg9j/77eBVޟ#zFñM$oQ(^З][k4;Jވܮ~i>t)y=V%$N:q}HIi5>nV@ x&ZٔPDfOV*X|7ɣ뵕ASꍔo`)6dx*>t0{Re.0?"c5aq\,zPì`JwJE%byUXu:3n&wV?Fq&eudbNA<.{& k|YV uZF9"JzpD32'.1b?-`dtzYu/P@{LI'gZ{T\?sO6JdvPMfNy]*"q(8丮xWƝFJ)HǦ=uz!(iFn%TӶp!V4™=g/w!ArVpsUc-f{-,i ZݪlګіzQ9lm!"k 7.((RV(L&J]S4 ANMF.1CVP8L/.@ в=ih}7 WgcjcLOiDmƶmm3v26dYXumڑˠ|6~=}m[㮮3ƯyV!;nZ?+gyfڡQ8U^2T[;ukܻc5ic5X`qlTce] +dNa1|HVap%_ņt!P_Fa?qgJBkًLY,p Ru-?1FCPB<C W z}3{W! "!k1^9$c6JO%?wෝz=2˯ ;AE0iGdkǝχގ}<iv^ӷZr < tnHp` ZQo&(;oEN3}F/RANMF`+-CVP8LG/+@ Ȳmmm╧23$R`Ӫmk;m6Gv_kC2m?ܶ$i~Ú,DTLbz+X h24͔hR7!NLulۖ <[8(o~dخGu@{1 ^ !U: XiZgL`,)#eZTG"F# 䳁;K1_|2) v4**_oF|\"=VIe)ƥ5L=5t3WCAΈ2=1_ mU$BFWҴ: "|:mimZK5мY{^A*m[W{dKrmgfͱ2 L5mZl[yaEjP=DN@csM q n+3@pµK[uxꞩ]4̧ w1Sw[rgi\-ݾٿ]A QPY +zoO@@r ^y>L{r?Zk/g_`@Z G=֚u#PQQOQ LE@s~nV)ڿ%_`W<(@E7 .=VVgW{=SLk QI߆-SXiQ^؁}}g+| i5.ۚrQCGD"C*Y "TУ޹F]=yE`R!aTgESmU(CtHQ2:Zr0؀TJP` %(G ! =kpressed.light 3| 1.webp4 RIFF, WEBPVP8X ;;ANIMANMF;;CVP8L/;ʑ$9$ *3" ضK$.X=HZkx/Ž?M?3ss=笘\:f-EWWtEtըNKsGDZq y0jͽؙf>lD.oDf[lDT Zi-^|$ yS)(1/$Pm?Bnjf 7$4o%j[:A3q{Z$ ]OlFn5H% 3lɛ[Yf%e[ĭ]?$ٻ60+{~@֒ʣZ2 ~~Y d-.qYFɂRD 0WC~H- }!*=WIO-Og<6`Ncs(CԽ#s+}lٵE3j4T'ʲq56 Qlڕq=FϚ m^&fg4c<s(ȓN[gxuY%^:CҎGi>}[HylFgƄ|&{BLoP2<=SΘ,(|h;A0bm4[J,貽*}"CSzLFM2bsNL+#(kFtMCu$.(h&ANMF.1CVP8Lq/.@ 2iP۝<m ӞN@u۶ֶڟ>KL /3n @{#sH?S}ƑϪ6'f YpIMt#3Y+ˀHE6`/L݆[K YrnR 1@ p0[`Bju0IJ 1+ h(ҶRRPTt8$p[!|rN4.O,e,tC4MH <}mֳ`$(t79"uaͬ9sM NHbn8,oeRi֚:%X#Iacj3z۠%)N6IQb1z- (v/x,4k&, ;HxGFOnk @E F8~mP[8<+0_࿁ڊ{e+Ky-Erۛ _BQ ? jP$D]9($W0UGnk5>@B s#|Q& =Ql.@Kblvvdo}Dkg]=+B{2X t4 ЉRđ hAN`DK(32=T {f2IBWVc \j+C<0&HtTeOQTiu%Y dtkdeclarative-5.7.12/src/icons/bloom/slider_point_down.dci000066400000000000000000001473011476226662700240410ustar00rootroot00000000000000DCI24qhover.dark3~1.10p.3.png.alpha8PNG  IHDRt/{ pHYsaa?iIDATxۢ#)Ed6ޭ~'ɩ$6x ѯʯʯʯʯʯ-moC~Bw5ȥnh WZ `\@ze;#Ĉ9|8Apwv ǁhP!/TGRl!Z0J b]ΈmYPqG3b/chrGH 2/7'``|FD (V18M[l"* ^P &  );QFQA3ś> NQ)*ΨbW@i1XxW"MLP,TaNs f2bPB*CQ!*Btba7J1d %ei EZ%އd U"R1D7CY+ r!=d6'{.\LI8F*)$E0qj6!}p) )U4٫{]. aV.͋eR.L|^n4:9oRHъ@:e),a؀JQ[)*3Sb2SFAsfJ2Dm /!LD ;U! V.35a ݥD"T)Pr@z&莐ybS0JACd icKI83: 0˗v;%']d,['D*rr'}qˮMV?Dfp!1Og %`bQ}Y9]ANWW./(^QOxyAM5zϢ MDijF#@}pM;h p.7v;j<^^MHeuq? [@DAD,npBj }ቘEݙ% u f%ۡSl4r3aPXwéaz\dv"XM( :&ͬ(#"P|8/!9i [PR&ЧpJSJRU@jFHZ,!lÆԪB6-}AwTIQ&d?!"  AB}A }3wNhI"'^Uy"X̺aT7ygw)!I )bHH 6_t k(KM GJ  គ<)T=%@ g3 bIaRB ǜaUV /9J`xXY)#-"{bCm}\?1 SO [J/ {%<'*;bNṩAjKgĂbh "G 7<bF7ppv8@+2\)1PO wJZdå}^@po K͏pdn6rngFHBv :~~`x3C^i\=͟ qeq6yEz' 15g92IENDB`2.3_0_0_10_0_0_0_0.webp\RIFFTWEBPVP8LG/GǠ$w_dEN֘g@\_!GhMH+/,=܉% 3XFr$E{q9n9!myg+XqdsܛjfNk1˫c4Ü?Foаe(lpkJ-@X˂^Yerns92OOϴ3ҙGHkiN{GzYiDrJ*7T_&P]xA<J-:35o!B)"R$E%% E&/P|~o 3.3.png.alpha8hPNG  IHDRHHp pHYsaa?iIDATX;E׼wB2X2"C-ɁC$ ߀,!/@.F 2!ηgw.JvvTMuwcM>w7E;Nݰ>a1!csdcs.51X8RJ~s){BRmc J);8Za8ߥ:K|*¸uz'0 kCqRTz t'Ibq`;QfYG5JGuS79ҥf4-R[c;gt$bIhj9笵uMtd|>K@Kyꚲ~UiY,YZ+msm%aר_w""昧EơRסC~mMI#g>K0PJTG|)Gk%e\G| mw֚Qnvp}D[a?%1\-]d,1@.t'33~;"9ȅ x69cCtf~ 4}`H&|qBas3KȐ $LA 833 ]Hȥ $˲,Mb3 "B0N$M|l:qRaqlz PZaZ)#JklwH)~?`69>CD|Cqsι~Bp"""r.›PJsxdjZ=~yI?ٞe~ğ>۞,yzIENDB`4.webpRIFFWEBPVP8L/G!H` H8((HH"ʪ~{D'>=}vr>~TtQX}$'Vjj8g~ҿ8ںz歝][Լ"{Rwb5uk']Īx lu -gYj`XwY֝Ne+l8mĿe̅ML\u-kDG̹Z]⇹gJ:^,W#˞˘'`jb|N8:ן݊|n.Cs/e ɧzd/}Y O ) JJJTt T}C2<G7^ˑ )U(A* $a'p)!Kp>E) ֋!3CKELp:Crx=X :>+@.+r,_DV*$k<\칅JɞGw4 XÈ.#BVC +_8"9#Ghover.light53D51.10p.3.pngQ PNG  IHDRQDsRGBDeXIfMM*ixIDATx˒$5b`hnlX/Oq`cs`;t}wx".m4$/"22N8!pB 'N8!pB 'N8!pB 'N8!pB 'N8!pB 'N8!pB 'nk7מ[LxM%P??Y(7XpUOnK*aA/!B5tv#|~@>|,W!=%#eDg?n⊄g3ӶLgĸ?xNn|:x.~> FFAfr\9 1W%Ba&Ajd}9?jD>„$F5qq8D>5<t1<໖x2\ opCI:A:9.qFl=BH@=d% ː#d r̞#ĸǸ#R !B!^Cgǽ? ~jf'{go|{/GdA 1Jּ qB>Ghq&C51]GLxIC"a`o2Fgr|7dRxF^1foqHr㯗a+SC0.Od3ѕQxsʓ+7} I~ޗE:9x{14r@#1)n!GO0:c'et_G|g./K: )$aGI#*K{<}ۖǦ FEM5l3ehh0̶##8[H: @1R@m d7vk 0RyCHyFT^ߧdѮt6HUu~ߧuDwy (Ԕc}<[)ĺ|w;>n!0uQW D~v#EFG;?' A'Ŀ  {BOݧ!ԺvϏGY[\ylK;\ ֵ 3p-诔 ~Ȁ 4d`lyZ!rR(mSיɳ|Iad4Ч s7è g^DT#?y2u_UR>]~ۗG_G[YHN3׆K}6L!Z|>H%Ůj0rq־ç;`., f`:29J^!&o{g !/{=h)J5m<,ߗ>( `uµ}|9zhBM98D`dS3}ѐG&!By:{pH9y A:ϣ;JV6*8܈<~#<Q-"g3 N6eKGTN|6b%ru:$ϱWbхn3z냾 nȯfξ`9a<׹Ay5DCW.gͬȷGY; RN=ANjėǨyGqi>7Q=킖%Zw9Zv}Mwpf$}{H~vs1g eQr“oCHہ#4au2"2}*o)w!Bg&ɏøgl/FzFHhꪨ=R!څZT>hZ #OFy5 g&L=PNSț:B귑ˏddG-nKlO]q9S $oX눋(x`Ȕ(NAL! N + բb|RӄIʷdm-nE uR[>.yk.skO(zk6o`FʍZ{\/2ށi~(OԊLTF/rPy-dڦ)w(U^PDmHhPJw:߱[#EZ9e}6&֮K4\˞LMdnfq9ڏTC&5E|D'CykD)a Yu{lԳ-eզm!)RjIYO_R},`ifL#?R>Bnx<Ӧ5'_F9;\^giɗ )it3j$_-/l-ⷝ\ ނWyǣ%W0g/qDq;kxSGV#2_)-$3h^#r!yI2~Mu526A`>iG.g!uJhk\ /mk `Xva)^_Csf0.HWSHk_HQĹHx2Ŷ&qn3-[/}=`PX vB|+mByeQGhtϼ;cwZ"Vڮ^iT$GYu,}0 `+]_ML kӅ) '#u%SL'ub"o!GMKt(=괰_䒩KYYjJ{j-C2Q_ل/#uiýC6 0/P8a^PVQd!Z/9P/Ky:~$Ei:$@D>jW{:O]} #DWɾxqu 7GGZ'c 1rҽ/HTiXܧ:ר?aM0qݔU쮏Kty8`] &y o1 qK"EEjQّ߉fz2-TO 3UkA{:~L?6mdl"lCs#梻tnX.Pr#jը*cRȬm ,/eU{ۿʝ1/WJ"Ȣ  | uXZ巍b~6d3*+05] 6xc/d/mtE'MCUXP:^z[]_gfH?#=tt̰=!,(:^U4`Uטr]woAE PU$ 9FC[L(/Q6D`|^ a'_bX8 ed:ҝC![/eU/IdK}#&i[ҩp}ֿU w>Y3^+FG|t!p{nF3Xڌᣏv=Dlu5=l^Bv d'/wF;ƣD 1,YcU/Af8c4mK`lW/Do(6N=`:[ۉw_3˖OTQ!t25;F2yr!i"1^k%OY5n1lC_4)]~ȴA`.`l} ёt}LYG6]N=aA؆.&8CDF`Zs<~O s:Vù˷C yON9r;>=tyFb~WKױsHXK(cFiUs9hFZn;vh3]/T}}v:s#%Rp\6t[BxMk|kJ~[e~i9cJo&p/!!RvW Rw6UتNׅ} Y2unO(*P7/$G#}-Й/ .lU;o~Mnd[ yH!ح-" \\oڱ:=ѡoS7}bpQ/an6nC7 yB|}g|=@K| #1Bo3[ы>ʽd)뫐 2 f=`ܷ!ٶfD?wD#Ǩ[%c+P݇lS\P!/oٷUEOerK8`&W)xj>tOo>3HV/S/i &Ɗ|RZF?);c5(J`mGHOK hOEĜz)~t,$^b 2$R7uB7mcI=>cXP CD <ճuڧ,*c"CyK?d&ym@j["}Pֺ܏O?e_HlL .h۴/)'ρ$Ø|?v9N8A/VWEnQxOqʢ32$'/2 hZ4E.tCG6N3 aq>ɧHdV0]aBDkEl̓6ص|eA>)B')ȢcϦ 'ż~4x9ݖO~nDk Oh_.15.`vP{~ \葁B+ ߍ?S BM<ߎhy:b=unG\skr@XTv3j`!B9 By#AZH1JCN^d&CH 4tzi؈!fګV;p, oi.\nvp)cIh\F5"/1/.׸DXFLKn`hDemX@ ȄȠ1Sy,}HWyh&kI2N}5x'Cp'IlF7L%[>`3yLdˬ랢B/D'C"W@v;G(i]g:<ify dw͋U\~]o!֔;˼7 Ib=FF4#xȥdEFv: 1Nt+KKRXf00lG5;㈗zq ds$ qe*cLR2lS"B@STASTQY}șr6//66SF u೑>XKǙ.L`-G_+`p'Ι2L t5W E-L#1Yr^ Q,AԳ,*b*3͈z:4ᜒ/̋5&c ?X#H >2m$-T[ ZJSh{ñn!KD}IG}>4U\;̘Ik%0OJSG-v@7gO0f(I."9!^9'}K?uSL5_Gssd?P>:pڞ^\/T{O7[u[VM*ug3"8[jP~̞Cf4yds)2d@!缃'#bm!9{#{m s% Ta@qj Iьd3yb%vK,"22+B؆3s;M YO uI!4g`V&SG9JN 2x!uKR K%r1yW\Ӕ>PH;w@MH_2"$M en?^\>D@ۯB 1xƏw=M0IrwGlEZ @Nb~$3 bz Lr!\oD˦ pC0#wRL{BXxk'^L~yXO4f!HY#o$:q>G#͗#0;X{W!z7xnC 鱗D T"i]$R Dptxg[2 av F.!)5rޡtw@@M=x)e$H  C\!p:HEWWY4 WCyIENDB`1.10p.3.webp.RIFF&WEBPVP8L/ '8$GCoȯގ`m8LoMͿضU)N4쫶mmr(b p"Q@(p @'ݷD({@p0$v@ފ_+BX8P"@H'tpM ` HPwbZRQxxbո4xhubfO& {Cw A$2Є~'aL"/Ѷ`4H6ϧn _t DPA˕*@Op_4Gb]'#зKDD) JD+,`Oѿr0Bd^H+ T{A@/Fyyy"T JAϏ 6,R)}G~ѼY@e>\f.9f{YAQ`D4WFAH-k+wx+M3ojr˿ *fl.o2^􌩲n{ 4ǒW薝9]nws}ܐ~5DwdC6۷7>r# !sAcFbhF=ۓީҜb6i(հa!1+]nOty;\ΙY.> g2q* !cSB5m\_#o/~qvްؘ&̍ g=_]g.'BB1ꃌ1>!8rK.!E=8!C"dsջ{Rtl%̫+cDcY|oz-rN-ms1Y6~q< F֚[Zd5'$uni -5&2db.Kzr8yd+1w eVN4'^&}*! j.[0W `"8^ӼQk[ǐt Q!hk=JjZx,l&n LMlux28ps{Pt (sqK ^[xf!(f{sg7~ָA~fA=NkໆƳwZat[X\Z7O!̽H{ 0H}o//-^h[6/΂YMy"^kή~ef ܖp(qN>Bڥ˓A18i9FTfw#DƂgd<4!mӑIkƞ DD~47}=ZO#M XͤI:fi%-mCc Fjj 6B;M(hhUlB*"Z` ]A;ړZ~qI˧:ȡmG)-X_5'Q$ȔϺvzCv~'bN=ݚ9L7C95ݳ0@`q:LFMtu8]#N6k6n# KFe0F6# Ҥ W0i&h$iIk!'A@dm4x%|S3 QR;Z{(lwɗ"uw 'Qb:V&{)L6!q%PG:/hgܬumIgyZݳsg4G#Ѫh8e4B٫*&&Xt4fTv #=H5UXhqYJ SJAz6:H#8e wQahec&ZFfĺ$Y"4XU(ƑP⌬KNC֥"m!ψ33=#R<#3l\@tNUS5<+Wг |DxVVSAϩ 3S^obn"+JžŒS+oۿ)#xیEoS#Ώo=$n s$7&{ȍq4`G4zK&ldroca yKXHe]clFN *,VS̠ &VXzϪxiyXeYrdQM4\dADfܾl997z2T\>ź\u)cH :zbgp 8*q@@Trbsb THw J3 uU \ Ĉ )N$:4 Gɔ8"HKA݅Q\jD?χ5]1!Ÿ# r09UPyW(TPLR$> O|()VSQa!4$} _r0ѐDRP!zjռŀM pZ^[-IM4"ßBiBOt@np1:~# ntO9gN0/D޷L^; Wl7Q˗뻾 @ͭ˫kbΟٙ$$/"MFgfffw8]n5껙EceY͙F3>ɰwJfceIȃ윣֛brC1-}|ʇtULqip̢".&skrGsKz^4 'Êﮒ˚ypQ #ʋ.3x :B ,?⏺]-[R!"O,2/݂cT^"Ny0N]'V|@-_r"/^33r#,x(8W P)XNޚ{~i})2.3_0_0_10_0_0_0_0.webpnRIFFfWEBPVP8LZ/GǠ$Fa P6-Xt6jVQ ^.ljp#`i{Bw PBxQ$Iw[&s{(u3cp=<ױ\g7&ε2혹'  '[uF*܏f9ی7;͍fNTJG'6L~G{Tzi˘utƜ~Έax ;<a+ S6O ?(/((%PZXC鱅rb ʍ"M!BvɃ,&N*d4#)OWb_gBoB # 3.3.png.alpha87PNG  IHDRHHp pHYsaa?iIDATXKEg챽l$xyp%.WؠDDX{8xl<ޙYc4tvC8Ity6}}˝c+ Hi=[2YZα]3^eYQ2{@HJEH@ɷ&+4D$$>X^y{?8@"`LWr /{aޱzfKfU /޳GujqJK/4BﲫrT}zY4@^.MlW@ۏ|X\ 8UJbt0: 硇]M܂^,Ͳp>"Yf1,+WvEz.:;)>9ι(ʒ\Eu<ҕ̽6%\4#f7mN̎f503{ /}5JՔ{5t{J1#Ų=vJ\ok4dID'>@mׂ.5n3B""XM9ʈHiK^5F1hU z(=9QAǑ9 &c)zH %x*'E^ ,ma(Cdıxs&'$2t i;[[d:Y"Hgw>:&Uv~#"R͉`N3İTw7ڝ֯vA˩өwRs_C 8GPr6)܂sjz8 бH:4AG2!KУ6& Hlt;mСL4ON+Hk'i*I)exr:p4FNTI8n9H)c5Zu;iR'fD0 "t`Nu CpI04!<_kxNIENDB`normal.dark31.10p.3.png.alpha8PNG  IHDRt/{ pHYsaa?iIDATxۢ#)Ed6ޭ~'ɩ$6x ѯʯʯʯʯʯ-moC~Bw5ȥnh WZ `\@ze;#Ĉ9|8Apwv ǁhP!/TGRl!Z0J b]ΈmYPqG3b/chrGH 2/7'``|FD (V18M[l"* ^P &  );QFQA3ś> NQ)*ΨbW@i1XxW"MLP,TaNs f2bPB*CQ!*Btba7J1d %ei EZ%އd U"R1D7CY+ r!=d6'{.\LI8F*)$E0qj6!}p) )U4٫{]. aV.͋eR.L|^n4:9oRHъ@:e),a؀JQ[)*3Sb2SFAsfJ2Dm /!LD ;U! V.35a ݥD"T)Pr@z&莐ybS0JACd icKI83: 0˗v;%']d,['D*rr'}qˮMV?Dfp!1Og %`bQ}Y9]ANWW./(^QOxyAM5zϢ MDijF#@}pM;h p.7v;j<^^MHeuq? [@DAD,npBj }ቘEݙ% u f%ۡSl4r3aPXwéaz\dv"XM( :&ͬ(#"P|8/!9i [PR&ЧpJSJRU@jFHZ,!lÆԪB6-}AwTIQ&d?!"  AB}A }3wNhI"'^Uy"X̺aT7ygw)!I )bHH 6_t k(KM GJ  គ<)T=%@ g3 bIaRB ǜaUV /9J`xXY)#-"{bCm}\?1 SO [J/ {%<'*;bNṩAjKgĂbh "G 7<bF7ppv8@+2\)1PO wJZdå}^@po K͏pdn6rngFHBv :~~`x3C^i\=͟ qeq6yEz' 15g92IENDB`2.3.webpzRIFFrWEBPVP8Le/GǠm$ǻ .44 )¿.$5CAQWIRr/wwûU Cė`{Y}rܺs֜9; 9HfWw s{\o,y=ܗ֊wV<|ۧc2ӣ5rpuv =s?<|& 8}Jlr+b g=(3g{gxqwiϴ5Қ6GHcZOk"5i"&\|bD@eJ 'T?6^P}| x@>R L r;ʠ@1CQAqICIA E7b##3.3_0_0_-10_0_0_0_0.png.alpha8hPNG  IHDRHHp pHYsaa?iIDATX;E׼wB2X2"C-ɁC$ ߀,!/@.F 2!ηgw.JvvTMuwcM>w7E;Nݰ>a1!csdcs.51X8RJ~s){BRmc J);8Za8ߥ:K|*¸uz'0 kCqRTz t'Ibq`;QfYG5JGuS79ҥf4-R[c;gt$bIhj9笵uMtd|>K@Kyꚲ~UiY,YZ+msm%aר_w""昧EơRסC~mMI#g>K0PJTG|)Gk%e\G| mw֚Qnvp}D[a?%1\-]d,1@.t'33~;"9ȅ x69cCtf~ 4}`H&|qBas3KȐ $LA 833 ]Hȥ $˲,Mb3 "B0N$M|l:qRaqlz PZaZ)#JklwH)~?`69>CD|Cqsι~Bp"""r.›PJsxdjZ=~yI?ٞe~ğ>۞,yzIENDB`4.webpRIFFWEBPVP8L/G!H` H8((HH"ʪ~{D'>=}vr>~TtQX}$'Vjj8g~ҿ8ںz歝][Լ"{Rwb5uk']Īx lu -gYj`XwY֝Ne+l8mĿe̅ML\u-kDG̹Z]⇹gJ:^,W#˞˘'`jb|N8:ן݊|n.Cs/e ɧzd/}Y O ) JJJTt T}C2<G7^ˑ )U(A* $a'p)!Kp>E) ֋!3CKELp:Crx=X :>+@.+r,_DV*$k<\칅JɞGw4 XÈ.#BVC +_8"9#Gnormal.light5351.10p.3.pngQ PNG  IHDRQDsRGBDeXIfMM*ixIDATx˒$5b`hnlX/Oq`cs`;t}wx".m4$/"22N8!pB 'N8!pB 'N8!pB 'N8!pB 'N8!pB 'N8!pB 'nk7מ[LxM%P??Y(7XpUOnK*aA/!B5tv#|~@>|,W!=%#eDg?n⊄g3ӶLgĸ?xNn|:x.~> FFAfr\9 1W%Ba&Ajd}9?jD>„$F5qq8D>5<t1<໖x2\ opCI:A:9.qFl=BH@=d% ː#d r̞#ĸǸ#R !B!^Cgǽ? ~jf'{go|{/GdA 1Jּ qB>Ghq&C51]GLxIC"a`o2Fgr|7dRxF^1foqHr㯗a+SC0.Od3ѕQxsʓ+7} I~ޗE:9x{14r@#1)n!GO0:c'et_G|g./K: )$aGI#*K{<}ۖǦ FEM5l3ehh0̶##8[H: @1R@m d7vk 0RyCHyFT^ߧdѮt6HUu~ߧuDwy (Ԕc}<[)ĺ|w;>n!0uQW D~v#EFG;?' A'Ŀ  {BOݧ!ԺvϏGY[\ylK;\ ֵ 3p-诔 ~Ȁ 4d`lyZ!rR(mSיɳ|Iad4Ч s7è g^DT#?y2u_UR>]~ۗG_G[YHN3׆K}6L!Z|>H%Ůj0rq־ç;`., f`:29J^!&o{g !/{=h)J5m<,ߗ>( `uµ}|9zhBM98D`dS3}ѐG&!By:{pH9y A:ϣ;JV6*8܈<~#<Q-"g3 N6eKGTN|6b%ru:$ϱWbхn3z냾 nȯfξ`9a<׹Ay5DCW.gͬȷGY; RN=ANjėǨyGqi>7Q=킖%Zw9Zv}Mwpf$}{H~vs1g eQr“oCHہ#4au2"2}*o)w!Bg&ɏøgl/FzFHhꪨ=R!څZT>hZ #OFy5 g&L=PNSț:B귑ˏddG-nKlO]q9S $oX눋(x`Ȕ(NAL! N + բb|RӄIʷdm-nE uR[>.yk.skO(zk6o`FʍZ{\/2ށi~(OԊLTF/rPy-dڦ)w(U^PDmHhPJw:߱[#EZ9e}6&֮K4\˞LMdnfq9ڏTC&5E|D'CykD)a Yu{lԳ-eզm!)RjIYO_R},`ifL#?R>Bnx<Ӧ5'_F9;\^giɗ )it3j$_-/l-ⷝ\ ނWyǣ%W0g/qDq;kxSGV#2_)-$3h^#r!yI2~Mu526A`>iG.g!uJhk\ /mk `Xva)^_Csf0.HWSHk_HQĹHx2Ŷ&qn3-[/}=`PX vB|+mByeQGhtϼ;cwZ"Vڮ^iT$GYu,}0 `+]_ML kӅ) '#u%SL'ub"o!GMKt(=괰_䒩KYYjJ{j-C2Q_ل/#uiýC6 0/P8a^PVQd!Z/9P/Ky:~$Ei:$@D>jW{:O]} #DWɾxqu 7GGZ'c 1rҽ/HTiXܧ:ר?aM0qݔU쮏Kty8`] &y o1 qK"EEjQّ߉fz2-TO 3UkA{:~L?6mdl"lCs#梻tnX.Pr#jը*cRȬm ,/eU{ۿʝ1/WJ"Ȣ  | uXZ巍b~6d3*+05] 6xc/d/mtE'MCUXP:^z[]_gfH?#=tt̰=!,(:^U4`Uטr]woAE PU$ 9FC[L(/Q6D`|^ a'_bX8 ed:ҝC![/eU/IdK}#&i[ҩp}ֿU w>Y3^+FG|t!p{nF3Xڌᣏv=Dlu5=l^Bv d'/wF;ƣD 1,YcU/Af8c4mK`lW/Do(6N=`:[ۉw_3˖OTQ!t25;F2yr!i"1^k%OY5n1lC_4)]~ȴA`.`l} ёt}LYG6]N=aA؆.&8CDF`Zs<~O s:Vù˷C yON9r;>=tyFb~WKױsHXK(cFiUs9hFZn;vh3]/T}}v:s#%Rp\6t[BxMk|kJ~[e~i9cJo&p/!!RvW Rw6UتNׅ} Y2unO(*P7/$G#}-Й/ .lU;o~Mnd[ yH!ح-" \\oڱ:=ѡoS7}bpQ/an6nC7 yB|}g|=@K| #1Bo3[ы>ʽd)뫐 2 f=`ܷ!ٶfD?wD#Ǩ[%c+P݇lS\P!/oٷUEOerK8`&W)xj>tOo>3HV/S/i &Ɗ|RZF?);c5(J`mGHOK hOEĜz)~t,$^b 2$R7uB7mcI=>cXP CD <ճuڧ,*c"CyK?d&ym@j["}Pֺ܏O?e_HlL .h۴/)'ρ$Ø|?v9N8A/VWEnQxOqʢ32$'/2 hZ4E.tCG6N3 aq>ɧHdV0]aBDkEl̓6ص|eA>)B')ȢcϦ 'ż~4x9ݖO~nDk Oh_.15.`vP{~ \葁B+ ߍ?S BM<ߎhy:b=unG\skr@XTv3j`!B9 By#AZH1JCN^d&CH 4tzi؈!fګV;p, oi.\nvp)cIh\F5"/1/.׸DXFLKn`hDemX@ ȄȠ1Sy,}HWyh&kI2N}5x'Cp'IlF7L%[>`3yLdˬ랢B/D'C"W@v;G(i]g:<ify dw͋U\~]o!֔;˼7 Ib=FF4#xȥdEFv: 1Nt+KKRXf00lG5;㈗zq ds$ qe*cLR2lS"B@STASTQY}șr6//66SF u೑>XKǙ.L`-G_+`p'Ι2L t5W E-L#1Yr^ Q,AԳ,*b*3͈z:4ᜒ/̋5&c ?X#H >2m$-T[ ZJSh{ñn!KD}IG}>4U\;̘Ik%0OJSG-v@7gO0f(I."9!^9'}K?uSL5_Gssd?P>:pڞ^\/T{O7[u[VM*ug3"8[jP~̞Cf4yds)2d@!缃'#bm!9{#{m s% Ta@qj Iьd3yb%vK,"22+B؆3s;M YO uI!4g`V&SG9JN 2x!uKR K%r1yW\Ӕ>PH;w@MH_2"$M en?^\>D@ۯB 1xƏw=M0IrwGlEZ @Nb~$3 bz Lr!\oD˦ pC0#wRL{BXxk'^L~yXO4f!HY#o$:q>G#͗#0;X{W!z7xnC 鱗D T"i]$R Dptxg[2 av F.!)5rޡtw@@M=x)e$H  C\!p:HEWWY4 WCyIENDB`1.10p.3.webp.RIFF&WEBPVP8L/ '8$GCoȯގ`m8LoMͿضU)N4쫶mmr(b p"Q@(p @'ݷD({@p0$v@ފ_+BX8P"@H'tpM ` HPwbZRQxxbո4xhubfO& {Cw A$2Є~'aL"/Ѷ`4H6ϧn _t DPA˕*@Op_4Gb]'#зKDD) JD+,`Oѿr0Bd^H+ T{A@/Fyyy"T JAϏ 6,R)}G~ѼY@e>\f.9f{YAQ`D4WFAH-k+wx+M3ojr˿ *fl.o2^􌩲n{ 4ǒW薝9]nws}ܐ~5DwdC6۷7>r# !sAcFbhF=ۓީҜb6i(հa!1+]nOty;\ΙY.> g2q* !cSB5m\_#o/~qvްؘ&̍ g=_]g.'BB1ꃌ1>!8rK.!E=8!C"dsջ{Rtl%̫+cDcY|oz-rN-ms1Y6~q< F֚[Zd5'$uni -5&2db.Kzr8yd+1w eVN4'^&}*! j.[0W `"8^ӼQk[ǐt Q!hk=JjZx,l&n LMlux28ps{Pt (sqK ^[xf!(f{sg7~ָA~fA=NkໆƳwZat[X\Z7O!̽H{ 0H}o//-^h[6/΂YMy"^kή~ef ܖp(qN>Bڥ˓A18i9FTfw#DƂgd<4!mӑIkƞ DD~47}=ZO#M XͤI:fi%-mCc Fjj 6B;M(hhUlB*"Z` ]A;ړZ~qI˧:ȡmG)-X_5'Q$ȔϺvzCv~'bN=ݚ9L7C95ݳ0@`q:LFMtu8]#N6k6n# KFe0F6# Ҥ W0i&h$iIk!'A@dm4x%|S3 QR;Z{(lwɗ"uw 'Qb:V&{)L6!q%PG:/hgܬumIgyZݳsg4G#Ѫh8e4B٫*&&Xt4fTv #=H5UXhqYJ SJAz6:H#8e wQahec&ZFfĺ$Y"4XU(ƑP⌬KNC֥"m!ψ33=#R<#3l\@tNUS5<+Wг |DxVVSAϩ 3S^obn"+JžŒS+oۿ)#xیEoS#Ώo=$n s$7&{ȍq4`G4zK&ldroca yKXHe]clFN *,VS̠ &VXzϪxiyXeYrdQM4\dADfܾl997z2T\>ź\u)cH :zbgp 8*q@@Trbsb THw J3 uU \ Ĉ )N$:4 Gɔ8"HKA݅Q\jD?χ5]1!Ÿ# r09UPyW(TPLR$> O|()VSQa!4$} _r0ѐDRP!zjռŀM pZ^[-IM4"ßBiBOt@np1:~# ntO9gN0/D޷L^; Wl7Q˗뻾 @ͭ˫kbΟٙ$$/"MFgfffw8]n5껙EceY͙F3>ɰwJfceIȃ윣֛brC1-}|ʇtULqip̢".&skrGsKz^4 'Êﮒ˚ypQ #ʋ.3x :B ,?⏺]-[R!"O,2/݂cT^"Ny0N]'V|@-_r"/^33r#,x(8W P)XNޚ{~i})2.3.webpdRIFF\WEBPVP8LO/GǠ$)bõjH&5ܿ3 #I63{ 6*Z<`qQ77~ÍeKƼϔX,?:p$IR$0C zw U+ Pylv)eIoWes MX(18Ezi.uwjNok wg1~&{;kݛSXKn\ >w4Nj2T1Wle/Þ{VOki=a6q? ~P,^P<>PJiGR ! !τ  iA3.3_0_0_-10_0_0_0_0.png.alpha8PNG  IHDRHHp pHYsaa?i\IDATX׿o#E7of:a]A"%q'Q^q ʻ&Bÿ".Q (H.'^{wvf(yΞhoЛ#{^;o%J) (t;eo Y_֭xEv@Z t0H %`L-@(x" 9J$|4 GArw8s^`JIј)hq{1GG+FaHI9On D$N [|19)R2.%{*)@I(Gg@R^)$Rkk5g DB2ǥE{RJ)mIAHE,(=wYNB- NQ)*ΨbW@i1XxW"MLP,TaNs f2bPB*CQ!*Btba7J1d %ei EZ%އd U"R1D7CY+ r!=d6'{.\LI8F*)$E0qj6!}p) )U4٫{]. aV.͋eR.L|^n4:9oRHъ@:e),a؀JQ[)*3Sb2SFAsfJ2Dm /!LD ;U! V.35a ݥD"T)Pr@z&莐ybS0JACd icKI83: 0˗v;%']d,['D*rr'}qˮMV?Dfp!1Og %`bQ}Y9]ANWW./(^QOxyAM5zϢ MDijF#@}pM;h p.7v;j<^^MHeuq? [@DAD,npBj }ቘEݙ% u f%ۡSl4r3aPXwéaz\dv"XM( :&ͬ(#"P|8/!9i [PR&ЧpJSJRU@jFHZ,!lÆԪB6-}AwTIQ&d?!"  AB}A }3wNhI"'^Uy"X̺aT7ygw)!I )bHH 6_t k(KM GJ  គ<)T=%@ g3 bIaRB ǜaUV /9J`xXY)#-"{bCm}\?1 SO [J/ {%<'*;bNṩAjKgĂbh "G 7<bF7ppv8@+2\)1PO wJZdå}^@po K͏pdn6rngFHBv :~~`x3C^i\=͟ qeq6yEz' 15g92IENDB`2.3_0_0_-10_0_0_0_0.webpzRIFFrWEBPVP8Le/GǠm$ǻ .44 )¿.$5CAQWIRr/wwûU Cė`{Y}rܺs֜9; 9HfWw s{\o,y=ܗ֊wV<|ۧc2ӣ5rpuv =s?<|& 8}Jlr+b g=(3g{gxqwiϴ5Қ6GHcZOk"5i"&\|bD@eJ 'T?6^P}| x@>R L r;ʠ@1CQAqICIA E7b##3.3_0_0_-20_0_0_0_0.png.alpha8hPNG  IHDRHHp pHYsaa?iIDATX;E׼wB2X2"C-ɁC$ ߀,!/@.F 2!ηgw.JvvTMuwcM>w7E;Nݰ>a1!csdcs.51X8RJ~s){BRmc J);8Za8ߥ:K|*¸uz'0 kCqRTz t'Ibq`;QfYG5JGuS79ҥf4-R[c;gt$bIhj9笵uMtd|>K@Kyꚲ~UiY,YZ+msm%aר_w""昧EơRסC~mMI#g>K0PJTG|)Gk%e\G| mw֚Qnvp}D[a?%1\-]d,1@.t'33~;"9ȅ x69cCtf~ 4}`H&|qBas3KȐ $LA 833 ]Hȥ $˲,Mb3 "B0N$M|l:qRaqlz PZaZ)#JklwH)~?`69>CD|Cqsι~Bp"""r.›PJsxdjZ=~yI?ٞe~ğ>۞,yzIENDB`4.webpRIFFWEBPVP8L/G!H` H8((HH"ʪ~{D'>=}vr>~TtQX}$'Vjj8g~ҿ8ںz歝][Լ"{Rwb5uk']Īx lu -gYj`XwY֝Ne+l8mĿe̅ML\u-kDG̹Z]⇹gJ:^,W#˞˘'`jb|N8:ן݊|n.Cs/e ɧzd/}Y O ) JJJTt T}C2<G7^ˑ )U(A* $a'p)!Kp>E) ֋!3CKELp:Crx=X :>+@.+r,_DV*$k<\칅JɞGw4 XÈ.#BVC +_8"9#Gpressed.light+3j+1.10p.3.png$PNG  IHDRQDsRGBDeXIfMM*ixIDATxKe`jބVqxڄiqu嗑*ͬʪάG#` >23>;["E ,X$H`"E ,X$H`"E ,X$H`"E ,X$H`"E ,X$H`"E ,X$H`.8ߥ09?r2ْpK&5?1p@9 @ 6rg.H16ua/E '_ 92` TX;&X-@@Cx<:_H 'b,Z֠Z(5 (L p @ ~FU[ <,D Mk1b UXj wG 10b[0]D-+IQ⟩tM*cʫO4NDc- bY ցǤt1&)1uO_AQ16c C* AK @V?k$0~Ga  58j6bOquL&``[ )1p |:s@s?2164Eᝎx7Ԓ1梥+r]-l&w,MQe "FS5^e(++^]a?aLRi3œJc̝,ts,ؚB]GvX7 @~+!j# lVd wpw%>*oKD}O,4#>{o}2>)uJ|U]\ $܈څ}ź=̮c^@ Z@ p(d]?ui_h  5ϼ8BP2jR2ϖi)c2eo1٘pR9g|ץJm3;ꡑ^4V917\VQYQSbu`{M% ( k@ XJO|X#%Oj @п-5ӰoJwZ S\ . Rxs R[1\a,BOGYmW} WRmO \sNc<ɟeRygc.l)B@sE52 0,"D *렡PL}A'/OnA6`p@YqNcJh1yQ,} K$)S-zӓQ(.4/txe# #h.H2 鷧0h1/5ieɳrπimD LWր uE+}<}k u1R07sfȀLjס~Lu좚 2@L2(dn VnVP]kz<Ԗkrt15(#seOALre:"[tlbRg렫."X9an4!pp_%-R&%/oJDRt݃4 §>ō|L4ꩻWNJO)PRN",Y|.m+_KB'p 1O}]נ1HRd@ J0J9 Pj;i<׀F|l)sd,N@Ġŧ6ց?*su@0 KaeN^@YK`*W3z( uBˠ0 h%?N^r"ĞaNYOJE@7];;XY$D9y#fOJ)Voc_.IB5i`U4WOwb?v@.N$ Ǔ|E Lɱ1oK2, g  vl5〇|Xn%r 3ym)G³b̕9{@,dEVP3im?2V:pDPTR#.a#\K+XuQN Ƶ-g>4.DYA {Xo^bѱB).|J <Zxi?!F{@DV ^r$g(PZxiOyeD vV!l҂_#R0g2 . Nܺ"{բRMٔb(*[ CeB7_:w!j^eSEy\ $ `W8AoF֐hG7#a0}W516oD(S酎) *,]nySq Z )ꍹx(K8?|]l4Cl.KݳB 5d? r_t4u7 }>KQ<%Jiam+Ey-˶wK W6m ;C ,6L#wXC0yD(>s@9O`_I=:>3c.vu>5r?Vam|bGDy| CHV p H"'b( y<5:1|;2nz2SAs~Ltuw2&du+T.JFȘj)u}.xXAEI<'}Dei;f[~,DI_V5En@,h(ZAZmnJslU'vun2g ޤ")p>%_J@: TVBV$Cu1~?3Ac:we!sW?-'x10mw:OkW1g!ZhiW KvӶ=xz6[exC2~t>@xrM1a1}n^UzXYoQ2a-RV e f>OVbhcd7wK cC+qVf0H;t>@|4ެD2%{$ւ}NLn\:97 M9 ߏ Pˮms>@U:^e> 9.FkÓe`,+#efۙSb2|O_x /!Ző6H0F(d? H÷H> CxÝᕙ$U"͝B\K $SX%{esj{WVjVMi(|MFd̙#dL YVHd옟C +|gn`V%)+Hۖ@PdP2| mgKܘ"lU9?F ~*seMM2L. 3y."2G+.!#Z3yG{XՅe9yBFRX_J\w0? `YKd&{A/J6@)TeDeS"+? MGN2)z2CvȰ󸌋NütLc@hj)UJ`YjLސ*ml: p Dr;ω1Wb?.&G:/=Vx"6ʁN@L $/ؐ8V/3󜘣e3? d C2m݁vCvX~[~“K6 'x ~O[Kr U 3YQU4S~;P !":/-~mxPv0}.x{˒# lvgͤxMgXY_71 +1x],Rj{AX ݍʐArX4\z $sf_E[)32qR&˴HdepCE1X[ZyV!*i'D.}@B]f۵e@yp]dAY*[j{?X>[; ]ں0 (0@Y` ϑWY[۸ 9y$^Ȫ[ױ` CtPAw8tV97?NJeG]i ֖ZJj>CwՄ1',ɁSB0.V"nTU;,?~b /*J1ouA  a hf-tD?ܦȝKFU*UŪ]X JPxmOXXbEz U2hJnA0=/ ˀGXx;>0)Qޙ ~v˺cpV*DuҳW"PjFiѶ6У_XOs,h=ʀޝsbny#2s:L1? 2yxUDJ腰ޗYy8% @E_UmU )AwW*o!(uޙsaN̍913 uH,Ι!C'y#>?Fɧ^+~^I3f7^=yO½\WA> Ai²`lA  \Ŷo—N 7ØV:acBݹa*XDr(YZt\Gʯz=5iHj0hj߰Erʪ <|iq}Že!+1u :נPy(MBCٹNuJ'/&}< `xg 7]0 #dEPvQsZ!u-T^ECwu*GaԷnBw0uZ SOiI \0gX ʨsby"A6Z wR !KT)ʢH.3mMo+lY!02Cy@Cn6V `dWPB(<9Bζu,SXxg-0&Xe=ˊrdmǤƸry_v|;M:t R^OD Dk֡3pm p ˶Ba ܠaF(>(śbGkdzȄM X|l@a:.G͉!Ws}mR71e((S 7(PpfR'@V^%)3lw W'(_88Zu"/Ny[T@p}BXˤ% Mo!P LRi*Լ'C c26[dPasB,2IF][u/m۲Gua9@/Pn4U&}"m?e~7 0S܀Q+9fIquM0]n:olh3S8 Цo{BP2\Վ"PJ澴+@ mf  >yYG|1KrtHX'8A 9@SH<ŌYnTnr 1,5ne~UƦS}3g+/>z}~GIX^m^ 'l:qXS|"O"Yɜx|V2i hK*p oPqY8"j)?|#9yœ/W"#h ̓%d@  >ma*P0֣$ EP%``* A%9Mւ+y ]ep >-GhL t-L7 r,(hIo20 5@ePy `\nG+0Ȼ ʿZk1![8iNz,Aׂ0<3ӧ@[q:Mi'U!-k}hs{绀~IPe-3<=@PЎP[Ƨ 4-f l{B+fN.Nn8lJO ~B Ι(i(N ̂ph`8BB8 Yt2lo [uZ ,X$p] K-IENDB`1.10p.3.webp RIFF WEBPVP8L/ ?($Ey |xPضmägHO&?o{զm8e%`$QVrty3 п7/*f 0C0+Q"=."(Muk4Ҍ$9MLz_U7jmU(J0poA@31j-wG-uH ZZF⬪.Rz$Z%? *_W'Y%"o""U9I@iU GVqHU!}Mй@+FycQ <5蟌U(Xخe5 JELgGhtj{|LN[ k-œ^rA} QWRDTut!9Yw=!Z؛s1^0+ʥtGza-"`k00azzѯ;ʟE:ʱ02w.A [1ͼ&px= rʓDlZ~Xr@` 2Jdz1xz>7`1bS;X:we.lzbޕgxڑw˚Ak"Ӻ,͏E-~o$.5TcήC2KHf-]AO/Xo qحhkcԟ(4AHG6ߴc@ugyC15b8bBч0{/UbLl^nlxޘfv=nMdK a3Γ/ GfZ 0GYn.Wۍ}Q715IektPvxȢ8"5_q}68on!0=hM<`t)LsS@ 7d@zj Rl 3L sbAM[0! 89e n Nn(v#Tq"LĊ%CX|AAՍeB+&S]8Y&x{8K G8l%N%bp0 R}\ɖM{s[Hi?~pCڽ$v40xU%},(uN缯,S[r=|;Wcx-z\"[\F*S^f&K].Cw5ITJR<çH_.c}U^:f܎19eX{9n&OSi xΰvO ?(/((%PZXC鱅rb ʍ"M!BvɃ,&N*d4#)OWb_gBoB \ 3.3_0_0_-20_0_0_0_0.png.alpha8PNG  IHDRHHp pHYsaa?i\IDATX׿o#E7of:a]A"%q'Q^q ʻ&Bÿ".Q (H.'^{wvf(yΞhoЛ#{^;o%J) (t;eo Y_֭xEv@Z t0H %`L-@(x" 9J$|4 GArw8s^`JIј)hq{1GG+FaHI9On D$N [|19)R2.%{*)@I(Gg@R^)$Rkk5g DB2ǥE{RJ)mIAHE,(=wYNB-}Κ4܂--t4?Yjf^,GY"iY2v7[fE=%\;%i/3dՁmrZʒ.U?6?ei̾ihPtKo*jXf>+YiV _r :aδj}BPk V:sn9|b*%Oi[ґ/XddlPdB媎`^h Zv,IQz#E)W`I@t6\SK@ >v$t.+Şm{򏙑لsA/3H* zP(W- &hag@6$`64R,3Z\0"*<]N*i,1WnL*nf& At|?=ncCWa((h- H4.-Be@[!.GA$Yئ]cg믥C :YX1tC 3! CLeh!bXHKӱ) /eYdzͣ*jUϽɻ;hi*ÊJ;T p fbsSrWx^7׋Bc\E`/0@P|@x.0I R8lPW9v~UXn{c]C]B\3Gl˦JG!uZfﯪLU0?煼<^}|| }oG޾/C}n{=oxx=_yy=%\n殅 IFb@&|@2.3_0_0_10_0_0_0_0.webp$RIFFWEBPVP8L/GǠ$w_dEN֘g@\_!GhMH+/,=܉% 3XIRef]ˣ_Dmi>s 3ttd/h{&ꥈd[$"2LS=@XTgJ S ,h X,s X--3 8,,,,h,,@ 4`Fy.Lx~Aڿ?zx?=g~wWxO<&ۚ_Sh#M5zȟ 3.3.png.alpha8gPNG  IHDRHHp pHYsaa?iIDATX׻Uq^3;uT(Zh>(_b#66B|!"Qݻ;;bf77w7|7?3{|\__mo<6^DHd~#c{ɴQ%$fۤ7t~=1JJ$o~G Af"%ia~.nwGA.ALZE?؝gg7L|C q!}!s ݽzc6bl'd}q-4wB@Zk"+uo;++9";d@ O|!B}@dV_j ﷇTԿd%R?\VQoDDM3}AC׷6sD$ut{Z1c8nw:cQ[v&N;<9q ~]uZ)(ph4vDD@nA1'tBgV7އ% # ClRaేJ1mQp摑2%ɸnB7 k66'Q|o ;3emHo @=Tìo1 Զ.qT]0D̄|OG+"{viYX |jF"+dYQd1| A}%$MyAW)!E2\&Y^E>pmGW!!nUeYG]_XB$6ʢAYPBD&M:RYbwv qiVVUU䩳?]jٽ%D$bmlՑ#U1H{I2JfEu亪1洞M5v)W kYYUE>HEhQj2D5_WYRM嚐Za/*j>ehIB"#DeQ䩳FO?:%w&q,,KkzkxI@Z$;pbfKA6F띷rRMȬm2LfC#dRJ[$MgZ>> ja(csZcPh6:"6χFm5?O4>ٱ+I)}EXy8.(mAp6+VzkX y|Xi9حXbbb*<>58!nͣvJ"1+ѯV /HJhVZ+?`^x62Ņz0^z%GDDF{鈈8ro^yifϟ<^{ߵ#B IENDB`4.webpRIFFWEBPVP8L|/G!H` H8($IHRU33o33?7Pxs;Y<}Cٓޒ$ɾ=/Y+ŵ^nΥc_x}||q cTLN/{]{_Ovqp|C $ĵuoj.塔 ﺹ,tJIfw7;{- z^/z$ 4ЩdC&g^I?䑼4#MQdf/*Cج㉺Y3&D3 6Ĩ*"9'QHLB㾪XgMT1=% vwNPL7턼bړQj&,%D+-ajs4V)[Mc_D\Tod€$q9H!rT nuRʅ_hover.light3e1.8p.3.png.alpha8PNG  IHDRxxi pHYsaa?iIDATh٢:DU2'~`9qB7`VJ______ۆ`<:߃yk< 07䟂q-Od.;+p L{GO"n]</hઙqYWW&gK%Z{+ iZR(Q U<*x05J?2E&*`6 ig-֊vNdk{Qv䈥lF+kl4?/\T'F4R$E-|*P*,>) h0I~ **\l!w-xj覘bb4abJ /\Qnh#CDC4Oo™#`9t`!+7Ց %ŅO C4vf<# j*n}Il4=̊K#x 43q 9-=ס/6w/gE}L0@D$*Sg"$! M0T D֟O+WS ըfvH $|LmEdA*h!7yGs>vi IUGP~zŽ%>!4%g\9'ivClUW͟KU-1'VD.:H+\Ȼ+u-\~Bpr~_ C1q̤ɧ[5 0s7Dm }<>}Сh:ESZ&!l-[pycTj QRg£׻IDX1Piw9艊5j2t>鍽ΚF0EК )w,"y@s)k]L==_=sE憲ĶVS'\p_rs׸>|c1Xk_«(t3uv[)O䌪'n,6`i=Z/ϞzGj.Fpt6 ȊS4)"/JzDz)}hW0bWPDtT\岥vêh.Y:/¤v[,կrk [dŹg]'bn*g0A8Llݼ#pȵt.sg(#vq+c?CRԔ8\_dheid[){ Ϲ'(%C1v-YYʋ-R88wVhkv@qOq赧kEgh an,)UP[ϪuѬn~tBdxO`n,XkA-G߃w޽w[\vjRy{ADM>8;2a6%/)̭BeziI[N Z>ֺ)4J簰] }?sX#fsnX5̋nvzleT|Y))Wanȵe Q'xG3l./YQֶUn.D2[WO֦P9XE?GgzfKY<7dW_YڐK_dMƓ{Y^M]bF$2n &KݖJS V)^ ;ɀ*4/e}Bv6ŏj&tZBY^Eks9W?@i[4Kw~rr44uڒ\KVme.Mo~/c\7WEvȲrSm8{*ߛ"E:doؗݠ8+oݬ2=r~rp_b߂_.*cIENDB`2.3_0_0_10_0_0_0_0.webp8RIFF0WEBPVP8L#/GǠ$Fa P6-Xt6jVQ ^.ljp#`i{Bw PBxQFirkFnFϜ$}B_Q <6fj"=t#p e"\[& N LF 6 T V v N Z @ 4Qm +}鏞3^yOx_o=&#HSiGM=%eE3.3.png.alpha8OPNG  IHDRHHp pHYsaa?iIDATXMoD̋wmii/HHQ 4-)8p@$ *$ڞy8xlv7ΩR7{f~{2q7(J/D6 b5hӓnoX"La&}esrr䅗9"DJiI}=ﮖ8 Ge霯;JWs>ܽ(/2/ދΗ<ȏBIm@xD<@@D<c"fAZXΞ̅Vr/HP̟σVv@־_VwH/5qe>F,ThXҽh=]Q乻{Zׁw( Ck;;W:ǷkP#sNޞBMjy/jsS "zx3[AggXDDfaM06"0aIic5Dl;R6LyYtw^ nm uȷ"㺳ڄIDVn,6QCX0M(\K"mfId%1 N4)Y<Je$td3Վdm" V'Mg-{}V;̾V (]S"AđQ$"Mi_\֐eiu|UݹNC.fZ+I8:vYU6֍N'KAB扈 @Z I[v+1IĬ5EM&棟0JDJ/)4cH]X%qF|~Ev 痢AFAhb)C, /k1}3A LJ6Z)LO'-hKws33g'ӆْ\{Sv\8v_Z"_$l\?swY>}t r~`R&ݞIENDB`normal.dark3m1.8p.3.webpRIFF WEBPVP8L/wO(l)~DpCq6~$[MJ zZF$)Y89ܝL聺 {iǵW(PP:W^]~,T"Rj,Q@A@Nɮʮ˵o<[^Aƿmi+ `zǝfD =';Dvp 9IZ~6M_&/PV."A[/\z!_'QDZ) Bu_Hj%MܚLB zWsW8l7GC˲qbhG/jw$5i\F(1B2G:…;QRDmaPUZX)^ҕE MnppuXyԈ,\;6M^JAH%J=@PU6)I +BEszqn@\[S~)#EψP* 9t'TAڜMwN]DL?.5=~DXX/cZwLǢHZ"8;gJ@@\W,$@ELzŴs8)&Fw1=q+wh.Nn.NI0}|R(( RX0ϔ J詆 8X hw6dkp7|댋gkIKa@휉Ʋ]6Kr`C/ik&7Lh~CI޶ԦD 7m z nRwyJE䑤*%=oܵcJT!{_=#? HJ@Tl8X4ʱ&r'Ϛ IoDMpP X(=_䓈$I$x}iV)4 zIjwz7:v|lg@1^>7E7o犦s1uģ/^8{0 qMm=̈́j[l~O#y/~'lJI5m8^Yç&$1Or ) Pؽɑxg%p3w]+n:Gw>6׵)م4`N16jlQGG )&\cʷ9&N:߰HDکy9ZC6)mA`Ztul{iZgʶnaͿA1T}n&NB#I30eh E Xg0mV3-g( 3V g1m|j>C#Xl nA͎ |4~3TqlѸX'֩6{6ػ+ϖl=zaד^?z`vzo u>yϟ}nߧe}}m}kg kWkG+k7:[' Icᓳ;` W22.3.webpDRIFF<WEBPVP8L//GǠm$ǻ .44 )¿.$5CAQWIRr/wwûU Cė`{Y}rܺs֜9;7HL쿵w}y?#m#MgN]>!/H`DrDD H:ɂu .-)!%h6υϏ>HG(_b#66B|!"Qݻ;;bf77w7|7?3{|\__mo<6^DHd~#c{ɴQ%$fۤ7t~=1JJ$o~G Af"%ia~.nwGA.ALZE?؝gg7L|C q!}!s ݽzc6bl'd}q-4wB@Zk"+uo;++9";d@ O|!B}@dV_j ﷇTԿd%R?\VQoDDM3}AC׷6sD$ut{Z1c8nw:cQ[v&N;<9q ~]uZ)(ph4vDD@nA1'tBgV7އ% # ClRaేJ1mQp摑2%ɸnB7 k66'Q|o ;3emHo @=Tìo1 Զ.qT]0D̄|OG+"{viYX |jF"+dYQd1| A}%$MyAW)!E2\&Y^E>pmGW!!nUeYG]_XB$6ʢAYPBD&M:RYbwv qiVVUU䩳?]jٽ%D$bmlՑ#U1H{I2JfEu亪1洞M5v)W kYYUE>HEhQj2D5_WYRM嚐Za/*j>ehIB"#DeQ䩳FO?:%w&q,,KkzkxI@Z$;pbfKA6F띷rRMȬm2LfC#dRJ[$MgZ>> ja(csZcPh6:"6χFm5?O4>ٱ+I)}EXy8.(mAp6+VzkX y|Xi9حXbbb*<>58!nͣvJ"1+ѯV /HJhVZ+?`^x62Ņz0^z%GDDF{鈈8ro^yifϟ<^{ߵ#B IENDB`4.webpRIFFWEBPVP8L|/G!H` H8($IHRU33o33?7Pxs;Y<}Cٓޒ$ɾ=/Y+ŵ^nΥc_x}||q cTLN/{]{_Ovqp|C $ĵuoj.塔 ﺹ,tJIfw7;{- z^/z$ 4ЩdC&g^I?䑼4#MQdf/*Cج㉺Y3&D3 6Ĩ*"9'QHLB㾪XgMT1=% vwNPL7턼bړQj&,%D+-ajs4V)[Mc_D\Tod€$q9H!rT nuRʅ_normal.light31.8p.3.png.alpha8PNG  IHDRxxi pHYsaa?iIDATh٢:DU2'~`9qB7`VJ______ۆ`<:߃yk< 07䟂q-Od.;+p L{GO"n]</hઙqYWW&gK%Z{+ iZR(Q U<*x05J?2E&*`6 ig-֊vNdk{Qv䈥lF+kl4?/\T'F4R$E-|*P*,>) h0I~ **\l!w-xj覘bb4abJ /\Qnh#CDC4Oo™#`9t`!+7Ց %ŅO C4vf<# j*n}Il4=̊K#x 43q 9-=ס/6w/gE}L0@D$*Sg"$! M0T D֟O+WS ըfvH $|LmEdA*h!7yGs>vi IUGP~zŽ%>!4%g\9'ivClUW͟KU-1'VD.:H+\Ȼ+u-\~Bpr~_ C1q̤ɧ[5 0s7Dm }<>}Сh:ESZ&!l-[pycTj QRg£׻IDX1Piw9艊5j2t>鍽ΚF0EК )w,"y@s)k]L==_=sE憲ĶVS'\p_rs׸>|c1Xk_«(t3uv[)O䌪'n,6`i=Z/ϞzGj.Fpt6 ȊS4)"/JzDz)}hW0bWPDtT\岥vêh.Y:/¤v[,կrk [dŹg]'bn*g0A8Llݼ#pȵt.sg(#vq+c?CRԔ8\_dheid[){ Ϲ'(%C1v-YYʋ-R88wVhkv@qOq赧kEgh an,)UP[ϪuѬn~tBdxO`n,XkA-G߃w޽w[\vjRy{ADM>8;2a6%/)̭BeziI[N Z>ֺ)4J簰] }?sX#fsnX5̋nvzleT|Y))Wanȵe Q'xG3l./YQֶUn.D2[WO֦P9XE?GgzfKY<7dW_YڐK_dMƓ{Y^M]bF$2n &KݖJS V)^ ;ɀ*4/e}Bv6ŏj&tZBY^Eks9W?@i[4Kw~rr44uڒ\KVme.Mo~/c\7WEvȲrSm8{*ߛ"E:doؗݠ8+oݬ2=r~rp_b߂_.*cIENDB`2.3.webp(RIFF WEBPVP8L/GǠ$Ir0M6/v:?c PmXpP 7apH"-3o.o]_"mHpSOHx u2{Gc;3qW'ci 1anpT¢(B}KJ@crI@kyK@mhI@iAo`ljnhsaz=3>x+=gͿ|x%M'5'zDSi5Mg5޷?xCH3.3_0_0_-10_0_0_0_0.png.alpha8PNG  IHDRHHp pHYsaa?iIDATX͏E^UtL h# *1у7!C'LVU 4ƃGc ~'8I@DvOvv{<|3L'ޱW:]8;o4[Rs0Ѩ|{ʹtNjum֍ݱl>leJwg1aٞAs++kVMw:qn9^Ͽν4`:DFt69^ɼ'd.e4mg~w1啵fJn(R*2dΙ#}g%uO0hU+Aڼ30Zk5?ukm(8q{C$Ph,Ps߇Ac;q_!@W 'py4ͽP|V2MvwT0*VlmyJ;d*%cRD)'3ҞD"tsmB IxA<Ө9D#9i' '7f#;Do;]T8a5,gTVBWE+P9 [n%ǵWZ}P Q<OUhܽC$a{cg끝}h%!W7;:]W>zc{HD̲ܠZo?~t&  ['Dvz-,*Q|dvy}!PGB@b[MM#*6 HDfq|KL8ƯMUWp* ,;OފA]á"'v6幞:`,_FAp vC n۶%cqzgV̤T}FbqΉ1έv74>Zit'b ioi6ژ37IdQX|yt.=ɽnq5gkx[IENDB`pressed.dark3m1.8p.3.webpRIFF WEBPVP8L/wO(l)~DpCq6~$[MJ zZF$)Y89ܝL聺 {iǵW(PP:W^]~,T"Rj,Q@A@Nɮʮ˵o<[^Aƿmi+ `zǝfD =';Dvp 9IZ~6M_&/PV."A[/\z!_'QDZ) Bu_Hj%MܚLB zWsW8l7GC˲qbhG/jw$5i\F(1B2G:…;QRDmaPUZX)^ҕE MnppuXyԈ,\;6M^JAH%J=@PU6)I +BEszqn@\[S~)#EψP* 9t'TAڜMwN]DL?.5=~DXX/cZwLǢHZ"8;gJ@@\W,$@ELzŴs8)&Fw1=q+wh.Nn.NI0}|R(( RX0ϔ J詆 8X hw6dkp7|댋gkIKa@휉Ʋ]6Kr`C/ik&7Lh~CI޶ԦD 7m z nRwyJE䑤*%=oܵcJT!{_=#? HJ@Tl8X4ʱ&r'Ϛ IoDMpP X(=_䓈$I$x}iV)4 zIjwz7:v|lg@1^>7E7o犦s1uģ/^8{0 qMm=̈́j[l~O#y/~'lJI5m8^Yç&$1Or ) Pؽɑxg%p3w]+n:Gw>6׵)م4`N16jlQGG )&\cʷ9&N:߰HDکy9ZC6)mA`Ztul{iZgʶnaͿA1T}n&NB#I30eh E Xg0mV3-g( 3V g1m|j>C#Xl nA͎ |4~3TqlѸX'֩6{6ػ+ϖl=zaד^?z`vzo u>yϟ}nߧe}}m}kg kWkG+k7:[' Icᓳ;` W22.3_0_0_-10_0_0_0_0.webpDRIFF<WEBPVP8L//GǠm$ǻ .44 )¿.$5CAQWIRr/wwûU Cė`{Y}rܺs֜9;7HL쿵w}y?#m#MgN]>!/H`DrDD H:ɂu .-)!%h6υϏ>HG(_b#66B|!"Qݻ;;bf77w7|7?3{|\__mo<6^DHd~#c{ɴQ%$fۤ7t~=1JJ$o~G Af"%ia~.nwGA.ALZE?؝gg7L|C q!}!s ݽzc6bl'd}q-4wB@Zk"+uo;++9";d@ O|!B}@dV_j ﷇTԿd%R?\VQoDDM3}AC׷6sD$ut{Z1c8nw:cQ[v&N;<9q ~]uZ)(ph4vDD@nA1'tBgV7އ% # ClRaేJ1mQp摑2%ɸnB7 k66'Q|o ;3emHo @=Tìo1 Զ.qT]0D̄|OG+"{viYX |jF"+dYQd1| A}%$MyAW)!E2\&Y^E>pmGW!!nUeYG]_XB$6ʢAYPBD&M:RYbwv qiVVUU䩳?]jٽ%D$bmlՑ#U1H{I2JfEu亪1洞M5v)W kYYUE>HEhQj2D5_WYRM嚐Za/*j>ehIB"#DeQ䩳FO?:%w&q,,KkzkxI@Z$;pbfKA6F띷rRMȬm2LfC#dRJ[$MgZ>> ja(csZcPh6:"6χFm5?O4>ٱ+I)}EXy8.(mAp6+VzkX y|Xi9حXbbb*<>58!nͣvJ"1+ѯV /HJhVZ+?`^x62Ņz0^z%GDDF{鈈8ro^yifϟ<^{ߵ#B IENDB`4.webpRIFFWEBPVP8L|/G!H` H8($IHRU33o33?7Pxs;Y<}Cٓޒ$ɾ=/Y+ŵ^nΥc_x}||q cTLN/{]{_Ovqp|C $ĵuoj.塔 ﺹ,tJIfw7;{- z^/z$ 4ЩdC&g^I?䑼4#MQdf/*Cج㉺Y3&D3 6Ĩ*"9'QHLB㾪XgMT1=% vwNPL7턼bړQj&,%D+-ajs4V)[Mc_D\Tod€$q9H!rT nuRʅ_pressed.light 3 1.8p.3.webpRIFFWEBPVP8L/w?($Ey |xPضmägHO&?o{զm8e%`$QVrty3 п7/*f 0C0+Q"=."(Mmɶ]-L9)Kd t8xk͈Klnwpy =ۯץ_Cd? j77A[$}jWB~GHRэR r 0kX] !$ E~8wU5J!|9.A2 8l0F|;y[w?W Tw~;S jT'&'Ai$D0mJa'LLO*Yd QCGd)SeZRR oPe*C8RH!4qi@q0[%U2K(Jw 4tE~X'C-RQeX WcypܠV2Bwduil(^]5_c1}a!*|Whhw&B7ȸTL>P(&XmЕ᪝((Uz})$Jvl\8׵J.DICeT8BDlqq?w hjuƍɵW4zVf0& a V 6-O:[몳l>Qz M[|Ƕ-N7zm I Zm_UVUe+#FRIFEXvV@_Wտm:Kh𤓏\b@:Iosk3[KJ zb;}RU'w*_hv{\6JSHQMFUQI7g؅  Iib3/[ap󹘊T=]U#֫Ng'i coliőoy:[)q0 vr.E`uބfb]1? SP5 أUU%P$h ؍?wRj4|dB kf hQ*GG|T O yOF|axvhۿ ع\֖];eGcYtI;^\gӖ?qftZR6w.+gώ=zד^?znz u>tyϟ}ߧet}}}ggp gWqgGr+g7s:W'tɫ Ue@W@ 0ׄ/W2W2.3_0_0_-10_0_0_0_0.webp<RIFF4WEBPVP8L'/GǠw_Ǐ I" ڶ>G8l%N%bp0 R}\ɖM{s[Hi?~pCڽ$IrP_+JFnFϜ$}B_Fq4T <#=K+pk"\T [Z B: F L*  & f  N @ 4Qm +}鏞3^yOx_o=&#HSiGM=%eE3.3_0_0_-20_0_0_0_0.png.alpha8PNG  IHDRHHp pHYsaa?iIDATX͏E^UtL h# *1у7!C'LVU 4ƃGc ~'8I@DvOvv{<|3L'ޱW:]8;o4[Rs0Ѩ|{ʹtNjum֍ݱl>leJwg1aٞAs++kVMw:qn9^Ͽν4`:DFt69^ɼ'd.e4mg~w1啵fJn(R*2dΙ#}g%uO0hU+Aڼ30Zk5?ukm(8q{C$Ph,Ps߇Ac;q_!@W 'py4ͽP|V2MvwT0*VlmyJ;d*%cRD)'3ҞD"tsmB IxA<Ө9D#9i' '7f#;Do;]T8a5,gTVBWE+P9 [n%ǵWZ}P Q<OUhܽC$a{cg끝}h%!W7;:]W>zc{HD̲ܠZo?~t&  ['Dvz-,*Q|dvy}!PGB@b[MM#*6 HDfq|KL8ƯMUWp* ,;OފA]á"'v6幞:`,_FAp vC n۶%cqzgV̤T}FbqΉ1έv74>Zit'b ioi6ژ37IdQX|yt.=ɽnq5gkx[IENDB`dtkdeclarative-5.7.12/src/icons/bloom/slider_point_up.dci000066400000000000000000000635161476226662700235230ustar00rootroot00000000000000DCI24fhover.dark31.10p.3.png.alpha8PNG  IHDRt/{ pHYsaa?imIDATxۖ*=a_(c<@֬*բ_hگگگگگگڿiDC>|9*F"׿HQqE .Q xeBQ I|)R Jy<20P(F"  &%,A:|HBA)R Q f{&:q(2a<18G"f`bf! bWx|7Ď<(.k6^DjQskkS133Ĥw "sG5('A^D;Hऱ b037&!0ocQA5W ,EF( ^[\e Ul]Z{МSQB܍Kɿp_bϷ$m%`.E I ->R0-Ex8 c迀_Pt]Im &Q7>FTqmW̳[l ,0v1N6vd3VDqvI8^.JGZ0.#b1e克n2Pk>d 󳿆Q>@W%.cɑ8~|hA/IU%kĘe*vEϷJzvAph {i+sTlp-c8(l!>B)uFQ!n8[_d<8: 7?v}E$S**F?Cngm`?Tkbb"!zlZI>Nsb 3>ߊU+sSVO(#Ӓxa7.Zo:cd PtX'Q6 ػg: ib:l40(xq!lw0ɰ`$]Hq]3^qQ-Lb1"9'<tl]~ߜP 氐>gx>&#\~"u[ U".ny9M 푙¾RUx'jGV^$9YUw]!#9  b+BS?nS;=W0kJC-B 0"XNmSO}~z (Cװәx[Ϛ`Z*7ϊ35L'3 ?3 WS+r@VeHA>!!n ,! 'ك EÝj.`Lj8#DZV4w `  bWV:_&[e"Bߪ̛&{R ~Ow$ĢZ5c! QY#(CddJ? '$/IENDB`2.3_0_0_10_0_0_0_0.webp^RIFFVWEBPVP8LI/GǠ$w_dEN֘g@\_!GhMH+/,=܉% 3XHr$)J벪Φ"?7"$~pCBBAA *3TW*Peܠ8Aq\9rK%*5s!B)BR% %&MOI#ik5mδWWZmsX(ScW˲%# 6[)ao{6?GOj?mc<s_Siwrs:u}u?_3.3.png.alpha8PNG  IHDRHHp pHYsaa?iIDATX˫$W<5 AfdddBb&jH`$YGMHp#3;, !*AFE۷ø8O}O=ίoO?} ?7_->%kÓ]B_VN޺+ꤜΗtx2-ƅx%zӓlQ5ǘ}Rtz2EU;bzӓ񤜷Nˡӓx:[Ե1E)>Rh 1A/];U1 bt u i7vB;.hO].B:镶^Oڂz{%OoI]ѫ'e/:kfڵx(v r6wV"geƗƓtQqZ E=HYe8 џ+tקeYK9Dc=|:Ngƅg ;BI)sއg@7c !B: OJ)x'I1 R1m_C]>L)%Hq ZuOc?a}n lq]IHHpHDDNz݊.DDH .@DtH.DD,|ȽCDdasbQDW"&%JxbQ9 ""(E w!fQZkHH܁(m͌Q{"!"2&h%U"dͭV½X2D4celVyfɄ$,/ųmX,k@sF@"͋3E>@몪] CJ)Dd&+pVzY5u|H>7Eeh4vw;|X*| ֱ +khXdF+N~X0H\l{wä F7b41"fYǐR\C$,? ryg0z[5uXMey6[.׽#f`8 +ʟ|mȢ|^-Ci!1ҙ-p03E~\n%쭑kZ,|BFBD`fbPyn֪n"Xƈ&_VU!D6ĸ(ѭ"|nw#ˢ%8~o{|{Blڋ D,",,,"?x}V6eMbՋF:v7O?|1㘠ͫfF,~=|gB !ZĶ-22B/|OlH/< {yLx!#-^}mqj'nW@DDzƣ}P|~vQIENDB`4.webpRIFFWEBPVP8L{/Gm(Ium%40xR@d۴umo[gǣBDmhCoPAC]g /knz\P;?] uV̐tR~Cʯ|VW򇐙~y} _MN(Hd<Rg-g8~T?$A^?UHKLֻ}qRqCG)mCx__:'ð8"ZRL!85EG Iv#9 fEv P9&JěHȑW DY:rxnO}IVlֽz^>=@_Ϻם 3E 2GE1^䛨>;p2Yt\OQ yq.{Ox1@9Qq_A.y֘8 y쳸D1-ZH/Ӱ\i9[ayN>z`m;>G+"v -M9P\7i ҡ[Ҥ6? *P|^*Bb9!`q[(|{G` s%S]TY"\(G5ovsK ɡ\ppWXKst #TUOQ=o{2!^q2Q vUlPf֨]f<ό#VRS ߞpu8I2jmaYׂNg}ݩ:c,bv̪'3Qg0ߞ.axۓ[(^27)a*asS JO;PADU;Ϥ< cv{6*&uJfnB<<3c}tZ +'H2a' K%IDzDZ'@)m@xG8q;?-*N}a -ReRkU @*["BTy)|zaƀRl?Pˈ9Gch0uG!"Ʃb'0rUybE=]()oFOtp&,h?h(Ѿ [y*zЮ6IT&G٣EA>" Z˺eF~¼"$Ct9EIcÑKmNq-֪j[\U PTXfr2ܔ?0 asP!_Gj\^W.A _:HQ1;n:ƈ.9T0?]=4\.;4Ae`wQ&ggf7˻7޹ 9O!ٺ.qBIENDB`2.3_0_0_10_0_0_0_0.webpdRIFF\WEBPVP8LO/GǠ$)bõjH&5ܿ3 #I63{ 6*Z<`qQ77~ÍeKƼϔX,?:$IR$) ل>!`~#?I? I0H(L IMT(Paܡ8CqU %S!TB\S9rO!"($PPPX2P`4C!mm#ґvEޑigjsZ33]Qn1ob`G؛֯~FoJ?=c4>g~n{{ݼV1{5_s=ϩt>;ܾc[aَZi3.3.png.alpha8PNG  IHDRHHp pHYsaa?iIDATX;DfƯ%w)(( JD)E(" D !  zh(@tHTiR!@%BRw=noڞ𾼷kt+Y~؞ @qZX%u?@W^k:2tfLsk;)ޑN -/=\]iTgLhfsξߋ",) 8^El);/"i64 c9Lh? T9,(õ"N")~wC݋8(ןwV^\}r$a^OA^m=Z]z5q}? :J(W`q0.q ()H8X!%5) MJ0 PAHʄԤ!$"3IA8gtD8gq!a$DbBB1!t!_ C7( 0tC0?fZ)8+ 1.L25NAnضmeۆL/9cP8%OAwf9e7e؝Ont !M\J"JSkԫfBiW덚c7aWskj($VsmӃEDyR*h" *׏/Zj{A/ŀJ.CDb\-Z;6?ߨ:b|?֢k{^HĹfX[7W` g(ۻO MJ[Vʎ)x|il'՝0{va$UAD$.tTrױM]0uyݮy%PeH\heZiqgu9m]q Awàu]1z'95ޝq,(JFbqΉ1{W vzA?Jf /!V7TJGן TM*.,ˍ)5 KO?U)Sa?O/ CKJIENDB`normal.dark31.10p.3.png.alpha8PNG  IHDRt/{ pHYsaa?imIDATxۖ*=a_(c<@֬*բ_hگگگگگگڿiDC>|9*F"׿HQqE .Q xeBQ I|)R Jy<20P(F"  &%,A:|HBA)R Q f{&:q(2a<18G"f`bf! bWx|7Ď<(.k6^DjQskkS133Ĥw "sG5('A^D;Hऱ b037&!0ocQA5W ,EF( ^[\e Ul]Z{МSQB܍Kɿp_bϷ$m%`.E I ->R0-Ex8 c迀_Pt]Im &Q7>FTqmW̳[l ,0v1N6vd3VDqvI8^.JGZ0.#b1e克n2Pk>d 󳿆Q>@W%.cɑ8~|hA/IU%kĘe*vEϷJzvAph {i+sTlp-c8(l!>B)uFQ!n8[_d<8: 7?v}E$S**F?Cngm`?Tkbb"!zlZI>Nsb 3>ߊU+sSVO(#Ӓxa7.Zo:cd PtX'Q6 ػg: ib:l40(xq!lw0ɰ`$]Hq]3^qQ-Lb1"9'<tl]~ߜP 氐>gx>&#\~"u[ U".ny9M 푙¾RUx'jGV^$9YUw]!#9  b+BS?nS;=W0kJC-B 0"XNmSO}~z (Cװәx[Ϛ`Z*7ϊ35L'3 ?3 WS+r@VeHA>!!n ,! 'ك EÝj.`Lj8#DZV4w `  bWV:_&[e"Bߪ̛&{R ~Ow$ĢZ5c! QY#(CddJ? '$/IENDB`2.webpRIFFWEBPVP8L{/Gm(Ium%40xR@d۴umo[gǣBDmhCoPAC]g /knz\P;?] uV̐tR~Cʯ|VW򇐙~y} _MN(Hd<Rg-g8~T?$A^?UH%kÓ]B_VN޺+ꤜΗtx2-ƅx%zӓlQ5ǘ}Rtz2EU;bzӓ񤜷Nˡӓx:[Ե1E)>Rh 1A/];U1 bt u i7vB;.hO].B:镶^Oڂz{%OoI]ѫ'e/:kfڵx(v r6wV"geƗƓtQqZ E=HYe8 џ+tקeYK9Dc=|:Ngƅg ;BI)sއg@7c !B: OJ)x'I1 R1m_C]>L)%Hq ZuOc?a}n lq]IHHpHDDNz݊.DDH .@DtH.DD,|ȽCDdasbQDW"&%JxbQ9 ""(E w!fQZkHH܁(m͌Q{"!"2&h%U"dͭV½X2D4celVyfɄ$,/ųmX,k@sF@"͋3E>@몪] CJ)Dd&+pVzY5u|H>7Eeh4vw;|X*| ֱ +khXdF+N~X0H\l{wä F7b41"fYǐR\C$,? ryg0z[5uXMey6[.׽#f`8 +ʟ|mȢ|^-Ci!1ҙ-p03E~\n%쭑kZ,|BFBD`fbPyn֪n"Xƈ&_VU!D6ĸ(ѭ"|nw#ˢ%8~o{|{Blڋ D,",,,"?x}V6eMbՋF:v7O?|1㘠ͫfF,~=|gB !ZĶ-22B/|OlH/< {yLx!#-^}mqj'nW@DDzƣ}P|~vQIENDB`4.3.webpRIFFxWEBPVP8Lk/GǠm$ǻ .44 )¿.$5CAQWIRr/wwûU Cė`{Y}rܺs֜9;#IjfȦ?*; w䶑#Yl>? &gKyyy1EŖZR\ Q)ĤZDj@Km@fe ]H2.n2.n>  f:2QL[@_@_+@z7 Ʒ9)F8 &"0J@Twj<i8 /]{вZzM/&r7|S*s:|g;9;^ FwrK>طuouۏ'(!normal.lightc31.10p.3.png.alpha8PNG  IHDRt/{ pHYsaa?itIDATxv* E%m 1dt\&%!ѯگگگگگگ?+gyHxϱ 7]/ {MMƾO{{<|@--d)Da|N`Wg{&&e=De`SHnv5`QC @@ K7b0hw ,! 5&& qcN%do103 KRBUeJ\ECP"Dx`q5B!`f%6#'C63UffVڦx1 "*^J MH!z2 □I" ̬gd=%Ču b&TUUO3P BQ!a" Ck7uأC9B ff &D=)ČᐣHQӅ8&E88Ѥ5i",_ poOWZpͩ{g i!_ bBr7p[ۡ2("!$F2pw"=*n!.`#h9Z&"=欻!W VF ̔`Ĉ=V&0x!DRޤ<^ktk:A.ŝB'QpB#s ҘJen$B0"P}!9i:?]8hd;p8ADb3wX&ؤpGhn`!R^!B8q6=r{2;%Bb&׏=GVT AH/5nms:onDPorkr]yDܽ&=6 fm)\1 B ˂Wk̬ȵʙntPf` :-! f`݁0A 0 QEE1VdfI\zpI3!3 >KLֻ}qRqCG)mCx__:'ð8"ZRL!85EG Iv#9 fEv P9&JěHȑW DY:rxnO}IVlֽz^>=@_Ϻם 3E 2GE1^䛨>;p2Yt\OQ yq.{Ox1@9Qq_A.y֘8 y쳸D1-ZH/Ӱ\i9[ayN>z`m;>G+"v -M9P\7i ҡ[Ҥ6? *P|^*Bb9!`q[(|{G` s%S]TY"\(G5ovsK ɡ\ppWXKst #TUOQ=o{2!^q2Q vUlPf֨]f<ό#VRS ߞpu8I2jmaYׂNg}ݩ:c,bv̪'3Qg0ߞ.axۓ[(^27)a*asS JO;PADU;Ϥ< cv{6*&uJfnB<<3c}tZ +'H2a' K%IDzDZ'@)m@xG8q;?-*N}a -ReRkU @*["BTy)|zaƀRl?Pˈ9Gch0uG!"Ʃb'0rUybE=]()oFOtp&,h?h(Ѿ [y*zЮ6IT&G٣EA>" Z˺eF~¼"$Ct9EIcÑKmNq-֪j[\U PTXfr2ܔ?0 asP!_Gj\^W.A _:HQ1;n:ƈ.9T0?]=4\.;4Ae`wQ&ggf7˻7޹ 9O!ٺ.qBIENDB`2.3.webpdRIFF\WEBPVP8LO/GǠ$)bõjH&5ܿ3 #I63{ 6*Z<`qQ77~ÍeKƼϔX,?:$IR$) ل>!`~#?I? I0H(L IMT(Paܡ8CqU %S!TB\S9rO!"($PPPX2P`4C!mm#ґvEޑigjsZ33]Qn1ob`G؛֯~FoJ?=c4>g~n{{ݼV1{5_s=ϩt>;ܾc[aَZi3.3_0_0_-10_0_0_0_0.png.alpha8PNG  IHDRHHp pHYsaa?iIDATX;DfƯ%w)(( JD)E(" D !  zh(@tHTiR!@%BRw=noڞ𾼷kt+Y~؞ @qZX%u?@W^k:2tfLsk;)ޑN -/=\]iTgLhfsξߋ",) 8^El);/"i64 c9Lh? T9,(õ"N")~wC݋8(ןwV^\}r$a^OA^m=Z]z5q}? :J(W`q0.q ()H8X!%5) MJ0 PAHʄԤ!$"3IA8gtD8gq!a$DbBB1!t!_ C7( 0tC0?fZ)8+ 1.L25NAnضmeۆL/9cP8%OAwf9e7e؝Ont !M\J"JSkԫfBiW덚c7aWskj($VsmӃEDyR*h" *׏/Zj{A/ŀJ.CDb\-Z;6?ߨ:b|?֢k{^HĹfX[7W` g(ۻO MJ[Vʎ)x|il'՝0{va$UAD$.tTrױM]0uyݮy%PeH\heZiqgu9m]q Awàu]1z'95ޝq,(JFbqΉ1{W vzA?Jf /!V7TJGן TM*.,ˍ)5 KO?U)Sa?O/ CKJIENDB`pressed.dark31.10p.3.png.alpha8PNG  IHDRt/{ pHYsaa?imIDATxۖ*=a_(c<@֬*բ_hگگگگگگڿiDC>|9*F"׿HQqE .Q xeBQ I|)R Jy<20P(F"  &%,A:|HBA)R Q f{&:q(2a<18G"f`bf! bWx|7Ď<(.k6^DjQskkS133Ĥw "sG5('A^D;Hऱ b037&!0ocQA5W ,EF( ^[\e Ul]Z{МSQB܍Kɿp_bϷ$m%`.E I ->R0-Ex8 c迀_Pt]Im &Q7>FTqmW̳[l ,0v1N6vd3VDqvI8^.JGZ0.#b1e克n2Pk>d 󳿆Q>@W%.cɑ8~|hA/IU%kĘe*vEϷJzvAph {i+sTlp-c8(l!>B)uFQ!n8[_d<8: 7?v}E$S**F?Cngm`?Tkbb"!zlZI>Nsb 3>ߊU+sSVO(#Ӓxa7.Zo:cd PtX'Q6 ػg: ib:l40(xq!lw0ɰ`$]Hq]3^qQ-Lb1"9'<tl]~ߜP 氐>gx>&#\~"u[ U".ny9M 푙¾RUx'jGV^$9YUw]!#9  b+BS?nS;=W0kJC-B 0"XNmSO}~z (Cװәx[Ϛ`Z*7ϊ35L'3 ?3 WS+r@VeHA>!!n ,! 'ك EÝj.`Lj8#DZV4w `  bWV:_&[e"Bߪ̛&{R ~Ow$ĢZ5c! QY#(CddJ? '$/IENDB`2.3_0_0_-10_0_0_0_0.webpRIFFxWEBPVP8Lk/GǠm$ǻ .44 )¿.$5CAQWIRr/wwûU Cė`{Y}rܺs֜9;#IjfȦ?*; w䶑#Yl>? &gKyyy1EŖZR\ Q)ĤZDj@Km@fe ]H2.n2.n>  f:2QL[@_@_+@z7 Ʒ9)F8 &"0J@Twj<i8 /]{вZzM/&r7|S*s:|g;9;^ FwrK>طuouۏ'(!3.3_0_0_-20_0_0_0_0.png.alpha8PNG  IHDRHHp pHYsaa?iIDATX˫$W<5 AfdddBb&jH`$YGMHp#3;, !*AFE۷ø8O}O=ίoO?} ?7_->%kÓ]B_VN޺+ꤜΗtx2-ƅx%zӓlQ5ǘ}Rtz2EU;bzӓ񤜷Nˡӓx:[Ե1E)>Rh 1A/];U1 bt u i7vB;.hO].B:镶^Oڂz{%OoI]ѫ'e/:kfڵx(v r6wV"geƗƓtQqZ E=HYe8 џ+tקeYK9Dc=|:Ngƅg ;BI)sއg@7c !B: OJ)x'I1 R1m_C]>L)%Hq ZuOc?a}n lq]IHHpHDDNz݊.DDH .@DtH.DD,|ȽCDdasbQDW"&%JxbQ9 ""(E w!fQZkHH܁(m͌Q{"!"2&h%U"dͭV½X2D4celVyfɄ$,/ųmX,k@sF@"͋3E>@몪] CJ)Dd&+pVzY5u|H>7Eeh4vw;|X*| ֱ +khXdF+N~X0H\l{wä F7b41"fYǐR\C$,? ryg0z[5uXMey6[.׽#f`8 +ʟ|mȢ|^-Ci!1ҙ-p03E~\n%쭑kZ,|BFBD`fbPyn֪n"Xƈ&_VU!D6ĸ(ѭ"|nw#ˢ%8~o{|{Blڋ D,",,,"?x}V6eMbՋF:v7O?|1㘠ͫfF,~=|gB !ZĶ-22B/|OlH/< {yLx!#-^}mqj'nW@DDzƣ}P|~vQIENDB`4.webpRIFFWEBPVP8L{/Gm(Ium%40xR@d۴umo[gǣBDmhCoPAC]g /knz\P;?] uV̐tR~Cʯ|VW򇐙~y} _MN(Hd<Rg-g8~T?$A^?UH|9*F"׿HQqE .Q xeBQ I|)R Jy<20P(F"  &%,A:|HBA)R Q f{&:q(2a<18G"f`bf! bWx|7Ď<(.k6^DjQskkS133Ĥw "sG5('A^D;Hऱ b037&!0ocQA5W ,EF( ^[\e Ul]Z{МSQB܍Kɿp_bϷ$m%`.E I ->R0-Ex8 c迀_Pt]Im &Q7>FTqmW̳[l ,0v1N6vd3VDqvI8^.JGZ0.#b1e克n2Pk>d 󳿆Q>@W%.cɑ8~|hA/IU%kĘe*vEϷJzvAph {i+sTlp-c8(l!>B)uFQ!n8[_d<8: 7?v}E$S**F?Cngm`?Tkbb"!zlZI>Nsb 3>ߊU+sSVO(#Ӓxa7.Zo:cd PtX'Q6 ػg: ib:l40(xq!lw0ɰ`$]Hq]3^qQ-Lb1"9'<tl]~ߜP 氐>gx>&#\~"u[ U".ny9M 푙¾RUx'jGV^$9YUw]!#9  b+BS?nS;=W0kJC-B 0"XNmSO}~z (Cװәx[Ϛ`Z*7ϊ35L'3 ?3 WS+r@VeHA>!!n ,! 'ك EÝj.`Lj8#DZV4w `  bWV:_&[e"Bߪ̛&{R ~Ow$ĢZ5c! QY#(CddJ? '$/IENDB`2.3_0_0_-10_0_0_0_0.webpdRIFF\WEBPVP8LO/GǠ$)bõjH&5ܿ3 #I63{ 6*Z<`qQ77~ÍeKƼϔX,?:$IR$) ل>!`~#?I? I0H(L IMT(Paܡ8CqU %S!TB\S9rO!"($PPPX2P`4C!mm#ґvEޑigjsZ33]Qn1ob`G؛֯~FoJ?=c4>g~n{{ݼV1{5_s=ϩt>;ܾc[aَZi3.3_0_0_-20_0_0_0_0.png.alpha8PNG  IHDRHHp pHYsaa?iIDATX;DfƯ%w)(( JD)E(" D !  zh(@tHTiR!@%BRw=noڞ𾼷kt+Y~؞ @qZX%u?@W^k:2tfLsk;)ޑN -/=\]iTgLhfsξߋ",) 8^El);/"i64 c9Lh? T9,(õ"N")~wC݋8(ןwV^\}r$a^OA^m=Z]z5q}? :J(W`q0.q ()H8X!%5) MJ0 PAHʄԤ!$"3IA8gtD8gq!a$DbBB1!t!_ C7( 0tC0?fZ)8+ 1.L25NAnضmeۆL/9cP8%OAwf9e7e؝Ont !M\J"JSkԫfBiW덚c7aWskj($VsmӃEDyR*h" *׏/Zj{A/ŀJ.CDb\-Z;6?ߨ:b|?֢k{^HĹfX[7W` g(ۻO MJ[Vʎ)x|il'՝0{va$UAD$.tTrױM]0uyݮy%PeH\heZiqgu9m]q Awàu]1z'95ޝq,(JFbqΉ1{W vzA?Jf /!V7TJGן TM*.,ˍ)5 KO?U)Sa?O/ CKJIENDB`dtkdeclarative-5.7.12/src/icons/bloom/slider_round_hor.dci000066400000000000000000000633721476226662700236650ustar00rootroot00000000000000DCI24fhover.dark3M1.10p.3.webp.RIFF&WEBPVP8L/ *d'/?($ ۦ矁۶OWI0ISmǠ5~3^ m\B?#hhA( Yd0ʇċ7# $P-O9aF %v6Ȉx 9Du΍|)kc~NA|(&b,5Qz_B$gE`1z"Ȏfm~YhhE1b/d0O'0F-āPV=23/I!I< { B#?HIV E3bUju9,BJDT #B.wRd"$yAyȕDU=2>0ɚOymUIg^WI%ɒj$;.%Vg][֐3WA@ H빽xomWfUݲhҐ2&-,D_TՎ k_ݶ!ҢH60MQ/n: rihK܃4?a.4;KI^N;Uչ-5rh9>@h!h:`ZeZMŅpr 5;\GUtԣnӴB Ga]{*-UVzu6D=AH dZ6I@gj>:87%0&a}T-?HG|$_@HG%x(WGol.aXpKv$ ̾@Oƥ#55> ;!iikb4,y62"ql4v"4<~ݹ̇JthGyffi>h+>ߣ'3.3.png.alpha8PNG  IHDRHHp pHYsaa?iIDATXϋdWs9{qFB`feLFp+ p_2AНIҐH.Ġ a HLWuwqUWWU\]4Տw>~Xf@DPܶ}CL)K^lSX30HmӴ>Ɣٸps'BI$HuEyd^ӳ!$"Iim\9>: iﭯO.>ƔS)/G9rI;:}tzv^7>rΒHq =>zybVkC@zQk'^NguC["/=nn7Ƈ<[-PHZ?]QK\mC;1mSZӳ7M[>Ĕwbm6^k iL)kڮo@KyCy' 9 |1ɞ@"")| ]C1?c 1D}w)RL1iq0ݶDKN)g9PɒsJY#/ @@rɇ9Er5n rn" 7x5ǢdĔQ-k[Gɸ*azwu1SE܆.;H@Lڹj49>>W5:3?l1eļ}x2*e~@s9ۜEi'Gjo^&okߵu}~v6_lGh\Κlh. MQFx4* k6H[}|~1ևRZ{ADZWըYcyGamlٴmbI=*$ŬsEQj_]:k7hCk۶|)ů6:5ưZ  ||1)E _l/Γ_6,eUY3k#lSL17FRDLLLj+%J:Y0/4H"&"Ngi/>b_t͋RDL`7d)I{6*B"E} }뇏YKW~`P~e$+h'""'?Tm7?ϸtnhz-5'+(̧~l/Pj`ղIENDB`4.webpRIFFWEBPVP8L/G!H` H8($ȶݶ @BQݽWuQ!H@ xO;>}ϗUiۋ.JcnOX^J^ ,/<\espS=,}csiuNmJ݆Fsiwl52;ufS0k@cfOE0[.ZmE.bnO_E!E7 [퇱go jmw;۴Bf;!O%9 ݠe]R^fu՞~YQOa_Wn1T4cDT>"] j ĻY*f H@t$H!/JE xyU: RyftX)T,1xЕOG CTr, 3֬x[muk4xkj[o0NC@^, XͯV ZK+SJS_q -mĥe!6\|l{`9m܇@'tblaTs(s%MZvuw5 =W?9/&1)@ߌ'ƅ彬>T8sM(`y햯E w @ Ұ]̾]hover.light31.10p.3.png.alpha8PNG  IHDRt/{ pHYsaa?iFIDATxۢ* 0" hs׬Ϝ@"O~'?O~[᯷;,} o7G߁Zct>{0>xQ !3-Ĉ꘦cmo2;"0=@pyJc|PhyPF@ *L3$ۓþu\iJ=b0=tFf ŬtDa\P1pNsM$C 3 ((ki)`"’  A 2u8PB`(+L&"=9.rHQQQVҁbFa6HIPef+@vAd* E-30HH3 _݀,&\XVp"|$*o̎1eڎycAR-@$,"D w."=) QHp&+Wu7` fˌޔ)״I,2hL"=dhױ/ 8־\tI^ߓ{nIcM|U|yŝ=k#B9*ǰ=(MҗJ{BDN@b# yJaO( Bf:|cCC%—_;|1<ޛ#O^B4ٙ-,!J26^C<7+٤gi;ڞ?آ݅}ķeAmKbVCl{#>Y"jh_F1jS떷C& 5z q9l/_BĶG EWl{9D4:>1G@?G]ɋ9ze.:}ћN8 SI4kk3DC/u"de~]JsMΞJs ]Z`m;PicDZDjiY, u7U Ьɝvj@AUU T-x1P'+ZQ,T J6#V*A?D?DP]&ԀX[cvHr(-E3&@k BRˌtr&TSD%WܢL4Uk:r!]~zړ9HF @5@r3uD&ɬ5"D((gӎZpzpe.#5lovܗ%8;ves55e:;>*i&(5̜uޕ$=0!:rjM( (3[u 5Ϥs^kʽ L>)|cGtVjx;d>Mi{@[Dv:,&OZ51i1HS2O>Y=[?NR}>G{\^ODfR!A(v8x,JB@7{!W4, "eQM&*-s\MTS~oݩ3EAk9:c!`0XB*tڪbEo^J{ )zP'2k͕-#L$%.w RjX#S u,t+F2lv;E_"#}ݠ? upM0lYYe'ҵSÚa_Z)@ 6 OJ*#zqú_^.2 .v=ȃ61|\ 8W!y5}P7oR/IENDB`2.3_0_0_10_0_0_0_0.webp^RIFFVWEBPVP8LI/G$`P6-Tt6#V #6]`ďG>̗i #툾,!By5j0r"mHRg96OZyvAžA)^;ݯ8IcC$޾d I_5?;/o ]W^!{.۾*[w3״m=PZHP1|=*W瀒GHؠ6ՈP3ָU;.we eN(z]慢o Em.e/O'"h)@?*D($ (_RQ;5obέo%QPTo޼wBPN$1x .<{b6V%"V*P/+[җ,- k!RDaN ;v8Ȳq!1kI-(+K@DbV&kO7`bR׋$Rl8Y06"nQo?H O;ʼn@_,^̄.Gy)u5wNwЩww{{E-[O[^"0˩1 >R^0*E2x$V;^N@Vzl_hulQz],ͲºxleiMCѕ<ϲjB^ley~%ΣegOARe)-x,B>#-EP)m)gt:G"Vd|Dk@g~w""l:sV9ހ6SbŌo6W*UWeQ7 Nߌ#:z>{Tx(#0iC8b./$!"T ̼jFS#fLdTTki!Vl@1Z3-0e %kFFDV& 9 e P=B6aF-U%DR& 0>j@uԉ(Z@ e(D~*$xQNƳas.鰓$I'8oYG$I:㧣 7nUu$T}لJ@ォosBBbm:Z󽩌" DD,s!$be(^?Ł}#Ӑ;DD91L\"hmǁ޾zR)eLֺā'_*;p0XH82F_ 8:)t4mĝNj&chΉ-<|F'(bo\,6FkDAgr;'"NdF̤bf"~@y'u]m"&$B|UB@ޏ=4UH]ԈMǡɈX8zIu޼g@;Zbff{k9"}5IENDB`normal.dark31.10p.3.webpRIFFWEBPVP8Lw/ O(l)~DpCq6~$[MJ zZF$)Y89ܝL聺 {iǵW(PP:W^]~,T"Rj,Q@A@Nɮʮ˵o<[^Aƿڶmi dD2 GRa.>!w~s"/A6@HΜ|+sCF gXA{ՈmcD ,"AJH-r!c; $J0"FFR|; %BFEgwkW9P~`pf  B/ 0W HFoHK" STfjobO#I޶[ 6*P]HaO\y2T5fOVI 8[bF\4Js,UaV{ QOߖV']3j+G3-&j\I)0CYm H/ИZk ֊A%."T6[m[Tz65Պǃs-R["A@@D>iD|`dZ OE%ړ:QmODU.L+YWv*ӂ= (l 泪c-Fy]E TOA: &6,ܹ=vl,VDbx֛sPMs'P;ImP̀q#F#1TmΉP}jCSlw-;~.sYܲu%E1uxҴMj;+G9U+* o6ޖ\pcsxLAe5_<1K!P]J?ʧ6ATNRo|g%Q{yȽ0L6wy"KT%5L{n*af~rmtkfû7uLB??/v{Sv:6}]ZeǷ'ա}dfMjx)[݊sML`:> ? ;l:R[!yk^qr'-, k)jɱ>YN.[z2ЧR6Z)/b+ůbpA0/RNH\|ȝpQr?AJ a+mݵߨ ԀtV6HerRz {*$=M)lI!lԬcMr_a"X I7R'Tf~Z0?AA BB~u Lak@gE*W" nWTB*TwL:ddD TRi0# :D@75ij‡4<G18BAKoy{%&=$L4$"Amظ #ğxc6&B$׵@HZ1 8G\ik3\;ҟ Vf49ًAYAIFmgfxgaw7fxewyFx=a=0F d=QFf=rF+h=F;j=FKl=F[n=F~saߞ78 Y 3bF._b*b/2.3.webpnRIFFfWEBPVP8LZ/GvS&PHR3x4E]M$Iʙ?g|)3c<'ޅ,>"q"|1Bq/޵ݳݱm#G=ag~Xf@DPܶ}CL)K^lSX30HmӴ>Ɣٸps'BI$HuEyd^ӳ!$"Iim\9>: iﭯO.>ƔS)/G9rI;:}tzv^7>rΒHq =>zybVkC@zQk'^NguC["/=nn7Ƈ<[-PHZ?]QK\mC;1mSZӳ7M[>Ĕwbm6^k iL)kڮo@KyCy' 9 |1ɞ@"")| ]C1?c 1D}w)RL1iq0ݶDKN)g9PɒsJY#/ @@rɇ9Er5n rn" 7x5ǢdĔQ-k[Gɸ*azwu1SE܆.;H@Lڹj49>>W5:3?l1eļ}x2*e~@s9ۜEi'Gjo^&okߵu}~v6_lGh\Κlh. MQFx4* k6H[}|~1ևRZ{ADZWըYcyGamlٴmbI=*$ŬsEQj_]:k7hCk۶|)ů6:5ưZ  ||1)E _l/Γ_6,eUY3k#lSL17FRDLLLj+%J:Y0/4H"&"Ngi/>b_t͋RDL`7d)I{6*B"E} }뇏YKW~`P~e$+h'""'?Tm7?ϸtnhz-5'+(̧~l/Pj`ղIENDB`4.webpRIFFWEBPVP8L/G!H` H8($ȶݶ @BQݽWuQ!H@ xO;>}ϗUiۋ.JcnOX^J^ ,/<\espS=,}csiuNmJ݆Fsiwl52;ufS0k@cfOE0[.ZmE.bnO_E!E7 [퇱go jmw;۴Bf;!O%9 ݠe]R^fu՞~YQOa_Wn1T4cDT>"] j ĻY*f H@t$H!/JE xyU: RyftX)T,1xЕOG CTr, 3֬x[muk4xkj[o0NC@^, XͯV ZK+SJS_q -mĥe!6\|l{`9m܇@'tblaTs(s%MZvuw5 =W?9/&1)@ߌ'ƅ彬>T8sM(`y햯E w @ Ұ]̾]normal.light3Z1.10p.3.png.alpha8PNG  IHDRt/{ pHYsaa?iFIDATxۢ* 0" hs׬Ϝ@"O~'?O~[᯷;,} o7G߁Zct>{0>xQ !3-Ĉ꘦cmo2;"0=@pyJc|PhyPF@ *L3$ۓþu\iJ=b0=tFf ŬtDa\P1pNsM$C 3 ((ki)`"’  A 2u8PB`(+L&"=9.rHQQQVҁbFa6HIPef+@vAd* E-30HH3 _݀,&\XVp"|$*o̎1eڎycAR-@$,"D w."=) QHp&+Wu7` fˌޔ)״I,2hL"=dhױ/ 8־\tI^ߓ{nIcM|U|yŝ=k#B9*ǰ=(MҗJ{BDN@b# yJaO( Bf:|cCC%—_;|1<ޛ#O^B4ٙ-,!J26^C<7+٤gi;ڞ?آ݅}ķeAmKbVCl{#>Y"jh_F1jS떷C& 5z q9l/_BĶG EWl{9D4:>1G@?G]ɋ9ze.:}ћN8 SI4kk3DC/u"de~]JsMΞJs ]Z`m;PicDZDjiY, u7U Ьɝvj@AUU T-x1P'+ZQ,T J6#V*A?D?DP]&ԀX[cvHr(-E3&@k BRˌtr&TSD%WܢL4Uk:r!]~zړ9HF @5@r3uD&ɬ5"D((gӎZpzpe.#5lovܗ%8;ves55e:;>*i&(5̜uޕ$=0!:rjM( (3[u 5Ϥs^kʽ L>)|cGtVjx;d>Mi{@[Dv:,&OZ51i1HS2O>Y=[?NR}>G{\^ODfR!A(v8x,JB@7{!W4, "eQM&*-s\MTS~oݩ3EAk9:c!`0XB*tڪbEo^J{ )zP'2k͕-#L$%.w RjX#S u,t+F2lv;E_"#}ݠ? upM0lYYe'ҵSÚa_Z)@ 6 OJ*#zqú_^.2 .v=ȃ61|\ 8W!y5}P7oR/IENDB`2.3.webpPRIFFHWEBPVP8L;/Gh]xmH&?1 5Pa@g+(qhy`aفFnF:˩8~EsvN9M^ǽo 0رOyΝ fX토sAKn↶ c *ږ'@qPՏJ>_ 5Mj2A4YZCQ_f{ ^e"e2e/O'8??7SY[ NH=&ڣZ=X@`VoaZ쯗Nf+(llnlLҨVEf/_RtF}ksMri軜s`$(%N+hA{̶O ~޵9}ʔn' ;a'PodH,!w~s"/A6@HΜ|+sCF gXA{ՈmcD ,"AJH-r!c; $J0"FFR|; %BFEgwkW9P~`pf  B/ 0W HFoHK" STfjobO#I޶[ 6*P]HaO\y2T5fOVI 8[bF\4Js,UaV{ QOߖV']3j+G3-&j\I)0CYm H/ИZk ֊A%."T6[m[Tz65Պǃs-R["A@@D>iD|`dZ OE%ړ:QmODU.L+YWv*ӂ= (l 泪c-Fy]E TOA: &6,ܹ=vl,VDbx֛sPMs'P;ImP̀q#F#1TmΉP}jCSlw-;~.sYܲu%E1uxҴMj;+G9U+* o6ޖ\pcsxLAe5_<1K!P]J?ʧ6ATNRo|g%Q{yȽ0L6wy"KT%5L{n*af~rmtkfû7uLB??/v{Sv:6}]ZeǷ'ա}dfMjx)[݊sML`:> ? ;l:R[!yk^qr'-, k)jɱ>YN.[z2ЧR6Z)/b+ůbpA0/RNH\|ȝpQr?AJ a+mݵߨ ԀtV6HerRz {*$=M)lI!lԬcMr_a"X I7R'Tf~Z0?AA BB~u Lak@gE*W" nWTB*TwL:ddD TRi0# :D@75ij‡4<G18BAKoy{%&=$L4$"Amظ #ğxc6&B$׵@HZ1 8G\ik3\;ҟ Vf49ًAYAIFmgfxgaw7fxewyFx=a=0F d=QFf=rF+h=F;j=FKl=F[n=F~saߞ78 Y 3bF._b*b/2.3_0_0_-10_0_0_0_0.webpnRIFFfWEBPVP8LZ/GvS&PHR3x4E]M$Iʙ?g|)3c<'ޅ,>"q"|1Bq/޵ݳݱm#G=ag~Xf@DPܶ}CL)K^lSX30HmӴ>Ɣٸps'BI$HuEyd^ӳ!$"Iim\9>: iﭯO.>ƔS)/G9rI;:}tzv^7>rΒHq =>zybVkC@zQk'^NguC["/=nn7Ƈ<[-PHZ?]QK\mC;1mSZӳ7M[>Ĕwbm6^k iL)kڮo@KyCy' 9 |1ɞ@"")| ]C1?c 1D}w)RL1iq0ݶDKN)g9PɒsJY#/ @@rɇ9Er5n rn" 7x5ǢdĔQ-k[Gɸ*azwu1SE܆.;H@Lڹj49>>W5:3?l1eļ}x2*e~@s9ۜEi'Gjo^&okߵu}~v6_lGh\Κlh. MQFx4* k6H[}|~1ևRZ{ADZWըYcyGamlٴmbI=*$ŬsEQj_]:k7hCk۶|)ů6:5ưZ  ||1)E _l/Γ_6,eUY3k#lSL17FRDLLLj+%J:Y0/4H"&"Ngi/>b_t͋RDL`7d)I{6*B"E} }뇏YKW~`P~e$+h'""'?Tm7?ϸtnhz-5'+(̧~l/Pj`ղIENDB`4.webpRIFFWEBPVP8L/G!H` H8($ȶݶ @BQݽWuQ!H@ xO;>}ϗUiۋ.JcnOX^J^ ,/<\espS=,}csiuNmJ݆Fsiwl52;ufS0k@cfOE0[.ZmE.bnO_E!E7 [퇱go jmw;۴Bf;!O%9 ݠe]R^fu՞~YQOa_Wn1T4cDT>"] j ĻY*f H@t$H!/JE xyU: RyftX)T,1xЕOG CTr, 3֬x[muk4xkj[o0NC@^, XͯV ZK+SJS_q -mĥe!6\|l{`9m܇@'tblaTs(s%MZvuw5 =W?9/&1)@ߌ'ƅ彬>T8sM(`y햯E w @ Ұ]̾]pressed.light381.10p.3.webp`RIFFXWEBPVP8LK/ ?($Ey |xPضmägHO&?o{զm8e%`$QVrty3 п7/*f 0C0+Q"=."(M۶նU4 14mC,)w䶍@H^T?H~̡3"J7"wiԱwE$J)Rr |J)}A4HD#Rd ~03#3|JI!R[]+ n#)1^ sq(؞ e_*'ɛ&BzO&gZZME`Nog>JFd(o' .ra(=D3$ˮF,H yF1qyƹVr3vYcM~wɺ;-T' _L:B{^U;-njE(R) rn<]?4Vq(*T&K&RDj"jqR)Pdo $KXRM:i0VMJ"@/M&ǝ)U mFn)u2?T}OB;)DuMsFͨai=: 9݂ފϼӈ,&bL iV{hIfQsǞ"c+Ȯ[꤀:*niQqc3vy%-`;4ƪϴνB?4bݫ_F-YvM$s ǪK+M*w-- fW  vViuKf f!j f^;ܐVC&.A(W".0l[  i[{oGjJ'½%kuhz:=uءs> ;ŞcCfEwhymoE2y~{Xj"/# \MIB29G^tLY[pem0NN "̤Hd:;hRDA^ξFHBY^hE h:6?B*/ ~耿KpRHu6-BkshZ*Ng4%nwBe8V}̿\ C(4&8*P ɯN‘)9|dsru.¬+ 4f;`{o&Wac b#A32(5S8KsOq2Q3UAI~d43D܏W$d0o˕`v@<$_kLD? qׂ#fh1D&86as pdkH#\K{ [fx`g/fxegqy&ig ՛ᝅ!ݘ9Gkwfx<da/DaoaLaa/TaoF̅ >{b1`f(1J|J\Ko,2.3_0_0_-10_0_0_0_0.webpbRIFFZWEBPVP8LM/Gw_Ǐ I"ڶx8ZVm+y aG2e`3[\4FÍ3XI_yoSFnF:˩8~iqE|쌤~F4}zNIC@kx 3t^~꺖AsA5iԺm3@ǶBŵPu6(Տ%Xc{j2BPt.BѷE2d(P.U<yO>K<'O[͓yg^yYeާh~/X4~o43.3_0_0_-20_0_0_0_0.png.alpha8PNG  IHDRHHp pHYsaa?iPIDATX?lU4MҢ0Q)KJ*QT Ht.!10uEU%T*Hmg}1;l ys={hD4JkwFਃg:HHm 0n9Z vX(ܲ\[;_kfvc) , ÏjT? H1&醈rn{~|`&+;V+$fY^T=8}wz$rmXH҃J))LЙ7n,1F+TJ?{ZFBJVZa~4:q84Fk# z~QcsPC1H]:qm1ʃV4I, mp8t{YouXcd[͋4A%2 f#p. C H,P"A|q:EV %JDaեv:BLQRt:a'^JC΂F]!2 -D7'-2!= NDBH̐J!B :b{qIJe'b3< FwWw$Jj )(ghȞ'ڀɥ )O/1۞7{ۇ}hA#ǷӉYuy DLIMBB!N!Ϡ&!e%"1iP9ߋ,(8}!yssJCW"SPrv8 p0\3Z,HAupH(|ޱٽt9=e"a~ΦwSMjy~HY1 E߳KnJF+ZधDfyrrq#\51fRZjp:tTp-FvfRu:whuhԄ'IDmX98hG4eZW3!!^237?7]g?%_h)MZ,PrbeСDxPBJM^(cۮW>8??7SY[ NH=&ڣZ=X@`VoaZ쯗Nf+(llnlLҨVEf/_RtF}ksMri軜s`$(%N+hA{̶O ~޵9}ʔn' ;a'PodH,"hص ڇSz@6ut\z B\mY$kqg, 9$Whsh*Ro+و4%1x - 'NF Q`R 9WRö>L'\m P~ⲇ쮔u%6 "C;3J^wc?=،hҙ)Q-b{/@:89 :R409xhS1<("S4aڠd<1KF.X-fZ1i{Ц7TU֤Quf C)xbJy hc0ge(b 3%N%g=e:&IJ/2XbR#yrj+P@]> evh ,$dT$zi*8pp*2,oQJ#YC:9/wt^wp y (o_}?s ?<o}N~_9!~_{Jߏ^`7~ ~#߫`﯂Y qDT-KjyxtDDsxz7 ݥ?sM2.3_0_0_10_0_0_0_0.webpBRIFF:WEBPVP8L./G$wIVk m8|D< Q|$ XCsQW$+<VYZ?#m 8sT媛ets|dh7==Gi_聊>(,MkVAݰ.A.rur9ɧk]^\ׂ\ǢZFO@ofI!"10Bh-ބų N]#DU \E_qON_8gN>%L~ILmL#SaGL=)>e313.3.png.alpha8PNG  IHDRHHp pHYsaa?iIDATX헿$G߯ٙ;,;,De8ki#lL,HH8Le#BH#0ݝUUz;s;DnuWg zãcR5bN ?A$|p ؋qQ̀D |qT7}F}-ٹb/-KR/mc-9f)mS/@=4m1eRiNoi}n;]6]y r]״]w')Ӕb}_ ܎)1vy=LbS=bJ)iMi֔br; ZI)(̫ U5 LsVKTsVsɊ\33'Hjjp!uEźlBҘAFI8|2}^5T`2W !j$D" T]v1gHpQ@@Dd2pK7f5)CDDZuxovl:RMNS1F,l7|&RV_MUDiz^5HOg޸ [0}][GGd:ۛTU||f!,mš,Fd2We"?_oOcwm]/˺isY/j4޻ų @`jڶ)i5 D\(>8^mmS]׶mϚ6!{!E^7j՘V>ƔU7X."±q1Ŕ :4lNc֟/$SN948 D@$"faaa+2g.Y3MDLL,,y&>KLshCbwg@pOdK78!;$FfǏҳA)MZ5 ?Բf;8>Sq֭g}7(ڗEq9?fS]UR$IENDB`4.webppRIFFhWEBPVP8L[/G!H` H8(۶i˵ prSڗ"EՒ?Itv^VgY}*+Uɪ+*+UɪaYclUnarGW<^e(bcf wlcfElcM׀";kj hzҢΞ Iӽz.@~j9 R ci Z%bD2p"ʿ_QH"wf Brƹ|XMGRx">XT 3`ka+<<O^ }HQx.YJz#ͬA^ @3x@s3vr|>M]$̦}jM'"dɞ}vG6|l~ OA79ԒBAjPQ?YZMyм*T{)aI-$ js _w\I󬸸VQІ^5k$iAPh#7SF4R$E#yQ`#.ygnU6MMM 濳y6VuᢒSH1101wp%m-)l1uXH332E՝{^3ϨԔ⚙)sTL^<).. ?L'= _h67At M.К$6fť~+Thi| K@͡hWW|vOw.y\I䟔~$nIqY)B4וI^( %$aI1"y\z\OWևB5yJ^0uxLePj YȋJZ<|]:[O=#*| Qkj3sKW#wUU$}eq(%©\}oE!ݽ%V5l\\HjG,9.+"Ȳ4-ݢzZ4 7<F! _huGL/ǰ1@"Q $:3wGpbVCŰOqliFSsJ+0CDTDT\rz(w/0w< np<[ө/zNtlOɕ!: Q`5İ%ۖ]4dV%{An.zS9bj "q+X(]bl1l HqQvXO:G{a 1j4:ei\A:*KHph]|\{[nz43k_F9߶{dqnu޶At~dۆKިvKx=6m_ezY*h*)VMqfkuգu>lj+"睃/iU3D1E65S}ԭk:7qQQ]f\y'33x$VhD+^iޡ4%*赧k¬,~ & Mc~:p>g0R\M g6jZ>Ց^ռSۡ^)뗩Mpf/)&0iBG '6oܐ2 4v߷^3|adUU^0we\Di {\|!t6.ŀ*I!.v}O籗 ؍Y7m^| Y]I1f}ߎl*[0zTcjM`O_n.|Xhè93j8a8>>hUip&x"zw3xCրͱwfc˒~~y3ĦCx-PLޜs/qUsȬWu\M, +on1r*x^D$W75Y9zp~7 jBOަmڬqlN;yY~1 wSϛ$mooAدnƝ;50EU>}cX7ٲpWSw3w/%ո7=E4t]C kъO6_&frGg|%G AUZIvTNSpyB{a-RtЏ+z~}P<%ORl/]۰;c_VfyE}IY̗i #툾,!By5j8n$Izy[Fn8noq q^T7Ku+q;zbj{!Cu=X趛d%a\grV9ԙe m-۱ur w \yl 50YTA4 Y*D "տ83p;|Kɓ|ۘG0^ԏzS_S}g>c3.3.png.alpha8PNG  IHDRHHp pHYsaa?iIDATX헻E33w># [BD`!`DJ!dd1dd!DF0!a,l˷{"ӝo]G%ٞW=] cbPЎ$'^B ! 1y {~,^q.{n9ǣj@Hq? hsk<)*/T#5D$f^\2zZ5J|Y69@".Jwq;w'(&A;4h*A\lxR"䵯TA y|t(}8ҲT5(mG`8+TAܙ{U Op0Mj1l(-m@ͼsp1+d~|UI~e[EQ0ૢ { XEQyivT|Uey1rΔTOTU]Kss4몒u {Bj_]R}-',"/ƓStRED~ hѓtX5VX' ?L4hUJٝuԬ^MMT *z P2h$:ic %HQp1n"U'Dfq̌H 3- T[ciTSA융LxB"95q /PoDdX~NODQ/Bj8qEd'qUB$8+l^D|%i/,w6J,y A|]yQ3Q'Ql }vu]U sZ&n.,D>OXD8!TC !WDLH]0Uvuj?{Ӧ3 Ao ء έ?&{[_;Fx@#gOݩ~WJ26**IENDB`normal.dark3S1.8p.3.webpvRIFFnWEBPVP8Lb/wO(l)~DpCq6~$[MJ zZF$)Y89ܝL聺 {iǵW(PP:W^]~,T"Rj,Q@A@Nɮʮ˵o<[^AƿjmjGjt %X*{ヌqND!H*dUC e1Pn!Rn]F/^άZzNel2]8.}T+>\qC"b1-Cp ':UN_\<@{C[m{\HƁa;{ *hR,w`e$%O-"6oD ")3 8`JOy3MneU[U: ;M-`rќuGsϰ~yw\,Kc&\R\G@ˋHVXX5/"VqI: r%f`ͪ*^C0f0{QV)(&eEU㚫AA;C;C?$rXXMq3H_/{ E UI)fkftIj^6W>9T-*=,ĖP(̮׭h5lPaa=9|6ҝ*ĸ3N.c=}wbR?v 04tp'l֩W}_ST7TZf t&Kh6?hYa lә5t˰f BUR H%mW ް%ŘOA>WZ!l@\>xg œzLy ˤcx=`h! Cc3"3(@n ,J՝:2`^d;eDe T`c#4 Lm.DF{u Y yИ !d4ޝ*!37q_q`5!0+dBXCHpNo@PY]8(A!"ҧeKf=DbN)m9hhĝn-lv-=nBQdqzY ~!Zh߉<^y{|| }oxG޾/C}no{=oxx=_y=OE;̮]F@Η: 2 2.3.webpdRIFF\WEBPVP8LO/GvS&PHR3x4E]M$Iʙ?g|)3c<'ޅ,>"q"|1Bq/޵ݳݱฑ$EYZV8zãcR5bN ?A$|p ؋qQ̀D |qT7}F}-ٹb/-KR/mc-9f)mS/@=4m1eRiNoi}n;]6]y r]״]w')Ӕb}_ ܎)1vy=LbS=bJ)iMi֔br; ZI)(̫ U5 LsVKTsVsɊ\33'Hjjp!uEźlBҘAFI8|2}^5T`2W !j$D" T]v1gHpQ@@Dd2pK7f5)CDDZuxovl:RMNS1F,l7|&RV_MUDiz^5HOg޸ [0}][GGd:ۛTU||f!,mš,Fd2We"?_oOcwm]/˺isY/j4޻ų @`jڶ)i5 D\(>8^mmS]׶mϚ6!{!E^7j՘V>ƔU7X."±q1Ŕ :4lNc֟/$SN948 D@$"faaa+2g.Y3MDLL,,y&>KLshCbwg@pOdK78!;$FfǏҳA)MZ5 ?Բf;8>Sq֭g}7(ڗEq9?fS]UR$IENDB`4.webppRIFFhWEBPVP8L[/G!H` H8(۶i˵ prSڗ"EՒ?Itv^VgY}*+Uɪ+*+UɪaYclUnarGW<^e(bcf wlcfElcM׀";kj hzҢΞ Iӽz.@~j9 R ci Z%bD2p"ʿ_QH"wf Brƹ|XMGRx">XT 3`ka+<<O^ }HQx.YJz#ͬA^ @3x@s3vr|>M]$̦}jM'"dɞ}vG6|l~ OA79ԒBAjPQ?YZMyм*T{)aI-$ js _w\I󬸸VQІ^5k$iAPh#7SF4R$E#yQ`#.ygnU6MMM 濳y6VuᢒSH1101wp%m-)l1uXH332E՝{^3ϨԔ⚙)sTL^<).. ?L'= _h67At M.К$6fť~+Thi| K@͡hWW|vOw.y\I䟔~$nIqY)B4וI^( %$aI1"y\z\OWևB5yJ^0uxLePj YȋJZ<|]:[O=#*| Qkj3sKW#wUU$}eq(%©\}oE!ݽ%V5l\\HjG,9.+"Ȳ4-ݢzZ4 7<F! _huGL/ǰ1@"Q $:3wGpbVCŰOqliFSsJ+0CDTDT\rz(w/0w< np<[ө/zNtlOɕ!: Q`5İ%ۖ]4dV%{An.zS9bj "q+X(]bl1l HqQvXO:G{a 1j4:ei\A:*KHph]|\{[nz43k_F9߶{dqnu޶At~dۆKިvKx=6m_ezY*h*)VMqfkuգu>lj+"睃/iU3D1E65S}ԭk:7qQQ]f\y'33x$VhD+^iޡ4%*赧k¬,~ & Mc~:p>g0R\M g6jZ>Ց^ռSۡ^)뗩Mpf/)&0iBG '6oܐ2 4v߷^3|adUU^0we\Di {\|!t6.ŀ*I!.v}O籗 ؍Y7m^| Y]I1f}ߎl*[0zTcjM`O_n.|Xhè93j8a8>>hUip&x"zw3xCրͱwfc˒~~y3ĦCx-PLޜs/qUsȬWu\M, +on1r*x^D$W75Y9zp~7 jBOަmڬqlN;yY~1 wSϛ$mooAدnƝ;50EU>}cX7ٲpWSw3w/%ո7=E4t]C kъO6_&frGg|%G AUZIvTNSpyB{a-RtЏ+z~}P<%ORl/]۰;c_VfyE}IYWEBPVP8L2/Gh]xmH&?1 5Pa@g+(q GHa_ODmhvƙ'Oٌ:M򕳛"1z}8=*7 }Z-rTOuP?\MN*Gz Wc"gKqz wḴAӬBg6 a2 ! Q$i ?p+N9 g㌿<'o<ɷzSa5Lg15ާ?pC~y 3.3_0_0_-10_0_0_0_0.png.alpha8oPNG  IHDRHHp pHYsaa?i!IDATX;lU9yή8"*"q@$ EH% iR(""` RIX}Q:xwHXiܻs=q=X FZ5Vn*>$ROBD$.\ܾGkgllI*1pܠP*ҕfwS s REq"6Z賄HL7+=>ŋKk8M3;y038AR;|uc#4,-Gq7JkMFkTTht⭥; Vn*1nzmRZG[@>wgaie=N],m =F'Uy|kvλwq6SZ$V\赹Ņ[7?\[mT VƱ*[յYxz3`J⨹ygʧQqe(j.1mDa XeZ]v NHXdw9 oFvC'`tG\ɒ|fY dR*=CVjTNFRJTVv?qfOQkgQ_kXb`s.^+z20XxSFk=H ʵ&k~elL {B".ܠ\/_zf%Q 9kM$0b!#FIJO8\Jc{&v-˃}H%{KVQj;f^)WuoA&$^_]^j̪׫嫯,>\h:WC_p}ڦ-:uAktZQ30,E@psv;q܉4dą~'S_- 8Mh-e$˝b\pu!6L~1Z191Fv棚:9kv iwy1[uN;Ox;6k9oۥKf?z#ۍnKozF /IENDB`pressed.dark3S1.8p.3.webpvRIFFnWEBPVP8Lb/wO(l)~DpCq6~$[MJ zZF$)Y89ܝL聺 {iǵW(PP:W^]~,T"Rj,Q@A@Nɮʮ˵o<[^AƿjmjGjt %X*{ヌqND!H*dUC e1Pn!Rn]F/^άZzNel2]8.}T+>\qC"b1-Cp ':UN_\<@{C[m{\HƁa;{ *hR,w`e$%O-"6oD ")3 8`JOy3MneU[U: ;M-`rќuGsϰ~yw\,Kc&\R\G@ˋHVXX5/"VqI: r%f`ͪ*^C0f0{QV)(&eEU㚫AA;C;C?$rXXMq3H_/{ E UI)fkftIj^6W>9T-*=,ĖP(̮׭h5lPaa=9|6ҝ*ĸ3N.c=}wbR?v 04tp'l֩W}_ST7TZf t&Kh6?hYa lә5t˰f BUR H%mW ް%ŘOA>WZ!l@\>xg œzLy ˤcx=`h! Cc3"3(@n ,J՝:2`^d;eDe T`c#4 Lm.DF{u Y yИ !d4ޝ*!37q_q`5!0+dBXCHpNo@PY]8(A!"ҧeKf=DbN)m9hhĝn-lv-=nBQdqzY ~!Zh߉<^y{|| }oxG޾/C}no{=oxx=_y=OE;̮]F@Η: 2 2.3_0_0_-10_0_0_0_0.webpdRIFF\WEBPVP8LO/GvS&PHR3x4E]M$Iʙ?g|)3c<'ޅ,>"q"|1Bq/޵ݳݱฑ$EYZV8zãcR5bN ?A$|p ؋qQ̀D |qT7}F}-ٹb/-KR/mc-9f)mS/@=4m1eRiNoi}n;]6]y r]״]w')Ӕb}_ ܎)1vy=LbS=bJ)iMi֔br; ZI)(̫ U5 LsVKTsVsɊ\33'Hjjp!uEźlBҘAFI8|2}^5T`2W !j$D" T]v1gHpQ@@Dd2pK7f5)CDDZuxovl:RMNS1F,l7|&RV_MUDiz^5HOg޸ [0}][GGd:ۛTU||f!,mš,Fd2We"?_oOcwm]/˺isY/j4޻ų @`jڶ)i5 D\(>8^mmS]׶mϚ6!{!E^7j՘V>ƔU7X."±q1Ŕ :4lNc֟/$SN948 D@$"faaa+2g.Y3MDLL,,y&>KLshCbwg@pOdK78!;$FfǏҳA)MZ5 ?Բf;8>Sq֭g}7(ڗEq9?fS]UR$IENDB`4.webppRIFFhWEBPVP8L[/G!H` H8(۶i˵ prSڗ"EՒ?Itv^VgY}*+Uɪ+*+UɪaYclUnarGW<^e(bcf wlcfElcM׀";kj hzҢΞ Iӽz.@~j9 R ci Z%bD2p"ʿ_QH"wf Brƹ|XMGRx">XT 3`ka+<<O^ }HQx.YJz#ͬA^ @3x@s3<<r7>4ЈMf`0 us4HƃpF`)lsRpLf fr&E"ÌE~!>X21>ڑ2R"X@fh-c/ೌ240JRut(z0 " 8CLAV-)U蜁|?>o'~GG3wa͇$>9al]hs:%x}:f_cZ@Z/&S^^U[/EqDZ7Q/,el9'pY)hx{M: 9#G0a()R<_,yĵɻ猰)9H&\+,N .N&Sb]R* MЍw`R$otVOr)iXA%*vs<';h3VF*'(¯rn]],[60 ,rE ς>?/)*ͭ's|둿__7~g_<>y__}_>}}S}C߻}~U>ͼ ~򔁈h3wΜtn 2.3_0_0_-10_0_0_0_0.webpZRIFFRWEBPVP8LE/Gw_Ǐ I"ڶx8ZVm+y aG2e`3[\4FÍ3 GHane]ގODmhvƙ'liIe+8=Ecz8ӓk6eUwSv^֪/WF5NJMmy]8eS0YkQ, PhwA EKDZ꿋83p;|Kɓ|ۘG0^ԏzS_S}g>c3.3_0_0_-20_0_0_0_0.png.alpha8oPNG  IHDRHHp pHYsaa?i!IDATX;lU9yή8"*"q@$ EH% iR(""` RIX}Q:xwHXiܻs=q=X FZ5Vn*>$ROBD$.\ܾGkgllI*1pܠP*ҕfwS s REq"6Z賄HL7+=>ŋKk8M3;y038AR;|uc#4,-Gq7JkMFkTTht⭥; Vn*1nzmRZG[@>wgaie=N],m =F'Uy|kvλwq6SZ$V\赹Ņ[7?\[mT VƱ*[յYxz3`J⨹ygʧQqe(j.1mDa XeZ]v NHXdw9 oFvC'`tG\ɒ|fY dR*=CVjTNFRJTVv?qfOQkgQ_kXb`s.^+z20XxSFk=H ʵ&k~elL {B".ܠ\/_zf%Q 9kM$0b!#FIJO8\Jc{&v-˃}H%{KVQj;f^)WuoA&$^_]^j̪׫嫯,>\h:WC_p}ڦ-:uAktZQ30,E@psv;q܉4dą~'S_- 8Mh-e$˝b\pu!6L~1Z191Fv棚:9kv iwy1[uN;Ox;6k9oۥKf?z#ۍnKozF /IENDB`dtkdeclarative-5.7.12/src/icons/bloom/switch_button.dci000066400000000000000000000773051476226662700232210ustar00rootroot00000000000000DCI30u~hover.dark31.7p.3.png.alpha8 PNG  IHDRt/{ pHYsaa?i IDATxzø Y1}ة|sS5Imǒ~EHW_+W݂tU7| ˻*t;(o ܀—#r"1#̝ y{XqY1u$ "/Wr@!E LK@?0^R? ( J&U;`̑  JlB[лWL*yQR0^qJYTЋ{HAD$B J *PPBpP/Ɓq2T )t+vŠPj} Ya5&8WAU6Nf: NwwSB$ΐzhдtׅ Ew+SJ"䤈ښ1J!? w7of.Bפڄ9dZ ѷ(}=LD\qۉMdxЖ -Fs3S50q}`q6HmmI mu8!3]uXC8&y@ak[꯮("D ,6m--(6mRÝn{gZTqu᩟(uAlm`Q>2vаINѧ5.m{lm{$DVcpz%~|BZQ^Yn[ n"*u ma۶=(iĝFѬA$d#Cd%4h=GJ1:nBiTwCGJ%L^s `@Ufm=hY{3Uէ h@^ "x<۶m'n РTUӿ i耚HǨ!c-)a[ۺIܞJ͛7W SMuHDS~8&ȰޚR]0>:DU CxZch 1"frhҴ:H:GCör7~Q2Rs@|sP DZF؁d"z gy1/_жB1Z~"9OYJGgk# 7idsgG !}9OtlBkB+V `Bܦ0{qsnzg:s@ ImfZ)a>*bY*Ac,PD(TE1G.SK)GrYŘjDrKz<#UMv  zGI]SOv6CQtTYNPzYZ]<$i(K`'̫RqO)R7;MlHBpR!@@ J93W1f~>.ߡ,]6#Xfh0T;cb-1} ň5QN1=\gտ(^ j>>qyQ׭L.nFC_rĩ ˭_%Fo/8onO/N78nT<˓_;zR4opSfѼ-/^.|p8'X益YKN2ZYZY#R!1ʪ YǨRK2zhwԛ Oq"pYgCeTG,'ndzODɞs̑t'kVĤ?w[X[^-N1ٶ֫YlhTE\BdKBBZ3s33UU1j H5USfϽ C˛8) X/c,}"12F"l$wZOYl=B)B:J~{dm$V[Vx}ߟ)3w@=OIJ8M5URU']w}* 6ݚȬMOH c| 6!qn]wh殄Dsߓ-b?HA;W)'S~"t8zFYk䬛Ǹx#)p`츲yk4n!(Lm A:Hb2_%S3SX^3Γ %Ϳٺ5LuwA&o7q$FڪquAn IA|xEsuAtٟ)=?lօf T[r6Xhؙ&vW(&kE#u"FwWwﶽ%G̪Ƅ&׬iْ5o7A1cL6olI!x1Ds BTB_Mt 1׷QIj/LOIJTY) *{om|,Re4jP8b(Omux^A,5"\=yi*f_ \79=t}b AqF{r4{GZ]gO7!nz7k?C{.C44IENDB`2.3_0_0_10_0_0_0_0.webpJRIFFBWEBPVP8L5/Y@$);`_bFn$cYHP=Ѐ$ <5(i>y;H3s'H5Ӑ+nFn#)2ܨk~`icBSLɫ.MBWOֲ]Kjsurk*! ōiqp˜I(}2/gwsqǛ%pdj' e[[YsJPY' *[aQXcV5}?U5" W1 \-+\rUN8!Ld Hpj Nz48QpG.ȣ-3.3.png.alpha8zPNG  IHDRZZ pHYsaa?i,IDATX;U9ycfR͆UDU( i ER(""JIddk{gbKYٵ$H7w||k6!| ZzDUq13OII"y؈ą[~7{anw$pܠP*ofGOvSɕ"Z~&{oy%)BĄpR>_zJ'Nr>wX >>8l^\jEq?JkMNiZIR;!om4;Tjc:ZkJim@n>>VHsc1@k?2rP6X {g~ajQ3nEnE_]sI"gt '@rj02Uii.OpʋZ(35*v+NOv(#Q=Y#ĉÛF$țדJ `^KgiOR k/=Rfn,HghZ+URJiJvJc82،JXkJ6#` H5['g F1#!7*F q!Y[-8#RLWFBDŽzB6" Ṟ`=/8 qnq+w4 1Ţ[t0  Dnae7 s\Ûna+~Rmui$cENPVJ7'ZU3o$J^ =1#ļD}[RN[#wR>Q%`0kzk;v힪naA :ۊo$ ʵɝvn+ӟJf7U9kw^)8JE`, swad%\==J:+Kw7Qj#D FJN}[UIZ^ZrYWˁ˗_\5;x)ًZ͕!ƵD9'NZ&NԎ̅0,EVk-^4й@q?|.>@L$Qru!su]GƨյV5hmRZ%،qΉ1_]X;ةk&8X}R xߚ{_L[;g_AM?>mzҀ[},ͿocoSnk:a:n#IENDB`4.3.png.alpha8PNG  IHDRZZ pHYsaa?iIDATXoSGǿ;3c; 8I!NRH\-"\hEH 3T$R#-VSNrl?7y~w~hvFjbی2PFuyZ){Zc6b{K]oQxSiM0ʄЄӱ^R1(zcgҤ L-h Rf؁ K%RJ#NxU=Tj@eW+!RVx5@#H1%:qYn׬SB),SPVGJo-z?A2`jNWZ>BkH>@.Wm,#fX9@b +|.2+ d7l: SC,2I.'2#\qm'hr`eBs_U2Q3$}AR A>:@;l7hD,yK. w{[vF ;(gbet5+kwh0 ]C.À8 !$퓓":}s|hLGO CчZ9f -Q69T[f>n}eFX@vɴ :.v5oFl_k}/m/̲wuʼ=ϵ|=myv).0v3m\>kyV>;)<)?:8'™v|Rb0KٸyAT{~wK.6sw{goh뜘TPRJ0zv!w5Zo`A (6Љ$(vFuZ|HȀXupF^Bwmy{H"]E1dLP˘wfUӇtLSFD}tt$kgjޢ y |n%Wl,Qc>g"9$-JMEOUm2&l#a$<&aiAs :Oì6pJٳ %/B سn9i*6Z-؆jY6ZCiL=FRF̥81z#Q& m:%.32,^*-B0B6 RH%-w1 ~/(u,G}v\W豽י;5<IENDB`hover.lightN31.7p.3.png.alpha8PNG  IHDRt/{ pHYsaa?iIDATxbD5Ŀ5BBk'鷯B['M]X"mmmmmmNh+K8jk#y@N]s{5Ji-Ʈۊ ƹc؀/&7\?"d1!*=G^ҿdLo? !$7vHF(R>n?wR !B!촘q '^.EA SHf{g((i%*\Ed-Z U11xS@ L# )T"ębʠWZf a  FbP)bpՅAVc?"IyA!"*][bb4abJ9  Ci:o0 -M4`bTLQe|.aR#¿sjs6()n./b!A[ "~7<#l5ѸV򦭵͍T'"IMd3v@u+T[4 A3 5@U6bQu⨧PH,R,Kxe ivUHRbL1sFT2)'+lBR v{@$wQT;b9OL)i:qd# ! iL;TѰe~(TpEbP"mi5>֘VznRf"ƹ^ 2poJ!3a0ǘʑ POAr+}Y륻AѿrX\pܗ3:E9LuZG ]ɻ aǰo=V O~|әMIENDB`2.3_0_0_10_0_0_0_0.webpRRIFFJWEBPVP8L>/Y@$`P6-Tt6#V #6]`ďG>̗i #툾,!By5j8n$Izfi[w3rIxF]pU?y;#t#H,{=WB8I̳^gW>:k$6ƹ,MlvGөӡ߫*߈Dٺ4-rqt^T>DU!Hƥ|a^B:" Hd%y=xxAw}WۡQ'TԨ1DA"3 37[A݈*hE5"OCywk+T5*꣭mzw_z<«SwMFoЈ"!nwL!r/k&9_AyE[UC3j ^ uU S*WU]π$n9u2vаINѧ5.m{lm{$DVcpz%~|BZQ^Yn[ n"*u ma۶=(iĝFѬA$d#Cd%4h=GJ1:nBiTwCGJ%L^s `@Ufm=hY{3Uէ h@^ "x<۶m'n РTUӿ i耚HǨ!c-)a[ۺIܞJ͛7W SMuHDS~8&ȰޚR]0>:DU CxZch 1"frhҴ:H:GCör7~Q2Rs@|sP DZF؁d"z gy1/_жB1Z~"9OYJGgk# 7idsgG !}9OtlBkB+V `Bܦ0{qsnzg:s@ ImfZ)a>*bY*Ac,PD(TE1G.SK)GrYŘjDrKz<#UMv  zGI]SOv6CQtTYNPzYZ]<$i(K`'̫RqO)R7;MlHBpR!@@ J93W1f~>.ߡ,]6#Xfh0T;cb-1} ň5QN1=\gտ(^ j>>qyQ׭L.nFC_rĩ ˭_%Fo/8onO/N78nT<˓_;zR4opSfѼ-/^.|p8'X益YKN2ZYZY#R!1ʪ YǨRK2zhwԛ Oq"pYgCeTG,'ndzODɞs̑t'kVĤ?w[X[^-N1ٶ֫YlhTE\BdKBBZ3s33UU1j H5USfϽ C˛8) X/c,}"12F"l$wZOYl=B)B:J~{dm$V[Vx}ߟ)3w@=OIJ8M5URU']w}* 6ݚȬMOH c| 6!qn]wh殄Dsߓ-b?HA;W)'S~"t8zFYk䬛Ǹx#)p`츲yk4n!(Lm A:Hb2_%S3SX^3Γ %Ϳٺ5LuwA&o7q$FڪquAn IA|xEsuAtٟ)=?lօf T[r6Xhؙ&vW(&kE#u"FwWwﶽ%G̪Ƅ&׬iْ5o7A1cL6olI!x1Ds BTB_Mt 1׷QIj/LOIJTY) *{om|,Re4jP8b(Omux^A,5"\=yi*f_ \79=t}b AqF{r4{GZ]gO7!nz7k?C{.C44IENDB`2.3.webpbRIFFZWEBPVP8LN/Y@vS&PHR3x4E]M$Iʙ?g|)3c<'ޅ,>"q"|1Bq/޵ݳݱȍ$E[ⶠ3rIxF]䘛"Kb8ɊfgrM}WEtum)^4BH SөgP{ k7[R˶*O|P 71R4UrA6{AVSȄ%JbaNXN6E#!W^j\ᒫrp@N? 9e'c4@SSp N:w;rAm03.3_0_0_-10_0_0_0_0.png.alpha8zPNG  IHDRZZ pHYsaa?i,IDATX;U9ycfR͆UDU( i ER(""JIddk{gbKYٵ$H7w||k6!| ZzDUq13OII"y؈ą[~7{anw$pܠP*ofGOvSɕ"Z~&{oy%)BĄpR>_zJ'Nr>wX >>8l^\jEq?JkMNiZIR;!om4;Tjc:ZkJim@n>>VHsc1@k?2rP6X {g~ajQ3nEnE_]sI"gt '@rj02Uii.OpʋZ(35*v+NOv(#Q=Y#ĉÛF$țדJ `^KgiOR k/=Rfn,HghZ+URJiJvJc82،JXkJ6#` H5['g F1#!7*F q!Y[-8#RLWFBDŽzB6" Ṟ`=/8 qnq+w4 1Ţ[t0  Dnae7 s\Ûna+~Rmui$cENPVJ7'ZU3o$J^ =1#ļD}[RN[#wR>Q%`0kzk;v힪naA :ۊo$ ʵɝvn+ӟJf7U9kw^)8JE`, swad%\==J:+Kw7Qj#D FJN}[UIZ^ZrYWˁ˗_\5;x)ًZ͕!ƵD9'NZ&NԎ̅0,EVk-^4й@q?|.>@L$Qru!su]GƨյV5hmRZ%،qΉ1_]X;ةk&8X}R xߚ{_L[;g_AM?>mzҀ[},ͿocoSnk:a:n#IENDB`4.3_0_0_-10_0_0_0_0.png.alpha8PNG  IHDRZZ pHYsaa?iIDATXoSGǿ;3c; 8I!NRH\-"\hEH 3T$R#-VSNrl?7y~w~hvFjbی2PFuyZ){Zc6b{K]oQxSiM0ʄЄӱ^R1(zcgҤ L-h Rf؁ K%RJ#NxU=Tj@eW+!RVx5@#H1%:qYn׬SB),SPVGJo-z?A2`jNWZ>BkH>@.Wm,#fX9@b +|.2+ d7l: SC,2I.'2#\qm'hr`eBs_U2Q3$}AR A>:@;l7hD,yK. w{[vF ;(gbet5+kwh0 ]C.À8 !$퓓":}s|hLGO CчZ9f -Q69T[f>n}eFX@vɴ :.v5oFl_k}/m/̲wuʼ=ϵ|=myv).0v3m\>kyV>;)<)?:8'™v|Rb0KٸyAT{~wK.6sw{goh뜘fϋl'cߛ/w(n@ܷy77f#4ҿJk6aFaGwn7^^LqE&4n|X/o|<}40k6k46;3'ַ?rJRE򵓯L(bO0\,=?jX՞\'ZbxZ>8;ΖO^赜*W*N ON(g/l+3w\^CVaoupͯ]:xJ/쑁/K%cT&*H_%e8$g6cʞ9mANߵKyM2{gD˶=UP QTӌ>:$ ;;J4!^ 6BQcCdbGh@qz2EN YVHY.kG+Fv)3ZI9Lt+4 Ltv0Fn(r6J&ѐi5erGg]>@zW֙G'˨My6q;MFO,QgbMўP; 6?0]H`Er"ۀ*pn?wR !B!촘q '^.EA SHf{g((i%*\Ed-Z U11xS@ L# )T"ębʠWZf a  FbP)bpՅAVc?"IyA!"*][bb4abJ9  Ci:o0 -M4`bTLQe|.aR#¿sjs6()n./b!A[ "~7<#l5ѸV򦭵͍T'"IMd3v@u+T[4 A3 5@U6bQu⨧PH,R,Kxe ivUHRbL1sFT2)'+lBR v{@$wQT;b9OL)i:qd# ! iL;TѰe~(TpEbP"mi5>֘VznRf"ƹ^ 2poJ!3a0ǘʑ POAr+}Y륻AѿrX\pܗ3:E9LuZG ]ɻ aǰo=V O~|әMIENDB`2.3.webpFRIFF>WEBPVP8L1/Y@h]xmH&?1 5Pa@g+(qH5Ӑ+nFn#)2ܨk~`ivzǮ-{֪zW듵Vs]Kjsurk! ٍ)wpTN˜ʫI(=2gwsqǛ%pdj' -[kԘ: i^*AUfzKBZhvFa^X> +}?U5" W1 \-+\rUN8!Ld Hpj Nz48QpG.ȣ-3.3_0_0_-10_0_0_0_0.png.alpha8zPNG  IHDRZZ pHYsaa?i,IDATX;U9ycfR͆UDU( i ER(""JIddk{gbKYٵ$H7w||k6!| ZzDUq13OII"y؈ą[~7{anw$pܠP*ofGOvSɕ"Z~&{oy%)BĄpR>_zJ'Nr>wX >>8l^\jEq?JkMNiZIR;!om4;Tjc:ZkJim@n>>VHsc1@k?2rP6X {g~ajQ3nEnE_]sI"gt '@rj02Uii.OpʋZ(35*v+NOv(#Q=Y#ĉÛF$țדJ `^KgiOR k/=Rfn,HghZ+URJiJvJc82،JXkJ6#` H5['g F1#!7*F q!Y[-8#RLWFBDŽzB6" Ṟ`=/8 qnq+w4 1Ţ[t0  Dnae7 s\Ûna+~Rmui$cENPVJ7'ZU3o$J^ =1#ļD}[RN[#wR>Q%`0kzk;v힪naA :ۊo$ ʵɝvn+ӟJf7U9kw^)8JE`, swad%\==J:+Kw7Qj#D FJN}[UIZ^ZrYWˁ˗_\5;x)ًZ͕!ƵD9'NZ&NԎ̅0,EVk-^4й@q?|.>@L$Qru!su]GƨյV5hmRZ%،qΉ1_]X;ةk&8X}R xߚ{_L[;g_AM?>mzҀ[},ͿocoSnk:a:n#IENDB`pressed.dark31.7p.3.png.alpha8PNG  IHDRt/{ pHYsaa?iIDATxۂ DP۰N\朗h:=$FB0kkkkkko;>cvy8z\ro_/rqf!ċl8Z 8gw&eƞbo4' $gkoXQpA O\SlTWM_H+H /?.MoOD(s 'áQ $:AUTU2$JS"T̰PBU7H*.مm "RšGP"[; SHȑa+A!`PFF<!"21d$7fCb#70>Qpt\>$Ő!77MUIoB &xM OoxҸDf]MnbYl*υn"I.p,gS%^q(= 6Pl"4\1FWVY1R$Zjy"/%d-Gy:Sn&LFy3]z(<_|yqif46LTLKls`(oDay"nɜۓ9>ZLdTԑsxnD mlX@Ò1O=,X|l5 rkǭDД>Rcl x950ӆJ=1'9qL00 LĥwGG w 9'+eQRbf谞hq9V3<ڪBSQ8g*Q)'JAXL[Z帵&3'2K {hDZ]s  /Lrؕm_Vz%2 ȉD]8?N(x֮NFEƩ\܎oc y~vb>|k1.N T;|e7{P*U_/u|t2:,e(.#i0K"6?˒w#Xf)E2$|{V4W>K^cbW+!߅ɺZLj_F/YT7)0dRO(jxb^YD#@AK0^A!-Q %ijz&5$N˥Eܳ2mMwE6 u%G{FQf*vMP";(FC*6Q+Vbt^JMTZT<(%J!ؼz[D)Dv5B8GwG!QՍ^;B=*nuT+koRC!!\mkC\#W [\X ]r!3:5*xeܸ`NCbsg8AG;F SIݨ^0/^ wlmmё)y9aUٻPj*1s-.&|osmh06LC [ByXH)=`zb YJ%.l-eꩄhBD4_,D?,om֙f  f"=*DjBTd!]y@ql͜9sw>눙0}8KKnM+1C|`OD#ITf=.*fه8KrGc]F1G_<[m/{ 8g؛ WS5f-+J7DNu֙&һB,Z`[!~qSSM~`9808go_ 8AxhWw Ǧ^3˽{o_zJ'Nr>wX >>8l^\jEq?JkMNiZIR;!om4;Tjc:ZkJim@n>>VHsc1@k?2rP6X {g~ajQ3nEnE_]sI"gt '@rj02Uii.OpʋZ(35*v+NOv(#Q=Y#ĉÛF$țדJ `^KgiOR k/=Rfn,HghZ+URJiJvJc82،JXkJ6#` H5['g F1#!7*F q!Y[-8#RLWFBDŽzB6" Ṟ`=/8 qnq+w4 1Ţ[t0  Dnae7 s\Ûna+~Rmui$cENPVJ7'ZU3o$J^ =1#ļD}[RN[#wR>Q%`0kzk;v힪naA :ۊo$ ʵɝvn+ӟJf7U9kw^)8JE`, swad%\==J:+Kw7Qj#D FJN}[UIZ^ZrYWˁ˗_\5;x)ًZ͕!ƵD9'NZ&NԎ̅0,EVk-^4й@q?|.>@L$Qru!su]GƨյV5hmRZ%،qΉ1_]X;ةk&8X}R xߚ{_L[;g_AM?>mzҀ[},ͿocoSnk:a:n#IENDB`4.3_0_0_-20_0_0_0_0.png.alpha8PNG  IHDRZZ pHYsaa?ihIDATXoGƟccN GI$hzPCw+zP^PQ? HDF$"R"bƋeoք{V4o;;z訣>QK!6`1ۣIdG+!t!249x݈+y 4'@P.Ŏ:Z{ ݻ\z%޳@n zmn}L@vr풁*'jC@Pq(4`X!O]{};d {٩xڦ-2W Z A2pqJVM8` K&XD-}.-Q}Js7 E[P.u^DlQ7c X_E(UBe P5 ;Z*>Ў!\ 1g6Z:>2J|ٯ#}(qI>:-RĀW-Ȁ} ~.r>2O>򐧪U69V؟9i}RϘPcdS/G>}D`We: 6? 7ynffzytzf\-ECNݚj-,5b5vv1}v5xghxq.{pr];pwL.V^W*gyJeqܟQ=$s{WKk#`Zz~w\d> s˫'_\>_ZYuAVV=v4 L\mu. Og]٧ >4|;2p%P|N~uotP8-O -P8‚K2OCmg%Yf}5FEs8#dq=xB0D8 )F3R Hs- jМL6\'BN4!uB(%D[ז I*זbNpzux-<~aHhݣӌ7GgE*s9RqKF|iJ^1\s‘(D";t&g{, x06ceiU3d@FK9=F\/`%k2ZșIkK5(t@j V4f`MՄg94mg .|/kr ^0!E,iD[XZBTH\(5h; sNW$ WaϐNKDS {!Q&*/8[cf" ,.K% !~*ET15U{z'XiZ@k oNu# OWRL[zSCxځj7Md_cfS5hjp`Yg|ߨ%PoN~Ƃ B*Rz$/ʥ` 6Xb.Y,x p&Tƣf/B9lGc( vM(pf 0;PIDMbmppg\Ea_nxCYB:jCYRK|VjotƎ\ Ti@3 `+<0F x="Xhnׅfa coD&b. H8[_`+{ g s;.V NtĽ{pȳ1]wxwP.xwnx7Q]pw7n9;wݮCvw|σC~aaOa aϤ:a;aO;a~k\' N23K"̖Q>jdJW"@/2.3_0_0_-10_0_0_0_0.webpXRIFFPWEBPVP8LC/Y@w_Ǐ I"ڶx8ZVm+y aG2e`3[\4FÍ37HC࿭xEHƳ 7'G^ÔfМa&agֶ.b=No졩XLn 7wP{⫫9ͲE8Kvl䶽uB̬BY/lhyTkaիAX$) +šoP>*\r.*' ؐS&p2N $85'tsG#і 3.3_0_0_-20_0_0_0_0.png.alpha8zPNG  IHDRZZ pHYsaa?i,IDATX;U9ycfR͆UDU( i ER(""JIddk{gbKYٵ$H7w||k6!| ZzDUq13OII"y؈ą[~7{anw$pܠP*ofGOvSɕ"Z~&{oy%)BĄpR>_zJ'Nr>wX >>8l^\jEq?JkMNiZIR;!om4;Tjc:ZkJim@n>>VHsc1@k?2rP6X {g~ajQ3nEnE_]sI"gt '@rj02Uii.OpʋZ(35*v+NOv(#Q=Y#ĉÛF$țדJ `^KgiOR k/=Rfn,HghZ+URJiJvJc82،JXkJ6#` H5['g F1#!7*F q!Y[-8#RLWFBDŽzB6" Ṟ`=/8 qnq+w4 1Ţ[t0  Dnae7 s\Ûna+~Rmui$cENPVJ7'ZU3o$J^ =1#ļD}[RN[#wR>Q%`0kzk;v힪naA :ۊo$ ʵɝvn+ӟJf7U9kw^)8JE`, swad%\==J:+Kw7Qj#D FJN}[UIZ^ZrYWˁ˗_\5;x)ًZ͕!ƵD9'NZ&NԎ̅0,EVk-^4й@q?|.>@L$Qru!su]GƨյV5hmRZ%،qΉ1_]X;ةk&8X}R xߚ{_L[;g_AM?>mzҀ[},ͿocoSnk:a:n#IENDB`dtkdeclarative-5.7.12/src/icons/bloom/switch_off.dci000066400000000000000000002415521476226662700224550ustar00rootroot00000000000000DCI40Cnormal.dark3ȝ1.webpRIFFWEBPVP8X w_ANIMANMF,w_CVP8L/w !/E? ANMF k;CVP8L/kg$Ga#$Ga#cF#O?}ݱdɓy$( $!oR/佷*T U ͈0QED+3/0̄ >"8ED~0[$7Xy/a5@m^DaHazo|q|[5v^,;Zx]n ϙb`}AFkPA:P~ 1^@6~FB 'h"="Y1'9x-""3[PUvQ8R+hQDD͜ia8n5pb\3&LZUjST͍%r5RԴZ=JANMF k;CVP8L/k(wŏW4&25$E}WdD0$[ɾI[w2H*L*A6"|H F Eć7~Xc' $rUZz<%ɶFѓ\'0ŅTDѶm@~}?%  Ha ADPUDIDDMf]HG %̈p0Ǻ1Dn\x H @Ï[DX7z{ \I4<\.xy-ߘ۽+l۶Q@| =z{2mhbLu(~&|i (dF8dtKaf(4ӞAe9 ]aLF)xs77.YsH)|@ԖQzйu#0S@WI3 L4P D H~RwѱRQE+!ឃF ~K6hii,j1Z5&ڙ:H9Zns#i9RR&AzފANMF k;CVP8L/k$IYGpfGCFUI<=2d$IPضP;}ӈ~EIgf*_* 9 |ƎvEK5㪔jAvƠ{ `uTi`\0`T;twPK}Mj̦!.,38lphߞm6R;F`mT[m,WQ`|qg7[R#Wj=u̯S$boXH%RI'2-?q 6@h$vDg$& j}r*K BS )g%Bk};%BsC\oSJL1Jۯ6sr@wf=Ƃ1/ƤDl\^ibIթ恍^Sd"U70=.k;jZëMjnZ"FʪrjڬZ=?o 4[1ANMF k;CVP8L/k $E5޿N #I!HoĶm% 9HL4Xt;$}_B )P@ o)Pc-Xk="=FSF~aĚq# 0@~ ~);?ܛ Jp޴M0MSoߝ+hۆ5c|Zx[eo8?o݇ҔE{}b8 dEl/nU24Rls.bYS@HTjeD>ᙶ-jiBkN9&Ue4fEE!u2g隷]* ɫLuN!/m2i=mlm׿<̼ "d&E7;<9CR.L٘Hfr%П4?eg ` {eDZR *U",? ʛ fz¢bmEq@{1_MCLw f-JE[Fe`"{Pỵ)0q(߄B8"fm)pp Sl`X3 ,5cbPMu@56ܠZ"V#jHMcANMF k;CVP8L/k$E$ ڶ= ?ϛm$w6m%>HI%KU  "A$0d$ 8wnC #@$`Ɍ   b! saJݴ23sʌۉ?öm#I}h =?7nUDJjs3|bo[&y^%)ĕT" [c$HUsœ`,XY\K*1B*T.K7Mj2VhpG!1!in! W `;^p-R(0Kur-nF^հeo#A&ܯ:HtXv:tZ`gCX^W͢UcꪝUeUlJU*Kԕ~5eڪ7{l__ TVANMF k;CVP8L/km#I,mANm9=kl#Vr%D:]z@:XuΖ D!ʁ I!4"*Ǐ뮻 lڶm%! @)[/_gضm$SO]7XiNƛieF4yvl[AbwVbk۪oi, E# .1DYT=A x_1^)ٓ9(?]L$ɦum>bFDm[L'd2]_&ђsF&KlN^[~ $۽sh25~6g^ +.fYH:6|7[#4 'K_ kzGBDkC>u}_1l"ЩV!LԻA␇jKC,̫͑͐c ={l_u$l ?uxs:rgANMF k;CVP8L/k&y# !ukCQF;ű-{63xƑd+?JG@$m{7Dkł6v-)N!.fEF4B̔XOߦ>m7m*J>&ND mӚzCڌ[foVt+Cr)&; ^QUF\nE ޒL!6?p$%*X  !eq%j+ڎK@=F{~8Pt΅`ġMnHn{͂Ű6&vjX`))TEjPAdwozlANMFz k;CVP8La/kG&h"!H!l(n6R |}l#Ij4hH-/Mipx_.S$ 3-0W &Jԙ|Ƒ`.HV#1q>S 24-Uo4s?;ZVyuzÑIXUL'2u^W7Mk:>*2ꏎz4 $t~Ӑ2%%j1ԚsUX e`/$KHxuN ᦌBڮƀR ԩK[P/Qs'@㠃DucXkamL ZTjSP %b5RԴZ=귢ANMFl k;CVP8LS/k(fxL.r8dp'D@H /7WHR6z<@/<#iJr <~KzM!U(13螵,iL]K/Jmy8\._e;qF4N4?PZSUU跓.:{@;+u]dmEc9Dc. `-ڟ? !UҜ<ݔr!$UfCiИ=x@_0Q L !aD 30ٞkfŸfLٙ pզUKjT헩iSz;Z~w+TANMFV k;CVP8L>/k(FCGwm0$)Ѡ8 Ȼ$Ѣ5@{-¶çW?F6*ДU=S9 CL˙,̬ v/[be O;\Vڑ>BDpF"T3q]EA۶qH|=ܷcQc۟fѩ0)5J%+N;yfȼM]A42@D!2H, ύĶXH ug,Y5cfgV`Ta)TsCDT#E_TFznEANMF k;CVP8L/kgf|zcm-1@LCr<<$>#i'" +c͞ڶeݑC ' yJ¶mXyAy0߈Tԕw=bQ(X븅#ANMF k;CVP8L/k/0A ic䟀mdJ{@ 7o2+r۶Qw{/ȱ^.[+z=ߕ[tj\WV<LL";Ҥe CF& ϰm6[Y,2ʎ(2Lf!s,tANMF k;VP8Lj/k1D]$AE2<:OqYڋũuHY (=-i2~a_4e,ـLYd)".7IANMF& VP8L /3.webpRIFFWEBPVP8X w_ANIMANMFw_CVP8L/w HnWw/*Y'p Ir*(03e_JRɞ1+3a%s s=!u 3Rg$> гy F'yLsM;i"#Mzi Ы0␐n ~#6ENxb\9"IA_T^@$wN:^ } U A2W1Zlל, ANMFkCVP8L/kpܶ$1޵$NF'e(V,5 AwUJVVjmi0zkSA@DNzD36#0":dr);zUa1ѣ'@DAXf&I?":$xJ\xLţDËnIN5Ym3~f#6ANMFkCVP8L/k@m#Isn&` IJcA-pV 16m8#.=!2x&['ف(*wEw<ȬItzAd2^;TYrл\t"O}&!3 ҐdS(PC9~Aїi^L߹ANMFkCVP8L/kop x@նf+qmYm;UNkYx DTiQie(Ny2[e-$X: soTz~ ^ $[i xYnxnR2FmRy`ee_E}(~f9TnǗANMFkCVP8L/k?n8ض4ˢh6}_& P%2&VF2'%%M%\ozLp[ |}BC{ǽPbXNHBcO'Q~go5^ANMFkCVP8Lr/k@'Hr9&\'@D' !h11c,BaNpغHSLy̮'8$Zo^!S(thMx ANMFkCVP8Lt/k7ն-ˍ;;"{pD𕠁 DSQ(4 }B*DC>12Y>![;:Z"dx"ANMFfkCVP8LN/kU$N4  d! JCʓoBD' BK]uɨdUO@P!1;`;ANMF`kCVP8LH/kMlQn2@K dH@ "? F.VHU*g0;m1/p2eANMF&VP8L /4.3.webpf RIFF^ WEBPVP8X w_ANIMANMFw_CVP8L/w7 $)=G1<mQ$IwgL8&-/@/b!^ٶKem;I @ ;:&\ pU5~SK/Xp!I% bCR7?< t#| >KWS /';jQ0hV}gž{+jwڊl "۹蹜`ٶm::gƋ*ո7  ~fi/ۚ&"2_kӺ<E)Ge E-U(>K|]GEdJ31%v_k$NaBa٠N[0s8.[%r p=']ij%X:/@e܉րmkxhyD8uUt2M J6N=Z\d ANMF kCVP8L/k¨m$I1$eph8$ɉ'=4H咏/^LLL2ww M<@>A1@ӊ3~<-n`a!"&:  c`oA‚x~/RHSG9=1ꏻ"̬?gaZױ9ҏ͂+IMW϶ms2f#?x:llOpRtN[D>&{"U%橞Nl |"< ۄ毙]%EރཝRuVBf}Xdde6 }`~WtjA灘Rj ĻV% ȂD 9WZBX{}O|3X6}$N$ANMF kCVP8Ll/k*d'3T mdʰ $9'8L`H$I" R#]iiͰm$E3w`ЃE U#uX bs)#&+#&~,vrբh|Р&)f`z]N[O)xpy7u$I"IJ^hpf-КՊ[C(ju3+wz pA.EQ IR$EcE 4f O>u+fUkp:qO)8:х~-$6\Lm}!$ڢIG ] 9| g(ȳ yў\w>@'2 M: uI`LvHeG%zPKANMF kCVP8L/k*Tw߀RP?K 6a2J'#"G3BA6L?= w-~~Wh6 p%IT(}O^^fvF9|X,Xp|Be;InsJso$I2RPd̗ E`>'J7R|e;? hѯ%=e@(ňڴn},>T4҉ANMF kCVP8L/kwi$ Dii#~Dz_F U\@Ph=:npm[<;0 hZJV1Bv|2ͩ؎?&֑oы2Y龚һ lg,`)PA: f`iwhA!$a$~QȸPT2ANMF kCVP8L/k@W@ϖK D=7w-w8"&6mU9 k }Pkν DR<sOw"|S+oRT)S=^ˋt*O @,5_y@DYz~`^de,k*CpANMF kCVP8Lu/k HR| xnm[w<pg$ ;8@GWvoyDX8p /KY`z =كSud,Mvkcz`^1 A ANMFh jCVP8LP/j14ߛ!\B~ie %ϡ}'ګڋ|d eާT{IXׄ2&ANMF&VP8L /5.webpXfRIFFPfWEBPVP8X w_ANIMANMFw_CVP8L/wM0nFg뼶OxZ&x%7pt% 8A I:)Y0bfe1YZ 233 6UdDddEINZێm>y?_ls+,Ub4mg}ˡmc2W>A_dѢG;<.Ҝ\:ԞUGD\j Snhj43 /]=?z  J2IFq:n}o}Śޢ#!gjFóГm7d\%F%Y;'xY O]sv8~Tz ..'v¬\J6nsۭVo[_4X '[7Wr=.[6bqgR,LwTHj-cDgF{@֬#?mvh?W$A֙U"Y;̘ͧoaEgmtdBK߬zŞ$܆@Ns: 'Go{D3'՗eg{!\VsҍD/;kd~ P8szN-kDw: TFa\эM4%dhNۙg4щnͷmx!i=[dR޵0DthD2J6n4] 7"F馝1J uI) tJjVnOCRmѰ~5ISьMsHu LXM1LknkSr=INMD$Lc8t ${>-i O3LHU3w6#iUBq:\ܘ-tK+~ܛ ^mQzv%]!S$aP5uBPN(@Kn5 @3>&Qv̉n8s⣐(#O"ϣ5L^q0FQr=Z!6:ʉki ~W8Q=P  a#fVkoakaYp@ת}/v{0 ,XO(BݚcL,~kwေ#l݅W3)`Stx#ֈQ27plz:T'ڼ+I8*0x7uN9Ϩ7.EVnu8ceV??Ǫ^0ГG!v/fLN amɹrJmUMG2 JY]|#$dztʦ}zMgbW7 gd䟭q} g\OCgY_D%3VbWwjϦ3-QH~{uV̛5J̪N'؁]lsR v틉Y3: Dڃ ԑfђf݈Kرh̿+LL̚Ռ( T#LkL-gr;#*/N0lT*:V*[1 MBZ;I%hNĂV&R9'^*DQM*A ο)Њ8q^9~ -_9vU Kߋz\CnRYLWE )1 }&mmΩHB"Lvԋ ,4Ö*TNrEpE 5hd#:~Pۚm%BZW(K30Y.0BFMa%."R"!20}‘P+b8UfRA3 `muZ)Bq&w͘9D~5g|ji?2 Qd.KOJk]2gM}m $ (@ Dԕ!#`eeqBӹSױZ|^0|݌U.];ۚHQޠaǬa%GN1x&eibv9ɐ_rųb*i|2Y{N"=Xve O"[-:Vdv\lc =05-[|mHHg]c+pÔFf˜.5.vBSq,tt$X$E T"D(4oKBnɈHT(͠J"06 ͆DYu C^b4,>9vqnVX׺uO{Ooٗ~ Wfnu߽NkOZhpY[N\w7: K>~BϾ6M-m0MqKnp$* grxV{# u|k¬N>Mqm\fr"z"0ZpُS$*&irZ&XNgHtƹiE#t"I$ի͊qsNmV& mCR û l 8Q$ ]%2G=*:M(H_<^hKx[!1![*9!Ed]Lq|gZN jv,,f%SH)D0aU)DڗB-0cJ;SR XТo0v"Ys@L/cZJ+!*[Bv['SWi\:BNKT7;,/Q!EО!0e9/;E2pT y/<5KT*!K\Bk8+HMV$@dTyN7|%>{d0rV7! }iv?TNރ#֥ϩ#a3KjT4ؑI)_(.>Z ? :y(vj1pG#CFRpO_͡YYѕ W+'/uT&ws{g XYUb͟R񇩐]pK}~ͥ m̒.zV5ֶ5>ocߟF{{Bxl oNgźdK n 6NN1|?tMz];'vOm{:Eܰ}7x|bٌ9a\4;ữ?j=Zٶt:I!_ vih4B wAJTAUT zD#MoٱmE;p!ئﶨk#D aXLSFMiE5:f[IfJUFF[\l1Gh\` Hd{w|j85nQcL!37PO#۫DZ4MTvs5rnj;3)Q/lPkLӮj/-B  RTzENfG,mP*uiuwI@IHjDd5 TI7s4 zEk΢fT7d&;6w4'Br`~, IY7>'[/4کhT&ځ|󽦘qxy""hDЕm[֖s=3w<$"vRwݝ{5HI!"bWŦ)1`Tی%9-Qm>(`uP/%w=~ $,d<5@ɠO>od4*}[?ڍU>̻TLY|5tlϞ;Ls5Hb?v>7K71slޥeɟ7?YP~l\Z)4׫F?|T͌W)P_38K3>^AlpUwiئMD99Ϟ-C8䀵46pd"<L;zқ/ɀf~z)- z:$3O_BG&z'v^kH:JgB:w'w'!л0 PS+B 1i"koƈl2[=~r.0C?QF;.8H`Sԗ^;W-.i2 K\sʼnN'te|yW-&p|%k7BׁLM̡b3 ֎Tt8P5g+]Ѩtt>34{dE>CzfJɻ:Im74cۖmfчo%5QU=`fF0aqyVqquY3(NAFps FbNJjFfhkJ* eY)VJjm.t% sSdM2GTuW )Twe.0m>ͲPua&=,+m6 D^F1SV2s,vͬ%&Y0EPRbA!͂ۚL+ [ԽiAs03{>0LMpDk%ڪ~7كiz: CKD5<\ޥ^*zt׵ŒfS*[a-01z6r,;e\R,ӫ71 )aXCAL3[dyD9ZlI$tE*hq QF>7F 8 q$hM*S*m8nN$m=h>sC隫BZ*,_ _RiOm{L:懂7S_cAs$ckl8ͮ=fο e@5`~~~b㞢0[_=F/!&TiCg!^sb'Z,$ WG NTCa"ߕPdEzc&lQzy`{{f VXGdd& otlyƳ7z 6v<]W1 @IJ)~EOPn_;vw˪u*E]LI;~:ݟߜQ^b0!cvY#H2 SQg3bY$3ǺBԣUh?c0J$ACQҳ f ٻdŔ#Bg ɓTiGtI(G i43*,TN&Do'$PjI^^LJw]L]ɥTsQ];)MPٿ?"x:k-;YdBbQ9+a^M*w2`OI?cOdCz38 ;*Pܻҏ')e' rѳ6`!E7IvPq.fgv䬨p%D/V1C=]'-#u.WFkH})Iy0*ҋʡ417`G&$7ANMF NJCVP8L/NM0hɑ2Ÿ} X+>%:C mж lٶHe\_q MSd33w2gxҤ'g lۦm͵޷mfm3ms,;`&IR⠉UV}2f͊"6Tfbx q(djUC8R*1X7\^;uZQ PPA( ?olilh`îvOs~B]R+;~Wc(FEUϭ~GF3Xs ob) &K{$~Ltk:;gK.nֵIw+>Ǿ(CnsNP ,;6eצbXSPw s E\AoIdCbNH+|fXDrd@N5"Vمò;L8}ꀢ&qv֨6s.nsߞ,&{#aHeG#bgVyfCۧuD eSio.|4)v'b脱w;1/6vc)atݗN'N#C;ݥ`r?|:W#=Hm\]W|iv:&L1噏~IO.R Mڸ*/M\[ m#D՛;hêCC+֬*BPCVvM-jUjZ424h4JH:z3IUDs2Y-\TZ䋕WT1Y Y"VZ/{ڐ |DGp\H"=WȺhU_ijPN\jHTƹn-㕒j*wCDfrۧuJ$MUu.QGH%')FY@ wor97;EU! ժMHJ(fgT'њm{`]܈eѦA_m푢M`z6b`i_o[>Ir; =ANMF MJCVP8L/MM(l۶NC?OJrg_h8ŐǶ4ssjnP%Ij۶mii0&̿Ly4,fCkj[+tm[)Fww wZ:EPUN7I$P!/D Wh Cߜ9=me.Iu׌w@Zar'R㲳n$=,QL5̧TMUL՞ge^TOozKJ@HDAn_@W13橹ktˉ&Oy̕۾*r`|Cqǩ"e=pc=W[<@_x *4*5+nXzXR13yzx# C;rKszČ :{6jDjש{NT,s 3B{8qqPWu]B[(Njɱ DĤ80B A9giRC6tpP:lBNGyl۫2*FmGPS(bJ0;Ȝ(B(S-0antJ(®<@TzH@ dc YHԙ}bVŋd)"5 ,%c-DC#|)p9 IHSIJ4MZ1^iYĜ%! 7 s5b6afXtr(Ù򌅯ʛIִWGģD F{ZΈ:8@ &N\r/_ \nLv.:m 8h.(ncFEt%d׏O/+laDr,pθɐ9ȅt"s7Nyg֫&l;q*UL[Y;gQ梣"#ּۡإ}L(B g폴LWS&YϪO}n])0u.WT9M.aYEy~.Y,@exl<`LN|U\nVANMF KJCVP8L/KM(l۶GnCD'm|Lƕf9q*Id/i@GdնyLbfF,xwl:7"ضVgs/gnE.*P"B'$vwz@0xrAp}Ѷ-sUK0_r]#5=q $4薨-[:euq7n玽뇳IAAAQb|'߳Ҥ؞ᤨuRk+*fscnYȧD$P-XΕ>9f[^3Ν:0 ZMRl^x"g۱z޽ʩ?e;t^鼮y/O x3-;  3 BCA}s;z~KcOk߹L+^R8rSd%w5Z7/_m5H`_>;6ZJ M m[`2@抸+Qzy׾{gƣ(qQ97y8pa9R8/[DAPh #t)j"\[oIZHQXr6bПSJ&)+NP@VDbDLzZӤ)'A֓Q5\9_O/V>Fv6n~~Q0[.Go0!m̙7;lꈜ*vnwgЙHg.sBm]u=K5\/ЅbRlןə@\r0[u1iMNCONMqݻ&iƔ[&IU h?Vkq@(Z!BHJ9KY4Lq\T)P8wLh΋F2 MHm Q9Q!S $YA AMF5YPLIb2$@ =\`l )jL7'6"TMIA.6J&`66 )>ᢗs bO4Ui"4YeQUëT3D%Z˒@Ux]aU, t+=qvf3U)sW`+ugيKr c*Ϛ"dvrAOQہ5;VAK9@geTց!D.hP یWTIcuop1Kĝ#'iKųpqB9gguoQHS"eVԳBGljT{X/6.V*(3j} ո[XcNm:;ځ/VUU"֬4vÎ Eg;!-u²RdJқɇRcՒ)J_Lg lߎcdq-?>5|o#?~#:)f#?[7ۨJѿ~oºm}=?]i+ΝۛQz Q֒8T[7/oΚ5r)\,.hu:Ho޽srzYP~?i:\~9ur{߾k׶wrq]3iDJio h`s)NUZX%E/-fMj殪LH*F3@-")e6m@+@VPRT HRFJ ˶Tb rUUIE$yY\q! D3B"h Lj閊;Y")#!3"_Ri#KIA_$\vN$+>4D$ lUa@F}B4bqG#U4$x#J( HqI](v+NzYC$3 תJ{\ة(44.'q5Nx8ey|$ %$bCYE9ռ~*;=.G,1s![an\>& LVuEZtiaбw+ڴ+H8-aaX+N]owj6\q['c+8t-C+o?VntT$Bߗ1B6F=cǑ}!\apmD+׿};fo?l4D +?{զ V@hjaw4#ԩ Љ/v̏ܵd=UMuŕV5c.7\jI䢱otWs4]5dFS=i܀o,5hj Sf4j  #@9Lqb/eMUUE3 )Yv&Q Q ˬJR1jXZC_zRچwĠ DjծR+noqkHY0ff)Er7- V>-ZŨ P*$t[Z 3,z)(s/;]R586Q6BƽZ\jj,MDj)[y9D )Ex,;Y[BoDQݴ q8W@ $d7/^[::B;2YJvK7QGIPV W[Գ*W) @}@ҊC1ΐ30NUj |ֈRYd#T>YN\3mpYx(F^vtgANMF IJCVP8L/IM0h$IQ~~ pZ>\q[ Urm$y~lRl۶l&LIPCuGvb,1&7Kixf=Dбm[{;{FJT xLD#vݞ|@e^@ /q143U -l3gքE8k@sanj8 ime!E˖͟٭ϯMh:( ~z洒bb'>{x!JJ8KS|_e` {G>x#T4Яxۭ~}߼óEu¥;b?,{ϼrZ: 8ӖwWܻgS_۝8t &\Ciʭ 7}cpWwE Iع7_JGMʷk*hH74@W#a=_qΛyb "9L5+>:XTPLJPtXUO=WxkA !jUQQvG Q(@ qtP4 UQ5\9t!m)f4,B S>B"lfB dd|$k=ATVdvDq[55jY1VdDw:?&nKwZgnC"alvΑ"WP(fpG@ 2lHd)ұ&7턛v&j/6<"p$Y#7$q2uڢN"VӰC3?vdo3+Ti ]< UaVL]*!NM^"ha/ӧbxuQo鄈&T4'G$Ϯ]$wY̙S 'T'fG~d\4V!E;8(KgqaJhRM@p`~<𢊝Y*A(~sn!w.WڊXNS6.y?%,NNw s_$$vy.x'+[_NW4v,}AKEnaփuQOe1N4NW߾wNњWDKGw3tbfhӭZy;wM b (8hy2s )Hffiy׫KT1f+Y܁efG4vQDJM3Ͽu/ՆfB`LMQ&FU'{ዳlfA.n{M_B0bh)TOq5MխUM[COF2Q3:UMgBҾ#%|#`4选jKUGJaРǾPw%€ju=y)&ӣH=DvHD6ԸX^b%":d|{ )):GBJXwWPoS!DGRr윶L% AZ2iAO|ѱb]"uR5I a,'t>סH1g_ԅc7B <:fr&F?΂y`zIn"L67Э{k*JYe0YeLvB}8)VTL Qc@ z|1Vѭ%q4ANMF JGCVP8L/JM0l6l$tO]U" >߆6ᑤi@N ^/fLj$dV's\<wy<20)z{v̦4c5ovV9Sz{y{|b @ AQQwkǪ&Ҵ E#=8uܱ:~iK~ـ'g]_#Rэ[ǿa!@ ?'O9Dvl'WGlLn榵Ѝem2Y,, "Z҉;פc[BLKr+dra!c161bS/_/b.KEQorX8rdi{:jK4^sζrȠ+EfN+[QwذnPrprnF8bz [YǪM+ӿmo*Sv2/w@(Ui/Pfj5fL/}2扦?5NuB"Qt;lZ0v$cmk @\uO*eElXoòljU)T5 *4cSiN[VڑFjZ3NLdQU$IIVMk\BwΕ@fI;@*Ѫ1VUn AX@#hIn*j3qM2s4d Q2k4YWW5DR [j3Hjrf"D! }Ī4t\^h.' IQ ɴMTn8PQ!ϽQM?8-M791G ?>mfx[4{?+qCtS}Q5 ɬb,2#O[o߻ZiȂ!(bXPDc;lU(P*\tnV1A z&|ѫ`XZ;!ɀ4t޳zkF݋M nSܲv^TI ȑȹ2e W,(\OI\')piRHHv$TTG!0HekM" 3.Є*%IPʩk>~U% T/sEPʌL 4FY;q!ײN22h4trJ+Ϩ[(5Fx) BCq+l)0>[ue:JPLQEfN8ӡ8%U&./fl33'3s苯ꨮUGFaQ 0R$E^L.Ύv\;aR󅣚H#M4:;d7hu,#GѫɡB1hAB6C&4dIȘXܯ,0qX$%y`(k/W3 ΋]P~ZQ!}c=]q^KO?cq ViX0o?fNT0c9 ,naT 2 ne;YJgœ2a O]hkf 醒̭`?TFi4C˔CTSޥARbܢٔ)k,J2_J|zzkrKMC( AF ъ!M[O_{u3K10qzfg?CɐJ"iqcmO/GU®u?whiZ:2Xg=c8I(F ز$1&DX&F FM6M[m?4Izi\l ANMFr >7CVP8LY/> M(hۆ+O # atw evIrF3c13/O'Sef. [+,[r@۶UJ_{sɗg.i5Ш;dY<{=m#??jlμL7V-hLWVJ]03Q42YֽCbjy˯tƣvK BtO^鄹JJ?z#sd!)[D9Kr3=;O>{LhD'^ҋG20k[Oen(MSV7ng-Kj5Mf~,;X;zg{nI uYѧ/(VK 8iv}kw/ 96xμB(w~$4IBhAp%gXUC͓Ym Va) YvL{[Z:阴-:b/B\^YX HNz@\G37GҼ"P+-%UgN%.<=F; uyr%dkcԎ1tX?@vK*GR"B!؏&kB(F;uY4 /&Ⱦ[ 62Jm9z/ߊ* UeP؟sEH$28WqR/׵ @) `&!$B eWd@uPe&JP.{3F4F! X9eH&!/[SgȺd$y:4 8`'L N,oXE:c\xLev)@2ޘDV'E5M2)Qʆ-'X{F3%67vn=2oj[h|F'a;B:B.~&\X gaf%1BB;3ŁaT_8cF 4,jf_=}aYK t U`]j?7"%: 3H]bڙ#Pogrq3ڴ)$ c_sx*qT'#V6LA/QiozÏqV7k$٬;vRRضo@?r[ggt<݅_FmKfX3V呅k;șR k/Myx/njT ,tZE*F*onh5ffZ$E! K 2Ew$ґ]F+{]Dh ͙36( Dk-AذaFYg`UU(e%*prU9I3ANMFb =7VP8LJ/= M(hQo/!`3y@h>rC+3CV-۶HҖQ_0DPXX=:mvϹ_lfv+.71s9ef&ӽ(l۶qv4A f̙5-K+BQg\,Y1Ee`e(UaY$1-Nuf tN: GozI7L-H`y>Kf_z?gC6d(OIv^gzE @W~Ҏk BeK7H€` jL kfK'.3bg3: y'wBA5AMD8B<.7h`Qa\n c~q_!jOdCcGʲ}tv߲#Go>ְe!yYОk76B~LکG_{ɶlǎPA񏡙?~g33fƦ;U,£v u˼VHF~x%a= mSF$Xk 9(Jv-t~@hALك5=E¶32Nm0jH'y7߸),TevmZJ$k@TTUZYh)n!شeCBH6w UuZD@cʬY34Z۶FSU"d$IE0K-KEk,YQTEUnormal.lightz321.webpmRIFFmWEBPVP8X w_ANIMANMF,w_CVP8L/w !/E? ANMF kMCVP8L/k@M0$)Q/'g N$ 8?uAڲ_9 p޿nCYUݶ=۲DHp$I,co 2HE=ȵ60@M>YRHԫ^^l'?dhy%)ot %Ο IWz:x&78 HsĹAũGm8ͧ3;S@y^3";P)pb('7:n2R% s‚6okꂑkCt`޿=9jޙne7҅Ib[#р̅:tQ6%L>=4SD+TԮ_JLjkpWWZG?~]h+4H|p"*q3m$SܕipDѨwӐfB!3n8a3ap)Eh*IɡX" q|R0?^9RDO}Q@`,9/ǚ6F0?H; RikjksNZ"uBfAoa2_Kt^ewl8:Q.~W~],Ek4y2[ y`^櫃e2$Ҫfgp +^.İȡ='ō` %>ikԌ ܍y0^`3v~;2uu!B)K>D''im䂄DnB%~[-\*x>v1ӏ˗Kjvȵ"ɛie~f*aTW~MbmWj" a ߦS;6?HH}o<3`?]n~Zc|V&66ev%:z>v[%]Bp _9m?5l"7.@n h㼭ۯۄ.l;u^<@ܾS_pH,CϦZ==4!SщXDi>C+,[WG7!TEr5/Eg|6V! ѥm9lIidwL^ 4=!{qU%7"oO d_!_*LP.tY ?8,٠*H)L%8'8)<@y3iNZC ݂H`!8wi8t8LDK B[(t|IA["Ƈi^g"pDgf!GN ωmF62^*$(3qiffsL1o\vb%NeNi=Y SQӶZӧ⽏LIh'f^Cw2@N`(a^ij|8 ٚS4DIͺһ"zvbls,Vk 䕭:,$j{*T)e;j::x:8A?xǢgy;YYfc^${={cC!fYf"6OE_ 9OT.x-FFAdP`L0AaO{n9y@OuORz#il,pV74_Sr:e+j@p7xjB( b+>nڕ=|{cUEKy:+YNJ`۴O>r]i5,)O0ytE>r{wB6?Ns_n5e?q ʮ•:^>fw}]V<~\R;p7Wo:2_J_X׫++l ,}$7 kg~\_c|J=xE&D<\:_ =:H<›_7ViR )+I弤aaS _ZV8DRu1D=IR%@"7d;C0ҹ@'$HgV[կwΗĴɄD26 zn(#sF|Jſ>ȱ穠u^K1 (M2mj%(KOJ'/1tg\KDž{9VjeA &Z;U*"ZV9r.?w ְh9byFyVm\>j[~,`-d5bi汴pG# %ZեQS*Ş GkME,v -Fl+ћ`=;vVShf<]9ز7(1})E(Sna_W=YAcANMF  kMCVP8L/k@M0hɑ2s `bj@$HNI8N vpy!fk{I';2pa^bfLITڲg͋*} ^Sc/_sʧ&zjWI|eOvՊūeهvoI600DJ<^w>}worϊ 䓏%1y_`.:.NfVnEb/i7om!Sݤ,S=e*S,|E1v"3.tPě 2$(av"pw/(d‹l}'J^.u݈trBfsy,qF'`O~'g7E7!mv iدl.]"nd.LFM„\C̗ ^gȄ_a[p*x Cɠ\@?^"qp@b;9Ÿ^>}p=P`b2 ΍H4 fc^x1t卿s/CWa2Qy@4ŵԾWÁ׼L f MwUR7_z %Q;UUl0+̘ﯶENG^(o9.L=ʹ{i-c. }w^T9xikqGl\v@'8LۇΐYTxX-Sbgm`d1=X G`p}~`,V]6͎ كX١Y01dЯ&yv΀NׯdLc N5Cj7BW$8N ӛ' Sװ=,DE)1z[}a{_&@Y*eW ɤI)ddJnbz3w9giEzHE<ɯF4Y|_YR_/ z8 }e}7{V/&U\11ʅѱNR f^7:ANvXLm?^URKJ(Z4Y+h9Nufa2PE0RhZ {UJRTbq2BTFJBZ(Vʝk E 22j_KR [E,ю=Q =r e^j\赌j4qQV!x]K EB@-[.dJeSK_Ψ5c$PSgvgANMFb  kMCVP8LJ /k@M(h#I"?H (?uN鍽!I @Ft^m{j۶}p+8J?8 rሶ1}$b#h۶mvZs.s>'7#[)y͓m۶d{/^)" !Owǧ{g9ư ggӅm!M%%'WowWXМ%V:9OK+ť46`EM8ͩu ; _Y|mxiivk3CkGPyLD:'׉Hѡ괛\_YPfp\SOW9Tڊ '=NN/Kf8-H/ s?|On@ܠ@}S( YEo[\uw9 (!v/MG7X.O_3d)ENlc !+3bFvR_ٌ5^2OT[ C[yaM` (JB%;!\ΩsP;\ uݏg`TWrɔ$@0<(L5z/UMe~ /Wsc~ptߟy/{€k~-!ouӱG:%o?TI@ɫWvyֽ7r s PU;7FnI ?Yjo dR >W0֣&*r?hrzU;Ո埗Oan)hn} d}7JILP!wo 1  !erɆaB8wU],`plz)bݛv5!'p*G\b8"1?5d]|y{B?.g) Pk,jy$aFfh|߲@ !}3B&0HȀ (`dbH`Y2bSD"OEB{,qBE*<"$ch0&\™ +0+C8#QM"`s @Ya@!~w s&0QpFG6# C#-e>XF{flϦFmODbe*rn*!{@P0I` L\{ 0"((sF>YE &\*/VG*96ԣ#@pDqٵ"oC 8ߣ2 a K:(p /U:ak60|!. _@@[ANMF kLCVP8L/kM($vH!33 )SRFI`81d[m۶R.q$1H).נNJNfV#ضV\{ݵDddԇRZA.W;WΚ%Y+LD4fҒy{zY x-YYOFNߝ^+pb`I ;l̶'V\nYaraƖ7w}WWcyXz'\ O-o>t{klKC~ av_dx}5hx<Ț&)g]`5:=WXi|m2Q @2Yqbs_<~p4qz'ߟ%,Sdfkq}  aL $x:Zwd9R{ˆB>Im*7Ɠ͕e" HgX,-\ML3p]x[̑@4̎j=i(_ $5 ى^F7Z$ݴext.{7~r ZYu^0sHw-Px.Θ[k>eAuFJ9](zlEaMp5Pr\p.G;BZ'30c d[vj cIR\D WR%<`N8E/vY GZ|ZˡnǴ09pR-/DH0eYG.(? Ѡ()yT4BfHd׉X)I T#T# ~,qr%|,g_q]hyu{hV@/T= $+tY11S7|l߹\R4/ݹGf)ί3  ;\/U5Ɋ]p}q{#p ݞyu wݕjOK !6F*x{Hc$V}9Y,p|4ν2Ii ( [X=]}uj\;+>~bdP ,%Ja0tg!U؛`}Ïְ |>`QoPeL7yp˘ifJ@yl1ְQ %)Ü3ʹ4=6JA ;KQ$ hB&Qf8\Gw".@Nvmp?>'<_=n柹5]C"δ=Jv ӈ\$!c۷L_ܳ P/6_&J@%FL cl/ 5q5 晏R EP pR9Pƶ-#PRD!AxHb ǤF_J!Mΰ'M@  v-$T@ P_ KHjOpt!enټg2#@4 #/i Y hU !IkF YQFcC5 k"/@ZKgBZi !g@5-p^CX +R .#+f_曤XBXb fPP]I! &k1>2yANMF  mLCVP8L/mM($vH!c)2!g)H6VaճI3gk6 8\9oZX9ٲ$6@oY$* õdFHm۴F)b[T7WK9-`ֳޜ JTC88wh:f]ٌ,EgfUEJW]b|JrPNo>: \Kt:D&rk-*d~~N:MJ'aL;ڱCg[D淞^|x [8Vɦd9 ρLex2aɀ`cVv$`': D4R8 ½q1!<1zːdٔl) 7#"쥸0#1bt@w]&ǂb,N./x-7  rXr7 4]7̈́^pakԐ׭w'79k& 4L1Ӿc(ɹM7KiO M Rm~x+G[ZD}w%\_U"}6Bv ]y]]74ؗS&g+pa1x%,K" P =_ySfoxRR%# }߻L=[5ZR_k. 0Y\U FG%".S~bp఼ed\ukvzGGOA 4zw`=9alzKɹ׉W=ƱӗPP` ?s+؆x P8! @X|kPtc +,ۋbu? +QŠ3-( ?2V^ZÙy L eüUSU ,}e"jinV~Jx]֝]dY_|&N;O ]S(4ޒ9hD;QAtgx=hw -e(1C9hhm K5HK64M;1$ R""ǥ6a墁q m6~4ZO'cDR.gʋ"2<~Ɩ Ŵ5Dσr %c*23$R^ eQьi씷ns /̒x;'%4+DOߔ4e:vi4HUUv:}v|p6߶ #A5[\?}_dε[4^R"Y92$ڔua!`^~zcK`A5Kjw6[N5!ݙsVI粘 p!Q]ZZ!D%idHjՒiwt0w9Ɇ;D`cWư)FP⽴K@'1}4mGӝң"HIQHm%J1]Q,ɲ<imJCSL;_Pȩi _ϕQS矁*a? +O9ĤZI>SE`iҺ Ga$ZIvk@u[A>kIfa2S0i|rVgpj{GE$/ aȡ?:h J\%*Ql/rz+C)W@y+N>TySm.BJkoM&F͛c+Z  kH)Z^ *I>z[Hj'RFY¯ u=V?}鱸#52%sC0l"1P뿆_:̛\/J,/Z$I㧛GC^AOF ZLJsw-59m]qE>=7'gZmkOэiPg3y r[6 :cܰSIdqC_2Bٞu^pKչ2Y(n{^H׆i5!O _;!L+CE 7aBLJ ]oz]\5H~^At"4ll*/H_t=m?Y/07=# Vm"ix3U_TX1`"'frW^wiH`v0Wrmd*'~1jNo*ӑ5y|_֡75d%ǐ۔uwjj#YJDP»A8_@8r\)_9. Іd/\u(!GCT!)8=V\419)GVa{oDD Awz0ȹ]QD"Ƒ &S ?pr89y!-}znwvqB Qjۦ](Vd @ AЫa L˾i@Y @ex=bJr,; 1’CIHYVV ):p% i@`Vco6GÇǽvي )R P !4p1S;MI$2AQ61زm۹{D]MH䛀hkqC|N2*4ӡ6x/ `T;Ynaҋѻ lR@IҏnR!%QfTOOyT&#/$ FEpŰ4>\:V KeK`qƠR;&Y*z Z⅙c+]A),\$s⼸lyxJ_»`΂[Ij\4?o ANMF  oLCVP8L/oM0hɑ2?m"?CoO~ В %q$ _bۀI@lqc۶:(xܴ?0?;sq"{of@C]ٶUJs}ݝ uR4%vww#{ $EQ0`8 ɛjk)"Ѥ^?=_“-&PvÍa٧0 %~qua;Sz ԜZOKGqZXykCK_ݻ|XU  GϒCS9b77rCnXqc̰jXKzg"9S޾tNK5 c`I s|<BCniPjr{{NӭQL Q̹C wW*SR3*xӻG3ʰ4H^K)SIP?w´m&wnCF/o2?B _bl-_1/viܕdlsei!ʿzޢxޚAJ3F+J`uZX<>!BޥR0)a09e8`]2JWhɰo<'FSay~lJN $R-`T3< X *<K3k6)RvA>[)^ư#-!=GE`Y )\i1Uw}j9xa ;6l}+D ۮ,fxR ;09 ޕ@Tl(DiH ->'zA3PnȦAv{h.꓈#َP] wiEE߰rGãTcNƘG5g#˼F3`*B 6BE"zV+d.L7,"N!@RUTYV]x@fE-[y1QʖWg7zBMN>-h9)I@[*B+duUҹ yF5.ܨY0I8lEJٮfF6^n3JRӬS"u@u:@ =8 5ؚDپ;Lx1rR^똰r% GT|r*e[DV9Hթ5g@dͷR!iKT7#CLf+f$`j۟x"4HMQW}HQ2ZbKM-v/fi-W{=!< [>V4BtFMXL[g@4Ju|yi^4K!;`ǒ cּm2@͛So;@B~#*Zk~0gcזTQ˜r* LIXo|XY0J@nTk3r;׼)<rx)0v6A*Io_M8#/8Vix@f3]hd}]#ɂʹkt$k'c5 όx돑r[#x>}8`K?` 5e9|KLo<~Qij[bCm brM9RN|w {@[PQ/x@B‘yym `6B;[]amϾUgBHsuy%ϗߘP0| ɻk"wLP;L؛Sw̖>+?.,Ifؼ?߻OmIh!*a$Tn"ڗ (Ǿ# HX1һL͚S-YfۑȌHݚa3pq^dN(JrU`vtQ~+5sBJ? % Aށ+h?$$]\9[7=JC@gI(`PYerm-A97T 00@2@BN^CHw$ ]"A,FY\4 =; (; *G]Yppy8֜v9{(De~{7ܞrǻãq' Ld-pO>KǮ8OHw#`Mfb>Ǖtz{59#;@o1>g%'f7k!eGAir8k-c p6`#@y>RFn7O`unsT}5pT[dXl2~ZRwAcۧ5W^"y6#8ML6 Ft`"?۟ k&v%\$ϭ{5UұUV\{2fNX${"p4Glot.*H##\kB' Mm:.T?ĩkS~32un? ʾMjU^.1a;!s^ IsAEw±yJ,&=ț'XT& U.g8o 7lkHXJj(w<(^7T`SǼ.RFO I2&o#}>{^FU\ٺζː0;C pqb6!F-1ݻ`w'gI~Ԓ,`SzGe+)pV?42<+!;͙8&piY[V: y M눐*B):Bh,D$šи}m @R-D3'BhA") W(p1Mb` 9GX'"ZED-ܧ SV\&$dÀ3ycd Pp1+GtPA\Nϭp*)%L )yr<>8pjA%Xs&CM c1"ƎsY0$vlvvL4FE txQ>* B plP5g=a6 t5O:0u&wA-2iӒxZG c_5终<8ZAhTm-8#FaUnN*)0Ih佴3iF>5RobYt AU¢_amcƸ~> QH{)4>bJ`  D8rVch/!=mӥ"Lo+0,82~J}3b6i$5s#W;ANMF oLCVP8L/oM0hɑ2{5 _ mYd6 s hs3DaYsrfV7U@}e߼VOIa νck۱9뾟W6J'4ԶkضmܧIap@\ ,9x)\$XovBޒK Pe,G%YΖ3j1 iJҥ(B9RNJ>,->]Ք>ΝԆ2.@NiO'rX Ou۽ˆ),̫_~;MÚ9KdmEؔr)権#j&gWshtVCxA/߱p<64r4d*F56n>ޒ;H2^>?72R ɇ|&`0ezOcD~Om~C[N|1O2ǾgL~kN~Ŭv5N1M1s0VK$<^J Ӥ^$^ wٯ^d|׻| z_l$_L+b%5yWw\QeӤޱmqZ]s߾30\ xPw\j^Gd?W|\ț>d/p\ v1ڒwoHʤE7? >om4%^qc?;↲C;9* ܰA2u4tE )Rw؜ڱТԯH,KP_2 K%c29?T EX7ͫ "`!v &$!,w QPտ u(B-\ S AGFK7yn-B7&XXaȝ1*Lo#84kfas7͝YjNaŘ ?"^-VҦըh{w/a(S\OVH {8).ǭz+T!0쏝xTaާ ?f}ݩJh_AA1hT$V2 g4d)_~Y3*N wNjEi{~Spw#e23ֶ".B9B?7bx%&#K!I rX7W-[z:#sM9TSBNP.f[MIrfx0٢k: Y99مy]t(])s/]P? _ mdK cŪF2/Er2C@K aZS;]J]8h4Kw'!/NÞW8|w\J矰0Yz| TpDF?X0 ao^P>_`+v5-K@gK|(o>rWtOg8￰ɲ4̱U@70_X x4T%o=Ң'Ug'O&$HŔϮ>( 5u}צ3/"5Y5{}dr`U KZݧjCxt $nj_ӏ}4AoNig:v-YFLˆf Ie 5b44$X9=,Uu?IJѮ$"ZLa8˵ L["L1a)܅d)ɞKj͡ 黍׻E[7O@#iYYB8F%{+ ܋$ 11T_;}4$ހD<,XmYAToi`.64"W3Fu F d_a* !&?(P8ɄbbSYʉp$et=彼-=)nC'kDffԂA *ˀ#AVCr"{Gxae"wogHdxDlFo8$wwoXQMucĨD"VZT;!kSpΘz̖ U Ωֶe[Bt{D6ƈ6dbD 0G4_͡7l>5Tޤ7̓ prL{J-h^ʕ\9cw3Ljm9_[XE$Cot006KҺ2^hIANMF HFCVP8L/HM0h$IQa> Xo~1DwϦmrA@mL]f轏,sD'(o “$٪m۶^[ X[ᕂ138y1zk@ԸAؒDyA76ݦXm?^?v;laE{oI~yecvVӲ|^< x8j>nJ7p.a29_g\1-Ev'#g=uj9H"PnǙyq"M s8DD70/X3DD3=.zosNH?ӭiO_ 2 {!y\a7r<&ish)BNgXL7M)\{7')!S:KxF;ݕUx"{j+G &MSV]/&@wU>AE0cW}Δ!Sz`8}PͷQk ŢoibjM<}NeԉIc]/^y8?mX^O=3`U{?:4eU|uK,V8: pve[ۋ^ed%E324i*S|bhZ5ȡmfm|Bʖ2LѷKWpMRf6h͙q_~%5Qx̭/yV-D*&T<`@ VGF{rZb"2mx"6;?{(~ ,u#gĘʳo#(~yWth"ӵ;Wl z!W>Li#S_{|ml&.ټx],o>~y:XO돾'MZccZuszJ6+5Rl.KS_=-NRFȮu(Fl;rJ g]EcJM+k d^(^PR) ##=W]k4C^yrQ3C`ט*W ʑ GCt9=Qh82vB#EUR:@JtO\{|Պ#e$ D1h4:ӚeM^aԧY`E(PĊIEARnR ^kBVEFh4@~kPPvN$+Q+"Z#:GP$4tA&?nd% TѕZ}ѡ2Q]hKwZf$6#WȪ8(P#{$>y%l5. "D/33gaGQ: ;5m 0MK`$ ߗzG1v}P>EpPP/ ANMF 92CVP8L/9 M(h#I9fBD'q44Eq(ֶFCj;3C x';FI m4缟ڶkjNm&z;Skhv~zH{44 p|-/ ? 5*hVjZzpqd4T9ۇZmx<ΰu# `?P?i#o~íD,aLxw}?rhqL|êiW R2b_+5L8`2$!1e8L:xYPstEk]]d5*d\@+b~olpٚ tK|dQW-$;jUںbQʓ-Y=zG\v6۹CѢ!L]$fIr߷+۹fh #V9 ܤ}w@L#eܿf6f[t=2u\e%egXAB 5yk9R>>l5147~|Gsl^Wrvp ZG$Chr ѱAl_aa PHCUŸRpGdM{y¡X/"W%áT _J%^tJRR Z1E1ܒK%%3k"XSCګ%]1O.#90``* fuuUt199LV?Q?\HafmA8&0uNE@%zVMx[rX=:!pYԢT5 7ZiS_ U_X}+ .{‚D `b:(\:`p.?&I,-܊tIәl[:e_F[;&N閒rìV} L p;̬#C[y#߾Q (wXlMF:zjuL6 >n~)7~BQl;>u/6Ro`p}"n/Hdb"!LȄ}ji{J9&+GyX@R.U}^;c|:vNQVcFDmpنAB&A%gj X/3yCm@>7͍9Hӈ.Pdi7WtWL] 8ͰI4,F½p#{Žq >pI>a=v?Z`/3en0ANMF k;CVP8L/k&y5` (F^z,`>à$Euw}l[B2 [ĭE$//q~*OQn-o"SPDa7AS8(A>¯\,E+^q|µmJrA!?WGD mӚzgm4+wśQIi]WX);oI3Y۽DR˒Tb&syb*OyR+KXrzeӸbO !WfbC "m:Pq֡zۂa,NC)ie8d6n`k`m1Vj8Xm ADF ~6TA@VANMF k;CVP8L/k$Gb]w7EMIܳr:h.[AFN~g0v:d%ϱ (O<`…U . @@)$ _ @,$MRRlzNQq]5%_>u~~ֶp%ɶxƒf_*ڶMs2n;8+g&f噌gXfכp*%uStf3b̷g,|b_O^'}b/{}:q^*P-7Ƅ L+< Bt%XvBbJ?> ~xڔc%rlhZ$Z ?X30l`bX;& ZTjSP %b5RԴZ7w 7śNG~$)ANMF k;CVP8Lj/k_$Eu ū|LcCQ#IQ‹ w6yx^${߶?(e`D+i* [CGNjWpw+B`s# 3j/)IT?gxw,+Q]*ƨSԫU<1sM8ǿ Wm G nēO.߮#L6=a>`O.MKM?ƍqK\i$62')4TR^./I D{vKÓp /K+F' )B 9Yt }pQjNƪs!s퍹,1tZL^,l{(&,/9hp$<=!Yx.# U@q.7&t%N@D%@eXMƁpBH?X;0nu`bX7& ZTjSP %b5RԴZ=ANMFd k;CVP8LL/k:T?)'<46TAHٔGVm#ImJ?ʇDoQضrG@W_8U xk5"_I,B[= H\foY+Hƈḑ$EYeJ)F۶I} \ұnsol1MrP@<Pp )T[a$sgH>2Ay/ E@h80`rZE=b!nkh <`512&lp\=uqݘ\3UjT MQ57H/UӦj?ߊANMF8 k;CVP8L/kנ$eɛ|LZFhQ`*KZW1$ѐ3X*&Aa۶tnV/@ 4 1wT7kɲfiܣ$2#7igݎ*F۶I} OUGHCTc?p(yStyʕ91p+5%ۺ\)M 6C Z}cw1B1Of # E Im&1$ Y7 cݘۙXpXm P-HQմQ@VANMF( k;CVP8L/kmTxDBfjlձ@2&0{*.JE$):pu3r m~% >,0&AC?EAKk֛{,$I3xc%ꪈ?#mIS's؎ZFwL zjiQzkZ_⶧ 6$du%NDtO@Ib q$@"gufY5 c՘ڙ TʦP*KDeiznEANMF k;CVP8L/kO@ +dA H,1= {L3{#!Ɏ|kp۶/HR@-%b;%?ڶm#MV^ГfiQ`f]`jz`Ll5+):Җ #gN3 !C7f8' a/ *Q H-TEPUbTAI,TT̯ANMF k;CVP8L/k'0! (n *`V#$$]MqCDm= fOCmOb!j?] vG 2xP(&PZvV,2ʎ(2Lf!s,t ANMF k;VP8Lj/k1D]$AE2<:OqYڋũuHY (=-i2~a_4e,ـLYd)".7IANMF& VP8L /3.webpRIFFWEBPVP8X w_ANIMANMFJw_CVP8L1/wp6#1όYd+qwH|'ܶq$bNk0/ Z>HN+=  ӟ-Q< 9T,X<yT = Pv +LhM Rl Xٰ)c9pq R0Uܢ2am.ځ;F⅓_WF X@[Zr6>k|I K^Gz[vnsU6<@ݼ=_Sj,|ANMF$ k;CVP8L /kpܶ$1^뻈`mpoVzg1rƑtw?` Ux^nUP swOt?Иץ[Lu*ZtN "&9E_ب&.*@:V pq!xdk"Ɍ7 L ! 3d XX0$2*Jgzo}ZߘoThTiTsKT#MTN?ԿANMF k;CVP8L/kpܶ$1^뻈PFj6nHvjʕC8<Z3ٓ14}˸4ϒ30.-ML9%sPny4r2 wm4Y}q66I`CKP('x#p\5?[ZwݾUjV[N:RR-S4~SN;oANMF k;CVP8L/kOo8\۶&.uq Ffi 5EWߧ"mGv\;_'"awS>js"ZLnĴ"<1eeSB.+vc sZ%W›&M6v($\ƶ*Kh5^_ ۶q$]2l&9߯mP]%_&cqm&*zwF6M;j 60kP󹣼Ӡc&0)H. GJ U*PdWQcQ#US>QTYQsVtD>DANMF k;CVP8L/kGm-0K?2?͖{)c/Ƙ_o90Kr`k؏v%OCXk.u4B֡W>Gc0b8H3+M^ )JRʤJTb+%Z tʉףANMF k;CVP8L/kڶ&t$< _ŗ $| t{3FWضm$DAiqjgūIg/YNϫER iLr5Wrn[r* M+5_m(Zy$ $%2$@M"[h$v$D`ANMF k;CVP8Lx/kMmRs;0/ )H w*eD $m|$ \J_KFB83e'$v&:)N+Ѽh?Ͻ/zEZhvWr*MANMF k;CVP8L{/kMmNtH60:/ PqSMiq ‗RB L܅2 D)dtgtN+Ѥiߕ_(mnnfW+ʳUbANMF&VP8L /4.webpV RIFFN WEBPVP8X w_ANIMANMFw_CVP8L/wICDD6$ILs $)$cffl(3m=[=ؠ{r6ψ͋ic6MH D`;%HD(plLf@"Lel,DJ`Al@4E$~pv",.c}u>|wfK{rP]O->tg̻ɻ~0,wGoiywλgXT e]cP0LL Og%߼+d&#O>ҥCo$0̞i8 a{zHiL e8]%tܖU r;nS / (p:\ִL4,K1Yt:]5vxpaevؽ=l<7N!L!@r66- X2.ptA,IY$^ e)QY0ae i@ a _ H@M N $l!- ~G H$DZķH$<3$ N@  qRҒ'4"A$@ Y #l"Ea 1 >ANMFL=CVP8Li/L@5mj#q6۹f&}GHp$I$e?o'f."m\d$/۸CXH`F|- n"IUm$vs`E&)7 IX7rMO[~#>{x=p):Aoq\'~+xs6O {ޚxR {}̕7.!c${/9̣M,pkQЩ ׮ZD% Qݺt10%[ƈ6 o@eY C;lĻ8hT(E2bds0(HT"22DP`c,G˲$J$PrSe1D!( JԂ"Q{C 0!DQVDQ0BN$(5 BWxM$( , hP"k AId(P sQR -@؃@AgE@xIHu .ʢN" pZ R=eANMF G:CVP8L/G1i$Ir6oI[IIz2Е6[m=Yɍ%&a cUca1(٤h1ތlTl;mY᫴gѰG7{;wOpiOnlyr7?|oj旧DU>77%)!|t5sr!x惷度yy&r$.ᣗ5CBN *Ba)q\.GlJF_"!20ìx{{;ZH%\2Ì2q\.e GC#G B$I,dDKQB!@S 2 L&@ P2L& B(ʐdPbǔ(!C&&c(ʐ!!0Z!C S @ 2d L].C ]CĮ Aa :\(h)ANMFE6CVP8Lh/E 1iq48nɑm{"(6H̫' {eT!m^QKlV]J$)@(u JR%]ߩ.;:['-ૻkwm)9>?lt=#G\?\ud#J7 >><3J!9>1Uyq] f&㸎`xeǕ#40/B\9H#<< ,AHc3èHBbfB FDG `!@ R=g݀`]EC8V4(W*lZ58ANMF<D5CVP8L$/D@ Wp ѶYU3Xh37Rc}<=ӺlYAv@ymFD+<W]W 8~!Vw`o;9/1/q/aq!+灟5 ٰqYŨ"7TqcӅ!"h FoU(0 Ҽ[^6%4mEDa "$y" 83$gT@ @GLDSJ6 QV6dANMF>2CVP8L/> 7n`׶ۨ݁lS@.`R,,W߃'H/O|' ? OYm!%S4ӽqeI"10\ăBHRF2zs;6%TvqͣZ6j3ANMF 7/CVP8Lk/7 '0?FmyI[( U*II Y)5Az۹>3Fp~k$HraU9RpJJ灰p&L^ P ouJw/^bC+zl$UAB$6= Me.ߴ1$IU<]pO#;ga" (llx ;£@S2R|n08{ h]Nf'&C]Y=i9.qހ_"@@9Rb/.7lC>e5VpiT?d$"yTBT %azr@9 Iu4"}A.qlyȥj)cS #6}63m7O [‘=dqa$rv2jG@{l[_޵|X:^ANMF$: CVP8L /:@?(VCNU \9e~0D;@$)NE_6~)l#C @ʐ `Lf+<="ニ s5~ܿyߝl3#??ݠ NpIr Lh% `s !SYbDođUGB-XQLs)- lRb=v""I% cLCD5ANMF ; CVP8L/;@Xǣ@!AS!yf"j0$I~J#I}!q`Qض D"R&-6w^4\ο;{Lmn&Zέs#Jp{^(z $q-lNZFQt˽ JV KO8dkHdwV^!l{;ǁ\ywLkoy^wANMF 9 CVP8L/9@(h,g0H\y_;@ _ebehYVW^A$IԷ۽㌁O?R;֫QZ.lm@<J ["^VIs`3%q+>JoANMF: CVP8L/:@g`m=kBd=OAmSQ6;?q3XC 8mY ķ2oT)mw$*#saAD'cqıGeцM3N<v#`p }cuP(;_+;ANMFr7 CVP8LY/7' HR|]|R$EwDm8Vl*y{՚" %BS<.=ANMFb4 CVP8LI/401p 4(YEtTM$0 9S"Ȋ&AC xzANMFT5 CVP8L;/5@1E 9ʓrO !ї]6l?WANMF&VP8L /dtkdeclarative-5.7.12/src/icons/bloom/switch_on.dci000066400000000000000000002322561476226662700223200ustar00rootroot00000000000000DCI40^4normal.darkT3 1.3.webp4RIFF,WEBPVP8X w_ANIMANMF,w_CVP8L/w !/E? ANMF k;CVP8Lp/kgm$GNx`z4<6l%5!zCYJoι%X$.)H0BRI @gpx. =X nrн< eA`1V+Iű+KEA۶I~[= x1lQN)}ɺe`o,:[\9=}|b}"OkqRA?]K0 ơ S?X30l`bX;& ZTjSP %b5RԴZ= "ANMF k;CVP8L/k$G{ "IB_+ FMhsXm+y /JC!_5n{SwG]FA?ifc@Tp(" " z&Kéb6sX{ڎW>k=!ܶmc\>#j7MkMgim(t]46li<[oøUC%F?[SYxٯq域 X;O7U>ӂػ Ӫ!FqpEU/&cO\ EJʑ]Q+!ihgƺ6 ژX `զTKjPiCzěߊ}ANMF k;CVP8Lp/kA `Pж?Um#9}m+y܉ɨ~lΙW0EHyxI!<*,  OX*2 }\x"Uv\%\IlZڶgo7Mkr{Ymjtyϑ7=I"㤙xccEܬ %W'=UEERehiXQmj#J2V;&b5T;T' mYAԮ~A mb&G!ߜAB.]cwB!32?X70mYPMu@56ܠZ"V#jHMc ~+ANMF k;CVP8L{/k$GLQdw)hFvFVF$)=fΖ3pxrǬ7^77 R FI<B F)6ysrwbޘwI@I{BRU sB# >^z8x˵ ɐ5cX; .cbPMu@56ܠZ"V#jHMc n+ ANMF k;CVP8L/k FMWam(hF? HdwnuCl[{ߵ,J(!v}vqB.aƯ[8^ e1eD % HW0E@(@x@T 4֪bT:o.p%IsY}pܦ#h6aC;q6{S9Ա!c&M'ː˄/KN3szjBšn=-dɫːˢ1\]; 4SF֕< kD`aB<- ۍ_!Җ8 kYv1kwjX`))TEjPvmdg2ANMF k;CVP8L/k$ILo{Okm6Lҩ7/+h$:  $Iz7|'mc؆\/(?$ Axa* NaA<,Ab"Hf{k1vg&:VjnP-B_ ߼AnM#qddANMF k;CVP8L/km# JCQHwA8 Um=8l%dBCmk.+oEX2E / A ?zZ -GE$P/Dw&z<DMguW$ʾpw'sùMGжmÖ1`OMpJ\S|dh! W<Q&5@@ x+AYT$ٴk>m#h6a:s4q6k{}{Y%'ʔ!9/9t5ҫsVCe=]dɻmHܭ<ȒIָ!|q5!{[k A4-fO9 |b]7unv386f`kgŰvL `զTKjPiCzěuzÞANMF k;VP8L/k᠍$GrEXQm#s,q2hFsczWƑd+YN'g>wy]n$ 'WH^rx= .Fvq"?.K4Tc!ԘX%w|/$٪sހAONDA۶I~[ƀ=vɰ"pw,{%'E\9Wo/9::ay=3z ȁG܁yä@=qg=F0>c+hV̝8 z5ڃQ Jtx6f`kgŰvL `զTKjPiCzě6J۲g2ANMF k; VP8L/km$G~?CCQFX>F4yvl[AbwVbk۪oi, E# .1DYT=A x_1^)ٓ9(?]LI;<Ӹ̼Sum&9lq3dluǛ㙽?&F (2p=R~ɮnc- K_,$m&WOZVBV}΀scfBJP1c h(ūF(D5CapPӞA:HtH5cX; .cbPMu@56ܠZ"V#jHMտy goz>mVNgL2.webpRIFFWEBPVP8X w_ANIMANMF,w_CVP8L/w !/E? ANMFkCVP8L/kpܶ$1޵ܶst7= B(fif+!:%5`Z2mWؚxGAwg`"lD×qI5*fD>P[b4*oD)ST~&<>!y>/ h j%e&-_w,6ANMFkCVP8L/k@m#Isf#"HdymF$5 d$"E99rLuPSP\TUgW FD_`Ԗ}ҹ*=W1/ ܒiћ51/bӊ0h\6q")C#t EƉaTX2+3X3g5ȸT6ANMFkCVP8L/km#Isf#"I>t G&ߠc%aĹU9ishe\N\2rX"e yiAi~֘VJ%A}n)Sn|֤Hփ&%nbUع"uQ/ʆBD â^6:!I?< uO)fm|sA=FE-mtANMFkCVP8L/k@mIO{ݪֶmvvj۶v8LP&ޣ2j{ώv!G-䋢I]QXLw0+J7:|t*0]qϢ Ąn2PE@qKFw1[YjKBi!8X,0$W!X Q!ेdp B;zV@~Z ANMFkCVP8L/km#Isf#"HfN<̩ hT^Id)6F OwRA0x倖'@[ )S *qIs#&KSN.wbDUGadS/bφIoK]c2s2h \|x1¨~a ȅ.:w_fUZ~fZANMFkCVP8L/k@`ܶ$ܻ?ml۪*TC#wݍw9@Uf& 8=8}=ZštПـ/DSE11)6@"&'dF$PH44)M<<Dv$G pӍE$QzܗJSR8ANMFkCVP8L/k@`ܶ$kc#6u#y6#ߪzO UߪcZ=|z|SI )} rTLP G,zfh?illLzlNňTbjYJBp"EHITHQw DQ·ܭܘL+w=8ANMFbkCVP8LI/kGjHRc1G` q($` '  E^pkq _$5:7OANMFkVP8L/k@`ܶ$ܻ?mkkOskDE%BT99Um!gWǓ<\D_?IB:8`47k`o:ܙ$9NNqB5ĬY1`m'sAzsj8b`i/r'{@r>j07/0\w: Ѳ7Ӽ>Oɑ$ER63SSep_6[uG7Gc: ×f]Vwx)2"Qj>0^vseDkҙf 8j2$v 8+\ 8 -a?+')3?[<OoM 791_R^.@N,jŰ9s7qPz P(*UANMF kCVP8L/kª(S0%fo m#9\?Iם> I>G{/Bɒh{ s;$cqB-Eu!7Akr/VxGt%/vJh\߭ћe . s L[.Jm99 NANMF kCVP8L/k_($E5f X> 64708$ɉw ^N0l[ (BtP40|JAmAEHB0 Gh\I0 c$Ơ@>aӘ'2! Q;D.bB ** C$OnjOzAGJF:Qw~ }_Dt۶f;椶S?>?/I3\5:~4Ĉ,2OlCIX3m"Y mĉDtv{i`'%״M _W2- Z@7"Ti 3 q'}sP u%1ohCm5^Qʁi/)1쑋cvMU0998=9yANMF kCVP8L/k m#IiguT46ͷq6Li4H-I@N}"2D,/]p7']Oi~H(ʄsF" ǐ7~X h }! bRq `CDXyAd`~k':q9YIشMcfn:.ØA$;O@x$N%/6{^T6"v̝>g5Q?Mt~ݖZyM}2Oms#)!Y♀ƅ' w[3x93NdD{%>u{!ߵu.?Ts"$$Rh$(,{BhZ8G7<$Dy~ŤANMF kCVP8L/k7($Es,Ԝr`IGCR &ޫeH:^=8m%?vf{? nK/"P[oGT!b!$D" f) I)a6&[ RKfxNը][}Ly(-y}[U/S ?lN<&pb' TnO|^tW&3b}>C" E0=ľ>" tNo#v/o<*q;*&e&q43 R4(?r@1>K];5&T'f.ӅܜT?.t:<g j߀vrN-Yxvܜo ?6QŏW'(ANMF kCVP8L/kW¨$G՛}q<2Hd/`fI]n &4`$j9$@# ]'2P9Pݏu=ǻ?nm:lғ{sٸ;ѫgs5'k-ŘmPT DP´UjtBߊˌYp0>8-ꌕױM j]_p Y}zS̆O[eg"0x$csIl0c#J7;]}_V)'Ĺ$zy"_Sq/ v/t\I Ǝ}\ANMF nCVP8L/nW¸mIrsG6UsQkS7H  a]GmZel= X^7:Q{DlYpo07 ?$ B! a;UOhH|#_)f~)'?Me|؉vQ?OQؿ}|$ǭyM8ӽv|{ʷmt.bc_=9|SvVA6`rd*DEE"(ܩQ3lJj Cdc:rKDJԫF !i՞5#hyVȓP ?tuI-t1M>_x'%HyM?w#mf:|pӷLm~SX<ANMF kCVP8L/kW m$G+?ClIҽwR`0hɑp8Peٶ OO@<$pwKC-|%oȜ/ϭօ`H,( "(z BA wv#9$m9ą{Yu6M&N+[kvͥt1Ư}~y{'E2CpaKд]IG} GcըEclFk? wX2,!Rľ!$iiZL qvlΜ h֟)אt}/K}BhV`ᯘRdydPͪXvۀu\\8$؟)@@+G$P R8Bى_t1=cR׺q| o.ANMF kCVP8L/k@7(d+~|aܐ{⽶$EϨx)L($)ٻ@ ^¸d[ ï}v\fL䛒XC3N 0I AY)I !pB%!qIG? 5fi m~6sMNxX~:nk߿:uǵ#O0I3Ǻ^5\ רrQ%D@DItmBxv뷍zJ"Rk 랑"pN*'((u 0J~D{ l䣉9 -kKysy3`@6LmY(ޞ| L8>ܭ0baW摕j3¥?em!ANMF nVP8L/n@¨m$IiCjQ.rCQ$IwgLŨ$G޽:l$Vw, thU\#0ͯ~J|p)`'H#|P4B ēz&hpi[lBƜK5~l9^G[7xq#6۷QvG\+˶mюmgN^ߪOϷSǦ;/|ełB6HVCMJ>aTH%5\~a"3 "BDh|+NTͩh~-7s`: _ZOxbX_ezf%V5N>$PYVA{tOsP$'sY( ]@ C@!G4 F4.webpRIFFWEBPVP8X w_ANIMANMFw_CVP8L/wm9Otm8=y]ڶӣ80dSm?46νEEl|s 8h *<Á!64,'ZP:dAsf6C57frB*X@BD g?yN{ahNM;"#A NgpPNҙ>>0M{,zWA^˫y Z?׿xIZ?i 뾌v?#JANMF k;CVP8L/km$ICdӚ׹ Q6r{$ Q6r{$׍mdJ..)D( KޢZHmvƟD@`']ק5Oz{Wh=8jm0]>s11:7K#@oAsRF <: F)jkA O =Z2>AVCoGި Rvz zȾP4H\Rfly x;҈8˻?$?.g&s z?\k`=5q͘\3UjT MQ57H/SӦj{T{+ ANMF k;CVP8Lw/k7m۸ݤs8'v<ڶM:8bǀm۸ݤs8'v #V;p#N$ {oжhwaw%$!x5 NJ*Fč[~Й9_nm+m@1q"mFN{oDOuOr F~:ٟ7un;c/YIgMulxȤ\ϲ('iӀeI8.,-ChANq4i2K]QcReq7-h5D[l=i}D 7^fѪŴjLY:<-oJs $2ĖDBB&ISېd$V5:?&x"m9ܸ?0rEw|TNu´F_R %R+IwER\DmlS쥧sNڇY_FKQH/xE{X|̕ O fcTfR4\nhƒ2&ڜ|`bhhzs,\Wɕ;Sy\^MQynT^"GJ2yT^=ߊANMFF k;CVP8L./kǠm9m8mAo)hFzwNqH=*HUe"TLEL̏]U>sHRfaW*3r6ų&Tqi&W9&">(;qI$4GRΜ {~014tUuR Zz{% L&5^M=ɉ9皛}w.љa7v 4m'A ,HZFEoU`bX5&V `ePV6AeP)T iCekPk+ ANMF k;CVP8L/k8{OPFl [ ! Rj t#}JAO8hF8[AFLRt}S+΢p~t8 SIv8MrF΢">!-yX.y yr4+!L*r%~o1Ir/ԡ}$9#" lOn3Ŀ!l:lKi2(Pl$Ymy ?V9~ d;XIvi;Q JpE~۝'dYòX/}՚Y*ȑjA+&ږN#\u0JxJaᬪݱMĝ]JdyYF&JsVޞ4~ص봽r\jF4ypZ+pX] Av?~?nͭ4.Ʈn=ˑY_#"ݣ" nuGM\sT0,6Ji@ ,z|ȊbindkPO!ZtHE51UtqęGJP ,H5jE;VQ--8P)Gl ˷*5VZUʑ11N"K[j]xѸ0PdjdVF (QԎr~UPUDQTUV"Bpe߲`LY ]'Me4=S}ڝE9,ĸD6u/@HsCOC2"B4d%Xa4S dUoT Ȋ^ ZsI9\q&T/U?MeDƔE҈3~!+ì :B:gLǏ#Wq o9VANMF PJCVP8L/PM0l68— Pi-dI@/3#郎j&5$I$˪a133 O}:iyvWB+#2V#Bmۦ팵6γNjN)GTVɶm[OCVADr@/ ?ZhWԩP9. 32hA)hYh(A;DrO}u7-^A2``Zhb"qÅ_;9Bz'jcm+x18wtQ o' l[nY3"!^_ HZpO[*9趎\*ǜaT7c[Y3Fb:vx=s\cj}s(PZɛz)huq-hS1kadX1[_?.chkrǬ;k G@.qt؁U%o9fz?0 D;Uy8*b`Yg#Y^цK1ユ ;p4 O 02Ɔxbb _^FhA4κO1F6A !NlŁj5<nTтXpbqs@9e䝱T@H*Ok1waRbXBسՀ1b8.iQxt͜:p`90SSjfA &n@3!&=2SiH]QQ ͩg/ځfVde- t~C#ECa6[p`F2CNYJ&pQP ,X5$dT ?-GEk TF2 &͢/1Ȑ=ǹAmޒQ%C=_!rz 8ez@ զ50D4:~ 'i:W<<ɮHx`Vd,a*d{#.d\T>f9$O/[I92&2)`F 4f-$v+6}$cɀv9h jr.7Va@ @4P$~hDǯu9dB2rR;wnkD3",v?8T0F"rق%# z~]+ogOgpQ`}eГO7a,14LFƀ0~=rq D_1D_9l9C#2FnZ]<3J1 }xpK{oZ#eE ,؍TD2ɈNM"eFp6FbATcGw# dړs;ISeVθytoY-AHn?$PQb= @iIǡZ* D1yIF8MjdOA-Ar V(Qi "AN+x DN2t$,b,H"!8 UELCP(XLI2 (V8LG-ݤ0Un6ZN?_3W1cU.uRNUw^Rv CJrw̮wB'$)k 87KAbx(JuDe-F[A/RSkÚ %bysEj[V 8QP%gHC ι‚SW}f):XR}*`(֥DW"t{bsWuzv3 f*7ANMF OJCVP8L/OM(h#If  ;f09 'Ѧ2;X֜c|%[ ҍ'`͚*8IC;vqr!9PF{ SUY;]QU1Dfs^wzWQBVQ!yß~?+Y+w=I)U(YѤSS^zlY5o I6skrU7lLGNܑʼn'Lvȩm\ ? 6\'p\sª̭lv7o) &5a 'ޫWm+衤1li5ouzmҬt_әu&~떍wnTɚx.d7Ɨ!->~76%@OAܶpUys!cvç-RC$bT.f;&Ko:ƕ^R',BX[$I=Y!83ڸ$w]J%H=]Bʒ)( Q6㑊PRi R"Q# M]1`efj뢧<˥ $O¥B*Ls_c9rWϳ\PE0VQ };ճl" BʬíFi&PhVB؛jGEVKtt3 jUi4(ZgY; U%d~OQ!@q9dVx5OE1WxY64Sga"l?@2kV#7wgU璒&:;/$)Y;:R"u#yi#"86;yK!e#[^f,0PLqԬ mpW瞖vl&͇}BFdMDzWFaO6ɞ[ՊGBa;YY˶{?Hm+[b)c΁~ ?gՁrF/n|pbuz#mpb7n9S`%v+W/~]X9[!/|?u'p%֧Mع|%={'#kI"G5keS7hig< I8m[۪fpAo,nUMꟸ[N_tYGgF>}U VԴ=**}YgҐqBHio~R4^KK h4N/H"Dpu K][3i*u%Ofaܠ) it`ߎ]ME L:tLGU&>Yt%^) U!0PzdAy !g]3~JQ o A՜ RIf}(1Y,y kY4ՍeS,ruQ6øb@2^$AuT $,8!%1;xBT 겭Z_fjKPQwD"D.Dmh`Ѡ2 Q*TD)7D0)Ǩ䔲gh\`QL%8 dE"E3(21eJgDYI%`J*Eo] 9 1zs2uw!Ԫ5]ןۭ0oN1Tt1F&.Wld֟d7{x1lZ1-8 7=G3j{k@-ffQ9 ]$3)֚Jh2(2'I!)$, eUR $r]'#R )sd:*I%zk!rڪQ$7%1U( {{Os--=#<򃩛^ک^pT 3n8Jg9fs.RqL狄Lq(p2ϵ&.\Oߋ6.A Nݶt-O#" A4MZw-w+.>$̖ 7YШ:pЬpNx*|`H(,hˍmxq-l9 +Eq(\l:hlOB=.{q>3P{O fElĥb9&I*K ( c5[z84ѹCG& `I FTz] -ȱ}`IL+:Iˠ0aA㯋o19 vL獲Gf5+z$Ö /ٖ$L˯4LIb@G?.pzNu99iO|,pckMɈʲ]F3mĩ)-~~䏿1a@4lA0<&0Қ~2'ivTG*-[n 1Ca f೾,G0T% ]?+&/xމ~Dw~;;|!Az$ÛAC+;qʴѨJYΓ?nwwv;-+}hYI hD4( ..K>) "]%%I&} ܢd CBzH8|h2B56Z t̘2J,@RS4Kѣ\-7n,łN@%Vd=IVأ=>IȺ$+7tRT o!IH7.LxۗΌ:P8c*Y'HŔ@8KLp=HkS1eҧ? AEW&E eNl⫩H2'0}/|o#ML\`Qs[]i젺vD"Sч#\âS5rr' "fVKb H $|WZoq$JFZiQfvR@9o֬ Đx`I1KAQ7Ѧ+x.gf$ͦ6=% s}'ʥ0B.ۤHR@4v7ZK)6+>CtmW*y>xIq5EO+wu>_TBj%F,9:_;59Z!+j iX2 .i{_MEbh@Tzb$Li_[]qu{'yT' hYO?*2BD=#$TIM ]uʅ'*Tz[=?~U !VX%[ 詨E!$uV1dD&4BTAS5,Q! (KH 9N2#̙1H92 "ie+iLI4RoSs#!^ltRV3 |&TFʃI"3\\ݒ$;"BB#@T0(BVOwWyF@voęg喜ndNIf~$"M>0Y2 A:?=82QUR?d_Yea'VJ7cptDV\+gm)"VtV}&TPSVL.>n*<1E; j}_w@'ow ،TpUlU{ԩ|'u5K l9ܘZDoZ$ANMF MJCVP8L/MM(l۶?qCD'ɼIZ W%תek x$[m۶>x;C; 9ܱ)af=y1zoEdRKm앀ֶۜ~^|7mrʰ.dgRfevƏ̯@H/I$'[ijc˖i7Y:B0ImE3SN9TN1XWH9Y'rn}-gX&Bs׿ߛɚy0on=,V&Mݗ_}A'&I{ԡ]@jhlhlǛWD5O\ړOrp5orexU#3ٻ/8y_ \xwt/ބ9N jĹWy^>47޺; go_=ss$e;>/49)3;[.V/:LwbcB&ty4+4tvQ_yw>r)9Yo:t`U ct(CSX˿tYo9t_jAɭUCTџ/>gB{e?V+KF ,Bҹi}iZauق=0 )DQu<5XZqrJgN@"Hn2΢RvlCy!k>//MW)[*@=I\'?%f7Q@'7M&>|3gT" x~3j%گ+ϛbEnDnƒ\c;r5a'V%CrՌs 3jl1 dfLP fBVXP.pf49l{T>4!OL!RB焆6Z%Ա! ͝a.kB~2xSoH 13ꡢëJO&4>iM )Y08`>WVrUCZxOOMJ:&5xs׎xkܮ+tYpܶxmZjoܸG5l2=hɓʅfpP}5XG''D-zStyy~5Tź7*R7=zJս\]{Xc7,oN;/~M*Lx:BhuB q?EE^Vcx?ǘV,vJ跤Tj!ĮHM`k!suK?:V,Yh螘EF5u'dJz-dNL6U=۶۸Ŵ[h5:F 3l6 E.GQ\W+; }L,U۶m\ܳt(JQ/lJ頝b"ѤTq"҇і9Ht3ND!"ٞJ$ "%^ #P^[g)%d@aTp (>WNG%8_ƖCDžQ ªr>GON:Z X~5  찮CHhg[{oN6g#/빁}& 'V$c881.bTS)p+G)pEq_NN,pwq#o}M2u8}O/g0\PYȋ#zd wOC'ݰ8`Y&n8L}w%z j g1-@pܳ²I<k.#P!a658{PBX! nFX1[ 38%ʍGI$~ж taB~a+?4c"r~+ǰ4q)@X.f>UF Kh (q0 *A2n\aj&L+T!@[ iq[90N)m9Na(7E6Yhl{ KR obXhgFiJɼuk ll=r/ɚ]g4"ڳ!#d\W ʭZ" FHA&:ʓ?w[p$5C01QOEX3R:> هbV/~#ӳѕIwXoМ+te/&vL&DDv]GmlͰYu:_<]5M8wڂ/ zD}`f5$#LVnuR^\Ml(tyU s~&rlހv`u_:F3*UXoL@L#Z_ U4:F}f P%'lvn?> ےJ'ߜ^,;#S×GcF/v"dt$ѕ{\0qw$|Ad_н)p;Иe'Ow *T >7 1ELF?~ +? nۧ[Nh'a]=3:?pjT W3_e7 9RzY֪s$|/}#MPC3{I!D@}3_._8R;D)WL3C7R7ߩW;ZޓRRCQ&b>&ujTiP$gIJ<)(,Iy&E$TqBqߝI!QZﰳn 26:&%Βn?\^T5GO J3>L4Kn}I17Inrͭ[zzM0b[w[gq?뎓 k=J8ٟy9Yr8㏟Z\BG]W/|E\8\/''1=4SP-[|ұLEˣ<ꎉRi`= Aa6&&G.N-̇R< ~z?a ݩr0i0p{{}X4]d~np%v>Uol%clPܴb2$C?]#$鑏[2-TT=Jhl`{ĉ yI:E4 T3kY3Zt{@WKv)[7DpU$uK:%U+DeT}]%D9BH@-2asK-c [z~Jq,hDwp8G?s@{וSSrTr¦i,~a͒{x;OػE'z8H6K('+Zi7(/~YEcgIk6K~ێ5|z7j x)˟n|p0)AL;veFnoIgǭ4*9*aZ{`/PiZ"sQ}W0@zenӪ#('#YÔ4Iɀn\ -iČH[رiLjU`I tZF+*A pAJ}FsTeSc @ē[2xWl3'_~RP CR4& M )+sQu3l| N+dqA-B4 '􌘄YkJEnmD܃sذ1IBJ!4ae h!\uCUCRQ?J"6~̤2F7)ۙTdsWt L53T:JϠ QG+qGcR 1jB"0 ]nX 93£B; `k_)ANMF KHCVP8L/KM0h$IQƿ mpG7y(96dUho*l۪#ѶU$k1JS"V^y1`pkv})[ +ɶj۶my*d13s~+Sd\$Ҙ3^Kv (\R]֬[5invOVӊ(NPt\jJBMYmλm -ɻ}RZ@΂([?lna1a6/yuveAh:,!΂]}/}{4y0먏lxcX͡䀴;6>gtt}r9\^gϽpcw! ƥ{^[l+G[S`^u~{}ݢIkCu+Gv1Ryc2g{eWOoذaڥ^i0ޘDB w_cfLk?{'&*F,}X4;~ɬ56ջSxoia ;;W6TV,YtS6E(7N!Ţsך-"bP{;awxyg>B-uY9_3s/Jff돾,BYڪAs|}li&Kt3FrN[>MբۄqBο˽&ÝUr n ]޽E+W Zӷdeq J,2gUe4h"2t[Eg u$ujrp 0Yg5:?FG0l&:n鸣N&-}v 1LQmA%+uY3hFQ׏HE)]DT?N.VJ"*?G<#JzKeM{.R@ 2CtEJ'f,q'EPuJRRNlW2Lpz'պEd{ʭZQ-Eldžl*U JGH\hR2" X'(kX$ swN#=c8ɩYQ&҆&f։*(a*MdSƩ#}8R:L@߮"v^j:gANMF HJCVP8L/HM0h$IQ> P4ٰta po4ŽIy$7oZְώLoqZOڶm~lF̭k`h p!۶ދ{ j:(:8T};SIhG)3!DȺ-VsҞр;ܑu)k&o\;eIb~}sʨ,UTӳ>u!&&!h67ݟxobD,TAw< L&AW{GH04pЃǞx`aiZ6Wy\tg si&+// 맔7Ot0s[s?_?K^xր,7z_?Mfdblt2㩇p8ճđ3r/lv6ib~d\zߒ(4ky͵+to=j43ƅ?uB >(븧y:SD0uq׽澆3yaXy?-7QI7 pڵ*h!~ *'Bwa%M#AJd]^fNɁZB-H23^1uDq.MFMXC"m?W_+vΠuBA"y#''PȈ]s:=?%)GOIh(XL}Iڄ:3= Y1ˬmA%QHQtdhU}Lw/"%M8SXtJ^=8U E)l&|ZgH9Ԍirx :4W#IPduI ! MXN__߾V(PX`ׅbն -GɆ& ͂qjXaLK&8O ҙ-:g)+ZLY̲zOki /rHiLԍYKfQ: /NXߥt`,kR-~٧p%ݣg'BoaFvxpegܱxw<k--EIM_wN'w\ B7ѣG{.oZ~-cϳ?㯾tZARtzNkT!5ZEA\D5V1DmiwD,dl>)Uծ]tEj L=>LI,`4X?+d}ch4G>EBKۡhRp˜2Rq17P` HYU!ț1K*2~%S T/rUdS5!LS"E+R.Lj2og}-B5Rr c1]~ؗ(KY'$)GdUw9z/^x2.,T 3u 9ݖSJ,DioeJ=C;%du+bd^v2D\4('Cf O*kM:',)NQ8꒓VgVs4_&ANMF JGCVP8L/JM(l۶t PtW~t[NI5^$Id˲?3 pFv߼ Ȭ9syYUZm*g2t`vm۶z\$I #A͊@r_?.IS4HL0Fm9ᙜԅbh/$ZL('b:J1=&.ZEQ>W A20Tp 㧗K*q9o{væ Q f@Ҁ-o(Ign0Ɛ F:[A[#U1Fr7u22q>ẍQ٠R5Ka<ˑ z`aTq78/)3q3z_!;]л<߿1Ѧd׏)oL{DLim~:x$@^OSj6<DItH{puӬamOG5BIز?$m I[ϰA؀ N Mx \ 8 Or3 9C=kAFjJx><="ldlx q3dvR a7`oF&G8Q;*bn\܉ Ryu J|TUQ%<# 3<( 5̺K];mp3Mȝw? X s,Wa(ȬNo 5ca(St>c2 A΂̰Sg 2POfV @ z`pG(f)FaZ&`™҉4'|*h"h(k/a PFZdD!zFnT"pY,#~ɯ4:]yIRR"& Vt! qBE]  { ھ^mhO.tEWt>.\ Mt#[T$hu#nYC>AL`H.4XQ:ŲلusM qE;w52%ͬ0o5:8n=m1-Dw{Wј#0Q|w̌ 2'6F c@Keku/||xup^m^:-1T0_asLq OpYwy VC14*'ƀ/M }ĹnNz[y( NJ ; ¾EPc g3u>F9,O~"bt(-$"FBLt{k[,4_ h O>zpg8IBC$1 ) NziglgEx}E,~=r?O"!ˆHW'3x" %([@EHqgz$Hx FP'aS%(Q2(:fQ&1ҠIQ12܌3PC,"WpL%NUm3J /+"RО ϊj}^1JPghU >&bgJDYcTFJJ)(2[UBѬ\0%8LS<:޵r>cPe2)/p2VbƷH {Vu8PPaPR)k5˜I$_@P gVSH@YI9 &VKyZ͍X0ΐEQTwJ7\ {N['ANMF IHCVP8L/IM(h#Iӽ!tkZX$y#"ENTpP57$Ij۶mi}>3ǘC^ѕݕql#ΰɤiL7b6q1?럻p~[ 25 A(8^<}Ƿ^=ձYڜ/T'n?FM't+ ٹڽ_ʶIi$wzwk[#nB֚O LSd_!=mwέKBgi[ >9I&kyOި:MaNp (#O\_b y|SmIoyɿ,0LCoEӓܓ-?.v֙"/TW?xܙ0fAR79d>:aEC"<'~ DY/7*lHNmЙ0L0tjbs!yf-LVq@Muj6Ė<2_jV7c? a,)QTt.- CcP,nsmXapi_,$'@x 8x8Iyأ<|4+W!0ڱ]#˛ 4j_b2P*KxIwGddjfXHȿq :P _ni""SV:im:v!D.jheiS橿uzfL$! es=WH&dK>iϩ~:hYkP+X_H)t(1 !hDroH j`O*1(VFi ]vO*E:*D59Q *ANMF ?7CVP8Lj/? M(h =!-t1G(4][R3sffxp9pCO%kϦed1ouz4mPvO&ܓZ6>a~- W Y%Z5ӏWc`*@ /jӹ_.vNrϓ}EkU*7>WݎCOb2 f?ޯU՘ QHBOUYjW*ZU"F:3KRf"d|zjU^NQ[[8tԪE32ZC X D]Ncbdhhٝrm*JQalInu:F53ANMF@ <7VP8L'/< M(hۆOOA kOM4b\["ɹE3bffkEh%/`ffVateFDՑm;$IGDٶg+k3gg9{e6ڥc IJE7K2cƴ EQT6jŒf4=$ m,4IYVؚAgU5%\8=8IzĹ|^zLqVQ]gO7B Bҋ;o_4Hf(z+|to#H6Vlŵ`Uxj4g-TR2?lɎy[0V n\OHڠVΙok.R࠿$o5un[4uoܰ8$4IBh@0r^Etmo?ZISnv-MGO&KNBԱ7(z[ߌVCH怤uK:6O!(~Ա?L+¤M5̐20vfaZeQf(PQ^SWGzKufqݐ,(RQ9;vp%6@jR" BR Ѫ5 B@_žYJ087E gRc&\AA* eshVP` ۮ"vYJ Aً]dwy&z"CԿ1(@D&Y5eBCO#d[o[5D6"P7̲! ! xw=Jŏ0DM*P~(J}˂c! $U4g*cB oB%*}N¯VNtBXi,ů0>1X"1V ߅05`ܢtB~A`UXQ5_>Ʋӄq_^UkSka SB+ apBh>xyW25UBY [I/{K'G 'h~=y=Nئ:0:u?3+N[O޹n*A0c2RfZ)lӾytw\<KpºHJu,>pe pI?NsŠUP8[՝btHR|W|OVQ A ǭn^+TF#$R񥦗:)AJ B gMYlZaNHV)UiM1mHhmUNZ:VJN\^0K[UuUnormal.lightz321.3.webpRIFFWEBPVP8X w_ANIMANMF,w_CVP8L/w !/E? ANMF k;CVP8L/k$G[Kv EM#I|tT?0p۶go}1Hs2O ]@"T[;`@FfGp/vHPPpAb(7U*$?ް;FNSa&U).zP-x羭R5tWl+ [us7m&9ln{0#6vwozmaП]Am:{ $1Uneb]ow $I`+n/i۴&{i/kr8* f7΂Z:vZ;O$%nnԤıi3]pÒ #0!M[J{!) &kqa-MMLf(,AKJOcCQGB ucm-13TjP MA57H/Rӆj? ANMF k;CVP8L/k($Ed`/`HZ^Ϟ1a6#_gI=:#V?G!Eb!"N_Fܱ(q̂ tlnn\B0@I_x %E]PA(ft Œ)SDujNI˯ZZy;`ɶmymd(ڶMs2O Et@FfQ6M\6o4d4]p^-q+:Iu:ev;ʺ~BNOzy!cqW@C+- "crTQiPPhm8xI#aJC6f`kgŰvL `զTKjPiCo n]4'w[yANMF k;CVP8L/kϡ$938 5$E} /;mHǟ18ڶ/{B433p΅{GoE8DTN88Kx$v7N"!/*x` `0dA G$Va Z%㔊s$I6sm>]>k;_D@6w* 8z*7=:: 6ł&s|߅mjÝ/DҜj?bemN6.O:A6 :#ʉ[-}7kwȓEb"߰9k8K0Hf"cVYߢퟕyB5?qcl}X< K6n`k`m1Vj8Xm ADF ~6TA4cޔ[aANMF k;CVP8L/k$)u"rF=o$sG9f]#Vqʉ wwPqӺ:0 ! R 0>10  # ~e~J R2LeB)?zJd:]}Yӿ/"m$?-cz-e].݉aܸ Wf|xnFd32vdETOϹd"!.P,JɛzEț>$*Jz1-ѕ},b {&"?a,D!{[;B!r+ނ_}yuVVHTf{k1vg&:VjnP-B_ 1on+ jŋ ANMF k;CVP8Lz/k$&Ͽmɽ80ǟSHi3@4_`Iq8*dp`}<Dž|e>.B\ p nOl0md(t L5#EY5@yS /1+\ lW$>w<ܹܶHۦ5S'n4QNě[rM-O~͊ S/hٿd`QɒZ5xy(XbKk,Z^u\}y`Kƻ;NvFJ !WfAehHmx 8a~guD"gƺ6 ژX `զTKjPiCzoEANMF k;CVP8L~/km;nm0I;[̨$G~ƅfI}9HA17PqB=X:*Ԑ*S6϶E8J") M @Qzx(H QX)rwn8r#Izgyoc"m$?-c A;bxӓ+VmWlvU;ȝ%u:YG~>u5M\24cmOs|I3Ҹl 2ɻL,e %fxV5 \5( šuK^C 1 5c,X֎;C5pTsjX"5mV "w_ n+ANMF k;CVP8L/k$I':|n`ж$w":+6ymdJ@#; ! .ꆌ bꇆY _1H-/l Gfm$W7s,{}p%Iik]<7fM迁mZ_=u7LAƲ ;qdTHpl#DK[16sᘄu!TMHOMJL3ԲӍhB(v$=06L; Z~^6 &- [2rBjnp4ucXkamL ZTjSP %b5RԴZ?",{UoecdANMF k;CVP8L/kϡ$ǗDCQ#IQ-?Fm$9: DntIZ`𕿥 d1̟sU+Q> >^Cb0ӂ ,Wdb1 F!Ԋ頠&'8!San6Xo{ú1ng&:VjnP-B_ \~bxXo+2.webpx RIFFp WEBPVP8X w_ANIMANMF,w_CVP8L/w !/E? ANMF k;CVP8L/kwq @ٶdQKU#{d=sׅ3lƑtvVO6mމ7d) :gdJb6yS&A;|HԕOW'/YVݲA]eҘ *ITB9.=a" w|. UAWclJ6y(i9Jk$ioE:Jx2d5c>t>LQheH,Ykl l 8llp]rpg oZT&:RN+Jen,1TsANMF: k;CVP8L"/kpܶ$1^뻈p IjsEa66]jhdmʞ*3 OfGXhJ=Z g.(W׳L 5>@\bF@0Vfڂp Dx"Nrk$Dl^ "o c&# 0hܘ|*t[5 3NJP6P.h[cVҪZ5fvne#ᴲTSi*Meڥ>:[aANMF< k;CVP8L#/kpܶ$1^뻈 Ii[S?Ʒm[h۶tAX.Vsއ_pPM*1'ksO 0w-qu#0XϭRȎ[=5B`o47ؙӡQupuS0<Ѱpz~13\ӴsLzӼ D$c&`}tX`&C NΈAS@GdCJh %ۀۮ : t>߀re6Z7pomkmvn5VH5Tj5TKL5V-5ToAVANMF, k;CVP8L/kpܶ$1]뻈ɶi[z ضo|kyh۶tAX'rQѣ["yz7vĘ~<%3`NWg$E];`W4+DY!ҨbWpF:bfд6`V=pN: 4:-b}TYpM]D P- x"o@k!`Pm t5xdѺ[}kXjcs ZGTZboiZ}"BANMF k;CVP8L/kpܶ$1]뻈pٶʺ2F~#Fn8nO/kp6#1ם+}pmV*<s[swwŝXqF4[D(`Dž73ŽTΡaL3p( 4%ЙK,jCRwn]IRbFI% Bh[|F`WG%)y$@hWt9Ag 8~XvAp+fq jDpʦu "돴wm-G u6:с)l^L  xav N"D4ad p948x+ @m Fk۷f,֚1[s ZGTZboiZ} "uANMF k;CVP8L|/kO Ij4~\ȶ?a萀$  sHۦkg-h61;Zn4N<ӌJ,_ ]+Bbѵa㘨le T`q0lX岄hk0q!Cdl>cc $dY.۶qAe,KB0}LjdYcB%$%!:*Bd `'!0@ P@D]1 `*"1 .m ni GEU1+pZ᪒^aANMFrK=CVP8LZ/K@5mj#q#a3MRE#FH$Ic&5| >/Ab$Aбb`E,R."qH@&\E9"K&@ 7d]$ ;j~J<#ZC낵dZp>][[\TO/[hyik|1 \yv@=A]lsե ,zuc|#Ȳ<{wdL2 ƫ[ҭ[7cdlct d"ڝ;WΥF0ƶ%O m "񮌳P-$m@0E@F Fd Tdm۶3@AF lc"PȔʑ(PAt A!v B( JH!CP8&$Q@! G$T"D@!@ D/ QăA"D@N@"$DW(@DJM@ EPD¬ "  @" B( p[B0J*]@! B  " .ANMFJ=CVP8L/J@5mj#BrI$Q;"3xFHp$I$=f+}"C0{hXDI"8ZmhI.%A"H0L* X@r $w! !\$ jK|%L"Y !AжvmN{8%tͶUH s;~8pmʀ`Gpm7su\1 ^'?O/]j41-w}_~t]o$#tG,rSu\W?]2@rC۲%JXmYpBql&xO#FG ciú$#ضE9ƸR%Bb'R1 lZi@ 9¢E 0E(@R< )APE(P  @f@*9M0 BI*D@;"H@D"J&!U@*!+D PO &,D BE) (H EB")l()P (1#"" s@%<@" A(0!RN (ㄈGg)ANMFG=CVP8Ly/G@ 0D?4 I$Q> tB{u= lM]3&`|}:Kp'O>ry]9\/p>1];I9>?1oq=p99o!z2!;#||lat={(H_. ̗?~:߽SAÏ# ]_|o!eǡ_q\|6Z/{^듽g\k5 ^sn.]/z,YGzl$\'#PnZd js CZSΞ@BIU1/֐ ɤ $A[ IrՐyd !fU*IX"N" 7fFxAv `@H$B@xd@\/alM{&+  H$ e!Ir0.$Idd~0 al3$ HH[<INANMFG=CVP8L/G@5mKD# I?S@IMVZF{e:k7h3IJ W=!,p@$1 1 v 2D. lLIR$TVM X$r @cĚ C@XHd"XDT@H&> *k`9 Nm ý豕syEh[~sz;c&<1~ F0=y|AC}⟇<|mdmm/}Kch&qeSzdg~#ۈ{1lG^y;d/џXLm"q_"ǁ q3t$1 mE8"kCv" .Z 2h6@!Gۄ`۶M W"DXmYI,B#&- 3'H6(@@, @ z@'TNS%Zv( D񚸂 DsE`WYPB(BQ .D(  Ca- B(kn@2 ( (@Q B(ܥ@"DpQ@+@E 7BQ95 %t(BANMFG<CVP8L/G 0D?0 $%ۿ6"%ٶijmk۪ν_6ZM].!{f L6c/\ uC '{<&q&Hp L"% Q&$$L.!@TIb-A0!@n:H [o$hv0YbCٸE+++ W]`z@Exs>I-u1W<؀,S7YO~m1^̿7Avu,Y0}#{3?ՠdYsrKo' \tmwqH%Ac\s W~櫓qXڄL d9X@Xƹ,˲ irqrm$$ ;9,'р9%",Kv`Dh$؜3(,!X&i3D Z5g @HPHA@ArTH!@@)0D@(AN @TM(gE(BD@*(D( &"((B("$ J@P@TBQ!(B(D" :@(@QY  ( UQ J!@aE@D"DQ@(Bh RH ANMFvG9CVP8L]/G@5mKD# F$}$I"In=yf!#܁$qsDPl:0]4j]cQ˄3љ@-aC PJSH O|5Cu[WZwuO4>d @W ۘ̉i< XӀlyˊZbVFGR)8٥R>l2z im`Ha˛Ď{_ ( 2o_10mN߳%HFHG6dXKHGR:L 5&]RO)))I "'xP~, H^0+$nWqPR*3Xe &(d ED?M0vS,_6~,DYzR{N`0%埏WG1+y0QΣ^bqzNs<*QN(yZۯh9Dњof1+#X<4w<ŒcS30$jqUW@2.ouB].8i##.J4jhQOΰppSANMFD7CVP8L/D pܶ$1ڮ`VmS[0 lO5'(AhXbAik?"[$$6RCEeD@lJj*[@Qa =fAyGe29GA|2ᔦ!)aް~b-7 K#l3XxWmSlq\8=]&Spؤmi-|{5.OQS*y pwz~-WOJY'*N K"pi 1(|X4V(}^ j{A Nz, M `lîg@O[ `i6eP  Ull6a@+ 2+m  0cja}=dr)X `PBꤴdj`nL6hjr#oZ6z,A䴊T2*P/@ Q Jy+'e)i1)ANMFF9CVP8L/F@1ibDm4YAKmӶڜ<6_g5g7\9 +l 4\c` p$1eHDA =$ *)3$$LJ SH#"h DLለ 827 ;u.n7k%x^^q'OaE`0؍H`2;:+zh&J7LH(]XLseSFWze`Y~ANMF ;2CVP8L/; u$YJ]_2'.le{ii^~m2h0z آ.inz9H!udp٬&wm zbr MSʡ7c_6GX ,FVȖ="0I'+WrGnSKr ^9d3%e fwuE0QN*ANMF :2CVP8L/: ۶$O{k3"V۶, 8akI:dw_q>u'I0&#YWhx fk.N-LbVt007 18!B:0|@}"‚ ؃e P03 E`T*5|ƑTza7seSFWze`YĴ#ANMF :2CVP8L/: 58nɑ&[<'p{CrxQ^@d >;eo;mä; f$O*nla?k,,! "A8If8 s)n;A`65\80_(B=> w%yyJKP$%%ÆUÎ͔:*k2-T JIRJ,6(ANMF 92CVP8L/9 58rF&z8KGRUvmfl>/`n7Y q! z SWΥcU;v}В]A;!D Ҁ[zJ@ {6i h7P+`ƀ !}J.DpK\'_F$T_cyANMF 92CVP8L/9 58n$I&yЊp ܝhinGr, -(hۆ.-yR~9MwPOA'c@ lP.J D tx/ pY;DHBf. HB\q|;P?O,%$lOhD;Wxq|jR&DJe&>oiل6U\hvv|#ANMF 72CVP8L/7 U8rFf>q3#V۶,?՚,@TDp%E%:7%S^!"gni&lGxE/{$|BCQ"AA@֨hWHzаx[V 穷 U IJ"I@Xrf828pܿ,AGbXz2կ^.ANMF 72CVP8L/7 58n$IcTڶe\"஑ m@vm(Ժ/Qx,.ϖ=`0S~F &5T%D6-`Lp *'87q 4_@k r\4!Cóh \"B}˗`Q39?Hb?mY5ANMF 72CVP8L/7 @$QW;ZTrT},؍pcjBl9 5\i m[oC :?(fje}3 f98 \kt3< B}Ʒ/y1hřUJG v=$YwȬzGb4= A~ܿKnr&D # V7R=t/7ANMF 72CVP8L/7 8rƑ9n0X ‰HC$^`GoOLV˫n;m&`gt3~ 4u, ?4kGO>Dz cH{@VvHorGn,U+P`v7w>%ݭ2W+b#f)h]Q37! {/󃘏'[1ɔ}ANMF 7/CVP8L/7 $IW2T tɥvmSН2u& ܒ5솠m$;7XݕqbD%"'rqf i'U=޳JW|z*gŭ5&n hq5vΠx My;HKnrN)#V=YݯANMF 7/CVP8L/7 8$Q:O"h DD8QwO#24twh" ͓1S#)6Ef␍^]uB.՚ZlUt@wK{\$:7ВE 5B ՃOzgױ?HbO~2ANMF 7/CVP8L/7 U8rFf_g1 nm[eh O0Z".ڶMSxt TFM'}PHblOANMF 7/VP8L/7 u8n$I:{$DfI>CPѻ kOйm$xt ioH>jIV YQjWt V Ej9ˁ52-yn/ޞyZxwnOj5.3.webpRIFFWEBPVP8X w_ANIMANMF,w_CVP8L/w !/E? ANMF : CVP8L/:@'m%1bD1Rw FC¿>9xF_s"m mGߋ?2W_rō`$2t#Ovm2J3^/wy8OꪘxiZ2zyEFr[ MIg]Xu _ZmDLvf>2kAge>γGPƚH_@zMcʞ逹d5~/t;.0lg_{6O"?СC kSLGRE4-Z=m%tc+e' ϫ@ }^B6/h|7.L6t}}rh{`Vxv^Q։eI]lꆷō,{Ly38)X6>:iE1{|{ZvZ2J[ANMF~< CVP8Lf/<@4m'gਇƨzgm爡'UjB`wI%Zp'Ͱm$E|l P.v]58x: WU/$ɏ.&Pw(h 08#0wN8>%o/y 6W.e3;ku78mt7o+˃sF%+B6+r lMz]׏OP% T| Ϝ[ny -ߩiLXâ6DNM74$ ;:>U#t) C/[nJ1mk&ANMFv9CVP8L^/9⪶mNrK $)g?7AH|w_y<zgI6*/fe J +`"AK(fb;Ucuk;&v GW7ܝ$ӹbxվ ZK*ீx߈#¯t>k_L{~Y.>qA42JیKR0m9V'7 DXfP(v/\$~%pكǩ~6UfXmCq;*%I,yեHf;sdqn7xmZEo^"2WPS"j JD΄BҤxsr|[ANMFj9 CVP8LQ/9@8$7 ,'5[l()5G$$I_"FO#f `@=4IiI4;Op9  4Y aIBrBWr@O*y/&iެ׭xJ9}LR6I(4F4;kyo S 8Yp?p | e 6X$`V8s"07tlfJZ˥TI4MfMWLVZTSiI" 3|W Q Qut޿?ANMFb7 CVP8LJ/7@ 6G'H舌m#G{Sү$EuϿ+e䶍$nF6Ԁts0C5+(NRn4q# DYY+ ,@CRlb| weg9y{oBF}ueF% sCIm< d>8߶`& xOAÇyT;'"{=5mCKfIRWyBCd!"[q̀|kK_w⎈z |]DiuŗJt+넷ANMFb7 CVP8LI/7@(d+ʙy*"?ߝx6F0g+r7" HRcLMNĩp=D+E@2`^T0 -Tӏ Exkb}c%Ĩ!aB}]ydo.߼Kz^H}|s{` D AL'I 7E J@c@/$;u6E}mϽ{ |FkfϨ,o}Kb o "*2 }ƇR\gm*O,\lsnG ANMFz7CVP8Lb/7&m'bbP% kmdJ2* ޿IrRwxc!*{FR4]̻fTP h?IS-$"&,BW?a)sb "`g7AE.N( Ui◯yp;7-P@f0iu,;ma]8$۴y& 32 6mf, n?lgr|G\gRYx:Fނ&*_v5xɵD# t.ÊFjh8tmnjANMFp7 CVP8LX/7@m%C*҂o F$)e~~gm$INcY/w ۶q?@3$ &Р HD!p9P#T|+ѷ8C[hpLG :YV/8R a2T8h xE!!وHg"{/V"6tkὛk]/L;-2,0#6}m}Fy"?`A'5=n%S .S0TM[@*A3Žke9?G. uhcc}(Y+ޯz#[,Xt_^ƷFge0ANMFn7CVP8LV/7*d'% sBg$N慯>),Ssm$IN&:pIjwC滞VMAl]`3"8# 7\˴)qBĕ&0kfKyj@ ECQa'ihG_;b`ݩ5ANMF|7CVP8Ld/7(&' U&`BLv`Iڃ8ߧpim$QZJ _~h`wt/?`@Q\7"iLrMD_0>'%S"NĚ(8(ui$HraU9RpJJ灰p&L^ P ouJw/^bC+zl$UAB$6= Me.ߴ18mt7||6oyO8L66; XuYȀۇs`vxNi*IN>h2ԁ.̝zi;7V@Dlg\+#6d[{l۶]vT;pw N 8m Ge)]G۶UʘksN QZ2K"wwwOඖiNۗ?VӼҌM< g[4 x.,] Rƶts/~7֥6 ?MW_&w!-axtzR]5S8 >0 b= #/`/Zpݗ_?%|U 3 ?;NC8.vYeɡª:PǏm|zx[z,p]yهCjPj0XʡK2C0@,0@d5 4 7=qu<͡ y_nHkrG[[E /㽇c $}ial0H'.i$D~Q%­c_jX0[F๑H\jHrPRDŕ9(CQө`h.I.G() pIs?mO$\T $T +*䒺e"HIB!IRT$SXd[Na,6H11X {Qx/gf 0[G+Wh(s@`D܅fFI.EϭTEp`^UO45.F!,}(?)5;~%/,zJѢZ s/KKU$@ ~ۀnsh8UB7Izm YOZ?`wLs(E̢̫t ,g$gsqځ;(N.XPK8`ٛ3 s=L+dBlʏwdWۼpR- Xc9q)<#!z&:N1Zaq/>tvHI?is@wJ۩qyzW$kw떸pd>_enr&ƖUN֡h&rfW(+ę`fPZw d,Lgd_\Dw> Δh7dwt%zB Lb@ݖ)ANMF kMCVP8L/k@M(l۶wO@W"N%$_e*~tPmWsHk% IX-vT&"GyןDO`i؇DFb`aά95vZ@ޗnWSqUH)>T]bgSkbT7EL(CNm_MmLlQ&P<=}zV vKqo8y-//nsJc˙Y~0S=`7o3ž6>X{2:Z&s#]9[dMa.돩h` lȾ7~RS?Id𱾯RU:8T+nw/^58i x33J gdup51_e wWr)*t."0+y> vN:{KXվ|'dYrEV@un{?˯Ū:]veNeER (%09[: tkx3xqq\x^qЛ/٩d .}C8zo8 HHPyꌌHP9OZ9u*w)T]PLvYz7E[1Mj==~CNt/:U[`7욕:lㄺCa7xz";O{l: )\& ڸqFcN\櫙nkIbs[7.(E@{5}*Γfc6M v-B ¢NhaE<ڙO„3Awڴr3ԺU:i^𕢬4Iz>;>: ӿ6/@ 9u_| ]o!%'KIv WEmm UjMBJf7m'Xj|ߧ'%O5bZEHBRvHV|W#X1``8I%ݰ 2Q I cDm(hrO|%b+9qQ-WLVZ@@QHH'm&*cZcXY5)bZhFv"@UJpT Nag|kmtiPh4ܼƘ&y1DeTb VڌvK+6W6z%;0`2'FT&maJ#ц 2X[erǵEeo!EPZ퀠CTb9h-Ѧ&8{wTj\3tE@ edA8$M#P(2V=1 Cmz?8bp%``mN2O—y{[@'( S*BZe-SlN[k۶8.fffo+Vk,Y)@]IVducO3;|@W:dm8Ȩ?@}q)WhMFr&y_J{M:q0vL_IcPЯOO>خ*k,]ƒgp[J,bq*z rTCs 㧺@QCS=}|q*RAA bҚ~q~b 0xp9}p\C} _+ x 0+3A&]P)5X%NGBbv潋'Yݣ:`Xf̹؏ >E{̯[d ډ?}/3XPQR _p-| 3.bSiVjjZiAsKߊw{yuZADw?u_!*w5ַe$ɮbHZKvw_/bO}T!"gGs-g1 D! /2P>{Qcc.beD]̪J]`XCY @>91HU.jz3"\^ uBj cA6# |դCT>H8I{c2(i:hPIe dIp7Tji6JA6EE%zRl^p֗)ØH/jPT)8"f&`)PcP@ XڨY+*Q*p}GnsOg ![b'SJ br~%ǝ@7LgPW/V*g7tvm7r{$t?9*0xw嫸;lm5n8\X-KJ"Ikp?~D^Zo _xVpi 8hHًݳ~P~P!C25xiwpil~4@vJPA,:w.OCI ib~v}`9` ߴw (o/F5'lCl2T[/zL6s;[X5`SBCpgFGq>WOgib&2;)T`r0mvq;3G+G*pxM!,-gR&$mƊaDB!d(6J(m >Y $\HHC"xV?%$4­pGMWĤ\j-N<8j)1!y&@Sy$>f,j\pic0M"fSpn @Z4RмQ X̉ҊI(Uhz.fc~Mȟ6ߣRb)EY..dgG v T̫ΪHANMFr kMCVP8LZ/k@)$GG{3\Z\=F)}Q#I> w 1mU <ݥH3'QrSCUVĩVĹT <.UU򕫈P5PY* "L9if4U¶jU\2tE\+P1Xexxl48w33Bb%+"TӬT眇32VXI@73ĺT_b*\T|*V*Vb _ŨpZT౩2z(W{5*UFfQT ?xbBfRg+kc`w?\ɇdbʟz }]V6>is~o9f6ٰM=LAx-GDJ< ff;S4Mua\ q{iӭ"=bxR K}hlƷ|Ò/ٹ-rcsl< |YmE1?v e13-yp5Z&@RAX3y ]u9t*tfhk$f >shZs뢃$,_A (M즸80ǎF2q4{uwa iH܉:L*ܙTF7Z;Dብr"3_묌Q¶k%ꙵmԼ{0k %)j "4 mб ';K#{+kٴ15jP=1? %3cF=^`+(,*.)}.у :WRTϷR |%(ѕ.Q=Ys8Rp ź":ZP i9tvjшx:'Gey*@-4\ QYRHXCT6B6b*Nd%Cm LaBFǒH!S`!sM1(S:-Ck\Nvʨah؁RBh 1d5Hp"ji1؈ANMF kMCVP8L/k@Gm$Arǟ00n6przcܶmȍ$EIU i.fɟb%]}**ږom6A{w'Pي*6mMEPW P|~T}[M Հ.llw⅀msw~ߝT?j{rn2dnUL*W5*Ot@U"Pབྷ@!I걍횽3j}m۶mݕȞ9ඍ$IJ:nڼFGfըI+4nAQ48nYlJ$6꩖QU`5 ^Kv+K6}; ҥS/x@7z&w_}HO}w˾!J(ɇ7RuǍI^t/zRw&sM%!{,X$J O犹%J; ui#a{|Njk4xdF\ɇ/[)z5@\56rZ /TFsjb0.y]9L 3%(A @cHgϜ $NH Zݩu(%[Ωf Z6JQ')@hDB-q,D)vmR@jt윟}^W(vHd#ñec,[ñ9IZ,)5CkSXovDD^ņe:7&Ǝ nY[ Zvog"d*$6Ɗ-.PkTA}pGڔnhbI$oLDMQ!-j :L#q܈6qQսO+3B`*O-{ѯ$?ULt%ǻFJfbLV k4`R@&Uuݢ"SNJo Z}~yqI(D4j`JypӅ+1d tw;PՍe5ӥ́ Mqa3Ļn=Ŷꙴ)-iq@-VBW$B6=P}3DYݥM ]|d.@lYZOr('(& P"o*ߦ޲p%*ŗ5dANMF kMCVP8L/k@g($Eհ><0n#Iq{ȸ$ŹjXx!I +A'P~$h ^k%%U`ddx$I"Ip|Y'^m6 зHf{dLRmxll$-8 qٶmmcA8Vo +k'cmC$m3s+qn4aMrW.O|5Ƃ_YiyADh^-#ݷۣئV7gv ̮߉!q|y ,De[郱r_!=_kxb*;_`Wo0HO~FRB-m}{I}?*$P~Е?Լ{v '5[M>|u5 ij.$=}ulfqP?J: 6.c0?GLH;TxN}Ku@ը&eYRy\eѪ^U ~*qya<۲FйOHB?=oŊOx/侂gr6W= pX.mr3YWE'6qΈMmWhFp [gO)3\$ S"f||;<ϵ!*Q~ o~ V`a(Hz+rn{6HҜ᫦m {"_^n/b8rYlY* 5OO KYH F]ہtCՁz3tۣCB4vpGI:$ܽƫʳƟޏ<:1.PXε,/ViCxBȶrY jGvT3]ؗZ ?۴"\BK98T9j[0A4;%z'FvMg3  Hqa$ 3 `<91r$A`.^ᘁjY}('{}'q28&b{E9 aO1_x+.xW-൭p7o-nVYjRANMFB kHCVP8L)/kG@Kb 4/1A h,%^bImmz5@y; T: DžI2Oꕅ Z+ ʢ7hiR,^^rE CoG$]v'ɈWV._Brzo޲% ؟Yv뻥 i~h=U@?dd7n݆L;7ӂzl27SǙY~TQ_SP6AKb@KCweA  uON!(ANMF kBCVP8L/k' HR| Au [N@Ph+I'  L;uwɯO6)E* kVBJbr$$\ %9&-=\$SvE.ǀp.J0$>Mo0AI 7>4[[0ў66VFkOCkXkn^.)u?w"+@ \Ύ,;*lJ$[aCg}Otj'.1"^.獋"\L&w\[0./kcQH2dBT ͡SeDçz:Gdtkdeclarative-5.7.12/src/icons/bloom/window_maximize.dci000066400000000000000000000011351476226662700235230ustar00rootroot00000000000000DCI50 normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light31.0.webp@RIFF8WEBPVP8L,/@%BQ$ ᰈt^<"?63JmB9 dtkdeclarative-5.7.12/src/icons/bloom/window_menu.dci000066400000000000000000000011651476226662700226470ustar00rootroot00000000000000DCI50%normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light31.0.webpXRIFFPWEBPVP8LC/@%Bʕ`#I!7XPX~zHrۜ24Ƕ]su"dtkdeclarative-5.7.12/src/icons/bloom/window_minimize.dci000066400000000000000000000011171476226662700235210ustar00rootroot00000000000000DCI50normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light3z1.0.webp2RIFF*WEBPVP8L/@%LB65dtkdeclarative-5.7.12/src/icons/bloom/window_quit_full.dci000066400000000000000000000012271476226662700237060ustar00rootroot00000000000000DCI50Gnormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light 31.0.webpzRIFFrWEBPVP8Lf/@%'F{ars_`V# Q&WDD'@t=Ectx@ѰG4hrꍢ "p5ɋ#-'dtkdeclarative-5.7.12/src/icons/bloom/window_restore.dci000066400000000000000000000012331476226662700233620ustar00rootroot00000000000000DCI50Knormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light31.0.webp~RIFFvWEBPVP8Lj/@%5m0;0D m#)ruG0jHC`?j۶a@ sN'ĒX-8@:$QR!1zο~dtkdeclarative-5.7.12/src/icons/bloom/window_sidebar.dci000066400000000000000000000013031476226662700233060ustar00rootroot00000000000000DCI50snormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light631.0.webpRIFFWEBPVP8L/@%g HRL.^ ZQmkKu  ̙рIpp{"m&ư! b؉%tƜN~IEpI)o'wɧO藔'8=X63dtkdeclarative-5.7.12/src/private/000077500000000000000000000000001476226662700170575ustar00rootroot00000000000000dtkdeclarative-5.7.12/src/private/dapploader_p.h000066400000000000000000000052501476226662700216640ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DAPPLOADER_P_H #define DAPPLOADER_P_H #include #include #include #include "dapploader.h" #include #include #include QT_BEGIN_NAMESPACE class QQmlApplicationEngine; class QQuickItem; class QQuickTransition; QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class DAppLoaderPrivate; class DWindowOverlayTransitionManager : public QQuickTransitionManager { public: DWindowOverlayTransitionManager(DAppLoaderPrivate *loader); bool transitionLoaded(); protected: virtual void finished() override; private: DAppLoaderPrivate *appLoader; }; class DQuickAppLoaderItem; class DQmlAppPreloadInterface; class DQmlAppMainWindowInterface; class DAppLoaderPrivate : public DTK_CORE_NAMESPACE::DObjectPrivate, public QQuickItemChangeListener { friend class DQmlComponentIncubator; public: DAppLoaderPrivate(DAppLoader *qq); void ensureLoadPreload(); void ensureLoadMain(); void destoryIncubator(QQmlIncubator *incubator); QQmlContext *creationContext(QQmlComponent *component, QObject *obj); bool createObjects(const char *propertyName); void createChildComponents(); void initRootItem(QQuickItem *item); void updateRootItemSize(QQuickItem *item); virtual void itemGeometryChanged(QQuickItem *, QQuickGeometryChange, const QRectF &) override; void findWindowContentItem(); void finishedLoaded(); void createOverlay(); void clearOverlay(); void _q_onPreloadCreated(QObject *obj, const QUrl &); void _q_onMainComponentStatusChanged(QQmlComponent::Status status); void _q_onComponentProgressChanged(); static QStringList buildinPluginPaths(); QString appid; QStringList pluginPaths; QQmlApplicationEngine *engine; QList incubators; DQuickAppLoaderItem *appRootItem; QQuickItem *loadingOverlay; QPointer windowContentItem; QQuickTransition *exitedTransition; QQuickWindow *appWindow; QQmlComponent *mainComponent; bool overlayUsingParentSize; bool duringTransition; DWindowOverlayTransitionManager transitionManager; QHash itemContextMap; QScopedPointer preloadInstance; QScopedPointer mainInstance; QScopedPointer app; private: template T *loadInstance() const; D_DECLARE_PUBLIC(DAppLoader) }; DQUICK_END_NAMESPACE #endif //DAPPLOADER_P_H dtkdeclarative-5.7.12/src/private/dbackdropnode.cpp000066400000000000000000001144551476226662700223740ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #define protected public #define private public #include #include #undef protected #undef private #include "dbackdropnode_p.h" #include "dqmlglobalobject_p.h" #include #include #include #include #include #include #include #include #include #include #include #ifndef QT_NO_OPENGL #include #include #include #include #endif #include DQUICK_BEGIN_NAMESPACE class Q_DECL_HIDDEN DataManagerBase : public QObject { public: mutable QAtomicInt ref; explicit DataManagerBase(QQuickWindow *owner) : QObject() { moveToThread(owner->thread()); setParent(owner); } }; template class Q_DECL_HIDDEN DataManagerPointer { static_assert(std::is_base_of::value); public: DataManagerPointer() noexcept = default; constexpr DataManagerPointer(std::nullptr_t) noexcept : DataManagerPointer{} {} inline DataManagerPointer(T *p) : pointer(p) { if (pointer) pointer->ref.ref(); } DataManagerPointer(DataManagerPointer &&other) noexcept : pointer(std::exchange(other.pointer, nullptr)) {} DataManagerPointer(const DataManagerPointer &other) noexcept : pointer(other.pointer) { ref(); } DataManagerPointer &operator=(const DataManagerPointer &other) noexcept { deref(); pointer = other.pointer; ref(); return *this; } DataManagerPointer &operator=(DataManagerPointer &&other) noexcept { pointer = std::exchange(other.pointer, nullptr); return *this; } ~DataManagerPointer() { deref(); } inline DataManagerPointer &operator=(T* p) { deref(); pointer = p; ref(); return *this; } T* data() const noexcept { return pointer; } T* get() const noexcept { return data(); } T* operator->() const noexcept { return data(); } T& operator*() const noexcept { return *data(); } operator T*() const noexcept { return data(); } bool isNull() const noexcept { return pointer.isNull(); } bool operator==(T *other) const noexcept { return pointer == other; } bool operator!=(T *other) const noexcept { return pointer != other; } private: void deref() { if (!pointer) return; pointer->ref.deref(); if (pointer->ref == 0) { pointer->DataManagerBase::deleteLater(); pointer.clear(); } } void ref() { if (pointer) pointer->ref.ref(); } QPointer pointer; }; template class Q_DECL_HIDDEN DataManager : public DataManagerBase { public: struct Data { int released = 0; DataType *data = nullptr; }; static DataManagerPointer get(QQuickWindow *owner) { return owner->findChild({}, Qt::FindDirectChildrenOnly); } static DataManagerPointer resolve(const DataManagerPointer &other, QQuickWindow *owner) { static_assert(&Derive::metaObject); Q_ASSERT(owner); if (other && other->owner() == owner) return other; { Derive *other = get(owner); if (!other) other = new Derive(owner); return other; } } inline QQuickWindow *owner() const { return static_cast(parent()); } std::weak_ptr resolve(std::weak_ptr data, DataKeys&&... keys) { struct TryClean { TryClean(DataManager *m) : manager(m) {} ~TryClean() { manager->tryClean(); } DataManager *manager; }; TryClean cleanJob(this); Q_UNUSED(cleanJob) { auto d = data.lock(); if (d && dataList.contains(d)) { if (get()->check(d->data, std::forward(keys)...)) { d->released = 0; return data; } release(data); } } for (auto data : std::as_const(dataList)) { if (get()->check(data->data, std::forward(keys)...)) { data->released = 0; return data; } } auto newData = std::shared_ptr(new Data()); if ((newData->data = get()->create(std::forward(keys)...))) { dataList.append(newData); return newData; } return {}; } inline void release(std::weak_ptr data) { auto d = data.lock(); if (!d) return; d->released++; } protected: struct CleanJob : public QRunnable { CleanJob(DataManager *manager) : manager(manager) {} void run() override { if (!manager) return; manager->cleanJob = nullptr; QList> tmp; std::swap(manager->dataList, tmp); manager->dataList.reserve(tmp.size()); for (const auto &data : std::as_const(tmp)) { if (data->released > 2) { manager->get()->destroy(data->data); } else { manager->dataList << data; if (data->released > 0) ++data->released; } } } QPointer manager; }; inline void tryClean() { if (Q_LIKELY(!cleanJob)) { cleanJob = new CleanJob(this); owner()->scheduleRenderJob(cleanJob, QQuickWindow::AfterRenderingStage); } } inline const Derive *get() const { return static_cast(this); } inline Derive *get() { return static_cast(this); } DataManager(QQuickWindow *owner) : DataManagerBase(owner) { Q_ASSERT(owner->findChildren(Qt::FindDirectChildrenOnly).size() == 0); } using QObject::deleteLater; ~DataManager() { for (auto data : std::as_const(dataList)) { Derive::destroy(data->data); } } QList> dataList; QRunnable *cleanJob = nullptr; }; class Q_DECL_HIDDEN RhiTextureManager : public DataManager { Q_OBJECT friend class DataManager; RhiTextureManager(QQuickWindow *owner) : DataManager(owner) { Q_ASSERT(owner->findChildren(Qt::FindDirectChildrenOnly).size() == 1); } static bool check(QRhiTexture *texture, QRhiTexture::Format format, const QSize &size) { return texture->format() == format && texture->pixelSize() == size; } QRhiTexture *create(QRhiTexture::Format format, const QSize &size) { auto texture = owner()->rhi()->newTexture(format, size, 1, QRhiTexture::RenderTarget); if (!texture->create()) { delete texture; return nullptr; } return texture; } static void destroy(QRhiTexture *texture) { texture->deleteLater(); } }; class Q_DECL_HIDDEN RhiManager : public DataManager { Q_OBJECT public: QRhi *rhi() const { return m_rhi->rhi; } QQuickGraphicsConfiguration graphicsConfiguration() const { return m_rhi->gc; } void sync(const QSize &pixelSize, QSGRootNode *rootNode, const QMatrix4x4 &matrix = {}, QSGRenderer *base = nullptr, const QVector2D &dpr = {}, bool flipY = false) { Q_ASSERT(!renderer->rootNode()); if (base) { renderer->setDevicePixelRatio(base->devicePixelRatio()); renderer->setDeviceRect(base->deviceRect()); renderer->setViewportRect(base->viewportRect()); #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) renderer->setProjectionMatrix(base->projectionMatrix(0)); renderer->setProjectionMatrixWithNativeNDC(base->projectionMatrixWithNativeNDC(0)); #else renderer->setProjectionMatrix(base->projectionMatrix()); renderer->setProjectionMatrixWithNativeNDC(base->projectionMatrixWithNativeNDC()); #endif } else { renderer->setDevicePixelRatio(1.0); renderer->setDeviceRect(QRect(QPoint(0, 0), pixelSize)); renderer->setViewportRect(pixelSize); Q_ASSERT(dpr.x() > 0 && dpr.y() > 0); QRectF rect(QPointF(0, 0), QSizeF(pixelSize.width() / dpr.x(), pixelSize.height() / dpr.y())); renderer->setProjectionMatrixToRect(rect, rhi()->isYUpInNDC() && !flipY ? QSGRenderer::MatrixTransformFlipY : QSGRenderer::MatrixTransformFlag {}, false); } if (Q_UNLIKELY(!matrix.isIdentity())) { #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) renderer->setProjectionMatrix(renderer->projectionMatrix(0) * matrix); renderer->setProjectionMatrixWithNativeNDC(renderer->projectionMatrixWithNativeNDC(0) * matrix); #else renderer->setProjectionMatrix(renderer->projectionMatrix() * matrix); renderer->setProjectionMatrixWithNativeNDC(renderer->projectionMatrixWithNativeNDC() * matrix); #endif } renderer->setRootNode(rootNode); } bool preprocess(QRhiRenderTarget *rt, qreal &oldDPR, QRhiCommandBuffer* &oldCB, QSurface *forceSurface = nullptr) { QRhiCommandBuffer *cb = nullptr; #ifndef QT_NO_OPENGL QSurface *fallbackSurface = nullptr; QRhiGles2 *gles2Rhi = nullptr; if (forceSurface) { Q_ASSERT(rhi()->backend() == QRhi::OpenGLES2); gles2Rhi = static_cast(rhi()->d); fallbackSurface = gles2Rhi->fallbackSurface; gles2Rhi->fallbackSurface = forceSurface; } #endif if (rhi()->beginOffscreenFrame(&cb) != QRhi::FrameOpSuccess) return false; Q_ASSERT(cb); #ifndef QT_NO_OPENGL if (forceSurface) { Q_ASSERT(gles2Rhi); gles2Rhi->fallbackSurface = fallbackSurface; } #endif renderer->setRenderTarget({ rt, rt->renderPassDescriptor(), cb }); auto dc = static_cast(context); oldDPR = dc->currentDevicePixelRatio(); oldCB = dc->currentFrameCommandBuffer(); context->prepareSync(renderer->devicePixelRatio(), cb, graphicsConfiguration()); renderer->m_is_rendering = true; renderer->preprocess(); return true; } bool render(qreal oldDPR, QRhiCommandBuffer* &oldCB) { Q_ASSERT(renderer->m_is_rendering); renderer->render(); renderer->m_is_rendering = false; renderer->m_changed_emitted = false; context->prepareSync(oldDPR, oldCB, graphicsConfiguration()); bool ok = rhi()->endOffscreenFrame() == QRhi::FrameOpSuccess; renderer->setRootNode(nullptr); return ok; } inline bool render(QRhiRenderTarget *rt, QSurface *forceSurface = nullptr) { qreal oldDPR; QRhiCommandBuffer *oldCB; if (!preprocess(rt, oldDPR, oldCB, forceSurface)) return false; return render(oldDPR, oldCB); } private: friend class DataManager; RhiManager(QQuickWindow *owner) : DataManager(owner) { Q_ASSERT(owner->findChildren(Qt::FindDirectChildrenOnly).size() == 1); auto oldGraphicsDevice = owner->graphicsDevice(); if (owner->rhi()->backend() == QRhi::OpenGLES2) { auto gln = static_cast(owner->rhi()->nativeHandles()); owner->setGraphicsDevice(QQuickGraphicsDevice::fromOpenGLContext(gln->context)); } auto rhi = QSGRhiSupport::instance()->createRhi(owner, owner); owner->setGraphicsDevice(oldGraphicsDevice); if (!rhi.rhi) return; Q_ASSERT(rhi.rhi->backend() == owner->rhi()->backend()); m_rhi.reset(new Rhi()); m_rhi->rhi = rhi.rhi; m_rhi->own = rhi.own; m_rhi->gc = owner->graphicsConfiguration(); context = QQuickWindowPrivate::get(owner)->context; renderer = context->createRenderer(QSGRendererInterface::RenderMode2DNoDepthBuffer); } ~RhiManager() { delete renderer; } static bool check() { Q_UNREACHABLE(); return true; } static void *create() { Q_UNREACHABLE(); return nullptr; } static void destroy(void*) { Q_UNREACHABLE(); } struct Rhi { QRhi *rhi; bool own; QQuickGraphicsConfiguration gc; static inline void cleanup(Rhi *pointer) { if (!pointer || !pointer->own) return; auto rhiSupport = QSGRhiSupport::instance(); if (rhiSupport) rhiSupport->destroyRhi(pointer->rhi, pointer->gc); else delete pointer->rhi; } }; QSGRenderContext *context; QSGRenderer *renderer; QScopedPointer m_rhi; }; #ifndef QT_NO_OPENGL class Q_DECL_HIDDEN GLFramebufferManager : public DataManager { Q_OBJECT public: QRhiTexture::Format format() const { // TODO: get format from window return QRhiTexture::RGBA8; } static void blit(const QSize sourcePixelSize, QRhiTexture *dst, const QRect &sr, const QRect &dr) { auto f = QOpenGLContext::currentContext()->extraFunctions(); Q_ASSERT(f); GLuint oldFBO; f->glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*)&oldFBO); GLuint tmpFBO; f->glGenFramebuffers(1, &tmpFBO); f->glBindFramebuffer(GL_FRAMEBUFFER, tmpFBO); f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dst->nativeTexture().object, 0); f->glBindFramebuffer(GL_READ_FRAMEBUFFER, oldFBO); f->glBlitFramebuffer(sr.x(), sourcePixelSize.height() - sr.y(), sr.right() + 1, sourcePixelSize.height() - sr.bottom() - 1, dr.x(), dr.y(), dr.right() + 1, dr.bottom() + 1, GL_COLOR_BUFFER_BIT, GL_NEAREST); f->glBindFramebuffer(GL_FRAMEBUFFER, oldFBO); f->glDeleteFramebuffers(1, &tmpFBO); } void updateTexture(const QRect ®ion) { Q_ASSERT(m_texture); auto f = QOpenGLContext::currentContext()->extraFunctions(); f->glBindFramebuffer(GL_FRAMEBUFFER, QOpenGLContext::currentContext()->defaultFramebufferObject()); blit(m_texture->pixelSize(), m_texture, region, region); } QRhiTexture *ensureTexture(const QSize &size) { if (m_texture) m_texture->deleteLater(); m_texture = owner()->rhi()->newTexture(format(), size, 1, QRhiTexture::RenderTarget); if (!m_texture->create()) { delete m_texture; m_texture = nullptr; } return m_texture; } QGles2TextureRenderTarget *ensureProxy(QRhi *rhi, const QSize &pixelSize) { const GLuint fbo = QOpenGLContext::currentContext()->defaultFramebufferObject(); if (!m_rtProxy) { QRhiTextureRenderTargetDescription rtDesc; const auto flags = QRhiTextureRenderTarget::PreserveColorContents; m_rtProxy = static_cast(rhi->newTextureRenderTarget(rtDesc, flags)); m_rtProxy->framebuffer = fbo; } Q_ASSERT(m_rtProxy->framebuffer == fbo); m_rtProxy->d.pixelSize = pixelSize; return m_rtProxy; } void destroy() { if (m_rtProxy) { m_rtProxy->deleteLater(); m_rtProxy = nullptr; } if (m_texture) { m_texture->deleteLater(); m_texture = nullptr; } } private: friend class DataManager; GLFramebufferManager(QQuickWindow *owner) : DataManager(owner) { Q_ASSERT(owner->findChildren(Qt::FindDirectChildrenOnly).size() == 1); } ~GLFramebufferManager() { Q_ASSERT(!m_texture); Q_ASSERT(!m_rtProxy); } static bool check() { Q_UNREACHABLE(); return true; } static void *create() { Q_UNREACHABLE(); return nullptr; } static void destroy(void*) { Q_UNREACHABLE(); } QRhiTexture *m_texture = nullptr; QGles2TextureRenderTarget *m_rtProxy = nullptr; }; #endif static QSizeF mapSize(const QRectF &source, const QMatrix4x4 &matrix) { auto topLeft = matrix.map(source.topLeft()); auto bottomLeft = matrix.map(source.bottomLeft()); auto topRight = matrix.map(source.topRight()); auto bottomRight = matrix.map(source.bottomRight()); const qreal width1 = std::sqrt(std::pow(topRight.x() - topLeft.x(), 2) + std::pow(topRight.y() - topLeft.y(), 2)); const qreal width2 = std::sqrt(std::pow(bottomRight.x() - bottomLeft.x(), 2) + std::pow(bottomRight.y() - bottomLeft.y(), 2)); const qreal height1 = std::sqrt(std::pow(bottomLeft.x() - topLeft.x(), 2) + std::pow(bottomLeft.y() - topLeft.y(), 2)); const qreal height2 = std::sqrt(std::pow(bottomRight.x() - topRight.x(), 2) + std::pow(bottomRight.y() - topRight.y(), 2)); QSizeF size; size.setWidth(std::max(width1, width2)); size.setHeight(std::max(height1, height2)); return size; } inline static void restoreChildNodesTo(QSGNode *node, QSGNode *realParent) { Q_ASSERT(realParent->firstChild() == node->firstChild()); Q_ASSERT(realParent->lastChild() == node->lastChild()); DQMLGlobalObject::QSGNode_subtreeRenderableCount(node) = 0; DQMLGlobalObject::QSGNode_firstChild(node) = nullptr; DQMLGlobalObject::QSGNode_lastChild(node) = nullptr; node = realParent->firstChild(); do { DQMLGlobalObject::QSGNode_parent(node) = realParent; node = node->nextSibling(); } while (node); } inline static void overrideChildNodesTo(QSGNode *node, QSGNode *newParent) { Q_ASSERT(newParent->childCount() == 0); Q_ASSERT(node->firstChild()); DQMLGlobalObject::QSGNode_subtreeRenderableCount(newParent) = 0; DQMLGlobalObject::QSGNode_firstChild(newParent) = node->firstChild(); DQMLGlobalObject::QSGNode_lastChild(newParent) = node->lastChild(); node = newParent->firstChild(); do { DQMLGlobalObject::QSGNode_parent(node) = newParent; node->markDirty(QSGNode::DirtyNodeAdded); node = node->nextSibling(); } while (node); } class Q_DECL_HIDDEN RhiNode : public DBackdropNode { public: RhiNode(QQuickItem *item) : DBackdropNode(item, new Texture) { } ~RhiNode() { destroy(); } StateFlags changedStates() const override { if (Q_UNLIKELY(renderData && !contentNode)) return (RenderTargetState | ViewportState); return {0}; } RenderingFlags flags() const override { if (Q_UNLIKELY(!contentNode)) return BoundedRectRendering | DepthAwareRendering; return DepthAwareRendering; } void releaseResources() override { destroy(); } void render(const RenderState *state) override { Q_UNUSED(state) // begin pre init for render contentNode = nullptr; if (Q_UNLIKELY(!m_item || !m_item->window())) { reset(); return; } auto window = renderWindow(); // TODO: Apple viewport to matrix, needs get QSGRenderer const auto renderMatrix = *this->matrix(); const bool hasRotation = renderMatrix.flags().testAnyFlags(QMatrix4x4::Rotation2D | QMatrix4x4::Rotation); QRhiTexture *ct = nullptr; auto rt = renderTarget(); const bool isTextureRenderTarget = rt->resourceType() == QRhiResource::TextureRenderTarget; if (isTextureRenderTarget) { auto rhiRT = static_cast(rt); auto rtDesc = rhiRT->description(); if (rtDesc.colorAttachmentCount() >= 1) ct = rtDesc.colorAttachmentAt(0)->texture(); if (!ct) { reset(); return; } Q_ASSERT(ct->rhi() == window->rhi()); } #ifndef QT_NO_OPENGL else if (rt->resourceType() == QRhiResource::SwapChainRenderTarget && rt->rhi()->backend() == QRhi::OpenGLES2) { glfbManager = glfbManager->resolve(glfbManager, window); if (hasRotation) ct = glfbManager->ensureTexture(rt->pixelSize()); } else { reset(); return; } #endif Q_ASSERT(ct || glfbManager); const float devicePixelRatio = effectiveDevicePixelRatio(); const auto oldManager = manager; manager = RhiTextureManager::resolve(manager, window); if (oldManager != manager) { sgTexture()->setTexture(nullptr); if (oldManager) oldManager->release(texture); texture.reset(); } rhi = rhi->resolve(rhi, window); Q_ASSERT(rhi); QSize itemPixelSize; if (hasRotation) { const QSizeF size = mapSize(m_rect, renderMatrix) * devicePixelRatio; if (size.isEmpty()) { reset(); return; } itemPixelSize = size.toSize(); if (!renderData) { renderData.reset(new RenderData); renderData->imageNode = window->createImageNode(); renderData->imageNode->setFlag(QSGNode::OwnedByParent); renderData->imageNode->setOwnsTexture(false); renderData->texture.setOwnsTexture(false); renderData->imageNode->setTexture(&renderData->texture); renderData->rootNode.appendChildNode(renderData->imageNode); } } else { renderData.reset(); QSizeF size = renderMatrix.mapRect(m_rect).size() * devicePixelRatio; if (!size.isValid()) { reset(); return; } itemPixelSize = size.toSize(); } texture = manager->resolve(texture, ct ? ct->format() : glfbManager->format(), itemPixelSize); if (Q_UNLIKELY(texture.expired())) { reset(); return; } auto texture = this->texture.lock(); Q_ASSERT(texture->data); if (renderData) { if (!renderData->rt || sgTexture()->rhiTexture() != texture->data) { QRhiTextureRenderTargetDescription rtDesc(texture->data); const auto flags = QRhiTextureRenderTarget::PreserveColorContents; auto newRT = rhi->rhi()->newTextureRenderTarget(rtDesc, flags); newRT->setRenderPassDescriptor(newRT->newCompatibleRenderPassDescriptor()); if (!newRT->create()) { delete newRT; return; } renderData->rt.reset(newRT); } } if (m_content) { auto rootNode = DQMLGlobalObject::getRootNode(m_content); if (rootNode && rootNode->firstChild()) { contentNode = rootNode; } } // end pre init for render if (Q_UNLIKELY(!texture)) return; if (renderData) { #ifndef QT_NO_OPENGL if (glfbManager) { QRectF region = renderMatrix.mapRect(m_rect); region.moveTopLeft(region.topLeft() * devicePixelRatio); region.setSize(region.size() * devicePixelRatio); glfbManager->updateTexture(region.toRect()); } #endif renderData->texture.setTexture(ct); renderData->texture.setTextureSize(ct->pixelSize()); const QPointF sourcePos = renderMatrix.map(m_rect.topLeft()); renderData->imageNode->setRect(QRectF(-(devicePixelRatio - 1) * sourcePos, ct->pixelSize())); rhi->sync(texture->data->pixelSize(), &renderData->rootNode, renderMatrix.inverted(), nullptr, {texture->data->pixelSize().width() / float(m_rect.width() * devicePixelRatio), texture->data->pixelSize().height() / float(m_rect.height() * devicePixelRatio)}); rhi->render(renderData->rt.get()); } else { auto rhi = this->rhi->rhi(); QPointF sourcePos = renderMatrix.map(m_rect.topLeft()) * devicePixelRatio; if (ct) { auto rhi = this->rhi->rhi(); auto rub = rhi->nextResourceUpdateBatch(); QRhiTextureCopyDescription desc; desc.setPixelSize(texture->data->pixelSize()); desc.setSourceTopLeft(sourcePos.toPoint()); rub->copyTexture(texture->data, ct, desc); QRhiCommandBuffer *cb = nullptr; if (rhi->beginOffscreenFrame(&cb) != QRhi::FrameOpSuccess) return; Q_ASSERT(cb); // TODO: needs vkCmdPipelineBarrier? cb->resourceUpdate(rub); rhi->endOffscreenFrame(); } else { #ifndef QT_NO_OPENGL GLFramebufferManager::blit(renderTarget()->pixelSize(), texture->data, QRect(sourcePos.toPoint(), texture->data->pixelSize()), QRect(QPoint(0, 0), texture->data->pixelSize())); #else Q_UNREACHABLE(); #endif } } if (sgTexture()->rhiTexture() != texture->data) sgTexture()->setTexture(texture->data); doNotifyTextureChanged(); if (contentNode) { QRhiTextureRenderTarget *textureRT = nullptr; if (isTextureRenderTarget) { textureRT = static_cast(renderTarget()); } #ifndef QT_NO_OPENGL else if (renderTarget()->rhi()->backend() == QRhi::OpenGLES2) { auto rt = glfbManager->ensureProxy(renderTarget()->rhi(), renderTarget()->pixelSize()); textureRT = rt; Q_ASSERT(textureRT); textureRT->setRenderPassDescriptor(renderTarget()->renderPassDescriptor()); } #endif else { Q_UNREACHABLE(); } auto saveFlags = textureRT->flags(); textureRT->setFlags(QRhiTextureRenderTarget::PreserveColorContents); if (!node) node.reset(new Node); node->opacityNode.setOpacity(inheritedOpacity()); node->transformNode.setMatrix(*this->matrix()); QSGNode *childContainer = &node->opacityNode; if (clipList()) { if (!node->clipNode) { node->clipNode = new QQuickDefaultClipNode(QRectF(0, 0, 65535, 65535)); node->clipNode->setFlag(QSGNode::OwnedByParent, false); node->clipNode->setClipRect(node->clipNode->rect()); node->clipNode->update(); node->rootNode.reparentChildNodesTo(node->clipNode); node->rootNode.appendChildNode(node->clipNode); } } else { if (node->clipNode) node->clipNode->reparentChildNodesTo(&node->rootNode); delete node->clipNode; node->clipNode = nullptr; } overrideChildNodesTo(contentNode, childContainer); rhi->sync(textureRT->pixelSize(), &node->rootNode, {}, nullptr, {devicePixelRatio, devicePixelRatio}, !isTextureRenderTarget); qreal oldDPR; QRhiCommandBuffer *oldCB; if (rhi->preprocess(textureRT, oldDPR, oldCB, renderWindow())) { if (node->clipNode) { if (!node->clipNode->clipList()) { node->clipNode->setRendererClipList(clipList()); } else { auto lastClipNode = node->clipNode->clipList(); while (auto cliplist = lastClipNode->clipList()) lastClipNode = cliplist; Q_ASSERT(lastClipNode->clipList()); const_cast(lastClipNode)->setRendererClipList(clipList()); } } rhi->render(oldDPR, oldCB); } restoreChildNodesTo(childContainer, contentNode); textureRT->setFlags(saveFlags); } } private: void reset(bool notifyTexture = true) { if (renderData) renderData->rt.reset(); if (!sgTexture()->rhiTexture() && notifyTexture) doNotifyTextureChanged(); sgTexture()->setTexture(nullptr); if (!texture.expired() && manager) manager->release(texture.lock()); texture.reset(); #ifndef QT_NO_OPENGL if (glfbManager) glfbManager->destroy(); #endif } void destroy() { reset(false); renderData.reset(); node.reset(); manager = nullptr; texture.reset(); #ifndef QT_NO_OPENGL glfbManager = nullptr; #endif } DataManagerPointer manager; std::weak_ptr texture; DataManagerPointer rhi; #ifndef QT_NO_OPENGL DataManagerPointer glfbManager; #endif struct Node { Node() { transformNode.setFlag(QSGNode::OwnedByParent, false); opacityNode.setFlag(QSGNode::OwnedByParent, false); rootNode.setFlag(QSGNode::OwnedByParent, false); transformNode.appendChildNode(&opacityNode); rootNode.appendChildNode(&transformNode); } QSGRootNode rootNode; QSGTransformNode transformNode; QSGOpacityNode opacityNode; QQuickDefaultClipNode *clipNode = nullptr; }; std::unique_ptr node; QSGRootNode *contentNode = nullptr; struct RenderData { struct QRhiTextureRenderTargetDeleter { inline void operator()(QRhiTextureRenderTarget *pointer) const { if (pointer) { delete pointer->renderPassDescriptor(); pointer->setRenderPassDescriptor(nullptr); pointer->deleteLater(); } } }; std::unique_ptr rt; QSGRootNode rootNode; QSGImageNode *imageNode; QSGPlainTexture texture; }; std::unique_ptr renderData; struct Texture : public QSGDynamicTexture { void setTexture(QRhiTexture *texture) { if (texture) m_textureSize = texture->pixelSize(); m_texture = texture; } bool updateTexture() override { return true; } qint64 comparisonKey() const override { if (m_texture) return qint64(m_texture); return qint64(this); } QRhiTexture *rhiTexture() const override { return m_texture; } QSize textureSize() const override { return m_textureSize; } bool hasAlphaChannel() const override { return true; } bool hasMipmaps() const override { return mipmapFiltering() != QSGTexture::None; } QRhiTexture *m_texture = nullptr; QSize m_textureSize; }; inline Texture *sgTexture() const { return static_cast(m_texture.get()); } }; QSGTexture *DBackdropNode::texture() const { return m_texture.data(); } DBackdropNode *DBackdropNode::createRhiNode(QQuickItem *item) { auto node = new RhiNode(item); return node; } class Q_DECL_HIDDEN QImageManager : public DataManager { Q_OBJECT friend class DataManager; QImageManager(QQuickWindow *owner) : DataManager(owner) { Q_ASSERT(owner->findChildren(Qt::FindDirectChildrenOnly).size() == 1); } static bool check(QImage *image, QImage::Format format, const QSize &size) { return image->format() == format && image->size() == size; } QImage *create(QImage::Format format, const QSize &size) { return new QImage(size, format); } static void destroy(QImage *image) { delete image; } }; class Q_DECL_HIDDEN SoftwareNode : public DBackdropNode { public: SoftwareNode(QQuickItem *item) : DBackdropNode(item, new QSGPlainTexture) { texture()->setOwnsTexture(false); // Ensuse always render on software renderer texture()->setHasAlphaChannel(true); } ~SoftwareNode() { destroy(); } void releaseResources() override { destroy(); } QImage toImage() const override { return image.expired() ? QImage() : *image.lock()->data; } void render(const RenderState *state) override { Q_UNUSED(state) auto window = renderWindow(); if (!window) return; QSGRendererInterface *rif = window->rendererInterface(); QPainter *p = static_cast(rif->getResource(window, QSGRendererInterface::PainterResource)); Q_ASSERT(p); const auto matrix = *this->matrix(); const auto oldManager = manager; manager = QImageManager::resolve(manager, window); if (oldManager != manager) { texture()->setTexture(nullptr); if (oldManager) oldManager->release(image); image.reset(); } const bool hasRotation = matrix.flags().testAnyFlags(QMatrix4x4::Rotation2D | QMatrix4x4::Rotation); QSizeF size; if (hasRotation) { size = mapSize(m_rect, matrix); } else { size = matrix.mapRect(m_rect).size(); } if (size.isEmpty()) { reset(); return; } const qreal dpr = effectiveDevicePixelRatio(); size *= dpr; const QSize pixelSize = size.toSize(); const auto device = p->device(); QImage sourceImage; QPixmap sourcePixmap; if (device->devType() == QInternal::Image) { sourceImage = *static_cast(device); } else if (device->devType() == QInternal::Pixmap) { sourcePixmap = *static_cast(device); } else { return; } if (Q_UNLIKELY(sourceImage.isNull())) { image = manager->resolve(image, QImage::Format_RGB30, pixelSize); } else { image = manager->resolve(image, sourceImage.format(), pixelSize); } auto image = this->image.lock(); painter.begin(image->data); painter.setRenderHint(QPainter::SmoothPixmapTransform); painter.setCompositionMode(QPainter::CompositionMode_Source); auto transform = matrix.toTransform().inverted(); QTransform resetPos; resetPos.translate((dpr - 1) * transform.dx(), (dpr - 1) * transform.dy()); painter.setTransform(transform * resetPos); // TODO: copy damage area from the previous frame if (Q_UNLIKELY(sourceImage.isNull())) { painter.drawPixmap(sourcePixmap.rect(), sourcePixmap, sourcePixmap.rect()); } else { painter.drawImage(sourceImage.rect(), sourceImage, sourceImage.rect()); } painter.end(); texture()->setImage(*image->data); // Ensuse always render on software renderer texture()->setHasAlphaChannel(true); doNotifyTextureChanged(); } private: inline QSGPlainTexture *texture() const { return static_cast(m_texture.get()); } void reset(bool notifyTexture = true) { if (!texture()->image().isNull() && notifyTexture) doNotifyTextureChanged(); texture()->setTexture(nullptr); if (manager) manager->release(image); image.reset(); } void destroy() { reset(false); manager = nullptr; } friend class DBackdropNode; DataManagerPointer manager; std::weak_ptr image; QPainter painter; }; DBackdropNode *DBackdropNode::createSoftwareNode(QQuickItem *item) { auto node = new SoftwareNode(item); return node; } QRectF DBackdropNode::rect() const { return QRectF(0, 0, m_item->width(), m_item->height()); } DBackdropNode::RenderingFlags DBackdropNode::flags() const { return BoundedRectRendering; } void DBackdropNode::resize(const QSizeF &size) { if (m_size == size) return; m_size = size; m_rect = QRectF(QPointF(0, 0), m_size); } void DBackdropNode::setContentItem(QQuickItem *item) { if (m_content == item) return; m_content = item; markDirty(DirtyMaterial); } void DBackdropNode::setTextureChangedCallback(TextureChangedNotifer callback, void *data) { m_renderCallback = callback; m_callbackData = data; } QQuickWindow *DBackdropNode::renderWindow() const { return m_item ? m_item->window() : nullptr; } qreal DBackdropNode::effectiveDevicePixelRatio() const { auto window = renderWindow(); return window ? window->effectiveDevicePixelRatio() : 1.0; } DBackdropNode::DBackdropNode(QQuickItem *item, QSGTexture *texture) : m_item(item) , m_texture(texture) { } DQUICK_END_NAMESPACE #include "dbackdropnode.moc" dtkdeclarative-5.7.12/src/private/dbackdropnode_p.h000066400000000000000000000030231476226662700223440ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include #include QT_BEGIN_NAMESPACE class QQuickItem; class QSGTexture; QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class DBackdropNode : public QSGRenderNode { public: inline QSizeF size() const { return m_size; } QSGTexture *texture() const; static DBackdropNode *createRhiNode(QQuickItem *item); static DBackdropNode *createSoftwareNode(QQuickItem *item); QRectF rect() const override; RenderingFlags flags() const override; void resize(const QSizeF &size); void setContentItem(QQuickItem *item); typedef void(*TextureChangedNotifer)(DBackdropNode *node, void *data); void setTextureChangedCallback(TextureChangedNotifer callback, void *data); inline void doNotifyTextureChanged() { if (!m_renderCallback || !m_item) return; m_renderCallback(this, m_callbackData); } virtual QImage toImage() const { return QImage(); } QQuickWindow *renderWindow() const; qreal effectiveDevicePixelRatio() const; protected: DBackdropNode(QQuickItem *item, QSGTexture *texture); QPointer m_item; QPointer m_content; QSizeF m_size; QRectF m_rect; QScopedPointer m_texture; TextureChangedNotifer m_renderCallback = nullptr; void *m_callbackData = nullptr; }; DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dblitframebuffernode.cpp000066400000000000000000000252601476226662700237410ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dblitframebuffernode_p.h" #include #ifndef QT_NO_OPENGL #include #include #include #include #endif #include #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) #include #else #include #endif #include #include DQUICK_BEGIN_NAMESPACE class Q_DECL_HIDDEN ProxyAtlasTexture : public QSGPlainTexture { public: bool isAtlasTexture() const override { return !subRect.isEmpty(); } QRectF normalizedTextureSubRect() const override { if (subRect.isEmpty()) return QSGPlainTexture::normalizedTextureSubRect(); return subRect; } QRectF subRect; }; #ifndef QT_NO_OPENGL class Q_DECL_HIDDEN CachedFBO : public QSharedData, public QOpenGLFramebufferObject { public: typedef QPair CacheData; CachedFBO(const QSize &size) : QOpenGLFramebufferObject(size) {} ~CachedFBO() { globalFBOList.removeOne(CacheData(size(), this)); } static QExplicitlySharedDataPointer getFBO(const QSize &size, bool allowedGreaterSize) { auto fboIndex = std::lower_bound(globalFBOList.cbegin(), globalFBOList.cend(), CacheData(size, nullptr), [] (const CacheData &fbo1, const CacheData &fbo2) { const QSize &s1 = fbo1.first; const QSize &s2 = fbo2.first; return s1.width() < s2.width() || s1.height() < s2.height(); }); if (fboIndex != globalFBOList.cend() && !allowedGreaterSize && (*fboIndex).first != size) { fboIndex = globalFBOList.cend(); } CachedFBO *fbo = nullptr; if (fboIndex == globalFBOList.cend()) { fbo = new CachedFBO(size); globalFBOList.append(CacheData(size, fbo)); } else { fbo = (*fboIndex).second; } return QExplicitlySharedDataPointer(fbo); } private: // order is from small to large by the texture size static thread_local QList globalFBOList; }; thread_local QList CachedFBO::globalFBOList; typedef QExplicitlySharedDataPointer SharedCachedFBO; class Q_DECL_HIDDEN GLRenderNode : public DBlitFramebufferNode { public: GLRenderNode(QQuickItem *item) : DBlitFramebufferNode(item) { } QImage toImage() const override { return fbo ? fbo->toImage() : QImage(); } void render(const RenderState *state) override { Q_UNUSED(state) if (!QOpenGLFramebufferObject::hasOpenGLFramebufferBlit()) return; if (Q_UNLIKELY(!m_item)) return; const qreal scale = m_item->window() ? m_item->window()->effectiveDevicePixelRatio() : 1; QRectF sourceRect = matrix()->mapRect(m_rect); if (!sourceRect.isValid()) return; sourceRect.moveTopLeft(sourceRect.topLeft() * scale); sourceRect.setSize(sourceRect.size() * scale); const QSize textureSize = sourceRect.size().toSize(); if (Q_UNLIKELY(!fbo || (!useAtlasTexture && fbo->size() != textureSize) || (useAtlasTexture && (fbo->width() < textureSize.width() || fbo->height() < textureSize.height())))) { fbo = shareBuffer ? CachedFBO::getFBO(textureSize, useAtlasTexture) : SharedCachedFBO(new CachedFBO(textureSize)); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) m_texture->setTextureId(fbo->texture()); // binding buffer's texture for proxyTexture. #elif QT_VERSION <= QT_VERSION_CHECK(6, 2, 4) auto wp = QQuickWindowPrivate::get(m_item->window()); m_texture->setTextureFromNativeTexture(wp->rhi, static_cast(fbo->texture()), 0, fbo->size(), {}, {}); #else auto wp = QQuickWindowPrivate::get(m_item->window()); m_texture->setTextureFromNativeTexture(wp->rhi, static_cast(fbo->texture()), 0, 0, fbo->size(), {}, {}); #endif m_texture->setHasAlphaChannel(true); m_texture->setTextureSize(fbo->size()); } if (useAtlasTexture) { m_texture->subRect.setSize(QSizeF(sourceRect.width() / fbo->width(), sourceRect.height() / fbo->height())); } const QSizeF ss = QOpenGLContext::currentContext()->surface()->size() * scale; const QRectF transfromSR(sourceRect.x(), ss.height() - sourceRect.y(), sourceRect.width(), -sourceRect.height()); QOpenGLFramebufferObject::blitFramebuffer(fbo.data(), QRect(QPoint(0, 0), textureSize), nullptr, transfromSR.toRect()); doRenderCallback(); } private: SharedCachedFBO fbo; }; QSGTexture *DBlitFramebufferNode::texture() const { return m_texture.data(); } DBlitFramebufferNode *DBlitFramebufferNode::createOpenGLNode(QQuickItem *item, bool shareBuffer, bool useAtlasTexture) { auto node = new GLRenderNode(item); node->shareBuffer = shareBuffer; node->useAtlasTexture = useAtlasTexture; return node; } #endif class Q_DECL_HIDDEN CachedQImage : public QSharedData, public QImage { public: typedef QPair CacheData; CachedQImage(const QSize &size) : QImage(size, QImage::Format_ARGB32_Premultiplied) {} ~CachedQImage() { globalImageList.removeOne(CacheData(size(), this)); } static QExplicitlySharedDataPointer getImage(const QSize &size, bool allowedGreaterSize) { auto fboIndex = std::lower_bound(globalImageList.cbegin(), globalImageList.cend(), CacheData(size, nullptr), [] (const CacheData &image1, const CacheData &image2) { const QSize &s1 = image1.first; const QSize &s2 = image2.first; return s1.width() < s2.width() || s1.height() < s2.height(); }); if (fboIndex != globalImageList.cend() && !allowedGreaterSize && (*fboIndex).first != size) { fboIndex = globalImageList.cend(); } CachedQImage *image = nullptr; if (fboIndex == globalImageList.cend()) { image = new CachedQImage(size); globalImageList.append(CacheData(size, image)); } else { image = (*fboIndex).second; } return QExplicitlySharedDataPointer(image); } private: // order is from small to large by the image size static thread_local QList globalImageList; }; thread_local QList CachedQImage::globalImageList; typedef QExplicitlySharedDataPointer SharedCachedQImage; class Q_DECL_HIDDEN SoftwareRenderNode : public DBlitFramebufferNode { public: SoftwareRenderNode(QQuickItem *item) : DBlitFramebufferNode(item) { } QImage toImage() const override { return image ? *image : QImage(); } void render(const RenderState *state) override { Q_UNUSED(state) if (!m_item->window()) return; QSGRendererInterface *rif = m_item->window()->rendererInterface(); QPainter *p = static_cast(rif->getResource(m_item->window(), QSGRendererInterface::PainterResource)); Q_ASSERT(p); const auto device = p->device(); QRectF sourceRect = matrix()->mapRect(m_rect); if (!sourceRect.isValid()) return; sourceRect.moveTopLeft(sourceRect.topLeft() * device->devicePixelRatioF()); sourceRect.setSize(sourceRect.size() * device->devicePixelRatioF()); const QSize textureSize = sourceRect.size().toSize(); if (Q_UNLIKELY(!image || (!useAtlasTexture && image->size() != textureSize) || (useAtlasTexture && (image->width() < textureSize.width() || image->height() < textureSize.height())))) { image = shareBuffer ? CachedQImage::getImage(textureSize, useAtlasTexture) : SharedCachedQImage(new CachedQImage(textureSize)); image->setDevicePixelRatio(device->devicePixelRatioF()); // ref the image QImage textureImage(image->bits(), image->width(), image->height(), image->bytesPerLine(), image->format()); textureImage.setDevicePixelRatio(image->devicePixelRatio()); m_texture->setImage(textureImage); } painter.begin(image.data()); painter.setRenderHint(QPainter::Antialiasing); painter.setCompositionMode(QPainter::CompositionMode_Source); if (Q_LIKELY(device->devType() == QInternal::Image)) { auto source = static_cast(device); painter.drawImage(QPointF(0, 0), *source, sourceRect); } else if (device->devType() == QInternal::Pixmap) { auto source = static_cast(device); painter.drawPixmap(QPointF(0, 0), *source, sourceRect); } painter.end(); doRenderCallback(); } private: SharedCachedQImage image; QPainter painter; }; DBlitFramebufferNode *DBlitFramebufferNode::createSoftwareNode(QQuickItem *item, bool shareBuffer, bool useAtlasTexture) { auto node = new SoftwareRenderNode(item); node->shareBuffer = shareBuffer; node->useAtlasTexture = useAtlasTexture; return node; } QRectF DBlitFramebufferNode::rect() const { return QRectF(0, 0, m_item->width(), m_item->height()); } void DBlitFramebufferNode::resize(const QSizeF &size) { if (m_size == size) return; m_size = size; m_rect = QRectF(QPointF(0, 0), m_size).marginsAdded(m_margins); } void DBlitFramebufferNode::setMargins(const QMarginsF &margin) { if (m_margins == margin) return; m_margins = margin; m_rect = QRectF(QPointF(0, 0), m_size).marginsAdded(m_margins); } void DBlitFramebufferNode::setRenderCallback(RenderCallback callback, void *data) { m_renderCallback = callback; m_callbackData = data; } DBlitFramebufferNode::DBlitFramebufferNode(QQuickItem *item) : m_item(item) , m_texture(new ProxyAtlasTexture()) { m_texture->setOwnsTexture(false); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dblitframebuffernode_p.h000066400000000000000000000036211476226662700237220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DBLITFRAMEBUFFERNODE_H #define DBLITFRAMEBUFFERNODE_H #include #include #include #include QT_BEGIN_NAMESPACE class QSGPlainTexture; class QQuickItem; QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class ProxyAtlasTexture; class DBlitFramebufferNode : public QSGRenderNode { public: inline QSizeF size() const { return m_size; } QSGTexture *texture() const; #ifndef QT_NO_OPENGL static DBlitFramebufferNode *createOpenGLNode(QQuickItem *item, bool shareBuffer = false, bool useAtlasTexture = false); #endif static DBlitFramebufferNode *createSoftwareNode(QQuickItem *item, bool shareBuffer = false, bool useAtlasTexture = false); QRectF rect() const override; void resize(const QSizeF &size); void setMargins(const QMarginsF &margin); typedef void(*RenderCallback)(DBlitFramebufferNode *node, void *data); void setRenderCallback(RenderCallback callback, void *data); inline void doRenderCallback() { if (!m_renderCallback) return; m_renderCallback(this, m_callbackData); } virtual QImage toImage() const { return QImage(); } protected: DBlitFramebufferNode(QQuickItem *item); QPointer m_item; QSizeF m_size; QMarginsF m_margins; QRectF m_rect; QScopedPointer m_texture; RenderCallback m_renderCallback = nullptr; void *m_callbackData = nullptr; bool shareBuffer = false; bool useAtlasTexture = false; }; DQUICK_END_NAMESPACE #endif // DBLITFRAMEBUFFERNODE_H dtkdeclarative-5.7.12/src/private/dblurimagenode.cpp000066400000000000000000000722151476226662700225530ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dblurimagenode_p.h" #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) #include #else #include #endif #include #include #include #ifndef QT_NO_OPENGL #include #include #include #include #include #endif DQUICK_BEGIN_NAMESPACE // Copy from qpixmapfilter.cpp begin template inline int qt_static_shift(int value) { if (shift == 0) return value; else if (shift > 0) return value << (uint(shift) & 0x1f); else return value >> (uint(-shift) & 0x1f); } template inline void qt_blurinner(uchar *bptr, int &zR, int &zG, int &zB, int &zA, int alpha) { QRgb *pixel = (QRgb *)bptr; #define Z_MASK (0xff << zprec) const int A_zprec = qt_static_shift(*pixel) & Z_MASK; const int R_zprec = qt_static_shift(*pixel) & Z_MASK; const int G_zprec = qt_static_shift(*pixel) & Z_MASK; const int B_zprec = qt_static_shift(*pixel) & Z_MASK; #undef Z_MASK const int zR_zprec = zR >> aprec; const int zG_zprec = zG >> aprec; const int zB_zprec = zB >> aprec; const int zA_zprec = zA >> aprec; zR += alpha * (R_zprec - zR_zprec); zG += alpha * (G_zprec - zG_zprec); zB += alpha * (B_zprec - zB_zprec); zA += alpha * (A_zprec - zA_zprec); #define ZA_MASK (0xff << (zprec + aprec)) *pixel = qt_static_shift<24 - zprec - aprec>(zA & ZA_MASK) | qt_static_shift<16 - zprec - aprec>(zR & ZA_MASK) | qt_static_shift<8 - zprec - aprec>(zG & ZA_MASK) | qt_static_shift<-zprec - aprec>(zB & ZA_MASK); #undef ZA_MASK } const static int alphaIndex = (QSysInfo::ByteOrder == QSysInfo::BigEndian ? 0 : 3); template inline void qt_blurinner_alphaOnly(uchar *bptr, int &z, int alpha) { const int A_zprec = int(*(bptr)) << zprec; const int z_zprec = z >> aprec; z += alpha * (A_zprec - z_zprec); *(bptr) = z >> (zprec + aprec); } template inline void qt_blurrow(QImage & im, int line, int alpha) { uchar *bptr = im.scanLine(line); int zR = 0, zG = 0, zB = 0, zA = 0; if (alphaOnly && im.format() != QImage::Format_Indexed8) bptr += alphaIndex; const int stride = im.depth() >> 3; const int im_width = im.width(); for (int index = 0; index < im_width; ++index) { if (alphaOnly) qt_blurinner_alphaOnly(bptr, zA, alpha); else qt_blurinner(bptr, zR, zG, zB, zA, alpha); bptr += stride; } bptr -= stride; for (int index = im_width - 2; index >= 0; --index) { bptr -= stride; if (alphaOnly) qt_blurinner_alphaOnly(bptr, zA, alpha); else qt_blurinner(bptr, zR, zG, zB, zA, alpha); } } /* * expblur(QImage &img, int radius) * * Based on exponential blur algorithm by Jani Huhtanen * * In-place blur of image 'img' with kernel * of approximate radius 'radius'. * * Blurs with two sided exponential impulse * response. * * aprec = precision of alpha parameter * in fixed-point format 0.aprec * * zprec = precision of state parameters * zR,zG,zB and zA in fp format 8.zprec */ template static void expblur(QImage &img, qreal radius, bool improvedQuality = false, int transposed = 0) { // halve the radius if we're using two passes if (improvedQuality) radius *= qreal(0.5); Q_ASSERT(img.format() == QImage::Format_ARGB32_Premultiplied || img.format() == QImage::Format_RGB32 || img.format() == QImage::Format_Indexed8 || img.format() == QImage::Format_Grayscale8); // choose the alpha such that pixels at radius distance from a fully // saturated pixel will have an alpha component of no greater than // the cutOffIntensity const qreal cutOffIntensity = 2; int alpha = radius <= qreal(1e-5) ? ((1 << aprec)-1) : qRound((1<(img, row, alpha); } QImage temp(img.height(), img.width(), img.format()); temp.setDevicePixelRatio(img.devicePixelRatioF()); if (transposed >= 0) { if (img.depth() == 8) { qt_memrotate270(reinterpret_cast(img.bits()), img.width(), img.height(), img.bytesPerLine(), reinterpret_cast(temp.bits()), temp.bytesPerLine()); } else { qt_memrotate270(reinterpret_cast(img.bits()), img.width(), img.height(), img.bytesPerLine(), reinterpret_cast(temp.bits()), temp.bytesPerLine()); } } else { if (img.depth() == 8) { qt_memrotate90(reinterpret_cast(img.bits()), img.width(), img.height(), img.bytesPerLine(), reinterpret_cast(temp.bits()), temp.bytesPerLine()); } else { qt_memrotate90(reinterpret_cast(img.bits()), img.width(), img.height(), img.bytesPerLine(), reinterpret_cast(temp.bits()), temp.bytesPerLine()); } } img_height = temp.height(); for (int row = 0; row < img_height; ++row) { for (int i = 0; i <= int(improvedQuality); ++i) qt_blurrow(temp, row, alpha); } if (transposed == 0) { if (img.depth() == 8) { qt_memrotate90(reinterpret_cast(temp.bits()), temp.width(), temp.height(), temp.bytesPerLine(), reinterpret_cast(img.bits()), img.bytesPerLine()); } else { qt_memrotate90(reinterpret_cast(temp.bits()), temp.width(), temp.height(), temp.bytesPerLine(), reinterpret_cast(img.bits()), img.bytesPerLine()); } } else { img = temp; } } static inline void qt_blurImage(QImage &blurImage, qreal radius, bool quality, int transposed = 0) { if (blurImage.format() == QImage::Format_Indexed8 || blurImage.format() == QImage::Format_Grayscale8) expblur<12, 10, true>(blurImage, radius, quality, transposed); else expblur<12, 10, false>(blurImage, radius, quality, transposed); } // Copy from qpixmapfilter.cpp end DSGBlurNode::DSGBlurNode(QQuickItem *owner) : m_item(owner) { } void DSGBlurNode::setRenderCallback(RenderCallback callback, void *data) { m_renderCallback = callback; m_callbackData = data; } void DSGBlurNode::setTexture(QSGTexture *texture) { if (m_texture == texture) return; m_texture = texture; releaseResources(); markDirty(DirtyMaterial); } bool DSGBlurNode::writeToTexture(QSGPlainTexture *) const { return false; } void DSGBlurNode::setRadius(qreal radius) { if (qFuzzyCompare(radius, this->m_radius)) return; this->m_radius = radius; markDirty(DirtyMaterial); } void DSGBlurNode::setSourceRect(const QRectF &source) { if (this->m_sourceRect == source) return; this->m_sourceRect = source; markDirty(DirtyMaterial); } void DSGBlurNode::setRect(const QRectF &target) { if (this->m_targetRect == target) return; this->m_targetRect = target; markDirty(DirtyMaterial); } void DSGBlurNode::setDisabledOpaqueRendering(bool disabled) { if (this->m_disabledOpaqueRendering == disabled) return; this->m_disabledOpaqueRendering = disabled; markDirty(DirtyForceUpdate); } void DSGBlurNode::setBlendColor(const QColor &color) { if (this->m_blendColor == color) return; this->m_blendColor = color; markDirty(DirtyMaterial); } void DSGBlurNode::setFollowMatrixForSource(bool on) { if (m_followMatrixForSource == on) return; m_followMatrixForSource = on; markDirty(DirtyMaterial); } QSGRenderNode::RenderingFlags DSGBlurNode::flags() const { RenderingFlags rf = BoundedRectRendering | DepthAwareRendering; if (!m_disabledOpaqueRendering &&( !m_texture || !m_texture->hasAlphaChannel())) rf |= OpaqueRendering; return rf; } QRectF DSGBlurNode::rect() const { return m_targetRect; } void DSGBlurNode::setWindow(QQuickWindow *window) { m_window = window; } DSoftwareBlurImageNode::DSoftwareBlurImageNode(QQuickItem *owner) : DSGBlurNode(owner) { } static inline QImage refQImage(QImage &source, const QRectF &rect) { uchar *offset = source.bits() + qRound(rect.x() + rect.y() * source.bytesPerLine()); QImage image(offset, rect.width(), rect.height(), source.bytesPerLine(), source.format()); image.setDevicePixelRatio(source.devicePixelRatio()); return image; } void DSoftwareBlurImageNode::render(const RenderState *state) { if (!m_sourceRect.isValid() || !m_texture) return; if (!m_item->window() || !m_window) return; updateCachedImage(); if (cachedSource.isNull()) return; QSGRendererInterface *rif = m_window->rendererInterface(); QPainter *p = static_cast(rif->getResource(m_window, QSGRendererInterface::PainterResource)); Q_ASSERT(p); const QRegion *clipRegion = state->clipRegion(); if (clipRegion && !clipRegion->isEmpty()) p->setClipRegion(*clipRegion, Qt::ReplaceClip); // must be done before setTransform p->setOpacity(inheritedOpacity()); const qreal dpr = cachedSource.devicePixelRatio(); QPointF offset = QPointF(m_sourceRect.x() * dpr, m_sourceRect.y() * dpr); if (m_texture->isAtlasTexture()) { const QRectF subRect = m_texture->normalizedTextureSubRect(); offset.rx() += subRect.x() * cachedSource.width(); offset.ry() += subRect.y() * cachedSource.height(); } QRectF actualSourceRect(offset.x(), offset.y(), m_sourceRect.width() * dpr, m_sourceRect.height() * dpr); const QTransform t = matrix()->toTransform(); QRectF actualTargetRect = m_targetRect; if (m_followMatrixForSource) { // map the targetRect to the actualSourceRect QPainterPath path; path.addRect(m_targetRect); path = t.map(path); p->setClipPath(path, Qt::IntersectClip); actualSourceRect.setSize(t.mapRect(actualSourceRect).size()); actualTargetRect = t.mapRect(m_targetRect); } else { p->setTransform(t); } // do blur QImage sourceRef = refQImage(cachedSource, actualSourceRect); // TODO: Don't transparent the borders qt_blurImage(sourceRef, m_radius, false); if (!m_offscreen) { p->drawImage(actualTargetRect, cachedSource, actualSourceRect); if (m_blendColor.isValid()) { p->fillRect(actualTargetRect, m_blendColor); } } doRenderCallback(); } void DSoftwareBlurImageNode::releaseResources() { static QImage globalNullImage; cachedSource = globalNullImage; } void DSoftwareBlurImageNode::updateCachedImage() { Q_ASSERT(m_texture); if (auto image = qobject_cast(m_texture)) { cachedSource = image->image(); } else if (QSGLayer *pt = qobject_cast(m_texture)) { cachedSource = pt->toImage(); } else { DSoftwareBlurImageNode::releaseResources(); } } bool DSoftwareBlurImageNode::writeToTexture(QSGPlainTexture *targetTexture) const { targetTexture->setImage(cachedSource); return true; } #ifndef QT_NO_OPENGL DOpenGLBlurEffectNode::DOpenGLBlurEffectNode(QQuickItem *owner) : DSGBlurNode(owner) { } DOpenGLBlurEffectNode::~DOpenGLBlurEffectNode() { delete m_programKawaseUp; m_programKawaseUp = nullptr; delete m_programKawaseDown; m_programKawaseDown = nullptr; delete m_program; m_program = nullptr; delete m_programNoise; m_programNoise = nullptr; qDeleteAll(m_fboVector); m_fboVector.clear(); delete m_vbo; m_vbo = nullptr; delete m_sampleVbo; m_sampleVbo = nullptr; delete m_noiseVbo; m_noiseVbo = nullptr; } void DOpenGLBlurEffectNode::setTexture(QSGTexture *texture) { if (m_texture == texture) return; m_texture = texture; m_needUpdateFBO = true; markDirty(DirtyMaterial); } void DOpenGLBlurEffectNode::setRadius(qreal radius) { // TODO(xiaoyaobing): I don't want to do this, but the radius of software rendering and // hardware rendering can't be unified if (qRound(radius / 10) == m_radius) return; this->m_radius = qRound(radius / 10); m_needUpdateFBO = true; markDirty(DirtyMaterial); } void DOpenGLBlurEffectNode::render(const QSGRenderNode::RenderState *state) { if (Q_UNLIKELY(!m_sourceRect.isValid() || !m_texture)) return; if (Q_UNLIKELY(!m_item || !m_item->window() || !m_window)) return; #if(QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) const bool needsWrap = QSGRendererInterface::isApiRhiBased(m_window->rendererInterface()->graphicsApi()); if (Q_LIKELY(needsWrap)) { m_window->beginExternalCommands(); } #endif if (Q_UNLIKELY(!m_programKawaseUp)) initialize(); if (Q_UNLIKELY(m_needUpdateFBO)) { initFBOTextures(); m_needUpdateFBO = false; } if (Q_UNLIKELY(m_fboVector.isEmpty())) return; #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) auto textureId = m_texture->textureId(); #else //TODO support vulkan auto textureId = (m_texture->nativeInterface())->nativeTexture(); #endif applyDaulBlur(m_fboVector[1], textureId, m_programKawaseDown, state, m_matrixKawaseDownUniform, 2); for (int i = 1; i < m_radius; i++) { applyDaulBlur(m_fboVector[i + 1], m_fboVector[i]->texture(), m_programKawaseDown, state, m_matrixKawaseDownUniform, qPow(2, i + 1)); } for (int i = m_radius; i > 0; i--) { applyDaulBlur(m_fboVector[i - 1], m_fboVector[i]->texture(), m_programKawaseUp, state, m_matrixKawaseUpUniform, qPow(2, i - 1)); } if (!m_offscreen) renderToScreen(m_fboVector[0]->texture(), state); #if(QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) if (Q_LIKELY(needsWrap)) m_window->endExternalCommands(); #endif doRenderCallback(); } QSGRenderNode::StateFlags DOpenGLBlurEffectNode::changedStates() const { if (m_offscreen) return BlendState; return BlendState | StencilState | ScissorState; } bool DOpenGLBlurEffectNode::writeToTexture(QSGPlainTexture *targetTexture) const { if (Q_UNLIKELY(m_fboVector.isEmpty())) return false; const auto fbo = m_fboVector.first(); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) targetTexture->setTextureId(fbo->texture()); #elif QT_VERSION <= QT_VERSION_CHECK(6, 2, 4) auto wp = QQuickWindowPrivate::get(m_window); targetTexture->setTextureFromNativeTexture(wp->rhi, static_cast(fbo->texture()), 0, fbo->size(), {}, {}); #else auto wp = QQuickWindowPrivate::get(m_window); targetTexture->setTextureFromNativeTexture(wp->rhi, static_cast(fbo->texture()), 0, 0, fbo->size(), {}, {}); #endif targetTexture->setHasAlphaChannel(m_texture->hasAlphaChannel()); targetTexture->setTextureSize(fbo->size()); return true; } void DOpenGLBlurEffectNode::initialize() { initDispalyShader(); initBlurSahder(); } void DOpenGLBlurEffectNode::initBlurSahder() { m_programKawaseUp = new QOpenGLShaderProgram; m_programKawaseDown = new QOpenGLShaderProgram; m_programKawaseUp->addCacheableShaderFromSourceFile(QOpenGLShader::Vertex, ":/dtk/declarative/shaders/dualkawaseup.vert"); m_programKawaseUp->addCacheableShaderFromSourceFile(QOpenGLShader::Fragment, ":/dtk/declarative/shaders/dualkawaseup.frag"); m_programKawaseUp->bindAttributeLocation("posAttr", 0); m_programKawaseUp->bindAttributeLocation("qt_VertexTexCoord", 1); m_programKawaseUp->link(); m_matrixKawaseUpUniform = m_programKawaseUp->uniformLocation("matrix"); m_programKawaseDown->addCacheableShaderFromSourceFile(QOpenGLShader::Vertex, ":/dtk/declarative/shaders/dualkawasedown.vert"); m_programKawaseDown->addCacheableShaderFromSourceFile(QOpenGLShader::Fragment, ":/dtk/declarative/shaders/dualkawasedown.frag"); m_programKawaseDown->bindAttributeLocation("posAttr", 0); m_programKawaseDown->bindAttributeLocation("qt_VertexTexCoord", 1); m_programKawaseDown->link(); m_matrixKawaseDownUniform = m_programKawaseDown->uniformLocation("matrix"); const int VERTEX_SIZE = 8 * sizeof(GLfloat); static GLfloat texCoord[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, }; m_sampleVbo = new QOpenGLBuffer; m_sampleVbo->create(); m_sampleVbo->bind(); m_sampleVbo->allocate(VERTEX_SIZE + sizeof(texCoord)); m_sampleVbo->write(VERTEX_SIZE, texCoord, sizeof(texCoord)); } void DOpenGLBlurEffectNode::applyDaulBlur(QOpenGLFramebufferObject *targetFBO, GLuint sourceTexture, QOpenGLShaderProgram *shader , const QSGRenderNode::RenderState *state, int matrixUniform, int scale) { if (Q_UNLIKELY(!m_item || !m_window)) return; auto context = QOpenGLContext::currentContext(); Q_ASSERT(context); GLuint prevFbo = 0; context->functions()->glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *)&prevFbo); targetFBO->bind(); QOpenGLFunctions *f = context->functions(); shader->bind(); glEnable(GL_BLEND); f->glBlendFunc(GL_ONE, GL_ZERO); // TODO(xiaoyaobing): Shader pixel offset value during hardware rendering, because software rendering // does not, so write a fixed value here shader->setUniformValue("offset", QVector2D(8, 8)); shader->setUniformValue("iResolution", QVector2D(targetFBO->size().width(), targetFBO->size().height())); shader->setUniformValue("halfpixel", QVector2D(0.5 / targetFBO->size().width(), 0.5 / targetFBO->size().height())); float yOffset = m_window->height() - qRound(m_targetRect.height() / scale); shader->setUniformValue(matrixUniform, *state->projectionMatrix() * QMatrix4x4(1, 0, 0, 0, 0, 1, 0, yOffset, 0, 0, 1, 0, 0, 0, 0, 1)); m_sampleVbo->bind(); QPointF p0(0, 0); QPointF p1(0, qRound(m_targetRect.height() / scale)); QPointF p2(qRound( m_targetRect.width() / scale), 0); QPointF p3(qRound(m_targetRect.width() / scale), qRound(m_targetRect.height() / scale)); GLfloat vertices[8] = { GLfloat(p0.x()), GLfloat(p0.y()), GLfloat(p1.x()), GLfloat(p1.y()), GLfloat(p2.x()), GLfloat(p2.y()), GLfloat(p3.x()), GLfloat(p3.y()) }; m_sampleVbo->write(0, vertices, sizeof(vertices)); shader->setAttributeBuffer(0, GL_FLOAT, 0, 2); shader->setAttributeBuffer(1, GL_FLOAT, sizeof(vertices), 2); shader->enableAttributeArray(0); shader->enableAttributeArray(1); m_sampleVbo->release(); glEnable(GL_TEXTURE_2D); f->glBindTexture(GL_TEXTURE_2D, sourceTexture); f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisable(GL_TEXTURE_2D); shader->release(); targetFBO->release(); if (prevFbo != targetFBO->handle()) f->glBindFramebuffer(GL_FRAMEBUFFER, prevFbo); } void DOpenGLBlurEffectNode::applyNoise(GLuint sourceTexture, const QSGRenderNode::RenderState *state) { QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); f->glBindTexture(GL_TEXTURE_2D, sourceTexture); f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); QOpenGLFramebufferObject::bindDefault(); m_programNoise->bind(); m_programNoise->setUniformValue("matrix", *state->projectionMatrix() * *matrix()); m_programNoise->setUniformValue("opacity", float(inheritedOpacity())); m_programNoise->setUniformValue("blendColor", m_blendColor); m_noiseVbo->bind(); QPointF p0(0, 0); QPointF p1(0, m_targetRect.height()); QPointF p2(m_targetRect.width(), 0); QPointF p3(m_targetRect.width(), m_targetRect.height()); GLfloat vertices[8] = { GLfloat(p0.x()), GLfloat(p0.y()), GLfloat(p1.x()), GLfloat(p1.y()), GLfloat(p2.x()), GLfloat(p2.y()), GLfloat(p3.x()), GLfloat(p3.y()) }; m_noiseVbo->write(0, vertices, sizeof(vertices)); m_programNoise->setAttributeBuffer(0, GL_FLOAT, 0, 2); m_programNoise->setAttributeBuffer(1, GL_FLOAT, sizeof(vertices), 2); m_programNoise->enableAttributeArray(0); m_programNoise->enableAttributeArray(1); m_noiseVbo->release(); f->glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); f->glEnable(GL_BLEND); f->glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); if (state->scissorEnabled()) { f->glEnable(GL_SCISSOR_TEST); const QRect r = state->scissorRect(); f->glScissor(r.x(), r.y(), r.width(), r.height()); } if (state->stencilEnabled()) { f->glEnable(GL_STENCIL_TEST); f->glStencilFunc(GL_EQUAL, state->stencilValue(), 0xFF); f->glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); } f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); markDirty(QSGNode::DirtyGeometry); m_programNoise->release(); } void DOpenGLBlurEffectNode::renderToScreen(GLuint sourceTexture, const QSGRenderNode::RenderState *state) { QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); f->glBindTexture(GL_TEXTURE_2D, sourceTexture); f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); QOpenGLFramebufferObject::bindDefault(); m_program->bind(); m_program->setUniformValue(m_matrixUniform, *state->projectionMatrix() * *matrix()); m_program->setUniformValue(m_opacityUniform, float(inheritedOpacity())); m_program->setUniformValue("blendColor", m_blendColor); m_vbo->bind(); QPointF p0(0, 0); QPointF p1(0, m_targetRect.height()); QPointF p2(m_targetRect.width(), 0); QPointF p3(m_targetRect.width(), m_targetRect.height()); GLfloat vertices[8] = { GLfloat(p0.x()), GLfloat(p0.y()), GLfloat(p1.x()), GLfloat(p1.y()), GLfloat(p2.x()), GLfloat(p2.y()), GLfloat(p3.x()), GLfloat(p3.y()) }; m_vbo->write(0, vertices, sizeof(vertices)); m_program->setAttributeBuffer(0, GL_FLOAT, 0, 2); m_program->setAttributeBuffer(1, GL_FLOAT, sizeof(vertices), 2); m_program->enableAttributeArray(0); m_program->enableAttributeArray(1); m_vbo->release(); f->glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); f->glEnable(GL_BLEND); f->glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); if (state->scissorEnabled()) { f->glEnable(GL_SCISSOR_TEST); const QRect r = state->scissorRect(); f->glScissor(r.x(), r.y(), r.width(), r.height()); } if (state->stencilEnabled()) { f->glEnable(GL_STENCIL_TEST); f->glStencilFunc(GL_EQUAL, state->stencilValue(), 0xFF); f->glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); } f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); markDirty(QSGNode::DirtyGeometry); m_program->release(); } void DOpenGLBlurEffectNode::initFBOTextures() { QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); for (int i = 0; i < m_fboVector.size(); i++) { delete m_fboVector[i]; } m_fboVector.clear(); if (m_radius <= 0) return; qreal scale = m_window->effectiveDevicePixelRatio(); QSize size; /* when opengl rendering, the projectionmatrix matrix has high accuracy, which will lead to deviation from the FBO size. When i reduce the FBO size by 1, at most one boundary pixel will be lost, which will not affect the blurred imaging boundary. */ size.setWidth(m_targetRect.width() * scale - 1); size.setHeight(m_targetRect.height() * scale - 1); m_fboVector.append(new QOpenGLFramebufferObject(size, QOpenGLFramebufferObject::CombinedDepthStencil, GL_TEXTURE_2D)); for (int i = 1; i <= m_radius; i++) { size.setWidth(m_targetRect.width() / qPow(2, i) * scale - 1); size.setHeight(m_targetRect.height() / qPow(2, i) * scale - 1); m_fboVector.append(new QOpenGLFramebufferObject(size, QOpenGLFramebufferObject::CombinedDepthStencil, GL_TEXTURE_2D)); f->glBindTexture(GL_TEXTURE_2D, m_fboVector.last()->texture()); f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } } void DOpenGLBlurEffectNode::initDispalyShader() { m_program = new QOpenGLShaderProgram; static const char *vertexShaderSource = "attribute highp vec4 posAttr; \n" "attribute highp vec2 qt_VertexTexCoord; \n" "varying highp vec2 qt_TexCoord; \n" "uniform highp mat4 matrix; \n" "void main() { \n" " qt_TexCoord = qt_VertexTexCoord; \n" " gl_Position = matrix * posAttr; \n" "}\n"; static const char *fragmentShaderSource = "varying highp vec2 qt_TexCoord; \n" "uniform lowp float opacity; \n" "uniform sampler2D qt_Texture; \n" "uniform highp vec4 blendColor; \n" "void main() { \n" " highp vec4 color = texture2D(qt_Texture, qt_TexCoord) * opacity; \n" " lowp vec3 rgb = blendColor.rgb; \n" " gl_FragColor = color * (1.0 - blendColor.a) + vec4(rgb * blendColor.a, blendColor.a); \n" "}\n"; m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource); m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource); m_program->bindAttributeLocation("posAttr", 0); m_program->bindAttributeLocation("qt_VertexTexCoord", 1); m_program->link(); m_matrixUniform = m_program->uniformLocation("matrix"); m_opacityUniform = m_program->uniformLocation("opacity"); const int VERTEX_SIZE = 8 * sizeof(GLfloat); static GLfloat texCoord[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, }; m_vbo = new QOpenGLBuffer; m_vbo->create(); m_vbo->bind(); m_vbo->allocate(VERTEX_SIZE + sizeof(texCoord)); m_vbo->write(VERTEX_SIZE, texCoord, sizeof(texCoord)); } void DOpenGLBlurEffectNode::initNoiseShader() { m_programNoise = new QOpenGLShaderProgram; m_programNoise->addCacheableShaderFromSourceFile(QOpenGLShader::Vertex, ":/dtk/declarative/shaders/noise.vert"); m_programNoise->addCacheableShaderFromSourceFile(QOpenGLShader::Fragment, ":/dtk/declarative/shaders/noise.frag"); m_programNoise->bindAttributeLocation("posAttr", 0); m_programNoise->bindAttributeLocation("qt_VertexTexCoord", 1); m_programNoise->link(); const int VERTEX_SIZE = 8 * sizeof(GLfloat); static GLfloat texCoord[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, }; m_noiseVbo = new QOpenGLBuffer; m_noiseVbo->create(); m_noiseVbo->bind(); m_noiseVbo->allocate(VERTEX_SIZE + sizeof(texCoord)); m_noiseVbo->write(VERTEX_SIZE, texCoord, sizeof(texCoord)); } #endif DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dblurimagenode_p.h000066400000000000000000000077341476226662700225430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DSOFTWAREBLURIMAGENODE_H #define DSOFTWAREBLURIMAGENODE_H #include #include #include #include #ifndef QT_NO_OPENGL #include #endif QT_BEGIN_NAMESPACE class QQuickItem; class QSGTexture; class QSGPlainTexture; class QQuickWindow; #ifndef QT_NO_OPENGL class QOpenGLShaderProgram; class QOpenGLFramebufferObject; class QOpenGLBuffer; #endif QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class DSGBlurNode : public QSGRenderNode { public: DSGBlurNode(QQuickItem *owner); typedef void(*RenderCallback)(DSGBlurNode *node, void *data); void setRenderCallback(RenderCallback callback, void *data); inline void doRenderCallback() { if (!m_renderCallback) return; m_renderCallback(this, m_callbackData); } inline void setOffscreen(bool offscreen) { if (m_offscreen == offscreen) return; m_offscreen = offscreen; markDirty(DirtyMaterial); } virtual void setTexture(QSGTexture *texture); inline QSGTexture *texture() const { return m_texture;} virtual bool writeToTexture(QSGPlainTexture *targetTexture) const; virtual void setRadius(qreal radius); void setSourceRect(const QRectF &source); void setRect(const QRectF &target); void setDisabledOpaqueRendering(bool disabled); void setBlendColor(const QColor &color); void setFollowMatrixForSource(bool on); RenderingFlags flags() const override; QRectF rect() const override; void setWindow(QQuickWindow *window); protected: RenderCallback m_renderCallback = nullptr; void *m_callbackData = nullptr; bool m_offscreen = false; QPointer m_item; QSGTexture *m_texture = nullptr; qreal m_radius = 0; QRectF m_sourceRect; QRectF m_targetRect; QColor m_blendColor = Qt::transparent; bool m_disabledOpaqueRendering = false; bool m_followMatrixForSource = false; QPointer m_window; }; class DSoftwareBlurImageNode : public DSGBlurNode { public: DSoftwareBlurImageNode(QQuickItem *owner); private: void render(const RenderState *state) override; void releaseResources() override; void updateCachedImage(); bool writeToTexture(QSGPlainTexture *targetTexture) const override; QImage cachedSource; }; #ifndef QT_NO_OPENGL class DOpenGLBlurEffectNode : public DSGBlurNode { public: DOpenGLBlurEffectNode(QQuickItem *owner); ~DOpenGLBlurEffectNode() override; void setTexture(QSGTexture *texture) override; void setRadius(qreal radius) override; void render(const RenderState *state) override; StateFlags changedStates() const override; private: bool writeToTexture(QSGPlainTexture *targetTexture) const override; void initialize(); void initBlurSahder(); void applyDaulBlur(QOpenGLFramebufferObject* targetFBO, GLuint sourceTexture, QOpenGLShaderProgram *shader , const QSGRenderNode::RenderState *state, int matrixUniform, int scale); void applyNoise(GLuint sourceTexture, const QSGRenderNode::RenderState *state); void renderToScreen(GLuint sourceTexture, const QSGRenderNode::RenderState *state); void initFBOTextures(); void initDispalyShader(); void initNoiseShader(); private: bool m_needUpdateFBO = false; QOpenGLShaderProgram *m_programKawaseUp = nullptr; QOpenGLShaderProgram *m_programKawaseDown = nullptr; QVector m_fboVector; int m_matrixKawaseUpUniform; int m_matrixKawaseDownUniform; QOpenGLBuffer *m_sampleVbo = nullptr; QOpenGLShaderProgram *m_program = nullptr; int m_matrixUniform; int m_opacityUniform; QOpenGLBuffer *m_vbo = nullptr; QOpenGLShaderProgram *m_programNoise = nullptr; QOpenGLBuffer *m_noiseVbo = nullptr; }; #endif DQUICK_END_NAMESPACE #endif // DSOFTWAREBLURIMAGENODE_H dtkdeclarative-5.7.12/src/private/dcoloroverlaynode.cpp000066400000000000000000000022501476226662700233140ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dcoloroverlaynode.h" #include #include DQUICK_BEGIN_NAMESPACE DSoftwareColorOverlayNode::DSoftwareColorOverlayNode(QSGTextureProvider *sourceProvider) : DSoftwareEffectRenderNode(sourceProvider) { } void DSoftwareColorOverlayNode::setColor(QColor color) { if (color == m_color) return; m_color = color; markChanged(); } void DSoftwareColorOverlayNode::sync(QQuickItem *item) { m_item = item; m_width = item->width(); m_height = item->height(); DSoftwareEffectRenderNode::sync(item); } QImage DSoftwareColorOverlayNode::process(const QImage &sourceImage, QPainter::RenderHints hints) { QImage device(sourceImage); if (Q_UNLIKELY(sourceImage.isNull())) return device; if (!m_color.isValid() || m_color == Qt::transparent) return device; QPainter render(&device); render.setRenderHints(hints); render.setCompositionMode(QPainter::CompositionMode_SourceIn); render.fillRect(sourceImage.rect(), m_color); return device; } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dcoloroverlaynode.h000066400000000000000000000016231476226662700227640ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DSOFTWARECOLOROVERLAYNODE_H #define DSOFTWARECOLOROVERLAYNODE_H #include "dsoftwareeffectrendernode.h" #include DQUICK_BEGIN_NAMESPACE class DSoftwareColorOverlayNode : public DSoftwareEffectRenderNode { public: explicit DSoftwareColorOverlayNode(QSGTextureProvider *sourceProvider); void setColor(QColor color); void sync(QQuickItem *item) override; QRectF rect() const override { return QRect(0, 0, static_cast(m_width), static_cast(m_height)); } QImage process(const QImage &sourceImage, QPainter::RenderHints hints) override; private: QColor m_color = Qt::transparent; qreal m_width = 0; qreal m_height = 0; QQuickItem *m_item = nullptr; }; DQUICK_END_NAMESPACE #endif // DSOFTWARECOLOROVERLAYNODE_H dtkdeclarative-5.7.12/src/private/dconfigwrapper.cpp000066400000000000000000000265661476226662700226140ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dconfigwrapper_p.h" #include #include #include #include #include #include #include #include #ifndef QT_DEBUG Q_LOGGING_CATEGORY(cfLog, "dtk.dsg.config" , QtInfoMsg); #else Q_LOGGING_CATEGORY(cfLog, "dtk.dsg.config"); #endif DCORE_USE_NAMESPACE; // the properties and previous values. using DefalutProperties = QMap; static DefalutProperties propertyAndValues(const QObject* obj) { QMap properties; const QMetaObject *mo = obj->metaObject(); const int offset = mo->propertyOffset(); const int count = mo->propertyCount(); static const QStringList ReservedPropertyNames { "name", "subpath", "async" }; for (int i = offset; i < count; ++i) { const QMetaProperty &property = mo->property(i); if (ReservedPropertyNames.contains(property.name())) { qCWarning(cfLog()) << property.name() << " is keyword for Config." << property.isUser(); continue; } const QVariant &previousValue = property.read(obj); properties[property.name()] = previousValue; } return properties; } class DConfigWrapperMetaObject : public QQmlOpenMetaObject { public: DConfigWrapperMetaObject(DConfigWrapper *o, QQmlOpenMetaObjectType *type) : QQmlOpenMetaObject(o, type) , owner(o) { } ~DConfigWrapperMetaObject() override; DConfigWrapper *owner; // QQmlOpenMetaObject interface protected: virtual QVariant propertyWriteValue(int index, const QVariant &value) override { const QByteArray &proName = name(index); qCDebug(cfLog) << "propertyWriteValue" << proName << value; owner->setValue(proName, value); // Pre judgment returns the set value first. // If the value is different, `valueChanged` will be triggered again to update the value, // there are problems when the service is unavailable. // But If `impl->value(proName)` is returned, blocking has a performance problem. return value; } int metaCall(QObject *o, QMetaObject::Call _c, int _id, void **_a) override { if (_c == QMetaObject::ResetProperty) { const auto key = name(_id - type()->propertyOffset()); owner->resetValue(key); } return QQmlOpenMetaObject::metaCall(o, _c, _id, _a); } }; DConfigWrapperMetaObject::~DConfigWrapperMetaObject() { } /*! \class DTK::Quick::DConfigWrapper \inmodule dtkdeclarative \brief Import some function about reading and writing DSG configuration. */ DConfigWrapper::DConfigWrapper(QObject *parent) : QObject(parent) , impl(nullptr) { } DConfigWrapper::~DConfigWrapper() { } /*! * \brief \sa DConfig name() * \return */ QString DConfigWrapper::name() const { return m_name; } void DConfigWrapper::setName(const QString &name) { if (mo) { qCWarning(cfLog) << name << ": This name can't be changed after initialized"; return; } m_name = name; } /*! * \brief \sa DConfig subpath() * \return */ QString DConfigWrapper::subpath() const { return m_subpath; } void DConfigWrapper::setSubpath(const QString &subpath) { if (mo) { qCWarning(cfLog) << subpath << ": This subpath can't be changed after initialized"; return; } m_subpath = subpath; } /*! * \brief \sa DConfig keyList() * \return */ QStringList DConfigWrapper::keyList() const { if (!impl) return QStringList(); return configKeyList; } /*! * \brief \sa DConfig isValid() * \return */ bool DConfigWrapper::isValid() const { if (!impl) return false; // If is invalid, will delete the impl object return true; } bool DConfigWrapper::isDefaultValue(const QString &key) const { return !nonDefaultValueKeyList.contains(key); } /*! * \brief \sa DConfig value() * \return */ QVariant DConfigWrapper::value(const QString &key, const QVariant &fallback) const { const auto &value = property(key.toLatin1().constData()); return value.isValid() ? value : fallback; } /*! * \brief \sa DConfig setValue() * \return */ void DConfigWrapper::setValue(const QString &key, const QVariant &value) { if (!impl) return; if (m_async) { QMetaObject::invokeMethod(impl.get(), [this, key, value] { impl->setValue(key, value); }); } else { impl->setValue(key, value); } } void DConfigWrapper::resetValue(const QString &key) { if (!impl) return; if (m_async) { QMetaObject::invokeMethod(impl.get(), [this, key] { impl->reset(key); }); } else { impl->reset(key); } } void DConfigWrapper::classBegin() { } class Q_DECL_HIDDEN DConfigWrapperThread : public QThread { public: DConfigWrapperThread() : QThread() { setObjectName("DConfigWrapperThread"); moveToThread(this); } ~DConfigWrapperThread() override { quit(); wait(); } }; static QThread *globalThread() { static QThread *thread = nullptr; if (!thread) { thread = new DConfigWrapperThread(); thread->start(); } return thread; } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) DTK_CORE_NAMESPACE::DThreadUtils *globalThreadUtils() { static DTK_CORE_NAMESPACE::DThreadUtils *threadUtils = nullptr; if (!threadUtils) { threadUtils = new DTK_CORE_NAMESPACE::DThreadUtils(globalThread()); } return threadUtils; } #endif /*! \brief Initialize `DConfig` and redirect method of property's get and set. `DConfig` can only be initialized after \property name and \property subpath initialization is completed. \return */ void DConfigWrapper::componentComplete() { Q_ASSERT(!impl); // Get the dynamic properties and previous values defined in qml. // Muse before new DConfigWrapperMetaObject initializeConfigs = propertyAndValues(this); qCDebug(cfLog) << "Initialize Properties:" << initializeConfigs; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto objectType = new QQmlOpenMetaObjectType(&DConfigWrapper::staticMetaObject); #else auto objectType = new QQmlOpenMetaObjectType(&DConfigWrapper::staticMetaObject, qmlEngine(this)); #endif mo = new DConfigWrapperMetaObject(this, objectType); mo->setCached(true); if (m_async) { // Init properties for (auto iter = initializeConfigs.begin(); iter != initializeConfigs.end(); iter++) { mo->setValue(iter.key(), iter.value()); } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) globalThreadUtils()->run(this, &DConfigWrapper::initializeProperties); #else QMetaObject::invokeMethod(globalThread(), [this] { initializeProperties(); }); #endif } else { initializeProperties(); } } template typename std::result_of::type(Args...)>::type callInGuiThread(DConfigWrapper *wrapper, Fun fun, Args&&... args) { if (QThread::currentThread() == qApp->thread()) { return fun(std::forward(args)...); } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) return DThreadUtils::gui().exec(wrapper, fun, std::forward(args)...); #else return DThreadUtil::runInMainThread(wrapper, fun, std::forward(args)...); #endif } // in config thread, don't set the member variable directly. // Must ensure the member variable is set in the main thread. // So there have a "const" flag. void DConfigWrapper::initializeProperties() const { auto impl = new DTK_CORE_NAMESPACE::DConfig(m_name, m_subpath); if (!impl->isValid()) { qCWarning(cfLog) << QString("create dconfig failed, valid:%1, name:%2, subpath:%3, backend:%4") .arg(impl->isValid()) .arg(impl->name()) .arg(impl->subpath()) .arg(impl->backendName()); delete impl; impl = nullptr; return; } qInfo() << QString("create dconfig successful, valid:%1, name:%2, subpath:%3, backend:%4") .arg(impl->isValid()) .arg(impl->name()) .arg(impl->subpath()) .arg(impl->backendName()); const auto keyList = impl->keyList(); QStringList nonDefaultValueKeyList; for (const auto &key : keyList) { if (!impl->isDefaultValue(key)) { nonDefaultValueKeyList.append(key); } } auto wrapper = const_cast(this); callInGuiThread(wrapper, [wrapper, keyList, nonDefaultValueKeyList, impl] { wrapper->impl.reset(impl); wrapper->configKeyList = keyList; wrapper->nonDefaultValueKeyList = nonDefaultValueKeyList; }); for (const auto &key : keyList) { const QVariant currentValue = callInGuiThread(wrapper, [wrapper, key] { return wrapper->property(key.toLocal8Bit()); }); const auto initialValue = initializeConfigs.value(key.toLocal8Bit()); if (currentValue.isValid() && currentValue != initialValue) { // This key has been set value in QML by user, so we should update the value to DConfig. qCDebug(cfLog) << "Update value from user on initialize, key:" << key << "value:" << currentValue << "initialize value:" << initialValue << "config side value:" << impl->value(key, QVariant()); impl->setValue(key, currentValue); } else { // Must fallback to the initial value, in the sync mode, the DConfigWrapperMetaObject's // properties is not initialize. const auto value = impl->value(key, initialValue); callInGuiThread(wrapper, [wrapper, key, value] { if (value.isValid()) wrapper->mo->setValue(key.toLocal8Bit(), value); }); } } // Using QueuedConnection because impl->setValue maybe emit sync signal in `propertyWriteValue`. connect(impl, &DTK_CORE_NAMESPACE::DConfig::valueChanged, wrapper, [wrapper, impl](const QString &key) { const QByteArray &propName = key.toLocal8Bit(); qCDebug(cfLog) << "update value from DConfig by 'valueChanged', key:" << propName; const auto value = impl->value(propName, QVariant()); const bool isDefault = impl->isDefaultValue(propName); callInGuiThread(wrapper, [wrapper, propName, value, isDefault] { if (isDefault) { wrapper->nonDefaultValueKeyList.removeOne(propName); } else if (!wrapper->nonDefaultValueKeyList.contains(propName)) { wrapper->nonDefaultValueKeyList.append(propName); } if (value.isValid()) wrapper->mo->setValue(propName, value); }); QMetaObject::invokeMethod(wrapper, [wrapper, key] { Q_EMIT wrapper->valueChanged(key); }); }, Qt::DirectConnection); QMetaObject::invokeMethod(wrapper, &DConfigWrapper::initialized); } bool DConfigWrapper::async() const { return m_async; } void DConfigWrapper::setAsync(bool newAsync) { m_async = newAsync; if (mo) qCWarning(cfLog) << "Async can't be changed after initialized"; } dtkdeclarative-5.7.12/src/private/dconfigwrapper_p.h000066400000000000000000000037351476226662700225710ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DCONFIGWRAPPER_H #define DCONFIGWRAPPER_H #include #include #include DCORE_BEGIN_NAMESPACE class DConfig; class DThreadUtils; DCORE_END_NAMESPACE class DConfigWrapperMetaObject; class DConfigWrapper : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(QString name READ name WRITE setName) Q_PROPERTY(QString subpath READ subpath WRITE setSubpath) Q_PROPERTY(bool async READ async WRITE setAsync) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(Config) #endif public: explicit DConfigWrapper(QObject *parent = nullptr); ~DConfigWrapper() override; QString name() const; void setName(const QString &name); QString subpath() const; void setSubpath(const QString &subpath); bool async() const; void setAsync(bool newAsync); public Q_SLOTS: QVariant value(const QString &key, const QVariant &fallback = QVariant()) const; void setValue(const QString &key, const QVariant &value); void resetValue(const QString &key); QStringList keyList() const; bool isValid() const; bool isDefaultValue(const QString &key) const; Q_SIGNALS: void valueChanged(const QString &key); void initialized(); private: virtual void classBegin() override; virtual void componentComplete() override; void initializeProperties() const; friend DConfigWrapperMetaObject; DConfigWrapperMetaObject *mo = nullptr; std::unique_ptr impl; QStringList configKeyList; // If the key was set value, add it to the list QStringList nonDefaultValueKeyList; QMap initializeConfigs; QString m_name; QString m_subpath; bool m_async = false; Q_DISABLE_COPY(DConfigWrapper) }; #endif // DCONFIGWRAPPER_H dtkdeclarative-5.7.12/src/private/dhandlecontextmenuwindow.cpp000066400000000000000000000041341476226662700247060ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dhandlecontextmenuwindow_p.h" #include "private/qquickwindow_p.h" DHandleContextMenuWindow::DHandleContextMenuWindow(QWindow *parent) : QQuickWindow (parent) { } bool DHandleContextMenuWindow::event(QEvent *e) { if (e->type() == QEvent::MouseButtonPress) { handleMouseEvent(static_cast(e)); } return QQuickWindow::event(e); } void DHandleContextMenuWindow::handleMouseEvent(QMouseEvent *event) { QQuickWindowPrivate *d = reinterpret_cast(qGetPtrHelper(d_ptr)); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // TODO qt6 if (!mouseGrabberItem() && !d->pointerEventInstance(QQuickPointerDevice::genericMouseDevice())->point(0)->exclusiveGrabber()) { // 右键点击事件模拟发送菜单显示事件 if (event->button() == Qt::RightButton && event->type() == QEvent::MouseButtonPress) { QPointF last = d->lastMousePosition.isNull() ? event->windowPos() : d->lastMousePosition; d->lastMousePosition = event->windowPos(); QContextMenuEvent e(QContextMenuEvent::Mouse, last.toPoint(), event->windowPos().toPoint(), event->modifiers()); QGuiApplication::sendEvent(this, &e); } } #else auto pe = static_cast(event); if (!mouseGrabberItem() && pe && !QPointingDevicePrivate::get(const_cast(pe->pointingDevice()))->firstPointExclusiveGrabber()) { // 右键点击事件模拟发送菜单显示事件 if (event->button() == Qt::RightButton && event->type() == QEvent::MouseButtonPress) { auto da = d->deliveryAgentPrivate(); QPointF last = da->lastMousePosition.isNull() ? event->scenePosition() : da->lastMousePosition; da->lastMousePosition = event->scenePosition(); QContextMenuEvent e(QContextMenuEvent::Mouse, last.toPoint(), event->scenePosition().toPoint(), event->modifiers()); QGuiApplication::sendEvent(this, &e); } } #endif } dtkdeclarative-5.7.12/src/private/dhandlecontextmenuwindow_p.h000066400000000000000000000011031476226662700246630ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DHANDLECONTEXTMENUWINDOW_P_H #define DHANDLECONTEXTMENUWINDOW_P_H #include class DHandleContextMenuWindow : public QQuickWindow { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) Q_OBJECT QML_NAMED_ELEMENT(ContextMenuWindow) #endif public: DHandleContextMenuWindow(QWindow *parent = nullptr); protected: bool event(QEvent *) override; void handleMouseEvent(QMouseEvent *); }; #endif // DHANDLECONTEXTMENUWINDOW_P_H dtkdeclarative-5.7.12/src/private/dmaskeffectnode.cpp000066400000000000000000000466771476226662700227310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dmaskeffectnode_p.h" #include "private/qsgdefaultimagenode_p.h" #include #include DQUICK_BEGIN_NAMESPACE inline static bool isPowerOfTwo(int x) { // Assumption: x >= 1 return x == (x & -x); } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) class OpaqueTextureMaterialShader : public QSGMaterialShader { public: OpaqueTextureMaterialShader(); void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) override; char const *const *attributeNames() const override; protected: void initialize() override; protected: int m_matrix_id; }; #else class OpaqueTextureMaterialShader : public QSGOpaqueTextureMaterialRhiShader { public: #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) OpaqueTextureMaterialShader(int viewCount); #else OpaqueTextureMaterialShader(); #endif bool updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override; void updateSampledImage(RenderState &state, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override; bool updateGraphicsPipelineState(RenderState &state, GraphicsPipelineState *ps, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override; }; #endif class TextureMaterialShader : public OpaqueTextureMaterialShader { public: #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) TextureMaterialShader(int viewCount); #else TextureMaterialShader(); #endif #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) override; void initialize() override; protected: int m_opacity_id; #else bool updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial); #endif }; #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) OpaqueTextureMaterialShader::OpaqueTextureMaterialShader(int viewCount) : QSGOpaqueTextureMaterialRhiShader(viewCount) #else OpaqueTextureMaterialShader::OpaqueTextureMaterialShader() #endif { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) #if QT_CONFIG(opengl) setShaderSourceFile(QOpenGLShader::Vertex, QStringLiteral(":/dtk/declarative/shaders/quickitemviewport-opaque.vert")); setShaderSourceFile(QOpenGLShader::Fragment, QStringLiteral(":/dtk/declarative/shaders/quickitemviewport-opaque.frag")); #endif #else setShaderFileName(QSGMaterialShader::VertexStage, QStringLiteral(":/dtk/declarative/shaders_ng/quickitemviewport-opaque.vert.qsb")); setShaderFileName(QSGMaterialShader::FragmentStage, QStringLiteral(":/dtk/declarative/shaders_ng/quickitemviewport-opaque.frag.qsb")); setFlag(UpdatesGraphicsPipelineState); #endif } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) char const *const *OpaqueTextureMaterialShader::attributeNames() const { static char const *const attr[] = { "qt_VertexPosition", "qt_VertexTexCoord", nullptr }; return attr; } void OpaqueTextureMaterialShader::initialize() { #if QT_CONFIG(opengl) m_matrix_id = program()->uniformLocation("qt_Matrix"); #endif } void OpaqueTextureMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) { Q_ASSERT(oldEffect == nullptr || newEffect->type() == oldEffect->type()); const OpaqueTextureMaterial *newMaterial = static_cast(newEffect); // TODO:一直刷新数据浪费性能,需要优化 QSGTexture *t = newMaterial->texture(); if (Q_UNLIKELY(!t)) return; t->setFiltering(newMaterial->filtering()); t->setHorizontalWrapMode(newMaterial->horizontalWrapMode()); t->setVerticalWrapMode(newMaterial->verticalWrapMode()); #if QT_CONFIG(opengl) auto gl = const_cast(state.context())->functions(); bool npotSupported = gl->hasOpenGLFeature(QOpenGLFunctions::NPOTTextureRepeat); if (!npotSupported) { QSize size = t->textureSize(); const bool isNpot = !isPowerOfTwo(size.width()) || !isPowerOfTwo(size.height()); if (isNpot) { t->setHorizontalWrapMode(QSGTexture::ClampToEdge); t->setVerticalWrapMode(QSGTexture::ClampToEdge); } } #else Q_UNUSED(state) #endif t->setMipmapFiltering(newMaterial->mipmapFiltering()); t->setAnisotropyLevel(newMaterial->anisotropyLevel()); OpaqueTextureMaterial *oldTx = static_cast(oldEffect); if (oldTx == nullptr || oldTx->texture()->textureId() != t->textureId()) t->bind(); else t->updateBindOptions(); #if QT_CONFIG(opengl) auto mask = newMaterial->maskTexture(); gl->glActiveTexture(GL_TEXTURE1); if (oldTx == nullptr || oldTx->maskTexture()->textureId() != mask->textureId()) { mask->bind(); } else { mask->updateBindOptions(); } gl->glActiveTexture(GL_TEXTURE0); program()->setUniformValue("sourceScale", newMaterial->sourceScale()); program()->setUniformValue("mask", 1); program()->setUniformValue("maskScale", newMaterial->maskScale()); program()->setUniformValue("maskOffset", newMaterial->maskOffset()); if (state.isMatrixDirty()) program()->setUniformValue(m_matrix_id, state.combinedMatrix()); #else Q_UNUSED(state) #endif } #else // Mapping shader's ubuf of quickitemviewport-opaque enum Ubuf { QtMatrixSize = 64, MaskScaleSize = 8, MaskOffsetSize = MaskScaleSize, SourceScaleSize = MaskScaleSize, QtMatrixOffset = 0, MaskScaleOffset = QtMatrixOffset + QtMatrixSize, MaskOffsetOffset = MaskScaleOffset + MaskScaleSize, SourceScaleOffset = MaskOffsetOffset + MaskOffsetSize, MaskBindingIndex = 2 }; bool OpaqueTextureMaterialShader::updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) { Q_ASSERT(oldMaterial == nullptr || newMaterial->type() == oldMaterial->type()); const OpaqueTextureMaterial *material = static_cast(newMaterial); bool changed = QSGOpaqueTextureMaterialRhiShader::updateUniformData(state, newMaterial, oldMaterial); QByteArray *buf = state.uniformData(); Q_ASSERT(buf->size() >= SourceScaleOffset + SourceScaleSize); if (state.isMatrixDirty()) { const QMatrix4x4 m = state.combinedMatrix(); memcpy(buf->data() + QtMatrixOffset, m.constData(), QtMatrixSize); changed = true; } if (oldMaterial != newMaterial) { const QVector2D maskScale = material->maskScale(); const QVector2D maskOffset = material->maskOffset(); const QVector2D sourceScale = material->sourceScale(); Q_ASSERT(sizeof(maskScale) == MaskScaleSize); memcpy(buf->data() + MaskScaleOffset, &maskScale, MaskScaleSize); memcpy(buf->data() + MaskOffsetSize, &maskOffset, MaskOffsetSize); memcpy(buf->data() + SourceScaleOffset, &sourceScale, SourceScaleSize); changed = true; } return changed; } void OpaqueTextureMaterialShader::updateSampledImage(RenderState &state, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) { // update mask for `layout(binding = 2) uniform sampler2D mask;` if (binding != MaskBindingIndex) return QSGOpaqueTextureMaterialRhiShader::updateSampledImage(state, binding, texture, newMaterial, oldMaterial); #ifdef QT_NO_DEBUG Q_UNUSED(oldMaterial); #endif Q_ASSERT(oldMaterial == nullptr || newMaterial->type() == oldMaterial->type()); OpaqueTextureMaterial *tx = static_cast(newMaterial); QSGTexture *t = tx->maskTexture(); if (!t) { *texture = nullptr; return; } t->commitTextureOperations(state.rhi(), state.resourceUpdateBatch()); *texture = t; } bool OpaqueTextureMaterialShader::updateGraphicsPipelineState(RenderState &state, GraphicsPipelineState *ps, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) { auto material = static_cast(newMaterial); if (!material) return QSGOpaqueTextureMaterialRhiShader::updateGraphicsPipelineState(state, ps, newMaterial, oldMaterial); bool changed = false; if (material->blendSrcColor() != ps->srcColor || material->blendDstColor() != ps->dstColor) { ps->srcColor = material->blendSrcColor(); ps->dstColor = material->blendDstColor(); changed = true; } changed = QSGOpaqueTextureMaterialRhiShader::updateGraphicsPipelineState(state, ps, newMaterial, oldMaterial) || changed; return changed; } #endif #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) TextureMaterialShader::TextureMaterialShader(int viewCount) : OpaqueTextureMaterialShader(viewCount) #else TextureMaterialShader::TextureMaterialShader() : OpaqueTextureMaterialShader() #endif { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // TODO qt6 #if QT_CONFIG(opengl) setShaderSourceFile(QOpenGLShader::Fragment, ":/dtk/declarative/shaders/quickitemviewport.frag"); #endif #else setShaderFileName(QSGMaterialShader::VertexStage, QStringLiteral(":/dtk/declarative/shaders_ng/quickitemviewport.vert.qsb")); setShaderFileName(QSGMaterialShader::FragmentStage, QStringLiteral(":/dtk/declarative/shaders_ng/quickitemviewport.frag.qsb")); #endif } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) void TextureMaterialShader::updateState(const QSGMaterialShader::RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) { Q_ASSERT(oldEffect == nullptr || newEffect->type() == oldEffect->type()); #if QT_CONFIG(opengl) if (state.isOpacityDirty()) program()->setUniformValue(m_opacity_id, state.opacity()); #endif OpaqueTextureMaterialShader::updateState(state, newEffect, oldEffect); } void TextureMaterialShader::initialize() { OpaqueTextureMaterialShader::initialize(); #if QT_CONFIG(opengl) m_opacity_id = program()->uniformLocation("opacity"); #endif } #else enum Ubuf2 { opacitySize = 4, opacityOffset = Ubuf::SourceScaleOffset + Ubuf::SourceScaleSize, }; bool TextureMaterialShader::updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) { Q_ASSERT(oldMaterial == nullptr || newMaterial->type() == oldMaterial->type()); bool changed = OpaqueTextureMaterialShader::updateUniformData(state, newMaterial, oldMaterial); QByteArray *buf = state.uniformData(); Q_ASSERT(buf->size() >= opacityOffset + opacitySize); if (state.isOpacityDirty()) { const float opacity = state.opacity(); memcpy(buf->data() + opacityOffset, &opacity, opacitySize); changed = true; } return changed; } #endif MaskEffectNode::MaskEffectNode() : m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4) , m_texCoordMode(QSGDefaultImageNode::NoTransform) , m_isAtlasTexture(false) , m_ownsTexture(false) { setGeometry(&m_geometry); setMaterial(&m_material); setOpaqueMaterial(&m_opaque_material); m_material.setMipmapFiltering(QSGTexture::None); m_opaque_material.setMipmapFiltering(QSGTexture::None); } MaskEffectNode::~MaskEffectNode() { if (m_ownsTexture) delete m_material.texture(); } void MaskEffectNode::setFiltering(QSGTexture::Filtering filtering) { if (m_material.filtering() == filtering) return; m_material.setFiltering(filtering); m_opaque_material.setFiltering(filtering); markDirty(DirtyMaterial); } QSGTexture::Filtering MaskEffectNode::filtering() const { return m_material.filtering(); } void MaskEffectNode::setMipmapFiltering(QSGTexture::Filtering filtering) { if (m_material.mipmapFiltering() == filtering) return; m_material.setMipmapFiltering(filtering); m_opaque_material.setMipmapFiltering(filtering); markDirty(DirtyMaterial); } QSGTexture::Filtering MaskEffectNode::mipmapFiltering() const { return m_material.mipmapFiltering(); } void MaskEffectNode::setAnisotropyLevel(QSGTexture::AnisotropyLevel level) { if (m_material.anisotropyLevel() == level) return; m_material.setAnisotropyLevel(level); m_opaque_material.setAnisotropyLevel(level); markDirty(DirtyMaterial); } void MaskEffectNode::setMaskTexture(QSGTexture *texture) { if (texture == m_material.maskTexture()) return; m_material.setMaskTexture(texture); m_opaque_material.setMaskTexture(texture); markDirty(DirtyMaterial); } void MaskEffectNode::setMaskScale(QVector2D maskScale) { if (maskScale == m_material.maskScale()) return; m_material.setMaskScale(maskScale); m_opaque_material.setMaskScale(maskScale); markDirty(DirtyMaterial); } void MaskEffectNode::setMaskOffset(QVector2D maskOffset) { if (m_material.maskOffset() == maskOffset) return; m_material.setMaskOffset(maskOffset); m_opaque_material.setMaskOffset(maskOffset); markDirty(DirtyMaterial); } void MaskEffectNode::setSourceScale(QVector2D sourceScale) { if (sourceScale == m_material.sourceScale()) return; m_material.setSourceScale(sourceScale); m_opaque_material.setSourceScale(sourceScale); markDirty(DirtyMaterial); } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) void MaskEffectNode::setCompositionMode(QPainter::CompositionMode mode) { if (m_compositionMode == mode) return; m_compositionMode = mode; QSGMaterialShader::GraphicsPipelineState::BlendFactor srcColor = QSGMaterialShader::GraphicsPipelineState::BlendFactor::One; QSGMaterialShader::GraphicsPipelineState::BlendFactor dstColor = QSGMaterialShader::GraphicsPipelineState::BlendFactor::OneMinusSrcAlpha; switch (mode) { case QPainter::CompositionMode_Source: dstColor = QSGMaterialShader::GraphicsPipelineState::BlendFactor::Zero; break; case QPainter::CompositionMode_Destination: srcColor = QSGMaterialShader::GraphicsPipelineState::BlendFactor::Zero; dstColor = QSGMaterialShader::GraphicsPipelineState::BlendFactor::One; break; case QPainter::CompositionMode_DestinationOver: srcColor = QSGMaterialShader::GraphicsPipelineState::BlendFactor::OneMinusDstAlpha; dstColor = QSGMaterialShader::GraphicsPipelineState::BlendFactor::One; break; case QPainter::CompositionMode_Clear: srcColor = QSGMaterialShader::GraphicsPipelineState::BlendFactor::Zero; dstColor = QSGMaterialShader::GraphicsPipelineState::BlendFactor::Zero; break; default: break; } m_material.setBlendSrcColor(srcColor); m_material.setBlendDstColor(dstColor); m_opaque_material.setBlendSrcColor(srcColor); m_opaque_material.setBlendDstColor(dstColor); markDirty(DirtyForceUpdate); } #endif QSGTexture::AnisotropyLevel MaskEffectNode::anisotropyLevel() const { return m_material.anisotropyLevel(); } void MaskEffectNode::setRect(const QRectF &r) { if (m_rect == r) return; m_rect = r; rebuildGeometry(&m_geometry, texture(), m_rect, m_sourceRect, m_texCoordMode); markDirty(DirtyGeometry); } QRectF MaskEffectNode::rect() const { return m_rect; } void MaskEffectNode::setSourceRect(const QRectF &r) { if (m_sourceRect == r) return; m_sourceRect = r; rebuildGeometry(&m_geometry, texture(), m_rect, m_sourceRect, m_texCoordMode); markDirty(DirtyGeometry); } QRectF MaskEffectNode::sourceRect() const { return m_sourceRect; } void MaskEffectNode::setTexture(QSGTexture *texture) { Q_ASSERT(texture); DirtyState dirty = DirtyMaterial; if (m_material.texture() == texture) { markDirty(dirty); return; } if (m_ownsTexture) delete m_material.texture(); m_material.setTexture(texture); m_opaque_material.setTexture(texture); rebuildGeometry(&m_geometry, texture, m_rect, m_sourceRect, m_texCoordMode); bool wasAtlas = m_isAtlasTexture; m_isAtlasTexture = texture->isAtlasTexture(); if (wasAtlas || m_isAtlasTexture) dirty |= DirtyGeometry; markDirty(dirty); } QSGTexture *MaskEffectNode::texture() const { return m_material.texture(); } void MaskEffectNode::setTextureCoordinatesTransform(TextureCoordinatesTransformMode mode) { if (m_texCoordMode == mode) return; m_texCoordMode = mode; rebuildGeometry(&m_geometry, texture(), m_rect, m_sourceRect, m_texCoordMode); markDirty(DirtyMaterial); } QSGDefaultImageNode::TextureCoordinatesTransformMode MaskEffectNode::textureCoordinatesTransform() const { return m_texCoordMode; } void MaskEffectNode::setOwnsTexture(bool owns) { m_ownsTexture = owns; } bool MaskEffectNode::ownsTexture() const { return m_ownsTexture; } QSGMaterialType *TextureMaterial::type() const { static QSGMaterialType type; return &type; } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QSGMaterialShader *TextureMaterial::createShader() const { return new TextureMaterialShader; } #else QSGMaterialShader *TextureMaterial::createShader(QSGRendererInterface::RenderMode renderMode) const { Q_UNUSED(renderMode) #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) return new TextureMaterialShader(viewCount()); #else return new TextureMaterialShader; #endif } #endif int TextureMaterial::compare(const QSGMaterial *o) const { return OpaqueTextureMaterial::compare(o); } QSGMaterialType *OpaqueTextureMaterial::type() const { static QSGMaterialType type; return &type; } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QSGMaterialShader *OpaqueTextureMaterial::createShader() const { return new OpaqueTextureMaterialShader; } #else QSGMaterialShader *OpaqueTextureMaterial::createShader(QSGRendererInterface::RenderMode renderMode) const { Q_UNUSED(renderMode) #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) return new OpaqueTextureMaterialShader(viewCount()); #else return new OpaqueTextureMaterialShader; #endif } #endif int OpaqueTextureMaterial::compare(const QSGMaterial *o) const { Q_ASSERT(o && type() == o->type()); return Q_UNLIKELY(o == this) ? 0 : 1; } void OpaqueTextureMaterial::setMaskTexture(QSGTexture *texture) { Q_ASSERT(texture); if (!m_maskTexture) { m_maskTexture = texture; return; } if (!texture || !m_maskTexture) return; #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) if (texture->textureId() == m_maskTexture->textureId()) return; #else // TODO support vulkan auto sourceTextureId = (m_maskTexture->nativeInterface())->nativeTexture(); auto targetTextureId = (texture->nativeInterface())->nativeTexture(); if (sourceTextureId == targetTextureId) return; #endif m_maskTexture = texture; } void OpaqueTextureMaterial::setMaskScale(QVector2D maskScale) { if (maskScale == m_maskScale) return; m_maskScale = maskScale; } void OpaqueTextureMaterial::setMaskOffset(QVector2D maskOffset) { if (maskOffset == m_maskOffset) return; m_maskOffset = maskOffset; } void OpaqueTextureMaterial::setSourceScale(QVector2D sourceScale) { if (sourceScale == m_sourceScale) return; m_sourceScale = sourceScale; } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) void OpaqueTextureMaterial::setBlendSrcColor(QSGMaterialShader::GraphicsPipelineState::BlendFactor factor) { if (m_blendSrcColor == factor) return; m_blendSrcColor = factor; } void OpaqueTextureMaterial::setBlendDstColor(QSGMaterialShader::GraphicsPipelineState::BlendFactor factor) { if (m_blendDstColor == factor) return; m_blendDstColor = factor; } #endif DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dmaskeffectnode_p.h000066400000000000000000000102001476226662700226620ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DMASKEFFECTNODE_P_H #define DMASKEFFECTNODE_P_H #include "private/qsgtexturematerial_p.h" #include #include #include #include DQUICK_BEGIN_NAMESPACE class OpaqueTextureMaterial : public QSGOpaqueTextureMaterial { public: QSGMaterialType *type() const override; #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QSGMaterialShader *createShader() const override; #else QSGMaterialShader *createShader(QSGRendererInterface::RenderMode renderMode) const override; #endif int compare(const QSGMaterial *other) const override; void setMaskTexture(QSGTexture *texture); QSGTexture *maskTexture() const { return m_maskTexture.data(); } void setMaskScale(QVector2D maskScale); QVector2D maskScale() const { return m_maskScale; } void setMaskOffset(QVector2D maskOffset); QVector2D maskOffset() const { return m_maskOffset; } void setSourceScale(QVector2D sourceScale); QVector2D sourceScale() const { return m_sourceScale; } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QSGMaterialShader::GraphicsPipelineState::BlendFactor blendSrcColor() const { return m_blendSrcColor; } QSGMaterialShader::GraphicsPipelineState::BlendFactor blendDstColor() const { return m_blendDstColor; } void setBlendSrcColor(QSGMaterialShader::GraphicsPipelineState::BlendFactor factor); void setBlendDstColor(QSGMaterialShader::GraphicsPipelineState::BlendFactor factor); #endif private: QPointer m_maskTexture = nullptr; QVector2D m_maskScale; QVector2D m_maskOffset; QVector2D m_sourceScale; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QSGMaterialShader::GraphicsPipelineState::BlendFactor m_blendSrcColor = QSGMaterialShader::GraphicsPipelineState::One; QSGMaterialShader::GraphicsPipelineState::BlendFactor m_blendDstColor = QSGMaterialShader::GraphicsPipelineState::OneMinusSrcAlpha; #endif }; class TextureMaterial : public OpaqueTextureMaterial { public: QSGMaterialType *type() const override; #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QSGMaterialShader *createShader() const override; #else QSGMaterialShader *createShader(QSGRendererInterface::RenderMode renderMode) const override; #endif int compare(const QSGMaterial *other) const override; }; class MaskEffectNode : public QSGImageNode { public: MaskEffectNode(); ~MaskEffectNode() override; void setRect(const QRectF &rect) override; QRectF rect() const override; void setSourceRect(const QRectF &r) override; QRectF sourceRect() const override; void setTexture(QSGTexture *texture) override; QSGTexture *texture() const override; void setFiltering(QSGTexture::Filtering filtering) override; QSGTexture::Filtering filtering() const override; void setMipmapFiltering(QSGTexture::Filtering filtering) override; QSGTexture::Filtering mipmapFiltering() const override; void setTextureCoordinatesTransform(TextureCoordinatesTransformMode mode) override; TextureCoordinatesTransformMode textureCoordinatesTransform() const override; void setOwnsTexture(bool owns) override; bool ownsTexture() const override; void setAnisotropyLevel(QSGTexture::AnisotropyLevel level); void setMaskTexture(QSGTexture *texture); void setMaskScale(QVector2D maskScale); void setMaskOffset(QVector2D maskOffset); void setSourceScale(QVector2D sourceScale); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) void setCompositionMode(QPainter::CompositionMode mode); #endif QSGTexture::AnisotropyLevel anisotropyLevel() const; private: QSGGeometry m_geometry; OpaqueTextureMaterial m_opaque_material; TextureMaterial m_material; QRectF m_rect; QRectF m_sourceRect; TextureCoordinatesTransformMode m_texCoordMode; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QPainter::CompositionMode m_compositionMode = QPainter::CompositionMode_SourceOver; #endif uint m_isAtlasTexture : 1; uint m_ownsTexture : 1; }; DQUICK_END_NAMESPACE #endif // DMASKEFFECTNODE_P_H dtkdeclarative-5.7.12/src/private/dmessagemanager.cpp000066400000000000000000000210361476226662700227100ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dmessagemanager_p.h" #include #include #include #include DQUICK_BEGIN_NAMESPACE FloatingMessageContainer::FloatingMessageContainer(QObject *parent) : QObject(parent) { } QQuickItem *FloatingMessageContainer::panel() const { return m_panel; } QVariant FloatingMessageContainer::message() const { return m_message; } void FloatingMessageContainer::setMessage(const QVariant &message) { if (m_message == message) return; m_message = message; Q_EMIT messageChanged(); } void FloatingMessageContainer::setPanel(QQuickItem *panel) { m_panel = panel; } int FloatingMessageContainer::duration() const { return m_duration; } void FloatingMessageContainer::setDuration(int duration) { if (m_duration == duration) return; m_duration = duration; Q_EMIT durationChanged(); } bool FloatingMessageContainer::immediateClose() const { return m_immediateClose; } void FloatingMessageContainer::setImmediateClose(bool immediateClose) { if (m_immediateClose == immediateClose) return; m_immediateClose = immediateClose; } void FloatingMessageContainer::close() { if (auto manager = qobject_cast(parent())) { manager->close(this); } } QString FloatingMessageContainer::messageId() const { return m_msgId; } void FloatingMessageContainer::setMessageId(const QString &msgId) { m_msgId = msgId; } MessageManager::MessageManager(QQuickWindow *parent) : QObject(parent) , m_delegate(nullptr) , m_layout(nullptr) { } QQuickWindow *MessageManager::window() const { return qobject_cast(parent()); } bool MessageManager::sendMessage(const QString &content, const QString &iconName, int duration, const QString &msgId) { ensureDelegate(); QVariantMap message {{"content", content}, {"iconName", iconName}}; return sendMessage(m_delegate, message, duration, msgId); } bool MessageManager::sendMessage(QQmlComponent *delegate, const QVariant &message, int duration, const QString &msgId) { if (FloatingMessageContainer *container = replaceMessage(msgId)) { container->setMessage(message); return true; } if (duration >= 0 && reachedUpperLimit()) return false; auto container = beginCreateMessage(delegate); container->setMessageId(msgId); container->setMessage(message); container->setDuration(duration); endCreateMessage(delegate, container); return true; } void MessageManager::close(FloatingMessageContainer *message) { message->panel()->setParentItem(nullptr); message->deleteLater(); // centralized removal to avoid dangling pointer in m_timers. for (auto iter = m_timers.begin(); iter != m_timers.end();) { if (iter->second == message) { iter = m_timers.erase(iter); break; } else { iter++; } } } void MessageManager::close(const QString &msgId) { if (msgId.isEmpty() || !m_layout) return; for (auto item : messages(msgId)) { item->close(); } } void MessageManager::setCapacity(int capacity) { m_capacity = capacity; } int MessageManager::count() const { return m_layout ? m_layout->childItems().count() : 0; } QList MessageManager::messages(const QString &msgId) const { QList result; for (auto item : children()) { auto container = qobject_cast(item); if (!container) continue; if (msgId == container->messageId()) result.push_back(container); } return result; } void MessageManager::setLayout(QQuickItem *layout) { if (m_layout == layout) return; if (m_layout) { disconnect(m_layout, &QQuickItem::childrenChanged, this, &MessageManager::countChanged); m_layout->deleteLater(); } m_layout = layout; QQmlEngine::setObjectOwnership(m_layout, QQmlEngine::CppOwnership); m_layout->setParent(this); connect(m_layout, &QQuickItem::childrenChanged, this, &MessageManager::countChanged); if (window()) { m_layout->setParentItem(window()->contentItem()); } } void MessageManager::ensureLayout() { if (!m_layout) { QQmlComponent columnCom(qmlEngine(parent())); columnCom.setData("import QtQuick 2.11\n" "Column {\n" " spacing: 0\n" " anchors {\n" " bottom: parent.bottom\n" " bottomMargin: 20;\n" " horizontalCenter: parent.horizontalCenter\n" " }\n" "}\n", QUrl()); auto layout = columnCom.beginCreate(qmlContext(parent())); setLayout(qobject_cast(layout)); columnCom.completeCreate(); } } void MessageManager::ensureDelegate() { if (!m_delegate) { QQmlComponent *com = new QQmlComponent(qmlEngine(parent())); com->setData("import org.deepin.dtk 1.0 as D\n" "D.FloatingMessage {}\n", QUrl()); setDelegate(com); } } bool MessageManager::reachedUpperLimit() const { return m_timers.count() >= m_capacity; } FloatingMessageContainer *MessageManager::replaceMessage(const QString &msgId) { if (msgId.isEmpty()) return nullptr; for (int i = 0; i < m_timers.size(); ++i) { auto &item = m_timers[i]; if (item.second && item.second->messageId() == msgId) { // restart timer for the quickitem. killTimer(item.first); auto message = item.second; int duration = message->duration(); int timerId = startTimer(duration); item.first = timerId; stackBeforeMessage(message->panel()); return message; } } return nullptr; } void MessageManager::stackBeforeMessage(QQuickItem *message) { // `message` should be top in layout. const auto &childItems = m_layout->childItems(); if (childItems.count() > 1 && childItems.front() != message) { message->stackBefore(childItems.first()); } } FloatingMessageContainer *MessageManager::beginCreateMessage(QQmlComponent *component) { // create new quickitem. ensureLayout(); auto context = component->creationContext(); if (!context) { context = qmlContext(parent()); } auto message = qobject_cast(component->beginCreate(context)); Q_ASSERT_X(message, __FUNCTION__, qPrintable(component->errorString())); message->panel()->setParentItem(m_layout); /* Need to recode the `MessageManager` for closing. `MessageManager` maybe can't be find by window because of window changing. */ message->setParent(this); return message; } void MessageManager::endCreateMessage(QQmlComponent *component, FloatingMessageContainer *container) { component->completeCreate(); int duration = container->duration(); if (duration > 0) { int timerId = startTimer(duration); m_timers.append(qMakePair(timerId, container)); } stackBeforeMessage(container->panel()); } void MessageManager::setDelegate(QQmlComponent *delegate) { if (m_delegate == delegate) return; if (m_delegate) m_delegate->deleteLater(); m_delegate = delegate; QQmlEngine::setObjectOwnership(m_delegate, QQmlEngine::CppOwnership); m_delegate->setParent(this); } int MessageManager::capacity() const { return m_capacity; } void MessageManager::timerEvent(QTimerEvent *e) { for (auto item : m_timers) { if (item.first != e->timerId()) continue; killTimer(e->timerId()); e->accept(); if (auto container = item.second) { if (container->immediateClose()) { close(container); } else { Q_EMIT container->delayClose(); } } break; } QObject::timerEvent(e); } QQuickItem *MessageManager::layout() const { return m_layout; } QQmlComponent *MessageManager::delegate() const { return m_delegate; } MessageManager *MessageManager::qmlAttachedProperties(QObject *object) { if (QQuickWindow *window = qobject_cast(object)) return new MessageManager(window); return nullptr; } DQUICK_END_NAMESPACE #include "moc_dmessagemanager_p.cpp" dtkdeclarative-5.7.12/src/private/dmessagemanager_p.h000066400000000000000000000070651476226662700227020ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include DQUICK_BEGIN_NAMESPACE class MessageManager; class FloatingMessageContainer : public QObject { Q_OBJECT Q_PROPERTY(QQuickItem *panel READ panel WRITE setPanel) Q_PROPERTY(QVariant message READ message WRITE setMessage NOTIFY messageChanged) Q_PROPERTY(int duration READ duration WRITE setDuration NOTIFY durationChanged) Q_PROPERTY(bool immediateClose READ immediateClose WRITE setImmediateClose) Q_CLASSINFO("DefaultProperty", "panel") #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(FloatingMessageContainer) #endif public: explicit FloatingMessageContainer(QObject *parent = nullptr); QVariant message() const; void setMessage(const QVariant &message); QQuickItem *panel() const; void setPanel(QQuickItem *panel); QString messageId() const; void setMessageId(const QString &msgId); int duration() const; void setDuration(int duration); bool immediateClose() const; void setImmediateClose(bool immediateClose); public Q_SLOT: void close(); Q_SIGNALS: void messageChanged(); void durationChanged(); void delayClose(); private: friend MessageManager; QQuickItem *m_panel = nullptr; QVariant m_message; QString m_msgId; int m_duration = 4000; bool m_immediateClose = false; }; class MessageManager : public QObject { Q_OBJECT Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate) Q_PROPERTY(QQuickItem *layout READ layout WRITE setLayout) Q_PROPERTY(int capacity READ capacity WRITE setCapacity) Q_PROPERTY(int count READ count NOTIFY countChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_UNCREATABLE("MessageManager Attached.") QML_NAMED_ELEMENT(MessageManager) QML_ATTACHED(MessageManager) #endif public: explicit MessageManager(QQuickWindow *parent = nullptr); QQuickWindow *window() const; QQmlComponent *delegate() const; void setDelegate(QQmlComponent *delegate); QQuickItem *layout() const; void setLayout(QQuickItem * layout); int capacity() const; void setCapacity(int capacity); int count() const; QList messages(const QString &msgId) const; static MessageManager *qmlAttachedProperties(QObject *object); public Q_SLOTS: bool sendMessage(const QString &content, const QString &iconName = QString(), int duration = 4000, const QString &msgId = QString()); bool sendMessage(QQmlComponent *delegate, const QVariant &message, int duration = 4000, const QString &msgId = QString()); void close(DTK_QUICK_NAMESPACE::FloatingMessageContainer *message); void close(const QString &msgId); Q_SIGNALS: void countChanged(); protected: virtual void timerEvent(QTimerEvent *e) override; private: void ensureLayout(); void ensureDelegate(); bool reachedUpperLimit() const; FloatingMessageContainer *replaceMessage(const QString &msgId); void stackBeforeMessage(QQuickItem *message); FloatingMessageContainer *beginCreateMessage(QQmlComponent *component); void endCreateMessage(QQmlComponent *component, FloatingMessageContainer *container); private: QQmlComponent *m_delegate; QQuickItem *m_layout; QList> m_timers; int m_capacity = 3; }; DQUICK_END_NAMESPACE QML_DECLARE_TYPEINFO(DTK_QUICK_NAMESPACE::MessageManager, QML_HAS_ATTACHED_PROPERTIES) dtkdeclarative-5.7.12/src/private/dobjectmodelproxy.cpp000066400000000000000000000220711476226662700233220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dobjectmodelproxy_p.h" #include #include #include DQUICK_BEGIN_NAMESPACE #ifndef QT_DEBUG Q_LOGGING_CATEGORY(cfLog, "dtk.quick.core" , QtInfoMsg); #else Q_LOGGING_CATEGORY(cfLog, "dtk.quick.core"); #endif template class Compositor { public: using OriginIndex = int; using CurrentIndex = int; ~Compositor() {} CurrentIndex itemIndex(QObject *item) const { const OriginIndex originIndex = dataItems.indexOf(item); if (originIndex != -1) { return currentDatas.indexOf(datas[originIndex]); } return -1; } CurrentIndex itemIndex(OriginIndex originIndex) const { if (datas.count() <= originIndex || originIndex < 0) { return -1; } return currentDatas.indexOf(datas[originIndex]); } inline QObject *object(CurrentIndex index) const { if (index < 0 || index >= currentDatas.count()) return nullptr; return dataItems[originIndex(index)]; } inline const QVector &objects() const { return currentDatas; } inline void setObject(CurrentIndex index, QObject *obj) { dataItems[originIndex(index)] = obj; } void reset(const QVector &now) { currentDatas.clear(); datas = now; dataItems.fill(nullptr, datas.count()); } CurrentIndex insert(DataType *group) { const OriginIndex index = originIndex(group); for (int i = 0; i < currentDatas.count(); ++i) { // find insert position by origin order. if (index <= originIndex(currentDatas[i])) { currentDatas.insert(i, group); return i; } } currentDatas.append(group); return currentDatas.count() - 1; } CurrentIndex remove(DataType *group) { const CurrentIndex index = currentDatas.indexOf(group); if (index != -1) { currentDatas.remove(index); } return index; } public: inline OriginIndex originIndex(CurrentIndex index) const { return originIndex(currentDatas[index]); } inline OriginIndex originIndex(DataType *group) const { return datas.indexOf(group); } // origin data QVector datas; // QuickItem for each origin data QVector dataItems; // display data QVector currentDatas; }; class ObjectModelProxyPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(ObjectModelProxy) public: explicit ObjectModelProxyPrivate() { } virtual ~ObjectModelProxyPrivate() override; const QVector &datas() const { return compositor.objects(); } bool isAcceptedItem(const QJSValueList &args) { if (!filterAcceptsItem.isCallable()) return true; const auto &result = filterAcceptsItem.call(args); if (result.isError()) { qCWarning(cfLog) << "ObjectModelProxy::isAcceptedItem() failed: can't call filterAcceptsItem." << result.toString(); return false; } return result.toBool(); } void reset(const QVector &datas) { Q_Q(ObjectModelProxy); compositor.reset(datas); QQmlChangeSet changeSet; const auto engine = qmlEngine(q); if (!engine) return; for (auto item :compositor.datas) { auto argu1 = engine->newQObject(item); const bool accept = isAcceptedItem({argu1}); if (accept) { auto currIndex = compositor.insert(item); changeSet.insert(currIndex, 1); } } if (!changeSet.isEmpty()) { Q_EMIT q->modelUpdated(changeSet, true); Q_EMIT q->countChanged(); } } void update() { Q_Q(ObjectModelProxy); QQmlChangeSet changeSet; auto objects = compositor.objects(); const auto engine = qmlEngine(q); for (auto item :compositor.datas) { const bool exists = objects.contains(item); auto argu1 = engine->newQObject(item); const bool accept = isAcceptedItem({argu1}); if (accept && !exists) { auto currIndex = compositor.insert(item); changeSet.insert(currIndex, 1); } else if (!accept && exists) { auto currIndex = compositor.remove(item); changeSet.remove(currIndex, 1); } } if (!changeSet.isEmpty()) { Q_Q(ObjectModelProxy); Q_EMIT q->modelUpdated(changeSet, false); Q_EMIT q->countChanged(); } } QQmlObjectModel *impl = nullptr; Compositor compositor; QJSValue filterAcceptsItem; }; ObjectModelProxyPrivate::~ObjectModelProxyPrivate() {} ObjectModelProxy::ObjectModelProxy(QObject *parent) : QQmlInstanceModel (*(new ObjectModelProxyPrivate()), parent) { } bool ObjectModelProxy::isValid() const { Q_D(const ObjectModelProxy); return d->impl; } int ObjectModelProxy::count() const { Q_D(const ObjectModelProxy); return d->datas().count(); } #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) QVariant ObjectModelProxy::variantValue(int index, const QString &name) { Q_D(ObjectModelProxy); const auto &datas = d->datas(); if (index < 0 || index >= datas.count()) return QString(); return QQmlEngine::contextForObject(datas.at(index))->contextProperty(name); } QQmlInstanceModel::ReleaseFlags ObjectModelProxy::release(QObject *object, ReusableFlag reusableFlag) { Q_UNUSED(reusableFlag); Q_D(const ObjectModelProxy); if (d->compositor.itemIndex(object) >= 0) { return QQmlInstanceModel::Referenced; } return ReleaseFlags(); } #else QString ObjectModelProxy::stringValue(int index, const QString &name) { Q_D(ObjectModelProxy); const auto &datas = d->datas(); if (index < 0 || index >= datas.count()) return QString(); return QQmlEngine::contextForObject(datas.at(index))->contextProperty(name).toString(); } QQmlInstanceModel::ReleaseFlags ObjectModelProxy::release(QObject *object) { Q_D(const ObjectModelProxy); if (d->compositor.itemIndex(object) >= 0) { return QQmlInstanceModel::Referenced; } return nullptr; } #endif void ObjectModelProxy::setWatchedRoles(const QList &roles) { Q_UNUSED(roles); } QQmlIncubator::Status ObjectModelProxy::incubationStatus(int index) { Q_D(ObjectModelProxy); if (d->compositor.object(index)) { return QQmlIncubator::Ready; } return QQmlIncubator::Loading; } int ObjectModelProxy::indexOf(QObject *object, QObject *objectContext) const { Q_UNUSED(objectContext) Q_D(const ObjectModelProxy); return d->compositor.itemIndex(object); } QObject *ObjectModelProxy::object(int index, QQmlIncubator::IncubationMode incubationMode) { Q_D(ObjectModelProxy); if (auto obj = d->compositor.object(index)) return obj; auto originIndex = d->compositor.originIndex(index); auto item = d->impl->object(originIndex, incubationMode); d->compositor.setObject(index, item); return item; } QQmlObjectModel *ObjectModelProxy::sourceModel() const { Q_D(const ObjectModelProxy); return d->impl; } QJSValue ObjectModelProxy::filterAcceptsItem() const { Q_D(const ObjectModelProxy); return d->filterAcceptsItem; } void ObjectModelProxy::update() { Q_D(ObjectModelProxy); d->update(); } QObject *ObjectModelProxy::get(const int i) const { Q_D(const ObjectModelProxy); if (count() <= i || i < 0) return nullptr; return d->datas().at(i); } int ObjectModelProxy::mapToSource(const int i) const { Q_D(const ObjectModelProxy); if (count() <= i || i < 0) return -1; return d->compositor.originIndex(i); } int ObjectModelProxy::mapFromSource(const int i) const { Q_D(const ObjectModelProxy); return d->compositor.itemIndex(i); } void ObjectModelProxy::setFilterAcceptsItem(QJSValue filterAcceptsItem) { Q_D(ObjectModelProxy); if (!filterAcceptsItem.isCallable() || d->filterAcceptsItem.equals(filterAcceptsItem)) return; d->filterAcceptsItem = filterAcceptsItem; Q_EMIT filterAcceptsItemChanged(); } void ObjectModelProxy::syncDataFromItem() { Q_D(ObjectModelProxy); QVector items; for (int i = 0; i < d->impl->count(); ++i) { if (auto item = qobject_cast(d->impl->get(i))) { items << item; } } d->reset(items); } void ObjectModelProxy::setSourceModel(QQmlObjectModel *sourceModel) { Q_D(ObjectModelProxy); if (d->impl) { disconnect(d->impl, &QQmlObjectModel::countChanged, this, &ObjectModelProxy::syncDataFromItem); } d->impl = sourceModel; syncDataFromItem(); connect(d->impl, &QQmlObjectModel::countChanged, this, &ObjectModelProxy::syncDataFromItem); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dobjectmodelproxy_p.h000066400000000000000000000037451476226662700233150ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include DQUICK_BEGIN_NAMESPACE class ObjectModelProxyPrivate; class ObjectModelProxy : public QQmlInstanceModel { Q_OBJECT Q_PROPERTY(QQmlObjectModel *sourceModel READ sourceModel WRITE setSourceModel) Q_PROPERTY(QJSValue filterAcceptsItem READ filterAcceptsItem WRITE setFilterAcceptsItem NOTIFY filterAcceptsItemChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(ObjectModelProxy) #endif public: explicit ObjectModelProxy(QObject *parent = nullptr); public: bool isValid() const override; virtual QObject *object(int index, QQmlIncubator::IncubationMode incubationMode) override; virtual int count() const override; #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) virtual QVariant variantValue(int index, const QString &name) override; virtual ReleaseFlags release(QObject *object, ReusableFlag reusableFlag = NotReusable) override; #else virtual QString stringValue(int index, const QString &name) override; virtual ReleaseFlags release(QObject *object) override; #endif virtual void setWatchedRoles(const QList &roles) override; virtual QQmlIncubator::Status incubationStatus(int index) override; virtual int indexOf(QObject *object, QObject *objectContext) const override; QQmlObjectModel *sourceModel() const; void setSourceModel(QQmlObjectModel * sourceModel); QJSValue filterAcceptsItem() const; void setFilterAcceptsItem(QJSValue filterAcceptsItem); public Q_SLOTS: void update(); QObject *get(const int i) const; int mapToSource(const int i) const; int mapFromSource(const int i) const; private Q_SLOTS: void syncDataFromItem(); Q_SIGNALS: void filterAcceptsItemChanged(); private: Q_DECLARE_PRIVATE(ObjectModelProxy) }; DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dopacitymasknode.cpp000066400000000000000000000041461476226662700231260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dopacitymasknode.h" #include #include #include #include DQUICK_BEGIN_NAMESPACE DSoftwareOpacityMaskNode::DSoftwareOpacityMaskNode(QSGTextureProvider *source, QSGTextureProvider *maskSource) : DSoftwareEffectRenderNode(source) , m_maskProvider(maskSource) { m_maskImage = updateCachedImage(m_maskProvider); if (m_maskProvider) { connect(m_maskProvider, &QSGTextureProvider::textureChanged, this, &DSoftwareOpacityMaskNode::onMaskTextureChanged, Qt::DirectConnection); } } void DSoftwareOpacityMaskNode::setInvert(bool invert) { if (invert == m_invert) return; m_invert = invert; markChanged(); } void DSoftwareOpacityMaskNode::sync(QQuickItem *item) { m_item = item; m_width = item->width(); m_height = item->height(); return DSoftwareEffectRenderNode::sync(item); } QImage DSoftwareOpacityMaskNode::process(const QImage &sourceImage, QPainter::RenderHints hints) { if (Q_UNLIKELY(sourceImage.isNull() || m_maskImage.isNull() || sourceImage.rect() != m_maskImage.rect())) return QImage(); QImage render(sourceImage); QPainter painter(&render); painter.setRenderHints(hints); painter.setPen(Qt::NoPen); if (Q_UNLIKELY(!m_invert)) { painter.setCompositionMode(QPainter::CompositionMode_DestinationIn); } else { painter.setCompositionMode(QPainter::CompositionMode_DestinationOut); } painter.drawImage(rect(), m_maskImage, m_maskImage.rect()); painter.end(); return render; } void DSoftwareOpacityMaskNode::preprocess() { if (m_maskProvider && updateTexture(m_maskProvider->texture())) markChanged(); return DSoftwareEffectRenderNode::preprocess(); } void DSoftwareOpacityMaskNode::onMaskTextureChanged() { QImage maskImage = updateCachedImage(m_maskProvider); if (maskImage != m_maskImage) { m_maskImage = maskImage; markChanged(); } } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dopacitymasknode.h000066400000000000000000000020661476226662700225720ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DOPACITYMASKNODE_H #define DOPACITYMASKNODE_H #include "dsoftwareeffectrendernode.h" #include DQUICK_BEGIN_NAMESPACE class DSoftwareOpacityMaskNode : public DSoftwareEffectRenderNode { Q_OBJECT public: explicit DSoftwareOpacityMaskNode(QSGTextureProvider *source, QSGTextureProvider *maskSource); void setInvert(bool invert); QRectF rect() const override { return QRect(0, 0, static_cast(m_width), static_cast(m_height)); } void sync(QQuickItem *item) override; QImage process(const QImage &sourceImage, QPainter::RenderHints hints) override; void preprocess() override; private Q_SLOTS: void onMaskTextureChanged(); private: bool m_invert = false; qreal m_width = 0; qreal m_height = 0; QQuickItem *m_item = nullptr; QImage m_maskImage; QPointer m_maskProvider = nullptr; }; DQUICK_END_NAMESPACE #endif // DOPACITYMASKNODE_H dtkdeclarative-5.7.12/src/private/dplatformthemeproxy_p.h000066400000000000000000000011401476226662700236600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DPLATFORMTHEMEPROXY_P_H #define DPLATFORMTHEMEPROXY_P_H #include #include #include #include "dplatformthemeproxy.h" DQUICK_BEGIN_NAMESPACE class DPlatformThemeProxyPrivate : public DTK_CORE_NAMESPACE::DObjectPrivate { public: DPlatformThemeProxyPrivate(DPlatformThemeProxy *qq); DPlatformTheme *proxy; private: D_DECLARE_PUBLIC(DPlatformThemeProxy) }; DQUICK_END_NAMESPACE #endif // DPLATFORMTHEMEPROXY_P_H dtkdeclarative-5.7.12/src/private/dpopupwindowhandle.cpp000066400000000000000000000172641476226662700235100ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #define protected public #include "dpopupwindowhandle_p.h" #include #include #include DCORE_USE_NAMESPACE DQUICK_BEGIN_NAMESPACE // className prepend string of QT_NAMESPACE if existed. bool inheritsTheClassType(QObject *object, QString className) { #if defined(QT_NAMESPACE) #define D_GET_NAMESPACE_STR_IMPL(M) #M "::" #define D_GET_NAMESPACE_STR(M) D_GET_NAMESPACE_STR_IMPL(M) className.prepend(D_GET_NAMESPACE_STR(QT_NAMESPACE)); #undef D_GET_NAMESPACE_STR #undef D_GET_NAMESPACE_STR_IMPL #endif return object && object->inherits(qPrintable(className)); } static inline bool shouldCreatePopupWindowForMode(const DQMLGlobalObject::PopupMode mode) { switch (mode) { case DQMLGlobalObject::WindowMode: return true; case DQMLGlobalObject::EmbedMode: return false; case DQMLGlobalObject::AutoMode: // TODO https://github.com/linuxdeepin/dtk/issues/70 if (qEnvironmentVariableIsEmpty("D_POPUP_MODE")) return false; return qEnvironmentVariable("D_POPUP_MODE") != "embed"; } return false; } DQMLGlobalObject::PopupMode DPopupWindowHandle::m_popupMode = DQMLGlobalObject::AutoMode; DPopupWindowHandle::DPopupWindowHandle(QObject *parent) : QObject (parent) { // after `autoWindowMode` property initialized to createHandle. connect(popup(), SIGNAL(windowChanged(QQuickWindow *)), this, SLOT(createHandle())); } DPopupWindowHandle::~DPopupWindowHandle() { } DPopupWindowHandle *DPopupWindowHandle::qmlAttachedProperties(QObject *object) { if (!inheritsTheClassType(object, "QQuickPopup")) return nullptr; return new DPopupWindowHandle(object); } void DPopupWindowHandle::setPopupMode(const DQMLGlobalObject::PopupMode mode) { m_popupMode = mode; } QQuickWindow *DPopupWindowHandle::window() const { return m_handle ? m_handle->window() : nullptr; } QQmlComponent *DPopupWindowHandle::delegate() const { return m_delegate; } void DPopupWindowHandle::setDelegate(QQmlComponent *delegate) { m_delegate = delegate; } bool DPopupWindowHandle::forceWindowMode() const { return m_forceWindowMode; } void DPopupWindowHandle::setForceWindowMode(bool forceWindowMode) { if (m_forceWindowMode == forceWindowMode) return; m_forceWindowMode = forceWindowMode; if (!m_forceWindowMode && m_handle) { m_handle.reset(); Q_EMIT windowChanged(); } if (m_forceWindowMode) { // try to create handle. createHandle(); } } void DPopupWindowHandle::createHandle() { if (!needCreateHandle()) return; auto window = qobject_cast(m_delegate->create(m_delegate->creationContext())); Q_ASSERT(window); m_handle.reset(new DPopupWindowHandleImpl(window, popup())); Q_EMIT windowChanged(); } bool DPopupWindowHandle::needCreateHandle() const { // has created. if (m_handle) return false; // no delegate. if (!m_delegate) { if (m_forceWindowMode) qWarning() << "delegate don't set but forceWindowMode has been set."; return false; } // forceWindowMode > `D_POPUP_MODE` > popupMode return m_forceWindowMode || shouldCreatePopupWindowForMode(m_popupMode); } QObject *DPopupWindowHandle::popup() const { return parent(); } // it's not to call QQuickPopupItem's reposition when handle is positioning. static constexpr char const *PopupWindowHandlePointer = "_d_popup_window_handle"; static inline void popupGeometryChanged(QQuickItem *obj, const QRectF &newGeometry, const QRectF &oldGeometry) { DPopupWindowHandleImpl *handle = obj->property(PopupWindowHandlePointer).value(); Q_ASSERT(handle); if (!handle->isPositioning()) { // only in `reposition` to override virtual function. #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) DVtableHook::callOriginalFun(obj, &QQuickItem::geometryChanged, newGeometry, oldGeometry); #else DVtableHook::callOriginalFun(obj, &QQuickItem::geometryChange, newGeometry, oldGeometry); #endif } } static inline void popupUpdatePolish(QQuickItem *obj) { DPopupWindowHandleImpl *handle = obj->property(PopupWindowHandlePointer).value(); Q_ASSERT(handle); if (handle->isPositioning()) { // avoid to call original function in `reposition`. handle->setPositioning(false); } else { // only sepcial scene to override virtual function. DVtableHook::callOriginalFun(obj, &QQuickItem::updatePolish); } } DPopupWindowHandleImpl::DPopupWindowHandleImpl(QQuickWindow *window, QObject *parent) : QObject(parent) , m_window(window) , m_popup(parent) { Q_ASSERT(popupItem()); connect(popup(), SIGNAL(opened()), this, SLOT(reposition())); popupItem()->setProperty(PopupWindowHandlePointer, QVariant::fromValue(this)); // geometryChanged would call reposition of `PopupItem`. #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) DVtableHook::overrideVfptrFun(popupItem(), &QQuickItem::geometryChanged, &popupGeometryChanged); #else DVtableHook::overrideVfptrFun(popupItem(), &QQuickItem::geometryChange, &popupGeometryChanged); #endif // updatePolish would call reposition of `PopupItem`. DVtableHook::overrideVfptrFun(popupItem(), &QQuickItem::updatePolish, &popupUpdatePolish); // TODO QML Window with Qt::Popup flag not behaving correctly (QTBUG-69777) connect(m_window, &QWindow::activeChanged, this, &DPopupWindowHandleImpl::close); connect(popup(), SIGNAL(closed()), this, SLOT(close())); } DPopupWindowHandleImpl::~DPopupWindowHandleImpl() { QQuickItem *item = popupItem(); if (item) { // reset original virtual function. #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) DVtableHook::resetVfptrFun(item, &QQuickItem::geometryChanged); #else DVtableHook::resetVfptrFun(item, &QQuickItem::geometryChange); #endif DVtableHook::resetVfptrFun(item, &QQuickItem::updatePolish); disconnect(item, nullptr, this, nullptr); } disconnect(popup(), nullptr, this, nullptr); disconnect(m_window, nullptr, this, nullptr); m_window->deleteLater(); m_window = nullptr; } QQuickWindow *DPopupWindowHandleImpl::window() const { return m_window; } QObject *DPopupWindowHandleImpl::popup() const { return m_popup; } QQuickItem *DPopupWindowHandleImpl::popupItem() const { for (auto item : popup()->children()) { if (inheritsTheClassType(item, "QQuickPopupItem")) return qobject_cast(item); } return nullptr; } bool DPopupWindowHandleImpl::isPositioning() const { return m_positioning; } void DPopupWindowHandleImpl::setPositioning(bool positioning) { m_positioning = positioning; } void DPopupWindowHandleImpl::reposition() { if (isPositioning()) return; setPositioning(true); m_window->resize(popupItem()->size().toSize()); // set window's position to origin popupItem' leftTop position. m_window->setPosition(popupItem()->mapToGlobal(QPoint(0, 0)).toPoint()); // reset popupItem's position to window's contentItem leftTop position. popupItem()->setPosition(m_window->contentItem()->position()); popupItem()->setParentItem(m_window->contentItem()); m_window->show(); m_window->requestActivate(); } void DPopupWindowHandleImpl::close() { if (!m_window->isActive() || !popup()->property("visible").toBool()) { m_window->hide(); // window hide but popup's visible is true, and it effects popup next open. popup()->setProperty("visible", false); } } DQUICK_END_NAMESPACE #include "moc_dpopupwindowhandle_p.cpp" dtkdeclarative-5.7.12/src/private/dpopupwindowhandle_p.h000066400000000000000000000044231476226662700234650ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include "dqmlglobalobject_p.h" QT_BEGIN_NAMESPACE class QQuickWindow; class QQuickItem; QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class DPopupWindowHandleImpl; class Q_DECL_EXPORT DPopupWindowHandle : public QObject { Q_OBJECT Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate) Q_PROPERTY(QQuickWindow *window READ window NOTIFY windowChanged) Q_PROPERTY(bool forceWindowMode READ forceWindowMode WRITE setForceWindowMode) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_UNCREATABLE("PopupWindow Attached.") QML_NAMED_ELEMENT(PopupHandle) QML_ATTACHED(DPopupWindowHandle) #endif public: explicit DPopupWindowHandle(QObject *parent = nullptr); ~DPopupWindowHandle() override; static DPopupWindowHandle *qmlAttachedProperties(QObject *object); static void setPopupMode(const DQMLGlobalObject::PopupMode mode); QQuickWindow *window() const; QQmlComponent *delegate() const; void setDelegate(QQmlComponent *delegate); bool forceWindowMode() const; void setForceWindowMode(bool forceWindowMode); Q_SIGNALS: void windowChanged(); private Q_SLOTS: void createHandle(); private: QObject *popup() const; bool needCreateHandle() const; private: bool m_forceWindowMode = false; bool m_isWindowMode = false; QQmlComponent *m_delegate = nullptr; QScopedPointer m_handle; static DQMLGlobalObject::PopupMode m_popupMode; }; class DPopupWindowHandleImpl : public QObject { Q_OBJECT public: explicit DPopupWindowHandleImpl(QQuickWindow *window, QObject *parent); ~DPopupWindowHandleImpl() override; QQuickWindow *window() const; QObject *popup() const; QQuickItem *popupItem() const; void updatePosition(); bool isPositioning() const; void setPositioning(bool positioning); private Q_SLOTS: void reposition(); void close(); private: QQuickWindow *m_window = nullptr; QObject *m_popup = nullptr; bool m_positioning = false; }; DQUICK_END_NAMESPACE QML_DECLARE_TYPEINFO(DTK_QUICK_NAMESPACE::DPopupWindowHandle, QML_HAS_ATTACHED_PROPERTIES) dtkdeclarative-5.7.12/src/private/dqmlglobalobject.cpp000066400000000000000000000430561476226662700231000ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #define private public #include #undef private #include "dqmlglobalobject_p.h" #include "dqmlglobalobject_p_p.h" #include "dquickcontrolpalette_p.h" #include "dquickdciicon_p.h" #include "dquickimageprovider_p.h" #include "dmessagemanager_p.h" #include "dpopupwindowhandle_p.h" #include "dquickglobal_p.h" #include #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #include #endif #ifdef Q_OS_UNIX #include #include #include #include #endif DGUI_USE_NAMESPACE DQUICK_BEGIN_NAMESPACE // ###(zccrs): The offset must greater than QColor::Spec #define VARIANT_COLOR_TYPE_OFFSET 100 DColor::DColor(Type type) { data.color.type = type + VARIANT_COLOR_TYPE_OFFSET; } bool DColor::isValid() const noexcept { return isTypedColor() ? data.color.type > VARIANT_COLOR_TYPE_OFFSET : data.color.value.isValid(); } bool DColor::isTypedColor() const noexcept { return data.color.type >= VARIANT_COLOR_TYPE_OFFSET; } quint8 DColor::type() const noexcept { if (!isTypedColor()) return DColor::Invalid; return data.color.type - VARIANT_COLOR_TYPE_OFFSET; } static inline QPalette::ColorRole toPaletteColorRole(quint8 type) { auto color = static_cast(type - VARIANT_COLOR_TYPE_OFFSET); if (color == DColor::Highlight) return QPalette::Highlight; if (color == DColor::HighlightedText) return QPalette::HighlightedText; return QPalette::NoRole; } bool DColor::operator==(const DColor &c) const noexcept { if (data.color.type != c.data.color.type) return false; if (!isTypedColor() && data.color.value != c.data.color.value) return false; return data.hue == c.data.hue && data.saturation == c.data.saturation && data.lightness == c.data.lightness && data.opacity == c.data.opacity; } bool DColor::operator!=(const DColor &c) const noexcept { return !operator ==(c); } QColor DColor::toColor(const QPalette &palette) const { QColor color = isTypedColor() ? palette.color(toPaletteColorRole(data.color.type)) : data.color.value; return DGuiApplicationHelper::adjustColor(color, data.hue, data.saturation, data.lightness, 0, 0, 0, data.opacity); } QColor DColor::color() const { Q_ASSERT(!isTypedColor()); return DGuiApplicationHelper::adjustColor(data.color.value, data.hue, data.saturation, data.lightness, 0, 0, 0, data.opacity); } DColor DColor::hue(qint8 floatValue) const { DColor newColor = *this; newColor.data.hue += floatValue; return newColor; } DColor DColor::saturation(qint8 floatValue) const { DColor newColor = *this; newColor.data.saturation += floatValue; return newColor; } DColor DColor::lightness(qint8 floatValue) const { DColor newColor = *this; newColor.data.lightness += floatValue; return newColor; } DColor DColor::opacity(qint8 floatValue) const { DColor newColor = *this; newColor.data.opacity += floatValue; return newColor; } DQMLGlobalObjectPrivate::DQMLGlobalObjectPrivate(DQMLGlobalObject *qq) : DTK_CORE_NAMESPACE::DObjectPrivate(qq) { } void DQMLGlobalObjectPrivate::ensurePalette() { if (paletteInit) return; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) quickPalette = new QQuickPalette(q_func()); inactiveQuickPalette = new QQuickPalette(q_func()); #endif paletteInit = true; updatePalettes(); QObject::connect(DGuiApplicationHelper::instance(), SIGNAL(applicationPaletteChanged()), q_func(), SLOT(_q_onPaletteChanged())); } void DQMLGlobalObjectPrivate::updatePalettes() { palette = DGuiApplicationHelper::instance()->applicationPalette(); for (int i = 0; i < QPalette::NColorRoles; ++i) { QPalette::ColorRole role = static_cast(i); inactivePalette.setBrush(QPalette::All, role, palette.brush(QPalette::Inactive, role)); // The QML control will set the opacity property to 0.4 on the disabled state // The palette don't need set color for the QPalette::Disabled group. palette.setBrush(QPalette::All, role, palette.brush(QPalette::Active, role)); } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) quickPalette->fromQPalette(palette); inactiveQuickPalette->fromQPalette(inactivePalette); #endif } void DQMLGlobalObjectPrivate::_q_onPaletteChanged() { updatePalettes(); Q_EMIT q_func()->paletteChanged(); Q_EMIT q_func()->inactivePaletteChanged(); } void DQMLGlobalObjectPrivate::ensureWebsiteInfo() { DCORE_USE_NAMESPACE; if (deepinWebsiteName.isEmpty() || deepinWebsiteLink.isEmpty()) { const auto &deepinWebsiteInfo = DSysInfo::distributionOrgWebsite(DSysInfo::Distribution); deepinWebsiteName = deepinWebsiteInfo.first; deepinWebsiteLink = deepinWebsiteInfo.second; } } DQMLGlobalObject::DQMLGlobalObject(QObject *parent) : QObject(parent) , DTK_CORE_NAMESPACE::DObject(*new DQMLGlobalObjectPrivate(this)) { auto pHelper = DWindowManagerHelper::instance(); connect(pHelper, &DWindowManagerHelper::hasBlurWindowChanged, this, &DQMLGlobalObject::hasBlurWindowChanged); connect(pHelper, &DWindowManagerHelper::hasCompositeChanged, this, &DQMLGlobalObject::hasCompositeChanged); connect(pHelper, &DWindowManagerHelper::hasNoTitlebarChanged, this, &DQMLGlobalObject::hasNoTitlebarChanged); auto pAppHelper = DGuiApplicationHelper::instance(); connect(pAppHelper, &DGuiApplicationHelper::themeTypeChanged, this, &DQMLGlobalObject::themeTypeChanged); } DQMLGlobalObject::~DQMLGlobalObject() { } bool DQMLGlobalObject::hasBlurWindow() const { return DWindowManagerHelper::instance()->hasBlurWindow(); } bool DQMLGlobalObject::hasComposite() const { return DWindowManagerHelper::instance()->hasComposite(); } bool DQMLGlobalObject::hasNoTitlebar() const { return DWindowManagerHelper::instance()->hasNoTitlebar(); } bool DQMLGlobalObject::hasAnimation() { return DGuiApplicationHelper::testAttribute(DGuiApplicationHelper::HasAnimations); } bool DQMLGlobalObject::isSoftwareRender() { static bool isSoftware = QQuickWindow::sceneGraphBackend() == QLatin1String("software"); return isSoftware; } QString DQMLGlobalObject::windowManagerNameString() const { return DWindowManagerHelper::instance()->windowManagerNameString(); } DGuiApplicationHelper::ColorType DQMLGlobalObject::themeType() const { return DGuiApplicationHelper::instance()->themeType(); } DWindowManagerHelper::WMName DQMLGlobalObject::windowManagerName() const { return DWindowManagerHelper::instance()->windowManagerName(); } DPlatformThemeProxy *DQMLGlobalObject::platformTheme() const { D_DC(DQMLGlobalObject); if (!d->platformTheme) { d->platformTheme = new DPlatformThemeProxy(DGuiApplicationHelper::instance()->applicationTheme(), const_cast(this)); } return d->platformTheme; } DFontManager *DQMLGlobalObject::fontManager() const { // qml中只能识别非const的指针属性 return const_cast(DGuiApplicationHelper::instance()->fontManager()); } QPalette DQMLGlobalObject::palette() const { D_DC(DQMLGlobalObject); const_cast(d)->ensurePalette(); return d->palette; } QPalette DQMLGlobalObject::inactivePalette() const { D_DC(DQMLGlobalObject); const_cast(d)->ensurePalette(); return d->inactivePalette; } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QQuickPalette *DQMLGlobalObject::quickPalette() const { D_DC(DQMLGlobalObject); const_cast(d)->ensurePalette(); return d->quickPalette; } QQuickPalette *DQMLGlobalObject::inactiveQuickPalette() const { D_DC(DQMLGlobalObject); const_cast(d)->ensurePalette(); return d->inactiveQuickPalette; } #endif QColor DQMLGlobalObject::blendColor(const QColor &substrate, const QColor &superstratum) { return DGuiApplicationHelper::blendColor(substrate, superstratum); } DColor DQMLGlobalObject::makeColor(DColor::Type type) { return DColor(type); } DColor DQMLGlobalObject::makeColor(const QColor &color) { return DColor(color); } QUrl DQMLGlobalObject::makeShadowImageUrl(qreal boxSize, qreal cornerRadius, qreal shadowBlur, QColor color, qreal xOffset, qreal yOffset, qreal spread, bool hollow, bool inner) { return makeShadowImageUrl(boxSize, cornerRadius, cornerRadius, cornerRadius, cornerRadius, shadowBlur, color, xOffset, yOffset, spread, hollow, inner); } QUrl DQMLGlobalObject::makeShadowImageUrl(qreal boxSize, qreal topLeftRadius, qreal topRightRadius, qreal bottomLeftRadius, qreal bottomRightRadius, qreal shadowBlur, QColor color, qreal xOffset, qreal yOffset, qreal spread, bool hollow, bool inner) { return DQuickShadowProvider::toUrl(boxSize, topLeftRadius, topRightRadius, bottomLeftRadius, bottomRightRadius, shadowBlur, color, xOffset, yOffset, spread, hollow, inner); } DGuiApplicationHelper::ColorType DQMLGlobalObject::toColorType(const QColor &color) { return DGuiApplicationHelper::toColorType(color); } QColor DQMLGlobalObject::selectColor(const QColor &windowColor, const QColor &light, const QColor &dark) { if (toColorType(windowColor) == DGuiApplicationHelper::DarkType) { return dark; } else { return light; } } QString DQMLGlobalObject::deepinWebsiteName() const { D_DC(DQMLGlobalObject); const_cast(d)->ensureWebsiteInfo(); return d->deepinWebsiteName; } QString DQMLGlobalObject::deepinWebsiteLink() const { D_DC(DQMLGlobalObject); const_cast(d)->ensureWebsiteInfo(); return d->deepinWebsiteLink; } QString DQMLGlobalObject::deepinDistributionOrgLogo() const { DCORE_USE_NAMESPACE; D_DC(DQMLGlobalObject); if (d->deepinDistributionOrgLogo.isEmpty()) { const auto &logo = DSysInfo::distributionOrgLogo(DSysInfo::Distribution, DSysInfo::Light, ":/assets/images/deepin-logo.svg"); const_cast(d)->deepinDistributionOrgLogo = logo; } return d->deepinDistributionOrgLogo; } QPoint DQMLGlobalObject::cursorPosition() const { return QCursor::pos(); } DQuickDciIcon DQMLGlobalObject::makeIcon(const QJSValue &qicon, const QJSValue &iconExtra) { if (!qicon.isObject() || !iconExtra.isObject()) { ThrowError(this, QStringLiteral("The arguments is not valid JavaScript object")); return {}; } const QString &name = qicon.property("name").toString(); int width = qicon.property("width").toInt(); int height = qicon.property("height").toInt(); const QColor &color = qicon.property("color").toVariant().value(); const QUrl &source = qicon.property("source").toVariant().value(); DQuickDciIcon dciIcon; int mode = iconExtra.property("mode").toInt(); int theme = iconExtra.property("theme").toInt(); const auto fallbackToQIcon = iconExtra.property("fallbackToQIcon"); if (fallbackToQIcon.isBool()) { dciIcon.setFallbackToQIcon(fallbackToQIcon.toBool()); } DDciIconPalette palette; palette.setForeground(color); auto paletteProp = iconExtra.property("palette"); if (paletteProp.isObject()) { QColor foreground = qvariant_cast(paletteProp.property("foreground").toVariant()); if (!foreground.isValid()) foreground = color; QColor background = qvariant_cast(paletteProp.property("background").toVariant()); QColor highlight = qvariant_cast(paletteProp.property("highlight").toVariant()); QColor highlightForeground = qvariant_cast(paletteProp.property("highlightForeground").toVariant()); palette.setForeground(foreground); palette.setBackground(background); palette.setHighlightForeground(highlightForeground); palette.setHighlight(highlight); } dciIcon.setName(name); dciIcon.setWidth(width); dciIcon.setHeight(height); dciIcon.setMode(ControlState(mode)); dciIcon.setTheme(DGuiApplicationHelper::ColorType(theme)); dciIcon.setPalette(palette); dciIcon.setSource(source); return dciIcon; } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) DDciIconPalette DQMLGlobalObject::makeIconPalette(const QPalette &palette) { DDciIconPalette iconPalette; iconPalette.setForeground(palette.color(QPalette::WindowText)); iconPalette.setBackground(palette.color(QPalette::Window)); iconPalette.setHighlight(palette.color(QPalette::Highlight)); iconPalette.setHighlightForeground(palette.color(QPalette::HighlightedText)); return iconPalette; } #else DDciIconPalette DQMLGlobalObject::makeIconPalette(const QQuickPalette *palette) { DDciIconPalette iconPalette; iconPalette.setForeground(palette->windowText()); iconPalette.setBackground(palette->window()); iconPalette.setHighlight(palette->highlight()); iconPalette.setHighlightForeground(palette->highlightedText()); return iconPalette; } #endif bool DQMLGlobalObject::sendMessage(QObject *target, const QString &content, const QString &iconName, int duration, const QString &msgId) { Q_ASSERT(target); QQuickWindow *window = nullptr; if (auto item = qobject_cast(target)) { window = item->window(); } else { window = qobject_cast(target); } if (window) { if (auto manager = qobject_cast(qmlAttachedPropertiesObject(window))) { return manager->sendMessage(content, iconName, duration, msgId); } } return false; } bool DQMLGlobalObject::sendMessage(QObject *target, QQmlComponent *delegate, const QVariant &message, int duration, const QString &msgId) { Q_ASSERT(target); QQuickWindow *window = nullptr; if (auto item = qobject_cast(target)) { window = item->window(); } else { window = qobject_cast(target); } if (window) { if (auto manager = qobject_cast(qmlAttachedPropertiesObject(window))) return manager->sendMessage(delegate, message, duration, msgId); } return false; } void DQMLGlobalObject::closeMessage(FloatingMessageContainer *message) { Q_ASSERT(message); message->close(); } void DQMLGlobalObject::closeMessage(QObject *target, const QString &msgId) { Q_ASSERT(target); if (msgId.isEmpty()) return; QQuickWindow *window = nullptr; if (auto item = qobject_cast(target)) { window = item->window(); } else { window = qobject_cast(target); } if (window) { if (auto manager = qobject_cast(qmlAttachedPropertiesObject(window))) manager->close(msgId); } } void DQMLGlobalObject::sendSystemMessage(const QString &summary, const QString &body, const QString &appIcon, const QStringList &actions, const QVariantMap hints, const int timeout, const uint replaceId) { QDBusPendingCall reply = DTK_CORE_NAMESPACE::DUtil::DNotifySender(summary) .appName(qAppName()) .appIcon(appIcon) .appBody(body) .actions(actions) .hints(hints) .replaceId(replaceId) .timeOut(timeout) .call(); auto watcher = new QDBusPendingCallWatcher(reply, this); connect(watcher, &QDBusPendingCallWatcher::finished, this, [](QDBusPendingCallWatcher* watcher){ if (watcher->isError()) qWarning() << "DQMLGlobalObject::sendSystemMessage: send system message error" << watcher->error(); watcher->deleteLater(); }); } void DQMLGlobalObject::setPopupMode(const PopupMode mode) { DPopupWindowHandle::setPopupMode(mode); } bool DQMLGlobalObject::loadTranslator() { DCORE_USE_NAMESPACE; QList translateDirs; const QString dtkdeclarativeTranslationPath(DDECLARATIVE_TRANSLATIONS_DIR); //("/home/user/.local/share", "/usr/local/share", "/usr/share") auto dataDirs = DStandardPaths::standardLocations(QStandardPaths::GenericDataLocation); for (const auto &path : dataDirs) { DPathBuf DPathBuf(path); translateDirs << (DPathBuf / dtkdeclarativeTranslationPath).toString(); } #ifdef DTK_STATIC_TRANSLATION translateDirs << QString(":/dtk/translations"); #endif return DGuiApplicationHelper::loadTranslator("dtkdeclarative", translateDirs, QList() << QLocale::system()); } #if QT_VERSION_MAJOR > 5 QSGRootNode *DQMLGlobalObject::getRootNode(QQuickItem *item) { const auto d = QQuickItemPrivate::get(item); QSGNode *root = d->itemNode(); if (!root) return nullptr; while (root->firstChild() && root->type() != QSGNode::RootNodeType) root = root->firstChild(); return root->type() == QSGNode::RootNodeType ? static_cast(root) : nullptr; } int &DQMLGlobalObject::QSGNode_subtreeRenderableCount(QSGNode *node) { return node->m_subtreeRenderableCount; } QSGNode *&DQMLGlobalObject::QSGNode_firstChild(QSGNode *node) { return node->m_firstChild; } QSGNode *&DQMLGlobalObject::QSGNode_lastChild(QSGNode *node) { return node->m_lastChild; } QSGNode *&DQMLGlobalObject::QSGNode_parent(QSGNode *node) { return node->m_parent; } #endif DQUICK_END_NAMESPACE #include "moc_dqmlglobalobject_p.cpp" dtkdeclarative-5.7.12/src/private/dqmlglobalobject_p.h000066400000000000000000000234131476226662700230570ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQMLGLOBALOBJECT_P_H #define DQMLGLOBALOBJECT_P_H #include #include #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #endif #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QT_BEGIN_NAMESPACE class QQuickPalette; QT_END_NAMESPACE #endif DGUI_BEGIN_NAMESPACE class DFontManager; DGUI_END_NAMESPACE DGUI_USE_NAMESPACE DQUICK_BEGIN_NAMESPACE class DColor { Q_GADGET #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_VALUE_TYPE(dcolor) #endif public: enum Type : quint8 { Invalid = 0, Highlight, HighlightedText }; Q_ENUM(Type) DColor() {} inline DColor(const QColor &color) { data.color.value = color; } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) DColor(const QJSValue ¶ms) : DColor(QColor(params.toString())) { } #endif DColor(Type type); inline DColor(const DColor &other) { memcpy(static_cast(&data), static_cast(&other.data), sizeof(Data)); } inline DColor(DColor &&other) { operator =(other); } [[nodiscard]] bool isValid() const noexcept; [[nodiscard]] bool isTypedColor() const noexcept; [[nodiscard]] quint8 type() const noexcept; bool operator==(const DColor &c) const noexcept; bool operator!=(const DColor &c) const noexcept; inline DColor &operator=(const QColor &color) { data.color.value = color; return *this; } inline DColor &operator=(const DColor &other) { memcpy(static_cast(&data), static_cast(&other.data), sizeof(Data)); return *this; } inline DColor &operator=(DColor &&other) { data.hue = std::move(other.data.hue); data.saturation = std::move(other.data.saturation); data.lightness = std::move(other.data.lightness); data.opacity = std::move(other.data.opacity); data.color.value = std::move(other.data.color.value); return *this; } Q_INVOKABLE QColor toColor(const QPalette &palette) const; Q_INVOKABLE QColor color() const; Q_INVOKABLE DTK_QUICK_NAMESPACE::DColor hue(qint8 floatValue) const; Q_INVOKABLE DTK_QUICK_NAMESPACE::DColor saturation(qint8 floatValue) const; Q_INVOKABLE DTK_QUICK_NAMESPACE::DColor lightness(qint8 floatValue) const; Q_INVOKABLE DTK_QUICK_NAMESPACE::DColor opacity(qint8 floatValue) const; private: struct Data { qint8 hue = 0; qint8 saturation = 0; qint8 lightness = 0; qint8 opacity = 0; union Color { #ifdef Q_COMPILER_UNIFORM_INIT Color() {} // doesn't init anything, thus can't be constexpr #endif quint8 type; // DQMLGlobalObject::TypedColor QColor value = QColor(); } color; } data; }; class DQuickDciIcon; class FloatingMessageContainer; class DQMLGlobalObjectPrivate; class DQMLGlobalObject : public QObject, public DTK_CORE_NAMESPACE::DObject { Q_OBJECT Q_PROPERTY(bool hasBlurWindow READ hasBlurWindow NOTIFY hasBlurWindowChanged) Q_PROPERTY(bool hasComposite READ hasComposite NOTIFY hasCompositeChanged) Q_PROPERTY(bool hasNoTitlebar READ hasNoTitlebar NOTIFY hasNoTitlebarChanged) Q_PROPERTY(bool hasAnimation READ hasAnimation NOTIFY hasAnimationChanged) Q_PROPERTY(bool isSoftwareRender READ isSoftwareRender FINAL CONSTANT) Q_PROPERTY(DTK_GUI_NAMESPACE::DWindowManagerHelper::WMName windowManagerName READ windowManagerName CONSTANT) Q_PROPERTY(DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType themeType READ themeType NOTIFY themeTypeChanged) Q_PROPERTY(QString windowManagerNameString READ windowManagerNameString CONSTANT) Q_PROPERTY(DPlatformThemeProxy *platformTheme READ platformTheme FINAL CONSTANT) Q_PROPERTY(DTK_GUI_NAMESPACE::DFontManager *fontManager READ fontManager FINAL CONSTANT) #if QT_VERSION <= QT_VERSION_CHECK(6, 0, 0) Q_PROPERTY(QPalette palette READ palette NOTIFY paletteChanged) Q_PROPERTY(QPalette inactivePalette READ inactivePalette NOTIFY inactivePaletteChanged) #else Q_PROPERTY(QQuickPalette* palette READ quickPalette NOTIFY paletteChanged) Q_PROPERTY(QQuickPalette* inactivePalette READ inactiveQuickPalette NOTIFY inactivePaletteChanged) #endif Q_PROPERTY(QString deepinDistributionOrgLogo READ deepinDistributionOrgLogo CONSTANT) Q_PROPERTY(QString deepinWebsiteName READ deepinWebsiteName CONSTANT) Q_PROPERTY(QString deepinWebsiteLink READ deepinWebsiteLink CONSTANT) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(DTK) QML_SINGLETON #endif public: explicit DQMLGlobalObject(QObject *parent = nullptr); ~DQMLGlobalObject() override; static DQMLGlobalObject *create(QQmlEngine *qmlEngine, QJSEngine *jsEngine) { Q_UNUSED(qmlEngine) Q_UNUSED(jsEngine) return new DQMLGlobalObject; } enum ControlState { NormalState, HoveredState, PressedState, DisabledState, InactiveState }; Q_ENUM(ControlState) enum ZOrder { BottomOrder = -99, BelowOrder = -1, NormalOrder = 0, AboveOrder = 1, TopOrder = 99 }; Q_ENUM(ZOrder) enum PopupMode { AutoMode, WindowMode, EmbedMode }; Q_ENUM(PopupMode) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) enum class CompositionMode { Source = QPainter::CompositionMode_Source, SourceOver = QPainter::CompositionMode_SourceOver, Destination = QPainter::CompositionMode_Destination, DestinationOver = QPainter::CompositionMode_DestinationOver, Clear = QPainter::CompositionMode_Clear, }; Q_ENUM(CompositionMode) #endif bool hasBlurWindow() const; bool hasComposite() const; bool hasNoTitlebar() const; static bool hasAnimation(); static bool isSoftwareRender(); DWindowManagerHelper::WMName windowManagerName() const; QString windowManagerNameString() const; DGuiApplicationHelper::ColorType themeType() const; DPlatformThemeProxy *platformTheme() const; DFontManager *fontManager() const; QPalette palette() const; QPalette inactivePalette() const; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QQuickPalette *quickPalette() const; QQuickPalette *inactiveQuickPalette() const; #endif Q_INVOKABLE QColor blendColor(const QColor &substrate, const QColor &superstratum); Q_INVOKABLE DTK_QUICK_NAMESPACE::DColor makeColor(DTK_QUICK_NAMESPACE::DColor::Type type); Q_INVOKABLE DTK_QUICK_NAMESPACE::DColor makeColor(const QColor &color); Q_INVOKABLE QUrl makeShadowImageUrl(qreal boxSize, qreal cornerRadius, qreal shadowBlur, QColor color, qreal xOffset, qreal yOffset, qreal spread, bool hollow, bool inner); Q_INVOKABLE QUrl makeShadowImageUrl(qreal boxSize, qreal topLeftRadius, qreal topRightRadius, qreal bottomLeftRadius, qreal bottomRightRadius, qreal shadowBlur, QColor color, qreal xOffset, qreal yOffset, qreal spread, bool hollow, bool inner); Q_INVOKABLE DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType toColorType(const QColor &color); Q_INVOKABLE QColor selectColor(const QColor &windowColor, const QColor &light, const QColor &dark); QString deepinWebsiteName() const; QString deepinWebsiteLink() const; QString deepinDistributionOrgLogo() const; Q_INVOKABLE QPoint cursorPosition() const; Q_INVOKABLE DTK_QUICK_NAMESPACE::DQuickDciIcon makeIcon(const QJSValue &qicon, const QJSValue &iconExtra); #if QT_VERSION <= QT_VERSION_CHECK(6, 0, 0) Q_INVOKABLE DTK_GUI_NAMESPACE::DDciIconPalette makeIconPalette(const QPalette &palette); #else Q_INVOKABLE DTK_GUI_NAMESPACE::DDciIconPalette makeIconPalette(const QQuickPalette *palette); #endif Q_INVOKABLE bool sendMessage(QObject *target, const QString &content, const QString &iconName = QString(), int duration = 4000, const QString &msgId = QString()); Q_INVOKABLE bool sendMessage(QObject *target, QQmlComponent *delegate, const QVariant &message, int duration = 4000, const QString &msgId = QString()); Q_INVOKABLE void closeMessage(DTK_QUICK_NAMESPACE::FloatingMessageContainer *message); Q_INVOKABLE void closeMessage(QObject *target, const QString &msgId); Q_INVOKABLE void sendSystemMessage(const QString &summary, const QString &body = QString(), const QString &appIcon = QString(), const QStringList &actions = QStringList(), const QVariantMap hints = QVariantMap(), const int timeout = 3000, const uint replaceId = 0); static void setPopupMode(const PopupMode mode); static bool loadTranslator(); #if QT_VERSION_MAJOR > 5 static QSGRootNode *getRootNode(QQuickItem *item); static int &QSGNode_subtreeRenderableCount(QSGNode *node); static QSGNode* &QSGNode_firstChild(QSGNode *node); static QSGNode* &QSGNode_lastChild(QSGNode *node); static QSGNode* &QSGNode_parent(QSGNode *node); #endif Q_SIGNALS: void hasBlurWindowChanged(); void hasCompositeChanged(); void hasNoTitlebarChanged(); void hasAnimationChanged(); void paletteChanged(); void inactivePaletteChanged(); void themeTypeChanged(DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType themeType); private: D_DECLARE_PRIVATE(DQMLGlobalObject) D_PRIVATE_SLOT(void _q_onPaletteChanged()) }; DQUICK_END_NAMESPACE Q_DECLARE_METATYPE(DTK_QUICK_NAMESPACE::DColor) #endif // DQMLGLOBALOBJECT_P_H dtkdeclarative-5.7.12/src/private/dqmlglobalobject_p_p.h000066400000000000000000000020621476226662700233730ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQMLGLOBALOBJECT_P_P_H #define DQMLGLOBALOBJECT_P_P_H #include #include #include #include "dqmlglobalobject_p.h" DQUICK_BEGIN_NAMESPACE class DQMLGlobalObjectPrivate : public DTK_CORE_NAMESPACE::DObjectPrivate { public: DQMLGlobalObjectPrivate(DQMLGlobalObject *qq); void ensurePalette(); void updatePalettes(); void _q_onPaletteChanged(); void ensureWebsiteInfo(); mutable DPlatformThemeProxy *platformTheme = nullptr; bool paletteInit = false; QPalette palette; QPalette inactivePalette; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QQuickPalette *quickPalette = nullptr; QQuickPalette *inactiveQuickPalette = nullptr; #endif QString deepinWebsiteName; QString deepinWebsiteLink; QString deepinDistributionOrgLogo; private: D_DECLARE_PUBLIC(DQMLGlobalObject) }; DQUICK_END_NAMESPACE #endif // DQMLGLOBALOBJECT_P_P_H dtkdeclarative-5.7.12/src/private/dquickapploaderitem.cpp000066400000000000000000000037511476226662700236200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickapploaderitem_p.h" #include DQUICK_BEGIN_NAMESPACE class DQuickAppLoaderItemPrivate : public DCORE_NAMESPACE::DObjectPrivate { D_DECLARE_PUBLIC(DQuickAppLoaderItem) public: DQuickAppLoaderItemPrivate(DQuickAppLoaderItem *qq) : DObjectPrivate(qq) , window(nullptr) , loaded(false) , asynchronous(false) , progress(0) { } QList childrenComponents; QQuickWindow *window; bool loaded; bool asynchronous; qreal progress; }; DQuickAppLoaderItem::DQuickAppLoaderItem(QQuickItem *parentItem) : QQuickItem(parentItem) , DObject(*new DQuickAppLoaderItemPrivate(this)) { } bool DQuickAppLoaderItem::loaded() const { D_DC(DQuickAppLoaderItem); return d->loaded; } void DQuickAppLoaderItem::setLoaded(bool loaded) { D_D(DQuickAppLoaderItem); if (loaded == d->loaded) return; d->loaded = loaded; Q_EMIT loadedChanged(); } qreal DQuickAppLoaderItem::progress() const { D_DC(DQuickAppLoaderItem); return d->progress; } void DQuickAppLoaderItem::setProgress(qreal progress) { D_D(DQuickAppLoaderItem); if (qFuzzyCompare(progress, d->progress)) return; d->progress = progress; Q_EMIT progressChanged(); } QQuickWindow *DQuickAppLoaderItem::window() const { D_DC(DQuickAppLoaderItem); return d->window; } void DQuickAppLoaderItem::setWindow(QQuickWindow *w) { D_D(DQuickAppLoaderItem); if (w == d->window) return; d->window = w; Q_EMIT windowChanged(); } bool DQuickAppLoaderItem::asynchronous() const { D_DC(DQuickAppLoaderItem); return d->asynchronous; } void DQuickAppLoaderItem::setAsynchronous(bool a) { D_D(DQuickAppLoaderItem); if (a == d->asynchronous) return; d->asynchronous = a; Q_EMIT asynchronousChanged(); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickapploaderitem_p.h000066400000000000000000000025211476226662700235760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKAPPLOADERITEM_H #define DQUICKAPPLOADERITEM_H #include #include #include DQUICK_BEGIN_NAMESPACE class DQuickAppLoaderItemPrivate; class DQuickAppLoaderItem : public QQuickItem, public DCORE_NAMESPACE::DObject { Q_OBJECT D_DECLARE_PRIVATE(DQuickAppLoaderItem) Q_PROPERTY(QQuickWindow *window READ window NOTIFY windowChanged) Q_PROPERTY(bool loaded READ loaded NOTIFY loadedChanged) Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged) Q_PROPERTY(bool asynchronous READ asynchronous WRITE setAsynchronous NOTIFY asynchronousChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(AppLoader) #endif public: explicit DQuickAppLoaderItem(QQuickItem *parentItem = nullptr); bool loaded() const; void setLoaded(bool loaded); qreal progress() const; void setProgress(qreal progress); QQuickWindow *window() const; void setWindow(QQuickWindow *w); bool asynchronous() const; void setAsynchronous(bool a); Q_SIGNALS: void loadedChanged(); void progressChanged(); void windowChanged(); void asynchronousChanged(); }; DQUICK_END_NAMESPACE #endif // DQUICKAPPLOADERITEM_H dtkdeclarative-5.7.12/src/private/dquickarrowboxpath.cpp000066400000000000000000000355171476226662700235170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickarrowboxpath_p.h" #include DQUICK_BEGIN_NAMESPACE DQuickArrowBoxPath::DQuickArrowBoxPath(QObject *parent) : QQuickCurve{parent} , m_arrowDirection(Up) , m_width(100) , m_height(100) , m_arrowX(50) , m_arrowY(0) , m_arrowWidth(30) , m_arrowHeight(20) , m_roundedRadius(0) , m_spread(0) { } qreal DQuickArrowBoxPath::width() const { return m_width; } void DQuickArrowBoxPath::setWidth(qreal newWidth) { if (qFuzzyCompare(m_width, newWidth)) return; m_width = newWidth; Q_EMIT widthChanged(); Q_EMIT changed(); } qreal DQuickArrowBoxPath::height() const { return m_height; } void DQuickArrowBoxPath::setHeight(qreal newHeight) { if (qFuzzyCompare(m_height, newHeight)) return; m_height = newHeight; Q_EMIT heightChanged(); Q_EMIT changed(); } const DQuickArrowBoxPath::Direction &DQuickArrowBoxPath::arrowDirection() const { return m_arrowDirection; } void DQuickArrowBoxPath::setArrowDirection(const Direction &newArrowDirection) { if (m_arrowDirection == newArrowDirection) return; m_arrowDirection = newArrowDirection; Q_EMIT arrowDirectionChanged(); Q_EMIT changed(); } qreal DQuickArrowBoxPath::arrowX() const { return m_arrowX; } void DQuickArrowBoxPath::setArrowX(qreal newArrowX) { if (qFuzzyCompare(m_arrowX, newArrowX)) return; m_arrowX = newArrowX; Q_EMIT arrowXChanged(); Q_EMIT changed(); } qreal DQuickArrowBoxPath::arrowY() const { return m_arrowY; } void DQuickArrowBoxPath::setArrowY(qreal newArrowY) { if (qFuzzyCompare(m_arrowY, newArrowY)) return; m_arrowY = newArrowY; Q_EMIT arrowYChanged(); Q_EMIT changed(); } qreal DQuickArrowBoxPath::arrowWidth() const { return m_arrowWidth; } void DQuickArrowBoxPath::setArrowWidth(qreal newArrowWidth) { if (qFuzzyCompare(m_arrowWidth, newArrowWidth)) return; m_arrowWidth = newArrowWidth; Q_EMIT arrowWidthChanged(); Q_EMIT changed(); } qreal DQuickArrowBoxPath::arrowHeight() const { return m_arrowHeight; } void DQuickArrowBoxPath::setArrowHeight(qreal newArrowHeight) { if (qFuzzyCompare(m_arrowHeight, newArrowHeight)) return; m_arrowHeight = newArrowHeight; Q_EMIT arrowHeightChanged(); Q_EMIT changed(); } qreal DQuickArrowBoxPath::roundedRadius() const { return m_roundedRadius; } void DQuickArrowBoxPath::setRoundedRadius(qreal newRoundedRadius) { if (qFuzzyCompare(m_roundedRadius, newRoundedRadius)) return; m_roundedRadius = newRoundedRadius; Q_EMIT roundedRadiusChanged(); Q_EMIT changed(); } qreal DQuickArrowBoxPath::spread() const { return m_spread; } void DQuickArrowBoxPath::setSpread(qreal newSpread) { if (qFuzzyCompare(m_spread, newSpread)) return; m_spread = newSpread; Q_EMIT spreadChanged(); Q_EMIT changed(); } // 线段ab的夹角大小 static inline qreal abAngle(qreal a, qreal b, qreal c) { const qreal ab = (pow(a, 2) + pow(b, 2) - pow(c, 2)) / (2 * a * b); return 180 / M_PI * qAcos(ab); } // 两点之间的距离 static inline qreal lineLength(const QPointF &p1, const QPointF &p2) { return sqrt(pow(qAbs(p2.x() - p1.x()), 2) + pow(qAbs(p2.y() - p1.y()), 2)); } /* * 根据传入的三角形顶点和圆的半径,计算三角形两条边线与圆的两个内切点坐标 * * A * ^ * /.\ * / . \ * / . \ * P1 --->╭-------╮<--- P2 * /| r | |\ * / | |O | \ * / ╰-------╯ \ * / . \ * / . \ * B h C * * A B C 为三角形三个顶点 * r 为圆的半径 * O 为圆心 * h 为经过点 A 和点 R 的线段 * P1 为线段 AB 和圆的切点 * P2 为线段 AC 和圆的切点 */ QPair getPointsOfContact(qreal r, const QPointF &A, const QPointF &B, const QPointF &C) { const qreal AB = lineLength(A, B); const qreal AC = lineLength(A, C); // 三角形两条边中的最小值 const qreal min = qMin(AB, AC); // 起点为A,在线段AB上长度为min的点 const QPointF B1(B.x() + (A.x() - B.x()) * (1.0 - min / AB), B.y() + (A.y() - B.y()) * (1.0 - min / AB)); // 起点为A,在线段AB上长度为min的点 const QPointF C1(C.x() + (A.x() - C.x()) * (1.0 - min / AC), C.y() + (A.y() - C.y()) * (1.0 - min / AC)); /* A B1 C1 形成一个等腰三角形 */ // 线段B1 C1的中心点 const QPointF center(B1.x() + (C1.x() - B1.x()) / 2, B1.y() + (C1.y() - B1.y()) / 2); // 点A到线段B1 C1的垂线长度 const qreal H1 = lineLength(A, center); // 线段A P1的长度 const qreal AP1 = H1 * (r / lineLength(B1, center)); const qreal &AP2 = AP1; // 因为是等腰的 QPointF P1, P2; if (AP1 < AB && AP2 < AC) { // 如果点P1和P2均分别落在线段AB和AC上 P1.setX(B.x() + (AP1 / AB) * (A.x() - B.x())); P1.setY(B.y() + (AP1 / AB) * (A.y() - B.y())); P2.setX(C.x() + (AP1 / AC) * (A.x() - C.x())); P2.setY(C.y() + (AP1 / AC) * (A.y() - C.y())); return qMakePair(P1, P2); } else if (AB < AP1 && AC < AP2) { // 如果P1不在线段AB上,也就是在AB的延长线上,则圆应该直接与B点相接 // 如果P2不在线段AC上,也就是在AC的延长线上,则圆应该直接与C点相接 return qMakePair(B, C); } // A 的角度 const qreal AAngle = abAngle(AB, AC, lineLength(B, C)); if (AB < AP1) { P1 = B; /* 已知点P1,计算点P2。设点B做垂线到线段AC的交点为 B2*/ // 线段 B B2 的长度 const qreal BB2 = sin(AAngle) * AB; // 线段 A B2 的长度 const qreal AB2 = cos(AAngle) * AB; // 线段 B2 P2 的长度 const qreal B2P2 = sqrt(pow(r, 2) - pow(r - BB2, 2)); // 线段 A P2 的长度 const qreal AP2 = AB2 + B2P2; P2.setX(A.x() - (AP2 / AC) * (A.x() - C.x())); P2.setX(A.y() - (AP2 / AC) * (A.y() - C.y())); } else { P2 = C; /* 已知点P2,计算点P1。设点B做垂线到线段AB的交点为 C2*/ // 线段 C C2 的长度 const qreal CC2 = sin(AAngle) * AC; // 线段 A C2 的长度 const qreal AC2 = cos(AAngle) * AC; // 线段 C2 P1 的长度 const qreal C2P1 = sqrt(pow(r, 2) - pow(r - CC2, 2)); // 线段 A P1 的长度 const qreal AP1 = AC2 + C2P1; P1.setX(A.x() - (AP1 / AB) * (A.x() - B.x())); P1.setX(A.y() - (AP1 / AB) * (A.y() - B.y())); } return qMakePair(P1, P2); } // Copy from QQuickContext2D begin void arc(QPainterPath &path, qreal xc, qreal yc, qreal radius, qreal sar, qreal ear, bool antiClockWise) { if (sar == ear) return; //### HACK // In Qt we don't switch the coordinate system for degrees // and still use the 0,0 as bottom left for degrees so we need // to switch sar = -sar; ear = -ear; antiClockWise = !antiClockWise; //end hack float sa = qRadiansToDegrees(sar); float ea = qRadiansToDegrees(ear); double span = 0; double xs = xc - radius; double ys = yc - radius; double width = radius*2; double height = radius*2; if ((!antiClockWise && (ea - sa >= 360)) || (antiClockWise && (sa - ea >= 360))) // If the anticlockwise argument is false and endAngle-startAngle is equal to or greater than 2*PI, or, if the // anticlockwise argument is true and startAngle-endAngle is equal to or greater than 2*PI, then the arc is the whole // circumference of this circle. span = 360; else { if (!antiClockWise && (ea < sa)) { span += 360; } else if (antiClockWise && (sa < ea)) { span -= 360; } //### this is also due to switched coordinate system // we would end up with a 0 span instead of 360 if (!(qFuzzyCompare(span + (ea - sa) + 1, 1) && qFuzzyCompare(qAbs(span), 360))) { span += ea - sa; } } // If the path is empty, move to where the arc will start to avoid painting a line from (0,0) if (!path.elementCount()) path.arcMoveTo(xs, ys, width, height, sa); else if (!radius) { path.lineTo(xc, yc); return; } if (qIsNaN(span)) return; path.arcTo(xs, ys, width, height, sa, span); } void addArcTo(QPainterPath &path, const QPointF &p1, const QPointF &p2, qreal r) { QPointF p0(path.currentPosition()); QPointF p1p0((p0.x() - p1.x()), (p0.y() - p1.y())); QPointF p1p2((p2.x() - p1.x()), (p2.y() - p1.y())); float p1p0_length = std::sqrt(p1p0.x() * p1p0.x() + p1p0.y() * p1p0.y()); float p1p2_length = std::sqrt(p1p2.x() * p1p2.x() + p1p2.y() * p1p2.y()); double cos_phi = (p1p0.x() * p1p2.x() + p1p0.y() * p1p2.y()) / (p1p0_length * p1p2_length); // The points p0, p1, and p2 are on the same straight line (HTML5, 4.8.11.1.8) // We could have used areCollinear() here, but since we're reusing // the variables computed above later on we keep this logic. if (qFuzzyCompare(std::abs(cos_phi), 1.0)) { path.lineTo(p1); return; } float tangent = r / std::tan(std::acos(cos_phi) / 2); float factor_p1p0 = tangent / p1p0_length; QPointF t_p1p0((p1.x() + factor_p1p0 * p1p0.x()), (p1.y() + factor_p1p0 * p1p0.y())); QPointF orth_p1p0(p1p0.y(), -p1p0.x()); float orth_p1p0_length = std::sqrt(orth_p1p0.x() * orth_p1p0.x() + orth_p1p0.y() * orth_p1p0.y()); float factor_ra = r / orth_p1p0_length; // angle between orth_p1p0 and p1p2 to get the right vector orthographic to p1p0 double cos_alpha = (orth_p1p0.x() * p1p2.x() + orth_p1p0.y() * p1p2.y()) / (orth_p1p0_length * p1p2_length); if (cos_alpha < 0.f) orth_p1p0 = QPointF(-orth_p1p0.x(), -orth_p1p0.y()); QPointF p((t_p1p0.x() + factor_ra * orth_p1p0.x()), (t_p1p0.y() + factor_ra * orth_p1p0.y())); // calculate angles for addArc orth_p1p0 = QPointF(-orth_p1p0.x(), -orth_p1p0.y()); float sa = std::acos(orth_p1p0.x() / orth_p1p0_length); if (orth_p1p0.y() < 0.f) sa = 2 * M_PI - sa; // anticlockwise logic bool anticlockwise = false; float factor_p1p2 = tangent / p1p2_length; QPointF t_p1p2((p1.x() + factor_p1p2 * p1p2.x()), (p1.y() + factor_p1p2 * p1p2.y())); QPointF orth_p1p2((t_p1p2.x() - p.x()), (t_p1p2.y() - p.y())); float orth_p1p2_length = std::sqrt(orth_p1p2.x() * orth_p1p2.x() + orth_p1p2.y() * orth_p1p2.y()); float ea = std::acos(orth_p1p2.x() / orth_p1p2_length); if (orth_p1p2.y() < 0) ea = 2 * M_PI - ea; if ((sa > ea) && ((sa - ea) < M_PI)) anticlockwise = true; if ((sa < ea) && ((ea - sa) > M_PI)) anticlockwise = true; arc(path, p.x(), p.y(), r, sa, ea, anticlockwise); } // Copy from QQuickContext2D end void DQuickArrowBoxPath::addToPath(QPainterPath &path, const QQuickPathData &) { QRectF rect(0, 0, m_width, m_height); qreal arrowX = m_arrowX; qreal arrowY = m_arrowY; const qreal &arrowWidth = m_arrowWidth; const qreal &arrowHeight = m_arrowHeight; const qreal &r = m_roundedRadius; qreal rotate = 0; QPointF translate(0, 0); // 先将其它方向的坐标都转换成Up的坐标,将箭头统一按照Up的方式计算,再通过旋转生成其它方向的path switch (m_arrowDirection) { case Right: arrowX = m_arrowY; arrowY = m_width - m_arrowX; rect.setWidth(m_height); rect.setHeight(m_width); rotate = 90; translate.ry() = -m_width; break; case Down: arrowX = rect.right() - m_arrowX; arrowY = m_height - m_arrowY; rotate = 180; translate.rx() = -m_width; translate.ry() = -m_height; break; case Left: arrowX = m_height - m_arrowY; arrowY = m_arrowX; rect.setWidth(m_height); rect.setHeight(m_width); rotate = 270; translate.rx() = -m_height; break; default: break; } /* 设点A为箭头顶点, 点B和点C分别为箭头与矩形的两个交点 */ const QPointF A(arrowX, arrowY); path.setFillRule(Qt::WindingFill); path.moveTo(A); rect.setTop(arrowY + arrowHeight); QPointF B(qMax(arrowX - arrowWidth / 2, rect.left()), rect.top()); QPointF C(qMin(arrowX + arrowWidth / 2, rect.right()), rect.top()); if (r > 0) { QRectF rectRounded(0, 0, qMin(2 * r, rect.width() / 2), qMin(2 * r, rect.height() / 2)); rectRounded.moveBottomLeft(rect.bottomLeft()); path.moveTo(rectRounded.topLeft()); // 左下角圆角 path.arcTo(rectRounded, 180, 90); rectRounded.moveBottomRight(rect.bottomRight()); // 右下角圆角 path.arcTo(rectRounded, -90, 90); auto rr = qMin(r, (C.x() - B.x()) / 2); rectRounded.setWidth(qMin(rectRounded.width(), rect.right() - C.x())); if (rectRounded.width() > 0) { rectRounded.moveTopRight(rect.topRight()); // 右上角 path.arcTo(rectRounded, 0, 90); } if (qIsNull(rectRounded.width()) || path.currentPosition().x() - C.x() >= rr) { // 箭头右下角 addArcTo(path, C, A, rr); } // 箭头自身 addArcTo(path, A, B, qMin(rr, r / 2)); rectRounded.setWidth(qMin(qMin(2 * r, rect.width() / 2), B.x() - rect.left())); if (rectRounded.width() > 0) { rectRounded.moveTopLeft(rect.topLeft()); if (B != rectRounded.topRight()) { // 箭头左下角 addArcTo(path, B, rectRounded.topRight(), rr); } // 左上角 path.arcTo(rectRounded, 90, 90); } else { // 左上角 addArcTo(path, B, rect.bottomLeft(), qMin(r, rectRounded.height())); } } else { path.lineTo(C); path.lineTo(rect.topRight()); path.lineTo(rect.bottomRight()); path.lineTo(rect.bottomLeft()); path.lineTo(rect.topLeft()); path.lineTo(B); } path.closeSubpath(); QTransform tf; tf.rotate(rotate); tf.translate(translate.x(), translate.y()); path = tf.map(path); qreal spread = qAbs(m_spread); if (spread > 0) { QPainterPathStroker pps; pps.setWidth(m_spread * 2); pps.setJoinStyle(Qt::MiterJoin); pps.setCapStyle(Qt::SquareCap); if (m_spread > 0) { path |= pps.createStroke(path); } else { path -= pps.createStroke(path); } } } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickarrowboxpath_p.h000066400000000000000000000052411476226662700234720ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKARROWBOXPATH_H #define DQUICKARROWBOXPATH_H #include #include #include DQUICK_BEGIN_NAMESPACE class DQuickArrowBoxPath : public QQuickCurve { Q_OBJECT Q_PROPERTY(Direction arrowDirection READ arrowDirection WRITE setArrowDirection NOTIFY arrowDirectionChanged) Q_PROPERTY(qreal width READ width WRITE setWidth NOTIFY widthChanged) Q_PROPERTY(qreal height READ height WRITE setHeight NOTIFY heightChanged) Q_PROPERTY(qreal arrowX READ arrowX WRITE setArrowX NOTIFY arrowXChanged) Q_PROPERTY(qreal arrowY READ arrowY WRITE setArrowY NOTIFY arrowYChanged) Q_PROPERTY(qreal arrowWidth READ arrowWidth WRITE setArrowWidth NOTIFY arrowWidthChanged) Q_PROPERTY(qreal arrowHeight READ arrowHeight WRITE setArrowHeight NOTIFY arrowHeightChanged) Q_PROPERTY(qreal roundedRadius READ roundedRadius WRITE setRoundedRadius NOTIFY roundedRadiusChanged) Q_PROPERTY(qreal spread READ spread WRITE setSpread NOTIFY spreadChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(ArrowBoxPath) #endif public: enum Direction { Up, Down, Left, Right }; Q_ENUM(Direction) explicit DQuickArrowBoxPath(QObject *parent = nullptr); qreal width() const; void setWidth(qreal newWidth); qreal height() const; void setHeight(qreal newHeight); const Direction &arrowDirection() const; void setArrowDirection(const Direction &newArrowDirection); qreal arrowX() const; void setArrowX(qreal newArrowX); qreal arrowY() const; void setArrowY(qreal newArrowY); qreal arrowWidth() const; void setArrowWidth(qreal newArrowWidth); qreal arrowHeight() const; void setArrowHeight(qreal newArrowHeight); qreal roundedRadius() const; void setRoundedRadius(qreal newRoundedRadius); qreal spread() const; void setSpread(qreal newSpread); Q_SIGNALS: void widthChanged(); void heightChanged(); void arrowDirectionChanged(); void arrowXChanged(); void arrowYChanged(); void arrowWidthChanged(); void arrowHeightChanged(); void roundedRadiusChanged(); void spreadChanged(); private: void addToPath(QPainterPath &path, const QQuickPathData &) override; Direction m_arrowDirection; qreal m_width; qreal m_height; qreal m_arrowX; qreal m_arrowY; qreal m_arrowWidth; qreal m_arrowHeight; qreal m_roundedRadius; qreal m_spread; }; DQUICK_END_NAMESPACE #endif // DQUICKARROWBOXPATH_H dtkdeclarative-5.7.12/src/private/dquickbackdropblitter.cpp000066400000000000000000000167471476226662700241560ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickbackdropblitter_p.h" #include "dbackdropnode_p.h" #include #include #include #include #include #include DQUICK_BEGIN_NAMESPACE class Q_DECL_HIDDEN BlitTextureProvider : public QSGTextureProvider { public: BlitTextureProvider() : QSGTextureProvider() { } inline QSGTexture *texture() const override { return m_texture; } inline void setTexture(QSGTexture *tex) { m_texture = tex; } private: QSGTexture *m_texture = nullptr; }; class Content; class Q_DECL_HIDDEN DQuickBackdropBlitterPrivate : public DCORE_NAMESPACE::DObjectPrivate { public: DQuickBackdropBlitterPrivate(DQuickBackdropBlitter *qq) : DObjectPrivate(qq) { } ~DQuickBackdropBlitterPrivate() { cleanTextureProvider(); } static inline DQuickBackdropBlitterPrivate *get(DQuickBackdropBlitter *qq) { return qq->d_func(); } void init(); void onBlitterEnabledChanged(); inline QQmlListProperty data() { if (!container) return QQuickItemPrivate::get(q_func())->data(); return QQuickItemPrivate::get(container)->data(); } BlitTextureProvider *ensureTextureProvider() const; void cleanTextureProvider(); D_DECLARE_PUBLIC(DQuickBackdropBlitter) Content *content; QQuickItem *container = nullptr; mutable BlitTextureProvider *tp = nullptr; }; class Q_DECL_HIDDEN Content : public QQuickItem { public: explicit Content(DQuickBackdropBlitter *parent) : QQuickItem(parent) { } inline DQuickBackdropBlitterPrivate *d() const { auto p = qobject_cast(parent()); Q_ASSERT(p); return DQuickBackdropBlitterPrivate::get(p); } bool isTextureProvider() const override { return true; } QSGTextureProvider *textureProvider() const override { if (QQuickItem::isTextureProvider()) return QQuickItem::textureProvider(); return d()->ensureTextureProvider(); } inline bool offscreen() const { return !flags().testFlag(ItemHasContents); } inline bool setOffscreen(bool newOffscreen) { if (offscreen() == newOffscreen) return false; if (d()->tp) { if (newOffscreen) disconnect(d()->tp, &BlitTextureProvider::textureChanged, this, &Content::update); else connect(d()->tp, &BlitTextureProvider::textureChanged, this, &Content::update); } setFlag(ItemHasContents, !newOffscreen); return true; } private: QSGNode *updatePaintNode(QSGNode *old, UpdatePaintNodeData *) override { const auto tp = d()->ensureTextureProvider(); if (Q_LIKELY(!tp->texture())) { delete old; return nullptr; } auto node = static_cast(old); if (Q_UNLIKELY(!node)) { node = window()->createImageNode(); node->setOwnsTexture(false); } auto texture = tp->texture(); node->setTexture(texture); const QRectF sourceRect(QPointF(0, 0), texture->textureSize()); node->setSourceRect(sourceRect); node->setRect(QRectF(QPointF(0, 0), size())); node->setFiltering(smooth() ? QSGTexture::Linear : QSGTexture::Nearest); node->setAnisotropyLevel(antialiasing() ? QSGTexture::Anisotropy4x : QSGTexture::AnisotropyNone); return node; } }; void DQuickBackdropBlitterPrivate::init() { D_Q(DQuickBackdropBlitter); content = new Content(q); if (q->window()->graphicsApi() != QSGRendererInterface::Software) { container = new QQuickItem(q); onBlitterEnabledChanged(); } } void DQuickBackdropBlitterPrivate::onBlitterEnabledChanged() { D_Q(DQuickBackdropBlitter); if (!container) return; auto d = QQuickItemPrivate::get(container); if (q->blitterEnabled()) { d->refFromEffectItem(true); } else { d->derefFromEffectItem(true); } } BlitTextureProvider *DQuickBackdropBlitterPrivate::ensureTextureProvider() const { if (Q_LIKELY(tp)) return tp; tp = new BlitTextureProvider(); if (!content->offscreen()) tp->connect(tp, &BlitTextureProvider::textureChanged, content, &Content::update); return tp; } void DQuickBackdropBlitterPrivate::cleanTextureProvider() { if (tp) { QQuickWindowQObjectCleanupJob::schedule(q_func()->window(), tp); tp = nullptr; } } DQuickBackdropBlitter::DQuickBackdropBlitter(QQuickItem *parent) : QQuickItem(parent) , DObject(*new DQuickBackdropBlitterPrivate(this)) { setFlag(ItemHasContents); D_D(DQuickBackdropBlitter); d->init(); } DQuickBackdropBlitter::~DQuickBackdropBlitter() { DQuickBackdropBlitter::releaseResources(); } QQuickItem *DQuickBackdropBlitter::content() const { D_DC(DQuickBackdropBlitter); return d->content; } bool DQuickBackdropBlitter::offscreen() const { D_DC(DQuickBackdropBlitter); return d->content->offscreen(); } void DQuickBackdropBlitter::setOffscreen(bool newOffscreen) { D_D(DQuickBackdropBlitter); if (d->content->setOffscreen(newOffscreen)) Q_EMIT offscreenChanged(); } bool DQuickBackdropBlitter::blitterEnabled() const { return flags().testFlag(ItemHasContents); } void DQuickBackdropBlitter::setBlitterEnabled(bool newBlitterEnabled) { if (blitterEnabled() == newBlitterEnabled) return; setFlag(ItemHasContents, newBlitterEnabled); D_D(DQuickBackdropBlitter); d->onBlitterEnabledChanged(); Q_EMIT blitterEnabledChanged(); } void DQuickBackdropBlitter::invalidateSceneGraph() { D_D(DQuickBackdropBlitter); delete d->tp; d->tp = nullptr; } static void onTextureChanged(DBackdropNode *node, void *data) { auto *d = reinterpret_cast(data); if (!d->tp) return; d->tp->setTexture(node->texture()); Q_EMIT d->tp->textureChanged(); } QSGNode *DQuickBackdropBlitter::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *oldData) { Q_UNUSED(oldData) auto node = static_cast(oldNode); if (Q_LIKELY(node)) { node->resize(size()); return node; } D_D(DQuickBackdropBlitter); if (DQMLGlobalObject::isSoftwareRender()) { node = DBackdropNode::createSoftwareNode(this); } else { node = DBackdropNode::createRhiNode(this); } node->setContentItem(d->container); node->setTextureChangedCallback(onTextureChanged, d); node->resize(size()); onTextureChanged(node, d); return node; } void DQuickBackdropBlitter::itemChange(ItemChange type, const ItemChangeData &data) { if (type == ItemDevicePixelRatioHasChanged) { update(); } QQuickItem::itemChange(type, data); } void DQuickBackdropBlitter::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) { QQuickItem::geometryChange(newGeometry, oldGeometry); D_D(DQuickBackdropBlitter); d->content->setSize(newGeometry.size()); if (d->container) d->container->setSize(newGeometry.size()); } void DQuickBackdropBlitter::releaseResources() { D_D(DQuickBackdropBlitter); d->cleanTextureProvider(); } DQUICK_END_NAMESPACE #include "moc_dquickbackdropblitter_p.cpp" dtkdeclarative-5.7.12/src/private/dquickbackdropblitter_p.h000066400000000000000000000030441476226662700241240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include DQUICK_BEGIN_NAMESPACE class DQuickBackdropBlitterPrivate; class Q_DECL_EXPORT DQuickBackdropBlitter : public QQuickItem, public DCORE_NAMESPACE::DObject { Q_OBJECT D_DECLARE_PRIVATE(DQuickBackdropBlitter) Q_PRIVATE_PROPERTY(DQuickBackdropBlitter::d_func(), QQmlListProperty data READ data DESIGNABLE false) Q_PROPERTY(QQuickItem* content READ content CONSTANT) Q_PROPERTY(bool offscreen READ offscreen WRITE setOffscreen NOTIFY offscreenChanged FINAL) Q_PROPERTY(bool blitterEnabled READ blitterEnabled WRITE setBlitterEnabled NOTIFY blitterEnabledChanged FINAL) QML_NAMED_ELEMENT(BackdropBlitter) public: explicit DQuickBackdropBlitter(QQuickItem *parent = nullptr); ~DQuickBackdropBlitter(); QQuickItem *content() const; bool offscreen() const; void setOffscreen(bool newOffscreen); bool blitterEnabled() const; void setBlitterEnabled(bool newBlitterEnabled); Q_SIGNALS: void offscreenChanged(); void blitterEnabledChanged(); private Q_SLOTS: void invalidateSceneGraph(); private: QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override; void itemChange(ItemChange, const ItemChangeData &) override; void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override; void releaseResources() override; }; DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickbehindwindowblur.cpp000066400000000000000000000230531476226662700243350ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickbehindwindowblur_p.h" #include "dquickwindow.h" #include "private/dquickbehindwindowblur_p_p.h" #include "private/dquickwindow_p.h" #include #include #include #include DQUICK_BEGIN_NAMESPACE class Q_DECL_HIDDEN DSGBlendNode : public QSGRenderNode { public: explicit DSGBlendNode(bool restore = false); void render(const RenderState *state) override; StateFlags changedStates() const override; RenderingFlags flags() const override; QRectF rect() const override; void sync(DQuickBehindWindowBlur *blur); protected: inline QQuickWindow *window() const { return Q_LIKELY(m_item) ? m_item->window() : nullptr; } bool m_isRestore = false; QPointer m_item = nullptr; QMatrix4x4 m_lastMatrix; QRegion m_lastClip; qreal m_lastRadius = -1; QSizeF m_lastSize; }; DSGBlendNode::DSGBlendNode(bool restore) : m_isRestore(restore) { } void DSGBlendNode::render(const QSGRenderNode::RenderState *state) { // m_item may become invalid when the referred blur behind item get destroyed by a Loader. // Give up rendering in this case. if (!m_item || !m_item->window()) return; if (m_isRestore) return; if (QSGRendererInterface::Software == window()->rendererInterface()->graphicsApi()) { QSGRendererInterface *rif = window()->rendererInterface(); QPainter *p = static_cast(rif->getResource(window(), QSGRendererInterface::PainterResource)); Q_ASSERT(p); if (p->isActive()) p->setCompositionMode(QPainter::CompositionMode_Source); } else { #ifndef QT_NO_OPENGL QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); f->glEnable(GL_BLEND); f->glBlendFunc(GL_ONE, GL_ZERO); #endif } const auto blurData = m_item->d_func(); if (!blurData->effectiveBlurEnabled) return; const bool dirtyMatrix = m_lastMatrix != *matrix(); const bool dirtyClip = state->clipRegion() ? m_lastClip != *state->clipRegion() : !m_lastClip.isEmpty(); const bool dirtyRadius = !qFuzzyCompare(m_lastRadius, blurData->radius); // QMatrix4x4 represents position and rotation only const bool dirtySzie = m_lastSize != m_item->size(); if (Q_LIKELY(!dirtyMatrix && !dirtyClip && !dirtyRadius && !dirtySzie)) { return; } m_lastMatrix = *matrix(); m_lastClip = state->clipRegion() ? *state->clipRegion() : QRegion(); m_lastRadius = blurData->radius; m_lastSize = m_item->size(); const auto transform = matrix()->toTransform(); const QRectF itemRect(0, 0, m_item->width(), m_item->height()); const bool windowColorHasAlpha = window()->color().alpha() < 255; if (windowColorHasAlpha && transform.isRotating()) { QPainterPath mapOnScene; if (blurData->radius > 0) { mapOnScene.addRoundedRect(itemRect, blurData->radius, blurData->radius); } else { mapOnScene.addRect(itemRect); } mapOnScene = transform.map(mapOnScene); const QRegion *clipRegion = state->clipRegion(); if (clipRegion && !clipRegion->isEmpty()) { QPainterPath clip; clip.addRegion(*clipRegion); mapOnScene &= clip; } blurData->blurPath = mapOnScene; } else { #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) blurData->blurPath.clear(); #else blurData->blurPath = QPainterPath(); #endif const QRect blurArea = matrix()->mapRect(itemRect).toRect(); blurData->blurArea.x = blurArea.x(); blurData->blurArea.y = blurArea.y(); blurData->blurArea.width = blurArea.width(); blurData->blurArea.height = blurArea.height(); blurData->blurArea.xRadius = windowColorHasAlpha ? blurData->radius : 0; blurData->blurArea.yRaduis = windowColorHasAlpha ? blurData->radius : 0; } // call in main thread m_item->metaObject()->invokeMethod(m_item, "_q_updateBlurArea"); } QSGRenderNode::StateFlags DSGBlendNode::changedStates() const { return m_isRestore ? BlendState : StateFlag(); } QSGRenderNode::RenderingFlags DSGBlendNode::flags() const { return BoundedRectRendering | DepthAwareRendering; } QRectF DSGBlendNode::rect() const { if (Q_UNLIKELY(!m_item)) return QRectF(); return QRect(0, 0, m_item->width(), m_item->height()); } void DSGBlendNode::sync(DQuickBehindWindowBlur *blur) { m_item = blur; if (!m_isRestore) markDirty(QSGNode::DirtyMaterial); } DQuickBehindWindowBlurPrivate::~DQuickBehindWindowBlurPrivate() { if (windowAttach) windowAttach->d_func()->removeBlur(q_func()); } void DQuickBehindWindowBlurPrivate::_q_onHasBlurWindowChanged() { if (blurEnabled) Q_EMIT q_func()->validChanged(); if (!updateBlurEnable()) _q_updateBlurArea(); } void DQuickBehindWindowBlurPrivate::_q_updateBlurArea() { if (!effectiveBlurEnabled) return; Q_Q(DQuickBehindWindowBlur); windowAttach->d_func()->updateBlurAreaFor(q); } bool DQuickBehindWindowBlurPrivate::updateBlurEnable() { Q_Q(DQuickBehindWindowBlur); const bool enabled = q->isVisible() && q->valid() && windowAttach; if (effectiveBlurEnabled == enabled) return false; effectiveBlurEnabled = enabled; // Needs DSGBlendNode::render to map blur area q->update(); if (enabled) { Q_ASSERT(windowAttach); windowAttach->d_func()->addBlur(q); } else if (windowAttach) { windowAttach->d_func()->removeBlur(q); } return true; } DQuickBehindWindowBlur::DQuickBehindWindowBlur(QQuickItem *parent) : QQuickItem(*(new DQuickBehindWindowBlurPrivate), parent) { setFlag(ItemHasContents); connect(DWindowManagerHelper::instance(), SIGNAL(hasBlurWindowChanged()), this, SLOT(_q_onHasBlurWindowChanged())); } DQuickBehindWindowBlur::~DQuickBehindWindowBlur() { } qreal DQuickBehindWindowBlur::cornerRadius() const { Q_D(const DQuickBehindWindowBlur); return d->radius; } void DQuickBehindWindowBlur::setCornerRadius(qreal newRadius) { Q_D(DQuickBehindWindowBlur); if (qFuzzyCompare(d->radius, newRadius)) return; d->radius = newRadius; Q_EMIT cornerRadiusChanged(); update(); } const QColor &DQuickBehindWindowBlur::blendColor() const { Q_D(const DQuickBehindWindowBlur); return d->blendColor; } void DQuickBehindWindowBlur::setBlendColor(const QColor &newBlendColor) { Q_D(DQuickBehindWindowBlur); if (newBlendColor == d->blendColor) return; d->blendColor = newBlendColor; Q_EMIT blendColorChanged(); update(); } bool DQuickBehindWindowBlur::valid() const { Q_D(const DQuickBehindWindowBlur); return d->blurEnabled && DWindowManagerHelper::instance()->hasBlurWindow(); } bool DQuickBehindWindowBlur::blurEnabled() const { Q_D(const DQuickBehindWindowBlur); return d->blurEnabled; } void DQuickBehindWindowBlur::setBlurEnabled(bool newBlurEnabled) { Q_D(DQuickBehindWindowBlur); if (d->blurEnabled == newBlurEnabled) return; bool oldValid = valid(); d->blurEnabled = newBlurEnabled; d->updateBlurEnable(); Q_EMIT blurEnabledChanged(); if (oldValid != valid()) Q_EMIT validChanged(); } QSGNode *DQuickBehindWindowBlur::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *) { Q_D(DQuickBehindWindowBlur); if (width() <= 0 || height() <= 0 || !window()) { delete oldNode; d->makeToInvalidBlur(); // call in main thread metaObject()->invokeMethod(this, "_q_updateBlurArea"); return nullptr; } auto blendNode = static_cast(oldNode); if (!blendNode) { blendNode = new DSGBlendNode; auto rectangle = d->sceneGraphContext()->createInternalRectangleNode(); blendNode->appendChildNode(rectangle); auto restoreNode = new DSGBlendNode(true); blendNode->appendChildNode(restoreNode); } blendNode->sync(this); static_cast(blendNode->lastChild())->sync(this); auto rectangle = static_cast(blendNode->firstChild()); rectangle->setRect(QRectF(0, 0, width(), height())); rectangle->setColor(d->blendColor); rectangle->setPenWidth(0); rectangle->setRadius(d->radius); rectangle->setAntialiasing(antialiasing()); rectangle->update(); return blendNode; } inline DQuickWindowAttached *windowAttached(QQuickWindow *window) { if (!window) return nullptr; return qobject_cast(qmlAttachedPropertiesObject(window)); } void DQuickBehindWindowBlur::itemChange(ItemChange change, const ItemChangeData &value) { if (change == ItemSceneChange) { setWindowAttached(windowAttached(value.window)); } else if (change == ItemVisibleHasChanged) { Q_D(DQuickBehindWindowBlur); d->updateBlurEnable(); } QQuickItem::itemChange(change, value); } void DQuickBehindWindowBlur::setWindowAttached(DQuickWindowAttached *wa) { Q_D(DQuickBehindWindowBlur); if (wa == d->windowAttach) return; if (d->windowAttach) { d->windowAttach->d_func()->removeBlur(this); } d->windowAttach = wa; d->updateBlurEnable(); } void DQuickBehindWindowBlur::componentComplete() { setWindowAttached(windowAttached(window())); QQuickItem::componentComplete(); } DQUICK_END_NAMESPACE #include "moc_dquickbehindwindowblur_p.cpp" dtkdeclarative-5.7.12/src/private/dquickbehindwindowblur_p.h000066400000000000000000000037261476226662700243260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKBEHINDWINDOWBLUR_P_H #define DQUICKBEHINDWINDOWBLUR_P_H #include #include #include DQUICK_BEGIN_NAMESPACE class DQuickWindowAttached; class DQuickBehindWindowBlurPrivate; class DQuickBehindWindowBlur : public QQuickItem { Q_OBJECT Q_PROPERTY(qreal cornerRadius READ cornerRadius WRITE setCornerRadius NOTIFY cornerRadiusChanged) Q_PROPERTY(QColor blendColor READ blendColor WRITE setBlendColor NOTIFY blendColorChanged) Q_PROPERTY(bool valid READ valid NOTIFY validChanged) Q_PROPERTY(bool blurEnabled READ blurEnabled WRITE setBlurEnabled NOTIFY blurEnabledChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(BehindWindowBlur) #endif public: explicit DQuickBehindWindowBlur(QQuickItem *parent = nullptr); ~DQuickBehindWindowBlur() override; qreal cornerRadius() const; void setCornerRadius(qreal newRadius); const QColor &blendColor() const; void setBlendColor(const QColor &newBlendColor); bool valid() const; bool blurEnabled() const; void setBlurEnabled(bool newBlurEnabled); Q_SIGNALS: void cornerRadiusChanged(); void blendColorChanged(); void validChanged(); void blurEnabledChanged(); protected: QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override; void itemChange(ItemChange change, const ItemChangeData &value); void componentComplete() override; private: void setWindowAttached(DQuickWindowAttached *wa); private: Q_DISABLE_COPY(DQuickBehindWindowBlur) Q_DECLARE_PRIVATE(DQuickBehindWindowBlur) Q_PRIVATE_SLOT(d_func(), void _q_onHasBlurWindowChanged()) Q_PRIVATE_SLOT(d_func(), void _q_updateBlurArea()) friend class DQuickWindowAttachedPrivate; friend class DSGBlendNode; }; DQUICK_END_NAMESPACE #endif // DQUICKBEHINDWINDOWBLUR_P_H dtkdeclarative-5.7.12/src/private/dquickbehindwindowblur_p_p.h000066400000000000000000000025731476226662700246440ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKBEHINDWINDOWBLUR_P_P_H #define DQUICKBEHINDWINDOWBLUR_P_P_H #include "dquickbehindwindowblur_p.h" #include "dquickwindow.h" #include DQUICK_BEGIN_NAMESPACE class DQuickBehindWindowBlurPrivate : public QQuickItemPrivate { Q_DECLARE_PUBLIC(DQuickBehindWindowBlur) public: DQuickBehindWindowBlurPrivate() : windowAttach(nullptr) , blendColor(Qt::transparent) { } ~DQuickBehindWindowBlurPrivate(); void _q_onHasBlurWindowChanged(); void _q_updateBlurArea(); bool updateBlurEnable(); inline bool isValidBlur() const { Q_ASSERT(effectiveBlurEnabled); if (!blurPath.isEmpty()) return true; return blurArea.width > 0 && blurArea.height > 0; } inline void makeToInvalidBlur() { #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) blurPath.clear(); #else blurPath = QPainterPath(); #endif blurArea.width = blurArea.height = -1; } DQuickWindowAttached *windowAttach = nullptr; qreal radius = 0; QColor blendColor; DPlatformHandle::WMBlurArea blurArea; QPainterPath blurPath; bool blurEnabled = true; bool effectiveBlurEnabled = false; }; DQUICK_END_NAMESPACE #endif // DQUICKBEHINDWINDOWBLUR_H_H dtkdeclarative-5.7.12/src/private/dquickborderimage.cpp000066400000000000000000000011211476226662700232370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 - 2025 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickborderimage_p.h" #include #include DQUICK_BEGIN_NAMESPACE DQuickBorderImage::DQuickBorderImage(QQuickItem *parent) : QQuickBorderImage(parent) { } void DQuickBorderImage::itemChange(ItemChange change, const ItemChangeData &value) { if (change == ItemDevicePixelRatioHasChanged) { return; } QQuickBorderImage::itemChange(change, value); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickborderimage_p.h000066400000000000000000000011421476226662700232260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 - 2025 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKBORDERIMAGE_P_H #define DQUICKBORDERIMAGE_P_H #include #include DQUICK_BEGIN_NAMESPACE class DQuickBorderImage : public QQuickBorderImage { Q_OBJECT QML_NAMED_ELEMENT(DBorderImage) public: explicit DQuickBorderImage(QQuickItem *parent=nullptr); protected: void itemChange(ItemChange change, const ItemChangeData &value) override; }; DQUICK_END_NAMESPACE #endif // DQUICKBORDERIMAGE_P_H dtkdeclarative-5.7.12/src/private/dquickbusyindicator.cpp000066400000000000000000000151471476226662700236530ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickbusyindicator_p.h" #include #include DQUICK_BEGIN_NAMESPACE static const int CircleCount = 3; static const QRgb TransparentColor = 0x00000000; static QList createDefaultIndicatorColorList(QColor color) { QList colors; QList opacitys; // indicator 的阴影使用降低透明度的方式显示 opacitys << 100 << 30 << 15 << 10 << 5 << 4 << 3 << 2 << 1; for (int i = 0; i < opacitys.count(); ++i) { color.setAlpha(255 * opacitys.value(i) / 100); colors << color; } return colors; } DQuickBusyIndicatorNode::DQuickBusyIndicatorNode(DQuickBusyIndicator *item) : m_spinning(false) , m_rotation(0) , m_center(0, 0) , m_window(item->window()) { connect(item->window(), &QQuickWindow::beforeRendering, this, &DQuickBusyIndicatorNode::maybeRotate, Qt::DirectConnection); connect(item->window(), &QQuickWindow::frameSwapped, this, &DQuickBusyIndicatorNode::maybeUpdate, Qt::DirectConnection); int totalCircleCount = updateIndicatorColors(item->fillColor()); // 为每个 indicator 创建一个 QSGTransformNode for (int i = 0; i < totalCircleCount; ++i) { QSGTransformNode *transformNode = new QSGTransformNode; appendChildNode(transformNode); QQuickItemPrivate *d = QQuickItemPrivate::get(item); QSGInternalRectangleNode *rectNode = d->sceneGraphContext()->createInternalRectangleNode(); rectNode->setAntialiasing(true); transformNode->appendChildNode(rectNode); } } void DQuickBusyIndicatorNode::setSpinning(bool spinning) { m_spinning = spinning; } void DQuickBusyIndicatorNode::sync(QQuickItem *item) { // 准备绘制 indicator 所需的坐标数据 const qreal w = item->width(); const qreal h = item->height(); m_center = QPointF(w / 2, h / 2); auto radius = qMin(w, h) / 2; auto indicatorRadius = radius / 2 / 2 * 1.1; double degreeCurrent = 0; double indicatorShadowOffset = 10; auto indicatorDegreeDelta = 360 / m_indicatorColors.count(); // 先绘制出所有的 indicator, 然后围绕整个图形的中心点旋转 // 绘制方式参考了 DSpinner::paintEvent() 内容 // 外层循环表示 indicator 的个数,内层循环表示 indicator 的阴影的个数 QSGTransformNode *transformNode = static_cast(firstChild()); for (int i = 0; i < CircleCount; i++) { auto colors = m_indicatorColors.value(i); for (int j = 0; j < colors.count(); j++) { Q_ASSERT(transformNode->type() == QSGNode::TransformNodeType); QSGInternalRectangleNode *rectNode = static_cast(transformNode->firstChild()); Q_ASSERT(rectNode->type() == QSGNode::GeometryNodeType); degreeCurrent = (i * indicatorDegreeDelta) - (j * indicatorShadowOffset); auto x = (radius - indicatorRadius) * qCos(qDegreesToRadians(degreeCurrent)); auto y = (radius - indicatorRadius) * qSin(qDegreesToRadians(degreeCurrent)); x = m_center.x() + x; y = m_center.y() + y; auto tl = QPointF(x - indicatorRadius, y - indicatorRadius); QRectF rf(tl.x(), tl.y(), indicatorRadius * 2, indicatorRadius * 2); rectNode->setRect(rf); rectNode->setRadius(indicatorRadius); rectNode->setColor(colors.value(j)); rectNode->update(); transformNode = static_cast(transformNode->nextSibling()); } } maybeUpdate(); } void DQuickBusyIndicatorNode::maybeRotate() { if (m_spinning) { m_rotation += static_cast(360 / m_window->screen()->refreshRate()); // 先把 z 轴平移到 DQuickBusyIndicator 中心点,然后 DQuickBusyIndicatorNode 整个图形围绕 z 轴旋转 auto cX = static_cast(m_center.x()); auto cY = static_cast(m_center.y()); QMatrix4x4 matrix; matrix.translate(cX, cY); matrix.rotate(m_rotation, 0, 0, 1); matrix.translate(-cX, -cY); setMatrix(matrix); // If we're inside a QQuickWidget, this call is necessary to ensure the widget gets updated. m_window->update(); } } void DQuickBusyIndicatorNode::maybeUpdate() { if (m_spinning) m_window->update(); } void DQuickBusyIndicatorNode::setFillColor(const QColor &color) { updateIndicatorColors(color); } int DQuickBusyIndicatorNode::updateIndicatorColors(const QColor &fill) { int totalCircleCount = 0; m_indicatorColors.clear(); // 获取每个 indicator 阴影的颜色值 for (int i = 0; i < CircleCount; i++) { m_indicatorColors << createDefaultIndicatorColorList(fill); totalCircleCount += m_indicatorColors.value(i).count(); } return totalCircleCount; } DQuickBusyIndicator::DQuickBusyIndicator(QQuickItem *parent) : QQuickItem(parent) , m_fillColor(QColor::fromRgb(TransparentColor)) , m_isRunning(false) { setFlag(ItemHasContents); } QColor DQuickBusyIndicator::fillColor() const { return m_fillColor; } void DQuickBusyIndicator::setFillColor(const QColor &color) { if (color == m_fillColor) return; m_fillColor = color; m_fillColorIsChanged = true; Q_EMIT fillColorChanged(); update(); } bool DQuickBusyIndicator::isRunning() const { return m_isRunning; } void DQuickBusyIndicator::setRunning(bool running) { m_isRunning = running; update(); } void DQuickBusyIndicator::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data) { QQuickItem::itemChange(change, data); switch (change) { case ItemOpacityHasChanged: if (qFuzzyIsNull(data.realValue)) setVisible(false); break; case ItemVisibleHasChanged: update(); break; default: break; } } QSGNode *DQuickBusyIndicator::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *) { DQuickBusyIndicatorNode *node = static_cast(oldNode); if (width() > 0 && height() > 0) { if (!node) { node = new DQuickBusyIndicatorNode(this); m_fillColorIsChanged = false; } if (m_fillColorIsChanged) { node->setFillColor(m_fillColor); m_fillColorIsChanged = false; } node->setSpinning(m_isRunning); node->sync(this); } else { delete node; node = nullptr; } return node; } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickbusyindicator_p.h000066400000000000000000000034001476226662700236240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKBUSYINDICATOR_P_H #define DQUICKBUSYINDICATOR_P_H #include #include #include #include DQUICK_BEGIN_NAMESPACE class DQuickBusyIndicator; class DQuickBusyIndicatorNode : public QObject, public QSGTransformNode { Q_OBJECT public: DQuickBusyIndicatorNode(DQuickBusyIndicator *item); void setSpinning(bool spinning); void sync(QQuickItem *item); public Q_SLOTS: void maybeRotate(); void maybeUpdate(); void setFillColor(const QColor &color); private: int updateIndicatorColors(const QColor &fill); private: bool m_spinning; float m_rotation; QPointF m_center; QQuickWindow *m_window; QList> m_indicatorColors; }; class DQuickBusyIndicator : public QQuickItem { Q_OBJECT Q_PROPERTY(QColor fillColor READ fillColor WRITE setFillColor NOTIFY fillColorChanged) Q_PROPERTY(bool running READ isRunning WRITE setRunning) public: explicit DQuickBusyIndicator(QQuickItem *parent = nullptr); QColor fillColor() const; bool isRunning() const; public Q_SLOTS: void setFillColor(const QColor &color); void setRunning(bool running); protected: void itemChange(ItemChange change, const ItemChangeData &data) override; QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override; Q_SIGNALS: void fillColorChanged(); private: QColor m_fillColor; bool m_isRunning; bool m_fillColorIsChanged; }; DQUICK_END_NAMESPACE QML_DECLARE_TYPE(DTK_QUICK_NAMESPACE::DQuickBusyIndicator) #endif // DQUICKBUSYINDICATOR_P_H dtkdeclarative-5.7.12/src/private/dquickcoloroverlay.cpp000066400000000000000000000052411476226662700235060ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dcoloroverlaynode.h" #include "dquickcoloroverlay_p.h" #include DQUICK_BEGIN_NAMESPACE class DQuickColorOverlayPrivate : public QQuickItemPrivate { public: DQuickColorOverlayPrivate() : color(QColor::Invalid) , source(nullptr) , sourceChanged(false) , cached(true) { } QColor color = Qt::transparent; QQuickItem *source; bool sourceChanged; bool cached; }; DQuickColorOverlay::DQuickColorOverlay(QQuickItem *parent) : QQuickItem (*(new DQuickColorOverlayPrivate), parent) { setFlag(ItemHasContents); } DQuickColorOverlay::DQuickColorOverlay(DQuickColorOverlayPrivate &dd, QQuickItem *parent) : QQuickItem(dd, parent) { } QColor DQuickColorOverlay::color() const { Q_D(const DQuickColorOverlay); return d->color; } void DQuickColorOverlay::setColor(const QColor &color) { Q_D(DQuickColorOverlay); if (d->color == color) return; d->color = color; Q_EMIT colorChanged(); } QQuickItem *DQuickColorOverlay::source() const { Q_D(const DQuickColorOverlay); return d->source; } void DQuickColorOverlay::setSource(QQuickItem *item) { Q_D(DQuickColorOverlay); if (item == d->source) return; d->source = item; d->sourceChanged = true; Q_EMIT sourceChanged(); update(); } void DQuickColorOverlay::setCached(bool cached) { Q_D(DQuickColorOverlay); if (d->cached == cached) return; d->cached = cached; Q_EMIT cachedChanged(); update(); } bool DQuickColorOverlay::cached() const { Q_D(const DQuickColorOverlay); return d->cached; } QSGNode *DQuickColorOverlay::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *) { Q_D(DQuickColorOverlay); if (!d->source || !d->source->isTextureProvider()) { delete oldNode; return nullptr; } QSGRendererInterface *ri = window()->rendererInterface(); if (!ri) return nullptr; QSGRendererInterface::GraphicsApi api = ri->graphicsApi(); if (QSGRendererInterface::Software == api) { DSoftwareColorOverlayNode *node = static_cast(oldNode); if (d->sourceChanged) { delete node; node = nullptr; d->sourceChanged = false; } if (!node) node = new DSoftwareColorOverlayNode(d->source->textureProvider()); node->sync(this); node->setCached(d->cached); node->setColor(d->color); return node; } return nullptr; } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickcoloroverlay_p.h000066400000000000000000000025271476226662700234760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKCOLOROVERLAY_P_H #define DQUICKCOLOROVERLAY_P_H #include #include DQUICK_BEGIN_NAMESPACE class DQuickColorOverlayPrivate; class DQuickColorOverlay : public QQuickItem { Q_OBJECT Q_DISABLE_COPY(DQuickColorOverlay) Q_DECLARE_PRIVATE(DQuickColorOverlay) Q_PROPERTY(QQuickItem *source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) Q_PROPERTY(bool cached READ cached WRITE setCached NOTIFY cachedChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(SoftwareColorOverlay) #endif public: explicit DQuickColorOverlay(QQuickItem *parent = nullptr); QColor color() const; void setColor(const QColor &color); QQuickItem *source() const; void setSource(QQuickItem *item); void setCached(bool cached); bool cached() const; Q_SIGNALS: void colorChanged(); void sourceChanged(); void cachedChanged(); protected: DQuickColorOverlay(DQuickColorOverlayPrivate &dd, QQuickItem *parent = nullptr); QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override; }; DQUICK_END_NAMESPACE #endif // DQUICKCOLOROVERLAY_P_H dtkdeclarative-5.7.12/src/private/dquickcontrolpalette.cpp000066400000000000000000001043551476226662700240330ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickcontrolpalette_p.h" #include "dquickglobal_p.h" #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #endif #include #include #include #include DGUI_USE_NAMESPACE DQUICK_BEGIN_NAMESPACE #define METAPROPERTYCHANGEFUNC "resolveMetaPropertyChanged()" #define COLORPROPERTYCHANGEFUNC "notifyColorPropertyChanged()" static inline bool _d_isControlItem(QQuickItem *item) { #define _D_FOR_EACH_SIMILAR_CONTROL_ITEM(F) \ F(QQuickControl), \ F(QQuickTextField) #if defined(QT_NAMESPACE) #define SIMILAR_CONTROL_ITEM_NAMESPACE_STR1(NAME, Item) #NAME "::" #Item #define SIMILAR_CONTROL_ITEM_NAMESPACE_STR(R, Item) SIMILAR_CONTROL_ITEM_NAMESPACE_STR1(R, Item) #define _D_SIMILAR_CONTROL_ITEM(Item) SIMILAR_CONTROL_ITEM_NAMESPACE_STR(QT_NAMESPACE, Item) #else #define _D_SIMILAR_CONTROL_ITEM(Item) #Item #endif static QStringList controlItems { _D_FOR_EACH_SIMILAR_CONTROL_ITEM(_D_SIMILAR_CONTROL_ITEM) }; auto iter = std::find_if(controlItems.cbegin(), controlItems.cend(), [item] (const QString &name) { return item->inherits(name.toLatin1()); }); return iter != controlItems.cend(); } static inline bool _d_isWindowRootItem(QQuickItem *item) { #if defined(QT_NAMESPACE) #define ROOT_ITEM_NAMESPACE_STR1(NAME) #NAME"::QQuickRootItem" #define ROOT_ITEM_NAMESPACE_STR(R) ROOT_ITEM_NAMESPACE_STR1(R) #define RootItemClassName ROOT_ITEM_NAMESPACE_STR(QT_NAMESPACE) #else #define RootItemClassName "QQuickRootItem" #endif return item->inherits(RootItemClassName); } // it's maybe an bug for qt, to use qvariant_cast to get Control's palette. // `qvariant_cast` gets application's palette, and `toQPalette` gets root window's // palette. static inline QPalette _d_getControlPalette(QQuickItem *item) { const QVariant &palette = item->property("palette"); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) const QQuickPalette *pa = palette.value(); Q_ASSERT(pa); return pa->toQPalette(); #else return qvariant_cast(palette); #endif } static QMetaProperty findMetaPropertyFromSignalIndex(const QObject *obj, int signal_index) { QMetaProperty itemProperty; if (signal_index < 0) return itemProperty; if (!obj) return itemProperty; auto itemMetaObject = obj->metaObject(); for (int i = 0; i < itemMetaObject->propertyCount(); ++i) { itemProperty = itemMetaObject->property(i); if (itemProperty.isValid() && itemProperty.hasNotifySignal()) { int propertySignalIndex = itemProperty.notifySignalIndex(); if (signal_index == propertySignalIndex) break; } } return itemProperty; } DQuickControlColor::DQuickControlColor() { } DQuickControlColor::DQuickControlColor(const DColor &color) : data(new DColor(color)) , isSingleColor(true) { } DQuickControlColor::DQuickControlColor(DColor *colors) : data(colors) , isSingleColor(false) { } DQuickControlColor::~DQuickControlColor() { if (isSingleColor) { delete data; } } const DColor &DQuickControlColor::common() const { Q_ASSERT(data && !isSingleColor); return data[DQuickControlPalette::CommonColor]; } void DQuickControlColor::setCommon(const DColor &newCommon) { Q_ASSERT(data && !isSingleColor); if (common() == newCommon) return; changed = true; data[DQuickControlPalette::CommonColor] = newCommon; } const DColor &DQuickControlColor::crystal() const { Q_ASSERT(data && !isSingleColor); return data[DQuickControlPalette::CrystalColor]; } void DQuickControlColor::setCrystal(const DColor &newCrystal) { Q_ASSERT(data && !isSingleColor); if (crystal() == newCrystal) return; changed = true; data[DQuickControlPalette::CrystalColor] = newCrystal; } DQuickControlPalette::DQuickControlPalette(QObject *parent) : QObject(parent) , colors(ThemeTypeCount * ColorTypeCount * ColorFamilyCount, DColor()) { } DQuickControlPalette::~DQuickControlPalette() { } bool DQuickControlPalette::enabled() const { return m_enabled; } void DQuickControlPalette::setEnabled(bool newEnabled) { if (m_enabled == newEnabled) return; m_enabled = newEnabled; Q_EMIT enabledChanged(); } class Q_DECL_HIDDEN CustomMetaObject : public QQmlOpenMetaObject { public: CustomMetaObject(DQuickControlColorSelector *obj) #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) : QQmlOpenMetaObject(obj, new QQmlOpenMetaObjectType(obj->metaObject(), qmlEngine(obj->parent()))) #else : QQmlOpenMetaObject(obj, new QQmlOpenMetaObjectType(obj->metaObject())) #endif { } ~CustomMetaObject() override { if (auto item = type()) { item->release(); } } inline DQuickControlColorSelector *owner() const { return qobject_cast(object()); } QVariant writePaletteValue(int id, DQuickControlPalette *palette) { const QMetaProperty p = property(id + propertyOffset()); /* ###(Chen Bin) * When you modify the value of a palette in QML, * if the control does not already have a palette * for the property (perhaps for its QQuickControl * item), a new one is created for it. */ owner()->setPalette(p.name(), palette); int slotIndex = owner()->metaObject()->indexOfSlot(METAPROPERTYCHANGEFUNC); if (slotIndex != -1) { QMetaObject::disconnect(owner()->parent(), p.notifySignalIndex(), owner(), slotIndex); } const QColor c = owner()->getColorOf(p.name(), owner()->m_state.data()); return c; } QVariant propertyWriteValue(int id, const QVariant &v) override { if (v.canConvert()) { auto palette = v.value(); return writePaletteValue(id, palette); } return QQmlOpenMetaObject::propertyWriteValue(id, v); } int metaCall(QObject *o, QMetaObject::Call _c, int _id, void **_a) override { if (_c == QMetaObject::ResetProperty && _id >= propertyOffset()) { auto ownerObject = owner()->parent(); const QByteArray &proName = name((_id - propertyOffset())); int itemPropertyIndex = ownerObject->metaObject()->indexOfProperty(proName); if (itemPropertyIndex == -1) { int palIndex = owner()->indexOfPalette(proName); if (palIndex != -1) owner()->m_palettes.removeAt(palIndex); owner()->updatePropertyFromName(proName); } else { owner()->updatePaletteFromMetaProperty(ownerObject->metaObject()->property(itemPropertyIndex), ownerObject); } } return QQmlOpenMetaObject::metaCall(o, _c, _id, _a); } void propertyCreated(int id, QMetaPropertyBuilder &builder) override { builder.setResettable(true); if (builder.hasNotifySignal()) { int slotIndex = owner()->metaObject()->indexOfSlot(COLORPROPERTYCHANGEFUNC); if (slotIndex != -1) QMetaObject::connect(object(), type()->signalOffset() + id, owner(), slotIndex, Qt::UniqueConnection); } return QQmlOpenMetaObject::propertyCreated(id, builder); } void propertyRead(int id) override { struct FakerItem : public QQuickItem { inline bool isComponentComplete() const { return QQuickItem::isComponentComplete(); } }; auto qmlObj = qobject_cast(owner()->parent()); if (qmlObj && static_cast(qmlObj)->isComponentComplete() && !value(id).value().isValid()) { const auto pname = name(id); int palIndex = owner()->indexOfPalette(pname); if (palIndex >= 0 && owner()->m_palettes.at(palIndex).second) qWarning() << "ColorSelector: The" << pname << "is an invalid color on the" << qmlObj; } QQmlOpenMetaObject::propertyRead(id); } // Because set true for QQmlOpenMetaObject::setCached, the DQuickControlColorSelector's // QQmlPropertyCache in QQmlData is from the QQmlOpenMetaObject. The QQmlData::propertyCache // is released in QQmlOpenMetaObject::createProperty, If we not reset it to owner()->m_propertyCache, // It's will reset by QQmlMetaTypeData::propertyCache's caller(qQmlPropertyCacheProperty), in Qt5, // the QQmlMetaTypeData will store the QQmlOpenMetaObject to QQmlMetaTypeData::propertyCaches for // a DynamicMetaObject(QQmlOpenMetaObject), and not update QQmlData::propertyCache when create new // property in QQmlOpenMetaObject, this is a bug, so we must ensure the QQmlData::propertyCache awlays // from QQmlOpenMetaObject. #if QT_VERSION <= QT_VERSION_CHECK(6, 2, 4) int createProperty(const char *name, const char *data) override { QQmlData *qmldata = QQmlData::get(owner(), false); auto cache = qmldata ? qmldata->propertyCache : nullptr; Q_ASSERT(!cache || cache == owner()->m_propertyCache); int ret = QQmlOpenMetaObject::createProperty(name, data); if (qmldata && qmldata->propertyCache != cache) { Q_ASSERT(!qmldata->propertyCache); // It's released in QQmlOpenMetaObject::createProperty // Ensure QQmlOpenMetaObject::setCached always take effect qmldata->propertyCache = owner()->m_propertyCache; qmldata->propertyCache->addref(); } return ret; } #endif }; DQuickControlColorSelector::DQuickControlColorSelector(QQuickItem *parent) : QObject(parent) , m_state(new PaletteState(this)) { ensureMetaObject(); setupMetaPropertyPalettes(parent); findAndSetControlParent(); updateFamilyForChildrenRecu(parent); } DQuickControlColorSelector::~DQuickControlColorSelector() { } DQuickControlColorSelector *DQuickControlColorSelector::qmlAttachedProperties(QObject *object) { if (auto window = qobject_cast(object)) { Q_ASSERT(window->contentItem()); auto obj = qmlAttachedPropertiesObject(window->contentItem()); auto cs = qobject_cast(obj); Q_ASSERT(cs); return cs; } auto item = qobject_cast(object); if (!item) { ThrowError(object, QStringLiteral("Cannot be used in non QQuickItem class.")); return nullptr; } auto cs = new DQuickControlColorSelector(item); if (!cs->m_palettes.isEmpty() || specialObjectNameItems().contains(item->objectName()) || _d_isControlItem(item) || _d_isWindowRootItem(item)) return cs; delete cs; ThrowError(object, QStringLiteral("The Item[%1,ObjectName:%2] has not palettes included, Unable to create a change color selector."). arg(item->metaObject()->className(), item->objectName())); return nullptr; } void DQuickControlColorSelector::findAndSetControlParent() { QQuickItem *parentItem = qobject_cast(parent()); Q_ASSERT(parentItem); for (const QMetaObject::Connection &conn : qAsConst(m_itemParentChangeConnections)) { disconnect(conn); } m_itemParentChangeConnections.clear(); bool needUpdateControl = true; bool needUpdateColorFamily = !m_state->familyIsUserSet; do { if (needUpdateControl && _d_isControlItem(parentItem)) { needUpdateControl = false; setControl(parentItem); } if (needUpdateColorFamily && parentItem != parent()) { // try update color family auto cs = qobject_cast(qmlAttachedPropertiesObject(parentItem, false)); if (cs) { needUpdateColorFamily = false; setFamilyPropertyParent(cs); } } if (!needUpdateControl && !needUpdateColorFamily) break; QMetaObject::Connection conn = connect(parentItem, &QQuickItem::parentChanged, this, &DQuickControlColorSelector::findAndSetControlParent); if (conn) m_itemParentChangeConnections.append(conn); parentItem = parentItem->parentItem(); } while (parentItem); if (needUpdateControl) { setControl(nullptr); } if (needUpdateColorFamily) { setFamilyPropertyParent(nullptr); } } QByteArray DQuickControlColorSelector::findPalettePropertyName(const DQuickControlPalette *palette) const { if (!palette) return QByteArrayLiteral(""); auto paletteDataFinder = [&](const ControlPaletteData &data) { return data.second == palette; }; auto dataIter = std::find_if(m_palettes.cbegin(), m_palettes.cend(), paletteDataFinder); if (dataIter == m_palettes.cend()) { return QByteArrayLiteral(""); } return dataIter->first; } void DQuickControlColorSelector::clearAndInheritParentProperties() { // Clear meta object properties that contained in it's old parent for (int i = 0; i < m_metaObject->count(); ++i) { auto name = m_metaObject->name(i); if (indexOfPalette(name) == -1 && (!m_superColorSelector || m_superColorSelector->indexOfPalette(name) == -1)) { m_metaObject->setValue(name, QVariant::Invalid); } } if (m_superColorSelector) { for (int i = 0; i < m_superColorSelector->m_metaObject->count(); ++i) { auto p = m_superColorSelector->m_metaObject->name(i); if (p.isEmpty()) continue; updatePropertyFromName(p); } } Q_EMIT colorPropertiesChanged(); } void DQuickControlColorSelector::setupMetaPropertyPalettes(QQuickItem *object) { for (int i = 0; i < object->metaObject()->propertyCount(); ++i) { auto p = object->metaObject()->property(i); if (!p.name() || p.userType() != qMetaTypeId()) continue; if (indexOfPalette(p.name()) != -1) ThrowError(this, QStringLiteral("ColorSelector: The Item %1(%2, name=\"%3\") already has a palette with name \"%4\", The latter one will replace the former one.") .arg(object->metaObject()->className()).arg(QString::number(reinterpret_cast(object), 16).prepend("0x")).arg(object->objectName()).arg(p.name())); updatePaletteFromMetaProperty(p, object); } } QQuickItem *DQuickControlColorSelector::control() const { return m_control; } void DQuickControlColorSelector::setControl(QQuickItem *newControl) { if (m_control == newControl) return; // Clean for old if (m_control) { m_control->disconnect(this); if (auto w = m_control->window()) w->disconnect(this); } m_control = newControl; if (m_control) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto palette = m_control->property("palette").value(); connect(palette, &QQuickPalette::changed, this, &DQuickControlColorSelector::updateControlTheme); #endif connect(m_control, SIGNAL(paletteChanged()), this, SLOT(updateControlTheme())); connect(m_control, SIGNAL(hoveredChanged()), this, SLOT(updateControlState())); if (m_control->metaObject()->indexOfSignal("pressedChanged()") != -1) { connect(m_control, SIGNAL(pressedChanged()), this, SLOT(updateControlState())); } connect(m_control, &QQuickItem::enabledChanged, this, &DQuickControlColorSelector::updateControlState); connect(m_control, &QQuickItem::visibleChanged, this, &DQuickControlColorSelector::updateControlState); connect(m_control, &QQuickItem::windowChanged, this, &DQuickControlColorSelector::updateControlWindow); updateControlWindow(); updateControlTheme(); updateControlState(); if (m_control != parent()) { auto csForControl = qobject_cast( qmlAttachedPropertiesObject(newControl, true)); setSuperColorSelector(csForControl); } } Q_EMIT controlChanged(); } void DQuickControlColorSelector::setSuperColorSelector(DQuickControlColorSelector *parent) { if (m_superColorSelector == parent) return; Q_ASSERT(parent != this); if (m_superColorSelector) { m_superColorSelector->disconnect(this); } m_superColorSelector = parent; if (parent) { connect(parent, &DQuickControlColorSelector::colorPropertyChanged, this, std::bind(&DQuickControlColorSelector::updatePropertyFromName, this, std::placeholders::_1, nullptr)); connect(parent, &DQuickControlColorSelector::colorPropertiesChanged, this, &DQuickControlColorSelector::clearAndInheritParentProperties); connect(parent, &DQuickControlColorSelector::destroyed, this, std::bind( &DQuickControlColorSelector::setSuperColorSelector, this, nullptr)); connect(parent, &DQuickControlColorSelector::hoveredChanged, this, &DQuickControlColorSelector::updateControlState); connect(parent, &DQuickControlColorSelector::pressedChanged, this, &DQuickControlColorSelector::updateControlState); connect(parent, &DQuickControlColorSelector::disabledChanged, this, &DQuickControlColorSelector::updateControlState); connect(parent, &DQuickControlColorSelector::inactivedChanged, this, &DQuickControlColorSelector::updateControlState); } clearAndInheritParentProperties(); if (!updateControlState()) updateAllColorProperties(); } DGuiApplicationHelper::ColorType DQuickControlColorSelector::controlTheme() const { return m_state->controlTheme; } DQuickControlPalette::ColorFamily DQuickControlColorSelector::family() const { return m_state->family; } void DQuickControlColorSelector::setFamily(const DQuickControlPalette::ColorFamily &newFamily) { m_state->familyIsUserSet = true; doSetFamily(newFamily); } void DQuickControlColorSelector::resetFamily() { m_state->familyIsUserSet = false; doResetFamily(); } DQMLGlobalObject::ControlState DQuickControlColorSelector::controlState() const { return m_state->controlState; } bool DQuickControlColorSelector::setControlTheme(DGuiApplicationHelper::ColorType theme) { if (m_state->controlTheme == theme) return false; m_state->controlTheme = theme; Q_EMIT controlThemeChanged(); updateAllColorProperties(); return true; } bool DQuickControlColorSelector::setControlState(DQMLGlobalObject::ControlState controlState) { if (m_state->controlState == controlState) return false; m_state->controlState = controlState; Q_EMIT controlStateChanged(); updateAllColorProperties(); return true; } bool DQuickControlColorSelector::doSetFamily(DQuickControlPalette::ColorFamily newFamily) { if (m_state->family == newFamily) return false; m_state->family = newFamily; Q_EMIT familyChanged(); updateAllColorProperties(); return true; } void DQuickControlColorSelector::doResetFamily() { if (m_state->familyIsUserSet) return; const auto colorFamily = m_parentOfFamilyProperty ? m_parentOfFamilyProperty->family() : DQuickControlPalette::CommonColor; doSetFamily(colorFamily); } void DQuickControlColorSelector::tryDestroyPalette(DQuickControlPalette *palette) { if (!palette) return; // This palette is used by the multi properties, we must ensure destroy it in last ref is freed. if (!findPalettePropertyName(palette).isEmpty()) { return; } palette->disconnect(this); if (palette->parent() == this) palette->deleteLater(); } bool DQuickControlColorSelector::hovered() const { return m_state->hovered; } void DQuickControlColorSelector::setHovered(bool newHovered) { doSetHovered(newHovered, true); } void DQuickControlColorSelector::resetHovered() { doSetHovered(false, false); } bool DQuickControlColorSelector::pressed() const { return m_state->pressed; } void DQuickControlColorSelector::setPressed(bool newPressed) { doSetPressed(newPressed, true); } void DQuickControlColorSelector::resetPressed() { doSetPressed(false, false); } bool DQuickControlColorSelector::disabled() const { return m_state->disabled; } void DQuickControlColorSelector::setDisabled(bool newDisabled) { doSetDisabled(newDisabled, true); } void DQuickControlColorSelector::resetDisabled() { doSetDisabled(false, false); } bool DQuickControlColorSelector::inactived() const { return m_state->inactived; } void DQuickControlColorSelector::setInactived(bool newInactived) { doSetInactived(newInactived, true); } void DQuickControlColorSelector::resetInactived() { doSetInactived(false, false); } void DQuickControlColorSelector::setFamilyPropertyParent(DQuickControlColorSelector *parent) { if (m_parentOfFamilyProperty == parent) return; if (m_parentOfFamilyProperty) { disconnect(m_parentOfFamilyProperty.data(), &DQuickControlColorSelector::familyChanged, this, &DQuickControlColorSelector::doResetFamily); } m_parentOfFamilyProperty = parent; if (m_parentOfFamilyProperty) { connect(m_parentOfFamilyProperty.data(), &DQuickControlColorSelector::familyChanged, this, &DQuickControlColorSelector::doResetFamily); } doResetFamily(); } QStringList DQuickControlColorSelector::specialObjectNameItems() { // TODO(Chen Bin): To be determined return { QLatin1String("ColorSelectorMaster") }; } bool DQuickControlColorSelector::doGetHoveredRecu(bool *value) const { if (m_state->hoveredValueValid) { *value = m_state->hovered; return true; } return m_superColorSelector ? m_superColorSelector->doGetHoveredRecu(value) : false; } bool DQuickControlColorSelector::doGetPressedRecu(bool *value) const { if (m_state->pressedValueValid) { *value = m_state->pressed; return true; } return m_superColorSelector ? m_superColorSelector->doGetPressedRecu(value) : false; } bool DQuickControlColorSelector::doGetDisabledRecu(bool *value) const { if (m_state->disabledValueValid) { *value = m_state->disabled; return true; } return m_superColorSelector ? m_superColorSelector->doGetDisabledRecu(value) : false; } bool DQuickControlColorSelector::doGetInactivedRecu(bool *value) const { if (m_state->inactivedValueValid) { *value = m_state->inactived; return true; } return m_superColorSelector ? m_superColorSelector->doGetInactivedRecu(value) : false; } void DQuickControlColorSelector::doSetHovered(bool newHovered, bool isUserSet) { if (newHovered == m_state->hovered && isUserSet == m_state->hoveredValueValid) return; m_state->hoveredValueValid = isUserSet; m_state->hovered = newHovered; Q_EMIT hoveredChanged(); updateControlState(); } void DQuickControlColorSelector::doSetPressed(bool newPressed, bool isUserSet) { if (newPressed == m_state->pressed && isUserSet == m_state->pressedValueValid) return; m_state->pressedValueValid = isUserSet; m_state->pressed = newPressed; Q_EMIT pressedChanged(); updateControlState(); } void DQuickControlColorSelector::doSetDisabled(bool newDisabled, bool isUserSet) { if (newDisabled == m_state->disabled && isUserSet == m_state->disabledValueValid) return; m_state->disabledValueValid = isUserSet; m_state->disabled = newDisabled; Q_EMIT disabledChanged(); updateControlState(); } void DQuickControlColorSelector::doSetInactived(bool newInactived, bool isUserSet) { if (newInactived == m_state->inactived && isUserSet == m_state->inactivedValueValid) return; m_state->inactivedValueValid = isUserSet; m_state->inactived = newInactived; Q_EMIT inactivedChanged(); updateControlState(); } static inline DColor getColor(const DQuickControlPalette *palette, int themeIndex, int familyIndex, int stateIndex) { DColor color = palette->colors.at(themeIndex + familyIndex + stateIndex); if (!color.isValid() && familyIndex > 0 && stateIndex > 0) { // fallback to normal state color = palette->colors.at(themeIndex + familyIndex); if (!color.isValid()) { // fallback to common family color = palette->colors.at(themeIndex + stateIndex); } } if (!color.isValid()) { // fallback to normal state and the common family and normal state color = palette->colors.at(themeIndex); } return color; } QColor DQuickControlColorSelector::getColorOf(const DQuickControlPalette *palette, const PaletteState *state) const { DColor targetColor; int themeIndex = DQuickControlPalette::Light; if (state->controlTheme == DGuiApplicationHelper::DarkType) { themeIndex = DQuickControlPalette::Dark; } const int familyIndex = state->family; int stateIndex = DQuickControlPalette::Normal; const bool disabled = state->controlState == DQMLGlobalObject::DisabledState; bool shouldInverseColor = false; do { if (disabled) { targetColor = palette->colors.at(themeIndex + familyIndex + DQuickControlPalette::Disabled); if (targetColor.isValid()) // Don't process the disabled's color, should direct uses it. break; // fallback to normal color } else if (state->controlState == DQMLGlobalObject::PressedState) { stateIndex = DQuickControlPalette::Pressed; } else if (state->controlState == DQMLGlobalObject::HoveredState) { stateIndex = DQuickControlPalette::Hovered; } targetColor = getColor(palette, themeIndex, familyIndex, stateIndex); if (!targetColor.isValid() && state->controlTheme == DGuiApplicationHelper::DarkType) { // create the dark color from the light theme targetColor = getColor(palette, DQuickControlPalette::Light, familyIndex, stateIndex); // inverse the color to dark if (targetColor.type() != DColor::Highlight && targetColor.type() != DColor::HighlightedText) { shouldInverseColor = true; } } } while (false); QColor colorValue; if (targetColor.isTypedColor()) { if (m_control) colorValue = targetColor.toColor(_d_getControlPalette(m_control)); } else { colorValue = targetColor.color(); } if (shouldInverseColor) { int r, g, b, a; colorValue.getRgb(&r, &g, &b, &a); colorValue = QColor(255 - r, 255 - g, 255 - b, a); } return colorValue; } QColor DQuickControlColorSelector::getColorOf(const QByteArray &propertyName, const PaletteState *state) const { // Ensure that only the last palette is used, other palettes with the same // name property are ignored. int paletteIndex = indexOfPalette(propertyName); if (paletteIndex != -1) { auto pal = this->m_palettes.at(paletteIndex).second; if (pal && pal->enabled()) { return getColorOf(pal, state); } } if (m_superColorSelector) { return m_superColorSelector->getColorOf(propertyName, state); } return QColor::Invalid; } void DQuickControlColorSelector::ensureMetaObject() { if (m_metaObject) return; m_metaObject = new CustomMetaObject(this); // TODO setCached will cause builtin property is undefined firstly in qml. #if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) // Must true, see CustomMetaObject::createProperty m_metaObject->setCached(true); QQmlData *qmldata = QQmlData::get(this); Q_ASSERT(qmldata); // the cache object is from QQmlOpenMetaObjectTypePrivate m_propertyCache = qmldata->propertyCache; #endif } int DQuickControlColorSelector::indexOfPalette(const QByteArray &name) const { for (int i = 0; i < m_palettes.count(); ++i) { const auto &item = m_palettes.at(i); if (item.first == name) return i; } return -1; } void DQuickControlColorSelector::setPalette(const QByteArray &name, DQuickControlPalette *palette) { int index = indexOfPalette(name); if (index < 0) { m_palettes << qMakePair(name, palette); } else { auto oldPal = m_palettes[index].second; if (oldPal == palette) return; m_palettes[index].second = palette; tryDestroyPalette(oldPal); } if (palette) { connect(palette, &DQuickControlPalette::changed, this, &DQuickControlColorSelector::recvPaletteColorChanged, Qt::UniqueConnection); connect(palette, &DQuickControlPalette::enabledChanged, this, &DQuickControlColorSelector::recvPaletteColorChanged, Qt::UniqueConnection); // Destoryed in QML context connect(palette, &DQuickControlPalette::destroyed, this, &DQuickControlColorSelector::onPaletteDestroyed, Qt::UniqueConnection); } updatePropertyFromName(name, palette); } void DQuickControlColorSelector::updatePaletteFromMetaProperty(const QMetaProperty &mp, const QObject *obj) { DQuickControlPalette *value = qvariant_cast(mp.read(obj)); setPalette(mp.name(), value); if (mp.hasNotifySignal()) { int slotIndex = this->metaObject()->indexOfSlot(METAPROPERTYCHANGEFUNC); if (slotIndex != -1) QMetaObject::connect(obj, mp.notifySignalIndex(), this, slotIndex, Qt::UniqueConnection); } } void DQuickControlColorSelector::resolveMetaPropertyChanged() { const QObject *obj = sender(); Q_ASSERT(obj); QMetaProperty itemProperty = findMetaPropertyFromSignalIndex(obj, senderSignalIndex()); if (!itemProperty.name() || itemProperty.userType() != qMetaTypeId()) return; DQuickControlPalette *newPalette = qvariant_cast(itemProperty.read(obj)); setPalette(itemProperty.name(), newPalette); } void DQuickControlColorSelector::notifyColorPropertyChanged() { const QObject *obj = sender(); Q_ASSERT(obj); QMetaProperty itemProperty = findMetaPropertyFromSignalIndex(obj, senderSignalIndex()); const QByteArray &dynamicColorName = itemProperty.name(); if (dynamicColorName.isEmpty()) return; Q_EMIT colorPropertyChanged(dynamicColorName); } void DQuickControlColorSelector::updatePropertyFromName(const QByteArray &name, const DQuickControlPalette *palette) { if (QCoreApplication::closingDown()) return; auto appriv = dynamic_cast(QObjectPrivate::get(qApp)); if (!appriv || appriv->aboutToQuitEmitted) return; Q_ASSERT(!name.isEmpty()); QColor color; // Always use the palette state in this class. if (palette && palette->enabled()) { color = getColorOf(palette, m_state.data()); } else { color = getColorOf(name, m_state.data()); } m_metaObject->setValue(name, color); } void DQuickControlColorSelector::updateFamilyForChildrenRecu(QQuickItem *parent) { const auto childItems = parent->childItems(); for (auto *child : childItems) { auto cs = qobject_cast(qmlAttachedPropertiesObject(child, false)); if (cs) { cs->setFamilyPropertyParent(this); } else { updateFamilyForChildrenRecu(child); } } } void DQuickControlColorSelector::updateControlTheme() { if (!m_control) return; const QPalette pa = _d_getControlPalette(m_control); const QColor windowColor = pa.color(QPalette::Window); if (!windowColor.isValid()) { // When the palette changed, should update the properties if it's DColor type is variant color. updateAllColorProperties(); return; } const auto themeType = DGuiApplicationHelper::toColorType(windowColor); if (!setControlTheme(themeType)) { // When the palette changed, should update the properties if it's DColor type is variant color. updateAllColorProperties(); } } bool DQuickControlColorSelector::updateControlState() { DQMLGlobalObject::ControlState state = DQMLGlobalObject::NormalState; bool value = false; if (doGetDisabledRecu(&value) ? value : m_control && !m_control->isEnabled()) { state = DQMLGlobalObject::DisabledState; } else if (doGetPressedRecu(&value) ? value : m_control && m_control->property("pressed").toBool()) { state = DQMLGlobalObject::PressedState; } else if (doGetHoveredRecu(&value) ? value : m_control && m_control->property("hovered").toBool()) { state = DQMLGlobalObject::HoveredState; } else if (doGetInactivedRecu(&value) ? value : m_controlWindow && !m_controlWindow->isActive()) { state = DQMLGlobalObject::InactiveState; } return setControlState(state); } void DQuickControlColorSelector::updateAllColorProperties() { for (int i = 0; i < m_metaObject->count(); ++i) { auto p = m_metaObject->name(i); if (p.isEmpty()) continue; updatePropertyFromName(p); } } void DQuickControlColorSelector::recvPaletteColorChanged() { auto palette = qobject_cast(sender()); Q_ASSERT(palette); // Maybe the multiple properties is use a same palette. for (const auto &i : qAsConst(m_palettes)) { if (i.second != palette) continue; updatePropertyFromName(i.first, palette); } } void DQuickControlColorSelector::onPaletteDestroyed() { auto palette = sender(); Q_ASSERT(palette); // Maybe the multiple properties is use a same palette. for (const auto &i : qAsConst(m_palettes)) { if (i.second != palette) continue; setPalette(i.first, nullptr); } } void DQuickControlColorSelector::updateControlWindow() { if (m_controlWindow == m_control->window()) return; if (m_controlWindow) { m_controlWindow->disconnect(this); } m_controlWindow = m_control->window(); if (m_controlWindow) { connect(m_controlWindow, &QQuickWindow::activeChanged, this, &DQuickControlColorSelector::updateControlState); updateAllColorProperties(); } } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickcontrolpalette_p.h000066400000000000000000000350331476226662700240130ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKCONTROLPALETTE_P_H #define DQUICKCONTROLPALETTE_P_H #include #include "dqmlglobalobject_p.h" #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QQuickItem; class QQuickWindow; QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class DQuickControlColor { friend class DQuickControlPalette; Q_GADGET Q_PROPERTY(DTK_QUICK_NAMESPACE::DColor common READ common WRITE setCommon FINAL) Q_PROPERTY(DTK_QUICK_NAMESPACE::DColor crystal READ crystal WRITE setCrystal FINAL) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_ANONYMOUS #endif public: DQuickControlColor(); DQuickControlColor(const DColor &color); DQuickControlColor(DQuickControlColor &&other) {data = std::move(other.data); other.data = nullptr; changed = std::move(other.changed); isSingleColor = std::move(other.isSingleColor);} DQuickControlColor(const DQuickControlColor &other) { isSingleColor = other.isSingleColor; if (other.isSingleColor) { data = new DColor(*other.data); } else { data = other.data; changed = other.changed; } } inline DQuickControlColor &operator=(const DQuickControlColor &other) { if (isSingleColor) { if (other.isSingleColor) { *data = *other.data; } else { delete data; data = other.data; isSingleColor = false; } } else { if (other.isSingleColor) { if (data) { setCommon(*other.data); } else { data = new DColor(*other.data); } } else { data = other.data; } } changed = other.changed; return *this; } inline DQuickControlColor &operator=(DQuickControlColor &&other) { if (data && isSingleColor) { delete data; } data = std::move(other.data); other.data = nullptr; changed = other.changed; isSingleColor = other.isSingleColor; return *this; } ~DQuickControlColor(); const DColor &common() const; void setCommon(const DColor &newCommon); const DColor &crystal() const; void setCrystal(const DColor &newCrystal); private: DQuickControlColor(DColor *colors); DColor *data = nullptr; bool changed = false; bool isSingleColor = false; }; DQUICK_END_NAMESPACE Q_DECLARE_METATYPE(DTK_QUICK_NAMESPACE::DQuickControlColor) DQUICK_BEGIN_NAMESPACE class DQuickControlPalette : public QObject { friend class DQuickControlColorSelector; Q_OBJECT Q_DISABLE_COPY(DQuickControlPalette) Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQuickControlColor normal READ normal WRITE setNormal NOTIFY normalChanged) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQuickControlColor normalDark READ normalDark WRITE setNormalDark NOTIFY normalDarkChanged) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQuickControlColor hovered READ hovered WRITE setHovered NOTIFY hoveredChanged) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQuickControlColor hoveredDark READ hoveredDark WRITE setHoveredDark NOTIFY hoveredDarkChanged) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQuickControlColor pressed READ pressed WRITE setPressed NOTIFY pressedChanged) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQuickControlColor pressedDark READ pressedDark WRITE setPressedDark NOTIFY pressedDarkChanged) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQuickControlColor disabled READ disabled WRITE setDisabled NOTIFY disabledChanged) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQuickControlColor disabledDark READ disabledDark WRITE setDisabledDark NOTIFY disabledDarkChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(Palette) #endif public: enum ColorFamily { CommonColor = 0, CrystalColor = 1, ColorFamilyCount }; Q_ENUM(ColorFamily) enum ColorGroup { Light = 0, Dark = 1 * ColorFamilyCount, ThemeTypeCount = 2, Normal = 0, Hovered = 1 * (ThemeTypeCount + ColorFamilyCount), Pressed = 2 * (ThemeTypeCount + ColorFamilyCount), Disabled = 3 * (ThemeTypeCount + ColorFamilyCount), ColorTypeCount = 4 }; explicit DQuickControlPalette(QObject *parent = nullptr); ~DQuickControlPalette(); bool enabled() const; void setEnabled(bool newEnabled); inline DColor *colorPointer(int colorPropertyIndex) { return colors.data() + colorPropertyIndex * ColorFamilyCount; } inline bool setTo(const DQuickControlColor &color, int colorPropertyIndex) { auto colors = colorPointer(colorPropertyIndex); Q_ASSERT(colors); if (color.data == colors) return color.changed; bool changed = false; const int colorCount = color.isSingleColor ? 1 : ColorFamilyCount; for (int i = 0; i < colorCount; ++i) { if (color.data[i] == colors[i]) continue; colors[i] = color.data[i]; changed = true; } return changed; } void setNormal(const DQuickControlColor &color) { if (!setTo(color, 0)) return; Q_EMIT normalChanged(); Q_EMIT changed(); } DQuickControlColor normal() { return DQuickControlColor(colorPointer(0)); } void setNormalDark(const DQuickControlColor &color) { if (!setTo(color, 1)) return; Q_EMIT normalDarkChanged(); Q_EMIT changed(); } DQuickControlColor normalDark() { return DQuickControlColor(colorPointer(1)); } void setHovered(const DQuickControlColor &color) { if (!setTo(color, 2)) return; Q_EMIT hoveredChanged(); Q_EMIT changed(); } DQuickControlColor hovered() { return DQuickControlColor(colorPointer(2)); } void setHoveredDark(const DQuickControlColor &color) { if (!setTo(color, 3)) return; Q_EMIT hoveredDarkChanged(); Q_EMIT changed(); } DQuickControlColor hoveredDark() { return DQuickControlColor(colorPointer(3)); } void setPressed(const DQuickControlColor &color) { if (!setTo(color, 4)) return; Q_EMIT pressedChanged(); Q_EMIT changed(); } DQuickControlColor pressed() { return DQuickControlColor(colorPointer(4)); } void setPressedDark(const DQuickControlColor &color) { if (!setTo(color, 5)) return; Q_EMIT pressedDarkChanged(); Q_EMIT changed(); } DQuickControlColor pressedDark() { return DQuickControlColor(colorPointer(5)); } void setDisabled(const DQuickControlColor &color) { if (!setTo(color, 6)) return; Q_EMIT disabledChanged(); Q_EMIT changed(); } DQuickControlColor disabled() { return DQuickControlColor(colorPointer(6)); } void setDisabledDark(const DQuickControlColor &color) { if (!setTo(color, 7)) return; Q_EMIT disabledDarkChanged(); Q_EMIT changed(); } DQuickControlColor disabledDark() { return DQuickControlColor(colorPointer(7)); } Q_SIGNALS: void enabledChanged(); void normalChanged(); void normalDarkChanged(); void hoveredChanged(); void hoveredDarkChanged(); void pressedChanged(); void pressedDarkChanged(); void disabledChanged(); void disabledDarkChanged(); void changed(); public: QVector colors; private: bool m_enabled = true; }; DQUICK_END_NAMESPACE QML_DECLARE_TYPE(DTK_QUICK_NAMESPACE::DQuickControlPalette) DQUICK_BEGIN_NAMESPACE class CustomMetaObject; class DQuickControlColorSelector : public QObject { friend class CustomMetaObject; Q_OBJECT #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_UNCREATABLE("ColorSelector is only available as an attached property.") QML_NAMED_ELEMENT(ColorSelector) QML_ATTACHED(DQuickControlColorSelector) #endif Q_DISABLE_COPY(DQuickControlColorSelector) public: Q_PROPERTY(QQuickItem *control READ control NOTIFY controlChanged) Q_PROPERTY(DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType controlTheme READ controlTheme NOTIFY controlThemeChanged) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQMLGlobalObject::ControlState controlState READ controlState NOTIFY controlStateChanged) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQuickControlPalette::ColorFamily family READ family WRITE setFamily RESET resetFamily NOTIFY familyChanged) Q_PROPERTY(bool hovered READ hovered WRITE setHovered RESET resetHovered NOTIFY hoveredChanged) Q_PROPERTY(bool pressed READ pressed WRITE setPressed RESET resetPressed NOTIFY pressedChanged) Q_PROPERTY(bool disabled READ disabled WRITE setDisabled RESET resetDisabled NOTIFY disabledChanged) Q_PROPERTY(bool inactived READ inactived WRITE setInactived RESET resetInactived NOTIFY inactivedChanged) Q_CLASSINFO("DefaultProperty", "palettes") explicit DQuickControlColorSelector(QQuickItem *parent); ~DQuickControlColorSelector(); static DQuickControlColorSelector *qmlAttachedProperties(QObject *object); QQuickItem *control() const; void setControl(QQuickItem *newControl); DQMLGlobalObject::ControlState controlState() const; DGuiApplicationHelper::ColorType controlTheme() const; Dtk::Quick::DQuickControlPalette::ColorFamily family() const; void setFamily(const DQuickControlPalette::ColorFamily &newFamily); void resetFamily(); bool hovered() const; void setHovered(bool newHovered); void resetHovered(); bool pressed() const; void setPressed(bool newPressed); void resetPressed(); bool disabled() const; void setDisabled(bool newDisabled); void resetDisabled(); bool inactived() const; void setInactived(bool newInactived); void resetInactived(); static QStringList specialObjectNameItems(); Q_SIGNALS: void controlThemeChanged(); void controlStateChanged(); void controlChanged(); void hoveredChanged(); void pressedChanged(); void disabledChanged(); void inactivedChanged(); void colorPropertyChanged(const QByteArray &name); void colorPropertiesChanged(); void familyChanged(); private: bool doGetHoveredRecu(bool *value) const; bool doGetPressedRecu(bool *value) const; bool doGetDisabledRecu(bool *value) const; bool doGetInactivedRecu(bool *value) const; void doSetHovered(bool newHovered, bool isUserSet); void doSetPressed(bool newPressed, bool isUserSet); void doSetDisabled(bool newDisabled, bool isUserSet); void doSetInactived(bool newInactived, bool isUserSet); void ensureMetaObject(); void setupMetaPropertyPalettes(QQuickItem *object); struct PaletteState; QColor getColorOf(const DQuickControlPalette *palette, const PaletteState *state) const; QColor getColorOf(const QByteArray &propertyName, const PaletteState *state) const; int indexOfPalette(const QByteArray &name) const; void setPalette(const QByteArray &name, DQuickControlPalette *palette); void updatePaletteFromMetaProperty(const QMetaProperty &mp, const QObject *obj); void updatePropertyFromName(const QByteArray &name, const DQuickControlPalette *palette = nullptr); void updateFamilyForChildrenRecu(QQuickItem *parent); void findAndSetControlParent(); QByteArray findPalettePropertyName(const DQuickControlPalette *palette) const; void clearAndInheritParentProperties(); Q_SLOT void updateControlTheme(); Q_SLOT bool updateControlState(); Q_SLOT void updateAllColorProperties(); Q_SLOT void recvPaletteColorChanged(); Q_SLOT void onPaletteDestroyed(); Q_SLOT void updateControlWindow(); Q_SLOT void resolveMetaPropertyChanged(); Q_SLOT void notifyColorPropertyChanged(); bool setControlTheme(DGuiApplicationHelper::ColorType theme); bool setControlState(DQMLGlobalObject::ControlState state); bool doSetFamily(DQuickControlPalette::ColorFamily newFamily); void doResetFamily(); void tryDestroyPalette(DQuickControlPalette *palette); void setSuperColorSelector(DQuickControlColorSelector *parent); void setFamilyPropertyParent(DQuickControlColorSelector *parent); QQuickItem *m_control = nullptr; QQuickWindow *m_controlWindow = nullptr; QPointer m_superColorSelector; QPointer m_parentOfFamilyProperty; typedef QPair ControlPaletteData; QList m_palettes; CustomMetaObject *m_metaObject = nullptr; #if QT_VERSION <= QT_VERSION_CHECK(6, 2, 4) QQmlPropertyCache *m_propertyCache = nullptr; #else QQmlPropertyCache::ConstPtr m_propertyCache; #endif struct PaletteState { PaletteState(DQuickControlColorSelector *owner) : owner(owner) , controlState(DQMLGlobalObject::NormalState) , family(DQuickControlPalette::CommonColor) , familyIsUserSet(false) , hovered(false) , hoveredValueValid(false) , pressed(false) , pressedValueValid(false) , disabled(false) , disabledValueValid(false) , inactived(false) , inactivedValueValid(false) { if (auto appHelper = DGuiApplicationHelper::instance()) { controlTheme = appHelper->themeType(); } else { controlTheme = DGuiApplicationHelper::LightType; } } DQuickControlColorSelector *owner = nullptr; DGuiApplicationHelper::ColorType controlTheme; DQMLGlobalObject::ControlState controlState; DQuickControlPalette::ColorFamily family; uint familyIsUserSet:1; uint hovered:1; uint hoveredValueValid:1; uint pressed:1; uint pressedValueValid:1; uint disabled:1; uint disabledValueValid:1; uint inactived:1; uint inactivedValueValid:1; }; QScopedPointer m_state; QList m_itemParentChangeConnections; }; DQUICK_END_NAMESPACE QML_DECLARE_TYPE(DTK_QUICK_NAMESPACE::DQuickControlColorSelector) QML_DECLARE_TYPEINFO(DTK_QUICK_NAMESPACE::DQuickControlColorSelector, QML_HAS_ATTACHED_PROPERTIES) #endif // DQUICKCONTROLPALETTE_P_H dtkdeclarative-5.7.12/src/private/dquickdciicon.cpp000066400000000000000000000125701476226662700224010ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickdciicon_p.h" DQUICK_BEGIN_NAMESPACE class DQuickDciIconPrivate : public QSharedData { public: int width = -1; int height = -1; QString name; QUrl source; DQMLGlobalObject::ControlState mode = DQMLGlobalObject::NormalState; DGuiApplicationHelper::ColorType theme = DGuiApplicationHelper::ColorType::LightType; DDciIconPalette palette; bool fallbackToQIcon = true; }; /*! \class Dtk::Quick::DQuickDciIcon \inmodule dtkdeclarative \brief A dci icon type for qml. This is a DCI icon type that can be added to QML. Since controls in QML Quick cannot be inherited individually, we can only inherit some internal controls and internalize them. It may not show up directly in your help documentation, but you can still use it normally. For example, you can use it in a Button control, such as the code below: \code import org.deepin.dtk.controls 1.0 as D Button { id: btn text: "A Button" icon.name: "button_add" icon.width: 32 D.DciIcon.type: D.DciIcon.TextType } \endcode You may need to know about DCI icons. The DCI icon can automatically return the icon you need to display according to the DCI file you provide and the current icon status and icon mode. For example, You might need to highlight a selected icon, All you need to do is provide a DCI file that holds various schema icons and choose to use the Text or Action type, so we can help you with the task of highlighting icons. \note If your DCI file does not contain icons under the corresponding Mode, we will render the icons in the Normal Mode you provided to complete the state you want. \warning Icon type icons will not be rendered in different modes. */ DQuickDciIcon::DQuickDciIcon() : d(new DQuickDciIconPrivate) { } DQuickDciIcon::DQuickDciIcon(const DQuickDciIcon &other) : d(other.d) { } DQuickDciIcon::~DQuickDciIcon() { } DQuickDciIcon &DQuickDciIcon::operator=(const DQuickDciIcon &other) { d = other.d; return *this; } bool DQuickDciIcon::operator==(const DQuickDciIcon &other) const { return d == other.d || (d->name == other.name() && d->width == other.width() && d->height == other.height() && d->mode == other.mode() && d->theme == other.theme() && d->palette == other.palette()); } bool DQuickDciIcon::operator!=(const DQuickDciIcon &other) const { return !(*this == other); } /*! \brief Determine whether the icon data is empty. \return Return true if is empty, otherwise return false. */ bool DQuickDciIcon::isEmpty() const { return d->name.isEmpty() && d->source.isEmpty(); } /*! \property Dtk::Quick::DQuickDciIcon::name \brief Represents the path of the icon. Typically, \return the path to the DCI file. */ QString DQuickDciIcon::name() const { return d->name; } void DQuickDciIcon::setName(const QString &source) { d->name = source; } void DQuickDciIcon::resetName() { d->name = QString(); } /*! \property Dtk::Quick::DQuickDciIcon::width \brief Represents the width of the icon. */ int DQuickDciIcon::width() const { return d->width; } void DQuickDciIcon::setWidth(int width) { d->width = width; } void DQuickDciIcon::resetWidth() { d->width = 0; } /*! \property Dtk::Quick::DQuickDciIcon::height \brief Represents the height of the icon. */ int DQuickDciIcon::height() const { return d->height; } void DQuickDciIcon::setHeight(int height) { d->height = height; } void DQuickDciIcon::resetHeight() { d->height = 0; } /*! \property Dtk::Quick::DQuickDciIcon::mode \brief Represents the mode of the icon. */ DQMLGlobalObject::ControlState DQuickDciIcon::mode() const { return d->mode; } void DQuickDciIcon::setMode(DQMLGlobalObject::ControlState mode) { d->mode = mode; } void DQuickDciIcon::resetMode() { d->mode = DQMLGlobalObject::NormalState; } /*! \property Dtk::Quick::DQuickDciIcon::theme \brief Represents the theme of the icon. */ DGuiApplicationHelper::ColorType DQuickDciIcon::theme() const { return d->theme; } void DQuickDciIcon::setTheme(DGuiApplicationHelper::ColorType theme) { d->theme = theme; } void DQuickDciIcon::resetTheme() { d->theme = DGuiApplicationHelper::ColorType::LightType; } /*! \property Dtk::Quick::DQuickDciIcon::palette \brief Represents the palette of the icon. */ DDciIconPalette DQuickDciIcon::palette() const { return d->palette; } void DQuickDciIcon::setPalette(const DDciIconPalette &palette) { d->palette = palette; } void DQuickDciIcon::resetPalette() { d->palette = DDciIconPalette(); } const QUrl &DQuickDciIcon::source() const { return d->source; } void DQuickDciIcon::setSource(const QUrl &newSource) { d->source = newSource; } void DQuickDciIcon::resetSource() { d->source.clear(); } bool DQuickDciIcon::fallbackToQIcon() const { return d->fallbackToQIcon; } void DQuickDciIcon::setFallbackToQIcon(bool newFallbackToQIcon) { d->fallbackToQIcon = newFallbackToQIcon; } void DQuickDciIcon::resetFallbackToQIcon() { d->fallbackToQIcon = true; } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickdciicon_p.h000066400000000000000000000050251476226662700223620ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKDCIICON_P_H #define DQUICKDCIICON_P_H #include #include #include #include #include #include "dquickdciiconimage_p.h" DQUICK_BEGIN_NAMESPACE DGUI_USE_NAMESPACE class DQuickDciIconPrivate; class DQuickDciIcon { Q_GADGET Q_PROPERTY(QString name READ name WRITE setName RESET resetName FINAL) Q_PROPERTY(int width READ width WRITE setWidth RESET resetWidth FINAL) Q_PROPERTY(int height READ height WRITE setHeight RESET resetHeight FINAL) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQMLGlobalObject::ControlState mode READ mode WRITE setMode RESET resetMode FINAL) Q_PROPERTY(DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType theme READ theme WRITE setTheme RESET resetTheme FINAL) Q_PROPERTY(DTK_GUI_NAMESPACE::DDciIconPalette palette READ palette WRITE setPalette RESET resetTheme FINAL) // for Qt icon Q_PROPERTY(QUrl source READ source WRITE setSource RESET resetSource FINAL) Q_PROPERTY(bool fallbackToQIcon READ fallbackToQIcon WRITE setFallbackToQIcon RESET resetFallbackToQIcon) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_ANONYMOUS #endif public: DQuickDciIcon(); DQuickDciIcon(const DQuickDciIcon &other); ~DQuickDciIcon(); DQuickDciIcon& operator=(const DQuickDciIcon &other); bool operator==(const DQuickDciIcon &other) const; bool operator!=(const DQuickDciIcon &other) const; bool isEmpty() const; QString name() const; void setName(const QString &name); void resetName(); int width() const; void setWidth(int width); void resetWidth(); int height() const; void setHeight(int height); void resetHeight(); DQMLGlobalObject::ControlState mode() const; void setMode(DQMLGlobalObject::ControlState mode); void resetMode(); DGuiApplicationHelper::ColorType theme() const; void setTheme(DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType theme); void resetTheme(); DDciIconPalette palette() const; void setPalette(const DDciIconPalette &palette); void resetPalette(); const QUrl &source() const; void setSource(const QUrl &newSource); void resetSource(); bool fallbackToQIcon() const; void setFallbackToQIcon(bool newFallbackToQIcon); void resetFallbackToQIcon(); private: QSharedDataPointer d; }; DQUICK_END_NAMESPACE #endif // DQUICKDCIICON_P_H dtkdeclarative-5.7.12/src/private/dquickdciiconimage.cpp000066400000000000000000000307031476226662700234020ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickdciiconimage_p_p.h" #include #include #include #include DQUICK_BEGIN_NAMESPACE DGUI_USE_NAMESPACE static QString appIconThemeName() { return DGuiApplicationHelper::instance()->applicationTheme()->iconThemeName(); } static QString findDciIconPath(const QString &iconName, const QString &themeName) { QString iconPath; auto cached = DIconTheme::cached(); if (cached) { iconPath = cached->findDciIconFile(iconName, themeName); } else { iconPath = DIconTheme::findDciIconFile(iconName, themeName); } return iconPath; } static DDciIcon::Mode controlState2DciMode(int state) { DDciIcon::Mode dcimode = DDciIcon::Normal; switch (state) { case DQMLGlobalObject::NormalState: dcimode = DDciIcon::Normal; break; case DQMLGlobalObject::DisabledState: dcimode = DDciIcon::Disabled; break; case DQMLGlobalObject::HoveredState: dcimode = DDciIcon::Hover; break; case DQMLGlobalObject::PressedState: dcimode = DDciIcon::Pressed; break; default: break; } return dcimode; } static inline DDciIcon::Theme dciTheme(DGuiApplicationHelper::ColorType type) { return type == DGuiApplicationHelper::DarkType ? DDciIcon::Dark : DDciIcon::Light; } DQuickDciIconImageItemPrivate::DQuickDciIconImageItemPrivate(DQuickDciIconImagePrivate *pqq) : parentPriv(pqq) { } void DQuickDciIconImageItemPrivate::maybeUpdateUrl() { Q_Q(DQuickIconImage); if (parentPriv->imageItem->name().isEmpty() || iconType != ThemeIconName) { return DQuickIconImagePrivate::maybeUpdateUrl(); } if (!DQMLGlobalObject::hasAnimation()) { QUrl url; url.setScheme(QLatin1String("image")); url.setHost(QLatin1String("dtk.dci.icon")); url.setQuery(getUrlQuery()); q->setSource(url); return; } QString iconPath = findDciIconPath(parentPriv->imageItem->name(), appIconThemeName()); if (iconPath.isEmpty()) return DQuickIconImagePrivate::maybeUpdateUrl(); updatePlayer(); if (player) player->setMode(controlState2DciMode(parentPriv->mode)); } void DQuickDciIconImageItemPrivate::play(int mode) { Q_Q(DQuickIconImage); if (parentPriv->imageItem->name().isEmpty() || iconType != ThemeIconName) { return; } updatePlayer(); if (player) player->play(controlState2DciMode(mode)); } QUrlQuery DQuickDciIconImageItemPrivate::getUrlQuery() { QUrlQuery query; query.addQueryItem(QLatin1String("name"), parentPriv->imageItem->name()); query.addQueryItem(QLatin1String("mode"), QString::number(parentPriv->mode)); query.addQueryItem(QLatin1String("theme"), QString::number(parentPriv->theme)); query.addQueryItem(QLatin1String("themeName"), QIcon::themeName()); DDciIconPalette pal = parentPriv->palette; if (!parentPriv->palette.foreground().isValid() && q_func()->color().isValid()) { pal.setForeground(q_func()->color()); } query.addQueryItem(QLatin1String("palette"), DDciIconPalette::convertToString(pal)); query.addQueryItem(QLatin1String("devicePixelRatio"), QString::number(devicePixelRatio)); query.addQueryItem(QLatin1String("fallbackToQIcon"), QString::number(parentPriv->fallbackToQIcon)); return query; } void DQuickDciIconImageItemPrivate::updatePlayerIconSize() { if (!player) return; int boundingSize = qMax(q_func()->sourceSize().width(), q_func()->sourceSize().height()); player->setIconSize(boundingSize); } void DQuickDciIconImageItemPrivate::updatePlayer() { if (!player) { Q_Q(DQuickIconImage); player = new DDciIconPlayer(parentPriv->imageItem); QObject::connect(player, &DDciIconPlayer::updated, parentPriv->imageItem, [this](){ parentPriv->imageItem->setImage(player->currentImage()); }); QObject::connect(parentPriv->imageItem, &DQuickIconImage::sourceSizeChanged, player, [this](){ updatePlayerIconSize(); }); // 只在初始化和 sourceSizeChanged 时更新图标大小 // 防止出现 dpr > 1.0 时未设置 sourceSize 的 item 在 updatePlayer 时图标一直放大 updatePlayerIconSize(); } QString iconPath = findDciIconPath(parentPriv->imageItem->name(), appIconThemeName()); // 防止频繁构造 dciicon if (iconPathCache != iconPath) { DDciIcon dciIcon(iconPath); if (!dciIcon.isNull()) { player->setIcon(dciIcon); iconPathCache = iconPath; } } player->setTheme(dciTheme(parentPriv->theme)); DDciIconPalette palette = parentPriv->palette; if (!parentPriv->palette.foreground().isValid() && q_func()->color().isValid()) palette.setForeground(q_func()->color()); player->setPalette(palette); // treeland下拿qApp的缩放不准确,初始化的时候尝试去更新一次缩放 updateDevicePixelRatio(1.0); player->setDevicePixelRatio(devicePixelRatio); } DQuickDciIconImagePrivate::DQuickDciIconImagePrivate(DQuickDciIconImage *qq) : DObjectPrivate(qq) , imageItem(new DQuickIconImage(*new DQuickDciIconImageItemPrivate(this), qq)) { QObject::connect(imageItem, &DQuickIconImage::nameChanged, qq, &DQuickDciIconImage::nameChanged); QObject::connect(imageItem, &DQuickIconImage::asynchronousChanged, qq, &DQuickDciIconImage::asynchronousChanged); QObject::connect(imageItem, &DQuickIconImage::cacheChanged, qq, &DQuickDciIconImage::cacheChanged); #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) QObject::connect(imageItem, &DQuickIconImage::retainWhileLoadingChanged, qq, &DQuickDciIconImage::retainWhileLoadingChanged); #endif } void DQuickDciIconImagePrivate::layout() { auto dd = QQuickItemPrivate::get(imageItem); dd->anchors()->setCenterIn(imageItem->parentItem()); } void DQuickDciIconImagePrivate::updateImageSourceUrl() { imageItem->d_func()->maybeUpdateUrl(); } void DQuickDciIconImagePrivate::play(DQMLGlobalObject::ControlState mode) { imageItem->d_func()->play(mode); } DQuickDciIconImage::DQuickDciIconImage(QQuickItem *parent) : QQuickItem(parent) , DObject(*new DQuickDciIconImagePrivate(this)) { D_D(DQuickDciIconImage); connect(d->imageItem, &QQuickImage::implicitWidthChanged, this, [this, d]() { setImplicitWidth(d->imageItem->implicitWidth()); }); connect(d->imageItem, &QQuickImage::implicitHeightChanged, this, [this, d]() { setImplicitHeight(d->imageItem->implicitHeight()); }); } DQuickDciIconImage::~DQuickDciIconImage() { } QString DQuickDciIconImage::name() const { D_DC(DQuickDciIconImage); return d->imageItem->name(); } void DQuickDciIconImage::setName(const QString &name) { D_D(DQuickDciIconImage); d->imageItem->setName(name); } DQMLGlobalObject::ControlState DQuickDciIconImage::mode() const { D_DC(DQuickDciIconImage); return d->mode; } void DQuickDciIconImage::setMode(DQMLGlobalObject::ControlState mode) { D_D(DQuickDciIconImage); if (d->mode == mode) return; d->mode = mode; d->updateImageSourceUrl(); Q_EMIT modeChanged(); } void DQuickDciIconImage::play(DQMLGlobalObject::ControlState mode) { D_D(DQuickDciIconImage); if (d->imageItem) d->play(mode); } DGuiApplicationHelper::ColorType DQuickDciIconImage::theme() const { D_DC(DQuickDciIconImage); return d->theme; } void DQuickDciIconImage::setTheme(DGuiApplicationHelper::ColorType theme) { D_D(DQuickDciIconImage); if (d->theme == theme) return; d->theme = theme; d->updateImageSourceUrl(); Q_EMIT themeChanged(); } DDciIconPalette DQuickDciIconImage::palette() const { D_DC(DQuickDciIconImage); return d->palette; } void DQuickDciIconImage::setPalette(const DDciIconPalette &palette) { D_D(DQuickDciIconImage); if (d->palette == palette) return; d->palette = palette; d->updateImageSourceUrl(); Q_EMIT paletteChanged(); } QSize DQuickDciIconImage::sourceSize() const { D_DC(DQuickDciIconImage); return d->imageItem->sourceSize(); } void DQuickDciIconImage::setSourceSize(const QSize &size) { D_D(DQuickDciIconImage); d->imageItem->setSourceSize(size); Q_EMIT sourceSizeChanged(); } void DQuickDciIconImage::setMirror(bool mirror) { D_D(DQuickDciIconImage); d->imageItem->setMirror(mirror); } bool DQuickDciIconImage::mirror() const { D_DC(DQuickDciIconImage); return d->imageItem->mirror(); } bool DQuickDciIconImage::fallbackToQIcon() const { D_DC(DQuickDciIconImage); return d->fallbackToQIcon; } void DQuickDciIconImage::setFallbackToQIcon(bool newFallbackToQIcon) { D_D(DQuickDciIconImage); if (d->fallbackToQIcon == newFallbackToQIcon) return; d->fallbackToQIcon = newFallbackToQIcon; Q_EMIT fallbackToQIconChanged(); d->updateImageSourceUrl(); } bool DQuickDciIconImage::asynchronous() const { D_DC(DQuickDciIconImage); return d->imageItem->asynchronous(); } void DQuickDciIconImage::setAsynchronous(bool async) { D_D(DQuickDciIconImage); d->imageItem->setAsynchronous(async); } #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) bool DQuickDciIconImage::retainWhileLoading() const { D_DC(DQuickDciIconImage); return d->imageItem->retainWhileLoading(); } void DQuickDciIconImage::setRetainWhileLoading(bool retain) { D_D(DQuickDciIconImage); d->imageItem->setRetainWhileLoading(retain); } #endif bool DQuickDciIconImage::cache() const { D_DC(DQuickDciIconImage); return d->imageItem->cache(); } void DQuickDciIconImage::setCache(bool cache) { D_D(DQuickDciIconImage); d->imageItem->setCache(cache); } Dtk::Quick::DQuickIconImage *DQuickDciIconImage::imageItem() const { D_DC(DQuickDciIconImage); return d->imageItem; } bool DQuickDciIconImage::isNull(const QString &iconName) { return findDciIconPath(iconName, appIconThemeName()).isEmpty(); } DQuickIconAttached *DQuickDciIconImage::qmlAttachedProperties(QObject *object) { auto item = qobject_cast(object); if (!item) return nullptr; return new DQuickIconAttached(item); } void DQuickDciIconImage::classBegin() { D_D(DQuickDciIconImage); QQmlEngine::setContextForObject(d->imageItem, QQmlEngine::contextForObject(this)); QQuickItem::classBegin(); } void DQuickDciIconImage::componentComplete() { D_D(DQuickDciIconImage); d->imageItem->componentComplete(); QQuickItem::componentComplete(); d->layout(); } class DQuickIconAttachedPrivate : public DCORE_NAMESPACE::DObjectPrivate { D_DECLARE_PUBLIC(DQuickIconAttached) public: DQuickIconAttachedPrivate(DCORE_NAMESPACE::DObject *qq) : DObjectPrivate(qq) {} DQMLGlobalObject::ControlState mode = DQMLGlobalObject::NormalState; DGuiApplicationHelper::ColorType theme = DGuiApplicationHelper::ColorType::LightType; DDciIconPalette palette; bool fallbackToQIcon = true; }; DQuickIconAttached::DQuickIconAttached(QQuickItem *parent) : QObject(parent) , DObject(*new DQuickIconAttachedPrivate(this)) { } DQuickIconAttached::~DQuickIconAttached() { } DQMLGlobalObject::ControlState DQuickIconAttached::mode() const { D_DC(DQuickIconAttached); return d->mode; } void DQuickIconAttached::setMode(DQMLGlobalObject::ControlState mode) { D_D(DQuickIconAttached); if (d->mode == mode) return; d->mode = mode; Q_EMIT modeChanged(); } DGuiApplicationHelper::ColorType DQuickIconAttached::theme() const { D_DC(DQuickIconAttached); return d->theme; } void DQuickIconAttached::setTheme(DGuiApplicationHelper::ColorType theme) { D_D(DQuickIconAttached); if (d->theme == theme) return; d->theme = theme; Q_EMIT themeChanged(); } DDciIconPalette DQuickIconAttached::palette() const { D_DC(DQuickIconAttached); return d->palette; } void DQuickIconAttached::setPalette(const DDciIconPalette &palette) { D_D(DQuickIconAttached); if (d->palette == palette) return; d->palette = palette; Q_EMIT paletteChanged(); } bool DQuickIconAttached::fallbackToQIcon() const { D_DC(DQuickIconAttached); return d->fallbackToQIcon; } void DQuickIconAttached::setFallbackToQIcon(bool newFallbackToQIcon) { D_D(DQuickIconAttached); if (d->fallbackToQIcon == newFallbackToQIcon) return; d->fallbackToQIcon = newFallbackToQIcon; Q_EMIT fallbackToQIconChanged(); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickdciiconimage_p.h000066400000000000000000000113211476226662700233610ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKDCIICONIMAGE_P_H #define DQUICKDCIICONIMAGE_P_H #include "dquickiconimage_p.h" #include "dqmlglobalobject_p.h" #include #include #include #include DQUICK_BEGIN_NAMESPACE DGUI_USE_NAMESPACE class DQuickDciIconImageItem; class DQuickIconAttached; class DQuickDciIconImagePrivate; class DQuickDciIconImage : public QQuickItem, DCORE_NAMESPACE::DObject { Q_OBJECT D_DECLARE_PRIVATE(DQuickDciIconImage) Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged FINAL) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQMLGlobalObject::ControlState mode READ mode WRITE setMode NOTIFY modeChanged FINAL) Q_PROPERTY(DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType theme READ theme WRITE setTheme NOTIFY themeChanged FINAL) Q_PROPERTY(DTK_GUI_NAMESPACE::DDciIconPalette palette READ palette WRITE setPalette NOTIFY paletteChanged) Q_PROPERTY(QSize sourceSize READ sourceSize WRITE setSourceSize NOTIFY sourceSizeChanged) Q_PROPERTY(bool mirror READ mirror WRITE setMirror NOTIFY mirrorChanged) Q_PROPERTY(bool fallbackToQIcon READ fallbackToQIcon WRITE setFallbackToQIcon NOTIFY fallbackToQIconChanged) Q_PROPERTY(bool asynchronous READ asynchronous WRITE setAsynchronous NOTIFY asynchronousChanged) Q_PROPERTY(bool cache READ cache WRITE setCache NOTIFY cacheChanged FINAL) #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) Q_PROPERTY(bool retainWhileLoading READ retainWhileLoading WRITE setRetainWhileLoading NOTIFY retainWhileLoadingChanged) #endif #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(DciIcon) QML_ATTACHED(DQuickIconAttached) #endif public: explicit DQuickDciIconImage(QQuickItem *parent = nullptr); ~DQuickDciIconImage() override; QString name() const; void setName(const QString &name); DQMLGlobalObject::ControlState mode() const; void setMode(DQMLGlobalObject::ControlState mode); Q_INVOKABLE void play(DQMLGlobalObject::ControlState mode); DGuiApplicationHelper::ColorType theme() const; void setTheme(DGuiApplicationHelper::ColorType theme); DDciIconPalette palette() const; void setPalette(const DDciIconPalette &palette); QSize sourceSize() const; void setSourceSize(const QSize &size); void setMirror(bool mirror); bool mirror() const; bool fallbackToQIcon() const; void setFallbackToQIcon(bool newFallbackToQIcon); bool asynchronous() const; void setAsynchronous(bool async); bool cache() const; void setCache(bool cache); #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) bool retainWhileLoading() const; void setRetainWhileLoading(bool retain); #endif DQuickIconImage *imageItem() const; static bool isNull(const QString &iconName); static DQuickIconAttached *qmlAttachedProperties(QObject *object); Q_SIGNALS: void nameChanged(); void modeChanged(); void themeChanged(); void paletteChanged(); void sourceSizeChanged(); void mirrorChanged(); void fallbackToQIconChanged(); void asynchronousChanged(); void cacheChanged(); #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) void retainWhileLoadingChanged(); #endif protected: void classBegin() override; void componentComplete() override; }; class DQuickIconAttachedPrivate; class DQuickIconAttached : public QObject, DCORE_NAMESPACE::DObject { Q_OBJECT D_DECLARE_PRIVATE(DQuickIconAttached) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQMLGlobalObject::ControlState mode READ mode WRITE setMode NOTIFY modeChanged) Q_PROPERTY(DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType theme READ theme WRITE setTheme NOTIFY themeChanged) Q_PROPERTY(DTK_GUI_NAMESPACE::DDciIconPalette palette READ palette WRITE setPalette NOTIFY paletteChanged) Q_PROPERTY(bool fallbackToQIcon READ fallbackToQIcon WRITE setFallbackToQIcon NOTIFY fallbackToQIconChanged) public: explicit DQuickIconAttached(QQuickItem *parent); ~DQuickIconAttached(); DQMLGlobalObject::ControlState mode() const; void setMode(DQMLGlobalObject::ControlState mode); DGuiApplicationHelper::ColorType theme() const; void setTheme(DGuiApplicationHelper::ColorType theme); DDciIconPalette palette() const; void setPalette(const DDciIconPalette &palette); bool fallbackToQIcon() const; void setFallbackToQIcon(bool newFallbackToQIcon); Q_SIGNALS: void modeChanged(); void themeChanged(); void paletteChanged(); void fallbackToQIconChanged(); }; DQUICK_END_NAMESPACE QML_DECLARE_TYPEINFO(DTK_QUICK_NAMESPACE::DQuickDciIconImage, QML_HAS_ATTACHED_PROPERTIES) #endif // DQUICKDCIICONIMAGE_P_H dtkdeclarative-5.7.12/src/private/dquickdciiconimage_p_p.h000066400000000000000000000027401476226662700237050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKDCIICONIMAGE_P_P_H #define DQUICKDCIICONIMAGE_P_P_H #include "dquickiconimage_p.h" #include "dqmlglobalobject_p.h" #include "dquickdciiconimage_p.h" #include "dquickiconimage_p_p.h" #include #include #include DQUICK_BEGIN_NAMESPACE class DQuickDciIconImageItemPrivate; class DQuickDciIconImageItemPrivate : public DQuickIconImagePrivate { Q_DECLARE_PUBLIC(DQuickIconImage) public: DQuickDciIconImageItemPrivate(DQuickDciIconImagePrivate *pqq); void maybeUpdateUrl(); void play(int mode); QUrlQuery getUrlQuery(); void updatePlayer(); void updatePlayerIconSize(); private: DQuickDciIconImagePrivate *parentPriv; DDciIconPlayer *player = nullptr; QString iconPathCache; }; class DQuickDciIconImagePrivate : public DCORE_NAMESPACE::DObjectPrivate { Q_DECLARE_PUBLIC(DQuickDciIconImage) public: DQuickDciIconImagePrivate(DQuickDciIconImage *qq); void layout(); void updateImageSourceUrl(); void play(DQMLGlobalObject::ControlState mode); DDciIconPalette palette; DQuickIconImage *imageItem; DQMLGlobalObject::ControlState mode = DQMLGlobalObject::NormalState; DGuiApplicationHelper::ColorType theme = DGuiApplicationHelper::ColorType::LightType; bool fallbackToQIcon = true; }; DQUICK_END_NAMESPACE #endif // DQUICKDCIICONIMAGE_P_P_H dtkdeclarative-5.7.12/src/private/dquickglobal_p.h000066400000000000000000000010201476226662700222010ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKGLOBAL_P_H #define DQUICKGLOBAL_P_H #include #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) #define ThrowError(obj, message) {\ auto e = qmlEngine(obj);\ if (e) e->throwError(message);\ else qCritical().noquote() << message.toLocal8Bit();\ } #else #define ThrowError(obj, message) \ qCritical().noquote() << message.toLocal8Bit() #endif #endif // DQUICKGLOBAL_P_H dtkdeclarative-5.7.12/src/private/dquickglow.cpp000066400000000000000000000062331476226662700217400ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickglow_p.h" #include "private/dquickglow_p_p.h" #include "private/dshadownode_p.h" DQUICK_BEGIN_NAMESPACE DQuickGlow::DQuickGlow(QQuickItem *parent) : QQuickItem(*(new DQuickGlowPrivate), parent) { setFlag(ItemHasContents, true); } qreal DQuickGlow::glowRadius() const { Q_D(const DQuickGlow); return d->glowRadius; } void DQuickGlow::setGlowRadius(qreal radius) { Q_D(DQuickGlow); if(qFuzzyCompare(d->glowRadius, radius)) return; d->glowRadius = radius; update(); Q_EMIT glowRadiusChanged(); } QColor DQuickGlow::color() const { Q_D(const DQuickGlow); return d->color; } void DQuickGlow::setColor(const QColor &color) { Q_D(DQuickGlow); if (d->color == color) return; d->color = color; update(); Q_EMIT colorChanged(); } qreal DQuickGlow::spread() const { Q_D(const DQuickGlow); return d->spread; } void DQuickGlow::setSpread(qreal radius) { Q_D(DQuickGlow); if (qFuzzyCompare(d->spread, radius)) return; d->spread = radius; update(); Q_EMIT spreadChanged(); } qreal DQuickGlow::relativeSizeX() const { Q_D(const DQuickGlow); return d->relativeSizeX; } void DQuickGlow::setRelativeSizeX(qreal x) { Q_D(DQuickGlow); if (qFuzzyCompare(d->relativeSizeX, x)) return; d->relativeSizeX = x; update(); Q_EMIT relativeSizeXChanged(); } qreal DQuickGlow::relativeSizeY() const { Q_D(const DQuickGlow); return d->relativeSizeY; } void DQuickGlow::setRelativeSizeY(qreal y) { Q_D(DQuickGlow); if (qFuzzyCompare(d->relativeSizeY, y)) return; d->relativeSizeY = y; update(); Q_EMIT relativeSizeYChangd(); } bool DQuickGlow::fill() { Q_D(const DQuickGlow); return d->fill; } void DQuickGlow::setFill(bool isFill) { Q_D(DQuickGlow); if (d->fill == isFill) return; d->fill = isFill; update(); Q_EMIT fillChanged(); } QSGNode *DQuickGlow::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) { Q_UNUSED(data); Q_D(const DQuickGlow); if (width() <= 0 || height() <= 0 || d->color.alpha() == 0) { delete oldNode; return nullptr; } ShadowNode *shadow = static_cast(oldNode); if (!shadow) { QSGRendererInterface *ri = window()->rendererInterface(); if (Q_UNLIKELY(ri && ri->graphicsApi() == QSGRendererInterface::Software)) { // TODO(xiaoyaobing): Software rendering is not supported yet return nullptr; } else { shadow = new ShadowNode; } } shadow->setRect(QRectF(0, 0, width(), height())); shadow->setColor(d->color); shadow->setGlowRadius(d->glowRadius); shadow->setRelativeSizeX(d->relativeSizeX); shadow->setRelativeSizeY(d->relativeSizeY); shadow->setSpread(d->spread); shadow->setFill(d->fill); shadow->update(); return shadow; } DQuickGlow::DQuickGlow(DQuickGlowPrivate &dd, QQuickItem *parent) : QQuickItem (dd, parent) { } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickglow_p.h000066400000000000000000000035441476226662700217260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKGLOW_P_H #define DQUICKGLOW_P_H #include #include #include DQUICK_BEGIN_NAMESPACE class DQuickGlowPrivate; class Q_DECL_EXPORT DQuickGlow : public QQuickItem { Q_OBJECT Q_PROPERTY(qreal glowRadius READ glowRadius WRITE setGlowRadius NOTIFY glowRadiusChanged) Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) Q_PROPERTY(qreal spread READ spread WRITE setSpread NOTIFY spreadChanged) Q_PROPERTY(qreal relativeSizeX READ relativeSizeX WRITE setRelativeSizeX NOTIFY relativeSizeXChanged) Q_PROPERTY(qreal relativeSizeY READ relativeSizeY WRITE setRelativeSizeY NOTIFY relativeSizeYChangd) Q_PROPERTY(bool fill READ fill WRITE setFill NOTIFY fillChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(GlowEffect) #endif public: explicit DQuickGlow(QQuickItem *parent = nullptr); qreal glowRadius() const; void setGlowRadius(qreal radius); QColor color() const; void setColor(const QColor &); qreal spread() const; void setSpread(qreal radius); qreal relativeSizeX() const; void setRelativeSizeX(qreal x); qreal relativeSizeY() const; void setRelativeSizeY(qreal y); bool fill(); void setFill(bool); Q_SIGNALS: void glowRadiusChanged(); void colorChanged(); void spreadChanged(); void relativeSizeXChanged(); void relativeSizeYChangd(); void fillChanged(); protected: QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override; protected: DQuickGlow(DQuickGlowPrivate &dd, QQuickItem *parent = nullptr); private: Q_DISABLE_COPY(DQuickGlow) Q_DECLARE_PRIVATE(DQuickGlow) }; DQUICK_END_NAMESPACE #endif // DQUICKGLOW_P_H dtkdeclarative-5.7.12/src/private/dquickglow_p_p.h000066400000000000000000000011631476226662700222400ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKGLOW_P_P_H #define DQUICKGLOW_P_P_H #include "dquickglow_p.h" #include DQUICK_BEGIN_NAMESPACE class DQuickGlowPrivate : public QQuickItemPrivate { Q_DECLARE_PUBLIC(DQuickGlow) public: DQuickGlowPrivate() : QQuickItemPrivate() , fill(false) { } qreal glowRadius; QColor color; qreal spread; qreal relativeSizeX; qreal relativeSizeY; bool fill; }; DQUICK_END_NAMESPACE #endif // DQUICKGLOW_P_P_H dtkdeclarative-5.7.12/src/private/dquickiconimage.cpp000066400000000000000000000234461476226662700227300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickiconimage_p.h" #include "dquickiconimage_p_p.h" #include #include #include #include #include DGUI_USE_NAMESPACE DQUICK_BEGIN_NAMESPACE bool DQuickIconImagePrivate::updateDevicePixelRatio(qreal targetDevicePixelRatio) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) if (!qApp->testAttribute(Qt::AA_UseHighDpiPixmaps)) { devicePixelRatio = 1.0; return true; } #endif auto lastRatio = devicePixelRatio; if (targetDevicePixelRatio > 1.0) { devicePixelRatio = targetDevicePixelRatio; } else { devicePixelRatio = calculateDevicePixelRatio(); } return lastRatio != devicePixelRatio; } void DQuickIconImagePrivate::updateBase64Image() { Q_ASSERT(iconType == Base64Data); D_Q(DQuickIconImage); QImage image = requestImageFromBase64(name, q->sourceSize(), devicePixelRatio); setImage(image); } QImage DQuickIconImagePrivate::requestImageFromBase64(const QString &name, const QSize &requestedSize, qreal devicePixelRatio) { const QString flag("base64,"); const auto index = name.indexOf(flag); if (index < 0) return QImage(); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) const QString &imgData(name.sliced(index + flag.size())); #else const QString &imgData(name.left(index + flag.size())); #endif QImage image = QImage::fromData(QByteArray::fromBase64(imgData.toLatin1())); QSize icon_size = requestedSize; if (icon_size.isEmpty()) { icon_size = image.size(); } else { icon_size /= devicePixelRatio; } image = image.scaled(icon_size * devicePixelRatio, Qt::KeepAspectRatio, Qt::SmoothTransformation); return image; } void DQuickIconImagePrivate::init() { D_Q(DQuickIconImage); if (iconType == ThemeIconName) { // 强制确保图标的缩放比例正确 updateDevicePixelRatio(1.0); QObject::connect(DGuiApplicationHelper::instance()->applicationTheme(), SIGNAL(iconThemeNameChanged(QByteArray)), q, SLOT(maybeUpdateUrl())); // dtk build-in 类型的图标支持区分窗口主题色, 此处需在主题类型变化时更新图标 QObject::connect(DGuiApplicationHelper::instance(), SIGNAL(themeTypeChanged(ColorType)), q, SLOT(maybeUpdateUrl())); } else { QObject::disconnect(DGuiApplicationHelper::instance()->applicationTheme(), SIGNAL(iconThemeNameChanged(QByteArray)), q, SLOT(maybeUpdateUrl())); QObject::disconnect(DGuiApplicationHelper::instance(), SIGNAL(themeTypeChanged(ColorType)), q, SLOT(maybeUpdateUrl())); } // 更新url地址 maybeUpdateUrl(); } void DQuickIconImagePrivate::maybeUpdateUrl() { D_Q(DQuickIconImage); // 不要为非主题中的图标更新url地址 if (iconType != ThemeIconName) { if (iconType == Base64Data) updateBase64Image(); return; } // 当图标名为空视为清理图片内容 if (name.isEmpty()) { if (fallbackSource.isValid()) q->setSource(fallbackSource); return; } QUrl url; url.setScheme("image"); url.setHost("dtk.icon"); url.setQuery(getUrlQuery()); q->setSource(url); } void DQuickIconImagePrivate::play(int mode) { Q_UNUSED(mode) } QUrlQuery DQuickIconImagePrivate::getUrlQuery() { QUrlQuery query; query.addQueryItem("name", name); query.addQueryItem("themeName", QIcon::themeName()); query.addQueryItem("themeType", QString::number(int(DGuiApplicationHelper::instance()->themeType()))); query.addQueryItem("state", QString::number(int(state))); query.addQueryItem("mode", QString::number(int(getIconMode()))); if (color.isValid()) query.addQueryItem("color", color.name(QColor::HexArgb)); query.addQueryItem("devicePixelRatio", QString::number(devicePixelRatio)); return query; } DQuickIconImage::Mode DQuickIconImagePrivate::getIconMode() const { D_QC(DQuickIconImage); if (mode != DQuickIconImage::Mode::Invalid) return mode; if (!q->isEnabled()) { return DQuickIconImage::Mode::Disabled; } return DQuickIconImage::Mode::Normal; } qreal DQuickIconImagePrivate::calculateDevicePixelRatio() const { Q_Q(const DQuickIconImage); return q->window() ? q->window()->effectiveDevicePixelRatio() : qApp->devicePixelRatio(); } DQuickIconImage::DQuickIconImage(QQuickItem *parent) : QQuickImage(*(new DQuickIconImagePrivate), parent) { setAsynchronous(true); // asynchronous by default } DQuickIconImage::~DQuickIconImage() { } void DQuickIconImage::componentComplete() { QQuickImage::componentComplete(); D_D(DQuickIconImage); // 初始化信号链接和url地址 d->init(); connect(this, &QQuickItem::windowChanged, this, [this](){ D_D(DQuickIconImage); if (d->updateDevicePixelRatio(1.0)) { d->maybeUpdateUrl(); } }); } /** * @brief DQuickIconImage::name * @return Returns the name of theme icon used in QML Application. */ QString DQuickIconImage::name() const { D_DC(DQuickIconImage); return d->name; } /** * @brief DQuickIconImage::setName * @param name can set to show the icon used in QML Application. * Name can be the icon's theme name, icon's base64 data, or icon's local file, * theme name: it's icon name, and using DIconTheme to find. * base64: name starts with "data:image/". * local file: it's a local file, and have either a file: or qrc: scheme. */ void DQuickIconImage::setName(const QString &name) { D_D(DQuickIconImage); if (name == d->name) { return; } d->name = name; Q_EMIT nameChanged(); // 分析icon的类型 d->iconType = DQuickIconImagePrivate::ThemeIconName; if (name.startsWith("data:image/")) { d->iconType = DQuickIconImagePrivate::Base64Data; } else if (QQmlFile::isLocalFile(name)) { QUrl url(name); // 如果name指定的是一个url,则直接将其当作url使用 if (url.isValid()) { d->iconType = DQuickIconImagePrivate::FileUrl; setSource(url); } } if (isComponentComplete()) { d->init(); } } /** * @brief DQuickIconImage::state * @return Returns the state of theme icon used in QML Application. */ DQuickIconImage::State DQuickIconImage::state() const { D_DC(DQuickIconImage); return d->state; } /** * @brief DQuickIconImage::setState * @param state can set to show the icon used in QML Application. */ void DQuickIconImage::setState(State state) { D_D(DQuickIconImage); if (d->state == state) return; d->state = state; Q_EMIT stateChanged(); // 尝试重设图标的url地址 d->maybeUpdateUrl(); } /** * @brief DQuickIconImage::mode * @return Returns the mode of theme icon used in QML Application. */ DQuickIconImage::Mode DQuickIconImage::mode() const { D_DC(DQuickIconImage); return d->mode; } /** * @brief DQuickIconImage::setMode * @param mode can set to show the icon used in QML Application. */ void DQuickIconImage::setMode(Mode mode) { D_D(DQuickIconImage); if (d->mode == mode) return; d->mode = mode; Q_EMIT modeChanged(); // 尝试重设图标的url地址 d->maybeUpdateUrl(); } /** * @brief DQuickIconImage::color * @return Returns the color of theme icon used in QML Application. */ QColor DQuickIconImage::color() const { D_DC(DQuickIconImage); return d->color; } /** * @brief DQuickIconImage::setColor * @param color can set to show the icon used in QML Application. */ void DQuickIconImage::setColor(const QColor &color) { D_D(DQuickIconImage); if (d->color == color) return; d->color = color; Q_EMIT colorChanged(); // 尝试重设图标的url地址 d->maybeUpdateUrl(); } const QUrl &DQuickIconImage::fallbackSource() const { D_DC(DQuickIconImage); return d->fallbackSource; } void DQuickIconImage::setFallbackSource(const QUrl &newSource) { D_D(DQuickIconImage); if (d->fallbackSource == newSource) return; d->fallbackSource = newSource; Q_EMIT fallbackSourceChanged(); // 尝试重设图标的url地址 d->maybeUpdateUrl(); } void DQuickIconImage::setImage(const QImage &img) { D_D(DQuickIconImage); d->setImage(img); } DQuickIconImage::DQuickIconImage(DQuickIconImagePrivate &dd, QQuickItem *parent) : QQuickImage(dd, parent) { setAsynchronous(true); } void DQuickIconImage::itemChange(ItemChange change, const ItemChangeData &value) { Q_D(DQuickIconImage); switch (change) { case ItemDevicePixelRatioHasChanged: Q_FALLTHROUGH(); case ItemEnabledHasChanged: { // ###!(Chen Bin): When the program exits, it will be called // again, but the engine has been freed, causing subsequent // functions to crash when loading the image provider registered // in engine. if (!qmlEngine(this)) break; d->maybeUpdateUrl(); } break; default: break; } QQuickImage::itemChange(change, value); } void DQuickIconImage::pixmapChange() { // QQuickImage中只会在设置了souceSize的前提下才会计算图片自身的缩放比例 // 此处强制确保图标的缩放比例正确 D_D(DQuickIconImage); if (d->iconType == DQuickIconImagePrivate::ThemeIconName) { if (d->updateDevicePixelRatio(1.0)) { d->maybeUpdateUrl(); } } QQuickImage::pixmapChange(); if (status() == Error && d->fallbackSource.isValid()) { // fallback to source property setSource(d->fallbackSource); } } DQUICK_END_NAMESPACE #include "moc_dquickiconimage_p.cpp" dtkdeclarative-5.7.12/src/private/dquickiconimage_p.h000066400000000000000000000045341476226662700227110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKICONIMAGE_H #define DQUICKICONIMAGE_H #include #include #ifndef emit #define emit Q_EMIT #include #undef emit #else #include #endif DQUICK_BEGIN_NAMESPACE class DQuickIconImagePrivate; class DQuickIconImage : public QQuickImage { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged FINAL) Q_PROPERTY(Mode mode READ mode WRITE setMode NOTIFY modeChanged FINAL) Q_PROPERTY(State state READ state WRITE setState NOTIFY stateChanged FINAL) Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged FINAL) Q_PROPERTY(QUrl fallbackSource READ fallbackSource WRITE setFallbackSource NOTIFY fallbackSourceChanged FINAL) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(QtIcon) #endif public: enum class Mode { Invalid = QIcon::Normal - 1, Normal = QIcon::Normal, Disabled = QIcon::Disabled, Active = QIcon::Active, Selected = QIcon::Selected }; enum class State { On = QIcon::On, Off = QIcon::Off }; Q_ENUM(Mode) Q_ENUM(State) explicit DQuickIconImage(QQuickItem *parent = nullptr); ~DQuickIconImage(); void componentComplete() override; QString name() const; State state() const; Mode mode() const; QColor color() const; const QUrl &fallbackSource() const; public Q_SLOTS: void setName(const QString &name); void setState(State state); void setMode(Mode mode); void setColor(const QColor &color); void setFallbackSource(const QUrl &newSource); void setImage(const QImage &img); Q_SIGNALS: void nameChanged(); void stateChanged(); void modeChanged(); void colorChanged(); void fallbackSourceChanged(); protected: DQuickIconImage(DQuickIconImagePrivate &dd, QQuickItem *parent); void itemChange(ItemChange change, const ItemChangeData &value) override; void pixmapChange() override; private: Q_DISABLE_COPY(DQuickIconImage) Q_DECLARE_PRIVATE(DQuickIconImage) Q_PRIVATE_SLOT(d_func(), void maybeUpdateUrl()) friend class DQuickDciIconImagePrivate; }; DQUICK_END_NAMESPACE #endif // DQUICKICONIMAGE_H dtkdeclarative-5.7.12/src/private/dquickiconimage_p_p.h000066400000000000000000000032351476226662700232250ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKICONIMAGE_P_P_H #define DQUICKICONIMAGE_P_P_H #include #ifndef emit #define emit Q_EMIT #include #undef emit #else #include #endif DQUICK_BEGIN_NAMESPACE class DQuickIconImagePrivate : public QQuickImagePrivate { Q_DECLARE_PUBLIC(DQuickIconImage) public: void init(); virtual void maybeUpdateUrl(); virtual void play(int mode); QUrlQuery getUrlQuery(); DQuickIconImage::Mode getIconMode() const; qreal calculateDevicePixelRatio() const; bool updateDevicePixelRatio(qreal targetDevicePixelRatio) override; void updateBase64Image(); static QImage requestImageFromBase64(const QString &name, const QSize &requestedSize, qreal devicePixelRatio); private: QString name; DQuickIconImage::State state = DQuickIconImage::State::Off; DQuickIconImage::Mode mode = DQuickIconImage::Mode::Invalid; QColor color; QUrl fallbackSource; protected: enum IconType : qint8 { ThemeIconName, // 图标名称 Base64Data, // base64编码的图标图片数据 FileUrl // 图标文件的url地址 }; // 记录此图标是否应该从图标主题中获取。 // 在freedesktop的规范中,图标可为 // 一个本地文件,或以base64编码的图片数据。 // 此处的兼容处理主要是为了让DQuickIconFinder // 能直接用于加载desktop文件的图标 IconType iconType = ThemeIconName; }; DQUICK_END_NAMESPACE #endif // DQUICKICONIMAGE_P_P_H dtkdeclarative-5.7.12/src/private/dquickiconlabel.cpp000066400000000000000000000473011476226662700227210ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickdciiconimage_p.h" #include "dquickiconlabel_p.h" #include "dquickiconlabel_p_p.h" #include "dquickdciiconimage_p_p.h" #include #include #include #include DQUICK_BEGIN_NAMESPACE static void beginClass(QQuickItem *item) { if (QQmlParserStatus *parserStatus = qobject_cast(item)) parserStatus->classBegin(); } static void completeComponent(QQuickItem *item) { if (QQmlParserStatus *parserStatus = qobject_cast(item)) parserStatus->componentComplete(); } bool DQuickIconLabelPrivate::hasIcon() const { return display != DQuickIconLabel::TextOnly && (!icon.isEmpty()); } bool DQuickIconLabelPrivate::hasText() const { return display != DQuickIconLabel::IconOnly && !text.isEmpty(); } void DQuickIconLabelPrivate::createIconImage() { Q_Q(DQuickIconLabel); image = new DQuickDciIconImage(q); QQmlEngine::setContextForObject(image, QQmlEngine::contextForObject(q)); watchChanges(image); beginClass(image); image->setObjectName(QStringLiteral("DciIconImage")); image->setName(icon.name()); image->setTheme(icon.theme()); image->setPalette(icon.palette()); image->setSourceSize(iconSize()); image->setMode(icon.mode()); image->setFallbackToQIcon(icon.fallbackToQIcon()); image->imageItem()->setFallbackSource(icon.source()); #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) image->setRetainWhileLoading(true); #endif } bool DQuickIconLabelPrivate::ensureImage() { if (image) return false; createIconImage(); if (componentComplete) completeComponent(image); return true; } bool DQuickIconLabelPrivate::destroyImage() { if (!image) return false; unwatchChanges(image); delete image; image = nullptr; return true; } bool DQuickIconLabelPrivate::updateImage() { if (!hasIcon()) return destroyImage(); return ensureImage(); } void DQuickIconLabelPrivate::syncImage() { if (!image || !hasIcon()) return; image->setName(icon.name()); image->setMode(icon.mode()); image->setSourceSize(iconSize()); image->setPalette(icon.palette()); image->setTheme(icon.theme()); image->setFallbackToQIcon(icon.fallbackToQIcon()); image->imageItem()->setFallbackSource(icon.source()); const int valign = static_cast(alignment & Qt::AlignVertical_Mask); image->imageItem()->setVerticalAlignment(static_cast(valign)); const int halign = static_cast(alignment & Qt::AlignHorizontal_Mask); image->imageItem()->setHorizontalAlignment(static_cast(halign)); } void DQuickIconLabelPrivate::updateOrSyncImage() { if (updateImage()) { if (componentComplete) { updateImplicitSize(); layout(); } } else { syncImage(); } } bool DQuickIconLabelPrivate::createLabel() { Q_Q(DQuickIconLabel); if (label) return false; label = new QQuickText(q); watchChanges(label); beginClass(label); label->setObjectName(QStringLiteral("label")); label->setFont(font); label->setColor(color); label->setElideMode(QQuickText::ElideRight); const int valign = static_cast(alignment & Qt::AlignVertical_Mask); label->setVAlign(static_cast(valign)); const int halign = static_cast(alignment & Qt::AlignHorizontal_Mask); label->setHAlign(static_cast(halign)); label->setText(text); if (componentComplete) completeComponent(label); return true; } bool DQuickIconLabelPrivate::destroyLabel() { if (!label) return false; unwatchChanges(label); delete label; label = nullptr; return true; } bool DQuickIconLabelPrivate::updateLabel() { if (!hasText()) return destroyLabel(); return createLabel(); } void DQuickIconLabelPrivate::syncLabel() { if (!label) return; label->setText(text); } void DQuickIconLabelPrivate::updateOrSyncLabel() { if (updateLabel()) { if (componentComplete) { updateImplicitSize(); layout(); } } else { syncLabel(); } } void DQuickIconLabelPrivate::updateImplicitSize() { Q_Q(DQuickIconLabel); const bool showIcon = image && hasIcon(); const bool showText = label && hasText(); const qreal horizontalPadding = leftPadding + rightPadding; const qreal verticalPadding = topPadding + bottomPadding; const qreal iconImplicitWidth = showIcon ? image->implicitWidth() : 0; const qreal iconImplicitHeight = showIcon ? image->implicitHeight() : 0; const qreal textImplicitWidth = showText ? label->implicitWidth() : 0; const qreal textImplicitHeight = showText ? label->implicitHeight() : 0; const qreal effectiveSpacing = showText && showIcon && image->implicitWidth() > 0 ? spacing : 0; const bool needAddIconAndTextWidth = display == DQuickIconLabel::TextBesideIcon || display == DQuickIconLabel::IconBesideText; const qreal implicitWidth = needAddIconAndTextWidth ? iconImplicitWidth + textImplicitWidth + effectiveSpacing : qMax(iconImplicitWidth, textImplicitWidth); const qreal implicitHeight = display == DQuickIconLabel::TextUnderIcon ? iconImplicitHeight + textImplicitHeight + effectiveSpacing : qMax(iconImplicitHeight, textImplicitHeight); q->setImplicitSize(implicitWidth + horizontalPadding, implicitHeight + verticalPadding); } // adapted from QStyle::alignedRect() static QRectF alignedRect(bool mirrored, Qt::Alignment alignment, const QSizeF &size, const QRectF &rectangle) { alignment = QGuiApplicationPrivate::visualAlignment(mirrored ? Qt::RightToLeft : Qt::LeftToRight, alignment); qreal x = rectangle.x(); qreal y = rectangle.y(); const qreal w = size.width(); const qreal h = size.height(); if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter) y += rectangle.height() / 2 - h / 2; else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom) y += rectangle.height() - h; if ((alignment & Qt::AlignRight) == Qt::AlignRight) x += rectangle.width() - w; else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter) x += rectangle.width() / 2 - w / 2; return QRectF(x, y, w, h); } void DQuickIconLabelPrivate::layout() { Q_Q(DQuickIconLabel); if (!componentComplete) return; const qreal availableWidth = width - leftPadding - rightPadding; const qreal availableHeight = height - topPadding - bottomPadding; switch (display) { case DQuickIconLabel::IconOnly: if (image) { const QRectF iconRect = alignedRect(mirrored, alignment, QSizeF(qMin(image->implicitWidth(), availableWidth), qMin(image->implicitHeight(), availableHeight)), QRectF(leftPadding, topPadding, availableWidth, availableHeight)); image->setSize(iconRect.size()); image->setPosition(iconRect.topLeft()); } break; case DQuickIconLabel::TextOnly: if (label) { const QRectF textRect = alignedRect(mirrored, alignment, QSizeF(qMin(label->implicitWidth(), availableWidth), qMin(label->implicitHeight(), availableHeight)), QRectF(leftPadding, topPadding, availableWidth, availableHeight)); label->setSize(textRect.size()); label->setPosition(textRect.topLeft()); } break; case DQuickIconLabel::TextUnderIcon: { // Work out the sizes first, as the positions depend on them. QSizeF iconSize; QSizeF textSize; if (image) { iconSize.setWidth(qMin(image->implicitWidth(), availableWidth)); iconSize.setHeight(qMin(image->implicitHeight(), availableHeight)); } qreal effectiveSpacing = 0; if (label) { if (!iconSize.isEmpty()) effectiveSpacing = spacing; textSize.setWidth(qMin(label->implicitWidth(), availableWidth)); textSize.setHeight(qMin(label->implicitHeight(), availableHeight - iconSize.height() - effectiveSpacing)); } QRectF combinedRect = alignedRect(mirrored, alignment, QSizeF(qMax(iconSize.width(), textSize.width()), iconSize.height() + effectiveSpacing + textSize.height()), QRectF(leftPadding, topPadding, availableWidth, availableHeight)); if (image) { QRectF iconRect = alignedRect(mirrored, Qt::Alignment(Qt::AlignHCenter | Qt::AlignTop), iconSize, combinedRect); image->setSize(iconRect.size()); image->setPosition(iconRect.topLeft()); } if (label) { QRectF textRect = alignedRect(mirrored, Qt::Alignment(Qt::AlignHCenter | Qt::AlignBottom), textSize, combinedRect); label->setSize(textRect.size()); label->setPosition(textRect.topLeft()); } break; } case DQuickIconLabel::IconBesideText: { // Work out the sizes first, as the positions depend on them. QSizeF iconSize(0, 0); QSizeF textSize(0, 0); if (image) { iconSize.setWidth(qMin(image->implicitWidth(), availableWidth)); iconSize.setHeight(qMin(image->implicitHeight(), availableHeight)); } qreal effectiveSpacing = 0; if (label) { if (!iconSize.isEmpty()) effectiveSpacing = spacing; textSize.setWidth(qMin(label->implicitWidth(), availableWidth - iconSize.width() - effectiveSpacing)); textSize.setHeight(qMin(label->implicitHeight(), availableHeight)); } const QRectF combinedRect = alignedRect(mirrored, alignment, QSizeF(availableWidth, qMax(iconSize.height(), textSize.height())), QRectF(leftPadding, topPadding, availableWidth, availableHeight)); if (image) { const QRectF iconRect = alignedRect(mirrored, Qt::Alignment(Qt::AlignRight | Qt::AlignVCenter), iconSize, combinedRect); image->setSize(iconRect.size()); image->setPosition(iconRect.topLeft()); } if (label) { const QRectF textRect = alignedRect(mirrored, Qt::Alignment(Qt::AlignLeft | Qt::AlignVCenter), textSize, combinedRect); label->setSize(textRect.size()); label->setPosition(textRect.topLeft()); } break; } case DQuickIconLabel::TextBesideIcon: default: // Work out the sizes first, as the positions depend on them. QSizeF iconSize(0, 0); QSizeF textSize(0, 0); if (image) { iconSize.setWidth(qMin(image->implicitWidth(), availableWidth)); iconSize.setHeight(qMin(image->implicitHeight(), availableHeight)); } qreal effectiveSpacing = 0; if (label) { if (!iconSize.isEmpty()) effectiveSpacing = spacing; textSize.setWidth(qMin(label->implicitWidth(), availableWidth - iconSize.width() - effectiveSpacing)); textSize.setHeight(qMin(label->implicitHeight(), availableHeight)); } const QRectF combinedRect = alignedRect(mirrored, alignment, QSizeF(iconSize.width() + effectiveSpacing + textSize.width(), qMax(iconSize.height(), textSize.height())), QRectF(leftPadding, topPadding, availableWidth, availableHeight)); if (image) { const QRectF iconRect = alignedRect(mirrored, Qt::Alignment(Qt::AlignLeft | Qt::AlignVCenter), iconSize, combinedRect); image->setSize(iconRect.size()); image->setPosition(iconRect.topLeft()); } if (label) { const QRectF textRect = alignedRect(mirrored, Qt::Alignment(Qt::AlignRight | Qt::AlignVCenter), textSize, combinedRect); label->setSize(textRect.size()); label->setPosition(textRect.topLeft()); } break; } q->setBaselineOffset(label ? label->y() + label->baselineOffset() : 0); } static const QQuickItemPrivate::ChangeTypes itemChangeTypes = QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight | QQuickItemPrivate::Destroyed; void DQuickIconLabelPrivate::watchChanges(QQuickItem *item) { QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); itemPrivate->addItemChangeListener(this, itemChangeTypes); } void DQuickIconLabelPrivate::unwatchChanges(QQuickItem* item) { QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); itemPrivate->removeItemChangeListener(this, itemChangeTypes); } void DQuickIconLabelPrivate::itemImplicitWidthChanged(QQuickItem *) { updateImplicitSize(); layout(); } void DQuickIconLabelPrivate::itemImplicitHeightChanged(QQuickItem *) { updateImplicitSize(); layout(); } void DQuickIconLabelPrivate::itemDestroyed(QQuickItem *item) { unwatchChanges(item); if (item == image) image = nullptr; else if (item == label) label = nullptr; } QSize DQuickIconLabelPrivate::iconSize() const { D_QC(DQuickIconLabel); // If no size is specified for theme icons, it will use the smallest available size. QSize size(icon.width(), icon.height()); if (size.width() <= 0) size.setWidth(q->width()); if (size.height() <= 0) size.setHeight(q->height()); return size; } DQuickIconLabel::DQuickIconLabel(QQuickItem *parent) : QQuickItem(*(new DQuickIconLabelPrivate), parent) { } DQuickIconLabel::~DQuickIconLabel() { Q_D(DQuickIconLabel); if (d->image) d->unwatchChanges(d->image); if (d->label) d->unwatchChanges(d->label); } DQuickDciIcon DQuickIconLabel::icon() const { Q_D(const DQuickIconLabel); return d->icon; } void DQuickIconLabel::setIcon(const DQuickDciIcon &icon) { Q_D(DQuickIconLabel); d->icon = icon; d->updateOrSyncImage(); } QString DQuickIconLabel::text() const { Q_D(const DQuickIconLabel); return d->text; } void DQuickIconLabel::setText(const QString &text) { Q_D(DQuickIconLabel); if (d->text == text) return; d->text = text; d->updateOrSyncLabel(); } QFont DQuickIconLabel::font() const { Q_D(const DQuickIconLabel); return d->font; } void DQuickIconLabel::setFont(const QFont &font) { Q_D(DQuickIconLabel); if (d->font == font) return; d->font = font; if (d->label) d->label->setFont(font); } QColor DQuickIconLabel::color() const { Q_D(const DQuickIconLabel); return d->color; } void DQuickIconLabel::setColor(const QColor &color) { Q_D(DQuickIconLabel); if (d->color == color) return; d->color = color; if (d->label) d->label->setColor(color); Q_EMIT colorChanged(color); } DQuickIconLabel::Display DQuickIconLabel::display() const { Q_D(const DQuickIconLabel); return d->display; } void DQuickIconLabel::setDisplay(Display display) { Q_D(DQuickIconLabel); if (d->display == display) return; d->display = display; d->updateImage(); d->updateLabel(); d->updateImplicitSize(); d->layout(); } qreal DQuickIconLabel::spacing() const { Q_D(const DQuickIconLabel); return d->spacing; } void DQuickIconLabel::setSpacing(qreal spacing) { Q_D(DQuickIconLabel); if (qFuzzyCompare(d->spacing, spacing)) return; d->spacing = spacing; if (d->image && d->label) { d->updateImplicitSize(); d->layout(); } } bool DQuickIconLabel::isMirrored() const { Q_D(const DQuickIconLabel); return d->mirrored; } void DQuickIconLabel::setMirrored(bool mirrored) { Q_D(DQuickIconLabel); if (d->mirrored == mirrored) return; d->mirrored = mirrored; d->layout(); } Qt::Alignment DQuickIconLabel::alignment() const { Q_D(const DQuickIconLabel); return d->alignment; } void DQuickIconLabel::setAlignment(Qt::Alignment alignment) { Q_D(DQuickIconLabel); const int valign = static_cast(alignment & Qt::AlignVertical_Mask); const int halign = static_cast(alignment & Qt::AlignHorizontal_Mask); const uint align = static_cast((valign ? valign : Qt::AlignVCenter) | (halign ? halign : Qt::AlignHCenter)); if (d->alignment == align) return; d->alignment = static_cast(align); if (d->label) { d->label->setVAlign(static_cast(valign)); d->label->setHAlign(static_cast(halign)); } if (d->image) { d->image->imageItem()->setVerticalAlignment(static_cast(valign)); d->image->imageItem()->setHorizontalAlignment(static_cast(halign)); } d->layout(); } qreal DQuickIconLabel::topPadding() const { Q_D(const DQuickIconLabel); return d->topPadding; } void DQuickIconLabel::setTopPadding(qreal padding) { Q_D(DQuickIconLabel); if (qFuzzyCompare(d->topPadding, padding)) return; d->topPadding = padding; d->updateImplicitSize(); d->layout(); } void DQuickIconLabel::resetTopPadding() { setTopPadding(0); } qreal DQuickIconLabel::leftPadding() const { Q_D(const DQuickIconLabel); return d->leftPadding; } void DQuickIconLabel::setLeftPadding(qreal padding) { Q_D(DQuickIconLabel); if (qFuzzyCompare(d->leftPadding, padding)) return; d->leftPadding = padding; d->updateImplicitSize(); d->layout(); } void DQuickIconLabel::resetLeftPadding() { setLeftPadding(0); } qreal DQuickIconLabel::rightPadding() const { Q_D(const DQuickIconLabel); return d->rightPadding; } void DQuickIconLabel::setRightPadding(qreal padding) { Q_D(DQuickIconLabel); if (qFuzzyCompare(d->rightPadding, padding)) return; d->rightPadding = padding; d->updateImplicitSize(); d->layout(); } void DQuickIconLabel::resetRightPadding() { setRightPadding(0); } qreal DQuickIconLabel::bottomPadding() const { Q_D(const DQuickIconLabel); return d->bottomPadding; } void DQuickIconLabel::setBottomPadding(qreal padding) { Q_D(DQuickIconLabel); if (qFuzzyCompare(d->bottomPadding, padding)) return; d->bottomPadding = padding; d->updateImplicitSize(); d->layout(); } void DQuickIconLabel::resetBottomPadding() { setBottomPadding(0); } void DQuickIconLabel::componentComplete() { Q_D(DQuickIconLabel); if (d->image) completeComponent(d->image); if (d->label) completeComponent(d->label); QQuickItem::componentComplete(); d->layout(); } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) void DQuickIconLabel::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { Q_D(DQuickIconLabel); QQuickItem::geometryChanged(newGeometry, oldGeometry); d->layout(); } #else void DQuickIconLabel::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) { Q_D(DQuickIconLabel); QQuickItem::geometryChange(newGeometry, oldGeometry); d->layout(); } #endif DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickiconlabel_p.h000066400000000000000000000062421476226662700227040ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKICONLABEL_P_H #define DQUICKICONLABEL_P_H #include "dquickdciicon_p.h" #include #include DQUICK_BEGIN_NAMESPACE class DQuickIconLabelPrivate; class DQuickIconLabel : public QQuickItem { Q_OBJECT Q_PROPERTY(DTK_QUICK_NAMESPACE::DQuickDciIcon icon READ icon WRITE setIcon FINAL) Q_PROPERTY(QString text READ text WRITE setText FINAL) Q_PROPERTY(QFont font READ font WRITE setFont FINAL) Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged FINAL) Q_PROPERTY(Display display READ display WRITE setDisplay FINAL) Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing FINAL) Q_PROPERTY(bool mirrored READ isMirrored WRITE setMirrored FINAL) Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment FINAL) Q_PROPERTY(qreal topPadding READ topPadding WRITE setTopPadding RESET resetTopPadding FINAL) Q_PROPERTY(qreal leftPadding READ leftPadding WRITE setLeftPadding RESET resetLeftPadding FINAL) Q_PROPERTY(qreal rightPadding READ rightPadding WRITE setRightPadding RESET resetRightPadding FINAL) Q_PROPERTY(qreal bottomPadding READ bottomPadding WRITE setBottomPadding RESET resetBottomPadding FINAL) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(IconLabel) #endif public: enum Display { IconOnly, TextOnly, TextBesideIcon, TextUnderIcon, IconBesideText = 128 // Extended value, previous values are consistent with AbstractButton. }; Q_ENUM(Display) explicit DQuickIconLabel(QQuickItem *parent = nullptr); ~DQuickIconLabel() override; DQuickDciIcon icon() const; void setIcon(const DQuickDciIcon &dciIcon); QString text() const; void setText(const QString &text); QFont font() const; void setFont(const QFont &font); QColor color() const; void setColor(const QColor &color); Display display() const; void setDisplay(Display display); qreal spacing() const; void setSpacing(qreal spacing); bool isMirrored() const; void setMirrored(bool mirrored); Qt::Alignment alignment() const; void setAlignment(Qt::Alignment alignment); qreal topPadding() const; void setTopPadding(qreal padding); void resetTopPadding(); qreal leftPadding() const; void setLeftPadding(qreal padding); void resetLeftPadding(); qreal rightPadding() const; void setRightPadding(qreal padding); void resetRightPadding(); qreal bottomPadding() const; void setBottomPadding(qreal padding); void resetBottomPadding(); Q_SIGNALS: void colorChanged(const QColor &color); protected: void componentComplete() override; #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override; #else void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override; #endif private: Q_DISABLE_COPY(DQuickIconLabel) Q_DECLARE_PRIVATE(DQuickIconLabel) }; DQUICK_END_NAMESPACE #endif // DQUICKICONLABEL_P_H dtkdeclarative-5.7.12/src/private/dquickiconlabel_p_p.h000066400000000000000000000031461476226662700232230ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKICONLABEL_P_P_H #define DQUICKICONLABEL_P_P_H #include "dquickiconlabel_p.h" #include DQUICK_BEGIN_NAMESPACE class DQuickIconLabelPrivate : public QQuickItemPrivate, public QQuickItemChangeListener { Q_DECLARE_PUBLIC(DQuickIconLabel) public: bool hasIcon() const; bool hasText() const; void createIconImage(); bool ensureImage(); bool destroyImage(); bool updateImage(); void syncImage(); void updateOrSyncImage(); bool createLabel(); bool destroyLabel(); bool updateLabel(); void syncLabel(); void updateOrSyncLabel(); void updateImplicitSize(); void layout(); void watchChanges(QQuickItem *item); void unwatchChanges(QQuickItem *item); void setPositioningDirty(); bool isLeftToRight() const; void itemImplicitWidthChanged(QQuickItem *) override; void itemImplicitHeightChanged(QQuickItem *) override; void itemDestroyed(QQuickItem *item) override; QSize iconSize() const; bool mirrored = false; DQuickIconLabel::Display display = DQuickIconLabel::TextBesideIcon; Qt::Alignment alignment = Qt::AlignCenter; qreal spacing = 0; qreal topPadding = 0; qreal leftPadding = 0; qreal rightPadding = 0; qreal bottomPadding = 0; QFont font; QColor color; QString text; DQuickDciIconImage *image = nullptr; QQuickText *label = nullptr; DQuickDciIcon icon; }; DQUICK_END_NAMESPACE #endif // DQUICKICONLABEL_P_P_H dtkdeclarative-5.7.12/src/private/dquickimageprovider.cpp000066400000000000000000000621211476226662700236230ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dqmlglobalobject_p.h" #include "dquickimageprovider_p.h" #include #include #include #include #include #include #include #include #include #include #include #include #include DQUICK_BEGIN_NAMESPACE DGUI_USE_NAMESPACE DCORE_USE_NAMESPACE static inline QImage invalidIcon(QSize *size, const QSize &requestedSize) { QIcon icon = DIconTheme::findQIcon("application-x-desktop"); const QImage img = icon.pixmap(requestedSize).toImage(); *size = img.size(); return img; } static QImage requestImageFromQIcon(const QString &id, QSize *size, const QSize &requestedSize) { QUrlQuery urlQuery(id); QString name = urlQuery.queryItemValue("name"); if (name.isEmpty()) return QImage(); QIcon icon; if (auto cached = DIconTheme::cached()) { icon = cached->findQIcon(name); } else { icon = DIconTheme::findQIcon(name); } QIcon::Mode qMode = QIcon::Normal; QIcon::State qState = QIcon::Off; if (urlQuery.hasQueryItem("mode")) qMode = static_cast(urlQuery.queryItemValue("mode").toInt()); if (urlQuery.hasQueryItem("state")) qState = static_cast(urlQuery.queryItemValue("state").toInt()); // 获取图标的缩放比例 qreal devicePixelRatio = 1.0; if (urlQuery.hasQueryItem("devicePixelRatio")) { devicePixelRatio = urlQuery.queryItemValue("devicePixelRatio").toDouble(); if (qIsNull(devicePixelRatio)) devicePixelRatio = 1.0; } if (icon.isNull()) { QSize icon_size = requestedSize; return invalidIcon(size, icon_size /= devicePixelRatio); } QSize icon_size = requestedSize; // 初始时可能没有为图标设置期望的大小 if (icon_size.isEmpty()) { const auto &sizes = icon.availableSizes(qMode, qState); if (!sizes.isEmpty()) icon_size = sizes.first(); } else { // 因为传入的requestedSize是已经乘过缩放的, 因此此处要除以缩放比例获取真实的图标大小 icon_size /= devicePixelRatio; } QImage image(icon_size * devicePixelRatio, QImage::Format_ARGB32); image.setDevicePixelRatio(devicePixelRatio); image.fill(Qt::transparent); QPainter painter(&image); QColor color(urlQuery.queryItemValue("color")); // Fixed filling icon when color is transparent. if (color.isValid() && color.alpha() > 0) painter.setPen(color); // 务必要使用paint的方式获取图片, 有部分可变色的图标类型, 在图标引擎中会使用QPainter::pen的颜色 // 作为图标的填充颜色 icon.paint(&painter, QRect(QPoint(0, 0), icon_size), Qt::AlignCenter, qMode, qState); if (size) *size = icon_size; return image; } static QImage generateDciIconImage(const QImage &src, DDciIcon::Theme theme, DDciIcon::Mode mode) { Q_UNUSED(theme) qint8 hue = 0, saturation = 0, lightness = 0, red = 0, green = 0, blue = 0, alpha = 0; switch (mode) { case DDciIcon::Hover: lightness += 10; break; case DDciIcon::Pressed: lightness -= 10; break; default: return src; } return DGuiApplicationHelper::adjustColor(src, hue, saturation, lightness, red, green, blue, alpha); } DQuickIconProvider::DQuickIconProvider() : QQuickImageProvider(QQuickImageProvider::Image) { } QImage DQuickIconProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) { return requestImageFromQIcon(id, size, requestedSize); } DQuickDciIconProvider::DQuickDciIconProvider() : QQuickImageProvider(QQuickImageProvider::Image) { } static inline DDciIcon::Theme toDciTheme(DGuiApplicationHelper::ColorType type) { return type == DGuiApplicationHelper::DarkType ? DDciIcon::Dark : DDciIcon::Light; } /*! \internal \brief A function that handles DCI icon for use in QML. This provider is added when the dtk qml plugin construction and use to generate the icon resource data needed in the \a id. This function adds icon of specified size for the different states, topics, types, and other attributes needed in the id. \note You should not add a wrong DCI icon here. */ QImage DQuickDciIconProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) { QUrlQuery urlQuery(id); QString name = urlQuery.queryItemValue("name"); if (name.isEmpty()) return QImage(); if (!DSGApplication::id().isEmpty()) { // allow the icon theme to override the icon for a given application name.prepend(DSGApplication::id() + "/"); } const QString themeName = urlQuery.queryItemValue("themeName"); QString iconPath; if (auto cached = DIconTheme::cached()) { iconPath = cached->findDciIconFile(name, themeName); } else { iconPath = DIconTheme::findDciIconFile(name, themeName); } const bool fallbackToQIcon = urlQuery.queryItemValue("fallbackToQIcon").toInt(); if (Q_UNLIKELY(iconPath.isEmpty())) { if (!fallbackToQIcon) return invalidIcon(size, requestedSize); // Fallback to normal qicon. return requestImageFromQIcon(id, size, requestedSize); } DDciIcon dciIcon(iconPath); if (dciIcon.isNull()) { if (!fallbackToQIcon) return invalidIcon(size, requestedSize); return requestImageFromQIcon(id, size, requestedSize); } DDciIcon::Mode mode = DDciIcon::Normal; if (urlQuery.hasQueryItem("mode")) { int modeValue = urlQuery.queryItemValue("mode").toInt(); switch (modeValue) { case DQMLGlobalObject::NormalState: mode = DDciIcon::Normal; break; case DQMLGlobalObject::DisabledState: mode = DDciIcon::Disabled; break; case DQMLGlobalObject::HoveredState: mode = DDciIcon::Hover; break; case DQMLGlobalObject::PressedState: mode = DDciIcon::Pressed; break; default: break; } } auto theme = DGuiApplicationHelper::ColorType::UnknownType; if (urlQuery.hasQueryItem("theme")) theme = static_cast(urlQuery.queryItemValue("theme").toInt()); if (theme == DGuiApplicationHelper::ColorType::UnknownType) { QColor window = DGuiApplicationHelper::instance()->applicationPalette().window().color(); theme = DGuiApplicationHelper::toColorType(window); } // Get the icon pixel ratio qreal devicePixelRatio = 1.0; if (urlQuery.hasQueryItem("devicePixelRatio")) { devicePixelRatio = urlQuery.queryItemValue("devicePixelRatio").toDouble(); if (qIsNull(devicePixelRatio)) devicePixelRatio = 1.0; } DDciIconPalette palette; if (urlQuery.hasQueryItem("palette")) { palette = DDciIconPalette::convertFromString(urlQuery.queryItemValue("palette")); } // If the target mode icon didn't found, we should find the normal mode icon // and decorate to the target mode. // When the application uses the AA_UseHighDpiPixmaps attribute, // the boundingSize should typically divide by devicePixelRatio, // see Qt::AA_UseHighDpiPixmaps. int boundingSize = qMax(requestedSize.width(), requestedSize.height()); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) if (qApp->testAttribute(Qt::AA_UseHighDpiPixmaps)) { boundingSize = qRound(boundingSize / devicePixelRatio); } #else boundingSize = qRound(boundingSize / devicePixelRatio); #endif const auto currentTheme = toDciTheme(theme); auto currentMode = mode; DDciIconMatchResult result = dciIcon.matchIcon(boundingSize, currentTheme, currentMode, DDciIcon::DontFallbackMode); if (!result) { currentMode = DDciIcon::Normal; result = dciIcon.matchIcon(boundingSize, currentTheme, currentMode); } if (!result) return invalidIcon(size, requestedSize); const QPixmap &pixmap = dciIcon.pixmap(devicePixelRatio, boundingSize, result, palette); if (pixmap.isNull()) return invalidIcon(size, requestedSize); QImage image = pixmap.toImage(); if (currentMode != mode && currentMode == DDciIcon::Normal && !dciIcon.isSupportedAttribute(result, DDciIcon::HasPalette)) image = generateDciIconImage(image, currentTheme, mode); if (size) *size = image.size(); return image; } class ShadowImage : public QSharedData { public: ShadowImage(DQuickShadowProvider *sp, const DQuickShadowProvider::ShadowConfig &c, const QImage &data) : sp(sp) , config(c) , image(data) { sp->cache.insert(config, this); } ~ShadowImage() { sp->cache.remove(config); } DQuickShadowProvider *sp; DQuickShadowProvider::ShadowConfig config; QImage image; }; DQuickShadowProvider::DQuickShadowProvider() : QQuickImageProvider(QQuickImageProvider::Image, QQuickImageProvider::ForceAsynchronousImageLoading) { } DQuickShadowProvider::~DQuickShadowProvider() { qDeleteAll(cache.values()); } QUrl DQuickShadowProvider::toUrl(qreal boxSize, qreal topLeftRadius, qreal topRightRadius, qreal bottomLeftRadius, qreal bottomRightRadius, qreal shadowBlur, QColor color, qreal xOffset, qreal yOffset, qreal spread, bool hollow, bool inner) { QUrl url; url.setScheme("image"); url.setHost("dtk.shadow"); QUrlQuery args; args.setQueryItems({ {"boxSize", QString::number(boxSize)}, {"topLeftRadius", QString::number(topLeftRadius)}, {"topRightRadius", QString::number(topRightRadius)}, {"bottomLeftRadius", QString::number(bottomLeftRadius)}, {"bottomRightRadius", QString::number(bottomRightRadius)}, {"shadowBlur", QString::number(shadowBlur)}, {"color", color.name(QColor::HexArgb)}, {"xOffset", QString::number(xOffset)}, {"yOffset", QString::number(yOffset)}, {"spread", QString::number(spread)}, {"hollow", QString::number(static_cast(hollow))}, {"inner", QString::number(static_cast(inner))} }); url.setQuery(args); return url; } inline static bool getNumberFromString(const QString &string, qreal *number) { bool ok = false; *number = string.toDouble(&ok); return ok; } inline static bool getNumberFromString(const QString &string, bool *number) { bool ok = false; *number = string.toUInt(&ok); return ok; } static bool fromString(const QString &string, DQuickShadowProvider::ShadowConfig &config, QColor *color, qreal *xOffset, qreal *yOffset, bool *hollow, bool *inner) { QUrlQuery args(string); if (!getNumberFromString(args.queryItemValue("boxSize"), &config.boxSize)) return false; if (!getNumberFromString(args.queryItemValue("topLeftRadius"), &config.topLeftRadius)) return false; if (!getNumberFromString(args.queryItemValue("topRightRadius"), &config.topRightRadius)) return false; if (!getNumberFromString(args.queryItemValue("bottomLeftRadius"), &config.bottomLeftRadius)) return false; if (!getNumberFromString(args.queryItemValue("bottomRightRadius"), &config.bottomRightRadius)) return false; if (!getNumberFromString(args.queryItemValue("shadowBlur"), &config.blurRadius)) return false; if (!getNumberFromString(args.queryItemValue("xOffset"), xOffset)) return false; if (!getNumberFromString(args.queryItemValue("yOffset"), yOffset)) return false; if (!getNumberFromString(args.queryItemValue("spread"), &config.spread)) return false; if (!getNumberFromString(args.queryItemValue("hollow"), hollow)) return false; if (!getNumberFromString(args.queryItemValue("inner"), inner)) return false; const QString colorName = args.queryItemValue("color"); if (colorName.isEmpty()) return false; *color = QColor(colorName); if (!color->isValid()) return false; return true; } static QPainterPath roundedRectPath(const QRectF &rect, qreal topLeftRadius, qreal topRightRadius, qreal bottomLeftRadius, qreal bottomRightRadius) { QPainterPath roundedPath; roundedPath.addRect(rect); const auto width = rect.width(); const auto height = rect.height(); QPainterPath path; if (topLeftRadius > 0.0) { int radius = topLeftRadius; path.moveTo(0, 0); path.arcTo(0, 0, radius * 2, radius * 2, 90, 90); path.lineTo(0, 0); } if (topRightRadius > 0.0) { int radius = topRightRadius; path.moveTo(width, 0); QRectF rect1(width - radius * 2, 0, radius * 2, radius * 2); path.arcTo(rect1, 0, 90); path.lineTo(width, 0); } if (bottomLeftRadius > 0.0) { int radius = bottomLeftRadius; path.moveTo(0, height); QRectF rect2(0, height - radius * 2, radius * 2, radius * 2); path.arcTo(rect2, 180, 90); path.lineTo(0, height); } if (bottomRightRadius > 0.0) { int radius = bottomRightRadius; path.moveTo(width, height); QRectF f2(width - radius * 2, height - radius * 2, radius * 2, radius * 2); path.arcTo(f2, 270, 90); path.lineTo(width, height); } if (!path.isEmpty()) { path.translate(rect.x(), rect.y()); roundedPath = roundedPath - path; } return roundedPath; } static QPainterPath roundedRectPath(const QRectF &rect, const DQuickShadowProvider::ShadowConfig &config) { return roundedRectPath(rect, config.topLeftRadius, config.topRightRadius, config.bottomLeftRadius, config.bottomRightRadius); } QImage DQuickShadowProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) { ShadowConfig config; QColor color; qreal xOffset; qreal yOffset; bool hollow; bool isInner; QImage image; do { if (!fromString(id, config, &color, &xOffset, &yOffset, &hollow, &isInner)) { break; } if (isInner) config.type |= Inner; auto shadow = getRawShadow(config); if (!shadow) break; const qreal shadowSize = config.boxSize + config.blurRadius * (config.isInner() ? 2 : 4) + (config.isInner() ? 0 : 2 * config.spread); image = QImage(qRound(shadowSize), qRound(shadowSize), QImage::Format_ARGB32_Premultiplied); image.fill(Qt::transparent); QRectF shadowRect(image.rect()); shadowRect.moveCenter(QRectF(shadow->image.rect()).center()); QPainter painter(&image); painter.setRenderHint(QPainter::Antialiasing, true); painter.setPen(Qt::NoPen); QPainterPath clipPath = roundedRectPath(image.rect(), config); painter.setClipPath(clipPath); QPointF offset(xOffset, yOffset); if (config.isInner()) { shadowRect.translate(-offset); } painter.setCompositionMode(QPainter::CompositionMode_Source); painter.drawImage(QPointF(0, 0), shadow->image, shadowRect); painter.end(); // draw color painter.begin(&image); painter.setCompositionMode(QPainter::CompositionMode_SourceIn); painter.fillRect(image.rect(), color); painter.end(); if (hollow && !config.isInner()) { painter.begin(&image); painter.setRenderHint(QPainter::Antialiasing, true); painter.setCompositionMode(QPainter::CompositionMode_Clear); painter.setPen(Qt::NoPen); painter.setBrush(color); QRectF boxRect(0, 0, image.width() - 2 * (config.blurRadius + config.spread), image.height() - 2 * (config.blurRadius + config.spread)); boxRect.moveCenter(QRectF(image.rect()).center() - offset); painter.drawPath(roundedRectPath(boxRect, config)); painter.end(); } } while (false); if (size) *size = image.size(); return image; } /** * @brief calculateEffectiveBlurRadius get blur Factor * Refer to KDE breeze project and Firefox * @param radius shaodw blur Radius * @return */ static inline int calculateEffectiveBlurRadius(qreal radius) { // https://www.w3.org/TR/css-backgrounds-3/#shadow-blur const qreal stdDeviation = radius * 0.5; // https://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement const qreal gaussianScaleFactor = (3.0 * M_SQRT2 * qSqrt(M_PI) / 4.0) * 1.5; return qMax(2, qFloor(stdDeviation * gaussianScaleFactor + 0.5)); } typedef QPair BoxFilters; static QVector computeBoxFilter(int radius) { int major; int minor; int final; const int averageFactor = 3; const int blurRadius = calculateEffectiveBlurRadius(radius); const int radiusFactor = blurRadius / averageFactor; if (blurRadius % averageFactor < averageFactor) { major = radiusFactor + (blurRadius % averageFactor == 0 ? 0 : 1); minor = radiusFactor; final = radiusFactor + (blurRadius % averageFactor == 2 ? 1 : 0); } else { Q_UNREACHABLE(); } Q_ASSERT(major + minor + final == blurRadius); return { {major, minor}, {minor, major}, {final, final} }; } static inline void imageConvoluteFilter(const uint8_t *startRow, uint8_t *destination, int rowWidth, int horizontalStride, int verticalStride, const BoxFilters &boxFilter, bool transposeInput, bool transposeOutput) { const int inputStep = transposeInput ? verticalStride : horizontalStride; const int outputStep = transposeOutput ? verticalStride : horizontalStride; const int boxSize = boxFilter.first + 1 + boxFilter.second; const int reciprocal = (1 << 24) / boxSize; uint32_t alphaSum = uint32_t((boxSize + 1) / 2); const uint8_t *leftRow = startRow; const uint8_t *rightRow = startRow; uint8_t *outDestination = destination; const uint8_t firstValue = startRow[0]; const uint8_t lastValue = startRow[(rowWidth - 1) * inputStep]; alphaSum += uint32_t(firstValue * boxFilter.first); const uint8_t *initEnd = startRow + (boxSize - boxFilter.first) * inputStep; while (rightRow < initEnd) { alphaSum += *rightRow; rightRow += inputStep; } const uint8_t *leftEnd = startRow + boxSize * inputStep; while (rightRow < leftEnd) { *outDestination = (alphaSum * uint32_t(reciprocal)) >> 24; alphaSum += *rightRow - firstValue; rightRow += inputStep; outDestination += outputStep; } const uint8_t *centerEnd = startRow + rowWidth * inputStep; while (rightRow < centerEnd) { *outDestination = (alphaSum * uint32_t(reciprocal)) >> 24; alphaSum += *rightRow - *leftRow; leftRow += inputStep; rightRow += inputStep; outDestination += outputStep; } const uint8_t *rightEnd = destination + rowWidth * outputStep; while (outDestination < rightEnd) { *outDestination = (alphaSum * uint32_t(reciprocal)) >> 24; alphaSum += lastValue - *leftRow; leftRow += inputStep; outDestination += outputStep; } } static inline void doBoxShdowBlur(QImage &image, int radius, const QRect &rect = QRect()) { if (radius < 2) { return; } const QVector filters = computeBoxFilter(radius); const QRect blurRect = rect.isNull() ? image.rect() : rect; const int alphaOffset = (image.depth() == 8 || QSysInfo::ByteOrder == QSysInfo::BigEndian) ? 0 : 3; const int blurWidth = blurRect.width(); const int blurHeight = blurRect.height(); const int widthStride = image.bytesPerLine(); const int pixelBPP = image.depth() >> 3; // the amount of memory space occupied by row pixels or column pixels const int maxStride = qMax(blurWidth, blurHeight) * pixelBPP; QScopedPointer > twoStride(new uint8_t[2 * maxStride]); uint8_t *nextStride = twoStride.data() + maxStride; for (int i = 0; i < blurHeight; ++i) { uint8_t *row = image.scanLine(blurRect.y() + i) + blurRect.x() * pixelBPP + alphaOffset; imageConvoluteFilter(row, twoStride.data(), blurWidth, pixelBPP, widthStride, filters[0], false, false); imageConvoluteFilter(twoStride.data(), nextStride, blurWidth, pixelBPP, widthStride, filters[1], false, false); imageConvoluteFilter(nextStride, row, blurWidth, pixelBPP, widthStride, filters[2], false, false); } for (int i = 0; i < blurWidth; ++i) { uint8_t *column = image.scanLine(blurRect.y()) + (blurRect.x() + i) * pixelBPP + alphaOffset; imageConvoluteFilter(column, twoStride.data(), blurHeight, pixelBPP, widthStride, filters[0], true, false); imageConvoluteFilter(twoStride.data(), nextStride, blurHeight, pixelBPP, widthStride, filters[1], false, false); imageConvoluteFilter(nextStride, column, blurHeight, pixelBPP, widthStride, filters[2], false, true); } } static inline void mirrorTopLeftQuadrant(QImage &image, bool horizontal = true, bool vertical = true) { const int width = image.width(); const int height = image.height(); const int centerX = qCeil(width * 0.5); const int centerY = qCeil(height * 0.5); const int alphaOffset = (image.depth() == 8 || QSysInfo::ByteOrder == QSysInfo::BigEndian) ? 0 : 3; const int pixelBPP = image.depth() >> 3; if (horizontal) { for (int y = 0; y < centerY; ++y) { uint8_t *sourceAlphaStride = image.scanLine(y) + alphaOffset; uint8_t *mirroredPixelPointer = sourceAlphaStride + (width - 1) * pixelBPP; for (int x = 0; x < centerX; ++x, sourceAlphaStride += pixelBPP, mirroredPixelPointer -= pixelBPP) { *mirroredPixelPointer = *sourceAlphaStride; } } } if (!vertical) return; for (int y = 0; y < centerY; ++y) { const uint8_t *sourceAlphaStride = image.scanLine(y) + alphaOffset; uint8_t *mirroredPixelPointer = image.scanLine(width - y - 1) + alphaOffset; for (int x = 0; x < width; ++x, sourceAlphaStride += pixelBPP, mirroredPixelPointer += pixelBPP) { *mirroredPixelPointer = *sourceAlphaStride; } } } static void cleanFunction(void *image) { delete static_cast(image); } ShadowImage *DQuickShadowProvider::getRawShadow(const ShadowConfig &config) { if (Q_UNLIKELY(qIsNull(config.blurRadius))) { return nullptr; } ShadowImage *image = this->cache.value(config); if (Q_LIKELY(image)) return image; const QString path = getShadowFilePath(config); if (QFile::exists(path)) { QImage *tmp = new QImage(path); QImage target(tmp->bits(), tmp->width(), tmp->height(), tmp->bytesPerLine(), QImage::Format_Alpha8, cleanFunction, tmp); image = new ShadowImage(this, config, target); } if (!image) { const int effectiveBlurRadius = calculateEffectiveBlurRadius(config.blurRadius); const qreal imageSize = (effectiveBlurRadius + config.blurRadius) * 2 + config.boxSize; QImage source(qRound(imageSize), qRound(imageSize), QImage::Format_Alpha8); source.fill(config.isInner() ? Qt::black : Qt::transparent); QRectF boxRect(effectiveBlurRadius, effectiveBlurRadius, imageSize - 2 * effectiveBlurRadius, imageSize - 2 * effectiveBlurRadius); QPainter sourcePainter(&source); sourcePainter.setRenderHint(QPainter::Antialiasing, true); sourcePainter.setPen(Qt::NoPen); sourcePainter.setBrush(Qt::black); if (config.isInner()) { sourcePainter.setCompositionMode(QPainter::CompositionMode_Clear); boxRect -= QMarginsF(config.spread, config.spread, config.spread, config.spread); } else { boxRect += QMarginsF(config.spread, config.spread, config.spread, config.spread); } sourcePainter.drawPath(roundedRectPath(boxRect, config)); sourcePainter.end(); const QRect blurRect(0, 0, qCeil(imageSize * 0.5), qCeil(imageSize * 0.5)); doBoxShdowBlur(source, static_cast(config.blurRadius), blurRect); mirrorTopLeftQuadrant(source); // you can save the source to the local directory here and add it to the qrc, // prevent repeated drawing of shadow pictures. // auto alpha = QImage(source.bits(), source.width(), source.height(), source.bytesPerLine(), QImage::Format_Grayscale8); // alpha.save("...." + config.toString() + ".png", "PNG"); image = new ShadowImage(this, config, source); } return image; } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickimageprovider_p.h000066400000000000000000000110051476226662700236020ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKIMAGEPROVIDER_P_H #define DQUICKIMAGEPROVIDER_P_H #include #include DQUICK_BEGIN_NAMESPACE class DQuickIconProvider : public QQuickImageProvider { public: DQuickIconProvider(); protected: QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override; }; class DQuickDciIconProvider : public QQuickImageProvider { public: DQuickDciIconProvider(); protected: QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override; }; class ShadowImage; class DQuickShadowProvider : public QQuickImageProvider { public: DQuickShadowProvider(); ~DQuickShadowProvider(); enum Type : quint8 { Rectangle = 0, Inner = 2 }; struct ShadowConfig { quint8 type = Rectangle; qreal topLeftRadius {0.0}; qreal topRightRadius {0.0}; qreal bottomLeftRadius {0.0}; qreal bottomRightRadius {0.0}; qreal blurRadius {0.0}; qreal spread {0.0}; qreal boxSize {0.0}; ShadowConfig() {} ShadowConfig(const ShadowConfig &other) : type(other.type) , topLeftRadius(other.topLeftRadius) , topRightRadius(other.topRightRadius) , bottomLeftRadius(other.bottomLeftRadius) , bottomRightRadius(other.bottomRightRadius) , blurRadius(other.blurRadius) , spread(other.spread) , boxSize(other.boxSize) {} inline bool isInner() const { return type & Inner; } inline QString toString() const { return QString("%1.%2.%3.%4.%5.%6.%7.%8").arg(type). arg(topLeftRadius).arg(topRightRadius).arg(bottomLeftRadius).arg(bottomRightRadius). arg(blurRadius).arg(spread).arg(boxSize); } inline ShadowConfig &operator=(const ShadowConfig &other) { type = other.type; topLeftRadius = other.topLeftRadius; topRightRadius = other.topRightRadius; bottomLeftRadius = other.bottomLeftRadius; bottomRightRadius = other.bottomRightRadius; blurRadius = other.blurRadius; spread = other.spread; return *this; } inline bool operator==(const ShadowConfig &other) const { return type == other.type && qFuzzyCompare(topLeftRadius, other.topLeftRadius) && qFuzzyCompare(topRightRadius, other.topRightRadius) && qFuzzyCompare(bottomLeftRadius, other.bottomLeftRadius) && qFuzzyCompare(bottomRightRadius, other.bottomRightRadius) && qFuzzyCompare(blurRadius, other.blurRadius) && qFuzzyCompare(spread, other.spread) && qFuzzyCompare(boxSize, other.boxSize); } inline bool operator!=(const ShadowConfig &other) const { return !operator==(other); } friend Q_CORE_EXPORT uint qHash(const ShadowConfig &config, uint seed) noexcept; }; static QUrl toUrl(qreal boxSize, qreal topLeftRadius, qreal topRightRadius, qreal bottomLeftRadius, qreal bottomRightRadius, qreal shadowBlur, QColor color, qreal xOffset, qreal yOffset, qreal spread, bool hollow, bool inner); protected: QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override; inline static QString getShadowFilePath(const DQuickShadowProvider::ShadowConfig &config) { return ":/dtk/declarative/shadow/" + config.toString() + ".png"; } ShadowImage *getRawShadow(const ShadowConfig &config); private: friend class ShadowImage; QHash cache; }; inline uint qHash(const DTK_QUICK_NAMESPACE::DQuickShadowProvider::ShadowConfig &config, uint seed = 0) noexcept { return QT_PREPEND_NAMESPACE(qHash)(static_cast(config.type), seed) ^ QT_PREPEND_NAMESPACE(qHash)(config.topLeftRadius, seed) ^ QT_PREPEND_NAMESPACE(qHash)(config.topRightRadius, seed) ^ QT_PREPEND_NAMESPACE(qHash)(config.bottomLeftRadius, seed) ^ QT_PREPEND_NAMESPACE(qHash)(config.bottomRightRadius, seed) ^ QT_PREPEND_NAMESPACE(qHash)(config.blurRadius, seed) ^ QT_PREPEND_NAMESPACE(qHash)(config.spread, seed); } DQUICK_END_NAMESPACE #endif // DQUICKIMAGEPROVIDER_P_H dtkdeclarative-5.7.12/src/private/dquickinwindowblur.cpp000066400000000000000000000126121476226662700235110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickinwindowblur_p.h" #include "private/dblitframebuffernode_p.h" #include "private/dblurimagenode_p.h" #include #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) #include #else #include #endif #include #include DGUI_USE_NAMESPACE DQUICK_BEGIN_NAMESPACE class Q_DECL_HIDDEN InWindowBlurTextureProvider : public QSGTextureProvider { public: InWindowBlurTextureProvider() : QSGTextureProvider() , m_texture(new QSGPlainTexture()) { m_texture->setOwnsTexture(false); } inline QSGPlainTexture *plainTexture() const { return m_texture.data(); } inline QSGTexture *texture() const override { return plainTexture(); } private: QScopedPointer m_texture; }; DQuickInWindowBlur::DQuickInWindowBlur(QQuickItem *parent) : QQuickItem(parent) { setFlag(QQuickItem::ItemHasContents, true); // TODO, `update` should be called when QSGRenderNode changed. QObject::connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [this](){ update(); }); } DQuickInWindowBlur::~DQuickInWindowBlur() { DQuickInWindowBlur::releaseResources(); } qreal DQuickInWindowBlur::radius() const { return m_radius; } void DQuickInWindowBlur::setRadius(qreal newRadius) { if (qFuzzyCompare(m_radius, newRadius)) return; m_radius = newRadius; update(); } bool DQuickInWindowBlur::offscreen() const { return m_offscreen; } void DQuickInWindowBlur::setOffscreen(bool newOffscreen) { if (m_offscreen == newOffscreen) return; m_offscreen = newOffscreen; Q_EMIT offscreenChanged(); update(); } QSGTextureProvider *DQuickInWindowBlur::textureProvider() const { const QQuickItemPrivate *d = QQuickItemPrivate::get(this); if (!d->window || !d->sceneGraphRenderContext() || QThread::currentThread() != d->sceneGraphRenderContext()->thread()) { qWarning("DQuickInWindowBlendBlur::textureProvider: can only be queried on the rendering thread of an exposed window"); return nullptr; } if (!m_tp) { m_tp = new InWindowBlurTextureProvider(); } return m_tp; } static void updateBlurNodeTexture(DBlitFramebufferNode *node, void *blurNode) { auto bn = reinterpret_cast(blurNode); bn->setTexture(node->texture()); } void onRender(DSGBlurNode *node, void *data) { DQuickInWindowBlur *that = reinterpret_cast(data); if (!that || !that->m_tp) return; node->writeToTexture(that->m_tp->plainTexture()); // Don't direct emit the signal, must ensure the signal emit on current render loop after. that->m_tp->metaObject()->invokeMethod(that->m_tp, &InWindowBlurTextureProvider::textureChanged, Qt::QueuedConnection); } QSGNode *DQuickInWindowBlur::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) { Q_UNUSED(data) auto node = static_cast(oldNode); const QSGRendererInterface::GraphicsApi ga = window()->rendererInterface()->graphicsApi(); if (Q_UNLIKELY(!node)) { if (ga == QSGRendererInterface::Software) { node = DBlitFramebufferNode::createSoftwareNode(this, true, true); auto blurNode = new DSoftwareBlurImageNode(this); blurNode->setDisabledOpaqueRendering(true); blurNode->setRenderCallback(onRender, this); node->appendChildNode(blurNode); node->setRenderCallback(updateBlurNodeTexture, blurNode); } #ifndef QT_NO_OPENGL else if (ga == QSGRendererInterface::OpenGL #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) || ga == QSGRendererInterface::OpenGLRhi #endif ) { node = DBlitFramebufferNode::createOpenGLNode(this, true, true); auto blurNode = new DOpenGLBlurEffectNode(this); blurNode->setDisabledOpaqueRendering(true); blurNode->setRenderCallback(onRender, this); node->appendChildNode(blurNode); node->setRenderCallback(updateBlurNodeTexture, blurNode); } #endif else { qWarning() << "Not supported graphics API:" << ga; return nullptr; } } if (!m_tp) { m_tp = new InWindowBlurTextureProvider(); } node->resize(size()); DSGBlurNode *blurNode = static_cast(node->firstChild()); Q_ASSERT(blurNode); blurNode->setRadius(m_radius); blurNode->setWindow(window()); const QRectF rect(0, 0, width(), height()); blurNode->setSourceRect(rect); blurNode->setRect(rect); blurNode->setTexture(node->texture()); blurNode->setFollowMatrixForSource(true); blurNode->setOffscreen(m_offscreen); return node; } void DQuickInWindowBlur::itemChange(ItemChange type, const ItemChangeData &data) { if (type == ItemDevicePixelRatioHasChanged) { update(); } QQuickItem::itemChange(type, data); } void DQuickInWindowBlur::releaseResources() { if (m_tp) { QQuickWindowQObjectCleanupJob::schedule(window(), m_tp); m_tp = nullptr; } } void DQuickInWindowBlur::invalidateSceneGraph() { delete m_tp; m_tp = nullptr; } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickinwindowblur_p.h000066400000000000000000000032511476226662700234740ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKINWINDOWBLUR_P_H #define DQUICKINWINDOWBLUR_P_H #include #include QT_BEGIN_NAMESPACE class QSGPlainTexture; #ifndef QT_NO_OPENGL class QOpenGLFramebufferObject; #endif QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class DQuickInWindowBlendBlurPrivate; class InWindowBlurTextureProvider; class DSGBlurNode; class DQuickInWindowBlur : public QQuickItem { Q_OBJECT Q_PROPERTY(qreal radius READ radius WRITE setRadius NOTIFY radiusChanged) Q_PROPERTY(bool offscreen READ offscreen WRITE setOffscreen NOTIFY offscreenChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(InWindowBlurImpl) #endif public: explicit DQuickInWindowBlur(QQuickItem *parent = nullptr); ~DQuickInWindowBlur() override; qreal radius() const; void setRadius(qreal newRadius); bool offscreen() const; void setOffscreen(bool newOffscreen); bool isTextureProvider() const override { return true; } QSGTextureProvider *textureProvider() const override; Q_SIGNALS: void radiusChanged(); void offscreenChanged(); protected: QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override; void itemChange(ItemChange, const ItemChangeData &) override; void releaseResources() override; private Q_SLOTS: void invalidateSceneGraph(); private: qreal m_radius = 20; bool m_offscreen = false; mutable InWindowBlurTextureProvider *m_tp = nullptr; friend void onRender(DSGBlurNode *, void *); }; DQUICK_END_NAMESPACE #endif // DQUICKINWINDOWBLUR_P_H dtkdeclarative-5.7.12/src/private/dquickitemviewport_p.h000066400000000000000000000235501476226662700235130ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKITEMVIEWPORT_P_H #define DQUICKITEMVIEWPORT_P_H #include "dquickitemviewport.h" #include #include #include #include #include class Q_DECL_HIDDEN MaskTextureCache { public: class Texture : public QSharedData { public: explicit Texture(QSGTexture *t, const qint8 key) : cacheKey(key) , texture(t) { MaskTextureCache::instance()->m_cache[cacheKey] = this; } ~Texture() { MaskTextureCache::instance()->m_cache.remove(cacheKey); delete texture; } qint8 cacheKey = 0; QSGTexture *texture = nullptr; }; typedef QExplicitlySharedDataPointer TextureData; static MaskTextureCache *instance() { static MaskTextureCache *object = new MaskTextureCache(); return object; } // 根据圆角大小获取一个蒙版材质,此材质将用于片段着色器中实现圆角效果 TextureData getTexture(QSGRenderContext *context, int radius, bool antialiasing) { // 用于获取材质缓存key的key qint8 to_cache_key_key = ((antialiasing << 7) | radius); Texture *texture = nullptr; if (m_radiusToCacheKey.contains(to_cache_key_key)) { texture = m_cache.value(m_radiusToCacheKey.value(to_cache_key_key)); } if (!texture) { // 在边缘额外加一个像素,用于 ClampToEdge 时不会取到边缘的透明像素点 QImage mask(QSize(radius + 1, radius + 1), QImage::Format_ARGB32); mask.fill(Qt::transparent); // 必须填充为白色,在着色器中运算时会使用rgb三个通道相乘 const QColor maskColor = Qt::white; QPainter pa(&mask); pa.setPen(maskColor); const QRect r = mask.rect(); pa.drawLine(r.bottomLeft(), r.bottomRight()); pa.drawLine(r.topRight(), r.bottomRight()); pa.setRenderHint(QPainter::Antialiasing, antialiasing); QPainterPath path; path.moveTo(radius, radius); path.arcTo(0, 0, radius * 2, radius * 2, 90, 90); path.lineTo(radius, radius); path.closeSubpath(); pa.fillPath(path, maskColor); pa.end(); texture = new Texture(context->createTexture(mask), to_cache_key_key); texture->texture->setFiltering(QSGTexture::Nearest); texture->texture->setVerticalWrapMode(QSGTexture::ClampToEdge); texture->texture->setHorizontalWrapMode(QSGTexture::ClampToEdge); m_radiusToCacheKey[to_cache_key_key] = texture->cacheKey; } // 为窗口保存mask材质 TextureData data(texture); return data; } private: MaskTextureCache() { } QHash m_cache; QMap m_radiusToCacheKey; friend class Texture; }; DQUICK_BEGIN_NAMESPACE class DQuickViewportTextureProvider : public QSGTextureProvider { Q_OBJECT public: DQuickViewportTextureProvider() : sourceTexture(nullptr) { } QSGTexture *texture() const override { return sourceTexture; } QSGLayer *sourceTexture; }; class Q_DECL_HIDDEN DQuickViewportCleanup : public QRunnable { public: DQuickViewportCleanup(QSGLayer *texture, MaskTextureCache::TextureData maskTexture, DQuickViewportTextureProvider *provider) : texture(texture) , maskTexture(maskTexture) , provider(provider) {} void run() override { delete texture; delete provider; maskTexture.reset(); } QSGLayer *texture; MaskTextureCache::TextureData maskTexture; DQuickViewportTextureProvider *provider; }; class PreprocessNode; class Q_DECL_HIDDEN DQuickItemViewportPrivate : public DCORE_NAMESPACE::DObjectPrivate, public QQuickItemChangeListener { public: enum DirtyStateBit { DirtyNothing = 0x0, DirtySourceSizeRatio = 0x1, DirtyMaskTexture = 0x2, DirtyMaskSizeRatio = 0x4, DirtyMaskOffset = 0x8, DirtyContentNode = 0x10 }; Q_DECLARE_FLAGS(DirtyState, DirtyStateBit) DQuickItemViewportPrivate(DQuickItemViewport *qq) : DObjectPrivate(qq) { } ~DQuickItemViewportPrivate() override; inline void markDirtys(DirtyState states) { dirtyState |= states; } inline void markDirty(DirtyStateBit state, bool dirty = true) { if (dirty) { dirtyState |= state; } else { dirtyState &= ~state; } } // 根据radius获取对应的蒙版材质 void initSourceItem(QQuickItem *old, QQuickItem *item); void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange data, const QRectF &) override; inline const QVector2D &getSoureSizeRatio() { if (Q_LIKELY(!dirtyState.testFlag(DirtySourceSizeRatio))) { return soureSizeRatio; } Q_ASSERT(sourceItem); markDirty(DirtySourceSizeRatio, false); const auto &sr = getSourceRect(); soureSizeRatio.setX(static_cast(sourceItem->width() / sr.width())); soureSizeRatio.setY(static_cast(sourceItem->height() / sr.height())); return soureSizeRatio; } inline const QVector2D &getMaskSizeRatio() { if (Q_LIKELY(!dirtyState.testFlag(DirtyMaskSizeRatio))) { return maskSizeRatio; } markDirty(DirtyMaskSizeRatio, false); const auto &sr = getSourceRect(); maskSizeRatio.setX(radius <= 0 ? sr.width() : static_cast(sr.width() / static_cast(radius))); maskSizeRatio.setY(radius <= 0 ? sr.height() : static_cast(sr.height() / static_cast(radius))); return maskSizeRatio; } inline const QVector2D &getMaskOffset() { if (Q_LIKELY(!dirtyState.testFlag(DirtyMaskOffset))) { return maskOffset; } Q_ASSERT(sourceItem && sourceItem->width() > 0 && sourceItem->height() > 0); markDirty(DirtyMaskOffset, false); auto offset = getSourceRect().topLeft(); maskOffset.setX(static_cast(offset.x() / sourceItem->width())); maskOffset.setY(static_cast(offset.y() / sourceItem->height())); return maskOffset; } inline QSGTexture *textureForRadiusMask() { if (Q_UNLIKELY(dirtyState.testFlag(DirtyMaskTexture) || !maskTexture)) { QQuickItemPrivate *d = QQuickItemPrivate::get(q_func()); maskTexture = MaskTextureCache::instance()->getTexture(d->sceneGraphRenderContext(), qRound(radius * d->window->effectiveDevicePixelRatio()), d->antialiasing); markDirty(DirtyMaskTexture, false); } return maskTexture->texture; } // MaskNode is required when need composition in transparent window. inline bool needMaskNode() const { return radius > 0 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) || compositionMode != DefaultCompositionMode #endif ; } inline bool updateOffset(const QPointF &offset) { if (this->offset == offset) return false; this->offset = offset; markDirty(DirtyMaskOffset); return true; } inline QRectF getSourceRect() const { QRectF sr = sourceRect; if (!sourceRect.isValid()) { sr = QRectF(QPointF(0, 0), q_func()->size()); } return fixed ? sr : sr.translated(offset); } template inline void updateSourceRect(T *node) const { const QSizeF &textureSize = node->texture()->textureSize(); qreal xScale = textureSize.width() / sourceItem->width(); qreal yScale = textureSize.height() / sourceItem->height(); // 计算sourceItem应该被绘制的区域,如果此区域大小为0, 则没有必要再继续绘制 const QRectF &sourceRect = getSourceRect(); // 更新 DQuickItemViewport 所对应的sourceItem的材质区域 node->setSourceRect(QRectF(sourceRect.x() * xScale, sourceRect.y() * yScale, sourceRect.width() * xScale, sourceRect.height() * yScale)); } void setPreprocessNode(PreprocessNode *newNode); void clearPreprocessNode(PreprocessNode *oldNode); void updateUsePreprocess() const; void ensureTexture(); D_DECLARE_PUBLIC(DQuickItemViewport) QPointer sourceItem; QAtomicPointer preprocessNode; // 记录sourceItem的大小是自身的多少倍 QVector2D soureSizeRatio; // 显示圆角的mask材质 MaskTextureCache::TextureData maskTexture; // item自身相对于圆角大小的比例 QVector2D maskSizeRatio; // mask材质相对于sourceItem材质的偏移量 QVector2D maskOffset; QMetaObject::Connection textureChangedConnection; // 自身位置相对于sourceItem的偏移量 QPointF offset = QPointF(0, 0); QRectF sourceRect; // 记录待更新的数据类型 DirtyState dirtyState = DirtyNothing; // 圆角半径大小 float radius = 0; bool fixed = false; bool hideSource = false; QSGLayer *texture = nullptr; DQuickViewportTextureProvider *provider = nullptr; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) constexpr static QPainter::CompositionMode DefaultCompositionMode = QPainter::CompositionMode_SourceOver; QPainter::CompositionMode compositionMode = DefaultCompositionMode; #endif }; Q_DECLARE_OPERATORS_FOR_FLAGS(DQuickItemViewportPrivate::DirtyState) DQUICK_END_NAMESPACE #endif // DQUICKITEMVIEWPORT_P_H dtkdeclarative-5.7.12/src/private/dquickkeylistener.cpp000066400000000000000000000106211476226662700233220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickkeylistener_p.h" #include #include #include DQUICK_BEGIN_NAMESPACE class DQuickKeyListenerPrivate : public DCORE_NAMESPACE::DObjectPrivate { D_DECLARE_PUBLIC(DQuickKeyListener) public: DQuickKeyListenerPrivate(DQuickKeyListener *qq) : DObjectPrivate(qq) , target(nullptr) , maxKeyCount(4) // The default value is 4. {} int doNativeShiftKey(QKeyEvent *e, int nativeKey); private: QQuickItem *target; QStringList keys; int maxKeyCount; }; DQuickKeyListener::DQuickKeyListener(QObject *parent) : QObject(parent) , DObject(*new DQuickKeyListenerPrivate(this)) { } QQuickItem *DQuickKeyListener::target() const { D_DC(DQuickKeyListener); return d->target; } void DQuickKeyListener::setTarget(QQuickItem *item) { D_D(DQuickKeyListener); if (d->target == item) return; if (d->target) { d->target->removeEventFilter(this); d->keys.clear(); } d->target = item; Q_EMIT targetChanged(); d->target->installEventFilter(this); } const QStringList &DQuickKeyListener::keys() const { D_DC(DQuickKeyListener); return d->keys; } void DQuickKeyListener::setKeys(const QStringList &keys) { D_D(DQuickKeyListener); if (d->keys == keys) return; d->keys = keys; Q_EMIT keysChanged(); } int DQuickKeyListener::maxKeyCount() const { D_DC(DQuickKeyListener); return d->maxKeyCount; } void DQuickKeyListener::setMaxKeyCount(int count) { D_D(DQuickKeyListener); d->maxKeyCount = count; Q_EMIT maxKeyCountChanged(); } void DQuickKeyListener::clearKeys() { D_D(DQuickKeyListener); d->keys.clear(); Q_EMIT keysChanged(); } bool DQuickKeyListener::eventFilter(QObject *watched, QEvent *event) { D_D(DQuickKeyListener); if (watched != d->target) return false; if (event->type() != QEvent::KeyPress) return false; QString modifiers; QKeyEvent *ke = static_cast(event); int key = ke->key(); if (ke->modifiers() & Qt::MODIFIER_MASK) modifiers = QKeySequence(ke->modifiers()).toString(QKeySequence::NativeText); QStringList keyTexts; static QList modifierKeys = {Qt::Key_Control, Qt::Key_Shift, Qt::Key_Meta, Qt::Key_Alt}; if (modifierKeys.contains(key)) { // Only modifier keys. #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) keyTexts << modifiers.split(QLatin1Char('+'), Qt::SkipEmptyParts); #else keyTexts << modifiers.split(QLatin1Char('+'), QString::SkipEmptyParts); #endif } else { key = d->doNativeShiftKey(ke, key); QString ks = QKeySequence(key).toString(); QKeySequence sequence(modifiers + ks); QString writing = sequence.toString(); #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) keyTexts << writing.split(QLatin1Char('+'), Qt::SkipEmptyParts); #else keyTexts << writing.split(QLatin1Char('+'), QString::SkipEmptyParts); #endif if (writing.contains(QLatin1String("++"))) keyTexts << QLatin1String("+"); } if (keyTexts.count() > d->maxKeyCount) keyTexts.mid(0, d->maxKeyCount); if (d->keys == keyTexts) return false; d->keys = keyTexts; Q_EMIT keysChanged(); return QObject::eventFilter(watched, event); } int DQuickKeyListenerPrivate::doNativeShiftKey(QKeyEvent *e, int nativeKey) { int key = nativeKey; if (!(e->modifiers() & Qt::ShiftModifier)) return key; auto possibleKeys = QKeyMapper::possibleKeys(e); int pkTotal = possibleKeys.count(); if (!pkTotal) return 0; bool found = false; for (int i = 0; i < possibleKeys.size(); ++i) { #if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) const auto combinedKey = possibleKeys.at(i).toCombined(); #else const auto combinedKey = possibleKeys.at(i); #endif if (combinedKey - nativeKey == int(e->modifiers()) || (combinedKey == nativeKey && e->modifiers() == Qt::ShiftModifier)) { key = combinedKey; found = true; break; } } // Use as fallback if (!found) #if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) key = possibleKeys.first().toCombined(); #else key = possibleKeys.first(); #endif return key; } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickkeylistener_p.h000066400000000000000000000025411476226662700233100ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKKEYLISTENER_P_H #define DQUICKKEYLISTENER_P_H #include #include #include #include class QQuickItem; DQUICK_BEGIN_NAMESPACE class DQuickKeyListenerPrivate; class DQuickKeyListener : public QObject, DCORE_NAMESPACE::DObject { Q_OBJECT D_DECLARE_PRIVATE(DQuickKeyListener) Q_PROPERTY(QQuickItem *target READ target WRITE setTarget NOTIFY targetChanged) Q_PROPERTY(QStringList keys READ keys WRITE setKeys NOTIFY keysChanged) Q_PROPERTY(int maxKeyCount READ maxKeyCount WRITE setMaxKeyCount NOTIFY maxKeyCountChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(KeySequenceListener) #endif public: explicit DQuickKeyListener(QObject *parent = nullptr); QQuickItem *target() const; void setTarget(QQuickItem *item); const QStringList &keys() const; void setKeys(const QStringList &keys); int maxKeyCount() const; void setMaxKeyCount(int count); Q_INVOKABLE void clearKeys(); Q_SIGNALS: void targetChanged(); void keysChanged(); void maxKeyCountChanged(); protected: bool eventFilter(QObject *watched, QEvent *event) override; }; DQUICK_END_NAMESPACE #endif // DQUICKKEYLISTENER_P_H dtkdeclarative-5.7.12/src/private/dquickopacitymask.cpp000066400000000000000000000051061476226662700233120ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickopacitymask_p.h" #include "dopacitymasknode.h" #include "dquickopacitymask_p_p.h" DQUICK_BEGIN_NAMESPACE DQuickOpacityMask::DQuickOpacityMask(QQuickItem *parent) : QQuickItem (*(new DQuickOpacityMaskPrivate), parent) { setFlag(ItemHasContents); } bool DQuickOpacityMask::invert() { Q_D(const DQuickOpacityMask); return d->invert; } void DQuickOpacityMask::setInvert(bool invert) { Q_D(DQuickOpacityMask); if (invert == d->invert) return; d->invert = invert; Q_EMIT invertChanged(); update(); } QQuickItem *DQuickOpacityMask::source() const { Q_D(const DQuickOpacityMask); return d->source; } void DQuickOpacityMask::setSource(QQuickItem *item) { Q_D(DQuickOpacityMask); if (item == d->source) return; d->source = item; d->sourceChanged = true; Q_EMIT sourceChanged(); update(); } QQuickItem *DQuickOpacityMask::maskSource() const { Q_D(const DQuickOpacityMask); return d->maskSource; } void DQuickOpacityMask::setMaskSource(QQuickItem *item) { Q_D(DQuickOpacityMask); if (d->maskSource == item) return; d->maskSource = item; d->sourceChanged = true; Q_EMIT maskSourceChanged(); update(); } QSGNode *DQuickOpacityMask::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *) { Q_D(DQuickOpacityMask); if (!d->source || !d->source->isTextureProvider() || !d->maskSource || !d->maskSource->isTextureProvider()) { delete oldNode; return nullptr; } QSGRendererInterface *ri = window()->rendererInterface(); if (!ri) return nullptr; QSGRendererInterface::GraphicsApi api = ri->graphicsApi(); if (QSGRendererInterface::Software == api) { DSoftwareOpacityMaskNode *node = static_cast(oldNode); if (d->sourceChanged) { delete node; node = nullptr; d->sourceChanged = false; } if (!node) node = new DSoftwareOpacityMaskNode(d->source->textureProvider(), d->maskSource->textureProvider()); node->sync(this); node->setInvert(d->invert); return node; } // NOTE(XiaoYaoBing): OpenGL hardware rendering can be completed by OpacityMask component in QtGraphicalEffects module return nullptr; } DQuickOpacityMask::DQuickOpacityMask(DQuickOpacityMaskPrivate &dd, QQuickItem *parent) : QQuickItem (dd, parent) {} DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickopacitymask_p.h000066400000000000000000000026061476226662700233000ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKOPACITYMASK_P_H #define DQUICKOPACITYMASK_P_H #include #include DQUICK_BEGIN_NAMESPACE class DQuickOpacityMaskPrivate; class DQuickOpacityMask : public QQuickItem { Q_OBJECT Q_PROPERTY(bool invert READ invert WRITE setInvert NOTIFY invertChanged) Q_PROPERTY(QQuickItem *source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(QQuickItem *maskSource READ maskSource WRITE setMaskSource NOTIFY maskSourceChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(SoftwareOpacityMask) #endif public: explicit DQuickOpacityMask(QQuickItem *parent = nullptr); bool invert(); void setInvert(bool invert); QQuickItem *source() const; void setSource(QQuickItem *item); QQuickItem *maskSource() const; void setMaskSource(QQuickItem *item); Q_SIGNALS: void invertChanged(); void sourceChanged(); void maskSourceChanged(); protected: QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override; protected: DQuickOpacityMask(DQuickOpacityMaskPrivate &dd, QQuickItem *parent = nullptr); private: Q_DISABLE_COPY(DQuickOpacityMask) Q_DECLARE_PRIVATE(DQuickOpacityMask) }; DQUICK_END_NAMESPACE #endif // DQUICKOPACITYMASK_P_H dtkdeclarative-5.7.12/src/private/dquickopacitymask_p_p.h000066400000000000000000000012641476226662700236160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKOPACITYMASK_P_P_H #define DQUICKOPACITYMASK_P_P_H #include "dquickopacitymask_p.h" #include DQUICK_BEGIN_NAMESPACE class DQuickOpacityMaskPrivate : public QQuickItemPrivate { Q_DECLARE_PUBLIC(DQuickOpacityMask) public: DQuickOpacityMaskPrivate() : source(nullptr) , maskSource(nullptr) , invert(false) , sourceChanged(false) {} QQuickItem *source; QQuickItem *maskSource; bool invert; bool sourceChanged; }; DQUICK_END_NAMESPACE #endif // DQUICKOPACITYMASK_P_P_H dtkdeclarative-5.7.12/src/private/dquickrectangle.cpp000066400000000000000000000067201476226662700227350ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickrectangle_p.h" #include "private/dquickrectangle_p_p.h" #include "private/drectanglenode_p.h" DQUICK_BEGIN_NAMESPACE DQuickRectangle::DQuickRectangle(QQuickItem *parent) : QQuickItem (*(new DQuickRectanglePrivate), parent) { setFlag(ItemHasContents); } DQuickRectangle::~DQuickRectangle() { if (window()) { DQuickRectangle::releaseResources(); } } QColor DQuickRectangle::color() const { Q_D(const DQuickRectangle); return d->color; } void DQuickRectangle::setColor(const QColor &color) { Q_D(DQuickRectangle); if (d->color == color) return; d->color = color; update(); Q_EMIT colorChanged(); } qreal DQuickRectangle::radius() const { Q_D(const DQuickRectangle); return d->radius; } void DQuickRectangle::setRadius(qreal radius) { Q_D(DQuickRectangle); if(qFuzzyCompare(d->radius, radius)) return; d->radius = radius; update(); Q_EMIT radiusChanged(); } DQuickRectangle::Corners DQuickRectangle::corners() const { Q_D(const DQuickRectangle); return d->corners; } void DQuickRectangle::setCorners(Corners corners) { Q_D(DQuickRectangle); if (d->corners == corners) return; d->corners = corners; update(); Q_EMIT cornersChanged(); } void DQuickRectangle::invalidateSceneGraph() { Q_D(DQuickRectangle); d->maskTexture.reset(); } QSGNode *DQuickRectangle::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) { Q_UNUSED(data); Q_D(DQuickRectangle); if (width() <= 0 || height() <= 0 || d->color.alpha() == 0) { delete oldNode; return nullptr; } QSGRendererInterface *ri = window()->rendererInterface(); if (Q_UNLIKELY(ri && ri->graphicsApi() == QSGRendererInterface::Software)) { DSoftRectangleNode *rectangle = static_cast(oldNode); if (!rectangle) { rectangle = new DSoftRectangleNode(this); } rectangle->setColor(d->color); rectangle->setRadius(d->radius * d->window->effectiveDevicePixelRatio()); rectangle->setCorners(corners()); return rectangle; } else { DRectangleNode *rectangle = static_cast(oldNode); if (!rectangle) { rectangle = new DRectangleNode; } if (d->radius > 0) rectangle->setMakTexture(d->textureForRadiusMask()); rectangle->setRect(QRectF(0, 0, width(), height())); rectangle->setColor(d->color); rectangle->setRadius(d->radius); rectangle->setCorners(corners()); rectangle->update(); return rectangle; } } DQuickRectangle::DQuickRectangle(DQuickRectanglePrivate &dd, QQuickItem *parent) : QQuickItem (dd, parent) { } class Q_DECL_HIDDEN DQuickRectangleCleanup : public QRunnable { public: DQuickRectangleCleanup(MaskTextureCache::TextureData maskTexture) : maskTexture(maskTexture) {} void run() override { maskTexture.reset(); } MaskTextureCache::TextureData maskTexture; }; void DQuickRectangle::releaseResources() { Q_D(DQuickRectangle); if (d->maskTexture) { window()->scheduleRenderJob(new DQuickRectangleCleanup(d->maskTexture), QQuickWindow::AfterSynchronizingStage); d->maskTexture.reset(); } } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickrectangle_p.h000066400000000000000000000041531476226662700227170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKRECTANGLE_P_H #define DQUICKRECTANGLE_P_H #include #include #include DQUICK_BEGIN_NAMESPACE class DQuickRectanglePrivate; class Q_DECL_EXPORT DQuickRectangle : public QQuickItem { Q_OBJECT Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) Q_PROPERTY(qreal radius READ radius WRITE setRadius NOTIFY radiusChanged) Q_PROPERTY(Corners corners READ corners WRITE setCorners NOTIFY cornersChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(RoundRectangle) #endif public: enum Corner { NoneCorner = 0x0, TopLeftCorner = 0x1, TopRightCorner = 0x2, BottomLeftCorner = 0x4, BottomRightCorner = 0x8, TopCorner = TopLeftCorner | TopRightCorner, BottomCorner = BottomLeftCorner| BottomRightCorner, LeftCorner = TopLeftCorner| BottomLeftCorner, RightCorner = TopRightCorner| BottomRightCorner, AllCorner = TopCorner | BottomCorner }; Q_DECLARE_FLAGS(Corners, Corner) Q_FLAG(Corners) explicit DQuickRectangle(QQuickItem *parent = nullptr); ~DQuickRectangle(); QColor color() const; void setColor(const QColor &color); qreal radius() const; void setRadius(qreal radius); DQuickRectangle::Corners corners() const; void setCorners(Corners corners); private Q_SLOTS: void invalidateSceneGraph(); Q_SIGNALS: void colorChanged(); void radiusChanged(); void cornersChanged(); protected: QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override; protected: DQuickRectangle(DQuickRectanglePrivate &dd, QQuickItem *parent = nullptr); private: Q_DISABLE_COPY(DQuickRectangle) Q_DECLARE_PRIVATE(DQuickRectangle) void releaseResources() override; }; DQUICK_END_NAMESPACE Q_DECLARE_OPERATORS_FOR_FLAGS(DTK_QUICK_NAMESPACE::DQuickRectangle::Corners) Q_DECLARE_METATYPE(DTK_QUICK_NAMESPACE::DQuickRectangle::Corner) #endif // DQUICKRECTANGLE_P_H dtkdeclarative-5.7.12/src/private/dquickrectangle_p_p.h000066400000000000000000000022261476226662700232350ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKRECTANGLE_P_P_H #define DQUICKRECTANGLE_P_P_H #include "dquickrectangle_p.h" #include "dquickitemviewport_p.h" #include DQUICK_BEGIN_NAMESPACE class Q_DECL_HIDDEN DQuickRectanglePrivate : public QQuickItemPrivate { Q_DECLARE_PUBLIC(DQuickRectangle) public: DQuickRectanglePrivate() : QQuickItemPrivate () , radius(0.0) , color(Qt::white) { } inline QSGTexture *textureForRadiusMask() { if (!maskTexture && radius > 0) { QQuickItemPrivate *d = QQuickItemPrivate::get(q_func()); maskTexture = MaskTextureCache::instance()->getTexture(d->sceneGraphRenderContext(), qRound(radius * d->window->effectiveDevicePixelRatio()), true); } return maskTexture->texture; } qreal radius; QColor color; DQuickRectangle::Corners corners; MaskTextureCache::TextureData maskTexture; }; DQUICK_END_NAMESPACE #endif // DQUICKRECTANGLE_P_P_H dtkdeclarative-5.7.12/src/private/dquicksystempalette_p.h000066400000000000000000000012411476226662700236510ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKSYSTEMPALETTE_P_H #define DQUICKSYSTEMPALETTE_P_H #include "dquicksystempalette.h" #include #include #include DGUI_USE_NAMESPACE DQUICK_BEGIN_NAMESPACE class DQuickSystemPalettePrivate : public DTK_CORE_NAMESPACE::DObjectPrivate { public: DQuickSystemPalettePrivate(DQuickSystemPalette *qq); DPalette palette; QPalette::ColorGroup colorGroup = QPalette::Active; private: D_DECLARE_PUBLIC(DQuickSystemPalette) }; DQUICK_END_NAMESPACE #endif // DQUICKSYSTEMPALETTE_P_H dtkdeclarative-5.7.12/src/private/dquickwaterprogressattribute.cpp000066400000000000000000000201041476226662700256140ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickwaterprogressattribute_p.h" #include #include #include #include #include DQUICK_BEGIN_NAMESPACE class WaterPopAttributePrivate : public QSharedData { public: qreal m_popSizeRatio = 0; qreal m_popXSpeed = 0; qreal m_popYSpeed = 0; qreal m_popX = 0; qreal m_popY = 0; qreal m_width = 0; qreal m_height = 0; qreal m_yOffset = 0; }; WaterPopAttribute::WaterPopAttribute(qreal sizeRatio, qreal xSpeed, qreal ySpeed) : d(new WaterPopAttributePrivate) { d->m_popSizeRatio = sizeRatio; d->m_popXSpeed = xSpeed; d->m_popYSpeed = ySpeed; } WaterPopAttribute::~WaterPopAttribute() { } WaterPopAttribute::WaterPopAttribute(const WaterPopAttribute &other) : QObject(nullptr) , d(other.d) { } WaterPopAttribute &WaterPopAttribute::operator=(const WaterPopAttribute &other) { d = other.d; return *this; } qreal WaterPopAttribute::xSpeed() const { return d->m_popXSpeed; } void WaterPopAttribute::setXSpeed(qreal popXSpeed) { if (qFuzzyCompare(d->m_popXSpeed, popXSpeed)) return; d->m_popXSpeed = popXSpeed; Q_EMIT xSpeedChanged(); } qreal WaterPopAttribute::ySpeed() const { return d->m_popYSpeed; } void WaterPopAttribute::setYSpeed(qreal popYSpeed) { if (qFuzzyCompare(d->m_popYSpeed, popYSpeed)) return; d->m_popYSpeed = popYSpeed; Q_EMIT ySpeedChanged(); } qreal WaterPopAttribute::x() const { return d->m_popX; } void WaterPopAttribute::setX(qreal x) { if (qFuzzyCompare(d->m_popX, x)) return; d->m_popX = x; Q_EMIT xChanged(); } qreal WaterPopAttribute::y() const { return d->m_popY; } void WaterPopAttribute::setY(qreal y) { if (qFuzzyCompare(d->m_popY, y)) return; d->m_popY = y; Q_EMIT yChanged(); } qreal WaterPopAttribute::width() const { return d->m_width; } void WaterPopAttribute::setWidth(qreal width) { if (qFuzzyCompare(d->m_width, width)) return; d->m_width = width; Q_EMIT widthChanged(); } qreal WaterPopAttribute::height() const { return d->m_height; } void WaterPopAttribute::setHeight(qreal height) { if (qFuzzyCompare(d->m_height, height)) return; d->m_height = height; Q_EMIT heightChanged(); } qreal WaterPopAttribute::sizeRatio() const { return d->m_popSizeRatio; } qreal WaterPopAttribute::yOffset() const { return d->m_yOffset; } void WaterPopAttribute::setYOffset(qreal offset) { if (qFuzzyCompare(d->m_yOffset, offset)) return; d->m_yOffset = offset; } class DQuickWaterProgressAttributePrivate : public DCORE_NAMESPACE::DObjectPrivate { D_DECLARE_PUBLIC(DQuickWaterProgressAttribute) public: DQuickWaterProgressAttributePrivate(DQuickWaterProgressAttribute *qq) : DObjectPrivate(qq) , m_frontXOffset(100) , m_backXOffset(0) , m_timer(nullptr) , m_interval(33) , m_waterProgress(nullptr) {} ~DQuickWaterProgressAttributePrivate(); void init(); private: qreal m_frontXOffset; qreal m_backXOffset; QList m_pops; QTimer *m_timer; int m_interval; QQuickItem * m_waterProgress; qreal m_imageWidth; qreal m_imageHeight; }; DQuickWaterProgressAttributePrivate::~DQuickWaterProgressAttributePrivate() { qDeleteAll(m_pops); m_pops.clear(); } void DQuickWaterProgressAttributePrivate::init() { D_Q(DQuickWaterProgressAttribute); m_timer = new QTimer(q); m_timer->setInterval(m_interval); m_pops.append(new WaterPopAttribute(0.07, -1.8, 0.6)); m_pops.append(new WaterPopAttribute(0.08, 1.2, 1.0)); m_pops.append(new WaterPopAttribute(0.11, 0.8, 1.6)); QObject::connect(m_timer, &QTimer::timeout, q, [=]() { // move 60% per second double frontXDeta = 40.0 / (1000.0 / m_interval); // move 90% per second double backXDeta = 60.0 / (1000.0 / m_interval); qreal canvasWidth = m_waterProgress->width() * qApp->devicePixelRatio(); q->setFrontXOffset(q->frontXOffset() - frontXDeta * canvasWidth / 100); q->setBackXOffset(q->backXOffset() + backXDeta * canvasWidth / 100); if (q->frontXOffset() > canvasWidth || q->frontXOffset() < (canvasWidth - q->imageWidth())) q->setFrontXOffset(canvasWidth); if (q->backXOffset() > q->imageWidth()) q->setBackXOffset(0); // update pop // move 25% per second default qreal speed = 25 / (1000.0 / m_interval); int value = m_waterProgress->property(QByteArrayLiteral("value")).toInt(); for (auto &pop : m_pops) { // yOffset 0 ~ 100; pop->setYOffset(pop->yOffset() + speed * pop->ySpeed()); pop->setYOffset(pop->yOffset() > value ? 0 : pop->yOffset()); qreal xOffset = qSin((pop->yOffset() * 0.01) * 2 * M_PI) * 18 * pop->xSpeed() + 50; pop->setY((1 - 0.01 * pop->yOffset()) * m_waterProgress->height()); pop->setX(xOffset * 0.01 * m_waterProgress->width()); pop->setWidth(pop->sizeRatio() * m_waterProgress->width()); pop->setHeight(pop->sizeRatio() * m_waterProgress->height()); } }); } DQuickWaterProgressAttribute::DQuickWaterProgressAttribute(QObject *parent) : QObject(parent) , DObject(*new DQuickWaterProgressAttributePrivate(this)) { D_D(DQuickWaterProgressAttribute); d->init(); } qreal DQuickWaterProgressAttribute::frontXOffset() const { D_DC(DQuickWaterProgressAttribute); return d->m_frontXOffset; } void DQuickWaterProgressAttribute::setFrontXOffset(qreal frontXOffset) { D_D(DQuickWaterProgressAttribute); if (qFuzzyCompare(d->m_frontXOffset, frontXOffset)) return; d->m_frontXOffset = frontXOffset; Q_EMIT frontXOffsetChanged(); } qreal DQuickWaterProgressAttribute::backXOffset() const { D_DC(DQuickWaterProgressAttribute); return d->m_backXOffset; } void DQuickWaterProgressAttribute::setBackXOffset(qreal backXOffset) { D_D(DQuickWaterProgressAttribute); if (qFuzzyCompare(d->m_backXOffset, backXOffset)) return; d->m_backXOffset = backXOffset; Q_EMIT backXOffsetChanged(); } QQmlListProperty DQuickWaterProgressAttribute::pops() { D_D(DQuickWaterProgressAttribute); #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) return QQmlListProperty(this, &d->m_pops); #else return QQmlListProperty(this, d->m_pops); #endif } bool DQuickWaterProgressAttribute::running() const { D_DC(DQuickWaterProgressAttribute); return d->m_timer->isActive(); } void DQuickWaterProgressAttribute::setRunning(bool running) { D_D(DQuickWaterProgressAttribute); if (d->m_timer->isActive() == running) return; if (running) d->m_timer->start(); else d->m_timer->stop(); Q_EMIT runningChanged(); } QQuickItem *DQuickWaterProgressAttribute::waterProgress() const { D_DC(DQuickWaterProgressAttribute); return d->m_waterProgress; } void DQuickWaterProgressAttribute::setWaterProgress(QQuickItem *waterProgress) { D_D(DQuickWaterProgressAttribute); if (d->m_waterProgress == waterProgress) return; d->m_waterProgress = waterProgress; Q_EMIT waterProgressChanged(); } qreal DQuickWaterProgressAttribute::imageWidth() const { D_DC(DQuickWaterProgressAttribute); return d->m_imageWidth; } void DQuickWaterProgressAttribute::setImageWidth(qreal imageWidth) { D_D(DQuickWaterProgressAttribute); if (qFuzzyCompare(d->m_imageWidth, imageWidth)) return; d->m_imageWidth = imageWidth; Q_EMIT imageWidthChanged(); } qreal DQuickWaterProgressAttribute::imageHeight() const { D_DC(DQuickWaterProgressAttribute); return d->m_imageHeight; } void DQuickWaterProgressAttribute::setImageHeight(qreal imageHeight) { D_D(DQuickWaterProgressAttribute); if (qFuzzyCompare(d->m_imageHeight, imageHeight)) return; d->m_imageHeight = imageHeight; Q_EMIT imageHeightChanged(); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dquickwaterprogressattribute_p.h000066400000000000000000000072771476226662700256200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKWATERPROGRESSATTRIBUTE_P_H #define DQUICKWATERPROGRESSATTRIBUTE_P_H #include #include #include #include #include #include class QQuickItem; DQUICK_BEGIN_NAMESPACE class WaterPopAttributePrivate; class WaterPopAttribute : public QObject { Q_OBJECT Q_PROPERTY(qreal width READ width WRITE setWidth NOTIFY widthChanged FINAL) Q_PROPERTY(qreal height READ height WRITE setHeight NOTIFY heightChanged FINAL) Q_PROPERTY(qreal xSpeed READ xSpeed WRITE setXSpeed NOTIFY xSpeedChanged FINAL) Q_PROPERTY(qreal ySpeed READ ySpeed WRITE setYSpeed NOTIFY ySpeedChanged FINAL) Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged FINAL) Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged FINAL) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_ANONYMOUS #endif public: WaterPopAttribute(qreal sizeRatio = 0, qreal xSpeed = 0, qreal ySpeed = 0); ~WaterPopAttribute(); WaterPopAttribute(const WaterPopAttribute &other); WaterPopAttribute& operator=(const WaterPopAttribute &other); qreal xSpeed() const; void setXSpeed(qreal popXSpeed); qreal ySpeed() const; void setYSpeed(qreal popYSpeed); qreal x() const; void setX(qreal x); qreal y() const; void setY(qreal y); qreal width() const; void setWidth(qreal width); qreal height() const; void setHeight(qreal height); qreal sizeRatio() const; inline qreal yOffset() const; inline void setYOffset(qreal offset); Q_SIGNALS: void xSpeedChanged(); void ySpeedChanged(); void xChanged(); void yChanged(); void widthChanged(); void heightChanged(); private: QSharedDataPointer d; }; class DQuickWaterProgressAttributePrivate; class DQuickWaterProgressAttribute : public QObject, DCORE_NAMESPACE::DObject { Q_OBJECT D_DECLARE_PRIVATE(DQuickWaterProgressAttribute) Q_PROPERTY(qreal frontXOffset READ frontXOffset NOTIFY frontXOffsetChanged) Q_PROPERTY(qreal backXOffset READ backXOffset NOTIFY backXOffsetChanged) Q_PROPERTY(qreal imageWidth READ imageWidth WRITE setImageWidth NOTIFY imageWidthChanged) Q_PROPERTY(qreal imageHeight READ imageHeight WRITE setImageHeight NOTIFY imageHeightChanged) Q_PROPERTY(QQmlListProperty pops READ pops NOTIFY popsChanged) Q_PROPERTY(bool running READ running WRITE setRunning NOTIFY runningChanged) Q_PROPERTY(QQuickItem *waterProgress READ waterProgress WRITE setWaterProgress NOTIFY waterProgressChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(WaterProgressAttribute) #endif public: explicit DQuickWaterProgressAttribute(QObject *parent = nullptr); ~DQuickWaterProgressAttribute() {} qreal frontXOffset() const; void setFrontXOffset(qreal frontXOffset); qreal backXOffset() const; void setBackXOffset(qreal backXOffset); QQmlListProperty pops(); bool running() const; void setRunning(bool running); QQuickItem * waterProgress() const; void setWaterProgress(QQuickItem * waterProgress); qreal imageWidth() const; void setImageWidth(qreal imageWidth); qreal imageHeight() const; void setImageHeight(qreal imageHeight); Q_SIGNALS: void frontXOffsetChanged(); void backXOffsetChanged(); void popsChanged(); void runningChanged(); void waterProgressChanged(); void imageWidthChanged(); void imageHeightChanged(); }; DQUICK_END_NAMESPACE #endif // DQUICKWATERPROGRESSATTRIBUTE_H dtkdeclarative-5.7.12/src/private/dquickwindow_p.h000066400000000000000000000055521476226662700222660ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DWINDOW_P_H #define DWINDOW_P_H #include #include #include #include "dquickwindow.h" DQUICK_BEGIN_NAMESPACE class DQuickBehindWindowBlur; class DQuickWindowPrivate : public DTK_CORE_NAMESPACE::DObjectPrivate { public: explicit DQuickWindowPrivate(DQuickWindow *qq); DQuickWindowAttached *attached; private: D_DECLARE_PUBLIC(DQuickWindow) }; class DQuickWindowAttachedPrivate : public DTK_CORE_NAMESPACE::DObjectPrivate { public: enum BoolOptional : qint8 { Invalid = -1, False = 0, True = 1 }; explicit DQuickWindowAttachedPrivate(QWindow *window, DQuickWindowAttached *qq); ~DQuickWindowAttachedPrivate() override; bool ensurePlatformHandle(); void destoryPlatformHandle(); void _q_onWindowMotifHintsChanged(quint32 winId); void addBlur(DQuickBehindWindowBlur *blur); void removeBlur(DQuickBehindWindowBlur *blur); void updateBlurAreaFor(DQuickBehindWindowBlur *blur); void _q_updateBlurAreaForWindow(); void _q_updateClipPath(); void _q_ensurePlatformHandle(); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) void ensurePalette(); void _q_updateWindowPalette(); void _q_onPaletteChanged(); #endif QWindow *window = nullptr; DPlatformHandle *handle = nullptr; BoolOptional explicitEnable {Invalid}; BoolOptional explicitTranslucentBackground {Invalid}; BoolOptional explicitEnableSystemResize {Invalid}; BoolOptional explicitEnableSystemMove {Invalid}; BoolOptional explicitEnableBlurWindow {Invalid}; qint8 explicitWindowRadius = -1; qint8 explicitBorderWidth = -1; qint8 explicitShadowRadius = -1; QPoint explicitShadowOffset; QColor explicitBorderColor; QColor explicitShadowColor; DPlatformHandle::EffectScenes explicitEffectScene = DPlatformHandle::EffectScenes(0); DPlatformHandle::EffectTypes explicitEffectType = DPlatformHandle::EffectTypes(0); DWindowManagerHelper::WmWindowTypes wmWindowTypes; DWindowManagerHelper::MotifFunctions motifFunctions; DWindowManagerHelper::MotifDecorations motifDecorations; QList blurList; QQuickPath *clipPath = nullptr; QQuickTransition *overlayExitedTransition = nullptr; QQmlComponent *loadingOverlay = nullptr; DQuickAppLoaderItem *appLoaderItem; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) DGuiApplicationHelper::ColorType themeType{DGuiApplicationHelper::UnknownType}; bool paletteInit = false; QQuickPalette *quickPalette = nullptr; QQuickPalette *inactiveQuickPalette = nullptr; std::array paletteConnections; #endif private: D_DECLARE_PUBLIC(DQuickWindowAttached) }; DQUICK_END_NAMESPACE #endif //DWINDOW_P_H dtkdeclarative-5.7.12/src/private/drectanglenode.cpp000066400000000000000000000356771476226662700225630ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "drectanglenode_p.h" #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #endif DQUICK_USE_NAMESPACE DQUICK_BEGIN_NAMESPACE #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) const char *CornerColorShader::vertexShader() const { return "uniform highp mat4 qt_Matrix; \n" "attribute highp vec4 qt_VertexPosition; \n" "attribute highp vec2 qt_VertexTexCoord; \n" "attribute highp vec4 vertexColor; \n" "varying highp vec2 qt_TexCoord; \n" "varying lowp vec4 color; \n" "void main() { \n" " qt_TexCoord = qt_VertexTexCoord; \n" " color = vertexColor; \n" " gl_Position = qt_Matrix * qt_VertexPosition; \n" "}"; } const char *CornerColorShader::fragmentShader() const { return "varying highp vec2 qt_TexCoord; \n" "varying lowp vec4 color; \n" "uniform lowp float qt_Opacity; \n" "uniform sampler2D qt_Texture; \n" "void main() { \n" " gl_FragColor = color * texture2D(qt_Texture, qt_TexCoord).a * qt_Opacity; \n" "}"; } const char * const *CornerColorShader::attributeNames() const { static const char *attributes[] = { "qt_VertexPosition", "qt_VertexTexCoord", "vertexColor", nullptr }; return attributes; } void CornerColorShader::updateState(const QSGMaterialShader::RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) { QOpenGLShaderProgram * const program = QSGMaterialShader::program(); CornerColorMaterial *newSurface = static_cast(newMaterial); QSGOpaqueTextureMaterialShader::updateState(state, newSurface, oldMaterial); if (state.isOpacityDirty()) { program->setUniformValue(m_idQtOpacity, state.opacity()); } } void CornerColorShader::initialize() { QSGOpaqueTextureMaterialShader::initialize(); QOpenGLShaderProgram * const program = QSGMaterialShader::program(); m_idQtOpacity = program->uniformLocation("qt_Opacity"); } #else #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) CornerColorShader::CornerColorShader(int viewCount) : QSGOpaqueTextureMaterialRhiShader(viewCount) #else CornerColorShader::CornerColorShader() #endif { setShaderFileName(QSGMaterialShader::VertexStage, QStringLiteral(":/dtk/declarative/shaders_ng/cornerscolorshader.vert.qsb")); setShaderFileName(QSGMaterialShader::FragmentStage, QStringLiteral(":/dtk/declarative/shaders_ng/cornerscolorshader.frag.qsb")); } // Mapping shader's ubuf of cornerscolorshader enum Ubuf { QtMatrixSize = 64, QtOpacitySize = 4, QtMatrixOffset = 0, QtOpacityOffset = QtMatrixOffset + QtMatrixSize }; bool CornerColorShader::updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) { CornerColorMaterial *newSurface = static_cast(newMaterial); bool changed = QSGOpaqueTextureMaterialRhiShader::updateUniformData(state, newSurface, oldMaterial); QByteArray *buf = state.uniformData(); Q_ASSERT(buf->size() >= QtOpacityOffset + QtOpacitySize); if (state.isOpacityDirty()) { const float opacity = state.opacity(); memcpy(buf->data() + QtOpacityOffset, &opacity, QtOpacitySize); changed = true; } return changed; } #endif CornerColorMaterial::CornerColorMaterial() : QSGOpaqueTextureMaterial() , m_radius(0.0) { // blending must be turned on to handle cornor mask setFlag(Blending, true); } QSGMaterialType *CornerColorMaterial::type() const { static QSGMaterialType type; return &type; } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QSGMaterialShader *CornerColorMaterial::createShader() const { return new CornerColorShader; } #else QSGMaterialShader *CornerColorMaterial::createShader(QSGRendererInterface::RenderMode renderMode) const { Q_UNUSED(renderMode) #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) return new CornerColorShader(viewCount()); #else return new CornerColorShader; #endif } #endif int CornerColorMaterial::compare(const QSGMaterial *other) const { return QSGOpaqueTextureMaterial::compare(other); } DRectangleNode::DRectangleNode() : m_geometry(QSGGeometry::defaultAttributes_ColoredPoint2D(), 8) , m_maskTexture(nullptr) { setGeometry(&m_geometry); setMaterial(&m_material); m_cornerNode.setGeometry(&m_cornerGeometry); m_cornerNode.setMaterial(&m_cornerMaterial); m_cornerGeometry.setDrawingMode(GL_TRIANGLES); } void DRectangleNode::setRect(const QRectF &r) { if (m_rect == r) return; m_geometryChanged = true; m_rect = r; } void DRectangleNode::setRadius(qreal radius) { if (qFuzzyCompare(m_radius, radius)) return; m_radius = std::min({rect().width() / 2.0, rect().height() / 2.0, radius}); m_cornerMaterial.setRadius(m_radius); m_cornerMaterial.setColor(color()); m_geometryChanged = true; const bool needCornerNode = m_radius > 0; const bool existsCornerNode = childCount() > 0; if (needCornerNode == existsCornerNode) return; if (!existsCornerNode) { appendChildNode(&m_cornerNode); } else { removeChildNode(&m_cornerNode); } m_cornerNode.markDirty(DirtyMaterial); } void DRectangleNode::setColor(const QColor &color) { if (color == m_color) return; m_color = color; m_cornerMaterial.setColor(color); m_geometryChanged = true; } void DRectangleNode::setMakTexture(QSGTexture *texture) { if (texture == m_maskTexture) return; m_maskTexture = texture; m_maskTexture->setFiltering(QSGTexture::Linear); m_maskTexture->setVerticalWrapMode(QSGTexture::ClampToEdge); m_maskTexture->setHorizontalWrapMode(QSGTexture::ClampToEdge); if (!m_maskTexture->hasAlphaChannel()) qWarning() << "The mask material does not contain an alpha channel"; m_cornerMaterial.setTexture(m_maskTexture); m_geometryChanged = true; } void DRectangleNode::setCorners(DQuickRectangle::Corners corners) { if (m_coners == corners) return; m_geometryChanged = true; m_coners = corners; } void DRectangleNode::update() { if (m_geometryChanged) { updateGeometry(); m_geometryChanged = false; } } void DRectangleNode::updateGeometry() { qreal cornorRadius = m_radius; uchar r = uchar(qRound(color().redF() * color().alphaF() * 255)); uchar g = uchar(qRound(color().greenF() * color().alphaF() * 255)); uchar b = uchar(qRound(color().blueF() * color().alphaF() * 255)); uchar a = uchar(qRound(color().alphaF() * 255)); if (cornorRadius > 0) { qreal radius = std::min({ m_rect.width() / 2, m_rect.height() / 2, cornorRadius }); m_geometry.allocate(8); const float outerL = m_rect.left(); const float innerL = m_rect.left() + radius; const float innerR = m_rect.right() - radius; const float outerR = m_rect.right(); const float outerT = m_rect.top(); const float innerT = m_rect.top() + radius; const float innerB = m_rect.bottom() - radius; const float outerB = m_rect.bottom(); // inner polygon QSGGeometry::ColoredPoint2D *vertices = m_geometry.vertexDataAsColoredPoint2D(); bool bottomLeft = m_coners.testFlag(DQuickRectangle::BottomLeftCorner); bool topLeft = m_coners.testFlag(DQuickRectangle::TopLeftCorner); bool bottomRight = m_coners.testFlag(DQuickRectangle::BottomRightCorner); bool topRight = m_coners.testFlag(DQuickRectangle::TopRightCorner); // (3)*********(5) // * * // * * // * * // *(1) *(7) // * * // *(0) * // * *(6) // * * // * * // (2)**********(4) vertices[0].set(outerL, innerB, r, g, b, a); // Outer left, inner bottom vertices[1].set(outerL, innerT, r, g, b, a); // Outer left, inner top vertices[2].set(bottomLeft ? innerL : m_rect.left(), outerB, r, g, b, a); // Inner left, outer bottom vertices[3].set(topLeft ? innerL : m_rect.left(), outerT, r, g, b, a); // Inner left, outer top vertices[4].set(bottomRight ? innerR : m_rect.right(), outerB, r, g, b, a); // Inner right, outer botton vertices[5].set(topRight ? innerR : m_rect.right(), outerT, r, g, b, a); // Inner right, outer top vertices[6].set(outerR, innerB, r, g, b, a); // Outer right, inner bottom vertices[7].set(outerR, innerT, r, g, b, a); // Outer right, inner top // four corner triangle int num = 0; if (bottomLeft) num += 3; if (topLeft) num += 3; if (bottomRight) num += 3; if (topRight) num += 3; m_cornerGeometry.allocate(num); ColoredCornerPoint2D *corners = static_cast(m_cornerGeometry.vertexData()); int vertexNum = 0; // Bottom left // (1)* // ** // * * // * * // (0)******(2) if (bottomLeft) { corners[0].set(outerL, outerB, 0, 0, r, g, b, a); corners[1].set(outerL, innerB, 0, 1, r, g, b, a); corners[2].set(innerL, outerB, 1, 0, r, g, b, a); vertexNum += 3; } // Top left // (3)*****(5) // * * // * * // ** // *(4) if (topLeft) { corners[vertexNum + 0].set(outerL, outerT, 0, 0, r, g, b, a); corners[vertexNum + 1].set(outerL, innerT, 0, 1, r, g, b, a); corners[vertexNum + 2].set(innerL, outerT, 1, 0, r, g, b, a); vertexNum += 3; } // Bottom right // *(7) // ** // * * // * * // (8)*****(6) if (bottomRight) { corners[vertexNum + 0].set(outerR, outerB, 0, 0, r, g, b, a); corners[vertexNum + 1].set(outerR, innerB, 0, 1, r, g, b, a); corners[vertexNum + 2].set(innerR, outerB, 1, 0, r, g, b, a); vertexNum += 3; } // Top right // (11)*****(9) // * * // * * // ** // *(10) if (topRight) { corners[vertexNum + 0].set(outerR, outerT, 0, 0, r, g, b, a); corners[vertexNum + 1].set(outerR, innerT, 0, 1, r, g, b, a); corners[vertexNum + 2].set(innerR, outerT, 1, 0, r, g, b, a); } m_cornerNode.markDirty(DirtyGeometry); markDirty(QSGNode::DirtyGeometry); } else { m_geometry.allocate(4); m_geometry.setDrawingMode(QSGGeometry::DrawTriangleStrip); QSGGeometry::ColoredPoint2D *vertices = m_geometry.vertexDataAsColoredPoint2D(); vertices[0].set(m_rect.left(), m_rect.top(), r, g, b, a); vertices[1].set(m_rect.left(), m_rect.bottom(), r, g, b, a); vertices[2].set(m_rect.right(), m_rect.top(), r, g, b, a); vertices[3].set(m_rect.right(), m_rect.bottom(), r, g, b, a); markDirty(QSGNode::DirtyGeometry); } } DSoftRectangleNode::DSoftRectangleNode(QQuickItem *owner) : m_item(owner) { Q_ASSERT(owner); m_window = m_item->window(); } QSGRenderNode::StateFlags DSoftRectangleNode::changedStates() const { return {}; } void DSoftRectangleNode::render(const RenderState *state) { Q_ASSERT(m_window); QSGRendererInterface *rif = m_window->rendererInterface(); QPainter *p = static_cast(rif->getResource(m_window, QSGRendererInterface::PainterResource)); Q_ASSERT(p); const QRegion *clipRegion = state->clipRegion(); if (clipRegion && !clipRegion->isEmpty()) p->setClipRegion(*clipRegion, Qt::ReplaceClip); p->setTransform(matrix()->toTransform()); p->setOpacity(inheritedOpacity()); QPainterPath rectPath; p->setPen(Qt::NoPen); rectPath.addRect(0, 0, m_item->width() - 1, m_item->height() - 1); bool bottomLeft = m_coners.testFlag(DQuickRectangle::BottomLeftCorner); bool topLeft = m_coners.testFlag(DQuickRectangle::TopLeftCorner); bool bottomRight = m_coners.testFlag(DQuickRectangle::BottomRightCorner); bool topRight = m_coners.testFlag(DQuickRectangle::TopRightCorner); p->setRenderHint(QPainter::Antialiasing, m_item->antialiasing()); QPainterPath path; qreal radius = std::min({m_item->width() / 2.0, m_item->height() / 2.0, m_radius}); if (topLeft) { path.moveTo(0, 0); path.arcTo(0, 0, radius * 2, radius * 2, 90, 90); path.lineTo(0, 0); } if (topRight) { path.moveTo(m_item->width(), 0); QRectF rect1(m_item->width() - radius * 2, 0, radius * 2, radius * 2); path.arcTo(rect1, 0, 90); path.lineTo(m_item->width(), 0); } if (bottomLeft) { path.moveTo(0, m_item->height()); QRectF rect2(0, m_item->height() - radius * 2, radius * 2, radius * 2); path.arcTo(rect2, 180, 90); path.lineTo(0, m_item->height()); } if (bottomRight) { path.moveTo(m_item->width(), m_item->height()); QRectF f2(m_item->width() - radius * 2, m_item->height() - radius * 2, radius * 2, radius * 2); path.arcTo(f2, 270, 90); path.lineTo(m_item->width(), m_item->height()); } rectPath = rectPath - path; p->fillPath(rectPath, m_color); } QSGRenderNode::RenderingFlags DSoftRectangleNode::flags() const { return BoundedRectRendering; } QRectF DSoftRectangleNode::rect() const { return QRectF(0, 0, m_item->width(), m_item->height()); } void DSoftRectangleNode::setRadius(qreal radius) { if (qFuzzyCompare(radius, m_radius)) return; m_radius = radius; markDirty(DirtyMaterial); } void DSoftRectangleNode::setColor(const QColor &color) { if (color == m_color) return; m_color = color; markDirty(DirtyMaterial); } void DSoftRectangleNode::setCorners(DQuickRectangle::Corners corners) { if (corners == m_coners) return; m_coners = corners; markDirty(DirtyMaterial); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/drectanglenode_p.h000066400000000000000000000102311476226662700225220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DRECTANGLENODE_P_H #define DRECTANGLENODE_P_H #include "dquickrectangle_p.h" #include #include #include #include #include #include #include #include DQUICK_BEGIN_NAMESPACE #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) class CornerColorShader : public QSGOpaqueTextureMaterialShader { public: const char *vertexShader() const override; const char *fragmentShader() const override; char const *const *attributeNames() const override; void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override; void initialize() override; private: int m_idQtOpacity = -1; }; #else class CornerColorShader : public QSGOpaqueTextureMaterialRhiShader { public: #if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) CornerColorShader(int viewCount); #else CornerColorShader(); #endif bool updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial); }; #endif class CornerColorMaterial : public QSGOpaqueTextureMaterial { public: CornerColorMaterial(); void setRadius(qreal radius) { m_radius = radius; } QColor color() const { return m_color; } void setColor(const QColor &color) { m_color = color; } QSGMaterialType *type() const override; #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QSGMaterialShader *createShader() const override; #else QSGMaterialShader *createShader(QSGRendererInterface::RenderMode renderMode) const override; #endif int compare(const QSGMaterial *other) const override; private: qreal m_radius; QColor m_color; }; struct ColoredCornerPoint2D { float m_x; float m_y; float m_tx; float m_ty; unsigned char r, g, b, a; void set(float x, float y, float tx, float ty, uchar nr, uchar ng, uchar nb, uchar na) { m_x = x; m_y = y; m_tx = tx; m_ty = ty; r = nr; g = ng; b = nb; a = na; } }; class DRectangleNode : public QSGRectangleNode { public: DRectangleNode(); void setRect(const QRectF &) override; QRectF rect() const override { return m_rect; } void setRadius(qreal radius); void setColor(const QColor &color) override; QColor color() const override { return m_color; } void setMakTexture(QSGTexture *texture); void setCorners(DQuickRectangle::Corners); void update(); protected: void updateGeometry(); private: const QSGGeometry::AttributeSet &ColoredCornerAttributes() { static QSGGeometry::Attribute data[] = { QSGGeometry::Attribute::create(0, 2, GL_FLOAT, true), QSGGeometry::Attribute::create(1, 2, GL_FLOAT), QSGGeometry::Attribute::create(2, 4, GL_UNSIGNED_BYTE) }; static QSGGeometry::AttributeSet attributes = { 3, sizeof(ColoredCornerPoint2D), data }; return attributes; } private: QSGVertexColorMaterial m_material; QSGGeometry m_geometry; CornerColorMaterial m_cornerMaterial; QSGGeometry m_cornerGeometry { ColoredCornerAttributes(), 0 }; QSGGeometryNode m_cornerNode; QRectF m_rect; bool m_geometryChanged = false; DQuickRectangle::Corners m_coners = DQuickRectangle::NoneCorner; qreal m_radius = 0; QColor m_color = QColor::Invalid; QSGTexture *m_maskTexture = nullptr; }; class DSoftRectangleNode : public QSGRenderNode { public: DSoftRectangleNode(QQuickItem *owner); StateFlags changedStates() const override; void render(const RenderState *state) override; RenderingFlags flags() const override; QRectF rect() const override; void setRadius(qreal radius); void setColor(const QColor &color); void setCorners(DQuickRectangle::Corners); private: QQuickItem *m_item = nullptr; qreal m_radius = 0; QColor m_color = QColor::Invalid; DQuickRectangle::Corners m_coners = DQuickRectangle::NoneCorner; QQuickWindow *m_window = nullptr; }; DQUICK_END_NAMESPACE #endif // DRECTANGLENODE_P_H dtkdeclarative-5.7.12/src/private/dsettingscontainer.cpp000066400000000000000000000556751476226662700235140ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dsettingscontainer_p.h" #include #include #include "private/qquickpositioners_p.h" #include #include "dconfigwrapper_p.h" DCORE_USE_NAMESPACE; DQUICK_BEGIN_NAMESPACE static constexpr char const *settingsOptionObjectName = "_d_settings_option"; static constexpr char const *settingsGroupObjectName = "_d_settings_group"; // get group by key, e.g: // qml: SettingsGroup { key: group1; children: [SettingsGroup { key: group2 } ] } // key: 'group1.group2' static SettingsGroup *groupByKey(const QList groups, const QString &key) { for (auto group : qAsConst(groups)) { if (key == group->key()) { return group; } if (key.startsWith(group->key())) { const auto & childGroup = *static_cast*>( group->children().data); if (auto res = groupByKey(childGroup, key.mid(group->key().size() + 1))) { return res; } } } return nullptr; } SettingsContainer::SettingsContainer(QObject *parent) : QObject(parent) , m_navigationModel(new SettingsNavigationModel(this)) , m_contentModel(new SettingsContentModel(this)) { } SettingsContainer::~SettingsContainer() { qDeleteAll(m_groups); m_groups.clear(); m_navigationModel->deleteLater(); m_navigationModel = nullptr; m_contentModel->deleteLater(); m_contentModel = nullptr; } QQmlListProperty SettingsContainer::groups() { #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) return QQmlListProperty(this, &m_groups); #else return QQmlListProperty(this, m_groups); #endif } SettingsContentModel *SettingsContainer::contentModel() const { return m_contentModel; } SettingsNavigationModel *SettingsContainer::navigationModel() const { return m_navigationModel; } QQmlComponent *SettingsContainer::contentTitle() const { return m_contentTitle; } QQmlComponent *SettingsContainer::navigationTitle() const { return m_navigationTitle; } void SettingsContainer::setNavigationTitle(QQmlComponent *delegate) { m_navigationTitle = delegate; } void SettingsContainer::setContentTitle(QQmlComponent *delegate) { m_contentTitle = delegate; } void SettingsContainer::componentComplete() { for (auto group : m_groups) { group->setLevel(0); group->setParentGroup(nullptr); if (m_config) { group->setConfig(m_config); } } m_contentModel->updateModel(); m_navigationModel->updateModel(); for (auto group : groupList()) { connect(group, &SettingsGroup::visibleChanged, this, &SettingsContainer::onGroupVisibleChanged); } } void SettingsContainer::classBegin() { } QVector SettingsContainer::groupList() const { QVector list; QStack stack; for (auto group : qAsConst(m_groups)) { stack.push_back(group); while (!stack.isEmpty()) { auto group = stack.pop(); auto children = *static_cast*>(group->children().data); // keep order when it's declaration. std::reverse(children.begin(), children.end()); for (auto childGroup : qAsConst(children)) { stack.push(childGroup); } list.push_back(group); } } return list; } QQmlContext *SettingsContainer::creationContext() { return qmlContext(this); } QQmlComponent *SettingsContainer::contentBackground() const { return m_contentBackground; } void SettingsContainer::setGroupVisible(const QString &key, bool visible) { if (auto group = groupByKey(m_groups, key)) { SettingsGroup *parentGroup = group->parentGroup(); while (parentGroup) { if (!parentGroup->visible()) { return; } parentGroup = parentGroup->parentGroup(); } group->setVisible(visible); } } bool SettingsContainer::groupVisible(const QString &key) const { if (auto group = groupByKey(m_groups, key)) { return group->visible(); } return false; } void SettingsContainer::resetSettings() { for (auto group : qAsConst(m_groups)) { QList gs; gs.append(group); while (!gs.isEmpty()) { auto g = gs.takeFirst(); // Push child groups into the list. auto childrenGroups = *static_cast*>(g->children().data); gs.append(childrenGroups); // Reset all child options. auto childrenOptions = *static_cast*>(g->options().data); for (auto opt : childrenOptions) { opt->resetValue(); } } } } void SettingsContainer::setContentBackground(QQmlComponent *contentBackground) { if (m_contentBackground == contentBackground) return; m_contentBackground = contentBackground; Q_EMIT contentBackgroundChanged(); } void SettingsContainer::onGroupVisibleChanged(bool visible) { if (auto group = qobject_cast(sender())) { if (visible) { m_contentModel->insert(group); m_navigationModel->insert(group); } else { m_contentModel->remove(group); m_navigationModel->remove(group); } } } DConfigWrapper *SettingsContainer::config() const { return m_config; } void SettingsContainer::setConfig(DConfigWrapper *config) { if (m_config == config) return; m_config = config; Q_EMIT configChanged(); } SettingsOption::SettingsOption(QObject *parent) : QObject(parent) { } SettingsOption::~SettingsOption() { } QString SettingsOption::key() const { return m_key; } QString SettingsOption::name() const { return m_name; } QVariant SettingsOption::value() { if (!m_valueInitialized) { if (m_config->isValid()) { m_value = m_config->value(m_key); m_valueInitialized = true; } } return m_value; } QQmlComponent *SettingsOption::delegate() const { return m_delegate; } // QMetaObject::indexOfProperty would be createProperty automatically if not existing; static int indexOfProperty(const QObject * obj, const QString &name) { const auto mo = obj->metaObject(); for (int i = 0; i < mo->propertyCount(); ++i) { if (mo->property(i).name() == name) return i; } return -1; } void SettingsOption::setConfig(DConfigWrapper *config) { m_config = config; int propertyIndex = indexOfProperty(m_config, m_key); if (propertyIndex < 0) { connect(m_config, &DConfigWrapper::valueChanged, this, [this](const QString &key){ if (key == m_key) { setValue(m_config->value(key), false); m_valueInitialized = true; } }); } else { // valueChanged is not emitted when the key of Config defined in qml const auto mo = m_config->metaObject(); if (mo->property(propertyIndex).hasNotifySignal()) { static const int propertyChangedIndex = metaObject()->indexOfSlot("onConfigValueChanged()"); QMetaObject::connect(m_config, mo->property(propertyIndex).notifySignalIndex(), this, propertyChangedIndex); } } } SettingsOption *SettingsOption::qmlAttachedProperties(QObject *object) { auto item = qobject_cast(object); while (item) { auto option = item->property(settingsOptionObjectName); if (!option.isNull()) return option.value(); item = item->parentItem(); } return nullptr; } void SettingsOption::onConfigValueChanged() { setValue(m_config->value(m_key), false); m_valueInitialized = true; } void SettingsOption::setValue(QVariant value) { setValue(value, true); } void SettingsOption::setValue(const QVariant &value, bool updateConfig) { if (value == m_value) return; m_value = value; if (updateConfig && m_config) m_config->setValue(m_key, value); Q_EMIT valueChanged(value); } void SettingsOption::resetValue() { m_config->resetValue(m_key); } void SettingsOption::setKey(QString key) { if (m_key == key) return; m_key = key; Q_EMIT keyChanged(m_key); } void SettingsOption::setName(QString name) { if (m_name == name) return; m_name = name; Q_EMIT nameChanged(m_name); } void SettingsOption::setDelegate(QQmlComponent *delegate) { if (m_delegate == delegate) return; m_delegate = delegate; Q_EMIT delegateChanged(); } SettingsGroup::SettingsGroup(QObject *parent) : QObject(parent) { } SettingsGroup::~SettingsGroup() { qDeleteAll(m_options); m_options.clear(); qDeleteAll(m_children); m_children.clear(); } QQmlListProperty SettingsGroup::options() { #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) return QQmlListProperty(this, &m_options); #else return QQmlListProperty(this, m_options); #endif } QQmlListProperty SettingsGroup::children() { #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) return QQmlListProperty(this, &m_children); #else return QQmlListProperty(this, m_children); #endif } QQmlComponent *SettingsGroup::background() const { return m_background; } void SettingsGroup::setBackground(QQmlComponent *background) { if (m_background == background) return; m_background = background; Q_EMIT backgroundChanged(); } void SettingsGroup::setConfig(DConfigWrapper *config) { for (auto childGroup : qAsConst(m_children)) { childGroup->setConfig(config); } for (auto option : qAsConst(m_options)) { option->setConfig(config); } } SettingsGroup *SettingsGroup::parentGroup() const { return m_parentGroup; } void SettingsGroup::setParentGroup(SettingsGroup *parentGroup) { m_parentGroup = parentGroup; for (auto group : m_children) { group->setParentGroup(this); } } int SettingsGroup::index() const { return m_index; } void SettingsGroup::setIndex(const int index) { if (m_index == index) return; m_index = index; Q_EMIT indexChanged(m_index); } SettingsGroup *SettingsGroup::qmlAttachedProperties(QObject *object) { auto item = qobject_cast(object); while (item) { auto group = item->property(settingsGroupObjectName); if (!group.isNull()) return group.value(); item = item->parentItem(); } return nullptr; } QString SettingsGroup::key() const { return m_key; } QString SettingsGroup::name() const { return m_name; } bool SettingsGroup::visible() const { return m_visible; } void SettingsGroup::setVisible(bool visible) { if (m_visible == visible) return; m_visible = visible; Q_EMIT visibleChanged(visible); for (auto item : m_children) { item->setVisible(visible); } } int SettingsGroup::level() const { return m_level; } void SettingsGroup::setKey(const QString &key) { if (m_key == key) return; m_key = key; Q_EMIT keyChanged(m_key); } void SettingsGroup::setName(QString name) { if (m_name == name) return; m_name = name; Q_EMIT nameChanged(m_name); } void SettingsGroup::setLevel(int level) { m_level = level; for (auto childGroup : m_children) { childGroup->setLevel(m_level + 1); } } class SettingsCompositor { public: using OriginIndex = int; using CurrentIndex = int; ~SettingsCompositor() {} CurrentIndex itemIndex(QObject *item) const { const OriginIndex groupIndex = groupItems.indexOf(item); if (groupIndex != -1) { return currentGroups.indexOf(groups[groupIndex]); } return -1; } inline QObject *object(SettingsGroup *group) const { return groupItems[originIndex(group)]; } inline QObject *object(CurrentIndex index) const { return groupItems[originIndex(index)]; } inline const QVector &objects() const { return currentGroups; } inline void setObject(CurrentIndex index, QObject *obj) { groupItems[originIndex(index)] = obj; } int reset(const QVector &now) { currentGroups.clear(); groups = now; groupItems.resize(groups.count()); for (int i = 0; i < groupItems.count(); i++) groupItems[i] = nullptr; for (auto group : qAsConst(groups)) { if (group->visible()) { currentGroups.push_back(group); } } return currentGroups.count(); } CurrentIndex insert(SettingsGroup *group) { const OriginIndex index = originIndex(group); for (int i = 0; i < currentGroups.count(); ++i) { // find insert position by origin order. if (index < originIndex(currentGroups[i])) { currentGroups.insert(i, group); return i; } } return -1; } CurrentIndex remove(SettingsGroup *group) { const CurrentIndex index = currentGroups.indexOf(group); if (index != -1) { currentGroups.remove(index); } return index; } private: inline OriginIndex originIndex(CurrentIndex index) const { return originIndex(currentGroups[index]); } inline OriginIndex originIndex(SettingsGroup *group) const { return groups.indexOf(group); } // origin data QVector groups; // QuickItem for each origin data QVector groupItems; // display data QVector currentGroups; }; class SettingsInstanceModelPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(SettingsInstanceModel) public: explicit SettingsInstanceModelPrivate(SettingsContainer *container) : container(container) { } virtual ~SettingsInstanceModelPrivate() override; const QVector &groups() const { return compositor.objects(); } void insert(SettingsGroup *group) { const int index = compositor.insert(group); if (index != -1) { if (auto item = qobject_cast(compositor.object(group))) { item->setVisible(true); } updateIndexes(index); QQmlChangeSet changeSet; changeSet.insert(index, 1); Q_Q(SettingsInstanceModel); Q_EMIT q->modelUpdated(changeSet, false); Q_EMIT q->countChanged(); } } void reset() { const int count = compositor.reset(container->groupList()); if (count > 0) { updateIndexes(0); QQmlChangeSet changeSet; changeSet.insert(0, count); Q_Q(SettingsInstanceModel); Q_EMIT q->modelUpdated(changeSet, true); Q_EMIT q->countChanged(); } } void remove(SettingsGroup *group) { const int index = compositor.remove(group); if (index != -1) { if (auto item = qobject_cast(compositor.object(group))) { item->setVisible(false); } updateIndexes(index); Q_Q(SettingsInstanceModel); QQmlChangeSet changeSet; changeSet.remove(index, 1); Q_EMIT q->modelUpdated(changeSet, false); Q_EMIT q->countChanged(); } } void updateIndexes(const int startIndex) { const auto &groups = compositor.objects(); for (int i = startIndex; i < groups.count(); i++) { groups.at(i)->setIndex(i); } } SettingsContainer *container; SettingsCompositor compositor; }; SettingsInstanceModelPrivate::~SettingsInstanceModelPrivate() {} SettingsInstanceModel::SettingsInstanceModel(SettingsContainer *container) : QQmlInstanceModel(*(new SettingsInstanceModelPrivate(container)), container) { } int SettingsInstanceModel::count() const { Q_D(const SettingsInstanceModel); return d->groups().count(); } #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) QVariant SettingsInstanceModel::variantValue(int index, const QString &name) { Q_D(SettingsInstanceModel); const auto &groups = d->groups(); if (index < 0 || index >= groups.count()) return QString(); return QQmlEngine::contextForObject(groups.at(index))->contextProperty(name); } QQmlInstanceModel::ReleaseFlags SettingsInstanceModel::release(QObject *object, ReusableFlag reusableFlag) { Q_UNUSED(reusableFlag); Q_D(const SettingsInstanceModel); if (d->compositor.itemIndex(object) >= 0) { return QQmlInstanceModel::Referenced; } return ReleaseFlags(); } #else QString SettingsInstanceModel::stringValue(int index, const QString &name) { Q_D(SettingsInstanceModel); const auto &groups = d->groups(); if (index < 0 || index >= groups.count()) return QString(); return QQmlEngine::contextForObject(groups.at(index))->contextProperty(name).toString(); } QQmlInstanceModel::ReleaseFlags SettingsInstanceModel::release(QObject *object) { Q_D(const SettingsInstanceModel); if (d->compositor.itemIndex(object) >= 0) { return QQmlInstanceModel::Referenced; } return nullptr; } #endif void SettingsInstanceModel::setWatchedRoles(const QList &roles) { Q_UNUSED(roles); } QQmlIncubator::Status SettingsInstanceModel::incubationStatus(int index) { Q_D(SettingsInstanceModel); if (d->compositor.object(index)) { return QQmlIncubator::Ready; } return QQmlIncubator::Loading; } int SettingsInstanceModel::indexOf(QObject *object, QObject *objectContext) const { Q_UNUSED(objectContext) Q_D(const SettingsInstanceModel); return d->compositor.itemIndex(object); } void SettingsInstanceModel::updateModel() { Q_D(SettingsInstanceModel); d->reset(); } void SettingsInstanceModel::insert(SettingsGroup *group) { Q_D(SettingsInstanceModel); d->insert(group); } void SettingsInstanceModel::remove(SettingsGroup *group) { Q_D(SettingsInstanceModel); d->remove(group); } SettingsContentModel::SettingsContentModel(SettingsContainer *container) : SettingsInstanceModel (container) { } bool SettingsContentModel::isValid() const { Q_D(const SettingsInstanceModel); return d->container->contentTitle() != nullptr; } QObject *SettingsContentModel::object(int index, QQmlIncubator::IncubationMode incubationMode) { Q_UNUSED(incubationMode) Q_D(SettingsInstanceModel); if (auto obj = d->compositor.object(index)) { return obj; } SettingsGroup *group = d->groups()[index]; auto groupContext = d->container->creationContext(); QQmlComponent groupCom(d->container->contentTitle()->creationContext()->engine()); groupCom.setData(groupComponentData(), QUrl()); auto groupItem = qobject_cast(groupCom.beginCreate(groupContext)); d->compositor.setObject(index, groupItem); Q_EMIT initItem(index, groupItem); groupCom.completeCreate(); auto titleItem = qobject_cast(d->container->contentTitle()->beginCreate(groupContext)); titleItem->setParentItem(groupItem); titleItem->setProperty(settingsGroupObjectName, QVariant::fromValue(group)); d->container->contentTitle()->completeCreate(); const auto options = static_cast*>(group->options().data); if (options->count() > 0) { QQmlComponent columnCom(groupContext->engine()); columnCom.setData(optionsLayoutComponentData(), QUrl()); QQuickItem *columnItem = qobject_cast(columnCom.beginCreate(groupContext)); columnItem->setParentItem(groupItem); for (auto option: qAsConst(*options)) { if (!option->delegate()) continue; auto optionContext = option->delegate()->creationContext(); auto optionItem = option->delegate()->beginCreate(optionContext); QQuickItem *item = qobject_cast(optionItem); item->setProperty(settingsOptionObjectName, QVariant::fromValue(option)); item->setParentItem(columnItem); option->delegate()->completeCreate(); } columnCom.completeCreate(); if (auto backgroundCom = contentBackgroundByGroup(group)) { auto backgroundItem = qobject_cast(backgroundCom->beginCreate(groupContext)); backgroundItem->setProperty(settingsGroupObjectName, QVariant::fromValue(group)); backgroundItem->setParentItem(groupItem); columnItem->setParentItem(backgroundItem); backgroundCom->completeCreate(); } } Q_EMIT createdItem(index, groupItem); return groupItem; } QQmlComponent *SettingsContentModel::contentBackgroundByGroup(const SettingsGroup *group) { Q_D(SettingsInstanceModel); const SettingsGroup *parent = group; while(parent) { if (parent->background()) { return parent->background(); } parent = parent->parentGroup(); } return d->container->contentBackground(); } const QByteArray SettingsContentModel::groupComponentData() { const QByteArray comData("import QtQuick 2.11\n" "Column {\n" " anchors {\n" " left: parent.left\n" " right: parent.right\n" " }\n" "}\n"); return comData; } const QByteArray SettingsContentModel::optionsLayoutComponentData() { const QByteArray comData("import QtQuick 2.11\n" "Column {\n" " padding: 10\n" " spacing: 10\n" " width: parent.width\n" "}\n"); return comData; } SettingsNavigationModel::SettingsNavigationModel(SettingsContainer *container) : SettingsInstanceModel (container) { } bool SettingsNavigationModel::isValid() const { Q_D(const SettingsInstanceModel); return d->container->navigationTitle() != nullptr; } QObject *SettingsNavigationModel::object(int index, QQmlIncubator::IncubationMode incubationMode) { Q_UNUSED(incubationMode) Q_D(SettingsInstanceModel); if (auto obj = d->compositor.object(index)) { return obj; } SettingsGroup *group = d->groups()[index]; auto titleDelegate = d->container->navigationTitle(); auto titleItem = qobject_cast(titleDelegate->beginCreate(titleDelegate->creationContext())); titleItem->setProperty(settingsGroupObjectName, QVariant::fromValue(group)); d->compositor.setObject(index, titleItem); Q_EMIT initItem(index, titleItem); titleDelegate->completeCreate(); Q_EMIT createdItem(index, titleItem); return titleItem; } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dsettingscontainer_p.h000066400000000000000000000211741476226662700234630ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DSETTINGSCONTAINER_P_H #define DSETTINGSCONTAINER_P_H #include #include #include #include #include "dconfigwrapper_p.h" DQUICK_BEGIN_NAMESPACE class SettingsOption : public QObject { Q_OBJECT Q_PROPERTY(QString key READ key WRITE setKey NOTIFY keyChanged) Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QVariant value READ value WRITE setValue RESET resetValue NOTIFY valueChanged) Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged) Q_CLASSINFO("DefaultProperty", "delegate") #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(SettingsOption) #endif public: explicit SettingsOption(QObject *parent = nullptr); virtual ~SettingsOption() override; QString key() const; void setKey(QString key); QString name() const; void setName(QString name); QVariant value() ; void setValue(QVariant value); void resetValue(); QQmlComponent *delegate() const; void setDelegate(QQmlComponent *delegate); void setConfig(DConfigWrapper *config); static SettingsOption *qmlAttachedProperties(QObject *object); Q_SIGNALS: void keyChanged(QString key); void nameChanged(QString name); void valueChanged(QVariant value); void delegateChanged(); private Q_SLOTS: void onConfigValueChanged(); private: void setValue(const QVariant &value, bool updateConfig); QString m_key; QString m_name; QVariant m_value; bool m_valueInitialized = false; QQmlComponent *m_delegate = nullptr; DConfigWrapper *m_config = nullptr; }; class SettingsGroup : public QObject { Q_OBJECT Q_PROPERTY(QString key READ key WRITE setKey NOTIFY keyChanged) Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(int level READ level CONSTANT) Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged) Q_PROPERTY(int index READ index NOTIFY indexChanged) Q_PROPERTY(QQmlListProperty options READ options NOTIFY optionsChanged) Q_PROPERTY(QQmlListProperty children READ children NOTIFY childrenChanged) Q_PROPERTY(QQmlComponent *background READ background WRITE setBackground NOTIFY backgroundChanged) Q_CLASSINFO("DefaultProperty", "options") #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(SettingsGroup) QML_ATTACHED(SettingsGroup) #endif public: explicit SettingsGroup(QObject * parent = nullptr); virtual ~SettingsGroup() override; QString key() const; void setKey(const QString &key); QString name() const; void setName(QString name); int level() const; void setLevel(int level); bool visible() const; void setVisible(bool visible); QQmlListProperty options(); QQmlListProperty children(); QQmlComponent *background() const; void setBackground(QQmlComponent *background); void setConfig(DConfigWrapper *config); SettingsGroup *parentGroup() const; void setParentGroup(SettingsGroup *parentGroup); int index() const; void setIndex(const int index); static SettingsGroup *qmlAttachedProperties(QObject *object); Q_SIGNALS: void keyChanged(QString key); void nameChanged(QString name); void visibleChanged(bool visible); void optionsChanged(); void childrenChanged(); void backgroundChanged(); void indexChanged(int index); private: QString m_key; QString m_name; int m_level = -1; bool m_visible = true; int m_index; QList m_options; QList m_children; QQmlComponent * m_background = nullptr; SettingsGroup* m_parentGroup = nullptr; }; class SettingsContainer; class SettingsInstanceModelPrivate; class SettingsInstanceModel : public QQmlInstanceModel { Q_OBJECT public: explicit SettingsInstanceModel(SettingsContainer *container); public: virtual int count() const override; #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) virtual QVariant variantValue(int index, const QString &name) override; virtual ReleaseFlags release(QObject *object, ReusableFlag reusableFlag = NotReusable) override; #else virtual QString stringValue(int index, const QString &name) override; virtual ReleaseFlags release(QObject *object) override; #endif virtual void setWatchedRoles(const QList &roles) override; virtual QQmlIncubator::Status incubationStatus(int index) override; virtual int indexOf(QObject *object, QObject *objectContext) const override; void updateModel(); public: void insert(SettingsGroup *group); void remove(SettingsGroup *group); protected: Q_DECLARE_PRIVATE(SettingsInstanceModel) }; class SettingsContentModel : public SettingsInstanceModel { Q_OBJECT public: explicit SettingsContentModel(SettingsContainer *container = nullptr); public: bool isValid() const override; virtual QObject *object(int index, QQmlIncubator::IncubationMode incubationMode) override; private: QQmlComponent *contentBackgroundByGroup(const SettingsGroup *group); static const QByteArray groupComponentData(); static const QByteArray optionsLayoutComponentData(); }; class SettingsNavigationModel : public SettingsInstanceModel { Q_OBJECT public: SettingsNavigationModel(SettingsContainer *container = nullptr); public: virtual bool isValid() const override; virtual QObject *object(int index, QQmlIncubator::IncubationMode incubationMode) override; }; class SettingsContentModel; class SettingsModelAttached; class SettingsContainer : public QObject, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(DConfigWrapper *config READ config WRITE setConfig NOTIFY configChanged) Q_PROPERTY(QQmlListProperty groups READ groups NOTIFY groupsChanged) Q_PROPERTY(SettingsContentModel *contentModel READ contentModel NOTIFY contentModelChanged) Q_PROPERTY(QQmlComponent *contentTitle READ contentTitle WRITE setContentTitle NOTIFY contentTitleChanged) Q_PROPERTY(QQmlComponent *contentBackground READ contentBackground WRITE setContentBackground NOTIFY contentBackgroundChanged) Q_PROPERTY(SettingsNavigationModel *navigationModel READ navigationModel NOTIFY navigationModelChanged) Q_PROPERTY(QQmlComponent *navigationTitle READ navigationTitle WRITE setNavigationTitle NOTIFY navigationTitleChanged) Q_CLASSINFO("DefaultProperty", "groups") #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(SettingsContainer) #endif public: explicit SettingsContainer(QObject *parent = nullptr); virtual ~SettingsContainer() override; DConfigWrapper *config() const; void setConfig(DConfigWrapper *config); QQmlListProperty groups(); SettingsContentModel *contentModel() const; SettingsNavigationModel *navigationModel() const; QQmlComponent *contentTitle() const; void setContentTitle(QQmlComponent *delegate); QQmlComponent *navigationTitle() const; void setNavigationTitle(QQmlComponent *delegate); void setContentBackground(QQmlComponent * contentBackground); QQmlComponent *contentBackground() const; QVector groupList() const; QQmlContext *creationContext(); virtual void classBegin() override; virtual void componentComplete() override; public Q_SLOTS: void setGroupVisible(const QString &key, bool visible); bool groupVisible(const QString &key) const; void resetSettings(); private Q_SLOTS: void onGroupVisibleChanged(bool visible); Q_SIGNALS: void groupsChanged(); void navigationTitleChanged(); void contentTitleChanged(); void contentModelChanged(); void navigationModelChanged(); void configChanged(); void contentBackgroundChanged(); private: QList m_groups; SettingsNavigationModel *m_navigationModel = nullptr; SettingsContentModel *m_contentModel = nullptr; QQmlComponent *m_contentTitle = nullptr; QQmlComponent *m_navigationTitle = nullptr; QQmlComponent * m_contentBackground = nullptr; DConfigWrapper *m_config = nullptr; }; DQUICK_END_NAMESPACE QML_DECLARE_TYPEINFO(DTK_QUICK_NAMESPACE::SettingsOption, QML_HAS_ATTACHED_PROPERTIES) QML_DECLARE_TYPEINFO(DTK_QUICK_NAMESPACE::SettingsGroup, QML_HAS_ATTACHED_PROPERTIES) #endif // DSETTINGSCONTAINER_P_H dtkdeclarative-5.7.12/src/private/dshadownode_p.cpp000066400000000000000000000272661476226662700224160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dshadownode_p.h" #include DQUICK_USE_NAMESPACE DQUICK_BEGIN_NAMESPACE #if QT_VERSION <= QT_VERSION_CHECK(6, 0, 0) class ShadowMaterialShader : public QSGMaterialShader { const char *vertexShader() const override; const char *fragmentShader() const override; void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *) override; char const *const *attributeNames() const override; private: void initialize() override; #if QT_CONFIG(opengl) int m_matrix_id; int m_opacity_id; #endif }; const char *ShadowMaterialShader::vertexShader() const { return "uniform highp mat4 qt_Matrix; \n" "attribute highp vec4 qt_VertexPosition; \n" "attribute highp vec2 qt_VertexTexCoord; \n" "varying highp vec2 qt_TexCoord; \n" "void main() { \n" " qt_TexCoord = qt_VertexTexCoord; \n" " gl_Position = qt_Matrix * qt_VertexPosition; \n" "}"; } const char *ShadowMaterialShader::fragmentShader() const { return "uniform highp float qt_Opacity; \n" "uniform mediump float relativeSizeX; \n" "uniform mediump float relativeSizeY; \n" "uniform mediump float spread; \n" "uniform lowp vec4 color; \n" "varying highp vec2 qt_TexCoord; \n" "highp float linearstep(highp float e0, highp float e1, highp float x) { \n" " return clamp((x - e0) / (e1 - e0), 0.0, 1.0); \n" "} \n" "void main() { \n" " lowp float alpha = \n" " smoothstep(0.0, relativeSizeX, 0.5 - abs(0.5 - qt_TexCoord.x)) * \n" " smoothstep(0.0, relativeSizeY, 0.5 - abs(0.5 - qt_TexCoord.y)); \n" "highp float spreadMultiplier = linearstep(spread, 1.0 - spread, alpha); \n" " gl_FragColor = color * qt_Opacity * spreadMultiplier * spreadMultiplier; \n" "}"; } void ShadowMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *) { ShadowMaterial *newSurface = static_cast(newEffect); #if QT_CONFIG(opengl) program()->setUniformValue("color", newSurface->color()); program()->setUniformValue("relativeSizeX", (GLfloat)newSurface->relativeSizeX()); program()->setUniformValue("relativeSizeY", (GLfloat)newSurface->relativeSizeY()); program()->setUniformValue("spread", (GLfloat)newSurface->spread()); if (state.isOpacityDirty()) program()->setUniformValue(m_opacity_id, state.opacity()); if (state.isMatrixDirty()) program()->setUniformValue(m_matrix_id, state.combinedMatrix()); #else Q_UNUSED(state) Q_UNUSET(newSuface) #endif } const char * const *ShadowMaterialShader::attributeNames() const { static const char *attributes[] = { "qt_VertexPosition", "qt_VertexTexCoord", nullptr }; return attributes; } void ShadowMaterialShader::initialize() { #if QT_CONFIG(opengl) m_matrix_id = program()->uniformLocation("qt_Matrix"); m_opacity_id = program()->uniformLocation("qt_Opacity"); #endif } #else // Mapping shader's ubuf of shadowmaterial // NOTE: The byte alignment in`glsl` and `cpp` are different. enum Ubuf { QtMatrixSize = 64, QtOpacitySize = 4, ColorSize = 16, RelativeSizeXSize = 4, RelativeSizeYSize = 4, SpreadSize = 4, QtMatrixOffset = 0, QtOpacityOffset = QtMatrixOffset + QtMatrixSize, RelativeSizeXOffset = QtOpacityOffset + QtOpacitySize, RelativeSizeYOffset = RelativeSizeXOffset + RelativeSizeXSize, SpreadOffset = RelativeSizeYOffset + RelativeSizeYSize, ColorOffset = SpreadOffset + SpreadSize, TotalSize = ColorOffset + ColorSize }; static inline QColor qsg_premultiply_color(const QColor &c) { return QColor::fromRgbF(c.redF() * c.alphaF(), c.greenF() * c.alphaF(), c.blueF() * c.alphaF(), c.alphaF()); } class ShadowMaterialShader : public QSGMaterialShader { public: ShadowMaterialShader() { setShaderFileName(QSGMaterialShader::VertexStage, QStringLiteral(":/dtk/declarative/shaders_ng/shadowmaterial.vert.qsb")); setShaderFileName(QSGMaterialShader::FragmentStage, QStringLiteral(":/dtk/declarative/shaders_ng/shadowmaterial.frag.qsb")); } public: bool updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) { bool changed = false; QByteArray *buf = state.uniformData(); Q_ASSERT(buf->size() >= TotalSize); if (state.isMatrixDirty()) { const QMatrix4x4 m = state.combinedMatrix(); memcpy(buf->data() + QtMatrixOffset, m.constData(), QtMatrixSize); changed = true; } if (state.isOpacityDirty()) { const float opacity = state.opacity(); memcpy(buf->data() + QtOpacityOffset, &opacity, QtOpacitySize); changed = true; } ShadowMaterial *customMaterial = static_cast(newMaterial); if (oldMaterial != newMaterial) { const QColor color = qsg_premultiply_color(customMaterial->color()); QVector4D c(color.redF(), color.greenF(), color.blueF(), color.alphaF()); const float relativeSizeX = customMaterial->relativeSizeX(); const float relativeSizeY = customMaterial->relativeSizeY(); const float spread = customMaterial->spread(); memcpy(buf->data() + ColorOffset, &c, ColorSize); memcpy(buf->data() + RelativeSizeXOffset, &relativeSizeX, RelativeSizeXSize); memcpy(buf->data() + RelativeSizeYOffset, &relativeSizeY, RelativeSizeYSize); memcpy(buf->data() + SpreadOffset, &spread, SpreadSize); changed = true; } return changed; } }; #endif ShadowMaterial::ShadowMaterial() { setFlag(Blending, true); } QSGMaterialType *ShadowMaterial::type() const { static QSGMaterialType type; return &type; } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QSGMaterialShader *ShadowMaterial::createShader() const { return new ShadowMaterialShader; } #else QSGMaterialShader *ShadowMaterial::createShader(QSGRendererInterface::RenderMode renderMode) const { Q_UNUSED(renderMode) return new ShadowMaterialShader; } #endif int ShadowMaterial::compare(const QSGMaterial *) const { return 0; } ShadowNode::ShadowNode() { setMaterial(&m_material); setGeometry(&m_geometry); m_geometry.setDrawingMode(QSGGeometry::DrawTriangles); } void ShadowNode::setRect(const QRectF &r) { if (r == m_rect) return; m_geometryChanged = true; m_rect = r; } void ShadowNode::setColor(const QColor &color) { if (color == m_material.color()) return; m_material.setColor(color); markDirty(DirtyMaterial); } void ShadowNode::setGlowRadius(qreal radius) { if (qFuzzyCompare(m_glowRadius, radius)) return; m_geometryChanged = true; m_glowRadius = radius; } void ShadowNode::setRelativeSizeX(qreal x) { if (qFuzzyCompare(x, m_material.relativeSizeX())) return; m_material.setRelativeSizeX(x); markDirty(DirtyMaterial); } void ShadowNode::setRelativeSizeY(qreal y) { if (qFuzzyCompare(y, m_material.relativeSizeY())) return; m_material.setRelativeSizeY(y); markDirty(DirtyMaterial); } void ShadowNode::setSpread(qreal spread) { if (qFuzzyCompare(spread, m_material.spread())) return; m_material.setSpread(spread); markDirty(DirtyMaterial); } void ShadowNode::setFill(bool isFill) { if (m_fill == isFill) return; m_geometryChanged |= true; m_fill = isFill; } void ShadowNode::update() { if (m_geometryChanged) { updateGeometry(); markDirty(QSGNode::DirtyGeometry); m_geometryChanged = false; } } void ShadowNode::updateGeometry() { qreal radius = std::min({ m_rect.width() / 2, m_rect.height() / 2, m_glowRadius }); const float innerL = m_rect.left(); const float innerR = m_rect.right(); const float innerT = m_rect.top(); const float innerB = m_rect.bottom(); const float xScale = radius / m_rect.width(); const float yScale = radius / m_rect.height(); m_geometry.setDrawingMode(m_fill ? QSGGeometry::DrawTriangleStrip : QSGGeometry::DrawTriangles); m_geometry.allocate(m_fill ? 4 : 24); ShadowVertex *vertices = static_cast(m_geometry.vertexData()); if (m_fill) { vertices[0].set(innerL, innerT, 0, 0); vertices[1].set(innerL, innerB, 0, 1); vertices[2].set(innerR, innerT, 1, 0); vertices[3].set(innerR, innerB, 1, 1); return; } // top // (0)************************(2)(4) // * * // * * // * * // (1)(5)************************(3) vertices[0].set(innerL, innerT, 0, 0); vertices[1].set(innerL , innerT + radius, 0, yScale); vertices[2].set(innerR, innerT, 1, 0); vertices[3].set(innerR, innerT + radius, 1, yScale); vertices[4].set(innerR, innerT, 1, 0); vertices[5].set(innerL , innerT + radius, 0, yScale); // right // (6)* * * * *(8)(10) // * * // * * // * * // * * // * * // * * // * * // (7)(11)* * * * *(9) vertices[6].set(innerR - radius, innerT + radius, 1 - xScale, yScale); vertices[7].set(innerR - radius, innerB - radius, 1 - xScale, 1 - yScale); vertices[8].set(innerR, innerT + radius, 1, yScale); vertices[9].set(innerR, innerB - radius, 1, 1 - yScale); vertices[10].set(innerR, innerT + radius, 1, yScale); vertices[11].set(innerR - radius, innerB - radius, 1 - xScale, 1 - yScale); // bottom // (12)************************(14)(16) // * * // * * // * * // (13)(17)************************(15) vertices[12].set(innerL, innerB - radius, 0, 1 - yScale); vertices[13].set(innerL, innerB, 0, 1); vertices[14].set(innerR, innerB - radius, 1, 1 - yScale); vertices[15].set(innerR, innerB, 1, 1); vertices[16].set(innerR, innerB - radius, 1, 1 - yScale); vertices[17].set(innerL, innerB, 0, 1); // left // (18)* * * * *(20)(22) // * * // * * // * * // * * // * * // * * // * * // (19)(23)* * * * *(21) vertices[18].set(innerL, innerT + radius, 0, yScale); vertices[19].set(innerL, innerB - radius, 0, 1 - yScale); vertices[20].set(innerL + radius, innerT + radius, xScale, yScale); vertices[21].set(innerL + radius, innerB - radius, xScale, 1 - yScale); vertices[22].set(innerL + radius, innerT + radius, xScale, yScale); vertices[23].set(innerL, innerB - radius, 0, 1 - yScale); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dshadownode_p.h000066400000000000000000000051711476226662700220520ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DSHADOWNODE_P_H #define DSHADOWNODE_P_H #include #include #include #include DQUICK_BEGIN_NAMESPACE class ShadowMaterial : public QSGVertexColorMaterial { public: ShadowMaterial(); QColor color() const { return m_color; } void setColor(const QColor &color) { m_color = color; } qreal relativeSizeX() const { return m_relativeSizeX; } void setRelativeSizeX(qreal x) { m_relativeSizeX = x; } qreal relativeSizeY() const { return m_relativeSizeY; } void setRelativeSizeY(qreal y) { m_relativeSizeY = y; } qreal spread() const { return m_spread; } void setSpread(qreal spread) { m_spread = spread; } QSGMaterialType *type() const override; #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QSGMaterialShader *createShader() const override; #else QSGMaterialShader *createShader(QSGRendererInterface::RenderMode renderMode) const override; #endif int compare(const QSGMaterial *) const override; private: QColor m_color; qreal m_relativeSizeX; qreal m_relativeSizeY; qreal m_spread; }; struct ShadowVertex { float m_x; float m_y; float m_tx; float m_ty; void set(float x, float y, float tx, float ty) { m_x = x; m_y = y; m_tx = tx; m_ty = ty; } }; class ShadowNode : public QSGVisitableNode { public: ShadowNode(); void setRect(const QRectF &); void setColor(const QColor &color); void setGlowRadius(qreal radius); void setRelativeSizeX(qreal x); void setRelativeSizeY(qreal y); void setSpread(qreal spread); void setFill(bool); void update(); void updateGeometry(); bool geometryIsDirty() const { return m_geometryChanged; } void accept(QSGNodeVisitorEx *visitor) override { if (visitor->visit(this)) visitor->visitChildren(this); visitor->endVisit(this); } private: static const QSGGeometry::AttributeSet &shadowAttributes() { static QSGGeometry::Attribute data[] = { QSGGeometry::Attribute::create(0, 2, GL_FLOAT, true), QSGGeometry::Attribute::create(1, 2, GL_FLOAT) }; static QSGGeometry::AttributeSet attributes = { 2, sizeof(ShadowVertex), data }; return attributes; } private: ShadowMaterial m_material; QSGGeometry m_geometry { shadowAttributes(), 0 }; QRectF m_rect; bool m_geometryChanged = true; qreal m_glowRadius; bool m_fill; }; DQUICK_END_NAMESPACE #endif // DSHADOWNODE_P_H dtkdeclarative-5.7.12/src/private/dsoftwareeffectrendernode.cpp000066400000000000000000000110431476226662700250030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dsoftwareeffectrendernode.h" #include #include #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) #include #else #include #endif #include #include #include DQUICK_BEGIN_NAMESPACE static inline bool _d_isSoftwarePixmapTexture(const QSGTexture *texture) { #if defined(QT_NAMESPACE) #define NAMESPACE_STR1(NAME) #NAME"::QSGSoftwarePixmapTexture" #define NAMESPACE_STR(R) NAMESPACE_STR1(R) #define PixmapTextureClassName NAMESPACE_STR(QT_NAMESPACE) #else #define PixmapTextureClassName "QSGSoftwarePixmapTexture" #endif return texture->inherits(PixmapTextureClassName); } QImage _d_textureConvertToImage(const QSGTexture *texture) { if (texture) { if (auto plainTexture = qobject_cast(texture)) return const_cast(plainTexture)->image(); if (auto layer = qobject_cast(texture)) return layer->toImage(); if (_d_isSoftwarePixmapTexture(texture)) { auto pixmapTexture = static_cast(texture); return pixmapTexture->pixmap().toImage(); } } static QImage nullImage; return nullImage; } DSoftwareEffectRenderNode::DSoftwareEffectRenderNode(QSGTextureProvider *sourceProvider) : m_sourceProvider(sourceProvider) { setFlag(QSGNode::UsePreprocess, true); m_sourceImage = updateCachedImage(m_sourceProvider); if (m_sourceProvider) { connect(m_sourceProvider, &QSGTextureProvider::textureChanged , this, &DSoftwareEffectRenderNode::onRenderTextureChanged, Qt::DirectConnection); } } void DSoftwareEffectRenderNode::preprocess() { if (m_sourceProvider && updateTexture(m_sourceProvider->texture())) markChanged(); } void DSoftwareEffectRenderNode::sync(QQuickItem *item) { m_window = item->window(); bool antialiasing = item->antialiasing(); bool smooth = item->smooth(); bool changed = false; if (m_antialiasing != antialiasing) { m_antialiasing = antialiasing; changed = true; } if (m_smooth != smooth) { m_smooth = smooth; changed = true; } if (changed) m_changed = true; } void DSoftwareEffectRenderNode::render(const QSGRenderNode::RenderState *state) { if (Q_UNLIKELY(!m_window)) return; QSGRendererInterface *rif = m_window->rendererInterface(); QPainter *p = static_cast(rif->getResource(m_window, QSGRendererInterface::PainterResource)); Q_ASSERT(p); const QRegion *clipRegion = state->clipRegion(); if (Q_UNLIKELY(clipRegion && !clipRegion->isEmpty())) p->setClipRegion(*clipRegion, Qt::ReplaceClip); p->setTransform(matrix()->toTransform()); p->setOpacity(inheritedOpacity()); p->setRenderHint(QPainter::Antialiasing, m_antialiasing); p->setRenderHint(QPainter::SmoothPixmapTransform, m_smooth); if (m_cached && !m_changed) return renderImpl(p); m_renderDevice = process(m_sourceImage, p->renderHints()); m_changed = false; renderImpl(p); } void DSoftwareEffectRenderNode::setCached(bool cached) { if (m_cached == cached) return; m_cached = cached; markDirty(QSGNode::DirtyMaterial); } bool DSoftwareEffectRenderNode::cached() const { return m_cached; } void DSoftwareEffectRenderNode::markChanged() { m_changed = true; markDirty(QSGNode::DirtyMaterial); } void DSoftwareEffectRenderNode::onRenderTextureChanged() { auto provider = qobject_cast(sender()); if (provider != m_sourceProvider) return; QImage sourceImage = updateCachedImage(m_sourceProvider); if (sourceImage != m_sourceImage) { m_sourceImage = sourceImage; markChanged(); } } QImage DSoftwareEffectRenderNode::updateCachedImage(QSGTextureProvider *provider) { return _d_textureConvertToImage(provider ? provider->texture() : nullptr); } bool DSoftwareEffectRenderNode::updateTexture(QSGTexture *texture) { bool dirty = false; QSGLayer *t = qobject_cast(texture); if (t) { t->setMirrorVertical(false); dirty = t->updateTexture(); } return dirty; } void DSoftwareEffectRenderNode::renderImpl(QPainter *p) { p->drawImage(rect(), m_renderDevice, m_renderDevice.rect()); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dsoftwareeffectrendernode.h000066400000000000000000000032211476226662700244470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DSOFTWARERENDERNODE_H #define DSOFTWARERENDERNODE_H #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QQuickWindow; class QQuickItem; //class QSGTextureProvider; class QSGTexture; QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class DSoftwareEffectRenderNode : public QObject, public QSGRenderNode { Q_OBJECT public: explicit DSoftwareEffectRenderNode(QSGTextureProvider *sourceProvider); RenderingFlags flags() const override { return BoundedRectRendering; } void preprocess() override; StateFlags changedStates() const override { return {}; } virtual QImage process(const QImage &sourceImage, QPainter::RenderHints hints) = 0; virtual void sync(QQuickItem *item); void render(const RenderState *state) override final; void setCached(bool cached); bool cached() const; void markChanged(); protected Q_SLOTS: void onRenderTextureChanged(); protected: QImage updateCachedImage(QSGTextureProvider *provider); bool updateTexture(QSGTexture *texture); private: void renderImpl(QPainter *p); private: QPointer m_sourceProvider; QImage m_sourceImage; QImage m_renderDevice; QQuickItem *m_item = nullptr; QQuickWindow *m_window = nullptr; bool m_cached = false; bool m_changed = true; bool m_antialiasing = false; bool m_smooth = false; }; DQUICK_END_NAMESPACE #endif // DSOFTWARERENDERNODE_H dtkdeclarative-5.7.12/src/private/dsoftwareroundedimagenode.cpp000066400000000000000000000076001476226662700250160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dsoftwareroundedimagenode_p.h" #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) #include #else #include #endif #include #include DQUICK_BEGIN_NAMESPACE // defined in dsoftwareeffectrendernode.cpp QImage _d_textureConvertToImage(const QSGTexture *texture); DSoftwareRoundedImageNode::DSoftwareRoundedImageNode(QQuickItem *owner) : item(owner) { } void DSoftwareRoundedImageNode::setTexture(QSGTexture *texture) { m_texture = texture; markDirty(DirtyMaterial); } void DSoftwareRoundedImageNode::setRadius(qreal radius) { if (qFuzzyCompare(radius, this->radius)) return; this->radius = radius; clipPath = QPainterPath(); if (radius > 0) { clipPath.addRoundedRect(targetRect, radius, radius); } markDirty(DirtyMaterial); } void DSoftwareRoundedImageNode::setSmooth(bool smooth) { if (this->smooth == smooth) return; this->smooth = smooth; markDirty(DirtyMaterial); } void DSoftwareRoundedImageNode::setSourceRect(const QRectF &source) { if (this->sourceRect == source) return; this->sourceRect = source; markDirty(DirtyMaterial); } void DSoftwareRoundedImageNode::setRect(const QRectF &target) { if (this->targetRect == target) return; this->targetRect = target; if (radius > 0) { clipPath = QPainterPath(); clipPath.addRoundedRect(targetRect, radius, radius); } markDirty(DirtyMaterial); } void DSoftwareRoundedImageNode::setCompositionMode(QPainter::CompositionMode mode) { if (m_compositionMode == mode) return; m_compositionMode = mode; markDirty(DirtyForceUpdate); } void DSoftwareRoundedImageNode::render(const RenderState *state) { if (!sourceRect.isValid()) return; QSGRendererInterface *rif = item->window()->rendererInterface(); Q_ASSERT(rif->graphicsApi() == QSGRendererInterface::Software); QPainter *p = static_cast(rif->getResource(item->window(), QSGRendererInterface::PainterResource)); Q_ASSERT(p); const QRegion *clipRegion = state->clipRegion(); if (clipRegion && !clipRegion->isEmpty()) p->setClipRegion(*clipRegion, Qt::ReplaceClip); // must be done before setTransform p->setTransform(matrix()->toTransform()); p->setOpacity(inheritedOpacity()); p->setRenderHint(QPainter::Antialiasing, smooth); if (Q_LIKELY(!clipPath.isEmpty())) { p->setClipPath(clipPath, Qt::IntersectClip); } updateCachedImage(); p->drawImage(targetRect, cachedImage, convertToTextureNormalizedSourceRect()); } void DSoftwareRoundedImageNode::releaseResources() { static QImage globalNullImage; cachedImage = globalNullImage; } QSGRenderNode::RenderingFlags DSoftwareRoundedImageNode::flags() const { RenderingFlags rf = BoundedRectRendering; if (Q_UNLIKELY(qIsNull(radius)) && !cachedImage.hasAlphaChannel()) rf |= OpaqueRendering; return rf; } QRectF DSoftwareRoundedImageNode::rect() const { return targetRect; } void DSoftwareRoundedImageNode::updateCachedImage() { Q_ASSERT(m_texture); auto image = _d_textureConvertToImage(m_texture); if (!image.isNull()) { cachedImage = image; } else { DSoftwareRoundedImageNode::releaseResources(); } } QRectF DSoftwareRoundedImageNode::convertToTextureNormalizedSourceRect() const { if (!m_texture->isAtlasTexture()) return sourceRect; const QRectF r = m_texture->normalizedTextureSubRect(); if (r.topLeft().isNull()) return sourceRect; const QSize s = m_texture->textureSize(); return sourceRect.translated(r.x() * s.width(), r.y() * s.height()); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/private/dsoftwareroundedimagenode_p.h000066400000000000000000000027461476226662700250100ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DSOFTWAREROUNDEDIMAGENODE_P_H #define DSOFTWAREROUNDEDIMAGENODE_P_H #include #include #include #include #include QT_BEGIN_NAMESPACE class QQuickItem; class QSGTexture; QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class Q_DECL_EXPORT DSoftwareRoundedImageNode : public QSGRenderNode { public: DSoftwareRoundedImageNode(QQuickItem *owner); void setTexture(QSGTexture *texture); inline QSGTexture *texture() const { return m_texture;} void setRadius(qreal radius); void setSmooth(bool smooth); void setSourceRect(const QRectF &source); void setRect(const QRectF &target); void setCompositionMode(QPainter::CompositionMode mode); void render(const RenderState *state) override; void releaseResources() override; RenderingFlags flags() const override; QRectF rect() const override; private: void updateCachedImage(); QRectF convertToTextureNormalizedSourceRect() const; qreal radius = 0; bool smooth = false; QRectF sourceRect; QRectF targetRect; QPainterPath clipPath; QPainter::CompositionMode m_compositionMode = QPainter::CompositionMode_SourceOver; QSGTexture *m_texture = nullptr; QQuickItem *item = nullptr; QImage cachedImage; }; DQUICK_END_NAMESPACE #endif // DSOFTWAREROUNDEDIMAGENODE_P_H dtkdeclarative-5.7.12/src/qml/000077500000000000000000000000001476226662700161765ustar00rootroot00000000000000dtkdeclarative-5.7.12/src/qml/AboutAction.qml000066400000000000000000000010101476226662700211110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 Action { id: control text: qsTr("About") property Component aboutDialog property QtObject __object onTriggered: { if (aboutDialog) { if (!__object) { __object = aboutDialog.createObject(parent) } __object.show() } } Component.onDestruction: __object && __object.destroy() } dtkdeclarative-5.7.12/src/qml/AboutDialog.qml000066400000000000000000000112751476226662700211110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import QtQuick.Window 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS DialogWindow { id: control width: DS.Style.aboutDialog.width height: DS.Style.aboutDialog.height property alias windowTitle: control.title property alias productName: productNameLabel.text property alias productIcon: logoLabel.icon.name property alias version: versionLabel.text property alias description: descriptionLabel.text property alias license: licenseLabel.text property alias companyLogo: companyLogoLabel.source property string websiteName property string websiteLink readonly property string __websiteLinkTemplate: "%2" RowLayout { id: contentView width: parent.width implicitHeight: contentLayout.implicitHeight ColumnLayout { id: contentLayout spacing: 0 Layout.preferredWidth: Math.max(control.width / 5 * 2, DS.Style.aboutDialog.leftAreaWidth) Layout.bottomMargin: DS.Style.aboutDialog.bottomPadding D.IconLabel { id: logoLabel Layout.preferredHeight: DS.Style.aboutDialog.productIconHeight Layout.preferredWidth: Layout.preferredHeight Layout.alignment: Qt.AlignHCenter Layout.topMargin: 0 display: D.IconLabel.IconOnly icon.mode: control.D.ColorSelector.controlState icon.theme: control.D.ColorSelector.controlTheme icon.palette: D.DTK.makeIconPalette(control.palette) } Label { id: productNameLabel font: D.DTK.fontManager.t5 Layout.alignment: Qt.AlignCenter Layout.topMargin: 8 } Image { id: companyLogoLabel Layout.alignment: Qt.AlignCenter Layout.topMargin: 30 } Label { id: licenseLabel font: D.DTK.fontManager.t10 Layout.preferredWidth: parent.width Layout.alignment: Qt.AlignCenter Layout.topMargin: 3 Layout.leftMargin: 30 wrapMode: Text.WordWrap elide: Text.ElideRight visible: license !== "" } } ColumnLayout { Layout.alignment: Qt.AlignLeft | Qt.AlignTop spacing: 10 Layout.fillWidth: true Layout.fillHeight: true Layout.rightMargin: 20 ColumnLayout { spacing: 1 Label { font: D.DTK.fontManager.t10 text: qsTr("Version") } Label { id: versionLabel font: D.DTK.fontManager.t8 wrapMode: Text.WordWrap text: Qt.application.version Layout.fillWidth: true } } ColumnLayout { spacing: 1 Label { font: D.DTK.fontManager.t10 text: qsTr("Homepage") } Label { id: websiteLabel font: D.DTK.fontManager.t8 text: (control.websiteLink === "" || control.websiteName === "") ? "" : control.__websiteLinkTemplate.arg(websiteLink).arg(control.websiteName) wrapMode: Text.WordWrap Layout.fillWidth: true } } ColumnLayout { spacing: 1 Label { font: D.DTK.fontManager.t10 text: qsTr("Description") } Label { id: descriptionLabel Layout.fillWidth: true font: D.DTK.fontManager.t8 wrapMode: Text.WordWrap elide: Text.ElideRight } } } Component.onCompleted: { websiteLabel.linkActivated.connect(D.ApplicationHelper.openUrl) descriptionLabel.linkActivated.connect(D.ApplicationHelper.openUrl) licenseLabel.linkActivated.connect(D.ApplicationHelper.openUrl) } focus: true Keys.onEscapePressed: { control.close() event.accepted = true } } } dtkdeclarative-5.7.12/src/qml/AbstractButton.qml000066400000000000000000000002531476226662700216500ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 AbstractButton { } dtkdeclarative-5.7.12/src/qml/Action.qml000066400000000000000000000002431476226662700201250ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 Action { } dtkdeclarative-5.7.12/src/qml/ActionButton.qml000066400000000000000000000017721476226662700213310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.Button { id: control property D.Palette textColor: DS.Style.button.text palette.windowText: pressed ? D.ColorSelector.textColor : undefined opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) icon { width: DS.Style.button.iconSize height: DS.Style.button.iconSize } contentItem: D.DciIcon { palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: control.icon.name sourceSize: Qt.size(control.icon.width, control.icon.height) } background: null } dtkdeclarative-5.7.12/src/qml/ActionGroup.qml000066400000000000000000000002501476226662700211400ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 ActionGroup { } dtkdeclarative-5.7.12/src/qml/AlertToolTip.qml000066400000000000000000000054611476226662700213010ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS ToolTip { id: control property Item target x: 0 topPadding: DS.Style.alertToolTip.verticalPadding bottomPadding: DS.Style.alertToolTip.verticalPadding leftPadding: DS.Style.alertToolTip.horizontalPadding rightPadding: DS.Style.alertToolTip.horizontalPadding implicitWidth: Math.min(DS.Style.control.implicitWidth(control), target.width) implicitHeight: DS.Style.control.implicitHeight(control) margins: 0 closePolicy: Popup.NoAutoClose background: Item { BoxShadow { anchors.fill: _background shadowBlur: 20 shadowOffsetY: 6 shadowColor: Qt.rgba(0, 0, 0, 0.2) cornerRadius: _background.radius } Rectangle { property D.Palette backgroundColor: DS.Style.alertToolTip.background property D.Palette borderColor: DS.Style.control.border id: _background anchors.fill: parent color: D.ColorSelector.backgroundColor border.color: D.ColorSelector.borderColor radius: DS.Style.control.radius } } contentItem: Text { property D.Palette textColor: DS.Style.alertToolTip.text horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter text: control.text font: control.font color: D.ColorSelector.textColor wrapMode: Text.Wrap } enter: Transition { NumberAnimation { properties: "opacity"; from: 0.0; to: 1.0; duration: 200 } NumberAnimation { properties: "y"; from: control.target.height; to: control.target.height + DS.Style.control.spacing; duration: 200 } } exit: Transition { NumberAnimation { properties: "opacity"; from: 1.0; to: 0.0 } NumberAnimation { properties: "y"; from: control.target.height + DS.Style.control.spacing ; to: control.target.height } } BoxShadow { property D.Palette dropShadowColor: DS.Style.alertToolTip.connecterdropShadow property D.Palette backgroundColor: DS.Style.alertToolTip.connecterBackground y: - height * (0.75) - control.topMargin - control.topPadding width: DS.Style.alertToolTip.connectorWidth height: DS.Style.alertToolTip.connectorHeight shadowBlur: 4 shadowOffsetY: 2 shadowColor: D.ColorSelector.dropShadowColor cornerRadius: _background.radius Rectangle { anchors.fill: parent color: parent.D.ColorSelector.backgroundColor border.color: _background.D.ColorSelector.borderColor border.width: 1 } } } dtkdeclarative-5.7.12/src/qml/ApplicationWindow.qml000066400000000000000000000005421476226662700223450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D T.ApplicationWindow { palette: active ? D.DTK.palette : D.DTK.inactivePalette font: D.DTK.fontManager.t6 color: palette.window } dtkdeclarative-5.7.12/src/qml/ArrowListView.qml000066400000000000000000000041771476226662700215030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.style 1.0 as DS import "private" FocusScope { id: control property int maxVisibleItems : DS.Style.arrowListView.maxVisibleItems property int itemHeight: DS.Style.arrowListView.itemHeight property alias view: itemsView implicitWidth: Math.max(DS.Style.arrowListView.width, contentLayout.implicitWidth) implicitHeight: contentLayout.implicitHeight ColumnLayout { id: contentLayout anchors.fill: parent ArrowListViewButton { visible: itemsView.interactive Layout.alignment: Qt.AlignHCenter Layout.preferredWidth: width Layout.preferredHeight: height view: itemsView direction: ArrowListViewButton.UpButton } ListView { id: itemsView Layout.fillWidth: true Layout.fillHeight: true implicitHeight: Math.min(contentHeight, maxVisibleItems * itemHeight) clip: true implicitWidth:{ var maxWidth = DS.Style.arrowListView.width if (!itemsView.model || !itemsView.model.hasOwnProperty("get")) return maxWidth for (var i = 0; i < itemsView.count; ++i) { var item = itemsView.model.get(i) if (item && item.implicitWidth > maxWidth) maxWidth = item.implicitWidth } return maxWidth } interactive: Window.window ? (contentHeight > Window.window.height || model.count > maxVisibleItems) : false ScrollIndicator.vertical: ScrollIndicator { } } ArrowListViewButton { visible: itemsView.interactive Layout.alignment: Qt.AlignHCenter Layout.preferredWidth: width Layout.preferredHeight: height view: itemsView direction: ArrowListViewButton.DownButton } } } dtkdeclarative-5.7.12/src/qml/ArrowShapePopup.qml000066400000000000000000000107141476226662700220130ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Shapes 1.11 import QtGraphicalEffects 1.0 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Popup { id: control property alias roundedRadius: path.roundedRadius property alias arrowWidth: path.arrowWidth property alias arrowHeight: path.arrowHeight property alias arrowDirection: path.arrowDirection property real arrowX: 0 property real arrowY: 0 implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) leftPadding: arrowDirection === D.DTK.LeftArrow ? arrowHeight : 0 topPadding: arrowDirection === D.DTK.UpArrow ? arrowHeight : 0 rightPadding: arrowDirection === D.DTK.RightArrow ? arrowHeight : 0 bottomPadding: arrowDirection === D.DTK.DownArrow ? arrowHeight : 0 D.ArrowBoxPath { id: path width: control.width height: control.height roundedRadius: DS.Style.arrowRectangleBlur.roundJoinRadius } background: Item { implicitWidth: maskPath.implicitWidth implicitHeight: maskPath.implicitHeight D.ArrowBoxPath { id: outsideBorderPath arrowX: path.arrowX arrowY: path.arrowY arrowWidth: path.arrowWidth arrowHeight: path.arrowHeight arrowDirection: path.arrowDirection width: path.width height: path.height roundedRadius: path.roundedRadius spread: DS.Style.arrowRectangleBlur.borderWidth / 2 } D.ArrowBoxPath { id: insideBorderPath arrowX: path.arrowX arrowY: path.arrowY arrowWidth: path.arrowWidth arrowHeight: path.arrowHeight arrowDirection: path.arrowDirection width: path.width height: path.height roundedRadius: path.roundedRadius spread: -DS.Style.arrowRectangleBlur.borderWidth / 2 } D.InWindowBlur { id: blur anchors.fill: parent offscreen: true } DropShadow { id: __shadow anchors.fill: parent verticalOffset: 6 radius: 12 samples: 17 source: mask color: DS.Style.selectColor(palette.window, DS.Style.arrowRectangleBlur.shadowColor, DS.Style.arrowRectangleBlur.darkShadowColor) } Shape { id: maskPath anchors.fill: parent visible: false layer { enabled: true samples: 8 } ShapePath { fillColor: "red" strokeColor: "transparent" pathElements: path } } D.OpacityMask { id: mask anchors.fill: parent maskSource: maskPath source: blur } Item { layer { enabled: true samples: 8 } anchors { fill: parent margins: -DS.Style.arrowRectangleBlur.borderWidth } Shape { anchors.centerIn: parent width: maskPath.width height: maskPath.height ShapePath { fillColor: DS.Style.selectColor(palette.window, DS.Style.arrowRectangleBlur.backgroundColor, DS.Style.arrowRectangleBlur.darkBackgroundColor) strokeColor: DS.Style.selectColor(palette.window, DS.Style.arrowRectangleBlur.outBorderColor, DS.Style.arrowRectangleBlur.darkOutBorderColor) strokeWidth: DS.Style.arrowRectangleBlur.borderWidth pathElements: outsideBorderPath } ShapePath { fillColor: "transparent" strokeColor: DS.Style.selectColor(palette.window, DS.Style.arrowRectangleBlur.inBorderColor, DS.Style.arrowRectangleBlur.darkInBorderColor) strokeWidth: DS.Style.arrowRectangleBlur.borderWidth pathElements: insideBorderPath } } } } } dtkdeclarative-5.7.12/src/qml/ArrowShapePopupWindow.qml000066400000000000000000000015721476226662700232050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Window { id: __window property alias roundJoinRadius: arrowShape.roundJoinRadius property alias arrowWidth: arrowShape.arrowWidth property alias arrowHeight: arrowShape.arrowHeight property alias arrowX: arrowShape.arrowX property alias arrowY: arrowShape.arrowY property alias arrowDirection: arrowShape.arrowDirection flags: Qt.Popup D.DWindow.enabled: true D.DWindow.clipPath: loader.item D.DWindow.enableBlurWindow: true D.DWindow.alphaBufferSize: D.DTK.hasBlurWindow ? 8 : 0 ArrowShapeContainer { id: arrowShape anchors.fill: parent color: "transparent" } } dtkdeclarative-5.7.12/src/qml/BoxInsetShadow.qml000066400000000000000000000036351476226662700216210ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk.impl 1.0 as D Item { id: root property real cornerRadius: 0 property variant topLeftRadius property variant topRightRadius property variant bottomLeftRadius property variant bottomRightRadius property real shadowBlur: 10 property real shadowOffsetX: 0 property real shadowOffsetY: 0 property color shadowColor: "black" property real spread: 0 readonly property real __borderBase: cornerRadius + spread + shadowBlur / 2.0 readonly property real __minImageSize: Math.max(image.border.left + image.border.right, image.border.top + image.border.bottom) readonly property real __boxSize: Math.max(__minImageSize - shadowBlur, cornerRadius * 2 + 1) BorderImage { id: image anchors.fill: parent source: D.DTK.makeShadowImageUrl(__boxSize, shadowRadius(topLeftRadius), shadowRadius(topRightRadius), shadowRadius(bottomLeftRadius), shadowRadius(bottomRightRadius), shadowBlur, shadowColor, shadowOffsetX, shadowOffsetY, spread, false, true) function shadowRadius(radius) { return radius !== undefined ? radius : cornerRadius } function bound(min, val, max) { if (val <= min) return min; if (val >= max) return max; return val; } border { left: __borderBase + bound(0, shadowBlur + shadowOffsetX, width - 2 * __borderBase) right: __borderBase + bound(0, shadowBlur - shadowOffsetX, width - 2 * __borderBase) top: __borderBase + bound(0, shadowBlur + shadowOffsetY, height - 2 * __borderBase) bottom: __borderBase + bound(0, shadowBlur - shadowOffsetY, height - 2 * __borderBase) } } } dtkdeclarative-5.7.12/src/qml/BoxPanel.qml000066400000000000000000000074521476226662700204310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Item { id: control property int radius: DS.Style.control.radius property D.Palette color1: DS.Style.button.background1 property D.Palette color2: DS.Style.button.background2 property D.Palette insideBorderColor: DS.Style.button.insideBorder property D.Palette outsideBorderColor: DS.Style.button.outsideBorder property D.Palette dropShadowColor: DS.Style.button.dropShadow property D.Palette innerShadowColor1: DS.Style.button.innerShadow1 property D.Palette innerShadowColor2: DS.Style.button.innerShadow2 property int boxShadowBlur: 6 property int boxShadowOffsetY: 4 property int innerShadowOffsetY1: -1 // Background color changes with hover state if `backgroundFlowingHovered` is `true`. property bool backgroundFlowsHovered: true Loader { anchors.fill: backgroundRect active: control.D.ColorSelector.family === D.Palette.CommonColor sourceComponent: BoxShadow { shadowBlur: control.boxShadowBlur shadowOffsetY: control.boxShadowOffsetY shadowColor: control.D.ColorSelector.dropShadowColor cornerRadius: backgroundRect.radius } } Rectangle { id: backgroundRect property alias color1: control.color1 property alias color2: control.color2 D.ColorSelector.hovered: backgroundFlowsHovered ? undefined : false objectName: "background" Gradient { id: backgroundGradient // Use the backgroundRect's colorselecor can filter the hovered state. GradientStop { position: 0.0; color: backgroundRect.D.ColorSelector.color1} GradientStop { position: 1.0; color: backgroundRect.D.ColorSelector.color2} } anchors.fill: parent radius: control.radius gradient: D.ColorSelector.color1 === D.ColorSelector.color2 ? null : backgroundGradient color: D.ColorSelector.color1 } Loader { anchors.fill: backgroundRect readonly property color innerShadowColor: control.D.ColorSelector.innerShadowColor1 active: innerShadowColor1 && innerShadowColor.a !== 0 && control.D.ColorSelector.family === D.Palette.CommonColor z: D.DTK.AboveOrder sourceComponent: BoxInsetShadow { shadowBlur: 2 shadowOffsetY: control.innerShadowOffsetY1 spread: 1 shadowColor: innerShadowColor cornerRadius: backgroundRect.radius } } Loader { anchors.fill: backgroundRect readonly property color innerShadowColor: control.D.ColorSelector.innerShadowColor2 active: innerShadowColor2 && innerShadowColor.a !== 0 && control.D.ColorSelector.family === D.Palette.CommonColor z: D.DTK.AboveOrder sourceComponent: BoxInsetShadow { shadowBlur: 1 shadowOffsetY: 1 shadowColor: innerShadowColor cornerRadius: backgroundRect.radius } } Loader { active: insideBorderColor anchors.fill: backgroundRect z: D.DTK.AboveOrder sourceComponent: InsideBoxBorder { radius: backgroundRect.radius color: control.D.ColorSelector.insideBorderColor borderWidth: DS.Style.control.borderWidth } } Loader { active: outsideBorderColor anchors.fill: backgroundRect z: D.DTK.AboveOrder sourceComponent: OutsideBoxBorder { radius: backgroundRect.radius color: control.D.ColorSelector.outsideBorderColor borderWidth: DS.Style.control.borderWidth } } } dtkdeclarative-5.7.12/src/qml/BoxShadow.qml000066400000000000000000000042231476226662700206100ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk.impl 1.0 as D Item { id: root property real cornerRadius: 0 property variant topLeftRadius property variant topRightRadius property variant bottomLeftRadius property variant bottomRightRadius property real shadowBlur: 10 property real shadowOffsetX: 0 property real shadowOffsetY: 0 property color shadowColor: "black" property real spread: 0 property bool hollow: false readonly property real __offsetX: hollow ? shadowOffsetX : 0 readonly property real __offsetY: hollow ? shadowOffsetY : 0 readonly property real __spread: hollow ? spread : 0 readonly property real __borderBase: cornerRadius + spread + shadowBlur * 2 readonly property real __minImageSize: 2 * __borderBase readonly property real __boxSize: __minImageSize - 2 * shadowBlur - 2 * __spread + 1 BorderImage { id: image anchors { centerIn: parent horizontalCenterOffset: shadowOffsetX verticalCenterOffset: shadowOffsetY } width: parent.width + (shadowBlur + spread) * 2 height: parent.height + (shadowBlur + spread) * 2 source: D.DTK.makeShadowImageUrl(__boxSize, shadowRadius(topLeftRadius), shadowRadius(topRightRadius), shadowRadius(bottomLeftRadius), shadowRadius(bottomRightRadius), shadowBlur, shadowColor, __offsetX, __offsetY, __spread, hollow, false) function shadowRadius(radius) { return radius !== undefined ? radius : cornerRadius } function bound(min, val, max) { if (val <= min) return min; if (val >= max) return max; return val; } border { left: Math.min(width / 2, __borderBase - __offsetX) right: Math.min(width / 2, __borderBase + __offsetX) top: Math.min(height / 2, __borderBase - __offsetY) bottom: Math.min(height / 2, __borderBase + __offsetY) } } } dtkdeclarative-5.7.12/src/qml/BusyIndicator.qml000066400000000000000000000024551476226662700214760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.BusyIndicator { id: control property D.Palette fillColor: DS.Style.busyIndicator.fillColor implicitWidth: DS.Style.busyIndicator.size implicitHeight: implicitWidth padding: width / DS.Style.busyIndicator.paddingFactor contentItem: Item { implicitWidth: DS.Style.busyIndicator.size implicitHeight: implicitWidth Image { id: indicatorSource anchors.fill: parent source: DS.Style.busyIndicator.spinnerSource sourceSize { width: parent.width height: parent.height } visible: false } D.ColorOverlay { anchors.fill: indicatorSource source: indicatorSource color: control.D.ColorSelector.fillColor RotationAnimator on rotation { from: 0 to: 360 duration: DS.Style.busyIndicator.animationDuration running: control.running loops: Animation.Infinite } } } } dtkdeclarative-5.7.12/src/qml/Button.qml000066400000000000000000000045551476226662700201750ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.Button { id: control property D.Palette textColor: checked ? DS.Style.checkedButton.text : (highlighted ? DS.Style.highlightedButton.text : DS.Style.button.text) implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) topPadding: DS.Style.button.vPadding bottomPadding: DS.Style.button.vPadding leftPadding: DS.Style.button.hPadding rightPadding: DS.Style.button.hPadding spacing: DS.Style.control.spacing opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 D.DciIcon.mode: D.ColorSelector.controlState D.DciIcon.theme: D.ColorSelector.controlTheme D.DciIcon.palette: D.DTK.makeIconPalette(palette) palette.windowText: D.ColorSelector.textColor icon { width: DS.Style.button.iconSize height: DS.Style.button.iconSize color: D.ColorSelector.textColor } background: ButtonPanel { implicitWidth: DS.Style.button.width implicitHeight: DS.Style.button.height button: control } contentItem: Item { implicitWidth: content.implicitWidth + (indicator ? indicator.width : 0) implicitHeight: content.implicitHeight D.IconLabel { id: content height: parent.height width: parent.width - (indicator ? indicator.width : 0) spacing: control.spacing mirrored: control.mirrored display: control.display alignment: indicator ? Qt.AlignLeft | Qt.AlignVCenter : Qt.AlignCenter text: control.text font: control.font color: control.D.ColorSelector.textColor icon: D.DTK.makeIcon(control.icon, control.D.DciIcon) } function updateIndicatorAnchors() { if (!indicator) return indicator.anchors.verticalCenter = control.verticalCenter indicator.anchors.right = control.right } Component.onCompleted: { updateIndicatorAnchors() control.indicatorChanged.connect(updateIndicatorAnchors) } } } dtkdeclarative-5.7.12/src/qml/ButtonBox.qml000066400000000000000000000015521476226662700206400ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { id: control default property alias buttons: btnGroup.buttons property alias group: btnGroup D.ColorSelector.hovered: false padding: DS.Style.buttonBox.padding ButtonGroup { id: btnGroup } contentItem: RowLayout { spacing: DS.Style.buttonBox.spacing children: control.buttons } background: BoxPanel { implicitWidth: DS.Style.buttonBox.width implicitHeight: DS.Style.buttonBox.height backgroundFlowsHovered: D.ColorSelector.family === D.Palette.CrystalColor outsideBorderColor: null color2: color1 } } dtkdeclarative-5.7.12/src/qml/ButtonGroup.qml000066400000000000000000000002501476226662700211760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 ButtonGroup { } dtkdeclarative-5.7.12/src/qml/ButtonIndicator.qml000066400000000000000000000015621476226662700220250ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Rectangle { property D.Palette backgroundColor: DS.Style.buttonIndicator.background property Item control: D.ColorSelector.control implicitWidth: DS.Style.buttonIndicator.size implicitHeight: implicitHeight radius: width / 2 color: D.ColorSelector.backgroundColor D.DciIcon { anchors.centerIn: parent sourceSize { width: DS.Style.buttonIndicator.iconSize } name: "arrow_ordinary_down" palette: control.D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } } dtkdeclarative-5.7.12/src/qml/ButtonPanel.qml000066400000000000000000000063301476226662700211460ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS BoxPanel { id: control property Item button color1: selectValue(DS.Style.button.background1, DS.Style.checkedButton.background, DS.Style.highlightedButton.background1) color2: selectValue(DS.Style.button.background2, DS.Style.checkedButton.background, DS.Style.highlightedButton.background2) insideBorderColor: selectValue(DS.Style.button.insideBorder, null, DS.Style.highlightedButton.border) outsideBorderColor: selectValue(DS.Style.button.outsideBorder, null, null) dropShadowColor: selectValue(DS.Style.button.dropShadow, DS.Style.checkedButton.dropShadow, DS.Style.highlightedButton.dropShadow) innerShadowColor1: selectValue(DS.Style.button.innerShadow1, DS.Style.checkedButton.innerShadow, DS.Style.highlightedButton.innerShadow1) innerShadowColor2: selectValue(DS.Style.button.innerShadow2, null, DS.Style.highlightedButton.innerShadow2) boxShadowBlur: selectValue(control.D.ColorSelector.controlState === D.DTK.PressedState ? 4 : 6, 6, 4) boxShadowOffsetY: selectValue(control.D.ColorSelector.controlState === D.DTK.PressedState ? 2 : 4, 4, 4) innerShadowOffsetY1: selectValue(control.D.ColorSelector.controlState === D.DTK.HoveredState ? -3 : -1, -1, -1) visible: !button.flat || button.checked || button.highlighted || button.visualFocus || control.D.ColorSelector.controlState === D.DTK.PressedState || control.D.ColorSelector.controlState === D.DTK.HoveredState function selectValue(normal, checked, highlighted) { if (button.checked) { return checked } else if ((typeof button.highlighted == "boolean") && button.highlighted) { return highlighted } return normal } Loader { anchors.fill: parent active: button.visualFocus sourceComponent: FocusBoxBorder { radius: control.radius color: button.palette.highlight } } Gradient { id: hoverBackgroundGradient GradientStop { position: 0.0; color: control.D.ColorSelector.color1 } GradientStop { position: 0.96; color: control.D.ColorSelector.color2 } } CicleSpreadAnimation { id: hoverAnimation anchors.fill: parent visible: control.D.ColorSelector.controlState === D.DTK.HoveredState && control.D.ColorSelector.family === D.Palette.CommonColor Rectangle { anchors.fill: parent radius: control.radius gradient: control.D.ColorSelector.color1 === control.D.ColorSelector.color2 ? null : hoverBackgroundGradient color: control.D.ColorSelector.color1 } Component.onCompleted: { button.hoveredChanged.connect(function () { if (button.hovered) { var pos = D.DTK.cursorPosition() hoverAnimation.centerPoint = hoverAnimation.mapFromGlobal(pos.x, pos.y) hoverAnimation.start() } else { hoverAnimation.stop() } }) } } } dtkdeclarative-5.7.12/src/qml/CheckBox.qml000066400000000000000000000053631476226662700204060ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import QtQuick.Layouts 1.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.CheckBox { id: control implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset icon { width: DS.Style.checkBox.iconSize height: DS.Style.checkBox.iconSize } checkable: true font: D.DTK.fontManager.t8 padding: DS.Style.checkBox.padding spacing: DS.Style.control.spacing opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 D.DciIcon.mode: D.ColorSelector.controlState D.DciIcon.theme: D.ColorSelector.controlTheme indicator: Item { x: control.text ? (!control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2 y: control.topPadding + (control.availableHeight - height) / 2 implicitWidth: DS.Style.checkBox.indicatorWidth implicitHeight: DS.Style.checkBox.indicatorHeight D.DciIcon { anchors.centerIn: parent palette: control.D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: control.checkState === Qt.Checked ? "checkbox_checked" : control.checkState === Qt.Unchecked ? "checkbox_unchecked" : "checkbox_mix" sourceSize: Qt.size(control.icon.width, control.icon.height) fallbackToQIcon: false } Loader { active: control.activeFocus anchors.centerIn: parent sourceComponent: D.DciIcon { palette: control.D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: control.checkState === Qt.Checked ? "checkbox_focus_checked" : "checkbox_focus" sourceSize: Qt.size(control.icon.width, control.icon.height) fallbackToQIcon: false } } } contentItem: Text { leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0 rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0 text: control.text font: control.font elide: Text.ElideRight verticalAlignment: Text.AlignVCenter color: control.palette.windowText } background: null } dtkdeclarative-5.7.12/src/qml/CheckDelegate.qml000066400000000000000000000052461476226662700213700ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import QtQuick.Layouts 1.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.CheckDelegate { id: control property Component content property D.Palette backgroundColor: DS.Style.itemDelegate.checkBackgroundColor implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset padding: DS.Style.control.padding spacing: DS.Style.control.spacing icon { width: DS.Style.itemDelegate.iconSize height: DS.Style.itemDelegate.iconSize } checkable: true indicator: Loader { x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding y: control.topPadding + (control.availableHeight - height) / 2 active: control.checked sourceComponent: D.DciIcon { palette: control.D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: "menu_select" sourceSize: Qt.size(DS.Style.itemDelegate.checkIndicatorIconSize, DS.Style.itemDelegate.checkIndicatorIconSize) fallbackToQIcon: false } } contentItem: RowLayout { D.IconLabel { spacing: control.spacing mirrored: control.mirrored display: control.display alignment: control.display === D.IconLabel.IconOnly || control.display === D.IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft | Qt.AlignVCenter text: control.text font: control.font color: control.palette.windowText icon: D.DTK.makeIcon(control.icon, control.D.DciIcon) Layout.fillWidth: !control.content } Loader { active: control.content sourceComponent: control.content Layout.fillWidth: true } } background: Item { implicitWidth: DS.Style.itemDelegate.width implicitHeight: DS.Style.itemDelegate.height Rectangle { anchors.fill: parent visible: !checked color: control.D.ColorSelector.backgroundColor radius: DS.Style.control.radius } Rectangle { anchors.fill: parent visible: control.checked color: DS.Style.itemDelegate.checkedColor radius: DS.Style.control.radius } } } dtkdeclarative-5.7.12/src/qml/CicleSpreadAnimation.qml000066400000000000000000000043041476226662700227300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D Item { id: root // to select center point property point centerPoint: Qt.point(0, 0) layer { enabled: false effect: D.OpacityMask { maskSource: mask } } // to start animation function start() { if (D.DTK.isSoftwareRender) return mask.active = true layer.enabled = true mask.item.__increase() } // to stop animation function stop() { layer.enabled = false mask.active = false mask.__scalePos = 0 } Loader { id: mask anchors.fill: parent visible: false property real __scalePos: 0 Behavior on __scalePos { SmoothedAnimation { velocity: 300 } } sourceComponent: Rectangle { id: impl height: width radius: width / 2 scale: __scalePos / 50 function __increase() { var curRadius = __minBoundingCicleRadius() impl.width = curRadius * 2 impl.x = centerPoint.x - curRadius impl.y = centerPoint.y - curRadius mask.__scalePos = 50 } function __minBoundingCicleRadius() { // 区域内任意一点到四个定点距离的最大值,即为以此点为中心包含此区域的最小圆的半径 var r1 = Math.sqrt(Math.pow(centerPoint.x, 2) + Math.pow(centerPoint.y, 2)) var r2 = Math.sqrt(Math.pow(centerPoint.x, 2) + Math.pow( root.height - centerPoint.y, 2)) var r3 = Math.sqrt(Math.pow(centerPoint.y, 2) + Math.pow( root.width - centerPoint.x, 2)) var r4 = Math.sqrt(Math.pow(root.width - centerPoint.x, 2) + Math.pow( root.height - centerPoint.y, 2)) return Math.max(r1, r2, r3, r4) } } } } dtkdeclarative-5.7.12/src/qml/ComboBox.qml000066400000000000000000000140021476226662700204160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.ComboBox { id: control property string iconNameRole property string alertText property int alertDuration property bool showAlert property int maxVisibleItems : DS.Style.comboBox.maxVisibleItems property D.Palette separatorColor: DS.Style.comboBox.edit.separator implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset padding: DS.Style.comboBox.padding leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing) rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing) delegate: MenuItem { useIndicatorPadding: true width: parent.width text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData icon.name: (control.iconNameRole && model[control.iconNameRole] !== undefined) ? model[control.iconNameRole] : null highlighted: control.highlightedIndex === index hoverEnabled: control.hoverEnabled autoExclusive: true checked: control.currentIndex === index } indicator: Loader { sourceComponent: control.editable ? editableIndicator : normalIndicator x: control.mirrored ? control.padding : control.width - width - control.padding y: control.topPadding + (control.availableHeight - height) / 2 Component { id: editableIndicator RowLayout { spacing: DS.Style.comboBox.edit.indicatorSpacing Rectangle { width: 1 height: control.height color: control.D.ColorSelector.separatorColor } D.DciIcon { sourceSize { width: DS.Style.comboBox.edit.indicatorSize height: DS.Style.comboBox.edit.indicatorSize } palette: D.DTK.makeIconPalette(control.palette) name: "entry_option_arrow_down" mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } } } Component { id: normalIndicator D.DciIcon { sourceSize { width: DS.Style.comboBox.iconSize height: DS.Style.comboBox.iconSize } palette: D.DTK.makeIconPalette(control.palette) name: "arrow_ordinary_down" mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } } } contentItem: RowLayout { spacing: DS.Style.comboBox.spacing Loader { property string iconName: (control.iconNameRole && model.get(control.currentIndex)[control.iconNameRole] !== undefined) ? model.get(control.currentIndex)[control.iconNameRole] : null active: iconName sourceComponent: D.DciIcon { palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: iconName sourceSize: Qt.size(DS.Style.comboBox.iconSize, DS.Style.comboBox.iconSize) fallbackToQIcon: true } } T.TextField { Layout.fillWidth: true Layout.fillHeight: true text: control.editable ? control.editText : control.displayText enabled: control.editable autoScroll: control.editable readOnly: control.down inputMethodHints: control.inputMethodHints validator: control.validator selectByMouse: true color: control.editable ? control.palette.text : control.palette.buttonText selectionColor: control.palette.highlight selectedTextColor: control.palette.highlightedText verticalAlignment: Text.AlignVCenter } } background: Item { implicitWidth: DS.Style.comboBox.width implicitHeight: DS.Style.comboBox.height Loader { anchors.fill: parent active: !control.flat sourceComponent: control.editable ? editableComponent : floatingComponent property alias comboBox: control Component { id: editableComponent EditPanel { control: comboBox alertText: comboBox.alertText alertDuration: comboBox.alertDuration showAlert: comboBox.showAlert } } Component { id: floatingComponent ButtonPanel { button: comboBox } } } } popup: Popup { implicitWidth: control.width contentItem: ArrowListView { clip: true maxVisibleItems: control.maxVisibleItems view.model: control.delegateModel view.currentIndex: control.highlightedIndex view.highlightRangeMode: ListView.ApplyRange view.highlightMoveDuration: 0 } background: FloatingPanel { implicitWidth: DS.Style.menu.item.width implicitHeight: DS.Style.menu.item.height radius: DS.Style.menu.radius backgroundColor: DS.Style.menu.background } } } dtkdeclarative-5.7.12/src/qml/Container.qml000066400000000000000000000002461476226662700206350ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 Container { } dtkdeclarative-5.7.12/src/qml/Control.qml000066400000000000000000000005651476226662700203370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.style 1.0 as DS T.Control { id: control implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) } dtkdeclarative-5.7.12/src/qml/ControlBackground.qml000066400000000000000000000014141476226662700223310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 Rectangle { id: control // 暴露给外部的属性 property int focusBorderSpace: 1 property alias focusBorder: contentBorder.border property alias focusBorderVisible: contentBorder.visible radius: 8 color: "black" Rectangle { id: contentBorder anchors.centerIn: parent width: parent.width + 2 * (control.focusBorderSpace + border.width) height: parent.height + 2 * (control.focusBorderSpace + border.width) radius: parent.radius + control.focusBorderSpace + border.width border { width: 2; color: "black" } color: "transparent" } } dtkdeclarative-5.7.12/src/qml/DelayButton.qml000066400000000000000000000054041476226662700211460ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Controls.impl 2.4 import QtQuick.Templates 2.4 as T import org.deepin.dtk.style 1.0 as DS T.DelayButton { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, Math.max(contentItem.implicitHeight, indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding) padding: DS.Style.control.padding spacing: DS.Style.control.spacing transition: Transition { NumberAnimation { duration: control.delay * (control.pressed ? 1.0 - control.progress : 0.3 * control.progress) } } contentItem: ItemGroup { ClippedText { clip: control.progress > 0 clipX: -control.leftPadding + control.progress * control.width clipWidth: (1.0 - control.progress) * control.width visible: control.progress < 1 text: control.text font: control.font color: control.palette.buttonText horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } ClippedText { clip: control.progress > 0 clipX: -control.leftPadding clipWidth: control.progress * control.width visible: control.progress > 0 text: control.text font: control.font color: control.palette.highlightedText horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } } background: Rectangle { implicitWidth: control.text.length ? DS.Style.control.button.height + (4 * DS.Style.control.radius) : DS.Style.control.button.height + (2 * DS.Style.control.radius) implicitHeight: DS.Style.control.button.height radius: DS.Style.control.radius color: control.palette.button FocusBoxBorder { visible: control.visualFocus color: control.palette.highlight radius: parent.radius anchors.fill: parent } Item { width: control.progress * parent.width height: parent.height clip: true Rectangle { width: parent.parent.width height: parent.parent.height radius: DS.Style.control.radius color: control.palette.highlight } } } } dtkdeclarative-5.7.12/src/qml/Dial.qml000066400000000000000000000026721476226662700175710ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Controls.impl 2.4 import QtQuick.Templates 2.4 as T import org.deepin.dtk.style 1.0 as DS T.Dial { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem ? contentItem.implicitWidth + leftPadding + rightPadding : 0) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentItem ? contentItem.implicitHeight + topPadding + bottomPadding : 0) background: DialImpl { implicitWidth: DS.Style.dial.size implicitHeight: DS.Style.dial.size color: control.palette.highlight progress: control.position } handle: Rectangle { id: handleItem anchors.centerIn: control.background width: 2 * DS.Style.control.radius height: 2 * DS.Style.control.radius color: control.palette.highlight radius: DS.Style.control.radius antialiasing: true transform: [ Translate { y: -Math.min(control.background.width, control.background.height) * 0.4 + handleItem.height / 2 }, Rotation { angle: control.angle origin.x: handleItem.width / 2 origin.y: handleItem.height / 2 } ] } } dtkdeclarative-5.7.12/src/qml/Dialog.qml000066400000000000000000000002431476226662700201070ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 Dialog { } dtkdeclarative-5.7.12/src/qml/DialogButtonBox.qml000066400000000000000000000017661476226662700217670ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.style 1.0 as DS T.DialogButtonBox { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentItem.implicitHeight + topPadding + bottomPadding) padding: DS.Style.control.padding spacing: DS.Style.control.spacing alignment: Qt.AlignRight delegate: Button { } contentItem: ListView { implicitWidth: contentWidth implicitHeight: DS.Style.button.height model: control.contentModel spacing: control.spacing orientation: ListView.Horizontal boundsBehavior: Flickable.StopAtBounds snapMode: ListView.SnapToItem } } dtkdeclarative-5.7.12/src/qml/DialogTitleBar.qml000066400000000000000000000067761476226662700215570ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { id: control z: D.DTK.TopOrder width: Window.window.width height: DS.Style.dialogWindow.titleBarHeight // custom control property alias content: customCenter.sourceComponent // dialog icon property alias icon: iconLabel property string title property alias enableInWindowBlendBlur: background.visible property var __dwindow: Window.window.D.DWindow MouseArea { anchors.fill: parent acceptedButtons: Qt.AllButtons propagateComposedEvents: true onPressed: { if (mouse.button === Qt.RightButton) { if (mouse.x < control.width - closeBtn.width) { __dwindow.popupSystemWindowMenu() mouse.accepted = true return } } mouse.accepted = false } } background: D.InWindowBlur { id: background radius: 30 visible: false } contentItem: ColumnLayout { id: content spacing: 0 Rectangle { id: separatorTop Layout.preferredWidth: parent.width Layout.preferredHeight: 1 visible: !__dwindow.enabled color: "transparent" } RowLayout { spacing: 0 Layout.alignment: Qt.AlignHCenter Layout.fillHeight: true Layout.preferredWidth: parent.width Layout.leftMargin: DS.Style.titleBar.leftMargin D.DciIcon { id: iconLabel visible: name !== "" mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme palette: D.DTK.makeIconPalette(control.palette) sourceSize { width: DS.Style.dialogWindow.iconSize height: DS.Style.dialogWindow.iconSize } } // center custom area Loader { id: customCenter Layout.leftMargin: closeBtn.width - iconLabel.width Layout.alignment: Qt.AlignHCenter Layout.fillHeight: true Layout.fillWidth: true sourceComponent: titleCenterCom } WindowButton { id: closeBtn icon.name: "window_close" property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowCloseButtonHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowCloseButtonHint) visible: hasWindowFlag && __dwindow.enabled enabled: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_CLOSE onClicked: Window.window.close() } } Rectangle { id: separatorButtom Layout.preferredWidth: parent.width Layout.preferredHeight: 1 color: "transparent" Layout.alignment: Qt.AlignBottom } } Component { id: titleCenterCom Label { textFormat: Text.PlainText text: control.title horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } } } dtkdeclarative-5.7.12/src/qml/DialogWindow.qml000066400000000000000000000042431476226662700213030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import QtQuick.Window 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Window { id: control maximumWidth: Screen.desktopAvailableWidth maximumHeight: Screen.desktopAvailableHeight minimumWidth: DS.Style.dialogWindow.width minimumHeight: DS.Style.dialogWindow.height D.DWindow.enabled: true D.DWindow.enableSystemResize: false D.DWindow.motifFunctions: D.WindowManagerHelper.FUNC_ALL & ~D.WindowManagerHelper.FUNC_RESIZE D.DWindow.wmWindowTypes: D.WindowManagerHelper.DialogType D.DWindow.enableBlurWindow: true flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.MSWindowsFixedSizeDialogHint D.ColorSelector.family: D.Palette.CrystalColor color: active ? D.DTK.palette.window : D.DTK.inactivePalette.window height: content.height width: content.width property alias header: titleBar.sourceComponent property string icon default property alias content: contentLoader.children property alias palette : content.palette Control { id: content palette: control.active ? D.DTK.palette : D.DTK.inactivePalette contentItem: ColumnLayout { id: layout spacing: 0 Loader { id: titleBar z: D.DTK.TopOrder sourceComponent: DialogTitleBar { enableInWindowBlendBlur: true icon.name: control.icon } } Item { id: contentLoader Layout.fillWidth: true Layout.preferredHeight: childrenRect.height Layout.leftMargin: DS.Style.dialogWindow.contentHMargin Layout.rightMargin: DS.Style.dialogWindow.contentHMargin } } } onClosing: { // close can't reset sub control's hovered state. pms Bug:168405 // if we need to close, we can add closing handler to set `close.acceped = true` close.accepted = false hide() } } dtkdeclarative-5.7.12/src/qml/Drawer.qml000066400000000000000000000002431476226662700201340ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 Drawer { } dtkdeclarative-5.7.12/src/qml/EditPanel.qml000066400000000000000000000022251476226662700205570ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Rectangle { id: panel property Item control property D.Palette backgroundColor: DS.Style.edit.background property D.Palette alertBackgroundColor: DS.Style.edit.alertBackground property alias showBorder: _border.active property bool showAlert: false property string alertText: "" property int alertDuration: 0 radius: DS.Style.control.radius color: showAlert ? D.ColorSelector.alertBackgroundColor : D.ColorSelector.backgroundColor Loader { id: _border anchors.fill: parent active: control.activeFocus sourceComponent: FocusBoxBorder { color: control.palette.highlight radius: panel.radius } } Loader { active: showAlert sourceComponent: AlertToolTip { target: control timeout: alertDuration visible: showAlert text: alertText } } } dtkdeclarative-5.7.12/src/qml/EmbeddedProgressBar.qml000066400000000000000000000025071476226662700225600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Controls 2.4 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.ProgressBar { id: control property D.Palette backgroundColor: DS.Style.embeddedProgressBar.background property D.Palette progressBackgroundColor: DS.Style.embeddedProgressBar.progressBackground implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) padding: 1 background: Rectangle { implicitWidth: DS.Style.embeddedProgressBar.width implicitHeight: DS.Style.embeddedProgressBar.height radius: DS.Style.embeddedProgressBar.backgroundRadius color: control.D.ColorSelector.backgroundColor } contentItem: Item { Item { width: control.visualPosition * control.width height: DS.Style.embeddedProgressBar.contentHeight clip: true Rectangle { color: control.D.ColorSelector.progressBackgroundColor radius: DS.Style.embeddedProgressBar.contentRadius width: background.width height: parent.height } } } } dtkdeclarative-5.7.12/src/qml/FloatingButton.qml000066400000000000000000000011731476226662700216520ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Button { id: control implicitWidth: Math.max(DS.Style.control.implicitWidth(control), DS.Style.control.implicitHeight(control)) implicitHeight: implicitWidth checkable: false checked: true background: ButtonPanel { implicitWidth: DS.Style.floatingButton.size implicitHeight: DS.Style.floatingButton.size button: control radius: control.width / 2 } } dtkdeclarative-5.7.12/src/qml/FloatingMessage.qml000066400000000000000000000055271476226662700217720ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS D.FloatingMessageContainer { id: control property Component contentItem: Label { verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft text: control.message.content || "" elide: Text.ElideRight maximumLineCount: 1 } property Component button: ActionButton { icon { name: "entry_clear" width: DS.Style.floatingMessage.closeButtonSize height: DS.Style.floatingMessage.closeButtonSize } onClicked: D.DTK.closeMessage(control) } duration: 4000 panel: FloatingPanel { id: floatingPanel implicitWidth: DS.Style.control.contentImplicitWidth(floatingPanel) leftPadding: 10 rightPadding: 10 topPadding: 0 bottomPadding: 0 contentItem: RowLayout { height: DS.Style.floatingMessage.minimumHeight width: Math.min(DS.Style.floatingMessage.maximumWidth, children.width + floatingPanel.leftPadding - floatingPanel.rightPadding) spacing: 10 Loader { id: iconLoader Layout.alignment: Qt.AlignVCenter property string iconName: control.message.iconName || "" active: iconName sourceComponent: D.DciIcon { sourceSize { width: 20 height: 20 } name: iconName mode: floatingPanel.D.ColorSelector.controlState theme: floatingPanel.D.ColorSelector.controlTheme palette: D.DTK.makeIconPalette(floatingPanel.palette) } } Loader { id: contentLoader Layout.fillWidth: true Layout.fillHeight: true Layout.alignment: Qt.AlignVCenter Layout.rightMargin: closeButton.active ? 0 : 6 // when no closeButton, contentLoader.rightMargin is 10 + 6, otherwise is 10 Layout.maximumWidth: maxContentWidth Layout.preferredHeight: DS.Style.floatingMessage.minimumHeight property int maxContentWidth: DS.Style.floatingMessage.maximumWidth - iconLoader.implicitWidth - closeButton.implicitWidth sourceComponent: control.contentItem } Loader { id: closeButton Layout.alignment: Qt.AlignRight | Qt.AlignVCenter active: control.duration < 0 visible: active sourceComponent: button } } } } dtkdeclarative-5.7.12/src/qml/FloatingPanel.qml000066400000000000000000000043401476226662700214350ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { id: control padding: DS.Style.floatingPanel.radius / 2 property D.Palette backgroundColor: DS.Style.floatingPanel.background property D.Palette dropShadowColor: DS.Style.floatingPanel.dropShadow property D.Palette outsideBorderColor: DS.Style.floatingPanel.outsideBorder property D.Palette insideBorderColor: DS.Style.floatingPanel.insideBorder // corner radius property int radius: DS.Style.floatingPanel.radius // blur radius property int blurRadius: DS.Style.floatingPanel.radius background: D.InWindowBlur { implicitWidth: DS.Style.floatingPanel.width implicitHeight: DS.Style.floatingPanel.height radius: blurRadius offscreen: true D.ItemViewport { anchors.fill: parent fixed: true sourceItem: parent radius: control.radius hideSource: false } BoxShadow { anchors.fill: backgroundRect shadowOffsetX: 0 shadowOffsetY: 6 shadowColor: control.D.ColorSelector.dropShadowColor shadowBlur: 20 cornerRadius: backgroundRect.radius spread: 0 hollow: true } Rectangle { id: backgroundRect anchors.fill: parent radius: control.radius color: control.D.ColorSelector.backgroundColor } Loader { anchors.fill: backgroundRect active: control.D.ColorSelector.controlTheme === D.ApplicationHelper.DarkType sourceComponent: InsideBoxBorder { radius: backgroundRect.radius color: control.D.ColorSelector.insideBorderColor borderWidth: DS.Style.control.borderWidth } } OutsideBoxBorder { anchors.fill: backgroundRect radius: backgroundRect.radius color: control.D.ColorSelector.outsideBorderColor borderWidth: DS.Style.control.borderWidth } } } dtkdeclarative-5.7.12/src/qml/FlowStyle.qml000066400000000000000000000731451476226662700206530ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk.impl 1.0 as D QtObject { property QtObject control: QtObject { property int radius: 8 property int spacing: 6 property int padding: 6 property int borderWidth: 1 property real focusBorderWidth: 2 property real focusBorderPaddings: 1 property D.Palette border: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) normalDark: Qt.rgba(0, 0, 0, 0.05) } function implicitWidth(control) { return Math.max(backgroundImplicitWidth(control), contentImplicitWidth(control)) } function implicitHeight(control) { var background = control.implicitBackgroundHeight !== undefined ? control.implicitBackgroundHeight : (control.background ? control.background.implicitHeight : 0) if (control.topInset !== undefined) background += (control.topInset + control.bottomInset) var content = control.implicitContentHeight !== undefined ? control.implicitContentHeight : (control.contentItem ? control.contentItem.implicitHeight : 0) content += (control.topPadding + control.bottomPadding) return Math.max(background, content) } function backgroundImplicitWidth(control) { var background = control.implicitBackgroundWidth !== undefined ? control.implicitBackgroundWidth : (control.background ? control.background.implicitWidth : 0) if (control.leftInset !== undefined) background += (control.leftInset + control.rightInset) return background } function contentImplicitWidth(control) { var content = control.implicitContentWidth !== undefined ? control.implicitContentWidth : (control.contentItem ? control.contentItem.implicitWidth : 0) content += (control.leftPadding + control.rightPadding) return content } function selectColor(conditionColor, lightColor, darkColor) { if (conditionColor) { return D.DTK.selectColor(conditionColor, lightColor, darkColor) } return D.DTK.themeType === D.ApplicationHelper.DarkType ? darkColor : lightColor } } // Settings property QtObject settings: QtObject { property QtObject title: QtObject { property int marginL1: 10 property int marginL2: 30 property int marginLOther: 50 } property QtObject content: QtObject { property int margin: 10 property int marginL1: 10 property int marginL2: 30 property int marginOther: 50 property int resetButtonHeight: 90 } property QtObject navigation: QtObject { property int width: 190 property int height: 20 property int margin: 10 property int textVPadding: 10 } property D.Palette background: D.Palette { normal: ("transparent") hovered: Qt.rgba(0, 0, 0, 0.1) } } // Button property QtObject button: QtObject { property int width: 140 property int height: 36 property int hPadding: control.radius property int vPadding: control.radius / 2.0 property int iconSize: 24 property D.Palette background1: D.Palette { normal { common: ("#f7f7f7") crystal: Qt.rgba(0, 0, 0, 0.1) } normalDark { common: Qt.rgba(1, 1, 1, 0.1) crystal: Qt.rgba(1, 1, 1, 0.1) } hovered { common: ("#e1e1e1") crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.2) } pressed { common: ("#bcc4d0") crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.15) } } property D.Palette background2: D.Palette { normal { common: ("#f0f0f0") crystal: Qt.rgba(0, 0, 0, 0.1) } normalDark { common: Qt.rgba(1, 1, 1, 0.1) crystal: Qt.rgba(1, 1, 1, 0.1) } hovered { common: ("#d2d2d2") crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.2) } pressed { common: ("#cdd6e0") crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.15) } } property D.Palette dropShadow: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) hovered: Qt.rgba(0, 0, 0, 0.1) } property D.Palette innerShadow1: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) pressed: ("transparent") } property D.Palette innerShadow2: D.Palette { normal: Qt.rgba(1, 1, 1, 0.2) hovered: Qt.rgba(1, 1, 1, 0.5) pressed: ("transparent") } property D.Palette insideBorder: D.Palette { normal { common: Qt.rgba(1, 1, 1, 0.1) crystal: Qt.rgba(1, 1, 1, 0.1) } normalDark { common: Qt.rgba(1, 1, 1, 0.1) crystal: Qt.rgba(1, 1, 1, 0.1) } hovered { common: Qt.rgba(1, 1, 1, 0.2) crystal: Qt.rgba(0, 0, 0, 0.05) } pressed { common: Qt.rgba(1, 1, 1, 0.03) crystal: Qt.rgba(0, 0, 0, 0.03) } } property D.Palette outsideBorder: D.Palette { normal { common: Qt.rgba(0, 0, 0, 0.08) crystal: Qt.rgba(0, 0, 0, 0.08) } hovered: Qt.rgba(0, 0, 0, 0.2) pressed: ("transparent") } property D.Palette text: D.Palette { normal { common: Qt.rgba(0, 0, 0, 1) crystal: Qt.rgba(0, 0, 0, 1) } pressed { common: D.DTK.makeColor(D.Color.Highlight) crystal: D.DTK.makeColor(D.Color.Highlight) } } } property QtObject highlightedButton: QtObject { property D.Palette background1: D.Palette { normal { common: D.DTK.makeColor(D.Color.Highlight).saturation(+22).lightness(+14) crystal: Qt.rgba(0, 0, 0, 0.1) } normalDark { common: D.DTK.makeColor(D.Color.Highlight).saturation(+10).lightness(+10) crystal: Qt.rgba(0, 0, 0, 0.1) } hovered { common: D.DTK.makeColor(D.Color.Highlight).lightness(+10).saturation(+20).lightness(+10) crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.2) } hoveredDark { common: D.DTK.makeColor(D.Color.Highlight).lightness(+10).saturation(+30).lightness(+10) } pressed { common: D.DTK.makeColor(D.Color.Highlight).lightness(-10).saturation(+8).lightness(-8) crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.15) } pressedDark { common: D.DTK.makeColor(D.Color.Highlight).saturation(+10).lightness(+2) } disabled { common: D.DTK.makeColor(D.Color.Highlight).saturation(+22).lightness(+14) crystal: Qt.rgba(0, 0, 0, 0.1) } } property D.Palette background2: D.Palette { normal { common: D.DTK.makeColor(D.Color.Highlight).saturation(+26).lightness(-10) crystal: Qt.rgba(0, 0, 0, 0.1) } normalDark { common: D.DTK.makeColor(D.Color.Highlight).saturation(+28).lightness(-2) crystal: Qt.rgba(0, 0, 0, 0.1) } hovered { common: D.DTK.makeColor(D.Color.Highlight).lightness(+10).saturation(+15).lightness(-8) crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.2) } hoveredDark { common: D.DTK.makeColor(D.Color.Highlight).lightness(+10).saturation(+30).lightness(-7) } pressed { common: D.DTK.makeColor(D.Color.Highlight).lightness(-10).saturation(+15).lightness(-1) crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.15) } pressedDark { common: D.DTK.makeColor(D.Color.Highlight).saturation(+10).lightness(+2) } disabled { common: D.DTK.makeColor(D.Color.Highlight).saturation(+22).lightness(+14) crystal: Qt.rgba(0, 0, 0, 0.1) } } property D.Palette dropShadow: D.Palette { normal { common: D.DTK.makeColor(D.Color.Highlight).saturation(+50).lightness(-10).opacity(-60) crystal: Qt.rgba(0, 0, 0, 0.1) } normalDark: D.DTK.makeColor(D.Color.Highlight).saturation(+15).lightness(+12).opacity(+20) pressed: D.DTK.makeColor(D.Color.Highlight).saturation(+50).lightness(-10).opacity(-80) disabled: D.DTK.makeColor(D.Color.Highlight).saturation(+50).lightness(-10).opacity(+30) } property D.Palette innerShadow1: D.Palette { normal { common: D.DTK.makeColor(D.Color.Highlight).lightness(-10) crystal: Qt.rgba(0, 0, 0, 0.1) } normalDark: D.DTK.makeColor(D.Color.Highlight).saturation(+25).lightness(-6) hovered: D.DTK.makeColor(D.Color.Highlight).lightness(+10).lightness(-10) pressed: D.DTK.makeColor(D.Color.Highlight).lightness(+10).lightness(-5) pressedDark: D.DTK.makeColor(D.Color.Highlight).saturation(+36).lightness(-10) disabled: D.DTK.makeColor(D.Color.Highlight).lightness(-10) } property D.Palette innerShadow2: D.Palette { normal: ("transparent") } property D.Palette text: D.Palette { normal { common: Qt.rgba(1, 1, 1, 1) crystal: D.DTK.makeColor(D.Color.Highlight) } normalDark: normal } property D.Palette border: D.Palette { normal { common: D.DTK.makeColor(D.Color.Highlight).opacity(+20) crystal: Qt.rgba(1, 1, 1, 0.1) } normalDark { common: Qt.rgba(1, 1, 1, 0.2) crystal: Qt.rgba(1, 1, 1, 0.1) } hovered: Qt.rgba(0, 0, 0, 0.03) hoveredDark: Qt.rgba(1, 1, 1, 0.2) } } property QtObject checkedButton: QtObject { property D.Palette background : D.Palette { normal: D.DTK.makeColor(D.Color.Highlight) hovered: D.DTK.makeColor(D.Color.Highlight).lightness(+10) pressed: D.DTK.makeColor(D.Color.Highlight).lightness(-10) } property D.Palette text : D.Palette { normal: D.DTK.makeColor(D.Color.HighlightedText) normalDark: D.DTK.makeColor(D.Color.HighlightedText) hovered: D.DTK.makeColor(D.Color.HighlightedText).lightness(+10) hoveredDark: D.DTK.makeColor(D.Color.HighlightedText).lightness(+10) pressed: D.DTK.makeColor(D.Color.HighlightedText).opacity(-20) pressedDark: D.DTK.makeColor(D.Color.HighlightedText).opacity(-20) } property D.Palette dropShadow : D.Palette { normal: D.DTK.makeColor(D.Color.Highlight).opacity(-60) pressed: D.DTK.makeColor(D.Color.Highlight).opacity(-80) } property D.Palette innerShadow : D.Palette { normal: D.DTK.makeColor(D.Color.Highlight).lightness(-10) hovered: D.DTK.makeColor(D.Color.Highlight) pressed: D.DTK.makeColor(D.Color.Highlight).lightness(-20) } } property QtObject windowButton: QtObject { property int width: 50 property int height: 50 property D.Palette background: D.Palette { normal: ("transparent") normalDark: ("transparent") hovered: Qt.rgba(0, 0, 0, 0.10) hoveredDark: Qt.rgba(1, 1, 1, 0.10) pressed: Qt.rgba(0, 0, 0, 0.15) pressedDark: Qt.rgba(1, 1, 1, 0.15) } } property QtObject warningButton: QtObject { property D.Palette text: D.Palette { normal: ("#ff5736") } } property QtObject switchButton: QtObject { property int indicatorWidth: 50 property int indicatorHeight: 24 property int handleWidth: 30 property int handleHeight: 24 property string iconName: "switch_button" property D.Palette background: D.Palette { normal: Qt.rgba(50 / 255, 50 / 255, 50 / 255, 0.2) normalDark: ("#1A1A1A") } property D.Palette handle: D.Palette { normal: ("#8c8c8c") normalDark: ("#444444") } } property QtObject floatingButton: QtObject { property int size: 24 } property QtObject iconButton: QtObject { property int backgroundSize: 36 property int iconSize: 16 property int padding: 9 } property QtObject toolButton: QtObject { property int width: 30 property int height: 30 property int iconSize: 16 property int indicatorRightMargin: 6 } property QtObject radioButton: QtObject { property int indicatorSize: 16 property int iconSize: 16 property int spacing: 8 property int topPadding: 12 property int bottomPadding: 12 } // Box property QtObject checkBox: QtObject { property int indicatorWidth: 16 property int indicatorHeight: 16 property int padding: 2 property int iconSize: 16 property int focusRadius: 4 } property QtObject buttonBox: QtObject { property int width: 30 property int height: 30 property int padding: 0 property int spacing: 0 } property QtObject comboBox: QtObject { property int width: 240 property int height: 36 property int padding: 8 property int spacing: 10 property int iconSize: 12 property int maxVisibleItems: 16 property QtObject edit: QtObject { property int indicatorSpacing: 7 property int indicatorSize: 24 property D.Palette separator: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) } } } // Edit property QtObject edit: QtObject { property int width: 180 property int actionIconSize: 24 property int textFieldHeight: 36 property int textAreaHeight: 100 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.08) normalDark: Qt.rgba(1, 1, 1, 0.05) } property D.Palette alertBackground: D.Palette { normal: Qt.rgba(0.95, 0.22, 0.20, 0.15) } property D.Palette placeholderText: D.Palette { normal: Qt.rgba(0.33, 0.33, 0.33, 0.4) normalDark: Qt.rgba(1, 1, 1, 0.3) } } property QtObject searchEdit: QtObject { property int iconSize: 16 property int iconLeftMargin: 10 property int iconRightMargin: 7 property int animationDuration: 200 } property QtObject ipEdit: QtObject { property int fieldWidth: 40 } property QtObject passwordEdit: QtObject { property int echoActionSpacing: 8 } property QtObject keySequenceEdit: QtObject { property int width: 200 property int height: 36 property int margin: 10 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) normalDark: Qt.rgba(255, 255, 255, 0.05) } property D.Palette placeholderText: D.Palette { normal: Qt.rgba(85 / 255, 85 / 255, 85 / 255, 0.4) normalDark: Qt.rgba(192 / 255, 198 / 255, 212 / 255, 0.4) } property QtObject label: QtObject { property int leftRightPadding: 6 property int topBottomPadding: 3 property D.Palette background1: D.Palette { normal: ("#c3c3c3") normalDark: ("#3e3e3e") } property D.Palette background2: D.Palette { normal: ("#d8d8d8") normalDark: ("#525252") } property D.Palette shadowInner1: D.Palette { normal: Qt.rgba(0, 0, 0, 0.1) normalDark: Qt.rgba(0, 0, 0, 0.2) } property D.Palette shadowInner2: D.Palette { normalDark: Qt.rgba(1, 1, 1, 0.1) } property D.Palette shadowOuter: D.Palette { normal: Qt.rgba(0, 0, 0, 0.3) } property D.Palette text: D.Palette { normal: ("black") } } } property QtObject spinBox: QtObject { property int width : 300 property int height: 36 property int spacing: 10 property QtObject indicator: QtObject { property int width: 24 property int height: 14 property int iconSize: 24 property int focusIconSize: 10 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.7) hovered: Qt.rgba(0, 0, 0, 0.6) pressed: Qt.rgba(0, 0, 0, 0.8) } } } property QtObject plusMinusSpinBox: QtObject { property int buttonIconSize: 16 } // Window property QtObject dialogWindow: QtObject { property int width: 120 property int height: 120 property int contentHMargin: 10 property int footerMargin: 10 property int titleBarHeight: 50 property int iconSize: 32 } property QtObject aboutDialog: QtObject { property int width: 540 property int height: 290 property int leftAreaWidth: 220 property int bottomPadding: 20 property int productIconHeight: 128 } property QtObject popup: QtObject { property int width: 80 property int height: 180 property int radius: 18 property int padding: 10 } property QtObject floatingMessage: QtObject { property int maximumWidth: 450 property int minimumHeight: 40 property int closeButtonSize: 24 } property QtObject floatingPanel: QtObject { property int width: 180 property int height: 40 property int radius: 14 property D.Palette background: D.Palette { normal: Qt.rgba(247 / 255.0, 247 / 255.0, 247 / 255.0, 0.6) normalDark: Qt.rgba(20 / 255.0, 20 / 255.0, 20 / 255.0, 0.6) } property D.Palette dropShadow: D.Palette { normal: Qt.rgba(0, 0, 0, 0.2) normalDark: Qt.rgba(0, 0, 0, 0.2) } property D.Palette outsideBorder: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) normalDark: Qt.rgba(0, 0, 0, 0.5) } property D.Palette insideBorder: D.Palette { normalDark: Qt.rgba(1, 1, 1, 0.05) } } property QtObject toolTip: QtObject { property int verticalPadding: 4 property int horizontalPadding: 5 property int height: 24 } property QtObject alertToolTip: QtObject { property int connectorWidth: 3 property int connectorHeight: 12 property int verticalPadding: 4 property int horizontalPadding: 10 property D.Palette text: D.Palette { normal: ("#e15736") normalDark: ("#e13669") } property D.Palette background: D.Palette { normal: Qt.rgba(247 / 255, 247 / 255, 247 / 255, 0.6) normalDark: Qt.rgba(59 / 255, 59 / 255, 59 / 255, 0.6) } property D.Palette connecterdropShadow: D.Palette { normal: Qt.rgba(0, 0, 0, 0.1) } property D.Palette connecterBackground: D.Palette { normal: Qt.rgba(1, 1, 1, 1) normalDark: Qt.rgba(0, 0, 0, 0.1) } } property QtObject menu: QtObject { property int padding: 10 property int radius: D.DTK.platformTheme.windowRadius < 0 ? 18 : D.DTK.platformTheme.windowRadius property int margins: 0 property int overlap: 1 property QtObject item: QtObject { property int width: 180 property int height: 34 property size iconSize: Qt.size(14, 14) property int count: 0 } property QtObject separator: QtObject { property int lineTopPadding : 6 property int lineBottomPadding : 4 property int lineHeight : 2 property int topPadding: 11 property int bottomPadding: 2 property D.Palette lineColor: D.Palette { normal: Qt.rgba(0, 0, 0, 0.1) } } property D.Palette background: D.Palette { normal: Qt.rgba(238 / 255.0, 238 / 255.0, 238 / 255.0, 0.8) normalDark: Qt.rgba(20 / 255.0, 20 / 255.0, 20 / 255.0, 0.8) } property D.Palette subMenuOpenedBackground: D.Palette { normal: Qt.rgba(0, 0, 0, 0.15) } property D.Palette itemText: D.Palette { normal: ("black") normalDark: Qt.rgba(1, 1, 1, 0.6) } property D.Palette separatorText: D.Palette { normal: Qt.rgba(0, 0, 0, 0.5) normalDark: Qt.rgba(1, 1, 1, 0.4) } } // Panel property QtObject highlightPanel: QtObject { property int width: 180 property int height: 30 property D.Palette background: D.Palette { normal: D.DTK.makeColor(D.Color.Highlight) normalDark: D.DTK.makeColor(D.Color.Highlight) hovered: D.DTK.makeColor(D.Color.Highlight).lightness(+10) hoveredDark: D.DTK.makeColor(D.Color.Highlight).lightness(+10) } property D.Palette dropShadow: D.Palette { normal: D.DTK.makeColor(D.Color.Highlight).lightness(+20).opacity(-80) normalDark: D.DTK.makeColor(D.Color.Highlight).lightness(+20).opacity(-80) } property D.Palette innerShadow: D.Palette { normal: D.DTK.makeColor(D.Color.Highlight).lightness(-20) normalDark: D.DTK.makeColor(D.Color.Highlight).lightness(-20) } } property QtObject behindWindowBlur: QtObject { property color lightColor: Qt.rgba(235 / 255.0, 235 / 255.0, 235 / 255.0, 0.6) property color lightNoBlurColor: Qt.rgba(235 / 255.0, 235 / 255.0, 235 / 255.0, 1.0) property color darkColor: "#55000000" property color darkNoBlurColor: Qt.rgba(35 / 255.0, 35 / 255.0, 35 / 255.0, 1.0) } property QtObject arrowRectangleBlur: QtObject { property int borderWidth: 1 property int roundJoinRadius: 8 property color outBorderColor: Qt.rgba(0, 0, 0, 0.06) property color darkOutBorderColor: Qt.rgba(0, 0, 0, 0.8) property color inBorderColor: Qt.rgba(1, 1, 1, 0.1) property color darkInBorderColor: Qt.rgba(1, 1, 1, 0.8) property color backgroundColor: Qt.rgba(238.0 / 255, 238.0 / 255, 238.0 / 255, 0.8) property color darkBackgroundColor: Qt.rgba(20.0 / 255, 20.0 / 255, 20.0 / 255, 0.8) property color shadowColor: Qt.rgba(0, 0, 0, 0.2) property color darkShadowColor: Qt.rgba(0, 0, 0, 0.2) } property QtObject arrowListView: QtObject { property int width: 180 property size stepButtonSize: Qt.size(16, 16) property size stepButtonIconSize: Qt.size(12, 12) property int maxVisibleItems: 16 property int itemHeight: 30 property string upButtonIconName: "arrow_ordinary_up" property string downButtonIconName: "arrow_ordinary_down" } property QtObject itemDelegate: QtObject { property int width: 204 property int height: 40 property color normalColor: Qt.rgba(0, 0, 0, 0.05) property color cascadeColor: Qt.rgba(0, 0, 0, 0.15) property int iconSize: 24 property int checkIndicatorIconSize: 24 property D.Palette checkBackgroundColor: D.Palette { hovered: Qt.rgba(0, 0, 0, 0.1) normal: Qt.rgba(0, 0, 0, 0.05) } property color checkedColor: Qt.rgba(0, 0, 0, 0.15) } property QtObject stackView: QtObject { property int animationDuration: 200 property int animationEasingType: Easing.OutCubic } // Indicator property QtObject busyIndicator: QtObject { property int size: 16 property int paddingFactor: 16 property D.Palette fillColor: D.Palette { normal: D.DTK.makeColor(D.Color.Highlight) } property int animationDuration: 800 property string spinnerSource: "qrc:/dtk/declarative/resources/spinner-blue.webp" } property QtObject buttonIndicator: QtObject { property int size: 16 property int iconSize: 12 property D.Palette background: D.Palette { normal: Qt.rgba(1, 1, 1, 0.2) normalDark: ("#ffffff") } } // Bar property QtObject scrollBar: QtObject { property int padding: 2 property int width: 4 property int activeWidth: 12 property real hideOpacity: 0.0 property int hidePauseDuration: 450 property int hideDuration: 1500 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.5) normalDark: Qt.rgba(1, 1, 1, 0.3) hovered: Qt.rgba(0, 0, 0, 0.7) hoveredDark: Qt.rgba(1, 1, 1, 0.7) pressed: Qt.rgba(0, 0, 0, 0.4) pressedDark: Qt.rgba(1, 1, 1, 0.3) } property D.Palette outsideBorder: D.Palette { normal: Qt.rgba(1, 1, 1, 0.1) normalDark: Qt.rgba(0, 0, 0, 0.1) } property D.Palette insideBorder: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) normalDark: Qt.rgba(1, 1, 1, 0.05) } } property QtObject progressBar: QtObject { property int width: 300 property int height: 36 property int indeterminateProgressBarWidth: 90 property int indeterminateProgressBarAnimationDuration: 2000 property D.Palette shadowColor: D.Palette { normal: D.DTK.makeColor(D.Color.Highlight).opacity(-60) } property D.Palette handleGradientColor: D.Palette { normal: D.DTK.makeColor(D.Color.Highlight).hue(-10).saturation(+40).lightness(+20) } } property QtObject embeddedProgressBar: QtObject { property int width: 48 property int height: 6 property int contentHeight: 4 property int backgroundRadius: 3 property int contentRadius: 2 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.7) normalDark: Qt.rgba(0, 0, 0, 0.2) } property D.Palette progressBackground: D.Palette { normal: ("white") normalDark: Qt.rgba(1, 1, 1, 0.7) } } property QtObject waterProgressBar: QtObject { property int width: 98 property int height: 98 property string waterFrontImagePath: "qrc:/dtk/declarative/resources/water_front.png" property string waterBackImagePath: "qrc:/dtk/declarative/resources/water_back.png" property D.Palette background1: D.Palette { normal: ("#1f08ff") } property D.Palette background2: D.Palette { normal: ("#50fff7") } property D.Palette dropShadow: D.Palette { normal: Qt.rgba(42 / 255, 154 / 255, 248 / 255, 0.3) } property D.Palette popBackground: D.Palette { normal: Qt.rgba(255, 255, 255, 0.3) } property D.Palette textColor: D.Palette { normal: ("white") } } property QtObject titleBar: QtObject { property int height: 50 property int iconSize: 32 property int leftMargin: 10 } // Other property QtObject slider: QtObject { property int width: 120 property int height: 60 property int highlightMargin: -4 property QtObject handle: QtObject { property int width: 20 property int height: 24 } property QtObject groove: QtObject { property int width: 100 property int height: 4 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.2) normalDark: Qt.rgba(1, 1, 1, 0.2) } } property QtObject tick: QtObject { property int width: 1 property int height: 12 property int radius: 8 property int textMargin: 2 property int hPadding: 10 property int vPadding: 2 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.4) normalDark: Qt.rgba(1, 1, 1, 0.4) } } } // Dial property QtObject dial: QtObject { property int size: 100 } // PageIndicator property QtObject pageIndicator: QtObject { property int width: 8 property int height: 8 } } dtkdeclarative-5.7.12/src/qml/FocusBoxBorder.qml000066400000000000000000000016521476226662700216030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Item { id: control property color color: "transparent" property real borderWidth: DS.Style.control.focusBorderWidth property real radius: 0 BoxShadow { anchors.fill: _border shadowColor: D.DTK.makeColor(parent.color).opacity(-50).color() cornerRadius: _border.radius shadowBlur: 4 hollow: true } Rectangle { id: _border readonly property real paddings: borderWidth + DS.Style.control.focusBorderPaddings anchors { fill: parent margins: -paddings } radius: parent.radius + paddings border { width: borderWidth; color: parent.color } color: "transparent" } } dtkdeclarative-5.7.12/src/qml/Frame.qml000066400000000000000000000016521476226662700177470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.style 1.0 as DS T.Frame { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding) contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0) contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0) padding: DS.Style.control.padding property int radius: DS.Style.control.radius background: Rectangle { color: "transparent" border.color: control.palette.mid radius: control.radius } } dtkdeclarative-5.7.12/src/qml/GroupBox.qml000066400000000000000000000025151476226662700204610ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.style 1.0 as DS T.GroupBox { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, label ? label.implicitWidth + leftPadding + rightPadding : 0, contentWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding) contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0) contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0) padding: 0 topPadding: padding + (label && label.implicitWidth > 0 ? label.implicitHeight + spacing : 0) label: Label { x: DS.Style.control.radius text: control.title color: control.palette.windowText elide: Text.ElideRight verticalAlignment: Text.AlignLeft background: Rectangle { } } background: Rectangle { y: label.height / 2 width: parent.width radius: DS.Style.control.radius color: control.palette.window } } dtkdeclarative-5.7.12/src/qml/HelpAction.qml000066400000000000000000000004501476226662700207360ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D Action { id: helpAction text: qsTr("Help") onTriggered: D.ApplicationHelper.handleHelpAction() } dtkdeclarative-5.7.12/src/qml/HighlightPanel.qml000066400000000000000000000022431476226662700216010ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Item { id: panel property D.Palette backgroundColor: DS.Style.highlightPanel.background property D.Palette outerShadowColor: DS.Style.highlightPanel.dropShadow property D.Palette innerShadowColor: DS.Style.highlightPanel.innerShadow implicitWidth: DS.Style.highlightPanel.width implicitHeight: DS.Style.highlightPanel.height BoxShadow { anchors.fill: backgroundRect shadowColor: panel.D.ColorSelector.outerShadowColor shadowOffsetY: 4 shadowBlur: 6 cornerRadius: backgroundRect.radius } Rectangle { id: backgroundRect anchors.fill: parent color: panel.D.ColorSelector.backgroundColor radius: DS.Style.control.radius } BoxInsetShadow { anchors.fill: backgroundRect shadowColor: panel.D.ColorSelector.innerShadowColor shadowOffsetY: -1 shadowBlur: 2 spread: 1 cornerRadius: backgroundRect.radius } } dtkdeclarative-5.7.12/src/qml/IconButton.qml000066400000000000000000000022611476226662700207760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Button { id: control implicitWidth: Math.max(DS.Style.control.implicitWidth(control), DS.Style.control.implicitHeight(control)) implicitHeight: implicitWidth topPadding: DS.Style.iconButton.padding bottomPadding: DS.Style.iconButton.padding leftPadding: DS.Style.iconButton.padding rightPadding: DS.Style.iconButton.padding icon { width: DS.Style.iconButton.iconSize height: DS.Style.iconButton.iconSize color: D.ColorSelector.textColor } contentItem: D.DciIcon { name: control.icon.name palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme sourceSize: Qt.size(control.icon.width, control.icon.height) } background: ButtonPanel { implicitWidth: DS.Style.iconButton.backgroundSize implicitHeight: DS.Style.iconButton.backgroundSize button: control } } dtkdeclarative-5.7.12/src/qml/InsideBoxBorder.qml000066400000000000000000000007161476226662700217370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 Item { property real borderWidth: 1 property color color: Qt.rgba(1, 1, 1, 0.15) property alias radius: rect.radius Rectangle { id: rect anchors.fill: parent color: "transparent" border { width: borderWidth color: parent.color } } } dtkdeclarative-5.7.12/src/qml/IpV4LineEdit.qml000066400000000000000000000075351476226662700211230ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS FocusScope { id: control property string text property string alertText property int alertDuration property bool showAlert property D.Palette backgroundColor: DS.Style.edit.background width: impl.width height: impl.height Control { id: impl anchors.fill: parent contentItem: RowLayout { Repeater { id: fields model: 4 Layout.fillWidth: true delegate: TextInput { KeyNavigation.right: index < fields.count - 1 ? fields.itemAt(index + 1) : null KeyNavigation.left: index > 0 ? fields.itemAt(index - 1) : null selectByMouse: true color: impl.palette.text selectionColor: impl.palette.highlight verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: modelData Layout.preferredWidth: DS.Style.ipEdit.fieldWidth Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter validator: RegExpValidator { regExp: /^(([0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])?)$/ } Loader { active: index < fields.count - 1 sourceComponent: Label { text: "." anchors { left: parent.right } } } onTextEdited: fields.updateText() } function updateText() { var text = "" for (var i = 0; i < fields.count; ++i) { text += fields.itemAt(i).text if (i < fields.count - 1) text += "." } control.text = text == "..." ? "" : text } function clearText() { for (var i = 0; i < fields.count; ++i) { fields.itemAt(i).text = "" } control.text = "" } function updateByText() { if (control.text === "") clearText() var arrs = control.text.split(".") if (arrs.length != 4) return fields.model = arrs } Component.onCompleted: { updateByText() control.textChanged.connect(updateByText) } } Loader { id: clearBtn active: control.activeFocus && control.text width: height height: 36 Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.rightMargin: 8 sourceComponent: ActionButton { icon.name: "entry_clear" focusPolicy: Qt.NoFocus onClicked: fields.clearText() } } } background: EditPanel { control: impl alertText: control.alertText alertDuration: control.alertDuration showAlert: control.showAlert showBorder: control.activeFocus backgroundColor: control.backgroundColor implicitWidth: DS.Style.edit.width implicitHeight: DS.Style.edit.textFieldHeight } } } dtkdeclarative-5.7.12/src/qml/ItemDelegate.qml000066400000000000000000000105431476226662700212450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import QtQuick.Layouts 1.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.ItemDelegate { id: control property bool indicatorVisible property bool backgroundVisible: true property bool cascadeSelected property bool contentFlow property Component content property D.Palette checkedTextColor: DS.Style.checkedButton.text property int corners: D.RoundRectangle.TopLeftCorner | D.RoundRectangle.TopRightCorner | D.RoundRectangle.BottomLeftCorner | D.RoundRectangle.BottomRightCorner function getCornersForBackground(index, count) { if (count <= 1) return D.RoundRectangle.TopLeftCorner | D.RoundRectangle.TopRightCorner | D.RoundRectangle.BottomLeftCorner | D.RoundRectangle.BottomRightCorner if (index === 0) { return D.RoundRectangle.TopLeftCorner | D.RoundRectangle.TopRightCorner } else if (index === count - 1) { return D.RoundRectangle.BottomLeftCorner | D.RoundRectangle.BottomRightCorner } return 0 } implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset padding: DS.Style.control.padding spacing: DS.Style.control.spacing checkable: true autoExclusive: true palette.windowText: checked && !control.cascadeSelected ? D.ColorSelector.checkedTextColor : undefined D.DciIcon.mode: D.ColorSelector.controlState D.DciIcon.theme: D.ColorSelector.controlTheme D.DciIcon.palette: D.DTK.makeIconPalette(palette) icon { width: DS.Style.itemDelegate.iconSize height: DS.Style.itemDelegate.iconSize } font: D.DTK.fontManager.t9 indicator: Loader { x: control.text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2 y: control.topPadding + (control.availableHeight - height) / 2 active: control.indicatorVisible && control.checked sourceComponent: D.DciIcon { palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false name: "menu_select" sourceSize: Qt.size(DS.Style.itemDelegate.checkIndicatorIconSize, DS.Style.itemDelegate.checkIndicatorIconSize) } } contentItem: RowLayout { D.IconLabel { spacing: control.spacing mirrored: control.mirrored display: control.display alignment: control.display === D.IconLabel.IconOnly || control.display === D.IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft | Qt.AlignVCenter text: control.text font: control.font color: control.palette.windowText icon: D.DTK.makeIcon(control.icon, control.D.DciIcon) Layout.fillWidth: !control.contentFlow } Loader { sourceComponent: control.content Layout.fillWidth: control.contentFlow Layout.alignment: control.contentFlow ? Qt.AlignLeft : Qt.AlignRight } } background: Item { implicitWidth: DS.Style.itemDelegate.width implicitHeight: DS.Style.itemDelegate.height Loader { anchors.fill: parent active: checked && !control.cascadeSelected sourceComponent: HighlightPanel {} } Loader { anchors.fill: parent active: checked && control.cascadeSelected sourceComponent: D.RoundRectangle { color: DS.Style.itemDelegate.cascadeColor radius: DS.Style.control.radius corners: control.corners } } Loader { anchors.fill: parent active: !checked && control.backgroundVisible sourceComponent: D.RoundRectangle { color: DS.Style.itemDelegate.normalColor radius: DS.Style.control.radius corners: control.corners } } } } dtkdeclarative-5.7.12/src/qml/KeySequenceEdit.qml000066400000000000000000000046061476226662700217460ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import "private" Control { id: control property string text property string placeholderText property alias keys: listener.keys property D.Palette backgroundColor: DS.Style.keySequenceEdit.background property D.Palette placeholderTextColor: DS.Style.keySequenceEdit.placeholderText background: Rectangle { implicitWidth: DS.Style.keySequenceEdit.width implicitHeight: DS.Style.keySequenceEdit.height radius: DS.Style.control.radius color: control.D.ColorSelector.backgroundColor } contentItem: RowLayout { Label { Layout.leftMargin: DS.Style.keySequenceEdit.margin text: control.text horizontalAlignment: Qt.AlignLeft verticalAlignment: Qt.AlignVCenter Layout.fillWidth: true Layout.fillHeight: true Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter } Component { id: inputComponent Label { text: control.placeholderText color: control.D.ColorSelector.placeholderTextColor font: D.DTK.fontManager.t7 horizontalAlignment: Qt.AlignRight verticalAlignment: Qt.AlignVCenter } } Component { id: keyComponent RowLayout { spacing: DS.Style.keySequenceEdit.margin Repeater { model: control.keys KeySequenceLabel { Layout.alignment: Qt.AlignRight text: modelData } } } } Loader { Layout.rightMargin: DS.Style.keySequenceEdit.margin Layout.alignment: Qt.AlignVCenter sourceComponent: (control.keys.length !== 0) ? keyComponent : inputComponent MouseArea { anchors.fill: parent onClicked: { control.forceActiveFocus() listener.clearKeys() } } } } D.KeySequenceListener { id: listener target: control } } dtkdeclarative-5.7.12/src/qml/Label.qml000066400000000000000000000002421476226662700177260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 Label { } dtkdeclarative-5.7.12/src/qml/LineEdit.qml000066400000000000000000000017311476226662700204100ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS TextField { id: control readonly property alias clearButton: clearBtn rightPadding: clearBtn.active ? (clearBtn.width + clearBtn.anchors.rightMargin) : 10 selectByMouse: true Loader { id: clearBtn active: control.text.length !== 0 width: height height: control.background.implicitHeight anchors { right: control.right verticalCenter: control.verticalCenter } sourceComponent: ActionButton { focusPolicy: Qt.NoFocus icon { name: "entry_clear" width: DS.Style.edit.actionIconSize height: DS.Style.edit.actionIconSize } onClicked: control.clear() } } } dtkdeclarative-5.7.12/src/qml/Menu.qml000066400000000000000000000056671476226662700176330ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import QtQuick.Layouts 1.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.Menu { id: control property bool closeOnInactive: true property int maxVisibleItems : DS.Style.arrowListView.maxVisibleItems property D.Palette backgroundColor: DS.Style.menu.background property var model: control.contentModel property Component header property Component footer readonly property bool existsChecked: { for (var i = 0; i < count; ++i) { var item = itemAt(i) if (item && item.checked) return true } return false } readonly property bool active: parent && parent.Window.active implicitHeight: DS.Style.control.implicitHeight(control) implicitWidth: DS.Style.control.implicitWidth(control) margins: DS.Style.menu.margins overlap: DS.Style.menu.overlap padding: DS.Style.menu.padding delegate: MenuItem { } D.PopupHandle.delegate: PopupWindow { blurControl: control } contentItem: Control { contentItem: ColumnLayout { id: viewLayout Loader { Layout.fillWidth: true Layout.preferredHeight: height sourceComponent: control.header } ArrowListView { id: contentView property int count: contentView.view.count view.model: control.model Layout.fillWidth: true Layout.fillHeight: true view.currentIndex: control.currentIndex maxVisibleItems: control.maxVisibleItems itemHeight: DS.Style.menu.item.height function refreshContentItemWidth() { for (var i = 0; i < view.count; ++i) { var item = view.model.get(i) if (item) { item.width = view.width } } } onCountChanged: refreshContentItemWidth() onWidthChanged: refreshContentItemWidth() } Loader { Layout.fillWidth: true Layout.preferredHeight: height sourceComponent: control.footer } } } background: Loader { active: !control.D.PopupHandle.window sourceComponent: FloatingPanel { implicitWidth: DS.Style.menu.item.width implicitHeight: DS.Style.menu.item.height radius: DS.Style.menu.radius backgroundColor: control.backgroundColor } } onActiveChanged: { if (!active && closeOnInactive) { control.close() } } } dtkdeclarative-5.7.12/src/qml/MenuBar.qml000066400000000000000000000002441476226662700202420ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 MenuBar { } dtkdeclarative-5.7.12/src/qml/MenuItem.qml000066400000000000000000000103301476226662700204310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.MenuItem { id: control property bool useIndicatorPadding: menu && menu.existsChecked || false implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset padding: DS.Style.control.padding spacing: DS.Style.control.spacing opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 icon { height: DS.Style.menu.item.iconSize.height width: DS.Style.menu.item.iconSize.height } property D.Palette textColor: control.highlighted ? DS.Style.checkedButton.text : DS.Style.menu.itemText property D.Palette subMenuBackgroundColor: DS.Style.menu.subMenuOpenedBackground palette.windowText: D.ColorSelector.textColor D.DciIcon.mode: D.ColorSelector.controlState D.DciIcon.theme: D.ColorSelector.controlTheme D.DciIcon.palette: D.DTK.makeIconPalette(palette) contentItem: D.IconLabel { readonly property real arrowPadding: control.subMenu && control.arrow ? control.arrow.width + control.spacing : 0 readonly property real indicatorPadding: control.useIndicatorPadding && control.indicator ? control.indicator.width + control.spacing : 0 leftPadding: !control.mirrored ? indicatorPadding : arrowPadding rightPadding: control.mirrored ? indicatorPadding : arrowPadding spacing: control.spacing mirrored: control.mirrored display: control.display alignment: Qt.AlignLeft text: control.text font: control.font color: control.palette.windowText icon: D.DTK.makeIcon(control.icon, control.D.DciIcon) } indicator: Loader { width: DS.Style.menu.item.iconSize.width height: DS.Style.menu.item.iconSize.height active: control.checked anchors { left: control.left leftMargin: control.mirrored ? control.width - width - control.rightPadding : control.leftPadding verticalCenter: parent.verticalCenter } sourceComponent: D.DciIcon { sourceSize: Qt.size(DS.Style.menu.item.iconSize.width, DS.Style.menu.item.iconSize.height) name: "menu_select" palette: control.D.DciIcon.palette mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } } arrow: Loader { width: DS.Style.menu.item.iconSize.width height: DS.Style.menu.item.iconSize.height active: control.subMenu anchors { right: parent.right rightMargin: control.mirrored ? control.width - width - control.rightPadding : control.rightPadding verticalCenter: parent.verticalCenter } sourceComponent: D.DciIcon { sourceSize: Qt.size(DS.Style.menu.item.iconSize.width, DS.Style.menu.item.iconSize.height) mirror: control.mirrored name: "menu_arrow" palette: control.D.DciIcon.palette mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } } background: Item { implicitWidth: DS.Style.menu.item.width implicitHeight: DS.Style.menu.item.height Loader { anchors.fill: parent active: !control.hovered && control.subMenu && control.subMenu.opened sourceComponent: Rectangle { color: control.D.ColorSelector.subMenuBackgroundColor radius: DS.Style.control.radius } } Loader { anchors.fill: parent active: control.down || control.highlighted sourceComponent: HighlightPanel {} } } } dtkdeclarative-5.7.12/src/qml/MenuSeparator.qml000066400000000000000000000030341476226662700214760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.MenuSeparator { id: control property string text property bool __lineStyle: control.text === "" property D.Palette textColor: DS.Style.menu.separatorText implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentItem.implicitHeight + topPadding + bottomPadding) topPadding: __lineStyle ? DS.Style.menu.separator.lineTopPadding : DS.Style.menu.separator.topPadding bottomPadding: __lineStyle ? DS.Style.menu.separator.lineBottomPadding : DS.Style.menu.separator.bottomPadding contentItem: Loader { sourceComponent: __lineStyle ? lineCom : titleCom Component { id: lineCom Rectangle { property D.Palette separatorColor: DS.Style.menu.separator.lineColor width: control.parent.width implicitHeight: DS.Style.menu.separator.lineHeight color: D.ColorSelector.separatorColor } } Component { id: titleCom Text { text: control.text font: D.DTK.fontManager.t8 color: control.D.ColorSelector.textColor } } } } dtkdeclarative-5.7.12/src/qml/OutsideBoxBorder.qml000066400000000000000000000010351476226662700221330ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 Item { property real borderWidth: 1 property color color: "white" property real radius: 0 Rectangle { id: rect color: "transparent" radius: parent.radius + border.width anchors { fill: parent margins: -border.width } border { width: borderWidth color: parent.color } } } dtkdeclarative-5.7.12/src/qml/PageIndicator.qml000066400000000000000000000022331476226662700214220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.style 1.0 as DS T.PageIndicator { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentItem.implicitHeight + topPadding + bottomPadding) padding: DS.Style.control.padding spacing: DS.Style.control.padding delegate: Rectangle { implicitWidth: DS.Style.pageIndicator.width implicitHeight: DS.Style.pageIndicator.height radius: width / 2 color: control.enabled ? control.palette.highlight : "gray" opacity: index === currentIndex ? 0.95 : pressed ? 0.7 : 0.45 Behavior on opacity { OpacityAnimator { duration: 100 } } } contentItem: Row { spacing: control.spacing Repeater { model: control.count delegate: control.delegate } } } dtkdeclarative-5.7.12/src/qml/Pane.qml000066400000000000000000000005271476226662700176000ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Templates 2.4 as T import org.deepin.dtk.style 1.0 as DS T.Pane { id: control implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) } dtkdeclarative-5.7.12/src/qml/PasswordEdit.qml000066400000000000000000000023351476226662700213240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS LineEdit { id: control // 暴露给外部的属性 readonly property bool isEchoMode: control.echoMode === TextInput.Normal property alias echoButtonVisible: echoButton.visible function toggleEchoMode() { if (control.isEchoMode) { control.echoMode = TextInput.Password } else { control.echoMode = TextInput.Normal } } echoMode: TextInput.Password clearButton.anchors.rightMargin: echoButton.visible ? DS.Style.passwordEdit.echoActionSpacing + echoButton.width : 0 ActionButton { id: echoButton anchors { right: control.right rightMargin: DS.Style.passwordEdit.echoActionSpacing verticalCenter: control.verticalCenter } width: height focusPolicy: Qt.NoFocus onClicked: control.toggleEchoMode() icon.name: control.isEchoMode ? "entry_password_shown" : "entry_password_hide" } } dtkdeclarative-5.7.12/src/qml/PlaceholderText.qml000066400000000000000000000004031476226662700217750ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Controls 2.4 import QtQuick.Controls.impl 2.4 as I I.PlaceholderText { elide: Text.ElideRight } dtkdeclarative-5.7.12/src/qml/PlusMinusSpinBox.qml000066400000000000000000000040751476226662700221610ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.style 1.0 as DS FocusScope { id: control // Default SpinBox Properties property alias spinBox: spinBoxControl // Button Visible Properties property alias upButtonVisible: plusButton.active property alias downButtonVisible: minusButton.active property alias resetButtonVisible: resetButton.active implicitWidth: DS.Style.spinBox.width implicitHeight: DS.Style.spinBox.height RowLayout { anchors.fill: parent spacing: DS.Style.spinBox.spacing SpinBox { id: spinBoxControl Layout.fillWidth: true up.indicator: null down.indicator: null } Loader { id: plusButton active: true sourceComponent: IconButton { implicitWidth: DS.Style.spinBox.height implicitHeight: DS.Style.spinBox.height focusPolicy: Qt.NoFocus icon.name: "action_add" icon.width: 16 onClicked: spinBoxControl.increase() } } Loader { id: minusButton active: true sourceComponent: IconButton { implicitWidth: DS.Style.spinBox.height implicitHeight: DS.Style.spinBox.height focusPolicy: Qt.NoFocus icon.name: "action_reduce" icon.width: 16 onClicked: spinBoxControl.decrease() } } Loader { id: resetButton active: false sourceComponent: IconButton { implicitWidth: DS.Style.spinBox.height implicitHeight: DS.Style.spinBox.height focusPolicy: Qt.NoFocus icon.name: "action_reset" icon.width: 16 onClicked: { spinBoxControl.value = 0 } } } } } dtkdeclarative-5.7.12/src/qml/Popup.qml000066400000000000000000000016651476226662700200240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.Popup { id: control property bool closeOnInactive: true readonly property bool active: parent && parent.Window.active implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) padding: DS.Style.popup.padding background: Loader { active: !control.D.PopupHandle.window sourceComponent: FloatingPanel { implicitHeight: DS.Style.popup.height implicitWidth: DS.Style.popup.width radius: DS.Style.popup.radius } } onActiveChanged: { if (!active && closeOnInactive) { control.close() } } } dtkdeclarative-5.7.12/src/qml/PopupWindow.qml000066400000000000000000000006721476226662700212110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import org.deepin.dtk.impl 1.0 as D Window { property alias blurControl: behindBlur.control flags: Qt.Popup D.DWindow.enabled: true D.DWindow.enableBlurWindow: true StyledBehindWindowBlur { id: behindBlur anchors.fill: parent } } dtkdeclarative-5.7.12/src/qml/ProgressBar.qml000066400000000000000000000014201476226662700211370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.style 1.0 as DS import "private" T.ProgressBar { id: control property string formatText property bool animationStop: false implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) contentItem: ProgressBarImpl { progressBar: control formatText: control.formatText animationStop: control.animationStop } background: ProgressBarPanel { implicitWidth: DS.Style.progressBar.width implicitHeight: DS.Style.progressBar.height progressBar: control } } dtkdeclarative-5.7.12/src/qml/QuitAction.qml000066400000000000000000000003461476226662700207740ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 Action { id: quitAction text: qsTr("Exit") onTriggered: Qt.quit() } dtkdeclarative-5.7.12/src/qml/RadioButton.qml000066400000000000000000000051261476226662700211470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.RadioButton { id: control implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset padding: DS.Style.control.padding spacing: DS.Style.radioButton.spacing topPadding: DS.Style.radioButton.topPadding bottomPadding: DS.Style.radioButton.bottomPadding opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 D.DciIcon.mode: D.ColorSelector.controlState D.DciIcon.theme: D.ColorSelector.controlTheme icon { width: DS.Style.radioButton.iconSize height: DS.Style.radioButton.iconSize } indicator: Item { x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2 y: control.topPadding + (control.availableHeight - height) / 2 implicitWidth: DS.Style.radioButton.indicatorSize implicitHeight: implicitWidth D.DciIcon { anchors.centerIn: parent palette: control.D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: control.checked ? "radio_checked" : "radio_unchecked" sourceSize: Qt.size(control.icon.width, control.icon.height) fallbackToQIcon: false } Loader { active: control.activeFocus anchors.centerIn: parent sourceComponent: D.DciIcon { palette: control.D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: "radio_focus" sourceSize: Qt.size(control.icon.width, control.icon.height) fallbackToQIcon: false } } } contentItem: Text { leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0 rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0 text: control.text font: control.font elide: Text.ElideRight verticalAlignment: Text.AlignVCenter color: control.palette.windowText } } dtkdeclarative-5.7.12/src/qml/RecommandButton.qml000066400000000000000000000003761476226662700220200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Button { id: control highlighted: true } dtkdeclarative-5.7.12/src/qml/RectangularShadow.qml000066400000000000000000000036411476226662700223320ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk.impl 1.0 as D Item { id: rootItem /*! This property defines the offset of the shadow in the x-axis direction. */ property real offsetX: 0.0 /*! This property defines the offset of the shadow in the y-axis direction. */ property real offsetY: 0.0 /*! This property defines how many pixels outside(or inside) the item area are reached by the shadow. */ property real glowRadius: 0.0 /*! This property defines how large part of the shadow color is strengthened near the source edges. */ property real spread: 0.0 /*! This property defines the the shadow color. */ property color color: "black" /*! This property defines corners size of the control that draws the shadow. */ property real cornerRadius: glowRadius /*! This property defines does the shadow fill the entire area. */ property alias fill: effct.fill D.GlowEffect { id: effct property real inverseSpread: 1.0 - rootItem.spread property real cornerRadius: { var maxCornerRadius = Math.min(rootItem.width, rootItem.height) / 2 + rootItem.glowRadius; return Math.max(0, Math.min(rootItem.cornerRadius + rootItem.glowRadius, maxCornerRadius)) } x: (parent.width - width) / 2.0 + offsetX y: (parent.height - height) / 2.0 + offsetY width: parent.width + rootItem.glowRadius * 2 + cornerRadius * 2 height: parent.height + rootItem.glowRadius * 2 + cornerRadius * 2 color: rootItem.color spread: rootItem.spread / 2.0 glowRadius: rootItem.glowRadius * 1 + cornerRadius * 2 relativeSizeX: ((inverseSpread * inverseSpread) * rootItem.glowRadius + cornerRadius * 2.0) / width relativeSizeY: relativeSizeX * (width / height) } } dtkdeclarative-5.7.12/src/qml/RoundButton.qml000066400000000000000000000002251476226662700211730ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later FloatingButton { } dtkdeclarative-5.7.12/src/qml/ScrollBar.qml000066400000000000000000000063771476226662700206110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.ScrollBar { id: control implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) padding: DS.Style.scrollBar.padding visible: control.policy !== T.ScrollBar.AlwaysOff state: "hide" states: [ State { name: "hide" when: control.policy === T.ScrollBar.AlwaysOff || !control.active || control.size >= 1.0 PropertyChanges { target: control.contentItem implicitWidth: DS.Style.scrollBar.width opacity: DS.Style.scrollBar.hideOpacity } }, State { name: "normal" property bool moving: control.active && !control.pressed && !control.hovered when: control.policy === T.ScrollBar.AlwaysOn || ( moving && control.size < 1.0) PropertyChanges { target: control.contentItem implicitWidth: DS.Style.scrollBar.width } }, State { name: "hover" when: control.policy === T.ScrollBar.AlwaysOn || ( control.hovered && !control.pressed && control.size < 1.0) PropertyChanges { target: control.contentItem implicitWidth: DS.Style.scrollBar.activeWidth } }, State { name: "active" when: control.policy === T.ScrollBar.AlwaysOn || (control.pressed && control.size < 1.0) PropertyChanges { target: control.contentItem implicitWidth: DS.Style.scrollBar.activeWidth } } ] transitions: Transition { to: "hide" SequentialAnimation { PauseAnimation { duration: DS.Style.scrollBar.hidePauseDuration } NumberAnimation { target: control.contentItem; duration: DS.Style.scrollBar.hideDuration; property: "opacity"; to:DS.Style.scrollBar.hideOpacity } } } contentItem: Item { id: content property D.Palette backgroundColor: DS.Style.scrollBar.background property D.Palette insideBorderColor: DS.Style.scrollBar.insideBorder property D.Palette outsideBorderColor: DS.Style.scrollBar.outsideBorder implicitWidth: DS.Style.scrollBar.width implicitHeight: implicitWidth Rectangle { id: backgroundRect anchors.fill: parent radius: control.orientation == Qt.Horizontal ? control.height / 2 : control.width / 2 color: content.D.ColorSelector.backgroundColor } InsideBoxBorder { anchors.fill: backgroundRect radius: backgroundRect.radius color: content.D.ColorSelector.insideBorderColor borderWidth: DS.Style.control.borderWidth } OutsideBoxBorder { anchors.fill: backgroundRect radius: backgroundRect.radius color: content.D.ColorSelector.outsideBorderColor borderWidth: DS.Style.control.borderWidth } } } dtkdeclarative-5.7.12/src/qml/ScrollIndicator.qml000066400000000000000000000003101476226662700217760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T T.ScrollIndicator { } dtkdeclarative-5.7.12/src/qml/ScrollView.qml000066400000000000000000000002471476226662700210050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 ScrollView { } dtkdeclarative-5.7.12/src/qml/SearchEdit.qml000066400000000000000000000063701476226662700207320ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS LineEdit { id: control property alias placeholder: centerIndicatorLabel.text property bool editting: control.activeFocus || (text.length !== 0) leftPadding: (editting) ? searchIcon.width + DS.Style.searchEdit.iconLeftMargin + DS.Style.searchEdit.iconRightMargin : 0 // The search background will be hidden in the focus state, // no text input and displayed in the non focus state. Item { id: searchBackground anchors.fill: parent RowLayout { id: centerIndicator spacing: DS.Style.control.spacing // Search Icon D.DciIcon { id: searchIcon name: "action_search" sourceSize.width: DS.Style.searchEdit.iconSize palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } Text { id: centerIndicatorLabel text: qsTr("Search") font: control.font verticalAlignment: Text.AlignVCenter } } MouseArea { anchors.fill: parent visible: !editting onClicked: { control.forceActiveFocus(Qt.MouseFocusReason) mouse.accepted = false } } state: "NONEDIT" states: [ State { name: "EDITTING" when: editting AnchorChanges { target: centerIndicator anchors.left: searchBackground.left anchors.verticalCenter: searchBackground.verticalCenter } PropertyChanges { target: centerIndicator anchors.leftMargin: DS.Style.searchEdit.iconLeftMargin } PropertyChanges { target: centerIndicatorLabel color: "transparent" } }, State { name: "NONEDIT" when: !editting AnchorChanges { target: centerIndicator anchors.horizontalCenter: searchBackground.horizontalCenter anchors.verticalCenter: searchBackground.verticalCenter } PropertyChanges { target: centerIndicatorLabel color: control.D.ColorSelector.placeholderTextColor } } ] transitions: Transition { AnchorAnimation { duration: DS.Style.searchEdit.animationDuration easing.type: Easing.OutCubic } ColorAnimation { duration: DS.Style.searchEdit.animationDuration easing.type: Easing.OutCubic } } } } dtkdeclarative-5.7.12/src/qml/Slider.qml000066400000000000000000000123571476226662700201430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Shapes 1.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.Slider { id: control enum HandleType { NoArrowHorizontal = 0, NoArrowVertical = 1, ArrowUp = 2, ArrowLeft = 3, ArrowBottom = 4, ArrowRight = 5 } property D.Palette grooveColor: DS.Style.slider.groove.background property alias handleType: __handle.type property real dashOffset: 0.0 property var dashPattern: [0.5, 0.25] property bool highlightedPassedGroove: false implicitWidth: Math.max(background ? background.implicitWidth : 0, (handle ? handle.implicitWidth : 0) + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, (handle ? handle.implicitHeight : 0) + topPadding + bottomPadding) opacity: control.D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 // draw handle handle: SliderHandle { id: __handle x: control.leftPadding + (control.horizontal ? control.visualPosition * (control.availableWidth - width) : 0) y: control.topPadding + (control.horizontal ? 0 : control.visualPosition * (control.availableHeight - height)) width: control.horizontal ? DS.Style.slider.handle.width : DS.Style.slider.handle.height height: control.horizontal ? DS.Style.slider.handle.height : DS.Style.slider.handle.width palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme } // draw panel background: Item { anchors { horizontalCenter: !control.horizontal ? control.handle.horizontalCenter : undefined verticalCenter: control.horizontal ? control.handle.verticalCenter : undefined } implicitWidth: control.horizontal ? DS.Style.slider.width : handle.width implicitHeight: control.horizontal ? handle.height : DS.Style.slider.height // draw groove Item { id: sliderGroove x: control.horizontal ? 0 : (parent.width - width) / 2 y: control.horizontal ? (parent.height - height) / 2 : 0 width: control.horizontal ? parent.width : DS.Style.slider.groove.height height: control.horizontal ? DS.Style.slider.groove.height : parent.height Shape { ShapePath { capStyle: ShapePath.FlatCap strokeStyle: ShapePath.DashLine strokeColor: control.D.ColorSelector.grooveColor strokeWidth: control.horizontal ? sliderGroove.height : sliderGroove.width dashOffset: control.dashOffset dashPattern: control.dashPattern startX: control.horizontal ? 0 : sliderGroove.width / 2 startY: control.horizontal ? sliderGroove.height / 2 : 0 PathLine { x: control.horizontal ? sliderGroove.width : sliderGroove.width / 2 y: control.horizontal ? sliderGroove.height / 2 : sliderGroove.height } } } // draw passed groove area Loader { active: highlightedPassedGroove sourceComponent: Shape { ShapePath { capStyle: ShapePath.FlatCap strokeStyle: ShapePath.DashLine strokeColor: control.palette.highlight strokeWidth: control.horizontal ? sliderGroove.height : sliderGroove.width dashOffset: control.dashOffset dashPattern: control.dashPattern startX: control.horizontal ? 0 : sliderGroove.width / 2 startY: control.horizontal ? sliderGroove.height / 2 : sliderGroove.height PathLine { x: control.horizontal ? control.handle.x : sliderGroove.width / 2 y: control.horizontal ? sliderGroove.height / 2 : control.handle.y + control.handle.height / 2 } } Item { id: passItem y: control.horizontal ? -DS.Style.slider.groove.height / 2 : control.handle.y + control.handle.height / 2 height: control.horizontal ? DS.Style.slider.groove.height : sliderGroove.height - control.handle.y - control.handle.height / 2 width: control.horizontal ? control.handle.x : DS.Style.slider.groove.height } BoxShadow { anchors.fill: passItem shadowBlur: 4 shadowOffsetY: 2 shadowColor: control.palette.highlight rotation: control.horizontal ? 0 : 180 opacity: 0.25 } } } } } } dtkdeclarative-5.7.12/src/qml/SliderHandle.qml000066400000000000000000000020331476226662700212450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D D.DciIcon { id: control property int type: Slider.HandleType.NoArrowHorizontal function getIconNameByType(handleType) { switch(handleType) { case Slider.HandleType.NoArrowHorizontal: return "slider_round_hor" case Slider.HandleType.NoArrowVertical: return "slider_round_ver" case Slider.HandleType.ArrowUp: return "slider_point_up" case Slider.HandleType.ArrowBottom: return "slider_point_down" case Slider.HandleType.ArrowLeft: return "slider_point_left" case Slider.HandleType.ArrowRight: return "slider_point_left" } } sourceSize.width: control.width sourceSize.height: control.height name: getIconNameByType(type) mirror: Slider.HandleType.ArrowRight === control.type fallbackToQIcon: false } dtkdeclarative-5.7.12/src/qml/SliderTipItem.qml000066400000000000000000000067231476226662700214370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { id: control property string text property int textHorizontalAlignment: Text.AlignHCenter readonly property int direction: parent.parent.tickDirection readonly property bool horizontal: parent.parent.children[0].horizontal property bool highlight property D.Palette tickColor: DS.Style.slider.tick.background property D.Palette textColor: highlight ? DS.Style.checkedButton.text: DS.Style.button.text implicitWidth: horizontal ? DS.Style.slider.tick.width : __rect.width + __label.width implicitHeight: horizontal ? __rect.height + __label.height: DS.Style.slider.tick.width Rectangle { id: __rect anchors.bottom: horizontal ? (TipsSlider.TickDirection.Front === direction ? parent.bottom : undefined) : undefined anchors.right: horizontal ? undefined : (TipsSlider.TickDirection.Front === direction ? parent.right : undefined) anchors.left: horizontal ? undefined : (TipsSlider.TickDirection.Back === direction ? parent.left : undefined) width: horizontal ? DS.Style.slider.tick.width : DS.Style.slider.tick.height height: horizontal ? DS.Style.slider.tick.height : DS.Style.slider.tick.width color: control.D.ColorSelector.tickColor } Loader { id: __label active: text.length !== 0 anchors { top: horizontal ? (TipsSlider.TickDirection.Back === direction ? __rect.bottom : undefined) : undefined topMargin: horizontal && (TipsSlider.TickDirection.Back === direction) ? DS.Style.slider.tick.vPadding : undefined bottom: horizontal ? (TipsSlider.TickDirection.Front === direction ? __rect.top : undefined) : undefined bottomMargin: horizontal && (TipsSlider.TickDirection.Front === direction) ? DS.Style.slider.tick.vPadding : undefined left: horizontal ? (Text.AlignLeft === textHorizontalAlignment ? __rect.left : undefined) : (TipsSlider.TickDirection.Back === direction ? __rect.right : undefined) leftMargin: !horizontal && TipsSlider.TickDirection.Back === direction ? DS.Style.slider.tick.hPadding : undefined right: horizontal ? (Text.AlignRight === textHorizontalAlignment ? __rect.right : undefined) : (TipsSlider.TickDirection.Front === direction ? __rect.left : undefined) rightMargin: !horizontal && TipsSlider.TickDirection.Front === direction ? DS.Style.slider.tick.hPadding : undefined horizontalCenter: horizontal && Text.AlignHCenter === textHorizontalAlignment ? __rect.horizontalCenter : undefined verticalCenter: horizontal ? undefined : __rect.verticalCenter } sourceComponent: Label { text: control.text rightPadding: highlight ? DS.Style.slider.tick.hPadding : 0 leftPadding: rightPadding topPadding: highlight ? DS.Style.slider.tick.vPadding : 0 bottomPadding: topPadding horizontalAlignment: textHorizontalAlignment verticalAlignment: Text.AlignVCenter palette.windowText: control.D.ColorSelector.textColor background: Loader { active: highlight sourceComponent: HighlightPanel { } } } } } dtkdeclarative-5.7.12/src/qml/SortFilterModel.qml000066400000000000000000000027631476226662700217770ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQml.Models 2.11 DelegateModel { id: delegateModel property var lessThan: function(left, right) { return true; } property var filterAcceptsItem: function(item) { return true; } property alias visibleGroup: visibleItems function update() { if (items.count > 0) { items.setGroups(0, items.count, "items"); } // Step 1: Filter items var visible = []; for (var i = 0; i < items.count; ++i) { var item = items.get(i); if (filterAcceptsItem(item.model)) { visible.push(item); } } // Step 2: Sort the list of visible items if (lessThan) { visible.sort(function(a, b) { return lessThan(a.model, b.model) ? -1 : 1; }); } // Step 3: Add all items to the visible group: for (i = 0; i < visible.length; ++i) { item = visible[i]; item.inVisible = true; if (item.visibleIndex !== i) { visibleItems.move(item.visibleIndex, i, 1); } } } items.onChanged: update() onLessThanChanged: update() onFilterAcceptsItemChanged: update() groups: DelegateModelGroup { id: visibleItems name: "visible" includeByDefault: false } filterOnGroup: "visible" } dtkdeclarative-5.7.12/src/qml/SpinBox.qml000066400000000000000000000062751476226662700203050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.style 1.0 as DS T.SpinBox { id: control // alert control properties property alias alertText: panel.alertText property alias alertDuration: panel.alertDuration property alias showAlert: panel.showAlert implicitWidth: { var content = control.implicitContentWidth !== undefined ? control.implicitContentWidth : (control.contentItem ? control.contentItem.implicitWidth : 0) content += 2 * control.padding + (up.indicator ? up.indicator.implicitWidth : 0) + (down.indicator ? down.indicator.implicitWidth : 0) return Math.max(DS.Style.control.backgroundImplicitWidth(control), content) } implicitHeight: Math.max(DS.Style.control.implicitHeight(control), up.indicator ? up.indicator.implicitHeight : 0, down.indicator ? down.indicator.implicitHeight : 0) baselineOffset: contentItem.y + contentItem.baselineOffset padding: 0 rightPadding: padding + ((down.indicator ? (down.indicator.width + DS.Style.spinBox.spacing) : (up.indicator ? (up.indicator.width + DS.Style.spinBox.spacing) : 0))) validator: IntValidator { locale: control.locale.name bottom: Math.min(control.from, control.to) top: Math.max(control.from, control.to) } background: EditPanel { id: panel control: control implicitWidth: DS.Style.spinBox.width implicitHeight: DS.Style.spinBox.height } contentItem: TextInput { text: control.displayText font: control.font color: control.palette.text selectionColor: control.palette.highlight selectedTextColor: control.palette.highlightedText horizontalAlignment: Qt.AlignLeft verticalAlignment: Qt.AlignVCenter leftPadding: DS.Style.spinBox.spacing readOnly: !control.editable validator: control.validator inputMethodHints: control.inputMethodHints selectByMouse: control.editable } up.indicator: SpinBoxIndicator { anchors { right: control.right rightMargin: DS.Style.spinBox.indicatorSpacing top: control.top topMargin: control.height / 2 - (down.indicator ? height : height / 2) } direction: SpinBoxIndicator.IndicatorDirection.UpIndicator singleIndicator: down.indicator pressed: up.pressed spinBox: control } down.indicator: SpinBoxIndicator { anchors { right: control.right rightMargin: DS.Style.spinBox.indicatorSpacing bottom: control.bottom bottomMargin: control.height / 2 - (up.indicator ? height : height / 2) } direction: SpinBoxIndicator.IndicatorDirection.DownIndicator singleIndicator: up.indicator pressed: down.pressed spinBox: control } } dtkdeclarative-5.7.12/src/qml/SpinBoxIndicator.qml000066400000000000000000000077631476226662700221450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { id: control enum IndicatorDirection { UpIndicator = 0, DownIndicator = 1 } property Item spinBox property bool pressed property bool singleIndicator: false property int direction property D.Palette inactiveBackgroundColor: DS.Style.spinBox.indicator.background palette.windowText: control.D.ColorSelector.inactiveBackgroundColor hoverEnabled: true implicitWidth: DS.Style.spinBox.indicator.width implicitHeight: spinBox.activeFocus ? spinBox.implicitHeight / 2 : DS.Style.spinBox.indicator.height opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 Component { id: inactiveComponent D.DciIcon { id: icon sourceSize.width: DS.Style.spinBox.indicator.iconSize palette: D.DTK.makeIconPalette(control.palette) name: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? "entry_spinbox_up" : "entry_spinbox_down" mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } } Component { id: activeComponent Item { Item { id: btnBackground width: parent.width + DS.Style.control.radius height: parent.height + DS.Style.control.radius anchors { right: parent.right top: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? parent.top : undefined bottom: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? undefined : parent.bottom } Button { id: btn anchors { right: parent.right top: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? parent.top : undefined bottom: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? undefined : parent.bottom } width: DS.Style.spinBox.indicatorWidth height: spinBox.implicitHeight / 2 icon { name: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? "arrow_ordinary_up" : "arrow_ordinary_down" width: DS.Style.spinBox.indicator.focusIconSize height: DS.Style.spinBox.indicator.focusIconSize } activeFocusOnTab: false opacity: 1 background: ButtonPanel { button: btn radius: 0 } onClicked: { if (direction === SpinBoxIndicator.IndicatorDirection.UpIndicator) { spinBox.increase() } else { spinBox.decrease() } } } } D.ItemViewport { id: viewport sourceItem: btnBackground radius: DS.Style.control.radius fixed: true width: btnBackground.width height: btnBackground.height anchors { right: parent.right top: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? parent.top : undefined bottom: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? undefined : parent.bottom } hideSource: true } } } Loader { anchors.fill: parent sourceComponent: spinBox.activeFocus ? activeComponent : inactiveComponent } } dtkdeclarative-5.7.12/src/qml/StackView.qml000066400000000000000000000052731476226662700206200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.style 1.0 as DS T.StackView { id: control popEnter: Transition { // slide_in_left NumberAnimation { property: "x"; from: (control.mirrored ? -0.5 : 0.5) * -control.width; to: 0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } } popExit: Transition { // slide_out_right NumberAnimation { property: "x"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * control.width; duration: DS.Style.stackView.animationDuration; easing.type: Easing.OutCubic } NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } } pushEnter: Transition { // slide_in_right NumberAnimation { property: "x"; from: (control.mirrored ? -0.5 : 0.5) * control.width; to: 0; duration: DS.Style.stackView.animationDuration; easing.type: Easing.OutCubic } NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } } pushExit: Transition { // slide_out_left NumberAnimation { property: "x"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * -control.width; duration: DS.Style.stackView.animationDuration; easing.type: Easing.OutCubic } NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } } replaceEnter: Transition { // slide_in_right NumberAnimation { property: "x"; from: (control.mirrored ? -0.5 : 0.5) * control.width; to: 0; duration: DS.Style.stackView.animationDuration; easing.type: Easing.OutCubic } NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } } replaceExit: Transition { // slide_out_left NumberAnimation { property: "x"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * -control.width; duration: DS.Style.stackView.animationDuration; easing.type: Easing.OutCubic } NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } } } dtkdeclarative-5.7.12/src/qml/StyledArrowShapeWindow.qml000066400000000000000000000012021476226662700233340ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS ArrowShapeWindow { property alias control: blur.control D.DWindow.borderColor: DS.Style.control.selectColor((control ? control.palette.window : undefined), DS.Style.arrowRectangleBlur.borderColor, DS.Style.arrowRectangleBlur.darkBorderColor) StyledBehindWindowBlur { id: blur anchors.fill: parent } } dtkdeclarative-5.7.12/src/qml/StyledBehindWindowBlur.qml000066400000000000000000000015141476226662700233050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS D.BehindWindowBlur { // maybe is a ApplicationWindow or Control property var control blendColor: { if (valid) { return DS.Style.control.selectColor(control ? control.palette.window :undefined, DS.Style.behindWindowBlur.lightColor, DS.Style.behindWindowBlur.darkColor) } return DS.Style.control.selectColor(control ? control.palette.window :undefined, DS.Style.behindWindowBlur.lightNoBlurColor, DS.Style.behindWindowBlur.darkNoBlurColor) } } dtkdeclarative-5.7.12/src/qml/SwipeDelegate.qml000066400000000000000000000002521476226662700214320ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 SwipeDelegate { } dtkdeclarative-5.7.12/src/qml/SwipeView.qml000066400000000000000000000002461476226662700206350ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 SwipeView { } dtkdeclarative-5.7.12/src/qml/Switch.qml000066400000000000000000000053711476226662700201600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.Switch { id: control property D.Palette backgroundColor: DS.Style.switchButton.background property D.Palette handleColor: DS.Style.switchButton.handle implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset topPadding: DS.Style.control.vPadding bottomPadding: DS.Style.control.vPadding spacing: DS.Style.control.spacing indicator: Rectangle { implicitWidth: DS.Style.switchButton.indicatorWidth implicitHeight: DS.Style.switchButton.indicatorHeight x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2 y: control.topPadding + (control.availableHeight - height) / 2 radius: DS.Style.control.radius color: control.D.ColorSelector.backgroundColor opacity: control.D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 D.DciIcon { id: handle x: Math.max(0, Math.min(parent.width - width, control.visualPosition * parent.width - (width / 2))) y: (parent.height - height) / 2 width: DS.Style.switchButton.handleWidth height: DS.Style.switchButton.handleHeight sourceSize: Qt.size(DS.Style.switchButton.handleWidth, DS.Style.switchButton.handleHeight) name: DS.Style.switchButton.iconName opacity: control.D.ColorSelector.controlState === D.DTK.DisabledState && control.checked ? 0.4 : 1 palette { highlight: control.checked ? control.palette.highlight : control.D.ColorSelector.handleColor highlightForeground: control.palette.highlightedText foreground: control.palette.windowText background: control.palette.window } mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false Behavior on x { enabled: !control.down SmoothedAnimation { velocity: 200 } } } } contentItem: Label { leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0 rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0 text: control.text verticalAlignment: Text.AlignVCenter } } dtkdeclarative-5.7.12/src/qml/TabBar.qml000066400000000000000000000002431476226662700200430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.4 TabBar { } dtkdeclarative-5.7.12/src/qml/TextArea.qml000066400000000000000000000034321476226662700204300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Controls.impl 2.4 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.TextArea { id: control property D.Palette placeholderTextColor: DS.Style.edit.placeholderText implicitWidth: Math.max(DS.Style.control.implicitWidth(control), placeholder.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(DS.Style.control.implicitHeight(control), placeholder.implicitHeight + topPadding + bottomPadding) padding: DS.Style.control.padding color: palette.text selectionColor: palette.highlight selectedTextColor: palette.highlightedText onEffectiveHorizontalAlignmentChanged: placeholder.effectiveHorizontalAlignmentChanged() Loader { id: placeholder active: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter) x: control.leftPadding y: control.topPadding width: control.width - (control.leftPadding + control.rightPadding) height: control.height - (control.topPadding + control.bottomPadding) signal effectiveHorizontalAlignmentChanged sourceComponent: PlaceholderText { text: control.placeholderText font: control.font color: control.D.ColorSelector.placeholderTextColor verticalAlignment: control.verticalAlignment elide: Text.ElideRight renderType: control.renderType } } background: EditPanel { control: control implicitWidth: DS.Style.edit.width implicitHeight: DS.Style.edit.textAreaHeight } } dtkdeclarative-5.7.12/src/qml/TextField.qml000066400000000000000000000074511476226662700206100ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.TextField { id: control property D.Palette placeholderTextColor: DS.Style.edit.placeholderText property alias backgroundColor: panel.backgroundColor // alert control properties property alias alertText: panel.alertText property alias alertDuration: panel.alertDuration property alias showAlert: panel.showAlert implicitWidth: Math.max(DS.Style.control.implicitWidth(control), placeholderText ? placeholder.implicitWidth + leftPadding + rightPadding : 0) || contentWidth + leftPadding + rightPadding implicitHeight: Math.max(DS.Style.control.implicitHeight(control), placeholder.implicitHeight + topPadding + bottomPadding) padding: DS.Style.control.padding color: control.palette.text opacity: enabled ? 1 : 0.4 selectionColor: control.palette.highlight selectedTextColor: control.palette.highlightedText verticalAlignment: TextInput.AlignVCenter onEffectiveHorizontalAlignmentChanged: placeholder.effectiveHorizontalAlignmentChanged() Loader { id: placeholder active: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter) x: control.leftPadding y: control.topPadding width: control.width - (control.leftPadding + control.rightPadding) height: control.height - (control.topPadding + control.bottomPadding) signal effectiveHorizontalAlignmentChanged sourceComponent: PlaceholderText { text: control.placeholderText font: control.font color: control.D.ColorSelector.placeholderTextColor verticalAlignment: control.verticalAlignment renderType: control.renderType } } background: EditPanel { id: panel control: control implicitWidth: DS.Style.edit.width implicitHeight: DS.Style.edit.textFieldHeight } MouseArea { anchors.fill: parent acceptedButtons: Qt.RightButton onClicked: function (mouse) { var point = Qt.point(mouse.x, mouse.y) if (Window.window && Window.window.width > Screen.desktopAvailableWidth) { point.x = control.mapFromGlobal(Screen.desktopAvailableWidth - contextMenu.width).x } if (Window.window && Window.window.height > Screen.desktopAvailableHeight) { point.y = control.mapFromGlobal(0, Screen.desktopAvailableHeight - contextMenu.height).y } contextMenu.popup(point.x, point.y) } } Menu { id: contextMenu MenuItem { text: qsTr("Copy") onTriggered: control.copy() enabled: control.selectedText.length } MenuItem { text: qsTr("Cut") onTriggered: control.cut() enabled: control.selectedText.length } MenuItem { text: qsTr("Paste") onTriggered: control.paste() enabled: control.canPaste } MenuItem { text: qsTr("Select All") onTriggered: control.selectAll() enabled: control.text.length } MenuItem { text: qsTr("Undo") onTriggered: control.undo() enabled: control.canUndo } MenuItem { text: qsTr("Redo") onTriggered: control.redo() enabled: control.canRedo } } } dtkdeclarative-5.7.12/src/qml/ThemeMenu.qml000066400000000000000000000022331476226662700206000ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D Menu { id: control title: qsTr("Theme") readonly property bool __checkedUnknowType : D.ApplicationHelper.paletteType === D.ApplicationHelper.UnknownType ActionGroup { id: themeEG exclusive: true onTriggered: { D.ApplicationHelper.setPaletteType(action.themeType) } } Action { text: qsTr("Light Theme") readonly property int themeType: D.ApplicationHelper.LightType checked: !__checkedUnknowType && D.DTK.themeType === themeType ActionGroup.group: themeEG } Action { text: qsTr("Dark Theme") readonly property int themeType: D.ApplicationHelper.DarkType checked: !__checkedUnknowType && D.DTK.themeType === themeType ActionGroup.group: themeEG } Action { text: qsTr("System Theme") readonly property int themeType: D.ApplicationHelper.UnknownType checked: __checkedUnknowType ActionGroup.group: themeEG } } dtkdeclarative-5.7.12/src/qml/TipsSlider.qml000066400000000000000000000047471476226662700210070ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { enum TickDirection { Front = 0, Back = 1 } property alias slider: __slider property alias ticks: ticksGrid.children property int tickDirection: (TipsSlider.TickDirection.Back) implicitWidth: __slider.width + (__slider.horizontal ? 0 : ticksGrid.childrenRect.width) implicitHeight: __slider.height + (__slider.horizontal ? ticksGrid.childrenRect.height : 0) Slider { id: __slider anchors { left: horizontal ? parent.left : (TipsSlider.TickDirection.Back === tickDirection ? parent.left : undefined) right: horizontal ? parent.right : (TipsSlider.TickDirection.Front === tickDirection ? parent.right : undefined) top: horizontal ? (TipsSlider.TickDirection.Back === tickDirection ? parent.top : undefined) : parent.top bottom: horizontal ? (TipsSlider.TickDirection.Front === tickDirection ? parent.bottom : undefined) : parent.bottom } } Grid { id: ticksGrid rows: __slider.horizontal ? 0 : children.length columns: __slider.horizontal ? children.length : 0 anchors { left: __slider.horizontal ? parent.left : (TipsSlider.TickDirection.Back === tickDirection ? __slider.right : undefined) right: __slider.horizontal ? parent.right : (TipsSlider.TickDirection.Front === tickDirection ? __slider.left : undefined) leftMargin: __slider.horizontal ? __slider.handle.width / 2 : 0 rightMargin: __slider.horizontal ? __slider.handle.width / 2 : 0 top: __slider.horizontal ? (TipsSlider.TickDirection.Back === tickDirection ? __slider.bottom : undefined) : __slider.top bottom: __slider.horizontal ? (TipsSlider.TickDirection.Front === tickDirection ? __slider.top : undefined) : __slider.bottom topMargin: __slider.horizontal ? 0 : __slider.handle.height / 2 bottomMargin: __slider.horizontal ? 0 : __slider.handle.height / 2 } spacing: ticks.length > 1 ? (__slider.horizontal ? (parent.width - __slider.handle.width - DS.Style.slider.tick.width * ticks.length) :(parent.height - __slider.handle.height - DS.Style.slider.tick.width * ticks.length)) / (ticks.length - 1) : 0 } } dtkdeclarative-5.7.12/src/qml/TitleBar.qml000066400000000000000000000157771476226662700204400ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { id: control z: D.DTK.TopOrder width: Window.window.width // it's binding `height` instead of `visible` property, // because MouseArea should accept event keeping visible. implicitHeight: (!__isFullScreen || __isVisible) ? DS.Style.titleBar.height : 0 property string title: Window.window.title property alias icon: iconLabel // custom control property alias leftContent: customLeft.sourceComponent property alias content: customCenter.sourceComponent // menu access property alias menu: optionMenuLoader.sourceComponent property bool menuDisabled property Component aboutDialog // visibility access property bool fullScreenButtonVisible: true signal toggleWindowState() property alias windowButtonGroup: windowButtonsLoader.sourceComponent property bool autoHideOnFullscreen: false property bool embedMode: !__dwindow.enabled property bool separatorVisible: true property var __dwindow: Window.window.D.DWindow property bool __isFullScreen: Window.window.visibility === Window.FullScreen property bool __isVisible: mouseArea.containsMouse readonly property int __includedAreaX: control.width - optionMenuBtn.width - windowButtonsLoader.width property alias enableInWindowBlendBlur: background.active property D.Palette textColor: DS.Style.button.text palette.windowText: D.ColorSelector.textColor MouseArea { id: mouseArea anchors.fill: parent hoverEnabled: __isFullScreen && autoHideOnFullscreen acceptedButtons: Qt.AllButtons propagateComposedEvents: true onPressed: { if (mouse.button === Qt.RightButton) { if (mouse.x < __includedAreaX) { __dwindow.popupSystemWindowMenu() mouse.accepted = true return } } mouse.accepted = false } onDoubleClicked: { // Windowed or Maximized if (mouse.button === Qt.LeftButton) { control.toggleWindowState() mouse.accepted = true return } mouse.accepted = false } onReleased: mouse.accepted = false onClicked: mouse.accepted = false } Loader { id: background active: false anchors.fill: parent sourceComponent: D.InWindowBlur { radius: 30 } } ColumnLayout { id: content spacing: 0 anchors.fill: parent visible: control.height > 0 Loader { active: embedMode visible: embedMode sourceComponent: Rectangle { Layout.preferredWidth: control.width Layout.preferredHeight: 1 visible: embedMode color: "transparent" } } RowLayout { spacing: 0 Layout.alignment: Qt.AlignHCenter Layout.fillHeight: true Layout.fillWidth: true Layout.leftMargin: DS.Style.titleBar.leftMargin D.DciIcon { id: iconLabel sourceSize { width: DS.Style.titleBar.iconSize height: DS.Style.titleBar.iconSize } Layout.alignment: Qt.AlignLeft Layout.leftMargin: 2 visible: name palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme } // left custom area Loader { id: customLeft } // center custom area Loader { id: customCenter Layout.leftMargin: (optionMenuBtn.width + windowButtonsLoader.width - iconLabel.width - customLeft.width) Layout.fillWidth: true sourceComponent: titleCenterCom } // option button, it maybe load other Button in different scene. WindowButton { id: optionMenuBtn icon.name: "window_menu" textColor: control.textColor enabled: !menuDisabled Layout.alignment: Qt.AlignRight onClicked: { if (optionMenuLoader.item && optionMenuLoader.item.visible) { optionMenuLoader.item.close() } else { var pos = Qt.point(optionMenuLoader.x, control.height) optionMenuLoader.item.popup(optionMenuBtn, pos) } } Loader { id: optionMenuLoader sourceComponent: Menu { ThemeMenu { } MenuSeparator { } HelpAction { } AboutAction { aboutDialog: control.aboutDialog } QuitAction { } } onLoaded: item.closePolicy = item.closePolicy | Popup.CloseOnPressOutsideParent } } Loader { id: windowButtonsLoader Layout.fillHeight: true sourceComponent: WindowButtonGroup { Layout.alignment: Qt.AlignRight Layout.fillHeight: true embedMode: control.embedMode textColor: control.textColor fullScreenButtonVisible: control.fullScreenButtonVisible Component.onCompleted: { control.toggleWindowState.connect(maxOrWinded) } } } } Loader { active: separatorVisible visible: active sourceComponent: Rectangle { Layout.preferredWidth: control.width Layout.preferredHeight: 1 color: "transparent" Layout.alignment: Qt.AlignBottom } } } Component { id: titleCenterCom Loader { property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowTitleHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowTitleHint) active: hasWindowFlag && !embedMode && (__dwindow.motifDecorations & D.WindowManagerHelper.DECOR_TITLE) visible: active sourceComponent: Label { textFormat: Text.PlainText text: control.title horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } } } } dtkdeclarative-5.7.12/src/qml/ToolButton.qml000066400000000000000000000052261476226662700210270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.ToolButton { id: control property D.Palette textColor: checked ? DS.Style.checkedButton.text : (highlighted ? DS.Style.highlightedButton.text : DS.Style.button.text) implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) topPadding: DS.Style.button.vPadding bottomPadding: DS.Style.button.vPadding leftPadding: DS.Style.button.hPadding rightPadding: DS.Style.button.hPadding spacing: DS.Style.control.spacing opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 D.DciIcon.mode: D.ColorSelector.controlState D.DciIcon.theme: D.ColorSelector.controlTheme D.DciIcon.palette: D.DTK.makeIconPalette(palette) palette.windowText: D.ColorSelector.textColor D.ColorSelector.family: D.Palette.CrystalColor display: D.IconLabel.TextUnderIcon font: icon.name ? D.DTK.fontManager.t10: undefined flat: true icon { width: DS.Style.toolButton.iconSize height: DS.Style.toolButton.iconSize color: D.ColorSelector.textColor } contentItem: Item { implicitWidth: content.implicitWidth + (indicator ? indicator.width : 0) implicitHeight: content.implicitHeight D.IconLabel { id: content height: parent.height width: parent.width - (indicator ? indicator.width : 0) spacing: control.spacing mirrored: control.mirrored display: control.display alignment: indicator ? Qt.AlignLeft | Qt.AlignVCenter : Qt.AlignCenter text: control.text font: control.font color: control.D.ColorSelector.textColor icon: D.DTK.makeIcon(control.icon, control.D.DciIcon) } function updateIndicatorAnchors() { if (!indicator) return indicator.anchors.verticalCenter = control.verticalCenter indicator.anchors.right = control.right indicator.anchors.rightMargin = DS.Style.toolButton.indicatorRightMargin } Component.onCompleted: { updateIndicatorAnchors() control.indicatorChanged.connect(updateIndicatorAnchors) } } background: ButtonPanel { implicitWidth: DS.Style.toolButton.width implicitHeight: DS.Style.toolButton.height button: control outsideBorderColor: null } } dtkdeclarative-5.7.12/src/qml/ToolTip.qml000066400000000000000000000022521476226662700203040ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Templates 2.4 as T import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS T.ToolTip { id: control x: parent ? (parent.width - implicitWidth) / 2 : 0 y: -implicitHeight - 3 implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) topPadding: DS.Style.toolTip.verticalPadding bottomPadding: topPadding leftPadding: DS.Style.toolTip.horizontalPadding rightPadding: leftPadding closePolicy: T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent | T.Popup.CloseOnReleaseOutsideParent contentItem: Text { horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter text: control.text font: control.font wrapMode: Text.Wrap opacity: enabled ? 1.0 : 0.4 color: control.palette.toolTipText } background: FloatingPanel { implicitWidth: 0 implicitHeight: DS.Style.toolTip.height radius: DS.Style.control.radius } } dtkdeclarative-5.7.12/src/qml/WarningButton.qml000066400000000000000000000004461476226662700215160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Button { id: control textColor: DS.Style.warningButton.text } dtkdeclarative-5.7.12/src/qml/WaterProgressBar.qml000066400000000000000000000067331476226662700221560ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { id: control property int value /*0~100*/ property bool running: false property D.Palette backgroundColor1: DS.Style.waterProgressBar.background1 property D.Palette backgroundColor2: DS.Style.waterProgressBar.background2 property D.Palette dropShadowColor: DS.Style.waterProgressBar.dropShadow property D.Palette popBackgroundColor: DS.Style.waterProgressBar.popBackground property D.Palette textColor: DS.Style.waterProgressBar.textColor background: BoxShadow { implicitWidth: DS.Style.waterProgressBar.width implicitHeight: DS.Style.waterProgressBar.height shadowColor: control.D.ColorSelector.dropShadowColor shadowOffsetY: 6 shadowBlur: 6 cornerRadius: width / 2 Rectangle { anchors.fill: parent radius: parent.cornerRadius gradient: Gradient { GradientStop { position: 0.0; color: control.D.ColorSelector.backgroundColor1 } GradientStop { position: 1; color: control.D.ColorSelector.backgroundColor2 } } } } contentItem: Item { Item { id: content anchors.fill: parent D.WaterProgressAttribute { id: attribute running: control.running && control.value > 0 waterProgress: control imageWidth: 5 * control.width imageHeight: 1.1 * control.height } Repeater { model: 4 Image { readonly property real xoffset: index < 2 ? attribute.backXOffset : attribute.frontXOffset source: index < 2 ? DS.Style.waterProgressBar.waterBackImagePath : DS.Style.waterProgressBar.waterFrontImagePath x: index % 2 ? xoffset - width : xoffset y: (90 - control.value) * control.height / 100 width: attribute.imageWidth height: attribute.imageHeight sourceSize { width: attribute.imageWidth height: attribute.imageHeight } } } Repeater { model: attribute.pops Loader { x: model.x y: model.y width: model.width height: model.height active: control.value > 30 visible: active sourceComponent: Rectangle { color: control.D.ColorSelector.popBackgroundColor radius: width / 2 } } } Text { anchors.centerIn: parent text: control.value horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter font { pixelSize: control.height * 0.4 } color: control.D.ColorSelector.textColor } } D.ItemViewport { anchors.fill: parent sourceItem: content hideSource: true radius: width / 2 } } } dtkdeclarative-5.7.12/src/qml/WindowButton.qml000066400000000000000000000023251476226662700213560ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { id: control property alias icon: iconLoader readonly property bool pressed: mouseArea.pressed signal clicked property D.Palette textColor: DS.Style.button.text property D.Palette backgroundColor: DS.Style.windowButton.background palette.windowText: D.ColorSelector.textColor hoverEnabled: true contentItem: D.DciIcon { id: iconLoader palette: D.DTK.makeIconPalette(control.palette) sourceSize { width: DS.Style.windowButton.width height: DS.Style.windowButton.height } mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme } MouseArea { id: mouseArea anchors.fill: parent Component.onCompleted: clicked.connect(control.clicked) } background: Rectangle { implicitWidth: DS.Style.windowButton.width implicitHeight: DS.Style.windowButton.height color: control.D.ColorSelector.backgroundColor } } dtkdeclarative-5.7.12/src/qml/WindowButtonGroup.qml000066400000000000000000000077041476226662700224010ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS RowLayout { id: control spacing: 0 property D.Palette textColor: DS.Style.button.text property bool fullScreenButtonVisible: true property bool embedMode: false signal maxOrWinded() property var __dwindow: Window.window.D.DWindow property bool __forceHind: !__dwindow.enabled || embedMode || Window.window.visibility === Window.FullScreen onMaxOrWinded: { if (!(__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MAXIMIZE)) { return } if (Window.window.visibility === Window.Maximized) { Window.window.visibility = Window.Windowed } else if (Window.window.visibility !== Window.FullScreen && maxOrWindedBtn.active) { Window.window.visibility = Window.Maximized } } Loader { objectName: "minimizeBtn" property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowMinimizeButtonHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowMinimizeButtonHint) active: hasWindowFlag && !__forceHind visible: active enabled: (__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MINIMIZE) sourceComponent: WindowButton { icon.name: "window_minimize" textColor: control.textColor onClicked: Window.window.visibility = Window.Minimized } } Loader { objectName: "quitFullBtn" active: !(!control.fullScreenButtonVisible || !__dwindow.enabled || Window.window.visibility !== Window.FullScreen) visible: active sourceComponent: WindowButton { icon.name: "window_quit_full" textColor: control.textColor onClicked: { if (Window.window.visibility === Window.FullScreen) { Window.window.visibility = Window.Windowed } else { Window.window.visibility = Window.FullScreen } } } } Loader { id: maxOrWindedBtn; objectName: "maxOrWindedBtn" property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowMaximizeButtonHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowMaximizeButtonHint) readonly property size maxSize: Qt.size(Window.window.maximumWidth, Window.window.maximumHeight) readonly property size minSize: Qt.size(Window.window.minimumWidth, Window.window.minimumHeight) active: (hasWindowFlag && !__forceHind && (__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_RESIZE) && maxSize != minSize) visible: active enabled: ((__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MAXIMIZE) && (__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_RESIZE)) sourceComponent: WindowButton { property bool isMaximized: Window.window.visibility === Window.Maximized icon.name: isMaximized ? "window_restore" : "window_maximize" textColor: control.textColor onClicked: maxOrWinded() } } Loader { objectName: "closeBtn" property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowCloseButtonHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowCloseButtonHint) active: hasWindowFlag && __dwindow.enabled visible: active enabled: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_CLOSE sourceComponent: WindowButton { icon.name: "window_close" textColor: control.textColor onClicked: Window.window.close() } } } dtkdeclarative-5.7.12/src/qml/WindowQuitFullButton.qml000066400000000000000000000003461476226662700230450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.controls 1.0 Button { id: control text: "QFull" } dtkdeclarative-5.7.12/src/qml/private/000077500000000000000000000000001476226662700176505ustar00rootroot00000000000000dtkdeclarative-5.7.12/src/qml/private/ArrowListViewButton.qml000066400000000000000000000022171476226662700243420ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.style 1.0 as DS import ".." Loader { enum Direction { UpButton = 0, DownButton = 1 } property Item view property int direction active: view.interactive sourceComponent: Button { flat: true enabled: direction === ArrowListViewButton.UpButton ? !view.atYBeginning : !itemsView.atYEnd width: DS.Style.arrowListView.stepButtonSize.width height: DS.Style.arrowListView.stepButtonSize.height icon.name: direction === ArrowListViewButton.UpButton ? DS.Style.arrowListView.upButtonIconName : DS.Style.arrowListView.downButtonIconName icon.width: DS.Style.arrowListView.stepButtonIconSize.width icon.height: DS.Style.arrowListView.stepButtonIconSize.height onClicked: direction === ArrowListViewButton.UpButton ? view.decrementCurrentIndex() : view.incrementCurrentIndex() } } dtkdeclarative-5.7.12/src/qml/private/ColorOverlay.qml000066400000000000000000000007561476226662700230130ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtGraphicalEffects 1.0 /*! The Qt Graphical Effects module provides a set of QML types.The effects cover functional areas such as blending, masking, blurring, coloring, and many more. This component can only be registered during hardware rendering, and its software rendering implementation comes from dquickcoloroverlay item. */ ColorOverlay { } dtkdeclarative-5.7.12/src/qml/private/KeySequenceLabel.qml000066400000000000000000000047261476226662700235550ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import ".." Control { id: control property string text property D.Palette textColor: DS.Style.keySequenceEdit.label.text property D.Palette backgroundColor1: DS.Style.keySequenceEdit.label.background1 property D.Palette backgroundColor2: DS.Style.keySequenceEdit.label.background2 property D.Palette shadowInnerColor1: DS.Style.keySequenceEdit.label.shadowInner1 property D.Palette shadowInnerColor2: DS.Style.keySequenceEdit.label.shadowInner2 property D.Palette shadowOuterColor: DS.Style.keySequenceEdit.label.shadowOuter leftPadding: DS.Style.keySequenceEdit.label.leftRightPadding topPadding: DS.Style.keySequenceEdit.label.topBottomPadding rightPadding: leftPadding bottomPadding: topPadding contentItem: Text { text: control.text horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter font: D.DTK.fontManager.t8 color: control.D.ColorSelector.textColor } background: Item { BoxShadow { anchors.fill: parent cornerRadius: backgroundRect.radius shadowOffsetY: 1 shadowBlur: 2 shadowColor: control.D.ColorSelector.shadowOuterColor; hollow: true } Rectangle { id: backgroundRect anchors.fill: parent radius: DS.Style.control.radius gradient: Gradient { GradientStop { position: 0.0 color: control.D.ColorSelector.backgroundColor1 } GradientStop { position: 0.98 color: control.D.ColorSelector.backgroundColor2 } } } BoxInsetShadow { anchors.fill: parent cornerRadius: backgroundRect.radius shadowOffsetY: -2 shadowBlur: 1 shadowColor: control.D.ColorSelector.shadowInnerColor1 } BoxInsetShadow { visible: D.DTK.themeType === D.ApplicationHelper.DarkType anchors.fill: parent cornerRadius: backgroundRect.radius shadowOffsetY: 1 shadowBlur: 1 shadowColor: control.D.ColorSelector.shadowInnerColor2 } } } dtkdeclarative-5.7.12/src/qml/private/OpacityMask.qml000066400000000000000000000007471476226662700226170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtGraphicalEffects 1.0 /*! The Qt Graphical Effects module provides a set of QML types.The effects cover functional areas such as blending, masking, blurring, coloring, and many more. This component can only be registered during hardware rendering, and its software rendering implementation comes from dquickopacitymask */ OpacityMask { } dtkdeclarative-5.7.12/src/qml/private/ProgressBarImpl.qml000066400000000000000000000204561476226662700234450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Controls.impl 2.4 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS import ".." Item { id: control property Item progressBar property string formatText property bool animationStop: false property D.Palette shadowPaletteColor: DS.Style.progressBar.shadowColor property D.Palette handleGradientColor: DS.Style.progressBar.handleGradientColor Loader { anchors.fill: parent sourceComponent: progressBar.indeterminate ? _indeterminateComponent : _valueComponent } Component { id: _valueComponent Item { BoxShadow { y: (parent.height - height) / 2 x: -y width: progressBar.height height: progressBar.visualPosition * progressBar.width shadowOffsetX: -4 shadowBlur: 6 rotation: -90 cornerRadius: DS.Style.control.radius shadowColor: control.D.ColorSelector.shadowPaletteColor visible: progressBar.visualPosition > 0 Rectangle { anchors.fill: parent radius: parent.cornerRadius gradient: Gradient { GradientStop { position: 1 - 1 / progressBar.visualPosition; color: progressBar.palette.highlight } GradientStop {position: 1 - 0.28 / progressBar.visualPosition; color: progressBar.palette.highlight } GradientStop { position: 1; color: control.D.ColorSelector.handleGradientColor } } } } ItemGroup { anchors.fill: parent ClippedText { clip: progressBar.visualPosition > 0 clipX: -progressBar.leftPadding + progressBar.visualPosition * control.width clipWidth: (1.0 - progressBar.visualPosition) * control.width text: formatText font: progressBar.font color: progressBar.palette.buttonText opacity: enabled ? 1 : 0.4 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } ClippedText { visible: progressBar.visualPosition > 0 clip: progressBar.visualPosition > 0 clipX: -progressBar.leftPadding clipWidth: progressBar.visualPosition * control.width text: formatText font: progressBar.font color: palette.highlightedText opacity: enabled ? 1 : 0.4 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } } } } Component { id: _indeterminateComponent Item { BoxShadow { id: indeterminateProgressContent property real limitWidth: (indeterminateProgressContent.height - indeterminateProgressContent.width) / 2 y: -limitWidth x: limitWidth implicitHeight: DS.Style.progressBar.indeterminateProgressBarWidth width: progressBar.height shadowOffsetX: -4 shadowBlur: 6 cornerRadius: DS.Style.control.radius shadowColor: control.D.ColorSelector.shadowPaletteColor rotation: -90 Rectangle { anchors.fill: parent radius: indeterminateProgressContent.cornerRadius gradient: Gradient { GradientStop { position: 0.0; color: progressBar.palette.highlight } GradientStop { position: 0.39; color: control.D.ColorSelector.handleGradientColor } GradientStop { position: 1.0; color: progressBar.palette.highlight } } } SequentialAnimation { id: indeterminateAnimation running: progressBar.indeterminate && !control.animationStop loops: Animation.Infinite NumberAnimation { target: indeterminateProgressContent property: "x" from: -indeterminateProgressContent.y to: progressBar.width - indeterminateProgressContent.limitWidth - indeterminateProgressContent.width duration: DS.Style.progressBar.indeterminateProgressBarAnimationDuration * progressBar.width / DS.Style.progressBar.width onFromChanged: if (!delayAnimationTimer.running) delayAnimationTimer.start() onToChanged: if (!delayAnimationTimer.running) delayAnimationTimer.start() } NumberAnimation { target: indeterminateProgressContent property: "x" to: -indeterminateProgressContent.y duration: DS.Style.progressBar.indeterminateProgressBarAnimationDuration * progressBar.width / DS.Style.progressBar.width onFromChanged: if (!delayAnimationTimer.running) delayAnimationTimer.start() onToChanged: if (!delayAnimationTimer.running) delayAnimationTimer.start() } } } Timer { // ###(Chen Bin) Layout bug: Put the progressbar into the layout, // the animation will get a wrong position id: delayAnimationTimer interval: 200 repeat: false onTriggered: { indeterminateAnimation.restart() } } ItemGroup { anchors.fill: parent ClippedText { clip: true clipX: indeterminateProgressContent.x - indeterminateProgressContent.limitWidth - progressBar.leftPadding clipWidth: indeterminateProgressContent.height text: formatText font: progressBar.font color: palette.highlightedText horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } ClippedText { clip: true visible: indeterminateProgressContent.x - indeterminateProgressContent.limitWidth + progressBar.leftPadding > 0 clipX: -progressBar.leftPadding clipWidth: indeterminateProgressContent.x - indeterminateProgressContent.limitWidth + progressBar.leftPadding text: formatText font: progressBar.font color: progressBar.palette.buttonText opacity: enabled ? 1 : 0.4 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } ClippedText { clip: true clipX: indeterminateProgressContent.x - indeterminateProgressContent.limitWidth - progressBar.leftPadding + indeterminateProgressContent.height clipWidth: progressBar.width - progressBar.rightPadding - indeterminateProgressContent.x - indeterminateProgressContent.limitWidth - progressBar.leftPadding + indeterminateProgressContent.height text: formatText font: progressBar.font color: progressBar.palette.buttonText opacity: enabled ? 1 : 0.4 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } } } } } dtkdeclarative-5.7.12/src/qml/private/ProgressBarPanel.qml000066400000000000000000000011751476226662700236000ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.style 1.0 as DS import ".." Item { id: control property Item progressBar Loader { anchors.fill: parent sourceComponent: progressBar.formatText ? _textPanelComponent : _normalTextComponent } Component { id: _textPanelComponent BoxPanel {} } Component { id: _normalTextComponent Rectangle { radius: DS.Style.control.radius color: Qt.rgba(0, 0, 0, 0.1); } } } dtkdeclarative-5.7.12/src/qml/private/SoftwareColorOverlay.qml000066400000000000000000000013751476226662700245240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtGraphicalEffects.private 1.0 import org.deepin.dtk.impl 1.0 as D Item { id: rootItem property variant source property alias color: overlay.color property alias cached: overlay.cached SourceProxy { id: sourceProxy input: rootItem.source } ShaderEffectSource { id: cacheItem anchors.fill: parent visible: rootItem.cached smooth: true sourceItem: overlay live: true hideSource: visible } D.SoftwareColorOverlay { id: overlay anchors.fill: parent source: sourceProxy.output } } dtkdeclarative-5.7.12/src/qml/private/SoftwareOpacityMask.qml000066400000000000000000000020301476226662700243150ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtGraphicalEffects.private 1.0 import org.deepin.dtk.impl 1.0 as D /*! The Qt Graphical Effects module provides a SourceProxy types. the user can simply use ShaderEffectSource or Item as input */ Item { id: rootItem property variant source property variant maskSource property bool cached: false property alias invert: mask.invert SourceProxy { id: sourceProxy input: rootItem.source } SourceProxy { id: maskSourceProxy input: rootItem.maskSource } ShaderEffectSource { id: cacheItem anchors.fill: parent visible: rootItem.cached smooth: true sourceItem: mask live: true hideSource: visible } D.SoftwareOpacityMask { id: mask anchors.fill: parent source: sourceProxy.output maskSource: maskSourceProxy.output } } dtkdeclarative-5.7.12/src/qml/settings/000077500000000000000000000000001476226662700200365ustar00rootroot00000000000000dtkdeclarative-5.7.12/src/qml/settings/CheckBox.qml000066400000000000000000000011071476226662700222360ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.settings 1.0 as Settings import ".." Settings.OptionDelegate { id: control leftVisible: false CheckBox { Layout.fillWidth: true text: Settings.SettingsOption.name checked: Settings.SettingsOption.value || false onCheckedChanged: { Settings.SettingsOption.value = checked } } } dtkdeclarative-5.7.12/src/qml/settings/ComboBox.qml000066400000000000000000000023241476226662700222620ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.settings 1.0 as Settings import ".." Settings.OptionDelegate { id: control property alias impl: impl property string valueRole property alias model: impl.model ComboBox { id: impl Layout.alignment: Qt.AlignRight Layout.fillWidth: true currentIndex: { var index = -1 for(var i = 0; i < model.length; i++) { var item if (valueRole === "") { item = model[i] } else { item = model[i][valueRole] } if (item === Settings.SettingsOption.value) { index = i break } } return index } onActivated: { if (valueRole === "") { Settings.SettingsOption.value = control.model[currentIndex] } else { Settings.SettingsOption.value = control.model[currentIndex][valueRole] } } } } dtkdeclarative-5.7.12/src/qml/settings/ContentBackground.qml000066400000000000000000000014261476226662700241660ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.settings 1.0 import org.deepin.dtk.style 1.0 as DS Rectangle { anchors { left: parent.left leftMargin: __getMargin(SettingsGroup.level) right: parent.right rightMargin: __getMargin(SettingsGroup.level) } height: childrenRect.height radius: DS.Style.control.radius function __getMargin(level) { switch(level) { case 0: return DS.Style.settings.content.marginL1 case 1: return DS.Style.settings.content.marginL2 } return DS.Style.settings.content.marginOther } } dtkdeclarative-5.7.12/src/qml/settings/ContentTitle.qml000066400000000000000000000023441476226662700231700ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.settings 1.0 as Settings import org.deepin.dtk.style 1.0 as DS import ".." Label { text: Settings.SettingsGroup.name font: __getFont(Settings.SettingsGroup.level) textFormat: Text.PlainText verticalAlignment: Qt.AlignVCenter topPadding: DS.Style.settings.navigation.textVPadding bottomPadding: DS.Style.settings.navigation.textVPadding anchors { left: parent.left leftMargin: __getMargin(Settings.SettingsGroup.level) right: parent.right rightMargin: __getMargin(Settings.SettingsGroup.level) } function __getFont(level) { switch(level) { case 0: return D.DTK.fontManager.t4 case 1: return D.DTK.fontManager.t5 } return D.DTK.fontManager.t6 } function __getMargin(level) { switch(level) { case 0: return DS.Style.settings.title.marginL1 case 1: return DS.Style.settings.title.marginL2 } return DS.Style.settings.title.marginLOther } } dtkdeclarative-5.7.12/src/qml/settings/LineEdit.qml000066400000000000000000000010231476226662700222420ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.settings 1.0 as Settings import ".." Settings.OptionDelegate { id: control LineEdit { id: impl Layout.alignment: Qt.AlignRight Layout.fillWidth: true text: Settings.SettingsOption.value || "" onEditingFinished: { Settings.SettingsOption.value = text } } } dtkdeclarative-5.7.12/src/qml/settings/NavigationTitle.qml000066400000000000000000000041361476226662700236560ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.settings 1.0 as Settings import org.deepin.dtk.style 1.0 as DS import ".." Control { id: control signal clicked() property bool checked: false property D.Palette backgroundColor: DS.Style.settings.background property D.Palette checkedTextColor: DS.Style.checkedButton.text palette.windowText: checked ? D.ColorSelector.checkedTextColor : undefined contentItem: Label { text: Settings.SettingsGroup.name font: __getFont(Settings.SettingsGroup.level) leftPadding: __getMargin(Settings.SettingsGroup.level) topPadding: DS.Style.settings.navigation.textVPadding bottomPadding: DS.Style.settings.navigation.textVPadding anchors.left: parent.left verticalAlignment: Qt.AlignVCenter elide: Text.ElideRight function __getFont(level) { switch(level) { case 0: return D.DTK.fontManager.t4 // case 1: // return D.DTK.fontManager.t5 } return D.DTK.fontManager.t6 } function __getMargin(level) { switch(level) { case 0: return DS.Style.settings.title.marginL1 case 1: return DS.Style.settings.title.marginL2 } return DS.Style.settings.title.marginLOther } } background: Item { implicitHeight: DS.Style.settings.navigation.height implicitWidth: DS.Style.settings.navigation.width Rectangle { anchors.fill: parent visible: !control.checked color: control.D.ColorSelector.backgroundColor radius: DS.Style.control.radius } HighlightPanel { anchors.fill: parent visible: control.checked } } MouseArea { anchors.fill: parent Component.onCompleted: clicked.connect(control.clicked) } } dtkdeclarative-5.7.12/src/qml/settings/OptionDelegate.qml000066400000000000000000000010671476226662700234600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk.settings 1.0 import ".." RowLayout { id: control width: parent.width - parent.leftPadding - parent.rightPadding property bool leftVisible: true Label { id: label visible: leftVisible text: SettingsOption.name verticalAlignment: Text.AlignVCenter } Item { visible: leftVisible width: 20 } } dtkdeclarative-5.7.12/src/qml/settings/SettingsDialog.qml000066400000000000000000000053171476226662700234770ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk.impl 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.settings 1.0 as Settings import ".." DialogWindow { id: control property list groups property D.Config config property Settings.SettingsContainer container : Settings.SettingsContainer { id: settingsContainer config: control.config navigationTitle: Settings.NavigationTitle { width: navigationView.width - navigationView.leftMargin - navigationView.rightMargin checked: navigationView.currentIndex === Settings.SettingsGroup.index onClicked: navigationView.currentIndex = Settings.SettingsGroup.index } contentTitle: Settings.ContentTitle {} contentBackground: Settings.ContentBackground {} groups: control.groups } property alias navigationView: navigationView property alias contentView: contentView ScrollView { id: navigationBg width: DS.Style.settings.navigation.width background: Rectangle { anchors.fill: parent color: palette.base } ListView { id: navigationView model: container.navigationModel leftMargin: DS.Style.settings.navigation.margin rightMargin: DS.Style.settings.navigation.margin currentIndex: 0 onCurrentIndexChanged: { contentView.currentIndex = currentIndex } } } ScrollView { id: contentBg anchors { right: parent.right left: navigationBg.right top: control.top } padding: DS.Style.settings.content.margin background: Rectangle { anchors.fill: parent color: palette.base } ListView { id: contentView model: container.contentModel highlightRangeMode: ListView.StrictlyEnforceRange currentIndex: 0 onCurrentIndexChanged: { navigationView.currentIndex = currentIndex } footer: Item { width: parent.width height: DS.Style.settings.content.resetButtonHeight Button { anchors.horizontalCenter: parent.horizontalCenter anchors.bottom: parent.bottom text: qsTr("Restore Defaults") onClicked: { settingsContainer.resetSettings(); } } } } } } dtkdeclarative-5.7.12/src/qml/style/000077500000000000000000000000001476226662700173365ustar00rootroot00000000000000dtkdeclarative-5.7.12/src/qml/style/Style.qml000066400000000000000000000002541476226662700211520ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later pragma Singleton import ".." FlowStyle {} dtkdeclarative-5.7.12/src/resources/000077500000000000000000000000001476226662700174175ustar00rootroot00000000000000dtkdeclarative-5.7.12/src/resources/spinner-blue.webp000066400000000000000000000200541476226662700227020ustar00rootroot00000000000000RIFF$ WEBPVP8X ALPHm۶IHIF?X+hh,I9eBDjm˛}9#ah 62Ljf!}艘En)Ya^Hڶ}BkN\mܶm۶m۶m~.{FUr,tr$U]3>KD8$IJzfWf`[UT,0ԿvZBa0`6-A.Q}b)E"#vümw"r`fcx;$C:o/Mv OHY'mOȮ%RRH ,%JEV4l#R_ +9V߆"!9jDV)1o d2A"yv̩SŷQ; ~$MDYS)%Ig9~b^$E6-M'#@ J  U #SSZyE_5#eux6K/M"C5"R%#JɡƾA #Q f{H*ty4 9s2+'N)>oR!dO26zGϐ9l|[[I=X~<Ρ* yz; `D oZW9="E~2:n"eb_ñNUC{J}F;f9]!$q,eF9/?ph@:}\| 3K 5% Ci7ff-\tGEkWX<@}2hӇLc뱽Ts'%t*9@ ē!5$wͮɒ/a?8b"4M`}l)dS|O61ŋx`ڱ+U+ox\xdI{GMêѿ= vWԨ;z#DE rz'Nvcnlx:v283:wTLIF#nzP̽YgiVis&יa56 t ?L21Kzy(~O@і>:"Tawu%,T*@؉ACò2_0Dže5fg0LܳE2+MTszR3TV'骨K4ֿ$ ږg6U6H u<$mh, '"Cƍ@FݍNu #zuk{ɻOc1-/--剥mZU7)Sd=P4mf\_߅"{Y dч 9;@yަS#w`f_IZXx:ގP~JbfJ7oc:rGG?b1gkU?O}y!\&5۝jQmy>lm9∋*=,{6@@TO0CfDqrVaS5t;G]2&yovEDH99jlbI1OG\gL^4o>(룘Pn-7K֝&]z&DQ=sT- 5NcMFQP_YRPװvH}^6ֿFțL.h<3tq$HU撸&p068ٿr<AQ'4+N8m[ n ɈpeG9VTJ!ˋS v:i j : ck70vF8wR8̢HGG+gL&Y000@1Xz9<-MrUˠ?=ڄZ\CdR[52gܽ߇"^4 GQ|kjExlfGr^{lCZ-pˡ4bA/.jzP{ƫu'gȿ7pj9ۄU ޮ9Қ˖ <wd*J"E'#B!};2PYgB [Y [{#vFm&g56ݷSuF&QHߚHR}w2-Ƙ9w~#J&i#h6GTSz.療Q6]Oh Bܨk},L  m)Ikr#0Rn pW'釪~jk1k4t%Zj`AS§O~\XfMwoL#hl J4kTIp @OjLѧG>9TKkӡՋYaQ %\t(S{wBI$p_`V# ZuIW(;PrRaPgWROSըv$˅8!%EZ}4na>7+&,DHZ|F0 n}'6rxanW5I%Q^DVLrx̎&#AXDRsF)%@") *_U%!I$O @W.?3 ";Wa+ ;SnRu \Qrw!@K*2 +'h8M%0@j%P`QF\/1`KrU) HwkfV!sJ|aH8 VOqs$Dm\$1i4 ֨dӢ(@{ޕ6*HΏݝ.s< \]z Iby_<ׄLd!mTd,i`n3+s#6GgSY,O7015wZp / /l9\sMq񅷗_p]PϽ>k]$x׷m zWBF 7M^^tY ߲kǹw%hg컸 @-K..:v{z^dêoRѷ%zΜ*J8M` o6/櫄frz֡m-bLiѷ?@#zY12cؠe 6~Nd^<q\u-շM%s@/ ~+٘sJUW\ޗ&vEa&s,Jp}Am98h9cA3uݟ}7jø7j:Z31AEdE7Y^Mm[Po 2_Zr܃EK,cla=Ckf`I3tVC3n;u8~sc\ղmm2G$#"!+ dnEh(XW׆'xO <ʐGϵ7꺙M9?cG?zy)iQwG/R}3N^qRf )wr =,S`Eav @?w)n aecD2dvҌd ;0T\:ԃTeP+8{}[+ٙ.Dr`tZ,In4fOL!MdիT3~Cp͊b+vŜApkfk[{?od@T+p]#"1%./L'j ,J j+8/HaZgiokꆈ–ϷCL4 xwԹeU'膘Km^w,ߔ!JZz t1Emq) PC5)k;hAM3ledDD$D g2pSeLd>uF 3r&`*nӝ-Ңpxm.$〭~OhD_h5IJV#fI[R5jTvAC0Hf5鞱Q4ɻg!,^Yv5``4ț'qԦ[un>,3ܕԲR@'է> w_fz_g)ս{axI P/N=ݨ@ 4'PM:S 'X:׿Gz7yX:vo&JW,=RW&mneQ#1

2 Ԇۀ*ƢeȫKWU):'L(sKs _QAdSrmc^t7?pwUi9e`ƲE_ofSYOk&K{7mn'N]!tsKQX;Ո/Eaz6uF iE֯Ld5`̶ ZgzpE,q ~h!S)O_BxY{rtNfNXMc52ER-6$}`|"qvLѲ*1DnNRdŔ/է+|$|^՚M1H[-5Nx/B՝S ^U1ml8ᘒ)|QFjDMeYAVkʝxdl`fUg4,d1#C\O׺"LI2UKKtBAܔ >6+ů~z "uwSZsJzCs hLE3(ZM7Y0W\<)%])#.@-9{ab;dT= PB懽QXDPezyʀ e91G<`~y’yi&jsPtK XqЭi _8 izxx5H9MG$ [D8\JphEa}(CWHB_۟yPދͨ 3e9d4{k6JkɚGi㿜Ae]jN&'{UJc2YFfBű8IhUֲJLw IY-8[ط$ޓFCeBkDG#S!DE+O?82 <$dtkdeclarative-5.7.12/src/resources/water_back.png000066400000000000000000000061611476226662700222330ustar00rootroot00000000000000PNG  IHDRspsRGBDeXIfMM*isU IDATxm\usv[D"U,-6XA@&)B_j1D>$MSD6 HPAmߙ=wvޙ;?̹[C3;fbWYeK4=_+#z֪jfN.o96j34/T/4֩[M,P?)57\6V/Ռc1@1- ʏh\9w\&4oY:Bz|pyzA5괮VSZwl@U` h|mbD;:Q|戭fY/^`j\K"*"R/ZgTǿb{p|HyRW7^do+ݍʼhg//=j7jWOfvj҃+j m_Az57T{WVW+t_;HoZD_W4!--*Puwkb}{kUH}nVks=r·=ٛ~uDĞufr~ɷjOM 1A.U34UB;@mm3AviyY΀{^~uwVg@W~S_;v?RKx~nYzHIt;d_.\r #\zBڧg3!~levT]UF|h?P5p^׋dC5_6-G?N}T~#הe/D5voW* UdީxRlLִO^[ӣ_Kz=?G>Y<͛ۯtv۴3حN8T^>SyzmoxF߳1 @s^|~ Mؑvѱe!BG *u.ݯ<_{nW6\N+'@ ]ǖS@SC՝}#K@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ Pw! q܌@ ?} ͈@ cƦ6IENDB`dtkdeclarative-5.7.12/src/resources/water_front.png000066400000000000000000000064141476226662700224640ustar00rootroot00000000000000PNG  IHDRspsRGBDeXIfMM*isU vIDATxklu>=mc[a L@D0 ;_ĨhL|/<$2P$Cf$d(nccPغetЫ[^O?>vJi->?`_*]kӴ֒ukJ*Te*7ӞRVB@Q QWlM-ԞzvY߾p) LYWEakE#Zun졪d[wD(Q`BÿX_u::L5,V N?zMԦ#5U14/+TwA_Q cذ=7S3.TU?NikPsŀQ ~*v۝޼|i ?T枕!u>Ӓt&@3q >@i4ٳ"!!🺾8HJe_7҇.Lk7/"𯾵XpBefeQzoNw7?ԛ}_E7yk>Hu,Qb}>kYnK܁^WoլE  0J.m[4+ǹ| 7NO|z/ڴ}CO %c U7`IoB-qݣYTRXKh0[VwB;4gQ@xRÿbQoݭ,9~Es*b_f]uB=v-ߨ,le4odkdW]`>0y-@mן2?{Ʃ;w7Kۘt֦tIׯI}>nި/U3CH//l֗a}A7-=לz۞6Klv;\;|Blx^ʁMݳ1kVYԗRQ>- Rmw\^(e%.ݯ[HK5wr9ur?hKu)r,)ZP~o\cM{~a y]tuh0eW]9vjG?DSz;[=2J A{%\ 㐟^Ivfo}xK?ɞҗnN{OjޞmWv4>y&S]JdOwNޜz{gtogζiq@j }Cgi[Y[%=5kcxQt~g ${CA7VjlSP#ԭ-+`g2IN0tAɶV;6/Nר5&~}r"-K+jlHf/ftR/јK=yqd*6j|lN'b#/jl^/4=9r%Y:=I= &f ' !Mh/7kSb;jm[;jw磪fWGg@`߮郿]NJ=BTsf>MB>l8ak u.Az6Kf+42p=]G5MAWtfQXkَtVc. oӓs;:֤7F>-gVLЕe9 s|j 4MǷO6-MVMOiܪ/U)ߓ0⍬m)]"hY"}|lH§ߓ:jB߽;s;eCg;ojڣ{Lws~=4HQm?Muw tdU鴮eKY`]3]OZv>b@rQT^j0|u^n_6AmΓ)l}ڎot)@ vCS@F}G @?@'R  bG:@= @Љx@N@+@{h t"% ^+F{@ ) ^1#H  W @DJ@W @?@'R  bG:@= @Љx@N@+@{h t"% ^+F{@ ) ^1#H  W @DJ@W @?@'R  bG:@= @Љx@N@+@{h t"% ^+F{@ ) ^1#H  W @DJ@W @?@'R  bG:@= @Љx@N@+@{h t"% ^+F{@ ) ^1#H  W @DJ@W @?@'R  bG:@= @Љx@N@+@{h t"% ^+F{@ ) ^1#H  W @DJ@W @?@'R  bG:@= @Љx@N@+@{h t"% ^+F{@ ) ^1#H  W @DJ@W @?@'R  bG@zِIENDB`dtkdeclarative-5.7.12/src/shaders/000077500000000000000000000000001476226662700170365ustar00rootroot00000000000000dtkdeclarative-5.7.12/src/shaders/dualkawasedown.frag000066400000000000000000000011531476226662700227100ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later varying highp vec2 qt_TexCoord; varying highp vec2 pixelOffset1; varying highp vec2 pixelOffset2; varying highp vec2 pixelOffset3; varying highp vec2 pixelOffset4; uniform sampler2D qt_Texture; void main() { highp vec4 sum = texture2D(qt_Texture, qt_TexCoord) * 4.0; sum += texture2D(qt_Texture, pixelOffset1); sum += texture2D(qt_Texture, pixelOffset2); sum += texture2D(qt_Texture, pixelOffset3); sum += texture2D(qt_Texture, pixelOffset4); gl_FragColor = sum / 8.0; } dtkdeclarative-5.7.12/src/shaders/dualkawasedown.vert000066400000000000000000000014531476226662700227540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later varying highp vec2 qt_TexCoord; varying highp vec2 pixelOffset1; varying highp vec2 pixelOffset2; varying highp vec2 pixelOffset3; varying highp vec2 pixelOffset4; attribute highp vec4 posAttr; attribute highp vec2 qt_VertexTexCoord; uniform highp mat4 matrix; uniform highp vec2 offset; uniform highp vec2 halfpixel; void main() { qt_TexCoord = qt_VertexTexCoord; pixelOffset1 = qt_VertexTexCoord - halfpixel.xy * offset; pixelOffset2 = qt_VertexTexCoord + halfpixel.xy * offset; pixelOffset3 = qt_VertexTexCoord + vec2(halfpixel.x, -halfpixel.y) * offset; pixelOffset4 = qt_VertexTexCoord - vec2(halfpixel.x, -halfpixel.y) * offset; gl_Position = matrix * posAttr; } dtkdeclarative-5.7.12/src/shaders/dualkawaseup.frag000066400000000000000000000015631476226662700223720ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later varying highp vec2 pixelOffset1; varying highp vec2 pixelOffset2; varying highp vec2 pixelOffset3; varying highp vec2 pixelOffset4; varying highp vec2 pixelOffset5; varying highp vec2 pixelOffset6; varying highp vec2 pixelOffset7; varying highp vec2 pixelOffset8; uniform sampler2D qt_Texture; void main() { highp vec4 sum = texture2D(qt_Texture, pixelOffset1); sum += texture2D(qt_Texture, pixelOffset2) * 2.0; sum += texture2D(qt_Texture, pixelOffset3); sum += texture2D(qt_Texture, pixelOffset4) * 2.0; sum += texture2D(qt_Texture, pixelOffset5); sum += texture2D(qt_Texture, pixelOffset6) * 2.0; sum += texture2D(qt_Texture, pixelOffset7); sum += texture2D(qt_Texture, pixelOffset8) * 2.0; gl_FragColor = sum / 12.0; } dtkdeclarative-5.7.12/src/shaders/dualkawaseup.vert000066400000000000000000000023171476226662700224310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later varying highp vec2 pixelOffset1; varying highp vec2 pixelOffset2; varying highp vec2 pixelOffset3; varying highp vec2 pixelOffset4; varying highp vec2 pixelOffset5; varying highp vec2 pixelOffset6; varying highp vec2 pixelOffset7; varying highp vec2 pixelOffset8; attribute highp vec4 posAttr; attribute highp vec2 qt_VertexTexCoord; uniform highp mat4 matrix; uniform highp vec2 offset; uniform highp vec2 halfpixel; void main() { pixelOffset1 = qt_VertexTexCoord + vec2(-halfpixel.x * 2.0, 0.0) * offset; pixelOffset2 = qt_VertexTexCoord + vec2(-halfpixel.x, halfpixel.y) * offset; pixelOffset3 = qt_VertexTexCoord + vec2(0.0, halfpixel.y * 2.0) * offset; pixelOffset4 = qt_VertexTexCoord + vec2(halfpixel.x, halfpixel.y) * offset; pixelOffset5 = qt_VertexTexCoord + vec2(halfpixel.x * 2.0, 0.0) * offset; pixelOffset6 = qt_VertexTexCoord + vec2(halfpixel.x, -halfpixel.y) * offset; pixelOffset7 = qt_VertexTexCoord+ vec2(0.0, -halfpixel.y * 2.0) * offset; pixelOffset8 = qt_VertexTexCoord + vec2(-halfpixel.x, -halfpixel.y) * offset; gl_Position = matrix * posAttr; } dtkdeclarative-5.7.12/src/shaders/noise.frag000066400000000000000000000011721476226662700210150ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later varying highp vec2 qt_TexCoord; varying mediump float noise_y; uniform lowp float opacity; uniform sampler2D qt_Texture; uniform highp vec4 blendColor; const float noiseOpacity = 0.1; void main() { highp vec4 color = texture2D(qt_Texture, qt_TexCoord) * opacity; lowp vec3 rgb = blendColor.rgb; highp vec4 pixelColor = color * (1.0 - blendColor.a) + vec4(rgb * blendColor.a, blendColor.a); gl_FragColor = pixelColor * (1.0 - noiseOpacity) + vec4(vec3(noise_y) * noiseOpacity, noiseOpacity); } dtkdeclarative-5.7.12/src/shaders/noise.vert000066400000000000000000000010031476226662700210470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later varying highp vec2 qt_TexCoord; varying mediump float noise_y; attribute highp vec4 posAttr; attribute highp vec2 qt_VertexTexCoord; uniform highp mat4 matrix; float random (vec2 st) { return fract(sin(dot(st.xy, vec2(12.989, 78.233))) * 43758.5453123); } void main() { qt_TexCoord = qt_VertexTexCoord; noise_y = random(qt_VertexTexCoord); gl_Position = matrix * posAttr; } dtkdeclarative-5.7.12/src/shaders/quickitemviewport-opaque.frag000066400000000000000000000037571476226662700247760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later varying highp vec2 qt_TexCoord; uniform sampler2D qt_Texture; uniform sampler2D mask; uniform lowp vec2 maskScale; uniform lowp vec2 maskOffset; uniform lowp vec2 sourceScale; void main() { lowp vec2 scale = maskScale * sourceScale; // mask材质右下角的偏移量 lowp vec2 maskOffset2 = maskOffset + (1.0 / sourceScale) - 1.0; // 左上角的mask材质坐标 lowp vec2 tex_top_left = (qt_TexCoord - maskOffset) * scale; // 左下角的mask材质坐标,由于mask本身为左上角,因此还需要将材质按垂直方向翻转 lowp vec2 tex_bottom_left = (qt_TexCoord - vec2(maskOffset.s, maskOffset2.t)) * scale - vec2(0, scale.t - 1.0); tex_bottom_left.t = 1.0 - tex_bottom_left.t; // 将材质按垂直方向翻转 // 右上角的mask材质坐标,由于mask本身为左上角,因此还需要将材质按水平方向翻转 lowp vec2 tex_top_right = (qt_TexCoord - vec2(maskOffset2.s, maskOffset.t)) * scale - vec2(scale.s - 1.0, 0); tex_top_right.s = 1.0 - tex_top_right.s; // 将材质按水平方向翻转 // 右下角的mask材质坐标, 由于mask本身为左上角,因此还需要将材质翻转 lowp vec2 tex_bottom_right = 1.0 - ((qt_TexCoord - maskOffset2 - 1.0) * scale + 1.0); // 从mask材质中取出对应坐标的颜色 lowp vec4 mask_top_left = texture2D(mask, tex_top_left); lowp vec4 mask_bottom_left = texture2D(mask, tex_bottom_left); lowp vec4 mask_top_right = texture2D(mask, tex_top_right); lowp vec4 mask_bottom_right = texture2D(mask, tex_bottom_right); lowp vec4 tex = texture2D(qt_Texture, qt_TexCoord); // 统一计算此像素点被模板遮盖后的颜色,此处不需要区分点是否在某个区域,不在此区域时取出的mask颜色的alpha值必为1 tex *= mask_top_left * mask_bottom_left * mask_top_right * mask_bottom_right; gl_FragColor = tex * tex.a; } dtkdeclarative-5.7.12/src/shaders/quickitemviewport-opaque.vert000066400000000000000000000005601476226662700250240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later uniform highp mat4 qt_Matrix; attribute highp vec4 qt_VertexPosition; attribute highp vec2 qt_VertexTexCoord; varying highp vec2 qt_TexCoord; void main() { qt_TexCoord = qt_VertexTexCoord; gl_Position = qt_Matrix * qt_VertexPosition; }dtkdeclarative-5.7.12/src/shaders/quickitemviewport.frag000066400000000000000000000040251476226662700234730ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later varying highp vec2 qt_TexCoord; uniform lowp float opacity; uniform sampler2D qt_Texture; uniform sampler2D mask; uniform lowp vec2 maskScale; uniform lowp vec2 maskOffset; uniform lowp vec2 sourceScale; void main() { lowp vec2 scale = maskScale * sourceScale; // mask材质右下角的偏移量 lowp vec2 maskOffset2 = maskOffset + (1.0 / sourceScale) - 1.0; // 左上角的mask材质坐标 lowp vec2 tex_top_left = (qt_TexCoord - maskOffset) * scale; // 左下角的mask材质坐标,由于mask本身为左上角,因此还需要将材质按垂直方向翻转 lowp vec2 tex_bottom_left = (qt_TexCoord - vec2(maskOffset.s, maskOffset2.t)) * scale - vec2(0, scale.t - 1.0); tex_bottom_left.t = 1.0 - tex_bottom_left.t; // 将材质按垂直方向翻转 // 右上角的mask材质坐标,由于mask本身为左上角,因此还需要将材质按水平方向翻转 lowp vec2 tex_top_right = (qt_TexCoord - vec2(maskOffset2.s, maskOffset.t)) * scale - vec2(scale.s - 1.0, 0); tex_top_right.s = 1.0 - tex_top_right.s; // 将材质按水平方向翻转 // 右下角的mask材质坐标, 由于mask本身为左上角,因此还需要将材质翻转 lowp vec2 tex_bottom_right = 1.0 - ((qt_TexCoord - maskOffset2 - 1.0) * scale + 1.0); // 从mask材质中取出对应坐标的颜色 lowp vec4 mask_top_left = texture2D(mask, tex_top_left); lowp vec4 mask_bottom_left = texture2D(mask, tex_bottom_left); lowp vec4 mask_top_right = texture2D(mask, tex_top_right); lowp vec4 mask_bottom_right = texture2D(mask, tex_bottom_right); lowp vec4 tex = texture2D(qt_Texture, qt_TexCoord); // 统一计算此像素点被模板遮盖后的颜色,此处不需要区分点是否在某个区域,不在此区域时取出的mask颜色的alpha值必为1 tex *= mask_top_left * mask_bottom_left * mask_top_right * mask_bottom_right; gl_FragColor = tex * tex.a * opacity; } dtkdeclarative-5.7.12/src/shadow/000077500000000000000000000000001476226662700166725ustar00rootroot00000000000000dtkdeclarative-5.7.12/src/shadow/0.0.0.0.0.4.0.9.png000066400000000000000000000007001476226662700207730ustar00rootroot00000000000000PNG  IHDRs8 pHYs+rIDAT(n@ DgV\ɒEr[ ieXC|4   $BxWK)E4jRRff*nmUXP/8]!vKmy爒ICfq<[W1BQAĒEY_8t]C<"'E9Tըb]fn_Mv1/l:)sqD}llK!xmKuWo#0SDΗO/*3!>߇ZzZ)d0X?8LB beX,^;<3Kkm|YM/Q~ fCݶه!⬜˳;|wL`WWza켈s0Dp@1S8Ϲ{?_ Xg7!g9 &,7UMjR!=@ )ĘACSaIjh !4moi }o!R~7]c2m]'9횘n^ovP3֛xmS!kVe!ھY.WM ƾ!v=X/_nBRW?叟6$;Şa[=G5$a[k͎M1.| IENDB`dtkdeclarative-5.7.12/src/shadow/0.14.14.14.14.20.0.69.png000066400000000000000000000055271476226662700214770ustar00rootroot00000000000000PNG  IHDR@b pHYs+ IDATxۖ*@% i$I]gfթT^-nEWO|O5K/^.(7tZJ=s>~6xz^L؞_Y?;k);"6%\'EP;y2(:_{t9 *єzOtt蛔-Fy |M/FE1y3"fs1] թg QF4FIƊ em"**~a#$${) SB hAA6tJ!1%%$"ewTQQi=ID(Qoaw\Aˆ $(Mh)=LB}%%!4=2'&!fdD!!Q@8(KDDaJ)+Ե6/EDXX2"'xY!UD0SJA.=WBDKyʔR9SΡp忖oQ$sJ\͏▇4I)sy9m 7tKJR4oks&JFm/8f+ؚ*暊E%&Utq< msv"ܝj2&kOC˔R۶=m3̔=zm$8pZk-Dd5\h)eHY\TEY2Z R="c{lm9lkapoB$HxxfmmL|/EZ͇Zvb""UDt>2m9oxl۶%1On,\+BU$"q5̢'6;;D旯z)=-!EDZV7F4ZQY]!Rz" Dsʜ}i&7ΰL[U8sŲBƬ޷QZ6lHC&z-ΜRBP̹A .~9.=IU[kΕ~V9f's>PFY T9CrK h`u[}W~I|"R͙v  Ctź$s=af/bC^k!83AoRr9T@!z"ߙuiBD,J"j6,)j8__IV?붏lbf7q Q$dP$)6Uv]Y}Fo睛n *);=\k~7C|yi*LTPJxݔ#@J>պv+UUnÎŁ4-h/Q*9e ye eIq0GԠu]<Ncd,Ow#ُ4k]cNwgQZ}0otb6 Ƶp{YĀ^PUTqFqN1p|3e2+#e;E QQk|x #G 1 v{+u#"5F ꣵaAk$za 4ȮJarWdʔ~TQ^yipb зuY0G@^(z711*Ga.pY67dA1"f;R{RL]8BkO)!&%"=\k 3cGJ`fn^ڔTee \]מa%*&Yw&̵Rfc =E7 ި*범RԌ.ns10{o篵Zu-{`:'$/ "\k%D"ѳֺ8K\!o^'* U!iL$$YOZʾVwcq T(ky}sCz, '-˟e/h±VKh- [H/~)ϾH|9ˑ ̂ Ϝk{Ke4VW4*("TǒΈ(e/{KyKUTaDD*̟;o}m{, c6<8#%VLQ)E?xL2BG(>"SgpRj-VDn2duEU!ղPD\ :JKVLT TUϝTPMˉT (=/ 8cCf1[̑-r;e gb0P'r|s)]*$$Tl<iu|U%!; y ?Q27A {g6J0O'm / =8jODˆ#3/NWJK< л6:s= 3A =n^rF:-0xl;ˑv;|Q.O]%rh4K}[ot//o8 JcCdvU1w5m9jzep7AZ\c< }?VX]\ÞWP{#nuseD{57ŶmVkcn=Ju3?އT*lnjUXG)7LM3 pa{m=a۶xln F.Z^ZΛ ǚ8 nxlC=\wpN+8ZjVM("y$>ֺ=㱙T0Oňp2\s,F i<38p$gR3Qm)@iTQGq7ogqw}Y ̔(UGq]m v¨ T.n}rmC~+dL8PnStkTr2IENDB`dtkdeclarative-5.7.12/src/shadow/0.4.4.4.4.4.0.17.png000066400000000000000000000010141476226662700210710ustar00rootroot00000000000000PNG  IHDR%% pHYs+IDAT8Tko0 $o}s2Q뻻}c/jGeY/$>GIfEIENDB`dtkdeclarative-5.7.12/src/shadow/0.5.5.5.5.10.1.31.png000066400000000000000000000021461476226662700211560ustar00rootroot00000000000000PNG  IHDROO_Z pHYs+IDATXv6 _$K/HʞLG;:' ~B!}OwNVƗx:gO^{=v25Gљ z8x1B""A<_ GLĄHFG30>/MMM BÉHDiE֪-^D")S:'6\+/2Ky)ͻR"HD,iy)%_nZ'&pwha<-,ӔDT뾯BOM -)Or^e"Lt}MnD1-usJZ,U{9FMxfӭ4Apw3wwG0 㶻2@$n:v3Ӫ2kZn^mZKRJ{x\ʾoBQmR 8p* OGۺ[x@ FmM[uD wur\>m߫jw0Ϭֲ #u+q[B|~~~{i%8n~~^j_`RSoly覄nuQٷv`gMZ^ևJ-jv_]S}Y=q]toU~U_38D7:V~K=:`idޟw'w~r1L| `IENDB`dtkdeclarative-5.7.12/src/shadow/0.8.8.8.8.10.1.37.png000066400000000000000000000023231476226662700211750ustar00rootroot00000000000000PNG  IHDRUU pHYs+IDATXr8E&֭Aە37شZ)G` 6>?_z?ssDD_>׆"9pH~n6w(!݉`mX\LLLD4Rpw3355UssXup_jFh F֯ n"b A3ڡUjCCpu@%cA"`nZ WͺV@B4i13ѾV3VK"GY4<1!!FZJ p8iYeQXDi+%Au7r\s`5t:O<#a-D$y9_.2 LZM[-UUU \i^Η.eȑj) kk2+>U$Nr:_.<ţԒ ZKHOdNj j9ˆ إs<ϧLQ@ B`9L#EB,Sݴ12LjD5D<4M`L} c iB1Q }<."""ADࡉlygpGpwF)kf nDF㭄F`e_ݾ^pKߛm׆#iX1=,%}SM}S7M}S7[vkǝwA #Vi [Aڏ3jffdYֺJۣTaTG}Xo^Ok~lmjo60Vk&p;F-RkCa:_ZJ}p[r9RzcWڙ)@`zt]-u5ZrJUC^SJԑ F@֒-򂗑[ʥV-=BZ!&V^]rim/{dϯyD׏?@M[efFpE?v\jS냫ku3m vnTjۆW}”F< j~%Ҵ@:*kk'kn}.\WZWmϳrtb7M'_/_ڇ=o=z&ً> 0qwfzIENDB`dtkdeclarative-5.7.12/src/shadow/0.8.8.8.8.20.0.57.png000066400000000000000000000050471476226662700212050ustar00rootroot00000000000000PNG  IHDR7f pHYs+ IDATxۚ8 FI܉:[j9ofLjRZA~Moj& /iM{zy.^[o=/dN;5dp3CBO?K KywŴS{r?:.?BzuGuS 1ٮ൮؈T+O0U}'30#30UTEP@G05X;`Xykd-Y` RV*U6x:Ҁ~!RuUOW(**vJ#( Qt+cV2UTcS*]YEDltDEDQ2f`D興5+}SL"PMt ȑ#r`Bb10T37 .s9rΞ ɶ͖|q1 3J,dAF3#Wz/EM.ff"DG/{f1bV9;\Fks-3'DHm1oY ryyon=`.%JXNSNz@ 3{7PY 2fĎ X@q9} 2$"yOfBS--XRɾE*-Բl]>Qɢ,C&ھfd)%GDd$HES>]t?B{)i&",SJ*":C|Ef/YtʂcopG85d)% DIYP%9|ez3?+0w 'LDd`drm4;#iifQYCaixӅp,YJ`!"wyv Iqe]ìu8#+ٕqq"G=>0F<'dafG O}Vz'U2,D&,}*!v 9C?CᰔFo:9_ Ds-x? '"DQ.s1:U]]kVt6%jq58ؗ 6+e0k6.˲lmFԼyM3DDU`mSN:gG!*̾NdvJ ,\Y@U$U"GT:R]\'CUu2 霧nc*^U DSuk Vft;n̩3bYѦqW>JefX$fcw$*rU~-K}q(pm-9k!hh7-Nq>껶np֬;x'AS?-mt.#o'ߵl}{!۷l}{!۷l}{!۷l}{!۷l}{!۷l;JS Uo/bGSn:a_]ʥ-4{lYwc]i;Ptw um/ɴoL5'оִb d2Fj V.k4_?rzJz Q)aR**3YYa5cWw/TL.or-*Mz0 c|:YٱNHVR1ŵ(!~r5!p]+<#$,qJ)qJܼz k7%rXI/׮ & b mIfpJCP۶"h:.k%69XSJ)"N)-G\3@JR*,hp{JtkcP$d)HV!"|K}@zeA^ce#"٤FGͬcf%btK sL_hj\렪|_N+bsU釨Y 3^3EybWvg6dCE&N:b[kb9biu(XdZ"L(UTWb|+ƒnk/g"#Y'Z%1W&:x;Q8ʻ7S)NvUA+k^9E{;\Ȭ(('"")WrY'bJ)Ŕd[٦U;K{ʫ`V$SJɵJMo*^Uo.㬰JiD K5eM}SB܌} //VZ5aa1߉ԩ~^,:eʳ} * q_:r,"mm7|gZ@UHZeR17Y[cKia[ dv> NzDYyWejL|<ӾSl뛑G !&/&_at&#MdBľ/B ,\uUo;"A>fx giwq>pbɇ%`DiXa.L`"v>+<,/;&bxŝ; 0ιi 0@ b+-]u\N[_W:^]aU30^zYa`@S !Ĕ.f+fB4m~MSڦBR3ilwۺ.}jhڷf('MZ֛vb#^yY5$z=?TMH4/+ܴQY옑zyտ_.AA,}44cvH43i^M}*hSeȳIENDB`dtkdeclarative-5.7.12/src/shadow/0.8.8.8.8.6.0.29.png000066400000000000000000000014501476226662700211220ustar00rootroot00000000000000PNG  IHDR99sY pHYs+IDATHݒ8 %[vLBA=T46t0\U"UPC‘O dEX/kK qb7P+2)\@4i"QRr.0W*6ZcRjdR1R@m iuWKNs"P0l~O^!0Hͩnn;CJW˜S8O#a zRbco kƋ: %TZ|%8sxֺ:H@|6(VqvwbD8[ 9w֛a~chq$k(azWo*Msn:kIu4KZ:X@Q54 "*HN iRCJ)c?@ma5cҚy8>&or[LGiY={ENjNz\+s.En^S)\e%bJp `Zdu8KsCIgPwY<{9̩408h4N2 Mpg;S x:!O8=Kl9A8ICoxJ pIA!p  7< C5&{CHc5Btv؈N葯FI'5?c {Q<{/v|?^1q1Flo(֕IENDB`dtkdeclarative-5.7.12/src/shadow/2.5.5.5.5.10.1.32.png000066400000000000000000000022371476226662700211620ustar00rootroot00000000000000PNG  IHDRPPzq pHYs+QIDATXr*9 ymK 8]\J/yg0w_C,n}}n<(-ā5r `n" "!"ҎfffnDD$$""e57`LM^ (;jT_ ZTGD"A(=Vk-Z[3u/5 29YTvWm<ϥԦ8fDbcjjSه"ty.?X$T9axtJ:b!!s1: 1i-|:\jS{" Ō`MM[+t9s:]x؁)5  MWʹRtZUxBؾx9A}q0RՀB|4___ǜ"lpM H{xkK]ؚ^yǯCN HA< lyHbj![9r \M"A#7 "K{j$`+a#(,i[Cm">mUz׊Hfyf%7};v6%}!]*KS?LɵKؽTf}rqw㏥* GIENDB`dtkdeclarative-5.7.12/src/shadow/2.5.5.5.5.10.1.35.png000066400000000000000000000022471476226662700211660ustar00rootroot00000000000000PNG  IHDRSSd pHYs+YIDATXn#9 Ei_:cJyj8ԥ5:< 1}2n>/q}n4 ,8A0% """ܭ䍀HH;薻-> ݘ=e35USSs{IHLL@=P!UU EXU#7Zj=H,$8\ioRJ5SoGB&BT3@QNy織T&HbLMwy.4ϥ55Gq"Ĕj3 "Cw|.SUGIḂHLDxfZ|9N4kD,!6$f1#Xkq<]NNi̔&fj)|tZUBVΝ9ĦSun-TK|ڞ.S~q>OHaKXnK_ke.s֋d?s7PljcmTڳZ@vRݖ̞2q>7r<B@uAdzv_HZ#"ʏϱ5w 5;v ~'o7Wţajȝo=w[Awi&P.IENDB`dtkdeclarative-5.7.12/src/shadow/2.8.8.8.8.1.0.17.png000066400000000000000000000003311476226662700211110ustar00rootroot00000000000000PNG  IHDRA| pHYs+IDAT(ѻ 0YrS 84'!w:P6?~l`fô@>#bη";^pKऽ]j_Ce$~F䤱QrR"O^@ZÚ.?V az@tIENDB`dtkdeclarative-5.7.12/src/shadow/2.8.8.8.8.1.0.18.png000066400000000000000000000003321476226662700211130ustar00rootroot00000000000000PNG  IHDRb$ pHYs+IDAT(0 DWNM zq Qiٻn賒 e̺aP+:^^?X nbVI у\ Ixj.4y0IMK~ضy()JRLs{%@Va}З$IENDB`dtkdeclarative-5.7.12/src/shadow/2.8.8.8.8.10.1.35.png000066400000000000000000000024061476226662700211770ustar00rootroot00000000000000PNG  IHDRSSd pHYs+IDATXv: u`N!mI(U_~ɖc t~ rۗ+Ly >!\cw:}D vqۛ>PBWw;~#""!6 `fff I<;vPِjef;HDՂۡnZsdfa1vwwRKjnϘ"AS/fs)V5;sD"!/Lk)y<\#%ĘJMjMk4M<\?҉HLb/t8^qR>),!Pl?m;:՗ܕ]ίv0Z-TO-Y|p?nm^=/Ί_/e~z pg 3{草!jM}E%Sn^1zzCDFϟtoW;JH"^.ex~ͶQثR$!s2KDhSEJ!COClҥ}dcJE ?;bJCJ1v*ų"!4(0v&:""y9Pǥx! t m\Z)Ry8NCc2-#Li(!_a0(Bu-sej~+ pHYs+IDATXے8 u`E!mI{aӜfkoE_~HN,O#To}'+X-|l; >=;m(;" "" "n+xw @DDB$l`co;v\٨jef;wHDՌ\YjժO  fUkZUܞ` EwZAV TK)%RJjֱ_2$" !D = Z3ysf\@@$bc*58KnZKi)RMZDb5oxaɄv2b(C)SmumM.WkOb@' ZZlֻmUUUS}p3S˚`n<:"t:ؗU=.ԯ;Z#`LAWe]Ǭ"3ݏۘ7Ѓ~~.a./ :jM ڛ$ϸ |]:$טDd!Sڈ+%h y"^ex[xvXDB`@O$,ABfMbB*!B/$FH7aB)5D~eSRsW! !_[pCnoǢ#"Ki\ kKt80} sҐK[Ǿ?OӡaU,4ڨ/0(B592tjzr&A<_eftˆ%֣MRAkGAnb⼨y)H}zxdcx#aH_v': icI֔yadJLƂai]½o~Ar3A:G( 4njH*<#`?!| v'URcS.VˉP - N/^-"MPL xpi =k =#{C?:IENDB`dtkdeclarative-5.7.12/src/shadow/2.8.8.8.8.2.1.22.png000066400000000000000000000007611476226662700211160ustar00rootroot00000000000000PNG  IHDR V%( pHYs+IDAT8IO@_Uw{ HHc $$(bdksdeRէRu{dq8dZc]DLmuUUBu]%h ]$8)h;| zt2; H9.hgW 4[vfZei HYg7_ď X۸ KE~IzXv|Ol/f0 ' b {ITbsDŽv9l`p߫Q ՟g wz͑~->?+ kIENDB`dtkdeclarative-5.7.12/src/shadow/2.8.8.8.8.2.1.24.png000066400000000000000000000007571476226662700211250ustar00rootroot00000000000000PNG  IHDR"",T pHYs+IDAT8͔IO@_HH$́ẃ#E 198+uԵk'bf"QeY8Ң-UP5a($ק:SMbh260*yN6AMzo:UT@JK@*u'#Nc֏V4Z OC-wjhy ]{LGq0*Om.*Kse0M]͞Vmn'6@|TjΘYf#0Hz@ˁI $YRY سN|I’=Y|q< M IENDB`dtkdeclarative-5.7.12/src/src.cmake000066400000000000000000000035671476226662700172110ustar00rootroot00000000000000# common src file(GLOB_RECURSE HEADERS "${PROJECT_SOURCE_DIR}/src/*.h") file(GLOB_RECURSE SRCS "${PROJECT_SOURCE_DIR}/src/*.cpp") file(GLOB D_HEADERS ${PROJECT_SOURCE_DIR}/src/DAppLoader ${PROJECT_SOURCE_DIR}/src/DQmlAppMainWindowInterface ${PROJECT_SOURCE_DIR}/src/DQmlAppPreloadInterface ${PROJECT_SOURCE_DIR}/src/DQuickBlitFramebuffer ${PROJECT_SOURCE_DIR}/src/DQuickItemViewport ${PROJECT_SOURCE_DIR}/src/DQuickWindow ) file(GLOB PUBLIC_HEADERS ${PROJECT_SOURCE_DIR}/src/dapploader.h ${PROJECT_SOURCE_DIR}/src/dqmlappmainwindowinterface.h ${PROJECT_SOURCE_DIR}/src/dqmlapppreloadinterface.h ${PROJECT_SOURCE_DIR}/src/dquickblitframebuffer.h ${PROJECT_SOURCE_DIR}/src/dquickitemviewport.h ${PROJECT_SOURCE_DIR}/src/dquickwindow.h ${PROJECT_SOURCE_DIR}/src/dtkdeclarative_global.h ) # exclusive to dtk5 if (EnableDtk5) list(APPEND D_HEADERS ${PROJECT_SOURCE_DIR}/src/DPlatformThemeProxy ${PROJECT_SOURCE_DIR}/src/DQuickSystemPalette ) list(APPEND PUBLIC_HEADERS ${PROJECT_SOURCE_DIR}/src/dplatformthemeproxy.h ${PROJECT_SOURCE_DIR}/src/dquicksystempalette.h ) list(REMOVE_ITEM HEADERS ${PROJECT_SOURCE_DIR}/src/private/dbackdropnode_p.h ${PROJECT_SOURCE_DIR}/src/private/dquickbackdropblitter_p.h ${PROJECT_SOURCE_DIR}/src/private/dquickborderimage_p.h ) list(REMOVE_ITEM SRCS ${PROJECT_SOURCE_DIR}/src/private/dbackdropnode.cpp ${PROJECT_SOURCE_DIR}/src/private/dquickbackdropblitter.cpp ${PROJECT_SOURCE_DIR}/src/private/dquickborderimage.cpp ) endif() # exclusive to dtk6 if (EnableDtk6) list(REMOVE_ITEM HEADERS ${PROJECT_SOURCE_DIR}/src/dquicksystempalette.h ${PROJECT_SOURCE_DIR}/src/private/dquicksystempalette_p.h ) list(REMOVE_ITEM SRCS ${PROJECT_SOURCE_DIR}/src/dquicksystempalette.cpp ) endif() dtkdeclarative-5.7.12/src/targets.cmake000066400000000000000000000063641476226662700200710ustar00rootroot00000000000000# Add secure compiler options set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-all") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-all") set(CMAKE_EXE_LINKER_FLAGS "-z relro -z now -z noexecstack -pie") # For mips64 if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "mips64") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -ftree-vectorize -march=loongson3a -mhard-float -mno-micromips -mno-mips16 -flax-vector-conversions -mloongson-ext2 -mloongson-mmi") endif() find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Quick DBus QuickControls2 LinguistTools) find_package(Dtk${DTK_VERSION_MAJOR}Core REQUIRED) find_package(Dtk${DTK_VERSION_MAJOR}Gui REQUIRED) find_package(PkgConfig REQUIRED) pkg_check_modules(GL REQUIRED IMPORTED_TARGET gl) include(${PROJECT_SOURCE_DIR}/src/src.cmake) file(GLOB ASSETS_RCS ${PROJECT_SOURCE_DIR}/src/dtkdeclarative_assets.qrc) file(GLOB TS_FILES "${PROJECT_SOURCE_DIR}/src/translations/*.ts") add_library(${LIB_NAME}_properties INTERFACE) add_library(${LIB_NAME}_sources INTERFACE) target_sources(${LIB_NAME}_sources INTERFACE ${SRCS} ${HEADERS} ${D_HEADERS} ${ASSETS_RCS} ) set(DTK_QML_APP_PLUGIN_PATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/${LIB_NAME}/qml-app" CACHE STRING "dtk qml app plugin path") set(DTK_QML_APP_PLUGIN_SUBPATH "dtkdeclarative/plugins" CACHE STRING "dtk qml app plugin subpath") target_compile_definitions(${LIB_NAME}_properties INTERFACE DTK_QML_APP_PLUGIN_PATH="${DTK_QML_APP_PLUGIN_PATH}" DTK_QML_APP_PLUGIN_SUBPATH="${DTK_QML_APP_PLUGIN_SUBPATH}" DDECLARATIVE_TRANSLATIONS_DIR="${DDECLARATIVE_TRANSLATIONS_DIR}" ) if(USE_QQuickStylePluginPrivate) target_link_libraries(${LIB_NAME}_properties INTERFACE $ ) endif() target_link_libraries(${LIB_NAME}_properties INTERFACE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Quick Dtk${DTK_VERSION_MAJOR}::Core Dtk${DTK_VERSION_MAJOR}::Gui $ $ $ ) target_include_directories(${LIB_NAME}_properties INTERFACE $ $ $ ) target_include_directories(${LIB_NAME}_properties INTERFACE $ ) target_link_directories(${LIB_NAME}_properties INTERFACE $ $ ) # gen dtkdeclarative_config.h include(DtkBuildConfig) gen_dtk_config_header(MODULE_NAME ${LIB_NAME} HEADERS ${D_HEADERS} DEST_DIR ${CMAKE_CURRENT_BINARY_DIR} OUTPUT_VARIABLE CONFIG_PATH) list(APPEND PUBLIC_HEADERS ${CONFIG_PATH}) # Install headers install(FILES ${PUBLIC_HEADERS} ${D_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}") # Install ${LIB_NAME}_properties install(TARGETS ${LIB_NAME}_properties EXPORT Dtk${DTK_VERSION_MAJOR}DeclarativeProperties DESTINATION "${LIB_INSTALL_DIR}") install(EXPORT Dtk${DTK_VERSION_MAJOR}DeclarativeProperties NAMESPACE Dtk${DTK_VERSION_MAJOR}:: FILE Dtk${DTK_VERSION_MAJOR}DeclarativePropertiesTargets.cmake DESTINATION "${CONFIG_INSTALL_DIR}") dtkdeclarative-5.7.12/src/translations/000077500000000000000000000000001476226662700201265ustar00rootroot00000000000000dtkdeclarative-5.7.12/src/translations/dtkdeclarative.ts000066400000000000000000000071721476226662700234730ustar00rootroot00000000000000 AboutAction About AboutDialog Version Homepage Description HelpAction Help QuitAction Exit SearchEdit Search SettingsDialog Restore Defaults TextField Copy Cut Paste Select All Undo Redo ThemeMenu Theme Light Theme Dark Theme System Theme dtkdeclarative-5.7.12/src/translations/dtkdeclarative_ar.ts000066400000000000000000000037151476226662700241540ustar00rootroot00000000000000 AboutAction About حول HelpAction Help مساعدة QuitAction Exit خروج SearchEdit Search بحث SettingsDialog Restore Defaults استعادة الإعدادت الإفتراضية ThemeMenu Theme الموضوع Light Theme موضوع فاتح Dark Theme موضوع غامق System Theme موضوع النظام dtkdeclarative-5.7.12/src/translations/dtkdeclarative_ast.ts000066400000000000000000000036101476226662700243330ustar00rootroot00000000000000 AboutAction About Tocante a HelpAction Help Ayuda QuitAction Exit Colar SearchEdit Search SettingsDialog Restore Defaults Reafitar valores ThemeMenu Theme Estilu Light Theme Estilu claru Dark Theme Estilu escuru System Theme Estilu del sistema dtkdeclarative-5.7.12/src/translations/dtkdeclarative_az.ts000066400000000000000000000047261476226662700241670ustar00rootroot00000000000000 AboutAction About Haqqında AboutDialog Version Versiya Homepage Ev səhifəsi Description Təsviri HelpAction Help Kömək QuitAction Exit Çıxış SearchEdit Search Axtarış SettingsDialog Restore Defaults Standartları bərpa edin ThemeMenu Theme Mövzu Light Theme İşıqlı mövzu Dark Theme Tutqun mövzu System Theme Sistem mövzusu dtkdeclarative-5.7.12/src/translations/dtkdeclarative_bo.ts000066400000000000000000000053161476226662700241510ustar00rootroot00000000000000 AboutAction About སྐོར། AboutDialog Version པར་གཞི། Homepage གཙོ་ངོས། Description ཞིབ་བརྗོད། HelpAction Help རོགས་པ། QuitAction Exit ཕྱིར་འབུད། SearchEdit Search འཚོལ་ཞིབ། SettingsDialog Restore Defaults སོར་བཞག་སླར་གསོ། ThemeMenu Theme བརྗོད་བྱ་གཙོ་བོ། Light Theme ཁ་དཀར་པོ། Dark Theme ཁ་སྨུག་པོ། System Theme མ་ལག་གི་རྗེས་འབྲངས་བ། dtkdeclarative-5.7.12/src/translations/dtkdeclarative_br.ts000066400000000000000000000035741476226662700241600ustar00rootroot00000000000000 AboutAction About Diwar-benn HelpAction Help Skoazell QuitAction Exit Kuitaat SearchEdit Search Klask SettingsDialog Restore Defaults Adderaouiñ ThemeMenu Theme Tem Light Theme Tem sklaer Dark Theme Tem teñval System Theme Tem ar sistem dtkdeclarative-5.7.12/src/translations/dtkdeclarative_ca.ts000066400000000000000000000047111476226662700241320ustar00rootroot00000000000000 AboutAction About Quant a AboutDialog Version Versió Homepage Pàgina inicial Description Descripció HelpAction Help Ajuda QuitAction Exit Surt SearchEdit Search Cerca SettingsDialog Restore Defaults Restableix els valors per defecte ThemeMenu Theme Tema Light Theme Tema clar Dark Theme Tema fosc System Theme Tema del sistema dtkdeclarative-5.7.12/src/translations/dtkdeclarative_cs.ts000066400000000000000000000036371476226662700241620ustar00rootroot00000000000000 AboutAction About O aplikaci HelpAction Help Nápověda QuitAction Exit Ukončit SearchEdit Search Hledat SettingsDialog Restore Defaults Vráti na výchozí hodnoty ThemeMenu Theme Vzhled Light Theme Světlý vzhled Dark Theme Tmavý vzhled System Theme Systémový vzhled dtkdeclarative-5.7.12/src/translations/dtkdeclarative_da.ts000066400000000000000000000035671476226662700241430ustar00rootroot00000000000000 AboutAction About Om HelpAction Help Hjælp QuitAction Exit Afslut SearchEdit Search Søg SettingsDialog Restore Defaults Gendan standarder ThemeMenu Theme Tema Light Theme Lyst tema Dark Theme Mørkt tema System Theme Systemets tema dtkdeclarative-5.7.12/src/translations/dtkdeclarative_de.ts000066400000000000000000000047121476226662700241400ustar00rootroot00000000000000 AboutAction About Über AboutDialog Version Version Homepage Description Beschreibung HelpAction Help Hilfe QuitAction Exit Beenden SearchEdit Search Suchen SettingsDialog Restore Defaults Standardeinstellungen wiederherstellen ThemeMenu Theme Thema Light Theme Helles Thema Dark Theme Dunkles Thema System Theme Systemthema dtkdeclarative-5.7.12/src/translations/dtkdeclarative_es.ts000066400000000000000000000047161476226662700241630ustar00rootroot00000000000000 AboutAction About Acerca de AboutDialog Version Versión Homepage Página web Description Descripción HelpAction Help Ayuda QuitAction Exit Salir SearchEdit Search Buscar SettingsDialog Restore Defaults Restaurar valores predeterminados ThemeMenu Theme Tema Light Theme Tema claro Dark Theme Tema oscuro System Theme Tema del sistema dtkdeclarative-5.7.12/src/translations/dtkdeclarative_fa.ts000066400000000000000000000036411476226662700241360ustar00rootroot00000000000000 AboutAction About درباره HelpAction Help راهنما QuitAction Exit خروج SearchEdit Search جستجو SettingsDialog Restore Defaults بازیابی پیش فرض ThemeMenu Theme تم Light Theme تم روشن Dark Theme تم تیره System Theme تم سیستم dtkdeclarative-5.7.12/src/translations/dtkdeclarative_fi.ts000066400000000000000000000046441476226662700241520ustar00rootroot00000000000000 AboutAction About Tietoja AboutDialog Version Versio Homepage Kotisivu Description Kuvaus HelpAction Help Apua QuitAction Exit Poistu SearchEdit Search Etsi SettingsDialog Restore Defaults Palauta oletukset ThemeMenu Theme Teema Light Theme Vaalea Dark Theme Tumma System Theme Järjestelmän dtkdeclarative-5.7.12/src/translations/dtkdeclarative_fr.ts000066400000000000000000000036251476226662700241610ustar00rootroot00000000000000 AboutAction About À propos HelpAction Help Aide QuitAction Exit Quitter SearchEdit Search Chercher SettingsDialog Restore Defaults Réinitialiser par défaut ThemeMenu Theme Thème Light Theme Thème clair Dark Theme Thème sombre System Theme Thème du système dtkdeclarative-5.7.12/src/translations/dtkdeclarative_gl_ES.ts000066400000000000000000000036041476226662700245400ustar00rootroot00000000000000 AboutAction About Sobre HelpAction Help Axuda QuitAction Exit Saír SearchEdit Search Buscar SettingsDialog Restore Defaults Restaurar predefinidos ThemeMenu Theme Tema Light Theme Tema claro Dark Theme Tema escuro System Theme Tema do sistema dtkdeclarative-5.7.12/src/translations/dtkdeclarative_hi_IN.ts000066400000000000000000000040251476226662700245330ustar00rootroot00000000000000 AboutAction About बारे में HelpAction Help मदद QuitAction Exit बंद करें SearchEdit Search खोजें SettingsDialog Restore Defaults मूल स्वरूप पुनः स्थापित करें ThemeMenu Theme थीम Light Theme हल्की थीम Dark Theme गहरी थीम System Theme सिस्टम थीम dtkdeclarative-5.7.12/src/translations/dtkdeclarative_hr.ts000066400000000000000000000035751476226662700241670ustar00rootroot00000000000000 AboutAction About O programu HelpAction Help Pomoć QuitAction Exit Izlaz SearchEdit Search Traži SettingsDialog Restore Defaults Obnovi zadano ThemeMenu Theme Tema Light Theme Svijetla tema Dark Theme Tamna tema System Theme Tema sustava dtkdeclarative-5.7.12/src/translations/dtkdeclarative_hu.ts000066400000000000000000000047431476226662700241700ustar00rootroot00000000000000 AboutAction About Az alkalmazásról AboutDialog Version Verzió Homepage Kezdőoldal Description Leírás HelpAction Help Segítség QuitAction Exit Kilépés SearchEdit Search Keresés SettingsDialog Restore Defaults Alapértelmezések visszaállítása ThemeMenu Theme Téma Light Theme Világos mód Dark Theme Sötét mód System Theme Rendszer téma dtkdeclarative-5.7.12/src/translations/dtkdeclarative_it.ts000066400000000000000000000036051476226662700241640ustar00rootroot00000000000000 AboutAction About Info HelpAction Help Aiuto QuitAction Exit Esci SearchEdit Search Cerca SettingsDialog Restore Defaults Ripristina valori predefiniti ThemeMenu Theme Tema Light Theme Tema chiaro Dark Theme Tema scuro System Theme Tema di Sistema dtkdeclarative-5.7.12/src/translations/dtkdeclarative_ko.ts000066400000000000000000000036471476226662700241670ustar00rootroot00000000000000 AboutAction About 프로그램 정보 HelpAction Help 도움말 QuitAction Exit 종료 SearchEdit Search 검색 SettingsDialog Restore Defaults 기본값 복원 ThemeMenu Theme 테마 Light Theme 밝은 색상 테마 Dark Theme 어두운 색상 테마 System Theme 시스템 테마 dtkdeclarative-5.7.12/src/translations/dtkdeclarative_lt.ts000066400000000000000000000036051476226662700241670ustar00rootroot00000000000000 AboutAction About Apie HelpAction Help Žinynas QuitAction Exit Išeiti SearchEdit Search Ieškoti SettingsDialog Restore Defaults Atkurti numatytuosius ThemeMenu Theme Tema Light Theme Šviesi tema Dark Theme Tamsi tema System Theme Sistemos tema dtkdeclarative-5.7.12/src/translations/dtkdeclarative_ms.ts000066400000000000000000000035701476226662700241700ustar00rootroot00000000000000 AboutAction About Perihal HelpAction Help Bantuan QuitAction Exit Keluar SearchEdit Search Gelintar SettingsDialog Restore Defaults Pulih Lalai ThemeMenu Theme Tema Light Theme Tema Cerah Dark Theme Tema Gelap System Theme Tema Sistem dtkdeclarative-5.7.12/src/translations/dtkdeclarative_ne.ts000066400000000000000000000040751476226662700241540ustar00rootroot00000000000000 AboutAction About बारेमा HelpAction Help मद्दत QuitAction Exit बाहिर निस्कनुहोस् SearchEdit Search खोज्नुहोस् SettingsDialog Restore Defaults फेरी पहिलाकै अवस्था मा लैजाऊ ThemeMenu Theme थेम Light Theme लाईट थेम Dark Theme दर्क थेम System Theme सिस्टम थेम dtkdeclarative-5.7.12/src/translations/dtkdeclarative_nl.ts000066400000000000000000000046771476226662700241730ustar00rootroot00000000000000 AboutAction About Over AboutDialog Version Versie Homepage Website Description Beschrijving HelpAction Help Hulp QuitAction Exit Afsluiten SearchEdit Search Zoeken SettingsDialog Restore Defaults Standaardwaarden herstellen ThemeMenu Theme Thema Light Theme Licht thema Dark Theme Donker thema System Theme Systeemthema dtkdeclarative-5.7.12/src/translations/dtkdeclarative_pl.ts000066400000000000000000000046561476226662700241720ustar00rootroot00000000000000 AboutAction About O programie AboutDialog Version Wersja Homepage Strona główna Description Opis HelpAction Help Pomoc QuitAction Exit Wyjdź SearchEdit Search Szukaj SettingsDialog Restore Defaults Przywróć domyślne ThemeMenu Theme Motyw Light Theme Jasny Dark Theme Ciemny System Theme Systemowy dtkdeclarative-5.7.12/src/translations/dtkdeclarative_pt.ts000066400000000000000000000036061476226662700241740ustar00rootroot00000000000000 AboutAction About Sobre HelpAction Help Ajuda QuitAction Exit Sair SearchEdit Search Pesquisar SettingsDialog Restore Defaults Restaurar Predefinições ThemeMenu Theme Tema Light Theme Tema Claro Dark Theme Tema Escuro System Theme Tema do Sistema dtkdeclarative-5.7.12/src/translations/dtkdeclarative_pt_BR.ts000066400000000000000000000035601476226662700245560ustar00rootroot00000000000000 AboutAction About Sobre HelpAction Help Ajuda QuitAction Exit Sair SearchEdit Search Pesquisar SettingsDialog Restore Defaults Restaurar Padrões ThemeMenu Theme Tema Light Theme Claro Dark Theme Escuro System Theme Padrão dtkdeclarative-5.7.12/src/translations/dtkdeclarative_ro.ts000066400000000000000000000036571476226662700241770ustar00rootroot00000000000000 AboutAction About Despre HelpAction Help Ajutor QuitAction Exit Ieșire SearchEdit Search Căutare SettingsDialog Restore Defaults Restabilirea sătărilor de bază ThemeMenu Theme Temă Light Theme Temă culoare deschisă Dark Theme Temă culoare întunecată System Theme Temă de sistem dtkdeclarative-5.7.12/src/translations/dtkdeclarative_ru.ts000066400000000000000000000037571476226662700242060ustar00rootroot00000000000000 AboutAction About О программе HelpAction Help Помощь QuitAction Exit Выход SearchEdit Search Поиск SettingsDialog Restore Defaults Восстановить значения По-умолчанию ThemeMenu Theme Тема Light Theme Светлая Тема Dark Theme Темная Тема System Theme Тема Системы dtkdeclarative-5.7.12/src/translations/dtkdeclarative_sl.ts000066400000000000000000000035731476226662700241720ustar00rootroot00000000000000 AboutAction About O tem HelpAction Help Pomoč QuitAction Exit Izhod SearchEdit Search iskanje SettingsDialog Restore Defaults Obnovi privzeto ThemeMenu Theme Tema Light Theme Svetla tema Dark Theme Temna tema System Theme Sistemska tema dtkdeclarative-5.7.12/src/translations/dtkdeclarative_sq.ts000066400000000000000000000046771476226662700242050ustar00rootroot00000000000000 AboutAction About Mbi AboutDialog Version Version Homepage Faqe hyrëse Description Përshkrim HelpAction Help Ndihmë QuitAction Exit Dil SearchEdit Search Kërko SettingsDialog Restore Defaults Rikthe Parazgjedhjet ThemeMenu Theme Temë Light Theme Temë e Çelët Dark Theme Temë e Errët System Theme Temë Sistemi dtkdeclarative-5.7.12/src/translations/dtkdeclarative_sr.ts000066400000000000000000000037251476226662700241770ustar00rootroot00000000000000 AboutAction About О програму HelpAction Help Помоћ QuitAction Exit Изађи SearchEdit Search Претражи SettingsDialog Restore Defaults Врати Подразумевано ThemeMenu Theme Тема Light Theme Светла тема Dark Theme Тамна тема System Theme Системска тема dtkdeclarative-5.7.12/src/translations/dtkdeclarative_tr.ts000066400000000000000000000036141476226662700241750ustar00rootroot00000000000000 AboutAction About Hakkında HelpAction Help Yardım QuitAction Exit Çıkış SearchEdit Search Ara SettingsDialog Restore Defaults Varsayılanları Geri Yükle ThemeMenu Theme Tema Light Theme Açık Tema Dark Theme Koyu Tema System Theme Sistem Teması dtkdeclarative-5.7.12/src/translations/dtkdeclarative_ug.ts000066400000000000000000000050731476226662700241640ustar00rootroot00000000000000 AboutAction About ھەققىدە AboutDialog Version نەشرى Homepage باش بەت Description تەسۋىر HelpAction Help ياردەم QuitAction Exit چېكىنىش SearchEdit Search ئىزدەش SettingsDialog Restore Defaults ئەسلىدىكى تەڭشەك ھالىتىگە قايتۇرۇش ThemeMenu Theme ئۇسلۇب Light Theme يورۇق ئۇسلۇب Dark Theme قارا ئۇسلۇب System Theme سېستىما ئۇسلۇبى dtkdeclarative-5.7.12/src/translations/dtkdeclarative_uk.ts000066400000000000000000000051021476226662700241610ustar00rootroot00000000000000 AboutAction About Про програму AboutDialog Version Версія Homepage Домашня сторінка Description Опис HelpAction Help Довідка QuitAction Exit Вийти SearchEdit Search Пошук SettingsDialog Restore Defaults Відновити значення за замовчуванням ThemeMenu Theme Тема Light Theme Світла тема Dark Theme Темна тема System Theme Тема системи dtkdeclarative-5.7.12/src/translations/dtkdeclarative_zh_CN.ts000066400000000000000000000066771476226662700245650ustar00rootroot00000000000000 AboutAction About 关于 AboutDialog Version 版本 Homepage 主页 Description 描述 HelpAction Help 帮助 QuitAction Exit 退出 SearchEdit Search 搜索 SettingsDialog Restore Defaults 恢复默认 TextField Copy 复制 Cut 剪切 Paste 粘贴 Select All 全选 Undo 撤销 Redo 重做 ThemeMenu Theme 主题 Light Theme 浅色 Dark Theme 深色 System Theme 跟随系统 dtkdeclarative-5.7.12/src/translations/dtkdeclarative_zh_HK.ts000066400000000000000000000046431476226662700245560ustar00rootroot00000000000000 AboutAction About 關於 AboutDialog Version 版本 Homepage 主頁 Description 描述 HelpAction Help 幫助 QuitAction Exit 退出 SearchEdit Search 搜索 SettingsDialog Restore Defaults 恢復默認 ThemeMenu Theme 主題 Light Theme 淺色 Dark Theme 深色 System Theme 跟隨系統 dtkdeclarative-5.7.12/src/translations/dtkdeclarative_zh_TW.ts000066400000000000000000000046431476226662700246060ustar00rootroot00000000000000 AboutAction About 關於 AboutDialog Version 版本 Homepage 首頁 Description 描述 HelpAction Help 幫助 QuitAction Exit 退出 SearchEdit Search 搜尋 SettingsDialog Restore Defaults 復原預設 ThemeMenu Theme 主題 Light Theme 淺色 Dark Theme 深色 System Theme 跟隨系統 dtkdeclarative-5.7.12/tests/000077500000000000000000000000001476226662700157605ustar00rootroot00000000000000dtkdeclarative-5.7.12/tests/CMakeLists.txt000066400000000000000000000042201476226662700205160ustar00rootroot00000000000000set(BIN_NAME unit-test) find_package(Dtk${DTK_VERSION_MAJOR}Core REQUIRED) find_package(Dtk${DTK_VERSION_MAJOR}Gui REQUIRED) find_package(GTest REQUIRED) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Gui Quick QuickControls2 Qml Test) file(GLOB TEST_SOURCES ut_colorselector.cpp ut_dconfigwrapper.cpp ut_dqmlglobalobject.cpp ut_dapploader.cpp ut_thememenu.cpp ut_windowbuttongroup.cpp ut_dquickrectangle.cpp ut_dquickwindow.cpp ut_waterprogressbar.cpp ut_keysequencelistener.cpp ut_dsettingscontainer.cpp ut_buttonbox.cpp ut_dobjectmodelproxy.cpp ut_dmessagemanager.cpp ut_dquickarrowboxpath.cpp ut_dquickglow.cpp ut_dsoftwareroundedimagenode.cpp ut_dblitframebuffernode.cpp ut_dquickiconlabel.cpp ut_dquickiconimage.cpp ut_dquickdciiconimage.cpp ut_dmaskeffectnode.cpp ut_dquickdciicon.cpp ut_dblurimagenode.cpp ut_dhandlecontextmenuwindow.cpp ut_dquickbehindwindowblur.cpp ut_dquickinwindowblur.cpp ut_dquickcoloroverlay.cpp ut_dquickitemviewport.cpp ut_dquickopacitymask.cpp ut_dquickblitframebuffer.cpp ut_dtkdeclatative_qmls.cpp ) if (EnableDtk5) list(APPEND TEST_SOURCES ut_dplatformthemeproxy.cpp ) endif() add_executable(${BIN_NAME} main.cpp ${TEST_SOURCES} ${CMAKE_CURRENT_LIST_DIR}/data.qrc ) target_compile_options(${BIN_NAME} PRIVATE "-fno-access-control" ) target_compile_definitions(${BIN_NAME} PRIVATE QML_PLUGIN_PATH="${PLUGIN_OUTPUT_DIR}" CHAMELEON_PATH="${PLUGIN_OUTPUT_DIR}" BIN_NAME="${BIN_NAME}" ) target_link_libraries(${BIN_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Test Qt${QT_VERSION_MAJOR}::QuickControls2 ${LIB_NAME} GTest::GTest pthread dl m ) set(APPLOADER_PLUGINDUMP_OUTPUT_DIR ${PROJECT_BINARY_DIR}/plugins) target_compile_definitions(${BIN_NAME} PRIVATE APPLOADER_PLUGINDUMP_OUTPUT_DIR="${APPLOADER_PLUGINDUMP_OUTPUT_DIR}" ) set(PRELOAD_LIB_NAME apploader-plugindump-preload) set(MAINCOMPONENT_LIB_NAME apploader-plugindump-main) add_subdirectory(apploaderplugindump) add_dependencies(${BIN_NAME} ${PRELOAD_LIB_NAME} ${MAINCOMPONENT_LIB_NAME}) dtkdeclarative-5.7.12/tests/apploaderplugindump/000077500000000000000000000000001476226662700220345ustar00rootroot00000000000000dtkdeclarative-5.7.12/tests/apploaderplugindump/CMakeLists.txt000066400000000000000000000001061476226662700245710ustar00rootroot00000000000000add_subdirectory(preloadplugin) add_subdirectory(maincomponentplugin) dtkdeclarative-5.7.12/tests/apploaderplugindump/maincomponentplugin/000077500000000000000000000000001476226662700261225ustar00rootroot00000000000000dtkdeclarative-5.7.12/tests/apploaderplugindump/maincomponentplugin/CMakeLists.txt000066400000000000000000000010001476226662700306510ustar00rootroot00000000000000if(EnableQt5) qtquick_compiler_add_resources(MAINCOMPONENT_RCC_SOURCES maincomponent.qrc) endif() if(EnableQt6) qt_add_resources(MAINCOMPONENT_RCC_SOURCES maincomponent.qrc) endif() # Add LIB add_library(${MAINCOMPONENT_LIB_NAME} SHARED maincomponentplugin.cpp ${MAINCOMPONENT_RCC_SOURCES} ) target_link_libraries(${MAINCOMPONENT_LIB_NAME} PRIVATE ${LIB_NAME} ) set_target_properties(${MAINCOMPONENT_LIB_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${APPLOADER_PLUGINDUMP_OUTPUT_DIR}" ) dtkdeclarative-5.7.12/tests/apploaderplugindump/maincomponentplugin/main.qml000066400000000000000000000004521476226662700275620ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 AppLoader { Component { Rectangle { anchors.centerIn: parent color: "gray" } } } dtkdeclarative-5.7.12/tests/apploaderplugindump/maincomponentplugin/maincomponent.qrc000066400000000000000000000001401476226662700314730ustar00rootroot00000000000000 main.qml dtkdeclarative-5.7.12/tests/apploaderplugindump/maincomponentplugin/maincomponentplugin.cpp000066400000000000000000000006611476226662700327170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "maincomponentplugin.h" #include DQUICK_USE_NAMESPACE MainComponentPlugin::MainComponentPlugin(QObject *parent) : QObject(parent) { } MainComponentPlugin::~MainComponentPlugin() { } QUrl MainComponentPlugin::mainComponentPath() const { return QUrl("qrc:///apploader/main.qml"); } dtkdeclarative-5.7.12/tests/apploaderplugindump/maincomponentplugin/maincomponentplugin.h000066400000000000000000000012511476226662700323600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef MAINCOMPONENTPLUGIN_H #define MAINCOMPONENTPLUGIN_H #include class QQmlComponent; class MainComponentPlugin : public QObject, public DTK_QUICK_NAMESPACE::DQmlAppMainWindowInterface { Q_OBJECT Q_PLUGIN_METADATA(IID DQmlAppMainWindowInterface_iid FILE "plugin.json") Q_INTERFACES(DTK_QUICK_NAMESPACE::DQmlAppMainWindowInterface) public: MainComponentPlugin(QObject *parent = nullptr); ~MainComponentPlugin() override; QUrl mainComponentPath() const override; }; #endif // MAINCOMPONENTPLUGIN_H dtkdeclarative-5.7.12/tests/apploaderplugindump/maincomponentplugin/plugin.json000066400000000000000000000000671476226662700303160ustar00rootroot00000000000000{ "appid": "org.deepin.dtkdeclarative.unit-test" } dtkdeclarative-5.7.12/tests/apploaderplugindump/preloadplugin/000077500000000000000000000000001476226662700247015ustar00rootroot00000000000000dtkdeclarative-5.7.12/tests/apploaderplugindump/preloadplugin/CMakeLists.txt000066400000000000000000000007001476226662700274360ustar00rootroot00000000000000if(EnableQt5) qtquick_compiler_add_resources(PRELOAD_RCC_SOURCES preload.qrc) endif() if(EnableQt6) qt_add_resources(PRELOAD_RCC_SOURCES preload.qrc) endif() add_library(${PRELOAD_LIB_NAME} SHARED preloadplugin.cpp ${PRELOAD_RCC_SOURCES} ) target_link_libraries(${PRELOAD_LIB_NAME} PRIVATE ${LIB_NAME} ) set_target_properties(${PRELOAD_LIB_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${APPLOADER_PLUGINDUMP_OUTPUT_DIR}" ) dtkdeclarative-5.7.12/tests/apploaderplugindump/preloadplugin/Preload.qml000066400000000000000000000010431476226662700270000ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.0 import org.deepin.dtk 1.0 ApplicationWindow { id: window visible: true width: 100; height: 100 DWindow.loadingOverlay: Rectangle { color: palette.window } DWindow.overlayExited: Transition { NumberAnimation { properties: "scale" from: 1 to: 0 easing.type: Easing.InBack } } } dtkdeclarative-5.7.12/tests/apploaderplugindump/preloadplugin/plugin.json000066400000000000000000000000671476226662700270750ustar00rootroot00000000000000{ "appid": "org.deepin.dtkdeclarative.unit-test" } dtkdeclarative-5.7.12/tests/apploaderplugindump/preloadplugin/preload.qrc000066400000000000000000000001431476226662700270340ustar00rootroot00000000000000 Preload.qml dtkdeclarative-5.7.12/tests/apploaderplugindump/preloadplugin/preloadplugin.cpp000066400000000000000000000006561476226662700302610ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "preloadplugin.h" #include #include DQUICK_USE_NAMESPACE PreloadPlugin::PreloadPlugin(QObject *parent) : QObject(parent) { } PreloadPlugin::~PreloadPlugin() { } QUrl PreloadPlugin::preloadComponentPath() const { return QUrl("qrc:///apploader/Preload.qml"); } dtkdeclarative-5.7.12/tests/apploaderplugindump/preloadplugin/preloadplugin.h000066400000000000000000000012041476226662700277140ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef PRELOADPLUGIN_H #define PRELOADPLUGIN_H #include class QQmlComponent; class PreloadPlugin : public QObject, public DTK_QUICK_NAMESPACE::DQmlAppPreloadInterface { Q_OBJECT Q_PLUGIN_METADATA(IID DQmlAppPreloadInterface_iid FILE "plugin.json") Q_INTERFACES(DTK_QUICK_NAMESPACE::DQmlAppPreloadInterface) public: PreloadPlugin(QObject *parent = nullptr); ~PreloadPlugin() override; virtual QUrl preloadComponentPath() const override; }; #endif // PRELOADPLUGIN_H dtkdeclarative-5.7.12/tests/data.qrc000066400000000000000000000033201476226662700173760ustar00rootroot00000000000000 data/dconf-example.meta.json icon/red.svg icon/deepin.png qml/ColorSelector_GetColorFromProperty.qml qml/CustomThemeMenu.qml qml/WindowButtonGroup.qml qml/DQuickRectangle.qml qml/DQuickWindow.qml qml/QmlGlobalObject.qml qml/QmlGlobalObject_MessageManager.qml qml/WaterProgressBar.qml qml/KeySequenceEdit.qml qml/SettingsContainer.qml qml/SettingsContainer_View.qml qml/ObjectModelProxy.qml qml/MessageManager.qml qml/ButtonBox.qml qml/ArrowBoxPath.qml qml/GlowEffect.qml qml/DSoftwareRoundedImageNodeItem.qml qml/DBlitFramebufferNodeItem.qml qml/IconLabel.qml qml/QtIcon.qml qml/DciIcon.qml qml/DMaskEffectNode.qml qml/DMaskEffectNode_TextureMaterial.qml qml/DSGBlurImageNode.qml qml/ContextMenuWindow.qml qml/DQuickBehindWindowBlur.qml qml/DQuickInWindowBlur.qml qml/SoftwareColorOverlay.qml qml/DQuickItemViewport.qml qml/DQuickItemViewport_HideSource.qml qml/SoftwareOpacityMask.qml qml/DQuickBlitFramebuffer.qml qml/Config.qml dtkdeclarative-5.7.12/tests/data/000077500000000000000000000000001476226662700166715ustar00rootroot00000000000000dtkdeclarative-5.7.12/tests/data/dconf-example.meta.json000077500000000000000000000010051476226662700232320ustar00rootroot00000000000000{ "magic": "dsg.config.meta", "version": "1.0", "contents": { "key3": { "value": "application", "serial": 0, "flags": ["global"], "name": "I am name", "name[zh_CN]": "我是名字", "description": "I am description", "permissions": "readwrite", "visibility": "public" }, "key2": { "value": "key2", "serial": 0, "flags": ["global"] } } } dtkdeclarative-5.7.12/tests/icon/000077500000000000000000000000001476226662700167105ustar00rootroot00000000000000dtkdeclarative-5.7.12/tests/icon/deepin.png000066400000000000000000000112341476226662700206630ustar00rootroot00000000000000PNG  IHDR>abKGDQIDATx{pUǿ܄@ĄGHxB|®c[`mYcXk **嬸#2J^3_xxCcq(O$NAzq˪ɮ93,f:aI)CH)J C:)yHNgB~`o}&#L@\g vhX;;lp&%P T릓_ytXH2Mޮ~06/Y';Rof"B ? ڇ)xSPP}k"[.|RU^ӧEGDyV2AB<aeYc]*i0(jh^jGdΐ"HԎgYCmئB)=)7=s+2`XH"z<ve5kc9*J[Ouf iA*mgp{ ! )LES+m6Ljws!,JHF @Y Am*(GJo^Hv>?X! ..ݼ;AT0)ZyPegsV[n֢19d} v *fDwgߓW@s v~CD`g5o͖myx>0$D3VN3? pq7krÆn#_pmvV?' a-`DޘO&=5ɉ4 bm+噙Fgap˴ţAG,d3G.i߳-)t:^1&8NnkfA@"XO^Z_!Ò1B_AC^Dߺu!.N }0O݋4F^M3l|ka>Ƕvc㳐@<~'ҸE~IqFW8-ϕU\:=Q$B6fuKFm ){`ܓHqF0x:ц-䞛YH0 hHmnń3o%,&c=߬&RB{g:CYMdIO sF:NA-88'^J `8>W+~ 3y,41ԛi+&-±@ِIw?v|’yZ fnm#~HcZg֡ƘS7<ר!@O؇K٧d¦ecai:jObU?)SXʺ3 BPrߺ``:6Jm [@M6m؇wB079?GH BP `mٙй40;8l\kZ/sS^ u?9"s{\sM@t0J%6?~v[ :/xo}PAkP,68{Zcwti;g'BGY@o;-0edh@%A` Z s~NQ2’y7KgSˆ[VMe鵁V=~$|dt"#v#%s a 5b$5чg"Ė J!bq zP s{"@Xx!6i 7QV=nĀ?_Jh]S Yia ?j@X.I:77>V=>H[+߰D)E -^_w@[Nxg;n2҇akdz]c] u9/~@8Gmn- #?]1AtPu9np:ߵ =>m4"r}t=W+U#39 Kq% ~~=h 7BA_7-@kv7SWjz?Ea"$zg}MIoP __FO!dƪ֖ˇi"qk/VߌhX,.PGwǡmDЎw~Lş'|Si=WP_tH}Yk )u"^C,o<ֆΗ[ ]ۇڎ  d R ߶-?{D]9'uKd^>\xs~ 1+c[?؊?eODkwH-tbl`gP|ey7qv0:Xͫ5.U!<.G E;bSMsF`mLA]>z?yI_RY#hQ5uG-m NxzesUk+?}a\=P+H'RbptPI4] X^sOWVXy0PF 3y*ߝ C]EYk8,P@ˑmEQȍڗ F8l+͟wkc v|bɭ+~q23W"z{9ዶkJ非GkAʢD62y`g *A$Su;/tpCʐ .\,#& ݄3IxwAOP=ǚZtkH(vMq:l߃0#5TG%|0K@d+&E4_x " |t;[~}W:>VIwJLĉ"}"m1(w{6}OܵNx9W.41SO~_|7gcto$Bm 7CR5p[7V ӕE^JC.csy?{ M]o-qܚ]_xsY#9;[lRŷcV!teR-Giae::sxYޛ<$:G3_7BޔgF)(uhj&bi(-w{\Ueʇge@|;g8qQ ġH/TnAx܎<(s%w,ʟ[]5ʑg+\Hcv2vazSz$Q P ~1$n!]jo=u܎˗CސrFMN)g"C}F8^ho7+(v.]<鉛@_<}v}wے@weMι9J){r WW~&! q>`lQ o+x>|Iގ3u;^ePbr;L?7JC F;Z>ZHFpzIeLKIuYͦڏhbZ8uQj(sg;^ƌY@Xh.xBE9oSn#S/oozf"u(ӕ Eu@E@GBw7״ѷ0*y9֦gZQ ky/'c`2~Hţ6no=S~CѦhS(e6.Vz2>PWcG8e@_HUfU2x+Vh.;Č!@"{;x-V;]ςI%: z\PbMb%VUTcVA2l+{7&Șy. ^vJfݒe,gVWYXXXX?ht[IENDB`dtkdeclarative-5.7.12/tests/icon/red.svg000066400000000000000000000005001476226662700201760ustar00rootroot00000000000000 dtkdeclarative-5.7.12/tests/main.cpp000066400000000000000000000014431476226662700174120ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include int runTest(QGuiApplication &app) { int ret = 0; QTimer::singleShot(0, &app, [&app, &ret]() { ret = RUN_ALL_TESTS(); app.quit(); }); app.exec(); return ret; } int main(int argc, char *argv[]) { // 编译时没有显示器,需要指定环境变量 if (qEnvironmentVariable("DISPLAY").isEmpty()) qputenv("QT_QPA_PLATFORM", "offscreen"); QQuickStyle::setStyle("Chameleon"); QGuiApplication app(argc, argv); app.setApplicationName(BIN_NAME); ::testing::InitGoogleTest(&argc, argv); return runTest(app); } dtkdeclarative-5.7.12/tests/qml/000077500000000000000000000000001476226662700165515ustar00rootroot00000000000000dtkdeclarative-5.7.12/tests/qml/ArrowBoxPath.qml000066400000000000000000000013321476226662700216430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Shapes 1.11 import org.deepin.dtk 1.0 as D Rectangle { width: 200; height: 200 color: "red" Shape { ShapePath { fillColor: "blue" strokeColor: "yellow" strokeStyle: ShapePath.SolidLine strokeWidth: 1 pathElements: path } } D.ArrowBoxPath { id: path arrowX: 50 arrowY: 10 arrowWidth: 20 arrowHeight: 20 arrowDirection: D.ArrowBoxPath.Up width: 100 height: 100 roundedRadius: 8 spread: 4 } } dtkdeclarative-5.7.12/tests/qml/ButtonBox.qml000066400000000000000000000005171476226662700212130ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Controls 2.11 import org.deepin.dtk 1.0 as D D.ButtonBox { ToolButton { text: "Button1" checked: true } ToolButton { text: "Button2" } } dtkdeclarative-5.7.12/tests/qml/ColorSelector_GetColorFromProperty.qml000066400000000000000000000010131476226662700262250ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Controls 2.0 import org.deepin.dtk 1.0 as D import org.deepin.dtk.private 1.0 as DP Control { palette: D.DTK.palette property var view: view ListView { id: view property DP.ButtonPanel buttonPanel: currentItem.background model: ["1"] currentIndex: 0 delegate: D.Button { id: control } } } dtkdeclarative-5.7.12/tests/qml/Config.qml000066400000000000000000000010101476226662700204610ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D Item { id: control signal key3Changed() D.Config { id: exampleConfig name: "example" subpath: "" async: false property string key2 property string key3 : "1" onKey3Changed: control.key3Changed() } function setKey3(value) { exampleConfig.key3 = value } } dtkdeclarative-5.7.12/tests/qml/ContextMenuWindow.qml000066400000000000000000000003571476226662700227320ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.ContextMenuWindow { id: control width: 200; height: 200 color: "red" } dtkdeclarative-5.7.12/tests/qml/CustomThemeMenu.qml000066400000000000000000000002531476226662700223460ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.ThemeMenu { } dtkdeclarative-5.7.12/tests/qml/DBlitFramebufferNodeItem.qml000066400000000000000000000005231476226662700240540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D import test 1.0 Rectangle { width: 200; height: 200 color: "red" DBlitFramebufferNodeItem { x: 50; y: 50 width: 100; height: 100 } } dtkdeclarative-5.7.12/tests/qml/DMaskEffectNode.qml000066400000000000000000000004721476226662700222110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D import test 1.0 Rectangle { width: 200; height: 200 MaskEffectNodeItem { opacity: 1 width: 100; height: 100 } } dtkdeclarative-5.7.12/tests/qml/DMaskEffectNode_TextureMaterial.qml000066400000000000000000000004731476226662700254110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D import test 1.0 Rectangle { width: 200; height: 200 TextureMaterialItem { opacity: 1 width: 100; height: 100 } } dtkdeclarative-5.7.12/tests/qml/DQuickBehindWindowBlur.qml000066400000000000000000000013431476226662700235740ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import org.deepin.dtk 1.0 as D Rectangle { id: control width: 200; height: 200 color: "red" Window { // on top of the Rectangle's window x: control.Window.window ? control.Window.window.x : 0 y: control.Window.window ? control.Window.window.y : 0 width: 100; height: 100 visible: true D.DWindow.enabled: true D.DWindow.alphaBufferSize: 8 D.BehindWindowBlur { anchors.fill: parent blendColor: Qt.rgba(0, 255, 0, 0.4) cornerRadius: 10 } } } dtkdeclarative-5.7.12/tests/qml/DQuickBlitFramebuffer.qml000066400000000000000000000006461476226662700234320ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D Rectangle { width: 200; height: 200 color: "red" D.BlitFramebuffer { anchors.centerIn: parent width: 100; height: 100 Rectangle { width: 100; height: 100 color: "blue" } } } dtkdeclarative-5.7.12/tests/qml/DQuickInWindowBlur.qml000066400000000000000000000006741476226662700227570ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D Rectangle { width: 200; height: 200 color: "blue" Image { width: 100; height: 100 source: "qrc:/icon/deepin.png" D.InWindowBlur { width: 80; height: 80 radius: 10 offscreen: false } } } dtkdeclarative-5.7.12/tests/qml/DQuickItemViewport.qml000066400000000000000000000011351476226662700230230ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D Rectangle { width: 200; height: 200 color: "blue" Image { id: img width: 100; height: 100 sourceSize: Qt.size(100, 100) source: "qrc:/icon/deepin.png" D.ItemViewport { width: 100; height: 100 x: 100; y: 100 radius: 10 fixed: true hideSource: false sourceItem: img smooth: true } } } dtkdeclarative-5.7.12/tests/qml/DQuickItemViewport_HideSource.qml000066400000000000000000000007751476226662700251460ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D Rectangle { width: 200; height: 200 color: "blue" Image { id: img width: 100; height: 100 source: "qrc:/icon/deepin.png" } D.ItemViewport { width: 100; height: 100 x: 100; y: 100 radius: 10 fixed: true hideSource: true sourceItem: img } } dtkdeclarative-5.7.12/tests/qml/DQuickRectangle.qml000066400000000000000000000005251476226662700222730ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.11 import org.deepin.dtk 1.0 as D D.RoundRectangle { width: 100; height: 40 color: "red" radius: 8 corners: D.RoundRectangle.TopLeftCorner | D.RoundRectangle.TopRightCorner } dtkdeclarative-5.7.12/tests/qml/DQuickWindow.qml000066400000000000000000000012221476226662700216310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import org.deepin.dtk 1.0 as D Window { width: 200; height: 200 D.DWindow.enabled: true D.DWindow.windowRadius: 16 D.DWindow.borderWidth: 1 D.DWindow.borderColor: "red" D.DWindow.shadowRadius: 10 D.DWindow.shadowOffset: Qt.point(0, 2) D.DWindow.shadowColor: "red" D.DWindow.translucentBackground: true D.DWindow.enableSystemResize: true D.DWindow.enableSystemMove: true D.DWindow.enableBlurWindow: true D.DWindow.alphaBufferSize: 8 } dtkdeclarative-5.7.12/tests/qml/DSGBlurImageNode.qml000066400000000000000000000003171476226662700223000ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import test 1.0 DSGBlurImageNodeItem { opacity: 1 width: 100; height: 100 } dtkdeclarative-5.7.12/tests/qml/DSoftwareRoundedImageNodeItem.qml000066400000000000000000000005001476226662700250660ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D import test 1.0 Rectangle { width: 200; height: 200 color: "red" DSoftwareRoundedImageNodeItem { anchors.fill: parent } } dtkdeclarative-5.7.12/tests/qml/DciIcon.qml000066400000000000000000000007761476226662700206060ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Controls 2.15 import org.deepin.dtk 1.0 as D Control { id: control width: 100; height: 100 D.DciIcon.mode: D.DTK.NormalState D.DciIcon.theme: D.ApplicationHelper.LightType contentItem: D.DciIcon { name: "switch_button" mode: control.D.DciIcon.mode theme: control.D.DciIcon.theme } background: null } dtkdeclarative-5.7.12/tests/qml/GlowEffect.qml000066400000000000000000000007251476226662700213150ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D Rectangle { width: 200; height: 200 color: "blue" D.GlowEffect { anchors.centerIn: parent width: 100 height: 100 glowRadius: 50 color: "red" spread: 0.01 relativeSizeX: 0.5 relativeSizeY: 0.5 fill: true } } dtkdeclarative-5.7.12/tests/qml/IconLabel.qml000066400000000000000000000014731476226662700211210ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D Rectangle { id: control width: 100; height: 100 property QtObject icon: QtObject{ property string name: "switch_button" property int width: 20 property int height: 20 } D.IconLabel { anchors.centerIn: parent width: 50; height: 50 text: "test" font: D.DTK.fontManager.t5 color: "red" display: D.IconLabel.IconBesideText spacing: 2 mirrored: false alignment: Qt.AlignLeft topPadding: 1 leftPadding: 1 rightPadding: 1 bottomPadding: 1 icon: D.DTK.makeIcon(control.icon, control.D.DciIcon) } } dtkdeclarative-5.7.12/tests/qml/KeySequenceEdit.qml000066400000000000000000000004051476226662700223120ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D D.KeySequenceEdit { text: "test" placeholderText: "input short keys" keys: ["CTRL", "SHIFT"] } dtkdeclarative-5.7.12/tests/qml/MessageManager.qml000066400000000000000000000016641476226662700221520ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import org.deepin.dtk 1.0 as D Window { D.MessageManager.layout: Column { anchors { bottom: parent.bottom right: parent.right } } D.MessageManager.capacity: 3 D.MessageManager.delegate: D.FloatingMessageContainer { id: msg panel: Rectangle { property string iconName: msg.message.iconName property string content: msg.message.content } duration: 1 } property Component containerCom: Component { D.FloatingMessageContainer { id: msg2 panel: Rectangle { property string iconName: msg2.message.icon property string content: msg2.message.msg } duration: 1 } } } dtkdeclarative-5.7.12/tests/qml/ObjectModelProxy.qml000066400000000000000000000010241476226662700225120ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQml.Models 2.1 import org.deepin.dtk 1.0 as D Repeater { property string filterText model: D.ObjectModelProxy { filterAcceptsItem: function(item) { return item.text.includes(filterText) } sourceModel: ObjectModel { Text { text: "Page1"} Text { text: "Page2"} Text { text: "Page3"} } } } dtkdeclarative-5.7.12/tests/qml/QmlGlobalObject.qml000066400000000000000000000005121476226662700222630ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.12 import org.deepin.dtk 1.0 as D Control { palette: D.DTK.palette property var color1: D.DTK.makeColor(D.Color.Highlight) property var color2: D.DTK.makeColor("red") } dtkdeclarative-5.7.12/tests/qml/QmlGlobalObject_MessageManager.qml000066400000000000000000000014111476226662700252210ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import org.deepin.dtk 1.0 as D Window { D.MessageManager.delegate: D.FloatingMessageContainer { id: msg panel: Rectangle { property string iconName: msg.message.iconName property string content: msg.message.content } duration: 1 } property Component containerCom: Component { D.FloatingMessageContainer { id: msg2 panel: Rectangle { property string iconName: msg2.message.icon property string content: msg2.message.msg } duration: 1 } } } dtkdeclarative-5.7.12/tests/qml/QtIcon.qml000066400000000000000000000005401476226662700204600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 as D D.QtIcon { width: 100; height: 100 name: "qrc:/icon/red.svg" mode: D.QtIcon.Active color: "blue" state: D.QtIcon.On fallbackSource: "qrc:/icon/red.svg" } dtkdeclarative-5.7.12/tests/qml/SettingsContainer.qml000066400000000000000000000022151476226662700227270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Controls 2.11 import org.deepin.dtk 1.0 as D import org.deepin.dtk.settings 1.0 as Settings Settings.SettingsContainer { navigationTitle: Rectangle {} contentTitle: Rectangle {} contentBackground: Rectangle {} groups: [ Settings.SettingsGroup { key: "key-group1" name: "group1" Settings.SettingsOption { key: "key-option1" name: "option1" Rectangle {} } Settings.SettingsOption { key: "key-option2" name: "option2" Rectangle {} } children: [ Settings.SettingsGroup {} ] }, Settings.SettingsGroup { key: "key-group2" name: "group2" Settings.SettingsOption { key: "key-option1" name: "option1" Rectangle {} } background: Rectangle {} } ] } dtkdeclarative-5.7.12/tests/qml/SettingsContainer_View.qml000066400000000000000000000034611476226662700237250ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Controls 2.11 import org.deepin.dtk 1.0 as D import org.deepin.dtk.settings 1.0 as Settings Settings.SettingsContainer { navigationTitle: Rectangle { color: "red"; property string name: Settings.SettingsGroup.name property int level: Settings.SettingsGroup.level } contentTitle: Rectangle { color: "blue"; property string name: Settings.SettingsGroup.name property int level: Settings.SettingsGroup.level } contentBackground: Rectangle { color: "#FFFFF0"; property string name: Settings.SettingsGroup.name } groups: [ Settings.SettingsGroup { key: "key-group1" name: "group1" Settings.SettingsOption { key: "key-option1" name: "option1" Rectangle { color: "#FFFFF1" property string name: Settings.SettingsOption.name } } Settings.SettingsOption { key: "key-option2" name: "option2" Rectangle { property string name: Settings.SettingsOption.name } } children: [ Settings.SettingsGroup {} ] }, Settings.SettingsGroup { key: "key-group2" name: "group2" Settings.SettingsOption { key: "key-option1" name: "option1" Rectangle { color: "#FFFFF2"; property string name: Settings.SettingsOption.name } } } ] } dtkdeclarative-5.7.12/tests/qml/SoftwareColorOverlay.qml000066400000000000000000000007721476226662700234250ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk 1.0 as D Rectangle { id: rootItem width: 100; height:100 color: "blue" Image { id: img objectName: "image" width:50; height: 50 source: "qrc:/icon/deepin.png" } D.SoftwareColorOverlay { id: overlay width: 50; height: 50 source: img color: "red" } } dtkdeclarative-5.7.12/tests/qml/SoftwareOpacityMask.qml000066400000000000000000000013731476226662700232270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk 1.0 as D Rectangle { id: rootItem width: 200; height: 200 Rectangle { id: rect1 objectName: "rect1" layer.enabled: true width:50; height: 50 color: "red" opacity: 0.5 } Rectangle { id: rect2 objectName: "rect2" x:50; y: 0 layer.enabled: true width:50; height: 50 color: "blue" opacity: 0.5 } D.SoftwareOpacityMask { id: overlay x:100; y: 100 width:50; height: 50 source: rect1 maskSource: rect2 invert: true } } dtkdeclarative-5.7.12/tests/qml/WaterProgressBar.qml000066400000000000000000000004131476226662700225160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls 2.11 import org.deepin.dtk 1.0 as D D.WaterProgressBar { width: 100; height: 100 value: 20 running: true } dtkdeclarative-5.7.12/tests/qml/WindowButtonGroup.qml000066400000000000000000000006211476226662700227430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Window 2.11 import org.deepin.dtk 1.0 as D Window { D.DWindow.enabled: true flags: Qt.Window | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint property var group : group D.WindowButtonGroup { id: group } } dtkdeclarative-5.7.12/tests/test-recoverage.sh000077500000000000000000000020711476226662700214160ustar00rootroot00000000000000#!/bin/bash # SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. # # SPDX-License-Identifier: LGPL-3.0-or-later TESTS_TARGET=unit-test filter_files=( "QtCore/*" "QtGui/*" "QtQml/*" "QtQuick/*" "*dquickbusyindicator*" "*dquicksystempalette*" ) SHELL_FOLDER=$(dirname $(readlink -f "$0")) # project directroy SOURCE_DIR=${SHELL_FOLDER}/../ BUILD_DIR=${SOURCE_DIR}/build TESTS_BUILD_DIR=${BUILD_DIR}/tests HTML_DIR=${TESTS_BUILD_DIR}/html export ASAN_OPTIONS="halt_on_error=0" cd ${SOURCE_DIR} cmake -B${BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -GNinja -DENABLE_COV=ON cmake --build ${BUILD_DIR} --target ${TESTS_TARGET} cd ${BUILD_DIR} ${TESTS_BUILD_DIR}/${TESTS_TARGET} lcov -d ./ -c -o coverage_all.info lcov --remove coverage_all.info "*/tests/*" "/usr/include*" "*build/*" ${filter_files[*]} --output-file coverage.info cd ${BUILD_DIR} genhtml -o ${HTML_DIR} ${BUILD_DIR}/coverage.info && ln -sf ${HTML_DIR}/index.html ${BUILD_DIR}/cov_index.html test -e ${TESTS_BUILD_DIR}/asan.log* && mv ${TESTS_BUILD_DIR}/asan.log* ${BUILD_DIR}/asan_index.log dtkdeclarative-5.7.12/tests/test_helper.hpp000066400000000000000000000176111476226662700210150ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #include #include #include #include #include #include #include #include #define TEST_OFFSCREEN_SKIP() \ if (qEnvironmentVariable("QT_QPA_PLATFORM") == "offscreen") \ GTEST_SKIP(); #define TEST_NOTSOFTWARE_SKIP() \ if (QQuickWindow::sceneGraphBackend() != "software") \ GTEST_SKIP_("Only test `QSGRendererInterface::Software` backend"); #define TEST_SOFTWARE_SKIP() \ if (QQuickWindow::sceneGraphBackend() == "software") \ GTEST_SKIP_("Only test non `QSGRendererInterface::Software` backend"); #define TEST_QRHI_SKIP() \ if (TestUtil::isRunningOnRhi()) \ GTEST_SKIP_("Only test non RHI Render, Render nodes not yet supported with QRhi"); class EnvGuard { public: EnvGuard(const char *name, const QString &value) { m_name = name; m_originValue = qgetenv(m_name); qputenv(m_name, value.toUtf8()); } ~EnvGuard() { qputenv(m_name, m_originValue); } private: QByteArray m_originValue; const char* m_name = nullptr; }; template T *findItem(QQuickItem *parent, const QString &objectName = QString(), int index = -1) { const QMetaObject &mo = T::staticMetaObject; for (int i = 0; i < parent->childItems().count(); ++i) { QQuickItem *item = qobject_cast(parent->childItems().at(i)); if (!item) continue; if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) { if (index != -1) { QQmlExpression e(qmlContext(item), item, "index"); if (e.evaluate().toInt() == index) return static_cast(item); } else { return static_cast(item); } } item = findItem(item, objectName, index); if (item) return static_cast(item); } return nullptr; } static inline void updateEngineImportPath(QQmlEngine &engine) { QStringList paths { QString::fromLocal8Bit(QML_PLUGIN_PATH), QString::fromLocal8Bit(CHAMELEON_PATH) }; paths << engine.importPathList(); engine.setImportPathList(paths); } template class ControlHelper { public: ControlHelper() { updateEngineImportPath(engine); } ControlHelper(const QString &url) : ControlHelper() { load(url); } bool load(const QString &url) { clear(); QQmlComponent component(&engine, QUrl(url), QQmlComponent::PreferSynchronous); return (object = create(component)); } bool setData(const QByteArray &data) { clear(); QQmlComponent component(&engine); component.setData(data, QUrl()); return (object = create(component)); } T *create(QQmlComponent &component) { if (!component.isReady()) { qWarning() << "component is not ready" << component.errorString(); return nullptr; } auto tmp = component.create(); if (!tmp) { qWarning() << "create object is wrong." << component.errorString(); return nullptr; } return static_cast(tmp); } void requestExposed() { if (!object) return; object->show(); QVERIFY(QTest::qWaitForWindowExposed(object)); } ~ControlHelper() { clear(); } void clear() { if (object) object->deleteLater(); } QQmlEngine engine; T *object = nullptr; }; template class QuickViewHelper { public: QuickViewHelper() : view(new QQuickView) { updateEngineImportPath(*view->engine()); } ~QuickViewHelper() { clear(); } QuickViewHelper(const QString &url) : QuickViewHelper() { load(url); requestExposed(); } bool load(const QString &url) { clear(); view->setSource(url); QQuickItem *rootItem = view->rootObject(); object = qobject_cast(rootItem); return object != nullptr; } void requestActivate() { view->requestActivate(); QVERIFY(QTest::qWaitForWindowActive(view.data())); } void requestExposed() { requestExposed(view.data()); } static void requestExposed(QQuickWindow *view) { view->show(); QVERIFY(QTest::qWaitForWindowExposed(view)); } void clear() { if (object) object->deleteLater(); } QScopedPointer view; T *object = nullptr; }; DGUI_USE_NAMESPACE class ThemeTypeGuard { public: ThemeTypeGuard(DGuiApplicationHelper::ColorType expectedType) { oldType = DGuiApplicationHelper::instance()->themeType(); DGuiApplicationHelper::instance()->setPaletteType(expectedType); } ~ThemeTypeGuard() { DGuiApplicationHelper::instance()->setPaletteType(oldType); } private: DGuiApplicationHelper::ColorType oldType; }; namespace TestUtil { const QColor simpleColor(0, 0, 255, 55); inline QSGTexture *simpleTexture(const QColor &color = simpleColor, const QSize &size = QSize(100, 100)) { QImage image(size, QImage::Format_ARGB32_Premultiplied); image.fill(color); return QSGPlainTexture::fromImage(image); } inline QSGTexture *simpleTextureThreePart(const int opacity = 255, const QSize &size = QSize(100, 100)) { QImage image(size, QImage::Format_ARGB32_Premultiplied); const QVector partColors = { QColor(255, 0, 0, opacity), QColor(0, 255, 0, opacity), QColor(0, 0, 255, opacity), }; int offset = 0; const int pHeight = image.height() / partColors.count(); for (int i = 0; i < partColors.count(); i++) { int height = i < partColors.count() - 1 ? pHeight : image.height() - pHeight * i; QImage img(image.bits() + offset, image.width(), height, image.format()); img.fill(partColors.at(i)); offset += img.sizeInBytes(); } return QSGPlainTexture::fromImage(image); } Q_GLOBAL_STATIC_WITH_ARGS(QImage, simpleImage, (":/icon/deepin.png")) inline QSGTexture *imageTexture(const QSize &size = QSize(100, 100)) { if (!simpleImage.exists()) simpleImage->convertTo(QImage::Format_ARGB32_Premultiplied); QImage tmp = simpleImage->scaled(size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); return QSGPlainTexture::fromImage(tmp); } inline bool equalBlurColor(const QColor &color1, const QColor &color2) { const qreal delta = 0.1; if ((qAbs(color1.redF() - color2.redF()) < delta) && qAbs(color1.greenF() - color2.greenF()) < delta && qAbs(color1.blueF() - color2.blueF()) < delta) return true; return false; } template inline void registerType(const char* type) { qmlRegisterType("test", 1, 0, type); } inline bool supportOpengl(const QSGRendererInterface::GraphicsApi ga) { #ifndef QT_NO_OPENGL return (ga == QSGRendererInterface::OpenGL #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) || ga == QSGRendererInterface::OpenGLRhi ); #endif #endif return false; } inline bool isRunningOnRhi() { static int retval = -1; if (retval == -1) { QuickViewHelper<> helper; helper.requestExposed(); retval = QSGRendererInterface::isApiRhiBased(helper.view->rendererInterface()->graphicsApi()); } return static_cast(retval); } } dtkdeclarative-5.7.12/tests/tests.pro000066400000000000000000000010551476226662700176450ustar00rootroot00000000000000TEMPLATE = app QT += dtkcore dtkgui core quick quick-private testlib load(dtk_testcase) INCLUDEPATH += $$PWD/../src DEPENDPATH += $$PWD/../src unix:QMAKE_RPATHDIR += $$OUT_PWD/../src unix:LIBS += \ -lgtest # 指定moc文件生成目录和src一样 MOC_DIR=$$OUT_PWD/../src DMODULE_NAME=ddeclarative load(dtk_translation) include($$PWD/../src/src.pri) include($$PWD/../src/private/private.pri) HEADERS += \ SOURCES += \ main.cpp \ ut_dqmlglobalobject.cpp \ ut_dplatformthemeproxy.cpp \ ut_dconfigwrapper.cpp RESOURCES += data.qrc dtkdeclarative-5.7.12/tests/ut_buttonbox.cpp000066400000000000000000000007001476226662700212150ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" class ut_ButtonBox : public ::testing::Test { public: }; TEST_F(ut_ButtonBox, properties) { ControlHelper<> helper("qrc:/qml/ButtonBox.qml"); ASSERT_TRUE(helper.object); QQmlListReference buttons(helper.object, "buttons"); ASSERT_EQ(buttons.count(), 2); } dtkdeclarative-5.7.12/tests/ut_colorselector.cpp000066400000000000000000000024141476226662700220540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include class ut_ColorSelector : public ::testing::Test { public: virtual void SetUp(); virtual void TearDown(); }; void ut_ColorSelector::SetUp() { } void ut_ColorSelector::TearDown() { } TEST_F(ut_ColorSelector, getColorFromProperty) { ControlHelper helper("qrc:/qml/ColorSelector_GetColorFromProperty.qml"); ASSERT_TRUE(helper.object); auto listView = helper.object->property("view").value(); ASSERT_NE(listView, nullptr); QObject *buttonPanel = qvariant_cast(listView->property("buttonPanel")); ASSERT_NE(buttonPanel, nullptr); QObject *background = buttonPanel->findChild("background"); ASSERT_NE(background, nullptr); QQmlEngine &engine = helper.engine; engine.globalObject().setProperty("background", engine.newQObject(background)); ThemeTypeGuard themeGurad(DGuiApplicationHelper::LightType); Q_UNUSED(themeGurad); ASSERT_EQ(background->property("color"), engine.evaluate("background.color1.normal.common.color()").toVariant()); } dtkdeclarative-5.7.12/tests/ut_dapploader.cpp000066400000000000000000000072561476226662700213210ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include #include "private/dapploader_p.h" #include #include #include DQUICK_USE_NAMESPACE DCORE_USE_NAMESPACE static constexpr char const *AppId = "org.deepin.dtkdeclarative.unit-test"; static const QString envPath(DPathBuf("./env").toString()); static const QStringList ldPaths{DPathBuf("./ld1").toString(), DPathBuf("ld2").toString()}; static const QStringList apiPaths{DPathBuf("./api1").toString(), DPathBuf("./api2").toString()}; static const QString constructPath(DPathBuf("./cpath").toString()); class ut_AppLoader : public ::testing::Test { public: }; TEST_F(ut_AppLoader, instance) { DAppLoader loader(AppId); ASSERT_EQ(DAppLoader::instance(), &loader); } TEST_F(ut_AppLoader, buildinPluginPath) { #ifdef DTK_QML_APP_PLUGIN_PATH DAppLoader loader(AppId); ASSERT_EQ(loader.pluginPaths().last(), DTK_QML_APP_PLUGIN_PATH); #endif { EnvGuard guard("DTK_QML_PLUGIN_PATH", envPath); Q_UNUSED(guard) DAppLoader loader(AppId); ASSERT_EQ(loader.pluginPaths().first(), envPath); } { EnvGuard guard("LD_LIBRARY_PATH", ldPaths.join(':')); Q_UNUSED(guard) DAppLoader loader(AppId); const QString path = loader.pluginPaths().first(); ASSERT_TRUE(path.startsWith(ldPaths[0])); } { EnvGuard guard("DTK_QML_PLUGIN_PATH", envPath); Q_UNUSED(guard) EnvGuard guard2("LD_LIBRARY_PATH", ldPaths.join(':')); Q_UNUSED(guard2) DAppLoader loader(AppId); ASSERT_EQ(loader.pluginPaths().first(), envPath); } } TEST_F(ut_AppLoader, addPluginPath) { EnvGuard guard("DTK_QML_PLUGIN_PATH", envPath); Q_UNUSED(guard) EnvGuard guard2("LD_LIBRARY_PATH", ldPaths.join(':')); Q_UNUSED(guard2) { DAppLoader loader(AppId, constructPath); const QString path = loader.pluginPaths().first(); ASSERT_TRUE(path.startsWith(constructPath)); } { DAppLoader loader(AppId, constructPath); loader.addPluginPath(apiPaths[0]); loader.addPluginPath(apiPaths[1]); const QString path = loader.pluginPaths().first(); ASSERT_TRUE(path.startsWith(apiPaths[1])); } } class AppLoaderSimulator : public DAppLoader { public: AppLoaderSimulator() : DAppLoader(AppId, APPLOADER_PLUGINDUMP_OUTPUT_DIR) { d = DAppLoader::d_func(); d->engine = new QQmlApplicationEngine(); updateEngineImportPath(*d->engine); } ~AppLoaderSimulator() { // don't release app. d->app.take(); } int load() { d->ensureLoadPreload(); int argc = 0; d->app.reset(d->preloadInstance->creatApplication(argc, nullptr)); if (!d->app) return -1; d->preloadInstance->aboutToPreload(d->engine); QObject::connect(d->engine, &QQmlApplicationEngine::objectCreated, this, [this](QObject *obj, const QUrl &url) { d->_q_onPreloadCreated(obj, url); }); d->engine->load(d->preloadInstance->preloadComponentPath()); if (d->engine->rootObjects().isEmpty()) return -1; return 0; } DAppLoaderPrivate *d; }; TEST_F(ut_AppLoader, exec) { AppLoaderSimulator loader; QSignalSpy spy(&loader, SIGNAL(loadFinished())); int exitCode = loader.load(); ASSERT_EQ(exitCode, 0); EXPECT_TRUE(QTest::qWaitFor([this, &spy]() { return spy.count() >= 1; })); } dtkdeclarative-5.7.12/tests/ut_dblitframebuffernode.cpp000066400000000000000000000054431476226662700233530ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include #include #include "dblitframebuffernode_p.h" DQUICK_USE_NAMESPACE class DBlitFramebufferNodeItem : public QQuickItem { Q_OBJECT public: DBlitFramebufferNodeItem() : QQuickItem() { setFlag(ItemHasContents, true); } protected: QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override { DBlitFramebufferNode *node = static_cast(oldNode); const auto ga = window()->rendererInterface()->graphicsApi(); if (!node) { if (ga == QSGRendererInterface::Software) { node = DBlitFramebufferNode::createSoftwareNode(this, false, true); } else if (TestUtil::supportOpengl(ga)) { #ifndef QT_NO_OPENGL node = DBlitFramebufferNode::createOpenGLNode(this, true, true); #endif } if (!node) return nullptr; auto subNode = new QSGSimpleTextureNode(); subNode->setTexture(TestUtil::simpleTexture(Qt::blue)); node->setRenderCallback([](DBlitFramebufferNode *node, void *argu) -> void { auto item = reinterpret_cast(argu); ASSERT_TRUE(item); Q_EMIT item->callbackCalled(); item->nodeTextureImg = node->toImage(); }, this); node->appendChildNode(subNode); } QSGSimpleTextureNode *subNode = static_cast(node->firstChild()); subNode->setRect(QRectF(0, 0, 50, 50)); subNode->setSourceRect(QRectF(0, 0, 100, 100)); node->resize(QSizeF(100, 100)); node->setMargins(QMarginsF(10, 10, 10, 10)); return node; } signals: void callbackCalled(); public: QImage nodeTextureImg; }; TEST(ut_DBlitFramebufferNode, properties) { TEST_QRHI_SKIP(); TestUtil::registerType("DBlitFramebufferNodeItem"); QuickViewHelper<> helper; ASSERT_TRUE(helper.load("qrc:/qml/DBlitFramebufferNodeItem.qml")); auto target = findItem(helper.object); ASSERT_TRUE(target); QSignalSpy spy(target, SIGNAL(callbackCalled())); helper.requestExposed(); ASSERT_GE(spy.count(), 1); QImage img = helper.view->grabWindow(); // in Corner ASSERT_EQ(img.pixelColor(QPoint(50, 40)), Qt::red); // in RoundedNode ASSERT_EQ(img.pixelColor(QPoint(60, 60)), Qt::blue); // node texture ASSERT_EQ(target->nodeTextureImg.pixelColor(QPoint(60, 60)), Qt::red); } #include "ut_dblitframebuffernode.moc" dtkdeclarative-5.7.12/tests/ut_dblurimagenode.cpp000066400000000000000000000062231476226662700221600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include #ifndef QT_NO_OPENGL #include #endif #include "dblurimagenode_p.h" DQUICK_USE_NAMESPACE class DSGBlurImageNodeItem : public QQuickItem { Q_OBJECT public: DSGBlurImageNodeItem() : QQuickItem() { setFlag(ItemHasContents, true); } protected: QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override { QSGRectangleNode *node = static_cast(oldNode); const auto ga = window()->rendererInterface()->graphicsApi(); if (!node) { node = window()->createRectangleNode(); DSGBlurNode *blurNode = nullptr; do { if (ga == QSGRendererInterface::Software) { blurNode = new DSoftwareBlurImageNode(this); } else if (TestUtil::supportOpengl(ga)) { #ifndef QT_NO_OPENGL blurNode = new DOpenGLBlurEffectNode(this); #endif } if (!blurNode) break; blurNode->setTexture(TestUtil::imageTexture()); blurNode->setRenderCallback([](DSGBlurNode *node, void *argu) -> void { auto item = reinterpret_cast(argu); ASSERT_TRUE(item); Q_EMIT item->callbackCalled(); if (auto tmp = dynamic_cast(node)) { item->nodeTextureImg = tmp->cachedSource; } else { #ifndef QT_NO_OPENGL if (auto tmp = dynamic_cast(node)) { item->nodeTextureImg = tmp->m_fboVector[0]->toImage(); } #endif } }, this); blurNode->setOffscreen(false); blurNode->setBlendColor(TestUtil::simpleColor); blurNode->setRadius(10); blurNode->setWindow(window()); blurNode->setRect(QRectF(0, 0, 100, 100)); blurNode->setSourceRect(QRectF(0, 0, 100, 100)); } while(false); if (blurNode) node->appendChildNode(blurNode); } node->setRect(this->boundingRect()); return node; } signals: void callbackCalled(); public: QImage nodeTextureImg; }; TEST(ut_DSGBlurImageNode, properties) { TestUtil::registerType("DSGBlurImageNodeItem"); QuickViewHelper helper; ASSERT_TRUE(helper.load("qrc:/qml/DSGBlurImageNode.qml")); auto target = helper.object; ASSERT_TRUE(target); QSignalSpy spy(target, SIGNAL(callbackCalled())); helper.requestExposed(); EXPECT_GE(spy.count(), 1); EXPECT_NE(TestUtil::simpleImage->pixelColor(QPoint(50, 50)), target->nodeTextureImg.pixelColor(QPoint(50, 50))); } #include "ut_dblurimagenode.moc" dtkdeclarative-5.7.12/tests/ut_dconfigwrapper.cpp000066400000000000000000000060341476226662700222110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include "private/dconfigwrapper_p.h" #include "test_helper.hpp" static constexpr char const *LocalPrefix = "/tmp/example"; static constexpr char const *APP_ID = BIN_NAME; static constexpr char const *FILE_NAME = "example"; class ut_DConfigWrapper : public ::testing::Test { public: virtual void SetUp() { const QString &target = QString("%1/usr/share/dsg/configs/%2/%3.json").arg(LocalPrefix, APP_ID, FILE_NAME); if (!QFile::exists(QFileInfo(target).path())) QDir().mkpath(QFileInfo(target).path()); QFile::copy(":/data/dconf-example.meta.json", target); qputenv("DSG_DCONFIG_FILE_BACKEND_LOCAL_PREFIX", LocalPrefix); qputenv("DSG_DCONFIG_BACKEND_TYPE", "FileBackend"); qputenv("DSG_DATA_DIRS", "/usr/share/dsg"); } virtual void TearDown() { QDir(LocalPrefix).removeRecursively(); } }; TEST_F(ut_DConfigWrapper, componentComplete) { QScopedPointer config(new DConfigWrapper()); config->setAsync(false); config->classBegin(); config->setName("example"); config->setSubpath(""); config->componentComplete(); ASSERT_TRUE(config->isValid()); } TEST_F(ut_DConfigWrapper, setValue) { QScopedPointer config(new DConfigWrapper()); config->setAsync(false); config->classBegin(); config->setName("example"); config->componentComplete(); ASSERT_TRUE(config->isValid()); EXPECT_EQ(config->subpath(), ""); ASSERT_TRUE(config->keyList().contains("key3")); QSignalSpy spy(config.data(), &DConfigWrapper::valueChanged); QString newValue = config->value("key3", QString("default")).toString() + QString("abc"); config->setValue("key3", newValue); ASSERT_EQ(config->value("key3").toString(), newValue); ASSERT_TRUE(QTest::qWaitFor([&spy](){ return spy.count() == 1; }, 500)); config->setProperty("key3", "23"); ASSERT_EQ(config->value("key3").toString(), "23"); config->resetValue("key3"); ASSERT_EQ(config->value("key3").toString(), "application"); } TEST_F(ut_DConfigWrapper, setValueByQml) { ControlHelper helper("qrc:/qml/Config.qml"); ASSERT_TRUE(helper.object); DConfigWrapper *config = helper.object->findChild(); ASSERT_TRUE(config); ASSERT_TRUE(config->isValid()); EXPECT_EQ(config->property("key2"), "key2"); EXPECT_EQ(config->value("key2"), "key2"); // `key3`'s value(defined in qml) is only fallback value instead of current value. EXPECT_EQ(config->property("key3"), "application"); EXPECT_EQ(config->value("key3"), "application"); QSignalSpy key3Change(helper.object, SIGNAL(key3Changed())); config->metaObject()->invokeMethod(helper.object, "setKey3", Q_ARG(QVariant, QString("2"))); EXPECT_EQ(key3Change.count(), 1); EXPECT_EQ(config->value("key3").toString(), "2"); } dtkdeclarative-5.7.12/tests/ut_dhandlecontextmenuwindow.cpp000066400000000000000000000012121476226662700243110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include "dhandlecontextmenuwindow_p.h" #include TEST(ut_DHandleContextMenuWindow, window) { ControlHelper helper("qrc:/qml/ContextMenuWindow.qml"); ASSERT_TRUE(helper.object); helper.requestExposed(); auto w = helper.object; auto windowImange = w->grabWindow(); EXPECT_EQ(windowImange.pixelColor(QPoint(50, 50)), Qt::red); QTest::mouseClick(w, Qt::RightButton, Qt::NoModifier, QPoint( 50, 50 ), 100); } dtkdeclarative-5.7.12/tests/ut_dmaskeffectnode.cpp000066400000000000000000000073721476226662700223270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include "dmaskeffectnode_p.h" DQUICK_USE_NAMESPACE class TextureMaterialItem : public QQuickItem { public: TextureMaterialItem() : QQuickItem() { setFlag(ItemHasContents, true); } protected: QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override { QSGGeometryNode *node = static_cast(oldNode); if (!node) { node = new QSGGeometryNode(); auto geo = new QSGGeometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4); node->setGeometry(geo); node->setFlag(QSGNode::OwnsGeometry); auto material = new TextureMaterial(); material->setMaskTexture(TestUtil::simpleTextureThreePart(255)); material->setMaskOffset(QVector2D(0, 0)); material->setMaskScale(QVector2D(1, 1)); material->setSourceScale(QVector2D(1, 1)); material->setTexture(TestUtil::simpleTexture(QColor(100, 100, 100, 255))); node->setMaterial(material); node->setFlag(QSGNode::OwnsMaterial); } QSGGeometry::updateTexturedRectGeometry(node->geometry(), boundingRect(), QRectF(0, 0, 1, 1)); node->markDirty(QSGNode::DirtyGeometry); return node; } }; TEST(ut_MaskEffectNode, textureMaterial) { TEST_SOFTWARE_SKIP(); TestUtil::registerType("TextureMaterialItem"); QuickViewHelper<> helper("qrc:/qml/DMaskEffectNode_TextureMaterial.qml"); ASSERT_TRUE(helper.object); auto target = findItem(helper.object); ASSERT_TRUE(target); QImage img = helper.view->grabWindow(); EXPECT_EQ(img.pixelColor(QPoint(50, 30)), QColor(0, 0, 0, 255)); EXPECT_EQ(img.pixelColor(QPoint(50, 60)), QColor(0, 100, 0, 255)); EXPECT_EQ(img.pixelColor(QPoint(50, 90)), QColor(0, 0, 0, 255)); } class MaskEffectNodeItem : public QQuickItem { public: MaskEffectNodeItem() : QQuickItem() { setFlag(ItemHasContents, true); } protected: QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override { MaskEffectNode *node = static_cast(oldNode); if (!node) { node = new MaskEffectNode(); node->setMaskTexture(TestUtil::simpleTextureThreePart(255)); node->setMaskOffset(QVector2D(0, 0)); node->setMaskScale(QVector2D(1, 1)); node->setSourceScale(QVector2D(1, 1)); node->setFiltering(QSGTexture::Linear); node->setMipmapFiltering(QSGTexture::Linear); node->setAnisotropyLevel(QSGTexture::Anisotropy2x); node->setTextureCoordinatesTransform(QSGImageNode::MirrorHorizontally | QSGImageNode::MirrorVertically); node->setOwnsTexture(false); node->setTexture(TestUtil::simpleTexture(QColor(100, 100, 100, 255))); } node->setRect(this->boundingRect()); node->setSourceRect(node->rect()); return node; } }; TEST(ut_MaskEffectNode, properties) { TEST_SOFTWARE_SKIP(); TestUtil::registerType("MaskEffectNodeItem"); QuickViewHelper<> helper("qrc:/qml/DMaskEffectNode.qml"); ASSERT_TRUE(helper.object); auto target = findItem(helper.object); ASSERT_TRUE(target); QImage img = helper.view->grabWindow(); EXPECT_EQ(img.pixelColor(QPoint(50, 30)), QColor(0, 0, 0, 255)); EXPECT_EQ(img.pixelColor(QPoint(50, 60)), QColor(0, 100, 0, 255)); EXPECT_EQ(img.pixelColor(QPoint(50, 90)), QColor(0, 0, 0, 255)); } dtkdeclarative-5.7.12/tests/ut_dmessagemanager.cpp000066400000000000000000000051671476226662700223300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include #include "dmessagemanager_p.h" DQUICK_USE_NAMESPACE class ut_MessageManager : public ::testing::Test { public: virtual void SetUp() { ASSERT_TRUE(helper.load("qrc:/qml/MessageManager.qml")); root = helper.object; target = qobject_cast(qmlAttachedPropertiesObject(root, false)); ASSERT_TRUE(target); } ControlHelper helper; QQuickWindow *root = nullptr; MessageManager *target = nullptr; }; TEST_F(ut_MessageManager, properties) { ASSERT_TRUE(target->window()); ASSERT_TRUE(target->delegate()); ASSERT_TRUE(target->layout()); EXPECT_EQ(target->capacity(), 3); EXPECT_EQ(target->count(), 0); } TEST_F(ut_MessageManager, sendMessage) { ASSERT_TRUE(target->sendMessage("msg1", "icon1", 1)); EXPECT_EQ(target->count(), 1); EXPECT_TRUE(QTest::qWaitFor([this]() { return target->count() <= 0; })); ASSERT_TRUE(target->sendMessage("msg1", "icon1", 1)); ASSERT_TRUE(target->sendMessage("msg2", "icon2", 1, "id2")); ASSERT_TRUE(target->sendMessage("msg3", "icon3", 1, "id2")); EXPECT_EQ(target->count(), 2); EXPECT_EQ(target->messages("id2").size(), 1); EXPECT_TRUE(QTest::qWaitFor([this]() { return target->count() <= 0; })); } TEST_F(ut_MessageManager, sendMessageByDelegate) { QQmlComponent *delegate = root->property("containerCom").value(); ASSERT_TRUE(delegate); QVariantMap argus; argus.insert("msg", QStringList{"msg1"}); argus.insert("icon", QStringList{"icon1"}); target->sendMessage(delegate, argus, 1, "id1"); EXPECT_EQ(target->count(), 1); const auto messages = target->messages("id1"); ASSERT_EQ(messages.size(), 1); const auto message = messages.at(0); EXPECT_EQ(message->panel()->property("content"), "msg1"); EXPECT_EQ(message->panel()->property("iconName"), "icon1"); } TEST_F(ut_MessageManager, messageContainer) { ASSERT_TRUE(target->sendMessage("msg1", "icon1", 1, "id1")); EXPECT_EQ(target->count(), 1); const auto messages = target->messages("id1"); ASSERT_EQ(messages.size(), 1); const auto message = messages.at(0); EXPECT_EQ(message->duration(), 1); EXPECT_EQ(message->panel()->property("content"), "msg1"); EXPECT_EQ(message->panel()->property("iconName"), "icon1"); target->close("id1"); EXPECT_EQ(target->count(), 0); } dtkdeclarative-5.7.12/tests/ut_dobjectmodelproxy.cpp000066400000000000000000000030331476226662700227300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include #include "dobjectmodelproxy_p.h" DQUICK_USE_NAMESPACE class ut_ObjectModelProxy : public ::testing::Test { public: virtual void SetUp() { ASSERT_TRUE(helper.load("qrc:/qml/ObjectModelProxy.qml")); root = helper.object; target = helper.object->property("model").value(); ASSERT_TRUE(target); } ControlHelper helper; QQuickItem *root = nullptr; ObjectModelProxy *target = nullptr; }; TEST_F(ut_ObjectModelProxy, properties) { EXPECT_EQ(target->count(), 3); } TEST_F(ut_ObjectModelProxy, filterAcceptsItem) { EXPECT_EQ(root->property("count").toInt(), 3); root->setProperty("filterText", "Page2"); target->update(); ASSERT_EQ(root->property("count").toInt(), 1); root->setProperty("filterText", ""); target->update(); EXPECT_EQ(root->property("count").toInt(), 3); } TEST_F(ut_ObjectModelProxy, mappingWithSource) { root->setProperty("filterText", "Page2"); target->update(); ASSERT_EQ(root->property("count").toInt(), 1); auto object1 = target->get(0); ASSERT_TRUE(object1); ASSERT_EQ(object1->property("text"), "Page2"); auto sourceIndex1 = target->mapToSource(0); ASSERT_EQ(sourceIndex1, 1); auto index1 = target->mapFromSource(1); ASSERT_EQ(index1, 0); } dtkdeclarative-5.7.12/tests/ut_dplatformthemeproxy.cpp000066400000000000000000000122771476226662700233220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include DQUICK_USE_NAMESPACE DGUI_USE_NAMESPACE class ut_DPlatformThemeProxy : public ::testing::Test { public: virtual void SetUp(); virtual void TearDown(); QPointer pObj; QPointer pAppTheme; }; void ut_DPlatformThemeProxy::SetUp() { pAppTheme = DGuiApplicationHelper::instance()->applicationTheme(); pObj = new DPlatformThemeProxy(pAppTheme); } void ut_DPlatformThemeProxy::TearDown() { if (!pObj.isNull()) delete pObj.data(); } TEST_F(ut_DPlatformThemeProxy, cursorBlinkTime) { ASSERT_EQ(pAppTheme->cursorBlinkTime(), pObj->cursorBlinkTime()); } TEST_F(ut_DPlatformThemeProxy, cursorBlinkTimeout) { ASSERT_EQ(pAppTheme->cursorBlinkTimeout(), pObj->cursorBlinkTimeout()); } TEST_F(ut_DPlatformThemeProxy, cursorBlink) { ASSERT_EQ(pAppTheme->cursorBlink(), pObj->cursorBlink()); } TEST_F(ut_DPlatformThemeProxy, doubleClickDistance) { ASSERT_EQ(pAppTheme->doubleClickDistance(), pObj->doubleClickDistance()); } TEST_F(ut_DPlatformThemeProxy, doubleClickTime) { ASSERT_EQ(pAppTheme->doubleClickTime(), pObj->doubleClickTime()); } TEST_F(ut_DPlatformThemeProxy, dndDragThreshold) { ASSERT_EQ(pAppTheme->dndDragThreshold(), pObj->dndDragThreshold()); } TEST_F(ut_DPlatformThemeProxy, windowRadius) { ASSERT_EQ(pAppTheme->windowRadius(), pObj->windowRadius()); } TEST_F(ut_DPlatformThemeProxy, themeName) { ASSERT_EQ(pAppTheme->themeName(), pObj->themeName()); } TEST_F(ut_DPlatformThemeProxy, iconThemeName) { ASSERT_EQ(pAppTheme->iconThemeName(), pObj->iconThemeName()); } TEST_F(ut_DPlatformThemeProxy, soundThemeName) { ASSERT_EQ(pAppTheme->soundThemeName(), pObj->soundThemeName()); } TEST_F(ut_DPlatformThemeProxy, fontName) { ASSERT_EQ(pAppTheme->fontName(), pObj->fontName()); } TEST_F(ut_DPlatformThemeProxy, monoFontName) { ASSERT_EQ(pAppTheme->monoFontName(), pObj->monoFontName()); } TEST_F(ut_DPlatformThemeProxy, fontPointSize) { ASSERT_EQ(pAppTheme->fontPointSize(), pObj->fontPointSize()); } TEST_F(ut_DPlatformThemeProxy, gtkFontName) { ASSERT_EQ(pAppTheme->gtkFontName(), pObj->gtkFontName()); } TEST_F(ut_DPlatformThemeProxy, activeColor) { ASSERT_EQ(pAppTheme->activeColor(), pObj->activeColor()); } TEST_F(ut_DPlatformThemeProxy, window) { ASSERT_EQ(pAppTheme->window(), pObj->window()); } TEST_F(ut_DPlatformThemeProxy, windowText) { ASSERT_EQ(pAppTheme->windowText(), pObj->windowText()); } TEST_F(ut_DPlatformThemeProxy, base) { ASSERT_EQ(pAppTheme->base(), pObj->base()); } TEST_F(ut_DPlatformThemeProxy, alternateBase) { ASSERT_EQ(pAppTheme->alternateBase(), pObj->alternateBase()); } TEST_F(ut_DPlatformThemeProxy, toolTipBase) { ASSERT_EQ(pAppTheme->toolTipBase(), pObj->toolTipBase()); } TEST_F(ut_DPlatformThemeProxy, toolTipText) { ASSERT_EQ(pAppTheme->toolTipText(), pObj->toolTipText()); } TEST_F(ut_DPlatformThemeProxy, text) { ASSERT_EQ(pAppTheme->text(), pObj->text()); } TEST_F(ut_DPlatformThemeProxy, button) { ASSERT_EQ(pAppTheme->button(), pObj->button()); } TEST_F(ut_DPlatformThemeProxy, buttonText) { ASSERT_EQ(pAppTheme->buttonText(), pObj->buttonText()); } TEST_F(ut_DPlatformThemeProxy, brightText) { ASSERT_EQ(pAppTheme->brightText(), pObj->brightText()); } TEST_F(ut_DPlatformThemeProxy, light) { ASSERT_EQ(pAppTheme->light(), pObj->light()); } TEST_F(ut_DPlatformThemeProxy, midlight) { ASSERT_EQ(pAppTheme->midlight(), pObj->midlight()); } TEST_F(ut_DPlatformThemeProxy, dark) { ASSERT_EQ(pAppTheme->dark(), pObj->dark()); } TEST_F(ut_DPlatformThemeProxy, mid) { ASSERT_EQ(pAppTheme->mid(), pObj->mid()); } TEST_F(ut_DPlatformThemeProxy, shadow) { ASSERT_EQ(pAppTheme->shadow(), pObj->shadow()); } TEST_F(ut_DPlatformThemeProxy, highlight) { ASSERT_EQ(pAppTheme->highlight(), pObj->highlight()); } TEST_F(ut_DPlatformThemeProxy, highlightedText) { ASSERT_EQ(pAppTheme->highlightedText(), pObj->highlightedText()); } TEST_F(ut_DPlatformThemeProxy, link) { ASSERT_EQ(pAppTheme->link(), pObj->link()); } TEST_F(ut_DPlatformThemeProxy, linkVisited) { ASSERT_EQ(pAppTheme->linkVisited(), pObj->linkVisited()); } TEST_F(ut_DPlatformThemeProxy, itemBackground) { ASSERT_EQ(pAppTheme->itemBackground(), pObj->itemBackground()); } TEST_F(ut_DPlatformThemeProxy, textTitle) { ASSERT_EQ(pAppTheme->textTitle(), pObj->textTitle()); } TEST_F(ut_DPlatformThemeProxy, textTips) { ASSERT_EQ(pAppTheme->textTips(), pObj->textTips()); } TEST_F(ut_DPlatformThemeProxy, textWarning) { ASSERT_EQ(pAppTheme->textWarning(), pObj->textWarning()); } TEST_F(ut_DPlatformThemeProxy, textLively) { ASSERT_EQ(pAppTheme->textLively(), pObj->textLively()); } TEST_F(ut_DPlatformThemeProxy, lightLively) { ASSERT_EQ(pAppTheme->lightLively(), pObj->lightLively()); } TEST_F(ut_DPlatformThemeProxy, darkLively) { ASSERT_EQ(pAppTheme->darkLively(), pObj->darkLively()); } TEST_F(ut_DPlatformThemeProxy, frameBorder) { ASSERT_EQ(pAppTheme->frameBorder(), pObj->frameBorder()); } dtkdeclarative-5.7.12/tests/ut_dqmlglobalobject.cpp000066400000000000000000000151071476226662700225050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "test_helper.hpp" #include #include #include #include #include #include #include #include #include #include "dmessagemanager_p.h" DQUICK_USE_NAMESPACE DGUI_USE_NAMESPACE class ut_DQMLGlobalObject : public ::testing::Test { public: virtual void SetUp(); virtual void TearDown(); QPointer pObj; QPointer pWMIns; QPointer pAppIns; }; void ut_DQMLGlobalObject::SetUp() { pObj = new DQMLGlobalObject(); pWMIns = DWindowManagerHelper::instance(); pAppIns = DGuiApplicationHelper::instance(); } void ut_DQMLGlobalObject::TearDown() { if (!pObj.isNull()) delete pObj.data(); } TEST_F(ut_DQMLGlobalObject, hasBlurWindow) { ASSERT_EQ(pWMIns->hasBlurWindow(), pObj->hasBlurWindow()); } TEST_F(ut_DQMLGlobalObject, hasComposite) { ASSERT_EQ(pWMIns->hasComposite(), pObj->hasComposite()); } TEST_F(ut_DQMLGlobalObject, hasNoTitlebar) { ASSERT_EQ(pWMIns->hasNoTitlebar(), pObj->hasNoTitlebar()); } TEST_F(ut_DQMLGlobalObject, windowManagerName) { ASSERT_EQ(pWMIns->windowManagerName(), pObj->windowManagerName()); } TEST_F(ut_DQMLGlobalObject, themeType) { ASSERT_EQ(pAppIns->themeType(), pObj->themeType()); } TEST_F(ut_DQMLGlobalObject, windowManagerNameString) { ASSERT_EQ(pWMIns->windowManagerNameString(), pObj->windowManagerNameString()); } TEST_F(ut_DQMLGlobalObject, platformTheme) { ASSERT_TRUE(pObj->platformTheme()); } TEST_F(ut_DQMLGlobalObject, fontManager) { #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) qmlRegisterType(); #else qmlRegisterAnonymousType("", 1); #endif ASSERT_TRUE(pObj->fontManager()); } TEST_F(ut_DQMLGlobalObject, palette) { DPalette expected = pAppIns->applicationPalette(); DPalette actual = pObj->palette(); for (int i = 0; i < QPalette::NColorRoles; ++i) { QPalette::ColorRole role = static_cast(i); ASSERT_EQ(expected.color(QPalette::Active, role), actual.color(QPalette::Active, role)); } } TEST_F(ut_DQMLGlobalObject, paletteChanged) { Q_UNUSED(pObj->palette()); DPalette palatte = pAppIns->applicationPalette(); palatte.setColor(DPalette::TextTitle, Qt::red); QSignalSpy spy(pObj, &DQMLGlobalObject::paletteChanged); pAppIns->setApplicationPalette(palatte); EXPECT_EQ(spy.count(), 1); pAppIns->setApplicationPalette(DPalette()); } TEST_F(ut_DQMLGlobalObject, inactivePalette) { DPalette expected = pAppIns->applicationPalette(); DPalette actual = pObj->inactivePalette(); for (int i = 0; i < QPalette::NColorRoles; ++i) { QPalette::ColorRole role = static_cast(i); ASSERT_EQ(expected.color(QPalette::Inactive, role), actual.color(QPalette::Active, role)); } } TEST_F(ut_DQMLGlobalObject, makeColor) { ControlHelper<> helper("qrc:/qml/QmlGlobalObject.qml"); ASSERT_TRUE(helper.object); DColor color1 = helper.object->property("color1").value(); ASSERT_TRUE(color1.isTypedColor()); DColor color2 = helper.object->property("color2").value(); ASSERT_TRUE(!color2.isTypedColor()); const QPalette &pt = helper.object->property("palette").value(); ASSERT_EQ(color1.toColor(pt), pt.highlight().color()); } TEST_F(ut_DQMLGlobalObject, deepinWebsite) { ASSERT_TRUE(!pObj->deepinWebsiteName().isEmpty()); ASSERT_TRUE(!pObj->deepinWebsiteLink().isEmpty()); } TEST_F(ut_DQMLGlobalObject, deepinDistributionOrgLogo) { ASSERT_TRUE(!pObj->deepinDistributionOrgLogo().isEmpty()); } TEST_F(ut_DQMLGlobalObject, blendColor) { QColor color = pObj->blendColor(Qt::red, Qt::blue); EXPECT_NE(color, QColor(Qt::red)); EXPECT_EQ(color, QColor(Qt::blue)); } TEST_F(ut_DQMLGlobalObject, toColorType) { DGuiApplicationHelper::ColorType colorType = pObj->toColorType(pAppIns->applicationPalette().window().color()); EXPECT_EQ(colorType, pObj->themeType()); } TEST_F(ut_DQMLGlobalObject, selectColor) { QColor color = pObj->selectColor(pAppIns->applicationPalette().window().color(), Qt::white, Qt::black); QColor expectColor = pObj->themeType() == DGuiApplicationHelper::DarkType ? QColor(Qt::black) : QColor(Qt::white); EXPECT_EQ(color, expectColor); } TEST_F(ut_DQMLGlobalObject, sendMessage) { ControlHelper<> helper("qrc:/qml/QmlGlobalObject_MessageManager.qml"); ASSERT_TRUE(helper.object); EXPECT_TRUE(pObj->sendMessage(helper.object, "msg1", "icon1", 1)); } TEST_F(ut_DQMLGlobalObject, sendMessageByDelegate) { ControlHelper helper("qrc:/qml/QmlGlobalObject_MessageManager.qml"); QQuickWindow *root = helper.object; MessageManager *msgMgr = qobject_cast(qmlAttachedPropertiesObject(root, false)); ASSERT_TRUE(msgMgr); QQmlComponent *delegate = root->property("containerCom").value(); ASSERT_TRUE(delegate); QVariantMap argus; argus.insert("msg", QStringList{"msg1"}); argus.insert("icon", QStringList{"icon1"}); EXPECT_TRUE(pObj->sendMessage(root, delegate, argus, 1, "id1")); EXPECT_EQ(msgMgr->count(), 1); pObj->closeMessage(root, "id1"); EXPECT_EQ(msgMgr->count(), 0); } TEST(ut_DColor, construct) { DColor invalidColor; ASSERT_FALSE(invalidColor.isValid()); DColor color(DColor::Highlight); ASSERT_TRUE(color.isTypedColor()); ASSERT_TRUE(color.isValid()); QPalette pt; pt.setBrush(QPalette::Highlight, Qt::red); ASSERT_EQ(color.toColor(pt), Qt::red); DColor color1(DColor::HighlightedText); ASSERT_TRUE(color1.isTypedColor()); ASSERT_TRUE(color1.isValid()); pt.setBrush(QPalette::HighlightedText, Qt::blue); ASSERT_EQ(color1.toColor(pt), Qt::blue); DColor color2(QColor(Qt::red)); ASSERT_EQ(color2.color(), Qt::red); } TEST(ut_DColor, common) { DColor color(QColor(Qt::red)); DColor color2(color.hue(1).opacity(1).saturation(1).lightness(1)); EXPECT_NE(color.data.hue, color2.data.hue); EXPECT_NE(color.data.opacity, color2.data.opacity); EXPECT_NE(color.data.saturation, color2.data.saturation); EXPECT_NE(color.data.lightness, color2.data.lightness); } TEST(ut_DColor, operatorEQ) { DColor color1(QColor(Qt::red)); DColor color2(QColor(Qt::blue)); DColor color3(QColor(Qt::blue)); EXPECT_NE(color1, color2); EXPECT_EQ(color2, color3); } dtkdeclarative-5.7.12/tests/ut_dquickarrowboxpath.cpp000066400000000000000000000033421476226662700231170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include "dquickarrowboxpath_p.h" DQUICK_USE_NAMESPACE class ut_DQuickArrowBoxPath : public ::testing::Test { public: virtual void SetUp() { ASSERT_TRUE(helper.load("qrc:/qml/ArrowBoxPath.qml")); target = helper.object->findChild(); ASSERT_TRUE(target); } ControlHelper helper; DQuickArrowBoxPath *target = nullptr; }; TEST_F(ut_DQuickArrowBoxPath, properties) { EXPECT_EQ(target->width(), 100); EXPECT_EQ(target->arrowX(), 50); EXPECT_EQ(target->arrowY(), 10); EXPECT_EQ(target->arrowWidth(), 20); EXPECT_EQ(target->arrowHeight(), 20); EXPECT_EQ(target->arrowDirection(), DQuickArrowBoxPath::Up); EXPECT_EQ(target->roundedRadius(), 8); } TEST_F(ut_DQuickArrowBoxPath, updateProperties) { target->setArrowDirection(DQuickArrowBoxPath::Down); EXPECT_EQ(target->arrowDirection(), DQuickArrowBoxPath::Down); target->setSpread(5); EXPECT_EQ(target->spread(), 5); } TEST(ut_DQuickArrowBoxPath2, shapes) { QuickViewHelper<> helper("qrc:/qml/ArrowBoxPath.qml"); ASSERT_TRUE(helper.object); auto windowImange = helper.object->window()->grabWindow(); const QColor inArrowColor(Qt::blue); EXPECT_EQ(windowImange.pixelColor(QPoint(50, 12)), inArrowColor); EXPECT_EQ(windowImange.pixelColor(QPoint(50, 20)), inArrowColor); const QColor outsideArrowColor(Qt::red); EXPECT_EQ(windowImange.pixelColor(QPoint(50, 9)), outsideArrowColor); EXPECT_EQ(windowImange.pixelColor(QPoint(10, 10)), outsideArrowColor); } dtkdeclarative-5.7.12/tests/ut_dquickbehindwindowblur.cpp000066400000000000000000000020351476226662700237430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include "dquickbehindwindowblur_p.h" DQUICK_USE_NAMESPACE TEST(ut_DQuickBehindWindowBlur, properties) { QuickViewHelper<> helper("qrc:/qml/DQuickBehindWindowBlur.qml"); ASSERT_TRUE(helper.object); DQuickBehindWindowBlur *target = helper.object->findChild(); ASSERT_TRUE(target); if (!target->valid()) GTEST_SKIP_("don't support BehindWindowBlur, it need WM support."); EXPECT_EQ(target->blendColor(), QColor(0, 255, 0, 0.4 * 255)); EXPECT_EQ(target->cornerRadius(), 10); QQuickWindow *subWindow = helper.object->findChild(); ASSERT_TRUE(subWindow); helper.requestExposed(subWindow); QImage img = helper.view->grabWindow(); EXPECT_NE(img.pixelColor(QPoint(50, 50)), QColor(0, 255, 0, 0.4)); EXPECT_EQ(img.pixelColor(QPoint(150, 50)), Qt::red); } dtkdeclarative-5.7.12/tests/ut_dquickblitframebuffer.cpp000066400000000000000000000012731476226662700235370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include "dquickblitframebuffer.h" DQUICK_USE_NAMESPACE TEST(ut_DQuickBlitFramebuffer, properties) { QuickViewHelper<> helper("qrc:/qml/DQuickBlitFramebuffer.qml"); ASSERT_TRUE(helper.object); auto target = findItem(helper.object); ASSERT_TRUE(target); QImage img = helper.view->grabWindow(); // out buffer area EXPECT_EQ(img.pixelColor(QPoint(50, 40)), Qt::red); // in buffer area EXPECT_EQ(img.pixelColor(QPoint(60, 60)), Qt::blue); } dtkdeclarative-5.7.12/tests/ut_dquickcoloroverlay.cpp000066400000000000000000000017711476226662700231230ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include "dquickcoloroverlay_p.h" #include DQUICK_USE_NAMESPACE TEST(ut_DQuickColorOverlay, properties) { ControlHelper<> helper("qrc:/qml/SoftwareColorOverlay.qml"); ASSERT_TRUE(helper.object); DQuickColorOverlay *target = helper.object->findChild(); ASSERT_TRUE(target); QQuickItem *sourceItem = helper.object->findChild("image"); ASSERT_TRUE(sourceItem); EXPECT_EQ(target->source(), sourceItem); EXPECT_EQ(target->color(), "red"); EXPECT_EQ(target->cached(), true); } TEST(ut_DQuickColorOverlay, image) { TEST_NOTSOFTWARE_SKIP(); QuickViewHelper<> helper("qrc:/qml/SoftwareColorOverlay.qml"); ASSERT_TRUE(helper.object); auto img = helper.object->window()->grabWindow(); EXPECT_EQ(img.pixelColor(QPoint(25, 25)), Qt::red); } dtkdeclarative-5.7.12/tests/ut_dquickdciicon.cpp000066400000000000000000000043451476226662700220130ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "dquickdciicon_p.h" DQUICK_USE_NAMESPACE class ut_DQuickDciIcon : public ::testing::Test { public: virtual void SetUp() { target = new DQuickDciIcon; } virtual void TearDown() { delete target; } DQuickDciIcon *target = nullptr; }; TEST_F(ut_DQuickDciIcon, name) { EXPECT_TRUE(target->isEmpty()); target->setName("test"); EXPECT_EQ(target->name(), "test"); target->resetName(); EXPECT_EQ(target->name(), ""); } TEST_F(ut_DQuickDciIcon, width) { target->setWidth(20); EXPECT_EQ(target->width(), 20); target->resetWidth(); EXPECT_EQ(target->width(), 0); } TEST_F(ut_DQuickDciIcon, height) { target->setHeight(20); EXPECT_EQ(target->height(), 20); target->resetHeight(); EXPECT_EQ(target->height(), 0); } TEST_F(ut_DQuickDciIcon, mode) { target->setMode(DQMLGlobalObject::DisabledState); EXPECT_EQ(target->mode(), DQMLGlobalObject::DisabledState); target->resetMode(); EXPECT_EQ(target->mode(), DQMLGlobalObject::NormalState); } TEST_F(ut_DQuickDciIcon, theme) { target->setTheme(DGuiApplicationHelper::ColorType::DarkType); EXPECT_EQ(target->theme(), DGuiApplicationHelper::ColorType::DarkType); target->resetTheme(); EXPECT_EQ(target->theme(), DGuiApplicationHelper::ColorType::LightType); } TEST_F(ut_DQuickDciIcon, palette) { DDciIconPalette palette(Qt::red, Qt::green, Qt::red); target->setPalette(palette); EXPECT_EQ(target->palette(), palette); target->resetPalette(); EXPECT_EQ(target->palette(), DDciIconPalette()); } TEST_F(ut_DQuickDciIcon, source) { QUrl source("qrc:/test"); target->setSource(source); EXPECT_EQ(target->source(), source); target->resetSource(); EXPECT_EQ(target->source(), QUrl()); } TEST_F(ut_DQuickDciIcon, fallbackToQIcon) { target->setFallbackToQIcon(false); EXPECT_EQ(target->fallbackToQIcon(), false); target->resetFallbackToQIcon(); EXPECT_EQ(target->fallbackToQIcon(), true); } TEST_F(ut_DQuickDciIcon, operatorEQ) { DQuickDciIcon dciIcon = *target; EXPECT_EQ(*target, dciIcon); } dtkdeclarative-5.7.12/tests/ut_dquickdciiconimage.cpp000066400000000000000000000022441476226662700230120ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include "dquickdciiconimage_p.h" #include DQUICK_USE_NAMESPACE TEST(ut_DQuickDciIconImage, properties) { ControlHelper<> helper("qrc:/qml/DciIcon.qml"); ASSERT_TRUE(helper.object); DQuickDciIconImage *target = helper.object->findChild(); EXPECT_EQ(target->name(), "switch_button"); EXPECT_EQ(target->mode(), DTK_QUICK_NAMESPACE::DQMLGlobalObject::NormalState); EXPECT_EQ(target->theme(), DGuiApplicationHelper::LightType); EXPECT_EQ(target->sourceSize(), QSize(0, 0)); EXPECT_EQ(target->mirror(), false); EXPECT_EQ(target->fallbackToQIcon(), true); QTest::qWait(1); // TODO: Resolve crash EXPECT_EQ(target->isNull("switch_button"), false); } TEST(ut_DQuickDciIconImage, image) { QuickViewHelper<> helper("qrc:/qml/DciIcon.qml"); ASSERT_TRUE(helper.object); auto windowImange = helper.object->window()->grabWindow(); EXPECT_EQ(windowImange.pixelColor(QPoint(50, 50)), QColor(16, 131, 245)); // NOTICE: color ? } dtkdeclarative-5.7.12/tests/ut_dquickglow.cpp000066400000000000000000000030301476226662700213410ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include "dquickglow_p.h" DQUICK_USE_NAMESPACE TEST(ut_DQuickGlow, properties) { ControlHelper<> helper("qrc:/qml/GlowEffect.qml"); ASSERT_TRUE(helper.object); DQuickGlow *target = helper.object->findChild(); EXPECT_EQ(target->glowRadius(), 50); EXPECT_EQ(target->color(), Qt::red); EXPECT_EQ(target->spread(), 0.01); EXPECT_EQ(target->relativeSizeX(), 0.5); EXPECT_EQ(target->relativeSizeY(), 0.5); EXPECT_EQ(target->fill(), true); } TEST(ut_DQuickGlow, updatePaintNode) { TEST_SOFTWARE_SKIP(); QuickViewHelper<> helper("qrc:/qml/GlowEffect.qml"); ASSERT_TRUE(helper.object); auto windowImange = helper.object->window()->grabWindow(); // center EXPECT_EQ(windowImange.pixelColor(QPoint(100, 100)), Qt::red); // rectangle EXPECT_EQ(windowImange.pixelColor(QPoint(50, 50)), Qt::blue); EXPECT_EQ(windowImange.pixelColor(QPoint(50, 150)), Qt::blue); EXPECT_EQ(windowImange.pixelColor(QPoint(150, 50)), Qt::blue); EXPECT_EQ(windowImange.pixelColor(QPoint(150, 150)), Qt::blue); // circle EXPECT_NE(windowImange.pixelColor(QPoint(75, 100)), Qt::blue); EXPECT_NE(windowImange.pixelColor(QPoint(100, 75)), Qt::blue); EXPECT_NE(windowImange.pixelColor(QPoint(125, 75)), Qt::blue); EXPECT_NE(windowImange.pixelColor(QPoint(100, 125)), Qt::blue); } dtkdeclarative-5.7.12/tests/ut_dquickiconimage.cpp000066400000000000000000000034501476226662700223320ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include "dquickiconimage_p.h" #include #include #include DQUICK_USE_NAMESPACE TEST(ut_DQuickIconImage, properties) { ControlHelper helper("qrc:/qml/QtIcon.qml"); ASSERT_TRUE(helper.object); DQuickIconImage *target = helper.object; EXPECT_EQ(target->color(), Qt::blue); EXPECT_EQ(target->name(), "qrc:/icon/red.svg"); EXPECT_EQ(target->state(), DQuickIconImage::State::On); EXPECT_EQ(target->mode(), DQuickIconImage::Mode::Active); EXPECT_EQ(target->fallbackSource(), QUrl("qrc:/icon/red.svg")); { QSignalSpy spy(target, &DQuickIconImage::nameChanged); target->setName("search_indicator"); ASSERT_EQ(spy.count(), 1); } { QSignalSpy spy(target, &DQuickIconImage::stateChanged); target->setState(DQuickIconImage::State::Off); ASSERT_EQ(spy.count(), 1); } { QSignalSpy spy(target, &DQuickIconImage::modeChanged); target->setMode(DQuickIconImage::Mode::Disabled); ASSERT_EQ(spy.count(), 1); } { QSignalSpy spy(target, &DQuickIconImage::colorChanged); target->setColor(Qt::red); ASSERT_EQ(spy.count(), 1); } { QSignalSpy spy(target, &DQuickIconImage::fallbackSourceChanged); target->setFallbackSource(QUrl("test")); ASSERT_EQ(spy.count(), 1); } } TEST(ut_DQuickIconImage, image) { QuickViewHelper<> helper("qrc:/qml/QtIcon.qml"); ASSERT_TRUE(helper.object); auto windowImange = helper.object->window()->grabWindow(); EXPECT_EQ(windowImange.pixelColor(QPoint(50, 50)), Qt::red); } dtkdeclarative-5.7.12/tests/ut_dquickiconlabel.cpp000066400000000000000000000060701476226662700223300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include "dquickiconlabel_p.h" #include #include DQUICK_USE_NAMESPACE class ut_DQuickIconLabel : public ::testing::Test { public: virtual void SetUp() { ASSERT_TRUE(helper.load("qrc:/qml/IconLabel.qml")); target = helper.object->findChild(); ASSERT_TRUE(target); } ControlHelper helper; DQuickIconLabel *target = nullptr; }; TEST_F(ut_DQuickIconLabel, properties) { EXPECT_EQ(target->icon().width(), 20); EXPECT_EQ(target->icon().height(), 20); EXPECT_EQ(target->icon().name(), "switch_button"); EXPECT_EQ(target->text(), "test"); EXPECT_EQ(target->font().pixelSize(), 17); EXPECT_EQ(target->color(), Qt::red); EXPECT_EQ(target->display(), DQuickIconLabel::IconBesideText); EXPECT_EQ(target->spacing(), 2); EXPECT_EQ(target->isMirrored(), false); EXPECT_EQ(target->alignment(), 129); EXPECT_EQ(target->topPadding(), 1); target->resetTopPadding(); EXPECT_EQ(target->topPadding(), 0); EXPECT_EQ(target->leftPadding(), 1); target->resetLeftPadding(); EXPECT_EQ(target->leftPadding(), 0); EXPECT_EQ(target->rightPadding(), 1); target->resetRightPadding(); EXPECT_EQ(target->rightPadding(), 0); EXPECT_EQ(target->bottomPadding(), 1); target->resetBottomPadding(); EXPECT_EQ(target->bottomPadding(), 0); } TEST_F(ut_DQuickIconLabel, displayIconOnly) { target->setDisplay(DQuickIconLabel::IconOnly); auto image = findItem(helper.object); EXPECT_EQ(image->x(), 1); auto text = findItem(helper.object); EXPECT_FALSE(text); } TEST_F(ut_DQuickIconLabel, displayTextOnly) { target->setDisplay(DQuickIconLabel::TextOnly); auto image = findItem(helper.object); EXPECT_FALSE(image); auto text = findItem(helper.object); EXPECT_EQ(text->x(), 1); } TEST_F(ut_DQuickIconLabel, displayIconBesideText) { target->setDisplay(DQuickIconLabel::IconBesideText); auto image = findItem(helper.object); ASSERT_TRUE(image); auto text = findItem(helper.object); ASSERT_TRUE(text); EXPECT_GT(image->position().x(), text->position().x()); } TEST_F(ut_DQuickIconLabel, displayTextBesideIcon) { target->setDisplay(DQuickIconLabel::TextBesideIcon); auto image = findItem(helper.object); ASSERT_TRUE(image); auto text = findItem(helper.object); ASSERT_TRUE(text); EXPECT_LT(image->position().x(), text->position().x()); } TEST_F(ut_DQuickIconLabel, displayTextUnderIcon) { target->setDisplay(DQuickIconLabel::TextUnderIcon); auto image = findItem(helper.object); EXPECT_TRUE(image); auto text = findItem(helper.object); EXPECT_TRUE(text); EXPECT_LT(image->position().y(), text->position().y()); } dtkdeclarative-5.7.12/tests/ut_dquickinwindowblur.cpp000066400000000000000000000015621476226662700231240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include "dquickinwindowblur_p.h" DQUICK_USE_NAMESPACE TEST(ut_DQuickInWindowBlur, properties) { TEST_QRHI_SKIP(); QuickViewHelper<> helper("qrc:/qml/DQuickInWindowBlur.qml"); ASSERT_TRUE(helper.object); DQuickInWindowBlur *target = helper.object->findChild(); ASSERT_TRUE(target); EXPECT_EQ(target->radius(), 10); QImage img = helper.view->grabWindow(); // blured area EXPECT_TRUE(TestUtil::equalBlurColor(img.pixelColor(QPoint(50, 50)), TestUtil::simpleImage->pixelColor(QPoint(50, 50)))); // don't be blured area EXPECT_NE(img.pixelColor(QPoint(90, 90)), TestUtil::simpleImage->pixelColor(QPoint(90, 90))); } dtkdeclarative-5.7.12/tests/ut_dquickitemviewport.cpp000066400000000000000000000025041476226662700231340ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include "dquickitemviewport.h" DQUICK_USE_NAMESPACE TEST(ut_DQuickItemViewport, properties) { QuickViewHelper<> helper("qrc:/qml/DQuickItemViewport.qml"); ASSERT_TRUE(helper.object); DQuickItemViewport *target = helper.object->findChild(); ASSERT_TRUE(target); EXPECT_EQ(target->radius(), 10); EXPECT_TRUE(target->fixed()); EXPECT_EQ(target->hideSource(), false); QImage img = helper.view->grabWindow(); // first is source, and second is viewport. EXPECT_EQ(img.pixelColor(QPoint(50, 50)), img.pixelColor(QPoint(100 + 50, 100 + 50))); } TEST(ut_DQuickItemViewport, hideSource) { QuickViewHelper<> helper("qrc:/qml/DQuickItemViewport_HideSource.qml"); ASSERT_TRUE(helper.object); DQuickItemViewport *target = helper.object->findChild(); ASSERT_TRUE(target); EXPECT_EQ(target->hideSource(), true); QImage img = helper.view->grabWindow(); // first is hide, and second is viewport. EXPECT_EQ(img.pixelColor(QPoint(50, 50)), Qt::blue); EXPECT_NE(img.pixelColor(QPoint(50, 50)), img.pixelColor(QPoint(100 + 50, 100 + 50))); } dtkdeclarative-5.7.12/tests/ut_dquickopacitymask.cpp000066400000000000000000000021771476226662700227300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include "dquickopacitymask_p.h" #include DQUICK_USE_NAMESPACE TEST(ut_DQuickOpacityMask, properties) { ControlHelper<> helper("qrc:/qml/SoftwareOpacityMask.qml"); ASSERT_TRUE(helper.object); DQuickOpacityMask *target = helper.object->findChild(); ASSERT_TRUE(target); QQuickItem *rectItem1 = helper.object->findChild("rect1"); ASSERT_TRUE(rectItem1); QQuickItem *rectItem2 = helper.object->findChild("rect2"); ASSERT_TRUE(rectItem2); EXPECT_EQ(target->source(), rectItem1); EXPECT_EQ(target->maskSource(), rectItem2); EXPECT_EQ(target->invert(), true); } TEST(ut_DQuickOpacityMask, image) { TEST_NOTSOFTWARE_SKIP(); QuickViewHelper<> helper("qrc:/qml/SoftwareOpacityMask.qml"); ASSERT_TRUE(helper.object); auto img = helper.object->window()->grabWindow(); EXPECT_NE(img.pixelColor(QPoint(125, 125)), Qt::red); //TODO: render abnormal!!! } dtkdeclarative-5.7.12/tests/ut_dquickrectangle.cpp000066400000000000000000000024111476226662700223370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include "dquickrectangle_p.h" DQUICK_USE_NAMESPACE TEST(ut_DQuickRectangle, properties) { ControlHelper helper("qrc:/qml/DQuickRectangle.qml"); ASSERT_TRUE(helper.object); EXPECT_EQ(helper.object->color(), Qt::red); EXPECT_EQ(helper.object->radius(), 8); EXPECT_EQ(helper.object->corners(), DQuickRectangle::TopLeftCorner | DQuickRectangle::TopRightCorner); } TEST(ut_DQuickRectangle, updateProperties) { TEST_OFFSCREEN_SKIP(); QuickViewHelper helper("qrc:/qml/DQuickRectangle.qml"); ASSERT_TRUE(helper.object); helper.object->setRadius(16); helper.object->setColor(Qt::blue); helper.object->setCorners(DQuickRectangle::TopLeftCorner | DQuickRectangle::TopRightCorner); auto windowImange = helper.object->window()->grabWindow(); const QPoint inCornerPoint(3, 3); const QPoint outCornerPoint(helper.object->boundingRect().center().toPoint()); EXPECT_EQ(windowImange.pixelColor(outCornerPoint), Qt::blue); EXPECT_NE(windowImange.pixelColor(inCornerPoint), Qt::blue); } dtkdeclarative-5.7.12/tests/ut_dquickwindow.cpp000066400000000000000000000032461476226662700217110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include #include #include DQUICK_USE_NAMESPACE class ut_DQuickWindow : public ::testing::Test { public: }; TEST_F(ut_DQuickWindow, enabled) { TEST_OFFSCREEN_SKIP(); ControlHelper helper("qrc:/qml/DQuickWindow.qml"); ASSERT_TRUE(helper.object); auto attached = qobject_cast(qmlAttachedPropertiesObject(helper.object, false)); ASSERT_TRUE(attached); ASSERT_TRUE(attached->property("enabled").toBool()); } TEST_F(ut_DQuickWindow, windowProperties) { TEST_OFFSCREEN_SKIP(); ControlHelper helper("qrc:/qml/DQuickWindow.qml"); ASSERT_TRUE(helper.object); auto attached = qobject_cast(qmlAttachedPropertiesObject(helper.object, false)); ASSERT_TRUE(attached && attached->isEnabled()); EXPECT_EQ(attached->window(), helper.object); EXPECT_EQ(attached->windowRadius(), 16); EXPECT_EQ(attached->borderWidth(), 1); EXPECT_EQ(attached->borderColor(), Qt::red); EXPECT_EQ(attached->shadowRadius(), 10); EXPECT_EQ(attached->shadowOffset(), QPoint(0, 2)); EXPECT_EQ(attached->shadowColor(), Qt::red); EXPECT_EQ(attached->translucentBackground(), true); EXPECT_EQ(attached->enableSystemResize(), true); EXPECT_EQ(attached->enableSystemMove(), true); EXPECT_EQ(attached->enableBlurWindow(), true); EXPECT_EQ(attached->alphaBufferSize(), 8); } dtkdeclarative-5.7.12/tests/ut_dsettingscontainer.cpp000066400000000000000000000114041476226662700231030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include "dsettingscontainer_p.h" DQUICK_USE_NAMESPACE class ut_SettingsContainer : public ::testing::Test { public: virtual void SetUp() { ASSERT_TRUE(helper.load("qrc:/qml/SettingsContainer.qml")); target = helper.object; } ControlHelper helper; SettingsContainer *target = nullptr; }; TEST_F(ut_SettingsContainer, containerProperties) { QQmlListReference rootGroups(target, "groups"); ASSERT_EQ(rootGroups.count(), 2); ASSERT_EQ(target->groupList().size(), 3); ASSERT_TRUE(target->navigationTitle()); ASSERT_TRUE(target->contentTitle()); ASSERT_TRUE(target->contentBackground()); ASSERT_TRUE(target->contentModel()); ASSERT_TRUE(target->navigationModel()); auto groups = target->groupList(); auto it1 = std::find_if(groups.begin(), groups.end(), [this](const SettingsGroup *group) { return group->key() == "key-group1"; }); ASSERT_TRUE(it1 != groups.end()); } TEST_F(ut_SettingsContainer, containerContentModel) { SettingsContentModel *contentModel = target->contentModel(); ASSERT_TRUE(contentModel); ASSERT_TRUE(contentModel->isValid()); ASSERT_EQ(contentModel->count(), 3); QQmlListReference groups(target, "groups"); SettingsGroup *group1 = qobject_cast(groups.at(0)); ASSERT_EQ(contentModel->contentBackgroundByGroup(group1), target->contentBackground()); SettingsGroup *group2 = qobject_cast(groups.at(1)); ASSERT_NE(contentModel->contentBackgroundByGroup(group2), target->contentBackground()); } TEST_F(ut_SettingsContainer, containerNavigationModel) { SettingsNavigationModel *model = target->navigationModel(); ASSERT_TRUE(model); ASSERT_TRUE(model->isValid()); ASSERT_EQ(model->count(), 3); } TEST_F(ut_SettingsContainer, groupProperties) { QQmlListReference groups(target, "groups"); SettingsGroup *group1 = qobject_cast(groups.at(0)); ASSERT_TRUE(group1); EXPECT_EQ(group1->name(), "group1"); ASSERT_EQ(group1->level(), 0); QQmlListReference children(group1, "children"); EXPECT_EQ(children.count(), 1); QQmlListReference options(group1, "options"); ASSERT_EQ(options.count(), 2); } TEST_F(ut_SettingsContainer, optionProperties) { QQmlListReference groups(target, "groups"); SettingsGroup *group1 = qobject_cast(groups.at(0)); ASSERT_TRUE(group1); QQmlListReference options(group1, "options"); SettingsOption *option1 = qobject_cast(options.at(0)); ASSERT_TRUE(option1); EXPECT_EQ(option1->key(), "key-option1"); EXPECT_EQ(option1->name(), "option1"); ASSERT_TRUE(option1->delegate()); } TEST_F(ut_SettingsContainer, groupVislble) { QQmlListReference groups(target, "groups"); SettingsGroup *group1 = qobject_cast(groups.at(0)); ASSERT_TRUE(group1); QQmlListReference children(group1, "children"); SettingsGroup *group11 = qobject_cast(children.at(0)); ASSERT_TRUE(group11); ASSERT_EQ(target->groupVisible("key-group1"), true); ASSERT_EQ(group11->visible(), true); target->setGroupVisible("key-group1", false); ASSERT_EQ(target->groupVisible("key-group1"), false); ASSERT_EQ(group11->visible(), false); } class ut_SettingsContainerView : public ::testing::Test { public: virtual void SetUp() { ASSERT_TRUE(helper.load("qrc:/qml/SettingsContainer_View.qml")); target = helper.object; QQmlListReference groups(target, "groups"); group1 = qobject_cast(groups.at(0)); ASSERT_TRUE(group1); QQmlListReference options(group1, "options"); option1 = qobject_cast(options.at(0)); ASSERT_TRUE(option1); } ControlHelper helper; SettingsContainer *target = nullptr; SettingsGroup *group1 = nullptr; SettingsOption *option1 = nullptr; }; TEST_F(ut_SettingsContainerView, navigationGroupAttached) { SettingsNavigationModel *model = target->navigationModel(); ASSERT_TRUE(model); auto object1 = model->object(0, QQmlIncubator::Synchronous); ASSERT_TRUE(object1); auto attached1 = qobject_cast(qmlAttachedPropertiesObject(object1, false)); ASSERT_TRUE(attached1); ASSERT_EQ(attached1, group1); } TEST_F(ut_SettingsContainerView, contentObject) { SettingsContentModel *model = target->contentModel(); ASSERT_TRUE(model); auto object1 = model->object(0, QQmlIncubator::Synchronous); ASSERT_TRUE(object1); } dtkdeclarative-5.7.12/tests/ut_dsoftwareroundedimagenode.cpp000066400000000000000000000027531476226662700244330ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include "dsoftwareroundedimagenode_p.h" DQUICK_USE_NAMESPACE class DSoftwareRoundedImageNodeItem : public QQuickItem { public: DSoftwareRoundedImageNodeItem() : texture(TestUtil::simpleTexture(Qt::blue)) { setFlag(ItemHasContents, true); } protected: QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override { DSoftwareRoundedImageNode *node = static_cast(oldNode); if (!node) node = new DSoftwareRoundedImageNode(this); node->setTexture(texture); node->setSourceRect(QRectF(0, 0, 10.0, 10.0)); node->setRadius(16); node->setRect(QRectF(QPointF(20, 20), QSize(150, 150))); node->setSmooth(true); return node; } QSGTexture *texture = nullptr; }; TEST(ut_DSoftwareRoundedImageNode, properties) { TEST_NOTSOFTWARE_SKIP(); TestUtil::registerType("DSoftwareRoundedImageNodeItem"); QuickViewHelper<> helper("qrc:/qml/DSoftwareRoundedImageNodeItem.qml"); ASSERT_TRUE(helper.object); QImage img = helper.view->grabWindow(); // in Corner ASSERT_EQ(img.pixelColor(QPoint(20, 22)), Qt::red); // in RoundedNode ASSERT_EQ(img.pixelColor(QPoint(100, 100)), Qt::blue); } dtkdeclarative-5.7.12/tests/ut_dtkdeclatative_qmls.cpp000066400000000000000000000142551476226662700232270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include class ut_dtkDeclarativeQmls : public ::testing::TestWithParam { public: static std::list qmls() { return std::list{ "SearchEdit.qml", "LineEdit.qml", // "ControlBackground.qml", // don't expose "PasswordEdit.qml", "ButtonBox.qml", "FloatingButton.qml", "IconButton.qml", "RecommandButton.qml", "ToolButton.qml", "WarningButton.qml", "FocusBoxBorder.qml", "CicleSpreadAnimation.qml", "TitleBar.qml", "DialogTitleBar.qml", "WindowButton.qml", "WindowButtonGroup.qml", "DialogWindow.qml", "AboutDialog.qml", "HelpAction.qml", "AboutAction.qml", "QuitAction.qml", "ThemeMenu.qml", "RectangularShadow.qml", "AlertToolTip.qml", "FlowStyle.qml", "Button.qml", "Control.qml", "PlusMinusSpinBox.qml", // "EditPanel.qml", // don't expose "TextArea.qml", "TextField.qml", "SpinBox.qml", // "SpinBoxIndicator.qml", // don't expose "ApplicationWindow.qml", "BoxShadow.qml", "FloatingPanel.qml", "FloatingMessage.qml", "Menu.qml", "MenuItem.qml", "MenuSeparator.qml", "HighlightPanel.qml", "ArrowListView.qml", "ScrollIndicator.qml", "StyledBehindWindowBlur.qml", "Popup.qml", "PopupWindow.qml", "Switch.qml", "Slider.qml", // "SliderHandle.qml", // don't expose "ScrollBar.qml", "ComboBox.qml", "ActionButton.qml", "ItemDelegate.qml", "CheckDelegate.qml", "TipsSlider.qml", "SliderTipItem.qml", "BoxInsetShadow.qml", "CheckBox.qml", "IpV4LineEdit.qml", "OutsideBoxBorder.qml", "InsideBoxBorder.qml", "SortFilterModel.qml", // "ArrowShapePopupWindow.qml", // don't expose // "StyledArrowShapeWindow.qml", // error "ArrowShapePopup.qml", "Action.qml", "ActionGroup.qml", "Label.qml", "Container.qml", "ButtonGroup.qml", "ScrollView.qml", "MenuBar.qml", "AbstractButton.qml", "TabBar.qml", "SwipeDelegate.qml", "SwipeView.qml", "Drawer.qml", "Dial.qml", "Dialog.qml", "DelayButton.qml", "RoundButton.qml", "RadioButton.qml", "ToolTip.qml", "DialogButtonBox.qml", "Frame.qml", "GroupBox.qml", "PageIndicator.qml", "StackView.qml", "BusyIndicator.qml", "ProgressBar.qml", "BoxPanel.qml", "Pane.qml", "KeySequenceEdit.qml", "ButtonIndicator.qml", "EmbeddedProgressBar.qml", "WaterProgressBar.qml", // "PlaceholderText.qml" // don't expose }; } ControlHelper<> helper; }; class ut_dtkDeclarativeQmlPrivates : public ut_dtkDeclarativeQmls { public: static std::list qmls() { return std::list{ // "ProgressBarImpl.qml", // don't expose // "ProgressBarPanel.qml", // don't expose // "ColorOverlay.qml", // don't expose // "SoftwareColorOverlay.qml", // don't expose // "ArrowListViewButton.qml", // don't expose "ButtonPanel.qml", // "KeySequenceLabel.qml" // don't expose }; } }; class ut_dtkDeclarativeQmlSettings : public ut_dtkDeclarativeQmls { public: static std::list qmls() { return std::list{ "SettingsDialog.qml", "OptionDelegate.qml", "CheckBox.qml", "LineEdit.qml", "ComboBox.qml", "NavigationTitle.qml", "ContentTitle.qml", "ContentBackground.qml" }; } }; TEST_P(ut_dtkDeclarativeQmls, load) { QString path = QString::fromStdString(GetParam()); QString qmlType = path.chopped(4); const QString data(QString(u8R"( import QtQuick.Window 2.11 import org.deepin.dtk 1.0 as D Window { D.%1 { } })").arg(qmlType)); EXPECT_TRUE(helper.setData(data.toLocal8Bit())); } INSTANTIATE_TEST_SUITE_P(loadQml, ut_dtkDeclarativeQmls, ::testing::ValuesIn(ut_dtkDeclarativeQmls::qmls())); TEST_P(ut_dtkDeclarativeQmlPrivates, load) { QString path = QString::fromStdString(GetParam()); QString qmlType = path.chopped(4); const QString data(QString(u8R"( import QtQuick.Window 2.11 import org.deepin.dtk.private 1.0 as P Window { P.%1 { } })").arg(qmlType)); EXPECT_TRUE(helper.setData(data.toLocal8Bit())); } INSTANTIATE_TEST_SUITE_P(load, ut_dtkDeclarativeQmlPrivates, ::testing::ValuesIn(ut_dtkDeclarativeQmlPrivates::qmls())); TEST_P(ut_dtkDeclarativeQmlSettings, load) { QString path = QString::fromStdString(GetParam()); QString qmlType = path.chopped(4); const QString data(QString(u8R"( import QtQuick.Window 2.11 import org.deepin.dtk.settings 1.0 as Settings Window { Settings.%1 { } })").arg(qmlType)); EXPECT_TRUE(helper.setData(data.toLocal8Bit())); } INSTANTIATE_TEST_SUITE_P(load, ut_dtkDeclarativeQmlSettings, ::testing::ValuesIn(ut_dtkDeclarativeQmlSettings::qmls())); dtkdeclarative-5.7.12/tests/ut_keysequencelistener.cpp000066400000000000000000000034221476226662700232640ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include #include "dquickkeylistener_p.h" DQUICK_USE_NAMESPACE TEST(ut_DQuickKeyListener, properties) { DQuickKeyListener target; QScopedPointer control(new QQuickItem); QSignalSpy targetSpy(&target, SIGNAL(targetChanged())); target.setTarget(control.data()); ASSERT_EQ(target.target(), control.data()); EXPECT_EQ(targetSpy.count(), 1); const QStringList keys{"Alt", "Ctrl"}; target.setKeys(keys); EXPECT_EQ(target.keys(), keys); ASSERT_TRUE(QMetaObject::invokeMethod(&target, "clearKeys")); EXPECT_TRUE(target.keys().isEmpty()); target.setMaxKeyCount(5); EXPECT_EQ(target.maxKeyCount(), 5); } TEST(ut_DQuickKeyListener, keyEvent) { TEST_OFFSCREEN_SKIP(); QuickViewHelper<> helper("qrc:/qml/KeySequenceEdit.qml"); ASSERT_TRUE(helper.object); EXPECT_EQ(helper.object->property("keys").toStringList(), QStringList({"CTRL", "SHIFT"})); auto listener = helper.object->findChild(QString(), Qt::FindDirectChildrenOnly); ASSERT_TRUE(listener); helper.requestActivate(); helper.object->forceActiveFocus(); ASSERT_TRUE(helper.object->hasFocus()); QSignalSpy listenerSpy(listener, SIGNAL(keysChanged())); QTest::keyClick(helper.object->window(), Qt::Key_Tab, Qt::ShiftModifier); ASSERT_EQ(listenerSpy.count(), 2); EXPECT_EQ(listener->keys().size(), 2); EXPECT_TRUE(listener->keys().contains("Shift")); EXPECT_TRUE(listener->keys().contains("Tab")); EXPECT_EQ(helper.object->property("keys").toStringList(), listener->keys()); } dtkdeclarative-5.7.12/tests/ut_thememenu.cpp000066400000000000000000000020631476226662700211640ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include DGUI_USE_NAMESPACE class ut_ThemeMenu : public ::testing::Test { public: }; TEST_F(ut_ThemeMenu, checkedWithThemeType) { ControlHelper<> root("qrc:/qml/CustomThemeMenu.qml"); ASSERT_TRUE(root.object); QQuickItem *action = nullptr; { ThemeTypeGuard themeGurad(DGuiApplicationHelper::LightType); Q_UNUSED(themeGurad); QMetaObject::invokeMethod(root.object, "itemAt", Q_RETURN_ARG(QQuickItem*, action), Q_ARG(int, 0)); ASSERT_TRUE(action); ASSERT_EQ(action->property("checked").toBool(), true); } { ThemeTypeGuard themeGurad(DGuiApplicationHelper::UnknownType); Q_UNUSED(themeGurad); QMetaObject::invokeMethod(root.object, "itemAt", Q_RETURN_ARG(QQuickItem*, action), Q_ARG(int, 2)); ASSERT_EQ(action->property("checked").toBool(), true); } } dtkdeclarative-5.7.12/tests/ut_waterprogressbar.cpp000066400000000000000000000051771476226662700226020ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include #include #include "dquickwaterprogressattribute_p.h" DQUICK_USE_NAMESPACE TEST(ut_DQuickWaterProgressAttribute, properties) { QScopedPointer water(new QQuickItem); water->setSize(QSize(100, 100)); water->setProperty("value", 10); DQuickWaterProgressAttribute attr; auto attrPops = attr.pops(); EXPECT_GE(attrPops.count(&attrPops), 3); attr.setWaterProgress(water.data()); ASSERT_EQ(attr.waterProgress(), water.data()); attr.setFrontXOffset(10); ASSERT_EQ(attr.frontXOffset(), 10); attr.setImageWidth(100); ASSERT_EQ(attr.imageWidth(), 100); attr.setImageHeight(100); ASSERT_EQ(attr.imageHeight(), 100); WaterPopAttribute *pop = attrPops.at(&attrPops, 0); ASSERT_TRUE(pop); EXPECT_LT(pop->sizeRatio(), 1.0); EXPECT_LT(pop->width(), water->width()); EXPECT_LT(pop->height(), water->height()); const auto popX = pop->x(); const auto popY = pop->y(); const auto popYOffset = pop->yOffset(); attr.setRunning(true); ASSERT_EQ(attr.running(), true); // trigger and process `timeout` for DQuickWaterProgressAttribute's timer. auto timer = attr.findChild(); ASSERT_TRUE(timer); // receive `timeout` signal. QSignalSpy spy(timer, SIGNAL(timeout())); EXPECT_TRUE(QTest::qWaitFor([this, &spy]() { return spy.count() == 1; })); EXPECT_NE(popX, pop->x()); EXPECT_NE(popY, pop->y()); EXPECT_NE(popYOffset, pop->yOffset()); attr.setRunning(false); ASSERT_EQ(attr.running(), false); } TEST(ut_DQuickWaterProgressBar, waterProgressBar) { ControlHelper<> root("qrc:/qml/WaterProgressBar.qml"); ASSERT_TRUE(root.object); EXPECT_EQ(root.object->property("value"), 20); EXPECT_EQ(root.object->property("running"), true); auto attr = root.object->findChild(); ASSERT_TRUE(attr); auto attrPops = attr->pops(); ASSERT_GE(attrPops.count(&attrPops), 1); WaterPopAttribute *pop = attrPops.at(&attrPops, 0); const auto popX = pop->x(); root.object->setProperty("running", false); // stop update QTest::qWait(50); auto timer = attr->findChild(); ASSERT_TRUE(timer); // don't receive `timeout` signal. QSignalSpy spy(timer, SIGNAL(timeout())); EXPECT_TRUE(QTest::qWaitFor([this, &spy]() { return spy.count() <= 0; })); ASSERT_EQ(popX, pop->x()); } dtkdeclarative-5.7.12/tests/ut_windowbuttongroup.cpp000066400000000000000000000036311476226662700230170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include "test_helper.hpp" #include #include #include #include #include DQUICK_USE_NAMESPACE class ut_WindowButtonGroup : public ::testing::Test { public: }; TEST_F(ut_WindowButtonGroup, windowFlags) { ControlHelper helper("qrc:/qml/WindowButtonGroup.qml"); ASSERT_TRUE(helper.object); QQuickItem *minimizeBtn = helper.object->findChild("minimizeBtn"); ASSERT_FALSE(minimizeBtn->property("hasWindowFlag").toBool()); QQuickItem *maxOrWindedBtn = helper.object->findChild("maxOrWindedBtn"); ASSERT_TRUE(maxOrWindedBtn->property("hasWindowFlag").toBool()); QQuickItem *closeBtn = helper.object->findChild("closeBtn"); ASSERT_TRUE(closeBtn->property("hasWindowFlag").toBool()); } TEST_F(ut_WindowButtonGroup, maxOrWinded) { ControlHelper helper("qrc:/qml/WindowButtonGroup.qml"); ASSERT_TRUE(helper.object); helper.requestExposed(); auto dwAttached = qobject_cast(qmlAttachedPropertiesObject(helper.object, false)); ASSERT_TRUE(dwAttached); if(!dwAttached->property("enabled").toBool()) GTEST_SKIP(); auto content = qvariant_cast(helper.object->property("group")); QSignalSpy maxOrWindedSpy(content, SIGNAL(maxOrWinded())); QQuickItem *maxOrWindedBtn = helper.object->findChild("maxOrWindedBtn"); ASSERT_TRUE(maxOrWindedBtn->isVisible()); QTest::mouseClick(helper.object, Qt::LeftButton, Qt::KeyboardModifiers(), maxOrWindedBtn->mapToItem(helper.object->contentItem(), QPoint(10, 10)).toPoint()); ASSERT_TRUE(QTest::qWaitFor([&maxOrWindedSpy]() { return maxOrWindedSpy.count() >= 1; })); } dtkdeclarative-5.7.12/toolGenerate/000077500000000000000000000000001476226662700172465ustar00rootroot00000000000000dtkdeclarative-5.7.12/toolGenerate/dconfig2cpp/000077500000000000000000000000001476226662700214445ustar00rootroot00000000000000dtkdeclarative-5.7.12/toolGenerate/dconfig2cpp/dconf-example_meta.hpp000066400000000000000000000175561476226662700257230ustar00rootroot00000000000000/** * This file is generated by dconfig2cpp. * Command line arguments: ./dconfig2cpp -p ./dtkdeclarative/toolGenerate/dconfig2cpp ./dtkdeclarative/tests/data/dconf-example.meta.json * Generation time: 2025-01-14T10:55:01 * JSON file version: 1.0 * * WARNING: DO NOT MODIFY THIS FILE MANUALLY. * If you need to change the content, please modify the dconfig2cpp tool. */ #ifndef DCONF-EXAMPLE_META_H #define DCONF-EXAMPLE_META_H #include #include #include #include #include #include class dconf-example_meta : public QObject { Q_OBJECT Q_PROPERTY(QString key2 READ key2 WRITE setKey2 NOTIFY key2Changed) Q_PROPERTY(QString key3 READ key3 WRITE setKey3 NOTIFY key3Changed) public: explicit dconf-example_meta(QThread *thread, const QString &appId, const QString &name, const QString &subpath, QObject *parent = nullptr) : QObject(parent) { if (!thread->isRunning()) { qWarning() << QStringLiteral("Warning: The provided thread is not running."); } Q_ASSERT(QThread::currentThread() != thread); auto worker = new QObject(); worker->moveToThread(thread); QMetaObject::invokeMethod(worker, [=]() { auto config = DTK_CORE_NAMESPACE::DConfig::create(appId, name, subpath, nullptr); if (!config) { qWarning() << QStringLiteral("Failed to create DConfig instance."); worker->deleteLater(); return; } config->moveToThread(QThread::currentThread()); initialize(config); worker->deleteLater(); }); } explicit dconf-example_meta(QThread *thread, DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &appId, const QString &name, const QString &subpath, QObject *parent = nullptr) : QObject(parent) { if (!thread->isRunning()) { qWarning() << QStringLiteral("Warning: The provided thread is not running."); } Q_ASSERT(QThread::currentThread() != thread); auto worker = new QObject(); worker->moveToThread(thread); QMetaObject::invokeMethod(worker, [=]() { auto config = DTK_CORE_NAMESPACE::DConfig::create(backend, appId, name, subpath, nullptr); if (!config) { qWarning() << QStringLiteral("Failed to create DConfig instance."); worker->deleteLater(); return; } config->moveToThread(QThread::currentThread()); initialize(config); worker->deleteLater(); }); } explicit dconf-example_meta(QThread *thread, const QString &name, const QString &subpath, QObject *parent = nullptr) : QObject(parent) { if (!thread->isRunning()) { qWarning() << QStringLiteral("Warning: The provided thread is not running."); } Q_ASSERT(QThread::currentThread() != thread); auto worker = new QObject(); worker->moveToThread(thread); QMetaObject::invokeMethod(worker, [=]() { auto config = DTK_CORE_NAMESPACE::DConfig::create(name, subpath, nullptr); if (!config) { qWarning() << QStringLiteral("Failed to create DConfig instance."); worker->deleteLater(); return; } config->moveToThread(QThread::currentThread()); initialize(config); worker->deleteLater(); }); } explicit dconf-example_meta(QThread *thread, DTK_CORE_NAMESPACE::DConfigBackend *backend, const QString &name, const QString &subpath, QObject *parent = nullptr) : QObject(parent) { if (!thread->isRunning()) { qWarning() << QStringLiteral("Warning: The provided thread is not running."); } Q_ASSERT(QThread::currentThread() != thread); auto worker = new QObject(); worker->moveToThread(thread); QMetaObject::invokeMethod(worker, [=]() { auto config = DTK_CORE_NAMESPACE::DConfig::create(backend, name, subpath, nullptr); if (!config) { qWarning() << QStringLiteral("Failed to create DConfig instance."); worker->deleteLater(); return; } config->moveToThread(QThread::currentThread()); initialize(config); worker->deleteLater(); }); } ~dconf-example_meta() { if (m_config.loadRelaxed()) { m_config.loadRelaxed()->deleteLater(); } } QString key2() const { return p_key2; } void setKey2(const QString &value) { auto oldValue = p_key2; p_key2 = value; markPropertySet(0); if (auto config = m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [this, value]() { m_config.loadRelaxed()->setValue(QStringLiteral("key2"), value); }); } if (p_key2 != oldValue) { Q_EMIT key2Changed(); } } QString key3() const { return p_key3; } void setKey3(const QString &value) { auto oldValue = p_key3; p_key3 = value; markPropertySet(1); if (auto config = m_config.loadRelaxed()) { QMetaObject::invokeMethod(config, [this, value]() { m_config.loadRelaxed()->setValue(QStringLiteral("key3"), value); }); } if (p_key3 != oldValue) { Q_EMIT key3Changed(); } } Q_SIGNALS: void key2Changed(); void key3Changed(); private: void initialize(DTK_CORE_NAMESPACE::DConfig *config) { Q_ASSERT(!m_config.loadRelaxed()); m_config.storeRelaxed(config); if (testPropertySet(0)) { config->setValue(QStringLiteral("key2"), QVariant::fromValue(p_key2)); } else { updateValue(QStringLiteral("key2"), QVariant::fromValue(p_key2)); } if (testPropertySet(1)) { config->setValue(QStringLiteral("key3"), QVariant::fromValue(p_key3)); } else { updateValue(QStringLiteral("key3"), QVariant::fromValue(p_key3)); } connect(config, &DTK_CORE_NAMESPACE::DConfig::valueChanged, this, [this](const QString &key) { updateValue(key); }, Qt::DirectConnection); } void updateValue(const QString &key, const QVariant &fallback = QVariant()) { Q_ASSERT(QThread::currentThread() == m_config.loadRelaxed()->thread()); const QVariant &value = m_config.loadRelaxed()->value(key, fallback); if (key == QStringLiteral("key2")) { auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue]() { if (p_key2 != newValue) { p_key2 = newValue; Q_EMIT key2Changed(); } }); return; } if (key == QStringLiteral("key3")) { auto newValue = qvariant_cast(value); QMetaObject::invokeMethod(this, [this, newValue]() { if (p_key3 != newValue) { p_key3 = newValue; Q_EMIT key3Changed(); } }); return; } } inline void markPropertySet(const int index) { if (index < 32) { m_propertySetStatus0.fetchAndOrOrdered(1 << (index - 0)); return; } Q_UNREACHABLE(); } inline bool testPropertySet(const int index) const { if (index < 32) { return (m_propertySetStatus0.loadRelaxed() & (1 << (index - 0))); } Q_UNREACHABLE(); } QAtomicPointer m_config = nullptr; QString p_key2 { QStringLiteral("key2") }; QString p_key3 { QStringLiteral("application") }; QAtomicInteger m_propertySetStatus0 = 0; }; #endif // DCONF-EXAMPLE_META_H

`%31Y6Fӟ뗄 ̍.,p %wXaIKWtuba`:x>ujI2߾EנI ןA1xL?ħ߼9!Y/:<.$C5/';Wap<t~msvZާlA= V8$PĹ ʉ_'^*gҁieHL:#8@=>_yW0nNG|Y/$\|cRžru&NfslC񽣣 Li cA(N&b|Ή}N@j ;\@99lDqiB\éyd6(xM ikޗ؂##]dJv.}^b9fƅ\/au<ɹ_(*3'!d9#CqfW iC‹ ,d z{G-x^m훕C7W0!  E+l'=kA6 &eUp۾%6BgWȟv^7C"X_^^`OQpC_ܾ t 4#t[F8L‡vMa+6e N*+$ef֛7'd,;9x=xx=xO7}/~=_Lݴϧ?q+k_C6@$d x?2SU5h^n ж=`O0Is lS9 7EIjsq9nF&$4S M)K&y,=EXH)᜶we϶K(o %u aQVA+jS& o8hQl|65pљ:m >eضi˫X Ɓ .J#m:䂤V 4+r'Ǿ9mZg%?}奿L~sşOꪎ׆s},1d)@=;GGߜv.p_.&8vxf Y [PI:*G[}AnFnJJn!^+b3A2]lb TL)dLNҥą=Va9.Q嫰];/]{k ҿkkZVV\nX}GZmiC_ {&.,\ WH̀7 |Jb $2|Ŝqn.#YBi^ʒpy(Ն_sP<ؚ% \G8E-/z e]Uҍ".pbBK|bf8.4V7Y^~~޼0hv~nޚiR0V[̪q8p\зTA辷k߶EםqQMB(H l-54/{6_r Os^̷^_,,O~WF`sJ:?)~'ܛHaޚNyD#D Z lY($'kq8i^Mk3SaY tM6GM/iU-3^$Au',$>_:72F b7+PdF^[4^섞g|n&r{m|[[$OWP.ANz81>9H|>h[&Ј|:`K?7:H 4m@i@|\=h Z]zYm&M \ 29a%}d_S4C@A.*ŠLLr/"6;y#9;TC>v0d@.rs/ v*'2&@ )yqɨv"G\}3aPSWb$+뵭 Q\ڲl\=fAS.֮bni؅LD]Mz1t]>d\ɫQ "V P>IrnЪ c sk6^m[bcؔv62I0Npx/k^16{ŸF!3/qٽUJ4O>;:Ə W ,!_QD*)S~n+!%0S7 tI/.ʠf~csvLP6*_1Ʀ<(X p)K\ DZ޴%>ύUzڔrmc:&9FOQsj*$V:Dop/*$Oa3/Jf }]xEf``th/c Si89R(,`R/mƫ9 hV6qSVAPZ'$PA2eU 06ZH5+_\r :pӿ[ox+ ı6Y:ꤽ?N\gU}]I [[VxQyDZ}z}˰JQR 6&>)ܰ M~ӾL0A}poY P+-!Ҙo+`Ta(#߷\$((4{طN3PG׆z{ oxXzNMg߭(.KsؿO ܪyx"ǟ5[[:/ͽױ[-©jn`K3$r#C7Oh[v,ɇL.@ hYd.-lsd& .46ZsK* gIO]0ʹ} iv6 h}o]2#:;b rNkI-9;mSaO ֩En ˚J!;K͗ﯛm:^>>S&{L+pCn&d_{C}!;AnkvdꓱwkMv*B}?۠eƏ>`gx|؇ `!n,w'܌ٳO or>X9#Cޙ+y`xCFY6px5O([sp'd>X!Y0εuG'ccfer>yYa[=wsFЭ۲UZ7}yst}u?t7_z|%U(R@oQp0d&;~IN:(Wj!Cm14\Ό;Q NN}}@4 ۍ3)_q \Sr̝&Sʎ-}fd$) +&gj'mUA|#Ο2܉,mc#zI0H$;0H8 ⸪Ahf8F$Ho-aQ^tBI*_'LٲA' wD17gi~ `+尉iLӕOܰ"QM *q"-m:$j`YC_Bc]|墑6Q$m,2C/C/D h ^9 hd4&8oSZGŌi+{^;W]Hm˔;vj/&8y:'"D\=bAa 6ubc/ 2fҘ Jl .{$.#wQ+VvM`31C?!VFz/ILPHGGǜ|j6}rVf'voXwGO;t{}ZL8FR':ymNX3Lryq6K+oH\і&4=c]2soN{;~g/_R`C@O۹&$}ၡ>AL'#\'ʑ lߴ0ͽ Z)Osp(;4Ib" f% ql dsTξ2D#IH=}DϻLKg˖se0IlYKkBmflx}%`<(ChCBٛτr /)F戤4*%2&UXH> NeZP~e#hj}M91䮴: 8u΍-B,ZSV &3.Y54rn;'|ubozKC?Ǧw֕oC5em'N [jCC)CQ)70P4#CN|W9D/{: =O6ͣ@Լp*DZt&t/QKU6oa[kP\7Qtx$4;A 6bgrN2rK$:$yDcPN][2HAm-ID)ѽYgJ,/o>Y}l~׷Ŀ:{H ##mHKƗaVƃ CSِ3 r\7O: .h31v1?8֨cI}8w}W^ٴj˜`-G3ޟK-tf>8>~p?|#:e<)/N!]J=ULS&Q'-, ;H]KOSh9۴>-Āj`J-AK#15{4&)k.w r&OH) efR?CC6L.LYkMu*֭yzHBy_63q$\/Ǻq%4++p9 x]{Eؾ`˿K\=*KI 3#URU ϙ.9Z>oMUi 89ʽ(ن­t2X}7u Om*xKJ0 Q2'ʫn);]VsN(kwa^uϡ~s6ceZv3}X3ԯpMb?~1="Z>9<{T;}KjQ~ ~Ako@e>kg[?ڝ~J<_2]Î~2Ob.#?d>A̝\?jUg4 f"4xmy|pژ?7/ [.[L}k=a֏7[s_+lӂgdhO'+VpLH21p#:њdt>38 Z+We9LVGu e1z TgrBz#u4#i1WY5,\)=rNƗzɑm Uh<ZXym݁]j䠤&PfBw['y}݉ * J8hahTD9ID vIr0chi$3` Om 2•0L8G>\T7ā̼]!E;d+H+KV`qzm֯qpNI4b$6d * 9zv&8G2 D=lSR)jk'GHf 1YUNaV` 0o}5aO$.6ȓ,|t$A7 Ġ:%!Y3i;(&Y-ľOm~S%P4t>A#萾ʟ&18wH{3ċ6 xu=r6x ~$8 C@#`! N07:Oړ6RH^ ˜c]^&4NJ35}WE/ίS8/|뿚?Nw^>ۙf_=٨T% ݕ/glՍg@2Ho|Y_|/hbvG1ؠrdo `,L~#-ŝ 󂵭*X^ CFGuI1 is(/gG+UR(Y\9 AƁah!)2y=^eh#~^ۥ\7m/oKd/*O;pZͫx?~J7x}qMv=N}бV!$Ho̭KIM.e񲓝q{\OgQzI_įMG{x%qAEެƸ6-THeǎ|5U<}Kذ;^ƕja3,$Wp)ti"A_?(o<,ՏL1{AE@eG5ɃQ3b^#ẽcM=^fyx,}T!DK+?sdI7Ϧט&`'^Ӎދ,*E4DRlg}G. xfS~ 8Gl:(*1h(Lqۑ#*ۣ#<2?И_.,s m(r &JhE.{/>t4.E²M!k?0j[PGe"+觍SeOER7z XQ\z<a5/r]~i`IZ2Y~P2Ƶ-|tS6(OXqie8uW]9(pm*u\bL=vv'yS?xSWǑei6W-W rTϨ[bӪY'yl=piW.|ڏ:7qj.^3ե7[Fr KYҲTU)^Fwѝee,sז4=ڴm.(6QP& MvA)Y-lJi?=vk:*mv]ŚTҺ9-;ΉFq7oŵ@"=x.8=|6w)mwwk|ǞYsGQ:T?V{%>>܏~zTwK,Q~>2czs\z?gy_|;}UΕT<:q>2̼7g8S}ĩ +Cٛ0*{Ĉx q,L)84+#sdc9_)_~2 Y9Iӟ/ 9#)tMWi}w1Ǎw~^~ܲ }u퓰8jьk&/βI N(f2Azo)JROi]&L yW7ħ"t}U;TWXp"4 , >oa?̜k2`^98 L`L@Q{ÀI~t vRU@&}`ɜ#I&y htOM034` >„#crAi;USW؋sL c_@2+&cAd;(ySmbT( |Am9+B(W[)+O/z.^ ־pU"#7'LLQ64c'6ͅΤ d0*O_>$pp;\څ/2khYB&^lkz9a;ğLv6/c}ާ[Y6C dy-O_0$;k=g pssJ,!zɛޛ~G~g77}Ϳ~ޟL{\!>p@{Qm %d%Nn lT[Xpic -:aip a tdTd  u&;錏2M it7$h-)>w']|ՏNsLE޲As.|fAzr]譬Eбɡ#\O8 OeH^ aq3)C U2o`{2gѾfe mcVvUF}:qgمJF~&i[EW(m:.."ctS6Wɧk|݂zj{p1{>r?"r2ζ2_m[Oj~)dNcSG6寶ʾ+uͤmܱ[WoIrdx1ؗ,}IOYݪ\;Ч#&oքd oy?Vmlʕi[{~K$>"]{T6W7ۿl,T2ie;uYXQ u^v{=W7UbVH x-K;k?.o~b@4/_LÏ c\ݤ_za^%7 [bi"&'|>w= *_m6WҜ$DmBMI >u|"_׎$þeg"uh?1mb_# {ߐw|OϿ9ݯ>~M:ço\AcŠ?L~d /+mm1ZpuBk;&= 2i޴oWpDMh 偭gsd_!~J"I[|5{Mu`]fM$}}^,&IE2EJ!dFI)"(%b0 fӕU~sțuivTEq~Nw7<5lM]W9+ޚش1?V&ި,n7N7nwOɷuO*#mcY࣯}ګbte)C⩳t\o򳉧1_ oMo }m!:C6e{k}R\{[FyȮlX,k7^qO>`gHNg}~6+>y.q=Im趱m`ߵG5=H/l yLN*Ҽ9En,X0ks <&09.s\qA?>K||ε9j!xyw91g$v}X][Xg珮 PsVbn@oP?oŕ p"d3T/M<g0tnԱ)  CT`2h ^I_pxEXmXl߮n t[\N- 2Ư''}ᄮg(1 [V_6"`x*g^Հp]D?NH2'u+C5*[++Kt*p  SNp˳24>ԯۇ`pAOՃr =JIy`gc fq̽EA`[Aԇ4{s0b +A/{ܻx] DWO'LoQSdx2Egm`UN k'\)Jyp>K_VXܐGDp~bn_vс'۾V+b XGT[r})625&)I^D>[Y(YFQq-GzE#`_mx,(-pjFZ{UӼ֧yYe!.Lɏ#ݎ%eoq[OюLp+iSG\}I}9Ih߬,I[+I! .al".PQ-X;i]& _`eKٶ$U-ATy=DdE_O6sVUx]!`Y>TٌUV|L؆ytřrx $K҃:\MbZƭ:_l:\9.!^юpXC#0ñbEWY4ײq#;h󚂴SS,ۺ%t5N;K8:ئ{cv`dfiUi|1 ZLƏqKO{W?X_ n HWuɻ5}K:=Hڠ9um7WS<2Nw}V|<"9KqS|MU5 !8Z L%֬s- WwnjUW&غ=CU)'M|ȼ!?Z(-$s-5o6 4 反!S^-(:Ü3z'wc(^ؙy*ުX?9f9,\) /ևrN)-qj( p| p#aIA=qGH{Üq^ޝw_/leVn&rVr ~;SS 8Yhh'5p'MF\S~G M;˗/q;iЄLNY^}yt2]ؙf0!KYÆ0:QܺΞ,͠,oÌn:Jo7OGeKͤ5w ǼA% _agf O; 6Q?:"A.s{㽃[8 -NT~eqSnmC88r:t~\}@;t[1@IDAT8\+0 ^N\SvtW8F3 m"l{A@wE ^q9i+_ ΘxO 2*Gqz5!PA,Dǹ 4p9z}넸 qCPK$h%4ޱ7q5Du'?o[az2D. 1 6vEg<8^˿8U*KyN?@ѭp 0'm'QtaF^|i`58ck96<:I~y#5npKiIAW[ ݺ=l#V+.E\ ' (Wdd|dhNX< 0pX%q@-i[B:9QW][3.nVj9:Y|u?Gp9\g>l7'/.N@~edEvUnԮg4`8(EfeL{ `,u 2.bO7PR4H4WGf!nc3ˢk,1׼Oix4.3OyXʡ5_S߾w8Hq/am]ʟvP#eXqQV@ iT@͞f)iRg:Q~>(e{eN$MF7wS6-Un :𨳜QlmڤJ':jv& 2J#:bx [*kW 5nxPJ^خj~pj Gwe; m<+#c_.5,3~p; c>a@YUGy&en)Qv;(6c@C230^SBn.2I٢;62FFR3<dDs6ق/eonݢh{R|Si2l`5Y{}vsAO/HF}_pBX/'7;~{PWL;Nj?t~EE~q&J.bKtÞà - FɈKdw:_*8\ShǶIyDG ZWu@.a=t3d@Q7d'v^|CV*=07ލ{ aZ |OĹL $ +J^G,Oڔxcrۆ?J KSMPTiz;;Ա3 F:V0_'c/Dvn31ގxt{H05PW dw X22_Xq6H6~KGu^[ۜakS`º)H\?Q.˪~D+GRD~64K~戦7?&7ۆ6qo!\ =my[2>)m龟;x- ?ol!>ϦgqXuOxyy+&]ܯ}ο6SqCPƾ}V}XV#S129}K[q}~_Oq w3wK Tuq~(!ojyN>w qQׇSc>ԱeΝ8|~0̸P9~BӺdAF}y9O>4 g<9ʭc6}:ӛS:M^q/w0d4&N<AN"Qdi\-8:tݧÈoޙDtRήsIl-A).;9[AN1~o1nob p@/ "Y0/41b 7PCz+dntdrO: F ~ON"|Ee=0OAJh:y^pѮH Cթ+$8|t#\ 1{>PwwWhn;,v/v=Q'N\(rdA!? 犲h˗_Gig[``[\pGљlMt&ɀDR 7[AG*; 2<sEDžAjK>q0FG8m`RX܇ 8h;>p0Yye1pVAXA t7t\;!4-Nu\OC zG+w 'ۄYMw%mqGe]iD4_ƢFJ[lӭZtB/OsƸmCƧ;`@dq,ſ|sViGڢ%#_\7M\;lQ$cvF#pGݜb/H[徜`UߎR'U=a;ȉ:@d,Gr$m*OZE*[Ѭ,8w~msV+̶ܳ?%N\mCj\X8`3aH0B \V> b!Q>J^e@ԝmm(_ C7]Mk#<\rGPWikfr-9~G($b-O:Lϸ36x!+1^ɷ6Y\*WetYUp2.i~TR ڷ @~ICG.2|_̾Nnh_cFmh{5уhW秶{ziƊ=/XՋc_!FL,u{`&Wh+ge1F bGnb UNK 8ni:;vS-7-`/됶ߥ~`~Nc!S]Jz ߻Yvu˸'N14y8aRujIAR-2)Wߛקㄧڈ0VGHϠ; PW:j;@ڣqAXQ }OJ@$0:(76Dktмn+cg E`zI]. 6ck&+9vX*mq#Ilo)SKCN|T<5w_OhI_-Mgz%oG4E\ϐޖ6|-luhkXАʺ*hxn=W~k=bnc87T0Y66߱Ϗm' u^!ڗo[֏Z/a֫klǘ?Zc٦1e|خ) l.~?4~jL1/Br,!8A?-S6ff^9Wugw$Jk8k8"~(-yd0/0&9 w?JϧG9ikuh8QVnM]X6Oo7←k6N?\N#NbۗA|wv HGQ @ƁO' ;qSf`\br⻍w^)N_~9@`vVn@7вN($a+?TSr3GI_`HE3 oRhS6szoB']?G?acg4Cf~TEU /2%b*' _]xPjVO}z;:Rj8('>+8|eޤR@[eU"gAuh H?|(٨u䈪&/lgi̧ZKM||:CH 0|ծW˱}M<$L8PmY|T #g@nLK2q 7vLeOt2ԅB,V/;w逤8N W}v KS^uhqշ a;%@dS鰬E[VdλtҖKy(kd\Y1дRoj,/h̀i6ҴIȡkCc,jYRW;!_Ƃ:ôI/!$:DWJ;>?y-1m9w[|?> T83Z&ЅvoF{h'WuI02gG}\rߊBFwx6GV}G%mdWμp9֫u_UO6~hG[~[ZFh_: ޺Q nOb ;E-Ѣ[ =Ɵ2m?.<|jYޗmzU?w껋f%0'wh#}ת6i'/ڟ!x9I崼vByS#MeyS#J9)6?e l5Ά[^<븇"^FHc"1kX;&Mg.-o_Sb^.=]cYq` XޯGH!d]:!Ѧ .٣Ni 4k)ZG9Jeiޭx,hsL,w󱒻RӲOy41-㪼3?uS۸Q7vJO8n cNGcifԻec7cf MZo<kz8>D!=1/6.GczNW x/?ܘӀ;s@޳]wy(]c+=3BҞUO$홵= hwEijm߁T;`Qok"Oʟbm-:e(1ⱲMz~M/p r9}?fw^@c>Bj.6|LPW̝XWoQN)ת?V?s?M,M8ߗLdC۩k®w`PH<҅U xq/wmퟚU4?Ƽm u,7ݛק|v&`2 {LJ:!!cne\uȠXNbƗF֙Y&VNYNW!W6^ǁ|6N巗_wn` ͎k Wp:w fW5‰Sd:_2l/M2qNGs_]Σ УÞi-qP?78z Ni +Chxw1ڠW:aPD.:c'mLs5p4l|5JBIyWn⤲@6'Ym^U8mcU4JGMZڐQ8cG9P )kMNӧ$dy#p%+h."&^*7C'>UNZD}9_">(SG byCk|vSTOF(j̧ 8| +)TƄ*#8'$܈A p{ !mukr%}E§le4i>^ jq9/X)F.?/xvL_{M}^x1|,TMu!y ^+,#C[ՕmKYɤE;'ǩ#fD|49'=S.!}+_ c`F:JG/J Hr/۾]rhJBfƉLAqPKgjD6X]Dh)x 2q o6tRZBOZAp'HU|&yfC]ʸ@GƽT0[<+jTUr7qLL@K0mR9 6g-H$=#+QwĨ\vQ m>[lW=)Y'?$8Cnp]O` k#=}z8m`AeA"6",D7Lq%@>SWGNj.kMyd йJ|v *^x=9 О]I,3^~l^ǐZPEX4%xb<:y,eז#=[0{Š(C>#y57| XQ~ s<9sJ jm1O~/w|{a]ut?¾I7ޙH};mnǮc<޼>5}C`!L'u:ƍqc/ ^PN߫33Ih\AUjN|UvF:%AWGơ '*0@V[zCxWZG9dp xUx֑@c +@89T~yx y =FL:N E"4H+2zƑ&x?t@.uYAWxJmPByvZqO.` CYzss@4 Lncp *Ӗd4r6&ޠ&}SYpG.$YApeYOVdhwd/-[ۉ6VgG0 {WC1[7rgD+;/ @yH^1[^ŗq}GK,u@}YcgaVKDz|驼Ly 0 4yKt㝲ay뇹ۺ* s[e+~x6Q>d [gj%$O mSѧ:5= u >q.'RxU<§KVWh_=0PIq.'+M'u|Liş+)~XItYx@lm'rz.Jlᩞ9}mec4l_3rm\TRi`;˜ 12.a׳ Phr96b8"x cz|̓٣hΟtM Ӟ!}X&;T0yoM+,g׽5{]W[m ?3:ҞUO$홵= hwEiji\}dxeokw>TSb夎9Ydޟ)9yq8G <<Uԝw13f11eD~yC0I_9-Wg9w}\k1ot>vM)w& 8/ujN n`p %N]N.Dxe6 kt٦(q2I\CCǖc|i1г*^B6؞ínB e9%W:hDOO(]}=i<cxz /\_|Pz_upFH=Z\+m!C:mߒXIC ʸfS5m(6H񲑉ihiOFp`_8n/xl}–-_|2C|M-^/'iWX '} pd 08} \>_ŋZů_W/q|ߧ!Q 6!ZND͵#]t~e8zڡ@/ZCWEO&(bDA􂎴!Ř7%hWW9 B+NyݶӐT7DWj<ҔC7oҁPzg5BڦQ.eᅲ-b;q3wsQ/<9ö\i?0(>0caO@AՉ/Tc/Ρ];43x xs_ڲO4I.GG/R:Љ7qO6T A>n˿|3>maޡ}CW1š<1m,.ld4UzrxgU>mH{8iwndO;eng=_H4[蓀}T [b8 w$5joVQy<ԋ%JQs>`f,4 v]4_y*6v8.1Ц.:tT1rPB9}2`+Oz_xʶEvkj3J&ir:ˀF:w0G]L`E >^jd3Ed/-/:@IeGuvx{#8mk]%NnXL1-མwA%WyFbo!@6^㰤A EX_َc )V ~oWnz- -C'>r?"}kM8&=1%fLLˍc?#u`N5-Nw ŀᇬ$;~UΛޤ-Ń׮}nj!G)Ϧ#(*\JOW8+tKZpSaiӦ3V:33݌i%&;.iCq#<Ɏ,̯lgn1>)s9B$pB׳ #n˸_aZ< #ȋe|ӈtO2N/dcaڵ4]4pUx3ds:c[Je#?ǭ'B9dɽ@2:xL#ƴlv1Z'5,s^go[wCZR5:՗׀f7Or`E}#iM|^bsA~9<ךqVo{?E{=̬Iw oCYWmCVk:+Xl?3#~6L_Ux612e}LTsC͡p|?5x7u\ syK.%%}sNj ƀs'N!/YQ<`ӿksi?s`N9]ȫ5__ 7; Pv=`^y+}%G_߭Q}RnHǼm u,7ݛקđnq '"IӀrNڑ, ttT'_е۹8u ^_Eq ZIU2pg%'q">m*_ǸY81~Ϊ:o+ڋN3 =&ज़MyO:r :xtGxR?:.D8)Ƣ,L5m^rQL`˺9S%OW?7P"A3C^ NWQ℮.E<D7N9i/ 'y·JNNC!~t pKvq%ہy.xm0܊; nr wӕ!QA ~UDS(훕PO0𮼐U`3lBZInѵ[(QWIcTSfe|_#49vY0X" =I@ c1ԁltBON%O"" 1(h8>t5 xqA`~l}|ɋɬ lG҄Z6sukdVD/_ O7ΰ Qp\kOm~A}7w}T3Cmw+/9+vč_ˉvE]`δtzj /.~/~{?\}׿(ͪ΀ v 'l`: WȢ3:[àL_(o}kWYGoPp6G'-@,-gc,Za/q[|UXwS0 - xG~]rqTzՔK f3K\]I3q+ωr1C3Q9,Lr33V;;j mX|^=u(֩ @ #Wjפ0ݾ   Cg^%ߦk,Fۋ"kk >%k]wE~$& XK~]zנP%hEh 2>\-H Ru'£.&7ߒvC}ġkYNrʁb˷M:'4ڊGJn ;r ]gd%ViሾǑEǁUА";F3y Yh7'_H"9x1Ms>3JAg-o6g 1Ѐeom=Vc'O<C=RȠ dMQ+lI,2je#~Xm]/0I°zU%WKm&r)'2d7E& Y'9sPEy.ܫEF)+Ԩ[wsO =SVSe/ kj,XmV8 Ock^9Ut'~Ƽx{(D7^ *籚Ө vm@ eQ?i 5EޣiO2 uW2.W2v8:V2nU{Nפ*^blJե]^t =xuS勇HMpW-<ޤU6S:Z\A1e,/͵;/My#ZW^bu 3ezM|C|m {`!>!P4x9@IDATձm'CFuEFWDX"dœ8 'A 8w$qQ @`0283X5%]VCqҗ]`heʁ {Cݡ_%l(. jN]M2L^jV.,=Wۀ^wGgA;jn%rL`:jhm_'<=3dq<_*?%խRb XX~ )Wp_8voWN ~^jGY c[[PaWx]%B;rUe1©ty]ڸ E^&|ɶ*ΓK<ܱyh_t!O.nRڶl:j`8:NAZXtA>w驫Iqhs8|}:x(5UD]i7vmm~u*+d;&Y 9g 1/雯mP*nqsܒ ٩ '>_^L&obß?owedc1aҰ'-~,~[g/MhgTFj P ۤe*:P7ʇ$Fg?)Ӱ|xKc^n4#ormH9J\`-@}^zdȀv͂sOg0%NƷ$NrwNyߠɢG&wo= sTa8(DG?.&W#D N%xJW%Ƚ#лKYŵl?c2]&,2&s^7'&uXʒÍX8Ǣ7JM] tz#b[-Ǎݧ= rWu׋Qx 0 ֟dfmO¿+-0xWlrdvY7$1&M`FY>6)?C7Uێ?¿϶o􂬿?!sQ7s̯·yK3_a'#Jb w߾[a#x?ڒMt?vM)s& '_1)ztfcN\jN# c;&']"8_?# cm0;HAGq'Ԑ ] _Uy;8tݢ !o8^pnG:eqtd@ $p 0%x]¯zcWgg63ۅPVy0/8?+ u8$ ^ 8tї_V3{yrO^M&Q| a0@C'6,(:?Ӡ z.\HN@⠩cM灎fU\DPjĉlft껂xMfm+[STgAqAϠZoY]V= Vb"FEx?OBg>g=,Ƀ_L4#9a4h>Xldյ rN%0ԉ|\\x8;G _Gq6 '0ˌ`Q4qLή AmlFc ѷrSL,>tȉ88܆HG[ SZKT+Thfu Y/ڜ[8~o/H"+_ڶM q^u> )/rfUG)qSD\̠cO2a,U0w qCqlB^+ȶ)W[Sj/_|'_s zCei/͞IGk'W 'm髑MZ< YQER|GžZǴvWЭxϪr#'&VHQ"+a­>_ Z 2J9ƲD9ٯ@!0X7+R4y6Xɋ}a=:UԌsY- SٰKCJv[p$KS6WNT+On-Z2XW08jhSuV @؅ñ7*?8NkE$ 26F[Zс4fmNh۶R͑{,~muLV+ØD(r1c7\0ű{ƹ=L.%dԳ-^}j7жMO5: )vG7:)vh?9퀎<#Au,Qbt|V[Ϻn>v9Ve%zWyv[Lza⨋CD=^m=[{M( QW?D;$,6}!ЩgB$mlaSz}6u,(O/C2P>`5*(:oyF_lc|: x}w[/h8o[݃A=:>I#kq:KyHM` ؄@ʦIQw/ iq|nS+'ga\|-N|Q2WMAw~k]̾q%̗QOGWٌkz^<_?>Uy^S.I\I|ln}R)yzHra+>_%;V>($k(c$Kn<ԛG_+Һo.:!)K 2Vog8'uͯ:xUxXOG\[Q^\k͉UJMCrkk e̱9Di65;6l`Uz<JGl_yѴ:(  TOI6jT~̞[TCQa4~:u/o?ʤ~#1k)8+6 ǪtZK0Uz 2k&U pl o+nW ^:݄&$ӤN_PYQzBjyjW[B ˢNǀ9sf)s^Y` -'Il7Cy#;kZNKsme qu&: 6J!^Qߛћ4>6)?C7Uێ?¿϶r.~̯\_] (k书0Λ;ks5pm鏳sUӜ>A^2HWJ׏۶nV߇BQ|S8suO?.`ʭc6}:ӛS:M^?dQ(iCga8Yy+[R0&&OؖcNa?2xU \V'P%s/m fwEt"` Ab'Z:Q8kY_c:qSt6;Tʽ Nڱ0/Lgxr1_Ź"ioHMиdB~rAƇ8tE mCPH&\N'ϟe[td%PvObn5WF U5<@4ggh ݞJgaЉo2*h{]s[8ePY: l!/( ZɀMP)mU [NED CElOWO~kv#Y"|.-C?-XXE>}HPl_J2W16>kI%6+Y`Z'5@Aj-s' 69[ȇ:74_xD ɬZq@&s;a9_ 'e>5osxG[DsI+اp=1z70ѯqNi`%LJ=q^->qs޾*Ƞ@٧GH bH؀d+ɫ) :p2aw/۷]Ӆrбr/qkxr|{zD mK]Tvt no :ysEc۴ . x<?#H_.G7XWsd& 3`;6k@N<`54czeeyS;'4Ez&=4ؤvQ%eL@CxCX4bж?Ml$s{ZqŧRgu%_ᬣ.R8|81ȗgy!AoU>4}3Sb*9Piϕ_8nл[_x+HQyՙ䪛Ȉ!S[ gh k# y*KSmC]ţ5lWq[.Љ/*wŎOg逓)إ33y :āSl1*w|48..}ԕPλ[u=cS~ Mt_rн#xgpVG]N7\2"FZGq*紃8o}:J`P3L9ſC'xG6Qd&r/1,rP U+l`點pZU,+e!ڔBъSKeڱyGc(6'9 RQwg|t%;Ԯ]-* n_~|AΞʁw߹5x͗e3F A|ǩM,wC͟F|Ost QOyξܮZ[Aᶏ+O6. ~y)8FmAȋ2U'T'x])3lGpTwч6j96HHeaP|ˀub7*"Mñ2pˣTPjpW|/w?_ˋcx:=lԣjVW+Tx]XvF*ƩY:'pkZ3TRysҦۑOiΖ0ttZ6ķH.v^\ 1]NpKv0V@.=>gEdQ%~ v;]#K1x/o3QO'7gB}Y#Hbab]mwB__mh&pm%svs3H]tuOG¬^рK_X-\56ܥxW 9Er:>]~A ͱE=`_$ɧw?_=>+ p078 й}Kqu`gLЮٛ3)k}:p .'>Tk|0'>&%}qZOPbQS_< xJ1ʾ22&,rx* HW+qRfWmEbVhP5cг8KOD~шʢ/= \-Y+,UkT+UBXJBۡ`~o/}h\ź/zaGcMcNX4Zm`G=m2ڣ|9|xOP ɛcJP 7bL5͙z tdmQKFy>Qu{|Oy w ˞չ7oe=P3玵gvTemR잸12? Ω~B#jKT@^CsNWw,{8:>nȐl)AOĔ4ջ|&;Fc}O]wZ^*HL,Bi1}62Ǭ$?70ıdXXpʯ8\M{mgZ+ڇ=B=i/mkmyEƹV' j]!⭞\l"|Rpʇj ivA`ՃeŻvR1dc_q<ނqRz#gsbx%X(7Q缷-ald.zEPئ]QLl[-l,ǩ9{V7kC8fGT6S1kNn^{ل+ d)Ewu19iŽ:Xj+InǪOv\8ϳ߲=˒$9cG0۠sX~+ƶ*=o'?UWbY3OP^W;%{kzs:=µ|}#ҪkhlAt ZdqOjjf\f]f-k7˜r{WFXo{e$:o~]?+lZUh זsCѽzgc^yv3}Uζ"y߶)n#/sZss{yCp*=c/o#/:F'vm8G>=p%˜Ʋʛ7f<׹K٧{> /1/=s% kΉy!|LΗXV+*b~QyE9nKYz^qF4ݢD]LƗd;O,盘ᾏvN2$Wڜr+P>྿ocF~slI\m ~pȭx? g}uc) i?;? > /-Aڬ2AD:]&J wB[e3n=c4ﹸMD@.+|@" 6yNEVO0,!~sk}}*UI0Ģ7ȅ!@$GTϕo0'4xm :W.WU7`+_/ GBM8QPVX1;KlgBv'&m<&) H[p9-criI0}|&ed;'nܯi: aEsVO~Ï~@c]jxў ! 8/9ėTi4BMo %5?b  cgcG/0#'žBkEJ PABzBfaS/W_]Of3$ Y~ Wuޒ= 3rњC&[S־O(4)¶Z݀ WHyR3C#s?'e, KǗnG( RP,ͪ*vzo{Çv]Wc2&MX|[\Z#>qr~p yϩ^e,ozc㆞x"ILґ\;hls+znCycRjN{t:>jekwOepi;66tz1>)aC}C}m&'QFS 7Osbٺ]bR'5^t~ꄈGѥ4B ;,4 e%_<`Xi[M&0¸eמ;^cS 糄&eq*g' i#> ~dsnZ-YZ^e( e},A9*P9-NѸ iݚ\K֔O Ԡ>>:$9/~dvjyjX)rMr%s!^mnScohuo7+=<:,+>|UoӥO}o2,a_oTdkevVܫ\S=HOEOɷ2#"Zm:}goo ꈸo>>\3gĵ7,ț1|}&+]ԄoFfg%9L:9|s7+/'εYfx,L2 -ەQ I"w_咁LpN^{Y@B@dd P^jWqu] \!$g_L: j5hP] g`KR3}e W8d@v黊gu]\YDRjFD6|Lk,t}Ş`?}R'Q8vv#%DWq#x>R? !:'bd՟67d4䖋 ,4ٗM0\'3^`ACڹTp)o_)+y{#_5b0I54NPd|G 6ee+|1_y !a=Wp2`+o ::ȣ;:P/`BJ0C=ºTPl2 mܨ1 b 2jIJWVa2TGJ}gUAhC\]c<}(JuM Uy.=W1%2ecFwl#5~ߟ/|_O⋃ vn 7cb5품p_ɤ~OIqU_V] Zzc x',A6`+_T,T\1Hr/d#7M :3pJ}߱!sk'qf&/6i†^׬1#לp*J (DJ>#)JV O)+ؒGA6qzʙmT Ki[{C5^u.{#x7x/1$]ޫVv|լS})vr DʽnY }EXឺd)мCtdGTK{!WYoIo^F{O[weB!y({8 l[duN #3YשaK9uewkK%p!>h$k]jLbmqJi@g&^@X4촧_%Zk^>^[ ]yȗ/믫Ÿv7[ne;V|-;eKZ%%*DO&{i$ڂǯq V):G aܴa6N-B{LB}{̱腛YfO’:2iVInfm22ٚ/j pK}n3XNw,V$5;9O[4Lfl2Jeog9>}O>qÍ*N &[&e,k Bn5>oG`c*x_*`VCX8-_L­ox,[|v='9b۪-&(BsS\w Xm+lp2+m7usޟ$"ާa7K5=-7V{6)÷I :t`ՕBqǕ}u*77Z֯OgI݈spOoSCStm s%7k~n%so|mcz.)mvWv.~{:n\hz;ӂI1F䫰jqn2<2|NJν{|=W_”eܹ6ʌ; $C} .8gWS:d+t7+lhn5)D❖=a7uuG'a?OLp氞s҄IF&!2YYHߜd$'H8A]'2Gy'v0&$(Nz:~apO#\'5k&4>.-I<53j@ĉs"h:`=8D q"6r`p;#dN $>.Iayᙁ8m]NbcnIP8EWp ȷ68'h;Wu$w:dPZc#VI&X~w$Gv^mIr_BSejI2w  ( Kl1 ĔC깫HT6ztSi+W\2ʏlf0?f%}A=j@׬Ni'<}C0I r ':b@6v y~uoNJi] xB<~+\怋 &$}"~j,>bI/" @$ M?@W!/yBݛZa^R O[W8=INEbЧƪ?zGsn>O~MI#_~黶-s5 i 0PrL?kzq ^ 20@G&Ɣt[;>t4^M>fD¨F?V{1 c$"X]̑)S{ŧ?ⳟw߽FWhҷt[9a}ōtr? |k'q}Umr]acN-MBMuّ!݋W`_H<8o<D~I=ۏk,DH#8S^9"ICTJFB|¼F!P[Ƴa5:|dL{'NO,EʒȏO}p Se|~&]9{hԀht.uMCc[F[pS8Tr /GDl{q| Xl@04q!ѥ6F+&x I;fuH<,r˫]÷/U;u*L*9F?a* 9ǀh[(ܒ*5HCoEx.J'QeRP]8d-IWZfn]#hZ5Pk_dal8@ #+$q}:@8x A7,^.oXm눮q ~i撁UGrud/%dzR@i]MT𫍓|B\ Fs%ܙxtH kPGn ^6=Gzo&CH/kk\җ/5͕H)+xS!OBGƆ+C?}rNj$yxW %~hv_75U|-~x>-T7ܗ:ſ7$ <W(5WzIn~i[O;&F#G}v‘dy^[g婣i?C;/yՇv#t(V,]R|6o^Ȣ_mkF+~gGqٺX~z_0W K<Oe‚nEUI}W~^7̈mUyV?ؙ{l~Gn'e疭lͻmm?l#)ݻX^l lKن"aD8Jt\a~㜎* cG2-B5&M9sO>{ꟽլdWd) i?;?oW$l'cTO*L@dMqe&:"xj#xM(C6tWR6 8'q pr|DAy0ɪ0h@IDAT;YY>~RJd2kI_aʼn)L3pzLs Y  78 :O;0'o!(sV3I(pI]3ԽI&D7Y|YT9Gy@; 3mY9ⵝ9_ ` bnl dEbIq:z9^<&:3}<;F&NÇvNCi\q6KOC:?! OȣsvuzŦ8L*T}0 ^!c`( F3D_ܜAV8!9E1pIO>òCWrlC`o|yvx6dl£]/fŗNj_h->.^\c%To_=n”z[xV? VIhM Wxa%`f 7t8WxJMJR4M_J7x$s8y!5Mlڈ/Q㛼*ND'mچ]e%KT -:Ҷm'*sS6q*b]Mp^2Dŷn)Yd*9ԩr4SN`A{AYx%P>\*Y%X~칾G; 61x]hb-[_`ֶ:-V|p!CSl0cu*O#ٹNH O _h_۹aԉUvw4T_s`pl:ʗI*ld ˰)HbK`#Gm\[Q475h~ICm缍{᤼qLuز|ۈ!{?v_<f dv"[PjCp-;< Ae}1sZOiSΧ|.ҧub]ũ ?&-wToN6+oS{ N:]|c[mu(T:ƶum2}5(p ͘W2~bƒr+䷓sY0nνqb;9$[ۇq>8Gf3KL֟y>b lvGBǃY&ݜ~_]acܳvxE6CHeO9nMixݹe>./zDf0W* <6RV}N@ŽѨĦ?-h`":28'4i`w&S@ &5ھv jw@i^8qJE +3[pL&%_Ьtc oQF>*#&q0p9:AI~%5w&- i ˤ:[zw_Mʣ j NDd7[-93Hf+%!'4lR _0A@ FWBO皕68^X$_ls08!q0Iq^ LFpuB%I.aOKZ޶ 0x@E_7Ie]-BIRow` ϕN^`sIFn^/-π|幯3W%Ii$x`xfP6G\n KC}Dr\ۄ®J&O]+RE>z+OT]˔+C .I2@daO >9xӪРI<ǡ W'+¥L~-ϩ\G9ܬ扖Nq)C٢MPNY]J3z?Y|%|`;etL Cj¢g}GɤuTArDQ9RWf{SRG/WB}ޛ*֦nwG_]r w|p$BJ׮ic^r+jddOЙk8;whU2->n^$GZ أ[G#AYN-%˯5wȠ'ݥ+EЧC&p}C@n^'!ͭ8ԯ@nv_n/+j4 \`7?teuۯ [s"ޡ뭩]_~?zo94v"[o *{oÏzJ|u>q#jg |qadoi韪msx N:O}4| .Keh[?ʜ|ע|8ccf>2w4jf2Ś>\ke.y˜3z,'k21bls> U|~G=5XI? 5{7j))c5) i?;?*}%lLK89i0NQ$9N%IKod8P uz$z'ft"}}u1J0 CY1{>|U@eB oDq0,0,oPS|tGn#&nȯ/.y' }u$NvF#P;A&a qu-=WȤtѝ$t.]iEN(;a,%1b)rRO O9iVsjJ 2qDVeX0U'I%` A|i n (*t)ΕZ@Jz8L 2c?w}-Aax]_㡿ɳADOJK\5`.~z}/)*3Q 擋gHdFep.QuB ?777&&/dg $D?7.uyKϪcQ+$D4ŗ`QBy?%D)o vSzΏ\*ox^աz5.}WPoW#'X:pzAR;w\dx-|9tAks!@1895Xyj"u):>9BKn.uX`u-;'] y/tb?w?ZB<^![@mڎT>S셤\ԓ18Vplf f<"4NpNJ(G0qha oAh;@A+;5J?D(FY~=9z]Hm +v2(T>wHȋePԟ\Y09q?Gn\[V*Ajv/$6vW)F{Bx|tu4<َxLj$X^nPI6LJp:tlcc؂7FA:^b73]Gi["[ʐ7-ˮش@쵋9}M @YFB3l]+0ڔkkP)~ЅK?M|9C%TJ4' QR@0:[s>ڶZ:y66Y9U ڥB8?%_|q}ԓPjR~{.]^h>^ͻe~ιg(YoHP>k?bJbF$Vhe@;%c!⁺F=1˻T8}v>0C]fm &EcYTu꣟4.2NlP8 N2U2y*'{T}bgҮjaï mu_cm뙰UgV]_cA9cDz^^-73.WiȽusϦ88/ &FQS\Tk黭ۋo]"3Dp먓-m+e|)s5l X+)B˂N&Egq x[?U g&y"gC}=@v; m}ݶ]>ݗoh}>&U| 9'~B^L9 .!6YuKWmv%%i+GΘ4h}+|#6u# =6 M!]ۦ4ִAV|C*ύTy6#wJt55z^fvoxz][6EYԨQpC~޻aWέ]0漌r3 @eo`+&%b Ը18xj, ^TK|Gr¼26RVRNu7Acɓf;Un8ۄ_7ҧ۴) i?;?6_~U*4>N<( .DO#kW^pfD' `_;ۊ h:It Rt _#pjO2(38m:&0dt&Æ^A!t:y-gFTlT/xdwRL@MzODs>Ǯ%ho7QA<8MbqـUM;'g:$ c  OMB7 rū!ӓL,gAN):="SG\# fbIL;YMۊEh9U8 PZѻOqj O gVDPLN; quW3OhڍCX2 ( g@M *!ڸJkomdb}y|bYق0A8CD E x |U* 0 }*trvix9n#2\5TH?Z' MZql,{t|^cko6Q|+vDC<+c+h:Bό||K~mvp&y@nqI-AǯG&Aӄu_IjD{o6lIlxXcyO^,?Nj?Y|_~..v\ `R,i A`+7u2qXh;FwܐYA)C5M;՜vsv@>c߳ |RaU* @V$, >V:P>=wt %[ ^ϒ |D`CV;^ZQ4ͺjTҨ$+}fF]>]xtLW!1}:+c?e9xŲR?u#eMQP>(GE_^iB*$kq$u6۵i:~Ïl.ݧl!%9-R^e̊ $*ˠ8*&pXvJxĝPkO*C`4Q ZO'qeW5X.7ѓ-^}syFHUo͏:) ̏~go3vԠu=ؠurA\|䂺5r5G:.E_w eU)/R!ju1[}y ۝IsT4νZuHaے)iC&eeV.5Z}VlQH|;+VJ= iw|5؂Qy՝j ~/+Z[ғ16q>VqյICZnb(;nZծYZaHUkx5%sTp3{m[gw쇒vV|4vʕ )X͸MZ[U*V^oNBh€pMxSbi.}| t-{%<(XG*|r^XFmN1H3Y4lHf2p f b[pX`Ce_щCHjmV Qw:i|ӝX{w"b@Y݄O+<|ջnu V1^zeXqGh`VIimsuE-:FH˰_Y)ݵ(ug[LPw, V>^u{sgQBUƆMMZk Py['[ԺT99S~jW鹜nsuWDS_s:&l}}|k^Xm6!?hE)׳ӫ^8\McƦ=k#(_|</+W6]72;S?>pI،gpŘcƕ|`f9O秼Gt1a%sa!`{8dߑ؈MuJk3,wZ`&;gk~ӷ sr^n=a7uuG L8}/SNL&(@@zR7‚(XE+ d'B7Îf'໫7fW 8Q)'_3_D+GP]@y3JId;ne}{_xLƀ\8Y`P '3>W(f =N*|^]%)AڮҬU7| s >&SI@'tI?k0[KVYѽ\ 58# bGQѷʳ=He`kVxi`JAoV|4,=X kKmc՟Yt3MIWyU Y'7ssLvPa26' '?m73pΟvV t(hˋ$p.ֽAiÕQ i?$i'QxWw0IH("*\\Qurv M;0r&rxq ?&ibt-$<__ ]^\-Oxtp]=|ZU{資JJJ z:` J > 8dϪW{<\49zx=ZY^]Rl?7ce[}W\P`Ɓ]"%moNO3S[ies׽ >,/'7.aWPf2BreIF}~_vGn/:t=>_~Oů{n2T6eC*`;J:NĻ=N *6-dc S"SR=V hMGn3-',mSf@S|&[6ErQ g}n#/SyXBc,iEВGǭcǔ)pzƩ3ϖ2z%tOS„g دp}FQ0Zk-O|S/y'?JrU*.іŐgX<ׂÒ5H$6/lW8}IaГ7YMdqmvGM_)uY=-ֽ㘼I3zetz7 _^ uB[:i%)C-Un^D{ 啁%}S]֏RX"~yP4ԫapSJ&\*Zǟ? gr\񚭮ޜX5H[^~ەZ?)u4SI(Dicz/{Ro .U.I ZV#%'dsP.YM wRui8z&W[V8ڷIG@Ui+) P D+; )Y˱<k,W]=M| \5o*z6TuT2u3苽96D@%>a{`jگ-qڃ^s.S#fQ[脺9 Ma$CQk48R|syQ0/=aʲ,[w}j݆MҞ_mm6e`omo[۷B>ί[#sezf>;6L{>SMzŸ'?E_6goOM7=UӶ;U?o]4,y\&wy]qMsRߺǃ} f.ĸs7 *:\s'd(s'̵xғ?';oʉy:{i8s8"ι4DQjfxz?E;-{qnO-s_= \@n>8Av2y%IV;1}HJt,.x!z&+X!ՄwAdƧ`3MP2yMAE!o`$`+JbOUBqX _SVɌbu$)?r&m*f'y ;ٺ3oyrPV;5%B6e52 'h0JYld`>#S=/?Yi */YbCGU48x,>eOπG$6Ň9ihfN h@G_0XjYcOzZmЁvEqZ]M$9.}k[}^'|S 8=i9bGNUJд R @/U&!87b/AJ O*m $A9\1|![@>7 OѪs־cuۧGǯ(Sw}‡~QDNKyY}2{8_27?=t_ǥ3l~t\Qf|5Or>K{a+[<,~WN>X\/nX}_{! G|Op95tkj'P8ӔA/7V}J>ͫoqS,Jv"ui {fQYl G>p3+CVOuzYX1eT.8W-kb7|(&P%A YȃʒV uapf;.@.ѫb  EC[fU+Y)|zBqxQ`1H۳NOCKkO>8lu`6xoMUlk֠Zr@c|j0_/"W;.d ٬adk~+|ЁO2zYz(/={MOY/_zM^ +:Np+H]|^z[;eOd#Pi|;Ӝ;\# ɟ^Wr?(cmO [ˏK4ޑ䘐:(ғ>Pee ǿeG*}5Ƨ;jpRWNűl]`fO֔)!ʷ $U ?;K^_Uzϥ Sr덶61QC9~vu{,~u!8iop#^'iΫy>EDM`Zz6x:q`>6vNS卻/%爃)-ud{*֎5mmm%ySp|ϣd{^T?x#o[%y[-? z׳G>?>WǑljAoZx2dw!Br&cs}bmzlSx>Sqlu0&JZ8Oh2_~j5 s+)y|ۂ<9gZb%̛oz(o-}4i!WaN%0+E켌8EqN˄WH>jCRm go&lnz[:٧p:OrܰӺswOƻĠOOI\Ne th_ap:vaR3N: ;f\NpND3+O9IħA-Ay~fczyuK`y_!LcvrP9>HeTG7ׄ8`RYI'pZA_Ia{W yietU.kwOZÉ;*;paK߄ Pc'f] bv@u22mW R|ٓ\3& yIOL`2m{U&$̱;fDB_2YCԗ^C0r«FhM08` =A>KI_MO:O&cC* sL Cq66ѶzRW8яf!'Ș|!y_uB$t,IM zzi}ыiM@qo%%#m)n]%eUpN(t90+F<iDz^h c%lDe>Uw 6ΔѺ)PD5ݶΆLw)\O)/TӡI@\h/*Y~7%k;eS_fzm_o8^E&LySP7Ɲc۲ǔM<:'mj,{c׸6JA4Xx O 0|A9& gzcpNuzZZMmmQ687yx$(<#YexNmm lszO8jT@{W l6_Ӽ=Gm<>htё\5)G AWrl`sNo N:5i`AvyUN0Q&ÇcvLt8zdM >/nK df2ry:˫ '3˳$-[fBAŀr: I @fBL&pqҹxix.v u D&$[Lij sj@lK:5ʓW/O Zh]|E5B'Wʫe׬͉jmCi$`҈ 01@<׃0@w(f12r^gI \O:&,/rqy' L'0f$T&P&iI7ȧ5&A=N`P+Y@ D/In@n} _ccyQ:BA8mJf/~&>dE1cPc L18ASV߱"BZ!Ǖ ًf.Rjv8>Ƒ>XS!WwĦv(dah{m2$:PwN]d#q` <q N!7$>?_At^ܓT٫Ⱥ7& "'/N>Y\x|jW5JrnBeޅ«pl W%g8Vj_2b]|A' ' \z@IDATqN?BzI?ǥY?14UzOSQ;pp/h-._,5 3w̳Er ȡrpqZjp?hՁ*5\YY3̖KR5G:,~v|S/GYC ;y);1GSG:o%Uҏre5Zݑ=BzD@0@m}Mq$ƒM~_|x1+y\/ֵ-XE/MԍԱ|/Jmk2w, #oTԱ8*-PJGQbkauN}FtfgsRYA3L=v>(* y_#=5|Zys}p ?8?šmJ(sx-/y2{ʼn8(sW~ /y̸(&)+m1|—R[ CݔMc>`Z`?6ţr{-APK~h,ڗ{'tE[WDȑI^b!0Y7?]9qk R^ghGyС%ԸˬZkO*Q/E6E{?}L↸9, ^%L@>1G-.Z9TrpyM_ wWU90;˦ SW|.\\ncǂAM+{t}D#h[(:jӏK|Z; 1:֕iy8onxk0UYPnkC`oich qEvxNiLpϖ4ѿw}GM+Md+l]3Fj39bQu/\x&ޏS>^|G@ؖuy9* 5ocy)[< սuV8f-Z˒GўCv?tGZ_N_!t.öSXUs7UX0J`t[$MV(~|ۼm{^T+DmsZO=l&?ojkYUh/#C`"*jVFUROoc6m&ϵ0[s\TTLhYT!{[|7/7w5Fs|PۇF{y&dq>+mjJ%1#X\dq!oI3W%lLБq3'ۄoƓZ 0L2)i ^;Y&qz'zu;Y.RwJۉOHNaGU`} I 'g3YNar li$SN2!*L `;I6}+R9 $ExɓPr9'w QYğNΠ+L|r!h įy4HkV@SOOʀ{` 9 vX/WDMhі:3>,}:J'5:RI_#.I>>bǓ 5ԥԸDN']Oȉ=hW -3/C'F|-T֑"ESvwo Z Bk_x51vXxkS 0g]|{ ʧ쾢e_9'e Kxu^I>_R^kqHn11 ΙdGA}ݐ`}tc|/7@sLaRla R2W"쌄= dReV2|>u#JT;/&ٝ]N|^_H8/*K/\I[&rx}@/_š'pyxrzd[ ܹ}cIi.Nru݂;j86A,~k+hN 2io%׼$ꥭRY!9[D2NgCmpVW;J؎4Kk,%'}rG@.]YH#~^Q(x+o|8/}x7x[ͧAWȆ<*[(Uܿ˱6I04+UL]Ew$Qc$^Y`Ði6Y=^W2@<uWh69@ ݨ]Vm!ǭH F'A%|.>?U$"؊R6r06 `fR.³+Pֱ(6 l)t`Cq46"28PkCZoܰy}P% 5fSq"V[8l MmxmEy}`+?K)4 x>hGdr_}R6R h:/ Sj}Xq~NA^>pGʮIcO9K~) C"E'S)ǣx-\!ȟc(0o'8-N [M)(2!xT05ȗE"tkƸ5 ";v+)JB'p ϥT3,e`2 LO{ Z{}9MǨk|% ){b7})Rv{($=']Nw|[==C#g\{(|фHTŗ7{:j <Ox%Ew@^wԣkkYOc-n®1n5 %v ovÁMh~odm.#>C@63gkvVȵmbD9TiM  |a5> Ij76jY=+\ g).u-˲#Y_ o: {}Ѭ\Vdz=+'qz͝mG~OMiچf )ܪWN rIYp> fO<ݫ |[h`x=aͰ?S?m[ y/gJgwU6~w0O-q cX|Kq#sl/Y<1DžHb>܊#煜g9\Kb{)9,O~:ܐsG7h9犼2>潠q"o 0v4pd=N LJrn'ѩ3Iɤ8喅iMgUfW4h5Xz&U]&uÉLQt :HUrhs's3C[|L0$v"ր{ ` "3+9w(O|48p28~20mxr,/rʼn*'cr?] rW`BAO̾zy&XKQ/W9Ud/͢]&aံ X XaTkzWp^)ޮvq:d_V{"F7҄!}yqv׳w  }`[L:%0l.0o].ԧu86Ҿ>Ch/{zkQ>Eż+-@8H9 p5*CUA}ޥerxHPC5q= @/&\DCpϺ2I%Yq OٗW8&( 2񸾔/4DZ>g}_b`~b P_`Z}{3b+QdU!y%p)%%$ݨ 飿O@Iл0zԧ'~kOU0go'‡^.m'{`o0QIw ߽AyMC86{.FOLߦ?q@DysC8c08:->S7&,~O;?^/^2bYiqpEQqB.> JK& fԿ!ǨVA57UP|+Px|8Fڅ M焇lAC?m{S#clciF+[՞Mvrу:(cBAnUn$vʤCXmTl5G0rVbiFMl r39D h,+Z[~IVއ0hpB5>sGPtbFD?Kk,Zuz1ZbMاF.嫏:*xh;r _=.})6 .liAp-2-xbXOV^ʐjIY x})Z~c\/ڇg̥+.>B 8ДMͦn lvx~ČqK&0HSLuxrpa߇`0ǭ(~^q- 8%åzPWSr7R.t;??2{ m$= q bg\l=yٍ.& 0p6s9Wմ2<:C| xui7d:%=1wUgޣ:wZ?\p~`+eƿ۱+MEOɿ3_s;܋" Ha>C~? +,J");{~'g\\鮪̓g˓yNej &Z*zo{tmd)KfS7m~|\/`q-_?;|È' ^J{ld\tu=C}xZ~+\iFL.H{iT.x:w9`p9|!5?WexsLc*MzW]2C6k LJ9rWY&*SVƶ؆&^4Ŋs11ߋMaL;L?OaogW"uN#5= :l OwTG|t' |HXScMJowm' 0Psp ;_|9'a>C}g2SDߝؙq>̟i'r>.3 n_ #. 9=qU3e87jU掀ѷ8ȋs^}g./ `hJi)m^;9jS5) }eMٮ' |T*6D'Mr>G8 R~[؉6~MgPL}g t\u[WPx2!\ !@qgutns9v2=:xBL=V-D:Jt#jF7n\3aL8vtvێTtK &`I%|IWN7>4aI9c-YVϤxtܕ"KE F5Ie$Iwtx˃6G֘#}_P‰b+AXS6ug*lˀ W𳋮NP6pmL/Puwe`6ō lg2ݢE28ŭB ]^XGOg,th8- &x:8:vo 6qfU[H,?V-84zjv>a$ e$Y6 j5 !x~ܪźe?n' ;Ã/z3Am F 9=U{p 7@fC9dd{*/y0pYھ՛]-F9\% LhʾS><:W>#k=7@gV9 @A]ƾT!ڳo0(u!~O)|\N3|>R *31uM'ɇ ʿ3VTΎ] 7Q%aoIY!>`IQ˨s [#FY `"ю2Da ʥ=cYc^ڵ8#?&)kL-sFI}zFgRN:F3QNbj2LAu,$k^ޔI! GnJvآDپ]e|lJAϵ)ʯ^^,GzN엤݈Ѿ`zƹQ%%vH?h3P'8bxS&ɟ|ɣxyL{ws`> a8egiD.6'lKT0#8ڄ؎ H f㨼²щa[gj"us8_,`O}(ikaHjh;G Lp6]hڿp^-Lxv{ٚ0jXz7 U-''َr<fï.~Ș!ck6Gv o~8]i N>9e.(bHl?urȴI}EI]Y#FGW ,_M-@n;f*# \A;'lR&;e9rPwŕTbB͙L+He9!Q4T˴bׇmA1GX=]oF iC\2P.j~mqedklc i"v5/;F0?ˎ˴\8nTV\Wά~~q{!u=O-^B_g0BC1'xė 9neJ"4sTGnTϽ:B%=鵝:r/Gӱ]޴ѹ"Y,}hupp'~Kk}$9]Uf ǩׯ镒8V)XdX|Vӆ8GQ񻷣y5 Uzן0mgcp779rX#iX6[Aĥ?ZO8Գf'ucIx?7\y)K}sѸBs] i=elƅC0!ĵ>aEٜsw=/g2'-}t*pN:/9?|51x s\jpuxʻ4yeuH҈u\g685=Nt:L3bTG=mo8ٔ'+.8NkDoYC!JJ 8*fW \;Îg6FW H2F'r mXTNs6VtD&DtL6ȳ EI\qpH\]Fs36%FCbc =x\R_(ȱO@AF;3 |n?AMV`վEC%0:5#[ [~j%Qe)}dDCl1A/g}x70  97Cu6I·u}hf 8m&J=`qxlb;WJYF]Oщ\i0IpL0)}dKHZ$f9(rP|BCꋞV"@J/B0Ϫ#۸ h_/X7p8hxχ?<[|Oglx@&B3]RjFԿӑ/3z6EeSBIv8^p68s h~Kjy`mReqQ' +$dKptݺ r,)7v" @<; rc?~R!AO˕ERiRh_@hfBK{9-ڶUqz =qi"'Q֩VsܶRK)>|ŲS&X'8]c-en3ީwmsl3z){"4q^u( t8cE #ڈ· (hc"ґ%w:>D!} K?1`S]e/\|s wy2w˾->+7g6gH`Sc0^Idk61ܪO}VXZW( H% AH!6mlqz Ǯc:%/X$3kmUMQ޳҈vDȶP7T%ftț+ycnW/*o 7^[.cWސZFG穟i=łc*΃a^.W+:-*qH c)x 5»b|ӊ@kSh.}m"{f,Q*U82u ^w,Jimu=/–c)L&B[4G2ZMܵ2#g)NyeD1}9JMvU^+UGi%FWv3Jy&w1to0ckdu|fJ\{vok||l*kUE#] M[Џ0=]>ij_z _ykʮ/]>ὗU^bcI_v?yGWvNxyM|j%g6srYe HsUYWOKDWW{\(8CtI?+BmF4#E*|+wx d2$$nt '|]aq0^LX;ٰtAZ0Y'r9x*E耗NMz2ʽA 6x'q:Y!n@ICkM^:r)gA.=3FN9s>N &wqHOYMNԱc4stq>Y'@.(S0addҚb *Hv q+ ҝT.g0,_;=rNr">ҩUG@z3d: Jĸ. iv?M[S5%e"(2)Nh盷L}_Ӥp;Wn̠ d =8Ύ_HҴnwmP4hȌQ]C/dcY'v0WY\:eF77wYϿx0hdU jt&t9,zF38BMʸ u0F&!LGqv>Tu6.WQpUDW.}UGV@w'ؔ%ଚw* ee| >\WxAz7X??y<.a-HkD<%bbhycdGY %`]p{3MZfh#m Ol)h3A9} )\neme_`?6.r0fI77йA8a !vXxʟ}[_'=S^U r[!=- d 0Vfs ˊ?0m?+d]rJۧ~y2P%[(|!M"Ѕ]=C>xEp8ўKVdOqx6tՄpⴤ!@4heQ7Z6Nt`:VdEqd[!b] Q᷄:2CV@Wڼyڊc|@}"ClOWVp9/QЕNXB'A:@SY3F ~; DGK3{̸z(zrg_쮰X@HGȎJ>(mȳJ0CY:aF6SYjyIUA(/g%bLW%ڑuJWBյ "3Xsӯ$sY>cnM\:í?Td؁7vؑ ЙS-dgmtmI%YzCψM4gBѝ|h0n^jֳhmQ}1l!$Zplz -82oy.1+FJ$p_c߶_ 4.<,h7ꯂoSbs>{+ҫ['`-|~?v}^*M1e{ - W<`;Qo ر4˾:v#U*դ[Xuf`|l )j`rx,&]3 L,w)_ UDK.+d>,n緈|>ʲ)6F`X}tvV!5rJhJ+ǰ_G/[u.\6c:*\sٹ^aV%lvyZN`xj,csnC[/ "r~cJ_< &s{M9m?*&L9HsrqDt<q{:US-3&0:iOvbIľe4C)fɡ"ė7u( 'u ax4dV'mq`;鮔xmBYeN\OJ@|ڸKߖmXmMVW8eR7|:pKeKWa/ g1K\ +w#nװ7WWy]Mr‰qu^'3ы:q2 `Y&mzH:#['aAMB Hn !"$љE0=eIJ]R/ctFh綅VP&{qڇmZ+BC٠g j\kFYXu!x@ЗzK]mȧ~5ȚCtuLɓE9vd l6 " 2grfUY!]nuG:(N8)h[.?va_{0w?g?y/a/?_v{kmV3;Kt~:(CFЎ8:<Τ E'qqa''z@m>vil IY\_2z>0x35E { vt) ph m\:}J+,rҮvHD7$LaJz# >%vi7p)$`C[N ~nĐUuCAKH-jt;I\k+98~۪GȓS倆_ [v\23A/U[߲K ox \ha+EG=.c~i#C8>: #75@82(kXW+w^<@w|>|KUe'趌rv|!JEPXǎ@T14CjY*hN.lK ANxU!>kp?>DW(3Og}"krY^÷3>=۴\xMZ[̏SٽVE\PHrg< _yqLsŎCk@AiyS PW# vugJ2%.%Rieo֙v(.>Z 8!#,o{ [#%!Y&c!JQR%|>+||V<)8{I+Ҟ%H8~X]g(4<8FUY)>LuiHakלV#B8 s'۝w9̋AVga*:gw3зwqxZ=ȇ+kN ]v@ܔѡ+Oq0DFuEijT܂"~J N&EGl9NRCHg({LC]8!,ihgh&HTfW0_4:չw@3C[d+l:?|382&9\3ެVԕKxYx' { o[؋_9cFel6iwܟx X7:2YKYcǽG ԛcr?R5"LPF#g̀3gqIlуq&cWfXx68]pu왎 [þm9o5JYC4>]~j7A X.G,¶7%6͟Aȷ'8 C^,\z/W܂M<k(A: mhWR-8f49m9Axٖȷa26g=pe?5g򜥭 qUubc-x[D1%a?bO- ϐ'O{ۣ`&_q"IB*bh;<-o GWbcq, >qByhHX]bН$nQ |dem+Msu֓mit RVmB-\r,IG&j Bo^=;z͠Ed}'\v>{=~ogհog'G3yFÄ\mqB6Y֋oH_92Emha5 'k1I_8)SWR.uQu(_2*'Au,W3 YN,cq:H,-wڥɾ@4A-Kݺ-<}F&PW`-Y"/3E?p ڠgy*n~DͫdnZ Z4%t{)jYOvza:U]frz?e߭sCF L\О9rs۔t/u.<1|Yz,=u[hv\#cz,CqS~o=]z8o2ݔKСn4#rhÍ:MaΎ;~^sSm>yWjb>䫠<0Tuh]o-wxyqsI`eK tw;/˄bw]n=D@Uan?t_mqU4ml[Ӽ~*]u{BUFO*㘤w.z=>yZaXA^ϟ[@IDAT_]JYgkwCn&7{Fj`ߺv{؇Tk-c>=Dk )z6Ën~lNV!?J/U͹S|*e1)uOJ Tݯm`j> xBCqqP>v%Gg;*rYG%o;^&nDNC M6|ߖ,qLIּu&ԁ줰~y0!3qoAP;qd<?&u_NYU=8˹O ]%iv[ND:rĥ&|+8pI fWH`ǔ!Гԍo<儲x]e39 svr;g<8ɭG'=ԭI#7oo3Im߸vlNW`HmYGGG7G}Mvi~NWta2˝G Q:*6mFgo8|g:21[{C\cCB!|9!o2;xPߎ'c!:XU@Fsĉ"H`3- j#30mS4C" !^S+ڳ1]holZr.àf?ڬx~@^W!-!.0Qt[Y17>n s2ݏ:AY Mߜg%y''2)c꒳t5]2TKò꥞h( UEj)iIz8ٲj傚n§::c*ቆt栗}:&d%HK_XbТggadSq(کڀKT2z([GՊ^W }uvHe^RӶ i$>3SWr~ *g̱MG?m+ sAM,a۪c"ςc[cR8i'Ps c)㌁62[}EPm 3Xz!|>c축 S ל0HEg[KyfC]+ BE" $C pHOٯ4搜zenziH;iWu9-cbKߨu%:9  g)9va*1S/%:0ɓLgzvS_OV@/C*[*VNϗpzma~xgz=!E SQY;c~y΍ϳXkr^jŒ{[ufc?mj @V/ V_**mZZMu離:e}&ҿzIi|j?Svy7^uoZd~CId8V&)i_5D*N Z b'skd: oN8(l18\yx{ʤ+hC*:יHQv&oV|ؕIu'{ݻ<3FwB\.ةltb]\v"xӠ't*˫ڕ7!=n]!]z4.e2Vn~qrX';e'q ^Vm ٱ:٪9:<:qWjKڻ6㠒1)]1+Iέ '؍2.uj]CMPvg< ` q 3A\CC=J]3ueq&:v #;[pQWg `sز փ}/'yFBa}Ey65ɨ:HOji]:d6YʤMndW:`J(@Pw:K@:d<۶/s|>HNz/gtgÀ?:Ճ{- <nr=c B =+nogjx;_G?>~8m?/Ʃ{z +Xu嵼؅2ї,KڬI\1M58S;YVr ^,WmCG^r *[GT8cޛYxA[¥[\M!/|8AOr!R~39bS\"h4'DUv/4`Yi@O;L 2"=c4`U|GQ郑 >ʍWG&Ǜ8.Q ۉŠ5J@r 6[r"#Cd]Qn<]8H"~<|Έ Hxi,~$LhqGYlYO9%>` e87yVńu['y4z_@у}JevxۢKmƦ]%if"qD/R6~B; J3:E7 =A>ɭ9'ؤ|Q++>)o7[%6'+yf$pGp.L6M >EZN;6_nuQ~0;W󆸕elKkyy·B2!?fYP7?L@b8w^gek^w#|_'}u&D;dqC.e-l~;otDA'Zz'ZDk3CO5jWW5}T 0zjoVX٣}d ^PZaGێL]},ձ]O$$u߀L9gVX\q)U>7n |xt-|MD@v9̲[;Oҁ[~4mQb9<'r%$ MIUM@-,~k$hwG|闙 NfR6;d7 9ߤ% #ub (+KB:2G네 <:]-`%({:_y.'8+ x+CiN лN%@qʵ~pQnep2K[9EggkGq8>ޭKз]?Na%[tXўtg8YM:"ڼDm #GmB:sU8g8{1[`6\D7 682?esڇN}ކ6.V2Lq1dv[zԞ|pn9j϶ ?)YAKdMEʭhY~tg~@/3xr% 2FɎ&?cɐ<іK2ET@N%꜑:mv|CǬ V=YQZvQ7vqtc1P JiڈxA`.utcNЉ[,XztnS:uoӥvaF:\-b LUO#x0E;QNG ?Sx>iw+_q8_Gm}h1 m}0?NpjӾ0N=;fsRxm(]$ N gm!Yhf-P es)Vum%] ]ImtKbݩV?3# ^*bd+YtU|^k7™fԑ|B6V"zӎBɷ\Xzp Ha0>VJΒvh *|iҋe t+;uDLB'ٱ:U>ϕ~BSc3(x[}p' ePp2Ԯv T}+Yo%XѾBzn`eeϢ#.KEwgP)& l29WGA$n'M/ ^~ԧ㺴 . ()k 'ԭj[F6/yԡq0yr<^L0gïN7e=}Vp:1Л1^5 X m{_I?Y8?ZW!ck a˷kqecEjJ\%QvYZ}5q5RB[wF £ˀߤ1iq׷y U.>A>F޲\ps´r~௛WJMY=-{~|?dzdXt~pkmyUHZf];ؖߍ>T{w^^Uox6z~ֵzpywή ?߂y);w.i% <& [:ݾIPJA1*bNKW>6@w LR[0ly^tdL׹xN-:xui}is!=tU6',ʫC8'Ǖ2ԭ 7VP>.{iovxq¸p8.C`|;_\KA:;'-[h^f^u'&Ag rxkoZHS @t[voSop = r 1: ,0h@]CR&>*…M`#.{(ut\}:;`/q#\-4\Eh}wc𬮑HyB&0Agưś:e\2{Զ^E%o'`m`\5&8+uޜ`-8=#ƶ`]\6{n] 9LNܮgq`S @`09qlܚ^p ՛vΏqNi;;208aF68A N50hS\"6$ ny( 2ZU)a!.^b֑/ 0CQY֊[Q|o@CiA9p'G?:)s9uUL?pG}Wv1+[w^j_[؃A4GnEbP}+Gզ?*rH[~yAXԥ ޼ _a ԫXC*G!7=C4 O9Q`hik֒:J+֡օMlցw"_x ݒD[A~m \"̋go }~ç;óhwԋ_S>.FK?V A" +yپj@P_ m)Wv$A?)@89 lFo%Լ^qk?`ư+0Ǚe> 39gL2CZ;VχupۨGg=?})o9AVGPHyh^(Qe<CG_M'[W8孿T7xԽSg <co{KYR;PKn_ll)+X"|u?O~4`{>g۵03?'B-2AmC:k^32kxԩU=NK UhkSB2|>U'봟iv4S۔'~t>rnr*ew3J:.$>1rc u~׏E{*N!uS'?^dqە'D3K;l>f?[_zs(bQ _MxI55: ASeލ3ud녖Sƹݶ9ycW4nGizJ{R}|rI<3o\1LLc˔vsl<};lcU"M)[U6]nE iy!Vѣsf.2۹[gvA(X+MzSǴ}|Ye_4V"`:1[-0㴿s+ 4wLnc!*gdϹO>N?͜s#>[A<г/HC_]_Kxr._R/_3Nr~ Bj">1Tc=tw @W, >&|8c灚ss6ο;׫Mׯrp!_L k;NtNY@``wcOĪLFqH8qˇIUW׀ z >+=PƷG@D{;K4İ]2!oqĄE)Ip 3YQqvXǷ.nwryyKc:3΂\V?{pۗI{WQ7ayyPG[o@$ tS |ܳY/GuwI0A&Faտ@6{W0h#`-kRsK pB[ddtU p}:Xm.+DQ }ڣݵD +gcyg m{Nd h\VG:߷]t~g;S0,&yq";8ͪ-ak:ȃ@yڅ_d56jV(G|ޅ^ihOyA޲8<l@ԋmmEg! vY1s։N$ \WmIԝ|שּׂj{8w ,^ur-Y{lm&'U]&-h'1'fO.W86++[8Vw^6pnԳeGS R/Є nMRudkfu xq< vqA i 5\cMn{Eʊ{F|)'j{Y7OXr"x @0A[cvj*HZ b0 յU;RyJ "[;IƲ)H7#ybP/g 1oBih_rOK5xk}\eުZ<{]8)A߭~";%QuJb mxu}E\|ţp,VS퇿(*RWgGO#o=YP+{yvk"֔ɧ3]@ݬN=^ rξAO=ϊ_HB2ҩqi99Ϲ9ihEߥp ]5fR7H_~ JB:Xlڎf"t$ iple{ّyo3 .)!nhF֭Hg4GEg!ͳDʫʧo_Or%dU*# ɩ/ 3Y˞t.qB/ފ߅EZ.crC{``砚hI_q<߄;u7|ǟ9_*h1q{dj98a5%aA"| wIY}uR:S. \xω *>ov:Q~ 7p1֛exFwZCDRrygG 8y۴qz\_/sg i^ :u^i W]wt,݌.wrބ` ?[}븞ުf~Gb? !Gf؃";,{3ӐfW. ai(>Nu8xذ?6Y"ngu} bv9hw`d+X m:ѷ~g1r'xޕsU.;$K_׿RV2sF9Kb=rN{vr뜠t\fH+yqs8yʹ<iS\)Z.T s!QޢųxzsaםyU|7yobDεkE'Sq%E'X|;IZ g:<q.8Ngouc7W!Hv3/K:xYJ>T8/ZQ#l8q,0? wމqi9S~Ϟ1q=d@QH'eப ]'o}%Y3PAF%]Ð'u >g·hkeE8f! ]ԑN>˛0̪aQJS>\u@O]A9+8w1XA']9.yq[87$Q*| n}ڕ+=nv)uǷ]P-:|=$ 7?aU _mQ(8uXKԇރ>oo_$jf֝$ /_?lA'>?c< \)+h":;ʒb-B9u%^W}X-3:Sڧ—8 ̹v]i n[Y`:V;޳|a!|~m|QrG0WZZy-6>T[=Y2>GX&:kg/z#@s_<.]}YT&l(2ySkER?l>@XuC9iZ+^"M3+EY YPT{z7#dK:m۱Uisi[}6'N2+E-2ڶȗ HgL N(LY-D$X򮬎4bE['pO{WrҎnkP80Pמt΀alc%#Jef>ڥ}J"7Ѧ5:s끑Xu^WC_>Ҥcb;xv${?$&9[`h"k18ZMҫh4@y|M1qY`o$Z..qO7ߴj]- 5a,N%2;Mw;~ eׯ)s{[E)4V=Me[TvYZoSkӐ_K"Zq & O$(ś3uv,}e{|]o?W8?\Ey`zyyb_݆{F=8y^:t|yg`R?/:'씎s*伣|^pG/Of$|w|q2 QL>m.@Ls:o,_OѶD]7fSi՘3Nu]wMWݛ?2ܯ9$NǎH֨31AG+,^gN'm80jpZۨ.uLqCx)qAp8/J`g'әljxǝƥg9y?mgbr5q` 89Cv >]KL![ɺb0Q>vɯ+kQCz8au 蛧ۨ# oc(Nv{e0:6 $pe)[XS86SdUtDk:f ~ߖՋ.681 N}8BY;:Vqڣcl ]`Ńn#&A]xVI ?g?d[reULT ^ 0xЄqFЃy8m4nmb0Ym8 +J2ڲ$oBp3I=U2ABqlH,YY xw]d?s4b.mi'ɠ+]b#&u'h#tA|}WټmǾY`ea,:˸U\_opQpn8_8 .^@'J3WlCx!y=x{?`x _χ~#zvd nˤQߦuNWWVXP<ْDsiJYՏcGk8Yh`!mk)_ͧ( ֣`}Yկ8v$iY>?N!=gl-HMqfbKzW҆?6W;H爒 Ϲq$v27;./b J V"mT|}BQ^Mi(GQ⸄>BX:_g"x)*XCL\zn^HՖ-HC;,/nS?=KN{ Kٺ)9~pbѓ!xs S)~}?OyZn+=/)`3KRzOǹ/ȺuZ*'yv{k;3eהw$w/u2K.T _ۚf?Uxz0G@^^n7bݿqA |WmM6 `8ϥǯ:7x6\W-6]_<⽽<[s.ɜO{fOO9̧Pu-بWZ.x|Qo}緅Wq7*\^铠s=T^Wyєb.˹`y;sCmKBk 7-s~î;׫Mo\+lrbܝ?6$p4j : H D18|u@t)D.\ V!r!IkWL,Xv6򝾧fxLccg+p;pgpܩ0kQ lCMR4ԕDe鉁.8ĺ:Q8E︕8qԧWtNy˙fGC&b!,qte; Ok Nx)jqvXU02s*| <ԥ2g 9mD \>y:31#rpθW"M'~Kӑ7 ttOv[ZgmV^atʼ`K7P;h;ao_p  tK۹: DpՓ,]^)w.'Ķs}Fll֥mCt;@36J6.:UnGb OПmI'~l^s]A}0X1b[#tБ233kȘ@IDATR\sF Yn"j^8ItˉZ(M~r0>\>GlH6m<HkxrAQ+rhoEτ[ g#=>h/3|Og6pa "m|;ݣf϶J0n.ŃP7iكASԷ0ٮ~DIvo_Y23% mU>9t$vǁ넵s-^mL'ST"1ŒZ%25|R7c1ԝ}EO\<@ $USQ/Qm{P& .LɶΛW,8Ϗ@~< o'>T'jlݥ- %3J+xIP>;9UL<چ,.J"6uJMgq9GUդnQjVU<IFlu'*.}2ȶjrvU' E|wu\oR]T%wCWv|NiG֡Ozr|!h*XKVfGy8?͇Uf[aNZ§)~reF~#w?sz:s Lj˧\%jw1w F2z~u4՛ LӦu-ӫY8eukqOH[Mڲf3m/V$t JZER,2Enû9L[:{|dS 6gy/[}GHRr.:RRw]u^%;KH.?dW~_;~M6l>48f 0' a{k/y!WJ[l $HnQ*}>7f䫲~_ͨʌ{={#7ZM\oL}+{p,ep-ʲמGqΛ).eК, 6t |-ApU_-8r2,oneY.pg]ۧ iv_k}Y;=kMdiaԨq1~@]|qcU[v?C^΅jnhO1:hf+Ix{Zx.=gM_*y7ۖ&mQL5$hW4I(30v4Ͽu8_:GqW2͹{}:7V=t0\ğD h[gN`(1SҘ?ǿMh>𔽳nC/[]nӾ:}|~a< k?Ub Ia(ׄ? %Ttzs}=,L\;&<sbb[&k vR;P$Dqh|mr)'̀JGe 8v.Ls;Q1’qr:Mi U6,!_%q4Lf023^_B v`r?O:#)nǁFٝnEp׏UvdR ! o^gZ}E\ 2 kQy}E*%#M/u蓧oXyk 4 wLU9d/hS6>qgpRp kVby>O k| +W!4ߧCcc |m2?*O+Z&XT ؆c ZF: @͋} HDxnI:n.k<;:Ķ,3n~VpBO@RxS˖;톀d~ӼR(s)sL2Pؠm2D=9C'-dtԏh2P^Ӥ^|K{:yù!A_ s̭I A*GFK+g)i(m|>D)C+/rN>]?w3C;~^LDF1$ Ґy(I0Z9 1QGt$msN¯ViwHNF='L2#N}҄n—2B>|N&W||ۓξ69]/ژGaG 'XʦNBiYx?)x% 0~I~D8vCXo h't7WkfFU݋<+XIxq} ,Nm{]^-`{+KJ RpHk.@3e N}دT(2;Ѐ#:{`:BC|-; ctW{2[Cϱ+6 +=)A{yuMz+޴->}xh]_ cR]^}W<ڣnR5"vgIa+[6Տu~8=t\ 36KI !e&yZF(҇"W!.c렄GSr?Cw$.75\*N\oY{ ᅕkfLŠkLk«%w.ɏQ24~ԩzU?+t;;d\[>q`|){+:2NSL s@yo$4αFˊ@O&.JWD/#kNWm.M琣h:ܼ77zPx6}Q&_lUFnV鮡_Ǎ&ML Ȫ}XK5:|k 2a5>$Tƅzlr͜67~m9*<=V׋jI[ݫ23 7A1Rn[X%=[_]r-q*qS69~jh#%U .~ C=Њ-]8 е1?*\=]q>sۇ6,|Q3nUxcqEfrtM٪ρGiz=.Og~X2cyku?ktM> u4nFu^Dmb|&fox8s9۹\eggeTO91xtĮ&5 }όAK'k%dH$ 0 G}@;>un.{vvI S_X0*7u+[^ 1p[Ҋ 6TNw3zas`L(mw܃ D O5#|^ϔ+'?Bד"BI#}kOΛa@BFZ^B%&S{V2_/&8+8.lWQdJ@ė$_@T]b٬*|{^j.H$ }V!O <ҋ)O@$q]E8M@^W;Dzt=%Q 6R k.r KiPj SfP$-M .0 c\C~*szD*P-v쁶2e=WŠO_I".]zVǜW&:"O OЇ N Z:r}k0 y iTsU4㣉&J|pwNSxnjRN&X $tM9Z ;^iG-O mc8\~*m#Eބ>>'n>~)jwylES7 =f?q7J,p\Ȍ IoԚL+<;Y=nخdNo!f揢vUoٚ~Kr:Fw0fjS'x=C?Fk!ɈhϽ~1#?09qp=2{ Ȥro Ny@ѡ~G5?֩:{1DY-)ck^+u}{6g/?!1ahAˋsvx},Il kSW:pkqMB%8 [2͖dvRE;o0þK׃ۿ{X?2–QyOwxIt06#o}dk3jlo]\b÷M[XN ώO9̜U5|UaMf$Ch6htD/VuխK6zn~7R02cv2GBAW 2*LMMk>pվAK45u\rΛA_o4s4Z3=ǺdAMu8@"B V,5[[޺dkm!=n{p.4W#_G Xtעw39F;v?ff'0K?y,wA㱼vﺟ5{>M[yp!msrGCWOr~&2rC0?=|1"?|ÜGQ=ع6Mx漶Ϋ9fN[Ybq6Ϋ&o*3FCΫc#2QNGy9 3{>xAsOV++U$}/h_qݴǫ-kylsog do s_I;BV7-D#89/opRV иC'02YQAtL':zpu8Od"՞b&Vu@>87Kiq9nIn`t vd3xv:'j!YPҭ '}-<&3i mi_ɁK='-SIƈK?U&zWcuo,O28{^KńzBqE|u 6 "4a=; J% ̯ ̳?t0+8$mPFF=O-a}5a;AQ~J`DmAh]}H5 03x*6 ~Hbb\$I؁7=/GԡAO = 0B?r*߇L1?ږO׎&!8qj }]J)~  *_}lq^̰teS_7I!Gj@kJB'6Qd'c8"Ya$+GQ6$ Fy=~q16?gld^' }s6s 5]ī\}'RI+(ys&">e@..Kli }Gt'?~)c+ z5ٿa_6m|姲4e#;QtiXPZL^s*0"lf۪)_53t@Ƶ`D)Cȭ{IbDϚNe9DtaWs!lM*Y\`Íܐˋx2Jlq+֪N0 c;#S05yl>Eg>9n.+N6a%}`vL&8jy& >=oǹdv 3S7,o@>޽P3i@l8pN: +'N_0[\Oe  8= NWOҁ( ,O~;zOơ\Ma@ vqL*;p2Ij~ Ӄf]^> dDY<ԣc*.}erqf`;ӬqŒ؀Wf\AW>黸/=| ? }~N+|W$mDvBqhI!ژtA_uxFyO_p _ ~}M*BS1ɚ!c\NW$dӗߓpI{L_S/iS (g=Єo7=)&r-ec,d<./H}3t˯w7Y[ qolf{ǒ{(YABmgtűzBG;3~ɁG#$p:տJݲt/:]'7xA߷x0zIչo9 ت0_éUrw76ƚҟɊɲ72d# áml!h []KQxsC)X{%_ڴ_KigxW8ke:6uK:.+5(⦯%n@xgl逇ŒRe:8 gH smSյ}P.$8[YhbFah-Zti[5sg[3UC\4^J=LW]n_`&hp8~ai|x yZlIs-c779Ǟ_τoǶ1n3 k/̻?eKF|F"V=ox[hctmlm5;[hЏW]9{ݸhsvrۥ7o[wa]|Px4>D85@ωk g+]v%ߠMb޽i|g~tsP~n4Ίav_qvwb<֍W1|L]gy%w }d߽U6e9(w]9k Qzwr|r|Z+3_W_c49R/pN{,; ml50-q o9IgGY x|v{ sk=]}_7>^un٦V.,%09揎?2``*?t<˘!H`ć`"2+5/!hyk=OW&Mr <91=& E $M<@+<s  ԉPqɓ:;VNf@1(ͱpzڼ& :$A9 jev>4cxF`bfu u150NDk xLr/8wbF+ /0@K'c\߽0&a҉I~Ҁ7Y]D{kt-)n@0+VLFه+$A Ʃ{# 프YKWDΰR?_1|8T2l 7J;u"6wf[`l'ЗO"GWE&hh)  h'In}iiu$ڄOkp GysA//u n>suN:C,Vf9ȫ};˯k<~`_<6鿎#;i%;޼*_e[&GkLKp<z%x̾DhWCq)<a@bn;@}zu}Ǒ>?SP O ;f9 4yZQqKFW5F&$ jU$D:`4 >fؼQrj|0Կ>lߛڨ{F> ^#"erk{D5qmu rASn{XکۇbOHrV$eipڲCkt챢P}yot{{9[d([H1`C<0 C_~gWY?CfV%%K߽x$eHߓF1%{ $gߛ_L' {{v\ܓƛK}{ϡNKA В%0YG?Z$h8̷>S:{,j161`kuՃ:Dqߎ9lUֹf8PfU9=4vh~ھ͹k% c;c{~$ԘVk[yě14?mYGsH0:jUwJXml2[V;,CEX޻mV>u9ttnc 5dk4[%wg0ՆP89i| x{~ԟ^v>2٧d͘K^0/t2M>;%)>燘UsN2i\vnq~bnWd>9.f_'ugUQ9G䤙0/p~'s0ߔa2ylk_CN-$ș;[uM&/Mӭ4[Y}e7Mn||]3oӣ? npu@(ԏqvlމ[6NzZo>2;S ft`(f'qb$vt< f; Ng=<  87(m!tX:'QM`p3,Kpe%Щ L6M'&dX`R 12pw% cseu$'LƒOLj%oIlQF,A `qF2E&IL_ x %uE@ r9~t":ܱ|I6d&H瘄+3C./αGZ '$0(cfv<'`,|]a'p}݊~x _$[I#J.S\%W@D,ē4,A19 4M/NbP_oXI1 ^HL `} >e?s`L]ukVqvb+$WKHМ{i2BVR>' }OPlާn;h%nC8oӠvUd CЏ $S굉}Utxi`$%_X_>׬j7XcJQ>!|1!P?hc}qBUV'Dg?|6,ckW款cO&v'YA\ڤO%oa >/,od|9}vE]%ɀ#c &[ܽAX8+2=R~[ژ}/q7yJ^dZ}X\/:ɇ;I`H2nd~d5Gh.=7έ}[nӬdK*yoyo·$x) s Vŭ[~As<3xZE%%:DJSUz8nDyJȣ{;}^D;@}b,9G# pKr.r1'/e oO!c~Do`;]Y|b]`{(C4{_ÿ&ۥ"ш]GͿާޯ?\]1/B+:TَVp~Է]wf>njrΦ&_h9S2yP+&^޹msI׬&|8{n60|$Mv[|Lõm?ƽ ;릟}w_qݴ9}GbNՙk//'҅Ow݉#W[;7hm U($ttkV0M_EY8ab5Dk,fE} IZ0wTfx~*&̮;==KRkLNr1uƠKQȳ)7&؄A_?ͪ@}Ppxf  ʓmW?jO;agZ:J$, +I@KDg9E.I8! ŕ c 7mpL*AaZ`um]ʼn9q'FTpŖ#:jՋ/^EIB4#p| /PPά@š2y׃98^ Mi٣\Q^K?,"}@7WbutG t _qF?Luc J\'3@IDAT<(TNW_q؆YAҁ42Vjckn7!&=ܲ*4 8fcWhf¯Q=(o $j#6yUYZYXՓjPq5H2)/ɫh'?/L^}&JX-,߭"Ñ ѰZ%SA< \o[fո hzilQڡch5ox5f1avLPGD;>BQ[SZ:(ҨapDfn4Vaցq:×_[Ɵ}$cc:r&iN]ӡp=pn}Qop|kIϵgl] cjSko[J:N^,}GڪK?O5:M2]yP@76UؒTh# \<gk7/vRIlIrO>J:X\c퓤hpUԩ9Cxx6f ~-?&έ^A"|Y'/JT <ʗ*Vw}ױX[$Rf_y?'(P틇P&>ow%6Wϐw|3fu 4$!*x%CCL22 (o@z3yu?Ǔ/1U~Z{7Wz󺩍?Rcбz "$p$vl^ڒLrN4d8VvVYFm"` wKmQ͎f[[ wGM-k3ꪬ*W*z,GO/d| 3QۯLVn?fg8YC95`Z-rˤQ ]۹%uEZ}' \dvmdfms_繟[Y <8YMq|{U6l⩵^X.i=75~}y]YV>L䱏a}p(!co>5;O|w> .~~|*(8_cC}*kOi ,^sU_v9n}x|}>)k}?p@dKڻB+8w":8/d-e-сt$,8qi|:}%%NL[^0C4T|<8v2=NXZ' ^~s|e4>9 1'鋬 zC7 GѭtXe r +\MB[8 ;Яiݤ )45@LЙ~Vs'5˔dXCUWac= )싓SV/>u 3"C9{4Ju-WW$|7tzTѾo\(/NO< /mp|Zd= ("=s13` 4*IVQߧ O'm)+sp TsBco/Op-+ X ry3ؑ'j4.^\ES߷z|Mr@i+RbV[BWdȍAZ *# ;tzr_GXg$7V%+u؛ dL>`hpVꃏ<P=EZWq]E}ʋ4gdJ" iUqXT7X[A!|ħס$  oOlOXLbS$/qW{# .)yN/cT`h٤-uy^Rx$p%O҄2O9@^te#D\kvZ&nD*@8GpUbݨu wlw'+w|~/y!ھ.;i!_2k? Y{J).c[ƪvp#0W_j uCs]İ +MÝW dg!gUntZ5/f2(uawdtгVZ|ط dxܒ2lv8jIUc9gԫcl 8#KPE$].F̵RӁf΋N_V. OtC٪ 14+75TCso6r 7lv8{VYb|v䵠33A#Z׭k=KӲ/=&{92,aVn*ll ȃgcBfq+9Q9^:RӔ; S? 1>Z9n:o,?50㠐""+_0 sv SN|:|hw. tL:I'_:yfЉOYcWIpUZMf&6: zہ'CG`wĭ@`j뀢\n%ҜC}`AN4UIC :ȗOt4)@ ЛycY=Wwdr9vۉS -&OXI]aJBLV=uIRW"Qvd`u:HMFb'h˜o޼Sx{ëNČ?u`d ݨk9P$zI& JhkC&3`#Yg$ CʧHGfNͶ w|DD G|{ݔ  j!Mp#n+fsȪ Ӭ=Vf@;๹p Ђ+۱h9H'g"pRJd|g tIrAў WȒ6y͊h % !)2joQΆspdq|5! 'e t)?R*Ω4 `i6gDJEv9Iݸ28)ܐ4qGk_|ɫp/xrݿ8k$zbO}s{B qWPY:{6j D@c_ m[+<اm \߀7C+vIQ\C}* [+pߩ={}Ket,)4_NٌO])~&0ހN#hJE;{|J7~q tJq4v`G[ʪ~&rd$zm+y>Z{il#^401:?doRXI~ބ69'ʭaIC}ELN"N]V#{혨N_8eO^OI r>^:9昰rϵ^~Q CYEdX<``|vkk+s/-Pi:C5%]Pt mlHJidlXGaqkT\6?j%o0gr-6xTT> z0(]%Pl'>ooa:ļVO*`vd=3V͠`M/㵮ׇn O;NUnUzem6od*ΏZj޶N;$һФvkƼ?QX~ [Zw,h_|]4nZǭ묾]}_7^,kUe}]wo~n/9 $pvt`G#tn;AB'l&k8^L"]{L|L6 &aT!v6j3A$[2^) 'Nt2!Nu SvIYj מPpCt#W頍r'M\1|w|su"wsMjm׬SVO*4/|'Na@z ʘWfIs Vd8@Iv_a7oDb ]qؿIzK瞀L&D6u5.-Ӿ$J>` q?x+@7Y)+Q|5 N&Z"W%(~] X;̞౛r@~d`#bxS.iѽSs#x}:O]nkVLNța#ޕ'?N! W< dE^uE >OJ ޚ;|RwncEY)Sg/ڤp6Q *.>+7|]@q~$@a=ޫ/!%1xFe)-L6D;Fo^}"?q 6,H}%OH 'NI 686) ȥ<1t:u8l)K8Iitp8Wu(cvsTWO+ h֨G&(3%d帽ZDȄ7>?e{Rfݢ s`MA MF B]7[ҏ)7Hk#"/L!:xT:Y `{җٟ;_oK&˕!ǫWɸqO&W'k7ΑĮ=_a> m;8 zc7棎Py[1lerota|Ҿ }nMhEse1@{nT^ 7 a՛vnk$-.zE0.Ÿ6Nr ,zRŧ率9l(]VF7JЅh5'2裶҅<orSfhrlYMah^_y,^1tm%~Q9 c/8w88)?1)Eoy(>wn͏c*9Zt@j=ʕh*[.hy;i]fzQ3Y'OhBvɚ}w4!5o׏Y3V7nӹBδ׷5'[xG:\·CҵX8 ׀if.k8zmTMo oVpr븬TvTgO_0VeOcV65گJCc}hx?^&p}%2yp-?mvHd\i^_:ÈmLm{ .~]yyc2=ϣooFDo?>r_mVxzM>;̃O'>ܠ'#6v諾%vq战éyIhS]<|X>Z$"v7aݾaY]6ͶuuוYmL) 7}ŭ묾]ve۫kw~9ZOȻMľLOP1 9ɪہ*xL1vD'LxuZor* #,gjKs)d'mkc2\Dm j!&•խU\]@zKO.ma]1d 1($DѝbEFu+Cңt  9#+C8I--yVIJu#>O҅L>2J9!mL7g'}IRzˠ|$( YD}—>h{p= jB-%to (/Q\ +(ӳ;0$bw# d|e+pސ䡿c ڠ!ߥU 1!>bsr`e#">*-}WX_|14!$2dO8qe@=V&dӏ_ѕz[ |yaSW x}`El`c[4y:^\+$K!8E'F Y2u^i}})}'tW+^@ kzmi?}'p/0b,Ia\cg\Qq1U7gV͡+67k~_P3YTcXy,+~DF'wYAw}Jչ69v ?0ʱIH%sg>Pnę1xb% '쟈̢Ef=UBA5YN\uE˯ox9* dU[_WVc8}_pS,[V!ȁ:-]?"Ԟ)>NVؐ+8ǯP}dM(yQF  2+bDi"'o=5z3E=oCȹX?}~ceN9;5ԉ}Y]^x\;׽kOl#*m9%|MrlM:BiE:Jrr~?O&|k:W`6'$YM;PNPe'M<5)i|6̵mt>: 3赱;ʜ̚5qϪ;Hm#U A8НV /;v0ͬ9Dvҟϡ ߶]bvT\lS5XSe&u; n-WTv;)ڪ-jЭ}i1 Fh:*8.k-G}LEsުצy%uU>al/ 7,i|t>fdKcqbXT4}a='ԌTtIۖ껺mo[y;&ʗ]=GOQDsݬBWd _lߍfwIk3'.zgMvSYڏX:[?knD#Gƛm=.7R430:'+ɝowD_L~Sc+5 #a>/17\֜?ω L6.|8/F5'v0qn"Θ9n:f}zOA 怭@;í:_Wfsm=υQxuk}]vex<ş|7QT'Ε;>$L"4p2 &vҸ&R8JW3ή*aLWK^OldpyI_4'W?$e'w\m j^;3(@;t uF\RIg^b`p~ ^`^˓ N` .hM LgB%K@KЁ:Teޠ_' MMn=f2|J @idB"bj$ Y_!q3 ߹ ;cIĹOAj+8|Y!ᄧ/#?+AO^^* |*.~_ve SK[P.IqpwV1$>/j&c8TTRwɤ3S`D:qct@s׮Ar]. 'xO:^a*\=e=n5 bR+#\# TG\G^@Mof% ];.P>?PqH56p](zх^3W9L3 >GW0h J[ J1f;t|;Hթ3 f9v;$1A~M F9]Ag%&'2n<|&\.㖈冀=8L*Ԑ6mx!1|=d3Ӗ FH7CkˋICu/YriG.+Z@$lUN`D%P [z IgTuCc v23M8!׸d6UYTt&>O3;6Oj/L74[|@ 2з}ٹ"Cypx+Bh+^ۤυpk,8ׂ>$@#{{Gqp,_'/(_.^াM$^2! [ܗǷɯ>3~K8:~\so2d ~N+ghp,_RKҭG ; x$ ݮIWinh,H7Añe6)58$yf8֭{R.b6W׿nҴǶ~S9mؚ7ڽX#mM&1/+}Px]WQcA._ e8v>.>G+k{xV82& j[s(}xʣ_+06`_pޛ:\7mK6<{JZŏ>UklMߐ&Sh>~9MO6o9Ʊnphw/~0؜L>'/.[okmvm/vйL}4Xj?<@yz:cDž$@ũ&8kPX턶+TI 7W$Д-7d OxR:#D c4d?0=L2:!Ulp   qdDQ:z/2pe'mw|Ϡ{xs?W\}V08gƏH`9ue ;#x>yDr|X1o(gĩ| V@\'cos8n{Cb2'LԐ!ҧ(O&Ђ u(G}Ƌ[BiGD3a04T@],;WTHR%UGlm('1c%8r[$`?hW`L1HxI( M#BOV뫂ߒaгzaCO'}|en;ͱ־4<ɏv51hf)v~ mr| !:]J8:N$YfO{oҐ>i'S_?Nοdzm۲/9u;eʱEHIC>/#!>B By$"?`bBB81؎rʮs}Yo瘷5r}>>_<;2PH $i%&R$P^&rb;+AZڈzp152{˲o?t8IMRW#&rsݤI#S\E % 3Zlʄ /cy0~h\~4ciO`?ERv%/y+bKGNj>/gbY\ _+O*uX5 >Xorn.}Q셎EJyglplOn?޳<OIaY_9!1`,T_T2&; eTH861I߱@wxJ$Es"ڹKF>y,51$O}-L:xnַ~؉lxZK$C8U2&nT'ļAG:^:(RrFm@H{ Xhicfw)T01;{(voW Nb2-m|ɈQt7i5!4liz/B `#N&֪fEoU*͡g䖲0KKޢ]\a jHiCYadkP9bulǜGzs<7@_vqo9 Fb3x?=ZeC/ŝ;l˶7^@Q7'Ow7.>އwc.4!)>?t6;}e7Gf`>&6~y:ny>~,v~S~StGX#o`s7߆gڱeۏކ|y.౓C\w;ܰw90׻M[uO?ݟտd﵉LCVtS0K&Hpͤgx:8ޠT=E||q2= wX`jE?lNB2ƷN" 797&赯@3>50c2L@7d;ة$c,.# w[=Z+vL.Xu'!ιq >5>a7IePʧƟ7[lnU X ||52`ÅX௘]&O$h|ܘqX6.)(l#o5ISI7^ט~k؅ҝ+M2Z~Ƹ6F|/T6ra;x.Yfd&Πb i%(I5?.{%I#=-|q]3\WZG.|x/1Ngĉ29u>t҉?QvP,΢8+$vf/dEvtj`MMI;aJo_>>,^ KyX^C>ƨmulS'8-GǬpza `INl 2R/s}E,:rw[d+.N/kS~/,^|kgg_\`t\3u ?ࡋhX6v1 $)IB$A\@IVqIw4E)TPKkJs`zj|I)@IDATQF J*gdN>Ťj+?UIWdpRvǐ1U+f"$E7-kDY]lɿMY;a,dp*t\VtQ&ԉA>Ix_xC]SpcZdbWuhuBņ@M|WzHoN8i^)/n3a@Y򁠟>lNJjþLz=<;A#ѷ&ۅ|3L |VG!%!Un@?hYpWgYvVF>GoVqž7]3)A(QS?uծMWqeKy,K;~'6,6)jAzcУeWw<ʛ[v1o^: }niCNcZ:eZxx:cuiS'cib)2n[$5IkL^0Z97gQ! vB`wU?BfM7 >3vu 5bŜ9r KP&P]Fzsx߇bbF81Cs9 F3x?}>WƢ {%3z9&Ez'˱o'WP|$-1"a/c9x4&qy񘷏mo¿{ٱvVU7pooSƼt}m]&έ}i~~o];R@I,N $\dd.N,\O`] ]9Ovd Uw0M@#ekގD"xw 0_;Rx:l&'aN7ε^mlt'9ۡE'&s!NIoc`"qdۉbR$;\ta Sl{YRr 1mĭu TOBх D&M;9wl@)_ zo wsb:;p]L~sBp ]:|'T,#tUj''}U¹;bD_Xab'~E~Ӆ!}5ivqb zhD w=tfW OΡi#u7ٽ4M'~x~y(.ANy M&XLП1x@sݍ.Ty}w c`2>\@j+ߝw' fg8z 24cu Ɖ=hr؟?-&m.ZA}LTُYd,|FE@}(K@Hcչ1- -h*sW~!=~o(2!jz+;h+Cy5 Ɔc}8K '+&.db[xic<BK8Y-J2!} c}$5(mT' )'mC?j!Eg! 򦏲4L e#8 V,l!6 ZBKcYEdL 1<_[7m6e(0t-HK3ʐ>0  Q25Xl2}a $' ݹx@񒀹` |oٗx)trK^K'$=Mp 9"1@b(5H">z[7eE*j1ݘ2*-QL\XN݄Ƌ%!9){&RQ=$:xF ǺJ{VN5ْ}-h}kIbn e$}FqrV._*xbC,x>*ywP:#MT}?eѧ i>Ln=!ƚGv{}رYq~&VTZ巍 OI}ROC;!GbG;ufq K_)glOp{>ވK@}?'?*}Տgo5Թ;D<;f 8Ky]~j%kCԩ<(4ۮu{r"d#} d؅ B/*G[{0wgs_2$ƃkBk{Id7|c OJ9I2<[Sy"`6c]/SVߙ܆Qm&E??r&ZihͯRoh_>kFӀܕWǘceox\EGxmox)(zP_U״TXO1m "‹S%OGVe18~9 9Bkyu\u1oWwNa埖zvZM6rĜU#9l+M8@q Ags38d ƣjK8>C8aMˆOqO}(>K>|v?9240Gy?j <>穝ߔۮa[;ֈ\ͷv=1|3>ҭ&>Y|r>a/19j't2yXϓ9gaN:? Ήˤwb 0prL\^Bǹۿͫ>|g|9,;qFPM{okk ;¨fU'}Xٸѷ8:+!F dm`pC/vӧ1 Gğs[\ |ƹZHM]8_#,悀&ȢhzgՂ@& Bh=/1 "\/o;F+[e/G]v F~0lj,  uMt0K/eG~%k㦒#aC(G'yk3cK`%. rki9w^VtP%K'#vgQW'6c2^ !(h MGv84^e񅯁b]|k~3[<-ų/~eⳟgQ@ZeG6+X%6hOj%5 W$$0cd1]'P)8>S{A/; i^{ $Hos` hJcZĢhW'Me[ctRsX BH,|J檶.q7 %I{ZS<(n=VnAwcj؀,\/pN/}R1f\# 1!zQl,=):.Ɩ:κ_G٭ HoL\0JccHy0u}M:qY#G|~?ʰtE| >#A2to}G-XR%q ?[qk-h+SyUhLt~㌂MϣejK=a@zi]4GC, #ߑ}i]0McMǪvUtysU?M6/a鈟i8]|gkPfGGZ$ mD 1үQ]aL3+V{*~krK|ýֹ 5n左Y7^ֵsG:-ujz9X)fEz' Kޛ8ץJy_U8 c\W%!$ʷXjvIUu^9:Oyݼo=rx_-/WK{SL79]xf{O.Ɣ_h}8d+\IT EAh?q1IJ넮y▽7r9@yxr +;B3&I+3vPާԟsr',mdvF\7, x8 ;I~&\@t>_cO>\0њsL}/^`SM9x}x FmS|[Ү,~?,4ݝɬsln N U7k7PE;~oc?fdko|d|kwc֤v:E+A]Kc:ܘ.^2Q;9_DΟ"2DCڄ);ٚc:/0>>YKII4TLIA1 |ʇX[*V,GxVz=~{%C<!2TM}8i۸HÄ<ڄƫ[v\,]~_ů/ˋun,>K_/ϱa2RCߛ±$T)DkqW"q>iKw0.uױ`ccDO;t(gI&=ʖn5FH[)( d5b#od6,҅@^Vٮo뎻3)Y5,(+b$*[/gЁP,%VP>ZL%6ތH+OZrw_ >+7?-Vuںƨ:eyr 7,V&GuO^zB' LVLŇ3=ច$5sĩ됢dm"Maii',m"TPQ3Kiy Ҷo!? l~p2"(Y܋lC0 ]W16v3D9yrI+q%aիƛd5RgElG׿?Co7㲱?Ze<\Z[6،5~ʘC[Qdvm/]T~}덣Dߨ~5^UӴXWsjKm!M~[L]aJPSAm]~&5AX,>Gh<]Ǎ`ͪjY֡b*ʏ]=Ǖf5tvTLfvLvZ?TRZcbzY[3݃Bښt ~~\FL刚{[ؐ,ޡ@ܹ;o }ǵ!.%Dlj664nl{C>{<>?)x}A!XH⭗wi6O<{>Y2F{i?G67.-*L-s?a׻Ǝ馵/){/0|sНuFags4/疬/2gg>|~)_?iKٝs)81xeޏ|T{NFM]bpۮW?\7&QR'Pz<26^xe]vF'7>~+abDqg"ȉ^'>k X~{rhd;դf3A31YaGua\l;X&a?&Ut:&Zv܉0::3z^Хgv )vAWkex.ʠ.Up|Ry-7Y5˙vr$ȧL (W$YMb _nY_ev}6ggLbu* IZ៧L| kڀ.`}D6MI<{t' ]ӁPKd$:{C #qiMV1yAR$]a^)--RUO]VQ$B۶3~n L'F&]e Kd6PtK7 y6O7 `]!om~ O!xYăN,8Ef?EI̊Ac~`_2\$7`,&e| I'}/|֘2ʫ#W /a˃aB3&鉑[.&FQ;׎TsOV#?HÛ+o apMo*ax&@1xCދ:N8 k=lsq} BGo뻌h>҄DtN;c~gA?%-Z1UA%'A)o&ݍ{wȎ0„H܁8v&#2ZOLs Q)qMWH%hV]AٵMaϮOƮ7k_y)BpA'0b+ktPnPomY[ʶoX+K\l7“D] L^P為W`{_|_X\7/ŇO?xynA.Ļ&A#0JZRh Cj~ʏ/=u>E; |^i`<)HP=twд3nIwLS'm~ ^u槏.?p!'%Aw1}p f9%;cE9~AzdAʌILRI}aeGi+;~_.VDžT>^Cm'8TWhS!:0S]5hb!yh+ K#ox1cޫ3#_иFeBz눑F*e2W<=u]}Wߕq2%vcyYqY":/v uXD? Fxs!Ak5-p<]ȼKnQTiZᓥ='Mc=ch>?PhCő[/Ӓm(|~yP!}鷳Pe^!7 ln][U>,?_wwU1WHҝ2O _`GT.1WNv6祒e/h)w cQDvJS8;e; 6X)Ida/.::W ;`d #uu%B c.P6 _Q  |Yd_*$_'EHbBO ~׾ZEZ&BMN8 Z;lgL886gEH$quxw,qaC[g%;/D4d^&yk~;4A!\^vJow7ijчt0 i'3"MRl= PM2Z%-0!Az7IFD6BmN]f&~ox&Nc^wF xn]*ǃ,(H蓕D7)86X-xd(6ey'p&蠿OmJ[+XM}M4_-\;7ؾ!ぺ2I-VHb!ʆd?̘SX7r#aݟ$Ј_[}m]:c- 2ƞr~WȞf Xo/YPx:H) Ahv#zu\(t~x_; >#P>p-omLܳĉ\,0דj eI\O-BX}asto[DVdBx{d-c >ws%+>~ g?/s羸x?}'ݗN uA&={E_I$2:T?'=_U1*Mcsʿ |[6pvc0'Vj스Pu!Gb> I@Ę.)"peTbDY sEРJY9=zLB OVOuz^QҧhkYAeILexok+RllO|lB~Α@'Ecp&&}2H׫7+"WHUliGs (/3Ah-[*wʸhXFI (=b@}YTdA?HXX-1b,So;^E[l roViaHs1:NHO#/e?e)BѲ|˖޳%("ZH[)ՑCT+Yqp/ȯ2&f~.pƲt?QW,&mvpA-tW뽎kob98)Wb*I oKԟ \̖ 5nuzc2@6.Db7Zr\]n`MoeBt]WwC.5&nCh+MblOg`s1gy]5 `HFa:C[c d4L4UB1}hꪴB)z rp&4GRACnx©򪵯C?97Jk%k;ڹ ECY>fi:ieQi}A鳋ήMi!x^}%x̯7 Xޗ.-gik2CxC9k \x=~ G.m얻cBm^CPT}̃ş|/Ǔ+2 Hs3栔yGW2s(Sv^AwnHk\_=]b"vרd  7r{rO:ܛ &};*4ro;uʶǺr}dGcy,KXf?~$aLD; Lf&HdvL6b:نFM{@ v8#1O'$֝u$%"v`1C_u!ͷoC:w+&j5}$??NJd)g']d7! zE|Y@$h♊E~՝RO5PE]]"c&>5aĨo*FT{kIƒIqT{ es/r_S_oc_t.`smp M7(D.Av<$w(c!O/q#[cISK$7W IA+2JLӘl傩+VXdR Iw]A b qmiGhа͸޹Ȅ4gА_:rbĈ`UH'>xzh4ExNדHulM;=qC<ߠ 7JVe,Q1D?ٓş}wnqs/>zgWO=>zͲA'PIltZbȝw؏W,H\aXX=pAv?n7 [WߛD[aQ|ѷ4"R|H6cl,nѤM{Dģ=@qz,>"G[x^+(x/=_<&^1&˸L2]Y:ͼG@DjOt.;IW֭X8$Q9%2_W /nvÊ}`e3l´? Wlq@K/6ם47x`)Z<9@"}Z<0 RB-,vU;8gQ%vqq vAk>1̹~rhGi)@/MypB]c B}L![L_oV4x,eCU{H=} {Oj%ʕO|*ztY̵1z#9^6xpH'@WNwdg?x ũ>k:y~RG<L Lb>O?йx9*ǚm]'JPgil!wW1ޣ)Wb@Mܼ+tp.5yyD4QOЌv˫x>F)~FJ:Fޝ SN#eaMu Wt{}_NNHގUBl'=ixOUO0Y'Q] I Q `>8:zlkܠb7-ύ9m4ww KϘ9q7];)1'|-) _cܖ95f37/b< GXq*K5UNy$~|&w.M˙};oowָOˍy^7aw=}ׇOgh=B};֍9}m_ٶy{s#Ӵ?~޿_|茧IM"5eR=IN'Lyvօ<踐['`:_-$sLx͇ ,*o)N _@qZ :1$> ]83K/^<._C1ieupBŮ&&HoSwN AwG)@3Kn䗃9KĹd(Ņ &TdtǒÉĜ&ɮʄܗWXP@Ю9$~WUD;#\6cKvrpq[K,Rb/Wic&gWGpN< aC<Ƞ3,C/L4)V7yoc ma7m&wP,&`x!4T“zw @ ]sE%j(pB":h)&W^AI:Bb]L*ݴv{?T\*CFVw>hJ]Bd@|8mltf)}C `Q.=E :ND8hǒ}[LC8p&2rJTR-ǥ%Yn,86E& PmlO#qjuzKկaxٜpJuϭU}(kHI<@lX"QMJ.|{bnI }GMX _hŎ|Bz|޴_gV-+{Ntz .Ͽ￿{˳I>z?ffEd4vVt3(P 1;~@z qmnadir ca -5db 03 _~a\ĉY)zCz.\ -TSE}D[C?D䁖។,A _$Z0$.?q ʱU14׳|EX߂ 2,จ{m'qI]-!ѱʜ$`D0rK{J ;Cﻠĺ9db=zbmمߵOlQה=0 /[b8q?h?/1b|;`mv4!:J]<4pOB[GE g(:*,,4::R RX5& SZ҄")G}Эb+&KL}=}Q|(g?zwGϿT9iAR ;Nnie!+}m%ux?Qs'qehؠ=?K&(PF5&amZ",-NMtV#'6cMksvVoX`6q~ t,;φ~TӆsfKFyڿuHsM-欤>:B{MnV:?ꖍf^cuv+fnsxi?]y>м<g}tm}>8թy{k4yo{s_'kY1܀ 3<,0sF<b_lOm?'~ Vw˟vY`ީ+~x S8 ,0cB1HfD$nۧ>O Ug-5$}|ɫO܍\f>й{rt3ux9qq1lG&x?_wJ {ƑV7k6x[_3ūucYemvm^붻w=Ӷr'_KON䤾߀$P4IA:&4$9J7yuN:I|ɎO['Q =;쏾N$;̶!P%&71三b&ϔׄ >\Ԑ l|&d7. + ġΉcwȓM:f@IDATBHש$nY8A;nxn"-Ƴ>3wO%Ƈei|װ &-z`j3Ksgc:i[*,`˟ :a\ ]*#+1&}ĵG%hf"56$0)VI(;E =+aE_ڿ]B,v}Z9͑ ]j,b yE6o_Y7Tmg9!S^}mH฽:$ƽ uoƦ5 ܜk,PFQ/qIKMkC&(ǵV:kCĬk+~okr\A;!N_rH0Fp/~IR N/HsRožX&V iPD-9lvj!.ӥ,ݹgUw"(=pV )唄(Z%ݑxj iҠ%ᢞVSq"43\m0ҫd[H !l=/.ǿŋoWx/,z ,(sgUXkh#QpF%k3*p$21&:A38G KЖf2ቇhM ʽбg m]k6J=pRQ5m飔d#Hͻs@T} pRd8g? z:n 2ń6Z١Ơ# Jh|M:< n=Z>`ĘK/R&0l.C"SG+Q!T9%.4K~wSO qb/+>1c6^ӲIMunۥ>]6^?]k3FW]m!}覯b ν81ޏ$3,Gsiصft! 8s٩{KJht;2F4[|_j5б%LaX YG_Z|)}hٟ3.P>KG kls1oLo@ImP٠}H ɧmHʤ uC/VX _H#x(f$&˶]F [kgylwhXf=3icDž$W&",oYJBh΄3f7o]}Z?m#Vqf]CLee|mڷ:aBXqZVPVK"*W8ʱl:iu>kkR?6K8 !18k\oc_V6P7 RhYw1܀ 3<,sF<p; gm)}f?O[S111W~j;Y߉'tl?>jSܥƛ|XQ80dFO|i}z߯gΫh69a9_vf)3ORs\M_9ttUq5OΖI,/AyN|s\,n/iXnUoݶ.0#ޱ#'V}/s߱n,x <ݵ,\g_: Hc, ;6px?G''vH# w'M^dr .|p'{No{!I|6anƉ^_!;7IlF&툡O7ԟ:"ta2gX$3/^V9N`p7, q"6[ap Lڒ30aA|/[Z8`m\8]N;1g/| y-ɫF7$tLJߝOLB1I/~ bpv2q}q}ZYs6WtmO ,&h=Ѕf;$A@n&M',ZQw'/ITj)Nd>3q9|po}C.C@nwP՘[ʎ7LecCJӟq;\D"r`Ȥn&V~" Z f윤Yϴ0bǼ:YpmҁRdTln|0&Iq 0*8»$&.Y-1I<'Z(a(7W[-K6/.'ps e0Js G&4Wr)O'5޸ &V]T"eM}22kO1D}WI[(Qa tǚ Q":y]KW/hƷ.P׮JG-$m]M9F7Y0H 2_8n \ .޷JoEiFZ N בyT][Z'}+Jq 35ϡgq8WWN]V}:pv8q3=Шqll,BDu5cџ:}ާaNj/,~_^|IU{&tC#n .),c%4-.xD>2.sL2Lͷϣlۈi/zt9u2xH>/G<"ψӧyn8hNQwnCOC7,PhPׅkFzMwy`bsڬ^ЂZ<5m˱b`n=g&-5%004~0-W)B:fѧ%T1qFL~գnK]";'9i5zY- pkmGծVU+bNz/5+W,}[4IyM1?мƳ9gMq<@Y3x ă{<>%1"BM]69=gp3`dWq{uJ]U1j2}Rm/@>s۪10IZ35fܟ9;Q~޿]wAWY=஗]ۮv1ʵSksܣOucawyylUnZ?ښ0}z-]apfJO5ѧǻ_$֒rbDo:I-SXu $_a e}C"]vLSW{z&dv\ߝ2\ Ul$I2… Ƶ~jv' 6tiۛ6Ą0V?@^oZ'؟ވMV!ӕe^ҩGV`={([K+;T69M} z'F<"zlE@"/{µU&$?t7lp<-v LHOF9*T7r䟾ݭ͒T>y0@^q]h!-_pvjN&UuyM 6" SSV_Duk aRJ%} $+ ؏2CS[xl^E2 \5OcCXB]mLO'/u?smeCO*)ނYZ{3FjvcqG(uRNǸFZP 29Z9WW\tgf_\W?;K \p?#5ү;Z@Uce|].I@|W&RE:+r8ENq<:Bʡ[9+dZ10/R@Zp\DVPQ~1t/n,>H6,1E]U1cZ 2W,<Ț7v>>"+v^}.Ί>l?=W?/5D-v -. S'tS=^88Ø}4oj/}],uu#X ]oyc.|~q,r)[)c@xEȑ0ЗW\TV]Dۏw~t[f~ni&_#3UeFj}*ј㹨<-Mg㵾s4^AmKdnnuކsL.‘v+K>Ci ~}lsx 騺vKU}ڴMcG,IwErYji[ײ4\C<6nR~qvGli>kϣ,l<¬VЫ r[ݪp2{0ڶ}[ۼNykn+K9BkxYkxCdc<R <7#0*`(̈́]T6=b+O2v޴+-/'b̬?6O7e5?1'զǛܾd5Ïd>=>EƿiaWwgvi,W^.>g{|s@̃]u?uɏJe)s7ԙOfn+8G8g$ sI QsTgA?x?dkxP}ms9wX:6^.{wӣOv]]wr3YFy}KM~w9em}~/} -wet|3wҎTZu&@& \Pas ;9IK?s8q^(@-D{YA5eX;Iz7Mu JDKkSbaIfq~&]pELV"u=(a2@%Uˤ<넷r8LCز^^\-NYH^>L®Y]M}c7䐗SL8QyvPeܱAU5< !VD 5QwgNS2' @hGHO=;Ych;'mv*h^) ef$)1C_ڕ߲_NAvj&&  \(bʮ/ѸF țvƤ%Ibp] _b2is@T~?bb_h침X.O*0zT2k}cxawQɣ "C&Lկz5~ƪrmDCHZ\g 6<"iv<0 ܅<&|pjlwyI> a8hsT'SHF8hVk_cpEN& Me zW3 NZ}'}V9Ea;xmUJvI4HuMCt!jNCAiׯyki3Re[xLy_PsKE Ymm9[|; >V8p!*ܖ},*T44.ު\:z&Ю>.o+_^s.;O/]kx7< Gy'WdYUĶOt ++(KVUs*g#-c؇Sp.jg2FU>D>yikyNAVmvehHRʂeQZK?.h)= A/Gy8[Tz{dTKIhDB(d~>{_ㇾ'<5(2m Qh `XmS0P(XyӲPzǧ}f5.g5Q}쵹x")ii ?6T|ŷiW Ǚ\ '|Yv8'=UOqCoMoRv>籸?;q/?,"DaVsznyۆ{ ]umh^z󡶱׹n#w{\a\yt?+|囿vWt*$.0idGW3 f~s?;i`'缞⊶Z0a{⹈$Yl@t׽u'58e7m"iK`=gy'g|N?ĚɹK+=<@wx8c^H<.wŘigFOx Iy2 \l:NkBbiAR@Lk[&WX8 $* Jĉ{+$/&b3]_ Si)cBl( h*?ypNaW| jzq+qV0S2$2@fr1Adf  JĞ۷\X|dRf$P;$QC>㉫~ч6c41̞!^k[_dHIPqH2ሼƕ`qrMLǾm(S%,Kʨς+<$vL1$)xܟv9SyCGvB[ر DVYUr-eSfcL!/g1A"6Ͳc4•<'Ō!k`&y"vE2Ik G4;wp1XED&ҮwTcC{vDDf؉sc:Q0M_|muyGٲc9:0Ƚ1Uy D$e8{::ua[-i6m•z@\Cv] &$I}|~W_|կ. o:g!<ﲛP .}]j\S|O}F[(x丈O repD^'ny[ Ji %_R5oxw^+'P ͂=KAqgh2eDpZ1vKc'id[f,ʠ2׎ j{1CYqC>}fjvkHѪ.|>IgZ>咑vX 26ME8bƼabZ:;wANyt6 B:Iɫ]\|ecUl<`A׋y5[iF c~C(&KoI h[fl2D/q,(QgKGyKW} viHHU{D>$*,Դ;Ψ+H@KxuS$`xZm֊[,?#Z9a_-^<<_7?_G<>l]= ,.a!7@+f-c^΍c k5!?F|[lO!\Qc}bVmZ6p0j#\DꪜG\+FYr՟Vcukݣy]4pmBQp+UinJi]nʻk8;.ZkղXBv~WD@/8pn< [xUjK]Ƚ1To/΄]n9T;9ynChNx6w*w)`)YM}>Mg~,[==3~H%R%QT & !' ` @%@n m`"6rA;AlF,H lC0bh(۔IH9g?'~Z{9𭙽jZZoۜ>>'?d}l歴-:].6}-忩X<ֽo~C%]K[ź?=}'&}XGl>'<+I;[lݷHr}rk̟(ۧykF=m./ķhtO[gd3zrtvmBZE h[Э-p<4mn>,,tTM:P9Om &mciO +dX aт̉n,΢+-&3<` _f>9эtDl>al?=:N|H%xv2nKxM rGܓ/a(<=z[;~D&LfB-R<1mEd3^H V%LD`lRm„360Y6hp:G>eWhl>pH_1}N*b9j6x ,{,`B|bq/l4|c*U& D˗ZqƷb׎ENl~f:xǹc1Ic~?V`>glsȺOlx[>'#cXI!6 1#ƄGܩ.8$Ee }Z(m=6H;FV]/+=ĩ055a)?Uyo/lky?y3˗:o~Bqѿ:t V"J? #94@xRj4glgkHG^;V$mjVaVc1HrS% -XS(q(ZQuipd*?0VlWJ`?Zhr"лԹ*3#OV(8 H\d,fِ`@20%x+?b 1o #(zV Ox¼S@ NSAGDMԧV<0Lx)}jd\g1dfsOM:r4L@.k>8y|bS6riF9Hν861r,LlgyJ@lgTpcM]|E[D*b#^iӋq Um܈bf1ddEue{Ul ``eNdIׁllǯ~lmxm|vj7!u3>Qb%B'C}+  gk w)Dg1<]ZBƇ۫|mնec*w$d?{ ZoBܜ81'Lr-NC)kEl欑xՖCm'ʌ7 C^1 -1~R÷U (10*hd\t|2%}sx-F'bXc'+?&›GmĔU]Bjb4mOק-Opˑ*0vɾ&{:O&%\9`+ĺQĊcq-: cӠoq$ş[6krgF߶^Z;՘ZtO4Ľg/Ymr}yRG˾?qeݕ1<7tfst]'ϲGurヴ,JI<Vl?Б}OO"Йv?3YT`sRh\(Oү.^j!A:"g, X8k=XX},ps 87_37cA يE8-޲HOTGˈٖs ,r\:A?6,ԞCODVdUVGdbŸQ<?~VOc|( '~cA!?9 O+dé M}4KKBʕ9|=54rຐ.}n_p&X te _rb|,_F 8.>_nUک老"G|P#pM1Yhyp1p fӺZPE9> Cƶ٩jFZC!`P19!h"u14ea'W*`1yM61ސ'݌}5l5o,nK[ (RARp[d)c#NZ>lض-g\8oTاFc̓n c/Igk:@BWo4|CY-:-v-۲ZIvP6jF&$&LbXpNĝ"F/?|ۿo,~[)>& v5֭sE9 d?we6v@֎5OJ6_.%Yk7O,C L^6:sEcݟ=`_8|D{XKԏuNu{(ppg> o6|qS-7_'6kK)從y,3_s~L8KP'9oF3yc.yKrwͻr;-M9UsޟGG? GZu$,.#3?th8Y{)9fR ܈֋@+v净+S8x4 l঺ x!|ӛq-ra33mK;ʾJ1B7cǏ N m`čyzѹQ F8‚cgze[r>lbʱ)B'ݖKh!~ '?hcEHr|jg [1e^mboĭc;Z˄~S< ;ͷ 1꘤m]pRSSj$~~"q*dVmۘnu '.׈u<1\?bokۨ">>`i}hHg?G4/n2o({uwM1Xohe 'w+1((h6:1_s!p ѥ}WNc*pBp1B c 1b E0 *l֜(O%~u c15 z=ԉ56vEOqs%byC\ /99SPhI^|Ti1#Jh 2C6q+pdHׁt8^8ҵM6y:|?{M KSl+1p]&A-|DYX@2Ĕ,O.ghד0C1+McB' 7r{7lmJ}oќpYOϢm-BCdckQ&eZvķr31[iwt1lLi;lq9YNRuj!NU9]7in!iey皼+Ź>@IDAT ?m5Gj-<3F#_-}o3bܳ0KFD~6cەn[^lb5c2{۸uzjەLSHF&^ovz>W1xC07CCb(",ϱG۶}T۵k\kϡk3'M2 g|"'x%fScUwOsw~LkL=qj>V?|ɬ[*#Xk)$RZ;/˛5B)@.^x=mdcrw67qڰ&|vE=#e)aы?o7?|$|Nڂ 7lu0@,:6<~"6 u'pqM~˫5d968@+q㆛I&• k,4瓧znz0X&tlG2, l F9f'zGPeZYbnk~4 F2OG)!i!3=Ab1UcBl; ^\V-)"܌Y$I 쩢?bӀb#'ZWJt^ ?!5q 2*wbcdCdc+7}i}_LZ `mov`CUxE6?8{R}.5<Fx 3Ƒ y)jS=y_Bc'7(6dX':{Oq̫y)p *BEuZ,> ѶX5+4#^a>6n&Ze +X%`O68NĊtbs #~ˎdrjdž&!61#}~}" ?1nCIl1Y jv~7ƕ ^@/D\DJ8fYXWɄd[[f[Zˢ],Mq<^,l|O/6lzUT PČE4|Ǡաxh+xz !!opձC : 迫ZOGы~P 󄔃&8N˸b:8;U4|L8>(u'_ 5,\?8T,s/s0v5RDWN_q8e- 3+1^;]Ĩ Im?::cSs x3F,qcdxkI6SڦVы1N;[ܲ ? QcD_int!mGѧ1W)oжv|BLP `h"Wmm#)XW<؄]ƿh.c|*͸hc<0\#ؓo{d'b@q6q+ƃec\P۵A~&`}>յ^s\|9'6{tXR7D +~Kxdc Mv-'z-1jPn)&k7 8 F'6l}s3C?[R007mY+5f 푷myU % ؀ ġ7X$ENYƾ9I`EȄ l/;w64u5mMX ̢[H^T=7ٚQ &~7Z *}?]03k}혚b^׽[؀)>:~<0)K3ļ1ûfsNJ2WK\1p&M'ػ>y7^Ĵ} qKW{O&mm޾UoWs8[EInG |"'x7$2:?ǥ<Y99}yrmc?u3HK0m-7q5Xϥ_h5r<;e~.ߥnw>y+9wI>\7j^|dG}=ۂG2-M˹ ˿<5Ydgх9V:@+.!< B`SXX&27N6p[ ϓNOtT7qEY$RRn63'b C,q(L\в0*1"_^'빗(¢1GP“'osE> EBr X L(,ƂCCmlQM6$#`&_OG{'OfG!s$h'UÈ<ΜeohFN™AVd9 Uq'.m0G!R]kySC< ,jaF<̭T^G_Jѯt\*;O9Cc:کokBb'; ʛv~g+ata^R D)̙U>97U} Fa }GJ 8^-R;p<`泩ϧvXP,j17:W`'<.h qqLh,bB:lS +؞o!;"qΗ[21lߢO`/ =W'lj56@9(h㺝M@jAc#ŏ׸'4/xEF#]OGRl<_ 1V'dD&Il0ݟ<},PX (⹞`v"x@%s }'LL2A><(8oケNk5jc̟웿s0zr[6rIH9qlS^o11s<ָ@]PT|:ON6)F;:i{\4Xb2qӶ[/mNel\ϳ0zS$u0rsg>_կl9ک{3yrƙm`'[[r#^35+ksyl^N s%stoߕ#x[Y˱E҉Gw:ѝm⭋^6wdݩ]NOLN?w+,6k\o)wp9ƶsĶz'ey8lAgXok㣨DZtkƻ?>}rގ?,ւM{$9$Esmɲ!@m˳{=5K'^oKn?ȏo1M< ;*eZ_ur={29r]oھh;ٛNTywx]kiKlj>_Ƨ_}3FD,θy?X1(X7OtD/[-f Pe#_N'epYc]Z!Ilea=EBk=x=KDQ-j"Q{b`1U,z l,xD[t OпKzEwxbRlRIЪi E>>U2jיhgA^O|/AO2WXpo Y(9gS h6J|& bn#w.6W(zaǍnٔK,bLq'WmbS|z^,XUs[@i &A۴mpi~E$cl<2ܣ ëTh':=O u#cjCƎ:= ,!ײhV`$6tA3DƱ~XL`QB`SQZE`~OƨB iOx6cM6M'`n) l`kaFY)/ܦcчآ$'Gϸ< v)DqbA28q_CbïE ca8œџa:o%XFg،.[E7|a=uXC%b%#F >F,7X_Z/ mR9.6Ũ1TW$ƥb(;C-dĘsb905qɤ}?u`x!9gl.Q9(,+E'u^qӖd(o[jAoh2PcD;[ }\6.Z܍G4g5WƬv\01Q@^~Γ/|nş/|iPK-}Mw>'ı08663Lr?~̦?mD)FO@ ̱a.:rȔ-veU?6"a0lsx#PJl'm(,LE*K8ņ6F5( hM aFmiu{E/uҰ-K'U V<2ۼ8 τ=O;8LǗƹ 8cL\{ъQSW)C^ŢcX6bJW}DVeΓ\L01>ݏMǵJ4Q̓mγ2%T_ ^B:&/98(O$P 9g#7䆱LLM9M7j5S$BG m5&hrPMj3SRE-LY@.:Ya~цhr )!Zgٕ28/h }P: n?mbiKo897#7ZLaI^qCVOO~74RKx&f9x=9|8qd-E7Udo-R1\bs 9ӢLL6l4ei6or-`@߻t\dFu>V"kj'`z纀u`ڬAl}^7\l?>{V觏6tF?R#,7aav{/ÿo~^O@@6l8@SFZ m+#Z9wBI>\7왟mg6.<'5~뺞m}e8Nz;W?O?3_֦wFϹ EcS?ӻy %❟:x#aٶǂE{Gh!"5\YDfɓq[wxsʂn"&ҵũ_~16(Fn?:P҃ڦnGkBZ?­涍Up,_7i3Y4R5^|!ݨgOݰ")OWEbx2#• m!R7@L_hGibܹ>bQ_꾐'|aXДAn.nSL=5F?tR2 jtؐXR;N`ΘXal2͆@E2N}'Paf a>B12m G촍1dz>3=ՃW;+U<c1IqV`&3D#:`ˈY%ؓ^1 2z̛*NT/ڃ ~Cc`G~S7$bXF̚,3D'Rn&<$L1?ڇ@ x~ܮcڧ~85F/;Bg"18EEc!90Œ: #JĊx)4fEDν"j ^2QOh$#GclJKgSqFБn ;\ Ggj ?^~K=yㇿ_Wy{z:V 0!Lo?_o%IX#?EyR ⪪˸й01o"-p# )6јX*09fϘOבU8ܦ&/mĆ[{I]_h "8_FD>\/,l ަpvcl_͞٬#B14FچOӡӶ6MG,+C!6D'ӉMYr3d=4Xd ~^ `43xJ  =0Xx~vQ/a4F|+хgGڔqsrxe_'&N/CLB~eV))Ήu+vs?WLaNm}}6[Ghv'A68AG%6t8c^1 m8͢GE_& 77|))=me#F Wq/%☓^R_7o_ir0qoԽI*7ڇ1oK5N1Oo>l;C(iWǐ#9')n6ji6'Se`Ź z%7WU[VLegG=bFlmYV:^;lGǕ\6&$/1k~X,şĜdzs>o9:YloΙ:4oҴb]o䷒|_ng3@Xvdf缱56ZvlI5(3KIYhnlyt'\<ڜ| ~pYX=iGt[W_■_;6i (ϧ9URL.[xNvć6ewn^ΗxY2}GWm>@Q==]v>gϕm?=[r-h>x___㯟~ݟ^igd“6OxϘ:nby[}y{.ڏ'-drۛ'7r̓+t"ꗺ7=͙n2 MM,4H Hh7ȓm(y.x?kX$Mb!cjǫxYvzt凧/iចMcⱑD$-hHOЬ7xqaPP~f~Ix/.+ٰLDG׹ޭ +Eq l&Ga[8YF_b$Z(?`!z,M,³,VT,Է_7ۍ@2h#K_bũ(3xMbeW}/ &3DvqMX_3cEG\lnQqH퉤é6,Y{CmPJ,Ri9;{{d=ǁ ft$6N/ZbGLOJW,!G} Io}]Cq"0@D'} XhM„q}q8"}Xh BY`☊2")W; j`_OR < 2b#{d(D ,|;Oc,h'm~KpA>ऋv1W8eSUlPܴ~_l29"18#А@\^G&;qi D\-1ۮDb^fn1إ?!B@U6=yAxOx2 4&fo[g le8U X>Ut`pX3xDW~n<6G|(ldZ`@;OW1K5BqHXF$+e1gah7qkǘ;8ic̋7Pnď(lh9Oy`v'-䟞cLjT"C8bcrZ"1'IpZ[{x0ƨg`(y4B^Ql^j7i#p+{9tşqp+6ٖ 48OhB8KR%쁟^#xM<|c0?G0e6J<OSXڤ4a;€1µ 1AIa9V48bl4(T6x2:Vmca5xcOcAxfjj=1dc) l1W3-k\/n6qXF LB L4%m^؂o9.R+tPJq +m9;e>e.{.}]cGr>{h?Z@J^LG.m%9m9QC7KQ|4)2ӳ ͋(zu}aًv?hZǩ6lLôJ)+~X,cr"Y&7[狽되k{8p6:1csnFҴBP^?}iK67v'rK7oF"oW:o#OhY;顶?}rw&˭ɹ`FqM;,Xk;}F=ЫQ>̏+Nތ.XdPkϿk?Wo>{A[8^Bh5]F|ȗzHH޼Q[y>Q07*hYe3??'c]r.Fr=}i}S}u_Oԟ}?"<́ vHDyT xj7c_| 7/ɓ'  m7u`sW4!#т[HS }eO3:czsAl,eW D!x:t٘6SaN#V1 c," WՍf>/)*Fc'RXCJPh d$z,f86Q,,#X@HyL88P~S&;mǸi&گ[BAd?Alj-`<̵̏ȈOhQs+#[6|懶~ N4~b*=b %um ĔEzMݯ?XS;vrz':8HoU8}Vi [ "&AcP1FS̭@hj4m̈NO.>9]E[ ~*Mc64t.ό%l-s>W?6BZuWm&ŘPݎ6IG397Ƶha ۘ$ѺvMP69(_{LbC j^ysek{2tmn*M2jPil%lh{OD§2iZH)C%#4GLmᄩ|'O./ ;O38?;L7cйT2lcrU* F#8_~BDd8H?2r?]ص9Cǐdc^MxƵb8צ^q8ϸN`㫳vL\q?s|4$\qyv_w_? xq]D?\0mIkJCM+1榶qz~5@rjc˵5ݛl^|G:Ҫ>'ڕhN 'Aܝk75B<9t>k`ḌB>kb1ܕ"RS%mț6C7lv>{i(f/;{p*nU/VS+S;V\ee͔MD@xv1Ǘm-?S[F9sK \V}XWO`FS2*Z]|n\OYGp>tA#Gx^WZ\g$L0{2_.w*l]'WR,Xr'c%q6)o*4+w]W\篝ۦtqfC70w d?|]]M~2o'w$8WN3Z1&猌Z>J2ʷ@ _ !e'47wbU}oAb=atz?K_l{`\w45?սN?'_ 8?̛2(TQmS\_oLf0m\_4gr>Wzsuy@=F-뙟\lQh%^HnDiKGO皑M|(7?'/{KO~ _<~S_"⻺Q־ųcnsͳgtt-7ҹ,S<~EA t^Z^ !- x,L )d 6{c'q¶?Mo}gn ca{O! M6? r \)HD&W3fW|JJycRP#mD8ٌ(g&nOebXƂaZdqYl3*ӕl#(.'ZT8U^s -lؔ";XyI <FBV6԰c HEV8,0X+ء8e1O\EɱB%.,ΝH~>?COɘ`ǯccF(݅I+S1L 0ˌ_+ne}'#}X}hD#fy SHe, OG@ F&i;n/91Q 5q,hԨ R AA>kkO<щKp?pP<ѰOX<7FE_1ns{1WKMxڎxכ7MÝcXvGg<vVo4d>cF}6ÊEZT[z.7=ox4ٰMrۥln'S)-؞bVl\ʎE2@. OL4j_H1VQT,q'c&v?v\ll?ͧǛi;bac͇JNz^\I's Qҥh<!V=sFN+ l0̫A ]85F̲fˋ mFoO`i;=^uC87v93F9%>8~N#G7Ct=07bCb`o6crXfl#%}"P Qŏ}qx[>7<1GFgp}@t-B 1ƏZ%x4i"Wlb?oW ] ,8ӷv`e|0ixtI]h릦16Zl]5)M_b%t dN:+j٥tm_jUoڝhӴ֋ƃZ&0] 9|;|N̴\Ρe\[*S6lPVm@6'(fkM,cW(20}`rZh4ϜO½N^ЄקeX x!0Cv0ݖ9v9WwQ\x $D4ǀlMwCwjn@눭.SnW] [o ƅ_,uTNa#fna>cy?fMi<9N!짓O}FK 0}SPM VUqZqݟ,;qwr{]Isl޺-v=g={?o}{w?+u磝%T6lÝcBu{z_G.rs%:]>!repygZ.[/2suf%@G,k~sٲ֗MM_#VFei}r3_wkiN89!LNr3}Ѡ;ިѬ[y!P@!P@!P@!P@!P@!P@!PγLedLweM eM#sëO ƊC^fˏЖU{NK4Iur9u[N?]w\[kf_M‡;&9ظAN)7x8Ls1gs9{^u3J@!P@!P@!P@!P@!P@!P@!PM-x;'~,ӷ:=ul`٬1Hd_Hk2=NwG~_{ޮrS~6pnN F6G4>9:zsF:sYr5ocyQ-ٚmd~nߙͻܰqz4nn^7c5٬;ҙe#p0ݘdr˛,cZe(G9,ndZm{IT!P@!P@!P@!P@!P@!P@!P( pnjKTd\.MgYYﶼl㍕z_[LEf _l#C߆ݑLH/5?rg^ֳiޗ e9-]&vs=P5ޮ%W@!P@!P@!P@!P@!P@!PcOoy.;Өg\2snr}n=z#^&ZٝGvFOߥ vg {V|bF##mi^_olʬkޮm#nZ,C~αD|ɳ\2E/ B( B( B( B( B( B( BG=}/3ew{^l\ϴoFOtGlo<l<禿~}\x+{mD}ɀcunsmgyMe9љengss@!P@!P@!P@!P@!P@!P@!pFk=-#ixMer=ѭJ3@IDATMΜ=Z&Lwmo6ذA^ut }ٝ ŠmFoG}SsYengK6dW@!P@!P@!P@!P@!P@!Px-t4zz<7y3emo˹ezL>e9^v`wacaؾ_?g$Ǒ#fև?Fz%22)m+3-)gzQ2Ms]gڨ -u˓%X+~!P@!P@!P@!P@!P@!P@!P"0ZiVM#eh,3gڜl$i1m}>2}9;ZG#hob\@4EQyku0`fZo4Ql|iWڜlljL^[ges9!zydwzzQMr -B( B( B( B( B( B( Bx#]R=\sZe[6#e~O_˺ks~#YZzlrZ/f޽G6k<,˙OYRѲ :#LӚ:nz_L2NiFuob) B( B( B( B( B( B(  Fk=mnsPsyrL7g'GL[il7ӭoLwz_~-i}q~ B( B( B( B( B( B( BoʥzK4r>*^#Hrέ;g:}i;LwjoW}Z~6hMrkƓA_Mb;zYM͞z7[t{ur߼#2mT RL_O*@!P@!P@!P@!P@!P@!P@!p^3s/'םg]R>3-ٸS}lؠAokoPm]Ь7e,Gmeg?Nn#[mhmlmK( B( B( B( B( B( B(>̭+z]^˳ỸtRs e99-gLnۧGP;}6F$pR^Q'I9:n%XE4!f?i~ַ\esn>Gf.gez:J@!P@!P@!P@!P@!P@!P@!P'^>zZG|s鮓/'rdx־3/]t۰ml6lg^.[w*7ݙ6lDc`$l_Ӈ9;e%dyl8֬ F| aߖme-缗8D3rB( B( B( B( B( B( B=-9r}\G:2mlN/QB( B( B( B( B( B( Bh a/Tj B( B( B( B( B( B( Bࣉh>#iKs9q\2.g˙i=^Ӛ{Ȑl.x0k'Rw2 }6l,ۉEP,"u&7&zo-GeF|ˌbi}]sLwr7gs$7GXf}6z]k B( B( B( B( B( B( Bࣃm{z\%2Kel?uL>-ezT z湼 C6l"6f{n\|IA4gM˲T#˽y3D(OQB( B( B( B( B( B( BE`mͱ/3oT>3r_LϹ3osBm4^ƺ7%v\nS_[uȆE+L-gm۳LTB~N':ͶM6Jǒd=;<#z͕t{3o@!P@!P@!P@!P@!P@!P@!p$weQyf^n#^&Ӑs}g>eҜ^?ˆٞer>];gz\e]dĆ Ƃ(N͕{ޗ::9ysR<]t,cy>>dHYQƴ9YuEԷkR]@!P@!P@!P@!P@!P@!P!Я[SOo(_e>e>w;,zΑ#Y>s{N2%ۙ>WBqijA60/»oP}}f?#y6.Ϲ}ךΈ1r6iEnwal@!P@!P@!P@!P@!P@!P@!ԞGLsL}Fnsݦl٦ston_#=xsii}}ֈusy$H;tƢ``A\h/`0]gK]k(m|Y6L B( B( B( B( B( B( B#0Z[i˴-]vL۵?\\Nȑr>kzӸ 7-_og'\9waY'r96۷ގ70,6,kRykI>vE&۬r!P@!P@!P@!P@!P@!P@!PoZlO[gިlR>Ag٦젱fkku}˱bs,V^[{ B( B( B( B( B( B( BhzΉ},TM31d!e#_J}nޮvrr,o6lеt8yl_Ns1f۔Mپm-ss|9_sroÚήᲫ~@!P@!P@!P@!P@!P@!PZiKu󜃤#YhTwZf-rO4ofjO\:ss},7l,/z؎J|N|sr{&zz|Y !cľEtL-KEm|b}[B( B( B( B( B( B( Bں.iKue禹>h\㟔wҞ_ه˻{;}}d2G29GLްaX )+W9-%sr#Ci]ya$3@!P@!P@!P@!P@!P@!P@!p캖FO[_.;7mn:呬i_Rw^sQyln{ZFux-t[_ُk6:|N~n{k|9*7&ػ /B( B( B( B( B( B( Bx;xs6zR<3*\-)ktܾsN٩ݴGK/3[Dz}>Vwas^6˙G>h,2>FN7zr޼0*ۗmY'綝^<>*7_tr3fR!P@!P@!P@!P@!P@!P@!P|2kw‘]hYe5*\ ?Ygy >)ɴ&uSκY6m閧>J#γL+gYwrް]w[ d_#L+;7zNK}oX?hM.*gk~*@!P@!P@!P@!P@!P@!PGzoZq91ʦ<ˣ 2߾RcNgsediK#[ڸ6F?j4GwϿj2KwI7W89L}:@!P@!P@!P@!P@!P@!P'aO۵Fer K1͹k9&l:-ٷ,ky.#?rGaycRNQN ־x_6gXg]Y1k^@!P@!P@!P@!P@!P@!P@!P|zK4xL[*<k>>r{{n[rϣS_7oD7m-7/m ~mvry_[#LwzN3Ce,|c(^kNr9z/O=dzeo( B( B( B( B( B( B( "0Fs=rO۔sx$hۥܴG6z^&9Y.G%ykywM~~yM~i5 򆆾۶uꪘz".*~"      }uT\;vQkg14fGc׺WNj1b폯}51Wn4zj{S}BW_w{uNyorը3qT9կjr>r,y+1gu9}N/5       ݣb1+3Vyg]ըWLFXEzTsUyOx{/uF|ًUKPsZ^w(*Zլ}b^>^s}fx.UN3G@@@@@@?_zԣ 5zwƪc1שׂ1rz<^U,3[+z4רj\կ[_؈˭^߭Qh׽.c^<x'y~T;#>guiߜ;sN{7׭vC@@@@@@}/xU9ck_'5O=rOţޜ_]~ƹ:wU\c}sޯyǓWh       p@MF9<}+#x5bZF^"y|e+^r ֑3+"תWzf s/㇇zrlcyQ1Wx<ɹQS{qFT~;aD@@@@@@B ڼ弯bWƪ'bκC1sww>UkUs#ZW5s6}g/l;/wu4F;Z1zbQ㵱ޱW<|/9dx56:5      O;s;cU19aFiq{U9TcugQhT}gZ\{ : |k*\5^ctQw#}b{(yj=E.VD@@@@@@ ĻSrl\5ŔqX{;uzU7yU141#cj#uySScuZb͹:FΣ\WU1@@@@@@3VWr֟s;k\cI+\Z5{\kyWNLi       Hzט[^x|5>ݵ>g73Z{owը=}~ū狀؏i*//l嫗XZs~,\>{}5=4W1QNWd?:s)ƈ      <%w\V[sULjټ~Ws}15F>?ʍFW(VU;˩&n2_؈ NO׫yWʘ{P~ޯz?U,wY'y       @G wz;Gܟj1\cSGgg'U5zbfֿ(qID|YL06}"j3Qx,ShW{owQwQ_+O9:v @@@@@@-p]a箳\֞[͕c|x<.rMƣWSXb/lRxW1trO|bSMwu;ӧZby:sj}QO7(6"      "z8Z+vexsS1q77<}9ZDêU<׍_͕2V=9?';}ws>w?@@@@@@@]2=<=Wg1:s>k=1=WϵѸʫNnZa#._ThP}Z-ը{TϪ\51MߤvJ7Xg^u75x,֣x      |owO:گwb^3j댳*<"7ʏr;޹k\/lD15??F<>uby?r>jO)3j^W㵳r_}r.E8       pGAj>/Sslj|^9kjUnjW]_+5WHPt^~4z~Sn5Vy,zbULaޣu'浹>rο@@@@@@|λYMgx|5Zvi^UlSծbΪ:99Z1{M˹']K;!՗FYz\cr1zg55XW뻣C{W8GW̽y=?4˽z?O*@@@@@@@חclj>)Ǹ{r|UݘcSO1F@@@@@@@iwz:1yjS}{]~ϪnW:U徣_؈K jx'5'C.Fs3Ty"׹^Q]G9UݪV=       @GEGwԛ;kݙWiϠYZyG-r>U,j;5}6"R_*v^WYL9~ŮGs=ʟr>uQ<嵇ת'^@@@@@@n>1;:Fzr弮TGC;{U5ӣ3c;T]SqEY~ \7[{n5X'Nj@@@@@@@{*cy|._|UF?[yϑ qK_pT׍纝V1C[1*j^VuXCأ\}ߏ ?@@@@@@@.rӏՌrU_a      d{ʼ֣x'5>|3jwcg|5j<澜t]}A Y߬ubףyܧU1gu9xޯHF'      xy|ļo7[wz;ysZĢ6+R\M٫U^מՍr9ױwz4}8{}Gpe{:fx       @W;ѻn<|WXW*6oԓT*^Ŕ;޻󅍸 Y(Wslg=jʻ]֝4ڧ+?t~QV,@@@@@@@{}o:d_rlͩNc|Sy\g]D,+9y]g62łVu|ϱs'wY*+6wjG{ퟆNM7ѧU       zxWg{W+3[{~{,k(6GnwhX_;th*މse1{W\G_N"      =f5Uj,!8ϟSݳW~?;S۩QwbfsW~Ⳟn1G@@@@@@-y>\zsuU3\qwjw^:x'kfnJt;n_8uGcA      ltevs>9knv3}Y]uU(6G˞_؈U;WN,gͳͨ㳞{a>u"      w\Ucwֳ^ύa7ʍⳞzFY˹:jޭ@@@@@@@Oy.vֳZ<~Ggu9wb]1E+6Y]>_|y}"Ϩ֣X@@@@@@@?MXߝ?9WƢ?|+*r׶K|};S;Tv">z}G@@@@@@@$phxUcwֳY.~y]YW=;'sYl qn>ڪ~rWc[.~U(6GnTgz#       ~U?ˏrU5wwz>8:1=[;}a#.U]}u9GY|-wG@@@@@@N ljF*މO_nuG~s]իU|6ԏjNy]}\sfWǓ?+O@@@@@@@T_ ݾS?x'v&^jϪFWة;_Fl}A߭Kvzf5\}y]պGUF<|WUgk[Y#      O 쾠_\:~zvbڈS٩Y7/ljF*~2+ue֩"O?r|30G@@@@@@>A`~vUmu8jjF'g׎޾}wVjFxUۉ&g=3:Oywjν{o@@@@@@@w+/e?snvV3īPɱZSbWⳞ>rqg6b;]ylQD<#N]FNwkg(:K<}ggC@@@@@@!py۩ՌrUǩ9ݾWx=fU.}e/lĵw^Ԋ3z>)681=4vT?O5;      '_wjF*^Z?)6"vr:{/lW^w{VuxGThY|FOuW:       .pEjgQn'^vcqUݨJ>XgU7ˏr;;3>3}U~vG;ڃ@@@@@@8)pfQDڣUlT;r|3+[٭Իln.[QN|v=gsVqv\@@@@@@/}Y~;r_:gvƫ~znSu{Wu(7\^zVN[u>לř?!      @O+^_9ӳF=;QmFQ|֣Yj:xmwPnOkK3g}ܩx8^=UqV=~!      %p%{ٯ[;;+=>QU^cN>YO_h+/گ9cVs:we+=;NƝZyO       /wԮjfQnQnEoNvUs'7>+fsog\}       '  IDATNݫ[{2P];ާ}:Wڧ߭]}u>>ݚ+sg      |ݗ;5=w:Gu1zW(: ;qnS~9=uzwPϕ]\=       _>sv:'jV{Aԩ٩{w_nɗw+=O ΝdJzxr7k@@@@@@@Wt>&~O;s{5ǝ^K;Gd]gNM|n#^9{#      Yn}TM:{Dwo;{erwzzWvjΧW6>\r       {!W֟;/W>}wϹۯ}enm.TsOc      |7;_ze'jksOx*|~peݞj3F>guC       y7g?Ugoq]Qou?ߧ\g٭w;{X#      ,pv{wwjw[>~w}/쇇ĉ3O׺ߕݞ\Wzy;P      ^'^cg>>敞;}{?{~W?q=2Ν=^;_ۛs      |''^j+=y<=|~S8=?s̯ʳܗ@@@@@@o9oTξϻѯj<};cNX'ǝwOg0G@@@@@@S/{N~w'^Oyjkk'qr/<=<_g~A@@@@@@v%3u?OQN{r'@?}9橽?m'>@@@@@@r=?mx [.O~'?W~g@@@@@@@w NwrwxzUwn>%zb O~jlrw]ysҏ      >=u'}bLOオO}3So˧{z>b)X\4       O3S=ow{}{ zd/~y_yvϟِC@@@@@@W+?w_ο:g ;|N@@@@@@/|uwѪ/>ĿE,:?ΝQw|n@@@@@@@Ϗpi]wz9~1ݦ??׻~U=@@@@@@@^w=w7gcw?e>       K_q8{r?W_<>l      _$Gi0$τ?.+       '|җ">.o%߹?S @@@@@@@/A|꽾wŗ;ݵ@@@@@@{ӗ]/gD?3m        ''~OL{՛ռ ю֍Roъ      %p~3/߀|~?7hE@@@@@@_?𡿘7_7s      |@@@@@@@@ÖυlIENDB`dtkdeclarative-5.7.12/examples/exhibition/main.cpp000066400000000000000000000062341476226662700222330ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include #include #include #include #include #include #include class Object : public QObject { Q_OBJECT public: Q_INVOKABLE QByteArray readFile(const QUrl &url) const { QFile file(url.isLocalFile() ? url.toLocalFile() : (":" + url.path())); if (!file.open(QIODevice::ReadOnly)) return QByteArray(); return file.readAll(); } Q_INVOKABLE void replace(QQuickItem *oldItem, QQuickItem *newItem) const { newItem->setParentItem(oldItem->parentItem()); oldItem->setParentItem(nullptr); QQmlEngine::setObjectOwnership(oldItem, QQmlEngine::CppOwnership); oldItem->deleteLater(); } Q_INVOKABLE QString sceneGraphBackend(QQuickWindow *window) const { const QString &backend = window->sceneGraphBackend(); if (!backend.isEmpty()) return backend; switch (window->rendererInterface()->graphicsApi()) { case QSGRendererInterface::Unknown: return "Unknown"; case QSGRendererInterface::Software: return "Software"; case QSGRendererInterface::OpenGL: return "OpenGL"; #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) case QSGRendererInterface::Direct3D12: return "Direct3D12"; case QSGRendererInterface::OpenGLRhi: return "OpenGLRhi"; #endif case QSGRendererInterface::OpenVG: return "OpenVG"; case QSGRendererInterface::Direct3D11Rhi: return "Direct3D11Rhi"; case QSGRendererInterface::VulkanRhi: return "VulkanRhi"; case QSGRendererInterface::MetalRhi: return "MetalRhi"; case QSGRendererInterface::NullRhi: return "NullRhi"; default: break; } return "None"; } }; int main(int argc, char **argv) { QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QGuiApplication app(argc, argv); app.setOrganizationName("deepin"); app.setApplicationName("dtk-exhibition"); QQmlApplicationEngine engine; engine.addImportPath(CHAMELEON_PATH); #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QQuickStyle::addStylePath(CHAMELEON_PATH); // QQuickWindow::setSceneGraphBackend(QSGRendererInterface::Software); #else // QQuickWindow::setGraphicsApi(QSGRendererInterface::Software); #endif #if QT_VERSION < QT_VERSION_CHECK(5, 12, 0) && defined(QT_NO_DEBUG) QQuickStyle::setStyle(CHAMELEON_PATH"/Chameleon"); #else QQuickStyle::setStyle("Chameleon"); #endif Dtk::Core::DLogManager::registerConsoleAppender(); engine.rootContext()->setContextProperty("examplesFiles", QDir(":/examples").entryList({"*.qml"})); engine.rootContext()->setContextProperty("globalObject", new Object()); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); } #include "main.moc" dtkdeclarative-5.7.12/examples/exhibition/main.qml000066400000000000000000000115631476226662700222430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Layouts 1.11 import QtQuick.Controls 2.4 // 确保在最后引入 import org.deepin.dtk 1.0 ApplicationWindow { id: root visible: true width: Math.max(contentList.contentWidth + navigation.width, 1500) height: 800 title: qsTr("DTK Exhibition(Scene Graph Backend: %1)").arg(globalObject.sceneGraphBackend(root)) // 开启“圆角窗口&无系统标题栏”模式 DWindow.enabled: true ButtonGroup { id: activeColorSelector onCheckedButtonChanged: { root.palette.highlight = checkedButton.color } } header: TitleBar { enableInWindowBlendBlur: true content: Item { SearchEdit { anchors.centerIn: parent width: 300 } } menu: Menu { Action { text: "Light Theme" onTriggered: { ApplicationHelper.setPaletteType(ApplicationHelper.LightType) } } Action { text: "Dark Theme" onTriggered: { ApplicationHelper.setPaletteType(ApplicationHelper.DarkType) } } MenuItem { contentItem: Item { Row { anchors.centerIn: parent Repeater { model: ["#d8316c", "#ff5d00", "#f8cb00", "#23c400", "#00a48a", "#0081ff", "#3c02d7", "#8c00d4"] delegate: ColorButton { color: modelData Component.onCompleted: { activeColorSelector.addButton(this) } } } } } } } } Popup { id: sourceViewerDialog width: parent.width height: parent.height modal: true enter: Transition { NumberAnimation { property: "opacity"; from: 0.0; to: 1.0 } } exit: Transition { NumberAnimation { property: "opacity"; from: 1.0; to: 0.0 } } Overlay.modal: Rectangle { color: palette.window } ViewQMLSource { id: sourceViewer anchors.fill: parent } } RowLayout { anchors.fill: parent ListView { id: navigation Layout.preferredWidth: 220 Layout.fillHeight: true Layout.margins: 10 model: examplesFiles delegate: ItemDelegate { text: modelData.substring(0, modelData.indexOf(".qml")) backgroundVisible: false onClicked: navigation.currentIndex = index checked: navigation.currentIndex === index } currentIndex: 0 onCurrentIndexChanged: { contentList.currentIndex = currentIndex } } ScrollView { Layout.fillWidth: true Layout.fillHeight: true padding: 10 ListView { id: contentList spacing: 10 model: examplesFiles leftMargin: 10 rightMargin: 10 clip: true delegate: Column { width: contentList.width - contentList.leftMargin - contentList.rightMargin Loader { source: "qrc:/examples/" + modelData width: parent.width asynchronous: false } } currentIndex: 0 onCurrentIndexChanged: { navigation.currentIndex = currentIndex } section { property: "modelData" delegate: GroupTitle { text: section width: contentList.width - contentList.leftMargin - contentList.rightMargin onViewSource: { sourceViewer.url = "qrc:/examples/" + section sourceViewerDialog.open() } } } } background: Rectangle { implicitWidth: 600 implicitHeight: 800 color: Qt.rgba(0, 0, 0, 0.3) Rectangle { anchors { fill: parent margins: 10 } radius: 6 color: root.palette.window } } } } } dtkdeclarative-5.7.12/examples/exhibition/qml-qt6.qrc000066400000000000000000000017221476226662700226100ustar00rootroot00000000000000 main.qml ColorButton.qml GroupTitle.qml ViewQMLSource.qml ImageCell.qml SideBarItem.qml PropertyItemDelegate.qml PropertyItem.qml Button.qml ListControl.qml Menu.qml Notify.qml qt6/EditControl.qml Popup.qml Slider.qml Mask.qml ScrollBar.qml Spinner.qml SideBar.qml KeySequenceEdit.qml ToolBar.qml Dialog.qml ProgressBar.qml ControlGroup.qml dtkdeclarative-5.7.12/examples/exhibition/qml.qrc000066400000000000000000000016201476226662700220750ustar00rootroot00000000000000 main.qml ColorButton.qml GroupTitle.qml ViewQMLSource.qml ImageCell.qml SideBarItem.qml PropertyItemDelegate.qml PropertyItem.qml Button.qml ListControl.qml Menu.qml Notify.qml EditControl.qml Popup.qml Slider.qml Mask.qml ScrollBar.qml Spinner.qml SideBar.qml KeySequenceEdit.qml ToolBar.qml Dialog.qml ProgressBar.qml dtkdeclarative-5.7.12/examples/exhibition/qt6/000077500000000000000000000000001476226662700213105ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/exhibition/qt6/EditControl.qml000066400000000000000000000171171476226662700242600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtCore import QtQuick import QtQuick.Dialogs import org.deepin.dtk 1.0 Column { Label { width: parent.width wrapMode: Text.WordWrap text: "各种输入框,包括搜索框、单行输入框、多行输入框、密码输入框和数字输入框,他们都可以在指定条件下弹出警告框。" horizontalAlignment: Qt.AlignHCenter } spacing: 20 readonly property int editInputMinWidth: 304 Flow { spacing: 20 width: parent.width LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "shule" alertText: qsTr("长度大于等于3") showAlert: text.length >= 3 } LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "editting" } LineEdit { width: Math.max(implicitWidth, editInputMinWidth) placeholderText: "必填" alertText: qsTr("不能为空") showAlert: true } Item {width: parent.width; height: 1} SearchEdit { width: Math.max(implicitWidth, editInputMinWidth) placeholder: "搜索" alertText: qsTr("alert tips") showAlert: text.length >= 3 } SearchEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "deepin" editting: true } SearchEdit { width: Math.max(implicitWidth, editInputMinWidth) placeholder: "showAlert" alertText: qsTr("不能包含非法字符") showAlert: true } Item {width: parent.width; height: 1} IpV4LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "192.168.0.1" } IpV4LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "192.168.0.1" } IpV4LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "192.168.0.1" alertText: qsTr("ip地址格式不正确") showAlert: true } Item {width: parent.width; height: 1} PasswordEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "123456" } PasswordEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "123456" validator: RegularExpressionValidator { regularExpression: /[0-9]+/ } } PasswordEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "12345a" alertText: "密码错误" showAlert: /[^0-9]+/.test(text) } Item {width: parent.width; height: 1} LineEdit { id: keyLineEdit width: Math.max(implicitWidth, editInputMinWidth) text: "~/.ssh/ssh_keygen.key" ActionButton { anchors { right: keyLineEdit.clearButton.left rightMargin: 5 verticalCenter: parent.verticalCenter } icon.name: "entry_loadfile" onClicked: { keyFileDialog.open() } } FileDialog { id: keyFileDialog title: "Please choose a file" currentFolder: StandardPaths.writableLocation(StandardPaths.HomeLocation) onAccepted: { keyLineEdit.text = keyFileDialog.urlToPath(keyFileDialog.selectedFile) } } } LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "~/.ssh/ssh_keygen.key" ActionButton { anchors { right: parent.clearButton.left rightMargin: 5 verticalCenter: parent.verticalCenter } icon.name: "entry_loadfile" } } LineEdit { width: Math.max(implicitWidth, editInputMinWidth) text: "~/.ssh/ssh_keygen.key" alertText: "文件非法" showAlert: true ActionButton { anchors { right: parent.clearButton.left rightMargin: 5 verticalCenter: parent.verticalCenter } icon.name: "entry_loadfile" } } Item {width: parent.width; height: 1} PlusMinusSpinBox { width: Math.max(implicitWidth, editInputMinWidth) spinBox.from: 0 spinBox.to: 10 spinBox.editable: true spinBox.alertText: qsTr("Can't include 1、3、5、7、9 number") spinBox.alertDuration: 2000 // millisecond spinBox.showAlert: /[13579]+/.test(spinBox.value) } PlusMinusSpinBox { width: Math.max(implicitWidth, editInputMinWidth) spinBox.from: 0 spinBox.to: 10 spinBox.editable: true } PlusMinusSpinBox { spinBox.editable: true spinBox.alertText: "只能输入数字" spinBox.showAlert: true } Item {width: parent.width; height: 1} PlusMinusSpinBox { spinBox.editable: true Component.onCompleted: forceActiveFocus() } PlusMinusSpinBox { spinBox.editable: true resetButtonVisible: true Component.onCompleted: forceActiveFocus() } Item {width: parent.width; height: 1} SpinBox { } Row { spacing: 10 SpinBox { width: 100 from: 0 to: 23 value: 8 font.family: "DigifaceWide" font.pointSize: 44 textFromValue: function (value, locale) { return value < 10 ? "0" + Number(value) : value } } Label { text: ":" font.pointSize: 40 verticalAlignment: Text.AlignVCenter } SpinBox { width: 100 value: 24 from: 0 to: 59 font.family: "DigifaceWide" font.pointSize: 44 textFromValue: function (value, locale) { return value < 10 ? "0" + Number(value) : value } } } Item {width: parent.width; height: 1} ListModel { id: mountPointModel ListElement {device: "/home"} ListElement {device: "/tmp"} } ComboBox { editable: true model: mountPointModel } ComboBox { editable: true model: mountPointModel } ComboBox { editable: true model: mountPointModel alertText: "不能包含非法字符" showAlert: true } Item {width: parent.width; height: 1} TextArea { text: "你好,这里是多行输入框" width: Math.max(implicitWidth, editInputMinWidth) height: 144 } TextArea { text: "你好,这里是多行输入框" width: Math.max(implicitWidth, editInputMinWidth) height: 144 } } } dtkdeclarative-5.7.12/examples/qml-inspect/000077500000000000000000000000001476226662700206705ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/qml-inspect/CMakeLists.txt000066400000000000000000000007641476226662700234370ustar00rootroot00000000000000set(BIN_NAME qml-inspect) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Quick QuickControls2) find_package(Dtk${DTK_VERSION_MAJOR}Core REQUIRED) find_package(Dtk${DTK_VERSION_MAJOR}Gui REQUIRED) add_executable(${BIN_NAME} ${CMAKE_CURRENT_LIST_DIR}/main.cpp ${CMAKE_CURRENT_LIST_DIR}/qml.qrc ${CMAKE_CURRENT_LIST_DIR}/dciicons.qrc ) target_link_libraries(${BIN_NAME} PUBLIC Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::QuickControls2 Dtk${DTK_VERSION_MAJOR}::Gui ) dtkdeclarative-5.7.12/examples/qml-inspect/Example_1.qml000066400000000000000000000334721476226662700232270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 Rectangle { MouseArea { anchors.fill: parent acceptedButtons: Qt.LeftButton | Qt.RightButton onClicked: function(mouse) { if (mouse.button === Qt.RightButton) contextMenu.popup() } onPressAndHold: function(mouse) { if (mouse.source === Qt.MouseEventNotSynthesized) contextMenu.popup() } Menu { id: contextMenu MenuItem { text: "Cut" icon.name: "edit-cut" display: AbstractButton.TextBesideIcon } MenuItem { text: "Copy" icon.name: "edit-copy" display: IconLabel.IconBesideText } MenuItem { text: "Paste" checkable: true checked: true } MenuSeparator { } Menu { title: "Find/Replace" Action { text: "Find Next" } Action { text: "Find Previous" } Action { text: "Replace" } } MenuItem { text: "Exit" } } } Label { id: btnLabel anchors.leftMargin: 20 anchors.top: parent.top anchors.topMargin: 20 height: btn.height text: qsTr("Button:") verticalAlignment: Text.AlignVCenter } Button { id: btn anchors.left: btnLabel.right anchors.leftMargin: 20 anchors.top: parent.top anchors.topMargin: 20 text: "Button" } WarningButton { id: warningBtn anchors.top: parent.top // @disable-check M16 anchors.topMargin: 20 // @disable-check M16 anchors.left: btn.right // @disable-check M16 anchors.leftMargin: 20 // @disable-check M16 text: "Warning" // @disable-check M16 onPressed: console.log("WarningButton pressed") // @disable-check M16 } RecommandButton { id: highlightedionBtn anchors.left: warningBtn.right // @disable-check M16 anchors.leftMargin: 20 // @disable-check M16 anchors.top: parent.top // @disable-check M16 anchors.topMargin: 20 // @disable-check M16 text: "Recommand" // @disable-check M16 } ToolButton { id: toolButton anchors.left: highlightedionBtn.right // @disable-check M16 anchors.leftMargin: 20 // @disable-check M16 anchors.top: parent.top // @disable-check M16 anchors.topMargin: 20 // @disable-check M16 } IconButton { id: iconButton width: 36 // @disable-check M16 anchors.left: toolButton.right // @disable-check M16 anchors.leftMargin: 20 // @disable-check M16 anchors.top: parent.top // @disable-check M16 anchors.topMargin: 20 // @disable-check M16 icon.name: "org.deepin.Example/test/action_add" } IconButton { id: iconButton1 width: 36 // @disable-check M16 anchors.left: iconButton.right // @disable-check M16 anchors.leftMargin: 20 // @disable-check M16 anchors.top: parent.top // @disable-check M16 anchors.topMargin: 20 // @disable-check M16 icon.name: "test/action_add" // @disable-check M16 } IconButton { id: iconButton2 width: 36 // @disable-check M16 anchors.left: iconButton1.right // @disable-check M16 anchors.leftMargin: 20 // @disable-check M16 anchors.top: parent.top // @disable-check M16 anchors.topMargin: 20 // @disable-check M16 flat: true // @disable-check M16 icon.name: "action_add" // @disable-check M16 } FloatingButton { id: floatingButton width: 36 // @disable-check M16 anchors.left: iconButton2.right // @disable-check M16 anchors.leftMargin: 20 // @disable-check M16 anchors.top: parent.top // @disable-check M16 anchors.topMargin: 20 // @disable-check M16 icon.name: "action_add" } DelayButton { id: dlyBtn anchors.left: floatingButton.right anchors.leftMargin: 20 anchors.top: parent.top anchors.topMargin: 20 text: "DelayButton" NumberAnimation on progress { from: 0 to: 1.0 duration: 4000 loops: Animation.Infinite } } RoundButton { id: roundButton; anchors.top: parent.top anchors.left: dlyBtn.right anchors.leftMargin: 20 anchors.topMargin: 20 icon.name: "action_add" } ButtonBox { id: buttonBox anchors.left: roundButton.right // @disable-check M16 anchors.leftMargin: 20 // @disable-check M16 anchors.top: parent.top // @disable-check M16 anchors.topMargin: 20 // @disable-check M16 ToolButton { checkable: true; icon.name: "go-previous"; checked: true // @disable-check M16 } ToolButton { checkable: true; icon.name: "go-down" // @disable-check M16 } ToolButton { checkable: true; icon.name: "go-next" // @disable-check M16 } } LineEdit { id: lineEdit anchors.left: parent.left anchors.top: btnLabel.bottom anchors.topMargin: 20 text: "Testing the alert message in line edit." alertText: qsTr("This is a long sentence.") alertDuration: 2000 // millisecond showAlert: focus } SearchEdit { id: searcherEdit anchors.left: lineEdit.right anchors.top: lineEdit.top anchors.leftMargin: 20 } SpinBox { id: spinBox anchors.left: searcherEdit.right anchors.top: searcherEdit.top anchors.leftMargin: 20 editable: true alertText: qsTr("This is a long sentence.") alertDuration: 2000 // millisecond showAlert: focus } SpinBox { id: customSpinBox anchors.left: spinBox.right anchors.top: spinBox.bottom anchors.leftMargin: 20 editable: true value: 1 up.indicator: Rectangle { border.color: "green" anchors.right: customSpinBox.right anchors.rightMargin: 5 width: 20 height: 15 } } PlusMinusSpinBox { id: plusMinusSpinBox anchors.left: spinBox.right anchors.top: spinBox.top anchors.leftMargin: 20 spinBox.editable: true spinBox.alertText: qsTr("Only numbers can be entered.") spinBox.alertDuration: 2000 // millisecond spinBox.showAlert: focus } ListView { model: 5 implicitHeight: 250 delegate: CheckDelegate { text: index; icon.name: "action_add" } anchors.top: btnLabel.bottom anchors.left: plusMinusSpinBox.right anchors.topMargin: 20 anchors.leftMargin: 20 } Row { id: sliderRow anchors { top: lineEdit.bottom topMargin: 20 } spacing: 10 height: 350 Slider { highlightedPassedGroove: true orientation: Qt.Vertical height: parent.height handleType: Slider.HandleType.NoArrowVertical } Slider { height: parent.height orientation: Qt.Vertical handleType: Slider.HandleType.ArrowLeft } Slider { height: parent.height highlightedPassedGroove: true orientation: Qt.Vertical handleType: Slider.HandleType.ArrowRight } } Column { id: sliderColum anchors { top: lineEdit.bottom topMargin: 40 left: sliderRow.right leftMargin: 60 } spacing: 10 width: 400 Slider { highlightedPassedGroove: true width: parent.width } Slider { width: parent.width handleType: Slider.HandleType.ArrowBottom } Slider { width: parent.width highlightedPassedGroove: true handleType: Slider.HandleType.ArrowUp } TipsSlider { width: parent.width tickDirection: TipsSlider.TickDirection.Back slider.highlightedPassedGroove: true slider.handleType: Slider.HandleType.ArrowBottom ticks: [SliderTipItem { }, SliderTipItem { }, SliderTipItem { }, SliderTipItem { }] } TipsSlider { id: sliderTickTip2 readonly property var tips: [qsTr("Fast"), qsTr("Slow")] width: parent.width tickDirection: TipsSlider.TickDirection.Back slider.handleType: Slider.HandleType.ArrowBottom ticks: [SliderTipItem { text: sliderTickTip2.tips[0] }, SliderTipItem { text: sliderTickTip2.tips[1] }] // test highlight Text HighlightPanel { id: __highlight readonly property real highlightMargin: 20 anchors.bottom: parent.bottom x: parent.slider.value * (parent.width - parent.slider.handle.width) - width / 2 + parent.slider.handle.width / 2 width: __text.implicitWidth height: __text.implicitHeight Text { id: __text text: sliderTickTip2.tips[0] color: palette.highlightedText verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter } } } TipsSlider { id: sliderTickTip3 readonly property var tips: [qsTr("1m"), qsTr("5m"), qsTr("10m"), qsTr("15m"), qsTr("30m"), qsTr("1h"), qsTr("Never")] width: parent.width tickDirection: TipsSlider.TickDirection.Back slider.handleType: Slider.HandleType.ArrowBottom slider.stepSize: 10 slider.from: 0 slider.to: 60 ticks: [SliderTipItem { text: sliderTickTip3.tips[0] textHorizontalAlignment: Text.AlignLeft }, SliderTipItem { text: sliderTickTip3.tips[1] }, SliderTipItem { text: sliderTickTip3.tips[2] }, SliderTipItem { text: sliderTickTip3.tips[3] }, SliderTipItem { text: sliderTickTip3.tips[4] }, SliderTipItem { text: sliderTickTip3.tips[5] }, SliderTipItem { text: sliderTickTip3.tips[6] textHorizontalAlignment: Text.AlignRight }] // test end Indicator Rectangle { width: 30 height: 30 color: "blue" anchors { left: parent.right leftMargin: 20 verticalCenter: parent.slider.verticalCenter } Text { anchors.centerIn: parent text: sliderTickTip3.slider.value.toFixed(1) color: "white" } } // test start Indicator Rectangle { width: 30 height: 30 color: "red" anchors { right: parent.left rightMargin: 20 verticalCenter: parent.slider.verticalCenter } Text { anchors.centerIn: parent text: "S" color: "white" } } } } Row { id: switchBtnRow anchors { top: sliderColum.bottom left: sliderRow.right topMargin: 30 leftMargin: 40 } spacing: 10 Switch { checked: true } Switch { } Switch { checked: true enabled: false } Switch { enabled: false } } Row { anchors { top: sliderColum.bottom left: switchBtnRow.right topMargin: 30 leftMargin: 20 } spacing: 10 ComboBox { id: nonEditComboBox model: ["Banana", "Apple", "Coconut"] } ComboBox { id: editableComboBox editable: true model: ["Banana", "Apple", "Coconut"] } ComboBox { id: nonEditComboBoxWithIcon textRole: "text" iconNameRole: "icon" model: ListModel { ListElement { text: "Banana"; icon: "go-previous" } ListElement { text: "Apple"; icon: "go-down" } ListElement { text: "Coconut"; icon: "go-next" } } } ComboBox { id: editableComboBoxWithIcon editable: true textRole: "text" iconNameRole: "icon" model: ListModel { ListElement { text: "Banana"; icon: "go-previous" } ListElement { text: "Apple"; icon: "go-down" } ListElement { text: "Coconut"; icon: "go-next" } } } } } dtkdeclarative-5.7.12/examples/qml-inspect/Example_2.qml000066400000000000000000000160371476226662700232260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 Rectangle { property string iconStr: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEkAAABFCAYAAAAGscunAAAAAXNSR0IArs4c6QAAATNJREFUeF7t3DEOgkAYBeG3J2NvxnIy2JNhKEwUDYyWMJZmLPh8tH+Jn1OBcloYRCQwApH+Rlozgt9eMymZ9g/2uaQ145Ch1dRrIhw81ZIlPX1KSXvNviKNGVt7724BNmVKSxPp6N8WCbwLIokEBEDikkQCAiBxSSIBAZC4JJGAAEhckkhAACQuSSQgABKXJBIQAIlLEgkIgMQliQQEQOKSRAICIHFJIgEBkLgkkYAASFySSEAAJC5JJCAAEpckEhAAiUsSCQiAxCWJBARA4pJEAgIgcUkiAQGQuCSRgABIXJJIQAAkLkkkIAASlyQSEACJSxIJCIDEJYkEBEDikkQCAiBxSSIBAZD8tKSaessLEz09c2ZwPGETX294XuK5tN0Jju1rr96A11AkkYAASFwSQHoAZNuhVXVGph0AAAAASUVORK5CYII=" RowLayout { id:row_layout_1 anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right QtIcon { name: iconStr sourceSize: Qt.size(50, 50) } DciIcon { name: iconStr sourceSize: Qt.size(50, 50) } IconLabel { icon.name: iconStr icon.width: 50 icon.height: 50 } QtIcon { name: "search_indicator" color: "red" MouseArea { anchors.fill: parent onClicked: { if (Qt.colorEqual(parent.color, "red")) { parent.color = "blue" } else { parent.color = "red" } } } } BusyIndicator { running: true } BusyIndicator { running: true } RoundButton { id:roundbutton width: 28 height: 28 } Dial {} Rectangle { id: frame clip: true width: 160 height: 160 border.color: "black" Text { id: content text: "HELLO WORLD" font.pixelSize: 160 x: -hbar.position * width y: -vbar.position * height } ScrollBar { id: vbar hoverEnabled: true active: hovered || pressed orientation: Qt.Vertical size: frame.height / content.height anchors.top: parent.top anchors.right: parent.right anchors.bottom: parent.bottom ToolTip.visible: hovered ToolTip.delay: 1000 ToolTip.timeout: 5000 ToolTip.text: "This is a ScrollBar!!!" } ScrollBar { id: hbar hoverEnabled: true active: hovered || pressed orientation: Qt.Horizontal size: frame.width / content.width anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom } } StackView { id: stackview_1 width: 150 height: 150 Component { id: page Rectangle { property real hue: Math.random() color: Qt.hsla(hue, 0.5, 0.8, 0.6) border.color: Qt.hsla(hue, 0.5, 0.5, 0.9) StackView.visible: true } } initialItem: page MouseArea { id:area anchors.fill: parent onClicked: { stackview_1.push(page) } } } } RectangularShadow { anchors.fill: shadowSource glowRadius: 20 spread: 0 color: "black" cornerRadius: shadowSource.radius } Rectangle { id: shadowSource width: 300 height: 150 anchors { left: parent.left leftMargin: 50 bottom: parent.bottom bottomMargin: 200 } radius: 30 color: "red" } // test like DropShadow BoxShadow { anchors.fill: boxShadowSource shadowBlur : 20 shadowColor : Qt.rgba(0, 0, 0, 0.9) shadowOffsetX : 0 shadowOffsetY : 0 cornerRadius: boxShadowSource.radius hollow: true } Rectangle { id: boxShadowSource width: 200 height: 200 anchors { left: shadowSource.right leftMargin: 50 bottom: shadowSource.bottom } color: "red" radius: 20 } // test like InnerShadow BoxInsetShadow { anchors.fill: boxShadowSource shadowBlur : 20 shadowColor : Qt.rgba(0, 0, 0, 0.6) shadowOffsetX : 0 shadowOffsetY : 0 cornerRadius: boxShadowSource.radius } ListView { spacing: 10 anchors { left: boxShadowSource.right leftMargin: 50 verticalCenter: boxShadowSource.verticalCenter } width: 200 height: 280 model: ListModel { ListElement { cornor: 1 } ListElement { cornor: 2 } ListElement { cornor: 4 } ListElement { cornor: 8 } ListElement { cornor: 3 } ListElement { cornor: 5 } ListElement { cornor: 10 } ListElement { cornor: 12 } } delegate: RoundRectangle { width: 200 height: 60 color: "blue" radius: 20 antialiasing: true corners: cornor } } Rectangle { id:swipe_view width: 300 height: 150 anchors.bottom: parent.bottom anchors.horizontalCenter: parent.horizontalCenter SwipeView { id: view currentIndex: 1 anchors.fill: parent Rectangle { color: "red" width: swipe_view.width height: swipe_view.height } Rectangle { color: "green" width: swipe_view.width height: swipe_view.height } Rectangle { color: "blue" width: swipe_view.width height: swipe_view.height } } PageIndicator { id: indicator count: view.count currentIndex: view.currentIndex anchors.bottom: view.bottom anchors.horizontalCenter: parent.horizontalCenter } } } dtkdeclarative-5.7.12/examples/qml-inspect/Example_3.qml000066400000000000000000000055031476226662700232230ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk 1.0 Item { Image { id: back anchors.fill: parent source: "file:///usr/share/wallpapers/deepin/desktop.jpg" } Rectangle { id: source y: 50 x: 50 width: 200 height: 200 radius: 30 color: "red" visible: false } Item { id: maskSource anchors.fill: source visible: false Rectangle { anchors.centerIn: parent width: 100 height: 100 radius: 40 color: "blue" } } OpacityMask { anchors.fill: source source: source maskSource: maskSource invert: true } BoxShadow { hollow: true anchors.fill: shadowedRect shadowBlur: 20 shadowColor: "red" topLeftRadius: shadowedRect.radius bottomRightRadius: shadowedRect.radius } RoundRectangle { id: shadowedRect x: 50 y: 300 width: 100 height: 100 color: "blue" radius: 30 corners: RoundRectangle.TopLeftCorner | RoundRectangle.BottomRightCorner } ListView { id: testView property color foreground: "#55ffffff" model: 1 spacing: 30 clip: true anchors { fill: parent margins: 10 } delegate: Item { property ListView view: ListView.view height: 50 width: 300 anchors.horizontalCenter: parent.horizontalCenter InWindowBlur { id: blur anchors.fill: parent radius: 20 offscreen: true } ItemViewport { id: roundBlur anchors.fill: blur fixed: true sourceItem: blur radius: 20 hideSource: false } Rectangle { radius: roundBlur.radius anchors.fill: roundBlur color: view.foreground } Text { anchors.centerIn: parent text: "InWindowBlur" + index color: "white" font.pixelSize: 22 } } } Button { text: "深浅切换" onClicked: { if (testView.foreground == "#55000000") testView.foreground = "#55ffffff" else testView.foreground = "#55000000" } } // StyledArrowShapeBlur { // anchors.centerIn: parent // width: 100 // height: 200 // roundJoinRadius: 20 // } } dtkdeclarative-5.7.12/examples/qml-inspect/Example_Flickable.qml000066400000000000000000000141621476226662700247360ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 Flow { id: control Row { spacing: 20 ScrollView { id: scrollView width: 200 height: 400 clip: true ListView { model: 20 delegate: Button { text: "index" + String(modelData) } } background: Rectangle { border.color: "green" } } Column { Row { spacing: 20 ProgressBar { from: 0 to: 100 formatText: ("已下载" + (value / to * 100).toFixed() + "%(点击暂停)") NumberAnimation on value { from: 0 to: 100 duration: 1000 loops: Animation.Infinite } } ProgressBar { from: 0 to: 100 height: 8 NumberAnimation on value { from: 0 to: 100 duration: 1000 loops: Animation.Infinite } } EmbeddedProgressBar { from: 0 to: 100 NumberAnimation on value { from: 0 to: 100 duration: 1000 loops: Animation.Infinite } } WaterProgressBar { NumberAnimation on value { id: valueAnimation loops: Animation.Infinite from: 0 to: 100 duration: 10000 } running: valueAnimation.running } } Row { spacing: 20 ProgressBar { from: 0 to: 100 height: 18 indeterminate: true } ProgressBar { from: 0 to: 100 indeterminate: true formatText: "正在准备(点击终止)" MouseArea { anchors.fill: parent onClicked: { parent.animationStop = !parent.animationStop } } } } Column { spacing: 10 IpV4LineEdit { } IpV4LineEdit { width: 300 height: 40 showAlert: focus alertText: "alert tips" } IpV4LineEdit { width: 300 height: 40 text: "10.20.52.57" } Row { spacing: 10 IpV4LineEdit { id: idLineEditSetValueByText width: 300 height: 40 } Button { text: "set IP by Text" onClicked: idLineEditSetValueByText.text = "10.20.52.57" } Text { text: idLineEditSetValueByText.text } } } } } Column { width: 340 height: 280 RowLayout { TextField { id: nameFilter placeholderText: qsTr("Search by name...") Layout.fillWidth: true onTextChanged: sortFilterModel.update() } Column { RadioButton { id: sortByName checked: true text: qsTr("Sort by name") onCheckedChanged: sortFilterModel.update() } RadioButton { text: qsTr("Sort by team") onCheckedChanged: sortFilterModel.update() } } } SortFilterModel { id: sortFilterModel model: ListModel { ListElement { name: "Alice"; team: "Crypto" } ListElement { name: "Bob"; team: "Crypto" } ListElement { name: "Jane"; team: "QA" } ListElement { name: "Victor"; team: "QA" } ListElement { name: "Wendy"; team: "Graphics" } } delegate: Text { text: name + " (" + team + ")" } filterAcceptsItem: function(item) { return item.name.includes(nameFilter.text) } lessThan: function(left, right) { var leftVal = sortByName.checked ? left.name : left.team; var rightVal = sortByName.checked ? right.name : right.team; return leftVal < rightVal ? -1 : 1; } } ListView { height: 100 width: parent.width model: sortFilterModel } } Column { KeySequenceEdit { width: 504 height: 36 text: "切换键盘布局" placeholderText: "请重新输入快捷键" keys: ["CTRL", "SHIFT"] } KeySequenceEdit { width: 504 height: 36 text: "关闭窗口" placeholderText: "请重新输入快捷键" keys: ["ALT", "F4"] } KeySequenceEdit { width: 504 height: 36 text: "关闭窗口" placeholderText: "请重新输入快捷键" } } } dtkdeclarative-5.7.12/examples/qml-inspect/Example_Menu.qml000066400000000000000000000065321476226662700237700ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 Column { id: control Row{ Button { text: "Normal" onClicked: normalMenu.popup(control, Qt.point(x, height)) } Button { text: "Action checkd" onClicked: { var action = normalMenu.actionAt(4) action.checked = !action.checked } } Button { text: "MenuItem checkd" onClicked: { var item = normalMenu.itemAt(1) item.checked = !item.checked } } Button { text: "MenuItem Add" onClicked: { normalMenu.addItem(menuItem.createObject(normalMenu)) } Component { id: menuItem MenuItem { text: "Long long text menu" } } } } Row { SearchEdit { id: filterSearchEdit placeholder: qsTr("搜索") onTextChanged: { objectModelFilter.update() } } Button { text: "open menu" onClicked: searchAndArrowMenu.popup() } } Menu { id: normalMenu // width: 300 header: SearchEdit { placeholder: qsTr("搜索") } maxVisibleItems: 4 MenuItem { icon.name: "music" text: "icon" onTriggered: console.log("trigger", text) } MenuItem { icon.name: "music" text: "Checked" checked: true } MenuSeparator { text: "文本" } MenuItem { icon.name: "music" text: "icon right" display: IconLabel.IconBesideText } Action { text: "Action" ; /*checkable: true;*/ /*checked: true*/} MenuSeparator { } Menu { title: "ShortText menu" Action { text: "Find Next" /*; checked: true*/} Action { text: "Find Previous" } Action { text: "Replace" } Menu { title: "three" Action { text: "Find Next" } Action { text: "Find Previous" } Action { text: "Replace" } } } Menu { title: "LongText menu" Action { text: "Find Next" } Action { text: "Find Previous" } Action { text: "Replace" } } } Menu { id: searchAndArrowMenu closePolicy: Popup.NoAutoClose model: ObjectModelProxy { id: objectModelFilter filterAcceptsItem: function(item) { return item.text.includes(filterSearchEdit.text) } sourceModel: searchAndArrowMenu.contentModel } MenuItem { text: qsTr("Greek(cp869)") } MenuItem { text: qsTr("Cyrillic (ISO 8859-5)") } MenuItem { text: qsTr("Cyrillic(KOI8-R)") } MenuItem { text: qsTr("Devanagari(x-mac-davanagari)") } MenuItem { text: qsTr("Gurmukhi(x-mac-gurmukhi)") } MenuItem { text: qsTr("Thai (ISO 8859-11)") } } } dtkdeclarative-5.7.12/examples/qml-inspect/Example_Notify.qml000066400000000000000000000042671476226662700243370ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Window 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 Column { id: control property string longMessage: "Copyright 2014-2019 Adobe (http://www.adobe.com/), with Reserved FontName 'Source'. Source is a trademark of Adobe in the United States and/or other countries." property string shortMessage: "short message" Button { text: "FloatingMessage" property int count: 0 onClicked: { if (count % 2) { DTK.sendMessage(control, "message" + count) DTK.sendMessage(Window.window, "message" + count, "music", 4000, "type1") DTK.sendMessage(Window.window, "message" + count, "video", -1) } else { DTK.sendMessage(control, floatingMsgCom, {content: shortMessage}, -1) DTK.sendMessage(Window.window, floatingMsgCom, {content: longMessage, iconName: "music"}, -1) } count++ } } Component { id: floatingMsgCom FloatingMessage { id: floatMsg contentItem: RowLayout { spacing: 0 Label { Layout.fillHeight: true Layout.fillWidth: true text: floatMsg.message.content verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft Layout.alignment: Qt.AlignVCenter font: DTK.fontManager.t6 wrapMode: Text.Wrap elide: Text.ElideRight maximumLineCount: 1 } Button { text: "reload" font: DTK.fontManager.t5 Layout.alignment: Qt.AlignVCenter } } // button: Button { // text: "close" // onClicked: { // console.log("close clicked") // DTK.closeMessage(floatMsg) // } // } } } } dtkdeclarative-5.7.12/examples/qml-inspect/Example_Popup.qml000066400000000000000000000130141476226662700241600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Layouts 1.11 import QtQuick.Window 2.11 import QtQuick.Shapes 1.10 import org.deepin.dtk 1.0 Column { id: control Row { Button { text: "popup window" onClicked: { // popup.x = (Screen.desktopAvailableWidth - Window.window.width) / 2 // popup.y = (Screen.desktopAvailableHeight - Window.window.height) / 2 // popupWindow.width = 400 popupWindow.open() // popupWindow.PopupWindow.window.hide() // Window.window.hide() // popup.PopupWindow.window.show() // popupWindow.PopupWindow.close() } // Component.onCompleted: popupWindow.open() } Button { text: "change x" onClicked: { popupWindow.x = 500 popupWindow.open() } } Button { text: "change width" onClicked: { popupWindow.width = 400 popupWindow.open() } } Button { text: "popup control" onClicked: { // popupWindow.x = (Screen.desktopAvailableWidth - Window.window.width) / 2 // popupWindow.y = (Screen.desktopAvailableHeight - Window.window.height) / 2 popup.open() } } } Row { Button { text: "menu control" onClicked: { menu.open() } } Button { text: "menu popupWindow" onClicked: { menuPopup.open() } } } Button { text: "handle forceWindowMode" onClicked: { popupWindow.PopupHandle.forceWindowMode = !popupWindow.PopupHandle.forceWindowMode } } Popup { id: popupWindow; objectName: "pupup window" visible: false x: 100 y: 20 // width: 200 // height: 100 // width: 300 // height: 300 // margins: 100 PopupHandle.forceWindowMode: true PopupHandle.delegate: PopupWindow { blurControl: popupWindow } contentItem: Column { spacing: 10 Text { text: "蓝牙" anchors.horizontalCenter: parent.horizontalCenter } Button { text: "打印机" anchors.horizontalCenter: parent.horizontalCenter } } } Popup { id: popup; objectName: "pupup" x: 100 y: 20 // margins: 100 contentItem: Column { spacing: 10 Text { text: "蓝牙" anchors.horizontalCenter: parent.horizontalCenter } Button { text: "打印机" anchors.horizontalCenter: parent.horizontalCenter } } } Menu { id: menu MenuItem { text: "Text" } } Menu { id: menuPopup MenuItem { text: "Text" } PopupHandle.forceWindowMode: true } ArrowShapePopup { id: arrow x: 50 y: 50 width: 100 height: 100 } Row { Button { text: "Up" onClicked: { arrow.arrowDirection = ArrowBoxPath.Up arrow.arrowX = arrow.width / 2 + 10 arrow.arrowY = 10 arrow.open() } } Button { text: "Down" onClicked: { arrow.arrowDirection = ArrowBoxPath.Down arrow.arrowX = arrow.width / 2 + 10 arrow.arrowY = arrow.height - 10 arrow.open() } } Button { text: "Left" onClicked: { arrow.arrowDirection = ArrowBoxPath.Left arrow.arrowX = 10 arrow.arrowY = arrow.height / 2 + 10 arrow.open() } } Button { text: "Right" onClicked: { arrow.arrowDirection = ArrowBoxPath.Right arrow.arrowX = arrow.width - 10 arrow.arrowY = arrow.height / 2 + 10 arrow.open() } } } // Shape { // x: 20 // y: 20 // ShapePath { // fillColor: "red" // strokeColor: "transparent" // ArrowBoxPath { // id: arrow // width: 60 // height: 150 // arrowX: 0 // arrowY: 0 // arrowWidth: 50 // arrowHeight: 30 // roundedRadius: 8 // spread: -5 // } // } // } // Shape { // x: 20 // y: 20 //// visible: false // ShapePath { // fillColor: "green" // strokeColor: "transparent" // ArrowBoxPath { // width: arrow.width // height: arrow.height // arrowDirection: arrow.arrowDirection // arrowX: arrow.arrowX // arrowY: arrow.arrowY // arrowWidth: arrow.arrowWidth // arrowHeight: arrow.arrowHeight // roundedRadius: arrow.roundedRadius //// spread: 15 // } // } // } } dtkdeclarative-5.7.12/examples/qml-inspect/Example_TitleBar.qml000066400000000000000000000037551476226662700245760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import QtQuick.Window 2.11 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 TitleBar { id: titleBar icon.name: "music" title: "title custom" property string appProductName: Qt.application.displayName property string appLicense: "LGPL-3.0-or-later" // menu: Menu { // delegate: MenuItem { // icon.name: "emblem-checked" // icon.color: palette.highlight // } // ThemeMenu {} // MenuSeparator { // contentItem: Rectangle { // implicitHeight: 1 // color: "black" // } // } // HelpAction {} // AboutAction {} // QuitAction {} // Action { // text: qsTr("custom action") // } // MenuItem { // text: qsTr("Window State") // onTriggered: toggleWindowState() // } // } aboutDialog: AboutDialog { productIcon: "music" modality: Qt.NonModal productName: qsTr(appProductName) companyLogo: "file://" + DTK.deepinDistributionOrgLogo websiteName: DTK.deepinWebsiteName websiteLink: DTK.deepinWebsiteLink description: "qml inspect is used to developer as a debug tool." license: appLicense === "" ? "" : qsTr(String("%1 is released under %2").arg(appProductName).arg(appLicense)) } embedMode: false // separatorVisible: false autoHideOnFullscreen: true // menuDisabled: true // content: RowLayout { // LineEdit { // text: "label2" // } // LineEdit { // text: "center" // Layout.alignment: Qt.AlignCenter // } // Button { // text: "center custom" // Layout.alignment: Qt.AlignRight // } // } focus: true Keys.onSpacePressed: Window.window.visibility = Window.FullScreen } dtkdeclarative-5.7.12/examples/qml-inspect/Example_colorselector.qml000066400000000000000000000337411476226662700257450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import org.deepin.dtk 1.0 Rectangle { Label { id: changePaletteLabel anchors.left: parent.left anchors.top: parent.top anchors.topMargin: 20 text: "Change Palette By object property" font.pointSize: 14 font.bold: true } Control { id: control1 anchors.left: parent.left anchors.top: changePaletteLabel.bottom anchors.topMargin: 20 width: 500 height: 50 property Palette backgroundColor: Palette { normal: ("black") } property Palette backgroundColorClicked: Palette { normal: ("blue") } property Palette textColorClicked: Palette { normal: ("yellow") } Rectangle { property Palette borderColor: Palette { normal: ("red") } id: rect1 anchors.left: parent.left anchors.top: control1.top width: 250 height: 50 color: ColorSelector.backgroundColor border.width: 1 border.color: ColorSelector.borderColor Text { property Palette textColor: Palette { normal: ("white") } id: rect1Text anchors.fill: parent text: "Use it's control parent's palette.\n(Click to change.)" color: ColorSelector.textColor horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter MouseArea { anchors.fill: parent onClicked: { control1.backgroundColor.normal = "red" rect1Text.textColor.normal = "black" } } } } Rectangle { id: rect2 property Palette borderColor: Palette { normal: ("red") } property Palette backgroundColor: Palette { normal: ("black") } property Palette backgroundColorClicked: Palette { normal: ("magenta") } anchors.left: rect1.right anchors.leftMargin: 20 anchors.top: control1.top width: 250 height: 50 color: ColorSelector.backgroundColor border.width: 1 border.color: ColorSelector.borderColor Text { id: rect2Text property Palette textColor: Palette { normal: ("yellow") } property Palette textColorClicked: Palette { normal: ("blue") } anchors.fill: parent text: "Overwrite it's control parent palette.\n(Click to change.)" color: ColorSelector.textColor horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter MouseArea { anchors.fill: parent Palette { id: otherBackgroundColor normal: ("darkRed") } Palette { id: othertextColor normal: ("darkBlue") } onClicked: { rect2.backgroundColor = otherBackgroundColor rect2Text.textColor = othertextColor } } } } } Label { id: changeObjectLabel anchors.left: parent.left anchors.top: control1.bottom anchors.topMargin: 20 text: "Change Palette By color selector" font.pointSize: 14 font.bold: true } Control { id: control2 anchors.left: parent.left anchors.top: changeObjectLabel.bottom anchors.topMargin: 20 width: 500 height: 50 property Palette backgroundColor: Palette { normal: ("black") } property Palette backgroundColorClicked: Palette { normal: ("blue") } property Palette textColorClicked: Palette { normal: ("cyan") } Rectangle { property Palette borderColor: Palette { normal: ("red") } id: rect3 anchors.left: parent.left anchors.top: control2.top width: 250 height: 50 color: ColorSelector.backgroundColor border.width: 1 border.color: ColorSelector.borderColor Text { property Palette textColor: Palette { normal: ("white") } id: rect3Text anchors.fill: parent text: "Use it's color seletor to change palette.\n(Click to change, double click restore)" color: ColorSelector.textColor horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter MouseArea { anchors.fill: parent onClicked: { rect3.ColorSelector.backgroundColor = control2.backgroundColorClicked rect3Text.ColorSelector.textColor = control2.textColorClicked } onDoubleClicked: { rect3.ColorSelector.backgroundColor = undefined rect3Text.ColorSelector.textColor = undefined } } } } Rectangle { id: rect4 anchors.left: rect3.right anchors.top: control2.top anchors.leftMargin: 20 width: 250 height: 50 color: ColorSelector.backgroundColor property Palette backgroundColor: Palette { normal: ("black") } property Palette backgroundColorClicked: Palette { normal: ("magenta") } Text { id: rect4Text property Palette textColor: Palette { normal: ("yellow") } property Palette textColorClicked: Palette { normal: ("blue") } anchors.fill: parent text: "Use CS to replace it's own palette.\n(Click to change, double click restore)" color: ColorSelector.textColor horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter MouseArea { anchors.fill: parent onClicked: { rect4.ColorSelector.backgroundColor = rect4.backgroundColorClicked rect4Text.ColorSelector.textColor = control2 .textColorClicked } onDoubleClicked: { rect4.ColorSelector.backgroundColor = undefined rect4Text.ColorSelector.textColor = undefined } } } } Label { id: changeParentLabel anchors.left: parent.left anchors.top: control2.bottom anchors.topMargin: 20 text: "Change palette when parent changed" font.pointSize: 14 font.bold: true } Rectangle { id: changeParentRect anchors.left: parent.left anchors.top: changeParentLabel.bottom anchors.topMargin: 20 width: 500 height: 50 Control { id: control3 width: 220 height: 50 anchors.left: parent.left anchors.top: parent.top property Palette backgroundColor: Palette { normal: ("gray") } Rectangle { property Palette borderColor: Palette { normal: ("red") } id: reparentRect1 width: 50 height: 50 color: ColorSelector.backgroundColor border.width: 1 border.color: ColorSelector.borderColor Text { property Palette textColor: Palette { normal: ("blue") } anchors.fill: parent text: "Rect1" color: ColorSelector.textColor horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter MouseArea { anchors.fill: parent onClicked: { if (reparentRect1.parent == control3) reparentRect1.state = "reparent2" else reparentRect1.state = "reparent1" } } } states: [ State { name: "reparent1" ParentChange { target: reparentRect1 parent: control3 x: 0 y: 0 } }, State { name: "reparent2" ParentChange { target: reparentRect1 parent: control4 x: 60 y: 0 } } ] } } Control { id: control4 width: 220 height: 50 anchors.left: control3.right anchors.leftMargin: 10 anchors.top: parent.top property Palette backgroundColor: Palette { normal: ("red") } Rectangle { property Palette borderColor: Palette { normal: ("gray") } id: reparentRect2 width: 50 height: 50 color: ColorSelector.backgroundColor border.width: 1 border.color: ColorSelector.borderColor Text { property Palette textColor: Palette { normal: ("yellow") } anchors.fill: parent text: "Rect2" color: ColorSelector.textColor horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter MouseArea { anchors.fill: parent onClicked: { if (reparentRect2.parent == control3) reparentRect2.state = "reparent2" else reparentRect2.state = "reparent1" } } } states: [ State { name: "reparent1" ParentChange { target: reparentRect2 parent: control3 x: 60 y: 0 } }, State { name: "reparent2" ParentChange { target: reparentRect2 parent: control4 x: 0 y: 0 } } ] } } } Label { id: customControlLabel anchors.left: parent.left anchors.top: changeParentRect.bottom anchors.topMargin: 20 text: "Custom control which used the color selector" font.pointSize: 14 font.bold: true } Row { id: dontOverwriteControls width: parent.width height: 50 anchors.left: parent.left anchors.top: customControlLabel.bottom anchors.topMargin: 20 spacing: 5 Repeater { model: 5 Example_customcontrolforcs { width: 50 height: 50 text: modelData } } } Row { id: overwriteControls width: parent.width height: 50 anchors.left: parent.left anchors.top: dontOverwriteControls.bottom anchors.topMargin: 20 spacing: 5 Repeater { model: 5 Example_customcontrolforcs { backgroundColor: Palette { normal: Qt.hsla(Math.random(), 0.6, 0.6, 0.9) hovered: Qt.hsla(Math.random(), 0.2, 0.2, 0.9) } width: 50 height: 50 text: modelData } } } } } dtkdeclarative-5.7.12/examples/qml-inspect/Example_config.qml000066400000000000000000000053001476226662700243210ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk 1.0 Item { Config { id: exampleConfig name: "example" subpath: "" property int key2 : 1 property string key3 : "key3 default" onKey3Changed: { key3Text.text = exampleConfig.key3 console.info("Config key3Changed"); } } Column { id: config spacing: 10 Button{ text: "generic function" onClicked: { console.info("configBtn pressed") console.info(exampleConfig.isValid()) console.info(exampleConfig.value("key3", "ddd")) console.info(exampleConfig.value("key3")) console.info(exampleConfig.keyList()) console.info(exampleConfig.name) console.info(exampleConfig.subpath) exampleConfig.setValue("key3", (new Date).getTime().toString()) console.info(exampleConfig.value("key3", "ddd")) } } Row { spacing: 10 Button{ text: "write" onClicked: { exampleConfig.key3 = (new Date).getTime().toString() } } Label { text: "property binding key3:" + exampleConfig.key3 } Label { text: "js binding key3:" } Label { text: "exampleConfig.key3" Component.onCompleted: { text = Qt.binding(function(){return exampleConfig.key3}) } } } Row { spacing: 10 Button{ text: "read" onClicked: { console.info("key3", exampleConfig.key3) readKey3Text.text = exampleConfig.key3 } } Label { text: "key3:" } Label { id: readKey3Text } } Row { spacing: 10 Label { text: "Connections valueChanged:" } Label { text: "key3:" } Label { id: key3Text text: "key3:" } Connections{ target: exampleConfig function onKey3Changed() { key3Text.text = exampleConfig.key3 console.info("Connections key3Changed"); } } } } } dtkdeclarative-5.7.12/examples/qml-inspect/Example_customcontrolforcs.qml000066400000000000000000000021371476226662700270310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk 1.0 Control { id: control hoverEnabled: true property Palette backgroundColor: Palette { normal: Qt.hsla(Math.random(), 0.2, 0.5, 0.9) hovered: Qt.hsla(Math.random(), 0.1, 0.1, 0.9) } property Palette textColor: Palette { normal: Qt.hsla(Math.random(), 0.5, 0.2, 0.4) hovered: Qt.hsla(Math.random(), 0.6, 0.6, 0.9) } property string text background: Rectangle { color: control.ColorSelector.backgroundColor Behavior on color { ColorAnimation { duration: 300 } } } contentItem: Text { id: textItem anchors.fill: parent horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter text: control.text color: control.ColorSelector.textColor Behavior on color { ColorAnimation { duration: 300 } } } } dtkdeclarative-5.7.12/examples/qml-inspect/Example_settingsdialog.qml000066400000000000000000000153511476226662700261030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.0 import org.deepin.dtk 1.0 import org.deepin.dtk.settings 1.0 as Settings Rectangle { border.color: "blue" property list __groups: [ Settings.SettingsGroup { key: "group1" name: "group1" Settings.SettingsOption { key: "option1" name: "option1" Label { text: Settings.SettingsOption.name } } } ] Settings.SettingsDialog { id: settingsDialog height: 400 width: 680 visible: false config: settingsConfig // container.groups: [ // Settings.SettingsGroup { // key: "group1" // name: "group1" // visible: true // Settings.SettingsOption { // key: "option1" // name: "option1" // Label { // text: Settings.SettingsOption.name // } // } // } // ] // container: Settings.SettingsContainer { // id: settingsContainer // config: settingsConfig // navigationTitle: NavigationTitle {} // contentTitle: ContentTitle {} // Settings.ContentBackground: Settings.ContentBackground {} // groups: __groups // } container.contentBackground: Settings.ContentBackground { border.color: "blue" } groups: [ Settings.SettingsGroup { key: "group1" name: "group1" visible: true background: Settings.ContentBackground { border.color: "green" radius: 8 } children: [ Settings.SettingsGroup { key: "group1" name: "group1" visible: true background: Settings.ContentBackground { border.color: "red" radius: 8 } Settings.SettingsOption { key: "key2" name: "ComboBox" Settings.ComboBox { model: ["first", "second", "three"] } } Settings.SettingsOption { key: "key3" name: "LineEdit" Settings.LineEdit {} } Settings.SettingsOption { key: "canExit" name: "CheckBox" Settings.CheckBox {} } }, Settings.SettingsGroup { key: "group2" name: "group2" children: [ Settings.SettingsGroup { key: "group3" name: "group1.group2.group3" visible: true Settings.SettingsOption { key: "option1" name: "group2.group1.option1" Settings.OptionDelegate { LineEdit { text: Settings.SettingsOption.name onEditingFinished: { Settings.SettingsOption.value = text } } } } } ] } ] }, Settings.SettingsGroup { key: "group2" name: "group2" children: [ Settings.SettingsGroup { key: "group1" name: "group1" visible: true Settings.SettingsOption { key: "option1" name: "option1" Label { text: Settings.SettingsOption.name } } Settings.SettingsOption { key: "option2" name: "option2" LineEdit { text: Settings.SettingsOption.name } } Settings.SettingsOption { key: "option1" name: "option1" ComboBox { model: ["first", "second", "three"] } } } ] }, Settings.SettingsGroup { key: "group3" name: "group3" }, Settings.SettingsGroup { key: "group4" name: "group4" } ] } Column { width: parent.width anchors.leftMargin: 20 anchors.top: parent.top anchors.topMargin: 20 Button { text: "showSettingsDialog" onClicked: { settingsDialog.show() } } Row { ComboBox { id: groups model: ["group1", "group1.group1", "group2.group1"] } Button { property string groupKey: groups.currentText text: groupKey onClicked: { settingsDialog.container.setGroupVisible(groupKey, !settingsDialog.container.groupVisible(groupKey)) } } } } // Config should be loaded first Config { id: settingsConfig name: "example" subpath: "" property string key3 : "key3 default" } } dtkdeclarative-5.7.12/examples/qml-inspect/built-in-icons/000077500000000000000000000000001476226662700235245ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/qml-inspect/built-in-icons/action_add.dci000066400000000000000000000012311476226662700262670ustar00rootroot00000000000000DCI16Inormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light 31.0.webp|RIFFtWEBPVP8Lg// / ڶazA yDꡏ798|0j۶a)eL/Wgj>}:@-H΍l&(v_skEdtkdeclarative-5.7.12/examples/qml-inspect/dciicons.qrc000066400000000000000000000002621476226662700231720ustar00rootroot00000000000000 icons/bloom/org.deepin.Example/action_add.dci built-in-icons/action_add.dci dtkdeclarative-5.7.12/examples/qml-inspect/icons/000077500000000000000000000000001476226662700220035ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/qml-inspect/icons/bloom/000077500000000000000000000000001476226662700231135ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/qml-inspect/icons/bloom/org.deepin.Example/000077500000000000000000000000001476226662700265375ustar00rootroot00000000000000dtkdeclarative-5.7.12/examples/qml-inspect/icons/bloom/org.deepin.Example/action_add.dci000066400000000000000000000012311476226662700313020ustar00rootroot00000000000000DCI16Inormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light 31.0.webp|RIFFtWEBPVP8Lg// / ڶazA yDꡏ798|0j۶a)eL/Wgj>}:@-H΍l&(v_skEdtkdeclarative-5.7.12/examples/qml-inspect/main.cpp000066400000000000000000000022301476226662700223150ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QGuiApplication app(argc, argv); app.setOrganizationName("deepin"); app.setApplicationName("Example"); app.setApplicationVersion("1.0.0"); QQmlApplicationEngine engine; engine.addImportPath(CHAMELEON_PATH); #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QQuickStyle::addStylePath(CHAMELEON_PATH); // QQuickWindow::setSceneGraphBackend(QSGRendererInterface::Software); #else // QQuickWindow::setGraphicsApi(QSGRendererInterface::Software); #endif #if QT_VERSION < QT_VERSION_CHECK(5, 12, 0) && defined(QT_NO_DEBUG) QQuickStyle::setStyle(CHAMELEON_PATH"/Chameleon"); #else QQuickStyle::setStyle("Chameleon"); #endif engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); } dtkdeclarative-5.7.12/examples/qml-inspect/main.qml000066400000000000000000000135261476226662700223360ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Window 2.11 import QtQuick.Controls 2.4 as V2 import QtQuick.Layouts 1.11 import org.deepin.dtk 1.0 as D D.ApplicationWindow { id: root visible: true width: 1200 height: 700 title: qsTr("dtkdeclarative") x:(Screen.desktopAvailableWidth - width) / 2 y:(Screen.desktopAvailableHeight - height) / 2 // D.DWindow.wmWindowTypes: D.WindowManagerHelper.DesktopType header: Example_TitleBar{} flags: Qt.Window | Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint // D.DWindow.motifFunctions: D.DWindow.motifFunctions & ~D.WindowManagerHelper.FUNC_MINIMIZE // 测试D.DWindow的属性 D.DWindow.enabled: true D.DWindow.windowRadius: 16 D.DWindow.borderColor: palette.highlight D.DWindow.borderWidth: 1 D.DWindow.alphaBufferSize: 8 D.FontManager { id: font_manager baseFont: font_manager.get(13, Qt.application.font) onFontChanged: { console.log("font_manager fontChanged .........."); } } // D.MessageManager.layout: Column { // anchors { // bottom: parent.bottom // right: parent.right // } // } // D.MessageManager.capacity: 6 // D.MessageManager.delegate: D.FloatingMessage { // id: floatingMsg // iconName: "error" // type: D.FloatingMessage.TransientType // contentItem: V2.Label { // verticalAlignment: Text.AlignVCenter // horizontalAlignment: Text.AlignLeft // text: floatingMsg.content // elide: Text.ElideRight // maximumLineCount: 1 // wrapMode: Text.Wrap // } // duration: 3000 // } Component.onCompleted: { console.log(D.DWindow.wmWindowTypes) console.log(D.DWindow.enabled ? "DPlatformHandle有效" : "DPlatformHandle无效!!!!"); console.log("hasBlurWindow : ", D.DTK.hasBlurWindow ? "true" : "false"); console.log("windowManagerNameString : ", D.DTK.windowManagerNameString); // 测试系统亮暗色(枚举类型) if (D.DTK.themeType === D.ApplicationHelper.LightType) { console.log("themeType : Light Theme"); } else if (D.DTK.themeType === D.ApplicationHelper.DarkType) { console.log("themeType : Dark Theme"); } else { console.log("themeType : Unknown Theme"); } D.DTK.themeTypeChanged.connect(function() { console.log("themeNameChanged : ", D.DTK.themeType); }); if (D.DTK.windowManagerName === D.WindowManagerHelper.DeepinWM) { console.log("windowManagerName : DeepinWM"); } else if (D.DTK.windowManagerName === D.WindowManagerHelper.KWinWM) { console.log("windowManagerName : KWinWM"); } else { console.log("windowManagerName : OtherWM"); } console.log("test platformTheme info : " , D.DTK.platformTheme.activeColor, D.DTK.platformTheme.themeName); //测试DPlatformThemeProxy信号传递(控制中心切换主题测试) D.DTK.platformTheme.themeNameChanged.connect(function(themeName) { console.log("platformTheme themeNameChanged : ", themeName); }); //在控制中心修改字体大小可以看到打印输出 D.DTK.fontManager.fontChanged.connect(function() { console.log("base font changed ....", D.DTK.fontManager.baseFont); }); console.log("fontManager t1 字体信息", D.DTK.fontManager.t1); // 测试 D.Palette 值 console.log("D.Palette window value: ", root.palette.window) console.log("D.Palette windowText value: ", root.palette.windowText) console.log("D.Palette base value: ", root.palette.base) console.log("D.Palette itemBackground value: ", root.palette.itemBackground) console.log("D.Palette textTitle value: ", root.palette.textTitle) console.log("D.Palette textTips value: ", root.palette.textTips) } V2.TabBar { id: tabBar anchors.top: root.bottom V2.TabButton { text: qsTr("Example_1") } V2.TabButton { text: qsTr("Example_2") } V2.TabButton { text: qsTr("ItemViewport") } V2.TabButton { text: qsTr("Config") } V2.TabButton { text: qsTr("SettingsDialog") } V2.TabButton { text: qsTr("Notify") } V2.TabButton { text: qsTr("ColorSelector") } V2.TabButton { text: qsTr("Menu") } V2.TabButton { text: qsTr("Popup") } V2.TabButton { text: qsTr("Flickable") } } StackLayout { anchors.left: parent.left anchors.right: parent.right anchors.top: tabBar.bottom anchors.bottom: parent.bottom anchors.margins: 4 currentIndex: tabBar.currentIndex Example_1 {} Example_2 {} Example_3 {} Example_config {} Example_settingsdialog {} Example_Notify {} Example_colorselector {} Example_Menu {} Example_Popup {} Example_Flickable {} } D.BehindWindowBlur { anchors { fill: parent topMargin: parent.height - 100 } blendColor: Qt.rgba(1, 0, 0, 0.3) } D.StyledBehindWindowBlur { control: root anchors { right: parent.right rightMargin: 100 bottom: parent.bottom bottomMargin: 160 } width: 200 height: 200 cornerRadius: 30 V2.Label { anchors.centerIn: parent text: qsTr("WMBlur") } } } dtkdeclarative-5.7.12/examples/qml-inspect/qml.qrc000066400000000000000000000011051476226662700221650ustar00rootroot00000000000000 main.qml Example_1.qml Example_2.qml Example_3.qml Example_config.qml Example_TitleBar.qml Example_settingsdialog.qml Example_Notify.qml Example_colorselector.qml Example_customcontrolforcs.qml Example_Menu.qml Example_Popup.qml Example_Flickable.qml dtkdeclarative-5.7.12/linglong.yaml000066400000000000000000000013641476226662700173170ustar00rootroot00000000000000package: id: dtkdeclarative name: dtkdeclarative kind: lib version: 5.6.3 descriptipon: | Deepin Tool Kit Gui library \ Dtkdeclarative is base library of Deepin Qt/QtQuick applications. base: id: org.deepin.base version: 23.0.0 depends: - id: qtbase/5.15.7 - id: qtsvg/5.15.7 - id: libqtxdg/3.6.0.1 - id: gsettings-qt/0.3.1.1 - id: qtquickcontrols2/5.15.7 - id: qtdeclarative/5.15.7 - id: qttools/5.15.7 - id: dtkcommon/5.6.0 - id: dtkcore/5.6.0 - id: dtkgui/5.6.0 - id: fmtlib/10.1.2 - id: spdlog/1.10.0 #- id: googletest/1.8.1 source: kind: local variables: extra_args: | -DBUILD_EXAMPLE=OFF \ -DBUILD_DOCS=OFF \ -DDTK_VERSION=${VERSION} \ -DVERSION=${VERSION} build: kind: cmake dtkdeclarative-5.7.12/misc/000077500000000000000000000000001476226662700155515ustar00rootroot00000000000000dtkdeclarative-5.7.12/misc/DtkDeclarativeConfig.cmake.in000066400000000000000000000015251476226662700231770ustar00rootroot00000000000000@PACKAGE_INIT@ include(CMakeFindDependencyMacro) find_dependency(Dtk@DTK_VERSION_MAJOR@Core) find_dependency(Dtk@DTK_VERSION_MAJOR@Gui) find_package(Qt@QT_VERSION_MAJOR@ COMPONENTS Qml Quick REQUIRED ) include(${CMAKE_CURRENT_LIST_DIR}/Dtk@DTK_VERSION_MAJOR@DeclarativePropertiesTargets.cmake) include(${CMAKE_CURRENT_LIST_DIR}/Dtk@DTK_VERSION_MAJOR@DeclarativeTargets.cmake) set(DTK_QML_APP_PLUGIN_PATH @DTK_QML_APP_PLUGIN_PATH@) get_target_property(DtkDeclarative_INCLUDE_DIRS Dtk@DTK_VERSION_MAJOR@::Declarative INTERFACE_INCLUDE_DIRECTORIES) get_target_property(DtkDeclarative_LIBRARY_DIRS Dtk@DTK_VERSION_MAJOR@::Declarative INTERFACE_LINK_DIRECTORIES) set(DTKDeclarative_INCLUDE_DIR ${DtkDeclarative_INCLUDE_DIRS}) set(DtkDeclarative_LIBRARIES Dtk@DTK_VERSION_MAJOR@::Declarative) check_required_components(Dtk@DTK_VERSION_MAJOR@Core) dtkdeclarative-5.7.12/misc/dtkdeclarative.pc.in000066400000000000000000000007731476226662700214770ustar00rootroot00000000000000prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=${prefix} libdir=${prefix}/@LIB_INSTALL_DIR@ includedir=${prefix}/@INCLUDE_INSTALL_DIR@ Name: DtkDeclarative Description: Deepin Tool Kit DtkDeclarative header files Version: @CMAKE_PROJECT_VERSION@ Libs: -L${libdir} -ldtk@DTK_VERSION_MAJOR@declarative Cflags: -I${includedir} Requires: dtk@DTK_VERSION_MAJOR@core dtk@DTK_VERSION_MAJOR@gui Qt@QT_VERSION_MAJOR@Core Qt@QT_VERSION_MAJOR@Gui Qt@QT_VERSION_MAJOR@DBus Qt@QT_VERSION_MAJOR@Xml Qt@QT_VERSION_MAJOR@Quick dtkdeclarative-5.7.12/misc/qml-app-template/000077500000000000000000000000001476226662700207315ustar00rootroot00000000000000dtkdeclarative-5.7.12/misc/qml-app-template/CMakeLists.txt000066400000000000000000000007741476226662700235010ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.1) project(%{ProjectName} LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(QT NAMES Qt%{QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) if(${QT_VERSION_MAJOR} EQUAL 5) set(DTK_VERSION_MAJOR "") else() set(DTK_VERSION_MAJOR ${QT_VERSION_MAJOR}) endif() find_package(Dtk${DTK_VERSION_MAJOR}Declarative REQUIRED) # Application add_subdirectory(src) dtkdeclarative-5.7.12/misc/qml-app-template/debian/000077500000000000000000000000001476226662700221535ustar00rootroot00000000000000dtkdeclarative-5.7.12/misc/qml-app-template/debian/changelog000066400000000000000000000002321476226662700240220ustar00rootroot00000000000000%{ProjectName} (0.0.1) unstable; urgency=medium * Initial release. -- Deepin Packages Builder Wed, 01 Jul 2020 14:14:35 +0800 dtkdeclarative-5.7.12/misc/qml-app-template/debian/compat000066400000000000000000000000021476226662700233510ustar00rootroot000000000000009 dtkdeclarative-5.7.12/misc/qml-app-template/debian/control000066400000000000000000000006401476226662700235560ustar00rootroot00000000000000Source: %{ProjectName} Section: admin Priority: optional Maintainer: Deepin Packages Builder Build-Depends: debhelper (>= 9), cmake, pkg-config, qtdeclarative5-dev, libdtkdeclarative-dev Standards-Version: 3.9.8 Homepage: http://www.deepin.org Package: %{ProjectName} Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: Simple description A detailed description. dtkdeclarative-5.7.12/misc/qml-app-template/debian/copyright000066400000000000000000000003671476226662700241140ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: %{ProjectName} Source: https://github.com/linuxdeepin/%{ProjectName} Files: * Copyright: UnionTech Software Technology Co., Ltd. License: LGPL-3.0-or-later dtkdeclarative-5.7.12/misc/qml-app-template/debian/rules000077500000000000000000000011601476226662700232310ustar00rootroot00000000000000#!/usr/bin/%{DtkQmlAppMake} -f DPKG_EXPORT_BUILDFLAGS = 1 include /usr/share/dpkg/default.mk export QT_SELECT = qt5 ifneq (,$(wildcard .git/config)) CONFIG_VERSION= else VERSION = $(DEB_VERSION_UPSTREAM) _PACK_VER = $(shell echo $(VERSION) | awk -F'[+_~-]' '{print $$1}') _BUILD_VER = $(shell echo $(VERSION) | awk -F'[+_~-]' '{print $$2}' | sed 's/[^0-9]//g') ifeq ($(_BUILD_VER),) CONFIG_VERSION = $(_PACK_VER) else CONFIG_VERSION = $(_PACK_VER).$(_BUILD_VER) endif endif %: dh $@ --parallel override_dh_auto_configure: dh_auto_configure -- LIB_INSTALL_DIR=/usr/lib/$(DEB_HOST_MULTIARCH) VERSION=$(CONFIG_VERSION) dtkdeclarative-5.7.12/misc/qml-app-template/debian/source/000077500000000000000000000000001476226662700234535ustar00rootroot00000000000000dtkdeclarative-5.7.12/misc/qml-app-template/debian/source/format000066400000000000000000000000151476226662700246620ustar00rootroot000000000000003.0 (native) dtkdeclarative-5.7.12/misc/qml-app-template/src/000077500000000000000000000000001476226662700215205ustar00rootroot00000000000000dtkdeclarative-5.7.12/misc/qml-app-template/src/CMakeLists.txt000066400000000000000000000010451476226662700242600ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.1) # 同时生成 一个 exe 和 两个 lib 三个文件 # lib 文件包含 Preload 插件和 MainComponent 插件 # (1) Preload 插件保证程序启动的入口。 # (2) MainCompnent 会在加载完毕自动添加到 Preload 中 # Application if (NOT CMAKE_BUILD_TYPE STREQUAL "Release") set(LIBRARY_OUTPUT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/lib") add_definitions(-DPLUGINPATH="${LIBRARY_OUTPUT_PATH}") endif() add_subdirectory(main) add_subdirectory(preloadplugin) add_subdirectory(maincomponentplugin) dtkdeclarative-5.7.12/misc/qml-app-template/src/main/000077500000000000000000000000001476226662700224445ustar00rootroot00000000000000dtkdeclarative-5.7.12/misc/qml-app-template/src/main/CMakeLists.txt000066400000000000000000000021331476226662700252030ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.1) set(APP_BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin/) set(APP_NAME ${CMAKE_PROJECT_NAME}) add_definitions(-DAPP_NAME="${APP_NAME}") ###! main目录创建出二进制可执行文件,但启动方式由 DAppLoader ###! 中提供, 请不要在 main 中实现额外内容,请将需要实现的部分 ###! 移动到 preload 插件和 maincomponent 插件中。 # Set sources set(SRC main.cpp ) # Find the QtQuick library find_package(Qt${QT_VERSION_MAJOR}Quick CONFIG REQUIRED) # Add EXE add_executable(${APP_NAME} ${SRC}) # 由于 EXE 只是作为启动程序加载 LIB 使用,一般来说,只需链接 ${LIB_NAME} 既可。 target_link_libraries(${APP_NAME} Qt${QT_VERSION_MAJOR}::Quick Dtk${DTK_VERSION_MAJOR}::Declarative ) add_definitions(-DAPP_PLUGIN_PATH=\"${DTK_QML_APP_PLUGIN_PATH}\") set_target_properties(${APP_NAME} PROPERTIES INSTALL_RPATH ${DTK_QML_APP_PLUGIN_PATH}) install(TARGETS ${APP_NAME} DESTINATION ${APP_BIN_INSTALL_DIR}) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../../${CMAKE_PROJECT_NAME}.desktop" DESTINATION share/applications) dtkdeclarative-5.7.12/misc/qml-app-template/src/main/main.cpp000066400000000000000000000007231476226662700240760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include DQUICK_USE_NAMESPACE int main(int argc, char *argv[]) { DAppLoader appLoader("org.deepin.%{ProjectName}"); #ifdef PLUGINPATH appLoader.addPluginPath(PLUGINPATH); #endif #ifdef APP_PLUGIN_PATH appLoader.addPluginPath(APP_PLUGIN_PATH); #endif return appLoader.exec(argc, argv); } dtkdeclarative-5.7.12/misc/qml-app-template/src/maincomponentplugin/000077500000000000000000000000001476226662700256065ustar00rootroot00000000000000dtkdeclarative-5.7.12/misc/qml-app-template/src/maincomponentplugin/CMakeLists.txt000066400000000000000000000026221476226662700303500ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.1) set(MAINCOMPONENT_LIB_NAME ${CMAKE_PROJECT_NAME}-main) ###! maincomponent 中可以添加应用的第三方依赖、注册 ###! 应用的c++和qml类型、进行耗时计算和加载等等。 ###! 但为了最大程度的启动(创建)组件,请保证在 main.qml ###! 中 AppLoader 结构的正确性,将互相独立的组件独立成 ###! 不同的 Component 进行并发加载。 # Set sources set(MAINCOMPONENNT_SRC maincomponentplugin.cpp ) # Find the QtQuick library find_package(Qt${QT_VERSION_MAJOR}Quick CONFIG REQUIRED) if(${QT_VERSION_MAJOR} EQUAL 5) find_package(Qt5QuickCompiler REQUIRED) qtquick_compiler_add_resources(MAINCOMPONENT_RCC_SOURCES maincomponent.qrc) else() qt_add_resources(MAINCOMPONENT_RCC_SOURCES maincomponent.qrc) set(DTK_VERSION_MAJOR ${QT_VERSION_MAJOR}) endif() # 保证 maincomponentplugin 目录下头文件全局可见 include_directories(src/maincomponentplugin) # Add LIB add_library(${MAINCOMPONENT_LIB_NAME} SHARED ${MAINCOMPONENNT_SRC} ${MAINCOMPONENT_RCC_SOURCES} ) # 由于 LIB 程序为本项目的功能实现部分,需要用到的第三方库都需要在此处添加。 target_link_libraries(${MAINCOMPONENT_LIB_NAME} Qt${QT_VERSION_MAJOR}::Quick Dtk${DTK_VERSION_MAJOR}::Declarative ) # Add install rule install(TARGETS ${MAINCOMPONENT_LIB_NAME} DESTINATION ${DTK_QML_APP_PLUGIN_PATH}) dtkdeclarative-5.7.12/misc/qml-app-template/src/maincomponentplugin/main.qml000066400000000000000000000043751476226662700272560ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Controls 2.4 import org.deepin.dtk 1.0 /** AppLoader 用于动态创建组件,它在 Preaload 创建显示 出来后再进行创建操作,并将创建出来的组件放置在 Preload 的 窗口内部。开发过程中不需要处理 AppLoader 的处理过程,对于 需要使用到 Window 属性的情况,请使用其属性 AppLoader.window。 AppLoader 中请将相互独立的组件放置在不同 Component 中,将相互引用的组件放在在一个 Component 内,将全局属性或 者创建逻辑不需要太复杂的控件放置在 AppLoader 的全局区域。 AppLoader 能够配合 Loader 等动态创建的控件一起使用, 在使用时,Loader 的 active 属性可以配合 AppLoader 的 loaded 属性达到控件加载先后顺序的效果。 */ AppLoader { Component { Row { anchors.top: parent.top anchors.topMargin: 20 anchors.horizontalCenter: parent.horizontalCenter width: 500 height: 50 spacing: 5 Repeater { id: repeater model: 10 Rectangle { color: (index == 0 || index == repeater.count - 1) ? "blue" : "cyan" width: 50 height: 50 radius: Style.control.radius } } } } Component { Button { anchors.centerIn: parent text: qsTr("Button") } } Component { Row { anchors.bottom: parent.bottom anchors.bottomMargin: 20 anchors.horizontalCenter: parent.horizontalCenter width: 500 height: 50 spacing: 5 Repeater { id: repeater model: 10 Rectangle { color: (index == 0 || index == repeater.count - 1) ? "red" : "cyan" width: 50 height: 50 radius: Style.control.radius } } } } } dtkdeclarative-5.7.12/misc/qml-app-template/src/maincomponentplugin/maincomponent.qrc000066400000000000000000000001271476226662700311640ustar00rootroot00000000000000 main.qml dtkdeclarative-5.7.12/misc/qml-app-template/src/maincomponentplugin/maincomponentplugin.cpp000066400000000000000000000007631476226662700324060ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "maincomponentplugin.h" #include DQUICK_USE_NAMESPACE MainComponentPlugin::MainComponentPlugin(QObject *parent) : QObject(parent) { } MainComponentPlugin::~MainComponentPlugin() { } QUrl MainComponentPlugin::mainComponentPath() const { // 返回程序的主控件部分 qml 文件,请确保该文件存在 return QUrl("qrc:///main.qml"); } dtkdeclarative-5.7.12/misc/qml-app-template/src/maincomponentplugin/maincomponentplugin.h000066400000000000000000000012511476226662700320440ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef MAINCOMPONENTPLUGIN_H #define MAINCOMPONENTPLUGIN_H #include class QQmlComponent; class MainComponentPlugin : public QObject, public DTK_QUICK_NAMESPACE::DQmlAppMainWindowInterface { Q_OBJECT Q_PLUGIN_METADATA(IID DQmlAppMainWindowInterface_iid FILE "plugin.json") Q_INTERFACES(DTK_QUICK_NAMESPACE::DQmlAppMainWindowInterface) public: MainComponentPlugin(QObject *parent = nullptr); ~MainComponentPlugin() override; QUrl mainComponentPath() const override; }; #endif // MAINCOMPONENTPLUGIN_H dtkdeclarative-5.7.12/misc/qml-app-template/src/maincomponentplugin/plugin.json000066400000000000000000000000551476226662700277770ustar00rootroot00000000000000{ "appid": "org.deepin.%{ProjectName}" } dtkdeclarative-5.7.12/misc/qml-app-template/src/preloadplugin/000077500000000000000000000000001476226662700243655ustar00rootroot00000000000000dtkdeclarative-5.7.12/misc/qml-app-template/src/preloadplugin/CMakeLists.txt000066400000000000000000000022771476226662700271350ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.1) set(PRELOAD_LIB_NAME ${CMAKE_PROJECT_NAME}-preload) ###! 请确保 preloadplugin 下仅依赖最少的三方内容, ###! 且不做额外的复杂操作,将第三方库和自定义类型放在 ###! maincomponentplugin 中,保证程序能够快速启动。 # Set sources set(PRELOAD_SRC preloadplugin.cpp ) # Find the QtQuick library find_package(Qt${QT_VERSION_MAJOR}Quick CONFIG REQUIRED) if(${QT_VERSION_MAJOR} EQUAL 5) find_package(Qt5QuickCompiler REQUIRED) qtquick_compiler_add_resources(PRELOAD_RCC_SOURCES preload.qrc) else() qt_add_resources(PRELOAD_RCC_SOURCES preload.qrc) set(DTK_VERSION_MAJOR ${QT_VERSION_MAJOR}) endif() # 保证 preloadplugin 目录下头文件全局可见 include_directories(src/preloadplugin) # Add LIB add_library(${PRELOAD_LIB_NAME} SHARED ${PRELOAD_SRC} ${PRELOAD_RCC_SOURCES} ) # 由于 LIB 程序为本项目的功能实现部分,需要用到的第三方库都需要在此处添加。 target_link_libraries(${PRELOAD_LIB_NAME} Qt${QT_VERSION_MAJOR}::Quick Dtk${DTK_VERSION_MAJOR}::Declarative ) # Add install rule install(TARGETS ${PRELOAD_LIB_NAME} DESTINATION ${DTK_QML_APP_PLUGIN_PATH}) dtkdeclarative-5.7.12/misc/qml-app-template/src/preloadplugin/Preload.qml000066400000000000000000000035621476226662700264740ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick 2.11 import QtQuick.Controls 2.4 import QtQuick.Window 2.0 import org.deepin.dtk 1.0 import "." /** Preload 作为程序的主窗口被 AppLoader 提前加载,用于达到快速 启动的功能。 在使用时,可以配合 DWindow 的 overlayExited属性, 进行流畅化动画设计。 Preload 中可以使用 ApplicationWindow; Window 和 DialogWindow 作为主窗口,但请注意,每个程序只有一个 Preload 入口,而这个 Preload 入口 将作为程序的主界面显示,当程序存在多个 Window 窗口时,请将主窗口作为 Preload 窗口。 Preload 中 loadingOverlay 作为流畅化过渡的组件属性,请不要在程序加载 完成之后使用它,也不要管理它的生命周期,其生命周期仅会在窗口过渡阶段。 loadingOverlay 属性除了可以使用一般控件之外,也能使用静态图,动态图等内容。当不指定其大小和位置时, 默认情况进行主窗口填充。当指定大小后,将按照控件大小和位置进行布局。 */ ApplicationWindow { id: window visible: true width: 900 height: 700 title: qsTr("qml-demo") flags: Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint header: TitleBar {} DWindow.enabled: true DWindow.loadingOverlay: Rectangle { color: palette.window BusyIndicator { id: indicator anchors.centerIn: parent running: true width: 64 height: 64 } } DWindow.overlayExited: Transition { NumberAnimation { properties: "scale" from: 1 to: 0 easing.type: Easing.InBack } } } dtkdeclarative-5.7.12/misc/qml-app-template/src/preloadplugin/plugin.json000066400000000000000000000000551476226662700265560ustar00rootroot00000000000000{ "appid": "org.deepin.%{ProjectName}" } dtkdeclarative-5.7.12/misc/qml-app-template/src/preloadplugin/preload.qrc000066400000000000000000000001321476226662700265160ustar00rootroot00000000000000 Preload.qml dtkdeclarative-5.7.12/misc/qml-app-template/src/preloadplugin/preloadplugin.cpp000066400000000000000000000006531476226662700277420ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "preloadplugin.h" #include DQUICK_USE_NAMESPACE PreloadPlugin::PreloadPlugin(QObject *parent) : QObject(parent) { } PreloadPlugin::~PreloadPlugin() { } QUrl PreloadPlugin::preloadComponentPath() const { // 预览组件的 qml 路径 return QUrl("qrc:///Preload.qml"); } dtkdeclarative-5.7.12/misc/qml-app-template/src/preloadplugin/preloadplugin.h000066400000000000000000000012041476226662700274000ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef PRELOADPLUGIN_H #define PRELOADPLUGIN_H #include class QQmlComponent; class PreloadPlugin : public QObject, public DTK_QUICK_NAMESPACE::DQmlAppPreloadInterface { Q_OBJECT Q_PLUGIN_METADATA(IID DQmlAppPreloadInterface_iid FILE "plugin.json") Q_INTERFACES(DTK_QUICK_NAMESPACE::DQmlAppPreloadInterface) public: PreloadPlugin(QObject *parent = nullptr); ~PreloadPlugin() override; virtual QUrl preloadComponentPath() const override; }; #endif // PRELOADPLUGIN_H dtkdeclarative-5.7.12/misc/qml-app-template/template.desktop000066400000000000000000000001331476226662700241340ustar00rootroot00000000000000[Desktop Entry] Name=%{ProjectName} Exec=/usr/bin/%{ProjectName} X-Deepin-TurboType=dtkqml dtkdeclarative-5.7.12/misc/qml-app-template/wizard.json.in000066400000000000000000000177651476226662700235510ustar00rootroot00000000000000{ "version": 1, "supportedProjectTypes": [ "CMakeProjectManager.CMakeProject"], "id": "A.Dtk@DTK_VERSION_MAJOR@ QtQuick Application", "category": "F.Project", "trDescription": "Creates a Dtk@DTK_VERSION_MAJOR@ QtQuick Application for UOS.", "trDisplayName": "Dtk@DTK_VERSION_MAJOR@ QtQuick Application", "trDisplayCategory": "Dtk QML Application", "featuresRequired": [ "QtSupport.Wizards.FeatureQt.5.6" ], "options": [ { "key": "DtkQmlAppMake", "value": "make" }, { "key": "ProjectFile", "value": "%{CMakeFile}" }, { "key": "CMakeFile", "value": "%{ProjectDirectory}/CMakeLists.txt" }, { "key": "QT_VERSION_MAJOR", "value": "%{JS: %{QtVersion}.QT_VERSION_MAJOR}" }, { "key": "QtQuickVersion", "value": "%{JS: %{QtVersion}.QtQuickVersion}" }, { "key": "QtQuickWindowVersion", "value": "%{JS: %{QtVersion}.QtQuickWindowVersion}" }, { "key": "QtQuickVirtualKeyboardImport", "value": "%{JS: %{QtVersion}.QtQuickVirtualKeyboardImport}" }, { "key": "QtQuickFeature", "value": "QtSupport.Wizards.FeatureQtQuick.%{QtQuickVersion}" }, { "key": "UseVirtualKeyboardByDefault", "value": "%{JS: [ %{Plugins} ].indexOf('Boot2Qt') >= 0 || [ %{Plugins} ].indexOf('Boot2QtQdb') >= 0}" }, { "key": "SetQPAPhysicalSize", "value": "%{UseVirtualKeyboardByDefault}" } ], "pages": [ { "trDisplayName": "Project Location", "trShortTitle": "Location", "typeId": "Project" }, { "trDisplayName": "Define Project Details", "trShortTitle": "Details", "typeId": "Fields", "data": [ { "name": "QtVersion", "trDisplayName": "Minimal required Qt version:", "type": "ComboBox", "data": { "index": @QML_TEMPLATE_QTVERSION_INDEX@, "items": [ { "trKey": "Qt 6.2", "value": "({ 'QtQuickVersion': '', 'QtQuickWindowVersion': '', 'QtQuickVirtualKeyboardImport': 'QtQuick.VirtualKeyboard', 'QT_VERSION_MAJOR': '6' })" }, { "trKey": "Qt 5.12", "value": "({ 'QtQuickVersion': '2.12', 'QtQuickWindowVersion': '2.12', 'QtQuickVirtualKeyboardImport': 'QtQuick.VirtualKeyboard 2.4', 'QT_VERSION_MAJOR': '5' })" }, { "trKey": "Qt 5.11", "value": "({ 'QtQuickVersion': '2.11', 'QtQuickWindowVersion': '2.11', 'QtQuickVirtualKeyboardImport': 'QtQuick.VirtualKeyboard 2.3', 'QT_VERSION_MAJOR': '5' })" }, { "trKey": "Qt 5.10", "value": "({ 'QtQuickVersion': '2.10', 'QtQuickWindowVersion': '2.10', 'QtQuickVirtualKeyboardImport': 'QtQuick.VirtualKeyboard 2.3', 'QT_VERSION_MAJOR': '5' })" }, { "trKey": "Qt 5.9", "value": "({ 'QtQuickVersion': '2.9', 'QtQuickWindowVersion': '2.2', 'QtQuickVirtualKeyboardImport': 'QtQuick.VirtualKeyboard 2.2', 'QT_VERSION_MAJOR': '5' })" }, { "trKey": "Qt 5.8", "value": "({ 'QtQuickVersion': '2.8', 'QtQuickWindowVersion': '2.2', 'QtQuickVirtualKeyboardImport': 'QtQuick.VirtualKeyboard 2.1', 'QT_VERSION_MAJOR': '5' })" }, { "trKey": "Qt 5.7", "value": "({ 'QtQuickVersion': '2.7', 'QtQuickWindowVersion': '2.2', 'QtQuickVirtualKeyboardImport': 'QtQuick.VirtualKeyboard 2.1', 'QT_VERSION_MAJOR': '5' })" }, { "trKey": "Qt 5.6", "value": "({ 'QtQuickVersion': '2.6', 'QtQuickWindowVersion': '2.2', 'QtQuickVirtualKeyboardImport': 'QtQuick.Enterprise.VirtualKeyboard 2.0', 'QT_VERSION_MAJOR': '5' })" } ] } }, { "name": "UseVirtualKeyboard", "trDisplayName": "Use Qt Virtual Keyboard", "type": "CheckBox", "data": { "checked": "false" } } ] }, { "trDisplayName": "Kit Selection", "trShortTitle": "Kits", "typeId": "Kits", "enabled": "%{JS: ! %{IsSubproject}}", "data": { "projectFilePath": "%{ProjectFile}" }, "requiredFeatures": [ "QtSupport.Wizards.FeatureQt", "%{QtQuickFeature}" ] }, { "trDisplayName": "Project Management", "trShortTitle": "Summary", "typeId": "Summary" } ], "generators": [ { "typeId": "File", "data": [ { "source": "./CMakeLists.txt", "target": "CMakeLists.txt", "openAsProject": true }, { "source": "./src" }, { "source": "./src/main" }, { "source": "./src/maincomponentplugin" }, { "source": "./src/preloadplugin" }, { "source": "./template.desktop", "target": "./%{ProjectName}.desktop" }, { "source": "./debian" }, { "source": "./debian/source" }, { "source": "../../git.ignore", "target": ".gitignore", "condition": "%{JS: !%{IsSubproject} && '%{VersionControl}' === 'G.Git'}" } ] } ] } dtkdeclarative-5.7.12/misc/qt_lib_dtkdeclarative.pri.in000066400000000000000000000012301476226662700232060ustar00rootroot00000000000000QT.dtkdeclarative.VERSION = @CMAKE_PROJECT_VERSION@ QT.dtkdeclarative.MAJOR_VERSION = @PROJECT_VERSION_MAJOR@ QT.dtkdeclarative.MINOR_VERSION = @PROJECT_VERSION_MINOR@ QT.dtkdeclarative.PATCH_VERSION = @PROJECT_VERSION_PATCH@ QT.dtkdeclarative.name = dtkdeclarative QT.dtkdeclarative.module = dtk@DTK_VERSION_MAJOR@declarative QT.dtkdeclarative.libs = @CMAKE_INSTALL_PREFIX@/@LIB_INSTALL_DIR@ QT.dtkdeclarative.includes = @CMAKE_INSTALL_PREFIX@/@INCLUDE_INSTALL_DIR@ QT.dtkdeclarative.frameworks = QT.dtkdeclarative.depends = core dbus xml gui dtkcore dtkgui quick quick_private QT.dtkdeclarative.module_config = v2 ltcg QT.dtkdeclarative.DEFINES = QT_MODULES += dtkdeclarative-5.7.12/qmlplugin/000077500000000000000000000000001476226662700166265ustar00rootroot00000000000000dtkdeclarative-5.7.12/qmlplugin/CMakeLists.txt000066400000000000000000000014061476226662700213670ustar00rootroot00000000000000include(${PROJECT_SOURCE_DIR}/qmlplugin/targets.cmake) add_library(${PLUGIN_NAME} SHARED) dtk_extend_target(${PLUGIN_NAME} EnableCov ${ENABLE_COV}) target_link_libraries(${PLUGIN_NAME} PRIVATE ${PLUGIN_NAME}_interface ${LIB_NAME} ) set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${PLUGIN_OUTPUT_DIR}/${URI_PATH}" ) # copy qmldir add_custom_command(TARGET ${PLUGIN_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${PROJECT_SOURCE_DIR}/qmlplugin/qmldir" #in-file "${PLUGIN_OUTPUT_DIR}/${URI_PATH}/qmldir" #out-file ) install(TARGETS ${PLUGIN_NAME} DESTINATION "${QML_INSTALL_DIR}/${URI_PATH}") install(FILES "${PROJECT_SOURCE_DIR}/qmlplugin/qmldir" DESTINATION "${QML_INSTALL_DIR}/${URI_PATH}") dtkdeclarative-5.7.12/qmlplugin/qmldir000066400000000000000000000000621476226662700200370ustar00rootroot00000000000000module org.deepin.dtk plugin dtkdeclarativeplugin dtkdeclarative-5.7.12/qmlplugin/qmlplugin_plugin.cpp000066400000000000000000000456651476226662700227400ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "qmlplugin_plugin.h" #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) #include "dquickwindow.h" #include "dquickitemviewport.h" #include "dquickblitframebuffer.h" #include "private/dhandlecontextmenuwindow_p.h" #include "private/dquickglow_p.h" #include "private/dquickinwindowblur_p.h" #include "private/dquickrectangle_p.h" #include "private/dquickbehindwindowblur_p.h" #include "private/dquickopacitymask_p.h" #include "private/dquickkeylistener_p.h" #include "private/dqmlglobalobject_p.h" #include "private/dconfigwrapper_p.h" #include "private/dquickiconimage_p.h" #include "private/dquickdciiconimage_p.h" #include "private/dquickiconlabel_p.h" #include "private/dsettingscontainer_p.h" #include "private/dmessagemanager_p.h" #include "private/dpopupwindowhandle_p.h" #include "private/dobjectmodelproxy_p.h" #include "private/dquickwaterprogressattribute_p.h" #include "private/dquickarrowboxpath_p.h" #include "private/dquickcoloroverlay_p.h" #include "private/dquickapploaderitem_p.h" #endif #include "private/dquickimageprovider_p.h" #include "private/dquickcontrolpalette_p.h" #include #include #include #include #include DGUI_USE_NAMESPACE DQUICK_BEGIN_NAMESPACE static const QString softwareBackend = "software"; template inline void dtkRegisterType(const char *uri1, const char *uri2, int versionMajor, int versionMinor, const char *qmlName) { qmlRegisterType(uri1, versionMajor, versionMinor, qmlName); if (uri2) qmlRegisterType(uri2, versionMajor, versionMinor, qmlName); } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) template inline void dtkRegisterAnonymousType(const char *uri1, const char *uri2, int versionMajor) { #if (QT_VERSION > QT_VERSION_CHECK(5, 14, 0)) qmlRegisterAnonymousType(uri1, versionMajor); if (uri2) qmlRegisterAnonymousType(uri2, versionMajor); #else Q_UNUSED(uri1) Q_UNUSED(uri2) Q_UNUSED(versionMajor) qmlRegisterType(); #endif } template inline void dtkRegisterUncreatableType(const char *uri1, const char *uri2, int versionMajor, int versionMinor, const char *qmlName, const QString& reason) { qmlRegisterUncreatableType(uri1, versionMajor, versionMinor, qmlName, reason); if (uri2) qmlRegisterUncreatableType(uri2, versionMajor, versionMinor, qmlName, reason); } template inline void dtkRegisterSingletonType(const char *uri1, const char *uri2, int versionMajor, int versionMinor, const char *qmlName, QObject *(*callback)(QQmlEngine *, QJSEngine *)) { qmlRegisterSingletonType(uri1, versionMajor, versionMinor, qmlName, callback); if (uri2) qmlRegisterSingletonType(uri2, versionMajor, versionMinor, qmlName, callback); } inline void dtkSettingsRegisterType(const char *uri1, const char *uri2, int versionMajor, int versionMinor, const char *qmlName) { static QString urlTemplate = QStringLiteral("qrc:/dtk/declarative/qml/settings/%1.qml"); const QUrl url(urlTemplate.arg(qmlName)); qmlRegisterType(url, uri1, versionMajor, versionMinor, qmlName); if (uri2) qmlRegisterType(url, uri2, versionMajor, versionMinor, qmlName); } #endif inline void dtkRegisterType(const char *uri1, const char *uri2, int versionMajor, int versionMinor, const char *qmlName, const char *subdir = "") { static QString urlTemplate = QStringLiteral("qrc:/dtk/declarative/qml/%1%2.qml"); const QUrl url(urlTemplate.arg(subdir).arg(qmlName)); qmlRegisterType(url, uri1, versionMajor, versionMinor, qmlName); if (uri2) qmlRegisterType(url, uri2, versionMajor, versionMinor, qmlName); } inline void dtkRegisterTypeAlias(const char *uri1, const char *uri2, int versionMajor, int versionMinor, const char *qmlFileName, const char *alias, const char *subdir = "") { static QString urlTemplate = QStringLiteral("qrc:/dtk/declarative/qml/%1%2.qml"); const QUrl url(urlTemplate.arg(subdir).arg(qmlFileName)); qmlRegisterType(url, uri1, versionMajor, versionMinor, alias); if (uri2) qmlRegisterType(url, uri2, versionMajor, versionMinor, alias); } inline void dtkRegisterTypeOverridable(const char *uri1, const char *uri2, int versionMajor, int versionMinor, const char *qmlFileName) { dtkRegisterTypeAlias(uri1, uri2, versionMajor, versionMinor, qmlFileName, qmlFileName, "overridable/"); } inline void dtkStyleRegisterSingletonType(const char *uri1, const char *uri2, int versionMajor, int versionMinor, const char *qmlName) { static QString urlTemplate = QStringLiteral("qrc:/dtk/declarative/qml/style/%1.qml"); QUrl url(urlTemplate.arg(qmlName)); qmlRegisterSingletonType(url, uri1, versionMajor, versionMinor, qmlName); if (uri2) qmlRegisterSingletonType(url, uri2, versionMajor, versionMinor, qmlName); } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) static QVariant quickColorTypeConverter(const QString &data) { return QVariant::fromValue(DQuickControlColor(QColor(data))); } static QVariant dcolorTypeConverter(const QString &data) { return QVariant::fromValue(DColor(QColor(data))); } #endif template ReturnType convertColorToQuickColorType(const QColor &value) { return DQuickControlColor(value); } template ReturnType convertColorToDColorType(const QColor &value) { return DColor(value); } template ReturnType convertDColorToQuickColorType(const DColor &value) { return DQuickControlColor(value); } void QmlpluginPlugin::registerTypes(const char *uri) { // @uri org.deepin.dtk qmlRegisterModule(uri, 1, 0); // @uri org.deepin.dtk.style const QByteArray styleUri = QByteArray(uri).append(".style"); qmlRegisterModule(styleUri.constData(), 1, 0); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QByteArray implUri; dtkRegisterTypeOverridable(uri, nullptr, 1, 0, "InWindowBlur"); #else // @uri org.deepin.dtk.impl const QByteArray implUri = QByteArray(uri).append(".impl"); qmlRegisterModule(implUri.constData(), 1, 0); // @uri org.deepin.dtk.private const QByteArray privateUri = QByteArray(uri).append(".private"); qmlRegisterModule(privateUri.constData(), 1, 0); // @uri org.deepin.dtk.controls const QByteArray controlsUri = QByteArray(uri).append(".controls"); qmlRegisterModule(controlsUri.constData(), 1, 0); // @uri org.deepin.dtk.settings const QByteArray settingsUri = QByteArray(uri) + ".settings"; qmlRegisterModule(settingsUri, 1, 0); // for org.deepin.dtk and org.deepin.dtk.impl dtkRegisterType(uri, implUri, 1, 0, "QtIcon"); dtkRegisterType(uri, implUri, 1, 0, "IconLabel"); dtkRegisterType(uri, implUri, 1, 0, "GlowEffect"); dtkRegisterType(uri, implUri, 1, 0, "DciIcon"); dtkRegisterType(uri, implUri, 1, 0, "ItemViewport"); dtkRegisterType(uri, implUri, 1, 0, "FontManager"); dtkRegisterType(uri, implUri, 1, 0, "ContextMenuWindow"); dtkRegisterType(uri, implUri, 1, 0, "BlitFramebuffer"); dtkRegisterType(uri, implUri, 1, 0, "Config"); dtkRegisterType(uri, implUri, 1, 0, "InWindowBlur"); dtkRegisterType(uri, implUri, 1, 0, "Palette"); dtkRegisterType(uri, implUri, 1, 0, "FloatingMessageContainer"); dtkRegisterUncreatableType(uri, implUri, 1, 0, "MessageManager", "Window Attached"); dtkRegisterType(uri, implUri, 1, 0, "RoundRectangle"); dtkRegisterType(uri, implUri, 1, 0, "BehindWindowBlur"); dtkRegisterType(uri, implUri, 1, 0, "ObjectModelProxy"); dtkRegisterType(uri, implUri, 1, 0, "SoftwareOpacityMask"); dtkRegisterType(uri, implUri, 1, 0, "KeySequenceListener"); dtkRegisterType(uri, implUri, 1, 0, "WaterProgressAttribute"); dtkRegisterType(uri, implUri, 1, 0, "ArrowBoxPath"); dtkRegisterType(uri, implUri, 1, 0, "AppLoader"); dtkRegisterType(uri, implUri, 1, 0, "SoftwareColorOverlay"); dtkRegisterAnonymousType(uri, implUri, 1); dtkRegisterAnonymousType(uri, implUri, 1); dtkRegisterAnonymousType(uri, implUri, 1); dtkRegisterAnonymousType(uri, implUri, 1); dtkRegisterUncreatableType(uri, implUri, 1, 0, "DWindow", "DQuickWindow Attached"); dtkRegisterUncreatableType(uri, implUri, 1, 0, "ColorSelector", QStringLiteral("ColorSelector is only available as an attached property.")); dtkRegisterUncreatableType(uri, implUri, 1, 0, "Color", QStringLiteral("Color is only available as enums.")); dtkRegisterUncreatableType(uri, implUri, 1, 0, "PopupHandle", "PopupWindow Attached"); dtkRegisterUncreatableType(uri, implUri, 1, 0, "PlatformHandle", "PlatformHandle"); qRegisterMetaType(); qRegisterMetaType("ControlColor"); qRegisterMetaType(); qRegisterMetaType(); //DQMLGlobalObject 依赖 DWindowManagerHelper中枚举的定义,所以需要先注册 dtkRegisterSingletonType(uri, implUri, 1, 0, "WindowManagerHelper", [](QQmlEngine *, QJSEngine *) -> QObject * { auto helper = DWindowManagerHelper::instance(); QQmlEngine::setObjectOwnership(helper, QQmlEngine::CppOwnership); return helper; }); dtkRegisterSingletonType(uri, implUri, 1, 0, "ApplicationHelper", [](QQmlEngine *, QJSEngine *) -> QObject * { auto helper = DGuiApplicationHelper::instance(); QQmlEngine::setObjectOwnership(helper, QQmlEngine::CppOwnership); return helper; }); qRegisterMetaType("Dtk::Gui::DGuiApplicationHelper::ColorType"); dtkRegisterSingletonType(uri, implUri, 1, 0, "DTK", [](QQmlEngine *qmlEngine, QJSEngine *jsEngine) -> QObject * { return DQMLGlobalObject::create(qmlEngine, jsEngine); }); // 自定义的 QML 控件可以通过把 QML 文件注册到环境中的方式来实现 // for org.deepin.dtk dtkRegisterType(uri, nullptr, 1, 0, "RectangularShadow"); dtkRegisterType(uri, nullptr, 1, 0, "FocusBoxBorder"); dtkRegisterType(uri, nullptr, 1, 0, "CicleSpreadAnimation"); dtkRegisterType(uri, nullptr, 1, 0, "BoxShadow"); dtkRegisterType(uri, nullptr, 1, 0, "BoxInsetShadow"); dtkRegisterType(uri, nullptr, 1, 0, "InsideBoxBorder"); dtkRegisterType(uri, nullptr, 1, 0, "OutsideBoxBorder"); dtkRegisterType(uri, nullptr, 1, 0, "SortFilterModel"); // for org.deepin.dtk.controls // QtQuick Controls dtkRegisterType(uri, controlsUri, 1, 0, "ApplicationWindow"); dtkRegisterType(uri, controlsUri, 1, 0, "Button"); dtkRegisterType(uri, controlsUri, 1, 0, "Menu"); dtkRegisterType(uri, controlsUri, 1, 0, "MenuItem"); dtkRegisterType(uri, controlsUri, 1, 0, "MenuSeparator"); dtkRegisterType(uri, controlsUri, 1, 0, "ScrollIndicator"); dtkRegisterType(uri, controlsUri, 1, 0, "Popup"); dtkRegisterType(uri, controlsUri, 1, 0, "ScrollBar"); // DTK Controls dtkRegisterType(uri, controlsUri, 1, 0, "LineEdit"); dtkRegisterType(uri, controlsUri, 1, 0, "SearchEdit"); dtkRegisterType(uri, controlsUri, 1, 0, "PasswordEdit"); dtkRegisterType(uri, controlsUri, 1, 0, "WarningButton"); dtkRegisterType(uri, controlsUri, 1, 0, "RecommandButton"); dtkRegisterType(uri, controlsUri, 1, 0, "ToolButton"); dtkRegisterType(uri, controlsUri, 1, 0, "IconButton"); dtkRegisterType(uri, controlsUri, 1, 0, "FloatingButton"); dtkRegisterType(uri, controlsUri, 1, 0, "ButtonBox"); dtkRegisterType(uri, controlsUri, 1, 0, "TitleBar"); dtkRegisterType(uri, controlsUri, 1, 0, "DialogTitleBar"); dtkRegisterType(uri, controlsUri, 1, 0, "WindowButton"); dtkRegisterType(uri, controlsUri, 1, 0, "WindowButtonGroup"); dtkRegisterType(uri, controlsUri, 1, 0, "DialogWindow"); dtkRegisterType(uri, controlsUri, 1, 0, "AboutDialog"); dtkRegisterType(uri, controlsUri, 1, 0, "HelpAction"); dtkRegisterType(uri, controlsUri, 1, 0, "AboutAction"); dtkRegisterType(uri, controlsUri, 1, 0, "QuitAction"); dtkRegisterType(uri, controlsUri, 1, 0, "ThemeMenu"); dtkRegisterType(uri, controlsUri, 1, 0, "AlertToolTip"); dtkRegisterType(uri, controlsUri, 1, 0, "FlowStyle"); dtkRegisterType(uri, controlsUri, 1, 0, "Control"); dtkRegisterType(uri, controlsUri, 1, 0, "SpinBox"); dtkRegisterType(uri, controlsUri, 1, 0, "TextField"); dtkRegisterType(uri, controlsUri, 1, 0, "TextArea"); dtkRegisterType(uri, controlsUri, 1, 0, "PlusMinusSpinBox"); dtkRegisterType(uri, controlsUri, 1, 0, "FloatingPanel"); dtkRegisterType(uri, controlsUri, 1, 0, "FloatingMessage"); dtkRegisterType(uri, controlsUri, 1, 0, "HighlightPanel"); dtkRegisterType(uri, controlsUri, 1, 0, "ArrowListView"); dtkRegisterType(uri, controlsUri, 1, 0, "StyledBehindWindowBlur"); dtkRegisterType(uri, controlsUri, 1, 0, "PopupWindow"); dtkRegisterType(uri, controlsUri, 1, 0, "Switch"); dtkRegisterType(uri, controlsUri, 1, 0, "Slider"); dtkRegisterType(uri, controlsUri, 1, 0, "ComboBox"); dtkRegisterType(uri, controlsUri, 1, 0, "ActionButton"); dtkRegisterType(uri, controlsUri, 1, 0, "ItemDelegate"); dtkRegisterType(uri, controlsUri, 1, 0, "CheckDelegate"); dtkRegisterType(uri, controlsUri, 1, 0, "TipsSlider"); dtkRegisterType(uri, controlsUri, 1, 0, "SliderTipItem"); dtkRegisterType(uri, controlsUri, 1, 0, "CheckBox"); dtkRegisterType(uri, controlsUri, 1, 0, "IpV4LineEdit"); dtkRegisterType(uri, controlsUri, 1, 0, "StyledArrowShapeWindow"); // TODO(xiaoyaobing): software rendering has not been completed dtkRegisterType(uri, controlsUri, 1, 0, "ArrowShapePopup"); dtkRegisterType(uri, controlsUri, 1, 0, "Action"); dtkRegisterType(uri, controlsUri, 1, 0, "ActionGroup"); dtkRegisterType(uri, controlsUri, 1, 0, "Label"); dtkRegisterType(uri, controlsUri, 1, 0, "Container"); dtkRegisterType(uri, controlsUri, 1, 0, "ButtonGroup"); dtkRegisterType(uri, controlsUri, 1, 0, "ScrollView"); dtkRegisterType(uri, controlsUri, 1, 0, "MenuBar"); dtkRegisterType(uri, controlsUri, 1, 0, "AbstractButton"); dtkRegisterType(uri, controlsUri, 1, 0, "TabBar"); dtkRegisterType(uri, controlsUri, 1, 0, "SwipeDelegate"); dtkRegisterType(uri, controlsUri, 1, 0, "SwipeView"); dtkRegisterType(uri, controlsUri, 1, 0, "Drawer"); dtkRegisterType(uri, controlsUri, 1, 0, "Dial"); dtkRegisterType(uri, controlsUri, 1, 0, "Dialog"); dtkRegisterType(uri, controlsUri, 1, 0, "DelayButton"); dtkRegisterType(uri, controlsUri, 1, 0, "RoundButton"); dtkRegisterType(uri, controlsUri, 1, 0, "RadioButton"); dtkRegisterType(uri, controlsUri, 1, 0, "ToolTip"); dtkRegisterType(uri, controlsUri, 1, 0, "DialogButtonBox"); dtkRegisterType(uri, controlsUri, 1, 0, "Frame"); dtkRegisterType(uri, controlsUri, 1, 0, "GroupBox"); dtkRegisterType(uri, controlsUri, 1, 0, "PageIndicator"); dtkRegisterType(uri, controlsUri, 1, 0, "Pane"); dtkRegisterType(uri, controlsUri, 1, 0, "StackView"); dtkRegisterType(uri, controlsUri, 1, 0, "BusyIndicator"); dtkRegisterType(uri, controlsUri, 1, 0, "ProgressBar"); dtkRegisterType(uri, controlsUri, 1, 0, "BoxPanel"); dtkRegisterType(uri, controlsUri, 1, 0, "KeySequenceEdit"); dtkRegisterType(uri, controlsUri, 1, 0, "ButtonIndicator"); dtkRegisterType(uri, controlsUri, 1, 0, "EmbeddedProgressBar"); dtkRegisterType(uri, controlsUri, 1, 0, "WaterProgressBar"); // for org.deepin.dtk.settings dtkRegisterType(settingsUri, implUri, 1, 0, "SettingsOption"); dtkRegisterType(settingsUri, implUri, 1, 0, "SettingsGroup"); dtkRegisterType(settingsUri, implUri, 1, 0, "SettingsContainer"); dtkSettingsRegisterType(settingsUri, nullptr, 1, 0, "SettingsDialog"); dtkSettingsRegisterType(settingsUri, nullptr, 1, 0, "OptionDelegate"); dtkSettingsRegisterType(settingsUri, nullptr, 1, 0, "CheckBox"); dtkSettingsRegisterType(settingsUri, nullptr, 1, 0, "LineEdit"); dtkSettingsRegisterType(settingsUri, nullptr, 1, 0, "ComboBox"); dtkSettingsRegisterType(settingsUri, nullptr, 1, 0, "NavigationTitle"); dtkSettingsRegisterType(settingsUri, nullptr, 1, 0, "ContentTitle"); dtkSettingsRegisterType(settingsUri, nullptr, 1, 0, "ContentBackground"); // for org.deepin.dtk.private dtkRegisterType(privateUri, implUri, 1, 0, "ButtonPanel"); #endif dtkRegisterType(uri, implUri, 1, 0, "SortFilterProxyModel"); // for org.deepin.dtk.style(allowed to override) dtkStyleRegisterSingletonType(uri, styleUri, 1, 0, "Style"); if (softwareBackend == QQuickWindow::sceneGraphBackend()) { dtkRegisterTypeAlias(uri, implUri, 1, 0, "SoftwareColorOverlay", "ColorOverlay", "private/"); } else { dtkRegisterType(uri, implUri, 1, 0, "ColorOverlay", "private/"); } if (softwareBackend == QQuickWindow::sceneGraphBackend()) { dtkRegisterTypeAlias(uri, implUri, 1, 0, "SoftwareOpacityMask", "OpacityMask", "private/"); } else { dtkRegisterType(uri, implUri, 1, 0, "OpacityMask", "private/"); } // for custom type QMetaType::registerConverter(convertColorToQuickColorType); QMetaType::registerConverter(convertColorToDColorType); QMetaType::registerConverter(convertDColorToQuickColorType); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QQmlMetaType::registerCustomStringConverter(qMetaTypeId(), quickColorTypeConverter); QQmlMetaType::registerCustomStringConverter(qMetaTypeId(), dcolorTypeConverter); #endif } void QmlpluginPlugin::initializeEngine(QQmlEngine *engine, const char *uri) { Q_UNUSED(DGuiApplicationHelper::instance()); engine->addImageProvider("dtk.icon", new DQuickIconProvider); engine->addImageProvider("dtk.dci.icon", new DQuickDciIconProvider); engine->addImageProvider("dtk.shadow", new DQuickShadowProvider); QQmlExtensionPlugin::initializeEngine(engine, uri); DQMLGlobalObject::loadTranslator(); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/qmlplugin/qmlplugin_plugin.h000066400000000000000000000010001476226662700223540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include DQUICK_BEGIN_NAMESPACE class QmlpluginPlugin : public QQmlExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) public: void registerTypes(const char *uri) override; void initializeEngine(QQmlEngine *engine, const char *uri) override; }; DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/qmlplugin/targets.cmake000066400000000000000000000012161476226662700213010ustar00rootroot00000000000000find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Qml Quick) find_package(Dtk${DTK_VERSION_MAJOR}Core REQUIRED) find_package(Dtk${DTK_VERSION_MAJOR}Gui REQUIRED) add_library(${PLUGIN_NAME}_interface INTERFACE) target_sources(${PLUGIN_NAME}_interface INTERFACE ${PROJECT_SOURCE_DIR}/qmlplugin/qmlplugin_plugin.cpp ${PROJECT_SOURCE_DIR}/qmlplugin/qmlplugin_plugin.h ) target_link_libraries(${PLUGIN_NAME}_interface INTERFACE Qt${QT_VERSION_MAJOR}::Qml Qt${QT_VERSION_MAJOR}::QmlPrivate Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::QuickPrivate Dtk${DTK_VERSION_MAJOR}::Core Dtk${DTK_VERSION_MAJOR}::Gui ) dtkdeclarative-5.7.12/qt6/000077500000000000000000000000001476226662700153305ustar00rootroot00000000000000dtkdeclarative-5.7.12/qt6/CMakeLists.txt000066400000000000000000000002011476226662700200610ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.10) add_subdirectory(src) add_subdirectory(src/qml/private) add_subdirectory(src/qml/settings) dtkdeclarative-5.7.12/qt6/src/000077500000000000000000000000001476226662700161175ustar00rootroot00000000000000dtkdeclarative-5.7.12/qt6/src/CMakeLists.txt000066400000000000000000000046171476226662700206670ustar00rootroot00000000000000include(${PROJECT_SOURCE_DIR}/src/targets.cmake) find_package(Qt${QT_DEFAULT_MAJOR_VERSION}ShaderTools) include(${PROJECT_SOURCE_DIR}/qt6/src/qml.cmake) qt_add_qml_module(${LIB_NAME} PLUGIN_TARGET ${PLUGIN_NAME} URI ${URI} VERSION "1.0" SHARED NO_GENERATE_PLUGIN_SOURCE NO_PLUGIN_OPTIONAL QML_FILES ${QML_DTK_CONTROLS} SOURCES ${SRCS} ${HEADERS} dquickextendregister_p.h OUTPUT_DIRECTORY "${PLUGIN_OUTPUT_DIR}/${URI_PATH}" ) dtk_extend_target(${LIB_NAME} EnableCov ${ENABLE_COV}) dtk_extend_target(${PLUGIN_NAME} EnableCov ${ENABLE_COV}) qt_add_translations(${LIB_NAME} TS_FILES ${TS_FILES} QM_FILES_OUTPUT_VARIABLE QM_FILES IMMEDIATE_CALL ) set_target_properties(${LIB_NAME} PROPERTIES VERSION ${CMAKE_PROJECT_VERSION} SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR} EXPORT_NAME Declarative ) target_link_libraries(${LIB_NAME} PUBLIC ${LIB_NAME}_properties PRIVATE ${LIB_NAME}_sources ) file(GLOB QML_RCS dtkdeclarative_qml.qrc dtkdeclarative_overridable_qml.qrc) qt_add_resources(RESOURCES ${QML_RCS} ${ASSETS_RCS} ) target_sources(${LIB_NAME} PRIVATE ${RESOURCES}) qt_add_shaders(${LIB_NAME} "_dtkdeclarative_shaders_ng" BATCHABLE PRECOMPILE PREFIX "/dtk/declarative" FILES "shaders_ng/quickitemviewport.vert" "shaders_ng/quickitemviewport.frag" "shaders_ng/quickitemviewport-opaque.vert" "shaders_ng/quickitemviewport-opaque.frag" "shaders_ng/cornerscolorshader.vert" "shaders_ng/cornerscolorshader.frag" "shaders_ng/shadowmaterial.vert" "shaders_ng/shadowmaterial.frag" ) include(${PROJECT_SOURCE_DIR}/qmlplugin/targets.cmake) target_link_libraries(${PLUGIN_NAME} PRIVATE ${PLUGIN_NAME}_interface ${LIB_NAME} ) # Install library install(TARGETS ${LIB_NAME} EXPORT Dtk${DTK_VERSION_MAJOR}DeclarativeTargets DESTINATION "${LIB_INSTALL_DIR}") # Install export targets install(EXPORT Dtk${DTK_VERSION_MAJOR}DeclarativeTargets NAMESPACE Dtk${DTK_VERSION_MAJOR}:: FILE Dtk${DTK_VERSION_MAJOR}DeclarativeTargets.cmake DESTINATION "${CONFIG_INSTALL_DIR}") # Install translations install(FILES ${QM_FILES} DESTINATION "${TRANSLATIONS_INSTALL_PATH}") # Install plugin install(TARGETS ${PLUGIN_NAME} DESTINATION "${QML_INSTALL_DIR}/${URI_PATH}") install(DIRECTORY "${PLUGIN_OUTPUT_DIR}/${URI_PATH}/" DESTINATION "${QML_INSTALL_DIR}/${URI_PATH}") dtkdeclarative-5.7.12/qt6/src/dquickextendregister_p.h000066400000000000000000000033551476226662700230520ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include "dqmlglobalobject_p.h" #include #include #include #include #include #include #include DQUICK_BEGIN_NAMESPACE DGUI_USE_NAMESPACE namespace DColorForeign { Q_NAMESPACE QML_NAMED_ELEMENT(Color) QML_FOREIGN_NAMESPACE(DTK_QUICK_NAMESPACE::DColor) }; struct WindowManagerHelperForeign { Q_GADGET QML_FOREIGN(DWindowManagerHelper) QML_SINGLETON QML_NAMED_ELEMENT(WindowManagerHelper) public: static DWindowManagerHelper *create(QQmlEngine *, QJSEngine *) { auto helper = DWindowManagerHelper::instance(); QQmlEngine::setObjectOwnership(helper, QQmlEngine::CppOwnership); return helper; } }; struct DGuiApplicationHelperForeign { Q_GADGET QML_FOREIGN(DGuiApplicationHelper) QML_SINGLETON QML_NAMED_ELEMENT(ApplicationHelper) public: static DGuiApplicationHelper *create(QQmlEngine *, QJSEngine *) { auto helper = DGuiApplicationHelper::instance(); QQmlEngine::setObjectOwnership(helper, QQmlEngine::CppOwnership); return helper; } }; struct DFontManagerForeign { Q_GADGET QML_FOREIGN(DFontManager) QML_NAMED_ELEMENT(FontManager) }; struct DPlatformHandleForeign { Q_GADGET QML_FOREIGN(DPlatformHandle) QML_NAMED_ELEMENT(PlatformHandle) QML_UNCREATABLE("PlatformHandle") }; namespace DSysInfoForeign { Q_NAMESPACE QML_NAMED_ELEMENT(SysInfo) QML_FOREIGN_NAMESPACE(DTK_CORE_NAMESPACE::DSysInfo) }; DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/qt6/src/dtkdeclarative_overridable_qml.qrc000066400000000000000000000001761476226662700250470ustar00rootroot00000000000000 qml/overridable/InWindowBlur.qml dtkdeclarative-5.7.12/qt6/src/dtkdeclarative_qml.qrc000066400000000000000000000120251476226662700224650ustar00rootroot00000000000000 qml/SearchEdit.qml qml/LineEdit.qml qml/ControlBackground.qml qml/PasswordEdit.qml qml/ButtonBox.qml qml/FloatingButton.qml qml/IconButton.qml qml/RecommandButton.qml qml/ToolButton.qml qml/WarningButton.qml qml/FocusBoxBorder.qml qml/CicleSpreadAnimation.qml qml/TitleBar.qml qml/DialogTitleBar.qml qml/WindowButton.qml qml/WindowButtonGroup.qml qml/DialogWindow.qml qml/AboutDialog.qml qml/HelpAction.qml qml/AboutAction.qml qml/QuitAction.qml qml/ThemeMenu.qml qml/RectangularShadow.qml qml/AlertToolTip.qml qml/FlowStyle.qml qml/Button.qml qml/style/Style.qml qml/settings/SettingsDialog.qml qml/settings/OptionDelegate.qml qml/settings/CheckBox.qml qml/settings/ComboBox.qml qml/settings/NavigationTitle.qml qml/settings/ContentTitle.qml qml/settings/ContentBackground.qml qml/settings/LineEdit.qml qml/Control.qml qml/PlusMinusSpinBox.qml qml/EditPanel.qml qml/TextArea.qml qml/TextField.qml qml/SpinBox.qml qml/SpinBoxIndicator.qml qml/ApplicationWindow.qml qml/BoxShadow.qml qml/FloatingPanel.qml qml/FloatingMessage.qml qml/Menu.qml qml/MenuItem.qml qml/MenuSeparator.qml qml/HighlightPanel.qml qml/ArrowListView.qml qml/ScrollIndicator.qml qml/StyledBehindWindowBlur.qml qml/Popup.qml qml/PopupWindow.qml qml/Switch.qml qml/Slider.qml qml/SliderHandle.qml qml/ScrollBar.qml qml/ComboBox.qml qml/private/ButtonPanel.qml qml/ActionButton.qml qml/ItemDelegate.qml qml/ListView.qml qml/CheckDelegate.qml qml/TipsSlider.qml qml/SliderTipItem.qml qml/BoxInsetShadow.qml qml/CheckBox.qml qml/IpV4LineEdit.qml qml/OutsideBoxBorder.qml qml/InsideBoxBorder.qml qml/SortFilterModel.qml qml/ArrowShapePopupWindow.qml qml/StyledArrowShapeWindow.qml qml/private/OpacityMask.qml qml/private/SoftwareOpacityMask.qml qml/ArrowShapePopup.qml qml/Action.qml qml/ActionGroup.qml qml/Label.qml qml/Container.qml qml/ButtonGroup.qml qml/ScrollView.qml qml/MenuBar.qml qml/AbstractButton.qml qml/TabBar.qml qml/SwipeDelegate.qml qml/SwipeView.qml qml/Drawer.qml qml/Dial.qml qml/Dialog.qml qml/DelayButton.qml qml/RoundButton.qml qml/RadioButton.qml qml/ToolTip.qml qml/DialogButtonBox.qml qml/Frame.qml qml/GroupBox.qml qml/PageIndicator.qml qml/StackView.qml qml/BusyIndicator.qml qml/ProgressBar.qml qml/BoxPanel.qml qml/Pane.qml qml/KeySequenceEdit.qml qml/private/KeySequenceLabel.qml qml/ButtonIndicator.qml qml/EmbeddedProgressBar.qml qml/WaterProgressBar.qml qml/ControlGroup.qml qml/ControlGroupItem.qml qml/private/ProgressBarImpl.qml qml/private/ProgressBarPanel.qml qml/PlaceholderText.qml qml/private/ColorOverlay.qml qml/private/SoftwareColorOverlay.qml qml/private/ArrowListViewButton.qml dtkdeclarative-5.7.12/qt6/src/qml.cmake000066400000000000000000000055221476226662700177160ustar00rootroot00000000000000set(QML_DTK_CONTROLS "qml/SearchEdit.qml" "qml/LineEdit.qml" "qml/ControlBackground.qml" "qml/PasswordEdit.qml" "qml/ButtonBox.qml" "qml/FloatingButton.qml" "qml/IconButton.qml" "qml/RecommandButton.qml" "qml/ToolButton.qml" "qml/WarningButton.qml" "qml/FocusBoxBorder.qml" "qml/CicleSpreadAnimation.qml" "qml/TitleBar.qml" "qml/DialogTitleBar.qml" "qml/WindowButton.qml" "qml/WindowButtonGroup.qml" "qml/DialogWindow.qml" "qml/AboutDialog.qml" "qml/HelpAction.qml" "qml/AboutAction.qml" "qml/QuitAction.qml" "qml/ThemeMenu.qml" "qml/RectangularShadow.qml" "qml/AlertToolTip.qml" "qml/FlowStyle.qml" "qml/Button.qml" "qml/Control.qml" "qml/PlusMinusSpinBox.qml" "qml/EditPanel.qml" "qml/TextArea.qml" "qml/TextField.qml" "qml/SpinBox.qml" "qml/SpinBoxIndicator.qml" "qml/ApplicationWindow.qml" "qml/BoxShadow.qml" "qml/FloatingPanel.qml" "qml/FloatingMessage.qml" "qml/Menu.qml" "qml/MenuItem.qml" "qml/MenuSeparator.qml" "qml/HighlightPanel.qml" "qml/ArrowListView.qml" "qml/ScrollIndicator.qml" "qml/StyledBehindWindowBlur.qml" "qml/Popup.qml" "qml/PopupWindow.qml" "qml/Switch.qml" "qml/Slider.qml" "qml/SliderHandle.qml" "qml/ScrollBar.qml" "qml/ComboBox.qml" "qml/ActionButton.qml" "qml/ItemDelegate.qml" "qml/ListView.qml" "qml/CheckDelegate.qml" "qml/TipsSlider.qml" "qml/SliderTipItem.qml" "qml/BoxInsetShadow.qml" "qml/CheckBox.qml" "qml/IpV4LineEdit.qml" "qml/OutsideBoxBorder.qml" "qml/InsideBoxBorder.qml" "qml/SortFilterModel.qml" "qml/ArrowShapePopupWindow.qml" "qml/StyledArrowShapeWindow.qml" "qml/ArrowShapePopup.qml" "qml/Action.qml" "qml/ActionGroup.qml" "qml/Label.qml" "qml/Container.qml" "qml/ButtonGroup.qml" "qml/ScrollView.qml" "qml/MenuBar.qml" "qml/AbstractButton.qml" "qml/TabBar.qml" "qml/SwipeDelegate.qml" "qml/SwipeView.qml" "qml/Drawer.qml" "qml/Dial.qml" "qml/Dialog.qml" "qml/DelayButton.qml" "qml/RoundButton.qml" "qml/RadioButton.qml" "qml/ToolTip.qml" "qml/DialogButtonBox.qml" "qml/Frame.qml" "qml/GroupBox.qml" "qml/PageIndicator.qml" "qml/StackView.qml" "qml/BusyIndicator.qml" "qml/ProgressBar.qml" "qml/BoxPanel.qml" "qml/Pane.qml" "qml/KeySequenceEdit.qml" "qml/ButtonIndicator.qml" "qml/EmbeddedProgressBar.qml" "qml/WaterProgressBar.qml" "qml/PlaceholderText.qml" "qml/ControlGroup.qml" "qml/ControlGroupItem.qml" "qml/DragItemsImage.qml" ) foreach(QML_FILE ${QML_DTK_CONTROLS}) get_filename_component(file_name ${QML_FILE} NAME) set_source_files_properties(${QML_FILE} PROPERTIES QT_RESOURCE_ALIAS ${file_name} ) endforeach() dtkdeclarative-5.7.12/qt6/src/qml/000077500000000000000000000000001476226662700167105ustar00rootroot00000000000000dtkdeclarative-5.7.12/qt6/src/qml/AboutAction.qml000066400000000000000000000010031476226662700216250ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick Action { id: control text: qsTr("About") property Component aboutDialog property QtObject __object onTriggered: { if (aboutDialog) { if (!__object) { __object = aboutDialog.createObject(parent) } __object.show() } } Component.onDestruction: __object && __object.destroy() } dtkdeclarative-5.7.12/qt6/src/qml/AboutDialog.qml000066400000000000000000000113221476226662700216140ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import QtQuick.Window import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS DialogWindow { id: control width: DS.Style.aboutDialog.width height: DS.Style.aboutDialog.height property alias windowTitle: control.title property alias productName: productNameLabel.text property alias productIcon: logoLabel.icon.name property alias version: versionLabel.text property alias description: descriptionLabel.text property alias license: licenseLabel.text property alias companyLogo: companyLogoLabel.source property string websiteName property string websiteLink readonly property string __websiteLinkTemplate: "%2" RowLayout { id: contentView width: parent.width implicitHeight: contentLayout.implicitHeight ColumnLayout { id: contentLayout spacing: 0 Layout.preferredWidth: Math.max(control.width / 5 * 2, DS.Style.aboutDialog.leftAreaWidth) Layout.bottomMargin: DS.Style.aboutDialog.bottomPadding D.IconLabel { id: logoLabel Layout.preferredHeight: DS.Style.aboutDialog.productIconHeight Layout.preferredWidth: Layout.preferredHeight Layout.alignment: Qt.AlignHCenter Layout.topMargin: 0 display: D.IconLabel.IconOnly icon.mode: control.D.ColorSelector.controlState icon.theme: control.D.ColorSelector.controlTheme icon.palette: D.DTK.makeIconPalette(control.palette) } Label { id: productNameLabel font: D.DTK.fontManager.t5 Layout.alignment: Qt.AlignCenter Layout.topMargin: 8 } Image { id: companyLogoLabel retainWhileLoading: true Layout.alignment: Qt.AlignCenter Layout.topMargin: 30 } Label { id: licenseLabel font: D.DTK.fontManager.t10 Layout.preferredWidth: parent.width Layout.alignment: Qt.AlignCenter Layout.topMargin: 3 Layout.leftMargin: 30 wrapMode: Text.WordWrap elide: Text.ElideRight visible: license !== "" } } ColumnLayout { Layout.alignment: Qt.AlignLeft | Qt.AlignTop spacing: 10 Layout.fillWidth: true Layout.fillHeight: true Layout.rightMargin: 20 ColumnLayout { spacing: 1 Label { font: D.DTK.fontManager.t10 text: qsTr("Version") } Label { id: versionLabel font: D.DTK.fontManager.t8 wrapMode: Text.WordWrap text: Qt.application.version Layout.fillWidth: true } } ColumnLayout { spacing: 1 Label { font: D.DTK.fontManager.t10 text: qsTr("Homepage") } Label { id: websiteLabel font: D.DTK.fontManager.t8 text: (control.websiteLink === "" || control.websiteName === "") ? "" : control.__websiteLinkTemplate.arg(websiteLink).arg(control.websiteName) wrapMode: Text.WordWrap Layout.fillWidth: true } } ColumnLayout { spacing: 1 Label { font: D.DTK.fontManager.t10 text: qsTr("Description") } Label { id: descriptionLabel Layout.fillWidth: true font: D.DTK.fontManager.t8 wrapMode: Text.WordWrap elide: Text.ElideRight } } } Component.onCompleted: { websiteLabel.linkActivated.connect(D.ApplicationHelper.openUrl) descriptionLabel.linkActivated.connect(D.ApplicationHelper.openUrl) licenseLabel.linkActivated.connect(D.ApplicationHelper.openUrl) } focus: true Keys.onEscapePressed: { control.close() event.accepted = true } } } dtkdeclarative-5.7.12/qt6/src/qml/AbstractButton.qml000066400000000000000000000002471476226662700223650ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls AbstractButton { } dtkdeclarative-5.7.12/qt6/src/qml/Action.qml000066400000000000000000000002371476226662700206420ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls Action { } dtkdeclarative-5.7.12/qt6/src/qml/ActionButton.qml000066400000000000000000000017541476226662700220430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.Button { id: control property D.Palette textColor: DS.Style.button.text palette.windowText: pressed ? D.ColorSelector.textColor : undefined opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) icon { width: DS.Style.button.iconSize height: DS.Style.button.iconSize } contentItem: D.DciIcon { palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: control.icon.name sourceSize: Qt.size(control.icon.width, control.icon.height) } background: null } dtkdeclarative-5.7.12/qt6/src/qml/ActionGroup.qml000066400000000000000000000002441476226662700216550ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls ActionGroup { } dtkdeclarative-5.7.12/qt6/src/qml/AlertToolTip.qml000066400000000000000000000054471476226662700220170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS ToolTip { id: control property Item target x: 0 topPadding: DS.Style.alertToolTip.verticalPadding bottomPadding: DS.Style.alertToolTip.verticalPadding leftPadding: DS.Style.alertToolTip.horizontalPadding rightPadding: DS.Style.alertToolTip.horizontalPadding implicitWidth: Math.min(DS.Style.control.implicitWidth(control), target.width) implicitHeight: DS.Style.control.implicitHeight(control) margins: 0 closePolicy: Popup.NoAutoClose background: Item { BoxShadow { anchors.fill: _background shadowBlur: 20 shadowOffsetY: 6 shadowColor: Qt.rgba(0, 0, 0, 0.2) cornerRadius: _background.radius } Rectangle { property D.Palette backgroundColor: DS.Style.alertToolTip.background property D.Palette borderColor: DS.Style.control.border id: _background anchors.fill: parent color: D.ColorSelector.backgroundColor border.color: D.ColorSelector.borderColor radius: DS.Style.control.radius } } contentItem: Text { property D.Palette textColor: DS.Style.alertToolTip.text horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter text: control.text font: control.font color: D.ColorSelector.textColor wrapMode: Text.Wrap } enter: Transition { NumberAnimation { properties: "opacity"; from: 0.0; to: 1.0; duration: 200 } NumberAnimation { properties: "y"; from: control.target.height; to: control.target.height + DS.Style.control.spacing; duration: 200 } } exit: Transition { NumberAnimation { properties: "opacity"; from: 1.0; to: 0.0 } NumberAnimation { properties: "y"; from: control.target.height + DS.Style.control.spacing ; to: control.target.height } } BoxShadow { property D.Palette dropShadowColor: DS.Style.alertToolTip.connecterdropShadow property D.Palette backgroundColor: DS.Style.alertToolTip.connecterBackground y: - height * (0.75) - control.topMargin - control.topPadding width: DS.Style.alertToolTip.connectorWidth height: DS.Style.alertToolTip.connectorHeight shadowBlur: 4 shadowOffsetY: 2 shadowColor: D.ColorSelector.dropShadowColor cornerRadius: _background.radius Rectangle { anchors.fill: parent color: parent.D.ColorSelector.backgroundColor border.color: _background.D.ColorSelector.borderColor border.width: 1 } } } dtkdeclarative-5.7.12/qt6/src/qml/ApplicationWindow.qml000066400000000000000000000005241476226662700230570ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D T.ApplicationWindow { palette: active ? D.DTK.palette : D.DTK.inactivePalette font: D.DTK.fontManager.t6 color: palette.window } dtkdeclarative-5.7.12/qt6/src/qml/ArrowListView.qml000066400000000000000000000052241476226662700222070ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Window import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.private 1.0 as P FocusScope { id: control property int maxVisibleItems : DS.Style.arrowListView.maxVisibleItems property int itemHeight: DS.Style.arrowListView.itemHeight property alias view: itemsView implicitWidth: Math.max(DS.Style.arrowListView.width, contentLayout.implicitWidth) implicitHeight: contentLayout.implicitHeight ColumnLayout { id: contentLayout anchors.fill: parent P.ArrowListViewButton { visible: itemsView.interactive Layout.alignment: Qt.AlignHCenter Layout.preferredWidth: width Layout.preferredHeight: height view: itemsView direction: P.ArrowListViewButton.UpButton } ListView { id: itemsView clip: true Layout.fillWidth: true Layout.fillHeight: true implicitHeight: Math.min(contentHeight, maxVisibleItems * itemHeight) implicitWidth:{ var maxWidth = DS.Style.arrowListView.width for (var i = 0; i < itemsView.count; ++i) { var item = itemsView.itemAtIndex(i) if (item && item.implicitWidth > maxWidth) maxWidth = item.implicitWidth } return maxWidth } interactive: Window.window ? (contentHeight > Window.window.height || model.count > maxVisibleItems) : false ScrollIndicator.vertical: ScrollIndicator { } highlight: HighlightPanel { visible: false // TODO listview's highlight is confict with Item's highlight. outerShadowColor: null innerShadowColor: null scale: D.DTK.hasAnimation ? 0.9 : 1.0 Component.onCompleted: { scale = 1.0 } Behavior on scale { NumberAnimation { duration: 100 } } } highlightFollowsCurrentItem: true highlightMoveDuration: -1 highlightMoveVelocity: 400 } P.ArrowListViewButton { visible: itemsView.interactive Layout.alignment: Qt.AlignHCenter Layout.preferredWidth: width Layout.preferredHeight: height view: itemsView direction: P.ArrowListViewButton.DownButton } } } dtkdeclarative-5.7.12/qt6/src/qml/ArrowShapePopup.qml000066400000000000000000000113641476226662700225270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Shapes import Qt5Compat.GraphicalEffects import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Popup { id: control property alias roundedRadius: path.roundedRadius property alias arrowWidth: path.arrowWidth property alias arrowHeight: path.arrowHeight property alias arrowDirection: path.arrowDirection property real arrowX: 0 property real arrowY: 0 implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) leftPadding: arrowDirection === D.DTK.LeftArrow ? arrowHeight : 0 topPadding: arrowDirection === D.DTK.UpArrow ? arrowHeight : 0 rightPadding: arrowDirection === D.DTK.RightArrow ? arrowHeight : 0 bottomPadding: arrowDirection === D.DTK.DownArrow ? arrowHeight : 0 D.ArrowBoxPath { id: path width: control.width height: control.height roundedRadius: DS.Style.arrowRectangleBlur.roundJoinRadius } background: Item { implicitWidth: maskPath.implicitWidth implicitHeight: maskPath.implicitHeight D.ArrowBoxPath { id: outsideBorderPath arrowX: path.arrowX arrowY: path.arrowY arrowWidth: path.arrowWidth arrowHeight: path.arrowHeight arrowDirection: path.arrowDirection width: path.width height: path.height roundedRadius: path.roundedRadius spread: DS.Style.arrowRectangleBlur.borderWidth / 2 } D.ArrowBoxPath { id: insideBorderPath arrowX: path.arrowX arrowY: path.arrowY arrowWidth: path.arrowWidth arrowHeight: path.arrowHeight arrowDirection: path.arrowDirection width: path.width height: path.height roundedRadius: path.roundedRadius spread: -DS.Style.arrowRectangleBlur.borderWidth / 2 } D.InWindowBlur { id: blur anchors.fill: parent offscreen: true } DropShadow { id: __shadow anchors.fill: parent verticalOffset: 6 radius: 12 source: mask color: DS.Style.selectColor(palette.window, DS.Style.arrowRectangleBlur.shadowColor, DS.Style.arrowRectangleBlur.darkShadowColor) } Shape { id: maskPath anchors.fill: parent visible: false layer { enabled: true samples: 8 } ShapePath { fillColor: "red" strokeColor: "transparent" pathElements: path } } D.OpacityMask { id: mask anchors.fill: parent maskSource: maskPath source: blur } Item { layer { enabled: true samples: 8 } anchors { fill: parent margins: -DS.Style.arrowRectangleBlur.borderWidth } Shape { anchors.centerIn: parent width: maskPath.width height: maskPath.height ShapePath { fillColor: { if (blur.valid) return DS.Style.selectColor(palette.window, DS.Style.arrowRectangleBlur.backgroundColor, DS.Style.arrowRectangleBlur.darkBackgroundColor) return DS.Style.selectColor(palette.window, DS.Style.arrowRectangleBlur.backgroundNoBlurColor, DS.Style.arrowRectangleBlur.darkBackgroundNoBlurColor) } strokeColor: DS.Style.selectColor(palette.window, DS.Style.arrowRectangleBlur.outBorderColor, DS.Style.arrowRectangleBlur.darkOutBorderColor) strokeWidth: DS.Style.arrowRectangleBlur.borderWidth pathElements: outsideBorderPath } ShapePath { fillColor: "transparent" strokeColor: DS.Style.selectColor(palette.window, DS.Style.arrowRectangleBlur.inBorderColor, DS.Style.arrowRectangleBlur.darkInBorderColor) strokeWidth: DS.Style.arrowRectangleBlur.borderWidth pathElements: insideBorderPath } } } } } dtkdeclarative-5.7.12/qt6/src/qml/ArrowShapePopupWindow.qml000066400000000000000000000015531476226662700237160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Window import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Window { id: __window property alias roundJoinRadius: arrowShape.roundJoinRadius property alias arrowWidth: arrowShape.arrowWidth property alias arrowHeight: arrowShape.arrowHeight property alias arrowX: arrowShape.arrowX property alias arrowY: arrowShape.arrowY property alias arrowDirection: arrowShape.arrowDirection flags: Qt.Popup D.DWindow.enabled: true D.DWindow.clipPath: loader.item D.DWindow.enableBlurWindow: true D.DWindow.alphaBufferSize: D.DTK.hasBlurWindow ? 8 : 0 ArrowShapeContainer { id: arrowShape anchors.fill: parent color: "transparent" } } dtkdeclarative-5.7.12/qt6/src/qml/BoxInsetShadow.qml000066400000000000000000000036651476226662700223360ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D Item { id: root property real cornerRadius: 0 property variant topLeftRadius property variant topRightRadius property variant bottomLeftRadius property variant bottomRightRadius property real shadowBlur: 10 property real shadowOffsetX: 0 property real shadowOffsetY: 0 property color shadowColor: "black" property real spread: 0 readonly property real __borderBase: cornerRadius + spread + shadowBlur / 2.0 readonly property real __minImageSize: Math.max(image.border.left + image.border.right, image.border.top + image.border.bottom) readonly property real __boxSize: Math.max(__minImageSize - shadowBlur, cornerRadius * 2 + 1) BorderImage { id: image anchors.fill: parent retainWhileLoading: true source: D.DTK.makeShadowImageUrl(__boxSize, shadowRadius(topLeftRadius), shadowRadius(topRightRadius), shadowRadius(bottomLeftRadius), shadowRadius(bottomRightRadius), shadowBlur, shadowColor, shadowOffsetX, shadowOffsetY, spread, false, true) function shadowRadius(radius) { return radius !== undefined ? radius : cornerRadius } function bound(min, val, max) { if (val <= min) return min; if (val >= max) return max; return val; } border { left: __borderBase + bound(0, shadowBlur + shadowOffsetX, width - 2 * __borderBase) right: __borderBase + bound(0, shadowBlur - shadowOffsetX, width - 2 * __borderBase) top: __borderBase + bound(0, shadowBlur + shadowOffsetY, height - 2 * __borderBase) bottom: __borderBase + bound(0, shadowBlur - shadowOffsetY, height - 2 * __borderBase) } } } dtkdeclarative-5.7.12/qt6/src/qml/BoxPanel.qml000066400000000000000000000077441476226662700211470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Item { id: control property int radius: DS.Style.control.radius property D.Palette color1: DS.Style.button.background1 property D.Palette color2: DS.Style.button.background2 property D.Palette insideBorderColor: DS.Style.button.insideBorder property D.Palette outsideBorderColor: DS.Style.button.outsideBorder property D.Palette dropShadowColor: DS.Style.button.dropShadow property D.Palette innerShadowColor1: DS.Style.button.innerShadow1 property D.Palette innerShadowColor2: DS.Style.button.innerShadow2 property int boxShadowBlur: 6 property int boxShadowOffsetY: 4 property int innerShadowOffsetY1: -1 // Background color changes with hover state if `backgroundFlowingHovered` is `true`. property bool backgroundFlowsHovered: true property bool enableBoxShadow: control.D.ColorSelector.family === D.Palette.CommonColor // TODO drop shadow temporarily. // Loader { // anchors.fill: backgroundRect // active: enableBoxShadow // sourceComponent: BoxShadow { // shadowBlur: control.boxShadowBlur // shadowOffsetY: control.boxShadowOffsetY // shadowColor: control.D.ColorSelector.dropShadowColor // cornerRadius: backgroundRect.radius // } // } Rectangle { id: backgroundRect property alias color1: control.color1 property alias color2: control.color2 D.ColorSelector.hovered: backgroundFlowsHovered ? undefined : false objectName: "background" Gradient { id: backgroundGradient // Use the backgroundRect's colorselecor can filter the hovered state. GradientStop { position: 0.0; color: backgroundRect.D.ColorSelector.color1} GradientStop { position: 1.0; color: backgroundRect.D.ColorSelector.color2} } anchors.fill: parent radius: control.radius // gradient: D.ColorSelector.color1 === D.ColorSelector.color2 ? null : backgroundGradient color: D.ColorSelector.color1 } // Loader { // anchors.fill: backgroundRect // readonly property color innerShadowColor: control.D.ColorSelector.innerShadowColor1 // active: innerShadowColor1 && innerShadowColor.a !== 0 && control.D.ColorSelector.family === D.Palette.CommonColor // z: D.DTK.AboveOrder // sourceComponent: BoxInsetShadow { // shadowBlur: 2 // shadowOffsetY: control.innerShadowOffsetY1 // spread: 1 // shadowColor: innerShadowColor // cornerRadius: backgroundRect.radius // } // } // Loader { // anchors.fill: backgroundRect // readonly property color innerShadowColor: control.D.ColorSelector.innerShadowColor2 // active: innerShadowColor2 && innerShadowColor.a !== 0 && control.D.ColorSelector.family === D.Palette.CommonColor // z: D.DTK.AboveOrder // sourceComponent: BoxInsetShadow { // shadowBlur: 1 // shadowOffsetY: 1 // shadowColor: innerShadowColor // cornerRadius: backgroundRect.radius // } // } Loader { active: insideBorderColor anchors.fill: backgroundRect z: D.DTK.AboveOrder sourceComponent: InsideBoxBorder { radius: backgroundRect.radius color: control.D.ColorSelector.insideBorderColor borderWidth: DS.Style.control.borderWidth } } Loader { active: outsideBorderColor anchors.fill: backgroundRect z: D.DTK.AboveOrder sourceComponent: OutsideBoxBorder { radius: backgroundRect.radius color: control.D.ColorSelector.outsideBorderColor borderWidth: DS.Style.control.borderWidth } } } dtkdeclarative-5.7.12/qt6/src/qml/BoxShadow.qml000066400000000000000000000042561476226662700213300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D Item { id: root property real cornerRadius: 0 property variant topLeftRadius property variant topRightRadius property variant bottomLeftRadius property variant bottomRightRadius property real shadowBlur: 10 property real shadowOffsetX: 0 property real shadowOffsetY: 0 property color shadowColor: "black" property real spread: 0 property bool hollow: false readonly property real __offsetX: hollow ? shadowOffsetX : 0 readonly property real __offsetY: hollow ? shadowOffsetY : 0 readonly property real __spread: hollow ? spread : 0 readonly property real __borderBase: cornerRadius + spread + shadowBlur * 2 readonly property real __minImageSize: 2 * __borderBase readonly property real __boxSize: __minImageSize - 2 * shadowBlur - 2 * __spread + 1 D.DBorderImage { id: image anchors { centerIn: parent horizontalCenterOffset: shadowOffsetX verticalCenterOffset: shadowOffsetY } width: parent.width + (shadowBlur + spread) * 2 height: parent.height + (shadowBlur + spread) * 2 retainWhileLoading: true source: D.DTK.makeShadowImageUrl(__boxSize, shadowRadius(topLeftRadius), shadowRadius(topRightRadius), shadowRadius(bottomLeftRadius), shadowRadius(bottomRightRadius), shadowBlur, shadowColor, __offsetX, __offsetY, __spread, hollow, false) function shadowRadius(radius) { return radius !== undefined ? radius : cornerRadius } function bound(min, val, max) { if (val <= min) return min; if (val >= max) return max; return val; } border { left: Math.min(width / 2, __borderBase - __offsetX) right: Math.min(width / 2, __borderBase + __offsetX) top: Math.min(height / 2, __borderBase - __offsetY) bottom: Math.min(height / 2, __borderBase + __offsetY) } } } dtkdeclarative-5.7.12/qt6/src/qml/BusyIndicator.qml000066400000000000000000000025041476226662700222030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.BusyIndicator { id: control property D.Palette fillColor: DS.Style.busyIndicator.fillColor implicitWidth: DS.Style.busyIndicator.size implicitHeight: implicitWidth padding: width / DS.Style.busyIndicator.paddingFactor contentItem: Item { implicitWidth: DS.Style.busyIndicator.size implicitHeight: implicitWidth Image { id: indicatorSource anchors.fill: parent retainWhileLoading: true source: DS.Style.busyIndicator.spinnerSource sourceSize { width: parent.width height: parent.height } visible: false } D.ColorOverlay { anchors.fill: indicatorSource source: indicatorSource color: control.D.ColorSelector.fillColor RotationAnimator on rotation { from: 0 to: 360 duration: DS.Style.busyIndicator.animationDuration running: control.running loops: Animation.Infinite } } } } dtkdeclarative-5.7.12/qt6/src/qml/Button.qml000066400000000000000000000046101476226662700206770ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.private 1.0 as P T.Button { id: control property D.Palette textColor: checked ? DS.Style.checkedButton.text : (highlighted ? DS.Style.highlightedButton.text : DS.Style.button.text) implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) topPadding: DS.Style.button.vPadding bottomPadding: DS.Style.button.vPadding leftPadding: DS.Style.button.hPadding rightPadding: DS.Style.button.hPadding spacing: DS.Style.control.spacing opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 D.DciIcon.mode: D.ColorSelector.controlState D.DciIcon.theme: D.ColorSelector.controlTheme D.DciIcon.palette: D.DTK.makeIconPalette(palette) palette.windowText: D.ColorSelector.textColor icon { width: DS.Style.button.iconSize height: DS.Style.button.iconSize color: D.ColorSelector.textColor } background: P.ButtonPanel { implicitWidth: DS.Style.button.width implicitHeight: DS.Style.button.height button: control } contentItem: Item { implicitWidth: content.implicitWidth + (indicator ? indicator.width : 0) implicitHeight: content.implicitHeight D.IconLabel { id: content height: parent.height width: parent.width - (indicator ? indicator.width : 0) spacing: control.spacing mirrored: control.mirrored display: control.display alignment: indicator ? Qt.AlignLeft | Qt.AlignVCenter : Qt.AlignCenter text: control.text font: control.font color: control.D.ColorSelector.textColor icon: D.DTK.makeIcon(control.icon, control.D.DciIcon) } function updateIndicatorAnchors() { if (!indicator) return indicator.anchors.verticalCenter = control.verticalCenter indicator.anchors.right = control.right } Component.onCompleted: { updateIndicatorAnchors() control.indicatorChanged.connect(updateIndicatorAnchors) } } } dtkdeclarative-5.7.12/qt6/src/qml/ButtonBox.qml000066400000000000000000000046751476226662700213630ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.private 1.0 as P Control { id: control default property alias buttons: btnGroup.buttons property alias group: btnGroup D.ColorSelector.hovered: false padding: DS.Style.buttonBox.padding ButtonGroup { id: btnGroup } contentItem: RowLayout { spacing: DS.Style.buttonBox.spacing children: control.buttons } Loader { active: D.DTK.hasAnimation sourceComponent: P.ButtonPanel { id: backgroundPanel visible: btnGroup.checkedButton implicitWidth: visible ? btnGroup.checkedButton.width : 0 implicitHeight: visible ? btnGroup.checkedButton.height : 0 button: control outsideBorderColor: null color1: D.Palette { normal { common: Qt.rgba(0, 0, 0, 0.2) } } color2: color1 ParallelAnimation { running: btnGroup.checkedButton && (btnGroup.checkedButton.x !== backgroundPanel.x || btnGroup.checkedButton.y !== backgroundPanel.y) NumberAnimation { target: backgroundPanel property: "x" to: btnGroup.checkedButton ? btnGroup.checkedButton.x : backgroundPanel.x duration: 200 } NumberAnimation { target: backgroundPanel property: "y" to: btnGroup.checkedButton ? btnGroup.checkedButton.y : backgroundPanel.y duration: 200 } NumberAnimation { target: backgroundPanel property: "width" to: btnGroup.checkedButton ? btnGroup.checkedButton.width : backgroundPanel.width duration: 200 } NumberAnimation { target: backgroundPanel property: "height" to: btnGroup.checkedButton ? btnGroup.checkedButton.height : backgroundPanel.height duration: 200 } } } } } dtkdeclarative-5.7.12/qt6/src/qml/ButtonGroup.qml000066400000000000000000000002441476226662700217130ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls ButtonGroup { } dtkdeclarative-5.7.12/qt6/src/qml/ButtonIndicator.qml000066400000000000000000000015501476226662700225340ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Rectangle { property D.Palette backgroundColor: DS.Style.buttonIndicator.background property Item control: D.ColorSelector.control implicitWidth: DS.Style.buttonIndicator.size implicitHeight: implicitHeight radius: width / 2 color: D.ColorSelector.backgroundColor D.DciIcon { anchors.centerIn: parent sourceSize { width: DS.Style.buttonIndicator.iconSize } name: "arrow_ordinary_down" palette: control.D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } } dtkdeclarative-5.7.12/qt6/src/qml/CheckBox.qml000066400000000000000000000053401476226662700211130ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.CheckBox { id: control implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset icon { width: DS.Style.checkBox.iconSize height: DS.Style.checkBox.iconSize } checkable: true font: D.DTK.fontManager.t8 padding: DS.Style.checkBox.padding spacing: DS.Style.control.spacing opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 D.DciIcon.mode: D.ColorSelector.controlState D.DciIcon.theme: D.ColorSelector.controlTheme indicator: Item { x: control.text ? (!control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2 y: control.topPadding + (control.availableHeight - height) / 2 implicitWidth: DS.Style.checkBox.indicatorWidth implicitHeight: DS.Style.checkBox.indicatorHeight D.DciIcon { anchors.centerIn: parent palette: control.D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: control.checkState === Qt.Checked ? "checkbox_checked" : control.checkState === Qt.Unchecked ? "checkbox_unchecked" : "checkbox_mix" sourceSize: Qt.size(control.icon.width, control.icon.height) fallbackToQIcon: false } Loader { active: control.activeFocus anchors.centerIn: parent sourceComponent: D.DciIcon { palette: control.D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: control.checkState === Qt.Checked ? "checkbox_focus_checked" : "checkbox_focus" sourceSize: Qt.size(control.icon.width, control.icon.height) fallbackToQIcon: false } } } contentItem: Text { leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0 rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0 text: control.text font: control.font elide: Text.ElideRight verticalAlignment: Text.AlignVCenter color: control.palette.windowText } background: null } dtkdeclarative-5.7.12/qt6/src/qml/CheckDelegate.qml000066400000000000000000000064001476226662700220730ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.CheckDelegate { id: control property Component content property D.Palette backgroundColor: DS.Style.itemDelegate.checkBackgroundColor property string indicatorIcon: control.checkState === Qt.Unchecked ? "item_unchecked" : "item_checked" property bool indicatorVisible: control.checked implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset padding: DS.Style.control.padding spacing: DS.Style.control.spacing icon { width: DS.Style.itemDelegate.iconSize height: DS.Style.itemDelegate.iconSize } checkable: true indicator: Loader { x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding y: control.topPadding + (control.availableHeight - height) / 2 active: indicatorVisible sourceComponent: D.DciIcon { palette: control.D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: indicatorIcon sourceSize: Qt.size(DS.Style.itemDelegate.checkIndicatorIconSize, DS.Style.itemDelegate.checkIndicatorIconSize) fallbackToQIcon: false onNameChanged: { play(D.DTK.NormalState); } Component.onCompleted: { if (indicatorVisible) play(D.DTK.NormalState); } } } contentItem: RowLayout { D.IconLabel { spacing: control.spacing mirrored: control.mirrored display: control.display alignment: control.display === D.IconLabel.IconOnly || control.display === D.IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft | Qt.AlignVCenter text: control.text font: control.font color: control.palette.windowText icon: D.DTK.makeIcon(control.icon, control.D.DciIcon) Layout.fillWidth: !control.content } Loader { active: control.content sourceComponent: control.content Layout.fillWidth: true } } background: Control { implicitWidth: DS.Style.itemDelegate.width implicitHeight: DS.Style.itemDelegate.height Rectangle { anchors.fill: parent visible: !control.checked && !D.DTK.hasAnimation && control.hovered color: control.D.ColorSelector.backgroundColor radius: DS.Style.control.radius } Rectangle { anchors.fill: parent visible: control.checked color: DS.Style.itemDelegate.checkedColor radius: DS.Style.control.radius } } onHoveredChanged: { if (checked || !ListView.view) return if (ListView.view) ListView.view.setHoverItem(control.hovered ? control : null) } } dtkdeclarative-5.7.12/qt6/src/qml/CicleSpreadAnimation.qml000066400000000000000000000042721476226662700234460ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D Item { id: root // to select center point property point centerPoint: Qt.point(0, 0) layer { enabled: false effect: D.OpacityMask { maskSource: mask } } // to start animation function start() { if (D.DTK.isSoftwareRender) return mask.active = true layer.enabled = true mask.item.__increase() } // to stop animation function stop() { layer.enabled = false mask.active = false mask.__scalePos = 0 } Loader { id: mask anchors.fill: parent visible: false property real __scalePos: 0 Behavior on __scalePos { SmoothedAnimation { velocity: 300 } } sourceComponent: Rectangle { id: impl height: width radius: width / 2 scale: __scalePos / 50 function __increase() { var curRadius = __minBoundingCicleRadius() impl.width = curRadius * 2 impl.x = centerPoint.x - curRadius impl.y = centerPoint.y - curRadius mask.__scalePos = 50 } function __minBoundingCicleRadius() { // 区域内任意一点到四个定点距离的最大值,即为以此点为中心包含此区域的最小圆的半径 var r1 = Math.sqrt(Math.pow(centerPoint.x, 2) + Math.pow(centerPoint.y, 2)) var r2 = Math.sqrt(Math.pow(centerPoint.x, 2) + Math.pow( root.height - centerPoint.y, 2)) var r3 = Math.sqrt(Math.pow(centerPoint.y, 2) + Math.pow( root.width - centerPoint.x, 2)) var r4 = Math.sqrt(Math.pow(root.width - centerPoint.x, 2) + Math.pow( root.height - centerPoint.y, 2)) return Math.max(r1, r2, r3, r4) } } } } dtkdeclarative-5.7.12/qt6/src/qml/ComboBox.qml000066400000000000000000000150411476226662700211340ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.private 1.0 as P T.ComboBox { id: control property string iconNameRole property string alertText property int alertDuration property bool showAlert property int maxVisibleItems : DS.Style.comboBox.maxVisibleItems property D.Palette separatorColor: DS.Style.comboBox.edit.separator property var horizontalAlignment: control.flat ? Text.AlignRight : Text.AlignLeft opacity: enabled ? 1.0 : 0.4 implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset padding: DS.Style.comboBox.padding leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing) rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing) delegate: MenuItem { implicitWidth: ListView.view.width useIndicatorPadding: true text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : (model[control.textRole] === undefined ? modelData[control.textRole] : model[control.textRole])) : modelData icon.name: (control.iconNameRole && model[control.iconNameRole] !== undefined) ? model[control.iconNameRole] : null highlighted: control.highlightedIndex === index hoverEnabled: control.hoverEnabled autoExclusive: true checked: control.currentIndex === index } indicator: Loader { sourceComponent: control.editable ? editableIndicator : normalIndicator x: control.mirrored ? control.padding : control.width - width - control.padding y: control.topPadding + (control.availableHeight - height) / 2 Component { id: editableIndicator RowLayout { spacing: DS.Style.comboBox.edit.indicatorSpacing Rectangle { width: 1 height: control.height color: control.D.ColorSelector.separatorColor } D.DciIcon { sourceSize { width: DS.Style.comboBox.edit.indicatorSize height: DS.Style.comboBox.edit.indicatorSize } palette: D.DTK.makeIconPalette(control.palette) name: "entry_option_arrow_down" mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } } } Component { id: normalIndicator D.DciIcon { sourceSize { width: DS.Style.comboBox.iconSize height: DS.Style.comboBox.iconSize } palette: D.DTK.makeIconPalette(control.palette) name: "arrow_ordinary_down" mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } } } contentItem: RowLayout { spacing: DS.Style.comboBox.spacing Loader { property string iconName: (control.iconNameRole && model.get(control.currentIndex)[control.iconNameRole] !== undefined) ? model.get(control.currentIndex)[control.iconNameRole] : null active: iconName sourceComponent: D.DciIcon { palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: iconName sourceSize: Qt.size(DS.Style.comboBox.iconSize, DS.Style.comboBox.iconSize) fallbackToQIcon: true } } T.TextField { Layout.fillWidth: true Layout.fillHeight: true Layout.rightMargin: DS.Style.comboBox.spacing text: control.editable ? control.editText : control.displayText enabled: control.editable autoScroll: control.editable readOnly: control.down inputMethodHints: control.inputMethodHints validator: control.validator selectByMouse: true color: control.editable ? control.palette.text : control.palette.buttonText selectionColor: control.palette.highlight selectedTextColor: control.palette.highlightedText verticalAlignment: Text.AlignVCenter horizontalAlignment: control.horizontalAlignment } } background: Item { implicitWidth: DS.Style.comboBox.width implicitHeight: DS.Style.comboBox.height Loader { anchors.fill: parent active: !control.flat sourceComponent: control.editable ? editableComponent : floatingComponent property alias comboBox: control Component { id: editableComponent EditPanel { control: comboBox alertText: comboBox.alertText alertDuration: comboBox.alertDuration showAlert: comboBox.showAlert } } Component { id: floatingComponent P.ButtonPanel { button: comboBox } } } Loader { anchors.fill: parent active: control.flat && control.visualFocus sourceComponent: FocusBoxBorder {} } } popup: Popup { palette: control.palette implicitWidth: control.width contentItem: ArrowListView { clip: true maxVisibleItems: control.maxVisibleItems view.model: control.delegateModel view.currentIndex: control.highlightedIndex view.highlightRangeMode: ListView.ApplyRange view.highlightMoveDuration: 0 } background: FloatingPanel { implicitWidth: DS.Style.menu.item.width implicitHeight: DS.Style.menu.item.height radius: DS.Style.menu.radius backgroundColor: DS.Style.menu.background } } } dtkdeclarative-5.7.12/qt6/src/qml/Container.qml000066400000000000000000000002421476226662700213430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls Container { } dtkdeclarative-5.7.12/qt6/src/qml/Control.qml000066400000000000000000000005541476226662700210470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk.style 1.0 as DS T.Control { id: control implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) } dtkdeclarative-5.7.12/qt6/src/qml/ControlBackground.qml000066400000000000000000000014071476226662700230450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick Rectangle { id: control // 暴露给外部的属性 property int focusBorderSpace: 1 property alias focusBorder: contentBorder.border property alias focusBorderVisible: contentBorder.visible radius: 8 color: "black" Rectangle { id: contentBorder anchors.centerIn: parent width: parent.width + 2 * (control.focusBorderSpace + border.width) height: parent.height + 2 * (control.focusBorderSpace + border.width) radius: parent.radius + control.focusBorderSpace + border.width border { width: 2; color: "black" } color: "transparent" } } dtkdeclarative-5.7.12/qt6/src/qml/ControlGroup.qml000066400000000000000000000121201476226662700220540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS ColumnLayout { id: root spacing: 10 property string title property bool isExpanded: true property int interval: 400 / (itemLayout.children.length) property int index: 0 property int titleHeight: 36 default property alias childItem: itemLayout.children Control { id: title Layout.fillWidth: true Layout.preferredHeight: 36 property int inset: 4 leftInset: inset rightInset: inset topInset: inset bottomInset: inset state: D.DTK.hasAnimation ? "normal" : "hovered" states: [ State { name: "normal" PropertyChanges { target: title inset:4 } }, State { name: "hovered" PropertyChanges { target: title inset:0 } }, State { name: "pressed" PropertyChanges { target: title inset: 4 } } ] transitions: [ Transition { from: "normal" to: "hovered" NumberAnimation { properties: "inset" easing.type: Easing.Linear duration: 500 } }, Transition { from: "hovered" to: "normal" NumberAnimation { properties: "inset" easing.type: Easing.Linear duration: 500 } }, Transition { from: "hovered" to: "pressed" NumberAnimation { properties: "inset" easing.type: Easing.Linear duration: 500 } }, Transition { from: "pressed" to: "hovered" NumberAnimation { properties: "inset" easing.type: Easing.Linear duration: 500 } } ] RowLayout { anchors.fill: parent spacing: 0 Label { Layout.fillWidth: true Layout.fillHeight: true text: root.title font: DTK.fontManager.t5 verticalAlignment: Qt.AlignVCenter } D.DciIcon { rotation: root.isExpanded ? 0 : - 90 name: "arrow_ordinary_down" mode: title.D.ColorSelector.controlState theme: title.D.ColorSelector.controlTheme palette: D.DTK.makeIconPalette(title.palette) sourceSize: Qt.size(36, 36) Behavior on rotation { enabled : D.DTK.hasAnimation NumberAnimation { duration: root.interval easing.type: Easing.Linear } } } } MouseArea { id: mouseArea anchors.fill: parent hoverEnabled: true onClicked: root.isExpanded = !root.isExpanded onPressed: title.state = D.DTK.hasAnimation ? "pressed" : "hovered" onReleased: title.state = "hovered" onEntered: title.state = "hovered" onExited: title.state = D.DTK.hasAnimation ? "normal" : "hovered" } background: Item { Loader { anchors.fill: parent active: title.hovered sourceComponent: D.RoundRectangle { color: DS.Style.itemDelegate.normalColor radius: DS.Style.control.radius corners: D.RoundRectangle.TopLeftCorner | D.RoundRectangle.TopRightCorner | D.RoundRectangle.BottomLeftCorner | D.RoundRectangle.BottomRightCorner } } } } Timer { id: timer } ColumnLayout { id: itemLayout Layout.fillHeight: false } onIsExpandedChanged: (isExpanded) => { for(let i = 0; i < itemLayout.children.length; ++i) { itemLayout.children[i].isExpanded = !itemLayout.children[i].isExpanded } // delay(0, timeout) } function timeout() { itemLayout.children[index].isExpanded = !itemLayout.children[index].isExpanded ++index if (index === itemLayout.children.length) { timer.stop() timer.triggered.disconnect(timeout) index = 0 } } function delay(delayTime, cb) { timer.interval = delayTime timer.repeat = true timer.triggered.connect(cb) timer.restart() } } dtkdeclarative-5.7.12/qt6/src/qml/ControlGroupItem.qml000066400000000000000000000016451476226662700227050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import QtQml.Models 2.11 import org.deepin.dtk 1.0 as D RowLayout { id: root property int initY property bool isExpanded: true y: isExpanded ? initY : - parent.parent.titleHeight opacity: isExpanded ? 1.0 : 0.0 visible: opacity === 0.0 ? false : true Layout.fillWidth: true Layout.fillHeight: true Behavior on y { enabled : D.DTK.hasAnimation NumberAnimation { duration: parent.parent.interval easing.type: Easing.Linear } } Behavior on opacity { enabled : D.DTK.hasAnimation NumberAnimation { duration: parent.parent.interval easing.type: Easing.Linear } } Component.onCompleted: { root.initY = root.y } } dtkdeclarative-5.7.12/qt6/src/qml/DelayButton.qml000066400000000000000000000053671476226662700216700ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Controls.impl import QtQuick.Templates as T import org.deepin.dtk.style 1.0 as DS T.DelayButton { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, Math.max(contentItem.implicitHeight, indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding) padding: DS.Style.control.padding spacing: DS.Style.control.spacing transition: Transition { NumberAnimation { duration: control.delay * (control.pressed ? 1.0 - control.progress : 0.3 * control.progress) } } contentItem: ItemGroup { ClippedText { clip: control.progress > 0 clipX: -control.leftPadding + control.progress * control.width clipWidth: (1.0 - control.progress) * control.width visible: control.progress < 1 text: control.text font: control.font color: control.palette.buttonText horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } ClippedText { clip: control.progress > 0 clipX: -control.leftPadding clipWidth: control.progress * control.width visible: control.progress > 0 text: control.text font: control.font color: control.palette.highlightedText horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } } background: Rectangle { implicitWidth: control.text.length ? DS.Style.control.button.height + (4 * DS.Style.control.radius) : DS.Style.control.button.height + (2 * DS.Style.control.radius) implicitHeight: DS.Style.control.button.height radius: DS.Style.control.radius color: control.palette.button FocusBoxBorder { visible: control.visualFocus color: control.palette.highlight radius: parent.radius anchors.fill: parent } Item { width: control.progress * parent.width height: parent.height clip: true Rectangle { width: parent.parent.width height: parent.parent.height radius: DS.Style.control.radius color: control.palette.highlight } } } } dtkdeclarative-5.7.12/qt6/src/qml/Dial.qml000066400000000000000000000026631476226662700203030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Controls.Basic.impl import QtQuick.Templates as T import org.deepin.dtk.style 1.0 as DS T.Dial { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem ? contentItem.implicitWidth + leftPadding + rightPadding : 0) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentItem ? contentItem.implicitHeight + topPadding + bottomPadding : 0) background: DialImpl { implicitWidth: DS.Style.dial.size implicitHeight: DS.Style.dial.size color: control.palette.highlight progress: control.position } handle: Rectangle { id: handleItem anchors.centerIn: control.background width: 2 * DS.Style.control.radius height: 2 * DS.Style.control.radius color: control.palette.highlight radius: DS.Style.control.radius antialiasing: true transform: [ Translate { y: -Math.min(control.background.width, control.background.height) * 0.4 + handleItem.height / 2 }, Rotation { angle: control.angle origin.x: handleItem.width / 2 origin.y: handleItem.height / 2 } ] } } dtkdeclarative-5.7.12/qt6/src/qml/Dialog.qml000066400000000000000000000002371476226662700206240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls Dialog { } dtkdeclarative-5.7.12/qt6/src/qml/DialogButtonBox.qml000066400000000000000000000017551476226662700224770ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk.style 1.0 as DS T.DialogButtonBox { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentItem.implicitHeight + topPadding + bottomPadding) padding: DS.Style.control.padding spacing: DS.Style.control.spacing alignment: Qt.AlignRight delegate: Button { } contentItem: ListView { implicitWidth: contentWidth implicitHeight: DS.Style.button.height model: control.contentModel spacing: control.spacing orientation: ListView.Horizontal boundsBehavior: Flickable.StopAtBounds snapMode: ListView.SnapToItem } } dtkdeclarative-5.7.12/qt6/src/qml/DialogTitleBar.qml000066400000000000000000000070001476226662700222460ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Window import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Item { id: control z: D.DTK.TopOrder width: Window.window.width height: DS.Style.dialogWindow.titleBarHeight // custom control property alias content: customCenter.sourceComponent // dialog icon property alias icon: iconLabel property string title property alias enableInWindowBlendBlur: background.visible property var __dwindow: Window.window.D.DWindow TapHandler { acceptedButtons: Qt.RightButton onTapped: function (eventPoint, button) { if (button === Qt.RightButton) { if (eventPoint.position.x < control.width - closeBtn.width) { __dwindow.popupSystemWindowMenu() } } } } D.InWindowBlur { id: background visible: false anchors.fill: parent } ColumnLayout { id: content spacing: 0 anchors.fill: parent Rectangle { id: separatorTop Layout.preferredWidth: parent.width Layout.preferredHeight: 1 visible: !__dwindow.enabled color: "transparent" } RowLayout { spacing: 0 Layout.alignment: Qt.AlignHCenter Layout.fillHeight: true Layout.preferredWidth: parent.width Layout.leftMargin: DS.Style.titleBar.leftMargin Control { id: iconControl visible: iconLabel.name !== "" contentItem: D.DciIcon { id: iconLabel mode: iconControl.D.ColorSelector.controlState theme: iconControl.D.ColorSelector.controlTheme palette: D.DTK.makeIconPalette(iconControl.palette) sourceSize { width: DS.Style.dialogWindow.iconSize height: DS.Style.dialogWindow.iconSize } } } // center custom area Loader { id: customCenter Layout.leftMargin: closeBtn.width - iconLabel.width Layout.alignment: Qt.AlignHCenter Layout.fillHeight: true Layout.fillWidth: true sourceComponent: titleCenterCom } WindowButton { id: closeBtn icon.name: "window_close" property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowCloseButtonHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowCloseButtonHint) visible: hasWindowFlag && __dwindow.enabled enabled: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_CLOSE onClicked: Window.window.close() } } Rectangle { id: separatorButtom Layout.preferredWidth: parent.width Layout.preferredHeight: 1 color: "transparent" Layout.alignment: Qt.AlignBottom } } Component { id: titleCenterCom Label { textFormat: Text.PlainText text: control.title horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } } } dtkdeclarative-5.7.12/qt6/src/qml/DialogWindow.qml000066400000000000000000000042731476226662700220200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import QtQuick.Window import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Window { id: control maximumWidth: Screen.desktopAvailableWidth maximumHeight: Screen.desktopAvailableHeight minimumWidth: DS.Style.dialogWindow.width minimumHeight: DS.Style.dialogWindow.height D.DWindow.enabled: true D.DWindow.enableSystemResize: false D.DWindow.motifFunctions: D.WindowManagerHelper.FUNC_ALL & ~D.WindowManagerHelper.FUNC_RESIZE D.DWindow.wmWindowTypes: D.WindowManagerHelper.DialogType D.DWindow.enableBlurWindow: true flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.MSWindowsFixedSizeDialogHint D.ColorSelector.family: D.Palette.CrystalColor color: active ? D.DTK.palette.window : D.DTK.inactivePalette.window height: content.height width: content.width property alias header: titleBar.sourceComponent property string icon default property alias content: contentLoader.children property alias palette : content.palette Item { id: content palette: control.active ? D.DTK.palette : D.DTK.inactivePalette implicitHeight: childrenRect.height ColumnLayout { id: layout spacing: 0 Loader { id: titleBar z: D.DTK.TopOrder sourceComponent: DialogTitleBar { enableInWindowBlendBlur: true icon.name: control.icon } } Item { id: contentLoader Layout.fillWidth: true Layout.preferredHeight: childrenRect.height Layout.leftMargin: DS.Style.dialogWindow.contentHMargin Layout.rightMargin: DS.Style.dialogWindow.contentHMargin } } } onClosing: function(close) { // close can't reset sub control's hovered state. pms Bug:168405 // if we need to close, we can add closing handler to set `close.acceped = true` close.accepted = false hide() } } dtkdeclarative-5.7.12/qt6/src/qml/DragItemsImage.qml000066400000000000000000000040071476226662700222460ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick Item { id: control property list items signal aboutToGrabToImage(Item item) signal grabToImageFinished(Item item) onItemsChanged: function updateGeomotry() { var w = 0 var h = 0 for (var i = 0; i < control.items.length; ++i) { let item = control.items[i] w = Math.max(w, item.width) h = Math.max(h, item.height) } control.width = w + 30 control.height = h * 2 + 30 } function addItem(item) { if (control.items.include(item)) return items.push(item) } function removeItem(item) { if (!control.items.include(item)) return var index = control.items.indexOf(item); if (index !== -1) { control.items.splice(index, 1); } } Repeater { model: control.items.length delegate: Image { id: img anchors.centerIn: parent antialiasing: true rotation: index ? (index % 2 === 0 ? 10 : -10) : 0 opacity: (1 - index * 0.2) z: -index Component.onCompleted: { let item = control.items[index] if (!item) return img.width = item.width img.height = item.height aboutToGrabToImage(item) item.grabToImage(function(result) { img.source = result.url grabToImageFinished(item) }) } } } RoundButton { id: number checked: true anchors.right: dragItem.right anchors.top: dragItem.top anchors.margins: 8 implicitWidth: 24 implicitHeight: 24 text: control.items.length > 1 ? control.items.length : "" opacity: control.items.length > 1 ? 1 : 0 } } dtkdeclarative-5.7.12/qt6/src/qml/Drawer.qml000066400000000000000000000002371476226662700206510ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls Drawer { } dtkdeclarative-5.7.12/qt6/src/qml/EditPanel.qml000066400000000000000000000022451476226662700212730ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Rectangle { id: panel property Item control property D.Palette backgroundColor: DS.Style.edit.background property D.Palette alertBackgroundColor: DS.Style.edit.alertBackground property alias showBorder: _border.active property bool showAlert: false property string alertText: "" property int alertDuration: 0 radius: DS.Style.control.radius color: showAlert ? D.ColorSelector.alertBackgroundColor : D.ColorSelector.backgroundColor Loader { id: _border anchors.fill: parent active: control.activeFocus sourceComponent: FocusBoxBorder { color: control.palette.highlight radius: panel.radius } } Loader { active: showAlert && alertText.length !== 0 sourceComponent: AlertToolTip { target: control timeout: alertDuration visible: showAlert text: alertText } } } dtkdeclarative-5.7.12/qt6/src/qml/EmbeddedProgressBar.qml000066400000000000000000000024651476226662700232750ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Controls import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.ProgressBar { id: control property D.Palette backgroundColor: DS.Style.embeddedProgressBar.background property D.Palette progressBackgroundColor: DS.Style.embeddedProgressBar.progressBackground implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) padding: 1 background: Rectangle { implicitWidth: DS.Style.embeddedProgressBar.width implicitHeight: DS.Style.embeddedProgressBar.height radius: DS.Style.embeddedProgressBar.backgroundRadius color: control.D.ColorSelector.backgroundColor } contentItem: Item { Item { width: control.visualPosition * control.width height: DS.Style.embeddedProgressBar.contentHeight clip: true Rectangle { color: control.D.ColorSelector.progressBackgroundColor radius: DS.Style.embeddedProgressBar.contentRadius width: background.width height: parent.height } } } } dtkdeclarative-5.7.12/qt6/src/qml/FloatingButton.qml000066400000000000000000000012321476226662700223600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.private 1.0 as P Button { id: control implicitWidth: Math.max(DS.Style.control.implicitWidth(control), DS.Style.control.implicitHeight(control)) implicitHeight: implicitWidth checkable: false checked: true background: P.ButtonPanel { implicitWidth: DS.Style.floatingButton.size implicitHeight: DS.Style.floatingButton.size button: control radius: control.width / 2 } } dtkdeclarative-5.7.12/qt6/src/qml/FloatingMessage.qml000066400000000000000000000140571476226662700225020ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS D.FloatingMessageContainer { id: control function closeMessage() { if (D.DTK.hasAnimation) { floatingPanel.state = "small" } else { floatingPanel.animationFinished = true floatingPanel.state = "normal" } } property Component contentItem: Label { verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft text: control.message.content || "" elide: Text.ElideRight maximumLineCount: 1 } property Component button: ActionButton { icon { name: "entry_clear" width: DS.Style.floatingMessage.closeButtonSize height: DS.Style.floatingMessage.closeButtonSize } onClicked: closeMessage() } onDelayClose: closeMessage() duration: 4000 panel: FloatingPanel { id: floatingPanel property bool animationFinished: false implicitWidth: DS.Style.control.contentImplicitWidth(floatingPanel) leftPadding: 10 rightPadding: 10 topPadding: 0 bottomPadding: 0 opacity: 0.0 state: D.DTK.hasAnimation ? "small" : "normal" onAnimationFinishedChanged: (finished) => { if (floatingPanel.animationFinished === true) { D.DTK.closeMessage(control) } } Timer { id: timer interval: 100; running: false; repeat: false onTriggered: floatingPanel.state = "normal" } Component.onCompleted: { timer.running = true } contentItem: RowLayout { height: DS.Style.floatingMessage.minimumHeight width: Math.min(DS.Style.floatingMessage.maximumWidth, children.width + floatingPanel.leftPadding - floatingPanel.rightPadding) spacing: 10 Loader { id: iconLoader Layout.alignment: Qt.AlignVCenter property string iconName: control.message.iconName || "" active: iconName sourceComponent: D.DciIcon { sourceSize { width: 20 height: 20 } name: iconName mode: floatingPanel.D.ColorSelector.controlState theme: floatingPanel.D.ColorSelector.controlTheme palette: D.DTK.makeIconPalette(floatingPanel.palette) } } Loader { id: contentLoader Layout.fillWidth: true Layout.fillHeight: true Layout.alignment: Qt.AlignVCenter Layout.rightMargin: closeButton.active ? 0 : 6 // when no closeButton, contentLoader.rightMargin is 10 + 6, otherwise is 10 Layout.maximumWidth: maxContentWidth Layout.preferredHeight: DS.Style.floatingMessage.minimumHeight property int maxContentWidth: DS.Style.floatingMessage.maximumWidth - iconLoader.implicitWidth - closeButton.implicitWidth sourceComponent: control.contentItem } Loader { id: closeButton Layout.alignment: Qt.AlignRight | Qt.AlignVCenter active: control.duration < 0 visible: active sourceComponent: button } ParallelAnimation { running: D.DTK.hasAnimation ? (closeButton.item ? closeButton.item.hovered : false) : false NumberAnimation { target: closeButton; property: "scale"; to: 1.25; duration: 300; easing.type: Easing.InOutQuart } NumberAnimation { target: closeButton; property: "rotation"; to: 90; duration: 300; easing.type: Easing.InOutQuart } } ParallelAnimation { running: D.DTK.hasAnimation ? (closeButton.item ? !closeButton.item.hovered : false) : false NumberAnimation { target: closeButton; property: "scale"; to: 1; duration: 300; easing.type: Easing.InOutQuart } NumberAnimation { target: closeButton; property: "rotation"; to: 0; duration: 300; easing.type: Easing.InOutQuart } } } states: [ State { name: "normal" PropertyChanges { target: floatingPanel y: 0 opacity: 1.0 scale: 1.0 } }, State { name: "small" PropertyChanges { target: floatingPanel y: floatingPanel.parent ? floatingPanel.parent.height : 0 opacity: 0.0 scale: 0.2 } } ] transitions: [ Transition { from: "normal" to: "small" SequentialAnimation { NumberAnimation { properties: "y, opacity, scale" easing.type: Easing.InOutQuart duration: 400 } PropertyAction { target: floatingPanel; property: "animationFinished"; value: true; } } }, Transition { from: "small" to: "normal" SequentialAnimation { PropertyAction { target: floatingPanel property: "y" value: floatingPanel.parent ? floatingPanel.parent.height : 0 } NumberAnimation { properties: "y, opacity, scale" easing.type: Easing.InOutQuart duration: 400 } } } ] } } dtkdeclarative-5.7.12/qt6/src/qml/FloatingPanel.qml000066400000000000000000000070311476226662700221470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { id: control padding: DS.Style.floatingPanel.radius / 2 property D.Palette backgroundColor: DS.Style.floatingPanel.background property D.Palette backgroundNoBlurColor: DS.Style.floatingPanel.backgroundNoBlur property D.Palette dropShadowColor: DS.Style.floatingPanel.dropShadow property D.Palette outsideBorderColor: DS.Style.floatingPanel.outsideBorder property D.Palette insideBorderColor: DS.Style.floatingPanel.insideBorder // corner radius property int radius: DS.Style.floatingPanel.radius // blur radius property int blurRadius: 64 // blur blurMultiplier property real blurMultiplier: 0.0 background: D.InWindowBlur { id: blur implicitWidth: DS.Style.floatingPanel.width implicitHeight: DS.Style.floatingPanel.height radius: blurRadius multiplier: blurMultiplier offscreen: true D.ItemViewport { anchors.fill: parent fixed: true sourceItem: blur.content radius: control.radius hideSource: false } Loader { anchors.fill: parent active: Window.window && Window.window.color.a < 1 sourceComponent: D.ItemViewport { anchors.fill: parent fixed: true sourceItem: blur.content radius: control.radius hideSource: false compositionMode: DTK.CompositionMode.Source // The rounded corners are mainly clipped by the itemViewport above, // and this is primarily used for rendering the interior pixels of the rectangle during the second pass. // If anti-aliasing is enabled, it may result in extra pixels around the rounded edges, causing the clipping to be incomplete. antialiasing: false } } Loader { anchors.fill: backgroundRect active: control.dropShadowColor sourceComponent: BoxShadow { shadowOffsetX: 0 shadowOffsetY: 6 shadowColor: control.D.ColorSelector.dropShadowColor shadowBlur: 20 cornerRadius: backgroundRect.radius spread: 0 hollow: true } } Rectangle { id: backgroundRect anchors.fill: parent radius: control.radius color: blur.valid ? control.D.ColorSelector.backgroundColor : control.D.ColorSelector.backgroundNoBlurColor } Loader { anchors.fill: backgroundRect active: control.insideBorderColor && control.D.ColorSelector.controlTheme === D.ApplicationHelper.DarkType sourceComponent: InsideBoxBorder { radius: backgroundRect.radius color: control.D.ColorSelector.insideBorderColor borderWidth: DS.Style.control.borderWidth } } Loader { anchors.fill: backgroundRect active: control.outsideBorderColor sourceComponent: OutsideBoxBorder { radius: backgroundRect.radius color: control.D.ColorSelector.outsideBorderColor borderWidth: DS.Style.control.borderWidth } } } } dtkdeclarative-5.7.12/qt6/src/qml/FlowStyle.qml000066400000000000000000000753161476226662700213670ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D QtObject { property QtObject control: QtObject { property int radius: 8 property int spacing: 6 property int padding: 6 property int borderWidth: 1 property real focusBorderWidth: 2 property real focusBorderPaddings: 1 property D.Palette border: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) normalDark: Qt.rgba(0, 0, 0, 0.05) } function implicitWidth(control) { return Math.max(backgroundImplicitWidth(control), contentImplicitWidth(control)) } function implicitHeight(control) { var background = control.implicitBackgroundHeight !== undefined ? control.implicitBackgroundHeight : (control.background ? control.background.implicitHeight : 0) if (control.topInset !== undefined) background += (control.topInset + control.bottomInset) var content = control.implicitContentHeight !== undefined ? control.implicitContentHeight : (control.contentItem ? control.contentItem.implicitHeight : 0) content += (control.topPadding + control.bottomPadding) return Math.max(background, content) } function backgroundImplicitWidth(control) { var background = control.implicitBackgroundWidth !== undefined ? control.implicitBackgroundWidth : (control.background ? control.background.implicitWidth : 0) if (control.leftInset !== undefined) background += (control.leftInset + control.rightInset) return background } function contentImplicitWidth(control) { var content = control.implicitContentWidth !== undefined ? control.implicitContentWidth : (control.contentItem ? control.contentItem.implicitWidth : 0) content += (control.leftPadding + control.rightPadding) return content } function selectColor(conditionColor, lightColor, darkColor) { if (conditionColor) { return D.DTK.selectColor(conditionColor, lightColor, darkColor) } return D.DTK.themeType === D.ApplicationHelper.DarkType ? darkColor : lightColor } } // Settings property QtObject settings: QtObject { property QtObject title: QtObject { property int marginL1: 10 property int marginL2: 30 property int marginLOther: 50 } property QtObject content: QtObject { property int margin: 10 property int marginL1: 10 property int marginL2: 30 property int marginOther: 50 property int resetButtonHeight: 90 } property QtObject navigation: QtObject { property int width: 190 property int height: 20 property int margin: 10 property int textVPadding: 10 } property D.Palette background: D.Palette { normal: ("transparent") hovered: Qt.rgba(0, 0, 0, 0.1) } } // Button property QtObject button: QtObject { property int width: 140 property int height: 36 property int hPadding: control.radius property int vPadding: control.radius / 2.0 property int iconSize: 24 property D.Palette background1: D.Palette { normal { common: ("#f7f7f7") crystal: Qt.rgba(0, 0, 0, 0.1) } normalDark { common: Qt.rgba(1, 1, 1, 0.1) crystal: Qt.rgba(1, 1, 1, 0.1) } hovered { common: ("#e1e1e1") crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.2) } pressed { common: ("#bcc4d0") crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.15) } } property D.Palette background2: D.Palette { normal { common: ("#f0f0f0") crystal: Qt.rgba(0, 0, 0, 0.1) } normalDark { common: Qt.rgba(1, 1, 1, 0.1) crystal: Qt.rgba(1, 1, 1, 0.1) } hovered { common: ("#d2d2d2") crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.2) } pressed { common: ("#cdd6e0") crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.15) } } property D.Palette dropShadow: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) hovered: Qt.rgba(0, 0, 0, 0.1) } property D.Palette innerShadow1: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) pressed: ("transparent") } property D.Palette innerShadow2: D.Palette { normal: Qt.rgba(1, 1, 1, 0.2) hovered: Qt.rgba(1, 1, 1, 0.5) pressed: ("transparent") } property D.Palette insideBorder: D.Palette { normal { common: Qt.rgba(1, 1, 1, 0.1) crystal: Qt.rgba(1, 1, 1, 0.1) } normalDark { common: Qt.rgba(1, 1, 1, 0.1) crystal: Qt.rgba(1, 1, 1, 0.1) } hovered { common: Qt.rgba(1, 1, 1, 0.2) crystal: Qt.rgba(0, 0, 0, 0.05) } pressed { common: Qt.rgba(1, 1, 1, 0.03) crystal: Qt.rgba(0, 0, 0, 0.03) } } property D.Palette outsideBorder: D.Palette { normal { common: Qt.rgba(0, 0, 0, 0.08) crystal: Qt.rgba(0, 0, 0, 0.08) } hovered: Qt.rgba(0, 0, 0, 0.2) pressed: ("transparent") } property D.Palette text: D.Palette { normal { common: Qt.rgba(0, 0, 0, 0.7) crystal: Qt.rgba(0, 0, 0, 0.7) } hovered { common: Qt.rgba(0, 0, 0, 1) crystal: Qt.rgba(0, 0, 0, 1) } pressed { common: D.DTK.makeColor(D.Color.Highlight) crystal: D.DTK.makeColor(D.Color.Highlight) } } } property QtObject highlightedButton: QtObject { property D.Palette background1: D.Palette { normal { common: D.DTK.makeColor(D.Color.Highlight).saturation(+22).lightness(+14) crystal: Qt.rgba(0, 0, 0, 0.1) } normalDark { common: D.DTK.makeColor(D.Color.Highlight).saturation(+10).lightness(+10) crystal: Qt.rgba(0, 0, 0, 0.1) } hovered { common: D.DTK.makeColor(D.Color.Highlight).lightness(+10).saturation(+20).lightness(+10) crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.2) } hoveredDark { common: D.DTK.makeColor(D.Color.Highlight).lightness(+10).saturation(+30).lightness(+10) } pressed { common: D.DTK.makeColor(D.Color.Highlight).lightness(-10).saturation(+8).lightness(-8) crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.15) } pressedDark { common: D.DTK.makeColor(D.Color.Highlight).saturation(+10).lightness(+2) } disabled { common: D.DTK.makeColor(D.Color.Highlight).saturation(+22).lightness(+14) crystal: Qt.rgba(0, 0, 0, 0.1) } } property D.Palette background2: D.Palette { normal { common: D.DTK.makeColor(D.Color.Highlight).saturation(+26).lightness(-10) crystal: Qt.rgba(0, 0, 0, 0.1) } normalDark { common: D.DTK.makeColor(D.Color.Highlight).saturation(+28).lightness(-2) crystal: Qt.rgba(0, 0, 0, 0.1) } hovered { common: D.DTK.makeColor(D.Color.Highlight).lightness(+10).saturation(+15).lightness(-8) crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.2) } hoveredDark { common: D.DTK.makeColor(D.Color.Highlight).lightness(+10).saturation(+30).lightness(-7) } pressed { common: D.DTK.makeColor(D.Color.Highlight).lightness(-10).saturation(+15).lightness(-1) crystal: Qt.rgba(16.0 / 255, 16.0 / 255, 16.0 / 255, 0.15) } pressedDark { common: D.DTK.makeColor(D.Color.Highlight).saturation(+10).lightness(+2) } disabled { common: D.DTK.makeColor(D.Color.Highlight).saturation(+22).lightness(+14) crystal: Qt.rgba(0, 0, 0, 0.1) } } property D.Palette dropShadow: D.Palette { normal { common: D.DTK.makeColor(D.Color.Highlight).saturation(+50).lightness(-10).opacity(-60) crystal: Qt.rgba(0, 0, 0, 0.1) } normalDark: D.DTK.makeColor(D.Color.Highlight).saturation(+15).lightness(+12).opacity(+20) pressed: D.DTK.makeColor(D.Color.Highlight).saturation(+50).lightness(-10).opacity(-80) disabled: D.DTK.makeColor(D.Color.Highlight).saturation(+50).lightness(-10).opacity(+30) } property D.Palette innerShadow1: D.Palette { normal { common: D.DTK.makeColor(D.Color.Highlight).lightness(-10) crystal: Qt.rgba(0, 0, 0, 0.1) } normalDark: D.DTK.makeColor(D.Color.Highlight).saturation(+25).lightness(-6) hovered: D.DTK.makeColor(D.Color.Highlight).lightness(+10).lightness(-10) pressed: D.DTK.makeColor(D.Color.Highlight).lightness(+10).lightness(-5) pressedDark: D.DTK.makeColor(D.Color.Highlight).saturation(+36).lightness(-10) disabled: D.DTK.makeColor(D.Color.Highlight).lightness(-10) } property D.Palette innerShadow2: D.Palette { normal: ("transparent") } property D.Palette text: D.Palette { normal { common: Qt.rgba(1, 1, 1, 1) crystal: D.DTK.makeColor(D.Color.Highlight) } normalDark: normal } property D.Palette border: D.Palette { normal { common: D.DTK.makeColor(D.Color.Highlight).opacity(+20) crystal: Qt.rgba(1, 1, 1, 0.1) } normalDark { common: Qt.rgba(1, 1, 1, 0.2) crystal: Qt.rgba(1, 1, 1, 0.1) } hovered: Qt.rgba(0, 0, 0, 0.03) hoveredDark: Qt.rgba(1, 1, 1, 0.2) } } property QtObject checkedButton: QtObject { property D.Palette background : D.Palette { normal: D.DTK.makeColor(D.Color.Highlight) hovered: D.DTK.makeColor(D.Color.Highlight).lightness(+10) pressed: D.DTK.makeColor(D.Color.Highlight).lightness(-10) } property D.Palette text : D.Palette { normal: D.DTK.makeColor(D.Color.HighlightedText) normalDark: D.DTK.makeColor(D.Color.HighlightedText) hovered: D.DTK.makeColor(D.Color.HighlightedText).lightness(+10) hoveredDark: D.DTK.makeColor(D.Color.HighlightedText).lightness(+10) pressed: D.DTK.makeColor(D.Color.HighlightedText).opacity(-20) pressedDark: D.DTK.makeColor(D.Color.HighlightedText).opacity(-20) } property D.Palette dropShadow : D.Palette { normal: D.DTK.makeColor(D.Color.Highlight).opacity(-60) pressed: D.DTK.makeColor(D.Color.Highlight).opacity(-80) } property D.Palette innerShadow : D.Palette { normal: D.DTK.makeColor(D.Color.Highlight).lightness(-10) hovered: D.DTK.makeColor(D.Color.Highlight) pressed: D.DTK.makeColor(D.Color.Highlight).lightness(-20) } } property QtObject windowButton: QtObject { property int width: 50 property int height: 50 property D.Palette background: D.Palette { normal: ("transparent") normalDark: ("transparent") hovered: Qt.rgba(0, 0, 0, 0.10) hoveredDark: Qt.rgba(1, 1, 1, 0.10) pressed: Qt.rgba(0, 0, 0, 0.15) pressedDark: Qt.rgba(1, 1, 1, 0.15) } } property QtObject warningButton: QtObject { property D.Palette text: D.Palette { normal: ("#ff5736") } } property QtObject switchButton: QtObject { property int indicatorWidth: 50 property int indicatorHeight: 24 property int handleWidth: 30 property int handleHeight: 24 property string iconName: "switch_button" property D.Palette background: D.Palette { normal: Qt.rgba(50 / 255, 50 / 255, 50 / 255, 0.2) normalDark: ("#1A1A1A") } property D.Palette handle: D.Palette { normal: ("#8c8c8c") normalDark: ("#444444") } } property QtObject floatingButton: QtObject { property int size: 24 } property QtObject iconButton: QtObject { property int backgroundSize: 36 property int iconSize: 16 property int padding: 9 } property QtObject toolButton: QtObject { property int width: 30 property int height: 30 property int iconSize: 16 property int indicatorRightMargin: 6 } property QtObject radioButton: QtObject { property int indicatorSize: 16 property int iconSize: 16 property int spacing: 8 property int topPadding: 12 property int bottomPadding: 12 } // Box property QtObject checkBox: QtObject { property int indicatorWidth: 16 property int indicatorHeight: 16 property int padding: 2 property int iconSize: 16 property int focusRadius: 4 } property QtObject buttonBox: QtObject { property int width: 60 property int height: 30 property int padding: 0 property int spacing: 0 } property QtObject comboBox: QtObject { property int width: 240 property int height: 36 property int padding: 8 property int spacing: 10 property int iconSize: 12 property int maxVisibleItems: 16 property QtObject edit: QtObject { property int indicatorSpacing: 7 property int indicatorSize: 24 property D.Palette separator: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) } } } // Edit property QtObject edit: QtObject { property int width: 180 property int actionIconSize: 16 property int textFieldHeight: 36 property int textAreaHeight: 100 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.08) normalDark: Qt.rgba(1, 1, 1, 0.1) } property D.Palette alertBackground: D.Palette { normal: Qt.rgba(0.95, 0.22, 0.20, 0.15) } property D.Palette placeholderText: D.Palette { normal: Qt.rgba(0.33, 0.33, 0.33, 0.4) normalDark: Qt.rgba(1, 1, 1, 0.3) } } property QtObject searchEdit: QtObject { property int iconSize: 16 property int iconLeftMargin: 10 property int iconRightMargin: 7 property int animationDuration: 200 } property QtObject ipEdit: QtObject { property int fieldWidth: 40 } property QtObject passwordEdit: QtObject { property int echoActionSpacing: 8 } property QtObject keySequenceEdit: QtObject { property int width: 200 property int height: 36 property int margin: 10 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) normalDark: Qt.rgba(255, 255, 255, 0.05) } property D.Palette placeholderText: D.Palette { normal: Qt.rgba(85 / 255, 85 / 255, 85 / 255, 0.4) normalDark: Qt.rgba(192 / 255, 198 / 255, 212 / 255, 0.4) } property QtObject label: QtObject { property int leftRightPadding: 6 property int topBottomPadding: 3 property D.Palette background1: D.Palette { normal: ("#c3c3c3") normalDark: ("#3e3e3e") } property D.Palette background2: D.Palette { normal: ("#d8d8d8") normalDark: ("#525252") } property D.Palette shadowInner1: D.Palette { normal: Qt.rgba(0, 0, 0, 0.1) normalDark: Qt.rgba(0, 0, 0, 0.2) } property D.Palette shadowInner2: D.Palette { normalDark: Qt.rgba(1, 1, 1, 0.1) } property D.Palette shadowOuter: D.Palette { normal: Qt.rgba(0, 0, 0, 0.3) } property D.Palette text: D.Palette { normal: ("black") } } } property QtObject spinBox: QtObject { property int width : 300 property int height: 36 property int spacing: 10 property QtObject indicator: QtObject { property int width: 24 property int height: 14 property int iconSize: 24 property int focusIconSize: 10 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.7) hovered: Qt.rgba(0, 0, 0, 0.6) pressed: Qt.rgba(0, 0, 0, 0.8) } } } property QtObject plusMinusSpinBox: QtObject { property int buttonIconSize: 16 } // Window property QtObject dialogWindow: QtObject { property int width: 120 property int height: 120 property int contentHMargin: 10 property int footerMargin: 10 property int titleBarHeight: 50 property int iconSize: 32 } property QtObject aboutDialog: QtObject { property int width: 540 property int height: 290 property int leftAreaWidth: 220 property int bottomPadding: 20 property int productIconHeight: 128 } property QtObject popup: QtObject { property int width: 80 property int height: 180 property int radius: 18 property int padding: 10 } property QtObject floatingMessage: QtObject { property int maximumWidth: 450 property int minimumHeight: 40 property int closeButtonSize: 24 } property QtObject floatingPanel: QtObject { property int width: 180 property int height: 40 property int radius: 14 property D.Palette background: D.Palette { normal: behindWindowBlur.lightColor normalDark: behindWindowBlur.darkColor } property D.Palette backgroundNoBlur: D.Palette { normal: behindWindowBlur.lightNoBlurColor normalDark: behindWindowBlur.darkNoBlurColor } property D.Palette dropShadow: D.Palette { normal: Qt.rgba(0, 0, 0, 0.2) normalDark: Qt.rgba(0, 0, 0, 0.2) } property D.Palette outsideBorder: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) normalDark: Qt.rgba(0, 0, 0, 0.5) } property D.Palette insideBorder: D.Palette { normal: Qt.rgba(1, 1, 1, 0.05) normalDark: Qt.rgba(1, 1, 1, 0.05) } } property QtObject toolTip: QtObject { property int verticalPadding: 4 property int horizontalPadding: 5 property int height: 24 } property QtObject alertToolTip: QtObject { property int connectorWidth: 3 property int connectorHeight: 12 property int verticalPadding: 4 property int horizontalPadding: 10 property D.Palette text: D.Palette { normal: ("#e15736") normalDark: ("#e13669") } property D.Palette background: D.Palette { normal: Qt.rgba(247 / 255, 247 / 255, 247 / 255, 0.6) normalDark: Qt.rgba(59 / 255, 59 / 255, 59 / 255, 0.6) } property D.Palette connecterdropShadow: D.Palette { normal: Qt.rgba(0, 0, 0, 0.1) } property D.Palette connecterBackground: D.Palette { normal: Qt.rgba(1, 1, 1, 1) normalDark: Qt.rgba(0, 0, 0, 0.1) } } property QtObject menu: QtObject { property int padding: 6 property int topPadding: 8 property int radius: D.DTK.platformTheme.windowRadius < 0 ? 12 : D.DTK.platformTheme.windowRadius property int margins: 10 property int overlap: 1 property QtObject item: QtObject { property int width: 180 property int height: 30 property size iconSize: Qt.size(14, 14) property int count: 0 property int contentPadding: 30 property int indicatorMargin: 10 property int radius: 6 } property QtObject separator: QtObject { property int lineTopPadding : 0 property int lineBottomPadding : 0 property int lineHeight : 2 property int topPadding: 11 property int bottomPadding: 2 property D.Palette lineColor: D.Palette { normal: Qt.rgba(0, 0, 0, 0.1) } } property D.Palette background: D.Palette { normal: Qt.rgba(235 / 255., 235 / 255., 235 / 255., 0.6) normalDark: ("#80000000") } property D.Palette backgroundNoBlur: D.Palette { normal: behindWindowBlur.lightNoBlurColor normalDark: behindWindowBlur.darkNoBlurColor } property D.Palette subMenuOpenedBackground: D.Palette { normal: Qt.rgba(0, 0, 0, 0.15) } // the highlight color of main menu item, when submenu is opened. property D.Palette submenuOpenedItemHighlight: D.Palette { normal: Qt.rgba(0, 0, 0, 0.15) normalDark: Qt.rgba(1, 1, 1, 0.2) } property D.Palette itemHighlightShadow: D.Palette { normal: Qt.rgba(0, 0, 0, 0.2) normalDark: Qt.rgba(1, 1, 1, 0.1) } property D.Palette itemText: D.Palette { normal: ("black") normalDark: ("white") } property D.Palette separatorText: D.Palette { normal: Qt.rgba(0, 0, 0, 0.5) normalDark: Qt.rgba(1, 1, 1, 0.4) } } // Panel property QtObject highlightPanel: QtObject { property int width: 180 property int height: 30 property int radius: 8 property D.Palette background: D.Palette { normal: D.DTK.makeColor(D.Color.Highlight) normalDark: D.DTK.makeColor(D.Color.Highlight) hovered: D.DTK.makeColor(D.Color.Highlight).lightness(+10) hoveredDark: D.DTK.makeColor(D.Color.Highlight).lightness(+10) } property D.Palette dropShadow: D.Palette { normal: D.DTK.makeColor(D.Color.Highlight).lightness(+20).opacity(-80) normalDark: D.DTK.makeColor(D.Color.Highlight).lightness(+20).opacity(-80) } property D.Palette innerShadow: D.Palette { normal: D.DTK.makeColor(D.Color.Highlight).lightness(-20) normalDark: D.DTK.makeColor(D.Color.Highlight).lightness(-20) } } property QtObject behindWindowBlur: QtObject { property color lightColor: Qt.rgba(235 / 255.0, 235 / 255.0, 235 / 255.0, 0.6) property color lightNoBlurColor: Qt.rgba(235 / 255.0, 235 / 255.0, 235 / 255.0, 1.0) property color darkColor: "#55000000" property color darkNoBlurColor: Qt.rgba(35 / 255.0, 35 / 255.0, 35 / 255.0, 1.0) } property QtObject arrowRectangleBlur: QtObject { property int borderWidth: 1 property int roundJoinRadius: 8 property color outBorderColor: Qt.rgba(0, 0, 0, 0.06) property color darkOutBorderColor: Qt.rgba(0, 0, 0, 0.8) property color inBorderColor: Qt.rgba(1, 1, 1, 0.1) property color darkInBorderColor: Qt.rgba(1, 1, 1, 0.8) property color backgroundColor: behindWindowBlur.lightColor property color darkBackgroundColor: behindWindowBlur.darkColor property color backgroundNoBlurColor: behindWindowBlur.lightNoBlurColor property color darkBackgroundNoBlurColor: behindWindowBlur.darkNoBlurColor property color shadowColor: Qt.rgba(0, 0, 0, 0.2) property color darkShadowColor: Qt.rgba(0, 0, 0, 0.2) } property QtObject arrowListView: QtObject { property int width: 180 property size stepButtonSize: Qt.size(16, 16) property size stepButtonIconSize: Qt.size(12, 12) property int maxVisibleItems: 16 property int itemHeight: 30 property string upButtonIconName: "arrow_ordinary_up" property string downButtonIconName: "arrow_ordinary_down" } property QtObject itemDelegate: QtObject { property int width: 204 property int height: 40 property color normalColor: Qt.rgba(0, 0, 0, 0.05) property color cascadeColor: Qt.rgba(0, 0, 0, 0.15) property int iconSize: 24 property int checkIndicatorIconSize: 24 property D.Palette checkBackgroundColor: D.Palette { hovered: Qt.rgba(0, 0, 0, 0.1) normal: Qt.rgba(0, 0, 0, 0.05) } property color checkedColor: Qt.rgba(0, 0, 0, 0.15) } property QtObject stackView: QtObject { property int animationDuration: 200 property int animationEasingType: Easing.OutCubic } // Indicator property QtObject busyIndicator: QtObject { property int size: 16 property int paddingFactor: 16 property D.Palette fillColor: D.Palette { normal: D.DTK.makeColor(D.Color.Highlight) } property int animationDuration: 800 property string spinnerSource: "qrc:/dtk/declarative/resources/spinner-blue.webp" } property QtObject buttonIndicator: QtObject { property int size: 16 property int iconSize: 12 property D.Palette background: D.Palette { normal: Qt.rgba(1, 1, 1, 0.2) normalDark: ("#ffffff") } } // Bar property QtObject scrollBar: QtObject { property int padding: 2 property int width: 4 property int activeWidth: 12 property real hideOpacity: 0.0 property int hidePauseDuration: 450 property int hideDuration: 1500 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.3) normalDark: Qt.rgba(1, 1, 1, 0.3) hovered: Qt.rgba(0, 0, 0, 0.4) hoveredDark: Qt.rgba(1, 1, 1, 0.6) pressed: Qt.rgba(0, 0, 0, 0.4) pressedDark: Qt.rgba(1, 1, 1, 0.3) } property D.Palette outsideBorder: D.Palette { normal: Qt.rgba(1, 1, 1, 0.1) normalDark: Qt.rgba(0, 0, 0, 0.1) } property D.Palette insideBorder: D.Palette { normal: Qt.rgba(0, 0, 0, 0.05) normalDark: Qt.rgba(1, 1, 1, 0.1) } } property QtObject progressBar: QtObject { property int width: 300 property int height: 36 property int indeterminateProgressBarWidth: 90 property int indeterminateProgressBarAnimationDuration: 2000 property D.Palette shadowColor: D.Palette { normal: D.DTK.makeColor(D.Color.Highlight).opacity(-60) } property D.Palette handleGradientColor: D.Palette { normal: D.DTK.makeColor(D.Color.Highlight).hue(-0).saturation(+30).lightness(+30) } } property QtObject embeddedProgressBar: QtObject { property int width: 48 property int height: 6 property int contentHeight: 4 property int backgroundRadius: 3 property int contentRadius: 2 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.7) normalDark: Qt.rgba(0, 0, 0, 0.2) } property D.Palette progressBackground: D.Palette { normal: ("white") normalDark: Qt.rgba(1, 1, 1, 0.7) } } property QtObject waterProgressBar: QtObject { property int width: 98 property int height: 98 property string waterFrontImagePath: "qrc:/dtk/declarative/resources/water_front.png" property string waterBackImagePath: "qrc:/dtk/declarative/resources/water_back.png" property D.Palette background1: D.Palette { normal: ("#1f08ff") } property D.Palette background2: D.Palette { normal: ("#50fff7") } property D.Palette dropShadow: D.Palette { normal: Qt.rgba(42 / 255, 154 / 255, 248 / 255, 0.3) } property D.Palette popBackground: D.Palette { normal: Qt.rgba(255, 255, 255, 0.3) } property D.Palette textColor: D.Palette { normal: ("white") } } property QtObject titleBar: QtObject { property int height: 50 property int iconSize: 32 property int leftMargin: 10 } // Other property QtObject slider: QtObject { property int width: 120 property int height: 60 property int highlightMargin: -4 property QtObject handle: QtObject { property int width: 20 property int height: 24 } property QtObject groove: QtObject { property int width: 100 property int height: 4 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.2) normalDark: Qt.rgba(1, 1, 1, 0.2) } } property QtObject tick: QtObject { property int width: 1 property int height: 12 property int radius: 8 property int textMargin: 2 property int hPadding: 10 property int vPadding: 2 property D.Palette background: D.Palette { normal: Qt.rgba(0, 0, 0, 0.4) normalDark: Qt.rgba(1, 1, 1, 0.4) } } } // Dial property QtObject dial: QtObject { property int size: 100 } // PageIndicator property QtObject pageIndicator: QtObject { property int width: 8 property int height: 8 } } dtkdeclarative-5.7.12/qt6/src/qml/FocusBoxBorder.qml000066400000000000000000000013421476226662700223110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Item { id: control property color color: palette.highlight property real borderWidth: DS.Style.control.focusBorderWidth property real radius: DS.Style.control.radius Rectangle { id: _border readonly property real paddings: borderWidth + DS.Style.control.focusBorderPaddings anchors { fill: parent margins: -paddings } radius: parent.radius border { width: borderWidth; color: parent.color } color: "transparent" } } dtkdeclarative-5.7.12/qt6/src/qml/Frame.qml000066400000000000000000000016411476226662700204570ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk.style 1.0 as DS T.Frame { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding) contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0) contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0) padding: DS.Style.control.padding property int radius: DS.Style.control.radius background: Rectangle { color: "transparent" border.color: control.palette.mid radius: control.radius } } dtkdeclarative-5.7.12/qt6/src/qml/GroupBox.qml000066400000000000000000000025041476226662700211710ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk.style 1.0 as DS T.GroupBox { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, label ? label.implicitWidth + leftPadding + rightPadding : 0, contentWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding) contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0) contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0) padding: 0 topPadding: padding + (label && label.implicitWidth > 0 ? label.implicitHeight + spacing : 0) label: Label { x: DS.Style.control.radius text: control.title color: control.palette.windowText elide: Text.ElideRight verticalAlignment: Text.AlignLeft background: Rectangle { } } background: Rectangle { y: label.height / 2 width: parent.width radius: DS.Style.control.radius color: control.palette.window } } dtkdeclarative-5.7.12/qt6/src/qml/HelpAction.qml000066400000000000000000000004361476226662700214540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D Action { id: helpAction text: qsTr("Help") onTriggered: D.ApplicationHelper.handleHelpAction() } dtkdeclarative-5.7.12/qt6/src/qml/HighlightPanel.qml000066400000000000000000000025561476226662700223220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Item { id: panel property D.Palette backgroundColor: DS.Style.highlightPanel.background property D.Palette outerShadowColor: DS.Style.highlightPanel.dropShadow property D.Palette innerShadowColor: DS.Style.highlightPanel.innerShadow property int radius: DS.Style.highlightPanel.radius implicitWidth: DS.Style.highlightPanel.width implicitHeight: DS.Style.highlightPanel.height // TODO drop shadow temporarily. // BoxShadow { // anchors.fill: backgroundRect // visible: panel.outerShadowColor // shadowColor: panel.D.ColorSelector.outerShadowColor // shadowOffsetY: 4 // shadowBlur: 6 // cornerRadius: backgroundRect.radius // } Rectangle { id: backgroundRect anchors.fill: parent color: panel.D.ColorSelector.backgroundColor radius: panel.radius } // BoxInsetShadow { // anchors.fill: backgroundRect // visible: panel.innerShadowColor // shadowColor: panel.D.ColorSelector.innerShadowColor // shadowOffsetY: -1 // shadowBlur: 2 // spread: 1 // cornerRadius: backgroundRect.radius // } } dtkdeclarative-5.7.12/qt6/src/qml/IconButton.qml000066400000000000000000000023141476226662700215070ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.private as P Button { id: control implicitWidth: Math.max(DS.Style.control.implicitWidth(control), DS.Style.control.implicitHeight(control)) implicitHeight: implicitWidth topPadding: DS.Style.iconButton.padding bottomPadding: DS.Style.iconButton.padding leftPadding: DS.Style.iconButton.padding rightPadding: DS.Style.iconButton.padding icon { width: DS.Style.iconButton.iconSize height: DS.Style.iconButton.iconSize color: D.ColorSelector.textColor } contentItem: D.DciIcon { name: control.icon.name palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme sourceSize: Qt.size(control.icon.width, control.icon.height) } background: P.ButtonPanel { implicitWidth: DS.Style.iconButton.backgroundSize implicitHeight: DS.Style.iconButton.backgroundSize button: control } } dtkdeclarative-5.7.12/qt6/src/qml/InsideBoxBorder.qml000066400000000000000000000011621476226662700224450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Window Item { // The width of the window's inner and outer borders do not change as the screen scales, and always remain 1px size property real borderWidth: 1 / Screen.devicePixelRatio property color color: Qt.rgba(1, 1, 1, 0.15) property alias radius: rect.radius Rectangle { id: rect anchors.fill: parent color: "transparent" border { width: borderWidth color: parent.color } } } dtkdeclarative-5.7.12/qt6/src/qml/IpV4LineEdit.qml000066400000000000000000000075441476226662700216350ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS FocusScope { id: control property string text property string alertText property int alertDuration property bool showAlert property D.Palette backgroundColor: DS.Style.edit.background width: impl.width height: impl.height Control { id: impl anchors.fill: parent contentItem: RowLayout { Repeater { id: fields model: 4 Layout.fillWidth: true delegate: TextInput { KeyNavigation.right: index < fields.count - 1 ? fields.itemAt(index + 1) : null KeyNavigation.left: index > 0 ? fields.itemAt(index - 1) : null selectByMouse: true color: impl.palette.text selectionColor: impl.palette.highlight verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: modelData Layout.preferredWidth: DS.Style.ipEdit.fieldWidth Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter validator: RegularExpressionValidator { regularExpression: /^(([0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])?)$/ } Loader { active: index < fields.count - 1 sourceComponent: Label { text: "." anchors { left: parent.right } } } onTextEdited: fields.updateText() } function updateText() { var text = "" for (var i = 0; i < fields.count; ++i) { text += fields.itemAt(i).text if (i < fields.count - 1) text += "." } control.text = text == "..." ? "" : text } function clearText() { for (var i = 0; i < fields.count; ++i) { fields.itemAt(i).text = "" } control.text = "" } function updateByText() { if (control.text === "") clearText() var arrs = control.text.split(".") if (arrs.length != 4) return fields.model = arrs } Component.onCompleted: { updateByText() control.textChanged.connect(updateByText) } } Loader { id: clearBtn active: control.activeFocus && control.text width: height height: 36 Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.rightMargin: 8 sourceComponent: ActionButton { icon.name: "entry_clear" focusPolicy: Qt.NoFocus onClicked: fields.clearText() } } } background: EditPanel { control: impl alertText: control.alertText alertDuration: control.alertDuration showAlert: control.showAlert showBorder: control.activeFocus backgroundColor: control.backgroundColor implicitWidth: DS.Style.edit.width implicitHeight: DS.Style.edit.textFieldHeight } } } dtkdeclarative-5.7.12/qt6/src/qml/ItemDelegate.qml000066400000000000000000000142041476226662700217550ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022-2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.private 1.0 as P T.ItemDelegate { id: control property bool indicatorVisible property bool backgroundVisible: true property bool normalBackgroundVisible: true property bool cascadeSelected property bool contentFlow property Component content property D.Palette checkedTextColor: DS.Style.checkedButton.text property int corners: D.RoundRectangle.TopLeftCorner | D.RoundRectangle.TopRightCorner | D.RoundRectangle.BottomLeftCorner | D.RoundRectangle.BottomRightCorner property bool dragActive: false // drag property bool enableDrag: false Drag.mimeData: { "text/plain": control.text } Drag.dragType: Drag.Automatic function getCornersForBackground(index, count) { if (count <= 1) return D.RoundRectangle.TopLeftCorner | D.RoundRectangle.TopRightCorner | D.RoundRectangle.BottomLeftCorner | D.RoundRectangle.BottomRightCorner if (index === 0) { return D.RoundRectangle.TopLeftCorner | D.RoundRectangle.TopRightCorner } else if (index === count - 1) { return D.RoundRectangle.BottomLeftCorner | D.RoundRectangle.BottomRightCorner } return 0 } implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset padding: DS.Style.control.padding spacing: DS.Style.control.spacing checkable: true autoExclusive: true palette.windowText: { let undraged = D.DTK.hasAnimation ? control.backgroundVisible && !dragActive : true return checked && !control.cascadeSelected && undraged ? D.ColorSelector.checkedTextColor : undefined } D.DciIcon.mode: D.ColorSelector.controlState D.DciIcon.theme: D.ColorSelector.controlTheme D.DciIcon.palette: D.DTK.makeIconPalette(palette) icon { width: DS.Style.itemDelegate.iconSize height: DS.Style.itemDelegate.iconSize } font: D.DTK.fontManager.t8 indicator: Loader { x: control.text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2 y: control.topPadding + (control.availableHeight - height) / 2 active: control.indicatorVisible && control.checked sourceComponent: D.DciIcon { palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false name: "menu_select" sourceSize: Qt.size(DS.Style.itemDelegate.checkIndicatorIconSize, DS.Style.itemDelegate.checkIndicatorIconSize) } } contentItem: RowLayout { D.IconLabel { spacing: control.spacing mirrored: control.mirrored display: control.display alignment: control.display === D.IconLabel.IconOnly || control.display === D.IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft | Qt.AlignVCenter text: control.text font: control.font color: control.palette.windowText icon: D.DTK.makeIcon(control.icon, control.D.DciIcon) Layout.fillWidth: !control.contentFlow } Loader { sourceComponent: control.content Layout.fillWidth: control.contentFlow Layout.alignment: control.contentFlow ? Qt.AlignLeft : Qt.AlignRight } } background: Item { visible: backgroundVisible implicitWidth: DS.Style.itemDelegate.width implicitHeight: DS.Style.itemDelegate.height Loader { anchors.fill: parent active: checked && !control.cascadeSelected && !dragActive sourceComponent: HighlightPanel {} } Loader { anchors.fill: parent active: checked && control.cascadeSelected sourceComponent: D.RoundRectangle { color: DS.Style.itemDelegate.cascadeColor radius: DS.Style.control.radius corners: control.corners } } Loader { anchors.fill: parent active: !checked && control.normalBackgroundVisible && !D.DTK.hasAnimation && control.hovered sourceComponent: D.RoundRectangle { color: DS.Style.itemDelegate.normalColor radius: DS.Style.control.radius corners: control.corners } } Loader { anchors.fill: parent active: dragActive sourceComponent: Rectangle { border.color: Qt.rgba(0, 0, 0, 0.09) radius: DS.Style.control.radius } } } DragHandler { id: dragHandler enabled: enableDrag onActiveChanged: { if (active) { let dragItem = control.ListView.view.dragItem if (!dragItem) return let md = JSON.stringify(dragItem.Drag.mimeData) if (md.length > 2) // '{}' control.Drag.mimeData = dragItem.Drag.mimeData dragItem.grabToImage(function(result) { control.Drag.imageSource = result.url; control.Drag.hotSpot = Qt.point(dragItem.width / 2, dragItem.height / 2) control.Drag.active = true }) } } } onHoveredChanged: { if (checked || control.cascadeSelected || !backgroundVisible || dragActive || !D.DTK.hasAnimation) return if (ListView.view) ListView.view.setHoverItem(control.hovered ? control : null) } onCheckedChanged: { if (ListView.view && D.DTK.hasAnimation) ListView.view.updateCheckedItems() } } dtkdeclarative-5.7.12/qt6/src/qml/KeySequenceEdit.qml000066400000000000000000000046241476226662700224600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.private 1.0 as P Control { id: control property string text property string placeholderText property alias keys: listener.keys property D.Palette backgroundColor: DS.Style.keySequenceEdit.background property D.Palette placeholderTextColor: DS.Style.keySequenceEdit.placeholderText background: Rectangle { implicitWidth: DS.Style.keySequenceEdit.width implicitHeight: DS.Style.keySequenceEdit.height radius: DS.Style.control.radius color: control.D.ColorSelector.backgroundColor } contentItem: RowLayout { Label { Layout.leftMargin: DS.Style.keySequenceEdit.margin text: control.text horizontalAlignment: Qt.AlignLeft verticalAlignment: Qt.AlignVCenter Layout.fillWidth: true Layout.fillHeight: true Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter } Component { id: inputComponent Label { text: control.placeholderText color: control.D.ColorSelector.placeholderTextColor font: D.DTK.fontManager.t7 horizontalAlignment: Qt.AlignRight verticalAlignment: Qt.AlignVCenter } } Component { id: keyComponent RowLayout { spacing: DS.Style.keySequenceEdit.margin Repeater { model: control.keys P.KeySequenceLabel { Layout.alignment: Qt.AlignRight text: modelData } } } } Loader { Layout.rightMargin: DS.Style.keySequenceEdit.margin Layout.alignment: Qt.AlignVCenter sourceComponent: (control.keys.length !== 0) ? keyComponent : inputComponent MouseArea { anchors.fill: parent onClicked: { control.forceActiveFocus() listener.clearKeys() } } } } D.KeySequenceListener { id: listener target: control } } dtkdeclarative-5.7.12/qt6/src/qml/Label.qml000066400000000000000000000002741476226662700204450ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls Label { opacity: enabled ? 1 : 0.4 } dtkdeclarative-5.7.12/qt6/src/qml/LineEdit.qml000066400000000000000000000017171476226662700211260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS TextField { id: control readonly property alias clearButton: clearBtn rightPadding: clearBtn.active ? (clearBtn.width + clearBtn.anchors.rightMargin) : 10 selectByMouse: true Loader { id: clearBtn active: control.text.length !== 0 width: height height: control.background.implicitHeight anchors { right: control.right verticalCenter: control.verticalCenter } sourceComponent: ActionButton { focusPolicy: Qt.NoFocus icon { name: "entry_clear" width: DS.Style.edit.actionIconSize height: DS.Style.edit.actionIconSize } onClicked: control.clear() } } } dtkdeclarative-5.7.12/qt6/src/qml/ListView.qml000066400000000000000000000147041476226662700211770ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.private 1.0 as P ListView { id: control property int duration: 100 property bool bgVisible: false property Item hoveredItem property list checkedItems property alias dragItem: dragItem function setHoverItem(item) { if (item) { hoveredItem = item // if hover from null to item do not show animation bgVisible = (background.x <= 0 && background.y <= 0) ? false : hoveredItem.hovered background.x = hoveredItem.x - contentX background.y = hoveredItem.y - contentY background.width = hoveredItem.background.width background.height = hoveredItem.background.height bgVisible = hoveredItem.hovered control.state = bgVisible ? "Visible" : "Invisible" } else { hideTimer.start() } } function updateCheckedItems() { var items = [] for (var i = 0; i < count; ++i) { let item = itemAtIndex(i) if (item && item.checked) { items.push(item) } } checkedItems = items } DragItemsImage { id: dragItem items: checkedItems visible: Drag.active && D.DTK.hasAnimation // Drag.mimeData: {"text/plain": ""} onAboutToGrabToImage: function(item) { item.dragActive = true } onGrabToImageFinished: function(item) { item.dragActive = false } } onContentXChanged: { if (hoveredItem && hoveredItem.hovered && background) background.x = hoveredItem.x - contentX } onContentYChanged: { if (hoveredItem && hoveredItem.hovered && background) background.y = hoveredItem.y - contentY } // ItemDelegate hover item0 ==> item1, add timer ignore [item0.unhovered] // item0.hovered, item0.unhovered, item1.hovered Timer { id: hideTimer interval: control.duration onTriggered: { bgVisible = hoveredItem ? hoveredItem.hovered : false control.state = bgVisible ? "Visible" : "Invisible" } } // visible animation states: [ State{ name: "Visible" PropertyChanges { target: background; opacity: 1.0 } PropertyChanges { target: background; scale: 1.0 } PropertyChanges { target: background; visible: true } }, State{ name:"Invisible" PropertyChanges { target: background; opacity: 0.0 } PropertyChanges { target: background; scale: 0.5 } PropertyChanges { target: background; visible: false } } ] transitions: [ Transition { from: "Visible" to: "Invisible" SequentialAnimation { ParallelAnimation { NumberAnimation { target: background property: "opacity" duration: control.duration easing.type: Easing.InOutQuad } NumberAnimation { target: background property: "scale" duration: control.duration easing.type: Easing.InOutQuad } } NumberAnimation { target: background property: "visible" duration: 0 } } }, Transition { from: "Invisible" to: "Visible" SequentialAnimation { NumberAnimation { target: background property: "visible" duration: 0 } ParallelAnimation { NumberAnimation { target: background property: "opacity" duration: control.duration easing.type: Easing.InOutQuad } NumberAnimation { target: background property: "scale" duration: control.duration easing.type: Easing.InOutQuad } } } } ] Item { id: background implicitWidth: hoveredItem ? hoveredItem.background.width : DS.Style.itemDelegate.width implicitHeight: hoveredItem ? hoveredItem.background.height : DS.Style.itemDelegate.height z: -1 Loader { anchors.fill: parent active: hoveredItem && D.DTK.hasAnimation sourceComponent: P.ButtonPanel { button: hoveredItem enableAnimation: false // avoid hover animation enableBoxShadow: false outsideBorderColor: null insideBorderColor: null innerShadowColor1: null innerShadowColor2: null dropShadowColor: null visible: hoveredItem && !hoveredItem.checked && hoveredItem.enabled color1: D.Palette { normal { common: Qt.rgba(0, 0, 0, 0.1) } normalDark { common: Qt.rgba(1, 1, 1, 0.1) } } color2: color1 } } onVisibleChanged: { if (!visible) { // ensure do not show animation when hoveredItem from null to item background.x = -1 background.y = -1 } } // move and resize animation Behavior on x { enabled: bgVisible NumberAnimation { duration: control.duration } } Behavior on y { enabled: bgVisible NumberAnimation { duration: control.duration } } Behavior on width { enabled: bgVisible NumberAnimation { duration: control.duration } } Behavior on height { enabled: bgVisible NumberAnimation { duration: control.duration } } } } dtkdeclarative-5.7.12/qt6/src/qml/Menu.qml000066400000000000000000000076261476226662700203420ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Window import QtQuick.Layouts import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.Menu { id: control property bool closeOnInactive: true property int maxVisibleItems : DS.Style.arrowListView.maxVisibleItems property D.Palette backgroundColor: DS.Style.menu.background property D.Palette backgroundNoBlurColor: DS.Style.menu.backgroundNoBlur property var model: control.contentModel property Component header property Component footer readonly property bool existsChecked: { for (var i = 0; i < count; ++i) { var item = itemAt(i) if (item && item.checked) return true } return false } readonly property bool active: parent && parent.Window.active implicitHeight: DS.Style.control.implicitHeight(control) implicitWidth: DS.Style.control.implicitWidth(control) margins: DS.Style.menu.margins overlap: DS.Style.menu.overlap padding: DS.Style.menu.padding topPadding: DS.Style.menu.topPadding bottomPadding: topPadding delegate: MenuItem { } D.PopupHandle.delegate: PopupWindow { blurControl: control } contentItem: FocusScope { // QTBUG-99897 focus doesn't be clear. implicitWidth: viewLayout.implicitWidth implicitHeight: viewLayout.implicitHeight ColumnLayout { id: viewLayout spacing: 0 anchors.fill: parent Loader { Layout.fillWidth: true Layout.preferredHeight: height sourceComponent: control.header } ArrowListView { id: contentView property int count: contentView.view.count view.model: control.model Layout.fillWidth: true Layout.fillHeight: true view.currentIndex: control.currentIndex maxVisibleItems: control.maxVisibleItems itemHeight: DS.Style.menu.item.height view.highlightFollowsCurrentItem: true view.highlightMoveDuration: 50 view.highlightMoveVelocity: -1 view.highlight: HighlightPanel { id: highlightRect visible: false // TODO listview's highlight is confict with Item's highlight. anchors.left: parent ? parent.left : undefined anchors.right: parent ? parent.right : undefined anchors.leftMargin: 0 anchors.rightMargin: 0 scale: D.DTK.hasAnimation ? 0.9 : 1.0 radius: DS.Style.menu.item.radius outerShadowColor: null innerShadowColor: null Component.onCompleted: { scale = 1.0 } Behavior on scale { NumberAnimation { duration: 100 } } } } Loader { Layout.fillWidth: true Layout.preferredHeight: height sourceComponent: control.footer } } } background: Loader { active: !control.D.PopupHandle.window sourceComponent: FloatingPanel { implicitWidth: DS.Style.menu.item.width implicitHeight: DS.Style.menu.item.height radius: DS.Style.menu.radius blurMultiplier: 8.0 backgroundColor: control.backgroundColor backgroundNoBlurColor: control.backgroundNoBlurColor outsideBorderColor: null } } onActiveChanged: { if (!active && closeOnInactive) { control.close() } } } dtkdeclarative-5.7.12/qt6/src/qml/MenuBar.qml000066400000000000000000000002401476226662700207500ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls MenuBar { } dtkdeclarative-5.7.12/qt6/src/qml/MenuItem.qml000066400000000000000000000104061476226662700211470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.MenuItem { id: control property bool useIndicatorPadding: menu && menu.existsChecked || false implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset padding: DS.Style.control.padding spacing: DS.Style.control.spacing opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 icon { height: DS.Style.menu.item.iconSize.height width: DS.Style.menu.item.iconSize.height } property D.Palette textColor: control.highlighted ? DS.Style.checkedButton.text : DS.Style.menu.itemText property D.Palette subMenuBackgroundColor: DS.Style.menu.subMenuOpenedBackground palette.windowText: D.ColorSelector.textColor D.DciIcon.mode: D.ColorSelector.controlState D.DciIcon.theme: D.ColorSelector.controlTheme D.DciIcon.palette: D.DTK.makeIconPalette(palette) contentItem: D.IconLabel { readonly property real arrowPadding: control.subMenu && control.arrow ? control.arrow.width + control.spacing : 0 readonly property real indicatorPadding: control.useIndicatorPadding && control.indicator ? control.indicator.width + control.spacing : 0 leftPadding: (!control.mirrored ? indicatorPadding : arrowPadding) + DS.Style.menu.item.contentPadding rightPadding: (control.mirrored ? indicatorPadding : arrowPadding) + DS.Style.menu.item.contentPadding spacing: control.spacing mirrored: control.mirrored display: control.display alignment: Qt.AlignLeft text: control.text font: control.font color: control.palette.windowText Behavior on color { enabled: D.DTK.hasAnimation ColorAnimation { duration: control.hovered ? 100 : 0; } } icon: D.DTK.makeIcon(control.icon, control.D.DciIcon) } indicator: Loader { width: DS.Style.menu.item.iconSize.width height: DS.Style.menu.item.iconSize.height active: control.checked anchors { left: control.left leftMargin: control.mirrored ? control.width - width - DS.Style.menu.item.indicatorMargin : DS.Style.menu.item.indicatorMargin verticalCenter: parent.verticalCenter } sourceComponent: D.DciIcon { sourceSize: Qt.size(DS.Style.menu.item.iconSize.width, DS.Style.menu.item.iconSize.height) name: "menu_select" palette: control.D.DciIcon.palette mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } } arrow: Loader { width: DS.Style.menu.item.iconSize.width height: DS.Style.menu.item.iconSize.height active: control.subMenu anchors { right: parent.right rightMargin: control.mirrored ? control.width - width - control.rightPadding : control.rightPadding verticalCenter: parent.verticalCenter } sourceComponent: D.DciIcon { sourceSize: Qt.size(DS.Style.menu.item.iconSize.width, DS.Style.menu.item.iconSize.height) mirror: control.mirrored name: "menu_arrow" palette: control.D.DciIcon.palette mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } } background: Item { implicitWidth: DS.Style.menu.item.width implicitHeight: DS.Style.menu.item.height Loader { anchors.fill: parent active: control.highlighted sourceComponent: HighlightPanel { outerShadowColor: null innerShadowColor: null radius: DS.Style.menu.item.radius } } } } dtkdeclarative-5.7.12/qt6/src/qml/MenuSeparator.qml000066400000000000000000000030161476226662700222100ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.MenuSeparator { id: control property string text property bool __lineStyle: control.text === "" property D.Palette textColor: DS.Style.menu.separatorText implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentItem.implicitHeight + topPadding + bottomPadding) topPadding: __lineStyle ? DS.Style.menu.separator.lineTopPadding : DS.Style.menu.separator.topPadding bottomPadding: __lineStyle ? DS.Style.menu.separator.lineBottomPadding : DS.Style.menu.separator.bottomPadding contentItem: Loader { sourceComponent: __lineStyle ? lineCom : titleCom Component { id: lineCom Rectangle { property D.Palette separatorColor: DS.Style.menu.separator.lineColor width: control.parent.width implicitHeight: DS.Style.menu.separator.lineHeight color: D.ColorSelector.separatorColor } } Component { id: titleCom Text { text: control.text font: D.DTK.fontManager.t8 color: control.D.ColorSelector.textColor } } } } dtkdeclarative-5.7.12/qt6/src/qml/OutsideBoxBorder.qml000066400000000000000000000010311476226662700226410ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick Item { property real borderWidth: 1 property color color: "white" property real radius: 0 Rectangle { id: rect color: "transparent" radius: parent.radius + border.width anchors { fill: parent margins: -border.width } border { width: borderWidth color: parent.color } } } dtkdeclarative-5.7.12/qt6/src/qml/PageIndicator.qml000066400000000000000000000022221476226662700221320ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk.style 1.0 as DS T.PageIndicator { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentItem.implicitHeight + topPadding + bottomPadding) padding: DS.Style.control.padding spacing: DS.Style.control.padding delegate: Rectangle { implicitWidth: DS.Style.pageIndicator.width implicitHeight: DS.Style.pageIndicator.height radius: width / 2 color: control.enabled ? control.palette.highlight : "gray" opacity: index === currentIndex ? 0.95 : pressed ? 0.7 : 0.45 Behavior on opacity { OpacityAnimator { duration: 100 } } } contentItem: Row { spacing: control.spacing Repeater { model: control.count delegate: control.delegate } } } dtkdeclarative-5.7.12/qt6/src/qml/Pane.qml000066400000000000000000000005231476226662700203060ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Templates as T import org.deepin.dtk.style 1.0 as DS T.Pane { id: control implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) } dtkdeclarative-5.7.12/qt6/src/qml/PasswordEdit.qml000066400000000000000000000023231476226662700220330ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS LineEdit { id: control // 暴露给外部的属性 readonly property bool isEchoMode: control.echoMode === TextInput.Normal property alias echoButtonVisible: echoButton.visible function toggleEchoMode() { if (control.isEchoMode) { control.echoMode = TextInput.Password } else { control.echoMode = TextInput.Normal } } echoMode: TextInput.Password clearButton.anchors.rightMargin: echoButton.visible ? DS.Style.passwordEdit.echoActionSpacing + echoButton.width : 0 ActionButton { id: echoButton anchors { right: control.right rightMargin: DS.Style.passwordEdit.echoActionSpacing verticalCenter: control.verticalCenter } width: height focusPolicy: Qt.NoFocus onClicked: control.toggleEchoMode() icon.name: control.isEchoMode ? "entry_password_shown" : "entry_password_hide" } } dtkdeclarative-5.7.12/qt6/src/qml/PlaceholderText.qml000066400000000000000000000003661476226662700225170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Controls import QtQuick.Controls.impl as I I.PlaceholderText { elide: Text.ElideRight } dtkdeclarative-5.7.12/qt6/src/qml/PlusMinusSpinBox.qml000066400000000000000000000040631476226662700226700ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import org.deepin.dtk.style 1.0 as DS FocusScope { id: control // Default SpinBox Properties property alias spinBox: spinBoxControl // Button Visible Properties property alias upButtonVisible: plusButton.active property alias downButtonVisible: minusButton.active property alias resetButtonVisible: resetButton.active implicitWidth: DS.Style.spinBox.width implicitHeight: DS.Style.spinBox.height RowLayout { anchors.fill: parent spacing: DS.Style.spinBox.spacing SpinBox { id: spinBoxControl Layout.fillWidth: true up.indicator: null down.indicator: null } Loader { id: plusButton active: true sourceComponent: IconButton { implicitWidth: DS.Style.spinBox.height implicitHeight: DS.Style.spinBox.height focusPolicy: Qt.NoFocus icon.name: "action_add" icon.width: 16 onClicked: spinBoxControl.increase() } } Loader { id: minusButton active: true sourceComponent: IconButton { implicitWidth: DS.Style.spinBox.height implicitHeight: DS.Style.spinBox.height focusPolicy: Qt.NoFocus icon.name: "action_reduce" icon.width: 16 onClicked: spinBoxControl.decrease() } } Loader { id: resetButton active: false sourceComponent: IconButton { implicitWidth: DS.Style.spinBox.height implicitHeight: DS.Style.spinBox.height focusPolicy: Qt.NoFocus icon.name: "action_reset" icon.width: 16 onClicked: { spinBoxControl.value = 0 } } } } } dtkdeclarative-5.7.12/qt6/src/qml/Popup.qml000066400000000000000000000016421476226662700205310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Window import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.Popup { id: control property bool closeOnInactive: true readonly property bool active: parent && parent.Window.active implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) padding: DS.Style.popup.padding background: Loader { active: !control.D.PopupHandle.window sourceComponent: FloatingPanel { implicitHeight: DS.Style.popup.height implicitWidth: DS.Style.popup.width radius: DS.Style.popup.radius } } onActiveChanged: { if (!active && closeOnInactive) { control.close() } } } dtkdeclarative-5.7.12/qt6/src/qml/PopupWindow.qml000066400000000000000000000006531476226662700217220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Window import org.deepin.dtk 1.0 as D Window { property alias blurControl: behindBlur.control flags: Qt.Popup D.DWindow.enabled: true D.DWindow.enableBlurWindow: true StyledBehindWindowBlur { id: behindBlur anchors.fill: parent } } dtkdeclarative-5.7.12/qt6/src/qml/ProgressBar.qml000066400000000000000000000014411476226662700216540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.private 1.0 as P T.ProgressBar { id: control property string formatText property bool animationStop: false implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) contentItem: P.ProgressBarImpl { progressBar: control formatText: control.formatText animationStop: control.animationStop } background: P.ProgressBarPanel { implicitWidth: DS.Style.progressBar.width implicitHeight: DS.Style.progressBar.height progressBar: control } } dtkdeclarative-5.7.12/qt6/src/qml/QuitAction.qml000066400000000000000000000003411476226662700215010ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick Action { id: quitAction text: qsTr("Exit") onTriggered: Qt.quit() } dtkdeclarative-5.7.12/qt6/src/qml/RadioButton.qml000066400000000000000000000051101476226662700216520ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.RadioButton { id: control implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset padding: DS.Style.control.padding spacing: DS.Style.radioButton.spacing topPadding: DS.Style.radioButton.topPadding bottomPadding: DS.Style.radioButton.bottomPadding opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 D.DciIcon.mode: D.ColorSelector.controlState D.DciIcon.theme: D.ColorSelector.controlTheme icon { width: DS.Style.radioButton.iconSize height: DS.Style.radioButton.iconSize } indicator: Item { x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2 y: control.topPadding + (control.availableHeight - height) / 2 implicitWidth: DS.Style.radioButton.indicatorSize implicitHeight: implicitWidth D.DciIcon { anchors.centerIn: parent palette: control.D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: control.checked ? "radio_checked" : "radio_unchecked" sourceSize: Qt.size(control.icon.width, control.icon.height) fallbackToQIcon: false } Loader { anchors.centerIn: parent active: control.activeFocus sourceComponent: D.DciIcon { palette: control.D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme name: "radio_focus" sourceSize: Qt.size(control.icon.width, control.icon.height) fallbackToQIcon: false } } } contentItem: Text { leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0 rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0 text: control.text font: control.font elide: Text.ElideRight verticalAlignment: Text.AlignVCenter color: control.palette.windowText } } dtkdeclarative-5.7.12/qt6/src/qml/RecommandButton.qml000066400000000000000000000003711476226662700225250ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Button { id: control highlighted: true } dtkdeclarative-5.7.12/qt6/src/qml/RectangularShadow.qml000066400000000000000000000036301476226662700230420ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D Item { id: rootItem /*! This property defines the offset of the shadow in the x-axis direction. */ property real offsetX: 0.0 /*! This property defines the offset of the shadow in the y-axis direction. */ property real offsetY: 0.0 /*! This property defines how many pixels outside(or inside) the item area are reached by the shadow. */ property real glowRadius: 0.0 /*! This property defines how large part of the shadow color is strengthened near the source edges. */ property real spread: 0.0 /*! This property defines the the shadow color. */ property color color: "black" /*! This property defines corners size of the control that draws the shadow. */ property real cornerRadius: glowRadius /*! This property defines does the shadow fill the entire area. */ property alias fill: effct.fill D.GlowEffect { id: effct property real inverseSpread: 1.0 - rootItem.spread property real cornerRadius: { var maxCornerRadius = Math.min(rootItem.width, rootItem.height) / 2 + rootItem.glowRadius; return Math.max(0, Math.min(rootItem.cornerRadius + rootItem.glowRadius, maxCornerRadius)) } x: (parent.width - width) / 2.0 + offsetX y: (parent.height - height) / 2.0 + offsetY width: parent.width + rootItem.glowRadius * 2 + cornerRadius * 2 height: parent.height + rootItem.glowRadius * 2 + cornerRadius * 2 color: rootItem.color spread: rootItem.spread / 2.0 glowRadius: rootItem.glowRadius * 1 + cornerRadius * 2 relativeSizeX: ((inverseSpread * inverseSpread) * rootItem.glowRadius + cornerRadius * 2.0) / width relativeSizeY: relativeSizeX * (width / height) } } dtkdeclarative-5.7.12/qt6/src/qml/RoundButton.qml000066400000000000000000000002161476226662700217050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later FloatingButton { } dtkdeclarative-5.7.12/qt6/src/qml/ScrollBar.qml000066400000000000000000000065201476226662700213110ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.ScrollBar { id: control implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) padding: DS.Style.scrollBar.padding visible: control.policy !== T.ScrollBar.AlwaysOff policy: D.DTK.platformTheme.scrollBarPolicy state: "hide" states: [ State { name: "hide" when: control.policy === T.ScrollBar.AlwaysOff || (control.policy !== T.ScrollBar.AlwaysOn && (!control.active || control.size >= 1.0)) PropertyChanges { target: control.contentItem implicitWidth: DS.Style.scrollBar.width opacity: DS.Style.scrollBar.hideOpacity } }, State { name: "normal" property bool moving: control.active && !control.pressed && !control.hovered when: control.policy === T.ScrollBar.AlwaysOn || ( moving && control.size < 1.0) PropertyChanges { target: control.contentItem implicitWidth: DS.Style.scrollBar.width } }, State { name: "hover" when: control.policy === T.ScrollBar.AlwaysOn || ( control.hovered && !control.pressed && control.size < 1.0) PropertyChanges { target: control.contentItem implicitWidth: DS.Style.scrollBar.activeWidth } }, State { name: "active" when: control.policy === T.ScrollBar.AlwaysOn || (control.pressed && control.size < 1.0) PropertyChanges { target: control.contentItem implicitWidth: DS.Style.scrollBar.activeWidth } } ] transitions: Transition { to: "hide" SequentialAnimation { PauseAnimation { duration: DS.Style.scrollBar.hidePauseDuration } NumberAnimation { target: control.contentItem; duration: DS.Style.scrollBar.hideDuration; property: "opacity"; to:DS.Style.scrollBar.hideOpacity } } } contentItem: Item { id: content property D.Palette backgroundColor: DS.Style.scrollBar.background property D.Palette insideBorderColor: DS.Style.scrollBar.insideBorder property D.Palette outsideBorderColor: DS.Style.scrollBar.outsideBorder implicitWidth: DS.Style.scrollBar.width implicitHeight: implicitWidth Rectangle { id: backgroundRect anchors.fill: parent radius: control.orientation == Qt.Horizontal ? control.height / 2 : control.width / 2 color: content.D.ColorSelector.backgroundColor } InsideBoxBorder { anchors.fill: backgroundRect radius: backgroundRect.radius color: content.D.ColorSelector.insideBorderColor borderWidth: DS.Style.control.borderWidth } OutsideBoxBorder { anchors.fill: backgroundRect radius: backgroundRect.radius color: content.D.ColorSelector.outsideBorderColor borderWidth: DS.Style.control.borderWidth } } } dtkdeclarative-5.7.12/qt6/src/qml/ScrollIndicator.qml000066400000000000000000000002771476226662700225240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T T.ScrollIndicator { } dtkdeclarative-5.7.12/qt6/src/qml/ScrollView.qml000066400000000000000000000002431476226662700215130ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls ScrollView { } dtkdeclarative-5.7.12/qt6/src/qml/SearchEdit.qml000066400000000000000000000064121476226662700214410ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS LineEdit { id: control property alias placeholder: centerIndicatorLabel.text property bool editting: control.activeFocus || (text.length !== 0) leftPadding: (editting) ? searchIcon.width + DS.Style.searchEdit.iconLeftMargin + DS.Style.searchEdit.iconRightMargin : 0 // The search background will be hidden in the focus state, // no text input and displayed in the non focus state. Item { id: searchBackground anchors.fill: parent RowLayout { id: centerIndicator spacing: DS.Style.control.spacing // Search Icon D.DciIcon { id: searchIcon name: "action_search" sourceSize: Qt.size(DS.Style.searchEdit.iconSize, DS.Style.searchEdit.iconSize) palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } Text { id: centerIndicatorLabel text: qsTr("Search") font: control.font verticalAlignment: Text.AlignVCenter } } MouseArea { anchors.fill: parent visible: !editting onClicked: function(mouse) { control.forceActiveFocus(Qt.MouseFocusReason) mouse.accepted = false } } state: "NONEDIT" states: [ State { name: "EDITTING" when: editting AnchorChanges { target: centerIndicator anchors.left: searchBackground.left anchors.verticalCenter: searchBackground.verticalCenter } PropertyChanges { target: centerIndicator anchors.leftMargin: DS.Style.searchEdit.iconLeftMargin } PropertyChanges { target: centerIndicatorLabel color: "transparent" } }, State { name: "NONEDIT" when: !editting AnchorChanges { target: centerIndicator anchors.horizontalCenter: searchBackground.horizontalCenter anchors.verticalCenter: searchBackground.verticalCenter } PropertyChanges { target: centerIndicatorLabel color: control.placeholderTextColor } } ] transitions: Transition { AnchorAnimation { duration: DS.Style.searchEdit.animationDuration easing.type: Easing.OutCubic } ColorAnimation { duration: DS.Style.searchEdit.animationDuration easing.type: Easing.OutCubic } } } } dtkdeclarative-5.7.12/qt6/src/qml/Slider.qml000066400000000000000000000125601476226662700206510ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Shapes import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.Slider { id: control enum HandleType { NoArrowHorizontal = 0, NoArrowVertical = 1, ArrowUp = 2, ArrowLeft = 3, ArrowBottom = 4, ArrowRight = 5 } property D.Palette grooveColor: DS.Style.slider.groove.background property alias handleType: __handle.type property real dashOffset: 0.0 property var dashPattern: [0.5, 0.25] property bool highlightedPassedGroove: false implicitWidth: Math.max(background ? background.implicitWidth : 0, (handle ? handle.implicitWidth : 0) + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, (handle ? handle.implicitHeight : 0) + topPadding + bottomPadding) opacity: control.D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 // draw handle handle: SliderHandle { id: __handle x: control.leftPadding + (control.horizontal ? control.visualPosition * (control.availableWidth - width) : 0) y: control.topPadding + (control.horizontal ? 0 : control.visualPosition * (control.availableHeight - height)) width: control.horizontal ? DS.Style.slider.handle.width : DS.Style.slider.handle.height height: control.horizontal ? DS.Style.slider.handle.height : DS.Style.slider.handle.width palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme Loader { anchors.fill: parent active: control.visualFocus sourceComponent: FocusBoxBorder {} } } // draw panel background: Item { anchors { horizontalCenter: !control.horizontal ? control.handle.horizontalCenter : undefined verticalCenter: control.horizontal ? control.handle.verticalCenter : undefined } implicitWidth: control.horizontal ? DS.Style.slider.width : handle.width implicitHeight: control.horizontal ? handle.height : DS.Style.slider.height // draw groove Item { id: sliderGroove x: control.horizontal ? 0 : (parent.width - width) / 2 y: control.horizontal ? (parent.height - height) / 2 : 0 width: control.horizontal ? parent.width : DS.Style.slider.groove.height height: control.horizontal ? DS.Style.slider.groove.height : parent.height Shape { ShapePath { capStyle: ShapePath.FlatCap strokeStyle: ShapePath.DashLine strokeColor: control.D.ColorSelector.grooveColor strokeWidth: control.horizontal ? sliderGroove.height : sliderGroove.width dashOffset: control.dashOffset dashPattern: control.dashPattern startX: control.horizontal ? 0 : sliderGroove.width / 2 startY: control.horizontal ? sliderGroove.height / 2 : 0 PathLine { x: control.horizontal ? sliderGroove.width : sliderGroove.width / 2 y: control.horizontal ? sliderGroove.height / 2 : sliderGroove.height } } } // draw passed groove area Loader { active: highlightedPassedGroove sourceComponent: Shape { ShapePath { capStyle: ShapePath.FlatCap strokeStyle: ShapePath.DashLine strokeColor: control.palette.highlight strokeWidth: control.horizontal ? sliderGroove.height : sliderGroove.width dashOffset: control.dashOffset dashPattern: control.dashPattern startX: control.horizontal ? 0 : sliderGroove.width / 2 startY: control.horizontal ? sliderGroove.height / 2 : sliderGroove.height PathLine { x: control.horizontal ? control.handle.x : sliderGroove.width / 2 y: control.horizontal ? sliderGroove.height / 2 : control.handle.y + control.handle.height / 2 } } Item { id: passItem y: control.horizontal ? -DS.Style.slider.groove.height / 2 : control.handle.y + control.handle.height / 2 height: control.horizontal ? DS.Style.slider.groove.height : sliderGroove.height - control.handle.y - control.handle.height / 2 width: control.horizontal ? control.handle.x : DS.Style.slider.groove.height } BoxShadow { anchors.fill: passItem shadowBlur: 4 shadowOffsetY: 2 shadowColor: control.palette.highlight rotation: control.horizontal ? 0 : 180 opacity: 0.25 } } } } } } dtkdeclarative-5.7.12/qt6/src/qml/SliderHandle.qml000066400000000000000000000020211476226662700217540ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D D.DciIcon { id: control property int type: Slider.HandleType.NoArrowHorizontal function getIconNameByType(handleType) { switch(handleType) { case Slider.HandleType.NoArrowHorizontal: return "slider_round_hor" case Slider.HandleType.NoArrowVertical: return "slider_round_ver" case Slider.HandleType.ArrowUp: return "slider_point_up" case Slider.HandleType.ArrowBottom: return "slider_point_down" case Slider.HandleType.ArrowLeft: return "slider_point_left" case Slider.HandleType.ArrowRight: return "slider_point_left" } } sourceSize.width: control.width sourceSize.height: control.height name: getIconNameByType(type) mirror: Slider.HandleType.ArrowRight === control.type fallbackToQIcon: false } dtkdeclarative-5.7.12/qt6/src/qml/SliderTipItem.qml000066400000000000000000000067121476226662700221470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { id: control property string text property int textHorizontalAlignment: Text.AlignHCenter readonly property int direction: parent.parent.tickDirection readonly property bool horizontal: parent.parent.children[0].horizontal property bool highlight property D.Palette tickColor: DS.Style.slider.tick.background property D.Palette textColor: highlight ? DS.Style.checkedButton.text: DS.Style.button.text implicitWidth: horizontal ? DS.Style.slider.tick.width : __rect.width + __label.width implicitHeight: horizontal ? __rect.height + __label.height: DS.Style.slider.tick.width Rectangle { id: __rect anchors.bottom: horizontal ? (TipsSlider.TickDirection.Front === direction ? parent.bottom : undefined) : undefined anchors.right: horizontal ? undefined : (TipsSlider.TickDirection.Front === direction ? parent.right : undefined) anchors.left: horizontal ? undefined : (TipsSlider.TickDirection.Back === direction ? parent.left : undefined) width: horizontal ? DS.Style.slider.tick.width : DS.Style.slider.tick.height height: horizontal ? DS.Style.slider.tick.height : DS.Style.slider.tick.width color: control.D.ColorSelector.tickColor } Loader { id: __label active: text.length !== 0 anchors { top: horizontal ? (TipsSlider.TickDirection.Back === direction ? __rect.bottom : undefined) : undefined topMargin: horizontal && (TipsSlider.TickDirection.Back === direction) ? DS.Style.slider.tick.vPadding : undefined bottom: horizontal ? (TipsSlider.TickDirection.Front === direction ? __rect.top : undefined) : undefined bottomMargin: horizontal && (TipsSlider.TickDirection.Front === direction) ? DS.Style.slider.tick.vPadding : undefined left: horizontal ? (Text.AlignLeft === textHorizontalAlignment ? __rect.left : undefined) : (TipsSlider.TickDirection.Back === direction ? __rect.right : undefined) leftMargin: !horizontal && TipsSlider.TickDirection.Back === direction ? DS.Style.slider.tick.hPadding : undefined right: horizontal ? (Text.AlignRight === textHorizontalAlignment ? __rect.right : undefined) : (TipsSlider.TickDirection.Front === direction ? __rect.left : undefined) rightMargin: !horizontal && TipsSlider.TickDirection.Front === direction ? DS.Style.slider.tick.hPadding : undefined horizontalCenter: horizontal && Text.AlignHCenter === textHorizontalAlignment ? __rect.horizontalCenter : undefined verticalCenter: horizontal ? undefined : __rect.verticalCenter } sourceComponent: Label { text: control.text rightPadding: highlight ? DS.Style.slider.tick.hPadding : 0 leftPadding: rightPadding topPadding: highlight ? DS.Style.slider.tick.vPadding : 0 bottomPadding: topPadding horizontalAlignment: textHorizontalAlignment verticalAlignment: Text.AlignVCenter palette.windowText: control.D.ColorSelector.textColor background: Loader { active: highlight sourceComponent: HighlightPanel { } } } } } dtkdeclarative-5.7.12/qt6/src/qml/SortFilterModel.qml000066400000000000000000000027561476226662700225130ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQml.Models 2.11 DelegateModel { id: delegateModel property var lessThan: function(left, right) { return true; } property var filterAcceptsItem: function(item) { return true; } property alias visibleGroup: visibleItems function update() { if (items.count > 0) { items.setGroups(0, items.count, "items"); } // Step 1: Filter items var visible = []; for (var i = 0; i < items.count; ++i) { var item = items.get(i); if (filterAcceptsItem(item.model)) { visible.push(item); } } // Step 2: Sort the list of visible items if (lessThan) { visible.sort(function(a, b) { return lessThan(a.model, b.model) ? -1 : 1; }); } // Step 3: Add all items to the visible group: for (i = 0; i < visible.length; ++i) { item = visible[i]; item.inVisible = true; if (item.visibleIndex !== i) { visibleItems.move(item.visibleIndex, i, 1); } } } items.onChanged: update() onLessThanChanged: update() onFilterAcceptsItemChanged: update() groups: DelegateModelGroup { id: visibleItems name: "visible" includeByDefault: false } filterOnGroup: "visible" } dtkdeclarative-5.7.12/qt6/src/qml/SpinBox.qml000066400000000000000000000062641476226662700210150ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk.style 1.0 as DS T.SpinBox { id: control // alert control properties property alias alertText: panel.alertText property alias alertDuration: panel.alertDuration property alias showAlert: panel.showAlert implicitWidth: { var content = control.implicitContentWidth !== undefined ? control.implicitContentWidth : (control.contentItem ? control.contentItem.implicitWidth : 0) content += 2 * control.padding + (up.indicator ? up.indicator.implicitWidth : 0) + (down.indicator ? down.indicator.implicitWidth : 0) return Math.max(DS.Style.control.backgroundImplicitWidth(control), content) } implicitHeight: Math.max(DS.Style.control.implicitHeight(control), up.indicator ? up.indicator.implicitHeight : 0, down.indicator ? down.indicator.implicitHeight : 0) baselineOffset: contentItem.y + contentItem.baselineOffset padding: 0 rightPadding: padding + ((down.indicator ? (down.indicator.width + DS.Style.spinBox.spacing) : (up.indicator ? (up.indicator.width + DS.Style.spinBox.spacing) : 0))) validator: IntValidator { locale: control.locale.name bottom: Math.min(control.from, control.to) top: Math.max(control.from, control.to) } background: EditPanel { id: panel control: control implicitWidth: DS.Style.spinBox.width implicitHeight: DS.Style.spinBox.height } contentItem: TextInput { text: control.displayText font: control.font color: control.palette.text selectionColor: control.palette.highlight selectedTextColor: control.palette.highlightedText horizontalAlignment: Qt.AlignLeft verticalAlignment: Qt.AlignVCenter leftPadding: DS.Style.spinBox.spacing readOnly: !control.editable validator: control.validator inputMethodHints: control.inputMethodHints selectByMouse: control.editable } up.indicator: SpinBoxIndicator { anchors { right: control.right rightMargin: DS.Style.spinBox.indicatorSpacing top: control.top topMargin: control.height / 2 - (down.indicator ? height : height / 2) } direction: SpinBoxIndicator.IndicatorDirection.UpIndicator singleIndicator: down.indicator pressed: up.pressed spinBox: control } down.indicator: SpinBoxIndicator { anchors { right: control.right rightMargin: DS.Style.spinBox.indicatorSpacing bottom: control.bottom bottomMargin: control.height / 2 - (up.indicator ? height : height / 2) } direction: SpinBoxIndicator.IndicatorDirection.DownIndicator singleIndicator: up.indicator pressed: down.pressed spinBox: control } } dtkdeclarative-5.7.12/qt6/src/qml/SpinBoxIndicator.qml000066400000000000000000000100161476226662700226400ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.private as P Control { id: control enum IndicatorDirection { UpIndicator = 0, DownIndicator = 1 } property Item spinBox property bool pressed property bool singleIndicator: false property int direction property D.Palette inactiveBackgroundColor: DS.Style.spinBox.indicator.background palette.windowText: control.D.ColorSelector.inactiveBackgroundColor hoverEnabled: true implicitWidth: DS.Style.spinBox.indicator.width implicitHeight: spinBox.activeFocus ? spinBox.implicitHeight / 2 : DS.Style.spinBox.indicator.height opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 Component { id: inactiveComponent D.DciIcon { id: icon sourceSize.width: DS.Style.spinBox.indicator.iconSize palette: D.DTK.makeIconPalette(control.palette) name: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? "entry_spinbox_up" : "entry_spinbox_down" mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false } } Component { id: activeComponent Item { Item { id: btnBackground width: parent.width + DS.Style.control.radius height: parent.height + DS.Style.control.radius anchors { right: parent.right top: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? parent.top : undefined bottom: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? undefined : parent.bottom } Button { id: btn anchors { right: parent.right top: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? parent.top : undefined bottom: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? undefined : parent.bottom } width: DS.Style.spinBox.indicatorWidth height: spinBox.implicitHeight / 2 icon { name: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? "arrow_ordinary_up" : "arrow_ordinary_down" width: DS.Style.spinBox.indicator.focusIconSize height: DS.Style.spinBox.indicator.focusIconSize } activeFocusOnTab: false opacity: 1 background: P.ButtonPanel { button: btn radius: 0 } onClicked: { if (direction === SpinBoxIndicator.IndicatorDirection.UpIndicator) { spinBox.increase() } else { spinBox.decrease() } } } } D.ItemViewport { id: viewport sourceItem: btnBackground radius: DS.Style.control.radius fixed: true width: btnBackground.width height: btnBackground.height anchors { right: parent.right top: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? parent.top : undefined bottom: direction === SpinBoxIndicator.IndicatorDirection.UpIndicator ? undefined : parent.bottom } hideSource: true } } } Loader { anchors.fill: parent sourceComponent: spinBox.activeFocus ? activeComponent : inactiveComponent } } dtkdeclarative-5.7.12/qt6/src/qml/StackView.qml000066400000000000000000000052621476226662700213300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk.style 1.0 as DS T.StackView { id: control popEnter: Transition { // slide_in_left NumberAnimation { property: "x"; from: (control.mirrored ? -0.5 : 0.5) * -control.width; to: 0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } } popExit: Transition { // slide_out_right NumberAnimation { property: "x"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * control.width; duration: DS.Style.stackView.animationDuration; easing.type: Easing.OutCubic } NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } } pushEnter: Transition { // slide_in_right NumberAnimation { property: "x"; from: (control.mirrored ? -0.5 : 0.5) * control.width; to: 0; duration: DS.Style.stackView.animationDuration; easing.type: Easing.OutCubic } NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } } pushExit: Transition { // slide_out_left NumberAnimation { property: "x"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * -control.width; duration: DS.Style.stackView.animationDuration; easing.type: Easing.OutCubic } NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } } replaceEnter: Transition { // slide_in_right NumberAnimation { property: "x"; from: (control.mirrored ? -0.5 : 0.5) * control.width; to: 0; duration: DS.Style.stackView.animationDuration; easing.type: Easing.OutCubic } NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } } replaceExit: Transition { // slide_out_left NumberAnimation { property: "x"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * -control.width; duration: DS.Style.stackView.animationDuration; easing.type: Easing.OutCubic } NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: DS.Style.stackView.animationDuration; easing.type: DS.Style.stackView.animationEasingType } } } dtkdeclarative-5.7.12/qt6/src/qml/StyledArrowShapeWindow.qml000066400000000000000000000011751476226662700240570ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS ArrowShapeWindow { property alias control: blur.control D.DWindow.borderColor: DS.Style.control.selectColor((control ? control.palette.window : undefined), DS.Style.arrowRectangleBlur.borderColor, DS.Style.arrowRectangleBlur.darkBorderColor) StyledBehindWindowBlur { id: blur anchors.fill: parent } } dtkdeclarative-5.7.12/qt6/src/qml/StyledBehindWindowBlur.qml000066400000000000000000000015071476226662700240210ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS D.BehindWindowBlur { // maybe is a ApplicationWindow or Control property var control blendColor: { if (valid) { return DS.Style.control.selectColor(control ? control.palette.window :undefined, DS.Style.behindWindowBlur.lightColor, DS.Style.behindWindowBlur.darkColor) } return DS.Style.control.selectColor(control ? control.palette.window :undefined, DS.Style.behindWindowBlur.lightNoBlurColor, DS.Style.behindWindowBlur.darkNoBlurColor) } } dtkdeclarative-5.7.12/qt6/src/qml/SwipeDelegate.qml000066400000000000000000000002461476226662700221470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls SwipeDelegate { } dtkdeclarative-5.7.12/qt6/src/qml/SwipeView.qml000066400000000000000000000002421476226662700213430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls SwipeView { } dtkdeclarative-5.7.12/qt6/src/qml/Switch.qml000066400000000000000000000120321476226662700206620ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.Switch { id: control property D.Palette backgroundColor: DS.Style.switchButton.background property D.Palette handleColor: DS.Style.switchButton.handle implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) baselineOffset: contentItem.y + contentItem.baselineOffset topPadding: DS.Style.control.vPadding bottomPadding: DS.Style.control.vPadding spacing: DS.Style.control.spacing D.ColorSelector.hovered: !D.DTK.hasAnimation // disable hover ==> normal animation indicator: Loader { sourceComponent: D.DTK.hasAnimation ? animationIndicatorComp : staticIndicatorComp Component { id: staticIndicatorComp Rectangle { implicitWidth: DS.Style.switchButton.indicatorWidth implicitHeight: DS.Style.switchButton.indicatorHeight x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2 y: control.topPadding + (control.availableHeight - height) / 2 radius: DS.Style.control.radius color: control.D.ColorSelector.backgroundColor opacity: control.D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 D.DciIcon { x: Math.max(0, Math.min(parent.width - width, control.visualPosition * parent.width - (width / 2))) y: (parent.height - height) / 2 width: DS.Style.switchButton.handleWidth height: DS.Style.switchButton.handleHeight sourceSize: Qt.size(DS.Style.switchButton.handleWidth, DS.Style.switchButton.handleHeight) name: DS.Style.switchButton.iconName opacity: control.D.ColorSelector.controlState === D.DTK.DisabledState && control.checked ? 0.4 : 1 palette { highlight: control.checked ? control.palette.highlight : control.D.ColorSelector.handleColor highlightForeground: control.palette.highlightedText foreground: control.palette.windowText background: control.palette.window } mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false Behavior on x { enabled: !control.down SmoothedAnimation { velocity: 200 } } } } } Component { id: animationIndicatorComp D.DciIcon { id: switchIcon implicitWidth: DS.Style.switchButton.indicatorWidth implicitHeight: DS.Style.switchButton.indicatorHeight x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2 y: control.topPadding + (control.availableHeight - height) / 2 sourceSize: Qt.size(DS.Style.switchButton.indicatorWidth, DS.Style.switchButton.indicatorWidth) opacity: control.D.ColorSelector.controlState === D.DTK.DisabledState && control.checked ? 0.4 : 1 palette: DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme fallbackToQIcon: false Component.onCompleted: switchIcon.updateName() function updateName() { name = !control.checked ? "switch_on" : "switch_off" } function palyAndSetImage() { switchIcon.play(D.DTK.NormalState) toggletimer.start(); } Timer { id: toggletimer interval: 500 onTriggered: { switchIcon.updateName() } } Connections { target: control function onCheckedChanged() { palyAndSetImage() } } } } } contentItem: Label { leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0 rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0 text: control.text verticalAlignment: Text.AlignVCenter } background: Loader { active: control.visualFocus sourceComponent: FocusBoxBorder {} } } dtkdeclarative-5.7.12/qt6/src/qml/TabBar.qml000066400000000000000000000002371476226662700205600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick.Controls TabBar { } dtkdeclarative-5.7.12/qt6/src/qml/TextArea.qml000066400000000000000000000034731476226662700211470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Controls.impl import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.TextArea { id: control property D.Palette placeholderTextPalette: DS.Style.edit.placeholderText placeholderTextColor: D.ColorSelector.placeholderTextPalette implicitWidth: Math.max(DS.Style.control.implicitWidth(control), placeholder.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(DS.Style.control.implicitHeight(control), placeholder.implicitHeight + topPadding + bottomPadding) padding: DS.Style.control.padding color: palette.text selectionColor: palette.highlight selectedTextColor: palette.highlightedText onEffectiveHorizontalAlignmentChanged: placeholder.effectiveHorizontalAlignmentChanged() Loader { id: placeholder active: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter) x: control.leftPadding y: control.topPadding width: control.width - (control.leftPadding + control.rightPadding) height: control.height - (control.topPadding + control.bottomPadding) signal effectiveHorizontalAlignmentChanged sourceComponent: PlaceholderText { text: control.placeholderText font: control.font color: control.placeholderTextColor verticalAlignment: control.verticalAlignment elide: Text.ElideRight renderType: control.renderType } } background: EditPanel { control: control implicitWidth: DS.Style.edit.width implicitHeight: DS.Style.edit.textAreaHeight } } dtkdeclarative-5.7.12/qt6/src/qml/TextField.qml000066400000000000000000000100401476226662700213060ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.TextField { id: control property D.Palette placeholderTextPalette: DS.Style.edit.placeholderText placeholderTextColor: D.ColorSelector.placeholderTextPalette property alias backgroundColor: panel.backgroundColor // alert control properties property alias alertText: panel.alertText property alias alertDuration: panel.alertDuration property alias showAlert: panel.showAlert implicitWidth: Math.max(DS.Style.control.implicitWidth(control), placeholderText ? placeholder.implicitWidth + leftPadding + rightPadding : 0) || contentWidth + leftPadding + rightPadding implicitHeight: Math.max(DS.Style.control.implicitHeight(control), placeholder.implicitHeight + topPadding + bottomPadding) padding: DS.Style.control.padding color: control.palette.text opacity: enabled ? 1 : 0.4 selectionColor: control.palette.highlight selectedTextColor: control.palette.highlightedText verticalAlignment: TextInput.AlignVCenter onEffectiveHorizontalAlignmentChanged: placeholder.effectiveHorizontalAlignmentChanged() // use Loader will cause placeholdertext horizontalAlignment not work // QQuickPlaceholderText will assume it's parent item is QQuickTextInput or QQuickTextInput // see QQuickPlaceholderText::updateAlignment() PlaceholderText { id: placeholder x: control.leftPadding y: control.topPadding width: control.width - (control.leftPadding + control.rightPadding) height: control.height - (control.topPadding + control.bottomPadding) text: control.placeholderText visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter) font: control.font color: control.placeholderTextColor verticalAlignment: control.verticalAlignment renderType: control.renderType } background: EditPanel { id: panel control: control implicitWidth: DS.Style.edit.width implicitHeight: DS.Style.edit.textFieldHeight } MouseArea { anchors.fill: parent acceptedButtons: Qt.RightButton onClicked: function (mouse) { var point = Qt.point(mouse.x, mouse.y) if (Window.window && Window.window.width > Screen.desktopAvailableWidth) { point.x = control.mapFromGlobal(Screen.desktopAvailableWidth - contextMenu.width).x } if (Window.window && Window.window.height > Screen.desktopAvailableHeight) { point.y = control.mapFromGlobal(0, Screen.desktopAvailableHeight - contextMenu.height).y } contextMenu.popup(point.x, point.y) } } Menu { id: contextMenu MenuItem { text: qsTr("Copy") onTriggered: control.copy() enabled: control.selectedText.length && control.echoMode === TextInput.Normal } MenuItem { text: qsTr("Cut") onTriggered: control.cut() enabled: !control.readonly && control.selectedText.length && control.echoMode === TextInput.Normal } MenuItem { text: qsTr("Paste") onTriggered: control.paste() enabled: control.canPaste } MenuItem { text: qsTr("Select All") onTriggered: control.selectAll() enabled: control.text.length } MenuItem { text: qsTr("Undo") onTriggered: control.undo() enabled: control.canUndo } MenuItem { text: qsTr("Redo") onTriggered: control.redo() enabled: control.canRedo } } } dtkdeclarative-5.7.12/qt6/src/qml/ThemeMenu.qml000066400000000000000000000022211476226662700213070ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D Menu { id: control title: qsTr("Theme") readonly property bool __checkedUnknowType : D.ApplicationHelper.paletteType === D.ApplicationHelper.UnknownType ActionGroup { id: themeEG exclusive: true onTriggered: { D.ApplicationHelper.setPaletteType(action.themeType) } } Action { text: qsTr("Light Theme") readonly property int themeType: D.ApplicationHelper.LightType checked: !__checkedUnknowType && D.DTK.themeType === themeType ActionGroup.group: themeEG } Action { text: qsTr("Dark Theme") readonly property int themeType: D.ApplicationHelper.DarkType checked: !__checkedUnknowType && D.DTK.themeType === themeType ActionGroup.group: themeEG } Action { text: qsTr("System Theme") readonly property int themeType: D.ApplicationHelper.UnknownType checked: __checkedUnknowType ActionGroup.group: themeEG } } dtkdeclarative-5.7.12/qt6/src/qml/TipsSlider.qml000066400000000000000000000047361476226662700215170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { enum TickDirection { Front = 0, Back = 1 } property alias slider: __slider property alias ticks: ticksGrid.children property int tickDirection: (TipsSlider.TickDirection.Back) implicitWidth: __slider.width + (__slider.horizontal ? 0 : ticksGrid.childrenRect.width) implicitHeight: __slider.height + (__slider.horizontal ? ticksGrid.childrenRect.height : 0) Slider { id: __slider anchors { left: horizontal ? parent.left : (TipsSlider.TickDirection.Back === tickDirection ? parent.left : undefined) right: horizontal ? parent.right : (TipsSlider.TickDirection.Front === tickDirection ? parent.right : undefined) top: horizontal ? (TipsSlider.TickDirection.Back === tickDirection ? parent.top : undefined) : parent.top bottom: horizontal ? (TipsSlider.TickDirection.Front === tickDirection ? parent.bottom : undefined) : parent.bottom } } Grid { id: ticksGrid rows: __slider.horizontal ? 0 : children.length columns: __slider.horizontal ? children.length : 0 anchors { left: __slider.horizontal ? parent.left : (TipsSlider.TickDirection.Back === tickDirection ? __slider.right : undefined) right: __slider.horizontal ? parent.right : (TipsSlider.TickDirection.Front === tickDirection ? __slider.left : undefined) leftMargin: __slider.horizontal ? __slider.handle.width / 2 : 0 rightMargin: __slider.horizontal ? __slider.handle.width / 2 : 0 top: __slider.horizontal ? (TipsSlider.TickDirection.Back === tickDirection ? __slider.bottom : undefined) : __slider.top bottom: __slider.horizontal ? (TipsSlider.TickDirection.Front === tickDirection ? __slider.top : undefined) : __slider.bottom topMargin: __slider.horizontal ? 0 : __slider.handle.height / 2 bottomMargin: __slider.horizontal ? 0 : __slider.handle.height / 2 } spacing: ticks.length > 1 ? (__slider.horizontal ? (parent.width - __slider.handle.width - DS.Style.slider.tick.width * ticks.length) :(parent.height - __slider.handle.height - DS.Style.slider.tick.width * ticks.length)) / (ticks.length - 1) : 0 } } dtkdeclarative-5.7.12/qt6/src/qml/TitleBar.qml000066400000000000000000000156561476226662700211460ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Window import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Item { id: control z: D.DTK.TopOrder width: Window.window.width // it's binding `height` instead of `visible` property, // because MouseArea should accept event keeping visible. implicitHeight: (!__isFullScreen || __isVisible) ? DS.Style.titleBar.height : 1 property string title: Window.window.title property alias icon: iconLabel // custom control property alias leftContent: customLeft.sourceComponent property alias content: customCenter.sourceComponent // menu access property alias menu: optionMenuLoader.sourceComponent property bool menuDisabled property Component aboutDialog // visibility access property bool fullScreenButtonVisible: true signal toggleWindowState() property alias windowButtonGroup: windowButtonsLoader.sourceComponent property bool autoHideOnFullscreen: false property bool embedMode: !__dwindow.enabled property bool separatorVisible: true property var __dwindow: Window.window.D.DWindow property bool __isFullScreen: Window.window.visibility === Window.FullScreen property bool __isVisible: hoverHandler.hovered readonly property int __includedAreaX: control.width - optionMenuBtn.width - windowButtonsLoader.width property alias enableInWindowBlendBlur: background.active // Control's property property alias background: background.sourceComponent property alias hovered: hoverHandler.hovered property alias hoverEnabled: hoverHandler.enabled property D.Palette textColor: DS.Style.button.text palette.windowText: D.ColorSelector.textColor HoverHandler { id: hoverHandler // reset it's parent to disable HoverHandler parent: __isFullScreen && autoHideOnFullscreen ? control : null } TapHandler { acceptedButtons: Qt.RightButton | Qt.LeftButton onDoubleTapped: function (eventPoint, button) { if (button === Qt.LeftButton) { control.toggleWindowState() } } onTapped: function (eventPoint, button) { if (button === Qt.RightButton) { if (eventPoint.position.x < __includedAreaX) { __dwindow.popupSystemWindowMenu() } } } } Loader { id: background active: false anchors.fill: parent sourceComponent: D.InWindowBlur { } } ColumnLayout { id: content spacing: 0 anchors.fill: parent visible: control.height > 1 Loader { active: embedMode visible: embedMode sourceComponent: Rectangle { Layout.preferredWidth: control.width Layout.preferredHeight: 1 visible: embedMode color: "transparent" } } RowLayout { spacing: 0 Layout.alignment: Qt.AlignHCenter Layout.fillHeight: true Layout.fillWidth: true Layout.leftMargin: DS.Style.titleBar.leftMargin D.DciIcon { id: iconLabel sourceSize { width: DS.Style.titleBar.iconSize height: DS.Style.titleBar.iconSize } Layout.alignment: Qt.AlignLeft Layout.leftMargin: 2 visible: name palette: D.DTK.makeIconPalette(control.palette) mode: control.D.ColorSelector.controlState theme: control.D.ColorSelector.controlTheme } // left custom area Loader { id: customLeft } // center custom area Loader { id: customCenter Layout.leftMargin: (optionMenuBtn.width + windowButtonsLoader.width - iconLabel.width - customLeft.width) Layout.fillWidth: true sourceComponent: titleCenterCom } // option button, it maybe load other Button in different scene. WindowButton { id: optionMenuBtn icon.name: "window_menu" textColor: control.textColor enabled: !menuDisabled Layout.alignment: Qt.AlignRight onClicked: { if (optionMenuLoader.item && optionMenuLoader.item.visible) { optionMenuLoader.item.close() } else { var pos = Qt.point(optionMenuLoader.x, control.height) optionMenuLoader.item.popup(optionMenuBtn, pos) } } Loader { id: optionMenuLoader sourceComponent: Menu { ThemeMenu { } MenuSeparator { } HelpAction { } AboutAction { aboutDialog: control.aboutDialog } QuitAction { } } onLoaded: item.closePolicy = item.closePolicy | Popup.CloseOnPressOutsideParent } } Loader { id: windowButtonsLoader Layout.fillHeight: true sourceComponent: WindowButtonGroup { Layout.alignment: Qt.AlignRight Layout.fillHeight: true embedMode: control.embedMode textColor: control.textColor fullScreenButtonVisible: control.fullScreenButtonVisible Component.onCompleted: { control.toggleWindowState.connect(maxOrWinded) } } } } Loader { active: separatorVisible visible: active sourceComponent: Rectangle { Layout.preferredWidth: control.width Layout.preferredHeight: 1 color: "transparent" Layout.alignment: Qt.AlignBottom } } } Component { id: titleCenterCom Loader { property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowTitleHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowTitleHint) active: hasWindowFlag && !embedMode && (__dwindow.motifDecorations & D.WindowManagerHelper.DECOR_TITLE) visible: active sourceComponent: Label { textFormat: Text.PlainText text: control.title horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } } } } dtkdeclarative-5.7.12/qt6/src/qml/ToolButton.qml000066400000000000000000000103761476226662700215430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2024 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.private 1.0 as P T.ToolButton { id: control property D.Palette textColor: { if (D.DTK.hasAnimation) return checked ? DS.Style.highlightedButton.text : (highlighted ? DS.Style.highlightedButton.text : DS.Style.button.text) return checked ? DS.Style.checkedButton.text : (highlighted ? DS.Style.highlightedButton.text : DS.Style.button.text) } implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) topPadding: DS.Style.button.vPadding bottomPadding: DS.Style.button.vPadding leftPadding: DS.Style.button.hPadding rightPadding: DS.Style.button.hPadding spacing: DS.Style.control.spacing opacity: D.ColorSelector.controlState === D.DTK.DisabledState ? 0.4 : 1 D.DciIcon.mode: D.ColorSelector.controlState D.DciIcon.theme: D.ColorSelector.controlTheme D.DciIcon.palette: D.DTK.makeIconPalette(palette) palette.windowText: D.ColorSelector.textColor D.ColorSelector.family: D.Palette.CrystalColor display: D.IconLabel.TextUnderIcon font: icon.name ? D.DTK.fontManager.t10: undefined flat: true icon { width: DS.Style.toolButton.iconSize height: DS.Style.toolButton.iconSize color: D.ColorSelector.textColor } contentItem: Item { implicitWidth: content.implicitWidth + (indicator ? indicator.width : 0) implicitHeight: content.implicitHeight D.IconLabel { id: content height: parent.height width: parent.width - (indicator ? indicator.width : 0) spacing: control.spacing mirrored: control.mirrored display: control.display alignment: indicator ? Qt.AlignLeft | Qt.AlignVCenter : Qt.AlignCenter text: control.text font: control.font color: control.D.ColorSelector.textColor icon: D.DTK.makeIcon(control.icon, control.D.DciIcon) } function updateIndicatorAnchors() { if (!indicator) return indicator.anchors.verticalCenter = control.verticalCenter indicator.anchors.right = control.right indicator.anchors.rightMargin = DS.Style.toolButton.indicatorRightMargin } Component.onCompleted: { updateIndicatorAnchors() control.indicatorChanged.connect(updateIndicatorAnchors) } } states: [ State { name: "normal" when: !control.hovered && !control.checked && D.DTK.hasAnimation PropertyChanges { target: background scale : 0.9 } }, State { name: "hovered" when: control.hovered && !control.checked && D.DTK.hasAnimation PropertyChanges { target: contentItem scale : 1.1 } PropertyChanges { target: background scale : 1.0 } }, State { name: "checked" when: control.checked && D.DTK.hasAnimation PropertyChanges { target: contentItem scale : 1.0 } } ] transitions: Transition { NumberAnimation { properties: "scale"; easing.type: Easing.InOutQuad } } background: P.ButtonPanel { id: buttonPanel implicitWidth: DS.Style.toolButton.width implicitHeight: DS.Style.toolButton.height button: control outsideBorderColor: null Binding on color1 { when: D.DTK.hasAnimation value: D.Palette { normal { common: Qt.rgba(0, 0, 0, 0.1) } } } Binding on color2 { when: D.DTK.hasAnimation value: buttonPanel.color1 } Binding on visible { when: D.DTK.hasAnimation value: control.hovered && !control.checked } } } dtkdeclarative-5.7.12/qt6/src/qml/ToolTip.qml000066400000000000000000000022341476226662700210160ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Templates as T import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS T.ToolTip { id: control x: parent ? (parent.width - implicitWidth) / 2 : 0 y: -implicitHeight - 3 implicitWidth: DS.Style.control.implicitWidth(control) implicitHeight: DS.Style.control.implicitHeight(control) topPadding: DS.Style.toolTip.verticalPadding bottomPadding: topPadding leftPadding: DS.Style.toolTip.horizontalPadding rightPadding: leftPadding closePolicy: T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent | T.Popup.CloseOnReleaseOutsideParent contentItem: Text { horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter text: control.text font: control.font wrapMode: Text.Wrap opacity: enabled ? 1.0 : 0.4 color: control.palette.toolTipText } background: FloatingPanel { implicitWidth: 0 implicitHeight: DS.Style.toolTip.height radius: DS.Style.control.radius } } dtkdeclarative-5.7.12/qt6/src/qml/WarningButton.qml000066400000000000000000000004351476226662700222260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Button { id: control textColor: DS.Style.warningButton.text } dtkdeclarative-5.7.12/qt6/src/qml/WaterProgressBar.qml000066400000000000000000000070031476226662700226570ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS Control { id: control property int value /*0~100*/ property bool running: false property D.Palette backgroundColor1: DS.Style.waterProgressBar.background1 property D.Palette backgroundColor2: DS.Style.waterProgressBar.background2 property D.Palette dropShadowColor: DS.Style.waterProgressBar.dropShadow property D.Palette popBackgroundColor: DS.Style.waterProgressBar.popBackground property D.Palette textColor: DS.Style.waterProgressBar.textColor background: BoxShadow { implicitWidth: DS.Style.waterProgressBar.width implicitHeight: DS.Style.waterProgressBar.height shadowColor: control.D.ColorSelector.dropShadowColor shadowOffsetY: 6 shadowBlur: 6 cornerRadius: width / 2 Rectangle { anchors.fill: parent radius: parent.cornerRadius gradient: Gradient { GradientStop { position: 0.0; color: control.D.ColorSelector.backgroundColor1 } GradientStop { position: 1; color: control.D.ColorSelector.backgroundColor2 } } } } contentItem: Item { Item { id: content anchors.fill: parent D.WaterProgressAttribute { id: attribute running: control.running && control.value > 0 waterProgress: control imageWidth: 5 * control.width imageHeight: 1.1 * control.height } Repeater { model: 4 Image { readonly property real xoffset: index < 2 ? attribute.backXOffset : attribute.frontXOffset retainWhileLoading: true source: index < 2 ? DS.Style.waterProgressBar.waterBackImagePath : DS.Style.waterProgressBar.waterFrontImagePath x: index % 2 ? xoffset - width : xoffset y: (90 - control.value) * control.height / 100 width: attribute.imageWidth height: attribute.imageHeight sourceSize { width: attribute.imageWidth height: attribute.imageHeight } } } Repeater { model: attribute.pops Loader { x: model.x y: model.y width: model.width height: model.height active: control.value > 30 visible: active sourceComponent: Rectangle { color: control.D.ColorSelector.popBackgroundColor radius: width / 2 } } } Text { anchors.centerIn: parent text: control.value horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter font { pixelSize: control.height * 0.4 } color: control.D.ColorSelector.textColor } } D.ItemViewport { anchors.fill: parent sourceItem: content hideSource: true radius: width / 2 } } } dtkdeclarative-5.7.12/qt6/src/qml/WindowButton.qml000066400000000000000000000033111476226662700220640ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS D.IconButton { id: control property int topRightRadius: (Window.window.visibility !== Window.Maximized && Window.window.visibility !== Window.FullScreen && isOnRightEdgeOfWindow) ? D.DTK.platformTheme.windowRadius : 0 readonly property bool isOnRightEdgeOfWindow: __itemGlobalPoint.x + control.width >= Window.window.width readonly property var __itemGlobalPoint: { var a = control var x = 0, y = 0 while(a.parent) { x += a.x y += a.y a = a.parent } return Qt.point(x, y) } topPadding: 0 bottomPadding: 0 leftPadding: 0 rightPadding: 0 icon { width: DS.Style.windowButton.width height: DS.Style.windowButton.height } background: D.BoxPanel { implicitWidth: DS.Style.windowButton.width implicitHeight: DS.Style.windowButton.height insideBorderColor: null outsideBorderColor: null color1: DS.Style.windowButton.background color2: color1 radius: 0 Loader { anchors.fill: parent active: control.visualFocus sourceComponent: Rectangle { topRightRadius: control.topRightRadius color: "transparent" border { width: DS.Style.control.focusBorderWidth color: control.palette.highlight } } } } } dtkdeclarative-5.7.12/qt6/src/qml/WindowButtonGroup.qml000066400000000000000000000075611476226662700231140ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Window import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS RowLayout { id: control spacing: 0 property D.Palette textColor: DS.Style.button.text property bool fullScreenButtonVisible: true property bool embedMode: false signal maxOrWinded() property var __dwindow: Window.window.D.DWindow property bool __forceHind: !__dwindow.enabled || embedMode || Window.window.visibility === Window.FullScreen onMaxOrWinded: { if (!(__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MAXIMIZE)) { return } if (Window.window.visibility === Window.Maximized) { __dwindow.showNormal() } else if (Window.window.visibility !== Window.FullScreen && maxOrWindedBtn.active) { __dwindow.showMaximized() } } Loader { objectName: "minimizeBtn" property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowMinimizeButtonHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowMinimizeButtonHint) active: hasWindowFlag && !__forceHind visible: active enabled: (__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MINIMIZE) sourceComponent: WindowButton { icon.name: "window_minimize" textColor: control.textColor onClicked:{ __dwindow.showMinimized() } } } Loader { objectName: "quitFullBtn" active: !(!control.fullScreenButtonVisible || !__dwindow.enabled || Window.window.visibility !== Window.FullScreen) visible: active sourceComponent: WindowButton { icon.name: "window_quit_full" textColor: control.textColor onClicked: { if (Window.window.visibility === Window.FullScreen) { __dwindow.showNormal() } else { __dwindow.showFullScreen() } } } } Loader { id: maxOrWindedBtn; objectName: "maxOrWindedBtn" property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowMaximizeButtonHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowMaximizeButtonHint) readonly property size maxSize: Qt.size(Window.window.maximumWidth, Window.window.maximumHeight) readonly property size minSize: Qt.size(Window.window.minimumWidth, Window.window.minimumHeight) active: (hasWindowFlag && !__forceHind && (__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_RESIZE) && maxSize != minSize) visible: active enabled: ((__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_MAXIMIZE) && (__dwindow.motifFunctions & D.WindowManagerHelper.FUNC_RESIZE)) sourceComponent: WindowButton { property bool isMaximized: Window.window.visibility === Window.Maximized icon.name: isMaximized ? "window_restore" : "window_maximize" textColor: control.textColor onClicked: maxOrWinded() } } Loader { objectName: "closeBtn" property bool hasWindowFlag/*: (Window.window.flags & Qt.WindowCloseButtonHint)*/ Component.onCompleted: hasWindowFlag = (Window.window.flags & Qt.WindowCloseButtonHint) active: hasWindowFlag && __dwindow.enabled visible: active enabled: __dwindow.motifFunctions & D.WindowManagerHelper.FUNC_CLOSE sourceComponent: WindowButton { icon.name: "window_close" textColor: control.textColor onClicked: Window.window.close() } } } dtkdeclarative-5.7.12/qt6/src/qml/WindowQuitFullButton.qml000066400000000000000000000003411476226662700235520ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk.controls 1.0 Button { id: control text: "QFull" } dtkdeclarative-5.7.12/qt6/src/qml/overridable/000077500000000000000000000000001476226662700212065ustar00rootroot00000000000000dtkdeclarative-5.7.12/qt6/src/qml/overridable/InWindowBlur.qml000066400000000000000000000016521476226662700243100ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Effects import org.deepin.dtk 1.0 as D Item { id :control property bool offscreen: false property alias radius: blur.blurMax property alias multiplier: blur.blurMultiplier property alias content: blur default property alias data: blitter.data readonly property bool valid: blitter.blitterEnabled D.BackdropBlitter { id: blitter anchors.fill: parent blitterEnabled: !D.DTK.isSoftwareRender MultiEffect { id: blur visible: blitter.blitterEnabled && !control.offscreen anchors.fill: parent source: blitter.content autoPaddingEnabled: false blurEnabled: true blur: 1.0 blurMax: 64 saturation: 0.4 } } } dtkdeclarative-5.7.12/qt6/src/qml/private/000077500000000000000000000000001476226662700203625ustar00rootroot00000000000000dtkdeclarative-5.7.12/qt6/src/qml/private/ArrowListViewButton.qml000066400000000000000000000022301476226662700250470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk 1.0 Loader { enum Direction { UpButton = 0, DownButton = 1 } property Item view property int direction active: view.interactive sourceComponent: Button { flat: true enabled: direction === ArrowListViewButton.UpButton ? !view.atYBeginning : !itemsView.atYEnd width: DS.Style.arrowListView.stepButtonSize.width height: DS.Style.arrowListView.stepButtonSize.height icon.name: direction === ArrowListViewButton.UpButton ? DS.Style.arrowListView.upButtonIconName : DS.Style.arrowListView.downButtonIconName icon.width: DS.Style.arrowListView.stepButtonIconSize.width icon.height: DS.Style.arrowListView.stepButtonIconSize.height onClicked: direction === ArrowListViewButton.UpButton ? view.decrementCurrentIndex() : view.incrementCurrentIndex() } } dtkdeclarative-5.7.12/qt6/src/qml/private/ButtonPanel.qml000066400000000000000000000064231476226662700233350ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk 1.0 BoxPanel { id: control property Item button property bool enableAnimation: control.D.ColorSelector.controlState === D.DTK.HoveredState && control.D.ColorSelector.family === D.Palette.CommonColor color1: selectValue(DS.Style.button.background1, DS.Style.checkedButton.background, DS.Style.highlightedButton.background1) color2: selectValue(DS.Style.button.background2, DS.Style.checkedButton.background, DS.Style.highlightedButton.background2) insideBorderColor: selectValue(DS.Style.button.insideBorder, null, DS.Style.highlightedButton.border) outsideBorderColor: selectValue(DS.Style.button.outsideBorder, null, null) dropShadowColor: selectValue(DS.Style.button.dropShadow, DS.Style.checkedButton.dropShadow, DS.Style.highlightedButton.dropShadow) innerShadowColor1: selectValue(DS.Style.button.innerShadow1, DS.Style.checkedButton.innerShadow, DS.Style.highlightedButton.innerShadow1) innerShadowColor2: selectValue(DS.Style.button.innerShadow2, null, DS.Style.highlightedButton.innerShadow2) boxShadowBlur: selectValue(control.D.ColorSelector.controlState === D.DTK.PressedState ? 4 : 6, 6, 4) boxShadowOffsetY: selectValue(control.D.ColorSelector.controlState === D.DTK.PressedState ? 2 : 4, 4, 4) innerShadowOffsetY1: selectValue(control.D.ColorSelector.controlState === D.DTK.HoveredState ? -3 : -1, -1, -1) visible: !button.flat || button.checked || button.highlighted || button.visualFocus || control.D.ColorSelector.controlState === D.DTK.PressedState || control.D.ColorSelector.controlState === D.DTK.HoveredState function selectValue(normal, checked, highlighted) { if (button.checked) { return checked } else if ((typeof button.highlighted == "boolean") && button.highlighted) { return highlighted } return normal } Loader { anchors.fill: parent active: button.visualFocus sourceComponent: FocusBoxBorder { radius: control.radius color: button.palette.highlight } } Gradient { id: hoverBackgroundGradient GradientStop { position: 0.0; color: control.D.ColorSelector.color1 } GradientStop { position: 0.96; color: control.D.ColorSelector.color2 } } CicleSpreadAnimation { id: hoverAnimation anchors.fill: parent visible: enableAnimation Rectangle { anchors.fill: parent radius: control.radius // gradient: control.D.ColorSelector.color1 === control.D.ColorSelector.color2 ? null : hoverBackgroundGradient color: control.D.ColorSelector.color1 } function triggle() { if (button.hovered) { var pos = D.DTK.cursorPosition() hoverAnimation.centerPoint = hoverAnimation.mapFromGlobal(pos.x, pos.y) hoverAnimation.start() } else { hoverAnimation.stop() } } Component.onCompleted: { button.hoveredChanged.connect(hoverAnimation.triggle) } } } dtkdeclarative-5.7.12/qt6/src/qml/private/CMakeLists.txt000066400000000000000000000020141476226662700231170ustar00rootroot00000000000000##################################################################### ## dtkdeclarativeprivatesplugin Plugin: ##################################################################### qt_add_qml_module(dtkdeclarativeprivatesplugin PLUGIN_TARGET dtkdeclarativeprivatesplugin URI "${URI}.private" VERSION "1.0" QML_FILES "ProgressBarImpl.qml" "ProgressBarPanel.qml" "ColorOverlay.qml" "SoftwareColorOverlay.qml" "ArrowListViewButton.qml" "ButtonPanel.qml" "KeySequenceLabel.qml" OUTPUT_DIRECTORY "${PLUGIN_OUTPUT_DIR}/${URI_PATH}/private" ) dtk_extend_target(dtkdeclarativeprivatesplugin EnableCov ${ENABLE_COV}) target_link_libraries(dtkdeclarativeprivatesplugin PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Quick ) install(TARGETS dtkdeclarativeprivatesplugin DESTINATION "${QML_INSTALL_DIR}/${URI_PATH}/private") install(DIRECTORY "${PLUGIN_OUTPUT_DIR}/${URI_PATH}/private/" DESTINATION "${QML_INSTALL_DIR}/${URI_PATH}/private") dtkdeclarative-5.7.12/qt6/src/qml/private/ColorOverlay.qml000066400000000000000000000007621476226662700235220ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import Qt5Compat.GraphicalEffects /*! The Qt Graphical Effects module provides a set of QML types.The effects cover functional areas such as blending, masking, blurring, coloring, and many more. This component can only be registered during hardware rendering, and its software rendering implementation comes from dquickcoloroverlay item. */ ColorOverlay { } dtkdeclarative-5.7.12/qt6/src/qml/private/KeySequenceLabel.qml000066400000000000000000000047331476226662700242650ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk Control { id: control property string text property D.Palette textColor: DS.Style.keySequenceEdit.label.text property D.Palette backgroundColor1: DS.Style.keySequenceEdit.label.background1 property D.Palette backgroundColor2: DS.Style.keySequenceEdit.label.background2 property D.Palette shadowInnerColor1: DS.Style.keySequenceEdit.label.shadowInner1 property D.Palette shadowInnerColor2: DS.Style.keySequenceEdit.label.shadowInner2 property D.Palette shadowOuterColor: DS.Style.keySequenceEdit.label.shadowOuter leftPadding: DS.Style.keySequenceEdit.label.leftRightPadding topPadding: DS.Style.keySequenceEdit.label.topBottomPadding rightPadding: leftPadding bottomPadding: topPadding contentItem: Text { text: control.text horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter font: D.DTK.fontManager.t8 color: control.D.ColorSelector.textColor } background: Item { BoxShadow { anchors.fill: parent cornerRadius: backgroundRect.radius shadowOffsetY: 1 shadowBlur: 2 shadowColor: control.D.ColorSelector.shadowOuterColor; hollow: true } Rectangle { id: backgroundRect anchors.fill: parent radius: DS.Style.control.radius gradient: Gradient { GradientStop { position: 0.0 color: control.D.ColorSelector.backgroundColor1 } GradientStop { position: 0.98 color: control.D.ColorSelector.backgroundColor2 } } } BoxInsetShadow { anchors.fill: parent cornerRadius: backgroundRect.radius shadowOffsetY: -2 shadowBlur: 1 shadowColor: control.D.ColorSelector.shadowInnerColor1 } BoxInsetShadow { visible: D.DTK.themeType === D.ApplicationHelper.DarkType anchors.fill: parent cornerRadius: backgroundRect.radius shadowOffsetY: 1 shadowBlur: 1 shadowColor: control.D.ColorSelector.shadowInnerColor2 } } } dtkdeclarative-5.7.12/qt6/src/qml/private/OpacityMask.qml000066400000000000000000000007531476226662700233260ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import Qt5Compat.GraphicalEffects /*! The Qt Graphical Effects module provides a set of QML types.The effects cover functional areas such as blending, masking, blurring, coloring, and many more. This component can only be registered during hardware rendering, and its software rendering implementation comes from dquickopacitymask */ OpacityMask { } dtkdeclarative-5.7.12/qt6/src/qml/private/ProgressBarImpl.qml000066400000000000000000000237521476226662700241610ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Controls.impl import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk 1.0 Item { id: control property Item progressBar property string formatText property bool animationStop: false property D.Palette shadowPaletteColor: DS.Style.progressBar.shadowColor property D.Palette handleGradientColor: DS.Style.progressBar.handleGradientColor Loader { anchors.fill: parent sourceComponent: progressBar.indeterminate ? _indeterminateComponent : _valueComponent } Component { id: _valueComponent Item { BoxShadow { y: (parent.height - height) / 2 x: -y width: progressBar.height height: progressBar.visualPosition * progressBar.width shadowOffsetX: -4 shadowBlur: 6 rotation: -90 cornerRadius: DS.Style.control.radius shadowColor: control.D.ColorSelector.shadowPaletteColor visible: progressBar.visualPosition > 0 Rectangle { id: rect anchors.fill: parent radius: parent.cornerRadius property int count property real lightPosition gradient: Gradient { GradientStop { position: 0; color: progressBar.palette.highlight } GradientStop { position: rect.lightPosition; color: control.D.ColorSelector.handleGradientColor } GradientStop { position: 1; color: progressBar.palette.highlight } } Timer { id: moveTimer interval: 10 repeat: true running: rect.visible onTriggered: { moveTimer.interval = 10 if (rect.count === 100) { rect.count = 0 rect.lightPosition = 0.0 moveTimer.interval = 2000 return; } rect.count += 1 rect.lightPosition = rect.count * 0.01 } } } } ItemGroup { anchors.fill: parent ClippedText { clip: progressBar.visualPosition > 0 clipX: -progressBar.leftPadding + progressBar.visualPosition * control.width clipWidth: (1.0 - progressBar.visualPosition) * control.width text: formatText font: progressBar.font color: progressBar.palette.buttonText opacity: enabled ? 1 : 0.4 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } ClippedText { visible: progressBar.visualPosition > 0 clip: progressBar.visualPosition > 0 clipX: -progressBar.leftPadding clipWidth: progressBar.visualPosition * control.width text: formatText font: progressBar.font color: palette.highlightedText opacity: enabled ? 1 : 0.4 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } } } } Component { id: _indeterminateComponent Item { BoxShadow { id: indeterminateProgressContent property real limitWidth: (indeterminateProgressContent.height - indeterminateProgressContent.width) / 2 y: -limitWidth x: limitWidth implicitHeight: DS.Style.progressBar.indeterminateProgressBarWidth width: progressBar.height shadowOffsetX: -4 shadowBlur: 6 cornerRadius: DS.Style.control.radius shadowColor: control.D.ColorSelector.shadowPaletteColor rotation: -90 Rectangle { id: indeterminateRect anchors.fill: parent radius: indeterminateProgressContent.cornerRadius property int count property real lightPosition gradient: Gradient { GradientStop { position: 0.0; color: progressBar.palette.highlight } GradientStop { position: indeterminateRect.lightPosition; color: control.D.ColorSelector.handleGradientColor } GradientStop { position: 1.0; color: progressBar.palette.highlight } } Timer { id: indeterminateMoveTimer interval: 50 repeat: true running: indeterminateRect.visible onTriggered: { indeterminateMoveTimer.interval = 50 if (indeterminateRect.count === 100) { indeterminateRect.count = 0 indeterminateMoveTimer.interval = 2000 return; } indeterminateRect.count += 5 indeterminateRect.lightPosition = indeterminateRect.count * 0.01 } } } SequentialAnimation { id: indeterminateAnimation running: progressBar.indeterminate && !control.animationStop loops: Animation.Infinite NumberAnimation { target: indeterminateProgressContent property: "x" from: -indeterminateProgressContent.y to: progressBar.width - indeterminateProgressContent.limitWidth - indeterminateProgressContent.width duration: DS.Style.progressBar.indeterminateProgressBarAnimationDuration * progressBar.width / DS.Style.progressBar.width onFromChanged: if (!delayAnimationTimer.running) delayAnimationTimer.start() onToChanged: if (!delayAnimationTimer.running) delayAnimationTimer.start() } NumberAnimation { target: indeterminateProgressContent property: "x" to: -indeterminateProgressContent.y duration: DS.Style.progressBar.indeterminateProgressBarAnimationDuration * progressBar.width / DS.Style.progressBar.width onFromChanged: if (!delayAnimationTimer.running) delayAnimationTimer.start() onToChanged: if (!delayAnimationTimer.running) delayAnimationTimer.start() } } } Timer { // ###(Chen Bin) Layout bug: Put the progressbar into the layout, // the animation will get a wrong position id: delayAnimationTimer interval: 200 repeat: false onTriggered: { indeterminateAnimation.restart() } } ItemGroup { anchors.fill: parent ClippedText { clip: true clipX: indeterminateProgressContent.x - indeterminateProgressContent.limitWidth - progressBar.leftPadding clipWidth: indeterminateProgressContent.height text: formatText font: progressBar.font color: palette.highlightedText horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } ClippedText { clip: true visible: indeterminateProgressContent.x - indeterminateProgressContent.limitWidth + progressBar.leftPadding > 0 clipX: -progressBar.leftPadding clipWidth: indeterminateProgressContent.x - indeterminateProgressContent.limitWidth + progressBar.leftPadding text: formatText font: progressBar.font color: progressBar.palette.buttonText opacity: enabled ? 1 : 0.4 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } ClippedText { clip: true clipX: indeterminateProgressContent.x - indeterminateProgressContent.limitWidth - progressBar.leftPadding + indeterminateProgressContent.height clipWidth: progressBar.width - progressBar.rightPadding - indeterminateProgressContent.x - indeterminateProgressContent.limitWidth - progressBar.leftPadding + indeterminateProgressContent.height text: formatText font: progressBar.font color: progressBar.palette.buttonText opacity: enabled ? 1 : 0.4 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } } } } } dtkdeclarative-5.7.12/qt6/src/qml/private/ProgressBarPanel.qml000066400000000000000000000012061476226662700243050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk 1.0 Item { id: control property Item progressBar Loader { anchors.fill: parent sourceComponent: progressBar.formatText ? _textPanelComponent : _normalTextComponent } Component { id: _textPanelComponent BoxPanel {} } Component { id: _normalTextComponent Rectangle { radius: DS.Style.control.radius color: Qt.rgba(0, 0, 0, 0.1); } } } dtkdeclarative-5.7.12/qt6/src/qml/private/SoftwareColorOverlay.qml000066400000000000000000000013701476226662700252310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import Qt5Compat.GraphicalEffects.private import org.deepin.dtk 1.0 as D Item { id: rootItem property variant source property alias color: overlay.color property alias cached: overlay.cached SourceProxy { id: sourceProxy input: rootItem.source } ShaderEffectSource { id: cacheItem anchors.fill: parent visible: rootItem.cached smooth: true sourceItem: overlay live: true hideSource: visible } D.SoftwareColorOverlay { id: overlay anchors.fill: parent source: sourceProxy.output } } dtkdeclarative-5.7.12/qt6/src/qml/private/SoftwareOpacityMask.qml000066400000000000000000000020231476226662700250310ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import Qt5Compat.GraphicalEffects.private import org.deepin.dtk 1.0 as D /*! The Qt Graphical Effects module provides a SourceProxy types. the user can simply use ShaderEffectSource or Item as input */ Item { id: rootItem property variant source property variant maskSource property bool cached: false property alias invert: mask.invert SourceProxy { id: sourceProxy input: rootItem.source } SourceProxy { id: maskSourceProxy input: rootItem.maskSource } ShaderEffectSource { id: cacheItem anchors.fill: parent visible: rootItem.cached smooth: true sourceItem: mask live: true hideSource: visible } D.SoftwareOpacityMask { id: mask anchors.fill: parent source: sourceProxy.output maskSource: maskSourceProxy.output } } dtkdeclarative-5.7.12/qt6/src/qml/settings/000077500000000000000000000000001476226662700205505ustar00rootroot00000000000000dtkdeclarative-5.7.12/qt6/src/qml/settings/CMakeLists.txt000066400000000000000000000025051476226662700233120ustar00rootroot00000000000000##################################################################### ## dtkdeclarativesettingsplugin Plugin: ##################################################################### qt_add_qml_module(dtkdeclarativesettingsplugin PLUGIN_TARGET dtkdeclarativesettingsplugin URI "${URI}.settings" VERSION "1.0" SOURCES ${PROJECT_SOURCE_DIR}/src/private/dsettingscontainer_p.h ${PROJECT_SOURCE_DIR}/src/private/dsettingscontainer.cpp QML_FILES "SettingsDialog.qml" "OptionDelegate.qml" "CheckBox.qml" "LineEdit.qml" "ComboBox.qml" "NavigationTitle.qml" "ContentTitle.qml" "ContentBackground.qml" OUTPUT_DIRECTORY "${PLUGIN_OUTPUT_DIR}/${URI_PATH}/settings" ) dtk_extend_target(dtkdeclarativesettingsplugin EnableCov ${ENABLE_COV}) target_link_libraries(dtkdeclarativesettingsplugin PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::CorePrivate Qt${QT_VERSION_MAJOR}::QuickPrivate Qt${QT_VERSION_MAJOR}::Qml Qt${QT_VERSION_MAJOR}::QmlPrivate ${LIB_NAME} ) install(TARGETS dtkdeclarativesettingsplugin DESTINATION "${QML_INSTALL_DIR}/${URI_PATH}/settings") install(DIRECTORY "${PLUGIN_OUTPUT_DIR}/${URI_PATH}/settings/" DESTINATION "${QML_INSTALL_DIR}/${URI_PATH}/settings") dtkdeclarative-5.7.12/qt6/src/qml/settings/CheckBox.qml000066400000000000000000000011061476226662700227470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import org.deepin.dtk 1.0 as D import org.deepin.dtk.settings 1.0 as Settings import org.deepin.dtk 1.0 Settings.OptionDelegate { id: control leftVisible: false CheckBox { Layout.fillWidth: true text: Settings.SettingsOption.name checked: Settings.SettingsOption.value || false onCheckedChanged: { Settings.SettingsOption.value = checked } } } dtkdeclarative-5.7.12/qt6/src/qml/settings/ComboBox.qml000066400000000000000000000023301476226662700227710ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import org.deepin.dtk.settings 1.0 as Settings import org.deepin.dtk 1.0 Settings.OptionDelegate { id: control property alias impl: impl property string valueRole property alias model: impl.model ComboBox { id: impl Layout.alignment: Qt.AlignRight Layout.fillWidth: true currentIndex: { var index = -1 for(var i = 0; i < model.length; i++) { var item if (valueRole === "") { item = model[i] } else { item = model[i][valueRole] } if (item === Settings.SettingsOption.value) { index = i break } } return index } onActivated: { if (valueRole === "") { Settings.SettingsOption.value = control.model[currentIndex] } else { Settings.SettingsOption.value = control.model[currentIndex][valueRole] } } } } dtkdeclarative-5.7.12/qt6/src/qml/settings/ContentBackground.qml000066400000000000000000000014141476226662700246750ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.settings 1.0 import org.deepin.dtk.style 1.0 as DS Rectangle { anchors { left: parent.left leftMargin: __getMargin(SettingsGroup.level) right: parent.right rightMargin: __getMargin(SettingsGroup.level) } height: childrenRect.height radius: DS.Style.control.radius function __getMargin(level) { switch(level) { case 0: return DS.Style.settings.content.marginL1 case 1: return DS.Style.settings.content.marginL2 } return DS.Style.settings.content.marginOther } } dtkdeclarative-5.7.12/qt6/src/qml/settings/ContentTitle.qml000066400000000000000000000023501476226662700236770ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.settings 1.0 as Settings import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk 1.0 Label { text: Settings.SettingsGroup.name font: __getFont(Settings.SettingsGroup.level) textFormat: Text.PlainText verticalAlignment: Qt.AlignVCenter topPadding: DS.Style.settings.navigation.textVPadding bottomPadding: DS.Style.settings.navigation.textVPadding anchors { left: parent.left leftMargin: __getMargin(Settings.SettingsGroup.level) right: parent.right rightMargin: __getMargin(Settings.SettingsGroup.level) } function __getFont(level) { switch(level) { case 0: return D.DTK.fontManager.t4 case 1: return D.DTK.fontManager.t5 } return D.DTK.fontManager.t6 } function __getMargin(level) { switch(level) { case 0: return DS.Style.settings.title.marginL1 case 1: return DS.Style.settings.title.marginL2 } return DS.Style.settings.title.marginLOther } } dtkdeclarative-5.7.12/qt6/src/qml/settings/LineEdit.qml000066400000000000000000000010271476226662700227600ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import org.deepin.dtk.settings 1.0 as Settings import org.deepin.dtk 1.0 Settings.OptionDelegate { id: control LineEdit { id: impl Layout.alignment: Qt.AlignRight Layout.fillWidth: true text: Settings.SettingsOption.value || "" onEditingFinished: { Settings.SettingsOption.value = text } } } dtkdeclarative-5.7.12/qt6/src/qml/settings/NavigationTitle.qml000066400000000000000000000041421476226662700243650ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.settings 1.0 as Settings import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk 1.0 Control { id: control signal clicked() property bool checked: false property D.Palette backgroundColor: DS.Style.settings.background property D.Palette checkedTextColor: DS.Style.checkedButton.text palette.windowText: checked ? D.ColorSelector.checkedTextColor : undefined contentItem: Label { text: Settings.SettingsGroup.name font: __getFont(Settings.SettingsGroup.level) leftPadding: __getMargin(Settings.SettingsGroup.level) topPadding: DS.Style.settings.navigation.textVPadding bottomPadding: DS.Style.settings.navigation.textVPadding anchors.left: parent.left verticalAlignment: Qt.AlignVCenter elide: Text.ElideRight function __getFont(level) { switch(level) { case 0: return D.DTK.fontManager.t4 // case 1: // return D.DTK.fontManager.t5 } return D.DTK.fontManager.t6 } function __getMargin(level) { switch(level) { case 0: return DS.Style.settings.title.marginL1 case 1: return DS.Style.settings.title.marginL2 } return DS.Style.settings.title.marginLOther } } background: Item { implicitHeight: DS.Style.settings.navigation.height implicitWidth: DS.Style.settings.navigation.width Rectangle { anchors.fill: parent visible: !control.checked color: control.D.ColorSelector.backgroundColor radius: DS.Style.control.radius } HighlightPanel { anchors.fill: parent visible: control.checked } } MouseArea { anchors.fill: parent Component.onCompleted: clicked.connect(control.clicked) } } dtkdeclarative-5.7.12/qt6/src/qml/settings/OptionDelegate.qml000066400000000000000000000010731476226662700241670ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import QtQuick.Layouts import org.deepin.dtk.settings 1.0 import org.deepin.dtk 1.0 RowLayout { id: control width: parent.width - parent.leftPadding - parent.rightPadding property bool leftVisible: true Label { id: label visible: leftVisible text: SettingsOption.name verticalAlignment: Text.AlignVCenter } Item { visible: leftVisible width: 20 } } dtkdeclarative-5.7.12/qt6/src/qml/settings/SettingsDialog.qml000066400000000000000000000053231476226662700242060ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick import org.deepin.dtk 1.0 as D import org.deepin.dtk.style 1.0 as DS import org.deepin.dtk.settings 1.0 as Settings import org.deepin.dtk 1.0 DialogWindow { id: control property list groups property D.Config config property Settings.SettingsContainer container : Settings.SettingsContainer { id: settingsContainer config: control.config navigationTitle: Settings.NavigationTitle { width: navigationView.width - navigationView.leftMargin - navigationView.rightMargin checked: navigationView.currentIndex === Settings.SettingsGroup.index onClicked: navigationView.currentIndex = Settings.SettingsGroup.index } contentTitle: Settings.ContentTitle {} contentBackground: Settings.ContentBackground {} groups: control.groups } property alias navigationView: navigationView property alias contentView: contentView ScrollView { id: navigationBg width: DS.Style.settings.navigation.width background: Rectangle { anchors.fill: parent color: palette.base } ListView { id: navigationView model: container.navigationModel leftMargin: DS.Style.settings.navigation.margin rightMargin: DS.Style.settings.navigation.margin currentIndex: 0 onCurrentIndexChanged: { contentView.currentIndex = currentIndex } } } ScrollView { id: contentBg anchors { right: parent.right left: navigationBg.right top: control.top } padding: DS.Style.settings.content.margin background: Rectangle { anchors.fill: parent color: palette.base } ListView { id: contentView model: container.contentModel highlightRangeMode: ListView.StrictlyEnforceRange currentIndex: 0 onCurrentIndexChanged: { navigationView.currentIndex = currentIndex } footer: Item { width: parent.width height: DS.Style.settings.content.resetButtonHeight Button { anchors.horizontalCenter: parent.horizontalCenter anchors.bottom: parent.bottom text: qsTr("Restore Defaults") onClicked: { settingsContainer.resetSettings(); } } } } } } dtkdeclarative-5.7.12/qt6/src/qml/style/000077500000000000000000000000001476226662700200505ustar00rootroot00000000000000dtkdeclarative-5.7.12/qt6/src/qml/style/Style.qml000066400000000000000000000002541476226662700216640ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later pragma Singleton import ".." FlowStyle {} dtkdeclarative-5.7.12/qt6/src/shaders_ng/000077500000000000000000000000001476226662700202345ustar00rootroot00000000000000dtkdeclarative-5.7.12/qt6/src/shaders_ng/cornerscolorshader.frag000066400000000000000000000007561476226662700250060ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #version 440 layout(location = 0) in vec2 qt_TexCoord; layout(location = 1) in vec4 color; layout(location = 0) out vec4 fragColor; layout(binding = 1) uniform sampler2D qt_Texture; layout(std140, binding = 0) uniform buf { mat4 qt_Matrix; float qt_Opacity; } ubuf; void main() { fragColor = color * texture(qt_Texture, qt_TexCoord).a * ubuf.qt_Opacity; } dtkdeclarative-5.7.12/qt6/src/shaders_ng/cornerscolorshader.vert000066400000000000000000000011561476226662700250420ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #version 440 layout(location = 0) in vec4 qt_VertexPosition; layout(location = 1) in vec2 qt_VertexTexCoord; layout(location = 2) in vec4 vertexColor; layout(location = 0) out vec2 qt_TexCoord; layout(location = 1) out vec4 color; layout(std140, binding = 0) uniform buf { mat4 qt_Matrix; float qt_Opacity; } ubuf; out gl_PerVertex { vec4 gl_Position; }; void main() { qt_TexCoord = qt_VertexTexCoord; color = vertexColor; gl_Position = ubuf.qt_Matrix * qt_VertexPosition; } dtkdeclarative-5.7.12/qt6/src/shaders_ng/quickitemviewport-opaque.frag000066400000000000000000000043511476226662700261630ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #version 440 layout(location = 0) in vec2 qt_TexCoord; layout(location = 0) out vec4 fragColor; layout(binding = 1) uniform sampler2D qt_Texture; layout(binding = 2) uniform sampler2D mask; layout(std140, binding = 0) uniform buf { mat4 qt_Matrix; vec2 maskScale; vec2 maskOffset; vec2 sourceScale; } ubuf; void main() { lowp vec2 scale = ubuf.maskScale * ubuf.sourceScale; // mask材质右下角的偏移量 lowp vec2 maskOffset2 = ubuf.maskOffset + (1.0 / ubuf.sourceScale) - 1.0; // 左上角的mask材质坐标 lowp vec2 tex_top_left = (qt_TexCoord - ubuf.maskOffset) * scale; // 左下角的mask材质坐标,由于mask本身为左上角,因此还需要将材质按垂直方向翻转 lowp vec2 tex_bottom_left = (qt_TexCoord - vec2(ubuf.maskOffset.s, maskOffset2.t)) * scale - vec2(0, scale.t - 1.0); tex_bottom_left.t = 1.0 - tex_bottom_left.t; // 将材质按垂直方向翻转 // 右上角的mask材质坐标,由于mask本身为左上角,因此还需要将材质按水平方向翻转 lowp vec2 tex_top_right = (qt_TexCoord - vec2(maskOffset2.s, ubuf.maskOffset.t)) * scale - vec2(scale.s - 1.0, 0); tex_top_right.s = 1.0 - tex_top_right.s; // 将材质按水平方向翻转 // 右下角的mask材质坐标, 由于mask本身为左上角,因此还需要将材质翻转 lowp vec2 tex_bottom_right = 1.0 - ((qt_TexCoord - maskOffset2 - 1.0) * scale + 1.0); // 从mask材质中取出对应坐标的颜色 lowp vec4 mask_top_left = texture(mask, tex_top_left); lowp vec4 mask_bottom_left = texture(mask, tex_bottom_left); lowp vec4 mask_top_right = texture(mask, tex_top_right); lowp vec4 mask_bottom_right = texture(mask, tex_bottom_right); lowp vec4 mask_tex = mask_top_left * mask_bottom_left * mask_top_right * mask_bottom_right; if (mask_tex.a == 0.0) discard; lowp vec4 tex = texture(qt_Texture, qt_TexCoord); // 统一计算此像素点被模板遮盖后的颜色,此处不需要区分点是否在某个区域,不在此区域时取出的mask颜色的alpha值必为1 tex *= mask_tex; fragColor = tex * tex.a; } dtkdeclarative-5.7.12/qt6/src/shaders_ng/quickitemviewport-opaque.vert000066400000000000000000000010571476226662700262240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #version 440 layout(location = 0) in vec4 qt_VertexPosition; layout(location = 1) in vec2 qt_VertexTexCoord; layout(location = 0) out vec2 qt_TexCoord; layout(std140, binding = 0) uniform buf { mat4 qt_Matrix; vec2 maskScale; vec2 maskOffset; vec2 sourceScale; } ubuf; out gl_PerVertex { vec4 gl_Position; }; void main() { qt_TexCoord = qt_VertexTexCoord; gl_Position = ubuf.qt_Matrix * qt_VertexPosition; } dtkdeclarative-5.7.12/qt6/src/shaders_ng/quickitemviewport.frag000066400000000000000000000045111476226662700246710ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #version 440 layout(location = 0) in vec2 qt_TexCoord; layout(location = 0) out vec4 fragColor; layout(binding = 1) uniform sampler2D qt_Texture; layout(binding = 2) uniform sampler2D mask; layout(std140, binding = 0) uniform buf { mat4 qt_Matrix; vec2 maskScale; vec2 maskOffset; vec2 sourceScale; float opacity; } ubuf; void main() { lowp vec2 scale = ubuf.maskScale * ubuf.sourceScale; // mask材质右下角的偏移量 lowp vec2 maskOffset2 = ubuf.maskOffset + (1.0 / ubuf.sourceScale) - 1.0; // 左上角的mask材质坐标 lowp vec2 tex_top_left = (qt_TexCoord - ubuf.maskOffset) * scale; // 左下角的mask材质坐标,由于mask本身为左上角,因此还需要将材质按垂直方向翻转 lowp vec2 tex_bottom_left = (qt_TexCoord - vec2(ubuf.maskOffset.s, maskOffset2.t)) * scale - vec2(0, scale.t - 1.0); tex_bottom_left.t = 1.0 - tex_bottom_left.t; // 将材质按垂直方向翻转 // 右上角的mask材质坐标,由于mask本身为左上角,因此还需要将材质按水平方向翻转 lowp vec2 tex_top_right = (qt_TexCoord - vec2(maskOffset2.s, ubuf.maskOffset.t)) * scale - vec2(scale.s - 1.0, 0); tex_top_right.s = 1.0 - tex_top_right.s; // 将材质按水平方向翻转 // 右下角的mask材质坐标, 由于mask本身为左上角,因此还需要将材质翻转 lowp vec2 tex_bottom_right = 1.0 - ((qt_TexCoord - maskOffset2 - 1.0) * scale + 1.0); // 从mask材质中取出对应坐标的颜色 lowp vec4 mask_top_left = texture(mask, tex_top_left); lowp vec4 mask_bottom_left = texture(mask, tex_bottom_left); lowp vec4 mask_top_right = texture(mask, tex_top_right); lowp vec4 mask_bottom_right = texture(mask, tex_bottom_right); lowp vec4 mask_tex = mask_top_left * mask_bottom_left * mask_top_right * mask_bottom_right; if (mask_tex.a == 0.0) discard; lowp vec4 tex = texture(qt_Texture, qt_TexCoord); // 统一计算此像素点被模板遮盖后的颜色,此处不需要区分点是否在某个区域,不在此区域时取出的mask颜色的alpha值必为1 tex *= mask_top_left * mask_bottom_left * mask_top_right * mask_bottom_right; fragColor = tex * tex.a * ubuf.opacity; } dtkdeclarative-5.7.12/qt6/src/shaders_ng/quickitemviewport.vert000066400000000000000000000011021476226662700247230ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #version 440 layout(location = 0) in vec4 qt_VertexPosition; layout(location = 1) in vec2 qt_VertexTexCoord; layout(location = 0) out vec2 qt_TexCoord; layout(std140, binding = 0) uniform buf { mat4 qt_Matrix; vec2 maskScale; vec2 maskOffset; vec2 sourceScale; float opacity; } ubuf; out gl_PerVertex { vec4 gl_Position; }; void main() { qt_TexCoord = qt_VertexTexCoord; gl_Position = ubuf.qt_Matrix * qt_VertexPosition; } dtkdeclarative-5.7.12/qt6/src/shaders_ng/shadowmaterial.frag000066400000000000000000000015531476226662700241050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #version 440 layout(location = 0) in vec2 qt_TexCoord; layout(location = 0) out vec4 fragColor; layout(std140, binding = 0) uniform buf { mat4 qt_Matrix; float qt_Opacity; float relativeSizeX; float relativeSizeY; float spread; vec4 color; } ubuf; highp float linearstep(highp float e0, highp float e1, highp float x) { return clamp((x - e0) / (e1 - e0), 0.0, 1.0); } void main() { float alpha = smoothstep(0.0, ubuf.relativeSizeX, 0.5 - abs(0.5 - qt_TexCoord.x)) * smoothstep(0.0, ubuf.relativeSizeY, 0.5 - abs(0.5 - qt_TexCoord.y)); float spreadMultiplier = linearstep(ubuf.spread, 1.0 - ubuf.spread, alpha); fragColor = ubuf.color * ubuf.qt_Opacity * spreadMultiplier * spreadMultiplier; } dtkdeclarative-5.7.12/qt6/src/shaders_ng/shadowmaterial.vert000066400000000000000000000011401476226662700241360ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #version 440 layout(location = 0) in vec4 qt_VertexPosition; layout(location = 1) in vec2 qt_VertexTexCoord; layout(location = 0) out highp vec2 qt_TexCoord; layout(std140, binding = 0) uniform buf { mat4 qt_Matrix; float qt_Opacity; float relativeSizeX; float relativeSizeY; float spread; vec4 color; } ubuf; out gl_PerVertex { vec4 gl_Position; }; void main() { qt_TexCoord = qt_VertexTexCoord; gl_Position = ubuf.qt_Matrix * qt_VertexPosition; } dtkdeclarative-5.7.12/src/000077500000000000000000000000001476226662700154055ustar00rootroot00000000000000dtkdeclarative-5.7.12/src/CMakeLists.txt000066400000000000000000000022311476226662700201430ustar00rootroot00000000000000include(${PROJECT_SOURCE_DIR}/src/targets.cmake) find_package(Qt${QT_VERSION_MAJOR}QuickCompiler) # Quick compiler gen qmlc file(GLOB QML_RCS ${PROJECT_SOURCE_DIR}/src/dtkdeclarative_qml.qrc) qtquick_compiler_add_resources(RESOURCES ${QML_RCS} ) # Add translation source file qt5_add_translation(QM_FILES ${TS_FILES}) add_library(${LIB_NAME} SHARED ${RESOURCES} ${QM_FILES} ${PROJECT_SOURCE_DIR}/src/dtkdeclarative_shaders.qrc ) dtk_extend_target(${LIB_NAME} EnableCov ${ENABLE_COV}) set_target_properties(${LIB_NAME} PROPERTIES VERSION ${CMAKE_PROJECT_VERSION} SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR} EXPORT_NAME Declarative ) target_link_libraries(${LIB_NAME} PUBLIC ${LIB_NAME}_properties PRIVATE ${LIB_NAME}_sources ) # Install translations install(FILES ${QM_FILES} DESTINATION "${TRANSLATIONS_INSTALL_PATH}") # Install library install(TARGETS ${LIB_NAME} EXPORT Dtk${DTK_VERSION_MAJOR}DeclarativeTargets DESTINATION "${LIB_INSTALL_DIR}") # Install export targets install(EXPORT Dtk${DTK_VERSION_MAJOR}DeclarativeTargets NAMESPACE Dtk:: FILE Dtk${DTK_VERSION_MAJOR}DeclarativeTargets.cmake DESTINATION "${CONFIG_INSTALL_DIR}") dtkdeclarative-5.7.12/src/DAppLoader000066400000000000000000000000301476226662700172740ustar00rootroot00000000000000#include "dapploader.h" dtkdeclarative-5.7.12/src/DPlatformThemeProxy000066400000000000000000000000411476226662700212400ustar00rootroot00000000000000#include "dplatformthemeproxy.h" dtkdeclarative-5.7.12/src/DQmlAppMainWindowInterface000066400000000000000000000000501476226662700224370ustar00rootroot00000000000000#include "dqmlappmainwindowinterface.h" dtkdeclarative-5.7.12/src/DQmlAppPreloadInterface000066400000000000000000000000451476226662700217550ustar00rootroot00000000000000#include "dqmlapppreloadinterface.h" dtkdeclarative-5.7.12/src/DQuickBlitFramebuffer000066400000000000000000000000431476226662700214650ustar00rootroot00000000000000#include "dquickblitframebuffer.h" dtkdeclarative-5.7.12/src/DQuickItemViewport000066400000000000000000000000401476226662700210610ustar00rootroot00000000000000#include "dquickitemviewport.h" dtkdeclarative-5.7.12/src/DQuickSystemPalette000066400000000000000000000000411476226662700212270ustar00rootroot00000000000000#include "dquicksystempalette.h" dtkdeclarative-5.7.12/src/DQuickWindow000066400000000000000000000000321476226662700176730ustar00rootroot00000000000000#include "dquickwindow.h" dtkdeclarative-5.7.12/src/dapploader.cpp000066400000000000000000000417761476226662700202430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include #include #include #include #include #include #include "dapploader.h" #include "dquickwindow.h" #include "private/dquickapploaderitem_p.h" #include "private/dqmlglobalobject_p.h" #include "dqmlapppreloadinterface.h" #include "dqmlappmainwindowinterface.h" #include "private/dapploader_p.h" DQUICK_BEGIN_NAMESPACE DCORE_USE_NAMESPACE #define APPLICATIONWINDOW_CONTENTDATA "contentData" #define DIALOGWINDOW_CONTENTDATA "content" #define WINDOW_CONTENTDATA "data" #ifndef QT_DEBUG Q_LOGGING_CATEGORY(appLoaderLog, "dtk.quick.apploader" , QtInfoMsg); #else Q_LOGGING_CATEGORY(appLoaderLog, "dtk.quick.apploader"); #endif static const QQuickItemPrivate::ChangeTypes changedTypes = QQuickItemPrivate::Geometry; DAppLoader *DAppLoader::self = nullptr; static inline const bool heightValid(QQuickItemPrivate *item) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) return item->heightValid; #else return item->heightValid(); #endif } static inline bool widthValid(QQuickItemPrivate *item) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) return item->widthValid; #else return item->widthValid(); #endif } class DQmlComponentIncubator : public QQmlIncubator { public: DQmlComponentIncubator(QQmlComponent *component, DAppLoaderPrivate *d, IncubationMode mode = AsynchronousIfNested); protected: virtual void statusChanged(Status) override; virtual void setInitialState(QObject *) override; private: DAppLoaderPrivate *appLoader; QQmlComponent *compnent; }; DQmlComponentIncubator::DQmlComponentIncubator(QQmlComponent *component, DAppLoaderPrivate *appLoader, QQmlIncubator::IncubationMode mode) : QQmlIncubator(mode) , appLoader(appLoader) , compnent(component) { } void DQmlComponentIncubator::statusChanged(QQmlIncubator::Status status) { if (status != QQmlIncubator::Ready) { if (status == QQmlIncubator::Error) qCWarning(appLoaderLog) << "DAppLoader: " << this->errors(); return; } QObject *obj = object(); QQuickItem *item = qmlobject_cast(obj); if (item) item->setParentItem(appLoader->appRootItem); appLoader->_q_onComponentProgressChanged(); appLoader->destoryIncubator(this); } void DQmlComponentIncubator::setInitialState(QObject *o) { if (!appLoader->appRootItem) return; if (o) { QQmlContext *context = appLoader->itemContextMap.value(compnent); if (context) QQml_setParent_noEvent(context, o); QQml_setParent_noEvent(o, appLoader->appRootItem); } } DWindowOverlayTransitionManager::DWindowOverlayTransitionManager(DAppLoaderPrivate *loader) : appLoader(loader) { } bool DWindowOverlayTransitionManager::transitionLoaded() { if (!appLoader->loadingOverlay || !appLoader->exitedTransition) return false; transition(QList(), appLoader->exitedTransition, appLoader->loadingOverlay); return true; } void DWindowOverlayTransitionManager::finished() { appLoader->clearOverlay(); appLoader->appRootItem->setFocus(true); appLoader->exitedTransition->deleteLater(); appLoader->exitedTransition = nullptr; appLoader->duringTransition = false; } DAppLoaderPrivate::DAppLoaderPrivate(DAppLoader *qq) : DTK_CORE_NAMESPACE::DObjectPrivate(qq) , engine (nullptr) , appRootItem(nullptr) , loadingOverlay(nullptr) , windowContentItem(nullptr) , exitedTransition(nullptr) , appWindow(nullptr) , mainComponent(nullptr) , overlayUsingParentSize(false) , duringTransition(false) , transitionManager(this) { DAppLoader::self = qq; } void DAppLoaderPrivate::ensureLoadPreload() { if (preloadInstance) return; preloadInstance.reset(loadInstance()); if (preloadInstance.isNull()) qFatal("Preload plugin for \"%s\" is not found!", qPrintable(appid)); } void DAppLoaderPrivate::ensureLoadMain() { if (mainInstance) return; mainInstance.reset(loadInstance()); if (mainInstance.isNull()) qFatal("Main plugin for \"%s\" is not found!", qPrintable(appid)); } template T *DAppLoaderPrivate::loadInstance() const { for (auto iter = pluginPaths.rbegin(); iter != pluginPaths.rend(); iter++) { const QDir dir(*iter); if (!dir.exists()) continue; for (auto entry : dir.entryInfoList(QDir::Files | QDir::NoSymLinks)) { const auto path = entry.absoluteFilePath(); if (!QLibrary::isLibrary(path)) continue; QPluginLoader loader(path); const auto &metaData = loader.metaData(); const QString iid = metaData["IID"].toString(); if (iid != qobject_interface_iid()) continue; if (appid != metaData["MetaData"]["appid"].toString()) continue; if (auto instance = qobject_cast(loader.instance())) { qInfo("Load for %s 's plugin path: %s", qPrintable(appid), qPrintable(path)); return instance; } } } qWarning() << "Can't load request plugin from those directories:" << pluginPaths; return nullptr; } void DAppLoaderPrivate::destoryIncubator(QQmlIncubator *incubator) { incubators.removeAll(incubator); if (incubators.isEmpty()) { finishedLoaded(); appRootItem->setLoaded(true); } incubator->clear(); delete incubator; } QQmlContext *DAppLoaderPrivate::creationContext(QQmlComponent *component, QObject *obj) { QQmlContext *creationContext = component->creationContext(); if (!creationContext) creationContext = qmlContext(obj); QQmlContext *context = new QQmlContext(creationContext); context->setContextObject(obj); this->itemContextMap.insert(component, context); return context; } bool DAppLoaderPrivate::createObjects(const char *propertyName) { Q_ASSERT(mainComponent); QQmlListReference pros(appWindow, propertyName); if (!pros.isValid()) return false; appRootItem = qobject_cast(mainComponent->beginCreate(creationContext(mainComponent, appWindow))); Q_ASSERT_X(appRootItem, "DAppLoader", "Must use the AppLoader item in main component."); appRootItem->setWindow(appWindow); mainComponent->completeCreate(); DQuickWindowAttached *attached = qobject_cast(qmlAttachedPropertiesObject(appWindow, false)); if (attached) { attached->setAppLoader(appRootItem); } pros.append(appRootItem); initRootItem(windowContentItem); createChildComponents(); return true; } void DAppLoaderPrivate::createChildComponents() { auto components = appRootItem->findChildren(QStringLiteral(""), Qt::FindDirectChildrenOnly); for (auto childCom : qAsConst(components)) { QObject::connect(childCom, SIGNAL(progressChanged(qreal)), q_func(), SLOT(_q_onComponentProgressChanged())); auto asyn = appRootItem->asynchronous() ? DQmlComponentIncubator::Asynchronous : DQmlComponentIncubator::AsynchronousIfNested; DQmlComponentIncubator *incubator = new DQmlComponentIncubator(childCom, this, asyn); this->incubators.append(incubator); childCom->create(*incubator, creationContext(childCom, appRootItem)); } } void DAppLoaderPrivate::initRootItem(QQuickItem *item) { QQuickItemPrivate *wp = QQuickItemPrivate::get(item); wp->addItemChangeListener(this, changedTypes); // The appRootItem always fills the window. updateRootItemSize(item); } void DAppLoaderPrivate::updateRootItemSize(QQuickItem *item) { if (!appRootItem) return; QQuickItemPrivate *ip = QQuickItemPrivate::get(item); if (widthValid(ip)) { appRootItem->setWidth(item->width()); } else { appRootItem->setWidth(appWindow->width()); } if (heightValid(ip)) { appRootItem->setHeight(item->height()); } else { appRootItem->setWidth(appWindow->height()); } } void DAppLoaderPrivate::itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &oldGeometry) { if (loadingOverlay && !duringTransition) { if (overlayUsingParentSize) loadingOverlay->setSize(item->size()); } updateRootItemSize(item); QQuickItemChangeListener::itemGeometryChanged(item, change, oldGeometry); } void DAppLoaderPrivate::finishedLoaded() { D_Q(DAppLoader); Q_EMIT q->loadFinished(); duringTransition = transitionManager.transitionLoaded(); if (!duringTransition) { clearOverlay(); appRootItem->setFocus(true); } mainInstance->finishedLoading(engine); } void DAppLoaderPrivate::createOverlay() { if (loadingOverlay) return; DQuickWindowAttached *attached = qobject_cast(qmlAttachedPropertiesObject(appWindow, false)); if (!attached) return; QQmlComponent *loComponent = attached->loadingOverlay(); if (!loComponent) return; QQmlContext *context = creationContext(loComponent, windowContentItem); loadingOverlay = qobject_cast(loComponent->beginCreate(context)); if (!loadingOverlay) return; loadingOverlay->setParentItem(windowContentItem); loadingOverlay->setZ(DQMLGlobalObject::TopOrder); exitedTransition = attached->overlayExited(); if (exitedTransition) engine->setObjectOwnership(exitedTransition, QQmlEngine::CppOwnership); loComponent->completeCreate(); QQuickItemPrivate *overlayPrivate = QQuickItemPrivate::get(loadingOverlay); if (!widthValid(overlayPrivate) || !heightValid(overlayPrivate)) { overlayUsingParentSize = true; if (qFuzzyCompare(windowContentItem->width(), 0) || qFuzzyCompare(windowContentItem->height(), 0)) { loadingOverlay->setSize(appWindow->size()); } else { loadingOverlay->setSize(windowContentItem->size()); } } engine->setObjectOwnership(loadingOverlay, QQmlEngine::CppOwnership); return; } void DAppLoaderPrivate::clearOverlay() { if (!loadingOverlay) return; loadingOverlay->setParentItem(nullptr); loadingOverlay->setVisible(false); loadingOverlay->deleteLater(); loadingOverlay = nullptr; DQuickWindowAttached *attached = qobject_cast(qmlAttachedPropertiesObject(appWindow, false)); if (attached) { QQmlContext *context = itemContextMap.take(attached->loadingOverlay()); delete context; } } void DAppLoaderPrivate::findWindowContentItem() { if (!appWindow) return; do { QVariant dataVariant = appWindow->property(APPLICATIONWINDOW_CONTENTDATA); if (dataVariant.isValid()) { // ApplicationWindow auto objectsData = dataVariant.value>(); windowContentItem = qmlobject_cast(objectsData.object); break; } dataVariant = appWindow->property(DIALOGWINDOW_CONTENTDATA); if (dataVariant.isValid()) { // DialogWindow auto itemsData = dataVariant.value>(); windowContentItem = qmlobject_cast(itemsData.object); break; } } while (false); // Window if (!windowContentItem) windowContentItem = appWindow->contentItem(); } void DAppLoaderPrivate::_q_onPreloadCreated(QObject *obj, const QUrl &) { QQuickWindow *window = qmlobject_cast(obj); if (!window) return; appWindow = window; findWindowContentItem(); Q_ASSERT(appWindow); Q_ASSERT(windowContentItem); // ensure the overlay shown and start the loading animation. createOverlay(); ensureLoadMain(); mainInstance->initialize(engine); // Insert component into preload const QUrl &mainComponentPath = mainInstance->mainComponentPath(); mainComponent = new QQmlComponent(engine, mainComponentPath, QQmlComponent::Asynchronous); if (mainComponent->isLoading()) { QObject::connect(mainComponent, SIGNAL(statusChanged(QQmlComponent::Status)), q_func(), SLOT(_q_onMainComponentStatusChanged(QQmlComponent::Status))); } else { _q_onMainComponentStatusChanged(mainComponent->status()); } } void DAppLoaderPrivate::_q_onMainComponentStatusChanged(QQmlComponent::Status status) { if (status != QQmlComponent::Ready) { if (status == QQmlComponent::Error) qCWarning(appLoaderLog) << "DAppLoader: " << mainComponent->errors() << " " << mainComponent->errorString(); return; } do { // For ApplicationWindow. if (createObjects(APPLICATIONWINDOW_CONTENTDATA)) break; // For DialogWindow. if (createObjects(DIALOGWINDOW_CONTENTDATA)) break; // For Window. if (createObjects(WINDOW_CONTENTDATA)) break; } while (false); mainComponent->deleteLater(); mainComponent = nullptr; } void DAppLoaderPrivate::_q_onComponentProgressChanged() { qreal progress = 0; auto components = appRootItem->findChildren(); for (auto childCom : qAsConst(components)) { progress += childCom->progress(); } appRootItem->setProgress(progress / components.count()); } QStringList DAppLoaderPrivate::buildinPluginPaths() { QStringList result; // 'DTK_QML_PLUGIN_PATH' directory. const auto dtkPluginPath = qgetenv("DTK_QML_PLUGIN_PATH"); if (!dtkPluginPath.isEmpty()) result.append(dtkPluginPath); #ifdef DTK_QML_APP_PLUGIN_SUBPATH const auto ldPath = qgetenv("LD_LIBRARY_PATH"); if (!ldPath.isEmpty()) { // fallback to $LD_LIBRARY_PATH/'DTK_QML_APP_PLUGIN_SUBPATH'. for (const auto &i : ldPath.split(':')) { const DPathBuf dir(i); result.append((dir / DTK_QML_APP_PLUGIN_SUBPATH).toString()); } } #endif #ifdef DTK_QML_APP_PLUGIN_PATH // dtkdeclarative runtime directory. result.append(DTK_QML_APP_PLUGIN_PATH); #endif return result; } /*! * \~chinese \brief DAppLoader::DAppLoader 用于加载DTk QML应用插件 * \~chinese \param appid  应用插件的名字 * \~chinese \param appPath  应用插件的安装目录 */ DAppLoader::DAppLoader(const QString &appid, const QString &appPath, QObject *parent) : QObject (parent) , DTK_CORE_NAMESPACE::DObject(*new DAppLoaderPrivate(this)) { D_D(DAppLoader); d->appid = appid; const auto &paths = d->buildinPluginPaths(); for (auto iter = paths.rbegin(); iter != paths.rend(); iter++) addPluginPath(*iter); addPluginPath(appPath); } DAppLoader::~DAppLoader() { D_D(DAppLoader); qDeleteAll(d->itemContextMap.values()); delete d->engine; self = nullptr; } void DAppLoader::addPluginPath(const QString &dir) { D_D(DAppLoader); if (dir.isEmpty()) return; d->pluginPaths.append(dir); } /*! * \~chinese \brief DAppLoader::pluginPaths high priority at the front. */ QStringList DAppLoader::pluginPaths() const { D_DC(DAppLoader); QStringList paths; std::reverse_copy(d->pluginPaths.begin(), d->pluginPaths.end(), std::back_inserter(paths)); return paths; } // it will enter the eventloop directly. int DAppLoader::exec(int &argc, char **argv) { D_D(DAppLoader); d->ensureLoadPreload(); d->app.reset(d->preloadInstance->creatApplication(argc, argv)); if (!d->app) return -1; if (!d->engine) d->engine = new QQmlApplicationEngine(this); auto graphics = d->preloadInstance->graphicsApi(); if (graphics == QSGRendererInterface::Unknown) { #if defined __aarch64__ const char *renderName = reinterpret_cast(glGetString(GL_RENDERER)); #else const char *renderName = reinterpret_cast(glGetString(GL_RENDER)); #endif if (renderName) { if (renderName != QByteArrayLiteral("LLVMPIPE") || renderName != QByteArrayLiteral("SWRAST")) #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QQuickWindow::setSceneGraphBackend(QSGRendererInterface::Software); #else QQuickWindow::setGraphicsApi(QSGRendererInterface::Software); #endif } } else { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QQuickWindow::setSceneGraphBackend(graphics); #else QQuickWindow::setGraphicsApi(graphics); #endif } d->preloadInstance->aboutToPreload(d->engine); QObject::connect(d->engine, SIGNAL(objectCreated(QObject *, const QUrl &)), this, SLOT(_q_onPreloadCreated(QObject *, const QUrl &))); d->engine->load(d->preloadInstance->preloadComponentPath()); if (d->engine->rootObjects().isEmpty()) return -1; return d->app->exec(); } DQUICK_END_NAMESPACE #include "moc_dapploader.cpp" dtkdeclarative-5.7.12/src/dapploader.h000066400000000000000000000022541476226662700176740ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DAPPLOADER_H #define DAPPLOADER_H #include #include #include QT_BEGIN_NAMESPACE class QString; class QQmlEngine; class QQuickWindow; class QGuiApplication; QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class DAppLoaderPrivate; class DAppLoader : public QObject, public DTK_CORE_NAMESPACE::DObject { Q_OBJECT D_DECLARE_PRIVATE(DAppLoader) D_PRIVATE_SLOT(void _q_onMainComponentStatusChanged(QQmlComponent::Status)) D_PRIVATE_SLOT(void _q_onPreloadCreated(QObject *, const QUrl &)) D_PRIVATE_SLOT(void _q_onComponentProgressChanged()) public: DAppLoader() = delete ; DAppLoader(const QString &appName, const QString &appPath = QString(), QObject *parent = nullptr); ~DAppLoader(); void addPluginPath(const QString &dir); QStringList pluginPaths() const; int exec(int &argc, char **argv); static DAppLoader *instance() { return self; } Q_SIGNALS: void loadFinished(); private: static DAppLoader *self; }; DQUICK_END_NAMESPACE #endif // DAPPLOADER_H dtkdeclarative-5.7.12/src/dplatformthemeproxy.cpp000066400000000000000000000420361476226662700222330ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dplatformthemeproxy.h" #include "private/dplatformthemeproxy_p.h" DQUICK_BEGIN_NAMESPACE /*! * \~chinese \class DPlatformThemeProxy * \~chinese \brief 一个代理类,用于导出dtkgui的DPlatformTheme类的功能到QML使用,功能和接口基本和DPlatformTheme一致 */ DPlatformThemeProxyPrivate::DPlatformThemeProxyPrivate(DPlatformThemeProxy *qq) : DTK_CORE_NAMESPACE::DObjectPrivate(qq) { } DPlatformThemeProxy::DPlatformThemeProxy(DPlatformTheme *proxy, QObject *parent) : QObject(parent) , DTK_CORE_NAMESPACE::DObject(*new DPlatformThemeProxyPrivate(this)) { d_func()->proxy = proxy; connect(proxy, &DPlatformTheme::cursorBlinkTimeChanged, this, &DPlatformThemeProxy::cursorBlinkTimeChanged); connect(proxy, &DPlatformTheme::cursorBlinkTimeoutChanged, this, &DPlatformThemeProxy::cursorBlinkTimeoutChanged); connect(proxy, &DPlatformTheme::cursorBlinkChanged, this, &DPlatformThemeProxy::cursorBlinkChanged); connect(proxy, &DPlatformTheme::doubleClickDistanceChanged, this, &DPlatformThemeProxy::doubleClickDistanceChanged); connect(proxy, &DPlatformTheme::doubleClickTimeChanged, this, &DPlatformThemeProxy::doubleClickTimeChanged); connect(proxy, &DPlatformTheme::dndDragThresholdChanged, this, &DPlatformThemeProxy::dndDragThresholdChanged); connect(proxy, &DPlatformTheme::windowRadiusChanged, this, &DPlatformThemeProxy::windowRadiusChanged); #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) // QPalette connect(proxy, &DPlatformTheme::windowChanged, this, &DPlatformThemeProxy::windowChanged); connect(proxy, &DPlatformTheme::windowTextChanged, this, &DPlatformThemeProxy::windowTextChanged); connect(proxy, &DPlatformTheme::baseChanged, this, &DPlatformThemeProxy::baseChanged); connect(proxy, &DPlatformTheme::alternateBaseChanged, this, &DPlatformThemeProxy::alternateBaseChanged); connect(proxy, &DPlatformTheme::toolTipBaseChanged, this, &DPlatformThemeProxy::toolTipBaseChanged); connect(proxy, &DPlatformTheme::toolTipTextChanged, this, &DPlatformThemeProxy::toolTipTextChanged); connect(proxy, &DPlatformTheme::textChanged, this, &DPlatformThemeProxy::textChanged); connect(proxy, &DPlatformTheme::buttonChanged, this, &DPlatformThemeProxy::buttonChanged); connect(proxy, &DPlatformTheme::buttonTextChanged, this, &DPlatformThemeProxy::buttonTextChanged); connect(proxy, &DPlatformTheme::brightTextChanged, this, &DPlatformThemeProxy::brightTextChanged); connect(proxy, &DPlatformTheme::lightChanged, this, &DPlatformThemeProxy::lightChanged); connect(proxy, &DPlatformTheme::midlightChanged, this, &DPlatformThemeProxy::midlightChanged); connect(proxy, &DPlatformTheme::darkChanged, this, &DPlatformThemeProxy::darkChanged); connect(proxy, &DPlatformTheme::midChanged, this, &DPlatformThemeProxy::midChanged); connect(proxy, &DPlatformTheme::shadowChanged, this, &DPlatformThemeProxy::shadowChanged); connect(proxy, &DPlatformTheme::highlightChanged, this, &DPlatformThemeProxy::highlightChanged); connect(proxy, &DPlatformTheme::highlightedTextChanged, this, &DPlatformThemeProxy::highlightedTextChanged); connect(proxy, &DPlatformTheme::linkChanged, this, &DPlatformThemeProxy::linkChanged); connect(proxy, &DPlatformTheme::linkVisitedChanged, this, &DPlatformThemeProxy::linkVisitedChanged); // DPalette connect(proxy, &DPlatformTheme::itemBackgroundChanged, this, &DPlatformThemeProxy::itemBackgroundChanged); connect(proxy, &DPlatformTheme::textTitleChanged, this, &DPlatformThemeProxy::textTitleChanged); connect(proxy, &DPlatformTheme::textTipsChanged, this, &DPlatformThemeProxy::textTipsChanged); connect(proxy, &DPlatformTheme::textWarningChanged, this, &DPlatformThemeProxy::textWarningChanged); connect(proxy, &DPlatformTheme::textLivelyChanged, this, &DPlatformThemeProxy::textLivelyChanged); connect(proxy, &DPlatformTheme::lightLivelyChanged, this, &DPlatformThemeProxy::lightLivelyChanged); connect(proxy, &DPlatformTheme::darkLivelyChanged, this, &DPlatformThemeProxy::darkLivelyChanged); connect(proxy, &DPlatformTheme::frameBorderChanged, this, &DPlatformThemeProxy::frameBorderChanged); #endif connect(proxy, &DPlatformTheme::scrollBarPolicyChanged, this, &DPlatformThemeProxy::scrollBarPolicyChanged); // theme connect(proxy, &DPlatformTheme::themeNameChanged, this, &DPlatformThemeProxy::themeNameChanged); connect(proxy, &DPlatformTheme::iconThemeNameChanged, this, &DPlatformThemeProxy::iconThemeNameChanged); connect(proxy, &DPlatformTheme::soundThemeNameChanged, this, &DPlatformThemeProxy::soundThemeNameChanged); // font connect(proxy, &DPlatformTheme::fontNameChanged, this, &DPlatformThemeProxy::fontNameChanged); connect(proxy, &DPlatformTheme::monoFontNameChanged, this, &DPlatformThemeProxy::monoFontNameChanged); connect(proxy, &DPlatformTheme::fontPointSizeChanged, this, &DPlatformThemeProxy::fontPointSizeChanged); connect(proxy, &DPlatformTheme::gtkFontNameChanged, this, &DPlatformThemeProxy::gtkFontNameChanged); } DPlatformThemeProxy::~DPlatformThemeProxy() { } int DPlatformThemeProxy::cursorBlinkTime() const { D_DC(DPlatformThemeProxy); return d->proxy->cursorBlinkTime(); } int DPlatformThemeProxy::cursorBlinkTimeout() const { D_DC(DPlatformThemeProxy); return d->proxy->cursorBlinkTimeout(); } bool DPlatformThemeProxy::cursorBlink() const { D_DC(DPlatformThemeProxy); return d->proxy->cursorBlink(); } int DPlatformThemeProxy::doubleClickDistance() const { D_DC(DPlatformThemeProxy); return d->proxy->doubleClickDistance(); } int DPlatformThemeProxy::doubleClickTime() const { D_DC(DPlatformThemeProxy); return d->proxy->doubleClickTime(); } int DPlatformThemeProxy::dndDragThreshold() const { D_DC(DPlatformThemeProxy); return d->proxy->dndDragThreshold(); } int DPlatformThemeProxy::windowRadius() const { D_DC(DPlatformThemeProxy); return d->proxy->windowRadius(); } int DPlatformThemeProxy::windowRadius(int defaultValue) const { D_DC(DPlatformThemeProxy); return d->proxy->windowRadius(defaultValue); } QByteArray DPlatformThemeProxy::themeName() const { D_DC(DPlatformThemeProxy); return d->proxy->themeName(); } QByteArray DPlatformThemeProxy::iconThemeName() const { D_DC(DPlatformThemeProxy); return d->proxy->iconThemeName(); } QByteArray DPlatformThemeProxy::soundThemeName() const { D_DC(DPlatformThemeProxy); return d->proxy->soundThemeName(); } QByteArray DPlatformThemeProxy::fontName() const { D_DC(DPlatformThemeProxy); return d->proxy->fontName(); } QByteArray DPlatformThemeProxy::monoFontName() const { D_DC(DPlatformThemeProxy); return d->proxy->monoFontName(); } qreal DPlatformThemeProxy::fontPointSize() const { D_DC(DPlatformThemeProxy); return d->proxy->fontPointSize(); } QByteArray DPlatformThemeProxy::gtkFontName() const { D_DC(DPlatformThemeProxy); return d->proxy->gtkFontName(); } QColor DPlatformThemeProxy::activeColor() const { D_DC(DPlatformThemeProxy); return d->proxy->activeColor(); } bool DPlatformThemeProxy::isValidPalette() const { D_DC(DPlatformThemeProxy); return d->proxy->isValidPalette(); } #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) QColor DPlatformThemeProxy::window() const { D_DC(DPlatformThemeProxy); return d->proxy->window(); } QColor DPlatformThemeProxy::windowText() const { D_DC(DPlatformThemeProxy); return d->proxy->windowText(); } QColor DPlatformThemeProxy::base() const { D_DC(DPlatformThemeProxy); return d->proxy->base(); } QColor DPlatformThemeProxy::alternateBase() const { D_DC(DPlatformThemeProxy); return d->proxy->alternateBase(); } QColor DPlatformThemeProxy::toolTipBase() const { D_DC(DPlatformThemeProxy); return d->proxy->toolTipBase(); } QColor DPlatformThemeProxy::toolTipText() const { D_DC(DPlatformThemeProxy); return d->proxy->toolTipText(); } QColor DPlatformThemeProxy::text() const { D_DC(DPlatformThemeProxy); return d->proxy->text(); } QColor DPlatformThemeProxy::button() const { D_DC(DPlatformThemeProxy); return d->proxy->button(); } QColor DPlatformThemeProxy::buttonText() const { D_DC(DPlatformThemeProxy); return d->proxy->buttonText(); } QColor DPlatformThemeProxy::brightText() const { D_DC(DPlatformThemeProxy); return d->proxy->brightText(); } QColor DPlatformThemeProxy::light() const { D_DC(DPlatformThemeProxy); return d->proxy->light(); } QColor DPlatformThemeProxy::midlight() const { D_DC(DPlatformThemeProxy); return d->proxy->midlight(); } QColor DPlatformThemeProxy::dark() const { D_DC(DPlatformThemeProxy); return d->proxy->dark(); } QColor DPlatformThemeProxy::mid() const { D_DC(DPlatformThemeProxy); return d->proxy->mid(); } QColor DPlatformThemeProxy::shadow() const { D_DC(DPlatformThemeProxy); return d->proxy->shadow(); } QColor DPlatformThemeProxy::highlight() const { D_DC(DPlatformThemeProxy); return d->proxy->highlight(); } QColor DPlatformThemeProxy::highlightedText() const { D_DC(DPlatformThemeProxy); return d->proxy->highlightedText(); } QColor DPlatformThemeProxy::link() const { D_DC(DPlatformThemeProxy); return d->proxy->link(); } QColor DPlatformThemeProxy::linkVisited() const { D_DC(DPlatformThemeProxy); return d->proxy->linkVisited(); } QColor DPlatformThemeProxy::itemBackground() const { D_DC(DPlatformThemeProxy); return d->proxy->itemBackground(); } QColor DPlatformThemeProxy::textTitle() const { D_DC(DPlatformThemeProxy); return d->proxy->textTitle(); } QColor DPlatformThemeProxy::textTips() const { D_DC(DPlatformThemeProxy); return d->proxy->textTips(); } QColor DPlatformThemeProxy::textWarning() const { D_DC(DPlatformThemeProxy); return d->proxy->textWarning(); } QColor DPlatformThemeProxy::textLively() const { D_DC(DPlatformThemeProxy); return d->proxy->textLively(); } QColor DPlatformThemeProxy::lightLively() const { D_DC(DPlatformThemeProxy); return d->proxy->lightLively(); } QColor DPlatformThemeProxy::darkLively() const { D_DC(DPlatformThemeProxy); return d->proxy->darkLively(); } QColor DPlatformThemeProxy::frameBorder() const { D_DC(DPlatformThemeProxy); return d->proxy->frameBorder(); } #endif int DPlatformThemeProxy::scrollBarPolicy() const { D_DC(DPlatformThemeProxy); return d->proxy->scrollBarPolicy(); } int DPlatformThemeProxy::dotsPerInch(const QString &screenName) const { D_DC(DPlatformThemeProxy); return d->proxy->dotsPerInch(screenName); } void DPlatformThemeProxy::setCursorBlinkTime(int cursorBlinkTime) { D_D(DPlatformThemeProxy); return d->proxy->setCursorBlinkTime(cursorBlinkTime); } void DPlatformThemeProxy::setCursorBlinkTimeout(int cursorBlinkTimeout) { D_D(DPlatformThemeProxy); return d->proxy->setCursorBlinkTimeout(cursorBlinkTimeout); } void DPlatformThemeProxy::setCursorBlink(bool cursorBlink) { D_D(DPlatformThemeProxy); return d->proxy->setCursorBlink(cursorBlink); } void DPlatformThemeProxy::setDoubleClickDistance(int doubleClickDistance) { D_D(DPlatformThemeProxy); return d->proxy->setDoubleClickDistance(doubleClickDistance); } void DPlatformThemeProxy::setDoubleClickTime(int doubleClickTime) { D_D(DPlatformThemeProxy); return d->proxy->setDoubleClickTime(doubleClickTime); } void DPlatformThemeProxy::setDndDragThreshold(int dndDragThreshold) { D_D(DPlatformThemeProxy); return d->proxy->setDndDragThreshold(dndDragThreshold); } void DPlatformThemeProxy::setThemeName(const QByteArray &themeName) { D_D(DPlatformThemeProxy); return d->proxy->setThemeName(themeName); } void DPlatformThemeProxy::setIconThemeName(const QByteArray &iconThemeName) { D_D(DPlatformThemeProxy); return d->proxy->setIconThemeName(iconThemeName); } void DPlatformThemeProxy::setSoundThemeName(const QByteArray &soundThemeName) { D_D(DPlatformThemeProxy); return d->proxy->setSoundThemeName(soundThemeName); } void DPlatformThemeProxy::setFontName(const QByteArray &fontName) { D_D(DPlatformThemeProxy); return d->proxy->setFontName(fontName); } void DPlatformThemeProxy::setMonoFontName(const QByteArray &monoFontName) { D_D(DPlatformThemeProxy); return d->proxy->setMonoFontName(monoFontName); } void DPlatformThemeProxy::setFontPointSize(qreal fontPointSize) { D_D(DPlatformThemeProxy); return d->proxy->setFontPointSize(fontPointSize); } void DPlatformThemeProxy::setGtkFontName(const QByteArray &fontName) { D_D(DPlatformThemeProxy); return d->proxy->setGtkFontName(fontName); } void DPlatformThemeProxy::setActiveColor(const QColor activeColor) { D_D(DPlatformThemeProxy); return d->proxy->setActiveColor(activeColor); } #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) void DPlatformThemeProxy::setWindow(const QColor &window) { D_D(DPlatformThemeProxy); return d->proxy->setWindow(window); } void DPlatformThemeProxy::setWindowText(const QColor &windowText) { D_D(DPlatformThemeProxy); return d->proxy->setWindowText(windowText); } void DPlatformThemeProxy::setBase(const QColor &base) { D_D(DPlatformThemeProxy); return d->proxy->setBase(base); } void DPlatformThemeProxy::setAlternateBase(const QColor &alternateBase) { D_D(DPlatformThemeProxy); return d->proxy->setAlternateBase(alternateBase); } void DPlatformThemeProxy::setToolTipBase(const QColor &toolTipBase) { D_D(DPlatformThemeProxy); return d->proxy->setToolTipBase(toolTipBase); } void DPlatformThemeProxy::setToolTipText(const QColor &toolTipText) { D_D(DPlatformThemeProxy); return d->proxy->setToolTipText(toolTipText); } void DPlatformThemeProxy::setText(const QColor &text) { D_D(DPlatformThemeProxy); return d->proxy->setText(text); } void DPlatformThemeProxy::setButton(const QColor &button) { D_D(DPlatformThemeProxy); return d->proxy->setButton(button); } void DPlatformThemeProxy::setButtonText(const QColor &buttonText) { D_D(DPlatformThemeProxy); return d->proxy->setButtonText(buttonText); } void DPlatformThemeProxy::setBrightText(const QColor &brightText) { D_D(DPlatformThemeProxy); return d->proxy->setBrightText(brightText); } void DPlatformThemeProxy::setLight(const QColor &light) { D_D(DPlatformThemeProxy); return d->proxy->setLight(light); } void DPlatformThemeProxy::setMidlight(const QColor &midlight) { D_D(DPlatformThemeProxy); return d->proxy->setMidlight(midlight); } void DPlatformThemeProxy::setDark(const QColor &dark) { D_D(DPlatformThemeProxy); return d->proxy->setDark(dark); } void DPlatformThemeProxy::setMid(const QColor &mid) { D_D(DPlatformThemeProxy); return d->proxy->setMid(mid); } void DPlatformThemeProxy::setShadow(const QColor &shadow) { D_D(DPlatformThemeProxy); return d->proxy->setShadow(shadow); } void DPlatformThemeProxy::setHighlight(const QColor &highlight) { D_D(DPlatformThemeProxy); return d->proxy->setHighlight(highlight); } void DPlatformThemeProxy::setHighlightedText(const QColor &highlightText) { D_D(DPlatformThemeProxy); return d->proxy->setHighlightedText(highlightText); } void DPlatformThemeProxy::setLink(const QColor &link) { D_D(DPlatformThemeProxy); return d->proxy->setLink(link); } void DPlatformThemeProxy::setLinkVisited(const QColor &linkVisited) { D_D(DPlatformThemeProxy); return d->proxy->setLinkVisited(linkVisited); } void DPlatformThemeProxy::setItemBackground(const QColor &itemBackground) { D_D(DPlatformThemeProxy); return d->proxy->setItemBackground(itemBackground); } void DPlatformThemeProxy::setTextTitle(const QColor &textTitle) { D_D(DPlatformThemeProxy); return d->proxy->setTextTitle(textTitle); } void DPlatformThemeProxy::setTextTips(const QColor &textTips) { D_D(DPlatformThemeProxy); return d->proxy->setTextTips(textTips); } void DPlatformThemeProxy::setTextWarning(const QColor &textWarning) { D_D(DPlatformThemeProxy); return d->proxy->setTextWarning(textWarning); } void DPlatformThemeProxy::setTextLively(const QColor &textLively) { D_D(DPlatformThemeProxy); return d->proxy->setTextLively(textLively); } void DPlatformThemeProxy::setLightLively(const QColor &lightLively) { D_D(DPlatformThemeProxy); return d->proxy->setLightLively(lightLively); } void DPlatformThemeProxy::setDarkLively(const QColor &darkLively) { D_D(DPlatformThemeProxy); return d->proxy->setDarkLively(darkLively); } void DPlatformThemeProxy::setFrameBorder(const QColor &frameBorder) { D_D(DPlatformThemeProxy); return d->proxy->setFrameBorder(frameBorder); } #endif void DPlatformThemeProxy::setDotsPerInch(const QString &screenName, int dpi) { D_D(DPlatformThemeProxy); return d->proxy->setDotsPerInch(screenName, dpi); } void DPlatformThemeProxy::setWindowRadius(int windowRadius) { D_D(DPlatformThemeProxy); return d->proxy->setWindowRadius(windowRadius); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/dplatformthemeproxy.h000066400000000000000000000252361476226662700217030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DPLATFORMTHEMEPROXY_H #define DPLATFORMTHEMEPROXY_H #include #include #include DGUI_USE_NAMESPACE DQUICK_BEGIN_NAMESPACE class DPlatformThemeProxyPrivate; class DPlatformThemeProxy : public QObject, public DTK_CORE_NAMESPACE::DObject { Q_OBJECT Q_PROPERTY(int cursorBlinkTime READ cursorBlinkTime WRITE setCursorBlinkTime NOTIFY cursorBlinkTimeChanged) Q_PROPERTY(int cursorBlinkTimeout READ cursorBlinkTimeout WRITE setCursorBlinkTimeout NOTIFY cursorBlinkTimeoutChanged) Q_PROPERTY(bool cursorBlink READ cursorBlink WRITE setCursorBlink NOTIFY cursorBlinkChanged) Q_PROPERTY(int doubleClickDistance READ doubleClickDistance WRITE setDoubleClickDistance NOTIFY doubleClickDistanceChanged) Q_PROPERTY(int doubleClickTime READ doubleClickTime WRITE setDoubleClickTime NOTIFY doubleClickTimeChanged) Q_PROPERTY(int dndDragThreshold READ dndDragThreshold WRITE setDndDragThreshold NOTIFY dndDragThresholdChanged) Q_PROPERTY(int windowRadius READ windowRadius WRITE setWindowRadius NOTIFY windowRadiusChanged) Q_PROPERTY(QByteArray themeName READ themeName WRITE setThemeName NOTIFY themeNameChanged) Q_PROPERTY(QByteArray iconThemeName READ iconThemeName WRITE setIconThemeName NOTIFY iconThemeNameChanged) Q_PROPERTY(QByteArray soundThemeName READ soundThemeName WRITE setSoundThemeName NOTIFY soundThemeNameChanged) // Font Q_PROPERTY(QByteArray fontName READ fontName WRITE setFontName NOTIFY fontNameChanged) Q_PROPERTY(QByteArray monoFontName READ monoFontName WRITE setMonoFontName NOTIFY monoFontNameChanged) Q_PROPERTY(qreal fontPointSize READ fontPointSize WRITE setFontPointSize NOTIFY fontPointSizeChanged) Q_PROPERTY(QByteArray gtkFontName READ gtkFontName WRITE setGtkFontName NOTIFY gtkFontNameChanged) Q_PROPERTY(QColor activeColor READ activeColor WRITE setActiveColor NOTIFY activeColorChanged) #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) // QPalette Q_PROPERTY(QColor window READ window WRITE setWindow NOTIFY windowChanged) Q_PROPERTY(QColor windowText READ windowText WRITE setWindowText NOTIFY windowTextChanged) Q_PROPERTY(QColor base READ base WRITE setBase NOTIFY baseChanged) Q_PROPERTY(QColor alternateBase READ alternateBase WRITE setAlternateBase NOTIFY alternateBaseChanged) Q_PROPERTY(QColor toolTipBase READ toolTipBase WRITE setToolTipBase NOTIFY toolTipBaseChanged) Q_PROPERTY(QColor toolTipText READ toolTipText WRITE setToolTipText NOTIFY toolTipTextChanged) Q_PROPERTY(QColor text READ text WRITE setText NOTIFY textChanged) Q_PROPERTY(QColor button READ button WRITE setButton NOTIFY buttonChanged) Q_PROPERTY(QColor buttonText READ buttonText WRITE setButtonText NOTIFY buttonTextChanged) Q_PROPERTY(QColor brightText READ brightText WRITE setBrightText NOTIFY brightTextChanged) Q_PROPERTY(QColor light READ light WRITE setLight NOTIFY lightChanged) Q_PROPERTY(QColor midlight READ midlight WRITE setMidlight NOTIFY midlightChanged) Q_PROPERTY(QColor dark READ dark WRITE setDark NOTIFY darkChanged) Q_PROPERTY(QColor mid READ mid WRITE setMid NOTIFY midChanged) Q_PROPERTY(QColor shadow READ shadow WRITE setShadow NOTIFY shadowChanged) Q_PROPERTY(QColor highlight READ highlight WRITE setHighlight NOTIFY highlightChanged) Q_PROPERTY(QColor highlightedText READ highlightedText WRITE setHighlightedText NOTIFY highlightedTextChanged) Q_PROPERTY(QColor link READ link WRITE setLink NOTIFY linkChanged) Q_PROPERTY(QColor linkVisited READ linkVisited WRITE setLinkVisited NOTIFY linkVisitedChanged) // DPalette Q_PROPERTY(QColor itemBackground READ itemBackground WRITE setItemBackground NOTIFY itemBackgroundChanged) Q_PROPERTY(QColor textTitle READ textTitle WRITE setTextTitle NOTIFY textTitleChanged) Q_PROPERTY(QColor textTips READ textTips WRITE setTextTips NOTIFY textTipsChanged) Q_PROPERTY(QColor textWarning READ textWarning WRITE setTextWarning NOTIFY textWarningChanged) Q_PROPERTY(QColor textLively READ textLively WRITE setTextLively NOTIFY textLivelyChanged) Q_PROPERTY(QColor lightLively READ lightLively WRITE setLightLively NOTIFY lightLivelyChanged) Q_PROPERTY(QColor darkLively READ darkLively WRITE setDarkLively NOTIFY darkLivelyChanged) Q_PROPERTY(QColor frameBorder READ frameBorder WRITE setFrameBorder NOTIFY frameBorderChanged) #endif Q_PROPERTY(int scrollBarPolicy READ scrollBarPolicy NOTIFY scrollBarPolicyChanged) public: explicit DPlatformThemeProxy(DPlatformTheme *proxy, QObject *parent = nullptr); ~DPlatformThemeProxy() override; int cursorBlinkTime() const; int cursorBlinkTimeout() const; bool cursorBlink() const; int doubleClickDistance() const; int doubleClickTime() const; int dndDragThreshold() const; int windowRadius() const; Q_INVOKABLE int windowRadius(int defaultValue) const; QByteArray themeName() const; QByteArray iconThemeName() const; QByteArray soundThemeName() const; QByteArray fontName() const; QByteArray monoFontName() const; qreal fontPointSize() const; QByteArray gtkFontName() const; QColor activeColor() const; bool isValidPalette() const; #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) QColor window() const; QColor windowText() const; QColor base() const; QColor alternateBase() const; QColor toolTipBase() const; QColor toolTipText() const; QColor text() const; QColor button() const; QColor buttonText() const; QColor brightText() const; QColor light() const; QColor midlight() const; QColor dark() const; QColor mid() const; QColor shadow() const; QColor highlight() const; QColor highlightedText() const; QColor link() const; QColor linkVisited() const; QColor itemBackground() const; QColor textTitle() const; QColor textTips() const; QColor textWarning() const; QColor textLively() const; QColor lightLively() const; QColor darkLively() const; QColor frameBorder() const; #endif int scrollBarPolicy() const; Q_INVOKABLE int dotsPerInch(const QString &screenName = QString()) const; public Q_SLOTS: void setCursorBlinkTime(int cursorBlinkTime); void setCursorBlinkTimeout(int cursorBlinkTimeout); void setCursorBlink(bool cursorBlink); void setDoubleClickDistance(int doubleClickDistance); void setDoubleClickTime(int doubleClickTime); void setDndDragThreshold(int dndDragThreshold); void setThemeName(const QByteArray &themeName); void setIconThemeName(const QByteArray &iconThemeName); void setSoundThemeName(const QByteArray &soundThemeName); void setFontName(const QByteArray &fontName); void setMonoFontName(const QByteArray &monoFontName); void setFontPointSize(qreal fontPointSize); void setGtkFontName(const QByteArray &fontName); void setActiveColor(const QColor activeColor); #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) void setWindow(const QColor &window); void setWindowText(const QColor &windowText); void setBase(const QColor &base); void setAlternateBase(const QColor &alternateBase); void setToolTipBase(const QColor &toolTipBase); void setToolTipText(const QColor &toolTipText); void setText(const QColor &text); void setButton(const QColor &button); void setButtonText(const QColor &buttonText); void setBrightText(const QColor &brightText); void setLight(const QColor &light); void setMidlight(const QColor &midlight); void setDark(const QColor &dark); void setMid(const QColor &mid); void setShadow(const QColor &shadow); void setHighlight(const QColor &highlight); void setHighlightedText(const QColor &highlightedText); void setLink(const QColor &link); void setLinkVisited(const QColor &linkVisited); void setItemBackground(const QColor &itemBackground); void setTextTitle(const QColor &textTitle); void setTextTips(const QColor &textTips); void setTextWarning(const QColor &textWarning); void setTextLively(const QColor &textLively); void setLightLively(const QColor &lightLively); void setDarkLively(const QColor &darkLively); void setFrameBorder(const QColor &frameBorder); #endif Q_INVOKABLE void setDotsPerInch(const QString &screenName, int dpi); void setWindowRadius(int windowRadius); Q_SIGNALS: void cursorBlinkTimeChanged(int cursorBlinkTime); void cursorBlinkTimeoutChanged(int cursorBlinkTimeout); void cursorBlinkChanged(bool cursorBlink); void doubleClickDistanceChanged(int doubleClickDistance); void doubleClickTimeChanged(int doubleClickTime); void dndDragThresholdChanged(int dndDragThreshold); void themeNameChanged(QByteArray themeName); void iconThemeNameChanged(QByteArray iconThemeName); void soundThemeNameChanged(QByteArray soundThemeName); void fontNameChanged(QByteArray fontName); void monoFontNameChanged(QByteArray monoFontName); void fontPointSizeChanged(qreal fontPointSize); void gtkFontNameChanged(QByteArray fontName); void activeColorChanged(QColor activeColor); void paletteChanged(DTK_GUI_NAMESPACE::DPalette palette); #if DTK_VERSION < DTK_VERSION_CHECK(6, 0, 0, 0) void windowChanged(QColor window); void windowTextChanged(QColor windowText); void baseChanged(QColor base); void alternateBaseChanged(QColor alternateBase); void toolTipBaseChanged(QColor toolTipBase); void toolTipTextChanged(QColor toolTipText); void textChanged(QColor text); void buttonChanged(QColor button); void buttonTextChanged(QColor buttonText); void brightTextChanged(QColor brightText); void lightChanged(QColor light); void midlightChanged(QColor midlight); void darkChanged(QColor dark); void midChanged(QColor mid); void shadowChanged(QColor shadow); void highlightChanged(QColor highlight); void highlightedTextChanged(QColor highlightedText); void linkChanged(QColor link); void linkVisitedChanged(QColor linkVisited); void itemBackgroundChanged(QColor itemBackground); void textTitleChanged(QColor textTitle); void textTipsChanged(QColor textTips); void textWarningChanged(QColor textWarning); void textLivelyChanged(QColor textLively); void lightLivelyChanged(QColor lightLively); void darkLivelyChanged(QColor darkLively); void frameBorderChanged(QColor frameBorder); #endif void dotsPerInchChanged(const QString &screen, int dpi); void windowRadiusChanged(int r); void scrollBarPolicyChanged(); private: D_DECLARE_PRIVATE(DPlatformThemeProxy) }; DQUICK_END_NAMESPACE #endif // DPLATFORMTHEMEPROXY_H dtkdeclarative-5.7.12/src/dqmlappmainwindowinterface.cpp000066400000000000000000000006431476226662700235300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dqmlappmainwindowinterface.h" DQUICK_BEGIN_NAMESPACE void DQmlAppMainWindowInterface::initialize(QQmlApplicationEngine *engine) { Q_UNUSED(engine); } void DQmlAppMainWindowInterface::finishedLoading(QQmlApplicationEngine *engine) { Q_UNUSED(engine); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/dqmlappmainwindowinterface.h000066400000000000000000000016061476226662700231750ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQMLAPPMAINWINDOWINTERFACE_H #define DQMLAPPMAINWINDOWINTERFACE_H #include #include #define DQmlAppMainWindowInterface_iid "dtk.qml.app.mainwindow.interface" QT_BEGIN_NAMESPACE class QQmlApplicationEngine; QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class DQmlAppMainWindowInterface { public: DQmlAppMainWindowInterface() = default; virtual ~DQmlAppMainWindowInterface() = default; virtual QUrl mainComponentPath() const = 0; virtual void initialize(QQmlApplicationEngine *engine); virtual void finishedLoading(QQmlApplicationEngine *engine); }; DQUICK_END_NAMESPACE Q_DECLARE_INTERFACE(DTK_QUICK_NAMESPACE::DQmlAppMainWindowInterface, DQmlAppMainWindowInterface_iid) #endif // DQMLAPPPLUGININTERFACE_H dtkdeclarative-5.7.12/src/dqmlapppreloadinterface.cpp000066400000000000000000000012071476226662700227770ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dqmlapppreloadinterface.h" #include DQUICK_BEGIN_NAMESPACE void DQmlAppPreloadInterface::aboutToPreload(QQmlApplicationEngine *engine) { Q_UNUSED(engine); } QGuiApplication *DQmlAppPreloadInterface::creatApplication(int &argc, char **argv) { if (qGuiApp) return qGuiApp; return new QGuiApplication(argc, argv); } QSGRendererInterface::GraphicsApi DQmlAppPreloadInterface::graphicsApi() { return QSGRendererInterface::Unknown; // auto select. } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/dqmlapppreloadinterface.h000066400000000000000000000017651476226662700224550ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQMLAPPPLUGINPRELOADINTERFACE_H #define DQMLAPPPLUGINPRELOADINTERFACE_H #include #include #define DQmlAppPreloadInterface_iid "dtk.qml.app.preload.interface" QT_BEGIN_NAMESPACE class QGuiApplication; class QQmlApplicationEngine; class QQmlEngine; QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class DQmlAppPreloadInterface { public: DQmlAppPreloadInterface() = default; virtual ~DQmlAppPreloadInterface() = default; virtual QUrl preloadComponentPath() const = 0; virtual void aboutToPreload(QQmlApplicationEngine *engine); virtual QGuiApplication *creatApplication(int &argc, char **argv); virtual QSGRendererInterface::GraphicsApi graphicsApi(); }; DQUICK_END_NAMESPACE Q_DECLARE_INTERFACE(DTK_QUICK_NAMESPACE::DQmlAppPreloadInterface, DQmlAppPreloadInterface_iid) #endif // DQMLAPPPLUGINPRELOADINTERFACE_H dtkdeclarative-5.7.12/src/dquickblitframebuffer.cpp000066400000000000000000000075641476226662700224650ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickblitframebuffer.h" #include "private/dblitframebuffernode_p.h" #include #include #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) #include #else #include #endif DQUICK_BEGIN_NAMESPACE class Q_DECL_HIDDEN BlitFrameTextureProvider : public QSGTextureProvider { public: BlitFrameTextureProvider() : QSGTextureProvider() { } inline QSGTexture *texture() const override { return m_texture; } inline void setTexture(QSGTexture *tex) { m_texture = tex; } private: QSGTexture *m_texture = nullptr; }; class Q_DECL_HIDDEN DQuickBlitFramebufferPrivate : public DCORE_NAMESPACE::DObjectPrivate { public: DQuickBlitFramebufferPrivate(DQuickBlitFramebuffer *qq) : DObjectPrivate(qq) { } mutable BlitFrameTextureProvider *tp = nullptr; }; DQuickBlitFramebuffer::DQuickBlitFramebuffer(QQuickItem *parent) : QQuickItem(parent) , DObject(*new DQuickBlitFramebufferPrivate(this)) { setFlag(ItemHasContents); } DQuickBlitFramebuffer::~DQuickBlitFramebuffer() { DQuickBlitFramebuffer::releaseResources(); } bool DQuickBlitFramebuffer::isTextureProvider() const { return true; } QSGTextureProvider *DQuickBlitFramebuffer::textureProvider() const { D_DC(DQuickBlitFramebuffer); QQuickWindow *w = window(); if (!w || !w->isSceneGraphInitialized() || QThread::currentThread() != QQuickWindowPrivate::get(w)->context->thread()) { qWarning("DQuickBlitFramebuffer::textureProvider: can only be queried on the rendering thread of an exposed window"); return nullptr; } if (!d->tp) { d->tp = new BlitFrameTextureProvider(); } return d->tp; } void DQuickBlitFramebuffer::invalidateSceneGraph() { D_D(DQuickBlitFramebuffer); delete d->tp; d->tp = nullptr; } static void onRender(DBlitFramebufferNode *node, void *data) { auto *d = reinterpret_cast(data); if (!d->tp) return; d->tp->setTexture(node->texture()); // Don't direct emit the signal, must ensure the signal emit on current render loop after. d->tp->metaObject()->invokeMethod(d->tp, &BlitFrameTextureProvider::textureChanged, Qt::QueuedConnection); } QSGNode *DQuickBlitFramebuffer::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *oldData) { Q_UNUSED(oldData) auto node = static_cast(oldNode); if (Q_LIKELY(node)) { node->resize(size()); return node; } D_DC(DQuickBlitFramebuffer); auto ri = window()->rendererInterface(); if (ri->graphicsApi() == QSGRendererInterface::Software) { node = DBlitFramebufferNode::createSoftwareNode(this, false, false); } #ifndef QT_NO_OPENGL else if (ri->graphicsApi() == QSGRendererInterface::OpenGL #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) || ri->graphicsApi() == QSGRendererInterface::OpenGLRhi #endif ) { node = DBlitFramebufferNode::createOpenGLNode(this, false, false); } #endif else { qWarning() << "Not supported graphics API:" << ri->graphicsApi(); return nullptr; } node->setRenderCallback(onRender, const_cast(d)); node->resize(size()); return node; } void DQuickBlitFramebuffer::itemChange(ItemChange type, const ItemChangeData &data) { if (type == ItemDevicePixelRatioHasChanged) { update(); } QQuickItem::itemChange(type, data); } void DQuickBlitFramebuffer::releaseResources() { D_D(DQuickBlitFramebuffer); if (d->tp) { QQuickWindowQObjectCleanupJob::schedule(window(), d->tp); d->tp = nullptr; } } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/dquickblitframebuffer.h000066400000000000000000000020721476226662700221170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2021 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKBLITFRAMEBUFFER_H #define DQUICKBLITFRAMEBUFFER_H #include #include #include DQUICK_BEGIN_NAMESPACE class DQuickBlitFramebufferPrivate; class Q_DECL_EXPORT DQuickBlitFramebuffer : public QQuickItem, public DCORE_NAMESPACE::DObject { Q_OBJECT D_DECLARE_PRIVATE(DQuickBlitFramebuffer) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(BlitFramebuffer) #endif public: explicit DQuickBlitFramebuffer(QQuickItem *parent = nullptr); ~DQuickBlitFramebuffer(); bool isTextureProvider() const override; QSGTextureProvider *textureProvider() const override; private Q_SLOTS: void invalidateSceneGraph(); private: QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override; void itemChange(ItemChange, const ItemChangeData &) override; void releaseResources() override; }; DQUICK_END_NAMESPACE #endif // DQUICKBLITFRAMEBUFFER_H dtkdeclarative-5.7.12/src/dquickitemviewport.cpp000066400000000000000000000457561476226662700220710ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickitemviewport.h" #include "private/dquickitemviewport_p.h" #include "private/dmaskeffectnode_p.h" #include "private/dsoftwareroundedimagenode_p.h" #include #include #include DQUICK_BEGIN_NAMESPACE template inline static T *load(const QAtomicPointer &atomicValue) { #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) return atomicValue.load(); #else return atomicValue.loadRelaxed(); #endif } class Q_DECL_HIDDEN PreprocessNode : public QSGTransformNode { public: PreprocessNode(DQuickItemViewportPrivate *item) : item(item) { setFlag(IsVisitableNode, false); item->setPreprocessNode(this); } ~PreprocessNode() { if (auto i = load(item)) i->clearPreprocessNode(this); } inline void setImageNode(QSGImageNode *node) { Q_ASSERT(!softwareNode); Q_ASSERT(!imageNode); maskNode = dynamic_cast(node); imageNode = node; appendChildNode(imageNode); } inline void setImageNode(DSoftwareRoundedImageNode *node) { Q_ASSERT(!softwareNode); Q_ASSERT(!imageNode); softwareNode = node; appendChildNode(softwareNode); } inline void clearImageNode() { delete imageNode; imageNode = nullptr; maskNode = nullptr; delete softwareNode; softwareNode = nullptr; } void preprocess() override { auto i = load(item); if (Q_UNLIKELY(!i)) return; const QPointF newPos = i->q_func()->mapToItem(i->sourceItem.data(), QPointF(0, 0)); if (!i->updateOffset(newPos)) return; if (imageNode) { i->updateSourceRect(imageNode); if (maskNode) { maskNode->setMaskOffset(i->getMaskOffset()); } } else if (softwareNode) { i->updateSourceRect(softwareNode); } } QAtomicPointer item; MaskEffectNode *maskNode = nullptr; QSGImageNode *imageNode = nullptr; DSoftwareRoundedImageNode *softwareNode = nullptr; }; DQuickItemViewportPrivate::~DQuickItemViewportPrivate() { if (auto node = load(preprocessNode)) node->item = nullptr; // 清理对sourceItem的操作 initSourceItem(sourceItem, nullptr); } void DQuickItemViewportPrivate::initSourceItem(QQuickItem *old, QQuickItem *item) { if (old) { QQuickItemPrivate *sd = QQuickItemPrivate::get(old); sd->removeItemChangeListener(this, QQuickItemPrivate::Geometry); sd->derefFromEffectItem(hideSource); } // 监听材质变化的信号 if (textureChangedConnection) QObject::disconnect(textureChangedConnection); if (item) { QQuickItemPrivate *sd = QQuickItemPrivate::get(item); sd->addItemChangeListener(this, QQuickItemPrivate::Geometry); sd->refFromEffectItem(hideSource); } } void DQuickItemViewportPrivate::itemGeometryChanged(QQuickItem *, QQuickGeometryChange data, const QRectF &) { D_Q(DQuickItemViewport); // 当DQuickItemViewport或其sourceItem的大小改变时应当更新sourceSizeRatio和maskOffset if (data.sizeChange()) { markDirtys(DirtySourceSizeRatio | DirtyMaskOffset); q->update(); } } void DQuickItemViewportPrivate::setPreprocessNode(PreprocessNode *newNode) { Q_ASSERT(load(preprocessNode) == nullptr); newNode->item = this; preprocessNode = newNode; updateUsePreprocess(); } void DQuickItemViewportPrivate::clearPreprocessNode(PreprocessNode *oldNode) { Q_ASSERT(load(preprocessNode) == oldNode); preprocessNode = nullptr; } void DQuickItemViewportPrivate::updateUsePreprocess() const { if (auto pn = load(preprocessNode)) { pn->setFlag(QSGNode::UsePreprocess, !fixed && (pn->imageNode || pn->softwareNode)); } } void DQuickItemViewportPrivate::ensureTexture() { D_Q(DQuickItemViewport); if (texture) return; Q_ASSERT_X(QQuickItemPrivate::get(q)->window && QQuickItemPrivate::get(q)->sceneGraphRenderContext() && QThread::currentThread() == QQuickItemPrivate::get(q)->sceneGraphRenderContext()->thread(), "DQuickItemViewport", "Cannot be used outside the rendering thread"); QSGRenderContext *rc = QQuickItemPrivate::get(q)->sceneGraphRenderContext(); texture = rc->sceneGraphContext()->createLayer(rc); QObject::connect(QQuickItemPrivate::get(q)->window, SIGNAL(sceneGraphInvalidated()), texture, SLOT(invalidated()), Qt::DirectConnection); QObject::connect(texture, SIGNAL(updateRequested()), q, SLOT(update())); } /*! * \~chinese \class DQuickItemViewport * \~chinese \brief DQuickItemViewport 类是根据 \a sourceItem 属性设定的 \a QQuickItem * \~chinese 作为绘制时的材质来源,这个行为依赖于 \a QQuickItem::textureProvider 提供组件的 * \~chinese 材质。故可将qml的 Image 和 ShaderEffectSource 作为 sourceItem 使用。 * \~chinese * \~chinese 源材质的区域受 \a sourceRect 属性控制。此属性的坐标相对于 \a sourceItem,当属性未 * \~chinese 设置时,坐标默认为 (0, 0),大小则跟随 DQuickItemViewport。此外,当 \a fixed 的值 * \~chinese 为 false 时,源材质的位置还会受到 DQuickItemViewport 相对于 \a sourceItem 的位置 * \~chinese 的影响,即当 \a fixed 为 false 且 \a sourceRect 的坐标为 (0, 0) 时,源材质的位置 * \~chinese 是 DQuickItemViewport 在窗口坐标系中对 \a sourceItem 的投影,且绘制时也会实时跟随。 * \~chinese 当 \a radius 属性为 0 时,将直接使用 \a QSGImageNode 作为渲染节点,当其值大于 0 * \~chinese 时,将使用 QPainter 渲染按 radius 的值绘制一张圆角 QImage 资源,并将其作为 mask * \~chinese 材质跟 \a sourceItem 的材质一起运算,并且会使用自定义的片段着色器为材质实现圆角效果。 * \~chinese \sa QQuickItem::textureProvider * \~chinese \sa QQuickItem::isTextureProvider */ DQuickItemViewport::DQuickItemViewport(QQuickItem *parent) : QQuickItem (parent) , DCORE_NAMESPACE::DObject(*new DQuickItemViewportPrivate(this)) { setFlag(ItemHasContents); } DQuickItemViewport::~DQuickItemViewport() { if (window()) { DQuickItemViewport::releaseResources(); } } QQuickItem *DQuickItemViewport::sourceItem() const { D_DC(DQuickItemViewport); return d->sourceItem; } QRectF DQuickItemViewport::sourceRect() const { D_DC(DQuickItemViewport); return d->sourceRect; } float DQuickItemViewport::radius() const { D_DC(DQuickItemViewport); return d->radius; } bool DQuickItemViewport::fixed() const { D_DC(DQuickItemViewport); return d->fixed; } void DQuickItemViewport::setFixed(bool newFixed) { D_D(DQuickItemViewport); if (d->fixed == newFixed) return; d->fixed = newFixed; Q_EMIT fixedChanged(); update(); } bool DQuickItemViewport::hideSource() const { D_DC(DQuickItemViewport); return d->hideSource; } void DQuickItemViewport::setHideSource(bool newHideSource) { D_D(DQuickItemViewport); if (d->hideSource == newHideSource) return; if (d->sourceItem) { QQuickItemPrivate::get(d->sourceItem)->refFromEffectItem(newHideSource); QQuickItemPrivate::get(d->sourceItem)->derefFromEffectItem(d->hideSource); } d->hideSource = newHideSource; Q_EMIT hideSourceChanged(); } QSGTextureProvider *DQuickItemViewport::textureProvider() const { D_DC(DQuickItemViewport); if (!d->sourceItem) return nullptr; auto provider = d->sourceItem->textureProvider(); if (provider) return provider; if (!d->provider) { const_cast(this)->d_func()->provider = new DQuickViewportTextureProvider(); const_cast(this)->d_func()->ensureTexture(); connect(d->texture, SIGNAL(updateRequested()), d->provider, SIGNAL(textureChanged())); d->provider->sourceTexture = d->texture; } return d->provider; } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QPainter::CompositionMode DQuickItemViewport::compositionMode() const { D_DC(DQuickItemViewport); return d->compositionMode; } void DQuickItemViewport::setCompositionMode(QPainter::CompositionMode newCompositionMode) { D_D(DQuickItemViewport); if (d->compositionMode == newCompositionMode) return; if (d->compositionMode == DQuickItemViewportPrivate::DefaultCompositionMode || newCompositionMode == DQuickItemViewportPrivate::DefaultCompositionMode) { d->markDirty(DQuickItemViewportPrivate::DirtyContentNode); } d->compositionMode = newCompositionMode; Q_EMIT compositionModeChanged(); } void DQuickItemViewport::resetCompositionMode() { setCompositionMode(DQuickItemViewportPrivate::DefaultCompositionMode); } #endif void DQuickItemViewport::invalidateSceneGraph() { D_D(DQuickItemViewport); if (d->texture) delete d->texture; if (d->provider) delete d->provider; d->texture = nullptr; d->maskTexture.reset(); d->provider = nullptr; } void DQuickItemViewport::setSourceItem(QQuickItem *sourceItem) { D_D(DQuickItemViewport); if (d->sourceItem == sourceItem) return; if (isComponentComplete()) { d->initSourceItem(d->sourceItem, sourceItem); } d->sourceItem = sourceItem; d->markDirtys(DQuickItemViewportPrivate::DirtySourceSizeRatio | DQuickItemViewportPrivate::DirtyMaskOffset); Q_EMIT sourceItemChanged(); update(); } void DQuickItemViewport::setSourceRect(const QRectF &sourceRect) { D_D(DQuickItemViewport); if (d->sourceRect == sourceRect) return; if (d->sourceRect.topLeft() != sourceRect.topLeft()) d->markDirty(DQuickItemViewportPrivate::DirtyMaskOffset); if (d->sourceRect.size() != sourceRect.size()) d->markDirtys(DQuickItemViewportPrivate::DirtySourceSizeRatio | DQuickItemViewportPrivate::DirtyMaskSizeRatio); d->sourceRect = sourceRect; Q_EMIT sourceRectChanged(); update(); } void DQuickItemViewport::setRadius(float radius) { // TODO:目前深浅色融合在着色器中完成,融合不支持圆角为0 D_D(DQuickItemViewport); if (qFuzzyCompare(d->radius, radius)) return; if (qIsNull(d->radius) || qIsNull(radius)) { d->markDirty(DQuickItemViewportPrivate::DirtyContentNode); } d->markDirtys(DQuickItemViewportPrivate::DirtyMaskSizeRatio | DQuickItemViewportPrivate::DirtyMaskTexture); d->radius = radius; Q_EMIT radiusChanged(); update(); } void DQuickItemViewport::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data) { D_D(DQuickItemViewport); switch (static_cast(change)) { case ItemAntialiasingHasChanged: d->markDirty(DQuickItemViewportPrivate::DirtyMaskTexture); update(); break; case ItemDevicePixelRatioHasChanged: d->markDirtys(DQuickItemViewportPrivate::DirtyMaskTexture | DQuickItemViewportPrivate::DirtyMaskSizeRatio); update(); break; } QQuickItem::itemChange(change, data); } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) void DQuickItemViewport::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { D_D(DQuickItemViewport); if (!d->sourceRect.isValid() && newGeometry.size() != oldGeometry.size()) { d->markDirty(DQuickItemViewportPrivate::DirtyMaskSizeRatio); if (!d->sourceRect.isValid()) d->markDirty(DQuickItemViewportPrivate::DirtySourceSizeRatio); } QQuickItem::geometryChanged(newGeometry, oldGeometry); } #else void DQuickItemViewport::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) { D_D(DQuickItemViewport); if (!d->sourceRect.isValid() && newGeometry.size() != oldGeometry.size()) { d->markDirty(DQuickItemViewportPrivate::DirtyMaskSizeRatio); if (!d->sourceRect.isValid()) d->markDirty(DQuickItemViewportPrivate::DirtySourceSizeRatio); } QQuickItem::geometryChange(newGeometry, oldGeometry); } #endif static inline void safeSetMaterialBlending(QSGMaterial *m, bool b) { if (m && m != reinterpret_cast(1)) { m->setFlag(QSGMaterial::Blending, b); } } QSGNode *DQuickItemViewport::updatePaintNode(QSGNode *old, QQuickItem::UpdatePaintNodeData *) { D_D(DQuickItemViewport); if (Q_UNLIKELY(!d->sourceItem || d->sourceItem->width() <=0 || d->sourceItem->height() <= 0)) { delete old; return nullptr; } const auto tp = this->textureProvider(); if (Q_LIKELY(!tp)) { delete old; return nullptr; } if (auto texture = qobject_cast(tp->texture())) { texture->setItem(QQuickItemPrivate::get(d->sourceItem)->itemNode()); QRectF sourceRect = d->sourceRect.width() == 0 || d->sourceRect.height() == 0 ? QRectF(0, 0, d->sourceItem->width(), d->sourceItem->height()) : d->sourceRect; texture->setRect(sourceRect); QSize textureSize = QSize(qCeil(qAbs(sourceRect.width())), qCeil(qAbs(sourceRect.height()))); QQuickItemPrivate *item_d = static_cast(QObjectPrivate::get(this)); if (d->sourceItem) textureSize *= item_d->window->effectiveDevicePixelRatio(); const QSize minTextureSize = item_d->sceneGraphContext()->minimumFBOSize(); while (textureSize.width() < minTextureSize.width()) textureSize.rwidth() *= 2; while (textureSize.height() < minTextureSize.height()) textureSize.rheight() *= 2; texture->setDevicePixelRatio(item_d->window->effectiveDevicePixelRatio()); texture->setSize(textureSize); texture->updateTexture(); } PreprocessNode *preNode = static_cast(old); if (Q_UNLIKELY(!preNode)) { preNode = new PreprocessNode(d); if (!d->textureChangedConnection) { // 注意不要将此代码移动到别处,有些对象不允许在非渲染线程中获取 textureProvider auto onTextureChanged = [this, d, tp] { auto preNode = load(d->preprocessNode); Q_ASSERT(preNode); auto texture = tp->texture(); if (Q_LIKELY(texture)) { if (Q_LIKELY(preNode->imageNode)) { if (preNode->imageNode->texture() != texture) { preNode->imageNode->setTexture(texture); } // Maybe the texture size is changed d->updateSourceRect(preNode->imageNode); } else if (Q_LIKELY(preNode->softwareNode)) { if (preNode->softwareNode->texture() != texture) { preNode->softwareNode->setTexture(texture); } // Maybe the texture size is changed d->updateSourceRect(preNode->softwareNode); } else { // to create image node update(); } } else { preNode->clearImageNode(); d->updateUsePreprocess(); } }; if (tp) d->textureChangedConnection = QObject::connect(tp, &QSGTextureProvider::textureChanged, this, onTextureChanged, Qt::DirectConnection); } } if (Q_UNLIKELY(d->dirtyState.testFlag(DQuickItemViewportPrivate::DirtyContentNode))) { d->markDirty(DQuickItemViewportPrivate::DirtyContentNode, false); preNode->clearImageNode(); } QSGImageNode *imageNode = preNode->imageNode; DSoftwareRoundedImageNode *softwareNode = preNode->softwareNode; const bool useMaskNode = d->needMaskNode(); const bool usingMaskNode = preNode->maskNode || preNode->softwareNode; if (useMaskNode != usingMaskNode) { Q_ASSERT(!preNode->maskNode); Q_ASSERT(!preNode->softwareNode); } if (Q_UNLIKELY(!imageNode && !softwareNode) && Q_LIKELY(tp->texture())) { if (useMaskNode) { // 创建image node QSGRendererInterface *ri = window()->rendererInterface(); Q_ASSERT(ri); if (Q_UNLIKELY(ri->graphicsApi() == QSGRendererInterface::Software)) { softwareNode = new DSoftwareRoundedImageNode(this); } else { imageNode = new MaskEffectNode; } } else { imageNode = window()->createImageNode(); } if (imageNode) { safeSetMaterialBlending(imageNode->material(), useMaskNode); safeSetMaterialBlending(imageNode->opaqueMaterial(), useMaskNode); imageNode->setOwnsTexture(false); imageNode->setTexture(tp->texture()); preNode->setImageNode(imageNode); } else { Q_ASSERT(softwareNode); softwareNode->setTexture(tp->texture()); preNode->setImageNode(softwareNode); } } d->updateUsePreprocess(); if (Q_LIKELY(imageNode)) { imageNode->setFiltering(smooth() ? QSGTexture::Linear : QSGTexture::Nearest); // 目标绘制区域 imageNode->setRect(QRectF(QPointF(0, 0), size())); d->updateSourceRect(imageNode); if (useMaskNode) { auto maskNode = static_cast(imageNode); maskNode->setMaskOffset(d->getMaskOffset()); maskNode->setSourceScale(d->getSoureSizeRatio()); maskNode->setMaskTexture(d->textureForRadiusMask()); maskNode->setMaskScale(d->getMaskSizeRatio()); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) maskNode->setCompositionMode(d->compositionMode); #endif } } else if (softwareNode) { softwareNode->setSmooth(smooth()); softwareNode->setRect(QRectF(QPointF(0, 0), size())); softwareNode->setRadius(d->radius); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) softwareNode->setCompositionMode(d->compositionMode); #endif d->updateSourceRect(softwareNode); } return preNode; } void DQuickItemViewport::componentComplete() { D_D(DQuickItemViewport); if (d->sourceItem) d->initSourceItem(nullptr, d->sourceItem); return QQuickItem::componentComplete(); } void DQuickItemViewport::releaseResources() { D_D(DQuickItemViewport); if (d->texture || d->provider || d->maskTexture) { window()->scheduleRenderJob(new DQuickViewportCleanup(d->texture, d->maskTexture, d->provider), QQuickWindow::AfterSynchronizingStage); d->texture = nullptr; d->provider = nullptr; d->maskTexture.reset(); } } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/dquickitemviewport.h000066400000000000000000000055021476226662700215170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKITEMVIEWPORT_H #define DQUICKITEMVIEWPORT_H #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #endif DQUICK_BEGIN_NAMESPACE class DQuickItemViewportPrivate; class DQuickItemViewport : public QQuickItem, public DCORE_NAMESPACE::DObject { Q_OBJECT Q_PROPERTY(QQuickItem* sourceItem READ sourceItem WRITE setSourceItem NOTIFY sourceItemChanged) Q_PROPERTY(QRectF sourceRect READ sourceRect WRITE setSourceRect NOTIFY sourceRectChanged) Q_PROPERTY(float radius READ radius WRITE setRadius NOTIFY radiusChanged) Q_PROPERTY(bool fixed READ fixed WRITE setFixed NOTIFY fixedChanged) Q_PROPERTY(bool hideSource READ hideSource WRITE setHideSource NOTIFY hideSourceChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) Q_PROPERTY(QPainter::CompositionMode compositionMode READ compositionMode WRITE setCompositionMode NOTIFY compositionModeChanged RESET resetCompositionMode) #endif D_DECLARE_PRIVATE(DQuickItemViewport) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_NAMED_ELEMENT(ItemViewport) #endif public: explicit DQuickItemViewport(QQuickItem *parent = nullptr); ~DQuickItemViewport() override; QQuickItem* sourceItem() const; void setSourceItem(QQuickItem* sourceItem); QRectF sourceRect() const; void setSourceRect(const QRectF &sourceRect); float radius() const; void setRadius(float radius); bool fixed() const; void setFixed(bool newFixed); bool hideSource() const; void setHideSource(bool newHideSource); bool isTextureProvider() const override { return true; } QSGTextureProvider *textureProvider() const override; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QPainter::CompositionMode compositionMode() const; void setCompositionMode(QPainter::CompositionMode newCompositionMode); void resetCompositionMode(); #endif Q_SIGNALS: void sourceItemChanged(); void sourceRectChanged(); void radiusChanged(); void fixedChanged(); void hideSourceChanged(); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) void compositionModeChanged(); #endif private Q_SLOTS: void invalidateSceneGraph(); protected: void itemChange(ItemChange, const ItemChangeData &) override; #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override; #else void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override; #endif QSGNode *updatePaintNode(QSGNode *old, UpdatePaintNodeData *) override; void componentComplete() override; void releaseResources() override; }; DQUICK_END_NAMESPACE #endif // DQUICKITEMVIEWPORT_H dtkdeclarative-5.7.12/src/dquicksystempalette.cpp000066400000000000000000000237001476226662700222170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquicksystempalette.h" #include "private/dquicksystempalette_p.h" #include #include DGUI_USE_NAMESPACE DQUICK_BEGIN_NAMESPACE #define RETURNCOLOR_BYROLE(_role) \ { \ D_DC(DQuickSystemPalette); \ return d->palette.color(d->colorGroup, (_role)); \ } DQuickSystemPalettePrivate::DQuickSystemPalettePrivate(DQuickSystemPalette *qq) : DObjectPrivate(qq) { // 初始化调色板 palette = DGuiApplicationHelper::instance()->applicationPalette(); } DQuickSystemPalette::DQuickSystemPalette(QObject *parent) : QObject(parent) , DObject(*new DQuickSystemPalettePrivate(this)) { connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::applicationPaletteChanged, this, [this] { // 重置调色板 D_D(DQuickSystemPalette); d->palette = DGuiApplicationHelper::instance()->applicationPalette(); Q_EMIT paletteChanged(); }); } /*! * \~chinese \class DQuickSystemPalette * * \~chinese \brief DQuickSystemPalette 是 DTk 自定义 QML 类型,用于在 QML 中使用调色板相关功能的类。 * \~chinese 继承自 QObject,DObject,QQmlParserStatus,需要在 QML 中配合 Item 一起使用,通过 * \~chinese 属性 sourceItem 可以绑定一个 Item 控件,根据控件状态获取相应调色板调色板的值。 */ DQuickSystemPalette::~DQuickSystemPalette() { } const DPalette &DQuickSystemPalette::palette() const { D_DC(DQuickSystemPalette); return d->palette; } DQuickSystemPalette::ColorGroup DQuickSystemPalette::colorGroup() const { D_DC(DQuickSystemPalette); return static_cast(d->colorGroup); } /*! * \~chinese \brief DQuickSystemPalette::window window 用于获取 DPalette 的 window 类型的颜色值。 * \~chinese \return window 返回 DPalette 的 window 类型的颜色值。 */ QColor DQuickSystemPalette::window() const { RETURNCOLOR_BYROLE(QPalette::Window); } /*! * \~chinese \brief DQuickSystemPalette::window windowText 用于获取 DPalette 的 windowText 类型的颜色值。 * \~chinese \return windowText 返回 DPalette 的 windowText 类型的颜色值。 */ QColor DQuickSystemPalette::windowText() const { RETURNCOLOR_BYROLE(QPalette::WindowText); } /*! * \~chinese \brief DQuickSystemPalette::window base 用于获取 DPalette 的 base 类型的颜色值。 * \~chinese \return base 返回 DPalette 的 base 类型的颜色值。 */ QColor DQuickSystemPalette::base() const { RETURNCOLOR_BYROLE(QPalette::Base); } /*! * \~chinese \brief DQuickSystemPalette::window text 用于获取 DPalette 的 text 类型的颜色值。 * \~chinese \return text 返回 DPalette 的 text 类型的颜色值。 */ QColor DQuickSystemPalette::text() const { RETURNCOLOR_BYROLE(QPalette::Text); } /*! * \~chinese \brief DQuickSystemPalette::window alternateBase 用于获取 DPalette 的 alternateBase 类型的颜色值。 * \~chinese \return alternateBase 返回 DPalette 的 alternateBase 类型的颜色值。 */ QColor DQuickSystemPalette::alternateBase() const { RETURNCOLOR_BYROLE(QPalette::AlternateBase); } /*! * \~chinese \brief DQuickSystemPalette::window button 用于获取 DPalette 的 button 类型的颜色值。 * \~chinese \return button 返回 DPalette 的 button 类型的颜色值。 */ QColor DQuickSystemPalette::button() const { RETURNCOLOR_BYROLE(QPalette::Button); } /*! * \~chinese \brief DQuickSystemPalette::window buttonText 用于获取 DPalette 的 buttonText 类型的颜色值。 * \~chinese \return buttonText 返回 DPalette 的 buttonText 类型的颜色值。 */ QColor DQuickSystemPalette::buttonText() const { RETURNCOLOR_BYROLE(QPalette::ButtonText); } /*! * \~chinese \brief DQuickSystemPalette::light light 用于获取 DPalette 的 light 类型的颜色值。 * \~chinese \return light 返回 DPalette 的 light 类型的颜色值。 */ QColor DQuickSystemPalette::light() const { RETURNCOLOR_BYROLE(QPalette::Light); } /*! * \~chinese \brief DQuickSystemPalette::midlight midlight 用于获取 DPalette 的 midlight 类型的颜色值。 * \~chinese \return midlight 返回 DPalette 的 midlight 类型的颜色值。 */ QColor DQuickSystemPalette::midlight() const { RETURNCOLOR_BYROLE(QPalette::Midlight); } /*! * \~chinese \brief DQuickSystemPalette::dark dark 用于获取 DPalette 的 dark 类型的颜色值。 * \~chinese \return dark 返回 DPalette 的 dark 类型的颜色值。 */ QColor DQuickSystemPalette::dark() const { RETURNCOLOR_BYROLE(QPalette::Dark); } /*! * \~chinese \brief DQuickSystemPalette::mid mid 用于获取 DPalette 的 mid 类型的颜色值。 * \~chinese \return mid 返回 DPalette 的 mid 类型的颜色值。 */ QColor DQuickSystemPalette::mid() const { RETURNCOLOR_BYROLE(QPalette::Mid); } /*! * \~chinese \brief DQuickSystemPalette::shadow shadow 用于获取 DPalette 的 shadow 类型的颜色值。 * \~chinese \return shadow 返回 DPalette 的 shadow 类型的颜色值。 */ QColor DQuickSystemPalette::shadow() const { RETURNCOLOR_BYROLE(QPalette::Shadow); } /*! * \~chinese \brief DQuickSystemPalette::highlight highlight 用于获取 DPalette 的 highlight 类型的颜色值。 * \~chinese \return highlight 返回 DPalette 的 highlight 类型的颜色值。 */ QColor DQuickSystemPalette::highlight() const { RETURNCOLOR_BYROLE(QPalette::Highlight); } /*! * \~chinese \brief DQuickSystemPalette::highlightedText highlightedText 用于获取 DPalette 的 highlightedText 类型的颜色值。 * \~chinese \return highlightedText 返回 DPalette 的 highlightedText 类型的颜色值。 */ QColor DQuickSystemPalette::highlightedText() const { RETURNCOLOR_BYROLE(QPalette::HighlightedText); } /*! * \~chinese \brief DQuickSystemPalette::itemBackground itemBackground 用于获取 DPalette 的 itemBackground 类型的颜色值。 * \~chinese \return itemBackground 返回 DPalette 的 itemBackground 类型的颜色值。 */ QColor DQuickSystemPalette::itemBackground() const { RETURNCOLOR_BYROLE(DPalette::ItemBackground); } /*! * \~chinese \brief DQuickSystemPalette::textTitle textTitle 用于获取 DPalette 的 textTitle 类型的颜色值。 * \~chinese \return textTitle 返回 DPalette 的 textTitle 类型的颜色值。 */ QColor DQuickSystemPalette::textTitle() const { RETURNCOLOR_BYROLE(DPalette::TextTitle); } /*! * \~chinese \brief DQuickSystemPalette::textTips textTips 用于获取 DPalette 的 textTips 类型的颜色值。 * \~chinese \return textTips 返回 DPalette 的 textTips 类型的颜色值。 */ QColor DQuickSystemPalette::textTips() const { RETURNCOLOR_BYROLE(DPalette::TextTips); } /*! * \~chinese \brief DQuickSystemPalette::textWarning textWarning 用于获取 DPalette 的 textWarning 类型的颜色值。 * \~chinese \return textWarning 返回 DPalette 的 textWarning 类型的颜色值。 */ QColor DQuickSystemPalette::textWarning() const { RETURNCOLOR_BYROLE(DPalette::TextWarning); } /*! * \~chinese \brief DQuickSystemPalette::textLively textLively 用于获取 DPalette 的 textLively 类型的颜色值。 * \~chinese \return textLively 返回 DPalette 的 textLively 类型的颜色值。 */ QColor DQuickSystemPalette::textLively() const { RETURNCOLOR_BYROLE(DPalette::TextLively); } /*! * \~chinese \brief DQuickSystemPalette::lightLively lightLively 用于获取 DPalette 的 lightLively 类型的颜色值。 * \~chinese \return lightLively 返回 DPalette 的 lightLively 类型的颜色值。 */ QColor DQuickSystemPalette::lightLively() const { RETURNCOLOR_BYROLE(DPalette::LightLively); } /*! * \~chinese \brief DQuickSystemPalette::darkLively darkLively 用于获取 DPalette 的 darkLively 类型的颜色值。 * \~chinese \return darkLively 返回 DPalette 的 darkLively 类型的颜色值。 */ QColor DQuickSystemPalette::darkLively() const { RETURNCOLOR_BYROLE(DPalette::DarkLively); } /*! * \~chinese \brief DQuickSystemPalette::frameBorder frameBorder 用于获取 DPalette 的 frameBorder 类型的颜色值。 * \~chinese \return frameBorder 返回 DPalette 的 frameBorder 类型的颜色值。 */ QColor DQuickSystemPalette::frameBorder() const { RETURNCOLOR_BYROLE(DPalette::FrameBorder); } /*! * \~chinese \brief DQuickSystemPalette::placeholderText placeholderText 用于获取 DPalette 的 placeholderText 类型的颜色值。 * \~chinese \return placeholderText 返回 DPalette 的 placeholderText 类型的颜色值。 */ QColor DQuickSystemPalette::placeholderText() const { RETURNCOLOR_BYROLE(DPalette::PlaceholderText); } /*! * \~chinese \brief DQuickSystemPalette::frameShadowBorder frameShadowBorder 用于获取 DPalette 的 frameShadowBorder 类型的颜色值。 * \~chinese \return frameShadowBorder 返回 DPalette 的 frameShadowBorder 类型的颜色值。 */ QColor DQuickSystemPalette::frameShadowBorder() const { RETURNCOLOR_BYROLE(DPalette::FrameShadowBorder); } /*! * \~chinese \brief DQuickSystemPalette::obviousBackground obviousBackground 用于获取 DPalette 的 obviousBackground 类型的颜色值。 * \~chinese \return obviousBackground 返回 DPalette 的 obviousBackground 类型的颜色值。 */ QColor DQuickSystemPalette::obviousBackground() const { RETURNCOLOR_BYROLE(DPalette::ObviousBackground); } void DQuickSystemPalette::setColorGroup(DQuickSystemPalette::ColorGroup colorGroup) { D_D(DQuickSystemPalette); if (d->colorGroup == static_cast(colorGroup)) return; d->colorGroup = static_cast(colorGroup); Q_EMIT paletteChanged(); } DQUICK_END_NAMESPACE dtkdeclarative-5.7.12/src/dquicksystempalette.h000066400000000000000000000074031476226662700216660ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DQUICKSYSTEMPALETTE_H #define DQUICKSYSTEMPALETTE_H #include #include #include #include DQUICK_BEGIN_NAMESPACE class DQuickSystemPalettePrivate; class D_DECL_DEPRECATED_X("Use DQMLGlobalObject::palette.") DQuickSystemPalette : public QObject, public DTK_CORE_NAMESPACE::DObject { Q_OBJECT Q_PROPERTY(DGUI_NAMESPACE::DPalette palette READ palette NOTIFY paletteChanged) Q_PROPERTY(DQuickSystemPalette::ColorGroup colorGroup READ colorGroup WRITE setColorGroup NOTIFY paletteChanged) // QPalette Q_PROPERTY(QColor window READ window NOTIFY paletteChanged) Q_PROPERTY(QColor windowText READ windowText NOTIFY paletteChanged) Q_PROPERTY(QColor base READ base NOTIFY paletteChanged) Q_PROPERTY(QColor text READ text NOTIFY paletteChanged) Q_PROPERTY(QColor alternateBase READ alternateBase NOTIFY paletteChanged) Q_PROPERTY(QColor button READ button NOTIFY paletteChanged) Q_PROPERTY(QColor buttonText READ buttonText NOTIFY paletteChanged) Q_PROPERTY(QColor light READ light NOTIFY paletteChanged) Q_PROPERTY(QColor midlight READ midlight NOTIFY paletteChanged) Q_PROPERTY(QColor dark READ dark NOTIFY paletteChanged) Q_PROPERTY(QColor mid READ mid NOTIFY paletteChanged) Q_PROPERTY(QColor shadow READ shadow NOTIFY paletteChanged) Q_PROPERTY(QColor highlight READ highlight NOTIFY paletteChanged) Q_PROPERTY(QColor highlightedText READ highlightedText NOTIFY paletteChanged) // DPalette Q_PROPERTY(QColor itemBackground READ itemBackground NOTIFY paletteChanged) Q_PROPERTY(QColor textTitle READ textTitle NOTIFY paletteChanged) Q_PROPERTY(QColor textTips READ textTips NOTIFY paletteChanged) Q_PROPERTY(QColor textWarning READ textWarning NOTIFY paletteChanged) Q_PROPERTY(QColor textLively READ textLively NOTIFY paletteChanged) Q_PROPERTY(QColor lightLively READ lightLively NOTIFY paletteChanged) Q_PROPERTY(QColor darkLively READ darkLively NOTIFY paletteChanged) Q_PROPERTY(QColor frameBorder READ frameBorder NOTIFY paletteChanged) Q_PROPERTY(QColor placeholderText READ placeholderText NOTIFY paletteChanged) Q_PROPERTY(QColor frameShadowBorder READ frameShadowBorder NOTIFY paletteChanged) Q_PROPERTY(QColor obviousBackground READ obviousBackground NOTIFY paletteChanged) public: DQuickSystemPalette(QObject *parent = Q_NULLPTR); ~DQuickSystemPalette() override; enum ColorGroup { Active = QPalette::Active, Inactive = QPalette::Inactive, Disabled = QPalette::Disabled }; Q_ENUM(ColorGroup) const DGUI_NAMESPACE::DPalette &palette() const; DQuickSystemPalette::ColorGroup colorGroup() const; QColor window() const; QColor windowText() const; QColor base() const; QColor text() const; QColor alternateBase() const; QColor button() const; QColor buttonText() const; QColor light() const; QColor midlight() const; QColor dark() const; QColor mid() const; QColor shadow() const; QColor highlight() const; QColor highlightedText() const; QColor itemBackground() const; QColor textTitle() const; QColor textTips() const; QColor textWarning() const; QColor textLively() const; QColor lightLively() const; QColor darkLively() const; QColor frameBorder() const; QColor placeholderText() const; QColor frameShadowBorder() const; QColor obviousBackground() const; public Q_SLOTS: void setColorGroup(DQuickSystemPalette::ColorGroup colorGroup); Q_SIGNALS: void paletteChanged(); private: D_DECLARE_PRIVATE(DQuickSystemPalette) }; DQUICK_END_NAMESPACE #endif // DQUICKSYSTEMPALETTE_H dtkdeclarative-5.7.12/src/dquickwindow.cpp000066400000000000000000000755511476226662700206360ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "dquickwindow.h" #include "dapploader.h" #include "private/dquickwindow_p.h" #include "private/dquickbehindwindowblur_p.h" #include "private/dquickbehindwindowblur_p_p.h" #include #include #include #include #include #include DQUICK_BEGIN_NAMESPACE DQuickWindowPrivate::DQuickWindowPrivate(DQuickWindow *qq) : DTK_CORE_NAMESPACE::DObjectPrivate(qq) , attached(new DQuickWindowAttached(qq)) { } DQuickWindow::DQuickWindow(QWindow *parent) : QQuickWindow(parent) , DObject(*new DQuickWindowPrivate(this)) { } DQuickWindow::~DQuickWindow() { } /*! * \~chinese \brief DQuickWindow::windowAttached 用于获取窗口的附加属性对象, * \~chinese 可以设置通过这个对象设置窗口的圆角、边框等属性值。 */ DQuickWindowAttached *DQuickWindow::attached() const { D_DC(DQuickWindow); return d->attached; } /*! * \~chinese \brief DQuickWindow::qmlAttachedProperties 用于创建窗口的附加属性对象, * \~chinese 在 QML 中使用附加属性时,会自动调用此函数。 */ DQuickWindowAttached *DQuickWindow::qmlAttachedProperties(QObject *object) { QQuickWindow *window = qobject_cast(object); if (window) { return new DQuickWindowAttached(window); } return nullptr; } DQuickWindowAttachedPrivate::DQuickWindowAttachedPrivate(QWindow *window, DQuickWindowAttached *qq) : DObjectPrivate(qq) , window(window) , wmWindowTypes(DWindowManagerHelper::UnknowWindowType) , appLoaderItem(nullptr) { } DQuickWindowAttachedPrivate::~DQuickWindowAttachedPrivate() { if (handle) { delete handle; } } template inline static void updateValue(DQuickWindowAttachedPrivate::BoolOptional &value, Func call) { if (value != DQuickWindowAttachedPrivate::Invalid) { call(value == DQuickWindowAttachedPrivate::True); value = DQuickWindowAttachedPrivate::Invalid; } } template inline static void updateValue(qint8 &value, Func call) { if (value >= 0) { call(value); value = -1; } } template inline static void updateValue(QColor &value, Func call) { if (value.isValid()) { call(value); value = QColor(); } } template inline static void updateValue(QPoint &value, Func call) { if (!value.isNull()) { call(value); value = QPoint(); } } template inline static void updateValue(DTK_GUI_NAMESPACE::DPlatformHandle::EffectScenes &value, Func call) { if (value != DTK_GUI_NAMESPACE::DPlatformHandle::EffectScene(0)) { call(value); value = DTK_GUI_NAMESPACE::DPlatformHandle::EffectScene(0); } } template inline static void updateValue(DTK_GUI_NAMESPACE::DPlatformHandle::EffectTypes &value, Func call) { if (value != DTK_GUI_NAMESPACE::DPlatformHandle::EffectType(0)) { call(value); value = DTK_GUI_NAMESPACE::DPlatformHandle::EffectType(0); } } bool DQuickWindowAttachedPrivate::ensurePlatformHandle() { if (handle) return true; if (!DPlatformHandle::setEnabledNoTitlebarForWindow(window, true)) { qWarning() << "Failed to enable NoTitlebar for the window:" << window; return false; } Q_ASSERT(DPlatformHandle::isEnabledNoTitlebar(window)); explicitEnable = Invalid; D_Q(DQuickWindowAttached); handle = new DPlatformHandle(window); updateValue(explicitWindowRadius, std::bind(&DPlatformHandle::setWindowRadius, handle, std::placeholders::_1)); updateValue(explicitBorderWidth, std::bind(&DPlatformHandle::setBorderWidth, handle, std::placeholders::_1)); updateValue(explicitBorderColor, std::bind(&DPlatformHandle::setBorderColor, handle, std::placeholders::_1)); updateValue(explicitShadowRadius, std::bind(&DPlatformHandle::setShadowRadius, handle, std::placeholders::_1)); updateValue(explicitShadowOffset, std::bind(&DPlatformHandle::setShadowOffset, handle, std::placeholders::_1)); updateValue(explicitShadowColor, std::bind(&DPlatformHandle::setShadowColor, handle, std::placeholders::_1)); updateValue(explicitTranslucentBackground, std::bind(&DPlatformHandle::setTranslucentBackground, handle, std::placeholders::_1)); updateValue(explicitEnableSystemResize, std::bind(&DPlatformHandle::setEnableSystemResize, handle, std::placeholders::_1)); updateValue(explicitEnableSystemMove, std::bind(&DPlatformHandle::setEnableSystemMove, handle, std::placeholders::_1)); updateValue(explicitEnableBlurWindow, std::bind(&DPlatformHandle::setEnableBlurWindow, handle, std::placeholders::_1)); updateValue(explicitEffectScene, std::bind(&DPlatformHandle::setWindowEffect, handle, std::placeholders::_1)); updateValue(explicitEffectType, std::bind(&DPlatformHandle::setWindowStartUpEffect, handle, std::placeholders::_1)); QObject::connect(handle, &DPlatformHandle::borderColorChanged, q, &DQuickWindowAttached::borderColorChanged); QObject::connect(handle, &DPlatformHandle::borderWidthChanged, q, &DQuickWindowAttached::borderWidthChanged); QObject::connect(handle, &DPlatformHandle::shadowColorChanged, q, &DQuickWindowAttached::shadowColorChanged); QObject::connect(handle, &DPlatformHandle::shadowOffsetChanged, q, &DQuickWindowAttached::shadowOffsetChanged); QObject::connect(handle, &DPlatformHandle::shadowRadiusChanged, q, &DQuickWindowAttached::shadowRadiusChanged); QObject::connect(handle, &DPlatformHandle::windowRadiusChanged, q, &DQuickWindowAttached::windowRadiusChanged); QObject::connect(handle, &DPlatformHandle::translucentBackgroundChanged, q, &DQuickWindowAttached::translucentBackgroundChanged); QObject::connect(handle, &DPlatformHandle::enableSystemMoveChanged, q, &DQuickWindowAttached::enableSystemMoveChanged); QObject::connect(handle, &DPlatformHandle::enableSystemResizeChanged, q, &DQuickWindowAttached::enableSystemResizeChanged); QObject::connect(handle, &DPlatformHandle::enableBlurWindowChanged, q, &DQuickWindowAttached::enableBlurWindowChanged); QObject::connect(handle, SIGNAL(enableBlurWindowChanged()), q, SLOT(_q_updateBlurAreaForWindow())); QObject::connect(handle, &DPlatformHandle::windowEffectChanged, q, &DQuickWindowAttached::windowEffectChanged); QObject::connect(handle, &DPlatformHandle::windowStartUpEffectChanged, q, &DQuickWindowAttached::windowStartUpEffectChanged); Q_EMIT q->enabledChanged(); return true; } void DQuickWindowAttachedPrivate::destoryPlatformHandle() { handle->setEnabledNoTitlebarForWindow(window, false); delete handle; handle = nullptr; } void DQuickWindowAttachedPrivate::_q_onWindowMotifHintsChanged(quint32 winId) { D_Q(DQuickWindowAttached); if (q->window()->winId() != winId) return; auto functions_hints = DWindowManagerHelper::getMotifFunctions(q->window()); if (functions_hints != motifFunctions) { motifFunctions = functions_hints; Q_EMIT q->motifFunctionsChanged(); } auto decorations_hints = DWindowManagerHelper::getMotifDecorations(q->window()); if (decorations_hints != motifDecorations) { motifDecorations = decorations_hints; Q_EMIT q->motifDecorationsChanged(); } } void DQuickWindowAttachedPrivate::addBlur(DQuickBehindWindowBlur *blur) { Q_ASSERT(!blurList.contains(blur)); blurList.append(blur); _q_updateBlurAreaForWindow(); } void DQuickWindowAttachedPrivate::removeBlur(DQuickBehindWindowBlur *blur) { if (blurList.removeOne(blur)) _q_updateBlurAreaForWindow(); } void DQuickWindowAttachedPrivate::updateBlurAreaFor(DQuickBehindWindowBlur *blur) { Q_ASSERT(blurList.contains(blur)); _q_updateBlurAreaForWindow(); } void DQuickWindowAttachedPrivate::_q_updateBlurAreaForWindow() { D_Q(DQuickWindowAttached); if (q->enableBlurWindow()) return; QList blurPathList; QVector blurAreaList; for (const DQuickBehindWindowBlur *blur : qAsConst(blurList)) { if (!blur->d_func()->isValidBlur()) continue; if (blur->d_func()->blurPath.isEmpty()) { blurAreaList.append(blur->d_func()->blurArea); } else { blurPathList.append(blur->d_func()->blurPath); } } bool blurSuc = false; if (blurPathList.isEmpty()) { blurSuc = q->setWindowBlurAreaByWM(blurPathList); blurSuc = q->setWindowBlurAreaByWM(blurAreaList); } else { // convert to QPainterPath for (const DPlatformHandle::WMBlurArea &area : qAsConst(blurAreaList)) { QPainterPath path; path.addRoundedRect(area.x, area.y, area.width, area.height, area.xRadius, area.yRaduis); blurPathList << path; } blurSuc = q->setWindowBlurAreaByWM(QVector{}); blurSuc = q->setWindowBlurAreaByWM(blurPathList); } if (!blurSuc) { q->setEnableBlurWindow(true); } } void DQuickWindowAttachedPrivate::_q_updateClipPath() { Q_Q(DQuickWindowAttached); Q_ASSERT(clipPath); q->setClipPathByWM(clipPath->path()); } void DQuickWindowAttachedPrivate::_q_ensurePlatformHandle() { if (explicitEnable == True && DWindowManagerHelper::instance()->hasNoTitlebar()) ensurePlatformHandle(); } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) void DQuickWindowAttachedPrivate::ensurePalette() { Q_Q(DQuickWindowAttached); if (paletteInit) return; paletteInit = true; quickPalette = new QQuickPalette(q); inactiveQuickPalette = new QQuickPalette(q); paletteConnections = std::array { QObject::connect(DGuiApplicationHelper::instance(), SIGNAL(applicationPaletteChanged()), q, SLOT(_q_onPaletteChanged())), QObject::connect(window, SIGNAL(activeChanged()), q, SLOT(_q_updateWindowPalette())) }; } void DQuickWindowAttachedPrivate::_q_onPaletteChanged() { DPalette palette = DGuiApplicationHelper::instance()->applicationPalette(themeType); DPalette inactivePalette; for (int i = 0; i < QPalette::NColorRoles; ++i) { QPalette::ColorRole role = static_cast(i); inactivePalette.setBrush(QPalette::All, role, palette.brush(QPalette::Inactive, role)); // The QML control will set the opacity property to 0.4 on the disabled state // The palette don't need set color for the QPalette::Disabled group. palette.setBrush(QPalette::All, role, palette.brush(QPalette::Active, role)); } quickPalette->fromQPalette(palette); inactiveQuickPalette->fromQPalette(inactivePalette); _q_updateWindowPalette(); } void DQuickWindowAttachedPrivate::_q_updateWindowPalette() { Q_Q(DQuickWindowAttached); auto pt = window->isActive() ? quickPalette : inactiveQuickPalette; // Write qml property to cancle any binding on palette. // NOTE: this is not recoverable, i.e. setting DWindow.themeType will invalidate binding on palette. QQmlProperty::write(q->window(), "palette", QVariant::fromValue(pt)); } #endif DQuickWindowAttached::DQuickWindowAttached(QWindow *window) : QObject(window) , DObject(*new DQuickWindowAttachedPrivate(window, this)) { window->installEventFilter(this); QObject::connect(DWindowManagerHelper::instance(), SIGNAL(windowMotifWMHintsChanged(quint32)), this, SLOT(_q_onWindowMotifHintsChanged(quint32))); } QQuickWindow *DQuickWindowAttached::window() const { return qobject_cast(parent()); } /*! * \~chinese \property DQuickWindowAttached::isEnabled * \~chinese \brief 这个属性用于判定是否使用了 DTK 风格的窗口。 */ bool DQuickWindowAttached::isEnabled() const { D_DC(DQuickWindowAttached); return d->handle && (DPlatformHandle::isEnabledDXcb(window()) || DGuiApplicationHelper::testAttribute(DGuiApplicationHelper::IsTreelandPlatform)); } /*! * \~chinese \property DQuickWindowAttached::windowRadius * \~chinese \brief 这个属性保存着窗口圆角值。 */ int DQuickWindowAttached::windowRadius() const { D_DC(DQuickWindowAttached); if (!d->handle) { return 0; } return d->handle->windowRadius(); } /*! * \~chinese \property DQuickWindowAttached::borderWidth * \~chinese \brief 这个属性保存着窗口边框的宽度。 */ int DQuickWindowAttached::borderWidth() const { D_DC(DQuickWindowAttached); if (!d->handle) { return 0; } return d->handle->borderWidth(); } /*! * \~chinese \property DQuickWindowAttached::borderColor * \~chinese \brief 这个属性保存这窗口边框的颜色。 */ QColor DQuickWindowAttached::borderColor() const { D_DC(DQuickWindowAttached); if (!d->handle) { return QColor(); } return d->handle->borderColor(); } /*! * \~chinese \property DQuickWindowAttached::shadowRadius * \~chinese \brief 这个属性保存着窗口阴影半径。 */ int DQuickWindowAttached::shadowRadius() const { D_DC(DQuickWindowAttached); if (!d->handle) { return 0; } return d->handle->shadowRadius(); } /*! * \~chinese \property DQuickWindowAttached::shadowOffset * \~chinese \brief 这个属性保存着窗口阴影偏移量。 */ QPoint DQuickWindowAttached::shadowOffset() const { D_DC(DQuickWindowAttached); if (!d->handle) { return QPoint(); } return d->handle->shadowOffset(); } /*! * \~chinese \property DQuickWindowAttached::shadowColor * \~chinese \brief 这个属性保存着窗口阴影颜色。 */ QColor DQuickWindowAttached::shadowColor() const { D_DC(DQuickWindowAttached); if (!d->handle) { return QColor(); } return d->handle->shadowColor(); } /*! * \~chinese \property DQuickWindowAttached::frameMask * \~chinese \brief 设置 Frame Window 的遮罩,和 \a clipPath 不同的是,它的裁剪包括阴影部分。 * \~chinese \note 由于实现机制限制,使用此属性裁剪 Frame Window 时,无法去除边缘产生的锯齿。 */ QRegion DQuickWindowAttached::frameMask() const { D_DC(DQuickWindowAttached); if (!d->handle) { return QRegion(); } return d->handle->frameMask(); } int DQuickWindowAttached::alphaBufferSize() const { return window()->format().alphaBufferSize(); } QQuickPath *DQuickWindowAttached::clipPath() const { D_DC(DQuickWindowAttached); return d->clipPath; } QQuickTransition *DQuickWindowAttached::overlayExited() const { D_DC(DQuickWindowAttached); return d->overlayExitedTransition; } void DQuickWindowAttached::setOverlayExited(QQuickTransition *trans) { D_D(DQuickWindowAttached); if (d->overlayExitedTransition == trans) return; d->overlayExitedTransition = trans; Q_EMIT overlayExitedChanged(); } QQmlComponent *DQuickWindowAttached::loadingOverlay() const { D_DC(DQuickWindowAttached); return d->loadingOverlay; } DQuickAppLoaderItem *DQuickWindowAttached::appLoader() const { D_DC(DQuickWindowAttached); if (!d->appLoaderItem) { const_cast(d)->appLoaderItem = new DQuickAppLoaderItem(window()->contentItem()); } return d->appLoaderItem; } void DQuickWindowAttached::setAppLoader(DQuickAppLoaderItem *item) { D_D(DQuickWindowAttached); if (d->appLoaderItem == item) return; // AppLoaderItem 会在窗口加载完毕后进行创建,因此 // 在窗口创建初期,AppLoaderItem 需要指定一个默认 // 值,防止 Qt 在运行时出现警告和报错 if (d->appLoaderItem) { d->appLoaderItem->deleteLater(); } d->appLoaderItem = item; Q_EMIT appLoaderChanged(); } void DQuickWindowAttached::setLoadingOverlay(QQmlComponent *component) { D_D(DQuickWindowAttached); if (component == d->loadingOverlay) return; d->loadingOverlay = component; Q_EMIT loadingOverlayChanged(); } void DQuickWindowAttached::setWindowEffect(DTK_GUI_NAMESPACE::DPlatformHandle::EffectScenes effect) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setWindowEffect(effect); else d->explicitEffectScene = effect; } void DQuickWindowAttached::setWindowStartUpEffect(DTK_GUI_NAMESPACE::DPlatformHandle::EffectTypes type) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setWindowStartUpEffect(type); else d->explicitEffectType = type; } void DQuickWindowAttached::showMinimized() { window()->setWindowStates((window()->windowStates() & ~Qt::WindowActive) | Qt::WindowMinimized); window()->setVisible(true); } void DQuickWindowAttached::showMaximized() { window()->setWindowStates((window()->windowStates() & ~(Qt::WindowMinimized | Qt::WindowFullScreen)) | Qt::WindowMaximized); window()->setVisible(true); } void DQuickWindowAttached::showFullScreen() { window()->setWindowStates((window()->windowStates() & ~(Qt::WindowMinimized | Qt::WindowMaximized)) | Qt::WindowFullScreen); window()->setVisible(true); #if !defined Q_OS_QNX window()->requestActivate(); #endif } void DQuickWindowAttached::showNormal() { window()->setWindowStates(window()->windowStates() & ~(Qt::WindowMinimized | Qt::WindowMaximized | Qt::WindowFullScreen)); window()->setVisible(true); } /*! * \~chinese \property DQuickWindowAttached::translucentBackground * \~chinese \brief 如果此属性值为 true,则在更新窗口绘制内容之前会先清空要更新区域内的图像,否则不清空。 */ bool DQuickWindowAttached::translucentBackground() const { D_DC(DQuickWindowAttached); if (!d->handle) { return false; } return d->handle->translucentBackground(); } /*! * \~chinese \brief DQuickWindowAttached::enableSystemResize * \~chinese \return 如果此属性值为 true,则允许外界改变窗口的大小(如使用鼠标拖拽窗口边框),否则不允许。 * \~chinese \note 此属性仅仅控制 dxcb 中的行为,不会影响窗口管理器的行为。 */ bool DQuickWindowAttached::enableSystemResize() const { D_DC(DQuickWindowAttached); if (!d->handle) { return false; } return d->handle->enableSystemResize(); } /*! * \~chinese \property DQuickWindowAttached::enableSystemMove * \~chinese \brief 如果此属性值为 ture,则允许外界移动窗口的位置(如使用鼠标拖拽移动窗口),否则不允许。 * \~chinese \note 此属性仅仅控制 dxcb 中的行为,不会影响窗口管理器的行为。 */ bool DQuickWindowAttached::enableSystemMove() const { D_DC(DQuickWindowAttached); if (!d->handle) { return false; } return d->handle->enableSystemMove(); } /*! * \~chinese \property DQuickWindowAttached::enableBlurWindow * \~chinese \brief 如果此属性为 true,则窗口有效区域内的背景将呈现出模糊效果,否则无特效。 */ bool DQuickWindowAttached::enableBlurWindow() const { D_DC(DQuickWindowAttached); if (!d->handle) { return false; } return d->handle->enableBlurWindow(); } /*! * \~chinese \brief DQuickWindowAttached::wmWindowTypes 返回此窗口在窗口管理器级别的窗口类型 * \~chinese 需要注意的是,此值只是内部状态的记录,只会在调用 \a setWmWindowTypes * \~chinese 时更新,默认值为 \a DWindowManagerHelper::UnknowWindowType */ DWindowManagerHelper::WmWindowTypes DQuickWindowAttached::wmWindowTypes() const { D_DC(DQuickWindowAttached); return d->wmWindowTypes; } DWindowManagerHelper::MotifFunctions DQuickWindowAttached::motifFunctions() const { D_DC(DQuickWindowAttached); return d->motifFunctions; } DWindowManagerHelper::MotifDecorations DQuickWindowAttached::motifDecorations() const { D_DC(DQuickWindowAttached); return d->motifDecorations; } #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType DQuickWindowAttached::themeType() const { D_DC(DQuickWindowAttached); return d->themeType; } void DQuickWindowAttached::setThemeType(const DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType &newThemeType) { D_D(DQuickWindowAttached); if (d->themeType == newThemeType) return; d->themeType = newThemeType; d->ensurePalette(); d->_q_onPaletteChanged(); emit themeTypeChanged(); } void DQuickWindowAttached::resetThemeType() { D_D(DQuickWindowAttached); if (!d->paletteInit) { return; } d->paletteInit = false; for (const QMetaObject::Connection &connection : std::as_const(d->paletteConnections)) disconnect(connection); d->paletteConnections = {}; delete d->quickPalette; d->quickPalette = nullptr; delete d->inactiveQuickPalette; d->inactiveQuickPalette = nullptr; if (d->themeType != DGuiApplicationHelper::UnknownType) { d->themeType = DGuiApplicationHelper::UnknownType; emit themeTypeChanged(); } QQuickWindowPrivate::get(window())->resetPalette(); } #endif DTK_GUI_NAMESPACE::DPlatformHandle::EffectScene DQuickWindowAttached::windowEffect() const { D_DC(DQuickWindowAttached); if (!d->handle) { return DTK_GUI_NAMESPACE::DPlatformHandle::EffectScene(0); } return d->handle->windowEffect(); } DTK_GUI_NAMESPACE::DPlatformHandle::EffectType DQuickWindowAttached::windowStartUpEffect() const { D_DC(DQuickWindowAttached); if (!d->handle) { return DTK_GUI_NAMESPACE::DPlatformHandle::EffectType(0); } return d->handle->windowStartUpEffect(); } /*! * \~chinese \brief DQuickWindowAttached::setEnabled 设置当前的窗口为 DTK 风格。 * \~chinese \note 只能把默认风格设置为 DTK 风格,不能把 DTK 设置为默认风格。 * \~chinese \param \a true 使用 DTK 风格, \a false 无效。 */ void DQuickWindowAttached::setEnabled(bool e) { D_D(DQuickWindowAttached); if (e == isEnabled()) return; if (!e) { d->destoryPlatformHandle(); Q_EMIT enabledChanged(); return; } if (!d->ensurePlatformHandle()) { d->explicitEnable = static_cast(e); QObject::connect(DWindowManagerHelper::instance(), SIGNAL(hasNoTitlebarChanged()), this, SLOT(_q_ensurePlatformHandle()) , Qt::UniqueConnection); } } /*! * \~chinese \brief DQuickWindowAttached::setWindowRadius 设定窗口的圆角 * \~chinese \param windowRadius 窗口的圆角值 */ void DQuickWindowAttached::setWindowRadius(int windowRadius) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setWindowRadius(windowRadius); else d->explicitWindowRadius = windowRadius; } /*! * \~chinese \brief DQuickWindowAttached::setBorderWidth 设定边框的宽度 * \~chinese \param borderWidth 边框的宽度 */ void DQuickWindowAttached::setBorderWidth(int borderWidth) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setBorderWidth(borderWidth); else d->explicitBorderWidth = borderWidth; } /*! * \~chinese \brief DQuickWindowAttached::setBorderColor 设定边框的颜色 * \~chinese \param borderColor 边框的颜色 */ void DQuickWindowAttached::setBorderColor(const QColor &borderColor) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setBorderColor(borderColor); else d->explicitBorderColor = borderColor; } /*! * \~chinese \brief DQuickWindowAttached::setShadowRadius 设定阴影区域的圆角 * \~chinese \param shadowRadius 阴影区域圆角大小 */ void DQuickWindowAttached::setShadowRadius(int shadowRadius) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setShadowRadius(shadowRadius); else d->explicitShadowRadius = shadowRadius; } /*! * \~chinese \brief DQuickWindowAttached::setShadowOffset 设定阴影区域的偏移距离 * \~chinese \param shadowOffset 阴影区域的偏移距离 */ void DQuickWindowAttached::setShadowOffset(const QPoint &shadowOffset) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setShadowOffset(shadowOffset); else d->explicitShadowOffset = shadowOffset; } /*! * \~chinese \brief DQuickWindowAttached::setShadowColor 设定阴影的颜色 * \~chinese \param shadowColor 阴影的颜色 */ void DQuickWindowAttached::setShadowColor(const QColor &shadowColor) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setShadowColor(shadowColor); else d->explicitShadowColor = shadowColor; } /*! * \~chinese \brief DQuickWindowAttached::setTranslucentBackground 设定时候擦除背景 * \~chinese \param translucentBackground true擦除背景 false不擦除背景 */ void DQuickWindowAttached::setTranslucentBackground(bool translucentBackground) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setTranslucentBackground(translucentBackground); else d->explicitTranslucentBackground = static_cast(translucentBackground); } /*! * \~chinese \brief DQuickWindowAttached::setEnableSystemResize 设定是否允许系统调整窗口大小 * \~chinese \param enableSystemResize true允许系统调整 false不允许系统调整 */ void DQuickWindowAttached::setEnableSystemResize(bool enableSystemResize) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setEnableSystemResize(enableSystemResize); else d->explicitEnableSystemResize = static_cast(enableSystemResize); } /*! * \~chinese \brief DQuickWindowAttached::setEnableSystemMove 设定时候允许系统移动窗口 * \~chinese \param enableSystemMove true允许移动 false不允许移动 */ void DQuickWindowAttached::setEnableSystemMove(bool enableSystemMove) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setEnableSystemMove(enableSystemMove); else d->explicitEnableSystemMove = static_cast(enableSystemMove); } /*! * \~chinese \brief DQuickWindowAttached::setEnableBlurWindow 设定窗口有效区域内的背景将呈现出模糊效果。 * \~chinese \param enableBlurWindow true有特效 false无特效。 */ void DQuickWindowAttached::setEnableBlurWindow(bool enableBlurWindow) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setEnableBlurWindow(enableBlurWindow); else d->explicitEnableBlurWindow = static_cast(enableBlurWindow); } /*! * \~chinese \brief DQuickWindowAttached::setWmWindowTypes 为此窗口设置与本地窗口管理器 * \~chinese 息息相关的窗口类型,这些类型不保证在所有平台下都能生效,因此可能会影响程序 * \~chinese 的跨平台行为,请尽量使用 \a QWindow::setFlags 设置所需要的窗口类型。 * \~chinese \param wmWindowTypes 新的窗口类型,此枚举值可组合使用 * \~chinese \note 调用此接口设置的窗口类型会与 \a QWindow::flags 中控制窗口类型的 * \~chinese 部分共同生效 */ void DQuickWindowAttached::setWmWindowTypes(DWindowManagerHelper::WmWindowTypes wmWindowTypes) { D_D(DQuickWindowAttached); if (d->wmWindowTypes == wmWindowTypes) return; d->wmWindowTypes = wmWindowTypes; DWindowManagerHelper::setWmWindowTypes(window(), wmWindowTypes); Q_EMIT wmWindowTypesChanged(); } void DQuickWindowAttached::setMotifFunctions(Gui::DWindowManagerHelper::MotifFunctions motifFunctions) { D_D(DQuickWindowAttached); if (d->motifFunctions == motifFunctions) return; d->motifFunctions = motifFunctions; DWindowManagerHelper::setMotifFunctions(window(), motifFunctions); Q_EMIT motifFunctionsChanged(); } void DQuickWindowAttached::setMotifDecorations(DWindowManagerHelper::MotifDecorations motifDecorations) { D_D(DQuickWindowAttached); if (d->motifDecorations == motifDecorations) return; d->motifDecorations = motifDecorations; DWindowManagerHelper::setMotifDecorations(window(), motifDecorations); Q_EMIT motifDecorationsChanged(); } void DQuickWindowAttached::popupSystemWindowMenu() { DWindowManagerHelper::popupSystemWindowMenu(window()); } bool DQuickWindowAttached::setWindowBlurAreaByWM(const QVector &area) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) { return d->handle->setWindowBlurAreaByWM(area); } return false; } bool DQuickWindowAttached::setWindowBlurAreaByWM(const QList &area) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) { return d->handle->setWindowBlurAreaByWM(area); } return false; } void DQuickWindowAttached::setClipPathByWM(const QPainterPath &clipPath) { D_D(DQuickWindowAttached); d->ensurePlatformHandle(); if (d->handle) d->handle->setClipPath(clipPath); } void DQuickWindowAttached::setClipPath(QQuickPath *path) { D_D(DQuickWindowAttached); if (path == d->clipPath) return; if (d->clipPath) disconnect(d->clipPath, nullptr, this, nullptr); d->clipPath = path; Q_EMIT clipPathChanged(); if (d->clipPath) { QQuickPathPrivate *pathPrivate = QQuickPathPrivate::get(d->clipPath); Q_ASSERT(pathPrivate); if (pathPrivate->componentComplete) setClipPathByWM(d->clipPath->path()); connect(d->clipPath, SIGNAL(changed()), this, SLOT(_q_updateClipPath())); } else { setClipPathByWM(QPainterPath()); } } bool DQuickWindowAttached::eventFilter(QObject *watched, QEvent *event) { if (watched == parent()) { if (event->type() == QEvent::PlatformSurface) { QPlatformSurfaceEvent *surface = static_cast(event); if (surface->surfaceEventType() == QPlatformSurfaceEvent::SurfaceCreated) { D_D(DQuickWindowAttached); d->_q_onWindowMotifHintsChanged(static_cast(d->window->winId())); watched->removeEventFilter(this); } } } return false; } void DQuickWindowAttached::setAlphaBufferSize(int size) { if (alphaBufferSize() == size) return; QQuickWindow *w = window(); QSurfaceFormat fmt = w->requestedFormat(); fmt.setAlphaBufferSize(size); w->setFormat(fmt); Q_EMIT alphaBufferSizeChanged(); } DQUICK_END_NAMESPACE #include "moc_dquickwindow.cpp" dtkdeclarative-5.7.12/src/dquickwindow.h000066400000000000000000000206001476226662700202640ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #ifndef DWINDOW_H #define DWINDOW_H #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QQmlComponent; class QQuickPath; class QQuickTransition; QT_END_NAMESPACE DQUICK_BEGIN_NAMESPACE class DQuickWindowPrivate; class DQuickWindowAttached; class DQuickWindowAttachedPrivate; class DQuickWindow : public QQuickWindow, public DTK_CORE_NAMESPACE::DObject { Q_OBJECT #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_UNCREATABLE("DQuickWindow Attached.") QML_NAMED_ELEMENT(DWindow) QML_ATTACHED(DQuickWindowAttached) #endif public: explicit DQuickWindow(QWindow *parent = nullptr); ~DQuickWindow() override; DQuickWindowAttached *attached() const; static DQuickWindowAttached *qmlAttachedProperties(QObject *object); private: D_DECLARE_PRIVATE(DQuickWindow) }; class DQuickAppLoaderItem; class DQuickWindowAttachedPrivate; class DQuickWindowAttached : public QObject, public DTK_CORE_NAMESPACE::DObject { Q_OBJECT Q_PROPERTY(QQuickWindow *window READ window CONSTANT) Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged) Q_PROPERTY(int windowRadius READ windowRadius WRITE setWindowRadius NOTIFY windowRadiusChanged) Q_PROPERTY(int borderWidth READ borderWidth WRITE setBorderWidth NOTIFY borderWidthChanged) Q_PROPERTY(QColor borderColor READ borderColor WRITE setBorderColor NOTIFY borderColorChanged) Q_PROPERTY(int shadowRadius READ shadowRadius WRITE setShadowRadius NOTIFY shadowRadiusChanged) Q_PROPERTY(QPoint shadowOffset READ shadowOffset WRITE setShadowOffset NOTIFY shadowOffsetChanged) Q_PROPERTY(QColor shadowColor READ shadowColor WRITE setShadowColor NOTIFY shadowColorChanged) Q_PROPERTY(bool translucentBackground READ translucentBackground WRITE setTranslucentBackground NOTIFY translucentBackgroundChanged) Q_PROPERTY(bool enableSystemResize READ enableSystemResize WRITE setEnableSystemResize NOTIFY enableSystemResizeChanged) Q_PROPERTY(bool enableSystemMove READ enableSystemMove WRITE setEnableSystemMove NOTIFY enableSystemMoveChanged) Q_PROPERTY(bool enableBlurWindow READ enableBlurWindow WRITE setEnableBlurWindow NOTIFY enableBlurWindowChanged) Q_PROPERTY(int alphaBufferSize READ alphaBufferSize WRITE setAlphaBufferSize NOTIFY alphaBufferSizeChanged) Q_PROPERTY(QQuickPath *clipPath READ clipPath WRITE setClipPath NOTIFY clipPathChanged) Q_PROPERTY(DTK_GUI_NAMESPACE::DWindowManagerHelper::WmWindowTypes wmWindowTypes READ wmWindowTypes WRITE setWmWindowTypes NOTIFY wmWindowTypesChanged) Q_PROPERTY(DTK_GUI_NAMESPACE::DWindowManagerHelper::MotifFunctions motifFunctions READ motifFunctions WRITE setMotifFunctions NOTIFY motifFunctionsChanged) Q_PROPERTY(DTK_GUI_NAMESPACE::DWindowManagerHelper::MotifDecorations motifDecorations READ motifDecorations WRITE setMotifDecorations NOTIFY motifDecorationsChanged) Q_PROPERTY(QQuickTransition *overlayExited READ overlayExited WRITE setOverlayExited NOTIFY overlayExitedChanged FINAL) Q_PROPERTY(QQmlComponent *loadingOverlay READ loadingOverlay WRITE setLoadingOverlay NOTIFY loadingOverlayChanged FINAL) Q_PROPERTY(DTK_QUICK_NAMESPACE::DQuickAppLoaderItem *appLoader READ appLoader NOTIFY appLoaderChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) Q_PROPERTY(DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType themeType READ themeType WRITE setThemeType RESET resetThemeType NOTIFY themeTypeChanged) #endif Q_PROPERTY(DTK_GUI_NAMESPACE::DPlatformHandle::EffectScene windowEffect READ windowEffect WRITE setWindowEffect NOTIFY windowEffectChanged) Q_PROPERTY(DTK_GUI_NAMESPACE::DPlatformHandle::EffectType windowStartUpEffect READ windowStartUpEffect WRITE setWindowStartUpEffect NOTIFY windowStartUpEffectChanged) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QML_ANONYMOUS #endif public: explicit DQuickWindowAttached(QWindow *window); QQuickWindow *window() const; bool isEnabled() const; int windowRadius() const; int borderWidth() const; QColor borderColor() const; int shadowRadius() const; QPoint shadowOffset() const; QColor shadowColor() const; QRegion frameMask() const; bool translucentBackground() const; bool enableSystemResize() const; bool enableSystemMove() const; bool enableBlurWindow() const; int alphaBufferSize() const; QQuickPath *clipPath() const; QQuickTransition *overlayExited() const; QQmlComponent *loadingOverlay() const; DQuickAppLoaderItem *appLoader() const; void setAppLoader(DQuickAppLoaderItem *item); DTK_GUI_NAMESPACE::DWindowManagerHelper::WmWindowTypes wmWindowTypes() const; DTK_GUI_NAMESPACE::DWindowManagerHelper::MotifFunctions motifFunctions() const; DTK_GUI_NAMESPACE::DWindowManagerHelper::MotifDecorations motifDecorations() const; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType themeType() const; void setThemeType(const DTK_GUI_NAMESPACE::DGuiApplicationHelper::ColorType &newThemeType); void resetThemeType(); #endif DTK_GUI_NAMESPACE::DPlatformHandle::EffectScene windowEffect() const; DTK_GUI_NAMESPACE::DPlatformHandle::EffectType windowStartUpEffect() const; public Q_SLOTS: void setEnabled(bool e); void setWindowRadius(int windowRadius); void setBorderWidth(int borderWidth); void setBorderColor(const QColor &borderColor); void setShadowRadius(int shadowRadius); void setShadowOffset(const QPoint &shadowOffset); void setShadowColor(const QColor &shadowColor); void setTranslucentBackground(bool translucentBackground); void setEnableSystemResize(bool enableSystemResize); void setEnableSystemMove(bool enableSystemMove); void setEnableBlurWindow(bool enableBlurWindow); void setAlphaBufferSize(int size); void setWmWindowTypes(DTK_GUI_NAMESPACE::DWindowManagerHelper::WmWindowTypes wmWindowTypes); void setMotifFunctions(DTK_GUI_NAMESPACE::DWindowManagerHelper::MotifFunctions motifFunctions); void setMotifDecorations(DTK_GUI_NAMESPACE::DWindowManagerHelper::MotifDecorations motifDecorations); void popupSystemWindowMenu(); bool setWindowBlurAreaByWM(const QVector &area); bool setWindowBlurAreaByWM(const QList &area); void setClipPathByWM(const QPainterPath &clipPath); void setClipPath(QQuickPath *path); void setOverlayExited(QQuickTransition *exit); void setLoadingOverlay(QQmlComponent *component); void setWindowEffect(DTK_GUI_NAMESPACE::DPlatformHandle::EffectScenes effect); void setWindowStartUpEffect(DTK_GUI_NAMESPACE::DPlatformHandle::EffectTypes type); void showMinimized(); void showMaximized(); void showFullScreen(); void showNormal(); protected: bool eventFilter(QObject *watched, QEvent *event) override; Q_SIGNALS: void enabledChanged(); void windowRadiusChanged(); void borderWidthChanged(); void borderColorChanged(); void shadowRadiusChanged(); void shadowOffsetChanged(); void shadowColorChanged(); void translucentBackgroundChanged(); void enableSystemResizeChanged(); void enableSystemMoveChanged(); void enableBlurWindowChanged(); void wmWindowTypesChanged(); void motifFunctionsChanged(); void motifDecorationsChanged(); void alphaBufferSizeChanged(); void clipPathChanged(); void overlayExitedChanged(); void loadingOverlayChanged(); void appLoaderChanged(); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) void themeTypeChanged(); #endif void windowEffectChanged(); void windowStartUpEffectChanged(); private: D_DECLARE_PRIVATE(DQuickWindowAttached) D_PRIVATE_SLOT(void _q_onWindowMotifHintsChanged(quint32)) D_PRIVATE_SLOT(void _q_updateBlurAreaForWindow()) D_PRIVATE_SLOT(void _q_updateClipPath()) D_PRIVATE_SLOT(void _q_ensurePlatformHandle()) #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) D_PRIVATE_SLOT(void _q_onPaletteChanged()) D_PRIVATE_SLOT(void _q_updateWindowPalette()) #endif friend class DQuickBehindWindowBlur; friend class DQuickBehindWindowBlurPrivate; }; DQUICK_END_NAMESPACE QML_DECLARE_TYPEINFO(DTK_QUICK_NAMESPACE::DQuickWindow, QML_HAS_ATTACHED_PROPERTIES) #endif // DWINDOW_H dtkdeclarative-5.7.12/src/dtkdeclarative_assets.qrc000066400000000000000000000155321476226662700224720ustar00rootroot00000000000000 qml/style/Style.qml shadow/0.0.0.0.0.4.0.9.png shadow/0.4.4.4.4.4.0.17.png shadow/0.5.5.5.5.10.1.31.png shadow/0.8.8.8.8.4.0.25.png shadow/0.8.8.8.8.6.0.29.png shadow/0.8.8.8.8.10.1.37.png shadow/0.8.8.8.8.20.0.57.png shadow/0.10.10.10.10.4.0.29.png shadow/0.14.14.14.14.20.0.69.png shadow/0.18.18.18.18.20.0.77.png shadow/2.5.5.5.5.10.1.11.png shadow/2.5.5.5.5.10.1.32.png shadow/2.5.5.5.5.10.1.35.png shadow/2.8.8.8.8.1.0.17.png shadow/2.8.8.8.8.1.0.18.png shadow/2.8.8.8.8.2.1.17.png shadow/2.8.8.8.8.2.1.22.png shadow/2.8.8.8.8.2.1.23.png shadow/2.8.8.8.8.2.1.24.png shadow/2.8.8.8.8.10.1.35.png shadow/2.8.8.8.8.10.1.38.png resources/water_back.png resources/water_front.png resources/spinner-blue.webp icons/bloom/window_maximize.dci icons/bloom/window_restore.dci icons/bloom/window_minimize.dci icons/bloom/window_quit_full.dci icons/bloom/window_close.dci icons/bloom/window_menu.dci icons/bloom/slider_point_down.dci icons/bloom/slider_point_left.dci icons/bloom/slider_round_hor.dci icons/bloom/slider_round_ver.dci icons/bloom/switch_button.dci icons/bloom/switch_on.dci icons/bloom/switch_off.dci icons/bloom/slider_point_up.dci icons/bloom/checkbox_mix.dci icons/bloom/checkbox_checked.dci icons/bloom/checkbox_unchecked.dci icons/bloom/arrow_ordinary_down.dci icons/bloom/action_compress.dci icons/bloom/action_copy.dci icons/bloom/action_cut.dci icons/bloom/action_decompress.dci icons/bloom/action_delete.dci icons/bloom/action_edit.dci icons/bloom/action_newfolder.dci icons/bloom/action_open.dci icons/bloom/action_paste.dci icons/bloom/action_power.dci icons/bloom/action_redo.dci icons/bloom/action_reduce.dci icons/bloom/action_reset.dci icons/bloom/action_search.dci icons/bloom/action_selectall.dci icons/bloom/action_setting.dci icons/bloom/action_share.dci icons/bloom/arrow_ordinary_left.dci icons/bloom/arrow_ordinary_right.dci icons/bloom/arrow_ordinary_up.dci icons/bloom/chechbox_mix.dci icons/bloom/checkbox_focus_checked.dci icons/bloom/checkbox_focus.dci icons/bloom/entry_clear.dci icons/bloom/entry_loadfile.dci icons/bloom/entry_option_arrow_down.dci icons/bloom/entry_password_hide.dci icons/bloom/entry_spinbox_down.dci icons/bloom/entry_spinbox_up.dci icons/bloom/entry_voice.dci icons/bloom/list_add.dci icons/bloom/list_delete.dci icons/bloom/menu_arrow.dci icons/bloom/menu_select.dci icons/bloom/item_checked.dci icons/bloom/item_unchecked.dci icons/bloom/window_sidebar.dci icons/bloom/action_add.dci icons/bloom/radio_checked.dci icons/bloom/radio_unchecked.dci icons/bloom/radio_focus.dci icons/bloom/entry_password_shown.dci dtkdeclarative-5.7.12/src/dtkdeclarative_global.h000066400000000000000000000007241476226662700220670ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2020 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #pragma once #include #include #define DQUICK_NAMESPACE Quick #define DTK_QUICK_NAMESPACE DTK_NAMESPACE::Quick #define DQUICK_BEGIN_NAMESPACE namespace DTK_NAMESPACE { namespace DQUICK_NAMESPACE { #define DQUICK_END_NAMESPACE }} #define DQUICK_USE_NAMESPACE using namespace DTK_QUICK_NAMESPACE; dtkdeclarative-5.7.12/src/dtkdeclarative_qml.qrc000066400000000000000000000116171476226662700217610ustar00rootroot00000000000000 qml/SearchEdit.qml qml/LineEdit.qml qml/ControlBackground.qml qml/PasswordEdit.qml qml/ButtonBox.qml qml/FloatingButton.qml qml/IconButton.qml qml/RecommandButton.qml qml/ToolButton.qml qml/WarningButton.qml qml/FocusBoxBorder.qml qml/CicleSpreadAnimation.qml qml/TitleBar.qml qml/DialogTitleBar.qml qml/WindowButton.qml qml/WindowButtonGroup.qml qml/DialogWindow.qml qml/AboutDialog.qml qml/HelpAction.qml qml/AboutAction.qml qml/QuitAction.qml qml/ThemeMenu.qml qml/RectangularShadow.qml qml/AlertToolTip.qml qml/FlowStyle.qml qml/Button.qml qml/style/Style.qml qml/settings/SettingsDialog.qml qml/settings/OptionDelegate.qml qml/settings/CheckBox.qml qml/settings/ComboBox.qml qml/settings/NavigationTitle.qml qml/settings/ContentTitle.qml qml/settings/ContentBackground.qml qml/settings/LineEdit.qml qml/Control.qml qml/PlusMinusSpinBox.qml qml/EditPanel.qml qml/TextArea.qml qml/TextField.qml qml/SpinBox.qml qml/SpinBoxIndicator.qml qml/ApplicationWindow.qml qml/BoxShadow.qml qml/FloatingPanel.qml qml/FloatingMessage.qml qml/Menu.qml qml/MenuItem.qml qml/MenuSeparator.qml qml/HighlightPanel.qml qml/ArrowListView.qml qml/ScrollIndicator.qml qml/StyledBehindWindowBlur.qml qml/Popup.qml qml/PopupWindow.qml qml/Switch.qml qml/Slider.qml qml/SliderHandle.qml qml/ScrollBar.qml qml/ComboBox.qml qml/ButtonPanel.qml qml/ActionButton.qml qml/ItemDelegate.qml qml/CheckDelegate.qml qml/TipsSlider.qml qml/SliderTipItem.qml qml/BoxInsetShadow.qml qml/CheckBox.qml qml/IpV4LineEdit.qml qml/OutsideBoxBorder.qml qml/InsideBoxBorder.qml qml/SortFilterModel.qml qml/ArrowShapePopupWindow.qml qml/StyledArrowShapeWindow.qml qml/private/OpacityMask.qml qml/private/SoftwareOpacityMask.qml qml/ArrowShapePopup.qml qml/Action.qml qml/ActionGroup.qml qml/Label.qml qml/Container.qml qml/ButtonGroup.qml qml/ScrollView.qml qml/MenuBar.qml qml/AbstractButton.qml qml/TabBar.qml qml/SwipeDelegate.qml qml/SwipeView.qml qml/Drawer.qml qml/Dial.qml qml/Dialog.qml qml/DelayButton.qml qml/RoundButton.qml qml/RadioButton.qml qml/ToolTip.qml qml/DialogButtonBox.qml qml/Frame.qml qml/GroupBox.qml qml/PageIndicator.qml qml/StackView.qml qml/BusyIndicator.qml qml/ProgressBar.qml qml/BoxPanel.qml qml/Pane.qml qml/KeySequenceEdit.qml qml/private/KeySequenceLabel.qml qml/ButtonIndicator.qml qml/EmbeddedProgressBar.qml qml/WaterProgressBar.qml qml/private/ProgressBarImpl.qml qml/private/ProgressBarPanel.qml qml/PlaceholderText.qml qml/private/ColorOverlay.qml qml/private/SoftwareColorOverlay.qml qml/private/ArrowListViewButton.qml dtkdeclarative-5.7.12/src/dtkdeclarative_shaders.qrc000066400000000000000000000010021476226662700226040ustar00rootroot00000000000000 shaders/quickitemviewport.frag shaders/quickitemviewport-opaque.frag shaders/quickitemviewport-opaque.vert shaders/dualkawasedown.frag shaders/dualkawasedown.vert shaders/dualkawaseup.frag shaders/dualkawaseup.vert shaders/noise.vert shaders/noise.frag dtkdeclarative-5.7.12/src/icons/000077500000000000000000000000001476226662700165205ustar00rootroot00000000000000dtkdeclarative-5.7.12/src/icons/bloom/000077500000000000000000000000001476226662700176305ustar00rootroot00000000000000dtkdeclarative-5.7.12/src/icons/bloom/action_add.dci000066400000000000000000000012311476226662700223730ustar00rootroot00000000000000DCI16Inormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light 31.0.webp|RIFFtWEBPVP8Lg// / ڶazA yDꡏ798|0j۶a)eL/Wgj>}:@-H΍l&(v_skEdtkdeclarative-5.7.12/src/icons/bloom/action_compress.dci000066400000000000000000000020711476226662700235010ustar00rootroot00000000000000DCI16normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light3d1.0.webpRIFFWEBPVP8L// wEmSڶmN9$9!8c A&$a/ c$$|@$٦mc۶m۶m۶mEdtkdeclarative-5.7.12/src/icons/bloom/action_cut.dci000066400000000000000000000021671476226662700224470ustar00rootroot00000000000000DCI16'normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light31.0.webpZRIFFRWEBPVP8LE//  m&mh@жmCw h3 !#0@IBs!OGAmޜضmvR+U۶m}#y[|n&~: :yHHfArnmBv(:8ϾiV[&r6СѮ~Gpj5UvRArݎ2#`?ȲA8L =A2L!+_s`īwv?D;8MK5FO1|3ktNU0_؀?~]2ߘw_CWDnë1O~ X "[HsSn}֨oqqEᗏe2r źWF@urK[TGwÒv puUn{̊$.> C}ɵ4;=Dgn8p^-?Ev;kUog;U{ e)1:F @C̨Ӡh1B4zE;OCMW!-dGzx2z#Ec(dtkdeclarative-5.7.12/src/icons/bloom/action_decompress.dci000066400000000000000000000021151476226662700240110ustar00rootroot00000000000000DCI16normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light3x1.0.webp0RIFF(WEBPVP8L//  m&mh@жmCwBH 0-dcE@B0@`D@8DAm[dm۶m۶mŨ̈x?mHvwo7?eohe#lde#_4" Wȩh-+!3B<+/4ʿ,h={KnmJk""WYI\/6/U E8>P\b-! O  0scgbubh k4cxa {p({HDObO!pVaJD,H;\oZ_HB^\jO!M2guG{6Ǫ'U#&xO/wM.͌t7r0XYR߿u/(sAnV??y}#K;IJ }Cc3Kz&gW7wזƆ{S"],['K3 [ĸN>sϙn<ұTޠ$c7$dtkdeclarative-5.7.12/src/icons/bloom/action_delete.dci000066400000000000000000000016451476226662700231160ustar00rootroot00000000000000DCI16Unormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light31.0.webpRIFFWEBPVP8Ls//  ۶km`hvfĢA*KyGDi@*"|2 &7J A7HdiỉȽSpwd|KT᫈"z>:\W\eƳ\ &{ (HV;tSTۑE[l1"a-:唱b SW':sdtkdeclarative-5.7.12/src/icons/bloom/action_newfolder.dci000066400000000000000000000016251476226662700236370ustar00rootroot00000000000000DCI16Enormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light31.0.webpxRIFFpWEBPVP8Ld// 7 ۶qzzjJ" -] _mPQH0Xdֵm϶UӋ^3 6R3t +_G1TicC`^Fv , Ew -[+xS\C[\o}ުW qqZ8a&zM^<;eFjp" KÒװa/yc;-G"2{B+"F+>VJ$#E#=DDB U;lrB3MV)G#h@.$*WpX2]>$,d!E* pI8VC9ZaWO:wuq?y@s2N(dtkdeclarative-5.7.12/src/icons/bloom/action_paste.dci000066400000000000000000000016131476226662700227630ustar00rootroot00000000000000DCI16;normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light31.0.webpnRIFFfWEBPVP8LZ// ?BmS ۶mSҽ@YP&pd LjBC:7`Ȇ**ۀXmmR&7eeUewc_?#?NYF9j]2jgDT6u!ȓU(+r]EIhI9X5xktE*vFd"/iƼ((nLdH @|Ld%%,٩ 5`T|?"t8A: Gw;Xy"Yww ` X~`1o9?Hg7̡Gyop0ˬAE6+2Nrc}5Ndtkdeclarative-5.7.12/src/icons/bloom/action_power.dci000066400000000000000000000024271476226662700230070ustar00rootroot00000000000000DCI16normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light3B1.0.webpRIFFWEBPVP8L//  m&mh`ضmvK Q7 8F @Q^T8FTP3P ` (l2$b۶m۶mw=3p6na9%ؽrJBg+Alx(h%~4Xlʙ81m44$>}FZ~T>t(r.N*v;mA5(%浴Rn~Y!uWYu\/+DX,:bI $KAEjV(ΤF+Dnu`[ڡ暮pxP~`@GTK)Jfo&4qiA!Tt="$8LkC>d0?H`X2:k.Ic%N֯(>tP ^g~ZwlN zP7o&/T]'cRiaKd4vTRdtkdeclarative-5.7.12/src/icons/bloom/action_reduce.dci000066400000000000000000000011571476226662700231210ustar00rootroot00000000000000DCI16normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light31.0.webpRRIFFJWEBPVP8L=// 'F{ars_PI\ _D'6X{ZÔԾwdtkdeclarative-5.7.12/src/icons/bloom/action_reset.dci000066400000000000000000000021231476226662700227660ustar00rootroot00000000000000DCI16normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light3~1.0.webp6RIFF.WEBPVP8L!// d mm.}2< 0x&Lx8 ə$L ϐmۙ7msm\ۘk݇7WO~{1۝ =?wez]:gSSq(^N*d o^mih2YDjP,xqJ:OXjeev@Է6`3eVk६^,e 6TC{V|7$.RA "0$.rJJ&>$_*n'i;d"m羸ͥ4@33}=ΜXdx%drq@8ߜ- dm )+x}Ӣe]t_cO[%͗Vrdtkdeclarative-5.7.12/src/icons/bloom/action_selectall.dci000066400000000000000000000015371476226662700236240ustar00rootroot00000000000000DCI16normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light31.0.webpBRIFF:WEBPVP8L.// 6rI/BfP.`~ebLmNloqRi@pr*kKQЙsRNY2Δ$  IM7+%aZN<<䎊,舜epPa/5(T;P KME%xӓV`H5fvpvgq W 7Krs3߰ ф .=JB qK*Qܗ{{;=*cݭ*~O)Boak::~9P6±N<ǝdtkdeclarative-5.7.12/src/icons/bloom/action_setting.dci000066400000000000000000000026411476226662700233260ustar00rootroot00000000000000DCI16Qnormal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light31.0.webpRIFF|WEBPVP8Lp//  m&mh`ܶmQI!J  댈!"F$0!js#ma4V<5cg}97Ѷۑ Гe]?nY&7PkԲaRZi /vAlUZ C$$)o@6`@ i /.6I]4Q~y* #y'j$5]S/u0$ε;OܹQIHV+ӷ׼uM僡@KH7sӀe>E{~yP8GմZDV$%/ 9!%z3̔C'uظ%]([l\] zTnc較c]JԓY]03z|XSc*M=tEVޥl žm#lŰdz}>Cٸ1м1^_oj!`xAfZ x.-ԥM2A ?xXՄ1oYj< m%)o% $#ϗe˺v 8"yZ1 (}dw.jէlxq)IOWr7 #Ț! :pØI&(iN*VZCOZuIFwڢoD?dtkdeclarative-5.7.12/src/icons/bloom/action_share.dci000066400000000000000000000015411476226662700227510ustar00rootroot00000000000000DCI16normal.dark3e1.0.webp../../normal.light/3/1.0.webpnormal.light31.0.webpDRIFF<WEBPVP8L/// oIjd*yA,1+@r$IX4Llef-#mIf kE稜Ӌۿu#$<T:vnߥSܥ㋏خ)HIb"Q̙\{b=\=w=NtkG!IUIgA2\hs_,^"g` yjix!Ɋ3̊>1 R;@|GbZb4c[tSSGS0-yLB-)j|xdM`dtkdeclarative-5.7.12/src/icons/bloom/chechbox_mix.dci000066400000000000000000000154721476226662700227620ustar00rootroot00000000000000DCI20disabled.dark31.3.webp8RIFF0WEBPVP8L#/;0L#0Pعg2þ disabled.light31.3.webp8RIFF0WEBPVP8L#/;00Pعg2þ hover.darkd31.3.webpNRIFFFWEBPVP8L:/;Ǡm)¶m&`+hۆIbԱ L4Zh0 F0Eɂy-L"-A} Ǎ$)R-3P# 6R4c s u4WÁ[ɘvGv,f1aV3bf95v=isG T@d*d:wp2ҞԐҞ6 I\u$ Cl!rrtW#!pT9n5ӻ܍ Ỳ*E7^npFfP4f`2.webp>RIFF6WEBPVP8L*/;0?$e&xJaAz45.%=$hover.light3X1.webpRIFFWEBPVP8L/;$ER@ HR$o>B6ɛϸ6mUἋ;KgCkD}gAA w% /0 x @ } B+״6FMNL+YM#1z "V+i1O[{O{A9R`Z1mHI%V&DJ֏X%uGX^޿Wsnq~u|~YostJc-9}e;6ww7-k I^άm۶fm۶m6_hJ*TnF5dg#&]69yFߚN"E<4뾊Q#G)euaV1c 2xn\6:?曱&ۧw=z00b쉓tֵs=R#]-\9{A]8kiצ^c&h;¹تeK/>~f5u I(-Z[nM[~iѲUk\+l-;:zÖ|8sz_c"|ۏ}/ЊHضgoL'ü|ǯ>xGʻ$e0O|IJ{SfﹻOtw{rG(}$!v?壺A DOsh N%}IJa(wYΤ& k CC feRc022Y(偲LRY1H YL)58XH86vZJ)rRJ$F:!<;jbYql+ZKuIL|XcHR܀gr:VYDfBN ύqZFb\9:9(-|9w~(h|AiR3 4I2.3.webp8RIFF0WEBPVP8L#/;Ǡm#}/e|mfͿݻ'.` Z`JeIeT>P|8IRe]ņ=GDmhnj=eheJX11Ȯ5 {K3qim~]3g79Z׌=rG V@Ĭq2;hLujOIfA{fHhOQV{H~TY@;)sS0.9\pQcPϊޙ+r7*3UqጲpFfP4f`3.webp:RIFF2WEBPVP8L&/;$e& %0 =] _ɒnormal.dark3h1.0.webp RIFFWEBPVP8L /;0?#IJ8%ψ a@T<D <HrL?գ̿3pHQt׾9i3N+ìؤ(7 XUXj;+خ:o"Kp>c(cι'}挄}A$&;А )0a$/* lȋDς v1̧-SbٞxY2C u"}dwC!۾'3@YeH`p8Ytj6;5EOfnormal.light3\1.0.webpRIFF WEBPVP8L/;#IJ8% GJD`IIzn)j77'mieu%b>k K vg%U-Vd nۧs eL0Q9>М|8hcd2#6ebC y?HCY:.xJQ#S/+5T^x蠡PĻL^n(3bd(] 'NffS!pressed.dark(31.webpRIFFWEBPVP8L/;7丑$Eo,, 6$Mn9nH7;6mU>i+tO U۶ mnr CP:@  q<WN:b?3~wx??bf3#սj󋼟ʙ*g\^Ȫ53Ljez***^ven<{Ǽ* (>3U+PxW@]hkoIffffJϤһ]al|.q_m6v՞1 Vnر Gݰw*s\F6 .soFțsQekčAy"~v/$ۋex{ '$6"? 0`as@/Q.0c0oIpߞX 2<į#۟)CRN'HzhJ.?=0;RHp [3p8M^ +5 r#ev Cc12*! Tȱ) ,?Bi *Tv!S/D[F$"eTEI.U|UPFdh&'Un.jꊼO_OW"|I[Cdgr'-˾6!D%',.+T=Q3r܏%H)+[yJ1H:pSWUS$gO$9k#1Z( '\3 4&ظI$V䴼Ӂimka"&oƵqq8 O5[z['4ch9t.LA KF{fL2D-6إE;pHr!ujWRضm۶m?su}"mG pŚoG?} '~Ӈ'O  '畋J_aܩs>k J-c媞wv98x\Ԑr-Vy9Gab#+IT,[N\ev/;fH3Ҥi+*[h <7Af4SkZ 7pMj Dx`y`é#ӣu  eV*Z im56~}cԵ6BJBPPYǫzLk/0`8('BG-Ogf"ڬI :L;*MSU7OWO"VN6if6]+o=?(hT8vLݰ^ͳMf: ƁCǛK +ei'|ؚ \ U':X8Vm%–Dyn)Jt Зj~P1AIqD #YšhiEi꫘5FXf.%<ӫx/I \n1P g v>+wl0$I dXǍ$)R,k?:(֑$+٧;@YPdn.?߾JV\x $@)EA)UR_ݏy^(%?Uz,_9)Z/َ$IZffxN=!ܶ$u~mʯחo9С&Aec5DeKx*.XtNtDt*,ݼ[X QlbJk+&X'緷#Z+lYOJ} ^pP4!B6GF,a<{,{7=GANMF//CVP8L}// mIL2iCQ$IM&/gdж$YeT۶;C'I]^`<r_7~BUtTtuW'74ww@.H ?Zb=0E3l,JU[s38$YU wn,"0m$7г.[HìY{*\PBp~bpBq@DV9ksc2IU։WiYyAZUscsj moܶ#.P$_vKu'HpIe=} `T 9,="S=(߳=.wovԎ ܆$ANMF//CVP8Lm// *m!PC"=PԶ?ȩFAx4Hk+O mL*룍v$eÓ`j*~"5)~Gg P7FDȚ@2Xg,D_ML E?hlܿykk;T=wz*[0q|y?BV7ȴYj!?"7 Mö8Mܛė{Qwi=hXi3rcxтc An,hΠւI6qwzzoY7 ?7?G 2.3.webp RIFF WEBPVP8X ;;ANIMANMF$;;CVP8L /;'&6_s*{XF6 #A^&$GqGs(0n#IV=/(+@d.H:r6hB&Zgu3P;#/MQ? NT!,U㻈2(}AJ,ӽ<~/tu_-۶D}pg߄ -8Osn杻OnʷYŎdGܽKolRM=_ҡmj;pUlqCTsϫjf 5<hҥL5s ϏjgW5~k)f.fQrxT;v(O#ڶOƬ~A5 ?&̊WaŒ&̤r2aëL;n n{p1i?&L3˄s'vJнl_*rjŞ"Q08k3ʥ. u8yjIwF7Gyj8_34m{ZqR fY:Զ)0S9=lQh9xh˛f\ Bmb|n17]iZ?Mq]r-lpSkD/K< Dm ;52Z{7s+P:_mko<@iy ^J,e 4۽i3ht` gYpmo頇od[vY}HƏݷʌVb(WM罠~zl3*(:2#pt ݲhQ_d[= /PL [r?y!pw!bc>L1 =딢=#+e.&anɿAY^^P)fѝ3sO$N!^/$c})E#{0y#/JmѤɆDe5#%첚~K&Xz܂܄c_M(O$kU7F"MT˳z~z7{׋d ANMF.+CVP8L/. 9$E2 kO8TAFIϟ3@$IY+?8JǑ$9̢#К@J\\W^Kl gx=(S /UXUv!̂$ ,lELFTHD ySE p(-R Q*!wJ Cv  J[} Rϰn^H\Rk+ȷ(9dt/#K3͞,No#,kYJ/NAP7n9R-YuH/T*L9(ԍ=ٲ9d)m68k@|ɞEo9c{?gzsD](ʚOt#,9 ω8ó&^|rfs=,!6l66NG";K7oE|WIή@E6*<[ 6hGJ +Uy# Ae׳5 h y4Z;\ Ղ~Ѵd@ K)h-5G .^Z 3.webp.RIFF&WEBPVP8X ;;ANIMANMFL;;CVP8L3/;#m$iOD8$ɴ϶m3 ۶m{hXj$¯A`k\/KVPGyAП 'J#3$NJe5AWQ]-Y h֠~پ*btMM1*և9%&8[G'F@Zv M 1:]\ԉ#pIҏ3r`G:/!Ґ)Iuc*Ҝh^r}p%>~ӕ4η789I$eW>iA%G#ƖINq Q[ANMF)&CVP8Ln/) =2W" Jdںm[϶m۶;pƑ.Z}+ҍ x!zh1} <T=Ƿ V1?TNANMFj)&CVP8LR/) 5@l$9l9:"PP0dٶmKkW^U3KJ~ɶm۶1mFpDl-<*9}3-'?r>_P`mꁬbGWW+/w4R'5HSt/'+^";ko^uSO#uЋd[TYj 6f gR[s,d߿g5O~𾚠w}95'0_^P`Y`-x$ 5Zϑmo'WC5`xn9hover.light31.webpRIFFWEBPVP8X ;;ANIMANMF@;;CVP8L'/;u@m&݂pna*fsl;HB6RdxHA l xk`caOn> Yg􉡇g QgNFӻnw2$4M郎d+?)z;4IB9+~b2oI\V6"Vi^+w`YDM5؀ln6|C%5cVMְ3Ma Z}R(U=UV?1`SH"%$)pMr] 20ANMF/,CVP8L~// uHɑ?%rB{YNwCUuuuE8l#I{fNNUdiG?F­iFJsaڛgP}>o5-i^I1${|A!ak (a=ca욱>SOXpj$HbOHq.t8Y媒4[J2K`8T(`< !xTDaVGA>́?,`Q=fJ@G.HJ&pEW2ANMF/,CVP8L// uѶ73xL}6pN3FL!33)(w٪l3ɲH%Lƶy T=Sq&Bk]PZ[?_NtCaqҔ8?>~~iB}PP?~,>/5(!Epe9u!DxXw>޷_XXٸG4>=k݌s[0 k˸o+fz,z" ZFU#|2ni3P)nFkV VXUvƑf^<"+9Zz԰ Pb1F9$%>@搃f0I\+'&@kB xJBicJSюR8<lVD+J(‚EZe%Qi`xTUUUFB 4[\ANMF/,CVP8Ln// _&$GJYv{Q#I{y=UIrP˻rIRC0de p rhKPa @`9po{LR=KRaLRsIm$}rf}%93Cچ36I$wOr~}]vC[˙~\.hNU#Q|=tnR &TiIڋF.БHj:1Ꚍe#hU _qUɂc8vYZ2 8걌 8_})lj$rNߓ0=S ;!ANMF|//CVP8Ld// w4X%FOi0hɑ8G$9W$Ͳl[d.LTT(g3U,ThU|*ShPL᧼ A oJ,3 n?ⲏu7I*7yÖEDm(c![7}XzqW\]o¼ZN"nI3AL!|8svt>*kw-*Z8Klɱxnӯv <nс@~(:ğ. .$?O#9E9Kuy:ANMF~//CVP8Le// $){VjQ{m$owꠍ$Gr'xH‡bIݹ?^/s` d+> |E#F^D@9 &jN -";}8/^}jp$ٶwqHpw D_۶w7HkNN+~6]mͧز-U_J(zSIgv`"Dبc#"p}\N°f>!4q>ЌAZ{XsBphש1ؙt`eDw5Hr9I+~I~y~s ?g9N}oz%3.webpRIFFWEBPVP8X ;;ANIMANMFF;;CVP8L-/;`۶$z%$I2<۶7{۶>#EUE5hI8:صsr ;i tX K!/lAt<0Ŝv7P^_nB0Hfyeu0: !d6,aoΕ0L0Za^D WD%.*Oo#-ځe0Nж0&,c@`H /eH7ҟDm:ؿҐC';ۨ:0/GK9B%aL UrW75ANMF)&CVP8Lg/) `HR/}* $Il۶m6GmGZW.?[X9r P3э,!q> @}:f1Aؓpȟ^)hCrʕ10Z +Y=Uw^!OYɁ#:`1U{Ղj?{|^.7$Vh.8{ e%=>Q/Vj Z#%6T'ň:8W9R͵mIОf@~69.hFLc(\Ɓu'CG< ~|(3W0O:үJO|A(SPg/;0AG_VQ$4G/_Y^j.jjX ~U+irWU C.Rޫjg{ɪ5#7B CZ'(+X%vc eծi"W@pt\T3rGFeqҞN&=mi+|Z1k {>!-t Kytf0w~G D"0b*wfD z&(*AB +'ANMFf)&CVP8LN/) `ж$}綵cΝ6Z( AiV٦RTmv2{'~r_q# ʙR:Ls;0 d sD09Y j&Hd"j t\&=1&=)u 0\, [I)dg I>-V"m :Fbb o !"Ky"?7N(.H!3LZI<\ʍ"{C3^ !+@2-3Br;? {2`2ȃY+#P߳W`j7{@+qn^Dp$ f9normal.dark!3 1.webpRIFFWEBPVP8X ;;ANIMANMF;;CVP8L/;pܶ ?wn%6mU϶m[m#:o)f$zĈ`DX&%"!@Dv0q#E@ӛLQ5W {B3%CbSwC8! yژ0Ni0# \3)*rbQ ANMF~( CVP8Lf/(Oo8ֶD[#b2(iSab[_ 2  %;sc?.wh8nHXUœ)LYw~5CH$e A|Ӯ#V>-'&R' Koc7RQ TX*?9l%'",ɩ<%f3(pHI#JQniV;/5O@K1 ( PL(Xybg] ۷n{?@ @KB9ZZAJtHHibQG!aRz̚E*Ϭ)5|/ANMF..CVP8L/. 8$G8vM$VzD8.q먑$GZKbCZ~]#Vk]pX!(kwyw>a $fdH*Zgt3FYmitq $ B8H) WCL &h@HDEo-hvRN@;Ţ?o22p2q.9m^;5[ŷs;=_$۶(7;E^q2ķnѳX@pRoS'z߶*Xa?I-"ĊP|Lڳc'geBmPzVN emd2ΖF1˥#뎆!ŭu?ANMF//CVP8L// m$[- 4m#y߁84&h Ct/ض'r/r荖Xk$sGeh0DQrJEDƯ`v?׹?FH}7a"[^Rzt.>NŦM';L~wqO3.webpRIFFWEBPVP8X ;;ANIMANMF;;CVP8L/;ӶmMfAöqg';+;uY ;\FKp Wje;.h)CexAx јrR^c#Gsc!rc| Jm#g~.1g&P{A?v(`nQO<-i1x1oyϭ2G{RANMF()CVP8Ls/(@ 0?Gm;͡*0Q/!uިO{L3p>DDB̢@.M4/Iu.yZt̉gY٭91%fYN)貰.Yә%P13kҌ= qyeJyX޺$ny4nddsq[ANMF//CVP8L// mIϿD( mHUL:=D_A6Lv`_w{Y>ˊ4 8'B-/PƾfPO( /pL$`6OH>U4VLV:F8.WRO^:O}PryMΑ(4.webpRIFFWEBPVP8X ;;ANIMANMF;;CVP8Lx/;۶7Ԟm#5x̌?,-*ZWm o{m#[W=Xo= 9l` Ú5ҁhx%pjDI /XD8Y'!,1 ANMFj( CVP8LQ/(0?Fm2( Lu]"!o}8i)1fNSśJ_GANMF. CVP8L/.@6O"mzi;߷47}%%Q<"BHDJEBTbH?)>z* ?fޘK$t2èNfsJ|YiA3°fM,q#HôANMF/ CVP8L//@5@h$ɑTI7*aHL7(A^UPc9um}tkk"C##vkӝLNvM"htχrq <8;CGMgӢHEDHLJ]5.3.webp RIFF WEBPVP8X ;;ANIMANMF;;CVP8L/;79$IgϡoG+`ܶ$b7;I"ɳo5u:n$IG߅` |o| e{c-CeqZ޳]bj%lKA$FIdZwqK.$P2]84/(JKQ/DEgEZMq8I!yb A@ jt@dD3Z4GKZ6!<䖛Il=(. %6 Ϊz}3LwucoGtg~!-I"9u̴Ǹ,aY񝚳y^"?/aї ߽- 1 }{lz7@(_/TWnިj!|mHvמanTYct]?hxCv鲑Oe5; _{E:'R>e!^Iy.Ɨ[Q?>)J7=D>.~d됼U ј[n}1d7M,~=sFr 7av={C4OIN3DSy >/ )IwқhyO#1=roe FOCR%0(%ӭТ;ANMFN)&CVP8L5/) (f?`  $E}#q¶m;$?H$rG$v+3ϣ;,;}Z H4jY -!a=K$p[y_myu I`btjp).Evx&< \:@yg VS}J5xGx{-[joEu1pQ=>z"J;/TW\$O=Wu[3UiKyɰX&rݖ+#mzڢp6/r [r)pՏANMF-*CVP8L/- 䦑$Iʪ5Wkwq$ m#9kfmol9n$IbHIk>ضUPm\ku 17!'߃vyB,z|w&5#$n$FXr =3%  AE+$5jiF0 Pl@@ x@@X j ImXF u\QjkW j@ڢחQ?V@[aκE(%ioc)COt9ʇ=CmKĸ`w\pwaWEVaߞވ^\UUYŮ&Jt/=~eknŝnO^w bP{meb.V+6kZq|+"|kC|Y<_tjr}xF,>eZ7tZ5ښlWnb0R~En&QBԊodo}&IkDԒZy$5VԊ* ܂AyXdB٢xzji6Qx(L 52…G^P e_@Hx8;#t-y/aI;`xMqE$2/&SN{w%GANMF.+CVP8L/. 9$E2 kO8TAFIϟ3@$IY+?8JǑ$9̢#К@J\\W^Kl gx=(S /UXUv!̂$ ,lELFTHD ySE p(-R Q*!wJ Cv  J[} Rϰn^H\Rk+ȷ(9dt/#K3͞,No#,kYJ/NAP7n9R-YuH/T*L9(ԍ=ٲ9d)m68k@|ɞEo9c{?gzsD](ʚOt#,9 ω8ó&^|rfs=,!6l66NG";K7oE|WIή@E6*<[ 6hGJ +Uy# Ae׳5 h y4Z;\ Ղ~Ѵd@ K)h-5G .^Z 6.webpRIFFWEBPVP8X ;;ANIMANMFJ;;CVP8L2/;u@rFtewRY<8ֶUlll۶m۶mn6R  L;Ӏ+>B3W@mi '"*J'v(G u\:$`$Mj;OF eF4ZzD(6s8@!]A)+}vwv9.l V -g~ {7 *|E&yb 6T^E~@& 7s:Ou?!l&vZ'z11hiANMF" CVP8L/" L/$t|`IjPvV|Wn6>p3:WEUDwCc% !} "2A[10Io *+tFK1^CFW]bMU]m*h&ĴkLwp%{ xLDrF/o8#VYaxANMF)&CVP8L/) öm_] $ɦsm۶mzm۶{{9~ m1k=-QȉRGAEqvÒ͂Y#L\:UE 3[wtwenNeԯBJM5qt/69b57w2Ll &j3( Ԥes gpqnvQs77>-2L]پI*Dccaԧ7]=jϼ#(eEj68Zf%SJ@m AtsXH:cu9 > =Y+~',WaB{׊aCt6wu{Sl@-ԥ 4eI3M%rʦSE`{OB ANMFx)&CVP8L`/) ĶmIi{'۶c϶55ٵٞl7rMnm۶mam$B}0 #ZU /@6 `kKARz :^BfSh5Rs.&uK7^J#:pI/´zZN`IM軔u<8p*6)"lց 2JC:1c$(HX1)@H'/@} k0nQ!9}gHI*mly|i^QKCgy 9#Lnormal.light%3t%1.webpvRIFFnWEBPVP8X ;;ANIMANMF;;CVP8L/;Pܶڵ!Ba$)mLL NVrh5ZPʩZ4)0Z aCC;7Uh@꾍@ mvU0iPgmBpGDmdA!{\G_Uq=9&(0aNG"{6K#TIl%3 -/*Z_rV1fbA<"$J.af@ a<0 7az cm6n:M]嶎tS7E؁8M- ANMF`'(CVP8LH/' (FC ^ Ƒd*܎$ɇ仰dɻLPUR K 6Rr'oEhwVXq>3Jb~ +?w)&Q:c;|#uϴ_'VTYZh%f!d1o,tj /tp$ٶ\KCoQD'읷?;K1_o)HLn(zļT[ojJ Ap48`IL2Y= &ULX'T"p+1P.h.жaft^.hlsvANMF..CVP8L/. 㨑$G>s;GNpF$9{nb3bwF$)s/+8C Ў#V{8@_{n(xn-<$_a1Uҿ4A;)KOr F "=_p Q!tq@ ai- `A@Q J$-(V]_ FXt(e {O{onAq^D "?Q+_qnql\թqN/q?qV@ڶrmYonleۮӲMD'_p`KcMCs+,bEukL5zS@ yja6(ʣeN Ef}6`Ut)Yv `=|n+l۶qA{K+~[%z%8Z.ė GDZ~|͠L=UbjdHXm!qvT"s, '$~<>G9A|s=mIQ3.3.webpHRIFF@WEBPVP8X ;;ANIMANMFn;;CVP8LV/;Gg~'`VPp Em#9=m$E ~6hɻ{B}0 6[CGAeByZH`CȪ$ZInxbM \54:Jd:wk"u6nvvqhu[ϳ5qInv),t4d:PqrZ)}`G ـ'TLmI]h@Ȅ8[* LY>1fyO+Gh! >HBcvn6M[嶍t6i޴Eo7m\ANMF'(CVP8L/' o(f \$c2P3A& N@"9&lĂ]^@mYk1CuHnHWiT3`nwN#?/` 'ȤX59b< 9%E`'D#[pd,:/=TCś_)^ϧ~l4o*dcMb^ȉў3Td5)ɢ IL0eJANMFD..CVP8L+/. (mWsء#IrCMil[QzX!RGc)${G*{+ ae (@g#ӄ15}5~-Jcy\WU͂\HeRTP#7r++ɈLz :%KӿȍXJF՘ƳDҜ<3Őjߴf~ ͳ}w>y¦gyq:r @$I̼[ZffJ δDg=[C7Ϯz/V@mz$_0";4[;:BHH{ICG0ܗ# }]P S @S ( ԅ+-sy;{7p8EK&QU$]T$v*!|eR@\j,}5vH[]q:y&q:%Jc^(S9vM::l%QŅD[uʯɪ? "|7p򎟿:E-t5鍟ANMF\//CVP8LC// Gg~'`VPp Em#9=m$E ~6hɻ{B}0 6[CGAeByZH`CȪ$ZInxbM \54:ɶݶ %fI 코Y|mMo}L/Iu6#msZ#oS fE?z!DtL =K|M`o'w1=6)iuzjq"ى\<@W=VF-=,a~;Y7?GG4.3.webpRIFFWEBPVP8X ;;ANIMANMFH;;CVP8L0/;m$![Vhn q7m#9xNoJ$Sӳ6ߩm+@~n4Ɛ1F-Q*o4~mC. "*rzUfPUf.X֏HRffY^f괧UD'(հiL KaQ-lʢ\Ta:\6-9ǘsn/i)M 8I?4is!\~JANMFB2CVP8L)/2m$![Vhn q7m#9xNoJ$Sӳ6ߩm+@~n4Ɛ1F-Q*o4~mC. "*rzUfPUf.X֏c6mJދksn?%j \]5MhB=Z^ -h)`Skwй+BE9Mwq.m[ڙ g*ǏxD;5(hqe[NNmrVh{:(felFd)N꺄,>PZ&oeWKP{YJ v!CӃ$ŽRP' o@q1R5y+@z"?QiՈcE[eYY,sYJU~ƺ͹-},3u'HeLƈE>|'E&RzN[Nm?d1^(kёȎeE"bR"nE|[(Mr Xxv"/a ڇSj άM *h }Zv1S i`{(^ q/ Z Fm*{K(VS }%C>:yjN&wANMF8&#CVP8L/&(f.% .xHm9(l۶ H$rY)TIv/叼^~Q휔OlGq>aS%v "?(vM;|g׆o UW$D,ľnZ4u_J ph ljԉ~ՠD=DLMm/ J 3λ"7ϼ6L2&^eM2$֩+&o{& L~&ÛI&e($(С0S ,g:0ʓ>oԔh]T+Ei!BQa] l>e W- :Vdʷl9{Bb eSpX #2\R]G(˨%G+2QDTRf-y:a2D+xP:69JjZU5OGP+F4=wR.lVU'ANMF.+CVP8L/. 9$E2 kO8TAFIϟ3@$IY+?8JǑ$9̢#К@J\\W^Kl gx=(S /UXUv!̂$ ,lELFTHD ySE p(-R Q*!wJ Cv  J[} Rϰn^H\Rk+ȷ(9dt/#K3͞,No#,kYJ/NAP7n9R-YuH/T*L9(ԍ=ٲ9d)m68k@|ɞEo9c{?gzsD](ʚOt#,9 ω8ó&^|rfs=,!6l66NG";K7oE|WIή@E6*<[ 6hGJ +Uy# Ae׳5 h y4Z;\ Ղ~Ѵd@ K)h-5G .^Z 6.webpRIFFWEBPVP8X ;;ANIMANMF|;;CVP8Lc/;FIuIW"жm9?QIe'v*3*m۶m0r6b=vyC:haQ *BhKa|Y۰][{Ņ\X-[Bf[HU-ZtB Rt-{!V9 +0YH]ЅD,JiM_b⼄EMgtK=X ?c3p P0^4F Z/_,/<0\ >xſ H5XȿDU, }d?X8ǖ@`X vQ*@`YEF sbANMF"CVP8L/" L/$t|`VZTm6w^Ixa^a&A_0dBnQ Ng;N P@zSAf AuZ,VV;NXeF]P ԩ.e2={ҭᎄ[m [.f5kI֚mToz>[/zmáJyo(%GIyANMF&#CVP8L|/&2WD@$۴e۶Fm{d۶m6~F#"AB67 Ҭ!?@^JZE z(pemG@5ȰHv۹8;'vbj6:ԶJ cZ'KKKT)FӞN褷XaO[Jps3KKl$v"2Q`ƕU{Pڞ^žN9l,Ily X: 26d#D?=NTID']n +J$hS #)հ_+5M"T!àeĜCU1NM^wn"gϚ(YJ7B:f*GhANMFx)&CVP8L`/) ĶmIi{'۶c϶55ٵٞl7rMnm۶mam$B}0 #ZU /@6 `kKARz :^BfSh5Rs.&uK7^J#:pI/´zZN`IM軔u<8p*6)"lց 2JC:1c$(HX1)@H'/@} k0nQ!9}gHI*mly|i^QKCgy 9#Lpressed.darkT3 1.webp(RIFF WEBPVP8X ;;ANIMANMF;;CVP8L/;Hmm$Z{ԋ Icq!@z"j۶&KpDw6{eI {4ߨ)JOL*G\"P3rjeX\W \`Y@Q~\ r }J@wOk\A")F]8p {QU:NZ] 1-j>T|lQ?1~7Eb(֢ܕ,t=ˍ֩h^Ec͘嶶 c5:wmͿΡ8K=8KݍSu:V4G]}T9J٢.W.>_]zmrCm!]#)?hWa jJq%Is\+1߇]YMyY+1Wj$|3_ş3_Unud]۶Xɋb3؅=sJ݃;i{$ ,xUKdgsڞ(y탳EǭMWbhY@ _:7~p @עzk#\t_sH~Y$wVk(<+E&1(Z ΅oN0 zEͼh.- )ccH6NQx +W<40k@c#9q|]+SnWg`;>jA80Krpz 66)(W~srp+EHJC4[/:5f܊@74{bs$joO쎄Y,nq4X ¿!XTFgO?G[ANMF&#CVP8L/&W!$V>QOړ<0Ç&G(w ^uHd%{& iǵm}/=&2hB5Dmf@@ 36x() H T,TH@ "$J* "P  `Ay*2iRoJ3&jI CB4A ;աQ DD>T(d!Z0XBRM NrM=]uw:t'%Ғ7_*:Q{=k,xz37@sXV?=7mrshka7_8ry⩭m4m3uNjy "?["{z}@V\ ҿ#`k|#dǿ+Y/~%@x|n Dh+ʷǁEJ_ۢ불. 4tgQ hz!y ی %ˇ:Lgekړ.߷Dޤ 0@tYdy0Sz fCMgr `M6 X%'`U< \9} nJn'